var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key2, value) => key2 in obj ? __defProp(obj, key2, { enumerable: true, configurable: true, writable: true, value }) : obj[key2] = value;
var __spreadValues = (a, b) => {
  for (var prop in b || (b = {}))
    if (__hasOwnProp.call(b, prop))
      __defNormalProp(a, prop, b[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b)) {
      if (__propIsEnum.call(b, prop))
        __defNormalProp(a, prop, b[prop]);
    }
  return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
import { b as defineComponent, f as openBlock, g as createElementBlock, y as renderSlot, Y as normalizeClass, aq as getAugmentedNamespace, a as computed, q as h, x as resolveComponent } from "./vendor.f66678d1.js";
import { u as useUserSession, p as provideApi, a as useNotyf } from "./index.62345777.js";
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
  props: {
    align: { type: String, required: false, default: void 0 },
    addons: { type: Boolean, required: false }
  },
  setup(__props) {
    const props = __props;
    return (_ctx, _cache) => {
      return openBlock(), createElementBlock("div", {
        class: normalizeClass(["buttons", [props.addons && "has-addons", props.align && `is-${props.align}`]])
      }, [
        renderSlot(_ctx.$slots, "default")
      ], 2);
    };
  }
});
var qzTray = { exports: {} };
var __viteBrowserExternal = {};
var __viteBrowserExternal$1 = /* @__PURE__ */ Object.freeze({
  __proto__: null,
  [Symbol.toStringTag]: "Module",
  "default": __viteBrowserExternal
});
var require$$0 = /* @__PURE__ */ getAugmentedNamespace(__viteBrowserExternal$1);
(function(module, exports) {
  var qz2 = function() {
    if (!Array.isArray) {
      Array.isArray = function(arg) {
        return Object.prototype.toString.call(arg) === "[object Array]";
      };
    }
    if (!Number.isInteger) {
      Number.isInteger = function(value) {
        return typeof value === "number" && isFinite(value) && Math.floor(value) === value;
      };
    }
    if (typeof String.prototype.utf8Encode == "undefined") {
      String.prototype.utf8Encode = function() {
        return unescape(encodeURIComponent(this));
      };
    }
    if (typeof String.prototype.utf8Decode == "undefined") {
      String.prototype.utf8Decode = function() {
        try {
          return decodeURIComponent(escape(this));
        } catch (e) {
          return this;
        }
      };
    }
    var _qz = {
      VERSION: "2.2.1",
      DEBUG: false,
      log: {
        trace: function() {
          if (_qz.DEBUG) {
            console.log.apply(console, arguments);
          }
        },
        info: function() {
          console.info.apply(console, arguments);
        },
        warn: function() {
          console.warn.apply(console, arguments);
        },
        allay: function() {
          if (_qz.DEBUG) {
            console.warn.apply(console, arguments);
          }
        },
        error: function() {
          console.error.apply(console, arguments);
        }
      },
      streams: {
        serial: "SERIAL",
        usb: "USB",
        hid: "HID",
        printer: "PRINTER",
        file: "FILE",
        socket: "SOCKET"
      },
      websocket: {
        connection: null,
        connectConfig: {
          host: ["localhost", "localhost.qz.io"],
          hostIndex: 0,
          usingSecure: true,
          protocol: {
            secure: "wss://",
            insecure: "ws://"
          },
          port: {
            secure: [8181, 8282, 8383, 8484],
            insecure: [8182, 8283, 8384, 8485],
            portIndex: 0
          },
          keepAlive: 60,
          retries: 0,
          delay: 0
        },
        setup: {
          findConnection: function(config, resolve, reject) {
            if (!config.port.secure.length) {
              if (!config.port.insecure.length) {
                reject(new Error("No ports have been specified to connect over"));
                return;
              } else if (config.usingSecure) {
                _qz.log.error("No secure ports specified - forcing insecure connection");
                config.usingSecure = false;
              }
            } else if (!config.port.insecure.length && !config.usingSecure) {
              _qz.log.trace("No insecure ports specified - forcing secure connection");
              config.usingSecure = true;
            }
            var deeper = function() {
              config.port.portIndex++;
              if (config.usingSecure && config.port.portIndex >= config.port.secure.length || !config.usingSecure && config.port.portIndex >= config.port.insecure.length) {
                if (config.hostIndex >= config.host.length - 1) {
                  reject(new Error("Unable to establish connection with QZ"));
                  return;
                } else {
                  config.hostIndex++;
                  config.port.portIndex = 0;
                }
              }
              _qz.websocket.setup.findConnection(config, resolve, reject);
            };
            var address;
            if (config.usingSecure) {
              address = config.protocol.secure + config.host[config.hostIndex] + ":" + config.port.secure[config.port.portIndex];
            } else {
              address = config.protocol.insecure + config.host[config.hostIndex] + ":" + config.port.insecure[config.port.portIndex];
            }
            try {
              _qz.log.trace("Attempting connection", address);
              _qz.websocket.connection = new _qz.tools.ws(address);
            } catch (err) {
              _qz.log.error(err);
              deeper();
              return;
            }
            if (_qz.websocket.connection != null) {
              _qz.websocket.connection.established = false;
              _qz.websocket.connection.onopen = function(evt) {
                if (!_qz.websocket.connection.established) {
                  _qz.log.trace(evt);
                  _qz.log.info("Established connection with QZ Tray on " + address);
                  _qz.websocket.setup.openConnection({ resolve, reject });
                  if (config.keepAlive > 0) {
                    var interval = setInterval(function() {
                      if (!_qz.tools.isActive()) {
                        clearInterval(interval);
                        return;
                      }
                      _qz.websocket.connection.send("ping");
                    }, config.keepAlive * 1e3);
                  }
                }
              };
              _qz.websocket.connection.onclose = function() {
                if (_qz.websocket.connection && typeof navigator !== "undefined" && navigator.userAgent.indexOf("Safari") != -1 && navigator.userAgent.indexOf("Chrome") == -1) {
                  _qz.websocket.connection.onerror();
                }
              };
              _qz.websocket.connection.onerror = function(evt) {
                _qz.log.trace(evt);
                _qz.websocket.connection = null;
                deeper();
              };
            } else {
              reject(new Error("Unable to create a websocket connection"));
            }
          },
          openConnection: function(openPromise) {
            _qz.websocket.connection.established = true;
            _qz.websocket.connection.onclose = function(evt) {
              _qz.log.trace(evt);
              _qz.websocket.connection = null;
              _qz.websocket.callClose(evt);
              _qz.log.info("Closed connection with QZ Tray");
              for (var uid in _qz.websocket.pendingCalls) {
                if (_qz.websocket.pendingCalls.hasOwnProperty(uid)) {
                  _qz.websocket.pendingCalls[uid].reject(new Error("Connection closed before response received"));
                }
              }
              if (this.promise != void 0) {
                this.promise.resolve();
              }
            };
            _qz.websocket.connection.onerror = function(evt) {
              _qz.websocket.callError(evt);
            };
            _qz.websocket.connection.sendData = function(obj) {
              _qz.log.trace("Preparing object for websocket", obj);
              if (obj.timestamp == void 0) {
                obj.timestamp = Date.now();
                if (typeof obj.timestamp !== "number") {
                  obj.timestamp = new Date().getTime();
                }
              }
              if (obj.promise != void 0) {
                obj.uid = _qz.websocket.setup.newUID();
                _qz.websocket.pendingCalls[obj.uid] = obj.promise;
              }
              obj.signAlgorithm = _qz.security.signAlgorithm;
              obj.position = {
                x: typeof screen !== "undefined" ? (screen.availWidth || screen.width) / 2 + (screen.left || screen.availLeft) : 0,
                y: typeof screen !== "undefined" ? (screen.availHeight || screen.height) / 2 + (screen.top || screen.availTop) : 0
              };
              try {
                if (obj.call != void 0 && obj.signature == void 0) {
                  var signObj = {
                    call: obj.call,
                    params: obj.params,
                    timestamp: obj.timestamp
                  };
                  var hashing = _qz.tools.hash(_qz.tools.stringify(signObj));
                  if (!hashing.then) {
                    hashing = _qz.tools.promise(function(resolve) {
                      resolve(hashing);
                    });
                  }
                  hashing.then(function(hashed) {
                    return _qz.security.callSign(hashed);
                  }).then(function(signature) {
                    _qz.log.trace("Signature for call", signature);
                    obj.signature = signature;
                    _qz.signContent = void 0;
                    _qz.websocket.connection.send(_qz.tools.stringify(obj));
                  });
                } else {
                  _qz.log.trace("Signature for call", obj.signature);
                  _qz.websocket.connection.send(_qz.tools.stringify(obj));
                }
              } catch (err) {
                _qz.log.error(err);
                if (obj.promise != void 0) {
                  obj.promise.reject(err);
                  delete _qz.websocket.pendingCalls[obj.uid];
                }
              }
            };
            _qz.websocket.connection.onmessage = function(evt) {
              var returned = JSON.parse(evt.data);
              if (returned.uid == null) {
                if (returned.type == null) {
                  _qz.websocket.connection.close(4003, "Connected to incompatible QZ Tray version");
                } else {
                  switch (returned.type) {
                    case _qz.streams.serial:
                      if (!returned.event) {
                        returned.event = JSON.stringify({ portName: returned.key, output: returned.data });
                      }
                      _qz.serial.callSerial(JSON.parse(returned.event));
                      break;
                    case _qz.streams.socket:
                      _qz.socket.callSocket(JSON.parse(returned.event));
                      break;
                    case _qz.streams.usb:
                      if (!returned.event) {
                        returned.event = JSON.stringify({ vendorId: returned.key[0], productId: returned.key[1], output: returned.data });
                      }
                      _qz.usb.callUsb(JSON.parse(returned.event));
                      break;
                    case _qz.streams.hid:
                      _qz.hid.callHid(JSON.parse(returned.event));
                      break;
                    case _qz.streams.printer:
                      _qz.printers.callPrinter(JSON.parse(returned.event));
                      break;
                    case _qz.streams.file:
                      _qz.file.callFile(JSON.parse(returned.event));
                      break;
                    default:
                      _qz.log.allay("Cannot determine stream type for callback", returned);
                      break;
                  }
                }
                return;
              }
              _qz.log.trace("Received response from websocket", returned);
              var promise = _qz.websocket.pendingCalls[returned.uid];
              if (promise == void 0) {
                _qz.log.allay("No promise found for returned response");
              } else {
                if (returned.error != void 0) {
                  promise.reject(new Error(returned.error));
                } else {
                  promise.resolve(returned.result);
                }
              }
              delete _qz.websocket.pendingCalls[returned.uid];
            };
            function sendCert(cert) {
              if (cert === void 0) {
                cert = null;
              }
              qz3.api.getVersion().then(function(version) {
                _qz.websocket.connection.version = version;
                _qz.websocket.connection.semver = version.toLowerCase().replace(/-rc\./g, "-rc").split(/[\\+\\.-]/g);
                for (var i = 0; i < _qz.websocket.connection.semver.length; i++) {
                  try {
                    if (i == 3 && _qz.websocket.connection.semver[i].toLowerCase().indexOf("rc") == 0) {
                      _qz.websocket.connection.semver[i] = -_qz.websocket.connection.semver[i].replace(/\D/g, "");
                      continue;
                    }
                    _qz.websocket.connection.semver[i] = parseInt(_qz.websocket.connection.semver[i]);
                  } catch (ignore) {
                  }
                  if (_qz.websocket.connection.semver.length < 4) {
                    _qz.websocket.connection.semver[3] = 0;
                  }
                }
                _qz.compatible.algorithm(true);
              }).then(function() {
                _qz.websocket.connection.sendData({ certificate: cert, promise: openPromise });
              });
            }
            _qz.security.callCert().then(sendCert).catch(function(error) {
              _qz.log.warn("Failed to get certificate:", error);
              sendCert(null);
            });
          },
          newUID: function() {
            var len = 6;
            return (new Array(len + 1).join("0") + (Math.random() * Math.pow(36, len) << 0).toString(36)).slice(-len);
          }
        },
        dataPromise: function(callName, params, signature, signingTimestamp) {
          return _qz.tools.promise(function(resolve, reject) {
            var msg = {
              call: callName,
              promise: { resolve, reject },
              params,
              signature,
              timestamp: signingTimestamp
            };
            _qz.websocket.connection.sendData(msg);
          });
        },
        pendingCalls: {},
        errorCallbacks: [],
        callError: function(evt) {
          if (Array.isArray(_qz.websocket.errorCallbacks)) {
            for (var i = 0; i < _qz.websocket.errorCallbacks.length; i++) {
              _qz.websocket.errorCallbacks[i](evt);
            }
          } else {
            _qz.websocket.errorCallbacks(evt);
          }
        },
        closedCallbacks: [],
        callClose: function(evt) {
          if (Array.isArray(_qz.websocket.closedCallbacks)) {
            for (var i = 0; i < _qz.websocket.closedCallbacks.length; i++) {
              _qz.websocket.closedCallbacks[i](evt);
            }
          } else {
            _qz.websocket.closedCallbacks(evt);
          }
        }
      },
      printing: {
        defaultConfig: {
          bounds: null,
          colorType: "color",
          copies: 1,
          density: 0,
          duplex: false,
          fallbackDensity: null,
          interpolation: "bicubic",
          jobName: null,
          legacy: false,
          margins: 0,
          orientation: null,
          paperThickness: null,
          printerTray: null,
          rasterize: false,
          rotation: 0,
          scaleContent: true,
          size: null,
          units: "in",
          forceRaw: false,
          encoding: null,
          spool: null
        }
      },
      serial: {
        serialCallbacks: [],
        callSerial: function(streamEvent) {
          if (Array.isArray(_qz.serial.serialCallbacks)) {
            for (var i = 0; i < _qz.serial.serialCallbacks.length; i++) {
              _qz.serial.serialCallbacks[i](streamEvent);
            }
          } else {
            _qz.serial.serialCallbacks(streamEvent);
          }
        }
      },
      socket: {
        socketCallbacks: [],
        callSocket: function(socketEvent) {
          if (Array.isArray(_qz.socket.socketCallbacks)) {
            for (var i = 0; i < _qz.socket.socketCallbacks.length; i++) {
              _qz.socket.socketCallbacks[i](socketEvent);
            }
          } else {
            _qz.socket.socketCallbacks(socketEvent);
          }
        }
      },
      usb: {
        usbCallbacks: [],
        callUsb: function(streamEvent) {
          if (Array.isArray(_qz.usb.usbCallbacks)) {
            for (var i = 0; i < _qz.usb.usbCallbacks.length; i++) {
              _qz.usb.usbCallbacks[i](streamEvent);
            }
          } else {
            _qz.usb.usbCallbacks(streamEvent);
          }
        }
      },
      hid: {
        hidCallbacks: [],
        callHid: function(streamEvent) {
          if (Array.isArray(_qz.hid.hidCallbacks)) {
            for (var i = 0; i < _qz.hid.hidCallbacks.length; i++) {
              _qz.hid.hidCallbacks[i](streamEvent);
            }
          } else {
            _qz.hid.hidCallbacks(streamEvent);
          }
        }
      },
      printers: {
        printerCallbacks: [],
        callPrinter: function(streamEvent) {
          if (Array.isArray(_qz.printers.printerCallbacks)) {
            for (var i = 0; i < _qz.printers.printerCallbacks.length; i++) {
              _qz.printers.printerCallbacks[i](streamEvent);
            }
          } else {
            _qz.printers.printerCallbacks(streamEvent);
          }
        }
      },
      file: {
        fileCallbacks: [],
        callFile: function(streamEvent) {
          if (Array.isArray(_qz.file.fileCallbacks)) {
            for (var i = 0; i < _qz.file.fileCallbacks.length; i++) {
              _qz.file.fileCallbacks[i](streamEvent);
            }
          } else {
            _qz.file.fileCallbacks(streamEvent);
          }
        }
      },
      security: {
        certHandler: function(resolve, reject) {
          reject();
        },
        callCert: function() {
          if (typeof _qz.security.certHandler.then === "function" || _qz.security.certHandler.constructor.name === "AsyncFunction") {
            return _qz.security.certHandler();
          } else {
            return _qz.tools.promise(_qz.security.certHandler);
          }
        },
        signatureFactory: function() {
          return function(resolve) {
            resolve();
          };
        },
        callSign: function(toSign) {
          if (typeof _qz.security.signatureFactory.then === "function" || _qz.security.signatureFactory.constructor.name === "AsyncFunction") {
            return _qz.security.signatureFactory(toSign);
          } else {
            return _qz.tools.promise(_qz.security.signatureFactory(toSign));
          }
        },
        signAlgorithm: "SHA1"
      },
      tools: {
        promise: function(resolver) {
          if (typeof RSVP !== "undefined") {
            return new RSVP.Promise(resolver);
          } else if (typeof Promise !== "undefined") {
            return new Promise(resolver);
          } else {
            _qz.log.error("Promise/A+ support is required.  See qz.api.setPromiseType(...)");
          }
        },
        stringify: function(object) {
          var pjson = Array.prototype.toJSON;
          delete Array.prototype.toJSON;
          var result = JSON.stringify(object);
          if (pjson) {
            Array.prototype.toJSON = pjson;
          }
          return result;
        },
        hash: function(data) {
          if (typeof Sha256 !== "undefined") {
            return Sha256.hash(data);
          } else {
            return _qz.SHA.hash(data);
          }
        },
        ws: typeof WebSocket !== "undefined" ? WebSocket : null,
        absolute: function(loc) {
          if (typeof window !== "undefined" && typeof document.createElement === "function") {
            var a = document.createElement("a");
            a.href = loc;
            return a.href;
          } else {
            require$$0.resolve(loc);
          }
          return loc;
        },
        relative: function(data) {
          for (var i = 0; i < data.length; i++) {
            if (data[i].constructor === Object) {
              var absolute = false;
              if (data[i].data && data[i].data.search(/data:image\/\w+;base64,/) === 0) {
                data[i].flavor = "base64";
                data[i].data = data[i].data.replace(/^data:image\/\w+;base64,/, "");
              } else if (data[i].flavor) {
                if (["FILE", "XML"].indexOf(data[i].flavor.toUpperCase()) > -1) {
                  absolute = true;
                }
              } else if (data[i].format && ["HTML", "IMAGE", "PDF", "FILE", "XML"].indexOf(data[i].format.toUpperCase()) > -1) {
                absolute = true;
              } else if (data[i].type && (["PIXEL", "IMAGE", "PDF"].indexOf(data[i].type.toUpperCase()) > -1 && !data[i].format || ["HTML", "PDF"].indexOf(data[i].type.toUpperCase()) > -1 && (!data[i].format || data[i].format.toUpperCase() === "FILE"))) {
                absolute = true;
              }
              if (absolute) {
                data[i].data = _qz.tools.absolute(data[i].data);
              }
              if (data[i].options && typeof data[i].options.overlay === "string") {
                data[i].options.overlay = _qz.tools.absolute(data[i].options.overlay);
              }
            }
          }
        },
        extend: function(target) {
          if (typeof target !== "object") {
            target = {};
          }
          for (var i = 1; i < arguments.length; i++) {
            var source = arguments[i];
            if (!source) {
              continue;
            }
            for (var key2 in source) {
              if (source.hasOwnProperty(key2)) {
                if (target === source[key2]) {
                  continue;
                }
                if (source[key2] && source[key2].constructor && source[key2].constructor === Object) {
                  var clone;
                  if (Array.isArray(source[key2])) {
                    clone = target[key2] || [];
                  } else {
                    clone = target[key2] || {};
                  }
                  target[key2] = _qz.tools.extend(clone, source[key2]);
                } else if (source[key2] !== void 0) {
                  target[key2] = source[key2];
                }
              }
            }
          }
          return target;
        },
        versionCompare: function(major, minor, patch, build) {
          if (_qz.tools.assertActive()) {
            var semver = _qz.websocket.connection.semver;
            if (semver[0] != major) {
              return semver[0] - major;
            }
            if (minor != void 0 && semver[1] != minor) {
              return semver[1] - minor;
            }
            if (patch != void 0 && semver[2] != patch) {
              return semver[2] - patch;
            }
            if (build != void 0 && semver.length > 3 && semver[3] != build) {
              return Number.isInteger(semver[3]) && Number.isInteger(build) ? semver[3] - build : semver[3].toString().localeCompare(build.toString());
            }
            return 0;
          }
        },
        isVersion: function(major, minor, patch, build) {
          return _qz.tools.versionCompare(major, minor, patch, build) == 0;
        },
        isActive: function() {
          return _qz.websocket.connection != null && _qz.websocket.connection.established;
        },
        assertActive: function() {
          if (_qz.tools.isActive()) {
            return true;
          }
          throw new Error("A connection to QZ has not been established yet");
        }
      },
      compatible: {
        data: function(printData) {
          if (_qz.tools.isVersion(2, 0)) {
            _qz.log.trace("Converting print data to v2.0 for " + _qz.websocket.connection.version);
            for (var i = 0; i < printData.length; i++) {
              if (printData[i].constructor === Object) {
                if (printData[i].type && printData[i].type.toUpperCase() === "RAW" && printData[i].format && printData[i].format.toUpperCase() === "IMAGE") {
                  if (printData[i].flavor && printData[i].flavor.toUpperCase() === "BASE64") {
                    printData[i].data = "data:image/compat;base64," + printData[i].data;
                  }
                  printData[i].flavor = "IMAGE";
                }
                if (printData[i].type && printData[i].type.toUpperCase() === "RAW" || printData[i].format && printData[i].format.toUpperCase() === "COMMAND") {
                  printData[i].format = "RAW";
                }
                printData[i].type = printData[i].format;
                printData[i].format = printData[i].flavor;
                delete printData[i].flavor;
              }
            }
          }
        },
        config: function(config, dirty) {
          if (_qz.tools.isVersion(2, 0)) {
            if (!dirty.rasterize) {
              config.rasterize = true;
            }
          }
          if (_qz.tools.versionCompare(2, 1, 4) < 0) {
            if (config.forceRaw) {
              config.altPrinting = config.forceRaw;
              delete config.forceRaw;
            }
          }
          if (_qz.tools.versionCompare(2, 1, 2, 11) < 0) {
            if (config.spool) {
              if (config.spool.size) {
                config.perSpool = config.spool.size;
                delete config.spool.size;
              }
              if (config.spool.end) {
                config.endOfDoc = config.spool.end;
                delete config.spool.end;
              }
              delete config.spool;
            }
          }
          return config;
        },
        networking: function(hostname, port, signature, signingTimestamp, mappingCallback) {
          if (_qz.tools.isVersion(2, 0)) {
            return _qz.tools.promise(function(resolve, reject) {
              _qz.websocket.dataPromise("websocket.getNetworkInfo", {
                hostname,
                port
              }, signature, signingTimestamp).then(function(data) {
                if (typeof mappingCallback !== "undefined") {
                  resolve(mappingCallback(data));
                } else {
                  resolve(data);
                }
              }, reject);
            });
          }
          return _qz.tools.promise(function(resolve, reject) {
            _qz.websocket.dataPromise("networking.device", {
              hostname,
              port
            }, signature, signingTimestamp).then(function(data) {
              resolve({ ipAddress: data.ip, macAddress: data.mac });
            }, reject);
          });
        },
        algorithm: function(quiet) {
          if (_qz.tools.isActive()) {
            if (_qz.tools.isVersion(2, 0)) {
              if (!quiet) {
                _qz.log.warn("Connected to an older version of QZ, alternate signature algorithms are not supported");
              }
              return false;
            }
          }
          return true;
        }
      },
      SHA: {
        hash: function(msg) {
          msg = msg.utf8Encode() + String.fromCharCode(128);
          var K = [
            1116352408,
            1899447441,
            3049323471,
            3921009573,
            961987163,
            1508970993,
            2453635748,
            2870763221,
            3624381080,
            310598401,
            607225278,
            1426881987,
            1925078388,
            2162078206,
            2614888103,
            3248222580,
            3835390401,
            4022224774,
            264347078,
            604807628,
            770255983,
            1249150122,
            1555081692,
            1996064986,
            2554220882,
            2821834349,
            2952996808,
            3210313671,
            3336571891,
            3584528711,
            113926993,
            338241895,
            666307205,
            773529912,
            1294757372,
            1396182291,
            1695183700,
            1986661051,
            2177026350,
            2456956037,
            2730485921,
            2820302411,
            3259730800,
            3345764771,
            3516065817,
            3600352804,
            4094571909,
            275423344,
            430227734,
            506948616,
            659060556,
            883997877,
            958139571,
            1322822218,
            1537002063,
            1747873779,
            1955562222,
            2024104815,
            2227730452,
            2361852424,
            2428436474,
            2756734187,
            3204031479,
            3329325298
          ];
          var H = [1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225];
          var l = msg.length / 4 + 2;
          var N = Math.ceil(l / 16);
          var M = new Array(N);
          for (var i = 0; i < N; i++) {
            M[i] = new Array(16);
            for (var j = 0; j < 16; j++) {
              M[i][j] = msg.charCodeAt(i * 64 + j * 4) << 24 | msg.charCodeAt(i * 64 + j * 4 + 1) << 16 | msg.charCodeAt(i * 64 + j * 4 + 2) << 8 | msg.charCodeAt(i * 64 + j * 4 + 3);
            }
          }
          M[N - 1][14] = (msg.length - 1) * 8 / Math.pow(2, 32);
          M[N - 1][14] = Math.floor(M[N - 1][14]);
          M[N - 1][15] = (msg.length - 1) * 8 & 4294967295;
          var W = new Array(64);
          var a, b, c, d, e, f, g, h2;
          for (var i = 0; i < N; i++) {
            for (var t = 0; t < 16; t++) {
              W[t] = M[i][t];
            }
            for (var t = 16; t < 64; t++) {
              W[t] = _qz.SHA._dev1(W[t - 2]) + W[t - 7] + _qz.SHA._dev0(W[t - 15]) + W[t - 16] & 4294967295;
            }
            a = H[0];
            b = H[1];
            c = H[2];
            d = H[3];
            e = H[4];
            f = H[5];
            g = H[6];
            h2 = H[7];
            for (var t = 0; t < 64; t++) {
              var T1 = h2 + _qz.SHA._sig1(e) + _qz.SHA._ch(e, f, g) + K[t] + W[t];
              var T2 = _qz.SHA._sig0(a) + _qz.SHA._maj(a, b, c);
              h2 = g;
              g = f;
              f = e;
              e = d + T1 & 4294967295;
              d = c;
              c = b;
              b = a;
              a = T1 + T2 & 4294967295;
            }
            H[0] = H[0] + a & 4294967295;
            H[1] = H[1] + b & 4294967295;
            H[2] = H[2] + c & 4294967295;
            H[3] = H[3] + d & 4294967295;
            H[4] = H[4] + e & 4294967295;
            H[5] = H[5] + f & 4294967295;
            H[6] = H[6] + g & 4294967295;
            H[7] = H[7] + h2 & 4294967295;
          }
          return _qz.SHA._hexStr(H[0]) + _qz.SHA._hexStr(H[1]) + _qz.SHA._hexStr(H[2]) + _qz.SHA._hexStr(H[3]) + _qz.SHA._hexStr(H[4]) + _qz.SHA._hexStr(H[5]) + _qz.SHA._hexStr(H[6]) + _qz.SHA._hexStr(H[7]);
        },
        _rotr: function(n, x) {
          return x >>> n | x << 32 - n;
        },
        _sig0: function(x) {
          return _qz.SHA._rotr(2, x) ^ _qz.SHA._rotr(13, x) ^ _qz.SHA._rotr(22, x);
        },
        _sig1: function(x) {
          return _qz.SHA._rotr(6, x) ^ _qz.SHA._rotr(11, x) ^ _qz.SHA._rotr(25, x);
        },
        _dev0: function(x) {
          return _qz.SHA._rotr(7, x) ^ _qz.SHA._rotr(18, x) ^ x >>> 3;
        },
        _dev1: function(x) {
          return _qz.SHA._rotr(17, x) ^ _qz.SHA._rotr(19, x) ^ x >>> 10;
        },
        _ch: function(x, y, z) {
          return x & y ^ ~x & z;
        },
        _maj: function(x, y, z) {
          return x & y ^ x & z ^ y & z;
        },
        _hexStr: function(n) {
          var s = "", v;
          for (var i = 7; i >= 0; i--) {
            v = n >>> i * 4 & 15;
            s += v.toString(16);
          }
          return s;
        }
      }
    };
    function Config(printer, opts) {
      this.config = _qz.tools.extend({}, _qz.printing.defaultConfig);
      this._dirtyOpts = {};
      this.setPrinter = function(newPrinter) {
        if (typeof newPrinter === "string") {
          newPrinter = { name: newPrinter };
        }
        if (newPrinter && newPrinter.file) {
          if (newPrinter.file.indexOf("\\\\") != 0) {
            _qz.log.warn("Printing to file is deprecated.  See https://github.com/qzind/tray/issues/730");
          }
        }
        this.printer = newPrinter;
      };
      this.getPrinter = function() {
        return this.printer;
      };
      this.reconfigure = function(newOpts) {
        for (var key2 in newOpts) {
          if (newOpts[key2] !== void 0) {
            this._dirtyOpts[key2] = true;
          }
        }
        _qz.tools.extend(this.config, newOpts);
      };
      this.getOptions = function() {
        return _qz.compatible.config(this.config, this._dirtyOpts);
      };
      this.setPrinter(printer);
      this.reconfigure(opts);
    }
    Config.prototype.print = function(data, signature, signingTimestamp) {
      qz3.print(this, data, signature, signingTimestamp);
    };
    var qz3 = {
      websocket: {
        isActive: function() {
          return _qz.tools.isActive();
        },
        connect: function(options) {
          return _qz.tools.promise(function(resolve, reject) {
            if (_qz.tools.isActive()) {
              reject(new Error("An open connection with QZ Tray already exists"));
              return;
            } else if (_qz.websocket.connection != null) {
              reject(new Error("The current connection attempt has not returned yet"));
              return;
            }
            if (!_qz.tools.ws) {
              reject(new Error("WebSocket not supported by this browser"));
              return;
            } else if (!_qz.tools.ws.CLOSED || _qz.tools.ws.CLOSED == 2) {
              reject(new Error("Unsupported WebSocket version detected: HyBi-00/Hixie-76"));
              return;
            }
            if (options == void 0) {
              options = {};
            }
            if (typeof location === "undefined" || location.protocol !== "https:") {
              if (typeof options.usingSecure === "undefined") {
                _qz.log.trace("Disabling secure ports due to insecure page");
                options.usingSecure = false;
              }
            }
            if (typeof options.host !== "undefined" && !Array.isArray(options.host)) {
              options.host = [options.host];
            }
            var attempt = function(count) {
              var tried = false;
              var nextAttempt = function() {
                if (!tried) {
                  tried = true;
                  if (options && count < options.retries) {
                    attempt(count + 1);
                  } else {
                    _qz.websocket.connection = null;
                    reject.apply(null, arguments);
                  }
                }
              };
              var delayed = function() {
                var config = _qz.tools.extend({}, _qz.websocket.connectConfig, options);
                _qz.websocket.setup.findConnection(config, resolve, nextAttempt);
              };
              if (count == 0) {
                delayed();
              } else {
                setTimeout(delayed, options.delay * 1e3);
              }
            };
            attempt(0);
          });
        },
        disconnect: function() {
          return _qz.tools.promise(function(resolve, reject) {
            if (_qz.tools.isActive()) {
              _qz.websocket.connection.close();
              _qz.websocket.connection.promise = { resolve, reject };
            } else {
              reject(new Error("No open connection with QZ Tray"));
            }
          });
        },
        setErrorCallbacks: function(calls) {
          _qz.websocket.errorCallbacks = calls;
        },
        setClosedCallbacks: function(calls) {
          _qz.websocket.closedCallbacks = calls;
        },
        getNetworkInfo: _qz.compatible.networking,
        getConnectionInfo: function() {
          if (_qz.tools.assertActive()) {
            var url = _qz.websocket.connection.url.split(/[:\/]+/g);
            return { socket: url[0], host: url[1], port: +url[2] };
          }
        }
      },
      printers: {
        getDefault: function(signature, signingTimestamp) {
          return _qz.websocket.dataPromise("printers.getDefault", null, signature, signingTimestamp);
        },
        find: function(query, signature, signingTimestamp) {
          return _qz.websocket.dataPromise("printers.find", { query }, signature, signingTimestamp);
        },
        details: function() {
          return _qz.websocket.dataPromise("printers.detail");
        },
        startListening: function(printers) {
          if (!Array.isArray(printers)) {
            printers = [printers];
          }
          var params = {
            printerNames: printers
          };
          return _qz.websocket.dataPromise("printers.startListening", params);
        },
        stopListening: function() {
          return _qz.websocket.dataPromise("printers.stopListening");
        },
        getStatus: function() {
          return _qz.websocket.dataPromise("printers.getStatus");
        },
        setPrinterCallbacks: function(calls) {
          _qz.printers.printerCallbacks = calls;
        }
      },
      configs: {
        setDefaults: function(options) {
          _qz.tools.extend(_qz.printing.defaultConfig, options);
        },
        create: function(printer, options) {
          return new Config(printer, options);
        }
      },
      print: function(configs, data) {
        var resumeOnError = false, signatures = [], signaturesTimestamps = [];
        if (arguments.length >= 3) {
          if (typeof arguments[2] === "boolean") {
            resumeOnError = arguments[2];
            if (arguments.length >= 5) {
              signatures = arguments[3];
              signaturesTimestamps = arguments[4];
            }
          } else if (arguments.length >= 4) {
            signatures = arguments[2];
            signaturesTimestamps = arguments[3];
          }
          if (signatures && !Array.isArray(signatures)) {
            signatures = [signatures];
          }
          if (signaturesTimestamps && !Array.isArray(signaturesTimestamps)) {
            signaturesTimestamps = [signaturesTimestamps];
          }
        }
        if (!Array.isArray(configs)) {
          configs = [configs];
        }
        if (!Array.isArray(data[0])) {
          data = [data];
        }
        for (var d = 0; d < data.length; d++) {
          _qz.tools.relative(data[d]);
          _qz.compatible.data(data[d]);
        }
        var sendToPrint = function(mapping) {
          var params = {
            printer: mapping.config.getPrinter(),
            options: mapping.config.getOptions(),
            data: mapping.data
          };
          return _qz.websocket.dataPromise("print", params, mapping.signature, mapping.timestamp);
        };
        var chain = [];
        for (var i = 0; i < configs.length || i < data.length; i++) {
          (function(i_) {
            var map = {
              config: configs[Math.min(i_, configs.length - 1)],
              data: data[Math.min(i_, data.length - 1)],
              signature: signatures[i_],
              timestamp: signaturesTimestamps[i_]
            };
            chain.push(function() {
              return sendToPrint(map);
            });
          })(i);
        }
        var fallThrough = null;
        if (resumeOnError) {
          var fallen = [];
          fallThrough = function(err) {
            fallen.push(err);
          };
          chain.push(function() {
            return _qz.tools.promise(function(resolve, reject) {
              fallen.length ? reject(fallen) : resolve();
            });
          });
        }
        var last = null;
        chain.reduce(function(sequence, link) {
          last = sequence.catch(fallThrough).then(link);
          return last;
        }, _qz.tools.promise(function(r) {
          r();
        }));
        return last;
      },
      serial: {
        findPorts: function() {
          return _qz.websocket.dataPromise("serial.findPorts");
        },
        setSerialCallbacks: function(calls) {
          _qz.serial.serialCallbacks = calls;
        },
        openPort: function(port, options) {
          var params = {
            port,
            options
          };
          return _qz.websocket.dataPromise("serial.openPort", params);
        },
        sendData: function(port, data, options) {
          if (_qz.tools.versionCompare(2, 1, 0, 12) >= 0) {
            if (typeof data !== "object") {
              data = {
                data,
                type: "PLAIN"
              };
            }
            if (data.type && data.type.toUpperCase() == "FILE") {
              data.data = _qz.tools.absolute(data.data);
            }
          }
          var params = {
            port,
            data,
            options
          };
          return _qz.websocket.dataPromise("serial.sendData", params);
        },
        closePort: function(port) {
          return _qz.websocket.dataPromise("serial.closePort", { port });
        }
      },
      socket: {
        open: function(host, port, options) {
          var params = {
            host,
            port,
            options
          };
          return _qz.websocket.dataPromise("socket.open", params);
        },
        close: function(host, port) {
          var params = {
            host,
            port
          };
          return _qz.websocket.dataPromise("socket.close", params);
        },
        sendData: function(host, port, data) {
          if (typeof data !== "object") {
            data = {
              data,
              type: "PLAIN"
            };
          }
          var params = {
            host,
            port,
            data
          };
          return _qz.websocket.dataPromise("socket.sendData", params);
        },
        setSocketCallbacks: function(calls) {
          _qz.socket.socketCallbacks = calls;
        }
      },
      usb: {
        listDevices: function(includeHubs) {
          return _qz.websocket.dataPromise("usb.listDevices", { includeHubs });
        },
        listInterfaces: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = { vendorId: arguments[0], productId: arguments[1] };
          }
          return _qz.websocket.dataPromise("usb.listInterfaces", deviceInfo);
        },
        listEndpoints: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = {
              vendorId: arguments[0],
              productId: arguments[1],
              interface: arguments[2]
            };
          }
          return _qz.websocket.dataPromise("usb.listEndpoints", deviceInfo);
        },
        setUsbCallbacks: function(calls) {
          _qz.usb.usbCallbacks = calls;
        },
        claimDevice: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = {
              vendorId: arguments[0],
              productId: arguments[1],
              interface: arguments[2]
            };
          }
          return _qz.websocket.dataPromise("usb.claimDevice", deviceInfo);
        },
        isClaimed: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = { vendorId: arguments[0], productId: arguments[1] };
          }
          return _qz.websocket.dataPromise("usb.isClaimed", deviceInfo);
        },
        sendData: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = {
              vendorId: arguments[0],
              productId: arguments[1],
              endpoint: arguments[2],
              data: arguments[3]
            };
          }
          if (_qz.tools.versionCompare(2, 1, 0, 12) >= 0) {
            if (typeof deviceInfo.data !== "object") {
              deviceInfo.data = {
                data: deviceInfo.data,
                type: "PLAIN"
              };
            }
            if (deviceInfo.data.type && deviceInfo.data.type.toUpperCase() == "FILE") {
              deviceInfo.data.data = _qz.tools.absolute(deviceInfo.data.data);
            }
          }
          return _qz.websocket.dataPromise("usb.sendData", deviceInfo);
        },
        readData: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = {
              vendorId: arguments[0],
              productId: arguments[1],
              endpoint: arguments[2],
              responseSize: arguments[3]
            };
          }
          return _qz.websocket.dataPromise("usb.readData", deviceInfo);
        },
        openStream: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = {
              vendorId: arguments[0],
              productId: arguments[1],
              endpoint: arguments[2],
              responseSize: arguments[3],
              interval: arguments[4]
            };
          }
          return _qz.websocket.dataPromise("usb.openStream", deviceInfo);
        },
        closeStream: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = {
              vendorId: arguments[0],
              productId: arguments[1],
              endpoint: arguments[2]
            };
          }
          return _qz.websocket.dataPromise("usb.closeStream", deviceInfo);
        },
        releaseDevice: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = { vendorId: arguments[0], productId: arguments[1] };
          }
          return _qz.websocket.dataPromise("usb.releaseDevice", deviceInfo);
        }
      },
      hid: {
        listDevices: function() {
          return _qz.websocket.dataPromise("hid.listDevices");
        },
        startListening: function() {
          return _qz.websocket.dataPromise("hid.startListening");
        },
        stopListening: function() {
          return _qz.websocket.dataPromise("hid.stopListening");
        },
        setHidCallbacks: function(calls) {
          _qz.hid.hidCallbacks = calls;
        },
        claimDevice: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = { vendorId: arguments[0], productId: arguments[1] };
          }
          return _qz.websocket.dataPromise("hid.claimDevice", deviceInfo);
        },
        isClaimed: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = { vendorId: arguments[0], productId: arguments[1] };
          }
          return _qz.websocket.dataPromise("hid.isClaimed", deviceInfo);
        },
        sendData: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = {
              vendorId: arguments[0],
              productId: arguments[1],
              data: arguments[2],
              endpoint: arguments[3]
            };
          }
          if (_qz.tools.versionCompare(2, 1, 0, 12) >= 0) {
            if (typeof deviceInfo.data !== "object") {
              deviceInfo.data = {
                data: deviceInfo.data,
                type: "PLAIN"
              };
            }
            if (deviceInfo.data.type && deviceInfo.data.type.toUpperCase() == "FILE") {
              deviceInfo.data.data = _qz.tools.absolute(deviceInfo.data.data);
            }
          }
          return _qz.websocket.dataPromise("hid.sendData", deviceInfo);
        },
        readData: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = {
              vendorId: arguments[0],
              productId: arguments[1],
              responseSize: arguments[2]
            };
          }
          return _qz.websocket.dataPromise("hid.readData", deviceInfo);
        },
        sendFeatureReport: function(deviceInfo) {
          return _qz.websocket.dataPromise("hid.sendFeatureReport", deviceInfo);
        },
        getFeatureReport: function(deviceInfo) {
          return _qz.websocket.dataPromise("hid.getFeatureReport", deviceInfo);
        },
        openStream: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = {
              vendorId: arguments[0],
              productId: arguments[1],
              responseSize: arguments[2],
              interval: arguments[3]
            };
          }
          return _qz.websocket.dataPromise("hid.openStream", deviceInfo);
        },
        closeStream: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = { vendorId: arguments[0], productId: arguments[1] };
          }
          return _qz.websocket.dataPromise("hid.closeStream", deviceInfo);
        },
        releaseDevice: function(deviceInfo) {
          if (typeof deviceInfo !== "object") {
            deviceInfo = { vendorId: arguments[0], productId: arguments[1] };
          }
          return _qz.websocket.dataPromise("hid.releaseDevice", deviceInfo);
        }
      },
      file: {
        list: function(path, params) {
          var param = _qz.tools.extend({ path }, params);
          return _qz.websocket.dataPromise("file.list", param);
        },
        read: function(path, params) {
          var param = _qz.tools.extend({ path }, params);
          return _qz.websocket.dataPromise("file.read", param);
        },
        write: function(path, params) {
          var param = _qz.tools.extend({ path }, params);
          return _qz.websocket.dataPromise("file.write", param);
        },
        remove: function(path, params) {
          var param = _qz.tools.extend({ path }, params);
          return _qz.websocket.dataPromise("file.remove", param);
        },
        startListening: function(path, params) {
          if (params && typeof params.include !== "undefined" && !Array.isArray(params.include)) {
            params.include = [params.include];
          }
          if (params && typeof params.exclude !== "undefined" && !Array.isArray(params.exclude)) {
            params.exclude = [params.exclude];
          }
          var param = _qz.tools.extend({ path }, params);
          return _qz.websocket.dataPromise("file.startListening", param);
        },
        stopListening: function(path, params) {
          var param = _qz.tools.extend({ path }, params);
          return _qz.websocket.dataPromise("file.stopListening", param);
        },
        setFileCallbacks: function(calls) {
          _qz.file.fileCallbacks = calls;
        }
      },
      networking: {
        device: function(hostname, port) {
          if (_qz.tools.isVersion(2, 0)) {
            return _qz.compatible.networking(hostname, port, null, null, function(data) {
              return { ip: data.ipAddress, mac: data.macAddress };
            });
          }
          return _qz.websocket.dataPromise("networking.device", {
            hostname,
            port
          });
        },
        devices: function(hostname, port) {
          if (_qz.tools.isVersion(2, 0)) {
            return _qz.compatible.networking(hostname, port, null, null, function(data) {
              return [{ ip: data.ipAddress, mac: data.macAddress }];
            });
          }
          return _qz.websocket.dataPromise("networking.devices", {
            hostname,
            port
          });
        }
      },
      security: {
        setCertificatePromise: function(promiseHandler) {
          _qz.security.certHandler = promiseHandler;
        },
        setSignaturePromise: function(promiseFactory) {
          _qz.security.signatureFactory = promiseFactory;
        },
        setSignatureAlgorithm: function(algorithm) {
          if (!_qz.compatible.algorithm()) {
            return;
          }
          if (["SHA1", "SHA256", "SHA512"].indexOf(algorithm.toUpperCase()) < 0) {
            _qz.log.error("Signing algorithm '" + algorithm + "' is not supported.");
          } else {
            _qz.security.signAlgorithm = algorithm;
          }
        },
        getSignatureAlgorithm: function() {
          return _qz.security.signAlgorithm;
        }
      },
      api: {
        showDebug: function(show) {
          return _qz.DEBUG = show;
        },
        getVersion: function() {
          return _qz.websocket.dataPromise("getVersion");
        },
        isVersion: _qz.tools.isVersion,
        isVersionGreater: function(major, minor, patch, build) {
          return _qz.tools.versionCompare(major, minor, patch, build) > 0;
        },
        isVersionLess: function(major, minor, patch, build) {
          return _qz.tools.versionCompare(major, minor, patch, build) < 0;
        },
        setPromiseType: function(promiser) {
          _qz.tools.promise = promiser;
        },
        setSha256Type: function(hasher) {
          _qz.tools.hash = hasher;
        },
        setWebSocketType: function(ws) {
          _qz.tools.ws = ws;
        }
      },
      version: _qz.VERSION
    };
    return qz3;
  }();
  (function() {
    {
      module.exports = qz2;
    }
  })();
})(qzTray);
var qz = qzTray.exports;
var navigator$1 = {};
navigator$1.userAgent = false;
var window$1 = {};
/*!
Copyright (c) 2011, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.com/yui/license.html
version: 2.9.0
*/
if (YAHOO === void 0) {
  var YAHOO = {};
}
YAHOO.lang = { extend: function(g, h2, f) {
  if (!h2 || !g) {
    throw new Error("YAHOO.lang.extend failed, please check that all dependencies are included.");
  }
  var d = function() {
  };
  d.prototype = h2.prototype;
  g.prototype = new d();
  g.prototype.constructor = g;
  g.superclass = h2.prototype;
  if (h2.prototype.constructor == Object.prototype.constructor) {
    h2.prototype.constructor = h2;
  }
  if (f) {
    var b;
    for (b in f) {
      g.prototype[b] = f[b];
    }
    var e = function() {
    }, c = ["toString", "valueOf"];
    try {
      if (/MSIE/.test(navigator$1.userAgent)) {
        e = function(j, i) {
          for (b = 0; b < c.length; b = b + 1) {
            var l = c[b], k = i[l];
            if (typeof k === "function" && k != Object.prototype[l]) {
              j[l] = k;
            }
          }
        };
      }
    } catch (a) {
    }
    e(g.prototype, f);
  }
} };
/*! CryptoJS v3.1.2 core-fix.js
 * code.google.com/p/crypto-js
 * (c) 2009-2013 by Jeff Mott. All rights reserved.
 * code.google.com/p/crypto-js/wiki/License
 * THIS IS FIX of 'core.js' to fix Hmac issue.
 * https://code.google.com/p/crypto-js/issues/detail?id=84
 * https://crypto-js.googlecode.com/svn-history/r667/branches/3.x/src/core.js
 */
var CryptoJS = CryptoJS || function(e, g) {
  var a = {};
  var b = a.lib = {};
  var j = b.Base = function() {
    function n() {
    }
    return { extend: function(p) {
      n.prototype = this;
      var o = new n();
      if (p) {
        o.mixIn(p);
      }
      if (!o.hasOwnProperty("init")) {
        o.init = function() {
          o.$super.init.apply(this, arguments);
        };
      }
      o.init.prototype = o;
      o.$super = this;
      return o;
    }, create: function() {
      var o = this.extend();
      o.init.apply(o, arguments);
      return o;
    }, init: function() {
    }, mixIn: function(p) {
      for (var o in p) {
        if (p.hasOwnProperty(o)) {
          this[o] = p[o];
        }
      }
      if (p.hasOwnProperty("toString")) {
        this.toString = p.toString;
      }
    }, clone: function() {
      return this.init.prototype.extend(this);
    } };
  }();
  var l = b.WordArray = j.extend({ init: function(o, n) {
    o = this.words = o || [];
    if (n != g) {
      this.sigBytes = n;
    } else {
      this.sigBytes = o.length * 4;
    }
  }, toString: function(n) {
    return (n || h2).stringify(this);
  }, concat: function(t) {
    var q = this.words;
    var p = t.words;
    var n = this.sigBytes;
    var s = t.sigBytes;
    this.clamp();
    if (n % 4) {
      for (var r = 0; r < s; r++) {
        var o = p[r >>> 2] >>> 24 - r % 4 * 8 & 255;
        q[n + r >>> 2] |= o << 24 - (n + r) % 4 * 8;
      }
    } else {
      for (var r = 0; r < s; r += 4) {
        q[n + r >>> 2] = p[r >>> 2];
      }
    }
    this.sigBytes += s;
    return this;
  }, clamp: function() {
    var o = this.words;
    var n = this.sigBytes;
    o[n >>> 2] &= 4294967295 << 32 - n % 4 * 8;
    o.length = e.ceil(n / 4);
  }, clone: function() {
    var n = j.clone.call(this);
    n.words = this.words.slice(0);
    return n;
  }, random: function(p) {
    var o = [];
    for (var n = 0; n < p; n += 4) {
      o.push(e.random() * 4294967296 | 0);
    }
    return new l.init(o, p);
  } });
  var m = a.enc = {};
  var h2 = m.Hex = { stringify: function(p) {
    var r = p.words;
    var o = p.sigBytes;
    var q = [];
    for (var n = 0; n < o; n++) {
      var s = r[n >>> 2] >>> 24 - n % 4 * 8 & 255;
      q.push((s >>> 4).toString(16));
      q.push((s & 15).toString(16));
    }
    return q.join("");
  }, parse: function(p) {
    var n = p.length;
    var q = [];
    for (var o = 0; o < n; o += 2) {
      q[o >>> 3] |= parseInt(p.substr(o, 2), 16) << 24 - o % 8 * 4;
    }
    return new l.init(q, n / 2);
  } };
  var d = m.Latin1 = { stringify: function(q) {
    var r = q.words;
    var p = q.sigBytes;
    var n = [];
    for (var o = 0; o < p; o++) {
      var s = r[o >>> 2] >>> 24 - o % 4 * 8 & 255;
      n.push(String.fromCharCode(s));
    }
    return n.join("");
  }, parse: function(p) {
    var n = p.length;
    var q = [];
    for (var o = 0; o < n; o++) {
      q[o >>> 2] |= (p.charCodeAt(o) & 255) << 24 - o % 4 * 8;
    }
    return new l.init(q, n);
  } };
  var c = m.Utf8 = { stringify: function(n) {
    try {
      return decodeURIComponent(escape(d.stringify(n)));
    } catch (o) {
      throw new Error("Malformed UTF-8 data");
    }
  }, parse: function(n) {
    return d.parse(unescape(encodeURIComponent(n)));
  } };
  var i = b.BufferedBlockAlgorithm = j.extend({ reset: function() {
    this._data = new l.init();
    this._nDataBytes = 0;
  }, _append: function(n) {
    if (typeof n == "string") {
      n = c.parse(n);
    }
    this._data.concat(n);
    this._nDataBytes += n.sigBytes;
  }, _process: function(w) {
    var q = this._data;
    var x = q.words;
    var n = q.sigBytes;
    var t = this.blockSize;
    var v = t * 4;
    var u = n / v;
    if (w) {
      u = e.ceil(u);
    } else {
      u = e.max((u | 0) - this._minBufferSize, 0);
    }
    var s = u * t;
    var r = e.min(s * 4, n);
    if (s) {
      for (var p = 0; p < s; p += t) {
        this._doProcessBlock(x, p);
      }
      var o = x.splice(0, s);
      q.sigBytes -= r;
    }
    return new l.init(o, r);
  }, clone: function() {
    var n = j.clone.call(this);
    n._data = this._data.clone();
    return n;
  }, _minBufferSize: 0 });
  b.Hasher = i.extend({ cfg: j.extend(), init: function(n) {
    this.cfg = this.cfg.extend(n);
    this.reset();
  }, reset: function() {
    i.reset.call(this);
    this._doReset();
  }, update: function(n) {
    this._append(n);
    this._process();
    return this;
  }, finalize: function(n) {
    if (n) {
      this._append(n);
    }
    var o = this._doFinalize();
    return o;
  }, blockSize: 512 / 32, _createHelper: function(n) {
    return function(p, o) {
      return new n.init(o).finalize(p);
    };
  }, _createHmacHelper: function(n) {
    return function(p, o) {
      return new k.HMAC.init(n, o).finalize(p);
    };
  } });
  var k = a.algo = {};
  return a;
}(Math);
(function(g) {
  var a = CryptoJS, f = a.lib, e = f.Base, h2 = f.WordArray, a = a.x64 = {};
  a.Word = e.extend({ init: function(b, c) {
    this.high = b;
    this.low = c;
  } });
  a.WordArray = e.extend({ init: function(b, c) {
    b = this.words = b || [];
    this.sigBytes = c != g ? c : 8 * b.length;
  }, toX32: function() {
    for (var b = this.words, c = b.length, a2 = [], d = 0; d < c; d++) {
      var e2 = b[d];
      a2.push(e2.high);
      a2.push(e2.low);
    }
    return h2.create(a2, this.sigBytes);
  }, clone: function() {
    for (var b = e.clone.call(this), c = b.words = this.words.slice(0), a2 = c.length, d = 0; d < a2; d++)
      c[d] = c[d].clone();
    return b;
  } });
})();
CryptoJS.lib.Cipher || function(u) {
  var g = CryptoJS, f = g.lib, k = f.Base, l = f.WordArray, q = f.BufferedBlockAlgorithm, r = g.enc.Base64, v = g.algo.EvpKDF, n = f.Cipher = q.extend({ cfg: k.extend(), createEncryptor: function(a, b) {
    return this.create(this._ENC_XFORM_MODE, a, b);
  }, createDecryptor: function(a, b) {
    return this.create(this._DEC_XFORM_MODE, a, b);
  }, init: function(a, b, c) {
    this.cfg = this.cfg.extend(c);
    this._xformMode = a;
    this._key = b;
    this.reset();
  }, reset: function() {
    q.reset.call(this);
    this._doReset();
  }, process: function(a) {
    this._append(a);
    return this._process();
  }, finalize: function(a) {
    a && this._append(a);
    return this._doFinalize();
  }, keySize: 4, ivSize: 4, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: function(a) {
    return { encrypt: function(b, c, d) {
      return (typeof c == "string" ? s : j).encrypt(a, b, c, d);
    }, decrypt: function(b, c, d) {
      return (typeof c == "string" ? s : j).decrypt(a, b, c, d);
    } };
  } });
  f.StreamCipher = n.extend({ _doFinalize: function() {
    return this._process(true);
  }, blockSize: 1 });
  var m = g.mode = {}, t = function(a, b, c) {
    var d = this._iv;
    d ? this._iv = u : d = this._prevBlock;
    for (var e = 0; e < c; e++)
      a[b + e] ^= d[e];
  }, h2 = (f.BlockCipherMode = k.extend({ createEncryptor: function(a, b) {
    return this.Encryptor.create(a, b);
  }, createDecryptor: function(a, b) {
    return this.Decryptor.create(a, b);
  }, init: function(a, b) {
    this._cipher = a;
    this._iv = b;
  } })).extend();
  h2.Encryptor = h2.extend({ processBlock: function(a, b) {
    var c = this._cipher, d = c.blockSize;
    t.call(this, a, b, d);
    c.encryptBlock(a, b);
    this._prevBlock = a.slice(b, b + d);
  } });
  h2.Decryptor = h2.extend({ processBlock: function(a, b) {
    var c = this._cipher, d = c.blockSize, e = a.slice(b, b + d);
    c.decryptBlock(a, b);
    t.call(this, a, b, d);
    this._prevBlock = e;
  } });
  m = m.CBC = h2;
  h2 = (g.pad = {}).Pkcs7 = { pad: function(a, b) {
    for (var c = 4 * b, c = c - a.sigBytes % c, d = c << 24 | c << 16 | c << 8 | c, e = [], f2 = 0; f2 < c; f2 += 4)
      e.push(d);
    c = l.create(e, c);
    a.concat(c);
  }, unpad: function(a) {
    a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255;
  } };
  f.BlockCipher = n.extend({ cfg: n.cfg.extend({ mode: m, padding: h2 }), reset: function() {
    n.reset.call(this);
    var a = this.cfg, b = a.iv, a = a.mode;
    if (this._xformMode == this._ENC_XFORM_MODE)
      var c = a.createEncryptor;
    else
      c = a.createDecryptor, this._minBufferSize = 1;
    this._mode = c.call(a, this, b && b.words);
  }, _doProcessBlock: function(a, b) {
    this._mode.processBlock(a, b);
  }, _doFinalize: function() {
    var a = this.cfg.padding;
    if (this._xformMode == this._ENC_XFORM_MODE) {
      a.pad(this._data, this.blockSize);
      var b = this._process(true);
    } else
      b = this._process(true), a.unpad(b);
    return b;
  }, blockSize: 4 });
  var p = f.CipherParams = k.extend({ init: function(a) {
    this.mixIn(a);
  }, toString: function(a) {
    return (a || this.formatter).stringify(this);
  } }), m = (g.format = {}).OpenSSL = { stringify: function(a) {
    var b = a.ciphertext;
    a = a.salt;
    return (a ? l.create([1398893684, 1701076831]).concat(a).concat(b) : b).toString(r);
  }, parse: function(a) {
    a = r.parse(a);
    var b = a.words;
    if (b[0] == 1398893684 && b[1] == 1701076831) {
      var c = l.create(b.slice(2, 4));
      b.splice(0, 4);
      a.sigBytes -= 16;
    }
    return p.create({ ciphertext: a, salt: c });
  } }, j = f.SerializableCipher = k.extend({ cfg: k.extend({ format: m }), encrypt: function(a, b, c, d) {
    d = this.cfg.extend(d);
    var e = a.createEncryptor(c, d);
    b = e.finalize(b);
    e = e.cfg;
    return p.create({
      ciphertext: b,
      key: c,
      iv: e.iv,
      algorithm: a,
      mode: e.mode,
      padding: e.padding,
      blockSize: a.blockSize,
      formatter: d.format
    });
  }, decrypt: function(a, b, c, d) {
    d = this.cfg.extend(d);
    b = this._parse(b, d.format);
    return a.createDecryptor(c, d).finalize(b.ciphertext);
  }, _parse: function(a, b) {
    return typeof a == "string" ? b.parse(a, this) : a;
  } }), g = (g.kdf = {}).OpenSSL = { execute: function(a, b, c, d) {
    d || (d = l.random(8));
    a = v.create({ keySize: b + c }).compute(a, d);
    c = l.create(a.words.slice(b), 4 * c);
    a.sigBytes = 4 * b;
    return p.create({ key: a, iv: c, salt: d });
  } }, s = f.PasswordBasedCipher = j.extend({ cfg: j.cfg.extend({ kdf: g }), encrypt: function(a, b, c, d) {
    d = this.cfg.extend(d);
    c = d.kdf.execute(c, a.keySize, a.ivSize);
    d.iv = c.iv;
    a = j.encrypt.call(this, a, b, c.key, d);
    a.mixIn(c);
    return a;
  }, decrypt: function(a, b, c, d) {
    d = this.cfg.extend(d);
    b = this._parse(b, d.format);
    c = d.kdf.execute(c, a.keySize, a.ivSize, b.salt);
    d.iv = c.iv;
    return j.decrypt.call(this, a, b, c.key, d);
  } });
}();
(function() {
  for (var q = CryptoJS, x = q.lib.BlockCipher, r = q.algo, j = [], y = [], z = [], A = [], B = [], C = [], s = [], u = [], v = [], w = [], g = [], k = 0; 256 > k; k++)
    g[k] = 128 > k ? k << 1 : k << 1 ^ 283;
  for (var n = 0, l = 0, k = 0; 256 > k; k++) {
    var f = l ^ l << 1 ^ l << 2 ^ l << 3 ^ l << 4, f = f >>> 8 ^ f & 255 ^ 99;
    j[n] = f;
    y[f] = n;
    var t = g[n], D = g[t], E = g[D], b = 257 * g[f] ^ 16843008 * f;
    z[n] = b << 24 | b >>> 8;
    A[n] = b << 16 | b >>> 16;
    B[n] = b << 8 | b >>> 24;
    C[n] = b;
    b = 16843009 * E ^ 65537 * D ^ 257 * t ^ 16843008 * n;
    s[f] = b << 24 | b >>> 8;
    u[f] = b << 16 | b >>> 16;
    v[f] = b << 8 | b >>> 24;
    w[f] = b;
    n ? (n = t ^ g[g[g[E ^ t]]], l ^= g[g[l]]) : n = l = 1;
  }
  var F = [
    0,
    1,
    2,
    4,
    8,
    16,
    32,
    64,
    128,
    27,
    54
  ], r = r.AES = x.extend({ _doReset: function() {
    for (var c = this._key, e = c.words, a = c.sigBytes / 4, c = 4 * ((this._nRounds = a + 6) + 1), b2 = this._keySchedule = [], h2 = 0; h2 < c; h2++)
      if (h2 < a)
        b2[h2] = e[h2];
      else {
        var d = b2[h2 - 1];
        h2 % a ? 6 < a && h2 % a == 4 && (d = j[d >>> 24] << 24 | j[d >>> 16 & 255] << 16 | j[d >>> 8 & 255] << 8 | j[d & 255]) : (d = d << 8 | d >>> 24, d = j[d >>> 24] << 24 | j[d >>> 16 & 255] << 16 | j[d >>> 8 & 255] << 8 | j[d & 255], d ^= F[h2 / a | 0] << 24);
        b2[h2] = b2[h2 - a] ^ d;
      }
    e = this._invKeySchedule = [];
    for (a = 0; a < c; a++)
      h2 = c - a, d = a % 4 ? b2[h2] : b2[h2 - 4], e[a] = 4 > a || 4 >= h2 ? d : s[j[d >>> 24]] ^ u[j[d >>> 16 & 255]] ^ v[j[d >>> 8 & 255]] ^ w[j[d & 255]];
  }, encryptBlock: function(c, e) {
    this._doCryptBlock(c, e, this._keySchedule, z, A, B, C, j);
  }, decryptBlock: function(c, e) {
    var a = c[e + 1];
    c[e + 1] = c[e + 3];
    c[e + 3] = a;
    this._doCryptBlock(c, e, this._invKeySchedule, s, u, v, w, y);
    a = c[e + 1];
    c[e + 1] = c[e + 3];
    c[e + 3] = a;
  }, _doCryptBlock: function(c, e, a, b2, h2, d, j2, m) {
    for (var n2 = this._nRounds, f2 = c[e] ^ a[0], g2 = c[e + 1] ^ a[1], k2 = c[e + 2] ^ a[2], p = c[e + 3] ^ a[3], l2 = 4, t2 = 1; t2 < n2; t2++)
      var q2 = b2[f2 >>> 24] ^ h2[g2 >>> 16 & 255] ^ d[k2 >>> 8 & 255] ^ j2[p & 255] ^ a[l2++], r2 = b2[g2 >>> 24] ^ h2[k2 >>> 16 & 255] ^ d[p >>> 8 & 255] ^ j2[f2 & 255] ^ a[l2++], s2 = b2[k2 >>> 24] ^ h2[p >>> 16 & 255] ^ d[f2 >>> 8 & 255] ^ j2[g2 & 255] ^ a[l2++], p = b2[p >>> 24] ^ h2[f2 >>> 16 & 255] ^ d[g2 >>> 8 & 255] ^ j2[k2 & 255] ^ a[l2++], f2 = q2, g2 = r2, k2 = s2;
    q2 = (m[f2 >>> 24] << 24 | m[g2 >>> 16 & 255] << 16 | m[k2 >>> 8 & 255] << 8 | m[p & 255]) ^ a[l2++];
    r2 = (m[g2 >>> 24] << 24 | m[k2 >>> 16 & 255] << 16 | m[p >>> 8 & 255] << 8 | m[f2 & 255]) ^ a[l2++];
    s2 = (m[k2 >>> 24] << 24 | m[p >>> 16 & 255] << 16 | m[f2 >>> 8 & 255] << 8 | m[g2 & 255]) ^ a[l2++];
    p = (m[p >>> 24] << 24 | m[f2 >>> 16 & 255] << 16 | m[g2 >>> 8 & 255] << 8 | m[k2 & 255]) ^ a[l2++];
    c[e] = q2;
    c[e + 1] = r2;
    c[e + 2] = s2;
    c[e + 3] = p;
  }, keySize: 8 });
  q.AES = x._createHelper(r);
})();
(function() {
  function j(b, c) {
    var a = (this._lBlock >>> b ^ this._rBlock) & c;
    this._rBlock ^= a;
    this._lBlock ^= a << b;
  }
  function l(b, c) {
    var a = (this._rBlock >>> b ^ this._lBlock) & c;
    this._lBlock ^= a;
    this._rBlock ^= a << b;
  }
  var h2 = CryptoJS, e = h2.lib, n = e.WordArray, e = e.BlockCipher, g = h2.algo, q = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4], p = [
    14,
    17,
    11,
    24,
    1,
    5,
    3,
    28,
    15,
    6,
    21,
    10,
    23,
    19,
    12,
    4,
    26,
    8,
    16,
    7,
    27,
    20,
    13,
    2,
    41,
    52,
    31,
    37,
    47,
    55,
    30,
    40,
    51,
    45,
    33,
    48,
    44,
    49,
    39,
    56,
    34,
    53,
    46,
    42,
    50,
    36,
    29,
    32
  ], r = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28], s = [{
    "0": 8421888,
    268435456: 32768,
    536870912: 8421378,
    805306368: 2,
    1073741824: 512,
    1342177280: 8421890,
    1610612736: 8389122,
    1879048192: 8388608,
    2147483648: 514,
    2415919104: 8389120,
    2684354560: 33280,
    2952790016: 8421376,
    3221225472: 32770,
    3489660928: 8388610,
    3758096384: 0,
    4026531840: 33282,
    134217728: 0,
    402653184: 8421890,
    671088640: 33282,
    939524096: 32768,
    1207959552: 8421888,
    1476395008: 512,
    1744830464: 8421378,
    2013265920: 2,
    2281701376: 8389120,
    2550136832: 33280,
    2818572288: 8421376,
    3087007744: 8389122,
    3355443200: 8388610,
    3623878656: 32770,
    3892314112: 514,
    4160749568: 8388608,
    1: 32768,
    268435457: 2,
    536870913: 8421888,
    805306369: 8388608,
    1073741825: 8421378,
    1342177281: 33280,
    1610612737: 512,
    1879048193: 8389122,
    2147483649: 8421890,
    2415919105: 8421376,
    2684354561: 8388610,
    2952790017: 33282,
    3221225473: 514,
    3489660929: 8389120,
    3758096385: 32770,
    4026531841: 0,
    134217729: 8421890,
    402653185: 8421376,
    671088641: 8388608,
    939524097: 512,
    1207959553: 32768,
    1476395009: 8388610,
    1744830465: 2,
    2013265921: 33282,
    2281701377: 32770,
    2550136833: 8389122,
    2818572289: 514,
    3087007745: 8421888,
    3355443201: 8389120,
    3623878657: 0,
    3892314113: 33280,
    4160749569: 8421378
  }, {
    "0": 1074282512,
    16777216: 16384,
    33554432: 524288,
    50331648: 1074266128,
    67108864: 1073741840,
    83886080: 1074282496,
    100663296: 1073758208,
    117440512: 16,
    134217728: 540672,
    150994944: 1073758224,
    167772160: 1073741824,
    184549376: 540688,
    201326592: 524304,
    218103808: 0,
    234881024: 16400,
    251658240: 1074266112,
    8388608: 1073758208,
    25165824: 540688,
    41943040: 16,
    58720256: 1073758224,
    75497472: 1074282512,
    92274688: 1073741824,
    109051904: 524288,
    125829120: 1074266128,
    142606336: 524304,
    159383552: 0,
    176160768: 16384,
    192937984: 1074266112,
    209715200: 1073741840,
    226492416: 540672,
    243269632: 1074282496,
    260046848: 16400,
    268435456: 0,
    285212672: 1074266128,
    301989888: 1073758224,
    318767104: 1074282496,
    335544320: 1074266112,
    352321536: 16,
    369098752: 540688,
    385875968: 16384,
    402653184: 16400,
    419430400: 524288,
    436207616: 524304,
    452984832: 1073741840,
    469762048: 540672,
    486539264: 1073758208,
    503316480: 1073741824,
    520093696: 1074282512,
    276824064: 540688,
    293601280: 524288,
    310378496: 1074266112,
    327155712: 16384,
    343932928: 1073758208,
    360710144: 1074282512,
    377487360: 16,
    394264576: 1073741824,
    411041792: 1074282496,
    427819008: 1073741840,
    444596224: 1073758224,
    461373440: 524304,
    478150656: 0,
    494927872: 16400,
    511705088: 1074266128,
    528482304: 540672
  }, {
    "0": 260,
    1048576: 0,
    2097152: 67109120,
    3145728: 65796,
    4194304: 65540,
    5242880: 67108868,
    6291456: 67174660,
    7340032: 67174400,
    8388608: 67108864,
    9437184: 67174656,
    10485760: 65792,
    11534336: 67174404,
    12582912: 67109124,
    13631488: 65536,
    14680064: 4,
    15728640: 256,
    524288: 67174656,
    1572864: 67174404,
    2621440: 0,
    3670016: 67109120,
    4718592: 67108868,
    5767168: 65536,
    6815744: 65540,
    7864320: 260,
    8912896: 4,
    9961472: 256,
    11010048: 67174400,
    12058624: 65796,
    13107200: 65792,
    14155776: 67109124,
    15204352: 67174660,
    16252928: 67108864,
    16777216: 67174656,
    17825792: 65540,
    18874368: 65536,
    19922944: 67109120,
    20971520: 256,
    22020096: 67174660,
    23068672: 67108868,
    24117248: 0,
    25165824: 67109124,
    26214400: 67108864,
    27262976: 4,
    28311552: 65792,
    29360128: 67174400,
    30408704: 260,
    31457280: 65796,
    32505856: 67174404,
    17301504: 67108864,
    18350080: 260,
    19398656: 67174656,
    20447232: 0,
    21495808: 65540,
    22544384: 67109120,
    23592960: 256,
    24641536: 67174404,
    25690112: 65536,
    26738688: 67174660,
    27787264: 65796,
    28835840: 67108868,
    29884416: 67109124,
    30932992: 67174400,
    31981568: 4,
    33030144: 65792
  }, {
    "0": 2151682048,
    65536: 2147487808,
    131072: 4198464,
    196608: 2151677952,
    262144: 0,
    327680: 4198400,
    393216: 2147483712,
    458752: 4194368,
    524288: 2147483648,
    589824: 4194304,
    655360: 64,
    720896: 2147487744,
    786432: 2151678016,
    851968: 4160,
    917504: 4096,
    983040: 2151682112,
    32768: 2147487808,
    98304: 64,
    163840: 2151678016,
    229376: 2147487744,
    294912: 4198400,
    360448: 2151682112,
    425984: 0,
    491520: 2151677952,
    557056: 4096,
    622592: 2151682048,
    688128: 4194304,
    753664: 4160,
    819200: 2147483648,
    884736: 4194368,
    950272: 4198464,
    1015808: 2147483712,
    1048576: 4194368,
    1114112: 4198400,
    1179648: 2147483712,
    1245184: 0,
    1310720: 4160,
    1376256: 2151678016,
    1441792: 2151682048,
    1507328: 2147487808,
    1572864: 2151682112,
    1638400: 2147483648,
    1703936: 2151677952,
    1769472: 4198464,
    1835008: 2147487744,
    1900544: 4194304,
    1966080: 64,
    2031616: 4096,
    1081344: 2151677952,
    1146880: 2151682112,
    1212416: 0,
    1277952: 4198400,
    1343488: 4194368,
    1409024: 2147483648,
    1474560: 2147487808,
    1540096: 64,
    1605632: 2147483712,
    1671168: 4096,
    1736704: 2147487744,
    1802240: 2151678016,
    1867776: 4160,
    1933312: 2151682048,
    1998848: 4194304,
    2064384: 4198464
  }, {
    "0": 128,
    4096: 17039360,
    8192: 262144,
    12288: 536870912,
    16384: 537133184,
    20480: 16777344,
    24576: 553648256,
    28672: 262272,
    32768: 16777216,
    36864: 537133056,
    40960: 536871040,
    45056: 553910400,
    49152: 553910272,
    53248: 0,
    57344: 17039488,
    61440: 553648128,
    2048: 17039488,
    6144: 553648256,
    10240: 128,
    14336: 17039360,
    18432: 262144,
    22528: 537133184,
    26624: 553910272,
    30720: 536870912,
    34816: 537133056,
    38912: 0,
    43008: 553910400,
    47104: 16777344,
    51200: 536871040,
    55296: 553648128,
    59392: 16777216,
    63488: 262272,
    65536: 262144,
    69632: 128,
    73728: 536870912,
    77824: 553648256,
    81920: 16777344,
    86016: 553910272,
    90112: 537133184,
    94208: 16777216,
    98304: 553910400,
    102400: 553648128,
    106496: 17039360,
    110592: 537133056,
    114688: 262272,
    118784: 536871040,
    122880: 0,
    126976: 17039488,
    67584: 553648256,
    71680: 16777216,
    75776: 17039360,
    79872: 537133184,
    83968: 536870912,
    88064: 17039488,
    92160: 128,
    96256: 553910272,
    100352: 262272,
    104448: 553910400,
    108544: 0,
    112640: 553648128,
    116736: 16777344,
    120832: 262144,
    124928: 537133056,
    129024: 536871040
  }, {
    "0": 268435464,
    256: 8192,
    512: 270532608,
    768: 270540808,
    1024: 268443648,
    1280: 2097152,
    1536: 2097160,
    1792: 268435456,
    2048: 0,
    2304: 268443656,
    2560: 2105344,
    2816: 8,
    3072: 270532616,
    3328: 2105352,
    3584: 8200,
    3840: 270540800,
    128: 270532608,
    384: 270540808,
    640: 8,
    896: 2097152,
    1152: 2105352,
    1408: 268435464,
    1664: 268443648,
    1920: 8200,
    2176: 2097160,
    2432: 8192,
    2688: 268443656,
    2944: 270532616,
    3200: 0,
    3456: 270540800,
    3712: 2105344,
    3968: 268435456,
    4096: 268443648,
    4352: 270532616,
    4608: 270540808,
    4864: 8200,
    5120: 2097152,
    5376: 268435456,
    5632: 268435464,
    5888: 2105344,
    6144: 2105352,
    6400: 0,
    6656: 8,
    6912: 270532608,
    7168: 8192,
    7424: 268443656,
    7680: 270540800,
    7936: 2097160,
    4224: 8,
    4480: 2105344,
    4736: 2097152,
    4992: 268435464,
    5248: 268443648,
    5504: 8200,
    5760: 270540808,
    6016: 270532608,
    6272: 270540800,
    6528: 270532616,
    6784: 8192,
    7040: 2105352,
    7296: 2097160,
    7552: 0,
    7808: 268435456,
    8064: 268443656
  }, {
    "0": 1048576,
    16: 33555457,
    32: 1024,
    48: 1049601,
    64: 34604033,
    80: 0,
    96: 1,
    112: 34603009,
    128: 33555456,
    144: 1048577,
    160: 33554433,
    176: 34604032,
    192: 34603008,
    208: 1025,
    224: 1049600,
    240: 33554432,
    8: 34603009,
    24: 0,
    40: 33555457,
    56: 34604032,
    72: 1048576,
    88: 33554433,
    104: 33554432,
    120: 1025,
    136: 1049601,
    152: 33555456,
    168: 34603008,
    184: 1048577,
    200: 1024,
    216: 34604033,
    232: 1,
    248: 1049600,
    256: 33554432,
    272: 1048576,
    288: 33555457,
    304: 34603009,
    320: 1048577,
    336: 33555456,
    352: 34604032,
    368: 1049601,
    384: 1025,
    400: 34604033,
    416: 1049600,
    432: 1,
    448: 0,
    464: 34603008,
    480: 33554433,
    496: 1024,
    264: 1049600,
    280: 33555457,
    296: 34603009,
    312: 1,
    328: 33554432,
    344: 1048576,
    360: 1025,
    376: 34604032,
    392: 33554433,
    408: 34603008,
    424: 0,
    440: 34604033,
    456: 1049601,
    472: 1024,
    488: 33555456,
    504: 1048577
  }, {
    "0": 134219808,
    1: 131072,
    2: 134217728,
    3: 32,
    4: 131104,
    5: 134350880,
    6: 134350848,
    7: 2048,
    8: 134348800,
    9: 134219776,
    10: 133120,
    11: 134348832,
    12: 2080,
    13: 0,
    14: 134217760,
    15: 133152,
    2147483648: 2048,
    2147483649: 134350880,
    2147483650: 134219808,
    2147483651: 134217728,
    2147483652: 134348800,
    2147483653: 133120,
    2147483654: 133152,
    2147483655: 32,
    2147483656: 134217760,
    2147483657: 2080,
    2147483658: 131104,
    2147483659: 134350848,
    2147483660: 0,
    2147483661: 134348832,
    2147483662: 134219776,
    2147483663: 131072,
    16: 133152,
    17: 134350848,
    18: 32,
    19: 2048,
    20: 134219776,
    21: 134217760,
    22: 134348832,
    23: 131072,
    24: 0,
    25: 131104,
    26: 134348800,
    27: 134219808,
    28: 134350880,
    29: 133120,
    30: 2080,
    31: 134217728,
    2147483664: 131072,
    2147483665: 2048,
    2147483666: 134348832,
    2147483667: 133152,
    2147483668: 32,
    2147483669: 134348800,
    2147483670: 134217728,
    2147483671: 134219808,
    2147483672: 134350880,
    2147483673: 134217760,
    2147483674: 134219776,
    2147483675: 0,
    2147483676: 133120,
    2147483677: 2080,
    2147483678: 131104,
    2147483679: 134350848
  }], t = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679], m = g.DES = e.extend({ _doReset: function() {
    for (var b = this._key.words, c = [], a = 0; 56 > a; a++) {
      var f = q[a] - 1;
      c[a] = b[f >>> 5] >>> 31 - f % 32 & 1;
    }
    b = this._subKeys = [];
    for (f = 0; 16 > f; f++) {
      for (var d = b[f] = [], e2 = r[f], a = 0; 24 > a; a++)
        d[a / 6 | 0] |= c[(p[a] - 1 + e2) % 28] << 31 - a % 6, d[4 + (a / 6 | 0)] |= c[28 + (p[a + 24] - 1 + e2) % 28] << 31 - a % 6;
      d[0] = d[0] << 1 | d[0] >>> 31;
      for (a = 1; 7 > a; a++)
        d[a] >>>= 4 * (a - 1) + 3;
      d[7] = d[7] << 5 | d[7] >>> 27;
    }
    c = this._invSubKeys = [];
    for (a = 0; 16 > a; a++)
      c[a] = b[15 - a];
  }, encryptBlock: function(b, c) {
    this._doCryptBlock(b, c, this._subKeys);
  }, decryptBlock: function(b, c) {
    this._doCryptBlock(b, c, this._invSubKeys);
  }, _doCryptBlock: function(b, c, a) {
    this._lBlock = b[c];
    this._rBlock = b[c + 1];
    j.call(this, 4, 252645135);
    j.call(this, 16, 65535);
    l.call(this, 2, 858993459);
    l.call(this, 8, 16711935);
    j.call(this, 1, 1431655765);
    for (var f = 0; 16 > f; f++) {
      for (var d = a[f], e2 = this._lBlock, h3 = this._rBlock, g2 = 0, k = 0; 8 > k; k++)
        g2 |= s[k][((h3 ^ d[k]) & t[k]) >>> 0];
      this._lBlock = h3;
      this._rBlock = e2 ^ g2;
    }
    a = this._lBlock;
    this._lBlock = this._rBlock;
    this._rBlock = a;
    j.call(this, 1, 1431655765);
    l.call(this, 8, 16711935);
    l.call(this, 2, 858993459);
    j.call(this, 16, 65535);
    j.call(this, 4, 252645135);
    b[c] = this._lBlock;
    b[c + 1] = this._rBlock;
  }, keySize: 2, ivSize: 2, blockSize: 2 });
  h2.DES = e._createHelper(m);
  g = g.TripleDES = e.extend({ _doReset: function() {
    var b = this._key.words;
    this._des1 = m.createEncryptor(n.create(b.slice(0, 2)));
    this._des2 = m.createEncryptor(n.create(b.slice(2, 4)));
    this._des3 = m.createEncryptor(n.create(b.slice(4, 6)));
  }, encryptBlock: function(b, c) {
    this._des1.encryptBlock(b, c);
    this._des2.decryptBlock(b, c);
    this._des3.encryptBlock(b, c);
  }, decryptBlock: function(b, c) {
    this._des3.decryptBlock(b, c);
    this._des2.encryptBlock(b, c);
    this._des1.decryptBlock(b, c);
  }, keySize: 6, ivSize: 2, blockSize: 2 });
  h2.TripleDES = e._createHelper(g);
})();
(function() {
  var h2 = CryptoJS, j = h2.lib.WordArray;
  h2.enc.Base64 = { stringify: function(b) {
    var e = b.words, f = b.sigBytes, c = this._map;
    b.clamp();
    b = [];
    for (var a = 0; a < f; a += 3)
      for (var d = (e[a >>> 2] >>> 24 - 8 * (a % 4) & 255) << 16 | (e[a + 1 >>> 2] >>> 24 - 8 * ((a + 1) % 4) & 255) << 8 | e[a + 2 >>> 2] >>> 24 - 8 * ((a + 2) % 4) & 255, g = 0; 4 > g && a + 0.75 * g < f; g++)
        b.push(c.charAt(d >>> 6 * (3 - g) & 63));
    if (e = c.charAt(64))
      for (; b.length % 4; )
        b.push(e);
    return b.join("");
  }, parse: function(b) {
    var e = b.length, f = this._map, c = f.charAt(64);
    c && (c = b.indexOf(c), c != -1 && (e = c));
    for (var c = [], a = 0, d = 0; d < e; d++)
      if (d % 4) {
        var g = f.indexOf(b.charAt(d - 1)) << 2 * (d % 4), h3 = f.indexOf(b.charAt(d)) >>> 6 - 2 * (d % 4);
        c[a >>> 2] |= (g | h3) << 24 - 8 * (a % 4);
        a++;
      }
    return j.create(c, a);
  }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" };
})();
(function(E) {
  function h2(a2, f, g, j, p, h3, k2) {
    a2 = a2 + (f & g | ~f & j) + p + k2;
    return (a2 << h3 | a2 >>> 32 - h3) + f;
  }
  function k(a2, f, g, j, p, h3, k2) {
    a2 = a2 + (f & j | g & ~j) + p + k2;
    return (a2 << h3 | a2 >>> 32 - h3) + f;
  }
  function l(a2, f, g, j, h3, k2, l2) {
    a2 = a2 + (f ^ g ^ j) + h3 + l2;
    return (a2 << k2 | a2 >>> 32 - k2) + f;
  }
  function n(a2, f, g, j, h3, k2, l2) {
    a2 = a2 + (g ^ (f | ~j)) + h3 + l2;
    return (a2 << k2 | a2 >>> 32 - k2) + f;
  }
  for (var r = CryptoJS, q = r.lib, F = q.WordArray, s = q.Hasher, q = r.algo, a = [], t = 0; 64 > t; t++)
    a[t] = 4294967296 * E.abs(E.sin(t + 1)) | 0;
  q = q.MD5 = s.extend({
    _doReset: function() {
      this._hash = new F.init([1732584193, 4023233417, 2562383102, 271733878]);
    },
    _doProcessBlock: function(m, f) {
      for (var g = 0; 16 > g; g++) {
        var j = f + g, p = m[j];
        m[j] = (p << 8 | p >>> 24) & 16711935 | (p << 24 | p >>> 8) & 4278255360;
      }
      var g = this._hash.words, j = m[f + 0], p = m[f + 1], q2 = m[f + 2], r2 = m[f + 3], s2 = m[f + 4], t2 = m[f + 5], u = m[f + 6], v = m[f + 7], w = m[f + 8], x = m[f + 9], y = m[f + 10], z = m[f + 11], A = m[f + 12], B = m[f + 13], C = m[f + 14], D = m[f + 15], b = g[0], c = g[1], d = g[2], e = g[3], b = h2(b, c, d, e, j, 7, a[0]), e = h2(e, b, c, d, p, 12, a[1]), d = h2(d, e, b, c, q2, 17, a[2]), c = h2(c, d, e, b, r2, 22, a[3]), b = h2(b, c, d, e, s2, 7, a[4]), e = h2(e, b, c, d, t2, 12, a[5]), d = h2(d, e, b, c, u, 17, a[6]), c = h2(c, d, e, b, v, 22, a[7]), b = h2(b, c, d, e, w, 7, a[8]), e = h2(e, b, c, d, x, 12, a[9]), d = h2(d, e, b, c, y, 17, a[10]), c = h2(c, d, e, b, z, 22, a[11]), b = h2(b, c, d, e, A, 7, a[12]), e = h2(e, b, c, d, B, 12, a[13]), d = h2(d, e, b, c, C, 17, a[14]), c = h2(c, d, e, b, D, 22, a[15]), b = k(b, c, d, e, p, 5, a[16]), e = k(e, b, c, d, u, 9, a[17]), d = k(d, e, b, c, z, 14, a[18]), c = k(c, d, e, b, j, 20, a[19]), b = k(b, c, d, e, t2, 5, a[20]), e = k(e, b, c, d, y, 9, a[21]), d = k(d, e, b, c, D, 14, a[22]), c = k(c, d, e, b, s2, 20, a[23]), b = k(b, c, d, e, x, 5, a[24]), e = k(e, b, c, d, C, 9, a[25]), d = k(d, e, b, c, r2, 14, a[26]), c = k(c, d, e, b, w, 20, a[27]), b = k(b, c, d, e, B, 5, a[28]), e = k(e, b, c, d, q2, 9, a[29]), d = k(d, e, b, c, v, 14, a[30]), c = k(c, d, e, b, A, 20, a[31]), b = l(b, c, d, e, t2, 4, a[32]), e = l(e, b, c, d, w, 11, a[33]), d = l(d, e, b, c, z, 16, a[34]), c = l(c, d, e, b, C, 23, a[35]), b = l(b, c, d, e, p, 4, a[36]), e = l(e, b, c, d, s2, 11, a[37]), d = l(d, e, b, c, v, 16, a[38]), c = l(c, d, e, b, y, 23, a[39]), b = l(b, c, d, e, B, 4, a[40]), e = l(e, b, c, d, j, 11, a[41]), d = l(d, e, b, c, r2, 16, a[42]), c = l(c, d, e, b, u, 23, a[43]), b = l(b, c, d, e, x, 4, a[44]), e = l(e, b, c, d, A, 11, a[45]), d = l(d, e, b, c, D, 16, a[46]), c = l(c, d, e, b, q2, 23, a[47]), b = n(b, c, d, e, j, 6, a[48]), e = n(e, b, c, d, v, 10, a[49]), d = n(d, e, b, c, C, 15, a[50]), c = n(c, d, e, b, t2, 21, a[51]), b = n(b, c, d, e, A, 6, a[52]), e = n(e, b, c, d, r2, 10, a[53]), d = n(d, e, b, c, y, 15, a[54]), c = n(c, d, e, b, p, 21, a[55]), b = n(b, c, d, e, w, 6, a[56]), e = n(e, b, c, d, D, 10, a[57]), d = n(d, e, b, c, u, 15, a[58]), c = n(c, d, e, b, B, 21, a[59]), b = n(b, c, d, e, s2, 6, a[60]), e = n(e, b, c, d, z, 10, a[61]), d = n(d, e, b, c, q2, 15, a[62]), c = n(c, d, e, b, x, 21, a[63]);
      g[0] = g[0] + b | 0;
      g[1] = g[1] + c | 0;
      g[2] = g[2] + d | 0;
      g[3] = g[3] + e | 0;
    },
    _doFinalize: function() {
      var a2 = this._data, f = a2.words, g = 8 * this._nDataBytes, j = 8 * a2.sigBytes;
      f[j >>> 5] |= 128 << 24 - j % 32;
      var h3 = E.floor(g / 4294967296);
      f[(j + 64 >>> 9 << 4) + 15] = (h3 << 8 | h3 >>> 24) & 16711935 | (h3 << 24 | h3 >>> 8) & 4278255360;
      f[(j + 64 >>> 9 << 4) + 14] = (g << 8 | g >>> 24) & 16711935 | (g << 24 | g >>> 8) & 4278255360;
      a2.sigBytes = 4 * (f.length + 1);
      this._process();
      a2 = this._hash;
      f = a2.words;
      for (g = 0; 4 > g; g++)
        j = f[g], f[g] = (j << 8 | j >>> 24) & 16711935 | (j << 24 | j >>> 8) & 4278255360;
      return a2;
    },
    clone: function() {
      var a2 = s.clone.call(this);
      a2._hash = this._hash.clone();
      return a2;
    }
  });
  r.MD5 = s._createHelper(q);
  r.HmacMD5 = s._createHmacHelper(q);
})(Math);
(function() {
  var k = CryptoJS, b = k.lib, m = b.WordArray, l = b.Hasher, d = [], b = k.algo.SHA1 = l.extend({ _doReset: function() {
    this._hash = new m.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520]);
  }, _doProcessBlock: function(n, p) {
    for (var a = this._hash.words, e = a[0], f = a[1], h2 = a[2], j = a[3], b2 = a[4], c = 0; 80 > c; c++) {
      if (16 > c)
        d[c] = n[p + c] | 0;
      else {
        var g = d[c - 3] ^ d[c - 8] ^ d[c - 14] ^ d[c - 16];
        d[c] = g << 1 | g >>> 31;
      }
      g = (e << 5 | e >>> 27) + b2 + d[c];
      g = 20 > c ? g + ((f & h2 | ~f & j) + 1518500249) : 40 > c ? g + ((f ^ h2 ^ j) + 1859775393) : 60 > c ? g + ((f & h2 | f & j | h2 & j) - 1894007588) : g + ((f ^ h2 ^ j) - 899497514);
      b2 = j;
      j = h2;
      h2 = f << 30 | f >>> 2;
      f = e;
      e = g;
    }
    a[0] = a[0] + e | 0;
    a[1] = a[1] + f | 0;
    a[2] = a[2] + h2 | 0;
    a[3] = a[3] + j | 0;
    a[4] = a[4] + b2 | 0;
  }, _doFinalize: function() {
    var b2 = this._data, d2 = b2.words, a = 8 * this._nDataBytes, e = 8 * b2.sigBytes;
    d2[e >>> 5] |= 128 << 24 - e % 32;
    d2[(e + 64 >>> 9 << 4) + 14] = Math.floor(a / 4294967296);
    d2[(e + 64 >>> 9 << 4) + 15] = a;
    b2.sigBytes = 4 * d2.length;
    this._process();
    return this._hash;
  }, clone: function() {
    var b2 = l.clone.call(this);
    b2._hash = this._hash.clone();
    return b2;
  } });
  k.SHA1 = l._createHelper(b);
  k.HmacSHA1 = l._createHmacHelper(b);
})();
(function(k) {
  for (var g = CryptoJS, h2 = g.lib, v = h2.WordArray, j = h2.Hasher, h2 = g.algo, s = [], t = [], u = function(q) {
    return 4294967296 * (q - (q | 0)) | 0;
  }, l = 2, b = 0; 64 > b; ) {
    var d;
    a: {
      d = l;
      for (var w = k.sqrt(d), r = 2; r <= w; r++)
        if (!(d % r)) {
          d = false;
          break a;
        }
      d = true;
    }
    d && (8 > b && (s[b] = u(k.pow(l, 0.5))), t[b] = u(k.pow(l, 1 / 3)), b++);
    l++;
  }
  var n = [], h2 = h2.SHA256 = j.extend({ _doReset: function() {
    this._hash = new v.init(s.slice(0));
  }, _doProcessBlock: function(q, h3) {
    for (var a = this._hash.words, c = a[0], d2 = a[1], b2 = a[2], k2 = a[3], f = a[4], g2 = a[5], j2 = a[6], l2 = a[7], e = 0; 64 > e; e++) {
      if (16 > e)
        n[e] = q[h3 + e] | 0;
      else {
        var m = n[e - 15], p = n[e - 2];
        n[e] = ((m << 25 | m >>> 7) ^ (m << 14 | m >>> 18) ^ m >>> 3) + n[e - 7] + ((p << 15 | p >>> 17) ^ (p << 13 | p >>> 19) ^ p >>> 10) + n[e - 16];
      }
      m = l2 + ((f << 26 | f >>> 6) ^ (f << 21 | f >>> 11) ^ (f << 7 | f >>> 25)) + (f & g2 ^ ~f & j2) + t[e] + n[e];
      p = ((c << 30 | c >>> 2) ^ (c << 19 | c >>> 13) ^ (c << 10 | c >>> 22)) + (c & d2 ^ c & b2 ^ d2 & b2);
      l2 = j2;
      j2 = g2;
      g2 = f;
      f = k2 + m | 0;
      k2 = b2;
      b2 = d2;
      d2 = c;
      c = m + p | 0;
    }
    a[0] = a[0] + c | 0;
    a[1] = a[1] + d2 | 0;
    a[2] = a[2] + b2 | 0;
    a[3] = a[3] + k2 | 0;
    a[4] = a[4] + f | 0;
    a[5] = a[5] + g2 | 0;
    a[6] = a[6] + j2 | 0;
    a[7] = a[7] + l2 | 0;
  }, _doFinalize: function() {
    var d2 = this._data, b2 = d2.words, a = 8 * this._nDataBytes, c = 8 * d2.sigBytes;
    b2[c >>> 5] |= 128 << 24 - c % 32;
    b2[(c + 64 >>> 9 << 4) + 14] = k.floor(a / 4294967296);
    b2[(c + 64 >>> 9 << 4) + 15] = a;
    d2.sigBytes = 4 * b2.length;
    this._process();
    return this._hash;
  }, clone: function() {
    var b2 = j.clone.call(this);
    b2._hash = this._hash.clone();
    return b2;
  } });
  g.SHA256 = j._createHelper(h2);
  g.HmacSHA256 = j._createHmacHelper(h2);
})(Math);
(function() {
  var b = CryptoJS, d = b.lib.WordArray, a = b.algo, c = a.SHA256, a = a.SHA224 = c.extend({ _doReset: function() {
    this._hash = new d.init([3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428]);
  }, _doFinalize: function() {
    var a2 = c._doFinalize.call(this);
    a2.sigBytes -= 4;
    return a2;
  } });
  b.SHA224 = c._createHelper(a);
  b.HmacSHA224 = c._createHmacHelper(a);
})();
(function() {
  function a() {
    return d.create.apply(d, arguments);
  }
  for (var n = CryptoJS, r = n.lib.Hasher, e = n.x64, d = e.Word, T = e.WordArray, e = n.algo, ea = [
    a(1116352408, 3609767458),
    a(1899447441, 602891725),
    a(3049323471, 3964484399),
    a(3921009573, 2173295548),
    a(961987163, 4081628472),
    a(1508970993, 3053834265),
    a(2453635748, 2937671579),
    a(2870763221, 3664609560),
    a(3624381080, 2734883394),
    a(310598401, 1164996542),
    a(607225278, 1323610764),
    a(1426881987, 3590304994),
    a(1925078388, 4068182383),
    a(2162078206, 991336113),
    a(2614888103, 633803317),
    a(3248222580, 3479774868),
    a(3835390401, 2666613458),
    a(4022224774, 944711139),
    a(264347078, 2341262773),
    a(604807628, 2007800933),
    a(770255983, 1495990901),
    a(1249150122, 1856431235),
    a(1555081692, 3175218132),
    a(1996064986, 2198950837),
    a(2554220882, 3999719339),
    a(2821834349, 766784016),
    a(2952996808, 2566594879),
    a(3210313671, 3203337956),
    a(3336571891, 1034457026),
    a(3584528711, 2466948901),
    a(113926993, 3758326383),
    a(338241895, 168717936),
    a(666307205, 1188179964),
    a(773529912, 1546045734),
    a(1294757372, 1522805485),
    a(1396182291, 2643833823),
    a(1695183700, 2343527390),
    a(1986661051, 1014477480),
    a(2177026350, 1206759142),
    a(2456956037, 344077627),
    a(2730485921, 1290863460),
    a(2820302411, 3158454273),
    a(3259730800, 3505952657),
    a(3345764771, 106217008),
    a(3516065817, 3606008344),
    a(3600352804, 1432725776),
    a(4094571909, 1467031594),
    a(275423344, 851169720),
    a(430227734, 3100823752),
    a(506948616, 1363258195),
    a(659060556, 3750685593),
    a(883997877, 3785050280),
    a(958139571, 3318307427),
    a(1322822218, 3812723403),
    a(1537002063, 2003034995),
    a(1747873779, 3602036899),
    a(1955562222, 1575990012),
    a(2024104815, 1125592928),
    a(2227730452, 2716904306),
    a(2361852424, 442776044),
    a(2428436474, 593698344),
    a(2756734187, 3733110249),
    a(3204031479, 2999351573),
    a(3329325298, 3815920427),
    a(3391569614, 3928383900),
    a(3515267271, 566280711),
    a(3940187606, 3454069534),
    a(4118630271, 4000239992),
    a(116418474, 1914138554),
    a(174292421, 2731055270),
    a(289380356, 3203993006),
    a(460393269, 320620315),
    a(685471733, 587496836),
    a(852142971, 1086792851),
    a(1017036298, 365543100),
    a(1126000580, 2618297676),
    a(1288033470, 3409855158),
    a(1501505948, 4234509866),
    a(1607167915, 987167468),
    a(1816402316, 1246189591)
  ], v = [], w = 0; 80 > w; w++)
    v[w] = a();
  e = e.SHA512 = r.extend({ _doReset: function() {
    this._hash = new T.init([new d.init(1779033703, 4089235720), new d.init(3144134277, 2227873595), new d.init(1013904242, 4271175723), new d.init(2773480762, 1595750129), new d.init(1359893119, 2917565137), new d.init(2600822924, 725511199), new d.init(528734635, 4215389547), new d.init(1541459225, 327033209)]);
  }, _doProcessBlock: function(a2, d2) {
    for (var f = this._hash.words, F = f[0], e2 = f[1], n2 = f[2], r2 = f[3], G = f[4], H = f[5], I = f[6], f = f[7], w2 = F.high, J = F.low, X = e2.high, K = e2.low, Y = n2.high, L = n2.low, Z = r2.high, M = r2.low, $ = G.high, N = G.low, aa = H.high, O = H.low, ba = I.high, P = I.low, ca = f.high, Q = f.low, k = w2, g = J, z = X, x = K, A = Y, y = L, U = Z, B = M, l = $, h2 = N, R = aa, C = O, S = ba, D = P, V = ca, E = Q, m = 0; 80 > m; m++) {
      var s = v[m];
      if (16 > m)
        var j = s.high = a2[d2 + 2 * m] | 0, b = s.low = a2[d2 + 2 * m + 1] | 0;
      else {
        var j = v[m - 15], b = j.high, p = j.low, j = (b >>> 1 | p << 31) ^ (b >>> 8 | p << 24) ^ b >>> 7, p = (p >>> 1 | b << 31) ^ (p >>> 8 | b << 24) ^ (p >>> 7 | b << 25), u = v[m - 2], b = u.high, c = u.low, u = (b >>> 19 | c << 13) ^ (b << 3 | c >>> 29) ^ b >>> 6, c = (c >>> 19 | b << 13) ^ (c << 3 | b >>> 29) ^ (c >>> 6 | b << 26), b = v[m - 7], W = b.high, t = v[m - 16], q = t.high, t = t.low, b = p + b.low, j = j + W + (b >>> 0 < p >>> 0 ? 1 : 0), b = b + c, j = j + u + (b >>> 0 < c >>> 0 ? 1 : 0), b = b + t, j = j + q + (b >>> 0 < t >>> 0 ? 1 : 0);
        s.high = j;
        s.low = b;
      }
      var W = l & R ^ ~l & S, t = h2 & C ^ ~h2 & D, s = k & z ^ k & A ^ z & A, T2 = g & x ^ g & y ^ x & y, p = (k >>> 28 | g << 4) ^ (k << 30 | g >>> 2) ^ (k << 25 | g >>> 7), u = (g >>> 28 | k << 4) ^ (g << 30 | k >>> 2) ^ (g << 25 | k >>> 7), c = ea[m], fa = c.high, da = c.low, c = E + ((h2 >>> 14 | l << 18) ^ (h2 >>> 18 | l << 14) ^ (h2 << 23 | l >>> 9)), q = V + ((l >>> 14 | h2 << 18) ^ (l >>> 18 | h2 << 14) ^ (l << 23 | h2 >>> 9)) + (c >>> 0 < E >>> 0 ? 1 : 0), c = c + t, q = q + W + (c >>> 0 < t >>> 0 ? 1 : 0), c = c + da, q = q + fa + (c >>> 0 < da >>> 0 ? 1 : 0), c = c + b, q = q + j + (c >>> 0 < b >>> 0 ? 1 : 0), b = u + T2, s = p + s + (b >>> 0 < u >>> 0 ? 1 : 0), V = S, E = D, S = R, D = C, R = l, C = h2, h2 = B + c | 0, l = U + q + (h2 >>> 0 < B >>> 0 ? 1 : 0) | 0, U = A, B = y, A = z, y = x, z = k, x = g, g = c + b | 0, k = q + s + (g >>> 0 < c >>> 0 ? 1 : 0) | 0;
    }
    J = F.low = J + g;
    F.high = w2 + k + (J >>> 0 < g >>> 0 ? 1 : 0);
    K = e2.low = K + x;
    e2.high = X + z + (K >>> 0 < x >>> 0 ? 1 : 0);
    L = n2.low = L + y;
    n2.high = Y + A + (L >>> 0 < y >>> 0 ? 1 : 0);
    M = r2.low = M + B;
    r2.high = Z + U + (M >>> 0 < B >>> 0 ? 1 : 0);
    N = G.low = N + h2;
    G.high = $ + l + (N >>> 0 < h2 >>> 0 ? 1 : 0);
    O = H.low = O + C;
    H.high = aa + R + (O >>> 0 < C >>> 0 ? 1 : 0);
    P = I.low = P + D;
    I.high = ba + S + (P >>> 0 < D >>> 0 ? 1 : 0);
    Q = f.low = Q + E;
    f.high = ca + V + (Q >>> 0 < E >>> 0 ? 1 : 0);
  }, _doFinalize: function() {
    var a2 = this._data, d2 = a2.words, f = 8 * this._nDataBytes, e2 = 8 * a2.sigBytes;
    d2[e2 >>> 5] |= 128 << 24 - e2 % 32;
    d2[(e2 + 128 >>> 10 << 5) + 30] = Math.floor(f / 4294967296);
    d2[(e2 + 128 >>> 10 << 5) + 31] = f;
    a2.sigBytes = 4 * d2.length;
    this._process();
    return this._hash.toX32();
  }, clone: function() {
    var a2 = r.clone.call(this);
    a2._hash = this._hash.clone();
    return a2;
  }, blockSize: 32 });
  n.SHA512 = r._createHelper(e);
  n.HmacSHA512 = r._createHmacHelper(e);
})();
(function() {
  var c = CryptoJS, a = c.x64, b = a.Word, e = a.WordArray, a = c.algo, d = a.SHA512, a = a.SHA384 = d.extend({ _doReset: function() {
    this._hash = new e.init([new b.init(3418070365, 3238371032), new b.init(1654270250, 914150663), new b.init(2438529370, 812702999), new b.init(355462360, 4144912697), new b.init(1731405415, 4290775857), new b.init(2394180231, 1750603025), new b.init(3675008525, 1694076839), new b.init(1203062813, 3204075428)]);
  }, _doFinalize: function() {
    var a2 = d._doFinalize.call(this);
    a2.sigBytes -= 16;
    return a2;
  } });
  c.SHA384 = d._createHelper(a);
  c.HmacSHA384 = d._createHmacHelper(a);
})();
(function() {
  var q = CryptoJS, d = q.lib, n = d.WordArray, p = d.Hasher, d = q.algo, x = n.create([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]), y = n.create([5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]), z = n.create([
    11,
    14,
    15,
    12,
    5,
    8,
    7,
    9,
    11,
    13,
    14,
    15,
    6,
    7,
    9,
    8,
    7,
    6,
    8,
    13,
    11,
    9,
    7,
    15,
    7,
    12,
    15,
    9,
    11,
    7,
    13,
    12,
    11,
    13,
    6,
    7,
    14,
    9,
    13,
    15,
    14,
    8,
    13,
    6,
    5,
    12,
    7,
    5,
    11,
    12,
    14,
    15,
    14,
    15,
    9,
    8,
    9,
    14,
    5,
    6,
    8,
    6,
    5,
    12,
    9,
    15,
    5,
    11,
    6,
    8,
    13,
    12,
    5,
    12,
    13,
    14,
    11,
    8,
    5,
    6
  ]), A = n.create([8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]), B = n.create([0, 1518500249, 1859775393, 2400959708, 2840853838]), C = n.create([
    1352829926,
    1548603684,
    1836072691,
    2053994217,
    0
  ]), d = d.RIPEMD160 = p.extend({ _doReset: function() {
    this._hash = n.create([1732584193, 4023233417, 2562383102, 271733878, 3285377520]);
  }, _doProcessBlock: function(e, v) {
    for (var b = 0; 16 > b; b++) {
      var c = v + b, f = e[c];
      e[c] = (f << 8 | f >>> 24) & 16711935 | (f << 24 | f >>> 8) & 4278255360;
    }
    var c = this._hash.words, f = B.words, d2 = C.words, n2 = x.words, q2 = y.words, p2 = z.words, w = A.words, t, g, h2, j, r, u, k, l, m, s;
    u = t = c[0];
    k = g = c[1];
    l = h2 = c[2];
    m = j = c[3];
    s = r = c[4];
    for (var a, b = 0; 80 > b; b += 1)
      a = t + e[v + n2[b]] | 0, a = 16 > b ? a + ((g ^ h2 ^ j) + f[0]) : 32 > b ? a + ((g & h2 | ~g & j) + f[1]) : 48 > b ? a + (((g | ~h2) ^ j) + f[2]) : 64 > b ? a + ((g & j | h2 & ~j) + f[3]) : a + ((g ^ (h2 | ~j)) + f[4]), a |= 0, a = a << p2[b] | a >>> 32 - p2[b], a = a + r | 0, t = r, r = j, j = h2 << 10 | h2 >>> 22, h2 = g, g = a, a = u + e[v + q2[b]] | 0, a = 16 > b ? a + ((k ^ (l | ~m)) + d2[0]) : 32 > b ? a + ((k & m | l & ~m) + d2[1]) : 48 > b ? a + (((k | ~l) ^ m) + d2[2]) : 64 > b ? a + ((k & l | ~k & m) + d2[3]) : a + ((k ^ l ^ m) + d2[4]), a |= 0, a = a << w[b] | a >>> 32 - w[b], a = a + s | 0, u = s, s = m, m = l << 10 | l >>> 22, l = k, k = a;
    a = c[1] + h2 + m | 0;
    c[1] = c[2] + j + s | 0;
    c[2] = c[3] + r + u | 0;
    c[3] = c[4] + t + k | 0;
    c[4] = c[0] + g + l | 0;
    c[0] = a;
  }, _doFinalize: function() {
    var e = this._data, d2 = e.words, b = 8 * this._nDataBytes, c = 8 * e.sigBytes;
    d2[c >>> 5] |= 128 << 24 - c % 32;
    d2[(c + 64 >>> 9 << 4) + 14] = (b << 8 | b >>> 24) & 16711935 | (b << 24 | b >>> 8) & 4278255360;
    e.sigBytes = 4 * (d2.length + 1);
    this._process();
    e = this._hash;
    d2 = e.words;
    for (b = 0; 5 > b; b++)
      c = d2[b], d2[b] = (c << 8 | c >>> 24) & 16711935 | (c << 24 | c >>> 8) & 4278255360;
    return e;
  }, clone: function() {
    var d2 = p.clone.call(this);
    d2._hash = this._hash.clone();
    return d2;
  } });
  q.RIPEMD160 = p._createHelper(d);
  q.HmacRIPEMD160 = p._createHmacHelper(d);
})();
(function() {
  var c = CryptoJS, k = c.enc.Utf8;
  c.algo.HMAC = c.lib.Base.extend({ init: function(a, b) {
    a = this._hasher = new a.init();
    typeof b == "string" && (b = k.parse(b));
    var c2 = a.blockSize, e = 4 * c2;
    b.sigBytes > e && (b = a.finalize(b));
    b.clamp();
    for (var f = this._oKey = b.clone(), g = this._iKey = b.clone(), h2 = f.words, j = g.words, d = 0; d < c2; d++)
      h2[d] ^= 1549556828, j[d] ^= 909522486;
    f.sigBytes = g.sigBytes = e;
    this.reset();
  }, reset: function() {
    var a = this._hasher;
    a.reset();
    a.update(this._iKey);
  }, update: function(a) {
    this._hasher.update(a);
    return this;
  }, finalize: function(a) {
    var b = this._hasher;
    a = b.finalize(a);
    b.reset();
    return b.finalize(this._oKey.clone().concat(a));
  } });
})();
(function() {
  var b = CryptoJS, a = b.lib, d = a.Base, m = a.WordArray, a = b.algo, q = a.HMAC, l = a.PBKDF2 = d.extend({ cfg: d.extend({ keySize: 4, hasher: a.SHA1, iterations: 1 }), init: function(a2) {
    this.cfg = this.cfg.extend(a2);
  }, compute: function(a2, b2) {
    for (var c = this.cfg, f = q.create(c.hasher, a2), g = m.create(), d2 = m.create([1]), l2 = g.words, r = d2.words, n = c.keySize, c = c.iterations; l2.length < n; ) {
      var h2 = f.update(b2).finalize(d2);
      f.reset();
      for (var j = h2.words, s = j.length, k = h2, p = 1; p < c; p++) {
        k = f.finalize(k);
        f.reset();
        for (var t = k.words, e = 0; e < s; e++)
          j[e] ^= t[e];
      }
      g.concat(h2);
      r[0]++;
    }
    g.sigBytes = 4 * n;
    return g;
  } });
  b.PBKDF2 = function(a2, b2, c) {
    return l.create(c).compute(a2, b2);
  };
})();
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var b64pad = "=";
function hex2b64(d) {
  var b;
  var e;
  var a = "";
  for (b = 0; b + 3 <= d.length; b += 3) {
    e = parseInt(d.substring(b, b + 3), 16);
    a += b64map.charAt(e >> 6) + b64map.charAt(e & 63);
  }
  if (b + 1 == d.length) {
    e = parseInt(d.substring(b, b + 1), 16);
    a += b64map.charAt(e << 2);
  } else {
    if (b + 2 == d.length) {
      e = parseInt(d.substring(b, b + 2), 16);
      a += b64map.charAt(e >> 2) + b64map.charAt((e & 3) << 4);
    }
  }
  {
    while ((a.length & 3) > 0) {
      a += b64pad;
    }
  }
  return a;
}
function b64tohex(f) {
  var d = "";
  var e;
  var b = 0;
  var c;
  var a;
  for (e = 0; e < f.length; ++e) {
    if (f.charAt(e) == b64pad) {
      break;
    }
    a = b64map.indexOf(f.charAt(e));
    if (a < 0) {
      continue;
    }
    if (b == 0) {
      d += int2char(a >> 2);
      c = a & 3;
      b = 1;
    } else {
      if (b == 1) {
        d += int2char(c << 2 | a >> 4);
        c = a & 15;
        b = 2;
      } else {
        if (b == 2) {
          d += int2char(c);
          d += int2char(a >> 2);
          c = a & 3;
          b = 3;
        } else {
          d += int2char(c << 2 | a >> 4);
          d += int2char(a & 15);
          b = 0;
        }
      }
    }
  }
  if (b == 1) {
    d += int2char(c << 2);
  }
  return d;
}
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
*/
var dbits;
function BigInteger(e, d, f) {
  if (e != null) {
    if (typeof e == "number") {
      this.fromNumber(e, d, f);
    } else {
      if (d == null && typeof e != "string") {
        this.fromString(e, 256);
      } else {
        this.fromString(e, d);
      }
    }
  }
}
function nbi() {
  return new BigInteger(null);
}
function am1(f, a, b, e, h2, g) {
  while (--g >= 0) {
    var d = a * this[f++] + b[e] + h2;
    h2 = Math.floor(d / 67108864);
    b[e++] = d & 67108863;
  }
  return h2;
}
{
  {
    BigInteger.prototype.am = am1;
    dbits = 26;
  }
}
BigInteger.prototype.DB = dbits;
BigInteger.prototype.DM = (1 << dbits) - 1;
BigInteger.prototype.DV = 1 << dbits;
var BI_FP = 52;
BigInteger.prototype.FV = Math.pow(2, BI_FP);
BigInteger.prototype.F1 = BI_FP - dbits;
BigInteger.prototype.F2 = 2 * dbits - BI_FP;
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
var BI_RC = new Array();
var rr, vv;
rr = "0".charCodeAt(0);
for (vv = 0; vv <= 9; ++vv) {
  BI_RC[rr++] = vv;
}
rr = "a".charCodeAt(0);
for (vv = 10; vv < 36; ++vv) {
  BI_RC[rr++] = vv;
}
rr = "A".charCodeAt(0);
for (vv = 10; vv < 36; ++vv) {
  BI_RC[rr++] = vv;
}
function int2char(a) {
  return BI_RM.charAt(a);
}
function intAt(b, a) {
  var d = BI_RC[b.charCodeAt(a)];
  return d == null ? -1 : d;
}
function bnpCopyTo(b) {
  for (var a = this.t - 1; a >= 0; --a) {
    b[a] = this[a];
  }
  b.t = this.t;
  b.s = this.s;
}
function bnpFromInt(a) {
  this.t = 1;
  this.s = a < 0 ? -1 : 0;
  if (a > 0) {
    this[0] = a;
  } else {
    if (a < -1) {
      this[0] = a + this.DV;
    } else {
      this.t = 0;
    }
  }
}
function nbv(a) {
  var b = nbi();
  b.fromInt(a);
  return b;
}
function bnpFromString(h2, c) {
  var e;
  if (c == 16) {
    e = 4;
  } else {
    if (c == 8) {
      e = 3;
    } else {
      if (c == 256) {
        e = 8;
      } else {
        if (c == 2) {
          e = 1;
        } else {
          if (c == 32) {
            e = 5;
          } else {
            if (c == 4) {
              e = 2;
            } else {
              this.fromRadix(h2, c);
              return;
            }
          }
        }
      }
    }
  }
  this.t = 0;
  this.s = 0;
  var g = h2.length, d = false, f = 0;
  while (--g >= 0) {
    var a = e == 8 ? h2[g] & 255 : intAt(h2, g);
    if (a < 0) {
      if (h2.charAt(g) == "-") {
        d = true;
      }
      continue;
    }
    d = false;
    if (f == 0) {
      this[this.t++] = a;
    } else {
      if (f + e > this.DB) {
        this[this.t - 1] |= (a & (1 << this.DB - f) - 1) << f;
        this[this.t++] = a >> this.DB - f;
      } else {
        this[this.t - 1] |= a << f;
      }
    }
    f += e;
    if (f >= this.DB) {
      f -= this.DB;
    }
  }
  if (e == 8 && (h2[0] & 128) != 0) {
    this.s = -1;
    if (f > 0) {
      this[this.t - 1] |= (1 << this.DB - f) - 1 << f;
    }
  }
  this.clamp();
  if (d) {
    BigInteger.ZERO.subTo(this, this);
  }
}
function bnpClamp() {
  var a = this.s & this.DM;
  while (this.t > 0 && this[this.t - 1] == a) {
    --this.t;
  }
}
function bnToString(c) {
  if (this.s < 0) {
    return "-" + this.negate().toString(c);
  }
  var e;
  if (c == 16) {
    e = 4;
  } else {
    if (c == 8) {
      e = 3;
    } else {
      if (c == 2) {
        e = 1;
      } else {
        if (c == 32) {
          e = 5;
        } else {
          if (c == 4) {
            e = 2;
          } else {
            return this.toRadix(c);
          }
        }
      }
    }
  }
  var g = (1 << e) - 1, l, a = false, h2 = "", f = this.t;
  var j = this.DB - f * this.DB % e;
  if (f-- > 0) {
    if (j < this.DB && (l = this[f] >> j) > 0) {
      a = true;
      h2 = int2char(l);
    }
    while (f >= 0) {
      if (j < e) {
        l = (this[f] & (1 << j) - 1) << e - j;
        l |= this[--f] >> (j += this.DB - e);
      } else {
        l = this[f] >> (j -= e) & g;
        if (j <= 0) {
          j += this.DB;
          --f;
        }
      }
      if (l > 0) {
        a = true;
      }
      if (a) {
        h2 += int2char(l);
      }
    }
  }
  return a ? h2 : "0";
}
function bnNegate() {
  var a = nbi();
  BigInteger.ZERO.subTo(this, a);
  return a;
}
function bnAbs() {
  return this.s < 0 ? this.negate() : this;
}
function bnCompareTo(b) {
  var d = this.s - b.s;
  if (d != 0) {
    return d;
  }
  var c = this.t;
  d = c - b.t;
  if (d != 0) {
    return this.s < 0 ? -d : d;
  }
  while (--c >= 0) {
    if ((d = this[c] - b[c]) != 0) {
      return d;
    }
  }
  return 0;
}
function nbits(a) {
  var c = 1, b;
  if ((b = a >>> 16) != 0) {
    a = b;
    c += 16;
  }
  if ((b = a >> 8) != 0) {
    a = b;
    c += 8;
  }
  if ((b = a >> 4) != 0) {
    a = b;
    c += 4;
  }
  if ((b = a >> 2) != 0) {
    a = b;
    c += 2;
  }
  if ((b = a >> 1) != 0) {
    a = b;
    c += 1;
  }
  return c;
}
function bnBitLength() {
  if (this.t <= 0) {
    return 0;
  }
  return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ this.s & this.DM);
}
function bnpDLShiftTo(c, b) {
  var a;
  for (a = this.t - 1; a >= 0; --a) {
    b[a + c] = this[a];
  }
  for (a = c - 1; a >= 0; --a) {
    b[a] = 0;
  }
  b.t = this.t + c;
  b.s = this.s;
}
function bnpDRShiftTo(c, b) {
  for (var a = c; a < this.t; ++a) {
    b[a - c] = this[a];
  }
  b.t = Math.max(this.t - c, 0);
  b.s = this.s;
}
function bnpLShiftTo(j, e) {
  var b = j % this.DB;
  var a = this.DB - b;
  var g = (1 << a) - 1;
  var f = Math.floor(j / this.DB), h2 = this.s << b & this.DM, d;
  for (d = this.t - 1; d >= 0; --d) {
    e[d + f + 1] = this[d] >> a | h2;
    h2 = (this[d] & g) << b;
  }
  for (d = f - 1; d >= 0; --d) {
    e[d] = 0;
  }
  e[f] = h2;
  e.t = this.t + f + 1;
  e.s = this.s;
  e.clamp();
}
function bnpRShiftTo(g, d) {
  d.s = this.s;
  var e = Math.floor(g / this.DB);
  if (e >= this.t) {
    d.t = 0;
    return;
  }
  var b = g % this.DB;
  var a = this.DB - b;
  var f = (1 << b) - 1;
  d[0] = this[e] >> b;
  for (var c = e + 1; c < this.t; ++c) {
    d[c - e - 1] |= (this[c] & f) << a;
    d[c - e] = this[c] >> b;
  }
  if (b > 0) {
    d[this.t - e - 1] |= (this.s & f) << a;
  }
  d.t = this.t - e;
  d.clamp();
}
function bnpSubTo(d, f) {
  var e = 0, g = 0, b = Math.min(d.t, this.t);
  while (e < b) {
    g += this[e] - d[e];
    f[e++] = g & this.DM;
    g >>= this.DB;
  }
  if (d.t < this.t) {
    g -= d.s;
    while (e < this.t) {
      g += this[e];
      f[e++] = g & this.DM;
      g >>= this.DB;
    }
    g += this.s;
  } else {
    g += this.s;
    while (e < d.t) {
      g -= d[e];
      f[e++] = g & this.DM;
      g >>= this.DB;
    }
    g -= d.s;
  }
  f.s = g < 0 ? -1 : 0;
  if (g < -1) {
    f[e++] = this.DV + g;
  } else {
    if (g > 0) {
      f[e++] = g;
    }
  }
  f.t = e;
  f.clamp();
}
function bnpMultiplyTo(c, e) {
  var b = this.abs(), f = c.abs();
  var d = b.t;
  e.t = d + f.t;
  while (--d >= 0) {
    e[d] = 0;
  }
  for (d = 0; d < f.t; ++d) {
    e[d + b.t] = b.am(0, f[d], e, d, 0, b.t);
  }
  e.s = 0;
  e.clamp();
  if (this.s != c.s) {
    BigInteger.ZERO.subTo(e, e);
  }
}
function bnpSquareTo(d) {
  var a = this.abs();
  var b = d.t = 2 * a.t;
  while (--b >= 0) {
    d[b] = 0;
  }
  for (b = 0; b < a.t - 1; ++b) {
    var e = a.am(b, a[b], d, 2 * b, 0, 1);
    if ((d[b + a.t] += a.am(b + 1, 2 * a[b], d, 2 * b + 1, e, a.t - b - 1)) >= a.DV) {
      d[b + a.t] -= a.DV;
      d[b + a.t + 1] = 1;
    }
  }
  if (d.t > 0) {
    d[d.t - 1] += a.am(b, a[b], d, 2 * b, 0, 1);
  }
  d.s = 0;
  d.clamp();
}
function bnpDivRemTo(n, h2, g) {
  var w = n.abs();
  if (w.t <= 0) {
    return;
  }
  var k = this.abs();
  if (k.t < w.t) {
    if (h2 != null) {
      h2.fromInt(0);
    }
    if (g != null) {
      this.copyTo(g);
    }
    return;
  }
  if (g == null) {
    g = nbi();
  }
  var d = nbi(), a = this.s, l = n.s;
  var v = this.DB - nbits(w[w.t - 1]);
  if (v > 0) {
    w.lShiftTo(v, d);
    k.lShiftTo(v, g);
  } else {
    w.copyTo(d);
    k.copyTo(g);
  }
  var p = d.t;
  var b = d[p - 1];
  if (b == 0) {
    return;
  }
  var o = b * (1 << this.F1) + (p > 1 ? d[p - 2] >> this.F2 : 0);
  var A = this.FV / o, z = (1 << this.F1) / o, x = 1 << this.F2;
  var u = g.t, s = u - p, f = h2 == null ? nbi() : h2;
  d.dlShiftTo(s, f);
  if (g.compareTo(f) >= 0) {
    g[g.t++] = 1;
    g.subTo(f, g);
  }
  BigInteger.ONE.dlShiftTo(p, f);
  f.subTo(d, d);
  while (d.t < p) {
    d[d.t++] = 0;
  }
  while (--s >= 0) {
    var c = g[--u] == b ? this.DM : Math.floor(g[u] * A + (g[u - 1] + x) * z);
    if ((g[u] += d.am(0, c, g, s, 0, p)) < c) {
      d.dlShiftTo(s, f);
      g.subTo(f, g);
      while (g[u] < --c) {
        g.subTo(f, g);
      }
    }
  }
  if (h2 != null) {
    g.drShiftTo(p, h2);
    if (a != l) {
      BigInteger.ZERO.subTo(h2, h2);
    }
  }
  g.t = p;
  g.clamp();
  if (v > 0) {
    g.rShiftTo(v, g);
  }
  if (a < 0) {
    BigInteger.ZERO.subTo(g, g);
  }
}
function bnMod(b) {
  var c = nbi();
  this.abs().divRemTo(b, null, c);
  if (this.s < 0 && c.compareTo(BigInteger.ZERO) > 0) {
    b.subTo(c, c);
  }
  return c;
}
function Classic(a) {
  this.m = a;
}
function cConvert(a) {
  if (a.s < 0 || a.compareTo(this.m) >= 0) {
    return a.mod(this.m);
  } else {
    return a;
  }
}
function cRevert(a) {
  return a;
}
function cReduce(a) {
  a.divRemTo(this.m, null, a);
}
function cMulTo(a, c, b) {
  a.multiplyTo(c, b);
  this.reduce(b);
}
function cSqrTo(a, b) {
  a.squareTo(b);
  this.reduce(b);
}
Classic.prototype.convert = cConvert;
Classic.prototype.revert = cRevert;
Classic.prototype.reduce = cReduce;
Classic.prototype.mulTo = cMulTo;
Classic.prototype.sqrTo = cSqrTo;
function bnpInvDigit() {
  if (this.t < 1) {
    return 0;
  }
  var a = this[0];
  if ((a & 1) == 0) {
    return 0;
  }
  var b = a & 3;
  b = b * (2 - (a & 15) * b) & 15;
  b = b * (2 - (a & 255) * b) & 255;
  b = b * (2 - ((a & 65535) * b & 65535)) & 65535;
  b = b * (2 - a * b % this.DV) % this.DV;
  return b > 0 ? this.DV - b : -b;
}
function Montgomery(a) {
  this.m = a;
  this.mp = a.invDigit();
  this.mpl = this.mp & 32767;
  this.mph = this.mp >> 15;
  this.um = (1 << a.DB - 15) - 1;
  this.mt2 = 2 * a.t;
}
function montConvert(a) {
  var b = nbi();
  a.abs().dlShiftTo(this.m.t, b);
  b.divRemTo(this.m, null, b);
  if (a.s < 0 && b.compareTo(BigInteger.ZERO) > 0) {
    this.m.subTo(b, b);
  }
  return b;
}
function montRevert(a) {
  var b = nbi();
  a.copyTo(b);
  this.reduce(b);
  return b;
}
function montReduce(a) {
  while (a.t <= this.mt2) {
    a[a.t++] = 0;
  }
  for (var c = 0; c < this.m.t; ++c) {
    var b = a[c] & 32767;
    var d = b * this.mpl + ((b * this.mph + (a[c] >> 15) * this.mpl & this.um) << 15) & a.DM;
    b = c + this.m.t;
    a[b] += this.m.am(0, d, a, c, 0, this.m.t);
    while (a[b] >= a.DV) {
      a[b] -= a.DV;
      a[++b]++;
    }
  }
  a.clamp();
  a.drShiftTo(this.m.t, a);
  if (a.compareTo(this.m) >= 0) {
    a.subTo(this.m, a);
  }
}
function montSqrTo(a, b) {
  a.squareTo(b);
  this.reduce(b);
}
function montMulTo(a, c, b) {
  a.multiplyTo(c, b);
  this.reduce(b);
}
Montgomery.prototype.convert = montConvert;
Montgomery.prototype.revert = montRevert;
Montgomery.prototype.reduce = montReduce;
Montgomery.prototype.mulTo = montMulTo;
Montgomery.prototype.sqrTo = montSqrTo;
function bnpIsEven() {
  return (this.t > 0 ? this[0] & 1 : this.s) == 0;
}
function bnpExp(h2, j) {
  if (h2 > 4294967295 || h2 < 1) {
    return BigInteger.ONE;
  }
  var f = nbi(), a = nbi(), d = j.convert(this), c = nbits(h2) - 1;
  d.copyTo(f);
  while (--c >= 0) {
    j.sqrTo(f, a);
    if ((h2 & 1 << c) > 0) {
      j.mulTo(a, d, f);
    } else {
      var b = f;
      f = a;
      a = b;
    }
  }
  return j.revert(f);
}
function bnModPowInt(b, a) {
  var c;
  if (b < 256 || a.isEven()) {
    c = new Classic(a);
  } else {
    c = new Montgomery(a);
  }
  return this.exp(b, c);
}
BigInteger.prototype.copyTo = bnpCopyTo;
BigInteger.prototype.fromInt = bnpFromInt;
BigInteger.prototype.fromString = bnpFromString;
BigInteger.prototype.clamp = bnpClamp;
BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
BigInteger.prototype.drShiftTo = bnpDRShiftTo;
BigInteger.prototype.lShiftTo = bnpLShiftTo;
BigInteger.prototype.rShiftTo = bnpRShiftTo;
BigInteger.prototype.subTo = bnpSubTo;
BigInteger.prototype.multiplyTo = bnpMultiplyTo;
BigInteger.prototype.squareTo = bnpSquareTo;
BigInteger.prototype.divRemTo = bnpDivRemTo;
BigInteger.prototype.invDigit = bnpInvDigit;
BigInteger.prototype.isEven = bnpIsEven;
BigInteger.prototype.exp = bnpExp;
BigInteger.prototype.toString = bnToString;
BigInteger.prototype.negate = bnNegate;
BigInteger.prototype.abs = bnAbs;
BigInteger.prototype.compareTo = bnCompareTo;
BigInteger.prototype.bitLength = bnBitLength;
BigInteger.prototype.mod = bnMod;
BigInteger.prototype.modPowInt = bnModPowInt;
BigInteger.ZERO = nbv(0);
BigInteger.ONE = nbv(1);
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
function bnClone() {
  var a = nbi();
  this.copyTo(a);
  return a;
}
function bnIntValue() {
  if (this.s < 0) {
    if (this.t == 1) {
      return this[0] - this.DV;
    } else {
      if (this.t == 0) {
        return -1;
      }
    }
  } else {
    if (this.t == 1) {
      return this[0];
    } else {
      if (this.t == 0) {
        return 0;
      }
    }
  }
  return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0];
}
function bnByteValue() {
  return this.t == 0 ? this.s : this[0] << 24 >> 24;
}
function bnShortValue() {
  return this.t == 0 ? this.s : this[0] << 16 >> 16;
}
function bnpChunkSize(a) {
  return Math.floor(Math.LN2 * this.DB / Math.log(a));
}
function bnSigNum() {
  if (this.s < 0) {
    return -1;
  } else {
    if (this.t <= 0 || this.t == 1 && this[0] <= 0) {
      return 0;
    } else {
      return 1;
    }
  }
}
function bnpToRadix(c) {
  if (c == null) {
    c = 10;
  }
  if (this.signum() == 0 || c < 2 || c > 36) {
    return "0";
  }
  var f = this.chunkSize(c);
  var e = Math.pow(c, f);
  var i = nbv(e), j = nbi(), h2 = nbi(), g = "";
  this.divRemTo(i, j, h2);
  while (j.signum() > 0) {
    g = (e + h2.intValue()).toString(c).substr(1) + g;
    j.divRemTo(i, j, h2);
  }
  return h2.intValue().toString(c) + g;
}
function bnpFromRadix(m, h2) {
  this.fromInt(0);
  if (h2 == null) {
    h2 = 10;
  }
  var f = this.chunkSize(h2);
  var g = Math.pow(h2, f), e = false, a = 0, l = 0;
  for (var c = 0; c < m.length; ++c) {
    var k = intAt(m, c);
    if (k < 0) {
      if (m.charAt(c) == "-" && this.signum() == 0) {
        e = true;
      }
      continue;
    }
    l = h2 * l + k;
    if (++a >= f) {
      this.dMultiply(g);
      this.dAddOffset(l, 0);
      a = 0;
      l = 0;
    }
  }
  if (a > 0) {
    this.dMultiply(Math.pow(h2, a));
    this.dAddOffset(l, 0);
  }
  if (e) {
    BigInteger.ZERO.subTo(this, this);
  }
}
function bnpFromNumber(f, e, h2) {
  if (typeof e == "number") {
    if (f < 2) {
      this.fromInt(1);
    } else {
      this.fromNumber(f, h2);
      if (!this.testBit(f - 1)) {
        this.bitwiseTo(BigInteger.ONE.shiftLeft(f - 1), op_or, this);
      }
      if (this.isEven()) {
        this.dAddOffset(1, 0);
      }
      while (!this.isProbablePrime(e)) {
        this.dAddOffset(2, 0);
        if (this.bitLength() > f) {
          this.subTo(BigInteger.ONE.shiftLeft(f - 1), this);
        }
      }
    }
  } else {
    var d = new Array(), g = f & 7;
    d.length = (f >> 3) + 1;
    e.nextBytes(d);
    if (g > 0) {
      d[0] &= (1 << g) - 1;
    } else {
      d[0] = 0;
    }
    this.fromString(d, 256);
  }
}
function bnToByteArray() {
  var b = this.t, c = new Array();
  c[0] = this.s;
  var e = this.DB - b * this.DB % 8, f, a = 0;
  if (b-- > 0) {
    if (e < this.DB && (f = this[b] >> e) != (this.s & this.DM) >> e) {
      c[a++] = f | this.s << this.DB - e;
    }
    while (b >= 0) {
      if (e < 8) {
        f = (this[b] & (1 << e) - 1) << 8 - e;
        f |= this[--b] >> (e += this.DB - 8);
      } else {
        f = this[b] >> (e -= 8) & 255;
        if (e <= 0) {
          e += this.DB;
          --b;
        }
      }
      if ((f & 128) != 0) {
        f |= -256;
      }
      if (a == 0 && (this.s & 128) != (f & 128)) {
        ++a;
      }
      if (a > 0 || f != this.s) {
        c[a++] = f;
      }
    }
  }
  return c;
}
function bnEquals(b) {
  return this.compareTo(b) == 0;
}
function bnMin(b) {
  return this.compareTo(b) < 0 ? this : b;
}
function bnMax(b) {
  return this.compareTo(b) > 0 ? this : b;
}
function bnpBitwiseTo(c, h2, e) {
  var d, g, b = Math.min(c.t, this.t);
  for (d = 0; d < b; ++d) {
    e[d] = h2(this[d], c[d]);
  }
  if (c.t < this.t) {
    g = c.s & this.DM;
    for (d = b; d < this.t; ++d) {
      e[d] = h2(this[d], g);
    }
    e.t = this.t;
  } else {
    g = this.s & this.DM;
    for (d = b; d < c.t; ++d) {
      e[d] = h2(g, c[d]);
    }
    e.t = c.t;
  }
  e.s = h2(this.s, c.s);
  e.clamp();
}
function op_and(a, b) {
  return a & b;
}
function bnAnd(b) {
  var c = nbi();
  this.bitwiseTo(b, op_and, c);
  return c;
}
function op_or(a, b) {
  return a | b;
}
function bnOr(b) {
  var c = nbi();
  this.bitwiseTo(b, op_or, c);
  return c;
}
function op_xor(a, b) {
  return a ^ b;
}
function bnXor(b) {
  var c = nbi();
  this.bitwiseTo(b, op_xor, c);
  return c;
}
function op_andnot(a, b) {
  return a & ~b;
}
function bnAndNot(b) {
  var c = nbi();
  this.bitwiseTo(b, op_andnot, c);
  return c;
}
function bnNot() {
  var b = nbi();
  for (var a = 0; a < this.t; ++a) {
    b[a] = this.DM & ~this[a];
  }
  b.t = this.t;
  b.s = ~this.s;
  return b;
}
function bnShiftLeft(b) {
  var a = nbi();
  if (b < 0) {
    this.rShiftTo(-b, a);
  } else {
    this.lShiftTo(b, a);
  }
  return a;
}
function bnShiftRight(b) {
  var a = nbi();
  if (b < 0) {
    this.lShiftTo(-b, a);
  } else {
    this.rShiftTo(b, a);
  }
  return a;
}
function lbit(a) {
  if (a == 0) {
    return -1;
  }
  var b = 0;
  if ((a & 65535) == 0) {
    a >>= 16;
    b += 16;
  }
  if ((a & 255) == 0) {
    a >>= 8;
    b += 8;
  }
  if ((a & 15) == 0) {
    a >>= 4;
    b += 4;
  }
  if ((a & 3) == 0) {
    a >>= 2;
    b += 2;
  }
  if ((a & 1) == 0) {
    ++b;
  }
  return b;
}
function bnGetLowestSetBit() {
  for (var a = 0; a < this.t; ++a) {
    if (this[a] != 0) {
      return a * this.DB + lbit(this[a]);
    }
  }
  if (this.s < 0) {
    return this.t * this.DB;
  }
  return -1;
}
function cbit(a) {
  var b = 0;
  while (a != 0) {
    a &= a - 1;
    ++b;
  }
  return b;
}
function bnBitCount() {
  var c = 0, a = this.s & this.DM;
  for (var b = 0; b < this.t; ++b) {
    c += cbit(this[b] ^ a);
  }
  return c;
}
function bnTestBit(b) {
  var a = Math.floor(b / this.DB);
  if (a >= this.t) {
    return this.s != 0;
  }
  return (this[a] & 1 << b % this.DB) != 0;
}
function bnpChangeBit(c, b) {
  var a = BigInteger.ONE.shiftLeft(c);
  this.bitwiseTo(a, b, a);
  return a;
}
function bnSetBit(a) {
  return this.changeBit(a, op_or);
}
function bnClearBit(a) {
  return this.changeBit(a, op_andnot);
}
function bnFlipBit(a) {
  return this.changeBit(a, op_xor);
}
function bnpAddTo(d, f) {
  var e = 0, g = 0, b = Math.min(d.t, this.t);
  while (e < b) {
    g += this[e] + d[e];
    f[e++] = g & this.DM;
    g >>= this.DB;
  }
  if (d.t < this.t) {
    g += d.s;
    while (e < this.t) {
      g += this[e];
      f[e++] = g & this.DM;
      g >>= this.DB;
    }
    g += this.s;
  } else {
    g += this.s;
    while (e < d.t) {
      g += d[e];
      f[e++] = g & this.DM;
      g >>= this.DB;
    }
    g += d.s;
  }
  f.s = g < 0 ? -1 : 0;
  if (g > 0) {
    f[e++] = g;
  } else {
    if (g < -1) {
      f[e++] = this.DV + g;
    }
  }
  f.t = e;
  f.clamp();
}
function bnAdd(b) {
  var c = nbi();
  this.addTo(b, c);
  return c;
}
function bnSubtract(b) {
  var c = nbi();
  this.subTo(b, c);
  return c;
}
function bnMultiply(b) {
  var c = nbi();
  this.multiplyTo(b, c);
  return c;
}
function bnSquare() {
  var a = nbi();
  this.squareTo(a);
  return a;
}
function bnDivide(b) {
  var c = nbi();
  this.divRemTo(b, c, null);
  return c;
}
function bnRemainder(b) {
  var c = nbi();
  this.divRemTo(b, null, c);
  return c;
}
function bnDivideAndRemainder(b) {
  var d = nbi(), c = nbi();
  this.divRemTo(b, d, c);
  return new Array(d, c);
}
function bnpDMultiply(a) {
  this[this.t] = this.am(0, a - 1, this, 0, 0, this.t);
  ++this.t;
  this.clamp();
}
function bnpDAddOffset(b, a) {
  if (b == 0) {
    return;
  }
  while (this.t <= a) {
    this[this.t++] = 0;
  }
  this[a] += b;
  while (this[a] >= this.DV) {
    this[a] -= this.DV;
    if (++a >= this.t) {
      this[this.t++] = 0;
    }
    ++this[a];
  }
}
function NullExp() {
}
function nNop(a) {
  return a;
}
function nMulTo(a, c, b) {
  a.multiplyTo(c, b);
}
function nSqrTo(a, b) {
  a.squareTo(b);
}
NullExp.prototype.convert = nNop;
NullExp.prototype.revert = nNop;
NullExp.prototype.mulTo = nMulTo;
NullExp.prototype.sqrTo = nSqrTo;
function bnPow(a) {
  return this.exp(a, new NullExp());
}
function bnpMultiplyLowerTo(b, f, e) {
  var d = Math.min(this.t + b.t, f);
  e.s = 0;
  e.t = d;
  while (d > 0) {
    e[--d] = 0;
  }
  var c;
  for (c = e.t - this.t; d < c; ++d) {
    e[d + this.t] = this.am(0, b[d], e, d, 0, this.t);
  }
  for (c = Math.min(b.t, f); d < c; ++d) {
    this.am(0, b[d], e, d, 0, f - d);
  }
  e.clamp();
}
function bnpMultiplyUpperTo(b, e, d) {
  --e;
  var c = d.t = this.t + b.t - e;
  d.s = 0;
  while (--c >= 0) {
    d[c] = 0;
  }
  for (c = Math.max(e - this.t, 0); c < b.t; ++c) {
    d[this.t + c - e] = this.am(e - c, b[c], d, 0, 0, this.t + c - e);
  }
  d.clamp();
  d.drShiftTo(1, d);
}
function Barrett(a) {
  this.r2 = nbi();
  this.q3 = nbi();
  BigInteger.ONE.dlShiftTo(2 * a.t, this.r2);
  this.mu = this.r2.divide(a);
  this.m = a;
}
function barrettConvert(a) {
  if (a.s < 0 || a.t > 2 * this.m.t) {
    return a.mod(this.m);
  } else {
    if (a.compareTo(this.m) < 0) {
      return a;
    } else {
      var b = nbi();
      a.copyTo(b);
      this.reduce(b);
      return b;
    }
  }
}
function barrettRevert(a) {
  return a;
}
function barrettReduce(a) {
  a.drShiftTo(this.m.t - 1, this.r2);
  if (a.t > this.m.t + 1) {
    a.t = this.m.t + 1;
    a.clamp();
  }
  this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
  this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);
  while (a.compareTo(this.r2) < 0) {
    a.dAddOffset(1, this.m.t + 1);
  }
  a.subTo(this.r2, a);
  while (a.compareTo(this.m) >= 0) {
    a.subTo(this.m, a);
  }
}
function barrettSqrTo(a, b) {
  a.squareTo(b);
  this.reduce(b);
}
function barrettMulTo(a, c, b) {
  a.multiplyTo(c, b);
  this.reduce(b);
}
Barrett.prototype.convert = barrettConvert;
Barrett.prototype.revert = barrettRevert;
Barrett.prototype.reduce = barrettReduce;
Barrett.prototype.mulTo = barrettMulTo;
Barrett.prototype.sqrTo = barrettSqrTo;
function bnModPow(q, f) {
  var o = q.bitLength(), h2, b = nbv(1), v;
  if (o <= 0) {
    return b;
  } else {
    if (o < 18) {
      h2 = 1;
    } else {
      if (o < 48) {
        h2 = 3;
      } else {
        if (o < 144) {
          h2 = 4;
        } else {
          if (o < 768) {
            h2 = 5;
          } else {
            h2 = 6;
          }
        }
      }
    }
  }
  if (o < 8) {
    v = new Classic(f);
  } else {
    if (f.isEven()) {
      v = new Barrett(f);
    } else {
      v = new Montgomery(f);
    }
  }
  var p = new Array(), d = 3, s = h2 - 1, a = (1 << h2) - 1;
  p[1] = v.convert(this);
  if (h2 > 1) {
    var A = nbi();
    v.sqrTo(p[1], A);
    while (d <= a) {
      p[d] = nbi();
      v.mulTo(A, p[d - 2], p[d]);
      d += 2;
    }
  }
  var l = q.t - 1, x, u = true, c = nbi(), y;
  o = nbits(q[l]) - 1;
  while (l >= 0) {
    if (o >= s) {
      x = q[l] >> o - s & a;
    } else {
      x = (q[l] & (1 << o + 1) - 1) << s - o;
      if (l > 0) {
        x |= q[l - 1] >> this.DB + o - s;
      }
    }
    d = h2;
    while ((x & 1) == 0) {
      x >>= 1;
      --d;
    }
    if ((o -= d) < 0) {
      o += this.DB;
      --l;
    }
    if (u) {
      p[x].copyTo(b);
      u = false;
    } else {
      while (d > 1) {
        v.sqrTo(b, c);
        v.sqrTo(c, b);
        d -= 2;
      }
      if (d > 0) {
        v.sqrTo(b, c);
      } else {
        y = b;
        b = c;
        c = y;
      }
      v.mulTo(c, p[x], b);
    }
    while (l >= 0 && (q[l] & 1 << o) == 0) {
      v.sqrTo(b, c);
      y = b;
      b = c;
      c = y;
      if (--o < 0) {
        o = this.DB - 1;
        --l;
      }
    }
  }
  return v.revert(b);
}
function bnGCD(c) {
  var b = this.s < 0 ? this.negate() : this.clone();
  var h2 = c.s < 0 ? c.negate() : c.clone();
  if (b.compareTo(h2) < 0) {
    var e = b;
    b = h2;
    h2 = e;
  }
  var d = b.getLowestSetBit(), f = h2.getLowestSetBit();
  if (f < 0) {
    return b;
  }
  if (d < f) {
    f = d;
  }
  if (f > 0) {
    b.rShiftTo(f, b);
    h2.rShiftTo(f, h2);
  }
  while (b.signum() > 0) {
    if ((d = b.getLowestSetBit()) > 0) {
      b.rShiftTo(d, b);
    }
    if ((d = h2.getLowestSetBit()) > 0) {
      h2.rShiftTo(d, h2);
    }
    if (b.compareTo(h2) >= 0) {
      b.subTo(h2, b);
      b.rShiftTo(1, b);
    } else {
      h2.subTo(b, h2);
      h2.rShiftTo(1, h2);
    }
  }
  if (f > 0) {
    h2.lShiftTo(f, h2);
  }
  return h2;
}
function bnpModInt(e) {
  if (e <= 0) {
    return 0;
  }
  var c = this.DV % e, b = this.s < 0 ? e - 1 : 0;
  if (this.t > 0) {
    if (c == 0) {
      b = this[0] % e;
    } else {
      for (var a = this.t - 1; a >= 0; --a) {
        b = (c * b + this[a]) % e;
      }
    }
  }
  return b;
}
function bnModInverse(f) {
  var j = f.isEven();
  if (this.isEven() && j || f.signum() == 0) {
    return BigInteger.ZERO;
  }
  var i = f.clone(), h2 = this.clone();
  var g = nbv(1), e = nbv(0), l = nbv(0), k = nbv(1);
  while (i.signum() != 0) {
    while (i.isEven()) {
      i.rShiftTo(1, i);
      if (j) {
        if (!g.isEven() || !e.isEven()) {
          g.addTo(this, g);
          e.subTo(f, e);
        }
        g.rShiftTo(1, g);
      } else {
        if (!e.isEven()) {
          e.subTo(f, e);
        }
      }
      e.rShiftTo(1, e);
    }
    while (h2.isEven()) {
      h2.rShiftTo(1, h2);
      if (j) {
        if (!l.isEven() || !k.isEven()) {
          l.addTo(this, l);
          k.subTo(f, k);
        }
        l.rShiftTo(1, l);
      } else {
        if (!k.isEven()) {
          k.subTo(f, k);
        }
      }
      k.rShiftTo(1, k);
    }
    if (i.compareTo(h2) >= 0) {
      i.subTo(h2, i);
      if (j) {
        g.subTo(l, g);
      }
      e.subTo(k, e);
    } else {
      h2.subTo(i, h2);
      if (j) {
        l.subTo(g, l);
      }
      k.subTo(e, k);
    }
  }
  if (h2.compareTo(BigInteger.ONE) != 0) {
    return BigInteger.ZERO;
  }
  if (k.compareTo(f) >= 0) {
    return k.subtract(f);
  }
  if (k.signum() < 0) {
    k.addTo(f, k);
  } else {
    return k;
  }
  if (k.signum() < 0) {
    return k.add(f);
  } else {
    return k;
  }
}
var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];
var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];
function bnIsProbablePrime(e) {
  var d, b = this.abs();
  if (b.t == 1 && b[0] <= lowprimes[lowprimes.length - 1]) {
    for (d = 0; d < lowprimes.length; ++d) {
      if (b[0] == lowprimes[d]) {
        return true;
      }
    }
    return false;
  }
  if (b.isEven()) {
    return false;
  }
  d = 1;
  while (d < lowprimes.length) {
    var a = lowprimes[d], c = d + 1;
    while (c < lowprimes.length && a < lplim) {
      a *= lowprimes[c++];
    }
    a = b.modInt(a);
    while (d < c) {
      if (a % lowprimes[d++] == 0) {
        return false;
      }
    }
  }
  return b.millerRabin(e);
}
function bnpMillerRabin(f) {
  var g = this.subtract(BigInteger.ONE);
  var c = g.getLowestSetBit();
  if (c <= 0) {
    return false;
  }
  var h2 = g.shiftRight(c);
  f = f + 1 >> 1;
  if (f > lowprimes.length) {
    f = lowprimes.length;
  }
  var b = nbi();
  for (var e = 0; e < f; ++e) {
    b.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
    var l = b.modPow(h2, this);
    if (l.compareTo(BigInteger.ONE) != 0 && l.compareTo(g) != 0) {
      var d = 1;
      while (d++ < c && l.compareTo(g) != 0) {
        l = l.modPowInt(2, this);
        if (l.compareTo(BigInteger.ONE) == 0) {
          return false;
        }
      }
      if (l.compareTo(g) != 0) {
        return false;
      }
    }
  }
  return true;
}
BigInteger.prototype.chunkSize = bnpChunkSize;
BigInteger.prototype.toRadix = bnpToRadix;
BigInteger.prototype.fromRadix = bnpFromRadix;
BigInteger.prototype.fromNumber = bnpFromNumber;
BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
BigInteger.prototype.changeBit = bnpChangeBit;
BigInteger.prototype.addTo = bnpAddTo;
BigInteger.prototype.dMultiply = bnpDMultiply;
BigInteger.prototype.dAddOffset = bnpDAddOffset;
BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
BigInteger.prototype.modInt = bnpModInt;
BigInteger.prototype.millerRabin = bnpMillerRabin;
BigInteger.prototype.clone = bnClone;
BigInteger.prototype.intValue = bnIntValue;
BigInteger.prototype.byteValue = bnByteValue;
BigInteger.prototype.shortValue = bnShortValue;
BigInteger.prototype.signum = bnSigNum;
BigInteger.prototype.toByteArray = bnToByteArray;
BigInteger.prototype.equals = bnEquals;
BigInteger.prototype.min = bnMin;
BigInteger.prototype.max = bnMax;
BigInteger.prototype.and = bnAnd;
BigInteger.prototype.or = bnOr;
BigInteger.prototype.xor = bnXor;
BigInteger.prototype.andNot = bnAndNot;
BigInteger.prototype.not = bnNot;
BigInteger.prototype.shiftLeft = bnShiftLeft;
BigInteger.prototype.shiftRight = bnShiftRight;
BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
BigInteger.prototype.bitCount = bnBitCount;
BigInteger.prototype.testBit = bnTestBit;
BigInteger.prototype.setBit = bnSetBit;
BigInteger.prototype.clearBit = bnClearBit;
BigInteger.prototype.flipBit = bnFlipBit;
BigInteger.prototype.add = bnAdd;
BigInteger.prototype.subtract = bnSubtract;
BigInteger.prototype.multiply = bnMultiply;
BigInteger.prototype.divide = bnDivide;
BigInteger.prototype.remainder = bnRemainder;
BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
BigInteger.prototype.modPow = bnModPow;
BigInteger.prototype.modInverse = bnModInverse;
BigInteger.prototype.pow = bnPow;
BigInteger.prototype.gcd = bnGCD;
BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
BigInteger.prototype.square = bnSquare;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
function Arcfour() {
  this.i = 0;
  this.j = 0;
  this.S = new Array();
}
function ARC4init(d) {
  var c, a, b;
  for (c = 0; c < 256; ++c) {
    this.S[c] = c;
  }
  a = 0;
  for (c = 0; c < 256; ++c) {
    a = a + this.S[c] + d[c % d.length] & 255;
    b = this.S[c];
    this.S[c] = this.S[a];
    this.S[a] = b;
  }
  this.i = 0;
  this.j = 0;
}
function ARC4next() {
  var a;
  this.i = this.i + 1 & 255;
  this.j = this.j + this.S[this.i] & 255;
  a = this.S[this.i];
  this.S[this.i] = this.S[this.j];
  this.S[this.j] = a;
  return this.S[a + this.S[this.i] & 255];
}
Arcfour.prototype.init = ARC4init;
Arcfour.prototype.next = ARC4next;
function prng_newstate() {
  return new Arcfour();
}
var rng_psize = 256;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
var rng_state;
var rng_pool;
var rng_pptr;
function rng_seed_int(a) {
  rng_pool[rng_pptr++] ^= a & 255;
  rng_pool[rng_pptr++] ^= a >> 8 & 255;
  rng_pool[rng_pptr++] ^= a >> 16 & 255;
  rng_pool[rng_pptr++] ^= a >> 24 & 255;
  if (rng_pptr >= rng_psize) {
    rng_pptr -= rng_psize;
  }
}
function rng_seed_time() {
  rng_seed_int(new Date().getTime());
}
if (rng_pool == null) {
  rng_pool = new Array();
  rng_pptr = 0;
  var t;
  if (window$1 !== void 0 && window$1.msCrypto !== void 0) {
    var crypto = window$1.msCrypto;
    if (crypto.getRandomValues) {
      var ua = new Uint8Array(32);
      crypto.getRandomValues(ua);
      for (t = 0; t < 32; ++t) {
        rng_pool[rng_pptr++] = ua[t];
      }
    }
  }
  while (rng_pptr < rng_psize) {
    t = Math.floor(65536 * Math.random());
    rng_pool[rng_pptr++] = t >>> 8;
    rng_pool[rng_pptr++] = t & 255;
  }
  rng_pptr = 0;
  rng_seed_time();
}
function rng_get_byte() {
  if (rng_state == null) {
    rng_seed_time();
    rng_state = prng_newstate();
    rng_state.init(rng_pool);
    for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {
      rng_pool[rng_pptr] = 0;
    }
    rng_pptr = 0;
  }
  return rng_state.next();
}
function rng_get_bytes(b) {
  var a;
  for (a = 0; a < b.length; ++a) {
    b[a] = rng_get_byte();
  }
}
function SecureRandom() {
}
SecureRandom.prototype.nextBytes = rng_get_bytes;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
function parseBigInt(b, a) {
  return new BigInteger(b, a);
}
function pkcs1pad2(e, h2) {
  if (h2 < e.length + 11) {
    alert("Message too long for RSA");
    return null;
  }
  var g = new Array();
  var d = e.length - 1;
  while (d >= 0 && h2 > 0) {
    var f = e.charCodeAt(d--);
    if (f < 128) {
      g[--h2] = f;
    } else {
      if (f > 127 && f < 2048) {
        g[--h2] = f & 63 | 128;
        g[--h2] = f >> 6 | 192;
      } else {
        g[--h2] = f & 63 | 128;
        g[--h2] = f >> 6 & 63 | 128;
        g[--h2] = f >> 12 | 224;
      }
    }
  }
  g[--h2] = 0;
  var b = new SecureRandom();
  var a = new Array();
  while (h2 > 2) {
    a[0] = 0;
    while (a[0] == 0) {
      b.nextBytes(a);
    }
    g[--h2] = a[0];
  }
  g[--h2] = 2;
  g[--h2] = 0;
  return new BigInteger(g);
}
function oaep_mgf1_arr(c, a, e) {
  var b = "", d = 0;
  while (b.length < a) {
    b += e(String.fromCharCode.apply(String, c.concat([(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255])));
    d += 1;
  }
  return b;
}
function oaep_pad(q, a, f, l) {
  var c = KJUR.crypto.MessageDigest;
  var o = KJUR.crypto.Util;
  var b = null;
  if (!f) {
    f = "sha1";
  }
  if (typeof f === "string") {
    b = c.getCanonicalAlgName(f);
    l = c.getHashLength(b);
    f = function(i) {
      return hextorstr(o.hashString(i, b));
    };
  }
  if (q.length + 2 * l + 2 > a) {
    throw "Message too long for RSA";
  }
  var k = "", e;
  for (e = 0; e < a - q.length - 2 * l - 2; e += 1) {
    k += "\0";
  }
  var h2 = f("") + k + "" + q;
  var g = new Array(l);
  new SecureRandom().nextBytes(g);
  var j = oaep_mgf1_arr(g, h2.length, f);
  var p = [];
  for (e = 0; e < h2.length; e += 1) {
    p[e] = h2.charCodeAt(e) ^ j.charCodeAt(e);
  }
  var m = oaep_mgf1_arr(p, g.length, f);
  var d = [0];
  for (e = 0; e < g.length; e += 1) {
    d[e + 1] = g[e] ^ m.charCodeAt(e);
  }
  return new BigInteger(d.concat(p));
}
function RSAKey() {
  this.n = null;
  this.e = 0;
  this.d = null;
  this.p = null;
  this.q = null;
  this.dmp1 = null;
  this.dmq1 = null;
  this.coeff = null;
}
function RSASetPublic(b, a) {
  this.isPublic = true;
  this.isPrivate = false;
  if (typeof b !== "string") {
    this.n = b;
    this.e = a;
  } else {
    if (b != null && a != null && b.length > 0 && a.length > 0) {
      this.n = parseBigInt(b, 16);
      this.e = parseInt(a, 16);
    } else {
      throw "Invalid RSA public key";
    }
  }
}
function RSADoPublic(a) {
  return a.modPowInt(this.e, this.n);
}
function RSAEncrypt(d) {
  var a = pkcs1pad2(d, this.n.bitLength() + 7 >> 3);
  if (a == null) {
    return null;
  }
  var e = this.doPublic(a);
  if (e == null) {
    return null;
  }
  var b = e.toString(16);
  if ((b.length & 1) == 0) {
    return b;
  } else {
    return "0" + b;
  }
}
function RSAEncryptOAEP(f, e, b) {
  var a = oaep_pad(f, this.n.bitLength() + 7 >> 3, e, b);
  if (a == null) {
    return null;
  }
  var g = this.doPublic(a);
  if (g == null) {
    return null;
  }
  var d = g.toString(16);
  if ((d.length & 1) == 0) {
    return d;
  } else {
    return "0" + d;
  }
}
RSAKey.prototype.doPublic = RSADoPublic;
RSAKey.prototype.setPublic = RSASetPublic;
RSAKey.prototype.encrypt = RSAEncrypt;
RSAKey.prototype.encryptOAEP = RSAEncryptOAEP;
RSAKey.prototype.type = "RSA";
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
function pkcs1unpad2(g, j) {
  var a = g.toByteArray();
  var f = 0;
  while (f < a.length && a[f] == 0) {
    ++f;
  }
  if (a.length - f != j - 1 || a[f] != 2) {
    return null;
  }
  ++f;
  while (a[f] != 0) {
    if (++f >= a.length) {
      return null;
    }
  }
  var e = "";
  while (++f < a.length) {
    var h2 = a[f] & 255;
    if (h2 < 128) {
      e += String.fromCharCode(h2);
    } else {
      if (h2 > 191 && h2 < 224) {
        e += String.fromCharCode((h2 & 31) << 6 | a[f + 1] & 63);
        ++f;
      } else {
        e += String.fromCharCode((h2 & 15) << 12 | (a[f + 1] & 63) << 6 | a[f + 2] & 63);
        f += 2;
      }
    }
  }
  return e;
}
function oaep_mgf1_str(c, a, e) {
  var b = "", d = 0;
  while (b.length < a) {
    b += e(c + String.fromCharCode.apply(String, [(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255]));
    d += 1;
  }
  return b;
}
function oaep_unpad(o, b, g, p) {
  var e = KJUR.crypto.MessageDigest;
  var r = KJUR.crypto.Util;
  var c = null;
  if (!g) {
    g = "sha1";
  }
  if (typeof g === "string") {
    c = e.getCanonicalAlgName(g);
    p = e.getHashLength(c);
    g = function(d) {
      return hextorstr(r.hashString(d, c));
    };
  }
  o = o.toByteArray();
  var h2;
  for (h2 = 0; h2 < o.length; h2 += 1) {
    o[h2] &= 255;
  }
  while (o.length < b) {
    o.unshift(0);
  }
  o = String.fromCharCode.apply(String, o);
  if (o.length < 2 * p + 2) {
    throw "Cipher too short";
  }
  var f = o.substr(1, p);
  var s = o.substr(p + 1);
  var q = oaep_mgf1_str(s, p, g);
  var k = [], h2;
  for (h2 = 0; h2 < f.length; h2 += 1) {
    k[h2] = f.charCodeAt(h2) ^ q.charCodeAt(h2);
  }
  var l = oaep_mgf1_str(String.fromCharCode.apply(String, k), o.length - p, g);
  var j = [];
  for (h2 = 0; h2 < s.length; h2 += 1) {
    j[h2] = s.charCodeAt(h2) ^ l.charCodeAt(h2);
  }
  j = String.fromCharCode.apply(String, j);
  if (j.substr(0, p) !== g("")) {
    throw "Hash mismatch";
  }
  j = j.substr(p);
  var a = j.indexOf("");
  var m = a != -1 ? j.substr(0, a).lastIndexOf("\0") : -1;
  if (m + 1 != a) {
    throw "Malformed data";
  }
  return j.substr(a + 1);
}
function RSASetPrivate(c, a, b) {
  this.isPrivate = true;
  if (typeof c !== "string") {
    this.n = c;
    this.e = a;
    this.d = b;
  } else {
    if (c != null && a != null && c.length > 0 && a.length > 0) {
      this.n = parseBigInt(c, 16);
      this.e = parseInt(a, 16);
      this.d = parseBigInt(b, 16);
    } else {
      alert("Invalid RSA private key");
    }
  }
}
function RSASetPrivateEx(g, d, e, c, b, a, h2, f) {
  this.isPrivate = true;
  this.isPublic = false;
  if (g == null) {
    throw "RSASetPrivateEx N == null";
  }
  if (d == null) {
    throw "RSASetPrivateEx E == null";
  }
  if (g.length == 0) {
    throw "RSASetPrivateEx N.length == 0";
  }
  if (d.length == 0) {
    throw "RSASetPrivateEx E.length == 0";
  }
  if (g != null && d != null && g.length > 0 && d.length > 0) {
    this.n = parseBigInt(g, 16);
    this.e = parseInt(d, 16);
    this.d = parseBigInt(e, 16);
    this.p = parseBigInt(c, 16);
    this.q = parseBigInt(b, 16);
    this.dmp1 = parseBigInt(a, 16);
    this.dmq1 = parseBigInt(h2, 16);
    this.coeff = parseBigInt(f, 16);
  } else {
    alert("Invalid RSA private key in RSASetPrivateEx");
  }
}
function RSAGenerate(b, i) {
  var a = new SecureRandom();
  var f = b >> 1;
  this.e = parseInt(i, 16);
  var c = new BigInteger(i, 16);
  for (; ; ) {
    for (; ; ) {
      this.p = new BigInteger(b - f, 1, a);
      if (this.p.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) {
        break;
      }
    }
    for (; ; ) {
      this.q = new BigInteger(f, 1, a);
      if (this.q.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) {
        break;
      }
    }
    if (this.p.compareTo(this.q) <= 0) {
      var h2 = this.p;
      this.p = this.q;
      this.q = h2;
    }
    var g = this.p.subtract(BigInteger.ONE);
    var d = this.q.subtract(BigInteger.ONE);
    var e = g.multiply(d);
    if (e.gcd(c).compareTo(BigInteger.ONE) == 0) {
      this.n = this.p.multiply(this.q);
      this.d = c.modInverse(e);
      this.dmp1 = this.d.mod(g);
      this.dmq1 = this.d.mod(d);
      this.coeff = this.q.modInverse(this.p);
      break;
    }
  }
  this.isPrivate = true;
}
function RSADoPrivate(a) {
  if (this.p == null || this.q == null) {
    return a.modPow(this.d, this.n);
  }
  var c = a.mod(this.p).modPow(this.dmp1, this.p);
  var b = a.mod(this.q).modPow(this.dmq1, this.q);
  while (c.compareTo(b) < 0) {
    c = c.add(this.p);
  }
  return c.subtract(b).multiply(this.coeff).mod(this.p).multiply(this.q).add(b);
}
function RSADecrypt(b) {
  var d = parseBigInt(b, 16);
  var a = this.doPrivate(d);
  if (a == null) {
    return null;
  }
  return pkcs1unpad2(a, this.n.bitLength() + 7 >> 3);
}
function RSADecryptOAEP(e, d, b) {
  var f = parseBigInt(e, 16);
  var a = this.doPrivate(f);
  if (a == null) {
    return null;
  }
  return oaep_unpad(a, this.n.bitLength() + 7 >> 3, d, b);
}
RSAKey.prototype.doPrivate = RSADoPrivate;
RSAKey.prototype.setPrivate = RSASetPrivate;
RSAKey.prototype.setPrivateEx = RSASetPrivateEx;
RSAKey.prototype.generate = RSAGenerate;
RSAKey.prototype.decrypt = RSADecrypt;
RSAKey.prototype.decryptOAEP = RSADecryptOAEP;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
function ECFieldElementFp(b, a) {
  this.x = a;
  this.q = b;
}
function feFpEquals(a) {
  if (a == this) {
    return true;
  }
  return this.q.equals(a.q) && this.x.equals(a.x);
}
function feFpToBigInteger() {
  return this.x;
}
function feFpNegate() {
  return new ECFieldElementFp(this.q, this.x.negate().mod(this.q));
}
function feFpAdd(a) {
  return new ECFieldElementFp(this.q, this.x.add(a.toBigInteger()).mod(this.q));
}
function feFpSubtract(a) {
  return new ECFieldElementFp(this.q, this.x.subtract(a.toBigInteger()).mod(this.q));
}
function feFpMultiply(a) {
  return new ECFieldElementFp(this.q, this.x.multiply(a.toBigInteger()).mod(this.q));
}
function feFpSquare() {
  return new ECFieldElementFp(this.q, this.x.square().mod(this.q));
}
function feFpDivide(a) {
  return new ECFieldElementFp(this.q, this.x.multiply(a.toBigInteger().modInverse(this.q)).mod(this.q));
}
ECFieldElementFp.prototype.equals = feFpEquals;
ECFieldElementFp.prototype.toBigInteger = feFpToBigInteger;
ECFieldElementFp.prototype.negate = feFpNegate;
ECFieldElementFp.prototype.add = feFpAdd;
ECFieldElementFp.prototype.subtract = feFpSubtract;
ECFieldElementFp.prototype.multiply = feFpMultiply;
ECFieldElementFp.prototype.square = feFpSquare;
ECFieldElementFp.prototype.divide = feFpDivide;
function ECPointFp(c, a, d, b) {
  this.curve = c;
  this.x = a;
  this.y = d;
  if (b == null) {
    this.z = BigInteger.ONE;
  } else {
    this.z = b;
  }
  this.zinv = null;
}
function pointFpGetX() {
  if (this.zinv == null) {
    this.zinv = this.z.modInverse(this.curve.q);
  }
  return this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q));
}
function pointFpGetY() {
  if (this.zinv == null) {
    this.zinv = this.z.modInverse(this.curve.q);
  }
  return this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q));
}
function pointFpEquals(a) {
  if (a == this) {
    return true;
  }
  if (this.isInfinity()) {
    return a.isInfinity();
  }
  if (a.isInfinity()) {
    return this.isInfinity();
  }
  var c, b;
  c = a.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(a.z)).mod(this.curve.q);
  if (!c.equals(BigInteger.ZERO)) {
    return false;
  }
  b = a.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(a.z)).mod(this.curve.q);
  return b.equals(BigInteger.ZERO);
}
function pointFpIsInfinity() {
  if (this.x == null && this.y == null) {
    return true;
  }
  return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO);
}
function pointFpNegate() {
  return new ECPointFp(this.curve, this.x, this.y.negate(), this.z);
}
function pointFpAdd(l) {
  if (this.isInfinity()) {
    return l;
  }
  if (l.isInfinity()) {
    return this;
  }
  var p = l.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(l.z)).mod(this.curve.q);
  var o = l.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(l.z)).mod(this.curve.q);
  if (BigInteger.ZERO.equals(o)) {
    if (BigInteger.ZERO.equals(p)) {
      return this.twice();
    }
    return this.curve.getInfinity();
  }
  var j = new BigInteger("3");
  var e = this.x.toBigInteger();
  var n = this.y.toBigInteger();
  l.x.toBigInteger();
  l.y.toBigInteger();
  var m = o.square();
  var i = m.multiply(o);
  var d = e.multiply(m);
  var g = p.square().multiply(this.z);
  var a = g.subtract(d.shiftLeft(1)).multiply(l.z).subtract(i).multiply(o).mod(this.curve.q);
  var h2 = d.multiply(j).multiply(p).subtract(n.multiply(i)).subtract(g.multiply(p)).multiply(l.z).add(p.multiply(i)).mod(this.curve.q);
  var f = i.multiply(this.z).multiply(l.z).mod(this.curve.q);
  return new ECPointFp(this.curve, this.curve.fromBigInteger(a), this.curve.fromBigInteger(h2), f);
}
function pointFpTwice() {
  if (this.isInfinity()) {
    return this;
  }
  if (this.y.toBigInteger().signum() == 0) {
    return this.curve.getInfinity();
  }
  var g = new BigInteger("3");
  var c = this.x.toBigInteger();
  var h2 = this.y.toBigInteger();
  var e = h2.multiply(this.z);
  var j = e.multiply(h2).mod(this.curve.q);
  var i = this.curve.a.toBigInteger();
  var k = c.square().multiply(g);
  if (!BigInteger.ZERO.equals(i)) {
    k = k.add(this.z.square().multiply(i));
  }
  k = k.mod(this.curve.q);
  var b = k.square().subtract(c.shiftLeft(3).multiply(j)).shiftLeft(1).multiply(e).mod(this.curve.q);
  var f = k.multiply(g).multiply(c).subtract(j.shiftLeft(1)).shiftLeft(2).multiply(j).subtract(k.square().multiply(k)).mod(this.curve.q);
  var d = e.square().multiply(e).shiftLeft(3).mod(this.curve.q);
  return new ECPointFp(this.curve, this.curve.fromBigInteger(b), this.curve.fromBigInteger(f), d);
}
function pointFpMultiply(b) {
  if (this.isInfinity()) {
    return this;
  }
  if (b.signum() == 0) {
    return this.curve.getInfinity();
  }
  var g = b;
  var f = g.multiply(new BigInteger("3"));
  var l = this.negate();
  var d = this;
  var c;
  for (c = f.bitLength() - 2; c > 0; --c) {
    d = d.twice();
    var a = f.testBit(c);
    var j = g.testBit(c);
    if (a != j) {
      d = d.add(a ? this : l);
    }
  }
  return d;
}
function pointFpMultiplyTwo(c, a, b) {
  var d;
  if (c.bitLength() > b.bitLength()) {
    d = c.bitLength() - 1;
  } else {
    d = b.bitLength() - 1;
  }
  var f = this.curve.getInfinity();
  var e = this.add(a);
  while (d >= 0) {
    f = f.twice();
    if (c.testBit(d)) {
      if (b.testBit(d)) {
        f = f.add(e);
      } else {
        f = f.add(this);
      }
    } else {
      if (b.testBit(d)) {
        f = f.add(a);
      }
    }
    --d;
  }
  return f;
}
ECPointFp.prototype.getX = pointFpGetX;
ECPointFp.prototype.getY = pointFpGetY;
ECPointFp.prototype.equals = pointFpEquals;
ECPointFp.prototype.isInfinity = pointFpIsInfinity;
ECPointFp.prototype.negate = pointFpNegate;
ECPointFp.prototype.add = pointFpAdd;
ECPointFp.prototype.twice = pointFpTwice;
ECPointFp.prototype.multiply = pointFpMultiply;
ECPointFp.prototype.multiplyTwo = pointFpMultiplyTwo;
function ECCurveFp(e, d, c) {
  this.q = e;
  this.a = this.fromBigInteger(d);
  this.b = this.fromBigInteger(c);
  this.infinity = new ECPointFp(this, null, null);
}
function curveFpGetQ() {
  return this.q;
}
function curveFpGetA() {
  return this.a;
}
function curveFpGetB() {
  return this.b;
}
function curveFpEquals(a) {
  if (a == this) {
    return true;
  }
  return this.q.equals(a.q) && this.a.equals(a.a) && this.b.equals(a.b);
}
function curveFpGetInfinity() {
  return this.infinity;
}
function curveFpFromBigInteger(a) {
  return new ECFieldElementFp(this.q, a);
}
function curveFpDecodePointHex(d) {
  switch (parseInt(d.substr(0, 2), 16)) {
    case 0:
      return this.infinity;
    case 2:
    case 3:
      return null;
    case 4:
    case 6:
    case 7:
      var a = (d.length - 2) / 2;
      var c = d.substr(2, a);
      var b = d.substr(a + 2, a);
      return new ECPointFp(this, this.fromBigInteger(new BigInteger(c, 16)), this.fromBigInteger(new BigInteger(b, 16)));
    default:
      return null;
  }
}
ECCurveFp.prototype.getQ = curveFpGetQ;
ECCurveFp.prototype.getA = curveFpGetA;
ECCurveFp.prototype.getB = curveFpGetB;
ECCurveFp.prototype.equals = curveFpEquals;
ECCurveFp.prototype.getInfinity = curveFpGetInfinity;
ECCurveFp.prototype.fromBigInteger = curveFpFromBigInteger;
ECCurveFp.prototype.decodePointHex = curveFpDecodePointHex;
/*! (c) Stefan Thomas | https://github.com/bitcoinjs/bitcoinjs-lib
 */
ECFieldElementFp.prototype.getByteLength = function() {
  return Math.floor((this.toBigInteger().bitLength() + 7) / 8);
};
ECPointFp.prototype.getEncoded = function(c) {
  var d = function(h2, f) {
    var g = h2.toByteArrayUnsigned();
    if (f < g.length) {
      g = g.slice(g.length - f);
    } else {
      while (f > g.length) {
        g.unshift(0);
      }
    }
    return g;
  };
  var a = this.getX().toBigInteger();
  var e = this.getY().toBigInteger();
  var b = d(a, 32);
  if (c) {
    if (e.isEven()) {
      b.unshift(2);
    } else {
      b.unshift(3);
    }
  } else {
    b.unshift(4);
    b = b.concat(d(e, 32));
  }
  return b;
};
ECPointFp.decodeFrom = function(g, c) {
  c[0];
  var e = c.length - 1;
  var d = c.slice(1, 1 + e / 2);
  var b = c.slice(1 + e / 2, 1 + e);
  d.unshift(0);
  b.unshift(0);
  var a = new BigInteger(d);
  var h2 = new BigInteger(b);
  return new ECPointFp(g, g.fromBigInteger(a), g.fromBigInteger(h2));
};
ECPointFp.decodeFromHex = function(g, c) {
  c.substr(0, 2);
  var e = c.length - 2;
  var d = c.substr(2, e / 2);
  var b = c.substr(2 + e / 2, e / 2);
  var a = new BigInteger(d, 16);
  var h2 = new BigInteger(b, 16);
  return new ECPointFp(g, g.fromBigInteger(a), g.fromBigInteger(h2));
};
ECPointFp.prototype.add2D = function(c) {
  if (this.isInfinity()) {
    return c;
  }
  if (c.isInfinity()) {
    return this;
  }
  if (this.x.equals(c.x)) {
    if (this.y.equals(c.y)) {
      return this.twice();
    }
    return this.curve.getInfinity();
  }
  var g = c.x.subtract(this.x);
  var e = c.y.subtract(this.y);
  var a = e.divide(g);
  var d = a.square().subtract(this.x).subtract(c.x);
  var f = a.multiply(this.x.subtract(d)).subtract(this.y);
  return new ECPointFp(this.curve, d, f);
};
ECPointFp.prototype.twice2D = function() {
  if (this.isInfinity()) {
    return this;
  }
  if (this.y.toBigInteger().signum() == 0) {
    return this.curve.getInfinity();
  }
  var b = this.curve.fromBigInteger(BigInteger.valueOf(2));
  var e = this.curve.fromBigInteger(BigInteger.valueOf(3));
  var a = this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(b));
  var c = a.square().subtract(this.x.multiply(b));
  var d = a.multiply(this.x.subtract(c)).subtract(this.y);
  return new ECPointFp(this.curve, c, d);
};
ECPointFp.prototype.multiply2D = function(b) {
  if (this.isInfinity()) {
    return this;
  }
  if (b.signum() == 0) {
    return this.curve.getInfinity();
  }
  var g = b;
  var f = g.multiply(new BigInteger("3"));
  var l = this.negate();
  var d = this;
  var c;
  for (c = f.bitLength() - 2; c > 0; --c) {
    d = d.twice();
    var a = f.testBit(c);
    var j = g.testBit(c);
    if (a != j) {
      d = d.add2D(a ? this : l);
    }
  }
  return d;
};
ECPointFp.prototype.isOnCurve = function() {
  var d = this.getX().toBigInteger();
  var i = this.getY().toBigInteger();
  var f = this.curve.getA().toBigInteger();
  var c = this.curve.getB().toBigInteger();
  var h2 = this.curve.getQ();
  var e = i.multiply(i).mod(h2);
  var g = d.multiply(d).multiply(d).add(f.multiply(d)).add(c).mod(h2);
  return e.equals(g);
};
ECPointFp.prototype.toString = function() {
  return "(" + this.getX().toBigInteger().toString() + "," + this.getY().toBigInteger().toString() + ")";
};
ECPointFp.prototype.validate = function() {
  var c = this.curve.getQ();
  if (this.isInfinity()) {
    throw new Error("Point is at infinity.");
  }
  var a = this.getX().toBigInteger();
  var b = this.getY().toBigInteger();
  if (a.compareTo(BigInteger.ONE) < 0 || a.compareTo(c.subtract(BigInteger.ONE)) > 0) {
    throw new Error("x coordinate out of bounds");
  }
  if (b.compareTo(BigInteger.ONE) < 0 || b.compareTo(c.subtract(BigInteger.ONE)) > 0) {
    throw new Error("y coordinate out of bounds");
  }
  if (!this.isOnCurve()) {
    throw new Error("Point is not on the curve.");
  }
  if (this.multiply(c).isInfinity()) {
    throw new Error("Point is not a scalar multiple of G.");
  }
  return true;
};
/*! Mike Samuel (c) 2009 | code.google.com/p/json-sans-eval
 */
var jsonParse = function() {
  var e = "(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)";
  var j = '(?:[^\\0-\\x08\\x0a-\\x1f"\\\\]|\\\\(?:["/\\\\bfnrt]|u[0-9A-Fa-f]{4}))';
  var i = '(?:"' + j + '*")';
  var d = new RegExp("(?:false|true|null|[\\{\\}\\[\\]]|" + e + "|" + i + ")", "g");
  var k = new RegExp("\\\\(?:([^u])|u(.{4}))", "g");
  var g = { '"': '"', "/": "/", "\\": "\\", b: "\b", f: "\f", n: "\n", r: "\r", t: "	" };
  function h2(l, m, n) {
    return m ? g[m] : String.fromCharCode(parseInt(n, 16));
  }
  var c = new String("");
  var a = "\\";
  var b = Object.hasOwnProperty;
  return function(u, q) {
    var p = u.match(d);
    var x;
    var v = p[0];
    var l = false;
    if (v === "{") {
      x = {};
    } else {
      if (v === "[") {
        x = [];
      } else {
        x = [];
        l = true;
      }
    }
    var t;
    var r = [x];
    for (var o = 1 - l, m = p.length; o < m; ++o) {
      v = p[o];
      var w;
      switch (v.charCodeAt(0)) {
        default:
          w = r[0];
          w[t || w.length] = +v;
          t = void 0;
          break;
        case 34:
          v = v.substring(1, v.length - 1);
          if (v.indexOf(a) !== -1) {
            v = v.replace(k, h2);
          }
          w = r[0];
          if (!t) {
            if (w instanceof Array) {
              t = w.length;
            } else {
              t = v || c;
              break;
            }
          }
          w[t] = v;
          t = void 0;
          break;
        case 91:
          w = r[0];
          r.unshift(w[t || w.length] = []);
          t = void 0;
          break;
        case 93:
          r.shift();
          break;
        case 102:
          w = r[0];
          w[t || w.length] = false;
          t = void 0;
          break;
        case 110:
          w = r[0];
          w[t || w.length] = null;
          t = void 0;
          break;
        case 116:
          w = r[0];
          w[t || w.length] = true;
          t = void 0;
          break;
        case 123:
          w = r[0];
          r.unshift(w[t || w.length] = {});
          t = void 0;
          break;
        case 125:
          r.shift();
          break;
      }
    }
    if (l) {
      if (r.length !== 1) {
        throw new Error();
      }
      x = x[0];
    } else {
      if (r.length) {
        throw new Error();
      }
    }
    if (q) {
      var s = function(C, B) {
        var D = C[B];
        if (D && typeof D === "object") {
          var n = null;
          for (var z in D) {
            if (b.call(D, z) && D !== C) {
              var y = s(D, z);
              if (y !== void 0) {
                D[z] = y;
              } else {
                if (!n) {
                  n = [];
                }
                n.push(z);
              }
            }
          }
          if (n) {
            for (var A = n.length; --A >= 0; ) {
              delete D[n[A]];
            }
          }
        }
        return q.call(C, B, D);
      };
      x = s({ "": x }, "");
    }
    return x;
  };
}();
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {};
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
  KJUR.asn1 = {};
}
KJUR.asn1.ASN1Util = new function() {
  this.integerToByteHex = function(a) {
    var b = a.toString(16);
    if (b.length % 2 == 1) {
      b = "0" + b;
    }
    return b;
  };
  this.bigIntToMinTwosComplementsHex = function(j) {
    var f = j.toString(16);
    if (f.substr(0, 1) != "-") {
      if (f.length % 2 == 1) {
        f = "0" + f;
      } else {
        if (!f.match(/^[0-7]/)) {
          f = "00" + f;
        }
      }
    } else {
      var a = f.substr(1);
      var e = a.length;
      if (e % 2 == 1) {
        e += 1;
      } else {
        if (!f.match(/^[0-7]/)) {
          e += 2;
        }
      }
      var g = "";
      for (var d = 0; d < e; d++) {
        g += "f";
      }
      var c = new BigInteger(g, 16);
      var b = c.xor(j).add(BigInteger.ONE);
      f = b.toString(16).replace(/^-/, "");
    }
    return f;
  };
  this.getPEMStringFromHex = function(a, b) {
    return hextopem(a, b);
  };
  this.newObject = function(k) {
    var D = KJUR, n = D.asn1, z = n.DERBoolean, e = n.DERInteger, s = n.DERBitString, h2 = n.DEROctetString, v = n.DERNull, w = n.DERObjectIdentifier, l = n.DEREnumerated, g = n.DERUTF8String, f = n.DERNumericString, y = n.DERPrintableString, u = n.DERTeletexString, p = n.DERIA5String, C = n.DERUTCTime, j = n.DERGeneralizedTime, m = n.DERSequence, c = n.DERSet, r = n.DERTaggedObject, o = n.ASN1Util.newObject;
    var t = Object.keys(k);
    if (t.length != 1) {
      throw "key of param shall be only one.";
    }
    var F = t[0];
    if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":" + F + ":") == -1) {
      throw "undefined key: " + F;
    }
    if (F == "bool") {
      return new z(k[F]);
    }
    if (F == "int") {
      return new e(k[F]);
    }
    if (F == "bitstr") {
      return new s(k[F]);
    }
    if (F == "octstr") {
      return new h2(k[F]);
    }
    if (F == "null") {
      return new v(k[F]);
    }
    if (F == "oid") {
      return new w(k[F]);
    }
    if (F == "enum") {
      return new l(k[F]);
    }
    if (F == "utf8str") {
      return new g(k[F]);
    }
    if (F == "numstr") {
      return new f(k[F]);
    }
    if (F == "prnstr") {
      return new y(k[F]);
    }
    if (F == "telstr") {
      return new u(k[F]);
    }
    if (F == "ia5str") {
      return new p(k[F]);
    }
    if (F == "utctime") {
      return new C(k[F]);
    }
    if (F == "gentime") {
      return new j(k[F]);
    }
    if (F == "seq") {
      var d = k[F];
      var E = [];
      for (var x = 0; x < d.length; x++) {
        var B = o(d[x]);
        E.push(B);
      }
      return new m({ array: E });
    }
    if (F == "set") {
      var d = k[F];
      var E = [];
      for (var x = 0; x < d.length; x++) {
        var B = o(d[x]);
        E.push(B);
      }
      return new c({ array: E });
    }
    if (F == "tag") {
      var A = k[F];
      if (Object.prototype.toString.call(A) === "[object Array]" && A.length == 3) {
        var q = o(A[2]);
        return new r({ tag: A[0], explicit: A[1], obj: q });
      } else {
        var b = {};
        if (A.explicit !== void 0) {
          b.explicit = A.explicit;
        }
        if (A.tag !== void 0) {
          b.tag = A.tag;
        }
        if (A.obj === void 0) {
          throw "obj shall be specified for 'tag'.";
        }
        b.obj = o(A.obj);
        return new r(b);
      }
    }
  };
  this.jsonToASN1HEX = function(b) {
    var a = this.newObject(b);
    return a.getEncodedHex();
  };
}();
KJUR.asn1.ASN1Util.oidHexToInt = function(a) {
  var j = "";
  var k = parseInt(a.substr(0, 2), 16);
  var d = Math.floor(k / 40);
  var c = k % 40;
  var j = d + "." + c;
  var e = "";
  for (var f = 2; f < a.length; f += 2) {
    var g = parseInt(a.substr(f, 2), 16);
    var h2 = ("00000000" + g.toString(2)).slice(-8);
    e = e + h2.substr(1, 7);
    if (h2.substr(0, 1) == "0") {
      var b = new BigInteger(e, 2);
      j = j + "." + b.toString(10);
      e = "";
    }
  }
  return j;
};
KJUR.asn1.ASN1Util.oidIntToHex = function(f) {
  var e = function(a) {
    var k = a.toString(16);
    if (k.length == 1) {
      k = "0" + k;
    }
    return k;
  };
  var d = function(o) {
    var n = "";
    var k = new BigInteger(o, 10);
    var a = k.toString(2);
    var l = 7 - a.length % 7;
    if (l == 7) {
      l = 0;
    }
    var q = "";
    for (var m = 0; m < l; m++) {
      q += "0";
    }
    a = q + a;
    for (var m = 0; m < a.length - 1; m += 7) {
      var p = a.substr(m, 7);
      if (m != a.length - 7) {
        p = "1" + p;
      }
      n += e(parseInt(p, 2));
    }
    return n;
  };
  if (!f.match(/^[0-9.]+$/)) {
    throw "malformed oid string: " + f;
  }
  var g = "";
  var b = f.split(".");
  var j = parseInt(b[0]) * 40 + parseInt(b[1]);
  g += e(j);
  b.splice(0, 2);
  for (var c = 0; c < b.length; c++) {
    g += d(b[c]);
  }
  return g;
};
KJUR.asn1.ASN1Object = function() {
  var a = "";
  this.getLengthHexFromValue = function() {
    if (typeof this.hV == "undefined" || this.hV == null) {
      throw "this.hV is null or undefined.";
    }
    if (this.hV.length % 2 == 1) {
      throw "value hex must be even length: n=" + a.length + ",v=" + this.hV;
    }
    var i = this.hV.length / 2;
    var h2 = i.toString(16);
    if (h2.length % 2 == 1) {
      h2 = "0" + h2;
    }
    if (i < 128) {
      return h2;
    } else {
      var g = h2.length / 2;
      if (g > 15) {
        throw "ASN.1 length too long to represent by 8x: n = " + i.toString(16);
      }
      var f = 128 + g;
      return f.toString(16) + h2;
    }
  };
  this.getEncodedHex = function() {
    if (this.hTLV == null || this.isModified) {
      this.hV = this.getFreshValueHex();
      this.hL = this.getLengthHexFromValue();
      this.hTLV = this.hT + this.hL + this.hV;
      this.isModified = false;
    }
    return this.hTLV;
  };
  this.getValueHex = function() {
    this.getEncodedHex();
    return this.hV;
  };
  this.getFreshValueHex = function() {
    return "";
  };
};
KJUR.asn1.DERAbstractString = function(c) {
  KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
  this.getString = function() {
    return this.s;
  };
  this.setString = function(d) {
    this.hTLV = null;
    this.isModified = true;
    this.s = d;
    this.hV = stohex(this.s);
  };
  this.setStringHex = function(d) {
    this.hTLV = null;
    this.isModified = true;
    this.s = null;
    this.hV = d;
  };
  this.getFreshValueHex = function() {
    return this.hV;
  };
  if (typeof c != "undefined") {
    if (typeof c == "string") {
      this.setString(c);
    } else {
      if (typeof c.str != "undefined") {
        this.setString(c.str);
      } else {
        if (typeof c.hex != "undefined") {
          this.setStringHex(c.hex);
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object);
KJUR.asn1.DERAbstractTime = function(c) {
  KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);
  this.localDateToUTC = function(f) {
    utc = f.getTime() + f.getTimezoneOffset() * 6e4;
    var e = new Date(utc);
    return e;
  };
  this.formatDate = function(m, o, e) {
    var g = this.zeroPadding;
    var n = this.localDateToUTC(m);
    var p = String(n.getFullYear());
    if (o == "utc") {
      p = p.substr(2, 2);
    }
    var l = g(String(n.getMonth() + 1), 2);
    var q = g(String(n.getDate()), 2);
    var h2 = g(String(n.getHours()), 2);
    var i = g(String(n.getMinutes()), 2);
    var j = g(String(n.getSeconds()), 2);
    var r = p + l + q + h2 + i + j;
    if (e === true) {
      var f = n.getMilliseconds();
      if (f != 0) {
        var k = g(String(f), 3);
        k = k.replace(/[0]+$/, "");
        r = r + "." + k;
      }
    }
    return r + "Z";
  };
  this.zeroPadding = function(e, d) {
    if (e.length >= d) {
      return e;
    }
    return new Array(d - e.length + 1).join("0") + e;
  };
  this.getString = function() {
    return this.s;
  };
  this.setString = function(d) {
    this.hTLV = null;
    this.isModified = true;
    this.s = d;
    this.hV = stohex(d);
  };
  this.setByDateValue = function(h2, j, e, d, f, g) {
    var i = new Date(Date.UTC(h2, j - 1, e, d, f, g, 0));
    this.setByDate(i);
  };
  this.getFreshValueHex = function() {
    return this.hV;
  };
};
YAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object);
KJUR.asn1.DERAbstractStructured = function(b) {
  KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
  this.setByASN1ObjectArray = function(c) {
    this.hTLV = null;
    this.isModified = true;
    this.asn1Array = c;
  };
  this.appendASN1Object = function(c) {
    this.hTLV = null;
    this.isModified = true;
    this.asn1Array.push(c);
  };
  this.asn1Array = new Array();
  if (typeof b != "undefined") {
    if (typeof b.array != "undefined") {
      this.asn1Array = b.array;
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object);
KJUR.asn1.DERBoolean = function() {
  KJUR.asn1.DERBoolean.superclass.constructor.call(this);
  this.hT = "01";
  this.hTLV = "0101ff";
};
YAHOO.lang.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object);
KJUR.asn1.DERInteger = function(a) {
  KJUR.asn1.DERInteger.superclass.constructor.call(this);
  this.hT = "02";
  this.setByBigInteger = function(b) {
    this.hTLV = null;
    this.isModified = true;
    this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b);
  };
  this.setByInteger = function(c) {
    var b = new BigInteger(String(c), 10);
    this.setByBigInteger(b);
  };
  this.setValueHex = function(b) {
    this.hV = b;
  };
  this.getFreshValueHex = function() {
    return this.hV;
  };
  if (typeof a != "undefined") {
    if (typeof a.bigint != "undefined") {
      this.setByBigInteger(a.bigint);
    } else {
      if (typeof a["int"] != "undefined") {
        this.setByInteger(a["int"]);
      } else {
        if (typeof a == "number") {
          this.setByInteger(a);
        } else {
          if (typeof a.hex != "undefined") {
            this.setValueHex(a.hex);
          }
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object);
KJUR.asn1.DERBitString = function(b) {
  if (b !== void 0 && typeof b.obj !== "undefined") {
    var a = KJUR.asn1.ASN1Util.newObject(b.obj);
    b.hex = "00" + a.getEncodedHex();
  }
  KJUR.asn1.DERBitString.superclass.constructor.call(this);
  this.hT = "03";
  this.setHexValueIncludingUnusedBits = function(c) {
    this.hTLV = null;
    this.isModified = true;
    this.hV = c;
  };
  this.setUnusedBitsAndHexValue = function(c, e) {
    if (c < 0 || 7 < c) {
      throw "unused bits shall be from 0 to 7: u = " + c;
    }
    var d = "0" + c;
    this.hTLV = null;
    this.isModified = true;
    this.hV = d + e;
  };
  this.setByBinaryString = function(e) {
    e = e.replace(/0+$/, "");
    var f = 8 - e.length % 8;
    if (f == 8) {
      f = 0;
    }
    for (var g = 0; g <= f; g++) {
      e += "0";
    }
    var j = "";
    for (var g = 0; g < e.length - 1; g += 8) {
      var d = e.substr(g, 8);
      var c = parseInt(d, 2).toString(16);
      if (c.length == 1) {
        c = "0" + c;
      }
      j += c;
    }
    this.hTLV = null;
    this.isModified = true;
    this.hV = "0" + f + j;
  };
  this.setByBooleanArray = function(e) {
    var d = "";
    for (var c = 0; c < e.length; c++) {
      if (e[c] == true) {
        d += "1";
      } else {
        d += "0";
      }
    }
    this.setByBinaryString(d);
  };
  this.newFalseArray = function(e) {
    var c = new Array(e);
    for (var d = 0; d < e; d++) {
      c[d] = false;
    }
    return c;
  };
  this.getFreshValueHex = function() {
    return this.hV;
  };
  if (typeof b != "undefined") {
    if (typeof b == "string" && b.toLowerCase().match(/^[0-9a-f]+$/)) {
      this.setHexValueIncludingUnusedBits(b);
    } else {
      if (typeof b.hex != "undefined") {
        this.setHexValueIncludingUnusedBits(b.hex);
      } else {
        if (typeof b.bin != "undefined") {
          this.setByBinaryString(b.bin);
        } else {
          if (typeof b.array != "undefined") {
            this.setByBooleanArray(b.array);
          }
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object);
KJUR.asn1.DEROctetString = function(b) {
  if (b !== void 0 && typeof b.obj !== "undefined") {
    var a = KJUR.asn1.ASN1Util.newObject(b.obj);
    b.hex = a.getEncodedHex();
  }
  KJUR.asn1.DEROctetString.superclass.constructor.call(this, b);
  this.hT = "04";
};
YAHOO.lang.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERNull = function() {
  KJUR.asn1.DERNull.superclass.constructor.call(this);
  this.hT = "05";
  this.hTLV = "0500";
};
YAHOO.lang.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object);
KJUR.asn1.DERObjectIdentifier = function(c) {
  var b = function(d) {
    var e = d.toString(16);
    if (e.length == 1) {
      e = "0" + e;
    }
    return e;
  };
  var a = function(k) {
    var j = "";
    var e = new BigInteger(k, 10);
    var d = e.toString(2);
    var f = 7 - d.length % 7;
    if (f == 7) {
      f = 0;
    }
    var m = "";
    for (var g = 0; g < f; g++) {
      m += "0";
    }
    d = m + d;
    for (var g = 0; g < d.length - 1; g += 7) {
      var l = d.substr(g, 7);
      if (g != d.length - 7) {
        l = "1" + l;
      }
      j += b(parseInt(l, 2));
    }
    return j;
  };
  KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);
  this.hT = "06";
  this.setValueHex = function(d) {
    this.hTLV = null;
    this.isModified = true;
    this.s = null;
    this.hV = d;
  };
  this.setValueOidString = function(f) {
    if (!f.match(/^[0-9.]+$/)) {
      throw "malformed oid string: " + f;
    }
    var g = "";
    var d = f.split(".");
    var j = parseInt(d[0]) * 40 + parseInt(d[1]);
    g += b(j);
    d.splice(0, 2);
    for (var e = 0; e < d.length; e++) {
      g += a(d[e]);
    }
    this.hTLV = null;
    this.isModified = true;
    this.s = null;
    this.hV = g;
  };
  this.setValueName = function(e) {
    var d = KJUR.asn1.x509.OID.name2oid(e);
    if (d !== "") {
      this.setValueOidString(d);
    } else {
      throw "DERObjectIdentifier oidName undefined: " + e;
    }
  };
  this.getFreshValueHex = function() {
    return this.hV;
  };
  if (c !== void 0) {
    if (typeof c === "string") {
      if (c.match(/^[0-2].[0-9.]+$/)) {
        this.setValueOidString(c);
      } else {
        this.setValueName(c);
      }
    } else {
      if (c.oid !== void 0) {
        this.setValueOidString(c.oid);
      } else {
        if (c.hex !== void 0) {
          this.setValueHex(c.hex);
        } else {
          if (c.name !== void 0) {
            this.setValueName(c.name);
          }
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object);
KJUR.asn1.DEREnumerated = function(a) {
  KJUR.asn1.DEREnumerated.superclass.constructor.call(this);
  this.hT = "0a";
  this.setByBigInteger = function(b) {
    this.hTLV = null;
    this.isModified = true;
    this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b);
  };
  this.setByInteger = function(c) {
    var b = new BigInteger(String(c), 10);
    this.setByBigInteger(b);
  };
  this.setValueHex = function(b) {
    this.hV = b;
  };
  this.getFreshValueHex = function() {
    return this.hV;
  };
  if (typeof a != "undefined") {
    if (typeof a["int"] != "undefined") {
      this.setByInteger(a["int"]);
    } else {
      if (typeof a == "number") {
        this.setByInteger(a);
      } else {
        if (typeof a.hex != "undefined") {
          this.setValueHex(a.hex);
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object);
KJUR.asn1.DERUTF8String = function(a) {
  KJUR.asn1.DERUTF8String.superclass.constructor.call(this, a);
  this.hT = "0c";
};
YAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERNumericString = function(a) {
  KJUR.asn1.DERNumericString.superclass.constructor.call(this, a);
  this.hT = "12";
};
YAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERPrintableString = function(a) {
  KJUR.asn1.DERPrintableString.superclass.constructor.call(this, a);
  this.hT = "13";
};
YAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERTeletexString = function(a) {
  KJUR.asn1.DERTeletexString.superclass.constructor.call(this, a);
  this.hT = "14";
};
YAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERIA5String = function(a) {
  KJUR.asn1.DERIA5String.superclass.constructor.call(this, a);
  this.hT = "16";
};
YAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERUTCTime = function(a) {
  KJUR.asn1.DERUTCTime.superclass.constructor.call(this, a);
  this.hT = "17";
  this.setByDate = function(b) {
    this.hTLV = null;
    this.isModified = true;
    this.date = b;
    this.s = this.formatDate(this.date, "utc");
    this.hV = stohex(this.s);
  };
  this.getFreshValueHex = function() {
    if (typeof this.date == "undefined" && typeof this.s == "undefined") {
      this.date = new Date();
      this.s = this.formatDate(this.date, "utc");
      this.hV = stohex(this.s);
    }
    return this.hV;
  };
  if (a !== void 0) {
    if (a.str !== void 0) {
      this.setString(a.str);
    } else {
      if (typeof a == "string" && a.match(/^[0-9]{12}Z$/)) {
        this.setString(a);
      } else {
        if (a.hex !== void 0) {
          this.setStringHex(a.hex);
        } else {
          if (a.date !== void 0) {
            this.setByDate(a.date);
          }
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime);
KJUR.asn1.DERGeneralizedTime = function(a) {
  KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, a);
  this.hT = "18";
  this.withMillis = false;
  this.setByDate = function(b) {
    this.hTLV = null;
    this.isModified = true;
    this.date = b;
    this.s = this.formatDate(this.date, "gen", this.withMillis);
    this.hV = stohex(this.s);
  };
  this.getFreshValueHex = function() {
    if (this.date === void 0 && this.s === void 0) {
      this.date = new Date();
      this.s = this.formatDate(this.date, "gen", this.withMillis);
      this.hV = stohex(this.s);
    }
    return this.hV;
  };
  if (a !== void 0) {
    if (a.str !== void 0) {
      this.setString(a.str);
    } else {
      if (typeof a == "string" && a.match(/^[0-9]{14}Z$/)) {
        this.setString(a);
      } else {
        if (a.hex !== void 0) {
          this.setStringHex(a.hex);
        } else {
          if (a.date !== void 0) {
            this.setByDate(a.date);
          }
        }
      }
    }
    if (a.millis === true) {
      this.withMillis = true;
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime);
KJUR.asn1.DERSequence = function(a) {
  KJUR.asn1.DERSequence.superclass.constructor.call(this, a);
  this.hT = "30";
  this.getFreshValueHex = function() {
    var c = "";
    for (var b = 0; b < this.asn1Array.length; b++) {
      var d = this.asn1Array[b];
      c += d.getEncodedHex();
    }
    this.hV = c;
    return this.hV;
  };
};
YAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured);
KJUR.asn1.DERSet = function(a) {
  KJUR.asn1.DERSet.superclass.constructor.call(this, a);
  this.hT = "31";
  this.sortFlag = true;
  this.getFreshValueHex = function() {
    var b = new Array();
    for (var c = 0; c < this.asn1Array.length; c++) {
      var d = this.asn1Array[c];
      b.push(d.getEncodedHex());
    }
    if (this.sortFlag == true) {
      b.sort();
    }
    this.hV = b.join("");
    return this.hV;
  };
  if (typeof a != "undefined") {
    if (typeof a.sortflag != "undefined" && a.sortflag == false) {
      this.sortFlag = false;
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured);
KJUR.asn1.DERTaggedObject = function(a) {
  KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);
  this.hT = "a0";
  this.hV = "";
  this.isExplicit = true;
  this.asn1Object = null;
  this.setASN1Object = function(b, c, d) {
    this.hT = c;
    this.isExplicit = b;
    this.asn1Object = d;
    if (this.isExplicit) {
      this.hV = this.asn1Object.getEncodedHex();
      this.hTLV = null;
      this.isModified = true;
    } else {
      this.hV = null;
      this.hTLV = d.getEncodedHex();
      this.hTLV = this.hTLV.replace(/^../, c);
      this.isModified = false;
    }
  };
  this.getFreshValueHex = function() {
    return this.hV;
  };
  if (typeof a != "undefined") {
    if (typeof a.tag != "undefined") {
      this.hT = a.tag;
    }
    if (typeof a.explicit != "undefined") {
      this.isExplicit = a.explicit;
    }
    if (typeof a.obj != "undefined") {
      this.asn1Object = a.obj;
      this.setASN1Object(this.isExplicit, this.hT, this.asn1Object);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object);
var ASN1HEX = new function() {
}();
ASN1HEX.getLblen = function(c, a) {
  if (c.substr(a + 2, 1) != "8") {
    return 1;
  }
  var b = parseInt(c.substr(a + 3, 1));
  if (b == 0) {
    return -1;
  }
  if (0 < b && b < 10) {
    return b + 1;
  }
  return -2;
};
ASN1HEX.getL = function(c, b) {
  var a = ASN1HEX.getLblen(c, b);
  if (a < 1) {
    return "";
  }
  return c.substr(b + 2, a * 2);
};
ASN1HEX.getVblen = function(d, a) {
  var c, b;
  c = ASN1HEX.getL(d, a);
  if (c == "") {
    return -1;
  }
  if (c.substr(0, 1) === "8") {
    b = new BigInteger(c.substr(2), 16);
  } else {
    b = new BigInteger(c, 16);
  }
  return b.intValue();
};
ASN1HEX.getVidx = function(c, b) {
  var a = ASN1HEX.getLblen(c, b);
  if (a < 0) {
    return a;
  }
  return b + (a + 1) * 2;
};
ASN1HEX.getV = function(d, a) {
  var c = ASN1HEX.getVidx(d, a);
  var b = ASN1HEX.getVblen(d, a);
  return d.substr(c, b * 2);
};
ASN1HEX.getTLV = function(b, a) {
  return b.substr(a, 2) + ASN1HEX.getL(b, a) + ASN1HEX.getV(b, a);
};
ASN1HEX.getNextSiblingIdx = function(d, a) {
  var c = ASN1HEX.getVidx(d, a);
  var b = ASN1HEX.getVblen(d, a);
  return c + b * 2;
};
ASN1HEX.getChildIdx = function(e, f) {
  var j = ASN1HEX;
  var g = new Array();
  var i = j.getVidx(e, f);
  if (e.substr(f, 2) == "03") {
    g.push(i + 2);
  } else {
    g.push(i);
  }
  var l = j.getVblen(e, f);
  var c = i;
  var d = 0;
  while (1) {
    var b = j.getNextSiblingIdx(e, c);
    if (b == null || b - i >= l * 2) {
      break;
    }
    if (d >= 200) {
      break;
    }
    g.push(b);
    c = b;
    d++;
  }
  return g;
};
ASN1HEX.getNthChildIdx = function(d, b, e) {
  var c = ASN1HEX.getChildIdx(d, b);
  return c[e];
};
ASN1HEX.getIdxbyList = function(e, d, c, i) {
  var g = ASN1HEX;
  var f, b;
  if (c.length == 0) {
    if (i !== void 0) {
      if (e.substr(d, 2) !== i) {
        throw "checking tag doesn't match: " + e.substr(d, 2) + "!=" + i;
      }
    }
    return d;
  }
  f = c.shift();
  b = g.getChildIdx(e, d);
  return g.getIdxbyList(e, b[f], c, i);
};
ASN1HEX.getTLVbyList = function(d, c, b, f) {
  var e = ASN1HEX;
  var a = e.getIdxbyList(d, c, b);
  if (a === void 0) {
    throw "can't find nthList object";
  }
  if (f !== void 0) {
    if (d.substr(a, 2) != f) {
      throw "checking tag doesn't match: " + d.substr(a, 2) + "!=" + f;
    }
  }
  return e.getTLV(d, a);
};
ASN1HEX.getVbyList = function(e, c, b, g, i) {
  var f = ASN1HEX;
  var a, d;
  a = f.getIdxbyList(e, c, b, g);
  if (a === void 0) {
    throw "can't find nthList object";
  }
  d = f.getV(e, a);
  if (i === true) {
    d = d.substr(2);
  }
  return d;
};
ASN1HEX.hextooidstr = function(e) {
  var h2 = function(b, a) {
    if (b.length >= a) {
      return b;
    }
    return new Array(a - b.length + 1).join("0") + b;
  };
  var l = [];
  var o = e.substr(0, 2);
  var f = parseInt(o, 16);
  l[0] = new String(Math.floor(f / 40));
  l[1] = new String(f % 40);
  var m = e.substr(2);
  var k = [];
  for (var g = 0; g < m.length / 2; g++) {
    k.push(parseInt(m.substr(g * 2, 2), 16));
  }
  var j = [];
  var d = "";
  for (var g = 0; g < k.length; g++) {
    if (k[g] & 128) {
      d = d + h2((k[g] & 127).toString(2), 7);
    } else {
      d = d + h2((k[g] & 127).toString(2), 7);
      j.push(new String(parseInt(d, 2)));
      d = "";
    }
  }
  var n = l.join(".");
  if (j.length > 0) {
    n = n + "." + j.join(".");
  }
  return n;
};
ASN1HEX.dump = function(t, c, l, g) {
  var p = ASN1HEX;
  var j = p.getV;
  var y = p.dump;
  var w = p.getChildIdx;
  var e = t;
  if (t instanceof KJUR.asn1.ASN1Object) {
    e = t.getEncodedHex();
  }
  var q = function(A, i) {
    if (A.length <= i * 2) {
      return A;
    } else {
      var v = A.substr(0, i) + "..(total " + A.length / 2 + "bytes).." + A.substr(A.length - i, i);
      return v;
    }
  };
  if (c === void 0) {
    c = { ommit_long_octet: 32 };
  }
  if (l === void 0) {
    l = 0;
  }
  if (g === void 0) {
    g = "";
  }
  var x = c.ommit_long_octet;
  if (e.substr(l, 2) == "01") {
    var h2 = j(e, l);
    if (h2 == "00") {
      return g + "BOOLEAN FALSE\n";
    } else {
      return g + "BOOLEAN TRUE\n";
    }
  }
  if (e.substr(l, 2) == "02") {
    var h2 = j(e, l);
    return g + "INTEGER " + q(h2, x) + "\n";
  }
  if (e.substr(l, 2) == "03") {
    var h2 = j(e, l);
    return g + "BITSTRING " + q(h2, x) + "\n";
  }
  if (e.substr(l, 2) == "04") {
    var h2 = j(e, l);
    if (p.isASN1HEX(h2)) {
      var k = g + "OCTETSTRING, encapsulates\n";
      k = k + y(h2, c, 0, g + "  ");
      return k;
    } else {
      return g + "OCTETSTRING " + q(h2, x) + "\n";
    }
  }
  if (e.substr(l, 2) == "05") {
    return g + "NULL\n";
  }
  if (e.substr(l, 2) == "06") {
    var m = j(e, l);
    var a = KJUR.asn1.ASN1Util.oidHexToInt(m);
    var o = KJUR.asn1.x509.OID.oid2name(a);
    var b = a.replace(/\./g, " ");
    if (o != "") {
      return g + "ObjectIdentifier " + o + " (" + b + ")\n";
    } else {
      return g + "ObjectIdentifier (" + b + ")\n";
    }
  }
  if (e.substr(l, 2) == "0c") {
    return g + "UTF8String '" + hextoutf8(j(e, l)) + "'\n";
  }
  if (e.substr(l, 2) == "13") {
    return g + "PrintableString '" + hextoutf8(j(e, l)) + "'\n";
  }
  if (e.substr(l, 2) == "14") {
    return g + "TeletexString '" + hextoutf8(j(e, l)) + "'\n";
  }
  if (e.substr(l, 2) == "16") {
    return g + "IA5String '" + hextoutf8(j(e, l)) + "'\n";
  }
  if (e.substr(l, 2) == "17") {
    return g + "UTCTime " + hextoutf8(j(e, l)) + "\n";
  }
  if (e.substr(l, 2) == "18") {
    return g + "GeneralizedTime " + hextoutf8(j(e, l)) + "\n";
  }
  if (e.substr(l, 2) == "30") {
    if (e.substr(l, 4) == "3000") {
      return g + "SEQUENCE {}\n";
    }
    var k = g + "SEQUENCE\n";
    var d = w(e, l);
    var f = c;
    if ((d.length == 2 || d.length == 3) && e.substr(d[0], 2) == "06" && e.substr(d[d.length - 1], 2) == "04") {
      var o = p.oidname(j(e, d[0]));
      var r = JSON.parse(JSON.stringify(c));
      r.x509ExtName = o;
      f = r;
    }
    for (var u = 0; u < d.length; u++) {
      k = k + y(e, f, d[u], g + "  ");
    }
    return k;
  }
  if (e.substr(l, 2) == "31") {
    var k = g + "SET\n";
    var d = w(e, l);
    for (var u = 0; u < d.length; u++) {
      k = k + y(e, c, d[u], g + "  ");
    }
    return k;
  }
  var z = parseInt(e.substr(l, 2), 16);
  if ((z & 128) != 0) {
    var n = z & 31;
    if ((z & 32) != 0) {
      var k = g + "[" + n + "]\n";
      var d = w(e, l);
      for (var u = 0; u < d.length; u++) {
        k = k + y(e, c, d[u], g + "  ");
      }
      return k;
    } else {
      var h2 = j(e, l);
      if (h2.substr(0, 8) == "68747470") {
        h2 = hextoutf8(h2);
      }
      if (c.x509ExtName === "subjectAltName" && n == 2) {
        h2 = hextoutf8(h2);
      }
      var k = g + "[" + n + "] " + h2 + "\n";
      return k;
    }
  }
  return g + "UNKNOWN(" + e.substr(l, 2) + ") " + j(e, l) + "\n";
};
ASN1HEX.isASN1HEX = function(e) {
  var d = ASN1HEX;
  if (e.length % 2 == 1) {
    return false;
  }
  var c = d.getVblen(e, 0);
  var b = e.substr(0, 2);
  var f = d.getL(e, 0);
  var a = e.length - b.length - f.length;
  if (a == c * 2) {
    return true;
  }
  return false;
};
ASN1HEX.oidname = function(a) {
  var c = KJUR.asn1;
  if (KJUR.lang.String.isHex(a)) {
    a = c.ASN1Util.oidHexToInt(a);
  }
  var b = c.x509.OID.oid2name(a);
  if (b === "") {
    b = a;
  }
  return b;
};
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {};
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
  KJUR.asn1 = {};
}
if (typeof KJUR.asn1.x509 == "undefined" || !KJUR.asn1.x509) {
  KJUR.asn1.x509 = {};
}
KJUR.asn1.x509.Certificate = function(e) {
  KJUR.asn1.x509.Certificate.superclass.constructor.call(this);
  var b = KJUR;
  b.crypto;
  var g = b.asn1, d = g.DERSequence, c = g.DERBitString;
  this.sign = function() {
    this.asn1SignatureAlg = this.asn1TBSCert.asn1SignatureAlg;
    var m = new KJUR.crypto.Signature({ alg: this.asn1SignatureAlg.nameAlg });
    m.init(this.prvKey);
    m.updateHex(this.asn1TBSCert.getEncodedHex());
    this.hexSig = m.sign();
    this.asn1Sig = new c({ hex: "00" + this.hexSig });
    var l = new d({ array: [this.asn1TBSCert, this.asn1SignatureAlg, this.asn1Sig] });
    this.hTLV = l.getEncodedHex();
    this.isModified = false;
  };
  this.setSignatureHex = function(l) {
    this.asn1SignatureAlg = this.asn1TBSCert.asn1SignatureAlg;
    this.hexSig = l;
    this.asn1Sig = new c({ hex: "00" + this.hexSig });
    var m = new d({ array: [this.asn1TBSCert, this.asn1SignatureAlg, this.asn1Sig] });
    this.hTLV = m.getEncodedHex();
    this.isModified = false;
  };
  this.getEncodedHex = function() {
    if (this.isModified == false && this.hTLV != null) {
      return this.hTLV;
    }
    throw "not signed yet";
  };
  this.getPEMString = function() {
    var l = hextob64nl(this.getEncodedHex());
    return "-----BEGIN CERTIFICATE-----\r\n" + l + "\r\n-----END CERTIFICATE-----\r\n";
  };
  if (e !== void 0) {
    if (e.tbscertobj !== void 0) {
      this.asn1TBSCert = e.tbscertobj;
    }
    if (e.prvkeyobj !== void 0) {
      this.prvKey = e.prvkeyobj;
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.Certificate, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.TBSCertificate = function(e) {
  KJUR.asn1.x509.TBSCertificate.superclass.constructor.call(this);
  var b = KJUR, i = b.asn1, f = i.DERSequence, h2 = i.DERInteger, c = i.DERTaggedObject, d = i.x509, g = d.Time, a = d.X500Name, j = d.SubjectPublicKeyInfo;
  this._initialize = function() {
    this.asn1Array = new Array();
    this.asn1Version = new c({ obj: new h2({ "int": 2 }) });
    this.asn1SerialNumber = null;
    this.asn1SignatureAlg = null;
    this.asn1Issuer = null;
    this.asn1NotBefore = null;
    this.asn1NotAfter = null;
    this.asn1Subject = null;
    this.asn1SubjPKey = null;
    this.extensionsArray = new Array();
  };
  this.setSerialNumberByParam = function(k) {
    this.asn1SerialNumber = new h2(k);
  };
  this.setSignatureAlgByParam = function(k) {
    this.asn1SignatureAlg = new d.AlgorithmIdentifier(k);
  };
  this.setIssuerByParam = function(k) {
    this.asn1Issuer = new a(k);
  };
  this.setNotBeforeByParam = function(k) {
    this.asn1NotBefore = new g(k);
  };
  this.setNotAfterByParam = function(k) {
    this.asn1NotAfter = new g(k);
  };
  this.setSubjectByParam = function(k) {
    this.asn1Subject = new a(k);
  };
  this.setSubjectPublicKey = function(k) {
    this.asn1SubjPKey = new j(k);
  };
  this.setSubjectPublicKeyByGetKey = function(l) {
    var k = KEYUTIL.getKey(l);
    this.asn1SubjPKey = new j(k);
  };
  this.appendExtension = function(k) {
    this.extensionsArray.push(k);
  };
  this.appendExtensionByName = function(l, k) {
    KJUR.asn1.x509.Extension.appendByNameToArray(l, k, this.extensionsArray);
  };
  this.getEncodedHex = function() {
    if (this.asn1NotBefore == null || this.asn1NotAfter == null) {
      throw "notBefore and/or notAfter not set";
    }
    var l = new f({ array: [this.asn1NotBefore, this.asn1NotAfter] });
    this.asn1Array = new Array();
    this.asn1Array.push(this.asn1Version);
    this.asn1Array.push(this.asn1SerialNumber);
    this.asn1Array.push(this.asn1SignatureAlg);
    this.asn1Array.push(this.asn1Issuer);
    this.asn1Array.push(l);
    this.asn1Array.push(this.asn1Subject);
    this.asn1Array.push(this.asn1SubjPKey);
    if (this.extensionsArray.length > 0) {
      var m = new f({ array: this.extensionsArray });
      var k = new c({ explicit: true, tag: "a3", obj: m });
      this.asn1Array.push(k);
    }
    var n = new f({ array: this.asn1Array });
    this.hTLV = n.getEncodedHex();
    this.isModified = false;
    return this.hTLV;
  };
  this._initialize();
};
YAHOO.lang.extend(KJUR.asn1.x509.TBSCertificate, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.Extension = function(d) {
  KJUR.asn1.x509.Extension.superclass.constructor.call(this);
  var a = KJUR, e = a.asn1, h2 = e.DERObjectIdentifier, i = e.DEROctetString;
  e.DERBitString;
  var g = e.DERBoolean, c = e.DERSequence;
  this.getEncodedHex = function() {
    var m = new h2({ oid: this.oid });
    var l = new i({ hex: this.getExtnValueHex() });
    var k = new Array();
    k.push(m);
    if (this.critical) {
      k.push(new g());
    }
    k.push(l);
    var j = new c({ array: k });
    return j.getEncodedHex();
  };
  this.critical = false;
  if (typeof d != "undefined") {
    if (typeof d.critical != "undefined") {
      this.critical = d.critical;
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.Extension, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.Extension.appendByNameToArray = function(e, c, b) {
  var g = e.toLowerCase(), f = KJUR.asn1.x509;
  if (g == "basicconstraints") {
    var d = new f.BasicConstraints(c);
    b.push(d);
  } else {
    if (g == "keyusage") {
      var d = new f.KeyUsage(c);
      b.push(d);
    } else {
      if (g == "crldistributionpoints") {
        var d = new f.CRLDistributionPoints(c);
        b.push(d);
      } else {
        if (g == "extkeyusage") {
          var d = new f.ExtKeyUsage(c);
          b.push(d);
        } else {
          if (g == "authoritykeyidentifier") {
            var d = new f.AuthorityKeyIdentifier(c);
            b.push(d);
          } else {
            if (g == "authorityinfoaccess") {
              var d = new f.AuthorityInfoAccess(c);
              b.push(d);
            } else {
              if (g == "subjectaltname") {
                var d = new f.SubjectAltName(c);
                b.push(d);
              } else {
                if (g == "issueraltname") {
                  var d = new f.IssuerAltName(c);
                  b.push(d);
                } else {
                  throw "unsupported extension name: " + e;
                }
              }
            }
          }
        }
      }
    }
  }
};
KJUR.asn1.x509.KeyUsage = function(a) {
  KJUR.asn1.x509.KeyUsage.superclass.constructor.call(this, a);
  this.getExtnValueHex = function() {
    return this.asn1ExtnValue.getEncodedHex();
  };
  this.oid = "2.5.29.15";
  if (typeof a != "undefined") {
    if (typeof a.bin != "undefined") {
      this.asn1ExtnValue = new KJUR.asn1.DERBitString(a);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.KeyUsage, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.BasicConstraints = function(c) {
  KJUR.asn1.x509.BasicConstraints.superclass.constructor.call(this, c);
  this.getExtnValueHex = function() {
    var e = new Array();
    if (this.cA) {
      e.push(new KJUR.asn1.DERBoolean());
    }
    if (this.pathLen > -1) {
      e.push(new KJUR.asn1.DERInteger({ "int": this.pathLen }));
    }
    var d = new KJUR.asn1.DERSequence({ array: e });
    this.asn1ExtnValue = d;
    return this.asn1ExtnValue.getEncodedHex();
  };
  this.oid = "2.5.29.19";
  this.cA = false;
  this.pathLen = -1;
  if (typeof c != "undefined") {
    if (typeof c.cA != "undefined") {
      this.cA = c.cA;
    }
    if (typeof c.pathLen != "undefined") {
      this.pathLen = c.pathLen;
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.BasicConstraints, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.CRLDistributionPoints = function(d) {
  KJUR.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this, d);
  var b = KJUR, a = b.asn1, c = a.x509;
  this.getExtnValueHex = function() {
    return this.asn1ExtnValue.getEncodedHex();
  };
  this.setByDPArray = function(e) {
    this.asn1ExtnValue = new a.DERSequence({ array: e });
  };
  this.setByOneURI = function(h2) {
    var e = new c.GeneralNames([{ uri: h2 }]);
    var g = new c.DistributionPointName(e);
    var f = new c.DistributionPoint({ dpobj: g });
    this.setByDPArray([f]);
  };
  this.oid = "2.5.29.31";
  if (typeof d != "undefined") {
    if (typeof d.array != "undefined") {
      this.setByDPArray(d.array);
    } else {
      if (typeof d.uri != "undefined") {
        this.setByOneURI(d.uri);
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.CRLDistributionPoints, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.ExtKeyUsage = function(c) {
  KJUR.asn1.x509.ExtKeyUsage.superclass.constructor.call(this, c);
  var b = KJUR, a = b.asn1;
  this.setPurposeArray = function(d) {
    this.asn1ExtnValue = new a.DERSequence();
    for (var e = 0; e < d.length; e++) {
      var f = new a.DERObjectIdentifier(d[e]);
      this.asn1ExtnValue.appendASN1Object(f);
    }
  };
  this.getExtnValueHex = function() {
    return this.asn1ExtnValue.getEncodedHex();
  };
  this.oid = "2.5.29.37";
  if (typeof c != "undefined") {
    if (typeof c.array != "undefined") {
      this.setPurposeArray(c.array);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.ExtKeyUsage, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.AuthorityKeyIdentifier = function(d) {
  KJUR.asn1.x509.AuthorityKeyIdentifier.superclass.constructor.call(this, d);
  var b = KJUR, a = b.asn1, c = a.DERTaggedObject;
  this.asn1KID = null;
  this.asn1CertIssuer = null;
  this.asn1CertSN = null;
  this.getExtnValueHex = function() {
    var f = new Array();
    if (this.asn1KID) {
      f.push(new c({ explicit: false, tag: "80", obj: this.asn1KID }));
    }
    if (this.asn1CertIssuer) {
      f.push(new c({ explicit: false, tag: "a1", obj: this.asn1CertIssuer }));
    }
    if (this.asn1CertSN) {
      f.push(new c({ explicit: false, tag: "82", obj: this.asn1CertSN }));
    }
    var e = new a.DERSequence({ array: f });
    this.asn1ExtnValue = e;
    return this.asn1ExtnValue.getEncodedHex();
  };
  this.setKIDByParam = function(e) {
    this.asn1KID = new KJUR.asn1.DEROctetString(e);
  };
  this.setCertIssuerByParam = function(e) {
    this.asn1CertIssuer = new KJUR.asn1.x509.X500Name(e);
  };
  this.setCertSNByParam = function(e) {
    this.asn1CertSN = new KJUR.asn1.DERInteger(e);
  };
  this.oid = "2.5.29.35";
  if (typeof d != "undefined") {
    if (typeof d.kid != "undefined") {
      this.setKIDByParam(d.kid);
    }
    if (typeof d.issuer != "undefined") {
      this.setCertIssuerByParam(d.issuer);
    }
    if (typeof d.sn != "undefined") {
      this.setCertSNByParam(d.sn);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.AuthorityKeyIdentifier, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.AuthorityInfoAccess = function(a) {
  KJUR.asn1.x509.AuthorityInfoAccess.superclass.constructor.call(this, a);
  this.setAccessDescriptionArray = function(k) {
    var j = new Array(), b = KJUR, g = b.asn1, d = g.DERSequence;
    for (var f = 0; f < k.length; f++) {
      var c = new g.DERObjectIdentifier(k[f].accessMethod);
      var e = new g.x509.GeneralName(k[f].accessLocation);
      var h2 = new d({ array: [c, e] });
      j.push(h2);
    }
    this.asn1ExtnValue = new d({ array: j });
  };
  this.getExtnValueHex = function() {
    return this.asn1ExtnValue.getEncodedHex();
  };
  this.oid = "1.3.6.1.5.5.7.1.1";
  if (typeof a != "undefined") {
    if (typeof a.array != "undefined") {
      this.setAccessDescriptionArray(a.array);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.AuthorityInfoAccess, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.SubjectAltName = function(a) {
  KJUR.asn1.x509.SubjectAltName.superclass.constructor.call(this, a);
  this.setNameArray = function(b) {
    this.asn1ExtnValue = new KJUR.asn1.x509.GeneralNames(b);
  };
  this.getExtnValueHex = function() {
    return this.asn1ExtnValue.getEncodedHex();
  };
  this.oid = "2.5.29.17";
  if (a !== void 0) {
    if (a.array !== void 0) {
      this.setNameArray(a.array);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.SubjectAltName, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.IssuerAltName = function(a) {
  KJUR.asn1.x509.IssuerAltName.superclass.constructor.call(this, a);
  this.setNameArray = function(b) {
    this.asn1ExtnValue = new KJUR.asn1.x509.GeneralNames(b);
  };
  this.getExtnValueHex = function() {
    return this.asn1ExtnValue.getEncodedHex();
  };
  this.oid = "2.5.29.18";
  if (a !== void 0) {
    if (a.array !== void 0) {
      this.setNameArray(a.array);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.IssuerAltName, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.CRL = function(f) {
  KJUR.asn1.x509.CRL.superclass.constructor.call(this);
  this.sign = function() {
    this.asn1SignatureAlg = this.asn1TBSCertList.asn1SignatureAlg;
    sig = new KJUR.crypto.Signature({ alg: "SHA1withRSA", prov: "cryptojs/jsrsa" });
    sig.initSign(this.prvKey);
    sig.updateHex(this.asn1TBSCertList.getEncodedHex());
    this.hexSig = sig.sign();
    this.asn1Sig = new KJUR.asn1.DERBitString({ hex: "00" + this.hexSig });
    var g = new KJUR.asn1.DERSequence({ array: [this.asn1TBSCertList, this.asn1SignatureAlg, this.asn1Sig] });
    this.hTLV = g.getEncodedHex();
    this.isModified = false;
  };
  this.getEncodedHex = function() {
    if (this.isModified == false && this.hTLV != null) {
      return this.hTLV;
    }
    throw "not signed yet";
  };
  this.getPEMString = function() {
    var g = hextob64nl(this.getEncodedHex());
    return "-----BEGIN X509 CRL-----\r\n" + g + "\r\n-----END X509 CRL-----\r\n";
  };
  if (f !== void 0) {
    if (f.tbsobj !== void 0) {
      this.asn1TBSCertList = f.tbsobj;
    }
    if (f.prvkeyobj !== void 0) {
      this.prvKey = f.prvkeyobj;
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.CRL, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.TBSCertList = function(g) {
  KJUR.asn1.x509.TBSCertList.superclass.constructor.call(this);
  var d = KJUR, c = d.asn1, b = c.DERSequence, f = c.x509, a = f.Time;
  this.setSignatureAlgByParam = function(h2) {
    this.asn1SignatureAlg = new f.AlgorithmIdentifier(h2);
  };
  this.setIssuerByParam = function(h2) {
    this.asn1Issuer = new f.X500Name(h2);
  };
  this.setThisUpdateByParam = function(h2) {
    this.asn1ThisUpdate = new a(h2);
  };
  this.setNextUpdateByParam = function(h2) {
    this.asn1NextUpdate = new a(h2);
  };
  this.addRevokedCert = function(h2, i) {
    var k = {};
    if (h2 != void 0 && h2 != null) {
      k.sn = h2;
    }
    if (i != void 0 && i != null) {
      k.time = i;
    }
    var j = new f.CRLEntry(k);
    this.aRevokedCert.push(j);
  };
  this.getEncodedHex = function() {
    this.asn1Array = new Array();
    if (this.asn1Version != null) {
      this.asn1Array.push(this.asn1Version);
    }
    this.asn1Array.push(this.asn1SignatureAlg);
    this.asn1Array.push(this.asn1Issuer);
    this.asn1Array.push(this.asn1ThisUpdate);
    if (this.asn1NextUpdate != null) {
      this.asn1Array.push(this.asn1NextUpdate);
    }
    if (this.aRevokedCert.length > 0) {
      var h2 = new b({ array: this.aRevokedCert });
      this.asn1Array.push(h2);
    }
    var i = new b({ array: this.asn1Array });
    this.hTLV = i.getEncodedHex();
    this.isModified = false;
    return this.hTLV;
  };
  this._initialize = function() {
    this.asn1Version = null;
    this.asn1SignatureAlg = null;
    this.asn1Issuer = null;
    this.asn1ThisUpdate = null;
    this.asn1NextUpdate = null;
    this.aRevokedCert = new Array();
  };
  this._initialize();
};
YAHOO.lang.extend(KJUR.asn1.x509.TBSCertList, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.CRLEntry = function(e) {
  KJUR.asn1.x509.CRLEntry.superclass.constructor.call(this);
  var b = KJUR, a = b.asn1;
  this.setCertSerial = function(f) {
    this.sn = new a.DERInteger(f);
  };
  this.setRevocationDate = function(f) {
    this.time = new a.x509.Time(f);
  };
  this.getEncodedHex = function() {
    var f = new a.DERSequence({ array: [this.sn, this.time] });
    this.TLV = f.getEncodedHex();
    return this.TLV;
  };
  if (e !== void 0) {
    if (e.time !== void 0) {
      this.setRevocationDate(e.time);
    }
    if (e.sn !== void 0) {
      this.setCertSerial(e.sn);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.CRLEntry, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.X500Name = function(f) {
  KJUR.asn1.x509.X500Name.superclass.constructor.call(this);
  this.asn1Array = new Array();
  var d = KJUR, c = d.asn1, e = c.x509, b = pemtohex;
  this.setByString = function(g) {
    var h2 = g.split("/");
    h2.shift();
    for (var j = 0; j < h2.length; j++) {
      this.asn1Array.push(new e.RDN({ str: h2[j] }));
    }
  };
  this.setByLdapString = function(g) {
    var h2 = e.X500Name.ldapToOneline(g);
    this.setByString(h2);
  };
  this.setByObject = function(i) {
    for (var g in i) {
      if (i.hasOwnProperty(g)) {
        var h2 = new KJUR.asn1.x509.RDN({ str: g + "=" + i[g] });
        this.asn1Array ? this.asn1Array.push(h2) : this.asn1Array = [h2];
      }
    }
  };
  this.getEncodedHex = function() {
    if (typeof this.hTLV == "string") {
      return this.hTLV;
    }
    var g = new c.DERSequence({ array: this.asn1Array });
    this.hTLV = g.getEncodedHex();
    return this.hTLV;
  };
  if (f !== void 0) {
    if (f.str !== void 0) {
      this.setByString(f.str);
    } else {
      if (f.ldapstr !== void 0) {
        this.setByLdapString(f.ldapstr);
      } else {
        if (typeof f === "object") {
          this.setByObject(f);
        }
      }
    }
    if (f.certissuer !== void 0) {
      var a = new X509();
      a.hex = b(f.certissuer);
      this.hTLV = a.getIssuerHex();
    }
    if (f.certsubject !== void 0) {
      var a = new X509();
      a.hex = b(f.certsubject);
      this.hTLV = a.getSubjectHex();
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.X500Name, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.X500Name.onelineToLDAP = function(d) {
  if (d.substr(0, 1) !== "/") {
    throw "malformed input";
  }
  d = d.substr(1);
  var c = d.split("/");
  c.reverse();
  c = c.map(function(a) {
    return a.replace(/,/, "\\,");
  });
  return c.join(",");
};
KJUR.asn1.x509.X500Name.ldapToOneline = function(g) {
  var c = g.split(",");
  var e = false;
  var b = [];
  for (var f = 0; c.length > 0; f++) {
    var h2 = c.shift();
    if (e === true) {
      var d = b.pop();
      var j = (d + "," + h2).replace(/\\,/g, ",");
      b.push(j);
      e = false;
    } else {
      b.push(h2);
    }
    if (h2.substr(-1, 1) === "\\") {
      e = true;
    }
  }
  b = b.map(function(a) {
    return a.replace("/", "\\/");
  });
  b.reverse();
  return "/" + b.join("/");
};
KJUR.asn1.x509.RDN = function(a) {
  KJUR.asn1.x509.RDN.superclass.constructor.call(this);
  this.asn1Array = new Array();
  this.addByString = function(b) {
    this.asn1Array.push(new KJUR.asn1.x509.AttributeTypeAndValue({ str: b }));
  };
  this.addByMultiValuedString = function(d) {
    var b = KJUR.asn1.x509.RDN.parseString(d);
    for (var c = 0; c < b.length; c++) {
      this.addByString(b[c]);
    }
  };
  this.getEncodedHex = function() {
    var b = new KJUR.asn1.DERSet({ array: this.asn1Array });
    this.TLV = b.getEncodedHex();
    return this.TLV;
  };
  if (typeof a != "undefined") {
    if (typeof a.str != "undefined") {
      this.addByMultiValuedString(a.str);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.RDN, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.RDN.parseString = function(m) {
  var j = m.split(/\+/);
  var h2 = false;
  var c = [];
  for (var g = 0; j.length > 0; g++) {
    var k = j.shift();
    if (h2 === true) {
      var f = c.pop();
      var d = (f + "+" + k).replace(/\\\+/g, "+");
      c.push(d);
      h2 = false;
    } else {
      c.push(k);
    }
    if (k.substr(-1, 1) === "\\") {
      h2 = true;
    }
  }
  var l = false;
  var b = [];
  for (var g = 0; c.length > 0; g++) {
    var k = c.shift();
    if (l === true) {
      var e = b.pop();
      if (k.match(/"$/)) {
        var d = (e + "+" + k).replace(/^([^=]+)="(.*)"$/, "$1=$2");
        b.push(d);
        l = false;
      } else {
        b.push(e + "+" + k);
      }
    } else {
      b.push(k);
    }
    if (k.match(/^[^=]+="/)) {
      l = true;
    }
  }
  return b;
};
KJUR.asn1.x509.AttributeTypeAndValue = function(d) {
  KJUR.asn1.x509.AttributeTypeAndValue.superclass.constructor.call(this);
  var a = "utf8", c = KJUR, b = c.asn1;
  this.setByString = function(h2) {
    var g = h2.match(/^([^=]+)=(.+)$/);
    if (g) {
      this.setByAttrTypeAndValueStr(g[1], g[2]);
    } else {
      throw "malformed attrTypeAndValueStr: " + h2;
    }
  };
  this.setByAttrTypeAndValueStr = function(i, h2) {
    this.typeObj = KJUR.asn1.x509.OID.atype2obj(i);
    var g = a;
    if (i == "C") {
      g = "prn";
    }
    this.valueObj = this.getValueObj(g, h2);
  };
  this.getValueObj = function(h2, g) {
    if (h2 == "utf8") {
      return new b.DERUTF8String({ str: g });
    }
    if (h2 == "prn") {
      return new b.DERPrintableString({ str: g });
    }
    if (h2 == "tel") {
      return new b.DERTeletexString({ str: g });
    }
    if (h2 == "ia5") {
      return new b.DERIA5String({ str: g });
    }
    throw "unsupported directory string type: type=" + h2 + " value=" + g;
  };
  this.getEncodedHex = function() {
    var g = new b.DERSequence({ array: [this.typeObj, this.valueObj] });
    this.TLV = g.getEncodedHex();
    return this.TLV;
  };
  if (typeof d != "undefined") {
    if (typeof d.str != "undefined") {
      this.setByString(d.str);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.AttributeTypeAndValue, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.SubjectPublicKeyInfo = function(f) {
  KJUR.asn1.x509.SubjectPublicKeyInfo.superclass.constructor.call(this);
  var a = KJUR, j = a.asn1, i = j.DERInteger, b = j.DERBitString, m = j.DERObjectIdentifier, e = j.DERSequence, h2 = j.ASN1Util.newObject, d = j.x509, o = d.AlgorithmIdentifier, g = a.crypto;
  g.ECDSA;
  g.DSA;
  this.getASN1Object = function() {
    if (this.asn1AlgId == null || this.asn1SubjPKey == null) {
      throw "algId and/or subjPubKey not set";
    }
    var p = new e({ array: [this.asn1AlgId, this.asn1SubjPKey] });
    return p;
  };
  this.getEncodedHex = function() {
    var p = this.getASN1Object();
    this.hTLV = p.getEncodedHex();
    return this.hTLV;
  };
  this.setPubKey = function(q) {
    try {
      if (q instanceof RSAKey) {
        var u = h2({ seq: [{ "int": { bigint: q.n } }, { "int": { "int": q.e } }] });
        var s = u.getEncodedHex();
        this.asn1AlgId = new o({ name: "rsaEncryption" });
        this.asn1SubjPKey = new b({ hex: "00" + s });
      }
    } catch (p) {
    }
    try {
      if (q instanceof KJUR.crypto.ECDSA) {
        var r = new m({ name: q.curveName });
        this.asn1AlgId = new o({ name: "ecPublicKey", asn1params: r });
        this.asn1SubjPKey = new b({ hex: "00" + q.pubKeyHex });
      }
    } catch (p) {
    }
    try {
      if (q instanceof KJUR.crypto.DSA) {
        var r = new h2({ seq: [{ "int": { bigint: q.p } }, { "int": { bigint: q.q } }, { "int": { bigint: q.g } }] });
        this.asn1AlgId = new o({ name: "dsa", asn1params: r });
        var t = new i({ bigint: q.y });
        this.asn1SubjPKey = new b({ hex: "00" + t.getEncodedHex() });
      }
    } catch (p) {
    }
  };
  if (f !== void 0) {
    this.setPubKey(f);
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.SubjectPublicKeyInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.Time = function(f) {
  KJUR.asn1.x509.Time.superclass.constructor.call(this);
  var d = KJUR, c = d.asn1, b = c.DERUTCTime, g = c.DERGeneralizedTime;
  this.setTimeParams = function(h2) {
    this.timeParams = h2;
  };
  this.getEncodedHex = function() {
    var h2 = null;
    if (this.timeParams != null) {
      if (this.type == "utc") {
        h2 = new b(this.timeParams);
      } else {
        h2 = new g(this.timeParams);
      }
    } else {
      if (this.type == "utc") {
        h2 = new b();
      } else {
        h2 = new g();
      }
    }
    this.TLV = h2.getEncodedHex();
    return this.TLV;
  };
  this.type = "utc";
  if (f !== void 0) {
    if (f.type !== void 0) {
      this.type = f.type;
    } else {
      if (f.str !== void 0) {
        if (f.str.match(/^[0-9]{12}Z$/)) {
          this.type = "utc";
        }
        if (f.str.match(/^[0-9]{14}Z$/)) {
          this.type = "gen";
        }
      }
    }
    this.timeParams = f;
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.Time, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.AlgorithmIdentifier = function(d) {
  KJUR.asn1.x509.AlgorithmIdentifier.superclass.constructor.call(this);
  this.nameAlg = null;
  this.asn1Alg = null;
  this.asn1Params = null;
  this.paramEmpty = false;
  var b = KJUR, a = b.asn1;
  this.getEncodedHex = function() {
    if (this.nameAlg === null && this.asn1Alg === null) {
      throw "algorithm not specified";
    }
    if (this.nameAlg !== null && this.asn1Alg === null) {
      this.asn1Alg = a.x509.OID.name2obj(this.nameAlg);
    }
    var e = [this.asn1Alg];
    if (this.asn1Params !== null) {
      e.push(this.asn1Params);
    }
    var f = new a.DERSequence({ array: e });
    this.hTLV = f.getEncodedHex();
    return this.hTLV;
  };
  if (d !== void 0) {
    if (d.name !== void 0) {
      this.nameAlg = d.name;
    }
    if (d.asn1params !== void 0) {
      this.asn1Params = d.asn1params;
    }
    if (d.paramempty !== void 0) {
      this.paramEmpty = d.paramempty;
    }
  }
  if (this.asn1Params === null && this.paramEmpty === false && this.nameAlg !== null) {
    var c = this.nameAlg.toLowerCase();
    if (c.substr(-7, 7) !== "withdsa" && c.substr(-9, 9) !== "withecdsa") {
      this.asn1Params = new a.DERNull();
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.AlgorithmIdentifier, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.GeneralName = function(e) {
  KJUR.asn1.x509.GeneralName.superclass.constructor.call(this);
  var i = { rfc822: "81", dns: "82", dn: "a4", uri: "86" }, b = KJUR, f = b.asn1, d = f.DERIA5String, c = f.DERTaggedObject, j = f.ASN1Object, a = f.x509.X500Name, g = pemtohex;
  this.explicit = false;
  this.setByParam = function(r) {
    var n = null;
    if (r === void 0) {
      return;
    }
    if (r.rfc822 !== void 0) {
      this.type = "rfc822";
      n = new d({ str: r[this.type] });
    }
    if (r.dns !== void 0) {
      this.type = "dns";
      n = new d({ str: r[this.type] });
    }
    if (r.uri !== void 0) {
      this.type = "uri";
      n = new d({ str: r[this.type] });
    }
    if (r.dn !== void 0) {
      this.type = "dn";
      n = new a({ str: r.dn });
    }
    if (r.ldapdn !== void 0) {
      this.type = "dn";
      n = new a({ ldapstr: r.ldapdn });
    }
    if (r.certissuer !== void 0) {
      this.type = "dn";
      this.explicit = true;
      var o = r.certissuer;
      var m = null;
      if (o.match(/^[0-9A-Fa-f]+$/))
        ;
      if (o.indexOf("-----BEGIN ") != -1) {
        m = g(o);
      }
      if (m == null) {
        throw "certissuer param not cert";
      }
      var l = new X509();
      l.hex = m;
      var p = l.getIssuerHex();
      n = new j();
      n.hTLV = p;
    }
    if (r.certsubj !== void 0) {
      this.type = "dn";
      this.explicit = true;
      var o = r.certsubj;
      var m = null;
      if (o.match(/^[0-9A-Fa-f]+$/))
        ;
      if (o.indexOf("-----BEGIN ") != -1) {
        m = g(o);
      }
      if (m == null) {
        throw "certsubj param not cert";
      }
      var l = new X509();
      l.hex = m;
      var p = l.getSubjectHex();
      n = new j();
      n.hTLV = p;
    }
    if (this.type == null) {
      throw "unsupported type in params=" + r;
    }
    this.asn1Obj = new c({ explicit: this.explicit, tag: i[this.type], obj: n });
  };
  this.getEncodedHex = function() {
    return this.asn1Obj.getEncodedHex();
  };
  if (e !== void 0) {
    this.setByParam(e);
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.GeneralName, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.GeneralNames = function(d) {
  KJUR.asn1.x509.GeneralNames.superclass.constructor.call(this);
  var c = KJUR, b = c.asn1;
  this.setByParamArray = function(g) {
    for (var e = 0; e < g.length; e++) {
      var f = new b.x509.GeneralName(g[e]);
      this.asn1Array.push(f);
    }
  };
  this.getEncodedHex = function() {
    var e = new b.DERSequence({ array: this.asn1Array });
    return e.getEncodedHex();
  };
  this.asn1Array = new Array();
  if (typeof d != "undefined") {
    this.setByParamArray(d);
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.GeneralNames, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.DistributionPointName = function(b) {
  KJUR.asn1.x509.DistributionPointName.superclass.constructor.call(this);
  var d = KJUR, c = d.asn1, f = c.DERTaggedObject;
  this.getEncodedHex = function() {
    if (this.type != "full") {
      throw "currently type shall be 'full': " + this.type;
    }
    this.asn1Obj = new f({ explicit: false, tag: this.tag, obj: this.asn1V });
    this.hTLV = this.asn1Obj.getEncodedHex();
    return this.hTLV;
  };
  if (b !== void 0) {
    if (c.x509.GeneralNames.prototype.isPrototypeOf(b)) {
      this.type = "full";
      this.tag = "a0";
      this.asn1V = b;
    } else {
      throw "This class supports GeneralNames only as argument";
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.DistributionPointName, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.DistributionPoint = function(d) {
  KJUR.asn1.x509.DistributionPoint.superclass.constructor.call(this);
  var c = KJUR, b = c.asn1;
  this.getEncodedHex = function() {
    var e = new b.DERSequence();
    if (this.asn1DP != null) {
      var f = new b.DERTaggedObject({ explicit: true, tag: "a0", obj: this.asn1DP });
      e.appendASN1Object(f);
    }
    this.hTLV = e.getEncodedHex();
    return this.hTLV;
  };
  if (d !== void 0) {
    if (d.dpobj !== void 0) {
      this.asn1DP = d.dpobj;
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.DistributionPoint, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.OID = new function(a) {
  this.atype2oidList = { CN: "2.5.4.3", L: "2.5.4.7", ST: "2.5.4.8", O: "2.5.4.10", OU: "2.5.4.11", C: "2.5.4.6", STREET: "2.5.4.9", DC: "0.9.2342.19200300.100.1.25", UID: "0.9.2342.19200300.100.1.1", SN: "2.5.4.4", DN: "2.5.4.49", E: "1.2.840.113549.1.9.1", businessCategory: "2.5.4.15", postalCode: "2.5.4.17", serialNumber: "2.5.4.5", jurisdictionOfIncorporationL: "1.3.6.1.4.1.311.60.2.1.1", jurisdictionOfIncorporationSP: "1.3.6.1.4.1.311.60.2.1.2", jurisdictionOfIncorporationC: "1.3.6.1.4.1.311.60.2.1.3" };
  this.name2oidList = { sha1: "1.3.14.3.2.26", sha256: "2.16.840.1.101.3.4.2.1", sha384: "2.16.840.1.101.3.4.2.2", sha512: "2.16.840.1.101.3.4.2.3", sha224: "2.16.840.1.101.3.4.2.4", md5: "1.2.840.113549.2.5", md2: "1.3.14.7.2.2.1", ripemd160: "1.3.36.3.2.1", MD2withRSA: "1.2.840.113549.1.1.2", MD4withRSA: "1.2.840.113549.1.1.3", MD5withRSA: "1.2.840.113549.1.1.4", SHA1withRSA: "1.2.840.113549.1.1.5", SHA224withRSA: "1.2.840.113549.1.1.14", SHA256withRSA: "1.2.840.113549.1.1.11", SHA384withRSA: "1.2.840.113549.1.1.12", SHA512withRSA: "1.2.840.113549.1.1.13", SHA1withECDSA: "1.2.840.10045.4.1", SHA224withECDSA: "1.2.840.10045.4.3.1", SHA256withECDSA: "1.2.840.10045.4.3.2", SHA384withECDSA: "1.2.840.10045.4.3.3", SHA512withECDSA: "1.2.840.10045.4.3.4", dsa: "1.2.840.10040.4.1", SHA1withDSA: "1.2.840.10040.4.3", SHA224withDSA: "2.16.840.1.101.3.4.3.1", SHA256withDSA: "2.16.840.1.101.3.4.3.2", rsaEncryption: "1.2.840.113549.1.1.1", commonName: "2.5.4.3", localityName: "2.5.4.7", stateOrProvinceName: "2.5.4.8", organizationName: "2.5.4.10", organizationalUnitName: "2.5.4.11", countryName: "2.5.4.6", streetAddress: "2.5.4.9", domainComponent: "0.9.2342.19200300.100.1.25", userId: "0.9.2342.19200300.100.1.1", surname: "2.5.4.4", distinguishedName: "2.5.4.49", emailAddress: "1.2.840.113549.1.9.1", businessCategory: "2.5.4.15", postalCode: "2.5.4.17", jurisdictionOfIncorporationL: "1.3.6.1.4.1.311.60.2.1.1", jurisdictionOfIncorporationSP: "1.3.6.1.4.1.311.60.2.1.2", jurisdictionOfIncorporationC: "1.3.6.1.4.1.311.60.2.1.3", subjectKeyIdentifier: "2.5.29.14", keyUsage: "2.5.29.15", subjectAltName: "2.5.29.17", issuerAltName: "2.5.29.18", basicConstraints: "2.5.29.19", nameConstraints: "2.5.29.30", cRLDistributionPoints: "2.5.29.31", certificatePolicies: "2.5.29.32", authorityKeyIdentifier: "2.5.29.35", policyConstraints: "2.5.29.36", extKeyUsage: "2.5.29.37", authorityInfoAccess: "1.3.6.1.5.5.7.1.1", ocsp: "1.3.6.1.5.5.7.48.1", caIssuers: "1.3.6.1.5.5.7.48.2", anyExtendedKeyUsage: "2.5.29.37.0", serverAuth: "1.3.6.1.5.5.7.3.1", clientAuth: "1.3.6.1.5.5.7.3.2", codeSigning: "1.3.6.1.5.5.7.3.3", emailProtection: "1.3.6.1.5.5.7.3.4", timeStamping: "1.3.6.1.5.5.7.3.8", ocspSigning: "1.3.6.1.5.5.7.3.9", ecPublicKey: "1.2.840.10045.2.1", secp256r1: "1.2.840.10045.3.1.7", secp256k1: "1.3.132.0.10", secp384r1: "1.3.132.0.34", pkcs5PBES2: "1.2.840.113549.1.5.13", pkcs5PBKDF2: "1.2.840.113549.1.5.12", "des-EDE3-CBC": "1.2.840.113549.3.7", data: "1.2.840.113549.1.7.1", "signed-data": "1.2.840.113549.1.7.2", "enveloped-data": "1.2.840.113549.1.7.3", "digested-data": "1.2.840.113549.1.7.5", "encrypted-data": "1.2.840.113549.1.7.6", "authenticated-data": "1.2.840.113549.1.9.16.1.2", tstinfo: "1.2.840.113549.1.9.16.1.4", extensionRequest: "1.2.840.113549.1.9.14" };
  this.objCache = {};
  this.name2obj = function(b) {
    if (typeof this.objCache[b] != "undefined") {
      return this.objCache[b];
    }
    if (typeof this.name2oidList[b] == "undefined") {
      throw "Name of ObjectIdentifier not defined: " + b;
    }
    var c = this.name2oidList[b];
    var d = new KJUR.asn1.DERObjectIdentifier({ oid: c });
    this.objCache[b] = d;
    return d;
  };
  this.atype2obj = function(b) {
    if (typeof this.objCache[b] != "undefined") {
      return this.objCache[b];
    }
    if (typeof this.atype2oidList[b] == "undefined") {
      throw "AttributeType name undefined: " + b;
    }
    var c = this.atype2oidList[b];
    var d = new KJUR.asn1.DERObjectIdentifier({ oid: c });
    this.objCache[b] = d;
    return d;
  };
}();
KJUR.asn1.x509.OID.oid2name = function(b) {
  var c = KJUR.asn1.x509.OID.name2oidList;
  for (var a in c) {
    if (c[a] == b) {
      return a;
    }
  }
  return "";
};
KJUR.asn1.x509.OID.oid2atype = function(b) {
  var c = KJUR.asn1.x509.OID.atype2oidList;
  for (var a in c) {
    if (c[a] == b) {
      return a;
    }
  }
  return b;
};
KJUR.asn1.x509.OID.name2oid = function(a) {
  var b = KJUR.asn1.x509.OID.name2oidList;
  if (b[a] === void 0) {
    return "";
  }
  return b[a];
};
KJUR.asn1.x509.X509Util = {};
KJUR.asn1.x509.X509Util.newCertPEM = function(h2) {
  var g = KJUR.asn1.x509, b = g.TBSCertificate, a = g.Certificate;
  var f = new b();
  if (h2.serial !== void 0) {
    f.setSerialNumberByParam(h2.serial);
  } else {
    throw "serial number undefined.";
  }
  if (typeof h2.sigalg.name === "string") {
    f.setSignatureAlgByParam(h2.sigalg);
  } else {
    throw "unproper signature algorithm name";
  }
  if (h2.issuer !== void 0) {
    f.setIssuerByParam(h2.issuer);
  } else {
    throw "issuer name undefined.";
  }
  if (h2.notbefore !== void 0) {
    f.setNotBeforeByParam(h2.notbefore);
  } else {
    throw "notbefore undefined.";
  }
  if (h2.notafter !== void 0) {
    f.setNotAfterByParam(h2.notafter);
  } else {
    throw "notafter undefined.";
  }
  if (h2.subject !== void 0) {
    f.setSubjectByParam(h2.subject);
  } else {
    throw "subject name undefined.";
  }
  if (h2.sbjpubkey !== void 0) {
    f.setSubjectPublicKeyByGetKey(h2.sbjpubkey);
  } else {
    throw "subject public key undefined.";
  }
  if (h2.ext !== void 0 && h2.ext.length !== void 0) {
    for (var d = 0; d < h2.ext.length; d++) {
      for (key in h2.ext[d]) {
        f.appendExtensionByName(key, h2.ext[d][key]);
      }
    }
  }
  if (h2.cakey === void 0 && h2.sighex === void 0) {
    throw "param cakey and sighex undefined.";
  }
  var e = null;
  var c = null;
  if (h2.cakey) {
    if (h2.cakey.isPrivate === true) {
      e = h2.cakey;
    } else {
      e = KEYUTIL.getKey.apply(null, h2.cakey);
    }
    c = new a({ tbscertobj: f, prvkeyobj: e });
    c.sign();
  }
  if (h2.sighex) {
    c = new a({ tbscertobj: f });
    c.setSignatureHex(h2.sighex);
  }
  return c.getPEMString();
};
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {};
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
  KJUR.asn1 = {};
}
if (typeof KJUR.asn1.cms == "undefined" || !KJUR.asn1.cms) {
  KJUR.asn1.cms = {};
}
KJUR.asn1.cms.Attribute = function(d) {
  var c = KJUR, b = c.asn1;
  b.cms.Attribute.superclass.constructor.call(this);
  this.getEncodedHex = function() {
    var h2, g, e;
    h2 = new b.DERObjectIdentifier({ oid: this.attrTypeOid });
    g = new b.DERSet({ array: this.valueList });
    try {
      g.getEncodedHex();
    } catch (f) {
      throw "fail valueSet.getEncodedHex in Attribute(1)/" + f;
    }
    e = new b.DERSequence({ array: [h2, g] });
    try {
      this.hTLV = e.getEncodedHex();
    } catch (f) {
      throw "failed seq.getEncodedHex in Attribute(2)/" + f;
    }
    return this.hTLV;
  };
};
YAHOO.lang.extend(KJUR.asn1.cms.Attribute, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.ContentType = function(d) {
  var c = KJUR, b = c.asn1;
  b.cms.ContentType.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.3";
  var a = null;
  if (typeof d != "undefined") {
    var a = new b.DERObjectIdentifier(d);
    this.valueList = [a];
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.ContentType, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.MessageDigest = function(d) {
  var b = KJUR, e = b.asn1, g = e.DEROctetString, i = e.cms;
  i.MessageDigest.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.4";
  if (d !== void 0) {
    if (d.eciObj instanceof i.EncapsulatedContentInfo && typeof d.hashAlg === "string") {
      var h2 = d.eciObj.eContentValueHex;
      var c = d.hashAlg;
      var a = b.crypto.Util.hashHex(h2, c);
      var f = new g({ hex: a });
      f.getEncodedHex();
      this.valueList = [f];
    } else {
      var f = new g(d);
      f.getEncodedHex();
      this.valueList = [f];
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.MessageDigest, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.SigningTime = function(e) {
  var d = KJUR, c = d.asn1;
  c.cms.SigningTime.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.5";
  if (e !== void 0) {
    var a = new c.x509.Time(e);
    try {
      a.getEncodedHex();
    } catch (b) {
      throw "SigningTime.getEncodedHex() failed/" + b;
    }
    this.valueList = [a];
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.SigningTime, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.SigningCertificate = function(f) {
  var c = KJUR, b = c.asn1, a = b.DERSequence, e = b.cms;
  c.crypto;
  e.SigningCertificate.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.16.2.12";
  this.setCerts = function(n) {
    var l = [];
    for (var k = 0; k < n.length; k++) {
      var h2 = pemtohex(n[k]);
      var g = c.crypto.Util.hashHex(h2, "sha1");
      var o = new b.DEROctetString({ hex: g });
      o.getEncodedHex();
      var m = new e.IssuerAndSerialNumber({ cert: n[k] });
      m.getEncodedHex();
      var p = new a({ array: [o, m] });
      p.getEncodedHex();
      l.push(p);
    }
    var j = new a({ array: l });
    j.getEncodedHex();
    this.valueList = [j];
  };
  if (f !== void 0) {
    if (typeof f.array == "object") {
      this.setCerts(f.array);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificate, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.SigningCertificateV2 = function(h2) {
  var d = KJUR, c = d.asn1, b = c.DERSequence, g = c.x509, f = c.cms, e = d.crypto;
  f.SigningCertificateV2.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.16.2.47";
  this.setCerts = function(r, k) {
    var p = [];
    for (var n = 0; n < r.length; n++) {
      var l = pemtohex(r[n]);
      var t = [];
      if (k !== "sha256") {
        t.push(new g.AlgorithmIdentifier({ name: k }));
      }
      var j = e.Util.hashHex(l, k);
      var s = new c.DEROctetString({ hex: j });
      s.getEncodedHex();
      t.push(s);
      var o = new f.IssuerAndSerialNumber({ cert: r[n] });
      o.getEncodedHex();
      t.push(o);
      var q = new b({ array: t });
      q.getEncodedHex();
      p.push(q);
    }
    var m = new b({ array: p });
    m.getEncodedHex();
    this.valueList = [m];
  };
  if (h2 !== void 0) {
    if (typeof h2.array == "object") {
      var a = "sha256";
      if (typeof h2.hashAlg == "string") {
        a = h2.hashAlg;
      }
      this.setCerts(h2.array, a);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificateV2, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.IssuerAndSerialNumber = function(e) {
  var b = KJUR, g = b.asn1, f = g.DERInteger, i = g.cms, d = g.x509, a = d.X500Name, c = X509;
  i.IssuerAndSerialNumber.superclass.constructor.call(this);
  this.setByCertPEM = function(n) {
    var l = pemtohex(n);
    var k = new c();
    k.hex = l;
    var o = k.getIssuerHex();
    this.dIssuer = new a();
    this.dIssuer.hTLV = o;
    var m = k.getSerialNumberHex();
    this.dSerial = new f({ hex: m });
  };
  this.getEncodedHex = function() {
    var k = new g.DERSequence({ array: [this.dIssuer, this.dSerial] });
    this.hTLV = k.getEncodedHex();
    return this.hTLV;
  };
  if (e !== void 0) {
    if (typeof e == "string" && e.indexOf("-----BEGIN ") != -1) {
      this.setByCertPEM(e);
    }
    if (e.issuer && e.serial) {
      if (e.issuer instanceof a) {
        this.dIssuer = e.issuer;
      } else {
        this.dIssuer = new a(e.issuer);
      }
      if (e.serial instanceof f) {
        this.dSerial = e.serial;
      } else {
        this.dSerial = new f(e.serial);
      }
    }
    if (typeof e.cert == "string") {
      this.setByCertPEM(e.cert);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.IssuerAndSerialNumber, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.AttributeList = function(d) {
  var b = KJUR, a = b.asn1, c = a.cms;
  c.AttributeList.superclass.constructor.call(this);
  this.list = new Array();
  this.sortFlag = true;
  this.add = function(e) {
    if (e instanceof c.Attribute) {
      this.list.push(e);
    }
  };
  this.length = function() {
    return this.list.length;
  };
  this.clear = function() {
    this.list = new Array();
    this.hTLV = null;
    this.hV = null;
  };
  this.getEncodedHex = function() {
    if (typeof this.hTLV == "string") {
      return this.hTLV;
    }
    var e = new a.DERSet({ array: this.list, sortflag: this.sortFlag });
    this.hTLV = e.getEncodedHex();
    return this.hTLV;
  };
  if (d !== void 0) {
    if (typeof d.sortflag != "undefined" && d.sortflag == false) {
      this.sortFlag = false;
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.AttributeList, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.SignerInfo = function(e) {
  var a = KJUR, h2 = a.asn1, b = h2.DERTaggedObject, n = h2.cms, j = n.AttributeList, g = n.ContentType, k = n.EncapsulatedContentInfo, c = n.MessageDigest, l = n.SignedData, d = h2.x509, m = d.AlgorithmIdentifier, f = a.crypto, i = KEYUTIL;
  n.SignerInfo.superclass.constructor.call(this);
  this.dCMSVersion = new h2.DERInteger({ "int": 1 });
  this.dSignerIdentifier = null;
  this.dDigestAlgorithm = null;
  this.dSignedAttrs = new j();
  this.dSigAlg = null;
  this.dSig = null;
  this.dUnsignedAttrs = new j();
  this.setSignerIdentifier = function(p) {
    if (typeof p == "string" && p.indexOf("CERTIFICATE") != -1 && p.indexOf("BEGIN") != -1 && p.indexOf("END") != -1) {
      this.dSignerIdentifier = new n.IssuerAndSerialNumber({ cert: p });
    }
  };
  this.setForContentAndHash = function(o) {
    if (o !== void 0) {
      if (o.eciObj instanceof k) {
        this.dSignedAttrs.add(new g({ oid: "1.2.840.113549.1.7.1" }));
        this.dSignedAttrs.add(new c({ eciObj: o.eciObj, hashAlg: o.hashAlg }));
      }
      if (o.sdObj !== void 0 && o.sdObj instanceof l) {
        if (o.sdObj.digestAlgNameList.join(":").indexOf(o.hashAlg) == -1) {
          o.sdObj.digestAlgNameList.push(o.hashAlg);
        }
      }
      if (typeof o.hashAlg == "string") {
        this.dDigestAlgorithm = new m({ name: o.hashAlg });
      }
    }
  };
  this.sign = function(t, p) {
    this.dSigAlg = new m({ name: p });
    var q = this.dSignedAttrs.getEncodedHex();
    var o = i.getKey(t);
    var s = new f.Signature({ alg: p });
    s.init(o);
    s.updateHex(q);
    var r = s.sign();
    this.dSig = new h2.DEROctetString({ hex: r });
  };
  this.addUnsigned = function(o) {
    this.hTLV = null;
    this.dUnsignedAttrs.hTLV = null;
    this.dUnsignedAttrs.add(o);
  };
  this.getEncodedHex = function() {
    if (this.dSignedAttrs instanceof j && this.dSignedAttrs.length() == 0) {
      throw "SignedAttrs length = 0 (empty)";
    }
    var o = new b({ obj: this.dSignedAttrs, tag: "a0", explicit: false });
    var r = null;
    if (this.dUnsignedAttrs.length() > 0) {
      r = new b({ obj: this.dUnsignedAttrs, tag: "a1", explicit: false });
    }
    var q = [this.dCMSVersion, this.dSignerIdentifier, this.dDigestAlgorithm, o, this.dSigAlg, this.dSig];
    if (r != null) {
      q.push(r);
    }
    var p = new h2.DERSequence({ array: q });
    this.hTLV = p.getEncodedHex();
    return this.hTLV;
  };
};
YAHOO.lang.extend(KJUR.asn1.cms.SignerInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.EncapsulatedContentInfo = function(g) {
  var c = KJUR, b = c.asn1, e = b.DERTaggedObject, a = b.DERSequence, h2 = b.DERObjectIdentifier, d = b.DEROctetString, f = b.cms;
  f.EncapsulatedContentInfo.superclass.constructor.call(this);
  this.dEContentType = new h2({ name: "data" });
  this.dEContent = null;
  this.isDetached = false;
  this.eContentValueHex = null;
  this.setContentType = function(i) {
    if (i.match(/^[0-2][.][0-9.]+$/)) {
      this.dEContentType = new h2({ oid: i });
    } else {
      this.dEContentType = new h2({ name: i });
    }
  };
  this.setContentValue = function(i) {
    if (i !== void 0) {
      if (typeof i.hex == "string") {
        this.eContentValueHex = i.hex;
      } else {
        if (typeof i.str == "string") {
          this.eContentValueHex = utf8tohex(i.str);
        }
      }
    }
  };
  this.setContentValueHex = function(i) {
    this.eContentValueHex = i;
  };
  this.setContentValueStr = function(i) {
    this.eContentValueHex = utf8tohex(i);
  };
  this.getEncodedHex = function() {
    if (typeof this.eContentValueHex != "string") {
      throw "eContentValue not yet set";
    }
    var k = new d({ hex: this.eContentValueHex });
    this.dEContent = new e({ obj: k, tag: "a0", explicit: true });
    var i = [this.dEContentType];
    if (!this.isDetached) {
      i.push(this.dEContent);
    }
    var j = new a({ array: i });
    this.hTLV = j.getEncodedHex();
    return this.hTLV;
  };
};
YAHOO.lang.extend(KJUR.asn1.cms.EncapsulatedContentInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.ContentInfo = function(f) {
  var c = KJUR, b = c.asn1, d = b.DERTaggedObject, a = b.DERSequence, e = b.x509;
  KJUR.asn1.cms.ContentInfo.superclass.constructor.call(this);
  this.dContentType = null;
  this.dContent = null;
  this.setContentType = function(g) {
    if (typeof g == "string") {
      this.dContentType = e.OID.name2obj(g);
    }
  };
  this.getEncodedHex = function() {
    var h2 = new d({ obj: this.dContent, tag: "a0", explicit: true });
    var g = new a({ array: [this.dContentType, h2] });
    this.hTLV = g.getEncodedHex();
    return this.hTLV;
  };
  if (f !== void 0) {
    if (f.type) {
      this.setContentType(f.type);
    }
    if (f.obj && f.obj instanceof b.ASN1Object) {
      this.dContent = f.obj;
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.ContentInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.SignedData = function(e) {
  var a = KJUR, h2 = a.asn1, j = h2.ASN1Object, g = h2.DERInteger, m = h2.DERSet, f = h2.DERSequence, b = h2.DERTaggedObject, l = h2.cms, i = l.EncapsulatedContentInfo, d = l.SignerInfo, n = l.ContentInfo, c = h2.x509, k = c.AlgorithmIdentifier;
  KJUR.asn1.cms.SignedData.superclass.constructor.call(this);
  this.dCMSVersion = new g({ "int": 1 });
  this.dDigestAlgs = null;
  this.digestAlgNameList = [];
  this.dEncapContentInfo = new i();
  this.dCerts = null;
  this.certificateList = [];
  this.crlList = [];
  this.signerInfoList = [new d()];
  this.addCertificatesByPEM = function(p) {
    var q = pemtohex(p);
    var r = new j();
    r.hTLV = q;
    this.certificateList.push(r);
  };
  this.getEncodedHex = function() {
    if (typeof this.hTLV == "string") {
      return this.hTLV;
    }
    if (this.dDigestAlgs == null) {
      var u = [];
      for (var t = 0; t < this.digestAlgNameList.length; t++) {
        var s = this.digestAlgNameList[t];
        var w = new k({ name: s });
        u.push(w);
      }
      this.dDigestAlgs = new m({ array: u });
    }
    var p = [this.dCMSVersion, this.dDigestAlgs, this.dEncapContentInfo];
    if (this.dCerts == null) {
      if (this.certificateList.length > 0) {
        var v = new m({ array: this.certificateList });
        this.dCerts = new b({ obj: v, tag: "a0", explicit: false });
      }
    }
    if (this.dCerts != null) {
      p.push(this.dCerts);
    }
    var r = new m({ array: this.signerInfoList });
    p.push(r);
    var q = new f({ array: p });
    this.hTLV = q.getEncodedHex();
    return this.hTLV;
  };
  this.getContentInfo = function() {
    this.getEncodedHex();
    var o = new n({ type: "signed-data", obj: this });
    return o;
  };
  this.getContentInfoEncodedHex = function() {
    var o = this.getContentInfo();
    var p = o.getEncodedHex();
    return p;
  };
  this.getPEM = function() {
    return hextopem(this.getContentInfoEncodedHex(), "CMS");
  };
};
YAHOO.lang.extend(KJUR.asn1.cms.SignedData, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.CMSUtil = new function() {
}();
KJUR.asn1.cms.CMSUtil.newSignedData = function(d) {
  var b = KJUR, j = b.asn1, q = j.cms, f = q.SignerInfo, n = q.SignedData, o = q.SigningTime, a = q.SigningCertificate, p = q.SigningCertificateV2, c = j.cades, e = c.SignaturePolicyIdentifier;
  var m = new n();
  m.dEncapContentInfo.setContentValue(d.content);
  if (typeof d.certs == "object") {
    for (var h2 = 0; h2 < d.certs.length; h2++) {
      m.addCertificatesByPEM(d.certs[h2]);
    }
  }
  m.signerInfoList = [];
  for (var h2 = 0; h2 < d.signerInfos.length; h2++) {
    var k = d.signerInfos[h2];
    var g = new f();
    g.setSignerIdentifier(k.signerCert);
    g.setForContentAndHash({ sdObj: m, eciObj: m.dEncapContentInfo, hashAlg: k.hashAlg });
    for (attrName in k.sAttr) {
      var r = k.sAttr[attrName];
      if (attrName == "SigningTime") {
        var l = new o(r);
        g.dSignedAttrs.add(l);
      }
      if (attrName == "SigningCertificate") {
        var l = new a(r);
        g.dSignedAttrs.add(l);
      }
      if (attrName == "SigningCertificateV2") {
        var l = new p(r);
        g.dSignedAttrs.add(l);
      }
      if (attrName == "SignaturePolicyIdentifier") {
        var l = new e(r);
        g.dSignedAttrs.add(l);
      }
    }
    g.sign(k.signerPrvKey, k.sigAlg);
    m.signerInfoList.push(g);
  }
  return m;
};
KJUR.asn1.cms.CMSUtil.verifySignedData = function(n) {
  var C = KJUR, p = C.asn1, s = p.cms;
  s.SignerInfo;
  s.SignedData;
  s.SigningTime;
  s.SigningCertificate;
  s.SigningCertificateV2;
  var A = p.cades;
  A.SignaturePolicyIdentifier;
  var i = C.lang.String.isHex, v = ASN1HEX, h2 = v.getVbyList, a = v.getTLVbyList, t = v.getIdxbyList, z = v.getChildIdx, c = v.getTLV, B = v.oidname, j = C.crypto.Util.hashHex;
  if (n.cms === void 0 && !i(n.cms))
    ;
  var E = n.cms;
  var g = function(J, H) {
    var G;
    for (var I = 3; I < 6; I++) {
      G = t(J, 0, [1, 0, I]);
      if (G !== void 0) {
        var F = J.substr(G, 2);
        if (F === "a0") {
          H.certsIdx = G;
        }
        if (F === "a1") {
          H.revinfosIdx = G;
        }
        if (F === "31") {
          H.signerinfosIdx = G;
        }
      }
    }
  };
  var l = function(I, F) {
    var H = F.signerinfosIdx;
    if (H === void 0) {
      return;
    }
    var L = z(I, H);
    F.signerInfoIdxList = L;
    for (var G = 0; G < L.length; G++) {
      var K = L[G];
      var J = { idx: K };
      k(I, J);
      F.signerInfos.push(J);
    }
  };
  var k = function(I, J) {
    var F = J.idx;
    J.signerid_issuer1 = a(I, F, [1, 0], "30");
    J.signerid_serial1 = h2(I, F, [1, 1], "02");
    J.hashalg = B(h2(I, F, [2, 0], "06"));
    var H = t(I, F, [3], "a0");
    J.idxSignedAttrs = H;
    f(I, J, H);
    var G = z(I, F);
    var K = G.length;
    if (K < 6) {
      throw "malformed SignerInfo";
    }
    J.sigalg = B(h2(I, F, [K - 2, 0], "06"));
    J.sigval = h2(I, F, [K - 1], "04");
  };
  var f = function(L, M, F) {
    var J = z(L, F);
    M.signedAttrIdxList = J;
    for (var K = 0; K < J.length; K++) {
      var I = J[K];
      var G = h2(L, I, [0], "06");
      var H;
      if (G === "2a864886f70d010905") {
        H = hextoutf8(h2(L, I, [1, 0]));
        M.saSigningTime = H;
      } else {
        if (G === "2a864886f70d010904") {
          H = h2(L, I, [1, 0], "04");
          M.saMessageDigest = H;
        }
      }
    }
  };
  var w = function(G, F) {
    if (h2(G, 0, [0], "06") !== "2a864886f70d010702") {
      return F;
    }
    F.cmsType = "signedData";
    F.econtent = h2(G, 0, [1, 0, 2, 1, 0]);
    g(G, F);
    F.signerInfos = [];
    l(G, F);
  };
  var o = function(J, F) {
    var G = F.parse.signerInfos;
    var L = G.length;
    var K = true;
    for (var I = 0; I < L; I++) {
      var H = G[I];
      e(J, F, H);
      if (!H.isValid) {
        K = false;
      }
    }
    F.isValid = K;
  };
  var x = function(F, Q, J, P) {
    var N = Q.parse.certsIdx;
    var H;
    if (Q.certs === void 0) {
      H = [];
      Q.certkeys = [];
      var K = z(F, N);
      for (var I = 0; I < K.length; I++) {
        var M = c(F, K[I]);
        var O = new X509();
        O.readCertHex(M);
        H[I] = O;
        Q.certkeys[I] = O.getPublicKey();
      }
      Q.certs = H;
    } else {
      H = Q.certs;
    }
    Q.cccc = H.length;
    Q.cccci = K.length;
    for (var I = 0; I < H.length; I++) {
      var L = O.getIssuerHex();
      var G = O.getSerialNumberHex();
      if (J.signerid_issuer1 === L && J.signerid_serial1 === G) {
        J.certkey_idx = I;
      }
    }
  };
  var e = function(F, R, I, N) {
    I.verifyDetail = {};
    var Q = I.verifyDetail;
    var K = R.parse.econtent;
    var G = I.hashalg;
    var L = I.saMessageDigest;
    Q.validMessageDigest = false;
    if (j(K, G) === L) {
      Q.validMessageDigest = true;
    }
    x(F, R, I);
    Q.validSignatureValue = false;
    var H = I.sigalg;
    var M = "31" + c(F, I.idxSignedAttrs).substr(2);
    I.signedattrshex = M;
    var J = R.certs[I.certkey_idx].getPublicKey();
    var P = new KJUR.crypto.Signature({ alg: H });
    P.init(J);
    P.updateHex(M);
    var O = P.verify(I.sigval);
    Q.validSignatureValue_isValid = O;
    if (O === true) {
      Q.validSignatureValue = true;
    }
    I.isValid = false;
    if (Q.validMessageDigest && Q.validSignatureValue) {
      I.isValid = true;
    }
  };
  var r = { isValid: false, parse: {} };
  w(E, r.parse);
  o(E, r);
  return r;
};
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {};
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
  KJUR.asn1 = {};
}
if (typeof KJUR.asn1.tsp == "undefined" || !KJUR.asn1.tsp) {
  KJUR.asn1.tsp = {};
}
KJUR.asn1.tsp.Accuracy = function(f) {
  var c = KJUR, b = c.asn1, e = b.DERInteger, a = b.DERSequence, d = b.DERTaggedObject;
  b.tsp.Accuracy.superclass.constructor.call(this);
  this.seconds = null;
  this.millis = null;
  this.micros = null;
  this.getEncodedHex = function() {
    var i = null;
    var k = null;
    var m = null;
    var g = [];
    if (this.seconds != null) {
      i = new e({ "int": this.seconds });
      g.push(i);
    }
    if (this.millis != null) {
      var l = new e({ "int": this.millis });
      k = new d({ obj: l, tag: "80", explicit: false });
      g.push(k);
    }
    if (this.micros != null) {
      var j = new e({ "int": this.micros });
      m = new d({ obj: j, tag: "81", explicit: false });
      g.push(m);
    }
    var h2 = new a({ array: g });
    this.hTLV = h2.getEncodedHex();
    return this.hTLV;
  };
  if (f !== void 0) {
    if (typeof f.seconds == "number") {
      this.seconds = f.seconds;
    }
    if (typeof f.millis == "number") {
      this.millis = f.millis;
    }
    if (typeof f.micros == "number") {
      this.micros = f.micros;
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.Accuracy, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.MessageImprint = function(g) {
  var c = KJUR, b = c.asn1, a = b.DERSequence, d = b.DEROctetString, f = b.x509, e = f.AlgorithmIdentifier;
  b.tsp.MessageImprint.superclass.constructor.call(this);
  this.dHashAlg = null;
  this.dHashValue = null;
  this.getEncodedHex = function() {
    if (typeof this.hTLV == "string") {
      return this.hTLV;
    }
    var h2 = new a({ array: [this.dHashAlg, this.dHashValue] });
    return h2.getEncodedHex();
  };
  if (g !== void 0) {
    if (typeof g.hashAlg == "string") {
      this.dHashAlg = new e({ name: g.hashAlg });
    }
    if (typeof g.hashValue == "string") {
      this.dHashValue = new d({ hex: g.hashValue });
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.MessageImprint, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.TimeStampReq = function(c) {
  var a = KJUR, f = a.asn1, d = f.DERSequence, e = f.DERInteger, g = f.DERBoolean, i = f.DERObjectIdentifier, h2 = f.tsp, b = h2.MessageImprint;
  h2.TimeStampReq.superclass.constructor.call(this);
  this.dVersion = new e({ "int": 1 });
  this.dMessageImprint = null;
  this.dPolicy = null;
  this.dNonce = null;
  this.certReq = true;
  this.setMessageImprint = function(j) {
    if (j instanceof b) {
      this.dMessageImprint = j;
      return;
    }
    if (typeof j == "object") {
      this.dMessageImprint = new b(j);
    }
  };
  this.getEncodedHex = function() {
    if (this.dMessageImprint == null) {
      throw "messageImprint shall be specified";
    }
    var j = [this.dVersion, this.dMessageImprint];
    if (this.dPolicy != null) {
      j.push(this.dPolicy);
    }
    if (this.dNonce != null) {
      j.push(this.dNonce);
    }
    if (this.certReq) {
      j.push(new g());
    }
    var k = new d({ array: j });
    this.hTLV = k.getEncodedHex();
    return this.hTLV;
  };
  if (c !== void 0) {
    if (typeof c.mi == "object") {
      this.setMessageImprint(c.mi);
    }
    if (typeof c.policy == "object") {
      this.dPolicy = new i(c.policy);
    }
    if (typeof c.nonce == "object") {
      this.dNonce = new e(c.nonce);
    }
    if (typeof c.certreq == "boolean") {
      this.certReq = c.certreq;
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.TimeStampReq, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.TSTInfo = function(e) {
  var c = KJUR, i = c.asn1, f = i.DERSequence, h2 = i.DERInteger, k = i.DERBoolean, g = i.DERGeneralizedTime, l = i.DERObjectIdentifier, j = i.tsp, d = j.MessageImprint, b = j.Accuracy, a = i.x509.X500Name;
  j.TSTInfo.superclass.constructor.call(this);
  this.dVersion = new h2({ "int": 1 });
  this.dPolicy = null;
  this.dMessageImprint = null;
  this.dSerialNumber = null;
  this.dGenTime = null;
  this.dAccuracy = null;
  this.dOrdering = null;
  this.dNonce = null;
  this.dTsa = null;
  this.getEncodedHex = function() {
    var m = [this.dVersion];
    if (this.dPolicy == null) {
      throw "policy shall be specified.";
    }
    m.push(this.dPolicy);
    if (this.dMessageImprint == null) {
      throw "messageImprint shall be specified.";
    }
    m.push(this.dMessageImprint);
    if (this.dSerialNumber == null) {
      throw "serialNumber shall be specified.";
    }
    m.push(this.dSerialNumber);
    if (this.dGenTime == null) {
      throw "genTime shall be specified.";
    }
    m.push(this.dGenTime);
    if (this.dAccuracy != null) {
      m.push(this.dAccuracy);
    }
    if (this.dOrdering != null) {
      m.push(this.dOrdering);
    }
    if (this.dNonce != null) {
      m.push(this.dNonce);
    }
    if (this.dTsa != null) {
      m.push(this.dTsa);
    }
    var n = new f({ array: m });
    this.hTLV = n.getEncodedHex();
    return this.hTLV;
  };
  if (e !== void 0) {
    if (typeof e.policy == "string") {
      if (!e.policy.match(/^[0-9.]+$/)) {
        throw "policy shall be oid like 0.1.4.134";
      }
      this.dPolicy = new l({ oid: e.policy });
    }
    if (e.messageImprint !== void 0) {
      this.dMessageImprint = new d(e.messageImprint);
    }
    if (e.serialNumber !== void 0) {
      this.dSerialNumber = new h2(e.serialNumber);
    }
    if (e.genTime !== void 0) {
      this.dGenTime = new g(e.genTime);
    }
    if (e.accuracy !== void 0) {
      this.dAccuracy = new b(e.accuracy);
    }
    if (e.ordering !== void 0 && e.ordering == true) {
      this.dOrdering = new k();
    }
    if (e.nonce !== void 0) {
      this.dNonce = new h2(e.nonce);
    }
    if (e.tsa !== void 0) {
      this.dTsa = new a(e.tsa);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.TSTInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.TimeStampResp = function(g) {
  var e = KJUR, d = e.asn1, c = d.DERSequence, f = d.ASN1Object, a = d.tsp, b = a.PKIStatusInfo;
  a.TimeStampResp.superclass.constructor.call(this);
  this.dStatus = null;
  this.dTST = null;
  this.getEncodedHex = function() {
    if (this.dStatus == null) {
      throw "status shall be specified";
    }
    var h2 = [this.dStatus];
    if (this.dTST != null) {
      h2.push(this.dTST);
    }
    var i = new c({ array: h2 });
    this.hTLV = i.getEncodedHex();
    return this.hTLV;
  };
  if (g !== void 0) {
    if (typeof g.status == "object") {
      this.dStatus = new b(g.status);
    }
    if (g.tst !== void 0 && g.tst instanceof f) {
      this.dTST = g.tst.getContentInfo();
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.TimeStampResp, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIStatusInfo = function(h2) {
  var g = KJUR, f = g.asn1, e = f.DERSequence, a = f.tsp, d = a.PKIStatus, c = a.PKIFreeText, b = a.PKIFailureInfo;
  a.PKIStatusInfo.superclass.constructor.call(this);
  this.dStatus = null;
  this.dStatusString = null;
  this.dFailureInfo = null;
  this.getEncodedHex = function() {
    if (this.dStatus == null) {
      throw "status shall be specified";
    }
    var i = [this.dStatus];
    if (this.dStatusString != null) {
      i.push(this.dStatusString);
    }
    if (this.dFailureInfo != null) {
      i.push(this.dFailureInfo);
    }
    var j = new e({ array: i });
    this.hTLV = j.getEncodedHex();
    return this.hTLV;
  };
  if (h2 !== void 0) {
    if (typeof h2.status == "object") {
      this.dStatus = new d(h2.status);
    }
    if (typeof h2.statstr == "object") {
      this.dStatusString = new c({ array: h2.statstr });
    }
    if (typeof h2.failinfo == "object") {
      this.dFailureInfo = new b(h2.failinfo);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.PKIStatusInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIStatus = function(h2) {
  var d = KJUR, c = d.asn1, g = c.DERInteger, a = c.tsp, b = a.PKIStatus;
  a.PKIStatus.superclass.constructor.call(this);
  this.getEncodedHex = function() {
    this.hTLV = this.dStatus.getEncodedHex();
    return this.hTLV;
  };
  if (h2 !== void 0) {
    if (h2.name !== void 0) {
      var e = b.valueList;
      if (e[h2.name] === void 0) {
        throw "name undefined: " + h2.name;
      }
      this.dStatus = new g({ "int": e[h2.name] });
    } else {
      this.dStatus = new g(h2);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.PKIStatus, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIStatus.valueList = { granted: 0, grantedWithMods: 1, rejection: 2, waiting: 3, revocationWarning: 4, revocationNotification: 5 };
KJUR.asn1.tsp.PKIFreeText = function(f) {
  var e = KJUR, d = e.asn1, b = d.DERSequence, c = d.DERUTF8String, a = d.tsp;
  a.PKIFreeText.superclass.constructor.call(this);
  this.textList = [];
  this.getEncodedHex = function() {
    var g = [];
    for (var j = 0; j < this.textList.length; j++) {
      g.push(new c({ str: this.textList[j] }));
    }
    var h2 = new b({ array: g });
    this.hTLV = h2.getEncodedHex();
    return this.hTLV;
  };
  if (f !== void 0) {
    if (typeof f.array == "object") {
      this.textList = f.array;
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.PKIFreeText, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIFailureInfo = function(g) {
  var d = KJUR, c = d.asn1, f = c.DERBitString, a = c.tsp, b = a.PKIFailureInfo;
  b.superclass.constructor.call(this);
  this.value = null;
  this.getEncodedHex = function() {
    if (this.value == null) {
      throw "value shall be specified";
    }
    var h2 = new Number(this.value).toString(2);
    var i = new f();
    i.setByBinaryString(h2);
    this.hTLV = i.getEncodedHex();
    return this.hTLV;
  };
  if (g !== void 0) {
    if (typeof g.name == "string") {
      var e = b.valueList;
      if (e[g.name] === void 0) {
        throw "name undefined: " + g.name;
      }
      this.value = e[g.name];
    } else {
      if (typeof g["int"] == "number") {
        this.value = g["int"];
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.PKIFailureInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIFailureInfo.valueList = { badAlg: 0, badRequest: 2, badDataFormat: 5, timeNotAvailable: 14, unacceptedPolicy: 15, unacceptedExtension: 16, addInfoNotAvailable: 17, systemFailure: 25 };
KJUR.asn1.tsp.AbstractTSAAdapter = function(a) {
  this.getTSTHex = function(c, b) {
    throw "not implemented yet";
  };
};
KJUR.asn1.tsp.SimpleTSAAdapter = function(e) {
  var d = KJUR, c = d.asn1, a = c.tsp, b = d.crypto.Util.hashHex;
  a.SimpleTSAAdapter.superclass.constructor.call(this);
  this.params = null;
  this.serial = 0;
  this.getTSTHex = function(g, f) {
    var i = b(g, f);
    this.params.tstInfo.messageImprint = { hashAlg: f, hashValue: i };
    this.params.tstInfo.serialNumber = { "int": this.serial++ };
    var h2 = Math.floor(Math.random() * 1e9);
    this.params.tstInfo.nonce = { "int": h2 };
    var j = a.TSPUtil.newTimeStampToken(this.params);
    return j.getContentInfoEncodedHex();
  };
  if (e !== void 0) {
    this.params = e;
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.SimpleTSAAdapter, KJUR.asn1.tsp.AbstractTSAAdapter);
KJUR.asn1.tsp.FixedTSAAdapter = function(e) {
  var d = KJUR, c = d.asn1, a = c.tsp, b = d.crypto.Util.hashHex;
  a.FixedTSAAdapter.superclass.constructor.call(this);
  this.params = null;
  this.getTSTHex = function(g, f) {
    var h2 = b(g, f);
    this.params.tstInfo.messageImprint = { hashAlg: f, hashValue: h2 };
    var i = a.TSPUtil.newTimeStampToken(this.params);
    return i.getContentInfoEncodedHex();
  };
  if (e !== void 0) {
    this.params = e;
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.FixedTSAAdapter, KJUR.asn1.tsp.AbstractTSAAdapter);
KJUR.asn1.tsp.TSPUtil = new function() {
}();
KJUR.asn1.tsp.TSPUtil.newTimeStampToken = function(c) {
  var b = KJUR, h2 = b.asn1, m = h2.cms;
  h2.tsp;
  var a = h2.tsp.TSTInfo;
  var j = new m.SignedData();
  var g = new a(c.tstInfo);
  var f = g.getEncodedHex();
  j.dEncapContentInfo.setContentValue({ hex: f });
  j.dEncapContentInfo.setContentType("tstinfo");
  if (typeof c.certs == "object") {
    for (var e = 0; e < c.certs.length; e++) {
      j.addCertificatesByPEM(c.certs[e]);
    }
  }
  var d = j.signerInfoList[0];
  d.setSignerIdentifier(c.signerCert);
  d.setForContentAndHash({ sdObj: j, eciObj: j.dEncapContentInfo, hashAlg: c.hashAlg });
  var l = new m.SigningCertificate({ array: [c.signerCert] });
  d.dSignedAttrs.add(l);
  d.sign(c.signerPrvKey, c.sigAlg);
  return j;
};
KJUR.asn1.tsp.TSPUtil.parseTimeStampReq = function(m) {
  var l = ASN1HEX;
  var h2 = l.getChildIdx;
  var f = l.getV;
  var b = l.getTLV;
  var j = {};
  j.certreq = false;
  var a = h2(m, 0);
  if (a.length < 2) {
    throw "TimeStampReq must have at least 2 items";
  }
  var e = b(m, a[1]);
  j.mi = KJUR.asn1.tsp.TSPUtil.parseMessageImprint(e);
  for (var d = 2; d < a.length; d++) {
    var g = a[d];
    var k = m.substr(g, 2);
    if (k == "06") {
      var c = f(m, g);
      j.policy = l.hextooidstr(c);
    }
    if (k == "02") {
      j.nonce = f(m, g);
    }
    if (k == "01") {
      j.certreq = true;
    }
  }
  return j;
};
KJUR.asn1.tsp.TSPUtil.parseMessageImprint = function(c) {
  var m = ASN1HEX;
  var j = m.getChildIdx;
  var i = m.getV;
  var g = m.getIdxbyList;
  var k = {};
  if (c.substr(0, 2) != "30") {
    throw "head of messageImprint hex shall be '30'";
  }
  j(c, 0);
  var l = g(c, 0, [0, 0]);
  var e = i(c, l);
  var d = m.hextooidstr(e);
  var h2 = KJUR.asn1.x509.OID.oid2name(d);
  if (h2 == "") {
    throw "hashAlg name undefined: " + d;
  }
  var b = h2;
  var f = g(c, 0, [1]);
  k.hashAlg = b;
  k.hashValue = i(c, f);
  return k;
};
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {};
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
  KJUR.asn1 = {};
}
if (typeof KJUR.asn1.cades == "undefined" || !KJUR.asn1.cades) {
  KJUR.asn1.cades = {};
}
KJUR.asn1.cades.SignaturePolicyIdentifier = function(f) {
  var b = KJUR, h2 = b.asn1, i = h2.DERObjectIdentifier, g = h2.DERSequence, e = h2.cades, c = e.OtherHashAlgAndValue;
  e.SignaturePolicyIdentifier.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.16.2.15";
  if (f !== void 0) {
    if (typeof f.oid == "string" && typeof f.hash == "object") {
      var d = new i({ oid: f.oid });
      var a = new c(f.hash);
      var j = new g({ array: [d, a] });
      this.valueList = [j];
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cades.SignaturePolicyIdentifier, KJUR.asn1.cms.Attribute);
KJUR.asn1.cades.OtherHashAlgAndValue = function(e) {
  var a = KJUR, g = a.asn1, f = g.DERSequence, h2 = g.DEROctetString, d = g.x509, i = d.AlgorithmIdentifier, c = g.cades, b = c.OtherHashAlgAndValue;
  b.superclass.constructor.call(this);
  this.dAlg = null;
  this.dHash = null;
  this.getEncodedHex = function() {
    var j = new f({ array: [this.dAlg, this.dHash] });
    this.hTLV = j.getEncodedHex();
    return this.hTLV;
  };
  if (e !== void 0) {
    if (typeof e.alg == "string" && typeof e.hash == "string") {
      this.dAlg = new i({ name: e.alg });
      this.dHash = new h2({ hex: e.hash });
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cades.OtherHashAlgAndValue, KJUR.asn1.ASN1Object);
KJUR.asn1.cades.SignatureTimeStamp = function(h2) {
  var c = KJUR, b = c.asn1, e = b.ASN1Object;
  b.x509;
  var a = b.cades;
  a.SignatureTimeStamp.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.16.2.14";
  this.tstHex = null;
  if (h2 !== void 0) {
    if (h2.res !== void 0) {
      if (typeof h2.res == "string" && h2.res.match(/^[0-9A-Fa-f]+$/))
        ;
      else {
        if (h2.res instanceof e)
          ;
        else {
          throw "res param shall be ASN1Object or hex string";
        }
      }
    }
    if (h2.tst !== void 0) {
      if (typeof h2.tst == "string" && h2.tst.match(/^[0-9A-Fa-f]+$/)) {
        var f = new e();
        this.tstHex = h2.tst;
        f.hTLV = this.tstHex;
        f.getEncodedHex();
        this.valueList = [f];
      } else {
        if (h2.tst instanceof e)
          ;
        else {
          throw "tst param shall be ASN1Object or hex string";
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cades.SignatureTimeStamp, KJUR.asn1.cms.Attribute);
KJUR.asn1.cades.CompleteCertificateRefs = function(d) {
  var c = KJUR, b = c.asn1, a = b.cades;
  a.CompleteCertificateRefs.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.16.2.21";
  this.setByArray = function(e) {
    this.valueList = [];
    for (var f = 0; f < e.length; f++) {
      var g = new a.OtherCertID(e[f]);
      this.valueList.push(g);
    }
  };
  if (d !== void 0) {
    if (typeof d == "object" && typeof d.length == "number") {
      this.setByArray(d);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cades.CompleteCertificateRefs, KJUR.asn1.cms.Attribute);
KJUR.asn1.cades.OtherCertID = function(e) {
  var c = KJUR, b = c.asn1, d = b.cms, a = b.cades;
  a.OtherCertID.superclass.constructor.call(this);
  this.hasIssuerSerial = true;
  this.dOtherCertHash = null;
  this.dIssuerSerial = null;
  this.setByCertPEM = function(f) {
    this.dOtherCertHash = new a.OtherHash(f);
    if (this.hasIssuerSerial) {
      this.dIssuerSerial = new d.IssuerAndSerialNumber(f);
    }
  };
  this.getEncodedHex = function() {
    if (this.hTLV != null) {
      return this.hTLV;
    }
    if (this.dOtherCertHash == null) {
      throw "otherCertHash not set";
    }
    var f = [this.dOtherCertHash];
    if (this.dIssuerSerial != null) {
      f.push(this.dIssuerSerial);
    }
    var g = new b.DERSequence({ array: f });
    this.hTLV = g.getEncodedHex();
    return this.hTLV;
  };
  if (e !== void 0) {
    if (typeof e == "string" && e.indexOf("-----BEGIN ") != -1) {
      this.setByCertPEM(e);
    }
    if (typeof e == "object") {
      if (e.hasis === false) {
        this.hasIssuerSerial = false;
      }
      if (typeof e.cert == "string") {
        this.setByCertPEM(e.cert);
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cades.OtherCertID, KJUR.asn1.ASN1Object);
KJUR.asn1.cades.OtherHash = function(f) {
  var d = KJUR, c = d.asn1;
  c.cms;
  var b = c.cades, g = b.OtherHashAlgAndValue, a = d.crypto.Util.hashHex;
  b.OtherHash.superclass.constructor.call(this);
  this.alg = "sha256";
  this.dOtherHash = null;
  this.setByCertPEM = function(h2) {
    if (h2.indexOf("-----BEGIN ") == -1) {
      throw "certPEM not to seem PEM format";
    }
    var i = pemtohex(h2);
    var j = a(i, this.alg);
    this.dOtherHash = new g({ alg: this.alg, hash: j });
  };
  this.getEncodedHex = function() {
    if (this.dOtherHash == null) {
      throw "OtherHash not set";
    }
    return this.dOtherHash.getEncodedHex();
  };
  if (f !== void 0) {
    if (typeof f == "string") {
      if (f.indexOf("-----BEGIN ") != -1) {
        this.setByCertPEM(f);
      } else {
        if (f.match(/^[0-9A-Fa-f]+$/)) {
          this.dOtherHash = new c.DEROctetString({ hex: f });
        } else {
          throw "unsupported string value for params";
        }
      }
    } else {
      if (typeof f == "object") {
        if (typeof f.cert == "string") {
          if (typeof f.alg == "string") {
            this.alg = f.alg;
          }
          this.setByCertPEM(f.cert);
        } else {
          this.dOtherHash = new g(f);
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cades.OtherHash, KJUR.asn1.ASN1Object);
KJUR.asn1.cades.CAdESUtil = new function() {
}();
KJUR.asn1.cades.CAdESUtil.addSigTS = function(c, b, a) {
};
KJUR.asn1.cades.CAdESUtil.parseSignedDataForAddingUnsigned = function(e) {
  var p = ASN1HEX, u = p.getChildIdx, b = p.getTLV, a = p.getTLVbyList, k = p.getIdxbyList, A = KJUR, g = A.asn1, l = g.ASN1Object, j = g.cms, h2 = j.SignedData, v = g.cades, z = v.CAdESUtil;
  var m = {};
  if (a(e, 0, [0]) != "06092a864886f70d010702") {
    throw "hex is not CMS SignedData";
  }
  var y = k(e, 0, [1, 0]);
  var B = u(e, y);
  if (B.length < 4) {
    throw "num of SignedData elem shall be 4 at least";
  }
  var d = B.shift();
  m.version = b(e, d);
  var w = B.shift();
  m.algs = b(e, w);
  var c = B.shift();
  m.encapcontent = b(e, c);
  m.certs = null;
  m.revs = null;
  m.si = [];
  var o = B.shift();
  if (e.substr(o, 2) == "a0") {
    m.certs = b(e, o);
    o = B.shift();
  }
  if (e.substr(o, 2) == "a1") {
    m.revs = b(e, o);
    o = B.shift();
  }
  var t = o;
  if (e.substr(t, 2) != "31") {
    throw "Can't find signerInfos";
  }
  var f = u(e, t);
  for (var q = 0; q < f.length; q++) {
    var s = f[q];
    var n = z.parseSignerInfoForAddingUnsigned(e, s, q);
    m.si[q] = n;
  }
  var x = null;
  m.obj = new h2();
  x = new l();
  x.hTLV = m.version;
  m.obj.dCMSVersion = x;
  x = new l();
  x.hTLV = m.algs;
  m.obj.dDigestAlgs = x;
  x = new l();
  x.hTLV = m.encapcontent;
  m.obj.dEncapContentInfo = x;
  x = new l();
  x.hTLV = m.certs;
  m.obj.dCerts = x;
  m.obj.signerInfoList = [];
  for (var q = 0; q < m.si.length; q++) {
    m.obj.signerInfoList.push(m.si[q].obj);
  }
  return m;
};
KJUR.asn1.cades.CAdESUtil.parseSignerInfoForAddingUnsigned = function(g, q, c) {
  var p = ASN1HEX, s = p.getChildIdx, a = p.getTLV, l = p.getV, v = KJUR, h2 = v.asn1, n = h2.ASN1Object, j = h2.cms, k = j.AttributeList, w = j.SignerInfo;
  var o = {};
  var t = s(g, q);
  if (t.length != 6) {
    throw "not supported items for SignerInfo (!=6)";
  }
  var d = t.shift();
  o.version = a(g, d);
  var e = t.shift();
  o.si = a(g, e);
  var m = t.shift();
  o.digalg = a(g, m);
  var f = t.shift();
  o.sattrs = a(g, f);
  var i = t.shift();
  o.sigalg = a(g, i);
  var b = t.shift();
  o.sig = a(g, b);
  o.sigval = l(g, b);
  var u = null;
  o.obj = new w();
  u = new n();
  u.hTLV = o.version;
  o.obj.dCMSVersion = u;
  u = new n();
  u.hTLV = o.si;
  o.obj.dSignerIdentifier = u;
  u = new n();
  u.hTLV = o.digalg;
  o.obj.dDigestAlgorithm = u;
  u = new n();
  u.hTLV = o.sattrs;
  o.obj.dSignedAttrs = u;
  u = new n();
  u.hTLV = o.sigalg;
  o.obj.dSigAlg = u;
  u = new n();
  u.hTLV = o.sig;
  o.obj.dSig = u;
  o.obj.dUnsignedAttrs = new k();
  return o;
};
if (typeof KJUR.asn1.csr == "undefined" || !KJUR.asn1.csr) {
  KJUR.asn1.csr = {};
}
KJUR.asn1.csr.CertificationRequest = function(d) {
  var a = KJUR, f = a.asn1, b = f.DERBitString, e = f.DERSequence, k = f.csr, c = f.x509;
  k.CertificationRequest.superclass.constructor.call(this);
  this.sign = function(o, n) {
    if (this.prvKey == null) {
      this.prvKey = n;
    }
    this.asn1SignatureAlg = new c.AlgorithmIdentifier({ name: o });
    sig = new a.crypto.Signature({ alg: o });
    sig.initSign(this.prvKey);
    sig.updateHex(this.asn1CSRInfo.getEncodedHex());
    this.hexSig = sig.sign();
    this.asn1Sig = new b({ hex: "00" + this.hexSig });
    var m = new e({ array: [this.asn1CSRInfo, this.asn1SignatureAlg, this.asn1Sig] });
    this.hTLV = m.getEncodedHex();
    this.isModified = false;
  };
  this.getPEMString = function() {
    return hextopem(this.getEncodedHex(), "CERTIFICATE REQUEST");
  };
  this.getEncodedHex = function() {
    if (this.isModified == false && this.hTLV != null) {
      return this.hTLV;
    }
    throw "not signed yet";
  };
  if (d !== void 0 && d.csrinfo !== void 0) {
    this.asn1CSRInfo = d.csrinfo;
  }
};
YAHOO.lang.extend(KJUR.asn1.csr.CertificationRequest, KJUR.asn1.ASN1Object);
KJUR.asn1.csr.CertificationRequestInfo = function(e) {
  var b = KJUR, h2 = b.asn1, g = h2.DERInteger, f = h2.DERSequence, m = h2.DERSet, j = h2.DERNull, c = h2.DERTaggedObject, k = h2.DERObjectIdentifier, l = h2.csr, d = h2.x509, a = d.X500Name, n = d.Extension, i = KEYUTIL;
  l.CertificationRequestInfo.superclass.constructor.call(this);
  this._initialize = function() {
    this.asn1Array = new Array();
    this.asn1Version = new g({ "int": 0 });
    this.asn1Subject = null;
    this.asn1SubjPKey = null;
    this.extensionsArray = new Array();
  };
  this.setSubjectByParam = function(o) {
    this.asn1Subject = new a(o);
  };
  this.setSubjectPublicKeyByGetKey = function(p) {
    var o = i.getKey(p);
    this.asn1SubjPKey = new d.SubjectPublicKeyInfo(o);
  };
  this.appendExtensionByName = function(p, o) {
    n.appendByNameToArray(p, o, this.extensionsArray);
  };
  this.getEncodedHex = function() {
    this.asn1Array = new Array();
    this.asn1Array.push(this.asn1Version);
    this.asn1Array.push(this.asn1Subject);
    this.asn1Array.push(this.asn1SubjPKey);
    if (this.extensionsArray.length > 0) {
      var s = new f({ array: this.extensionsArray });
      var r = new m({ array: [s] });
      var q = new f({ array: [new k({ oid: "1.2.840.113549.1.9.14" }), r] });
      var p = new c({ explicit: true, tag: "a0", obj: q });
      this.asn1Array.push(p);
    } else {
      var p = new c({ explicit: false, tag: "a0", obj: new j() });
      this.asn1Array.push(p);
    }
    var t = new f({ array: this.asn1Array });
    this.hTLV = t.getEncodedHex();
    this.isModified = false;
    return this.hTLV;
  };
  this._initialize();
};
YAHOO.lang.extend(KJUR.asn1.csr.CertificationRequestInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.csr.CSRUtil = new function() {
}();
KJUR.asn1.csr.CSRUtil.newCSRPEM = function(h2) {
  var c = KEYUTIL, b = KJUR.asn1.csr;
  if (h2.subject === void 0) {
    throw "parameter subject undefined";
  }
  if (h2.sbjpubkey === void 0) {
    throw "parameter sbjpubkey undefined";
  }
  if (h2.sigalg === void 0) {
    throw "parameter sigalg undefined";
  }
  if (h2.sbjprvkey === void 0) {
    throw "parameter sbjpubkey undefined";
  }
  var d = new b.CertificationRequestInfo();
  d.setSubjectByParam(h2.subject);
  d.setSubjectPublicKeyByGetKey(h2.sbjpubkey);
  if (h2.ext !== void 0 && h2.ext.length !== void 0) {
    for (var e = 0; e < h2.ext.length; e++) {
      for (key in h2.ext[e]) {
        d.appendExtensionByName(key, h2.ext[e][key]);
      }
    }
  }
  var f = new b.CertificationRequest({ csrinfo: d });
  var a = c.getKey(h2.sbjprvkey);
  f.sign(h2.sigalg, a);
  var g = f.getPEMString();
  return g;
};
KJUR.asn1.csr.CSRUtil.getInfo = function(b) {
  var d = ASN1HEX;
  var e = d.getTLVbyList;
  var a = {};
  a.subject = {};
  a.pubkey = {};
  if (b.indexOf("-----BEGIN CERTIFICATE REQUEST") == -1) {
    throw "argument is not PEM file";
  }
  var c = pemtohex(b, "CERTIFICATE REQUEST");
  a.subject.hex = e(c, 0, [0, 1]);
  a.subject.name = X509.hex2dn(a.subject.hex);
  a.pubkey.hex = e(c, 0, [0, 2]);
  a.pubkey.obj = KEYUTIL.getKey(a.pubkey.hex, null, "pkcs8pub");
  return a;
};
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {};
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
  KJUR.asn1 = {};
}
if (typeof KJUR.asn1.ocsp == "undefined" || !KJUR.asn1.ocsp) {
  KJUR.asn1.ocsp = {};
}
KJUR.asn1.ocsp.DEFAULT_HASH = "sha1";
KJUR.asn1.ocsp.CertID = function(g) {
  var d = KJUR, k = d.asn1, m = k.DEROctetString, j = k.DERInteger, h2 = k.DERSequence, f = k.x509, n = f.AlgorithmIdentifier, o = k.ocsp, l = o.DEFAULT_HASH, i = d.crypto, e = i.Util.hashHex, c = X509, q = ASN1HEX;
  o.CertID.superclass.constructor.call(this);
  this.dHashAlg = null;
  this.dIssuerNameHash = null;
  this.dIssuerKeyHash = null;
  this.dSerialNumber = null;
  this.setByValue = function(t, s, p, r) {
    if (r === void 0) {
      r = l;
    }
    this.dHashAlg = new n({ name: r });
    this.dIssuerNameHash = new m({ hex: t });
    this.dIssuerKeyHash = new m({ hex: s });
    this.dSerialNumber = new j({ hex: p });
  };
  this.setByCert = function(x, t, v) {
    if (v === void 0) {
      v = l;
    }
    var p = new c();
    p.readCertPEM(t);
    var y = new c();
    y.readCertPEM(x);
    var z = y.getPublicKeyHex();
    var w = q.getTLVbyList(z, 0, [1, 0], "30");
    var r = p.getSerialNumberHex();
    var s = e(y.getSubjectHex(), v);
    var u = e(w, v);
    this.setByValue(s, u, r, v);
    this.hoge = p.getSerialNumberHex();
  };
  this.getEncodedHex = function() {
    if (this.dHashAlg === null && this.dIssuerNameHash === null && this.dIssuerKeyHash === null && this.dSerialNumber === null) {
      throw "not yet set values";
    }
    var p = [this.dHashAlg, this.dIssuerNameHash, this.dIssuerKeyHash, this.dSerialNumber];
    var r = new h2({ array: p });
    this.hTLV = r.getEncodedHex();
    return this.hTLV;
  };
  if (g !== void 0) {
    var b = g;
    if (b.issuerCert !== void 0 && b.subjectCert !== void 0) {
      var a = l;
      if (b.alg === void 0) {
        a = void 0;
      }
      this.setByCert(b.issuerCert, b.subjectCert, a);
    } else {
      if (b.namehash !== void 0 && b.keyhash !== void 0 && b.serial !== void 0) {
        var a = l;
        if (b.alg === void 0) {
          a = void 0;
        }
        this.setByValue(b.namehash, b.keyhash, b.serial, a);
      } else {
        throw "invalid constructor arguments";
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.ocsp.CertID, KJUR.asn1.ASN1Object);
KJUR.asn1.ocsp.Request = function(f) {
  var c = KJUR, b = c.asn1, a = b.DERSequence, d = b.ocsp;
  d.Request.superclass.constructor.call(this);
  this.dReqCert = null;
  this.dExt = null;
  this.getEncodedHex = function() {
    var g = [];
    if (this.dReqCert === null) {
      throw "reqCert not set";
    }
    g.push(this.dReqCert);
    var h2 = new a({ array: g });
    this.hTLV = h2.getEncodedHex();
    return this.hTLV;
  };
  if (typeof f !== "undefined") {
    var e = new d.CertID(f);
    this.dReqCert = e;
  }
};
YAHOO.lang.extend(KJUR.asn1.ocsp.Request, KJUR.asn1.ASN1Object);
KJUR.asn1.ocsp.TBSRequest = function(e) {
  var c = KJUR, b = c.asn1, a = b.DERSequence, d = b.ocsp;
  d.TBSRequest.superclass.constructor.call(this);
  this.version = 0;
  this.dRequestorName = null;
  this.dRequestList = [];
  this.dRequestExt = null;
  this.setRequestListByParam = function(h2) {
    var f = [];
    for (var g = 0; g < h2.length; g++) {
      var j = new d.Request(h2[0]);
      f.push(j);
    }
    this.dRequestList = f;
  };
  this.getEncodedHex = function() {
    var f = [];
    if (this.version !== 0) {
      throw "not supported version: " + this.version;
    }
    if (this.dRequestorName !== null) {
      throw "requestorName not supported";
    }
    var h2 = new a({ array: this.dRequestList });
    f.push(h2);
    if (this.dRequestExt !== null) {
      throw "requestExtensions not supported";
    }
    var g = new a({ array: f });
    this.hTLV = g.getEncodedHex();
    return this.hTLV;
  };
  if (e !== void 0) {
    if (e.reqList !== void 0) {
      this.setRequestListByParam(e.reqList);
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.ocsp.TBSRequest, KJUR.asn1.ASN1Object);
KJUR.asn1.ocsp.OCSPRequest = function(f) {
  var c = KJUR, b = c.asn1, a = b.DERSequence, d = b.ocsp;
  d.OCSPRequest.superclass.constructor.call(this);
  this.dTbsRequest = null;
  this.dOptionalSignature = null;
  this.getEncodedHex = function() {
    var g = [];
    if (this.dTbsRequest !== null) {
      g.push(this.dTbsRequest);
    } else {
      throw "tbsRequest not set";
    }
    if (this.dOptionalSignature !== null) {
      throw "optionalSignature not supported";
    }
    var h2 = new a({ array: g });
    this.hTLV = h2.getEncodedHex();
    return this.hTLV;
  };
  if (f !== void 0) {
    if (f.reqList !== void 0) {
      var e = new d.TBSRequest(f);
      this.dTbsRequest = e;
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.ocsp.OCSPRequest, KJUR.asn1.ASN1Object);
KJUR.asn1.ocsp.OCSPUtil = {};
KJUR.asn1.ocsp.OCSPUtil.getRequestHex = function(a, b, h2) {
  var d = KJUR, c = d.asn1, e = c.ocsp;
  if (h2 === void 0) {
    h2 = e.DEFAULT_HASH;
  }
  var g = { alg: h2, issuerCert: a, subjectCert: b };
  var f = new e.OCSPRequest({ reqList: [g] });
  return f.getEncodedHex();
};
KJUR.asn1.ocsp.OCSPUtil.getOCSPResponseInfo = function(b) {
  var k = ASN1HEX;
  var c = k.getVbyList;
  var d = k.getIdxbyList;
  var c = k.getVbyList;
  var f = k.getV;
  var l = {};
  try {
    var i = c(b, 0, [0], "0a");
    l.responseStatus = parseInt(i, 16);
  } catch (e) {
  }
  if (l.responseStatus !== 0) {
    return l;
  }
  try {
    var g = d(b, 0, [1, 0, 1, 0, 0, 2, 0, 1]);
    if (b.substr(g, 2) === "80") {
      l.certStatus = "good";
    } else {
      if (b.substr(g, 2) === "a1") {
        l.certStatus = "revoked";
        l.revocationTime = hextoutf8(c(b, g, [0]));
      } else {
        if (b.substr(g, 2) === "82") {
          l.certStatus = "unknown";
        }
      }
    }
  } catch (e) {
  }
  try {
    var a = d(b, 0, [1, 0, 1, 0, 0, 2, 0, 2]);
    l.thisUpdate = hextoutf8(f(b, a));
  } catch (e) {
  }
  try {
    var j = d(b, 0, [1, 0, 1, 0, 0, 2, 0, 3]);
    if (b.substr(j, 2) === "a0") {
      l.nextUpdate = hextoutf8(c(b, j, [0]));
    }
  } catch (e) {
  }
  return l;
};
var KJUR;
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {};
}
if (typeof KJUR.lang == "undefined" || !KJUR.lang) {
  KJUR.lang = {};
}
KJUR.lang.String = function() {
};
function stoBA(d) {
  var b = new Array();
  for (var c = 0; c < d.length; c++) {
    b[c] = d.charCodeAt(c);
  }
  return b;
}
function BAtohex(b) {
  var e = "";
  for (var d = 0; d < b.length; d++) {
    var c = b[d].toString(16);
    if (c.length == 1) {
      c = "0" + c;
    }
    e = e + c;
  }
  return e;
}
function stohex(a) {
  return BAtohex(stoBA(a));
}
function stob64(a) {
  return hex2b64(stohex(a));
}
function b64tob64u(a) {
  a = a.replace(/\=/g, "");
  a = a.replace(/\+/g, "-");
  a = a.replace(/\//g, "_");
  return a;
}
function b64utob64(a) {
  if (a.length % 4 == 2) {
    a = a + "==";
  } else {
    if (a.length % 4 == 3) {
      a = a + "=";
    }
  }
  a = a.replace(/-/g, "+");
  a = a.replace(/_/g, "/");
  return a;
}
function hextob64u(a) {
  if (a.length % 2 == 1) {
    a = "0" + a;
  }
  return b64tob64u(hex2b64(a));
}
function b64utohex(a) {
  return b64tohex(b64utob64(a));
}
var utf8tob64u, b64utoutf8;
if (typeof Buffer === "function") {
  utf8tob64u = function(a) {
    return b64tob64u(new Buffer(a, "utf8").toString("base64"));
  };
  b64utoutf8 = function(a) {
    return new Buffer(b64utob64(a), "base64").toString("utf8");
  };
} else {
  utf8tob64u = function(a) {
    return hextob64u(uricmptohex(encodeURIComponentAll(a)));
  };
  b64utoutf8 = function(a) {
    return decodeURIComponent(hextouricmp(b64utohex(a)));
  };
}
function utf8tohex(a) {
  return uricmptohex(encodeURIComponentAll(a));
}
function hextoutf8(a) {
  return decodeURIComponent(hextouricmp(a));
}
function hextorstr(c) {
  var b = "";
  for (var a = 0; a < c.length - 1; a += 2) {
    b += String.fromCharCode(parseInt(c.substr(a, 2), 16));
  }
  return b;
}
function rstrtohex(c) {
  var a = "";
  for (var b = 0; b < c.length; b++) {
    a += ("0" + c.charCodeAt(b).toString(16)).slice(-2);
  }
  return a;
}
function hextob64(a) {
  return hex2b64(a);
}
function hextob64nl(b) {
  var a = hextob64(b);
  var c = a.replace(/(.{64})/g, "$1\r\n");
  c = c.replace(/\r\n$/, "");
  return c;
}
function b64nltohex(b) {
  var a = b.replace(/[^0-9A-Za-z\/+=]*/g, "");
  var c = b64tohex(a);
  return c;
}
function hextopem(a, b) {
  var c = hextob64nl(a);
  return "-----BEGIN " + b + "-----\r\n" + c + "\r\n-----END " + b + "-----\r\n";
}
function pemtohex(a, b) {
  if (a.indexOf("-----BEGIN ") == -1) {
    throw "can't find PEM header: " + b;
  }
  if (b !== void 0) {
    a = a.replace("-----BEGIN " + b + "-----", "");
    a = a.replace("-----END " + b + "-----", "");
  } else {
    a = a.replace(/-----BEGIN [^-]+-----/, "");
    a = a.replace(/-----END [^-]+-----/, "");
  }
  return b64nltohex(a);
}
function zulutomsec(n) {
  var l, j, m, e, f, i, b;
  var a, h2, g, c;
  c = n.match(/^(\d{2}|\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(|\.\d+)Z$/);
  if (c) {
    a = c[1];
    l = parseInt(a);
    if (a.length === 2) {
      if (50 <= l && l < 100) {
        l = 1900 + l;
      } else {
        if (0 <= l && l < 50) {
          l = 2e3 + l;
        }
      }
    }
    j = parseInt(c[2]) - 1;
    m = parseInt(c[3]);
    e = parseInt(c[4]);
    f = parseInt(c[5]);
    i = parseInt(c[6]);
    b = 0;
    h2 = c[7];
    if (h2 !== "") {
      g = (h2.substr(1) + "00").substr(0, 3);
      b = parseInt(g);
    }
    return Date.UTC(l, j, m, e, f, i, b);
  }
  throw "unsupported zulu format: " + n;
}
function zulutosec(a) {
  var b = zulutomsec(a);
  return ~~(b / 1e3);
}
function uricmptohex(a) {
  return a.replace(/%/g, "");
}
function hextouricmp(a) {
  return a.replace(/(..)/g, "%$1");
}
function encodeURIComponentAll(a) {
  var d = encodeURIComponent(a);
  var b = "";
  for (var c = 0; c < d.length; c++) {
    if (d[c] == "%") {
      b = b + d.substr(c, 3);
      c = c + 2;
    } else {
      b = b + "%" + stohex(d[c]);
    }
  }
  return b;
}
KJUR.lang.String.isInteger = function(a) {
  if (a.match(/^[0-9]+$/)) {
    return true;
  } else {
    if (a.match(/^-[0-9]+$/)) {
      return true;
    } else {
      return false;
    }
  }
};
KJUR.lang.String.isHex = function(a) {
  if (a.length % 2 == 0 && (a.match(/^[0-9a-f]+$/) || a.match(/^[0-9A-F]+$/))) {
    return true;
  } else {
    return false;
  }
};
KJUR.lang.String.isBase64 = function(a) {
  a = a.replace(/\s+/g, "");
  if (a.match(/^[0-9A-Za-z+\/]+={0,3}$/) && a.length % 4 == 0) {
    return true;
  } else {
    return false;
  }
};
KJUR.lang.String.isBase64URL = function(a) {
  if (a.match(/[+/=]/)) {
    return false;
  }
  a = b64utob64(a);
  return KJUR.lang.String.isBase64(a);
};
KJUR.lang.String.isIntegerArray = function(a) {
  a = a.replace(/\s+/g, "");
  if (a.match(/^\[[0-9,]+\]$/)) {
    return true;
  } else {
    return false;
  }
};
function hextoposhex(a) {
  if (a.length % 2 == 1) {
    return "0" + a;
  }
  if (a.substr(0, 1) > "7") {
    return "00" + a;
  }
  return a;
}
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {};
}
if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
  KJUR.crypto = {};
}
KJUR.crypto.Util = new function() {
  this.DIGESTINFOHEAD = { sha1: "3021300906052b0e03021a05000414", sha224: "302d300d06096086480165030402040500041c", sha256: "3031300d060960864801650304020105000420", sha384: "3041300d060960864801650304020205000430", sha512: "3051300d060960864801650304020305000440", md2: "3020300c06082a864886f70d020205000410", md5: "3020300c06082a864886f70d020505000410", ripemd160: "3021300906052b2403020105000414" };
  this.DEFAULTPROVIDER = { md5: "cryptojs", sha1: "cryptojs", sha224: "cryptojs", sha256: "cryptojs", sha384: "cryptojs", sha512: "cryptojs", ripemd160: "cryptojs", hmacmd5: "cryptojs", hmacsha1: "cryptojs", hmacsha224: "cryptojs", hmacsha256: "cryptojs", hmacsha384: "cryptojs", hmacsha512: "cryptojs", hmacripemd160: "cryptojs", MD5withRSA: "cryptojs/jsrsa", SHA1withRSA: "cryptojs/jsrsa", SHA224withRSA: "cryptojs/jsrsa", SHA256withRSA: "cryptojs/jsrsa", SHA384withRSA: "cryptojs/jsrsa", SHA512withRSA: "cryptojs/jsrsa", RIPEMD160withRSA: "cryptojs/jsrsa", MD5withECDSA: "cryptojs/jsrsa", SHA1withECDSA: "cryptojs/jsrsa", SHA224withECDSA: "cryptojs/jsrsa", SHA256withECDSA: "cryptojs/jsrsa", SHA384withECDSA: "cryptojs/jsrsa", SHA512withECDSA: "cryptojs/jsrsa", RIPEMD160withECDSA: "cryptojs/jsrsa", SHA1withDSA: "cryptojs/jsrsa", SHA224withDSA: "cryptojs/jsrsa", SHA256withDSA: "cryptojs/jsrsa", MD5withRSAandMGF1: "cryptojs/jsrsa", SHA1withRSAandMGF1: "cryptojs/jsrsa", SHA224withRSAandMGF1: "cryptojs/jsrsa", SHA256withRSAandMGF1: "cryptojs/jsrsa", SHA384withRSAandMGF1: "cryptojs/jsrsa", SHA512withRSAandMGF1: "cryptojs/jsrsa", RIPEMD160withRSAandMGF1: "cryptojs/jsrsa" };
  this.CRYPTOJSMESSAGEDIGESTNAME = { md5: CryptoJS.algo.MD5, sha1: CryptoJS.algo.SHA1, sha224: CryptoJS.algo.SHA224, sha256: CryptoJS.algo.SHA256, sha384: CryptoJS.algo.SHA384, sha512: CryptoJS.algo.SHA512, ripemd160: CryptoJS.algo.RIPEMD160 };
  this.getDigestInfoHex = function(a, b) {
    if (typeof this.DIGESTINFOHEAD[b] == "undefined") {
      throw "alg not supported in Util.DIGESTINFOHEAD: " + b;
    }
    return this.DIGESTINFOHEAD[b] + a;
  };
  this.getPaddedDigestInfoHex = function(h2, a, j) {
    var c = this.getDigestInfoHex(h2, a);
    var d = j / 4;
    if (c.length + 22 > d) {
      throw "key is too short for SigAlg: keylen=" + j + "," + a;
    }
    var b = "0001";
    var k = "00" + c;
    var g = "";
    var l = d - b.length - k.length;
    for (var f = 0; f < l; f += 2) {
      g += "ff";
    }
    var e = b + g + k;
    return e;
  };
  this.hashString = function(a, c) {
    var b = new KJUR.crypto.MessageDigest({ alg: c });
    return b.digestString(a);
  };
  this.hashHex = function(b, c) {
    var a = new KJUR.crypto.MessageDigest({ alg: c });
    return a.digestHex(b);
  };
  this.sha1 = function(a) {
    var b = new KJUR.crypto.MessageDigest({ alg: "sha1", prov: "cryptojs" });
    return b.digestString(a);
  };
  this.sha256 = function(a) {
    var b = new KJUR.crypto.MessageDigest({ alg: "sha256", prov: "cryptojs" });
    return b.digestString(a);
  };
  this.sha256Hex = function(a) {
    var b = new KJUR.crypto.MessageDigest({ alg: "sha256", prov: "cryptojs" });
    return b.digestHex(a);
  };
  this.sha512 = function(a) {
    var b = new KJUR.crypto.MessageDigest({ alg: "sha512", prov: "cryptojs" });
    return b.digestString(a);
  };
  this.sha512Hex = function(a) {
    var b = new KJUR.crypto.MessageDigest({ alg: "sha512", prov: "cryptojs" });
    return b.digestHex(a);
  };
}();
KJUR.crypto.Util.md5 = function(a) {
  var b = new KJUR.crypto.MessageDigest({ alg: "md5", prov: "cryptojs" });
  return b.digestString(a);
};
KJUR.crypto.Util.ripemd160 = function(a) {
  var b = new KJUR.crypto.MessageDigest({ alg: "ripemd160", prov: "cryptojs" });
  return b.digestString(a);
};
KJUR.crypto.Util.SECURERANDOMGEN = new SecureRandom();
KJUR.crypto.Util.getRandomHexOfNbytes = function(b) {
  var a = new Array(b);
  KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(a);
  return BAtohex(a);
};
KJUR.crypto.Util.getRandomBigIntegerOfNbytes = function(a) {
  return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbytes(a), 16);
};
KJUR.crypto.Util.getRandomHexOfNbits = function(d) {
  var c = d % 8;
  var a = (d - c) / 8;
  var b = new Array(a + 1);
  KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(b);
  b[0] = (255 << c & 255 ^ 255) & b[0];
  return BAtohex(b);
};
KJUR.crypto.Util.getRandomBigIntegerOfNbits = function(a) {
  return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbits(a), 16);
};
KJUR.crypto.Util.getRandomBigIntegerZeroToMax = function(b) {
  var a = b.bitLength();
  while (1) {
    var c = KJUR.crypto.Util.getRandomBigIntegerOfNbits(a);
    if (b.compareTo(c) != -1) {
      return c;
    }
  }
};
KJUR.crypto.Util.getRandomBigIntegerMinToMax = function(e, b) {
  var c = e.compareTo(b);
  if (c == 1) {
    throw "biMin is greater than biMax";
  }
  if (c == 0) {
    return e;
  }
  var a = b.subtract(e);
  var d = KJUR.crypto.Util.getRandomBigIntegerZeroToMax(a);
  return d.add(e);
};
KJUR.crypto.MessageDigest = function(c) {
  this.setAlgAndProvider = function(g, f) {
    g = KJUR.crypto.MessageDigest.getCanonicalAlgName(g);
    if (g !== null && f === void 0) {
      f = KJUR.crypto.Util.DEFAULTPROVIDER[g];
    }
    if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(g) != -1 && f == "cryptojs") {
      try {
        this.md = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[g].create();
      } catch (e) {
        throw "setAlgAndProvider hash alg set fail alg=" + g + "/" + e;
      }
      this.updateString = function(h2) {
        this.md.update(h2);
      };
      this.updateHex = function(h2) {
        var i = CryptoJS.enc.Hex.parse(h2);
        this.md.update(i);
      };
      this.digest = function() {
        var h2 = this.md.finalize();
        return h2.toString(CryptoJS.enc.Hex);
      };
      this.digestString = function(h2) {
        this.updateString(h2);
        return this.digest();
      };
      this.digestHex = function(h2) {
        this.updateHex(h2);
        return this.digest();
      };
    }
    if (":sha256:".indexOf(g) != -1 && f == "sjcl") {
      try {
        this.md = new sjcl.hash.sha256();
      } catch (e) {
        throw "setAlgAndProvider hash alg set fail alg=" + g + "/" + e;
      }
      this.updateString = function(h2) {
        this.md.update(h2);
      };
      this.updateHex = function(i) {
        var h2 = sjcl.codec.hex.toBits(i);
        this.md.update(h2);
      };
      this.digest = function() {
        var h2 = this.md.finalize();
        return sjcl.codec.hex.fromBits(h2);
      };
      this.digestString = function(h2) {
        this.updateString(h2);
        return this.digest();
      };
      this.digestHex = function(h2) {
        this.updateHex(h2);
        return this.digest();
      };
    }
  };
  this.updateString = function(e) {
    throw "updateString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName;
  };
  this.updateHex = function(e) {
    throw "updateHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName;
  };
  this.digest = function() {
    throw "digest() not supported for this alg/prov: " + this.algName + "/" + this.provName;
  };
  this.digestString = function(e) {
    throw "digestString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName;
  };
  this.digestHex = function(e) {
    throw "digestHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName;
  };
  if (c !== void 0) {
    if (c.alg !== void 0) {
      this.algName = c.alg;
      if (c.prov === void 0) {
        this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName];
      }
      this.setAlgAndProvider(this.algName, this.provName);
    }
  }
};
KJUR.crypto.MessageDigest.getCanonicalAlgName = function(a) {
  if (typeof a === "string") {
    a = a.toLowerCase();
    a = a.replace(/-/, "");
  }
  return a;
};
KJUR.crypto.MessageDigest.getHashLength = function(c) {
  var b = KJUR.crypto.MessageDigest;
  var a = b.getCanonicalAlgName(c);
  if (b.HASHLENGTH[a] === void 0) {
    throw "not supported algorithm: " + c;
  }
  return b.HASHLENGTH[a];
};
KJUR.crypto.MessageDigest.HASHLENGTH = { md5: 16, sha1: 20, sha224: 28, sha256: 32, sha384: 48, sha512: 64, ripemd160: 20 };
KJUR.crypto.Mac = function(d) {
  this.setAlgAndProvider = function(k, i) {
    k = k.toLowerCase();
    if (k == null) {
      k = "hmacsha1";
    }
    k = k.toLowerCase();
    if (k.substr(0, 4) != "hmac") {
      throw "setAlgAndProvider unsupported HMAC alg: " + k;
    }
    if (i === void 0) {
      i = KJUR.crypto.Util.DEFAULTPROVIDER[k];
    }
    this.algProv = k + "/" + i;
    var g = k.substr(4);
    if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(g) != -1 && i == "cryptojs") {
      try {
        var j = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[g];
        this.mac = CryptoJS.algo.HMAC.create(j, this.pass);
      } catch (h2) {
        throw "setAlgAndProvider hash alg set fail hashAlg=" + g + "/" + h2;
      }
      this.updateString = function(l) {
        this.mac.update(l);
      };
      this.updateHex = function(l) {
        var m = CryptoJS.enc.Hex.parse(l);
        this.mac.update(m);
      };
      this.doFinal = function() {
        var l = this.mac.finalize();
        return l.toString(CryptoJS.enc.Hex);
      };
      this.doFinalString = function(l) {
        this.updateString(l);
        return this.doFinal();
      };
      this.doFinalHex = function(l) {
        this.updateHex(l);
        return this.doFinal();
      };
    }
  };
  this.updateString = function(g) {
    throw "updateString(str) not supported for this alg/prov: " + this.algProv;
  };
  this.updateHex = function(g) {
    throw "updateHex(hex) not supported for this alg/prov: " + this.algProv;
  };
  this.doFinal = function() {
    throw "digest() not supported for this alg/prov: " + this.algProv;
  };
  this.doFinalString = function(g) {
    throw "digestString(str) not supported for this alg/prov: " + this.algProv;
  };
  this.doFinalHex = function(g) {
    throw "digestHex(hex) not supported for this alg/prov: " + this.algProv;
  };
  this.setPassword = function(h2) {
    if (typeof h2 == "string") {
      var g = h2;
      if (h2.length % 2 == 1 || !h2.match(/^[0-9A-Fa-f]+$/)) {
        g = rstrtohex(h2);
      }
      this.pass = CryptoJS.enc.Hex.parse(g);
      return;
    }
    if (typeof h2 != "object") {
      throw "KJUR.crypto.Mac unsupported password type: " + h2;
    }
    var g = null;
    if (h2.hex !== void 0) {
      if (h2.hex.length % 2 != 0 || !h2.hex.match(/^[0-9A-Fa-f]+$/)) {
        throw "Mac: wrong hex password: " + h2.hex;
      }
      g = h2.hex;
    }
    if (h2.utf8 !== void 0) {
      g = utf8tohex(h2.utf8);
    }
    if (h2.rstr !== void 0) {
      g = rstrtohex(h2.rstr);
    }
    if (h2.b64 !== void 0) {
      g = b64tohex(h2.b64);
    }
    if (h2.b64u !== void 0) {
      g = b64utohex(h2.b64u);
    }
    if (g == null) {
      throw "KJUR.crypto.Mac unsupported password type: " + h2;
    }
    this.pass = CryptoJS.enc.Hex.parse(g);
  };
  if (d !== void 0) {
    if (d.pass !== void 0) {
      this.setPassword(d.pass);
    }
    if (d.alg !== void 0) {
      this.algName = d.alg;
      if (d.prov === void 0) {
        this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName];
      }
      this.setAlgAndProvider(this.algName, this.provName);
    }
  }
};
KJUR.crypto.Signature = function(o) {
  var q = null;
  this._setAlgNames = function() {
    var s = this.algName.match(/^(.+)with(.+)$/);
    if (s) {
      this.mdAlgName = s[1].toLowerCase();
      this.pubkeyAlgName = s[2].toLowerCase();
    }
  };
  this._zeroPaddingOfSignature = function(x, w) {
    var v = "";
    var t = w / 4 - x.length;
    for (var u = 0; u < t; u++) {
      v = v + "0";
    }
    return v + x;
  };
  this.setAlgAndProvider = function(u, t) {
    this._setAlgNames();
    if (t != "cryptojs/jsrsa") {
      throw "provider not supported: " + t;
    }
    if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(this.mdAlgName) != -1) {
      try {
        this.md = new KJUR.crypto.MessageDigest({ alg: this.mdAlgName });
      } catch (s) {
        throw "setAlgAndProvider hash alg set fail alg=" + this.mdAlgName + "/" + s;
      }
      this.init = function(w, x) {
        var y = null;
        try {
          if (x === void 0) {
            y = KEYUTIL.getKey(w);
          } else {
            y = KEYUTIL.getKey(w, x);
          }
        } catch (v) {
          throw "init failed:" + v;
        }
        if (y.isPrivate === true) {
          this.prvKey = y;
          this.state = "SIGN";
        } else {
          if (y.isPublic === true) {
            this.pubKey = y;
            this.state = "VERIFY";
          } else {
            throw "init failed.:" + y;
          }
        }
      };
      this.updateString = function(v) {
        this.md.updateString(v);
      };
      this.updateHex = function(v) {
        this.md.updateHex(v);
      };
      this.sign = function() {
        this.sHashHex = this.md.digest();
        if (typeof this.ecprvhex != "undefined" && typeof this.eccurvename != "undefined") {
          var v = new KJUR.crypto.ECDSA({ curve: this.eccurvename });
          this.hSign = v.signHex(this.sHashHex, this.ecprvhex);
        } else {
          if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsaandmgf1") {
            this.hSign = this.prvKey.signWithMessageHashPSS(this.sHashHex, this.mdAlgName, this.pssSaltLen);
          } else {
            if (this.prvKey instanceof RSAKey && this.pubkeyAlgName === "rsa") {
              this.hSign = this.prvKey.signWithMessageHash(this.sHashHex, this.mdAlgName);
            } else {
              if (this.prvKey instanceof KJUR.crypto.ECDSA) {
                this.hSign = this.prvKey.signWithMessageHash(this.sHashHex);
              } else {
                if (this.prvKey instanceof KJUR.crypto.DSA) {
                  this.hSign = this.prvKey.signWithMessageHash(this.sHashHex);
                } else {
                  throw "Signature: unsupported private key alg: " + this.pubkeyAlgName;
                }
              }
            }
          }
        }
        return this.hSign;
      };
      this.signString = function(v) {
        this.updateString(v);
        return this.sign();
      };
      this.signHex = function(v) {
        this.updateHex(v);
        return this.sign();
      };
      this.verify = function(v) {
        this.sHashHex = this.md.digest();
        if (typeof this.ecpubhex != "undefined" && typeof this.eccurvename != "undefined") {
          var w = new KJUR.crypto.ECDSA({ curve: this.eccurvename });
          return w.verifyHex(this.sHashHex, v, this.ecpubhex);
        } else {
          if (this.pubKey instanceof RSAKey && this.pubkeyAlgName === "rsaandmgf1") {
            return this.pubKey.verifyWithMessageHashPSS(this.sHashHex, v, this.mdAlgName, this.pssSaltLen);
          } else {
            if (this.pubKey instanceof RSAKey && this.pubkeyAlgName === "rsa") {
              return this.pubKey.verifyWithMessageHash(this.sHashHex, v);
            } else {
              if (KJUR.crypto.ECDSA !== void 0 && this.pubKey instanceof KJUR.crypto.ECDSA) {
                return this.pubKey.verifyWithMessageHash(this.sHashHex, v);
              } else {
                if (KJUR.crypto.DSA !== void 0 && this.pubKey instanceof KJUR.crypto.DSA) {
                  return this.pubKey.verifyWithMessageHash(this.sHashHex, v);
                } else {
                  throw "Signature: unsupported public key alg: " + this.pubkeyAlgName;
                }
              }
            }
          }
        }
      };
    }
  };
  this.init = function(s, t) {
    throw "init(key, pass) not supported for this alg:prov=" + this.algProvName;
  };
  this.updateString = function(s) {
    throw "updateString(str) not supported for this alg:prov=" + this.algProvName;
  };
  this.updateHex = function(s) {
    throw "updateHex(hex) not supported for this alg:prov=" + this.algProvName;
  };
  this.sign = function() {
    throw "sign() not supported for this alg:prov=" + this.algProvName;
  };
  this.signString = function(s) {
    throw "digestString(str) not supported for this alg:prov=" + this.algProvName;
  };
  this.signHex = function(s) {
    throw "digestHex(hex) not supported for this alg:prov=" + this.algProvName;
  };
  this.verify = function(s) {
    throw "verify(hSigVal) not supported for this alg:prov=" + this.algProvName;
  };
  this.initParams = o;
  if (o !== void 0) {
    if (o.alg !== void 0) {
      this.algName = o.alg;
      if (o.prov === void 0) {
        this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName];
      } else {
        this.provName = o.prov;
      }
      this.algProvName = this.algName + ":" + this.provName;
      this.setAlgAndProvider(this.algName, this.provName);
      this._setAlgNames();
    }
    if (o.psssaltlen !== void 0) {
      this.pssSaltLen = o.psssaltlen;
    }
    if (o.prvkeypem !== void 0) {
      if (o.prvkeypas !== void 0) {
        throw "both prvkeypem and prvkeypas parameters not supported";
      } else {
        try {
          var q = KEYUTIL.getKey(o.prvkeypem);
          this.init(q);
        } catch (m) {
          throw "fatal error to load pem private key: " + m;
        }
      }
    }
  }
};
KJUR.crypto.Cipher = function(a) {
};
KJUR.crypto.Cipher.encrypt = function(e, f, d) {
  if (f instanceof RSAKey && f.isPublic) {
    var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d);
    if (c === "RSA") {
      return f.encrypt(e);
    }
    if (c === "RSAOAEP") {
      return f.encryptOAEP(e, "sha1");
    }
    var b = c.match(/^RSAOAEP(\d+)$/);
    if (b !== null) {
      return f.encryptOAEP(e, "sha" + b[1]);
    }
    throw "Cipher.encrypt: unsupported algorithm for RSAKey: " + d;
  } else {
    throw "Cipher.encrypt: unsupported key or algorithm";
  }
};
KJUR.crypto.Cipher.decrypt = function(e, f, d) {
  if (f instanceof RSAKey && f.isPrivate) {
    var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d);
    if (c === "RSA") {
      return f.decrypt(e);
    }
    if (c === "RSAOAEP") {
      return f.decryptOAEP(e, "sha1");
    }
    var b = c.match(/^RSAOAEP(\d+)$/);
    if (b !== null) {
      return f.decryptOAEP(e, "sha" + b[1]);
    }
    throw "Cipher.decrypt: unsupported algorithm for RSAKey: " + d;
  } else {
    throw "Cipher.decrypt: unsupported key or algorithm";
  }
};
KJUR.crypto.Cipher.getAlgByKeyAndName = function(b, a) {
  if (b instanceof RSAKey) {
    if (":RSA:RSAOAEP:RSAOAEP224:RSAOAEP256:RSAOAEP384:RSAOAEP512:".indexOf(a) != -1) {
      return a;
    }
    if (a === null || a === void 0) {
      return "RSA";
    }
    throw "getAlgByKeyAndName: not supported algorithm name for RSAKey: " + a;
  }
  throw "getAlgByKeyAndName: not supported algorithm name: " + a;
};
KJUR.crypto.OID = new function() {
  this.oidhex2name = { "2a864886f70d010101": "rsaEncryption", "2a8648ce3d0201": "ecPublicKey", "2a8648ce380401": "dsa", "2a8648ce3d030107": "secp256r1", "2b8104001f": "secp192k1", "2b81040021": "secp224r1", "2b8104000a": "secp256k1", "2b81040023": "secp521r1", "2b81040022": "secp384r1", "2a8648ce380403": "SHA1withDSA", "608648016503040301": "SHA224withDSA", "608648016503040302": "SHA256withDSA" };
}();
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {};
}
if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
  KJUR.crypto = {};
}
KJUR.crypto.ECDSA = function(h2) {
  var e = "secp256r1";
  var a = new SecureRandom();
  this.type = "EC";
  this.isPrivate = false;
  this.isPublic = false;
  this.getBigRandom = function(i) {
    return new BigInteger(i.bitLength(), a).mod(i.subtract(BigInteger.ONE)).add(BigInteger.ONE);
  };
  this.setNamedCurve = function(i) {
    this.ecparams = KJUR.crypto.ECParameterDB.getByName(i);
    this.prvKeyHex = null;
    this.pubKeyHex = null;
    this.curveName = i;
  };
  this.setPrivateKeyHex = function(i) {
    this.isPrivate = true;
    this.prvKeyHex = i;
  };
  this.setPublicKeyHex = function(i) {
    this.isPublic = true;
    this.pubKeyHex = i;
  };
  this.getPublicKeyXYHex = function() {
    var k = this.pubKeyHex;
    if (k.substr(0, 2) !== "04") {
      throw "this method supports uncompressed format(04) only";
    }
    var j = this.ecparams.keylen / 4;
    if (k.length !== 2 + j * 2) {
      throw "malformed public key hex length";
    }
    var i = {};
    i.x = k.substr(2, j);
    i.y = k.substr(2 + j);
    return i;
  };
  this.getShortNISTPCurveName = function() {
    var i = this.curveName;
    if (i === "secp256r1" || i === "NIST P-256" || i === "P-256" || i === "prime256v1") {
      return "P-256";
    }
    if (i === "secp384r1" || i === "NIST P-384" || i === "P-384") {
      return "P-384";
    }
    return null;
  };
  this.generateKeyPairHex = function() {
    var k = this.ecparams.n;
    var n = this.getBigRandom(k);
    var l = this.ecparams.G.multiply(n);
    var q = l.getX().toBigInteger();
    var o = l.getY().toBigInteger();
    var i = this.ecparams.keylen / 4;
    var m = ("0000000000" + n.toString(16)).slice(-i);
    var r = ("0000000000" + q.toString(16)).slice(-i);
    var p = ("0000000000" + o.toString(16)).slice(-i);
    var j = "04" + r + p;
    this.setPrivateKeyHex(m);
    this.setPublicKeyHex(j);
    return { ecprvhex: m, ecpubhex: j };
  };
  this.signWithMessageHash = function(i) {
    return this.signHex(i, this.prvKeyHex);
  };
  this.signHex = function(o, j) {
    var t = new BigInteger(j, 16);
    var l = this.ecparams.n;
    var q = new BigInteger(o, 16);
    do {
      var m = this.getBigRandom(l);
      var u = this.ecparams.G;
      var p = u.multiply(m);
      var i = p.getX().toBigInteger().mod(l);
    } while (i.compareTo(BigInteger.ZERO) <= 0);
    var v = m.modInverse(l).multiply(q.add(t.multiply(i))).mod(l);
    return KJUR.crypto.ECDSA.biRSSigToASN1Sig(i, v);
  };
  this.sign = function(m, u) {
    var q = u;
    var j = this.ecparams.n;
    var p = BigInteger.fromByteArrayUnsigned(m);
    do {
      var l = this.getBigRandom(j);
      var t = this.ecparams.G;
      var o = t.multiply(l);
      var i = o.getX().toBigInteger().mod(j);
    } while (i.compareTo(BigInteger.ZERO) <= 0);
    var v = l.modInverse(j).multiply(p.add(q.multiply(i))).mod(j);
    return this.serializeSig(i, v);
  };
  this.verifyWithMessageHash = function(j, i) {
    return this.verifyHex(j, i, this.pubKeyHex);
  };
  this.verifyHex = function(m, i, p) {
    var l, j;
    var o = KJUR.crypto.ECDSA.parseSigHex(i);
    l = o.r;
    j = o.s;
    var k;
    k = ECPointFp.decodeFromHex(this.ecparams.curve, p);
    var n = new BigInteger(m, 16);
    return this.verifyRaw(n, l, j, k);
  };
  this.verify = function(o, p, j) {
    var l, i;
    if (Bitcoin.Util.isArray(p)) {
      var n = this.parseSig(p);
      l = n.r;
      i = n.s;
    } else {
      if (typeof p === "object" && p.r && p.s) {
        l = p.r;
        i = p.s;
      } else {
        throw "Invalid value for signature";
      }
    }
    var k;
    if (j instanceof ECPointFp) {
      k = j;
    } else {
      if (Bitcoin.Util.isArray(j)) {
        k = ECPointFp.decodeFrom(this.ecparams.curve, j);
      } else {
        throw "Invalid format for pubkey value, must be byte array or ECPointFp";
      }
    }
    var m = BigInteger.fromByteArrayUnsigned(o);
    return this.verifyRaw(m, l, i, k);
  };
  this.verifyRaw = function(o, i, w, m) {
    var l = this.ecparams.n;
    var u = this.ecparams.G;
    if (i.compareTo(BigInteger.ONE) < 0 || i.compareTo(l) >= 0) {
      return false;
    }
    if (w.compareTo(BigInteger.ONE) < 0 || w.compareTo(l) >= 0) {
      return false;
    }
    var p = w.modInverse(l);
    var k = o.multiply(p).mod(l);
    var j = i.multiply(p).mod(l);
    var q = u.multiply(k).add(m.multiply(j));
    var t = q.getX().toBigInteger().mod(l);
    return t.equals(i);
  };
  this.serializeSig = function(k, j) {
    var l = k.toByteArraySigned();
    var i = j.toByteArraySigned();
    var m = [];
    m.push(2);
    m.push(l.length);
    m = m.concat(l);
    m.push(2);
    m.push(i.length);
    m = m.concat(i);
    m.unshift(m.length);
    m.unshift(48);
    return m;
  };
  this.parseSig = function(n) {
    var m;
    if (n[0] != 48) {
      throw new Error("Signature not a valid DERSequence");
    }
    m = 2;
    if (n[m] != 2) {
      throw new Error("First element in signature must be a DERInteger");
    }
    var l = n.slice(m + 2, m + 2 + n[m + 1]);
    m += 2 + n[m + 1];
    if (n[m] != 2) {
      throw new Error("Second element in signature must be a DERInteger");
    }
    var i = n.slice(m + 2, m + 2 + n[m + 1]);
    m += 2 + n[m + 1];
    var k = BigInteger.fromByteArrayUnsigned(l);
    var j = BigInteger.fromByteArrayUnsigned(i);
    return { r: k, s: j };
  };
  this.parseSigCompact = function(m) {
    if (m.length !== 65) {
      throw "Signature has the wrong length";
    }
    var j = m[0] - 27;
    if (j < 0 || j > 7) {
      throw "Invalid signature type";
    }
    var o = this.ecparams.n;
    var l = BigInteger.fromByteArrayUnsigned(m.slice(1, 33)).mod(o);
    var k = BigInteger.fromByteArrayUnsigned(m.slice(33, 65)).mod(o);
    return { r: l, s: k, i: j };
  };
  this.readPKCS5PrvKeyHex = function(l) {
    var n = ASN1HEX;
    var m = KJUR.crypto.ECDSA.getName;
    var p = n.getVbyList;
    if (n.isASN1HEX(l) === false) {
      throw "not ASN.1 hex string";
    }
    var i, k, o;
    try {
      i = p(l, 0, [2, 0], "06");
      k = p(l, 0, [1], "04");
      try {
        o = p(l, 0, [3, 0], "03").substr(2);
      } catch (j) {
      }
    } catch (j) {
      throw "malformed PKCS#1/5 plain ECC private key";
    }
    this.curveName = m(i);
    if (this.curveName === void 0) {
      throw "unsupported curve name";
    }
    this.setNamedCurve(this.curveName);
    this.setPublicKeyHex(o);
    this.setPrivateKeyHex(k);
    this.isPublic = false;
  };
  this.readPKCS8PrvKeyHex = function(l) {
    var q = ASN1HEX;
    var i = KJUR.crypto.ECDSA.getName;
    var n = q.getVbyList;
    if (q.isASN1HEX(l) === false) {
      throw "not ASN.1 hex string";
    }
    var j, p, m, k;
    try {
      j = n(l, 0, [1, 0], "06");
      p = n(l, 0, [1, 1], "06");
      m = n(l, 0, [2, 0, 1], "04");
      try {
        k = n(l, 0, [2, 0, 2, 0], "03").substr(2);
      } catch (o) {
      }
    } catch (o) {
      throw "malformed PKCS#8 plain ECC private key";
    }
    this.curveName = i(p);
    if (this.curveName === void 0) {
      throw "unsupported curve name";
    }
    this.setNamedCurve(this.curveName);
    this.setPublicKeyHex(k);
    this.setPrivateKeyHex(m);
    this.isPublic = false;
  };
  this.readPKCS8PubKeyHex = function(l) {
    var n = ASN1HEX;
    var m = KJUR.crypto.ECDSA.getName;
    var p = n.getVbyList;
    if (n.isASN1HEX(l) === false) {
      throw "not ASN.1 hex string";
    }
    var k, i, o;
    try {
      k = p(l, 0, [0, 0], "06");
      i = p(l, 0, [0, 1], "06");
      o = p(l, 0, [1], "03").substr(2);
    } catch (j) {
      throw "malformed PKCS#8 ECC public key";
    }
    this.curveName = m(i);
    if (this.curveName === null) {
      throw "unsupported curve name";
    }
    this.setNamedCurve(this.curveName);
    this.setPublicKeyHex(o);
  };
  this.readCertPubKeyHex = function(k, p) {
    if (p !== 5) {
      p = 6;
    }
    var m = ASN1HEX;
    var l = KJUR.crypto.ECDSA.getName;
    var o = m.getVbyList;
    if (m.isASN1HEX(k) === false) {
      throw "not ASN.1 hex string";
    }
    var i, n;
    try {
      i = o(k, 0, [0, p, 0, 1], "06");
      n = o(k, 0, [0, p, 1], "03").substr(2);
    } catch (j) {
      throw "malformed X.509 certificate ECC public key";
    }
    this.curveName = l(i);
    if (this.curveName === null) {
      throw "unsupported curve name";
    }
    this.setNamedCurve(this.curveName);
    this.setPublicKeyHex(n);
  };
  if (h2 !== void 0) {
    if (h2.curve !== void 0) {
      this.curveName = h2.curve;
    }
  }
  if (this.curveName === void 0) {
    this.curveName = e;
  }
  this.setNamedCurve(this.curveName);
  if (h2 !== void 0) {
    if (h2.prv !== void 0) {
      this.setPrivateKeyHex(h2.prv);
    }
    if (h2.pub !== void 0) {
      this.setPublicKeyHex(h2.pub);
    }
  }
};
KJUR.crypto.ECDSA.parseSigHex = function(a) {
  var b = KJUR.crypto.ECDSA.parseSigHexInHexRS(a);
  var d = new BigInteger(b.r, 16);
  var c = new BigInteger(b.s, 16);
  return { r: d, s: c };
};
KJUR.crypto.ECDSA.parseSigHexInHexRS = function(f) {
  var j = ASN1HEX;
  var i = j.getChildIdx;
  var g = j.getV;
  if (f.substr(0, 2) != "30") {
    throw "signature is not a ASN.1 sequence";
  }
  var h2 = i(f, 0);
  if (h2.length != 2) {
    throw "number of signature ASN.1 sequence elements seem wrong";
  }
  var e = h2[0];
  var d = h2[1];
  if (f.substr(e, 2) != "02") {
    throw "1st item of sequene of signature is not ASN.1 integer";
  }
  if (f.substr(d, 2) != "02") {
    throw "2nd item of sequene of signature is not ASN.1 integer";
  }
  var c = g(f, e);
  var b = g(f, d);
  return { r: c, s: b };
};
KJUR.crypto.ECDSA.asn1SigToConcatSig = function(c) {
  var d = KJUR.crypto.ECDSA.parseSigHexInHexRS(c);
  var b = d.r;
  var a = d.s;
  if (b.substr(0, 2) == "00" && b.length / 2 * 8 % (16 * 8) == 8) {
    b = b.substr(2);
  }
  if (a.substr(0, 2) == "00" && a.length / 2 * 8 % (16 * 8) == 8) {
    a = a.substr(2);
  }
  if (b.length / 2 * 8 % (16 * 8) != 0) {
    throw "unknown ECDSA sig r length error";
  }
  if (a.length / 2 * 8 % (16 * 8) != 0) {
    throw "unknown ECDSA sig s length error";
  }
  return b + a;
};
KJUR.crypto.ECDSA.concatSigToASN1Sig = function(a) {
  if (a.length / 2 * 8 % (16 * 8) != 0) {
    throw "unknown ECDSA concatinated r-s sig  length error";
  }
  var c = a.substr(0, a.length / 2);
  var b = a.substr(a.length / 2);
  return KJUR.crypto.ECDSA.hexRSSigToASN1Sig(c, b);
};
KJUR.crypto.ECDSA.hexRSSigToASN1Sig = function(b, a) {
  var d = new BigInteger(b, 16);
  var c = new BigInteger(a, 16);
  return KJUR.crypto.ECDSA.biRSSigToASN1Sig(d, c);
};
KJUR.crypto.ECDSA.biRSSigToASN1Sig = function(f, d) {
  var c = KJUR.asn1;
  var b = new c.DERInteger({ bigint: f });
  var a = new c.DERInteger({ bigint: d });
  var e = new c.DERSequence({ array: [b, a] });
  return e.getEncodedHex();
};
KJUR.crypto.ECDSA.getName = function(a) {
  if (a === "2a8648ce3d030107") {
    return "secp256r1";
  }
  if (a === "2b8104000a") {
    return "secp256k1";
  }
  if (a === "2b81040022") {
    return "secp384r1";
  }
  if ("|secp256r1|NIST P-256|P-256|prime256v1|".indexOf(a) !== -1) {
    return "secp256r1";
  }
  if ("|secp256k1|".indexOf(a) !== -1) {
    return "secp256k1";
  }
  if ("|secp384r1|NIST P-384|P-384|".indexOf(a) !== -1) {
    return "secp384r1";
  }
  return null;
};
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {};
}
if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
  KJUR.crypto = {};
}
KJUR.crypto.ECParameterDB = new function() {
  var b = {};
  var c = {};
  function a(d) {
    return new BigInteger(d, 16);
  }
  this.getByName = function(e) {
    var d = e;
    if (typeof c[d] != "undefined") {
      d = c[e];
    }
    if (typeof b[d] != "undefined") {
      return b[d];
    }
    throw "unregistered EC curve name: " + d;
  };
  this.regist = function(A, l, o, g, m, e, j, f, k, u, d, x) {
    b[A] = {};
    var s = a(o);
    var z = a(g);
    var y = a(m);
    var t = a(e);
    var w = a(j);
    var r = new ECCurveFp(s, z, y);
    var q = r.decodePointHex("04" + f + k);
    b[A]["name"] = A;
    b[A]["keylen"] = l;
    b[A]["curve"] = r;
    b[A]["G"] = q;
    b[A]["n"] = t;
    b[A]["h"] = w;
    b[A]["oid"] = d;
    b[A]["info"] = x;
    for (var v = 0; v < u.length; v++) {
      c[u[v]] = A;
    }
  };
}();
KJUR.crypto.ECParameterDB.regist("secp128r1", 128, "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC", "E87579C11079F43DD824993C2CEE5ED3", "FFFFFFFE0000000075A30D1B9038A115", "1", "161FF7528B899B2D0C28607CA52C5B86", "CF5AC8395BAFEB13C02DA292DDED7A83", [], "", "secp128r1 : SECG curve over a 128 bit prime field");
KJUR.crypto.ECParameterDB.regist("secp160k1", 160, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", "0", "7", "0100000000000000000001B8FA16DFAB9ACA16B6B3", "1", "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", "938CF935318FDCED6BC28286531733C3F03C4FEE", [], "", "secp160k1 : SECG curve over a 160 bit prime field");
KJUR.crypto.ECParameterDB.regist("secp160r1", 160, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC", "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", "0100000000000000000001F4C8F927AED3CA752257", "1", "4A96B5688EF573284664698968C38BB913CBFC82", "23A628553168947D59DCC912042351377AC5FB32", [], "", "secp160r1 : SECG curve over a 160 bit prime field");
KJUR.crypto.ECParameterDB.regist("secp192k1", 192, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", "0", "3", "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", "1", "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", []);
KJUR.crypto.ECParameterDB.regist("secp192r1", 192, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", "1", "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811", []);
KJUR.crypto.ECParameterDB.regist("secp224r1", 224, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", "1", "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", []);
KJUR.crypto.ECParameterDB.regist("secp256k1", 256, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", "0", "7", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", "1", "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", []);
KJUR.crypto.ECParameterDB.regist("secp256r1", 256, "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", "1", "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", ["NIST P-256", "P-256", "prime256v1"]);
KJUR.crypto.ECParameterDB.regist("secp384r1", 384, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", "1", "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f", ["NIST P-384", "P-384"]);
KJUR.crypto.ECParameterDB.regist("secp521r1", 521, "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC", "051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", "1", "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650", ["NIST P-521", "P-521"]);
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {};
}
if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
  KJUR.crypto = {};
}
KJUR.crypto.DSA = function() {
  this.p = null;
  this.q = null;
  this.g = null;
  this.y = null;
  this.x = null;
  this.type = "DSA";
  this.isPrivate = false;
  this.isPublic = false;
  this.setPrivate = function(d, c, b, e, a) {
    this.isPrivate = true;
    this.p = d;
    this.q = c;
    this.g = b;
    this.y = e;
    this.x = a;
  };
  this.setPrivateHex = function(d, b, f, i, j) {
    var c, a, e, g, h2;
    c = new BigInteger(d, 16);
    a = new BigInteger(b, 16);
    e = new BigInteger(f, 16);
    if (typeof i === "string" && i.length > 1) {
      g = new BigInteger(i, 16);
    } else {
      g = null;
    }
    h2 = new BigInteger(j, 16);
    this.setPrivate(c, a, e, g, h2);
  };
  this.setPublic = function(c, b, a, d) {
    this.isPublic = true;
    this.p = c;
    this.q = b;
    this.g = a;
    this.y = d;
    this.x = null;
  };
  this.setPublicHex = function(f, e, d, g) {
    var b, a, h2, c;
    b = new BigInteger(f, 16);
    a = new BigInteger(e, 16);
    h2 = new BigInteger(d, 16);
    c = new BigInteger(g, 16);
    this.setPublic(b, a, h2, c);
  };
  this.signWithMessageHash = function(d) {
    var c = this.p;
    var b = this.q;
    var f = this.g;
    this.y;
    var j = this.x;
    var e = KJUR.crypto.Util.getRandomBigIntegerMinToMax(BigInteger.ONE.add(BigInteger.ONE), b.subtract(BigInteger.ONE));
    var l = d.substr(0, b.bitLength() / 4);
    var h2 = new BigInteger(l, 16);
    var a = f.modPow(e, c).mod(b);
    var n = e.modInverse(b).multiply(h2.add(j.multiply(a))).mod(b);
    var m = KJUR.asn1.ASN1Util.jsonToASN1HEX({ seq: [{ "int": { bigint: a } }, { "int": { bigint: n } }] });
    return m;
  };
  this.verifyWithMessageHash = function(h2, f) {
    var d = this.p;
    var b = this.q;
    var j = this.g;
    var l = this.y;
    var i = this.parseASN1Signature(f);
    var a = i[0];
    var t = i[1];
    var o = h2.substr(0, b.bitLength() / 4);
    var k = new BigInteger(o, 16);
    if (BigInteger.ZERO.compareTo(a) > 0 || a.compareTo(b) > 0) {
      throw "invalid DSA signature";
    }
    if (BigInteger.ZERO.compareTo(t) >= 0 || t.compareTo(b) > 0) {
      throw "invalid DSA signature";
    }
    var m = t.modInverse(b);
    var e = k.multiply(m).mod(b);
    var c = a.multiply(m).mod(b);
    var n = j.modPow(e, d).multiply(l.modPow(c, d)).mod(d).mod(b);
    return n.compareTo(a) == 0;
  };
  this.parseASN1Signature = function(a) {
    try {
      var d = new BigInteger(ASN1HEX.getVbyList(a, 0, [0], "02"), 16);
      var c = new BigInteger(ASN1HEX.getVbyList(a, 0, [1], "02"), 16);
      return [d, c];
    } catch (b) {
      throw "malformed ASN.1 DSA signature";
    }
  };
  this.readPKCS5PrvKeyHex = function(c) {
    var b, a, f, g, i;
    var j = ASN1HEX;
    var d = j.getVbyList;
    if (j.isASN1HEX(c) === false) {
      throw "not ASN.1 hex string";
    }
    try {
      b = d(c, 0, [1], "02");
      a = d(c, 0, [2], "02");
      f = d(c, 0, [3], "02");
      g = d(c, 0, [4], "02");
      i = d(c, 0, [5], "02");
    } catch (e) {
      console.log("EXCEPTION:" + e);
      throw "malformed PKCS#1/5 plain DSA private key";
    }
    this.setPrivateHex(b, a, f, g, i);
  };
  this.readPKCS8PrvKeyHex = function(d) {
    var f, c, b, g;
    var e = ASN1HEX;
    var i = e.getVbyList;
    if (e.isASN1HEX(d) === false) {
      throw "not ASN.1 hex string";
    }
    try {
      f = i(d, 0, [1, 1, 0], "02");
      c = i(d, 0, [1, 1, 1], "02");
      b = i(d, 0, [1, 1, 2], "02");
      g = i(d, 0, [2, 0], "02");
    } catch (a) {
      console.log("EXCEPTION:" + a);
      throw "malformed PKCS#8 plain DSA private key";
    }
    this.setPrivateHex(f, c, b, null, g);
  };
  this.readPKCS8PubKeyHex = function(d) {
    var f, c, b, g;
    var e = ASN1HEX;
    var i = e.getVbyList;
    if (e.isASN1HEX(d) === false) {
      throw "not ASN.1 hex string";
    }
    try {
      f = i(d, 0, [0, 1, 0], "02");
      c = i(d, 0, [0, 1, 1], "02");
      b = i(d, 0, [0, 1, 2], "02");
      g = i(d, 0, [1, 0], "02");
    } catch (a) {
      console.log("EXCEPTION:" + a);
      throw "malformed PKCS#8 DSA public key";
    }
    this.setPublicHex(f, c, b, g);
  };
  this.readCertPubKeyHex = function(c, f) {
    if (f !== 5) {
      f = 6;
    }
    var b, a, g, i;
    var j = ASN1HEX;
    var d = j.getVbyList;
    if (j.isASN1HEX(c) === false) {
      throw "not ASN.1 hex string";
    }
    try {
      b = d(c, 0, [0, f, 0, 1, 0], "02");
      a = d(c, 0, [0, f, 0, 1, 1], "02");
      g = d(c, 0, [0, f, 0, 1, 2], "02");
      i = d(c, 0, [0, f, 1, 0], "02");
    } catch (e) {
      console.log("EXCEPTION:" + e);
      throw "malformed X.509 certificate DSA public key";
    }
    this.setPublicHex(b, a, g, i);
  };
};
var KEYUTIL = function() {
  var d = function(p, r, q) {
    return k(CryptoJS.AES, p, r, q);
  };
  var e = function(p, r, q) {
    return k(CryptoJS.TripleDES, p, r, q);
  };
  var a = function(p, r, q) {
    return k(CryptoJS.DES, p, r, q);
  };
  var k = function(s, x, u, q) {
    var r = CryptoJS.enc.Hex.parse(x);
    var w = CryptoJS.enc.Hex.parse(u);
    var p = CryptoJS.enc.Hex.parse(q);
    var t = {};
    t.key = w;
    t.iv = p;
    t.ciphertext = r;
    var v = s.decrypt(t, w, { iv: p });
    return CryptoJS.enc.Hex.stringify(v);
  };
  var l = function(p, r, q) {
    return g(CryptoJS.AES, p, r, q);
  };
  var o = function(p, r, q) {
    return g(CryptoJS.TripleDES, p, r, q);
  };
  var f = function(p, r, q) {
    return g(CryptoJS.DES, p, r, q);
  };
  var g = function(t, y, v, q) {
    var s = CryptoJS.enc.Hex.parse(y);
    var x = CryptoJS.enc.Hex.parse(v);
    var p = CryptoJS.enc.Hex.parse(q);
    var w = t.encrypt(s, x, { iv: p });
    var r = CryptoJS.enc.Hex.parse(w.toString());
    var u = CryptoJS.enc.Base64.stringify(r);
    return u;
  };
  var i = { "AES-256-CBC": { proc: d, eproc: l, keylen: 32, ivlen: 16 }, "AES-192-CBC": { proc: d, eproc: l, keylen: 24, ivlen: 16 }, "AES-128-CBC": { proc: d, eproc: l, keylen: 16, ivlen: 16 }, "DES-EDE3-CBC": { proc: e, eproc: o, keylen: 24, ivlen: 8 }, "DES-CBC": { proc: a, eproc: f, keylen: 8, ivlen: 8 } };
  var m = function(p) {
    var r = CryptoJS.lib.WordArray.random(p);
    var q = CryptoJS.enc.Hex.stringify(r);
    return q;
  };
  var n = function(v) {
    var w = {};
    var q = v.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)", "m"));
    if (q) {
      w.cipher = q[1];
      w.ivsalt = q[2];
    }
    var p = v.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"));
    if (p) {
      w.type = p[1];
    }
    var u = -1;
    var x = 0;
    if (v.indexOf("\r\n\r\n") != -1) {
      u = v.indexOf("\r\n\r\n");
      x = 2;
    }
    if (v.indexOf("\n\n") != -1) {
      u = v.indexOf("\n\n");
      x = 1;
    }
    var t = v.indexOf("-----END");
    if (u != -1 && t != -1) {
      var r = v.substring(u + x * 2, t - x);
      r = r.replace(/\s+/g, "");
      w.data = r;
    }
    return w;
  };
  var j = function(q, y, p) {
    var v = p.substring(0, 16);
    var t = CryptoJS.enc.Hex.parse(v);
    var r = CryptoJS.enc.Utf8.parse(y);
    var u = i[q]["keylen"] + i[q]["ivlen"];
    var x = "";
    var w = null;
    for (; ; ) {
      var s = CryptoJS.algo.MD5.create();
      if (w != null) {
        s.update(w);
      }
      s.update(r);
      s.update(t);
      w = s.finalize();
      x = x + CryptoJS.enc.Hex.stringify(w);
      if (x.length >= u * 2) {
        break;
      }
    }
    var z = {};
    z.keyhex = x.substr(0, i[q]["keylen"] * 2);
    z.ivhex = x.substr(i[q]["keylen"] * 2, i[q]["ivlen"] * 2);
    return z;
  };
  var b = function(p, v, r, w) {
    var s = CryptoJS.enc.Base64.parse(p);
    var q = CryptoJS.enc.Hex.stringify(s);
    var u = i[v]["proc"];
    var t = u(q, r, w);
    return t;
  };
  var h2 = function(p, s, q, u) {
    var r = i[s]["eproc"];
    var t = r(p, q, u);
    return t;
  };
  return { version: "1.0.0", parsePKCS5PEM: function(p) {
    return n(p);
  }, getKeyAndUnusedIvByPasscodeAndIvsalt: function(q, p, r) {
    return j(q, p, r);
  }, decryptKeyB64: function(p, r, q, s) {
    return b(p, r, q, s);
  }, getDecryptedKeyHex: function(y, x) {
    var q = n(y);
    q.type;
    var r = q.cipher;
    var p = q.ivsalt;
    var s = q.data;
    var w = j(r, x, p);
    var v = w.keyhex;
    var u = b(s, r, v, p);
    return u;
  }, getEncryptedPKCS5PEMFromPrvKeyHex: function(x, s, A, t, r) {
    var p = "";
    if (typeof t == "undefined" || t == null) {
      t = "AES-256-CBC";
    }
    if (typeof i[t] == "undefined") {
      throw "KEYUTIL unsupported algorithm: " + t;
    }
    if (typeof r == "undefined" || r == null) {
      var v = i[t]["ivlen"];
      var u = m(v);
      r = u.toUpperCase();
    }
    var z = j(t, A, r);
    var y = z.keyhex;
    var w = h2(s, t, y, r);
    var q = w.replace(/(.{64})/g, "$1\r\n");
    var p = "-----BEGIN " + x + " PRIVATE KEY-----\r\n";
    p += "Proc-Type: 4,ENCRYPTED\r\n";
    p += "DEK-Info: " + t + "," + r + "\r\n";
    p += "\r\n";
    p += q;
    p += "\r\n-----END " + x + " PRIVATE KEY-----\r\n";
    return p;
  }, parseHexOfEncryptedPKCS8: function(y) {
    var B = ASN1HEX;
    var z = B.getChildIdx;
    var w = B.getV;
    var t = {};
    var r = z(y, 0);
    if (r.length != 2) {
      throw "malformed format: SEQUENCE(0).items != 2: " + r.length;
    }
    t.ciphertext = w(y, r[1]);
    var A = z(y, r[0]);
    if (A.length != 2) {
      throw "malformed format: SEQUENCE(0.0).items != 2: " + A.length;
    }
    if (w(y, A[0]) != "2a864886f70d01050d") {
      throw "this only supports pkcs5PBES2";
    }
    var p = z(y, A[1]);
    if (A.length != 2) {
      throw "malformed format: SEQUENCE(0.0.1).items != 2: " + p.length;
    }
    var q = z(y, p[1]);
    if (q.length != 2) {
      throw "malformed format: SEQUENCE(0.0.1.1).items != 2: " + q.length;
    }
    if (w(y, q[0]) != "2a864886f70d0307") {
      throw "this only supports TripleDES";
    }
    t.encryptionSchemeAlg = "TripleDES";
    t.encryptionSchemeIV = w(y, q[1]);
    var s = z(y, p[0]);
    if (s.length != 2) {
      throw "malformed format: SEQUENCE(0.0.1.0).items != 2: " + s.length;
    }
    if (w(y, s[0]) != "2a864886f70d01050c") {
      throw "this only supports pkcs5PBKDF2";
    }
    var x = z(y, s[1]);
    if (x.length < 2) {
      throw "malformed format: SEQUENCE(0.0.1.0.1).items < 2: " + x.length;
    }
    t.pbkdf2Salt = w(y, x[0]);
    var u = w(y, x[1]);
    try {
      t.pbkdf2Iter = parseInt(u, 16);
    } catch (v) {
      throw "malformed format pbkdf2Iter: " + u;
    }
    return t;
  }, getPBKDF2KeyHexFromParam: function(u, p) {
    var t = CryptoJS.enc.Hex.parse(u.pbkdf2Salt);
    var q = u.pbkdf2Iter;
    var s = CryptoJS.PBKDF2(p, t, { keySize: 192 / 32, iterations: q });
    var r = CryptoJS.enc.Hex.stringify(s);
    return r;
  }, _getPlainPKCS8HexFromEncryptedPKCS8PEM: function(x, y) {
    var r = pemtohex(x, "ENCRYPTED PRIVATE KEY");
    var p = this.parseHexOfEncryptedPKCS8(r);
    var u = KEYUTIL.getPBKDF2KeyHexFromParam(p, y);
    var v = {};
    v.ciphertext = CryptoJS.enc.Hex.parse(p.ciphertext);
    var t = CryptoJS.enc.Hex.parse(u);
    var s = CryptoJS.enc.Hex.parse(p.encryptionSchemeIV);
    var w = CryptoJS.TripleDES.decrypt(v, t, { iv: s });
    var q = CryptoJS.enc.Hex.stringify(w);
    return q;
  }, getKeyFromEncryptedPKCS8PEM: function(s, q) {
    var p = this._getPlainPKCS8HexFromEncryptedPKCS8PEM(s, q);
    var r = this.getKeyFromPlainPrivatePKCS8Hex(p);
    return r;
  }, parsePlainPrivatePKCS8Hex: function(s) {
    var v = ASN1HEX;
    var u = v.getChildIdx;
    var t = v.getV;
    var q = {};
    q.algparam = null;
    if (s.substr(0, 2) != "30") {
      throw "malformed plain PKCS8 private key(code:001)";
    }
    var r = u(s, 0);
    if (r.length != 3) {
      throw "malformed plain PKCS8 private key(code:002)";
    }
    if (s.substr(r[1], 2) != "30") {
      throw "malformed PKCS8 private key(code:003)";
    }
    var p = u(s, r[1]);
    if (p.length != 2) {
      throw "malformed PKCS8 private key(code:004)";
    }
    if (s.substr(p[0], 2) != "06") {
      throw "malformed PKCS8 private key(code:005)";
    }
    q.algoid = t(s, p[0]);
    if (s.substr(p[1], 2) == "06") {
      q.algparam = t(s, p[1]);
    }
    if (s.substr(r[2], 2) != "04") {
      throw "malformed PKCS8 private key(code:006)";
    }
    q.keyidx = v.getVidx(s, r[2]);
    return q;
  }, getKeyFromPlainPrivatePKCS8PEM: function(q) {
    var p = pemtohex(q, "PRIVATE KEY");
    var r = this.getKeyFromPlainPrivatePKCS8Hex(p);
    return r;
  }, getKeyFromPlainPrivatePKCS8Hex: function(p) {
    var q = this.parsePlainPrivatePKCS8Hex(p);
    var r;
    if (q.algoid == "2a864886f70d010101") {
      r = new RSAKey();
    } else {
      if (q.algoid == "2a8648ce380401") {
        r = new KJUR.crypto.DSA();
      } else {
        if (q.algoid == "2a8648ce3d0201") {
          r = new KJUR.crypto.ECDSA();
        } else {
          throw "unsupported private key algorithm";
        }
      }
    }
    r.readPKCS8PrvKeyHex(p);
    return r;
  }, _getKeyFromPublicPKCS8Hex: function(q) {
    var p;
    var r = ASN1HEX.getVbyList(q, 0, [0, 0], "06");
    if (r === "2a864886f70d010101") {
      p = new RSAKey();
    } else {
      if (r === "2a8648ce380401") {
        p = new KJUR.crypto.DSA();
      } else {
        if (r === "2a8648ce3d0201") {
          p = new KJUR.crypto.ECDSA();
        } else {
          throw "unsupported PKCS#8 public key hex";
        }
      }
    }
    p.readPKCS8PubKeyHex(q);
    return p;
  }, parsePublicRawRSAKeyHex: function(r) {
    var u = ASN1HEX;
    var t = u.getChildIdx;
    var s = u.getV;
    var p = {};
    if (r.substr(0, 2) != "30") {
      throw "malformed RSA key(code:001)";
    }
    var q = t(r, 0);
    if (q.length != 2) {
      throw "malformed RSA key(code:002)";
    }
    if (r.substr(q[0], 2) != "02") {
      throw "malformed RSA key(code:003)";
    }
    p.n = s(r, q[0]);
    if (r.substr(q[1], 2) != "02") {
      throw "malformed RSA key(code:004)";
    }
    p.e = s(r, q[1]);
    return p;
  }, parsePublicPKCS8Hex: function(t) {
    var v = ASN1HEX;
    var u = v.getChildIdx;
    var s = v.getV;
    var q = {};
    q.algparam = null;
    var r = u(t, 0);
    if (r.length != 2) {
      throw "outer DERSequence shall have 2 elements: " + r.length;
    }
    var w = r[0];
    if (t.substr(w, 2) != "30") {
      throw "malformed PKCS8 public key(code:001)";
    }
    var p = u(t, w);
    if (p.length != 2) {
      throw "malformed PKCS8 public key(code:002)";
    }
    if (t.substr(p[0], 2) != "06") {
      throw "malformed PKCS8 public key(code:003)";
    }
    q.algoid = s(t, p[0]);
    if (t.substr(p[1], 2) == "06") {
      q.algparam = s(t, p[1]);
    } else {
      if (t.substr(p[1], 2) == "30") {
        q.algparam = {};
        q.algparam.p = v.getVbyList(t, p[1], [0], "02");
        q.algparam.q = v.getVbyList(t, p[1], [1], "02");
        q.algparam.g = v.getVbyList(t, p[1], [2], "02");
      }
    }
    if (t.substr(r[1], 2) != "03") {
      throw "malformed PKCS8 public key(code:004)";
    }
    q.key = s(t, r[1]).substr(2);
    return q;
  } };
}();
KEYUTIL.getKey = function(l, k, n) {
  var G = ASN1HEX, L = G.getChildIdx;
  G.getV;
  var d = G.getVbyList, c = KJUR.crypto, i = c.ECDSA, C = c.DSA, w = RSAKey, M = pemtohex, F = KEYUTIL;
  if (typeof w != "undefined" && l instanceof w) {
    return l;
  }
  if (typeof i != "undefined" && l instanceof i) {
    return l;
  }
  if (typeof C != "undefined" && l instanceof C) {
    return l;
  }
  if (l.curve !== void 0 && l.xy !== void 0 && l.d === void 0) {
    return new i({ pub: l.xy, curve: l.curve });
  }
  if (l.curve !== void 0 && l.d !== void 0) {
    return new i({ prv: l.d, curve: l.curve });
  }
  if (l.kty === void 0 && l.n !== void 0 && l.e !== void 0 && l.d === void 0) {
    var P = new w();
    P.setPublic(l.n, l.e);
    return P;
  }
  if (l.kty === void 0 && l.n !== void 0 && l.e !== void 0 && l.d !== void 0 && l.p !== void 0 && l.q !== void 0 && l.dp !== void 0 && l.dq !== void 0 && l.co !== void 0 && l.qi === void 0) {
    var P = new w();
    P.setPrivateEx(l.n, l.e, l.d, l.p, l.q, l.dp, l.dq, l.co);
    return P;
  }
  if (l.kty === void 0 && l.n !== void 0 && l.e !== void 0 && l.d !== void 0 && l.p === void 0) {
    var P = new w();
    P.setPrivate(l.n, l.e, l.d);
    return P;
  }
  if (l.p !== void 0 && l.q !== void 0 && l.g !== void 0 && l.y !== void 0 && l.x === void 0) {
    var P = new C();
    P.setPublic(l.p, l.q, l.g, l.y);
    return P;
  }
  if (l.p !== void 0 && l.q !== void 0 && l.g !== void 0 && l.y !== void 0 && l.x !== void 0) {
    var P = new C();
    P.setPrivate(l.p, l.q, l.g, l.y, l.x);
    return P;
  }
  if (l.kty === "RSA" && l.n !== void 0 && l.e !== void 0 && l.d === void 0) {
    var P = new w();
    P.setPublic(b64utohex(l.n), b64utohex(l.e));
    return P;
  }
  if (l.kty === "RSA" && l.n !== void 0 && l.e !== void 0 && l.d !== void 0 && l.p !== void 0 && l.q !== void 0 && l.dp !== void 0 && l.dq !== void 0 && l.qi !== void 0) {
    var P = new w();
    P.setPrivateEx(b64utohex(l.n), b64utohex(l.e), b64utohex(l.d), b64utohex(l.p), b64utohex(l.q), b64utohex(l.dp), b64utohex(l.dq), b64utohex(l.qi));
    return P;
  }
  if (l.kty === "RSA" && l.n !== void 0 && l.e !== void 0 && l.d !== void 0) {
    var P = new w();
    P.setPrivate(b64utohex(l.n), b64utohex(l.e), b64utohex(l.d));
    return P;
  }
  if (l.kty === "EC" && l.crv !== void 0 && l.x !== void 0 && l.y !== void 0 && l.d === void 0) {
    var j = new i({ curve: l.crv });
    var t = j.ecparams.keylen / 4;
    var B = ("0000000000" + b64utohex(l.x)).slice(-t);
    var z = ("0000000000" + b64utohex(l.y)).slice(-t);
    var u = "04" + B + z;
    j.setPublicKeyHex(u);
    return j;
  }
  if (l.kty === "EC" && l.crv !== void 0 && l.x !== void 0 && l.y !== void 0 && l.d !== void 0) {
    var j = new i({ curve: l.crv });
    var t = j.ecparams.keylen / 4;
    var B = ("0000000000" + b64utohex(l.x)).slice(-t);
    var z = ("0000000000" + b64utohex(l.y)).slice(-t);
    var u = "04" + B + z;
    var b = ("0000000000" + b64utohex(l.d)).slice(-t);
    j.setPublicKeyHex(u);
    j.setPrivateKeyHex(b);
    return j;
  }
  if (n === "pkcs5prv") {
    var J = l, G = ASN1HEX, N, P;
    N = L(J, 0);
    if (N.length === 9) {
      P = new w();
      P.readPKCS5PrvKeyHex(J);
    } else {
      if (N.length === 6) {
        P = new C();
        P.readPKCS5PrvKeyHex(J);
      } else {
        if (N.length > 2 && J.substr(N[1], 2) === "04") {
          P = new i();
          P.readPKCS5PrvKeyHex(J);
        } else {
          throw "unsupported PKCS#1/5 hexadecimal key";
        }
      }
    }
    return P;
  }
  if (n === "pkcs8prv") {
    var P = F.getKeyFromPlainPrivatePKCS8Hex(l);
    return P;
  }
  if (n === "pkcs8pub") {
    return F._getKeyFromPublicPKCS8Hex(l);
  }
  if (n === "x509pub") {
    return X509.getPublicKeyFromCertHex(l);
  }
  if (l.indexOf("-END CERTIFICATE-", 0) != -1 || l.indexOf("-END X509 CERTIFICATE-", 0) != -1 || l.indexOf("-END TRUSTED CERTIFICATE-", 0) != -1) {
    return X509.getPublicKeyFromCertPEM(l);
  }
  if (l.indexOf("-END PUBLIC KEY-") != -1) {
    var O = pemtohex(l, "PUBLIC KEY");
    return F._getKeyFromPublicPKCS8Hex(O);
  }
  if (l.indexOf("-END RSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") == -1) {
    var m = M(l, "RSA PRIVATE KEY");
    return F.getKey(m, null, "pkcs5prv");
  }
  if (l.indexOf("-END DSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") == -1) {
    var I = M(l, "DSA PRIVATE KEY");
    var E = d(I, 0, [1], "02");
    var D = d(I, 0, [2], "02");
    var K = d(I, 0, [3], "02");
    var r = d(I, 0, [4], "02");
    var s = d(I, 0, [5], "02");
    var P = new C();
    P.setPrivate(new BigInteger(E, 16), new BigInteger(D, 16), new BigInteger(K, 16), new BigInteger(r, 16), new BigInteger(s, 16));
    return P;
  }
  if (l.indexOf("-END PRIVATE KEY-") != -1) {
    return F.getKeyFromPlainPrivatePKCS8PEM(l);
  }
  if (l.indexOf("-END RSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {
    var o = F.getDecryptedKeyHex(l, k);
    var H = new RSAKey();
    H.readPKCS5PrvKeyHex(o);
    return H;
  }
  if (l.indexOf("-END EC PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {
    var I = F.getDecryptedKeyHex(l, k);
    var P = d(I, 0, [1], "04");
    var f = d(I, 0, [2, 0], "06");
    var A = d(I, 0, [3, 0], "03").substr(2);
    var e = "";
    if (KJUR.crypto.OID.oidhex2name[f] !== void 0) {
      e = KJUR.crypto.OID.oidhex2name[f];
    } else {
      throw "undefined OID(hex) in KJUR.crypto.OID: " + f;
    }
    var j = new i({ curve: e });
    j.setPublicKeyHex(A);
    j.setPrivateKeyHex(P);
    j.isPublic = false;
    return j;
  }
  if (l.indexOf("-END DSA PRIVATE KEY-") != -1 && l.indexOf("4,ENCRYPTED") != -1) {
    var I = F.getDecryptedKeyHex(l, k);
    var E = d(I, 0, [1], "02");
    var D = d(I, 0, [2], "02");
    var K = d(I, 0, [3], "02");
    var r = d(I, 0, [4], "02");
    var s = d(I, 0, [5], "02");
    var P = new C();
    P.setPrivate(new BigInteger(E, 16), new BigInteger(D, 16), new BigInteger(K, 16), new BigInteger(r, 16), new BigInteger(s, 16));
    return P;
  }
  if (l.indexOf("-END ENCRYPTED PRIVATE KEY-") != -1) {
    return F.getKeyFromEncryptedPKCS8PEM(l, k);
  }
  throw "not supported argument";
};
KEYUTIL.generateKeypair = function(a, c) {
  if (a == "RSA") {
    var b = c;
    var h2 = new RSAKey();
    h2.generate(b, "10001");
    h2.isPrivate = true;
    h2.isPublic = true;
    var f = new RSAKey();
    var e = h2.n.toString(16);
    var i = h2.e.toString(16);
    f.setPublic(e, i);
    f.isPrivate = false;
    f.isPublic = true;
    var k = {};
    k.prvKeyObj = h2;
    k.pubKeyObj = f;
    return k;
  } else {
    if (a == "EC") {
      var d = c;
      var g = new KJUR.crypto.ECDSA({ curve: d });
      var j = g.generateKeyPairHex();
      var h2 = new KJUR.crypto.ECDSA({ curve: d });
      h2.setPublicKeyHex(j.ecpubhex);
      h2.setPrivateKeyHex(j.ecprvhex);
      h2.isPrivate = true;
      h2.isPublic = false;
      var f = new KJUR.crypto.ECDSA({ curve: d });
      f.setPublicKeyHex(j.ecpubhex);
      f.isPrivate = false;
      f.isPublic = true;
      var k = {};
      k.prvKeyObj = h2;
      k.pubKeyObj = f;
      return k;
    } else {
      throw "unknown algorithm: " + a;
    }
  }
};
KEYUTIL.getPEM = function(b, D, y, m, q, j) {
  var F = KJUR, k = F.asn1, z = k.DERObjectIdentifier, f = k.DERInteger, l = k.ASN1Util.newObject, a = k.x509, C = a.SubjectPublicKeyInfo, e = F.crypto, u = e.DSA, r = e.ECDSA, n = RSAKey;
  function A(s) {
    var G = l({ seq: [{ "int": 0 }, { "int": { bigint: s.n } }, { "int": s.e }, { "int": { bigint: s.d } }, { "int": { bigint: s.p } }, { "int": { bigint: s.q } }, { "int": { bigint: s.dmp1 } }, { "int": { bigint: s.dmq1 } }, { "int": { bigint: s.coeff } }] });
    return G;
  }
  function B(G) {
    var s = l({ seq: [{ "int": 1 }, { octstr: { hex: G.prvKeyHex } }, { tag: ["a0", true, { oid: { name: G.curveName } }] }, { tag: ["a1", true, { bitstr: { hex: "00" + G.pubKeyHex } }] }] });
    return s;
  }
  function x(s) {
    var G = l({ seq: [{ "int": 0 }, { "int": { bigint: s.p } }, { "int": { bigint: s.q } }, { "int": { bigint: s.g } }, { "int": { bigint: s.y } }, { "int": { bigint: s.x } }] });
    return G;
  }
  if ((n !== void 0 && b instanceof n || u !== void 0 && b instanceof u || r !== void 0 && b instanceof r) && b.isPublic == true && (D === void 0 || D == "PKCS8PUB")) {
    var E = new C(b);
    var w = E.getEncodedHex();
    return hextopem(w, "PUBLIC KEY");
  }
  if (D == "PKCS1PRV" && n !== void 0 && b instanceof n && (y === void 0 || y == null) && b.isPrivate == true) {
    var E = A(b);
    var w = E.getEncodedHex();
    return hextopem(w, "RSA PRIVATE KEY");
  }
  if (D == "PKCS1PRV" && r !== void 0 && b instanceof r && (y === void 0 || y == null) && b.isPrivate == true) {
    var i = new z({ name: b.curveName });
    var v = i.getEncodedHex();
    var h2 = B(b);
    var t = h2.getEncodedHex();
    var p = "";
    p += hextopem(v, "EC PARAMETERS");
    p += hextopem(t, "EC PRIVATE KEY");
    return p;
  }
  if (D == "PKCS1PRV" && u !== void 0 && b instanceof u && (y === void 0 || y == null) && b.isPrivate == true) {
    var E = x(b);
    var w = E.getEncodedHex();
    return hextopem(w, "DSA PRIVATE KEY");
  }
  if (D == "PKCS5PRV" && n !== void 0 && b instanceof n && (y !== void 0 && y != null) && b.isPrivate == true) {
    var E = A(b);
    var w = E.getEncodedHex();
    if (m === void 0) {
      m = "DES-EDE3-CBC";
    }
    return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA", w, y, m, j);
  }
  if (D == "PKCS5PRV" && r !== void 0 && b instanceof r && (y !== void 0 && y != null) && b.isPrivate == true) {
    var E = B(b);
    var w = E.getEncodedHex();
    if (m === void 0) {
      m = "DES-EDE3-CBC";
    }
    return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC", w, y, m, j);
  }
  if (D == "PKCS5PRV" && u !== void 0 && b instanceof u && (y !== void 0 && y != null) && b.isPrivate == true) {
    var E = x(b);
    var w = E.getEncodedHex();
    if (m === void 0) {
      m = "DES-EDE3-CBC";
    }
    return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA", w, y, m, j);
  }
  var o = function(G, s) {
    var I = c(G, s);
    var H = new l({ seq: [{ seq: [{ oid: { name: "pkcs5PBES2" } }, { seq: [{ seq: [{ oid: { name: "pkcs5PBKDF2" } }, { seq: [{ octstr: { hex: I.pbkdf2Salt } }, { "int": I.pbkdf2Iter }] }] }, { seq: [{ oid: { name: "des-EDE3-CBC" } }, { octstr: { hex: I.encryptionSchemeIV } }] }] }] }, { octstr: { hex: I.ciphertext } }] });
    return H.getEncodedHex();
  };
  var c = function(N, O) {
    var H = 100;
    var M = CryptoJS.lib.WordArray.random(8);
    var L = "DES-EDE3-CBC";
    var s = CryptoJS.lib.WordArray.random(8);
    var I = CryptoJS.PBKDF2(O, M, { keySize: 192 / 32, iterations: H });
    var J = CryptoJS.enc.Hex.parse(N);
    var K = CryptoJS.TripleDES.encrypt(J, I, { iv: s }) + "";
    var G = {};
    G.ciphertext = K;
    G.pbkdf2Salt = CryptoJS.enc.Hex.stringify(M);
    G.pbkdf2Iter = H;
    G.encryptionSchemeAlg = L;
    G.encryptionSchemeIV = CryptoJS.enc.Hex.stringify(s);
    return G;
  };
  if (D == "PKCS8PRV" && n != void 0 && b instanceof n && b.isPrivate == true) {
    var g = A(b);
    var d = g.getEncodedHex();
    var E = l({ seq: [{ "int": 0 }, { seq: [{ oid: { name: "rsaEncryption" } }, { "null": true }] }, { octstr: { hex: d } }] });
    var w = E.getEncodedHex();
    if (y === void 0 || y == null) {
      return hextopem(w, "PRIVATE KEY");
    } else {
      var t = o(w, y);
      return hextopem(t, "ENCRYPTED PRIVATE KEY");
    }
  }
  if (D == "PKCS8PRV" && r !== void 0 && b instanceof r && b.isPrivate == true) {
    var g = new l({ seq: [{ "int": 1 }, { octstr: { hex: b.prvKeyHex } }, { tag: ["a1", true, { bitstr: { hex: "00" + b.pubKeyHex } }] }] });
    var d = g.getEncodedHex();
    var E = l({ seq: [{ "int": 0 }, { seq: [{ oid: { name: "ecPublicKey" } }, { oid: { name: b.curveName } }] }, { octstr: { hex: d } }] });
    var w = E.getEncodedHex();
    if (y === void 0 || y == null) {
      return hextopem(w, "PRIVATE KEY");
    } else {
      var t = o(w, y);
      return hextopem(t, "ENCRYPTED PRIVATE KEY");
    }
  }
  if (D == "PKCS8PRV" && u !== void 0 && b instanceof u && b.isPrivate == true) {
    var g = new f({ bigint: b.x });
    var d = g.getEncodedHex();
    var E = l({ seq: [{ "int": 0 }, { seq: [{ oid: { name: "dsa" } }, { seq: [{ "int": { bigint: b.p } }, { "int": { bigint: b.q } }, { "int": { bigint: b.g } }] }] }, { octstr: { hex: d } }] });
    var w = E.getEncodedHex();
    if (y === void 0 || y == null) {
      return hextopem(w, "PRIVATE KEY");
    } else {
      var t = o(w, y);
      return hextopem(t, "ENCRYPTED PRIVATE KEY");
    }
  }
  throw "unsupported object nor format";
};
KEYUTIL.getKeyFromCSRPEM = function(b) {
  var a = pemtohex(b, "CERTIFICATE REQUEST");
  var c = KEYUTIL.getKeyFromCSRHex(a);
  return c;
};
KEYUTIL.getKeyFromCSRHex = function(a) {
  var c = KEYUTIL.parseCSRHex(a);
  var b = KEYUTIL.getKey(c.p8pubkeyhex, null, "pkcs8pub");
  return b;
};
KEYUTIL.parseCSRHex = function(d) {
  var i = ASN1HEX;
  var f = i.getChildIdx;
  var c = i.getTLV;
  var b = {};
  var g = d;
  if (g.substr(0, 2) != "30") {
    throw "malformed CSR(code:001)";
  }
  var e = f(g, 0);
  if (e.length < 1) {
    throw "malformed CSR(code:002)";
  }
  if (g.substr(e[0], 2) != "30") {
    throw "malformed CSR(code:003)";
  }
  var a = f(g, e[0]);
  if (a.length < 3) {
    throw "malformed CSR(code:004)";
  }
  b.p8pubkeyhex = c(g, a[2]);
  return b;
};
KEYUTIL.getJWKFromKey = function(d) {
  var b = {};
  if (d instanceof RSAKey && d.isPrivate) {
    b.kty = "RSA";
    b.n = hextob64u(d.n.toString(16));
    b.e = hextob64u(d.e.toString(16));
    b.d = hextob64u(d.d.toString(16));
    b.p = hextob64u(d.p.toString(16));
    b.q = hextob64u(d.q.toString(16));
    b.dp = hextob64u(d.dmp1.toString(16));
    b.dq = hextob64u(d.dmq1.toString(16));
    b.qi = hextob64u(d.coeff.toString(16));
    return b;
  } else {
    if (d instanceof RSAKey && d.isPublic) {
      b.kty = "RSA";
      b.n = hextob64u(d.n.toString(16));
      b.e = hextob64u(d.e.toString(16));
      return b;
    } else {
      if (d instanceof KJUR.crypto.ECDSA && d.isPrivate) {
        var a = d.getShortNISTPCurveName();
        if (a !== "P-256" && a !== "P-384") {
          throw "unsupported curve name for JWT: " + a;
        }
        var c = d.getPublicKeyXYHex();
        b.kty = "EC";
        b.crv = a;
        b.x = hextob64u(c.x);
        b.y = hextob64u(c.y);
        b.d = hextob64u(d.prvKeyHex);
        return b;
      } else {
        if (d instanceof KJUR.crypto.ECDSA && d.isPublic) {
          var a = d.getShortNISTPCurveName();
          if (a !== "P-256" && a !== "P-384") {
            throw "unsupported curve name for JWT: " + a;
          }
          var c = d.getPublicKeyXYHex();
          b.kty = "EC";
          b.crv = a;
          b.x = hextob64u(c.x);
          b.y = hextob64u(c.y);
          return b;
        }
      }
    }
  }
  throw "not supported key object";
};
RSAKey.getPosArrayOfChildrenFromHex = function(a) {
  return ASN1HEX.getChildIdx(a, 0);
};
RSAKey.getHexValueArrayOfChildrenFromHex = function(f) {
  var n = ASN1HEX;
  var i = n.getV;
  var k = RSAKey.getPosArrayOfChildrenFromHex(f);
  var e = i(f, k[0]);
  var j = i(f, k[1]);
  var b = i(f, k[2]);
  var c = i(f, k[3]);
  var h2 = i(f, k[4]);
  var g = i(f, k[5]);
  var m = i(f, k[6]);
  var l = i(f, k[7]);
  var d = i(f, k[8]);
  var k = new Array();
  k.push(e, j, b, c, h2, g, m, l, d);
  return k;
};
RSAKey.prototype.readPrivateKeyFromPEMString = function(d) {
  var c = pemtohex(d);
  var b = RSAKey.getHexValueArrayOfChildrenFromHex(c);
  this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8]);
};
RSAKey.prototype.readPKCS5PrvKeyHex = function(c) {
  var b = RSAKey.getHexValueArrayOfChildrenFromHex(c);
  this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8]);
};
RSAKey.prototype.readPKCS8PrvKeyHex = function(e) {
  var c, j, l, b, a, f, d, k;
  var m = ASN1HEX;
  var g = m.getVbyList;
  if (m.isASN1HEX(e) === false) {
    throw "not ASN.1 hex string";
  }
  try {
    c = g(e, 0, [2, 0, 1], "02");
    j = g(e, 0, [2, 0, 2], "02");
    l = g(e, 0, [2, 0, 3], "02");
    b = g(e, 0, [2, 0, 4], "02");
    a = g(e, 0, [2, 0, 5], "02");
    f = g(e, 0, [2, 0, 6], "02");
    d = g(e, 0, [2, 0, 7], "02");
    k = g(e, 0, [2, 0, 8], "02");
  } catch (i) {
    throw "malformed PKCS#8 plain RSA private key";
  }
  this.setPrivateEx(c, j, l, b, a, f, d, k);
};
RSAKey.prototype.readPKCS5PubKeyHex = function(c) {
  var e = ASN1HEX;
  var b = e.getV;
  if (e.isASN1HEX(c) === false) {
    throw "keyHex is not ASN.1 hex string";
  }
  var a = e.getChildIdx(c, 0);
  if (a.length !== 2 || c.substr(a[0], 2) !== "02" || c.substr(a[1], 2) !== "02") {
    throw "wrong hex for PKCS#5 public key";
  }
  var f = b(c, a[0]);
  var d = b(c, a[1]);
  this.setPublic(f, d);
};
RSAKey.prototype.readPKCS8PubKeyHex = function(b) {
  var c = ASN1HEX;
  if (c.isASN1HEX(b) === false) {
    throw "not ASN.1 hex string";
  }
  if (c.getTLVbyList(b, 0, [0, 0]) !== "06092a864886f70d010101") {
    throw "not PKCS8 RSA public key";
  }
  var a = c.getTLVbyList(b, 0, [1, 0]);
  this.readPKCS5PubKeyHex(a);
};
RSAKey.prototype.readCertPubKeyHex = function(b, d) {
  var a, c;
  a = new X509();
  a.readCertHex(b);
  c = a.getPublicKeyHex();
  this.readPKCS8PubKeyHex(c);
};
var _RE_HEXDECONLY = new RegExp("");
_RE_HEXDECONLY.compile("[^0-9a-f]", "gi");
function _zeroPaddingOfSignature(e, d) {
  var c = "";
  var a = d / 4 - e.length;
  for (var b = 0; b < a; b++) {
    c = c + "0";
  }
  return c + e;
}
RSAKey.prototype.sign = function(d, a) {
  var b = function(e) {
    return KJUR.crypto.Util.hashString(e, a);
  };
  var c = b(d);
  return this.signWithMessageHash(c, a);
};
RSAKey.prototype.signWithMessageHash = function(e, c) {
  var f = KJUR.crypto.Util.getPaddedDigestInfoHex(e, c, this.n.bitLength());
  var b = parseBigInt(f, 16);
  var d = this.doPrivate(b);
  var a = d.toString(16);
  return _zeroPaddingOfSignature(a, this.n.bitLength());
};
function pss_mgf1_str(c, a, e) {
  var b = "", d = 0;
  while (b.length < a) {
    b += hextorstr(e(rstrtohex(c + String.fromCharCode.apply(String, [(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255]))));
    d += 1;
  }
  return b;
}
RSAKey.prototype.signPSS = function(e, a, d) {
  var c = function(f) {
    return KJUR.crypto.Util.hashHex(f, a);
  };
  var b = c(rstrtohex(e));
  if (d === void 0) {
    d = -1;
  }
  return this.signWithMessageHashPSS(b, a, d);
};
RSAKey.prototype.signWithMessageHashPSS = function(l, a, k) {
  var b = hextorstr(l);
  var g = b.length;
  var m = this.n.bitLength() - 1;
  var c = Math.ceil(m / 8);
  var d;
  var o = function(i) {
    return KJUR.crypto.Util.hashHex(i, a);
  };
  if (k === -1 || k === void 0) {
    k = g;
  } else {
    if (k === -2) {
      k = c - g - 2;
    } else {
      if (k < -2) {
        throw "invalid salt length";
      }
    }
  }
  if (c < g + k + 2) {
    throw "data too long";
  }
  var f = "";
  if (k > 0) {
    f = new Array(k);
    new SecureRandom().nextBytes(f);
    f = String.fromCharCode.apply(String, f);
  }
  var n = hextorstr(o(rstrtohex("\0\0\0\0\0\0\0\0" + b + f)));
  var j = [];
  for (d = 0; d < c - k - g - 2; d += 1) {
    j[d] = 0;
  }
  var e = String.fromCharCode.apply(String, j) + "" + f;
  var h2 = pss_mgf1_str(n, e.length, o);
  var q = [];
  for (d = 0; d < e.length; d += 1) {
    q[d] = e.charCodeAt(d) ^ h2.charCodeAt(d);
  }
  var p = 65280 >> 8 * c - m & 255;
  q[0] &= ~p;
  for (d = 0; d < g; d++) {
    q.push(n.charCodeAt(d));
  }
  q.push(188);
  return _zeroPaddingOfSignature(this.doPrivate(new BigInteger(q)).toString(16), this.n.bitLength());
};
function _rsasign_getAlgNameAndHashFromHexDisgestInfo(f) {
  for (var e in KJUR.crypto.Util.DIGESTINFOHEAD) {
    var d = KJUR.crypto.Util.DIGESTINFOHEAD[e];
    var b = d.length;
    if (f.substring(0, b) == d) {
      var c = [e, f.substring(b)];
      return c;
    }
  }
  return [];
}
RSAKey.prototype.verify = function(f, j) {
  j = j.replace(_RE_HEXDECONLY, "");
  j = j.replace(/[ \n]+/g, "");
  var b = parseBigInt(j, 16);
  if (b.bitLength() > this.n.bitLength()) {
    return 0;
  }
  var i = this.doPublic(b);
  var e = i.toString(16).replace(/^1f+00/, "");
  var g = _rsasign_getAlgNameAndHashFromHexDisgestInfo(e);
  if (g.length == 0) {
    return false;
  }
  var d = g[0];
  var h2 = g[1];
  var a = function(k) {
    return KJUR.crypto.Util.hashString(k, d);
  };
  var c = a(f);
  return h2 == c;
};
RSAKey.prototype.verifyWithMessageHash = function(e, a) {
  a = a.replace(_RE_HEXDECONLY, "");
  a = a.replace(/[ \n]+/g, "");
  var b = parseBigInt(a, 16);
  if (b.bitLength() > this.n.bitLength()) {
    return 0;
  }
  var h2 = this.doPublic(b);
  var g = h2.toString(16).replace(/^1f+00/, "");
  var c = _rsasign_getAlgNameAndHashFromHexDisgestInfo(g);
  if (c.length == 0) {
    return false;
  }
  c[0];
  var f = c[1];
  return f == e;
};
RSAKey.prototype.verifyPSS = function(c, b, a, f) {
  var e = function(g) {
    return KJUR.crypto.Util.hashHex(g, a);
  };
  var d = e(rstrtohex(c));
  if (f === void 0) {
    f = -1;
  }
  return this.verifyWithMessageHashPSS(d, b, a, f);
};
RSAKey.prototype.verifyWithMessageHashPSS = function(f, s, l, c) {
  var k = new BigInteger(s, 16);
  if (k.bitLength() > this.n.bitLength()) {
    return false;
  }
  var r = function(i) {
    return KJUR.crypto.Util.hashHex(i, l);
  };
  var j = hextorstr(f);
  var h2 = j.length;
  var g = this.n.bitLength() - 1;
  var m = Math.ceil(g / 8);
  var q;
  if (c === -1 || c === void 0) {
    c = h2;
  } else {
    if (c === -2) {
      c = m - h2 - 2;
    } else {
      if (c < -2) {
        throw "invalid salt length";
      }
    }
  }
  if (m < h2 + c + 2) {
    throw "data too long";
  }
  var a = this.doPublic(k).toByteArray();
  for (q = 0; q < a.length; q += 1) {
    a[q] &= 255;
  }
  while (a.length < m) {
    a.unshift(0);
  }
  if (a[m - 1] !== 188) {
    throw "encoded message does not end in 0xbc";
  }
  a = String.fromCharCode.apply(String, a);
  var d = a.substr(0, m - h2 - 1);
  var e = a.substr(d.length, h2);
  var p = 65280 >> 8 * m - g & 255;
  if ((d.charCodeAt(0) & p) !== 0) {
    throw "bits beyond keysize not zero";
  }
  var n = pss_mgf1_str(e, d.length, r);
  var o = [];
  for (q = 0; q < d.length; q += 1) {
    o[q] = d.charCodeAt(q) ^ n.charCodeAt(q);
  }
  o[0] &= ~p;
  var b = m - h2 - c - 2;
  for (q = 0; q < b; q += 1) {
    if (o[q] !== 0) {
      throw "leftmost octets not zero";
    }
  }
  if (o[b] !== 1) {
    throw "0x01 marker not found";
  }
  return e === hextorstr(r(rstrtohex("\0\0\0\0\0\0\0\0" + j + String.fromCharCode.apply(String, o.slice(-c)))));
};
RSAKey.SALT_LEN_HLEN = -1;
RSAKey.SALT_LEN_MAX = -2;
RSAKey.SALT_LEN_RECOVER = -2;
function X509() {
  var k = ASN1HEX, j = k.getChildIdx, h2 = k.getV, b = k.getTLV, f = k.getVbyList, c = k.getTLVbyList, g = k.getIdxbyList, d = k.getVidx, i = k.oidname, a = X509, e = pemtohex;
  this.hex = null;
  this.version = 0;
  this.foffset = 0;
  this.aExtInfo = null;
  this.getVersion = function() {
    if (this.hex === null || this.version !== 0) {
      return this.version;
    }
    if (c(this.hex, 0, [0, 0]) !== "a003020102") {
      this.version = 1;
      this.foffset = -1;
      return 1;
    }
    this.version = 3;
    return 3;
  };
  this.getSerialNumberHex = function() {
    return f(this.hex, 0, [0, 1 + this.foffset], "02");
  };
  this.getSignatureAlgorithmField = function() {
    return i(f(this.hex, 0, [0, 2 + this.foffset, 0], "06"));
  };
  this.getIssuerHex = function() {
    return c(this.hex, 0, [0, 3 + this.foffset], "30");
  };
  this.getIssuerString = function() {
    return a.hex2dn(this.getIssuerHex());
  };
  this.getSubjectHex = function() {
    return c(this.hex, 0, [0, 5 + this.foffset], "30");
  };
  this.getSubjectString = function() {
    return a.hex2dn(this.getSubjectHex());
  };
  this.getNotBefore = function() {
    var l = f(this.hex, 0, [0, 4 + this.foffset, 0]);
    l = l.replace(/(..)/g, "%$1");
    l = decodeURIComponent(l);
    return l;
  };
  this.getNotAfter = function() {
    var l = f(this.hex, 0, [0, 4 + this.foffset, 1]);
    l = l.replace(/(..)/g, "%$1");
    l = decodeURIComponent(l);
    return l;
  };
  this.getPublicKeyHex = function() {
    return k.getTLVbyList(this.hex, 0, [0, 6 + this.foffset], "30");
  };
  this.getPublicKeyIdx = function() {
    return g(this.hex, 0, [0, 6 + this.foffset], "30");
  };
  this.getPublicKeyContentIdx = function() {
    var l = this.getPublicKeyIdx();
    return g(this.hex, l, [1, 0], "30");
  };
  this.getPublicKey = function() {
    return KEYUTIL.getKey(this.getPublicKeyHex(), null, "pkcs8pub");
  };
  this.getSignatureAlgorithmName = function() {
    return i(f(this.hex, 0, [1, 0], "06"));
  };
  this.getSignatureValueHex = function() {
    return f(this.hex, 0, [2], "03", true);
  };
  this.verifySignature = function(n) {
    var o = this.getSignatureAlgorithmName();
    var l = this.getSignatureValueHex();
    var m = c(this.hex, 0, [0], "30");
    var p = new KJUR.crypto.Signature({ alg: o });
    p.init(n);
    p.updateHex(m);
    return p.verify(l);
  };
  this.parseExt = function() {
    if (this.version !== 3) {
      return -1;
    }
    var p = g(this.hex, 0, [0, 7, 0], "30");
    var m = j(this.hex, p);
    this.aExtInfo = new Array();
    for (var n = 0; n < m.length; n++) {
      var q = {};
      q.critical = false;
      var l = j(this.hex, m[n]);
      var r = 0;
      if (l.length === 3) {
        q.critical = true;
        r = 1;
      }
      q.oid = k.hextooidstr(f(this.hex, m[n], [0], "06"));
      var o = g(this.hex, m[n], [1 + r]);
      q.vidx = d(this.hex, o);
      this.aExtInfo.push(q);
    }
  };
  this.getExtInfo = function(n) {
    var l = this.aExtInfo;
    var o = n;
    if (!n.match(/^[0-9.]+$/)) {
      o = KJUR.asn1.x509.OID.name2oid(n);
    }
    if (o === "") {
      return void 0;
    }
    for (var m = 0; m < l.length; m++) {
      if (l[m].oid === o) {
        return l[m];
      }
    }
    return void 0;
  };
  this.getExtBasicConstraints = function() {
    var n = this.getExtInfo("basicConstraints");
    if (n === void 0) {
      return n;
    }
    var l = h2(this.hex, n.vidx);
    if (l === "") {
      return {};
    }
    if (l === "0101ff") {
      return { cA: true };
    }
    if (l.substr(0, 8) === "0101ff02") {
      var o = h2(l, 6);
      var m = parseInt(o, 16);
      return { cA: true, pathLen: m };
    }
    throw "basicConstraints parse error";
  };
  this.getExtKeyUsageBin = function() {
    var o = this.getExtInfo("keyUsage");
    if (o === void 0) {
      return "";
    }
    var m = h2(this.hex, o.vidx);
    if (m.length % 2 != 0 || m.length <= 2) {
      throw "malformed key usage value";
    }
    var l = parseInt(m.substr(0, 2));
    var n = parseInt(m.substr(2), 16).toString(2);
    return n.substr(0, n.length - l);
  };
  this.getExtKeyUsageString = function() {
    var n = this.getExtKeyUsageBin();
    var l = new Array();
    for (var m = 0; m < n.length; m++) {
      if (n.substr(m, 1) == "1") {
        l.push(X509.KEYUSAGE_NAME[m]);
      }
    }
    return l.join(",");
  };
  this.getExtSubjectKeyIdentifier = function() {
    var l = this.getExtInfo("subjectKeyIdentifier");
    if (l === void 0) {
      return l;
    }
    return h2(this.hex, l.vidx);
  };
  this.getExtAuthorityKeyIdentifier = function() {
    var p = this.getExtInfo("authorityKeyIdentifier");
    if (p === void 0) {
      return p;
    }
    var l = {};
    var o = b(this.hex, p.vidx);
    var m = j(o, 0);
    for (var n = 0; n < m.length; n++) {
      if (o.substr(m[n], 2) === "80") {
        l.kid = h2(o, m[n]);
      }
    }
    return l;
  };
  this.getExtExtKeyUsageName = function() {
    var p = this.getExtInfo("extKeyUsage");
    if (p === void 0) {
      return p;
    }
    var l = new Array();
    var o = b(this.hex, p.vidx);
    if (o === "") {
      return l;
    }
    var m = j(o, 0);
    for (var n = 0; n < m.length; n++) {
      l.push(i(h2(o, m[n])));
    }
    return l;
  };
  this.getExtSubjectAltName = function() {
    var m = this.getExtSubjectAltName2();
    var l = new Array();
    for (var n = 0; n < m.length; n++) {
      if (m[n][0] === "DNS") {
        l.push(m[n][1]);
      }
    }
    return l;
  };
  this.getExtSubjectAltName2 = function() {
    var l, p, n;
    var m = this.getExtInfo("subjectAltName");
    if (m === void 0) {
      return m;
    }
    var t = new Array();
    var q = b(this.hex, m.vidx);
    var s = j(q, 0);
    for (var o = 0; o < s.length; o++) {
      n = q.substr(s[o], 2);
      l = h2(q, s[o]);
      if (n === "81") {
        p = hextoutf8(l);
        t.push(["MAIL", p]);
      }
      if (n === "82") {
        p = hextoutf8(l);
        t.push(["DNS", p]);
      }
      if (n === "84") {
        p = X509.hex2dn(l, 0);
        t.push(["DN", p]);
      }
      if (n === "86") {
        p = hextoutf8(l);
        t.push(["URI", p]);
      }
      if (n === "87") {
        try {
          p = parseInt(p.substr(0, 2), 16) + "." + parseInt(p.substr(2, 2), 16) + "." + parseInt(p.substr(4, 2), 16) + "." + parseInt(p.substr(6, 2), 16);
          t.push(["IP", p]);
        } catch (r) {
        }
      }
    }
    return t;
  };
  this.getExtCRLDistributionPointsURI = function() {
    var q = this.getExtInfo("cRLDistributionPoints");
    if (q === void 0) {
      return q;
    }
    var l = new Array();
    var m = j(this.hex, q.vidx);
    for (var o = 0; o < m.length; o++) {
      try {
        var r = f(this.hex, m[o], [0, 0, 0], "86");
        var p = hextoutf8(r);
        l.push(p);
      } catch (n) {
      }
    }
    return l;
  };
  this.getExtAIAInfo = function() {
    var p = this.getExtInfo("authorityInfoAccess");
    if (p === void 0) {
      return p;
    }
    var l = { ocsp: [], caissuer: [] };
    var m = j(this.hex, p.vidx);
    for (var n = 0; n < m.length; n++) {
      var q = f(this.hex, m[n], [0], "06");
      var o = f(this.hex, m[n], [1], "86");
      if (q === "2b06010505073001") {
        l.ocsp.push(hextoutf8(o));
      }
      if (q === "2b06010505073002") {
        l.caissuer.push(hextoutf8(o));
      }
    }
    return l;
  };
  this.getExtCertificatePolicies = function() {
    var o = this.getExtInfo("certificatePolicies");
    if (o === void 0) {
      return o;
    }
    var l = b(this.hex, o.vidx);
    var u = [];
    var s = j(l, 0);
    for (var r = 0; r < s.length; r++) {
      var t = {};
      var n = j(l, s[r]);
      t.id = i(h2(l, n[0]));
      if (n.length === 2) {
        var m = j(l, n[1]);
        for (var q = 0; q < m.length; q++) {
          var p = f(l, m[q], [0], "06");
          if (p === "2b06010505070201") {
            t.cps = hextoutf8(f(l, m[q], [1]));
          } else {
            if (p === "2b06010505070202") {
              t.unotice = hextoutf8(f(l, m[q], [1, 0]));
            }
          }
        }
      }
      u.push(t);
    }
    return u;
  };
  this.readCertPEM = function(l) {
    this.readCertHex(e(l));
  };
  this.readCertHex = function(l) {
    this.hex = l;
    this.getVersion();
    try {
      g(this.hex, 0, [0, 7], "a3");
      this.parseExt();
    } catch (m) {
    }
  };
  this.getInfo = function() {
    var B, u, z;
    B = "Basic Fields\n";
    B += "  serial number: " + this.getSerialNumberHex() + "\n";
    B += "  signature algorithm: " + this.getSignatureAlgorithmField() + "\n";
    B += "  issuer: " + this.getIssuerString() + "\n";
    B += "  notBefore: " + this.getNotBefore() + "\n";
    B += "  notAfter: " + this.getNotAfter() + "\n";
    B += "  subject: " + this.getSubjectString() + "\n";
    B += "  subject public key info: \n";
    u = this.getPublicKey();
    B += "    key algorithm: " + u.type + "\n";
    if (u.type === "RSA") {
      B += "    n=" + hextoposhex(u.n.toString(16)).substr(0, 16) + "...\n";
      B += "    e=" + hextoposhex(u.e.toString(16)) + "\n";
    }
    z = this.aExtInfo;
    if (z !== void 0 && z !== null) {
      B += "X509v3 Extensions:\n";
      for (var r = 0; r < z.length; r++) {
        var n = z[r];
        var A = KJUR.asn1.x509.OID.oid2name(n.oid);
        if (A === "") {
          A = n.oid;
        }
        var x = "";
        if (n.critical === true) {
          x = "CRITICAL";
        }
        B += "  " + A + " " + x + ":\n";
        if (A === "basicConstraints") {
          var v = this.getExtBasicConstraints();
          if (v.cA === void 0) {
            B += "    {}\n";
          } else {
            B += "    cA=true";
            if (v.pathLen !== void 0) {
              B += ", pathLen=" + v.pathLen;
            }
            B += "\n";
          }
        } else {
          if (A === "keyUsage") {
            B += "    " + this.getExtKeyUsageString() + "\n";
          } else {
            if (A === "subjectKeyIdentifier") {
              B += "    " + this.getExtSubjectKeyIdentifier() + "\n";
            } else {
              if (A === "authorityKeyIdentifier") {
                var l = this.getExtAuthorityKeyIdentifier();
                if (l.kid !== void 0) {
                  B += "    kid=" + l.kid + "\n";
                }
              } else {
                if (A === "extKeyUsage") {
                  var w = this.getExtExtKeyUsageName();
                  B += "    " + w.join(", ") + "\n";
                } else {
                  if (A === "subjectAltName") {
                    var t = this.getExtSubjectAltName2();
                    B += "    " + t + "\n";
                  } else {
                    if (A === "cRLDistributionPoints") {
                      var y = this.getExtCRLDistributionPointsURI();
                      B += "    " + y + "\n";
                    } else {
                      if (A === "authorityInfoAccess") {
                        var p = this.getExtAIAInfo();
                        if (p.ocsp !== void 0) {
                          B += "    ocsp: " + p.ocsp.join(",") + "\n";
                        }
                        if (p.caissuer !== void 0) {
                          B += "    caissuer: " + p.caissuer.join(",") + "\n";
                        }
                      } else {
                        if (A === "certificatePolicies") {
                          var o = this.getExtCertificatePolicies();
                          for (var q = 0; q < o.length; q++) {
                            if (o[q].id !== void 0) {
                              B += "    policy oid: " + o[q].id + "\n";
                            }
                            if (o[q].cps !== void 0) {
                              B += "    cps: " + o[q].cps + "\n";
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    B += "signature algorithm: " + this.getSignatureAlgorithmName() + "\n";
    B += "signature: " + this.getSignatureValueHex().substr(0, 16) + "...\n";
    return B;
  };
}
X509.hex2dn = function(f, b) {
  if (b === void 0) {
    b = 0;
  }
  if (f.substr(b, 2) !== "30") {
    throw "malformed DN";
  }
  var c = new Array();
  var d = ASN1HEX.getChildIdx(f, b);
  for (var e = 0; e < d.length; e++) {
    c.push(X509.hex2rdn(f, d[e]));
  }
  c = c.map(function(a) {
    return a.replace("/", "\\/");
  });
  return "/" + c.join("/");
};
X509.hex2rdn = function(f, b) {
  if (b === void 0) {
    b = 0;
  }
  if (f.substr(b, 2) !== "31") {
    throw "malformed RDN";
  }
  var c = new Array();
  var d = ASN1HEX.getChildIdx(f, b);
  for (var e = 0; e < d.length; e++) {
    c.push(X509.hex2attrTypeValue(f, d[e]));
  }
  c = c.map(function(a) {
    return a.replace("+", "\\+");
  });
  return c.join("+");
};
X509.hex2attrTypeValue = function(d, i) {
  var j = ASN1HEX;
  var h2 = j.getV;
  if (i === void 0) {
    i = 0;
  }
  if (d.substr(i, 2) !== "30") {
    throw "malformed attribute type and value";
  }
  var g = j.getChildIdx(d, i);
  if (g.length !== 2 || d.substr(g[0], 2) !== "06")
    ;
  var b = h2(d, g[0]);
  var f = KJUR.asn1.ASN1Util.oidHexToInt(b);
  var e = KJUR.asn1.x509.OID.oid2atype(f);
  var a = h2(d, g[1]);
  var c = hextorstr(a);
  return e + "=" + c;
};
X509.getPublicKeyFromCertHex = function(b) {
  var a = new X509();
  a.readCertHex(b);
  return a.getPublicKey();
};
X509.getPublicKeyFromCertPEM = function(b) {
  var a = new X509();
  a.readCertPEM(b);
  return a.getPublicKey();
};
X509.getPublicKeyInfoPropOfCertPEM = function(c) {
  var e = ASN1HEX;
  var g = e.getVbyList;
  var b = {};
  var a, f;
  b.algparam = null;
  a = new X509();
  a.readCertPEM(c);
  f = a.getPublicKeyHex();
  b.keyhex = g(f, 0, [1], "03").substr(2);
  b.algoid = g(f, 0, [0, 0], "06");
  if (b.algoid === "2a8648ce3d0201") {
    b.algparam = g(f, 0, [0, 1], "06");
  }
  return b;
};
X509.KEYUSAGE_NAME = ["digitalSignature", "nonRepudiation", "keyEncipherment", "dataEncipherment", "keyAgreement", "keyCertSign", "cRLSign", "encipherOnly", "decipherOnly"];
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {};
}
if (typeof KJUR.jws == "undefined" || !KJUR.jws) {
  KJUR.jws = {};
}
KJUR.jws.JWS = function() {
  var b = KJUR, a = b.jws.JWS, c = a.isSafeJSONString;
  this.parseJWS = function(g, j) {
    if (this.parsedJWS !== void 0 && (j || this.parsedJWS.sigvalH !== void 0)) {
      return;
    }
    var i = g.match(/^([^.]+)\.([^.]+)\.([^.]+)$/);
    if (i == null) {
      throw "JWS signature is not a form of 'Head.Payload.SigValue'.";
    }
    var k = i[1];
    var e = i[2];
    var l = i[3];
    var n = k + "." + e;
    this.parsedJWS = {};
    this.parsedJWS.headB64U = k;
    this.parsedJWS.payloadB64U = e;
    this.parsedJWS.sigvalB64U = l;
    this.parsedJWS.si = n;
    if (!j) {
      var h2 = b64utohex(l);
      var f = parseBigInt(h2, 16);
      this.parsedJWS.sigvalH = h2;
      this.parsedJWS.sigvalBI = f;
    }
    var d = b64utoutf8(k);
    var m = b64utoutf8(e);
    this.parsedJWS.headS = d;
    this.parsedJWS.payloadS = m;
    if (!c(d, this.parsedJWS, "headP")) {
      throw "malformed JSON string for JWS Head: " + d;
    }
  };
};
KJUR.jws.JWS.sign = function(i, v, y, z, a) {
  var w = KJUR, m = w.jws, q = m.JWS, g = q.readSafeJSONString, p = q.isSafeJSONString, d = w.crypto;
  d.ECDSA;
  var o = d.Mac, c = d.Signature, t = JSON;
  var s, j, n;
  if (typeof v != "string" && typeof v != "object") {
    throw "spHeader must be JSON string or object: " + v;
  }
  if (typeof v == "object") {
    j = v;
    s = t.stringify(j);
  }
  if (typeof v == "string") {
    s = v;
    if (!p(s)) {
      throw "JWS Head is not safe JSON string: " + s;
    }
    j = g(s);
  }
  n = y;
  if (typeof y == "object") {
    n = t.stringify(y);
  }
  if ((i == "" || i == null) && j.alg !== void 0) {
    i = j.alg;
  }
  if (i != "" && i != null && j.alg === void 0) {
    j.alg = i;
    s = t.stringify(j);
  }
  if (i !== j.alg) {
    throw "alg and sHeader.alg doesn't match: " + i + "!=" + j.alg;
  }
  var r = null;
  if (q.jwsalg2sigalg[i] === void 0) {
    throw "unsupported alg name: " + i;
  } else {
    r = q.jwsalg2sigalg[i];
  }
  var e = utf8tob64u(s);
  var l = utf8tob64u(n);
  var b = e + "." + l;
  var x = "";
  if (r.substr(0, 4) == "Hmac") {
    if (z === void 0) {
      throw "mac key shall be specified for HS* alg";
    }
    var h2 = new o({ alg: r, prov: "cryptojs", pass: z });
    h2.updateString(b);
    x = h2.doFinal();
  } else {
    if (r.indexOf("withECDSA") != -1) {
      var f = new c({ alg: r });
      f.init(z, a);
      f.updateString(b);
      hASN1Sig = f.sign();
      x = KJUR.crypto.ECDSA.asn1SigToConcatSig(hASN1Sig);
    } else {
      if (r != "none") {
        var f = new c({ alg: r });
        f.init(z, a);
        f.updateString(b);
        x = f.sign();
      }
    }
  }
  var u = hextob64u(x);
  return b + "." + u;
};
KJUR.jws.JWS.verify = function(w, B, n) {
  var x = KJUR, q = x.jws, t = q.JWS, i = t.readSafeJSONString, e = x.crypto, p = e.ECDSA, s = e.Mac, d = e.Signature, m;
  if (typeof RSAKey !== void 0) {
    m = RSAKey;
  }
  var y = w.split(".");
  var f = y[0];
  var r = y[1];
  var c = f + "." + r;
  var A = b64utohex(y[2]);
  var l = i(b64utoutf8(y[0]));
  var k = null;
  var z = null;
  if (l.alg === void 0) {
    throw "algorithm not specified in header";
  } else {
    k = l.alg;
    z = k.substr(0, 2);
  }
  if (n != null && Object.prototype.toString.call(n) === "[object Array]" && n.length > 0) {
    var b = ":" + n.join(":") + ":";
    if (b.indexOf(":" + k + ":") == -1) {
      throw "algorithm '" + k + "' not accepted in the list";
    }
  }
  if (k != "none" && B === null) {
    throw "key shall be specified to verify.";
  }
  if (typeof B == "string" && B.indexOf("-----BEGIN ") != -1) {
    B = KEYUTIL.getKey(B);
  }
  if (z == "RS" || z == "PS") {
    if (!(B instanceof m)) {
      throw "key shall be a RSAKey obj for RS* and PS* algs";
    }
  }
  if (z == "ES") {
    if (!(B instanceof p)) {
      throw "key shall be a ECDSA obj for ES* algs";
    }
  }
  var u = null;
  if (t.jwsalg2sigalg[l.alg] === void 0) {
    throw "unsupported alg name: " + k;
  } else {
    u = t.jwsalg2sigalg[k];
  }
  if (u == "none") {
    throw "not supported";
  } else {
    if (u.substr(0, 4) == "Hmac") {
      var o = null;
      if (B === void 0) {
        throw "hexadecimal key shall be specified for HMAC";
      }
      var j = new s({ alg: u, pass: B });
      j.updateString(c);
      o = j.doFinal();
      return A == o;
    } else {
      if (u.indexOf("withECDSA") != -1) {
        var h2 = null;
        try {
          h2 = p.concatSigToASN1Sig(A);
        } catch (v) {
          return false;
        }
        var g = new d({ alg: u });
        g.init(B);
        g.updateString(c);
        return g.verify(h2);
      } else {
        var g = new d({ alg: u });
        g.init(B);
        g.updateString(c);
        return g.verify(A);
      }
    }
  }
};
KJUR.jws.JWS.parse = function(g) {
  var c = g.split(".");
  var b = {};
  var f, e, d;
  if (c.length != 2 && c.length != 3) {
    throw "malformed sJWS: wrong number of '.' splitted elements";
  }
  f = c[0];
  e = c[1];
  if (c.length == 3) {
    d = c[2];
  }
  b.headerObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(f));
  b.payloadObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(e));
  b.headerPP = JSON.stringify(b.headerObj, null, "  ");
  if (b.payloadObj == null) {
    b.payloadPP = b64utoutf8(e);
  } else {
    b.payloadPP = JSON.stringify(b.payloadObj, null, "  ");
  }
  if (d !== void 0) {
    b.sigHex = b64utohex(d);
  }
  return b;
};
KJUR.jws.JWS.verifyJWT = function(e, l, r) {
  var d = KJUR, j = d.jws, o = j.JWS, n = o.readSafeJSONString, p = o.inArray, f = o.includedArray;
  var k = e.split(".");
  var c = k[0];
  var i = k[1];
  b64utohex(k[2]);
  var h2 = n(b64utoutf8(c));
  var g = n(b64utoutf8(i));
  if (h2.alg === void 0) {
    return false;
  }
  if (r.alg === void 0) {
    throw "acceptField.alg shall be specified";
  }
  if (!p(h2.alg, r.alg)) {
    return false;
  }
  if (g.iss !== void 0 && typeof r.iss === "object") {
    if (!p(g.iss, r.iss)) {
      return false;
    }
  }
  if (g.sub !== void 0 && typeof r.sub === "object") {
    if (!p(g.sub, r.sub)) {
      return false;
    }
  }
  if (g.aud !== void 0 && typeof r.aud === "object") {
    if (typeof g.aud == "string") {
      if (!p(g.aud, r.aud)) {
        return false;
      }
    } else {
      if (typeof g.aud == "object") {
        if (!f(g.aud, r.aud)) {
          return false;
        }
      }
    }
  }
  var b = j.IntDate.getNow();
  if (r.verifyAt !== void 0 && typeof r.verifyAt === "number") {
    b = r.verifyAt;
  }
  if (r.gracePeriod === void 0 || typeof r.gracePeriod !== "number") {
    r.gracePeriod = 0;
  }
  if (g.exp !== void 0 && typeof g.exp == "number") {
    if (g.exp + r.gracePeriod < b) {
      return false;
    }
  }
  if (g.nbf !== void 0 && typeof g.nbf == "number") {
    if (b < g.nbf - r.gracePeriod) {
      return false;
    }
  }
  if (g.iat !== void 0 && typeof g.iat == "number") {
    if (b < g.iat - r.gracePeriod) {
      return false;
    }
  }
  if (g.jti !== void 0 && r.jti !== void 0) {
    if (g.jti !== r.jti) {
      return false;
    }
  }
  if (!o.verify(e, l, r.alg)) {
    return false;
  }
  return true;
};
KJUR.jws.JWS.includedArray = function(b, a) {
  var c = KJUR.jws.JWS.inArray;
  if (b === null) {
    return false;
  }
  if (typeof b !== "object") {
    return false;
  }
  if (typeof b.length !== "number") {
    return false;
  }
  for (var d = 0; d < b.length; d++) {
    if (!c(b[d], a)) {
      return false;
    }
  }
  return true;
};
KJUR.jws.JWS.inArray = function(d, b) {
  if (b === null) {
    return false;
  }
  if (typeof b !== "object") {
    return false;
  }
  if (typeof b.length !== "number") {
    return false;
  }
  for (var c = 0; c < b.length; c++) {
    if (b[c] == d) {
      return true;
    }
  }
  return false;
};
KJUR.jws.JWS.jwsalg2sigalg = { HS256: "HmacSHA256", HS384: "HmacSHA384", HS512: "HmacSHA512", RS256: "SHA256withRSA", RS384: "SHA384withRSA", RS512: "SHA512withRSA", ES256: "SHA256withECDSA", ES384: "SHA384withECDSA", PS256: "SHA256withRSAandMGF1", PS384: "SHA384withRSAandMGF1", PS512: "SHA512withRSAandMGF1", none: "none" };
KJUR.jws.JWS.isSafeJSONString = function(c, b, d) {
  var e = null;
  try {
    e = jsonParse(c);
    if (typeof e != "object") {
      return 0;
    }
    if (e.constructor === Array) {
      return 0;
    }
    if (b) {
      b[d] = e;
    }
    return 1;
  } catch (a) {
    return 0;
  }
};
KJUR.jws.JWS.readSafeJSONString = function(b) {
  var c = null;
  try {
    c = jsonParse(b);
    if (typeof c != "object") {
      return null;
    }
    if (c.constructor === Array) {
      return null;
    }
    return c;
  } catch (a) {
    return null;
  }
};
KJUR.jws.JWS.getEncodedSignatureValueFromJWS = function(b) {
  var a = b.match(/^[^.]+\.[^.]+\.([^.]+)$/);
  if (a == null) {
    throw "JWS signature is not a form of 'Head.Payload.SigValue'.";
  }
  return a[1];
};
KJUR.jws.JWS.getJWKthumbprint = function(d) {
  if (d.kty !== "RSA" && d.kty !== "EC" && d.kty !== "oct") {
    throw "unsupported algorithm for JWK Thumprint";
  }
  var a = "{";
  if (d.kty === "RSA") {
    if (typeof d.n != "string" || typeof d.e != "string") {
      throw "wrong n and e value for RSA key";
    }
    a += '"e":"' + d.e + '",';
    a += '"kty":"' + d.kty + '",';
    a += '"n":"' + d.n + '"}';
  } else {
    if (d.kty === "EC") {
      if (typeof d.crv != "string" || typeof d.x != "string" || typeof d.y != "string") {
        throw "wrong crv, x and y value for EC key";
      }
      a += '"crv":"' + d.crv + '",';
      a += '"kty":"' + d.kty + '",';
      a += '"x":"' + d.x + '",';
      a += '"y":"' + d.y + '"}';
    } else {
      if (d.kty === "oct") {
        if (typeof d.k != "string") {
          throw "wrong k value for oct(symmetric) key";
        }
        a += '"kty":"' + d.kty + '",';
        a += '"k":"' + d.k + '"}';
      }
    }
  }
  var b = rstrtohex(a);
  var c = KJUR.crypto.Util.hashHex(b, "sha256");
  var e = hextob64u(c);
  return e;
};
KJUR.jws.IntDate = {};
KJUR.jws.IntDate.get = function(c) {
  var b = KJUR.jws.IntDate, d = b.getNow, a = b.getZulu;
  if (c == "now") {
    return d();
  } else {
    if (c == "now + 1hour") {
      return d() + 60 * 60;
    } else {
      if (c == "now + 1day") {
        return d() + 60 * 60 * 24;
      } else {
        if (c == "now + 1month") {
          return d() + 60 * 60 * 24 * 30;
        } else {
          if (c == "now + 1year") {
            return d() + 60 * 60 * 24 * 365;
          } else {
            if (c.match(/Z$/)) {
              return a(c);
            } else {
              if (c.match(/^[0-9]+$/)) {
                return parseInt(c);
              }
            }
          }
        }
      }
    }
  }
  throw "unsupported format: " + c;
};
KJUR.jws.IntDate.getZulu = function(a) {
  return zulutosec(a);
};
KJUR.jws.IntDate.getNow = function() {
  var a = ~~(new Date() / 1e3);
  return a;
};
KJUR.jws.IntDate.intDate2UTCString = function(a) {
  var b = new Date(a * 1e3);
  return b.toUTCString();
};
KJUR.jws.IntDate.intDate2Zulu = function(e) {
  var i = new Date(e * 1e3), h2 = ("0000" + i.getUTCFullYear()).slice(-4), g = ("00" + (i.getUTCMonth() + 1)).slice(-2), b = ("00" + i.getUTCDate()).slice(-2), a = ("00" + i.getUTCHours()).slice(-2), c = ("00" + i.getUTCMinutes()).slice(-2), f = ("00" + i.getUTCSeconds()).slice(-2);
  return h2 + g + b + a + c + f + "Z";
};
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {};
}
if (typeof KJUR.jws == "undefined" || !KJUR.jws) {
  KJUR.jws = {};
}
KJUR.jws.JWSJS = function() {
  var c = KJUR, b = c.jws, a = b.JWS, d = a.readSafeJSONString;
  this.aHeader = [];
  this.sPayload = "";
  this.aSignature = [];
  this.init = function() {
    this.aHeader = [];
    this.sPayload = void 0;
    this.aSignature = [];
  };
  this.initWithJWS = function(f) {
    this.init();
    var e = f.split(".");
    if (e.length != 3) {
      throw "malformed input JWS";
    }
    this.aHeader.push(e[0]);
    this.sPayload = e[1];
    this.aSignature.push(e[2]);
  };
  this.addSignature = function(e, h2, m, k) {
    if (this.sPayload === void 0 || this.sPayload === null) {
      throw "there's no JSON-JS signature to add.";
    }
    var l = this.aHeader.length;
    if (this.aHeader.length != this.aSignature.length) {
      throw "aHeader.length != aSignature.length";
    }
    try {
      var f = KJUR.jws.JWS.sign(e, h2, this.sPayload, m, k);
      var j = f.split(".");
      var n = j[0];
      var g = j[2];
      this.aHeader.push(j[0]);
      this.aSignature.push(j[2]);
    } catch (i) {
      if (this.aHeader.length > l) {
        this.aHeader.pop();
      }
      if (this.aSignature.length > l) {
        this.aSignature.pop();
      }
      throw "addSignature failed: " + i;
    }
  };
  this.verifyAll = function(h2) {
    if (this.aHeader.length !== h2.length || this.aSignature.length !== h2.length) {
      return false;
    }
    for (var g = 0; g < h2.length; g++) {
      var f = h2[g];
      if (f.length !== 2) {
        return false;
      }
      var e = this.verifyNth(g, f[0], f[1]);
      if (e === false) {
        return false;
      }
    }
    return true;
  };
  this.verifyNth = function(f, j, g) {
    if (this.aHeader.length <= f || this.aSignature.length <= f) {
      return false;
    }
    var h2 = this.aHeader[f];
    var k = this.aSignature[f];
    var l = h2 + "." + this.sPayload + "." + k;
    var e = false;
    try {
      e = a.verify(l, j, g);
    } catch (i) {
      return false;
    }
    return e;
  };
  this.readJWSJS = function(g) {
    if (typeof g === "string") {
      var f = d(g);
      if (f == null) {
        throw "argument is not safe JSON object string";
      }
      this.aHeader = f.headers;
      this.sPayload = f.payload;
      this.aSignature = f.signatures;
    } else {
      try {
        if (g.headers.length > 0) {
          this.aHeader = g.headers;
        } else {
          throw "malformed header";
        }
        if (typeof g.payload === "string") {
          this.sPayload = g.payload;
        } else {
          throw "malformed signatures";
        }
        if (g.signatures.length > 0) {
          this.signatures = g.signatures;
        } else {
          throw "malformed signatures";
        }
      } catch (e) {
        throw "malformed JWS-JS JSON object: " + e;
      }
    }
  };
  this.getJSON = function() {
    return { headers: this.aHeader, payload: this.sPayload, signatures: this.aSignature };
  };
  this.isEmpty = function() {
    if (this.aHeader.length == 0) {
      return 1;
    }
    return 0;
  };
};
KJUR.crypto.ECDSA;
KJUR.crypto.DSA;
KJUR.crypto.Signature;
KJUR.crypto.MessageDigest;
KJUR.crypto.Mac;
KJUR.crypto.Cipher;
var KEYUTIL_1 = KEYUTIL;
var stob64_1 = stob64;
var hextorstr_1 = hextorstr;
var KJUR_1 = KJUR;
const notif = useNotyf();
const userSession = useUserSession();
userSession.printerName;
const startConnection = () => {
  qz.websocket.connect().then(function() {
    findVersion();
    findDefaultPrinter(true);
    notif.success("Conexi\xF3n exitosa con Qz tray");
  }).catch(handleConnectionError);
};
const findVersion = () => {
  qz.api.getVersion().then(function(data) {
  }).catch(displayError);
};
const displayError = (err) => {
  displayMessage(err);
};
const findDefaultPrinter = (set) => {
  qz.printers.getDefault().then(function(data) {
    if (set) {
      setPrinter(data);
    }
  }).catch(displayError);
};
const handleConnectionError = (err) => {
  if (err.target != void 0) {
    if (err.target.readyState >= 2) {
      displayError("Connection to QZ Tray was closed");
    } else {
      displayError("A connection error occurred, check log for details");
      console.error(err);
    }
  } else {
    displayError(err);
  }
};
const displayMessage = (msg, css) => {
  console.log(msg);
};
const setPrinter = (printer) => {
  let cf = getUpdatedConfig();
  cf.setPrinter(printer);
  if (typeof printer === "object" && printer.name == void 0) {
    let shown;
    if (printer.file != void 0) {
      shown = "<em>FILE:</em> " + printer.file;
    }
    if (printer.host != void 0) {
      shown = "<em>HOST:</em> " + printer.host + ":" + printer.port;
    }
    console.log(shown);
  } else {
    if (printer.name != void 0) {
      printer = printer.name;
    }
    if (printer == void 0) {
      printer = "NONE";
    }
    console.log(printer);
  }
};
let cfg = null;
const getUpdatedConfig = () => {
  cfg = qz.configs.create(userSession.printerName);
  setConfigW80();
  return cfg;
};
const setConfigW80 = () => {
  updateConfig(80, 100, 0, 0, 0, 0, 1, "Default", 0, "mm");
};
const updateConfig = (pxlW, pxlH, top, right, bottom, left, copies, orientation, rotation, units) => {
  let pxlSize = null;
  if (pxlH > 0) {
    pxlSize = {
      width: pxlW
    };
  }
  let pxlMargins = 0;
  if (top > 0) {
    pxlMargins = {
      top,
      right,
      bottom,
      left
    };
  }
  let jobName = null;
  cfg.reconfigure({
    altPrinting: 0,
    encoding: "",
    endOfDoc: "",
    perSpool: 1,
    colorType: "Color",
    copies,
    density: 0,
    duplex: 0,
    interpolation: "Default",
    jobName,
    margins: pxlMargins,
    orientation,
    paperThickness: "",
    printerTray: "",
    rasterize: 1,
    rotation,
    scaleContent: 1,
    size: pxlSize,
    units
  });
};
let digitalKey = "-----BEGIN CERTIFICATE-----\nMIID9DCCAtygAwIBAgIJAPdXYKD3oGt9MA0GCSqGSIb3DQEBCwUAMIGOMQswCQYD\nVQQGEwJQRTEQMA4GA1UECAwHVUNBWUFMSTERMA8GA1UEBwwIUFVDQUxMUEExDDAK\nBgNVBAoMA1RFTDEMMAoGA1UECwwDVEVMMRowGAYDVQQDDBF0b2RvLWVuLWxpbmVh\nLmNvbTEiMCAGCSqGSIb3DQEJARYTdGhlbmV3Nzc3QGdtYWlsLmNvbTAeFw0xODAy\nMTMwNDEyMzFaFw00OTA4MDgwNDEyMzFaMIGOMQswCQYDVQQGEwJQRTEQMA4GA1UE\nCAwHVUNBWUFMSTERMA8GA1UEBwwIUFVDQUxMUEExDDAKBgNVBAoMA1RFTDEMMAoG\nA1UECwwDVEVMMRowGAYDVQQDDBF0b2RvLWVuLWxpbmVhLmNvbTEiMCAGCSqGSIb3\nDQEJARYTdGhlbmV3Nzc3QGdtYWlsLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP\nADCCAQoCggEBAMJnB2YAxNj2pHo0a17Epaz+N9tnJ9zRTctxiqjb2N7LHNEIPTpv\n4wmRNfybhJEKy0vaq+544eJm9eglJWlEg0Iq5OQrNwxaL2yKOIEi7NyXabWi8CFf\nl3rUMh+EGu8hwunma8rlhH7KDJ5VZ4NGpnaPaQ5wEnswt3H3JeXAyRQNrbHe7HJB\n+YfG/VFthLFNEhh35NDy8c7p0WN/pVp5BRspJOV9R8jrTXbBSC8s1R8Em4nruQhP\n7COcdnAiQvDOIse3H78KhfMPPjGFGEIOoj1LnLjenw0BxjDQxUVrVbNGUx2Z0fvv\nY9Y7y4L2CeY8mFtWaXTtEbnKQBSnGtbCRXECAwEAAaNTMFEwHQYDVR0OBBYEFBJ5\nwYUHD4TavETKkrJoypy2XhBRMB8GA1UdIwQYMBaAFBJ5wYUHD4TavETKkrJoypy2\nXhBRMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAE1q2eq1BdT8\njReUZpkOqAvkA1bxOQH2eTiFBYlFPk4ktylqXwcawsdNTlFdHvPTTcbqreDcIut9\nPPqZZ3VzbdRC9mGWxC7NZOTK7DW9AoV3e6LweMdYqHPdZHg+ayxCqsmSX6AOTn0k\nVW7g5/Av48PEX+UouPUFhujpOBNrKsU9DH9JrU8jbIAtbaofnD4zbYERi8Dyc88p\n5E8KclUBOdega3CEI/VgHwc5iw8TvVXu6WO3B5WhkGBKNVc1mpwndM8GDBf0YwsB\nSbMOGwAbAlyaS1F5X3+qlaDpQdH7XhisLxfCHs52Nz9dLG+sNAhacIDzBZlDB/sU\noW/Zf3zj9Ag=\n-----END CERTIFICATE-----\n";
qz.security.setCertificatePromise(function(resolve, reject) {
  provideApi().get("certificates-qztray/digital").then((response) => {
    let digitalResponse = response.data;
    if (digitalResponse === "") {
      resolve(digitalKey);
    } else {
      resolve(response.data);
    }
  }).catch((error) => resolve(digitalKey));
});
let privateKey = "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDCZwdmAMTY9qR6\nNGtexKWs/jfbZyfc0U3LcYqo29jeyxzRCD06b+MJkTX8m4SRCstL2qvueOHiZvXo\nJSVpRINCKuTkKzcMWi9sijiBIuzcl2m1ovAhX5d61DIfhBrvIcLp5mvK5YR+ygye\nVWeDRqZ2j2kOcBJ7MLdx9yXlwMkUDa2x3uxyQfmHxv1RbYSxTRIYd+TQ8vHO6dFj\nf6VaeQUbKSTlfUfI6012wUgvLNUfBJuJ67kIT+wjnHZwIkLwziLHtx+/CoXzDz4x\nhRhCDqI9S5y43p8NAcYw0MVFa1WzRlMdmdH772PWO8uC9gnmPJhbVml07RG5ykAU\npxrWwkVxAgMBAAECggEAXU+YxIQ/+ChDAIlitCVNpMCNTRmxj5NDdRB1zuFfsmjp\n1wfOY9tKrc/uiuaW9gupUyqN9jQ9sC9df2U9FM8W9c6i+UYo8RvkwYOC5bE+4g8n\nZVDlVA+PJRzvRiNhzkB1T1ITkVsjgrw23FUAD4n84tGpSo3OwSS8GM7ZePNVUPL9\nPqxqKIyiVp4enWUis6wn0bm4DAUu7oNqcMrjaToHhlUi0UMYqgFwOHQ3MPU0wdhy\n+ncyN4MhIeX1LlirlmVP8AvYKwKKgfRb84y1jPTHfO+dNhMEUN5r9QfNAkwuazJv\ncmlYdNsxjuW6fgsTZm3d0qASZiV+H01AJQo1oXuyAQKBgQDt7lGpk/O9H0Bt4S7K\nap7psYmMez9G6BVXuxaknNHY9XsKvwR/ZeIuvCcuyZ3lUqgdgEInbGNCmpVUTTS3\ntgfKD25ZTofGxOI+koBx+0EFciARKc+xaNqXaUnJ1nugA2jhWLvwVrmv5FF2VhhW\nOVljX7BqI+f1eov+6kHu3qxR0QKBgQDRKnX0f7Oz35tLVa8v6e5+W4qdVOcE88Ad\nNRlODUGaWa1YFgiXc6Dcb9eFMUaoD4HMfVoirEd6ZjIzEb/l2MKqWaPYyLB4dNDF\nML3a/V7XXaWVMmVom9aLNUu8jKvhikKUUxkN+M6fWMMi8M92+B0oAcLQajVPYV8O\nOhc4OkEBoQKBgGwM6GT8XZorURUVSCyAUv6Js49qgQfwaZDX06aZ2OqQQHpW2PIK\nELdslta2lNAJw3LyRhilLkaW8O3BygkLz2nBrDk+Yoav7pa/7TjWA2c3trxUoo9M\nsMhF9k6E6st2APElXOP+XoE0TJJS8uZlUOTCFdl9yN8/8ceoFp0l3lehAoGAchhs\nUVubheHSjyyFLGi53JlIqnvWrL/dqtD9JbNbdru2L9eNBjhfpf8oHBJ+DUywLACw\nuzsonl7CwVLMT6+GuG+/TZBjmsF15CqrVZpiMq51lUXxRTfEtxjyYD6Hv7awjMIr\nZ5Cx/P/pKdUcBjRfiyQyxYc53zwpItSTN+um7CECgYANQJI4KOua/F48IDk+32Fg\nURLSnZjRDh+LBWWj8EivEum4Q/J1kLHljnG77BQO9gUdXe6tqdfWrAAxABqAvHdD\nGLQvKqg0GDz5IVyR32wX7dY35guqzEcorKyNHHwPrcheKTv3IR/Fp/tQjUpXGaR/\n0bOVUb468IFv2kDlkY3DOA==\n-----END PRIVATE KEY-----\n";
qz.security.setSignaturePromise(function(toSign) {
  return function(resolve, reject) {
    provideApi().get("certificates-qztray/private").then((response) => {
      let key2;
      let privateResponse = response.data;
      if (privateResponse === "") {
        key2 = privateKey;
      } else {
        key2 = privateResponse;
      }
      try {
        let pk = KEYUTIL_1.getKey(key2);
        let sig2 = new KJUR_1.crypto.Signature({ alg: "SHA1withRSA" });
        sig2.init(pk);
        sig2.updateString(toSign);
        let hex = sig2.sign();
        resolve(stob64_1(hextorstr_1(hex)));
      } catch (err) {
        reject(err);
      }
    }).catch((error) => resolve(privateKey));
  };
});
const _sfc_main = defineComponent({
  props: {
    icon: {
      type: String,
      required: true
    },
    to: {
      type: Object,
      default: void 0
    },
    href: {
      type: String,
      default: void 0
    },
    color: {
      type: String,
      default: void 0,
      validator: (value) => {
        if ([
          void 0,
          "primary",
          "info",
          "success",
          "warning",
          "danger",
          "white"
        ].indexOf(value) === -1) {
          console.warn(`VIconButton: invalid "${value}" color. Should be primary, info, success, warning, danger, white or undefined`);
          return false;
        }
        return true;
      }
    },
    dark: {
      type: String,
      default: void 0,
      validator: (value) => {
        if (!value)
          return true;
        if (["1", "2", "3", "4", "5", "6"].indexOf(value) === -1) {
          console.warn(`VIconButton: invalid "${value}" dark. Should be 1, 2, 3, 4, 5, 6 or undefined`);
          return false;
        }
        return true;
      }
    },
    circle: {
      type: Boolean,
      default: false
    },
    bold: {
      type: Boolean,
      default: false
    },
    light: {
      type: Boolean,
      default: false
    },
    raised: {
      type: Boolean,
      default: false
    },
    elevated: {
      type: Boolean,
      default: false
    },
    outlined: {
      type: Boolean,
      default: false
    },
    darkOutlined: {
      type: Boolean,
      default: false
    },
    loading: {
      type: Boolean,
      default: false
    },
    disabled: {
      type: Boolean,
      default: false
    }
  },
  setup(props, { attrs }) {
    const classes = computed(() => {
      const defaultClasses = (attrs == null ? void 0 : attrs.class) || [];
      return [
        ...defaultClasses,
        props.disabled && "is-disabled",
        props.circle && "is-circle",
        props.bold && "is-bold",
        props.outlined && "is-outlined",
        props.raised && "is-raised",
        props.dark && `is-dark-bg-${props.dark}`,
        props.darkOutlined && "is-dark-outlined",
        props.elevated && "is-elevated",
        props.loading && "is-loading",
        props.color && `is-${props.color}`,
        props.light && "is-light"
      ];
    });
    const isIconify = computed(() => props.icon && props.icon.indexOf(":") !== -1);
    return () => {
      let icon;
      if (isIconify.value) {
        icon = h("i", {
          "aria-hidden": true,
          class: "iconify",
          "data-icon": props.icon
        });
      } else {
        icon = h("i", { "aria-hidden": true, class: props.icon });
      }
      const iconWrapper = h("span", { class: "icon" }, icon);
      if (props.to) {
        return h(resolveComponent("RouterLink"), __spreadProps(__spreadValues({}, attrs), {
          to: props.to,
          class: ["button", ...classes.value]
        }), iconWrapper);
      } else if (props.href) {
        return h("a", __spreadProps(__spreadValues({}, attrs), {
          href: props.href,
          class: classes.value
        }), iconWrapper);
      }
      return h("button", __spreadProps(__spreadValues({
        type: "button"
      }, attrs), {
        disabled: props.disabled,
        class: ["button", ...classes.value]
      }), iconWrapper);
    };
  }
});
export { _sfc_main$1 as _, _sfc_main as a, displayError as d, getUpdatedConfig as g, qz as q, startConnection as s };
