// lib/canvas_editor/clipboard_handler.js
var ClipboardHandler = class {
  copyMolecule(molecule) {
    const data = molecule.getIDCodeAndCoordinates();
    navigator.clipboard.writeText(`${data.idCode} ${data.coordinates}`);
  }
  pasteMolecule() {
    return null;
  }
};

// lib/canvas_editor/utils.js
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var lookup = new Uint8Array(256);
for (let i = 0; i < chars.length; i++) {
  lookup[chars.charCodeAt(i)] = i;
}
function decodeBase64(base64) {
  let bufferLength = base64.length * 0.75;
  let len = base64.length;
  let i;
  let p = 0;
  let encoded1;
  let encoded2;
  let encoded3;
  let encoded4;
  if (base64.at(-1) === "=") {
    bufferLength--;
    if (base64.at(-2) === "=") {
      bufferLength--;
    }
  }
  const arraybuffer = new ArrayBuffer(bufferLength);
  const bytes = new Uint8Array(arraybuffer);
  for (i = 0; i < len; i += 4) {
    encoded1 = lookup[base64.charCodeAt(i)];
    encoded2 = lookup[base64.charCodeAt(i + 1)];
    encoded3 = lookup[base64.charCodeAt(i + 2)];
    encoded4 = lookup[base64.charCodeAt(i + 3)];
    bytes[p++] = encoded1 << 2 | encoded2 >> 4;
    bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;
    bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;
  }
  return arraybuffer;
}
function toHex(v) {
  return v.toString(16).padStart(2, "0");
}
var hidpiScaleFactor = globalThis.devicePixelRatio || 1;

// lib/canvas_editor/draw_context.js
var DrawContext = class {
  /**
   *
   * @param {CanvasRenderingContext2D} ctx
   */
  constructor(ctx2) {
    this.ctx = ctx2;
    this.ctx.textAlign = "left";
    this.ctx.textBaseline = "top";
    this.currentFontSize = 12;
    this.currentFont = "12px sans-serif";
    this.ctx.font = this.currentFont;
    this.currentColor = "#000000";
    this.currentLineWidth = 1;
    this.canvasCache = /* @__PURE__ */ new Map();
  }
  clearRect(x, y, w, h) {
    this.ctx.clearRect(x, y, w, h);
  }
  getBackgroundRGB() {
    return 16777215;
  }
  getForegroundRGB() {
    return 0;
  }
  getSelectionBackgroundRGB() {
    return 12310268;
  }
  getLineWidth() {
    return this.currentLineWidth;
  }
  setRGB(rgb) {
    const r = rgb >>> 16 & 255;
    const g = rgb >>> 8 & 255;
    const b = rgb >>> 0 & 255;
    this.currentColor = `#${toHex(r)}${toHex(g)}${toHex(b)}`;
    this.ctx.fillStyle = this.currentColor;
    this.ctx.strokeStyle = this.currentColor;
  }
  setFont(size, isBold, isItalic) {
    this.currentFontSize = size;
    this.currentFont = `${isBold ? "bold" : ""} ${isItalic ? "italic" : ""} ${size}px sans-serif`;
    this.ctx.font = this.currentFont;
  }
  getFontSize() {
    return this.currentFontSize;
  }
  getBounds(s) {
    const metrics = this.ctx.measureText(s);
    return {
      x: metrics.actualBoundingBoxLeft,
      y: metrics.actualBoundingBoxAscent,
      width: metrics.actualBoundingBoxRight,
      height: metrics.actualBoundingBoxAscent
    };
  }
  drawString(x, y, s) {
    this.ctx.fillText(s, x, y);
  }
  drawCenteredString(x, y, s) {
    this.ctx.textAlign = "center";
    this.ctx.textBaseline = "middle";
    this.ctx.fillText(s, x, y);
    this.ctx.textAlign = "left";
    this.ctx.textBaseline = "top";
  }
  setLineWidth(lineWidth) {
    this.currentLineWidth = lineWidth;
    this.ctx.lineWidth = lineWidth;
  }
  fillRectangle(x, y, w, h) {
    this.ctx.fillRect(x, y, w, h);
  }
  fillCircle(x, y, d) {
    const r = d / 2;
    this.ctx.beginPath();
    this.ctx.arc(x + r, y + r, r, 0, 2 * Math.PI);
    this.ctx.fill();
  }
  drawLine(x1, y1, x2, y2) {
    this.ctx.beginPath();
    this.ctx.moveTo(x1, y1);
    this.ctx.lineTo(x2, y2);
    this.ctx.stroke();
  }
  drawPolygon(p) {
    this.ctx.beginPath();
    this.ctx.moveTo(p.getX(0), p.getY(0));
    for (let i = 1; i < p.getSize(); i++) {
      this.ctx.lineTo(p.getX(i), p.getY(i));
    }
    this.ctx.stroke();
  }
  drawRectangle(x, y, w, h) {
    this.ctx.strokeRect(x, y, w, h);
  }
  fillPolygon(p) {
    this.ctx.beginPath();
    this.ctx.moveTo(p.getX(0), p.getY(0));
    for (let i = 1; i < p.getSize(); i++) {
      this.ctx.lineTo(p.getX(i), p.getY(i));
    }
    this.ctx.fill();
  }
  drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) {
    if (arguments.length !== 9) {
      throw new Error(
        `drawImage call with ${arguments.length} arguments unimplemented`
      );
    }
    let fullScaleCanvas = this.canvasCache.get(image);
    if (!fullScaleCanvas) {
      fullScaleCanvas = document.createElement("canvas");
      const imageData = image.imageData;
      fullScaleCanvas.width = imageData.width;
      fullScaleCanvas.height = imageData.height;
      const fullScaleContext = fullScaleCanvas.getContext("2d");
      fullScaleContext.globalAlpha = 0;
      fullScaleContext.putImageData(imageData, 0, 0);
      this.canvasCache.set(image, fullScaleCanvas);
    }
    this.ctx.drawImage(fullScaleCanvas, sx, sy, sw, sh, dx, dy, dw, dh);
  }
  isDarkBackground() {
    return false;
  }
};

// lib/canvas_editor/editor_area.js
var EditorArea = class {
  constructor(canvasElement, onChange) {
    this.canvasElement = canvasElement;
    this.changeListener = onChange;
    this.drawContext = new DrawContext(this.canvasElement.getContext("2d"));
  }
  getBackgroundRGB() {
    return 16777215;
  }
  getCanvasWidth() {
    return this.canvasElement.width;
  }
  getCanvasHeight() {
    return this.canvasElement.height;
  }
  getDrawContext() {
    return this.drawContext;
  }
  onChange(what, isUserEvent) {
    this.changeListener?.({ what, isUserEvent });
  }
  getClipboardHandler() {
    return new ClipboardHandler();
  }
};

// lib/canvas_editor/editor_stylesheet.js
var styles = `
/* We can customize editor styles here. */
`;
var stylesheet;
function getEditorStylesheet() {
  if (stylesheet) {
    return stylesheet;
  }
  const sheet = new CSSStyleSheet();
  sheet.replaceSync(styles);
  stylesheet = sheet;
  return sheet;
}

// lib/canvas_editor/events.js
function addPointerListeners(canvasElement, drawArea, JavaEditorArea) {
  let pointerDownId = -1;
  function fireMouseEvent(what, ev, clickCount = 0) {
    if (ev.button > 0) {
      return;
    }
    drawArea.fireMouseEvent(
      what,
      ev.button + 1,
      clickCount,
      Math.round(ev.offsetX * hidpiScaleFactor),
      Math.round(ev.offsetY * hidpiScaleFactor),
      ev.shiftKey,
      ev.ctrlKey,
      ev.altKey,
      ev.button === 2
    );
  }
  canvasElement.addEventListener("pointerdown", (ev) => {
    if (pointerDownId === -1) {
      pointerDownId = ev.pointerId;
      fireMouseEvent(JavaEditorArea.MOUSE_EVENT_PRESSED, ev);
    }
  });
  function handlePointerUp(ev) {
    if (pointerDownId === ev.pointerId) {
      pointerDownId = -1;
      fireMouseEvent(JavaEditorArea.MOUSE_EVENT_RELEASED, ev);
    }
  }
  document.addEventListener("pointerup", handlePointerUp);
  canvasElement.addEventListener("click", (ev) => {
    fireMouseEvent(JavaEditorArea.MOUSE_EVENT_CLICKED, ev, ev.detail);
  });
  canvasElement.addEventListener("pointerenter", (ev) => {
    fireMouseEvent(JavaEditorArea.MOUSE_EVENT_ENTERED, ev);
  });
  canvasElement.addEventListener("pointerleave", (ev) => {
    fireMouseEvent(JavaEditorArea.MOUSE_EVENT_EXITED, ev);
  });
  canvasElement.addEventListener("pointermove", (ev) => {
    if (pointerDownId !== -1) {
      if (pointerDownId === ev.pointerId) {
        fireMouseEvent(JavaEditorArea.MOUSE_EVENT_DRAGGED, ev);
      }
    } else {
      fireMouseEvent(JavaEditorArea.MOUSE_EVENT_MOVED, ev);
    }
  });
  return () => {
    document.removeEventListener("pointerup", handlePointerUp);
  };
}
function addKeyboardListeners(parentElement, canvasElement, editorArea, JavaEditorArea, Molecule2) {
  const isMac = typeof navigator !== "undefined" && navigator.platform === "MacIntel";
  const isMenuKey = (ev) => isMac && ev.metaKey || !isMac && ev.ctrlKey;
  function fireKeyEvent(what, ev) {
    const key = getKeyFromEvent(ev, JavaEditorArea);
    if (key === null) return;
    editorArea.fireKeyEvent(
      what,
      key,
      ev.altKey,
      ev.ctrlKey,
      ev.shiftKey,
      isMenuKey(ev)
    );
  }
  canvasElement.addEventListener("keydown", (ev) => {
    if (isMenuKey(ev) && ev.key === "c") return;
    if (isMenuKey(ev) && ev.key === "v") return;
    fireKeyEvent(JavaEditorArea.KEY_EVENT_PRESSED, ev);
  });
  canvasElement.addEventListener("keyup", (ev) => {
    fireKeyEvent(JavaEditorArea.KEY_EVENT_RELEASED, ev);
  });
  parentElement.addEventListener("paste", (ev) => {
    const textData = ev.clipboardData.getData("text");
    const molecule = Molecule2.fromText(textData);
    if (molecule && molecule.getAllAtoms() > 0) {
      editorArea.addPastedOrDropped(molecule);
    }
  });
  return () => {
  };
}
function getKeyFromEvent(ev, JavaEditorArea) {
  switch (ev.key) {
    case "Control":
      return JavaEditorArea.KEY_CTRL;
    case "Alt":
      return JavaEditorArea.KEY_ALT;
    case "Shift":
      return JavaEditorArea.KEY_SHIFT;
    case "Delete":
    case "Backspace":
      return JavaEditorArea.KEY_DELETE;
    // Backspace is currently unused by the Java code, so we remap it.
    // return JavaEditorArea.KEY_BACKSPACE;
    case "F1":
      return JavaEditorArea.KEY_HELP;
    case "Escape":
      return JavaEditorArea.KEY_ESCAPE;
    case "Enter":
      return JavaEditorArea.KEY_ENTER;
    default:
      if (ev.key.length === 1) {
        return ev.key.codePointAt(0);
      } else {
        return null;
      }
  }
}

// lib/canvas_editor/toolbar.js
var Toolbar = class {
  constructor(canvasElement) {
    this.canvasElement = canvasElement;
    this.drawContext = new DrawContext(this.canvasElement.getContext("2d"));
  }
  setDimensions(width, height) {
    this.canvasElement.width = width;
    this.canvasElement.style.width = `${width / hidpiScaleFactor}px`;
    this.canvasElement.height = height;
    this.canvasElement.style.height = `${height / hidpiScaleFactor}px`;
  }
  getDrawContext() {
    return this.drawContext;
  }
  getBackgroundRGB() {
    return 16777215;
  }
  getForegroundRGB() {
    return 0;
  }
};

// lib/canvas_editor/cursors_24px.js
var cursors = {
  "chain.png": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAAB2UlEQVR4XmNgGJmAkYGJgQULZGXAhCygIGICQg4GdjTIARRDh5xAEQwNKYzXeK4xY1Oez3SNfz8TmoYUxq+6m9bfqLjDI4tmfhzLff9VR17FoWhwZXpkOm2v1C+79+cbD4gga8lneuhrfdv6/+ItSBpSGB+bTDos9IfzP9N/k3cX6+7wwByWz/TWR/E1w/+kO+8j4BpSGL9rz9wh+Efs14TF3heY/tu/vlF2hxtkSxzLY2/FVyz/om69jT0G8kM6QyNDM9MT41nbZX9y/J/ct1/4iU7aIYb/9q8uVx0UbmF64mV7i/1/0s0HSVM5dRgYrjB84/8U+bh80iH+34z/17Xc51ZhUGX8qpkK1GL6+krltyClVyz/c+69C57CwQsK1v+Sl9rdvgr8Z/7P9WvKxNs8fsD44ABqeWLkdYHhv9sL8e+s/xJuv4k4yajEAI6H/+6llxn+g6DUh75gSXhgugEdmXIUJB5150HSFA59oHKIBteGSyBhpv+q9wsVQaZDICdDKuNnneRjCY9exU3l5AUrh2gQelAQ/8Tgve2Tb25NjIgYBkmnMl5Sumi+hQmiGKqhgaGB57Pts4Bfek0sjkjmIxQhs8BpiZFBh0EPCLGlTnQxcGod8gAAp9es6fCW8G8AAAAASUVORK5CYII=)",
  "eraser.png": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAAC1UlEQVR4XnWU309SYRjHn8OYTTM3zTmjC8NFFBR10dJu27wx11VX/QNdeGebTsvua93mRbUmLhURzYgKRZRJUJLibLPpRDCZC3/b1AMc4Tw97+EAR2e8FzD4fr7v53nPOQDCDkT/s2KAKiwROOXvFP8JLnDDGHhgArzgg28wCQGYgiDMw6E+1pY2rsECLEIIIrAC1O2CV/AWzPAOLGCFQbDDJ/hC+CQktU5bXWJoMGlaVv0iPAy/GeCmeBf0QB/YYECKO6kkzAl6Z/+t+BmsSJotgmmN4lFYZcA4tfdQez+1D8Fnio+S1oHe5TAcFuJHVBNit4nGLYrHGOCBbin+ntodMEzxKMkMWy8LpfgSEUN4niC7TTBtqzYYMCG3Z9xHadgD/bC1hi+U4uw1TkhFsqs3adpngJdGHSAZB8VHYAZ4vdt+RSjED3KcvYWYWMJuFY0E+MjdQe5MZgYE7YhFL8soCJzDU1iKwdcE+HOjBoG/NNJbq5DJI40EPNiIPCLgO/Wzk4lS3D2kPyaTQe5hETZsLDfxRRQLkLuLDjJd7u8wJs/mRs22J7CR4re3Qq3xIpENPUUHG+biuqX2UVsVX41epTp9ZjINm0ttqTIEZECQboK0ztd/Ya951t+nRi2GFYgksxluSlO7BMTYLVblMVcmOOTEZ9N+i4YvkREmAySz2JaNE4CqtM5jvrZHcbbE5lmLU8NrJTEmc3drsT1VlmmXdsCbgTdSu7wKUi2zPqsaq7GWZCjeJBZnwxlAN9dRyecBtsvzH/4+DV+MNdsLT4/GJSU0jHde3T2KtMxYnA8X5tvT5cp2eehDLnVxrPPoLgWpx4Hd+8Lp/Zx7boYoe/g40eDtViIF6Se+xPX8qPl96DqECImrRMOY2fg3e1atwd16UX1cR75wEXr4VmGdxL52atbpX2HnxfTenfiJcelKr9CjvQp/IMWJ57AO62ndOKk7890/iSWBU4XaZc0AAAAASUVORK5CYII=)",
  "fist.png": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAABj0lEQVR4Xu2S3yuDYRTHz7IZsfdCUrYLG4VCpJV6d0mS/A1zg79ArRArP4q5s4ulVousFCn/gX/g5WK7wkZMzIXMxjZ793XeMdn7vpM/wDn1PD1P53PO95znIfq3rwmYyU5tZPr7PJYoTjGaZ8xB1t+xZQqyP60iAEeWsThFGKpqbiE9CRECrnCHLnTAj17QbLV4E3mFXALbcOAGSXRiClnMgZLkZR/QYg0UEpDBDuxI4IHzT6OADdRiEK2gE12gBWmWE8Yj7weQIGOT650zaoiqAVtjDx2KeEWR8xZ4lUt+jEWkWJxJBYgkWa7NLy5WXWl5FilzhfoKwEAzzkwYI3DhTQUoVYpYR10FYCTPaDbJ2heQUwGfR0kFELmt6Utu9Jmz6dmFpmmR7v141w1XBiCBNFNacyKmCxT59kgHGBIQ4g7UkpRzESuwaCoQ+YZxqwGUGaUwrvvStqazLeRLj/bTZUTQB5rQfg1jjac9e8qAzFgZKbDMALpj1Kz3Z0WKjiGIfex++x6H98PgK4d/APiDpdwStyBoAAAAAElFTkSuQmCC)",
  "hand.png": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAAB50lEQVR4Xq2TwUsUcRzF3yy52TboHiKVLBCElb1479g5kgKPCkKs4ME6eAiiP0GELileStew6NLJq5Sihw6BG2VlECymB2PVXd10Zl7vN+OuOjNLl35fZhiY+fzee9/vb4D/tAow9fafu90BsqrvnXzNBwSTTBAZ2I3BkSbeYBMzLHNRn9/nEFHCvYZAutDHDfb5wDvanOVnoozBhkBzIUeHOQEHfO8DW0QV0xjC3VjoUh2onAC/ZPAme4giemMQo+BKoaeusCmdSa41MmYL8HxLgUKe27q/UKLzSSxcwUOMwk7VgTKX6sBz7oeA61hJHSUP8ST1raZQA7Z8hb0QkO1WE+d5lZdlx+UbTsjSR95i0bc0E7GUzfIHdziouRqFPzwU5ii4IzOP+SFiqe3i8jyP1A1bgKPyVGa5/M2S7iaDdWZ8KUwNe1Uus923FHx8ujwZPA9YGO48+CK/Ywp4un8N8SIZgG78fCTvFV1n9w+ePe6GFMzMJ7u4zuOInQDYYaKcDB3Ba63FGQWPLk8mt2MAWKv96kk0sKM2TBFfkQ4fvkx6fyHSH9NalwO0PkXPaktirt8rhRpqelblbV6IASzkmivP9NrEdE9AM/FXbCPG4v+6p+3VcZ2ql5zTZSqv+XcQ6+gKgL8a/RiIJPdySgAAAABJRU5ErkJggg==)",
  "handPlus.png": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAACAUlEQVR4Xq2Tz0sUcRjGn1lytW2wPUQamSAIK3vp7kk6i1LgMUGIFTqUBw9BiPsPhNAlpUtuKhpdOnVUKqlDh6CNsh+CsJQdjC13ddOZeXq+M7uTzu7SpXmZLwvzfr7P8/5Y4D89eZh48s/bhoC04nMXH/EmwThjRAp2c/B6C7vZwhRLXFP6NY4RRVxpCiTzw/zCYR94RpsP+Z4oYbQp0JbP0GFGwB6f+8A2UcF9jOFyQ+hkCJSrwDcZ7GcfUcDFBohRcKXQFyp8lc4s3zYzZgvwfEuBwgK/65xXRccrsXAGE7gBOxECJb4IgQfcjQAX8DJxEN/HVOJTTaEGbPsKvyJAuldNXOZZnpIdl485I0tveIkF31KuzlI6zU3ucFRzNQq/uS/MUeGOzNzm6zpLHa3ryzxQN2wBjsIT4JE6f7Co09RgHRlfAnPjXoXr7PQtmdSsNqn2eDJ4HLAw3rX3QX4nVaC534sA0bYCvdi6Je9lveb+mkLw2+PPiIKZ+WwPN3ioj9MyczQMsMNYKR5ZwfOnCzkVTq7KTpYDgrKCp5XuyGw9AOvViHoSmPhryaS7nCM+IhldvlRy92nYmaBLQWtdXqX1rn5X22OLI16xihhjBjA9q3CQJxoAFjJt5Xv6bBLdKmgmvsIOYrLxv+5uZ+WOtmqJi3pNLGj+54gN9ATAH0reBFwT+FQbAAAAAElFTkSuQmCC)",
  "invisible.png": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAACjUlEQVR4XnWTS09TURSF178wMUExvhIfiY+0Q6MThwwEHYk6MODAqHHgzD9gHDgWYhQBAUWMqY/SogSkCGJJNAiFUiyV2qqURkFa7cPvnJZiBXMH7Tl3rbXX2ntf5bWgyH+emPI8v8reAn8nj3r0Qr3qU78GNKghDWtEfk3ot2LKKq6AphTUjGYF26ObuqU7alabOvRQj/VEz6APKS23jvI/rY/6AD2ksCH0AG9Sq9r1QJ0W/hyREFbcOqQNcqiL/3FuIpozhJeot6J+H/VHegrci60lSA7t0VVtlRNqTvPAY4bQqxYL70LdxSsvd2l164B2qVHLVN4L0U2VhL4aQl9RveDdS9gl4IcBNWpRUShNUJxUT3OG0E/UTo4u4N0a1U9SHdRu3QOQIOw8N+0Yc/A2ZwgDeHfh3ZgZpbBH+zDTAPy7Jok6qU/K0Jht2k91CL5SVD9aHh1BvYHiCxYe1nV9w9h5bVcdk4DwGn3TmYg1Y9Rb8P2FQYVQbOM+qjPaDDwMguMw3j00Mst0narUDaUgBICPI5VgAhe5rUVguZBhhMaGOEzrrU6pQpfpdoqeB8k2hvoF7UB9mhxmsyD4WYIs0c/ifEKnoVxSEsptQke5rdQ5vGdRt4SYXTEf2lWq1l1s1GojlDiAgpmTLN4KHEKegw+NKvsco8oglApd0XtoOzEzhZmCuq2QJ7RRX3lqmO84xjaxGltUj/dVcJEwhuIqwVRptsZMZwL/wG2FPIHryijVVBnUNdJlS1ZKlmJEzkApr1JDj5KsyeJaQsR+fDlW8G/KCWyl1tgpziEIxczwVcnYcT6p5LpwO7gZ5jzH7mT0hmbW0+IO/UBixXX5L4RZlmpOn8u6vT7Y3P4BKLGmkBK1qvgAAAAASUVORK5CYII=)",
  "lasso.png": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAADg0lEQVR4Xk2UXWxTZRjHn7XYfWhh4DKlIFLRdlucImbGr2gEwYwsAjGRXXihRlTOFrOoF0RcdWwhEVnQdgOmbgzoliEhAZJlvZwdMQg6No/U2IYOWVrK1q1d19q1Pef8fU7bsy3/nIvznv/ved/n47xEZKDivNpK8RoE6XC4J9gX7A/2hXukwxCwta1UcxhUu4PcLFHnqZnaf+/E0FhTqDpiiaqqjjSFhsbvnZja76kRdarLQRzbTSjAuozgczaHVoJYhShX1krlSmH2bSWaQz5nRsA6MJQDrHMtx0Y3y4QS7Eo0eTpG3K5rP7tdHSNNnl2JNQxtlo+NzrXAmgXEDcnWA/5ihbAtOeyKtKf3wmIvs6+2l8GS3hv51u3aliQUKwf8yVZxA2GNIvSIBCNaJmPt/jrR6KZfyL6omQdQF2tvmTTyPt2iIhDq/f1mth/1LtjCVTa9QAIN8dEl8tK8mgJBj6oF21GvEWb4+wlft08Sds+FHbPmDl2A/mOl2Ran7SQylkV0MIcdu+cI7J3utUb0aL2q1DZSlDiRvObpKdpCZymVf1dqW6/qYY1QsM8SXYULw3jcq8XLWlSghOrJpYUwXxpeDUuUZn6smNWheUx6l7uxGD8HrKXz9A2doQidJnnPoWt6VEQItm4/4aX0LSd2wLCEqMB6+otmqYt8K1LVd3+oTRA6/yXUTXe+mCHsjE048QbWw8R6EHoNAMlGbA+d/PSOAZXKZC9tKbr19m+DFZztc/E/B2/3jp//x5logyC/8oyBd9DBIjeODj4/X8hTcO4PZZ/a6RKpYfBKWb6CuTQ+i41elD5A5cLHga7jPjOvWDIDv6e/EE25WXo49N0mPmF21OR3wm/FTahMf3/dNtLoe4GPa1LeC9y4xGUxacNnvHnykfTG+IWxJzOlyhnPzHH7bUJRvgINiSuu+CE8i2Jw8NwORq/jidRDktMz4COU46twnVyEx+brwxfFQDc+weu4P0drQFHq/Z+uP73UZq7vh8FAV6oeL2OTZl4OFMCUaZw4NXDjyNTBWENylaLDwXFpH+5Tm5mku4sN1XZQFwrkR+OvyjvxpvT5kTuEHcmpDh5i/qIQ/1l5LQd4RifUOS1A1XTnRq76r5dhzRlTPBxx7vlSDstmiA0r8NGXUcLZm6jJARkGZvnJAtqtod4JmhJbT/9tiZ4bS9QsX83dGv8DIrFVpnd+f4UAAAAASUVORK5CYII=)",
  "lassoPlus.png": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAADiklEQVR4XlVUbWxTVRh+12K3oYWBy9SCSAHbbXGRaGb8SoygmJFFICayH/5AIyrdYhb1BxFXHWswQRa03WVM3RzYjaEhYcZl/Tk6QhB0bN62xjV0yNJStm7tutbetvfex3N7e3XmyUnuOXme9+O8zz1EZKDyIhwVeBE28VisLzIQGYwMxPrEY7Bhh6NCYxgUuou8DLwuUD936G736GRrtC5uSSioi7dGR6fuds8dCtTzOoXlIhbbSyjBhrwt6G6LrgExlKJKfkiskksLuzVoiwbdeRs2gIlUgXWp/eTEdomwGnvSrYGuca/n2g9eT9d4a2BPej0TbZdOTiy1w1oQ8JsyHYdD5TJhZ2bME+/M7YfFWelc56yEJbc//oXXszNDKJcPhzId/CbCetnWxxOMaJ9NdoYaeaOXLpHg8HOCw0lOWrgPjcnO9lkjy9PLyzZCU2jQzOgnpgV7rNaut5GNRsnPEXzcstICQY9awX5i2ggzQoOEzzpnCXuXYq5Fc5cuTH8z5IoCnkRVooM55tq7RGDc+X5rXI+Oq3JDCyVILhTj54bPEYbPKV+CoyAhuaHjqh7WOEUGLIm1uDCGbdOFeEoxK+Hjilvz8Ng6WBK08E31og5tk+IBNg3GFBw+zlfMoHwJjrMUpzMk7Tt6TY/qOMHeGyI8l7vpxi4YtOBq0xvJR4vUQ8FV2bo7XzekCdxfhMZ57tk8YXdyxo1XsBEmhvv93ZoAJBnxcvT0B7cNqJFn++mJspuv/zJSzcb2VOr3kVv9Uz/+6U47BI/vZ+FzlkEHi9QyMfL0cilzwfnf5IPKpFeLzSOXK4s3qDb8YXLiovg2aoT3wj2ngmZ2YskP/Zr7mDepXnow+uVWVmHBatIbsddSJtTkvrpuH28JPsPKNclvhm8Ms2sxaeYz+k8/nNucujD5WL5CPhtYOOW8RSgr3kBz+rIndRRPohwsuJrBOO16NPuA6A4MBQlV+DTWKJVhy3JT7CIf7sX7eAn3qmpNUJZ969vrj7PGNRjwTiTck23C89iqkVcKSmDKt8x8N3Tj+NyRZHNmrazDkSnxIO5RhpmhO/9G0jIoByXSI6kXpN14Vfzo+G3CrsxcFzOx4iJif1YRKwXMozNssZi189xmdutXfoJVJWaZOVJs5v/18H+/rcK7nyQI3/tRrwryTLDIVkGgvRrKm6AhvePMH5bE+cl0/cpT9dX4B08ibwJFFp9KAAAAAElFTkSuQmCC)",
  "pointingHand.png": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAADe0lEQVR4Xq2V+yvrYRzHnWwuaaUst9mY21iyHcVySghxJJLLDy7L2Y9S4geHThx+5ISc0vCDf0AS6fj1rPxkRJ2dJjvtjNolt1y+NMY+5/N5yonZbIunvm179nyf1/N+fy5PSMgLo6OjwxAWFgaxsbHQ2NhonJiYELy0Pqj/CgoKPqSmpjoGBgZgfHwciouLna2tre+D2uSlxXK5XJ2UlMTt7e2B2WyGjIwMiImJ+fhmADy9OjMzk7PZbHB0dAT4HXp6en6+GSA5OVktk8k4u90Ox8fHTEF3d/fvNwNIpVKm4AFACgYHB//Mzc0pUZ3o1SBPgEKhgKysLFd5ebkdlekTExMLUKUU56VVVVVhQQM9AdnZ2dDe3g5bW1tQU1MDKSkpNrTtr0qlsvT3939/NSA9PR2mp6fh7u4OhoaGWG2gXdDZ2Qnx8fFWBH3CR4P1IvMFe4feqoqKir7k5OQoSQEF2Wq1siwiwMzMDLjdbhgeHoa8vDw4OztjiiIiIqCyshLq6uoA39mRSCSKZ5DQ0FAxnuQXeutG+Yb8/Hwt1gIDHB4eMsDs7Czc399TsAFPCxzHwe7uLojFYlhdXQWDwQBKpZLDfdTeVMhra2vBaDRCV1cX2zAtLQ0IcHp6yuYWFxeZRfPz89DX18cAVIgYbNje3oaTkxPAJODwsN4BLS0tTPbGxgagTBCJRECFdnt7C+fn53B9fc0UXF1dweXlJbhcLnA4HAxmsVhYvVRUVHA8Hu85IDIyUl5SUgImk4mduKmp6T+ANiXvHz+Ag+ZJEYHpkxTgHt4VCIVCCTY009TUFNzc3MDk5CTlPRwcHLCN/A2CE6C0tNQ7IDw8nI8Z8LWhoeGWFGxubkJvby+THSyAz+d7jUEIpp46ISGB0+l0zHeKh9PpDAhACimd0QUuKirKO4BSC3uOTqPRwMXFBQvig/+BWER9C+8RLjo62jcAPayhvqPX6xmAgkf++hu0huKF2cdhivsGjIyMCAsLC81jY2PMHgIEMgiwvr4OcXFxHNaCbwDZ1NbW9q2srAz29/fZ6QOB0LrR0VHAdPd/ZwgEAhF6uaPVap/EwbMOHpTRPGUbKgfsBv5vPawJXn19/WfsR04qPMoozzg8hlEirK2tMUBzc3Pg93Zubq6uurqa9aCVlZUnz/LyMvu9tLQECwsLgPVD1f/Ds8n9AyubuM4FiwqZAAAAAElFTkSuQmCC)",
  "rect.png": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAACc0lEQVR4Xo2UT0hUURTGf7uipMy8GbUwigx0WbiwpCgQKmgl1CYj3Plahtg/eguFUIoamNxUCEFCGlIgEhSORmQRNeVMSkhpWcSU1KSOQ9i8vvfmpiMZOB8Xzjv3fPPd8+dertPHQICX/OAVnTRTz1GOaNXL7pQvSdTG9KHwCVJMyzlMFw1UsJFC8lmtVSi7Qr4u7SUVk1KsmCkyZtJETchUmTKh3NSYk6ZBq0a276nSXtRMGc+kfMIkiRY3shQkWiZ9wjjxMN5SEAuPQ5qegBALe07a+eiMCj9lxZ0ZJ+N483A9oQf6qbWED6rITW4IcQGaGJuT/Y0f7rm1cJliS+jnLjNkAviEDXTwVbZ/2gwjobLESKgY6iiwhI5gyw/N/T2zKtljF0CN6p39SAZbCVyhTpwVLKOUM8wGmn4lEy35yGH+Jp1TKF9nrRp3mzbOMcp9m0MhtLPrvwRDr/6/mwda6cZ4ON24Hd5z1RISfGNIAdmDnWabtHtlzxLjtY1pgucM2o8rPOUhj+UZY0qDWGEJad5y0ca8mO90LLyKA+yjkirN6QWeaO0kwjvucZw8m0MwGinLzmelUi1nP3vYQrUCH3GNY5Qp+UpbpelcQjNnWcchVWRQhc2jiPWsYTl7aZRetvTBtP5VaJW7la0c5g4npFbCbk5xSzlNKPGRUKk6vYCwScIH2ax2lagH1VJ6wxdbNVUumKUFhGFNaMxiyEk4v3Jn1VmE4LluBK804W/5zdDA/+OxCtk58dzeNjcS7vYJ/v1bzGMJnm7rPDLmkzlvdph2E5/zRs13M2BS/p3OvhoLkVSBi7jE5zn/VPCy+K/GH86K+gV5WsL6AAAAAElFTkSuQmCC)",
  "rectPlus.png": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAACi0lEQVR4Xo2UT0hUQRzHP6c2KmrTnYoKjCAP+45FB0uKAqECT0FdMsKbr2OIUdE76EUpamHzUmoEGWmIgUnQn9UOWURp7ksJKSuLeCW1qesStq/fvB11lzr4vgzM/Ob3md+b3/xmuEYfA4Fe8ZMhOmmklmMclVYr/U6xpRg0Pn2I+yRpZsQ4Shd1lLGJCGHWSItIv0xsXTKXEp+0+AqZJqum1KCKqQpliXaqKnVK1Umrkr62VMjcoJpWvkprYAqvyUksRV7TlAYmcOP4S1EyPgEZegMgGfftjP3JHhf9kp5rz9pZ21+U44t6oZ9qA3yUjNygReSKoIEPC2H/oN19pxouUWKAfrqZJRtIAxvp4Jv09d9mGYtZ3lisBGooMkBHMKVd5QsRlSbfcxMl99tFUCX5zg1SwZSHI6qJ4q+wNHWGuSCmzqTXFEYMan7TeYlyBSi2ItymjXOMc9/sIQLt7C4AMiE36ka7K/HDlUXR1uh0qIcH9JCpd+OZ+u3wnisG8PjOCEOydr6S1hxJXhufBnjBsBlc5hkPeRS6bt2zbuUiWK1WJpThLReMz8vFk07GV3OQ/ZRTIXWqN11t7SLBO+5yglVmD0FppA0dZqWkcScH2MtmAVqsJ1zlOJZUbbnJ0kw+0MhZ1lEpGRnGCS2zVGgDa1nOPup5ahYNqnU+QrOYm9nGEe5wUqKVsofT3JRdTspZjMWictIFwBYJfIitcsClFHNYIr3hq7iapAW1VACMSoUmjUZsz/6dX6t2rvgKAN9xEvhRT0/oZaXg/7EYIFcnvvO4zUnEezSg79//LAbw5bYuKqs+q/Nqh2pX7oJ1UP1QAyqt73Tu1ShUShK8not8WbBPBy+LfjX+AjC0Avv8MQHTAAAAAElFTkSuQmCC)",
  "zoom.png": "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAACiUlEQVR4XpVTTUgUYRh+nJWCxUsNevBiYGm7UjAnFyoI9ORKSxt4a71Ei9I10EPg0VO7hOE1ikQSofXiYv6QRX9bkTAjbbM/B2mz8id3Z2f/ZvbtndR0NYn9XuYbPuZ55n3f730efMQCZjCLOX4/xyJe4BXe4C3e4QNi0JDCBu8JRPkURxIMm8BjjOMJJvEUU8jadUn36D79Zs5X8JhSyb6AX/iBzxxfLMIMwx/gIcYwXRMTNa86Mhrp23QXOwx3sW9zNKKOaF5NzAlrnCWBFXAx43jE8PeC0b4U9KstJmh/tJh+dSlotJeEDYZ/Bea5GAtudoZDkm5jcCP1poejd+XhaG+6kc82kvRwiDpLwha+A1RX8K4OaDfCU038UTQGk/GA2qO4lDbFpfbEA4NJ0QA1UThktOeFDBPOLd+/qF9PtOZBDi30LNU91FBfgz+rvmaoIdUVmnZo4CxLQU3cYsLJ7G1HebvqC7nIhHJ6G7y7mmsNKTQtGjbyq5p3Dnzv2au31i24QK35cEhpriQAzbUp92AS1GKqI7odL5F1jM9bzV7KzoyVLvfbDhKAoYZ4wGp/NFKU8Br6scS9VrM7Fw8a56/8A271ovb0pkF9m2UPy2AWGd/k4sYdpal/7+fH4cTxvaPsGo6C3EXysWYWQafIR2cqSnFyV237CM6ADOowyM8Si+xkkCsztB2RIYZCFT2QB1mYVdwSSSza/N85nD1qDl27cyA76EQ1k6bqtESiRagrXFsdyBxQq+ySnfIhtbJ6gHX2bBprQvmAHwKH/GDBmRCDyibP4Od/HLcNZ0KcCSnkmLQsKEd4mmvfgTMhybGCb0zI4RPb1bSbUtnDUvHz4yGJ7BUWx2+5Iu7Rc33AhQAAAABJRU5ErkJggg==)"
};

// lib/canvas_editor/cursor_manager_24.js
var computedCursors = /* @__PURE__ */ Object.create(null);
var scaleFactor = 3 / 4;
var CursorManager = class {
  constructor(JavaEditorArea) {
    this.HOTSPOT_32 = JavaEditorArea.HOTSPOT_32;
    this.IMAGE_NAME_32 = JavaEditorArea.IMAGE_NAME_32;
    this.cPointerCursor = JavaEditorArea.cPointerCursor;
    this.cTextCursor = JavaEditorArea.cTextCursor;
  }
  getCursor(cursor) {
    if (computedCursors[cursor]) {
      return computedCursors[cursor];
    }
    if (this.IMAGE_NAME_32[cursor]) {
      return this.buildCursor(cursor);
    }
    switch (cursor) {
      case this.cPointerCursor:
        return "default";
      case this.cTextCursor:
        return "text";
      default:
        throw new Error(`Unknown cursor: ${cursor}`);
    }
  }
  buildCursor(cursor) {
    const cursorName = this.IMAGE_NAME_32[cursor];
    const cursorUrl = cursors[cursorName];
    const builtCursor = `${cursorUrl} ${this.HOTSPOT_32[cursor * 2] * scaleFactor} ${this.HOTSPOT_32[cursor * 2 + 1] * scaleFactor}, default`;
    computedCursors[cursor] = builtCursor;
    return builtCursor;
  }
};

// lib/canvas_editor/editor_dialog.js
var EditorDialog = class {
  /**
   *
   * @param {string} title
   * @param {HTMLElement} rootElement
   */
  constructor(title, rootElement) {
    this.title = title;
    this.rootElement = rootElement;
    this.elements = [];
    this.dialogElement = null;
  }
  setLayout(hLayout, vLayout) {
    this.hLayout = generateLayout(hLayout);
    this.vLayout = generateLayout(vLayout);
  }
  add(component, x, y, x2, y2) {
    this.elements.push({ component, x, y, x2, y2 });
  }
  createTextField(width, height) {
    return new TextField(width, height);
  }
  createLabel(text) {
    return new Label(text);
  }
  createComboBox() {
    return new ComboBox();
  }
  createCheckBox(text) {
    return new CheckBox(text);
  }
  setEventConsumer(consumer) {
    this.consumer = consumer;
  }
  showMessage(message) {
    window.alert(message);
  }
  showDialog() {
    const dialog = document.createElement("dialog");
    const rootElementBounds = this.rootElement.getBoundingClientRect();
    Object.assign(dialog.style, {
      position: "absolute",
      marginBlock: 0,
      left: `${rootElementBounds.left}px`,
      right: `${document.body.parentElement.clientWidth - rootElementBounds.right}px`,
      top: `${this.rootElement.offsetTop + 30}px`
    });
    this.dialogElement = dialog;
    this.rootElement.getRootNode().append(dialog);
    const grid = document.createElement("div");
    grid.style.display = "grid";
    grid.style.gridTemplateColumns = this.hLayout;
    grid.style.gridTemplateRows = this.vLayout;
    dialog.append(grid);
    for (const { component, x, y, x2, y2 } of this.elements) {
      const div = document.createElement("div");
      if (x2 === void 0) {
        div.style.gridColumn = `${x + 1} / ${x + 2}`;
        div.style.gridRow = `${y + 1} / ${y + 2}`;
      } else {
        div.style.gridColumn = `${x + 1} / ${x2 + 2}`;
        div.style.gridRow = `${y + 1} / ${y2 + 2}`;
      }
      div.append(component.getElement());
      grid.append(div);
    }
    const buttons = document.createElement("div");
    buttons.style.display = "flex";
    buttons.style.flexDirection = "row-reverse";
    buttons.style.gap = "15px";
    const okButton = document.createElement("button");
    okButton.textContent = "OK";
    okButton.addEventListener("click", () => {
      this.consumer.fireOk();
    });
    buttons.append(okButton);
    const cancelButton = document.createElement("button");
    cancelButton.textContent = "Cancel";
    cancelButton.addEventListener("click", () => {
      this.consumer.fireCancel();
    });
    buttons.append(cancelButton);
    dialog.append(buttons);
    dialog.showModal();
    dialog.addEventListener("cancel", () => {
      this.consumer.fireCancel();
    });
  }
  disposeDialog() {
    if (this.dialogElement !== null) {
      this.dialogElement.remove();
      this.dialogElement = null;
    }
  }
};
var Component = class {
  setEventHandler(eventHandler) {
    this.eventHandler = eventHandler;
  }
  fireEvent(what, value) {
    this.eventHandler(what, value);
  }
};
var Label = class extends Component {
  constructor(text) {
    super();
    this.element = document.createElement("label");
    this.setText(text);
  }
  setText(text) {
    this.element.textContent = text;
  }
  getElement() {
    return this.element;
  }
};
var TextField = class extends Component {
  constructor() {
    super();
    this.element = document.createElement("input");
    this.element.type = "text";
  }
  setText(text) {
    this.element.value = text;
  }
  getText() {
    return this.element.value;
  }
  getElement() {
    return this.element;
  }
};
var ComboBox = class extends Component {
  constructor() {
    super();
    this.element = document.createElement("select");
    this.element.addEventListener("change", () => {
      this.fireEvent(2, this.element.selectedIndex);
    });
  }
  setEnabled(enabled) {
    this.element.disabled = !enabled;
  }
  addItem(item) {
    const option = document.createElement("option");
    option.textContent = item;
    this.element.append(option);
  }
  getSelectedIndex() {
    return this.element.selectedIndex;
  }
  setSelectedIndex(index) {
    this.element.selectedIndex = index;
  }
  setSelectedItem(item) {
    const options = this.element.options;
    for (let i = 0; i < options.length; i++) {
      if (options[i].textContent === item) {
        this.element.selectedIndex = i;
      }
    }
  }
  getSelectedItem() {
    return this.element.options[this.element.selectedIndex].textContent;
  }
  removeAllItems() {
    this.element.innerHTML = "";
  }
  getElement() {
    return this.element;
  }
};
var CheckBox = class extends Component {
  constructor(text) {
    super();
    const label = document.createElement("label");
    const input = document.createElement("input");
    input.type = "checkbox";
    input.addEventListener("change", () => {
      this.fireEvent(3, input.checked ? 1 : 0);
    });
    label.append(input);
    label.append(text);
    this.element = label;
    this.checkBox = input;
  }
  setEnabled(enabled) {
    this.checkBox.disabled = !enabled;
  }
  isSelected() {
    return this.checkBox.checked;
  }
  setSelected(selected) {
    this.checkBox.checked = selected;
  }
  getElement() {
    return this.element;
  }
};
function generateLayout(layout) {
  return layout.map((dim) => {
    if (dim > 0) {
      return `${dim}px`;
    } else {
      return "auto";
    }
  }).join(" ");
}

// lib/canvas_editor/editor_image.js
var EditorImage = class {
  /**
   *
   * @param {ImageData} imageData
   */
  constructor(imageData) {
    this.imageData = imageData;
    this.dataView = new DataView(imageData.data.buffer);
  }
  getWidth() {
    return this.imageData.width;
  }
  getHeight() {
    return this.imageData.height;
  }
  getRGB(x, y) {
    const color = this.dataView.getInt32(
      (y * this.imageData.width + x) * 4,
      false
    );
    const alpha = color & 255;
    return alpha << 24 | color >>> 8;
  }
  setRGB(x, y, argb) {
    const alpha = argb >>> 24 & 255;
    const rgb = argb << 8 | alpha;
    this.dataView.setInt32((y * this.imageData.width + x) * 4, rgb, false);
  }
  toDataURL() {
    const canvas = document.createElement("canvas");
    const ctx2 = canvas.getContext("2d");
    canvas.width = this.imageData.width;
    canvas.height = this.imageData.height;
    ctx2.putImageData(this.imageData, 0, 0);
    return canvas.toDataURL("image/png");
  }
};

// lib/canvas_editor/ui_helper.js
var UIHelper = class {
  /**
   *
   * @param {HTMLCanvasElement} canvasElement
   * @param {HTMLElement} dialogRoot
   * @param JavaEditorArea
   */
  constructor(canvasElement, dialogRoot, JavaEditorArea) {
    this.canvasElement = canvasElement;
    this.dialogRoot = dialogRoot;
    this.JavaEditorArea = JavaEditorArea;
  }
  register(javaUiHelper) {
    this.javaUiHelper = javaUiHelper;
    this.cursorManager = new CursorManager(this.JavaEditorArea, javaUiHelper);
  }
  grabFocus() {
    this.canvasElement.focus({ preventScroll: true });
  }
  setCursor(cursor) {
    this.canvasElement.style.cursor = this.cursorManager.getCursor(cursor);
  }
  showHelpDialog() {
  }
  createImage(width, height) {
    const imageData = new ImageData(width, height);
    return new EditorImage(imageData);
  }
  createImageFromBase64(width, height, base64) {
    base64 = base64.replaceAll(
      /%\d+%/g,
      (match) => "A".repeat(Number(match.slice(1, -1)))
    );
    const decoded = decodeBase64(base64);
    const typedArray = new Uint8ClampedArray(decoded);
    const imageData = new ImageData(typedArray, width, height);
    return new EditorImage(imageData);
  }
  createDialog(title) {
    return new EditorDialog(title, this.dialogRoot);
  }
  runLater(fn) {
    if (typeof requestAnimationFrame === "function") {
      requestAnimationFrame(fn);
    } else if (typeof setImmediate === "function") {
      setImmediate(fn);
    } else {
      setTimeout(fn, 0);
    }
  }
};

// lib/canvas_editor/create_editor.js
function createEditor(parentElement, options, onChange, JavaEditorArea, JavaEditorToolbar, JavaUIHelper, Molecule2, Reaction2) {
  const {
    readOnly = false,
    initialMode = "molecule",
    initialFragment = false
  } = options;
  const rootElement = document.createElement("div");
  rootElement.dataset.openchemlibCanvasEditor = "true";
  Object.assign(rootElement.style, {
    width: "100%",
    height: "100%",
    display: "flex",
    flexDirection: "row",
    alignItems: "start",
    backgroundColor: "white",
    // Prevent side effects of pointer events, like scrolling the page or text
    // selection.
    touchAction: "none",
    userSelect: "none",
    webkitUserSelect: "none"
  });
  const shadowRoot = rootElement.attachShadow({ mode: "open" });
  shadowRoot.adoptedStyleSheets = [getEditorStylesheet()];
  let toolbarCanvas = null;
  if (!readOnly) {
    toolbarCanvas = document.createElement("canvas");
    shadowRoot.append(toolbarCanvas);
  }
  const editorContainer = document.createElement("div");
  Object.assign(editorContainer.style, {
    width: "100%",
    height: "100%"
  });
  shadowRoot.append(editorContainer);
  const editorCanvas = document.createElement("canvas");
  editorCanvas.tabIndex = 0;
  Object.assign(editorCanvas.style, {
    outline: "none"
  });
  editorContainer.append(editorCanvas);
  parentElement.append(rootElement);
  const uiHelper = new JavaUIHelper(
    new UIHelper(editorCanvas, editorContainer, JavaEditorArea)
  );
  const editorArea = new JavaEditorArea(
    computeMode(initialMode, JavaEditorArea),
    new EditorArea(editorCanvas, onChange),
    uiHelper
  );
  if (initialFragment) {
    if (initialMode === "molecule") {
      const fragmentMolecule = new Molecule2(0, 0);
      fragmentMolecule.setFragment(true);
      editorArea.setMolecule(fragmentMolecule);
    } else {
      const fragmentReaction = Reaction2.create();
      fragmentReaction.setFragment(true);
      editorArea.setReaction(fragmentReaction);
    }
  }
  uiHelper.setEditorArea(editorArea);
  const toolbar = readOnly ? null : new JavaEditorToolbar(editorArea, new Toolbar(toolbarCanvas), uiHelper);
  function updateCanvasDimensions(containerSize2) {
    editorCanvas.style.width = `${containerSize2.width}px`;
    editorCanvas.width = Math.floor(containerSize2.width * hidpiScaleFactor);
    editorCanvas.style.height = `${containerSize2.height}px`;
    editorCanvas.height = Math.floor(containerSize2.height * hidpiScaleFactor);
    if (containerSize2.width > 0 && containerSize2.height > 0) {
      editorArea.repaint();
    }
  }
  const containerSize = editorContainer.getBoundingClientRect();
  updateCanvasDimensions(containerSize);
  const resizeObserver = new ResizeObserver(([entry]) => {
    updateCanvasDimensions(entry.contentRect);
  });
  resizeObserver.observe(editorContainer);
  let removePointerListeners = null;
  let removeKeyboardListeners = null;
  let removeToolbarPointerListeners = null;
  if (!readOnly) {
    removePointerListeners = addPointerListeners(
      editorCanvas,
      editorArea,
      JavaEditorArea
    );
    removeKeyboardListeners = addKeyboardListeners(
      editorContainer,
      editorCanvas,
      editorArea,
      JavaEditorArea,
      Molecule2
    );
    removeToolbarPointerListeners = addPointerListeners(
      toolbarCanvas,
      toolbar,
      JavaEditorArea
    );
  }
  function destroy() {
    rootElement.remove();
    resizeObserver.disconnect();
    removePointerListeners?.();
    removeKeyboardListeners?.();
    removeToolbarPointerListeners?.();
  }
  return { editorArea, toolbar, uiHelper, destroy };
}
function computeMode(initialMode, JavaEditorArea) {
  switch (initialMode) {
    case "molecule":
      return 0;
    case "reaction":
      return JavaEditorArea.MODE_REACTION | JavaEditorArea.MODE_MULTIPLE_FRAGMENTS;
    default:
      throw new Error(`Invalid initial mode: ${initialMode}`);
  }
}

// lib/canvas_editor/init/canvas_editor.js
function initCanvasEditor(JavaEditorArea, JavaEditorToolbar, JavaUIHelper, Molecule2, Reaction2) {
  class CanvasEditor2 {
    #editorArea;
    // Can be useful for debugging.
    /* eslint-disable no-unused-private-class-members */
    #toolbar;
    #uiHelper;
    /* eslint-enable no-unused-private-class-members */
    #onChange;
    #changeEventMap;
    #destroy;
    constructor(parentElement, options = {}) {
      const { editorArea, toolbar, uiHelper, destroy } = createEditor(
        parentElement,
        options,
        (event) => this.#handleChange(event),
        JavaEditorArea,
        JavaEditorToolbar,
        JavaUIHelper,
        Molecule2,
        Reaction2
      );
      this.#editorArea = editorArea;
      this.#toolbar = toolbar;
      this.#uiHelper = uiHelper;
      this.#onChange = null;
      this.#changeEventMap = {
        [JavaEditorArea.EDITOR_EVENT_MOLECULE_CHANGED]: "molecule",
        [JavaEditorArea.EDITOR_EVENT_SELECTION_CHANGED]: "selection",
        [JavaEditorArea.EDITOR_EVENT_HIGHLIGHT_ATOM_CHANGED]: "highlight-atom",
        [JavaEditorArea.EDITOR_EVENT_HIGHLIGHT_BOND_CHANGED]: "highlight-bond"
      };
      this.#destroy = destroy;
    }
    getMode() {
      this.#checkNotDestroyed();
      const mode = this.#editorArea.getMode();
      const isReaction = mode & JavaEditorArea.MODE_REACTION !== 0;
      return isReaction ? "reaction" : "molecule";
    }
    setMolecule(molecule) {
      this.#checkNotDestroyed();
      this.#editorArea.setMolecule(molecule);
    }
    getMolecule() {
      this.#checkNotDestroyed();
      return this.#editorArea.getMolecule();
    }
    setReaction(reaction) {
      this.#checkNotDestroyed();
      this.#editorArea.setReaction(reaction);
    }
    getReaction() {
      this.#checkNotDestroyed();
      return this.#editorArea.getReaction();
    }
    setOnChangeListener(onChange) {
      this.#checkNotDestroyed();
      this.#onChange = onChange;
    }
    removeOnChangeListener() {
      this.#checkNotDestroyed();
      this.#onChange = null;
    }
    clearAll() {
      this.#checkNotDestroyed();
      this.#editorArea.clearAll();
    }
    destroy() {
      this.#checkNotDestroyed();
      this.#destroy();
      this.#editorArea = null;
      this.#toolbar = null;
      this.#uiHelper = null;
      this.#onChange = null;
      this.#destroy = null;
    }
    get isDestroyed() {
      return !this.#editorArea;
    }
    moleculeChanged() {
      this.#checkNotDestroyed();
      this.#editorArea.moleculeChanged();
    }
    #checkNotDestroyed() {
      if (this.isDestroyed) {
        throw new Error("CanvasEditor has been destroyed");
      }
    }
    /**
     * @param {{ what: number; isUserEvent: boolean; }} event
     */
    #handleChange(event) {
      if (!this.#onChange) return;
      const { what, isUserEvent } = event;
      this.#onChange({
        type: this.#changeEventMap[what],
        isUserEvent
      });
    }
  }
  return CanvasEditor2;
}

// lib/canvas_editor/init/canvas_editor_element.js
function initCanvasEditorElement(CanvasEditor2, Molecule2, Reaction2, ReactionEncoder2) {
  class CanvasEditorElement extends HTMLElement {
    /** @type {{MOLECULE: 'molecule', REACTION: 'reaction'}} */
    static MODE = Object.freeze(
      /* @__PURE__ */ Object.create({
        MOLECULE: "molecule",
        REACTION: "reaction"
      })
    );
    static observedAttributes = Object.freeze([
      "idcode",
      "fragment",
      "mode",
      "readonly"
    ]);
    /**
     * @type {{mode: 'molecule' | 'reaction', fragment: boolean, idcode: string, readonly: boolean}}
     */
    #state = {
      idcode: "",
      fragment: false,
      mode: CanvasEditorElement.MODE_MOLECULE,
      readonly: false
    };
    get idcode() {
      return this.#state.idcode;
    }
    set idcode(value) {
      this.#state.idcode = String(value);
      this.setAttribute("idcode", this.#state.idcode);
    }
    get fragment() {
      return this.#state.fragment;
    }
    set fragment(value) {
      this.#state.fragment = Boolean(value);
      if (this.#state.fragment) {
        this.setAttribute("fragment", "");
      } else {
        this.removeAttribute("fragment");
      }
    }
    get mode() {
      return this.#state.mode;
    }
    set mode(value) {
      this.#state.mode = String(value);
      this.setAttribute("mode", this.#state.mode);
    }
    get readonly() {
      return this.#state.readonly;
    }
    set readonly(value) {
      this.#state.readonly = Boolean(value);
      if (this.#state.readonly) {
        this.setAttribute("readonly", "");
      } else {
        this.removeAttribute("readonly");
      }
    }
    /* --- custom element api --- */
    /**
     * @param {Molecule} molecule
     * @this {CanvasEditorElement}
     */
    setMolecule(molecule) {
      this.fragment = molecule.isFragment();
      this.idcode = `${molecule.getIDCode()} ${molecule.getIDCoordinates()}`;
      this.#editor.setMolecule(molecule);
    }
    /**
     * @return {Molecule}
     * @this {CanvasEditorElement}
     */
    getMolecule() {
      return this.#editor.getMolecule();
    }
    /**
     * @param {Reaction} reaction
     * @this {CanvasEditorElement}
     */
    setReaction(reaction) {
      this.fragment = reaction.isFragment();
      this.idcode = ReactionEncoder2.encode(reaction, {
        keepAbsoluteCoordinates: true,
        mode: ReactionEncoder2.INCLUDE_MAPPING | ReactionEncoder2.INCLUDE_COORDS | ReactionEncoder2.RETAIN_REACTANT_AND_PRODUCT_ORDER
      }) ?? "";
      this.#editor.setReaction(reaction);
    }
    /**
     * @return {Reaction}
     * @this {CanvasEditorElement}
     */
    getReaction() {
      return this.#editor.getReaction();
    }
    /**
     * @this {CanvasEditorElement}
     */
    clearAll() {
      this.#editor.clearAll();
      this.idcode = "";
    }
    /**
     * @this {CanvasEditorElement}
     */
    moleculeChanged() {
      this.#editor.moleculeChanged();
    }
    /* --- internals --- */
    /** @type {CanvasEditor} */
    #editor;
    /**
     * @this {CanvasEditorElement}
     */
    #initEditor() {
      if (this.#editor) return;
      this.#editor = new CanvasEditor2(this, {
        readOnly: this.readonly,
        initialMode: this.mode
      });
      this.#editor.setOnChangeListener(this.#handleChange);
      requestIdleCallback(() => this.#initIdCode());
    }
    /**
     * @this {CanvasEditorElement}
     */
    #initIdCode() {
      switch (this.mode) {
        case CanvasEditorElement.MODE.MOLECULE: {
          return this.#initMolecule();
        }
        case CanvasEditorElement.MODE.REACTION: {
          return this.#initReaction();
        }
        default:
          throw new Error(`Mode ${this.mode} is not supported`);
      }
    }
    /**
     * @param {string} idcodeAndCoordinates
     */
    #moleculeFromIdCode(idcodeAndCoordinates) {
      const index = idcodeAndCoordinates.indexOf(" ");
      if (index === -1) {
        return Molecule2.fromIDCode(idcodeAndCoordinates);
      }
      const idcode = idcodeAndCoordinates.slice(0, index);
      const coordinates = idcodeAndCoordinates.slice(index + 1);
      return Molecule2.fromIDCode(idcode, coordinates);
    }
    /**
     * @this {CanvasEditorElement}
     */
    #initMolecule() {
      const molecule = this.#moleculeFromIdCode(this.idcode);
      molecule.setFragment(this.fragment);
      this.#editor.setMolecule(molecule);
    }
    /**
     * @this {CanvasEditorElement}
     */
    #initReaction() {
      const reaction = ReactionEncoder2.decode(this.idcode, {
        ensureCoordinates: true
      }) ?? Reaction2.create();
      reaction.setFragment(this.fragment);
      this.#editor.setReaction(reaction);
    }
    #ignoreAttributeChange = false;
    /**
     * @param {() => void} fn
     * @this {CanvasEditorElement}
     */
    #wrapIgnoreAttributeChange(fn) {
      this.#ignoreAttributeChange = true;
      try {
        fn();
      } finally {
        this.#ignoreAttributeChange = false;
      }
    }
    /**
     * @param {{
     *  type: 'molecule' | 'selection' | 'highlight-atom' | 'highlight-bond';
     *  isUserEvent: boolean;
     * }} editorEventOnChange
     */
    #handleChange = (editorEventOnChange) => {
      const idcode = this.idcode;
      const fragment = this.fragment;
      this.#wrapIgnoreAttributeChange(() => {
        if (editorEventOnChange.type !== "molecule") return;
        switch (this.mode) {
          case CanvasEditorElement.MODE.MOLECULE: {
            const molecule = this.getMolecule();
            this.idcode = `${molecule.getIDCode()} ${molecule.getIDCoordinates()}`;
            this.fragment = molecule.isFragment();
            break;
          }
          case CanvasEditorElement.MODE.REACTION: {
            const reaction = this.getReaction();
            this.idcode = ReactionEncoder2.encode(reaction, {
              keepAbsoluteCoordinates: true,
              mode: ReactionEncoder2.INCLUDE_MAPPING | ReactionEncoder2.INCLUDE_COORDS | ReactionEncoder2.RETAIN_REACTANT_AND_PRODUCT_ORDER
            });
            this.fragment = reaction.isFragment();
            break;
          }
          default:
            throw new Error(`Unsupported mode ${this.mode}`);
        }
      });
      const domEvent = new CustomEvent("change", {
        detail: editorEventOnChange,
        bubbles: true
      });
      this.dispatchEvent(domEvent);
      if (editorEventOnChange.mode !== "molecule") return;
      if (this.idcode !== idcode) {
        const idcodeChangeEvent = new CustomEvent("idcode-changed", {
          detail: this.idcode,
          bubbles: true
        });
        this.dispatchEvent(idcodeChangeEvent);
      }
      if (this.fragment !== fragment) {
        const fragmentChangeEvent = new CustomEvent("fragment-changed", {
          detail: this.fragment,
          bubbles: true
        });
        this.dispatchEvent(fragmentChangeEvent);
      }
    };
    #destroyEditor() {
      if (!this.#editor) return;
      this.#editor.destroy();
      this.#editor = void 0;
    }
    #resetEditor() {
      this.#destroyEditor();
      this.#initEditor();
    }
    /* --- lifecycle hooks --- */
    /**
     * Custom element added to page.
     */
    connectedCallback() {
      this.#state = {
        idcode: this.getAttribute("idcode") || "",
        fragment: this.hasAttribute("fragment"),
        mode: this.getAttribute("mode") || CanvasEditorElement.MODE.MOLECULE,
        readonly: this.hasAttribute("readonly")
      };
      this.#initEditor();
    }
    /**
     * Custom element removed from page.
     */
    disconnectedCallback() {
      this.#destroyEditor();
    }
    /**
     * Custom element moved to new page.
     */
    adoptedCallback() {
      this.connectedCallback();
    }
    /**
     * Attribute ${name} has changed from ${oldValue} to ${newValue}
     *
     * Sync attribute changes to internal state.
     * propagate changes to editor.
     */
    attributeChangedCallback(name, oldValue, newValue) {
      if (!this.#editor) return;
      if (this.#ignoreAttributeChange) return;
      const mutatorHandler = (() => {
        switch (name) {
          case "idcode": {
            this.#state.idcode = String(newValue);
            return () => this.#initIdCode();
          }
          case "fragment": {
            this.#state.fragment = newValue !== null;
            return () => this.#initIdCode();
          }
          case "mode": {
            this.#state.mode = String(newValue);
            return () => this.#resetEditor();
          }
          case "readonly": {
            this.#state.readonly = newValue !== null;
            return () => this.#resetEditor();
          }
          default:
            throw new Error("unsupported attribute change");
        }
      })();
      mutatorHandler();
    }
  }
  return CanvasEditorElement;
}

// lib/canvas_editor/init/index.js
function init(OCL) {
  const {
    GenericEditorArea: JavaEditorArea,
    GenericEditorToolbar: JavaEditorToolbar,
    GenericUIHelper: JavaUIHelper,
    Molecule: Molecule2,
    Reaction: Reaction2,
    ReactionEncoder: ReactionEncoder2
  } = OCL;
  const CanvasEditor2 = initCanvasEditor(
    JavaEditorArea,
    JavaEditorToolbar,
    JavaUIHelper,
    Molecule2,
    Reaction2
  );
  function registerCustomElement2() {
    const constructor = customElements.get("openchemlib-editor");
    if (constructor) return constructor;
    const CanvasEditorElement = initCanvasEditorElement(
      CanvasEditor2,
      Molecule2,
      Reaction2,
      ReactionEncoder2
    );
    customElements.define("openchemlib-editor", CanvasEditorElement);
    const style = document.createElement("style");
    style.id = "openchemlib-editor-default-style";
    style.innerHTML = `
    /* dynamicaly added from openchemlib registerCustomElement with low priority */
    openchemlib-editor:defined {
      display: block;
      height: 400px;
      width: 600px;
    }
    `;
    document.head.prepend(style);
    return CanvasEditorElement;
  }
  OCL.CanvasEditor = CanvasEditor2;
  OCL.registerCustomElement = registerCustomElement2;
  delete OCL.GenericEditorArea;
  delete OCL.GenericEditorToolbar;
  delete OCL.GenericUIHelper;
}

// lib/extend/appendGetNextCustomAtomLabel.js
function appendGetNextCustomAtomLabel(Molecule2) {
  Molecule2.prototype.getNextCustomAtomLabel = function getNextCustomAtomLabel(label) {
    let nextLabel = label || "1";
    const existingLabels = /* @__PURE__ */ new Set();
    for (let i = 0; i < this.getAllAtoms(); i++) {
      const existingLabel = this.getAtomCustomLabel(i);
      if (existingLabel) {
        existingLabels.add(existingLabel);
      }
    }
    let counter = 0;
    while (existingLabels.has(nextLabel) && counter++ < 100) {
      nextLabel = getNextLabel(nextLabel);
    }
    return nextLabel;
  };
}
function getNextLabel(label) {
  const match = label.match(/(\d+)/);
  if (match) {
    const number = Number.parseInt(match[1], 10);
    return label.replace(/(\d+)/, (number + 1).toString());
  }
  const match2 = label.match(/([a-yA-Y])([^a-zA-Z]*)$/);
  if (match2) {
    const char = match2[1];
    const nextChar = String.fromCodePoint(char.codePointAt(0) + 1);
    if (nextChar === "Z" || nextChar === "z") return "1";
    return label.replace(/([a-yA-Y])([^a-zA-Z]*)$/, `${nextChar}$2`);
  }
  return "1";
}

// lib/extend/utils/changeMolfileCustomLabelPosition.js
function changeMolfileCustomLabelPosition(molecule, customLabelPosition) {
  switch (customLabelPosition) {
    case "superscript":
      for (let i = 0; i < molecule.getAllAtoms(); i++) {
        const customLabel = molecule.getAtomCustomLabel(i);
        if (customLabel && !customLabel.startsWith("]")) {
          molecule.setAtomCustomLabel(i, `]${customLabel}`);
        }
      }
      break;
    case "normal":
      for (let i = 0; i < molecule.getAllAtoms(); i++) {
        const customLabel = molecule.getAtomCustomLabel(i);
        if (customLabel?.startsWith("]")) {
          molecule.setAtomCustomLabel(i, customLabel.slice(1));
        }
      }
      break;
    case "auto":
      for (let i = 0; i < molecule.getAllAtoms(); i++) {
        const customLabel = molecule.getAtomCustomLabel(i);
        if (customLabel) {
          const atomLabel = molecule.getAtomLabel(i);
          if (atomLabel === "C") {
            if (customLabel.startsWith("]")) {
              molecule.setAtomCustomLabel(i, customLabel.slice(1));
            }
          } else if (!customLabel.startsWith("]")) {
            molecule.setAtomCustomLabel(i, `]${customLabel}`);
          }
        }
      }
      break;
    case void 0:
      break;
    default:
      break;
  }
}

// lib/extend/extendFromMolfile.js
function extendFromMolfile(Molecule2) {
  const _fromMolfile = Molecule2.fromMolfile;
  Molecule2.fromMolfile = function fromMolfile(molfile, options = {}) {
    const { customLabelPosition } = options;
    const molecule = _fromMolfile.call(this, molfile);
    const lines = molfile.split("\n");
    if (lines.length < 4 || !lines[3].includes("V2000")) {
      return molecule;
    }
    const possibleLines = lines.slice(
      4 + molecule.getAllAtoms() + molecule.getAllBonds()
    );
    for (let i = 0; i < possibleLines.length; i++) {
      const line = possibleLines[i];
      if (line.startsWith("A  ")) {
        const atom = Number(line.slice(3));
        const valueLine = possibleLines[i + 1]?.trim();
        i++;
        if (!Number.isNaN(atom) && atom <= molecule.getAllAtoms() && valueLine && !molecule.getAtomCustomLabel(atom - 1)) {
          molecule.setAtomCustomLabel(atom - 1, valueLine);
        }
      }
      if (line.startsWith("V  ")) {
        const parts = line.split(" ").filter(Boolean);
        if (parts.length >= 3) {
          const atom = Number(parts[1]);
          const label = parts.slice(2).join(" ");
          if (!Number.isNaN(atom) && atom <= molecule.getAllAtoms() && !molecule.getAtomCustomLabel(atom - 1)) {
            molecule.setAtomCustomLabel(atom - 1, label);
          }
        }
      }
    }
    changeMolfileCustomLabelPosition(molecule, customLabelPosition);
    return molecule;
  };
}

// lib/extend/extendToMolfile.js
var CUSTOM_ATOMS_LABELS_TAGS = [
  "M  STY",
  "M  SLB",
  "M  SAL",
  "M  SDT",
  "M  SDD",
  "M  SED"
];
function extendToMolfile(Molecule2) {
  const _toMolfile = Molecule2.prototype.toMolfile;
  Molecule2.prototype.toMolfile = function toMolfile(options = {}) {
    let molecule = this.getCompactCopy();
    const {
      includeCustomAtomLabelsAsALines = false,
      includeCustomAtomLabelsAsVLines = false,
      customLabelPosition,
      removeCustomAtomLabels = false
    } = options;
    changeMolfileCustomLabelPosition(molecule, customLabelPosition);
    const molfile = _toMolfile.call(molecule);
    if (!includeCustomAtomLabelsAsALines && !includeCustomAtomLabelsAsVLines && !removeCustomAtomLabels) {
      return molfile;
    }
    let lines = molfile.split("\n");
    if (removeCustomAtomLabels) {
      lines = lines.filter(
        (line) => !CUSTOM_ATOMS_LABELS_TAGS.some((tag) => line.startsWith(tag))
      );
    }
    if (lines.length < 4 || !lines[3].includes("V2000")) {
      return molfile;
    }
    const newLines = [];
    for (let i = 0; i < molecule.getAllAtoms(); i++) {
      const label = molecule.getAtomCustomLabel(i);
      if (label) {
        const paddedAtomNumber = String(i + 1).padStart(3, " ");
        if (includeCustomAtomLabelsAsALines) {
          newLines.push(`A  ${paddedAtomNumber}`, label);
        }
        if (includeCustomAtomLabelsAsVLines) {
          newLines.push(`V  ${paddedAtomNumber} ${label}`);
        }
      }
    }
    const mEndIndex = lines.findIndex((line) => line.startsWith("M  END"));
    if (mEndIndex === -1) {
      return molfile;
    }
    lines.splice(mEndIndex, 0, ...newLines);
    return lines.join("\n");
  };
}

// lib/extend/index.js
function extendOCL(OCL) {
  const { ConformerGenerator: ConformerGenerator2, ForceFieldMMFF94: ForceFieldMMFF942, Molecule: Molecule2 } = OCL;
  ConformerGenerator2.prototype.molecules = function* molecules() {
    let nextConformer;
    while ((nextConformer = this.getNextConformerAsMolecule()) !== null) {
      yield nextConformer;
    }
  };
  const defaultMinimiseOptions = {
    maxIts: 4e3,
    gradTol: 1e-4,
    funcTol: 1e-6
  };
  const _minimise = ForceFieldMMFF942.prototype._minimise;
  delete ForceFieldMMFF942.prototype._minimise;
  ForceFieldMMFF942.prototype.minimise = function minimise(options) {
    options = { ...defaultMinimiseOptions, ...options };
    return _minimise.call(
      this,
      options.maxIts,
      options.gradTol,
      options.funcTol
    );
  };
  extendFromMolfile(Molecule2);
  extendToMolfile(Molecule2);
  appendGetNextCustomAtomLabel(Molecule2);
  function parseMoleculeFromText(text) {
    if (!text) {
      return null;
    }
    if (text.includes("V2000") || text.includes("V3000")) {
      return Molecule2.fromMolfile(text);
    }
    try {
      return Molecule2.fromSmiles(text);
    } catch {
    }
    try {
      return Molecule2.fromIDCode(text);
    } catch {
    }
    return null;
  }
  Molecule2.fromText = function fromText(text) {
    const molecule = parseMoleculeFromText(text);
    if (molecule && molecule.getAllAtoms() > 0) {
      return molecule;
    }
    return null;
  };
  Molecule2.prototype.getOCL = function getOCL() {
    return OCL;
  };
}

// lib/java/openchemlib.debug.js
function noop() {
}
function getExports($wnd) {
  const $doc = $wnd.document;
  const $gwt = {};
  const navigator2 = {
    userAgent: "webkit"
  };
  const __gwtModuleFunction = noop;
  __gwtModuleFunction.__moduleStartupDone = noop;
  const $sendStats = noop;
  let $moduleName, $moduleBase;
  var cggl = {};
  var jl = {};
  var cggcc = {};
  var ji = {};
  var cggcci = {};
  var jlr = {};
  var ju = {};
  var ji2 = {};
  var carc = {};
  var carc2 = {};
  var carcc = {};
  var carcc2 = {};
  var carcc3 = {};
  var carcd = {};
  var carcf = {};
  var carcfm = {};
  var carcfmt = {};
  var carcfmt2 = {};
  var carci = {};
  var carcn = {};
  var carcp = {};
  var carcr = {};
  var carcrm = {};
  var carg = {};
  var cargc = {};
  var cargg = {};
  var carge = {};
  var cargh = {};
  var cargj = {};
  var cargja = {};
  var cargjag = {};
  var cargjagi = {};
  var cargju = {};
  var caru = {};
  var cggccp = {};
  var cggcs = {};
  var cggcsi = {};
  var ja = {};
  var jag = {};
  var jaf = {};
  var jai = {};
  var juf = {};
  var jm = {};
  var jnc = {};
  var jt = {};
  var juc = {};
  var jus = {};
  var js = {};
  var ocu = {};
  var ooccg = {};
  var ooccs = {};
  var _;
  var prototypesByTypeId_0;
  var initFnList_0;
  var PERMUTATION_NOT_SET = -1;
  var permutationId = -1;
  function getPermutationId() {
    return permutationId;
  }
  function setGwtProperty(propertyName, propertyValue) {
    if (typeof window === "object" && typeof window["$gwt"] === "object") {
      window["$gwt"][propertyName] = propertyValue;
    }
  }
  function registerEntry_0() {
    return registerEntry();
  }
  function gwtOnLoad_0(errFn, modName, modBase, softPermutationId) {
    cggl.ensureModuleInit();
    var initFnList = initFnList_0;
    $moduleName = modName;
    $moduleBase = modBase;
    permutationId = softPermutationId;
    function initializeModules() {
      for (var i = 0; i < initFnList.length; i++) {
        initFnList[i]();
      }
    }
    if (errFn) {
      try {
        $entry(initializeModules)();
      } catch (e) {
        errFn(modName, e);
      }
    } else {
      $entry(initializeModules)();
    }
  }
  cggl.ensureModuleInit = function ensureModuleInit() {
    if (initFnList_0 == null) {
      initFnList_0 = [];
    }
  };
  function addInitFunctions() {
    cggl.ensureModuleInit();
    var initFnList = initFnList_0;
    for (var i = 0; i < arguments.length; i++) {
      initFnList.push(arguments[i]);
    }
  }
  function uniqueId(id_0) {
    return jsinterop.closure.getUniqueId(id_0);
  }
  function typeMarkerFn() {
  }
  function toString_29(object) {
    if (Array.isArray(object) && hasTypeMarker(object)) {
      return jl.toString_2(object);
    }
    return object.toString();
  }
  function provide(namespace, optCtor) {
    var cur = $wnd;
    if (namespace === "") {
      return cur;
    }
    var parts = namespace.split(".");
    if (!(parts[0] in cur) && cur.execScript) {
      cur.execScript("var " + parts[0]);
    }
    if (optCtor) {
      var clazz = optCtor.prototype.___clazz;
      clazz.jsConstructor = optCtor;
    }
    for (var part; parts.length && (part = parts.shift()); ) {
      cur = cur[part] = cur[part] || (!parts.length && optCtor || {});
    }
    return cur;
  }
  cggl.portableObjCreate = function portableObjCreate(obj) {
    function F() {
    }
    ;
    F.prototype = obj || {};
    return new F();
  };
  cggl.maybeGetClassLiteralFromPlaceHolder = function maybeGetClassLiteralFromPlaceHolder(entry) {
    return entry instanceof Array ? entry[0] : null;
  };
  function makeLambdaFunction(samMethod, ctor, ctorArguments) {
    var lambda = function() {
      return samMethod.apply(lambda, arguments);
    };
    ctor.apply(lambda, ctorArguments);
    return lambda;
  }
  function getClassPrototype(typeId) {
    return prototypesByTypeId_0[typeId];
  }
  function emptyMethod() {
  }
  function defineProperties(proto, propertyDefinition) {
    for (var key in propertyDefinition) {
      propertyDefinition[key]["configurable"] = true;
    }
    Object.defineProperties(proto, propertyDefinition);
  }
  function defineClass(typeId, superTypeIdOrPrototype, castableTypeMap) {
    var prototypesByTypeId = prototypesByTypeId_0;
    var prototype_0 = prototypesByTypeId[typeId];
    var clazz = cggl.maybeGetClassLiteralFromPlaceHolder(prototype_0);
    if (prototype_0 && !clazz) {
      _ = prototype_0;
    } else {
      _ = cggl.createSubclassPrototype(superTypeIdOrPrototype);
      _.castableTypeMap = castableTypeMap;
      if (!superTypeIdOrPrototype) {
        _.typeMarker = typeMarkerFn;
      }
      prototypesByTypeId[typeId] = _;
    }
    for (var i = 3; i < arguments.length; ++i) {
      arguments[i].prototype = _;
    }
    if (clazz) {
      _.___clazz = clazz;
    }
  }
  cggl.createSubclassPrototype = function createSubclassPrototype(superTypeIdOrPrototype) {
    var superPrototype = superTypeIdOrPrototype && superTypeIdOrPrototype.prototype;
    if (!superPrototype) {
      superPrototype = prototypesByTypeId_0[superTypeIdOrPrototype];
    }
    return cggl.portableObjCreate(superPrototype);
  };
  function copyObjectProperties(from, to) {
    for (var property in from) {
      if (to[property] === void 0) {
        to[property] = from[property];
      }
    }
  }
  function bootstrap() {
    prototypesByTypeId_0 = {};
  }
  $wnd.goog = $wnd.goog || {};
  $wnd.goog.global = $wnd.goog.global || $wnd;
  bootstrap();
  jl.$clinit_Object = function $clinit_Object() {
    jl.$clinit_Object = emptyMethod;
  };
  jl.$$init = function $$init(this$static) {
  };
  jl.$equals = function $equals(this$static, other) {
    return maskUndefined(this$static) === maskUndefined(other);
  };
  jl.$finalize = function $finalize(this$static) {
  };
  jl.$getClass = function $getClass(this$static) {
    return this$static.___clazz;
  };
  jl.$hashCode = function $hashCode(this$static) {
    return ji2.getObjectIdentityHashCode(this$static);
  };
  jl.$init__V__devirtual$ = function $init__V__devirtual$(this$static) {
    return instanceOfString(this$static) ? jl.$$init_2(this$static) : instanceOfDouble(this$static) ? jl.$$init_1(this$static) : instanceOfBoolean(this$static) ? jl.$$init_0(this$static) : hasJavaObjectVirtualDispatch(this$static) ? this$static.$init() : jl.$$init(this$static);
  };
  function Object_0() {
    jl.$clinit_Object();
    jl.$init__V__devirtual$(this);
  }
  jl.equals_Ljava_lang_Object__Z__devirtual$ = function equals_Ljava_lang_Object__Z__devirtual$(this$static, other) {
    jl.$clinit_Object();
    return instanceOfString(this$static) ? jl.$equals_3(this$static, other) : instanceOfDouble(this$static) ? jl.$equals_2(this$static, other) : instanceOfBoolean(this$static) ? jl.$equals_1(this$static, other) : hasJavaObjectVirtualDispatch(this$static) ? this$static.equals_0(other) : isJavaArray(this$static) ? jl.$equals(this$static, other) : cggcc.$equals_0(this$static, other);
  };
  jl.finalize__V__devirtual$ = function finalize__V__devirtual$(this$static) {
    return instanceOfString(this$static) ? jl.$finalize(this$static) : instanceOfDouble(this$static) ? jl.$finalize(this$static) : instanceOfBoolean(this$static) ? jl.$finalize(this$static) : hasJavaObjectVirtualDispatch(this$static) ? this$static.finalize() : jl.$finalize(this$static);
  };
  jl.getClass__Ljava_lang_Class___devirtual$ = function getClass__Ljava_lang_Class___devirtual$(this$static) {
    jl.$clinit_Object();
    return instanceOfString(this$static) ? jl.$getClass_3(this$static) : instanceOfDouble(this$static) ? jl.$getClass_2(this$static) : instanceOfBoolean(this$static) ? jl.$getClass_1(this$static) : hasJavaObjectVirtualDispatch(this$static) ? this$static.___clazz : isJavaArray(this$static) ? jl.$getClass(this$static) : cggcc.$getClass_0(this$static);
  };
  jl.hashCode__I__devirtual$ = function hashCode__I__devirtual$(this$static) {
    jl.$clinit_Object();
    return instanceOfString(this$static) ? jl.$hashCode_3(this$static) : instanceOfDouble(this$static) ? jl.$hashCode_2(this$static) : instanceOfBoolean(this$static) ? jl.$hashCode_1(this$static) : hasJavaObjectVirtualDispatch(this$static) ? this$static.hashCode_1() : isJavaArray(this$static) ? jl.$hashCode(this$static) : cggcc.$hashCode_0(this$static);
  };
  jl.toString_2 = function toString_2(object) {
    jl.$clinit_Object();
    return jl.getClass__Ljava_lang_Class___devirtual$(object).getName_0() + "@" + toHexString(jl.hashCode__I__devirtual$(object));
  };
  defineClass(1, null, { 1: 1 }, Object_0);
  _.$init = function $init() {
    jl.$$init(this);
  };
  _.equals_0 = function equals(other) {
    return jl.$equals(this, other);
  };
  _.finalize = function finalize() {
    jl.$finalize(this);
  };
  _.getClass_0 = function getClass_0() {
    return jl.$getClass(this);
  };
  _.hashCode_1 = function hashCode_0() {
    return jl.$hashCode(this);
  };
  _.toString_0 = function toString_1() {
    return jl.toString_2(this);
  };
  _.equals = function(other) {
    return this.equals_0(other);
  };
  _.hashCode = function() {
    return this.hashCode_1();
  };
  _.toString = function() {
    return this.toString_0();
  };
  cggcc.$clinit_GWT = function $clinit_GWT() {
    cggcc.$clinit_GWT = emptyMethod;
    jl.$clinit_Object();
  };
  function create_0(classLiteral) {
    cggcc.$clinit_GWT();
    return cggcs.createImpl(classLiteral);
  }
  function getModuleName() {
    cggcc.$clinit_GWT();
    return getModuleName_0();
  }
  function getUncaughtExceptionHandler() {
    cggcc.$clinit_GWT();
    return uncaughtExceptionHandler;
  }
  function isClient() {
    cggcc.$clinit_GWT();
    return true;
  }
  function isScript() {
    cggcc.$clinit_GWT();
    return true;
  }
  function reportUncaughtException(e) {
    cggcc.$clinit_GWT();
    reportUncaughtException_0(e);
  }
  defineClass(504, 1, { 1: 1 });
  var HOSTED_MODE_PERMUTATION_STRONG_NAME = "HostedMode";
  var uncaughtExceptionHandler = null;
  ji.$clinit_Serializable = function $clinit_Serializable() {
    ji.$clinit_Serializable = emptyMethod;
  };
  function $isInstance(instance) {
    ji.$clinit_Serializable();
    var type_0;
    if (jsEquals(instance, null)) {
      return false;
    }
    type_0 = typeof instance;
    return jl.equals_Ljava_lang_Object__Z__devirtual$_2(type_0, "boolean") || jl.equals_Ljava_lang_Object__Z__devirtual$_2(type_0, "number") || jl.equals_Ljava_lang_Object__Z__devirtual$_2(type_0, "string") || instance.$implements__java_io_Serializable || Array.isArray(instance);
  }
  jl.$clinit_Throwable = function $clinit_Throwable() {
    jl.$clinit_Throwable = emptyMethod;
    jl.$clinit_Object();
  };
  jl.Throwable = function Throwable() {
    jl.$clinit_Throwable();
    Object_0.call(this);
    this.$init_83();
    this.fillInStackTrace();
    this.initializeBackingError();
  };
  function Throwable_0(backingJsObject) {
    jl.$clinit_Throwable();
    Object_0.call(this);
    this.$init_83();
    this.fillInStackTrace();
    this.setBackingJsObject(backingJsObject);
    this.detailMessage = valueOf_20(backingJsObject);
  }
  jl.Throwable_1 = function Throwable_1(message) {
    jl.$clinit_Throwable();
    Object_0.call(this);
    this.$init_83();
    this.detailMessage = message;
    this.fillInStackTrace();
    this.initializeBackingError();
  };
  jl.Throwable_2 = function Throwable_2(message, cause) {
    jl.$clinit_Throwable();
    Object_0.call(this);
    this.$init_83();
    this.cause_0 = cause;
    this.detailMessage = message;
    this.fillInStackTrace();
    this.initializeBackingError();
  };
  jl.Throwable_3 = function Throwable_3(message, cause, enableSuppression, writableStackTrace) {
    Object_0.call(this);
    this.$init_83();
    this.cause_0 = cause;
    this.detailMessage = message;
    this.writableStackTrace = writableStackTrace;
    this.disableSuppression = !enableSuppression;
    if (writableStackTrace) {
      this.fillInStackTrace();
    }
    this.initializeBackingError();
  };
  jl.Throwable_4 = function Throwable_4(cause) {
    jl.$clinit_Throwable();
    Object_0.call(this);
    this.$init_83();
    this.detailMessage = isNull(cause) ? null : cause.toString_0();
    this.cause_0 = cause;
    this.fillInStackTrace();
    this.initializeBackingError();
  };
  jl.fixIE = function fixIE(e) {
    if (!("stack" in e)) {
      try {
        throw e;
      } catch (ignored) {
      }
    }
    return e;
  };
  function of(e) {
    jl.$clinit_Throwable();
    var throwable;
    if (jsNotEquals(e, null)) {
      throwable = castToUnknownNative(e).__java$exception;
      if (isNotNull(throwable)) {
        return throwable;
      }
    }
    return instanceOfNative(e, TypeError) ? new jl.NullPointerException_0(e) : new jl.JsException_0(e);
  }
  defineClass(18, 1, { 4: 1, 1: 1, 18: 1 });
  _.$init_83 = function $init_83() {
    this.stackTrace = initUnidimensionalArray(cggl.Ljava_lang_StackTraceElement_2_classLit, { 4: 1, 1: 1, 7: 1 }, 74, 0, 0, 1);
    this.writableStackTrace = true;
    this.backingJsObject = UNINITIALIZED;
  };
  _.addSuppressed = function addSuppressed(exception) {
    ji2.checkNotNull_1(exception, "Cannot suppress a null exception.");
    ji2.checkCriticalArgument_1(jsNotEquals(exception, this), "Exception can not suppress itself.");
    if (this.disableSuppression) {
      return;
    }
    if (jsEquals(this.suppressedExceptions, null)) {
      this.suppressedExceptions = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Throwable_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 18, 0, [exception]);
    } else {
      setCheck(this.suppressedExceptions, this.suppressedExceptions.length, exception);
    }
  };
  _.captureStackTrace = function captureStackTrace() {
    cggcci.captureStackTrace_0(this);
  };
  _.constructJavaStackTrace = function constructJavaStackTrace() {
    return cggcci.constructJavaStackTrace_0(this);
  };
  _.createError = function createError(msg) {
    return new Error(msg);
  };
  _.fillInStackTrace = function fillInStackTrace() {
    if (this.writableStackTrace) {
      if (maskUndefined(this.backingJsObject) !== maskUndefined(UNINITIALIZED)) {
        this.initializeBackingError();
      }
      this.stackTrace = null;
    }
    return this;
  };
  _.getBackingJsObject = function getBackingJsObject() {
    return this.backingJsObject;
  };
  _.getBackingSuppressed = function getBackingSuppressed() {
    var i, result, suppressed;
    suppressed = this.getSuppressed();
    result = initUnidimensionalArray(cggl.Ljava_lang_Object_2_classLit, { 4: 1, 1: 1, 7: 1 }, 1, suppressed.length, 5, 1);
    for (i = 0; i < suppressed.length; i++) {
      setCheck(result, i, suppressed[i].backingJsObject);
    }
    return result;
  };
  _.getCause = function getCause() {
    return this.cause_0;
  };
  _.getLocalizedMessage = function getLocalizedMessage() {
    return this.getMessage();
  };
  _.getMessage = function getMessage() {
    return this.detailMessage;
  };
  _.getStackTrace = function getStackTrace() {
    if (jsEquals(this.stackTrace, null)) {
      this.stackTrace = this.constructJavaStackTrace();
    }
    return this.stackTrace;
  };
  _.getSuppressed = function getSuppressed() {
    if (jsEquals(this.suppressedExceptions, null)) {
      this.suppressedExceptions = initUnidimensionalArray(cggl.Ljava_lang_Throwable_2_classLit, { 4: 1, 1: 1, 7: 1 }, 18, 0, 0, 1);
    }
    return this.suppressedExceptions;
  };
  _.initCause = function initCause(cause) {
    ji2.checkState_0(isNull(this.cause_0), "Can't overwrite cause");
    ji2.checkCriticalArgument_1(jsNotEquals(cause, this), "Self-causation not permitted");
    this.cause_0 = cause;
    return this;
  };
  _.initializeBackingError = function initializeBackingError() {
    this.setBackingJsObject(jl.fixIE(this.createError(this.toString_1(this.detailMessage))));
    this.captureStackTrace();
  };
  _.linkBack = function linkBack(error) {
    if (error instanceof Object) {
      try {
        error.__java$exception = this;
        if (navigator2.userAgent.toLowerCase().indexOf("msie") != -1 && $doc.documentMode < 9) {
          return;
        }
        var throwable = this;
        Object.defineProperties(error, { cause: {
          get: function() {
            var cause = throwable.getCause();
            return cause && cause.getBackingJsObject();
          }
        }, suppressed: {
          get: function() {
            return throwable.getBackingSuppressed();
          }
        } });
      } catch (ignored) {
      }
    }
  };
  _.printStackTrace = function printStackTrace() {
    this.printStackTrace_0((jl.$clinit_System(), jl.err));
  };
  _.printStackTrace_0 = function printStackTrace_0(out) {
    this.printStackTraceImpl(out, "", "");
  };
  _.printStackTraceImpl = function printStackTraceImpl(out, prefix, ident) {
    var t, t$array, t$index, t$max, theCause;
    out.println_0(ident + ("" + prefix) + this);
    this.printStackTraceItems(out, ident);
    for (t$array = this.getSuppressed(), t$index = 0, t$max = t$array.length; t$index < t$max; ++t$index) {
      t = t$array[t$index];
      t.printStackTraceImpl(out, "Suppressed: ", "	" + ident);
    }
    theCause = this.getCause();
    if (isNotNull(theCause)) {
      theCause.printStackTraceImpl(out, "Caused by: ", ident);
    }
  };
  _.printStackTraceItems = function printStackTraceItems(out, ident) {
    var element, element$array, element$index, element$max;
    for (element$array = this.getStackTrace(), element$index = 0, element$max = element$array.length; element$index < element$max; ++element$index) {
      element = element$array[element$index];
      out.println_0(ident + "	at " + element);
    }
  };
  _.privateInitError = function privateInitError(error) {
  };
  _.setBackingJsObject = function setBackingJsObject(backingJsObject) {
    this.backingJsObject = backingJsObject;
    this.linkBack(backingJsObject);
  };
  _.setStackTrace = function setStackTrace(stackTrace) {
    var copy, i, length_0;
    length_0 = stackTrace.length;
    copy = initUnidimensionalArray(cggl.Ljava_lang_StackTraceElement_2_classLit, { 4: 1, 1: 1, 7: 1 }, 74, length_0, 0, 1);
    for (i = 0; i < length_0; ++i) {
      copy[i] = castTo(ji2.checkNotNull_0(stackTrace[i]), 74);
    }
    this.stackTrace = copy;
  };
  _.toString_0 = function toString_15() {
    return this.toString_1(this.getLocalizedMessage());
  };
  _.toString_1 = function toString_16(message) {
    var className;
    className = jl.getClass__Ljava_lang_Class___devirtual$(this).getName_0();
    return jsEquals(message, null) ? className : className + ": " + message;
  };
  _.disableSuppression = false;
  _.writableStackTrace = false;
  var UNINITIALIZED = "__noinit__";
  jl.$clinit_Exception = function $clinit_Exception() {
    jl.$clinit_Exception = emptyMethod;
    jl.$clinit_Throwable();
  };
  jl.Exception = function Exception() {
    jl.$clinit_Exception();
    jl.Throwable.call(this);
    this.$init_84();
  };
  jl.Exception_0 = function Exception_0(backingJsObject) {
    jl.$clinit_Exception();
    Throwable_0.call(this, backingJsObject);
    this.$init_84();
  };
  jl.Exception_1 = function Exception_1(message) {
    jl.$clinit_Exception();
    jl.Throwable_1.call(this, message);
    this.$init_84();
  };
  jl.Exception_2 = function Exception_2(message, cause) {
    jl.$clinit_Exception();
    jl.Throwable_2.call(this, message, cause);
    this.$init_84();
  };
  jl.Exception_3 = function Exception_3(cause) {
    jl.$clinit_Exception();
    jl.Throwable_4.call(this, cause);
    this.$init_84();
  };
  defineClass(12, 18, { 4: 1, 12: 1, 1: 1, 18: 1 }, jl.Exception_1);
  _.$init_84 = function $init_84() {
  };
  jl.$clinit_RuntimeException = function $clinit_RuntimeException() {
    jl.$clinit_RuntimeException = emptyMethod;
    jl.$clinit_Exception();
  };
  jl.RuntimeException = function RuntimeException() {
    jl.$clinit_RuntimeException();
    jl.Exception.call(this);
    this.$init_85();
  };
  jl.RuntimeException_0 = function RuntimeException_0(backingJsObject) {
    jl.$clinit_RuntimeException();
    jl.Exception_0.call(this, backingJsObject);
    this.$init_85();
  };
  jl.RuntimeException_1 = function RuntimeException_1(message) {
    jl.$clinit_RuntimeException();
    jl.Exception_1.call(this, message);
    this.$init_85();
  };
  jl.RuntimeException_2 = function RuntimeException_2(message, cause) {
    jl.$clinit_RuntimeException();
    jl.Exception_2.call(this, message, cause);
    this.$init_85();
  };
  defineClass(23, 12, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 });
  _.$init_85 = function $init_85() {
  };
  jl.$clinit_JsException = function $clinit_JsException() {
    jl.$clinit_JsException = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  jl.JsException = function JsException() {
    jl.$clinit_JsException();
    jl.RuntimeException.call(this);
    this.$init_213();
  };
  jl.JsException_0 = function JsException_0(backingJsObject) {
    jl.$clinit_JsException();
    jl.RuntimeException_0.call(this, backingJsObject);
    this.$init_213();
    this.backingJsObject_0 = backingJsObject;
  };
  jl.JsException_1 = function JsException_1(msg) {
    jl.$clinit_JsException();
    jl.RuntimeException_1.call(this, msg);
    this.$init_213();
  };
  defineClass(153, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, jl.JsException_0);
  _.$init_213 = function $init_213() {
    this.backingJsObject_0 = jl.UNINITIALIZED_0;
  };
  _.privateInitError = function privateInitError_0(error) {
    getClassPrototype(18).privateInitError.call(this, maskUndefined(this.backingJsObject_0) === maskUndefined(jl.UNINITIALIZED_0) ? error : this.backingJsObject_0);
  };
  jl.UNINITIALIZED_0 = "__noinit__";
  cggcci.$clinit_JavaScriptExceptionBase = function $clinit_JavaScriptExceptionBase() {
    cggcci.$clinit_JavaScriptExceptionBase = emptyMethod;
    jl.$clinit_JsException();
  };
  cggcci.JavaScriptExceptionBase = function JavaScriptExceptionBase(e) {
    cggcci.$clinit_JavaScriptExceptionBase();
    jl.JsException_0.call(this, e);
    this.$init_214();
  };
  defineClass(416, 153, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 });
  _.$init_214 = function $init_214() {
  };
  cggcc.$clinit_JavaScriptException = function $clinit_JavaScriptException() {
    cggcc.$clinit_JavaScriptException = emptyMethod;
    cggcci.$clinit_JavaScriptExceptionBase();
    cggcc.NOT_SET_0 = new Object_0();
  };
  cggcc.JavaScriptException = function JavaScriptException(e) {
    cggcc.$clinit_JavaScriptException();
    cggcc.JavaScriptException_0.call(this, e, "");
  };
  cggcc.JavaScriptException_0 = function JavaScriptException_0(e, description) {
    cggcci.JavaScriptExceptionBase.call(this, e);
    this.$init_215();
    this.e = e;
    this.description = description;
  };
  cggcc.getExceptionDescription = function getExceptionDescription(e) {
    if (instanceOfJso(e)) {
      return cggcc.getExceptionDescription0(castToJso(e));
    } else {
      return e + "";
    }
  };
  cggcc.getExceptionDescription0 = function getExceptionDescription0(e) {
    return e == null ? null : e.message;
  };
  cggcc.getExceptionName = function getExceptionName(e) {
    if (jsEquals(e, null)) {
      return "null";
    } else if (instanceOfJso(e)) {
      return cggcc.getExceptionName0(castToJso(e));
    } else if (instanceOfString(e)) {
      return "String";
    } else {
      return jl.getClass__Ljava_lang_Class___devirtual$(e).getName_0();
    }
  };
  cggcc.getExceptionName0 = function getExceptionName0(e) {
    return e == null ? null : e.name;
  };
  defineClass(159, 416, { 159: 1, 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, cggcc.JavaScriptException);
  _.$init_215 = function $init_215() {
    this.description = "";
  };
  _.ensureInit = function ensureInit() {
    var exception;
    if (jsEquals(this.message_0, null)) {
      exception = this.getThrown();
      this.name_0 = cggcc.getExceptionName(exception);
      this.description = this.description + ": " + cggcc.getExceptionDescription(exception);
      this.message_0 = "(" + this.name_0 + ") " + this.description;
    }
  };
  _.getMessage = function getMessage_1() {
    this.ensureInit();
    return this.message_0;
  };
  _.getName_0 = function getName_7() {
    this.ensureInit();
    return this.name_0;
  };
  _.getThrown = function getThrown() {
    return maskUndefined(this.e) === maskUndefined(cggcc.NOT_SET_0) ? null : this.e;
  };
  cggcc.$clinit_JavaScriptObject = function $clinit_JavaScriptObject() {
    cggcc.$clinit_JavaScriptObject = emptyMethod;
    jl.$clinit_Object();
  };
  cggcc.$cast = function $cast(this$static) {
    cggcc.$clinit_JavaScriptObject();
    return this$static;
  };
  cggcc.$equals_0 = function $equals_0(this$static, other) {
    cggcc.$clinit_JavaScriptObject();
    if (!isClient()) {
      return getClassPrototype(1).equals_0.call(this$static, other);
    }
    return cggcc.hasEquals(this$static) ? cggcc.callEquals(this$static, other) : getClassPrototype(1).equals_0.call(this$static, other);
  };
  cggcc.$getClass_0 = function $getClass_0(this$static) {
    cggcc.$clinit_JavaScriptObject();
    return getClass_1(this$static);
  };
  cggcc.$hashCode_0 = function $hashCode_0(this$static) {
    cggcc.$clinit_JavaScriptObject();
    if (!isClient()) {
      return getClassPrototype(1).hashCode_1.call(this$static);
    }
    return cggcc.hasHashCode(this$static) ? cggcc.callHashCode(this$static) : getClassPrototype(1).hashCode_1.call(this$static);
  };
  cggcc.callEquals = function callEquals(thisObject, thatObject) {
    return thisObject.equals(thatObject);
  };
  cggcc.callHashCode = function callHashCode(object) {
    return object.hashCode();
  };
  cggcc.createArray = function createArray() {
    cggcc.$clinit_JavaScriptObject();
    return [];
  };
  function createObject_0() {
    cggcc.$clinit_JavaScriptObject();
    return {};
  }
  cggcc.hasEquals = function hasEquals(object) {
    return !!object && !!object.equals;
  };
  cggcc.hasHashCode = function hasHashCode(object) {
    return !!object && !!object.hashCode;
  };
  cggcc.toStringSimple = function toStringSimple(obj) {
    return obj.toString ? obj.toString() : "[JavaScriptObject]";
  };
  cggcc.toStringVerbose = function toStringVerbose(obj) {
    var defined = function(m) {
      return typeof m != "undefined";
    };
    var strip = function(s) {
      return s.replace(/\r\n/g, "");
    };
    if (defined(obj.outerHTML))
      return strip(obj.outerHTML);
    if (defined(obj.innerHTML) && obj.cloneNode) {
      $doc.createElement("div").appendChild(obj.cloneNode(true)).innerHTML;
    }
    if (defined(obj.nodeType) && obj.nodeType == 3) {
      return "'" + obj.data.replace(/ /g, "\u25AB").replace(/\u00A0/, "\u25AA") + "'";
    }
    if (typeof defined(obj.htmlText) && obj.collapse) {
      var html = obj.htmlText;
      if (html) {
        return "IETextRange [" + strip(html) + "]";
      } else {
        var dup = obj.duplicate();
        dup.pasteHTML("|");
        var out = "IETextRange " + strip(obj.parentElement().outerHTML);
        dup.moveStart("character", -1);
        dup.pasteHTML("");
        return out;
      }
    }
    return obj.toString ? obj.toString() : "[JavaScriptObject]";
  };
  cggcci.$clinit_StackTraceCreator = function $clinit_StackTraceCreator() {
    cggcci.$clinit_StackTraceCreator = emptyMethod;
    var c, enforceLegacy;
    jl.$clinit_Object();
    cggcci.LINE_NUMBER_UNKNOWN = -1;
    {
      enforceLegacy = !cggcci.supportsErrorStack();
      c = castTo(new cggcci.StackTraceCreator$CollectorModernNoSourceMap(), 180);
      cggcci.collector_1 = instanceOf(c, 181) && enforceLegacy ? new cggcci.StackTraceCreator$CollectorLegacy() : c;
    }
  };
  cggcci.captureStackTrace_0 = function captureStackTrace_0(error) {
    cggcci.$clinit_StackTraceCreator();
    cggcci.collector_1.collect(error);
  };
  cggcci.constructJavaStackTrace_0 = function constructJavaStackTrace_0(thrown) {
    cggcci.$clinit_StackTraceCreator();
    var stackTrace;
    stackTrace = cggcci.collector_1.getStackTrace_0(thrown);
    return cggcci.dropInternalFrames(stackTrace);
  };
  cggcci.dropInternalFrames = function dropInternalFrames(stackTrace) {
    var dropFrameUntilFnName, dropFrameUntilFnName2, i, numberOfFramesToSearch;
    dropFrameUntilFnName = "captureStackTrace_0";
    dropFrameUntilFnName2 = "initializeBackingError";
    numberOfFramesToSearch = $wnd.Math.min(stackTrace.length, 5);
    for (i = numberOfFramesToSearch - 1; i >= 0; i--) {
      if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(stackTrace[i].getMethodName(), dropFrameUntilFnName) || jl.equals_Ljava_lang_Object__Z__devirtual$_2(stackTrace[i].getMethodName(), dropFrameUntilFnName2)) {
        cggcci.splice(stackTrace, i + 1);
        break;
      }
    }
    return stackTrace;
  };
  cggcci.extractFunctionName = function extractFunctionName(fnName) {
    var fnRE = /function(?:\s+([\w$]+))?\s*\(/;
    var match_0 = fnRE.exec(fnName);
    return match_0 && match_0[1] || "anonymous";
  };
  cggcci.getFnStack = function getFnStack(e) {
    cggcci.$clinit_StackTraceCreator();
    return e && e["fnStack"] ? e["fnStack"] : [];
  };
  cggcci.getFunctionName = function getFunctionName(fn) {
    cggcci.$clinit_StackTraceCreator();
    return fn.name || (fn.name = cggcci.extractFunctionName(fn.toString()));
  };
  cggcci.parseInt_1 = function parseInt_1(number) {
    cggcci.$clinit_StackTraceCreator();
    return parseInt(number) || -1;
  };
  cggcci.splice = function splice(arr, length_0) {
    if (arr.length >= length_0) {
      ji2.removeFrom(arr, 0, length_0);
    }
  };
  cggcci.split_0 = function split_0(t) {
    cggcci.$clinit_StackTraceCreator();
    var e = t.backingJsObject;
    if (e && e.stack) {
      var stack_0 = e.stack;
      var toString_0 = e + "\n";
      if (stack_0.substring(0, toString_0.length) == toString_0) {
        stack_0 = stack_0.substring(toString_0.length);
      }
      return stack_0.split("\n");
    }
    return [];
  };
  cggcci.supportsErrorStack = function supportsErrorStack() {
    if (Error.stackTraceLimit > 0) {
      $wnd.Error.stackTraceLimit = Error.stackTraceLimit = 64;
      return true;
    }
    return "stack" in new Error();
  };
  defineClass(636, 1, { 1: 1 });
  cggcci.ANONYMOUS = "anonymous";
  cggcci.DROP_FRAME_LIMIT = 5;
  cggcci.LINE_NUMBER_UNKNOWN = 0;
  cggcci.UNKNOWN_0 = "Unknown";
  cggcci.$clinit_StackTraceCreator$Collector = function $clinit_StackTraceCreator$Collector() {
    cggcci.$clinit_StackTraceCreator$Collector = emptyMethod;
    jl.$clinit_Object();
  };
  cggcci.StackTraceCreator$Collector = function StackTraceCreator$Collector() {
    cggcci.$clinit_StackTraceCreator$Collector();
    Object_0.call(this);
    this.$init_235();
  };
  defineClass(180, 1, { 1: 1 });
  _.$init_235 = function $init_235() {
  };
  cggcci.$clinit_StackTraceCreator$CollectorLegacy = function $clinit_StackTraceCreator$CollectorLegacy() {
    cggcci.$clinit_StackTraceCreator$CollectorLegacy = emptyMethod;
    cggcci.$clinit_StackTraceCreator$Collector();
  };
  cggcci.StackTraceCreator$CollectorLegacy = function StackTraceCreator$CollectorLegacy() {
    cggcci.$clinit_StackTraceCreator$CollectorLegacy();
    cggcci.StackTraceCreator$Collector.call(this);
    this.$init_236();
  };
  defineClass(365, 180, { 1: 1 }, cggcci.StackTraceCreator$CollectorLegacy);
  _.$init_236 = function $init_236() {
  };
  _.collect = function collect(error) {
    var seen = {};
    var fnStack = [];
    error["fnStack"] = fnStack;
    var callee = arguments.callee.caller;
    while (callee) {
      var name_0 = cggcci.getFunctionName(callee);
      fnStack.push(name_0);
      var keyName = ":" + name_0;
      var withThisName = seen[keyName];
      if (withThisName) {
        var i, j;
        for (i = 0, j = withThisName.length; i < j; i++) {
          if (withThisName[i] === callee) {
            return;
          }
        }
      }
      (withThisName || (seen[keyName] = [])).push(callee);
      callee = callee.caller;
    }
  };
  _.getStackTrace_0 = function getStackTrace_0(t) {
    var i, length_0, stack_0, stackTrace;
    stack_0 = cggcci.getFnStack(t);
    length_0 = cggcc.$length_0(stack_0);
    stackTrace = initUnidimensionalArray(cggl.Ljava_lang_StackTraceElement_2_classLit, { 4: 1, 1: 1, 7: 1 }, 74, length_0, 0, 1);
    for (i = 0; i < length_0; i++) {
      stackTrace[i] = new jl.StackTraceElement("Unknown", cggcc.$get_0(stack_0, i), null, -1);
    }
    return stackTrace;
  };
  cggcci.$clinit_StackTraceCreator$CollectorModern = function $clinit_StackTraceCreator$CollectorModern() {
    cggcci.$clinit_StackTraceCreator$CollectorModern = emptyMethod;
    cggcci.$clinit_StackTraceCreator$Collector();
  };
  cggcci.StackTraceCreator$CollectorModern = function StackTraceCreator$CollectorModern() {
    cggcci.$clinit_StackTraceCreator$CollectorModern();
    cggcci.StackTraceCreator$Collector.call(this);
    this.$init_237();
  };
  defineClass(181, 180, { 181: 1, 1: 1 });
  _.$init_237 = function $init_237() {
  };
  _.collect = function collect_0(error) {
  };
  _.createSte = function createSte(fileName, method, line, col) {
    return new jl.StackTraceElement("Unknown", method, fileName + "@" + col, line < 0 ? -1 : line);
  };
  _.getStackTrace_0 = function getStackTrace_1(t) {
    var addIndex, i, length_0, stack_0, stackTrace, ste;
    stack_0 = cggcci.split_0(t);
    stackTrace = initUnidimensionalArray(cggl.Ljava_lang_StackTraceElement_2_classLit, { 4: 1, 1: 1, 7: 1 }, 74, 0, 0, 1);
    addIndex = 0;
    length_0 = cggcc.$length_0(stack_0);
    if (length_0 == 0) {
      return stackTrace;
    }
    ste = this.parse_11(cggcc.$get_0(stack_0, 0));
    if (!jl.equals_Ljava_lang_Object__Z__devirtual$_2(ste.getMethodName(), "anonymous")) {
      stackTrace[addIndex++] = ste;
    }
    for (i = 1; i < length_0; i++) {
      stackTrace[addIndex++] = this.parse_11(cggcc.$get_0(stack_0, i));
    }
    return stackTrace;
  };
  _.parse_11 = function parse_12(stString) {
    var closeParen, col, endFileUrlIndex, fileName, ieAnonymousFunctionName, index_0, lastColonIndex, line, location_0, toReturn2;
    location_0 = "";
    if (jl.isEmpty__Z__devirtual$(stString)) {
      return this.createSte("Unknown", "anonymous", -1, -1);
    }
    toReturn2 = jl.trim__Ljava_lang_String___devirtual$(stString);
    if (jl.startsWith_Ljava_lang_String__Z__devirtual$(toReturn2, "at ")) {
      toReturn2 = jl.substring_I_Ljava_lang_String___devirtual$(toReturn2, 3);
    }
    toReturn2 = this.stripSquareBrackets(toReturn2);
    index_0 = jl.indexOf_Ljava_lang_String__I__devirtual$(toReturn2, "(");
    if (index_0 == -1) {
      index_0 = jl.indexOf_Ljava_lang_String__I__devirtual$(toReturn2, "@");
      if (index_0 == -1) {
        location_0 = toReturn2;
        toReturn2 = "";
      } else {
        location_0 = jl.trim__Ljava_lang_String___devirtual$(jl.substring_I_Ljava_lang_String___devirtual$(toReturn2, index_0 + 1));
        toReturn2 = jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(toReturn2, 0, index_0));
      }
    } else {
      closeParen = jl.indexOf_Ljava_lang_String_I_I__devirtual$(toReturn2, ")", index_0);
      location_0 = jl.substring_II_Ljava_lang_String___devirtual$(toReturn2, index_0 + 1, closeParen);
      toReturn2 = jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(toReturn2, 0, index_0));
    }
    index_0 = jl.indexOf_I_I__devirtual$(toReturn2, 46);
    if (index_0 != -1) {
      toReturn2 = jl.substring_I_Ljava_lang_String___devirtual$(toReturn2, index_0 + 1);
    }
    ieAnonymousFunctionName = "Anonymous function";
    if (jl.isEmpty__Z__devirtual$(toReturn2) || jl.equals_Ljava_lang_Object__Z__devirtual$_2(toReturn2, "Anonymous function")) {
      toReturn2 = "anonymous";
    }
    lastColonIndex = jl.lastIndexOf_I_I__devirtual$(location_0, 58);
    endFileUrlIndex = jl.lastIndexOf_II_I__devirtual$(location_0, 58, lastColonIndex - 1);
    line = -1;
    col = -1;
    fileName = "Unknown";
    if (lastColonIndex != -1 && endFileUrlIndex != -1) {
      fileName = jl.substring_II_Ljava_lang_String___devirtual$(location_0, 0, endFileUrlIndex);
      line = cggcci.parseInt_1(jl.substring_II_Ljava_lang_String___devirtual$(location_0, endFileUrlIndex + 1, lastColonIndex));
      col = cggcci.parseInt_1(jl.substring_I_Ljava_lang_String___devirtual$(location_0, lastColonIndex + 1));
    }
    return this.createSte(fileName, toReturn2, line, col);
  };
  _.stripSquareBrackets = function stripSquareBrackets(toReturn2) {
    return toReturn2.replace(/\[.*?\]/g, "");
  };
  cggcci.$clinit_StackTraceCreator$CollectorModernNoSourceMap = function $clinit_StackTraceCreator$CollectorModernNoSourceMap() {
    cggcci.$clinit_StackTraceCreator$CollectorModernNoSourceMap = emptyMethod;
    cggcci.$clinit_StackTraceCreator$CollectorModern();
  };
  cggcci.StackTraceCreator$CollectorModernNoSourceMap = function StackTraceCreator$CollectorModernNoSourceMap() {
    cggcci.$clinit_StackTraceCreator$CollectorModernNoSourceMap();
    cggcci.StackTraceCreator$CollectorModern.call(this);
    this.$init_238();
  };
  defineClass(366, 181, { 180: 1, 181: 1, 1: 1 }, cggcci.StackTraceCreator$CollectorModernNoSourceMap);
  _.$init_238 = function $init_238() {
  };
  _.createSte = function createSte_0(fileName, method, line, col) {
    return new jl.StackTraceElement("Unknown", method, fileName, -1);
  };
  cggl.$clinit_Array = function $clinit_Array() {
    cggl.$clinit_Array = emptyMethod;
    jl.$clinit_Object();
  };
  cggl.Array_0 = function Array_0() {
    Object_0.call(this);
    this.$init_240();
  };
  cggl.asArray = function asArray(array) {
    return array;
  };
  cggl.canSet = function canSet(array, value_0) {
    switch (cggl.getElementTypeCategory(array)) {
      case 6:
        return instanceOfString(value_0);
      case 7:
        return instanceOfDouble(value_0);
      case 8:
        return instanceOfBoolean(value_0);
      case 3:
        return instanceOfArray(value_0);
      case 11:
        return instanceOfFunction(value_0);
      case 12:
        return instanceOfJsObject(value_0);
      case 0:
        return canCast(value_0, cggl.getElementTypeId(array));
      case 2:
        return isJavaScriptObject(value_0);
      case 1:
        return isJavaScriptObject(value_0) || canCast(value_0, cggl.getElementTypeId(array));
      default:
        return true;
    }
  };
  function ensureNotNull(array) {
    cggl.$clinit_Array();
    return ji2.checkNotNull_0(array);
  }
  function getClassLiteralForArray(clazz, dimensions) {
    cggl.$clinit_Array();
    return cggl.getClassLiteralForArrayImpl(clazz, dimensions);
  }
  cggl.getClassLiteralForArrayImpl = function getClassLiteralForArrayImpl(clazz, dimensions) {
    return jl.getClassLiteralForArray_0(clazz, dimensions);
  };
  cggl.getElementTypeCategory = function getElementTypeCategory(array) {
    return array.__elementTypeCategory$ == null ? 10 : array.__elementTypeCategory$;
  };
  cggl.getElementTypeId = function getElementTypeId(array) {
    return array.__elementTypeId$;
  };
  function initMultidimensionalArray(leafClassLiteral, castableTypeMapExprs, elementTypeIds, leafElementTypeCategory, dimExprs, count) {
    cggl.$clinit_Array();
    return cggl.initMultidimensionalArray_0(leafClassLiteral, castableTypeMapExprs, elementTypeIds, leafElementTypeCategory, dimExprs, 0, count);
  }
  cggl.initMultidimensionalArray_0 = function initMultidimensionalArray_0(leafClassLiteral, castableTypeMapExprs, elementTypeIds, leafElementTypeCategory, dimExprs, index_0, count) {
    var elementTypeCategory, i, isLastDimension, length_0, result;
    length_0 = dimExprs[index_0];
    isLastDimension = index_0 == count - 1;
    elementTypeCategory = isLastDimension ? leafElementTypeCategory : 0;
    result = cggl.initializeArrayElementsWithDefaults(elementTypeCategory, length_0);
    if (leafElementTypeCategory != 10) {
      stampJavaTypeInfo(getClassLiteralForArray(leafClassLiteral, count - index_0), castableTypeMapExprs[index_0], elementTypeIds[index_0], elementTypeCategory, result);
    }
    if (!isLastDimension) {
      ++index_0;
      for (i = 0; i < length_0; ++i) {
        cggl.set_6(result, i, cggl.initMultidimensionalArray_0(leafClassLiteral, castableTypeMapExprs, elementTypeIds, leafElementTypeCategory, dimExprs, index_0, count));
      }
    }
    return result;
  };
  function initUnidimensionalArray(leafClassLiteral, castableTypeMap, elementTypeId, length_0, elementTypeCategory, dimensions) {
    cggl.$clinit_Array();
    var result;
    result = cggl.initializeArrayElementsWithDefaults(elementTypeCategory, length_0);
    if (elementTypeCategory != 10) {
      stampJavaTypeInfo(getClassLiteralForArray(leafClassLiteral, dimensions), castableTypeMap, elementTypeId, elementTypeCategory, result);
    }
    return result;
  }
  cggl.initializeArrayElementsWithDefaults = function initializeArrayElementsWithDefaults(elementTypeCategory, length_0) {
    var array = new Array(length_0);
    var initValue;
    switch (elementTypeCategory) {
      case 14:
      case 15:
        initValue = 0;
        break;
      case 16:
        initValue = false;
        break;
      default:
        return array;
    }
    for (var i = 0; i < length_0; ++i) {
      array[i] = initValue;
    }
    return array;
  };
  function isJavaArray(src_0) {
    cggl.$clinit_Array();
    return isArray(src_0) && hasTypeMarker(src_0);
  }
  function isPrimitiveArray(array) {
    cggl.$clinit_Array();
    var elementTypeCategory;
    elementTypeCategory = cggl.getElementTypeCategory(array);
    return elementTypeCategory >= 14 && elementTypeCategory <= 16;
  }
  function newArray_0(size_0) {
    cggl.$clinit_Array();
    return new Array(size_0);
  }
  cggl.set_6 = function set_6(array, index_0, value_0) {
    return array[index_0] = value_0;
  };
  function setCheck(array, index_0, value_0) {
    cggl.$clinit_Array();
    ji2.checkArrayType(jsEquals(value_0, null) || cggl.canSet(array, value_0));
    return cggl.set_6(array, index_0, value_0);
  }
  cggl.setClass = function setClass(o, clazz) {
    o.___clazz = clazz;
  };
  cggl.setElementTypeCategory = function setElementTypeCategory(array, elementTypeCategory) {
    array.__elementTypeCategory$ = elementTypeCategory;
  };
  cggl.setElementTypeId = function setElementTypeId(array, elementTypeId) {
    array.__elementTypeId$ = elementTypeId;
  };
  function stampJavaTypeInfo(arrayClass, castableTypeMap, elementTypeId, elementTypeCategory, array) {
    cggl.$clinit_Array();
    cggl.setClass(array, arrayClass);
    setCastableTypeMap(array, castableTypeMap);
    setTypeMarker(array);
    cggl.setElementTypeId(array, elementTypeId);
    cggl.setElementTypeCategory(array, elementTypeCategory);
    return array;
  }
  cggl.stampJavaTypeInfo_0 = function stampJavaTypeInfo_0(array, referenceType) {
    cggl.$clinit_Array();
    if (cggl.getElementTypeCategory(referenceType) != 10) {
      stampJavaTypeInfo(jl.getClass__Ljava_lang_Class___devirtual$(referenceType), getCastableTypeMap(referenceType), cggl.getElementTypeId(referenceType), cggl.getElementTypeCategory(referenceType), array);
    }
    return cggl.asArray(array);
  };
  defineClass(599, 1, { 1: 1 });
  _.$init_240 = function $init_240() {
  };
  var TYPE_ARRAY = 3;
  var TYPE_JAVA_LANG_BOOLEAN = 8;
  var TYPE_JAVA_LANG_DOUBLE = 7;
  var TYPE_JAVA_LANG_OBJECT = 5;
  var TYPE_JAVA_LANG_STRING = 6;
  var TYPE_JAVA_OBJECT = 0;
  var TYPE_JAVA_OBJECT_OR_JSO = 1;
  var TYPE_JSO = 2;
  var TYPE_JSO_ARRAY = 4;
  var TYPE_JS_ARRAY = 13;
  var TYPE_JS_FUNCTION = 11;
  var TYPE_JS_NATIVE = 9;
  var TYPE_JS_OBJECT = 12;
  var TYPE_JS_UNKNOWN_NATIVE = 10;
  var TYPE_PRIMITIVE_BOOLEAN = 16;
  var TYPE_PRIMITIVE_LONG = 14;
  var TYPE_PRIMITIVE_NUMBER = 15;
  cggl.$clinit_Cast = function $clinit_Cast() {
    cggl.$clinit_Cast = emptyMethod;
    jl.$clinit_Object();
  };
  function Cast() {
    Object_0.call(this);
    this.$init_242();
  }
  function canCast(src_0, dstId) {
    cggl.$clinit_Cast();
    if (instanceOfString(src_0)) {
      return !!stringCastMap[dstId];
    } else if (src_0.castableTypeMap) {
      return !!src_0.castableTypeMap[dstId];
    } else if (instanceOfDouble(src_0)) {
      return !!doubleCastMap[dstId];
    } else if (instanceOfBoolean(src_0)) {
      return !!booleanCastMap[dstId];
    }
    return false;
  }
  function canCastClass(srcClazz, dstClass) {
    cggl.$clinit_Cast();
    var srcTypeId = srcClazz.typeId;
    var dstTypeId = dstClass.typeId;
    var prototype_0 = prototypesByTypeId_0[srcTypeId];
    return canCast(prototype_0, dstTypeId);
  }
  function castTo(src_0, dstId) {
    cggl.$clinit_Cast();
    ji2.checkType(jsEquals(src_0, null) || canCast(src_0, dstId));
    return src_0;
  }
  function castToAllowJso(src_0, dstId) {
    cggl.$clinit_Cast();
    ji2.checkType(jsEquals(src_0, null) || isJavaScriptObject(src_0) || canCast(src_0, dstId));
    return src_0;
  }
  function castToArray(src_0) {
    cggl.$clinit_Cast();
    ji2.checkType(jsEquals(src_0, null) || instanceOfArray(src_0));
    return src_0;
  }
  function castToBoolean(src_0) {
    cggl.$clinit_Cast();
    ji2.checkType(jsEquals(src_0, null) || instanceOfBoolean(src_0));
    return src_0;
  }
  function castToDouble(src_0) {
    cggl.$clinit_Cast();
    ji2.checkType(jsEquals(src_0, null) || instanceOfDouble(src_0));
    return src_0;
  }
  function castToFunction(src_0) {
    cggl.$clinit_Cast();
    ji2.checkType(jsEquals(src_0, null) || cggl.isFunction(src_0));
    return src_0;
  }
  function castToJsArray(src_0) {
    cggl.$clinit_Cast();
    ji2.checkType(jsEquals(src_0, null) || instanceOfJsArray(src_0));
    return src_0;
  }
  function castToJsObject(src_0) {
    cggl.$clinit_Cast();
    ji2.checkType(jsEquals(src_0, null) || cggl.isJsObject(src_0));
    return src_0;
  }
  function castToJso(src_0) {
    cggl.$clinit_Cast();
    ji2.checkType(jsEquals(src_0, null) || isJavaScriptObject(src_0));
    return src_0;
  }
  function castToJsoArray(src_0, dstId) {
    cggl.$clinit_Cast();
    ji2.checkType(jsEquals(src_0, null) || instanceOfJsoArray(src_0, dstId));
    return src_0;
  }
  function castToNative(src_0, jsType) {
    cggl.$clinit_Cast();
    ji2.checkType(jsEquals(src_0, null) || cggl.jsinstanceOf(src_0, jsType));
    return src_0;
  }
  function castToString(src_0) {
    cggl.$clinit_Cast();
    ji2.checkType(jsEquals(src_0, null) || instanceOfString(src_0));
    return src_0;
  }
  function castToUnknownNative(src_0) {
    cggl.$clinit_Cast();
    return src_0;
  }
  function charToString(x_0) {
    cggl.$clinit_Cast();
    return String.fromCharCode(x_0);
  }
  function getClass_1(array) {
    cggl.$clinit_Cast();
    return array.___clazz || (Array.isArray(array) && getClassLiteralForArray(cggl.Lcom_google_gwt_core_client_JavaScriptObject_2_classLit, 1) || cggl.Lcom_google_gwt_core_client_JavaScriptObject_2_classLit);
  }
  function hasJavaObjectVirtualDispatch(src_0) {
    cggl.$clinit_Cast();
    return !isArray(src_0) && hasTypeMarker(src_0);
  }
  function instanceOf(src_0, dstId) {
    cggl.$clinit_Cast();
    return jsNotEquals(src_0, null) && canCast(src_0, dstId);
  }
  function instanceOfAllowJso(src_0, dstId) {
    cggl.$clinit_Cast();
    return jsNotEquals(src_0, null) && (isJavaScriptObject(src_0) || canCast(src_0, dstId));
  }
  function instanceOfArray(src_0) {
    cggl.$clinit_Cast();
    return isArray(src_0) && !isPrimitiveArray(src_0);
  }
  function instanceOfBoolean(src_0) {
    cggl.$clinit_Cast();
    return typeof src_0 === "boolean";
  }
  function instanceOfDouble(src_0) {
    cggl.$clinit_Cast();
    return typeof src_0 === "number";
  }
  function instanceOfFunction(src_0) {
    cggl.$clinit_Cast();
    return jsNotEquals(src_0, null) && cggl.isFunction(src_0);
  }
  function instanceOfJsArray(src_0) {
    cggl.$clinit_Cast();
    return isArray(src_0);
  }
  function instanceOfJsObject(src_0) {
    cggl.$clinit_Cast();
    return jsNotEquals(src_0, null) && cggl.isJsObject(src_0);
  }
  function instanceOfJso(src_0) {
    cggl.$clinit_Cast();
    return jsNotEquals(src_0, null) && isJavaScriptObject(src_0);
  }
  function instanceOfJsoArray(src_0, dstId) {
    cggl.$clinit_Cast();
    return canCast(src_0, dstId) || !hasTypeMarker(src_0) && isArray(src_0);
  }
  function instanceOfNative(src_0, jsType) {
    cggl.$clinit_Cast();
    return cggl.jsinstanceOf(src_0, jsType);
  }
  function instanceOfString(src_0) {
    cggl.$clinit_Cast();
    return typeof src_0 === "string";
  }
  function instanceOfUnknownNative(src_0) {
    cggl.$clinit_Cast();
    return jsNotEquals(src_0, null);
  }
  function isArray(src_0) {
    cggl.$clinit_Cast();
    return Array.isArray(src_0);
  }
  cggl.isFunction = function isFunction(src_0) {
    return typeof src_0 === "function";
  };
  function isJavaScriptObject(src_0) {
    cggl.$clinit_Cast();
    return cggl.isJsObjectOrFunction(src_0) && !hasTypeMarker(src_0);
  }
  cggl.isJsObject = function isJsObject(src_0) {
    return typeof src_0 === "object" || typeof src_0 == "function";
  };
  cggl.isJsObjectOrFunction = function isJsObjectOrFunction(src_0) {
    return typeof src_0 === "object" || typeof src_0 === "function";
  };
  function isNotNull(src_0) {
    cggl.$clinit_Cast();
    return !!src_0;
  }
  function isNull(src_0) {
    cggl.$clinit_Cast();
    return !src_0;
  }
  function jsEquals(a, b) {
    cggl.$clinit_Cast();
    return a == b;
  }
  function jsNotEquals(a, b) {
    cggl.$clinit_Cast();
    return a != b;
  }
  cggl.jsinstanceOf = function jsinstanceOf(obj, jsType) {
    return obj && (jsType && obj instanceof jsType);
  };
  function maskUndefined(src_0) {
    cggl.$clinit_Cast();
    return src_0 == null ? null : src_0;
  }
  function narrow_byte(x_0) {
    cggl.$clinit_Cast();
    return x_0 << 24 >> 24;
  }
  function narrow_char(x_0) {
    cggl.$clinit_Cast();
    return x_0 & 65535;
  }
  function narrow_int(x_0) {
    cggl.$clinit_Cast();
    return x_0 | 0;
  }
  function narrow_short(x_0) {
    cggl.$clinit_Cast();
    return x_0 << 16 >> 16;
  }
  function round_byte(x_0) {
    cggl.$clinit_Cast();
    return narrow_byte(round_int(x_0));
  }
  function round_char(x_0) {
    cggl.$clinit_Cast();
    return narrow_char(round_int(x_0));
  }
  function round_int(x_0) {
    cggl.$clinit_Cast();
    return Math.max(Math.min(x_0, 2147483647), -2147483648) | 0;
  }
  function round_short(x_0) {
    cggl.$clinit_Cast();
    return narrow_short(round_int(x_0));
  }
  function throwClassCastExceptionUnlessNull(o) {
    cggl.$clinit_Cast();
    ji2.checkType(jsEquals(o, null));
    return o;
  }
  defineClass(600, 1, { 1: 1 });
  _.$init_242 = function $init_242() {
  };
  var booleanCastMap;
  var doubleCastMap;
  var stringCastMap;
  cggl.$clinit_Exceptions = function $clinit_Exceptions() {
    cggl.$clinit_Exceptions = emptyMethod;
    jl.$clinit_Object();
  };
  function Exceptions() {
    Object_0.call(this);
    this.$init_243();
  }
  function checkNotNull(arg) {
    cggl.$clinit_Exceptions();
    if (arg == null) {
      throw new TypeError("null pointer");
    }
    return arg;
  }
  cggl.getJavaException = function getJavaException(e) {
    return e && e.__java$exception;
  };
  function makeAssertionError() {
    cggl.$clinit_Exceptions();
    return new jl.AssertionError();
  }
  function makeAssertionError_Object(message) {
    cggl.$clinit_Exceptions();
    return new jl.AssertionError_5(message);
  }
  function makeAssertionError_boolean(message) {
    cggl.$clinit_Exceptions();
    return new jl.AssertionError_7(message);
  }
  function makeAssertionError_char(message) {
    cggl.$clinit_Exceptions();
    return new jl.AssertionError_0(message);
  }
  function makeAssertionError_double(message) {
    cggl.$clinit_Exceptions();
    return new jl.AssertionError_1(message);
  }
  function makeAssertionError_float(message) {
    cggl.$clinit_Exceptions();
    return new jl.AssertionError_2(message);
  }
  function makeAssertionError_int(message) {
    cggl.$clinit_Exceptions();
    return new jl.AssertionError_3(message);
  }
  function makeAssertionError_long(message) {
    cggl.$clinit_Exceptions();
    return new jl.AssertionError_4(message);
  }
  function safeClose(resource, mainException) {
    cggl.$clinit_Exceptions();
    var e;
    if (isNull(resource)) {
      return mainException;
    }
    try {
      resource.close_0();
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 18)) {
        e = $e0;
        if (isNull(mainException)) {
          return e;
        }
        mainException.addSuppressed(e);
      } else
        throw toJs($e0);
    }
    return mainException;
  }
  function toJava(e) {
    cggl.$clinit_Exceptions();
    var javaException;
    if (instanceOf(e, 18)) {
      return e;
    }
    javaException = cggl.getJavaException(e);
    if (isNull(javaException)) {
      javaException = new cggcc.JavaScriptException(e);
      cggcci.captureStackTrace_0(javaException);
    }
    return javaException;
  }
  function toJs(t) {
    cggl.$clinit_Exceptions();
    return t.backingJsObject;
  }
  defineClass(602, 1, { 1: 1 });
  _.$init_243 = function $init_243() {
  };
  cggl.$clinit_Util_0 = function $clinit_Util_0() {
    cggl.$clinit_Util_0 = emptyMethod;
    jl.$clinit_Object();
  };
  function Util2() {
    Object_0.call(this);
    this.$init_248();
  }
  function getCastableTypeMap(o) {
    cggl.$clinit_Util_0();
    return o.castableTypeMap;
  }
  function hasTypeMarker(o) {
    cggl.$clinit_Util_0();
    return o.typeMarker === typeMarkerFn;
  }
  function makeEnumName(enumName) {
    cggl.$clinit_Util_0();
    return enumName;
  }
  function setCastableTypeMap(o, castableTypeMap) {
    cggl.$clinit_Util_0();
    o.castableTypeMap = castableTypeMap;
  }
  function setTypeMarker(o) {
    cggl.$clinit_Util_0();
    o.typeMarker = typeMarkerFn;
  }
  defineClass(607, 1, { 1: 1 });
  _.$init_248 = function $init_248() {
  };
  jl.$clinit_ArrayStoreException = function $clinit_ArrayStoreException() {
    jl.$clinit_ArrayStoreException = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  jl.ArrayStoreException = function ArrayStoreException() {
    jl.$clinit_ArrayStoreException();
    jl.RuntimeException.call(this);
    this.$init_277();
  };
  jl.ArrayStoreException_0 = function ArrayStoreException_0(message) {
    jl.$clinit_ArrayStoreException();
    jl.RuntimeException_1.call(this, message);
    this.$init_277();
  };
  defineClass(270, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, jl.ArrayStoreException, jl.ArrayStoreException_0);
  _.$init_277 = function $init_277() {
  };
  jl.$clinit_Error = function $clinit_Error() {
    jl.$clinit_Error = emptyMethod;
    jl.$clinit_Throwable();
  };
  jl.Error_0 = function Error_0() {
    jl.$clinit_Error();
    jl.Throwable.call(this);
    this.$init_278();
  };
  jl.Error_1 = function Error_1(message) {
    jl.$clinit_Error();
    jl.Throwable_1.call(this, message);
    this.$init_278();
  };
  jl.Error_2 = function Error_2(message, cause) {
    jl.$clinit_Error();
    jl.Throwable_2.call(this, message, cause);
    this.$init_278();
  };
  defineClass(122, 18, { 4: 1, 122: 1, 1: 1, 18: 1 });
  _.$init_278 = function $init_278() {
  };
  jl.$clinit_AssertionError = function $clinit_AssertionError() {
    jl.$clinit_AssertionError = emptyMethod;
    jl.$clinit_Error();
  };
  jl.AssertionError = function AssertionError() {
    jl.$clinit_AssertionError();
    jl.Error_0.call(this);
    this.$init_279();
  };
  jl.AssertionError_0 = function AssertionError_0(message) {
    jl.$clinit_AssertionError();
    jl.AssertionError_6.call(this, jl.valueOf_15(message));
  };
  jl.AssertionError_1 = function AssertionError_1(message) {
    jl.$clinit_AssertionError();
    jl.AssertionError_6.call(this, jl.valueOf_16(message));
  };
  jl.AssertionError_2 = function AssertionError_2(message) {
    jl.$clinit_AssertionError();
    jl.AssertionError_6.call(this, jl.valueOf_17(message));
  };
  jl.AssertionError_3 = function AssertionError_3(message) {
    jl.$clinit_AssertionError();
    jl.AssertionError_6.call(this, jl.valueOf_18(message));
  };
  jl.AssertionError_4 = function AssertionError_4(message) {
    jl.$clinit_AssertionError();
    jl.AssertionError_6.call(this, jl.valueOf_19(message));
  };
  jl.AssertionError_5 = function AssertionError_5(message) {
    jl.$clinit_AssertionError();
    jl.Error_2.call(this, valueOf_20(message), instanceOf(message, 18) ? castTo(message, 18) : null);
    this.$init_279();
  };
  jl.AssertionError_6 = function AssertionError_6(message) {
    jl.Error_1.call(this, message);
    this.$init_279();
  };
  jl.AssertionError_7 = function AssertionError_7(message) {
    jl.$clinit_AssertionError();
    jl.AssertionError_6.call(this, jl.valueOf_21(message));
  };
  defineClass(34, 122, { 4: 1, 122: 1, 1: 1, 18: 1 }, jl.AssertionError, jl.AssertionError_0, jl.AssertionError_1, jl.AssertionError_2, jl.AssertionError_3, jl.AssertionError_4, jl.AssertionError_5, jl.AssertionError_7);
  _.$init_279 = function $init_279() {
  };
  jl.$clinit_Comparable = function $clinit_Comparable() {
    jl.$clinit_Comparable = emptyMethod;
  };
  function $isInstance_4(instance) {
    jl.$clinit_Comparable();
    var type_0;
    type_0 = typeof instance;
    if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(type_0, "boolean") || jl.equals_Ljava_lang_Object__Z__devirtual$_2(type_0, "number") || jl.equals_Ljava_lang_Object__Z__devirtual$_2(type_0, "string")) {
      return true;
    }
    return jsNotEquals(instance, null) && instance.$implements__java_lang_Comparable == true;
  }
  jl.$clinit_Boolean = function $clinit_Boolean() {
    jl.$clinit_Boolean = emptyMethod;
    jl.$clinit_Object();
    FALSE_0 = jl.valueOf_6(false);
    TRUE_0 = jl.valueOf_6(true);
    TYPE = cggl.Z_classLit;
  };
  jl.$$init_0 = function $$init_0(this$static) {
  };
  jl.$booleanValue = function $booleanValue(this$static) {
    return ji2.unsafeCastToBoolean(ji2.checkNotNull_0(this$static));
  };
  jl.$compareTo = function $compareTo(this$static, b) {
    return compare_20(jl.booleanValue__Z__devirtual$(this$static), jl.booleanValue__Z__devirtual$(b));
  };
  jl.$compareTo_0 = function $compareTo_0(this$static, b) {
    return jl.compareTo_Ljava_lang_Boolean__I__devirtual$(this$static, castToBoolean(b));
  };
  function $create(x_0) {
    jl.$clinit_Boolean();
    return ji2.uncheckedCast(parseBoolean(x_0));
  }
  jl.$create_0 = function $create_0(x_0) {
    return ji2.uncheckedCast(x_0);
  };
  jl.$equals_1 = function $equals_1(this$static, o) {
    return maskUndefined(ji2.checkNotNull_0(this$static)) === maskUndefined(o);
  };
  jl.$getClass_1 = function $getClass_1(this$static) {
    return cggl.Ljava_lang_Boolean_2_classLit;
  };
  jl.$hashCode_1 = function $hashCode_1(this$static) {
    return jl.hashCode_7(jl.booleanValue__Z__devirtual$(this$static));
  };
  jl.$init__V__devirtual$_0 = function $init__V__devirtual$_0(this$static) {
    return jl.$$init_0(this$static);
  };
  function $isInstance_0(instance) {
    jl.$clinit_Boolean();
    return jl.equals_Ljava_lang_Object__Z__devirtual$_2("boolean", typeof instance);
  }
  function Boolean_0(s) {
    Object_0.call(this);
    jl.$init__V__devirtual$_0(this);
    $create(s);
  }
  jl.Boolean_1 = function Boolean_1(value_0) {
    Object_0.call(this);
    jl.$init__V__devirtual$_0(this);
    jl.$create_0(value_0);
  };
  jl.booleanValue__Z__devirtual$ = function booleanValue__Z__devirtual$(this$static) {
    jl.$clinit_Boolean();
    return jl.$booleanValue(this$static);
  };
  function compare_20(x_0, y_0) {
    jl.$clinit_Boolean();
    return x_0 == y_0 ? 0 : x_0 ? 1 : -1;
  }
  jl.compareTo_Ljava_lang_Boolean__I__devirtual$ = function compareTo_Ljava_lang_Boolean__I__devirtual$(this$static, b) {
    return jl.$compareTo(this$static, b);
  };
  jl.compareTo_Ljava_lang_Object__I__devirtual$ = function compareTo_Ljava_lang_Object__I__devirtual$(this$static, b) {
    return jl.$compareTo_0(this$static, b);
  };
  jl.compareTo_Ljava_lang_Object__I__devirtual$_0 = function compareTo_Ljava_lang_Object__I__devirtual$_0(this$static, other) {
    jl.$clinit_Boolean();
    return instanceOfString(this$static) ? jl.$compareTo_3(this$static, other) : instanceOfDouble(this$static) ? jl.$compareTo_2(this$static, other) : instanceOfBoolean(this$static) ? jl.$compareTo_0(this$static, other) : this$static.compareTo_1(other);
  };
  jl.equals_Ljava_lang_Object__Z__devirtual$_0 = function equals_Ljava_lang_Object__Z__devirtual$_0(this$static, o) {
    return jl.$equals_1(this$static, o);
  };
  jl.getClass__Ljava_lang_Class___devirtual$_0 = function getClass__Ljava_lang_Class___devirtual$_0(this$static) {
    return jl.$getClass_1(this$static);
  };
  jl.hashCode_7 = function hashCode_7(value_0) {
    return value_0 ? 1231 : 1237;
  };
  jl.hashCode__I__devirtual$_0 = function hashCode__I__devirtual$_0(this$static) {
    jl.$clinit_Boolean();
    return jl.$hashCode_1(this$static);
  };
  function logicalAnd(a, b) {
    jl.$clinit_Boolean();
    return a && b;
  }
  function logicalOr(a, b) {
    jl.$clinit_Boolean();
    return a || b;
  }
  function logicalXor(a, b) {
    jl.$clinit_Boolean();
    return a ^ b;
  }
  function parseBoolean(s) {
    jl.$clinit_Boolean();
    return jl.equalsIgnoreCase_Ljava_lang_String__Z__devirtual$("true", s);
  }
  jl.toString_32 = function toString_32(x_0) {
    return jl.valueOf_21(x_0);
  };
  function valueOf_5(s) {
    jl.$clinit_Boolean();
    return jl.valueOf_6(parseBoolean(s));
  }
  jl.valueOf_6 = function valueOf_6(b) {
    return b ? jl.$create_0(true) : jl.$create_0(false);
  };
  booleanCastMap = { 4: 1, 355: 1, 22: 1, 1: 1 };
  var FALSE_0;
  var TRUE_0;
  var TYPE;
  jl.$clinit_CharSequence = function $clinit_CharSequence() {
    jl.$clinit_CharSequence = emptyMethod;
  };
  jl.$chars = function $chars(this$static) {
    return jus.intStream_0(new jl.CharSequence$lambda$0$Type(this$static), 64 | 16384 | 16, false);
  };
  function $isInstance_2(instance) {
    jl.$clinit_CharSequence();
    if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(typeof instance, "string")) {
      return true;
    }
    return jsNotEquals(instance, null) && instance.$implements__java_lang_CharSequence == true;
  }
  jl.$lambda$0 = function $lambda$0(this$static) {
    var it;
    {
      it = new jl.CharSequence$1(this$static);
      return ju.spliterator_12(it, fromInt_0(jl.length__I__devirtual$(this$static)), 16);
    }
  };
  jlr.$clinit_Type = function $clinit_Type() {
    jlr.$clinit_Type = emptyMethod;
  };
  jl.$clinit_Class = function $clinit_Class() {
    jl.$clinit_Class = emptyMethod;
    jl.$clinit_Object();
  };
  jl.Class = function Class() {
    Object_0.call(this);
    this.$init_284();
    this.typeName = null;
    this.simpleName = null;
    this.packageName = null;
    this.compoundName = null;
    this.canonicalName = null;
    this.typeId = null;
    this.arrayLiterals = null;
  };
  jl.createClassObject = function createClassObject(packageName, compoundClassName, typeId) {
    var clazz;
    clazz = new jl.Class();
    if (isClassMetadataEnabled()) {
      clazz.packageName = packageName;
      clazz.compoundName = compoundClassName;
    } else {
      synthesizeClassNamesFromTypeId(clazz, typeId);
    }
    return clazz;
  };
  function createForClass(packageName, compoundClassName, typeId, superclass) {
    jl.$clinit_Class();
    var clazz;
    clazz = jl.createClassObject(packageName, compoundClassName, typeId);
    jl.maybeSetClassLiteral(typeId, clazz);
    clazz.superclass = superclass;
    return clazz;
  }
  function createForEnum(packageName, compoundClassName, typeId, superclass, enumConstantsFunc, enumValueOfFunc) {
    jl.$clinit_Class();
    var clazz;
    clazz = jl.createClassObject(packageName, compoundClassName, typeId);
    jl.maybeSetClassLiteral(typeId, clazz);
    clazz.modifiers = isNotNull(enumConstantsFunc) ? 8 : 0;
    clazz.superclass = clazz.enumSuperclass = superclass;
    clazz.enumConstantsFunc = enumConstantsFunc;
    clazz.enumValueOfFunc = enumValueOfFunc;
    return clazz;
  }
  function createForInterface(packageName, compoundClassName) {
    jl.$clinit_Class();
    var clazz;
    clazz = jl.createClassObject(packageName, compoundClassName, null);
    clazz.modifiers = 2;
    return clazz;
  }
  function createForPrimitive(className, primitiveTypeId) {
    jl.$clinit_Class();
    var clazz;
    clazz = jl.createClassObject("", className, primitiveTypeId);
    clazz.typeId = primitiveTypeId;
    clazz.modifiers = 1;
    return clazz;
  }
  jl.getClassLiteralForArray_0 = function getClassLiteralForArray_0(leafClass, dimensions) {
    jl.$clinit_Class();
    var arrayLiterals = leafClass.arrayLiterals = leafClass.arrayLiterals || [];
    return arrayLiterals[dimensions] || (arrayLiterals[dimensions] = leafClass.createClassLiteralForArray(dimensions));
  };
  function getPrototypeForClass(clazz) {
    jl.$clinit_Class();
    if (clazz.isPrimitive()) {
      return null;
    }
    var typeId = clazz.typeId;
    return prototypesByTypeId_0[typeId];
  }
  jl.initializeNames = function initializeNames(clazz) {
    if (clazz.isArray_0()) {
      var componentType = clazz.componentType;
      if (componentType.isPrimitive()) {
        clazz.typeName = "[" + componentType.typeId;
      } else if (!componentType.isArray_0()) {
        clazz.typeName = "[L" + componentType.getName_0() + ";";
      } else {
        clazz.typeName = "[" + componentType.getName_0();
      }
      clazz.canonicalName = componentType.getCanonicalName() + "[]";
      clazz.simpleName = componentType.getSimpleName() + "[]";
      return;
    }
    var packageName = clazz.packageName;
    var compoundName = clazz.compoundName;
    compoundName = compoundName.split("/");
    clazz.typeName = jl.join_0(".", [packageName, jl.join_0("$", compoundName)]);
    clazz.canonicalName = jl.join_0(".", [packageName, jl.join_0(".", compoundName)]);
    clazz.simpleName = compoundName[compoundName.length - 1];
  };
  function isClassMetadataEnabled() {
    jl.$clinit_Class();
    return false;
  }
  jl.join_0 = function join_0(separator, strings) {
    var i = 0;
    while (!strings[i] || strings[i] == "") {
      i++;
    }
    var result = strings[i++];
    for (; i < strings.length; i++) {
      if (!strings[i] || strings[i] == "") {
        continue;
      }
      result += separator + strings[i];
    }
    return result;
  };
  jl.maybeSetClassLiteral = function maybeSetClassLiteral(typeId, clazz) {
    var proto;
    if (!typeId) {
      return;
    }
    clazz.typeId = typeId;
    var prototype_0 = getPrototypeForClass(clazz);
    if (!prototype_0) {
      prototypesByTypeId_0[typeId] = [clazz];
      return;
    }
    prototype_0.___clazz = clazz;
  };
  function synthesizeClassNamesFromTypeId(clazz, typeId) {
    jl.$clinit_Class();
    clazz.typeName = "Class$" + (!!typeId ? "S" + typeId : "" + clazz.sequentialId);
    clazz.canonicalName = clazz.typeName;
    clazz.simpleName = clazz.typeName;
  }
  defineClass(233, 1, { 1: 1 }, jl.Class);
  _.$init_284 = function $init_284() {
    this.sequentialId = nextSequentialId++;
  };
  _.createClassLiteralForArray = function createClassLiteralForArray(dimensions) {
    var clazz;
    clazz = new jl.Class();
    clazz.modifiers = 4;
    clazz.superclass = cggl.Ljava_lang_Object_2_classLit;
    if (dimensions > 1) {
      clazz.componentType = jl.getClassLiteralForArray_0(this, dimensions - 1);
    } else {
      clazz.componentType = this;
    }
    return clazz;
  };
  _.desiredAssertionStatus = function desiredAssertionStatus() {
    return false;
  };
  _.ensureNamesAreInitialized = function ensureNamesAreInitialized() {
    if (jsNotEquals(this.typeName, null)) {
      return;
    }
    jl.initializeNames(this);
  };
  _.getCanonicalName = function getCanonicalName() {
    this.ensureNamesAreInitialized();
    return this.canonicalName;
  };
  _.getComponentType = function getComponentType() {
    return this.componentType;
  };
  _.getName_0 = function getName_9() {
    this.ensureNamesAreInitialized();
    return this.typeName;
  };
  _.getSimpleName = function getSimpleName() {
    this.ensureNamesAreInitialized();
    return this.simpleName;
  };
  _.isArray_0 = function isArray_0() {
    return (this.modifiers & 4) != 0;
  };
  _.isInterface = function isInterface() {
    return (this.modifiers & 2) != 0;
  };
  _.isPrimitive = function isPrimitive() {
    return (this.modifiers & 1) != 0;
  };
  _.toString_0 = function toString_36() {
    return (this.isInterface() ? "interface " : this.isPrimitive() ? "" : "class ") + ("" + this.getName_0());
  };
  _.modifiers = 0;
  _.sequentialId = 0;
  var ARRAY = 4;
  var ENUM = 8;
  var INTERFACE = 2;
  var PRIMITIVE = 1;
  var nextSequentialId = 1;
  jl.$clinit_ClassCastException = function $clinit_ClassCastException() {
    jl.$clinit_ClassCastException = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  jl.ClassCastException = function ClassCastException(message) {
    jl.$clinit_ClassCastException();
    jl.RuntimeException_1.call(this, message);
    this.$init_285();
  };
  defineClass(362, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, jl.ClassCastException);
  _.$init_285 = function $init_285() {
  };
  jl.$clinit_Number = function $clinit_Number() {
    jl.$clinit_Number = emptyMethod;
    jl.$clinit_Object();
  };
  jl.$init__V__devirtual$_1 = function $init__V__devirtual$_1(this$static) {
    return instanceOfDouble(this$static) ? jl.$$init_1(this$static) : this$static.$init_280();
  };
  jl.$isInstance_1 = function $isInstance_1(instance) {
    jl.$clinit_Number();
    return jl.equals_Ljava_lang_Object__Z__devirtual$_2("number", typeof instance) || instanceOfNative(instance, $wnd.java.lang.Number$impl);
  };
  jl.Number_0 = function Number_0() {
    jl.$clinit_Number();
    Object_0.call(this);
    jl.$init__V__devirtual$_1(this);
  };
  jl.__decodeAndValidateInt = function __decodeAndValidateInt(s, lowerBound, upperBound) {
    var decode;
    decode = jl.__decodeNumberString(s);
    return jl.__parseAndValidateInt(decode.payload, decode.radix, lowerBound, upperBound);
  };
  jl.__decodeNumberString = function __decodeNumberString(s) {
    var negative, radix;
    if (jl.startsWith_Ljava_lang_String__Z__devirtual$(s, "-")) {
      negative = true;
      s = jl.substring_I_Ljava_lang_String___devirtual$(s, 1);
    } else {
      negative = false;
      if (jl.startsWith_Ljava_lang_String__Z__devirtual$(s, "+")) {
        s = jl.substring_I_Ljava_lang_String___devirtual$(s, 1);
      }
    }
    if (jl.startsWith_Ljava_lang_String__Z__devirtual$(s, "0x") || jl.startsWith_Ljava_lang_String__Z__devirtual$(s, "0X")) {
      s = jl.substring_I_Ljava_lang_String___devirtual$(s, 2);
      radix = 16;
    } else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(s, "#")) {
      s = jl.substring_I_Ljava_lang_String___devirtual$(s, 1);
      radix = 16;
    } else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(s, "0")) {
      radix = 8;
    } else {
      radix = 10;
    }
    if (negative) {
      s = "-" + s;
    }
    return new jl.Number$__Decode(radix, s);
  };
  jl.__isValidDouble = function __isValidDouble(str) {
    if (jsEquals(jl.floatRegex, null)) {
      jl.floatRegex = new RegExp("^\\s*[+-]?(NaN|Infinity|((\\d+\\.?\\d*)|(\\.\\d+))([eE][+-]?\\d+)?[dDfF]?)\\s*$");
    }
    return jl.floatRegex.test(str);
  };
  jl.__parseAndValidateDouble = function __parseAndValidateDouble(s) {
    jl.$clinit_Number();
    if (!jl.__isValidDouble(s)) {
      throw toJs(jl.forInputString(s));
    }
    return parseFloat(s);
  };
  jl.__parseAndValidateInt = function __parseAndValidateInt(s, radix, lowerBound, upperBound) {
    jl.$clinit_Number();
    var i, isTooLow, length_0, startIndex, toReturn2;
    if (jsEquals(s, null)) {
      throw toJs(jl.forNullInputString());
    }
    if (radix < 2 || radix > 36) {
      throw toJs(jl.forRadix(radix));
    }
    length_0 = jl.length__I__devirtual$_0(s);
    startIndex = length_0 > 0 && (jl.charAt_I_C__devirtual$_0(s, 0) == 45 || jl.charAt_I_C__devirtual$_0(s, 0) == 43) ? 1 : 0;
    for (i = startIndex; i < length_0; i++) {
      if (digit_0(jl.charAt_I_C__devirtual$_0(s, i), radix) == -1) {
        throw toJs(jl.forInputString(s));
      }
    }
    toReturn2 = parseInt(s, radix);
    isTooLow = toReturn2 < lowerBound;
    if (isNaN(toReturn2)) {
      throw toJs(jl.forInputString(s));
    } else if (isTooLow || toReturn2 > upperBound) {
      throw toJs(jl.forInputString(s));
    }
    return toReturn2;
  };
  jl.__parseAndValidateLong = function __parseAndValidateLong(s, radix) {
    var c, firstTime, head, i, length_0, maxDigits, minValue, negative, orig, radixPower, toReturn2;
    if (jsEquals(s, null)) {
      throw toJs(jl.forNullInputString());
    }
    if (radix < 2 || radix > 36) {
      throw toJs(jl.forRadix(radix));
    }
    orig = s;
    length_0 = jl.length__I__devirtual$_0(s);
    negative = false;
    if (length_0 > 0) {
      c = jl.charAt_I_C__devirtual$_0(s, 0);
      if (c == 45 || c == 43) {
        s = jl.substring_I_Ljava_lang_String___devirtual$(s, 1);
        length_0--;
        negative = c == 45;
      }
    }
    if (length_0 == 0) {
      throw toJs(jl.forInputString(orig));
    }
    while (jl.length__I__devirtual$_0(s) > 0 && jl.charAt_I_C__devirtual$_0(s, 0) == 48) {
      s = jl.substring_I_Ljava_lang_String___devirtual$(s, 1);
      length_0--;
    }
    if (length_0 > (jl.$clinit_Number$__ParseLong(), jl.maxLengthForRadix)[radix]) {
      throw toJs(jl.forInputString(orig));
    }
    for (i = 0; i < length_0; i++) {
      if (digit_0(jl.charAt_I_C__devirtual$_0(s, i), radix) == -1) {
        throw toJs(jl.forInputString(orig));
      }
    }
    toReturn2 = 0;
    maxDigits = (jl.$clinit_Number$__ParseLong(), jl.maxDigitsForRadix)[radix];
    radixPower = fromInt_0((jl.$clinit_Number$__ParseLong(), jl.maxDigitsRadixPower)[radix]);
    minValue = neg_0((jl.$clinit_Number$__ParseLong(), jl.maxValueForRadix)[radix]);
    firstTime = true;
    head = length_0 % maxDigits;
    if (head > 0) {
      toReturn2 = fromInt_0(-parseInt(jl.substring_II_Ljava_lang_String___devirtual$(s, 0, head), radix));
      s = jl.substring_I_Ljava_lang_String___devirtual$(s, head);
      length_0 -= head;
      firstTime = false;
    }
    while (length_0 >= maxDigits) {
      head = parseInt(jl.substring_II_Ljava_lang_String___devirtual$(s, 0, maxDigits), radix);
      s = jl.substring_I_Ljava_lang_String___devirtual$(s, maxDigits);
      length_0 -= maxDigits;
      if (!firstTime) {
        if (lt(toReturn2, minValue)) {
          throw toJs(jl.forInputString(orig));
        }
        toReturn2 = mul_0(toReturn2, radixPower);
      } else {
        firstTime = false;
      }
      toReturn2 = sub_2(toReturn2, fromInt_0(head));
    }
    if (gt(toReturn2, 0)) {
      throw toJs(jl.forInputString(orig));
    }
    if (!negative) {
      toReturn2 = neg_0(toReturn2);
      if (lt(toReturn2, 0)) {
        throw toJs(jl.forInputString(orig));
      }
    }
    return toReturn2;
  };
  jl.byteValue__B__devirtual$ = function byteValue__B__devirtual$(this$static) {
    return instanceOfDouble(this$static) ? jl.$byteValue(this$static) : this$static.byteValue();
  };
  jl.doubleValue__D__devirtual$ = function doubleValue__D__devirtual$(this$static) {
    jl.$clinit_Number();
    return instanceOfDouble(this$static) ? jl.$doubleValue(this$static) : this$static.doubleValue();
  };
  jl.floatValue__F__devirtual$ = function floatValue__F__devirtual$(this$static) {
    return instanceOfDouble(this$static) ? jl.$floatValue(this$static) : this$static.floatValue();
  };
  jl.getClass__Ljava_lang_Class___devirtual$_1 = function getClass__Ljava_lang_Class___devirtual$_1(this$static) {
    return instanceOfDouble(this$static) ? jl.$getClass_2(this$static) : this$static.___clazz;
  };
  jl.intValue__I__devirtual$ = function intValue__I__devirtual$(this$static) {
    jl.$clinit_Number();
    return instanceOfDouble(this$static) ? jl.$intValue(this$static) : this$static.intValue();
  };
  jl.longValue__J__devirtual$ = function longValue__J__devirtual$(this$static) {
    return instanceOfDouble(this$static) ? jl.$longValue(this$static) : this$static.longValue();
  };
  jl.shortValue__S__devirtual$ = function shortValue__S__devirtual$(this$static) {
    return instanceOfDouble(this$static) ? jl.$shortValue(this$static) : this$static.shortValue();
  };
  defineClass(19, 1, { 4: 1, 19: 1, 1: 1 });
  _.$init_280 = function $init_280() {
  };
  _.byteValue = function byteValue() {
    return narrow_byte(jl.intValue__I__devirtual$(this));
  };
  _.shortValue = function shortValue() {
    return narrow_short(jl.intValue__I__devirtual$(this));
  };
  jl.$clinit_Double = function $clinit_Double() {
    jl.$clinit_Double = emptyMethod;
    jl.$clinit_Number();
    MIN_EXPONENT = -1022;
    NaN_0 = 0 / 0;
    NEGATIVE_INFINITY = -1 / 0;
    POSITIVE_INFINITY = 1 / 0;
    BYTES_0 = narrow_int(64 / 8);
    TYPE_2 = cggl.D_classLit;
  };
  jl.$$init_1 = function $$init_1(this$static) {
  };
  jl.$byteValue = function $byteValue(this$static) {
    return round_byte(jl.doubleValue__D__devirtual$_0(this$static));
  };
  jl.$compareTo_1 = function $compareTo_1(this$static, b) {
    return compare_23(jl.doubleValue__D__devirtual$_0(this$static), jl.doubleValue__D__devirtual$_0(b));
  };
  jl.$compareTo_2 = function $compareTo_2(this$static, b) {
    return jl.compareTo_Ljava_lang_Double__I__devirtual$(this$static, castToDouble(b));
  };
  jl.$create_1 = function $create_1(x_0) {
    return ji2.uncheckedCast(x_0);
  };
  function $create_2(s) {
    jl.$clinit_Double();
    return ji2.uncheckedCast(parseDouble(s));
  }
  jl.$doubleValue = function $doubleValue(this$static) {
    return ji2.unsafeCastToDouble(ji2.checkNotNull_0(this$static));
  };
  jl.$equals_2 = function $equals_2(this$static, o) {
    return maskUndefined(ji2.checkNotNull_0(this$static)) === maskUndefined(o);
  };
  jl.$floatValue = function $floatValue(this$static) {
    return jl.doubleValue__D__devirtual$_0(this$static);
  };
  jl.$getClass_2 = function $getClass_2(this$static) {
    return cggl.Ljava_lang_Double_2_classLit;
  };
  jl.$hashCode_2 = function $hashCode_2(this$static) {
    return jl.hashCode_12(jl.doubleValue__D__devirtual$_0(this$static));
  };
  jl.$init__V__devirtual$_2 = function $init__V__devirtual$_2(this$static) {
    return jl.$$init_1(this$static);
  };
  jl.$intValue = function $intValue(this$static) {
    return round_int(jl.doubleValue__D__devirtual$_0(this$static));
  };
  jl.$isInfinite = function $isInfinite(this$static) {
    return jl.isInfinite(jl.doubleValue__D__devirtual$_0(this$static));
  };
  function $isInstance_5(instance) {
    jl.$clinit_Double();
    return jl.equals_Ljava_lang_Object__Z__devirtual$_2("number", typeof instance);
  }
  jl.$isNaN = function $isNaN(this$static) {
    return isNaN(jl.doubleValue__D__devirtual$_0(this$static));
  };
  jl.$longValue = function $longValue(this$static) {
    return fromDouble_0(jl.doubleValue__D__devirtual$_0(this$static));
  };
  jl.$shortValue = function $shortValue(this$static) {
    return round_short(jl.doubleValue__D__devirtual$_0(this$static));
  };
  jl.Double = function Double(value_0) {
    jl.Number_0.call(this);
    jl.$init__V__devirtual$_2(this);
    jl.$create_1(value_0);
  };
  function Double_0(s) {
    jl.Number_0.call(this);
    jl.$init__V__devirtual$_2(this);
    $create_2(s);
  }
  jl.byteValue__B__devirtual$_0 = function byteValue__B__devirtual$_0(this$static) {
    return jl.$byteValue(this$static);
  };
  function compare_23(x_0, y_0) {
    jl.$clinit_Double();
    if (x_0 < y_0) {
      return -1;
    }
    if (x_0 > y_0) {
      return 1;
    }
    if (x_0 == y_0) {
      return x_0 == 0 ? compare_23(1 / x_0, 1 / y_0) : 0;
    }
    if (isNaN(x_0)) {
      if (isNaN(y_0)) {
        return 0;
      } else {
        return 1;
      }
    } else {
      return -1;
    }
  }
  jl.compareTo_Ljava_lang_Double__I__devirtual$ = function compareTo_Ljava_lang_Double__I__devirtual$(this$static, b) {
    return jl.$compareTo_1(this$static, b);
  };
  jl.compareTo_Ljava_lang_Object__I__devirtual$_1 = function compareTo_Ljava_lang_Object__I__devirtual$_1(this$static, b) {
    return jl.$compareTo_2(this$static, b);
  };
  function doubleToLongBits(value_0) {
    jl.$clinit_Double();
    if (isNaN(value_0)) {
      return { l: 0, m: 0, h: 524160 };
    }
    return jl.doubleToRawLongBits(value_0);
  }
  jl.doubleToRawLongBits = function doubleToRawLongBits(value_0) {
    return ji2.doubleToRawLongBits_0(value_0);
  };
  jl.doubleValue__D__devirtual$_0 = function doubleValue__D__devirtual$_0(this$static) {
    jl.$clinit_Double();
    return jl.$doubleValue(this$static);
  };
  jl.equals_Ljava_lang_Object__Z__devirtual$_1 = function equals_Ljava_lang_Object__Z__devirtual$_1(this$static, o) {
    jl.$clinit_Double();
    return jl.$equals_2(this$static, o);
  };
  jl.floatValue__F__devirtual$_0 = function floatValue__F__devirtual$_0(this$static) {
    return jl.$floatValue(this$static);
  };
  jl.getClass__Ljava_lang_Class___devirtual$_2 = function getClass__Ljava_lang_Class___devirtual$_2(this$static) {
    return jl.$getClass_2(this$static);
  };
  jl.hashCode_12 = function hashCode_12(d) {
    jl.$clinit_Double();
    return round_int(d);
  };
  jl.hashCode__I__devirtual$_1 = function hashCode__I__devirtual$_1(this$static) {
    jl.$clinit_Double();
    return jl.$hashCode_2(this$static);
  };
  jl.intValue__I__devirtual$_0 = function intValue__I__devirtual$_0(this$static) {
    return jl.$intValue(this$static);
  };
  jl.isInfinite = function isInfinite(x_0) {
    jl.$clinit_Double();
    return !isNaN(x_0) && !isFinite(x_0);
  };
  jl.isInfinite__Z__devirtual$ = function isInfinite__Z__devirtual$(this$static) {
    return jl.$isInfinite(this$static);
  };
  jl.isNaN__Z__devirtual$ = function isNaN__Z__devirtual$(this$static) {
    return jl.$isNaN(this$static);
  };
  function longBitsToDouble(bits) {
    jl.$clinit_Double();
    return ji2.longBitsToDouble_0(bits);
  }
  jl.longValue__J__devirtual$_0 = function longValue__J__devirtual$_0(this$static) {
    return jl.$longValue(this$static);
  };
  function max_1(a, b) {
    jl.$clinit_Double();
    return $wnd.Math.max(a, b);
  }
  function min_1(a, b) {
    jl.$clinit_Double();
    return $wnd.Math.min(a, b);
  }
  function parseDouble(s) {
    jl.$clinit_Double();
    return jl.__parseAndValidateDouble(s);
  }
  jl.shortValue__S__devirtual$_0 = function shortValue__S__devirtual$_0(this$static) {
    return jl.$shortValue(this$static);
  };
  function sum_0(a, b) {
    jl.$clinit_Double();
    return a + b;
  }
  jl.toString_37 = function toString_37(b) {
    jl.$clinit_Double();
    return jl.valueOf_16(b);
  };
  jl.valueOf_9 = function valueOf_9(d) {
    jl.$clinit_Double();
    return jl.$create_1(d);
  };
  function valueOf_10(s) {
    jl.$clinit_Double();
    return $create_2(s);
  }
  doubleCastMap = { 4: 1, 22: 1, 357: 1, 19: 1, 1: 1 };
  var BYTES_0 = 0;
  var MAX_EXPONENT = 1023;
  var MAX_VALUE_2 = 17976931348623157e292;
  var MIN_EXPONENT = 0;
  var MIN_NORMAL = 22250738585072014e-324;
  var MIN_VALUE_2 = 5e-324;
  var NEGATIVE_INFINITY = 0;
  var NaN_0 = 0;
  var POSITIVE_INFINITY = 0;
  var SIZE_1 = 64;
  var TYPE_2;
  jl.$clinit_IllegalStateException = function $clinit_IllegalStateException() {
    jl.$clinit_IllegalStateException = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  jl.IllegalStateException = function IllegalStateException() {
    jl.$clinit_IllegalStateException();
    jl.RuntimeException.call(this);
    this.$init_288();
  };
  jl.IllegalStateException_0 = function IllegalStateException_0(s) {
    jl.$clinit_IllegalStateException();
    jl.RuntimeException_1.call(this, s);
    this.$init_288();
  };
  defineClass(140, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, jl.IllegalStateException, jl.IllegalStateException_0);
  _.$init_288 = function $init_288() {
  };
  jl.$clinit_IndexOutOfBoundsException = function $clinit_IndexOutOfBoundsException() {
    jl.$clinit_IndexOutOfBoundsException = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  jl.IndexOutOfBoundsException = function IndexOutOfBoundsException() {
    jl.$clinit_IndexOutOfBoundsException();
    jl.RuntimeException.call(this);
    this.$init_275();
  };
  jl.IndexOutOfBoundsException_0 = function IndexOutOfBoundsException_0(message) {
    jl.$clinit_IndexOutOfBoundsException();
    jl.RuntimeException_1.call(this, message);
    this.$init_275();
  };
  defineClass(82, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, jl.IndexOutOfBoundsException, jl.IndexOutOfBoundsException_0);
  _.$init_275 = function $init_275() {
  };
  jl.$clinit_Integer = function $clinit_Integer() {
    jl.$clinit_Integer = emptyMethod;
    jl.$clinit_Number();
    BYTES_2 = narrow_int(32 / 8);
    TYPE_4 = cggl.I_classLit;
  };
  jl.Integer = function Integer(value_0) {
    jl.$clinit_Integer();
    jl.Number_0.call(this);
    this.$init_289();
    this.value_0 = value_0;
  };
  function bitCount_1(x_0) {
    jl.$clinit_Integer();
    x_0 -= x_0 >> 1 & 1431655765;
    x_0 = (x_0 >> 2 & 858993459) + (x_0 & 858993459);
    x_0 = (x_0 >> 4) + x_0 & 252645135;
    x_0 += x_0 >> 8;
    x_0 += x_0 >> 16;
    return x_0 & 63;
  }
  function compare_25(x_0, y_0) {
    jl.$clinit_Integer();
    if (x_0 < y_0) {
      return -1;
    } else if (x_0 > y_0) {
      return 1;
    } else {
      return 0;
    }
  }
  jl.hashCode_16 = function hashCode_16(i) {
    jl.$clinit_Integer();
    return i;
  };
  function highestOneBit(i) {
    jl.$clinit_Integer();
    var rtn;
    if (i < 0) {
      return -2147483648;
    } else if (i == 0) {
      return 0;
    } else {
      for (rtn = 1073741824; (rtn & i) == 0; rtn >>= 1) {
      }
      return rtn;
    }
  }
  function numberOfLeadingZeros_0(i) {
    jl.$clinit_Integer();
    var m, n, y_0;
    if (i < 0) {
      return 0;
    } else if (i == 0) {
      return 32;
    } else {
      y_0 = -(i >> 16);
      m = y_0 >> 16 & 16;
      n = 16 - m;
      i = i >> m;
      y_0 = i - 256;
      m = y_0 >> 16 & 8;
      n += m;
      i <<= m;
      y_0 = i - 4096;
      m = y_0 >> 16 & 4;
      n += m;
      i <<= m;
      y_0 = i - 16384;
      m = y_0 >> 16 & 2;
      n += m;
      i <<= m;
      y_0 = i >> 14;
      m = y_0 & ~(y_0 >> 1);
      return n + 2 - m;
    }
  }
  function numberOfTrailingZeros(i) {
    jl.$clinit_Integer();
    var r, rtn;
    if (i == 0) {
      return 32;
    } else {
      rtn = 0;
      for (r = 1; (r & i) == 0; r <<= 1) {
        rtn++;
      }
      return rtn;
    }
  }
  jl.parseInt_2 = function parseInt_2(s) {
    jl.$clinit_Integer();
    return parseInt_3(s, 10);
  };
  function parseInt_3(s, radix) {
    jl.$clinit_Integer();
    return jl.__parseAndValidateInt(s, radix, -2147483648, 2147483647);
  }
  function signum_0(i) {
    jl.$clinit_Integer();
    if (i == 0) {
      return 0;
    } else if (i < 0) {
      return -1;
    } else {
      return 1;
    }
  }
  function toHexString(value_0) {
    jl.$clinit_Integer();
    return toUnsignedString(value_0, 16);
  }
  jl.toString_41 = function toString_41(value_0) {
    jl.$clinit_Integer();
    return jl.valueOf_18(value_0);
  };
  jl.toString_42 = function toString_42(value_0, radix) {
    jl.$clinit_Integer();
    return ji2.intToString(value_0, radix);
  };
  function toUnsignedString(value_0, radix) {
    jl.$clinit_Integer();
    return ji2.uintToString(value_0, radix);
  }
  jl.valueOf_12 = function valueOf_12(i) {
    jl.$clinit_Integer();
    if (i > -129 && i < 128) {
      return jl.get_20(i);
    }
    return new jl.Integer(i);
  };
  defineClass(35, 19, { 4: 1, 22: 1, 35: 1, 19: 1, 1: 1 }, jl.Integer);
  _.$init_289 = function $init_289() {
  };
  _.compareTo_1 = function compareTo_32(b) {
    return this.compareTo_16(castTo(b, 35));
  };
  _.byteValue = function byteValue_2() {
    return narrow_byte(this.value_0);
  };
  _.compareTo_16 = function compareTo_31(b) {
    return compare_25(this.value_0, b.value_0);
  };
  _.doubleValue = function doubleValue_2() {
    return this.value_0;
  };
  _.equals_0 = function equals_26(o) {
    return instanceOf(o, 35) && castTo(o, 35).value_0 == this.value_0;
  };
  _.floatValue = function floatValue_1() {
    return this.value_0;
  };
  _.hashCode_1 = function hashCode_15() {
    return jl.hashCode_16(this.value_0);
  };
  _.intValue = function intValue_2() {
    return this.value_0;
  };
  _.longValue = function longValue_2() {
    return fromInt_0(this.value_0);
  };
  _.shortValue = function shortValue_2() {
    return narrow_short(this.value_0);
  };
  _.toString_0 = function toString_40() {
    return jl.toString_41(this.value_0);
  };
  _.value_0 = 0;
  var BYTES_2 = 0;
  var MAX_VALUE_4 = 2147483647;
  var MIN_VALUE_4 = -2147483648;
  var SIZE_3 = 32;
  var TYPE_4;
  jl.$clinit_NullPointerException = function $clinit_NullPointerException() {
    jl.$clinit_NullPointerException = emptyMethod;
    jl.$clinit_JsException();
  };
  jl.NullPointerException = function NullPointerException() {
    jl.$clinit_NullPointerException();
    jl.JsException.call(this);
    this.$init_292();
  };
  jl.NullPointerException_0 = function NullPointerException_0(typeError) {
    jl.$clinit_NullPointerException();
    jl.JsException_0.call(this, typeError);
    this.$init_292();
  };
  jl.NullPointerException_1 = function NullPointerException_1(message) {
    jl.$clinit_NullPointerException();
    jl.JsException_1.call(this, message);
    this.$init_292();
  };
  defineClass(75, 153, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, jl.NullPointerException, jl.NullPointerException_0, jl.NullPointerException_1);
  _.$init_292 = function $init_292() {
  };
  _.createError = function createError_0(msg) {
    return new TypeError(msg);
  };
  jl.$clinit_NullPointerException$NativeTypeError = function $clinit_NullPointerException$NativeTypeError() {
    jl.$clinit_NullPointerException$NativeTypeError = emptyMethod;
    jl.$clinit_Object();
  };
  jl.$clinit_Number$JavaLangNumber = function $clinit_Number$JavaLangNumber() {
    jl.$clinit_Number$JavaLangNumber = emptyMethod;
    jl.$clinit_Object();
  };
  jl.$clinit_String = function $clinit_String() {
    jl.$clinit_String = emptyMethod;
    jl.$clinit_Object();
    jl.$clinit_CharSequence();
    CASE_INSENSITIVE_ORDER = new jl.String$1();
  };
  jl.$$init_2 = function $$init_2(this$static) {
  };
  jl.$asNativeString = function $asNativeString(this$static) {
    return ji2.uncheckedCast(this$static);
  };
  jl.$charAt = function $charAt(this$static, index_0) {
    ji2.checkStringElementIndex(index_0, jl.length__I__devirtual$_0(this$static));
    return jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).charCodeAt(index_0);
  };
  jl.$chars_0 = function $chars_0(this$static) {
    return jl.$chars(this$static);
  };
  jl.$codePointAt = function $codePointAt(this$static, index_0) {
    return codePointAt(this$static, index_0, jl.length__I__devirtual$_0(this$static));
  };
  jl.$codePointBefore = function $codePointBefore(this$static, index_0) {
    return codePointBefore(this$static, index_0, 0);
  };
  jl.$codePointCount = function $codePointCount(this$static, beginIndex, endIndex) {
    return codePointCount(this$static, beginIndex, endIndex);
  };
  jl.$compareTo_3 = function $compareTo_3(this$static, other) {
    return jl.compareTo_Ljava_lang_String__I__devirtual$(this$static, castToString(other));
  };
  jl.$compareTo_4 = function $compareTo_4(this$static, other) {
    var a, b;
    a = jl.doubleValue__D__devirtual$_0(ji2.uncheckedCast(this$static));
    b = jl.doubleValue__D__devirtual$_0(ji2.uncheckedCast(other));
    return a == b ? 0 : a < b ? -1 : 1;
  };
  jl.$compareToIgnoreCase = function $compareToIgnoreCase(this$static, other) {
    return jl.compareTo_Ljava_lang_String__I__devirtual$(jl.toLowerCase__Ljava_lang_String___devirtual$(this$static), jl.toLowerCase__Ljava_lang_String___devirtual$(other));
  };
  jl.$concat = function $concat(this$static, str) {
    return castToString(ji2.checkNotNull_0(this$static)) + ("" + castToString(ji2.checkNotNull_0(str)));
  };
  jl.$contains = function $contains(this$static, s) {
    return jl.indexOf_Ljava_lang_String__I__devirtual$(this$static, toString_29(s)) != -1;
  };
  jl.$contentEquals = function $contentEquals(this$static, cs) {
    return jl.equals_Ljava_lang_Object__Z__devirtual$_2(this$static, toString_29(cs));
  };
  jl.$contentEquals_0 = function $contentEquals_0(this$static, sb) {
    return jl.equals_Ljava_lang_Object__Z__devirtual$_2(this$static, sb.toString_0());
  };
  jl.$create_3 = function $create_3() {
    return "";
  };
  jl.$create_4 = function $create_4(other) {
    return castToString(ji2.checkNotNull_0(other));
  };
  jl.$create_5 = function $create_5(sb) {
    return sb.toString_0();
  };
  function $create_6(sb) {
    jl.$clinit_String();
    return sb.toString_0();
  }
  jl.$create_7 = function $create_7(bytes) {
    jl.$clinit_String();
    return jl.$create_8(bytes, 0, bytes.length);
  };
  jl.$create_8 = function $create_8(bytes, ofs, len) {
    return jl.$create_10(bytes, ofs, len, (ji2.$clinit_EmulatedCharset(), ji2.UTF_8_0));
  };
  jl.$create_9 = function $create_9(bytes, ofs, len, charsetName) {
    return jl.$create_10(bytes, ofs, len, jl.getCharset(charsetName));
  };
  jl.$create_10 = function $create_10(bytes, ofs, len, charset) {
    jl.$clinit_String();
    return jl.valueOf_22(castTo(charset, 117).decodeString(bytes, ofs, len));
  };
  jl.$create_11 = function $create_11(bytes, charsetName) {
    return jl.$create_9(bytes, 0, bytes.length, charsetName);
  };
  jl.$create_12 = function $create_12(bytes, charset) {
    jl.$clinit_String();
    return jl.$create_10(bytes, 0, bytes.length, charset);
  };
  jl.$create_13 = function $create_13(value_0) {
    return jl.valueOf_22(value_0);
  };
  jl.$create_14 = function $create_14(value_0, offset, count) {
    jl.$clinit_String();
    return jl.valueOf_23(value_0, offset, count);
  };
  jl.$create_15 = function $create_15(codePoints, offset, count) {
    var charIdx, chars2;
    chars2 = initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, count * 2, 15, 1);
    charIdx = 0;
    while (count-- > 0) {
      charIdx += toChars(codePoints[offset++], chars2, charIdx);
    }
    return jl.valueOf_23(chars2, 0, charIdx);
  };
  jl.$endsWith = function $endsWith(this$static, suffix) {
    var suffixlength;
    suffixlength = jl.length__I__devirtual$_0(suffix);
    return jl.equals_Ljava_lang_Object__Z__devirtual$_2(jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).substr(jl.length__I__devirtual$_0(this$static) - suffixlength, suffixlength), suffix);
  };
  jl.$equals_3 = function $equals_3(this$static, other) {
    return maskUndefined(ji2.checkNotNull_0(this$static)) === maskUndefined(other);
  };
  jl.$equalsIgnoreCase = function $equalsIgnoreCase(this$static, other) {
    ji2.checkNotNull_0(this$static);
    if (jsEquals(other, null)) {
      return false;
    }
    if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(this$static, other)) {
      return true;
    }
    return jl.length__I__devirtual$_0(this$static) == jl.length__I__devirtual$_0(other) && jl.equals_Ljava_lang_Object__Z__devirtual$_2(jl.toLowerCase__Ljava_lang_String___devirtual$(this$static), jl.toLowerCase__Ljava_lang_String___devirtual$(other));
  };
  jl.$getBytes = function $getBytes(this$static) {
    return jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$(this$static, (ji2.$clinit_EmulatedCharset(), ji2.UTF_8_0));
  };
  jl.$getBytes_0 = function $getBytes_0(this$static, charsetName) {
    return jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$(this$static, jl.getCharset(charsetName));
  };
  jl.$getBytes_1 = function $getBytes_1(this$static, charset) {
    return castTo(charset, 117).getBytes(this$static);
  };
  jl.$getChars = function $getChars(this$static, srcBegin, srcEnd, dst, dstBegin) {
    ji2.checkCriticalStringBounds(srcBegin, srcEnd, jl.length__I__devirtual$_0(this$static));
    ji2.checkCriticalStringBounds(dstBegin, dstBegin + (srcEnd - srcBegin), dst.length);
    jl.getChars0_II_CI_V__devirtual$(this$static, srcBegin, srcEnd, dst, dstBegin);
  };
  jl.$getChars0 = function $getChars0(this$static, srcBegin, srcEnd, dst, dstBegin) {
    while (srcBegin < srcEnd) {
      dst[dstBegin++] = jl.charAt_I_C__devirtual$_0(this$static, srcBegin++);
    }
  };
  jl.$getClass_3 = function $getClass_3(this$static) {
    return cggl.Ljava_lang_String_2_classLit;
  };
  jl.$getLeadingWhitespaceLength = function $getLeadingWhitespaceLength(this$static) {
    var i, length_0;
    length_0 = jl.length__I__devirtual$_0(this$static);
    for (i = 0; i < length_0; i++) {
      if (!isWhitespace(jl.charAt_I_C__devirtual$_0(this$static, i))) {
        return i;
      }
    }
    return length_0;
  };
  jl.$getTrailingWhitespaceLength = function $getTrailingWhitespaceLength(this$static) {
    var i, length_0;
    length_0 = jl.length__I__devirtual$_0(this$static);
    for (i = length_0 - 1; i >= 0; i--) {
      if (!isWhitespace(jl.charAt_I_C__devirtual$_0(this$static, i))) {
        return length_0 - 1 - i;
      }
    }
    return length_0;
  };
  jl.$hashCode_3 = function $hashCode_3(this$static) {
    var h, i;
    h = 0;
    for (i = 0; i < jl.length__I__devirtual$_0(this$static); i++) {
      h = ji2.ensureInt((h << 5) - h + jl.charAt_I_C__devirtual$_0(this$static, i));
    }
    return h;
  };
  jl.$indexOf = function $indexOf(this$static, codePoint) {
    return jl.indexOf_Ljava_lang_String__I__devirtual$(this$static, fromCodePoint(codePoint));
  };
  jl.$indexOf_0 = function $indexOf_0(this$static, codePoint, startIndex) {
    return jl.indexOf_Ljava_lang_String_I_I__devirtual$(this$static, fromCodePoint(codePoint), startIndex);
  };
  jl.$indexOf_1 = function $indexOf_1(this$static, str) {
    return jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).indexOf(str);
  };
  jl.$indexOf_2 = function $indexOf_2(this$static, str, startIndex) {
    return jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).indexOf(str, startIndex);
  };
  jl.$init__V__devirtual$_3 = function $init__V__devirtual$_3(this$static) {
    return jl.$$init_2(this$static);
  };
  jl.$intern = function $intern(this$static) {
    return castToString(ji2.checkNotNull_0(this$static));
  };
  jl.$isBlank = function $isBlank(this$static) {
    return jl.length__I__devirtual$_0(this$static) == jl.getLeadingWhitespaceLength__I__devirtual$(this$static);
  };
  jl.$isEmpty = function $isEmpty(this$static) {
    return jl.length__I__devirtual$_0(this$static) == 0;
  };
  function $isInstance_6(instance) {
    jl.$clinit_String();
    return jl.equals_Ljava_lang_Object__Z__devirtual$_2("string", typeof instance);
  }
  jl.$lastIndexOf = function $lastIndexOf(this$static, codePoint) {
    return jl.lastIndexOf_Ljava_lang_String__I__devirtual$(this$static, fromCodePoint(codePoint));
  };
  jl.$lastIndexOf_0 = function $lastIndexOf_0(this$static, codePoint, startIndex) {
    return jl.lastIndexOf_Ljava_lang_String_I_I__devirtual$(this$static, fromCodePoint(codePoint), startIndex);
  };
  jl.$lastIndexOf_1 = function $lastIndexOf_1(this$static, str) {
    return jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).lastIndexOf(str);
  };
  jl.$lastIndexOf_2 = function $lastIndexOf_2(this$static, str, start_0) {
    return jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).lastIndexOf(str, start_0);
  };
  jl.$length_1 = function $length_1(this$static) {
    return jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).length;
  };
  jl.$lines = function $lines(this$static) {
    return jus.stream_1(new jl.String$LinesSpliterator(this$static), false);
  };
  jl.$matches = function $matches(this$static, regex) {
    return new RegExp("^(" + regex + ")$").test(this$static);
  };
  jl.$nativeReplaceAll = function $nativeReplaceAll(this$static, regex, replace) {
    return jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).replace(new RegExp(regex, "g"), replace);
  };
  jl.$offsetByCodePoints = function $offsetByCodePoints(this$static, index_0, codePointOffset) {
    return offsetByCodePoints(this$static, index_0, codePointOffset);
  };
  jl.$regionMatches = function $regionMatches(this$static, toffset, other, ooffset, len) {
    return jl.regionMatches_ZILjava_lang_String_II_Z__devirtual$(this$static, false, toffset, other, ooffset, len);
  };
  jl.$regionMatches_0 = function $regionMatches_0(this$static, ignoreCase, toffset, other, ooffset, len) {
    var left, right;
    ji2.checkNotNull_0(other);
    if (toffset < 0 || ooffset < 0) {
      return false;
    }
    if (toffset + len > jl.length__I__devirtual$_0(this$static) || ooffset + len > jl.length__I__devirtual$_0(other)) {
      return false;
    }
    if (len <= 0) {
      return true;
    }
    left = jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).substr(toffset, len);
    right = jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(other).substr(ooffset, len);
    return ignoreCase ? jl.equalsIgnoreCase_Ljava_lang_String__Z__devirtual$(left, right) : jl.equals_Ljava_lang_Object__Z__devirtual$_2(left, right);
  };
  jl.$repeat = function $repeat(this$static, count) {
    ji2.checkArgument_0(count >= 0, "count is negative: " + count);
    return jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).repeat(count);
  };
  jl.$replace = function $replace(this$static, from, to) {
    var hex, regex, replace;
    hex = toHexString(from);
    regex = "\\u" + jl.substring_I_Ljava_lang_String___devirtual$("0000", jl.length__I__devirtual$_0(hex)) + hex;
    replace = String.fromCharCode(to);
    return jl.nativeReplaceAll_Ljava_lang_String_Ljava_lang_String__Ljava_lang_String___devirtual$(this$static, regex, replace);
  };
  jl.$replace_0 = function $replace_0(this$static, from, to) {
    var regex, replacement;
    regex = jl.replaceAll_Ljava_lang_String_Ljava_lang_String__Ljava_lang_String___devirtual$(toString_29(from), "([/\\\\\\.\\*\\+\\?\\|\\(\\)\\[\\]\\{\\}$^])", "\\\\$1");
    replacement = jl.replaceAll_Ljava_lang_String_Ljava_lang_String__Ljava_lang_String___devirtual$(jl.replaceAll_Ljava_lang_String_Ljava_lang_String__Ljava_lang_String___devirtual$(toString_29(to), "\\\\", "\\\\\\\\"), "\\$", "\\\\$");
    return jl.replaceAll_Ljava_lang_String_Ljava_lang_String__Ljava_lang_String___devirtual$(this$static, regex, replacement);
  };
  jl.$replaceAll = function $replaceAll(this$static, regex, replace) {
    replace = jl.translateReplaceString(replace);
    return jl.nativeReplaceAll_Ljava_lang_String_Ljava_lang_String__Ljava_lang_String___devirtual$(this$static, regex, replace);
  };
  jl.$replaceFirst = function $replaceFirst(this$static, regex, replace) {
    var jsRegEx;
    replace = jl.translateReplaceString(replace);
    jsRegEx = new RegExp(regex);
    return jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).replace(jsRegEx, replace);
  };
  jl.$split = function $split(this$static, regex) {
    return jl.split_Ljava_lang_String_I__Ljava_lang_String___devirtual$(this$static, regex, 0);
  };
  jl.$split_0 = function $split_0(this$static, regex, maxMatch) {
    var compiled, count, lastNonEmpty, lastTrail, matchIndex, matchObj, out, trail;
    compiled = new RegExp(regex, "g");
    out = initUnidimensionalArray(cggl.Ljava_lang_String_2_classLit, { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 0, 6, 1);
    count = 0;
    trail = this$static;
    lastTrail = null;
    while (true) {
      matchObj = compiled.exec(trail);
      if (jsEquals(matchObj, null) || jsEquals(trail, "") || count == maxMatch - 1 && maxMatch > 0) {
        out[count] = trail;
        break;
      } else {
        matchIndex = matchObj.index;
        out[count] = jl.substring_II_Ljava_lang_String___devirtual$(trail, 0, matchIndex);
        trail = jl.substring_II_Ljava_lang_String___devirtual$(trail, matchIndex + jl.length__I__devirtual$_0(ji2.$asArray(matchObj)[0]), jl.length__I__devirtual$_0(trail));
        compiled.lastIndex = 0;
        if (jsEquals(lastTrail, trail)) {
          out[count] = jl.substring_II_Ljava_lang_String___devirtual$(trail, 0, 1);
          trail = jl.substring_I_Ljava_lang_String___devirtual$(trail, 1);
        }
        lastTrail = trail;
        count++;
      }
    }
    if (maxMatch == 0 && jl.length__I__devirtual$_0(this$static) > 0) {
      lastNonEmpty = out.length;
      while (lastNonEmpty > 0 && jsEquals(out[lastNonEmpty - 1], "")) {
        --lastNonEmpty;
      }
      if (lastNonEmpty < out.length) {
        ji2.setLength_0(out, lastNonEmpty);
      }
    }
    return out;
  };
  jl.$startsWith = function $startsWith(this$static, prefix) {
    return jl.startsWith_Ljava_lang_String_I_Z__devirtual$(this$static, prefix, 0);
  };
  jl.$startsWith_0 = function $startsWith_0(this$static, prefix, toffset) {
    return toffset >= 0 && jl.equals_Ljava_lang_Object__Z__devirtual$_2(jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).substr(toffset, jl.length__I__devirtual$_0(prefix)), prefix);
  };
  jl.$strip = function $strip(this$static) {
    var length_0, start_0;
    length_0 = jl.length__I__devirtual$_0(this$static);
    start_0 = jl.getLeadingWhitespaceLength__I__devirtual$(this$static);
    if (start_0 == length_0) {
      return "";
    }
    return jl.substring_II_Ljava_lang_String___devirtual$(this$static, start_0, length_0 - jl.getTrailingWhitespaceLength__I__devirtual$(this$static));
  };
  jl.$stripLeading = function $stripLeading(this$static) {
    return jl.substring_I_Ljava_lang_String___devirtual$(this$static, jl.getLeadingWhitespaceLength__I__devirtual$(this$static));
  };
  jl.$stripTrailing = function $stripTrailing(this$static) {
    return jl.substring_II_Ljava_lang_String___devirtual$(this$static, 0, jl.length__I__devirtual$_0(this$static) - jl.getTrailingWhitespaceLength__I__devirtual$(this$static));
  };
  jl.$subSequence = function $subSequence(this$static, beginIndex, endIndex) {
    return jl.substring_II_Ljava_lang_String___devirtual$(this$static, beginIndex, endIndex);
  };
  jl.$substring = function $substring(this$static, beginIndex) {
    ji2.checkStringElementIndex(beginIndex, jl.length__I__devirtual$_0(this$static) + 1);
    return jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).substr(beginIndex);
  };
  jl.$substring_0 = function $substring_0(this$static, beginIndex, endIndex) {
    ji2.checkStringBounds(beginIndex, endIndex, jl.length__I__devirtual$_0(this$static));
    return jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).substr(beginIndex, endIndex - beginIndex);
  };
  jl.$toCharArray = function $toCharArray(this$static) {
    var charArr, n;
    n = jl.length__I__devirtual$_0(this$static);
    charArr = initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, n, 15, 1);
    jl.getChars0_II_CI_V__devirtual$(this$static, 0, n, charArr, 0);
    return charArr;
  };
  jl.$toLowerCase = function $toLowerCase(this$static) {
    return jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).toLowerCase();
  };
  jl.$toLowerCase_0 = function $toLowerCase_0(this$static, locale) {
    return jsEquals(locale, ju.getDefault()) ? jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).toLocaleLowerCase() : jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).toLowerCase();
  };
  jl.$toUpperCase = function $toUpperCase(this$static) {
    return jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).toUpperCase();
  };
  jl.$toUpperCase_0 = function $toUpperCase_0(this$static, locale) {
    return jsEquals(locale, ju.getDefault()) ? jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).toLocaleUpperCase() : jl.asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static).toUpperCase();
  };
  jl.$trim = function $trim(this$static) {
    var end, length_0, start_0;
    length_0 = jl.length__I__devirtual$_0(this$static);
    start_0 = 0;
    while (start_0 < length_0 && jl.charAt_I_C__devirtual$_0(this$static, start_0) <= 32) {
      start_0++;
    }
    end = length_0;
    while (end > start_0 && jl.charAt_I_C__devirtual$_0(this$static, end - 1) <= 32) {
      end--;
    }
    return start_0 > 0 || end < length_0 ? jl.substring_II_Ljava_lang_String___devirtual$(this$static, start_0, end) : this$static;
  };
  jl.String_0 = function String_0() {
    Object_0.call(this);
    jl.$init__V__devirtual$_3(this);
    jl.$create_3();
  };
  jl.String_1 = function String_1(other) {
    Object_0.call(this);
    jl.$init__V__devirtual$_3(this);
    jl.$create_4(other);
  };
  jl.String_2 = function String_2(sb) {
    Object_0.call(this);
    jl.$init__V__devirtual$_3(this);
    jl.$create_5(sb);
  };
  function String_3(sb) {
    Object_0.call(this);
    jl.$init__V__devirtual$_3(this);
    $create_6(sb);
  }
  jl.String_4 = function String_4(bytes) {
    Object_0.call(this);
    jl.$init__V__devirtual$_3(this);
    jl.$create_7(bytes);
  };
  jl.String_5 = function String_5(bytes, ofs, len) {
    Object_0.call(this);
    jl.$init__V__devirtual$_3(this);
    jl.$create_8(bytes, ofs, len);
  };
  jl.String_6 = function String_6(bytes, ofs, len, charsetName) {
    Object_0.call(this);
    jl.$init__V__devirtual$_3(this);
    jl.$create_9(bytes, ofs, len, charsetName);
  };
  jl.String_7 = function String_7(bytes, ofs, len, charset) {
    Object_0.call(this);
    jl.$init__V__devirtual$_3(this);
    jl.$create_10(bytes, ofs, len, charset);
  };
  jl.String_8 = function String_8(bytes, charsetName) {
    Object_0.call(this);
    jl.$init__V__devirtual$_3(this);
    jl.$create_11(bytes, charsetName);
  };
  jl.String_9 = function String_9(bytes, charset) {
    Object_0.call(this);
    jl.$init__V__devirtual$_3(this);
    jl.$create_12(bytes, charset);
  };
  jl.String_10 = function String_10(value_0) {
    Object_0.call(this);
    jl.$init__V__devirtual$_3(this);
    jl.$create_13(value_0);
  };
  jl.String_11 = function String_11(value_0, offset, count) {
    Object_0.call(this);
    jl.$init__V__devirtual$_3(this);
    jl.$create_14(value_0, offset, count);
  };
  jl.String_12 = function String_12(codePoints, offset, count) {
    Object_0.call(this);
    jl.$init__V__devirtual$_3(this);
    jl.$create_15(codePoints, offset, count);
  };
  jl.asNativeString__Ljava_lang_String$NativeString___devirtual$ = function asNativeString__Ljava_lang_String$NativeString___devirtual$(this$static) {
    return jl.$asNativeString(this$static);
  };
  jl.charAt_I_C__devirtual$ = function charAt_I_C__devirtual$(this$static, index_0) {
    jl.$clinit_String();
    return instanceOfString(this$static) ? jl.$charAt(this$static, index_0) : this$static.charAt(index_0);
  };
  jl.charAt_I_C__devirtual$_0 = function charAt_I_C__devirtual$_0(this$static, index_0) {
    jl.$clinit_String();
    return jl.$charAt(this$static, index_0);
  };
  jl.chars__Ljava_util_stream_IntStream___devirtual$ = function chars__Ljava_util_stream_IntStream___devirtual$(this$static) {
    return instanceOfString(this$static) ? jl.$chars_0(this$static) : this$static.chars();
  };
  jl.chars__Ljava_util_stream_IntStream___devirtual$_0 = function chars__Ljava_util_stream_IntStream___devirtual$_0(this$static) {
    return jl.$chars_0(this$static);
  };
  jl.codePointAt_I_I__devirtual$ = function codePointAt_I_I__devirtual$(this$static, index_0) {
    jl.$clinit_String();
    return jl.$codePointAt(this$static, index_0);
  };
  jl.codePointBefore_I_I__devirtual$ = function codePointBefore_I_I__devirtual$(this$static, index_0) {
    return jl.$codePointBefore(this$static, index_0);
  };
  jl.codePointCount_II_I__devirtual$ = function codePointCount_II_I__devirtual$(this$static, beginIndex, endIndex) {
    return jl.$codePointCount(this$static, beginIndex, endIndex);
  };
  jl.compareToIgnoreCase_Ljava_lang_String__I__devirtual$ = function compareToIgnoreCase_Ljava_lang_String__I__devirtual$(this$static, other) {
    jl.$clinit_String();
    return jl.$compareToIgnoreCase(this$static, other);
  };
  jl.compareTo_Ljava_lang_Object__I__devirtual$_2 = function compareTo_Ljava_lang_Object__I__devirtual$_2(this$static, other) {
    return jl.$compareTo_3(this$static, other);
  };
  jl.compareTo_Ljava_lang_String__I__devirtual$ = function compareTo_Ljava_lang_String__I__devirtual$(this$static, other) {
    jl.$clinit_String();
    return jl.$compareTo_4(this$static, other);
  };
  jl.concat_Ljava_lang_String__Ljava_lang_String___devirtual$ = function concat_Ljava_lang_String__Ljava_lang_String___devirtual$(this$static, str) {
    jl.$clinit_String();
    return jl.$concat(this$static, str);
  };
  jl.contains_Ljava_lang_CharSequence__Z__devirtual$ = function contains_Ljava_lang_CharSequence__Z__devirtual$(this$static, s) {
    jl.$clinit_String();
    return jl.$contains(this$static, s);
  };
  jl.contentEquals_Ljava_lang_CharSequence__Z__devirtual$ = function contentEquals_Ljava_lang_CharSequence__Z__devirtual$(this$static, cs) {
    return jl.$contentEquals(this$static, cs);
  };
  jl.contentEquals_Ljava_lang_StringBuffer__Z__devirtual$ = function contentEquals_Ljava_lang_StringBuffer__Z__devirtual$(this$static, sb) {
    return jl.$contentEquals_0(this$static, sb);
  };
  jl.copyValueOf = function copyValueOf(v) {
    return jl.valueOf_22(v);
  };
  function copyValueOf_0(v, offset, count) {
    jl.$clinit_String();
    return jl.valueOf_23(v, offset, count);
  }
  jl.endsWith_Ljava_lang_String__Z__devirtual$ = function endsWith_Ljava_lang_String__Z__devirtual$(this$static, suffix) {
    jl.$clinit_String();
    return jl.$endsWith(this$static, suffix);
  };
  jl.equalsIgnoreCase_Ljava_lang_String__Z__devirtual$ = function equalsIgnoreCase_Ljava_lang_String__Z__devirtual$(this$static, other) {
    jl.$clinit_String();
    return jl.$equalsIgnoreCase(this$static, other);
  };
  jl.equals_Ljava_lang_Object__Z__devirtual$_2 = function equals_Ljava_lang_Object__Z__devirtual$_2(this$static, other) {
    jl.$clinit_String();
    return jl.$equals_3(this$static, other);
  };
  jl.fromCharCode = function fromCharCode(array) {
    return String.fromCharCode.apply(null, array);
  };
  function fromCodePoint(codePoint) {
    jl.$clinit_String();
    var hiSurrogate, loSurrogate;
    if (codePoint >= 65536) {
      hiSurrogate = getHighSurrogate(codePoint);
      loSurrogate = getLowSurrogate(codePoint);
      return jl.valueOf_15(hiSurrogate) + ("" + jl.valueOf_15(loSurrogate));
    } else {
      return jl.valueOf_15(narrow_char(codePoint));
    }
  }
  jl.getBytes_Ljava_lang_String___B__devirtual$ = function getBytes_Ljava_lang_String___B__devirtual$(this$static, charsetName) {
    return jl.$getBytes_0(this$static, charsetName);
  };
  jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$ = function getBytes_Ljava_nio_charset_Charset___B__devirtual$(this$static, charset) {
    jl.$clinit_String();
    return jl.$getBytes_1(this$static, charset);
  };
  jl.getBytes___B__devirtual$ = function getBytes___B__devirtual$(this$static) {
    jl.$clinit_String();
    return jl.$getBytes(this$static);
  };
  jl.getChars0_II_CI_V__devirtual$ = function getChars0_II_CI_V__devirtual$(this$static, srcBegin, srcEnd, dst, dstBegin) {
    return jl.$getChars0(this$static, srcBegin, srcEnd, dst, dstBegin);
  };
  jl.getChars_II_CI_V__devirtual$ = function getChars_II_CI_V__devirtual$(this$static, srcBegin, srcEnd, dst, dstBegin) {
    jl.$clinit_String();
    return jl.$getChars(this$static, srcBegin, srcEnd, dst, dstBegin);
  };
  jl.getCharset = function getCharset(charsetName) {
    var e;
    try {
      return jnc.forName(charsetName);
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 195)) {
        e = $e0;
        throw toJs(new ji.UnsupportedEncodingException(charsetName));
      } else
        throw toJs($e0);
    }
  };
  jl.getClass__Ljava_lang_Class___devirtual$_3 = function getClass__Ljava_lang_Class___devirtual$_3(this$static) {
    return jl.$getClass_3(this$static);
  };
  jl.getLeadingWhitespaceLength__I__devirtual$ = function getLeadingWhitespaceLength__I__devirtual$(this$static) {
    return jl.$getLeadingWhitespaceLength(this$static);
  };
  jl.getTrailingWhitespaceLength__I__devirtual$ = function getTrailingWhitespaceLength__I__devirtual$(this$static) {
    return jl.$getTrailingWhitespaceLength(this$static);
  };
  jl.hashCode__I__devirtual$_2 = function hashCode__I__devirtual$_2(this$static) {
    jl.$clinit_String();
    return jl.$hashCode_3(this$static);
  };
  jl.indexOf_II_I__devirtual$ = function indexOf_II_I__devirtual$(this$static, codePoint, startIndex) {
    jl.$clinit_String();
    return jl.$indexOf_0(this$static, codePoint, startIndex);
  };
  jl.indexOf_I_I__devirtual$ = function indexOf_I_I__devirtual$(this$static, codePoint) {
    jl.$clinit_String();
    return jl.$indexOf(this$static, codePoint);
  };
  jl.indexOf_Ljava_lang_String_I_I__devirtual$ = function indexOf_Ljava_lang_String_I_I__devirtual$(this$static, str, startIndex) {
    jl.$clinit_String();
    return jl.$indexOf_2(this$static, str, startIndex);
  };
  jl.indexOf_Ljava_lang_String__I__devirtual$ = function indexOf_Ljava_lang_String__I__devirtual$(this$static, str) {
    jl.$clinit_String();
    return jl.$indexOf_1(this$static, str);
  };
  jl.intern__Ljava_lang_String___devirtual$ = function intern__Ljava_lang_String___devirtual$(this$static) {
    return jl.$intern(this$static);
  };
  jl.isBlank__Z__devirtual$ = function isBlank__Z__devirtual$(this$static) {
    return jl.$isBlank(this$static);
  };
  jl.isEmpty__Z__devirtual$ = function isEmpty__Z__devirtual$(this$static) {
    jl.$clinit_String();
    return jl.$isEmpty(this$static);
  };
  function join_1(delimiter, elements) {
    jl.$clinit_String();
    var e, e$iterator, joiner;
    joiner = new ju.StringJoiner(delimiter);
    for (e$iterator = elements.iterator(); e$iterator.hasNext_0(); ) {
      e = castTo(e$iterator.next_3(), 167);
      joiner.add_12(e);
    }
    return joiner.toString_0();
  }
  jl.join_2 = function join_2(delimiter, elements) {
    jl.$clinit_String();
    var e, e$array, e$index, e$max, joiner;
    joiner = new ju.StringJoiner(delimiter);
    for (e$array = elements, e$index = 0, e$max = e$array.length; e$index < e$max; ++e$index) {
      e = e$array[e$index];
      joiner.add_12(e);
    }
    return joiner.toString_0();
  };
  jl.lastIndexOf_II_I__devirtual$ = function lastIndexOf_II_I__devirtual$(this$static, codePoint, startIndex) {
    jl.$clinit_String();
    return jl.$lastIndexOf_0(this$static, codePoint, startIndex);
  };
  jl.lastIndexOf_I_I__devirtual$ = function lastIndexOf_I_I__devirtual$(this$static, codePoint) {
    jl.$clinit_String();
    return jl.$lastIndexOf(this$static, codePoint);
  };
  jl.lastIndexOf_Ljava_lang_String_I_I__devirtual$ = function lastIndexOf_Ljava_lang_String_I_I__devirtual$(this$static, str, start_0) {
    jl.$clinit_String();
    return jl.$lastIndexOf_2(this$static, str, start_0);
  };
  jl.lastIndexOf_Ljava_lang_String__I__devirtual$ = function lastIndexOf_Ljava_lang_String__I__devirtual$(this$static, str) {
    jl.$clinit_String();
    return jl.$lastIndexOf_1(this$static, str);
  };
  jl.length__I__devirtual$ = function length__I__devirtual$(this$static) {
    jl.$clinit_String();
    return instanceOfString(this$static) ? jl.$length_1(this$static) : this$static.length_1();
  };
  jl.length__I__devirtual$_0 = function length__I__devirtual$_0(this$static) {
    jl.$clinit_String();
    return jl.$length_1(this$static);
  };
  jl.lines__Ljava_util_stream_Stream___devirtual$ = function lines__Ljava_util_stream_Stream___devirtual$(this$static) {
    return jl.$lines(this$static);
  };
  jl.matches_Ljava_lang_String__Z__devirtual$ = function matches_Ljava_lang_String__Z__devirtual$(this$static, regex) {
    return jl.$matches(this$static, regex);
  };
  jl.nativeReplaceAll_Ljava_lang_String_Ljava_lang_String__Ljava_lang_String___devirtual$ = function nativeReplaceAll_Ljava_lang_String_Ljava_lang_String__Ljava_lang_String___devirtual$(this$static, regex, replace) {
    return jl.$nativeReplaceAll(this$static, regex, replace);
  };
  jl.offsetByCodePoints_II_I__devirtual$ = function offsetByCodePoints_II_I__devirtual$(this$static, index_0, codePointOffset) {
    return jl.$offsetByCodePoints(this$static, index_0, codePointOffset);
  };
  jl.regionMatches_ILjava_lang_String_II_Z__devirtual$ = function regionMatches_ILjava_lang_String_II_Z__devirtual$(this$static, toffset, other, ooffset, len) {
    return jl.$regionMatches(this$static, toffset, other, ooffset, len);
  };
  jl.regionMatches_ZILjava_lang_String_II_Z__devirtual$ = function regionMatches_ZILjava_lang_String_II_Z__devirtual$(this$static, ignoreCase, toffset, other, ooffset, len) {
    return jl.$regionMatches_0(this$static, ignoreCase, toffset, other, ooffset, len);
  };
  jl.repeat_I_Ljava_lang_String___devirtual$ = function repeat_I_Ljava_lang_String___devirtual$(this$static, count) {
    return jl.$repeat(this$static, count);
  };
  jl.replaceAll_Ljava_lang_String_Ljava_lang_String__Ljava_lang_String___devirtual$ = function replaceAll_Ljava_lang_String_Ljava_lang_String__Ljava_lang_String___devirtual$(this$static, regex, replace) {
    jl.$clinit_String();
    return jl.$replaceAll(this$static, regex, replace);
  };
  jl.replaceFirst_Ljava_lang_String_Ljava_lang_String__Ljava_lang_String___devirtual$ = function replaceFirst_Ljava_lang_String_Ljava_lang_String__Ljava_lang_String___devirtual$(this$static, regex, replace) {
    return jl.$replaceFirst(this$static, regex, replace);
  };
  jl.replace_CC_Ljava_lang_String___devirtual$ = function replace_CC_Ljava_lang_String___devirtual$(this$static, from, to) {
    return jl.$replace(this$static, from, to);
  };
  jl.replace_Ljava_lang_CharSequence_Ljava_lang_CharSequence__Ljava_lang_String___devirtual$ = function replace_Ljava_lang_CharSequence_Ljava_lang_CharSequence__Ljava_lang_String___devirtual$(this$static, from, to) {
    jl.$clinit_String();
    return jl.$replace_0(this$static, from, to);
  };
  jl.split_Ljava_lang_String_I__Ljava_lang_String___devirtual$ = function split_Ljava_lang_String_I__Ljava_lang_String___devirtual$(this$static, regex, maxMatch) {
    return jl.$split_0(this$static, regex, maxMatch);
  };
  jl.split_Ljava_lang_String___Ljava_lang_String___devirtual$ = function split_Ljava_lang_String___Ljava_lang_String___devirtual$(this$static, regex) {
    jl.$clinit_String();
    return jl.$split(this$static, regex);
  };
  jl.startsWith_Ljava_lang_String_I_Z__devirtual$ = function startsWith_Ljava_lang_String_I_Z__devirtual$(this$static, prefix, toffset) {
    jl.$clinit_String();
    return jl.$startsWith_0(this$static, prefix, toffset);
  };
  jl.startsWith_Ljava_lang_String__Z__devirtual$ = function startsWith_Ljava_lang_String__Z__devirtual$(this$static, prefix) {
    jl.$clinit_String();
    return jl.$startsWith(this$static, prefix);
  };
  jl.stripLeading__Ljava_lang_String___devirtual$ = function stripLeading__Ljava_lang_String___devirtual$(this$static) {
    return jl.$stripLeading(this$static);
  };
  jl.stripTrailing__Ljava_lang_String___devirtual$ = function stripTrailing__Ljava_lang_String___devirtual$(this$static) {
    return jl.$stripTrailing(this$static);
  };
  jl.strip__Ljava_lang_String___devirtual$ = function strip__Ljava_lang_String___devirtual$(this$static) {
    return jl.$strip(this$static);
  };
  jl.subSequence_II_Ljava_lang_CharSequence___devirtual$ = function subSequence_II_Ljava_lang_CharSequence___devirtual$(this$static, start_0, end) {
    return instanceOfString(this$static) ? jl.$subSequence(this$static, start_0, end) : this$static.subSequence(start_0, end);
  };
  jl.subSequence_II_Ljava_lang_CharSequence___devirtual$_0 = function subSequence_II_Ljava_lang_CharSequence___devirtual$_0(this$static, beginIndex, endIndex) {
    return jl.$subSequence(this$static, beginIndex, endIndex);
  };
  jl.substring_II_Ljava_lang_String___devirtual$ = function substring_II_Ljava_lang_String___devirtual$(this$static, beginIndex, endIndex) {
    jl.$clinit_String();
    return jl.$substring_0(this$static, beginIndex, endIndex);
  };
  jl.substring_I_Ljava_lang_String___devirtual$ = function substring_I_Ljava_lang_String___devirtual$(this$static, beginIndex) {
    jl.$clinit_String();
    return jl.$substring(this$static, beginIndex);
  };
  jl.toCharArray___C__devirtual$ = function toCharArray___C__devirtual$(this$static) {
    return jl.$toCharArray(this$static);
  };
  jl.toLowerCase_Ljava_util_Locale__Ljava_lang_String___devirtual$ = function toLowerCase_Ljava_util_Locale__Ljava_lang_String___devirtual$(this$static, locale) {
    return jl.$toLowerCase_0(this$static, locale);
  };
  jl.toLowerCase__Ljava_lang_String___devirtual$ = function toLowerCase__Ljava_lang_String___devirtual$(this$static) {
    jl.$clinit_String();
    return jl.$toLowerCase(this$static);
  };
  jl.toUpperCase_Ljava_util_Locale__Ljava_lang_String___devirtual$ = function toUpperCase_Ljava_util_Locale__Ljava_lang_String___devirtual$(this$static, locale) {
    return jl.$toUpperCase_0(this$static, locale);
  };
  jl.toUpperCase__Ljava_lang_String___devirtual$ = function toUpperCase__Ljava_lang_String___devirtual$(this$static) {
    jl.$clinit_String();
    return jl.$toUpperCase(this$static);
  };
  jl.translateReplaceString = function translateReplaceString(replaceStr) {
    var pos;
    pos = 0;
    while (0 <= (pos = jl.indexOf_Ljava_lang_String_I_I__devirtual$(replaceStr, "\\", pos))) {
      if (jl.charAt_I_C__devirtual$_0(replaceStr, pos + 1) == 36) {
        replaceStr = jl.substring_II_Ljava_lang_String___devirtual$(replaceStr, 0, pos) + "$" + jl.substring_I_Ljava_lang_String___devirtual$(replaceStr, ++pos);
      } else {
        replaceStr = jl.substring_II_Ljava_lang_String___devirtual$(replaceStr, 0, pos) + ("" + jl.substring_I_Ljava_lang_String___devirtual$(replaceStr, ++pos));
      }
    }
    return replaceStr;
  };
  jl.trim__Ljava_lang_String___devirtual$ = function trim__Ljava_lang_String___devirtual$(this$static) {
    jl.$clinit_String();
    return jl.$trim(this$static);
  };
  jl.valueOf_15 = function valueOf_15(x_0) {
    jl.$clinit_String();
    return String.fromCharCode(x_0);
  };
  jl.valueOf_16 = function valueOf_16(x_0) {
    jl.$clinit_String();
    return "" + x_0;
  };
  jl.valueOf_17 = function valueOf_17(x_0) {
    jl.$clinit_String();
    return "" + x_0;
  };
  jl.valueOf_18 = function valueOf_18(x_0) {
    jl.$clinit_String();
    return "" + x_0;
  };
  jl.valueOf_19 = function valueOf_19(x_0) {
    jl.$clinit_String();
    return "" + toString_28(x_0);
  };
  function valueOf_20(x_0) {
    jl.$clinit_String();
    return jsEquals(x_0, null) ? "null" : toString_29(x_0);
  }
  jl.valueOf_21 = function valueOf_21(x_0) {
    jl.$clinit_String();
    return "" + x_0;
  };
  jl.valueOf_22 = function valueOf_22(x_0) {
    jl.$clinit_String();
    return jl.valueOf_23(x_0, 0, x_0.length);
  };
  jl.valueOf_23 = function valueOf_23(x_0, offset, count) {
    jl.$clinit_String();
    var batchEnd, batchSize, batchStart, end, s;
    end = offset + count;
    ji2.checkCriticalStringBounds(offset, end, x_0.length);
    batchSize = 1e4;
    s = "";
    for (batchStart = offset; batchStart < end; ) {
      batchEnd = $wnd.Math.min(batchStart + batchSize, end);
      s += "" + jl.fromCharCode(ji2.unsafeClone(x_0, batchStart, batchEnd));
      batchStart = batchEnd;
    }
    return s;
  };
  stringCastMap = { 4: 1, 167: 1, 22: 1, 1: 1, 2: 1 };
  var CASE_INSENSITIVE_ORDER;
  ju.$clinit_Comparator = function $clinit_Comparator() {
    ju.$clinit_Comparator = emptyMethod;
  };
  ju.comparingDouble = function comparingDouble(keyExtractor) {
    ju.$clinit_Comparator();
    ji2.checkNotNull_0(keyExtractor);
    return castTo(castTo(new ju.Comparator$lambda$2$Type(keyExtractor), 36), 4);
  };
  ju.lambda$2 = function lambda$2(keyExtractor_0, a_1, b_2) {
    ju.$clinit_Comparator();
    return compare_23(keyExtractor_0.applyAsDouble(a_1), keyExtractor_0.applyAsDouble(b_2));
  };
  jl.$clinit_String$1 = function $clinit_String$1() {
    jl.$clinit_String$1 = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Comparator();
  };
  jl.String$1 = function String$1() {
    jl.$clinit_String$1();
    Object_0.call(this);
    this.$init_297();
  };
  defineClass(289, 1, { 1: 1, 36: 1 }, jl.String$1);
  _.$init_297 = function $init_297() {
  };
  _.compare_0 = function compare_28(a, b) {
    return this.compare_6(castToString(a), castToString(b));
  };
  _.equals_0 = function equals_30(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  _.compare_6 = function compare_29(a, b) {
    return jl.compareToIgnoreCase_Ljava_lang_String__I__devirtual$(a, b);
  };
  jl.$clinit_StringIndexOutOfBoundsException = function $clinit_StringIndexOutOfBoundsException() {
    jl.$clinit_StringIndexOutOfBoundsException = emptyMethod;
    jl.$clinit_IndexOutOfBoundsException();
  };
  jl.StringIndexOutOfBoundsException = function StringIndexOutOfBoundsException(message) {
    jl.$clinit_StringIndexOutOfBoundsException();
    jl.IndexOutOfBoundsException_0.call(this, message);
    this.$init_303();
  };
  defineClass(255, 82, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, jl.StringIndexOutOfBoundsException);
  _.$init_303 = function $init_303() {
  };
  jl.$clinit_Throwable$NativeError = function $clinit_Throwable$NativeError() {
    jl.$clinit_Throwable$NativeError = emptyMethod;
    jl.$clinit_Object();
  };
  jl.$clinit_Throwable$NativeTypeError = function $clinit_Throwable$NativeTypeError() {
    jl.$clinit_Throwable$NativeTypeError = emptyMethod;
    jl.$clinit_Object();
  };
  ji2.$clinit_ArrayHelper = function $clinit_ArrayHelper() {
    ji2.$clinit_ArrayHelper = emptyMethod;
    jl.$clinit_Object();
  };
  ji2.asNativeArray = function asNativeArray(array) {
    return ji2.uncheckedCast(array);
  };
  ji2.clone_2 = function clone_2(array) {
    ji2.$clinit_ArrayHelper();
    var result;
    result = ji2.asNativeArray(array).slice();
    return ji2.stampJavaTypeInfo_1(result, array);
  };
  ji2.copy_2 = function copy_2(array, srcOfs, dest, destOfs, len) {
    ji2.$clinit_ArrayHelper();
    ji2.copy_3(array, srcOfs, dest, destOfs, len, true);
  };
  ji2.copy_3 = function copy_3(src_0, srcOfs, dest, destOfs, len, overwrite) {
    var batchEnd, batchStart, destArray, end, spliceArgs;
    if (len == 0) {
      return;
    }
    if (maskUndefined(src_0) === maskUndefined(dest)) {
      src_0 = ji2.unsafeClone(src_0, srcOfs, srcOfs + len);
      srcOfs = 0;
    }
    destArray = ji2.asNativeArray(dest);
    for (batchStart = srcOfs, end = srcOfs + len; batchStart < end; ) {
      batchEnd = $wnd.Math.min(batchStart + 1e4, end);
      len = batchEnd - batchStart;
      spliceArgs = ji2.unsafeClone(src_0, batchStart, batchEnd);
      ji2.asNativeArray(spliceArgs).splice(0, 0, jl.valueOf_9(destOfs), jl.valueOf_9(overwrite ? len : 0));
      Array.prototype.splice.apply(destArray, spliceArgs);
      batchStart = batchEnd;
      destOfs += len;
    }
  };
  ji2.createFrom = function createFrom(array, length_0) {
    ji2.$clinit_ArrayHelper();
    return ji2.stampJavaTypeInfo_1(new Array(length_0), array);
  };
  ji2.getLength_2 = function getLength_2(array) {
    ji2.$clinit_ArrayHelper();
    return ji2.asNativeArray(array).length;
  };
  ji2.insertTo = function insertTo(array, index_0, value_0) {
    ji2.$clinit_ArrayHelper();
    ji2.asNativeArray(array).splice(index_0, 0, value_0);
  };
  ji2.insertTo_0 = function insertTo_0(array, index_0, values) {
    ji2.$clinit_ArrayHelper();
    ji2.copy_3(values, 0, array, index_0, values.length, false);
  };
  ji2.push_2 = function push_2(array, o) {
    ji2.$clinit_ArrayHelper();
    ji2.asNativeArray(array).push(o);
  };
  ji2.push_3 = function push_3(array, o) {
    ji2.$clinit_ArrayHelper();
    ji2.asNativeArray(array).push(o);
  };
  ji2.removeFrom = function removeFrom(array, index_0, deleteCount) {
    ji2.$clinit_ArrayHelper();
    ji2.asNativeArray(array).splice(index_0, deleteCount);
  };
  ji2.setLength_0 = function setLength_0(array, length_0) {
    ji2.$clinit_ArrayHelper();
    ji2.asNativeArray(array).length = length_0;
  };
  ji2.sort_11 = function sort_11(array, fn) {
    ji2.$clinit_ArrayHelper();
    ji2.asNativeArray(array).sort(fn);
  };
  ji2.unsafeClone = function unsafeClone(array, fromIndex, toIndex) {
    ji2.$clinit_ArrayHelper();
    return ji2.asNativeArray(array).slice(fromIndex, toIndex);
  };
  defineClass(626, 1, { 1: 1 });
  ji2.ARRAY_PROCESS_BATCH_SIZE = 1e4;
  ji2.$clinit_Coercions = function $clinit_Coercions() {
    ji2.$clinit_Coercions = emptyMethod;
    jl.$clinit_Object();
  };
  ji2.ensureInt = function ensureInt(value_0) {
    ji2.$clinit_Coercions();
    return value_0 | 0;
  };
  defineClass(640, 1, { 1: 1 });
  ji2.$clinit_HashCodes = function $clinit_HashCodes() {
    ji2.$clinit_HashCodes = emptyMethod;
    jl.$clinit_Object();
  };
  ji2.HashCodes = function HashCodes() {
    ji2.$clinit_HashCodes();
    Object_0.call(this);
    this.$init_403();
  };
  ji2.getIdentityHashCode = function getIdentityHashCode(o) {
    ji2.$clinit_HashCodes();
    switch (typeof o) {
      case "string":
        return jl.hashCode__I__devirtual$_2(ji2.uncheckedCast(o));
      case "number":
        return jl.hashCode__I__devirtual$_1(ji2.uncheckedCast(o));
      case "boolean":
        return jl.hashCode__I__devirtual$_0(ji2.uncheckedCast(o));
      default:
        return jsEquals(o, null) ? 0 : ji2.getObjectIdentityHashCode(o);
    }
  };
  ji2.getNextHash = function getNextHash() {
    ji2.$clinit_HashCodes();
    return ++ji2.nextHash;
  };
  ji2.getObjectIdentityHashCode = function getObjectIdentityHashCode(o) {
    ji2.$clinit_HashCodes();
    return o.$H || (o.$H = ji2.getNextHash());
  };
  defineClass(623, 1, { 1: 1 }, ji2.HashCodes);
  _.$init_403 = function $init_403() {
  };
  ji2.nextHash = 0;
  ji2.$clinit_InternalPreconditions = function $clinit_InternalPreconditions() {
    ji2.$clinit_InternalPreconditions = emptyMethod;
    jl.$clinit_Object();
    ji2.LEVEL_NORMAL_OR_HIGHER = jsEquals("NORMAL", "NORMAL");
    ji2.LEVEL_OPT_OR_HIGHER = jsEquals("NORMAL", "OPTIMIZED") || jsEquals("NORMAL", "NORMAL");
    ji2.LEVEL_MINIMAL_OR_HIGHER = jsEquals("NORMAL", "MINIMAL") || jsEquals("NORMAL", "OPTIMIZED") || jsEquals("NORMAL", "NORMAL");
    {
      if (!ji2.LEVEL_MINIMAL_OR_HIGHER) {
        throw toJs(new jl.IllegalStateException_0("Incorrect level: NORMAL"));
      }
    }
    ji2.IS_TYPE_CHECKED = jsEquals(ji2.CHECK_TYPE, "AUTO") && ji2.LEVEL_OPT_OR_HIGHER || jsEquals(ji2.CHECK_TYPE, "ENABLED");
    ji2.IS_BOUNDS_CHECKED = jsEquals(ji2.CHECK_BOUNDS, "AUTO") && ji2.LEVEL_NORMAL_OR_HIGHER || jsEquals(ji2.CHECK_BOUNDS, "ENABLED");
    ji2.IS_API_CHECKED = jsEquals(ji2.CHECK_API, "AUTO") && ji2.LEVEL_NORMAL_OR_HIGHER || jsEquals(ji2.CHECK_API, "ENABLED");
    ji2.IS_NUMERIC_CHECKED = jsEquals(ji2.CHECK_NUMERIC, "AUTO") && ji2.LEVEL_NORMAL_OR_HIGHER || jsEquals(ji2.CHECK_NUMERIC, "ENABLED");
    ji2.IS_ASSERTED = jsEquals("DISABLED", "ENABLED");
  };
  ji2.checkArgument = function checkArgument(expression) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_API_CHECKED) {
      ji2.checkCriticalArgument_0(expression);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalArgument_0(expression);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkArgument_0 = function checkArgument_0(expression, errorMessage) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_API_CHECKED) {
      ji2.checkCriticalArgument_1(expression, errorMessage);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalArgument_1(expression, errorMessage);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkArraySize = function checkArraySize(size_0) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_API_CHECKED) {
      ji2.checkCriticalArraySize(size_0);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalArraySize(size_0);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkArrayType = function checkArrayType(expression) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_TYPE_CHECKED) {
      ji2.checkCriticalArrayType(expression);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalArrayType(expression);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkArrayType_0 = function checkArrayType_0(expression, errorMessage) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_TYPE_CHECKED) {
      ji2.checkCriticalArrayType_0(expression, errorMessage);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalArrayType_0(expression, errorMessage);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkConcurrentModification_0 = function checkConcurrentModification_0(currentModCount, recordedModCount) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_API_CHECKED) {
      ji2.checkCriticalConcurrentModification(currentModCount, recordedModCount);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalConcurrentModification(currentModCount, recordedModCount);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkCriticalArgument_0 = function checkCriticalArgument_0(expression) {
    ji2.$clinit_InternalPreconditions();
    if (!expression) {
      throw toJs(new jl.IllegalArgumentException());
    }
  };
  ji2.checkCriticalArgument_1 = function checkCriticalArgument_1(expression, errorMessage) {
    ji2.$clinit_InternalPreconditions();
    if (!expression) {
      throw toJs(new jl.IllegalArgumentException_0(valueOf_20(errorMessage)));
    }
  };
  ji2.checkCriticalArrayBounds = function checkCriticalArrayBounds(start_0, end, length_0) {
    ji2.$clinit_InternalPreconditions();
    if (start_0 > end) {
      throw toJs(new jl.IllegalArgumentException_0("fromIndex: " + start_0 + " > toIndex: " + end));
    }
    if (start_0 < 0 || end > length_0) {
      throw toJs(new jl.ArrayIndexOutOfBoundsException_0("fromIndex: " + start_0 + ", toIndex: " + end + ", length: " + length_0));
    }
  };
  ji2.checkCriticalArraySize = function checkCriticalArraySize(size_0) {
    if (size_0 < 0) {
      throw toJs(new jl.NegativeArraySizeException("Negative array size: " + size_0));
    }
  };
  ji2.checkCriticalArrayType = function checkCriticalArrayType(expression) {
    if (!expression) {
      throw toJs(new jl.ArrayStoreException());
    }
  };
  ji2.checkCriticalArrayType_0 = function checkCriticalArrayType_0(expression, errorMessage) {
    if (!expression) {
      throw toJs(new jl.ArrayStoreException_0(valueOf_20(errorMessage)));
    }
  };
  ji2.checkCriticalConcurrentModification = function checkCriticalConcurrentModification(currentModCount, recordedModCount) {
    if (currentModCount != recordedModCount) {
      throw toJs(new ju.ConcurrentModificationException());
    }
  };
  ji2.checkCriticalElement = function checkCriticalElement(expression) {
    ji2.$clinit_InternalPreconditions();
    if (!expression) {
      throw toJs(new ju.NoSuchElementException());
    }
  };
  ji2.checkCriticalElementIndex = function checkCriticalElementIndex(index_0, size_0) {
    if (index_0 < 0 || index_0 >= size_0) {
      throw toJs(new jl.IndexOutOfBoundsException_0("Index: " + index_0 + ", Size: " + size_0));
    }
  };
  ji2.checkCriticalNotNull = function checkCriticalNotNull(reference) {
    ji2.$clinit_InternalPreconditions();
    if (jsEquals(reference, null)) {
      throw toJs(new jl.NullPointerException());
    }
    return reference;
  };
  ji2.checkCriticalNotNull_0 = function checkCriticalNotNull_0(reference, errorMessage) {
    if (jsEquals(reference, null)) {
      throw toJs(new jl.NullPointerException_1(valueOf_20(errorMessage)));
    }
  };
  ji2.checkCriticalPositionIndex = function checkCriticalPositionIndex(index_0, size_0) {
    if (index_0 < 0 || index_0 > size_0) {
      throw toJs(new jl.IndexOutOfBoundsException_0("Index: " + index_0 + ", Size: " + size_0));
    }
  };
  ji2.checkCriticalPositionIndexes = function checkCriticalPositionIndexes(start_0, end, size_0) {
    ji2.$clinit_InternalPreconditions();
    if (start_0 < 0 || end > size_0) {
      throw toJs(new jl.IndexOutOfBoundsException_0("fromIndex: " + start_0 + ", toIndex: " + end + ", size: " + size_0));
    }
    if (start_0 > end) {
      throw toJs(new jl.IllegalArgumentException_0("fromIndex: " + start_0 + " > toIndex: " + end));
    }
  };
  ji2.checkCriticalState = function checkCriticalState(expression) {
    if (!expression) {
      throw toJs(new jl.IllegalStateException());
    }
  };
  ji2.checkCriticalState_0 = function checkCriticalState_0(expression, errorMessage) {
    if (!expression) {
      throw toJs(new jl.IllegalStateException_0(valueOf_20(errorMessage)));
    }
  };
  ji2.checkCriticalStringBounds = function checkCriticalStringBounds(start_0, end, length_0) {
    ji2.$clinit_InternalPreconditions();
    if (start_0 < 0 || end > length_0 || end < start_0) {
      throw toJs(new jl.StringIndexOutOfBoundsException("fromIndex: " + start_0 + ", toIndex: " + end + ", length: " + length_0));
    }
  };
  ji2.checkCriticalStringElementIndex = function checkCriticalStringElementIndex(index_0, size_0) {
    if (index_0 < 0 || index_0 >= size_0) {
      throw toJs(new jl.StringIndexOutOfBoundsException("Index: " + index_0 + ", Size: " + size_0));
    }
  };
  ji2.checkCriticalType = function checkCriticalType(expression, message) {
    if (!expression) {
      throw toJs(new jl.ClassCastException(message));
    }
  };
  ji2.checkElement = function checkElement(expression) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_API_CHECKED) {
      ji2.checkCriticalElement(expression);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalElement(expression);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkElementIndex = function checkElementIndex(index_0, size_0) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_BOUNDS_CHECKED) {
      ji2.checkCriticalElementIndex(index_0, size_0);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalElementIndex(index_0, size_0);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkNotNull_0 = function checkNotNull_0(reference) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_API_CHECKED) {
      ji2.checkCriticalNotNull(reference);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalNotNull(reference);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
    return reference;
  };
  ji2.checkNotNull_1 = function checkNotNull_1(reference, errorMessage) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_API_CHECKED) {
      ji2.checkCriticalNotNull_0(reference, errorMessage);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalNotNull_0(reference, errorMessage);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkPositionIndex = function checkPositionIndex(index_0, size_0) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_BOUNDS_CHECKED) {
      ji2.checkCriticalPositionIndex(index_0, size_0);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalPositionIndex(index_0, size_0);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkPositionIndexes = function checkPositionIndexes(start_0, end, size_0) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_BOUNDS_CHECKED) {
      ji2.checkCriticalPositionIndexes(start_0, end, size_0);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalPositionIndexes(start_0, end, size_0);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkState = function checkState(expression) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_API_CHECKED) {
      ji2.checkCriticalState(expression);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalState(expression);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkState_0 = function checkState_0(expression, errorMessage) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_API_CHECKED) {
      ji2.checkCriticalState_0(expression, errorMessage);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalState_0(expression, errorMessage);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkStringBounds = function checkStringBounds(start_0, end, length_0) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_BOUNDS_CHECKED) {
      ji2.checkCriticalStringBounds(start_0, end, length_0);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalStringBounds(start_0, end, length_0);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkStringElementIndex = function checkStringElementIndex(index_0, size_0) {
    ji2.$clinit_InternalPreconditions();
    var e;
    if (ji2.IS_BOUNDS_CHECKED) {
      ji2.checkCriticalStringElementIndex(index_0, size_0);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalStringElementIndex(index_0, size_0);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.checkType = function checkType(expression) {
    ji2.$clinit_InternalPreconditions();
    ji2.checkType_0(expression, null);
  };
  ji2.checkType_0 = function checkType_0(expression, message) {
    var e;
    if (ji2.IS_TYPE_CHECKED) {
      ji2.checkCriticalType(expression, message);
    } else if (ji2.IS_ASSERTED) {
      try {
        ji2.checkCriticalType(expression, message);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 23)) {
          e = $e0;
          throw toJs(new jl.AssertionError_5(e));
        } else
          throw toJs($e0);
      }
    }
  };
  ji2.isApiChecked = function isApiChecked() {
    ji2.$clinit_InternalPreconditions();
    return ji2.IS_API_CHECKED || ji2.IS_ASSERTED;
  };
  ji2.isTypeChecked = function isTypeChecked() {
    ji2.$clinit_InternalPreconditions();
    return ji2.IS_TYPE_CHECKED || ji2.IS_ASSERTED;
  };
  defineClass(634, 1, { 1: 1 });
  ji2.CHECK_API = "AUTO";
  ji2.CHECK_BOUNDS = "AUTO";
  ji2.CHECK_NUMERIC = "AUTO";
  ji2.CHECK_TYPE = "ENABLED";
  ji2.IS_API_CHECKED = false;
  ji2.IS_ASSERTED = false;
  ji2.IS_BOUNDS_CHECKED = false;
  ji2.IS_NUMERIC_CHECKED = false;
  ji2.IS_TYPE_CHECKED = false;
  ji2.LEVEL_MINIMAL_OR_HIGHER = false;
  ji2.LEVEL_NORMAL_OR_HIGHER = false;
  ji2.LEVEL_OPT_OR_HIGHER = false;
  ji2.$clinit_JsUtils = function $clinit_JsUtils() {
    ji2.$clinit_JsUtils = emptyMethod;
    jl.$clinit_Object();
  };
  ji2.JsUtils = function JsUtils() {
    Object_0.call(this);
    this.$init_404();
  };
  ji2.doubleToRawLongBits_0 = function doubleToRawLongBits_0(value_0) {
    ji2.$clinit_JsUtils();
    var buf, intBits;
    buf = new ArrayBuffer(8);
    ji2.uncheckedCast(new Float64Array(buf))[0] = value_0;
    intBits = ji2.uncheckedCast(new Uint32Array(buf));
    return ji2.fromBits_0(intBits[0] | 0, intBits[1] | 0);
  };
  ji2.floatToRawIntBits = function floatToRawIntBits(value_0) {
    var buf;
    buf = new ArrayBuffer(4);
    ji2.uncheckedCast(new Float32Array(buf))[0] = value_0;
    return ji2.uncheckedCast(new Uint32Array(buf))[0] | 0;
  };
  ji2.getProperty = function getProperty(map_0, key) {
    ji2.$clinit_JsUtils();
    return map_0[key];
  };
  ji2.intBitsToFloat = function intBitsToFloat(value_0) {
    var buf;
    buf = new ArrayBuffer(4);
    ji2.uncheckedCast(new Uint32Array(buf))[0] = value_0;
    return ji2.uncheckedCast(new Float32Array(buf))[0];
  };
  ji2.intToString = function intToString(value_0, radix) {
    ji2.$clinit_JsUtils();
    return ji2.numberToString(value_0, radix);
  };
  ji2.isUndefined = function isUndefined(value_0) {
    ji2.$clinit_JsUtils();
    return value_0 === void 0;
  };
  ji2.longBitsToDouble_0 = function longBitsToDouble_0(value_0) {
    ji2.$clinit_JsUtils();
    var buf, intBits;
    buf = new ArrayBuffer(8);
    intBits = ji2.uncheckedCast(new Uint32Array(buf));
    intBits[0] = toInt_0(value_0);
    intBits[1] = ji2.getHighBits(value_0);
    return ji2.uncheckedCast(new Float64Array(buf))[0];
  };
  ji2.numberToString = function numberToString(value_0, radix) {
    var number;
    number = ji2.uncheckedCast(value_0);
    return number.toString(radix);
  };
  ji2.toDoubleFromUnsignedInt = function toDoubleFromUnsignedInt(value_0) {
    ji2.$clinit_JsUtils();
    return value_0 >>> 0;
  };
  ji2.toPrecision = function toPrecision(value_0, precision) {
    ji2.$clinit_JsUtils();
    var number;
    number = ji2.uncheckedCast(value_0);
    return number.toPrecision(precision);
  };
  ji2.uintToString = function uintToString(value_0, radix) {
    ji2.$clinit_JsUtils();
    return ji2.numberToString(ji2.toDoubleFromUnsignedInt(value_0), radix);
  };
  ji2.uncheckedCast = function uncheckedCast(o) {
    ji2.$clinit_JsUtils();
    return o;
  };
  ji2.unsafeCastToBoolean = function unsafeCastToBoolean(bool) {
    ji2.$clinit_JsUtils();
    return bool;
  };
  ji2.unsafeCastToDouble = function unsafeCastToDouble(number) {
    ji2.$clinit_JsUtils();
    return number;
  };
  defineClass(624, 1, { 1: 1 });
  _.$init_404 = function $init_404() {
  };
  cggl.Ljava_lang_Object_2_classLit = createForClass("java.lang", "Object", 1, null);
  cggl.Lcom_google_gwt_core_client_GWT_2_classLit = createForClass("com.google.gwt.core.client", "GWT", 504, cggl.Ljava_lang_Object_2_classLit);
  cggl.Ljava_io_Serializable_2_classLit = createForInterface("java.io", "Serializable");
  cggl.Ljava_lang_Throwable_2_classLit = createForClass("java.lang", "Throwable", 18, cggl.Ljava_lang_Object_2_classLit);
  cggl.Ljava_lang_Exception_2_classLit = createForClass("java.lang", "Exception", 12, cggl.Ljava_lang_Throwable_2_classLit);
  cggl.Ljava_lang_RuntimeException_2_classLit = createForClass("java.lang", "RuntimeException", 23, cggl.Ljava_lang_Exception_2_classLit);
  cggl.Ljava_lang_JsException_2_classLit = createForClass("java.lang", "JsException", 153, cggl.Ljava_lang_RuntimeException_2_classLit);
  cggl.Lcom_google_gwt_core_client_impl_JavaScriptExceptionBase_2_classLit = createForClass("com.google.gwt.core.client.impl", "JavaScriptExceptionBase", 416, cggl.Ljava_lang_JsException_2_classLit);
  cggl.Lcom_google_gwt_core_client_JavaScriptException_2_classLit = createForClass("com.google.gwt.core.client", "JavaScriptException", 159, cggl.Lcom_google_gwt_core_client_impl_JavaScriptExceptionBase_2_classLit);
  cggl.Lcom_google_gwt_core_client_JavaScriptObject_2_classLit = createForClass("com.google.gwt.core.client", "JavaScriptObject$", 0, cggl.Ljava_lang_Object_2_classLit);
  cggl.Lcom_google_gwt_core_client_impl_StackTraceCreator_2_classLit = createForClass("com.google.gwt.core.client.impl", "StackTraceCreator", 636, cggl.Ljava_lang_Object_2_classLit);
  cggl.Lcom_google_gwt_core_client_impl_StackTraceCreator$Collector_2_classLit = createForClass("com.google.gwt.core.client.impl", "StackTraceCreator/Collector", 180, cggl.Ljava_lang_Object_2_classLit);
  cggl.Lcom_google_gwt_core_client_impl_StackTraceCreator$CollectorLegacy_2_classLit = createForClass("com.google.gwt.core.client.impl", "StackTraceCreator/CollectorLegacy", 365, cggl.Lcom_google_gwt_core_client_impl_StackTraceCreator$Collector_2_classLit);
  cggl.Lcom_google_gwt_core_client_impl_StackTraceCreator$CollectorModern_2_classLit = createForClass("com.google.gwt.core.client.impl", "StackTraceCreator/CollectorModern", 181, cggl.Lcom_google_gwt_core_client_impl_StackTraceCreator$Collector_2_classLit);
  cggl.Lcom_google_gwt_core_client_impl_StackTraceCreator$CollectorModernNoSourceMap_2_classLit = createForClass("com.google.gwt.core.client.impl", "StackTraceCreator/CollectorModernNoSourceMap", 366, cggl.Lcom_google_gwt_core_client_impl_StackTraceCreator$CollectorModern_2_classLit);
  cggl.Lcom_google_gwt_lang_Array_2_classLit = createForClass("com.google.gwt.lang", "Array", 599, cggl.Ljava_lang_Object_2_classLit);
  cggl.Lcom_google_gwt_lang_Cast_2_classLit = createForClass("com.google.gwt.lang", "Cast", 600, cggl.Ljava_lang_Object_2_classLit);
  cggl.Lcom_google_gwt_lang_Exceptions_2_classLit = createForClass("com.google.gwt.lang", "Exceptions", 602, cggl.Ljava_lang_Object_2_classLit);
  cggl.Lcom_google_gwt_lang_Util_2_classLit = createForClass("com.google.gwt.lang", "Util", 607, cggl.Ljava_lang_Object_2_classLit);
  cggl.Ljava_lang_ArrayStoreException_2_classLit = createForClass("java.lang", "ArrayStoreException", 270, cggl.Ljava_lang_RuntimeException_2_classLit);
  cggl.Ljava_lang_Error_2_classLit = createForClass("java.lang", "Error", 122, cggl.Ljava_lang_Throwable_2_classLit);
  cggl.Ljava_lang_AssertionError_2_classLit = createForClass("java.lang", "AssertionError", 34, cggl.Ljava_lang_Error_2_classLit);
  cggl.Ljava_lang_Comparable_2_classLit = createForInterface("java.lang", "Comparable");
  cggl.Ljava_lang_Boolean_2_classLit = createForClass("java.lang", "Boolean", 355, cggl.Ljava_lang_Object_2_classLit);
  cggl.Ljava_lang_CharSequence_2_classLit = createForInterface("java.lang", "CharSequence");
  cggl.Ljava_lang_reflect_Type_2_classLit = createForInterface("java.lang.reflect", "Type");
  cggl.Ljava_lang_Class_2_classLit = createForClass("java.lang", "Class", 233, cggl.Ljava_lang_Object_2_classLit);
  cggl.Ljava_lang_ClassCastException_2_classLit = createForClass("java.lang", "ClassCastException", 362, cggl.Ljava_lang_RuntimeException_2_classLit);
  cggl.Ljava_lang_Number_2_classLit = createForClass("java.lang", "Number", 19, cggl.Ljava_lang_Object_2_classLit);
  cggl.Ljava_lang_Double_2_classLit = createForClass("java.lang", "Double", 357, cggl.Ljava_lang_Number_2_classLit);
  cggl.Ljava_lang_IllegalStateException_2_classLit = createForClass("java.lang", "IllegalStateException", 140, cggl.Ljava_lang_RuntimeException_2_classLit);
  cggl.Ljava_lang_IndexOutOfBoundsException_2_classLit = createForClass("java.lang", "IndexOutOfBoundsException", 82, cggl.Ljava_lang_RuntimeException_2_classLit);
  cggl.Ljava_lang_Integer_2_classLit = createForClass("java.lang", "Integer", 35, cggl.Ljava_lang_Number_2_classLit);
  cggl.Ljava_lang_NullPointerException_2_classLit = createForClass("java.lang", "NullPointerException", 75, cggl.Ljava_lang_JsException_2_classLit);
  cggl.Ljava_lang_String_2_classLit = createForClass("java.lang", "String", 2, cggl.Ljava_lang_Object_2_classLit);
  cggl.Ljava_util_Comparator_2_classLit = createForInterface("java.util", "Comparator");
  cggl.Ljava_lang_String$1_2_classLit = createForClass("java.lang", "String/1", 289, cggl.Ljava_lang_Object_2_classLit);
  cggl.Ljava_lang_StringIndexOutOfBoundsException_2_classLit = createForClass("java.lang", "StringIndexOutOfBoundsException", 255, cggl.Ljava_lang_IndexOutOfBoundsException_2_classLit);
  cggl.Ljavaemul_internal_ArrayHelper_2_classLit = createForClass("javaemul.internal", "ArrayHelper", 626, cggl.Ljava_lang_Object_2_classLit);
  cggl.Ljavaemul_internal_Coercions_2_classLit = createForClass("javaemul.internal", "Coercions", 640, cggl.Ljava_lang_Object_2_classLit);
  cggl.Ljavaemul_internal_HashCodes_2_classLit = createForClass("javaemul.internal", "HashCodes", 623, cggl.Ljava_lang_Object_2_classLit);
  cggl.Ljavaemul_internal_InternalPreconditions_2_classLit = createForClass("javaemul.internal", "InternalPreconditions", 634, cggl.Ljava_lang_Object_2_classLit);
  cggl.Ljavaemul_internal_JsUtils_2_classLit = createForClass("javaemul.internal", "JsUtils", 624, cggl.Ljava_lang_Object_2_classLit);
  carc.$clinit_ProgressListener = function $clinit_ProgressListener() {
    carc.$clinit_ProgressListener = emptyMethod;
  };
  cggl.Lcom_actelion_research_calc_ProgressListener_2_classLit = createForInterface("com.actelion.research.calc", "ProgressListener");
  carc.$clinit_SingularValueDecomposition = function $clinit_SingularValueDecomposition() {
    carc.$clinit_SingularValueDecomposition = emptyMethod;
    jl.$clinit_Object();
  };
  carc.SingularValueDecomposition = function SingularValueDecomposition(A, progressListener, threadMaster) {
    carc.$clinit_SingularValueDecomposition();
    var b, c, cs, e, ek, epm1, eps, f, g, i, i0, i1, i2, iter, j, j0, j1, k, k0, kase, ks, nct, nrt, nu, p, pp, scale, shift_0, sk, sn, sp, spm1, t, wantu, wantv, work;
    Object_0.call(this);
    this.$init_0();
    this.m_0 = A.length;
    this.n = A[0].length;
    nu = $wnd.Math.min(this.m_0, this.n);
    this.s = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, $wnd.Math.min(this.m_0 + 1, this.n), 15, 1);
    this.U = initMultidimensionalArray(cggl.D_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 11: 1, 4: 1, 1: 1 }], [11, 5], 15, [this.m_0, nu], 2);
    this.V = initMultidimensionalArray(cggl.D_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 11: 1, 4: 1, 1: 1 }], [11, 5], 15, [this.n, this.n], 2);
    e = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.n, 15, 1);
    work = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.m_0, 15, 1);
    wantu = true;
    wantv = true;
    nct = $wnd.Math.min(this.m_0 - 1, this.n);
    nrt = $wnd.Math.max(0, $wnd.Math.min(this.n - 2, this.m_0));
    if (isNotNull(progressListener))
      progressListener.startProgress("Initializing SVD...", 0, $wnd.Math.max(nct, nrt));
    for (k0 = 0; k0 < $wnd.Math.max(nct, nrt); k0++) {
      if (isNotNull(progressListener))
        progressListener.updateProgress(k0);
      if (isNotNull(threadMaster) && threadMaster.threadMustDie())
        return;
      if (k0 < nct) {
        this.s[k0] = 0;
        for (i0 = k0; i0 < this.m_0; i0++) {
          this.s[k0] = carc.hypot(this.s[k0], A[i0][k0]);
        }
        if (this.s[k0] != 0) {
          if (A[k0][k0] < 0) {
            this.s[k0] = -this.s[k0];
          }
          for (i = k0; i < this.m_0; i++) {
            A[i][k0] /= this.s[k0];
          }
          A[k0][k0] += 1;
        }
        this.s[k0] = -this.s[k0];
      }
      for (j0 = k0 + 1; j0 < this.n; j0++) {
        if (k0 < nct & this.s[k0] != 0) {
          t = 0;
          for (i0 = k0; i0 < this.m_0; i0++) {
            t += A[i0][k0] * A[i0][j0];
          }
          t = -t / A[k0][k0];
          for (i = k0; i < this.m_0; i++) {
            A[i][j0] += t * A[i][k0];
          }
        }
        e[j0] = A[k0][j0];
      }
      if (wantu & k0 < nct) {
        for (i = k0; i < this.m_0; i++) {
          this.U[i][k0] = A[i][k0];
        }
      }
      if (k0 < nrt) {
        e[k0] = 0;
        for (i0 = k0 + 1; i0 < this.n; i0++) {
          e[k0] = carc.hypot(e[k0], e[i0]);
        }
        if (e[k0] != 0) {
          if (e[k0 + 1] < 0) {
            e[k0] = -e[k0];
          }
          for (i = k0 + 1; i < this.n; i++) {
            e[i] /= e[k0];
          }
          e[k0 + 1] += 1;
        }
        e[k0] = -e[k0];
        if (k0 + 1 < this.m_0 & e[k0] != 0) {
          for (i1 = k0 + 1; i1 < this.m_0; i1++) {
            work[i1] = 0;
          }
          for (j1 = k0 + 1; j1 < this.n; j1++) {
            for (i = k0 + 1; i < this.m_0; i++) {
              work[i] += e[j1] * A[i][j1];
            }
          }
          for (j = k0 + 1; j < this.n; j++) {
            t = -e[j] / e[k0 + 1];
            for (i = k0 + 1; i < this.m_0; i++) {
              A[i][j] += t * work[i];
            }
          }
        }
        if (wantv) {
          for (i = k0 + 1; i < this.n; i++) {
            this.V[i][k0] = e[i];
          }
        }
      }
    }
    p = $wnd.Math.min(this.n, this.m_0 + 1);
    if (nct < this.n) {
      this.s[nct] = A[nct][nct];
    }
    if (this.m_0 < p) {
      this.s[p - 1] = 0;
    }
    if (nrt + 1 < p) {
      e[nrt] = A[nrt][p - 1];
    }
    e[p - 1] = 0;
    if (wantu) {
      if (isNotNull(progressListener))
        progressListener.startProgress("generating eigenvalues...", 0, nct);
      for (j0 = nct; j0 < nu; j0++) {
        for (i = 0; i < this.m_0; i++) {
          this.U[i][j0] = 0;
        }
        this.U[j0][j0] = 1;
      }
      for (k = nct - 1; k >= 0; k--) {
        if (isNotNull(progressListener))
          progressListener.updateProgress(nct - k);
        if (isNotNull(threadMaster) && threadMaster.threadMustDie())
          return;
        if (this.s[k] != 0) {
          for (j = k + 1; j < nu; j++) {
            t = 0;
            for (i0 = k; i0 < this.m_0; i0++) {
              t += this.U[i0][k] * this.U[i0][j];
            }
            t = -t / this.U[k][k];
            for (i1 = k; i1 < this.m_0; i1++) {
              this.U[i1][j] += t * this.U[i1][k];
            }
          }
          for (i2 = k; i2 < this.m_0; i2++) {
            this.U[i2][k] = -this.U[i2][k];
          }
          this.U[k][k] = 1 + this.U[k][k];
          for (i = 0; i < k - 1; i++) {
            this.U[i][k] = 0;
          }
        } else {
          for (i = 0; i < this.m_0; i++) {
            this.U[i][k] = 0;
          }
          this.U[k][k] = 1;
        }
      }
    }
    if (wantv) {
      if (isNotNull(progressListener))
        progressListener.startProgress("generating eigenvectors...", 0, this.n);
      for (k = this.n - 1; k >= 0; k--) {
        if (isNotNull(progressListener))
          progressListener.updateProgress(this.n - k);
        if (isNotNull(threadMaster) && threadMaster.threadMustDie())
          return;
        if (k < nrt & e[k] != 0) {
          for (j = k + 1; j < nu; j++) {
            t = 0;
            for (i0 = k + 1; i0 < this.n; i0++) {
              t += this.V[i0][k] * this.V[i0][j];
            }
            t = -t / this.V[k + 1][k];
            for (i1 = k + 1; i1 < this.n; i1++) {
              this.V[i1][j] += t * this.V[i1][k];
            }
          }
        }
        for (i = 0; i < this.n; i++) {
          this.V[i][k] = 0;
        }
        this.V[k][k] = 1;
      }
    }
    pp = p - 1;
    iter = 0;
    eps = $wnd.Math.pow(2, -52);
    if (isNotNull(progressListener))
      progressListener.startProgress("locating negligible elements...", 0, pp + 1);
    while (p > 0) {
      if (isNotNull(progressListener))
        progressListener.updateProgress(pp - p);
      if (isNotNull(threadMaster) && threadMaster.threadMustDie())
        return;
      for (k = p - 2; k >= -1; k--) {
        if (k == -1) {
          break;
        }
        if ($wnd.Math.abs(e[k]) <= eps * ($wnd.Math.abs(this.s[k]) + $wnd.Math.abs(this.s[k + 1]))) {
          e[k] = 0;
          break;
        }
      }
      if (k == p - 2) {
        kase = 4;
      } else {
        for (ks = p - 1; ks >= k; ks--) {
          if (ks == k) {
            break;
          }
          t = (ks != p ? $wnd.Math.abs(e[ks]) : 0) + (ks != k + 1 ? $wnd.Math.abs(e[ks - 1]) : 0);
          if ($wnd.Math.abs(this.s[ks]) <= eps * t) {
            this.s[ks] = 0;
            break;
          }
        }
        if (ks == k) {
          kase = 3;
        } else if (ks == p - 1) {
          kase = 1;
        } else {
          kase = 2;
          k = ks;
        }
      }
      k++;
      switch (kase) {
        case 1:
          {
            f = e[p - 2];
            e[p - 2] = 0;
            for (j = p - 2; j >= k; j--) {
              t = carc.hypot(this.s[j], f);
              cs = this.s[j] / t;
              sn = f / t;
              this.s[j] = t;
              if (j != k) {
                f = -sn * e[j - 1];
                e[j - 1] = cs * e[j - 1];
              }
              if (wantv) {
                for (i = 0; i < this.n; i++) {
                  t = cs * this.V[i][j] + sn * this.V[i][p - 1];
                  this.V[i][p - 1] = -sn * this.V[i][j] + cs * this.V[i][p - 1];
                  this.V[i][j] = t;
                }
              }
            }
          }
          break;
        case 2:
          {
            f = e[k - 1];
            e[k - 1] = 0;
            for (j = k; j < p; j++) {
              t = carc.hypot(this.s[j], f);
              cs = this.s[j] / t;
              sn = f / t;
              this.s[j] = t;
              f = -sn * e[j];
              e[j] = cs * e[j];
              if (wantu) {
                for (i = 0; i < this.m_0; i++) {
                  t = cs * this.U[i][j] + sn * this.U[i][k - 1];
                  this.U[i][k - 1] = -sn * this.U[i][j] + cs * this.U[i][k - 1];
                  this.U[i][j] = t;
                }
              }
            }
          }
          break;
        case 3:
          {
            scale = $wnd.Math.max($wnd.Math.max($wnd.Math.max($wnd.Math.max($wnd.Math.abs(this.s[p - 1]), $wnd.Math.abs(this.s[p - 2])), $wnd.Math.abs(e[p - 2])), $wnd.Math.abs(this.s[k])), $wnd.Math.abs(e[k]));
            sp = this.s[p - 1] / scale;
            spm1 = this.s[p - 2] / scale;
            epm1 = e[p - 2] / scale;
            sk = this.s[k] / scale;
            ek = e[k] / scale;
            b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) / 2;
            c = sp * epm1 * (sp * epm1);
            shift_0 = 0;
            if (b != 0 | c != 0) {
              shift_0 = $wnd.Math.sqrt(b * b + c);
              if (b < 0) {
                shift_0 = -shift_0;
              }
              shift_0 = c / (b + shift_0);
            }
            f = (sk + sp) * (sk - sp) + shift_0;
            g = sk * ek;
            for (j = k; j < p - 1; j++) {
              t = carc.hypot(f, g);
              cs = f / t;
              sn = g / t;
              if (j != k) {
                e[j - 1] = t;
              }
              f = cs * this.s[j] + sn * e[j];
              e[j] = cs * e[j] - sn * this.s[j];
              g = sn * this.s[j + 1];
              this.s[j + 1] = cs * this.s[j + 1];
              if (wantv) {
                for (i = 0; i < this.n; i++) {
                  t = cs * this.V[i][j] + sn * this.V[i][j + 1];
                  this.V[i][j + 1] = -sn * this.V[i][j] + cs * this.V[i][j + 1];
                  this.V[i][j] = t;
                }
              }
              t = carc.hypot(f, g);
              cs = f / t;
              sn = g / t;
              this.s[j] = t;
              f = cs * e[j] + sn * this.s[j + 1];
              this.s[j + 1] = -sn * e[j] + cs * this.s[j + 1];
              g = sn * e[j + 1];
              e[j + 1] = cs * e[j + 1];
              if (wantu && j < this.m_0 - 1) {
                for (i = 0; i < this.m_0; i++) {
                  t = cs * this.U[i][j] + sn * this.U[i][j + 1];
                  this.U[i][j + 1] = -sn * this.U[i][j] + cs * this.U[i][j + 1];
                  this.U[i][j] = t;
                }
              }
            }
            e[p - 2] = f;
            iter = iter + 1;
          }
          break;
        case 4:
          {
            if (this.s[k] <= 0) {
              this.s[k] = this.s[k] < 0 ? -this.s[k] : 0;
              if (wantv) {
                for (i = 0; i <= pp; i++) {
                  this.V[i][k] = -this.V[i][k];
                }
              }
            }
            while (k < pp) {
              if (this.s[k] >= this.s[k + 1]) {
                break;
              }
              t = this.s[k];
              this.s[k] = this.s[k + 1];
              this.s[k + 1] = t;
              if (wantv && k < this.n - 1) {
                for (i = 0; i < this.n; i++) {
                  t = this.V[i][k + 1];
                  this.V[i][k + 1] = this.V[i][k];
                  this.V[i][k] = t;
                }
              }
              if (wantu && k < this.m_0 - 1) {
                for (i = 0; i < this.m_0; i++) {
                  t = this.U[i][k + 1];
                  this.U[i][k + 1] = this.U[i][k];
                  this.U[i][k] = t;
                }
              }
              k++;
            }
            iter = 0;
            p--;
          }
          break;
      }
    }
  };
  carc.hypot = function hypot(a, b) {
    var r;
    if ($wnd.Math.abs(a) > $wnd.Math.abs(b)) {
      r = b / a;
      r = $wnd.Math.abs(a) * $wnd.Math.sqrt(1 + r * r);
    } else if (b != 0) {
      r = a / b;
      r = $wnd.Math.abs(b) * $wnd.Math.sqrt(1 + r * r);
    } else {
      r = 0;
    }
    return r;
  };
  defineClass(225, 1, { 4: 1, 1: 1 }, carc.SingularValueDecomposition);
  _.$init_0 = function $init_0() {
  };
  _.getSingularValues = function getSingularValues() {
    return this.s;
  };
  _.getU = function getU() {
    return this.U;
  };
  _.m_0 = 0;
  _.n = 0;
  carc.serialVersionUID = 537985828;
  cggl.Lcom_actelion_research_calc_SingularValueDecomposition_2_classLit = createForClass("com.actelion.research.calc", "SingularValueDecomposition", 225, cggl.Ljava_lang_Object_2_classLit);
  carc.$clinit_ThreadMaster = function $clinit_ThreadMaster() {
    carc.$clinit_ThreadMaster = emptyMethod;
  };
  cggl.Lcom_actelion_research_calc_ThreadMaster_2_classLit = createForInterface("com.actelion.research.calc", "ThreadMaster");
  carc2.$clinit_AbstractDepictor = function $clinit_AbstractDepictor() {
    carc2.$clinit_AbstractDepictor = emptyMethod;
    jl.$clinit_Object();
    carc2.ATOM_LABEL_COLOR = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [0, 16777215, 14286847, 13402367, 12779264, 16758197, 9474192, 3166456, 16715021, 9494608, 11789301, 11230450, 9109248, 12560038, 1578e4, 16744448, 16777008, 2093087, 8442339, 9388244, 4062976, 15132390, 12567239, 10921643, 9083335, 10255047, 14706227, 15765664, 5296208, 13140019, 8224944, 12750735, 6721423, 12419299, 16752896, 10889513, 6076625, 7351984, 65280, 9764863, 9756896, 7586505, 5551541, 3907230, 2396047, 687500, 27013, 12632256, 16767375, 10909043, 6717568, 10380213, 13924864, 9699476, 4366e3, 5707663, 51456, 7394559, 16777159, 14286791, 13107143, 10747847, 9437127, 6422471, 4587463, 3211207, 2097095, 65436, 58997, 54354, 48952, 43812, 5096191, 5089023, 2200790, 2522539, 2516630, 1528967, 13684960, 16765219, 12105936, 10900557, 5724513, 10375093, 11230208, 7688005, 4358806, 4325478, 32e3, 7384058, 47871, 41471, 36863, 33023, 27647, 5528818, 7888099, 9064419, 10565332, 11739092, 11739066, 11734438, 12389767, 13041766, 13369433, 13697103, 14221381, 14680120, 15073326, 15400998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13158600, 1334015, 56540, 15075850, 15132160, 56540, 15075850, 15461355, 8553170, 1016335, 1016335, 1334015, 15132160, 3289770, 14456450, 16422400, 16422400, 11819700, 3289770, 1016335]);
    carc2.COLOR_UNDEFINED = -1;
    carc2.COLOR_HILITE_BOND_BG = -2;
    carc2.COLOR_HILITE_BOND_FG = -3;
    carc2.COLOR_OVERRULED = -4;
    carc2.COLOR_RGB = -5;
    carc2.COLOR_CUSTOM_FOREGROUND = -6;
    carc2.COLOR_EXCLUDE_GROUP_BG = -7;
    carc2.COLOR_EXCLUDE_GROUP_FG = -8;
    carc2.COLOR_RESTORE_PREVIOUS = -9;
    carc2.COLOR_INITIALIZE = -10;
    carc2.cOptAvBondLen = round_int(24);
  };
  carc2.AbstractDepictor = function AbstractDepictor(mol) {
    carc2.$clinit_AbstractDepictor();
    carc2.AbstractDepictor_0.call(this, mol, 0);
  };
  carc2.AbstractDepictor_0 = function AbstractDepictor_0(mol, displayMode) {
    carc2.$clinit_AbstractDepictor();
    Object_0.call(this);
    this.$init_1();
    this.mMol = mol;
    this.mDisplayMode = displayMode;
    this.init();
  };
  defineClass(161, 1, { 1: 1 });
  _.$init_1 = function $init_1() {
    this.mBoundingRect = new cargg.GenericRectangle();
  };
  _.addChiralInfo = function addChiralInfo() {
    var avbl, chiralText;
    if ((this.mDisplayMode & 32) != 0)
      return;
    chiralText = this.mMol.getChiralText_0();
    if (jsNotEquals(chiralText, null)) {
      if (this.mChiralTextLocation.x_0 == 0 && this.mChiralTextLocation.y_0 == 0) {
        avbl = this.mTransformation.getScaling() * this.mMol.getAverageBondLength_0();
        this.mBoundingRect = this.simpleCalculateBounds();
        this.expandBoundsByTabuZones(avbl);
        this.setChiralTextLocation(null, avbl, 0);
      }
      this.setTextSize(round_int(this.mChiralTextSize));
      if (this.mMol.getMoleculeColor_0() != 1)
        this.setColorCode(448);
      this.drawString_0(chiralText, this.mChiralTextLocation.x_0, this.mChiralTextLocation.y_0 + 0.30000001192092896 * this.mChiralTextSize);
    }
  };
  _.append = function append(a, b) {
    return jsEquals(a, null) ? b : jsEquals(b, null) ? a : a + "," + b;
  };
  _.applyTransformation_0 = function applyTransformation(t) {
    t.applyTo_0(this.mTransformation);
    t.applyTo_3(this.mBoundingRect);
    t.applyTo_2(this.mChiralTextLocation);
  };
  _.calculateParameters = function calculateParameters() {
    var averageBondLength;
    averageBondLength = this.mTransformation.getScaling() * (this.mAtomLabelAVBL != 0 ? this.mAtomLabelAVBL : this.mMol.getAverageBondLength_0());
    this.mpLineWidth = averageBondLength * carc2.cFactorLineWidth;
    this.mpBondSpacing = averageBondLength * carc2.cFactorBondSpacing;
    this.mpBondHiliteRadius = averageBondLength * 0.38;
    this.mpExcludeGroupRadius = averageBondLength * 0.47;
    this.mpLabelSize = round_int(averageBondLength * this.mFactorTextSize * carc2.cFactorTextSize + 0.5);
    this.mpDotDiameter = averageBondLength * 0.12;
    this.mpQFDiameter = averageBondLength * 0.4;
    this.mChiralTextSize = averageBondLength * 0.5 + 0.5;
  };
  _.createRingSizeText = function createRingSizeText(queryFeatures) {
    var customOption, i;
    queryFeatures = and_0(queryFeatures, 545460846592);
    for (i = 0; i < (carge.$clinit_AtomQueryFeatureDialogBuilder(), carge.RING_SIZE_VALUES).length; i++)
      if (eq(queryFeatures, (carge.$clinit_AtomQueryFeatureDialogBuilder(), carge.RING_SIZE_VALUES)[i]))
        return (carge.$clinit_AtomQueryFeatureDialogBuilder(), carge.RING_SIZE_SHORT_TEXT)[i];
    customOption = new jl.StringBuilder_1("R");
    if (neq(and_0(queryFeatures, 4294967296), 0))
      customOption.append_9("0");
    if (neq(and_0(queryFeatures, 8589934592), 0))
      customOption.append_9("3");
    if (neq(and_0(queryFeatures, 17179869184), 0))
      customOption.append_9("4");
    if (neq(and_0(queryFeatures, 34359738368), 0))
      customOption.append_9("5");
    if (neq(and_0(queryFeatures, 68719476736), 0))
      customOption.append_9("6");
    if (neq(and_0(queryFeatures, 137438953472), 0))
      customOption.append_9("7");
    if (neq(and_0(queryFeatures, 274877906944), 0))
      customOption.append_9("8");
    return customOption.toString_0();
  };
  _.drawColorLine = function drawColorLine(theLine, atm1, atm2) {
    var line1, line2;
    line1 = new carc2.AbstractDepictor$DepictorLine();
    line2 = new carc2.AbstractDepictor$DepictorLine();
    line1.x1 = theLine.x1;
    line1.y1 = theLine.y1;
    line1.x2 = (theLine.x1 + theLine.x2) / 2;
    line1.y2 = (theLine.y1 + theLine.y2) / 2;
    line2.x1 = line1.x2;
    line2.y1 = line1.y2;
    line2.x2 = theLine.x2;
    line2.y2 = theLine.y2;
    if (this.mpProperLine(line1)) {
      this.setColorCode(this.mAtomColor[atm1]);
      this.drawBlackLine(line1);
    }
    if (this.mpProperLine(line2)) {
      this.setColorCode(this.mAtomColor[atm2]);
      this.drawBlackLine(line2);
    }
    this.setColorCode(this.mStandardForegroundColor);
  };
  _.drawDashedLine = function drawDashedLine(theLine, atom1, atom2) {
    var aLine, color1, color2, xinc, yinc;
    xinc = (theLine.x2 - theLine.x1) / 10;
    yinc = (theLine.y2 - theLine.y1) / 10;
    aLine = new carc2.AbstractDepictor$DepictorLine();
    if (this.mMol.isBondForegroundHilited_0(this.mMol.getBond_0(atom1, atom2))) {
      color1 = -3;
      color2 = -3;
    } else {
      color1 = this.mAtomColor[atom1];
      color2 = this.mAtomColor[atom2];
    }
    this.setColorCode(color1);
    aLine.x1 = theLine.x1;
    aLine.y1 = theLine.y1;
    aLine.x2 = theLine.x1 + xinc * 2;
    aLine.y2 = theLine.y1 + yinc * 2;
    this.drawBlackLine(aLine);
    aLine.x1 = theLine.x1 + xinc * 4;
    aLine.y1 = theLine.y1 + yinc * 4;
    aLine.x2 = theLine.x1 + xinc * 5;
    aLine.y2 = theLine.y1 + yinc * 5;
    this.drawBlackLine(aLine);
    this.setColorCode(color2);
    aLine.x1 = theLine.x1 + xinc * 5;
    aLine.y1 = theLine.y1 + yinc * 5;
    aLine.x2 = theLine.x1 + xinc * 6;
    aLine.y2 = theLine.y1 + yinc * 6;
    this.drawBlackLine(aLine);
    aLine.x1 = theLine.x1 + xinc * 8;
    aLine.y1 = theLine.y1 + yinc * 8;
    aLine.x2 = theLine.x2;
    aLine.y2 = theLine.y2;
    this.drawBlackLine(aLine);
    this.setColorCode(this.mStandardForegroundColor);
  };
  _.drawDot = function drawDot(x_0, y_0) {
    this.fillCircle_0(x_0 - this.mpDotDiameter / 2, y_0 - this.mpDotDiameter / 2, this.mpDotDiameter);
  };
  _.drawLine_0 = function drawLine(theLine, atom1, atom2) {
    if (this.mMol.isBondForegroundHilited_0(this.mMol.getBond_0(atom1, atom2))) {
      this.setColorCode(-3);
      this.drawBlackLine(theLine);
      this.setColorCode(this.mStandardForegroundColor);
    } else if (this.mAtomColor[atom1] != this.mAtomColor[atom2]) {
      this.drawColorLine(theLine, atom1, atom2);
    } else if (this.mAtomColor[atom1] != 0) {
      this.setColorCode(this.mAtomColor[atom1]);
      this.drawBlackLine(theLine);
      this.setColorCode(this.mStandardForegroundColor);
    } else {
      this.drawBlackLine(theLine);
    }
  };
  _.drawOffsetLine = function drawOffsetLine(theLine, atom1, atom2, dx, dy, aLine) {
    aLine.x1 = theLine.x1 + dx;
    aLine.y1 = theLine.y1 + dy;
    aLine.x2 = theLine.x2 + dx;
    aLine.y2 = theLine.y2 + dy;
    this.drawLine_0(aLine, atom1, atom2);
  };
  _.drawShortDashedLine = function drawShortDashedLine(theLine, atom1, atom2) {
    var color1, color2, i, i0, length_0, points, x_0, xdif, xinc, y_0, ydif, yinc;
    xdif = theLine.x2 - theLine.x1;
    ydif = theLine.y2 - theLine.y1;
    length_0 = $wnd.Math.sqrt(xdif * xdif + ydif * ydif);
    points = 2 * toInt_0(jl.round_1(length_0 / (4 * this.mpLineWidth)));
    xinc = xdif / (points - 1);
    yinc = ydif / (points - 1);
    if (this.mMol.isBondForegroundHilited_0(this.mMol.getBond_0(atom1, atom2))) {
      color1 = -3;
      color2 = -3;
    } else {
      color1 = this.mAtomColor[atom1];
      color2 = this.mAtomColor[atom2];
    }
    x_0 = theLine.x1 - this.mpLineWidth / 2;
    y_0 = theLine.y1 - this.mpLineWidth / 2;
    this.setColorCode(color1);
    for (i0 = 0; i0 < narrow_int(points / 2); i0++) {
      this.fillCircle_0(x_0, y_0, this.mpLineWidth);
      x_0 += xinc;
      y_0 += yinc;
    }
    this.setColorCode(color2);
    for (i = 0; i < narrow_int(points / 2); i++) {
      this.fillCircle_0(x_0, y_0, this.mpLineWidth);
      x_0 += xinc;
      y_0 += yinc;
    }
    this.setColorCode(this.mStandardForegroundColor);
  };
  _.drawWedge = function drawWedge(theWedge, atom1, atom2) {
    var color1, color2, p1, p2, xdiff, xe1, xe2, xm1, xm2, ydiff, ye1, ye2, ym1, ym2;
    xdiff = (theWedge.y1 - theWedge.y2) / 9;
    ydiff = (theWedge.x2 - theWedge.x1) / 9;
    xe1 = theWedge.x2 + xdiff;
    ye1 = theWedge.y2 + ydiff;
    xe2 = theWedge.x2 - xdiff;
    ye2 = theWedge.y2 - ydiff;
    xm1 = (theWedge.x1 + xe1) / 2;
    ym1 = (theWedge.y1 + ye1) / 2;
    xm2 = (theWedge.x1 + xe2) / 2;
    ym2 = (theWedge.y1 + ye2) / 2;
    p1 = new cargg.GenericPolygon_0(3);
    p2 = new cargg.GenericPolygon_0(4);
    p1.addPoint(theWedge.x1, theWedge.y1);
    p1.addPoint(xm1, ym1);
    p1.addPoint(xm2, ym2);
    p2.addPoint(xm2, ym2);
    p2.addPoint(xm1, ym1);
    p2.addPoint(xe1, ye1);
    p2.addPoint(xe2, ye2);
    if (this.mMol.isBondForegroundHilited_0(this.mMol.getBond_0(atom1, atom2))) {
      color1 = -3;
      color2 = -3;
    } else {
      color1 = this.mAtomColor[atom1];
      color2 = this.mAtomColor[atom2];
      if (this.mMol.getMoleculeColor_0() != 1) {
        color2 = this.getESRColor(atom1);
        if (color1 == this.mMol.getAtomColor_0(atom1))
          color1 = color2;
      }
    }
    this.setColorCode(color1);
    this.drawPolygon_0(p1);
    this.setColorCode(color2);
    this.drawPolygon_0(p2);
    this.setColorCode(this.mStandardForegroundColor);
  };
  _.expandBoundsByTabuZones = function expandBoundsByTabuZones(avbl) {
    var border, i;
    for (i = 0; i < this.mpTabuZone.size(); i++)
      this.mBoundingRect = this.mBoundingRect.union(castTo(this.mpTabuZone.getAtIndex(i), 32));
    this.expandByHiliteBackgrounds(avbl);
    border = 0.1 * avbl;
    this.mBoundingRect.x_0 -= border;
    this.mBoundingRect.y_0 -= border;
    this.mBoundingRect.width_0 += 2 * border;
    this.mBoundingRect.height_0 += 2 * border;
  };
  _.expandByHiliteBackgrounds = function expandByHiliteBackgrounds(avbl) {
    var i, i0, isAtomHilited, radius, rect, x_0, y_0;
    isAtomHilited = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 16, 1);
    for (i0 = 0; i0 < this.mMol.getAllBonds_0(); i0++) {
      if (this.mMol.isBondBackgroundHilited_0(i0)) {
        isAtomHilited[this.mMol.getBondAtom_0(0, i0)] = true;
        isAtomHilited[this.mMol.getBondAtom_0(1, i0)] = true;
      }
    }
    rect = new cargg.GenericRectangle();
    for (i = 0; i < this.mMol.getAllAtoms_0(); i++) {
      radius = this.mMol.isExcludeGroupAtom(i) ? avbl * 0.47 : isAtomHilited[i] ? avbl * 0.38 : 0;
      if (radius != 0) {
        x_0 = this.mTransformation.transformX(this.mMol.getAtomX_0(i));
        y_0 = this.mTransformation.transformY(this.mMol.getAtomY_0(i));
        rect.set_2(x_0 - radius, y_0 - radius, radius * 2, radius * 2);
        this.mBoundingRect = this.mBoundingRect.union(rect);
      }
    }
  };
  _.getAtomX_0 = function getAtomX(atom) {
    return this.mTransformation.transformX(this.mMol.getAtomX_0(atom));
  };
  _.getAtomY_0 = function getAtomY(atom) {
    return this.mTransformation.transformY(this.mMol.getAtomY_0(atom));
  };
  _.getBackgroundColor = function getBackgroundColor() {
    return new ja.Color(this.getBackgroundRGB_0());
  };
  _.getBackgroundRGB_0 = function getBackgroundRGB() {
    return this.mOverruleBackground != 0 ? this.mOverruleBackground : this.mCustomBackground != 0 ? this.mCustomBackground : -1;
  };
  _.getBoundingRect = function getBoundingRect() {
    return this.mBoundingRect;
  };
  _.getContrastColor = function getContrastColor(rgb, atom) {
    var bg;
    bg = this.mOverruleBackground != 0 ? this.mOverruleBackground : jsNotEquals(this.mAtomHiliteColor, null) && atom < this.mAtomHiliteColor.length && (this.mAtomHiliteColor[atom] & -16777216) != 0 ? this.mAtomHiliteColor[atom] : this.mCustomBackground != 0 ? this.mCustomBackground : -1;
    return caru.getContrastColor_0(rgb, bg);
  };
  _.getESRColor = function getESRColor(atom) {
    var alleneCenter, esrInfo;
    if ((this.mDisplayMode & (128 | 4096)) != 0)
      return this.mAtomColor[atom];
    esrInfo = this.getESRTypeToDisplayAt(atom);
    if (esrInfo == -1) {
      alleneCenter = this.mMol.findAlleneCenterAtom_0(atom);
      if (alleneCenter != -1) {
        atom = alleneCenter;
        esrInfo = this.getESRTypeToDisplayAt(atom);
      }
    }
    if (esrInfo == -1)
      return this.mAtomColor[atom];
    switch (esrInfo & 255) {
      case 1:
        return 384;
      case 2:
        return 64;
      default:
        return 448;
    }
  };
  _.getESRTypeToDisplayAt = function getESRTypeToDisplayAt(atom) {
    var bond, group, type_0;
    type_0 = -1;
    group = -1;
    if ((this.mDisplayMode & 128) != 0)
      return type_0;
    if (this.mMol.isAtomStereoCenter_0(atom)) {
      type_0 = this.mMol.getAtomESRType_0(atom);
      group = this.mMol.getAtomESRGroup_0(atom);
    }
    bond = this.mMol.findBINAPChiralityBond_0(atom);
    if (bond != -1) {
      type_0 = this.mMol.getBondESRType_0(bond);
      group = this.mMol.getBondESRGroup_0(bond);
    }
    if (type_0 != -1 && type_0 != 0)
      type_0 |= group << 8;
    return type_0;
  };
  _.getMolecule_0 = function getMolecule() {
    return this.mMol;
  };
  _.getTransformation = function getTransformation() {
    return this.mTransformation;
  };
  _.hiliteAtomBackgrounds = function hiliteAtomBackgrounds(argb, radius) {
    var alpha_0, atom, avbl, background, r, rgb;
    background = this.mOverruleBackground != 0 ? this.mOverruleBackground : this.mCustomBackground != 0 ? this.mCustomBackground : -1;
    avbl = this.mTransformation.getScaling() * this.mMol.getAverageBondLength_0();
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      alpha_0 = (argb[atom] & -16777216) >>> 24;
      if (alpha_0 != 0) {
        rgb = argb[atom];
        if (alpha_0 != 255)
          rgb = caru.intermediateColor(background, argb[atom], alpha_0 / 255);
        r = jsEquals(radius, null) ? 0.5 * avbl : 0.6 * radius[atom] * avbl;
        this.setRGB_0(rgb);
        this.fillCircle_0(this.getAtomX_0(atom) - r, this.getAtomY_0(atom) - r, 2 * r);
      }
    }
  };
  _.hiliteBondBackgrounds = function hiliteBondBackgrounds() {
    var atom1, atom2, bond, line;
    this.setLineWidth_0(2 * this.mpBondHiliteRadius);
    line = new carc2.AbstractDepictor$DepictorLine();
    for (bond = 0; bond < this.mMol.getAllBonds_0(); bond++) {
      atom1 = this.mMol.getBondAtom_0(0, bond);
      atom2 = this.mMol.getBondAtom_0(1, bond);
      if (this.mMol.isBondBackgroundHilited_0(bond)) {
        line.x1 = this.getAtomX_0(atom1);
        line.y1 = this.getAtomY_0(atom1);
        line.x2 = this.getAtomX_0(atom2);
        line.y2 = this.getAtomY_0(atom2);
        this.setColorCode(-2);
        this.drawBlackLine(line);
      }
    }
  };
  _.hiliteExcludeGroups = function hiliteExcludeGroups() {
    var atom, atom1, atom2, bond, line, radius;
    if (this.mMol.isFragment_0()) {
      radius = this.mpExcludeGroupRadius;
      this.setColorCode(-7);
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++)
        if (this.mMol.isExcludeGroupAtom(atom))
          this.fillCircle_0(this.getAtomX_0(atom) - radius, this.getAtomY_0(atom) - radius, 2 * radius);
      this.setLineWidth_0(2 * this.mpExcludeGroupRadius);
      line = new carc2.AbstractDepictor$DepictorLine();
      for (bond = 0; bond < this.mMol.getAllBonds_0(); bond++) {
        atom1 = this.mMol.getBondAtom_0(0, bond);
        atom2 = this.mMol.getBondAtom_0(1, bond);
        if (neq(and_0(and_0(this.mMol.getAtomQueryFeatures(atom1), this.mMol.getAtomQueryFeatures(atom2)), 536870912), 0)) {
          line.x1 = this.getAtomX_0(atom1);
          line.y1 = this.getAtomY_0(atom1);
          line.x2 = this.getAtomX_0(atom2);
          line.y2 = this.getAtomY_0(atom2);
          this.drawBlackLine(line);
        }
      }
    }
  };
  _.indicateQueryFeatures = function indicateQueryFeatures() {
    var atom, atom1, atom2, bond;
    if (this.mMol.isFragment_0()) {
      this.setColorCode(320);
      if ((this.mDisplayMode & 8) != 0) {
        for (atom = 0; atom < this.mMol.getAtoms_0(); atom++)
          if (neq(and_0(this.mMol.getAtomQueryFeatures(atom), not_0(536870912)), 0))
            this.fillCircle_0(this.getAtomX_0(atom) - this.mpQFDiameter / 2, this.getAtomY_0(atom) - this.mpQFDiameter / 2, this.mpQFDiameter);
      }
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
        if (this.mMol.getBondQueryFeatures_0(bond) != 0) {
          atom1 = this.mMol.getBondAtom_0(0, bond);
          atom2 = this.mMol.getBondAtom_0(1, bond);
          this.fillCircle_0((this.getAtomX_0(atom1) + this.getAtomX_0(atom2) - this.mpQFDiameter) / 2, (this.getAtomY_0(atom1) + this.getAtomY_0(atom2) - this.mpQFDiameter) / 2, this.mpQFDiameter);
        }
      }
    }
  };
  _.init = function init2() {
    this.mFactorTextSize = 1;
    this.mTransformation = new carc2.DepictorTransformation();
    this.mpTabuZone = new ju.ArrayList();
    this.mpDot = new ju.ArrayList();
    this.mAtomLabelDisplayed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 16, 1);
    this.mChiralTextLocation = new cargg.GenericPoint();
    this.mStandardForegroundColor = 0;
    this.mCurrentColor = -1;
    this.updateBondHiliteColor();
  };
  _.isHighlightedAtom = function isHighlightedAtom(atom) {
    var i;
    if (this.mMol.getAllConnAtoms_0(atom) == 0)
      return false;
    for (i = 0; i < this.mMol.getAllConnAtoms_0(atom); i++)
      if (!this.mMol.isBondForegroundHilited_0(this.mMol.getConnBond_0(atom, i)))
        return false;
    return true;
  };
  _.markIsolatedAtoms = function markIsolatedAtoms() {
    var bnd;
    this.mAtomIsConnected = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 16, 1);
    for (bnd = 0; bnd < this.mMol.getAllBonds_0(); bnd++) {
      this.mAtomIsConnected[this.mMol.getBondAtom_0(0, bnd)] = true;
      this.mAtomIsConnected[this.mMol.getBondAtom_0(1, bnd)] = true;
    }
  };
  _.mpAlleneCenter = function mpAlleneCenter(atm) {
    var i;
    if (this.mMol.getConnAtoms_0(atm) != 2)
      return false;
    for (i = 0; i < 2; i++)
      if (this.mMol.getConnBondOrder_0(atm, i) != 2)
        return false;
    return true;
  };
  _.mpCalcNextBondOffset = function mpCalcNextBondOffset(atm1, atm2, side, nextBondOffset) {
    var LI_LIMIT, LO_LIMIT, RI_LIMIT, RO_LIMIT, angleDiff, bnd, bondAngle, currentAngleDiff, distance, i, remoteAtm, retval, testAngle, theBondAngle;
    RO_LIMIT = 2.617993878;
    LO_LIMIT = 3.665191429;
    RI_LIMIT = 0.523598776;
    LI_LIMIT = 5.759586531;
    retval = false;
    nextBondOffset.x_0 = 0;
    nextBondOffset.y_0 = 0;
    if (side > 0)
      angleDiff = 2.617993878;
    else
      angleDiff = 3.665191429;
    theBondAngle = this.mMol.getBondAngle_0(atm1, atm2);
    for (i = 0; i < this.mMol.getConnAtoms_0(atm1); i++) {
      bnd = this.mMol.getConnBond_0(atm1, i);
      bondAngle = theBondAngle;
      if (this.mMol.getBondAtom_0(0, bnd) == atm1)
        remoteAtm = this.mMol.getBondAtom_0(1, bnd);
      else
        remoteAtm = this.mMol.getBondAtom_0(0, bnd);
      if (remoteAtm == atm2)
        continue;
      testAngle = this.mMol.getBondAngle_0(atm1, remoteAtm);
      if (bondAngle < testAngle)
        bondAngle += 3.141592653589793 * 2;
      currentAngleDiff = bondAngle - testAngle;
      if (side > 0) {
        if (currentAngleDiff < 3.141592653589793)
          retval = true;
        if (currentAngleDiff > 2.617993878)
          currentAngleDiff = 2.617993878;
        if (currentAngleDiff < 0.523598776)
          currentAngleDiff = 0.523598776;
        if (currentAngleDiff <= angleDiff) {
          angleDiff = currentAngleDiff;
          distance = this.mpBondSpacing * $wnd.Math.tan(angleDiff - 3.141592653589793 / 2) / 2;
          nextBondOffset.x_0 = -(distance * $wnd.Math.sin(bondAngle));
          nextBondOffset.y_0 = -(distance * $wnd.Math.cos(bondAngle));
        }
      } else {
        if (currentAngleDiff >= 3.141592653589793)
          retval = true;
        if (currentAngleDiff < 3.665191429)
          currentAngleDiff = 3.665191429;
        if (currentAngleDiff > 5.759586531)
          currentAngleDiff = 5.759586531;
        if (currentAngleDiff >= angleDiff) {
          angleDiff = currentAngleDiff;
          distance = this.mpBondSpacing * $wnd.Math.tan(4.712388981 - angleDiff) / 2;
          nextBondOffset.x_0 = -(distance * $wnd.Math.sin(bondAngle));
          nextBondOffset.y_0 = -(distance * $wnd.Math.cos(bondAngle));
        }
      }
    }
    return retval;
  };
  _.mpCalcPiBondOffset = function mpCalcPiBondOffset(dx, dy, piBondOffset) {
    var alpha_0;
    if (dx == 0) {
      if (dy < 0)
        piBondOffset.x_0 = this.mpBondSpacing;
      else
        piBondOffset.x_0 = -this.mpBondSpacing;
      piBondOffset.y_0 = 0;
      return;
    }
    alpha_0 = $wnd.Math.atan(dy / dx);
    if (dx < 0)
      alpha_0 += 3.141592653589793;
    piBondOffset.x_0 = -(this.mpBondSpacing * $wnd.Math.sin(alpha_0));
    piBondOffset.y_0 = this.mpBondSpacing * $wnd.Math.cos(alpha_0);
  };
  _.mpDBFromNonLabelToLabel = function mpDBFromNonLabelToLabel(theLine, bnd, inverted) {
    var aLine, aLineIsInnerLine, atm1, atm2, bLine, nextBondOffset, piBondOffset, side, td, ti, xdiff, ydiff;
    aLine = new carc2.AbstractDepictor$DepictorLine();
    bLine = new carc2.AbstractDepictor$DepictorLine();
    piBondOffset = new cargg.GenericPoint();
    nextBondOffset = new cargg.GenericPoint();
    atm1 = this.mMol.getBondAtom_0(0, bnd);
    atm2 = this.mMol.getBondAtom_0(1, bnd);
    if (inverted) {
      td = theLine.x1;
      theLine.x1 = theLine.x2;
      theLine.x2 = td;
      td = theLine.y1;
      theLine.y1 = theLine.y2;
      theLine.y2 = td;
      ti = atm1;
      atm1 = atm2;
      atm2 = ti;
    }
    if (!this.mpProperLine(theLine))
      return;
    if (this.mMol.isRingBond_0(bnd)) {
      aLine.x1 = theLine.x1;
      aLine.y1 = theLine.y1;
      aLine.x2 = theLine.x2;
      aLine.y2 = theLine.y2;
      side = inverted ? -this.mMol.getPreferredDoubleBondSide(bnd) : this.mMol.getPreferredDoubleBondSide(bnd);
      if (side == 0)
        side = 1;
      this.mpCalcPiBondOffset(theLine.x2 - theLine.x1, theLine.y2 - theLine.y1, piBondOffset);
      if (side > 0) {
        bLine.x1 = theLine.x1 + piBondOffset.x_0;
        bLine.y1 = theLine.y1 + piBondOffset.y_0;
        bLine.x2 = theLine.x2 + piBondOffset.x_0;
        bLine.y2 = theLine.y2 + piBondOffset.y_0;
        if (this.mpCalcNextBondOffset(atm1, atm2, 1, nextBondOffset) || this.mMol.getConnAtoms_0(atm1) > 1) {
          bLine.x1 += nextBondOffset.x_0 + piBondOffset.y_0;
          bLine.y1 += nextBondOffset.y_0 - piBondOffset.x_0;
        }
      } else {
        bLine.x1 = theLine.x1 - piBondOffset.x_0;
        bLine.y1 = theLine.y1 - piBondOffset.y_0;
        bLine.x2 = theLine.x2 - piBondOffset.x_0;
        bLine.y2 = theLine.y2 - piBondOffset.y_0;
        if (this.mpCalcNextBondOffset(atm1, atm2, -1, nextBondOffset) || this.mMol.getConnAtoms_0(atm1) > 1) {
          bLine.x1 += nextBondOffset.x_0 + piBondOffset.y_0;
          bLine.y1 += nextBondOffset.y_0 - piBondOffset.x_0;
        }
      }
      if (this.mMol.getBondType_0(bnd) == 386)
        this.mpMakeCrossBond(aLine, bLine);
      this.mpHandleLine(aLine, atm1, atm2);
      if (this.mMol.getBondType_0(bnd) == 8)
        this.mpHandleDashedLine(bLine, atm1, atm2);
      else
        this.mpHandleLine(bLine, atm1, atm2);
    } else {
      this.mpCalcPiBondOffset(theLine.x2 - theLine.x1, theLine.y2 - theLine.y1, piBondOffset);
      xdiff = piBondOffset.x_0 / 2;
      ydiff = piBondOffset.y_0 / 2;
      aLineIsInnerLine = false;
      aLine.x1 = theLine.x1 + xdiff;
      aLine.y1 = theLine.y1 + ydiff;
      aLine.x2 = theLine.x2 + xdiff;
      aLine.y2 = theLine.y2 + ydiff;
      if (this.mMol.getConnAtoms_0(atm1) > 1) {
        if (!this.mpCalcNextBondOffset(atm1, atm2, 1, nextBondOffset)) {
          setCheck(this.mAlternativeCoords, atm1, new cargg.GenericPoint_0(aLine.x1, aLine.y1));
        } else {
          aLine.x1 += nextBondOffset.x_0;
          aLine.y1 += nextBondOffset.y_0;
          if (this.mMol.getConnAtoms_0(atm1) == 2) {
            if (nextBondOffset.x_0 != 0 || nextBondOffset.y_0 != 0) {
              aLine.x1 += piBondOffset.y_0;
              aLine.y1 -= piBondOffset.x_0;
            }
          }
        }
      }
      bLine.x1 = theLine.x1 - xdiff;
      bLine.y1 = theLine.y1 - ydiff;
      bLine.x2 = theLine.x2 - xdiff;
      bLine.y2 = theLine.y2 - ydiff;
      if (this.mMol.getConnAtoms_0(atm1) > 1) {
        if (!this.mpCalcNextBondOffset(atm1, atm2, 0, nextBondOffset)) {
          setCheck(this.mAlternativeCoords, atm1, new cargg.GenericPoint_0(bLine.x1, bLine.y1));
          aLineIsInnerLine = true;
        } else {
          bLine.x1 += nextBondOffset.x_0;
          bLine.y1 += nextBondOffset.y_0;
          if (this.mMol.getConnAtoms_0(atm1) == 2) {
            if (nextBondOffset.x_0 != 0 || nextBondOffset.y_0 != 0) {
              bLine.x1 += piBondOffset.y_0;
              bLine.y1 -= piBondOffset.x_0;
            }
          }
        }
      }
      if (this.mMol.getBondType_0(bnd) == 386)
        this.mpMakeCrossBond(aLine, bLine);
      if (this.mMol.getBondType_0(bnd) == 8) {
        if (aLineIsInnerLine) {
          this.drawDashedLine(aLine, atm1, atm2);
          this.drawLine_0(bLine, atm1, atm2);
        } else {
          this.drawLine_0(aLine, atm1, atm2);
          this.drawDashedLine(bLine, atm1, atm2);
        }
      } else {
        this.drawLine_0(aLine, atm1, atm2);
        this.drawLine_0(bLine, atm1, atm2);
      }
    }
  };
  _.mpDrawAllBonds = function mpDrawAllBonds(esrGroupMemberCount) {
    var atom1, atom2, cipStr, dx, dy, i, i0, i1, origColor, origForeground, type_0, x_0, y_0;
    origColor = this.mStandardForegroundColor;
    origForeground = this.mCustomForeground;
    if ((this.mDisplayMode & 16384) != 0) {
      this.mStandardForegroundColor = -6;
      this.mCustomForeground = -8355712;
      this.setColorCode(1);
    }
    this.mAlternativeCoords = initUnidimensionalArray(cggl.Lcom_actelion_research_gui_generic_GenericPoint_2_classLit, { 4: 1, 1: 1, 7: 1 }, 67, this.mMol.getAllAtoms_0(), 0, 1);
    for (i0 = 0; i0 < this.mMol.getAllBonds_0(); i0++)
      if (this.mMol.getBondType_0(i0) == 2 || this.mMol.getBondType_0(i0) == 386 || this.mMol.getBondType_0(i0) == 8)
        this.mpDrawBond(i0);
    for (i1 = 0; i1 < this.mMol.getAllBonds_0(); i1++)
      if (this.mMol.getBondType_0(i1) != 2 && this.mMol.getBondType_0(i1) != 386 && this.mMol.getBondType_0(i1) != 8)
        this.mpDrawBond(i1);
    if ((this.mDisplayMode & 64) == 0) {
      for (i = 0; i < this.mMol.getAllBonds_0(); i++) {
        if (this.mMol.getBondCIPParity_0(i) != 0) {
          cipStr = null;
          if (this.mMol.getBondCIPParity_0(i) == 1 || this.mMol.getBondCIPParity_0(i) == 2) {
            if (this.mMol.getBondOrder_0(i) == 2 || this.mMol.getBondESRType_0(i) == 0 || jsEquals(esrGroupMemberCount, null) || esrGroupMemberCount[this.mMol.getBondESRType_0(i)][this.mMol.getBondESRGroup_0(i)] > 1) {
              if (this.mMol.getBondCIPParity_0(i) == 1)
                cipStr = this.mMol.getBondOrder_0(i) == 2 ? "E" : this.mMol.isBondParityPseudo_0(i) ? "p" : "P";
              else
                cipStr = this.mMol.getBondOrder_0(i) == 2 ? "Z" : this.mMol.isBondParityPseudo_0(i) ? "m" : "M";
            }
          } else {
            cipStr = "?";
          }
          if (jsNotEquals(cipStr, null)) {
            this.mpSetSmallLabelSize();
            this.setColorCode(this.mMol.isBondForegroundHilited_0(i) ? -3 : this.mMol.getMoleculeColor_0() == 1 || (this.mDisplayMode & 4096) != 0 ? this.mStandardForegroundColor : 448);
            atom1 = this.mMol.getBondAtom_0(0, i);
            atom2 = this.mMol.getBondAtom_0(1, i);
            x_0 = (this.getAtomX_0(atom1) + this.getAtomX_0(atom2)) / 2;
            y_0 = (this.getAtomY_0(atom1) + this.getAtomY_0(atom2)) / 2;
            dx = (this.getAtomX_0(atom1) - this.getAtomX_0(atom2)) / 3;
            dy = (this.getAtomY_0(atom1) - this.getAtomY_0(atom2)) / 3;
            this.mpDrawString(x_0 + dy, y_0 - dx, cipStr, true);
            this.setColorCode(this.mStandardForegroundColor);
            this.mpSetNormalLabelSize();
          }
        }
      }
    }
    if ((this.mDisplayMode & 4) != 0) {
      this.mpSetSmallLabelSize();
      this.setColorCode(384);
      for (i = 0; i < this.mMol.getAllBonds_0(); i++) {
        atom1 = this.mMol.getBondAtom_0(0, i);
        atom2 = this.mMol.getBondAtom_0(1, i);
        type_0 = this.mMol.isDelocalizedBond_0(i) ? "d" : this.mMol.isAromaticBond_0(i) ? "a" : "";
        x_0 = (this.getAtomX_0(atom1) + this.getAtomX_0(atom2)) / 2;
        y_0 = (this.getAtomY_0(atom1) + this.getAtomY_0(atom2)) / 2;
        this.mpDrawString(x_0, y_0, type_0 + ("" + jl.valueOf_18(i)), true);
      }
      this.setColorCode(this.mStandardForegroundColor);
      this.mpSetNormalLabelSize();
    }
    if ((this.mDisplayMode & 16384) != 0) {
      this.mStandardForegroundColor = origColor;
      this.mCustomForeground = origForeground;
    }
  };
  _.mpDrawAllDots = function mpDrawAllDots() {
    var dot, dot$iterator;
    for (dot$iterator = this.mpDot.iterator(); dot$iterator.hasNext_0(); ) {
      dot = castTo(dot$iterator.next_3(), 205);
      this.setColorCode(dot.color_0);
      this.drawDot(dot.x_0, dot.y_0);
    }
    this.setColorCode(this.mStandardForegroundColor);
  };
  _.mpDrawAtom = function mpDrawAtom(atom, esrGroupMemberCount) {
    var angle, atmStart, atomStr, bestSide, bnd, charge, chax, chay, cipStr, counterHindrance, counterSide, eNegNeighbours, esrInfo, esrStr, hHeight, hNoStr, hNoWidth, hindrance, hydrogenWidth, hydrogens, hydrogensToAdd, i, i0, isoStr, j, labelWidth, largeIsoString, mapStr, minHindrance, neighbours, piElectrons, propStr, queryFeatures, ringBonds, theAngle, theColor, unpairedElectrons, valStr, x_0, xdiff, y_0, ydiff;
    if (!this.mIsValidatingView)
      this.onDrawAtom(atom, this.mMol.getAtomLabel_0(atom), this.getAtomX_0(atom), this.getAtomY_0(atom));
    propStr = null;
    if (this.mMol.getAtomCharge_0(atom) != 0) {
      valStr = $wnd.Math.abs(this.mMol.getAtomCharge_0(atom)) == 1 ? "" : jl.valueOf_18($wnd.Math.abs(this.mMol.getAtomCharge_0(atom)));
      propStr = this.mMol.getAtomCharge_0(atom) < 0 ? valStr + "-" : valStr + "+";
    }
    if (jsNotEquals(this.mAtomText, null) && atom < this.mAtomText.length && jsNotEquals(this.mAtomText[atom], null) && jl.length__I__devirtual$_0(this.mAtomText[atom]) > 0)
      propStr = this.append(propStr, this.mAtomText[atom]);
    isoStr = null;
    queryFeatures = this.mMol.getAtomQueryFeatures(atom);
    if (neq(queryFeatures, 0)) {
      if (neq(and_0(queryFeatures, { l: 0, m: 0, h: 1 }), 0))
        isoStr = this.append(isoStr, "*");
      if (neq(and_0(queryFeatures, { l: 0, m: 0, h: 2 }), 0))
        isoStr = this.append(isoStr, "!*");
      if (neq(and_0(queryFeatures, { l: 0, m: 0, h: 4 }), 0))
        isoStr = this.append(isoStr, "ha");
      else if (neq(and_0(queryFeatures, 2), 0))
        isoStr = this.append(isoStr, "a");
      else if (neq(and_0(queryFeatures, 4), 0))
        isoStr = this.append(isoStr, "!a");
      if (neq(and_0(queryFeatures, 4096), 0))
        isoStr = this.append(isoStr, "s");
      if (neq(and_0(queryFeatures, 1920), 0)) {
        hydrogens = and_0(queryFeatures, 1920);
        if (eq(hydrogens, add_20(add_20(256, 512), 1024)))
          isoStr = this.append(isoStr, "h0");
        else if (eq(hydrogens, add_20(add_20(128, 512), 1024)))
          isoStr = this.append(isoStr, "h1");
        else if (eq(hydrogens, add_20(add_20(128, 256), 1024)))
          isoStr = this.append(isoStr, "h2");
        else if (eq(hydrogens, 128))
          isoStr = this.append(isoStr, "h>0");
        else if (eq(hydrogens, add_20(128, 256)))
          isoStr = this.append(isoStr, "h>1");
        else if (eq(hydrogens, add_20(add_20(128, 256), 512)))
          isoStr = this.append(isoStr, "h>2");
        else if (eq(hydrogens, 1024))
          isoStr = this.append(isoStr, "h<3");
        else if (eq(hydrogens, add_20(512, 1024)))
          isoStr = this.append(isoStr, "h<2");
        else if (eq(hydrogens, add_20(128, 1024)))
          isoStr = this.append(isoStr, "h1-2");
      }
      if (neq(and_0(queryFeatures, 234881024), 0)) {
        charge = and_0(queryFeatures, 234881024);
        if (eq(charge, add_20(134217728, 33554432)))
          isoStr = this.append(isoStr, "c0");
        else if (eq(charge, add_20(67108864, 33554432)))
          isoStr = this.append(isoStr, "c+");
        else if (eq(charge, add_20(67108864, 134217728)))
          isoStr = this.append(isoStr, "c-");
      }
      if (neq(and_0(queryFeatures, 114688), 0)) {
        piElectrons = and_0(queryFeatures, 114688);
        if (eq(piElectrons, add_20(32768, 65536)))
          isoStr = this.append(isoStr, "pi0");
        else if (eq(piElectrons, add_20(16384, 65536)))
          isoStr = this.append(isoStr, "pi1");
        else if (eq(piElectrons, add_20(16384, 32768)))
          isoStr = this.append(isoStr, "pi2");
        else if (eq(piElectrons, 16384))
          isoStr = this.append(isoStr, "pi>0");
      }
      if (neq(and_0(queryFeatures, 4063232), 0)) {
        neighbours = and_0(queryFeatures, 4063232);
        if (eq(neighbours, and_0(4063232, not_0(262144))))
          isoStr = this.append(isoStr, "n1");
        else if (eq(neighbours, and_0(4063232, not_0(524288))))
          isoStr = this.append(isoStr, "n2");
        else if (eq(neighbours, and_0(4063232, not_0(1048576))))
          isoStr = this.append(isoStr, "n3");
        else if (eq(neighbours, add_20(1048576, 2097152)))
          isoStr = this.append(isoStr, "n<3");
        else if (eq(neighbours, 2097152))
          isoStr = this.append(isoStr, "n<4");
        else if (eq(neighbours, add_20(131072, 262144)))
          isoStr = this.append(isoStr, "n>1");
        else if (eq(neighbours, add_20(add_20(131072, 262144), 524288)))
          isoStr = this.append(isoStr, "n>2");
        else if (eq(neighbours, and_0(4063232, not_0(2097152))))
          isoStr = this.append(isoStr, "n>3");
        else if (eq(neighbours, or_0(or_0(131072, 1048576), 2097152)))
          isoStr = this.append(isoStr, "n1-2");
        else if (eq(neighbours, or_0(131072, 2097152)))
          isoStr = this.append(isoStr, "n1-3");
        else if (eq(neighbours, or_0(or_0(131072, 262144), 2097152)))
          isoStr = this.append(isoStr, "n2-3");
      }
      if (neq(and_0(queryFeatures, 17042430230528), 0)) {
        eNegNeighbours = and_0(queryFeatures, 17042430230528);
        if (eq(eNegNeighbours, and_0(17042430230528, not_0(549755813888))))
          isoStr = this.append(isoStr, "e0");
        else if (eq(eNegNeighbours, and_0(17042430230528, not_0(1099511627776))))
          isoStr = this.append(isoStr, "e1");
        else if (eq(eNegNeighbours, and_0(17042430230528, not_0(2199023255552))))
          isoStr = this.append(isoStr, "e2");
        else if (eq(eNegNeighbours, and_0(17042430230528, not_0(4398046511104))))
          isoStr = this.append(isoStr, "e3");
        else if (eq(eNegNeighbours, or_0(or_0(2199023255552, 4398046511104), 8796093022208)))
          isoStr = this.append(isoStr, "e<2");
        else if (eq(eNegNeighbours, or_0(4398046511104, 8796093022208)))
          isoStr = this.append(isoStr, "e<3");
        else if (eq(eNegNeighbours, 8796093022208))
          isoStr = this.append(isoStr, "e<4");
        else if (eq(eNegNeighbours, 549755813888))
          isoStr = this.append(isoStr, "e>0");
        else if (eq(eNegNeighbours, or_0(549755813888, 1099511627776)))
          isoStr = this.append(isoStr, "e>1");
        else if (eq(eNegNeighbours, or_0(or_0(549755813888, 1099511627776), 2199023255552)))
          isoStr = this.append(isoStr, "e>2");
        else if (eq(eNegNeighbours, and_0(17042430230528, not_0(8796093022208))))
          isoStr = this.append(isoStr, "e>3");
        else if (eq(eNegNeighbours, or_0(or_0(549755813888, 4398046511104), 8796093022208)))
          isoStr = this.append(isoStr, "e1-2");
        else if (eq(eNegNeighbours, or_0(549755813888, 8796093022208)))
          isoStr = this.append(isoStr, "e1-3");
        else if (eq(eNegNeighbours, or_0(or_0(549755813888, 1099511627776), 8796093022208)))
          isoStr = this.append(isoStr, "e2-3");
      }
      if (neq(and_0(queryFeatures, 120), 0)) {
        ringBonds = and_0(queryFeatures, 120);
        if (eq(ringBonds, add_20(add_20(16, 32), 64)))
          isoStr = this.append(isoStr, "!r");
        else if (eq(ringBonds, 8))
          isoStr = this.append(isoStr, "r");
        else if (eq(ringBonds, add_20(32, 64)))
          isoStr = this.append(isoStr, "rb<3");
        else if (eq(ringBonds, add_20(add_20(8, 32), 64)))
          isoStr = this.append(isoStr, "rb2");
        else if (eq(ringBonds, add_20(add_20(8, 16), 64)))
          isoStr = this.append(isoStr, "rb3");
        else if (eq(ringBonds, add_20(add_20(8, 16), 32)))
          isoStr = this.append(isoStr, "rb4");
      }
      if (neq(and_0(queryFeatures, 29360128), 0)) {
        isoStr = this.append(isoStr, "r" + toString_28(shr_0(and_0(queryFeatures, 29360128), 22)));
      }
      if (neq(and_0(queryFeatures, 545460846592), 0)) {
        isoStr = this.append(isoStr, this.createRingSizeText(queryFeatures));
      }
      if (neq(and_0(queryFeatures, 268435456), 0)) {
        isoStr = this.append(isoStr, "f");
      }
    }
    if (this.mMol.getAtomMass_0(atom) != 0) {
      isoStr = this.append(isoStr, jl.valueOf_18(this.mMol.getAtomMass_0(atom)));
    }
    unpairedElectrons = 0;
    if (this.mMol.getAtomRadical_0(atom) != 0) {
      switch (this.mMol.getAtomRadical_0(atom)) {
        case 16:
          propStr = this.append(propStr, "|");
          break;
        case 32:
          unpairedElectrons = 1;
          break;
        case 48:
          unpairedElectrons = 2;
          break;
      }
    }
    cipStr = null;
    if ((this.mDisplayMode & 64) == 0) {
      if (this.mMol.isAtomConfigurationUnknown_0(atom))
        cipStr = "?";
      else if (this.mMol.getAtomCIPParity_0(atom) != 0) {
        if (this.mMol.getAtomESRType_0(atom) == 0 || jsEquals(esrGroupMemberCount, null) || esrGroupMemberCount[this.mMol.getAtomESRType_0(atom)][this.mMol.getAtomESRGroup_0(atom)] > 1) {
          if (this.mMol.getConnAtoms_0(atom) == 2) {
            switch (this.mMol.getAtomCIPParity_0(atom)) {
              case 2:
                cipStr = this.mMol.isAtomParityPseudo_0(atom) ? "p" : "P";
                break;
              case 1:
                cipStr = this.mMol.isAtomParityPseudo_0(atom) ? "m" : "M";
                break;
              default:
                cipStr = "*";
                break;
            }
          } else {
            switch (this.mMol.getAtomCIPParity_0(atom)) {
              case 1:
                cipStr = this.mMol.isAtomParityPseudo_0(atom) ? "r" : "R";
                break;
              case 2:
                cipStr = this.mMol.isAtomParityPseudo_0(atom) ? "s" : "S";
                break;
              default:
                cipStr = "*";
                break;
            }
          }
        }
      }
    }
    if ((this.mDisplayMode & 768) != 0)
      cipStr = this.append(cipStr, jl.valueOf_18(this.mMol.getSymmetryRank_0(atom)));
    mapStr = null;
    if ((this.mDisplayMode & 16) != 0 && this.mMol.getAtomMapNo_0(atom) != 0)
      mapStr = "" + this.mMol.getAtomMapNo_0(atom);
    esrStr = null;
    if (this.mMol.getStereoBond_0(atom) != -1) {
      esrInfo = this.getESRTypeToDisplayAt(atom);
      if (esrInfo != -1)
        esrStr = esrInfo == 0 ? "abs" : ((esrInfo & 255) == 1 ? "&" : "or") + (1 + (esrInfo >> 8));
    }
    hydrogensToAdd = 0;
    if ((this.mDisplayMode & 8192) == 0) {
      if (this.mMol.isFragment_0()) {
        if (neq(and_0(this.mMol.getAtomQueryFeatures(atom), 2048), 0))
          hydrogensToAdd = this.mMol.getImplicitHydrogens_1(atom);
      } else {
        if (this.mMol.getAtomicNo_0(atom) != 6 || this.mMol.getAtomMass_0(atom) != 0 || !this.mAtomIsConnected[atom] || this.mMol.getAtomRadical_0(atom) != 0)
          hydrogensToAdd = this.mMol.getImplicitHydrogens_1(atom);
      }
    }
    largeIsoString = false;
    atomStr = this.mMol.getAtomCustomLabel_0(atom);
    if (jsNotEquals(atomStr, null) && jl.startsWith_Ljava_lang_String__Z__devirtual$(atomStr, "]")) {
      isoStr = this.append(jl.substring_I_Ljava_lang_String___devirtual$(atomStr, 1), isoStr);
      atomStr = null;
      largeIsoString = true;
    }
    if (jsNotEquals(atomStr, null)) {
      hydrogensToAdd = 0;
    } else if (jsNotEquals(this.mMol.getAtomList_0(atom), null)) {
      atmStart = neq(and_0(this.mMol.getAtomQueryFeatures(atom), 1), 0) ? "[!" : "[";
      atomStr = atmStart + ("" + this.mMol.getAtomListString_0(atom)) + "]";
      if (jl.length__I__devirtual$_0(atomStr) > 5)
        atomStr = atmStart + this.mMol.getAtomList_0(atom).length + "]";
      if (neq(and_0(this.mMol.getAtomQueryFeatures(atom), 2048), 0))
        hydrogensToAdd = -1;
    } else if (neq(and_0(this.mMol.getAtomQueryFeatures(atom), 1), 0)) {
      atomStr = "?";
      if (neq(and_0(this.mMol.getAtomQueryFeatures(atom), 2048), 0))
        hydrogensToAdd = -1;
    } else if (this.mMol.getAtomicNo_0(atom) != 6 || jsNotEquals(propStr, null) || jsNotEquals(isoStr, null) || hydrogensToAdd > 0 || !this.mAtomIsConnected[atom])
      atomStr = this.mMol.getAtomLabel_0(atom);
    labelWidth = 0;
    if (!this.mMol.isSelectedAtom_0(atom) & this.mMol.isExcludeGroupAtom(atom))
      this.setColorCode(-8);
    if (jsNotEquals(atomStr, null)) {
      labelWidth = this.getStringWidth(atomStr);
      this.mpDrawString(this.getAtomX_0(atom), this.getAtomY_0(atom), atomStr, true);
      this.mAtomLabelDisplayed[atom] = true;
    } else if (this.mpAlleneCenter(atom))
      this.mpDrawDot(this.getAtomX_0(atom), this.getAtomY_0(atom), atom);
    if (jsNotEquals(propStr, null)) {
      this.mpSetSmallLabelSize();
      x_0 = this.getAtomX_0(atom) + ((labelWidth + this.getStringWidth(propStr)) / 2 + 1);
      y_0 = this.getAtomY_0(atom) - narrow_int((this.getTextSize() * 4 - 4) / 8);
      this.mpDrawString(x_0, y_0, propStr, true);
      this.mpSetNormalLabelSize();
    }
    if ((this.mDisplayMode & 2) != 0)
      isoStr = jl.valueOf_18(atom);
    if (jsNotEquals(isoStr, null)) {
      if (largeIsoString)
        this.mpSetReducedLabelSize();
      else
        this.mpSetSmallLabelSize();
      x_0 = this.getAtomX_0(atom) - (labelWidth + this.getStringWidth(isoStr)) / 2;
      y_0 = this.getAtomY_0(atom) - narrow_int((this.getTextSize() * 4 - 4) / 8);
      this.mpDrawString(x_0, y_0, isoStr, true);
      this.mpSetNormalLabelSize();
    }
    if (jsNotEquals(cipStr, null)) {
      this.mpSetSmallLabelSize();
      x_0 = this.getAtomX_0(atom) - (labelWidth + this.getStringWidth(cipStr)) / 2;
      y_0 = this.getAtomY_0(atom) + narrow_int((this.getTextSize() * 4 + 4) / 8);
      theColor = this.mCurrentColor;
      if (this.mMol.getMoleculeColor_0() != 1 && (this.mDisplayMode & 4096) == 0)
        this.setColorCode(448);
      this.mpDrawString(x_0, y_0, cipStr, false);
      this.setColorCode(theColor);
      this.mpSetNormalLabelSize();
    }
    if (jsNotEquals(mapStr, null)) {
      this.mpSetSmallLabelSize();
      x_0 = this.getAtomX_0(atom) + ((labelWidth + this.getStringWidth(mapStr)) / 2 + 1);
      y_0 = this.getAtomY_0(atom) + narrow_int((this.getTextSize() * 4 + 4) / 8);
      theColor = this.mCurrentColor;
      this.setColorCode(this.mMol.isAutoMappedAtom_0(atom) ? 384 : 448);
      this.mpDrawString(x_0, y_0, mapStr, true);
      this.setColorCode(theColor);
      this.mpSetNormalLabelSize();
    }
    if (jsNotEquals(esrStr, null)) {
      angle = this.mpGetFreeSpaceAngle(atom);
      this.mpSetSmallLabelSize();
      x_0 = this.getAtomX_0(atom) + 0.7 * this.getTextSize() * $wnd.Math.sin(angle);
      y_0 = this.getAtomY_0(atom) + 0.7 * this.getTextSize() * $wnd.Math.cos(angle);
      theColor = this.mCurrentColor;
      if (!this.mIsValidatingView && this.mMol.getMoleculeColor_0() != 1)
        this.setColorCode(this.getESRColor(atom));
      this.mpDrawString(x_0, y_0, esrStr, false);
      this.setColorCode(theColor);
      this.mpSetNormalLabelSize();
    }
    if (hydrogensToAdd == 0 && unpairedElectrons == 0) {
      if (this.mCurrentColor == -8)
        this.setColorCode(-9);
      return;
    }
    hindrance = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
    for (i0 = 0; i0 < this.mMol.getAllConnAtomsPlusMetalBonds_0(atom); i0++) {
      bnd = this.mMol.getConnBond_0(atom, i0);
      for (j = 0; j < 2; j++) {
        if (this.mMol.getBondAtom_0(j, bnd) == atom) {
          theAngle = this.mMol.getBondAngle_0(this.mMol.getBondAtom_0(j, bnd), this.mMol.getBondAtom_0(1 - j, bnd));
          if (theAngle < -3.141592653589793 / 2) {
            hindrance[0] -= theAngle + 3.141592653589793 / 2;
            hindrance[3] += theAngle + 3.141592653589793;
          } else if (theAngle < 0) {
            hindrance[2] += theAngle + 3.141592653589793 / 2;
            hindrance[3] -= theAngle;
          } else if (theAngle < 3.141592653589793 / 2) {
            hindrance[1] += theAngle;
            hindrance[2] += 3.141592653589793 / 2 - theAngle;
          } else {
            hindrance[0] += theAngle - 3.141592653589793 / 2;
            hindrance[1] += 3.141592653589793 - theAngle;
          }
        }
      }
    }
    if (this.mMol.getConnAtoms_0(atom) == 0) {
      if (this.mMol.isElectronegative_0(atom))
        hindrance[3] -= 0.2;
      else
        hindrance[1] -= 0.2;
    } else
      hindrance[1] -= 0.1;
    if (jsNotEquals(propStr, null) || jsNotEquals(mapStr, null))
      hindrance[1] += 10;
    if (jsNotEquals(isoStr, null) || jsNotEquals(cipStr, null))
      hindrance[3] += 10;
    hNoStr = "";
    if (hydrogensToAdd != 0) {
      hydrogenWidth = this.getStringWidth("H");
      hNoWidth = 0;
      hHeight = this.getTextSize();
      if (hydrogensToAdd == -1) {
        hNoStr = "n";
        this.mpSetSmallLabelSize();
        hNoWidth = this.getStringWidth(hNoStr);
      } else if (hydrogensToAdd > 1) {
        hNoStr = jl.valueOf_18(hydrogensToAdd);
        this.mpSetSmallLabelSize();
        hNoWidth = this.getStringWidth(hNoStr);
      }
      if (hindrance[1] < 0.6 || hindrance[3] < 0.6) {
        chay = this.getAtomY_0(atom);
        if (hindrance[1] <= hindrance[3]) {
          hindrance[1] += 10;
          chax = this.getAtomX_0(atom) + (labelWidth + hydrogenWidth) / 2;
        } else {
          hindrance[3] += 10;
          chax = this.getAtomX_0(atom) - (labelWidth + hydrogenWidth) / 2 - hNoWidth;
        }
      } else {
        chax = this.getAtomX_0(atom);
        if (hindrance[0] < hindrance[2]) {
          hindrance[0] += 10;
          chay = this.getAtomY_0(atom) - hHeight;
        } else {
          hindrance[2] += 10;
          chay = this.getAtomY_0(atom) + hHeight;
        }
      }
      if (hNoWidth > 0) {
        x_0 = chax + (hydrogenWidth + hNoWidth) / 2;
        y_0 = chay + narrow_int((this.getTextSize() * 4 + 4) / 8);
        this.mpDrawString(x_0, y_0, hNoStr, true);
        this.mpSetNormalLabelSize();
      }
      this.mpDrawString(chax, chay, "H", true);
    }
    bestSide = 0;
    if (unpairedElectrons != 0) {
      minHindrance = 50;
      counterHindrance = 0;
      for (i = 0; i < 4; i++) {
        counterSide = i > 1 ? i - 2 : i + 2;
        if (hindrance[i] < minHindrance) {
          bestSide = i;
          minHindrance = hindrance[i];
          counterHindrance = hindrance[counterSide];
        } else if (hindrance[i] == minHindrance) {
          if (hindrance[counterSide] > counterHindrance) {
            bestSide = i;
            counterHindrance = hindrance[counterSide];
          }
        }
      }
      switch (bestSide) {
        case 0:
          chax = this.getAtomX_0(atom);
          chay = this.getAtomY_0(atom) - this.mpDotDiameter - labelWidth / 2;
          break;
        case 1:
          chax = this.getAtomX_0(atom) + this.mpDotDiameter + labelWidth / 2;
          chay = this.getAtomY_0(atom);
          break;
        case 2:
          chax = this.getAtomX_0(atom);
          chay = this.getAtomY_0(atom) + this.mpDotDiameter + labelWidth / 2;
          break;
        default:
          chax = this.getAtomX_0(atom) - this.mpDotDiameter - labelWidth / 2;
          chay = this.getAtomY_0(atom);
          break;
      }
      if (unpairedElectrons == 1) {
        this.mpDrawDot(chax, chay, atom);
      } else {
        switch (bestSide) {
          case 0:
            xdiff = 2 * this.mpDotDiameter;
            ydiff = 0;
            chax -= this.mpDotDiameter;
            break;
          case 1:
            xdiff = 0;
            ydiff = 2 * this.mpDotDiameter;
            chay -= this.mpDotDiameter;
            break;
          case 2:
            xdiff = 2 * this.mpDotDiameter;
            ydiff = 0;
            chax -= this.mpDotDiameter;
            break;
          default:
            xdiff = 0;
            ydiff = 2 * this.mpDotDiameter;
            chay -= this.mpDotDiameter;
            break;
        }
        this.mpDrawDot(chax, chay, atom);
        this.mpDrawDot(chax + xdiff, chay + ydiff, atom);
      }
    }
    if (this.mCurrentColor == -8)
      this.setColorCode(-9);
  };
  _.mpDrawBond = function mpDrawBond(bnd) {
    var aLine, atom, atom1, atom2, bLine, bondOrder, bondType, color1, color2, count, esrGroup, esrType, i, nextBondOffset, piBondOffset, side, stereoCenter, theLine, xdiff, ydiff;
    theLine = new carc2.AbstractDepictor$DepictorLine();
    aLine = new carc2.AbstractDepictor$DepictorLine();
    bLine = new carc2.AbstractDepictor$DepictorLine();
    piBondOffset = new cargg.GenericPoint();
    nextBondOffset = new cargg.GenericPoint();
    atom1 = this.mMol.getBondAtom_0(0, bnd);
    atom2 = this.mMol.getBondAtom_0(1, bnd);
    this.onDrawBond(bnd, this.getAtomX_0(atom1), this.getAtomY_0(atom1), this.getAtomX_0(atom2), this.getAtomY_0(atom2));
    if (!this.mMol.isSelectedAtom_0(atom1) && !this.mMol.isSelectedAtom_0(atom2) && neq(and_0(or_0(this.mMol.getAtomQueryFeatures(atom1), this.mMol.getAtomQueryFeatures(atom2)), 536870912), 0))
      this.setColorCode(-8);
    if (isNull(this.mAlternativeCoords[atom1])) {
      theLine.x1 = this.getAtomX_0(atom1);
      theLine.y1 = this.getAtomY_0(atom1);
    } else {
      theLine.x1 = this.mAlternativeCoords[atom1].x_0;
      theLine.y1 = this.mAlternativeCoords[atom1].y_0;
    }
    if (isNull(this.mAlternativeCoords[atom2])) {
      theLine.x2 = this.getAtomX_0(atom2);
      theLine.y2 = this.getAtomY_0(atom2);
    } else {
      theLine.x2 = this.mAlternativeCoords[atom2].x_0;
      theLine.y2 = this.mAlternativeCoords[atom2].y_0;
    }
    if ((this.mMol.getBondQueryFeatures_0(bnd) & 130560) != 0) {
      this.mpHandleDottedLine(theLine, atom1, atom2);
      this.setColorCode(-9);
      return;
    }
    bondOrder = this.mMol.getBondType_0(bnd) == 8 ? 0 : this.mMol.getBondType_0(bnd) == 16 ? 1 : this.mMol.getBondOrder_0(bnd);
    switch (bondOrder) {
      case 1:
        bondType = this.mMol.getBondType_0(bnd);
        if ((this.mDisplayMode & 128) != 0 && (bondType == 257 || bondType == 129)) {
          stereoCenter = this.mMol.getBondAtom_0(0, bnd);
          esrType = this.mMol.getAtomESRType_0(stereoCenter);
          if (esrType != 0) {
            esrGroup = this.mMol.getAtomESRGroup_0(stereoCenter);
            count = 0;
            for (atom = 0; atom < this.mMol.getAtoms_0(); atom++)
              if (this.mMol.getAtomESRType_0(atom) == esrType && this.mMol.getAtomESRGroup_0(atom) == esrGroup)
                count++;
            if (count == 1)
              bondType = 1;
          }
        }
        switch (bondType) {
          case 1:
            this.mpHandleLine(theLine, atom1, atom2);
            break;
          case 257:
            this.mpHandleWedge(theLine, atom1, atom2);
            break;
          case 129:
            xdiff = theLine.x2 - theLine.x1;
            ydiff = theLine.y2 - theLine.y1;
            if (this.mMol.isBondForegroundHilited_0(this.mMol.getBond_0(atom1, atom2))) {
              color1 = -3;
              color2 = -3;
            } else {
              color1 = this.mAtomColor[atom1];
              color2 = this.getESRColor(atom1);
              if (color1 == this.mMol.getAtomColor_0(atom1))
                color1 = color2;
            }
            for (i = 2; i < 17; i += 2) {
              aLine.x1 = theLine.x1 + i * xdiff / 17 - i * ydiff / 128;
              aLine.y1 = theLine.y1 + i * ydiff / 17 + i * xdiff / 128;
              aLine.x2 = theLine.x1 + i * xdiff / 17 + i * ydiff / 128;
              aLine.y2 = theLine.y1 + i * ydiff / 17 - i * xdiff / 128;
              if (this.mpProperLine(aLine)) {
                this.setColorCode(i < 9 ? color1 : color2);
                this.drawBlackLine(aLine);
                this.setColorCode(this.mStandardForegroundColor);
              }
            }
            break;
          case 16:
            this.mpHandleShortDashedLine(theLine, atom1, atom2);
            break;
        }
        break;
      case 0:
      case 2:
        if ((this.mAtomLabelDisplayed[atom1] || this.mMol.getAtomPi_0(atom1) == 2) && (this.mAtomLabelDisplayed[atom2] || this.mMol.getAtomPi_0(atom2) == 2) && !this.mMol.isRingBond_0(bnd) && bondOrder == 2) {
          if (!this.mpProperLine(theLine))
            break;
          this.mpCalcPiBondOffset(theLine.x2 - theLine.x1, theLine.y2 - theLine.y1, piBondOffset);
          xdiff = piBondOffset.x_0 / 2;
          ydiff = piBondOffset.y_0 / 2;
          aLine.x1 = theLine.x1 + xdiff;
          aLine.y1 = theLine.y1 + ydiff;
          aLine.x2 = theLine.x2 + xdiff;
          aLine.y2 = theLine.y2 + ydiff;
          bLine.x1 = theLine.x1 - xdiff;
          bLine.y1 = theLine.y1 - ydiff;
          bLine.x2 = theLine.x2 - xdiff;
          bLine.y2 = theLine.y2 - ydiff;
          if (this.mMol.getBondType_0(bnd) == 386)
            this.mpMakeCrossBond(aLine, bLine);
          this.drawLine_0(aLine, atom1, atom2);
          if (bondOrder == 2)
            this.drawLine_0(bLine, atom1, atom2);
          else
            this.drawDashedLine(bLine, atom1, atom2);
        } else if ((this.mAtomLabelDisplayed[atom2] || this.mMol.getAtomPi_0(atom2) == 2) && bondOrder == 2) {
          this.mpDBFromNonLabelToLabel(theLine, bnd, false);
        } else if ((this.mAtomLabelDisplayed[atom1] || this.mMol.getAtomPi_0(atom1) == 2) && bondOrder == 2) {
          this.mpDBFromNonLabelToLabel(theLine, bnd, true);
        } else {
          side = this.mMol.getPreferredDoubleBondSide(bnd);
          if (side == 0)
            side = 1;
          aLine.x1 = theLine.x1;
          aLine.y1 = theLine.y1;
          aLine.x2 = theLine.x2;
          aLine.y2 = theLine.y2;
          this.mpCalcPiBondOffset(theLine.x2 - theLine.x1, theLine.y2 - theLine.y1, piBondOffset);
          if (side > 0) {
            bLine.x1 = theLine.x1 + piBondOffset.x_0;
            bLine.y1 = theLine.y1 + piBondOffset.y_0;
            bLine.x2 = theLine.x2 + piBondOffset.x_0;
            bLine.y2 = theLine.y2 + piBondOffset.y_0;
            if (this.mpCalcNextBondOffset(atom1, atom2, 1, nextBondOffset) || this.mMol.getConnAtoms_0(atom1) > 1) {
              bLine.x1 += nextBondOffset.x_0 + piBondOffset.y_0;
              bLine.y1 += nextBondOffset.y_0 - piBondOffset.x_0;
            }
            if (this.mpCalcNextBondOffset(atom2, atom1, -1, nextBondOffset) || this.mMol.getConnAtoms_0(atom2) > 1) {
              bLine.x2 += nextBondOffset.x_0 - piBondOffset.y_0;
              bLine.y2 += nextBondOffset.y_0 + piBondOffset.x_0;
            }
          } else {
            bLine.x1 = theLine.x1 - piBondOffset.x_0;
            bLine.y1 = theLine.y1 - piBondOffset.y_0;
            bLine.x2 = theLine.x2 - piBondOffset.x_0;
            bLine.y2 = theLine.y2 - piBondOffset.y_0;
            if (this.mpCalcNextBondOffset(atom1, atom2, -1, nextBondOffset) || this.mMol.getConnAtoms_0(atom1) > 1) {
              bLine.x1 += nextBondOffset.x_0 + piBondOffset.y_0;
              bLine.y1 += nextBondOffset.y_0 - piBondOffset.x_0;
            }
            if (this.mpCalcNextBondOffset(atom2, atom1, 1, nextBondOffset) || this.mMol.getConnAtoms_0(atom2) > 1) {
              bLine.x2 += nextBondOffset.x_0 - piBondOffset.y_0;
              bLine.y2 += nextBondOffset.y_0 + piBondOffset.x_0;
            }
          }
          if (this.mMol.getBondType_0(bnd) == 386)
            this.mpMakeCrossBond(aLine, bLine);
          this.mpHandleLine(aLine, atom1, atom2);
          if (bondOrder == 2)
            this.mpHandleLine(bLine, atom1, atom2);
          else
            this.mpHandleDashedLine(bLine, atom1, atom2);
        }
        break;
      case 3:
        if (this.mpProperLine(theLine)) {
          this.drawLine_0(theLine, atom1, atom2);
          this.mpCalcPiBondOffset(theLine.x2 - theLine.x1, theLine.y2 - theLine.y1, piBondOffset);
          this.drawOffsetLine(theLine, atom1, atom2, piBondOffset.x_0, piBondOffset.y_0, aLine);
          this.drawOffsetLine(theLine, atom1, atom2, -piBondOffset.x_0, -piBondOffset.y_0, aLine);
        }
        break;
      case 4:
        if (this.mpProperLine(theLine)) {
          this.mpCalcPiBondOffset(theLine.x2 - theLine.x1, theLine.y2 - theLine.y1, piBondOffset);
          this.drawOffsetLine(theLine, atom1, atom2, 1.5 * piBondOffset.x_0, 1.5 * piBondOffset.y_0, aLine);
          this.drawOffsetLine(theLine, atom1, atom2, 0.5 * piBondOffset.x_0, 0.5 * piBondOffset.y_0, aLine);
          this.drawOffsetLine(theLine, atom1, atom2, -0.5 * piBondOffset.x_0, -0.5 * piBondOffset.y_0, aLine);
          this.drawOffsetLine(theLine, atom1, atom2, -1.5 * piBondOffset.x_0, -1.5 * piBondOffset.y_0, aLine);
        }
        break;
      case 5:
        if (this.mpProperLine(theLine)) {
          this.drawLine_0(theLine, atom1, atom2);
          this.mpCalcPiBondOffset(theLine.x2 - theLine.x1, theLine.y2 - theLine.y1, piBondOffset);
          this.drawOffsetLine(theLine, atom1, atom2, 2 * piBondOffset.x_0, 2 * piBondOffset.y_0, aLine);
          this.drawOffsetLine(theLine, atom1, atom2, piBondOffset.x_0, piBondOffset.y_0, aLine);
          this.drawOffsetLine(theLine, atom1, atom2, -piBondOffset.x_0, -piBondOffset.y_0, aLine);
          this.drawOffsetLine(theLine, atom1, atom2, -2 * piBondOffset.x_0, -2 * piBondOffset.y_0, aLine);
        }
        break;
    }
    if (this.mCurrentColor == -8)
      this.setColorCode(-9);
  };
  _.mpDrawBondQueryFeatures = function mpDrawBondQueryFeatures() {
    var atom1, atom2, bond, d, dx, dy, hh, hw, label_0, maxAtoms, minAtoms, ringSize, textSizeChanged, x_0, y_0;
    textSizeChanged = false;
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      label_0 = null;
      if (this.mMol.isBondBridge_0(bond)) {
        minAtoms = this.mMol.getBondBridgeMinSize_0(bond);
        maxAtoms = this.mMol.getBondBridgeMaxSize_0(bond);
        label_0 = minAtoms == maxAtoms ? "[" + minAtoms + "]" : "[" + minAtoms + ":" + maxAtoms + "]";
      } else if ((this.mMol.getBondQueryFeatures_0(bond) & 6291456) != 0) {
        label_0 = (this.mMol.getBondQueryFeatures_0(bond) & 6291456) == 2097152 ? "a" : (this.mMol.getBondQueryFeatures_0(bond) & 384) == 256 ? "r!a" : "!a";
      } else if ((this.mMol.getBondQueryFeatures_0(bond) & 384) != 0) {
        label_0 = (this.mMol.getBondQueryFeatures_0(bond) & 384) == 256 ? "r" : "!r";
      }
      ringSize = (this.mMol.getBondQueryFeatures_0(bond) & 917504) >> 17;
      if (ringSize != 0)
        label_0 = (jsEquals(label_0, null) ? "" : label_0) + ringSize;
      if (jsNotEquals(label_0, null)) {
        atom1 = this.mMol.getBondAtom_0(0, bond);
        atom2 = this.mMol.getBondAtom_0(1, bond);
        if (!textSizeChanged) {
          this.mpSetSmallLabelSize();
          textSizeChanged = true;
        }
        x_0 = (this.getAtomX_0(atom1) + this.getAtomX_0(atom2)) / 2;
        y_0 = (this.getAtomY_0(atom1) + this.getAtomY_0(atom2)) / 2;
        dx = this.getAtomX_0(atom2) - this.getAtomX_0(atom1);
        dy = this.getAtomY_0(atom2) - this.getAtomY_0(atom1);
        d = $wnd.Math.sqrt(dx * dx + dy * dy);
        hw = 0.6 * this.getStringWidth(label_0);
        hh = 0.55 * this.getTextSize();
        if (d != 0) {
          if (dx > 0)
            this.mpDrawString(x_0 + hw * dy / d, y_0 - hh * dx / d, label_0, true);
          else
            this.mpDrawString(x_0 - hw * dy / d, y_0 + hh * dx / d, label_0, true);
        }
      }
    }
    if (textSizeChanged)
      this.mpSetNormalLabelSize();
  };
  _.mpDrawDot = function mpDrawDot(x_0, y_0, atm) {
    this.mpTabuZone.add(new cargg.GenericRectangle_0(x_0 - this.mpDotDiameter, y_0 - this.mpDotDiameter, 2 * this.mpDotDiameter, 2 * this.mpDotDiameter));
    if (!this.mIsValidatingView) {
      this.mpDot.add(new carc2.AbstractDepictor$DepictorDot(x_0, y_0, this.isHighlightedAtom(atm) ? -3 : this.mAtomColor[atm]));
    }
  };
  _.mpDrawString = function mpDrawString(x_0, y_0, str, withTabu) {
    var strWidth, xdiff, ydiff;
    if (withTabu) {
      strWidth = this.getStringWidth(str);
      xdiff = strWidth / 2 + narrow_int(this.getTextSize() / 8);
      ydiff = narrow_int(this.getTextSize() / 2);
      if (jsEquals(str, "+") || jsEquals(str, "-"))
        ydiff = ydiff * 2 / 3;
      this.mpTabuZone.add(new cargg.GenericRectangle_0(x_0 - xdiff, y_0 - ydiff, 2 * xdiff, 2 * ydiff));
    }
    if (!this.mIsValidatingView)
      this.drawString_0(str, x_0, y_0);
  };
  _.mpExchangeLineEnds = function mpExchangeLineEnds(theLine) {
    var temp;
    temp = theLine.x1;
    theLine.x1 = theLine.x2;
    theLine.x2 = temp;
    temp = theLine.y1;
    theLine.y1 = theLine.y2;
    theLine.y2 = temp;
  };
  _.mpGetAngleESRScore = function mpGetAngleESRScore(angleList, index_0, meanAngle) {
    var score;
    score = index_0 == 0 ? 2 * 3.141592653589793 + angleList[0] - angleList[angleList.length - 1] : angleList[index_0] - angleList[index_0 - 1];
    if (meanAngle > -3.141592653589793 * 2 / 3 && meanAngle < 3.141592653589793 / 3)
      score -= 2 * $wnd.Math.cos(meanAngle + 3.141592653589793 / 6);
    else
      score -= 0.5 * $wnd.Math.cos(meanAngle + 3.141592653589793 / 6);
    return score;
  };
  _.mpGetFrame = function mpGetFrame(theLine) {
    var theFrame;
    theFrame = new cargg.GenericRectangle();
    if (theLine.x1 <= theLine.x2) {
      theFrame.x_0 = theLine.x1;
      theFrame.width_0 = theLine.x2 - theLine.x1;
    } else {
      theFrame.x_0 = theLine.x2;
      theFrame.width_0 = theLine.x1 - theLine.x2;
    }
    if (theLine.y1 <= theLine.y2) {
      theFrame.y_0 = theLine.y1;
      theFrame.height_0 = theLine.y2 - theLine.y1;
    } else {
      theFrame.y_0 = theLine.y2;
      theFrame.height_0 = theLine.y1 - theLine.y2;
    }
    return theFrame;
  };
  _.mpGetFreeSpaceAngle = function mpGetFreeSpaceAngle(atom) {
    var angle, i, i0, maxMean, maxVal, mean, val;
    angle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllConnAtoms_0(atom), 15, 1);
    for (i0 = 0; i0 < this.mMol.getAllConnAtoms_0(atom); i0++)
      angle[i0] = this.mMol.getBondAngle_0(atom, this.mMol.getConnAtom_0(atom, i0));
    ju.sort_2(angle);
    maxMean = this.mpGetMeanAngle(angle, 0);
    maxVal = this.mpGetAngleESRScore(angle, 0, maxMean);
    for (i = 1; i < angle.length; i++) {
      mean = this.mpGetMeanAngle(angle, i);
      val = this.mpGetAngleESRScore(angle, i, mean);
      if (maxVal < val) {
        maxVal = val;
        maxMean = mean;
      }
    }
    return maxMean;
  };
  _.mpGetMeanAngle = function mpGetMeanAngle(angle, index_0) {
    var mean;
    if (index_0 > 0)
      return (angle[index_0] + angle[index_0 - 1]) / 2;
    mean = 3.141592653589793 + (angle[0] + angle[angle.length - 1]) / 2;
    return mean > 3.141592653589793 ? mean - 2 * 3.141592653589793 : mean;
  };
  _.mpHandleDashedLine = function mpHandleDashedLine(theLine, atm1, atm2) {
    if (this.mpProperLine(theLine))
      this.drawDashedLine(theLine, atm1, atm2);
  };
  _.mpHandleDottedLine = function mpHandleDottedLine(theLine, atm1, atm2) {
    if (this.mpProperLine(theLine))
      this.drawDottedLine_0(theLine);
  };
  _.mpHandleLine = function mpHandleLine(theLine, atm1, atm2) {
    if (this.mpProperLine(theLine))
      this.drawLine_0(theLine, atm1, atm2);
  };
  _.mpHandleShortDashedLine = function mpHandleShortDashedLine(theLine, atm1, atm2) {
    if (this.mpProperLine(theLine))
      this.drawShortDashedLine(theLine, atm1, atm2);
  };
  _.mpHandleWedge = function mpHandleWedge(origWedge, atm1, atm2) {
    var i, tabuZone, theFrame, theWedge;
    theWedge = new carc2.AbstractDepictor$DepictorLine();
    if (origWedge.x1 == origWedge.x2 && origWedge.y1 == origWedge.y2)
      return;
    theWedge.x1 = origWedge.x1;
    theWedge.y1 = origWedge.y1;
    theWedge.x2 = origWedge.x2;
    theWedge.y2 = origWedge.y2;
    theFrame = this.mpGetFrame(theWedge);
    for (i = 0; i < this.mpTabuZone.size(); i++) {
      tabuZone = castTo(this.mpTabuZone.getAtIndex(i), 32);
      if (tabuZone.x_0 > theFrame.x_0 + theFrame.width_0 || tabuZone.y_0 > theFrame.y_0 + theFrame.height_0 || theFrame.x_0 > tabuZone.x_0 + tabuZone.width_0 || theFrame.y_0 > tabuZone.y_0 + tabuZone.height_0)
        continue;
      if (this.mpInTabuZone(theWedge.x1, theWedge.y1, i)) {
        if (this.mpInTabuZone(theWedge.x2, theWedge.y2, i))
          return;
        this.mpShortenLine(theWedge, 0, i);
        this.mpHandleWedge(theWedge, atm1, atm2);
        return;
      }
      if (this.mpInTabuZone(theWedge.x2, theWedge.y2, i)) {
        this.mpShortenLine(theWedge, 1, i);
        this.mpHandleWedge(theWedge, atm1, atm2);
        return;
      }
    }
    this.drawWedge(theWedge, atm1, atm2);
  };
  _.mpInTabuZone = function mpInTabuZone(x_0, y_0, tabuZoneNo) {
    var tabuZone;
    if ((this.mDisplayMode & 1) != 0)
      return false;
    tabuZone = castTo(this.mpTabuZone.getAtIndex(tabuZoneNo), 32);
    return x_0 > tabuZone.x_0 && x_0 < tabuZone.x_0 + tabuZone.width_0 && y_0 > tabuZone.y_0 && y_0 < tabuZone.y_0 + tabuZone.height_0;
  };
  _.mpMakeCrossBond = function mpMakeCrossBond(aLine, bLine) {
    var temp;
    temp = aLine.x2;
    aLine.x2 = bLine.x2;
    bLine.x2 = temp;
    temp = aLine.y2;
    aLine.y2 = bLine.y2;
    bLine.y2 = temp;
  };
  _.mpProperLine = function mpProperLine(theLine) {
    var endsExchanged, i, retval, tabuZone, tabuZone$iterator, theFrame;
    if (theLine.x1 == theLine.x2 && theLine.y1 == theLine.y2) {
      for (tabuZone$iterator = this.mpTabuZone.iterator(); tabuZone$iterator.hasNext_0(); ) {
        tabuZone = castTo(tabuZone$iterator.next_3(), 32);
        if (tabuZone.contains_0(theLine.x1, theLine.y1))
          return false;
      }
      return true;
    }
    theFrame = this.mpGetFrame(theLine);
    endsExchanged = false;
    if (theLine.x1 > theLine.x2) {
      this.mpExchangeLineEnds(theLine);
      endsExchanged = true;
    }
    for (i = 0; i < this.mpTabuZone.size(); i++) {
      tabuZone = castTo(this.mpTabuZone.getAtIndex(i), 32);
      if (tabuZone.x_0 > theFrame.x_0 + theFrame.width_0 || tabuZone.y_0 > theFrame.y_0 + theFrame.height_0 || theFrame.x_0 > tabuZone.x_0 + tabuZone.width_0 || theFrame.y_0 > tabuZone.y_0 + tabuZone.height_0)
        continue;
      if (this.mpInTabuZone(theLine.x1, theLine.y1, i)) {
        if (this.mpInTabuZone(theLine.x2, theLine.y2, i)) {
          if (endsExchanged)
            this.mpExchangeLineEnds(theLine);
          return false;
        }
        this.mpShortenLine(theLine, 0, i);
        retval = this.mpProperLine(theLine);
        if (endsExchanged)
          this.mpExchangeLineEnds(theLine);
        return retval;
      }
      if (this.mpInTabuZone(theLine.x2, theLine.y2, i)) {
        this.mpShortenLine(theLine, 1, i);
        retval = this.mpProperLine(theLine);
        if (endsExchanged)
          this.mpExchangeLineEnds(theLine);
        return retval;
      }
    }
    if (endsExchanged)
      this.mpExchangeLineEnds(theLine);
    return true;
  };
  _.mpSetNormalLabelSize = function mpSetNormalLabelSize() {
    this.setTextSize(this.mpLabelSize);
  };
  _.mpSetReducedLabelSize = function mpSetReducedLabelSize() {
    this.setTextSize(narrow_int((this.mpLabelSize * 5 + 1) / 6));
  };
  _.mpSetSmallLabelSize = function mpSetSmallLabelSize() {
    this.setTextSize(narrow_int((this.mpLabelSize * 2 + 1) / 3));
  };
  _.mpShortenLine = function mpShortenLine(theLine, pointNo, tabuZoneNo) {
    var dx, dy, sx, sy, tabuX, tabuY, tabuZone, x1, x2, y1, y2;
    if (pointNo == 0) {
      x1 = theLine.x1;
      y1 = theLine.y1;
      x2 = theLine.x2;
      y2 = theLine.y2;
    } else {
      x1 = theLine.x2;
      y1 = theLine.y2;
      x2 = theLine.x1;
      y2 = theLine.y1;
    }
    tabuZone = castTo(this.mpTabuZone.getAtIndex(tabuZoneNo), 32);
    tabuX = x2 > x1 ? tabuZone.x_0 + tabuZone.width_0 : tabuZone.x_0;
    tabuY = y2 > y1 ? tabuZone.y_0 + tabuZone.height_0 : tabuZone.y_0;
    dx = x2 - x1;
    dy = y2 - y1;
    if ($wnd.Math.abs(dx) > $wnd.Math.abs(dy)) {
      if (y1 == y2) {
        sx = tabuX;
        sy = y1;
      } else {
        sx = x1 + dx * (tabuY - y1) / dy;
        if (x2 > x1 == tabuX > sx) {
          sy = tabuY;
        } else {
          sx = tabuX;
          sy = y1 + dy * (tabuX - x1) / dx;
        }
      }
    } else {
      if (x1 == x2) {
        sx = x1;
        sy = tabuY;
      } else {
        sy = y1 + dy * (tabuX - x1) / dx;
        if (y2 > y1 == tabuY > sy) {
          sx = tabuX;
        } else {
          sx = x1 + dx * (tabuY - y1) / dy;
          sy = tabuY;
        }
      }
    }
    if (pointNo == 0) {
      theLine.x1 = sx;
      theLine.y1 = sy;
    } else {
      theLine.x2 = sx;
      theLine.y2 = sy;
    }
  };
  _.onDrawAtom = function onDrawAtom(atom, symbol, x_0, y_0) {
  };
  _.onDrawBond = function onDrawBond(bond, x1, y1, x2, y2) {
  };
  _.paint = function paint(context) {
    var atom, esrGroupMemberCount, explicitAtomColors, i, rgb;
    if (this.mMol.getAllAtoms_0() == 0)
      return;
    this.mMol.ensureHelperArrays_0(this.requiredHelperArrays());
    this.mContext = context;
    this.calculateParameters();
    esrGroupMemberCount = this.mMol.getESRGroupMemberCounts();
    explicitAtomColors = false;
    this.mAtomColor = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      this.mAtomColor[atom] = this.mMol.getAtomColor_0(atom);
      if (this.mAtomColor[atom] != 0)
        explicitAtomColors = true;
      if (this.mMol.isSelectedAtom_0(atom))
        this.mAtomColor[atom] = 128;
      if (this.mMol.getStereoProblem_0(atom) && (this.mDisplayMode & 2048) == 0)
        this.mAtomColor[atom] = 256;
    }
    this.setColorCode(-10);
    if (jsNotEquals(this.mAtomHiliteColor, null) && this.mAtomHiliteColor.length >= this.mMol.getAtoms_0())
      this.hiliteAtomBackgrounds(this.mAtomHiliteColor, this.mAtomHiliteRadius);
    this.hiliteExcludeGroups();
    this.hiliteBondBackgrounds();
    this.indicateQueryFeatures();
    this.addChiralInfo();
    this.mpSetNormalLabelSize();
    this.setLineWidth_0(this.mpLineWidth);
    this.setColorCode(this.mStandardForegroundColor);
    this.markIsolatedAtoms();
    this.mpDot.clear();
    this.mpTabuZone.clear();
    if ((this.mDisplayMode & 1) != 0) {
      this.mpDrawAllBonds(esrGroupMemberCount);
      this.mpDrawAllDots();
      this.mpDrawBondQueryFeatures();
    }
    for (i = 0; i < this.mMol.getAllAtoms_0(); i++) {
      if (this.isHighlightedAtom(i)) {
        this.setColorCode(-3);
        this.mpDrawAtom(i, esrGroupMemberCount);
        this.setColorCode(this.mStandardForegroundColor);
      } else if (this.mAtomColor[i] != 0) {
        this.setColorCode(this.mAtomColor[i]);
        this.mpDrawAtom(i, esrGroupMemberCount);
        this.setColorCode(this.mStandardForegroundColor);
      } else if (!explicitAtomColors && this.mMol.getMoleculeColor_0() != 1 && this.mMol.getAtomicNo_0(i) != 1 && this.mMol.getAtomicNo_0(i) != 6 && (this.mDisplayMode & 1024) == 0 && jsEquals(this.mMol.getAtomList_0(i), null) && this.mMol.getAtomicNo_0(i) < carc2.ATOM_LABEL_COLOR.length && carc2.ATOM_LABEL_COLOR[this.mMol.getAtomicNo_0(i)] != 0) {
        rgb = carc2.ATOM_LABEL_COLOR[this.mMol.getAtomicNo_0(i)];
        this.setRGBColor(this.getContrastColor(rgb, i));
        this.mpDrawAtom(i, esrGroupMemberCount);
        this.setColorCode(this.mStandardForegroundColor);
      } else {
        this.mpDrawAtom(i, esrGroupMemberCount);
      }
    }
    if ((this.mDisplayMode & 1) == 0) {
      this.mpDrawAllDots();
      this.mpDrawBondQueryFeatures();
      this.mpDrawAllBonds(esrGroupMemberCount);
    }
  };
  _.requiredHelperArrays = function requiredHelperArrays() {
    return (this.mDisplayMode & 256) != 0 ? 63 : (this.mDisplayMode & 512) != 0 ? 95 : 31;
  };
  _.setAtomLabelAVBL = function setAtomLabelAVBL(avbl) {
    this.mAtomLabelAVBL = avbl / this.mTransformation.getScaling();
  };
  _.setAtomText = function setAtomText(atomText) {
    this.mAtomText = atomText;
  };
  _.setChiralTextLocation = function setChiralTextLocation(viewRect, avbl, mode) {
    var spacing;
    spacing = avbl / 2;
    switch (mode & 786432) {
      case 786432:
        if (isNotNull(viewRect)) {
          this.mChiralTextLocation.x_0 = viewRect.x_0 + viewRect.width_0 / 2;
          this.mChiralTextLocation.y_0 = viewRect.y_0 + viewRect.height_0 - spacing;
          break;
        }
      case 0:
        this.mChiralTextLocation.x_0 = this.mBoundingRect.x_0 + this.mBoundingRect.width_0 / 2;
        this.mChiralTextLocation.y_0 = this.mBoundingRect.y_0 + this.mBoundingRect.height_0 + spacing;
        if (isNotNull(viewRect) && this.mChiralTextLocation.y_0 > viewRect.y_0 + viewRect.height_0 - spacing)
          this.mChiralTextLocation.y_0 = viewRect.y_0 + viewRect.height_0 - spacing;
        break;
      case 524288:
        if (isNotNull(viewRect)) {
          this.mChiralTextLocation.x_0 = viewRect.x_0 + viewRect.width_0 / 2;
          this.mChiralTextLocation.y_0 = viewRect.y_0 + spacing;
          break;
        }
      case 262144:
        this.mChiralTextLocation.x_0 = this.mBoundingRect.x_0 + this.mBoundingRect.width_0 / 2;
        this.mChiralTextLocation.y_0 = this.mBoundingRect.y_0 - spacing;
        if (isNotNull(viewRect) && this.mChiralTextLocation.y_0 < viewRect.y_0 + spacing)
          this.mChiralTextLocation.y_0 = viewRect.y_0 + spacing;
        break;
    }
  };
  _.setColorCode = function setColorCode(theColor) {
    if (this.mIsValidatingView)
      return;
    if (theColor == -10) {
      this.mCurrentColor = -999;
      theColor = this.mStandardForegroundColor;
    }
    if (theColor != -2 && theColor != -7 && this.mOverruleForeground != 0)
      theColor = -4;
    if (theColor == this.mCurrentColor)
      return;
    if (this.mCurrentColor == -8 && theColor != -9)
      return;
    if (theColor == -8)
      this.mPreviousColor = this.mCurrentColor;
    if (theColor == -9)
      theColor = this.mPreviousColor;
    this.mCurrentColor = theColor;
    switch (theColor) {
      case 0:
        this.setRGB_0(this.mCustomForeground == 0 ? -16777216 : this.mCustomForeground);
        break;
      case -6:
        this.setRGB_0(this.mCustomForeground);
        break;
      case -4:
        this.setRGB_0(this.mOverruleForeground);
        break;
      case -2:
        this.setRGB_0(this.mBondBGHiliteColor);
        break;
      case -3:
        this.setRGB_0(this.mBondFGHiliteColor);
        break;
      case -7:
        this.setRGB_0(this.mExcludeGroupBGColor);
        break;
      case -8:
        this.setRGB_0(this.mExcludeGroupFGColor);
        break;
      case -5:
        this.setRGB_0(this.mRGBColor);
        break;
      case 64:
        this.setRGB_0(-14655233);
        break;
      case 128:
        this.setRGB_0(-65536);
        break;
      case 256:
        this.setRGB_0(-4194049);
        break;
      case 192:
        this.setRGB_0(-16711936);
        break;
      case 320:
        this.setRGB_0(-24576);
        break;
      case 384:
        this.setRGB_0(-16744448);
        break;
      case 448:
        this.setRGB_0(-6291456);
        break;
      case 1:
        this.setRGB_0(-8355712);
        break;
      default:
        this.setRGB_0(-16777216);
        break;
    }
  };
  _.setDisplayMode = function setDisplayMode(displayMode) {
    this.mDisplayMode = displayMode;
  };
  _.setFactorTextSize = function setFactorTextSize(factor) {
    this.mFactorTextSize = factor;
  };
  _.setForegroundColor = function setForegroundColor(foreground, background) {
    this.mStandardForegroundColor = -6;
    this.mCustomForeground = foreground;
    this.mCustomBackground = background;
    this.updateBondHiliteColor();
  };
  _.setRGBColor = function setRGBColor(rgb) {
    if (this.mOverruleForeground != 0) {
      if (this.mCurrentColor != -4) {
        this.mCurrentColor = -4;
        this.setRGB_0(this.mOverruleForeground);
      }
      return;
    }
    this.mCurrentColor = -5;
    this.mRGBColor = rgb;
    this.setRGB_0(rgb);
  };
  _.simpleCalculateBounds = function simpleCalculateBounds() {
    var i, maxx, maxy, minx, miny;
    minx = this.getAtomX_0(0);
    maxx = this.getAtomX_0(0);
    miny = this.getAtomY_0(0);
    maxy = this.getAtomY_0(0);
    for (i = 0; i < this.mMol.getAllAtoms_0(); i++) {
      if (minx > this.getAtomX_0(i))
        minx = this.getAtomX_0(i);
      if (maxx < this.getAtomX_0(i))
        maxx = this.getAtomX_0(i);
      if (miny > this.getAtomY_0(i))
        miny = this.getAtomY_0(i);
      if (maxy < this.getAtomY_0(i))
        maxy = this.getAtomY_0(i);
    }
    return new cargg.GenericRectangle_0(minx, miny, maxx - minx, maxy - miny);
  };
  _.simpleValidateView = function simpleValidateView(viewRect, mode) {
    var avbl, t;
    if (this.mMol.getAllAtoms_0() == 0)
      return null;
    this.mBoundingRect = this.simpleCalculateBounds();
    avbl = this.mTransformation.getScaling() * this.mMol.getAverageBondLength_0();
    t = new carc2.DepictorTransformation_1(this.mBoundingRect, viewRect, avbl, mode);
    if (t.isVoidTransformation()) {
      t = null;
    } else {
      t.applyTo_0(this.mTransformation);
      t.applyTo_3(this.mBoundingRect);
    }
    this.setChiralTextLocation(viewRect, avbl, mode);
    return t;
  };
  _.updateBondHiliteColor = function updateBondHiliteColor() {
    var background;
    background = this.mOverruleBackground != 0 ? this.mOverruleBackground : this.mCustomBackground != 0 ? this.mCustomBackground : -1;
    this.mBondBGHiliteColor = caru.intermediateColor(background, -10706689, 0.30000001192092896);
    this.mBondFGHiliteColor = caru.getContrastColor_0(-32768, background);
    this.mExcludeGroupBGColor = -24321;
    this.mExcludeGroupFGColor = -6291392;
  };
  _.updateCoords = function updateCoords(context, viewRect, mode) {
    var t;
    this.validateView(context, viewRect, mode);
    if (this.mTransformation.isVoidTransformation()) {
      return null;
    } else {
      t = this.mTransformation;
      this.mTransformation.applyTo_1(this.mMol);
      this.mTransformation = new carc2.DepictorTransformation();
      return t;
    }
  };
  _.validateView = function validateView(context, viewRect, mode) {
    var avbl, i, t1, t2;
    if (this.mMol.getAllAtoms_0() == 0)
      return null;
    t1 = this.simpleValidateView(viewRect, mode);
    this.mMol.ensureHelperArrays_0(this.requiredHelperArrays());
    this.markIsolatedAtoms();
    this.mpDot.clear();
    this.mpTabuZone.clear();
    this.mContext = context;
    this.calculateParameters();
    this.mpSetNormalLabelSize();
    this.mIsValidatingView = true;
    for (i = 0; i < this.mMol.getAllAtoms_0(); i++)
      this.mpDrawAtom(i, null);
    this.mIsValidatingView = false;
    avbl = this.mTransformation.getScaling() * this.mMol.getAverageBondLength_0();
    this.expandBoundsByTabuZones(avbl);
    this.setChiralTextLocation(viewRect, avbl, mode);
    if (isNull(viewRect) || viewRect.contains_2(this.mBoundingRect))
      return t1;
    t2 = new carc2.DepictorTransformation_1(this.mBoundingRect, viewRect, avbl, mode);
    t2.applyTo_0(this.mTransformation);
    t2.applyTo_3(this.mBoundingRect);
    t2.applyTo_2(this.mChiralTextLocation);
    if (isNull(t1))
      return t2;
    t2.applyTo_0(t1);
    return t1;
  };
  _.mAtomLabelAVBL = 0;
  _.mBondBGHiliteColor = 0;
  _.mBondFGHiliteColor = 0;
  _.mChiralTextSize = 0;
  _.mCurrentColor = 0;
  _.mCustomBackground = 0;
  _.mCustomForeground = 0;
  _.mDisplayMode = 0;
  _.mExcludeGroupBGColor = 0;
  _.mExcludeGroupFGColor = 0;
  _.mFactorTextSize = 0;
  _.mIsValidatingView = false;
  _.mOverruleBackground = 0;
  _.mOverruleForeground = 0;
  _.mPreviousColor = 0;
  _.mRGBColor = 0;
  _.mStandardForegroundColor = 0;
  _.mpBondHiliteRadius = 0;
  _.mpBondSpacing = 0;
  _.mpDotDiameter = 0;
  _.mpExcludeGroupRadius = 0;
  _.mpLabelSize = 0;
  _.mpLineWidth = 0;
  _.mpQFDiameter = 0;
  carc2.BG_EXCLUDE_GROUP_COLOR = -24321;
  carc2.BOND_BG_HILITE_COLOR = -10706689;
  carc2.BOND_FG_HILITE_COLOR = -32768;
  carc2.COLOR_BLUE = -14655233;
  carc2.COLOR_CHIRALITY_TEXT = 448;
  carc2.COLOR_CIP_LETTER = 448;
  carc2.COLOR_CUSTOM_FOREGROUND = 0;
  carc2.COLOR_DARK_GREEN = -16744448;
  carc2.COLOR_DARK_RED = -6291456;
  carc2.COLOR_EXCLUDE_GROUP_BG = 0;
  carc2.COLOR_EXCLUDE_GROUP_FG = 0;
  carc2.COLOR_GREEN = -16711936;
  carc2.COLOR_HILITE_BOND_BG = 0;
  carc2.COLOR_HILITE_BOND_FG = 0;
  carc2.COLOR_INITIALIZE = 0;
  carc2.COLOR_MAGENTA = -4194049;
  carc2.COLOR_ORANGE = -24576;
  carc2.COLOR_OVERRULED = 0;
  carc2.COLOR_RED = -65536;
  carc2.COLOR_RESTORE_PREVIOUS = 0;
  carc2.COLOR_RGB = 0;
  carc2.COLOR_SELECTED = 128;
  carc2.COLOR_UNDEFINED = 0;
  carc2.FG_EXCLUDE_GROUP_COLOR = -6291392;
  carc2.cColorGray = 1;
  carc2.cDModeAtomNo = 2;
  carc2.cDModeBondNo = 4;
  carc2.cDModeDrawBondsInGray = 16384;
  carc2.cDModeHiliteAllQueryFeatures = 8;
  carc2.cDModeNoColorOnESRAndCIP = 4096;
  carc2.cDModeNoImplicitAtomLabelColors = 1024;
  carc2.cDModeNoImplicitHydrogen = 8192;
  carc2.cDModeNoStereoProblem = 2048;
  carc2.cDModeNoTabus = 1;
  carc2.cDModeShowMapping = 16;
  carc2.cDModeShowSymmetryAny = 768;
  carc2.cDModeShowSymmetrySimple = 256;
  carc2.cDModeShowSymmetryStereoHeterotopicity = 512;
  carc2.cDModeSuppressCIPParity = 64;
  carc2.cDModeSuppressChiralText = 32;
  carc2.cDModeSuppressESR = 128;
  carc2.cFactorBondHiliteRadius = 0.38;
  carc2.cFactorBondSpacing = 0.15;
  carc2.cFactorChiralTextSize = 0.5;
  carc2.cFactorDotDiameter = 0.12;
  carc2.cFactorExcludeGroupRadius = 0.47;
  carc2.cFactorLineWidth = 0.06;
  carc2.cFactorQFDiameter = 0.4;
  carc2.cFactorTextSize = 0.6;
  carc2.cModeChiralTextAboveMolecule = 262144;
  carc2.cModeChiralTextBelowMolecule = 0;
  carc2.cModeChiralTextLocation = 786432;
  carc2.cModeChiralTextOnFrameBottom = 786432;
  carc2.cModeChiralTextOnFrameTop = 524288;
  carc2.cModeInflateToAVBL = 196608;
  carc2.cModeInflateToHighResAVBL = 131072;
  carc2.cModeInflateToMaxAVBL = 65536;
  carc2.cModeMaxBondLength = 65535;
  carc2.cOptAvBondLen = 0;
  cggl.Lcom_actelion_research_chem_AbstractDepictor_2_classLit = createForClass("com.actelion.research.chem", "AbstractDepictor", 161, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_AbstractDepictor$DepictorDot = function $clinit_AbstractDepictor$DepictorDot() {
    carc2.$clinit_AbstractDepictor$DepictorDot = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.AbstractDepictor$DepictorDot = function AbstractDepictor$DepictorDot(x_0, y_0, color_0) {
    carc2.$clinit_AbstractDepictor$DepictorDot();
    Object_0.call(this);
    this.$init_2();
    this.x_0 = x_0;
    this.y_0 = y_0;
    this.color_0 = color_0;
  };
  defineClass(205, 1, { 205: 1, 1: 1 }, carc2.AbstractDepictor$DepictorDot);
  _.$init_2 = function $init_2() {
  };
  _.color_0 = 0;
  _.x_0 = 0;
  _.y_0 = 0;
  cggl.Lcom_actelion_research_chem_AbstractDepictor$DepictorDot_2_classLit = createForClass("com.actelion.research.chem", "AbstractDepictor/DepictorDot", 205, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_AbstractDepictor$DepictorLine = function $clinit_AbstractDepictor$DepictorLine() {
    carc2.$clinit_AbstractDepictor$DepictorLine = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.AbstractDepictor$DepictorLine = function AbstractDepictor$DepictorLine() {
    carc2.$clinit_AbstractDepictor$DepictorLine();
    Object_0.call(this);
    this.$init_3();
  };
  defineClass(81, 1, { 1: 1 }, carc2.AbstractDepictor$DepictorLine);
  _.$init_3 = function $init_3() {
  };
  _.x1 = 0;
  _.x2 = 0;
  _.y1 = 0;
  _.y2 = 0;
  cggl.Lcom_actelion_research_chem_AbstractDepictor$DepictorLine_2_classLit = createForClass("com.actelion.research.chem", "AbstractDepictor/DepictorLine", 81, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_AbstractDrawingObject = function $clinit_AbstractDrawingObject() {
    carc2.$clinit_AbstractDrawingObject = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.AbstractDrawingObject = function AbstractDrawingObject() {
    carc2.$clinit_AbstractDrawingObject();
    Object_0.call(this);
    this.$init_4();
  };
  carc2.instantiate = function instantiate(descriptor) {
    carc2.$clinit_AbstractDrawingObject();
    return carc2.createObject(descriptor);
  };
  defineClass(38, 1, { 38: 1, 1: 1 });
  _.$init_4 = function $init_4() {
  };
  _.getBoundingRect_0 = function getBoundingRect_0(context) {
    var bounds, i;
    if (jsEquals(this.mPoint, null))
      return null;
    bounds = new cargg.GenericRectangle_0(this.mPoint[0].x_0, this.mPoint[0].y_0, 0, 0);
    for (i = 1; i < this.mPoint.length; i++) {
      if (bounds.x_0 > this.mPoint[i].x_0) {
        bounds.width_0 += bounds.x_0 - this.mPoint[i].x_0;
        bounds.x_0 = this.mPoint[i].x_0;
      } else if (bounds.width_0 < this.mPoint[i].x_0 - bounds.x_0) {
        bounds.width_0 = this.mPoint[i].x_0 - bounds.x_0;
      }
      if (bounds.y_0 > this.mPoint[i].y_0) {
        bounds.height_0 += bounds.y_0 - this.mPoint[i].y_0;
        bounds.y_0 = this.mPoint[i].y_0;
      } else if (bounds.height_0 < this.mPoint[i].y_0 - bounds.y_0) {
        bounds.height_0 = this.mPoint[i].y_0 - bounds.y_0;
      }
    }
    return bounds;
  };
  _.getDescriptor = function getDescriptor() {
    return '<DrawingObject type="' + this.getTypeString() + '"' + this.getDescriptorDetail() + "></DrawingObject>";
  };
  _.isDeletable = function isDeletable() {
    return !this.mProtectedFromDeletion;
  };
  _.isSelected_0 = function isSelected_0() {
    return this.mIsSelected;
  };
  _.isSurroundedBy = function isSurroundedBy(shape_0) {
    var i;
    if (jsEquals(this.mPoint, null))
      return false;
    for (i = 0; i < this.mPoint.length; i++)
      if (!shape_0.contains_0(this.mPoint[i].x_0, this.mPoint[i].y_0))
        return false;
    return true;
  };
  _.move = function move(dx, dy) {
    var i;
    if (jsNotEquals(this.mPoint, null)) {
      for (i = 0; i < this.mPoint.length; i++) {
        this.mPoint[i].x_0 += dx;
        this.mPoint[i].y_0 += dy;
      }
    }
  };
  _.scale_0 = function scale_0(f) {
    var i;
    if (jsNotEquals(this.mPoint, null)) {
      for (i = 0; i < this.mPoint.length; i++) {
        this.mPoint[i].x_0 *= f;
        this.mPoint[i].y_0 *= f;
      }
    }
  };
  _.setDeletable = function setDeletable(d) {
    this.mProtectedFromDeletion = !d;
  };
  _.setSelected_0 = function setSelected(s) {
    this.mIsSelected = s;
  };
  _.toString_0 = function toString_3() {
    var objectString;
    objectString = new jl.StringBuffer();
    objectString.append_2(this.getDescriptor());
    return objectString.toString_0();
  };
  _.translate = function translate(x_0, y_0) {
    var i;
    if (jsNotEquals(this.mPoint, null)) {
      for (i = 0; i < this.mPoint.length; i++) {
        this.mPoint[i].x_0 = this.mTransformationValue1[i] + x_0 - this.mTransformationReferenceX;
        this.mPoint[i].y_0 = this.mTransformationValue2[i] + y_0 - this.mTransformationReferenceY;
      }
    }
  };
  _.translateInit = function translateInit(x_0, y_0) {
    var i, pointCount;
    this.mTransformationReferenceX = x_0;
    this.mTransformationReferenceY = y_0;
    if (jsNotEquals(this.mPoint, null)) {
      pointCount = this.mPoint.length;
      this.mTransformationValue1 = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, pointCount, 15, 1);
      this.mTransformationValue2 = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, pointCount, 15, 1);
      for (i = 0; i < pointCount; i++) {
        this.mTransformationValue1[i] = this.mPoint[i].x_0;
        this.mTransformationValue2[i] = this.mPoint[i].y_0;
      }
    }
  };
  _.zoomAndRotate_0 = function zoomAndRotate(zoom, angle) {
    var i, newAngle, newDistance;
    if (jsNotEquals(this.mPoint, null)) {
      for (i = 0; i < this.mPoint.length; i++) {
        newDistance = this.mTransformationValue2[i] * zoom;
        newAngle = this.mTransformationValue1[i] - angle;
        this.mPoint[i].x_0 = this.mTransformationReferenceX + newDistance * $wnd.Math.sin(newAngle);
        this.mPoint[i].y_0 = this.mTransformationReferenceY + newDistance * $wnd.Math.cos(newAngle);
      }
    }
  };
  _.zoomAndRotateInit_0 = function zoomAndRotateInit(x_0, y_0) {
    var dx, dy, i, pointCount;
    this.mTransformationReferenceX = x_0;
    this.mTransformationReferenceY = y_0;
    if (jsNotEquals(this.mPoint, null)) {
      pointCount = this.mPoint.length;
      this.mTransformationValue1 = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, pointCount, 15, 1);
      this.mTransformationValue2 = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, pointCount, 15, 1);
      for (i = 0; i < pointCount; i++) {
        dx = x_0 - this.mPoint[i].x_0;
        dy = y_0 - this.mPoint[i].y_0;
        this.mTransformationValue2[i] = $wnd.Math.sqrt(dx * dx + dy * dy);
        this.mTransformationValue1[i] = carc2.getAngle_0(x_0, y_0, this.mPoint[i].x_0, this.mPoint[i].y_0);
      }
    }
  };
  _.mIsSelected = false;
  _.mProtectedFromDeletion = false;
  _.mTransformationReferenceX = 0;
  _.mTransformationReferenceY = 0;
  carc2.DESCRIPTOR_END = "></DrawingObject>";
  carc2.DESCRIPTOR_START = "<DrawingObject";
  carc2.DESCRIPTOR_TYPE = ' type="';
  cggl.Lcom_actelion_research_chem_AbstractDrawingObject_2_classLit = createForClass("com.actelion.research.chem", "AbstractDrawingObject", 38, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_AromaticityResolver = function $clinit_AromaticityResolver() {
    carc2.$clinit_AromaticityResolver = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.AromaticityResolver = function AromaticityResolver(mol) {
    carc2.$clinit_AromaticityResolver();
    carc2.AromaticityResolver_0.call(this, mol, null);
  };
  carc2.AromaticityResolver_0 = function AromaticityResolver_0(mol, bondLength) {
    Object_0.call(this);
    this.$init_5();
    this.mMol = mol;
    this.mBondLength = bondLength;
  };
  defineClass(103, 1, { 1: 1 }, carc2.AromaticityResolver);
  _.$init_5 = function $init_5() {
  };
  _.checkAtomTypeLeak5 = function checkAtomTypeLeak5(atom, correctCharge) {
    if (this.mIsDelocalizedBridgeHead[atom])
      return 0;
    if (this.mMol.getAtomicNo_0(atom) == 7) {
      if (this.mMol.getAllConnAtoms_0(atom) == 3)
        return 6;
      else if (this.mMol.getConnAtoms_0(atom) == 2)
        return this.mAllHydrogensAreExplicit ? 0 : 4;
    } else if (this.mMol.getAtomicNo_0(atom) == 8) {
      return 10;
    } else if (this.mMol.getAtomicNo_0(atom) == 15 || this.mMol.getAtomicNo_0(atom) == 33) {
      if (this.mMol.getConnAtoms_0(atom) == 3)
        return 8;
    } else if (this.mMol.getAtomicNo_0(atom) == 16 || this.mMol.getAtomicNo_0(atom) == 34 || this.mMol.getAtomicNo_0(atom) == 52) {
      if (this.mMol.getConnAtoms_0(atom) == 2)
        return 11;
      if (this.mMol.getConnAtoms_0(atom) == 3) {
        if (this.mMol.getAtomCharge_0(atom) == 1)
          return 12;
        if (correctCharge)
          this.mMol.setAtomCharge_0(atom, 1);
        return 5;
      }
    } else if (this.mMol.getAtomicNo_0(atom) == 6) {
      if (this.mMol.getAtomCharge_0(atom) == -1)
        return this.mMol.getAllConnAtoms_0(atom) == 3 ? 16 : this.mMol.getAllConnAtomsPlusMetalBonds_0(atom) == 3 ? 15 : 14;
      if (correctCharge)
        this.mMol.setAtomCharge_0(atom, -1);
      return this.mMol.getAllConnAtoms_0(atom) != this.mMol.getAllConnAtomsPlusMetalBonds_0(atom) ? 2 : 3;
    }
    return 0;
  };
  _.checkAtomTypeLeak7 = function checkAtomTypeLeak7(atom, correctCharge) {
    if (this.mIsDelocalizedBridgeHead[atom])
      return 0;
    if (this.mAllHydrogensAreExplicit) {
      if (this.mMol.getAllConnAtoms_0(atom) != 3)
        return 0;
    } else {
      if (this.mMol.getAllConnAtoms_0(atom) > 3)
        return 0;
    }
    if (this.mMol.getAtomicNo_0(atom) == 6) {
      if (correctCharge)
        this.mMol.setAtomCharge_0(atom, 1);
      return 2;
    }
    if (this.mMol.getAtomicNo_0(atom) == 5) {
      return 4;
    }
    return 0;
  };
  _.checkAtomTypeLeakNonRing = function checkAtomTypeLeakNonRing(atom, correctCharge) {
    if (this.mMol.getAtomCharge_0(atom) != 0)
      return 0;
    if (this.mAllHydrogensAreExplicit) {
      if (this.mMol.getAtomicNo_0(atom) == 5) {
        if (this.mMol.getOccupiedValence_0(atom) != 2)
          return 0;
        if (correctCharge)
          this.mMol.setAtomCharge_0(atom, 1);
        return 1;
      }
      if (this.mMol.getAtomicNo_0(atom) == 7) {
        if (this.mMol.getOccupiedValence_0(atom) != 2)
          return 0;
        if (correctCharge)
          this.mMol.setAtomCharge_0(atom, -1);
        return this.hasMetalNeighbour(atom) ? 6 : 3;
      }
      if (this.mMol.getAtomicNo_0(atom) == 8) {
        if (this.mMol.getOccupiedValence_0(atom) != 1)
          return 0;
        if (correctCharge)
          this.mMol.setAtomCharge_0(atom, -1);
        return this.hasMetalNeighbour(atom) ? 7 : 4;
      }
      if (this.mMol.getAtomicNo_0(atom) == 16) {
        if (this.mMol.getOccupiedValence_0(atom) != 1)
          return 0;
        if (correctCharge)
          this.mMol.setAtomCharge_0(atom, -1);
        return this.hasMetalNeighbour(atom) ? 5 : 2;
      }
      if (this.mMol.getAtomicNo_0(atom) == 34) {
        if (this.mMol.getOccupiedValence_0(atom) != 1)
          return 0;
        if (correctCharge)
          this.mMol.setAtomCharge_0(atom, -1);
        return this.hasMetalNeighbour(atom) ? 4 : 1;
      }
    } else {
      if (this.mMol.getAtomicNo_0(atom) == 5) {
        if (this.mMol.getOccupiedValence_0(atom) > 2)
          return 0;
        if (correctCharge)
          this.mMol.setAtomCharge_0(atom, 1);
        return 1;
      }
      if (this.mMol.getAtomicNo_0(atom) == 7) {
        if (this.mMol.getOccupiedValence_0(atom) > 2)
          return 0;
        if (correctCharge)
          this.mMol.setAtomCharge_0(atom, -1);
        return this.hasMetalNeighbour(atom) ? 5 : 3;
      }
      if (this.mMol.getAtomicNo_0(atom) == 8) {
        if (this.mMol.getOccupiedValence_0(atom) > 1)
          return 0;
        if (correctCharge)
          this.mMol.setAtomCharge_0(atom, -1);
        return this.hasMetalNeighbour(atom) ? 7 : 4;
      }
      if (this.mMol.getAtomicNo_0(atom) == 16) {
        if (this.mMol.getOccupiedValence_0(atom) > 1)
          return 0;
        if (correctCharge)
          this.mMol.setAtomCharge_0(atom, -1);
        return this.hasMetalNeighbour(atom) ? 5 : 2;
      }
    }
    return 0;
  };
  _.checkAtomTypePi1 = function checkAtomTypePi1(atom, correctCharge) {
    var atomicNo, charge, freeValence;
    atomicNo = this.mMol.getAtomicNo_0(atom);
    if (atomicNo >= 5 && atomicNo <= 8 || atomicNo == 15 || atomicNo == 16 || atomicNo == 33 || atomicNo == 34 || atomicNo == 52) {
      freeValence = this.mMol.getLowestFreeValence_0(atom);
      if (freeValence != 0)
        return true;
      charge = this.mMol.getAtomCharge_0(atom);
      if (atomicNo == 5 && charge >= 0) {
        if (correctCharge)
          this.mMol.setAtomCharge_0(atom, charge - 1);
        return true;
      }
      if (atomicNo != 5 && charge <= 0) {
        if (correctCharge)
          this.mMol.setAtomCharge_0(atom, charge + 1);
        return true;
      }
    }
    return false;
  };
  _.connectSeparatedSingletons = function connectSeparatedSingletons() {
    var atom, bond, candidate, current, currentAtom, found, graphAtom, graphLevel, highest, i, isCompatibleBond, j, parent_0, parentAtom;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mIsDelocalizedAtom[atom]) {
        found = false;
        graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
        parentAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
        graphLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
        graphAtom[0] = atom;
        parentAtom[atom] = -1;
        graphLevel[atom] = 1;
        current = 0;
        highest = 0;
        while (current <= highest && !found) {
          currentAtom = graphAtom[current];
          for (i = 0; i < this.mMol.getConnAtoms_0(currentAtom) && !found; i++) {
            isCompatibleBond = (graphLevel[currentAtom] & 1) == 1 ^ this.mMol.getBondOrder_0(this.mMol.getConnBond_0(currentAtom, i)) > 1;
            candidate = this.mMol.getConnAtom_0(currentAtom, i);
            if (graphLevel[candidate] == 0 && isCompatibleBond) {
              if (this.mIsDelocalizedAtom[candidate]) {
                if ((graphLevel[currentAtom] & 1) == 1) {
                  this.mIsDelocalizedAtom[atom] = false;
                  this.mIsDelocalizedAtom[candidate] = false;
                  this.mPiElectronsAdded += 2;
                  parent_0 = currentAtom;
                  for (j = 0; j < graphLevel[currentAtom]; j++) {
                    bond = this.mMol.getBond_0(candidate, parent_0);
                    if (this.mIsDelocalizedBond[bond]) {
                      this.mIsDelocalizedBond[bond] = false;
                      this.mDelocalizedBonds--;
                    }
                    this.mMol.setBondOrder_0(bond, this.mMol.getBondOrder_0(bond) == 1 ? 2 : this.mMol.getBondOrder_0(bond) - 1);
                    candidate = parent_0;
                    parent_0 = parentAtom[candidate];
                  }
                  found = true;
                }
              } else {
                graphAtom[++highest] = candidate;
                parentAtom[candidate] = currentAtom;
                graphLevel[candidate] = graphLevel[currentAtom] + 1;
              }
            }
          }
          current++;
        }
      }
    }
  };
  _.hasMetalNeighbour = function hasMetalNeighbour(atom) {
    var i;
    for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++)
      if (this.mMol.isMetalAtom_0(this.mMol.getConnAtom_0(atom, i)))
        return true;
    return false;
  };
  _.initialize = function initialize(isDelocalizedBond, ringSet) {
    var atom, atom$array, atom$index, atom$max, atom0, bond, bond$array, bond$index, bond$max, bond0, bond1, delocalizedConnBonds, i, ring, ring0;
    if (jsNotEquals(isDelocalizedBond, null)) {
      this.mIsDelocalizedBond = isDelocalizedBond;
    } else {
      this.mIsDelocalizedBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 16, 1);
      for (bond0 = 0; bond0 < this.mMol.getBonds_0(); bond0++) {
        if (this.mMol.getBondType_0(bond0) == 8) {
          this.mIsDelocalizedBond[bond0] = true;
          this.mMol.setBondType_0(bond0, 1);
        }
      }
    }
    for (bond1 = 0; bond1 < this.mMol.getBonds_0(); bond1++)
      if (this.mIsDelocalizedBond[bond1])
        this.mDelocalizedBonds++;
    this.mIsDelocalizedAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    this.mIsDelocalizedBridgeHead = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
      delocalizedConnBonds = 0;
      for (i = 0; i < this.mMol.getConnAtoms_0(atom0); i++)
        if (this.mIsDelocalizedBond[this.mMol.getConnBond_0(atom0, i)])
          delocalizedConnBonds++;
      if (delocalizedConnBonds > 0) {
        this.mIsDelocalizedAtom[atom0] = true;
        this.mDelocalizedAtoms++;
        if (delocalizedConnBonds == 3)
          this.mIsDelocalizedBridgeHead[atom0] = true;
      }
    }
    this.mIsDelocalizedRing = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, ringSet.getSize_0(), 16, 1);
    for (ring0 = 0; ring0 < ringSet.getSize_0(); ring0++) {
      this.mIsDelocalizedRing[ring0] = true;
      for (bond$array = ringSet.getRingBonds_0(ring0), bond$index = 0, bond$max = bond$array.length; bond$index < bond$max; ++bond$index) {
        bond = bond$array[bond$index];
        if (!this.mIsDelocalizedBond[bond]) {
          this.mIsDelocalizedRing[ring0] = false;
          break;
        }
      }
    }
    this.mIsDelocalizedFiveRingMember = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    for (ring = 0; ring < ringSet.getSize_0(); ring++) {
      if (this.mIsDelocalizedRing[ring] && ringSet.getRingSize_0(ring) != 6) {
        for (atom$array = ringSet.getRingAtoms_0(ring), atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
          atom = atom$array[atom$index];
          if (ringSet.getRingSize_0(ring) == 5)
            this.mIsDelocalizedFiveRingMember[atom] = true;
        }
      }
    }
    this.mPiElectronsAdded = 0;
  };
  _.isAmineOxid = function isAmineOxid(atom, mayChangeAtomCharges) {
    var connAtom, i;
    for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++) {
      connAtom = this.mMol.getConnAtom_0(atom, i);
      if (this.mMol.getAtomicNo_0(connAtom) == 8 && this.mMol.getConnAtoms_0(connAtom) == 1) {
        if (mayChangeAtomCharges && this.mMol.getAtomCharge_0(connAtom) == 0)
          this.mMol.setAtomCharge_0(connAtom, -1);
        return true;
      }
    }
    return false;
  };
  _.locateDelocalizedDoubleBonds = function locateDelocalizedDoubleBonds(isAromaticBond) {
    return this.locateDelocalizedDoubleBonds_0(isAromaticBond, false, false);
  };
  _.locateDelocalizedDoubleBonds_0 = function locateDelocalizedDoubleBonds_0(isDelocalizedBond, mayChangeAtomCharges, allHydrogensAreExplicit) {
    var atom, atom0, bond, ringSet;
    this.mMol.ensureHelperArrays_0(1);
    ringSet = new carc2.RingCollection(this.mMol, 1);
    this.initialize(isDelocalizedBond, ringSet);
    if (this.mDelocalizedBonds == 0)
      return true;
    if (mayChangeAtomCharges) {
      for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++)
        if (this.mIsDelocalizedAtom[atom0] && this.mMol.getAtomicNo_0(atom0) == 7 && (this.mIsDelocalizedBridgeHead[atom0] || this.mMol.getConnAtoms_0(atom0) == 3 && !this.mIsDelocalizedFiveRingMember[atom0]))
          this.mMol.setAtomCharge_0(atom0, 1);
    }
    this.mAllHydrogensAreExplicit = allHydrogensAreExplicit;
    this.protectFullValenceAtoms(mayChangeAtomCharges);
    if (this.mMol.isFragment_0())
      this.promoteDelocalizedChains();
    this.protectObviousNonRingLeaks(ringSet);
    this.protectAmideBonds(ringSet);
    this.protectDoubleBondAtoms();
    this.promoteObviousBonds();
    while (this.promoteOuterShellDelocalizedRingSystems(ringSet, mayChangeAtomCharges))
      this.promoteObviousBonds();
    while (this.promoteSixMemberedAromaticRings(ringSet, mayChangeAtomCharges))
      this.promoteObviousBonds();
    while (this.promoteOneDelocalizationLeak(ringSet, mayChangeAtomCharges))
      this.promoteObviousBonds();
    while (this.mDelocalizedBonds != 0) {
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
        if (this.mIsDelocalizedBond[bond]) {
          this.promoteBond(bond);
          this.promoteObviousBonds();
        }
      }
    }
    if (mayChangeAtomCharges)
      this.unchargeImmoniumNHChains(mayChangeAtomCharges);
    if (this.mDelocalizedAtoms - this.mPiElectronsAdded >= 2)
      this.connectSeparatedSingletons();
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mIsDelocalizedAtom[atom] && this.mMol.getImplicitHydrogens_1(atom) != 0) {
        if (mayChangeAtomCharges && (this.mMol.getAtomCharge_0(atom) == 1 && this.mMol.isElectronegative_0(atom) || this.mMol.getAtomCharge_0(atom) == -1 && this.mMol.getAtomicNo_0(atom) == 5))
          this.mMol.setAtomCharge_0(atom, 0);
        else
          this.mMol.setAtomRadical_0(atom, 32);
        this.mPiElectronsAdded++;
      }
    }
    return this.mDelocalizedAtoms == this.mPiElectronsAdded;
  };
  _.nextIndex_0 = function nextIndex_0(i, size_0) {
    return i == size_0 - 1 ? 0 : i + 1;
  };
  _.promoteBond = function promoteBond(bond) {
    var bondAtom, connBond, i, j;
    if (this.mMol.getBondType_0(bond) == 1) {
      this.mMol.setBondType_0(bond, 2);
      this.mPiElectronsAdded += 2;
    }
    for (i = 0; i < 2; i++) {
      bondAtom = this.mMol.getBondAtom_0(i, bond);
      this.mIsDelocalizedAtom[bondAtom] = false;
      for (j = 0; j < this.mMol.getConnAtoms_0(bondAtom); j++) {
        connBond = this.mMol.getConnBond_0(bondAtom, j);
        if (this.mIsDelocalizedBond[connBond]) {
          this.mIsDelocalizedBond[connBond] = false;
          this.mDelocalizedBonds--;
        }
      }
    }
  };
  _.promoteDelocalizedChains = function promoteDelocalizedChains() {
    var aromaticNeighbourFound, bond, bridgeAtom, i, j, j0, terminalAtom, terminalBond;
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      if (this.mIsDelocalizedBond[bond]) {
        for (i = 0; i < 2; i++) {
          terminalAtom = this.mMol.getBondAtom_0(i, bond);
          aromaticNeighbourFound = false;
          for (j0 = 0; j0 < this.mMol.getConnAtoms_0(terminalAtom); j0++) {
            if (bond != this.mMol.getConnBond_0(terminalAtom, j0) && this.mIsDelocalizedBond[this.mMol.getConnBond_0(terminalAtom, j0)]) {
              aromaticNeighbourFound = true;
              break;
            }
          }
          if (!aromaticNeighbourFound) {
            terminalBond = bond;
            bridgeAtom = this.mMol.getBondAtom_0(1 - i, bond);
            while (terminalBond != -1) {
              this.mIsDelocalizedAtom[terminalAtom] = false;
              this.mIsDelocalizedBond[terminalBond] = false;
              this.mDelocalizedBonds--;
              this.mMol.setBondType_0(terminalBond, 8);
              terminalBond = -1;
              terminalAtom = bridgeAtom;
              for (j = 0; j < this.mMol.getConnAtoms_0(terminalAtom); j++) {
                if (this.mIsDelocalizedBond[this.mMol.getConnBond_0(terminalAtom, j)]) {
                  if (terminalBond == -1) {
                    terminalBond = this.mMol.getConnBond_0(terminalAtom, j);
                    bridgeAtom = this.mMol.getConnAtom_0(terminalAtom, j);
                  } else {
                    terminalAtom = -1;
                    terminalBond = -1;
                    break;
                  }
                }
              }
            }
            if (terminalAtom != -1)
              this.mIsDelocalizedAtom[bridgeAtom] = false;
            break;
          }
        }
      }
    }
  };
  _.promoteObviousBonds = function promoteObviousBonds() {
    var aromaticNeighbourFound, bond, bondAtom, i, isTerminalAromaticBond, j, terminalAromaticBondFound;
    do {
      terminalAromaticBondFound = false;
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
        if (this.mIsDelocalizedBond[bond]) {
          isTerminalAromaticBond = false;
          for (i = 0; i < 2; i++) {
            bondAtom = this.mMol.getBondAtom_0(i, bond);
            aromaticNeighbourFound = false;
            for (j = 0; j < this.mMol.getConnAtoms_0(bondAtom); j++) {
              if (bond != this.mMol.getConnBond_0(bondAtom, j) && this.mIsDelocalizedBond[this.mMol.getConnBond_0(bondAtom, j)]) {
                aromaticNeighbourFound = true;
                break;
              }
            }
            if (!aromaticNeighbourFound) {
              isTerminalAromaticBond = true;
              break;
            }
          }
          if (isTerminalAromaticBond) {
            terminalAromaticBondFound = true;
            this.promoteBond(bond);
          }
        }
      }
    } while (terminalAromaticBondFound);
  };
  _.promoteOneDelocalizationLeak = function promoteOneDelocalizationLeak(ringSet, mayChangeAtomCharges) {
    var atom, atom$array, atom$index, atom$max, bestBondLengthSum, bestDelocalizationLeakIndex, bestDelocalizationLeakPriority, bondLengthSum, i, i0, isFullyDelocalizedRing, leakAtom, priority, ring, ringAtom, ringBond;
    for (ring = 0; ring < ringSet.getSize_0(); ring++) {
      if (ringSet.getRingSize_0(ring) != 6 && this.mIsDelocalizedRing[ring]) {
        isFullyDelocalizedRing = true;
        ringBond = ringSet.getRingBonds_0(ring);
        for (i0 = 0; i0 < ringBond.length; i0++) {
          if (!this.mIsDelocalizedBond[ringBond[i0]]) {
            isFullyDelocalizedRing = false;
            break;
          }
        }
        if (isFullyDelocalizedRing) {
          bestDelocalizationLeakIndex = -1;
          bestDelocalizationLeakPriority = 0;
          bestBondLengthSum = 0;
          ringAtom = ringSet.getRingAtoms_0(ring);
          for (i = 0; i < ringAtom.length; i++) {
            atom = ringAtom[i];
            bondLengthSum = jsEquals(this.mBondLength, null) ? 0 : this.mBondLength[ringBond[i]] + this.mBondLength[ringBond[(i == 0 ? ringAtom.length : i) - 1]];
            priority = this.mIsDelocalizedFiveRingMember[atom] ? this.checkAtomTypeLeak5(atom, false) : this.checkAtomTypeLeak7(atom, false);
            if (bestDelocalizationLeakPriority < priority) {
              bestDelocalizationLeakPriority = priority;
              bestDelocalizationLeakIndex = i;
              if (jsNotEquals(this.mBondLength, null))
                bestBondLengthSum = bondLengthSum;
            } else if (bestDelocalizationLeakPriority == priority && jsNotEquals(this.mBondLength, null)) {
              if (bestBondLengthSum < bondLengthSum) {
                bestDelocalizationLeakIndex = i;
                bestBondLengthSum = bondLengthSum;
              }
            }
          }
          if (bestDelocalizationLeakIndex != -1) {
            leakAtom = ringAtom[bestDelocalizationLeakIndex];
            if (mayChangeAtomCharges) {
              for (atom$array = ringAtom, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
                atom = atom$array[atom$index];
                if (atom != leakAtom)
                  this.checkAtomTypePi1(atom, true);
              }
              if (this.mIsDelocalizedFiveRingMember[leakAtom])
                this.checkAtomTypeLeak5(leakAtom, true);
              else
                this.checkAtomTypeLeak7(leakAtom, true);
            }
            this.protectAtom(leakAtom);
            if (this.mIsDelocalizedFiveRingMember[leakAtom])
              this.protectIfIsHeme(ringAtom, ringBond, bestDelocalizationLeakIndex);
            return true;
          }
        }
      }
    }
    return false;
  };
  _.promoteOuterShellDelocalizedRingSystems = function promoteOuterShellDelocalizedRingSystems(ringSet, mayChangeAtomCharges) {
    var bridgeBonds, delocalizedBonds, first, found, i, i0, incompatibleAtomFound, index_0, isDelocalized, j, next, r, r0, ringAtom, ringBond, sharedDelocalizedRingCount;
    sharedDelocalizedRingCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 15, 1);
    for (r0 = 0; r0 < ringSet.getSize_0(); r0++) {
      ringBond = ringSet.getRingBonds_0(r0);
      isDelocalized = true;
      for (i0 = 0; i0 < ringBond.length; i0++) {
        if (!this.mIsDelocalizedBond[ringBond[i0]]) {
          isDelocalized = false;
          break;
        }
      }
      if (isDelocalized)
        for (i = 0; i < ringBond.length; i++)
          sharedDelocalizedRingCount[ringBond[i]]++;
    }
    delocalizedBonds = this.mDelocalizedBonds;
    for (r = 0; r < ringSet.getSize_0(); r++) {
      found = false;
      ringAtom = ringSet.getRingAtoms_0(r);
      ringBond = ringSet.getRingBonds_0(r);
      for (i = 0; i < ringBond.length && !found; i++) {
        if (sharedDelocalizedRingCount[ringBond[i]] > 1) {
          first = this.nextIndex_0(i, ringBond.length);
          if (sharedDelocalizedRingCount[ringBond[first]] == 1) {
            incompatibleAtomFound = false;
            next = this.nextIndex_0(first, ringBond.length);
            while (sharedDelocalizedRingCount[ringBond[next]] == 1) {
              if (!this.checkAtomTypePi1(ringAtom[next], false) || ringBond.length != 6 && this.mMol.getAtomicNo_0(ringAtom[next]) != 6)
                incompatibleAtomFound = true;
              next = this.nextIndex_0(next, ringBond.length);
            }
            if (!incompatibleAtomFound) {
              bridgeBonds = next > first ? next - first : next + ringBond.length - first;
              if (bridgeBonds > 2 && (bridgeBonds & 1) == 1) {
                for (j = 1; j < bridgeBonds; j += 2) {
                  index_0 = first + j < ringBond.length ? first + j : first + j - ringBond.length;
                  if (mayChangeAtomCharges) {
                    this.checkAtomTypePi1(ringAtom[index_0], true);
                    this.checkAtomTypePi1(ringAtom[index_0 == ringAtom.length - 1 ? 0 : index_0 + 1], true);
                  }
                  this.promoteBond(ringBond[index_0]);
                }
                found = true;
              }
            }
          }
        }
      }
    }
    return delocalizedBonds != this.mDelocalizedBonds;
  };
  _.promoteSixMemberedAromaticRings = function promoteSixMemberedAromaticRings(ringSet, mayChangeAtomCharges) {
    var found, i, i0, i1, isQualifyingRing, ring, ringAtom, ringBond;
    found = false;
    for (ring = 0; ring < ringSet.getSize_0(); ring++) {
      if (ringSet.getRingSize_0(ring) == 6) {
        isQualifyingRing = true;
        ringAtom = ringSet.getRingAtoms_0(ring);
        ringBond = ringSet.getRingBonds_0(ring);
        for (i0 = 0; i0 < 6; i0++) {
          if (!this.checkAtomTypePi1(ringAtom[i0], false) || !this.mIsDelocalizedBond[ringBond[i0]]) {
            isQualifyingRing = false;
            break;
          }
        }
        if (isQualifyingRing) {
          if (mayChangeAtomCharges)
            for (i1 = 0; i1 < 6; i1++)
              this.checkAtomTypePi1(ringAtom[i1], true);
          for (i = 0; i < 6; i += 2)
            this.promoteBond(ringBond[i]);
          found = true;
          break;
        }
      }
    }
    return found;
  };
  _.protectAmideBonds = function protectAmideBonds(ringSet) {
    var bond;
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      if (this.mIsDelocalizedBond[bond] && ringSet.qualifiesAsAmideTypeBond_0(bond)) {
        this.protectAtom(this.mMol.getBondAtom_0(0, bond));
        this.protectAtom(this.mMol.getBondAtom_0(1, bond));
      }
    }
  };
  _.protectAtom = function protectAtom(atom) {
    var connBond, i;
    if (this.mIsDelocalizedAtom[atom]) {
      this.mIsDelocalizedAtom[atom] = false;
      this.mDelocalizedAtoms--;
    }
    for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++) {
      connBond = this.mMol.getConnBond_0(atom, i);
      if (this.mIsDelocalizedBond[connBond]) {
        this.mIsDelocalizedBond[connBond] = false;
        this.mDelocalizedBonds--;
      }
    }
  };
  _.protectDoubleBondAtoms = function protectDoubleBondAtoms() {
    var atom, bond, connBond, i, j;
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      if (this.mMol.getBondOrder_0(bond) == 2) {
        for (i = 0; i < 2; i++) {
          atom = this.mMol.getBondAtom_0(i, bond);
          if (this.mMol.getAtomicNo_0(atom) <= 8) {
            for (j = 0; j < this.mMol.getConnAtoms_0(atom); j++) {
              connBond = this.mMol.getConnBond_0(atom, j);
              if (this.mIsDelocalizedBond[connBond]) {
                this.protectAtom(atom);
                break;
              }
            }
          }
        }
      }
    }
  };
  _.protectFullValenceAtoms = function protectFullValenceAtoms(mayChangeAtomCharges) {
    var atom;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++)
      if (this.mIsDelocalizedAtom[atom] && this.mMol.getLowestFreeValence_0(atom) == 0 && (!mayChangeAtomCharges || this.mMol.getAtomicNo_0(atom) == 5 && this.mMol.getAtomCharge_0(atom) < 0 || (this.mMol.getAtomicNo_0(atom) == 6 || this.mMol.getAtomicNo_0(atom) == 14) || this.mMol.isElectronegative_0(atom) && this.mMol.getAtomCharge_0(atom) > 0))
        this.protectAtom(atom);
  };
  _.protectIfIsHeme = function protectIfIsHeme(ringAtom, ringBond, leakIndex) {
    var bond, bond$array, bond$index, bond$max, bond0, i, i0, leftAtom, neglectBond, pathAtom, pathLen, qualifies, rightAtom;
    leftAtom = ringAtom[leakIndex == 0 ? 4 : leakIndex - 1];
    rightAtom = ringAtom[leakIndex == 4 ? 0 : leakIndex + 1];
    if (this.mMol.getConnAtoms_0(leftAtom) == 3 && this.mMol.getConnAtoms_0(rightAtom) == 3) {
      pathAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
      neglectBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 16, 1);
      for (bond$array = ringBond, bond$index = 0, bond$max = bond$array.length; bond$index < bond$max; ++bond$index) {
        bond0 = bond$array[bond$index];
        neglectBond[bond0] = true;
      }
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++)
        if (!this.mIsDelocalizedBond[bond])
          neglectBond[bond] = true;
      pathLen = this.mMol.getPath_0(pathAtom, leftAtom, rightAtom, 14, neglectBond);
      if (pathLen == 14) {
        qualifies = true;
        for (i0 = 2; i0 <= 12; i0++) {
          if ((i0 & 3) != 1 ^ this.mMol.getAtomRingSize_0(pathAtom[i0]) == 5) {
            qualifies = false;
            break;
          }
        }
        if (qualifies) {
          this.protectAtom(pathAtom[7]);
          for (i = 1; i <= 5; i += 2) {
            this.promoteBond(this.mMol.getBond_0(pathAtom[i], pathAtom[i + 1]));
            this.promoteBond(this.mMol.getBond_0(pathAtom[i + 7], pathAtom[i + 8]));
          }
        }
      }
    }
  };
  _.protectObviousNonRingLeaks = function protectObviousNonRingLeaks(ringSet) {
    var atom, atom$array, atom$index, atom$max, atom1, atom2, atomHandled, bond, candidate, current, delocalizedNeighbourCount, graphAtom, hasMetalLigandBond, highest, i, i0, i1, isAromaticRingAtom, isPossible, j, maxAtom, maxPriority, priority, ring, ringSize, seedAtom, seedAtom0;
    isAromaticRingAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    for (ring = 0; ring < ringSet.getSize_0(); ring++) {
      ringSize = ringSet.getRingSize_0(ring);
      if (ringSize == 3 || ringSize == 5 || ringSize == 6 || ringSize == 7) {
        if (this.mIsDelocalizedRing[ring]) {
          for (atom$array = ringSet.getRingAtoms_0(ring), atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
            atom = atom$array[atom$index];
            isAromaticRingAtom[atom] = true;
          }
        }
      }
    }
    delocalizedNeighbourCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    hasMetalLigandBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      atom1 = this.mMol.getBondAtom_0(0, bond);
      atom2 = this.mMol.getBondAtom_0(1, bond);
      if (!isAromaticRingAtom[atom1] && !isAromaticRingAtom[atom2]) {
        if (this.mIsDelocalizedBond[bond]) {
          delocalizedNeighbourCount[atom1]++;
          delocalizedNeighbourCount[atom2]++;
        }
        if (this.mMol.getBondType_0(bond) == 16) {
          hasMetalLigandBond[atom1] = true;
          hasMetalLigandBond[atom2] = true;
        }
      }
    }
    priority = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    for (seedAtom0 = 0; seedAtom0 < this.mMol.getAtoms_0(); seedAtom0++) {
      if (delocalizedNeighbourCount[seedAtom0] == 1) {
        graphAtom[0] = seedAtom0;
        current = 0;
        highest = 0;
        while (current <= highest) {
          for (i = 0; i < this.mMol.getConnAtoms_0(graphAtom[current]); i++) {
            if (this.mIsDelocalizedBond[this.mMol.getConnBond_0(graphAtom[current], i)]) {
              candidate = this.mMol.getConnAtom_0(graphAtom[current], i);
              if ((current == 0 || candidate != graphAtom[current - 1]) && delocalizedNeighbourCount[candidate] != 0) {
                graphAtom[++highest] = candidate;
                if ((delocalizedNeighbourCount[candidate] & 1) != 0) {
                  for (j = 1; j < highest; j += 2)
                    priority[graphAtom[j]] = -1;
                  highest = 0;
                }
                break;
              }
            }
          }
          current++;
        }
      }
    }
    atomHandled = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    for (seedAtom = 0; seedAtom < this.mMol.getAtoms_0(); seedAtom++) {
      if (!atomHandled[seedAtom] && delocalizedNeighbourCount[seedAtom] != 0) {
        graphAtom[0] = seedAtom;
        atomHandled[seedAtom] = true;
        current = 0;
        highest = 0;
        while (current <= highest) {
          for (i = 0; i < this.mMol.getConnAtoms_0(graphAtom[current]); i++) {
            if (this.mIsDelocalizedBond[this.mMol.getConnBond_0(graphAtom[current], i)]) {
              candidate = this.mMol.getConnAtom_0(graphAtom[current], i);
              if (!atomHandled[candidate]) {
                graphAtom[++highest] = candidate;
                atomHandled[candidate] = true;
              }
            }
          }
          current++;
        }
        if ((highest & 1) == 0) {
          for (i0 = 0; i0 <= highest; i0++)
            if (priority[graphAtom[i0]] == 0)
              priority[graphAtom[i0]] = this.checkAtomTypeLeakNonRing(graphAtom[i0], false);
          isPossible = true;
          for (i1 = 0; i1 <= highest; i1++) {
            if (priority[graphAtom[i1]] <= 0) {
              if (!this.checkAtomTypePi1(graphAtom[i1], false)) {
                isPossible = false;
                break;
              }
            }
          }
          if (isPossible) {
            maxPriority = 0;
            maxAtom = -1;
            for (i = 0; i <= highest; i++) {
              if (maxPriority < priority[graphAtom[i]]) {
                maxPriority = priority[graphAtom[i]];
                maxAtom = graphAtom[i];
              }
            }
            if (maxPriority > 0) {
              this.checkAtomTypeLeakNonRing(maxAtom, true);
              this.protectAtom(maxAtom);
            }
          }
        }
      }
    }
  };
  _.unchargeImmoniumNHChains = function unchargeImmoniumNHChains(mayChangeAtomCharges) {
    var atom, bond, candidate, current, currentAtom, found, graphAtom, graphLevel, highest, i, isCompatibleBond, j, parent_0, parentAtom;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      this.mMol.ensureHelperArrays_0(1);
      if (this.mMol.getAtomicNo_0(atom) == 7 && this.mMol.getAtomCharge_0(atom) == 1 && this.mMol.getAtomPi_0(atom) == 1 && !this.isAmineOxid(atom, mayChangeAtomCharges)) {
        found = false;
        graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
        parentAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
        graphLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
        graphAtom[0] = atom;
        parentAtom[atom] = -1;
        graphLevel[atom] = 1;
        current = 0;
        highest = 0;
        while (current <= highest && !found) {
          currentAtom = graphAtom[current];
          for (i = 0; i < this.mMol.getConnAtoms_0(currentAtom) && !found; i++) {
            isCompatibleBond = (graphLevel[currentAtom] & 1) == 0 ^ this.mMol.getBondOrder_0(this.mMol.getConnBond_0(currentAtom, i)) > 1;
            candidate = this.mMol.getConnAtom_0(currentAtom, i);
            if (graphLevel[candidate] == 0 && isCompatibleBond) {
              if (this.mMol.getAtomicNo_0(candidate) == 7 && this.mMol.getAtomPi_0(candidate) == 0 && this.mMol.getConnAtoms_0(candidate) == 2) {
                if ((graphLevel[currentAtom] & 1) == 0) {
                  this.mMol.setAtomCharge_0(atom, 0);
                  parent_0 = currentAtom;
                  for (j = 0; j < graphLevel[currentAtom]; j++) {
                    bond = this.mMol.getBond_0(candidate, parent_0);
                    this.mMol.setBondOrder_0(bond, this.mMol.getBondOrder_0(bond) == 1 ? 2 : this.mMol.getBondOrder_0(bond) - 1);
                    candidate = parent_0;
                    parent_0 = parentAtom[candidate];
                  }
                  found = true;
                }
              } else {
                graphAtom[++highest] = candidate;
                parentAtom[candidate] = currentAtom;
                graphLevel[candidate] = graphLevel[currentAtom] + 1;
              }
            }
          }
          current++;
        }
      }
    }
  };
  _.mAllHydrogensAreExplicit = false;
  _.mDelocalizedAtoms = 0;
  _.mDelocalizedBonds = 0;
  _.mPiElectronsAdded = 0;
  cggl.Lcom_actelion_research_chem_AromaticityResolver_2_classLit = createForClass("com.actelion.research.chem", "AromaticityResolver", 103, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_AtomFunctionAnalyzer = function $clinit_AtomFunctionAnalyzer() {
    carc2.$clinit_AtomFunctionAnalyzer = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.getFakeOxoCount = function getFakeOxoCount(mol, atom) {
    var count, i;
    count = 0;
    for (i = 0; i < mol.getConnAtoms_0(atom); i++)
      if (mol.getConnBondOrder_0(atom, i) == 2 && (mol.getAtomicNo_0(mol.getConnAtom_0(atom, i)) == 7 || mol.getAtomicNo_0(mol.getConnAtom_0(atom, i)) == 8 || mol.getAtomicNo_0(mol.getConnAtom_0(atom, i)) == 16))
        count++;
    return count;
  };
  carc2.hasUnbalancedAtomCharge = function hasUnbalancedAtomCharge(mol, atom) {
    carc2.$clinit_AtomFunctionAnalyzer();
    var chargeCenterAtom, i, indexAtom, nConnected, sumChargeConnectedAtoms, unbalanced;
    if (mol.getAtomCharge_0(atom) == 0) {
      return false;
    }
    unbalanced = true;
    chargeCenterAtom = mol.getAtomCharge_0(atom);
    nConnected = mol.getConnAtoms_0(atom);
    sumChargeConnectedAtoms = 0;
    for (i = 0; i < nConnected; i++) {
      indexAtom = mol.getConnAtom_0(atom, i);
      sumChargeConnectedAtoms += mol.getAtomCharge_0(indexAtom);
    }
    if ($wnd.Math.abs(chargeCenterAtom) <= $wnd.Math.abs(sumChargeConnectedAtoms)) {
      if (jl.signum_3(chargeCenterAtom) != jl.signum_3(sumChargeConnectedAtoms)) {
        unbalanced = false;
      }
    }
    return unbalanced;
  };
  carc2.isAcidicOxygen = function isAcidicOxygen(mol, atom) {
    carc2.$clinit_AtomFunctionAnalyzer();
    return carc2.isAcidicOxygen_0(mol, atom, true);
  };
  carc2.isAcidicOxygen_0 = function isAcidicOxygen_0(mol, atom, considerCharge) {
    var connAtom, i, indexAtom, indexBond, nConnected2C, nConnected2S, nDoubleBondedO2S;
    if (mol.getAtomicNo_0(atom) != 8 || considerCharge && mol.getAtomCharge_0(atom) != 0 || mol.getConnAtoms_0(atom) != 1 || mol.getConnBondOrder_0(atom, 0) != 1)
      return false;
    connAtom = mol.getConnAtom_0(atom, 0);
    if (mol.getAtomicNo_0(connAtom) == 6) {
      nConnected2C = mol.getConnAtoms_0(connAtom);
      for (i = 0; i < nConnected2C; i++) {
        indexAtom = mol.getConnAtom_0(connAtom, i);
        if (indexAtom == atom) {
          continue;
        }
        if (mol.getAtomicNo_0(indexAtom) != 8) {
          continue;
        }
        indexBond = mol.getBond_0(connAtom, indexAtom);
        if (mol.getBondType_0(indexBond) == 2)
          return true;
      }
    } else if (mol.getAtomicNo_0(connAtom) == 7) {
      if (mol.getAtomCharge_0(connAtom) == 1)
        return true;
    } else if (mol.getAtomicNo_0(connAtom) == 16) {
      nConnected2S = mol.getConnAtoms_0(connAtom);
      nDoubleBondedO2S = 0;
      for (i = 0; i < nConnected2S; i++) {
        indexAtom = mol.getConnAtom_0(connAtom, i);
        if (indexAtom == atom)
          continue;
        if (mol.getAtomicNo_0(indexAtom) != 8)
          continue;
        indexBond = mol.getBond_0(connAtom, indexAtom);
        if (mol.getBondType_0(indexBond) == 2)
          nDoubleBondedO2S++;
      }
      if (nDoubleBondedO2S == 2)
        return true;
    } else if (carc2.isAcidicOxygenAtPhosphoricAcid(mol, atom, considerCharge))
      return true;
    return false;
  };
  carc2.isAcidicOxygenAtPhosphoricAcid = function isAcidicOxygenAtPhosphoricAcid(mol, atom, considerCharge) {
    var connAtom, i, indexAtom, indexBond, nConnected2P;
    if (mol.getAtomicNo_0(atom) != 8)
      return false;
    if (mol.getConnAtoms_0(atom) != 1)
      return false;
    connAtom = mol.getConnAtom_0(atom, 0);
    if (mol.getAtomicNo_0(connAtom) == 15) {
      nConnected2P = mol.getConnAtoms_0(connAtom);
      for (i = 0; i < nConnected2P; i++) {
        indexAtom = mol.getConnAtom_0(connAtom, i);
        if (indexAtom == atom)
          continue;
        if (mol.getAtomicNo_0(indexAtom) != 8)
          continue;
        indexBond = mol.getBond_0(connAtom, indexAtom);
        if (mol.getBondType_0(indexBond) == 2)
          return true;
      }
    }
    return false;
  };
  carc2.isBasicNitrogen = function isBasicNitrogen(mol, atom) {
    carc2.$clinit_AtomFunctionAnalyzer();
    return carc2.isBasicNitrogen_0(mol, atom, true);
  };
  carc2.isBasicNitrogen_0 = function isBasicNitrogen_0(mol, atom, considerCharge) {
    var aromaticNeighborCount, conn, enablerCount, exoCyclicAtom, exoCyclicBond, i, i0, i1, i2, i3, imineC, j, j0, mi, nIndex, opi, r, ratom, rc, ring, s, supporterCount;
    if (mol.getAtomicNo_0(atom) != 7 || considerCharge && mol.getAtomCharge_0(atom) != 0 || mol.getConnAtoms_0(atom) + mol.getAtomPi_0(atom) > 3)
      return false;
    if (mol.isAromaticAtom_0(atom)) {
      if (mol.getAtomPi_0(atom) != 1)
        return false;
      if (mol.getAtomRingCount_0(atom, 7) != 1)
        return false;
      rc = mol.getRingSet_0();
      for (r = 0; r < rc.getSize_0(); r++) {
        if (rc.isAtomMember_0(r, atom)) {
          if (rc.getRingSize_0(r) == 5 || rc.getRingSize_0(r) == 6) {
            ring = rc.getRingAtoms_0(r);
            nIndex = -1;
            for (i0 = 0; i0 < ring.length; i0++) {
              if (ring[i0] == atom) {
                nIndex = i0;
                break;
              }
            }
            enablerCount = 0;
            opi = null;
            mi = null;
            if (ring.length == 5) {
              opi = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
              opi[0] = ring[nIndex - 1 < 0 ? nIndex + 4 : nIndex - 1];
              opi[1] = ring[nIndex - 4 < 0 ? nIndex + 1 : nIndex - 4];
              mi = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
              mi[0] = ring[nIndex - 2 < 0 ? nIndex + 3 : nIndex - 2];
              mi[1] = ring[nIndex - 3 < 0 ? nIndex + 2 : nIndex - 3];
            }
            if (ring.length == 6) {
              opi = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
              opi[0] = ring[nIndex - 1 < 0 ? nIndex + 5 : nIndex - 1];
              opi[1] = ring[nIndex - 3 < 0 ? nIndex + 3 : nIndex - 3];
              opi[2] = ring[nIndex - 5 < 0 ? nIndex + 1 : nIndex - 5];
              mi = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
              mi[0] = ring[nIndex - 2 < 0 ? nIndex + 4 : nIndex - 2];
              mi[1] = ring[nIndex - 4 < 0 ? nIndex + 2 : nIndex - 4];
            }
            for (i1 = 0; i1 < ring.length; i1++)
              if (atom != ring[i1] && mol.getAtomicNo_0(ring[i1]) == 7 && mol.getAtomPi_0(ring[i1]) == 1)
                enablerCount--;
            for (i2 = 0; i2 < opi.length; i2++) {
              exoCyclicAtom = -1;
              exoCyclicBond = -1;
              for (j0 = 0; j0 < mol.getConnAtoms_0(opi[i2]); j0++) {
                if (!mol.isAromaticBond_0(mol.getConnBond_0(opi[i2], j0))) {
                  exoCyclicAtom = mol.getConnAtom_0(opi[i2], j0);
                  exoCyclicBond = mol.getConnBond_0(opi[i2], j0);
                  break;
                }
              }
              if (exoCyclicAtom != -1) {
                if (mol.getAtomicNo_0(exoCyclicAtom) == 7 && mol.getAtomPi_0(exoCyclicAtom) == 0 && mol.getConnAtoms_0(exoCyclicAtom) + mol.getAtomPi_0(exoCyclicAtom) <= 3 && !carc2.isStabilized_0(mol, exoCyclicAtom, false)) {
                  enablerCount++;
                  continue;
                }
                if (mol.getAtomicNo_0(exoCyclicAtom) == 8 && mol.getConnAtoms_0(exoCyclicAtom) == 1) {
                  enablerCount += 2;
                  continue;
                }
                if (mol.isAromaticBond_0(exoCyclicBond)) {
                  for (s = 0; s < rc.getSize_0(); s++) {
                    if (rc.isAromatic_0(s) && rc.isAtomMember_0(s, exoCyclicAtom)) {
                      ratom = rc.getRingAtoms_0(s);
                      for (j = 0; j < ratom.length; j++) {
                        if (mol.getAtomicNo_0(ratom[j]) == 7 && mol.getAtomPi_0(ratom[j]) == 1) {
                          enablerCount--;
                          break;
                        }
                      }
                      break;
                    }
                  }
                }
              }
            }
            for (i3 = 0; i3 < mi.length; i3++) {
              exoCyclicAtom = -1;
              for (j = 0; j < mol.getConnAtoms_0(mi[i3]); j++)
                if (!mol.isAromaticBond_0(mol.getConnBond_0(mi[i3], j)))
                  exoCyclicAtom = mol.getConnAtom_0(mi[i3], j);
              if (mol.getAtomicNo_0(mi[i3]) == 6) {
                if (exoCyclicAtom != -1 && carc2.getFakeOxoCount(mol, exoCyclicAtom) != 0)
                  enablerCount--;
              } else if (mol.getAtomicNo_0(mi[i3]) == 7) {
                if (mol.getAtomPi_0(mi[i3]) == 0 && (exoCyclicAtom == -1 || !mol.isAromaticAtom_0(exoCyclicAtom) && carc2.getFakeOxoCount(mol, exoCyclicAtom) == 0))
                  enablerCount++;
              }
            }
            return enablerCount > 0;
          }
          break;
        }
      }
      return false;
    }
    if (mol.getAtomPi_0(atom) > 1)
      return false;
    if (mol.getAtomPi_0(atom) == 1) {
      imineC = -1;
      supporterCount = 0;
      for (i0 = 0; i0 < mol.getConnAtoms_0(atom); i0++) {
        conn = mol.getConnAtom_0(atom, i0);
        if (mol.getConnBondOrder_0(atom, i0) == 2) {
          if (mol.getAtomicNo_0(conn) != 6)
            return false;
          imineC = conn;
          continue;
        }
        if (mol.getAtomicNo_0(conn) == 8)
          return false;
        if (mol.getAtomicNo_0(conn) == 7) {
          supporterCount--;
          if (carc2.isStabilized_0(mol, conn, false))
            supporterCount--;
          continue;
        }
        if (mol.isAromaticAtom_0(conn))
          supporterCount--;
      }
      if (imineC == -1)
        return false;
      aromaticNeighborCount = 0;
      for (i1 = 0; i1 < mol.getConnAtoms_0(imineC); i1++) {
        if (mol.getConnBondOrder_0(imineC, i1) == 1) {
          conn = mol.getConnAtom_0(imineC, i1);
          if (carc2.getFakeOxoCount(mol, conn) != 0)
            return false;
          if (mol.isAromaticAtom_0(conn))
            aromaticNeighborCount++;
          if (mol.getAtomicNo_0(conn) == 7 && !carc2.isStabilized_0(mol, conn, true))
            supporterCount++;
          if (mol.getAtomicNo_0(conn) == 8 || mol.getAtomicNo_0(conn) == 16)
            supporterCount--;
        }
      }
      if (aromaticNeighborCount == 2)
        supporterCount--;
      return supporterCount >= 0;
    }
    for (i = 0; i < mol.getConnAtoms_0(atom); i++) {
      conn = mol.getConnAtom_0(atom, i);
      if (mol.isAromaticAtom_0(conn))
        return false;
      if (mol.getAtomicNo_0(conn) != 6)
        return false;
      if (carc2.getFakeOxoCount(mol, conn) != 0)
        return false;
      if (mol.getAtomPi_0(conn) != 0 && carc2.isVinylogFakeOxo(mol, conn))
        return false;
    }
    return true;
  };
  carc2.isStabilized_0 = function isStabilized_0(mol, atom, twice) {
    var aleadyFound, conn, i;
    aleadyFound = false;
    for (i = 0; i < mol.getConnAtoms_0(atom); i++) {
      if (!mol.isAromaticBond_0(mol.getConnBond_0(atom, i)) && mol.getConnBondOrder_0(atom, i) == 1) {
        conn = mol.getConnAtom_0(atom, i);
        if (!mol.isAromaticAtom_0(conn) && (mol.getAtomicNo_0(conn) == 6 && carc2.getFakeOxoCount(mol, conn) == 1 || mol.getAtomicNo_0(conn) == 16 && carc2.getFakeOxoCount(mol, conn) == 2)) {
          if (aleadyFound || !twice)
            return true;
          aleadyFound = true;
        }
      }
    }
    return false;
  };
  carc2.isVinylogFakeOxo = function isVinylogFakeOxo(mol, atom) {
    var conn, i, j;
    for (i = 0; i < mol.getConnAtoms_0(atom); i++) {
      if (mol.getConnBondOrder_0(atom, i) != 1) {
        conn = mol.getConnAtom_0(atom, i);
        for (j = 0; j < mol.getConnAtoms_0(conn); j++)
          if (mol.getConnBondOrder_0(conn, j) == 1 && carc2.getFakeOxoCount(mol, mol.getConnAtom_0(conn, j)) != 0)
            return true;
      }
    }
    return false;
  };
  defineClass(762, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_AtomFunctionAnalyzer_2_classLit = createForClass("com.actelion.research.chem", "AtomFunctionAnalyzer", 762, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_AtomTypeCalculator = function $clinit_AtomTypeCalculator() {
    carc2.$clinit_AtomTypeCalculator = emptyMethod;
    jl.$clinit_Object();
    carc2.cAtomicNoCode = stampJavaTypeInfo(getClassLiteralForArray(cggl.S_classLit, 1), { 4: 1, 1: 1, 13: 1 }, 5, 15, [-1, -1, -1, 0, 0, 1, 2, 3, 4, 5, -1, 0, 0, 0, 6, 7, 8, 9, -1, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 1, 11, 11, 12, 13, -1, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 11, 14, -1, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 10, 10, 10, 10, 10, 10, 10, 10, 1, 1, 1, 1, -1, -1, -1, -1, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]);
    carc2.cSimpleAtomicNoCode = stampJavaTypeInfo(getClassLiteralForArray(cggl.S_classLit, 1), { 4: 1, 1: 1, 13: 1 }, 5, 15, [-1, -1, -1, 0, 0, 0, 2, 5, 5, 5, -1, 0, 0, 0, 0, 9, 9, 9, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]);
    carc2.cAtomicNoCodeString = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["MainGroupMetal", "Boron", "Carbon", "Nitrogen", "Oxygen", "Fluor", "Silicon", "Phosphorous", "Sulfur", "Chlorine", "Transition Metal", "MainGroupNonMetal", "Selene", "Bromine", "Iodine", "LanthanideOrActinide"]);
    carc2.cSimpleAtomicNoCodeString = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Metal", "-", "Carbon", "-", "-", "Small Hetero", "-", "-", "-", "Large Hetero", "-", "-", "-", "-", "-", "-"]);
  };
  carc2.getAtomType = function getAtomType(mol, atom, mode) {
    carc2.$clinit_AtomTypeCalculator();
    var atomType, connAtom, connBondOrder, connType, i, i0, i1, index_0, j, neighbourCount, neighbourType, otherNeighbours, ringCount, ringSize;
    mol.ensureHelperArrays_0(7);
    neighbourType = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, mol.getConnAtoms_0(atom), 14, 1);
    neighbourCount = 0;
    for (i0 = 0; i0 < mol.getConnAtoms_0(atom); i0++) {
      connAtom = mol.getConnAtom_0(atom, i0);
      if (mol.getAtomicNo_0(connAtom) == 1)
        continue;
      connType = 0;
      if ((mode & 32) != 0) {
        connBondOrder = fromInt_0(mol.getConnBondOrder_0(atom, i0));
        if (mode == 32190) {
          if (lt(connBondOrder, 3) && mol.isDelocalizedBond_0(mol.getConnBond_0(atom, i0)) && mol.getAtomPi_0(atom) == 1)
            connBondOrder = 0;
        } else {
          if (lt(connBondOrder, 3) && mol.isAromaticBond_0(mol.getConnBond_0(atom, i0)))
            connBondOrder = 0;
        }
        connType = or_0(connType, shl_0(connBondOrder, 4));
      }
      if ((mode & 128) != 0) {
        if (carc2.cAtomicNoCode[mol.getAtomicNo_0(connAtom)] == -1)
          throw toJs(new jl.Exception_1("unsupported atomicNo:" + mol.getAtomicNo_0(connAtom)));
        connType = add_20(connType, fromInt_0(carc2.cAtomicNoCode[mol.getAtomicNo_0(connAtom)]));
      } else if ((mode & 64) != 0) {
        if (carc2.cSimpleAtomicNoCode[mol.getAtomicNo_0(connAtom)] == -1)
          throw toJs(new jl.Exception_1("unsupported atomicNo:" + mol.getAtomicNo_0(connAtom)));
        connType = add_20(connType, fromInt_0(carc2.cSimpleAtomicNoCode[mol.getAtomicNo_0(connAtom)]));
      }
      if ((mode & 256) != 0) {
        otherNeighbours = mol.getConnAtoms_0(connAtom) - 1;
        if (otherNeighbours > 3)
          otherNeighbours = 3;
        if ((mode & 512) == 0) {
          if (otherNeighbours > 1)
            otherNeighbours = 1;
        }
        connType = or_0(connType, fromInt_0(otherNeighbours << 6));
      }
      if ((mode & 1024) != 0) {
        if (mol.isSmallRingAtom_0(connAtom))
          connType = or_0(connType, 256);
      }
      if ((mode & 2048) != 0) {
        if (mol.isAromaticAtom_0(connAtom))
          connType = or_0(connType, 512);
      }
      if ((mode & 16384) != 0) {
        if (mol.isStabilizedAtom_0(connAtom))
          connType = or_0(connType, 1024);
      }
      index_0 = 0;
      while (lt(connType, neighbourType[index_0]))
        index_0++;
      for (j = i0; j > index_0; j--)
        neighbourType[j] = neighbourType[j - 1];
      neighbourType[index_0] = connType;
      neighbourCount++;
    }
    if (neighbourCount > 4)
      neighbourCount = 4;
    atomType = 0;
    for (i1 = 0; i1 < neighbourCount; i1++) {
      atomType = shl_0(atomType, 11);
      atomType = or_0(atomType, neighbourType[i1]);
    }
    atomType = shl_0(atomType, 15);
    if (carc2.cAtomicNoCode[mol.getAtomicNo_0(atom)] == -1)
      throw toJs(new jl.Exception_1("unsupported atomicNo:" + mol.getAtomicNo_0(atom)));
    atomType = or_0(atomType, fromInt_0(carc2.cAtomicNoCode[mol.getAtomicNo_0(atom)]));
    if ((mode & 2) != 0) {
      ringSize = mol.getAtomRingSize_0(atom);
      if (ringSize > 9)
        ringSize = 9;
      if (ringSize > 2)
        ringSize -= 2;
      atomType = or_0(atomType, fromInt_0(ringSize << 4));
    } else if ((mode & 1) != 0) {
      if (mol.isSmallRingAtom_0(atom))
        atomType = or_0(atomType, 64);
    }
    if ((mode & 4) != 0) {
      if (mol.isAromaticAtom_0(atom))
        atomType = or_0(atomType, 1024);
    }
    if ((mode & 8) != 0) {
      if (mol.isAllylicAtom_0(atom))
        atomType = or_0(atomType, 2048);
    }
    if ((mode & 16) != 0) {
      if (mol.isStabilizedAtom_0(atom))
        atomType = or_0(atomType, 4096);
    }
    if ((mode & 4096) != 0) {
      if (carc2.hasUnbalancedAtomCharge(mol, atom))
        atomType = or_0(atomType, 8192);
      if (carc2.isBasicNitrogen(mol, atom)) {
        for (i = 0; i < mol.getAtoms_0(); i++) {
          if (carc2.isAcidicOxygen(mol, i)) {
            atomType = or_0(atomType, 16384);
            break;
          }
        }
      }
    }
    if ((mode & 8192) != 0) {
      ringCount = fromInt_0(mol.getAtomRingCount_0(atom, 10));
      atomType = or_0(atomType, shl_0(ringCount, 7));
    }
    return atomType;
  };
  defineClass(746, 1, { 1: 1 });
  carc2.ATOM_FLAGS_ATOMICNO = 15;
  carc2.ATOM_FLAGS_RINGCOUNT = 896;
  carc2.ATOM_FLAGS_RINGSIZE = 112;
  carc2.ATOM_FLAG_ALLYLIC = 2048;
  carc2.ATOM_FLAG_AMPHOLYTIC = 16384;
  carc2.ATOM_FLAG_AROMATIC = 1024;
  carc2.ATOM_FLAG_CHARGED = 8192;
  carc2.ATOM_FLAG_COUNT = 15;
  carc2.ATOM_FLAG_SMALLRING = 64;
  carc2.ATOM_FLAG_STABILIZED = 4096;
  carc2.ATOM_SHIFT_RINGCOUNT = 7;
  carc2.ATOM_SHIFT_RINGSIZE = 4;
  carc2.CONN_FLAGS_ALL = 2047;
  carc2.CONN_FLAGS_ATOMICNO = 15;
  carc2.CONN_FLAGS_BONDORDER = 48;
  carc2.CONN_FLAGS_NEIGHBOURS = 192;
  carc2.CONN_FLAG_AROMATIC = 512;
  carc2.CONN_FLAG_COUNT = 11;
  carc2.CONN_FLAG_SMALLRING = 256;
  carc2.CONN_FLAG_STABILIZED = 1024;
  carc2.CONN_SHIFT_BONDORDER = 4;
  carc2.CONN_SHIFT_NEIGHBOURS = 6;
  carc2.cPropertiesAll = 32702;
  carc2.cPropertiesAtomAllylic = 8;
  carc2.cPropertiesAtomAromatic = 4;
  carc2.cPropertiesAtomCharged = 4096;
  carc2.cPropertiesAtomRingCount = 8192;
  carc2.cPropertiesAtomRingSize = 2;
  carc2.cPropertiesAtomSmallRing = 1;
  carc2.cPropertiesAtomStabilized = 16;
  carc2.cPropertiesBasicType = 60;
  carc2.cPropertiesConnAtomAromatic = 2048;
  carc2.cPropertiesConnAtomNeighbours = 256;
  carc2.cPropertiesConnAtomNeighboursExact = 512;
  carc2.cPropertiesConnAtomSmallRing = 1024;
  carc2.cPropertiesConnAtomStabilized = 16384;
  carc2.cPropertiesConnAtomType = 128;
  carc2.cPropertiesConnAtomTypeSimple = 64;
  carc2.cPropertiesConnBondOrder = 32;
  carc2.cPropertiesForCLogP = 2145;
  carc2.cPropertiesForCLogPCharges = 6241;
  carc2.cPropertiesForMutator = 32190;
  carc2.cPropertiesForSolubility = 2144;
  cggl.Lcom_actelion_research_chem_AtomTypeCalculator_2_classLit = createForClass("com.actelion.research.chem", "AtomTypeCalculator", 746, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_Canonizer = function $clinit_Canonizer() {
    carc2.$clinit_Canonizer = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.Canonizer = function Canonizer2(mol) {
    carc2.$clinit_Canonizer();
    carc2.Canonizer_0.call(this, mol, 0);
  };
  carc2.Canonizer_0 = function Canonizer_0(mol, mode) {
    carc2.$clinit_Canonizer();
    Object_0.call(this);
    this.$init_6();
    this.mMol = mol;
    this.mMode = mode;
    this.mMol.ensureHelperArrays_0(7);
    this.mAtomBits = carc2.getNeededBits(this.mMol.getAtoms_0());
    if ((this.mMode & 2048) == 0)
      this.canFindNitrogenQualifyingForParity();
    this.mZCoordinatesAvailable = (mode & 64) != 0 || this.mMol.is3D_0();
    this.mAllHydrogensAreExplicit = this.mMol.getImplicitHydrogens_0() == 0;
    if ((this.mMode & 2048) == 0) {
      this.mTHParity = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
      this.mTHParityIsPseudo = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
      this.mTHParityRoundIsOdd = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
      this.mEZParity = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 15, 1);
      this.mEZParityRoundIsOdd = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 16, 1);
      this.mEZParityIsPseudo = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 16, 1);
    }
    this.mCIPParityNoDistinctionProblem = false;
    this.canInitializeRanking();
    if ((this.mMode & 2048) == 0)
      this.canRankStereo();
    this.canRankFinal();
  };
  carc2.getNeededBits = function getNeededBits(maxNo) {
    carc2.$clinit_Canonizer();
    var bits;
    bits = 0;
    while (maxNo > 0) {
      maxNo >>= 1;
      bits++;
    }
    return bits;
  };
  defineClass(28, 1, { 1: 1 }, carc2.Canonizer, carc2.Canonizer_0);
  _.$init_6 = function $init_6() {
  };
  _.addAtomQueryFeatures = function addAtomQueryFeatures(codeNo, nbits, qfMask, qfBits, qfShift) {
    var atom, atom0, count, feature;
    count = 0;
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++)
      if (neq(and_0(this.mMol.getAtomQueryFeatures(this.mGraphAtom[atom0]), qfMask), 0))
        count++;
    if (count == 0)
      return;
    this.encodeFeatureNo(codeNo);
    this.encodeBits(fromInt_0(count), nbits);
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      feature = and_0(this.mMol.getAtomQueryFeatures(this.mGraphAtom[atom]), qfMask);
      if (neq(feature, 0)) {
        this.encodeBits(fromInt_0(atom), nbits);
        if (qfBits != 1)
          this.encodeBits(shr_0(feature, qfShift), qfBits);
      }
    }
  };
  _.addBondQueryFeatures = function addBondQueryFeatures(codeNo, nbits, qfMask, qfBits, qfShift) {
    var bond, bond0, count, feature;
    count = 0;
    for (bond0 = 0; bond0 < this.mMol.getBonds_0(); bond0++)
      if ((this.mMol.getBondQueryFeatures_0(this.mGraphBond[bond0]) & qfMask) != 0)
        count++;
    if (count == 0)
      return;
    this.encodeFeatureNo(codeNo);
    this.encodeBits(fromInt_0(count), nbits);
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      feature = this.mMol.getBondQueryFeatures_0(this.mGraphBond[bond]) & qfMask;
      if (feature != 0) {
        this.encodeBits(fromInt_0(bond), nbits);
        if (qfBits != 1)
          this.encodeBits(fromInt_0(feature >> qfShift), qfBits);
      }
    }
  };
  _.canBreakFreeValenceAtomTies = function canBreakFreeValenceAtomTies() {
    var atom, atom0, highestSharedFreeValenceRank, increment, isFreeValenceRank, value_0;
    while (true) {
      isFreeValenceRank = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mNoOfRanks + 1, 16, 1);
      highestSharedFreeValenceRank = -1;
      for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
        if (this.mMol.getLowestFreeValence_0(atom0) != 0) {
          if (isFreeValenceRank[this.mCanRank[atom0]] && highestSharedFreeValenceRank < this.mCanRank[atom0])
            highestSharedFreeValenceRank = this.mCanRank[atom0];
          isFreeValenceRank[this.mCanRank[atom0]] = true;
        }
      }
      if (highestSharedFreeValenceRank == -1)
        break;
      increment = 0;
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        value_0 = 0;
        if (this.mCanRank[atom] == highestSharedFreeValenceRank)
          value_0 = ++increment;
        this.mCanBase[atom].init_0(atom);
        this.mCanBase[atom].add_0(this.mAtomBits, fromInt_0(this.mCanRank[atom]));
        this.mCanBase[atom].add_0(8, fromInt_0(value_0));
      }
      this.mNoOfRanks = this.canPerformRanking();
    }
  };
  _.canBreakTiesByHeteroTopicity = function canBreakTiesByHeteroTopicity() {
    var atom, atom0, bond, found;
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
      this.mCanBase[atom0].init_0(atom0);
      this.mCanBase[atom0].add_0(2 * this.mAtomBits + 4, shl_0(fromInt_0(this.mCanRank[atom0]), this.mAtomBits + 4));
    }
    found = false;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++)
      found = found | this.canCalcTHParity(atom, 3);
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++)
      found = found | this.canCalcEZParity(bond, 3);
    if (!found)
      return false;
    while (this.mNoOfRanks < this.mMol.getAtoms_0()) {
      found = this.canInnerBreakTiesByHeteroTopicity();
      if (!found)
        break;
      this.canNormalizeGroupParities();
      if (isNotNull(this.mMesoHelper))
        this.mMesoHelper.normalizeESRGroupSwappingAndRemoval(this.mCanRank);
    }
    return true;
  };
  _.canBreakTiesRandomly = function canBreakTiesRandomly() {
    var atom, atom0, atom1, rank, rankCount;
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
      this.mCanBase[atom0].init_0(atom0);
      this.mCanBase[atom0].add_0(this.mAtomBits + 1, mul_0(fromInt_0(2), fromInt_0(this.mCanRank[atom0])));
    }
    rankCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mNoOfRanks + 1, 15, 1);
    for (atom1 = 0; atom1 < this.mMol.getAtoms_0(); atom1++)
      rankCount[this.mCanRank[atom1]]++;
    rank = 1;
    while (rankCount[rank] == 1)
      rank++;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mCanRank[atom] == rank) {
        this.mCanBase[atom].add_1(1);
        break;
      }
    }
    this.mNoOfRanks = this.canPerformRanking();
  };
  _.canCalcAlleneParity = function canCalcAlleneParity(atom, mode) {
    var alleneParity, atom1, atom2, halfParity1, halfParity2;
    if (this.mMol.getAtomicNo_0(atom) != 6 && this.mMol.getAtomicNo_0(atom) != 7)
      return false;
    atom1 = this.mMol.getConnAtom_0(atom, 0);
    atom2 = this.mMol.getConnAtom_0(atom, 1);
    if (this.mMol.getAtomPi_0(atom1) != 1 || this.mMol.getAtomPi_0(atom2) != 1)
      return false;
    if (this.mMol.getConnAtoms_0(atom1) == 1 || this.mMol.getConnAtoms_0(atom2) == 1)
      return false;
    if (this.mMol.getAllConnAtoms_0(atom1) > 3 || this.mMol.getAllConnAtoms_0(atom2) > 3)
      return false;
    halfParity1 = new carc2.EZHalfParity(this.mMol, this.mCanRank, atom, atom1);
    if (halfParity1.mRanksEqual && mode == 1)
      return false;
    halfParity2 = new carc2.EZHalfParity(this.mMol, this.mCanRank, atom, atom2);
    if (halfParity2.mRanksEqual && mode == 1)
      return false;
    if (halfParity1.mRanksEqual && halfParity2.mRanksEqual)
      return false;
    if (mode == 3) {
      if (halfParity1.mRanksEqual && halfParity1.mInSameFragment)
        this.mProTHAtomsInSameFragment[atom] = true;
      if (halfParity2.mRanksEqual && halfParity2.mInSameFragment)
        this.mProTHAtomsInSameFragment[atom] = true;
    }
    alleneParity = this.mZCoordinatesAvailable ? this.canCalcAlleneParity3D(halfParity1, halfParity2) : this.canCalcAlleneParity2D(halfParity1, halfParity2);
    if (mode == 1) {
      this.mTHParity[atom] = alleneParity;
    } else if (mode == 2) {
      if (halfParity1.mRanksEqual) {
        if (alleneParity == 1) {
          this.mCanBase[halfParity1.mHighConn].add_1(fromInt_0(this.mCanRank[atom1]));
        } else {
          this.mCanBase[halfParity1.mLowConn].add_1(fromInt_0(this.mCanRank[atom1]));
        }
      }
      if (halfParity2.mRanksEqual) {
        if (alleneParity == 2) {
          this.mCanBase[halfParity2.mHighConn].add_1(fromInt_0(this.mCanRank[atom2]));
        } else {
          this.mCanBase[halfParity2.mLowConn].add_1(fromInt_0(this.mCanRank[atom2]));
        }
      }
    }
    return true;
  };
  _.canCalcAlleneParity2D = function canCalcAlleneParity2D(halfParity1, halfParity2) {
    var alleneParity, hp1, hp2;
    hp1 = halfParity1.getValue();
    hp2 = halfParity2.getValue();
    if (hp1 == -1 || hp2 == -1 || (hp1 + hp2 & 1) == 0)
      return 3;
    alleneParity = 0;
    switch (hp1 + hp2) {
      case 3:
      case 7:
        alleneParity = 2;
        break;
      case 5:
        alleneParity = 1;
        break;
    }
    return alleneParity;
  };
  _.canCalcAlleneParity3D = function canCalcAlleneParity3D(halfParity1, halfParity2) {
    var atom, torsion;
    atom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
    atom[0] = halfParity1.mHighConn;
    atom[1] = halfParity1.mCentralAxialAtom;
    atom[2] = halfParity2.mCentralAxialAtom;
    atom[3] = halfParity2.mHighConn;
    torsion = this.mMol.calculateTorsion_0(atom);
    if ($wnd.Math.abs(torsion) < 0.3 || $wnd.Math.abs(torsion) > 3.141592653589793 - 0.3)
      return 3;
    if (torsion < 0)
      return 2;
    else
      return 1;
  };
  _.canCalcBINAPParity = function canCalcBINAPParity(bond, mode) {
    var atom1, atom2, axialParity, halfParity1, halfParity2;
    if (!this.mMol.isBINAPChiralityBond_0(bond))
      return false;
    atom1 = this.mMol.getBondAtom_0(0, bond);
    atom2 = this.mMol.getBondAtom_0(1, bond);
    halfParity1 = new carc2.EZHalfParity(this.mMol, this.mCanRank, atom1, atom2);
    if (halfParity1.mRanksEqual && mode == 1)
      return false;
    halfParity2 = new carc2.EZHalfParity(this.mMol, this.mCanRank, atom2, atom1);
    if (halfParity2.mRanksEqual && mode == 1)
      return false;
    if (halfParity1.mRanksEqual && halfParity2.mRanksEqual)
      return false;
    if (mode == 3) {
      if (halfParity1.mRanksEqual)
        this.mProEZAtomsInSameFragment[bond] = this.hasSecondBINAPBond(atom2);
      if (halfParity2.mRanksEqual)
        this.mProEZAtomsInSameFragment[bond] = this.hasSecondBINAPBond(atom1);
    }
    axialParity = this.mZCoordinatesAvailable ? this.canCalcBINAPParity3D(halfParity1, halfParity2) : this.canCalcBINAPParity2D(halfParity1, halfParity2);
    if (mode == 1) {
      this.mEZParity[bond] = axialParity;
    } else if (mode == 2) {
      if (halfParity1.mRanksEqual) {
        if (axialParity == 2) {
          this.mCanBase[halfParity1.mHighConn].add_1(fromInt_0(this.mCanRank[atom2]));
        } else {
          this.mCanBase[halfParity1.mLowConn].add_1(fromInt_0(this.mCanRank[atom2]));
        }
      }
      if (halfParity2.mRanksEqual) {
        if (axialParity == 2) {
          this.mCanBase[halfParity2.mHighConn].add_1(fromInt_0(this.mCanRank[atom1]));
        } else {
          this.mCanBase[halfParity2.mLowConn].add_1(fromInt_0(this.mCanRank[atom1]));
        }
      }
    }
    return true;
  };
  _.canCalcBINAPParity2D = function canCalcBINAPParity2D(halfParity1, halfParity2) {
    var axialParity, hp1, hp2;
    hp1 = halfParity1.getValue();
    hp2 = halfParity2.getValue();
    if (hp1 == -1 || hp2 == -1 || (hp1 + hp2 & 1) == 0)
      return 3;
    axialParity = 0;
    switch (hp1 + hp2) {
      case 3:
      case 7:
        axialParity = 1;
        break;
      case 5:
        axialParity = 2;
        break;
    }
    return axialParity;
  };
  _.canCalcBINAPParity3D = function canCalcBINAPParity3D(halfParity1, halfParity2) {
    var atom, torsion;
    atom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
    atom[0] = halfParity1.mHighConn;
    atom[1] = halfParity1.mCentralAxialAtom;
    atom[2] = halfParity2.mCentralAxialAtom;
    atom[3] = halfParity2.mHighConn;
    torsion = this.mMol.calculateTorsion_0(atom);
    if ($wnd.Math.abs(torsion) < 0.3 || $wnd.Math.abs(torsion) > 3.141592653589793 - 0.3)
      return 3;
    if (torsion < 0)
      return 1;
    else
      return 2;
  };
  _.canCalcEZParity = function canCalcEZParity(bond, mode) {
    var atom, bondDBParity, dbAtom1, dbAtom2, halfParity1, halfParity2, i, j;
    if (this.mEZParity[bond] != 0)
      return false;
    if (this.mMol.isFragment_0()) {
      for (i = 0; i < 2; i++) {
        atom = this.mMol.getBondAtom_0(i, bond);
        for (j = 0; j < this.mMol.getAllConnAtoms_0(atom); j++)
          if (this.mMol.isExcludeGroupAtom(this.mMol.getConnAtom_0(atom, j)))
            return false;
      }
    }
    if (this.mMol.getBondOrder_0(bond) == 1)
      return this.canCalcBINAPParity(bond, mode);
    if (this.mMol.getBondOrder_0(bond) != 2)
      return false;
    if (this.mMol.isAromaticBond_0(bond))
      return false;
    dbAtom1 = this.mMol.getBondAtom_0(0, bond);
    dbAtom2 = this.mMol.getBondAtom_0(1, bond);
    if (this.mMol.getConnAtoms_0(dbAtom1) == 1 || this.mMol.getConnAtoms_0(dbAtom2) == 1)
      return false;
    if (this.mMol.getConnAtoms_0(dbAtom1) > 3 || this.mMol.getConnAtoms_0(dbAtom2) > 3)
      return false;
    if (this.mMol.getAtomPi_0(dbAtom1) == 2 || this.mMol.getAtomPi_0(dbAtom2) == 2)
      return false;
    halfParity1 = new carc2.EZHalfParity(this.mMol, this.mCanRank, dbAtom2, dbAtom1);
    if (halfParity1.mRanksEqual && mode == 1)
      return false;
    halfParity2 = new carc2.EZHalfParity(this.mMol, this.mCanRank, dbAtom1, dbAtom2);
    if (halfParity2.mRanksEqual && mode == 1)
      return false;
    if (halfParity1.mRanksEqual && halfParity2.mRanksEqual)
      return false;
    if (mode == 3) {
      if (halfParity1.mRanksEqual && halfParity1.mInSameFragment)
        this.mProEZAtomsInSameFragment[bond] = true;
      if (halfParity2.mRanksEqual && halfParity2.mInSameFragment)
        this.mProEZAtomsInSameFragment[bond] = true;
    }
    bondDBParity = this.mMol.isBondParityUnknownOrNone_0(bond) ? 3 : this.mZCoordinatesAvailable ? this.canCalcEZParity3D(halfParity1, halfParity2) : this.canCalcEZParity2D(halfParity1, halfParity2);
    if (mode == 1) {
      this.mEZParity[bond] = bondDBParity;
    } else if (mode == 2) {
      if (halfParity1.mRanksEqual) {
        if (bondDBParity == 1) {
          this.mCanBase[halfParity1.mHighConn].add_1(fromInt_0(this.mCanRank[dbAtom1]));
        } else if (bondDBParity == 2) {
          this.mCanBase[halfParity1.mLowConn].add_1(fromInt_0(this.mCanRank[dbAtom1]));
        }
      }
      if (halfParity2.mRanksEqual) {
        if (bondDBParity == 1) {
          this.mCanBase[halfParity2.mHighConn].add_1(fromInt_0(this.mCanRank[dbAtom2]));
        } else if (bondDBParity == 2) {
          this.mCanBase[halfParity2.mLowConn].add_1(fromInt_0(this.mCanRank[dbAtom2]));
        }
      }
    }
    return true;
  };
  _.canCalcEZParity2D = function canCalcEZParity2D(halfParity1, halfParity2) {
    if (halfParity1.getValue() == -1 || halfParity2.getValue() == -1)
      return 3;
    if (((halfParity1.getValue() | halfParity2.getValue()) & 1) != 0)
      return 3;
    return halfParity1.getValue() == halfParity2.getValue() ? narrow_byte(1) : 2;
  };
  _.canCalcEZParity3D = function canCalcEZParity3D(halfParity1, halfParity2) {
    var cosa, cosb, db, n1, n2, s1, s2;
    db = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    db[0] = this.mMol.getAtomX_0(halfParity2.mCentralAxialAtom) - this.mMol.getAtomX_0(halfParity1.mCentralAxialAtom);
    db[1] = this.mMol.getAtomY_0(halfParity2.mCentralAxialAtom) - this.mMol.getAtomY_0(halfParity1.mCentralAxialAtom);
    db[2] = this.mMol.getAtomZ_0(halfParity2.mCentralAxialAtom) - this.mMol.getAtomZ_0(halfParity1.mCentralAxialAtom);
    s1 = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    s1[0] = this.mMol.getAtomX_0(halfParity1.mHighConn) - this.mMol.getAtomX_0(halfParity1.mCentralAxialAtom);
    s1[1] = this.mMol.getAtomY_0(halfParity1.mHighConn) - this.mMol.getAtomY_0(halfParity1.mCentralAxialAtom);
    s1[2] = this.mMol.getAtomZ_0(halfParity1.mHighConn) - this.mMol.getAtomZ_0(halfParity1.mCentralAxialAtom);
    s2 = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    s2[0] = this.mMol.getAtomX_0(halfParity2.mHighConn) - this.mMol.getAtomX_0(halfParity2.mCentralAxialAtom);
    s2[1] = this.mMol.getAtomY_0(halfParity2.mHighConn) - this.mMol.getAtomY_0(halfParity2.mCentralAxialAtom);
    s2[2] = this.mMol.getAtomZ_0(halfParity2.mHighConn) - this.mMol.getAtomZ_0(halfParity2.mCentralAxialAtom);
    n1 = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    n1[0] = db[1] * s1[2] - db[2] * s1[1];
    n1[1] = db[2] * s1[0] - db[0] * s1[2];
    n1[2] = db[0] * s1[1] - db[1] * s1[0];
    n2 = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    n2[0] = db[1] * n1[2] - db[2] * n1[1];
    n2[1] = db[2] * n1[0] - db[0] * n1[2];
    n2[2] = db[0] * n1[1] - db[1] * n1[0];
    cosa = (s1[0] * n2[0] + s1[1] * n2[1] + s1[2] * n2[2]) / ($wnd.Math.sqrt(s1[0] * s1[0] + s1[1] * s1[1] + s1[2] * s1[2]) * $wnd.Math.sqrt(n2[0] * n2[0] + n2[1] * n2[1] + n2[2] * n2[2]));
    cosb = (s2[0] * n2[0] + s2[1] * n2[1] + s2[2] * n2[2]) / ($wnd.Math.sqrt(s2[0] * s2[0] + s2[1] * s2[1] + s2[2] * s2[2]) * $wnd.Math.sqrt(n2[0] * n2[0] + n2[1] * n2[1] + n2[2] * n2[2]));
    return cosa < 0 ^ cosb < 0 ? narrow_byte(1) : 2;
  };
  _.canCalcImplicitAbnormalValence = function canCalcImplicitAbnormalValence(atom) {
    var explicitAbnormalValence, implicitHigherValence, newImplicitHigherValence, valence;
    explicitAbnormalValence = this.mMol.getAtomAbnormalValence_0(atom);
    implicitHigherValence = this.mMol.getImplicitHigherValence_0(atom, false);
    newImplicitHigherValence = this.mMol.getImplicitHigherValence_0(atom, true);
    valence = -1;
    if (implicitHigherValence != newImplicitHigherValence) {
      if (explicitAbnormalValence != -1 && explicitAbnormalValence > implicitHigherValence)
        valence = narrow_byte(explicitAbnormalValence);
      else
        valence = narrow_byte(implicitHigherValence);
    } else if (explicitAbnormalValence != -1) {
      if (explicitAbnormalValence > newImplicitHigherValence || explicitAbnormalValence < newImplicitHigherValence && explicitAbnormalValence >= this.mMol.getOccupiedValence_0(atom))
        valence = narrow_byte(explicitAbnormalValence);
    } else if (!this.mMol.supportsImplicitHydrogen_0(atom) && this.mMol.getExplicitHydrogens_0(atom) != 0) {
      valence = this.mMol.getOccupiedValence_0(atom);
      valence -= this.mMol.getElectronValenceCorrection_0(atom, valence);
    }
    this.canSetAbnormalValence(atom, valence);
    return valence;
  };
  _.canCalcNextBaseValues = function canCalcNextBaseValues() {
    var atom, connBond, connRank, i, i0, i1, j, k, neighbour, neighbours, rank;
    connRank = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMaxConnAtoms, 15, 1);
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      neighbours = this.mMol.getConnAtoms_0(atom) + this.mMol.getMetalBondedConnAtoms_0(atom);
      neighbour = 0;
      for (i0 = 0; i0 < this.mMol.getAllConnAtomsPlusMetalBonds_0(atom); i0++) {
        if (i0 < this.mMol.getConnAtoms_0(atom) || i0 >= this.mMol.getAllConnAtoms_0(atom)) {
          rank = 2 * this.mCanRank[this.mMol.getConnAtom_0(atom, i0)];
          connBond = this.mMol.getConnBond_0(atom, i0);
          if (this.mMol.getBondOrder_0(connBond) == 2) {
            if (!this.mMol.isAromaticBond_0(connBond))
              rank++;
          }
          for (j = 0; j < neighbour; j++)
            if (rank < connRank[j])
              break;
          for (k = neighbour; k > j; k--)
            connRank[k] = connRank[k - 1];
          connRank[j] = rank;
          neighbour++;
        }
      }
      this.mCanBase[atom].init_0(atom);
      this.mCanBase[atom].add_0(this.mAtomBits, fromInt_0(this.mCanRank[atom]));
      for (i1 = neighbours; i1 < this.mMaxConnAtoms; i1++)
        this.mCanBase[atom].add_0(this.mAtomBits + 1, 0);
      for (i = 0; i < neighbours; i++)
        this.mCanBase[atom].add_0(this.mAtomBits + 1, fromInt_0(connRank[i]));
    }
  };
  _.canCalcTHParity = function canCalcTHParity(atom, mode) {
    var atomTHParity, highestConn, highestRank, i, i0, i1, j, neighbourUsed, proTHAtom1, proTHAtom2, proTHAtomsFound, remappedConn, remappedRank;
    if (this.mTHParity[atom] != 0)
      return false;
    if (this.mMol.getAtomicNo_0(atom) != 5 && this.mMol.getAtomicNo_0(atom) != 6 && this.mMol.getAtomicNo_0(atom) != 7 && this.mMol.getAtomicNo_0(atom) != 14 && this.mMol.getAtomicNo_0(atom) != 15 && this.mMol.getAtomicNo_0(atom) != 16)
      return false;
    if ((this.mMode & 4096) != 0 && this.mMol.getAtomicNo_0(atom) >= 14)
      return false;
    if (this.mMol.getAtomPi_0(atom) != 0) {
      if (this.mMol.isCentralAlleneAtom(atom))
        return this.canCalcAlleneParity(atom, mode);
      if (this.mMol.getAtomicNo_0(atom) != 15 && this.mMol.getAtomicNo_0(atom) != 16)
        return false;
    }
    if (this.mMol.getConnAtoms_0(atom) < 3 || this.mMol.getAllConnAtoms_0(atom) > 4)
      return false;
    if (this.mMol.getAtomCharge_0(atom) > 0 && this.mMol.getAtomicNo_0(atom) == 6)
      return false;
    if (this.mMol.getAtomicNo_0(atom) == 5 && this.mMol.getAllConnAtoms_0(atom) != 4)
      return false;
    if (this.mMol.isFragment_0()) {
      if (this.mMol.isExcludeGroupAtom(atom))
        return false;
      for (i0 = 0; i0 < this.mMol.getAllConnAtoms_0(atom); i0++)
        if (this.mMol.isExcludeGroupAtom(this.mMol.getConnAtom_0(atom, i0)))
          return false;
    }
    if (this.mMol.getAtomicNo_0(atom) == 7 && !this.mNitrogenQualifiesForParity[atom])
      return false;
    remappedConn = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
    remappedRank = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
    neighbourUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, 4, 16, 1);
    for (i1 = 0; i1 < this.mMol.getAllConnAtoms_0(atom); i1++) {
      highestRank = -1;
      highestConn = 0;
      for (j = 0; j < this.mMol.getAllConnAtoms_0(atom); j++) {
        if (!neighbourUsed[j]) {
          if (highestRank < this.mCanRank[this.mMol.getConnAtom_0(atom, j)]) {
            highestRank = this.mCanRank[this.mMol.getConnAtom_0(atom, j)];
            highestConn = j;
          }
        }
      }
      remappedConn[i1] = highestConn;
      remappedRank[i1] = highestRank;
      neighbourUsed[highestConn] = true;
    }
    if (this.mMol.getAllConnAtoms_0(atom) == 4 && remappedRank[0] == remappedRank[1] && remappedRank[2] == remappedRank[3])
      return false;
    if (this.mMol.getAllConnAtoms_0(atom) == 4 && (remappedRank[0] == remappedRank[2] || remappedRank[1] == remappedRank[3]))
      return false;
    if (this.mMol.getAllConnAtoms_0(atom) == 3 && remappedRank[0] == remappedRank[2])
      return false;
    proTHAtom1 = 0;
    proTHAtom2 = 0;
    proTHAtomsFound = false;
    for (i = 1; i < this.mMol.getAllConnAtoms_0(atom); i++) {
      if (remappedRank[i - 1] == remappedRank[i]) {
        if (mode == 1 || remappedRank[i] == 0)
          return false;
        proTHAtom1 = this.mMol.getConnAtom_0(atom, remappedConn[i - 1]);
        proTHAtom2 = this.mMol.getConnAtom_0(atom, remappedConn[i]);
        if (mode == 3 && this.mMol.isRingBond_0(this.mMol.getConnBond_0(atom, remappedConn[i])))
          this.mProTHAtomsInSameFragment[atom] = true;
        proTHAtomsFound = true;
      }
    }
    if (mode != 1 && !proTHAtomsFound)
      return false;
    atomTHParity = this.mZCoordinatesAvailable ? this.canCalcTHParity3D(atom, remappedConn) : this.canCalcTHParity2D(atom, remappedConn);
    if (mode == 1) {
      this.mTHParity[atom] = atomTHParity;
    } else if (mode == 2) {
      if (atomTHParity == 1) {
        this.mCanBase[proTHAtom1].add_1(fromInt_0(this.mCanRank[atom]));
      } else if (atomTHParity == 2) {
        this.mCanBase[proTHAtom2].add_1(fromInt_0(this.mCanRank[atom]));
      }
    }
    return true;
  };
  _.canCalcTHParity2D = function canCalcTHParity2D(atom, remappedConn) {
    var angle, bnd, i, i0, i1, order, parity, stereoBond, stereoType, up_down;
    up_down = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 2), { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 0, [stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [2, 1, 2, 1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 2, 2, 1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 1, 2, 2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [2, 1, 1, 2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [2, 2, 1, 1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 2, 1, 2])]);
    angle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllConnAtoms_0(atom), 15, 1);
    for (i0 = 0; i0 < this.mMol.getAllConnAtoms_0(atom); i0++)
      angle[i0] = this.mMol.getBondAngle_0(this.mMol.getConnAtom_0(atom, remappedConn[i0]), atom);
    parity = narrow_byte(this.mMol.getFisherProjectionParity_0(atom, remappedConn, angle, null));
    if (parity != 3)
      return parity;
    stereoBond = 0;
    stereoType = 0;
    for (i1 = 0; i1 < this.mMol.getAllConnAtoms_0(atom); i1++) {
      bnd = this.mMol.getConnBond_0(atom, remappedConn[i1]);
      if (this.mMol.getBondAtom_0(0, bnd) == atom) {
        if (this.mMol.getBondType_0(bnd) == 129) {
          if (stereoType != 0)
            this.mMol.setStereoProblem(atom);
          stereoBond = i1;
          stereoType = 1;
        }
        if (this.mMol.getBondType_0(bnd) == 257) {
          if (stereoType != 0)
            this.mMol.setStereoProblem(atom);
          stereoBond = i1;
          stereoType = 2;
        }
      }
    }
    if (stereoType == 0)
      return 3;
    for (i = 1; i < this.mMol.getAllConnAtoms_0(atom); i++)
      if (angle[i] < angle[0])
        angle[i] += 3.141592653589793 * 2;
    if (this.mMol.getAllConnAtoms_0(atom) == 3) {
      switch (stereoBond) {
        case 0:
          if (angle[1] < angle[2] && angle[2] - angle[1] < 3.141592653589793 || angle[1] > angle[2] && angle[1] - angle[2] > 3.141592653589793)
            stereoType = 3 - stereoType;
          break;
        case 1:
          if (angle[2] - angle[0] > 3.141592653589793)
            stereoType = 3 - stereoType;
          break;
        case 2:
          if (angle[1] - angle[0] < 3.141592653589793)
            stereoType = 3 - stereoType;
          break;
      }
      return stereoType == 1 ? narrow_byte(2) : 1;
    }
    order = 0;
    if (angle[1] <= angle[2] && angle[2] <= angle[3])
      order = 0;
    else if (angle[1] <= angle[3] && angle[3] <= angle[2])
      order = 1;
    else if (angle[2] <= angle[1] && angle[1] <= angle[3])
      order = 2;
    else if (angle[2] <= angle[3] && angle[3] <= angle[1])
      order = 3;
    else if (angle[3] <= angle[1] && angle[1] <= angle[2])
      order = 4;
    else if (angle[3] <= angle[2] && angle[2] <= angle[1])
      order = 5;
    return up_down[order][stereoBond] == stereoType ? narrow_byte(2) : 1;
  };
  _.canCalcTHParity3D = function canCalcTHParity3D(atom, remappedConn) {
    var atomList, coords, cosa, i, i0, n;
    atomList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
    for (i0 = 0; i0 < this.mMol.getAllConnAtoms_0(atom); i0++)
      atomList[i0] = this.mMol.getConnAtom_0(atom, remappedConn[i0]);
    if (this.mMol.getAllConnAtoms_0(atom) == 3)
      atomList[3] = atom;
    coords = initMultidimensionalArray(cggl.D_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 11: 1, 4: 1, 1: 1 }], [11, 5], 15, [3, 3], 2);
    for (i = 0; i < 3; i++) {
      coords[i][0] = this.mMol.getAtomX_0(atomList[i + 1]) - this.mMol.getAtomX_0(atomList[0]);
      coords[i][1] = this.mMol.getAtomY_0(atomList[i + 1]) - this.mMol.getAtomY_0(atomList[0]);
      coords[i][2] = this.mMol.getAtomZ_0(atomList[i + 1]) - this.mMol.getAtomZ_0(atomList[0]);
    }
    n = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    n[0] = coords[0][1] * coords[1][2] - coords[0][2] * coords[1][1];
    n[1] = coords[0][2] * coords[1][0] - coords[0][0] * coords[1][2];
    n[2] = coords[0][0] * coords[1][1] - coords[0][1] * coords[1][0];
    cosa = (coords[2][0] * n[0] + coords[2][1] * n[1] + coords[2][2] * n[2]) / ($wnd.Math.sqrt(coords[2][0] * coords[2][0] + coords[2][1] * coords[2][1] + coords[2][2] * coords[2][2]) * $wnd.Math.sqrt(n[0] * n[0] + n[1] * n[1] + n[2] * n[2]));
    return cosa > 0 ? narrow_byte(1) : 2;
  };
  _.canConsolidate = function canConsolidate() {
    var canRank, i;
    canRank = 0;
    ju.sort_5(this.mCanBase);
    for (i = 0; i < this.mCanBase.length; i++) {
      if (i == 0 || this.mCanBase[i].compareTo_0(this.mCanBase[i - 1]) != 0)
        canRank++;
      this.mCanRank[this.mCanBase[i].getAtom()] = canRank;
    }
    return canRank;
  };
  _.canEnsureFragments = function canEnsureFragments() {
    var atom, bondHandled, connAtom, connBond, current, fragmentAtom, fragmentAtoms, fragmentBond, fragmentBonds, fragmentCount, fragmentNo, i;
    if (isNotNull(this.mFragmentList))
      return;
    this.mFragmentList = new ju.ArrayList();
    fragmentCount = 0;
    fragmentNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    fragmentAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    fragmentBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 15, 1);
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (fragmentNo[atom] == 0 && (this.mMol.isRingAtom_0(atom) || this.mMol.getAtomPi_0(atom) == 1)) {
        fragmentAtom[0] = atom;
        fragmentAtoms = 1;
        fragmentBonds = 0;
        fragmentNo[atom] = ++fragmentCount;
        bondHandled = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 16, 1);
        for (current = 0; current < fragmentAtoms; current++) {
          for (i = 0; i < this.mMol.getConnAtoms_0(fragmentAtom[current]); i++) {
            connBond = this.mMol.getConnBond_0(fragmentAtom[current], i);
            if (this.mMol.isRingBond_0(connBond) || this.mMol.getBondOrder_0(connBond) == 2 || this.mMol.isBINAPChiralityBond_0(connBond)) {
              connAtom = this.mMol.getConnAtom_0(fragmentAtom[current], i);
              if (!bondHandled[connBond]) {
                fragmentBond[fragmentBonds++] = connBond;
                bondHandled[connBond] = true;
              }
              if (fragmentNo[connAtom] == 0) {
                fragmentAtom[fragmentAtoms++] = connAtom;
                fragmentNo[connAtom] = fragmentCount;
              }
            }
          }
        }
        this.mFragmentList.add(new carc2.CanonizerFragment(fragmentAtom, fragmentAtoms, fragmentBond, fragmentBonds));
      }
    }
  };
  _.canFindNitrogenQualifyingForParity = function canFindNitrogenQualifyingForParity() {
    var atom;
    this.mNitrogenQualifiesForParity = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mMol.getAtomicNo_0(atom) == 7) {
        if (this.mMol.getConnAtoms_0(atom) == 4) {
          this.mNitrogenQualifiesForParity[atom] = true;
          continue;
        }
        if (this.mMol.getConnAtoms_0(atom) == 3) {
          if (this.mMol.getAtomRingSize_0(atom) == 3) {
            this.mNitrogenQualifiesForParity[atom] = true;
            continue;
          }
          if (this.mMol.getAtomCharge_0(atom) == 1) {
            this.mNitrogenQualifiesForParity[atom] = true;
            continue;
          }
          if (this.mMol.isFlatNitrogen_0(atom))
            continue;
          if ((this.mMode & 32) != 0) {
            this.mNitrogenQualifiesForParity[atom] = true;
            continue;
          }
          if (this.mMol.isPyramidalBridgeHead(atom)) {
            this.mNitrogenQualifiesForParity[atom] = true;
            continue;
          }
        }
      }
    }
  };
  _.canFindParities = function canFindParities(doCIP) {
    var atom, bond, ezFound, thFound;
    ezFound = false;
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++)
      if (this.canCalcEZParity(bond, 1)) {
        this.mEZParityRoundIsOdd[bond] = this.mIsOddParityRound;
        if (doCIP)
          this.cipCalcEZParity(bond);
        ezFound = true;
      }
    thFound = false;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++)
      if (this.canCalcTHParity(atom, 1)) {
        this.mTHParityRoundIsOdd[atom] = this.mIsOddParityRound;
        if (doCIP)
          this.cipCalcTHParity(atom);
        thFound = true;
      }
    if (thFound)
      this.mIsOddParityRound = !this.mIsOddParityRound;
    return ezFound || thFound;
  };
  _.canFindPseudoParities = function canFindPseudoParities() {
    var anyPseudoParityCount, atom, atom0, bond, bond0, f, f$iterator, highEZBondRank, highRankingEZBond, highRankingTHAtom, highTHAtomRank, higherRank, i, i0, i1, i2, invertFragmentsStereoFeatures, isFreshPseudoParityAtom, isFreshPseudoParityBond, pseudoParitiesInGroup, pseudoParity1Or2Found, pseudoParity1Or2InGroup, rank1, rank2;
    isFreshPseudoParityAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    isFreshPseudoParityBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 16, 1);
    anyPseudoParityCount = 0;
    pseudoParity1Or2Found = false;
    if ((this.mMode & 128) != 0) {
      this.mPseudoTHGroup = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
      this.mPseudoEZGroup = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 15, 1);
    }
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
      if (this.mProTHAtomsInSameFragment[atom0]) {
        if (!this.mTHParityIsPseudo[atom0]) {
          if (this.canCalcTHParity(atom0, 1)) {
            this.mTHParityIsPseudo[atom0] = true;
            isFreshPseudoParityAtom[atom0] = true;
            anyPseudoParityCount++;
          }
        }
      }
    }
    for (bond0 = 0; bond0 < this.mMol.getBonds_0(); bond0++) {
      if (this.mProEZAtomsInSameFragment[bond0]) {
        if (!this.mEZParityIsPseudo[bond0]) {
          if (this.canCalcEZParity(bond0, 1)) {
            this.mEZParityIsPseudo[bond0] = true;
            isFreshPseudoParityBond[bond0] = true;
            anyPseudoParityCount++;
          }
        }
      }
    }
    if (anyPseudoParityCount == 1) {
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        if (isFreshPseudoParityAtom[atom]) {
          this.mTHParity[atom] = 0;
          break;
        }
      }
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
        if (isFreshPseudoParityBond[bond]) {
          this.mEZParity[bond] = 0;
          break;
        }
      }
    } else if (anyPseudoParityCount > 1) {
      this.canEnsureFragments();
      this.mNoOfPseudoGroups = 0;
      for (f$iterator = this.mFragmentList.iterator(); f$iterator.hasNext_0(); ) {
        f = castTo(f$iterator.next_3(), 197);
        pseudoParitiesInGroup = 0;
        pseudoParity1Or2InGroup = 0;
        highRankingTHAtom = 0;
        highRankingEZBond = 0;
        highTHAtomRank = -1;
        highEZBondRank = -1;
        for (i0 = 0; i0 < f.atom.length; i0++) {
          if (isFreshPseudoParityAtom[f.atom[i0]]) {
            pseudoParitiesInGroup++;
            if (this.mTHParity[f.atom[i0]] == 1 || this.mTHParity[f.atom[i0]] == 2) {
              pseudoParity1Or2InGroup++;
              pseudoParity1Or2Found = true;
              if (highTHAtomRank < this.mCanRank[f.atom[i0]]) {
                highTHAtomRank = this.mCanRank[f.atom[i0]];
                highRankingTHAtom = f.atom[i0];
              }
            }
          }
        }
        for (i1 = 0; i1 < f.bond.length; i1++) {
          if (isFreshPseudoParityBond[f.bond[i1]]) {
            pseudoParitiesInGroup++;
            rank1 = this.mCanRank[this.mMol.getBondAtom_0(0, f.bond[i1])];
            rank2 = this.mCanRank[this.mMol.getBondAtom_0(1, f.bond[i1])];
            higherRank = rank1 > rank2 ? (rank1 << 16) + rank2 : (rank2 << 16) + rank1;
            if (this.mEZParity[f.bond[i1]] == 1 || this.mEZParity[f.bond[i1]] == 2) {
              pseudoParity1Or2InGroup++;
              pseudoParity1Or2Found = true;
              if (highEZBondRank < higherRank) {
                highEZBondRank = higherRank;
                highRankingEZBond = f.bond[i1];
              }
            }
          }
        }
        if (pseudoParitiesInGroup == 0)
          continue;
        if (pseudoParitiesInGroup == 1) {
          for (i2 = 0; i2 < f.atom.length; i2++)
            if (isFreshPseudoParityAtom[f.atom[i2]])
              this.mTHParity[f.atom[i2]] = 0;
          for (i = 0; i < f.bond.length; i++)
            if (isFreshPseudoParityBond[f.bond[i]])
              this.mEZParity[f.bond[i]] = 0;
        } else {
          if (pseudoParity1Or2InGroup == 1) {
            for (i2 = 0; i2 < f.atom.length; i2++)
              if (isFreshPseudoParityAtom[f.atom[i2]])
                this.mTHParity[f.atom[i2]] = 3;
            for (i = 0; i < f.bond.length; i++)
              if (isFreshPseudoParityBond[f.bond[i]])
                this.mEZParity[f.bond[i]] = 3;
          } else {
            if ((this.mMode & 128) != 0) {
              this.mNoOfPseudoGroups++;
              for (i2 = 0; i2 < f.atom.length; i2++)
                if (isFreshPseudoParityAtom[f.atom[i2]])
                  this.mPseudoTHGroup[f.atom[i2]] = this.mNoOfPseudoGroups;
              for (i = 0; i < f.bond.length; i++)
                if (isFreshPseudoParityBond[f.bond[i]])
                  this.mPseudoEZGroup[f.bond[i]] = this.mNoOfPseudoGroups;
            }
            invertFragmentsStereoFeatures = false;
            if (highTHAtomRank != -1) {
              if (this.mTHParity[highRankingTHAtom] == 2)
                invertFragmentsStereoFeatures = true;
            } else {
              if (this.mEZParity[highRankingEZBond] == 2)
                invertFragmentsStereoFeatures = true;
            }
            if (invertFragmentsStereoFeatures) {
              for (i2 = 0; i2 < f.atom.length; i2++) {
                if (isFreshPseudoParityAtom[f.atom[i2]]) {
                  switch (this.mTHParity[f.atom[i2]]) {
                    case 1:
                      this.mTHParity[f.atom[i2]] = 2;
                      break;
                    case 2:
                      this.mTHParity[f.atom[i2]] = 1;
                      break;
                  }
                }
              }
              for (i = 0; i < f.bond.length; i++) {
                if (isFreshPseudoParityBond[f.bond[i]]) {
                  switch (this.mEZParity[f.bond[i]]) {
                    case 1:
                      this.mEZParity[f.bond[i]] = 2;
                      break;
                    case 2:
                      this.mEZParity[f.bond[i]] = 1;
                      break;
                  }
                }
              }
            }
          }
        }
      }
    }
    return pseudoParity1Or2Found;
  };
  _.canGetESRGroupRank = function canGetESRGroupRank(groupMember) {
    var atomRank, group, group0, groupRank, groupTypeIndex, i, maxAtomRank, maxGroup, memberCount, rank, rankCount;
    groupRank = initMultidimensionalArray(cggl.I_classLit, [{ 25: 1, 4: 1, 1: 1, 7: 1 }, { 6: 1, 4: 1, 1: 1 }], [6, 5], 15, [2, 32], 2);
    for (groupTypeIndex = 0; groupTypeIndex < 2; groupTypeIndex++) {
      atomRank = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 32, 0, 2);
      rankCount = 0;
      for (group0 = 0; group0 < 32; group0++) {
        if (jsNotEquals(groupMember[groupTypeIndex][group0], null)) {
          memberCount = groupMember[groupTypeIndex][group0].length;
          atomRank[group0] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, memberCount, 15, 1);
          for (i = 0; i < memberCount; i++)
            atomRank[group0][i] = this.mCanRank[groupMember[groupTypeIndex][group0][i]];
          ju.sort_3(atomRank[group0]);
          rankCount++;
        }
      }
      for (rank = rankCount; rank > 0; rank--) {
        maxGroup = 0;
        maxAtomRank = null;
        for (group = 0; group < 32; group++) {
          if (jsNotEquals(atomRank[group], null)) {
            if (jsEquals(maxAtomRank, null) || maxAtomRank.length < atomRank[group].length) {
              maxAtomRank = atomRank[group];
              maxGroup = group;
            } else if (maxAtomRank.length == atomRank[group].length) {
              for (i = maxAtomRank.length - 1; i >= 0; i--) {
                if (maxAtomRank[i] < atomRank[group][i]) {
                  maxAtomRank = atomRank[group];
                  maxGroup = group;
                  break;
                }
              }
            }
          }
        }
        groupRank[groupTypeIndex][maxGroup] = rank;
        atomRank[maxGroup] = null;
      }
    }
    return groupRank;
  };
  _.canInitializeRanking = function canInitializeRanking() {
    var atom, atom0, atom1, atom2, atom3, atomList, atomListFound, baseValueSize, bond, bondQFList, bondQueryFeaturesPresent, bondRingSize, i, i0, i1, index_0, list, listLength, rank;
    bondQueryFeaturesPresent = false;
    if (this.mMol.isFragment_0()) {
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
        if (this.mMol.getBondQueryFeatures_0(bond) != 0) {
          bondQueryFeaturesPresent = true;
          break;
        }
      }
    }
    this.mMaxConnAtoms = 2;
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++)
      this.mMaxConnAtoms = $wnd.Math.max(this.mMaxConnAtoms, this.mMol.getConnAtoms_0(atom0) + this.mMol.getMetalBondedConnAtoms_0(atom0));
    baseValueSize = $wnd.Math.max(2, bondQueryFeaturesPresent ? narrow_int((62 + this.mAtomBits + this.mMaxConnAtoms * (this.mAtomBits + 23)) / 63) : narrow_int((62 + this.mAtomBits + this.mMaxConnAtoms * (this.mAtomBits + 5)) / 63));
    this.mCanRank = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    this.mCanBase = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_CanonizerBaseValue_2_classLit, { 4: 1, 1: 1, 7: 1 }, 106, this.mMol.getAtoms_0(), 0, 1);
    for (atom1 = 0; atom1 < this.mMol.getAtoms_0(); atom1++)
      setCheck(this.mCanBase, atom1, new carc2.CanonizerBaseValue(baseValueSize));
    atomListFound = false;
    for (atom2 = 0; atom2 < this.mMol.getAtoms_0(); atom2++) {
      this.mCanBase[atom2].init_0(atom2);
      if (neq(and_0(this.mMol.getAtomQueryFeatures(atom2), 1), 0) || jsNotEquals(this.mMol.getAtomList_0(atom2), null))
        this.mCanBase[atom2].add_0(8, 6);
      else
        this.mCanBase[atom2].add_0(8, fromInt_0(this.mMol.getAtomicNo_0(atom2)));
      this.mCanBase[atom2].add_0(8, fromInt_0(this.mMol.getAtomMass_0(atom2)));
      this.mCanBase[atom2].add_0(2, fromInt_0(this.mMol.getAtomPi_0(atom2)));
      this.mCanBase[atom2].add_0(4, fromInt_0(this.mMol.getConnAtoms_0(atom2) + this.mMol.getMetalBondedConnAtoms_0(atom2)));
      if (neq(and_0(this.mMol.getAtomQueryFeatures(atom2), 1), 0))
        this.mCanBase[atom2].add_0(4, 8);
      else
        this.mCanBase[atom2].add_0(4, fromInt_0(8 + this.mMol.getAtomCharge_0(atom2)));
      this.mCanBase[atom2].add_0(5, fromInt_0($wnd.Math.min(31, this.mMol.getAtomRingSize_0(atom2))));
      this.mCanBase[atom2].add_0(4, fromInt_0(this.canCalcImplicitAbnormalValence(atom2) + 1));
      this.mCanBase[atom2].add_0(2, fromInt_0(this.mMol.getAtomRadical_0(atom2) >> 4));
      if (this.mMol.isFragment_0()) {
        this.mCanBase[atom2].add_0(51, this.mMol.getAtomQueryFeatures(atom2));
        if (jsNotEquals(this.mMol.getAtomList_0(atom2), null))
          atomListFound = true;
      }
    }
    this.mNoOfRanks = this.canPerformRanking();
    if (this.mNoOfRanks < this.mMol.getAtoms_0()) {
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        this.mCanBase[atom].init_0(atom);
        this.mCanBase[atom].add_0(this.mAtomBits, fromInt_0(this.mCanRank[atom]));
        bondRingSize = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getConnAtoms_0(atom), 15, 1);
        for (i0 = 0; i0 < this.mMol.getConnAtoms_0(atom); i0++) {
          bondRingSize[i0] = this.mCanRank[this.mMol.getConnAtom_0(atom, i0)] << 5;
          bondRingSize[i0] |= $wnd.Math.min(31, this.mMol.getBondRingSize_0(this.mMol.getConnBond_0(atom, i0)));
        }
        ju.sort_3(bondRingSize);
        for (i1 = this.mMaxConnAtoms; i1 > bondRingSize.length; i1--)
          this.mCanBase[atom].add_0(this.mAtomBits + 5, 0);
        for (i = bondRingSize.length - 1; i >= 0; i--)
          this.mCanBase[atom].add_0(this.mAtomBits + 5, fromInt_0(bondRingSize[i]));
      }
      this.mNoOfRanks = this.canPerformRanking();
    }
    if (atomListFound && this.mNoOfRanks < this.mMol.getAtoms_0()) {
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        this.mCanBase[atom].init_0(atom);
        this.mCanBase[atom].add_0(this.mAtomBits, fromInt_0(this.mCanRank[atom]));
        atomList = this.mMol.getAtomList_0(atom);
        listLength = jsEquals(atomList, null) ? 0 : $wnd.Math.min(12, atomList.length);
        for (i0 = 12; i0 > listLength; i0--)
          this.mCanBase[atom].add_0(8, 0);
        for (i = listLength - 1; i >= 0; i--)
          this.mCanBase[atom].add_0(8, fromInt_0(atomList[i]));
      }
      this.mNoOfRanks = this.canPerformRanking();
    }
    if (bondQueryFeaturesPresent && this.mNoOfRanks < this.mMol.getAtoms_0()) {
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        this.mCanBase[atom].init_0(atom);
        this.mCanBase[atom].add_0(this.mAtomBits, fromInt_0(this.mCanRank[atom]));
        bondQFList = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, this.mMol.getConnAtoms_0(atom) + this.mMol.getMetalBondedConnAtoms_0(atom), 14, 1);
        index_0 = 0;
        for (i0 = 0; i0 < this.mMol.getAllConnAtomsPlusMetalBonds_0(atom); i0++) {
          if (i0 < this.mMol.getConnAtoms_0(atom) || i0 >= this.mMol.getAllConnAtoms_0(atom)) {
            bondQFList[index_0] = fromInt_0(this.mCanRank[this.mMol.getConnAtom_0(atom, i0)]);
            bondQFList[index_0] = shl_0(bondQFList[index_0], 23);
            bondQFList[index_0] = or_0(bondQFList[index_0], fromInt_0(this.mMol.getBondQueryFeatures_0(this.mMol.getConnBond_0(atom, i0))));
            index_0++;
          }
        }
        ju.sort_4(bondQFList);
        for (i1 = this.mMaxConnAtoms; i1 > bondQFList.length; i1--)
          this.mCanBase[atom].add_0(this.mAtomBits + 23, 0);
        for (i = bondQFList.length - 1; i >= 0; i--)
          this.mCanBase[atom].add_0(this.mAtomBits + 23, bondQFList[i]);
      }
      this.mNoOfRanks = this.canPerformRanking();
    }
    if ((this.mMode & 8) != 0 && this.mNoOfRanks < this.mMol.getAtoms_0()) {
      list = new carc2.SortedStringList();
      for (atom3 = 0; atom3 < this.mMol.getAtoms_0(); atom3++)
        if (jsNotEquals(this.mMol.getAtomCustomLabel_0(atom3), null))
          list.addString(this.mMol.getAtomCustomLabel_0(atom3));
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        rank = jsEquals(this.mMol.getAtomCustomLabel_0(atom), null) ? 0 : 1 + list.getListIndex(this.mMol.getAtomCustomLabel_0(atom));
        this.mCanBase[atom].init_0(atom);
        this.mCanBase[atom].add_0(this.mAtomBits, fromInt_0(this.mCanRank[atom]));
        this.mCanBase[atom].add_0(this.mAtomBits, fromInt_0(rank));
      }
      this.mNoOfRanks = this.canPerformRanking();
    }
    if ((this.mMode & 16) != 0 && this.mNoOfRanks < this.mMol.getAtoms_0()) {
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        this.mCanBase[atom].init_0(atom);
        this.mCanBase[atom].add_0(this.mAtomBits, fromInt_0(this.mCanRank[atom]));
        this.mCanBase[atom].add_0(1, fromInt_0(this.mMol.isSelectedAtom_0(atom) ? 1 : 0));
      }
      this.mNoOfRanks = this.canPerformRanking();
    }
    if ((this.mMode & 512) != 0 && this.mMol.isFragment_0())
      this.canBreakFreeValenceAtomTies();
  };
  _.canInnerBreakTiesByHeteroTopicity = function canInnerBreakTiesByHeteroTopicity() {
    var atom, atom0, atom1, found, i, i0, oldRanks, rank, rankedBond;
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
      this.mCanBase[atom0].init_0(atom0);
      this.mCanBase[atom0].add_0(2 * this.mAtomBits + 4, shl_0(fromInt_0(this.mCanRank[atom0]), this.mAtomBits + 4));
    }
    for (rank = 1; rank <= this.mNoOfRanks; rank++) {
      found = false;
      for (atom1 = 0; atom1 < this.mMol.getAtoms_0(); atom1++)
        if (this.mCanRank[atom1] == rank)
          found = found | this.canCalcTHParity(atom1, 2);
      if (found) {
        oldRanks = this.mNoOfRanks;
        this.mNoOfRanks = this.canPerformRanking();
        if (this.mNoOfRanks != oldRanks)
          return true;
        for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
          this.mCanBase[atom].init_0(atom);
          this.mCanBase[atom].add_0(2 * this.mAtomBits + 4, shl_0(fromInt_0(this.mCanRank[atom]), this.mAtomBits + 4));
        }
      }
    }
    rankedBond = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_CanonizerBond_2_classLit, { 4: 1, 1: 1, 7: 1 }, 170, this.mMol.getBonds_0(), 0, 1);
    for (i0 = 0; i0 < rankedBond.length; i0++)
      setCheck(rankedBond, i0, new carc2.CanonizerBond(this.mCanRank[this.mMol.getBondAtom_0(0, i0)], this.mCanRank[this.mMol.getBondAtom_0(1, i0)], i0));
    ju.sort_5(rankedBond);
    for (i = 0; i < rankedBond.length; i++) {
      if (this.canCalcEZParity(rankedBond[i].bond, 2)) {
        while (i + 1 < rankedBond.length && rankedBond[i].compareTo_2(rankedBond[i + 1]) == 0)
          this.canCalcEZParity(rankedBond[++i].bond, 2);
        oldRanks = this.mNoOfRanks;
        this.mNoOfRanks = this.canPerformRanking();
        if (this.mNoOfRanks != oldRanks)
          return true;
        for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
          this.mCanBase[atom].init_0(atom);
          this.mCanBase[atom].add_0(2 * this.mAtomBits + 4, shl_0(fromInt_0(this.mCanRank[atom]), this.mAtomBits + 4));
        }
      }
    }
    return false;
  };
  _.canMarkESRGroupsForParityNormalization = function canMarkESRGroupsForParityNormalization() {
    var atom, atom0, atom1, atomList, count, groupBase, groupID, i, nextGroupBase, parity;
    count = 0;
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++)
      if (this.mTHESRType[atom0] != 0 && (this.mTHESRType[atom0] != 2 || (this.mMode & 256) == 0))
        count++;
    if (count == 0)
      return;
    parity = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, count, 15, 1);
    count = 0;
    for (atom1 = 0; atom1 < this.mMol.getAtoms_0(); atom1++) {
      if (this.mTHESRType[atom1] != 0 && (this.mTHESRType[atom1] != 2 || (this.mMode & 256) == 0)) {
        parity[count] = this.mTHESRType[atom1] << 29 | this.mTHESRGroup[atom1] << 24 | this.mCanRank[atom1] << 12 | atom1;
        count++;
      }
    }
    ju.sort_3(parity);
    groupBase = 0;
    nextGroupBase = 0;
    groupID = parity[0] & -16777216;
    while (true) {
      nextGroupBase++;
      if (nextGroupBase == parity.length || groupID != (parity[nextGroupBase] & -16777216)) {
        atomList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, nextGroupBase - groupBase, 15, 1);
        for (i = groupBase; i < nextGroupBase; i++) {
          atom = parity[i] & 4095;
          atomList[i - groupBase] = atom;
          this.mTHParityNeedsNormalization[atom] = true;
        }
        this.mTHParityNormalizationGroupList.add(atomList);
        if (nextGroupBase == parity.length)
          break;
        groupID = parity[nextGroupBase] & -16777216;
        groupBase = nextGroupBase;
      }
    }
  };
  _.canNormalizeGroupParities = function canNormalizeGroupParities() {
    var allParitiesDetermined, atom, atom$array, atom$index, atom$max, groupAtom, groupNormalized, i, invertParities, isUniqueRank, j, k, maxRank;
    groupNormalized = false;
    for (i = 0; i < this.mTHParityNormalizationGroupList.size(); i++) {
      groupAtom = castTo(this.mTHParityNormalizationGroupList.getAtIndex(i), 6);
      allParitiesDetermined = true;
      maxRank = -1;
      invertParities = false;
      for (j = 0; j < groupAtom.length; j++) {
        atom = groupAtom[j];
        if (this.mTHParity[atom] == 0) {
          allParitiesDetermined = false;
          break;
        }
        if (this.mTHParity[atom] != 3) {
          isUniqueRank = true;
          for (k = 0; k < groupAtom.length; k++) {
            if (k != j && this.mCanRank[atom] == this.mCanRank[groupAtom[k]]) {
              isUniqueRank = false;
              break;
            }
          }
          if (isUniqueRank && maxRank < this.mCanRank[atom]) {
            maxRank = this.mCanRank[atom];
            invertParities = this.mTHParity[atom] == 1;
          }
        }
      }
      if (allParitiesDetermined && maxRank != -1) {
        for (atom$array = groupAtom, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
          atom = atom$array[atom$index];
          if (this.mTHParity[atom] == 1 || this.mTHParity[atom] == 2)
            this.mTHParityIsMesoInverted[atom] = invertParities;
          this.mTHParityNeedsNormalization[atom] = false;
        }
        this.mTHParityNormalizationGroupList.remove(groupAtom);
        groupNormalized = true;
        i--;
      }
    }
    return groupNormalized;
  };
  _.canPerformRanking = function canPerformRanking() {
    var newNoOfRanks, oldNoOfRanks;
    newNoOfRanks = this.canConsolidate();
    do {
      oldNoOfRanks = newNoOfRanks;
      this.canCalcNextBaseValues();
      newNoOfRanks = this.canConsolidate();
    } while (oldNoOfRanks != newNoOfRanks);
    return newNoOfRanks;
  };
  _.canRankFinal = function canRankFinal() {
    if ((this.mMode & 1) != 0 && (this.mMode & 2) == 0) {
      this.mCanRankBeforeTieBreaking = ju.copyOf_9(this.mCanRank, this.mMol.getAtoms_0());
    }
    if ((this.mMode & 2048) == 0) {
      this.mProTHAtomsInSameFragment = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
      this.mProEZAtomsInSameFragment = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 16, 1);
      if (this.mNoOfRanks < this.mMol.getAtoms_0()) {
        this.canBreakTiesByHeteroTopicity();
        if ((this.mMode & 2048) == 0) {
          this.canNormalizeGroupParities();
          if (isNotNull(this.mMesoHelper))
            this.mMesoHelper.normalizeESRGroupSwappingAndRemoval(this.mCanRank);
        }
      }
    }
    if (jsEquals(this.mCanRankBeforeTieBreaking, null) && (this.mMode & 1) != 0 && (this.mMode & 2) != 0)
      this.mCanRankBeforeTieBreaking = ju.copyOf_9(this.mCanRank, this.mMol.getAtoms_0());
    while (this.mNoOfRanks < this.mMol.getAtoms_0()) {
      this.canBreakTiesRandomly();
      if ((this.mMode & 2048) == 0) {
        this.canNormalizeGroupParities();
        if (isNotNull(this.mMesoHelper))
          this.mMesoHelper.normalizeESRGroupSwappingAndRemoval(this.mCanRank);
      }
    }
    if ((this.mMode & 2048) == 0) {
      this.canNormalizeGroupParities();
      this.canFindPseudoParities();
      this.flagStereoProblems();
    }
  };
  _.canRankStereo = function canRankStereo() {
    var atom, atom0, bond, canRankWithoutStereo, noOfRanksWithoutStereo;
    noOfRanksWithoutStereo = this.mNoOfRanks;
    canRankWithoutStereo = ju.copyOf_9(this.mCanRank, this.mMol.getAtoms_0());
    if (!this.mMol.isFragment_0()) {
      this.canRecursivelyFindCIPParities();
      this.initializeParities(noOfRanksWithoutStereo, canRankWithoutStereo);
    }
    this.mTHESRType = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    this.mTHESRGroup = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
      this.mTHESRType[atom0] = narrow_byte(this.mMol.getAtomESRType_0(atom0));
      this.mTHESRGroup[atom0] = narrow_byte(this.mMol.getAtomESRGroup_0(atom0));
    }
    this.mEZESRType = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 15, 1);
    this.mEZESRGroup = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 15, 1);
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      this.mEZESRType[bond] = narrow_byte(this.mMol.getBondESRType_0(bond));
      this.mEZESRGroup[bond] = narrow_byte(this.mMol.getBondESRGroup_0(bond));
    }
    this.canRecursivelyFindAllParities();
    this.mStereoCentersFound = false;
    this.mIsStereoCenter = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mTHParity[atom] != 0) {
        this.mIsStereoCenter[atom] = true;
        this.mStereoCentersFound = true;
      }
    }
    this.canRemoveOverspecifiedESRGroups();
    this.mMesoHelper = null;
    this.mTHESRTypeNeedsNormalization = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    if (this.mStereoCentersFound) {
      this.mMesoHelper = new carc2.CanonizerMesoHelper(this.mMol, canRankWithoutStereo, this.mIsStereoCenter, this.mTHParity, this.mEZParity, this.mTHESRType, this.mTHESRGroup, this.mEZESRType, this.mEZESRGroup, this.mTHParityRoundIsOdd, this.mEZParityRoundIsOdd, this.mTHESRTypeNeedsNormalization);
      this.mMesoHelper.normalizeESRGroups();
    }
    this.mTHParityIsMesoInverted = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    this.mTHParityNeedsNormalization = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    this.mTHParityNormalizationGroupList = new ju.ArrayList();
    if (isNotNull(this.mMesoHelper))
      this.mMesoHelper.normalizeESRGroupSwappingAndRemoval(this.mCanRank);
    this.canMarkESRGroupsForParityNormalization();
    this.initializeParities(noOfRanksWithoutStereo, canRankWithoutStereo);
    this.canRecursivelyFindCanonizedParities();
    if (isNotNull(this.mMesoHelper))
      this.mIsMeso = this.mMesoHelper.isMeso();
    this.determineChirality(canRankWithoutStereo);
  };
  _.canRecursivelyFindAllParities = function canRecursivelyFindAllParities() {
    var atom, bond, ezParityInfo, newNoOfRanks, paritiesFound, parityInfoBits, thParityInfo;
    this.mIsOddParityRound = true;
    paritiesFound = this.canFindParities(false);
    parityInfoBits = 2 + 2 + 5;
    while (this.mNoOfRanks < this.mMol.getAtoms_0() && paritiesFound) {
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        this.mCanBase[atom].init_0(atom);
        this.mCanBase[atom].add_0(this.mAtomBits, fromInt_0(this.mCanRank[atom]));
        thParityInfo = this.mTHParity[atom] << 2 + 5;
        if ((this.mTHParity[atom] == 1 || this.mTHParity[atom] == 2) && this.mTHESRType[atom] != 0) {
          thParityInfo |= this.mTHESRType[atom] << 5;
          thParityInfo |= this.mTHESRGroup[atom];
        }
        this.mCanBase[atom].add_0(2 * 9, shl_0(fromInt_0(thParityInfo), 9));
      }
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
        ezParityInfo = this.mEZParity[bond] << 2 + 5;
        if ((this.mEZParity[bond] == 1 || this.mEZParity[bond] == 2) && this.mMol.getBondType_0(bond) == 1 && this.mEZESRType[bond] != 0) {
          ezParityInfo |= this.mEZESRType[bond] << 5;
          ezParityInfo |= this.mEZESRGroup[bond];
        }
        this.mCanBase[this.mMol.getBondAtom_0(0, bond)].add_1(fromInt_0(ezParityInfo));
        this.mCanBase[this.mMol.getBondAtom_0(1, bond)].add_1(fromInt_0(ezParityInfo));
      }
      newNoOfRanks = this.canPerformRanking();
      if (this.mNoOfRanks == newNoOfRanks)
        break;
      this.mNoOfRanks = newNoOfRanks;
      paritiesFound = this.canFindParities(false);
    }
  };
  _.canRecursivelyFindCIPParities = function canRecursivelyFindCIPParities() {
    var atom, bond, newNoOfRanks, paritiesFound;
    this.mIsOddParityRound = true;
    this.mTHCIPParity = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    this.mEZCIPParity = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 15, 1);
    paritiesFound = this.canFindParities(true);
    while (this.mNoOfRanks < this.mMol.getAtoms_0() && paritiesFound) {
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        this.mCanBase[atom].init_0(atom);
        this.mCanBase[atom].add_0(this.mAtomBits + 4, or_0(shl_0(fromInt_0(this.mCanRank[atom]), 4), fromInt_0(this.mTHParity[atom] << 2)));
      }
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
        this.mCanBase[this.mMol.getBondAtom_0(0, bond)].add_1(fromInt_0(this.mEZParity[bond]));
        this.mCanBase[this.mMol.getBondAtom_0(1, bond)].add_1(fromInt_0(this.mEZParity[bond]));
      }
      newNoOfRanks = this.canPerformRanking();
      if (this.mNoOfRanks == newNoOfRanks)
        break;
      this.mNoOfRanks = newNoOfRanks;
      paritiesFound = this.canFindParities(true);
    }
  };
  _.canRecursivelyFindCanonizedParities = function canRecursivelyFindCanonizedParities() {
    var atom, bond, esrGroupMember, groupRank, newNoOfRanks, newStereoInfoAvailable, parity;
    this.mIsOddParityRound = true;
    esrGroupMember = this.compileESRGroupMembers();
    if (isNotNull(this.mMesoHelper) && this.mMesoHelper.normalizeESRGroupSwappingAndRemoval(this.mCanRank))
      esrGroupMember = this.compileESRGroupMembers();
    if (this.canFindParities(false))
      this.canNormalizeGroupParities();
    newStereoInfoAvailable = true;
    while (this.mNoOfRanks < this.mMol.getAtoms_0() && newStereoInfoAvailable) {
      groupRank = this.canGetESRGroupRank(esrGroupMember);
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        this.mCanBase[atom].init_0(atom);
        this.mCanBase[atom].add_0(this.mAtomBits, fromInt_0(this.mCanRank[atom]));
        this.mCanBase[atom].add_0(20, 0);
        if (!this.mTHESRTypeNeedsNormalization[atom] && this.mTHESRType[atom] != 0)
          this.mCanBase[atom].add_1(add_20(fromInt_0(this.mTHESRType[atom] << 18), shl_0(fromInt_0(groupRank[this.mTHESRType[atom] == 1 ? 0 : 1][this.mTHESRGroup[atom]]), 8)));
        parity = this.mTHParity[atom];
        if (this.mTHParityIsMesoInverted[atom]) {
          if (parity == 1)
            parity = 2;
          else if (parity == 2)
            parity = 1;
        }
        this.mCanBase[atom].add_1(fromInt_0(parity << 4));
      }
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
        this.mCanBase[this.mMol.getBondAtom_0(0, bond)].add_1(fromInt_0(this.mEZParity[bond]));
        this.mCanBase[this.mMol.getBondAtom_0(1, bond)].add_1(fromInt_0(this.mEZParity[bond]));
      }
      newNoOfRanks = this.canPerformRanking();
      if (this.mNoOfRanks == newNoOfRanks)
        break;
      this.mNoOfRanks = newNoOfRanks;
      newStereoInfoAvailable = false;
      if (isNotNull(this.mMesoHelper) && this.mMesoHelper.normalizeESRGroupSwappingAndRemoval(this.mCanRank)) {
        newStereoInfoAvailable = true;
        esrGroupMember = this.compileESRGroupMembers();
      }
      if (this.canFindParities(false)) {
        newStereoInfoAvailable = true;
        this.canNormalizeGroupParities();
      }
    }
  };
  _.canRemoveOverspecifiedESRGroups = function canRemoveOverspecifiedESRGroups() {
    var atom, bond;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++)
      if (!this.mIsStereoCenter[atom] || this.mTHParity[atom] == 3)
        this.mTHESRType[atom] = 0;
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++)
      if (this.mMol.getBondType_0(bond) != 1 || this.mEZParity[bond] == 0 || this.mEZParity[bond] == 3)
        this.mEZESRType[bond] = 0;
  };
  _.canSetAbnormalValence = function canSetAbnormalValence(atom, valence) {
    if (jsEquals(this.mAbnormalValence, null)) {
      this.mAbnormalValence = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
      ju.fill(this.mAbnormalValence, narrow_byte(-1));
    }
    this.mAbnormalValence[atom] = narrow_byte(valence);
  };
  _.cipCalcEZParity = function cipCalcEZParity(bond) {
    var bondAtom, connAtom, count, e, i, invertedOrder, j;
    if ((this.mEZParity[bond] == 1 || this.mEZParity[bond] == 2) && !this.mMol.isSmallRingBond_0(bond)) {
      invertedOrder = false;
      try {
        for (i = 0; i < 2; i++) {
          bondAtom = this.mMol.getBondAtom_0(i, bond);
          if (this.mMol.getConnAtoms_0(bondAtom) == 3) {
            connAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
            count = 0;
            for (j = 0; j < this.mMol.getConnAtoms_0(bondAtom); j++)
              if (this.mMol.getConnBond_0(bondAtom, j) != bond)
                connAtom[count++] = this.mMol.getConnAtom_0(bondAtom, j);
            if (this.mCanRank[connAtom[0]] > this.mCanRank[connAtom[1]] ^ this.cipComparePriority(bondAtom, connAtom[0], connAtom[1]))
              invertedOrder = !invertedOrder;
          }
        }
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          this.mEZCIPParity[bond] = 3;
          return;
        } else
          throw toJs($e0);
      }
      if (this.mEZParity[bond] == 1 ^ invertedOrder)
        this.mEZCIPParity[bond] = 1;
      else
        this.mEZCIPParity[bond] = 2;
    }
  };
  _.cipCalcTHParity = function cipCalcTHParity(atom) {
    var alleneAtom, cipConnAtom, connAtom, count, e, i, invertedOrder, j;
    if (this.mTHParity[atom] == 1 || this.mTHParity[atom] == 2) {
      invertedOrder = false;
      if (this.mMol.getAtomPi_0(atom) == 2 && this.mMol.getConnAtoms_0(atom) == 2) {
        try {
          for (i = 0; i < 2; i++) {
            alleneAtom = this.mMol.getConnAtom_0(atom, i);
            if (this.mMol.getConnAtoms_0(alleneAtom) == 3) {
              connAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
              count = 0;
              for (j = 0; j < this.mMol.getConnAtoms_0(alleneAtom); j++)
                if (this.mMol.getConnBondOrder_0(alleneAtom, j) == 1)
                  connAtom[count++] = this.mMol.getConnAtom_0(alleneAtom, j);
              if (this.mCanRank[connAtom[0]] > this.mCanRank[connAtom[1]] ^ this.cipComparePriority(alleneAtom, connAtom[0], connAtom[1]))
                invertedOrder = !invertedOrder;
            }
          }
        } catch ($e0) {
          $e0 = toJava($e0);
          if (instanceOf($e0, 12)) {
            e = $e0;
            this.mTHCIPParity[atom] = 3;
            return;
          } else
            throw toJs($e0);
        }
      } else {
        try {
          cipConnAtom = this.cipGetOrderedConns(atom);
        } catch ($e1) {
          $e1 = toJava($e1);
          if (instanceOf($e1, 12)) {
            e = $e1;
            this.mTHCIPParity[atom] = 3;
            return;
          } else
            throw toJs($e1);
        }
        for (i = 1; i < cipConnAtom.length; i++)
          for (j = 0; j < i; j++)
            if (this.mCanRank[cipConnAtom[i]] < this.mCanRank[cipConnAtom[j]])
              invertedOrder = !invertedOrder;
      }
      if (this.mTHParity[atom] == 1 ^ invertedOrder)
        this.mTHCIPParity[atom] = 1;
      else
        this.mTHCIPParity[atom] = 2;
    }
  };
  _.cipComparePriority = function cipComparePriority(rootAtom, atom1, atom2) {
    var atom, atom0, atom3, atomInParentChain, atomUsed, bond, candidate, cipRank, current, currentAtom, currentLevel, delocalizedBondCount, delocalizedMeanAtomicNo, ezDataFound, graphAtom, graphIsPseudo, graphParent, graphRank, graphSize, highest, i, i0, isotopDataFound, j, levelStart, mass1, mass2, parent_0, parentGraphIndex, rsDataFound;
    if (this.mMol.getAtomicNo_0(atom1) != this.mMol.getAtomicNo_0(atom2))
      return this.mMol.getAtomicNo_0(atom1) > this.mMol.getAtomicNo_0(atom2);
    if (this.mMol.getAtomMass_0(atom1) != this.mMol.getAtomMass_0(atom2)) {
      mass1 = this.mMol.isNaturalAbundance_0(atom1) ? (carc2.$clinit_Molecule(), carc2.cRoundedMass)[this.mMol.getAtomicNo_0(atom1)] : this.mMol.getAtomMass_0(atom1);
      mass2 = this.mMol.isNaturalAbundance_0(atom2) ? (carc2.$clinit_Molecule(), carc2.cRoundedMass)[this.mMol.getAtomicNo_0(atom2)] : this.mMol.getAtomMass_0(atom2);
      return mass1 > mass2;
    }
    graphSize = this.mMol.getAtoms_0();
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, graphSize, 15, 1);
    graphParent = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, graphSize, 15, 1);
    graphRank = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, graphSize, 15, 1);
    graphIsPseudo = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, graphSize, 16, 1);
    atomUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 16, 1);
    graphAtom[0] = rootAtom;
    graphAtom[1] = atom1;
    graphAtom[2] = atom2;
    graphParent[0] = -1;
    graphParent[1] = 0;
    graphParent[2] = 0;
    atomUsed[rootAtom] = true;
    atomUsed[atom1] = true;
    atomUsed[atom2] = true;
    current = 1;
    highest = 2;
    levelStart = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 64, 15, 1);
    levelStart[1] = 1;
    levelStart[2] = 3;
    currentLevel = 2;
    while (current <= highest) {
      while (current < levelStart[currentLevel]) {
        currentAtom = graphAtom[current];
        if (!graphIsPseudo[current]) {
          delocalizedBondCount = 0;
          delocalizedMeanAtomicNo = 0;
          for (i0 = 0; i0 < this.mMol.getConnAtoms_0(currentAtom); i0++) {
            candidate = this.mMol.getConnAtom_0(currentAtom, i0);
            if (highest + this.mMol.getConnBondOrder_0(currentAtom, i0) + 1 >= graphSize) {
              graphSize += this.mMol.getAtoms_0();
              graphAtom = this.resize(graphAtom, graphSize);
              graphParent = this.resize(graphParent, graphSize);
              graphRank = this.resize(graphRank, graphSize);
              graphIsPseudo = this.resize_0(graphIsPseudo, graphSize);
            }
            if (this.mMol.isDelocalizedBond_0(this.mMol.getConnBond_0(currentAtom, i0))) {
              delocalizedBondCount++;
              delocalizedMeanAtomicNo += this.mMol.getAtomicNo_0(candidate);
            } else if (candidate != rootAtom) {
              for (j = 1; j < this.mMol.getConnBondOrder_0(currentAtom, i0); j++) {
                highest++;
                graphAtom[highest] = candidate;
                graphParent[highest] = current;
                graphIsPseudo[highest] = true;
              }
            }
            parentGraphIndex = graphParent[current];
            if (candidate == graphAtom[parentGraphIndex])
              continue;
            atomInParentChain = false;
            if (atomUsed[candidate]) {
              parent_0 = graphParent[parentGraphIndex];
              while (parent_0 != -1) {
                if (candidate == graphAtom[parent_0]) {
                  atomInParentChain = true;
                  break;
                }
                parent_0 = graphParent[parent_0];
              }
            }
            if (atomInParentChain) {
              highest++;
              graphAtom[highest] = candidate;
              graphParent[highest] = current;
              graphIsPseudo[highest] = true;
            } else {
              highest++;
              graphAtom[highest] = candidate;
              graphParent[highest] = current;
              atomUsed[candidate] = true;
            }
          }
          if (delocalizedBondCount != 0) {
            highest++;
            graphRank[highest] = narrow_int((delocalizedMeanAtomicNo << 2) / delocalizedBondCount);
            graphParent[highest] = current;
            graphIsPseudo[highest] = true;
          }
        }
        current++;
        if (current == 1e4) {
          throw toJs(new jl.Exception_1("Emergency break in while loop."));
        }
      }
      if (levelStart.length == currentLevel + 1)
        levelStart = this.resize(levelStart, levelStart.length + 64);
      levelStart[currentLevel + 1] = highest + 1;
      for (i = levelStart[currentLevel]; i < levelStart[currentLevel + 1]; i++) {
        if (graphRank[i] == 0)
          graphRank[i] = (this.mMol.getAtomicNo_0(graphAtom[i]) == 151 ? 1 : this.mMol.getAtomicNo_0(graphAtom[i]) == 152 ? 1 : this.mMol.getAtomicNo_0(graphAtom[i])) << 2;
        graphRank[i] += graphRank[graphParent[i]] << 16;
      }
      this.cipUpdateParentRanking(graphIsPseudo, graphRank, graphParent, graphAtom, levelStart, currentLevel);
      if (graphRank[1] != graphRank[2])
        return graphRank[1] > graphRank[2];
      if (currentLevel > 1)
        this.cipCompileRelativeRanks(graphRank, graphParent, levelStart, currentLevel);
      currentLevel++;
    }
    cipRank = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    isotopDataFound = false;
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
      if (atomUsed[atom0] && !this.mMol.isNaturalAbundance_0(atom0)) {
        isotopDataFound = true;
        break;
      }
    }
    if (isotopDataFound) {
      for (atom3 = 0; atom3 < this.mMol.getAtoms_0(); atom3++)
        cipRank[atom3] = this.mMol.isNaturalAbundance_0(atom3) ? (carc2.$clinit_Molecule(), carc2.cRoundedMass)[this.mMol.getAtomicNo_0(atom3)] : this.mMol.getAtomMass_0(atom3);
      if (this.cipTryDistinguishBranches(graphIsPseudo, graphRank, graphParent, graphAtom, cipRank, levelStart, currentLevel))
        return graphRank[1] > graphRank[2];
    }
    ju.fill_0(cipRank, 0);
    ezDataFound = false;
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      if (atomUsed[this.mMol.getBondAtom_0(0, bond)] || atomUsed[this.mMol.getBondAtom_0(1, bond)]) {
        if (this.mEZCIPParity[bond] == 1) {
          cipRank[this.mMol.getBondAtom_0(0, bond)] = 1;
          cipRank[this.mMol.getBondAtom_0(1, bond)] = 1;
          ezDataFound = true;
        } else if (this.mEZCIPParity[bond] == 2) {
          cipRank[this.mMol.getBondAtom_0(0, bond)] = 2;
          cipRank[this.mMol.getBondAtom_0(1, bond)] = 2;
          ezDataFound = true;
        }
      }
    }
    if (ezDataFound && this.cipTryDistinguishBranches(graphIsPseudo, graphRank, graphParent, graphAtom, cipRank, levelStart, currentLevel))
      return graphRank[1] > graphRank[2];
    ju.fill_0(cipRank, 0);
    rsDataFound = false;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (atomUsed[atom]) {
        if (this.mTHCIPParity[atom] == 2) {
          cipRank[atom] = 1;
          rsDataFound = true;
        } else if (this.mTHCIPParity[atom] == 1) {
          cipRank[atom] = 2;
          rsDataFound = true;
        }
      }
    }
    if (rsDataFound && this.cipTryDistinguishBranches(graphIsPseudo, graphRank, graphParent, graphAtom, cipRank, levelStart, currentLevel))
      return graphRank[1] > graphRank[2];
    this.mCIPParityNoDistinctionProblem = true;
    throw toJs(new jl.Exception_1("no distinction applying CIP rules"));
  };
  _.cipCompileRelativeRanks = function cipCompileRelativeRanks(graphRank, graphParent, levelStart, currentLevel) {
    var comparator, consolidatedRank, count, i, i0, i1, level, levelOffset, rankObject;
    levelOffset = levelStart[currentLevel];
    count = levelStart[currentLevel + 1] - levelOffset;
    rankObject = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_Canonizer$2RankObject_2_classLit, { 4: 1, 1: 1, 7: 1 }, 155, count, 0, 1);
    for (i0 = 0; i0 < count; i0++) {
      setCheck(rankObject, i0, new carc2.Canonizer$2RankObject(this));
      rankObject[i0].rank = graphRank[i0 + levelOffset];
      rankObject[i0].parent_0 = graphParent[i0 + levelOffset];
      rankObject[i0].index_0 = i0 + levelOffset;
    }
    comparator = new carc2.Canonizer$2(this);
    for (level = currentLevel; level > 1; level--) {
      for (i1 = 0; i1 < count; i1++) {
        rankObject[i1].rank += graphRank[rankObject[i1].parent_0] << 16;
        rankObject[i1].parent_0 = graphParent[rankObject[i1].parent_0];
      }
      ju.sort_7(rankObject, comparator);
      consolidatedRank = 1;
      for (i = 0; i < count; i++) {
        graphRank[rankObject[i].index_0] = consolidatedRank;
        if (i != count - 1 && comparator.compare_0(rankObject[i], rankObject[i + 1]) != 0)
          consolidatedRank++;
      }
    }
  };
  _.cipGetOrderedConns = function cipGetOrderedConns(atom) {
    var found, i, i0, j, noOfConns, orderedConn, temp;
    noOfConns = this.mMol.getAllConnAtoms_0(atom);
    orderedConn = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, noOfConns, 15, 1);
    for (i0 = 0; i0 < noOfConns; i0++)
      orderedConn[i0] = this.mMol.getConnAtom_0(atom, i0);
    for (i = noOfConns; i > 1; i--) {
      found = false;
      for (j = 1; j < i; j++) {
        if (this.cipComparePriority(atom, orderedConn[j - 1], orderedConn[j])) {
          found = true;
          temp = orderedConn[j - 1];
          orderedConn[j - 1] = orderedConn[j];
          orderedConn[j] = temp;
        }
      }
      if (!found)
        break;
    }
    return orderedConn;
  };
  _.cipTryDistinguishBranches = function cipTryDistinguishBranches(graphIsPseudo, graphRank, graphParent, graphAtom, cipRank, levelStart, currentLevel) {
    var i, level;
    for (level = 1; level < currentLevel; level++) {
      for (i = levelStart[level]; i < levelStart[level + 1]; i++)
        graphRank[i] = cipRank[graphAtom[i]] + (graphRank[graphParent[i]] << 8);
      this.cipUpdateParentRanking(graphIsPseudo, graphRank, graphParent, graphAtom, levelStart, level);
      if (graphRank[1] != graphRank[2])
        return true;
      if (level > 1)
        this.cipCompileRelativeRanks(graphRank, graphParent, levelStart, level);
    }
    return false;
  };
  _.cipUpdateParentRanking = function cipUpdateParentRanking(graphIsPseudo, graphRank, graphParent, graphAtom, levelStart, currentLevel) {
    var baseIndex, comparator, consolidatedRank, i, level, nextBaseIndex, parent_0, parent0, parentCount, parentIndex, rankObject;
    for (level = currentLevel; level > 1; level--) {
      parentCount = levelStart[level] - levelStart[level - 1];
      rankObject = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_Canonizer$1RankObject_2_classLit, { 4: 1, 1: 1, 7: 1 }, 154, parentCount, 0, 1);
      baseIndex = levelStart[level];
      for (parent0 = 0; parent0 < parentCount; parent0++) {
        parentIndex = levelStart[level - 1] + parent0;
        nextBaseIndex = baseIndex;
        while (nextBaseIndex < levelStart[level + 1] && graphParent[nextBaseIndex] == parentIndex)
          nextBaseIndex++;
        setCheck(rankObject, parent0, new carc2.Canonizer$1RankObject(this));
        rankObject[parent0].parentIndex = parentIndex;
        rankObject[parent0].parentRank = graphRank[parentIndex];
        rankObject[parent0].parentHCount = graphIsPseudo[parentIndex] ? 0 : this.mMol.getPlainHydrogens(graphAtom[parentIndex]);
        rankObject[parent0].childRank = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, nextBaseIndex - baseIndex, 15, 1);
        for (i = baseIndex; i < nextBaseIndex; i++)
          rankObject[parent0].childRank[i - baseIndex] = graphRank[i];
        ju.sort_3(rankObject[parent0].childRank);
        baseIndex = nextBaseIndex;
      }
      comparator = new carc2.Canonizer$1(this);
      ju.sort_7(rankObject, comparator);
      consolidatedRank = 1;
      for (parent_0 = 0; parent_0 < parentCount; parent_0++) {
        graphRank[rankObject[parent_0].parentIndex] = consolidatedRank;
        if (parent_0 != parentCount - 1 && comparator.compare_0(rankObject[parent_0], rankObject[parent_0 + 1]) != 0)
          consolidatedRank++;
      }
    }
  };
  _.compileESRGroupMembers = function compileESRGroupMembers() {
    var atom, esrGroupMember;
    esrGroupMember = initMultidimensionalArray(cggl.I_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 25: 1, 4: 1, 1: 1, 7: 1 }], [25, 6], 0, [2, 32], 2);
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mIsStereoCenter[atom]) {
        if (this.mTHESRType[atom] == 1)
          esrGroupMember[0][this.mTHESRGroup[atom]] = carc2.addToIntArray(esrGroupMember[0][this.mTHESRGroup[atom]], atom);
        else if (this.mTHESRType[atom] == 2)
          esrGroupMember[1][this.mTHESRGroup[atom]] = carc2.addToIntArray(esrGroupMember[0][this.mTHESRGroup[atom]], atom);
      }
    }
    return esrGroupMember;
  };
  _.determineChirality = function determineChirality(canRankWithoutStereo) {
    var andGroupUsed, atom, bond, group, stereoCenters, stereoCentersTypeAbs, stereoCentersTypeAbsInMesoFragment, stereoCentersTypeAndGroup0, stereoCentersTypeOrGroup0, stereoCentersUnknown, typeAndGroups, typeAndInMesoFragmentFound;
    stereoCenters = 0;
    stereoCentersUnknown = 0;
    stereoCentersTypeAbs = 0;
    stereoCentersTypeAbsInMesoFragment = 0;
    stereoCentersTypeAndGroup0 = 0;
    stereoCentersTypeOrGroup0 = 0;
    typeAndGroups = 0;
    typeAndInMesoFragmentFound = false;
    andGroupUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, 32, 16, 1);
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mTHParity[atom] != 0) {
        stereoCenters++;
        if (this.mTHParity[atom] == 3) {
          stereoCentersUnknown++;
        } else {
          if (this.mTHESRType[atom] == 0) {
            stereoCentersTypeAbs++;
            if (isNotNull(this.mMesoHelper) && this.mMesoHelper.isInMesoFragment(atom))
              stereoCentersTypeAbsInMesoFragment++;
          } else if (this.mTHESRType[atom] == 2) {
            if (this.mTHESRGroup[atom] == 0)
              stereoCentersTypeOrGroup0++;
          } else if (this.mTHESRType[atom] == 1) {
            group = this.mTHESRGroup[atom];
            if (!andGroupUsed[group]) {
              typeAndGroups++;
              andGroupUsed[group] = true;
            }
            if (this.mTHESRGroup[atom] == 0)
              stereoCentersTypeAndGroup0++;
            if (isNotNull(this.mMesoHelper) && this.mMesoHelper.isInMesoFragment(atom))
              typeAndInMesoFragmentFound = true;
          }
        }
      }
    }
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      if (this.mEZParity[bond] != 0 && this.mMol.getBondType_0(bond) == 1) {
        stereoCenters++;
        if (this.mEZParity[bond] == 3) {
          stereoCentersUnknown++;
        } else {
          if (this.mEZESRType[bond] == 0) {
            stereoCentersTypeAbs++;
            if (isNotNull(this.mMesoHelper) && this.mMesoHelper.isInMesoFragment(this.mMol.getBondAtom_0(0, bond)) && this.mMesoHelper.isInMesoFragment(this.mMol.getBondAtom_0(1, bond)))
              stereoCentersTypeAbsInMesoFragment++;
          } else if (this.mEZESRType[bond] == 2) {
            if (this.mEZESRGroup[bond] == 0)
              stereoCentersTypeOrGroup0++;
          } else if (this.mEZESRType[bond] == 1) {
            group = this.mEZESRGroup[bond];
            if (!andGroupUsed[group]) {
              typeAndGroups++;
              andGroupUsed[group] = true;
            }
            if (this.mEZESRGroup[bond] == 0)
              stereoCentersTypeAndGroup0++;
            if (isNotNull(this.mMesoHelper) && this.mMesoHelper.isInMesoFragment(this.mMol.getBondAtom_0(0, bond)) && this.mMesoHelper.isInMesoFragment(this.mMol.getBondAtom_0(1, bond)))
              typeAndInMesoFragmentFound = true;
          }
        }
      }
    }
    if (stereoCenters == 0) {
      this.mMol.setChirality_0(65536);
      return;
    }
    if (stereoCentersUnknown != 0) {
      this.mMol.setChirality_0(0);
      return;
    }
    if (this.mIsMeso) {
      this.mMol.setChirality_0(131072 + (1 << typeAndGroups));
      return;
    }
    if (stereoCentersTypeAndGroup0 + stereoCentersTypeAbsInMesoFragment == stereoCenters && !typeAndInMesoFragmentFound) {
      this.mMol.setChirality_0(196608);
    } else if (stereoCentersTypeAbs == stereoCenters) {
      this.mMol.setChirality_0(262144);
    } else if (stereoCentersTypeOrGroup0 == stereoCenters) {
      this.mMol.setChirality_0(327680);
    } else if (stereoCentersTypeAbs == stereoCenters - 1 && stereoCentersTypeAndGroup0 == 1) {
      this.mMol.setChirality_0(393216);
    } else {
      this.mMol.setChirality_0(458752 + (1 << typeAndGroups));
    }
  };
  _.encodeABVL = function encodeABVL(value_0, binCount) {
    return $wnd.Math.min(binCount - 1, $wnd.Math.max(0, round_int(0.5 + jl.log10(value_0 / 0.1) / jl.log10(200 / 0.1) * (binCount - 1))));
  };
  _.encodeBits = function encodeBits(data_0, bits) {
    while (bits != 0) {
      if (this.mEncodingBitsAvail == 0) {
        if (!this.mEncodeAvoid127 || this.mEncodingTempData != 63)
          this.mEncodingTempData += 64;
        this.mEncodingBuffer.append_4(narrow_char(this.mEncodingTempData));
        this.mEncodingBitsAvail = 6;
        this.mEncodingTempData = 0;
      }
      this.mEncodingTempData <<= 1;
      this.mEncodingTempData = toInt_0(or_0(fromInt_0(this.mEncodingTempData), and_0(data_0, 1)));
      data_0 = shr_0(data_0, 1);
      bits--;
      this.mEncodingBitsAvail--;
    }
  };
  _.encodeBitsEnd = function encodeBitsEnd() {
    this.mEncodingTempData <<= this.mEncodingBitsAvail;
    if (!this.mEncodeAvoid127 || this.mEncodingTempData != 63)
      this.mEncodingTempData += 64;
    this.mEncodingBuffer.append_4(narrow_char(this.mEncodingTempData));
    return this.mEncodingBuffer.toString_0();
  };
  _.encodeBitsStart = function encodeBitsStart(avoid127) {
    this.mEncodingBuffer = new jl.StringBuilder();
    this.mEncodingBitsAvail = 6;
    this.mEncodingTempData = 0;
    this.mEncodeAvoid127 = avoid127;
  };
  _.encodeCoordinates = function encodeCoordinates(keepPositionAndScale, coords) {
    var atom, avbl, avblDefault, binCount, i, i0, i1, i2, includeHydrogenCoordinates, increment, j, maxDelta, maxDeltaPlusHalfIncrement, resolutionBits;
    if (this.mMol.getAtoms_0() == 0) {
      this.mEncodedCoords = "";
      return;
    }
    includeHydrogenCoordinates = this.mZCoordinatesAvailable & this.mAllHydrogensAreExplicit;
    resolutionBits = this.mZCoordinatesAvailable ? 16 : 8;
    this.encodeBitsStart(true);
    this.mEncodingBuffer.append_4(includeHydrogenCoordinates ? 35 : 33);
    this.encodeBits(fromInt_0(this.mZCoordinatesAvailable ? 1 : 0), 1);
    this.encodeBits(fromInt_0(keepPositionAndScale ? 1 : 0), 1);
    this.encodeBits(fromInt_0(resolutionBits >> 1), 4);
    maxDelta = 0;
    for (i0 = 1; i0 < this.mMol.getAtoms_0(); i0++)
      maxDelta = this.getMaxDelta(this.mGraphAtom[i0], this.mGraphFrom[i0] == -1 ? -1 : this.mGraphAtom[this.mGraphFrom[i0]], maxDelta, coords);
    if (includeHydrogenCoordinates) {
      for (i1 = 0; i1 < this.mMol.getAtoms_0(); i1++) {
        atom = this.mGraphAtom[i1];
        for (j = this.mMol.getConnAtoms_0(atom); j < this.mMol.getAllConnAtoms_0(atom); j++)
          maxDelta = this.getMaxDelta(this.mMol.getConnAtom_0(atom, j), atom, maxDelta, coords);
      }
    }
    if (this.mMol.getAtoms_0() > 1 && maxDelta == 0) {
      this.mEncodedCoords = "";
      return;
    }
    binCount = 1 << resolutionBits;
    increment = maxDelta / ((binCount >> 1) - 1);
    maxDeltaPlusHalfIncrement = maxDelta + 0.5 * increment;
    for (i2 = 1; i2 < this.mMol.getAtoms_0(); i2++)
      this.encodeCoords(this.mGraphAtom[i2], this.mGraphFrom[i2] == -1 ? -1 : this.mGraphAtom[this.mGraphFrom[i2]], maxDeltaPlusHalfIncrement, increment, resolutionBits, coords);
    if (includeHydrogenCoordinates) {
      for (i = 0; i < this.mMol.getAtoms_0(); i++) {
        atom = this.mGraphAtom[i];
        for (j = this.mMol.getConnAtoms_0(atom); j < this.mMol.getAllConnAtoms_0(atom); j++)
          this.encodeCoords(this.mMol.getConnAtom_0(atom, j), atom, maxDeltaPlusHalfIncrement, increment, resolutionBits, coords);
      }
    }
    if (keepPositionAndScale) {
      avblDefault = this.mZCoordinatesAvailable ? 1.5 : carc2.getDefaultAverageBondLength();
      avbl = this.mMol.getAverageBondLength_4(includeHydrogenCoordinates ? this.mMol.getAllAtoms_0() : this.mMol.getAtoms_0(), includeHydrogenCoordinates ? this.mMol.getAllBonds_0() : this.mMol.getBonds_0(), avblDefault, coords);
      this.encodeBits(fromInt_0(this.encodeABVL(avbl, binCount)), resolutionBits);
      this.encodeBits(fromInt_0(this.encodeShift(coords[this.mGraphAtom[0]].x_0 / avbl, binCount)), resolutionBits);
      this.encodeBits(fromInt_0(this.encodeShift(coords[this.mGraphAtom[0]].y_0 / avbl, binCount)), resolutionBits);
      if (this.mZCoordinatesAvailable)
        this.encodeBits(fromInt_0(this.encodeShift(coords[this.mGraphAtom[0]].z_0 / avbl, binCount)), resolutionBits);
    }
    this.mEncodedCoords = this.encodeBitsEnd();
  };
  _.encodeCoords = function encodeCoords(atom, from, maxDeltaPlusHalfIncrement, increment, resolutionBits, coords) {
    var deltaX, deltaY, deltaZ;
    deltaX = from == -1 ? (coords[atom].x_0 - coords[this.mGraphAtom[0]].x_0) / 8 : coords[atom].x_0 - coords[from].x_0;
    deltaY = from == -1 ? (coords[atom].y_0 - coords[this.mGraphAtom[0]].y_0) / 8 : coords[atom].y_0 - coords[from].y_0;
    this.encodeBits(fromInt_0(round_int((maxDeltaPlusHalfIncrement + deltaX) / increment)), resolutionBits);
    this.encodeBits(fromInt_0(round_int((maxDeltaPlusHalfIncrement + deltaY) / increment)), resolutionBits);
    if (this.mZCoordinatesAvailable) {
      deltaZ = from == -1 ? (coords[atom].z_0 - coords[this.mGraphAtom[0]].z_0) / 8 : coords[atom].z_0 - coords[from].z_0;
      this.encodeBits(fromInt_0(round_int((maxDeltaPlusHalfIncrement + deltaZ) / increment)), resolutionBits);
    }
  };
  _.encodeFeatureNo = function encodeFeatureNo(codeNo) {
    var i;
    for (i = 0; i < this.mFeatureBlock; i++)
      codeNo -= 16;
    if (codeNo < 0)
      (jl.$clinit_System(), jl.out_0).println_0("ERROR in Canonizer: Code unexpectedly low.");
    while (codeNo > 15) {
      this.encodeBits(1, 1);
      this.encodeBits(15, 4);
      codeNo -= 16;
      this.mFeatureBlock++;
    }
    this.encodeBits(1, 1);
    this.encodeBits(fromInt_0(codeNo), 4);
  };
  _.encodeMapping = function encodeMapping() {
    var atom, atom0, autoMappingFound, manualMappingFound, maxMapNo, nbits;
    if (this.mMol.getAtoms_0() == 0) {
      this.mMapping = "";
      return;
    }
    maxMapNo = 0;
    autoMappingFound = false;
    manualMappingFound = false;
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
      if (maxMapNo < this.mMol.getAtomMapNo_0(atom0))
        maxMapNo = this.mMol.getAtomMapNo_0(atom0);
      if (this.mMol.isAutoMappedAtom_0(atom0))
        autoMappingFound = true;
      else
        manualMappingFound = true;
    }
    if (maxMapNo == 0) {
      this.mMapping = "";
      return;
    }
    nbits = carc2.getNeededBits(maxMapNo);
    this.encodeBitsStart(true);
    this.encodeBits(fromInt_0(nbits), 4);
    this.encodeBits(fromInt_0(autoMappingFound ? 1 : 0), 1);
    this.encodeBits(fromInt_0(manualMappingFound ? 1 : 0), 1);
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      this.encodeBits(fromInt_0(this.mMol.getAtomMapNo_0(this.mGraphAtom[atom])), nbits);
      if (autoMappingFound && manualMappingFound)
        this.encodeBits(fromInt_0(this.mMol.isAutoMappedAtom_0(this.mGraphAtom[atom]) ? 1 : 0), 1);
    }
    this.mMapping = this.encodeBitsEnd();
  };
  _.encodeShift = function encodeShift(value_0, binCount) {
    var halfBinCount, intValue, isNegative, steepness;
    halfBinCount = narrow_int(binCount / 2);
    isNegative = value_0 < 0;
    value_0 = $wnd.Math.abs(value_0);
    steepness = narrow_int(binCount / 32);
    intValue = $wnd.Math.min(halfBinCount - 1, toInt_0(jl.round_1(value_0 * halfBinCount / (value_0 + steepness))));
    return isNegative ? halfBinCount + intValue : intValue;
  };
  _.flagStereoProblems = function flagStereoProblems() {
    var atom, bond, bond0;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mTHParity[atom] == 3 && !this.mMol.isAtomConfigurationUnknown_0(atom))
        this.mMol.setStereoProblem(atom);
      if ((this.mMol.getAtomESRType_0(atom) == 1 || this.mMol.getAtomESRType_0(atom) == 2) && this.mTHParity[atom] == 3)
        this.mMol.setStereoProblem(atom);
      if (this.mMol.isAtomConfigurationUnknown_0(atom) && this.mTHParity[atom] != 3 && !this.isUnknownBINAPBondAtom(atom))
        this.mMol.setStereoProblem(atom);
    }
    for (bond0 = 0; bond0 < this.mMol.getAllBonds_0(); bond0++)
      if (this.mMol.isStereoBond_0(bond0) && !this.isJustifiedStereoBond(bond0))
        this.mMol.setStereoProblem(this.mMol.getBondAtom_0(0, bond0));
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      if (this.mMol.getBondOrder_0(bond) == 2) {
        if (this.mMol.isBondParityUnknownOrNone_0(bond) && (this.mEZParity[bond] == 1 || this.mEZParity[bond] == 2)) {
          this.mEZParity[bond] = 3;
          this.mMol.setBondType_0(bond, 386);
        }
        if (this.mEZParity[bond] == 3 && !this.mEZParityIsPseudo[bond]) {
          if (this.mMol.getBondType_0(bond) != 386) {
            this.mMol.setStereoProblem(this.mMol.getBondAtom_0(0, bond));
            this.mMol.setStereoProblem(this.mMol.getBondAtom_0(1, bond));
          }
        }
      }
      if (this.mMol.getBondType_0(bond) == 1 && this.mEZParity[bond] == 3 && !this.mMol.isAtomConfigurationUnknown_0(this.mMol.getBondAtom_0(0, bond)) && !this.mMol.isAtomConfigurationUnknown_0(this.mMol.getBondAtom_0(1, bond))) {
        this.mMol.setStereoProblem(this.mMol.getBondAtom_0(0, bond));
        this.mMol.setStereoProblem(this.mMol.getBondAtom_0(1, bond));
      }
      if ((this.mMol.getBondESRType_0(bond) == 1 || this.mMol.getBondESRType_0(bond) == 2) && (this.mMol.getBondType_0(bond) != 1 || this.mEZParity[bond] != 1 && this.mEZParity[bond] != 2)) {
        this.mMol.setStereoProblem(this.mMol.getBondAtom_0(0, bond));
        this.mMol.setStereoProblem(this.mMol.getBondAtom_0(1, bond));
      }
    }
  };
  _.generateGraph = function generateGraph() {
    var atom, atom0, atomHandled, atomsWithoutParents, bond, bondHandled, connAtom, firstUnhandled, firstUnused, graphBonds, hiAtom, highestRank, highestRankingAtom, highestRankingConnAtom, highestRankingConnBond, i, loAtom, lowAtomNo1, lowAtomNo2, lowBond, startAtom;
    if (this.mMol.getAtoms_0() == 0)
      return;
    if (this.mGraphGenerated)
      return;
    this.mGraphRings = 0;
    startAtom = 0;
    for (atom0 = 1; atom0 < this.mMol.getAtoms_0(); atom0++)
      if (this.mCanRank[atom0] > this.mCanRank[startAtom])
        startAtom = atom0;
    atomHandled = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    bondHandled = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 16, 1);
    this.mGraphIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    this.mGraphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    this.mGraphFrom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    this.mGraphBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 15, 1);
    this.mGraphAtom[0] = startAtom;
    this.mGraphIndex[startAtom] = 0;
    atomHandled[startAtom] = true;
    atomsWithoutParents = 1;
    firstUnhandled = 0;
    firstUnused = 1;
    graphBonds = 0;
    while (firstUnhandled < this.mMol.getAtoms_0()) {
      if (firstUnhandled < firstUnused) {
        while (true) {
          highestRankingConnAtom = 0;
          highestRankingConnBond = 0;
          highestRank = -1;
          atom = this.mGraphAtom[firstUnhandled];
          for (i = 0; i < this.mMol.getAllConnAtomsPlusMetalBonds_0(atom); i++) {
            if (i < this.mMol.getConnAtoms_0(atom) || i >= this.mMol.getAllConnAtoms_0(atom)) {
              connAtom = this.mMol.getConnAtom_0(atom, i);
              if (!atomHandled[connAtom] && this.mCanRank[connAtom] > highestRank) {
                highestRankingConnAtom = connAtom;
                highestRankingConnBond = this.mMol.getConnBond_0(atom, i);
                highestRank = this.mCanRank[connAtom];
              }
            }
          }
          if (highestRank == -1)
            break;
          this.mGraphIndex[highestRankingConnAtom] = firstUnused;
          this.mGraphFrom[firstUnused] = firstUnhandled;
          this.mGraphAtom[firstUnused++] = highestRankingConnAtom;
          this.mGraphBond[graphBonds++] = highestRankingConnBond;
          atomHandled[highestRankingConnAtom] = true;
          bondHandled[highestRankingConnBond] = true;
        }
        firstUnhandled++;
      } else {
        highestRankingAtom = 0;
        highestRank = -1;
        for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
          if (!atomHandled[atom] && this.mCanRank[atom] > highestRank) {
            highestRankingAtom = atom;
            highestRank = this.mCanRank[atom];
          }
        }
        atomsWithoutParents++;
        this.mGraphIndex[highestRankingAtom] = firstUnused;
        this.mGraphFrom[firstUnused] = -1;
        this.mGraphAtom[firstUnused++] = highestRankingAtom;
        atomHandled[highestRankingAtom] = true;
      }
    }
    this.mGraphClosure = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2 * (this.mMol.getBonds_0() - graphBonds), 15, 1);
    while (true) {
      lowAtomNo1 = this.mMol.getMaxAtoms_0();
      lowAtomNo2 = this.mMol.getMaxAtoms_0();
      lowBond = -1;
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
        if (!bondHandled[bond]) {
          if (this.mGraphIndex[this.mMol.getBondAtom_0(0, bond)] < this.mGraphIndex[this.mMol.getBondAtom_0(1, bond)]) {
            loAtom = this.mGraphIndex[this.mMol.getBondAtom_0(0, bond)];
            hiAtom = this.mGraphIndex[this.mMol.getBondAtom_0(1, bond)];
          } else {
            loAtom = this.mGraphIndex[this.mMol.getBondAtom_0(1, bond)];
            hiAtom = this.mGraphIndex[this.mMol.getBondAtom_0(0, bond)];
          }
          if (loAtom < lowAtomNo1 || loAtom == lowAtomNo1 && hiAtom < lowAtomNo2) {
            lowAtomNo1 = loAtom;
            lowAtomNo2 = hiAtom;
            lowBond = bond;
          }
        }
      }
      if (lowBond == -1)
        break;
      bondHandled[lowBond] = true;
      this.mGraphBond[graphBonds++] = lowBond;
      this.mGraphClosure[2 * this.mGraphRings] = lowAtomNo1;
      this.mGraphClosure[2 * this.mGraphRings + 1] = lowAtomNo2;
      this.mGraphRings++;
    }
    this.mGraphGenerated = true;
  };
  _.getAromaticSPBonds = function getAromaticSPBonds() {
    var atom, atom$array, atom$index, atom$max, count, i, index_0, isAromaticSPBond, minIndex, minValue, r, ringAtom, ringBond, ringSet;
    isAromaticSPBond = null;
    ringSet = this.mMol.getRingSet_0();
    for (r = 0; r < ringSet.getSize_0(); r++) {
      if (ringSet.isDelocalized_0(r)) {
        count = 0;
        ringAtom = ringSet.getRingAtoms_0(r);
        for (atom$array = ringAtom, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
          atom = atom$array[atom$index];
          if (this.hasTwoAromaticPiElectrons(atom))
            count++;
        }
        if (count != 0) {
          ringBond = ringSet.getRingBonds_0(r);
          if (jsEquals(isAromaticSPBond, null))
            isAromaticSPBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 16, 1);
          if (count == ringAtom.length) {
            minIndex = -1;
            minValue = 2147483647;
            for (i = 0; i < ringAtom.length; i++) {
              if (minValue > this.mGraphAtom[ringBond[i]]) {
                minValue = this.mGraphAtom[ringBond[i]];
                minIndex = i;
              }
            }
            while (count > 0) {
              isAromaticSPBond[ringBond[minIndex]] = true;
              minIndex = this.validateCyclicIndex(minIndex + 2, ringAtom.length);
              count -= 2;
            }
          } else {
            index_0 = 0;
            while (this.hasTwoAromaticPiElectrons(ringAtom[index_0]))
              index_0++;
            while (!this.hasTwoAromaticPiElectrons(ringAtom[index_0]))
              index_0 = this.validateCyclicIndex(index_0 + 1, ringAtom.length);
            while (count > 0) {
              isAromaticSPBond[ringBond[index_0]] = true;
              index_0 = this.validateCyclicIndex(index_0 + 2, ringAtom.length);
              count -= 2;
              while (!this.hasTwoAromaticPiElectrons(ringAtom[index_0]))
                index_0 = this.validateCyclicIndex(index_0 + 1, ringAtom.length);
            }
          }
        }
      }
    }
    return isAromaticSPBond;
  };
  _.getCanMolecule_0 = function getCanMolecule(includeExplicitHydrogen) {
    var atom, bond, hydrogen, i, i0, i1, j, mol, temp;
    this.generateGraph();
    mol = new carc2.StereoMolecule_0(this.mMol.getAtoms_0(), this.mMol.getBonds_0());
    mol.setFragment_0(this.mMol.isFragment_0());
    for (i0 = 0; i0 < this.mMol.getAtoms_0(); i0++) {
      this.mMol.copyAtom_0(mol, this.mGraphAtom[i0], 0, 0);
      mol.setAtomESR_0(i0, this.mTHESRType[this.mGraphAtom[i0]], this.mTHESRGroup[this.mGraphAtom[i0]]);
    }
    for (i1 = 0; i1 < this.mMol.getBonds_0(); i1++) {
      this.mMol.copyBond_1(mol, this.mGraphBond[i1], 0, 0, this.mGraphIndex, false);
      if (!mol.isStereoBond_0(i1) && mol.getBondAtom_0(0, i1) > mol.getBondAtom_0(1, i1)) {
        temp = mol.getBondAtom_0(0, i1);
        mol.setBondAtom_0(0, i1, mol.getBondAtom_0(1, i1));
        mol.setBondAtom_0(1, i1, temp);
      }
      mol.setBondESR_0(i1, this.mEZESRType[this.mGraphBond[i1]], this.mEZESRGroup[this.mGraphBond[i1]]);
    }
    if (includeExplicitHydrogen) {
      for (i = 0; i < this.mMol.getAtoms_0(); i++) {
        atom = this.mGraphAtom[i];
        for (j = this.mMol.getConnAtoms_0(atom); j < this.mMol.getAllConnAtoms_0(atom); j++) {
          hydrogen = this.mMol.copyAtom_0(mol, this.mMol.getConnAtom_0(atom, j), 0, 0);
          this.mMol.copyBond_0(mol, this.mMol.getConnBond_0(atom, j), 0, 0, this.mGraphIndex[atom], hydrogen, false);
        }
      }
    }
    for (bond = 0; bond < mol.getAllBonds_0(); bond++) {
      atom = mol.getBondAtom_0(0, bond);
      if (this.mTHParityIsMesoInverted[this.mGraphAtom[atom]]) {
        if (mol.getBondType_0(bond) == 257)
          mol.setBondType_0(bond, 129);
        else if (mol.getBondType_0(bond) == 129)
          mol.setBondType_0(bond, 257);
      }
    }
    this.mMol.copyMoleculeProperties_0(mol);
    mol.invalidateHelperArrays_0(8);
    return mol;
  };
  _.getEZParity = function getEZParity(bond) {
    return this.mEZParity[bond];
  };
  _.getEncodedCoordinates_0 = function getEncodedCoordinates() {
    return this.getEncodedCoordinates_1(this.mZCoordinatesAvailable);
  };
  _.getEncodedCoordinates_1 = function getEncodedCoordinates_0(keepPositionAndScale) {
    if (jsEquals(this.mEncodedCoords, null)) {
      this.generateGraph();
      this.encodeCoordinates(keepPositionAndScale, this.mMol.getAtomCoordinates());
    }
    return this.mEncodedCoords;
  };
  _.getEncodedMapping_0 = function getEncodedMapping() {
    if (jsEquals(this.mMapping, null)) {
      this.generateGraph();
      this.encodeMapping();
    }
    return this.mMapping;
  };
  _.getFinalRank_0 = function getFinalRank() {
    return this.mCanRank;
  };
  _.getGraphAtoms_0 = function getGraphAtoms() {
    this.generateGraph();
    return this.mGraphAtom;
  };
  _.getGraphIndexes_0 = function getGraphIndexes() {
    this.generateGraph();
    return this.mGraphIndex;
  };
  _.getIDCode_0 = function getIDCode() {
    if (jsEquals(this.mIDCode, null)) {
      this.generateGraph();
      if ((this.mMode & 2048) == 0) {
        this.idGenerateConfigurations();
        this.idNormalizeESRGroupNumbers();
      }
      this.idCodeCreate();
    }
    return this.mIDCode;
  };
  _.getMaxDelta = function getMaxDelta(atom, from, maxDelta, coords) {
    var deltaX, deltaY, deltaZ;
    deltaX = from == -1 ? $wnd.Math.abs(coords[atom].x_0 - coords[this.mGraphAtom[0]].x_0) / 8 : $wnd.Math.abs(coords[atom].x_0 - coords[from].x_0);
    if (maxDelta < deltaX)
      maxDelta = deltaX;
    deltaY = from == -1 ? $wnd.Math.abs(coords[atom].y_0 - coords[this.mGraphAtom[0]].y_0) / 8 : $wnd.Math.abs(coords[atom].y_0 - coords[from].y_0);
    if (maxDelta < deltaY)
      maxDelta = deltaY;
    if (this.mZCoordinatesAvailable) {
      deltaZ = from == -1 ? $wnd.Math.abs(coords[atom].z_0 - coords[this.mGraphAtom[0]].z_0) / 8 : $wnd.Math.abs(coords[atom].z_0 - coords[from].z_0);
      if (maxDelta < deltaZ)
        maxDelta = deltaZ;
    }
    return maxDelta;
  };
  _.getPseudoEZGroup = function getPseudoEZGroup(bond) {
    return this.mPseudoEZGroup[bond];
  };
  _.getPseudoStereoGroupCount = function getPseudoStereoGroupCount() {
    return this.mNoOfPseudoGroups;
  };
  _.getPseudoTHGroup = function getPseudoTHGroup(atom) {
    return this.mPseudoTHGroup[atom];
  };
  _.getSymmetryRank_0 = function getSymmetryRank(atom) {
    return jsEquals(this.mCanRankBeforeTieBreaking, null) ? -1 : this.mCanRankBeforeTieBreaking[atom];
  };
  _.getSymmetryRanks_0 = function getSymmetryRanks() {
    return this.mCanRankBeforeTieBreaking;
  };
  _.getTHParity = function getTHParity(atom) {
    return this.mTHParity[atom];
  };
  _.hasCIPParityDistinctionProblem_0 = function hasCIPParityDistinctionProblem() {
    return this.mCIPParityNoDistinctionProblem;
  };
  _.hasSecondBINAPBond = function hasSecondBINAPBond(atom) {
    var i, j, j$array, j$index, j$max, k, ringSet;
    ringSet = this.mMol.getRingSet_0();
    for (i = 0; i < ringSet.getSize_0(); i++) {
      if (ringSet.isAromatic_0(i) && ringSet.isAtomMember_0(i, atom)) {
        for (j$array = ringSet.getRingAtoms_0(i), j$index = 0, j$max = j$array.length; j$index < j$max; ++j$index) {
          j = j$array[j$index];
          if (j != atom) {
            for (k = 0; k < this.mMol.getConnAtoms_0(j); k++)
              if (this.mMol.isBINAPChiralityBond_0(this.mMol.getConnBond_0(j, k)))
                return true;
          }
        }
        return false;
      }
    }
    return false;
  };
  _.hasTwoAromaticPiElectrons = function hasTwoAromaticPiElectrons(atom) {
    var aromaticPi, connBond, i;
    if (this.mMol.getAtomPi_0(atom) < 2)
      return false;
    if (this.mMol.getConnAtoms_0(atom) == 2)
      return true;
    aromaticPi = 0;
    for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++) {
      connBond = this.mMol.getConnBond_0(atom, i);
      if (this.mMol.isAromaticBond_0(connBond))
        aromaticPi += this.mMol.getBondOrder_0(connBond) - 1;
    }
    return aromaticPi > 1;
  };
  _.idCodeCreate = function idCodeCreate() {
    var EZCount, THCount, a, a$array, a$index, a$max, atom, atom0, atom1, atom10, atom11, atom2, atom3, atom4, atom5, atom6, atom7, atom8, atom9, atomList, base, bond, bond0, bond1, bond2, bond3, bond4, bondOrder, chargedAtoms, connBits, conns, count, customLabel, dbits, dif, hIndex, i, i0, isAromaticSPBond, j, label_0, lbits, maxLength, maxdif, nbits, nitrogens, otherAtoms, oxygens, parity;
    this.encodeBitsStart(false);
    this.encodeBits(9, 4);
    nbits = $wnd.Math.max(carc2.getNeededBits(this.mMol.getAtoms_0()), carc2.getNeededBits(this.mMol.getBonds_0()));
    this.encodeBits(fromInt_0(nbits), 4);
    if (nbits == 0) {
      this.encodeBits(fromInt_0(this.mMol.isFragment_0() ? 1 : 0), 1);
      this.encodeBits(0, 1);
      this.mIDCode = this.encodeBitsEnd();
      return;
    }
    nitrogens = oxygens = otherAtoms = chargedAtoms = 0;
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
      if (eq(and_0(this.mMol.getAtomQueryFeatures(atom0), 1), 0)) {
        switch (this.mMol.getAtomicNo_0(atom0)) {
          case 6:
            break;
          case 7:
            nitrogens++;
            break;
          case 8:
            oxygens++;
            break;
          default:
            otherAtoms++;
            break;
        }
        if (this.mMol.getAtomCharge_0(atom0) != 0)
          chargedAtoms++;
      }
    }
    this.encodeBits(fromInt_0(this.mMol.getAtoms_0()), nbits);
    this.encodeBits(fromInt_0(this.mMol.getBonds_0()), nbits);
    this.encodeBits(fromInt_0(nitrogens), nbits);
    this.encodeBits(fromInt_0(oxygens), nbits);
    this.encodeBits(fromInt_0(otherAtoms), nbits);
    this.encodeBits(fromInt_0(chargedAtoms), nbits);
    for (atom1 = 0; atom1 < this.mMol.getAtoms_0(); atom1++)
      if (this.mMol.getAtomicNo_0(this.mGraphAtom[atom1]) == 7 && eq(and_0(this.mMol.getAtomQueryFeatures(this.mGraphAtom[atom1]), 1), 0))
        this.encodeBits(fromInt_0(atom1), nbits);
    for (atom2 = 0; atom2 < this.mMol.getAtoms_0(); atom2++)
      if (this.mMol.getAtomicNo_0(this.mGraphAtom[atom2]) == 8 && eq(and_0(this.mMol.getAtomQueryFeatures(this.mGraphAtom[atom2]), 1), 0))
        this.encodeBits(fromInt_0(atom2), nbits);
    for (atom3 = 0; atom3 < this.mMol.getAtoms_0(); atom3++)
      if (this.mMol.getAtomicNo_0(this.mGraphAtom[atom3]) != 6 && this.mMol.getAtomicNo_0(this.mGraphAtom[atom3]) != 7 && this.mMol.getAtomicNo_0(this.mGraphAtom[atom3]) != 8 && eq(and_0(this.mMol.getAtomQueryFeatures(this.mGraphAtom[atom3]), 1), 0)) {
        this.encodeBits(fromInt_0(atom3), nbits);
        this.encodeBits(fromInt_0(this.mMol.getAtomicNo_0(this.mGraphAtom[atom3])), 8);
      }
    for (atom4 = 0; atom4 < this.mMol.getAtoms_0(); atom4++)
      if (this.mMol.getAtomCharge_0(this.mGraphAtom[atom4]) != 0 && eq(and_0(this.mMol.getAtomQueryFeatures(this.mGraphAtom[atom4]), 1), 0)) {
        this.encodeBits(fromInt_0(atom4), nbits);
        this.encodeBits(fromInt_0(8 + this.mMol.getAtomCharge_0(this.mGraphAtom[atom4])), 4);
      }
    maxdif = 0;
    base = 0;
    for (atom5 = 1; atom5 < this.mMol.getAtoms_0(); atom5++) {
      if (this.mGraphFrom[atom5] == -1) {
        dif = 0;
      } else {
        dif = 1 + this.mGraphFrom[atom5] - base;
        base = this.mGraphFrom[atom5];
      }
      if (maxdif < dif)
        maxdif = dif;
    }
    dbits = carc2.getNeededBits(maxdif);
    this.encodeBits(fromInt_0(dbits), 4);
    base = 0;
    for (atom6 = 1; atom6 < this.mMol.getAtoms_0(); atom6++) {
      if (this.mGraphFrom[atom6] == -1) {
        dif = 0;
      } else {
        dif = 1 + this.mGraphFrom[atom6] - base;
        base = this.mGraphFrom[atom6];
      }
      this.encodeBits(fromInt_0(dif), dbits);
    }
    for (i0 = 0; i0 < 2 * this.mGraphRings; i0++)
      this.encodeBits(fromInt_0(this.mGraphClosure[i0]), nbits);
    for (bond0 = 0; bond0 < this.mMol.getBonds_0(); bond0++) {
      bondOrder = (this.mMol.getBondQueryFeatures_0(this.mGraphBond[bond0]) & 130560) != 0 || this.mMol.getBondType_0(this.mGraphBond[bond0]) == 16 ? 1 : this.mMol.isDelocalizedBond_0(this.mGraphBond[bond0]) ? 0 : $wnd.Math.min(3, this.mMol.getBondOrder_0(this.mGraphBond[bond0]));
      this.encodeBits(fromInt_0(bondOrder), 2);
    }
    THCount = 0;
    if ((this.mMode & 2048) == 0) {
      for (atom7 = 0; atom7 < this.mMol.getAtoms_0(); atom7++)
        if (this.mTHConfiguration[this.mGraphAtom[atom7]] != 0 && this.mTHConfiguration[this.mGraphAtom[atom7]] != 3)
          THCount++;
    }
    this.encodeBits(fromInt_0(THCount), nbits);
    if ((this.mMode & 2048) == 0) {
      for (atom7 = 0; atom7 < this.mMol.getAtoms_0(); atom7++) {
        if (this.mTHConfiguration[this.mGraphAtom[atom7]] != 0 && this.mTHConfiguration[this.mGraphAtom[atom7]] != 3) {
          this.encodeBits(fromInt_0(atom7), nbits);
          if (this.mTHESRType[this.mGraphAtom[atom7]] == 0) {
            this.encodeBits(fromInt_0(this.mTHConfiguration[this.mGraphAtom[atom7]]), 3);
          } else {
            parity = this.mTHConfiguration[this.mGraphAtom[atom7]] == 1 ? this.mTHESRType[this.mGraphAtom[atom7]] == 1 ? 4 : 6 : this.mTHESRType[this.mGraphAtom[atom7]] == 1 ? 5 : 7;
            this.encodeBits(fromInt_0(parity), 3);
            this.encodeBits(fromInt_0(this.mTHESRGroup[this.mGraphAtom[atom7]]), 3);
          }
        }
      }
    }
    EZCount = 0;
    if ((this.mMode & 2048) == 0) {
      for (bond1 = 0; bond1 < this.mMol.getBonds_0(); bond1++)
        if (this.mEZConfiguration[this.mGraphBond[bond1]] != 0 && this.mEZConfiguration[this.mGraphBond[bond1]] != 3 && (!this.mMol.isSmallRingBond_0(this.mGraphBond[bond1]) || this.mMol.getBondType_0(this.mGraphBond[bond1]) == 1))
          EZCount++;
    }
    this.encodeBits(fromInt_0(EZCount), nbits);
    if ((this.mMode & 2048) == 0) {
      for (bond1 = 0; bond1 < this.mMol.getBonds_0(); bond1++) {
        if (this.mEZConfiguration[this.mGraphBond[bond1]] != 0 && this.mEZConfiguration[this.mGraphBond[bond1]] != 3 && (!this.mMol.isSmallRingBond_0(this.mGraphBond[bond1]) || this.mMol.getBondType_0(this.mGraphBond[bond1]) == 1)) {
          this.encodeBits(fromInt_0(bond1), nbits);
          if (this.mMol.getBondType_0(this.mGraphBond[bond1]) == 1) {
            if (this.mEZESRType[this.mGraphBond[bond1]] == 0) {
              this.encodeBits(fromInt_0(this.mEZConfiguration[this.mGraphBond[bond1]]), 3);
            } else {
              parity = this.mEZConfiguration[this.mGraphBond[bond1]] == 1 ? this.mEZESRType[this.mGraphBond[bond1]] == 1 ? 4 : 6 : this.mEZESRType[this.mGraphBond[bond1]] == 1 ? 5 : 7;
              this.encodeBits(fromInt_0(parity), 3);
              this.encodeBits(fromInt_0(this.mEZESRGroup[this.mGraphBond[bond1]]), 3);
            }
          } else {
            this.encodeBits(fromInt_0(this.mEZConfiguration[this.mGraphBond[bond1]]), 2);
          }
        }
      }
    }
    this.encodeBits(fromInt_0(this.mMol.isFragment_0() ? 1 : 0), 1);
    count = 0;
    for (atom8 = 0; atom8 < this.mMol.getAtoms_0(); atom8++)
      if (this.mMol.getAtomMass_0(this.mGraphAtom[atom8]) != 0)
        count++;
    if (count != 0) {
      this.encodeFeatureNo(1);
      this.encodeBits(fromInt_0(count), nbits);
      for (atom7 = 0; atom7 < this.mMol.getAtoms_0(); atom7++) {
        if (this.mMol.getAtomMass_0(this.mGraphAtom[atom7]) != 0) {
          this.encodeBits(fromInt_0(atom7), nbits);
          this.encodeBits(fromInt_0(this.mMol.getAtomMass_0(this.mGraphAtom[atom7])), 8);
        }
      }
    }
    this.mFeatureBlock = 0;
    if (this.mMol.isFragment_0()) {
      this.addAtomQueryFeatures(0, nbits, 2048, 1, -1);
      this.addAtomQueryFeatures(3, nbits, 4096, 1, -1);
      this.addAtomQueryFeatures(4, nbits, 120, 4, 3);
      this.addAtomQueryFeatures(5, nbits, { l: 6, m: 0, h: 4 }, 2, 1);
      this.addAtomQueryFeatures(6, nbits, 1, 1, -1);
      this.addAtomQueryFeatures(7, nbits, 1920, 4, 7);
      count = 0;
      for (atom7 = 0; atom7 < this.mMol.getAtoms_0(); atom7++)
        if (jsNotEquals(this.mMol.getAtomList_0(this.mGraphAtom[atom7]), null))
          count++;
      if (count > 0) {
        this.encodeFeatureNo(8);
        this.encodeBits(fromInt_0(count), nbits);
        for (atom9 = 0; atom9 < this.mMol.getAtoms_0(); atom9++) {
          atomList = this.mMol.getAtomList_0(this.mGraphAtom[atom9]);
          if (jsNotEquals(atomList, null)) {
            this.encodeBits(fromInt_0(atom9), nbits);
            this.encodeBits(fromInt_0(atomList.length), 4);
            for (a$array = atomList, a$index = 0, a$max = a$array.length; a$index < a$max; ++a$index) {
              a = a$array[a$index];
              this.encodeBits(fromInt_0(a), 8);
            }
          }
        }
      }
      this.addBondQueryFeatures(9, nbits, 384, 2, 7);
      this.addBondQueryFeatures(10, nbits, 31, 5, 0);
      this.addAtomQueryFeatures(11, nbits, 8192, 1, -1);
      this.addBondQueryFeatures(12, nbits, 130560, 8, 9);
      this.addAtomQueryFeatures(13, nbits, 114688, 3, 14);
      this.addAtomQueryFeatures(14, nbits, 4063232, 5, 17);
      this.addAtomQueryFeatures(16, nbits, 29360128, 3, 22);
    }
    count = 0;
    for (atom10 = 0; atom10 < this.mMol.getAtoms_0(); atom10++)
      if (jsNotEquals(this.mAbnormalValence, null) && this.mAbnormalValence[this.mGraphAtom[atom10]] != -1)
        count++;
    if (count != 0) {
      this.encodeFeatureNo(17);
      this.encodeBits(fromInt_0(count), nbits);
      for (atom7 = 0; atom7 < this.mMol.getAtoms_0(); atom7++) {
        if (jsNotEquals(this.mAbnormalValence, null) && this.mAbnormalValence[this.mGraphAtom[atom7]] != -1) {
          this.encodeBits(fromInt_0(atom7), nbits);
          this.encodeBits(fromInt_0(this.mAbnormalValence[this.mGraphAtom[atom7]]), 4);
        }
      }
    }
    if ((this.mMode & 8) != 0 || (this.mMode & 1024) != 0) {
      count = 0;
      maxLength = 0;
      for (atom7 = 0; atom7 < this.mMol.getAtoms_0(); atom7++) {
        label_0 = this.mMol.getAtomCustomLabel_0(this.mGraphAtom[atom7]);
        if (jsNotEquals(label_0, null)) {
          count++;
          maxLength = $wnd.Math.max(maxLength, jl.length__I__devirtual$_0(label_0));
        }
      }
      if (count != 0) {
        lbits = carc2.getNeededBits(maxLength);
        this.encodeFeatureNo(18);
        this.encodeBits(fromInt_0(count), nbits);
        this.encodeBits(fromInt_0(lbits), 4);
        for (atom9 = 0; atom9 < this.mMol.getAtoms_0(); atom9++) {
          customLabel = this.mMol.getAtomCustomLabel_0(this.mGraphAtom[atom9]);
          if (jsNotEquals(customLabel, null)) {
            this.encodeBits(fromInt_0(atom9), nbits);
            this.encodeBits(fromInt_0(jl.length__I__devirtual$_0(customLabel)), lbits);
            for (i = 0; i < jl.length__I__devirtual$_0(customLabel); i++)
              this.encodeBits(fromInt_0(jl.charAt_I_C__devirtual$_0(customLabel, i)), 7);
          }
        }
      }
    }
    if (this.mMol.isFragment_0()) {
      this.addAtomQueryFeatures(19, nbits, 234881024, 3, 25);
      this.addBondQueryFeatures(20, nbits, 917504, 3, 17);
    }
    count = 0;
    for (atom11 = 0; atom11 < this.mMol.getAtoms_0(); atom11++)
      if (this.mMol.getAtomRadical_0(this.mGraphAtom[atom11]) != 0)
        count++;
    if (count != 0) {
      this.encodeFeatureNo(21);
      this.encodeBits(fromInt_0(count), nbits);
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        if (this.mMol.getAtomRadical_0(this.mGraphAtom[atom]) != 0) {
          this.encodeBits(fromInt_0(atom), nbits);
          this.encodeBits(fromInt_0(this.mMol.getAtomRadical_0(this.mGraphAtom[atom]) >> 4), 2);
        }
      }
    }
    if (this.mMol.isFragment_0()) {
      this.addAtomQueryFeatures(22, nbits, 268435456, 1, -1);
      this.addBondQueryFeatures(23, nbits, 1048576, 1, -1);
      this.addBondQueryFeatures(24, nbits, 6291456, 2, 21);
    }
    if ((this.mMode & 16) != 0) {
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        if (this.mMol.isSelectedAtom_0(this.mGraphAtom[atom])) {
          this.encodeFeatureNo(25);
          for (a = 0; a < this.mMol.getAtoms_0(); a++)
            this.encodeBits(fromInt_0(this.mMol.isSelectedAtom_0(this.mGraphAtom[a]) ? 1 : 0), 1);
          break;
        }
      }
    }
    isAromaticSPBond = this.getAromaticSPBonds();
    if (jsNotEquals(isAromaticSPBond, null)) {
      count = 0;
      for (bond1 = 0; bond1 < this.mMol.getBonds_0(); bond1++)
        if (isAromaticSPBond[this.mGraphBond[bond1]])
          count++;
      this.encodeFeatureNo(26);
      this.encodeBits(fromInt_0(count), nbits);
      for (bond2 = 0; bond2 < this.mMol.getBonds_0(); bond2++)
        if (isAromaticSPBond[this.mGraphBond[bond2]])
          this.encodeBits(fromInt_0(bond2), nbits);
    }
    if (this.mMol.isFragment_0())
      this.addAtomQueryFeatures(27, nbits, 536870912, 1, -1);
    count = 0;
    for (bond3 = 0; bond3 < this.mMol.getBonds_0(); bond3++)
      if (this.mMol.getBondType_0(this.mGraphBond[bond3]) == 16)
        count++;
    if (count != 0) {
      this.encodeFeatureNo(28);
      this.encodeBits(fromInt_0(count), nbits);
      for (bond1 = 0; bond1 < this.mMol.getBonds_0(); bond1++)
        if (this.mMol.getBondType_0(this.mGraphBond[bond1]) == 16)
          this.encodeBits(fromInt_0(bond1), nbits);
    }
    if (this.mMol.isFragment_0()) {
      this.addAtomQueryFeatures(29, nbits, 3221225472, 2, 30);
      this.addAtomQueryFeatures(30, nbits, 545460846592, 7, 32);
      this.addAtomQueryFeatures(32, nbits, { l: 0, m: 0, h: 3 }, 2, 44);
      this.addAtomQueryFeatures(33, nbits, 17042430230528, 5, 39);
      this.addAtomQueryFeatures(34, nbits, { l: 0, m: 0, h: 4 }, 1, -1);
      this.addBondQueryFeatures(35, nbits, 8388608, 1, -1);
      this.addBondQueryFeatures(36, nbits, 96, 2, 5);
    }
    count = 0;
    for (bond4 = 0; bond4 < this.mMol.getBonds_0(); bond4++)
      if (this.mMol.getBondType_0(this.mGraphBond[bond4]) == 32 || this.mMol.getBondType_0(this.mGraphBond[bond4]) == 64)
        count++;
    if (count != 0) {
      this.encodeFeatureNo(37);
      this.encodeBits(fromInt_0(count), nbits);
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
        if (this.mMol.getBondType_0(this.mGraphBond[bond]) == 32 || this.mMol.getBondType_0(this.mGraphBond[bond]) == 64) {
          this.encodeBits(fromInt_0(bond), nbits);
          this.encodeBits(fromInt_0(this.mMol.getBondType_0(this.mGraphBond[bond]) == 32 ? 0 : 1), 1);
        }
      }
    }
    if (this.mAllHydrogensAreExplicit && (this.mMode & 16) != 0) {
      count = 0;
      connBits = 0;
      for (atom7 = 0; atom7 < this.mMol.getAtoms_0(); atom7++) {
        conns = 0;
        for (j = this.mMol.getConnAtoms_0(this.mGraphAtom[atom7]); j < this.mMol.getAllConnAtoms_0(this.mGraphAtom[atom7]); j++) {
          if (this.mMol.isSelectedAtom_0(this.mMol.getConnAtom_0(this.mGraphAtom[atom7], j))) {
            hIndex = j - this.mMol.getConnAtoms_0(this.mGraphAtom[atom7]);
            conns |= 1 << hIndex;
            connBits = $wnd.Math.max(connBits, hIndex + 1);
          }
        }
        if (conns != 0)
          count++;
      }
      if (count != 0) {
        this.encodeFeatureNo(38);
        this.encodeBits(fromInt_0(count), nbits);
        this.encodeBits(fromInt_0(connBits), 3);
        for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
          conns = 0;
          for (j = this.mMol.getConnAtoms_0(this.mGraphAtom[atom]); j < this.mMol.getAllConnAtoms_0(this.mGraphAtom[atom]); j++) {
            if (this.mMol.isSelectedAtom_0(this.mMol.getConnAtom_0(this.mGraphAtom[atom], j))) {
              hIndex = j - this.mMol.getConnAtoms_0(this.mGraphAtom[atom]);
              conns |= 1 << hIndex;
            }
          }
          if (conns != 0) {
            this.encodeBits(fromInt_0(atom), nbits);
            this.encodeBits(fromInt_0(conns), connBits);
          }
        }
      }
    }
    if (this.mMol.isFragment_0())
      this.addAtomQueryFeatures(39, nbits, { l: 0, m: 0, h: 120 }, 4, 47);
    this.encodeBits(0, 1);
    this.mIDCode = this.encodeBitsEnd();
  };
  _.idGenerateConfigurations = function idGenerateConfigurations() {
    var atom, bond, bondAtom, connAtom, connAtom1, connAtom2, i, inversion, j, neighbour, neighbours;
    this.mTHConfiguration = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mTHParity[atom] == 1 || this.mTHParity[atom] == 2) {
        inversion = this.mTHParityIsMesoInverted[atom];
        if (this.mMol.isCentralAlleneAtom(atom)) {
          for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++) {
            connAtom = this.mMol.getConnAtom_0(atom, i);
            neighbours = 0;
            neighbour = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
            for (j = 0; j < this.mMol.getConnAtoms_0(connAtom); j++) {
              neighbour[neighbours] = this.mMol.getConnAtom_0(connAtom, j);
              if (neighbour[neighbours] != atom)
                neighbours++;
            }
            if (neighbours == 2 && this.mCanRank[neighbour[0]] > this.mCanRank[neighbour[1]] ^ this.mGraphIndex[neighbour[0]] < this.mGraphIndex[neighbour[1]])
              inversion = !inversion;
          }
        } else {
          for (i = 1; i < this.mMol.getConnAtoms_0(atom); i++) {
            for (j = 0; j < i; j++) {
              connAtom1 = this.mMol.getConnAtom_0(atom, i);
              connAtom2 = this.mMol.getConnAtom_0(atom, j);
              if (this.mCanRank[connAtom1] > this.mCanRank[connAtom2])
                inversion = !inversion;
              if (this.mGraphIndex[connAtom1] < this.mGraphIndex[connAtom2])
                inversion = !inversion;
            }
          }
        }
        this.mTHConfiguration[atom] = this.mTHParity[atom] == 1 ^ inversion ? narrow_byte(1) : 2;
      } else {
        this.mTHConfiguration[atom] = this.mTHParity[atom];
      }
    }
    this.mEZConfiguration = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 15, 1);
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      if (this.mEZParity[bond] == 1 || this.mEZParity[bond] == 2) {
        inversion = false;
        for (i = 0; i < 2; i++) {
          bondAtom = this.mMol.getBondAtom_0(i, bond);
          if (this.mMol.getConnAtoms_0(bondAtom) == 3) {
            neighbour = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
            neighbours = 0;
            for (j = 0; j < 3; j++)
              if (this.mMol.getConnAtom_0(bondAtom, j) != this.mMol.getBondAtom_0(1 - i, bond))
                neighbour[neighbours++] = this.mMol.getConnAtom_0(bondAtom, j);
            if (this.mCanRank[neighbour[0]] > this.mCanRank[neighbour[1]])
              inversion = !inversion;
            if (this.mGraphIndex[neighbour[0]] < this.mGraphIndex[neighbour[1]])
              inversion = !inversion;
          }
        }
        this.mEZConfiguration[bond] = this.mEZParity[bond] == 1 ^ inversion ? narrow_byte(1) : 2;
      } else {
        this.mEZConfiguration[bond] = this.mEZParity[bond];
      }
    }
  };
  _.idNormalizeESRGroupNumbers = function idNormalizeESRGroupNumbers() {
    this.idNormalizeESRGroupNumbers_0(1);
    this.idNormalizeESRGroupNumbers_0(2);
  };
  _.idNormalizeESRGroupNumbers_0 = function idNormalizeESRGroupNumbers_0(type_0) {
    var atom, atom0, bond, bond0, canGroup, group, groupRank, groups, i, j, maxGroup, maxRank, rank;
    groupRank = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 32, 15, 1);
    groups = 0;
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
      if ((this.mTHConfiguration[atom0] == 1 || this.mTHConfiguration[atom0] == 2) && this.mTHESRType[atom0] == type_0) {
        group = this.mTHESRGroup[atom0];
        if (groupRank[group] < this.mCanRank[atom0]) {
          if (groupRank[group] == 0)
            groups++;
          groupRank[group] = this.mCanRank[atom0];
        }
      }
    }
    for (bond0 = 0; bond0 < this.mMol.getBonds_0(); bond0++) {
      if ((this.mEZConfiguration[bond0] == 1 || this.mEZConfiguration[bond0] == 2) && this.mEZESRType[bond0] == type_0 && this.mMol.getBondType_0(bond0) == 1) {
        group = this.mEZESRGroup[bond0];
        rank = $wnd.Math.max(this.mCanRank[this.mMol.getBondAtom_0(0, bond0)], this.mCanRank[this.mMol.getBondAtom_0(1, bond0)]);
        if (groupRank[group] < rank) {
          if (groupRank[group] == 0)
            groups++;
          groupRank[group] = rank;
        }
      }
    }
    canGroup = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, 32, 15, 1);
    for (i = 0; i < groups; i++) {
      maxGroup = -1;
      maxRank = 0;
      for (j = 0; j < 32; j++) {
        if (maxRank < groupRank[j]) {
          maxRank = groupRank[j];
          maxGroup = j;
        }
      }
      groupRank[maxGroup] = 0;
      canGroup[maxGroup] = narrow_byte(i);
    }
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++)
      if ((this.mTHConfiguration[atom] == 1 || this.mTHConfiguration[atom] == 2) && this.mTHESRType[atom] == type_0)
        this.mTHESRGroup[atom] = canGroup[this.mTHESRGroup[atom]];
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++)
      if ((this.mEZConfiguration[bond] == 1 || this.mEZConfiguration[bond] == 2) && this.mEZESRType[bond] == type_0 && this.mMol.getBondType_0(bond) == 1)
        this.mEZESRGroup[bond] = canGroup[this.mEZESRGroup[bond]];
  };
  _.initializeParities = function initializeParities(noOfRanksWithoutStereo, canRankWithoutStereo) {
    var atom, bond;
    this.mNoOfRanks = noOfRanksWithoutStereo;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      this.mCanRank[atom] = canRankWithoutStereo[atom];
      this.mTHParity[atom] = 0;
      this.mTHParityRoundIsOdd[atom] = false;
    }
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      this.mEZParity[bond] = 0;
      this.mEZParityRoundIsOdd[bond] = false;
    }
  };
  _.invalidateCoordinates_0 = function invalidateCoordinates() {
    this.mEncodedCoords = null;
  };
  _.isJustifiedStereoBond = function isJustifiedStereoBond(bond) {
    var atom, binapBond, i;
    atom = this.mMol.getBondAtom_0(0, bond);
    if (atom >= this.mMol.getAtoms_0())
      return false;
    if (this.mTHParity[atom] == 1 || this.mTHParity[atom] == 2)
      return true;
    if (this.mTHParity[atom] == 3)
      return false;
    binapBond = this.mMol.findBINAPChiralityBond_0(atom);
    if (binapBond != -1)
      return this.mEZParity[binapBond] == 1 || this.mEZParity[binapBond] == 2;
    for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++) {
      if (this.mMol.getConnBondOrder_0(atom, i) == 2) {
        if (this.mTHParity[this.mMol.getConnAtom_0(atom, i)] == 1 || this.mTHParity[this.mMol.getConnAtom_0(atom, i)] == 2)
          return true;
      }
    }
    return false;
  };
  _.isUnknownBINAPBondAtom = function isUnknownBINAPBondAtom(atom) {
    var i;
    for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++)
      if (this.mEZParity[this.mMol.getConnBond_0(atom, i)] == 3 && this.mMol.getConnBondOrder_0(atom, i) == 1)
        return true;
    return false;
  };
  _.normalizeEnantiomer_0 = function normalizeEnantiomer() {
    var atom, atom0, bond, bond0, invert, parityCount, rank;
    parityCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mNoOfRanks + 1, 15, 1);
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
      if (this.mMol.getAtomESRType_0(atom0) == 0) {
        if (this.mTHParity[atom0] == 1)
          parityCount[this.mCanRank[atom0]]++;
        else if (this.mTHParity[atom0] == 2)
          parityCount[this.mCanRank[atom0]]--;
      }
    }
    for (bond0 = 0; bond0 < this.mMol.getBonds_0(); bond0++) {
      if (this.mMol.getBondOrder_0(bond0) == 1 && this.mMol.getBondESRType_0(bond0) == 0) {
        if (this.mEZParity[bond0] == 1) {
          parityCount[this.mCanRank[this.mMol.getBondAtom_0(0, bond0)]]++;
          parityCount[this.mCanRank[this.mMol.getBondAtom_0(1, bond0)]]++;
        } else if (this.mEZParity[bond0] == 2) {
          parityCount[this.mCanRank[this.mMol.getBondAtom_0(0, bond0)]]--;
          parityCount[this.mCanRank[this.mMol.getBondAtom_0(1, bond0)]]--;
        }
      }
    }
    for (rank = 1; rank <= this.mNoOfRanks; rank++) {
      if (parityCount[rank] != 0) {
        invert = parityCount[rank] < 0;
        if (invert) {
          for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
            if (this.mMol.getAtomESRType_0(atom) == 0) {
              if (this.mTHParity[atom] == 1)
                this.mTHParity[atom] = 2;
              else if (this.mTHParity[atom] == 2)
                this.mTHParity[atom] = 1;
            }
          }
          for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
            if (this.mMol.getBondOrder_0(bond) == 1 && this.mMol.getBondESRType_0(bond) == 0) {
              if (this.mEZParity[bond] == 1)
                this.mEZParity[bond] = 2;
              else if (this.mEZParity[bond] == 2)
                this.mEZParity[bond] = 1;
            }
          }
        }
        return invert;
      }
    }
    return false;
  };
  _.resize = function resize(array, newSize) {
    var copy;
    copy = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, newSize, 15, 1);
    jl.arraycopy(array, 0, copy, 0, array.length);
    return copy;
  };
  _.resize_0 = function resize_0(array, newSize) {
    var copy;
    copy = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, newSize, 16, 1);
    jl.arraycopy(array, 0, copy, 0, array.length);
    return copy;
  };
  _.setCIPParities = function setCIPParities() {
    var atom, bond;
    if (jsNotEquals(this.mTHCIPParity, null))
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++)
        this.mMol.setAtomCIPParity_0(atom, this.mTHCIPParity[atom]);
    if (jsNotEquals(this.mEZCIPParity, null))
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++)
        this.mMol.setBondCIPParity_0(bond, this.mEZCIPParity[bond]);
  };
  _.setParities_0 = function setParities() {
    var atom, bond, bondAtom, connAtom, connAtom1, connAtom2, i, inversion, j, neighbour, neighbours;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mTHParity[atom] == 1 || this.mTHParity[atom] == 2) {
        inversion = false;
        if (this.mMol.isCentralAlleneAtom(atom)) {
          for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++) {
            connAtom = this.mMol.getConnAtom_0(atom, i);
            neighbours = 0;
            neighbour = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
            for (j = 0; j < this.mMol.getConnAtoms_0(connAtom); j++) {
              neighbour[neighbours] = this.mMol.getConnAtom_0(connAtom, j);
              if (neighbour[neighbours] != atom)
                neighbours++;
            }
            if (neighbours == 2 && this.mCanRank[neighbour[0]] > this.mCanRank[neighbour[1]] ^ neighbour[0] < neighbour[1])
              inversion = !inversion;
          }
        } else {
          for (i = 1; i < this.mMol.getConnAtoms_0(atom); i++) {
            for (j = 0; j < i; j++) {
              connAtom1 = this.mMol.getConnAtom_0(atom, i);
              connAtom2 = this.mMol.getConnAtom_0(atom, j);
              if (this.mCanRank[connAtom1] > this.mCanRank[connAtom2])
                inversion = !inversion;
              if (connAtom1 < connAtom2)
                inversion = !inversion;
            }
          }
        }
        this.mMol.setAtomParity_0(atom, this.mTHParity[atom] == 1 ^ inversion ? 1 : 2, this.mTHParityIsPseudo[atom]);
      } else {
        this.mMol.setAtomParity_0(atom, this.mTHParity[atom], this.mTHParityIsPseudo[atom]);
      }
    }
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      if (this.mEZParity[bond] == 1 || this.mEZParity[bond] == 2) {
        inversion = false;
        for (i = 0; i < 2; i++) {
          bondAtom = this.mMol.getBondAtom_0(i, bond);
          if (this.mMol.getConnAtoms_0(bondAtom) == 3) {
            neighbour = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
            neighbours = 0;
            for (j = 0; j < 3; j++)
              if (this.mMol.getConnAtom_0(bondAtom, j) != this.mMol.getBondAtom_0(1 - i, bond))
                neighbour[neighbours++] = this.mMol.getConnAtom_0(bondAtom, j);
            if (this.mCanRank[neighbour[0]] > this.mCanRank[neighbour[1]])
              inversion = !inversion;
            if (neighbour[0] < neighbour[1])
              inversion = !inversion;
          }
        }
        this.mMol.setBondParity_0(bond, this.mEZParity[bond] == 1 ^ inversion ? 1 : 2, this.mEZParityIsPseudo[bond]);
      } else {
        this.mMol.setBondParity_0(bond, this.mEZParity[bond], this.mEZParityIsPseudo[bond]);
      }
    }
  };
  _.setStereoCenters = function setStereoCenters() {
    var atom;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      this.mMol.setAtomStereoCenter(atom, this.mIsStereoCenter[atom]);
    }
  };
  _.setUnknownParitiesToExplicitlyUnknown_0 = function setUnknownParitiesToExplicitlyUnknown() {
    var atom, bond, order;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++)
      if (!this.mMol.isAtomConfigurationUnknown_0(atom) && this.mTHParity[atom] == 3)
        this.mMol.setAtomConfigurationUnknown_0(atom, true);
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      if (this.mEZParity[bond] == 3) {
        order = this.mMol.getBondOrder_0(bond);
        if (order == 1) {
          this.mMol.setAtomConfigurationUnknown_0(this.mMol.getBondAtom_0(0, bond), true);
        } else if (order == 2) {
          this.mMol.setBondType_0(bond, 386);
        }
      }
    }
  };
  _.validateCyclicIndex = function validateCyclicIndex(index_0, limit) {
    return index_0 < limit ? index_0 : index_0 - limit;
  };
  _.mAllHydrogensAreExplicit = false;
  _.mAtomBits = 0;
  _.mCIPParityNoDistinctionProblem = false;
  _.mEncodeAvoid127 = false;
  _.mEncodingBitsAvail = 0;
  _.mEncodingTempData = 0;
  _.mFeatureBlock = 0;
  _.mGraphGenerated = false;
  _.mGraphRings = 0;
  _.mIsMeso = false;
  _.mIsOddParityRound = false;
  _.mMaxConnAtoms = 0;
  _.mMode = 0;
  _.mNoOfPseudoGroups = 0;
  _.mNoOfRanks = 0;
  _.mStereoCentersFound = false;
  _.mZCoordinatesAvailable = false;
  carc2.ASSIGN_PARITIES_TO_TETRAHEDRAL_N = 32;
  carc2.CALC_PARITY_MODE_IN_SAME_FRAGMENT = 3;
  carc2.CALC_PARITY_MODE_PARITY = 1;
  carc2.CALC_PARITY_MODE_PRO_PARITY = 2;
  carc2.CONSIDER_STEREOHETEROTOPICITY = 2;
  carc2.COORDS_ARE_3D = 64;
  carc2.CREATE_PSEUDO_STEREO_GROUPS = 128;
  carc2.CREATE_SYMMETRY_RANK = 1;
  carc2.DISTINGUISH_RACEMIC_OR_GROUPS = 256;
  carc2.ENCODE_ATOM_CUSTOM_LABELS = 8;
  carc2.ENCODE_ATOM_CUSTOM_LABELS_WITHOUT_RANKING = 1024;
  carc2.ENCODE_ATOM_SELECTION = 16;
  carc2.NEGLECT_ANY_STEREO_INFORMATION = 2048;
  carc2.NEGLECT_LARGE_ATOM_STEREO_INFORMATION = 4096;
  carc2.TIE_BREAK_FREE_VALENCE_ATOMS = 512;
  carc2.cIDCodeCurrentVersion = 9;
  carc2.cIDCodeVersion2 = 8;
  carc2.cIDCodeVersion3 = 9;
  carc2.cParity1And = 4;
  carc2.cParity1Or = 6;
  carc2.cParity2And = 5;
  carc2.cParity2Or = 7;
  cggl.Lcom_actelion_research_chem_Canonizer_2_classLit = createForClass("com.actelion.research.chem", "Canonizer", 28, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_Canonizer$1 = function $clinit_Canonizer$1() {
    carc2.$clinit_Canonizer$1 = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Comparator();
  };
  carc2.Canonizer$1 = function Canonizer$1(this$0) {
    carc2.$clinit_Canonizer$1();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_7();
  };
  defineClass(310, 1, { 1: 1, 36: 1 }, carc2.Canonizer$1);
  _.$init_7 = function $init_7() {
  };
  _.compare_0 = function compare_1(r1, r2) {
    return this.compare(castTo(r1, 154), castTo(r2, 154));
  };
  _.equals_0 = function equals_0(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  _.compare = function compare_0(r1, r2) {
    var count, i, i1, i2;
    if (r1.parentRank != r2.parentRank)
      return r1.parentRank > r2.parentRank ? 1 : -1;
    i1 = r1.childRank.length;
    i2 = r2.childRank.length;
    count = $wnd.Math.min(i1, i2);
    for (i = 0; i < count; i++) {
      i1--;
      i2--;
      if (r1.childRank[i1] != r2.childRank[i2])
        return r1.childRank[i1] > r2.childRank[i2] ? 1 : -1;
    }
    if (i1 != i2)
      return i1 > i2 ? 1 : -1;
    if (r1.parentHCount != r2.parentHCount)
      return r1.parentHCount > r2.parentHCount ? 1 : -1;
    return 0;
  };
  cggl.Lcom_actelion_research_chem_Canonizer$1_2_classLit = createForClass("com.actelion.research.chem", "Canonizer/1", 310, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_Canonizer$1RankObject = function $clinit_Canonizer$1RankObject() {
    carc2.$clinit_Canonizer$1RankObject = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.Canonizer$1RankObject = function Canonizer$1RankObject(this$0) {
    carc2.$clinit_Canonizer$1RankObject();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_8();
  };
  defineClass(154, 1, { 154: 1, 1: 1 }, carc2.Canonizer$1RankObject);
  _.$init_8 = function $init_8() {
  };
  _.parentHCount = 0;
  _.parentIndex = 0;
  _.parentRank = 0;
  cggl.Lcom_actelion_research_chem_Canonizer$1RankObject_2_classLit = createForClass("com.actelion.research.chem", "Canonizer/1RankObject", 154, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_Canonizer$2 = function $clinit_Canonizer$2() {
    carc2.$clinit_Canonizer$2 = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Comparator();
  };
  carc2.Canonizer$2 = function Canonizer$2(this$0) {
    carc2.$clinit_Canonizer$2();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_9();
  };
  defineClass(311, 1, { 1: 1, 36: 1 }, carc2.Canonizer$2);
  _.$init_9 = function $init_9() {
  };
  _.compare_0 = function compare_3(r1, r2) {
    return this.compare_1(castTo(r1, 155), castTo(r2, 155));
  };
  _.equals_0 = function equals_1(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  _.compare_1 = function compare_2(r1, r2) {
    if (r1.rank != r2.rank)
      return r1.rank > r2.rank ? 1 : -1;
    return 0;
  };
  cggl.Lcom_actelion_research_chem_Canonizer$2_2_classLit = createForClass("com.actelion.research.chem", "Canonizer/2", 311, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_Canonizer$2RankObject = function $clinit_Canonizer$2RankObject() {
    carc2.$clinit_Canonizer$2RankObject = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.Canonizer$2RankObject = function Canonizer$2RankObject(this$0) {
    carc2.$clinit_Canonizer$2RankObject();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_10();
  };
  defineClass(155, 1, { 155: 1, 1: 1 }, carc2.Canonizer$2RankObject);
  _.$init_10 = function $init_10() {
  };
  _.index_0 = 0;
  _.parent_0 = 0;
  _.rank = 0;
  cggl.Lcom_actelion_research_chem_Canonizer$2RankObject_2_classLit = createForClass("com.actelion.research.chem", "Canonizer/2RankObject", 155, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_Canonizer$ESRGroup = function $clinit_Canonizer$ESRGroup() {
    carc2.$clinit_Canonizer$ESRGroup = emptyMethod;
  };
  defineClass(573, 1, { 22: 1, 1: 1 });
  cggl.Lcom_actelion_research_chem_Canonizer$ESRGroup_2_classLit = createForClass("com.actelion.research.chem", "Canonizer/ESRGroup", 573, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_CanonizerBaseValue = function $clinit_CanonizerBaseValue() {
    carc2.$clinit_CanonizerBaseValue = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.CanonizerBaseValue = function CanonizerBaseValue(size_0) {
    carc2.$clinit_CanonizerBaseValue();
    Object_0.call(this);
    this.$init_11();
    this.mValue = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, size_0, 14, 1);
  };
  defineClass(106, 1, { 106: 1, 22: 1, 1: 1 }, carc2.CanonizerBaseValue);
  _.$init_11 = function $init_11() {
  };
  _.compareTo_1 = function compareTo_0(b) {
    return this.compareTo_0(castTo(b, 106));
  };
  _.add_0 = function add_0(bits, data_0) {
    if (this.mAvailableBits == 0) {
      this.mIndex++;
      this.mAvailableBits = 63;
    }
    if (this.mAvailableBits == 63) {
      this.mValue[this.mIndex] = or_0(this.mValue[this.mIndex], data_0);
      this.mAvailableBits -= bits;
    } else {
      if (this.mAvailableBits >= bits) {
        this.mValue[this.mIndex] = shl_0(this.mValue[this.mIndex], bits);
        this.mValue[this.mIndex] = or_0(this.mValue[this.mIndex], data_0);
        this.mAvailableBits -= bits;
      } else {
        this.mValue[this.mIndex] = shl_0(this.mValue[this.mIndex], this.mAvailableBits);
        this.mValue[this.mIndex] = or_0(this.mValue[this.mIndex], shr_0(data_0, bits - this.mAvailableBits));
        bits -= this.mAvailableBits;
        this.mIndex++;
        this.mAvailableBits = 63 - bits;
        this.mValue[this.mIndex] = or_0(this.mValue[this.mIndex], and_0(data_0, fromInt_0((1 << bits) - 1)));
      }
    }
  };
  _.add_1 = function add_1(data_0) {
    this.mValue[this.mIndex] = add_20(this.mValue[this.mIndex], data_0);
  };
  _.compareTo_0 = function compareTo(b) {
    var i;
    for (i = 0; i < this.mIndex; i++)
      if (neq(this.mValue[i], b.mValue[i]))
        return lt(this.mValue[i], b.mValue[i]) ? -1 : 1;
    return eq(this.mValue[this.mIndex], b.mValue[this.mIndex]) ? 0 : lt(this.mValue[this.mIndex], b.mValue[this.mIndex]) ? -1 : 1;
  };
  _.getAtom = function getAtom() {
    return this.mAtom;
  };
  _.init_0 = function init_0(atom) {
    this.mAtom = atom;
    this.mIndex = 0;
    this.mAvailableBits = 63;
    ju.fill_1(this.mValue, 0);
  };
  _.mAtom = 0;
  _.mAvailableBits = 0;
  _.mIndex = 0;
  cggl.Lcom_actelion_research_chem_CanonizerBaseValue_2_classLit = createForClass("com.actelion.research.chem", "CanonizerBaseValue", 106, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_CanonizerBond = function $clinit_CanonizerBond() {
    carc2.$clinit_CanonizerBond = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.CanonizerBond = function CanonizerBond(atomRank1, atomRank2, bond) {
    carc2.$clinit_CanonizerBond();
    Object_0.call(this);
    this.$init_12();
    this.maxAtomRank = $wnd.Math.max(atomRank1, atomRank2);
    this.minAtomRank = $wnd.Math.min(atomRank1, atomRank2);
    this.bond = bond;
  };
  defineClass(170, 1, { 170: 1, 22: 1, 1: 1 }, carc2.CanonizerBond);
  _.$init_12 = function $init_12() {
  };
  _.compareTo_1 = function compareTo_2(cb) {
    return this.compareTo_2(castTo(cb, 170));
  };
  _.compareTo_2 = function compareTo_1(cb) {
    if (this.maxAtomRank != cb.maxAtomRank)
      return this.maxAtomRank > cb.maxAtomRank ? -1 : 1;
    if (this.minAtomRank != cb.minAtomRank)
      return this.minAtomRank > cb.minAtomRank ? -1 : 1;
    return 0;
  };
  _.bond = 0;
  _.maxAtomRank = 0;
  _.minAtomRank = 0;
  cggl.Lcom_actelion_research_chem_CanonizerBond_2_classLit = createForClass("com.actelion.research.chem", "CanonizerBond", 170, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_CanonizerFragment = function $clinit_CanonizerFragment() {
    carc2.$clinit_CanonizerFragment = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.CanonizerFragment = function CanonizerFragment(atom, atoms, bond, bonds) {
    carc2.$clinit_CanonizerFragment();
    Object_0.call(this);
    this.$init_13();
    this.atom = ju.copyOf_9(atom, atoms);
    this.bond = ju.copyOf_9(bond, bonds);
  };
  defineClass(197, 1, { 197: 1, 1: 1 }, carc2.CanonizerFragment);
  _.$init_13 = function $init_13() {
  };
  cggl.Lcom_actelion_research_chem_CanonizerFragment_2_classLit = createForClass("com.actelion.research.chem", "CanonizerFragment", 197, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_CanonizerMesoHelper = function $clinit_CanonizerMesoHelper() {
    carc2.$clinit_CanonizerMesoHelper = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.CanonizerMesoHelper = function CanonizerMesoHelper(mol, canRankWithoutStereo, isStereoCenter, thParity, ezParity, thESRType, thESRGroup, ezESRType, ezESRGroup, thParityRoundIsOdd, ezParityRoundIsOdd, esrTypeNeedsNormalization) {
    carc2.$clinit_CanonizerMesoHelper();
    Object_0.call(this);
    this.$init_14();
    this.mMol = mol;
    this.mCanRankWithoutStereo = canRankWithoutStereo;
    this.mIsStereoCenter = isStereoCenter;
    this.mTHParity = thParity;
    this.mEZParity = ezParity;
    this.mTHESRType = thESRType;
    this.mTHESRGroup = thESRGroup;
    this.mTHParityRoundIsOdd = thParityRoundIsOdd;
    this.mEZParityRoundIsOdd = ezParityRoundIsOdd;
    this.mTHESRTypeNeedsNormalization = esrTypeNeedsNormalization;
    this.findMesoFragments();
  };
  carc2.addToIntArray = function addToIntArray(intArray, intValue) {
    carc2.$clinit_CanonizerMesoHelper();
    var i, newArray;
    newArray = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, jsEquals(intArray, null) ? 1 : intArray.length + 1, 15, 1);
    for (i = 0; i < newArray.length - 1; i++)
      newArray[i] = intArray[i];
    newArray[newArray.length - 1] = intValue;
    return newArray;
  };
  defineClass(309, 1, { 1: 1 }, carc2.CanonizerMesoHelper);
  _.$init_14 = function $init_14() {
  };
  _.containsTypeABSParity1Or2 = function containsTypeABSParity1Or2(fragment) {
    var atom, i;
    for (i = 0; i < this.mMesoFragmentAtom[fragment].length; i++) {
      atom = this.mMesoFragmentAtom[fragment][i];
      if (this.hasParity1or2(atom) && this.mTHESRType[atom] == 0)
        return true;
    }
    return false;
  };
  _.countESRGroups = function countESRGroups(fragment, esrType) {
    var atom, count, groupBit, groupBits, i;
    count = 0;
    groupBits = 0;
    for (i = 0; i < this.mMesoFragmentAtom[fragment].length; i++) {
      atom = this.mMesoFragmentAtom[fragment][i];
      if (this.mTHESRType[atom] == esrType) {
        groupBit = 1 << this.mTHESRGroup[atom];
        if ((groupBits & groupBit) == 0) {
          groupBits |= groupBit;
          count++;
        }
      }
    }
    return count;
  };
  _.findMesoFragments = function findMesoFragments() {
    var atom1, atom2, fragmentNo, i, j, members, members$iterator, mesoFragmentList, seedAtom, seedBond;
    mesoFragmentList = new ju.TreeSet();
    for (seedAtom = 0; seedAtom < this.mMol.getAtoms_0(); seedAtom++) {
      if (this.mMol.getAtomPi_0(seedAtom) < 2 || this.mMol.getConnAtoms_0(seedAtom) > 2) {
        for (i = 1; i < this.mMol.getConnAtoms_0(seedAtom); i++) {
          atom1 = this.mMol.getConnAtom_0(seedAtom, i);
          for (j = 0; j < i; j++) {
            atom2 = this.mMol.getConnAtom_0(seedAtom, j);
            if (this.mayBeMirrorAtoms(atom1, atom2))
              this.tryAddNewMesoFragment(atom1, atom2, mesoFragmentList);
          }
        }
      }
    }
    for (seedBond = 0; seedBond < this.mMol.getBonds_0(); seedBond++) {
      if (this.mEZParity[seedBond] != 0) {
        if (this.mMol.getBondOrder_0(seedBond) != 2 || this.mEZParity[seedBond] != 2)
          continue;
      }
      atom1 = this.mMol.getBondAtom_0(0, seedBond);
      atom2 = this.mMol.getBondAtom_0(1, seedBond);
      if (this.mayBeMirrorAtoms(atom1, atom2))
        this.tryAddNewMesoFragment(atom1, atom2, mesoFragmentList);
    }
    this.mMesoFragmentAtom = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, mesoFragmentList.size(), 0, 2);
    this.mIsMesoFragmentMember = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    fragmentNo = 0;
    for (members$iterator = mesoFragmentList.iterator(); members$iterator.hasNext_0(); ) {
      members = castTo(members$iterator.next_3(), 188);
      this.mMesoFragmentAtom[fragmentNo++] = members.memberAtom;
      for (i = 0; i < members.memberAtom.length; i++)
        this.mIsMesoFragmentMember[members.memberAtom[i]] = true;
    }
  };
  _.findMirrorAtom = function findMirrorAtom(atom, parentOfMirrorAtom, isFragmentMember) {
    var candidate, i, i0, index_0, lowCandidate, lowPathLength, pathLength;
    candidate = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getConnAtoms_0(parentOfMirrorAtom), 15, 1);
    index_0 = 0;
    for (i0 = 0; i0 < this.mMol.getConnAtoms_0(parentOfMirrorAtom); i0++) {
      candidate[index_0] = this.mMol.getConnAtom_0(parentOfMirrorAtom, i0);
      if (!isFragmentMember[candidate[index_0]] && this.mayBeMirrorAtoms(atom, candidate[index_0]))
        index_0++;
    }
    if (index_0 == 0)
      return -1;
    if (index_0 == 1)
      return candidate[0];
    lowCandidate = -1;
    lowPathLength = 2147483647;
    for (i = 0; i < index_0; i++) {
      pathLength = this.mMol.getPathLength_1(atom, candidate[i], 2147483647, isFragmentMember);
      if (pathLength < lowPathLength) {
        lowPathLength = pathLength;
        lowCandidate = candidate[i];
      }
    }
    return lowCandidate;
  };
  _.hasParity1or2 = function hasParity1or2(atom) {
    carc2.$clinit_CanonizerMesoHelper();
    return this.mIsStereoCenter[atom] && (this.mTHParity[atom] == 1 || this.mTHParity[atom] == 2);
  };
  _.isInMesoFragment = function isInMesoFragment(atom) {
    return this.mIsMesoFragmentMember[atom];
  };
  _.isMeso = function isMeso() {
    var atom, meso;
    meso = true;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mTHParity[atom] != 0 && !this.mIsMesoFragmentMember[atom]) {
        meso = false;
        break;
      }
    }
    return meso;
  };
  _.isTetrahedral = function isTetrahedral(atom) {
    return this.mMol.getAtomicNo_0(atom) == 6 && this.mMol.getAtomPi_0(atom) == 0 || this.mMol.getAtomicNo_0(atom) == 7 && this.mMol.getAtomCharge_0(atom) == 1 || this.mMol.getAtomicNo_0(atom) == 14 || this.mMol.getAtomicNo_0(atom) == 15 && this.mMol.getConnAtoms_0(atom) > 2 || this.mMol.getAtomicNo_0(atom) == 16 && this.mMol.getConnAtoms_0(atom) > 2;
  };
  _.mayBeMirrorAtoms = function mayBeMirrorAtoms(atom1, atom2) {
    var bond, bond1, bond2, i, i0;
    if (atom1 == atom2)
      return false;
    if (this.mCanRankWithoutStereo[atom1] != this.mCanRankWithoutStereo[atom2])
      return false;
    if (this.mTHParity[atom1] != 0) {
      if (this.mTHParity[atom1] == 3 || this.mTHParity[atom2] == 3)
        return false;
      if (this.mTHParityRoundIsOdd[atom1] ^ this.mTHParity[atom1] != this.mTHParity[atom2])
        return false;
      if (this.mTHESRType[atom1] != this.mTHESRType[atom2] || this.mTHESRGroup[atom1] != this.mTHESRGroup[atom2])
        return false;
    }
    bond = this.mMol.getBond_0(atom1, atom2);
    if (bond != -1) {
      if (this.mMol.getBondOrder_0(bond) == 1 && this.mEZParity[bond] != 0)
        return false;
      if (this.mMol.getBondOrder_0(bond) == 2 && this.mEZParity[bond] == 1)
        return false;
    }
    if (this.mMol.getAtomPi_0(atom1) == 1 && !this.mMol.isAromaticAtom_0(atom1)) {
      bond1 = -1;
      for (i0 = 0; i0 < this.mMol.getConnAtoms_0(atom1); i0++) {
        if (this.mMol.getConnAtom_0(atom1, i0) != atom2 && this.mMol.getConnBondOrder_0(atom1, i0) == 2) {
          bond1 = this.mMol.getConnBond_0(atom1, i0);
          break;
        }
      }
      bond2 = -1;
      for (i = 0; i < this.mMol.getConnAtoms_0(atom2); i++) {
        if (this.mMol.getConnAtom_0(atom2, i) != atom1 && this.mMol.getConnBondOrder_0(atom2, i) == 2) {
          bond2 = this.mMol.getConnBond_0(atom2, i);
          break;
        }
      }
      if (bond1 != -1 && this.mEZParity[bond1] != 0 && this.mEZParityRoundIsOdd[bond1] ^ this.mEZParity[bond1] == this.mEZParity[bond2])
        return false;
    }
    return true;
  };
  _.normalizeESRGroupSwapping = function normalizeESRGroupSwapping(fragment, group, type_0, canRank) {
    var absAtom, atom, comparison, groupAtom, i, i0;
    groupAtom = null;
    absAtom = null;
    for (i0 = 0; i0 < this.mMesoFragmentAtom[fragment].length; i0++) {
      atom = this.mMesoFragmentAtom[fragment][i0];
      if (this.hasParity1or2(atom)) {
        if (this.mTHESRType[atom] == 0)
          absAtom = carc2.addToIntArray(absAtom, (canRank[atom] << 16) + atom);
        else if (this.mTHESRType[atom] == type_0 && this.mTHESRGroup[atom] == group)
          groupAtom = carc2.addToIntArray(groupAtom, (canRank[atom] << 16) + atom);
      }
    }
    comparison = new carc2.CanonizerRankListComparator().compare_2(groupAtom, absAtom);
    if (comparison == 0)
      return false;
    if (comparison < 0) {
      for (i = 0; i < this.mMesoFragmentAtom[fragment].length; i++) {
        atom = this.mMesoFragmentAtom[fragment][i];
        if (this.hasParity1or2(atom)) {
          if (this.mTHESRType[atom] == 0) {
            this.mTHESRType[atom] = narrow_byte(type_0);
            this.mTHESRGroup[atom] = narrow_byte(group);
          } else if (this.mTHESRType[atom] == type_0 && this.mTHESRGroup[atom] == group) {
            this.mTHESRType[atom] = 0;
            this.mTHESRGroup[atom] = -1;
          }
        }
      }
    }
    return true;
  };
  _.normalizeESRGroupSwappingAndRemoval = function normalizeESRGroupSwappingAndRemoval(canRank) {
    var atom, done, doneAny, i, info, j;
    if (isNull(this.mESRGroupNormalizationInfoList))
      return false;
    doneAny = false;
    for (i = this.mESRGroupNormalizationInfoList.size() - 1; i >= 0; i--) {
      done = false;
      info = castTo(this.mESRGroupNormalizationInfoList.getAtIndex(i), 114);
      if (info.action == 2) {
        done = this.normalizeESRGroupSwapping(info.fragment_0, info.group, info.type_0, canRank);
      } else if (info.action == 1) {
        done = this.removeESRGroupFromFragment(info.fragment_0, canRank);
      }
      if (done) {
        this.mESRGroupNormalizationInfoList.remove(info);
        for (j = 0; j < this.mMesoFragmentAtom[info.fragment_0].length; j++) {
          atom = this.mMesoFragmentAtom[info.fragment_0][j];
          this.mTHESRTypeNeedsNormalization[atom] = false;
        }
        doneAny = true;
      }
    }
    return doneAny;
  };
  _.normalizeESRGroups = function normalizeESRGroups() {
    var andCount, containsABS, dependentGroupCount, fragment, group, matrix, orCount, type_0;
    if (jsNotEquals(this.mMesoFragmentAtom, null)) {
      matrix = new carc2.CanonizerMesoHelper$ESRGroupFragmentMatrix(this);
      this.mESRGroupNormalizationInfoList = new ju.ArrayList();
      for (fragment = 0; fragment < this.mMesoFragmentAtom.length; fragment++) {
        dependentGroupCount = matrix.getDependentGroupCount(fragment);
        if (dependentGroupCount == 0) {
          matrix.cutTiesOfIndependentGroups(fragment);
          orCount = this.countESRGroups(fragment, 2);
          andCount = this.countESRGroups(fragment, 1);
          containsABS = this.containsTypeABSParity1Or2(fragment);
          if (orCount == 1 && andCount == 1 && !containsABS) {
            this.putORAtomsIntoANDGroup(fragment, matrix.newESRGroup(1));
            this.mESRGroupNormalizationInfoList.add(new carc2.ESRGroupNormalizationInfo(fragment, 1, -1, -1));
          }
          if (orCount > 0) {
            if (containsABS) {
              this.putABSAtomsIntoESRGroup(fragment, matrix.newESRGroup(2), 2);
              orCount++;
            }
            this.mESRGroupNormalizationInfoList.add(new carc2.ESRGroupNormalizationInfo(fragment, 1, -1, -1));
          } else if (andCount > 0) {
            if (containsABS)
              this.putABSAtomsIntoESRGroup(fragment, matrix.newESRGroup(1), 1);
            this.mESRGroupNormalizationInfoList.add(new carc2.ESRGroupNormalizationInfo(fragment, 1, -1, -1));
          } else if (containsABS) {
            this.putABSAtomsIntoESRGroup(fragment, matrix.newESRGroup(1), 1);
            this.mESRGroupNormalizationInfoList.add(new carc2.ESRGroupNormalizationInfo(fragment, 1, -1, -1));
          }
        } else if (dependentGroupCount == 1) {
          if (this.containsTypeABSParity1Or2(fragment)) {
            group = matrix.getDependentGroup(fragment);
            type_0 = matrix.getDependentType(fragment);
            this.mESRGroupNormalizationInfoList.add(new carc2.ESRGroupNormalizationInfo(fragment, 2, group, type_0));
          } else {
            matrix.cutTiesOfIndependentGroups(fragment);
            this.mESRGroupNormalizationInfoList.add(new carc2.ESRGroupNormalizationInfo(fragment, 1, -1, -1));
          }
        }
      }
    }
  };
  _.putABSAtomsIntoESRGroup = function putABSAtomsIntoESRGroup(fragment, esrGroup, esrType) {
    var atom, j;
    for (j = 0; j < this.mMesoFragmentAtom[fragment].length; j++) {
      atom = this.mMesoFragmentAtom[fragment][j];
      if (this.hasParity1or2(atom) && this.mTHESRType[atom] == 0) {
        this.mTHESRType[atom] = narrow_byte(esrType);
        this.mTHESRGroup[atom] = narrow_byte(esrGroup);
      }
    }
  };
  _.putORAtomsIntoANDGroup = function putORAtomsIntoANDGroup(fragment, esrGroup) {
    var atom, j;
    for (j = 0; j < this.mMesoFragmentAtom[fragment].length; j++) {
      atom = this.mMesoFragmentAtom[fragment][j];
      if (this.mTHESRType[atom] == 2) {
        this.mTHESRType[atom] = 1;
        this.mTHESRGroup[atom] = narrow_byte(esrGroup);
      }
    }
  };
  _.removeESRGroupFromFragment = function removeESRGroupFromFragment(fragment, canRank) {
    var atom, esrType, fragmentAtom, groupMember, i, i0, i1, i2;
    fragmentAtom = this.mMesoFragmentAtom[fragment];
    esrType = 1;
    for (i0 = 0; i0 < fragmentAtom.length; i0++) {
      atom = fragmentAtom[i0];
      if (this.mIsStereoCenter[atom] && this.mTHESRType[atom] == 2) {
        esrType = 2;
        break;
      }
    }
    groupMember = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 32, 0, 2);
    for (i1 = 0; i1 < fragmentAtom.length; i1++) {
      atom = fragmentAtom[i1];
      if (this.mIsStereoCenter[atom] && this.mTHESRType[atom] == esrType)
        groupMember[this.mTHESRGroup[atom]] = carc2.addToIntArray(groupMember[this.mTHESRGroup[atom]], (canRank[atom] << 16) + atom);
    }
    for (i2 = 0; i2 < 32; i2++)
      if (jsNotEquals(groupMember[i2], null))
        ju.sort_3(groupMember[i2]);
    ju.sort_7(groupMember, new carc2.CanonizerRankListComparator());
    if (new carc2.CanonizerRankListComparator().compare_2(groupMember[0], groupMember[1]) == 0)
      return false;
    for (i = 0; i < groupMember[0].length; i++) {
      atom = groupMember[0][i] & 65535;
      this.mTHESRType[atom] = 0;
      this.mTHESRGroup[atom] = -1;
    }
    return true;
  };
  _.tryAddNewMesoFragment = function tryAddNewMesoFragment(atom1, atom2, mesoFragmentList) {
    var members;
    members = this.tryFindMesoFragment(atom1, atom2);
    if (isNotNull(members) && members.hasStereoCenters(this.mIsStereoCenter))
      mesoFragmentList.add(members);
  };
  _.tryFindMesoFragment = function tryFindMesoFragment(atom1, atom2) {
    var b, branch, candidate, connIsOnMirrorPlane, current, currentAtom, found, graphAtom, hasOrthogonality, highest, i, i0, i1, isOrthogonal, j, k, matchAtom, members, opponent, symAtom1, symAtom2;
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    matchAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    isOrthogonal = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    hasOrthogonality = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    branch = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_MesoFragmentBranch_2_classLit, { 4: 1, 1: 1, 7: 1 }, 263, this.mMol.getAtoms_0(), 0, 1);
    members = new carc2.MesoFragmentMembers(this.mMol.getAtoms_0());
    graphAtom[0] = atom1;
    matchAtom[atom1] = atom2;
    matchAtom[atom2] = -2;
    members.add_4(atom1);
    members.add_4(atom2);
    current = 0;
    highest = 0;
    while (current <= highest) {
      currentAtom = graphAtom[current];
      if (matchAtom[currentAtom] == currentAtom) {
        for (i = 0; i < this.mMol.getConnAtoms_0(currentAtom); i++) {
          candidate = this.mMol.getConnAtom_0(currentAtom, i);
          if (!members.isMember[candidate]) {
            if (this.mMol.getConnBondOrder_0(currentAtom, i) == 2 && this.mMol.getAtomicNo_0(candidate) < 10) {
              graphAtom[++highest] = candidate;
              matchAtom[candidate] = candidate;
              hasOrthogonality[candidate] = hasOrthogonality[currentAtom] || this.mMol.getAtomPi_0(candidate) == 2;
              isOrthogonal[candidate] = hasOrthogonality[currentAtom] ? !isOrthogonal[currentAtom] : false;
              members.add_4(candidate);
            } else if (hasOrthogonality[currentAtom] && isOrthogonal[currentAtom]) {
              opponent = this.findMirrorAtom(candidate, matchAtom[currentAtom], members.isMember);
              if (opponent == -1)
                return null;
              graphAtom[++highest] = candidate;
              matchAtom[candidate] = opponent;
              matchAtom[opponent] = -2;
              hasOrthogonality[candidate] = false;
              members.add_4(candidate);
              members.add_4(opponent);
            } else if (this.mMol.isRingBond_0(this.mMol.getConnBond_0(currentAtom, i))) {
              graphAtom[++highest] = candidate;
              matchAtom[candidate] = candidate;
              hasOrthogonality[candidate] = false;
              members.add_4(candidate);
              if (this.isTetrahedral(candidate) && this.mMol.getConnAtoms_0(candidate) > 2) {
                found = false;
                for (j = 1; j < this.mMol.getConnAtoms_0(candidate); j++) {
                  symAtom1 = this.mMol.getConnAtom_0(candidate, j);
                  if (!members.isMember[symAtom1]) {
                    for (k = 0; k < j; k++) {
                      symAtom2 = this.mMol.getConnAtom_0(candidate, k);
                      if (!members.isMember[symAtom2]) {
                        if (this.mayBeMirrorAtoms(symAtom1, symAtom2)) {
                          graphAtom[++highest] = symAtom1;
                          matchAtom[symAtom1] = symAtom2;
                          matchAtom[symAtom2] = -2;
                          hasOrthogonality[symAtom1] = false;
                          members.add_4(symAtom1);
                          members.add_4(symAtom2);
                          found = true;
                        }
                      }
                    }
                  }
                }
                if (!found)
                  return null;
              }
            }
          }
        }
      } else {
        connIsOnMirrorPlane = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getConnAtoms_0(currentAtom), 16, 1);
        for (i0 = 0; i0 < this.mMol.getConnAtoms_0(currentAtom); i0++) {
          candidate = this.mMol.getConnAtom_0(currentAtom, i0);
          if (members.isMember[candidate]) {
            connIsOnMirrorPlane[i0] = matchAtom[candidate] == candidate;
          } else {
            for (j = 0; j < this.mMol.getConnAtoms_0(candidate); j++) {
              if (this.mMol.getConnAtom_0(candidate, j) == matchAtom[currentAtom]) {
                connIsOnMirrorPlane[i0] = true;
                break;
              }
            }
          }
        }
        for (i1 = 0; i1 < this.mMol.getConnAtoms_0(currentAtom); i1++) {
          if (connIsOnMirrorPlane[i1]) {
            candidate = this.mMol.getConnAtom_0(currentAtom, i1);
            if (members.isMember[candidate]) {
              if (this.mMol.getBond_0(candidate, matchAtom[currentAtom]) == -1)
                return null;
            } else {
              graphAtom[++highest] = candidate;
              matchAtom[candidate] = candidate;
              isOrthogonal[candidate] = false;
              hasOrthogonality[candidate] = true;
              members.add_4(candidate);
            }
          }
        }
        b = branch[currentAtom];
        for (i = isNull(b) ? 0 : b.neighbourIndex; i < this.mMol.getConnAtoms_0(currentAtom); i++) {
          if (!connIsOnMirrorPlane[i]) {
            candidate = this.mMol.getConnAtom_0(currentAtom, i);
            if (!members.isMember[candidate]) {
              opponent = this.findMirrorAtom(candidate, matchAtom[currentAtom], members.isMember);
              if (opponent == -1)
                return null;
              graphAtom[++highest] = candidate;
              matchAtom[candidate] = opponent;
              matchAtom[opponent] = -2;
              hasOrthogonality[candidate] = false;
              members.add_4(candidate);
              members.add_4(opponent);
            }
          }
        }
      }
      current++;
    }
    return members;
  };
  carc2.REMOVE_ESR_GROUP = 1;
  carc2.SWAP_ESR_GROUPS = 2;
  cggl.Lcom_actelion_research_chem_CanonizerMesoHelper_2_classLit = createForClass("com.actelion.research.chem", "CanonizerMesoHelper", 309, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_CanonizerMesoHelper$ESRGroupFragmentMatrix = function $clinit_CanonizerMesoHelper$ESRGroupFragmentMatrix() {
    carc2.$clinit_CanonizerMesoHelper$ESRGroupFragmentMatrix = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.CanonizerMesoHelper$ESRGroupFragmentMatrix = function CanonizerMesoHelper$ESRGroupFragmentMatrix(this$0) {
    carc2.$clinit_CanonizerMesoHelper$ESRGroupFragmentMatrix();
    var anchorGroup, atom, atom0, atom1, chainMemberLevel, cycle, fragment, fragment0, fragment1, fragment2, group, group0, group1, group2, i, j;
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_15();
    for (atom0 = 0; atom0 < this$0.mMol.getAtoms_0(); atom0++) {
      if (this$0.hasParity1or2(atom0)) {
        if (this$0.mTHESRType[atom0] == 1) {
          if (this.mAndGroupCount <= this$0.mTHESRGroup[atom0])
            this.mAndGroupCount = 1 + this$0.mTHESRGroup[atom0];
        } else if (this$0.mTHESRType[atom0] == 2) {
          if (this.mOrGroupCount <= this$0.mTHESRGroup[atom0])
            this.mOrGroupCount = 1 + this$0.mTHESRGroup[atom0];
        }
      }
    }
    this.mGroupCount = this.mAndGroupCount + this.mOrGroupCount;
    this.mMatrix = initMultidimensionalArray(cggl.Z_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 10: 1, 4: 1, 1: 1 }], [10, 5], 16, [this.mGroupCount + 1, this$0.mMesoFragmentAtom.length + 1], 2);
    for (atom1 = 0; atom1 < this$0.mMol.getAtoms_0(); atom1++)
      if (this$0.hasParity1or2(atom1) && !this$0.mIsMesoFragmentMember[atom1])
        this.mMatrix[this.groupIndex(atom1)][this$0.mMesoFragmentAtom.length] = true;
    for (fragment0 = 0; fragment0 < this$0.mMesoFragmentAtom.length; fragment0++) {
      for (j = 0; j < this$0.mMesoFragmentAtom[fragment0].length; j++) {
        atom = this$0.mMesoFragmentAtom[fragment0][j];
        if (this$0.hasParity1or2(atom))
          this.mMatrix[this.groupIndex(atom)][fragment0] = true;
      }
    }
    this.mGroupNeighbour = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, this.mGroupCount, 0, 2);
    for (fragment1 = 0; fragment1 < this$0.mMesoFragmentAtom.length; fragment1++) {
      for (group1 = 1; group1 < this.mGroupCount; group1++) {
        if (this.mMatrix[group1][fragment1]) {
          for (group2 = 0; group2 < group1; group2++) {
            if (this.mMatrix[group2][fragment1]) {
              this.mGroupNeighbour[group1] = carc2.addToIntArray(this.mGroupNeighbour[group1], group2);
              this.mGroupNeighbour[group2] = carc2.addToIntArray(this.mGroupNeighbour[group2], group1);
            }
          }
        }
      }
    }
    this.mGroupDependence = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mGroupCount + 1, 15, 1);
    for (group0 = 0; group0 < this.mGroupCount; group0++) {
      if (this.mMatrix[group0][this$0.mMesoFragmentAtom.length])
        this.mGroupDependence[group0] = -1;
      else
        this.mGroupDependence[group0] = -2;
    }
    for (fragment2 = 0; fragment2 < this$0.mMesoFragmentAtom.length; fragment2++) {
      if (this.mMatrix[this.mGroupCount][fragment2]) {
        for (group = 0; group < this.mGroupCount; group++) {
          if (this.mMatrix[group][fragment2] && this.mGroupDependence[group] != fragment2) {
            if (this.mGroupDependence[group] == -2)
              this.mGroupDependence[group] = fragment2;
            else
              this.mGroupDependence[group] = -3;
          }
        }
      }
    }
    for (anchorGroup = 0; anchorGroup < this.mGroupCount; anchorGroup++) {
      if (this.mGroupDependence[anchorGroup] >= -1) {
        chainMemberLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mGroupCount, 15, 1);
        if (this.extendAnchorChain(chainMemberLevel, anchorGroup)) {
          for (group = 0; group < this.mGroupCount; group++) {
            if (chainMemberLevel[group] != 0)
              this.mGroupDependence[group] = -3;
          }
        }
      }
    }
    for (fragment = 0; fragment < this$0.mMesoFragmentAtom.length - 1; fragment++) {
      for (group1 = 1; group1 < this.mGroupCount; group1++) {
        if (this.mMatrix[group1][fragment] && this.mGroupDependence[group1] != -3) {
          for (group2 = 0; group2 < group1; group2++) {
            if (this.mMatrix[group2][fragment] && this.mGroupDependence[group2] != -3) {
              cycle = this.getDependencyCycle(group1, group2, fragment);
              if (jsNotEquals(cycle, null)) {
                for (i = 0; i < cycle.length; i++)
                  this.mGroupDependence[cycle[i]] = -3;
                this.removeOneGroupFromCycle(cycle);
                break;
              }
            }
          }
        }
      }
    }
  };
  defineClass(449, 1, { 1: 1 }, carc2.CanonizerMesoHelper$ESRGroupFragmentMatrix);
  _.$init_15 = function $init_15() {
  };
  _.cutTiesOfIndependentGroups = function cutTiesOfIndependentGroups(fragment) {
    carc2.$clinit_CanonizerMesoHelper$ESRGroupFragmentMatrix();
    var atom, f, group, i, newESRGroup, oldESRGroup;
    for (group = 0; group < this.mGroupCount; group++) {
      if (this.mMatrix[group][fragment] && this.mGroupDependence[group] != -3) {
        for (f = 0; f <= this.this$01.mMesoFragmentAtom.length; f++) {
          if (f != fragment && this.mMatrix[group][f]) {
            this.mMatrix[group][fragment] = false;
            oldESRGroup = this.getESRGroup(group);
            newESRGroup = this.newESRGroup(this.getESRType(group));
            for (i = 0; i < this.this$01.mMesoFragmentAtom[fragment].length; i++) {
              atom = this.this$01.mMesoFragmentAtom[fragment][i];
              if (this.this$01.hasParity1or2(atom) && this.this$01.mTHESRGroup[atom] == oldESRGroup)
                this.this$01.mTHESRGroup[atom] = narrow_byte(newESRGroup);
            }
          }
        }
      }
    }
  };
  _.extendAnchorChain = function extendAnchorChain(chainMemberLevel, anchorGroup) {
    var chainExtentionFound, group1, group2, level, secondAnchorFound;
    secondAnchorFound = false;
    level = 1;
    chainMemberLevel[anchorGroup] = level;
    chainExtentionFound = true;
    while (chainExtentionFound) {
      chainExtentionFound = false;
      for (group1 = 0; group1 < this.mGroupCount; group1++) {
        if (chainMemberLevel[group1] == level) {
          for (group2 = 0; group2 < this.mGroupCount; group2++) {
            if (chainMemberLevel[group2] == 0 && this.groupsShareFragment(group1, group2)) {
              if (this.mGroupDependence[group2] == -2) {
                chainMemberLevel[group2] = level + 1;
                chainExtentionFound = true;
              } else if (this.mGroupDependence[group2] != this.mGroupDependence[anchorGroup]) {
                chainMemberLevel[group2] = level + 1;
                secondAnchorFound = true;
              }
            }
          }
        }
      }
      level++;
    }
    return secondAnchorFound;
  };
  _.getDependencyCycle = function getDependencyCycle(group1, group2, startFragment) {
    var candidate, current, cycle, cycleLength, fragment, graphGroup, graphLevel, highest, i, j, parentGroup;
    for (fragment = startFragment + 1; fragment < this.this$01.mMesoFragmentAtom.length; fragment++) {
      if (fragment != startFragment && this.mMatrix[group1][fragment] && this.mMatrix[group2][fragment]) {
        cycle = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
        cycle[0] = group2;
        cycle[1] = group1;
        return cycle;
      }
    }
    parentGroup = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mGroupCount, 15, 1);
    graphLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mGroupCount, 15, 1);
    graphGroup = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mGroupCount, 15, 1);
    current = 0;
    highest = 0;
    graphGroup[0] = group1;
    graphLevel[group1] = 1;
    while (current <= highest) {
      for (i = 0; i < this.mGroupNeighbour[graphGroup[current]].length; i++) {
        candidate = this.mGroupNeighbour[graphGroup[current]][i];
        if (candidate == group2) {
          if (current == 0)
            continue;
          cycleLength = graphLevel[graphGroup[current]] + 1;
          cycle = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, cycleLength, 15, 1);
          cycle[0] = candidate;
          cycle[1] = graphGroup[current];
          for (j = 2; j < cycleLength; j++)
            cycle[j] = parentGroup[cycle[j - 1]];
          return cycle;
        }
        if (graphLevel[candidate] == 0 && this.mGroupDependence[candidate] != -3) {
          graphLevel[candidate] = graphLevel[graphGroup[current]] + 1;
          graphGroup[++highest] = candidate;
          parentGroup[candidate] = graphGroup[current];
        }
      }
      current++;
    }
    return null;
  };
  _.getDependentGroup = function getDependentGroup(fragment) {
    carc2.$clinit_CanonizerMesoHelper$ESRGroupFragmentMatrix();
    var group;
    for (group = 0; group < this.mGroupCount; group++)
      if (this.mMatrix[group][fragment] && this.mGroupDependence[group] == -3)
        return this.getESRGroup(group);
    return -1;
  };
  _.getDependentGroupCount = function getDependentGroupCount(fragment) {
    carc2.$clinit_CanonizerMesoHelper$ESRGroupFragmentMatrix();
    var count, group;
    count = 0;
    for (group = 0; group < this.mGroupCount; group++)
      if (this.mMatrix[group][fragment] && this.mGroupDependence[group] == -3)
        count++;
    return count;
  };
  _.getDependentType = function getDependentType(fragment) {
    carc2.$clinit_CanonizerMesoHelper$ESRGroupFragmentMatrix();
    var group;
    for (group = 0; group < this.mGroupCount; group++)
      if (this.mMatrix[group][fragment] && this.mGroupDependence[group] == -3)
        return this.getESRType(group);
    return -1;
  };
  _.getESRGroup = function getESRGroup(group) {
    return group < this.mAndGroupCount ? group : group < this.mGroupCount ? group - this.mAndGroupCount : -1;
  };
  _.getESRType = function getESRType(group) {
    return group < this.mAndGroupCount ? 1 : group < this.mGroupCount ? 2 : 0;
  };
  _.groupIndex = function groupIndex(atom) {
    var group, type_0;
    type_0 = this.this$01.mTHESRType[atom];
    group = this.this$01.mTHESRGroup[atom];
    return type_0 == 0 ? this.mGroupCount : type_0 == 1 ? group : this.mAndGroupCount + group;
  };
  _.groupsShareFragment = function groupsShareFragment(group1, group2) {
    var fragment;
    for (fragment = 0; fragment < this.this$01.mMesoFragmentAtom.length; fragment++)
      if (this.mMatrix[group1][fragment] && this.mMatrix[group2][fragment])
        return true;
    return false;
  };
  _.newESRGroup = function newESRGroup_0(esrType) {
    carc2.$clinit_CanonizerMesoHelper$ESRGroupFragmentMatrix();
    return esrType == 1 ? this.mAndGroupCount + this.mNewAndGroupCount++ : this.mOrGroupCount + this.mNewOrGroupCount++;
  };
  _.removeOneGroupFromCycle = function removeOneGroupFromCycle(cycle) {
    var atom, atom0, esrGroup, esrType, fragment, i, minGroup, minGroupIndex, minRank, minType;
    minRank = 2147483647;
    minGroup = -1;
    minType = -1;
    minGroupIndex = -1;
    for (atom0 = 0; atom0 < this.this$01.mMol.getAtoms_0(); atom0++) {
      if (this.this$01.hasParity1or2(atom0) && this.this$01.mTHESRType[atom0] != 0) {
        for (i = 0; i < cycle.length; i++) {
          esrGroup = this.getESRGroup(cycle[i]);
          esrType = this.getESRType(cycle[i]);
          if (this.this$01.mTHESRType[atom0] == esrType && this.this$01.mTHESRGroup[atom0] == esrGroup) {
            if (minRank > this.this$01.mCanRankWithoutStereo[atom0] + (esrType == 1 ? 65536 : 0)) {
              minRank = this.this$01.mCanRankWithoutStereo[atom0] + (esrType == 1 ? 65536 : 0);
              minGroup = esrGroup;
              minType = esrType;
              minGroupIndex = cycle[i];
            }
          }
        }
      }
    }
    for (atom = 0; atom < this.this$01.mMol.getAtoms_0(); atom++) {
      if (this.this$01.hasParity1or2(atom) && this.this$01.mTHESRType[atom] == minType && this.this$01.mTHESRGroup[atom] == minGroup) {
        this.this$01.mTHESRType[atom] = 0;
        this.this$01.mTHESRGroup[atom] = -1;
      }
    }
    for (fragment = 0; fragment < this.this$01.mMesoFragmentAtom.length; fragment++)
      this.mMatrix[minGroupIndex][fragment] = false;
  };
  _.mAndGroupCount = 0;
  _.mGroupCount = 0;
  _.mNewAndGroupCount = 0;
  _.mNewOrGroupCount = 0;
  _.mOrGroupCount = 0;
  cggl.Lcom_actelion_research_chem_CanonizerMesoHelper$ESRGroupFragmentMatrix_2_classLit = createForClass("com.actelion.research.chem", "CanonizerMesoHelper/ESRGroupFragmentMatrix", 449, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_CanonizerParity = function $clinit_CanonizerParity() {
    carc2.$clinit_CanonizerParity = emptyMethod;
  };
  defineClass(574, 1, { 22: 1, 1: 1 });
  cggl.Lcom_actelion_research_chem_CanonizerParity_2_classLit = createForClass("com.actelion.research.chem", "CanonizerParity", 574, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_CanonizerRankListComparator = function $clinit_CanonizerRankListComparator() {
    carc2.$clinit_CanonizerRankListComparator = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Comparator();
  };
  carc2.CanonizerRankListComparator = function CanonizerRankListComparator() {
    carc2.$clinit_CanonizerRankListComparator();
    Object_0.call(this);
    this.$init_16();
  };
  defineClass(217, 1, { 1: 1, 36: 1 }, carc2.CanonizerRankListComparator);
  _.$init_16 = function $init_16() {
  };
  _.compare_0 = function compare_4(o1, o2) {
    return this.compare_2(castTo(o1, 6), castTo(o2, 6));
  };
  _.equals_0 = function equals_2(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  _.compare_2 = function compare_5(o1, o2) {
    var count, i;
    if (jsEquals(o1, null))
      return jsEquals(o2, null) ? 0 : 1;
    if (jsEquals(o2, null))
      return -1;
    count = $wnd.Math.min(o1.length, o2.length);
    for (i = 0; i < count; i++)
      if ((o1[i] & -65536) != (o2[i] & -65536))
        return (o1[i] & -65536) < (o2[i] & -65536) ? -1 : 1;
    return o1.length == o2.length ? 0 : o1.length < o2.length ? -1 : 1;
  };
  cggl.Lcom_actelion_research_chem_CanonizerRankListComparator_2_classLit = createForClass("com.actelion.research.chem", "CanonizerRankListComparator", 217, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_CanonizerUtil = function $clinit_CanonizerUtil() {
    carc2.$clinit_CanonizerUtil = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.getIDCode_0 = function getIDCode_0(mol, type_0, largestFragmentOnly) {
    carc2.$clinit_CanonizerUtil();
    switch (type_0.ordinal()) {
      case (carc2.$clinit_CanonizerUtil$IDCODE_TYPE(), carc2.NORMAL).ordinal():
        return carc2.getIDCode_1(mol, largestFragmentOnly);
      case (carc2.$clinit_CanonizerUtil$IDCODE_TYPE(), carc2.NOSTEREO).ordinal():
        return carc2.getIDCodeNoStereo(mol, largestFragmentOnly);
      case (carc2.$clinit_CanonizerUtil$IDCODE_TYPE(), carc2.BACKBONE).ordinal():
        return carc2.getIDCodeBackBone(mol, largestFragmentOnly);
      case (carc2.$clinit_CanonizerUtil$IDCODE_TYPE(), carc2.TAUTOMER).ordinal():
        return carc2.getIDCodeTautomer(mol, largestFragmentOnly);
      case (carc2.$clinit_CanonizerUtil$IDCODE_TYPE(), carc2.NOSTEREO_TAUTOMER).ordinal():
        return carc2.getIDCodeNoStereoTautomer(mol, largestFragmentOnly);
      default:
        break;
    }
    return null;
  };
  carc2.getIDCode_1 = function getIDCode_1(mol, largestFragmentOnly) {
    var e;
    try {
      if (!largestFragmentOnly)
        return new carc2.Canonizer(mol).getIDCode_0();
      mol = mol.getCompactCopy_0();
      mol.stripSmallFragments_0(true);
      carc2.neutralizeChargedMolecule(mol);
      return new carc2.Canonizer(mol).getIDCode_0();
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 18)) {
        e = $e0;
        (jl.$clinit_System(), jl.err).println_0("WARN: getIDCode() " + e);
        return null;
      } else
        throw toJs($e0);
    }
  };
  carc2.getIDCodeBackBone = function getIDCodeBackBone(mol, largestFragmentOnly) {
    var b, e, i;
    try {
      mol = mol.getCompactCopy_0();
      if (largestFragmentOnly) {
        mol.stripSmallFragments_0(true);
        carc2.neutralizeChargedMolecule(mol);
      }
      mol.stripStereoInformation_0();
      b = mol.getAllBonds_0();
      for (i = 0; i < b; i++)
        mol.setBondType_0(i, 1);
      return new carc2.Canonizer(mol).getIDCode_0();
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 18)) {
        e = $e0;
        (jl.$clinit_System(), jl.err).println_0("WARN: getIDCodeBackBone() " + e);
        return null;
      } else
        throw toJs($e0);
    }
  };
  carc2.getIDCodeNoStereo = function getIDCodeNoStereo(mol, largestFragmentOnly) {
    var e;
    try {
      mol = mol.getCompactCopy_0();
      if (largestFragmentOnly) {
        mol.stripSmallFragments_0(true);
        carc2.neutralizeChargedMolecule(mol);
      }
      mol.stripStereoInformation_0();
      return new carc2.Canonizer(mol).getIDCode_0();
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 18)) {
        e = $e0;
        (jl.$clinit_System(), jl.err).println_0("WARN: getIDCodeNoStereo() " + e);
        return null;
      } else
        throw toJs($e0);
    }
  };
  carc2.getIDCodeNoStereoTautomer = function getIDCodeNoStereoTautomer(mol, largestFragmentOnly) {
    var e, genericTautomer;
    try {
      mol = mol.getCompactCopy_0();
      if (largestFragmentOnly) {
        mol.stripSmallFragments_0(true);
        carc2.neutralizeChargedMolecule(mol);
      }
      mol.stripStereoInformation_0();
      genericTautomer = new carc2.TautomerHelper(mol).createGenericTautomer();
      return new carc2.Canonizer_0(genericTautomer, 8).getIDCode_0();
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 18)) {
        e = $e0;
        (jl.$clinit_System(), jl.err).println_0("WARN: getIDCodeNoStereoTautomer() " + e);
        return null;
      } else
        throw toJs($e0);
    }
  };
  carc2.getIDCodeTautomer = function getIDCodeTautomer(mol, largestFragmentOnly) {
    var e, genericTautomer;
    try {
      if (largestFragmentOnly) {
        mol = mol.getCompactCopy_0();
        mol.stripSmallFragments_0(true);
        carc2.neutralizeChargedMolecule(mol);
      }
      genericTautomer = new carc2.TautomerHelper(mol).createGenericTautomer();
      return new carc2.Canonizer_0(genericTautomer, 8).getIDCode_0();
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 18)) {
        e = $e0;
        (jl.$clinit_System(), jl.err).println_0("WARN: getIDCodeTautomer() " + e);
        return null;
      } else
        throw toJs($e0);
    }
  };
  defineClass(646, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_CanonizerUtil_2_classLit = createForClass("com.actelion.research.chem", "CanonizerUtil", 646, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_Enum = function $clinit_Enum() {
    jl.$clinit_Enum = emptyMethod;
    jl.$clinit_Object();
  };
  function Enum(name_0, ordinal) {
    jl.$clinit_Enum();
    Object_0.call(this);
    this.$init_17();
    this.name_0 = name_0;
    this.ordinal_0 = ordinal;
  }
  function createValueOfMap(enumConstants) {
    jl.$clinit_Enum();
    var result, value_0, value$array, value$index, value$max;
    result = createObject_0();
    for (value$array = enumConstants, value$index = 0, value$max = value$array.length; value$index < value$max; ++value$index) {
      value_0 = value$array[value$index];
      jl.put0(result, ":" + value_0.name(), value_0);
    }
    return result;
  }
  jl.get0 = function get0(map_0, name_0) {
    return map_0[name_0];
  };
  jl.put0 = function put0(map_0, name_0, value_0) {
    map_0[name_0] = value_0;
  };
  function valueOf(map_0, name_0) {
    jl.$clinit_Enum();
    var result;
    ji2.checkNotNull_0(name_0);
    result = jl.get0(map_0, ":" + name_0);
    ji2.checkCriticalArgument_1(isNotNull(result), "Enum constant undefined: " + name_0);
    return result;
  }
  defineClass(48, 1, { 4: 1, 22: 1, 48: 1, 1: 1 });
  _.$init_17 = function $init_17() {
  };
  _.compareTo_1 = function compareTo_4(other) {
    return this.compareTo(castTo(other, 48));
  };
  _.compareTo = function compareTo_3(other) {
    return this.ordinal_0 - castTo(other, 48).ordinal_0;
  };
  _.equals = function equals_3(other) {
    return maskUndefined(this) === maskUndefined(other);
  };
  _.equals_0 = function(other) {
    return this.equals(other);
  };
  _.hashCode = function hashCode_1() {
    return getClassPrototype(1).hashCode_1.call(this);
  };
  _.hashCode_1 = function() {
    return this.hashCode();
  };
  _.name = function name_1() {
    return jsNotEquals(this.name_0, null) ? this.name_0 : "" + this.ordinal_0;
  };
  _.ordinal = function ordinal_0() {
    return this.ordinal_0;
  };
  _.toString = function toString_4() {
    return this.name();
  };
  _.toString_0 = function() {
    return this.toString();
  };
  _.ordinal_0 = 0;
  cggl.Ljava_lang_Enum_2_classLit = createForClass("java.lang", "Enum", 48, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_CanonizerUtil$IDCODE_TYPE = function $clinit_CanonizerUtil$IDCODE_TYPE() {
    carc2.$clinit_CanonizerUtil$IDCODE_TYPE = emptyMethod;
    jl.$clinit_Enum();
    carc2.NORMAL = new carc2.CanonizerUtil$IDCODE_TYPE("NORMAL", 0);
    carc2.NOSTEREO = new carc2.CanonizerUtil$IDCODE_TYPE("NOSTEREO", 1);
    carc2.BACKBONE = new carc2.CanonizerUtil$IDCODE_TYPE("BACKBONE", 2);
    carc2.TAUTOMER = new carc2.CanonizerUtil$IDCODE_TYPE("TAUTOMER", 3);
    carc2.NOSTEREO_TAUTOMER = new carc2.CanonizerUtil$IDCODE_TYPE("NOSTEREO_TAUTOMER", 4);
  };
  carc2.CanonizerUtil$IDCODE_TYPE = function CanonizerUtil$IDCODE_TYPE(enum$name, enum$ordinal) {
    Enum.call(this, enum$name, enum$ordinal);
    this.$init_18();
  };
  carc2.valueOf_0 = function valueOf_0(name_0) {
    carc2.$clinit_CanonizerUtil$IDCODE_TYPE();
    return valueOf((carc2.$clinit_CanonizerUtil$IDCODE_TYPE$Map(), carc2.$MAP), name_0);
  };
  carc2.values_0 = function values_0() {
    carc2.$clinit_CanonizerUtil$IDCODE_TYPE();
    return stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_CanonizerUtil$IDCODE_1TYPE_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 124, 0, [carc2.NORMAL, carc2.NOSTEREO, carc2.BACKBONE, carc2.TAUTOMER, carc2.NOSTEREO_TAUTOMER]);
  };
  defineClass(124, 48, { 124: 1, 4: 1, 22: 1, 48: 1, 1: 1 }, carc2.CanonizerUtil$IDCODE_TYPE);
  _.$init_18 = function $init_18() {
  };
  cggl.Lcom_actelion_research_chem_CanonizerUtil$IDCODE_1TYPE_2_classLit = createForEnum("com.actelion.research.chem", "CanonizerUtil/IDCODE_TYPE", 124, cggl.Ljava_lang_Enum_2_classLit, carc2.values_0, carc2.valueOf_0);
  carc2.$clinit_CanonizerUtil$IDCODE_TYPE$Map = function $clinit_CanonizerUtil$IDCODE_TYPE$Map() {
    carc2.$clinit_CanonizerUtil$IDCODE_TYPE$Map = emptyMethod;
    carc2.$MAP = createValueOfMap(carc2.values_0());
  };
  defineClass(648, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_CanonizerUtil$IDCODE_1TYPE$Map_2_classLit = createForClass("com.actelion.research.chem", "CanonizerUtil/IDCODE_TYPE/Map", 648, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_CanonizerUtil$StrongHasher = function $clinit_CanonizerUtil$StrongHasher() {
    carc2.$clinit_CanonizerUtil$StrongHasher = emptyMethod;
  };
  defineClass(647, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_CanonizerUtil$StrongHasher_2_classLit = createForClass("com.actelion.research.chem", "CanonizerUtil/StrongHasher", 647, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_Coordinates = function $clinit_Coordinates() {
    carc2.$clinit_Coordinates = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.Coordinates_0 = function Coordinates_0() {
    carc2.$clinit_Coordinates();
    Object_0.call(this);
    this.$init_19();
  };
  carc2.Coordinates_1 = function Coordinates_1(x_0, y_0, z_0) {
    carc2.$clinit_Coordinates();
    Object_0.call(this);
    this.$init_19();
    this.x_0 = x_0;
    this.y_0 = y_0;
    this.z_0 = z_0;
  };
  carc2.Coordinates_2 = function Coordinates_2(c) {
    carc2.$clinit_Coordinates();
    carc2.Coordinates_1.call(this, c.x_0, c.y_0, c.z_0);
  };
  defineClass(33, 1, { 33: 1, 4: 1, 22: 1, 1: 1 }, carc2.Coordinates_0, carc2.Coordinates_1, carc2.Coordinates_2);
  _.$init_19 = function $init_19() {
  };
  _.compareTo_1 = function compareTo_6(o) {
    return this.compareTo_3(castTo(o, 33));
  };
  _.add_2 = function add_2(dx, dy, dz) {
    this.x_0 += dx;
    this.y_0 += dy;
    this.z_0 += dz;
  };
  _.add_3 = function add_3(c) {
    this.x_0 += c.x_0;
    this.y_0 += c.y_0;
    this.z_0 += c.z_0;
    return this;
  };
  _.addC = function addC(c) {
    return new carc2.Coordinates_1(this.x_0 + c.x_0, this.y_0 + c.y_0, this.z_0 + c.z_0);
  };
  _.center = function center_0(c) {
    this.x_0 = (this.x_0 + c.x_0) / 2;
    this.y_0 = (this.y_0 + c.y_0) / 2;
    this.z_0 = (this.z_0 + c.z_0) / 2;
    return this;
  };
  _.compareTo_3 = function compareTo_5(o) {
    if (this.x_0 != o.x_0)
      return this.x_0 < o.x_0 ? -1 : 1;
    if (this.y_0 != o.y_0)
      return this.y_0 < o.y_0 ? -1 : 1;
    if (this.z_0 != o.z_0)
      return this.z_0 < o.z_0 ? -1 : 1;
    return 0;
  };
  _.cross = function cross(c) {
    return new carc2.Coordinates_1(this.y_0 * c.z_0 - this.z_0 * c.y_0, -(this.x_0 * c.z_0 - this.z_0 * c.x_0), this.x_0 * c.y_0 - this.y_0 * c.x_0);
  };
  _.dist = function dist_0() {
    return $wnd.Math.sqrt(this.distSq());
  };
  _.distSq = function distSq() {
    return this.x_0 * this.x_0 + this.y_0 * this.y_0 + this.z_0 * this.z_0;
  };
  _.distance = function distance_0(c) {
    return $wnd.Math.sqrt(this.distanceSquared(c));
  };
  _.distanceSquared = function distanceSquared(c) {
    return (c.x_0 - this.x_0) * (c.x_0 - this.x_0) + (c.y_0 - this.y_0) * (c.y_0 - this.y_0) + (c.z_0 - this.z_0) * (c.z_0 - this.z_0);
  };
  _.dot = function dot_0(c) {
    return this.x_0 * c.x_0 + this.y_0 * c.y_0 + this.z_0 * c.z_0;
  };
  _.equals_0 = function equals_4(o) {
    var c;
    if (jsEquals(o, null) || !instanceOf(o, 33))
      return false;
    c = castTo(o, 33);
    return $wnd.Math.abs(c.x_0 - this.x_0) + $wnd.Math.abs(c.y_0 - this.y_0) + $wnd.Math.abs(c.z_0 - this.z_0) < 1e-6;
  };
  _.getAngle_0 = function getAngle(c) {
    var d, d1, d2;
    d1 = this.distSq();
    d2 = c.distSq();
    if (d1 == 0 || d2 == 0)
      return 0;
    d = this.dot(c) / $wnd.Math.sqrt(d1 * d2);
    if (d >= 1)
      return 0;
    if (d <= -1)
      return 3.141592653589793;
    return $wnd.Math.acos(d);
  };
  _.getLength = function getLength() {
    return this.dist();
  };
  _.isNaN_0 = function isNaN_0() {
    return isNaN(this.x_0) || isNaN(this.y_0) || isNaN(this.z_0);
  };
  _.rotate = function rotate(m) {
    var x0, y0, z0;
    x0 = this.x_0;
    y0 = this.y_0;
    z0 = this.z_0;
    this.x_0 = x0 * m[0][0] + y0 * m[1][0] + z0 * m[2][0];
    this.y_0 = x0 * m[0][1] + y0 * m[1][1] + z0 * m[2][1];
    this.z_0 = x0 * m[0][2] + y0 * m[1][2] + z0 * m[2][2];
    return this;
  };
  _.scale_1 = function scale_1(scale) {
    this.x_0 *= scale;
    this.y_0 *= scale;
    this.z_0 *= scale;
    return this;
  };
  _.set_0 = function set_1(x_0, y_0, z_0) {
    this.x_0 = x_0;
    this.y_0 = y_0;
    this.z_0 = z_0;
  };
  _.set_1 = function set_2(c) {
    this.set_0(c.x_0, c.y_0, c.z_0);
    return this;
  };
  _.sub_0 = function sub_0(c) {
    this.x_0 -= c.x_0;
    this.y_0 -= c.y_0;
    this.z_0 -= c.z_0;
    return this;
  };
  _.subC = function subC(c) {
    return new carc2.Coordinates_1(this.x_0 - c.x_0, this.y_0 - c.y_0, this.z_0 - c.z_0);
  };
  _.toString_0 = function toString_5() {
    var df;
    df = new jt.DecimalFormat("0.00");
    return "[" + df.format(this.x_0) + ", " + df.format(this.y_0) + ", " + df.format(this.z_0) + "]";
  };
  _.unit = function unit_0() {
    var d;
    d = this.dist();
    if (d == 0) {
      (jl.$clinit_System(), jl.out_0).println_0("Cannot call unit() on a null vector. Returned (1,0,0)");
      this.x_0 = 1;
      this.y_0 = 0;
      this.z_0 = 0;
      return this;
    }
    this.x_0 /= d;
    this.y_0 /= d;
    this.z_0 /= d;
    return this;
  };
  _.x_0 = 0;
  _.y_0 = 0;
  _.z_0 = 0;
  cggl.Lcom_actelion_research_chem_Coordinates_2_classLit = createForClass("com.actelion.research.chem", "Coordinates", 33, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_DepictorTransformation = function $clinit_DepictorTransformation() {
    carc2.$clinit_DepictorTransformation = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.DepictorTransformation = function DepictorTransformation() {
    carc2.$clinit_DepictorTransformation();
    Object_0.call(this);
    this.$init_20();
    this.clear_0();
  };
  carc2.DepictorTransformation_0 = function DepictorTransformation_0(scaling, offsetX, offsetY) {
    carc2.$clinit_DepictorTransformation();
    Object_0.call(this);
    this.$init_20();
    this.mScaling = scaling;
    this.mOffsetX = offsetX;
    this.mOffsetY = offsetY;
  };
  carc2.DepictorTransformation_1 = function DepictorTransformation_1(bounds, view, averageBondLength, mode) {
    carc2.$clinit_DepictorTransformation();
    var bScaling, hScaling, maxAVBL, vScaling;
    Object_0.call(this);
    this.$init_20();
    this.clear_0();
    if (isNotNull(view)) {
      if ((mode & 196608) == 0) {
        if (!view.contains_2(bounds)) {
          if (bounds.width_0 > view.width_0 || bounds.height_0 > view.height_0) {
            hScaling = view.width_0 / bounds.width_0;
            vScaling = view.height_0 / bounds.height_0;
            this.mScaling = $wnd.Math.min(hScaling, vScaling);
          }
          if (bounds.x_0 * this.mScaling < view.x_0)
            this.mOffsetX = view.x_0 - bounds.x_0 * this.mScaling;
          else if ((bounds.x_0 + bounds.width_0) * this.mScaling > view.x_0 + view.width_0)
            this.mOffsetX = view.x_0 + view.width_0 - (bounds.x_0 + bounds.width_0) * this.mScaling;
          if (bounds.y_0 * this.mScaling < view.y_0)
            this.mOffsetY = view.y_0 - bounds.y_0 * this.mScaling;
          else if ((bounds.y_0 + bounds.height_0) * this.mScaling > view.y_0 + view.height_0)
            this.mOffsetY = view.y_0 + view.height_0 - (bounds.y_0 + bounds.height_0) * this.mScaling;
        }
      } else {
        hScaling = view.width_0 / bounds.width_0;
        vScaling = view.height_0 / bounds.height_0;
        maxAVBL = mode & 65535;
        if (maxAVBL == 0)
          maxAVBL = 24;
        else if ((mode & 131072) != 0)
          maxAVBL /= 256;
        bScaling = maxAVBL / averageBondLength;
        this.mScaling = $wnd.Math.min(bScaling, $wnd.Math.min(hScaling, vScaling));
        this.mOffsetX = view.x_0 + view.width_0 / 2 - this.mScaling * (bounds.x_0 + bounds.width_0 / 2);
        this.mOffsetY = view.y_0 + view.height_0 / 2 - this.mScaling * (bounds.y_0 + bounds.height_0 / 2);
      }
    } else if ((mode & 65536) != 0) {
      maxAVBL = (mode & 65535) != 0 ? mode & 65535 : 24;
      this.mScaling = maxAVBL / averageBondLength;
    }
  };
  defineClass(98, 1, { 1: 1 }, carc2.DepictorTransformation, carc2.DepictorTransformation_0, carc2.DepictorTransformation_1);
  _.$init_20 = function $init_20() {
  };
  _.applyTo = function applyTo(o) {
    o.scale_0(this.mScaling);
    o.move(this.mOffsetX, this.mOffsetY);
  };
  _.applyTo_0 = function applyTo_0(t) {
    t.mScaling *= this.mScaling;
    t.mOffsetX = t.mOffsetX * this.mScaling + this.mOffsetX;
    t.mOffsetY = t.mOffsetY * this.mScaling + this.mOffsetY;
  };
  _.applyTo_1 = function applyTo_1(m) {
    m.scaleCoords_0(this.mScaling);
    m.translateCoords_0(this.mOffsetX, this.mOffsetY);
  };
  _.applyTo_2 = function applyTo_2(p) {
    p.x_0 = p.x_0 * this.mScaling + this.mOffsetX;
    p.y_0 = p.y_0 * this.mScaling + this.mOffsetY;
  };
  _.applyTo_3 = function applyTo_3(r) {
    r.x_0 = r.x_0 * this.mScaling + this.mOffsetX;
    r.y_0 = r.y_0 * this.mScaling + this.mOffsetY;
    r.width_0 *= this.mScaling;
    r.height_0 *= this.mScaling;
  };
  _.clear_0 = function clear_0() {
    this.mOffsetX = 0;
    this.mOffsetY = 0;
    this.mScaling = 1;
  };
  _.getScaling = function getScaling() {
    return this.mScaling;
  };
  _.isVoidTransformation = function isVoidTransformation() {
    return this.mScaling == 1 && this.mOffsetX == 0 && this.mOffsetY == 0;
  };
  _.move = function move_0(dx, dy) {
    this.mOffsetX += dx;
    this.mOffsetY += dy;
  };
  _.toString_0 = function toString_6() {
    return "DepictorTransformation Offset: " + this.mOffsetX + "," + this.mOffsetY + " Scaling: " + this.mScaling;
  };
  _.transformX = function transformX(x_0) {
    return x_0 * this.mScaling + this.mOffsetX;
  };
  _.transformY = function transformY(y_0) {
    return y_0 * this.mScaling + this.mOffsetY;
  };
  _.mOffsetX = 0;
  _.mOffsetY = 0;
  _.mScaling = 0;
  cggl.Lcom_actelion_research_chem_DepictorTransformation_2_classLit = createForClass("com.actelion.research.chem", "DepictorTransformation", 98, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_DrawingObjectFactory = function $clinit_DrawingObjectFactory() {
    carc2.$clinit_DrawingObjectFactory = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.createObject = function createObject(descriptor) {
    carc2.$clinit_DrawingObjectFactory();
    var START, detail, index_0, type_0;
    START = '<DrawingObject type="';
    if (!jl.startsWith_Ljava_lang_String__Z__devirtual$(descriptor, '<DrawingObject type="') || !jl.endsWith_Ljava_lang_String__Z__devirtual$(descriptor, "></DrawingObject>"))
      return null;
    index_0 = jl.indexOf_II_I__devirtual$(descriptor, 34, jl.length__I__devirtual$_0('<DrawingObject type="'));
    if (index_0 == -1)
      return null;
    type_0 = jl.substring_II_Ljava_lang_String___devirtual$(descriptor, jl.length__I__devirtual$_0('<DrawingObject type="'), index_0);
    detail = jl.substring_II_Ljava_lang_String___devirtual$(descriptor, jl.length__I__devirtual$_0('<DrawingObject type="') + jl.length__I__devirtual$_0(type_0) + 1, jl.length__I__devirtual$_0(descriptor) - jl.length__I__devirtual$_0("></DrawingObject>"));
    if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(type_0, "arrow"))
      return new carcr.ReactionArrow_0(detail);
    if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(type_0, "text"))
      return new carc2.TextDrawingObject_0(detail);
    return null;
  };
  defineClass(810, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_DrawingObjectFactory_2_classLit = createForClass("com.actelion.research.chem", "DrawingObjectFactory", 810, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_Iterable = function $clinit_Iterable() {
    jl.$clinit_Iterable = emptyMethod;
  };
  jl.$forEach = function $forEach(this$static, action) {
    var t, t$iterator;
    ji2.checkNotNull_0(action);
    for (t$iterator = this$static.iterator(); t$iterator.hasNext_0(); ) {
      t = t$iterator.next_3();
      action.accept_0(t);
    }
  };
  jl.$spliterator = function $spliterator(this$static) {
    return ju.spliteratorUnknownSize(this$static.iterator(), 0);
  };
  cggl.Ljava_lang_Iterable_2_classLit = createForInterface("java.lang", "Iterable");
  ju.$clinit_Collection = function $clinit_Collection() {
    ju.$clinit_Collection = emptyMethod;
  };
  ju.$spliterator_0 = function $spliterator_0(this$static) {
    return ju.spliterator_11(this$static, 0);
  };
  ju.$stream = function $stream(this$static) {
    return jus.stream_1(this$static.spliterator_0(), false);
  };
  cggl.Ljava_util_Collection_2_classLit = createForInterface("java.util", "Collection");
  ju.$clinit_AbstractCollection = function $clinit_AbstractCollection() {
    ju.$clinit_AbstractCollection = emptyMethod;
    jl.$clinit_Object();
    jl.$clinit_Iterable();
    ju.$clinit_Collection();
  };
  ju.AbstractCollection = function AbstractCollection() {
    ju.$clinit_AbstractCollection();
    Object_0.call(this);
    this.$init_21();
  };
  defineClass(137, 1, { 1: 1, 29: 1 });
  _.$init_21 = function $init_21() {
  };
  _.forEach = function forEach(action) {
    jl.$forEach(this, action);
  };
  _.spliterator_0 = function spliterator_0() {
    return ju.$spliterator_0(this);
  };
  _.stream = function stream() {
    return ju.$stream(this);
  };
  _.add = function add_4(o) {
    throw toJs(new jl.UnsupportedOperationException_0("Add not supported on this collection"));
  };
  _.addAll = function addAll(c) {
    var changed, e, e$iterator;
    ji2.checkNotNull_0(c);
    changed = false;
    for (e$iterator = c.iterator(); e$iterator.hasNext_0(); ) {
      e = e$iterator.next_3();
      changed = changed | this.add(e);
    }
    return changed;
  };
  _.advanceToFind = function advanceToFind(o, remove) {
    var e, iter;
    for (iter = this.iterator(); iter.hasNext_0(); ) {
      e = iter.next_3();
      if (ju.equals_48(o, e)) {
        if (remove) {
          iter.remove_2();
        }
        return true;
      }
    }
    return false;
  };
  _.clear = function clear_1() {
    var iter;
    for (iter = this.iterator(); iter.hasNext_0(); ) {
      iter.next_3();
      iter.remove_2();
    }
  };
  _.contains = function contains(o) {
    return this.advanceToFind(o, false);
  };
  _.containsAll = function containsAll(c) {
    var e, e$iterator;
    ji2.checkNotNull_0(c);
    for (e$iterator = c.iterator(); e$iterator.hasNext_0(); ) {
      e = e$iterator.next_3();
      if (!this.contains(e)) {
        return false;
      }
    }
    return true;
  };
  _.isEmpty = function isEmpty() {
    return this.size() == 0;
  };
  _.remove = function remove_0(o) {
    return this.advanceToFind(o, true);
  };
  _.removeAll = function removeAll(c) {
    var changed, iter, o;
    ji2.checkNotNull_0(c);
    changed = false;
    for (iter = this.iterator(); iter.hasNext_0(); ) {
      o = iter.next_3();
      if (c.contains(o)) {
        iter.remove_2();
        changed = true;
      }
    }
    return changed;
  };
  _.retainAll = function retainAll(c) {
    var changed, iter, o;
    ji2.checkNotNull_0(c);
    changed = false;
    for (iter = this.iterator(); iter.hasNext_0(); ) {
      o = iter.next_3();
      if (!c.contains(o)) {
        iter.remove_2();
        changed = true;
      }
    }
    return changed;
  };
  _.toArray = function toArray() {
    return this.toArray_0(initUnidimensionalArray(cggl.Ljava_lang_Object_2_classLit, { 4: 1, 1: 1, 7: 1 }, 1, this.size(), 5, 1));
  };
  _.toArray_0 = function toArray_0(a) {
    var i, it, result, size_0;
    size_0 = this.size();
    if (a.length < size_0) {
      a = ji2.createFrom(a, size_0);
    }
    result = a;
    it = this.iterator();
    for (i = 0; i < size_0; ++i) {
      setCheck(result, i, it.next_3());
    }
    if (a.length > size_0) {
      setCheck(a, size_0, null);
    }
    return a;
  };
  _.toString_0 = function toString_7() {
    var e, e$iterator, joiner;
    joiner = new ju.StringJoiner_0(", ", "[", "]");
    for (e$iterator = this.iterator(); e$iterator.hasNext_0(); ) {
      e = e$iterator.next_3();
      joiner.add_12(maskUndefined(e) === maskUndefined(this) ? "(this Collection)" : valueOf_20(e));
    }
    return joiner.toString_0();
  };
  cggl.Ljava_util_AbstractCollection_2_classLit = createForClass("java.util", "AbstractCollection", 137, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_List = function $clinit_List() {
    ju.$clinit_List = emptyMethod;
  };
  ju.$replaceAll_0 = function $replaceAll_0(this$static, operator) {
    var i, size_0;
    ji2.checkNotNull_0(operator);
    for (i = 0, size_0 = this$static.size(); i < size_0; i++) {
      this$static.setAtIndex(i, operator.apply_1(this$static.getAtIndex(i)));
    }
  };
  ju.$sort = function $sort(this$static, c) {
    var a, i;
    a = this$static.toArray();
    ju.sort_7(a, castTo(c, 36));
    for (i = 0; i < a.length; i++) {
      this$static.setAtIndex(i, a[i]);
    }
  };
  ju.$spliterator_1 = function $spliterator_1(this$static) {
    return ju.spliterator_11(this$static, 16);
  };
  ju.__ofInternal = function __ofInternal(elements) {
    var i;
    for (i = 0; i < elements.length; i++) {
      ji2.checkNotNull_0(elements[i]);
    }
    return ju.unmodifiableList(ju.asList(elements));
  };
  ju.copyOf_12 = function copyOf_12(coll) {
    ju.$clinit_List();
    return castTo(coll.stream().collect_0(jus.toUnmodifiableList()), 59);
  };
  ju.of_0 = function of_0() {
    return ju.unmodifiableList(ju.emptyList());
  };
  ju.of_1 = function of_1(e1) {
    return ju.__ofInternal(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1])));
  };
  ju.of_2 = function of_2(e1, e2) {
    return ju.__ofInternal(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2])));
  };
  ju.of_3 = function of_3(e1, e2, e3) {
    return ju.__ofInternal(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3])));
  };
  ju.of_4 = function of_4(e1, e2, e3, e4) {
    return ju.__ofInternal(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3, e4])));
  };
  ju.of_5 = function of_5(e1, e2, e3, e4, e5) {
    return ju.__ofInternal(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3, e4, e5])));
  };
  ju.of_6 = function of_6(e1, e2, e3, e4, e5, e6) {
    return ju.__ofInternal(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3, e4, e5, e6])));
  };
  ju.of_7 = function of_7(e1, e2, e3, e4, e5, e6, e7) {
    return ju.__ofInternal(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3, e4, e5, e6, e7])));
  };
  ju.of_8 = function of_8(e1, e2, e3, e4, e5, e6, e7, e8) {
    return ju.__ofInternal(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3, e4, e5, e6, e7, e8])));
  };
  ju.of_9 = function of_9(e1, e2, e3, e4, e5, e6, e7, e8, e9) {
    return ju.__ofInternal(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3, e4, e5, e6, e7, e8, e9])));
  };
  ju.of_10 = function of_10(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) {
    return ju.__ofInternal(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3, e4, e5, e6, e7, e8, e9, e10])));
  };
  ju.of_11 = function of_11(elements) {
    var i;
    for (i = 0; i < elements.length; i++) {
      ji2.checkNotNull_0(elements[i]);
    }
    return ju.unmodifiableList(ju.asList(castToArray(ji2.unsafeClone(elements, 0, elements.length))));
  };
  cggl.Ljava_util_List_2_classLit = createForInterface("java.util", "List");
  ju.$clinit_AbstractList = function $clinit_AbstractList() {
    ju.$clinit_AbstractList = emptyMethod;
    ju.$clinit_AbstractCollection();
    jl.$clinit_Iterable();
    ju.$clinit_Collection();
    ju.$clinit_List();
  };
  ju.AbstractList = function AbstractList() {
    ju.$clinit_AbstractList();
    ju.AbstractCollection.call(this);
    this.$init_22();
  };
  defineClass(138, 137, { 1: 1, 29: 1, 59: 1 });
  _.$init_22 = function $init_22() {
  };
  _.replaceAll = function replaceAll(operator) {
    ju.$replaceAll_0(this, operator);
  };
  _.sort_0 = function sort_0(c) {
    ju.$sort(this, c);
  };
  _.spliterator_0 = function spliterator_1() {
    return ju.$spliterator_1(this);
  };
  _.addAtIndex = function add_5(index_0, element) {
    throw toJs(new jl.UnsupportedOperationException_0("Add not supported on this list"));
  };
  _.add = function add_6(obj) {
    this.addAtIndex(this.size(), obj);
    return true;
  };
  _.addAllAtIndex = function addAll_0(index_0, c) {
    var changed, e, e$iterator;
    ji2.checkNotNull_0(c);
    changed = false;
    for (e$iterator = c.iterator(); e$iterator.hasNext_0(); ) {
      e = e$iterator.next_3();
      this.addAtIndex(index_0++, e);
      changed = true;
    }
    return changed;
  };
  _.clear = function clear_2() {
    this.removeRange(0, this.size());
  };
  _.equals_0 = function equals_5(o) {
    var elem, elem$iterator, elemOther, iterOther, other;
    if (maskUndefined(o) === maskUndefined(this)) {
      return true;
    }
    if (!instanceOf(o, 59)) {
      return false;
    }
    other = castTo(o, 59);
    if (this.size() != other.size()) {
      return false;
    }
    iterOther = other.iterator();
    for (elem$iterator = this.iterator(); elem$iterator.hasNext_0(); ) {
      elem = elem$iterator.next_3();
      elemOther = iterOther.next_3();
      if (!ju.equals_48(elem, elemOther)) {
        return false;
      }
    }
    return true;
  };
  _.hashCode_1 = function hashCode_2() {
    return ju.hashCode_33(this);
  };
  _.indexOf = function indexOf(toFind) {
    var i, n;
    for (i = 0, n = this.size(); i < n; ++i) {
      if (ju.equals_48(toFind, this.getAtIndex(i))) {
        return i;
      }
    }
    return -1;
  };
  _.iterator = function iterator() {
    return new ju.AbstractList$IteratorImpl(this);
  };
  _.lastIndexOf = function lastIndexOf(toFind) {
    var i;
    for (i = this.size() - 1; i > -1; --i) {
      if (ju.equals_48(toFind, this.getAtIndex(i))) {
        return i;
      }
    }
    return -1;
  };
  _.listIterator = function listIterator() {
    return this.listIterator_0(0);
  };
  _.listIterator_0 = function listIterator_0(from) {
    return new ju.AbstractList$ListIteratorImpl(this, from);
  };
  _.removeAtIndex = function remove_1(index_0) {
    throw toJs(new jl.UnsupportedOperationException_0("Remove not supported on this list"));
  };
  _.removeRange = function removeRange(fromIndex, endIndex) {
    var i, iter;
    iter = this.listIterator_0(fromIndex);
    for (i = fromIndex; i < endIndex; ++i) {
      iter.next_3();
      iter.remove_2();
    }
  };
  _.setAtIndex = function set_3(index_0, o) {
    throw toJs(new jl.UnsupportedOperationException_0("Set not supported on this list"));
  };
  _.subList = function subList(fromIndex, toIndex) {
    return new ju.AbstractList$SubList(this, fromIndex, toIndex);
  };
  cggl.Ljava_util_AbstractList_2_classLit = createForClass("java.util", "AbstractList", 138, cggl.Ljava_util_AbstractCollection_2_classLit);
  jl.$clinit_Cloneable = function $clinit_Cloneable() {
    jl.$clinit_Cloneable = emptyMethod;
  };
  function $isInstance_3(instance) {
    jl.$clinit_Cloneable();
    if (jsEquals(instance, null)) {
      return false;
    }
    return instance.$implements__java_lang_Cloneable || Array.isArray(instance);
  }
  cggl.Ljava_lang_Cloneable_2_classLit = createForInterface("java.lang", "Cloneable");
  ju.$clinit_RandomAccess = function $clinit_RandomAccess() {
    ju.$clinit_RandomAccess = emptyMethod;
  };
  cggl.Ljava_util_RandomAccess_2_classLit = createForInterface("java.util", "RandomAccess");
  ju.$clinit_ArrayList = function $clinit_ArrayList() {
    ju.$clinit_ArrayList = emptyMethod;
    ju.$clinit_AbstractList();
    jl.$clinit_Iterable();
    ju.$clinit_Collection();
    ju.$clinit_List();
  };
  ju.ArrayList = function ArrayList() {
    ju.$clinit_ArrayList();
    ju.AbstractList.call(this);
    this.$init_23();
  };
  ju.ArrayList_0 = function ArrayList_0(initialCapacity) {
    ju.$clinit_ArrayList();
    ju.AbstractList.call(this);
    this.$init_23();
    ji2.checkArgument_0(initialCapacity >= 0, "Initial capacity must not be negative");
  };
  defineClass(16, 138, { 4: 1, 1: 1, 16: 1, 29: 1, 59: 1, 126: 1 }, ju.ArrayList, ju.ArrayList_0);
  _.$init_23 = function $init_23() {
    this.array = castToArray(initUnidimensionalArray(cggl.Ljava_lang_Object_2_classLit, { 4: 1, 1: 1, 7: 1 }, 1, 0, 5, 1));
  };
  _.addAtIndex = function add_7(index_0, o) {
    ji2.checkPositionIndex(index_0, this.array.length);
    ji2.insertTo(this.array, index_0, o);
  };
  _.add = function add_8(o) {
    ji2.push_3(this.array, o);
    return true;
  };
  _.addAllAtIndex = function addAll_1(index_0, c) {
    var cArray, len;
    ji2.checkPositionIndex(index_0, this.array.length);
    cArray = c.toArray();
    len = cArray.length;
    if (len == 0) {
      return false;
    }
    ji2.insertTo_0(this.array, index_0, cArray);
    return true;
  };
  _.addAll = function addAll_2(c) {
    var cArray, len;
    cArray = c.toArray();
    len = cArray.length;
    if (len == 0) {
      return false;
    }
    ji2.insertTo_0(this.array, this.array.length, cArray);
    return true;
  };
  _.clear = function clear_3() {
    this.setSize(0);
  };
  _.contains = function contains_0(o) {
    return this.indexOf(o) != -1;
  };
  _.forEach = function forEach_0(consumer) {
    var e, e$array, e$index, e$max;
    ji2.checkNotNull_0(consumer);
    for (e$array = this.array, e$index = 0, e$max = e$array.length; e$index < e$max; ++e$index) {
      e = e$array[e$index];
      consumer.accept_0(e);
    }
  };
  _.getAtIndex = function get_0(index_0) {
    ji2.checkElementIndex(index_0, this.array.length);
    return this.array[index_0];
  };
  _.indexOf = function indexOf_0(o) {
    return this.indexOf_0(o, 0);
  };
  _.indexOf_0 = function indexOf_1(o, index_0) {
    for (; index_0 < this.array.length; ++index_0) {
      if (ju.equals_48(o, this.array[index_0])) {
        return index_0;
      }
    }
    return -1;
  };
  _.isEmpty = function isEmpty_0() {
    return this.array.length == 0;
  };
  _.iterator = function iterator_0() {
    return new ju.ArrayList$1(this);
  };
  _.lastIndexOf = function lastIndexOf_0(o) {
    return this.lastIndexOf_0(o, this.size() - 1);
  };
  _.lastIndexOf_0 = function lastIndexOf_1(o, index_0) {
    for (; index_0 >= 0; --index_0) {
      if (ju.equals_48(o, this.array[index_0])) {
        return index_0;
      }
    }
    return -1;
  };
  _.removeAtIndex = function remove_2(index_0) {
    var previous;
    previous = this.getAtIndex(index_0);
    ji2.removeFrom(this.array, index_0, 1);
    return previous;
  };
  _.remove = function remove_3(o) {
    var i;
    i = this.indexOf(o);
    if (i == -1) {
      return false;
    }
    this.removeAtIndex(i);
    return true;
  };
  _.removeRange = function removeRange_0(fromIndex, endIndex) {
    var count;
    ji2.checkPositionIndexes(fromIndex, endIndex, this.array.length);
    count = endIndex - fromIndex;
    ji2.removeFrom(this.array, fromIndex, count);
  };
  _.replaceAll = function replaceAll_0(operator) {
    var i;
    ji2.checkNotNull_0(operator);
    for (i = 0; i < this.array.length; i++) {
      setCheck(this.array, i, operator.apply_1(this.array[i]));
    }
  };
  _.setAtIndex = function set_4(index_0, o) {
    var previous;
    previous = this.getAtIndex(index_0);
    setCheck(this.array, index_0, o);
    return previous;
  };
  _.setSize = function setSize(newSize) {
    ji2.setLength_0(this.array, newSize);
  };
  _.size = function size_1() {
    return this.array.length;
  };
  _.sort_0 = function sort_1(c) {
    ju.sort_6(this.array, 0, this.array.length, c);
  };
  _.toArray = function toArray_1() {
    return ji2.clone_2(this.array);
  };
  _.toArray_0 = function toArray_2(out) {
    var i, size_0;
    size_0 = this.array.length;
    if (out.length < size_0) {
      out = ji2.createFrom(out, size_0);
    }
    for (i = 0; i < size_0; ++i) {
      setCheck(out, i, this.array[i]);
    }
    if (out.length > size_0) {
      setCheck(out, size_0, null);
    }
    return out;
  };
  cggl.Ljava_util_ArrayList_2_classLit = createForClass("java.util", "ArrayList", 16, cggl.Ljava_util_AbstractList_2_classLit);
  carc2.$clinit_DrawingObjectList = function $clinit_DrawingObjectList() {
    carc2.$clinit_DrawingObjectList = emptyMethod;
    ju.$clinit_ArrayList();
  };
  carc2.DrawingObjectList = function DrawingObjectList() {
    carc2.$clinit_DrawingObjectList();
    ju.ArrayList.call(this);
    this.$init_24();
  };
  carc2.DrawingObjectList_0 = function DrawingObjectList_0(l) {
    carc2.$clinit_DrawingObjectList();
    var abstractDrawingObject, abstractDrawingObject$iterator, e;
    ju.ArrayList.call(this);
    this.$init_24();
    try {
      if (isNotNull(l))
        for (abstractDrawingObject$iterator = l.iterator(); abstractDrawingObject$iterator.hasNext_0(); ) {
          abstractDrawingObject = castTo(abstractDrawingObject$iterator.next_3(), 38);
          this.add(abstractDrawingObject.clone_0());
        }
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 12)) {
        e = $e0;
      } else
        throw toJs($e0);
    }
  };
  carc2.DrawingObjectList_1 = function DrawingObjectList_1(objectString) {
    carc2.$clinit_DrawingObjectList();
    var index1, index2, o;
    ju.ArrayList.call(this);
    this.$init_24();
    if (jsEquals(objectString, null) || jl.isEmpty__Z__devirtual$(objectString))
      return;
    index1 = 0;
    index2 = jl.indexOf_I_I__devirtual$(objectString, 10);
    while (index2 != -1) {
      o = carc2.instantiate(jl.substring_II_Ljava_lang_String___devirtual$(objectString, index1, index2));
      if (isNotNull(o))
        this.add(o);
      index1 = index2 + 1;
      index2 = jl.indexOf_II_I__devirtual$(objectString, 10, index1);
    }
  };
  defineClass(119, 16, { 4: 1, 1: 1, 16: 1, 29: 1, 59: 1, 126: 1 }, carc2.DrawingObjectList, carc2.DrawingObjectList_0, carc2.DrawingObjectList_1);
  _.$init_24 = function $init_24() {
  };
  _.toString_0 = function toString_8() {
    var abstractDrawingObject, abstractDrawingObject$iterator, objectString;
    objectString = new jl.StringBuilder();
    for (abstractDrawingObject$iterator = this.iterator(); abstractDrawingObject$iterator.hasNext_0(); ) {
      abstractDrawingObject = castTo(abstractDrawingObject$iterator.next_3(), 38);
      objectString.append_9(abstractDrawingObject.getDescriptor()).append_9("\n");
    }
    return objectString.toString_0();
  };
  carc2.serialVersionUID_0 = 537265956;
  cggl.Lcom_actelion_research_chem_DrawingObjectList_2_classLit = createForClass("com.actelion.research.chem", "DrawingObjectList", 119, cggl.Ljava_util_ArrayList_2_classLit);
  carc2.$clinit_ESRGroupNormalizationInfo = function $clinit_ESRGroupNormalizationInfo() {
    carc2.$clinit_ESRGroupNormalizationInfo = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.ESRGroupNormalizationInfo = function ESRGroupNormalizationInfo(fragment, action, group, type_0) {
    carc2.$clinit_ESRGroupNormalizationInfo();
    Object_0.call(this);
    this.$init_25();
    this.fragment_0 = fragment;
    this.action = action;
    this.group = group;
    this.type_0 = type_0;
  };
  defineClass(114, 1, { 114: 1, 1: 1 }, carc2.ESRGroupNormalizationInfo);
  _.$init_25 = function $init_25() {
  };
  _.action = 0;
  _.fragment_0 = 0;
  _.group = 0;
  _.type_0 = 0;
  cggl.Lcom_actelion_research_chem_ESRGroupNormalizationInfo_2_classLit = createForClass("com.actelion.research.chem", "ESRGroupNormalizationInfo", 114, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_EZHalfParity = function $clinit_EZHalfParity() {
    carc2.$clinit_EZHalfParity = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.EZHalfParity = function EZHalfParity(mol, rank, atom1, atom2) {
    carc2.$clinit_EZHalfParity();
    var connAtom, connBond, highRank, i;
    Object_0.call(this);
    this.$init_26();
    this.mMol = mol;
    this.mRemoteAxialAtom = atom1;
    this.mCentralAxialAtom = atom2;
    highRank = -1;
    for (i = 0; i < this.mMol.getAllConnAtoms_0(this.mCentralAxialAtom); i++) {
      connAtom = this.mMol.getConnAtom_0(this.mCentralAxialAtom, i);
      connBond = this.mMol.getConnBond_0(this.mCentralAxialAtom, i);
      if (connAtom == this.mRemoteAxialAtom) {
        if (this.mMol.getBondType_0(connBond) == 386)
          this.mValue = -1;
        continue;
      }
      if (this.mMol.isStereoBond_1(connBond, this.mCentralAxialAtom)) {
        if (this.mStereoBondFound)
          mol.setStereoProblem(atom2);
        this.mStereoBondFound = true;
      }
      if (highRank == rank[connAtom]) {
        this.mLowConn = connAtom;
        this.mRanksEqual = true;
        this.mInSameFragment = this.mMol.isRingBond_0(connBond);
      } else if (highRank < rank[connAtom]) {
        highRank = rank[connAtom];
        this.mLowConn = this.mHighConn;
        this.mHighConn = connAtom;
      } else {
        this.mLowConn = connAtom;
      }
    }
  };
  defineClass(132, 1, { 1: 1 }, carc2.EZHalfParity);
  _.$init_26 = function $init_26() {
  };
  _.getValue = function getValue() {
    var angleDB, angleDif, angleHigh, angleOther, connBond, i;
    if (this.mValue != 0)
      return this.mValue;
    if (this.mStereoBondFound && this.mMol.getAtomicNo_0(this.mCentralAxialAtom) != 15 && this.mMol.getAtomicNo_0(this.mCentralAxialAtom) != 16) {
      for (i = 0; i < this.mMol.getAllConnAtoms_0(this.mCentralAxialAtom); i++) {
        connBond = this.mMol.getConnBond_0(this.mCentralAxialAtom, i);
        if (this.mMol.isStereoBond_1(connBond, this.mCentralAxialAtom)) {
          if (this.mMol.getConnAtom_0(this.mCentralAxialAtom, i) == this.mHighConn)
            this.mValue = this.mMol.getBondType_0(connBond) == 257 ? 3 : 1;
          else
            this.mValue = this.mMol.getBondType_0(connBond) == 257 ? 1 : 3;
          return this.mValue;
        }
      }
    }
    angleDB = this.mMol.getBondAngle_0(this.mCentralAxialAtom, this.mRemoteAxialAtom);
    angleHigh = this.mMol.getBondAngle_0(this.mCentralAxialAtom, this.mHighConn);
    if (angleHigh < angleDB)
      angleHigh += 3.141592653589793 * 2;
    if (this.mMol.getAllConnAtoms_0(this.mCentralAxialAtom) == 2) {
      angleDif = angleHigh - angleDB;
      if (angleDif > 3.141592653589793 - 0.05 && angleDif < 3.141592653589793 + 0.05) {
        this.mValue = -1;
        return this.mValue;
      }
      this.mValue = angleDif < 3.141592653589793 ? 4 : 2;
      return this.mValue;
    } else {
      angleOther = this.mMol.getBondAngle_0(this.mCentralAxialAtom, this.mLowConn);
      if (angleOther < angleDB)
        angleOther += 3.141592653589793 * 2;
      this.mValue = angleOther < angleHigh ? 2 : 4;
      return this.mValue;
    }
  };
  _.mCentralAxialAtom = 0;
  _.mHighConn = 0;
  _.mInSameFragment = false;
  _.mLowConn = 0;
  _.mRanksEqual = false;
  _.mRemoteAxialAtom = 0;
  _.mStereoBondFound = false;
  _.mValue = 0;
  cggl.Lcom_actelion_research_chem_EZHalfParity_2_classLit = createForClass("com.actelion.research.chem", "EZHalfParity", 132, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_Element = function $clinit_Element() {
    carc2.$clinit_Element = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.Element_0 = function Element_0(orderNumber, name_0, symbol, weight, covalentRadius, vdwRadius, electronegativity) {
    carc2.$clinit_Element();
    Object_0.call(this);
    this.$init_27();
    this.orderNumber = orderNumber;
    this.name_0 = name_0;
    this.symbol = symbol;
    this.weight = weight;
    this.covalentRadius = covalentRadius;
    this.vdwRadius = vdwRadius;
    this.electronegativity = electronegativity;
  };
  defineClass(15, 1, { 15: 1, 1: 1 }, carc2.Element_0);
  _.$init_27 = function $init_27() {
  };
  _.getElectronegativity = function getElectronegativity() {
    return this.electronegativity;
  };
  _.getName_0 = function getName() {
    return this.name_0;
  };
  _.getOrderNumber = function getOrderNumber() {
    return this.orderNumber;
  };
  _.getSymbol = function getSymbol() {
    return this.symbol;
  };
  _.toString_0 = function toString_9() {
    return this.symbol;
  };
  _.covalentRadius = 0;
  _.electronegativity = 0;
  _.orderNumber = 0;
  _.vdwRadius = 0;
  _.weight = 0;
  cggl.Lcom_actelion_research_chem_Element_2_classLit = createForClass("com.actelion.research.chem", "Element", 15, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_Element$1 = function $clinit_Element$1() {
    carc2.$clinit_Element$1 = emptyMethod;
  };
  defineClass(817, 1, { 1: 1, 36: 1 });
  cggl.Lcom_actelion_research_chem_Element$1_2_classLit = createForClass("com.actelion.research.chem", "Element/1", 817, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_ExtendedDepictor = function $clinit_ExtendedDepictor() {
    carc2.$clinit_ExtendedDepictor = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.ExtendedDepictor = function ExtendedDepictor(mol, drawingObjectList) {
    carc2.$clinit_ExtendedDepictor();
    Object_0.call(this);
    this.$init_28();
    if (isNotNull(mol)) {
      this.mMolecule = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_StereoMolecule_2_classLit, { 95: 1, 4: 1, 1: 1, 7: 1 }, 17, 1, 0, 1);
      setCheck(this.mMolecule, 0, mol);
    }
    this.mChemistryType = 0;
    this.mDrawingObjectList = drawingObjectList;
    this.initialize_0();
  };
  carc2.ExtendedDepictor_0 = function ExtendedDepictor_0(reaction, drawingObjectList, layoutReaction) {
    carc2.$clinit_ExtendedDepictor();
    var i, i0;
    Object_0.call(this);
    this.$init_28();
    this.mReaction = reaction;
    if (isNotNull(reaction)) {
      this.mMolecule = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_StereoMolecule_2_classLit, { 95: 1, 4: 1, 1: 1, 7: 1 }, 17, reaction.getMolecules_0(), 0, 1);
      for (i0 = 0; i0 < reaction.getMolecules_0(); i0++)
        setCheck(this.mMolecule, i0, reaction.getMolecule_1(i0));
      this.mReactantCount = reaction.getReactants_0();
      this.mCatalyst = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_StereoMolecule_2_classLit, { 95: 1, 4: 1, 1: 1, 7: 1 }, 17, reaction.getCatalysts_0(), 0, 1);
      for (i = 0; i < reaction.getCatalysts_0(); i++)
        setCheck(this.mCatalyst, i, reaction.getCatalyst_0(i));
      this.mReactionLayoutNeeded = layoutReaction;
    }
    this.mChemistryType = 1;
    this.mDrawingObjectList = drawingObjectList;
    this.initialize_0();
  };
  carc2.ExtendedDepictor_1 = function ExtendedDepictor_1(mol, markushCoreCount, drawingObjectList) {
    carc2.$clinit_ExtendedDepictor();
    Object_0.call(this);
    this.$init_28();
    this.mMolecule = mol;
    this.mChemistryType = 2;
    this.mDrawingObjectList = drawingObjectList;
    this.mMarkushCoreCount = markushCoreCount;
    this.initialize_0();
  };
  carc2.ExtendedDepictor_2 = function ExtendedDepictor_2(mol, drawingObjectList) {
    carc2.$clinit_ExtendedDepictor();
    Object_0.call(this);
    this.$init_28();
    this.mMolecule = mol;
    this.mChemistryType = 0;
    this.mDrawingObjectList = drawingObjectList;
    this.initialize_0();
  };
  carc2.lambda$0 = function lambda$0(a_0, b_1) {
    carc2.$clinit_ExtendedDepictor();
    return jl.doubleValue__D__devirtual$_0(a_0) > jl.doubleValue__D__devirtual$_0(b_1) ? -1 : jl.doubleValue__D__devirtual$_0(a_0) < jl.doubleValue__D__devirtual$_0(b_1) ? 1 : 0;
  };
  defineClass(176, 1, { 1: 1 }, carc2.ExtendedDepictor, carc2.ExtendedDepictor_0, carc2.ExtendedDepictor_1, carc2.ExtendedDepictor_2);
  _.$init_28 = function $init_28() {
  };
  _.calculateMedianBondLength = function calculateMedianBondLength() {
    var bond, bondCount, i, maxHeap, minHeap;
    maxHeap = new ju.PriorityQueue_2(new carc2.ExtendedDepictor$lambda$0$Type());
    minHeap = new ju.PriorityQueue();
    if (jsNotEquals(this.mMolecule, null)) {
      for (i = 0; i < this.mMolecule.length; i++) {
        for (bond = 0; bond < this.mMolecule[i].getAllBonds_0(); bond++) {
          maxHeap.offer(jl.valueOf_9(this.mDepictor[i].getTransformation().getScaling() * this.mMolecule[i].getBondLength_0(bond)));
          minHeap.offer(castToDouble(maxHeap.poll()));
          if (maxHeap.size() < minHeap.size())
            maxHeap.offer(castToDouble(minHeap.poll()));
        }
      }
    }
    bondCount = maxHeap.size() + minHeap.size();
    return bondCount == 0 ? this.calculatePseudoBondLengthFromBounds() : this.mTransformation.getScaling() * (bondCount % 2 == 0 ? (jl.doubleValue__D__devirtual$_0(castToDouble(maxHeap.peek_0())) + jl.doubleValue__D__devirtual$_0(castToDouble(minHeap.peek_0()))) / 2 : jl.doubleValue__D__devirtual$_0(castToDouble(maxHeap.peek_0())));
  };
  _.calculatePseudoBondLengthFromBounds = function calculatePseudoBondLengthFromBounds() {
    var area, atom, b, count, dx, dy, i, meanEdgeLength, targetArea, x_0, x1, x2, y_0, y1, y2;
    x1 = 17976931348623157e292;
    x2 = -17976931348623157e292;
    y1 = 17976931348623157e292;
    y2 = -17976931348623157e292;
    count = 0;
    if (jsNotEquals(this.mMolecule, null)) {
      for (i = 0; i < this.mMolecule.length; i++) {
        for (atom = 0; atom < this.mMolecule[i].getAllAtoms_0(); atom++) {
          x_0 = this.mDepictor[i].getTransformation().transformX(this.mMolecule[i].getAtomCoordinates_0(atom).x_0);
          y_0 = this.mDepictor[i].getTransformation().transformY(this.mMolecule[i].getAtomCoordinates_0(atom).y_0);
          x1 = $wnd.Math.min(x1, x_0);
          x2 = $wnd.Math.max(x2, x_0);
          y1 = $wnd.Math.min(y1, y_0);
          y2 = $wnd.Math.max(y2, y_0);
          count++;
        }
      }
    }
    if (count <= 1)
      return this.mDefaultAVBL;
    dx = x2 - x1;
    dy = y2 - y1;
    meanEdgeLength = (dx + dy) / 2;
    targetArea = 3 * count;
    area = dx * dy;
    b = meanEdgeLength / (1 - targetArea);
    return $wnd.Math.sqrt(b * b - area / (1 - targetArea)) - b;
  };
  _.getMolecule_1 = function getMolecule_0(i) {
    return this.mMolecule[i];
  };
  _.getMoleculeDepictor = function getMoleculeDepictor(i) {
    return this.mDepictor[i];
  };
  _.getReaction_0 = function getReaction() {
    return this.mReaction;
  };
  _.initialize_0 = function initialize_0() {
    var i;
    this.mTransformation = new carc2.DepictorTransformation();
    if (jsNotEquals(this.mMolecule, null)) {
      this.mDepictor = initUnidimensionalArray(cggl.Lcom_actelion_research_gui_generic_GenericDepictor_2_classLit, { 4: 1, 1: 1, 7: 1 }, 121, this.mMolecule.length, 0, 1);
      for (i = 0; i < this.mMolecule.length; i++)
        setCheck(this.mDepictor, i, new cargg.GenericDepictor(this.mMolecule[i]));
    }
    if (jsNotEquals(this.mCatalyst, null)) {
      this.mCatalystDepictor = initUnidimensionalArray(cggl.Lcom_actelion_research_gui_generic_GenericDepictor_2_classLit, { 4: 1, 1: 1, 7: 1 }, 121, this.mCatalyst.length, 0, 1);
      for (i = 0; i < this.mCatalyst.length; i++)
        setCheck(this.mCatalystDepictor, i, new cargg.GenericDepictor(this.mCatalyst[i]));
    }
    this.mDefaultAVBL = 24;
  };
  _.isFragment_0 = function isFragment_0() {
    var mol, mol$array, mol$index, mol$max;
    if (this.mChemistryType == 1)
      return isNull(this.mReaction) ? false : this.mReaction.isFragment_0();
    if (jsEquals(this.mMolecule, null))
      return false;
    for (mol$array = this.mMolecule, mol$index = 0, mol$max = mol$array.length; mol$index < mol$max; ++mol$index) {
      mol = mol$array[mol$index];
      if (mol.isFragment_0())
        return true;
    }
    return false;
  };
  _.layoutReaction = function layoutReaction_0(context) {
    var arrow, arrowWidth, boundingRect, catX, catY, catalystBoundingRect, catalystScale, catalystSpacing, dx, dx0, dy, dy0, i, i0, i1, i2, j, rawX, spacing, totalCatalystHeight, totalCatalystWidth, totalHeight, totalWidth;
    boundingRect = initUnidimensionalArray(cggl.Lcom_actelion_research_gui_generic_GenericRectangle_2_classLit, { 4: 1, 1: 1, 7: 1 }, 32, this.mMolecule.length, 0, 1);
    totalWidth = 0;
    totalHeight = 0;
    for (i0 = 0; i0 < this.mMolecule.length; i0++) {
      this.mDepictor[i0].validateView(context, null, 65536);
      setCheck(boundingRect, i0, this.mDepictor[i0].getBoundingRect());
      totalWidth += boundingRect[i0].width_0;
      totalHeight = $wnd.Math.max(totalHeight, boundingRect[i0].height_0);
    }
    catalystScale = 0.7;
    catalystSpacing = 0.5 * 24;
    catalystBoundingRect = initUnidimensionalArray(cggl.Lcom_actelion_research_gui_generic_GenericRectangle_2_classLit, { 4: 1, 1: 1, 7: 1 }, 32, this.mCatalyst.length, 0, 1);
    totalCatalystWidth = 0;
    totalCatalystHeight = 0;
    for (i1 = 0; i1 < this.mCatalyst.length; i1++) {
      this.mCatalystDepictor[i1].validateView(context, null, 65536 + round_int(0.7 * 24));
      setCheck(catalystBoundingRect, i1, this.mCatalystDepictor[i1].getBoundingRect());
      totalCatalystWidth = $wnd.Math.max(totalCatalystWidth, catalystBoundingRect[i1].width_0);
      totalCatalystHeight += catalystBoundingRect[i1].height_0 + catalystSpacing;
    }
    spacing = 1.5 * 24;
    arrowWidth = $wnd.Math.max(2 * 24, totalCatalystWidth + 24);
    totalHeight = $wnd.Math.max(totalHeight, 24 + 2 * totalCatalystHeight);
    arrow = -1;
    if (isNull(this.mDrawingObjectList)) {
      this.mDrawingObjectList = new carc2.DrawingObjectList();
      this.mDrawingObjectList.add(new carcr.ReactionArrow());
      arrow = 0;
    } else {
      for (i2 = 0; i2 < this.mDrawingObjectList.size(); i2++) {
        if (instanceOf(this.mDrawingObjectList.getAtIndex(i2), 42)) {
          arrow = i2;
          break;
        }
      }
      if (arrow == -1) {
        arrow = this.mDrawingObjectList.size();
        this.mDrawingObjectList.add(new carcr.ReactionArrow());
      }
    }
    rawX = 0.5 * spacing;
    for (i = 0; i < this.mMolecule.length; i++) {
      if (i == this.mReactantCount) {
        castTo(castTo(this.mDrawingObjectList.getAtIndex(arrow), 42), 42).setCoordinates_1(rawX - spacing / 2, totalHeight / 2, rawX - spacing / 2 + arrowWidth, totalHeight / 2);
        catX = rawX + 0.5 * (24 - spacing);
        catY = 0.5 * (totalHeight - catalystSpacing) - totalCatalystHeight;
        for (j = 0; j < this.mCatalyst.length; j++) {
          dx0 = catX + 0.5 * (totalCatalystWidth - catalystBoundingRect[j].width_0) - catalystBoundingRect[j].x_0;
          dy0 = catY - catalystBoundingRect[j].y_0;
          this.mCatalystDepictor[j].applyTransformation_0(new carc2.DepictorTransformation_0(1, dx0, dy0));
          catY += catalystSpacing + catalystBoundingRect[j].height_0;
        }
        rawX += arrowWidth;
      }
      dx = rawX - boundingRect[i].x_0;
      dy = 0.5 * (totalHeight - boundingRect[i].height_0) - boundingRect[i].y_0;
      this.mDepictor[i].applyTransformation_0(new carc2.DepictorTransformation_0(1, dx, dy));
      rawX += spacing + boundingRect[i].width_0;
    }
    this.mReactionLayoutNeeded = false;
  };
  _.paintDrawingObjects = function paintDrawingObjects(context) {
    var object, object$iterator;
    if (isNotNull(this.mDrawingObjectList)) {
      for (object$iterator = this.mDrawingObjectList.iterator(); object$iterator.hasNext_0(); ) {
        object = castTo(object$iterator.next_3(), 38);
        object.draw(context, this.mTransformation);
      }
    }
  };
  _.paintFragmentNumbers = function paintFragmentNumbers(context) {
    var atom, averageBondLength, cog, i, str;
    if (this.mFragmentNoColor != 0 && jsNotEquals(this.mMolecule, null)) {
      averageBondLength = this.calculateMedianBondLength() / this.mTransformation.getScaling();
      context.setRGB_0(this.mFragmentNoColor);
      context.setFont_0(round_int(1.6 * averageBondLength), true, false);
      for (i = 0; i < this.mMolecule.length; i++) {
        if (this.mMolecule[i].getAllAtoms_0() != 0) {
          cog = new ja.Point();
          for (atom = 0; atom < this.mMolecule[i].getAllAtoms_0(); atom++) {
            cog.x_0 = round_int(cog.x_0 + this.mMolecule[i].getAtomX_0(atom));
            cog.y_0 = round_int(cog.y_0 + this.mMolecule[i].getAtomY_0(atom));
          }
          cog.x_0 = narrow_int(cog.x_0 / this.mMolecule[i].getAllAtoms_0());
          cog.y_0 = narrow_int(cog.y_0 / this.mMolecule[i].getAllAtoms_0());
          cog.x_0 = round_int(this.mDepictor[i].getTransformation().transformX(cog.x_0));
          cog.y_0 = round_int(this.mDepictor[i].getTransformation().transformY(cog.y_0));
          str = this.mChemistryType == 0 ? "" + (i + 1) : this.mChemistryType == 2 ? i < this.mMarkushCoreCount ? "" + charToString(narrow_char(65 + i)) : "R" + (i + 1 - this.mMarkushCoreCount) : this.mChemistryType == 1 ? i < this.mReactantCount ? "" + charToString(narrow_char(65 + i)) : "P" + (i + 1 - this.mReactantCount) : "?" + (i + 1);
          context.drawCenteredString_0(cog.x_0, cog.y_0, str);
        }
      }
    }
  };
  _.paintStructures = function paintStructures(context) {
    var avbl, d, d$array, d$index, d$max;
    if (jsNotEquals(this.mDepictor, null)) {
      avbl = this.calculateMedianBondLength() / this.mTransformation.getScaling();
      for (d$array = this.mDepictor, d$index = 0, d$max = d$array.length; d$index < d$max; ++d$index) {
        d = d$array[d$index];
        d.setDisplayMode(this.mDisplayMode);
        d.setAtomLabelAVBL(avbl);
        d.paint(context);
      }
    }
    if (jsNotEquals(this.mCatalystDepictor, null)) {
      for (d$array = this.mCatalystDepictor, d$index = 0, d$max = d$array.length; d$index < d$max; ++d$index) {
        d = d$array[d$index];
        d.paint(context);
      }
    }
  };
  _.setDefaultAVBL = function setDefaultAVBL(avbl) {
    this.mDefaultAVBL = avbl;
  };
  _.setDisplayMode = function setDisplayMode_0(displayMode) {
    this.mDisplayMode = displayMode;
  };
  _.setFactorTextSize = function setFactorTextSize_0(factor) {
    var d, d$array, d$index, d$max;
    if (jsNotEquals(this.mDepictor, null))
      for (d$array = this.mDepictor, d$index = 0, d$max = d$array.length; d$index < d$max; ++d$index) {
        d = d$array[d$index];
        d.setFactorTextSize(factor);
      }
  };
  _.setForegroundColor = function setForegroundColor_0(foreground, background) {
    var d, d$array, d$array0, d$index, d$index0, d$max, d$max0;
    if (jsNotEquals(this.mDepictor, null))
      for (d$array0 = this.mDepictor, d$index0 = 0, d$max0 = d$array0.length; d$index0 < d$max0; ++d$index0) {
        d = d$array0[d$index0];
        d.setForegroundColor(foreground, background);
      }
    if (jsNotEquals(this.mCatalystDepictor, null))
      for (d$array = this.mCatalystDepictor, d$index = 0, d$max = d$array.length; d$index < d$max; ++d$index) {
        d = d$array[d$index];
        d.setForegroundColor(foreground, background);
      }
  };
  _.setFragmentNoColor = function setFragmentNoColor(argb) {
    this.mFragmentNoColor = argb;
  };
  _.updateCoords_0 = function updateCoords_0(context, viewRect, mode) {
    var d, d$array, d$array0, d$index, d$index0, d$max, d$max0, mol, mol$array, mol$index, mol$max, o, o$iterator, t;
    this.validateView_0(context, viewRect, mode);
    if (this.mTransformation.isVoidTransformation()) {
      return null;
    } else {
      if (jsNotEquals(this.mMolecule, null))
        for (mol$array = this.mMolecule, mol$index = 0, mol$max = mol$array.length; mol$index < mol$max; ++mol$index) {
          mol = mol$array[mol$index];
          this.mTransformation.applyTo_1(mol);
        }
      if (isNotNull(this.mDrawingObjectList))
        for (o$iterator = this.mDrawingObjectList.iterator(); o$iterator.hasNext_0(); ) {
          o = castTo(o$iterator.next_3(), 38);
          this.mTransformation.applyTo(o);
        }
      if (jsNotEquals(this.mDepictor, null))
        for (d$array0 = this.mDepictor, d$index0 = 0, d$max0 = d$array0.length; d$index0 < d$max0; ++d$index0) {
          d = d$array0[d$index0];
          d.getTransformation().clear_0();
        }
      if (jsNotEquals(this.mCatalystDepictor, null))
        for (d$array = this.mCatalystDepictor, d$index = 0, d$max = d$array.length; d$index < d$max; ++d$index) {
          d = d$array[d$index];
          d.getTransformation().clear_0();
        }
      t = this.mTransformation;
      this.mTransformation = new carc2.DepictorTransformation();
      return t;
    }
  };
  _.validateView_0 = function validateView_0(context, viewRect, mode) {
    var avbl, boundingRect, d, d$array, d$array0, d$index, d$index0, d$max, d$max0, o, o$iterator, objectBounds, t;
    if (this.mReactionLayoutNeeded)
      this.layoutReaction(context);
    boundingRect = null;
    if (jsNotEquals(this.mDepictor, null)) {
      for (d$array = this.mDepictor, d$index = 0, d$max = d$array.length; d$index < d$max; ++d$index) {
        d = d$array[d$index];
        d.validateView(context, null, 0);
        boundingRect = isNull(boundingRect) ? d.getBoundingRect() : boundingRect.union(d.getBoundingRect());
      }
    }
    if (jsNotEquals(this.mCatalystDepictor, null)) {
      for (d$array = this.mCatalystDepictor, d$index = 0, d$max = d$array.length; d$index < d$max; ++d$index) {
        d = d$array[d$index];
        d.validateView(context, null, 0);
        boundingRect = isNull(boundingRect) ? d.getBoundingRect() : boundingRect.union(d.getBoundingRect());
      }
    }
    if (isNotNull(this.mDrawingObjectList)) {
      for (o$iterator = this.mDrawingObjectList.iterator(); o$iterator.hasNext_0(); ) {
        o = castTo(o$iterator.next_3(), 38);
        objectBounds = o.getBoundingRect_0(context);
        this.mTransformation.applyTo_3(objectBounds);
        boundingRect = isNull(boundingRect) ? objectBounds : boundingRect.union(objectBounds);
      }
    }
    if (isNull(boundingRect))
      return null;
    avbl = this.calculateMedianBondLength();
    t = new carc2.DepictorTransformation_1(boundingRect, viewRect, avbl, mode);
    if (!t.isVoidTransformation()) {
      t.applyTo_0(this.mTransformation);
      if (jsNotEquals(this.mDepictor, null))
        for (d$array0 = this.mDepictor, d$index0 = 0, d$max0 = d$array0.length; d$index0 < d$max0; ++d$index0) {
          d = d$array0[d$index0];
          d.applyTransformation_0(t);
        }
      if (jsNotEquals(this.mCatalystDepictor, null))
        for (d$array = this.mCatalystDepictor, d$index = 0, d$max = d$array.length; d$index < d$max; ++d$index) {
          d = d$array[d$index];
          d.applyTransformation_0(t);
        }
      return t;
    }
    return null;
  };
  _.mChemistryType = 0;
  _.mDefaultAVBL = 0;
  _.mDisplayMode = 0;
  _.mFragmentNoColor = 0;
  _.mMarkushCoreCount = 0;
  _.mReactantCount = 0;
  _.mReactionLayoutNeeded = false;
  carc2.TYPE_MARKUSH = 2;
  carc2.TYPE_MOLECULES = 0;
  carc2.TYPE_REACTION = 1;
  cggl.Lcom_actelion_research_chem_ExtendedDepictor_2_classLit = createForClass("com.actelion.research.chem", "ExtendedDepictor", 176, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_ExtendedDepictor$lambda$0$Type = function $clinit_ExtendedDepictor$lambda$0$Type() {
    carc2.$clinit_ExtendedDepictor$lambda$0$Type = emptyMethod;
  };
  carc2.ExtendedDepictor$lambda$0$Type = function ExtendedDepictor$lambda$0$Type() {
    carc2.$clinit_ExtendedDepictor$lambda$0$Type();
  };
  defineClass(443, 1, { 1: 1, 36: 1 }, carc2.ExtendedDepictor$lambda$0$Type);
  _.compare_0 = function compare_6(arg0, arg1) {
    return carc2.lambda$0(castToDouble(arg0), castToDouble(arg1));
  };
  _.equals_0 = function equals_6(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  cggl.Lcom_actelion_research_chem_ExtendedDepictor$lambda$0$Type_2_classLit = createForClass("com.actelion.research.chem", "ExtendedDepictor/lambda$0$Type", 443, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_Molecule = function $clinit_Molecule() {
    carc2.$clinit_Molecule = emptyMethod;
    jl.$clinit_Object();
    carc2.cAtomFlagsHelper = 15368 | 67223559;
    carc2.cBondQFAllBondTypes = 31 | 96;
    carc2.cHelperRingsSimple = 1 | 2;
    carc2.cHelperRings = 3 | 4;
    carc2.cHelperParities = 7 | 8;
    carc2.cHelperCIP = 15 | 16;
    carc2.cHelperSymmetrySimple = 31 | 32;
    carc2.cHelperSymmetryStereoHeterotopicity = 31 | 64;
    carc2.cDefaultAllowedPseudoAtoms = 1 | 64 | 256;
    carc2.cAtomLabel = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["?", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R1", "R2", "R3", "A", "A1", "A2", "A3", "??", "??", "D", "T", "X", "R", "H2", "H+", "Nnn", "HYD", "Pol", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "Ala", "Arg", "Asn", "Asp", "Cys", "Gln", "Glu", "Gly", "His", "Ile", "Leu", "Lys", "Met", "Phe", "Pro", "Ser", "Thr", "Trp", "Tyr", "Val"]);
    carc2.cRoundedMass = stampJavaTypeInfo(getClassLiteralForArray(cggl.S_classLit, 1), { 4: 1, 1: 1, 13: 1 }, 5, 15, [0, 1, 4, 7, 9, 11, 12, 14, 16, 19, 20, 23, 24, 27, 28, 31, 32, 35, 40, 39, 40, 45, 48, 51, 52, 55, 56, 59, 58, 63, 64, 69, 74, 75, 80, 79, 84, 85, 88, 89, 90, 93, 98, 0, 102, 103, 106, 107, 114, 115, 120, 121, 130, 127, 132, 133, 138, 139, 140, 141, 142, 0, 152, 153, 158, 159, 164, 165, 166, 169, 174, 175, 180, 181, 184, 187, 192, 193, 195, 197, 202, 205, 208, 209, 209, 210, 222, 223, 226, 227, 232, 231, 238, 237, 244, 243, 247, 247, 251, 252, 257, 258, 259, 262, 267, 268, 271, 270, 277, 276, 281, 281, 283, 285, 289, 289, 293, 294, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 156, 114, 115, 103, 128, 129, 57, 137, 113, 113, 128, 131, 147, 97, 87, 101, 186, 163, 99]);
    carc2.cDefaultAtomValences = stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [6]);
    carc2.cAminoAcidValences = stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]);
    carc2.cAtomValence = stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 2), { 68: 1, 4: 1, 1: 1, 7: 1 }, 8, 0, [null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [0]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [0]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 3, 5, 7]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [0]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), null, null, null, null, null, null, null, null, null, null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 3, 5, 7]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [0, 2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), null, null, null, null, null, null, null, null, null, null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 3, 5, 7]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [0, 2, 4, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2])]);
    carc2.cCommonOxidationState = stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 2), { 68: 1, 4: 1, 1: 1, 7: 1 }, 8, 0, [null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), null, null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-1]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-1]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3, 4, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3, 4, 7]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-3, 3, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-1]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4, 6, 7]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-3, 3, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-2, 4, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-1]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4, 6, 7]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-2, 2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-1, 1]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4, 5, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4, 5, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4, 5, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4, 5, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3])]);
  };
  carc2.Molecule = function Molecule2() {
    carc2.$clinit_Molecule();
    Object_0.call(this);
    this.$init_29();
    this.mMaxAtoms = this.mMaxBonds = 256;
    this.init_1();
  };
  carc2.Molecule_0 = function Molecule_0(maxAtoms, maxBonds) {
    carc2.$clinit_Molecule();
    Object_0.call(this);
    this.$init_29();
    this.mMaxAtoms = $wnd.Math.max(1, maxAtoms);
    this.mMaxBonds = $wnd.Math.max(1, maxBonds);
    this.init_1();
  };
  carc2.bondOrderToType = function bondOrderToType(bondOrder, useCrossBond) {
    carc2.$clinit_Molecule();
    return bondOrder == 0 ? 16 : bondOrder == 1 ? 1 : bondOrder == 2 ? useCrossBond ? 386 : 2 : bondOrder == 3 ? 4 : bondOrder == 4 ? 32 : 64;
  };
  carc2.copyOf = function copyOf(original, newLength) {
    var copy;
    copy = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, newLength, 15, 1);
    jl.arraycopy(original, 0, copy, 0, $wnd.Math.min(original.length, newLength));
    return copy;
  };
  carc2.copyOf_0 = function copyOf_0(original, newLength) {
    var copy;
    copy = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, newLength, 14, 1);
    jl.arraycopy(original, 0, copy, 0, $wnd.Math.min(original.length, newLength));
    return copy;
  };
  carc2.copyOf_1 = function copyOf_1(original, newLength) {
    var copy, i;
    copy = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_Coordinates_2_classLit, { 151: 1, 4: 1, 1: 1, 7: 1 }, 33, newLength, 0, 1);
    for (i = 0; i < original.length; i++)
      if (isNotNull(original[i]))
        copy[i] = new carc2.Coordinates_2(original[i]);
    return copy;
  };
  carc2.copyOf_2 = function copyOf_2(original, newLength) {
    var copy, i;
    copy = initUnidimensionalArray(cggl.B_classLit, { 68: 1, 4: 1, 1: 1, 7: 1 }, 8, newLength, 0, 2);
    for (i = 0; i < original.length; i++) {
      if (jsNotEquals(original[i], null)) {
        copy[i] = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, original[i].length, 15, 1);
        jl.arraycopy(original[i], 0, copy[i], 0, original[i].length);
      }
    }
    return copy;
  };
  carc2.copyOf_3 = function copyOf_3(original, newLength) {
    var copy, i;
    copy = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, newLength, 0, 2);
    for (i = 0; i < original.length; i++) {
      if (jsNotEquals(original[i], null)) {
        copy[i] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, original[i].length, 15, 1);
        jl.arraycopy(original[i], 0, copy[i], 0, original[i].length);
      }
    }
    return copy;
  };
  carc2.getAllowedValences = function getAllowedValences(atomicNo) {
    carc2.$clinit_Molecule();
    return atomicNo >= 0 && atomicNo < carc2.cAtomValence.length && jsNotEquals(carc2.cAtomValence[atomicNo], null) ? carc2.cAtomValence[atomicNo] : atomicNo >= 171 && atomicNo <= 190 ? carc2.cAminoAcidValences : carc2.cDefaultAtomValences;
  };
  carc2.getAngle_0 = function getAngle_0(x1, y1, x2, y2) {
    carc2.$clinit_Molecule();
    var angle, xdiff, ydiff;
    xdiff = x2 - x1;
    ydiff = y2 - y1;
    if (ydiff != 0) {
      angle = $wnd.Math.atan(xdiff / ydiff);
      if (ydiff < 0) {
        if (xdiff < 0)
          angle -= 3.141592653589793;
        else
          angle += 3.141592653589793;
      }
    } else
      angle = xdiff > 0 ? 3.141592653589793 / 2 : -3.141592653589793 / 2;
    return angle;
  };
  carc2.getAngleDif = function getAngleDif(angle1, angle2) {
    carc2.$clinit_Molecule();
    var angleDif;
    angleDif = angle1 - angle2;
    while (angleDif < -3.141592653589793)
      angleDif += 2 * 3.141592653589793;
    while (angleDif > 3.141592653589793)
      angleDif -= 2 * 3.141592653589793;
    return angleDif;
  };
  carc2.getAtomicNoFromLabel = function getAtomicNoFromLabel(atomLabel) {
    carc2.$clinit_Molecule();
    return carc2.getAtomicNoFromLabel_0(atomLabel, 321);
  };
  carc2.getAtomicNoFromLabel_0 = function getAtomicNoFromLabel_0(atomLabel, allowedPseudoAtomGroups) {
    carc2.$clinit_Molecule();
    var i, i0, i1, i2, i3;
    if ((allowedPseudoAtomGroups & 256) != 0 && jl.equals_Ljava_lang_Object__Z__devirtual$_2(atomLabel, "?"))
      return 0;
    for (i0 = 1; i0 <= 128; i0++)
      if (!jl.equals_Ljava_lang_Object__Z__devirtual$_2(atomLabel, "??") && jl.equalsIgnoreCase_Ljava_lang_String__Z__devirtual$(atomLabel, carc2.cAtomLabel[i0]))
        return i0;
    if ((allowedPseudoAtomGroups & 2) != 0) {
      for (i1 = 129; i1 <= 144; i1++)
        if (jl.equalsIgnoreCase_Ljava_lang_String__Z__devirtual$(atomLabel, carc2.cAtomLabel[i1]))
          return i1;
    }
    if ((allowedPseudoAtomGroups & 4) != 0) {
      for (i2 = 146; i2 <= 148; i2++)
        if (jl.equalsIgnoreCase_Ljava_lang_String__Z__devirtual$(atomLabel, carc2.cAtomLabel[i2]))
          return i2;
    }
    if ((allowedPseudoAtomGroups & 1) != 0) {
      for (i3 = 151; i3 <= 152; i3++)
        if (jl.equalsIgnoreCase_Ljava_lang_String__Z__devirtual$(atomLabel, carc2.cAtomLabel[i3]))
          return i3;
    }
    if ((allowedPseudoAtomGroups & 32) != 0) {
      if (jl.equalsIgnoreCase_Ljava_lang_String__Z__devirtual$(atomLabel, carc2.cAtomLabel[153]))
        return 153;
    }
    if ((allowedPseudoAtomGroups & 8) != 0) {
      if (jl.equalsIgnoreCase_Ljava_lang_String__Z__devirtual$(atomLabel, carc2.cAtomLabel[154]))
        return 154;
    }
    if ((allowedPseudoAtomGroups & 16) != 0) {
      if (jl.equalsIgnoreCase_Ljava_lang_String__Z__devirtual$(atomLabel, carc2.cAtomLabel[145]))
        return 145;
    }
    if ((allowedPseudoAtomGroups & 128) != 0) {
      if (jl.equalsIgnoreCase_Ljava_lang_String__Z__devirtual$(atomLabel, carc2.cAtomLabel[159]))
        return 159;
    }
    if ((allowedPseudoAtomGroups & 64) != 0) {
      for (i = 171; i <= 190; i++)
        if (jl.equalsIgnoreCase_Ljava_lang_String__Z__devirtual$(atomLabel, carc2.cAtomLabel[i]))
          return i;
    }
    return 0;
  };
  carc2.getDefaultAverageBondLength = function getDefaultAverageBondLength() {
    carc2.$clinit_Molecule();
    return carc2.sDefaultAVBL;
  };
  carc2.isAtomicNoElectronegative = function isAtomicNoElectronegative(atomicNo) {
    carc2.$clinit_Molecule();
    switch (atomicNo) {
      case 7:
      case 8:
      case 9:
      case 15:
      case 16:
      case 17:
      case 33:
      case 34:
      case 35:
      case 52:
      case 53:
        return true;
    }
    return false;
  };
  carc2.isAtomicNoElectropositive = function isAtomicNoElectropositive(atomicNo) {
    carc2.$clinit_Molecule();
    if (atomicNo == 1 || atomicNo == 6)
      return false;
    if (carc2.isAtomicNoElectronegative(atomicNo))
      return false;
    if (carc2.isAtomicNoNobleGas(atomicNo))
      return false;
    if (atomicNo > 103)
      return false;
    return true;
  };
  carc2.isAtomicNoMetal = function isAtomicNoMetal(atomicNo) {
    return atomicNo >= 3 && atomicNo <= 4 || atomicNo >= 11 && atomicNo <= 13 || atomicNo >= 19 && atomicNo <= 31 || atomicNo >= 37 && atomicNo <= 51 || atomicNo >= 55 && atomicNo <= 84 || atomicNo >= 87 && atomicNo <= 112;
  };
  carc2.isAtomicNoNobleGas = function isAtomicNoNobleGas(atomicNo) {
    carc2.$clinit_Molecule();
    return atomicNo == 2 || atomicNo == 10 || atomicNo == 18 || atomicNo == 36 || atomicNo == 54 || atomicNo == 86;
  };
  carc2.isAtomicNoOrganic = function isAtomicNoOrganic(atomicNo) {
    return atomicNo == 1 || atomicNo >= 5 && atomicNo <= 9 || atomicNo >= 14 && atomicNo <= 17 || atomicNo >= 32 && atomicNo <= 35 || atomicNo >= 52 && atomicNo <= 53;
  };
  carc2.isAtomicNoTransitionMetal = function isAtomicNoTransitionMetal(atomicNo) {
    return atomicNo >= 21 && atomicNo <= 30 || atomicNo >= 39 && atomicNo <= 48 || atomicNo == 57 || atomicNo >= 72 && atomicNo <= 80 || atomicNo == 89 || atomicNo >= 104 && atomicNo <= 112;
  };
  carc2.setDefaultAverageBondLength = function setDefaultAverageBondLength(defaultAVBL) {
    carc2.$clinit_Molecule();
    carc2.sDefaultAVBL = defaultAVBL;
  };
  defineClass(60, 1, { 60: 1, 4: 1, 1: 1 }, carc2.Molecule);
  _.$init_29 = function $init_29() {
  };
  _.adaptBondTypeToQueryFeatures = function adaptBondTypeToQueryFeatures(bond) {
    var bondType, selectionCount;
    bondType = -1;
    selectionCount = 0;
    if ((this.mBondQueryFeatures[bond] & 16) != 0) {
      bondType = 16;
      selectionCount++;
    }
    if ((this.mBondQueryFeatures[bond] & 64) != 0) {
      bondType = 64;
      selectionCount++;
    }
    if ((this.mBondQueryFeatures[bond] & 32) != 0) {
      bondType = 32;
      selectionCount++;
    }
    if ((this.mBondQueryFeatures[bond] & 4) != 0) {
      bondType = 4;
      selectionCount++;
    }
    if ((this.mBondQueryFeatures[bond] & 2) != 0) {
      bondType = 2;
      selectionCount++;
    }
    if ((this.mBondQueryFeatures[bond] & 8) != 0) {
      bondType = 8;
      selectionCount++;
    }
    if ((this.mBondQueryFeatures[bond] & 1) != 0) {
      bondType = 1;
      selectionCount++;
    }
    if (bondType != -1 && bondType != (this.mBondType[bond] & 127))
      this.mBondType[bond] = bondType;
    if (selectionCount < 2)
      this.mBondQueryFeatures[bond] &= ~127;
  };
  _.addAtom_0 = function addAtom(x_0, y_0) {
    return this.addAtom_1(x_0, y_0, 0);
  };
  _.addAtom_1 = function addAtom_0(x_0, y_0, z_0) {
    var atom;
    atom = this.addAtom_2(6);
    this.mCoordinates[atom].set_0(x_0, y_0, z_0);
    return atom;
  };
  _.addAtom_2 = function addAtom_1(atomicNo) {
    if (this.mAllAtoms >= this.mMaxAtoms)
      this.setMaxAtoms_0(this.mMaxAtoms * 2);
    this.mAtomicNo[this.mAllAtoms] = 0;
    this.setAtomicNo_0(this.mAllAtoms, atomicNo);
    this.mAtomCharge[this.mAllAtoms] = 0;
    this.mAtomFlags[this.mAllAtoms] = 0;
    this.mAtomQueryFeatures[this.mAllAtoms] = 0;
    this.mAtomMapNo[this.mAllAtoms] = 0;
    this.mCoordinates[this.mAllAtoms].set_0(0, 0, 0);
    if (jsNotEquals(this.mAtomList, null))
      this.mAtomList[this.mAllAtoms] = null;
    if (jsNotEquals(this.mAtomCustomLabel, null))
      this.mAtomCustomLabel[this.mAllAtoms] = null;
    this.mValidHelperArrays = 0;
    return this.mAllAtoms++;
  };
  _.addBond_0 = function addBond(atom1, atom2) {
    return this.addBond_1(atom1, atom2, this.suggestBondType_0(atom1, atom2));
  };
  _.addBond_1 = function addBond_0(atom1, atom2, type_0) {
    var bnd;
    if (atom1 == atom2)
      return -1;
    for (bnd = 0; bnd < this.mAllBonds; bnd++) {
      if (this.mBondAtom[0][bnd] == atom1 && this.mBondAtom[1][bnd] == atom2 || this.mBondAtom[0][bnd] == atom2 && this.mBondAtom[1][bnd] == atom1) {
        if (this.mBondType[bnd] < type_0)
          this.mBondType[bnd] = type_0;
        return bnd;
      }
    }
    return this.addBondNoChecks(atom1, atom2, type_0);
  };
  _.addBondNoChecks = function addBondNoChecks(atom1, atom2, type_0) {
    if (this.mAllBonds >= this.mMaxBonds)
      this.setMaxBonds_0(this.mMaxBonds * 2);
    this.mBondAtom[0][this.mAllBonds] = atom1;
    this.mBondAtom[1][this.mAllBonds] = atom2;
    this.mBondType[this.mAllBonds] = type_0;
    this.mBondFlags[this.mAllBonds] = 0;
    this.mBondQueryFeatures[this.mAllBonds] = 0;
    this.mValidHelperArrays = 0;
    return this.mAllBonds++;
  };
  _.addMolecule_0 = function addMolecule(mol) {
    return this.addMolecule_1(mol, mol.mAllAtoms, mol.mAllBonds);
  };
  _.addMolecule_1 = function addMolecule_0(mol, atoms, bonds) {
    return this.addMolecule_2(mol, 0, atoms, 0, bonds, true);
  };
  _.addMolecule_2 = function addMolecule_1(mol, atom1, atom2, bond1, bond2, includeExcludeGroups) {
    var atom, atomMap, bond, esrGroupCountAND, esrGroupCountOR;
    this.mIsFragment = this.mIsFragment | mol.mIsFragment;
    atomMap = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.mAllAtoms, 15, 1);
    esrGroupCountAND = this.renumberESRGroups_0(1);
    esrGroupCountOR = this.renumberESRGroups_0(2);
    for (atom = atom1; atom < atom2; atom++)
      if (includeExcludeGroups || !mol.isExcludeGroupAtom(atom))
        atomMap[atom] = mol.copyAtom_0(this, atom, esrGroupCountAND, esrGroupCountOR);
    for (bond = bond1; bond < bond2; bond++)
      if (includeExcludeGroups || !mol.isExcludeGroupAtom(mol.getBondAtom_0(0, bond)) && !mol.isExcludeGroupAtom(mol.getBondAtom_0(1, bond)))
        mol.copyBond_1(this, bond, esrGroupCountAND, esrGroupCountOR, atomMap, false);
    this.mIsRacemate = this.mIsRacemate && mol.mIsRacemate;
    this.mChirality = 0;
    this.mValidHelperArrays = 0;
    return atomMap;
  };
  _.addMolecule_3 = function addMolecule_2(mol, atoms, bonds, includeExcludeGroups) {
    return this.addMolecule_2(mol, 0, atoms, 0, bonds, includeExcludeGroups);
  };
  _.addOrChangeAtom_0 = function addOrChangeAtom(x_0, y_0, atomicNo, mass, abnormalValence, radical, customLabel) {
    var atom, changed;
    atom = this.findAtom_0(x_0, y_0);
    if (atom == -1) {
      if (this.mAllAtoms >= this.mMaxAtoms)
        this.setMaxAtoms_0(this.mMaxAtoms * 2);
      atom = this.addAtom_2(atomicNo);
      this.mCoordinates[atom].set_0(x_0, y_0, 0);
      this.mAtomMass[atom] = mass;
      this.setAtomAbnormalValence_0(atom, abnormalValence);
      this.setAtomRadical_0(atom, radical);
      this.setAtomCustomLabel_0(atom, customLabel);
      return true;
    }
    changed = this.changeAtom_0(atom, atomicNo, mass, abnormalValence, radical);
    this.setAtomCustomLabel_0(atom, customLabel);
    return changed;
  };
  _.addOrChangeBond_0 = function addOrChangeBond(atm1, atm2, type_0) {
    var bnd;
    for (bnd = 0; bnd < this.mAllBonds; bnd++) {
      if (this.mBondAtom[0][bnd] == atm1 && this.mBondAtom[1][bnd] == atm2 || this.mBondAtom[0][bnd] == atm2 && this.mBondAtom[1][bnd] == atm1) {
        this.changeBond_0(bnd, type_0);
        this.mValidHelperArrays = 0;
        return bnd;
      }
    }
    if (this.mAllBonds >= this.mMaxBonds)
      this.setMaxBonds_0(this.mMaxBonds * 2);
    this.mBondAtom[0][this.mAllBonds] = atm1;
    this.mBondAtom[1][this.mAllBonds] = atm2;
    this.mBondType[this.mAllBonds] = type_0;
    this.mBondFlags[this.mAllBonds] = 0;
    this.mBondQueryFeatures[this.mAllBonds] = 0;
    this.mValidHelperArrays = 0;
    return this.mAllBonds++;
  };
  _.addRing_0 = function addRing(x_0, y_0, ringSize, aromatic, bondLength) {
    var atom, bond, cornerAngle;
    while (this.mAllAtoms + ringSize > this.mMaxAtoms)
      this.setMaxAtoms_0(this.mMaxAtoms * 2);
    while (this.mAllBonds + ringSize > this.mMaxBonds)
      this.setMaxBonds_0(this.mMaxBonds * 2);
    atom = this.findAtom_0(x_0, y_0);
    if (atom != -1)
      return this.addRingToAtom_0(atom, ringSize, aromatic, bondLength);
    bond = this.findBond_0(x_0, y_0);
    if (bond != -1)
      return this.addRingToBond_0(bond, ringSize, aromatic, bondLength);
    atom = this.addAtom_0(x_0, y_0);
    cornerAngle = 3.141592653589793 * (ringSize - 2) / ringSize;
    this.polygon(atom, ringSize, atom, aromatic, 0, 3.141592653589793 - cornerAngle, bondLength);
    this.mValidHelperArrays = 0;
    return true;
  };
  _.addRingToAtom_0 = function addRingToAtom(atom, ringSize, aromatic, bondLength) {
    var angle, angles, cornerAngle, i, j, newAngle;
    if (aromatic && this.getOccupiedValence_0(atom) > 1 || !aromatic && this.getOccupiedValence_0(atom) > 2)
      return false;
    angles = 0;
    angle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
    for (i = 0; i < this.mAllBonds; i++) {
      for (j = 0; j < 2; j++) {
        if (this.mBondAtom[j][i] == atom) {
          if (angles == 2) {
            angles = 3;
            break;
          }
          angle[angles++] = this.getBondAngle_0(atom, this.mBondAtom[1 - j][i]);
        }
      }
      if (angles == 3)
        break;
    }
    if (angles == 3)
      return false;
    newAngle = angles == 1 ? angle[0] + 3.141592653589793 : $wnd.Math.abs(angle[0] - angle[1]) > 3.141592653589793 ? (angle[0] + angle[1]) / 2 : (angle[0] + angle[1]) / 2 + 3.141592653589793;
    cornerAngle = 3.141592653589793 * (ringSize - 2) / ringSize;
    this.polygon(atom, ringSize, atom, aromatic, newAngle - cornerAngle / 2, 3.141592653589793 - cornerAngle, bondLength);
    this.mValidHelperArrays = 0;
    return true;
  };
  _.addRingToBond_0 = function addRingToBond(bond, ringSize, aromatic, bondLength) {
    var angle, angles, atomNo, bondAngle, bondAtom, cornerAngle, i, i0, j, k, side;
    bondAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    bondAngle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    bondAtom[0] = this.mBondAtom[0][bond];
    bondAtom[1] = this.mBondAtom[1][bond];
    if (this.getOccupiedValence_0(bondAtom[0]) > 3)
      return false;
    if (this.getOccupiedValence_0(bondAtom[1]) > 3)
      return false;
    angles = 0;
    angle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
    for (i0 = 0; i0 < this.mAllBonds; i0++) {
      if (i0 == bond)
        continue;
      for (j = 0; j < 2; j++) {
        for (k = 0; k < 2; k++) {
          if (this.mBondAtom[j][i0] == bondAtom[k]) {
            if (angles == 4) {
              angles = 5;
              break;
            }
            angle[angles++] = this.getBondAngle_0(bondAtom[k], this.mBondAtom[1 - j][i0]);
          }
        }
        if (angles == 5)
          break;
      }
      if (angles == 5)
        break;
    }
    if (angles == 5)
      return false;
    bondAngle[0] = this.getBondAngle_0(bondAtom[0], bondAtom[1]);
    if (bondAngle[0] < 0) {
      bondAngle[1] = bondAngle[0] + 3.141592653589793;
      atomNo = 0;
    } else {
      bondAngle[1] = bondAngle[0];
      bondAngle[0] = bondAngle[1] - 3.141592653589793;
      atomNo = 1;
    }
    side = 0;
    for (i = 0; i < angles; i++) {
      if (angle[i] > bondAngle[0] && angle[i] < bondAngle[1])
        side--;
      else
        side++;
    }
    atomNo = side > 0 ? 1 - atomNo : atomNo;
    cornerAngle = 3.141592653589793 * (ringSize - 2) / ringSize;
    this.polygon(bondAtom[atomNo], ringSize - 1, bondAtom[1 - atomNo], aromatic, bondAngle[side > 0 ? 0 : 1] + 3.141592653589793 - cornerAngle, 3.141592653589793 - cornerAngle, bondLength);
    this.mValidHelperArrays = 0;
    return true;
  };
  _.addSubstituent_0 = function addSubstituent(substituent, rootAtom) {
    var atom, atomMap, b, bond, bond0, esrGroupCountAND, esrGroupCountOR, i, invert, j, neighbor, parity;
    atomMap = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, substituent.mAllAtoms, 15, 1);
    esrGroupCountAND = this.renumberESRGroups_0(1);
    esrGroupCountOR = this.renumberESRGroups_0(2);
    for (atom = 0; atom < substituent.mAllAtoms; atom++) {
      if (substituent.getAtomicNo_0(atom) != 0 || jsNotEquals(substituent.getAtomCustomLabel_0(atom), null)) {
        atomMap[atom] = substituent.copyAtom_0(this, atom, esrGroupCountAND, esrGroupCountOR);
      } else {
        atomMap[atom] = rootAtom;
        if ((substituent.mValidHelperArrays & 8) != 0) {
          for (bond0 = 0; bond0 < substituent.mAllBonds; bond0++) {
            for (i = 0; i < 2; i++) {
              if (substituent.getBondAtom_0(i, bond0) == atom) {
                neighbor = substituent.getBondAtom_0(1 - i, bond0);
                parity = substituent.getAtomParity_0(neighbor);
                invert = false;
                if (parity == 1 || parity == 2) {
                  for (b = 0; b < substituent.mAllBonds; b++) {
                    if (b != bond0) {
                      for (j = 0; j < 2; j++) {
                        if (substituent.getBondAtom_0(j, b) == neighbor && substituent.getBondAtom_0(1 - j, b) < atom) {
                          invert = !invert;
                        }
                      }
                    }
                  }
                }
                if (invert)
                  substituent.setAtomParity_0(neighbor, parity == 1 ? 2 : 1, substituent.isAtomParityPseudo_0(neighbor));
              }
            }
          }
        }
      }
    }
    for (bond = 0; bond < substituent.mAllBonds; bond++) {
      substituent.copyBond_1(this, bond, esrGroupCountAND, esrGroupCountOR, atomMap, false);
    }
    this.mIsRacemate = this.mIsRacemate && substituent.mIsRacemate;
    this.mChirality = 0;
    this.mValidHelperArrays = 0;
    return atomMap;
  };
  _.calculateTorsion_0 = function calculateTorsion(atom) {
    var c1, c2, c3, c4, n1, n2, v1, v2, v3;
    c1 = this.mCoordinates[atom[0]];
    c2 = this.mCoordinates[atom[1]];
    c3 = this.mCoordinates[atom[2]];
    c4 = this.mCoordinates[atom[3]];
    v1 = c2.subC(c1);
    v2 = c3.subC(c2);
    v3 = c4.subC(c3);
    n1 = v1.cross(v2);
    n2 = v2.cross(v3);
    return -$wnd.Math.atan2(v2.getLength() * v1.dot(n2), n1.dot(n2));
  };
  _.changeAtom_0 = function changeAtom(atom, atomicNo, mass, abnormalValence, radical) {
    if ((atomicNo == 1 || atomicNo == 151 || atomicNo == 152) && this.getOccupiedValence_0(atom) > 1)
      return false;
    this.mAtomQueryFeatures[atom] = and_0(this.mAtomQueryFeatures[atom], not_0(1));
    if (jsNotEquals(this.mAtomList, null))
      this.mAtomList[atom] = null;
    if (jsNotEquals(this.mAtomCustomLabel, null))
      this.mAtomCustomLabel[atom] = null;
    if (atomicNo == this.mAtomicNo[atom] && mass == this.mAtomMass[atom] && abnormalValence == this.getAtomAbnormalValence_0(atom) && radical == this.getAtomRadical_0(atom))
      return false;
    if (atomicNo == 151 || atomicNo == 152) {
      mass = atomicNo - 149;
      atomicNo = 1;
    }
    this.mAtomFlags[atom] &= 448 | 512;
    this.mAtomicNo[atom] = atomicNo;
    this.mAtomMass[atom] = mass;
    this.mAtomCharge[atom] = 0;
    this.mAtomQueryFeatures[atom] = 0;
    this.setAtomAbnormalValence_0(atom, abnormalValence);
    this.setAtomRadical_0(atom, radical);
    this.removeMappingNo(this.mAtomMapNo[atom]);
    this.mValidHelperArrays = 0;
    return true;
  };
  _.changeAtomCharge_0 = function changeAtomCharge(x_0, y_0, positive) {
    var atom;
    atom = this.findAtom_0(x_0, y_0);
    return atom != -1 && this.changeAtomCharge_1(atom, positive);
  };
  _.changeAtomCharge_1 = function changeAtomCharge_0(atom, positive) {
    if (positive) {
      if (this.mAtomCharge[atom] > 8)
        return false;
      this.mAtomCharge[atom]++;
    } else {
      if (this.mAtomCharge[atom] < -8)
        return false;
      this.mAtomCharge[atom]--;
    }
    this.mValidHelperArrays = 0;
    return true;
  };
  _.changeBond_0 = function changeBond(bnd, type_0) {
    var bondAtAtom1Qualifies, bondAtAtom2Qualifies, bondWasChanged, oldType, temp;
    bondWasChanged = false;
    oldType = this.mBondType[bnd];
    if (type_0 == 511) {
      bondWasChanged = this.incrementBondOrder(bnd);
    } else if (this.validateBondType(bnd, type_0)) {
      if (type_0 == 257 || type_0 == 129) {
        bondAtAtom1Qualifies = this.qualifiesAsStereoBond(bnd, this.mBondAtom[0][bnd]);
        bondAtAtom2Qualifies = this.qualifiesAsStereoBond(bnd, this.mBondAtom[1][bnd]);
        if (type_0 == oldType) {
          if (bondAtAtom1Qualifies == bondAtAtom2Qualifies || bondAtAtom2Qualifies) {
            temp = this.mBondAtom[0][bnd];
            this.mBondAtom[0][bnd] = this.mBondAtom[1][bnd];
            this.mBondAtom[1][bnd] = temp;
            bondWasChanged = true;
          }
        } else {
          if (!bondAtAtom1Qualifies && bondAtAtom2Qualifies) {
            temp = this.mBondAtom[0][bnd];
            this.mBondAtom[0][bnd] = this.mBondAtom[1][bnd];
            this.mBondAtom[1][bnd] = temp;
          }
          this.mBondType[bnd] = type_0;
          bondWasChanged = true;
        }
      } else {
        this.mBondType[bnd] = type_0;
        bondWasChanged = true;
      }
    }
    if (bondWasChanged) {
      this.mValidHelperArrays = (oldType & 127) == (type_0 & 127) ? this.mValidHelperArrays & 7 : 0;
      this.mBondQueryFeatures[bnd] = 0;
    }
    return bondWasChanged;
  };
  _.clear_0 = function clear_4() {
    this.mAllAtoms = 0;
    this.mAllBonds = 0;
    this.mIsFragment = false;
    this.mIsRacemate = false;
    this.mChirality = 0;
    this.mAtomList = null;
    this.mAtomCustomLabel = null;
    this.mName = null;
    this.mValidHelperArrays = 0;
  };
  _.compressMolTable = function compressMolTable() {
    var atom, atom1, atom2, atomDest, bnd, bnd0, bondDest, newAtmNo;
    for (bnd0 = 0; bnd0 < this.mAllBonds; bnd0++) {
      if (this.mBondType[bnd0] == 512) {
        atom1 = this.mBondAtom[0][bnd0];
        atom2 = this.mBondAtom[1][bnd0];
        if (this.mAtomicNo[atom1] == -1 ^ this.mAtomicNo[atom2] == -1) {
          if (this.mAtomCharge[atom1] != 0 && this.mAtomCharge[atom2] != 0) {
            if (this.mAtomCharge[atom1] < 0 ^ this.mAtomCharge[atom2] < 0) {
              if (this.mAtomCharge[atom1] < 0) {
                this.mAtomCharge[atom1]++;
                this.mAtomCharge[atom2]--;
              } else {
                this.mAtomCharge[atom1]--;
                this.mAtomCharge[atom2]++;
              }
            }
          }
        }
      }
    }
    newAtmNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    atomDest = 0;
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      if (this.mAtomicNo[atom] == -1) {
        newAtmNo[atom] = -1;
        continue;
      }
      if (atomDest < atom) {
        this.mAtomicNo[atomDest] = this.mAtomicNo[atom];
        this.mAtomCharge[atomDest] = this.mAtomCharge[atom];
        this.mAtomMass[atomDest] = this.mAtomMass[atom];
        this.mAtomFlags[atomDest] = this.mAtomFlags[atom];
        this.mAtomQueryFeatures[atomDest] = this.mAtomQueryFeatures[atom];
        this.mAtomMapNo[atomDest] = this.mAtomMapNo[atom];
        this.mCoordinates[atomDest].set_1(this.mCoordinates[atom]);
        if (jsNotEquals(this.mAtomList, null))
          this.mAtomList[atomDest] = this.mAtomList[atom];
        if (jsNotEquals(this.mAtomCustomLabel, null))
          this.mAtomCustomLabel[atomDest] = this.mAtomCustomLabel[atom];
      }
      newAtmNo[atom] = atomDest;
      atomDest++;
    }
    this.mAllAtoms = atomDest;
    bondDest = 0;
    for (bnd = 0; bnd < this.mAllBonds; bnd++) {
      if (this.mBondType[bnd] == 512)
        continue;
      this.mBondType[bondDest] = this.mBondType[bnd];
      this.mBondFlags[bondDest] = this.mBondFlags[bnd];
      this.mBondQueryFeatures[bondDest] = this.mBondQueryFeatures[bnd];
      this.mBondAtom[0][bondDest] = newAtmNo[this.mBondAtom[0][bnd]];
      this.mBondAtom[1][bondDest] = newAtmNo[this.mBondAtom[1][bnd]];
      bondDest++;
    }
    this.mAllBonds = bondDest;
    return newAtmNo;
  };
  _.copyAtom_0 = function copyAtom(destMol, sourceAtom, esrGroupOffsetAND, esrGroupOffsetOR) {
    var destAtom, esrGroup, esrType;
    destAtom = destMol.mAllAtoms;
    if (destAtom >= destMol.mMaxAtoms)
      destMol.setMaxAtoms_0(destMol.mMaxAtoms * 2);
    esrType = this.getAtomESRType_0(sourceAtom);
    esrGroup = -1;
    if (esrType == 1) {
      if (esrGroupOffsetAND == -1)
        esrGroup = destMol.renumberESRGroups_0(esrType);
      else
        esrGroup = $wnd.Math.min(32 - 1, esrGroupOffsetAND + this.getAtomESRGroup_0(sourceAtom));
    } else if (esrType == 2) {
      if (esrGroupOffsetOR == -1)
        esrGroup = destMol.renumberESRGroups_0(esrType);
      else
        esrGroup = $wnd.Math.min(32 - 1, esrGroupOffsetOR + this.getAtomESRGroup_0(sourceAtom));
    }
    destMol.mAtomicNo[destAtom] = this.mAtomicNo[sourceAtom];
    destMol.mAtomCharge[destAtom] = this.mAtomCharge[sourceAtom];
    destMol.mAtomMass[destAtom] = this.mAtomMass[sourceAtom];
    destMol.mAtomFlags[destAtom] = this.mAtomFlags[sourceAtom];
    destMol.mAtomQueryFeatures[destAtom] = destMol.mIsFragment ? this.mAtomQueryFeatures[sourceAtom] : 0;
    destMol.mCoordinates[destAtom].set_1(this.mCoordinates[sourceAtom]);
    destMol.mAtomMapNo[destAtom] = this.mAtomMapNo[sourceAtom];
    if (jsNotEquals(destMol.mAtomList, null))
      destMol.mAtomList[destAtom] = null;
    if (jsNotEquals(this.mAtomList, null) && jsNotEquals(this.mAtomList[sourceAtom], null) && destMol.mIsFragment) {
      if (jsEquals(destMol.mAtomList, null))
        destMol.mAtomList = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, destMol.mAtomicNo.length, 0, 2);
      destMol.mAtomList[destAtom] = ju.copyOf_9(this.mAtomList[sourceAtom], this.mAtomList[sourceAtom].length);
    }
    if (jsNotEquals(destMol.mAtomCustomLabel, null))
      destMol.mAtomCustomLabel[destAtom] = null;
    if (jsNotEquals(this.mAtomCustomLabel, null) && jsNotEquals(this.mAtomCustomLabel[sourceAtom], null)) {
      if (jsEquals(destMol.mAtomCustomLabel, null))
        destMol.mAtomCustomLabel = initUnidimensionalArray(cggl.B_classLit, { 68: 1, 4: 1, 1: 1, 7: 1 }, 8, destMol.mAtomicNo.length, 0, 2);
      destMol.mAtomCustomLabel[destAtom] = ju.copyOf_7(this.mAtomCustomLabel[sourceAtom], this.mAtomCustomLabel[sourceAtom].length);
    }
    if (esrGroup != -1) {
      destMol.mAtomFlags[destAtom] &= ~32505856;
      destMol.mAtomFlags[destAtom] |= esrGroup << 20;
    }
    destMol.mAllAtoms++;
    destMol.mValidHelperArrays = 0;
    return destAtom;
  };
  _.copyBond_0 = function copyBond(destMol, sourceBond, esrGroupOffsetAND, esrGroupOffsetOR, destAtom1, destAtom2, useBondTypeDelocalized) {
    var bondType, destBond, esrGroup, esrType;
    destBond = destMol.mAllBonds;
    if (destBond >= destMol.mMaxBonds)
      destMol.setMaxBonds_0(destMol.mMaxBonds * 2);
    esrType = this.getBondESRType_0(sourceBond);
    esrGroup = -1;
    if (esrType == 1) {
      if (esrGroupOffsetAND == -1)
        esrGroup = destMol.renumberESRGroups_0(esrType);
      else
        esrGroup = $wnd.Math.min(32, esrGroupOffsetAND + this.getBondESRGroup_0(sourceBond));
    }
    if (esrType == 2) {
      if (esrGroupOffsetOR == -1)
        esrGroup = destMol.renumberESRGroups_0(esrType);
      else
        esrGroup = $wnd.Math.min(32, esrGroupOffsetOR + this.getBondESRGroup_0(sourceBond));
    }
    destMol.mBondAtom[0][destBond] = destAtom1;
    destMol.mBondAtom[1][destBond] = destAtom2;
    bondType = useBondTypeDelocalized && this.isDelocalizedBond_0(sourceBond) ? 8 : this.mBondType[sourceBond];
    destMol.mBondType[destBond] = bondType;
    destMol.mBondFlags[destBond] = this.mBondFlags[sourceBond];
    destMol.mBondQueryFeatures[destBond] = destMol.mIsFragment ? this.mBondQueryFeatures[sourceBond] : 0;
    if (esrGroup != -1) {
      destMol.mBondFlags[destBond] &= ~31744;
      destMol.mBondFlags[destBond] |= esrGroup << 10;
    }
    destMol.mAllBonds++;
    destMol.mValidHelperArrays = 0;
    return destBond;
  };
  _.copyBond_1 = function copyBond_0(destMol, sourceBond, esrGroupOffsetAND, esrGroupOffsetOR, atomMap, useBondTypeDelocalized) {
    return this.copyBond_0(destMol, sourceBond, esrGroupOffsetAND, esrGroupOffsetOR, jsEquals(atomMap, null) ? this.mBondAtom[0][sourceBond] : atomMap[this.mBondAtom[0][sourceBond]], jsEquals(atomMap, null) ? this.mBondAtom[1][sourceBond] : atomMap[this.mBondAtom[1][sourceBond]], useBondTypeDelocalized);
  };
  _.copyMolecule_0 = function copyMolecule(destMol) {
    var atom, bnd;
    destMol.mAtomList = null;
    destMol.mAtomCustomLabel = null;
    destMol.mIsFragment = this.mIsFragment;
    destMol.mAllAtoms = 0;
    for (atom = 0; atom < this.mAllAtoms; atom++)
      this.copyAtom_0(destMol, atom, 0, 0);
    destMol.mAllBonds = 0;
    for (bnd = 0; bnd < this.mAllBonds; bnd++)
      this.copyBond_1(destMol, bnd, 0, 0, null, false);
    this.copyMoleculeProperties_0(destMol);
  };
  _.copyMoleculeProperties_0 = function copyMoleculeProperties(destMol) {
    destMol.mIsFragment = this.mIsFragment;
    destMol.mIsRacemate = this.mIsRacemate;
    destMol.mProtectHydrogen = this.mProtectHydrogen;
    destMol.mChirality = this.mChirality;
    destMol.mName = this.mName;
    destMol.mValidHelperArrays = this.mValidHelperArrays & (8 | 16);
  };
  _.deleteAtom_0 = function deleteAtom_0(atom) {
    var bnd, i;
    for (bnd = 0; bnd < this.mAllBonds; bnd++)
      for (i = 0; i < 2; i++)
        if (this.mBondAtom[i][bnd] == atom)
          this.mBondType[bnd] = 512;
    this.removeMappingNo(this.mAtomMapNo[atom]);
    this.mAtomicNo[atom] = -1;
    if (jsNotEquals(this.mAtomList, null))
      this.mAtomList[atom] = null;
    if (jsNotEquals(this.mAtomCustomLabel, null))
      this.mAtomCustomLabel[atom] = null;
    this.compressMolTable();
    this.mValidHelperArrays = 0;
  };
  _.deleteAtomOrBond_0 = function deleteAtomOrBond(x_0, y_0) {
    var atom, bnd;
    atom = this.findAtom_0(x_0, y_0);
    if (atom != -1) {
      if ((this.mAtomFlags[atom] & 512) != 0)
        this.deleteSelectedAtoms_0();
      else
        this.deleteAtom_0(atom);
      this.mValidHelperArrays = 0;
      return true;
    }
    bnd = this.findBond_0(x_0, y_0);
    if (bnd != -1) {
      if ((this.mAtomFlags[this.mBondAtom[0][bnd]] & this.mAtomFlags[this.mBondAtom[1][bnd]] & 512) != 0)
        this.deleteSelectedAtoms_0();
      else
        this.deleteBondAndSurrounding_0(bnd);
      this.mValidHelperArrays = 0;
      return true;
    }
    return false;
  };
  _.deleteAtoms_0 = function deleteAtoms(atomList) {
    var atom, atom$array, atom$index, atom$max;
    if (atomList.length == 0)
      return null;
    for (atom$array = atomList, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
      atom = atom$array[atom$index];
      this.markAtomForDeletion_0(atom);
    }
    return this.deleteMarkedAtomsAndBonds_0();
  };
  _.deleteAtoms_1 = function deleteAtoms_0(deleteAtom) {
    var atom, found;
    found = false;
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      if (deleteAtom[atom]) {
        this.markAtomForDeletion_0(atom);
        found = true;
      }
    }
    if (!found)
      return null;
    return this.deleteMarkedAtomsAndBonds_0();
  };
  _.deleteBond_0 = function deleteBond(bond) {
    this.mBondType[bond] = 512;
    this.compressMolTable();
    this.mValidHelperArrays = 0;
  };
  _.deleteBondAndSurrounding_0 = function deleteBondAndSurrounding(bond) {
    var bonds, i, j;
    for (i = 0; i < 2; i++) {
      bonds = 0;
      for (j = 0; j < this.mAllBonds; j++) {
        if (j == bond)
          continue;
        if (this.mBondAtom[0][j] == this.mBondAtom[i][bond] || this.mBondAtom[1][j] == this.mBondAtom[i][bond])
          bonds++;
      }
      if (bonds == 0) {
        this.removeMappingNo(this.mAtomMapNo[this.mBondAtom[i][bond]]);
        this.mAtomicNo[this.mBondAtom[i][bond]] = -1;
      }
    }
    this.mBondType[bond] = 512;
    this.compressMolTable();
    this.mValidHelperArrays = 0;
  };
  _.deleteMarkedAtomsAndBonds_0 = function deleteMarkedAtomsAndBonds() {
    var atom, bond, found;
    found = false;
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      if (this.mAtomicNo[atom] == -1) {
        found = true;
        this.removeMappingNo(this.mAtomMapNo[atom]);
      }
    }
    for (bond = 0; bond < this.mAllBonds; bond++) {
      if (this.mBondType[bond] == 512) {
        found = true;
      } else if (this.mAtomicNo[this.mBondAtom[0][bond]] == -1 || this.mAtomicNo[this.mBondAtom[1][bond]] == -1) {
        this.mBondType[bond] = 512;
        found = true;
      }
    }
    if (found) {
      this.mValidHelperArrays = 0;
      return this.compressMolTable();
    }
    return null;
  };
  _.deleteMolecule_0 = function deleteMolecule() {
    this.clear_0();
  };
  _.deleteSelectedAtoms_0 = function deleteSelectedAtoms() {
    var atom, found;
    found = false;
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      if ((this.mAtomFlags[atom] & 512) != 0) {
        this.markAtomForDeletion_0(atom);
        found = true;
      }
    }
    return found && jsNotEquals(this.deleteMarkedAtomsAndBonds_0(), null);
  };
  _.findAtom_0 = function findAtom(pickx, picky) {
    var atom, avbl, distanceSquare, foundAtom, foundDistanceSquare, maxDistanceSquare, x_0, y_0;
    foundAtom = -1;
    avbl = this.getAverageBondLength_0();
    foundDistanceSquare = 17976931348623157e292;
    maxDistanceSquare = avbl * avbl / 12;
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      x_0 = this.mCoordinates[atom].x_0;
      y_0 = this.mCoordinates[atom].y_0;
      distanceSquare = (pickx - x_0) * (pickx - x_0) + (picky - y_0) * (picky - y_0);
      if (distanceSquare < maxDistanceSquare && distanceSquare < foundDistanceSquare) {
        foundDistanceSquare = distanceSquare;
        foundAtom = atom;
      }
    }
    return foundAtom;
  };
  _.findBond_0 = function findBond(pickx, picky) {
    var bond, bondLength, centralX, centralY, constA, constC, distance, dx, dy, foundBond, foundDistance, maxDistance, x1, x2, y1, y2;
    foundBond = -1;
    maxDistance = this.getAverageBondLength_0();
    foundDistance = 17976931348623157e292;
    for (bond = 0; bond < this.mAllBonds; bond++) {
      x1 = this.mCoordinates[this.mBondAtom[0][bond]].x_0;
      y1 = this.mCoordinates[this.mBondAtom[0][bond]].y_0;
      x2 = this.mCoordinates[this.mBondAtom[1][bond]].x_0;
      y2 = this.mCoordinates[this.mBondAtom[1][bond]].y_0;
      dx = x2 - x1;
      dy = y2 - y1;
      bondLength = $wnd.Math.sqrt(dx * dx + dy * dy);
      centralX = (x1 + x2) / 2;
      centralY = (y1 + y2) / 2;
      dx = pickx - centralX;
      dy = picky - centralY;
      if ($wnd.Math.sqrt(dx * dx + dy * dy) > bondLength / 2)
        continue;
      if (x2 == x1)
        distance = $wnd.Math.abs(x1 - pickx);
      else {
        constA = (y2 - y1) / (x1 - x2);
        constC = -constA * x1 - y1;
        distance = $wnd.Math.abs((constA * pickx + picky + constC) / $wnd.Math.sqrt(constA * constA + 1));
      }
      if (distance < maxDistance && distance < foundDistance) {
        foundDistance = distance;
        foundBond = bond;
      }
    }
    return foundBond;
  };
  _.getAllAtoms_0 = function getAllAtoms() {
    return this.mAllAtoms;
  };
  _.getAllBonds_0 = function getAllBonds() {
    return this.mAllBonds;
  };
  _.getAtomAbnormalValence_0 = function getAtomAbnormalValence(atom) {
    return ((this.mAtomFlags[atom] & 2013265920) >>> 27) - 1;
  };
  _.getAtomCIPParity_0 = function getAtomCIPParity(atom) {
    return (this.mAtomFlags[atom] & 49152) >> 14;
  };
  _.getAtomCharge_0 = function getAtomCharge(atom) {
    return this.mAtomCharge[atom];
  };
  _.getAtomColor_0 = function getAtomColor(atom) {
    return this.mAtomFlags[atom] & 448;
  };
  _.getAtomCoordinates = function getAtomCoordinates() {
    return this.mCoordinates;
  };
  _.getAtomCoordinates_0 = function getAtomCoordinates_0(atom) {
    return this.mCoordinates[atom];
  };
  _.getAtomCustomLabel_0 = function getAtomCustomLabel(atom) {
    return jsEquals(this.mAtomCustomLabel, null) ? null : jsEquals(this.mAtomCustomLabel[atom], null) ? null : jl.$create_12(this.mAtomCustomLabel[atom], (jnc.$clinit_StandardCharsets(), jnc.UTF_8));
  };
  _.getAtomCustomLabelBytes = function getAtomCustomLabelBytes(atom) {
    return jsEquals(this.mAtomCustomLabel, null) ? null : this.mAtomCustomLabel[atom];
  };
  _.getAtomESRGroup_0 = function getAtomESRGroup(atom) {
    if (this.getAtomESRType_0(atom) != 1 && this.getAtomESRType_0(atom) != 2)
      return -1;
    else
      return (this.mAtomFlags[atom] & 32505856) >> 20;
  };
  _.getAtomESRType_0 = function getAtomESRType(atom) {
    return (this.mAtomFlags[atom] & 786432) >> 18;
  };
  _.getAtomLabel_0 = function getAtomLabel(atom) {
    return carc2.cAtomLabel[this.mAtomicNo[atom]];
  };
  _.getAtomList_0 = function getAtomList(atom) {
    return jsEquals(this.mAtomList, null) ? null : this.mAtomList[atom];
  };
  _.getAtomListString_0 = function getAtomListString(atom) {
    var atomicNo, i, listString;
    if (jsEquals(this.mAtomList, null) || jsEquals(this.mAtomList[atom], null))
      return neq(and_0(this.mAtomQueryFeatures[atom], 1), 0) ? "" : carc2.cAtomLabel[this.mAtomicNo[atom]];
    listString = "";
    for (i = 0; i < this.mAtomList[atom].length; i++) {
      if (i > 0)
        listString = jl.concat_Ljava_lang_String__Ljava_lang_String___devirtual$(listString, ",");
      atomicNo = this.mAtomList[atom][i];
      listString = jl.concat_Ljava_lang_String__Ljava_lang_String___devirtual$(listString, carc2.cAtomLabel[atomicNo]);
    }
    return listString;
  };
  _.getAtomMapNo_0 = function getAtomMapNo(atom) {
    return $wnd.Math.abs(this.mAtomMapNo[atom]);
  };
  _.getAtomMass_0 = function getAtomMass(atom) {
    return this.mAtomMass[atom];
  };
  _.getAtomParity_0 = function getAtomParity(atom) {
    return this.mAtomFlags[atom] & 3;
  };
  _.getAtomQueryFeatures = function getAtomQueryFeatures(atom) {
    return this.mAtomQueryFeatures[atom];
  };
  _.getAtomRadical_0 = function getAtomRadical(atom) {
    return this.mAtomFlags[atom] & 48;
  };
  _.getAtomX_0 = function getAtomX_0(atom) {
    return this.mCoordinates[atom].x_0;
  };
  _.getAtomY_0 = function getAtomY_0(atom) {
    return this.mCoordinates[atom].y_0;
  };
  _.getAtomZ_0 = function getAtomZ(atom) {
    return this.mCoordinates[atom].z_0;
  };
  _.getAtomicNo_0 = function getAtomicNo(atom) {
    return this.mAtomicNo[atom];
  };
  _.getAverageBondLength_0 = function getAverageBondLength() {
    return this.getAverageBondLength_3(this.mAllAtoms, this.mAllBonds, carc2.sDefaultAVBL);
  };
  _.getAverageBondLength_1 = function getAverageBondLength_0(defaultBondLength) {
    return this.getAverageBondLength_3(this.mAllAtoms, this.mAllBonds, defaultBondLength);
  };
  _.getAverageBondLength_2 = function getAverageBondLength_1(atoms, bonds) {
    return this.getAverageBondLength_3(atoms, bonds, carc2.sDefaultAVBL);
  };
  _.getAverageBondLength_3 = function getAverageBondLength_2(atoms, bonds, defaultBondLength) {
    return this.getAverageBondLength_4(atoms, bonds, defaultBondLength, this.mCoordinates);
  };
  _.getAverageBondLength_4 = function getAverageBondLength_3(atoms, bonds, defaultBondLength, coords) {
    var atom1, atom2, avblSum, bond, bond0, bond1, considerMetalBonds, consideredBonds, distance, lowDistance;
    considerMetalBonds = false;
    consideredBonds = 0;
    for (bond0 = 0; bond0 < bonds; bond0++)
      if (this.mBondType[bond0] != 16 && (this.mBondQueryFeatures[bond0] & 130560) == 0)
        consideredBonds++;
    if (consideredBonds == 0) {
      for (bond1 = 0; bond1 < bonds; bond1++)
        if ((this.mBondQueryFeatures[bond1] & 130560) == 0)
          consideredBonds++;
      considerMetalBonds = true;
    }
    if (consideredBonds == 0) {
      if (atoms < 2)
        return defaultBondLength;
      lowDistance = 17976931348623157e292;
      for (atom1 = 1; atom1 < atoms; atom1++) {
        for (atom2 = 0; atom2 < atom1; atom2++) {
          distance = coords[atom1].distance(coords[atom2]);
          if (distance > 0 && distance < lowDistance)
            lowDistance = distance;
        }
      }
      return lowDistance != 17976931348623157e292 ? 0.6 * lowDistance : defaultBondLength;
    }
    avblSum = 0;
    for (bond = 0; bond < bonds; bond++) {
      if ((considerMetalBonds || this.mBondType[bond] != 16) && (this.mBondQueryFeatures[bond] & 130560) == 0)
        avblSum += coords[this.mBondAtom[1][bond]].distance(coords[this.mBondAtom[0][bond]]);
    }
    return avblSum / consideredBonds;
  };
  _.getBondAngle_0 = function getBondAngle(atom1, atom2) {
    return carc2.getAngle_0(this.mCoordinates[atom1].x_0, this.mCoordinates[atom1].y_0, this.mCoordinates[atom2].x_0, this.mCoordinates[atom2].y_0);
  };
  _.getBondAtom_0 = function getBondAtom(no, bond) {
    return this.mBondAtom[no][bond];
  };
  _.getBondBridgeMaxSize_0 = function getBondBridgeMaxSize(bond) {
    return ((this.mBondQueryFeatures[bond] & 7680) >> 9) + ((this.mBondQueryFeatures[bond] & 122880) >> 13);
  };
  _.getBondBridgeMinSize_0 = function getBondBridgeMinSize(bond) {
    return (this.mBondQueryFeatures[bond] & 7680) >> 9;
  };
  _.getBondCIPParity_0 = function getBondCIPParity(bond) {
    return (this.mBondFlags[bond] & 48) >> 4;
  };
  _.getBondESRGroup_0 = function getBondESRGroup(bond) {
    if (this.getBondESRType_0(bond) != 1 && this.getBondESRType_0(bond) != 2)
      return -1;
    else
      return (this.mBondFlags[bond] & 31744) >> 10;
  };
  _.getBondESRType_0 = function getBondESRType(bond) {
    return (this.mBondFlags[bond] & 768) >> 8;
  };
  _.getBondLength_0 = function getBondLength(bond) {
    var atom1, atom2, xdif, ydif;
    atom1 = this.mBondAtom[0][bond];
    atom2 = this.mBondAtom[1][bond];
    xdif = this.mCoordinates[atom2].x_0 - this.mCoordinates[atom1].x_0;
    ydif = this.mCoordinates[atom2].y_0 - this.mCoordinates[atom1].y_0;
    return $wnd.Math.sqrt(xdif * xdif + ydif * ydif);
  };
  _.getBondNo = function getBondNo(atm1, atm2) {
    var bnd;
    for (bnd = 0; bnd < this.mAllBonds; bnd++)
      if (this.mBondAtom[0][bnd] == atm1 && this.mBondAtom[1][bnd] == atm2 || this.mBondAtom[0][bnd] == atm2 && this.mBondAtom[1][bnd] == atm1) {
        if (this.mBondType[bnd] != 512)
          return bnd;
      }
    return -1;
  };
  _.getBondOrder_0 = function getBondOrder(bond) {
    if (this.mIsFragment && (this.mBondQueryFeatures[bond] & 127) != 0) {
      if ((this.mBondQueryFeatures[bond] & (1 | 8)) != 0)
        return 1;
      if ((this.mBondQueryFeatures[bond] & 2) != 0)
        return 2;
      if ((this.mBondQueryFeatures[bond] & 4) != 0)
        return 3;
      if ((this.mBondQueryFeatures[bond] & 32) != 0)
        return 4;
      if ((this.mBondQueryFeatures[bond] & 64) != 0)
        return 5;
      if ((this.mBondQueryFeatures[bond] & 16) != 0)
        return 0;
    }
    switch (this.mBondType[bond] & 127) {
      case 1:
      case 8:
        return 1;
      case 2:
        return 2;
      case 4:
        return 3;
      case 32:
        return 4;
      case 64:
        return 5;
      default:
        return 0;
    }
  };
  _.getBondParity_0 = function getBondParity(bnd) {
    return this.mBondFlags[bnd] & 3;
  };
  _.getBondQueryFeatures_0 = function getBondQueryFeatures(bnd) {
    return this.mBondQueryFeatures[bnd];
  };
  _.getBondType_0 = function getBondType(bond) {
    return this.mBondType[bond];
  };
  _.getBondTypeSimple_0 = function getBondTypeSimple(bond) {
    return this.mBondType[bond] & 127;
  };
  _.getBounds_0 = function getBounds(r) {
    var atom, x1, x2, y1, y2;
    if (this.mAllAtoms == 0)
      return null;
    x1 = this.mCoordinates[0].x_0;
    y1 = this.mCoordinates[0].y_0;
    x2 = this.mCoordinates[0].x_0;
    y2 = this.mCoordinates[0].y_0;
    for (atom = 1; atom < this.mAllAtoms; atom++) {
      if (x1 > this.mCoordinates[atom].x_0)
        x1 = this.mCoordinates[atom].x_0;
      else if (x2 < this.mCoordinates[atom].x_0)
        x2 = this.mCoordinates[atom].x_0;
      if (y1 > this.mCoordinates[atom].y_0)
        y1 = this.mCoordinates[atom].y_0;
      else if (y2 < this.mCoordinates[atom].y_0)
        y2 = this.mCoordinates[atom].y_0;
    }
    if (isNull(r)) {
      r = new cargg.GenericRectangle_0(x1, y1, x2 - x1, y2 - y1);
    } else {
      r.x_0 = x1;
      r.y_0 = y1;
      r.width_0 = x2 - x1;
      r.height_0 = y2 - y1;
    }
    return r;
  };
  _.getChirality_0 = function getChirality() {
    return this.mChirality;
  };
  _.getCoordinates = function getCoordinates(atom) {
    return this.mCoordinates[atom];
  };
  _.getDefaultMaxValenceUncharged_0 = function getDefaultMaxValenceUncharged(atom) {
    var valenceList;
    valenceList = this.mAtomicNo[atom] < carc2.cAtomValence.length ? carc2.cAtomValence[this.mAtomicNo[atom]] : null;
    return jsEquals(valenceList, null) ? 6 : valenceList[valenceList.length - 1];
  };
  _.getElectronValenceCorrection_0 = function getElectronValenceCorrection(atom, occupiedValence) {
    return this.getElectronValenceCorrection_1(atom, occupiedValence, this.mAtomicNo[atom]);
  };
  _.getElectronValenceCorrection_1 = function getElectronValenceCorrection_0(atom, occupiedValence, atomicNo) {
    var charge, correction;
    if (atomicNo >= 171 && atomicNo <= 190)
      return 0;
    correction = 0;
    if ((this.mAtomFlags[atom] & 48) == 32)
      correction -= 1;
    if ((this.mAtomFlags[atom] & 48) == 16 || (this.mAtomFlags[atom] & 48) == 48)
      correction -= 2;
    charge = this.mAtomCharge[atom];
    if (charge == 0 && this.mIsFragment) {
      if (eq(and_0(this.mAtomQueryFeatures[atom], 234881024), add_20(67108864, 134217728)))
        charge = -1;
      if (eq(and_0(this.mAtomQueryFeatures[atom], 234881024), add_20(67108864, 33554432)))
        charge = 1;
    }
    if (atomicNo == 7 || atomicNo == 8 || atomicNo == 9)
      correction += charge;
    else if (atomicNo == 6 || atomicNo == 14 || atomicNo == 32)
      correction -= $wnd.Math.abs(charge);
    else if (atomicNo == 15 || atomicNo == 33) {
      if (occupiedValence - correction - charge <= 3)
        correction += charge;
      else
        correction -= charge;
    } else if (atomicNo == 16 || atomicNo == 34 || atomicNo == 52) {
      if (occupiedValence - correction - charge <= 4)
        correction += charge;
      else
        correction -= $wnd.Math.abs(charge);
    } else if (atomicNo == 17 || atomicNo == 35 || atomicNo == 53) {
      if (occupiedValence - correction - charge <= 5)
        correction += charge;
      else
        correction -= $wnd.Math.abs(charge);
    } else {
      correction -= charge;
    }
    return correction;
  };
  _.getMaxAtoms_0 = function getMaxAtoms() {
    return this.mMaxAtoms;
  };
  _.getMaxBonds_0 = function getMaxBonds() {
    return this.mMaxBonds;
  };
  _.getMaxValence_0 = function getMaxValence(atom) {
    var valence;
    valence = this.getMaxValenceUncharged_0(atom);
    return valence + this.getElectronValenceCorrection_0(atom, valence);
  };
  _.getMaxValenceUncharged_0 = function getMaxValenceUncharged(atom) {
    var valence;
    valence = this.getAtomAbnormalValence_0(atom);
    if (valence == -1)
      valence = this.getDefaultMaxValenceUncharged_0(atom);
    return valence;
  };
  _.getMaximumBondOrder = function getMaximumBondOrder(bond) {
    var atom, i, max_0, maxBondOrder;
    maxBondOrder = this.isTransitionMetalAtom(this.mBondAtom[0][bond]) || this.isTransitionMetalAtom(this.mBondAtom[1][bond]) ? 5 : 3;
    for (i = 0; i < 2; i++) {
      atom = this.mBondAtom[i][bond];
      max_0 = this.getBondOrder_0(bond) + this.getMaxValence_0(atom) - this.getOccupiedValence_0(atom);
      if (maxBondOrder > max_0)
        maxBondOrder = max_0;
    }
    return maxBondOrder;
  };
  _.getMoleculeColor_0 = function getMoleculeColor() {
    return this.mMoleculeColor;
  };
  _.getName_0 = function getName_0() {
    return this.mName;
  };
  _.getOccupiedValence_0 = function getOccupiedValence(atom) {
    return this.simpleGetValence(atom);
  };
  _.getStereoProblem_0 = function getStereoProblem(atom) {
    return (this.mAtomFlags[atom] & 65536) != 0;
  };
  _.incrementBondOrder = function incrementBondOrder(bond) {
    var hasMetal, maxBondOrder, startBond;
    maxBondOrder = this.getMaximumBondOrder(bond);
    hasMetal = this.isMetalAtom_0(this.mBondAtom[0][bond]) || this.isMetalAtom_0(this.mBondAtom[1][bond]);
    startBond = hasMetal ? 16 : 1;
    if (this.mBondType[bond] == 64) {
      this.mBondType[bond] = startBond;
      this.mValidHelperArrays = 0;
      return true;
    }
    if (this.mBondType[bond] == 32) {
      this.mBondType[bond] = maxBondOrder > 4 ? 64 : startBond;
      this.mValidHelperArrays = 0;
      return true;
    }
    if (this.mBondType[bond] == 4) {
      this.mBondType[bond] = maxBondOrder > 3 ? 32 : startBond;
      this.mValidHelperArrays = 0;
      return true;
    }
    if (this.mBondType[bond] == 2) {
      this.mBondType[bond] = 386;
      this.mValidHelperArrays &= 7;
      if ((this.mBondFlags[bond] & 128) == 0)
        return true;
    }
    if (this.mBondType[bond] == 386) {
      if (maxBondOrder > 2)
        this.mBondType[bond] = 4;
      else
        this.mBondType[bond] = startBond;
      this.mValidHelperArrays = 0;
      return true;
    }
    if ((384 & this.mBondType[bond]) != 0) {
      this.mBondType[bond] = 1;
      this.mValidHelperArrays &= 7;
      return true;
    }
    if (!hasMetal && maxBondOrder < 2)
      return false;
    if (this.mBondType[bond] == 1) {
      this.mBondType[bond] = 2;
      this.mValidHelperArrays = 0;
      return true;
    }
    if (maxBondOrder < 1)
      return false;
    if (this.mBondType[bond] == 16) {
      this.mBondType[bond] = 1;
      this.mValidHelperArrays = 0;
      return true;
    }
    return false;
  };
  _.init_1 = function init_1() {
    var i;
    this.mValidHelperArrays = 0;
    this.mAtomicNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMaxAtoms, 15, 1);
    this.mAtomCharge = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMaxAtoms, 15, 1);
    this.mAtomMapNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMaxAtoms, 15, 1);
    this.mCoordinates = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_Coordinates_2_classLit, { 151: 1, 4: 1, 1: 1, 7: 1 }, 33, this.mMaxAtoms, 0, 1);
    for (i = 0; i < this.mMaxAtoms; i++)
      this.mCoordinates[i] = new carc2.Coordinates_0();
    this.mAtomMass = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMaxAtoms, 15, 1);
    this.mAtomFlags = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMaxAtoms, 15, 1);
    this.mAtomQueryFeatures = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, this.mMaxAtoms, 14, 1);
    this.mAtomList = null;
    this.mAtomCustomLabel = null;
    this.mBondAtom = initMultidimensionalArray(cggl.I_classLit, [{ 25: 1, 4: 1, 1: 1, 7: 1 }, { 6: 1, 4: 1, 1: 1 }], [6, 5], 15, [2, this.mMaxBonds], 2);
    this.mBondType = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMaxBonds, 15, 1);
    this.mBondFlags = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMaxBonds, 15, 1);
    this.mBondQueryFeatures = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMaxBonds, 15, 1);
  };
  _.invalidateHelperArrays_0 = function invalidateHelperArrays(helperBits) {
    this.mValidHelperArrays &= ~helperBits;
  };
  _.is3D_0 = function is3D() {
    var atom;
    for (atom = 0; atom < this.mAllAtoms; atom++)
      if (this.mCoordinates[atom].z_0 != 0)
        return true;
    return false;
  };
  _.isAtomConfigurationUnknown_0 = function isAtomConfigurationUnknown(atom) {
    return (this.mAtomFlags[atom] & 33554432) != 0;
  };
  _.isAtomMarkedForDeletion_0 = function isAtomMarkedForDeletion(atom) {
    return this.mAtomicNo[atom] == -1;
  };
  _.isAtomParityPseudo_0 = function isAtomParityPseudo(atom) {
    return (this.mAtomFlags[atom] & 4) != 0;
  };
  _.isAtomStereoCenter_0 = function isAtomStereoCenter(atom) {
    return (this.mAtomFlags[atom] & 67108864) != 0;
  };
  _.isAutoMappedAtom_0 = function isAutoMappedAtom(atom) {
    return this.mAtomMapNo[atom] < 0;
  };
  _.isBondBackgroundHilited_0 = function isBondBackgroundHilited(bond) {
    return (this.mBondFlags[bond] & 32768) != 0;
  };
  _.isBondBridge_0 = function isBondBridge(bond) {
    return (this.mBondQueryFeatures[bond] & 130560) != 0;
  };
  _.isBondForegroundHilited_0 = function isBondForegroundHilited(bond) {
    return (this.mBondFlags[bond] & 65536) != 0;
  };
  _.isBondMarkedForDeletion_0 = function isBondMarkedForDeletion(bond) {
    return this.mBondType[bond] == 512;
  };
  _.isBondParityPseudo_0 = function isBondParityPseudo(bond) {
    return (this.mBondFlags[bond] & 4) != 0;
  };
  _.isBondParityUnknownOrNone_0 = function isBondParityUnknownOrNone(bond) {
    return (this.mBondFlags[bond] & 131072) != 0;
  };
  _.isDelocalizedBond_0 = function isDelocalizedBond_0(bond) {
    return this.mBondType[bond] == 8;
  };
  _.isElectronegative_0 = function isElectronegative(atom) {
    var atomicNo, atomicNo$array, atomicNo$index, atomicNo$max;
    if (this.mIsFragment) {
      if (neq(and_0(this.mAtomQueryFeatures[atom], 1), 0))
        return false;
      if (jsNotEquals(this.mAtomList, null) && jsNotEquals(this.mAtomList[atom], null))
        for (atomicNo$array = this.mAtomList[atom], atomicNo$index = 0, atomicNo$max = atomicNo$array.length; atomicNo$index < atomicNo$max; ++atomicNo$index) {
          atomicNo = atomicNo$array[atomicNo$index];
          if (!carc2.isAtomicNoElectronegative(atomicNo))
            return false;
        }
    }
    return carc2.isAtomicNoElectronegative(this.mAtomicNo[atom]);
  };
  _.isElectropositive_0 = function isElectropositive(atom) {
    var atomicNo, atomicNo$array, atomicNo$index, atomicNo$max;
    if (this.mIsFragment) {
      if (neq(and_0(this.mAtomQueryFeatures[atom], 1), 0))
        return false;
      if (jsNotEquals(this.mAtomList, null) && jsNotEquals(this.mAtomList[atom], null))
        for (atomicNo$array = this.mAtomList[atom], atomicNo$index = 0, atomicNo$max = atomicNo$array.length; atomicNo$index < atomicNo$max; ++atomicNo$index) {
          atomicNo = atomicNo$array[atomicNo$index];
          if (!carc2.isAtomicNoElectropositive(atomicNo))
            return false;
        }
    }
    return carc2.isAtomicNoElectropositive(this.mAtomicNo[atom]);
  };
  _.isExcludeGroupAtom = function isExcludeGroupAtom(atom) {
    return neq(and_0(this.mAtomQueryFeatures[atom], 536870912), 0);
  };
  _.isFragment_0 = function isFragment_1() {
    return this.mIsFragment;
  };
  _.isMarkedAtom_0 = function isMarkedAtom(atom) {
    return (this.mAtomFlags[atom] & 131072) != 0;
  };
  _.isMetalAtom_0 = function isMetalAtom(atom) {
    var atomicNo, atomicNo$array, atomicNo$index, atomicNo$max;
    if (this.mIsFragment) {
      if (neq(and_0(this.mAtomQueryFeatures[atom], 1), 0))
        return false;
      if (jsNotEquals(this.mAtomList, null) && jsNotEquals(this.mAtomList[atom], null))
        for (atomicNo$array = this.mAtomList[atom], atomicNo$index = 0, atomicNo$max = atomicNo$array.length; atomicNo$index < atomicNo$max; ++atomicNo$index) {
          atomicNo = atomicNo$array[atomicNo$index];
          if (!carc2.isAtomicNoMetal(atomicNo))
            return false;
        }
    }
    return carc2.isAtomicNoMetal(this.mAtomicNo[atom]);
  };
  _.isNaturalAbundance_0 = function isNaturalAbundance(atom) {
    return this.mAtomMass[atom] == 0;
  };
  _.isOrganicAtom_0 = function isOrganicAtom(atom) {
    var atomicNo, atomicNo$array, atomicNo$index, atomicNo$max;
    if (this.mIsFragment) {
      if (neq(and_0(this.mAtomQueryFeatures[atom], 1), 0))
        return false;
      if (jsNotEquals(this.mAtomList, null) && jsNotEquals(this.mAtomList[atom], null))
        for (atomicNo$array = this.mAtomList[atom], atomicNo$index = 0, atomicNo$max = atomicNo$array.length; atomicNo$index < atomicNo$max; ++atomicNo$index) {
          atomicNo = atomicNo$array[atomicNo$index];
          if (!carc2.isAtomicNoOrganic(atomicNo))
            return false;
        }
    }
    return carc2.isAtomicNoOrganic(this.mAtomicNo[atom]);
  };
  _.isPurelyOrganic_0 = function isPurelyOrganic() {
    var atom;
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      switch (this.mAtomicNo[atom]) {
        case 1:
        case 5:
        case 6:
        case 7:
        case 8:
        case 9:
        case 14:
        case 15:
        case 16:
        case 17:
        case 33:
        case 34:
        case 35:
        case 52:
        case 53:
          continue;
        default:
          return false;
      }
    }
    return true;
  };
  _.isSelectedAtom_0 = function isSelectedAtom(atom) {
    return (this.mAtomFlags[atom] & 512) != 0;
  };
  _.isSelectedBond_0 = function isSelectedBond(bond) {
    return (this.mAtomFlags[this.mBondAtom[0][bond]] & this.mAtomFlags[this.mBondAtom[1][bond]] & 512) != 0;
  };
  _.isStereoBond_0 = function isStereoBond(bond) {
    return this.mBondType[bond] == 257 || this.mBondType[bond] == 129;
  };
  _.isStereoBond_1 = function isStereoBond_0(bond, atom) {
    return (this.mBondType[bond] == 257 || this.mBondType[bond] == 129) && this.mBondAtom[0][bond] == atom;
  };
  _.isTransitionMetalAtom = function isTransitionMetalAtom(atom) {
    var atomicNo, atomicNo$array, atomicNo$index, atomicNo$max;
    if (this.mIsFragment) {
      if (neq(and_0(this.mAtomQueryFeatures[atom], 1), 0))
        return false;
      if (jsNotEquals(this.mAtomList, null) && jsNotEquals(this.mAtomList[atom], null))
        for (atomicNo$array = this.mAtomList[atom], atomicNo$index = 0, atomicNo$max = atomicNo$array.length; atomicNo$index < atomicNo$max; ++atomicNo$index) {
          atomicNo = atomicNo$array[atomicNo$index];
          if (!carc2.isAtomicNoTransitionMetal(atomicNo))
            return false;
        }
    }
    return carc2.isAtomicNoTransitionMetal(this.mAtomicNo[atom]);
  };
  _.markAtomForDeletion_0 = function markAtomForDeletion(atom) {
    this.mAtomicNo[atom] = -1;
  };
  _.markBondForDeletion_0 = function markBondForDeletion(bond) {
    this.mBondType[bond] = 512;
  };
  _.polygon = function polygon_0(atom, bonds, endAtm, aromatic, actlAngle, angleChange, bondLength) {
    var actlAtm, bnd, dblBnd, i, newx, newy, remoteAtm, step, xdiff, ydiff;
    if (atom != endAtm) {
      xdiff = this.mCoordinates[atom].x_0 - this.mCoordinates[endAtm].x_0;
      ydiff = this.mCoordinates[atom].y_0 - this.mCoordinates[endAtm].y_0;
      bondLength = $wnd.Math.sqrt(xdiff * xdiff + ydiff * ydiff);
    }
    actlAtm = atom;
    dblBnd = !(this.simpleGetValence(atom) == 3);
    for (step = 1; step < bonds; step++) {
      newx = this.mCoordinates[actlAtm].x_0 + bondLength * $wnd.Math.sin(actlAngle);
      newy = this.mCoordinates[actlAtm].y_0 + bondLength * $wnd.Math.cos(actlAngle);
      remoteAtm = -1;
      for (i = 0; i < this.mAllAtoms; i++) {
        if ($wnd.Math.abs(newx - this.mCoordinates[i].x_0) < 4 && $wnd.Math.abs(newy - this.mCoordinates[i].y_0) < 4) {
          remoteAtm = i;
          break;
        }
      }
      if (remoteAtm == -1) {
        remoteAtm = this.addAtom_0(newx, newy);
        this.mCoordinates[remoteAtm].x_0 = newx;
        this.mCoordinates[remoteAtm].y_0 = newy;
        this.mCoordinates[remoteAtm].z_0 = 0;
      }
      bnd = this.getBondNo(actlAtm, remoteAtm);
      if (bnd == -1) {
        bnd = this.addBond_1(actlAtm, remoteAtm, this.suggestBondType_0(actlAtm, remoteAtm));
        if (aromatic) {
          if (dblBnd) {
            if (this.simpleGetValence(this.mBondAtom[0][bnd]) < 4 && this.simpleGetValence(this.mBondAtom[1][bnd]) < 3)
              this.mBondType[bnd] = 2;
          }
          dblBnd = !dblBnd;
        }
      }
      actlAtm = remoteAtm;
      actlAngle += angleChange;
    }
    bnd = this.getBondNo(actlAtm, endAtm);
    if (bnd == -1)
      bnd = this.addBond_1(actlAtm, endAtm, this.suggestBondType_0(actlAtm, endAtm));
    if (aromatic) {
      if (dblBnd) {
        if (this.simpleGetValence(this.mBondAtom[0][bnd]) < 4 && this.simpleGetValence(this.mBondAtom[1][bnd]) < 4)
          this.mBondType[bnd] = 2;
      }
    }
  };
  _.qualifiesAsStereoBond = function qualifiesAsStereoBond(bond, atom) {
    var i, i0;
    if (this.getBondOrder_0(bond) != 1)
      return false;
    if ((this.mAtomFlags[atom] & 3) != 0)
      return true;
    for (i0 = 0; i0 < this.mAllBonds; i0++)
      if (i0 != bond && this.mBondType[i0] == 2 && (this.mBondAtom[0][i0] == atom && (this.mAtomFlags[this.mBondAtom[1][i0]] & 3) != 0 || this.mBondAtom[1][i0] == atom && (this.mAtomFlags[this.mBondAtom[0][i0]] & 3) != 0))
        return true;
    for (i = 0; i < this.mAllBonds; i++)
      if (i != bond && this.mBondType[i] == 1 && (this.mBondAtom[0][i] == atom || this.mBondAtom[1][i] == atom) && (this.mBondFlags[i] & 3) != 0)
        return true;
    return false;
  };
  _.removeAtomColors_0 = function removeAtomColors() {
    var i;
    for (i = 0; i < this.mAllAtoms; i++)
      this.mAtomFlags[i] &= ~448;
  };
  _.removeAtomCustomLabels_0 = function removeAtomCustomLabels() {
    this.mAtomCustomLabel = null;
  };
  _.removeAtomMarkers_0 = function removeAtomMarkers() {
    var i;
    for (i = 0; i < this.mAllAtoms; i++)
      this.mAtomFlags[i] &= ~131072;
  };
  _.removeAtomSelection_0 = function removeAtomSelection() {
    var i;
    for (i = 0; i < this.mAllAtoms; i++)
      this.mAtomFlags[i] &= ~512;
  };
  _.removeBondHiliting_0 = function removeBondHiliting() {
    var i;
    for (i = 0; i < this.mAllBonds; i++)
      this.mBondFlags[i] &= ~(32768 | 65536);
  };
  _.removeMappingNo = function removeMappingNo(mapNo) {
    var atom;
    for (atom = 0; atom < this.mAllAtoms; atom++)
      if ($wnd.Math.abs(this.mAtomMapNo[atom]) == $wnd.Math.abs(mapNo))
        this.mAtomMapNo[atom] = 0;
  };
  _.removeQueryFeatures_0 = function removeQueryFeatures() {
    var atom, atom0, bond, isChanged;
    isChanged = false;
    for (atom0 = 0; atom0 < this.mAllAtoms; atom0++) {
      if (this.isExcludeGroupAtom(atom0)) {
        this.markAtomForDeletion_0(atom0);
        isChanged = true;
      }
    }
    if (isChanged)
      this.deleteMarkedAtomsAndBonds_0();
    if (jsNotEquals(this.mAtomList, null)) {
      this.mAtomList = null;
      isChanged = true;
    }
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      if (neq(this.mAtomQueryFeatures[atom], 0)) {
        this.mAtomQueryFeatures[atom] = 0;
        isChanged = true;
      }
    }
    for (bond = 0; bond < this.mAllBonds; bond++) {
      if (this.mBondQueryFeatures[bond] != 0) {
        this.mBondQueryFeatures[bond] = 0;
        isChanged = true;
      }
      if (this.mBondType[bond] == 8) {
        this.mBondType[bond] = 1;
        isChanged = true;
      }
    }
    if (isChanged)
      this.mValidHelperArrays = 0;
    return isChanged;
  };
  _.renumberESRGroups_0 = function renumberESRGroups(type_0) {
    var atom, atom0, bond, bond0, group, groupUsed, i, newGroup, newIndex;
    if (type_0 == 0)
      return 0;
    groupUsed = null;
    for (atom0 = 0; atom0 < this.mAllAtoms; atom0++) {
      if (this.getAtomESRType_0(atom0) == type_0) {
        if (jsEquals(groupUsed, null))
          groupUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, 32, 16, 1);
        groupUsed[this.getAtomESRGroup_0(atom0)] = true;
      }
    }
    for (bond0 = 0; bond0 < this.mAllBonds; bond0++) {
      if (this.getBondESRType_0(bond0) == type_0) {
        if (jsEquals(groupUsed, null))
          groupUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, 32, 16, 1);
        groupUsed[this.getBondESRGroup_0(bond0)] = true;
      }
    }
    newIndex = 0;
    if (jsNotEquals(groupUsed, null)) {
      newGroup = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 32, 15, 1);
      for (i = 0; i < 32; i++)
        if (groupUsed[i])
          newGroup[i] = newIndex++;
      for (atom = 0; atom < this.mAllAtoms; atom++) {
        if (this.getAtomESRType_0(atom) == type_0) {
          group = newGroup[this.getAtomESRGroup_0(atom)];
          this.mAtomFlags[atom] &= ~32505856;
          this.mAtomFlags[atom] |= group << 20;
        }
      }
      for (bond = 0; bond < this.mAllBonds; bond++) {
        if (this.getBondESRType_0(bond) == type_0) {
          group = newGroup[this.getBondESRGroup_0(bond)];
          this.mBondFlags[bond] &= ~31744;
          this.mBondFlags[bond] |= group << 10;
        }
      }
    }
    return newIndex;
  };
  _.scaleCoords_0 = function scaleCoords(f) {
    var i;
    for (i = 0; i < this.mAllAtoms; i++) {
      this.mCoordinates[i].x_0 *= f;
      this.mCoordinates[i].y_0 *= f;
    }
  };
  _.setAllAtoms_0 = function setAllAtoms(no) {
    this.mAllAtoms = no;
    this.mValidHelperArrays = 0;
  };
  _.setAllBonds_0 = function setAllBonds(no) {
    this.mAllBonds = no;
    this.mValidHelperArrays = 0;
  };
  _.setAtomAbnormalValence_0 = function setAtomAbnormalValence(atom, valence) {
    if (valence >= -1 && valence <= 14) {
      this.mAtomFlags[atom] &= ~2013265920;
      this.mAtomFlags[atom] |= 1 + valence << 27;
      if (this.mAtomicNo[atom] == 6) {
        if (valence == -1 || valence == 0 || valence == 2 || valence == 4) {
          this.mAtomFlags[atom] &= ~48;
          if (valence == 2)
            this.mAtomFlags[atom] |= 16;
        }
      }
    }
  };
  _.setAtomCIPParity_0 = function setAtomCIPParity(atom, parity) {
    this.mAtomFlags[atom] &= ~49152;
    this.mAtomFlags[atom] |= parity << 14;
  };
  _.setAtomCharge_0 = function setAtomCharge(atom, charge) {
    this.mAtomCharge[atom] = charge;
    this.mValidHelperArrays = 0;
  };
  _.setAtomColor_0 = function setAtomColor(atom, color_0) {
    this.mAtomFlags[atom] &= ~448;
    this.mAtomFlags[atom] |= color_0;
  };
  _.setAtomConfigurationUnknown_0 = function setAtomConfigurationUnknown(atom, u) {
    if (u)
      this.mAtomFlags[atom] |= 33554432;
    else
      this.mAtomFlags[atom] &= ~33554432;
    this.mValidHelperArrays &= 7;
  };
  _.setAtomCustomLabel_0 = function setAtomCustomLabel(atom, label_0) {
    var atomicNo;
    if (jsNotEquals(label_0, null)) {
      if (jl.length__I__devirtual$_0(label_0) == 0)
        label_0 = null;
      else {
        atomicNo = carc2.getAtomicNoFromLabel(label_0);
        if (atomicNo != 0 && atomicNo == this.mAtomicNo[atom] || jl.equals_Ljava_lang_Object__Z__devirtual$_2(label_0, "?")) {
          this.setAtomicNo_0(atom, atomicNo);
          label_0 = null;
        }
      }
    }
    if (jsEquals(label_0, null)) {
      if (jsNotEquals(this.mAtomCustomLabel, null))
        this.mAtomCustomLabel[atom] = null;
    } else {
      if (jsEquals(this.mAtomCustomLabel, null))
        this.mAtomCustomLabel = initUnidimensionalArray(cggl.B_classLit, { 68: 1, 4: 1, 1: 1, 7: 1 }, 8, this.mMaxAtoms, 0, 2);
      this.mAtomCustomLabel[atom] = jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$(label_0, (jnc.$clinit_StandardCharsets(), jnc.UTF_8));
    }
  };
  _.setAtomCustomLabel_1 = function setAtomCustomLabel_0(atom, label_0) {
    if (jsNotEquals(label_0, null) && label_0.length == 0)
      label_0 = null;
    if (jsEquals(label_0, null)) {
      if (jsNotEquals(this.mAtomCustomLabel, null))
        this.mAtomCustomLabel[atom] = null;
    } else {
      if (jsEquals(this.mAtomCustomLabel, null))
        this.mAtomCustomLabel = initUnidimensionalArray(cggl.B_classLit, { 68: 1, 4: 1, 1: 1, 7: 1 }, 8, this.mMaxAtoms, 0, 2);
      this.mAtomCustomLabel[atom] = label_0;
    }
  };
  _.setAtomESR_0 = function setAtomESR(atom, type_0, group) {
    var i, i0, maxGroup;
    if (type_0 == 0) {
      this.mAtomFlags[atom] &= ~33292288;
      this.mAtomFlags[atom] |= type_0 << 18;
    } else {
      if (group >= 32)
        return;
      if (group == -1) {
        maxGroup = -1;
        for (i0 = 0; i0 < this.mAllAtoms; i0++)
          if (i0 != atom && type_0 == this.getAtomESRType_0(i0) && maxGroup < this.getAtomESRGroup_0(i0))
            maxGroup = this.getAtomESRGroup_0(i0);
        for (i = 0; i < this.mAllBonds; i++)
          if (type_0 == this.getBondESRType_0(i) && maxGroup < this.getBondESRGroup_0(i))
            maxGroup = this.getBondESRGroup_0(i);
        group = maxGroup + 1;
        if (group >= 32)
          return;
      }
      this.mAtomFlags[atom] &= ~33292288;
      this.mAtomFlags[atom] |= type_0 << 18 | group << 20;
    }
    this.mValidHelperArrays &= 7;
  };
  _.setAtomList_0 = function setAtomList(atom, list) {
    if (jsEquals(this.mAtomList, null))
      this.mAtomList = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, this.mMaxAtoms, 0, 2);
    if (jsNotEquals(list, null))
      ju.sort_3(list);
    this.mAtomList[atom] = list;
    this.mValidHelperArrays = 0;
    this.mIsFragment = true;
  };
  _.setAtomList_1 = function setAtomList_0(atom, list, isExcludeList) {
    var atomicNo;
    if (jsEquals(list, null)) {
      if (jsNotEquals(this.mAtomList, null))
        this.mAtomList[atom] = null;
      return;
    }
    if (list.length == 1 && !isExcludeList) {
      atomicNo = list[0];
      if (this.mAtomicNo[atom] != atomicNo)
        this.changeAtom_0(atom, atomicNo, 0, -1, 0);
      if (jsNotEquals(this.mAtomList, null))
        this.mAtomList[atom] = null;
      return;
    }
    if (jsEquals(this.mAtomList, null))
      this.mAtomList = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, this.mMaxAtoms, 0, 2);
    this.mAtomList[atom] = list;
    if (isExcludeList)
      this.mAtomQueryFeatures[atom] = or_0(this.mAtomQueryFeatures[atom], 1);
    this.mValidHelperArrays = 0;
    this.mIsFragment = true;
  };
  _.setAtomMapNo_0 = function setAtomMapNo(atom, mapNo, autoMapped) {
    this.mAtomMapNo[atom] = autoMapped ? -mapNo : mapNo;
  };
  _.setAtomMarker_0 = function setAtomMarker(atom, s) {
    if (s)
      this.mAtomFlags[atom] |= 131072;
    else
      this.mAtomFlags[atom] &= ~131072;
  };
  _.setAtomMass_0 = function setAtomMass(atom, mass) {
    this.mAtomMass[atom] = mass;
    this.mValidHelperArrays &= this.mAtomicNo[atom] == 1 ? 0 : 7;
  };
  _.setAtomParity_0 = function setAtomParity(atom, parity, isPseudo) {
    this.mAtomFlags[atom] &= ~(3 | 4);
    if (parity != 3)
      this.mAtomFlags[atom] &= ~33554432;
    this.mAtomFlags[atom] |= parity;
    if (isPseudo)
      this.mAtomFlags[atom] |= 4;
  };
  _.setAtomQueryFeature_0 = function setAtomQueryFeature(atom, feature, value_0) {
    if (value_0)
      this.mAtomQueryFeatures[atom] = or_0(this.mAtomQueryFeatures[atom], feature);
    else
      this.mAtomQueryFeatures[atom] = and_0(this.mAtomQueryFeatures[atom], not_0(feature));
    this.mValidHelperArrays = 0;
    this.mIsFragment = true;
  };
  _.setAtomRadical_0 = function setAtomRadical(atom, radical) {
    this.mAtomFlags[atom] &= ~48;
    this.mAtomFlags[atom] |= radical;
    this.mValidHelperArrays &= 7;
  };
  _.setAtomSelection_0 = function setAtomSelection(atom, s) {
    if (s)
      this.mAtomFlags[atom] |= 512;
    else
      this.mAtomFlags[atom] &= ~512;
  };
  _.setAtomStereoCenter = function setAtomStereoCenter(atom, isStereoCenter) {
    this.mAtomFlags[atom] &= ~67108864;
    if (isStereoCenter)
      this.mAtomFlags[atom] |= 67108864;
  };
  _.setAtomX_0 = function setAtomX(atom, x_0) {
    this.mCoordinates[atom].x_0 = x_0;
    this.mValidHelperArrays &= 7;
  };
  _.setAtomY_0 = function setAtomY(atom, y_0) {
    this.mCoordinates[atom].y_0 = y_0;
    this.mValidHelperArrays &= 7;
  };
  _.setAtomZ_0 = function setAtomZ(atom, z_0) {
    this.mCoordinates[atom].z_0 = z_0;
    this.mValidHelperArrays &= 7;
  };
  _.setAtomicNo_0 = function setAtomicNo(atom, no) {
    if (no >= 0 && no <= 190) {
      if (no == 151 || no == 152) {
        this.mAtomicNo[atom] = 1;
        this.mAtomMass[atom] = no - 149;
      } else {
        this.mAtomicNo[atom] = no;
        this.mAtomMass[atom] = 0;
      }
      this.mAtomFlags[atom] &= ~2013265920;
      this.mValidHelperArrays = 0;
    }
  };
  _.setBondAtom_0 = function setBondAtom(no, bond, atom) {
    this.mBondAtom[no][bond] = atom;
    this.mValidHelperArrays = 0;
  };
  _.setBondBackgroundHiliting_0 = function setBondBackgroundHiliting(bond, s) {
    if (s)
      this.mBondFlags[bond] |= 32768;
    else
      this.mBondFlags[bond] &= ~32768;
  };
  _.setBondCIPParity_0 = function setBondCIPParity(bond, parity) {
    this.mBondFlags[bond] &= ~48;
    this.mBondFlags[bond] |= parity << 4;
  };
  _.setBondESR_0 = function setBondESR(bond, type_0, group) {
    var i, i0, maxGroup;
    if (type_0 == 0) {
      this.mBondFlags[bond] &= ~32512;
      this.mBondFlags[bond] |= type_0 << 8;
    } else {
      if (group >= 32)
        return;
      if (group == -1) {
        maxGroup = -1;
        for (i0 = 0; i0 < this.mAllAtoms; i0++)
          if (type_0 == this.getAtomESRType_0(i0) && maxGroup < this.getAtomESRGroup_0(i0))
            maxGroup = this.getAtomESRGroup_0(i0);
        for (i = 0; i < this.mAllBonds; i++)
          if (i != bond && type_0 == this.getBondESRType_0(i) && maxGroup < this.getBondESRGroup_0(i))
            maxGroup = this.getBondESRGroup_0(i);
        group = maxGroup + 1;
        if (group >= 32)
          return;
      }
      this.mBondFlags[bond] &= ~32512;
      this.mBondFlags[bond] |= type_0 << 8 | group << 10;
    }
    this.mValidHelperArrays &= 7;
  };
  _.setBondForegroundHiliting_0 = function setBondForegroundHiliting(bond, s) {
    if (s)
      this.mBondFlags[bond] |= 65536;
    else
      this.mBondFlags[bond] &= ~65536;
  };
  _.setBondOrder_0 = function setBondOrder(bond, order) {
    this.mBondType[bond] = order == 1 ? 1 : order == 2 ? 2 : order == 3 ? 4 : 16;
    this.mValidHelperArrays = 0;
  };
  _.setBondParity_0 = function setBondParity(bond, parity, isPseudo) {
    this.mBondFlags[bond] &= ~(3 | 4 | 131072);
    this.mBondFlags[bond] |= parity;
    if (isPseudo)
      this.mBondFlags[bond] |= 4;
  };
  _.setBondParityUnknownOrNone_0 = function setBondParityUnknownOrNone(bond) {
    this.mBondFlags[bond] |= 131072;
  };
  _.setBondQueryFeature_0 = function setBondQueryFeature(bond, feature, value_0) {
    if (value_0)
      this.mBondQueryFeatures[bond] |= feature;
    else
      this.mBondQueryFeatures[bond] &= ~feature;
    this.mValidHelperArrays = 0;
    if (value_0 && feature != 0)
      this.mIsFragment = true;
  };
  _.setBondType_0 = function setBondType(bond, type_0) {
    this.mBondType[bond] = type_0;
    this.mValidHelperArrays = 0;
  };
  _.setChirality_0 = function setChirality(c) {
    this.mChirality = c;
  };
  _.setFragment_0 = function setFragment(isFragment) {
    if (this.mIsFragment != isFragment) {
      this.mIsFragment = isFragment;
      if (!isFragment)
        this.removeQueryFeatures_0();
      this.mValidHelperArrays = 0;
    }
  };
  _.setHelperValidity_0 = function setHelperValidity(helperValidity) {
    this.mValidHelperArrays = helperValidity;
  };
  _.setHydrogenProtection_0 = function setHydrogenProtection(protectHydrogen) {
    this.mProtectHydrogen = protectHydrogen;
  };
  _.setMaxAtoms_0 = function setMaxAtoms(v) {
    var i, orig;
    this.mAtomicNo = carc2.copyOf(this.mAtomicNo, v);
    this.mAtomCharge = carc2.copyOf(this.mAtomCharge, v);
    this.mAtomMapNo = carc2.copyOf(this.mAtomMapNo, v);
    orig = this.mCoordinates.length;
    this.mCoordinates = carc2.copyOf_1(this.mCoordinates, v);
    for (i = orig; i < v; i++)
      this.mCoordinates[i] = new carc2.Coordinates_0();
    this.mAtomMass = carc2.copyOf(this.mAtomMass, v);
    this.mAtomFlags = carc2.copyOf(this.mAtomFlags, v);
    this.mAtomQueryFeatures = carc2.copyOf_0(this.mAtomQueryFeatures, v);
    if (jsNotEquals(this.mAtomList, null))
      this.mAtomList = carc2.copyOf_3(this.mAtomList, v);
    if (jsNotEquals(this.mAtomCustomLabel, null))
      this.mAtomCustomLabel = carc2.copyOf_2(this.mAtomCustomLabel, v);
    this.mMaxAtoms = v;
  };
  _.setMaxBonds_0 = function setMaxBonds(v) {
    this.mBondAtom[0] = carc2.copyOf(this.mBondAtom[0], v);
    this.mBondAtom[1] = carc2.copyOf(this.mBondAtom[1], v);
    this.mBondType = carc2.copyOf(this.mBondType, v);
    this.mBondFlags = carc2.copyOf(this.mBondFlags, v);
    this.mBondQueryFeatures = carc2.copyOf(this.mBondQueryFeatures, v);
    this.mMaxBonds = v;
  };
  _.setMoleculeColor_0 = function setMoleculeColor(color_0) {
    this.mMoleculeColor = color_0;
  };
  _.setName_0 = function setName(name_0) {
    this.mName = name_0;
  };
  _.setStereoProblem = function setStereoProblem(atom) {
    this.mAtomFlags[atom] |= 65536;
  };
  _.setToRacemate_0 = function setToRacemate() {
    this.mIsRacemate = true;
  };
  _.simpleGetValence = function simpleGetValence(atom) {
    var bnd, val;
    val = 0;
    for (bnd = 0; bnd < this.mAllBonds; bnd++)
      if (this.mBondAtom[0][bnd] == atom || this.mBondAtom[1][bnd] == atom)
        val += this.getBondOrder_0(bnd);
    return val;
  };
  _.stripIsotopInfo_0 = function stripIsotopInfo() {
    var atom, found, hydrogenIsotopFound;
    found = false;
    hydrogenIsotopFound = false;
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      if (this.mAtomMass[atom] != 0) {
        this.mAtomMass[atom] = 0;
        found = true;
        if (this.mAtomicNo[atom] == 1)
          hydrogenIsotopFound = true;
      }
    }
    if (hydrogenIsotopFound)
      this.mValidHelperArrays = 0;
    return found;
  };
  _.suggestBondType_0 = function suggestBondType(atom1, atom2) {
    return this.isMetalAtom_0(atom1) || this.isMetalAtom_0(atom2) ? 16 : 1;
  };
  _.swapAtoms_0 = function swapAtoms(atom1, atom2) {
    var bond, i, tempCoords, tempInt, tempList, tempLong;
    tempInt = this.mAtomicNo[atom1];
    this.mAtomicNo[atom1] = this.mAtomicNo[atom2];
    this.mAtomicNo[atom2] = tempInt;
    tempInt = this.mAtomCharge[atom1];
    this.mAtomCharge[atom1] = this.mAtomCharge[atom2];
    this.mAtomCharge[atom2] = tempInt;
    tempInt = this.mAtomMass[atom1];
    this.mAtomMass[atom1] = this.mAtomMass[atom2];
    this.mAtomMass[atom2] = tempInt;
    tempInt = this.mAtomFlags[atom1];
    this.mAtomFlags[atom1] = this.mAtomFlags[atom2];
    this.mAtomFlags[atom2] = tempInt;
    tempLong = this.mAtomQueryFeatures[atom1];
    this.mAtomQueryFeatures[atom1] = this.mAtomQueryFeatures[atom2];
    this.mAtomQueryFeatures[atom2] = tempLong;
    tempInt = this.mAtomMapNo[atom1];
    this.mAtomMapNo[atom1] = this.mAtomMapNo[atom2];
    this.mAtomMapNo[atom2] = tempInt;
    tempCoords = this.mCoordinates[atom1];
    this.mCoordinates[atom1] = this.mCoordinates[atom2];
    this.mCoordinates[atom2] = tempCoords;
    if (jsNotEquals(this.mAtomList, null)) {
      tempList = this.mAtomList[atom1];
      this.mAtomList[atom1] = this.mAtomList[atom2];
      this.mAtomList[atom2] = tempList;
    }
    if (jsNotEquals(this.mAtomCustomLabel, null)) {
      tempList = this.mAtomCustomLabel[atom1];
      this.mAtomCustomLabel[atom1] = this.mAtomCustomLabel[atom2];
      this.mAtomCustomLabel[atom2] = tempList;
    }
    for (bond = 0; bond < this.mAllBonds; bond++) {
      for (i = 0; i < 2; i++) {
        if (this.mBondAtom[i][bond] == atom1)
          this.mBondAtom[i][bond] = atom2;
        else if (this.mBondAtom[i][bond] == atom2)
          this.mBondAtom[i][bond] = atom1;
      }
    }
    this.mValidHelperArrays = 0;
  };
  _.swapBonds_0 = function swapBonds(bond1, bond2) {
    var temp;
    temp = this.mBondAtom[0][bond1];
    this.mBondAtom[0][bond1] = this.mBondAtom[0][bond2];
    this.mBondAtom[0][bond2] = temp;
    temp = this.mBondAtom[1][bond1];
    this.mBondAtom[1][bond1] = this.mBondAtom[1][bond2];
    this.mBondAtom[1][bond2] = temp;
    temp = this.mBondType[bond1];
    this.mBondType[bond1] = this.mBondType[bond2];
    this.mBondType[bond2] = temp;
    temp = this.mBondFlags[bond1];
    this.mBondFlags[bond1] = this.mBondFlags[bond2];
    this.mBondFlags[bond2] = temp;
    temp = this.mBondQueryFeatures[bond1];
    this.mBondQueryFeatures[bond1] = this.mBondQueryFeatures[bond2];
    this.mBondQueryFeatures[bond2] = temp;
    this.mValidHelperArrays = 0;
  };
  _.translateCoords_0 = function translateCoords(dx, dy) {
    var i;
    for (i = 0; i < this.mAllAtoms; i++) {
      this.mCoordinates[i].x_0 += dx;
      this.mCoordinates[i].y_0 += dy;
    }
    this.mZoomRotationX += dx;
    this.mZoomRotationY += dy;
  };
  _.validateBondType = function validateBondType(bond, type_0) {
    var maxBondOrder, simpleType;
    simpleType = type_0 & 127;
    maxBondOrder = this.getMaximumBondOrder(bond);
    switch (simpleType) {
      case 1:
      case 8:
        return maxBondOrder >= 1;
      case 2:
        return maxBondOrder >= 2;
      case 4:
        return maxBondOrder >= 3;
      case 32:
        return maxBondOrder >= 4;
      case 64:
        return maxBondOrder >= 5;
      case 16:
        return true;
      default:
        return false;
    }
  };
  _.zoomAndRotate_1 = function zoomAndRotate_0(zoom, angle, selected) {
    var atom, newAngle, newDistance;
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      if (!selected || this.isSelectedAtom_0(atom)) {
        newDistance = this.mOriginalDistance[atom] * zoom;
        newAngle = this.mOriginalAngle[atom] - angle;
        this.mCoordinates[atom].x_0 = this.mZoomRotationX + newDistance * $wnd.Math.sin(newAngle);
        this.mCoordinates[atom].y_0 = this.mZoomRotationY + newDistance * $wnd.Math.cos(newAngle);
      }
    }
    if (selected)
      this.mValidHelperArrays &= 7;
  };
  _.zoomAndRotateInit_0 = function zoomAndRotateInit_0(x_0, y_0) {
    var atom, dx, dy;
    this.mZoomRotationX = x_0;
    this.mZoomRotationY = y_0;
    this.mOriginalAngle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    this.mOriginalDistance = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      dx = x_0 - this.mCoordinates[atom].x_0;
      dy = y_0 - this.mCoordinates[atom].y_0;
      this.mOriginalDistance[atom] = $wnd.Math.sqrt(dx * dx + dy * dy);
      this.mOriginalAngle[atom] = carc2.getAngle_0(x_0, y_0, this.mCoordinates[atom].x_0, this.mCoordinates[atom].y_0);
    }
  };
  _.mAllAtoms = 0;
  _.mAllBonds = 0;
  _.mChirality = 0;
  _.mIsFragment = false;
  _.mIsRacemate = false;
  _.mMaxAtoms = 0;
  _.mMaxBonds = 0;
  _.mMoleculeColor = 0;
  _.mProtectHydrogen = false;
  _.mValidHelperArrays = 0;
  _.mZoomRotationX = 0;
  _.mZoomRotationY = 0;
  carc2.cAtomCIPParityNone = 0;
  carc2.cAtomCIPParityProblem = 3;
  carc2.cAtomCIPParityRorM = 1;
  carc2.cAtomCIPParitySorP = 2;
  carc2.cAtomColorBlue = 64;
  carc2.cAtomColorDarkGreen = 384;
  carc2.cAtomColorDarkRed = 448;
  carc2.cAtomColorGreen = 192;
  carc2.cAtomColorMagenta = 256;
  carc2.cAtomColorNone = 0;
  carc2.cAtomColorOrange = 320;
  carc2.cAtomColorRed = 128;
  carc2.cAtomFlagAllylic = 4096;
  carc2.cAtomFlagConfigurationUnknown = 33554432;
  carc2.cAtomFlagIsStereoCenter = 67108864;
  carc2.cAtomFlagMarked = 131072;
  carc2.cAtomFlagSelected = 512;
  carc2.cAtomFlagSmallRing = 8;
  carc2.cAtomFlagStabilized = 8192;
  carc2.cAtomFlagStereoProblem = 65536;
  carc2.cAtomFlags2RingBonds = 1024;
  carc2.cAtomFlags3RingBonds = 2048;
  carc2.cAtomFlags4RingBonds = 3072;
  carc2.cAtomFlagsCIPParity = 49152;
  carc2.cAtomFlagsCIPParityShift = 14;
  carc2.cAtomFlagsColor = 448;
  carc2.cAtomFlagsESR = 33292288;
  carc2.cAtomFlagsESRGroup = 32505856;
  carc2.cAtomFlagsESRGroupShift = 20;
  carc2.cAtomFlagsESRType = 786432;
  carc2.cAtomFlagsESRTypeShift = 18;
  carc2.cAtomFlagsHelper = 0;
  carc2.cAtomFlagsHelper2 = 15368;
  carc2.cAtomFlagsHelper3 = 67223559;
  carc2.cAtomFlagsParity = 3;
  carc2.cAtomFlagsRingBonds = 3072;
  carc2.cAtomFlagsValence = 2013265920;
  carc2.cAtomFlagsValenceShift = 27;
  carc2.cAtomParity1 = 1;
  carc2.cAtomParity2 = 2;
  carc2.cAtomParityIsPseudo = 4;
  carc2.cAtomParityNone = 0;
  carc2.cAtomParityUnknown = 3;
  carc2.cAtomQFAny = 1;
  carc2.cAtomQFAromState = { l: 6, m: 0, h: 4 };
  carc2.cAtomQFAromStateBits = 2;
  carc2.cAtomQFAromStateShift = 1;
  carc2.cAtomQFAromatic = 2;
  carc2.cAtomQFCharge = 234881024;
  carc2.cAtomQFChargeBits = 3;
  carc2.cAtomQFChargeShift = 25;
  carc2.cAtomQFENeighbourBits = 5;
  carc2.cAtomQFENeighbourShift = 39;
  carc2.cAtomQFENeighbours = 17042430230528;
  carc2.cAtomQFExcludeGroup = 536870912;
  carc2.cAtomQFFlatNitrogen = 268435456;
  carc2.cAtomQFHeteroAromatic = { l: 0, m: 0, h: 4 };
  carc2.cAtomQFHydrogen = 1920;
  carc2.cAtomQFHydrogenBits = 4;
  carc2.cAtomQFHydrogenShift = 7;
  carc2.cAtomQFIsNotStereo = { l: 0, m: 0, h: 2 };
  carc2.cAtomQFIsStereo = { l: 0, m: 0, h: 1 };
  carc2.cAtomQFMatchStereo = 8192;
  carc2.cAtomQFMoreNeighbours = 4096;
  carc2.cAtomQFNarrowing = { l: 4194302, m: 4193343, h: 127 };
  carc2.cAtomQFNeighbourBits = 5;
  carc2.cAtomQFNeighbourShift = 17;
  carc2.cAtomQFNeighbours = 4063232;
  carc2.cAtomQFNewRingSize = 545460846592;
  carc2.cAtomQFNewRingSizeBits = 7;
  carc2.cAtomQFNewRingSizeShift = 32;
  carc2.cAtomQFNoMoreNeighbours = 2048;
  carc2.cAtomQFNoOfBits = 51;
  carc2.cAtomQFNot0ENeighbours = 549755813888;
  carc2.cAtomQFNot0Hydrogen = 128;
  carc2.cAtomQFNot0Neighbours = 131072;
  carc2.cAtomQFNot0PiElectrons = 16384;
  carc2.cAtomQFNot1ENeighbour = 1099511627776;
  carc2.cAtomQFNot1Hydrogen = 256;
  carc2.cAtomQFNot1Neighbour = 262144;
  carc2.cAtomQFNot1PiElectron = 32768;
  carc2.cAtomQFNot2ENeighbours = 2199023255552;
  carc2.cAtomQFNot2Hydrogen = 512;
  carc2.cAtomQFNot2Neighbours = 524288;
  carc2.cAtomQFNot2PiElectrons = 65536;
  carc2.cAtomQFNot2RingBonds = 16;
  carc2.cAtomQFNot3ENeighbours = 4398046511104;
  carc2.cAtomQFNot3Hydrogen = 1024;
  carc2.cAtomQFNot3Neighbours = 1048576;
  carc2.cAtomQFNot3RingBonds = 32;
  carc2.cAtomQFNot4ENeighbours = 8796093022208;
  carc2.cAtomQFNot4Neighbours = 2097152;
  carc2.cAtomQFNot4RingBonds = 64;
  carc2.cAtomQFNotAromatic = 4;
  carc2.cAtomQFNotChain = 8;
  carc2.cAtomQFNotCharge0 = 67108864;
  carc2.cAtomQFNotChargeNeg = 33554432;
  carc2.cAtomQFNotChargePos = 134217728;
  carc2.cAtomQFOxidationState = { l: 0, m: 0, h: 120 };
  carc2.cAtomQFOxidationStateBits = 4;
  carc2.cAtomQFOxidationStateOffset = 7;
  carc2.cAtomQFOxidationStateShift = 47;
  carc2.cAtomQFPiElectronBits = 3;
  carc2.cAtomQFPiElectronShift = 14;
  carc2.cAtomQFPiElectrons = 114688;
  carc2.cAtomQFRingSize0 = 4294967296;
  carc2.cAtomQFRingSize3 = 8589934592;
  carc2.cAtomQFRingSize4 = 17179869184;
  carc2.cAtomQFRingSize5 = 34359738368;
  carc2.cAtomQFRingSize6 = 68719476736;
  carc2.cAtomQFRingSize7 = 137438953472;
  carc2.cAtomQFRingSizeLarge = 274877906944;
  carc2.cAtomQFRingState = 120;
  carc2.cAtomQFRingStateBits = 4;
  carc2.cAtomQFRingStateShift = 3;
  carc2.cAtomQFRxnParityBits = 2;
  carc2.cAtomQFRxnParityHint = 3221225472;
  carc2.cAtomQFRxnParityInvert = 2147483648;
  carc2.cAtomQFRxnParityRacemize = 3221225472;
  carc2.cAtomQFRxnParityRetain = 1073741824;
  carc2.cAtomQFRxnParityShift = 30;
  carc2.cAtomQFSimpleFeatures = { l: 4179966, m: 4063288, h: 7 };
  carc2.cAtomQFSmallRingSize = 29360128;
  carc2.cAtomQFSmallRingSizeBits = 3;
  carc2.cAtomQFSmallRingSizeShift = 22;
  carc2.cAtomQFStereoState = { l: 0, m: 0, h: 3 };
  carc2.cAtomQFStereoStateBits = 2;
  carc2.cAtomQFStereoStateShift = 44;
  carc2.cAtomRadicalState = 48;
  carc2.cAtomRadicalStateD = 32;
  carc2.cAtomRadicalStateNone = 0;
  carc2.cAtomRadicalStateS = 16;
  carc2.cAtomRadicalStateShift = 4;
  carc2.cAtomRadicalStateT = 48;
  carc2.cBondCIPParityEorP = 1;
  carc2.cBondCIPParityNone = 0;
  carc2.cBondCIPParityProblem = 3;
  carc2.cBondCIPParityZorM = 2;
  carc2.cBondFlagBGHilited = 32768;
  carc2.cBondFlagFGHilited = 65536;
  carc2.cBondFlagRing = 64;
  carc2.cBondFlagSmallRing = 128;
  carc2.cBondFlagsCIPParity = 48;
  carc2.cBondFlagsCIPParityShift = 4;
  carc2.cBondFlagsESR = 32512;
  carc2.cBondFlagsESRGroup = 31744;
  carc2.cBondFlagsESRGroupShift = 10;
  carc2.cBondFlagsESRType = 768;
  carc2.cBondFlagsESRTypeShift = 8;
  carc2.cBondFlagsHelper2 = 704;
  carc2.cBondFlagsHelper3 = 63;
  carc2.cBondFlagsParity = 3;
  carc2.cBondParityEor1 = 1;
  carc2.cBondParityIsPseudo = 4;
  carc2.cBondParityNone = 0;
  carc2.cBondParityUnknown = 3;
  carc2.cBondParityUnknownOrNone = 131072;
  carc2.cBondParityZor2 = 2;
  carc2.cBondQFAllBondTypes = 0;
  carc2.cBondQFAllFeatures = 16777215;
  carc2.cBondQFAromState = 6291456;
  carc2.cBondQFAromStateBits = 2;
  carc2.cBondQFAromStateShift = 21;
  carc2.cBondQFAromatic = 2097152;
  carc2.cBondQFBondTypes = 31;
  carc2.cBondQFBondTypesBits = 5;
  carc2.cBondQFBondTypesShift = 0;
  carc2.cBondQFBridge = 130560;
  carc2.cBondQFBridgeBits = 8;
  carc2.cBondQFBridgeMin = 7680;
  carc2.cBondQFBridgeMinBits = 4;
  carc2.cBondQFBridgeMinShift = 9;
  carc2.cBondQFBridgeShift = 9;
  carc2.cBondQFBridgeSpan = 122880;
  carc2.cBondQFBridgeSpanBits = 4;
  carc2.cBondQFBridgeSpanShift = 13;
  carc2.cBondQFMatchFormalOrder = 8388608;
  carc2.cBondQFMatchStereo = 1048576;
  carc2.cBondQFNarrowing = 6291840;
  carc2.cBondQFNoOfBits = 23;
  carc2.cBondQFNotAromatic = 4194304;
  carc2.cBondQFNotRing = 128;
  carc2.cBondQFRareBondTypes = 96;
  carc2.cBondQFRareBondTypesBits = 2;
  carc2.cBondQFRareBondTypesShift = 5;
  carc2.cBondQFRing = 256;
  carc2.cBondQFRingSize = 917504;
  carc2.cBondQFRingSizeBits = 3;
  carc2.cBondQFRingSizeShift = 17;
  carc2.cBondQFRingState = 384;
  carc2.cBondQFRingStateBits = 2;
  carc2.cBondQFRingStateShift = 7;
  carc2.cBondQFSimpleFeatures = 6291967;
  carc2.cBondTypeCross = 386;
  carc2.cBondTypeDeleted = 512;
  carc2.cBondTypeDelocalized = 8;
  carc2.cBondTypeDouble = 2;
  carc2.cBondTypeDown = 129;
  carc2.cBondTypeIncreaseOrder = 511;
  carc2.cBondTypeMaskSimple = 127;
  carc2.cBondTypeMaskStereo = 384;
  carc2.cBondTypeMetalLigand = 16;
  carc2.cBondTypeQuadruple = 32;
  carc2.cBondTypeQuintuple = 64;
  carc2.cBondTypeSingle = 1;
  carc2.cBondTypeTriple = 4;
  carc2.cBondTypeUp = 257;
  carc2.cChiralityDiastereomers = 458752;
  carc2.cChiralityEpimers = 393216;
  carc2.cChiralityIsomerCountMask = 65535;
  carc2.cChiralityKnownEnantiomer = 262144;
  carc2.cChiralityMeso = 131072;
  carc2.cChiralityNotChiral = 65536;
  carc2.cChiralityRacemic = 196608;
  carc2.cChiralityUnknown = 0;
  carc2.cChiralityUnknownEnantiomer = 327680;
  carc2.cDefaultAVBL = 24;
  carc2.cDefaultAllowedPseudoAtoms = 0;
  carc2.cDefaultAtomValence = 6;
  carc2.cESRGroupBits = 5;
  carc2.cESRMaxGroups = 32;
  carc2.cESRTypeAbs = 0;
  carc2.cESRTypeAnd = 1;
  carc2.cESRTypeOr = 2;
  carc2.cHelperAll = 255;
  carc2.cHelperBitCIP = 16;
  carc2.cHelperBitIncludeNitrogenParities = 128;
  carc2.cHelperBitNeighbours = 1;
  carc2.cHelperBitParities = 8;
  carc2.cHelperBitRings = 4;
  carc2.cHelperBitRingsSimple = 2;
  carc2.cHelperBitSymmetrySimple = 32;
  carc2.cHelperBitSymmetryStereoHeterotopicity = 64;
  carc2.cHelperBitsStereo = 248;
  carc2.cHelperCIP = 0;
  carc2.cHelperNeighbours = 1;
  carc2.cHelperNone = 0;
  carc2.cHelperParities = 0;
  carc2.cHelperRings = 0;
  carc2.cHelperRingsSimple = 0;
  carc2.cHelperSymmetrySimple = 0;
  carc2.cHelperSymmetryStereoHeterotopicity = 0;
  carc2.cMaxAtomicNo = 190;
  carc2.cMoleculeColorDefault = 0;
  carc2.cMoleculeColorNeutral = 1;
  carc2.cPseudoAtomA = 16;
  carc2.cPseudoAtomAttachmentPoint = 256;
  carc2.cPseudoAtomPolymer = 128;
  carc2.cPseudoAtomR = 8;
  carc2.cPseudoAtomX = 32;
  carc2.cPseudoAtomsAGroups = 4;
  carc2.cPseudoAtomsAll = 511;
  carc2.cPseudoAtomsAminoAcids = 64;
  carc2.cPseudoAtomsHydrogenIsotops = 1;
  carc2.cPseudoAtomsRGroups = 2;
  carc2.sDefaultAVBL = 24;
  carc2.serialVersionUID_1 = 539103536;
  cggl.Lcom_actelion_research_chem_Molecule_2_classLit = createForClass("com.actelion.research.chem", "Molecule", 60, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_ExtendedMolecule = function $clinit_ExtendedMolecule() {
    carc2.$clinit_ExtendedMolecule = emptyMethod;
    carc2.$clinit_Molecule();
    carc2.FISCHER_PROJECTION_LIMIT = 3.141592653589793 / 36;
  };
  carc2.ExtendedMolecule = function ExtendedMolecule() {
    carc2.$clinit_ExtendedMolecule();
    carc2.Molecule.call(this);
    this.$init_30();
  };
  carc2.ExtendedMolecule_0 = function ExtendedMolecule_0(maxAtoms, maxBonds) {
    carc2.$clinit_ExtendedMolecule();
    carc2.Molecule_0.call(this, maxAtoms, maxBonds);
    this.$init_30();
  };
  carc2.ExtendedMolecule_1 = function ExtendedMolecule_1(mol) {
    carc2.$clinit_ExtendedMolecule();
    carc2.Molecule_0.call(this, isNull(mol) ? 256 : mol.getMaxAtoms_0(), isNull(mol) ? 256 : mol.getMaxBonds_0());
    this.$init_30();
    if (isNotNull(mol))
      mol.copyMolecule_0(this);
  };
  defineClass(150, 60, { 60: 1, 4: 1, 1: 1 });
  _.$init_30 = function $init_30() {
  };
  _.addFragment_0 = function addFragment(sourceMol, rootAtom, atomMap) {
    var bond, candidate, current, esrGroupCountAND, esrGroupCountOR, graphAtom, highest, i, isFragmentMember;
    sourceMol.ensureHelperArrays_0(1);
    if (jsEquals(atomMap, null))
      atomMap = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, sourceMol.mAllAtoms, 15, 1);
    esrGroupCountAND = this.renumberESRGroups_0(1);
    esrGroupCountOR = this.renumberESRGroups_0(2);
    isFragmentMember = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, sourceMol.mAllAtoms, 16, 1);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, sourceMol.mAllAtoms, 15, 1);
    graphAtom[0] = rootAtom;
    isFragmentMember[rootAtom] = true;
    atomMap[rootAtom] = sourceMol.copyAtom_0(this, rootAtom, esrGroupCountAND, esrGroupCountOR);
    current = 0;
    highest = 0;
    while (current <= highest) {
      for (i = 0; i < sourceMol.getAllConnAtoms_0(graphAtom[current]); i++) {
        candidate = sourceMol.mConnAtom[graphAtom[current]][i];
        if (!isFragmentMember[candidate]) {
          graphAtom[++highest] = candidate;
          isFragmentMember[candidate] = true;
          atomMap[candidate] = sourceMol.copyAtom_0(this, candidate, esrGroupCountAND, esrGroupCountOR);
        }
      }
      current++;
    }
    for (bond = 0; bond < sourceMol.mAllBonds; bond++)
      if (isFragmentMember[sourceMol.mBondAtom[0][bond]])
        sourceMol.copyBond_1(this, bond, esrGroupCountAND, esrGroupCountOR, atomMap, false);
    this.renumberESRGroups_0(1);
    this.renumberESRGroups_0(2);
    this.mValidHelperArrays = 0;
  };
  _.bondsAreParallel = function bondsAreParallel(angle1, angle2) {
    var angleDif;
    angleDif = $wnd.Math.abs(carc2.getAngleDif(angle1, angle2));
    return angleDif < 0.08 || angleDif > 3.141592653589793 - 0.08;
  };
  _.calculateNeighbours = function calculateNeighbours() {
    var allConnAtoms, atom, atom0, atom1, bnd, bnd0, bnd1, bnd2, connCount, i, metalBondFound, order;
    this.mConnAtoms = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    this.mAllConnAtoms = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    this.mConnAtom = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, this.mAllAtoms, 0, 2);
    this.mConnBond = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, this.mAllAtoms, 0, 2);
    this.mConnBondOrder = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, this.mAllAtoms, 0, 2);
    this.mPi = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAtoms, 15, 1);
    connCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    for (bnd0 = 0; bnd0 < this.mAllBonds; bnd0++) {
      connCount[this.mBondAtom[0][bnd0]]++;
      connCount[this.mBondAtom[1][bnd0]]++;
    }
    for (atom0 = 0; atom0 < this.mAllAtoms; atom0++) {
      this.mConnAtom[atom0] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, connCount[atom0], 15, 1);
      this.mConnBond[atom0] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, connCount[atom0], 15, 1);
      this.mConnBondOrder[atom0] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, connCount[atom0], 15, 1);
    }
    metalBondFound = false;
    for (bnd1 = 0; bnd1 < this.mBonds; bnd1++) {
      order = this.getBondOrder_0(bnd1);
      if (order == 0) {
        metalBondFound = true;
        continue;
      }
      for (i = 0; i < 2; i++) {
        atom = this.mBondAtom[i][bnd1];
        allConnAtoms = this.mAllConnAtoms[atom];
        this.mConnBondOrder[atom][allConnAtoms] = order;
        this.mConnAtom[atom][allConnAtoms] = this.mBondAtom[1 - i][bnd1];
        this.mConnBond[atom][allConnAtoms] = bnd1;
        this.mAllConnAtoms[atom]++;
        this.mConnAtoms[atom]++;
        if (atom < this.mAtoms) {
          if (order > 1)
            this.mPi[atom] += order - 1;
          else if (this.mBondType[bnd1] == 8)
            this.mPi[atom] = 1;
        }
      }
    }
    for (bnd2 = this.mBonds; bnd2 < this.mAllBonds; bnd2++) {
      order = this.getBondOrder_0(bnd2);
      if (order == 0) {
        metalBondFound = true;
        continue;
      }
      for (i = 0; i < 2; i++) {
        atom = this.mBondAtom[i][bnd2];
        allConnAtoms = this.mAllConnAtoms[atom];
        this.mConnBondOrder[atom][allConnAtoms] = order;
        this.mConnAtom[atom][allConnAtoms] = this.mBondAtom[1 - i][bnd2];
        this.mConnBond[atom][allConnAtoms] = bnd2;
        this.mAllConnAtoms[atom]++;
        if (this.mBondAtom[1 - i][bnd2] < this.mAtoms)
          this.mConnAtoms[atom]++;
      }
    }
    if (metalBondFound) {
      allConnAtoms = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
      for (atom1 = 0; atom1 < this.mAllAtoms; atom1++)
        allConnAtoms[atom1] = this.mAllConnAtoms[atom1];
      for (bnd = 0; bnd < this.mAllBonds; bnd++) {
        order = this.getBondOrder_0(bnd);
        if (order == 0) {
          for (i = 0; i < 2; i++) {
            atom = this.mBondAtom[i][bnd];
            this.mConnBondOrder[atom][allConnAtoms[atom]] = order;
            this.mConnAtom[atom][allConnAtoms[atom]] = this.mBondAtom[1 - i][bnd];
            this.mConnBond[atom][allConnAtoms[atom]] = bnd;
            allConnAtoms[atom]++;
          }
        }
      }
    }
  };
  _.canonizeCharge_0 = function canonizeCharge(allowUnbalancedCharge) {
    return this.canonizeCharge_1(allowUnbalancedCharge, false);
  };
  _.canonizeCharge_1 = function canonizeCharge_0(allowUnbalancedCharge, doNeutralize) {
    var atom, atom0, atom1, atom2, atom3, bond, bondOrder, chargeReduction, hasImplicitHydrogen, i, negativeAdjustableCharge, negativeAtom, negativeAtomCount, negativeChargeForRemoval, newStereoBond, oldBondType, overallCharge, overallChargeChange, positiveChargeForRemoval, stereoCenter;
    this.ensureHelperArrays_0(1);
    if (doNeutralize)
      allowUnbalancedCharge = true;
    for (bond = 0; bond < this.mAllBonds; bond++) {
      bondOrder = this.getBondOrder_0(bond);
      if (bondOrder == 1 || bondOrder == 2) {
        if (this.mAtomCharge[this.mBondAtom[0][bond]] > 0 && this.mAtomCharge[this.mBondAtom[1][bond]] < 0) {
          atom1 = this.mBondAtom[0][bond];
          atom2 = this.mBondAtom[1][bond];
        } else if (this.mAtomCharge[this.mBondAtom[0][bond]] < 0 && this.mAtomCharge[this.mBondAtom[1][bond]] > 0) {
          atom1 = this.mBondAtom[1][bond];
          atom2 = this.mBondAtom[0][bond];
        } else
          continue;
        if (this.isMetalAtom_0(atom1) || this.isMetalAtom_0(atom2))
          continue;
        if (this.mAtomicNo[atom1] < 9 && this.getOccupiedValence_0(atom1) > 3 || this.mAtomicNo[atom2] < 9 && this.getOccupiedValence_0(atom2) > 3)
          continue;
        hasImplicitHydrogen = this.getImplicitHydrogens_1(atom1) != 0;
        this.mAtomCharge[atom1] -= 1;
        this.mAtomCharge[atom2] += 1;
        if (!hasImplicitHydrogen) {
          oldBondType = this.mBondType[bond];
          if (bondOrder == 1)
            this.mBondType[bond] = 2;
          else
            this.mBondType[bond] = 4;
          if (oldBondType == 129 || oldBondType == 257) {
            stereoCenter = this.mBondAtom[0][bond];
            newStereoBond = this.preferredTHStereoBond(stereoCenter, false);
            if (this.mBondAtom[0][newStereoBond] != stereoCenter) {
              this.mBondAtom[1][newStereoBond] = this.mBondAtom[0][newStereoBond];
              this.mBondAtom[0][newStereoBond] = stereoCenter;
            }
          }
        }
        this.mValidHelperArrays = 0;
      }
    }
    overallCharge = 0;
    negativeAtomCount = 0;
    negativeAdjustableCharge = 0;
    for (atom0 = 0; atom0 < this.mAllAtoms; atom0++) {
      overallCharge += this.mAtomCharge[atom0];
      if (this.mAtomCharge[atom0] < 0 && !this.hasPositiveNeighbour(atom0)) {
        negativeAtomCount++;
        if (this.isElectronegative_0(atom0))
          negativeAdjustableCharge -= this.mAtomCharge[atom0];
      }
    }
    if (!allowUnbalancedCharge && overallCharge != 0)
      throw toJs(new jl.Exception_1("molecule's overall charges are not balanced"));
    this.ensureHelperArrays_0(1);
    overallChargeChange = 0;
    positiveChargeForRemoval = doNeutralize ? overallCharge + negativeAdjustableCharge : negativeAdjustableCharge;
    for (atom3 = 0; atom3 < this.mAllAtoms; atom3++) {
      if (this.mAtomCharge[atom3] > 0) {
        if (!this.hasNegativeNeighbour(atom3) && this.isElectronegative_0(atom3)) {
          chargeReduction = $wnd.Math.min(this.getImplicitHydrogens_1(atom3), this.mAtomCharge[atom3]);
          if (chargeReduction != 0 && positiveChargeForRemoval >= chargeReduction) {
            overallCharge -= chargeReduction;
            overallChargeChange -= chargeReduction;
            positiveChargeForRemoval -= chargeReduction;
            this.mAtomCharge[atom3] -= chargeReduction;
            this.mValidHelperArrays &= 1;
          }
        }
      }
    }
    negativeChargeForRemoval = doNeutralize ? overallCharge : overallChargeChange;
    if (negativeChargeForRemoval < 0) {
      negativeAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, negativeAtomCount, 15, 1);
      negativeAtomCount = 0;
      for (atom1 = 0; atom1 < this.mAllAtoms; atom1++) {
        if (this.mAtomCharge[atom1] < 0 && !this.hasPositiveNeighbour(atom1)) {
          negativeAtom[negativeAtomCount++] = (this.mAtomicNo[atom1] << 22) + atom1;
        }
      }
      ju.sort_3(negativeAtom);
      for (i = negativeAtom.length - 1; negativeChargeForRemoval < 0 && i >= negativeAtom.length - negativeAtomCount; i--) {
        atom = negativeAtom[i] & 4194303;
        if (this.isElectronegative_0(atom)) {
          chargeReduction = $wnd.Math.min(-negativeChargeForRemoval, -this.mAtomCharge[atom]);
          overallCharge += chargeReduction;
          negativeChargeForRemoval += chargeReduction;
          this.mAtomCharge[atom] += chargeReduction;
          this.mValidHelperArrays &= 1;
        }
      }
    }
    return overallCharge;
  };
  _.convertHydrogenToQueryFeatures = function convertHydrogenToQueryFeatures() {
    var atom, atom0, connBond, deleteHydrogens, explicitHydrogens, freeValence, i, queryFeatureHydrogens, queryFeatureShift, queryFeatures;
    for (atom0 = 0; atom0 < this.mAllAtoms; atom0++) {
      if (this.getFreeValence_0(atom0) <= 0 && !(this.mAtomCharge[atom0] == 0 && (this.mAtomicNo[atom0] == 5 || this.isNitrogenFamily_0(atom0) || this.isChalcogene_0(atom0))))
        this.mAtomQueryFeatures[atom0] = and_0(this.mAtomQueryFeatures[atom0], not_0(or_0(2048, 4096)));
    }
    if (this.mProtectHydrogen)
      return false;
    deleteHydrogens = false;
    for (atom = 0; atom < this.mAtoms; atom++) {
      explicitHydrogens = this.getExplicitHydrogens_0(atom);
      if (explicitHydrogens > 0) {
        if (eq(and_0(this.mAtomQueryFeatures[atom], 2048), 0)) {
          queryFeatureHydrogens = eq(and_0(this.mAtomQueryFeatures[atom], 1920), or_0(or_0(128, 256), 512)) ? 3 : eq(and_0(this.mAtomQueryFeatures[atom], 1920), or_0(128, 256)) ? 2 : eq(and_0(this.mAtomQueryFeatures[atom], 128), 128) ? 1 : 0;
          freeValence = this.getFreeValence_0(atom);
          if (this.mAtomCharge[atom] == 0 && eq(and_0(this.mAtomQueryFeatures[atom], 234881024), 0) && this.mAtomicNo[atom] != 6)
            freeValence++;
          queryFeatureShift = explicitHydrogens;
          if (queryFeatureShift > 3 - queryFeatureHydrogens)
            queryFeatureShift = 3 - queryFeatureHydrogens;
          if (queryFeatureShift > freeValence + explicitHydrogens - queryFeatureHydrogens)
            queryFeatureShift = freeValence + explicitHydrogens - queryFeatureHydrogens;
          if (queryFeatureShift > 0) {
            queryFeatures = queryFeatureHydrogens == 0 ? 0 : shl_0(and_0(this.mAtomQueryFeatures[atom], 1920), queryFeatureShift);
            queryFeatures = or_0(queryFeatures, fromInt_0((queryFeatureShift == 3 ? 7 : explicitHydrogens == 2 ? 3 : 1) << 7));
            this.mAtomQueryFeatures[atom] = and_0(this.mAtomQueryFeatures[atom], not_0(1920));
            this.mAtomQueryFeatures[atom] = or_0(this.mAtomQueryFeatures[atom], and_0(1920, queryFeatures));
          }
        }
        for (i = this.mConnAtoms[atom]; i < this.mAllConnAtoms[atom]; i++) {
          connBond = this.mConnBond[atom][i];
          if (this.mBondType[connBond] == 1) {
            this.mAtomicNo[this.mConnAtom[atom][i]] = -1;
            this.mBondType[connBond] = 512;
            deleteHydrogens = true;
          }
        }
      }
    }
    if (deleteHydrogens)
      this.compressMolTable();
    return deleteHydrogens;
  };
  _.convertStereoBondsToSingleBonds_0 = function convertStereoBondsToSingleBonds(atom) {
    var alleneEnd, connBond, i, j;
    if (this.mPi[atom] == 2 && this.mConnAtoms[atom] == 2 && this.mConnBondOrder[atom][0] == 2) {
      for (i = 0; i < 2; i++) {
        alleneEnd = this.findAlleneEndAtom_0(atom, this.mConnAtom[atom][i]);
        if (alleneEnd != -1) {
          for (j = 0; j < this.mConnAtoms[alleneEnd]; j++) {
            connBond = this.mConnBond[alleneEnd][j];
            if (this.isStereoBond_0(connBond) && this.mBondAtom[0][connBond] == alleneEnd)
              this.mBondType[this.mConnBond[alleneEnd][j]] = 1;
          }
        }
      }
      return;
    }
    if (this.mPi[atom] == 0 || this.mAtomicNo[atom] >= 15) {
      for (i = 0; i < this.mAllConnAtoms[atom]; i++) {
        connBond = this.mConnBond[atom][i];
        if (this.isStereoBond_1(connBond, atom) && this.mBondAtom[0][connBond] == atom)
          this.mBondType[connBond] = 1;
      }
    }
  };
  _.copyMoleculeByAtoms_0 = function copyMoleculeByAtoms(destMol, includeAtom, recognizeDelocalizedBonds, atomMap) {
    var atom, atom1, atom2, atomCount, bond, bondMap, i, valence;
    this.ensureHelperArrays_0(recognizeDelocalizedBonds ? 7 : 1);
    destMol.mAtomList = null;
    if (this.mIsFragment)
      destMol.setFragment_0(true);
    atomCount = includeAtom.length;
    if (jsEquals(atomMap, null))
      atomMap = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, atomCount, 15, 1);
    destMol.mAllAtoms = 0;
    for (atom = 0; atom < atomCount; atom++) {
      if (includeAtom[atom]) {
        atomMap[atom] = this.copyAtom_0(destMol, atom, 0, 0);
        if (this.mAtomicNo[atom] == 1) {
          valence = this.getOccupiedValence_0(atom);
          if (valence > 1) {
            for (i = 0; i < this.mAllConnAtoms[atom]; i++) {
              if (!includeAtom[this.mConnAtom[atom][i]]) {
                destMol.setAtomAbnormalValence_0(atomMap[atom], valence);
                break;
              }
            }
          }
        }
      } else {
        atomMap[atom] = -1;
      }
    }
    bondMap = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllBonds, 15, 1);
    ju.fill_0(bondMap, -1);
    destMol.mAllBonds = 0;
    for (bond = 0; bond < this.mAllBonds; bond++) {
      atom1 = this.mBondAtom[0][bond];
      atom2 = this.mBondAtom[1][bond];
      if (atom1 < atomCount && atom2 < atomCount) {
        if (includeAtom[atom1] && includeAtom[atom2])
          bondMap[bond] = this.copyBond_1(destMol, bond, 0, 0, atomMap, recognizeDelocalizedBonds);
        else if (this.mAtomCharge[atom1] != 0 && this.mAtomCharge[atom2] != 0 && this.mAtomCharge[atom1] < 0 ^ this.mAtomCharge[atom2] < 0) {
          if (includeAtom[atom1])
            destMol.mAtomCharge[atomMap[atom1]] += this.mAtomCharge[atom1] < 0 ? 1 : -1;
          if (includeAtom[atom2])
            destMol.mAtomCharge[atomMap[atom2]] += this.mAtomCharge[atom2] < 0 ? 1 : -1;
        }
      }
    }
    this.copyMoleculeProperties_0(destMol);
    destMol.mValidHelperArrays = 0;
    destMol.renumberESRGroups_0(1);
    destMol.renumberESRGroups_0(2);
    if (destMol.mAllAtoms != atomCount)
      destMol.setFragment_0(true);
    this.rescueStereoBonds(destMol, atomCount, atomMap, bondMap);
    this.rescueImplicitHigherValences(destMol, atomCount, atomMap);
    if (recognizeDelocalizedBonds)
      new carc2.AromaticityResolver(destMol).locateDelocalizedDoubleBonds(null);
  };
  _.copyMoleculeByBonds_0 = function copyMoleculeByBonds(destMol, includeBond, recognizeDelocalizedBonds, atomMap) {
    var atom, atom1, atom2, bond, bondMap, i, j, valence;
    this.ensureHelperArrays_0(recognizeDelocalizedBonds ? 7 : 1);
    destMol.mAtomList = null;
    if (this.mIsFragment)
      destMol.setFragment_0(true);
    if (jsEquals(atomMap, null))
      atomMap = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    destMol.mAllAtoms = 0;
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      atomMap[atom] = -1;
      for (i = 0; i < this.mConnAtoms[atom]; i++) {
        if (includeBond[this.mConnBond[atom][i]]) {
          atomMap[atom] = this.copyAtom_0(destMol, atom, 0, 0);
          if (this.mAtomicNo[atom] == 1) {
            valence = this.getOccupiedValence_0(atom);
            if (valence > 1) {
              for (j = 0; j < this.mAllConnAtoms[atom]; j++) {
                if (!includeBond[this.mConnBond[atom][j]]) {
                  destMol.setAtomAbnormalValence_0(atomMap[atom], valence);
                  break;
                }
              }
            }
          }
          break;
        }
      }
    }
    bondMap = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllBonds, 15, 1);
    destMol.mAllBonds = 0;
    for (bond = 0; bond < this.mAllBonds; bond++)
      if (includeBond[bond]) {
        bondMap[bond] = this.copyBond_1(destMol, bond, 0, 0, atomMap, recognizeDelocalizedBonds);
      } else {
        bondMap[bond] = -1;
        atom1 = this.mBondAtom[0][bond];
        atom2 = this.mBondAtom[1][bond];
        if (atomMap[atom1] == -1 ^ atomMap[atom2] == -1) {
          if (this.mAtomCharge[atom1] != 0 && this.mAtomCharge[atom2] != 0 && this.mAtomCharge[atom1] < 0 ^ this.mAtomCharge[atom2] < 0) {
            if (atomMap[atom1] != -1)
              destMol.mAtomCharge[atomMap[atom1]] += this.mAtomCharge[atom1] < 0 ? 1 : -1;
            if (atomMap[atom2] != -1)
              destMol.mAtomCharge[atomMap[atom2]] += this.mAtomCharge[atom2] < 0 ? 1 : -1;
          }
        }
      }
    this.copyMoleculeProperties_0(destMol);
    destMol.mValidHelperArrays = 0;
    destMol.renumberESRGroups_0(1);
    destMol.renumberESRGroups_0(2);
    if (destMol.mAllAtoms != this.mAllAtoms)
      destMol.setFragment_0(true);
    this.rescueStereoBonds(destMol, this.mAllAtoms, atomMap, bondMap);
    this.rescueImplicitHigherValences(destMol, this.mAllAtoms, atomMap);
    if (recognizeDelocalizedBonds)
      new carc2.AromaticityResolver(destMol).locateDelocalizedDoubleBonds(null);
    return atomMap;
  };
  _.ensureHelperArrays_0 = function ensureHelperArrays(required) {
    var atom, atom0, atom1, bond, candidate, connAtom, connBond, found, i, j;
    if ((required & ~this.mValidHelperArrays) == 0)
      return;
    if ((this.mValidHelperArrays & 1) == 0) {
      this.handleHydrogens();
      this.calculateNeighbours();
      this.mValidHelperArrays |= 1;
      if (this.mIsFragment && !this.is3D_0() && this.convertHydrogenToQueryFeatures()) {
        this.handleHydrogens();
        this.calculateNeighbours();
        this.mValidHelperArrays |= 1;
      }
    }
    if ((required & ~this.mValidHelperArrays) == 0)
      return;
    if ((this.mValidHelperArrays & ~(2 | 4)) != 0) {
      for (atom0 = 0; atom0 < this.mAtoms; atom0++)
        this.mAtomFlags[atom0] &= ~15368;
      for (bond = 0; bond < this.mBonds; bond++)
        this.mBondFlags[bond] &= ~704;
      if ((required & 4) == 0) {
        this.findRings(1);
        this.mValidHelperArrays |= 2;
        return;
      }
      this.findRings(7);
      for (atom1 = 0; atom1 < this.mAtoms; atom1++) {
        for (i = 0; i < this.mConnAtoms[atom1]; i++) {
          connBond = this.mConnBond[atom1][i];
          if (this.isAromaticBond_0(connBond))
            continue;
          connAtom = this.mConnAtom[atom1][i];
          for (j = 0; j < this.mConnAtoms[connAtom]; j++) {
            if (this.mConnBond[connAtom][j] == connBond)
              continue;
            if (this.mConnBondOrder[connAtom][j] > 1) {
              if (this.mAtomicNo[this.mConnAtom[connAtom][j]] == 6)
                this.mAtomFlags[atom1] |= 4096;
              else {
                if (!this.isAromaticBond_0(this.mConnBond[connAtom][j]) && this.isElectronegative_0(this.mConnAtom[connAtom][j]))
                  this.mAtomFlags[atom1] |= 8192;
              }
            }
          }
        }
      }
      while (true) {
        found = false;
        for (atom = 0; atom < this.mAtoms; atom++) {
          if (this.mPi[atom] > 0 && (this.mAtomFlags[atom] & 8192) != 0 && !this.mRingSet.isAromaticAtom_0(atom)) {
            for (i = 0; i < this.mConnAtoms[atom]; i++) {
              if (this.mConnBondOrder[atom][i] > 1) {
                connAtom = this.mConnAtom[atom][i];
                connBond = this.mConnBond[atom][i];
                for (j = 0; j < this.mConnAtoms[connAtom]; j++) {
                  if (this.mConnBond[connAtom][j] != connBond) {
                    candidate = this.mConnAtom[connAtom][j];
                    if ((this.mAtomFlags[candidate] & 8192) == 0) {
                      this.mAtomFlags[candidate] |= 8192;
                      found = true;
                    }
                  }
                }
              }
            }
          }
        }
        if (!found)
          break;
      }
    }
    this.mValidHelperArrays |= 2 | 4;
  };
  _.findAlleneCenterAtom_0 = function findAlleneCenterAtom(atom) {
    var center, connAtom, endAtom, i, j;
    center = -1;
    if (this.mPi[atom] == 1) {
      for (i = 0; i < this.mConnAtoms[atom]; i++) {
        if (this.mConnBondOrder[atom][i] == 2) {
          connAtom = this.mConnAtom[atom][i];
          if (this.mConnAtoms[connAtom] == 2 && this.mPi[connAtom] == 2) {
            for (j = 0; j < 2; j++) {
              endAtom = this.mConnAtom[connAtom][j];
              if (endAtom != atom && this.mPi[endAtom] == 1) {
                center = connAtom;
                break;
              }
            }
          }
          break;
        }
      }
    }
    return center;
  };
  _.findAlleneEndAtom_0 = function findAlleneEndAtom(atom1, atom2) {
    var startAtom, temp;
    startAtom = atom1;
    while (this.mConnAtoms[atom2] == 2 && this.mPi[atom2] == 2 && atom2 != startAtom) {
      temp = atom2;
      atom2 = this.mConnAtom[atom2][0] == atom1 ? this.mConnAtom[atom2][1] : this.mConnAtom[atom2][0];
      atom1 = temp;
    }
    return atom2 == startAtom ? -1 : atom2;
  };
  _.findBINAPChiralityBond_0 = function findBINAPChiralityBond(atom) {
    var i;
    if (this.mConnAtoms[atom] == 3 && this.isAromaticAtom_0(atom) && this.getAtomRingSize_0(atom) >= 5) {
      for (i = 0; i < this.mConnAtoms[atom]; i++)
        if (this.isBINAPChiralityBond_0(this.mConnBond[atom][i]))
          return this.mConnBond[atom][i];
    }
    return -1;
  };
  _.findRingSystem_0 = function findRingSystem(startAtom, aromaticOnly, isMemberAtom, isMemberBond) {
    var candidateAtom, candidateBond, current, graphAtom, highest, i;
    this.ensureHelperArrays_0(7);
    if (!this.isRingAtom_0(startAtom) || aromaticOnly && !this.isAromaticAtom_0(startAtom))
      return;
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAtoms, 15, 1);
    graphAtom[0] = startAtom;
    isMemberAtom[startAtom] = true;
    current = 0;
    highest = 0;
    while (current <= highest) {
      for (i = 0; i < this.mConnAtoms[graphAtom[current]]; i++) {
        candidateBond = this.mConnBond[graphAtom[current]][i];
        if (!isMemberBond[candidateBond] && this.isRingBond_0(candidateBond) && (!aromaticOnly || this.isAromaticBond_0(candidateBond))) {
          isMemberBond[candidateBond] = true;
          candidateAtom = this.mConnAtom[graphAtom[current]][i];
          if (!isMemberAtom[candidateAtom]) {
            isMemberAtom[candidateAtom] = true;
            graphAtom[++highest] = candidateAtom;
          }
        }
      }
      current++;
    }
  };
  _.findRings = function findRings(mode) {
    var atom, atomRingBondCount, bond, i, ringAtom, ringAtoms, ringBond, ringNo;
    this.mRingSet = new carc2.RingCollection(this, mode);
    atomRingBondCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAtoms, 15, 1);
    for (bond = 0; bond < this.mBonds; bond++) {
      if (this.mRingSet.getBondRingSize_0(bond) != 0) {
        this.mBondFlags[bond] |= 64;
        atomRingBondCount[this.mBondAtom[0][bond]]++;
        atomRingBondCount[this.mBondAtom[1][bond]]++;
      }
    }
    for (atom = 0; atom < this.mAtoms; atom++) {
      if (atomRingBondCount[atom] == 2)
        this.mAtomFlags[atom] |= 1024;
      else if (atomRingBondCount[atom] == 3)
        this.mAtomFlags[atom] |= 2048;
      else if (atomRingBondCount[atom] > 3)
        this.mAtomFlags[atom] |= 3072;
    }
    for (ringNo = 0; ringNo < this.mRingSet.getSize_0(); ringNo++) {
      ringAtom = this.mRingSet.getRingAtoms_0(ringNo);
      ringBond = this.mRingSet.getRingBonds_0(ringNo);
      ringAtoms = ringAtom.length;
      for (i = 0; i < ringAtoms; i++) {
        this.mAtomFlags[ringAtom[i]] |= 8;
        this.mBondFlags[ringBond[i]] |= 128;
        if (this.mBondType[ringBond[i]] == 386)
          this.mBondType[ringBond[i]] = 2;
      }
    }
  };
  _.findSimpleHydrogens = function findSimpleHydrogens() {
    var atom, atom0, atom1, atom2, bond, bond0, isSimpleHydrogen, oneBondFound;
    isSimpleHydrogen = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 16, 1);
    for (atom0 = 0; atom0 < this.mAllAtoms; atom0++)
      isSimpleHydrogen[atom0] = this.isSimpleHydrogen_0(atom0);
    oneBondFound = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 16, 1);
    for (bond0 = 0; bond0 < this.mAllBonds; bond0++) {
      atom1 = this.mBondAtom[0][bond0];
      atom2 = this.mBondAtom[1][bond0];
      if (this.getBondOrder_0(bond0) != 1) {
        isSimpleHydrogen[atom1] = false;
        isSimpleHydrogen[atom2] = false;
        continue;
      }
      if (oneBondFound[atom1])
        isSimpleHydrogen[atom1] = false;
      if (oneBondFound[atom2])
        isSimpleHydrogen[atom2] = false;
      if (isSimpleHydrogen[atom1] && this.isMetalAtom_0(atom2) && this.mAtomicNo[atom2] != 13)
        isSimpleHydrogen[atom1] = false;
      if (isSimpleHydrogen[atom2] && this.isMetalAtom_0(atom1) && this.mAtomicNo[atom1] != 13)
        isSimpleHydrogen[atom2] = false;
      oneBondFound[atom1] = true;
      oneBondFound[atom2] = true;
    }
    for (bond = 0; bond < this.mAllBonds; bond++) {
      if (isSimpleHydrogen[this.mBondAtom[0][bond]] && isSimpleHydrogen[this.mBondAtom[1][bond]]) {
        isSimpleHydrogen[this.mBondAtom[0][bond]] = false;
        isSimpleHydrogen[this.mBondAtom[1][bond]] = false;
      }
    }
    for (atom = 0; atom < this.mAllAtoms; atom++)
      if (!oneBondFound[atom])
        isSimpleHydrogen[atom] = false;
    return isSimpleHydrogen;
  };
  _.getAllConnAtoms_0 = function getAllConnAtoms(atom) {
    return this.mAllConnAtoms[atom];
  };
  _.getAllConnAtomsPlusMetalBonds_0 = function getAllConnAtomsPlusMetalBonds(atom) {
    return this.mConnAtom[atom].length;
  };
  _.getAllHydrogens_0 = function getAllHydrogens(atom) {
    return this.mAllConnAtoms[atom] - this.getNonHydrogenNeighbourCount_0(atom) + this.getImplicitHydrogens_1(atom);
  };
  _.getAromaticRingCount_0 = function getAromaticRingCount() {
    var count, i;
    this.ensureHelperArrays_0(7);
    count = 0;
    for (i = 0; i < this.mRingSet.getSize_0(); i++)
      if (this.mRingSet.isAromatic_0(i))
        count++;
    return count;
  };
  _.getAtomElectronegativeNeighbours = function getAtomElectronegativeNeighbours(atom) {
    var e, i;
    e = 0;
    for (i = 0; i < this.mConnAtoms[atom]; i++)
      if (this.isElectronegative_0(this.mConnAtom[atom][i]) && !this.isBondBridge_0(this.mConnBond[atom][i]))
        e++;
    return e;
  };
  _.getAtomPi_0 = function getAtomPi(atom) {
    return this.mPi[atom];
  };
  _.getAtomPreferredStereoBond_0 = function getAtomPreferredStereoBond(atom) {
    this.ensureHelperArrays_0(7);
    if (this.mPi[atom] == 2 && this.mConnAtoms[atom] == 2)
      return this.preferredAlleneStereoBond(atom, false);
    else
      return this.preferredTHStereoBond(atom, false);
  };
  _.getAtomRingBondCount_0 = function getAtomRingBondCount(atom) {
    var flags;
    flags = this.mAtomFlags[atom] & 3072;
    return flags == 0 ? 0 : flags == 1024 ? 2 : flags == 2048 ? 3 : 4;
  };
  _.getAtomRingCount_0 = function getAtomRingCount(atom, maxRingSize) {
    var bond1, bond2, bondTouched, count, i, isIndependentRing, j, k, neglectBond, pathBond, pathLength, ringAtom;
    this.ensureHelperArrays_0(7);
    bondTouched = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mBonds, 16, 1);
    neglectBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mBonds, 16, 1);
    ringAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAtoms, 15, 1);
    count = 0;
    for (i = 1; i < this.mConnAtoms[atom]; i++) {
      bond1 = this.mConnBond[atom][i];
      if (this.isRingBond_0(bond1)) {
        for (j = 0; j < i; j++) {
          bond2 = this.mConnBond[atom][j];
          if (this.isRingBond_0(bond2)) {
            neglectBond[bond1] = true;
            neglectBond[bond2] = true;
            pathLength = this.getPath_0(ringAtom, this.mConnAtom[atom][i], this.mConnAtom[atom][j], maxRingSize - 2, neglectBond);
            neglectBond[bond1] = false;
            neglectBond[bond2] = false;
            if (pathLength != -1) {
              isIndependentRing = false;
              pathBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, pathLength, 15, 1);
              this.getPathBonds_0(ringAtom, pathBond, pathLength);
              for (k = 0; k < pathLength; k++) {
                if (!bondTouched[pathBond[k]]) {
                  bondTouched[pathBond[k]] = true;
                  isIndependentRing = true;
                }
              }
              if (isIndependentRing)
                count++;
            }
          }
        }
      }
    }
    return count;
  };
  _.getAtomRingSize_0 = function getAtomRingSize(atom) {
    return isNotNull(this.mRingSet) && atom < this.mAtoms ? this.mRingSet.getAtomRingSize_0(atom) : 0;
  };
  _.getAtoms_0 = function getAtoms() {
    return this.mAtoms;
  };
  _.getAverageBondLength_5 = function getAverageBondLength_4(nonHydrogenBondsOnly) {
    if (nonHydrogenBondsOnly) {
      this.ensureHelperArrays_0(1);
      return this.getAverageBondLength_2(this.mAtoms, this.mBonds);
    } else {
      return this.getAverageBondLength_2(this.mAllAtoms, this.mAllBonds);
    }
  };
  _.getAverageTopologicalAtomDistance_0 = function getAverageTopologicalAtomDistance() {
    var candidate, current, graphAtom, graphLevel, highest, i, meanDistance, startAtom;
    this.ensureHelperArrays_0(1);
    meanDistance = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, this.mAtoms, 15, 1);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAtoms, 15, 1);
    for (startAtom = 0; startAtom < this.mAtoms; startAtom++) {
      graphAtom[0] = startAtom;
      graphLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAtoms, 15, 1);
      graphLevel[startAtom] = 1;
      current = 0;
      highest = 0;
      while (current <= highest) {
        for (i = 0; i < this.mConnAtoms[graphAtom[current]]; i++) {
          candidate = this.mConnAtom[graphAtom[current]][i];
          if (graphLevel[candidate] == 0) {
            graphLevel[candidate] = graphLevel[graphAtom[current]] + 1;
            graphAtom[++highest] = candidate;
            meanDistance[startAtom] += graphLevel[candidate] - 1;
          }
        }
        current++;
      }
      meanDistance[startAtom] /= highest;
    }
    return meanDistance;
  };
  _.getBond_0 = function getBond(atom1, atom2) {
    var i;
    for (i = 0; i < this.getAllConnAtomsPlusMetalBonds_0(atom1); i++)
      if (this.mConnAtom[atom1][i] == atom2)
        return this.mConnBond[atom1][i];
    return -1;
  };
  _.getBondPreferredStereoBond_0 = function getBondPreferredStereoBond(bond) {
    return this.preferredBinapStereoBond(bond);
  };
  _.getBondRingSize_0 = function getBondRingSize(bond) {
    return isNotNull(this.mRingSet) && bond < this.mBonds ? this.mRingSet.getBondRingSize_0(bond) : 0;
  };
  _.getBonds_0 = function getBonds() {
    return this.mBonds;
  };
  _.getChiralText_0 = function getChiralText() {
    return null;
  };
  _.getConnAtom_0 = function getConnAtom(atom, i) {
    return this.mConnAtom[atom][i];
  };
  _.getConnAtoms_0 = function getConnAtoms(atom) {
    return this.mConnAtoms[atom];
  };
  _.getConnBond_0 = function getConnBond(atom, i) {
    return this.mConnBond[atom][i];
  };
  _.getConnBondOrder_0 = function getConnBondOrder(atom, i) {
    return this.mConnBondOrder[atom][i];
  };
  _.getExcludedNeighbourCount_0 = function getExcludedNeighbourCount(atom) {
    var count, i;
    count = 0;
    if (this.mIsFragment) {
      for (i = 0; i < this.mConnAtoms[atom]; i++)
        if (this.isExcludeGroupAtom(this.mConnAtom[atom][i]))
          count++;
    }
    return count;
  };
  _.getExplicitHydrogens_0 = function getExplicitHydrogens(atom) {
    return this.mAllConnAtoms[atom] - this.mConnAtoms[atom];
  };
  _.getFisherProjectionBondDirections = function getFisherProjectionBondDirections(atom, sortedConnMap, angle, direction) {
    var a, allConnAtoms, i, isUsed;
    allConnAtoms = this.mAllConnAtoms[atom];
    if (this.mPi[atom] != 0 || this.isAromaticAtom_0(atom) || this.mConnAtoms[atom] < 3 || allConnAtoms > 4)
      return false;
    isUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, 4, 16, 1);
    for (i = 0; i < allConnAtoms; i++) {
      a = 3.141592653589793 * 5 / 4 - angle[i];
      if ($wnd.Math.abs(3.141592653589793 / 4 - a % (3.141592653589793 / 2)) > 0.0872664675116539)
        return false;
      direction[i] = 3 & round_int(a / (3.141592653589793 / 2));
      if (isUsed[direction[i]])
        return false;
      isUsed[direction[i]] = true;
      if ((direction[i] & 1) == 0) {
        if (this.mBondType[this.mConnBond[atom][sortedConnMap[i]]] != 1)
          return false;
      } else {
        if (!this.isStereoBond_1(this.mConnBond[atom][sortedConnMap[i]], atom))
          return false;
      }
    }
    return isUsed[0] && isUsed[2];
  };
  _.getFisherProjectionParity_0 = function getFisherProjectionParity(atom, sortedConnMap, angle, direction) {
    var allConnAtoms, bondType, dif, horizontalBondType, i, index_0, is4thConnHorizontal, isClockwise;
    if (this.getAtomRingSize_0(atom) > 24)
      return 3;
    allConnAtoms = this.mAllConnAtoms[atom];
    if (jsEquals(direction, null))
      direction = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, allConnAtoms, 15, 1);
    if (!this.getFisherProjectionBondDirections(atom, sortedConnMap, angle, direction))
      return 3;
    horizontalBondType = -1;
    for (i = 0; i < allConnAtoms; i++) {
      if ((direction[i] & 1) == 1) {
        bondType = this.mBondType[this.mConnBond[atom][sortedConnMap[i]]];
        if (horizontalBondType != -1 && horizontalBondType != bondType)
          return 3;
        horizontalBondType = bondType;
      }
    }
    index_0 = $wnd.Math.abs(direction[0] - direction[1]) == 2 ? 1 : 0;
    dif = direction[index_0] - direction[index_0 + 1];
    isClockwise = $wnd.Math.abs(dif) == 3 ^ direction[index_0] < direction[index_0 + 1];
    is4thConnHorizontal = allConnAtoms == 3 || (direction[3] & 1) == 1;
    return isClockwise ^ is4thConnHorizontal ^ horizontalBondType == 129 ? 1 : 2;
  };
  _.getFragmentAtoms_0 = function getFragmentAtoms(rootAtom) {
    return this.getFragmentAtoms_1(rootAtom, false);
  };
  _.getFragmentAtoms_1 = function getFragmentAtoms_0(rootAtom, considerMetalBonds) {
    var atom, fragmentMember, fragmentMembers, isFragmentMember;
    isFragmentMember = isFragmentMember = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 16, 1);
    fragmentMembers = this.getFragmentAtoms_2(rootAtom, considerMetalBonds, isFragmentMember);
    fragmentMember = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, fragmentMembers, 15, 1);
    fragmentMembers = 0;
    for (atom = 0; atom < this.mAllAtoms; atom++)
      if (isFragmentMember[atom])
        fragmentMember[fragmentMembers++] = atom;
    return fragmentMember;
  };
  _.getFragmentAtoms_2 = function getFragmentAtoms_1(rootAtom, considerMetalBonds, isFragmentMember) {
    var candidate, connAtoms, current, fragmentMembers, graphAtom, highest, i;
    this.ensureHelperArrays_0(1);
    if (jsEquals(isFragmentMember, null))
      isFragmentMember = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 16, 1);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    graphAtom[0] = rootAtom;
    isFragmentMember[rootAtom] = true;
    current = 0;
    highest = 0;
    fragmentMembers = 1;
    while (current <= highest) {
      connAtoms = considerMetalBonds ? this.getAllConnAtomsPlusMetalBonds_0(graphAtom[current]) : this.mAllConnAtoms[graphAtom[current]];
      for (i = 0; i < connAtoms; i++) {
        candidate = this.mConnAtom[graphAtom[current]][i];
        if (candidate < isFragmentMember.length && !isFragmentMember[candidate]) {
          graphAtom[++highest] = candidate;
          isFragmentMember[candidate] = true;
          fragmentMembers++;
        }
      }
      current++;
    }
    return fragmentMembers;
  };
  _.getFragmentNumbers_0 = function getFragmentNumbers(fragmentNo, markedAtomsOnly, considerMetalBonds) {
    var atom, atom0, candidate, connAtoms, current, fragments, graphAtom, highest, i;
    this.ensureHelperArrays_0(1);
    for (atom0 = 0; atom0 < this.mAllAtoms; atom0++)
      fragmentNo[atom0] = -1;
    fragments = 0;
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      if (fragmentNo[atom] == -1 && (!markedAtomsOnly || this.isMarkedAtom_0(atom))) {
        fragmentNo[atom] = fragments;
        graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
        graphAtom[0] = atom;
        current = 0;
        highest = 0;
        while (current <= highest) {
          connAtoms = considerMetalBonds ? this.getAllConnAtomsPlusMetalBonds_0(graphAtom[current]) : this.mAllConnAtoms[graphAtom[current]];
          for (i = 0; i < connAtoms; i++) {
            candidate = this.mConnAtom[graphAtom[current]][i];
            if (fragmentNo[candidate] == -1 && (!markedAtomsOnly || this.isMarkedAtom_0(candidate))) {
              graphAtom[++highest] = candidate;
              fragmentNo[candidate] = fragments;
            }
          }
          current++;
        }
        fragments++;
      }
    }
    return fragments;
  };
  _.getFragmentNumbers_1 = function getFragmentNumbers_0(fragmentNo, neglectBond, considerMetalBonds) {
    var atom, atom0, candidate, connAtoms, current, fragments, graphAtom, highest, i;
    this.ensureHelperArrays_0(1);
    for (atom0 = 0; atom0 < this.mAllAtoms; atom0++)
      fragmentNo[atom0] = -1;
    fragments = 0;
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      if (fragmentNo[atom] == -1) {
        fragmentNo[atom] = fragments;
        graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
        graphAtom[0] = atom;
        current = 0;
        highest = 0;
        while (current <= highest) {
          connAtoms = considerMetalBonds ? this.getAllConnAtomsPlusMetalBonds_0(graphAtom[current]) : this.mAllConnAtoms[graphAtom[current]];
          for (i = 0; i < connAtoms; i++) {
            candidate = this.mConnAtom[graphAtom[current]][i];
            if (fragmentNo[candidate] == -1 && !neglectBond[this.mConnBond[graphAtom[current]][i]]) {
              graphAtom[++highest] = candidate;
              fragmentNo[candidate] = fragments;
            }
          }
          current++;
        }
        fragments++;
      }
    }
    return fragments;
  };
  _.getFreeValence_0 = function getFreeValence(atom) {
    return this.getMaxValence_0(atom) - this.getOccupiedValence_0(atom);
  };
  _.getHandleHydrogenAtomMap = function getHandleHydrogenAtomMap(isSimpleHydrogen) {
    var i, i0, lastNonHAtom, map_0, temp, tempIndex;
    map_0 = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    for (i0 = 0; i0 < this.mAllAtoms; i0++)
      map_0[i0] = i0;
    lastNonHAtom = this.mAllAtoms;
    do
      lastNonHAtom--;
    while (lastNonHAtom >= 0 && isSimpleHydrogen[lastNonHAtom]);
    for (i = 0; i < lastNonHAtom; i++) {
      if (isSimpleHydrogen[map_0[i]]) {
        tempIndex = map_0[i];
        map_0[i] = map_0[lastNonHAtom];
        map_0[lastNonHAtom] = tempIndex;
        temp = isSimpleHydrogen[i];
        isSimpleHydrogen[i] = isSimpleHydrogen[lastNonHAtom];
        isSimpleHydrogen[lastNonHAtom] = temp;
        do
          lastNonHAtom--;
        while (isSimpleHydrogen[lastNonHAtom]);
      }
    }
    return map_0;
  };
  _.getHandleHydrogenMap_0 = function getHandleHydrogenMap() {
    return this.getHandleHydrogenAtomMap(this.findSimpleHydrogens());
  };
  _.getHelperArrayStatus_0 = function getHelperArrayStatus() {
    return this.mValidHelperArrays;
  };
  _.getImplicitHigherValence_0 = function getImplicitHigherValence(atom, neglectExplicitHydrogen) {
    var i, occupiedValence, valences;
    occupiedValence = this.getOccupiedValence_0(atom);
    occupiedValence -= this.getElectronValenceCorrection_0(atom, occupiedValence);
    if (neglectExplicitHydrogen)
      occupiedValence -= this.mAllConnAtoms[atom] - this.mConnAtoms[atom];
    valences = carc2.getAllowedValences(this.mAtomicNo[atom]);
    if (occupiedValence <= valences[0])
      return -1;
    for (i = 1; i < valences.length; i++)
      if (valences[i] >= occupiedValence)
        return valences[i];
    return occupiedValence;
  };
  _.getImplicitHydrogens_0 = function getImplicitHydrogens() {
    var atom, implicitHydrogens;
    if (this.mIsFragment)
      return 0;
    this.ensureHelperArrays_0(1);
    implicitHydrogens = 0;
    for (atom = 0; atom < this.mAtoms; atom++)
      implicitHydrogens += this.getImplicitHydrogens_1(atom);
    return implicitHydrogens;
  };
  _.getImplicitHydrogens_1 = function getImplicitHydrogens_0(atom) {
    var delocalizedBonds, i, i0, maxValence, occupiedValence, valenceList;
    if (this.mIsFragment && eq(and_0(this.mAtomQueryFeatures[atom], 2048), 0))
      return 0;
    if (!this.supportsImplicitHydrogen_0(atom))
      return 0;
    if (this.mAtomicNo[atom] == 0 || jl.equals_Ljava_lang_Object__Z__devirtual$_2("*", this.getAtomCustomLabel_0(atom)))
      return this.mAllConnAtoms[atom] == 0 ? 1 : 0;
    this.ensureHelperArrays_0(1);
    occupiedValence = 0;
    for (i0 = 0; i0 < this.mAllConnAtoms[atom]; i0++)
      occupiedValence += this.mConnBondOrder[atom][i0];
    if (this.mIsFragment) {
      delocalizedBonds = 1;
      for (i = 0; i < this.mConnAtoms[atom]; i++)
        if (this.mBondType[this.mConnBond[atom][i]] == 8)
          delocalizedBonds++;
      occupiedValence += delocalizedBonds >> 1;
    }
    occupiedValence -= this.getElectronValenceCorrection_0(atom, occupiedValence);
    maxValence = this.getAtomAbnormalValence_0(atom);
    if (maxValence == -1) {
      valenceList = carc2.getAllowedValences(this.mAtomicNo[atom]);
      maxValence = valenceList[0];
      for (i = 1; maxValence < occupiedValence && i < valenceList.length; i++)
        maxValence = valenceList[i];
    }
    return $wnd.Math.max(0, maxValence - occupiedValence);
  };
  _.getLowestFreeValence_0 = function getLowestFreeValence(atom) {
    var atomicNo, atomicNo$array, atomicNo$index, atomicNo$max, valence;
    if (!this.mIsFragment || jsEquals(this.mAtomList, null) || jsEquals(this.mAtomList[atom], null))
      return this.getLowestFreeValence_1(atom, this.mAtomicNo[atom]);
    valence = 0;
    for (atomicNo$array = this.mAtomList[atom], atomicNo$index = 0, atomicNo$max = atomicNo$array.length; atomicNo$index < atomicNo$max; ++atomicNo$index) {
      atomicNo = atomicNo$array[atomicNo$index];
      valence = $wnd.Math.max(valence, this.getLowestFreeValence_1(atom, atomicNo));
    }
    return valence;
  };
  _.getLowestFreeValence_1 = function getLowestFreeValence_0(atom, atomicNo) {
    var correction, i, occupiedValence, valence, valenceList;
    occupiedValence = this.getOccupiedValence_0(atom);
    correction = this.getElectronValenceCorrection_1(atom, occupiedValence, atomicNo);
    valence = this.getAtomAbnormalValence_0(atom);
    if (valence == -1) {
      valenceList = carc2.getAllowedValences(this.mAtomicNo[atom]);
      i = 0;
      while (i < valenceList.length - 1 && occupiedValence > valenceList[i] + correction)
        i++;
      valence = valenceList[i];
    }
    return valence + correction - occupiedValence;
  };
  _.getMetalBondedConnAtoms_0 = function getMetalBondedConnAtoms(atom) {
    return this.mConnAtom[atom].length - this.mAllConnAtoms[atom];
  };
  _.getMolweight_0 = function getMolweight() {
    var atom, connAtoms, mass, molweight;
    this.ensureHelperArrays_0(1);
    molweight = 0;
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      mass = this.mAtomMass[atom] != 0 ? this.mAtomMass[atom] : (carc2.$clinit_Molecule(), carc2.cRoundedMass)[this.mAtomicNo[atom]];
      molweight += mass + this.getImplicitHydrogens_1(atom) * (carc2.$clinit_Molecule(), carc2.cRoundedMass)[1];
      if (this.mAtomicNo[atom] >= 171 && this.mAtomicNo[atom] <= 190) {
        connAtoms = this.mAllConnAtoms[atom];
        if (connAtoms > 2)
          molweight -= (connAtoms - 2) * (carc2.$clinit_Molecule(), carc2.cRoundedMass)[1];
      }
    }
    return molweight;
  };
  _.getNonHydrogenNeighbourCount_0 = function getNonHydrogenNeighbourCount(atom) {
    var count, i;
    count = this.mConnAtoms[atom];
    for (i = 0; i < this.mConnAtoms[atom]; i++)
      if (this.mAtomicNo[this.mConnAtom[atom][i]] == 1)
        count--;
    return count;
  };
  _.getNotExcludedConnAtoms = function getNotExcludedConnAtoms(atom) {
    return this.mConnAtoms[atom] - this.getExcludedNeighbourCount_0(atom);
  };
  _.getOccupiedValence_0 = function getOccupiedValence_0(atom) {
    var bond, delocalizedBondFound, i, order, piElectronsFound, valence;
    this.ensureHelperArrays_0(1);
    piElectronsFound = false;
    delocalizedBondFound = false;
    valence = 0;
    for (i = 0; i < this.mAllConnAtoms[atom]; i++) {
      if (!this.mIsFragment || !this.isExcludeGroupAtom(this.mConnAtom[atom][i])) {
        order = this.mConnBondOrder[atom][i];
        valence += order;
        if (order > 1)
          piElectronsFound = true;
        bond = this.mConnBond[atom][i];
        if (this.mBondType[bond] == 8)
          delocalizedBondFound = true;
      }
    }
    if (delocalizedBondFound && !piElectronsFound)
      valence++;
    return valence;
  };
  _.getOrthoSubstituentCount = function getOrthoSubstituentCount(atom, otherBondAtom) {
    var connAtom, count, i;
    count = 0;
    for (i = 0; i < this.mConnAtoms[atom]; i++) {
      connAtom = this.mConnAtom[atom][i];
      if (connAtom != otherBondAtom && this.mConnAtoms[connAtom] > 2)
        count++;
    }
    return count;
  };
  _.getOxidationState = function getOxidationState(atom) {
    var bondOrder, boronCount, carbonCount, connAtom, connAtomicNo, heteroCount, hydrogenCount, i, i0, state;
    if (carc2.isAtomicNoNobleGas(this.mAtomicNo[atom]))
      return 0;
    if (this.mAtomicNo[atom] == 1)
      return this.mConnAtoms[atom] == 0 ? 0 : carc2.isAtomicNoElectropositive(this.mAtomicNo[this.mConnAtom[atom][0]]) ? -1 : 1;
    state = this.mAtomCharge[atom];
    hydrogenCount = this.getAllHydrogens_0(atom);
    if (this.mAtomicNo[atom] != 1 && this.mAtomicNo[atom] != 15) {
      if (carc2.isAtomicNoElectropositive(this.mAtomicNo[atom]))
        state += hydrogenCount;
      else
        state -= hydrogenCount;
    }
    if (this.mConnAtoms[atom] == 0)
      return state;
    for (i0 = 0; i0 < this.mConnAtoms[atom]; i0++) {
      connAtom = this.mConnAtom[atom][i0];
      bondOrder = this.isDelocalizedBond_0(this.mConnBond[atom][i0]) ? 1 : this.mConnBondOrder[atom][i0];
      if (carc2.isAtomicNoElectropositive(this.mAtomicNo[atom])) {
        if (!carc2.isAtomicNoElectropositive(this.mAtomicNo[connAtom]))
          state += bondOrder;
      } else if (carc2.isAtomicNoElectropositive(this.mAtomicNo[connAtom])) {
        state -= bondOrder;
      } else if (this.mAtomicNo[atom] != this.mAtomicNo[connAtom]) {
        if (carc2.getElement(this.mAtomicNo[atom]).getElectronegativity() < carc2.getElement(this.mAtomicNo[connAtom]).getElectronegativity())
          state += bondOrder;
        else
          state -= bondOrder;
      }
    }
    if (this.isDelocalizedAtom(atom)) {
      boronCount = 0;
      carbonCount = 0;
      heteroCount = 0;
      for (i = 0; i < this.mConnAtoms[atom]; i++) {
        if (this.isDelocalizedBond_0(this.mConnBond[atom][i])) {
          connAtomicNo = this.mAtomicNo[this.mConnAtom[atom][i]];
          if (connAtomicNo == 6)
            carbonCount++;
          else if (carc2.isAtomicNoElectronegative(connAtomicNo))
            heteroCount++;
          else
            boronCount++;
        }
      }
      if (this.mAtomicNo[atom] == 6) {
        if (boronCount > 1)
          state--;
        else if (heteroCount > 1)
          state++;
      } else if (this.isElectronegative_0(atom)) {
        if (boronCount + carbonCount > 1)
          state--;
      } else {
        if (heteroCount + carbonCount > 1)
          state++;
      }
    }
    return state;
  };
  _.getPath_0 = function getPath(pathAtom, atom1, atom2, maxLength, neglectBond) {
    return this.getPath_1(pathAtom, atom1, atom2, maxLength, null, neglectBond);
  };
  _.getPath_1 = function getPath_0(pathAtom, atom1, atom2, maxLength, neglectAtom, neglectBond) {
    var candidate, current, graphAtom, graphLevel, highest, i, index_0, parent_0, parentAtom;
    if (atom1 == atom2) {
      pathAtom[0] = atom1;
      return 0;
    }
    this.ensureHelperArrays_0(1);
    graphLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    parentAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    graphAtom[0] = atom1;
    graphLevel[atom1] = 1;
    current = 0;
    highest = 0;
    while (current <= highest && graphLevel[graphAtom[current]] <= maxLength) {
      parent_0 = graphAtom[current];
      for (i = 0; i < this.mAllConnAtoms[parent_0]; i++) {
        if (jsEquals(neglectBond, null) || neglectBond.length <= this.mConnBond[parent_0][i] || !neglectBond[this.mConnBond[parent_0][i]]) {
          candidate = this.mConnAtom[parent_0][i];
          if (candidate == atom2) {
            index_0 = graphLevel[parent_0];
            pathAtom[index_0] = candidate;
            pathAtom[--index_0] = parent_0;
            while (index_0 > 0) {
              pathAtom[index_0 - 1] = parentAtom[pathAtom[index_0]];
              index_0--;
            }
            return graphLevel[parent_0];
          }
          if (graphLevel[candidate] == 0 && (jsEquals(neglectAtom, null) || neglectAtom.length <= candidate || !neglectAtom[candidate])) {
            graphAtom[++highest] = candidate;
            graphLevel[candidate] = graphLevel[parent_0] + 1;
            parentAtom[candidate] = parent_0;
          }
        }
      }
      current++;
    }
    return -1;
  };
  _.getPathBonds_0 = function getPathBonds(pathAtom, pathBond, pathLength) {
    var i, j;
    this.ensureHelperArrays_0(1);
    for (i = 0; i < pathLength; i++) {
      for (j = 0; j < this.mAllConnAtoms[pathAtom[i]]; j++) {
        if (this.mConnAtom[pathAtom[i]][j] == pathAtom[i + 1]) {
          pathBond[i] = this.mConnBond[pathAtom[i]][j];
          break;
        }
      }
    }
  };
  _.getPathLength_0 = function getPathLength(atom1, atom2) {
    var candidate, current, graphAtom, graphLevel, highest, i;
    if (atom1 == atom2)
      return 0;
    this.ensureHelperArrays_0(1);
    graphLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    graphAtom[0] = atom1;
    graphLevel[atom1] = 1;
    current = 0;
    highest = 0;
    while (current <= highest) {
      for (i = 0; i < this.mAllConnAtoms[graphAtom[current]]; i++) {
        candidate = this.mConnAtom[graphAtom[current]][i];
        if (candidate == atom2)
          return graphLevel[graphAtom[current]];
        if (graphLevel[candidate] == 0) {
          graphAtom[++highest] = candidate;
          graphLevel[candidate] = graphLevel[graphAtom[current]] + 1;
        }
      }
      current++;
    }
    return -1;
  };
  _.getPathLength_1 = function getPathLength_0(atom1, atom2, maxLength, neglectAtom) {
    var candidate, current, graphAtom, graphLevel, highest, i;
    if (atom1 == atom2)
      return 0;
    this.ensureHelperArrays_0(1);
    graphLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    graphAtom[0] = atom1;
    graphLevel[atom1] = 1;
    current = 0;
    highest = 0;
    while (current <= highest && graphLevel[graphAtom[current]] <= maxLength) {
      for (i = 0; i < this.mAllConnAtoms[graphAtom[current]]; i++) {
        candidate = this.mConnAtom[graphAtom[current]][i];
        if (candidate == atom2)
          return graphLevel[graphAtom[current]];
        if (graphLevel[candidate] == 0 && (jsEquals(neglectAtom, null) || neglectAtom.length <= candidate || !neglectAtom[candidate])) {
          graphAtom[++highest] = candidate;
          graphLevel[candidate] = graphLevel[graphAtom[current]] + 1;
        }
      }
      current++;
    }
    return -1;
  };
  _.getPlainHydrogens = function getPlainHydrogens(atom) {
    return this.getExplicitHydrogens_0(atom) + this.getImplicitHydrogens_1(atom);
  };
  _.getPreferredDoubleBondSide = function getPreferredDoubleBondSide(bond) {
    var angle, angles, atom, bondAngle, changed, connAtom, connBond, i, i0, j, sharedRing, side, value_0;
    value_0 = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 16, 15, 1);
    angle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 16, 15, 1);
    bondAngle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    angles = 0;
    for (i0 = 0; i0 < 2; i0++) {
      atom = this.mBondAtom[i0][bond];
      for (j = 0; j < this.mConnAtoms[atom]; j++) {
        connBond = this.mConnBond[atom][j];
        if (connBond == bond)
          continue;
        if (angles == 4)
          return 0;
        connAtom = this.mConnAtom[atom][j];
        value_0[angles] = 16;
        if (this.mPi[connAtom] != 0)
          value_0[angles] += this.isRingAtom_0(connAtom) ? 1 : 4;
        if (this.isRingBond_0(bond) && this.isRingBond_0(connBond)) {
          sharedRing = this.mRingSet.getSharedRing_0(bond, connBond);
          if (sharedRing != -1)
            value_0[angles] += this.mRingSet.isAromatic_0(sharedRing) ? 64 : 6;
        }
        angle[angles++] = this.getBondAngle_0(atom, connAtom);
      }
    }
    bondAngle[0] = this.getBondAngle_0(this.mBondAtom[0][bond], this.mBondAtom[1][bond]);
    if (bondAngle[0] < 0) {
      bondAngle[1] = bondAngle[0] + 3.141592653589793;
      changed = false;
    } else {
      bondAngle[1] = bondAngle[0];
      bondAngle[0] = bondAngle[1] - 3.141592653589793;
      changed = true;
    }
    side = 0;
    for (i = 0; i < angles; i++) {
      if (angle[i] > bondAngle[0] && angle[i] < bondAngle[1])
        side -= value_0[i];
      else
        side += value_0[i];
    }
    return changed ? -side : side;
  };
  _.getRingSet_0 = function getRingSet() {
    this.ensureHelperArrays_0(7);
    return this.mRingSet;
  };
  _.getRotatableBondCount_0 = function getRotatableBondCount() {
    var atom1, atom2, bond, connAtom, connBond, i, isRotatable, j, rCount;
    rCount = 0;
    this.ensureHelperArrays_0(7);
    for (bond = 0; bond < this.mBonds; bond++) {
      if (this.getBondOrder_0(bond) == 1 && !this.isRingBond_0(bond)) {
        isRotatable = true;
        for (i = 0; i < 2; i++) {
          atom1 = this.mBondAtom[i][bond];
          if (this.mConnAtoms[atom1] == 1) {
            isRotatable = false;
            break;
          }
          if (this.mAtomicNo[atom1] == 7 && !this.isAromaticAtom_0(atom1)) {
            atom2 = this.mBondAtom[1 - i][bond];
            for (j = 0; j < this.mConnAtoms[atom2]; j++) {
              connAtom = this.mConnAtom[atom2][j];
              connBond = this.mConnBond[atom2][j];
              if (connBond != bond && this.getBondOrder_0(connBond) > 1 && !this.isAromaticAtom_0(connAtom) && this.isElectronegative_0(connAtom)) {
                isRotatable = false;
                break;
              }
            }
          }
        }
        if (isRotatable && !this.isPseudoRotatableBond_0(bond))
          rCount++;
      }
    }
    return rCount;
  };
  _.getSecondOrderOrthoSubstituentCount = function getSecondOrderOrthoSubstituentCount(atom, otherBondAtom) {
    var connAtom, count, i, innerCount, j, nextConnAtom;
    count = 0;
    for (i = 0; i < this.mConnAtoms[atom]; i++) {
      connAtom = this.mConnAtom[atom][i];
      if (connAtom != otherBondAtom) {
        innerCount = 0;
        for (j = 0; j < this.mConnAtoms[connAtom]; j++) {
          nextConnAtom = this.mConnAtom[connAtom][j];
          if (nextConnAtom != atom && this.isAromaticBond_0(this.mConnBond[connAtom][j]) && this.mConnAtoms[nextConnAtom] > 2)
            innerCount++;
        }
        if (innerCount == 2)
          count++;
      }
    }
    return count;
  };
  _.getSortedConnMap = function getSortedConnMap(atom) {
    var connAtoms, i, i0, indexMap;
    connAtoms = this.mAllConnAtoms[atom];
    indexMap = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, connAtoms, 15, 1);
    for (i0 = 0; i0 < connAtoms; i0++)
      indexMap[i0] = (this.mConnAtom[atom][i0] << 16) + i0;
    ju.sort_3(indexMap);
    for (i = 0; i < connAtoms; i++)
      indexMap[i] &= 65535;
    return indexMap;
  };
  _.getStereoBond_0 = function getStereoBond(atom) {
    var i, j;
    this.ensureHelperArrays_0(1);
    if (this.mConnAtoms[atom] == 2 && this.mConnBondOrder[atom][0] == 2 && this.mConnBondOrder[atom][1] == 2) {
      for (i = 0; i < 2; i++)
        for (j = 0; j < this.mAllConnAtoms[this.mConnAtom[atom][i]]; j++)
          if (this.isStereoBond_1(this.mConnBond[this.mConnAtom[atom][i]][j], this.mConnAtom[atom][i]))
            return this.mConnBond[this.mConnAtom[atom][i]][j];
    } else {
      for (i = 0; i < this.mAllConnAtoms[atom]; i++)
        if (this.isStereoBond_1(this.mConnBond[atom][i], atom))
          return this.mConnBond[atom][i];
    }
    return -1;
  };
  _.getStereoBondScore = function getStereoBondScore(bond, atom) {
    if (this.getBondOrder_0(bond) != 1)
      return 0;
    return 16 - this.mAllConnAtoms[atom] + 16 * $wnd.Math.max(0, $wnd.Math.min(9, this.getBondRingSize_0(bond)) - 2) + ((this.mBondType[bond] & 384) == 0 || this.mBondAtom[0][bond] != atom ? 32768 : 0) + (this.getAtomParity_0(atom) == 0 ? 4096 : 0) + (this.mAtomicNo[atom] == 1 ? 2048 : 0) + (this.mAllConnAtoms[atom] == 1 ? 1024 : 0) + (!this.isRingBond_0(bond) ? 512 : 0) + (this.mAtomicNo[atom] != 6 ? 256 : 0);
  };
  _.getSubstituent_0 = function getSubstituent(coreAtom, firstAtom, isMemberAtom, substituent, atomMap) {
    var candidate, current, graphAtom, highest, i;
    this.ensureHelperArrays_0(1);
    if (isNotNull(substituent)) {
      substituent.clear_0();
      substituent.mIsFragment = false;
    }
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    if (jsEquals(isMemberAtom, null))
      isMemberAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 16, 1);
    else
      ju.fill_4(isMemberAtom, false);
    graphAtom[0] = coreAtom;
    graphAtom[1] = firstAtom;
    isMemberAtom[coreAtom] = true;
    isMemberAtom[firstAtom] = true;
    current = 1;
    highest = 1;
    while (current <= highest) {
      for (i = 0; i < this.mAllConnAtoms[graphAtom[current]]; i++) {
        candidate = this.mConnAtom[graphAtom[current]][i];
        if (candidate == coreAtom) {
          if (current != 1)
            return -1;
        }
        if (!isMemberAtom[candidate]) {
          isMemberAtom[candidate] = true;
          graphAtom[++highest] = candidate;
        }
      }
      current++;
    }
    if (isNotNull(substituent)) {
      if (jsEquals(atomMap, null))
        atomMap = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, isMemberAtom.length, 15, 1);
      this.copyMoleculeByAtoms_0(substituent, isMemberAtom, false, atomMap);
      substituent.changeAtom_0(atomMap[coreAtom], 0, 0, -1, 0);
    }
    isMemberAtom[coreAtom] = false;
    return highest;
  };
  _.getSubstituentSize_0 = function getSubstituentSize(coreAtom, firstAtom) {
    var candidate, current, graphAtom, highest, i, isMember;
    this.ensureHelperArrays_0(1);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAtoms, 15, 1);
    isMember = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mAtoms, 16, 1);
    graphAtom[0] = coreAtom;
    graphAtom[1] = firstAtom;
    isMember[coreAtom] = true;
    isMember[firstAtom] = true;
    current = 1;
    highest = 1;
    while (current <= highest) {
      for (i = 0; i < this.mConnAtoms[graphAtom[current]]; i++) {
        candidate = this.mConnAtom[graphAtom[current]][i];
        if (candidate == coreAtom) {
          if (current != 1)
            return -1;
        }
        if (!isMember[candidate]) {
          isMember[candidate] = true;
          graphAtom[++highest] = candidate;
        }
      }
      current++;
    }
    return highest;
  };
  _.getZNeighbour_0 = function getZNeighbour(connAtom, bond) {
    var atom1, atom2, conn, found, highConn, i, j, j0, lowConn, other1, parity;
    if (this.getBondOrder_0(bond) != 2 && !this.isAromaticBond_0(bond))
      return -1;
    parity = this.getBondParity_0(bond);
    if (parity != 1 && parity != 2)
      return -1;
    for (i = 0; i < 2; i++) {
      atom1 = this.mBondAtom[i][bond];
      atom2 = this.mBondAtom[1 - i][bond];
      other1 = -1;
      found = false;
      for (j0 = 0; j0 < this.mConnAtoms[atom1]; j0++) {
        conn = this.mConnAtom[atom1][j0];
        if (conn != atom2) {
          if (conn == connAtom)
            found = true;
          else
            other1 = conn;
        }
      }
      if (found) {
        lowConn = -1;
        highConn = -1;
        for (j = 0; j < this.mConnAtoms[atom2]; j++) {
          conn = this.mConnAtom[atom2][j];
          if (conn != atom1) {
            if (lowConn == -1)
              lowConn = conn;
            else if (conn > lowConn)
              highConn = conn;
            else {
              highConn = lowConn;
              lowConn = conn;
            }
          }
        }
        if (this.mConnAtoms[atom1] == 2) {
          if (this.mConnAtoms[atom2] == 2)
            return parity == 2 ? lowConn : -1;
          return parity == 2 ? lowConn : highConn;
        } else {
          if (this.mConnAtoms[atom2] == 2)
            return parity == 2 ^ connAtom < other1 ? -1 : lowConn;
          return parity == 2 ^ connAtom < other1 ? highConn : lowConn;
        }
      }
    }
    return -1;
  };
  _.handleHydrogens = function handleHydrogens() {
    var atom, atom1, atom2, bond, bond0, isHydrogen, isHydrogenBond, lastNonHAtom, lastNonHBond, temp;
    isHydrogen = this.findSimpleHydrogens();
    lastNonHAtom = this.mAllAtoms;
    do
      lastNonHAtom--;
    while (lastNonHAtom >= 0 && isHydrogen[lastNonHAtom]);
    for (atom = 0; atom < lastNonHAtom; atom++) {
      if (isHydrogen[atom]) {
        this.swapAtoms_0(atom, lastNonHAtom);
        temp = isHydrogen[atom];
        isHydrogen[atom] = isHydrogen[lastNonHAtom];
        isHydrogen[lastNonHAtom] = temp;
        do
          lastNonHAtom--;
        while (isHydrogen[lastNonHAtom]);
      }
    }
    this.mAtoms = lastNonHAtom + 1;
    if (this.mAllAtoms == this.mAtoms) {
      this.mBonds = this.mAllBonds;
      return;
    }
    isHydrogenBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mAllBonds, 16, 1);
    for (bond0 = 0; bond0 < this.mAllBonds; bond0++) {
      atom1 = this.mBondAtom[0][bond0];
      atom2 = this.mBondAtom[1][bond0];
      if (isHydrogen[atom1] || isHydrogen[atom2])
        isHydrogenBond[bond0] = true;
    }
    lastNonHBond = this.mAllBonds;
    do
      lastNonHBond--;
    while (lastNonHBond >= 0 && isHydrogenBond[lastNonHBond]);
    for (bond = 0; bond < lastNonHBond; bond++) {
      if (isHydrogenBond[bond]) {
        this.swapBonds_0(bond, lastNonHBond);
        isHydrogenBond[bond] = false;
        do
          lastNonHBond--;
        while (isHydrogenBond[lastNonHBond]);
      }
    }
    this.mBonds = lastNonHBond + 1;
  };
  _.hasNegativeNeighbour = function hasNegativeNeighbour(atom) {
    var i;
    for (i = 0; i < this.mConnAtoms[atom]; i++)
      if (this.mAtomCharge[this.mConnAtom[atom][i]] < 0)
        return true;
    return false;
  };
  _.hasPositiveNeighbour = function hasPositiveNeighbour(atom) {
    var i;
    for (i = 0; i < this.mConnAtoms[atom]; i++)
      if (this.mAtomCharge[this.mConnAtom[atom][i]] > 0)
        return true;
    return false;
  };
  _.isAlkaliMetal_0 = function isAlkaliMetal(atom) {
    var atomicNo;
    atomicNo = this.mAtomicNo[atom];
    return atomicNo == 3 || atomicNo == 11 || atomicNo == 19 || atomicNo == 37 || atomicNo == 55 || atomicNo == 87;
  };
  _.isAllylicAtom_0 = function isAllylicAtom(atom) {
    return (this.mAtomFlags[atom] & 4096) != 0;
  };
  _.isAmideTypeBond_0 = function isAmideTypeBond(bond) {
    var atom1, atom2, connAtom, connBond, i, j;
    this.ensureHelperArrays_0(1);
    for (i = 0; i < 2; i++) {
      atom1 = this.mBondAtom[i][bond];
      if (this.mAtomicNo[atom1] == 7) {
        atom2 = this.mBondAtom[1 - i][bond];
        for (j = 0; j < this.mConnAtoms[atom2]; j++) {
          connAtom = this.mConnAtom[atom2][j];
          connBond = this.mConnBond[atom2][j];
          if ((this.mAtomicNo[connAtom] == 7 || this.mAtomicNo[connAtom] == 8 || this.mAtomicNo[connAtom] == 16) && this.getBondOrder_0(connBond) >= 2)
            return true;
        }
      }
    }
    return false;
  };
  _.isAromaticAtom_0 = function isAromaticAtom_0(atom) {
    return atom < this.mAtoms ? this.mRingSet.isAromaticAtom_0(atom) : false;
  };
  _.isAromaticBond_0 = function isAromaticBond_0(bond) {
    return bond < this.mBonds && this.mRingSet.isAromaticBond_0(bond);
  };
  _.isBINAPChiralityBond_0 = function isBINAPChiralityBond(bond) {
    var atom1, atom2, orthoSubstituentCount1, orthoSubstituentCount2, secondOrderOrthoSubstituentCount1, secondOrderOrthoSubstituentCount2;
    if (this.mBondType[bond] != 1 || this.isAromaticBond_0(bond) || this.isRingBond_0(bond) && this.getBondRingSize_0(bond) < 7)
      return false;
    atom1 = this.mBondAtom[0][bond];
    if (!this.isAromaticAtom_0(atom1) || this.getAtomRingSize_0(atom1) < 5)
      return false;
    atom2 = this.mBondAtom[1][bond];
    if (!this.isAromaticAtom_0(atom2) || this.getAtomRingSize_0(atom2) < 5)
      return false;
    orthoSubstituentCount1 = this.getOrthoSubstituentCount(atom1, atom2);
    orthoSubstituentCount2 = this.getOrthoSubstituentCount(atom2, atom1);
    if (this.getAtomRingSize_0(atom1) > 5 && this.getAtomRingSize_0(atom2) > 5)
      return orthoSubstituentCount1 + orthoSubstituentCount2 > 2;
    secondOrderOrthoSubstituentCount1 = this.getSecondOrderOrthoSubstituentCount(atom1, atom2);
    secondOrderOrthoSubstituentCount2 = this.getSecondOrderOrthoSubstituentCount(atom2, atom1);
    if (orthoSubstituentCount1 == 2 && secondOrderOrthoSubstituentCount2 >= 1)
      return true;
    if (orthoSubstituentCount2 == 2 && secondOrderOrthoSubstituentCount1 >= 1)
      return true;
    if (secondOrderOrthoSubstituentCount1 == 2 && (orthoSubstituentCount2 >= 1 || secondOrderOrthoSubstituentCount2 >= 1))
      return true;
    if (secondOrderOrthoSubstituentCount2 == 2 && (orthoSubstituentCount1 >= 1 || secondOrderOrthoSubstituentCount1 >= 1))
      return true;
    return false;
  };
  _.isCentralAlleneAtom = function isCentralAlleneAtom(atom) {
    return this.mPi[atom] == 2 && this.mConnAtoms[atom] == 2 && this.mConnBondOrder[atom][0] == 2 && this.mConnBondOrder[atom][1] == 2 && this.mAtomicNo[atom] <= 7;
  };
  _.isChalcogene_0 = function isChalcogene(atom) {
    var atomicNo;
    atomicNo = this.mAtomicNo[atom];
    return atomicNo == 8 || atomicNo == 16 || atomicNo == 34 || atomicNo == 52 || atomicNo == 84;
  };
  _.isDelocalizedAtom = function isDelocalizedAtom(atom) {
    return atom < this.mAtoms && this.mRingSet.isDelocalizedAtom(atom);
  };
  _.isDelocalizedBond_0 = function isDelocalizedBond_1(bond) {
    return bond < this.mBonds && (this.mRingSet.isDelocalizedBond_0(bond) || this.mBondType[bond] == 8);
  };
  _.isEarthAlkaliMetal_0 = function isEarthAlkaliMetal(atom) {
    var atomicNo;
    atomicNo = this.mAtomicNo[atom];
    return atomicNo == 4 || atomicNo == 12 || atomicNo == 20 || atomicNo == 38 || atomicNo == 56 || atomicNo == 88;
  };
  _.isFlatNitrogen_0 = function isFlatNitrogen(atom) {
    return this.isFlatNitrogen_1(atom, true);
  };
  _.isFlatNitrogen_1 = function isFlatNitrogen_0(atom, checkForPyramidalBridgeHead) {
    var atomicNo, connAtom, hasCompetitor, heteroCount, i, i0, i1, isStabilized, j, j0, nitrogenNeighbourCount, ortho, orthoSubstituentCount;
    if (this.mAtomicNo[atom] != 7 || this.mConnAtoms[atom] == 4)
      return false;
    if (this.isAromaticAtom_0(atom) || this.mPi[atom] != 0 || neq(and_0(this.mAtomQueryFeatures[atom], 268435456), 0))
      return true;
    if (this.mAtomCharge[atom] == 1)
      return false;
    for (i0 = 0; i0 < this.mConnAtoms[atom]; i0++)
      if (this.getBondRingSize_0(this.mConnBond[atom][i0]) == 3)
        return false;
    heteroCount = 0;
    for (i1 = 0; i1 < this.mConnAtoms[atom]; i1++) {
      if (this.mConnBondOrder[atom][i1] == 1) {
        atomicNo = this.mAtomicNo[this.mConnAtom[atom][i1]];
        if (atomicNo == 8 || atomicNo == 9 || atomicNo == 17)
          heteroCount++;
      }
    }
    if (heteroCount == 0) {
      for (i = 0; i < this.mConnAtoms[atom]; i++) {
        connAtom = this.mConnAtom[atom][i];
        if (this.mPi[connAtom] != 0) {
          if (this.isAromaticAtom_0(connAtom)) {
            if (this.getAtomRingSize_0(connAtom) >= 5) {
              orthoSubstituentCount = 0;
              for (j0 = 0; j0 < this.mConnAtoms[connAtom]; j0++) {
                ortho = this.mConnAtom[connAtom][j0];
                if (ortho != atom && this.getNonHydrogenNeighbourCount_0(ortho) >= 3)
                  orthoSubstituentCount++;
              }
              nitrogenNeighbourCount = this.getNonHydrogenNeighbourCount_0(atom);
              if (orthoSubstituentCount == 2 && nitrogenNeighbourCount >= 2 || orthoSubstituentCount == 1 && nitrogenNeighbourCount == 3)
                continue;
            }
            return !checkForPyramidalBridgeHead || !this.isPyramidalBridgeHead(atom);
          }
          for (j = 0; j < this.mConnAtoms[connAtom]; j++) {
            if (this.mConnBondOrder[connAtom][j] == 2 || this.isAromaticBond_0(this.mConnBond[connAtom][j]))
              return !checkForPyramidalBridgeHead || !this.isPyramidalBridgeHead(atom);
          }
        }
      }
    }
    if (heteroCount < 2) {
      for (i = 0; i < this.mConnAtoms[atom]; i++) {
        connAtom = this.mConnAtom[atom][i];
        isStabilized = false;
        hasCompetitor = false;
        for (j = 0; j < this.mConnAtoms[connAtom]; j++) {
          if (this.mConnAtom[connAtom][j] != atom) {
            if (this.mConnBondOrder[connAtom][j] != 1 && (this.mAtomicNo[this.mConnAtom[connAtom][j]] == 7 || this.mAtomicNo[this.mConnAtom[connAtom][j]] == 8 || this.mAtomicNo[this.mConnAtom[connAtom][j]] == 16))
              isStabilized = true;
            if (this.mConnBondOrder[connAtom][j] == 1 && this.mAtomicNo[this.mConnAtom[connAtom][j]] == 7)
              hasCompetitor = true;
          }
        }
        if (isStabilized && (!hasCompetitor || heteroCount == 0))
          return !checkForPyramidalBridgeHead || !this.isPyramidalBridgeHead(atom);
      }
    }
    return false;
  };
  _.isHalogene_0 = function isHalogene(atom) {
    var atomicNo;
    atomicNo = this.mAtomicNo[atom];
    return atomicNo == 9 || atomicNo == 17 || atomicNo == 35 || atomicNo == 53 || atomicNo == 85;
  };
  _.isHeteroAromaticAtom = function isHeteroAromaticAtom(atom) {
    return atom < this.mAtoms ? this.mRingSet.isHeteroAromaticAtom(atom) : false;
  };
  _.isNitrogenFamily_0 = function isNitrogenFamily(atom) {
    var atomicNo;
    atomicNo = this.mAtomicNo[atom];
    return atomicNo == 7 || atomicNo == 15 || atomicNo == 33;
  };
  _.isPseudoRotatableBond_0 = function isPseudoRotatableBond(bond) {
    var atom, connAtom, connBond, i, j, rearAtom;
    if (this.getBondOrder_0(bond) != 1)
      return false;
    for (i = 0; i < 2; i++) {
      atom = this.mBondAtom[i][bond];
      rearAtom = this.mBondAtom[1 - i][bond];
      while (this.mPi[atom] == 2 && this.mConnAtoms[atom] == 2 && this.mAtomicNo[atom] < 10) {
        for (j = 0; j < 2; j++) {
          connAtom = this.mConnAtom[atom][j];
          if (connAtom != rearAtom) {
            if (this.mConnAtoms[connAtom] == 1)
              return true;
            connBond = this.mConnBond[atom][j];
            if (this.getBondOrder_0(connBond) == 1 && connBond < bond)
              return true;
            rearAtom = atom;
            atom = connAtom;
            break;
          }
        }
      }
      if (this.mConnAtoms[atom] == 1)
        return true;
    }
    return false;
  };
  _.isPyramidEnforcingBridge = function isPyramidEnforcingBridge(atom, ringNo, firstBridgeAtom, firstBridgeBond) {
    var bondCountToBridgeHead, bridgeAtomCount, bridgeHead, bridgeHeadIsFlat, bridgeHeadMayInvert, i, neglectBond, pathAtom, pathLength, potentialOtherBridgeHead, potentialOtherBridgeHeadIndex, ringAtom, smallestRingSize;
    neglectBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mBonds, 16, 1);
    neglectBond[firstBridgeBond] = true;
    pathAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 11, 15, 1);
    pathLength = this.getPath_0(pathAtom, firstBridgeAtom, atom, 10, neglectBond);
    if (pathLength == -1)
      return false;
    bridgeAtomCount = 1;
    while (!this.mRingSet.isAtomMember_0(ringNo, pathAtom[bridgeAtomCount]))
      bridgeAtomCount++;
    bondCountToBridgeHead = pathLength - bridgeAtomCount;
    bridgeHead = pathAtom[bridgeAtomCount];
    smallestRingSize = this.mRingSet.getRingSize_0(ringNo);
    if (smallestRingSize == 6 && bondCountToBridgeHead == 2 && bridgeAtomCount == 3) {
      if (this.getAtomRingBondCount_0(pathAtom[1]) >= 3) {
        ringAtom = this.mRingSet.getRingAtoms_0(ringNo);
        for (i = 0; i < 6; i++) {
          if (atom == ringAtom[i]) {
            potentialOtherBridgeHeadIndex = this.mRingSet.validateMemberIndex_0(ringNo, bridgeHead == ringAtom[this.mRingSet.validateMemberIndex_0(ringNo, i + 2)] ? i - 2 : i + 2);
            potentialOtherBridgeHead = ringAtom[potentialOtherBridgeHeadIndex];
            if (this.getAtomRingBondCount_0(potentialOtherBridgeHead) >= 3 && this.getPathLength_1(pathAtom[1], potentialOtherBridgeHead, 2, null) == 2)
              return true;
            break;
          }
        }
      }
    }
    bridgeHeadIsFlat = this.getAtomPi_0(bridgeHead) == 1 || this.isAromaticAtom_0(bridgeHead) || this.isFlatNitrogen_1(bridgeHead, false);
    bridgeHeadMayInvert = !bridgeHeadIsFlat && this.getAtomicNo_0(bridgeHead) == 7 && this.getAtomCharge_0(bridgeHead) != 1;
    if (bondCountToBridgeHead == 1)
      return !bridgeHeadIsFlat && !bridgeHeadMayInvert && smallestRingSize <= 4 && bridgeAtomCount <= 3;
    switch (smallestRingSize) {
      case 4:
        if (!bridgeHeadIsFlat && !bridgeHeadMayInvert && bridgeAtomCount <= 4)
          return true;
        break;
      case 5:
        if (bridgeHeadMayInvert) {
          if (bridgeAtomCount <= 3)
            return true;
        } else if (!bridgeHeadIsFlat) {
          if (bridgeAtomCount <= 4)
            return true;
        }
        break;
      case 6:
        if (bondCountToBridgeHead == 2) {
          if (bridgeHeadIsFlat) {
            if (bridgeAtomCount <= 4)
              return true;
          } else if (!bridgeHeadMayInvert) {
            if (bridgeAtomCount <= 3)
              return true;
          }
        } else if (bondCountToBridgeHead == 3) {
          if (bridgeHeadIsFlat) {
            if (bridgeAtomCount <= 6)
              return true;
          } else {
            if (bridgeAtomCount <= 4)
              return true;
          }
        }
        break;
      case 7:
        if (bondCountToBridgeHead == 3) {
          if (bridgeAtomCount <= 3)
            return true;
        }
        break;
    }
    return false;
  };
  _.isPyramidalBridgeHead = function isPyramidalBridgeHead(atom) {
    var connBond, i, smallRingNo, smallRingSize;
    if (this.isAromaticAtom_0(atom) || this.mPi[atom] != 0 || neq(and_0(this.mAtomQueryFeatures[atom], 268435456), 0) || this.getAtomRingBondCount_0(atom) < 3)
      return false;
    smallRingSize = this.getAtomRingSize_0(atom);
    if (smallRingSize > 7)
      return false;
    smallRingNo = 0;
    while (smallRingNo < this.mRingSet.getSize_0()) {
      if (this.mRingSet.getRingSize_0(smallRingNo) == smallRingSize && this.mRingSet.isAtomMember_0(smallRingNo, atom))
        break;
      smallRingNo++;
    }
    if (smallRingNo >= 1024 && smallRingNo == this.mRingSet.getSize_0())
      return false;
    for (i = 0; i < this.mConnAtoms[atom]; i++) {
      connBond = this.mConnBond[atom][i];
      if (!this.mRingSet.isBondMember_0(smallRingNo, connBond) && this.isPyramidEnforcingBridge(atom, smallRingNo, this.mConnAtom[atom][i], connBond))
        return true;
    }
    return false;
  };
  _.isRingAtom_0 = function isRingAtom(atom) {
    return (this.mAtomFlags[atom] & 3072) != 0;
  };
  _.isRingBond_0 = function isRingBond(bond) {
    return (this.mBondFlags[bond] & 64) != 0;
  };
  _.isSimpleHydrogen_0 = function isSimpleHydrogen_0(atom) {
    return this.mAtomicNo[atom] == 1 && this.mAtomMass[atom] == 0 && this.mAtomCharge[atom] == 0 && (this.mAtomFlags[atom] & 2013265920) == 0 && (jsEquals(this.mAtomCustomLabel, null) || jsEquals(this.mAtomCustomLabel[atom], null));
  };
  _.isSmallRingAtom_0 = function isSmallRingAtom(atom) {
    return (this.mAtomFlags[atom] & 8) != 0;
  };
  _.isSmallRingBond_0 = function isSmallRingBond_0(bond) {
    return (this.mBondFlags[bond] & 128) != 0;
  };
  _.isStabilizedAtom_0 = function isStabilizedAtom(atom) {
    return (this.mAtomFlags[atom] & 8192) != 0;
  };
  _.normalizeAmbiguousBonds_0 = function normalizeAmbiguousBonds() {
    var atom, atom0, bond, bondDeleted, connAtom, connBond, found, i, valence;
    this.ensureHelperArrays_0(1);
    this.normalizeExplicitlyDelocalizedBonds();
    found = false;
    for (atom0 = 0; atom0 < this.mAtoms; atom0++) {
      if (this.mAtomicNo[atom0] == 7 && this.mAtomCharge[atom0] == 0) {
        valence = this.getOccupiedValence_0(atom0);
        if (valence == 4) {
          for (i = 0; i < this.mConnAtoms[atom0]; i++) {
            connAtom = this.mConnAtom[atom0][i];
            if (this.mConnBondOrder[atom0][i] == 1 && this.mAtomicNo[connAtom] == 8 && this.mConnAtoms[connAtom] == 1 && this.mAtomCharge[connAtom] == 0) {
              found = true;
              this.mAtomCharge[atom0]++;
              this.mAtomCharge[connAtom]--;
              break;
            }
          }
        } else if (valence == 5) {
          for (i = 0; i < this.mConnAtoms[atom0]; i++) {
            connAtom = this.mConnAtom[atom0][i];
            connBond = this.mConnBond[atom0][i];
            if (this.mConnBondOrder[atom0][i] == 2 && this.mAtomicNo[connAtom] == 8) {
              found = true;
              this.mAtomCharge[atom0]++;
              this.mAtomCharge[connAtom]--;
              this.mBondType[connBond] = 1;
              break;
            }
            if (this.mConnBondOrder[atom0][i] == 3 && this.mAtomicNo[connAtom] == 7) {
              found = true;
              this.mAtomCharge[atom0]++;
              this.mAtomCharge[connAtom]--;
              this.mBondType[connBond] = 2;
              break;
            }
          }
        }
      }
    }
    bondDeleted = false;
    for (bond = 0; bond < this.mBonds; bond++) {
      for (i = 0; i < 2; i++) {
        if (this.isElectronegative_0(this.mBondAtom[i][bond])) {
          atom = this.mBondAtom[1 - i][bond];
          if (this.isAlkaliMetal_0(atom) || this.isEarthAlkaliMetal_0(atom)) {
            if (this.getBondOrder_0(bond) == 1) {
              this.mAtomCharge[atom]++;
              this.mAtomCharge[this.mBondAtom[i][bond]]--;
              this.mBondType[bond] = 512;
              bondDeleted = true;
            } else if (this.mBondType[bond] == 16) {
              this.mBondType[bond] = 512;
              bondDeleted = true;
            }
          }
          break;
        }
      }
    }
    if (bondDeleted) {
      this.compressMolTable();
      found = true;
    }
    if (found)
      this.mValidHelperArrays = 0;
    return found;
  };
  _.normalizeExplicitlyDelocalizedBonds = function normalizeExplicitlyDelocalizedBonds() {
    var bond;
    for (bond = 0; bond < this.mBonds; bond++)
      if (this.mBondType[bond] == 8)
        return new carc2.AromaticityResolver(this).locateDelocalizedDoubleBonds(null);
    return false;
  };
  _.preferredAlleneStereoBond = function preferredAlleneStereoBond(atom, excludeStereoBonds) {
    var alleneAtom, bestScore, connAtom, connBond, i, j, preferredBond, score;
    preferredBond = -1;
    bestScore = 0;
    for (i = 0; i < 2; i++) {
      alleneAtom = this.mConnAtom[atom][i];
      for (j = 0; j < this.mAllConnAtoms[alleneAtom]; j++) {
        connAtom = this.mConnAtom[alleneAtom][j];
        if (connAtom != atom) {
          connBond = this.mConnBond[alleneAtom][j];
          score = this.getStereoBondScore(connBond, connAtom);
          if (bestScore < score && (!excludeStereoBonds || !this.isStereoBond_0(connBond))) {
            bestScore = score;
            preferredBond = connBond;
          }
        }
      }
    }
    return preferredBond;
  };
  _.preferredBinapStereoBond = function preferredBinapStereoBond(bond) {
    var atom, bestScore, connAtom, connBond, i, j, preferredBond, score;
    preferredBond = -1;
    bestScore = 0;
    for (i = 0; i < 2; i++) {
      atom = this.mBondAtom[i][bond];
      for (j = 0; j < this.mAllConnAtoms[atom]; j++) {
        connAtom = this.mConnAtom[atom][j];
        if (connAtom != this.mBondAtom[1 - i][bond]) {
          connBond = this.mConnBond[atom][j];
          score = this.getStereoBondScore(connBond, connAtom);
          if (bestScore < score) {
            bestScore = score;
            preferredBond = connBond;
          }
        }
      }
    }
    return preferredBond;
  };
  _.preferredTHStereoBond = function preferredTHStereoBond(atom, excludeStereoBonds) {
    var allConnAtoms, angle, angleDistanceSum1, angleDistanceSum2, bestScore, bond, connAtom, connBond, i, i0, i1, j, k, preferredBond, score;
    allConnAtoms = this.mAllConnAtoms[atom];
    angle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, allConnAtoms, 15, 1);
    for (i0 = 0; i0 < allConnAtoms; i0++)
      angle[i0] = this.getBondAngle_0(atom, this.mConnAtom[atom][i0]);
    for (i1 = 1; i1 < allConnAtoms; i1++) {
      for (j = 0; j < i1; j++) {
        if (this.bondsAreParallel(angle[i1], angle[j])) {
          angleDistanceSum1 = 0;
          angleDistanceSum2 = 0;
          for (k = 0; k < allConnAtoms; k++) {
            if (k != i1 && k != j) {
              angleDistanceSum1 += $wnd.Math.abs(caru.difference(angle[i1], angle[k]));
              angleDistanceSum2 += $wnd.Math.abs(caru.difference(angle[j], angle[k]));
            }
          }
          bond = angleDistanceSum1 < angleDistanceSum2 ? this.mConnBond[atom][i1] : this.mConnBond[atom][j];
          if (this.getBondOrder_0(bond) == 1 && (!excludeStereoBonds || !this.isStereoBond_0(bond)))
            return bond;
        }
      }
    }
    preferredBond = -1;
    bestScore = 0;
    for (i = 0; i < allConnAtoms; i++) {
      connAtom = this.mConnAtom[atom][i];
      connBond = this.mConnBond[atom][i];
      score = this.getStereoBondScore(connBond, connAtom);
      if (bestScore < score && (!excludeStereoBonds || !this.isStereoBond_0(connBond))) {
        bestScore = score;
        preferredBond = connBond;
      }
    }
    return preferredBond;
  };
  _.removeExplicitHydrogens_0 = function removeExplicitHydrogens(hasValid2DCoords) {
    var abnormalValence, atom, atom0, explicitAbnormalValence, newAbnormalValence, removedStereoBond;
    this.ensureHelperArrays_0(hasValid2DCoords ? 15 : 1);
    this.mAllAtoms = this.mAtoms;
    this.mAllBonds = this.mBonds;
    removedStereoBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mAtoms, 16, 1);
    for (atom0 = 0; atom0 < this.mAtoms; atom0++) {
      if (this.mAllConnAtoms[atom0] != this.mConnAtoms[atom0]) {
        abnormalValence = this.getImplicitHigherValence_0(atom0, false);
        removedStereoBond[atom0] = this.mAllConnAtoms[atom0] == this.mConnAtoms[atom0] + 1 && this.isStereoBond_0(this.mConnBond[atom0][this.mConnAtoms[atom0]]);
        this.mAllConnAtoms[atom0] = this.mConnAtoms[atom0];
        if (abnormalValence != -1) {
          newAbnormalValence = this.getImplicitHigherValence_0(atom0, true);
          if (abnormalValence != newAbnormalValence) {
            explicitAbnormalValence = this.getAtomAbnormalValence_0(atom0);
            if (explicitAbnormalValence == -1 || explicitAbnormalValence < abnormalValence)
              this.setAtomAbnormalValence_0(atom0, abnormalValence);
          }
        }
      }
    }
    if (hasValid2DCoords) {
      for (atom = 0; atom < this.mAtoms; atom++)
        if (removedStereoBond[atom])
          this.setStereoBondFromAtomParity_0(atom);
    }
    this.mValidHelperArrays = 0;
  };
  _.rescueImplicitHigherValences = function rescueImplicitHigherValences(destMol, sourceAtomCount, atomMap) {
    var abnormalValence, atom, explicitAbnormalValence, newAbnormalValence;
    destMol.ensureHelperArrays_0(1);
    for (atom = 0; atom < sourceAtomCount; atom++) {
      if (atomMap[atom] != -1 && this.mAtomicNo[atom] != 1 && this.mAllConnAtoms[atom] != destMol.getAllConnAtoms_0(atomMap[atom])) {
        abnormalValence = this.getImplicitHigherValence_0(atom, false);
        if (abnormalValence != -1) {
          newAbnormalValence = destMol.getImplicitHigherValence_0(atomMap[atom], false);
          if (abnormalValence != newAbnormalValence) {
            explicitAbnormalValence = destMol.getAtomAbnormalValence_0(atomMap[atom]);
            if (explicitAbnormalValence == -1 || explicitAbnormalValence < abnormalValence)
              destMol.setAtomAbnormalValence_0(atomMap[atom], abnormalValence);
          }
        }
      }
    }
  };
  _.rescueStereoBonds = function rescueStereoBonds(destMol, sourceAtomCount, atomMap, bondMap) {
    var angle, angleDif, atom, destBond, i, i0, lostAtom, lostStereoBond, minAngleDif, minConnBond, remainingNeighbours;
    for (atom = 0; atom < sourceAtomCount; atom++) {
      if (atomMap[atom] != -1 && this.mAllConnAtoms[atom] > 3 && this.isAtomStereoCenter_0(atom)) {
        remainingNeighbours = 0;
        lostStereoBond = -1;
        lostAtom = -1;
        for (i0 = 0; i0 < this.mAllConnAtoms[atom]; i0++) {
          if (bondMap[this.mConnBond[atom][i0]] != -1)
            remainingNeighbours++;
          else if (this.mConnBondOrder[atom][i0] == 1 && this.isStereoBond_0(this.mConnBond[atom][i0]) && this.mBondAtom[0][this.mConnBond[atom][i0]] == atom) {
            lostStereoBond = this.mConnBond[atom][i0];
            lostAtom = this.mConnAtom[atom][i0];
          }
        }
        if (lostStereoBond != -1 && remainingNeighbours >= 3) {
          angle = this.getBondAngle_0(atom, lostAtom);
          minAngleDif = 10;
          minConnBond = -1;
          for (i = 0; i < this.mAllConnAtoms[atom]; i++) {
            if (this.mConnBondOrder[atom][i] == 1 && (!this.isStereoBond_0(this.mConnBond[atom][i]) || this.mBondAtom[0][this.mConnBond[atom][i]] == atom) && bondMap[this.mConnBond[atom][i]] != -1) {
              angleDif = $wnd.Math.abs(carc2.getAngleDif(angle, this.getBondAngle_0(atom, this.mConnAtom[atom][i])));
              if (minAngleDif > angleDif) {
                minAngleDif = angleDif;
                minConnBond = this.mConnBond[atom][i];
              }
            }
          }
          if (minConnBond != -1) {
            destBond = bondMap[minConnBond];
            destMol.setBondType_0(destBond, this.mBondType[minConnBond] == 257 ? 129 : 257);
            if (this.mBondAtom[0][minConnBond] != atom) {
              destMol.setBondAtom_0(1, destBond, atomMap[this.mBondAtom[0][minConnBond]]);
              destMol.setBondAtom_0(0, destBond, atomMap[atom]);
            }
          }
        }
      }
    }
  };
  _.setAlleneStereoBondFromParity = function setAlleneStereoBondFromParity(atom) {
    var alleneAngle, alleneAtom, angleDif, bestScore, connAtom, connBond, highPriorityAtom, hpAngleDif, i, i0, i1, i2, j, lpAngleDif, oppositeAlleneAtom, oppositeAtom, oppositeAtoms, preferredAlleneAtom, preferredAtom, preferredBond, score, temp;
    if (this.mConnAtoms[atom] != 2 || this.mConnBondOrder[atom][0] != 2 || this.mConnBondOrder[atom][1] != 2 || this.mConnAtoms[this.mConnAtom[atom][0]] < 2 || this.mConnAtoms[this.mConnAtom[atom][1]] < 2 || this.mPi[this.mConnAtom[atom][0]] != 1 || this.mPi[this.mConnAtom[atom][1]] != 1) {
      this.setAtomParity_0(atom, 0, false);
      return;
    }
    preferredBond = -1;
    preferredAtom = -1;
    preferredAlleneAtom = -1;
    oppositeAlleneAtom = -1;
    bestScore = 0;
    for (i0 = 0; i0 < 2; i0++) {
      alleneAtom = this.mConnAtom[atom][i0];
      for (j = 0; j < this.mAllConnAtoms[alleneAtom]; j++) {
        connAtom = this.mConnAtom[alleneAtom][j];
        if (connAtom != atom) {
          connBond = this.mConnBond[alleneAtom][j];
          score = this.getStereoBondScore(connBond, connAtom);
          if (bestScore < score) {
            bestScore = score;
            preferredAtom = connAtom;
            preferredBond = connBond;
            preferredAlleneAtom = alleneAtom;
            oppositeAlleneAtom = this.mConnAtom[atom][1 - i0];
          }
        }
      }
    }
    if (preferredAtom == -1)
      return;
    for (i1 = 0; i1 < 2; i1++) {
      alleneAtom = this.mConnAtom[atom][i1];
      for (j = 0; j < this.mAllConnAtoms[alleneAtom]; j++) {
        connAtom = this.mConnAtom[alleneAtom][j];
        connBond = this.mConnBond[alleneAtom][j];
        if (connAtom != atom && this.mBondAtom[0][connBond] == alleneAtom)
          this.mBondType[connBond] = 1;
      }
    }
    if (this.mBondAtom[1][preferredBond] != preferredAtom) {
      this.mBondAtom[0][preferredBond] = this.mBondAtom[1][preferredBond];
      this.mBondAtom[1][preferredBond] = preferredAtom;
    }
    highPriorityAtom = 2147483647;
    for (i2 = 0; i2 < this.mConnAtoms[preferredAlleneAtom]; i2++) {
      connAtom = this.mConnAtom[preferredAlleneAtom][i2];
      if (connAtom != atom && highPriorityAtom > connAtom)
        highPriorityAtom = connAtom;
    }
    oppositeAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    oppositeAtoms = 0;
    for (i = 0; i < this.mConnAtoms[oppositeAlleneAtom]; i++) {
      connAtom = this.mConnAtom[oppositeAlleneAtom][i];
      if (connAtom != atom)
        oppositeAtom[oppositeAtoms++] = connAtom;
    }
    alleneAngle = this.getBondAngle_0(atom, oppositeAlleneAtom);
    angleDif = 0;
    if (oppositeAtoms == 2) {
      if (oppositeAtom[0] > oppositeAtom[1]) {
        temp = oppositeAtom[0];
        oppositeAtom[0] = oppositeAtom[1];
        oppositeAtom[1] = temp;
      }
      hpAngleDif = carc2.getAngleDif(alleneAngle, this.getBondAngle_0(oppositeAlleneAtom, oppositeAtom[0]));
      lpAngleDif = carc2.getAngleDif(alleneAngle, this.getBondAngle_0(oppositeAlleneAtom, oppositeAtom[1]));
      angleDif = hpAngleDif - lpAngleDif;
    } else {
      angleDif = carc2.getAngleDif(alleneAngle, this.getBondAngle_0(oppositeAlleneAtom, oppositeAtom[0]));
    }
    if (angleDif < 0 ^ this.getAtomParity_0(atom) == 1 ^ highPriorityAtom == preferredAtom)
      this.mBondType[preferredBond] = 257;
    else
      this.mBondType[preferredBond] = 129;
  };
  _.setFisherProjectionStereoBondsFromParity = function setFisherProjectionStereoBondsFromParity(atom, sortedConnMap, angle) {
    var allConnAtoms, bond, bondType, direction, i, parity;
    allConnAtoms = this.mAllConnAtoms[atom];
    direction = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, allConnAtoms, 15, 1);
    parity = this.getFisherProjectionParity_0(atom, sortedConnMap, angle, direction);
    if (parity == 3)
      return false;
    bondType = this.getAtomParity_0(atom) == parity ? 257 : 129;
    for (i = 0; i < allConnAtoms; i++) {
      if ((direction[i] & 1) == 1) {
        bond = this.mConnBond[atom][sortedConnMap[i]];
        this.mBondType[bond] = bondType;
        if (this.mBondAtom[0][bond] != atom) {
          this.mBondAtom[1][bond] = this.mBondAtom[0][bond];
          this.mBondAtom[0][bond] = atom;
        }
      }
    }
    return true;
  };
  _.setParitiesValid_0 = function setParitiesValid(helperStereoBits) {
    this.mValidHelperArrays |= 248 & (8 | helperStereoBits);
  };
  _.setStereoBondFromAtomParity_0 = function setStereoBondFromAtomParity(atom) {
    var allConnAtoms, angle, bondType, i, i0, i1, i2, i3, inverted, order, preferredBond, preferredBondIndex, singleBondFound, sortedConnMap, up_down;
    this.convertStereoBondsToSingleBonds_0(atom);
    if (this.getAtomParity_0(atom) == 0 || this.getAtomParity_0(atom) == 3)
      return;
    if (this.mPi[atom] == 2 && this.mConnAtoms[atom] == 2) {
      this.setAlleneStereoBondFromParity(atom);
      return;
    }
    if (this.mConnAtoms[atom] < 3 || this.mConnAtoms[atom] > 4) {
      this.setAtomParity_0(atom, 0, false);
      return;
    }
    allConnAtoms = this.mAllConnAtoms[atom];
    singleBondFound = false;
    for (i0 = 0; i0 < allConnAtoms; i0++) {
      if (this.getBondOrder_0(this.mConnBond[atom][i0]) == 1) {
        singleBondFound = true;
        break;
      }
    }
    if (!singleBondFound)
      return;
    sortedConnMap = this.getSortedConnMap(atom);
    angle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, allConnAtoms, 15, 1);
    for (i1 = 0; i1 < allConnAtoms; i1++)
      angle[i1] = this.getBondAngle_0(this.mConnAtom[atom][sortedConnMap[i1]], atom);
    for (i2 = 0; i2 < allConnAtoms; i2++)
      if (this.mBondAtom[0][this.mConnBond[atom][i2]] == atom && this.getBondOrder_0(this.mConnBond[atom][i2]) == 1)
        this.mBondType[this.mConnBond[atom][i2]] = 1;
    if (this.getAtomRingSize_0(atom) <= 24 && this.setFisherProjectionStereoBondsFromParity(atom, sortedConnMap, angle))
      return;
    preferredBond = this.preferredTHStereoBond(atom, true);
    if (preferredBond == -1)
      return;
    if (this.mBondAtom[0][preferredBond] != atom) {
      this.mBondAtom[1][preferredBond] = this.mBondAtom[0][preferredBond];
      this.mBondAtom[0][preferredBond] = atom;
    }
    preferredBondIndex = -1;
    for (i3 = 0; i3 < allConnAtoms; i3++) {
      if (preferredBond == this.mConnBond[atom][sortedConnMap[i3]]) {
        preferredBondIndex = i3;
        break;
      }
    }
    up_down = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 2), { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 0, [stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [2, 1, 2, 1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 2, 2, 1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 1, 2, 2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [2, 1, 1, 2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [2, 2, 1, 1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 2, 1, 2])]);
    for (i = 1; i < allConnAtoms; i++)
      if (angle[i] < angle[0])
        angle[i] += 3.141592653589793 * 2;
    if (allConnAtoms == 3) {
      inverted = false;
      switch (preferredBondIndex) {
        case 0:
          inverted = angle[1] < angle[2] && angle[2] - angle[1] < 3.141592653589793 || angle[1] > angle[2] && angle[1] - angle[2] > 3.141592653589793;
          break;
        case 1:
          inverted = angle[2] - angle[0] > 3.141592653589793;
          break;
        case 2:
          inverted = angle[1] - angle[0] < 3.141592653589793;
          break;
      }
      bondType = this.getAtomParity_0(atom) == 1 ^ inverted ? 257 : 129;
    } else {
      order = 0;
      if (angle[1] <= angle[2] && angle[2] <= angle[3])
        order = 0;
      else if (angle[1] <= angle[3] && angle[3] <= angle[2])
        order = 1;
      else if (angle[2] <= angle[1] && angle[1] <= angle[3])
        order = 2;
      else if (angle[2] <= angle[3] && angle[3] <= angle[1])
        order = 3;
      else if (angle[3] <= angle[1] && angle[1] <= angle[2])
        order = 4;
      else if (angle[3] <= angle[2] && angle[2] <= angle[1])
        order = 5;
      bondType = this.getAtomParity_0(atom) == 1 ^ up_down[order][preferredBondIndex] == 1 ? 129 : 257;
    }
    this.mBondType[preferredBond] = bondType;
  };
  _.setStereoBondFromBondParity_0 = function setStereoBondFromBondParity(bond) {
    var angleDif, atom, bestScore, binapAngle, connAtom, connBond, highPriorityAtom, hpAngleDif, i, i0, i1, i2, j, lpAngleDif, oppositeAtom, oppositeAtoms, oppositeBINAPAtom, preferredAtom, preferredBINAPAtom, preferredBond, score, temp;
    if (this.getBondParity_0(bond) == 0 || this.getBondParity_0(bond) == 3 || !this.isBINAPChiralityBond_0(bond))
      return;
    preferredBond = -1;
    preferredAtom = -1;
    preferredBINAPAtom = -1;
    oppositeBINAPAtom = -1;
    bestScore = 0;
    for (i0 = 0; i0 < 2; i0++) {
      atom = this.mBondAtom[i0][bond];
      for (j = 0; j < this.mAllConnAtoms[atom]; j++) {
        connBond = this.mConnBond[atom][j];
        if (connBond != bond && this.getBondOrder_0(connBond) == 1) {
          connAtom = this.mConnAtom[atom][j];
          score = this.getStereoBondScore(connBond, connAtom);
          if (bestScore < score) {
            bestScore = score;
            preferredAtom = connAtom;
            preferredBond = connBond;
            preferredBINAPAtom = atom;
            oppositeBINAPAtom = this.mBondAtom[1 - i0][bond];
          }
        }
      }
    }
    if (preferredAtom == -1)
      return;
    for (i1 = 0; i1 < 2; i1++) {
      for (j = 0; j < this.mAllConnAtoms[this.mBondAtom[i1][bond]]; j++) {
        connBond = this.mConnBond[this.mBondAtom[i1][bond]][j];
        if (connBond != bond && this.getBondOrder_0(connBond) == 1)
          this.mBondType[connBond] = 1;
      }
    }
    if (this.mBondAtom[1][preferredBond] != preferredAtom) {
      this.mBondAtom[0][preferredBond] = this.mBondAtom[1][preferredBond];
      this.mBondAtom[1][preferredBond] = preferredAtom;
    }
    highPriorityAtom = 2147483647;
    for (i2 = 0; i2 < this.mConnAtoms[preferredBINAPAtom]; i2++) {
      connAtom = this.mConnAtom[preferredBINAPAtom][i2];
      if (this.mConnBond[preferredBINAPAtom][i2] != bond && highPriorityAtom > connAtom)
        highPriorityAtom = connAtom;
    }
    oppositeAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    oppositeAtoms = 0;
    for (i = 0; i < this.mConnAtoms[oppositeBINAPAtom]; i++)
      if (this.mConnBond[oppositeBINAPAtom][i] != bond)
        oppositeAtom[oppositeAtoms++] = this.mConnAtom[oppositeBINAPAtom][i];
    binapAngle = this.getBondAngle_0(preferredBINAPAtom, oppositeBINAPAtom);
    angleDif = 0;
    if (oppositeAtoms == 2) {
      if (oppositeAtom[0] > oppositeAtom[1]) {
        temp = oppositeAtom[0];
        oppositeAtom[0] = oppositeAtom[1];
        oppositeAtom[1] = temp;
      }
      hpAngleDif = carc2.getAngleDif(binapAngle, this.getBondAngle_0(oppositeBINAPAtom, oppositeAtom[0]));
      lpAngleDif = carc2.getAngleDif(binapAngle, this.getBondAngle_0(oppositeBINAPAtom, oppositeAtom[1]));
      angleDif = hpAngleDif - lpAngleDif;
    } else {
      angleDif = carc2.getAngleDif(binapAngle, this.getBondAngle_0(oppositeBINAPAtom, oppositeAtom[0]));
    }
    if (angleDif < 0 ^ this.getBondParity_0(bond) == 2 ^ highPriorityAtom == preferredAtom)
      this.mBondType[preferredBond] = 257;
    else
      this.mBondType[preferredBond] = 129;
  };
  _.setStereoBondsFromParity_0 = function setStereoBondsFromParity() {
    var atom, bond, bond0, bond1;
    this.ensureHelperArrays_0(7);
    for (bond0 = 0; bond0 < this.mBonds; bond0++)
      if (this.isStereoBond_0(bond0))
        this.mBondType[bond0] = 1;
    for (atom = 0; atom < this.mAtoms; atom++)
      this.setStereoBondFromAtomParity_0(atom);
    for (bond1 = 0; bond1 < this.mBonds; bond1++)
      this.setStereoBondFromBondParity_0(bond1);
    for (bond = 0; bond < this.mBonds; bond++)
      if (this.mBondType[bond] == 2 && this.getBondParity_0(bond) == 3)
        this.mBondType[bond] = 386;
  };
  _.shareSameFragment_0 = function shareSameFragment(atom1, atom2) {
    return this.getPathLength_0(atom1, atom2) != -1;
  };
  _.stripSmallFragments_0 = function stripSmallFragments(considerMetalBonds) {
    var atom, atom0, atomMap, bond, e, fragmentCount, fragmentNo, fragmentSize, i, largestFragment, largestSize;
    fragmentNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    fragmentCount = this.getFragmentNumbers_0(fragmentNo, false, considerMetalBonds);
    if (fragmentCount <= 1)
      return null;
    fragmentSize = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, fragmentCount, 15, 1);
    for (atom0 = 0; atom0 < this.mAtoms; atom0++)
      fragmentSize[fragmentNo[atom0]]++;
    largestFragment = 0;
    largestSize = fragmentSize[0];
    for (i = 1; i < fragmentCount; i++) {
      if (largestSize < fragmentSize[i]) {
        largestSize = fragmentSize[i];
        largestFragment = i;
      }
    }
    for (atom = 0; atom < this.mAllAtoms; atom++)
      if (fragmentNo[atom] != largestFragment)
        this.mAtomicNo[atom] = -1;
    for (bond = 0; bond < this.mAllBonds; bond++)
      if (!considerMetalBonds && this.mBondType[bond] == 16 || fragmentNo[this.mBondAtom[0][bond]] != largestFragment)
        this.mBondType[bond] = 512;
    atomMap = this.compressMolTable();
    this.mValidHelperArrays = 0;
    try {
      this.canonizeCharge_1(true, true);
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 12)) {
        e = $e0;
      } else
        throw toJs($e0);
    }
    return atomMap;
  };
  _.supportsImplicitHydrogen_0 = function supportsImplicitHydrogen(atom) {
    if ((this.mAtomFlags[atom] & 2013265920) != 0)
      return true;
    if (this.mAtomicNo[atom] <= 1)
      return false;
    return this.isOrganicAtom_0(atom) || this.mAtomicNo[atom] == 13 || this.mAtomicNo[atom] >= 171;
  };
  _.validate_0 = function validate() {
    var allCharge, atom, atom1, atom2, avbl, minDistanceSquare, xdif, ydif, zdif;
    avbl = this.getAverageBondLength_0();
    minDistanceSquare = avbl * avbl / 16;
    for (atom1 = 1; atom1 < this.mAllAtoms; atom1++) {
      for (atom2 = 0; atom2 < atom1; atom2++) {
        xdif = this.mCoordinates[atom2].x_0 - this.mCoordinates[atom1].x_0;
        ydif = this.mCoordinates[atom2].y_0 - this.mCoordinates[atom1].y_0;
        zdif = this.mCoordinates[atom2].z_0 - this.mCoordinates[atom1].z_0;
        if (xdif * xdif + ydif * ydif + zdif * zdif < minDistanceSquare)
          throw toJs(new jl.Exception_1("The distance between two atoms is too close."));
      }
    }
    this.ensureHelperArrays_0(1);
    allCharge = 0;
    for (atom = 0; atom < this.mAtoms; atom++) {
      if (this.getOccupiedValence_0(atom) > this.getMaxValence_0(atom))
        throw toJs(new jl.Exception_1("atom valence exceeded"));
      allCharge += this.mAtomCharge[atom];
    }
    if (allCharge != 0)
      throw toJs(new jl.Exception_1("unbalanced atom charge"));
  };
  _.validateAtomQueryFeatures = function validateAtomQueryFeatures() {
    var atom;
    if (!this.mIsFragment)
      return;
    this.ensureHelperArrays_0(7);
    for (atom = 0; atom < this.mAtoms; atom++) {
      if (this.isRingAtom_0(atom)) {
        if (eq(and_0(this.mAtomQueryFeatures[atom], 120), 8))
          this.mAtomQueryFeatures[atom] = and_0(this.mAtomQueryFeatures[atom], not_0(8));
        this.mAtomQueryFeatures[atom] = and_0(this.mAtomQueryFeatures[atom], not_0(4294967296));
      }
      if (this.isAromaticAtom_0(atom))
        this.mAtomQueryFeatures[atom] = and_0(this.mAtomQueryFeatures[atom], not_0({ l: 6, m: 0, h: 4 }));
      else if (neq(and_0(this.mAtomQueryFeatures[atom], 2), 0))
        this.mAtomQueryFeatures[atom] = and_0(this.mAtomQueryFeatures[atom], not_0(4));
      if (neq(and_0(this.mAtomQueryFeatures[atom], 29360128), 0) || neq(and_0(this.mAtomQueryFeatures[atom], 545460846592), 0) && eq(and_0(this.mAtomQueryFeatures[atom], 4294967296), 0)) {
        if (eq(and_0(this.mAtomQueryFeatures[atom], 120), 8))
          this.mAtomQueryFeatures[atom] = and_0(this.mAtomQueryFeatures[atom], not_0(8));
      }
      if (this.mAtomCharge[atom] != 0)
        this.mAtomQueryFeatures[atom] = and_0(this.mAtomQueryFeatures[atom], not_0(234881024));
      if (this.getOccupiedValence_0(atom) == this.getMaxValence_0(atom)) {
        this.mAtomQueryFeatures[atom] = and_0(this.mAtomQueryFeatures[atom], not_0(4063232));
        this.mAtomQueryFeatures[atom] = and_0(this.mAtomQueryFeatures[atom], not_0(17042430230528));
        this.mAtomQueryFeatures[atom] = and_0(this.mAtomQueryFeatures[atom], not_0(1920));
        this.mAtomQueryFeatures[atom] = and_0(this.mAtomQueryFeatures[atom], not_0(114688));
      }
      if (this.isExcludeGroupAtom(atom) && this.mAtomMapNo[atom] != 0)
        this.removeMappingNo(this.mAtomMapNo[atom]);
    }
  };
  _.validateBondQueryFeatures = function validateBondQueryFeatures() {
    var bond, bondType, bondTypeQFCount;
    if (!this.mIsFragment)
      return;
    this.ensureHelperArrays_0(7);
    for (bond = 0; bond < this.mBonds; bond++) {
      bondTypeQFCount = bitCount_1(this.mBondQueryFeatures[bond] & 127);
      if (this.isDelocalizedBond_0(bond) & (this.mBondQueryFeatures[bond] & 8) != 0) {
        this.mBondQueryFeatures[bond] &= ~8;
        bondTypeQFCount--;
      }
      if (bondTypeQFCount != 0) {
        bondType = this.mBondType[bond] & 127;
        if (bondType == 1)
          this.mBondQueryFeatures[bond] |= 1;
        else if (bondType == 2)
          this.mBondQueryFeatures[bond] |= 2;
        else if (bondType == 4)
          this.mBondQueryFeatures[bond] |= 4;
        else if (bondType == 32)
          this.mBondQueryFeatures[bond] |= 32;
        else if (bondType == 64)
          this.mBondQueryFeatures[bond] |= 64;
        else if (bondType == 16)
          this.mBondQueryFeatures[bond] |= 16;
        else if (bondType == 8)
          this.mBondQueryFeatures[bond] |= 8;
      }
    }
  };
  _.validateBondType = function validateBondType_0(bond, type_0) {
    var ok;
    ok = getClassPrototype(60).validateBondType.call(this, bond, type_0);
    if (ok && type_0 == 386) {
      this.ensureHelperArrays_0(7);
      ok = ok & !this.isSmallRingBond_0(bond);
    }
    return ok;
  };
  _.mAtoms = 0;
  _.mBonds = 0;
  carc2.FISCHER_PROJECTION_LIMIT = 0;
  carc2.FISCHER_PROJECTION_RING_LIMIT = 24;
  carc2.cMaxConnAtoms = 16;
  carc2.serialVersionUID_2 = 537316094;
  cggl.Lcom_actelion_research_chem_ExtendedMolecule_2_classLit = createForClass("com.actelion.research.chem", "ExtendedMolecule", 150, cggl.Lcom_actelion_research_chem_Molecule_2_classLit);
  carc2.$clinit_IDCodeParserWithoutCoordinateInvention = function $clinit_IDCodeParserWithoutCoordinateInvention() {
    carc2.$clinit_IDCodeParserWithoutCoordinateInvention = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.IDCodeParserWithoutCoordinateInvention = function IDCodeParserWithoutCoordinateInvention() {
    carc2.$clinit_IDCodeParserWithoutCoordinateInvention();
    Object_0.call(this);
    this.$init_31();
  };
  defineClass(252, 1, { 1: 1 }, carc2.IDCodeParserWithoutCoordinateInvention);
  _.$init_31 = function $init_31() {
  };
  _.decodeAVBL = function decodeAVBL(value_0, binCount) {
    return $wnd.Math.pow(10, jl.log10(200 / 0.1) * value_0 / (binCount - 1) - 1);
  };
  _.decodeBits = function decodeBits(bits) {
    var allBits, data_0;
    allBits = bits;
    data_0 = 0;
    while (bits != 0) {
      if (this.mIDCodeBitsAvail == 0) {
        this.mIDCodeTempData = (this.mDecodingBytes[++this.mIDCodeBufferIndex] & 63) << 11;
        this.mIDCodeBitsAvail = 6;
      }
      data_0 |= (65536 & this.mIDCodeTempData) >> 16 - allBits + bits;
      this.mIDCodeTempData <<= 1;
      bits--;
      this.mIDCodeBitsAvail--;
    }
    return data_0;
  };
  _.decodeBitsStart = function decodeBitsStart(bytes, offset) {
    this.mIDCodeBitsAvail = 6;
    this.mIDCodeBufferIndex = offset;
    this.mDecodingBytes = bytes;
    this.mIDCodeTempData = (bytes[this.mIDCodeBufferIndex] & 63) << 11;
  };
  _.decodeShift = function decodeShift(value_0, binCount) {
    var doubleValue, halfBinCount, isNegative, steepness;
    halfBinCount = narrow_int(binCount / 2);
    isNegative = value_0 >= halfBinCount;
    if (isNegative)
      value_0 -= halfBinCount;
    steepness = binCount / 32;
    doubleValue = steepness * value_0 / (halfBinCount - value_0);
    return isNegative ? -doubleValue : doubleValue;
  };
  _.ensure2DCoordinates = function ensure2DCoordinates_0() {
    return false;
  };
  _.fixMultipleBondTypes = function fixMultipleBondTypes() {
    var bond, bondType, queryFeatures, selectionCount;
    if (this.mMol.isFragment_0()) {
      for (bond = 0; bond < this.mMol.getAllBonds_0(); bond++) {
        queryFeatures = this.mMol.getBondQueryFeatures_0(bond);
        if ((queryFeatures & 127) == 0)
          continue;
        bondType = -1;
        selectionCount = 0;
        if ((queryFeatures & 16) != 0) {
          bondType = 16;
          selectionCount++;
        }
        if ((queryFeatures & 64) != 0) {
          bondType = 64;
          selectionCount++;
        }
        if ((queryFeatures & 32) != 0) {
          bondType = 32;
          selectionCount++;
        }
        if ((queryFeatures & 4) != 0) {
          bondType = 4;
          selectionCount++;
        }
        if ((queryFeatures & 2) != 0) {
          bondType = 2;
          selectionCount++;
        }
        if ((queryFeatures & 8) != 0) {
          bondType = 8;
          selectionCount++;
        }
        if ((queryFeatures & 1) != 0) {
          bondType = 1;
          selectionCount++;
        }
        if (bondType != -1) {
          this.mMol.setBondType_0(bond, bondType);
          if (selectionCount == 1)
            this.mMol.setBondQueryFeature_0(bond, 127, false);
        }
      }
    }
  };
  _.getCompactMolecule = function getCompactMolecule(idcode) {
    return jsEquals(idcode, null) || jl.isEmpty__Z__devirtual$(idcode) ? null : this.getCompactMolecule_1(jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$(idcode, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
  };
  _.getCompactMolecule_0 = function getCompactMolecule_0(idcode, coordinates) {
    return jsEquals(idcode, null) ? null : this.getCompactMolecule_2(jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$(idcode, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)), jsEquals(coordinates, null) ? null : jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$(coordinates, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
  };
  _.getCompactMolecule_1 = function getCompactMolecule_1(idcode) {
    var i;
    if (jsEquals(idcode, null) || idcode.length == 0)
      return null;
    for (i = 2; i < idcode.length - 2; i++)
      if (idcode[i] == 32)
        return this.getCompactMolecule_3(idcode, idcode, 0, i + 1);
    return this.getCompactMolecule_2(idcode, null);
  };
  _.getCompactMolecule_2 = function getCompactMolecule_2(idcode, coordinates) {
    return this.getCompactMolecule_3(idcode, coordinates, 0, 0);
  };
  _.getCompactMolecule_3 = function getCompactMolecule_3(idcode, coordinates, idcodeStart, coordsStart) {
    var abits, allAtoms, allBonds, bbits, mol;
    if (jsEquals(idcode, null))
      return null;
    this.decodeBitsStart(idcode, idcodeStart);
    abits = this.decodeBits(4);
    bbits = this.decodeBits(4);
    if (abits > 8)
      abits = bbits;
    allAtoms = this.decodeBits(abits);
    allBonds = this.decodeBits(bbits);
    mol = new carc2.StereoMolecule_0(allAtoms, allBonds);
    this.parse_2(mol, idcode, coordinates, idcodeStart, coordsStart);
    return mol;
  };
  _.inventCoordinates_0 = function inventCoordinates(mol) {
    throw toJs(new jl.Exception_1("Unexpected request to invent coordinates. Check source code logic!"));
  };
  _.parse_0 = function parse_0(mol, idcode) {
    var index_0;
    if (jsEquals(idcode, null) || jl.isEmpty__Z__devirtual$(idcode)) {
      this.parse_1(mol, castTo(null, 8), castTo(null, 8));
      return;
    }
    index_0 = jl.indexOf_I_I__devirtual$(idcode, 32);
    if (index_0 > 0 && index_0 < jl.length__I__devirtual$_0(idcode) - 1)
      this.parse_1(mol, jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(idcode, 0, index_0), (jnc.$clinit_StandardCharsets(), jnc.UTF_8)), jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$(jl.substring_I_Ljava_lang_String___devirtual$(idcode, index_0 + 1), (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
    else
      this.parse_1(mol, jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$(idcode, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)), null);
  };
  _.parse_1 = function parse_1(mol, idcode, coordinates) {
    if (jsEquals(idcode, null) || idcode.length == 0) {
      mol.clear_0();
      return;
    }
    this.parse_2(mol, idcode, coordinates, 0, 0);
  };
  _.parse_2 = function parse_2(mol, idcode, coordinates, idcodeStart, coordsStart) {
    var EZCount, THCount, abits, allAtoms, allBonds, aromState, aromaticSPBond, atom, atom0, atom1, atom2, atomList, atomicNo, atoms, avbl, avblDefault, avblInt, base, bbits, binCount, bond, bond$array, bond$index, bond$max, bond0, bondOrder, bondType, bondTypes, bridgeData, charge, chargedAtoms, closureBonds, connBits, conns, coords2DAvailable, coordsAre3D, coordsAreAbsolute, count, dataType, dbits, decodeOldCoordinates, decodedDX, decodedDY, dif, dx, dy, dz, e, eNeighbours, f, factor, from, hCount, hint, hydrogen, hydrogenCount, i, i0, i1, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i2, i20, i21, i22, i23, i24, i25, i26, i27, i28, i29, i3, i30, i31, i32, i33, i34, i35, i36, i37, i38, i39, i4, i40, i41, i42, i43, i44, i5, i6, i7, i8, i9, index_0, isDelocalizedBond, j, label_0, lbits, mass, neighbours, nitrogens, no, offset, otherAtoms, oxydationState, oxygens, parity, piElectrons, resolutionBits, ringSize, ringState, selectedHydrogenBits, stereoState, targetAVBL, version2, xInt, xOffset, yInt, yOffset, zInt, zOffset;
    mol.clear_0();
    if (jsEquals(idcode, null) || idcodeStart < 0 || idcodeStart >= idcode.length)
      return;
    this.mMol = mol;
    version2 = 8;
    if (jsNotEquals(coordinates, null) && (coordsStart < 0 || coordsStart >= coordinates.length))
      coordinates = null;
    this.decodeBitsStart(idcode, idcodeStart);
    abits = this.decodeBits(4);
    bbits = this.decodeBits(4);
    if (abits > 8) {
      version2 = abits;
      abits = bbits;
    }
    if (abits == 0) {
      this.mMol.setFragment_0(this.decodeBits(1) == 1);
      return;
    }
    allAtoms = this.decodeBits(abits);
    allBonds = this.decodeBits(bbits);
    nitrogens = this.decodeBits(abits);
    oxygens = this.decodeBits(abits);
    otherAtoms = this.decodeBits(abits);
    chargedAtoms = this.decodeBits(abits);
    for (atom0 = 0; atom0 < allAtoms; atom0++)
      this.mMol.addAtom_2(6);
    for (i0 = 0; i0 < nitrogens; i0++)
      this.mMol.setAtomicNo_0(this.decodeBits(abits), 7);
    for (i1 = 0; i1 < oxygens; i1++)
      this.mMol.setAtomicNo_0(this.decodeBits(abits), 8);
    for (i2 = 0; i2 < otherAtoms; i2++)
      this.mMol.setAtomicNo_0(this.decodeBits(abits), this.decodeBits(8));
    for (i3 = 0; i3 < chargedAtoms; i3++)
      this.mMol.setAtomCharge_0(this.decodeBits(abits), this.decodeBits(4) - 8);
    closureBonds = 1 + allBonds - allAtoms;
    dbits = this.decodeBits(4);
    base = 0;
    this.mMol.setAtomX_0(0, 0);
    this.mMol.setAtomY_0(0, 0);
    this.mMol.setAtomZ_0(0, 0);
    decodeOldCoordinates = jsNotEquals(coordinates, null) && coordinates[coordsStart] >= 39;
    targetAVBL = 0;
    xOffset = 0;
    yOffset = 0;
    zOffset = 0;
    coordsAre3D = false;
    coordsAreAbsolute = false;
    if (decodeOldCoordinates) {
      if (coordinates.length > 2 * allAtoms - 2 && coordinates[2 * allAtoms - 2] == 39 || coordinates.length > 3 * allAtoms - 3 && coordinates[3 * allAtoms - 3] == 39) {
        coordsAreAbsolute = true;
        coordsAre3D = coordinates.length == 3 * allAtoms - 3 + 9;
        index_0 = coordsAre3D ? 3 * allAtoms - 3 : 2 * allAtoms - 2;
        avblInt = 86 * (coordinates[index_0 + 1] - 40) + coordinates[index_0 + 2] - 40;
        targetAVBL = $wnd.Math.pow(10, avblInt / 2e3 - 1);
        index_0 += 2;
        xInt = 86 * (coordinates[index_0 + 1] - 40) + coordinates[index_0 + 2] - 40;
        xOffset = $wnd.Math.pow(10, xInt / 1500 - 1);
        index_0 += 2;
        yInt = 86 * (coordinates[index_0 + 1] - 40) + coordinates[index_0 + 2] - 40;
        yOffset = $wnd.Math.pow(10, yInt / 1500 - 1);
        if (coordsAre3D) {
          index_0 += 2;
          zInt = 86 * (coordinates[index_0 + 1] - 40) + coordinates[index_0 + 2] - 40;
          zOffset = $wnd.Math.pow(10, zInt / 1500 - 1);
        }
      } else {
        coordsAre3D = coordinates.length == 3 * allAtoms - 3;
      }
    }
    if (this.ensure2DCoordinates() && coordsAre3D) {
      coordinates = null;
      decodeOldCoordinates = false;
    }
    for (i4 = 1; i4 < allAtoms; i4++) {
      dif = this.decodeBits(dbits);
      if (dif == 0) {
        if (decodeOldCoordinates) {
          this.mMol.setAtomX_0(i4, this.mMol.getAtomX_0(0) + 8 * (coordinates[i4 * 2 - 2] - 83));
          this.mMol.setAtomY_0(i4, this.mMol.getAtomY_0(0) + 8 * (coordinates[i4 * 2 - 1] - 83));
          if (coordsAre3D)
            this.mMol.setAtomZ_0(i4, this.mMol.getAtomZ_0(0) + 8 * (coordinates[2 * allAtoms - 3 + i4] - 83));
        }
        closureBonds++;
        continue;
      }
      base += dif - 1;
      if (decodeOldCoordinates) {
        this.mMol.setAtomX_0(i4, this.mMol.getAtomX_0(base) + coordinates[i4 * 2 - 2] - 83);
        this.mMol.setAtomY_0(i4, this.mMol.getAtomY_0(base) + coordinates[i4 * 2 - 1] - 83);
        if (coordsAre3D)
          this.mMol.setAtomZ_0(i4, this.mMol.getAtomZ_0(base) + (coordinates[2 * allAtoms - 3 + i4] - 83));
      }
      this.mMol.addBond_1(base, i4, 1);
    }
    for (i5 = 0; i5 < closureBonds; i5++)
      this.mMol.addBond_1(this.decodeBits(abits), this.decodeBits(abits), 1);
    isDelocalizedBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, allBonds, 16, 1);
    for (bond0 = 0; bond0 < allBonds; bond0++) {
      bondOrder = this.decodeBits(2);
      switch (bondOrder) {
        case 0:
          isDelocalizedBond[bond0] = true;
          break;
        case 2:
          this.mMol.setBondType_0(bond0, 2);
          break;
        case 3:
          this.mMol.setBondType_0(bond0, 4);
          break;
      }
    }
    THCount = this.decodeBits(abits);
    for (i6 = 0; i6 < THCount; i6++) {
      atom = this.decodeBits(abits);
      if (version2 == 8) {
        parity = this.decodeBits(2);
        if (parity == 3) {
          this.mMol.setAtomESR_0(atom, 1, 0);
          this.mMol.setAtomParity_0(atom, 1, false);
        } else {
          this.mMol.setAtomParity_0(atom, parity, false);
        }
      } else {
        parity = this.decodeBits(3);
        switch (parity) {
          case 4:
            this.mMol.setAtomParity_0(atom, 1, false);
            this.mMol.setAtomESR_0(atom, 1, this.decodeBits(3));
            break;
          case 5:
            this.mMol.setAtomParity_0(atom, 2, false);
            this.mMol.setAtomESR_0(atom, 1, this.decodeBits(3));
            break;
          case 6:
            this.mMol.setAtomParity_0(atom, 1, false);
            this.mMol.setAtomESR_0(atom, 2, this.decodeBits(3));
            break;
          case 7:
            this.mMol.setAtomParity_0(atom, 2, false);
            this.mMol.setAtomESR_0(atom, 2, this.decodeBits(3));
            break;
          default:
            this.mMol.setAtomParity_0(atom, parity, false);
        }
      }
    }
    if (version2 == 8) {
      if (this.decodeBits(1) == 0)
        this.mMol.setToRacemate_0();
    }
    EZCount = this.decodeBits(bbits);
    for (i7 = 0; i7 < EZCount; i7++) {
      bond = this.decodeBits(bbits);
      if (this.mMol.getBondType_0(bond) == 1) {
        parity = this.decodeBits(3);
        switch (parity) {
          case 4:
            this.mMol.setBondParity_0(bond, 1, false);
            this.mMol.setBondESR_0(bond, 1, this.decodeBits(3));
            break;
          case 5:
            this.mMol.setBondParity_0(bond, 2, false);
            this.mMol.setBondESR_0(bond, 1, this.decodeBits(3));
            break;
          case 6:
            this.mMol.setBondParity_0(bond, 1, false);
            this.mMol.setBondESR_0(bond, 2, this.decodeBits(3));
            break;
          case 7:
            this.mMol.setBondParity_0(bond, 2, false);
            this.mMol.setBondESR_0(bond, 2, this.decodeBits(3));
            break;
          default:
            this.mMol.setBondParity_0(bond, parity, false);
        }
      } else {
        this.mMol.setBondParity_0(bond, this.decodeBits(2), false);
      }
    }
    this.mMol.setFragment_0(this.decodeBits(1) == 1);
    aromaticSPBond = null;
    selectedHydrogenBits = null;
    offset = 0;
    while (this.decodeBits(1) == 1) {
      dataType = offset + this.decodeBits(4);
      switch (dataType) {
        case 0:
          no = this.decodeBits(abits);
          for (i8 = 0; i8 < no; i8++) {
            atom = this.decodeBits(abits);
            this.mMol.setAtomQueryFeature_0(atom, 2048, true);
          }
          break;
        case 1:
          no = this.decodeBits(abits);
          for (i9 = 0; i9 < no; i9++) {
            atom = this.decodeBits(abits);
            mass = this.decodeBits(8);
            this.mMol.setAtomMass_0(atom, mass);
          }
          break;
        case 2:
          no = this.decodeBits(bbits);
          for (i10 = 0; i10 < no; i10++) {
            bond = this.decodeBits(bbits);
          }
          break;
        case 3:
          no = this.decodeBits(abits);
          for (i11 = 0; i11 < no; i11++) {
            atom = this.decodeBits(abits);
            this.mMol.setAtomQueryFeature_0(atom, 4096, true);
          }
          break;
        case 4:
          no = this.decodeBits(abits);
          for (i12 = 0; i12 < no; i12++) {
            atom = this.decodeBits(abits);
            ringState = shl_0(fromInt_0(this.decodeBits(4)), 3);
            this.mMol.setAtomQueryFeature_0(atom, ringState, true);
          }
          break;
        case 5:
          no = this.decodeBits(abits);
          for (i13 = 0; i13 < no; i13++) {
            atom = this.decodeBits(abits);
            aromState = shl_0(fromInt_0(this.decodeBits(2)), 1);
            this.mMol.setAtomQueryFeature_0(atom, aromState, true);
          }
          break;
        case 6:
          no = this.decodeBits(abits);
          for (i14 = 0; i14 < no; i14++) {
            atom = this.decodeBits(abits);
            this.mMol.setAtomQueryFeature_0(atom, 1, true);
          }
          break;
        case 7:
          no = this.decodeBits(abits);
          for (i15 = 0; i15 < no; i15++) {
            atom = this.decodeBits(abits);
            hydrogen = shl_0(fromInt_0(this.decodeBits(4)), 7);
            this.mMol.setAtomQueryFeature_0(atom, hydrogen, true);
          }
          break;
        case 8:
          no = this.decodeBits(abits);
          for (i16 = 0; i16 < no; i16++) {
            atom = this.decodeBits(abits);
            atoms = this.decodeBits(4);
            atomList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, atoms, 15, 1);
            for (j = 0; j < atoms; j++) {
              atomicNo = this.decodeBits(8);
              atomList[j] = atomicNo;
            }
            this.mMol.setAtomList_0(atom, atomList);
          }
          break;
        case 9:
          no = this.decodeBits(bbits);
          for (i17 = 0; i17 < no; i17++) {
            bond = this.decodeBits(bbits);
            ringState = this.decodeBits(2) << 7;
            this.mMol.setBondQueryFeature_0(bond, ringState, true);
          }
          break;
        case 10:
          no = this.decodeBits(bbits);
          for (i18 = 0; i18 < no; i18++) {
            bond = this.decodeBits(bbits);
            bondTypes = this.decodeBits(5) << 0;
            this.mMol.setBondQueryFeature_0(bond, bondTypes, true);
          }
          break;
        case 11:
          no = this.decodeBits(abits);
          for (i19 = 0; i19 < no; i19++) {
            atom = this.decodeBits(abits);
            this.mMol.setAtomQueryFeature_0(atom, 8192, true);
          }
          break;
        case 12:
          no = this.decodeBits(bbits);
          for (i20 = 0; i20 < no; i20++) {
            bond = this.decodeBits(bbits);
            bridgeData = this.decodeBits(8) << 9;
            this.mMol.setBondQueryFeature_0(bond, bridgeData, true);
          }
          break;
        case 13:
          no = this.decodeBits(abits);
          for (i21 = 0; i21 < no; i21++) {
            atom = this.decodeBits(abits);
            piElectrons = shl_0(fromInt_0(this.decodeBits(3)), 14);
            this.mMol.setAtomQueryFeature_0(atom, piElectrons, true);
          }
          break;
        case 14:
          no = this.decodeBits(abits);
          for (i22 = 0; i22 < no; i22++) {
            atom = this.decodeBits(abits);
            neighbours = shl_0(fromInt_0(this.decodeBits(5)), 17);
            this.mMol.setAtomQueryFeature_0(atom, neighbours, true);
          }
          break;
        case 15:
        case 31:
          offset += 16;
          break;
        case 16:
          no = this.decodeBits(abits);
          for (i23 = 0; i23 < no; i23++) {
            atom = this.decodeBits(abits);
            ringSize = shl_0(fromInt_0(this.decodeBits(3)), 22);
            this.mMol.setAtomQueryFeature_0(atom, ringSize, true);
          }
          break;
        case 17:
          no = this.decodeBits(abits);
          for (i24 = 0; i24 < no; i24++) {
            atom = this.decodeBits(abits);
            this.mMol.setAtomAbnormalValence_0(atom, this.decodeBits(4));
          }
          break;
        case 18:
          no = this.decodeBits(abits);
          lbits = this.decodeBits(4);
          for (i25 = 0; i25 < no; i25++) {
            atom = this.decodeBits(abits);
            count = this.decodeBits(lbits);
            label_0 = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, count, 15, 1);
            for (j = 0; j < count; j++)
              label_0[j] = narrow_byte(this.decodeBits(7));
            this.mMol.setAtomCustomLabel_0(atom, jl.$create_12(label_0, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
          }
          break;
        case 19:
          no = this.decodeBits(abits);
          for (i26 = 0; i26 < no; i26++) {
            atom = this.decodeBits(abits);
            charge = shl_0(fromInt_0(this.decodeBits(3)), 25);
            this.mMol.setAtomQueryFeature_0(atom, charge, true);
          }
          break;
        case 20:
          no = this.decodeBits(bbits);
          for (i27 = 0; i27 < no; i27++) {
            bond = this.decodeBits(bbits);
            ringSize = this.decodeBits(3) << 17;
            this.mMol.setBondQueryFeature_0(bond, ringSize, true);
          }
          break;
        case 21:
          no = this.decodeBits(abits);
          for (i28 = 0; i28 < no; i28++) {
            atom = this.decodeBits(abits);
            this.mMol.setAtomRadical_0(atom, this.decodeBits(2) << 4);
          }
          break;
        case 22:
          no = this.decodeBits(abits);
          for (i29 = 0; i29 < no; i29++) {
            atom = this.decodeBits(abits);
            this.mMol.setAtomQueryFeature_0(atom, 268435456, true);
          }
          break;
        case 23:
          no = this.decodeBits(bbits);
          for (i30 = 0; i30 < no; i30++) {
            bond = this.decodeBits(bbits);
            this.mMol.setBondQueryFeature_0(bond, 1048576, true);
          }
          break;
        case 24:
          no = this.decodeBits(bbits);
          for (i31 = 0; i31 < no; i31++) {
            bond = this.decodeBits(bbits);
            aromState = this.decodeBits(2) << 21;
            this.mMol.setBondQueryFeature_0(bond, aromState, true);
          }
          break;
        case 25:
          for (i32 = 0; i32 < allAtoms; i32++)
            if (this.decodeBits(1) == 1)
              this.mMol.setAtomSelection_0(i32, true);
          break;
        case 26:
          no = this.decodeBits(bbits);
          aromaticSPBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, no, 15, 1);
          for (i33 = 0; i33 < no; i33++)
            aromaticSPBond[i33] = this.decodeBits(bbits);
          break;
        case 27:
          no = this.decodeBits(abits);
          for (i34 = 0; i34 < no; i34++) {
            atom = this.decodeBits(abits);
            this.mMol.setAtomQueryFeature_0(atom, 536870912, true);
          }
          break;
        case 28:
          no = this.decodeBits(bbits);
          for (i35 = 0; i35 < no; i35++)
            this.mMol.setBondType_0(this.decodeBits(bbits), 16);
          break;
        case 29:
          no = this.decodeBits(abits);
          for (i36 = 0; i36 < no; i36++) {
            atom = this.decodeBits(abits);
            hint = shl_0(fromInt_0(this.decodeBits(2)), 30);
            this.mMol.setAtomQueryFeature_0(atom, hint, true);
          }
          break;
        case 30:
          no = this.decodeBits(abits);
          for (i37 = 0; i37 < no; i37++) {
            atom = this.decodeBits(abits);
            ringSize = shl_0(fromInt_0(this.decodeBits(7)), 32);
            this.mMol.setAtomQueryFeature_0(atom, ringSize, true);
          }
          break;
        case 32:
          no = this.decodeBits(abits);
          for (i38 = 0; i38 < no; i38++) {
            atom = this.decodeBits(abits);
            stereoState = shl_0(fromInt_0(this.decodeBits(2)), 44);
            this.mMol.setAtomQueryFeature_0(atom, stereoState, true);
          }
          break;
        case 33:
          no = this.decodeBits(abits);
          for (i39 = 0; i39 < no; i39++) {
            atom = this.decodeBits(abits);
            eNeighbours = shl_0(fromInt_0(this.decodeBits(5)), 39);
            this.mMol.setAtomQueryFeature_0(atom, eNeighbours, true);
          }
          break;
        case 34:
          no = this.decodeBits(abits);
          for (i40 = 0; i40 < no; i40++) {
            atom = this.decodeBits(abits);
            this.mMol.setAtomQueryFeature_0(atom, { l: 0, m: 0, h: 4 }, true);
          }
          break;
        case 35:
          no = this.decodeBits(bbits);
          for (i41 = 0; i41 < no; i41++) {
            bond = this.decodeBits(bbits);
            this.mMol.setBondQueryFeature_0(bond, 8388608, true);
          }
          break;
        case 36:
          no = this.decodeBits(bbits);
          for (i42 = 0; i42 < no; i42++) {
            bond = this.decodeBits(bbits);
            bondType = this.decodeBits(2) << 5;
            this.mMol.setBondQueryFeature_0(bond, bondType, true);
          }
          break;
        case 37:
          no = this.decodeBits(bbits);
          for (i43 = 0; i43 < no; i43++) {
            bond = this.decodeBits(bbits);
            bondType = this.decodeBits(1) == 0 ? 32 : 64;
            this.mMol.setBondType_0(bond, bondType);
          }
          break;
        case 38:
          no = this.decodeBits(abits);
          connBits = this.decodeBits(3);
          selectedHydrogenBits = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, allAtoms, 15, 1);
          for (i44 = 0; i44 < no; i44++) {
            atom = this.decodeBits(abits);
            conns = this.decodeBits(connBits);
            selectedHydrogenBits[atom] = conns;
          }
          break;
        case 39:
          no = this.decodeBits(abits);
          for (i = 0; i < no; i++) {
            atom = this.decodeBits(abits);
            oxydationState = shl_0(fromInt_0(this.decodeBits(4)), 47);
            this.mMol.setAtomQueryFeature_0(atom, oxydationState, true);
          }
          break;
      }
    }
    new carc2.AromaticityResolver(this.mMol).locateDelocalizedDoubleBonds(isDelocalizedBond);
    if (jsNotEquals(aromaticSPBond, null))
      for (bond$array = aromaticSPBond, bond$index = 0, bond$max = bond$array.length; bond$index < bond$max; ++bond$index) {
        bond = bond$array[bond$index];
        this.mMol.setBondType_0(bond, this.mMol.getBondType_0(bond) == 2 ? 4 : 2);
      }
    if (jsEquals(coordinates, null) && !this.mNeglectSpaceDelimitedCoordinates && idcode.length > this.mIDCodeBufferIndex + 1 && (idcode[this.mIDCodeBufferIndex + 1] == 32 || idcode[this.mIDCodeBufferIndex + 1] == 9)) {
      coordinates = idcode;
      coordsStart = this.mIDCodeBufferIndex + 2;
    }
    if (jsNotEquals(coordinates, null)) {
      try {
        if (coordinates[coordsStart] == 33 || coordinates[coordsStart] == 35) {
          this.decodeBitsStart(coordinates, coordsStart + 1);
          coordsAre3D = this.decodeBits(1) == 1;
          coordsAreAbsolute = this.decodeBits(1) == 1;
          resolutionBits = 2 * this.decodeBits(4);
          binCount = 1 << resolutionBits;
          from = 0;
          bond = 0;
          for (atom1 = 1; atom1 < allAtoms; atom1++) {
            if (bond < allBonds && this.mMol.getBondAtom_0(1, bond) == atom1) {
              from = this.mMol.getBondAtom_0(0, bond++);
              factor = 1;
            } else {
              from = 0;
              factor = 8;
            }
            decodedDX = factor * (this.decodeBits(resolutionBits) + 1 - (binCount >> 1));
            decodedDY = factor * (this.decodeBits(resolutionBits) + 1 - (binCount >> 1));
            this.mMol.setAtomX_0(atom1, this.mMol.getAtomX_0(from) + decodedDX);
            this.mMol.setAtomY_0(atom1, this.mMol.getAtomY_0(from) + decodedDY);
            if (coordsAre3D)
              this.mMol.setAtomZ_0(atom1, this.mMol.getAtomZ_0(from) + factor * (this.decodeBits(resolutionBits) + 1 - (binCount >> 1)));
          }
          if (coordinates[coordsStart] == 35) {
            hydrogenCount = 0;
            hCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, allAtoms, 15, 1);
            for (atom2 = 0; atom2 < allAtoms; atom2++)
              hydrogenCount += hCount[atom2] = this.mMol.getImplicitHydrogens_1(atom2);
            for (atom = 0; atom < allAtoms; atom++) {
              for (i = 0; i < hCount[atom]; i++) {
                hydrogen = this.mMol.addAtom_2(1);
                this.mMol.addBond_1(atom, hydrogen, 1);
                this.mMol.setAtomX_0(hydrogen, this.mMol.getAtomX_0(atom) + (this.decodeBits(resolutionBits) + 1 - (binCount >> 1)));
                this.mMol.setAtomY_0(hydrogen, this.mMol.getAtomY_0(atom) + (this.decodeBits(resolutionBits) + 1 - (binCount >> 1)));
                if (coordsAre3D)
                  this.mMol.setAtomZ_0(hydrogen, this.mMol.getAtomZ_0(atom) + (this.decodeBits(resolutionBits) + 1 - (binCount >> 1)));
                if (jsNotEquals(selectedHydrogenBits, null) && (selectedHydrogenBits[atom] & 1 << i) != 0)
                  this.mMol.setAtomSelection_0(hydrogen, true);
              }
            }
            allAtoms += hydrogenCount;
            allBonds += hydrogenCount;
          }
          avblDefault = coordsAre3D ? 1.5 : carc2.getDefaultAverageBondLength();
          avbl = this.mMol.getAverageBondLength_3(allAtoms, allBonds, avblDefault);
          if (coordsAreAbsolute) {
            targetAVBL = this.decodeAVBL(this.decodeBits(resolutionBits), binCount);
            xOffset = targetAVBL * this.decodeShift(this.decodeBits(resolutionBits), binCount);
            yOffset = targetAVBL * this.decodeShift(this.decodeBits(resolutionBits), binCount);
            if (coordsAre3D)
              zOffset = targetAVBL * this.decodeShift(this.decodeBits(resolutionBits), binCount);
            factor = targetAVBL / avbl;
            for (atom = 0; atom < allAtoms; atom++) {
              this.mMol.setAtomX_0(atom, xOffset + factor * this.mMol.getAtomX_0(atom));
              this.mMol.setAtomY_0(atom, yOffset + factor * this.mMol.getAtomY_0(atom));
              if (coordsAre3D)
                this.mMol.setAtomZ_0(atom, zOffset + factor * this.mMol.getAtomZ_0(atom));
            }
          } else {
            targetAVBL = 1.5;
            factor = targetAVBL / avbl;
            for (atom = 0; atom < allAtoms; atom++) {
              this.mMol.setAtomX_0(atom, factor * this.mMol.getAtomX_0(atom));
              this.mMol.setAtomY_0(atom, factor * this.mMol.getAtomY_0(atom));
              if (coordsAre3D)
                this.mMol.setAtomZ_0(atom, factor * this.mMol.getAtomZ_0(atom));
            }
          }
        } else {
          if (coordsAre3D && !coordsAreAbsolute && targetAVBL == 0)
            targetAVBL = 1.5;
          if (targetAVBL != 0 && this.mMol.getAllBonds_0() != 0) {
            avbl = 0;
            for (bond = 0; bond < this.mMol.getAllBonds_0(); bond++) {
              dx = this.mMol.getAtomX_0(this.mMol.getBondAtom_0(0, bond)) - this.mMol.getAtomX_0(this.mMol.getBondAtom_0(1, bond));
              dy = this.mMol.getAtomY_0(this.mMol.getBondAtom_0(0, bond)) - this.mMol.getAtomY_0(this.mMol.getBondAtom_0(1, bond));
              dz = coordsAre3D ? this.mMol.getAtomZ_0(this.mMol.getBondAtom_0(0, bond)) - this.mMol.getAtomZ_0(this.mMol.getBondAtom_0(1, bond)) : 0;
              avbl += $wnd.Math.sqrt(dx * dx + dy * dy + dz * dz);
            }
            avbl /= this.mMol.getAllBonds_0();
            f = targetAVBL / avbl;
            for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
              this.mMol.setAtomX_0(atom, this.mMol.getAtomX_0(atom) * f + xOffset);
              this.mMol.setAtomY_0(atom, this.mMol.getAtomY_0(atom) * f + yOffset);
              if (coordsAre3D)
                this.mMol.setAtomZ_0(atom, this.mMol.getAtomZ_0(atom) * f + zOffset);
            }
          }
        }
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          e.printStackTrace();
          (jl.$clinit_System(), jl.err).println_0("Faulty id-coordinates:" + e + " " + jl.$create_12(idcode, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)) + " " + jl.$create_12(coordinates, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
          coordinates = null;
          coordsAre3D = false;
        } else
          throw toJs($e0);
      }
    }
    coords2DAvailable = jsNotEquals(coordinates, null) && !coordsAre3D;
    this.fixMultipleBondTypes();
    if (coords2DAvailable || this.ensure2DCoordinates()) {
      this.mMol.ensureHelperArrays_0(7);
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++)
        if (this.mMol.getBondOrder_0(bond) == 2 && !this.mMol.isSmallRingBond_0(bond) && this.mMol.getBondParity_0(bond) == 0)
          this.mMol.setBondParityUnknownOrNone_0(bond);
    }
    this.mMol.setParitiesValid_0(0);
    if (!coords2DAvailable && this.ensure2DCoordinates()) {
      try {
        this.inventCoordinates_0(this.mMol);
        coords2DAvailable = true;
      } catch ($e1) {
        $e1 = toJava($e1);
        if (instanceOf($e1, 12)) {
          e = $e1;
          e.printStackTrace();
          (jl.$clinit_System(), jl.err).println_0("2D-coordinate creation failed:" + e + " " + jl.$create_12(idcode, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
        } else
          throw toJs($e1);
      }
    }
    if (coords2DAvailable) {
      this.mMol.setStereoBondsFromParity_0();
      this.mMol.setUnknownParitiesToExplicitlyUnknown_0();
    } else if (!coordsAre3D) {
      this.mMol.setParitiesValid_0(0);
    }
  };
  _.parseMapping = function parseMapping(mapping) {
    this.parseMapping_0(mapping, 0);
  };
  _.parseMapping_0 = function parseMapping_0(mapping, mappingStart) {
    var atom, autoMapped, autoMappingFound, manualMappingFound, mapNo, nbits;
    if (jsEquals(mapping, null) || mapping.length <= mappingStart || mapping[mappingStart] < 64)
      return;
    this.decodeBitsStart(mapping, mappingStart);
    nbits = this.decodeBits(4);
    autoMappingFound = this.decodeBits(1) == 1;
    manualMappingFound = this.decodeBits(1) == 1;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      mapNo = this.decodeBits(nbits);
      autoMapped = autoMappingFound;
      if (autoMappingFound && manualMappingFound)
        autoMapped = this.decodeBits(1) == 1;
      this.mMol.setAtomMapNo_0(atom, mapNo, autoMapped);
    }
  };
  _.mIDCodeBitsAvail = 0;
  _.mIDCodeBufferIndex = 0;
  _.mIDCodeTempData = 0;
  _.mNeglectSpaceDelimitedCoordinates = false;
  cggl.Lcom_actelion_research_chem_IDCodeParserWithoutCoordinateInvention_2_classLit = createForClass("com.actelion.research.chem", "IDCodeParserWithoutCoordinateInvention", 252, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_IDCodeParser = function $clinit_IDCodeParser() {
    carc2.$clinit_IDCodeParser = emptyMethod;
    carc2.$clinit_IDCodeParserWithoutCoordinateInvention();
  };
  carc2.IDCodeParser = function IDCodeParser(ensure2DCoordinates) {
    carc2.$clinit_IDCodeParser();
    carc2.IDCodeParserWithoutCoordinateInvention.call(this);
    this.$init_32();
    this.mEnsure2DCoordinates = ensure2DCoordinates;
  };
  defineClass(52, 252, { 1: 1 }, carc2.IDCodeParser);
  _.$init_32 = function $init_32() {
    this.mCoordinateMode = 2;
  };
  _.ensure2DCoordinates = function ensure2DCoordinates_1() {
    return this.mEnsure2DCoordinates;
  };
  _.inventCoordinates_0 = function inventCoordinates_0(mol) {
    var inventor;
    inventor = new carcc3.CoordinateInventor_0(this.mCoordinateMode);
    inventor.setRandomSeed_0(78187493520);
    inventor.invent(mol);
  };
  _.mCoordinateMode = 0;
  _.mEnsure2DCoordinates = false;
  cggl.Lcom_actelion_research_chem_IDCodeParser_2_classLit = createForClass("com.actelion.research.chem", "IDCodeParser", 52, cggl.Lcom_actelion_research_chem_IDCodeParserWithoutCoordinateInvention_2_classLit);
  carc2.$clinit_IsomericSmilesCreator = function $clinit_IsomericSmilesCreator() {
    carc2.$clinit_IsomericSmilesCreator = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.IsomericSmilesCreator = function IsomericSmilesCreator(mol) {
    carc2.IsomericSmilesCreator_0.call(this, mol, 0);
  };
  carc2.IsomericSmilesCreator_0 = function IsomericSmilesCreator_0(mol, mode) {
    carc2.$clinit_IsomericSmilesCreator();
    Object_0.call(this);
    this.$init_33();
    this.mMol = mol;
    this.mMode = mode;
  };
  carc2.createReactionSmiles = function createReactionSmiles(rxn) {
    carc2.$clinit_IsomericSmilesCreator();
    return carc2.createReactionSmiles_0(rxn, 2);
  };
  carc2.createReactionSmiles_0 = function createReactionSmiles_0(rxn, mode) {
    var i, i0, i1, sb;
    sb = new jl.StringBuilder();
    for (i0 = 0; i0 < rxn.getReactants_0(); i0++) {
      if (i0 != 0)
        sb.append_4(46);
      sb.append_9(new carc2.IsomericSmilesCreator_0(rxn.getReactant_0(i0), mode).getSmiles());
    }
    sb.append_4(62);
    for (i1 = 0; i1 < rxn.getCatalysts_0(); i1++) {
      if (i1 != 0)
        sb.append_4(46);
      sb.append_9(new carc2.IsomericSmilesCreator(rxn.getCatalyst_0(i1)).getSmiles());
    }
    sb.append_4(62);
    for (i = 0; i < rxn.getProducts_0(); i++) {
      if (i != 0)
        sb.append_4(46);
      sb.append_9(new carc2.IsomericSmilesCreator_0(rxn.getProduct_0(i), mode).getSmiles());
    }
    return sb.toString_0();
  };
  defineClass(127, 1, { 1: 1 }, carc2.IsomericSmilesCreator, carc2.IsomericSmilesCreator_0);
  _.$init_33 = function $init_33() {
  };
  _.addAtomString = function addAtomString(smilesAtom, builder, buffer) {
    var atom, atomList, charge, chargeFeatures, hCount, isAnyAtom, isotop, label_0, mapNo, parent_0, smartsFeatures, useBrackets;
    atom = smilesAtom.atom;
    parent_0 = smilesAtom.parent_0;
    isAnyAtom = neq(and_0(this.mMol.getAtomQueryFeatures(atom), 1), 0);
    atomList = this.mMol.getAtomList_0(atom);
    label_0 = jsNotEquals(atomList, null) ? this.createMultiAtomLabel(atom, atomList, buffer) : isAnyAtom ? "*" : this.mMol.getAtomLabel_0(atom);
    if (!isAnyAtom && jsEquals(atomList, null) && this.mMol.isAromaticAtom_0(atom) && (this.mMode & 4) == 0 && (this.mMol.getAtomPi_0(atom) != 0 || this.mMol.getAtomAbnormalValence_0(atom) == -1 && this.mMol.getAtomRadical_0(atom) == 0))
      label_0 = jl.toLowerCase__Ljava_lang_String___devirtual$(label_0);
    if (smilesAtom.isSideChainStart)
      builder.append_4(40);
    if (parent_0 != -1)
      this.appendBondOrderSymbol(this.mMol.getBond_0(smilesAtom.atom, smilesAtom.parent_0), smilesAtom.parent_0, builder);
    charge = this.mMol.getAtomCharge_0(atom);
    if (charge == 0 && (this.mMode & 1) != 0) {
      chargeFeatures = and_0(this.mMol.getAtomQueryFeatures(atom), 234881024);
      if (eq(chargeFeatures, or_0(67108864, 134217728)))
        charge = -1;
      else if (eq(chargeFeatures, or_0(67108864, 33554432)))
        charge = 1;
    }
    isotop = this.mMol.getAtomMass_0(atom);
    mapNo = (this.mMode & 2) != 0 ? this.mMol.getAtomMapNo_0(atom) : 0;
    smartsFeatures = (this.mMode & 1) != 0 ? this.getAtomSMARTSFeatures(atom, buffer) : null;
    useBrackets = !isAnyAtom && !this.isOrganic(this.mMol.getAtomicNo_0(atom)) || jsNotEquals(atomList, null) || this.qualifiesForAtomParity(atom) || this.mMol.isAromaticAtom_0(atom) && this.mMol.getAtomPi_0(atom) == 0 && (this.mMode & 4) == 0 || charge != 0 || isotop != 0 || mapNo != 0 || this.mMol.getAtomAbnormalValence_0(atom) != -1 || this.mMol.getAtomRadical_0(atom) != 0 || jsNotEquals(smartsFeatures, null);
    if (useBrackets)
      builder.append_4(91);
    if (isotop != 0)
      builder.append_5(isotop);
    builder.append_9(label_0);
    if (this.qualifiesForAtomParity(atom))
      builder.append_9(this.getAtomParitySymbol(atom, parent_0));
    if ((this.mMode & 1) == 0 && useBrackets) {
      hCount = this.mMol.getPlainHydrogens(atom);
      if (hCount == 1)
        builder.append_9("H");
      else if (hCount > 1)
        builder.append_9("H" + hCount);
    }
    if (charge != 0) {
      builder.append_4(charge > 0 ? 43 : 45);
      if ($wnd.Math.abs(charge) > 1)
        builder.append_5($wnd.Math.abs(charge));
    }
    if (jsNotEquals(smartsFeatures, null))
      builder.append_9(smartsFeatures);
    if (mapNo != 0) {
      builder.append_4(58);
      builder.append_5(mapNo);
    }
    if (useBrackets)
      builder.append_4(93);
    this.appendClosureBonds(smilesAtom, builder);
    if (smilesAtom.isSideChainEnd)
      builder.append_4(41);
  };
  _.addHighestRankingChain = function addHighestRankingChain(graphIndex, isSideChain) {
    var atom, bond, isFirst, neighborIndex, parent_0;
    isFirst = true;
    parent_0 = castTo(this.mGraphAtomList.getAtIndex(graphIndex), 66).atom;
    neighborIndex = this.getUnusedConnAtomIndex(parent_0);
    while (neighborIndex != -1) {
      atom = this.mMol.getConnAtom_0(parent_0, neighborIndex);
      bond = this.mMol.getConnBond_0(parent_0, neighborIndex);
      neighborIndex = this.getUnusedConnAtomIndex(atom);
      this.addToGraph(new carc2.SmilesAtom(atom, bond, parent_0, isSideChain && isFirst, isSideChain && neighborIndex == -1), ++graphIndex);
      parent_0 = atom;
      isFirst = false;
    }
  };
  _.addRelativeBondHalfParities = function addRelativeBondHalfParities(bondWithHalfParity, inverted) {
    var bwhp, bwhp$array, bwhp$index, bwhp$max;
    for (bwhp$array = bondWithHalfParity, bwhp$index = 0, bwhp$max = bwhp$array.length; bwhp$index < bwhp$max; ++bwhp$index) {
      bwhp = bwhp$array[bwhp$index];
      this.mEZHalfParity[bwhp & 1073741823] = (bwhp & 1073741824) != 0 ^ inverted ? 2 : 1;
    }
  };
  _.addToGraph = function addToGraph(smilesAtom, listIndex) {
    this.mGraphAtomList.addAtIndex(listIndex, smilesAtom);
    this.mAtomUsed[smilesAtom.atom] = true;
    if (smilesAtom.parent_0 != -1)
      this.mBondUsed[this.mMol.getBond_0(smilesAtom.atom, smilesAtom.parent_0)] = true;
  };
  _.appendBondOrderSymbol = function appendBondOrderSymbol(bond, parentAtom, builder) {
    var bondQFTypes, bondType, gap, ringState, startLength;
    startLength = builder.length_1();
    if (this.mEZHalfParity[bond] != 0)
      builder.append_4(this.mEZHalfParity[bond] == 1 ? 47 : 92);
    if (this.mMode == 1) {
      bondQFTypes = this.mMol.getBondQueryFeatures_0(bond) & 127;
      if (bondQFTypes != 0) {
        if ((bondQFTypes & 1) != 0 && this.mEZHalfParity[bond] == 0) {
          builder.append_4(45);
        }
        if ((bondQFTypes & 2) != 0) {
          if (builder.length_1() != startLength)
            builder.append_4(44);
          builder.append_4(61);
        }
        if ((bondQFTypes & 4) != 0) {
          if (builder.length_1() != startLength)
            builder.append_4(44);
          builder.append_4(35);
        }
        if ((bondQFTypes & 32) != 0) {
          if (builder.length_1() != startLength)
            builder.append_4(44);
          builder.append_4(36);
        }
        if ((bondQFTypes & 64) != 0) {
          if (builder.length_1() != startLength)
            builder.append_4(44);
          builder.append_4(36);
        }
        if ((bondQFTypes & 8) != 0) {
          if (builder.length_1() != startLength)
            builder.append_4(44);
          builder.append_4(58);
        }
        if ((bondQFTypes & 16) != 0) {
          if (builder.length_1() != startLength)
            builder.append_4(44);
          builder.append_9(this.mMol.isMetalAtom_0(parentAtom) ? "<-" : "->");
        }
      }
    }
    if (startLength == builder.length_1() && (!this.mMol.isAromaticBond_0(bond) || (this.mMode & 4) != 0)) {
      bondType = this.mMol.getBondType_0(bond) & 127;
      if (bondType == 1) {
        if (this.mMol.isAromaticAtom_0(this.mMol.getBondAtom_0(0, bond)) && this.mMol.isAromaticAtom_0(this.mMol.getBondAtom_0(1, bond)) && (this.mMode & 4) == 0 && this.mEZHalfParity[bond] == 0)
          builder.append_4(45);
      } else if (bondType == 2)
        builder.append_4(61);
      else if (bondType == 4)
        builder.append_4(35);
      else if (bondType == 32)
        builder.append_4(36);
      else if (bondType == 64)
        builder.append_4(36);
      else if (bondType == 8)
        builder.append_4(58);
      else if (bondType == 16)
        builder.append_9(this.mMol.isMetalAtom_0(parentAtom) ? "<-" : "->");
    }
    if (this.mMode == 1) {
      gap = startLength == builder.length_1() ? "" : ";";
      ringState = this.mMol.getBondQueryFeatures_0(bond) & 384;
      if (ringState == 256)
        builder.append_9(gap + "@");
      else if (ringState == 128)
        builder.append_9(gap + "!@");
    }
  };
  _.appendClosureBonds = function appendClosureBonds(smilesAtom, builder) {
    var bond, i, j;
    if (jsNotEquals(smilesAtom.closureNeighbour, null)) {
      for (i = 0; i < smilesAtom.closureNeighbour.length; i++) {
        for (j = 0; j < this.mMol.getConnAtoms_0(smilesAtom.atom); j++) {
          if (smilesAtom.closureNeighbour[i] == this.mMol.getConnAtom_0(smilesAtom.atom, j)) {
            bond = this.mMol.getConnBond_0(smilesAtom.atom, j);
            if (!smilesAtom.closureOpens[i])
              this.appendBondOrderSymbol(bond, smilesAtom.atom, builder);
            if (this.mClosureNumber[bond] > 9)
              builder.append_4(37);
            builder.append_5(this.mClosureNumber[bond]);
          }
        }
      }
    }
  };
  _.calculateEZBonds = function calculateEZBonds() {
    var bond, bondWithHalfParity, branchBond, bwhp, bwhp$array, bwhp$index, bwhp$max, childAtom, childBond, collides, connAtom, connAtom1, connAtom2, connBond1, connBond2, currentSA, currentSA$iterator, differs, ezBond, firstNeighbourIndex, firstSmilesIndex, group, halfParity2, halfParityIndex, i, i0, inverted, j, neighbourAtom, neighbourBond, overlapCount, parentSA, parity, relativeBondParityList, secondNeighbourIndex, startSize;
    relativeBondParityList = new ju.ArrayList();
    for (currentSA$iterator = this.mGraphAtomList.iterator(); currentSA$iterator.hasNext_0(); ) {
      currentSA = castTo(currentSA$iterator.next_3(), 66);
      if (currentSA.parent_0 != -1) {
        ezBond = this.mMol.getBond_0(currentSA.atom, currentSA.parent_0);
        if (!this.mMol.isBINAPChiralityBond_0(ezBond) && !this.mMol.isSmallRingBond_0(ezBond) && (this.mMol.getBondParity_0(ezBond) == 1 || this.mMol.getBondParity_0(ezBond) == 2)) {
          parentSA = castTo(this.mGraphAtomList.getAtIndex(this.mSmilesIndex[currentSA.parent_0]), 66);
          bondWithHalfParity = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getConnAtoms_0(currentSA.atom) + this.mMol.getConnAtoms_0(parentSA.atom) - 2, 15, 1);
          halfParityIndex = 0;
          parity = false;
          if (parentSA.parent_0 != -1) {
            bondWithHalfParity[halfParityIndex++] = parentSA.bond;
          } else {
            firstNeighbourIndex = -1;
            secondNeighbourIndex = -1;
            firstSmilesIndex = 2147483647;
            for (i0 = 0; i0 < this.mMol.getConnAtoms_0(parentSA.atom); i0++) {
              connAtom = this.mMol.getConnAtom_0(parentSA.atom, i0);
              if (connAtom != currentSA.atom) {
                if (firstNeighbourIndex == -1) {
                  firstNeighbourIndex = i0;
                  firstSmilesIndex = this.mSmilesIndex[connAtom];
                } else {
                  if (firstSmilesIndex < this.mSmilesIndex[connAtom]) {
                    secondNeighbourIndex = i0;
                  } else {
                    secondNeighbourIndex = firstNeighbourIndex;
                    firstNeighbourIndex = i0;
                  }
                }
              }
            }
            if (secondNeighbourIndex == -1) {
              neighbourAtom = this.mMol.getConnAtom_0(parentSA.atom, firstNeighbourIndex);
              neighbourBond = this.mMol.getConnBond_0(parentSA.atom, firstNeighbourIndex);
              bondWithHalfParity[halfParityIndex++] = neighbourBond | (this.isBondFromTo(parentSA.atom, neighbourAtom) ? 1073741824 : 0);
            } else {
              connAtom1 = this.mMol.getConnAtom_0(parentSA.atom, firstNeighbourIndex);
              connBond1 = this.mMol.getConnBond_0(parentSA.atom, firstNeighbourIndex);
              connAtom2 = this.mMol.getConnAtom_0(parentSA.atom, secondNeighbourIndex);
              connBond2 = this.mMol.getConnBond_0(parentSA.atom, secondNeighbourIndex);
              bondWithHalfParity[halfParityIndex++] = connBond1 | (this.isBondFromTo(parentSA.atom, connAtom1) ? 1073741824 : 0);
              bondWithHalfParity[halfParityIndex++] = connBond2 | (this.isBondFromTo(parentSA.atom, connAtom2) ? 0 : 1073741824);
            }
          }
          if (this.mMol.getConnAtoms_0(parentSA.atom) == 3 && parentSA.parent_0 != -1) {
            for (i0 = 0; i0 < this.mMol.getConnAtoms_0(parentSA.atom); i0++) {
              connAtom = this.mMol.getConnAtom_0(parentSA.atom, i0);
              if (connAtom != parentSA.parent_0 && connAtom != currentSA.atom) {
                branchBond = this.mMol.getConnBond_0(parentSA.atom, i0);
                bondWithHalfParity[halfParityIndex++] = branchBond | (this.isBondFromTo(parentSA.atom, connAtom) ? 1073741824 : 0);
                if (connAtom < parentSA.parent_0)
                  parity = !parity;
                break;
              }
            }
          }
          if (this.mMol.getBondParity_0(ezBond) == 2)
            parity = !parity;
          for (i = 0; i < this.mMol.getConnAtoms_0(currentSA.atom); i++) {
            childAtom = this.mMol.getConnAtom_0(currentSA.atom, i);
            if (childAtom != currentSA.parent_0) {
              halfParity2 = parity;
              if (this.mMol.getConnAtoms_0(currentSA.atom) == 3) {
                for (j = 0; j < this.mMol.getConnAtoms_0(currentSA.atom); j++) {
                  connAtom = this.mMol.getConnAtom_0(currentSA.atom, j);
                  if (connAtom != currentSA.parent_0 && connAtom != childAtom) {
                    if (connAtom < childAtom)
                      halfParity2 = !halfParity2;
                    break;
                  }
                }
              }
              if (this.mMol.isBondParityPseudo_0(ezBond)) {
                group = this.mCanonizer.getPseudoEZGroup(ezBond);
                if (!this.mPseudoStereoGroupInitialized[group]) {
                  this.mPseudoStereoGroupInitialized[group] = true;
                  this.mPseudoStereoGroupInversion[group] = halfParity2;
                }
                if (this.mPseudoStereoGroupInversion[group])
                  halfParity2 = !halfParity2;
              }
              childBond = this.mMol.getBond_0(currentSA.atom, childAtom);
              bondWithHalfParity[halfParityIndex++] = childBond | (halfParity2 ^ this.isBondFromTo(currentSA.atom, childAtom) ? 0 : 1073741824);
            }
          }
          relativeBondParityList.add(bondWithHalfParity);
        }
      }
    }
    this.mEZHalfParity = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 15, 1);
    if (relativeBondParityList.size() != 0)
      this.addRelativeBondHalfParities(castTo(relativeBondParityList.removeAtIndex(0), 6), false);
    while (relativeBondParityList.size() != 0) {
      startSize = relativeBondParityList.size();
      for (i = relativeBondParityList.size() - 1; i >= 0; i--) {
        bondWithHalfParity = castTo(relativeBondParityList.getAtIndex(i), 6);
        overlapCount = 0;
        inverted = false;
        collides = false;
        for (bwhp$array = bondWithHalfParity, bwhp$index = 0, bwhp$max = bwhp$array.length; bwhp$index < bwhp$max; ++bwhp$index) {
          bwhp = bwhp$array[bwhp$index];
          bond = bwhp & 1073741823;
          if (this.mEZHalfParity[bond] != 0) {
            differs = (bwhp & 1073741824) != 0 ^ this.mEZHalfParity[bond] == 2;
            if (overlapCount == 0)
              inverted = differs;
            else if (inverted != differs)
              collides = true;
            overlapCount++;
          }
        }
        if (overlapCount != 0) {
          bondWithHalfParity = castTo(relativeBondParityList.removeAtIndex(i), 6);
          if (!collides)
            this.addRelativeBondHalfParities(bondWithHalfParity, inverted);
        }
      }
      if (startSize == relativeBondParityList.size())
        this.addRelativeBondHalfParities(castTo(relativeBondParityList.removeAtIndex(0), 6), false);
    }
  };
  _.createMultiAtomLabel = function createMultiAtomLabel(atom, atomicNo, buffer) {
    var a, a$array, a$index, a$max, isLowerCase, label_0;
    buffer.setLength(0);
    isLowerCase = this.mMol.isAromaticAtom_0(atom) && (this.mMode & 4) == 0;
    for (a$array = atomicNo, a$index = 0, a$max = a$array.length; a$index < a$max; ++a$index) {
      a = a$array[a$index];
      if (buffer.length_1() != 0)
        buffer.append_4(44);
      label_0 = (carc2.$clinit_Molecule(), carc2.cAtomLabel)[a];
      buffer.append_9(isLowerCase ? jl.toLowerCase__Ljava_lang_String___devirtual$(label_0) : label_0);
    }
    return buffer.toString_0();
  };
  _.createSmiles = function createSmiles() {
    var atom, buffer, builder, groupCount, isFirst, smilesAtom, smilesAtom$iterator, type_0;
    if (isNull(this.mMol) || this.mMol.getAllAtoms_0() == 0)
      return "";
    this.mMol.ensureHelperArrays_0(15);
    this.mCanonizer = new carc2.Canonizer_0(this.mMol, 1 | 128);
    groupCount = this.mCanonizer.getPseudoStereoGroupCount();
    this.mPseudoStereoGroupInversion = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, groupCount + 1, 16, 1);
    this.mPseudoStereoGroupInitialized = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, groupCount + 1, 16, 1);
    this.mKnownTHCountInESRGroup = initMultidimensionalArray(cggl.I_classLit, [{ 25: 1, 4: 1, 1: 1, 7: 1 }, { 6: 1, 4: 1, 1: 1 }], [6, 5], 15, [2, 32], 2);
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      type_0 = this.mMol.getAtomESRType_0(atom) - 1;
      if (type_0 != -1)
        this.mKnownTHCountInESRGroup[type_0][this.mMol.getAtomESRGroup_0(atom)]++;
    }
    this.generateCanonicalTree();
    this.findRingClosures();
    this.calculateEZBonds();
    builder = new jl.StringBuilder();
    buffer = new jl.StringBuilder();
    isFirst = true;
    for (smilesAtom$iterator = this.mGraphAtomList.iterator(); smilesAtom$iterator.hasNext_0(); ) {
      smilesAtom = castTo(smilesAtom$iterator.next_3(), 66);
      if (smilesAtom.parent_0 == -1) {
        if (isFirst)
          isFirst = false;
        else
          builder.append_4(46);
      }
      this.addAtomString(smilesAtom, builder, buffer);
    }
    return builder.toString_0();
  };
  _.findRingClosures = function findRingClosures() {
    var bond, closureCount, closureNumberUsed, i, i0, i1, j, neighbour, smilesAtom, smilesAtom$iterator, smilesAtom$iterator0;
    for (smilesAtom$iterator0 = this.mGraphAtomList.iterator(); smilesAtom$iterator0.hasNext_0(); ) {
      smilesAtom = castTo(smilesAtom$iterator0.next_3(), 66);
      closureCount = 0;
      for (i0 = 0; i0 < this.mMol.getConnAtoms_0(smilesAtom.atom); i0++)
        if (!this.mBondUsed[this.mMol.getConnBond_0(smilesAtom.atom, i0)])
          closureCount++;
      if (closureCount != 0) {
        smilesAtom.closureNeighbour = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, closureCount, 15, 1);
        closureCount = 0;
        for (i1 = 0; i1 < this.mMol.getConnAtoms_0(smilesAtom.atom); i1++) {
          if (!this.mBondUsed[this.mMol.getConnBond_0(smilesAtom.atom, i1)]) {
            neighbour = this.mMol.getConnAtom_0(smilesAtom.atom, i1);
            smilesAtom.closureNeighbour[closureCount++] = this.mSmilesIndex[neighbour] << 16 | neighbour;
          }
        }
        ju.sort_3(smilesAtom.closureNeighbour);
        for (i = 0; i < smilesAtom.closureNeighbour.length; i++)
          smilesAtom.closureNeighbour[i] = 65535 & smilesAtom.closureNeighbour[i];
      }
    }
    closureNumberUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 16, 1);
    this.mClosureNumber = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 15, 1);
    for (smilesAtom$iterator = this.mGraphAtomList.iterator(); smilesAtom$iterator.hasNext_0(); ) {
      smilesAtom = castTo(smilesAtom$iterator.next_3(), 66);
      if (jsNotEquals(smilesAtom.closureNeighbour, null)) {
        smilesAtom.closureOpens = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, smilesAtom.closureNeighbour.length, 16, 1);
        for (i = 0; i < smilesAtom.closureNeighbour.length; i++) {
          for (j = 0; j < this.mMol.getConnAtoms_0(smilesAtom.atom); j++) {
            if (smilesAtom.closureNeighbour[i] == this.mMol.getConnAtom_0(smilesAtom.atom, j)) {
              bond = this.mMol.getConnBond_0(smilesAtom.atom, j);
              if (!this.mBondUsed[bond]) {
                this.mBondUsed[bond] = true;
                smilesAtom.closureOpens[i] = true;
                this.mClosureNumber[bond] = 1;
                while (closureNumberUsed[this.mClosureNumber[bond]])
                  this.mClosureNumber[bond]++;
                closureNumberUsed[this.mClosureNumber[bond]] = true;
              } else {
                closureNumberUsed[this.mClosureNumber[bond]] = false;
              }
            }
          }
        }
      }
    }
  };
  _.findUnusedStartAtom = function findUnusedStartAtom() {
    var atom, rank, startAtom, startRank;
    startAtom = -1;
    startRank = 2147483647;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (!this.mAtomUsed[atom]) {
        rank = this.mAtomRank[atom];
        if (this.mMol.isExcludeGroupAtom(atom))
          rank += 1073741824;
        if (this.mMol.getConnAtoms_0(atom) == 0)
          rank += 1056964608;
        else
          rank += this.mMol.getConnAtoms_0(atom) << 24;
        if (startRank > rank) {
          startRank = rank;
          startAtom = atom;
        }
      }
    }
    return startAtom;
  };
  _.generateCanonicalTree = function generateCanonicalTree() {
    var atom, graphIndex, index_0, smilesAtom, smilesAtom$iterator;
    this.mAtomRank = this.mCanonizer.getFinalRank_0();
    this.mAtomUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    this.mBondUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 16, 1);
    this.mGraphAtomList = new ju.ArrayList();
    atom = this.findUnusedStartAtom();
    while (atom != -1) {
      graphIndex = this.mGraphAtomList.size();
      this.addToGraph(new carc2.SmilesAtom(atom, -1, -1, false, false), graphIndex);
      if (this.mMol.getConnAtoms_0(atom) != 0) {
        this.addHighestRankingChain(graphIndex, false);
        while (graphIndex < this.mGraphAtomList.size() - 1) {
          while (this.hasUnusedNeighborAtom(castTo(this.mGraphAtomList.getAtIndex(graphIndex), 66).atom))
            this.addHighestRankingChain(graphIndex, true);
          graphIndex++;
        }
      }
      atom = this.findUnusedStartAtom();
    }
    this.mSmilesIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    index_0 = 0;
    for (smilesAtom$iterator = this.mGraphAtomList.iterator(); smilesAtom$iterator.hasNext_0(); ) {
      smilesAtom = castTo(smilesAtom$iterator.next_3(), 66);
      this.mSmilesIndex[smilesAtom.atom] = index_0++;
    }
  };
  _.getAtomParitySymbol = function getAtomParitySymbol(atom, parent_0) {
    var connAtom, group, i, i0, index_0, inversion, isClockwise, j, neighborAtom, neighborRank, neighbour, neighbours;
    inversion = false;
    if (this.mMol.getAtomPi_0(atom) != 0 && this.mMol.getConnAtoms_0(atom) == 2 && this.mMol.getConnBondOrder_0(atom, 0) == 2 && this.mMol.getConnBondOrder_0(atom, 1) == 2) {
      for (i0 = 0; i0 < this.mMol.getConnAtoms_0(atom); i0++) {
        connAtom = this.mMol.getConnAtom_0(atom, i0);
        if (connAtom != parent_0 && this.mMol.getConnAtoms_0(connAtom) == 2) {
          inversion = true;
          break;
        }
      }
      for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++) {
        connAtom = this.mMol.getConnAtom_0(atom, i);
        neighbours = 0;
        neighbour = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
        for (j = 0; j < this.mMol.getConnAtoms_0(connAtom); j++) {
          neighbour[neighbours] = this.mMol.getConnAtom_0(connAtom, j);
          if (neighbour[neighbours] != atom)
            neighbours++;
        }
        if (neighbours == 2 && this.mSmilesIndex[neighbour[0]] < this.mSmilesIndex[neighbour[1]] ^ neighbour[0] < neighbour[1])
          inversion = !inversion;
      }
    } else {
      neighborAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
      neighborRank = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
      index_0 = 0;
      if (parent_0 != -1) {
        neighborAtom[index_0] = parent_0;
        neighborRank[index_0++] = 8 * this.mSmilesIndex[parent_0];
      }
      if (this.mMol.getImplicitHydrogens_1(atom) != 0) {
        neighborAtom[index_0] = 2147483647;
        neighborRank[index_0++] = 8 * this.mSmilesIndex[atom];
      } else if (this.mMol.getConnAtoms_0(atom) == 3) {
        neighborAtom[index_0] = 2147483647;
        neighborRank[index_0++] = 8 * this.mSmilesIndex[atom];
      }
      for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++) {
        connAtom = this.mMol.getConnAtom_0(atom, i);
        if (connAtom != parent_0) {
          neighborAtom[index_0] = connAtom;
          neighborRank[index_0++] = this.getSmilesRank(atom, i);
        }
      }
      inversion = this.isInverseOrder(neighborAtom, neighborRank);
    }
    isClockwise = this.mMol.getAtomParity_0(atom) == 1 ^ inversion;
    if (this.mMol.isAtomParityPseudo_0(atom)) {
      group = this.mCanonizer.getPseudoTHGroup(atom);
      if (!this.mPseudoStereoGroupInitialized[group]) {
        this.mPseudoStereoGroupInitialized[group] = true;
        this.mPseudoStereoGroupInversion[group] = isClockwise;
      }
      if (this.mPseudoStereoGroupInversion[group])
        isClockwise = !isClockwise;
    }
    return isClockwise ? "@@" : "@";
  };
  _.getAtomSMARTSFeatures = function getAtomSMARTSFeatures(atom, buffer) {
    var aromState, chargeFeatures, hydrogenQueryFeatures, neighbourFeatures, queryFeatures, ringSize, ringState;
    buffer.setLength(0);
    queryFeatures = this.mMol.getAtomQueryFeatures(atom);
    chargeFeatures = toInt_0(shr_0(and_0(queryFeatures, 234881024), 3));
    switch (chargeFeatures) {
      case toInt_0(shr_0(or_0(33554432, 134217728), 3)):
        buffer.append_9("+0");
        break;
      case toInt_0(shr_0(or_0(67108864, 134217728), 3)):
        if (this.mMol.getAtomCharge_0(atom) == 0)
          buffer.append_9("-");
        break;
      case toInt_0(shr_0(or_0(67108864, 33554432), 3)):
        if (this.mMol.getAtomCharge_0(atom) == 0)
          buffer.append_9("+");
        break;
    }
    aromState = and_0(queryFeatures, { l: 6, m: 0, h: 4 });
    if (eq(aromState, 2))
      buffer.append_9(";a");
    else if (eq(aromState, 4))
      buffer.append_9(";A");
    hydrogenQueryFeatures = and_0(queryFeatures, 1920);
    if (neq(hydrogenQueryFeatures, 0)) {
      if (eq(hydrogenQueryFeatures, or_0(or_0(256, 512), 1024)))
        buffer.append_9(";H0");
      else if (eq(hydrogenQueryFeatures, or_0(or_0(128, 512), 1024)))
        buffer.append_9(";H1");
      else if (eq(hydrogenQueryFeatures, or_0(or_0(128, 256), 1024)))
        buffer.append_9(";H2");
      else if (eq(hydrogenQueryFeatures, or_0(or_0(128, 256), 512)))
        buffer.append_9(";H3");
      else if (eq(hydrogenQueryFeatures, 128))
        buffer.append_9(";!H0");
      else if (eq(hydrogenQueryFeatures, or_0(128, 256)))
        buffer.append_9(";!H0;!H1");
      else if (eq(hydrogenQueryFeatures, or_0(512, 1024)))
        buffer.append_9(";!H2;!H3");
      else if (eq(hydrogenQueryFeatures, 1024))
        buffer.append_9(";!H3");
    }
    ringState = and_0(queryFeatures, 120);
    if (eq(ringState, 8))
      buffer.append_9(";!R0");
    else if (eq(ringState, 16))
      buffer.append_9(";!R1");
    else if (eq(ringState, 32))
      buffer.append_9(";!R2");
    else if (eq(ringState, 64))
      buffer.append_9(";!R3");
    else if (eq(ringState, or_0(or_0(16, 32), 64)))
      buffer.append_9(";R0");
    else if (eq(ringState, or_0(or_0(8, 32), 64)))
      buffer.append_9(";R1");
    else if (eq(ringState, or_0(or_0(8, 16), 64)))
      buffer.append_9(";R2");
    else if (eq(ringState, or_0(or_0(8, 16), 32)))
      buffer.append_9(";R3");
    ringSize = and_0(queryFeatures, 545460846592);
    if (eq(ringSize, 4294967296))
      buffer.append_9(";!r" + toString_28(ringSize));
    else if (eq(ringSize, and_0(545460846592, not_0(4294967296))))
      buffer.append_9(";r" + toString_28(ringSize));
    else if (neq(ringSize, 0)) {
      if (neq(and_0(ringSize, 274877906944), 0)) {
        if (eq(and_0(ringSize, 4294967296), 0))
          buffer.append_9(";!r0" + toString_28(ringSize));
        if (eq(and_0(ringSize, 8589934592), 0))
          buffer.append_9(";!r3" + toString_28(ringSize));
        if (eq(and_0(ringSize, 17179869184), 0))
          buffer.append_9(";!r4" + toString_28(ringSize));
        if (eq(and_0(ringSize, 34359738368), 0))
          buffer.append_9(";!r5" + toString_28(ringSize));
        if (eq(and_0(ringSize, 68719476736), 0))
          buffer.append_9(";!r6" + toString_28(ringSize));
        if (eq(and_0(ringSize, 137438953472), 0))
          buffer.append_9(";!r7" + toString_28(ringSize));
      } else {
        buffer.append_9(";");
        if (neq(and_0(ringSize, 4294967296), 0))
          buffer.append_9("r0," + toString_28(ringSize));
        if (neq(and_0(ringSize, 8589934592), 0))
          buffer.append_9("r3," + toString_28(ringSize));
        if (neq(and_0(ringSize, 17179869184), 0))
          buffer.append_9("r4," + toString_28(ringSize));
        if (neq(and_0(ringSize, 34359738368), 0))
          buffer.append_9("r5," + toString_28(ringSize));
        if (neq(and_0(ringSize, 68719476736), 0))
          buffer.append_9("r6," + toString_28(ringSize));
        if (neq(and_0(ringSize, 137438953472), 0))
          buffer.append_9("r7," + toString_28(ringSize));
        buffer.setLength(buffer.length_1() - 1);
      }
    }
    if (eq(ringSize, 0)) {
      ringSize = shr_0(and_0(queryFeatures, 29360128), 22);
      if (neq(ringSize, 0))
        buffer.append_9(";r" + toString_28(ringSize));
    }
    neighbourFeatures = and_0(queryFeatures, 4063232);
    if (eq(neighbourFeatures, and_0(4063232, not_0(262144))))
      buffer.append_9(";D1");
    if (eq(neighbourFeatures, and_0(4063232, not_0(524288))))
      buffer.append_9(";D2");
    if (eq(neighbourFeatures, and_0(4063232, not_0(1048576))))
      buffer.append_9(";D3");
    if (eq(neighbourFeatures, or_0(1048576, 2097152)))
      buffer.append_9(";!D3;!D4");
    if (eq(neighbourFeatures, 2097152))
      buffer.append_9(";!D4");
    if (eq(neighbourFeatures, or_0(131072, 262144)))
      buffer.append_9(";!D0;!D1");
    if (eq(neighbourFeatures, or_0(or_0(131072, 262144), 524288)))
      buffer.append_9(";!D0;!D1;!D2");
    if (eq(neighbourFeatures, and_0(4063232, not_0(2097152))))
      buffer.append_9(";!D0;!D1;!D2;!D3");
    if (neq(and_0(queryFeatures, 2048), 0))
      buffer.append_9(";D" + this.mMol.getConnAtoms_0(atom));
    if (neq(and_0(queryFeatures, 4096), 0))
      buffer.append_9(";!D" + this.mMol.getConnAtoms_0(atom));
    return buffer.length_1() == 0 ? null : buffer.toString_0();
  };
  _.getSmiles = function getSmiles() {
    if (jsEquals(this.mSmiles, null))
      this.mSmiles = this.createSmiles();
    return this.mSmiles;
  };
  _.getSmilesRank = function getSmilesRank(atom, neighbourIndex) {
    var bond, closureNeighbour, i, neighbour, rank;
    bond = this.mMol.getConnBond_0(atom, neighbourIndex);
    neighbour = this.mMol.getConnAtom_0(atom, neighbourIndex);
    if (this.mClosureNumber[bond] != 0) {
      rank = 8 * this.mSmilesIndex[atom] + 1;
      closureNeighbour = castTo(this.mGraphAtomList.getAtIndex(this.mSmilesIndex[atom]), 66).closureNeighbour;
      for (i = 0; i < closureNeighbour.length && neighbour != closureNeighbour[i]; i++)
        rank++;
      return rank;
    }
    return 8 * this.mSmilesIndex[neighbour];
  };
  _.getUnusedConnAtomIndex = function getUnusedConnAtomIndex(atom) {
    var bestIndex, bestRank, connAtom, i, rank;
    bestIndex = -1;
    bestRank = -1;
    for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++) {
      connAtom = this.mMol.getConnAtom_0(atom, i);
      rank = (this.mMol.getConnBondOrder_0(atom, i) << 24) + this.mAtomRank[connAtom];
      if (!this.mAtomUsed[connAtom] && (bestIndex == -1 || bestRank < rank)) {
        bestIndex = i;
        bestRank = rank;
      }
    }
    return bestIndex;
  };
  _.hasUnusedNeighborAtom = function hasUnusedNeighborAtom(atom) {
    var i;
    for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++)
      if (!this.mAtomUsed[this.mMol.getConnAtom_0(atom, i)])
        return true;
    return false;
  };
  _.isBondFromTo = function isBondFromTo(atom1, atom2) {
    var sa1, sa2;
    sa1 = castTo(this.mGraphAtomList.getAtIndex(this.mSmilesIndex[atom1]), 66);
    if (sa1.parent_0 == atom2)
      return false;
    sa2 = castTo(this.mGraphAtomList.getAtIndex(this.mSmilesIndex[atom2]), 66);
    if (sa2.parent_0 == atom1)
      return true;
    return sa2.isOpeningClosureTo(atom1);
  };
  _.isInverseOrder = function isInverseOrder(neighborAtom, neighborRank) {
    var i, inversion, j;
    inversion = false;
    for (i = 1; i < 4; i++) {
      for (j = 0; j < i; j++) {
        if (neighborAtom[j] > neighborAtom[i])
          inversion = !inversion;
        if (neighborRank[j] > neighborRank[i])
          inversion = !inversion;
      }
    }
    return inversion;
  };
  _.isOrganic = function isOrganic(atomicNo) {
    return atomicNo >= 5 && atomicNo <= 9 || atomicNo >= 15 && atomicNo <= 17 || atomicNo == 35 || atomicNo == 53;
  };
  _.isSingleKnownStereoCenterInESRGroup = function isSingleKnownStereoCenterInESRGroup(atom) {
    var type_0;
    type_0 = this.mMol.getAtomESRType_0(atom) - 1;
    return type_0 == -1 ? false : this.mKnownTHCountInESRGroup[type_0][this.mMol.getAtomESRGroup_0(atom)] <= 1;
  };
  _.qualifiesForAtomParity = function qualifiesForAtomParity(atom) {
    return (this.mMol.getAtomParity_0(atom) == 1 || this.mMol.getAtomParity_0(atom) == 2) && !this.isSingleKnownStereoCenterInESRGroup(atom) && (this.mMol.getAtomicNo_0(atom) != 7 || this.mMol.getAtomCharge_0(atom) > 0);
  };
  _.mMode = 0;
  carc2.MODE_CREATE_SMARTS = 1;
  carc2.MODE_INCLUDE_MAPPING = 2;
  carc2.MODE_KEKULIZED_OUTPUT = 4;
  cggl.Lcom_actelion_research_chem_IsomericSmilesCreator_2_classLit = createForClass("com.actelion.research.chem", "IsomericSmilesCreator", 127, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_Isotope = function $clinit_Isotope() {
    carc2.$clinit_Isotope = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.Isotope = function Isotope(neutrones, absoluteMass, percentage) {
    carc2.$clinit_Isotope();
    Object_0.call(this);
    this.$init_34();
    this.neutrones = neutrones;
    this.absoluteMass = absoluteMass;
    this.percentage = percentage;
  };
  defineClass(3, 1, { 3: 1, 1: 1 }, carc2.Isotope);
  _.$init_34 = function $init_34() {
  };
  _.absoluteMass = 0;
  _.neutrones = 0;
  _.percentage = 0;
  cggl.Lcom_actelion_research_chem_Isotope_2_classLit = createForClass("com.actelion.research.chem", "Isotope", 3, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_IsotopeHelper = function $clinit_IsotopeHelper() {
    carc2.$clinit_IsotopeHelper = emptyMethod;
    jl.$clinit_Object();
    carc2.sIsotope = stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 2), { 4: 1, 1: 1, 7: 1 }, 14, 0, [null, stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(0, 1.007825032, 100), new carc2.Isotope(1, 2.014101778, 0.015), new carc2.Isotope(2, 3.016049268, 0), new carc2.Isotope(3, 4.027834627, 0), new carc2.Isotope(4, 5.039542911, 0), new carc2.Isotope(5, 6.044942608, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(1, 3.01602931, 1e-4), new carc2.Isotope(2, 4.00260325, 100), new carc2.Isotope(3, 5.012223628, 0), new carc2.Isotope(4, 6.018888072, 0), new carc2.Isotope(5, 7.028030527, 0), new carc2.Isotope(6, 8.033921838, 0), new carc2.Isotope(7, 9.043820323, 0), new carc2.Isotope(8, 10.052399713, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(1, 4.027182329, 0), new carc2.Isotope(2, 5.012537796, 0), new carc2.Isotope(3, 6.015122281, 8.1081), new carc2.Isotope(4, 7.016004049, 100), new carc2.Isotope(5, 8.02248667, 0), new carc2.Isotope(6, 9.026789122, 0), new carc2.Isotope(7, 10.035480884, 0), new carc2.Isotope(8, 11.043796166, 0), new carc2.Isotope(9, 12.05378, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(1, 5.04079, 0), new carc2.Isotope(2, 6.019725804, 0), new carc2.Isotope(3, 7.016929246, 0), new carc2.Isotope(4, 8.005305094, 0), new carc2.Isotope(5, 9.012182135, 100), new carc2.Isotope(6, 10.01353372, 0), new carc2.Isotope(7, 11.021657653, 0), new carc2.Isotope(8, 12.026920631, 0), new carc2.Isotope(9, 13.036133834, 0), new carc2.Isotope(10, 14.042815522, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(2, 7.029917389, 0), new carc2.Isotope(3, 8.024606713, 0), new carc2.Isotope(4, 9.013328806, 0), new carc2.Isotope(5, 10.012937027, 24.8439), new carc2.Isotope(6, 11.009305466, 100), new carc2.Isotope(7, 12.014352109, 0), new carc2.Isotope(8, 13.017780267, 0), new carc2.Isotope(9, 14.025404064, 0), new carc2.Isotope(10, 15.031097291, 0), new carc2.Isotope(11, 16.039808836, 0), new carc2.Isotope(12, 17.046931399, 0), new carc2.Isotope(13, 18.05617, 0), new carc2.Isotope(14, 19.06373, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(2, 8.037675026, 0), new carc2.Isotope(3, 9.031040087, 0), new carc2.Isotope(4, 10.01685311, 0), new carc2.Isotope(5, 11.011433818, 0), new carc2.Isotope(6, 12, 100), new carc2.Isotope(7, 13.003354838, 1.1122), new carc2.Isotope(8, 14.003241988, 0), new carc2.Isotope(9, 15.010599258, 0), new carc2.Isotope(10, 16.014701243, 0), new carc2.Isotope(11, 17.022583712, 0), new carc2.Isotope(12, 18.026757058, 0), new carc2.Isotope(13, 19.035248094, 0), new carc2.Isotope(14, 20.040322395, 0), new carc2.Isotope(15, 21.04934, 0), new carc2.Isotope(16, 22.05645, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(3, 10.042618, 0), new carc2.Isotope(4, 11.026796226, 0), new carc2.Isotope(5, 12.018613202, 0), new carc2.Isotope(6, 13.005738584, 0), new carc2.Isotope(7, 14.003074005, 100), new carc2.Isotope(8, 15.000108898, 0.3673), new carc2.Isotope(9, 16.006101417, 0), new carc2.Isotope(10, 17.008449673, 0), new carc2.Isotope(11, 18.014081827, 0), new carc2.Isotope(12, 19.017026896, 0), new carc2.Isotope(13, 20.023367295, 0), new carc2.Isotope(14, 21.027087574, 0), new carc2.Isotope(15, 22.034440259, 0), new carc2.Isotope(16, 23.04051, 0), new carc2.Isotope(17, 24.0505, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(4, 12.034404776, 0), new carc2.Isotope(5, 13.0248104, 0), new carc2.Isotope(6, 14.008595285, 0), new carc2.Isotope(7, 15.003065386, 0), new carc2.Isotope(8, 15.994914622, 100), new carc2.Isotope(9, 16.999131501, 0.0381), new carc2.Isotope(10, 17.999160419, 0.2005), new carc2.Isotope(11, 19.00357873, 0), new carc2.Isotope(12, 20.00407615, 0), new carc2.Isotope(13, 21.008654631, 0), new carc2.Isotope(14, 22.009967157, 0), new carc2.Isotope(15, 23.015691325, 0), new carc2.Isotope(16, 24.020369922, 0), new carc2.Isotope(17, 25.02914, 0), new carc2.Isotope(18, 26.03775, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(5, 14.03608, 0), new carc2.Isotope(6, 15.018010856, 0), new carc2.Isotope(7, 16.01146573, 0), new carc2.Isotope(8, 17.002095238, 0), new carc2.Isotope(9, 18.000937667, 0), new carc2.Isotope(10, 18.998403205, 100), new carc2.Isotope(11, 19.999981324, 0), new carc2.Isotope(12, 20.999948921, 0), new carc2.Isotope(13, 22.00299925, 0), new carc2.Isotope(14, 23.003574385, 0), new carc2.Isotope(15, 24.008099371, 0), new carc2.Isotope(16, 25.012094963, 0), new carc2.Isotope(17, 26.019633157, 0), new carc2.Isotope(18, 27.026892316, 0), new carc2.Isotope(19, 28.03567, 0), new carc2.Isotope(20, 29.04326, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(6, 16.025756907, 0), new carc2.Isotope(7, 17.017697565, 0), new carc2.Isotope(8, 18.005697066, 0), new carc2.Isotope(9, 19.001879839, 0), new carc2.Isotope(10, 19.992440176, 100), new carc2.Isotope(11, 20.993846744, 0.2983), new carc2.Isotope(12, 21.99138551, 10.1867), new carc2.Isotope(13, 22.994467337, 0), new carc2.Isotope(14, 23.993615074, 0), new carc2.Isotope(15, 24.997789899, 0), new carc2.Isotope(16, 26.000461498, 0), new carc2.Isotope(17, 27.0076152, 0), new carc2.Isotope(18, 28.012108072, 0), new carc2.Isotope(19, 29.019345902, 0), new carc2.Isotope(20, 30.023872, 0), new carc2.Isotope(21, 31.03311, 0), new carc2.Isotope(22, 32.03991, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(7, 18.02718, 0), new carc2.Isotope(8, 19.01387945, 0), new carc2.Isotope(9, 20.00734826, 0), new carc2.Isotope(10, 20.997655099, 0), new carc2.Isotope(11, 21.994436782, 0), new carc2.Isotope(12, 22.989769675, 100), new carc2.Isotope(13, 23.990963332, 0), new carc2.Isotope(14, 24.989954352, 0), new carc2.Isotope(15, 25.992589898, 0), new carc2.Isotope(16, 26.994008702, 0), new carc2.Isotope(17, 27.99889041, 0), new carc2.Isotope(18, 29.002811301, 0), new carc2.Isotope(19, 30.009226487, 0), new carc2.Isotope(20, 31.013595108, 0), new carc2.Isotope(21, 32.019649792, 0), new carc2.Isotope(22, 33.027386, 0), new carc2.Isotope(23, 34.0349, 0), new carc2.Isotope(24, 35.04418, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(8, 20.018862744, 0), new carc2.Isotope(9, 21.011714174, 0), new carc2.Isotope(10, 21.999574055, 0), new carc2.Isotope(11, 22.99412485, 0), new carc2.Isotope(12, 23.985041898, 100), new carc2.Isotope(13, 24.985837023, 12.6598), new carc2.Isotope(14, 25.98259304, 13.938), new carc2.Isotope(15, 26.984340742, 0), new carc2.Isotope(16, 27.983876703, 0), new carc2.Isotope(17, 28.988554743, 0), new carc2.Isotope(18, 29.990464529, 0), new carc2.Isotope(19, 30.996548459, 0), new carc2.Isotope(20, 31.999145889, 0), new carc2.Isotope(21, 33.005586975, 0), new carc2.Isotope(22, 34.00907244, 0), new carc2.Isotope(23, 35.018669, 0), new carc2.Isotope(24, 36.02245, 0), new carc2.Isotope(25, 37.03124, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(8, 21.02804, 0), new carc2.Isotope(9, 22.01952, 0), new carc2.Isotope(10, 23.0072649, 0), new carc2.Isotope(11, 23.999940911, 0), new carc2.Isotope(12, 24.990428555, 0), new carc2.Isotope(13, 25.986891659, 0), new carc2.Isotope(14, 26.981538441, 100), new carc2.Isotope(15, 27.981910184, 0), new carc2.Isotope(16, 28.980444848, 0), new carc2.Isotope(17, 29.982960304, 0), new carc2.Isotope(18, 30.983946023, 0), new carc2.Isotope(19, 31.988124379, 0), new carc2.Isotope(20, 32.990869587, 0), new carc2.Isotope(21, 33.996927255, 0), new carc2.Isotope(22, 34.99993765, 0), new carc2.Isotope(23, 36.006351501, 0), new carc2.Isotope(24, 37.01031, 0), new carc2.Isotope(25, 38.0169, 0), new carc2.Isotope(26, 39.0219, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(8, 22.03453, 0), new carc2.Isotope(9, 23.02552, 0), new carc2.Isotope(10, 24.011545711, 0), new carc2.Isotope(11, 25.00410664, 0), new carc2.Isotope(12, 25.992329935, 0), new carc2.Isotope(13, 26.986704764, 0), new carc2.Isotope(14, 27.976926533, 100), new carc2.Isotope(15, 28.976494719, 5.0634), new carc2.Isotope(16, 29.973770218, 3.3612), new carc2.Isotope(17, 30.975363275, 0), new carc2.Isotope(18, 31.974148129, 0), new carc2.Isotope(19, 32.97800052, 0), new carc2.Isotope(20, 33.978575745, 0), new carc2.Isotope(21, 34.984584158, 0), new carc2.Isotope(22, 35.986687363, 0), new carc2.Isotope(23, 36.99299599, 0), new carc2.Isotope(24, 37.99598, 0), new carc2.Isotope(25, 39.0023, 0), new carc2.Isotope(26, 40.0058, 0), new carc2.Isotope(27, 41.0127, 0), new carc2.Isotope(28, 42.0161, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(9, 24.03435, 0), new carc2.Isotope(10, 25.02026, 0), new carc2.Isotope(11, 26.01178, 0), new carc2.Isotope(12, 26.999191645, 0), new carc2.Isotope(13, 27.99231233, 0), new carc2.Isotope(14, 28.981801376, 0), new carc2.Isotope(15, 29.978313807, 0), new carc2.Isotope(16, 30.973761512, 100), new carc2.Isotope(17, 31.973907163, 0), new carc2.Isotope(18, 32.971725281, 0), new carc2.Isotope(19, 33.973636381, 0), new carc2.Isotope(20, 34.973314249, 0), new carc2.Isotope(21, 35.978259824, 0), new carc2.Isotope(22, 36.979608338, 0), new carc2.Isotope(23, 37.98447, 0), new carc2.Isotope(24, 38.98642, 0), new carc2.Isotope(25, 39.99105, 0), new carc2.Isotope(26, 40.9948, 0), new carc2.Isotope(27, 42.00009, 0), new carc2.Isotope(28, 43.00331, 0), new carc2.Isotope(29, 44.00988, 0), new carc2.Isotope(30, 45.01514, 0), new carc2.Isotope(31, 46.02383, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(10, 26.02788, 0), new carc2.Isotope(11, 27.018795, 0), new carc2.Isotope(12, 28.004372661, 0), new carc2.Isotope(13, 28.996608805, 0), new carc2.Isotope(14, 29.984902954, 0), new carc2.Isotope(15, 30.979554421, 0), new carc2.Isotope(16, 31.97207069, 100), new carc2.Isotope(17, 32.971458497, 0.7893), new carc2.Isotope(18, 33.967866831, 4.4306), new carc2.Isotope(19, 34.96903214, 0), new carc2.Isotope(20, 35.96708088, 0.022), new carc2.Isotope(21, 36.971125716, 0), new carc2.Isotope(22, 37.971163443, 0), new carc2.Isotope(23, 38.975135275, 0), new carc2.Isotope(24, 39.97547, 0), new carc2.Isotope(25, 40.98003, 0), new carc2.Isotope(26, 41.98149, 0), new carc2.Isotope(27, 42.9866, 0), new carc2.Isotope(28, 43.98832, 0), new carc2.Isotope(29, 44.99482, 0), new carc2.Isotope(30, 45.99957, 0), new carc2.Isotope(31, 47.00762, 0), new carc2.Isotope(32, 48.01299, 0), new carc2.Isotope(33, 49.02201, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(11, 28.02851, 0), new carc2.Isotope(12, 29.01411, 0), new carc2.Isotope(13, 30.00477, 0), new carc2.Isotope(14, 30.992416014, 0), new carc2.Isotope(15, 31.985688908, 0), new carc2.Isotope(16, 32.977451798, 0), new carc2.Isotope(17, 33.973761967, 0), new carc2.Isotope(18, 34.968852707, 100), new carc2.Isotope(19, 35.968306945, 0), new carc2.Isotope(20, 36.9659026, 31.978), new carc2.Isotope(21, 37.96801055, 0), new carc2.Isotope(22, 38.968007677, 0), new carc2.Isotope(23, 39.970415555, 0), new carc2.Isotope(24, 40.970650212, 0), new carc2.Isotope(25, 41.973174994, 0), new carc2.Isotope(26, 42.974203385, 0), new carc2.Isotope(27, 43.978538712, 0), new carc2.Isotope(28, 44.9797, 0), new carc2.Isotope(29, 45.98412, 0), new carc2.Isotope(30, 46.98795, 0), new carc2.Isotope(31, 47.99485, 0), new carc2.Isotope(32, 48.99989, 0), new carc2.Isotope(33, 50.00773, 0), new carc2.Isotope(34, 51.01353, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(12, 30.02156, 0), new carc2.Isotope(13, 31.012126, 0), new carc2.Isotope(14, 31.99766066, 0), new carc2.Isotope(15, 32.989928719, 0), new carc2.Isotope(16, 33.980270118, 0), new carc2.Isotope(17, 34.975256726, 0), new carc2.Isotope(18, 35.967546282, 0.338), new carc2.Isotope(19, 36.966775912, 0), new carc2.Isotope(20, 37.962732161, 0.063), new carc2.Isotope(21, 38.964313413, 0), new carc2.Isotope(22, 39.962383123, 100), new carc2.Isotope(23, 40.964500828, 0), new carc2.Isotope(24, 41.963046386, 0), new carc2.Isotope(25, 42.965670701, 0), new carc2.Isotope(26, 43.965365269, 0), new carc2.Isotope(27, 44.968094979, 0), new carc2.Isotope(28, 45.968093467, 0), new carc2.Isotope(29, 46.972186238, 0), new carc2.Isotope(30, 47.97507, 0), new carc2.Isotope(31, 48.98218, 0), new carc2.Isotope(32, 49.98594, 0), new carc2.Isotope(33, 50.99324, 0), new carc2.Isotope(34, 51.99817, 0), new carc2.Isotope(35, 53.006227, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(13, 32.02192, 0), new carc2.Isotope(14, 33.00726, 0), new carc2.Isotope(15, 33.99841, 0), new carc2.Isotope(16, 34.988011615, 0), new carc2.Isotope(17, 35.981293405, 0), new carc2.Isotope(18, 36.973376915, 0), new carc2.Isotope(19, 37.969080107, 0), new carc2.Isotope(20, 38.963706861, 100), new carc2.Isotope(21, 39.963998672, 0.013), new carc2.Isotope(22, 40.961825972, 7.217), new carc2.Isotope(23, 41.962403059, 0), new carc2.Isotope(24, 42.960715746, 0), new carc2.Isotope(25, 43.961556146, 0), new carc2.Isotope(26, 44.960699658, 0), new carc2.Isotope(27, 45.961976203, 0), new carc2.Isotope(28, 46.961677807, 0), new carc2.Isotope(29, 47.965512946, 0), new carc2.Isotope(30, 48.967450084, 0), new carc2.Isotope(31, 49.972782832, 0), new carc2.Isotope(32, 50.97638, 0), new carc2.Isotope(33, 51.98261, 0), new carc2.Isotope(34, 52.98712, 0), new carc2.Isotope(35, 53.99399, 0), new carc2.Isotope(36, 54.999388, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(14, 34.01412, 0), new carc2.Isotope(15, 35.004765, 0), new carc2.Isotope(16, 35.993087234, 0), new carc2.Isotope(17, 36.985871505, 0), new carc2.Isotope(18, 37.976318637, 0), new carc2.Isotope(19, 38.970717729, 0), new carc2.Isotope(20, 39.962591155, 100), new carc2.Isotope(21, 40.962278349, 0), new carc2.Isotope(22, 41.958618337, 0.6674), new carc2.Isotope(23, 42.958766833, 0.1393), new carc2.Isotope(24, 43.955481094, 2.1518), new carc2.Isotope(25, 44.956185938, 0), new carc2.Isotope(26, 45.953692759, 41e-4), new carc2.Isotope(27, 46.954546459, 0), new carc2.Isotope(28, 47.952533512, 0.1929), new carc2.Isotope(29, 48.955673302, 0), new carc2.Isotope(30, 49.957518286, 0), new carc2.Isotope(31, 50.961474238, 0), new carc2.Isotope(32, 51.9651, 0), new carc2.Isotope(33, 52.97005, 0), new carc2.Isotope(34, 53.97468, 0), new carc2.Isotope(35, 54.98055, 0), new carc2.Isotope(36, 55.98579, 0), new carc2.Isotope(37, 56.992356, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(15, 36.01492, 0), new carc2.Isotope(16, 37.00305, 0), new carc2.Isotope(17, 37.9947, 0), new carc2.Isotope(18, 38.984790009, 0), new carc2.Isotope(19, 39.977964014, 0), new carc2.Isotope(20, 40.969251316, 0), new carc2.Isotope(21, 41.965516761, 0), new carc2.Isotope(22, 42.96115098, 0), new carc2.Isotope(23, 43.959403048, 0), new carc2.Isotope(24, 44.955910243, 100), new carc2.Isotope(25, 45.95517025, 0), new carc2.Isotope(26, 46.952408027, 0), new carc2.Isotope(27, 47.952234991, 0), new carc2.Isotope(28, 48.950024065, 0), new carc2.Isotope(29, 49.952187008, 0), new carc2.Isotope(30, 50.9536027, 0), new carc2.Isotope(31, 51.95665, 0), new carc2.Isotope(32, 52.95817, 0), new carc2.Isotope(33, 53.963, 0), new carc2.Isotope(34, 54.9694, 0), new carc2.Isotope(35, 55.97266, 0), new carc2.Isotope(36, 56.97704, 0), new carc2.Isotope(37, 57.98307, 0), new carc2.Isotope(38, 58.988041, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(16, 38.00977, 0), new carc2.Isotope(17, 39.001323, 0), new carc2.Isotope(18, 39.990498907, 0), new carc2.Isotope(19, 40.983131, 0), new carc2.Isotope(20, 41.973031622, 0), new carc2.Isotope(21, 42.968523342, 0), new carc2.Isotope(22, 43.959690235, 0), new carc2.Isotope(23, 44.958124349, 0), new carc2.Isotope(24, 45.952629491, 10.8401), new carc2.Isotope(25, 46.951763792, 9.8916), new carc2.Isotope(26, 47.947947053, 100), new carc2.Isotope(27, 48.947870789, 7.4526), new carc2.Isotope(28, 49.944792069, 7.3171), new carc2.Isotope(29, 50.946616017, 0), new carc2.Isotope(30, 51.946898175, 0), new carc2.Isotope(31, 52.949731709, 0), new carc2.Isotope(32, 53.95087, 0), new carc2.Isotope(33, 54.95512, 0), new carc2.Isotope(34, 55.95799, 0), new carc2.Isotope(35, 56.9643, 0), new carc2.Isotope(36, 57.96611, 0), new carc2.Isotope(37, 58.97196, 0), new carc2.Isotope(38, 59.97564, 0), new carc2.Isotope(39, 60.982018, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(17, 40.01109, 0), new carc2.Isotope(18, 40.99974, 0), new carc2.Isotope(19, 41.99123, 0), new carc2.Isotope(20, 42.98065, 0), new carc2.Isotope(21, 43.9744, 0), new carc2.Isotope(22, 44.965782286, 0), new carc2.Isotope(23, 45.960199491, 0), new carc2.Isotope(24, 46.954906918, 0), new carc2.Isotope(25, 47.95225448, 0), new carc2.Isotope(26, 48.948516914, 0), new carc2.Isotope(27, 49.947162792, 0.251), new carc2.Isotope(28, 50.943963675, 100), new carc2.Isotope(29, 51.944779658, 0), new carc2.Isotope(30, 52.944342517, 0), new carc2.Isotope(31, 53.946444381, 0), new carc2.Isotope(32, 54.947238194, 0), new carc2.Isotope(33, 55.95036, 0), new carc2.Isotope(34, 56.95236, 0), new carc2.Isotope(35, 57.95665, 0), new carc2.Isotope(36, 58.9593, 0), new carc2.Isotope(37, 59.9645, 0), new carc2.Isotope(38, 60.96741, 0), new carc2.Isotope(39, 61.97314, 0), new carc2.Isotope(40, 62.97675, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(18, 42.00643, 0), new carc2.Isotope(19, 42.997707, 0), new carc2.Isotope(20, 43.98547, 0), new carc2.Isotope(21, 44.97916, 0), new carc2.Isotope(22, 45.968361649, 0), new carc2.Isotope(23, 46.962906512, 0), new carc2.Isotope(24, 47.954035861, 0), new carc2.Isotope(25, 48.951341135, 0), new carc2.Isotope(26, 49.946049607, 5.1915), new carc2.Isotope(27, 50.944771767, 0), new carc2.Isotope(28, 51.940511904, 100), new carc2.Isotope(29, 52.940653781, 11.3379), new carc2.Isotope(30, 53.938884921, 2.8166), new carc2.Isotope(31, 54.940844164, 0), new carc2.Isotope(32, 55.940645238, 0), new carc2.Isotope(33, 56.9437538, 0), new carc2.Isotope(34, 57.94425, 0), new carc2.Isotope(35, 58.94863, 0), new carc2.Isotope(36, 59.94973, 0), new carc2.Isotope(37, 60.95409, 0), new carc2.Isotope(38, 61.9558, 0), new carc2.Isotope(39, 62.96186, 0), new carc2.Isotope(40, 63.9642, 0), new carc2.Isotope(41, 64.97037, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(19, 44.00687, 0), new carc2.Isotope(20, 44.99451, 0), new carc2.Isotope(21, 45.98672, 0), new carc2.Isotope(22, 46.9761, 0), new carc2.Isotope(23, 47.96887, 0), new carc2.Isotope(24, 48.959623415, 0), new carc2.Isotope(25, 49.95424396, 0), new carc2.Isotope(26, 50.948215487, 0), new carc2.Isotope(27, 51.945570079, 0), new carc2.Isotope(28, 52.941294702, 0), new carc2.Isotope(29, 53.940363247, 0), new carc2.Isotope(30, 54.938049636, 100), new carc2.Isotope(31, 55.938909366, 0), new carc2.Isotope(32, 56.938287458, 0), new carc2.Isotope(33, 57.939986451, 0), new carc2.Isotope(34, 58.940447166, 0), new carc2.Isotope(35, 59.943193998, 0), new carc2.Isotope(36, 60.94446, 0), new carc2.Isotope(37, 61.94797, 0), new carc2.Isotope(38, 62.94981, 0), new carc2.Isotope(39, 63.95373, 0), new carc2.Isotope(40, 64.9561, 0), new carc2.Isotope(41, 65.96082, 0), new carc2.Isotope(42, 66.96382, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(19, 45.01456, 0), new carc2.Isotope(20, 46.00081, 0), new carc2.Isotope(21, 46.99289, 0), new carc2.Isotope(22, 47.98056, 0), new carc2.Isotope(23, 48.97361, 0), new carc2.Isotope(24, 49.962993316, 0), new carc2.Isotope(25, 50.956824936, 0), new carc2.Isotope(26, 51.948116526, 0), new carc2.Isotope(27, 52.945312282, 0), new carc2.Isotope(28, 53.939614836, 6.3236), new carc2.Isotope(29, 54.938298029, 0), new carc2.Isotope(30, 55.934942133, 100), new carc2.Isotope(31, 56.935398707, 2.3986), new carc2.Isotope(32, 57.933280458, 0.3053), new carc2.Isotope(33, 58.934880493, 0), new carc2.Isotope(34, 59.934076943, 0), new carc2.Isotope(35, 60.936749461, 0), new carc2.Isotope(36, 61.936770495, 0), new carc2.Isotope(37, 62.940118442, 0), new carc2.Isotope(38, 63.94087, 0), new carc2.Isotope(39, 64.94494, 0), new carc2.Isotope(40, 65.94598, 0), new carc2.Isotope(41, 66.95, 0), new carc2.Isotope(42, 67.95251, 0), new carc2.Isotope(43, 68.9577, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(21, 48.00176, 0), new carc2.Isotope(22, 48.98972, 0), new carc2.Isotope(23, 49.98154, 0), new carc2.Isotope(24, 50.97072, 0), new carc2.Isotope(25, 51.96359, 0), new carc2.Isotope(26, 52.954224985, 0), new carc2.Isotope(27, 53.948464147, 0), new carc2.Isotope(28, 54.942003149, 0), new carc2.Isotope(29, 55.939843937, 0), new carc2.Isotope(30, 56.936296235, 0), new carc2.Isotope(31, 57.935757571, 0), new carc2.Isotope(32, 58.933200194, 100), new carc2.Isotope(33, 59.933822196, 0), new carc2.Isotope(34, 60.932479381, 0), new carc2.Isotope(35, 61.934054212, 0), new carc2.Isotope(36, 62.933615218, 0), new carc2.Isotope(37, 63.935813523, 0), new carc2.Isotope(38, 64.936484581, 0), new carc2.Isotope(39, 65.939825412, 0), new carc2.Isotope(40, 66.94061, 0), new carc2.Isotope(41, 67.94436, 0), new carc2.Isotope(42, 68.9452, 0), new carc2.Isotope(43, 69.94981, 0), new carc2.Isotope(44, 70.95173, 0), new carc2.Isotope(45, 71.95641, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(22, 49.99593, 0), new carc2.Isotope(23, 50.98772, 0), new carc2.Isotope(24, 51.97568, 0), new carc2.Isotope(25, 52.96846, 0), new carc2.Isotope(26, 53.957910508, 0), new carc2.Isotope(27, 54.951336329, 0), new carc2.Isotope(28, 55.942136339, 0), new carc2.Isotope(29, 56.939800489, 0), new carc2.Isotope(30, 57.935347922, 100), new carc2.Isotope(31, 58.934351553, 0), new carc2.Isotope(32, 59.930790633, 38.2305), new carc2.Isotope(33, 60.931060442, 1.6552), new carc2.Isotope(34, 61.928348763, 5.2585), new carc2.Isotope(35, 62.929672948, 0), new carc2.Isotope(36, 63.927969574, 1.3329), new carc2.Isotope(37, 64.930088013, 0), new carc2.Isotope(38, 65.929115232, 0), new carc2.Isotope(39, 66.931569638, 0), new carc2.Isotope(40, 67.931844932, 0), new carc2.Isotope(41, 68.935181837, 0), new carc2.Isotope(42, 69.93614, 0), new carc2.Isotope(43, 70.94, 0), new carc2.Isotope(44, 71.9413, 0), new carc2.Isotope(45, 72.94608, 0), new carc2.Isotope(46, 73.94791, 0), new carc2.Isotope(47, 74.95297, 0), new carc2.Isotope(48, 75.95533, 0), new carc2.Isotope(49, 76.96083, 0), new carc2.Isotope(50, 77.9638, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(23, 51.99718, 0), new carc2.Isotope(24, 52.98555, 0), new carc2.Isotope(25, 53.97671, 0), new carc2.Isotope(26, 54.96605, 0), new carc2.Isotope(27, 55.95856, 0), new carc2.Isotope(28, 56.949215695, 0), new carc2.Isotope(29, 57.944540734, 0), new carc2.Isotope(30, 58.939504114, 0), new carc2.Isotope(31, 59.937368123, 0), new carc2.Isotope(32, 60.933462181, 0), new carc2.Isotope(33, 61.932587299, 0), new carc2.Isotope(34, 62.929601079, 100), new carc2.Isotope(35, 63.929767865, 0), new carc2.Isotope(36, 64.927793707, 44.571), new carc2.Isotope(37, 65.928873041, 0), new carc2.Isotope(38, 66.927750294, 0), new carc2.Isotope(39, 67.929637875, 0), new carc2.Isotope(40, 68.929425281, 0), new carc2.Isotope(41, 69.932409287, 0), new carc2.Isotope(42, 70.932619818, 0), new carc2.Isotope(43, 71.93552, 0), new carc2.Isotope(44, 72.93649, 0), new carc2.Isotope(45, 73.9402, 0), new carc2.Isotope(46, 74.9417, 0), new carc2.Isotope(47, 75.94599, 0), new carc2.Isotope(48, 76.94795, 0), new carc2.Isotope(49, 77.95281, 0), new carc2.Isotope(50, 78.95528, 0), new carc2.Isotope(51, 79.96189, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(24, 53.99295, 0), new carc2.Isotope(25, 54.98398, 0), new carc2.Isotope(26, 55.97238, 0), new carc2.Isotope(27, 56.96491, 0), new carc2.Isotope(28, 57.954596465, 0), new carc2.Isotope(29, 58.949267074, 0), new carc2.Isotope(30, 59.941832031, 0), new carc2.Isotope(31, 60.939513907, 0), new carc2.Isotope(32, 61.934334132, 0), new carc2.Isotope(33, 62.933215563, 0), new carc2.Isotope(34, 63.929146578, 100), new carc2.Isotope(35, 64.929245079, 0), new carc2.Isotope(36, 65.926036763, 57.4074), new carc2.Isotope(37, 66.927130859, 8.4362), new carc2.Isotope(38, 67.924847566, 38.6831), new carc2.Isotope(39, 68.926553538, 0), new carc2.Isotope(40, 69.92532487, 1.2346), new carc2.Isotope(41, 70.927727195, 0), new carc2.Isotope(42, 71.926861122, 0), new carc2.Isotope(43, 72.929779469, 0), new carc2.Isotope(44, 73.929458261, 0), new carc2.Isotope(45, 74.932937379, 0), new carc2.Isotope(46, 75.933394207, 0), new carc2.Isotope(47, 76.937085857, 0), new carc2.Isotope(48, 77.938569576, 0), new carc2.Isotope(49, 78.942095175, 0), new carc2.Isotope(50, 79.944414722, 0), new carc2.Isotope(51, 80.95048, 0), new carc2.Isotope(52, 81.95484, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(25, 55.99491, 0), new carc2.Isotope(26, 56.98293, 0), new carc2.Isotope(27, 57.97425, 0), new carc2.Isotope(28, 58.96337, 0), new carc2.Isotope(29, 59.95706, 0), new carc2.Isotope(30, 60.94917, 0), new carc2.Isotope(31, 61.944179608, 0), new carc2.Isotope(32, 62.939141527, 0), new carc2.Isotope(33, 63.936838307, 0), new carc2.Isotope(34, 64.932739322, 0), new carc2.Isotope(35, 65.931592355, 0), new carc2.Isotope(36, 66.928204915, 0), new carc2.Isotope(37, 67.927983497, 0), new carc2.Isotope(38, 68.925580912, 100), new carc2.Isotope(39, 69.926027741, 0), new carc2.Isotope(40, 70.92470501, 66.389), new carc2.Isotope(41, 71.92636935, 0), new carc2.Isotope(42, 72.925169832, 0), new carc2.Isotope(43, 73.926940999, 0), new carc2.Isotope(44, 74.926500645, 0), new carc2.Isotope(45, 75.928928262, 0), new carc2.Isotope(46, 76.929281189, 0), new carc2.Isotope(47, 77.93165595, 0), new carc2.Isotope(48, 78.932916371, 0), new carc2.Isotope(49, 79.936588154, 0), new carc2.Isotope(50, 80.937752955, 0), new carc2.Isotope(51, 81.94316, 0), new carc2.Isotope(52, 82.94687, 0), new carc2.Isotope(53, 83.95234, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(26, 57.99101, 0), new carc2.Isotope(27, 58.98175, 0), new carc2.Isotope(28, 59.97019, 0), new carc2.Isotope(29, 60.96379, 0), new carc2.Isotope(30, 61.95465, 0), new carc2.Isotope(31, 62.94964, 0), new carc2.Isotope(32, 63.941572638, 0), new carc2.Isotope(33, 64.939440762, 0), new carc2.Isotope(34, 65.933846798, 0), new carc2.Isotope(35, 66.932738415, 0), new carc2.Isotope(36, 67.928097266, 0), new carc2.Isotope(37, 68.927972002, 0), new carc2.Isotope(38, 69.924250365, 56.1644), new carc2.Isotope(39, 70.924953991, 0), new carc2.Isotope(40, 71.922076184, 75.0685), new carc2.Isotope(41, 72.923459361, 21.3698), new carc2.Isotope(42, 73.921178213, 100), new carc2.Isotope(43, 74.922859494, 21.3698), new carc2.Isotope(44, 75.921402716, 0), new carc2.Isotope(45, 76.923548462, 0), new carc2.Isotope(46, 77.922852886, 0), new carc2.Isotope(47, 78.92540156, 0), new carc2.Isotope(48, 79.925444764, 0), new carc2.Isotope(49, 80.928821065, 0), new carc2.Isotope(50, 81.929550326, 0), new carc2.Isotope(51, 82.93451, 0), new carc2.Isotope(52, 83.93731, 0), new carc2.Isotope(53, 84.94269, 0), new carc2.Isotope(54, 85.94627, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(27, 59.99313, 0), new carc2.Isotope(28, 60.98062, 0), new carc2.Isotope(29, 61.9732, 0), new carc2.Isotope(30, 62.96369, 0), new carc2.Isotope(31, 63.957572, 0), new carc2.Isotope(32, 64.949484, 0), new carc2.Isotope(33, 65.944099147, 0), new carc2.Isotope(34, 66.939190417, 0), new carc2.Isotope(35, 67.936792976, 0), new carc2.Isotope(36, 68.932280154, 0), new carc2.Isotope(37, 69.930927811, 0), new carc2.Isotope(38, 70.927114724, 0), new carc2.Isotope(39, 71.926752647, 0), new carc2.Isotope(40, 72.923825288, 0), new carc2.Isotope(41, 73.923929076, 0), new carc2.Isotope(42, 74.921596417, 100), new carc2.Isotope(43, 75.922393933, 0), new carc2.Isotope(44, 76.920647703, 0), new carc2.Isotope(45, 77.921828577, 0), new carc2.Isotope(46, 78.920948498, 0), new carc2.Isotope(47, 79.922578162, 0), new carc2.Isotope(48, 80.922132884, 0), new carc2.Isotope(49, 81.924504668, 0), new carc2.Isotope(50, 82.924980625, 0), new carc2.Isotope(51, 83.92906, 0), new carc2.Isotope(52, 84.93181, 0), new carc2.Isotope(53, 85.93623, 0), new carc2.Isotope(54, 86.93958, 0), new carc2.Isotope(55, 87.94456, 0), new carc2.Isotope(56, 88.94923, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(31, 64.96466, 0), new carc2.Isotope(32, 65.95521, 0), new carc2.Isotope(33, 66.95009, 0), new carc2.Isotope(34, 67.94187, 0), new carc2.Isotope(35, 68.939562155, 0), new carc2.Isotope(36, 69.933504, 0), new carc2.Isotope(37, 70.931868378, 0), new carc2.Isotope(38, 71.927112313, 0), new carc2.Isotope(39, 72.9267668, 0), new carc2.Isotope(40, 73.922476561, 1.8145), new carc2.Isotope(41, 74.922523571, 0), new carc2.Isotope(42, 75.919214107, 18.1451), new carc2.Isotope(43, 76.91991461, 15.3226), new carc2.Isotope(44, 77.917309522, 47.379), new carc2.Isotope(45, 78.918499802, 0), new carc2.Isotope(46, 79.916521828, 100), new carc2.Isotope(47, 80.917992931, 0), new carc2.Isotope(48, 81.9167, 18.9516), new carc2.Isotope(49, 82.919119072, 0), new carc2.Isotope(50, 83.918464523, 0), new carc2.Isotope(51, 84.922244678, 0), new carc2.Isotope(52, 85.924271165, 0), new carc2.Isotope(53, 86.928520749, 0), new carc2.Isotope(54, 87.931423982, 0), new carc2.Isotope(55, 88.93602, 0), new carc2.Isotope(56, 89.93942, 0), new carc2.Isotope(57, 90.94537, 0), new carc2.Isotope(58, 91.94933, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(32, 66.96479, 0), new carc2.Isotope(33, 67.958248, 0), new carc2.Isotope(34, 68.950178, 0), new carc2.Isotope(35, 69.944208, 0), new carc2.Isotope(36, 70.939246, 0), new carc2.Isotope(37, 71.936496876, 0), new carc2.Isotope(38, 72.931794889, 0), new carc2.Isotope(39, 73.929891152, 0), new carc2.Isotope(40, 74.92577641, 0), new carc2.Isotope(41, 75.924541974, 0), new carc2.Isotope(42, 76.921380123, 0), new carc2.Isotope(43, 77.92114613, 0), new carc2.Isotope(44, 78.918337647, 100), new carc2.Isotope(45, 79.918529952, 0), new carc2.Isotope(46, 80.91629106, 97.2776), new carc2.Isotope(47, 81.916804666, 0), new carc2.Isotope(48, 82.915180219, 0), new carc2.Isotope(49, 83.916503685, 0), new carc2.Isotope(50, 84.915608027, 0), new carc2.Isotope(51, 85.918797162, 0), new carc2.Isotope(52, 86.920710713, 0), new carc2.Isotope(53, 87.924065908, 0), new carc2.Isotope(54, 88.92638726, 0), new carc2.Isotope(55, 89.930634988, 0), new carc2.Isotope(56, 90.9339653, 0), new carc2.Isotope(57, 91.939255258, 0), new carc2.Isotope(58, 92.9431, 0), new carc2.Isotope(59, 93.94868, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(33, 68.96532, 0), new carc2.Isotope(34, 69.95601, 0), new carc2.Isotope(35, 70.95051, 0), new carc2.Isotope(36, 71.94190754, 0), new carc2.Isotope(37, 72.938931115, 0), new carc2.Isotope(38, 73.933258225, 0), new carc2.Isotope(39, 74.931033794, 0), new carc2.Isotope(40, 75.925948304, 0), new carc2.Isotope(41, 76.92466788, 0), new carc2.Isotope(42, 77.920386271, 85.910614), new carc2.Isotope(43, 78.920082992, 0), new carc2.Isotope(44, 79.91637804, 0.614), new carc2.Isotope(45, 80.916592419, 0), new carc2.Isotope(46, 81.913484601, 3.9474), new carc2.Isotope(47, 82.914135952, 20.3509), new carc2.Isotope(48, 83.911506627, 100), new carc2.Isotope(49, 84.912526954, 0), new carc2.Isotope(50, 85.910610313, 30.3509), new carc2.Isotope(51, 86.913354251, 0), new carc2.Isotope(52, 87.914446951, 0), new carc2.Isotope(53, 88.917632505, 0), new carc2.Isotope(54, 89.919523803, 0), new carc2.Isotope(55, 90.923442418, 0), new carc2.Isotope(56, 91.926152752, 0), new carc2.Isotope(57, 92.931265246, 0), new carc2.Isotope(58, 93.934362, 0), new carc2.Isotope(59, 94.93984, 0), new carc2.Isotope(60, 95.94307, 0), new carc2.Isotope(61, 96.94856, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(34, 70.96532, 0), new carc2.Isotope(35, 71.95908, 0), new carc2.Isotope(36, 72.950366, 0), new carc2.Isotope(37, 73.944470376, 0), new carc2.Isotope(38, 74.938569199, 0), new carc2.Isotope(39, 75.935071448, 0), new carc2.Isotope(40, 76.930406599, 0), new carc2.Isotope(41, 77.928141485, 0), new carc2.Isotope(42, 78.923996719, 0), new carc2.Isotope(43, 79.922519322, 0), new carc2.Isotope(44, 80.918994165, 0), new carc2.Isotope(45, 81.918207691, 0), new carc2.Isotope(46, 82.915111951, 0), new carc2.Isotope(47, 83.914384676, 0), new carc2.Isotope(48, 84.911789341, 100), new carc2.Isotope(49, 85.91116708, 0), new carc2.Isotope(50, 86.909183465, 38.571), new carc2.Isotope(51, 87.911318556, 0), new carc2.Isotope(52, 88.912279939, 0), new carc2.Isotope(53, 89.914808941, 0), new carc2.Isotope(54, 90.91653416, 0), new carc2.Isotope(55, 91.919725442, 0), new carc2.Isotope(56, 92.922032765, 0), new carc2.Isotope(57, 93.926407326, 0), new carc2.Isotope(58, 94.92931926, 0), new carc2.Isotope(59, 95.934283962, 0), new carc2.Isotope(60, 96.937342863, 0), new carc2.Isotope(61, 97.941703557, 0), new carc2.Isotope(62, 98.945420616, 0), new carc2.Isotope(63, 99.94987, 0), new carc2.Isotope(64, 100.953195994, 0), new carc2.Isotope(65, 101.95921, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(35, 72.96597, 0), new carc2.Isotope(36, 73.95631, 0), new carc2.Isotope(37, 74.94992, 0), new carc2.Isotope(38, 75.94161, 0), new carc2.Isotope(39, 76.937761511, 0), new carc2.Isotope(40, 77.932179362, 0), new carc2.Isotope(41, 78.929707076, 0), new carc2.Isotope(42, 79.924524588, 0), new carc2.Isotope(43, 80.923213095, 0), new carc2.Isotope(44, 81.918401258, 0), new carc2.Isotope(45, 82.917555029, 0), new carc2.Isotope(46, 83.913424778, 0.6781), new carc2.Isotope(47, 84.912932689, 0), new carc2.Isotope(48, 85.909262351, 11.9399), new carc2.Isotope(49, 86.908879316, 8.4766), new carc2.Isotope(50, 87.905614339, 100), new carc2.Isotope(51, 88.907452906, 0), new carc2.Isotope(52, 89.907737596, 0), new carc2.Isotope(53, 90.910209845, 0), new carc2.Isotope(54, 91.911029895, 0), new carc2.Isotope(55, 92.91402241, 0), new carc2.Isotope(56, 93.915359856, 0), new carc2.Isotope(57, 94.919358213, 0), new carc2.Isotope(58, 95.921680473, 0), new carc2.Isotope(59, 96.926148757, 0), new carc2.Isotope(60, 97.928471177, 0), new carc2.Isotope(61, 98.933315038, 0), new carc2.Isotope(62, 99.935351729, 0), new carc2.Isotope(63, 100.940517434, 0), new carc2.Isotope(64, 101.943018795, 0), new carc2.Isotope(65, 102.94895, 0), new carc2.Isotope(66, 103.95233, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(38, 76.94962, 0), new carc2.Isotope(39, 77.9435, 0), new carc2.Isotope(40, 78.937350712, 0), new carc2.Isotope(41, 79.931982402, 0), new carc2.Isotope(42, 80.929128719, 0), new carc2.Isotope(43, 81.926792071, 0), new carc2.Isotope(44, 82.922352572, 0), new carc2.Isotope(45, 83.920387768, 0), new carc2.Isotope(46, 84.916427076, 0), new carc2.Isotope(47, 85.914887724, 0), new carc2.Isotope(48, 86.910877833, 0), new carc2.Isotope(49, 87.909503361, 0), new carc2.Isotope(50, 88.905847902, 100), new carc2.Isotope(51, 89.907151443, 0), new carc2.Isotope(52, 90.907303415, 0), new carc2.Isotope(53, 91.908946832, 0), new carc2.Isotope(54, 92.909581582, 0), new carc2.Isotope(55, 93.911594008, 0), new carc2.Isotope(56, 94.912823709, 0), new carc2.Isotope(57, 95.915897787, 0), new carc2.Isotope(58, 96.918131017, 0), new carc2.Isotope(59, 97.922219525, 0), new carc2.Isotope(60, 98.924634736, 0), new carc2.Isotope(61, 99.927756402, 0), new carc2.Isotope(62, 100.930313395, 0), new carc2.Isotope(63, 101.933555501, 0), new carc2.Isotope(64, 102.93694, 0), new carc2.Isotope(65, 103.94145, 0), new carc2.Isotope(66, 104.94509, 0), new carc2.Isotope(67, 105.95022, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(39, 78.94916, 0), new carc2.Isotope(40, 79.94055, 0), new carc2.Isotope(41, 80.936815296, 0), new carc2.Isotope(42, 81.931086249, 0), new carc2.Isotope(43, 82.92865213, 0), new carc2.Isotope(44, 83.92325, 0), new carc2.Isotope(45, 84.92146522, 0), new carc2.Isotope(46, 85.916472851, 0), new carc2.Isotope(47, 86.914816578, 0), new carc2.Isotope(48, 87.910226179, 0), new carc2.Isotope(49, 88.908888916, 0), new carc2.Isotope(50, 89.904703679, 100), new carc2.Isotope(51, 90.905644968, 21.9048), new carc2.Isotope(52, 91.905040106, 33.3822), new carc2.Isotope(53, 92.906475627, 0), new carc2.Isotope(54, 93.906315765, 33.6832), new carc2.Isotope(55, 94.908042739, 0), new carc2.Isotope(56, 95.908275675, 5.4033), new carc2.Isotope(57, 96.910950716, 0), new carc2.Isotope(58, 97.912746366, 0), new carc2.Isotope(59, 98.916511084, 0), new carc2.Isotope(60, 99.917761704, 0), new carc2.Isotope(61, 100.921139958, 0), new carc2.Isotope(62, 101.922981089, 0), new carc2.Isotope(63, 102.926597062, 0), new carc2.Isotope(64, 103.92878, 0), new carc2.Isotope(65, 104.93305, 0), new carc2.Isotope(66, 105.93591, 0), new carc2.Isotope(67, 106.94086, 0), new carc2.Isotope(68, 107.94428, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(40, 80.94905, 0), new carc2.Isotope(41, 81.94313, 0), new carc2.Isotope(42, 82.936703713, 0), new carc2.Isotope(43, 83.93357, 0), new carc2.Isotope(44, 84.927906486, 0), new carc2.Isotope(45, 85.925037588, 0), new carc2.Isotope(46, 86.920361435, 0), new carc2.Isotope(47, 87.91833144, 0), new carc2.Isotope(48, 88.913495503, 0), new carc2.Isotope(49, 89.911264109, 0), new carc2.Isotope(50, 90.906990538, 0), new carc2.Isotope(51, 91.907193214, 0), new carc2.Isotope(52, 92.906377543, 100), new carc2.Isotope(53, 93.907283457, 0), new carc2.Isotope(54, 94.906835178, 0), new carc2.Isotope(55, 95.908100076, 0), new carc2.Isotope(56, 96.908097144, 0), new carc2.Isotope(57, 97.91033069, 0), new carc2.Isotope(58, 98.911617864, 0), new carc2.Isotope(59, 99.914181434, 0), new carc2.Isotope(60, 100.915251567, 0), new carc2.Isotope(61, 101.918037417, 0), new carc2.Isotope(62, 102.919141297, 0), new carc2.Isotope(63, 103.922459464, 0), new carc2.Isotope(64, 104.923934023, 0), new carc2.Isotope(65, 105.92819, 0), new carc2.Isotope(66, 106.93031, 0), new carc2.Isotope(67, 107.93501, 0), new carc2.Isotope(68, 108.93763, 0), new carc2.Isotope(69, 109.94268, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(41, 82.94874, 0), new carc2.Isotope(42, 83.94009, 0), new carc2.Isotope(43, 84.93659, 0), new carc2.Isotope(44, 85.930695167, 0), new carc2.Isotope(45, 86.92732683, 0), new carc2.Isotope(46, 87.921952728, 0), new carc2.Isotope(47, 88.919480562, 0), new carc2.Isotope(48, 89.913936161, 0), new carc2.Isotope(49, 90.911750754, 0), new carc2.Isotope(50, 91.90681048, 61.5002), new carc2.Isotope(51, 92.906812213, 0), new carc2.Isotope(52, 93.905087578, 38.334), new carc2.Isotope(53, 94.905841487, 65.976), new carc2.Isotope(54, 95.904678904, 69.1256), new carc2.Isotope(55, 96.906021033, 39.5773), new carc2.Isotope(56, 97.905407846, 100), new carc2.Isotope(57, 98.907711598, 0), new carc2.Isotope(58, 99.907477149, 39.9088), new carc2.Isotope(59, 100.910346543, 0), new carc2.Isotope(60, 101.910297162, 0), new carc2.Isotope(61, 102.913204596, 0), new carc2.Isotope(62, 103.913758387, 0), new carc2.Isotope(63, 104.916972087, 0), new carc2.Isotope(64, 105.918134284, 0), new carc2.Isotope(65, 106.921694724, 0), new carc2.Isotope(66, 107.923973837, 0), new carc2.Isotope(67, 108.92781, 0), new carc2.Isotope(68, 109.92973, 0), new carc2.Isotope(69, 110.93451, 0), new carc2.Isotope(70, 111.93684, 0), new carc2.Isotope(71, 112.94203, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(42, 84.94894, 0), new carc2.Isotope(43, 85.94288, 0), new carc2.Isotope(44, 86.93653, 0), new carc2.Isotope(45, 87.93283, 0), new carc2.Isotope(46, 88.92754288, 0), new carc2.Isotope(47, 89.92355583, 0), new carc2.Isotope(48, 90.9184282, 0), new carc2.Isotope(49, 91.915259655, 0), new carc2.Isotope(50, 92.910248473, 0), new carc2.Isotope(51, 93.909656309, 0), new carc2.Isotope(52, 94.907656454, 0), new carc2.Isotope(53, 95.907870803, 0), new carc2.Isotope(54, 96.906364843, 0), new carc2.Isotope(55, 97.907215692, 0), new carc2.Isotope(56, 98.906254554, 0), new carc2.Isotope(57, 99.907657594, 0), new carc2.Isotope(58, 100.90731438, 0), new carc2.Isotope(59, 101.909212938, 0), new carc2.Isotope(60, 102.909178805, 0), new carc2.Isotope(61, 103.911444898, 0), new carc2.Isotope(62, 104.911658043, 0), new carc2.Isotope(63, 105.914355408, 0), new carc2.Isotope(64, 106.915081691, 0), new carc2.Isotope(65, 107.918479973, 0), new carc2.Isotope(66, 108.919980998, 0), new carc2.Isotope(67, 109.92339, 0), new carc2.Isotope(68, 110.92505, 0), new carc2.Isotope(69, 111.92924, 0), new carc2.Isotope(70, 112.93133, 0), new carc2.Isotope(71, 113.93588, 0), new carc2.Isotope(72, 114.93828, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(43, 86.94918, 0), new carc2.Isotope(44, 87.94042, 0), new carc2.Isotope(45, 88.93611, 0), new carc2.Isotope(46, 89.92978, 0), new carc2.Isotope(47, 90.926377434, 0), new carc2.Isotope(48, 91.92012, 0), new carc2.Isotope(49, 92.917051523, 0), new carc2.Isotope(50, 93.911359569, 0), new carc2.Isotope(51, 94.910412729, 0), new carc2.Isotope(52, 95.907597681, 17.4684), new carc2.Isotope(53, 96.907554546, 0), new carc2.Isotope(54, 97.905287111, 5.9494), new carc2.Isotope(55, 98.905939307, 40.1899), new carc2.Isotope(56, 99.904219664, 39.8734), new carc2.Isotope(57, 100.905582219, 53.7975), new carc2.Isotope(58, 101.904349503, 100), new carc2.Isotope(59, 102.906323677, 0), new carc2.Isotope(60, 103.905430145, 59.1772), new carc2.Isotope(61, 104.907750341, 0), new carc2.Isotope(62, 105.907326913, 0), new carc2.Isotope(63, 106.909907207, 0), new carc2.Isotope(64, 107.910192211, 0), new carc2.Isotope(65, 108.913201565, 0), new carc2.Isotope(66, 109.913966185, 0), new carc2.Isotope(67, 110.91756, 0), new carc2.Isotope(68, 111.918821673, 0), new carc2.Isotope(69, 112.92254, 0), new carc2.Isotope(70, 113.923891981, 0), new carc2.Isotope(71, 114.92831, 0), new carc2.Isotope(72, 115.93016, 0), new carc2.Isotope(73, 116.93479, 0), new carc2.Isotope(74, 117.93703, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(44, 88.94938, 0), new carc2.Isotope(45, 89.94287, 0), new carc2.Isotope(46, 90.93655, 0), new carc2.Isotope(47, 91.93198, 0), new carc2.Isotope(48, 92.92574, 0), new carc2.Isotope(49, 93.921698, 0), new carc2.Isotope(50, 94.915898541, 0), new carc2.Isotope(51, 95.914518212, 0), new carc2.Isotope(52, 96.911336643, 0), new carc2.Isotope(53, 97.910716431, 0), new carc2.Isotope(54, 98.908132101, 0), new carc2.Isotope(55, 99.90811663, 0), new carc2.Isotope(56, 100.906163526, 0), new carc2.Isotope(57, 101.906842845, 0), new carc2.Isotope(58, 102.905504182, 100), new carc2.Isotope(59, 103.906655315, 0), new carc2.Isotope(60, 104.905692444, 0), new carc2.Isotope(61, 105.907284615, 0), new carc2.Isotope(62, 106.90675054, 0), new carc2.Isotope(63, 107.908730768, 0), new carc2.Isotope(64, 108.908735621, 0), new carc2.Isotope(65, 109.910949525, 0), new carc2.Isotope(66, 110.91166, 0), new carc2.Isotope(67, 111.913969253, 0), new carc2.Isotope(68, 112.91542, 0), new carc2.Isotope(69, 113.91734336, 0), new carc2.Isotope(70, 114.920124676, 0), new carc2.Isotope(71, 115.922746643, 0), new carc2.Isotope(72, 116.92535, 0), new carc2.Isotope(73, 117.92943, 0), new carc2.Isotope(74, 118.93136, 0), new carc2.Isotope(75, 119.93578, 0), new carc2.Isotope(76, 120.93808, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(45, 90.94948, 0), new carc2.Isotope(46, 91.94042, 0), new carc2.Isotope(47, 92.93591, 0), new carc2.Isotope(48, 93.92877, 0), new carc2.Isotope(49, 94.92469, 0), new carc2.Isotope(50, 95.91822194, 0), new carc2.Isotope(51, 96.916478921, 0), new carc2.Isotope(52, 97.912720751, 0), new carc2.Isotope(53, 98.911767757, 0), new carc2.Isotope(54, 99.908504596, 0), new carc2.Isotope(55, 100.908289144, 0), new carc2.Isotope(56, 101.905607716, 3.7322), new carc2.Isotope(57, 102.906087204, 0), new carc2.Isotope(58, 103.904034912, 40.7611), new carc2.Isotope(59, 104.905084046, 81.7051), new carc2.Isotope(60, 105.903483087, 100), new carc2.Isotope(61, 106.905128453, 0), new carc2.Isotope(62, 107.903894451, 96.8167), new carc2.Isotope(63, 108.905953535, 0), new carc2.Isotope(64, 109.905152385, 42.8833), new carc2.Isotope(65, 110.907643952, 0), new carc2.Isotope(66, 111.907313277, 0), new carc2.Isotope(67, 112.910151346, 0), new carc2.Isotope(68, 113.910365322, 0), new carc2.Isotope(69, 114.91368341, 0), new carc2.Isotope(70, 115.914158288, 0), new carc2.Isotope(71, 116.91784, 0), new carc2.Isotope(72, 117.918983915, 0), new carc2.Isotope(73, 118.92268, 0), new carc2.Isotope(74, 119.92403, 0), new carc2.Isotope(75, 120.92818, 0), new carc2.Isotope(76, 121.9298, 0), new carc2.Isotope(77, 122.93426, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(47, 93.94278, 0), new carc2.Isotope(48, 94.93548, 0), new carc2.Isotope(49, 95.93068, 0), new carc2.Isotope(50, 96.924, 0), new carc2.Isotope(51, 97.921759995, 0), new carc2.Isotope(52, 98.917597103, 0), new carc2.Isotope(53, 99.916069387, 0), new carc2.Isotope(54, 100.912802135, 0), new carc2.Isotope(55, 101.911999996, 0), new carc2.Isotope(56, 102.908972453, 0), new carc2.Isotope(57, 103.908628228, 0), new carc2.Isotope(58, 104.906528234, 0), new carc2.Isotope(59, 105.906666431, 0), new carc2.Isotope(60, 106.90509302, 100), new carc2.Isotope(61, 107.905953705, 0), new carc2.Isotope(62, 108.904755514, 92.905), new carc2.Isotope(63, 109.90611046, 0), new carc2.Isotope(64, 110.905294679, 0), new carc2.Isotope(65, 111.907004132, 0), new carc2.Isotope(66, 112.906565708, 0), new carc2.Isotope(67, 113.908807907, 0), new carc2.Isotope(68, 114.908762282, 0), new carc2.Isotope(69, 115.911359558, 0), new carc2.Isotope(70, 116.911684187, 0), new carc2.Isotope(71, 117.914582383, 0), new carc2.Isotope(72, 118.915666045, 0), new carc2.Isotope(73, 119.918788609, 0), new carc2.Isotope(74, 120.919851074, 0), new carc2.Isotope(75, 121.92332, 0), new carc2.Isotope(76, 122.9249, 0), new carc2.Isotope(77, 123.92853, 0), new carc2.Isotope(78, 124.93054, 0), new carc2.Isotope(79, 125.9345, 0), new carc2.Isotope(80, 126.93688, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(48, 95.93977, 0), new carc2.Isotope(49, 96.93494, 0), new carc2.Isotope(50, 97.927579, 0), new carc2.Isotope(51, 98.92501, 0), new carc2.Isotope(52, 99.920230232, 0), new carc2.Isotope(53, 100.918681442, 0), new carc2.Isotope(54, 101.914777255, 0), new carc2.Isotope(55, 102.913418952, 0), new carc2.Isotope(56, 103.909848091, 0), new carc2.Isotope(57, 104.909467818, 0), new carc2.Isotope(58, 105.906458007, 4.3508), new carc2.Isotope(59, 106.906614232, 0), new carc2.Isotope(60, 107.904183403, 3.0978), new carc2.Isotope(61, 108.904985569, 0), new carc2.Isotope(62, 109.903005578, 43.4737), new carc2.Isotope(63, 110.904181628, 44.5527), new carc2.Isotope(64, 111.902757226, 83.9888), new carc2.Isotope(65, 112.904400947, 42.5339), new carc2.Isotope(66, 113.903358121, 100), new carc2.Isotope(67, 114.905430553, 0), new carc2.Isotope(68, 115.904755434, 26.0703), new carc2.Isotope(69, 116.907218242, 0), new carc2.Isotope(70, 117.906914144, 0), new carc2.Isotope(71, 118.909922582, 0), new carc2.Isotope(72, 119.909851352, 0), new carc2.Isotope(73, 120.91298039, 0), new carc2.Isotope(74, 121.9135, 0), new carc2.Isotope(75, 122.917003675, 0), new carc2.Isotope(76, 123.917648302, 0), new carc2.Isotope(77, 124.92124717, 0), new carc2.Isotope(78, 125.922353996, 0), new carc2.Isotope(79, 126.926434822, 0), new carc2.Isotope(80, 127.927760617, 0), new carc2.Isotope(81, 128.93226, 0), new carc2.Isotope(82, 129.93398, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(49, 97.94224, 0), new carc2.Isotope(50, 98.93461, 0), new carc2.Isotope(51, 99.931149033, 0), new carc2.Isotope(52, 100.92656, 0), new carc2.Isotope(53, 101.924707541, 0), new carc2.Isotope(54, 102.919913896, 0), new carc2.Isotope(55, 103.918338416, 0), new carc2.Isotope(56, 104.914673434, 0), new carc2.Isotope(57, 105.913461134, 0), new carc2.Isotope(58, 106.910292195, 0), new carc2.Isotope(59, 107.909719683, 0), new carc2.Isotope(60, 108.907154078, 0), new carc2.Isotope(61, 109.907168783, 0), new carc2.Isotope(62, 110.905110677, 0), new carc2.Isotope(63, 111.905533338, 0), new carc2.Isotope(64, 112.904061223, 4.4932), new carc2.Isotope(65, 113.904916758, 0), new carc2.Isotope(66, 114.903878328, 100), new carc2.Isotope(67, 115.905259995, 0), new carc2.Isotope(68, 116.904515731, 0), new carc2.Isotope(69, 117.906354623, 0), new carc2.Isotope(70, 118.905846334, 0), new carc2.Isotope(71, 119.907961505, 0), new carc2.Isotope(72, 120.907848847, 0), new carc2.Isotope(73, 121.910277103, 0), new carc2.Isotope(74, 122.910438951, 0), new carc2.Isotope(75, 123.913175916, 0), new carc2.Isotope(76, 124.913601387, 0), new carc2.Isotope(77, 125.916464532, 0), new carc2.Isotope(78, 126.917344048, 0), new carc2.Isotope(79, 127.920170658, 0), new carc2.Isotope(80, 128.921657958, 0), new carc2.Isotope(81, 129.924854941, 0), new carc2.Isotope(82, 130.926767408, 0), new carc2.Isotope(83, 131.932919005, 0), new carc2.Isotope(84, 132.93834, 0), new carc2.Isotope(85, 133.94466, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(50, 99.938954, 0), new carc2.Isotope(51, 100.93606, 0), new carc2.Isotope(52, 101.93049, 0), new carc2.Isotope(53, 102.92813, 0), new carc2.Isotope(54, 103.923185469, 0), new carc2.Isotope(55, 104.921390409, 0), new carc2.Isotope(56, 105.916880472, 0), new carc2.Isotope(57, 106.915666702, 0), new carc2.Isotope(58, 107.911965339, 0), new carc2.Isotope(59, 108.911286879, 0), new carc2.Isotope(60, 109.907852688, 0), new carc2.Isotope(61, 110.907735404, 0), new carc2.Isotope(62, 111.90482081, 3.0864), new carc2.Isotope(63, 112.905173373, 0), new carc2.Isotope(64, 113.902781816, 2.1605), new carc2.Isotope(65, 114.903345973, 1.2346), new carc2.Isotope(66, 115.901744149, 45.3704), new carc2.Isotope(67, 116.902953765, 23.7654), new carc2.Isotope(68, 117.901606328, 75), new carc2.Isotope(69, 118.90330888, 26.5432), new carc2.Isotope(70, 119.902196571, 100), new carc2.Isotope(71, 120.904236867, 0), new carc2.Isotope(72, 121.903440138, 14.1975), new carc2.Isotope(73, 122.905721901, 0), new carc2.Isotope(74, 123.90527463, 17.284), new carc2.Isotope(75, 124.907784924, 0), new carc2.Isotope(76, 125.907653953, 0), new carc2.Isotope(77, 126.91035098, 0), new carc2.Isotope(78, 127.910534953, 0), new carc2.Isotope(79, 128.913439976, 0), new carc2.Isotope(80, 129.913852185, 0), new carc2.Isotope(81, 130.916919144, 0), new carc2.Isotope(82, 131.917744455, 0), new carc2.Isotope(83, 132.923814085, 0), new carc2.Isotope(84, 133.928463576, 0), new carc2.Isotope(85, 134.93473, 0), new carc2.Isotope(86, 135.93934, 0), new carc2.Isotope(87, 136.94579, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(52, 102.94012, 0), new carc2.Isotope(53, 103.936287, 0), new carc2.Isotope(54, 104.931528593, 0), new carc2.Isotope(55, 105.928183134, 0), new carc2.Isotope(56, 106.92415, 0), new carc2.Isotope(57, 107.92216, 0), new carc2.Isotope(58, 108.918136092, 0), new carc2.Isotope(59, 109.917533911, 0), new carc2.Isotope(60, 110.912534147, 0), new carc2.Isotope(61, 111.91239464, 0), new carc2.Isotope(62, 112.909377941, 0), new carc2.Isotope(63, 113.909095876, 0), new carc2.Isotope(64, 114.906598812, 0), new carc2.Isotope(65, 115.906797235, 0), new carc2.Isotope(66, 116.90483959, 0), new carc2.Isotope(67, 117.905531885, 0), new carc2.Isotope(68, 118.90394646, 0), new carc2.Isotope(69, 119.905074315, 0), new carc2.Isotope(70, 120.903818044, 100), new carc2.Isotope(71, 121.905175415, 0), new carc2.Isotope(72, 122.904215696, 74.5201), new carc2.Isotope(73, 123.905937525, 0), new carc2.Isotope(74, 124.905247804, 0), new carc2.Isotope(75, 125.907248153, 0), new carc2.Isotope(76, 126.906914564, 0), new carc2.Isotope(77, 127.90916733, 0), new carc2.Isotope(78, 128.909150092, 0), new carc2.Isotope(79, 129.911546459, 0), new carc2.Isotope(80, 130.911946487, 0), new carc2.Isotope(81, 131.914413247, 0), new carc2.Isotope(82, 132.915236466, 0), new carc2.Isotope(83, 133.920551554, 0), new carc2.Isotope(84, 134.925167962, 0), new carc2.Isotope(85, 135.93066, 0), new carc2.Isotope(86, 136.93531, 0), new carc2.Isotope(87, 137.94096, 0), new carc2.Isotope(88, 138.94571, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(54, 105.937702, 0), new carc2.Isotope(55, 106.935036, 0), new carc2.Isotope(56, 107.929486838, 0), new carc2.Isotope(57, 108.927456483, 0), new carc2.Isotope(58, 109.922407164, 0), new carc2.Isotope(59, 110.921120589, 0), new carc2.Isotope(60, 111.917061617, 0), new carc2.Isotope(61, 112.915452551, 0), new carc2.Isotope(62, 113.912498025, 0), new carc2.Isotope(63, 114.911578627, 0), new carc2.Isotope(64, 115.908420253, 0), new carc2.Isotope(65, 116.90863418, 0), new carc2.Isotope(66, 117.905825187, 0), new carc2.Isotope(67, 118.90640811, 0), new carc2.Isotope(68, 119.904019891, 0.284), new carc2.Isotope(69, 120.904929815, 0), new carc2.Isotope(70, 121.903047064, 7.6923), new carc2.Isotope(71, 122.904272951, 2.6864), new carc2.Isotope(72, 123.902819466, 14.2485), new carc2.Isotope(73, 124.904424718, 21.1243), new carc2.Isotope(74, 125.903305543, 56.0651), new carc2.Isotope(75, 126.90521729, 0), new carc2.Isotope(76, 127.904461383, 93.7574), new carc2.Isotope(77, 128.906595593, 0), new carc2.Isotope(78, 129.906222753, 100), new carc2.Isotope(79, 130.90852188, 0), new carc2.Isotope(80, 131.908523782, 0), new carc2.Isotope(81, 132.910939068, 0), new carc2.Isotope(82, 133.911540546, 0), new carc2.Isotope(83, 134.916450782, 0), new carc2.Isotope(84, 135.920103155, 0), new carc2.Isotope(85, 136.925324769, 0), new carc2.Isotope(86, 137.92922, 0), new carc2.Isotope(87, 138.93473, 0), new carc2.Isotope(88, 139.9387, 0), new carc2.Isotope(89, 140.94439, 0), new carc2.Isotope(90, 141.9485, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(55, 107.943291, 0), new carc2.Isotope(56, 108.938191658, 0), new carc2.Isotope(57, 109.934634181, 0), new carc2.Isotope(58, 110.930276, 0), new carc2.Isotope(59, 111.92797, 0), new carc2.Isotope(60, 112.923644245, 0), new carc2.Isotope(61, 113.92185, 0), new carc2.Isotope(62, 114.918272, 0), new carc2.Isotope(63, 115.916735014, 0), new carc2.Isotope(64, 116.913647692, 0), new carc2.Isotope(65, 117.91337523, 0), new carc2.Isotope(66, 118.910180837, 0), new carc2.Isotope(67, 119.910047843, 0), new carc2.Isotope(68, 120.907366063, 0), new carc2.Isotope(69, 121.907592451, 0), new carc2.Isotope(70, 122.905597944, 0), new carc2.Isotope(71, 123.906211423, 0), new carc2.Isotope(72, 124.90462415, 0), new carc2.Isotope(73, 125.905619387, 0), new carc2.Isotope(74, 126.90446842, 100), new carc2.Isotope(75, 127.905805254, 0), new carc2.Isotope(76, 128.904987487, 0), new carc2.Isotope(77, 129.906674018, 0), new carc2.Isotope(78, 130.906124168, 0), new carc2.Isotope(79, 131.907994525, 0), new carc2.Isotope(80, 132.907806465, 0), new carc2.Isotope(81, 133.909876552, 0), new carc2.Isotope(82, 134.91005031, 0), new carc2.Isotope(83, 135.914655105, 0), new carc2.Isotope(84, 136.917872653, 0), new carc2.Isotope(85, 137.922383666, 0), new carc2.Isotope(86, 138.926093402, 0), new carc2.Isotope(87, 139.93121, 0), new carc2.Isotope(88, 140.93483, 0), new carc2.Isotope(89, 141.94018, 0), new carc2.Isotope(90, 142.94407, 0), new carc2.Isotope(91, 143.94961, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(56, 109.944476, 0), new carc2.Isotope(57, 110.941632, 0), new carc2.Isotope(58, 111.93566535, 0), new carc2.Isotope(59, 112.933382836, 0), new carc2.Isotope(60, 113.928145, 0), new carc2.Isotope(61, 114.926979032, 0), new carc2.Isotope(62, 115.921394197, 0), new carc2.Isotope(63, 116.920564355, 0), new carc2.Isotope(64, 117.91657092, 0), new carc2.Isotope(65, 118.915554295, 0), new carc2.Isotope(66, 119.91215199, 0), new carc2.Isotope(67, 120.911386497, 0), new carc2.Isotope(68, 121.908548396, 0), new carc2.Isotope(69, 122.908470748, 0), new carc2.Isotope(70, 123.905895774, 0.3717), new carc2.Isotope(71, 124.906398236, 0), new carc2.Isotope(72, 125.904268868, 0.3346), new carc2.Isotope(73, 126.905179581, 0), new carc2.Isotope(74, 127.903530436, 7.1004), new carc2.Isotope(75, 128.904779458, 98.1413), new carc2.Isotope(76, 129.903507903, 15.2416), new carc2.Isotope(77, 130.90508192, 78.8104), new carc2.Isotope(78, 131.904154457, 100), new carc2.Isotope(79, 132.90590566, 0), new carc2.Isotope(80, 133.905394504, 38.6617), new carc2.Isotope(81, 134.907207499, 0), new carc2.Isotope(82, 135.907219526, 33.0855), new carc2.Isotope(83, 136.911562939, 0), new carc2.Isotope(84, 137.913988549, 0), new carc2.Isotope(85, 138.918786859, 0), new carc2.Isotope(86, 139.921635665, 0), new carc2.Isotope(87, 140.926646282, 0), new carc2.Isotope(88, 141.929702981, 0), new carc2.Isotope(89, 142.93489, 0), new carc2.Isotope(90, 143.93823, 0), new carc2.Isotope(91, 144.94367, 0), new carc2.Isotope(92, 145.9473, 0), new carc2.Isotope(93, 146.95301, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(57, 111.950331, 0), new carc2.Isotope(58, 112.944535512, 0), new carc2.Isotope(59, 113.940841319, 0), new carc2.Isotope(60, 114.935939, 0), new carc2.Isotope(61, 115.932914152, 0), new carc2.Isotope(62, 116.928639484, 0), new carc2.Isotope(63, 117.926554883, 0), new carc2.Isotope(64, 118.922370879, 0), new carc2.Isotope(65, 119.920678219, 0), new carc2.Isotope(66, 120.917183637, 0), new carc2.Isotope(67, 121.916121946, 0), new carc2.Isotope(68, 122.912990168, 0), new carc2.Isotope(69, 123.912245731, 0), new carc2.Isotope(70, 124.909724871, 0), new carc2.Isotope(71, 125.909447953, 0), new carc2.Isotope(72, 126.9074176, 0), new carc2.Isotope(73, 127.907747919, 0), new carc2.Isotope(74, 128.906063369, 0), new carc2.Isotope(75, 129.906706163, 0), new carc2.Isotope(76, 130.905460232, 0), new carc2.Isotope(77, 131.906429799, 0), new carc2.Isotope(78, 132.90544687, 100), new carc2.Isotope(79, 133.906713419, 0), new carc2.Isotope(80, 134.905971903, 0), new carc2.Isotope(81, 135.907305741, 0), new carc2.Isotope(82, 136.907083505, 0), new carc2.Isotope(83, 137.911010537, 0), new carc2.Isotope(84, 138.913357921, 0), new carc2.Isotope(85, 139.917277075, 0), new carc2.Isotope(86, 140.920043984, 0), new carc2.Isotope(87, 141.924292317, 0), new carc2.Isotope(88, 142.927330292, 0), new carc2.Isotope(89, 143.932027373, 0), new carc2.Isotope(90, 144.935388226, 0), new carc2.Isotope(91, 145.940162028, 0), new carc2.Isotope(92, 146.943864435, 0), new carc2.Isotope(93, 147.948899539, 0), new carc2.Isotope(94, 148.95272, 0), new carc2.Isotope(95, 149.95797, 0), new carc2.Isotope(96, 150.962, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(58, 113.950941, 0), new carc2.Isotope(59, 114.94771, 0), new carc2.Isotope(60, 115.94168, 0), new carc2.Isotope(61, 116.937700229, 0), new carc2.Isotope(62, 117.93344, 0), new carc2.Isotope(63, 118.931051927, 0), new carc2.Isotope(64, 119.926045941, 0), new carc2.Isotope(65, 120.924485908, 0), new carc2.Isotope(66, 121.92026, 0), new carc2.Isotope(67, 122.91885, 0), new carc2.Isotope(68, 123.915088437, 0), new carc2.Isotope(69, 124.914620234, 0), new carc2.Isotope(70, 125.911244146, 0), new carc2.Isotope(71, 126.911121328, 0), new carc2.Isotope(72, 127.90830887, 0), new carc2.Isotope(73, 128.908673749, 0), new carc2.Isotope(74, 129.906310478, 0.1478), new carc2.Isotope(75, 130.906930798, 0), new carc2.Isotope(76, 131.905056152, 0.1409), new carc2.Isotope(77, 132.906002368, 0), new carc2.Isotope(78, 133.904503347, 3.371), new carc2.Isotope(79, 134.905682749, 9.1939), new carc2.Isotope(80, 135.904570109, 10.954), new carc2.Isotope(81, 136.905821414, 15.6625), new carc2.Isotope(82, 137.905241273, 100), new carc2.Isotope(83, 138.908835384, 0), new carc2.Isotope(84, 139.910599485, 0), new carc2.Isotope(85, 140.914406439, 0), new carc2.Isotope(86, 141.916448175, 0), new carc2.Isotope(87, 142.920617184, 0), new carc2.Isotope(88, 143.922940468, 0), new carc2.Isotope(89, 144.926923807, 0), new carc2.Isotope(90, 145.930106645, 0), new carc2.Isotope(91, 146.933992519, 0), new carc2.Isotope(92, 147.937682377, 0), new carc2.Isotope(93, 148.94246, 0), new carc2.Isotope(94, 149.94562, 0), new carc2.Isotope(95, 150.9507, 0), new carc2.Isotope(96, 151.95416, 0), new carc2.Isotope(97, 152.95961, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(60, 116.95001, 0), new carc2.Isotope(61, 117.94657, 0), new carc2.Isotope(62, 118.94099, 0), new carc2.Isotope(63, 119.93807, 0), new carc2.Isotope(64, 120.93301, 0), new carc2.Isotope(65, 121.93071, 0), new carc2.Isotope(66, 122.92624, 0), new carc2.Isotope(67, 123.92453, 0), new carc2.Isotope(68, 124.92067, 0), new carc2.Isotope(69, 125.91937, 0), new carc2.Isotope(70, 126.91616, 0), new carc2.Isotope(71, 127.91544794, 0), new carc2.Isotope(72, 128.912667334, 0), new carc2.Isotope(73, 129.91232, 0), new carc2.Isotope(74, 130.910108489, 0), new carc2.Isotope(75, 131.910110399, 0), new carc2.Isotope(76, 132.908396372, 0), new carc2.Isotope(77, 133.908489607, 0), new carc2.Isotope(78, 134.906971003, 0), new carc2.Isotope(79, 135.907651181, 0), new carc2.Isotope(80, 136.906465656, 0), new carc2.Isotope(81, 137.907106826, 0.0901), new carc2.Isotope(82, 138.90634816, 100), new carc2.Isotope(83, 139.909472552, 0), new carc2.Isotope(84, 140.910957016, 0), new carc2.Isotope(85, 141.914074489, 0), new carc2.Isotope(86, 142.916058646, 0), new carc2.Isotope(87, 143.919591666, 0), new carc2.Isotope(88, 144.92163837, 0), new carc2.Isotope(89, 145.925700146, 0), new carc2.Isotope(90, 146.927819639, 0), new carc2.Isotope(91, 147.932191197, 0), new carc2.Isotope(92, 148.93437, 0), new carc2.Isotope(93, 149.93857, 0), new carc2.Isotope(94, 150.94156, 0), new carc2.Isotope(95, 151.94611, 0), new carc2.Isotope(96, 152.94945, 0), new carc2.Isotope(97, 153.9544, 0), new carc2.Isotope(98, 154.95813, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(61, 118.95276, 0), new carc2.Isotope(62, 119.94664, 0), new carc2.Isotope(63, 120.94367, 0), new carc2.Isotope(64, 121.93801, 0), new carc2.Isotope(65, 122.93551, 0), new carc2.Isotope(66, 123.93052, 0), new carc2.Isotope(67, 124.92854, 0), new carc2.Isotope(68, 125.9241, 0), new carc2.Isotope(69, 126.92275, 0), new carc2.Isotope(70, 127.91887, 0), new carc2.Isotope(71, 128.918679183, 0), new carc2.Isotope(72, 129.914339361, 0), new carc2.Isotope(73, 130.914424137, 0), new carc2.Isotope(74, 131.91149, 0), new carc2.Isotope(75, 132.91155, 0), new carc2.Isotope(76, 133.909026379, 0), new carc2.Isotope(77, 134.909145555, 0), new carc2.Isotope(78, 135.907143574, 0.2147), new carc2.Isotope(79, 136.907777634, 0), new carc2.Isotope(80, 137.905985574, 0.2825), new carc2.Isotope(81, 138.906646605, 0), new carc2.Isotope(82, 139.905434035, 100), new carc2.Isotope(83, 140.908271103, 0), new carc2.Isotope(84, 141.909239733, 12.5226), new carc2.Isotope(85, 142.912381158, 0), new carc2.Isotope(86, 143.913642686, 0), new carc2.Isotope(87, 144.917227871, 0), new carc2.Isotope(88, 145.918689722, 0), new carc2.Isotope(89, 146.922510962, 0), new carc2.Isotope(90, 147.924394738, 0), new carc2.Isotope(91, 148.928289207, 0), new carc2.Isotope(92, 149.930226399, 0), new carc2.Isotope(93, 150.93404, 0), new carc2.Isotope(94, 151.93638, 0), new carc2.Isotope(95, 152.94058, 0), new carc2.Isotope(96, 153.94332, 0), new carc2.Isotope(97, 154.94804, 0), new carc2.Isotope(98, 155.95126, 0), new carc2.Isotope(99, 156.95634, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(62, 120.955364, 0), new carc2.Isotope(63, 121.95165, 0), new carc2.Isotope(64, 122.94596, 0), new carc2.Isotope(65, 123.94296, 0), new carc2.Isotope(66, 124.93783, 0), new carc2.Isotope(67, 125.93531, 0), new carc2.Isotope(68, 126.93083, 0), new carc2.Isotope(69, 127.9288, 0), new carc2.Isotope(70, 128.92486, 0), new carc2.Isotope(71, 129.92338, 0), new carc2.Isotope(72, 130.920060245, 0), new carc2.Isotope(73, 131.91912, 0), new carc2.Isotope(74, 132.9162, 0), new carc2.Isotope(75, 133.915672, 0), new carc2.Isotope(76, 134.91313914, 0), new carc2.Isotope(77, 135.912646935, 0), new carc2.Isotope(78, 136.910678351, 0), new carc2.Isotope(79, 137.910748891, 0), new carc2.Isotope(80, 138.908932181, 0), new carc2.Isotope(81, 139.909071204, 0), new carc2.Isotope(82, 140.907647726, 100), new carc2.Isotope(83, 141.910039865, 0), new carc2.Isotope(84, 142.910812233, 0), new carc2.Isotope(85, 143.913300595, 0), new carc2.Isotope(86, 144.914506897, 0), new carc2.Isotope(87, 145.917588016, 0), new carc2.Isotope(88, 146.918979001, 0), new carc2.Isotope(89, 147.922183237, 0), new carc2.Isotope(90, 148.923791056, 0), new carc2.Isotope(91, 149.926995031, 0), new carc2.Isotope(92, 150.928227869, 0), new carc2.Isotope(93, 151.9316, 0), new carc2.Isotope(94, 152.93365, 0), new carc2.Isotope(95, 153.93739, 0), new carc2.Isotope(96, 154.93999, 0), new carc2.Isotope(97, 155.94412, 0), new carc2.Isotope(98, 156.94717, 0), new carc2.Isotope(99, 157.95178, 0), new carc2.Isotope(100, 158.95523, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(66, 125.94307, 0), new carc2.Isotope(67, 126.9405, 0), new carc2.Isotope(68, 127.93539, 0), new carc2.Isotope(69, 128.932385, 0), new carc2.Isotope(70, 129.92878, 0), new carc2.Isotope(71, 130.927102697, 0), new carc2.Isotope(72, 131.92312, 0), new carc2.Isotope(73, 132.92221, 0), new carc2.Isotope(74, 133.918645, 0), new carc2.Isotope(75, 134.91824, 0), new carc2.Isotope(76, 135.915020542, 0), new carc2.Isotope(77, 136.91463973, 0), new carc2.Isotope(78, 137.91291745, 0), new carc2.Isotope(79, 138.91192415, 0), new carc2.Isotope(80, 139.909309824, 0), new carc2.Isotope(81, 140.9096048, 0), new carc2.Isotope(82, 141.907718643, 100), new carc2.Isotope(83, 142.909809626, 44.8949), new carc2.Isotope(84, 143.910082629, 87.7258), new carc2.Isotope(85, 144.912568847, 30.5934), new carc2.Isotope(86, 145.913112139, 63.3616), new carc2.Isotope(87, 146.916095794, 0), new carc2.Isotope(88, 147.916888516, 21.2311), new carc2.Isotope(89, 148.92014419, 0), new carc2.Isotope(90, 149.920886563, 20.7888), new carc2.Isotope(91, 150.923824739, 0), new carc2.Isotope(92, 151.924682428, 0), new carc2.Isotope(93, 152.927694534, 0), new carc2.Isotope(94, 153.929483295, 0), new carc2.Isotope(95, 154.932629551, 0), new carc2.Isotope(96, 155.9352, 0), new carc2.Isotope(97, 156.93927, 0), new carc2.Isotope(98, 157.94187, 0), new carc2.Isotope(99, 158.94639, 0), new carc2.Isotope(100, 159.94939, 0), new carc2.Isotope(101, 160.95433, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(67, 127.94826, 0), new carc2.Isotope(68, 128.94316, 0), new carc2.Isotope(69, 129.94045, 0), new carc2.Isotope(70, 130.9358, 0), new carc2.Isotope(71, 131.93375, 0), new carc2.Isotope(72, 132.92972, 0), new carc2.Isotope(73, 133.92849, 0), new carc2.Isotope(74, 134.924617, 0), new carc2.Isotope(75, 135.923447865, 0), new carc2.Isotope(76, 136.920713, 0), new carc2.Isotope(77, 137.920432261, 0), new carc2.Isotope(78, 138.916759814, 0), new carc2.Isotope(79, 139.915801649, 0), new carc2.Isotope(80, 140.913606636, 0), new carc2.Isotope(81, 141.912950738, 0), new carc2.Isotope(82, 142.910927571, 0), new carc2.Isotope(83, 143.912585768, 0), new carc2.Isotope(84, 144.912743879, 0), new carc2.Isotope(85, 145.914692165, 0), new carc2.Isotope(86, 146.915133898, 0), new carc2.Isotope(87, 147.917467786, 0), new carc2.Isotope(88, 148.918329195, 0), new carc2.Isotope(89, 149.920979477, 0), new carc2.Isotope(90, 150.921202693, 0), new carc2.Isotope(91, 151.923490557, 0), new carc2.Isotope(92, 152.924113189, 0), new carc2.Isotope(93, 153.926547019, 0), new carc2.Isotope(94, 154.928097047, 0), new carc2.Isotope(95, 155.931060357, 0), new carc2.Isotope(96, 156.9332, 0), new carc2.Isotope(97, 157.93669, 0), new carc2.Isotope(98, 158.93913, 0), new carc2.Isotope(99, 159.94299, 0), new carc2.Isotope(100, 160.94586, 0), new carc2.Isotope(101, 161.95029, 0), new carc2.Isotope(102, 162.95352, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(68, 129.94863, 0), new carc2.Isotope(69, 130.94589, 0), new carc2.Isotope(70, 131.94082, 0), new carc2.Isotope(71, 132.93873, 0), new carc2.Isotope(72, 133.93402, 0), new carc2.Isotope(73, 134.93235, 0), new carc2.Isotope(74, 135.9283, 0), new carc2.Isotope(75, 136.927046709, 0), new carc2.Isotope(76, 137.92354, 0), new carc2.Isotope(77, 138.922302, 0), new carc2.Isotope(78, 139.918991, 0), new carc2.Isotope(79, 140.918468512, 0), new carc2.Isotope(80, 141.915193274, 0), new carc2.Isotope(81, 142.914623555, 0), new carc2.Isotope(82, 143.91199473, 11.654), new carc2.Isotope(83, 144.913405611, 0), new carc2.Isotope(84, 145.91303676, 0), new carc2.Isotope(85, 146.914893275, 56.767), new carc2.Isotope(86, 147.914817914, 42.481), new carc2.Isotope(87, 148.917179521, 52.256), new carc2.Isotope(88, 149.917271454, 27.82), new carc2.Isotope(89, 150.919928351, 0), new carc2.Isotope(90, 151.919728244, 100), new carc2.Isotope(91, 152.922093907, 0), new carc2.Isotope(92, 153.922205303, 84.962), new carc2.Isotope(93, 154.92463594, 0), new carc2.Isotope(94, 155.925526236, 0), new carc2.Isotope(95, 156.928354506, 0), new carc2.Isotope(96, 157.929987938, 0), new carc2.Isotope(97, 158.9332, 0), new carc2.Isotope(98, 159.93514, 0), new carc2.Isotope(99, 160.93883, 0), new carc2.Isotope(100, 161.94122, 0), new carc2.Isotope(101, 162.94536, 0), new carc2.Isotope(102, 163.94828, 0), new carc2.Isotope(103, 164.95298, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(69, 131.95416, 0), new carc2.Isotope(70, 132.9489, 0), new carc2.Isotope(71, 133.94632, 0), new carc2.Isotope(72, 134.94172, 0), new carc2.Isotope(73, 135.9395, 0), new carc2.Isotope(74, 136.93521, 0), new carc2.Isotope(75, 137.93345, 0), new carc2.Isotope(76, 138.92882915, 0), new carc2.Isotope(77, 139.928083921, 0), new carc2.Isotope(78, 140.924885867, 0), new carc2.Isotope(79, 141.923400033, 0), new carc2.Isotope(80, 142.920286634, 0), new carc2.Isotope(81, 143.918774116, 0), new carc2.Isotope(82, 144.916261285, 0), new carc2.Isotope(83, 145.917199714, 0), new carc2.Isotope(84, 146.916741206, 0), new carc2.Isotope(85, 147.918153775, 0), new carc2.Isotope(86, 148.917925922, 0), new carc2.Isotope(87, 149.919698294, 0), new carc2.Isotope(88, 150.919846022, 91.5709), new carc2.Isotope(89, 151.921740399, 0), new carc2.Isotope(90, 152.921226219, 100), new carc2.Isotope(91, 153.922975386, 0), new carc2.Isotope(92, 154.922889429, 0), new carc2.Isotope(93, 155.924750855, 0), new carc2.Isotope(94, 156.925419435, 0), new carc2.Isotope(95, 157.927841923, 0), new carc2.Isotope(96, 158.9290845, 0), new carc2.Isotope(97, 159.931460406, 0), new carc2.Isotope(98, 160.93368, 0), new carc2.Isotope(99, 161.93704, 0), new carc2.Isotope(100, 162.93921, 0), new carc2.Isotope(101, 163.94299, 0), new carc2.Isotope(102, 164.94572, 0), new carc2.Isotope(103, 165.94997, 0), new carc2.Isotope(104, 166.95305, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(72, 135.94707, 0), new carc2.Isotope(73, 136.94465, 0), new carc2.Isotope(74, 137.93997, 0), new carc2.Isotope(75, 138.93808, 0), new carc2.Isotope(76, 139.933236934, 0), new carc2.Isotope(77, 140.93221, 0), new carc2.Isotope(78, 141.927908919, 0), new carc2.Isotope(79, 142.926738636, 0), new carc2.Isotope(80, 143.923390357, 0), new carc2.Isotope(81, 144.921687498, 0), new carc2.Isotope(82, 145.918305344, 0), new carc2.Isotope(83, 146.919089446, 0), new carc2.Isotope(84, 147.918109771, 0), new carc2.Isotope(85, 148.919336427, 0), new carc2.Isotope(86, 149.918655455, 0), new carc2.Isotope(87, 150.920344273, 0), new carc2.Isotope(88, 151.919787882, 0.8052), new carc2.Isotope(89, 152.921746283, 0), new carc2.Isotope(90, 153.920862271, 8.7762), new carc2.Isotope(91, 154.922618801, 59.5813), new carc2.Isotope(92, 155.922119552, 82.4074), new carc2.Isotope(93, 156.923956686, 63.0032), new carc2.Isotope(94, 157.924100533, 100), new carc2.Isotope(95, 158.926385075, 0), new carc2.Isotope(96, 159.927050616, 88.0032), new carc2.Isotope(97, 160.929665688, 0), new carc2.Isotope(98, 161.930981211, 0), new carc2.Isotope(99, 162.93399, 0), new carc2.Isotope(100, 163.93586, 0), new carc2.Isotope(101, 164.93938, 0), new carc2.Isotope(102, 165.9416, 0), new carc2.Isotope(103, 166.94557, 0), new carc2.Isotope(104, 167.94836, 0), new carc2.Isotope(105, 168.95287, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(73, 137.95287, 0), new carc2.Isotope(74, 138.94803, 0), new carc2.Isotope(75, 139.945367985, 0), new carc2.Isotope(76, 140.94116, 0), new carc2.Isotope(77, 141.939073781, 0), new carc2.Isotope(78, 142.93475, 0), new carc2.Isotope(79, 143.93253, 0), new carc2.Isotope(80, 144.92888, 0), new carc2.Isotope(81, 145.927180629, 0), new carc2.Isotope(82, 146.924037176, 0), new carc2.Isotope(83, 147.924298636, 0), new carc2.Isotope(84, 148.92324163, 0), new carc2.Isotope(85, 149.923654158, 0), new carc2.Isotope(86, 150.923098169, 0), new carc2.Isotope(87, 151.924071324, 0), new carc2.Isotope(88, 152.923430858, 0), new carc2.Isotope(89, 153.924686236, 0), new carc2.Isotope(90, 154.923500411, 0), new carc2.Isotope(91, 155.924743749, 0), new carc2.Isotope(92, 156.924021155, 0), new carc2.Isotope(93, 157.92541026, 0), new carc2.Isotope(94, 158.925343135, 100), new carc2.Isotope(95, 159.927164021, 0), new carc2.Isotope(96, 160.927566289, 0), new carc2.Isotope(97, 161.929484803, 0), new carc2.Isotope(98, 162.930643942, 0), new carc2.Isotope(99, 163.933347253, 0), new carc2.Isotope(100, 164.93488, 0), new carc2.Isotope(101, 165.93805, 0), new carc2.Isotope(102, 166.94005, 0), new carc2.Isotope(103, 167.94364, 0), new carc2.Isotope(104, 168.94622, 0), new carc2.Isotope(105, 169.95025, 0), new carc2.Isotope(106, 170.9533, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(74, 139.95379, 0), new carc2.Isotope(75, 140.95119, 0), new carc2.Isotope(76, 141.946695946, 0), new carc2.Isotope(77, 142.94383, 0), new carc2.Isotope(78, 143.93907, 0), new carc2.Isotope(79, 144.936717, 0), new carc2.Isotope(80, 145.932720118, 0), new carc2.Isotope(81, 146.930878496, 0), new carc2.Isotope(82, 147.927177882, 0), new carc2.Isotope(83, 148.927333981, 0), new carc2.Isotope(84, 149.925579728, 0), new carc2.Isotope(85, 150.92617963, 0), new carc2.Isotope(86, 151.924713874, 0), new carc2.Isotope(87, 152.925760865, 0), new carc2.Isotope(88, 153.924422046, 0), new carc2.Isotope(89, 154.92574895, 0), new carc2.Isotope(90, 155.924278273, 0.2128), new carc2.Isotope(91, 156.925461256, 0), new carc2.Isotope(92, 157.924404637, 0.3546), new carc2.Isotope(93, 158.92573566, 0), new carc2.Isotope(94, 159.925193718, 8.2979), new carc2.Isotope(95, 160.926929595, 67.0212), new carc2.Isotope(96, 161.926794731, 90.4255), new carc2.Isotope(97, 162.928727532, 88.2978), new carc2.Isotope(98, 163.929171165, 100), new carc2.Isotope(99, 164.931699828, 0), new carc2.Isotope(100, 165.932803241, 0), new carc2.Isotope(101, 166.935649025, 0), new carc2.Isotope(102, 167.93723, 0), new carc2.Isotope(103, 168.940303648, 0), new carc2.Isotope(104, 169.94267, 0), new carc2.Isotope(105, 170.94648, 0), new carc2.Isotope(106, 171.94911, 0), new carc2.Isotope(107, 172.95344, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(75, 141.95986, 0), new carc2.Isotope(76, 142.95469, 0), new carc2.Isotope(77, 143.95164, 0), new carc2.Isotope(78, 144.94688, 0), new carc2.Isotope(79, 145.9441, 0), new carc2.Isotope(80, 146.93984, 0), new carc2.Isotope(81, 147.937269, 0), new carc2.Isotope(82, 148.933789944, 0), new carc2.Isotope(83, 149.932760914, 0), new carc2.Isotope(84, 150.931680791, 0), new carc2.Isotope(85, 151.931740598, 0), new carc2.Isotope(86, 152.930194506, 0), new carc2.Isotope(87, 153.930596268, 0), new carc2.Isotope(88, 154.929079084, 0), new carc2.Isotope(89, 155.929001869, 0), new carc2.Isotope(90, 156.928188059, 0), new carc2.Isotope(91, 157.92894573, 0), new carc2.Isotope(92, 158.927708537, 0), new carc2.Isotope(93, 159.928725679, 0), new carc2.Isotope(94, 160.927851662, 0), new carc2.Isotope(95, 161.92909242, 0), new carc2.Isotope(96, 162.928730286, 0), new carc2.Isotope(97, 163.930230577, 0), new carc2.Isotope(98, 164.930319169, 100), new carc2.Isotope(99, 165.932281267, 0), new carc2.Isotope(100, 166.933126195, 0), new carc2.Isotope(101, 167.935496424, 0), new carc2.Isotope(102, 168.936868306, 0), new carc2.Isotope(103, 169.939614951, 0), new carc2.Isotope(104, 170.941461227, 0), new carc2.Isotope(105, 171.94482, 0), new carc2.Isotope(106, 172.94729, 0), new carc2.Isotope(107, 173.95115, 0), new carc2.Isotope(108, 174.95405, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(76, 143.96059, 0), new carc2.Isotope(77, 144.95746, 0), new carc2.Isotope(78, 145.95212, 0), new carc2.Isotope(79, 146.94931, 0), new carc2.Isotope(80, 147.94444, 0), new carc2.Isotope(81, 148.942780527, 0), new carc2.Isotope(82, 149.937171034, 0), new carc2.Isotope(83, 150.93746, 0), new carc2.Isotope(84, 151.935078452, 0), new carc2.Isotope(85, 152.935093125, 0), new carc2.Isotope(86, 153.932777294, 0), new carc2.Isotope(87, 154.933204273, 0), new carc2.Isotope(88, 155.931015001, 0), new carc2.Isotope(89, 156.931945517, 0), new carc2.Isotope(90, 157.929912, 0), new carc2.Isotope(91, 158.930680718, 0), new carc2.Isotope(92, 159.929078924, 0), new carc2.Isotope(93, 160.930001348, 0), new carc2.Isotope(94, 161.928774923, 0.4167), new carc2.Isotope(95, 162.930029273, 0), new carc2.Isotope(96, 163.929196996, 4.7917), new carc2.Isotope(97, 164.9307228, 0), new carc2.Isotope(98, 165.93028997, 100), new carc2.Isotope(99, 166.932045448, 68.3036), new carc2.Isotope(100, 167.932367781, 79.7619), new carc2.Isotope(101, 168.934588082, 0), new carc2.Isotope(102, 169.935460334, 44.3452), new carc2.Isotope(103, 170.938025885, 0), new carc2.Isotope(104, 171.939352149, 0), new carc2.Isotope(105, 172.9424, 0), new carc2.Isotope(106, 173.94434, 0), new carc2.Isotope(107, 174.94793, 0), new carc2.Isotope(108, 175.95029, 0), new carc2.Isotope(109, 176.95437, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(77, 145.966495, 0), new carc2.Isotope(78, 146.961081, 0), new carc2.Isotope(79, 147.95755, 0), new carc2.Isotope(80, 148.95265, 0), new carc2.Isotope(81, 149.94967, 0), new carc2.Isotope(82, 150.944842, 0), new carc2.Isotope(83, 151.9443, 0), new carc2.Isotope(84, 152.942027631, 0), new carc2.Isotope(85, 153.940832325, 0), new carc2.Isotope(86, 154.939191562, 0), new carc2.Isotope(87, 155.939006895, 0), new carc2.Isotope(88, 156.936756069, 0), new carc2.Isotope(89, 157.936996, 0), new carc2.Isotope(90, 158.934808966, 0), new carc2.Isotope(91, 159.935090772, 0), new carc2.Isotope(92, 160.933398042, 0), new carc2.Isotope(93, 161.933970147, 0), new carc2.Isotope(94, 162.932647648, 0), new carc2.Isotope(95, 163.933450972, 0), new carc2.Isotope(96, 164.932432463, 0), new carc2.Isotope(97, 165.933553133, 0), new carc2.Isotope(98, 166.932848844, 0), new carc2.Isotope(99, 167.934170375, 0), new carc2.Isotope(100, 168.934211117, 100), new carc2.Isotope(101, 169.935797877, 0), new carc2.Isotope(102, 170.936425817, 0), new carc2.Isotope(103, 171.938396118, 0), new carc2.Isotope(104, 172.939600336, 0), new carc2.Isotope(105, 173.942164618, 0), new carc2.Isotope(106, 174.943832897, 0), new carc2.Isotope(107, 175.946991412, 0), new carc2.Isotope(108, 176.94904, 0), new carc2.Isotope(109, 177.95264, 0), new carc2.Isotope(110, 178.95534, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(78, 147.96676, 0), new carc2.Isotope(79, 148.96348, 0), new carc2.Isotope(80, 149.95799, 0), new carc2.Isotope(81, 150.954657965, 0), new carc2.Isotope(82, 151.950167, 0), new carc2.Isotope(83, 152.94921, 0), new carc2.Isotope(84, 153.945651145, 0), new carc2.Isotope(85, 154.945792, 0), new carc2.Isotope(86, 155.942847109, 0), new carc2.Isotope(87, 156.94265865, 0), new carc2.Isotope(88, 157.939857897, 0), new carc2.Isotope(89, 158.940153735, 0), new carc2.Isotope(90, 159.93756, 0), new carc2.Isotope(91, 160.937357719, 0), new carc2.Isotope(92, 161.93575, 0), new carc2.Isotope(93, 162.936265492, 0), new carc2.Isotope(94, 163.93452, 0), new carc2.Isotope(95, 164.935397592, 0), new carc2.Isotope(96, 165.933879623, 0), new carc2.Isotope(97, 166.934946862, 0), new carc2.Isotope(98, 167.933894465, 0.4088), new carc2.Isotope(99, 168.93518712, 0), new carc2.Isotope(100, 169.934758652, 9.5912), new carc2.Isotope(101, 170.936322297, 44.9686), new carc2.Isotope(102, 171.936377696, 68.8679), new carc2.Isotope(103, 172.938206756, 50.6918), new carc2.Isotope(104, 173.938858101, 100), new carc2.Isotope(105, 174.941272494, 0), new carc2.Isotope(106, 175.942568409, 39.9371), new carc2.Isotope(107, 176.945257126, 0), new carc2.Isotope(108, 177.946643396, 0), new carc2.Isotope(109, 178.95017, 0), new carc2.Isotope(110, 179.95233, 0), new carc2.Isotope(111, 180.95615, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(79, 149.972668, 0), new carc2.Isotope(80, 150.967147, 0), new carc2.Isotope(81, 151.96361, 0), new carc2.Isotope(82, 152.95869, 0), new carc2.Isotope(83, 153.9571, 0), new carc2.Isotope(84, 154.953641324, 0), new carc2.Isotope(85, 155.952907, 0), new carc2.Isotope(86, 156.950101536, 0), new carc2.Isotope(87, 157.948577981, 0), new carc2.Isotope(88, 158.946615113, 0), new carc2.Isotope(89, 159.945383, 0), new carc2.Isotope(90, 160.943047504, 0), new carc2.Isotope(91, 161.943222, 0), new carc2.Isotope(92, 162.941203796, 0), new carc2.Isotope(93, 163.941215, 0), new carc2.Isotope(94, 164.939605886, 0), new carc2.Isotope(95, 165.939762646, 0), new carc2.Isotope(96, 166.938307056, 0), new carc2.Isotope(97, 167.938698576, 0), new carc2.Isotope(98, 168.937648757, 0), new carc2.Isotope(99, 169.93847219, 0), new carc2.Isotope(100, 170.937909903, 0), new carc2.Isotope(101, 171.939082239, 0), new carc2.Isotope(102, 172.938926901, 0), new carc2.Isotope(103, 173.940333522, 0), new carc2.Isotope(104, 174.940767904, 100), new carc2.Isotope(105, 175.942682399, 2.6694), new carc2.Isotope(106, 176.943754987, 0), new carc2.Isotope(107, 177.945951366, 0), new carc2.Isotope(108, 178.947324216, 0), new carc2.Isotope(109, 179.949879968, 0), new carc2.Isotope(110, 180.95197, 0), new carc2.Isotope(111, 181.95521, 0), new carc2.Isotope(112, 182.95757, 0), new carc2.Isotope(113, 183.96117, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(82, 153.96425, 0), new carc2.Isotope(83, 154.96276, 0), new carc2.Isotope(84, 155.959247, 0), new carc2.Isotope(85, 156.958127, 0), new carc2.Isotope(86, 157.95405528, 0), new carc2.Isotope(87, 158.954003, 0), new carc2.Isotope(88, 159.950713588, 0), new carc2.Isotope(89, 160.950330852, 0), new carc2.Isotope(90, 161.947202977, 0), new carc2.Isotope(91, 162.947057, 0), new carc2.Isotope(92, 163.944422, 0), new carc2.Isotope(93, 164.94454, 0), new carc2.Isotope(94, 165.94225, 0), new carc2.Isotope(95, 166.9426, 0), new carc2.Isotope(96, 167.94063, 0), new carc2.Isotope(97, 168.941158567, 0), new carc2.Isotope(98, 169.93965, 0), new carc2.Isotope(99, 170.94049, 0), new carc2.Isotope(100, 171.93945798, 0), new carc2.Isotope(101, 172.94065, 0), new carc2.Isotope(102, 173.940040159, 0.4545), new carc2.Isotope(103, 174.941502991, 0), new carc2.Isotope(104, 175.941401828, 14.7727), new carc2.Isotope(105, 176.943220013, 52.8409), new carc2.Isotope(106, 177.943697732, 76.9886), new carc2.Isotope(107, 178.945815073, 39.0341), new carc2.Isotope(108, 179.94654876, 100), new carc2.Isotope(109, 180.949099124, 0), new carc2.Isotope(110, 181.950552893, 0), new carc2.Isotope(111, 182.953531012, 0), new carc2.Isotope(112, 183.95544788, 0), new carc2.Isotope(113, 184.95878, 0), new carc2.Isotope(114, 185.96092, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(83, 155.971689, 0), new carc2.Isotope(84, 156.968145, 0), new carc2.Isotope(85, 157.966368, 0), new carc2.Isotope(86, 158.96232309, 0), new carc2.Isotope(87, 159.961358, 0), new carc2.Isotope(88, 160.958372992, 0), new carc2.Isotope(89, 161.956556553, 0), new carc2.Isotope(90, 162.95431665, 0), new carc2.Isotope(91, 163.95357, 0), new carc2.Isotope(92, 164.950817, 0), new carc2.Isotope(93, 165.95047, 0), new carc2.Isotope(94, 166.948639, 0), new carc2.Isotope(95, 167.947787, 0), new carc2.Isotope(96, 168.94592, 0), new carc2.Isotope(97, 169.94609, 0), new carc2.Isotope(98, 170.94446, 0), new carc2.Isotope(99, 171.944739818, 0), new carc2.Isotope(100, 172.94459, 0), new carc2.Isotope(101, 173.944167937, 0), new carc2.Isotope(102, 174.94365, 0), new carc2.Isotope(103, 175.944740551, 0), new carc2.Isotope(104, 176.944471766, 0), new carc2.Isotope(105, 177.945750349, 0), new carc2.Isotope(106, 178.945934113, 0), new carc2.Isotope(107, 179.947465655, 0.012), new carc2.Isotope(108, 180.947996346, 100), new carc2.Isotope(109, 181.950152414, 0), new carc2.Isotope(110, 182.951373188, 0), new carc2.Isotope(111, 183.954009331, 0), new carc2.Isotope(112, 184.955559086, 0), new carc2.Isotope(113, 185.9585501, 0), new carc2.Isotope(114, 186.96041, 0), new carc2.Isotope(115, 187.96371, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(84, 157.973939, 0), new carc2.Isotope(85, 158.97228, 0), new carc2.Isotope(86, 159.968369, 0), new carc2.Isotope(87, 160.967089, 0), new carc2.Isotope(88, 161.962750303, 0), new carc2.Isotope(89, 162.962532, 0), new carc2.Isotope(90, 163.95898381, 0), new carc2.Isotope(91, 164.958335962, 0), new carc2.Isotope(92, 165.955019896, 0), new carc2.Isotope(93, 166.954672, 0), new carc2.Isotope(94, 167.951863, 0), new carc2.Isotope(95, 168.951759, 0), new carc2.Isotope(96, 169.948473988, 0), new carc2.Isotope(97, 170.94946, 0), new carc2.Isotope(98, 171.948228837, 0), new carc2.Isotope(99, 172.948884, 0), new carc2.Isotope(100, 173.94616, 0), new carc2.Isotope(101, 174.94677, 0), new carc2.Isotope(102, 175.94559, 0), new carc2.Isotope(103, 176.94662, 0), new carc2.Isotope(104, 177.945848364, 0), new carc2.Isotope(105, 178.947071733, 0), new carc2.Isotope(106, 179.946705734, 0.4239), new carc2.Isotope(107, 180.948198054, 0), new carc2.Isotope(108, 181.948205519, 85.7515), new carc2.Isotope(109, 182.950224458, 46.6254), new carc2.Isotope(110, 183.950932553, 100), new carc2.Isotope(111, 184.953420586, 0), new carc2.Isotope(112, 185.954362204, 93.2507), new carc2.Isotope(113, 186.957158365, 0), new carc2.Isotope(114, 187.958486954, 0), new carc2.Isotope(115, 188.96191222, 0), new carc2.Isotope(116, 189.963179541, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(85, 159.981485, 0), new carc2.Isotope(86, 160.977661, 0), new carc2.Isotope(87, 161.975707, 0), new carc2.Isotope(88, 162.971375872, 0), new carc2.Isotope(89, 163.970319, 0), new carc2.Isotope(90, 164.967050268, 0), new carc2.Isotope(91, 165.965211372, 0), new carc2.Isotope(92, 166.962564, 0), new carc2.Isotope(93, 167.961609, 0), new carc2.Isotope(94, 168.95883, 0), new carc2.Isotope(95, 169.958163, 0), new carc2.Isotope(96, 170.955547, 0), new carc2.Isotope(97, 171.955285, 0), new carc2.Isotope(98, 172.953062, 0), new carc2.Isotope(99, 173.952114, 0), new carc2.Isotope(100, 174.951393, 0), new carc2.Isotope(101, 175.95157, 0), new carc2.Isotope(102, 176.95027, 0), new carc2.Isotope(103, 177.950851081, 0), new carc2.Isotope(104, 178.949981038, 0), new carc2.Isotope(105, 179.95078768, 0), new carc2.Isotope(106, 180.950064596, 0), new carc2.Isotope(107, 181.951211444, 0), new carc2.Isotope(108, 182.950821349, 0), new carc2.Isotope(109, 183.952524289, 0), new carc2.Isotope(110, 184.952955747, 59.7444), new carc2.Isotope(111, 185.954986529, 0), new carc2.Isotope(112, 186.955750787, 100), new carc2.Isotope(113, 187.958112287, 0), new carc2.Isotope(114, 188.959228359, 0), new carc2.Isotope(115, 189.961816139, 0), new carc2.Isotope(116, 190.963123592, 0), new carc2.Isotope(117, 191.96596, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(86, 161.983819, 0), new carc2.Isotope(87, 162.982048, 0), new carc2.Isotope(88, 163.977927, 0), new carc2.Isotope(89, 164.976475, 0), new carc2.Isotope(90, 165.971934911, 0), new carc2.Isotope(91, 166.971554, 0), new carc2.Isotope(92, 167.967832911, 0), new carc2.Isotope(93, 168.967076205, 0), new carc2.Isotope(94, 169.963569716, 0), new carc2.Isotope(95, 170.96304, 0), new carc2.Isotope(96, 171.960078, 0), new carc2.Isotope(97, 172.959791, 0), new carc2.Isotope(98, 173.956307704, 0), new carc2.Isotope(99, 174.95708, 0), new carc2.Isotope(100, 175.953757941, 0), new carc2.Isotope(101, 176.955045, 0), new carc2.Isotope(102, 177.953348225, 0), new carc2.Isotope(103, 178.953951, 0), new carc2.Isotope(104, 179.952308241, 0), new carc2.Isotope(105, 180.953274494, 0), new carc2.Isotope(106, 181.952186222, 0), new carc2.Isotope(107, 182.95311, 0), new carc2.Isotope(108, 183.952490808, 0.488), new carc2.Isotope(109, 184.954043023, 0), new carc2.Isotope(110, 185.953838355, 3.8537), new carc2.Isotope(111, 186.955747928, 3.9024), new carc2.Isotope(112, 187.955835993, 32.439), new carc2.Isotope(113, 188.958144866, 39.2683), new carc2.Isotope(114, 189.95844521, 64.3902), new carc2.Isotope(115, 190.960927951, 0), new carc2.Isotope(116, 191.961479047, 100), new carc2.Isotope(117, 192.964148083, 0), new carc2.Isotope(118, 193.965179314, 0), new carc2.Isotope(119, 194.968123889, 0), new carc2.Isotope(120, 195.96962255, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(88, 164.98758, 0), new carc2.Isotope(89, 165.985506, 0), new carc2.Isotope(90, 166.980951577, 0), new carc2.Isotope(91, 167.979966, 0), new carc2.Isotope(92, 168.976390868, 0), new carc2.Isotope(93, 169.974441697, 0), new carc2.Isotope(94, 170.971779, 0), new carc2.Isotope(95, 171.970643, 0), new carc2.Isotope(96, 172.967707, 0), new carc2.Isotope(97, 173.966804, 0), new carc2.Isotope(98, 174.964279, 0), new carc2.Isotope(99, 175.963511, 0), new carc2.Isotope(100, 176.96117, 0), new carc2.Isotope(101, 177.960084944, 0), new carc2.Isotope(102, 178.95915, 0), new carc2.Isotope(103, 179.958555615, 0), new carc2.Isotope(104, 180.957642156, 0), new carc2.Isotope(105, 181.958127689, 0), new carc2.Isotope(106, 182.956814, 0), new carc2.Isotope(107, 183.957388318, 0), new carc2.Isotope(108, 184.95659, 0), new carc2.Isotope(109, 185.957951104, 0), new carc2.Isotope(110, 186.95736083, 0), new carc2.Isotope(111, 187.958851962, 0), new carc2.Isotope(112, 188.958716473, 0), new carc2.Isotope(113, 189.960592299, 0), new carc2.Isotope(114, 190.960591191, 59.4896), new carc2.Isotope(115, 191.962602198, 0), new carc2.Isotope(116, 192.9629237, 100), new carc2.Isotope(117, 193.96507561, 0), new carc2.Isotope(118, 194.9659768, 0), new carc2.Isotope(119, 195.968379906, 0), new carc2.Isotope(120, 196.969636496, 0), new carc2.Isotope(121, 197.97228, 0), new carc2.Isotope(122, 198.973787159, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(90, 167.988035, 0), new carc2.Isotope(91, 168.986421, 0), new carc2.Isotope(92, 169.981734918, 0), new carc2.Isotope(93, 170.981251, 0), new carc2.Isotope(94, 171.977376138, 0), new carc2.Isotope(95, 172.976499642, 0), new carc2.Isotope(96, 173.972811276, 0), new carc2.Isotope(97, 174.972276, 0), new carc2.Isotope(98, 175.969, 0), new carc2.Isotope(99, 176.968453, 0), new carc2.Isotope(100, 177.964894223, 0), new carc2.Isotope(101, 178.965475, 0), new carc2.Isotope(102, 179.962023729, 0), new carc2.Isotope(103, 180.963177, 0), new carc2.Isotope(104, 181.961267637, 0), new carc2.Isotope(105, 182.961729, 0), new carc2.Isotope(106, 183.959851685, 0), new carc2.Isotope(107, 184.960753782, 0), new carc2.Isotope(108, 185.959432346, 0), new carc2.Isotope(109, 186.960697, 0), new carc2.Isotope(110, 187.959395697, 0), new carc2.Isotope(111, 188.9608319, 0), new carc2.Isotope(112, 189.959930073, 0.0296), new carc2.Isotope(113, 190.961684653, 0), new carc2.Isotope(114, 191.961035158, 2.3373), new carc2.Isotope(115, 192.962984504, 0), new carc2.Isotope(116, 193.962663581, 97.3373), new carc2.Isotope(117, 194.964774449, 100), new carc2.Isotope(118, 195.964934884, 74.8521), new carc2.Isotope(119, 196.967323401, 0), new carc2.Isotope(120, 197.967876009, 21.3018), new carc2.Isotope(121, 198.970576213, 0), new carc2.Isotope(122, 199.971423885, 0), new carc2.Isotope(123, 200.974496467, 0), new carc2.Isotope(124, 201.97574, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(92, 170.991183, 0), new carc2.Isotope(93, 171.990109, 0), new carc2.Isotope(94, 172.986398138, 0), new carc2.Isotope(95, 173.984325861, 0), new carc2.Isotope(96, 174.981552, 0), new carc2.Isotope(97, 175.980269, 0), new carc2.Isotope(98, 176.977215, 0), new carc2.Isotope(99, 177.975975, 0), new carc2.Isotope(100, 178.973412, 0), new carc2.Isotope(101, 179.972396, 0), new carc2.Isotope(102, 180.969948, 0), new carc2.Isotope(103, 181.968621416, 0), new carc2.Isotope(104, 182.96762, 0), new carc2.Isotope(105, 183.966776046, 0), new carc2.Isotope(106, 184.965806956, 0), new carc2.Isotope(107, 185.965997671, 0), new carc2.Isotope(108, 186.964562, 0), new carc2.Isotope(109, 187.965321662, 0), new carc2.Isotope(110, 188.9642243, 0), new carc2.Isotope(111, 189.964698757, 0), new carc2.Isotope(112, 190.963649239, 0), new carc2.Isotope(113, 191.964810107, 0), new carc2.Isotope(114, 192.964131745, 0), new carc2.Isotope(115, 193.96533889, 0), new carc2.Isotope(116, 194.965017928, 0), new carc2.Isotope(117, 195.966551315, 0), new carc2.Isotope(118, 196.966551609, 100), new carc2.Isotope(119, 197.968225244, 0), new carc2.Isotope(120, 198.968748016, 0), new carc2.Isotope(121, 199.970717886, 0), new carc2.Isotope(122, 200.971640839, 0), new carc2.Isotope(123, 201.973788431, 0), new carc2.Isotope(124, 202.975137256, 0), new carc2.Isotope(125, 203.977705, 0), new carc2.Isotope(126, 204.97961, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(95, 174.991411, 0), new carc2.Isotope(96, 175.987413248, 0), new carc2.Isotope(97, 176.986336874, 0), new carc2.Isotope(98, 177.982476325, 0), new carc2.Isotope(99, 178.981783, 0), new carc2.Isotope(100, 179.978322, 0), new carc2.Isotope(101, 180.977806, 0), new carc2.Isotope(102, 181.97393546, 0), new carc2.Isotope(103, 182.974561, 0), new carc2.Isotope(104, 183.970705219, 0), new carc2.Isotope(105, 184.971983, 0), new carc2.Isotope(106, 185.969460021, 0), new carc2.Isotope(107, 186.969785, 0), new carc2.Isotope(108, 187.967511693, 0), new carc2.Isotope(109, 188.968733187, 0), new carc2.Isotope(110, 189.966958568, 0), new carc2.Isotope(111, 190.96706311, 0), new carc2.Isotope(112, 191.965921572, 0), new carc2.Isotope(113, 192.966644169, 0), new carc2.Isotope(114, 193.965381832, 0), new carc2.Isotope(115, 194.966638981, 0), new carc2.Isotope(116, 195.965814846, 0.5059), new carc2.Isotope(117, 196.967195333, 0), new carc2.Isotope(118, 197.96675183, 34.0641), new carc2.Isotope(119, 198.968262489, 57.3356), new carc2.Isotope(120, 199.968308726, 77.9089), new carc2.Isotope(121, 200.970285275, 44.5194), new carc2.Isotope(122, 201.970625604, 100), new carc2.Isotope(123, 202.972857096, 0), new carc2.Isotope(124, 203.97347564, 22.9342), new carc2.Isotope(125, 204.976056104, 0), new carc2.Isotope(126, 205.977498672, 0), new carc2.Isotope(127, 206.982577025, 0), new carc2.Isotope(128, 207.98594, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(96, 176.996881, 0), new carc2.Isotope(97, 177.994637, 0), new carc2.Isotope(98, 178.991466, 0), new carc2.Isotope(99, 179.990194, 0), new carc2.Isotope(100, 180.986904, 0), new carc2.Isotope(101, 181.98561, 0), new carc2.Isotope(102, 182.982697, 0), new carc2.Isotope(103, 183.98176, 0), new carc2.Isotope(104, 184.9791, 0), new carc2.Isotope(105, 185.977549881, 0), new carc2.Isotope(106, 186.97617, 0), new carc2.Isotope(107, 187.97592, 0), new carc2.Isotope(108, 188.974290451, 0), new carc2.Isotope(109, 189.974473379, 0), new carc2.Isotope(110, 190.972261952, 0), new carc2.Isotope(111, 191.972770785, 0), new carc2.Isotope(112, 192.970548, 0), new carc2.Isotope(113, 193.971053, 0), new carc2.Isotope(114, 194.96965, 0), new carc2.Isotope(115, 195.970515, 0), new carc2.Isotope(116, 196.9695362, 0), new carc2.Isotope(117, 197.970466294, 0), new carc2.Isotope(118, 198.969813837, 0), new carc2.Isotope(119, 199.970945394, 0), new carc2.Isotope(120, 200.97080377, 0), new carc2.Isotope(121, 201.972090569, 0), new carc2.Isotope(122, 202.972329088, 41.8922), new carc2.Isotope(123, 203.973848646, 0), new carc2.Isotope(124, 204.97441227, 100), new carc2.Isotope(125, 205.976095321, 0), new carc2.Isotope(126, 206.977407908, 0), new carc2.Isotope(127, 207.982004653, 0), new carc2.Isotope(128, 208.985349125, 0), new carc2.Isotope(129, 209.990065574, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(99, 180.996714, 0), new carc2.Isotope(100, 181.992676101, 0), new carc2.Isotope(101, 182.99193, 0), new carc2.Isotope(102, 183.988198, 0), new carc2.Isotope(103, 184.98758, 0), new carc2.Isotope(104, 185.983485388, 0), new carc2.Isotope(105, 186.98403, 0), new carc2.Isotope(106, 187.979869108, 0), new carc2.Isotope(107, 188.98088, 0), new carc2.Isotope(108, 189.978180008, 0), new carc2.Isotope(109, 190.9782, 0), new carc2.Isotope(110, 191.975719811, 0), new carc2.Isotope(111, 192.97608, 0), new carc2.Isotope(112, 193.974648056, 0), new carc2.Isotope(113, 194.975920279, 0), new carc2.Isotope(114, 195.97271, 0), new carc2.Isotope(115, 196.97338, 0), new carc2.Isotope(116, 197.97198, 0), new carc2.Isotope(117, 198.972909384, 0), new carc2.Isotope(118, 199.97181556, 0), new carc2.Isotope(119, 200.972846589, 0), new carc2.Isotope(120, 201.972143786, 0), new carc2.Isotope(121, 202.973375491, 0), new carc2.Isotope(122, 203.973028761, 2.6718), new carc2.Isotope(123, 204.974467112, 0), new carc2.Isotope(124, 205.974449002, 45.9923), new carc2.Isotope(125, 206.975880605, 42.1756), new carc2.Isotope(126, 207.97663585, 100), new carc2.Isotope(127, 208.981074801, 0), new carc2.Isotope(128, 209.984173129, 0), new carc2.Isotope(129, 210.988731474, 0), new carc2.Isotope(130, 211.991887495, 0), new carc2.Isotope(131, 212.9965, 0), new carc2.Isotope(132, 213.999798147, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(102, 184.997708, 0), new carc2.Isotope(103, 185.99648, 0), new carc2.Isotope(104, 186.993458, 0), new carc2.Isotope(105, 187.992173, 0), new carc2.Isotope(106, 188.989505, 0), new carc2.Isotope(107, 189.987520007, 0), new carc2.Isotope(108, 190.986053, 0), new carc2.Isotope(109, 191.985368, 0), new carc2.Isotope(110, 192.983662229, 0), new carc2.Isotope(111, 193.983430186, 0), new carc2.Isotope(112, 194.98112697, 0), new carc2.Isotope(113, 195.981236107, 0), new carc2.Isotope(114, 196.978934287, 0), new carc2.Isotope(115, 197.979024396, 0), new carc2.Isotope(116, 198.977576953, 0), new carc2.Isotope(117, 199.978141983, 0), new carc2.Isotope(118, 200.976970721, 0), new carc2.Isotope(119, 201.977674504, 0), new carc2.Isotope(120, 202.976868118, 0), new carc2.Isotope(121, 203.977805161, 0), new carc2.Isotope(122, 204.977374688, 0), new carc2.Isotope(123, 205.978482854, 0), new carc2.Isotope(124, 206.978455217, 0), new carc2.Isotope(125, 207.979726699, 0), new carc2.Isotope(126, 208.980383241, 100), new carc2.Isotope(127, 209.984104944, 0), new carc2.Isotope(128, 210.987258139, 0), new carc2.Isotope(129, 211.991271542, 0), new carc2.Isotope(130, 212.994374836, 0), new carc2.Isotope(131, 213.998698664, 0), new carc2.Isotope(132, 215.001832349, 0), new carc2.Isotope(133, 216.006199, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(106, 189.994293888, 0), new carc2.Isotope(107, 190.994653, 0), new carc2.Isotope(108, 191.99033039, 0), new carc2.Isotope(109, 192.991102, 0), new carc2.Isotope(110, 193.988284107, 0), new carc2.Isotope(111, 194.988045, 0), new carc2.Isotope(112, 195.985469432, 0), new carc2.Isotope(113, 196.985567, 0), new carc2.Isotope(114, 197.984024384, 0), new carc2.Isotope(115, 198.985044507, 0), new carc2.Isotope(116, 199.981735, 0), new carc2.Isotope(117, 200.982209, 0), new carc2.Isotope(118, 201.980704, 0), new carc2.Isotope(119, 202.981412863, 0), new carc2.Isotope(120, 203.980307113, 0), new carc2.Isotope(121, 204.981165396, 0), new carc2.Isotope(122, 205.980465241, 0), new carc2.Isotope(123, 206.981578228, 0), new carc2.Isotope(124, 207.981231059, 0), new carc2.Isotope(125, 208.982415788, 0), new carc2.Isotope(126, 209.982857396, 0), new carc2.Isotope(127, 210.986636869, 0), new carc2.Isotope(128, 211.988851755, 0), new carc2.Isotope(129, 212.992842522, 0), new carc2.Isotope(130, 213.995185949, 0), new carc2.Isotope(131, 214.999414609, 0), new carc2.Isotope(132, 216.001905198, 0), new carc2.Isotope(133, 217.006253, 0), new carc2.Isotope(134, 218.008965773, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(108, 193.000188, 0), new carc2.Isotope(109, 193.997973, 0), new carc2.Isotope(110, 194.996554, 0), new carc2.Isotope(111, 195.995702, 0), new carc2.Isotope(112, 196.993891293, 0), new carc2.Isotope(113, 197.99343368, 0), new carc2.Isotope(114, 198.991008569, 0), new carc2.Isotope(115, 199.990920883, 0), new carc2.Isotope(116, 200.988486908, 0), new carc2.Isotope(117, 201.988448629, 0), new carc2.Isotope(118, 202.986847216, 0), new carc2.Isotope(119, 203.987261559, 0), new carc2.Isotope(120, 204.986036352, 0), new carc2.Isotope(121, 205.986599242, 0), new carc2.Isotope(122, 206.985775861, 0), new carc2.Isotope(123, 207.986582508, 0), new carc2.Isotope(124, 208.986158678, 0), new carc2.Isotope(125, 209.987131308, 0), new carc2.Isotope(126, 210.987480806, 0), new carc2.Isotope(127, 211.990734657, 0), new carc2.Isotope(128, 212.99292115, 0), new carc2.Isotope(129, 213.996356412, 0), new carc2.Isotope(130, 214.998641245, 0), new carc2.Isotope(131, 216.002408839, 0), new carc2.Isotope(132, 217.004709619, 0), new carc2.Isotope(133, 218.008681458, 0), new carc2.Isotope(134, 219.011296478, 0), new carc2.Isotope(135, 220.015301, 0), new carc2.Isotope(136, 221.01814, 0), new carc2.Isotope(137, 222.02233, 0), new carc2.Isotope(138, 223.02534, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(110, 196.001117268, 0), new carc2.Isotope(111, 197.001661, 0), new carc2.Isotope(112, 197.998779978, 0), new carc2.Isotope(113, 198.998309, 0), new carc2.Isotope(114, 199.995634148, 0), new carc2.Isotope(115, 200.995535, 0), new carc2.Isotope(116, 201.993899382, 0), new carc2.Isotope(117, 202.994765192, 0), new carc2.Isotope(118, 203.991365, 0), new carc2.Isotope(119, 204.991668, 0), new carc2.Isotope(120, 205.99016, 0), new carc2.Isotope(121, 206.990726826, 0), new carc2.Isotope(122, 207.989631237, 0), new carc2.Isotope(123, 208.990376634, 0), new carc2.Isotope(124, 209.989679862, 0), new carc2.Isotope(125, 210.99058541, 0), new carc2.Isotope(126, 211.990688899, 0), new carc2.Isotope(127, 212.993868354, 0), new carc2.Isotope(128, 213.995346275, 0), new carc2.Isotope(129, 214.998729195, 0), new carc2.Isotope(130, 216.000258153, 0), new carc2.Isotope(131, 217.003914555, 0), new carc2.Isotope(132, 218.005586315, 0), new carc2.Isotope(133, 219.009474831, 0), new carc2.Isotope(134, 220.011384149, 0), new carc2.Isotope(135, 221.015455, 0), new carc2.Isotope(136, 222.017570472, 0), new carc2.Isotope(137, 223.02179, 0), new carc2.Isotope(138, 224.02409, 0), new carc2.Isotope(139, 225.02844, 0), new carc2.Isotope(140, 226.03089, 0), new carc2.Isotope(141, 227.035407, 0), new carc2.Isotope(142, 228.038084, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(113, 200.006499, 0), new carc2.Isotope(114, 201.00458692, 0), new carc2.Isotope(115, 202.00396885, 0), new carc2.Isotope(116, 203.001423829, 0), new carc2.Isotope(117, 204.001221209, 0), new carc2.Isotope(118, 204.998663961, 0), new carc2.Isotope(119, 205.998486886, 0), new carc2.Isotope(120, 206.996859385, 0), new carc2.Isotope(121, 207.997133849, 0), new carc2.Isotope(122, 208.995915421, 0), new carc2.Isotope(123, 209.996398327, 0), new carc2.Isotope(124, 210.995529332, 0), new carc2.Isotope(125, 211.996194988, 0), new carc2.Isotope(126, 212.996174845, 0), new carc2.Isotope(127, 213.99895474, 0), new carc2.Isotope(128, 215.000326029, 0), new carc2.Isotope(129, 216.003187873, 0), new carc2.Isotope(130, 217.004616452, 0), new carc2.Isotope(131, 218.007563326, 0), new carc2.Isotope(132, 219.009240843, 0), new carc2.Isotope(133, 220.012312978, 0), new carc2.Isotope(134, 221.014245654, 0), new carc2.Isotope(135, 222.017543957, 0), new carc2.Isotope(136, 223.019730712, 0), new carc2.Isotope(137, 224.023235513, 0), new carc2.Isotope(138, 225.025606914, 0), new carc2.Isotope(139, 226.029343423, 0), new carc2.Isotope(140, 227.031833167, 0), new carc2.Isotope(141, 228.034776087, 0), new carc2.Isotope(142, 229.038426, 0), new carc2.Isotope(143, 230.04251, 0), new carc2.Isotope(144, 231.045407, 0), new carc2.Isotope(145, 232.049654, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(115, 203.00921, 0), new carc2.Isotope(116, 204.006434513, 0), new carc2.Isotope(117, 205.006187, 0), new carc2.Isotope(118, 206.004463814, 0), new carc2.Isotope(119, 207.005176607, 0), new carc2.Isotope(120, 208.001776, 0), new carc2.Isotope(121, 209.001944, 0), new carc2.Isotope(122, 210.000446, 0), new carc2.Isotope(123, 211.000893996, 0), new carc2.Isotope(124, 211.999783492, 0), new carc2.Isotope(125, 213.000345847, 0), new carc2.Isotope(126, 214.000091141, 0), new carc2.Isotope(127, 215.002704195, 0), new carc2.Isotope(128, 216.003518402, 0), new carc2.Isotope(129, 217.00630601, 0), new carc2.Isotope(130, 218.007123948, 0), new carc2.Isotope(131, 219.010068787, 0), new carc2.Isotope(132, 220.011014669, 0), new carc2.Isotope(133, 221.013907762, 0), new carc2.Isotope(134, 222.01536182, 0), new carc2.Isotope(135, 223.01849714, 0), new carc2.Isotope(136, 224.020202004, 0), new carc2.Isotope(137, 225.023604463, 0), new carc2.Isotope(138, 226.025402555, 0), new carc2.Isotope(139, 227.029170677, 0), new carc2.Isotope(140, 228.031064101, 0), new carc2.Isotope(141, 229.034820309, 0), new carc2.Isotope(142, 230.037084774, 0), new carc2.Isotope(143, 231.04122, 0), new carc2.Isotope(144, 232.043693, 0), new carc2.Isotope(145, 233.047995, 0), new carc2.Isotope(146, 234.050547, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(118, 207.012469754, 0), new carc2.Isotope(119, 208.012112949, 0), new carc2.Isotope(120, 209.009568736, 0), new carc2.Isotope(121, 210.009256802, 0), new carc2.Isotope(122, 211.007648196, 0), new carc2.Isotope(123, 212.007811441, 0), new carc2.Isotope(124, 213.006573689, 0), new carc2.Isotope(125, 214.006893072, 0), new carc2.Isotope(126, 215.006450832, 0), new carc2.Isotope(127, 216.008721268, 0), new carc2.Isotope(128, 217.009332676, 0), new carc2.Isotope(129, 218.011625045, 0), new carc2.Isotope(130, 219.012404918, 0), new carc2.Isotope(131, 220.014752105, 0), new carc2.Isotope(132, 221.015575746, 0), new carc2.Isotope(133, 222.017828852, 0), new carc2.Isotope(134, 223.01912603, 0), new carc2.Isotope(135, 224.021708435, 0), new carc2.Isotope(136, 225.023220576, 0), new carc2.Isotope(137, 226.026089848, 0), new carc2.Isotope(138, 227.027746979, 0), new carc2.Isotope(139, 228.031014825, 0), new carc2.Isotope(140, 229.032930871, 0), new carc2.Isotope(141, 230.036025144, 0), new carc2.Isotope(142, 231.038551503, 0), new carc2.Isotope(143, 232.042022474, 0), new carc2.Isotope(144, 233.04455, 0), new carc2.Isotope(145, 234.04842, 0), new carc2.Isotope(146, 235.051102, 0), new carc2.Isotope(147, 236.055178, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(120, 210.015711883, 0), new carc2.Isotope(121, 211.016306912, 0), new carc2.Isotope(122, 212.012916, 0), new carc2.Isotope(123, 213.012962, 0), new carc2.Isotope(124, 214.011451, 0), new carc2.Isotope(125, 215.011726597, 0), new carc2.Isotope(126, 216.011050963, 0), new carc2.Isotope(127, 217.013066169, 0), new carc2.Isotope(128, 218.013267744, 0), new carc2.Isotope(129, 219.015521253, 0), new carc2.Isotope(130, 220.015733126, 0), new carc2.Isotope(131, 221.018171499, 0), new carc2.Isotope(132, 222.018454131, 0), new carc2.Isotope(133, 223.020795153, 0), new carc2.Isotope(134, 224.02145925, 0), new carc2.Isotope(135, 225.023941441, 0), new carc2.Isotope(136, 226.024890681, 0), new carc2.Isotope(137, 227.027698859, 0), new carc2.Isotope(138, 228.028731348, 0), new carc2.Isotope(139, 229.03175534, 0), new carc2.Isotope(140, 230.033126574, 0), new carc2.Isotope(141, 231.03629706, 0), new carc2.Isotope(142, 232.03805036, 100), new carc2.Isotope(143, 233.041576923, 0), new carc2.Isotope(144, 234.043595497, 0), new carc2.Isotope(145, 235.04750442, 0), new carc2.Isotope(146, 236.04971, 0), new carc2.Isotope(147, 237.053894, 0), new carc2.Isotope(148, 238.056243, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(122, 213.021183209, 0), new carc2.Isotope(123, 214.02073923, 0), new carc2.Isotope(124, 215.019097612, 0), new carc2.Isotope(125, 216.019109649, 0), new carc2.Isotope(126, 217.018288571, 0), new carc2.Isotope(127, 218.020007906, 0), new carc2.Isotope(128, 219.019880348, 0), new carc2.Isotope(129, 220.021876493, 0), new carc2.Isotope(130, 221.021863742, 0), new carc2.Isotope(131, 222.023726, 0), new carc2.Isotope(132, 223.023963748, 0), new carc2.Isotope(133, 224.025614854, 0), new carc2.Isotope(134, 225.026115172, 0), new carc2.Isotope(135, 226.02793275, 0), new carc2.Isotope(136, 227.028793151, 0), new carc2.Isotope(137, 228.031036942, 0), new carc2.Isotope(138, 229.032088601, 0), new carc2.Isotope(139, 230.034532562, 0), new carc2.Isotope(140, 231.035878898, 0), new carc2.Isotope(141, 232.03858172, 0), new carc2.Isotope(142, 233.040240235, 0), new carc2.Isotope(143, 234.043302325, 0), new carc2.Isotope(144, 235.045436759, 0), new carc2.Isotope(145, 236.048675176, 0), new carc2.Isotope(146, 237.05113943, 0), new carc2.Isotope(147, 238.054497046, 0), new carc2.Isotope(148, 239.05713, 0), new carc2.Isotope(149, 240.06098, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(126, 218.023487, 0), new carc2.Isotope(127, 219.024915423, 0), new carc2.Isotope(128, 220.024712, 0), new carc2.Isotope(129, 221.026351, 0), new carc2.Isotope(130, 222.02607, 0), new carc2.Isotope(131, 223.027722956, 0), new carc2.Isotope(132, 224.027590139, 0), new carc2.Isotope(133, 225.029384369, 0), new carc2.Isotope(134, 226.02933975, 0), new carc2.Isotope(135, 227.031140069, 0), new carc2.Isotope(136, 228.031366357, 0), new carc2.Isotope(137, 229.033496137, 0), new carc2.Isotope(138, 230.033927392, 0), new carc2.Isotope(139, 231.036289158, 0), new carc2.Isotope(140, 232.03714628, 0), new carc2.Isotope(141, 233.039628196, 0), new carc2.Isotope(142, 234.040945606, 55e-4), new carc2.Isotope(143, 235.043923062, 0.7253), new carc2.Isotope(144, 236.045561897, 0), new carc2.Isotope(145, 237.048723955, 0), new carc2.Isotope(146, 238.050782583, 100), new carc2.Isotope(147, 239.054287777, 0), new carc2.Isotope(148, 240.056585734, 0), new carc2.Isotope(149, 241.06033, 0), new carc2.Isotope(150, 242.062925, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(132, 225.033899689, 0), new carc2.Isotope(133, 226.035129, 0), new carc2.Isotope(134, 227.034958261, 0), new carc2.Isotope(135, 228.03618, 0), new carc2.Isotope(136, 229.036246866, 0), new carc2.Isotope(137, 230.037812591, 0), new carc2.Isotope(138, 231.038233161, 0), new carc2.Isotope(139, 232.040099, 0), new carc2.Isotope(140, 233.04073235, 0), new carc2.Isotope(141, 234.042888556, 0), new carc2.Isotope(142, 235.044055876, 0), new carc2.Isotope(143, 236.046559724, 0), new carc2.Isotope(144, 237.048167253, 0), new carc2.Isotope(145, 238.050940464, 0), new carc2.Isotope(146, 239.052931399, 0), new carc2.Isotope(147, 240.056168828, 0), new carc2.Isotope(148, 241.058246266, 0), new carc2.Isotope(149, 242.061635, 0), new carc2.Isotope(150, 243.064273, 0), new carc2.Isotope(151, 244.06785, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(134, 228.038727686, 0), new carc2.Isotope(135, 229.040138934, 0), new carc2.Isotope(136, 230.039645603, 0), new carc2.Isotope(137, 231.041258, 0), new carc2.Isotope(138, 232.041179445, 0), new carc2.Isotope(139, 233.04298757, 0), new carc2.Isotope(140, 234.043304681, 0), new carc2.Isotope(141, 235.0452815, 0), new carc2.Isotope(142, 236.046048088, 0), new carc2.Isotope(143, 237.048403774, 0), new carc2.Isotope(144, 238.0495534, 0), new carc2.Isotope(145, 239.052156519, 0), new carc2.Isotope(146, 240.05380746, 0), new carc2.Isotope(147, 241.056845291, 0), new carc2.Isotope(148, 242.058736847, 0), new carc2.Isotope(149, 243.061997013, 0), new carc2.Isotope(150, 244.06419765, 0), new carc2.Isotope(151, 245.067738657, 0), new carc2.Isotope(152, 246.070198429, 0), new carc2.Isotope(153, 247.07407, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(136, 231.04556, 0), new carc2.Isotope(137, 232.04659, 0), new carc2.Isotope(138, 233.046472, 0), new carc2.Isotope(139, 234.047794, 0), new carc2.Isotope(140, 235.048029, 0), new carc2.Isotope(141, 236.049569, 0), new carc2.Isotope(142, 237.049970748, 0), new carc2.Isotope(143, 238.051977839, 0), new carc2.Isotope(144, 239.053018481, 0), new carc2.Isotope(145, 240.055287826, 0), new carc2.Isotope(146, 241.056822944, 0), new carc2.Isotope(147, 242.059543039, 0), new carc2.Isotope(148, 243.061372686, 0), new carc2.Isotope(149, 244.064279429, 0), new carc2.Isotope(150, 245.066445398, 0), new carc2.Isotope(151, 246.069768438, 0), new carc2.Isotope(152, 247.072086, 0), new carc2.Isotope(153, 248.075745, 0), new carc2.Isotope(154, 249.07848, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(137, 233.0508, 0), new carc2.Isotope(138, 234.05024, 0), new carc2.Isotope(139, 235.051591, 0), new carc2.Isotope(140, 236.051405, 0), new carc2.Isotope(141, 237.052891, 0), new carc2.Isotope(142, 238.053016298, 0), new carc2.Isotope(143, 239.054951, 0), new carc2.Isotope(144, 240.055519046, 0), new carc2.Isotope(145, 241.057646736, 0), new carc2.Isotope(146, 242.058829326, 0), new carc2.Isotope(147, 243.061382249, 0), new carc2.Isotope(148, 244.062746349, 0), new carc2.Isotope(149, 245.065485586, 0), new carc2.Isotope(150, 246.067217551, 0), new carc2.Isotope(151, 247.070346811, 0), new carc2.Isotope(152, 248.072342247, 0), new carc2.Isotope(153, 249.075947062, 0), new carc2.Isotope(154, 250.078350687, 0), new carc2.Isotope(155, 251.082277873, 0), new carc2.Isotope(156, 252.08487, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(138, 235.05658, 0), new carc2.Isotope(139, 236.05733, 0), new carc2.Isotope(140, 237.057127, 0), new carc2.Isotope(141, 238.058266, 0), new carc2.Isotope(142, 239.058362, 0), new carc2.Isotope(143, 240.059749, 0), new carc2.Isotope(144, 241.060223, 0), new carc2.Isotope(145, 242.06205, 0), new carc2.Isotope(146, 243.06300157, 0), new carc2.Isotope(147, 244.065167882, 0), new carc2.Isotope(148, 245.066355386, 0), new carc2.Isotope(149, 246.068666836, 0), new carc2.Isotope(150, 247.070298533, 0), new carc2.Isotope(151, 248.07308, 0), new carc2.Isotope(152, 249.074979937, 0), new carc2.Isotope(153, 250.078310529, 0), new carc2.Isotope(154, 251.08075344, 0), new carc2.Isotope(155, 252.084303, 0), new carc2.Isotope(156, 253.08688, 0), new carc2.Isotope(157, 254.0906, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(139, 237.06207, 0), new carc2.Isotope(140, 238.06141, 0), new carc2.Isotope(141, 239.062579, 0), new carc2.Isotope(142, 240.062295, 0), new carc2.Isotope(143, 241.063716, 0), new carc2.Isotope(144, 242.063688713, 0), new carc2.Isotope(145, 243.065421, 0), new carc2.Isotope(146, 244.06599039, 0), new carc2.Isotope(147, 245.068039, 0), new carc2.Isotope(148, 246.068798807, 0), new carc2.Isotope(149, 247.070992043, 0), new carc2.Isotope(150, 248.07217808, 0), new carc2.Isotope(151, 249.074846818, 0), new carc2.Isotope(152, 250.076399951, 0), new carc2.Isotope(153, 251.079580056, 0), new carc2.Isotope(154, 252.081619582, 0), new carc2.Isotope(155, 253.085126791, 0), new carc2.Isotope(156, 254.087316198, 0), new carc2.Isotope(157, 255.091039, 0), new carc2.Isotope(158, 256.09344, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(141, 240.06892, 0), new carc2.Isotope(142, 241.068662, 0), new carc2.Isotope(143, 242.069699, 0), new carc2.Isotope(144, 243.069631, 0), new carc2.Isotope(145, 244.070969, 0), new carc2.Isotope(146, 245.071317, 0), new carc2.Isotope(147, 246.072965, 0), new carc2.Isotope(148, 247.07365, 0), new carc2.Isotope(149, 248.075458, 0), new carc2.Isotope(150, 249.076405, 0), new carc2.Isotope(151, 250.078654, 0), new carc2.Isotope(152, 251.079983592, 0), new carc2.Isotope(153, 252.082972247, 0), new carc2.Isotope(154, 253.084817974, 0), new carc2.Isotope(155, 254.088016026, 0), new carc2.Isotope(156, 255.090266386, 0), new carc2.Isotope(157, 256.093592, 0), new carc2.Isotope(158, 257.095979, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(142, 242.07343, 0), new carc2.Isotope(143, 243.07451, 0), new carc2.Isotope(144, 244.074077, 0), new carc2.Isotope(145, 245.075375, 0), new carc2.Isotope(146, 246.075281634, 0), new carc2.Isotope(147, 247.076819, 0), new carc2.Isotope(148, 248.077184411, 0), new carc2.Isotope(149, 249.079024, 0), new carc2.Isotope(150, 250.079514759, 0), new carc2.Isotope(151, 251.081566467, 0), new carc2.Isotope(152, 252.082460071, 0), new carc2.Isotope(153, 253.085176259, 0), new carc2.Isotope(154, 254.086847795, 0), new carc2.Isotope(155, 255.089955466, 0), new carc2.Isotope(156, 256.091766522, 0), new carc2.Isotope(157, 257.095098635, 0), new carc2.Isotope(158, 258.097069, 0), new carc2.Isotope(159, 259.100588, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(144, 245.081017, 0), new carc2.Isotope(145, 246.081933, 0), new carc2.Isotope(146, 247.081804, 0), new carc2.Isotope(147, 248.082909, 0), new carc2.Isotope(148, 249.083002, 0), new carc2.Isotope(149, 250.084488, 0), new carc2.Isotope(150, 251.084919, 0), new carc2.Isotope(151, 252.08663, 0), new carc2.Isotope(152, 253.08728, 0), new carc2.Isotope(153, 254.089725, 0), new carc2.Isotope(154, 255.091075196, 0), new carc2.Isotope(155, 256.094052757, 0), new carc2.Isotope(156, 257.095534643, 0), new carc2.Isotope(157, 258.098425321, 0), new carc2.Isotope(158, 259.100503, 0), new carc2.Isotope(159, 260.103645, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(147, 249.087823, 0), new carc2.Isotope(148, 250.087493, 0), new carc2.Isotope(149, 251.08896, 0), new carc2.Isotope(150, 252.088965909, 0), new carc2.Isotope(151, 253.090649, 0), new carc2.Isotope(152, 254.090948746, 0), new carc2.Isotope(153, 255.093232449, 0), new carc2.Isotope(154, 256.094275879, 0), new carc2.Isotope(155, 257.096852778, 0), new carc2.Isotope(156, 258.0982, 0), new carc2.Isotope(157, 259.101024, 0), new carc2.Isotope(158, 260.102636, 0), new carc2.Isotope(159, 261.105743, 0), new carc2.Isotope(160, 262.10752, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(148, 251.09436, 0), new carc2.Isotope(149, 252.09533, 0), new carc2.Isotope(150, 253.095258, 0), new carc2.Isotope(151, 254.096587, 0), new carc2.Isotope(152, 255.096769, 0), new carc2.Isotope(153, 256.098763, 0), new carc2.Isotope(154, 257.099606, 0), new carc2.Isotope(155, 258.101883, 0), new carc2.Isotope(156, 259.10299, 0), new carc2.Isotope(157, 260.105572, 0), new carc2.Isotope(158, 261.106941, 0), new carc2.Isotope(159, 262.109692, 0), new carc2.Isotope(160, 263.111394, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(149, 253.100679, 0), new carc2.Isotope(150, 254.100166, 0), new carc2.Isotope(151, 255.101492, 0), new carc2.Isotope(152, 256.101179573, 0), new carc2.Isotope(153, 257.103072, 0), new carc2.Isotope(154, 258.103568, 0), new carc2.Isotope(155, 259.105628, 0), new carc2.Isotope(156, 260.106434, 0), new carc2.Isotope(157, 261.108752, 0), new carc2.Isotope(158, 262.109918, 0), new carc2.Isotope(159, 263.11254, 0), new carc2.Isotope(160, 264.113978, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(150, 255.107398, 0), new carc2.Isotope(151, 256.10811, 0), new carc2.Isotope(152, 257.107858, 0), new carc2.Isotope(153, 258.109438, 0), new carc2.Isotope(154, 259.109721, 0), new carc2.Isotope(155, 260.111427, 0), new carc2.Isotope(156, 261.112106, 0), new carc2.Isotope(157, 262.114153, 0), new carc2.Isotope(158, 263.115078, 0), new carc2.Isotope(159, 264.117473, 0), new carc2.Isotope(160, 265.118659, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(152, 258.113151, 0), new carc2.Isotope(153, 259.114652, 0), new carc2.Isotope(154, 260.114435447, 0), new carc2.Isotope(155, 261.116199, 0), new carc2.Isotope(156, 262.116477, 0), new carc2.Isotope(157, 263.118313, 0), new carc2.Isotope(158, 264.118924, 0), new carc2.Isotope(159, 265.121066, 0), new carc2.Isotope(160, 266.121928, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(153, 260.121803, 0), new carc2.Isotope(154, 261.1218, 0), new carc2.Isotope(155, 262.123009, 0), new carc2.Isotope(156, 263.123146, 0), new carc2.Isotope(157, 264.12473, 0), new carc2.Isotope(158, 265.125198, 0), new carc2.Isotope(159, 266.127009, 0), new carc2.Isotope(160, 267.12774, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(155, 263.12871, 0), new carc2.Isotope(156, 264.128408258, 0), new carc2.Isotope(157, 265.130001, 0), new carc2.Isotope(158, 266.130042, 0), new carc2.Isotope(159, 267.131774, 0), new carc2.Isotope(160, 268.132156, 0), new carc2.Isotope(161, 269.134114, 0)]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Isotope_2_classLit, 1), { 14: 1, 4: 1, 1: 1, 7: 1 }, 3, 0, [new carc2.Isotope(156, 265.136567, 0), new carc2.Isotope(157, 266.13794, 0), new carc2.Isotope(158, 267.137526, 0), new carc2.Isotope(159, 268.138816, 0), new carc2.Isotope(160, 269.139106, 0), new carc2.Isotope(161, 270.140723, 0), new carc2.Isotope(162, 271.141229, 0)])]);
  };
  carc2.getAbsoluteMass = function getAbsoluteMass(atomicNo, mass) {
    carc2.$clinit_IsotopeHelper();
    var i, neutrones;
    neutrones = mass - atomicNo;
    for (i = 0; i < carc2.sIsotope[atomicNo].length; i++)
      if (carc2.sIsotope[atomicNo][i].neutrones == neutrones)
        return carc2.sIsotope[atomicNo][i].absoluteMass;
    return NaN;
  };
  defineClass(753, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_IsotopeHelper_2_classLit = createForClass("com.actelion.research.chem", "IsotopeHelper", 753, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_MesoFragmentBranch = function $clinit_MesoFragmentBranch() {
    carc2.$clinit_MesoFragmentBranch = emptyMethod;
  };
  defineClass(263, 1, { 263: 1, 1: 1 });
  _.neighbourIndex = 0;
  cggl.Lcom_actelion_research_chem_MesoFragmentBranch_2_classLit = createForClass("com.actelion.research.chem", "MesoFragmentBranch", 263, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_MesoFragmentMembers = function $clinit_MesoFragmentMembers() {
    carc2.$clinit_MesoFragmentMembers = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.MesoFragmentMembers = function MesoFragmentMembers(atoms) {
    carc2.$clinit_MesoFragmentMembers();
    Object_0.call(this);
    this.$init_35();
    this.isMember = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, atoms, 16, 1);
  };
  defineClass(188, 1, { 188: 1, 22: 1, 1: 1 }, carc2.MesoFragmentMembers);
  _.$init_35 = function $init_35() {
  };
  _.compareTo_1 = function compareTo_8(members) {
    return this.compareTo_4(castTo(members, 188));
  };
  _.add_4 = function add_9(atom) {
    this.isMember[atom] = true;
  };
  _.compareTo_4 = function compareTo_7(members) {
    var i;
    if (this.memberAtom.length != members.memberAtom.length)
      return this.memberAtom.length < members.memberAtom.length ? -1 : 1;
    for (i = 0; i < this.memberAtom.length; i++)
      if (this.memberAtom[i] != members.memberAtom[i])
        return this.memberAtom[i] < members.memberAtom[i] ? -1 : 1;
    return 0;
  };
  _.consolidate = function consolidate() {
    var atom, count, is, is$array, is$index, is$max;
    count = 0;
    for (is$array = this.isMember, is$index = 0, is$max = is$array.length; is$index < is$max; ++is$index) {
      is = is$array[is$index];
      if (is)
        count++;
    }
    this.memberAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, count, 15, 1);
    count = 0;
    for (atom = 0; atom < this.isMember.length; atom++)
      if (this.isMember[atom])
        this.memberAtom[count++] = atom;
  };
  _.hasStereoCenters = function hasStereoCenters(isStereoCenter) {
    var j;
    this.consolidate();
    for (j = 0; j < this.memberAtom.length; j++)
      if (isStereoCenter[this.memberAtom[j]])
        return true;
    return false;
  };
  cggl.Lcom_actelion_research_chem_MesoFragmentMembers_2_classLit = createForClass("com.actelion.research.chem", "MesoFragmentMembers", 188, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_MolecularFormula = function $clinit_MolecularFormula() {
    carc2.$clinit_MolecularFormula = emptyMethod;
    jl.$clinit_Object();
    carc2.sRelativeMass = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [0, 1.00794, 4.0026, 6.941, 9.0122, 10.811, 12.011, 14.007, 15.999, 18.998, 20.18, 22.99, 24.305, 26.982, 28.086, 30.974, 32.066, 35.453, 39.948, 39.098, 40.078, 44.956, 47.867, 50.942, 51.996, 54.938, 55.845, 58.933, 58.693, 63.546, 65.39, 69.723, 72.61, 74.922, 78.96, 79.904, 83.8, 85.468, 87.62, 88.906, 91.224, 92.906, 95.94, 98.906, 101.07, 102.91, 106.42, 107.87, 112.41, 114.82, 118.71, 121.76, 127.6, 126.9, 131.29, 132.91, 137.33, 138.91, 140.12, 140.91, 144.24, 146.92, 150.36, 151.96, 157.25, 158.93, 162.5, 164.93, 167.26, 168.93, 173.04, 174.97, 178.49, 180.95, 183.84, 186.21, 190.23, 192.22, 195.08, 196.97, 200.59, 204.38, 207.2, 208.98, 209.98, 209.99, 222.02, 223.02, 226.03, 227.03, 232.04, 231.04, 238.03, 237.05, 239.05, 241.06, 244.06, 249.08, 252.08, 252.08, 257.1, 258.1, 259.1, 262.11, 267.12, 268.13, 271.13, 270.13, 277.15, 276.15, 281.17, 281.17, 283.17, 285.18, 289.19, 289.19, 293.2, 294.21, 294.21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.0141, 3.016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71.0787, 156.18828, 114.10364, 115.0877, 103.1447, 128.13052, 129.11458, 57.05182, 137.14158, 113.15934, 113.15934, 128.17428, 131.19846, 147.17646, 97.11658, 87.0777, 101.10458, 186.2134, 163.17546, 99.13246]);
    carc2.sAbsoluteMass = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [0, 1.007825, 4.0026, 7.016003, 9.012182, 11.009305, 12, 14.003074, 15.994915, 18.998403, 19.992435, 22.989767, 23.985042, 26.98153, 27.976927, 30.973762, 31.97207, 34.968852, 39.962384, 38.963707, 39.962591, 44.95591, 47.947947, 50.943962, 51.940509, 54.938047, 55.934939, 58.933198, 57.935346, 62.939598, 63.929145, 68.92558, 73.921177, 74.921594, 79.91652, 78.918336, 83.911507, 84.911794, 87.905619, 88.905849, 89.904703, 92.906377, 97.905406, 89.92381, 101.904348, 102.9055, 105.903478, 106.905092, 113.903357, 114.90388, 119.9022, 120.903821, 129.906229, 126.904473, 131.904144, 132.905429, 137.905232, 138.906346, 139.905433, 140.907647, 141.907719, 135.92398, 151.919729, 152.921225, 157.924099, 158.925342, 163.929171, 164.930319, 165.93029, 168.934212, 173.938859, 174.94077, 179.946545, 180.947992, 183.950928, 186.955744, 191.961467, 192.962917, 194.964766, 196.966543, 201.970617, 204.974401, 207.976627, 208.980374, 193.98818, 195.99573, 199.9957, 201.00411, 206.0038, 210.00923, 232.038054, 216.01896, 238.050784, 229.03623, 232.041169, 237.05005, 238.05302, 242.06194, 240.06228, 243.06947, 243.07446, 248.08275, 251.08887, 253.09515, 257.10295, 257.10777, 271.13, 270.13, 277.15, 276.15, 281.17, 281.17, 283.17, 285.18, 289.19, 289.19, 291.2, 294.21, 294.21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.014, 3.01605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
    carc2.sFirstFormulaAtomicNo = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [6, 1, 7, 8]);
  };
  carc2.MolecularFormula = function MolecularFormula(mol) {
    carc2.$clinit_MolecularFormula();
    var atom, atom0, atom1, atomCount, atomMass, atomicNo, atomicNoCount, i, i0, lowestAtomicNo, lowestLabel;
    Object_0.call(this);
    this.$init_36();
    mol.ensureHelperArrays_0(1);
    atomCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 190 + 1, 15, 1);
    for (atom0 = 0; atom0 < mol.getAllAtoms_0(); atom0++) {
      switch (mol.getAtomicNo_0(atom0)) {
        case 171:
          atomCount[1] += 5;
          atomCount[6] += 3;
          atomCount[7] += 1;
          atomCount[8] += 1;
          break;
        case 172:
          atomCount[1] += 12;
          atomCount[6] += 6;
          atomCount[7] += 4;
          atomCount[8] += 1;
          break;
        case 173:
          atomCount[1] += 6;
          atomCount[6] += 4;
          atomCount[7] += 2;
          atomCount[8] += 2;
          break;
        case 174:
          atomCount[1] += 5;
          atomCount[6] += 4;
          atomCount[7] += 1;
          atomCount[8] += 3;
          break;
        case 175:
          atomCount[1] += 5;
          atomCount[6] += 3;
          atomCount[7] += 1;
          atomCount[8] += 1;
          atomCount[16] += 1;
          break;
        case 176:
          atomCount[1] += 8;
          atomCount[6] += 5;
          atomCount[7] += 2;
          atomCount[8] += 2;
          break;
        case 177:
          atomCount[1] += 7;
          atomCount[6] += 5;
          atomCount[7] += 1;
          atomCount[8] += 3;
          break;
        case 178:
          atomCount[1] += 3;
          atomCount[6] += 2;
          atomCount[7] += 1;
          atomCount[8] += 1;
          break;
        case 179:
          atomCount[1] += 7;
          atomCount[6] += 6;
          atomCount[7] += 3;
          atomCount[8] += 1;
          break;
        case 180:
          atomCount[1] += 11;
          atomCount[6] += 6;
          atomCount[7] += 1;
          atomCount[8] += 1;
          break;
        case 181:
          atomCount[1] += 11;
          atomCount[6] += 6;
          atomCount[7] += 1;
          atomCount[8] += 1;
          break;
        case 182:
          atomCount[1] += 12;
          atomCount[6] += 6;
          atomCount[7] += 2;
          atomCount[8] += 1;
          break;
        case 183:
          atomCount[1] += 9;
          atomCount[6] += 5;
          atomCount[7] += 1;
          atomCount[8] += 1;
          atomCount[16] += 1;
          break;
        case 184:
          atomCount[1] += 9;
          atomCount[6] += 9;
          atomCount[7] += 1;
          atomCount[8] += 1;
          break;
        case 185:
          atomCount[1] += 7;
          atomCount[6] += 5;
          atomCount[7] += 1;
          atomCount[8] += 1;
          break;
        case 186:
          atomCount[1] += 5;
          atomCount[6] += 3;
          atomCount[7] += 1;
          atomCount[8] += 2;
          break;
        case 187:
          atomCount[1] += 7;
          atomCount[6] += 4;
          atomCount[7] += 1;
          atomCount[8] += 2;
          break;
        case 188:
          atomCount[1] += 10;
          atomCount[6] += 11;
          atomCount[7] += 2;
          atomCount[8] += 1;
          break;
        case 189:
          atomCount[1] += 9;
          atomCount[6] += 9;
          atomCount[7] += 1;
          atomCount[8] += 2;
          break;
        case 190:
          atomCount[1] += 9;
          atomCount[6] += 5;
          atomCount[7] += 1;
          atomCount[8] += 1;
          break;
        case 1:
          switch (mol.getAtomMass_0(atom0)) {
            case 0:
            case 1:
              atomCount[1]++;
              break;
            case 2:
              atomCount[151]++;
              break;
            case 3:
              atomCount[152]++;
              break;
          }
          break;
        default:
          atomCount[mol.getAtomicNo_0(atom0)]++;
          break;
      }
    }
    for (atom1 = 0; atom1 < mol.getAllAtoms_0(); atom1++)
      if (mol.getAtomicNo_0(atom1) >= 171 && mol.getAtomicNo_0(atom1) <= 190)
        atomCount[1] += 2 - mol.getOccupiedValence_0(atom1);
      else {
        atomCount[1] += mol.getImplicitHydrogens_1(atom1);
      }
    atomicNoCount = 0;
    for (i0 = 1; i0 <= 190; i0++)
      if (atomCount[i0] != 0)
        atomicNoCount++;
    this.mAtomCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, atomicNoCount, 15, 1);
    this.mAtomicNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, atomicNoCount, 15, 1);
    atomicNoCount = 0;
    for (i = 0; i < carc2.sFirstFormulaAtomicNo.length; i++) {
      if (atomCount[carc2.sFirstFormulaAtomicNo[i]] != 0) {
        this.mAtomCount[atomicNoCount] = atomCount[carc2.sFirstFormulaAtomicNo[i]];
        this.mAtomicNo[atomicNoCount] = carc2.sFirstFormulaAtomicNo[i];
        atomicNoCount++;
        atomCount[carc2.sFirstFormulaAtomicNo[i]] = 0;
      }
    }
    while (true) {
      lowestLabel = "zzz";
      lowestAtomicNo = -1;
      for (atomicNo = 1; atomicNo <= 190; atomicNo++)
        if (atomCount[atomicNo] > 0 && jl.compareTo_Ljava_lang_String__I__devirtual$(lowestLabel, (carc2.$clinit_Molecule(), carc2.cAtomLabel)[atomicNo]) > 0) {
          lowestLabel = (carc2.$clinit_Molecule(), carc2.cAtomLabel)[atomicNo];
          lowestAtomicNo = atomicNo;
        }
      if (lowestAtomicNo == -1)
        break;
      this.mAtomCount[atomicNoCount] = atomCount[lowestAtomicNo];
      this.mAtomicNo[atomicNoCount] = lowestAtomicNo;
      atomicNoCount++;
      atomCount[lowestAtomicNo] = 0;
    }
    this.mAbsoluteIsotopeWeightIncrement = 0;
    this.mRelativeIsotopeWeightIncrement = 0;
    for (atom = 0; atom < mol.getAtoms_0(); atom++) {
      if (mol.getAtomicNo_0(atom) != 1 && !mol.isNaturalAbundance_0(atom)) {
        atomicNo = mol.getAtomicNo_0(atom);
        atomMass = mol.getAtomMass_0(atom);
        this.mAbsoluteIsotopeWeightIncrement += carc2.getAbsoluteMass(atomicNo, atomMass) - carc2.sAbsoluteMass[atomicNo];
        this.mRelativeIsotopeWeightIncrement += carc2.getAbsoluteMass(atomicNo, atomMass) - carc2.sRelativeMass[atomicNo];
      }
    }
  };
  defineClass(105, 1, { 105: 1, 1: 1 });
  _.$init_36 = function $init_36() {
  };
  _.equals_0 = function equals_7(f) {
    var i;
    if (maskUndefined(f) === maskUndefined(this))
      return true;
    if (!instanceOf(f, 105))
      return false;
    for (i = 0; i < this.mAtomCount.length; i++)
      if (this.mAtomCount[i] != castTo(f, 105).mAtomCount[i])
        return false;
    return true;
  };
  _.getAbsoluteWeight = function getAbsoluteWeight() {
    var i, weight;
    weight = this.mAbsoluteIsotopeWeightIncrement;
    for (i = 0; i < this.mAtomCount.length; i++)
      weight += this.mAtomCount[i] * carc2.sAbsoluteMass[this.mAtomicNo[i]];
    return weight;
  };
  _.getFormula = function getFormula() {
    var formula, i;
    formula = new jl.StringBuffer();
    for (i = 0; i < this.mAtomCount.length; i++) {
      formula.append_2((carc2.$clinit_Molecule(), carc2.cAtomLabel)[this.mAtomicNo[i]]);
      if (this.mAtomCount[i] > 1)
        formula.append_1(this.mAtomCount[i]);
    }
    return formula.toString_0();
  };
  _.getRelativeWeight = function getRelativeWeight() {
    var i, weight;
    weight = this.mRelativeIsotopeWeightIncrement;
    for (i = 0; i < this.mAtomCount.length; i++)
      weight += this.mAtomCount[i] * carc2.sRelativeMass[this.mAtomicNo[i]];
    return weight;
  };
  _.mAbsoluteIsotopeWeightIncrement = 0;
  _.mRelativeIsotopeWeightIncrement = 0;
  cggl.Lcom_actelion_research_chem_MolecularFormula_2_classLit = createForClass("com.actelion.research.chem", "MolecularFormula", 105, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_MoleculeNeutralizer = function $clinit_MoleculeNeutralizer() {
    carc2.$clinit_MoleculeNeutralizer = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.electronegativity_0 = function electronegativity_0(atomicNo) {
    switch (atomicNo) {
      case 6:
        return 1;
      case 53:
        return 2;
      case 33:
        return 3;
      case 34:
        return 4;
      case 35:
        return 5;
      case 15:
        return 6;
      case 16:
        return 7;
      case 17:
        return 8;
      case 7:
        return 9;
      case 8:
        return 10;
      case 9:
        return 11;
    }
    return 0;
  };
  carc2.neutralizeChargedMolecule = function neutralizeChargedMolecule(mol) {
    carc2.$clinit_MoleculeNeutralizer();
    var atom, atom1, atom2, bond, bond0, charge1, charge2, chargedAtom, copy, donorAtom, found, fragmentsCharge, hasOppositeChargedNeighbour, hydrogensForDeletion, i, i0, i1, isAromaticAtom, isAromaticBond, leastElectronegative, leastElectronegativity, member, memberToProcess, noOfMembers, overallCharge, valence;
    mol.ensureHelperArrays_0(7);
    overallCharge = 0;
    hasOppositeChargedNeighbour = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 16, 1);
    hydrogensForDeletion = null;
    valence = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 15, 1);
    for (bond0 = 0; bond0 < mol.getBonds_0(); bond0++) {
      atom1 = mol.getBondAtom_0(0, bond0);
      atom2 = mol.getBondAtom_0(1, bond0);
      charge1 = mol.getAtomCharge_0(atom1);
      charge2 = mol.getAtomCharge_0(atom2);
      if (charge1 != 0 && charge2 != 0 && charge1 < 0 ^ charge2 < 0) {
        hasOppositeChargedNeighbour[atom1] = true;
        hasOppositeChargedNeighbour[atom2] = true;
      }
      valence[atom1] += mol.getBondOrder_0(bond0);
      valence[atom2] += mol.getBondOrder_0(bond0);
    }
    for (chargedAtom = 0; chargedAtom < mol.getAtoms_0(); chargedAtom++) {
      overallCharge += mol.getAtomCharge_0(chargedAtom);
      if (mol.getAtomCharge_0(chargedAtom) == 1) {
        if (mol.getAtomicNo_0(chargedAtom) == 7) {
          if (!hasOppositeChargedNeighbour[chargedAtom]) {
            if (valence[chargedAtom] <= 3) {
              overallCharge -= 1;
              mol.setAtomCharge_0(chargedAtom, 0);
              if (mol.getConnAtoms_0(chargedAtom) != mol.getAllConnAtoms_0(chargedAtom)) {
                mol.deleteAtom_0(mol.getConnAtom_0(chargedAtom, mol.getAllConnAtoms_0(chargedAtom) - 1));
                mol.ensureHelperArrays_0(7);
              }
            } else if (mol.isAromaticAtom_0(chargedAtom)) {
              isAromaticAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 16, 1);
              isAromaticBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getBonds_0(), 16, 1);
              mol.findRingSystem_0(chargedAtom, true, isAromaticAtom, isAromaticBond);
              for (donorAtom = 0; donorAtom < mol.getAtoms_0(); donorAtom++) {
                if (isAromaticAtom[donorAtom] && mol.getAtomicNo_0(donorAtom) == 7 && mol.getAtomCharge_0(donorAtom) == 0 && valence[donorAtom] == 2) {
                  if (carc2.removeHydrogenAndDelocalize(mol, isAromaticBond, chargedAtom, donorAtom)) {
                    overallCharge -= 1;
                    break;
                  }
                }
              }
            }
          }
        }
      } else if (mol.getAtomCharge_0(chargedAtom) < 0) {
        if (mol.getAtomicNo_0(chargedAtom) == 6 || mol.getAtomicNo_0(chargedAtom) == 7 || mol.getAtomicNo_0(chargedAtom) == 8 || mol.getAtomicNo_0(chargedAtom) == 16) {
          if (!hasOppositeChargedNeighbour[chargedAtom]) {
            overallCharge -= mol.getAtomCharge_0(chargedAtom);
            mol.setAtomCharge_0(chargedAtom, 0);
          } else {
            member = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 16, 15, 1);
            member[0] = chargedAtom;
            noOfMembers = 1;
            memberToProcess = 0;
            while (memberToProcess < noOfMembers) {
              for (bond = 0; bond < mol.getAllBonds_0(); bond++) {
                atom = -1;
                if (mol.getBondAtom_0(0, bond) == member[memberToProcess])
                  atom = mol.getBondAtom_0(1, bond);
                else if (mol.getBondAtom_0(1, bond) == member[memberToProcess])
                  atom = mol.getBondAtom_0(0, bond);
                if (atom == -1)
                  continue;
                if (mol.getAtomCharge_0(atom) != 0) {
                  found = false;
                  for (i0 = 0; i0 < noOfMembers; i0++) {
                    if (atom == member[i0]) {
                      found = true;
                      break;
                    }
                  }
                  if (!found) {
                    if (noOfMembers == member.length) {
                      copy = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2 * member.length, 15, 1);
                      jl.arraycopy(member, 0, copy, 0, member.length);
                      member = copy;
                    }
                    member[noOfMembers++] = atom;
                  }
                }
              }
              memberToProcess++;
            }
            fragmentsCharge = 0;
            for (i1 = 0; i1 < noOfMembers; i1++) {
              fragmentsCharge += mol.getAtomCharge_0(member[i1]);
            }
            if (fragmentsCharge < 0) {
              leastElectronegative = -1;
              leastElectronegativity = 99;
              for (i = 0; i < noOfMembers; i++) {
                if (mol.getAtomCharge_0(member[i]) < 0) {
                  if (leastElectronegativity > carc2.electronegativity_0(mol.getAtomicNo_0(member[i]))) {
                    leastElectronegativity = carc2.electronegativity_0(mol.getAtomicNo_0(member[i]));
                    leastElectronegative = member[i];
                  }
                }
              }
              if (leastElectronegative != -1) {
                overallCharge -= mol.getAtomCharge_0(leastElectronegative);
                mol.setAtomCharge_0(leastElectronegative, 0);
              }
            }
          }
        }
      }
    }
    if (jsNotEquals(hydrogensForDeletion, null))
      mol.deleteAtoms_1(hydrogensForDeletion);
    if (overallCharge > 0)
      overallCharge = carc2.removeAcidicHydrogens(mol, overallCharge);
    return overallCharge;
  };
  carc2.removeAcidicHydrogens = function removeAcidicHydrogens(mol, maxHydrogens) {
    var atom, connAtom, found, i;
    if (maxHydrogens > 0)
      maxHydrogens = carc2.removeHydrogensFromHalogene(mol, maxHydrogens, 9);
    if (maxHydrogens > 0)
      maxHydrogens = carc2.removeHydrogensFromHalogene(mol, maxHydrogens, 17);
    if (maxHydrogens > 0)
      maxHydrogens = carc2.removeHydrogensFromHalogene(mol, maxHydrogens, 35);
    if (maxHydrogens > 0)
      maxHydrogens = carc2.removeHydrogensFromHalogene(mol, maxHydrogens, 53);
    if (maxHydrogens > 0) {
      for (atom = 0; atom < mol.getAtoms_0(); atom++) {
        if (mol.getAtomCharge_0(atom) > 0) {
          found = false;
          for (i = 0; i < mol.getConnAtoms_0(atom); i++) {
            connAtom = mol.getConnAtom_0(atom, i);
            if (mol.getAtomCharge_0(connAtom) == 0 && mol.isElectronegative_0(connAtom) && mol.getImplicitHydrogens_1(connAtom) > 0) {
              mol.setAtomCharge_0(connAtom, -1);
              maxHydrogens--;
              if (maxHydrogens == 0)
                return 0;
              found = true;
              break;
            }
          }
          if (found)
            continue;
        }
      }
    }
    if (maxHydrogens > 0)
      maxHydrogens = carc2.removeAcidicHydrogensFromAcid(mol, maxHydrogens, 8, 16);
    if (maxHydrogens > 0)
      maxHydrogens = carc2.removeAcidicHydrogensFromAcid(mol, maxHydrogens, 8, 15);
    if (maxHydrogens > 0)
      maxHydrogens = carc2.removeAcidicHydrogensFromAcid(mol, maxHydrogens, 8, 6);
    if (maxHydrogens > 0)
      maxHydrogens = carc2.removeAcidicHydrogensFromAcid(mol, maxHydrogens, 7, 16);
    return maxHydrogens;
  };
  carc2.removeAcidicHydrogensFromAcid = function removeAcidicHydrogensFromAcid(mol, maxHydrogens, atomicNo, centralAtomicNo) {
    var atom, centralAtom, connAtom, deprotonated, deprotonatedFound, i, j, oxoFound;
    for (atom = 0; atom < mol.getAtoms_0(); atom++) {
      if (mol.getAtomicNo_0(atom) == atomicNo && mol.getAtomCharge_0(atom) == 0 && mol.getImplicitHydrogens_1(atom) > 0) {
        deprotonated = false;
        for (i = 0; i < mol.getConnAtoms_0(atom); i++) {
          if (mol.getConnBondOrder_0(atom, i) == 1) {
            centralAtom = mol.getConnAtom_0(atom, i);
            if (mol.getAtomicNo_0(centralAtom) == centralAtomicNo) {
              oxoFound = false;
              deprotonatedFound = false;
              for (j = 0; j < mol.getConnAtoms_0(centralAtom); j++) {
                connAtom = mol.getConnAtom_0(centralAtom, j);
                if (mol.getAtomCharge_0(connAtom) < 0) {
                  deprotonatedFound = true;
                  break;
                }
                if (connAtom != atom && mol.getAtomicNo_0(connAtom) == 8 && mol.getConnBondOrder_0(centralAtom, j) == 2) {
                  oxoFound = true;
                }
              }
              if (!deprotonatedFound && oxoFound) {
                mol.setAtomCharge_0(atom, -1);
                maxHydrogens--;
                if (maxHydrogens == 0)
                  return 0;
                deprotonated = true;
              }
            }
          }
          if (deprotonated)
            break;
        }
      }
    }
    return maxHydrogens;
  };
  carc2.removeHydrogenAndDelocalize = function removeHydrogenAndDelocalize(mol, isAromaticBond, chargedAtom, donorAtom) {
    var atom, bond, bond0, bond1, bondMask, i, i0, oldBondType;
    oldBondType = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getBonds_0(), 15, 1);
    bondMask = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getBonds_0(), 16, 1);
    for (bond0 = 0; bond0 < mol.getBonds_0(); bond0++) {
      oldBondType[bond0] = mol.getBondType_0(bond0);
      if (isAromaticBond[bond0]) {
        bondMask[bond0] = true;
        mol.setBondType_0(bond0, 1);
      }
    }
    for (atom = 0; atom < mol.getAtoms_0(); atom++) {
      if (atom != donorAtom && mol.getAtomPi_0(atom) == 0 && bondMask[mol.getConnBond_0(donorAtom, 0)]) {
        for (i0 = 0; i0 < mol.getConnAtoms_0(atom); i0++) {
          bond1 = mol.getConnBond_0(atom, i0);
          mol.setBondType_0(bond1, 1);
          bondMask[bond1] = false;
        }
      }
    }
    for (i = 0; i < mol.getConnAtoms_0(chargedAtom); i++) {
      bond1 = mol.getConnBond_0(chargedAtom, i);
      mol.setBondType_0(bond1, 1);
      bondMask[bond1] = false;
    }
    if (new carc2.AromaticityResolver(mol).locateDelocalizedDoubleBonds(bondMask)) {
      mol.setAtomCharge_0(chargedAtom, 0);
      if (mol.getConnAtoms_0(donorAtom) != mol.getAllConnAtoms_0(donorAtom)) {
        mol.deleteAtom_0(mol.getConnAtom_0(donorAtom, mol.getAllConnAtoms_0(donorAtom) - 1));
      }
      mol.ensureHelperArrays_0(7);
      return true;
    }
    for (bond = 0; bond < mol.getBonds_0(); bond++) {
      mol.setBondType_0(bond, oldBondType[bond]);
    }
    return false;
  };
  carc2.removeHydrogensFromHalogene = function removeHydrogensFromHalogene(mol, maxHydrogens, atomicNo) {
    var atom;
    for (atom = 0; atom < mol.getAtoms_0(); atom++) {
      if (mol.getAtomicNo_0(atom) == atomicNo && mol.getAtomCharge_0(atom) == 0 && mol.getConnAtoms_0(atom) == 0) {
        mol.setAtomCharge_0(atom, -1);
        maxHydrogens--;
        if (maxHydrogens == 0)
          return 0;
      }
    }
    return maxHydrogens;
  };
  defineClass(755, 1, { 1: 1 });
  carc2.cInitialMultiChargeFragmentMembers = 16;
  cggl.Lcom_actelion_research_chem_MoleculeNeutralizer_2_classLit = createForClass("com.actelion.research.chem", "MoleculeNeutralizer", 755, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_MolfileCreator = function $clinit_MolfileCreator() {
    carc2.$clinit_MolfileCreator = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.MolfileCreator = function MolfileCreator(mol) {
    carc2.$clinit_MolfileCreator();
    carc2.MolfileCreator_0.call(this, mol, true);
  };
  carc2.MolfileCreator_0 = function MolfileCreator_0(mol, allowScaling) {
    carc2.MolfileCreator_2.call(this, mol, allowScaling, new jl.StringBuilder_0(32768));
  };
  carc2.MolfileCreator_1 = function MolfileCreator_1(mol, allowScaling, scalingFactor, builder) {
    carc2.$clinit_MolfileCreator();
    var atom, atom0, atom1, atom10, atom11, atom2, atom3, atom4, atom5, atom6, atom7, atom8, atom9, atomLabel, atomList, atomicNo, avbl, bond, bondType, charge, count, distance, dx, dy, dz, esrGroupCount, grafac, group, hasCoordinates, hydrogenFlags, i, isRacemic, label_0, maxESRGroup, maxGroupCount, minDistance, name_0, nl, no, order, ringFeatures, ringState, sgroupNo, stereo, substitution, topology, valence;
    Object_0.call(this);
    this.$init_37();
    this.mDoubleFormat = new jt.DecimalFormat_0("0.0000", new jt.DecimalFormatSymbols((ju.$clinit_Locale(), ju.ENGLISH)));
    nl = jl.lineSeparator();
    mol.ensureHelperArrays_0(15);
    isRacemic = true;
    for (atom0 = 0; atom0 < mol.getAtoms_0(); atom0++) {
      if (mol.getAtomParity_0(atom0) != 0 && mol.getAtomParity_0(atom0) != 3 && mol.getAtomESRType_0(atom0) != 1) {
        isRacemic = false;
        break;
      }
    }
    maxESRGroup = -1;
    if (isRacemic) {
      esrGroupCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 32, 15, 1);
      maxGroupCount = 0;
      for (atom1 = 0; atom1 < mol.getAtoms_0(); atom1++) {
        if (mol.getAtomParity_0(atom1) != 0 && mol.getAtomParity_0(atom1) != 3 && mol.getAtomESRType_0(atom1) == 1) {
          group = mol.getAtomESRGroup_0(atom1);
          esrGroupCount[group]++;
          if (maxGroupCount < esrGroupCount[group]) {
            maxGroupCount = esrGroupCount[group];
            maxESRGroup = group;
          }
          break;
        }
      }
    }
    this.mBuilder = isNull(builder) ? new jl.StringBuilder() : builder;
    name_0 = jsNotEquals(mol.getName_0(), null) ? mol.getName_0() : "";
    this.mBuilder.append_9(name_0 + ("" + nl));
    this.mBuilder.append_9("Actelion Java MolfileCreator 1.0" + nl + nl);
    this.appendThreeDigitInt(mol.getAllAtoms_0());
    this.appendThreeDigitInt(mol.getAllBonds_0());
    this.mBuilder.append_9("  0  0");
    this.appendThreeDigitInt(!isRacemic ? 1 : 0);
    this.mBuilder.append_9("  0  0  0  0  0999 V2000" + nl);
    hasCoordinates = mol.getAllAtoms_0() == 1;
    for (atom3 = 1; atom3 < mol.getAllAtoms_0(); atom3++) {
      if (mol.getAtomX_0(atom3) != mol.getAtomX_0(0) || mol.getAtomY_0(atom3) != mol.getAtomY_0(0) || mol.getAtomZ_0(atom3) != mol.getAtomZ_0(0)) {
        hasCoordinates = true;
        break;
      }
    }
    grafac = 1;
    if (hasCoordinates) {
      if (scalingFactor != 0) {
        grafac = scalingFactor;
      } else if (allowScaling) {
        avbl = mol.getAverageBondLength_0();
        if (avbl != 0) {
          if (avbl < 1 || avbl > 3)
            grafac = 1.5 / avbl;
        } else {
          minDistance = 17976931348623157e292;
          for (atom1 = 1; atom1 < mol.getAllAtoms_0(); atom1++) {
            for (atom2 = 0; atom2 < atom1; atom2++) {
              dx = mol.getAtomX_0(atom2) - mol.getAtomX_0(atom1);
              dy = mol.getAtomY_0(atom2) - mol.getAtomY_0(atom1);
              dz = mol.getAtomZ_0(atom2) - mol.getAtomZ_0(atom1);
              distance = dx * dx + dy * dy + dz * dz;
              if (minDistance > distance)
                minDistance = distance;
            }
          }
          grafac = 2 * 1.5 / minDistance;
        }
      }
    }
    for (atom4 = 0; atom4 < mol.getAllAtoms_0(); atom4++) {
      if (hasCoordinates) {
        this.appendTenDigitDouble(grafac * mol.getAtomX_0(atom4));
        this.appendTenDigitDouble(grafac * -mol.getAtomY_0(atom4));
        this.appendTenDigitDouble(grafac * -mol.getAtomZ_0(atom4));
      } else {
        this.mBuilder.append_9("    0.0000    0.0000    0.0000");
      }
      if (jsNotEquals(mol.getAtomList_0(atom4), null))
        this.mBuilder.append_9(" L  ");
      else if (neq(and_0(mol.getAtomQueryFeatures(atom4), 1), 0))
        this.mBuilder.append_9(" A  ");
      else if (mol.getAtomicNo_0(atom4) >= 129 && mol.getAtomicNo_0(atom4) <= 144 || mol.getAtomicNo_0(atom4) == 154)
        this.mBuilder.append_9(" R# ");
      else {
        atomLabel = mol.getAtomLabel_0(atom4);
        this.mBuilder.append_9(" " + atomLabel);
        if (jl.length__I__devirtual$_0(atomLabel) == 1)
          this.mBuilder.append_9("  ");
        else if (jl.length__I__devirtual$_0(atomLabel) == 2)
          this.mBuilder.append_9(" ");
      }
      this.mBuilder.append_9(" 0  0  0");
      hydrogenFlags = and_0(1920, mol.getAtomQueryFeatures(atom4));
      if (eq(hydrogenFlags, 0))
        this.mBuilder.append_9("  0");
      else if (eq(hydrogenFlags, or_0(128, 256)))
        this.mBuilder.append_9("  3");
      else if (eq(hydrogenFlags, 128))
        this.mBuilder.append_9("  2");
      else if (eq(hydrogenFlags, or_0(or_0(256, 512), 1024)))
        this.mBuilder.append_9("  1");
      else if (eq(hydrogenFlags, or_0(or_0(128, 512), 1024)))
        this.mBuilder.append_9("  2");
      this.mBuilder.append_9(neq(and_0(mol.getAtomQueryFeatures(atom4), 8192), 0) ? "  1" : "  0");
      valence = mol.getAtomAbnormalValence_0(atom4);
      if (valence == -1)
        this.mBuilder.append_9("  0");
      else if (valence == 0)
        this.mBuilder.append_9(" 15");
      else
        this.appendThreeDigitInt(valence);
      this.mBuilder.append_9("  0  0  0");
      this.appendThreeDigitInt(mol.getAtomMapNo_0(atom4));
      this.mBuilder.append_9("  0  0" + nl);
    }
    for (bond = 0; bond < mol.getAllBonds_0(); bond++) {
      switch (mol.getBondType_0(bond)) {
        case 1:
          order = 1;
          stereo = 0;
          break;
        case 2:
          order = 2;
          stereo = 0;
          break;
        case 4:
          order = 3;
          stereo = 0;
          break;
        case 129:
          order = 1;
          stereo = 6;
          break;
        case 257:
          order = 1;
          stereo = 1;
          break;
        case 386:
          order = 2;
          stereo = 3;
          break;
        case 8:
          order = 4;
          stereo = 0;
          break;
        case 16:
          order = 8;
          stereo = 0;
          break;
        default:
          order = 1;
          stereo = 0;
          break;
      }
      if (isRacemic && (stereo == 1 || stereo == 6)) {
        atom1 = mol.getBondAtom_0(0, bond);
        if (mol.getAtomESRType_0(atom1) == 2)
          stereo = 0;
        else if (mol.getAtomESRType_0(atom1) == 1 && mol.getAtomESRGroup_0(atom1) != maxESRGroup)
          stereo = 4;
      }
      bondType = mol.getBondQueryFeatures_0(bond) & 31;
      if (bondType != 0) {
        if (bondType == 8)
          order = 4;
        else if (bondType == (1 | 2))
          order = 5;
        else if (bondType == (1 | 8))
          order = 6;
        else if (bondType == (2 | 8))
          order = 7;
        else
          order = 8;
      }
      ringState = mol.getBondQueryFeatures_0(bond) & 384;
      topology = ringState == 0 ? 0 : ringState == 256 ? 1 : 2;
      this.appendThreeDigitInt(1 + mol.getBondAtom_0(0, bond));
      this.appendThreeDigitInt(1 + mol.getBondAtom_0(1, bond));
      this.appendThreeDigitInt(order);
      this.appendThreeDigitInt(stereo);
      this.mBuilder.append_9("  0");
      this.appendThreeDigitInt(topology);
      this.mBuilder.append_9("  0" + nl);
    }
    no = 0;
    for (atom5 = 0; atom5 < mol.getAllAtoms_0(); atom5++)
      if (mol.getAtomCharge_0(atom5) != 0)
        no++;
    if (no != 0) {
      count = 0;
      for (atom1 = 0; atom1 < mol.getAllAtoms_0(); atom1++) {
        if (mol.getAtomCharge_0(atom1) != 0) {
          if (count == 0) {
            this.mBuilder.append_9("M  CHG");
            this.appendThreeDigitInt($wnd.Math.min(8, no));
          }
          this.mBuilder.append_9(" ");
          this.appendThreeDigitInt(atom1 + 1);
          charge = mol.getAtomCharge_0(atom1);
          if (charge < 0) {
            this.mBuilder.append_9("  -");
            charge = -charge;
          } else
            this.mBuilder.append_9("   ");
          this.mBuilder.append_4(narrow_char(48 + charge));
          no--;
          if (++count == 8 || no == 0) {
            count = 0;
            this.mBuilder.append_9(nl);
          }
        }
      }
    }
    no = 0;
    for (atom6 = 0; atom6 < mol.getAllAtoms_0(); atom6++)
      if (!mol.isNaturalAbundance_0(atom6))
        no++;
    if (no != 0) {
      count = 0;
      for (atom1 = 0; atom1 < mol.getAllAtoms_0(); atom1++) {
        if (!mol.isNaturalAbundance_0(atom1)) {
          if (count == 0) {
            this.mBuilder.append_9("M  ISO");
            this.appendThreeDigitInt($wnd.Math.min(8, no));
          }
          this.mBuilder.append_9(" ");
          this.appendThreeDigitInt(atom1 + 1);
          this.mBuilder.append_9(" ");
          this.appendThreeDigitInt(mol.getAtomMass_0(atom1));
          no--;
          if (++count == 8 || no == 0) {
            count = 0;
            this.mBuilder.append_9(nl);
          }
        }
      }
    }
    no = 0;
    for (atom7 = 0; atom7 < mol.getAllAtoms_0(); atom7++)
      if (mol.getAtomRadical_0(atom7) != 0)
        no++;
    if (no != 0) {
      count = 0;
      for (atom1 = 0; atom1 < mol.getAllAtoms_0(); atom1++) {
        if (mol.getAtomRadical_0(atom1) != 0) {
          if (count == 0) {
            this.mBuilder.append_9("M  RAD");
            this.appendThreeDigitInt($wnd.Math.min(8, no));
          }
          this.mBuilder.append_9(" ");
          this.appendThreeDigitInt(atom1 + 1);
          switch (mol.getAtomRadical_0(atom1)) {
            case 16:
              this.mBuilder.append_9("   1");
              break;
            case 32:
              this.mBuilder.append_9("   2");
              break;
            case 48:
              this.mBuilder.append_9("   3");
              break;
          }
          no--;
          if (++count == 8 || no == 0) {
            count = 0;
            this.mBuilder.append_9(nl);
          }
        }
      }
    }
    no = 0;
    for (atom8 = 0; atom8 < mol.getAllAtoms_0(); atom8++)
      if (mol.getAtomicNo_0(atom8) >= 129 && mol.getAtomicNo_0(atom8) <= 144 || mol.getAtomicNo_0(atom8) == 154)
        no++;
    if (no != 0) {
      count = 0;
      for (atom1 = 0; atom1 < mol.getAllAtoms_0(); atom1++) {
        atomicNo = mol.getAtomicNo_0(atom1);
        if (atomicNo >= 129 && atomicNo <= 144 || atomicNo == 154) {
          if (count == 0) {
            this.mBuilder.append_9("M  RGP");
            this.appendThreeDigitInt($wnd.Math.min(8, no));
          }
          this.mBuilder.append_9(" ");
          this.appendThreeDigitInt(atom1 + 1);
          this.mBuilder.append_9(" ");
          this.appendThreeDigitInt(atomicNo == 154 ? 0 : atomicNo >= 142 ? atomicNo - 141 : atomicNo - 125);
          no--;
          if (++count == 8 || no == 0) {
            count = 0;
            this.mBuilder.append_9(nl);
          }
        }
      }
    }
    if (mol.isFragment_0()) {
      no = 0;
      for (atom1 = 0; atom1 < mol.getAllAtoms_0(); atom1++)
        if (neq(and_0(mol.getAtomQueryFeatures(atom1), 120), 0))
          no++;
      if (no != 0) {
        count = 0;
        for (atom2 = 0; atom2 < mol.getAllAtoms_0(); atom2++) {
          ringFeatures = and_0(mol.getAtomQueryFeatures(atom2), 120);
          if (neq(ringFeatures, 0)) {
            if (count == 0) {
              this.mBuilder.append_9("M  RBC");
              this.appendThreeDigitInt($wnd.Math.min(8, no));
            }
            this.mBuilder.append_9(" ");
            this.appendThreeDigitInt(atom2 + 1);
            if (eq(ringFeatures, or_0(or_0(16, 32), 64)))
              this.mBuilder.append_9("  -1");
            else if (eq(ringFeatures, 8))
              this.mBuilder.append_9("   1");
            else if (eq(ringFeatures, or_0(or_0(8, 32), 64)))
              this.mBuilder.append_9("   2");
            else if (eq(ringFeatures, or_0(or_0(8, 16), 64)))
              this.mBuilder.append_9("   3");
            else if (eq(ringFeatures, or_0(or_0(8, 16), 32)))
              this.mBuilder.append_9("   4");
            no--;
            if (++count == 8 || no == 0) {
              count = 0;
              this.mBuilder.append_9(nl);
            }
          }
        }
      }
      for (atom9 = 0; atom9 < mol.getAllAtoms_0(); atom9++) {
        atomList = mol.getAtomList_0(atom9);
        if (jsNotEquals(atomList, null)) {
          this.mBuilder.append_9("M  ALS ");
          this.appendThreeDigitInt(atom9 + 1);
          this.appendThreeDigitInt(atomList.length);
          this.mBuilder.append_9(neq(and_0(mol.getAtomQueryFeatures(atom9), 1), 0) ? " T " : " F ");
          for (i = 0; i < atomList.length; i++) {
            label_0 = (carc2.$clinit_Molecule(), carc2.cAtomLabel)[atomList[i]];
            switch (jl.length__I__devirtual$_0(label_0)) {
              case 1:
                this.mBuilder.append_9(label_0 + "   ");
                break;
              case 2:
                this.mBuilder.append_9(label_0 + "  ");
                break;
              case 3:
                this.mBuilder.append_9(label_0 + " ");
                break;
              default:
                this.mBuilder.append_9("   ?");
                break;
            }
          }
          this.mBuilder.append_9(nl);
        }
      }
      no = 0;
      for (atom10 = 0; atom10 < mol.getAllAtoms_0(); atom10++)
        if (neq(and_0(mol.getAtomQueryFeatures(atom10), or_0(4096, 2048)), 0))
          no++;
      if (no != 0) {
        count = 0;
        for (atom2 = 0; atom2 < mol.getAllAtoms_0(); atom2++) {
          substitution = and_0(mol.getAtomQueryFeatures(atom2), or_0(4096, 2048));
          if (neq(substitution, 0)) {
            if (count == 0) {
              this.mBuilder.append_9("M  SUB");
              this.appendThreeDigitInt($wnd.Math.min(8, no));
            }
            this.mBuilder.append_9(" ");
            this.appendThreeDigitInt(atom2 + 1);
            if (neq(and_0(substitution, 4096), 0))
              this.mBuilder.append_9("   " + (mol.getAllConnAtoms_0(atom2) + 1));
            else
              this.mBuilder.append_9("  -2");
            no--;
            if (++count == 8 || no == 0) {
              count = 0;
              this.mBuilder.append_9(nl);
            }
          }
        }
      }
    }
    no = 0;
    for (atom11 = 0; atom11 < mol.getAllAtoms_0(); atom11++)
      if (jsNotEquals(mol.getAtomCustomLabel_0(atom11), null))
        no++;
    if (no != 0) {
      sgroupNo = 0;
      for (atom = 0; atom < mol.getAllAtoms_0(); atom++) {
        label_0 = mol.getAtomCustomLabel_0(atom);
        if (jsNotEquals(label_0, null)) {
          sgroupNo++;
          this.mBuilder.append_9("M  STY  1 ");
          this.appendThreeDigitInt(sgroupNo);
          this.mBuilder.append_9(" DAT");
          this.mBuilder.append_9(nl);
          this.mBuilder.append_9("M  SLB  1 ");
          this.appendThreeDigitInt(sgroupNo);
          this.mBuilder.append_9(" ");
          this.appendThreeDigitInt(sgroupNo);
          this.mBuilder.append_9(nl);
          this.mBuilder.append_9("M  SAL ");
          this.appendThreeDigitInt(sgroupNo);
          this.mBuilder.append_9("  1 ");
          this.appendThreeDigitInt(atom + 1);
          this.mBuilder.append_9(nl);
          this.mBuilder.append_9("M  SDT ");
          this.appendThreeDigitInt(sgroupNo);
          this.mBuilder.append_9(" ");
          this.mBuilder.append_9("NOSEARCH_OCL_CUSTOM_LABEL");
          this.mBuilder.append_9(nl);
          this.mBuilder.append_9("M  SDD ");
          this.appendThreeDigitInt(sgroupNo);
          this.mBuilder.append_9(" ");
          this.appendTenDigitDouble(mol.getAtomX_0(atom));
          this.appendTenDigitDouble(mol.getAtomY_0(atom));
          this.mBuilder.append_9("    DA    ALL  1       5");
          this.mBuilder.append_9(nl);
          this.mBuilder.append_9("M  SED ");
          this.appendThreeDigitInt(sgroupNo);
          this.mBuilder.append_9(" ");
          this.mBuilder.append_9(label_0);
          this.mBuilder.append_9(nl);
        }
      }
    }
    this.mBuilder.append_9("M  END" + nl);
  };
  carc2.MolfileCreator_2 = function MolfileCreator_2(mol, allowScaling, builder) {
    carc2.MolfileCreator_1.call(this, mol, allowScaling, 0, builder);
  };
  defineClass(128, 1, { 1: 1 }, carc2.MolfileCreator, carc2.MolfileCreator_1);
  _.$init_37 = function $init_37() {
  };
  _.appendTenDigitDouble = function appendTenDigitDouble(theDouble) {
    var i, val;
    val = this.mDoubleFormat.format(theDouble);
    for (i = jl.length__I__devirtual$_0(val); i < 10; i++)
      this.mBuilder.append_4(32);
    this.mBuilder.append_9(val);
  };
  _.appendThreeDigitInt = function appendThreeDigitInt(data_0) {
    var digitFound, i, theChar;
    if (data_0 < 0 || data_0 > 999) {
      this.mBuilder.append_9("  ?");
      return;
    }
    digitFound = false;
    for (i = 0; i < 3; i++) {
      theChar = narrow_int(data_0 / 100);
      if (theChar == 0) {
        if (i == 2 || digitFound)
          this.mBuilder.append_4(48);
        else
          this.mBuilder.append_4(32);
      } else {
        this.mBuilder.append_4(narrow_char(48 + theChar));
        digitFound = true;
      }
      data_0 = 10 * (data_0 % 100);
    }
  };
  _.getMolfile = function getMolfile() {
    return this.mBuilder.toString_0();
  };
  _.writeMolfile = function writeMolfile(theWriter) {
    theWriter.write_3(this.mBuilder.toString_0());
  };
  carc2.TARGET_AVBL = 1.5;
  cggl.Lcom_actelion_research_chem_MolfileCreator_2_classLit = createForClass("com.actelion.research.chem", "MolfileCreator", 128, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_MolfileParser = function $clinit_MolfileParser() {
    carc2.$clinit_MolfileParser = emptyMethod;
    jl.$clinit_Object();
    carc2.ALLOWED_ATOM_LABELS = 1 | 2 | 64;
  };
  carc2.MolfileParser = function MolfileParser() {
    carc2.$clinit_MolfileParser();
    Object_0.call(this);
    this.$init_38();
    this.mMode = 0;
  };
  carc2.MolfileParser_0 = function MolfileParser_0(mode) {
    carc2.$clinit_MolfileParser();
    Object_0.call(this);
    this.$init_38();
    this.mMode = mode;
  };
  defineClass(149, 1, { 1: 1 }, carc2.MolfileParser, carc2.MolfileParser_0);
  _.$init_38 = function $init_38() {
  };
  _.TRACE = function TRACE(s) {
    if (carc2.debug) {
      (jl.$clinit_System(), jl.out_0).println_0(s);
    }
  };
  _.buildBond = function buildBond(atom1, atom2, bondType, stereo, topology) {
    var bond, isAtomESRAnd, queryFeatures, realBondType;
    realBondType = 1;
    isAtomESRAnd = false;
    switch (stereo) {
      case 1:
        realBondType = 257;
        break;
      case 3:
        realBondType = 386;
        break;
      case 4:
        realBondType = 257;
        isAtomESRAnd = true;
        break;
      case 6:
        realBondType = 129;
        break;
      default:
        switch (bondType) {
          case 1:
            realBondType = 1;
            break;
          case 2:
            realBondType = 2;
            break;
          case 3:
            realBondType = 4;
            break;
          case 4:
            realBondType = 8;
            break;
          case 9:
            realBondType = 16;
            break;
        }
        break;
    }
    bond = this.mMol.addBond_1(atom1, atom2, realBondType);
    queryFeatures = 0;
    if (isAtomESRAnd) {
      this.mMol.setAtomESR_0(atom1, 1, -1);
    }
    if (bondType > 4) {
      switch (bondType) {
        case 5:
          queryFeatures |= 1 | 2;
          break;
        case 6:
          queryFeatures |= 1 | 8;
          break;
        case 7:
          queryFeatures |= 2 | 8;
          break;
        case 8:
          if (realBondType != 16)
            queryFeatures |= 127;
          break;
      }
    }
    if (topology == 1) {
      queryFeatures |= 256;
    }
    if (topology == 2) {
      queryFeatures |= 128;
    }
    if (queryFeatures != 0) {
      this.mMol.setBondQueryFeature_0(bond, queryFeatures, true);
    }
    return bond;
  };
  _.deduceMissingCharges = function deduceMissingCharges() {
    var atom, atom0, atom1, bond, charge, chargeChange, chargeToDistribute, dif, i, maxCharge, metal;
    chargeChange = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    for (atom0 = 0; atom0 < this.mMol.getAllAtoms_0(); atom0++)
      chargeChange[atom0] = -this.mMol.getAtomCharge_0(atom0);
    new carc2.AromaticityResolver(this.mMol).locateDelocalizedDoubleBonds_0(null, true, false);
    for (atom1 = 0; atom1 < this.mMol.getAllAtoms_0(); atom1++)
      chargeChange[atom1] += this.mMol.getAtomCharge_0(atom1);
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      if (chargeChange[atom] != 0) {
        chargeToDistribute = -chargeChange[atom];
        for (bond = 0; bond < this.mMol.getAllBonds_0(); bond++) {
          for (i = 0; i < 2; i++) {
            if (chargeToDistribute > 0 && this.mMol.getBondType_0(bond) == 16 && this.mMol.getBondAtom_0(1 - i, bond) == atom) {
              metal = this.mMol.getBondAtom_0(i, bond);
              if (this.mMol.isMetalAtom_0(metal)) {
                maxCharge = this.getMaxOxidationState(metal);
                charge = this.mMol.getAtomCharge_0(metal);
                if (charge < maxCharge) {
                  dif = $wnd.Math.min(chargeToDistribute, maxCharge - charge);
                  this.mMol.setAtomCharge_0(metal, charge + dif);
                  chargeToDistribute -= dif;
                }
              }
            }
          }
        }
      }
    }
  };
  _.endOfItem = function endOfItem(line, start_0) {
    var end;
    end = this.indexOfWhiteSpace(line, start_0);
    return end == -1 ? jl.length__I__devirtual$_0(line) : end;
  };
  _.getCompactMolecule = function getCompactMolecule_4(molFile) {
    this.mMol = null;
    return this.readMoleculeFromBuffer(new ji.BufferedReader(new ji.StringReader(molFile))) ? this.mMol : null;
  };
  _.getHandleHydrogenMap_0 = function getHandleHydrogenMap_0() {
    return jsEquals(this.mHydrogenMap, null) ? this.mMol.getHandleHydrogenMap_0() : this.mHydrogenMap;
  };
  _.getMaxOxidationState = function getMaxOxidationState(metal) {
    var atomicNo, os;
    atomicNo = this.mMol.getAtomicNo_0(metal);
    os = atomicNo < (carc2.$clinit_Molecule(), carc2.cCommonOxidationState).length ? (carc2.$clinit_Molecule(), carc2.cCommonOxidationState)[atomicNo] : null;
    return jsEquals(os, null) ? 0 : os[os.length - 1];
  };
  _.getUsedAtomIndex = function getUsedAtomIndex(sourceAtomIndex) {
    var ui;
    ui = isNull(this.mAtomIndexMap) ? null : castTo(this.mAtomIndexMap.get(jl.valueOf_12(sourceAtomIndex)), 35);
    return isNull(ui) ? sourceAtomIndex - 1 : ui.intValue();
  };
  _.getUsedBondIndex = function getUsedBondIndex(sourceBondIndex) {
    var ui;
    ui = isNull(this.mBondIndexMap) ? null : castTo(this.mBondIndexMap.get(jl.valueOf_12(sourceBondIndex)), 35);
    return isNull(ui) ? sourceBondIndex - 1 : ui.intValue();
  };
  _.handleValences = function handleValences(valence) {
    var atom, chargeCorrection;
    if (jsNotEquals(valence, null)) {
      this.mMol.ensureHelperArrays_0(1);
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        if (valence[atom] != 0) {
          chargeCorrection = this.mMol.getElectronValenceCorrection_0(atom, this.mMol.getOccupiedValence_0(atom));
          if (valence[atom] == 15) {
            if (chargeCorrection >= 0)
              this.mMol.setAtomAbnormalValence_0(atom, 0);
          } else {
            if (valence[atom] != this.mMol.getMaxValence_0(atom))
              this.mMol.setAtomAbnormalValence_0(atom, valence[atom] - chargeCorrection);
          }
        }
      }
    }
  };
  _.indexOfEqualSign = function indexOfEqualSign(line, fromIndex) {
    var i, theChar;
    for (i = fromIndex; i < jl.length__I__devirtual$_0(line); i++) {
      theChar = jl.charAt_I_C__devirtual$_0(line, i);
      if (theChar == 32 || theChar == 9)
        return -1;
      if (theChar == 61)
        return i;
    }
    return -1;
  };
  _.indexOfNextItem = function indexOfNextItem(line, afterPreviousItem) {
    var i;
    if (afterPreviousItem == -1) {
      return -1;
    }
    for (i = afterPreviousItem + 1; i < jl.length__I__devirtual$_0(line); i++) {
      if (jl.charAt_I_C__devirtual$_0(line, i) != 32 && jl.charAt_I_C__devirtual$_0(line, i) != 9) {
        return i;
      }
    }
    return -1;
  };
  _.indexOfWhiteSpace = function indexOfWhiteSpace(line, fromIndex) {
    var braceOpen, i, quotesOpen, theChar;
    braceOpen = false;
    quotesOpen = false;
    for (i = fromIndex; i < jl.length__I__devirtual$_0(line); i++) {
      theChar = jl.charAt_I_C__devirtual$_0(line, i);
      if (theChar == 40)
        braceOpen = true;
      else if (theChar == 41)
        braceOpen = false;
      else if (theChar == 34)
        quotesOpen = !quotesOpen;
      if (!braceOpen && !quotesOpen && (theChar == 32 || theChar == 9)) {
        return i;
      }
    }
    return -1;
  };
  _.interpretObjectType = function interpretObjectType(line) {
    if (jl.contains_Ljava_lang_CharSequence__Z__devirtual$(line, "ATOMS=("))
      return "ATOMS";
    if (jl.contains_Ljava_lang_CharSequence__Z__devirtual$(line, "BONDS=("))
      return "BONDS";
    this.TRACE("Error [readMoleculeFromBuffer]: Unknown or missing collection object type\n");
    return null;
  };
  _.interpretV3AtomLine = function interpretV3AtomLine(line) {
    var atom, atomIndex, bNotList, bond, field, index_0, index1, index2, l, label_0, list, mapNo, specifier, substitutionCount, v, value_0, x_0, y_0, z_0;
    index1 = 0;
    index2 = this.endOfItem(line, index1);
    atomIndex = jl.parseInt_2(jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2));
    index1 = this.indexOfNextItem(line, index2);
    index2 = this.endOfItem(line, index1);
    label_0 = jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2);
    v = null;
    bNotList = false;
    l = this.isV3AtomList(line);
    if (l != 0) {
      v = this.interpretV3AtomList(line);
      if (l < 0)
        bNotList = true;
      index2 = $wnd.Math.abs(l);
    }
    index1 = this.indexOfNextItem(line, index2);
    index2 = this.endOfItem(line, index1);
    x_0 = parseFloat_0(jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2));
    index1 = this.indexOfNextItem(line, index2);
    index2 = this.endOfItem(line, index1);
    y_0 = parseFloat_0(jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2));
    index1 = this.indexOfNextItem(line, index2);
    index2 = this.endOfItem(line, index1);
    z_0 = parseFloat_0(jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2));
    index1 = this.indexOfNextItem(line, index2);
    index2 = this.endOfItem(line, index1);
    mapNo = jl.parseInt_2(jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2));
    atom = this.mMol.addAtom_1(x_0, -y_0, -z_0);
    if (atom + 1 != atomIndex)
      this.mapAtomIndex(atomIndex, atom);
    if (jsNotEquals(v, null)) {
      this.mMol.setAtomicNo_0(atom, 6);
      this.mMol.setAtomList_1(atom, v, bNotList);
    }
    if (mapNo != 0) {
      this.mMol.setAtomMapNo_0(atom, mapNo, false);
    }
    if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(label_0, "A") || jl.equals_Ljava_lang_Object__Z__devirtual$_2(label_0, "*")) {
      this.mMol.setAtomQueryFeature_0(atom, 1, true);
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(label_0, "Q")) {
      list = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 1, 15, 1);
      list[0] = 6;
      this.mMol.setAtomList_1(atom, list, true);
    } else {
      this.mMol.setAtomicNo_0(atom, carc2.getAtomicNoFromLabel_0(label_0, 67));
    }
    while ((index1 = this.indexOfNextItem(line, index2)) != -1) {
      index2 = this.endOfItem(line, index1);
      specifier = jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2);
      index_0 = jl.indexOf_I_I__devirtual$(specifier, 61);
      field = jl.substring_II_Ljava_lang_String___devirtual$(specifier, 0, index_0);
      value_0 = jl.parseInt_2(jl.substring_I_Ljava_lang_String___devirtual$(specifier, index_0 + 1));
      if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(field, "CHG")) {
        this.mMol.setAtomCharge_0(atom, value_0);
      } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(field, "RAD")) {
        switch (value_0) {
          case 1:
            this.mMol.setAtomRadical_0(atom, 16);
            break;
          case 2:
            this.mMol.setAtomRadical_0(atom, 32);
            break;
          case 3:
            this.mMol.setAtomRadical_0(atom, 48);
            break;
        }
      } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(field, "CFG")) {
      } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(field, "MASS")) {
        this.mMol.setAtomMass_0(atom, value_0);
      } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(field, "VAL")) {
        this.mMol.setAtomAbnormalValence_0(atom, value_0 == -1 ? 0 : value_0 == 0 ? -1 : value_0);
      } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(field, "HCOUNT")) {
        switch (value_0) {
          case 0:
            break;
          case -1:
            this.mMol.setAtomQueryFeature_0(atom, or_0(or_0(256, 512), 1024), true);
            break;
          case 1:
            this.mMol.setAtomQueryFeature_0(atom, 128, true);
            break;
          case 2:
            this.mMol.setAtomQueryFeature_0(atom, or_0(128, 256), true);
            break;
          default:
            this.mMol.setAtomQueryFeature_0(atom, or_0(or_0(128, 256), 512), true);
            break;
        }
      } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(field, "SUBST")) {
        if (value_0 == -1) {
          this.mMol.setAtomQueryFeature_0(atom, 2048, true);
        } else if (value_0 > 0) {
          substitutionCount = 0;
          for (bond = 0; bond < this.mMol.getAllBonds_0(); bond++) {
            if (this.mMol.getBondAtom_0(0, bond) == atom || this.mMol.getBondAtom_0(1, bond) == atom) {
              substitutionCount++;
            }
          }
          if (value_0 > substitutionCount) {
            this.mMol.setAtomQueryFeature_0(atom, 4096, true);
          }
        }
      } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(field, "RBCNT")) {
        switch (value_0) {
          case -1:
            this.mMol.setAtomQueryFeature_0(atom, or_0(or_0(16, 32), 64), true);
            break;
          case 1:
            this.mMol.setAtomQueryFeature_0(atom, 8, true);
            break;
          case 2:
            this.mMol.setAtomQueryFeature_0(atom, or_0(or_0(8, 32), 64), true);
            break;
          case 3:
            this.mMol.setAtomQueryFeature_0(atom, or_0(or_0(16, 32), 64), true);
            break;
          case 4:
            this.mMol.setAtomQueryFeature_0(atom, or_0(or_0(8, 16), 32), true);
            break;
        }
      } else {
        this.TRACE("Warning MolfileParser: Unused version 3 atom specifier:" + field + "\n");
      }
    }
  };
  _.interpretV3AtomList = function interpretV3AtomList(line) {
    var atoms, i1, i2, index_0, l, ok, res, s;
    res = null;
    i1 = jl.indexOf_Ljava_lang_String__I__devirtual$(line, "[");
    i2 = jl.indexOf_Ljava_lang_String_I_I__devirtual$(line, "]", i1);
    if (i1 >= 0 && i2 > 0) {
      atoms = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 16, 15, 1);
      s = jl.substring_II_Ljava_lang_String___devirtual$(line, i1 + 1, i2);
      index_0 = 0;
      ok = true;
      while (ok && index_0 < 16) {
        i1 = jl.indexOf_Ljava_lang_String__I__devirtual$(s, ",");
        l = null;
        if (i1 == -1) {
          l = s;
          ok = false;
        } else {
          l = jl.substring_II_Ljava_lang_String___devirtual$(s, 0, i1);
          s = jl.substring_I_Ljava_lang_String___devirtual$(s, i1 + 1);
        }
        atoms[index_0++] = carc2.getAtomicNoFromLabel_0(l, 1);
      }
      res = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, index_0, 15, 1);
      jl.arraycopy(atoms, 0, res, 0, index_0);
    }
    return res;
  };
  _.interpretV3BondLine = function interpretV3BondLine(line) {
    var atom1, atom2, bond, bondIndex, bondType, field, index_0, index1, index2, specifier, stereo, topology, value_0;
    index1 = 0;
    index2 = this.endOfItem(line, index1);
    bondIndex = jl.parseInt_2(jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2));
    index1 = this.indexOfNextItem(line, index2);
    index2 = this.endOfItem(line, index1);
    bondType = jl.parseInt_2(jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2));
    index1 = this.indexOfNextItem(line, index2);
    index2 = this.endOfItem(line, index1);
    atom1 = this.getUsedAtomIndex(jl.parseInt_2(jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2)));
    index1 = this.indexOfNextItem(line, index2);
    index2 = this.endOfItem(line, index1);
    atom2 = this.getUsedAtomIndex(jl.parseInt_2(jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2)));
    stereo = 0;
    topology = 0;
    while ((index1 = this.indexOfNextItem(line, index2)) != -1) {
      index2 = this.endOfItem(line, index1);
      specifier = jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2);
      index_0 = jl.indexOf_I_I__devirtual$(specifier, 61);
      field = jl.substring_II_Ljava_lang_String___devirtual$(specifier, 0, index_0);
      value_0 = jl.parseInt_2(jl.substring_I_Ljava_lang_String___devirtual$(specifier, index_0 + 1));
      if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(field, "CFG")) {
        switch (value_0) {
          case 1:
            stereo = 1;
            break;
          case 2:
            stereo = bondType == 2 ? 3 : 4;
            break;
          case 3:
            stereo = 6;
            break;
        }
      } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(field, "TOPO")) {
        topology = value_0;
      } else {
        this.TRACE("Warning MolfileParser: Unused version 3 bond specifier:" + field + "\n");
      }
    }
    bond = this.buildBond(atom1, atom2, bondType, stereo, topology);
    if (bond + 1 != bondIndex)
      this.mapBondIndex(bondIndex, bond);
  };
  _.interpretV3CollectionLine = function interpretV3CollectionLine(line) {
    var bond, group, i, i0, list, objectType;
    objectType = this.interpretObjectType(line);
    if (jsNotEquals(objectType, null)) {
      list = this.interpretV3List(line, objectType);
      if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "MDLV30/STEABS")) {
        if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(objectType, "ATOMS"))
          for (i0 = 0; i0 < list.length; i0++)
            this.mMol.setAtomESR_0(this.getUsedAtomIndex(list[i0]), 0, -1);
        else
          for (i = 0; i < list.length; i++)
            this.mMol.setBondESR_0(this.getUsedBondIndex(list[i]), 0, -1);
      } else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "MDLV30/STERAC")) {
        group = jl.parseInt_2(jl.substring_II_Ljava_lang_String___devirtual$(line, 13, this.indexOfWhiteSpace(line, 13)));
        if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(objectType, "ATOMS"))
          for (i0 = 0; i0 < list.length; i0++)
            this.mMol.setAtomESR_0(this.getUsedAtomIndex(list[i0]), 1, group - 1);
        else
          for (i = 0; i < list.length; i++)
            this.mMol.setBondESR_0(this.getUsedBondIndex(list[i]), 1, group - 1);
      } else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "MDLV30/STEREL")) {
        group = jl.parseInt_2(jl.substring_II_Ljava_lang_String___devirtual$(line, 13, this.indexOfWhiteSpace(line, 13)));
        if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(objectType, "ATOMS"))
          for (i0 = 0; i0 < list.length; i0++)
            this.mMol.setAtomESR_0(this.getUsedAtomIndex(list[i0]), 2, group - 1);
        else
          for (i = 0; i < list.length; i++)
            this.mMol.setBondESR_0(this.getUsedBondIndex(list[i]), 2, group - 1);
      } else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "MDLV30/HILITE")) {
        if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(objectType, "ATOMS")) {
          for (i = 0; i < list.length; i++)
            this.mMol.setAtomColor_0(this.getUsedAtomIndex(list[i]), 448);
        } else {
          for (i = 0; i < list.length; i++) {
            bond = this.getUsedBondIndex(list[i]);
            this.mMol.setAtomColor_0(this.mMol.getBondAtom_0(0, bond), 448);
            this.mMol.setAtomColor_0(this.mMol.getBondAtom_0(1, bond), 448);
          }
        }
      } else {
        this.TRACE("Error [readMoleculeFromBuffer]: Unknown version 3 collection type\n");
      }
    }
  };
  _.interpretV3CountLine = function interpretV3CountLine(line) {
    var index1, index2, natoms, nbonds;
    if (isNull(this.mMol)) {
      if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "COUNTS")) {
        index1 = 7;
        index2 = this.indexOfNextItem(line, this.indexOfWhiteSpace(line, 7));
        natoms = jl.parseInt_2(jl.substring_II_Ljava_lang_String___devirtual$(line, index1, this.indexOfWhiteSpace(line, index1)));
        nbonds = jl.parseInt_2(jl.substring_II_Ljava_lang_String___devirtual$(line, index2, this.indexOfWhiteSpace(line, index2)));
        this.mMol = new carc2.StereoMolecule_0(natoms, nbonds);
      }
    }
  };
  _.interpretV3List = function interpretV3List(line, type_0) {
    var count, i, index_0, index1, index2, list;
    index1 = jl.indexOf_Ljava_lang_String__I__devirtual$(line, type_0 + "=(") + jl.length__I__devirtual$_0(type_0) + 2;
    index2 = jl.indexOf_II_I__devirtual$(line, 41, index1);
    index_0 = this.indexOfWhiteSpace(line, index1);
    count = jl.parseInt_2(jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index_0));
    list = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, count, 15, 1);
    for (i = 0; i < count; i++) {
      index1 = this.indexOfNextItem(line, index_0);
      index_0 = this.indexOfWhiteSpace(line, index1);
      if (index_0 == -1 || index_0 > index2) {
        index_0 = index2;
      }
      list[i] = jl.parseInt_2(jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index_0));
    }
    return list;
  };
  _.interpretV3SgroupLine = function interpretV3SgroupLine(line) {
    var atom, atoms, extIndex, fieldData, fieldName, index1, index2, map_0, sgroupIndex, type_0, value_0;
    index1 = 0;
    index2 = this.endOfItem(line, index1);
    value_0 = jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2);
    if (jl.equals_Ljava_lang_Object__Z__devirtual$_2("DEFAULT", value_0)) {
      index1 = this.indexOfNextItem(line, index2);
      index2 = this.endOfItem(line, index1);
      value_0 = jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2);
      if (jl.startsWith_Ljava_lang_String__Z__devirtual$(value_0, "CLASS")) {
        index1 = this.indexOfNextItem(line, index2);
        index2 = this.endOfItem(line, index1);
        value_0 = jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2);
        if (jl.equals_Ljava_lang_Object__Z__devirtual$_2("-", value_0)) {
          index1 = this.indexOfNextItem(line, index2);
          index2 = this.endOfItem(line, index1);
          value_0 = jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2);
        }
      }
    }
    sgroupIndex = jl.parseInt_2(value_0);
    index1 = this.indexOfNextItem(line, index2);
    index2 = this.endOfItem(line, index1);
    type_0 = jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2);
    if (!jl.equals_Ljava_lang_Object__Z__devirtual$_2("DAT", type_0))
      return;
    index1 = this.indexOfNextItem(line, index2);
    index2 = this.endOfItem(line, index1);
    extIndex = jl.parseInt_2(jl.substring_II_Ljava_lang_String___devirtual$(line, index1, index2));
    map_0 = new ju.TreeMap();
    index1 = this.indexOfNextItem(line, index2);
    while (index1 != -1)
      index1 = this.readKeyValuePair(map_0, line, index1);
    atoms = castToString(map_0.get("ATOMS"));
    fieldName = castToString(map_0.get("FIELDNAME"));
    fieldData = castToString(map_0.get("FIELDDATA"));
    if (!jl.equals_Ljava_lang_Object__Z__devirtual$_2("NOSEARCH_OCL_CUSTOM_LABEL", fieldName) || jsEquals(atoms, null) || jsEquals(fieldData, null))
      return;
    atom = jl.split_Ljava_lang_String___Ljava_lang_String___devirtual$(atoms, " ");
    if (atom.length != 2)
      return;
    this.mMol.setAtomCustomLabel_0(jl.parseInt_2(atom[1]) - 1, fieldData);
  };
  _.introduceObviousMetalBonds = function introduceObviousMetalBonds() {
    var atom, bond, bond0, bond1, i, i0, metalAtom, occupiedValence, order;
    occupiedValence = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    for (bond0 = 0; bond0 < this.mMol.getAllBonds_0(); bond0++)
      if (this.mMol.getBondType_0(bond0) == 8)
        for (i0 = 0; i0 < 2; i0++)
          occupiedValence[this.mMol.getBondAtom_0(i0, bond0)] = 1;
    for (bond1 = 0; bond1 < this.mMol.getAllBonds_0(); bond1++) {
      order = this.mMol.getBondOrder_0(bond1);
      for (i = 0; i < 2; i++)
        occupiedValence[this.mMol.getBondAtom_0(i, bond1)] += order;
    }
    for (bond = 0; bond < this.mMol.getAllBonds_0(); bond++) {
      if (this.mMol.getBondOrder_0(bond) == 1) {
        for (i = 0; i < 2; i++) {
          metalAtom = this.mMol.getBondAtom_0(1 - i, bond);
          if (this.mMol.isMetalAtom_0(metalAtom)) {
            atom = this.mMol.getBondAtom_0(i, bond);
            if (this.mMol.isElectronegative_0(atom) && occupiedValence[atom] > this.mMol.getMaxValence_0(atom)) {
              this.mMol.setBondType_0(bond, 16);
              continue;
            }
          }
        }
      }
    }
  };
  _.isV3AtomList = function isV3AtomList(line) {
    var i1, i2;
    if (jl.indexOf_Ljava_lang_String__I__devirtual$(line, "[") >= 0) {
      i1 = jl.indexOf_Ljava_lang_String__I__devirtual$(line, " NOT[");
      i2 = jl.indexOf_Ljava_lang_String_I_I__devirtual$(line, "]", i1);
      if (i1 >= 0 && i2 > 0) {
        return -(i2 + 1);
      } else {
        i1 = jl.indexOf_Ljava_lang_String__I__devirtual$(line, " [");
        i2 = jl.indexOf_Ljava_lang_String_I_I__devirtual$(line, "]", i1);
        if (i1 >= 0 && i2 > 0) {
          return i2 + 1;
        }
      }
      i1 = jl.indexOf_Ljava_lang_String__I__devirtual$(line, " 'NOT[");
      i2 = jl.indexOf_Ljava_lang_String_I_I__devirtual$(line, "]'", i1);
      if (i1 >= 0 && i2 > 0) {
        return -(i2 + 2);
      } else {
        i1 = jl.indexOf_Ljava_lang_String__I__devirtual$(line, " '[");
        i2 = jl.indexOf_Ljava_lang_String_I_I__devirtual$(line, "]'", i1);
        if (i1 >= 0 && i2 > 0) {
          return i2 + 2;
        }
      }
      (jl.$clinit_System(), jl.err).println_0("Warning invalid atom list in line: " + line);
    }
    return 0;
  };
  _.mapAtomIndex = function mapAtomIndex(sourceAtomIndex, usedAtomIndex) {
    if (isNull(this.mAtomIndexMap))
      this.mAtomIndexMap = new ju.TreeMap();
    this.mAtomIndexMap.put(jl.valueOf_12(sourceAtomIndex), jl.valueOf_12(usedAtomIndex));
  };
  _.mapBondIndex = function mapBondIndex(sourceBondIndex, usedBondIndex) {
    if (isNull(this.mBondIndexMap))
      this.mBondIndexMap = new ju.TreeMap();
    this.mBondIndexMap.put(jl.valueOf_12(sourceBondIndex), jl.valueOf_12(usedBondIndex));
  };
  _.parse_3 = function parse_3(m, rd) {
    this.mMol = m;
    return this.readMoleculeFromBuffer(rd);
  };
  _.parse_4 = function parse_4(mol, molFile) {
    return this.parse_3(mol, new ji.BufferedReader(new ji.StringReader(molFile)));
  };
  _.parse_5 = function parse_5(mol, molFile) {
    return this.parse_4(mol, molFile.toString_0());
  };
  _.parseIntOrSpaces = function parseIntOrSpaces(s) {
    return jl.isEmpty__Z__devirtual$(s) ? 0 : jl.parseInt_2(s);
  };
  _.readKeyValuePair = function readKeyValuePair(map_0, line, start_0) {
    var end, equalIndex, key, val;
    equalIndex = this.indexOfEqualSign(line, start_0);
    if (equalIndex == -1)
      return -1;
    end = this.endOfItem(line, equalIndex + 1);
    key = jl.substring_II_Ljava_lang_String___devirtual$(line, start_0, equalIndex);
    val = jl.substring_II_Ljava_lang_String___devirtual$(line, equalIndex + 1, end);
    if (jl.startsWith_Ljava_lang_String__Z__devirtual$(val, "(") && jl.endsWith_Ljava_lang_String__Z__devirtual$(val, ")") || jl.startsWith_Ljava_lang_String__Z__devirtual$(val, '"') && jl.endsWith_Ljava_lang_String__Z__devirtual$(val, '"'))
      val = jl.substring_II_Ljava_lang_String___devirtual$(val, 1, jl.length__I__devirtual$_0(val) - 1);
    map_0.put(key, val);
    return this.indexOfNextItem(line, end);
  };
  _.readMoleculeFromBuffer = function readMoleculeFromBuffer(reader) {
    var aaa, atom, atom1, atom2, atomicNo, bNotList, bond, bondType, charge, chargeDif, cl, cl$iterator, customLabelMap, e, hCount, i, i0, i1, j, k, label_0, line, list, mapNo, mass, massDif, name_0, natoms, nbonds, nlists, no, radical, res, ringState, rno, sgroupNo, stereo, substitution, substitutionCount, sym, topology, v, valence, vvv, x_0, y_0, z_0;
    valence = null;
    customLabelMap = null;
    try {
      this.mHydrogenMap = null;
      if (isNotNull(this.mMol)) {
        this.mMol.clear_0();
        this.mMol.setFragment_0(false);
      }
      name_0 = line = reader.readLine();
      if (jsEquals(null, name_0)) {
        this.TRACE("readMoleculeFromBuffer: No Header Line\n");
        return false;
      }
      if (jsEquals(null, line = reader.readLine())) {
        this.TRACE("Error [readMoleculeFromBuffer]: No Program Line\n");
        return false;
      }
      if (jsEquals(null, line = reader.readLine())) {
        this.TRACE("Error [readMoleculeFromBuffer]: No Comment Line\n");
        return false;
      }
      this.mTreatAnyAsMetalBond = jl.contains_Ljava_lang_CharSequence__Z__devirtual$(line, "From CSD data. Using bond type 'Any'");
      this.mDeduceMissingCharges = jl.contains_Ljava_lang_CharSequence__Z__devirtual$(line, "From CSD data.");
      if (jsEquals(null, line = reader.readLine())) {
        this.TRACE("Error [readMoleculeFromBuffer]: No Counts Line\n");
        return false;
      }
      this.mIsV3000 = false;
      this.mChiralFlag = this.mAssumeChiralTrue;
      try {
        natoms = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 0, 3)));
        nbonds = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 3, 6)));
        nlists = this.parseIntOrSpaces(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 6, 9)));
        this.mChiralFlag = this.mChiralFlag | 1 == this.parseIntOrSpaces(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 12, 15)));
        this.mIsV3000 = jl.length__I__devirtual$_0(line) >= 39 && jl.startsWith_Ljava_lang_String_I_Z__devirtual$(line, "V3000", 34);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          this.TRACE("Warning [readMoleculeFromBuffer]: Unable to interpret counts line\n");
          return false;
        } else
          throw toJs($e0);
      }
      if (this.mIsV3000) {
        res = this.readMoleculeV3FromBuffer(reader);
        this.mMol.setName_0(name_0);
        return res;
      }
      if (isNull(this.mMol)) {
        this.mMol = new carc2.StereoMolecule_0(natoms, nbonds);
      }
      this.mMol.setName_0(name_0);
      if (!this.mChiralFlag) {
        this.mMol.setToRacemate_0();
      }
      if (0 == natoms) {
        while (jsNotEquals(line, null) && !(jl.equals_Ljava_lang_Object__Z__devirtual$_2(line, "M  END") || jl.equals_Ljava_lang_Object__Z__devirtual$_2(line, "$$$$") || jl.equals_Ljava_lang_Object__Z__devirtual$_2(jl.substring_I_Ljava_lang_String___devirtual$(line, 1), "$"))) {
          line = reader.readLine();
        }
        return true;
      }
      for (i0 = 0; i0 < natoms; i0++) {
        if (jsEquals(null, line = reader.readLine())) {
          this.TRACE("Error [readMoleculeFromBuffer]: No Atom Line\n");
          return false;
        }
        x_0 = parseFloat_0(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 0, 10)));
        y_0 = parseFloat_0(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 10, 20)));
        z_0 = parseFloat_0(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 20, 30)));
        atom = this.mMol.addAtom_1(x_0, -y_0, -z_0);
        label_0 = jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 31, 34));
        if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(label_0, "A") || jl.equals_Ljava_lang_Object__Z__devirtual$_2(label_0, "*")) {
          this.mMol.setAtomQueryFeature_0(atom, 1, true);
        } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(label_0, "Q")) {
          list = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 1, 15, 1);
          list[0] = 6;
          this.mMol.setAtomList_1(atom, list, true);
        } else {
          atomicNo = carc2.getAtomicNoFromLabel_0(label_0, 67);
          this.mMol.setAtomicNo_0(atom, atomicNo);
        }
        massDif = this.parseIntOrSpaces(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 34, 36)));
        if (massDif != 0) {
          this.mMol.setAtomMass_0(atom, (carc2.$clinit_Molecule(), carc2.cRoundedMass)[this.mMol.getAtomicNo_0(atom)] + massDif);
        }
        chargeDif = this.parseIntOrSpaces(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 36, 39)));
        if (chargeDif != 0) {
          if (chargeDif == 4)
            this.mMol.setAtomRadical_0(atom, 32);
          else
            this.mMol.setAtomCharge_0(atom, 4 - chargeDif);
        }
        mapNo = jl.length__I__devirtual$_0(line) < 63 ? 0 : this.parseIntOrSpaces(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 60, 63)));
        this.mMol.setAtomMapNo_0(atom, mapNo, false);
        hCount = jl.length__I__devirtual$_0(line) < 45 ? 0 : this.parseIntOrSpaces(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 42, 45)));
        switch (hCount) {
          case 0:
            break;
          case 1:
            this.mMol.setAtomQueryFeature_0(atom, or_0(256, 512), true);
            break;
          case 2:
            this.mMol.setAtomQueryFeature_0(atom, 128, true);
            break;
          case 3:
            this.mMol.setAtomQueryFeature_0(atom, or_0(128, 256), true);
            break;
          default:
            this.mMol.setAtomQueryFeature_0(atom, or_0(or_0(128, 256), 512), true);
            break;
        }
        if (jl.length__I__devirtual$_0(line) >= 48 && jl.charAt_I_C__devirtual$_0(line, 47) == 49) {
          this.mMol.setAtomQueryFeature_0(atom, 8192, true);
        }
        v = jl.length__I__devirtual$_0(line) < 51 ? 0 : this.parseIntOrSpaces(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 48, 51)));
        if (v != 0) {
          if (jsEquals(valence, null))
            valence = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, natoms, 15, 1);
          valence[atom] = v;
        }
      }
      for (i1 = 0; i1 < nbonds; i1++) {
        if (jsEquals(null, line = reader.readLine())) {
          this.TRACE("Error [readMoleculeFromBuffer]:No Bond Line\n");
          return false;
        }
        atom1 = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 0, 3))) - 1;
        atom2 = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 3, 6))) - 1;
        bondType = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 6, 9)));
        stereo = jl.length__I__devirtual$_0(line) < 12 ? 0 : this.parseIntOrSpaces(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 9, 12)));
        topology = jl.length__I__devirtual$_0(line) < 18 ? 0 : this.parseIntOrSpaces(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 15, 18)));
        if (bondType == 8 && (this.mTreatAnyAsMetalBond || this.mMol.isMetalAtom_0(atom1) || this.mMol.isMetalAtom_0(atom2)))
          bondType = 9;
        this.buildBond(atom1, atom2, bondType, stereo, topology);
      }
      for (i = 0; i < nlists; i++) {
        if (jsEquals(null, line = reader.readLine())) {
          this.TRACE("Error [readMoleculeFromBuffer]: No List Line\n");
          return false;
        }
      }
      if (jsEquals(null, line = reader.readLine())) {
        this.TRACE("Error ReadMoleculeFromBuffer Missing M END or $$$$\n");
        if ((this.mMode & 1) != 0)
          this.mHydrogenMap = this.mMol.getHandleHydrogenMap_0();
        this.handleValences(valence);
        if (!this.mChiralFlag)
          this.mMol.ensureHelperArrays_0(15);
        return true;
      }
      while (jsNotEquals(line, null) && !(jl.equals_Ljava_lang_Object__Z__devirtual$_2(line, "M  END") || jl.equals_Ljava_lang_Object__Z__devirtual$_2(line, "$$$$"))) {
        if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  CHG")) {
          j = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 6, 9)));
          if (j > 0) {
            aaa = 10;
            vvv = 14;
            for (k = 1; k <= j; k++, aaa += 8, vvv += 8) {
              atom = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, aaa, aaa + 3))) - 1;
              charge = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, vvv, vvv + 3)));
              this.mMol.setAtomCharge_0(atom, charge);
            }
          }
        }
        if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  ISO")) {
          j = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 6, 9)));
          if (j > 0) {
            aaa = 10;
            vvv = 14;
            for (k = 1; k <= j; k++, aaa += 8, vvv += 8) {
              atom = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, aaa, aaa + 3))) - 1;
              mass = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, vvv, vvv + 3)));
              this.mMol.setAtomMass_0(atom, mass);
            }
          }
        }
        if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  RAD")) {
          j = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 6, 9)));
          if (j > 0) {
            aaa = 10;
            vvv = 14;
            for (k = 1; k <= j; k++, aaa += 8, vvv += 8) {
              atom = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, aaa, aaa + 3))) - 1;
              radical = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, vvv, vvv + 3)));
              switch (radical) {
                case 1:
                  this.mMol.setAtomRadical_0(atom, 16);
                  break;
                case 2:
                  this.mMol.setAtomRadical_0(atom, 32);
                  break;
                case 3:
                  this.mMol.setAtomRadical_0(atom, 48);
                  break;
              }
            }
          }
        }
        if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  RBC") || jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  RBD")) {
          j = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 6, 9)));
          if (j > 0) {
            aaa = 10;
            vvv = 14;
            for (k = 1; k <= j; k++, aaa += 8, vvv += 8) {
              atom = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, aaa, aaa + 3))) - 1;
              ringState = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, vvv, vvv + 3)));
              switch (ringState) {
                case -1:
                  this.mMol.setAtomQueryFeature_0(atom, or_0(or_0(16, 32), 64), true);
                  break;
                case 1:
                  this.mMol.setAtomQueryFeature_0(atom, 8, true);
                  break;
                case 2:
                  this.mMol.setAtomQueryFeature_0(atom, or_0(or_0(8, 32), 64), true);
                  break;
                case 3:
                  this.mMol.setAtomQueryFeature_0(atom, or_0(or_0(16, 32), 64), true);
                  break;
                case 4:
                  this.mMol.setAtomQueryFeature_0(atom, or_0(or_0(8, 16), 32), true);
                  break;
              }
            }
          }
        }
        if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  ALS")) {
          atom = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 7, 10))) - 1;
          if (atom >= 0) {
            no = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 10, 13)));
            bNotList = jl.charAt_I_C__devirtual$_0(line, 14) == 84;
            v = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, no, 15, 1);
            aaa = 16;
            for (k = 0; k < no; k++, aaa += 4) {
              sym = jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, aaa, aaa + 4));
              v[k] = carc2.getAtomicNoFromLabel_0(sym, 1);
            }
            this.mMol.setAtomicNo_0(atom, 6);
            this.mMol.setAtomList_1(atom, v, bNotList);
          }
        }
        if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  SUB")) {
          j = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 6, 9)));
          if (j > 0) {
            aaa = 10;
            vvv = 14;
            for (k = 1; k <= j; k++, aaa += 8, vvv += 8) {
              atom = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, aaa, aaa + 3))) - 1;
              substitution = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, vvv, vvv + 3)));
              if (substitution == -2) {
                this.mMol.setAtomQueryFeature_0(atom, 2048, true);
              } else if (substitution > 0) {
                substitutionCount = 0;
                for (bond = 0; bond < this.mMol.getAllBonds_0(); bond++) {
                  if (this.mMol.getBondAtom_0(0, bond) == atom || this.mMol.getBondAtom_0(1, bond) == atom) {
                    substitutionCount++;
                  }
                }
                if (substitution > substitutionCount) {
                  this.mMol.setAtomQueryFeature_0(atom, 4096, true);
                }
              }
            }
          }
        }
        if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  RGP")) {
          j = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 6, 9)));
          if (j > 0) {
            aaa = 10;
            vvv = 14;
            for (k = 1; k <= j; k++, aaa += 8, vvv += 8) {
              atom = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, aaa, aaa + 3))) - 1;
              rno = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, vvv, vvv + 3)));
              if (rno >= 1 && rno <= 20) {
                this.mMol.setAtomicNo_0(atom, carc2.getAtomicNoFromLabel_0("R" + rno, 2));
              }
            }
          }
        }
        if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  SAL") && jl.length__I__devirtual$_0(line) >= 17 || jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  SDT") && jl.length__I__devirtual$_0(line) >= 12 || jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  SED") && jl.length__I__devirtual$_0(line) >= 12) {
          if (isNull(customLabelMap))
            customLabelMap = new ju.TreeMap();
          sgroupNo = jl.substring_II_Ljava_lang_String___devirtual$(line, 7, 10);
          cl = castTo(customLabelMap.get(sgroupNo), 182);
          if (isNull(cl)) {
            cl = new carc2.MolfileParser$CustomLabel();
            customLabelMap.put(sgroupNo, cl);
          }
          if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  SAL") && jl.startsWith_Ljava_lang_String_I_Z__devirtual$(line, "  1", 10))
            cl.atom = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 13, 17)));
          else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  SDT"))
            cl.isOCLCUstomLabel = jl.startsWith_Ljava_lang_String__Z__devirtual$(jl.substring_I_Ljava_lang_String___devirtual$(line, 11), "NOSEARCH_OCL_CUSTOM_LABEL");
          else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  SED"))
            cl.label_0 = jl.trim__Ljava_lang_String___devirtual$(jl.substring_I_Ljava_lang_String___devirtual$(line, 11));
        }
        line = reader.readLine();
      }
    } catch ($e1) {
      $e1 = toJava($e1);
      if (instanceOf($e1, 12)) {
        e = $e1;
        e.printStackTrace();
        (jl.$clinit_System(), jl.err).println_0("error reading molfile " + e);
        return false;
      } else
        throw toJs($e1);
    }
    if (isNotNull(customLabelMap))
      for (cl$iterator = customLabelMap.values().iterator(); cl$iterator.hasNext_0(); ) {
        cl = castTo(cl$iterator.next_3(), 182);
        if (cl.isOCLCUstomLabel && cl.atom != 0 && jsNotEquals(cl.label_0, null))
          this.mMol.setAtomCustomLabel_0(cl.atom - 1, cl.label_0);
      }
    if (this.mDeduceMissingCharges) {
      this.introduceObviousMetalBonds();
      this.deduceMissingCharges();
    }
    if ((this.mMode & 1) != 0)
      this.mHydrogenMap = this.mMol.getHandleHydrogenMap_0();
    this.handleValences(valence);
    this.mMol.ensureHelperArrays_0(15);
    return true;
  };
  _.readMoleculeV3FromBuffer = function readMoleculeV3FromBuffer(reader) {
    var MODE_CTAB, MODE_CTAB_ATOM, MODE_CTAB_BOND, MODE_CTAB_COLLECTION, MODE_CTAB_SGROUP, cont, line, mode, modeString;
    MODE_CTAB = 1;
    MODE_CTAB_ATOM = 2;
    MODE_CTAB_BOND = 3;
    MODE_CTAB_SGROUP = 4;
    MODE_CTAB_COLLECTION = 5;
    if (isNotNull(this.mAtomIndexMap))
      this.mAtomIndexMap.clear();
    if (isNotNull(this.mBondIndexMap))
      this.mBondIndexMap.clear();
    mode = 0;
    line = reader.readLine();
    while (jsNotEquals(line, null) && jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  V30 ")) {
      line = jl.trim__Ljava_lang_String___devirtual$(jl.substring_I_Ljava_lang_String___devirtual$(line, 7));
      while (jl.endsWith_Ljava_lang_String__Z__devirtual$(line, "-")) {
        cont = reader.readLine();
        if (!jl.startsWith_Ljava_lang_String__Z__devirtual$(cont, "M  V30 ")) {
          return false;
        }
        line = jl.trim__Ljava_lang_String___devirtual$(jl.concat_Ljava_lang_String__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(line, 0, jl.length__I__devirtual$_0(line) - 1), jl.substring_I_Ljava_lang_String___devirtual$(cont, 7)));
      }
      if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "BEGIN")) {
        modeString = jl.trim__Ljava_lang_String___devirtual$(jl.substring_I_Ljava_lang_String___devirtual$(line, 6));
        if (jl.startsWith_Ljava_lang_String__Z__devirtual$(modeString, "CTAB")) {
          mode = 1;
        } else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(modeString, "ATOM")) {
          mode = 2;
        } else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(modeString, "BOND")) {
          mode = 3;
        } else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(modeString, "SGROUP")) {
          mode = 4;
        } else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(modeString, "COLLECTION")) {
          mode = 5;
        } else {
          this.TRACE("Error MolfileParser: Unsupported version 3 block\n");
          return false;
        }
      } else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "END")) {
        mode = 0;
      } else if (mode == 1) {
        this.interpretV3CountLine(line);
      } else if (mode == 2) {
        this.interpretV3AtomLine(line);
      } else if (mode == 3) {
        this.interpretV3BondLine(line);
      } else if (mode == 4) {
        this.interpretV3SgroupLine(line);
      } else if (mode == 5) {
        this.interpretV3CollectionLine(line);
      } else {
        this.TRACE("Error MolfileParser: Unexpected version 3 line\n");
        return false;
      }
      line = reader.readLine();
    }
    while (jsNotEquals(line, null) && !(jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  END") || jl.equals_Ljava_lang_Object__Z__devirtual$_2(line, "$$$$"))) {
      line = reader.readLine();
    }
    return true;
  };
  _.setAssumeChiralTrue = function setAssumeChiralTrue(b) {
    this.mAssumeChiralTrue = b;
  };
  _.mAssumeChiralTrue = false;
  _.mChiralFlag = false;
  _.mDeduceMissingCharges = false;
  _.mIsV3000 = false;
  _.mMode = 0;
  _.mTreatAnyAsMetalBond = false;
  carc2.ALLOWED_ATOM_LABELS = 0;
  carc2.ALLOWED_ATOM_LABELS_IN_LIST = 1;
  carc2.FIELD_NAME_CUSTOM_LABEL = "NOSEARCH_OCL_CUSTOM_LABEL";
  carc2.MODE_KEEP_HYDROGEN_MAP = 1;
  carc2.debug = false;
  cggl.Lcom_actelion_research_chem_MolfileParser_2_classLit = createForClass("com.actelion.research.chem", "MolfileParser", 149, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_MolfileParser$CustomLabel = function $clinit_MolfileParser$CustomLabel() {
    carc2.$clinit_MolfileParser$CustomLabel = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.MolfileParser$CustomLabel = function MolfileParser$CustomLabel() {
    carc2.$clinit_MolfileParser$CustomLabel();
    Object_0.call(this);
    this.$init_39();
  };
  defineClass(182, 1, { 182: 1, 1: 1 }, carc2.MolfileParser$CustomLabel);
  _.$init_39 = function $init_39() {
  };
  _.atom = 0;
  _.isOCLCUstomLabel = false;
  cggl.Lcom_actelion_research_chem_MolfileParser$CustomLabel_2_classLit = createForClass("com.actelion.research.chem", "MolfileParser/CustomLabel", 182, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_MolfileV3Creator = function $clinit_MolfileV3Creator() {
    carc2.$clinit_MolfileV3Creator = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.MolfileV3Creator = function MolfileV3Creator() {
    Object_0.call(this);
    this.$init_40();
    this.mMolfile = new jl.StringBuilder_0(32768);
  };
  carc2.MolfileV3Creator_0 = function MolfileV3Creator_0(mol) {
    carc2.$clinit_MolfileV3Creator();
    carc2.MolfileV3Creator_1.call(this, mol, true);
  };
  carc2.MolfileV3Creator_1 = function MolfileV3Creator_1(mol, allowScaling) {
    carc2.MolfileV3Creator_2.call(this, mol, allowScaling, 0, new jl.StringBuilder_0(32768));
  };
  carc2.MolfileV3Creator_2 = function MolfileV3Creator_2(mol, allowScaling, scalingFactor, builder) {
    var hasCoordinates, name_0, nl;
    Object_0.call(this);
    this.$init_40();
    this.mDoubleFormat = new jt.DecimalFormat_0("0.0000", new jt.DecimalFormatSymbols((ju.$clinit_Locale(), ju.ENGLISH)));
    mol.ensureHelperArrays_0(15);
    nl = jl.lineSeparator();
    this.mMolfile = isNull(builder) ? new jl.StringBuilder() : builder;
    name_0 = jsNotEquals(mol.getName_0(), null) ? mol.getName_0() : "";
    this.mMolfile.append_9(name_0 + ("" + nl));
    this.mMolfile.append_9("Actelion Java MolfileCreator 2.0" + nl + nl);
    this.mMolfile.append_9("  0  0  0  0  0  0              0 V3000" + nl);
    this.mScalingFactor = 1;
    hasCoordinates = carc2.hasCoordinates_0(mol);
    if (hasCoordinates) {
      if (scalingFactor != 0)
        this.mScalingFactor = scalingFactor;
      else if (allowScaling)
        this.mScalingFactor = carc2.calculateScalingFactor(mol);
    }
    this.writeBody(mol, hasCoordinates);
    this.mMolfile.append_9("M  END" + nl);
  };
  carc2.calculateScalingFactor = function calculateScalingFactor(mol) {
    var atom1, atom2, avbl, distance, dx, dy, dz, minDistance, scalingFactor;
    scalingFactor = 1;
    avbl = mol.getAverageBondLength_0();
    if (avbl != 0) {
      if (avbl < 1 || avbl > 3)
        scalingFactor = 1.5 / avbl;
    } else {
      minDistance = 34028234663852886e22;
      for (atom1 = 1; atom1 < mol.getAllAtoms_0(); atom1++) {
        for (atom2 = 0; atom2 < atom1; atom2++) {
          dx = mol.getAtomX_0(atom2) - mol.getAtomX_0(atom1);
          dy = mol.getAtomY_0(atom2) - mol.getAtomY_0(atom1);
          dz = mol.getAtomZ_0(atom2) - mol.getAtomZ_0(atom1);
          distance = dx * dx + dy * dy + dz * dz;
          if (minDistance > distance)
            minDistance = distance;
        }
      }
      scalingFactor = 2 * 1.5 / $wnd.Math.max(1.5 / 2, minDistance);
    }
    return scalingFactor;
  };
  carc2.hasCoordinates_0 = function hasCoordinates_0(mol) {
    var atom;
    if (mol.getAllAtoms_0() == 1)
      return true;
    for (atom = 1; atom < mol.getAllAtoms_0(); atom++) {
      if (mol.getAtomX_0(atom) != mol.getAtomX_0(0) || mol.getAtomY_0(atom) != mol.getAtomY_0(0) || mol.getAtomZ_0(atom) != mol.getAtomZ_0(0)) {
        return true;
      }
    }
    return false;
  };
  carc2.writeCTAB = function writeCTAB(mol, scalingFactor) {
    carc2.$clinit_MolfileV3Creator();
    var mf;
    mf = new carc2.MolfileV3Creator();
    mf.mScalingFactor = scalingFactor;
    mol.ensureHelperArrays_0(15);
    mf.writeBody(mol, true);
    return mf.getMolfile();
  };
  defineClass(165, 1, { 1: 1 }, carc2.MolfileV3Creator, carc2.MolfileV3Creator_0);
  _.$init_40 = function $init_40() {
    this.mScalingFactor = 1;
  };
  _.appendTenDigitDouble_0 = function appendTenDigitDouble_0(theDouble) {
    var i, val;
    val = this.mDoubleFormat.format(theDouble);
    for (i = jl.length__I__devirtual$_0(val); i < 10; i++)
      this.mMolfile.append_4(32);
    this.mMolfile.append_9(val);
  };
  _.getMolfile = function getMolfile_0() {
    return this.mMolfile.toString_0();
  };
  _.writeBody = function writeBody(mol, hasCoordinates) {
    var absAtomsCount, absBondsCount, andAtomsCount, andBondsCount, atom, atom0, atom1, atom2, atom3, atomList, atomicNo, bond, bond0, bond1, bondType, count, customLabelFound, group, hydrogenFlags, i, label_0, nl, notlist, orAtomsCount, orBondsCount, order, paritiesFound, ringFeatures, ringState, stereo, substitution, topology, type_0, valence;
    nl = jl.lineSeparator();
    this.mMolfile.append_9("M  V30 BEGIN CTAB" + nl);
    this.mMolfile.append_9("M  V30 COUNTS " + mol.getAllAtoms_0() + " " + mol.getAllBonds_0() + " 0 0 0" + nl);
    this.mMolfile.append_9("M  V30 BEGIN ATOM" + nl);
    for (atom0 = 0; atom0 < mol.getAllAtoms_0(); atom0++) {
      this.mMolfile.append_9("M  V30 " + (atom0 + 1));
      if (jsNotEquals(mol.getAtomList_0(atom0), null)) {
        atomList = mol.getAtomList_0(atom0);
        notlist = neq(and_0(mol.getAtomQueryFeatures(atom0), 1), 0);
        this.mMolfile.append_9(notlist ? " NOT[" : " [");
        for (i = 0; i < atomList.length; i++) {
          if (i > 0) {
            this.mMolfile.append_9(",");
          }
          label_0 = (carc2.$clinit_Molecule(), carc2.cAtomLabel)[atomList[i]];
          switch (jl.length__I__devirtual$_0(label_0)) {
            case 1:
              this.mMolfile.append_9(label_0);
              break;
            case 2:
              this.mMolfile.append_9(label_0);
              break;
            case 3:
              this.mMolfile.append_9(label_0);
              break;
            default:
              this.mMolfile.append_9("?");
              break;
          }
        }
        this.mMolfile.append_9("]");
      } else if (neq(and_0(mol.getAtomQueryFeatures(atom0), 1), 0)) {
        this.mMolfile.append_9(" A");
      } else if (mol.getAtomicNo_0(atom0) >= 129 && mol.getAtomicNo_0(atom0) <= 144 || mol.getAtomicNo_0(atom0) == 154) {
        this.mMolfile.append_9(" R#");
      } else {
        this.mMolfile.append_9(" " + mol.getAtomLabel_0(atom0));
      }
      if (hasCoordinates) {
        this.mMolfile.append_9(" " + round_int(1e4 * this.mScalingFactor * mol.getAtomX_0(atom0)) / 1e4);
        this.mMolfile.append_9(" " + round_int(1e4 * this.mScalingFactor * -mol.getAtomY_0(atom0)) / 1e4);
        this.mMolfile.append_9(" " + round_int(1e4 * this.mScalingFactor * -mol.getAtomZ_0(atom0)) / 1e4);
      } else {
        this.mMolfile.append_9(" 0 0 0");
      }
      this.mMolfile.append_9(" " + mol.getAtomMapNo_0(atom0));
      if (mol.getAtomCharge_0(atom0) != 0) {
        this.mMolfile.append_9(" CHG=" + mol.getAtomCharge_0(atom0));
      }
      if (mol.getAtomRadical_0(atom0) != 0) {
        this.mMolfile.append_9(" RAD=");
        switch (mol.getAtomRadical_0(atom0)) {
          case 16:
            this.mMolfile.append_9("1");
            break;
          case 32:
            this.mMolfile.append_9("2");
            break;
          case 48:
            this.mMolfile.append_9("3");
            break;
        }
      }
      if (mol.getAtomParity_0(atom0) == 1 || mol.getAtomParity_0(atom0) == 2) {
        this.mMolfile.append_9(" CFG=");
        if (mol.getAtomParity_0(atom0) == 1) {
          this.mMolfile.append_9("1");
        } else {
          this.mMolfile.append_9("2");
        }
      }
      if (mol.getAtomMass_0(atom0) != 0) {
        this.mMolfile.append_9(" MASS=" + mol.getAtomMass_0(atom0));
      }
      valence = mol.getAtomAbnormalValence_0(atom0);
      if (valence != -1) {
        this.mMolfile.append_9(" VAL=" + (valence == 0 ? "-1" : jl.valueOf_12(valence)));
      }
      atomicNo = mol.getAtomicNo_0(atom0);
      if (atomicNo >= 129 && atomicNo <= 144 || atomicNo == 154) {
        this.mMolfile.append_9(" RGROUPS=(1 " + (atomicNo == 154 ? 0 : atomicNo >= 142 ? atomicNo - 141 : atomicNo - 125) + ")");
      }
      hydrogenFlags = and_0(1920, mol.getAtomQueryFeatures(atom0));
      if (eq(hydrogenFlags, or_0(128, 256))) {
        this.mMolfile.append_9(" HCOUNT=2");
      } else if (eq(hydrogenFlags, 128)) {
        this.mMolfile.append_9(" HCOUNT=1");
      } else if (eq(hydrogenFlags, or_0(or_0(256, 512), 1024))) {
        this.mMolfile.append_9(" HCOUNT=-1");
      } else if (eq(hydrogenFlags, or_0(or_0(128, 512), 1024))) {
        this.mMolfile.append_9(" HCOUNT=1");
      }
      substitution = and_0(mol.getAtomQueryFeatures(atom0), or_0(4096, 2048));
      if (neq(substitution, 0)) {
        if (neq(and_0(substitution, 4096), 0)) {
          this.mMolfile.append_9(" SUBST=" + (mol.getAllConnAtoms_0(atom0) + 1));
        } else {
          this.mMolfile.append_9(" SUBST=-1");
        }
      }
      ringFeatures = and_0(mol.getAtomQueryFeatures(atom0), 120);
      if (neq(ringFeatures, 0)) {
        if (eq(ringFeatures, or_0(or_0(16, 32), 64)))
          this.mMolfile.append_9(" RBCNT=-1");
        else if (eq(ringFeatures, 8))
          this.mMolfile.append_9(" RBCNT=2");
        else if (eq(ringFeatures, or_0(or_0(8, 32), 64)))
          this.mMolfile.append_9(" RBCNT=2");
        else if (eq(ringFeatures, or_0(or_0(8, 16), 64)))
          this.mMolfile.append_9(" RBCNT=3");
        else if (eq(ringFeatures, or_0(or_0(8, 16), 32)))
          this.mMolfile.append_9(" RBCNT=4");
      }
      this.mMolfile.append_9(nl);
    }
    this.mMolfile.append_9("M  V30 END ATOM" + nl);
    this.mMolfile.append_9("M  V30 BEGIN BOND" + nl);
    for (bond0 = 0; bond0 < mol.getAllBonds_0(); bond0++) {
      this.mMolfile.append_9("M  V30 " + (bond0 + 1));
      switch (mol.getBondType_0(bond0)) {
        case 1:
          order = 1;
          stereo = 0;
          break;
        case 2:
          order = 2;
          stereo = 0;
          break;
        case 4:
          order = 3;
          stereo = 0;
          break;
        case 129:
          order = 1;
          stereo = 3;
          break;
        case 257:
          order = 1;
          stereo = 1;
          break;
        case 386:
          order = 2;
          stereo = 2;
          break;
        case 8:
          order = 4;
          stereo = 0;
          break;
        case 16:
          order = 9;
          stereo = 0;
          break;
        default:
          order = 1;
          stereo = 0;
          break;
      }
      bondType = mol.getBondQueryFeatures_0(bond0) & 31;
      if (bondType != 0) {
        if (bondType == 8) {
          order = 4;
        } else if (bondType == (1 | 2)) {
          order = 5;
        } else if (bondType == (1 | 8)) {
          order = 6;
        } else if (bondType == (2 | 8)) {
          order = 7;
        } else {
          order = 8;
        }
      }
      this.mMolfile.append_9(" " + order + " " + (mol.getBondAtom_0(0, bond0) + 1) + " " + (mol.getBondAtom_0(1, bond0) + 1));
      if (stereo != 0) {
        this.mMolfile.append_9(" CFG=" + stereo);
      }
      ringState = mol.getBondQueryFeatures_0(bond0) & 384;
      topology = ringState == 0 ? 0 : ringState == 256 ? 1 : 2;
      if (topology != 0) {
        this.mMolfile.append_9(" TOPO=" + topology);
      }
      this.mMolfile.append_9(nl);
    }
    this.mMolfile.append_9("M  V30 END BOND" + nl);
    customLabelFound = false;
    for (atom1 = 0; atom1 < mol.getAllAtoms_0(); atom1++) {
      if (jsNotEquals(mol.getAtomCustomLabel_0(atom1), null)) {
        customLabelFound = true;
        break;
      }
    }
    if (customLabelFound) {
      this.mMolfile.append_9("M  V30 BEGIN SGROUP" + nl);
      count = 0;
      for (atom2 = 0; atom2 < mol.getAllAtoms_0(); atom2++) {
        if (jsNotEquals(mol.getAtomCustomLabel_0(atom2), null)) {
          count++;
          this.mMolfile.append_9("M  V30 " + count + " DAT " + count + " ATOMS=(1 " + (atom2 + 1) + ') FIELDNAME="NOSEARCH_OCL_CUSTOM_LABEL" -' + nl);
          this.mMolfile.append_9('M  V30 FIELDDISP="');
          this.appendTenDigitDouble_0(hasCoordinates ? this.mScalingFactor * mol.getAtomX_0(atom2) : 0);
          this.appendTenDigitDouble_0(hasCoordinates ? this.mScalingFactor * mol.getAtomY_0(atom2) : 0);
          this.mMolfile.append_9('    DA    ALL  1       5" FIELDDATA="' + mol.getAtomCustomLabel_0(atom2) + '"' + nl);
        }
      }
      this.mMolfile.append_9("M  V30 END SGROUP" + nl);
    }
    paritiesFound = false;
    absAtomsCount = 0;
    orAtomsCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 32, 15, 1);
    andAtomsCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 32, 15, 1);
    for (atom3 = 0; atom3 < mol.getAtoms_0(); atom3++) {
      if (mol.getAtomParity_0(atom3) == 1 || mol.getAtomParity_0(atom3) == 2) {
        paritiesFound = true;
        type_0 = mol.getAtomESRType_0(atom3);
        if (type_0 == 1) {
          andAtomsCount[mol.getAtomESRGroup_0(atom3)]++;
        } else if (type_0 == 2) {
          orAtomsCount[mol.getAtomESRGroup_0(atom3)]++;
        } else {
          absAtomsCount++;
        }
      }
    }
    absBondsCount = 0;
    orBondsCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 32, 15, 1);
    andBondsCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 32, 15, 1);
    for (bond1 = 0; bond1 < mol.getBonds_0(); bond1++) {
      if (mol.getBondOrder_0(bond1) != 2 && (mol.getBondParity_0(bond1) == 1 || mol.getBondParity_0(bond1) == 2)) {
        paritiesFound = true;
        type_0 = mol.getBondESRType_0(bond1);
        if (type_0 == 1) {
          andBondsCount[mol.getBondESRGroup_0(bond1)]++;
        } else if (type_0 == 2) {
          orBondsCount[mol.getBondESRGroup_0(bond1)]++;
        } else {
          absBondsCount++;
        }
      }
    }
    if (paritiesFound) {
      this.mMolfile.append_9("M  V30 BEGIN COLLECTION" + nl);
      if (absAtomsCount != 0) {
        this.mMolfile.append_9("M  V30 MDLV30/STEABS ATOMS=(" + absAtomsCount);
        for (atom = 0; atom < mol.getAtoms_0(); atom++) {
          if ((mol.getAtomParity_0(atom) == 1 || mol.getAtomParity_0(atom) == 2) && mol.getAtomESRType_0(atom) == 0) {
            this.mMolfile.append_9(" " + (atom + 1));
          }
        }
        this.mMolfile.append_9(")" + nl);
      }
      if (absBondsCount != 0) {
        this.mMolfile.append_9("M  V30 MDLV30/STEABS BONDS=(" + absBondsCount);
        for (bond = 0; bond < mol.getBonds_0(); bond++) {
          if (mol.getBondOrder_0(bond) != 2 && (mol.getBondParity_0(bond) == 1 || mol.getBondParity_0(bond) == 2) && mol.getBondESRType_0(bond) == 0) {
            this.mMolfile.append_9(" " + (bond + 1));
          }
        }
        this.mMolfile.append_9(")" + nl);
      }
      for (group = 0; group < 32; group++) {
        if (orAtomsCount[group] != 0) {
          this.mMolfile.append_9("M  V30 MDLV30/STEREL" + (group + 1) + " ATOMS=(" + orAtomsCount[group]);
          for (atom = 0; atom < mol.getAtoms_0(); atom++) {
            if ((mol.getAtomParity_0(atom) == 1 || mol.getAtomParity_0(atom) == 2) && mol.getAtomESRType_0(atom) == 2 && mol.getAtomESRGroup_0(atom) == group) {
              this.mMolfile.append_9(" " + (atom + 1));
            }
          }
          this.mMolfile.append_9(")" + nl);
        }
        if (andAtomsCount[group] != 0) {
          this.mMolfile.append_9("M  V30 MDLV30/STERAC" + (group + 1) + " ATOMS=(" + andAtomsCount[group]);
          for (atom = 0; atom < mol.getAtoms_0(); atom++) {
            if ((mol.getAtomParity_0(atom) == 1 || mol.getAtomParity_0(atom) == 2) && mol.getAtomESRType_0(atom) == 1 && mol.getAtomESRGroup_0(atom) == group) {
              this.mMolfile.append_9(" " + (atom + 1));
            }
          }
          this.mMolfile.append_9(")" + nl);
        }
        if (orBondsCount[group] != 0) {
          this.mMolfile.append_9("M  V30 MDLV30/STEREL" + (group + 1) + " BONDS=(" + orBondsCount[group]);
          for (bond = 0; bond < mol.getBonds_0(); bond++) {
            if (mol.getBondOrder_0(bond) != 2 && (mol.getBondParity_0(bond) == 1 || mol.getBondParity_0(bond) == 2) && mol.getBondESRType_0(bond) == 2 && mol.getBondESRGroup_0(bond) == group) {
              this.mMolfile.append_9(" " + (bond + 1));
            }
          }
          this.mMolfile.append_9(")" + nl);
        }
        if (andBondsCount[group] != 0) {
          this.mMolfile.append_9("M  V30 MDLV30/STERAC" + (group + 1) + " BONDS=(" + andBondsCount[group]);
          for (bond = 0; bond < mol.getBonds_0(); bond++) {
            if (mol.getBondOrder_0(bond) != 2 && (mol.getBondParity_0(bond) == 1 || mol.getBondParity_0(bond) == 2) && mol.getBondESRType_0(bond) == 1 && mol.getBondESRGroup_0(bond) == group) {
              this.mMolfile.append_9(" " + (bond + 1));
            }
          }
          this.mMolfile.append_9(")" + nl);
        }
      }
      this.mMolfile.append_9("M  V30 END COLLECTION" + nl);
    }
    this.mMolfile.append_9("M  V30 END CTAB" + nl);
  };
  _.writeMolfile = function writeMolfile_0(theWriter) {
    theWriter.write_3(this.mMolfile.toString_0());
  };
  _.mScalingFactor = 0;
  carc2.PRECISION_FACTOR = 1e4;
  carc2.TARGET_AVBL_0 = 1.5;
  cggl.Lcom_actelion_research_chem_MolfileV3Creator_2_classLit = createForClass("com.actelion.research.chem", "MolfileV3Creator", 165, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_NamedSubstituents = function $clinit_NamedSubstituents() {
    carc2.$clinit_NamedSubstituents = emptyMethod;
    jl.$clinit_Object();
    carc2.SUBSTITUENT_LIST = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 2), { 4: 1, 1: 1, 7: 1 }, 9, 0, [stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Acyl", "gCaHA`AIf`@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Alloc", "gNph@l@ILzuR@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Allyl", "Al"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Benzyl;Bn", "daD@`F@DjUZxHH@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Boc", "daxD`@S@AIgijj@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["BOM;BzOM", "deTH`@H@Re[TYj`@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Bs", "dmtDpAdLS`aPAIe]jf`@e`@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Bt", "dew@`@aJ@DiY]paej`@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Btm", "did@P@BJ@Die_ahH@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Butyl;nButyl", "gJPHB@IRuP@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Benzoyl;Bz", "didH`@p@RYm^Eh@@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Bzh", "dg|@`N@LdbRbtJUB]aAP@@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Cbz", "dmtD`@S@AIgYVUZh@@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["cButyl", "gKPHL@IThuT@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["cHeptyl", "daD@`L@DjWVzjj`@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["cHexyl", "gOpHL@IToWUU@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["cOctyl", "did@`L@DjWWajjj@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["cPentyl", "gFpHL@ITimUP@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["cPropyl", "gBPHL@Qxjh@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["COOH", "gC`h@l@ILt@@ !Bb@K~@Hc}"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["DEAE", "daz@`@x@RiUjj`@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["DEIPS", "diD@P@\\B@DjfVjj`@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["DMIPS", "gNpD@xD@RjZjh@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["DMPM", "dcLD`@kPCIEMDdcttDDT@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["DMPS", "deT@P@\\B@LddTjPsU@@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["DMTr", "fak@b@@Mt@ISZ{SMjo{NQKfm@AU@@@E@@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["DNP", "dkmB`hdDt~@HeNfS{HihheCAUhBHX@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["DNS;Dan", "fhi`a@KPP@HH@YIHYheEhYKQgKP@@QP@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["DPIPS", "fdyAA@H@\\B@FRRIQSQIHzp_Qjh@h@@@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["DPTBS", "fleAA@H@\\B@FRRIQSRIIWNbEMU@EP@@@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["DTBMS", "dmT@P@\\B@Djffjjjh@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Ethyl", "eMBD@ch@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Fmoc", "fde@b@@Hp@IL{LrjxeVCzKUT@@@P@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["iAmyl", "gGPHJ@YIDZj@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["iButyl", "gJPHB@ITuP@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Im", "gFtHAj@IRnKSP@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["iPropyl", "gC`HL@Qz`@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["MDIPS", "diD@P@\\B@DjfZjj`@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["MDPS", "foA@A@@NA@CIIEEBdeeVLzj@@@@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Methyl", "eFBH@c@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["MEM", "gNphAR@IRoUT@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Mes", "deT@`J@DjY{[`bB`@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["MMTr", "ffcAB@@Z@Dim]ifuWYrI\\uh@Jh@@@@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["MOM", "gCaHA`AJZ`@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["MPM;PMB", "deTH`@d@Rfuunh@J@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Ms", "gJPdH`DD@cuh@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["MTM", "gC`D@DX@Rfh@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["mTolyl", "daD@`N@DjWjXHB@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["N3", "gClHaE`@RnReX@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["nAmyl;Amyl", "gGPHJ@IRmU@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["neoAm", "gGPHJ@IUMU@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["NO2,Nitro", "gChhhE`BRnRYh@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Np", "deVDaHAI@HeNR[e_aZ@B@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["nPropyl;Propyl", "gC`HL@IST@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["oTolyl", "daD@`J@DjYvxH`@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Phenyl", "gOpHL@IToVD@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Pht", "dcLL`@RU@Dfyed]ZBA`@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Piv;Pv", "gNqHA`AIffj`@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["PMBM", "dcLD`@T`AJUm]FZh@J@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["PNB", "dcNLaHAEt@bTyInUvxV`@f@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Poc", "didD`@S@AIgexVjj`@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["PPi", "diDFsHSB[`|J|A@Lxn{lddqdZih@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["pTolyl", "daD@`N@DjWzXHB@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["sAmyl", "gGPHL@YIDZj@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["sButyl", "gJPHL@ITuP@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["SEM", "diDHPFApD@rRQUJjj`@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["SES", "dedDpHP@``AgCIICeHmUT@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["SO3H", "gJQdHl@``D^m@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["tAmyl", "gGPHB@IUMU@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["TBDMS;TBS", "dax@P@\\B@Djfjjh@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["TBDPS", "fdy@A@@NA@CIIEEEIde]XOhuPAT@@@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["TBMPS", "dg\\HPHApH@rRQJJPjg]UAT@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["tButyl,tBu", "gJPHB@Q}T@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["TDS", "ded@P@\\B@LddTeeUUP@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Tf", "daxDhHP@``BiAiCiCIICHmU@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["TFA", "gNqBJIARFdF@YEHYUL@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Thexyl", "gNpHB@IUMUT@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["THF", "gFqH@PAJYujj@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["THP", "gOqH@PAJYZzjh@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["TIPS", "dmT@P@\\B@DjfYjjjh@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["TMS", "gJPD@xD@czh@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Tosyl;Ts", "dmtDPHP@``CIICLeaeZ@B@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Troc", "diDDHJxHaHcH`PCHiBeJjf@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Trt", "fbm@B@A@FRQIRKQPiIZdoIcdHJ`@@@@@@"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Xyl", "did@`J@DjYynBHH@@"])]);
  };
  carc2.createMap = function createMap() {
    var k, k$array, k$index, k$max, key, sp, sp$array, sp$index, sp$max;
    carc2.sIDCodeMap = new ju.TreeMap();
    for (sp$array = carc2.SUBSTITUENT_LIST, sp$index = 0, sp$max = sp$array.length; sp$index < sp$max; ++sp$index) {
      sp = sp$array[sp$index];
      key = jl.split_Ljava_lang_String___Ljava_lang_String___devirtual$(sp[0], ";");
      for (k$array = key, k$index = 0, k$max = k$array.length; k$index < k$max; ++k$index) {
        k = k$array[k$index];
        carc2.sIDCodeMap.put(carc2.normalize(k), sp[1]);
      }
    }
  };
  carc2.getSubstituent_0 = function getSubstituent_0(name_0) {
    carc2.$clinit_NamedSubstituents();
    var idcode;
    idcode = carc2.getSubstituentIDCode(name_0);
    return jsEquals(idcode, null) ? null : new carc2.IDCodeParser(false).getCompactMolecule(idcode);
  };
  carc2.getSubstituentIDCode = function getSubstituentIDCode(name_0) {
    if (isNull(carc2.sIDCodeMap))
      carc2.createMap();
    return castToString(carc2.sIDCodeMap.get(carc2.normalize(name_0)));
  };
  carc2.identify = function identify(nameStart) {
    carc2.$clinit_NamedSubstituents();
    var k, k$array, k$index, k$max, key, name_0, sp, sp$array, sp$index, sp$max;
    if (jsEquals(nameStart, null) || jl.length__I__devirtual$_0(nameStart) == 0)
      return null;
    name_0 = null;
    nameStart = carc2.normalize(nameStart);
    for (sp$array = carc2.SUBSTITUENT_LIST, sp$index = 0, sp$max = sp$array.length; sp$index < sp$max; ++sp$index) {
      sp = sp$array[sp$index];
      key = jl.split_Ljava_lang_String___Ljava_lang_String___devirtual$(sp[0], ";");
      for (k$array = key, k$index = 0, k$max = k$array.length; k$index < k$max; ++k$index) {
        k = k$array[k$index];
        if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(carc2.normalize(k), nameStart))
          return k;
        if (jl.startsWith_Ljava_lang_String__Z__devirtual$(carc2.normalize(k), nameStart)) {
          if (jsEquals(name_0, null))
            name_0 = k;
          else
            return "";
        }
      }
    }
    return name_0;
  };
  carc2.normalize = function normalize(s) {
    return jl.replace_Ljava_lang_CharSequence_Ljava_lang_CharSequence__Ljava_lang_String___devirtual$(jl.toLowerCase__Ljava_lang_String___devirtual$(s), "-", "");
  };
  defineClass(765, 1, { 1: 1 });
  carc2.sIDCodeMap = null;
  cggl.Lcom_actelion_research_chem_NamedSubstituents_2_classLit = createForClass("com.actelion.research.chem", "NamedSubstituents", 765, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_PeriodicTable = function $clinit_PeriodicTable() {
    carc2.$clinit_PeriodicTable = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.PeriodicTable = function PeriodicTable() {
    var arrDatum, arrDatum$array, arrDatum$index, arrDatum$max;
    Object_0.call(this);
    this.$init_41();
    this.htblDataAtNo = new ju.HashMap();
    this.htblDataName = new ju.HashMap();
    this.htblDataSymbol = new ju.HashMap();
    carc2.arrData = stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_Element_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 15, 0, [new carc2.Element_0(1, "Hydrogen", "H", 1.008, 0.435, 1.185, 2.2), new carc2.Element_0(2, "Helium", "He", 4.003, 0.93, 1.785, 0), new carc2.Element_0(3, "Lithium", "Li", 6.94, 1.52, 0, 0.98), new carc2.Element_0(4, "Beryllium", "Be", 9.013, 1.143, 0, 1.57), new carc2.Element_0(5, "Boron", "B", 10.82, 0.975, 1.7, 2.04), new carc2.Element_0(6, "Carbon", "C", 12.011, 0.655, 1.75, 2.55), new carc2.Element_0(7, "Nitrogen", "N", 14.008, 0.75, 1.525, 3.04), new carc2.Element_0(8, "Oxygen", "O", 16, 0.73, 1.4, 3.44), new carc2.Element_0(9, "Fluorine", "F", 19, 0.72, 1.35, 3.98), new carc2.Element_0(10, "Neon", "Ne", 20.183, 0.71, 1.6, 0), new carc2.Element_0(11, "Sodium", "Na", 22.991, 1.858, 0, 0.93), new carc2.Element_0(12, "Magnesium", "Mg", 24.32, 1.605, 0, 1.31), new carc2.Element_0(13, "Aluminum", "Al", 26.98, 1.432, 0, 1.61), new carc2.Element_0(14, "Silicon", "Si", 28.09, 1.176, 2, 1.9), new carc2.Element_0(15, "Phosphorus", "P", 30.975, 1.06, 1.9, 2.19), new carc2.Element_0(16, "Sulfur", "S", 32.066, 1.02, 1.85, 2.58), new carc2.Element_0(17, "Chlorine", "Cl", 35.457, 0.99, 1.78, 3.16), new carc2.Element_0(18, "Argon", "Ar", 39.944, 0.98, 1.9, 0), new carc2.Element_0(19, "Potassium", "K", 39.1, 2.262, 0, 1), new carc2.Element_0(20, "Calcium", "Ca", 40.08, 1.976, 0, 1.36), new carc2.Element_0(21, "Scandium", "Sc", 44.96, 1.655, 0, 1.54), new carc2.Element_0(22, "Titanium", "Ti", 47.9, 1.476, 0, 1.63), new carc2.Element_0(23, "Vanadium", "V", 50.95, 1.309, 0, 1.66), new carc2.Element_0(24, "Chromium", "Cr", 52.01, 1.249, 0, 1.55), new carc2.Element_0(25, "Manganese", "Mn", 54.94, 1.35, 0, 1.83), new carc2.Element_0(26, "Iron", "Fe", 55.85, 1.241, 0, 1.88), new carc2.Element_0(27, "Cobalt", "Co", 58.94, 1.254, 0, 1.91), new carc2.Element_0(28, "Nickel", "Ni", 58.69, 1.246, 0, 1.9), new carc2.Element_0(29, "Copper", "Cu", 63.54, 1.278, 0, 1.65), new carc2.Element_0(30, "Zinc", "Zn", 65.38, 1.333, 0, 1.81), new carc2.Element_0(31, "Gallium", "Ga", 69.72, 1.35, 0, 2.01), new carc2.Element_0(32, "Germanium", "Ge", 72.6, 1.225, 0, 0), new carc2.Element_0(33, "Arsenic", "As", 74.91, 1.2, 2.1, 2.18), new carc2.Element_0(34, "Selenium", "Se", 78.96, 1.16, 2, 2.55), new carc2.Element_0(35, "Bromine", "Br", 79.916, 1.14, 1.97, 0), new carc2.Element_0(36, "Krypton", "Kr", 83.8, 1.12, 2, 2.96), new carc2.Element_0(37, "Rubidium", "Rb", 85.48, 2.47, 0, 0), new carc2.Element_0(38, "Strontium", "Sr", 87.63, 2.151, 0, 0.82), new carc2.Element_0(39, "Yttrium", "Y", 88.92, 1.824, 0, 0.95), new carc2.Element_0(40, "Zirconium", "Zr", 91.22, 1.616, 0, 1.22), new carc2.Element_0(41, "Niobium", "Nb", 92.91, 1.432, 0, 1.33), new carc2.Element_0(42, "Molybdenum", "Mo", 95.95, 1.363, 0, 1.6), new carc2.Element_0(43, "Technetium", "Tc", 99, 1.367, 0, 2.16), new carc2.Element_0(44, "Ruthenium", "Ru", 101.1, 1.353, 0, 1.9), new carc2.Element_0(45, "Rhodium", "Rh", 102.91, 1.345, 0, 2.2), new carc2.Element_0(46, "Palladium", "Pd", 106.7, 1.375, 0, 2.28), new carc2.Element_0(47, "Silver", "Ag", 107.88, 1.445, 0, 2.2), new carc2.Element_0(48, "Cadmium", "Cd", 112.41, 1.489, 0, 1.93), new carc2.Element_0(49, "Indium", "In", 114.76, 1.666, 0, 1.69), new carc2.Element_0(50, "Tin", "Sn", 118.7, 1.538, 0, 1.78), new carc2.Element_0(51, "Antimony", "Sb", 121.76, 1.4, 2.2, 1.96), new carc2.Element_0(52, "Tellurium", "Te", 127.61, 1.36, 2.2, 0), new carc2.Element_0(53, "Iodine", "I", 126.91, 1.33, 2.2, 2.05), new carc2.Element_0(54, "Xenon", "Xe", 131.3, 1.31, 2.2, 2.1), new carc2.Element_0(55, "Cesium", "Cs", 132.91, 2.632, 0, 2.66), new carc2.Element_0(56, "Barium", "Ba", 137.36, 2.171, 0, 2.6), new carc2.Element_0(57, "Lanthanum", "La", 138.92, 1.873, 0, 0.79), new carc2.Element_0(58, "Cerium", "Ce", 140.13, 1.824, 0, 0.89), new carc2.Element_0(59, "Praesodymium", "Pr", 140.92, 1.836, 0, 1.1), new carc2.Element_0(60, "Neodymium", "Nd", 144.27, 1.829, 0, 1.12), new carc2.Element_0(61, "Promethium", "Pm", 145, 1.809, 0, 1.13), new carc2.Element_0(62, "Samarium", "Sm", 150.43, 1.804, 0, 1.14), new carc2.Element_0(63, "Europium", "Eu", 152, 1.984, 0, 0), new carc2.Element_0(64, "Gadolinium", "Gd", 156.9, 1.818, 0, 1.17), new carc2.Element_0(65, "Terbium", "Tb", 158.93, 1.8, 0, 0), new carc2.Element_0(66, "Dyprosium", "Dy", 162.46, 1.795, 0, 1.2), new carc2.Element_0(67, "Holmium", "Ho", 164.94, 1.789, 0, 0), new carc2.Element_0(68, "Erbium", "Er", 167.2, 1.779, 0, 1.22), new carc2.Element_0(69, "Thulium", "Tm", 168.94, 1.769, 0, 1.23), new carc2.Element_0(70, "Ytterbium", "Yb", 173.04, 1.94, 0, 1.24), new carc2.Element_0(71, "Lutetium", "Lu", 174.99, 1.752, 0, 1.25), new carc2.Element_0(72, "Hafnium", "Hf", 178.6, 1.597, 0, 0), new carc2.Element_0(73, "Tantalium", "Ta", 180.95, 1.428, 0, 1.27), new carc2.Element_0(74, "Wolfram", "W", 183.92, 1.371, 0, 1.3), new carc2.Element_0(75, "Rhenium", "Re", 186.31, 1.38, 0, 1.5), new carc2.Element_0(76, "Osmium", "Os", 190.2, 1.368, 0, 2.36), new carc2.Element_0(77, "Iridium", "Ir", 192.2, 1.357, 0, 1.9), new carc2.Element_0(78, "Platinum", "Pt", 195.23, 1.387, 0, 2.2), new carc2.Element_0(79, "Gold", "Au", 197, 1.442, 0, 2.2), new carc2.Element_0(80, "Mercury", "Hg", 200.61, 1.502, 0, 2.28), new carc2.Element_0(81, "Thallium", "Tl", 204.39, 1.728, 0, 2.54), new carc2.Element_0(82, "Lead", "Pb", 207.21, 1.75, 0, 2), new carc2.Element_0(83, "Bismuth", "Bi", 209, 1.46, 0, 1.62), new carc2.Element_0(84, "Polonium", "Po", 210, 1.46, 0, 2.33), new carc2.Element_0(85, "Astatine", "At", 210, 1.45, 0, 2.02), new carc2.Element_0(86, "Radon", "Rn", 222, 1.43, 0, 2), new carc2.Element_0(87, "Francium", "Fr", 223, 2.5, 0, 2.2), new carc2.Element_0(88, "Radium", "Ra", 226.05, 2.14, 0, 0), new carc2.Element_0(89, "Actinium", "Ac", 227, 1.877, 0, 0.7), new carc2.Element_0(90, "Thorium", "Th", 232.05, 1.798, 0, 0.89), new carc2.Element_0(91, "Protactinium", "Pa", 231, 1.609, 0, 1.1), new carc2.Element_0(92, "Uranium", "U", 238.07, 1.568, 0, 1.3), new carc2.Element_0(93, "Neptunium", "Np", 237, 0, 0, 1.5), new carc2.Element_0(94, "Plutonium", "Pu", 242, 0, 0, 1.38), new carc2.Element_0(95, "Americium", "Am", 243, 0, 0, 1.36), new carc2.Element_0(96, "Curium", "Cm", 243, 0, 0, 1.28), new carc2.Element_0(97, "Berkelium", "Bk", 245, 0, 0, 1.3), new carc2.Element_0(98, "Californium", "Cf", 246, 0, 0, 1.3), new carc2.Element_0(99, "Einsteinium", "E", -999, 0, 0, 1.3), new carc2.Element_0(100, "Fermium", "Fm", -999, 0, 0, 1.3), new carc2.Element_0(101, "Mendelevium", "Mv", -999, 0, 0, 1.3)]);
    for (arrDatum$array = carc2.arrData, arrDatum$index = 0, arrDatum$max = arrDatum$array.length; arrDatum$index < arrDatum$max; ++arrDatum$index) {
      arrDatum = arrDatum$array[arrDatum$index];
      this.htblDataAtNo.put(jl.valueOf_12(arrDatum.getOrderNumber()), arrDatum);
      this.htblDataName.put(arrDatum.getName_0(), arrDatum);
      this.htblDataSymbol.put(jl.toLowerCase__Ljava_lang_String___devirtual$(arrDatum.getSymbol()), arrDatum);
    }
    this.arrAlkaline = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, carc2.arrData.length, 16, 1);
    this.arrAlkaline[3] = true;
    this.arrAlkaline[11] = true;
    this.arrAlkaline[19] = true;
    this.arrAlkaline[37] = true;
    this.arrAlkaline[55] = true;
    this.arrAlkaline[87] = true;
  };
  carc2.getElement = function getElement(orderNumber) {
    carc2.$clinit_PeriodicTable();
    return castTo(carc2.getInstance().htblDataAtNo.get(jl.valueOf_12(orderNumber)), 15);
  };
  carc2.getInstance = function getInstance() {
    if (isNull(carc2.tbl)) {
      carc2.tbl = new carc2.PeriodicTable();
    }
    return carc2.tbl;
  };
  defineClass(495, 1, { 1: 1 }, carc2.PeriodicTable);
  _.$init_41 = function $init_41() {
  };
  _.toString_0 = function toString_10() {
    var sPeriodicTable;
    sPeriodicTable = "";
    return sPeriodicTable;
  };
  carc2.Bromine = 35;
  carc2.Carbon = 6;
  carc2.Chlorine = 17;
  carc2.ConnectionPoint = 0;
  carc2.Fluorine = 9;
  carc2.Hydrogen = 1;
  carc2.Iodine = 53;
  carc2.Nitrogen = 7;
  carc2.Oxygen = 8;
  carc2.Phosphorus = 15;
  carc2.Silicon = 14;
  carc2.Sulfur = 16;
  carc2.Uranium = 92;
  cggl.Lcom_actelion_research_chem_PeriodicTable_2_classLit = createForClass("com.actelion.research.chem", "PeriodicTable", 495, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_RingCollection = function $clinit_RingCollection() {
    carc2.$clinit_RingCollection = emptyMethod;
    jl.$clinit_Object();
    carc2.MODE_SMALL_AND_LARGE_RINGS = 1 | 2;
    carc2.MODE_SMALL_RINGS_AND_AROMATICITY = 1 | 4;
    carc2.MODE_SMALL_AND_LARGE_RINGS_AND_AROMATICITY = 1 | 2 | 4;
  };
  carc2.RingCollection = function RingCollection2(mol, mode) {
    carc2.$clinit_RingCollection();
    carc2.RingCollection_0.call(this, mol, mode, 7);
  };
  carc2.RingCollection_0 = function RingCollection_0(mol, mode, maxSmallRingSize) {
    var atom, bond, candidate, current, found, fragmentNo, graphAtom, highest, i, i0, isConfirmedChainAtom, isConfirmedChainBond, noOfFragments, parent_0, potentialRingNeighbours, ringAtom, startAtom;
    Object_0.call(this);
    this.$init_42();
    this.mMol = mol;
    this.mMaxSmallRingSize = maxSmallRingSize;
    this.mRingAtomSet = new ju.ArrayList();
    this.mRingBondSet = new ju.ArrayList();
    this.mAzuleneBridgeBonds = new ju.ArrayList();
    this.mAtomRingFeatures = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    this.mBondRingFeatures = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 15, 1);
    this.mMol.ensureHelperArrays_0(1);
    isConfirmedChainAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    isConfirmedChainBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 16, 1);
    do {
      found = false;
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        if (!isConfirmedChainAtom[atom]) {
          potentialRingNeighbours = 0;
          for (i0 = 0; i0 < this.mMol.getConnAtoms_0(atom); i0++)
            if (!isConfirmedChainAtom[this.mMol.getConnAtom_0(atom, i0)])
              potentialRingNeighbours++;
          if (potentialRingNeighbours < 2) {
            isConfirmedChainAtom[atom] = true;
            for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++)
              isConfirmedChainBond[this.mMol.getConnBond_0(atom, i)] = true;
            found = true;
          }
        }
      }
    } while (found);
    startAtom = 0;
    while (startAtom < this.mMol.getAtoms_0() && isConfirmedChainAtom[startAtom])
      startAtom++;
    if (startAtom == this.mMol.getAtoms_0())
      return;
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    graphAtom[0] = startAtom;
    parent_0 = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    parent_0[0] = -1;
    fragmentNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    fragmentNo[startAtom] = 1;
    current = 0;
    highest = 0;
    noOfFragments = 1;
    while (current <= highest) {
      for (i = 0; i < this.mMol.getConnAtoms_0(graphAtom[current]); i++) {
        candidate = this.mMol.getConnAtom_0(graphAtom[current], i);
        if (candidate == parent_0[graphAtom[current]])
          continue;
        if (fragmentNo[candidate] != 0) {
          this.addSmallRingsToSet(this.mMol.getConnBond_0(graphAtom[current], i), isConfirmedChainAtom);
          continue;
        }
        if (!isConfirmedChainAtom[candidate]) {
          fragmentNo[candidate] = noOfFragments;
          parent_0[candidate] = graphAtom[current];
          graphAtom[++highest] = candidate;
        }
      }
      current++;
      if (current > highest) {
        for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
          if (fragmentNo[atom] == 0 && !isConfirmedChainAtom[atom]) {
            fragmentNo[atom] = ++noOfFragments;
            graphAtom[++highest] = atom;
            parent_0[atom] = -1;
            break;
          }
        }
      }
    }
    if ((mode & 4) != 0) {
      this.mIsAromatic = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mRingAtomSet.size(), 16, 1);
      this.mIsDelocalized = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mRingAtomSet.size(), 16, 1);
      this.mHeteroPosition = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRingAtomSet.size(), 15, 1);
      this.determineAromaticity_1(this.mIsAromatic, this.mIsDelocalized, this.mHeteroPosition, (mode & 8) != 0);
      this.updateAromaticity();
    }
    if ((mode & 2) != 0) {
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
        if (!isConfirmedChainBond[bond] && this.mMol.getBondOrder_0(bond) != 0) {
          ringAtom = this.findSmallestRing(bond, isConfirmedChainAtom);
          if (jsNotEquals(ringAtom, null))
            this.updateRingSize(ringAtom, this.getRingBonds_1(ringAtom));
        }
      }
    }
  };
  carc2.qualifiesAsAromaticAtomicNo = function qualifiesAsAromaticAtomicNo(atomicNo) {
    carc2.$clinit_RingCollection();
    return atomicNo == 5 || atomicNo == 6 || atomicNo == 7 || atomicNo == 8 || atomicNo == 15 || atomicNo == 16 || atomicNo == 33 || atomicNo == 34;
  };
  defineClass(166, 1, { 1: 1 }, carc2.RingCollection);
  _.$init_42 = function $init_42() {
  };
  _.addRingIfNew = function addRingIfNew(ringAtom, ringSize) {
    var equal, i, i0, inverse, j, leftIndex, lowAtom, lowIndex, rightIndex, ringBond, ringOfSet, ringOfSet$iterator, sortedRing;
    lowAtom = this.mMol.getMaxAtoms_0();
    lowIndex = 0;
    for (i0 = 0; i0 < ringSize; i0++) {
      if (lowAtom > ringAtom[i0]) {
        lowAtom = ringAtom[i0];
        lowIndex = i0;
      }
    }
    sortedRing = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, ringSize, 15, 1);
    leftIndex = lowIndex > 0 ? lowIndex - 1 : ringSize - 1;
    rightIndex = lowIndex < ringSize - 1 ? lowIndex + 1 : 0;
    inverse = ringAtom[leftIndex] < ringAtom[rightIndex];
    for (i = 0; i < ringSize; i++) {
      sortedRing[i] = ringAtom[lowIndex];
      if (inverse) {
        if (--lowIndex < 0)
          lowIndex = ringSize - 1;
      } else {
        if (++lowIndex == ringSize)
          lowIndex = 0;
      }
    }
    for (ringOfSet$iterator = this.mRingAtomSet.iterator(); ringOfSet$iterator.hasNext_0(); ) {
      ringOfSet = castTo(ringOfSet$iterator.next_3(), 6);
      if (ringOfSet.length == ringSize) {
        equal = true;
        for (j = 0; j < ringSize; j++) {
          if (ringOfSet[j] != sortedRing[j]) {
            equal = false;
            break;
          }
        }
        if (equal)
          return;
      }
    }
    this.mRingAtomSet.add(sortedRing);
    ringBond = this.getRingBonds_1(sortedRing);
    this.mRingBondSet.add(ringBond);
    this.updateRingSize(sortedRing, ringBond);
  };
  _.addSmallRingsToSet = function addSmallRingsToSet(closureBond, isConfirmedChainAtom) {
    var atom1, atom2, candidate, connIndex, current, graphAtom, isUsed;
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMaxSmallRingSize, 15, 1);
    connIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMaxSmallRingSize, 15, 1);
    isUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    atom1 = this.mMol.getBondAtom_0(0, closureBond);
    atom2 = this.mMol.getBondAtom_0(1, closureBond);
    graphAtom[0] = atom1;
    graphAtom[1] = atom2;
    connIndex[1] = -1;
    isUsed[atom2] = true;
    current = 1;
    while (current >= 1) {
      connIndex[current]++;
      if (connIndex[current] == this.mMol.getConnAtoms_0(graphAtom[current])) {
        isUsed[graphAtom[current]] = false;
        current--;
        continue;
      }
      candidate = this.mMol.getConnAtom_0(graphAtom[current], connIndex[current]);
      if (isUsed[candidate] || isConfirmedChainAtom[candidate])
        continue;
      if (candidate == atom1 && current > 1) {
        this.addRingIfNew(graphAtom, current + 1);
        if (this.mRingAtomSet.size() >= 1024)
          return;
        continue;
      }
      if (current + 1 < this.mMaxSmallRingSize) {
        current++;
        graphAtom[current] = candidate;
        isUsed[candidate] = true;
        connIndex[current] = -1;
      }
    }
  };
  _.determineAromaticity_0 = function determineAromaticity(ringNo, annelatedRing, aromaticityHandled, isAromatic, isDelocalized, heteroPosition, includeTautomericBonds) {
    var annelated, aromaticButNotDelocalizedSequence, atom, atom$array, atom$index, atom$max, bond, bondSequence, cSequence3Ring, cSequence5Ring, cSequence7Ring, carbeniumPosition, carbeniumPosition0, hasDelocalizationLeak, i, i0, index_0, isPiBond, j, nextIsPiBond, piBondCount, position, ringAtom, ringBond, ringBonds, sharedBond, sharedBondIndex, sharedRing, sharedRingBond, unhandledAnnelatedRingFound;
    ringAtom = castTo(this.mRingAtomSet.getAtIndex(ringNo), 6);
    for (atom$array = ringAtom, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
      atom = atom$array[atom$index];
      if (!this.qualifiesAsAromaticAtom(atom))
        return true;
    }
    ringBond = castTo(this.mRingBondSet.getAtIndex(ringNo), 6);
    ringBonds = ringBond.length;
    bondSequence = 0;
    aromaticButNotDelocalizedSequence = 0;
    unhandledAnnelatedRingFound = false;
    for (i0 = 0; i0 < ringBonds; i0++) {
      bondSequence <<= 1;
      aromaticButNotDelocalizedSequence <<= 1;
      if (this.qualifiesAsPiBond(ringBond[i0])) {
        bondSequence |= 1;
      } else if (includeTautomericBonds && this.qualifiesAsAmideTypeBond_0(ringBond[i0])) {
        bondSequence |= 1;
        aromaticButNotDelocalizedSequence |= 1;
      } else {
        annelated = annelatedRing[ringNo][i0];
        if (annelated != -1) {
          if (aromaticityHandled[annelated]) {
            if (isAromatic[annelated]) {
              bondSequence |= 1;
              if (!isDelocalized[annelated])
                aromaticButNotDelocalizedSequence |= 1;
            }
          } else {
            unhandledAnnelatedRingFound = true;
          }
        }
      }
    }
    hasDelocalizationLeak = false;
    switch (ringBonds) {
      case 3:
        cSequence3Ring = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [2, 1, 4]);
        hasDelocalizationLeak = true;
        for (carbeniumPosition0 = 0; carbeniumPosition0 < 3; carbeniumPosition0++) {
          if ((bondSequence & cSequence3Ring[carbeniumPosition0]) == cSequence3Ring[carbeniumPosition0]) {
            if (this.mMol.getAtomicNo_0(ringAtom[carbeniumPosition0]) == 6 && this.mMol.getAtomCharge_0(ringAtom[carbeniumPosition0]) == 1 || this.mMol.getAtomicNo_0(ringAtom[carbeniumPosition0]) == 5 && this.mMol.getAtomCharge_0(ringAtom[carbeniumPosition0]) == 0) {
              isAromatic[ringNo] = true;
              heteroPosition[ringNo] = carbeniumPosition0;
              if ((aromaticButNotDelocalizedSequence & cSequence3Ring[carbeniumPosition0]) == 0)
                hasDelocalizationLeak = false;
            }
          }
        }
        break;
      case 5:
        cSequence5Ring = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [10, 5, 18, 9, 20]);
        hasDelocalizationLeak = true;
        for (position = 0; position < 5; position++) {
          if ((bondSequence & cSequence5Ring[position]) == cSequence5Ring[position]) {
            switch (this.mMol.getAtomicNo_0(ringAtom[position])) {
              case 6:
                if (this.mMol.getAtomCharge_0(ringAtom[position]) == -1) {
                  isAromatic[ringNo] = true;
                  heteroPosition[ringNo] = position;
                  if ((aromaticButNotDelocalizedSequence & cSequence5Ring[position]) == 0)
                    hasDelocalizationLeak = false;
                }
                break;
              case 7:
                if (this.mMol.getAtomCharge_0(ringAtom[position]) <= 0) {
                  isAromatic[ringNo] = true;
                  heteroPosition[ringNo] = position;
                }
                break;
              case 8:
                isAromatic[ringNo] = true;
                heteroPosition[ringNo] = position;
                break;
              case 16:
              case 34:
              case 52:
                if (this.mMol.getConnAtoms_0(ringAtom[position]) == 2) {
                  isAromatic[ringNo] = true;
                  heteroPosition[ringNo] = position;
                }
                break;
            }
          }
        }
        break;
      case 6:
        hasDelocalizationLeak = true;
        if ((bondSequence & 21) == 21) {
          isAromatic[ringNo] = true;
          if ((aromaticButNotDelocalizedSequence & 21) == 0)
            hasDelocalizationLeak = false;
        }
        if ((bondSequence & 42) == 42) {
          isAromatic[ringNo] = true;
          if ((aromaticButNotDelocalizedSequence & 42) == 0)
            hasDelocalizationLeak = false;
        }
        break;
      case 7:
        cSequence7Ring = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [42, 21, 74, 37, 82, 41, 84]);
        hasDelocalizationLeak = true;
        for (carbeniumPosition = 0; carbeniumPosition < 7; carbeniumPosition++) {
          if ((bondSequence & cSequence7Ring[carbeniumPosition]) == cSequence7Ring[carbeniumPosition]) {
            if (this.mMol.getAtomicNo_0(ringAtom[carbeniumPosition]) == 6 && (this.mMol.getAtomCharge_0(ringAtom[carbeniumPosition]) == 1 || includeTautomericBonds && this.hasOxo(ringAtom[carbeniumPosition])) || this.mMol.getAtomicNo_0(ringAtom[carbeniumPosition]) == 5 && this.mMol.getAtomCharge_0(ringAtom[carbeniumPosition]) == 0) {
              isAromatic[ringNo] = true;
              heteroPosition[ringNo] = carbeniumPosition;
              if ((aromaticButNotDelocalizedSequence & cSequence7Ring[carbeniumPosition]) == 0)
                hasDelocalizationLeak = false;
            } else {
              for (i = 0; i < 2; i++) {
                sharedBondIndex = (carbeniumPosition + 6 + i) % 7;
                sharedBond = ringBond[sharedBondIndex];
                sharedRing = annelatedRing[ringNo][sharedBondIndex];
                if (sharedRing != -1 && !isAromatic[sharedRing] && this.getRingSize_0(sharedRing) == 5) {
                  sharedRingBond = castTo(this.mRingBondSet.getAtIndex(sharedRing), 6);
                  index_0 = 0;
                  while (sharedRingBond[index_0] != sharedBond)
                    index_0++;
                  isPiBond = false;
                  piBondCount = 0;
                  for (j = 1; j <= 4; j++) {
                    bond = sharedRingBond[(index_0 + j) % 5];
                    nextIsPiBond = this.qualifiesAsPiBond(bond) || includeTautomericBonds && this.qualifiesAsAmideTypeBond_0(bond);
                    if (nextIsPiBond && isPiBond) {
                      piBondCount = 0;
                      break;
                    }
                    isPiBond = nextIsPiBond;
                    if (isPiBond)
                      piBondCount++;
                  }
                  if (piBondCount == 2) {
                    isAromatic[ringNo] = true;
                    isAromatic[sharedRing] = true;
                    isDelocalized[ringNo] = true;
                    isDelocalized[sharedRing] = true;
                    this.mAzuleneBridgeBonds.add(jl.valueOf_12(sharedBond));
                    break;
                  }
                }
              }
            }
          }
        }
        break;
    }
    if (isAromatic[ringNo] && !hasDelocalizationLeak)
      isDelocalized[ringNo] = true;
    if (isAromatic[ringNo])
      return true;
    return !unhandledAnnelatedRingFound;
  };
  _.determineAromaticity_1 = function determineAromaticity_0(isAromatic, isDelocalized, heteroPosition, includeTautomericBonds) {
    var annelatedRing, aromaticityHandled, bond, i, i0, j, lastRingsHandled, ring, ring0, ringBond, ringMembership, ringsHandled;
    annelatedRing = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, this.mRingAtomSet.size(), 0, 2);
    for (i0 = 0; i0 < this.mRingAtomSet.size(); i0++) {
      annelatedRing[i0] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, castTo(this.mRingAtomSet.getAtIndex(i0), 6).length, 15, 1);
      for (j = 0; j < castTo(this.mRingAtomSet.getAtIndex(i0), 6).length; j++)
        annelatedRing[i0][j] = -1;
    }
    ringMembership = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 15, 1);
    for (ring0 = 0; ring0 < this.mRingBondSet.size(); ring0++) {
      ringBond = castTo(this.mRingBondSet.getAtIndex(ring0), 6);
      if (ringBond.length == 3 || ringBond.length >= 5 && ringBond.length <= 7) {
        for (i = 0; i < ringBond.length; i++) {
          bond = ringBond[i];
          if (this.mMol.getConnAtoms_0(this.mMol.getBondAtom_0(0, bond)) == 3 && this.mMol.getConnAtoms_0(this.mMol.getBondAtom_0(1, bond)) == 3) {
            if (ringMembership[bond] > 0) {
              annelatedRing[ringMembership[bond] >>> 16][ringMembership[bond] & 32767] = ring0;
              annelatedRing[ring0][i] = ringMembership[bond] >>> 16;
            } else {
              ringMembership[bond] = (ring0 << 16) + 32768 + i;
            }
          }
        }
      }
    }
    aromaticityHandled = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mRingAtomSet.size(), 16, 1);
    ringsHandled = 0;
    lastRingsHandled = -1;
    while (ringsHandled > lastRingsHandled) {
      lastRingsHandled = ringsHandled;
      for (ring = 0; ring < this.mRingAtomSet.size(); ring++) {
        if (!aromaticityHandled[ring]) {
          if (this.determineAromaticity_0(ring, annelatedRing, aromaticityHandled, isAromatic, isDelocalized, heteroPosition, includeTautomericBonds)) {
            aromaticityHandled[ring] = true;
            ringsHandled++;
          }
        }
      }
    }
  };
  _.findSmallestRing = function findSmallestRing(bond, isConfirmedChainAtom) {
    var atom, atom1, atom2, candidate, current, graphAtom, graphLevel, graphParent, highest, i, j, ringAtom;
    atom1 = this.mMol.getBondAtom_0(0, bond);
    atom2 = this.mMol.getBondAtom_0(1, bond);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    graphLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    graphParent = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    graphAtom[0] = atom1;
    graphAtom[1] = atom2;
    graphLevel[atom1] = 1;
    graphLevel[atom2] = 2;
    graphParent[atom1] = -1;
    graphParent[atom2] = atom1;
    current = 1;
    highest = 1;
    while (current <= highest) {
      for (i = 0; i < this.mMol.getConnAtoms_0(graphAtom[current]); i++) {
        candidate = this.mMol.getConnAtom_0(graphAtom[current], i);
        if (current > 1 && candidate == atom1) {
          ringAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, graphLevel[graphAtom[current]], 15, 1);
          atom = graphAtom[current];
          for (j = 0; j < ringAtom.length; j++) {
            ringAtom[j] = atom;
            atom = graphParent[atom];
          }
          return ringAtom;
        }
        if (graphLevel[candidate] == 0 && !isConfirmedChainAtom[candidate]) {
          graphAtom[++highest] = candidate;
          graphLevel[candidate] = graphLevel[graphAtom[current]] + 1;
          graphParent[candidate] = graphAtom[current];
        }
      }
      current++;
    }
    return null;
  };
  _.getAtomIndex_0 = function getAtomIndex(ringNo, atom) {
    var i, ringAtom;
    ringAtom = castTo(this.mRingAtomSet.getAtIndex(ringNo), 6);
    for (i = 0; i < ringAtom.length; i++)
      if (atom == ringAtom[i])
        return i;
    return -1;
  };
  _.getAtomRingSize_0 = function getAtomRingSize_0(atom) {
    return this.mAtomRingFeatures[atom] & 65535;
  };
  _.getBondIndex_0 = function getBondIndex(ringNo, bond) {
    var i, ringBond;
    ringBond = castTo(this.mRingBondSet.getAtIndex(ringNo), 6);
    for (i = 0; i < ringBond.length; i++)
      if (bond == ringBond[i])
        return i;
    return -1;
  };
  _.getBondRingSize_0 = function getBondRingSize_0(bond) {
    return this.mBondRingFeatures[bond] & 65535;
  };
  _.getHeteroPosition_0 = function getHeteroPosition(ringNo) {
    return this.mHeteroPosition[ringNo];
  };
  _.getRingAtoms_0 = function getRingAtoms(ringNo) {
    return castTo(this.mRingAtomSet.getAtIndex(ringNo), 6);
  };
  _.getRingBonds_0 = function getRingBonds(ringNo) {
    return castTo(this.mRingBondSet.getAtIndex(ringNo), 6);
  };
  _.getRingBonds_1 = function getRingBonds_0(ringAtom) {
    var atom, i, j, ringAtoms, ringBond;
    ringAtoms = ringAtom.length;
    ringBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, ringAtoms, 15, 1);
    for (i = 0; i < ringAtoms; i++) {
      atom = i == ringAtoms - 1 ? ringAtom[0] : ringAtom[i + 1];
      for (j = 0; j < this.mMol.getConnAtoms_0(ringAtom[i]); j++) {
        if (this.mMol.getConnAtom_0(ringAtom[i], j) == atom) {
          ringBond[i] = this.mMol.getConnBond_0(ringAtom[i], j);
          break;
        }
      }
    }
    return ringBond;
  };
  _.getRingSize_0 = function getRingSize(ringNo) {
    return castTo(this.mRingBondSet.getAtIndex(ringNo), 6).length;
  };
  _.getSharedRing_0 = function getSharedRing(bond1, bond2) {
    var i;
    for (i = 0; i < this.mRingBondSet.size(); i++)
      if (this.isBondMember_0(i, bond1) && this.isBondMember_0(i, bond2))
        return i;
    return -1;
  };
  _.getSize_0 = function getSize() {
    return this.mRingAtomSet.size();
  };
  _.hasOxo = function hasOxo(carbonAtom) {
    var i;
    for (i = 0; i < this.mMol.getConnAtoms_0(carbonAtom); i++)
      if (this.mMol.getConnBondOrder_0(carbonAtom, i) == 2 && this.mMol.getAtomicNo_0(this.mMol.getConnAtom_0(carbonAtom, i)) == 8)
        return true;
    return false;
  };
  _.isAromatic_0 = function isAromatic_0(ringNo) {
    return this.mIsAromatic[ringNo];
  };
  _.isAromaticAtom_0 = function isAromaticAtom_1(atom) {
    return (this.mAtomRingFeatures[atom] & 65536) != 0;
  };
  _.isAromaticBond_0 = function isAromaticBond_1(bond) {
    return (this.mBondRingFeatures[bond] & 65536) != 0;
  };
  _.isAtomMember_0 = function isAtomMember(ringNo, atom) {
    var ringAtom, ringAtom$array, ringAtom$index, ringAtom$max;
    for (ringAtom$array = castTo(this.mRingAtomSet.getAtIndex(ringNo), 6), ringAtom$index = 0, ringAtom$max = ringAtom$array.length; ringAtom$index < ringAtom$max; ++ringAtom$index) {
      ringAtom = ringAtom$array[ringAtom$index];
      if (atom == ringAtom)
        return true;
    }
    return false;
  };
  _.isBondMember_0 = function isBondMember(ringNo, bond) {
    var ringBond, ringBond$array, ringBond$index, ringBond$max;
    for (ringBond$array = castTo(this.mRingBondSet.getAtIndex(ringNo), 6), ringBond$index = 0, ringBond$max = ringBond$array.length; ringBond$index < ringBond$max; ++ringBond$index) {
      ringBond = ringBond$array[ringBond$index];
      if (bond == ringBond)
        return true;
    }
    return false;
  };
  _.isDelocalized_0 = function isDelocalized_0(ringNo) {
    return this.mIsDelocalized[ringNo];
  };
  _.isDelocalizedAtom = function isDelocalizedAtom_0(atom) {
    return (this.mAtomRingFeatures[atom] & 131072) != 0;
  };
  _.isDelocalizedBond_0 = function isDelocalizedBond_2(bond) {
    return (this.mBondRingFeatures[bond] & 131072) != 0;
  };
  _.isHeteroAromaticAtom = function isHeteroAromaticAtom_0(atom) {
    return (this.mAtomRingFeatures[atom] & 262144) != 0;
  };
  _.qualifiesAsAmideTypeBond_0 = function qualifiesAsAmideTypeBond(bond) {
    var atom1, atom2, connAtom, connBond, i, j;
    for (i = 0; i < 2; i++) {
      atom1 = this.mMol.getBondAtom_0(i, bond);
      if (this.mMol.getAtomicNo_0(atom1) == 7 && this.mMol.getConnAtoms_0(atom1) == 2) {
        atom2 = this.mMol.getBondAtom_0(1 - i, bond);
        if (this.mMol.getAtomicNo_0(atom2) == 6) {
          for (j = 0; j < this.mMol.getConnAtoms_0(atom2); j++) {
            connAtom = this.mMol.getConnAtom_0(atom2, j);
            connBond = this.mMol.getConnBond_0(atom2, j);
            if ((this.mMol.getAtomicNo_0(connAtom) == 8 || this.mMol.getAtomicNo_0(connAtom) == 16) && this.mMol.getBondOrder_0(connBond) == 2 && this.mMol.getConnAtoms_0(connAtom) == 1)
              return true;
          }
        }
      }
    }
    return false;
  };
  _.qualifiesAsAromaticAtom = function qualifiesAsAromaticAtom(atom) {
    var atomicNo, atomicNo$array, atomicNo$index, atomicNo$max, list;
    if (this.mMol.isFragment_0()) {
      if (neq(and_0(this.mMol.getAtomQueryFeatures(atom), 1), 0)) {
        return true;
      } else {
        list = this.mMol.getAtomList_0(atom);
        if (jsNotEquals(list, null)) {
          for (atomicNo$array = list, atomicNo$index = 0, atomicNo$max = atomicNo$array.length; atomicNo$index < atomicNo$max; ++atomicNo$index) {
            atomicNo = atomicNo$array[atomicNo$index];
            if (carc2.qualifiesAsAromaticAtomicNo(atomicNo))
              return true;
          }
          return false;
        }
      }
    }
    return carc2.qualifiesAsAromaticAtomicNo(this.mMol.getAtomicNo_0(atom));
  };
  _.qualifiesAsHeteroAtom = function qualifiesAsHeteroAtom(atom) {
    var atomList, atomicNo, atomicNo$array, atomicNo$index, atomicNo$max;
    if (this.mMol.isFragment_0()) {
      if (neq(and_0(this.mMol.getAtomQueryFeatures(atom), 1), 0))
        return false;
      atomList = this.mMol.getAtomList_0(atom);
      if (jsNotEquals(atomList, null)) {
        for (atomicNo$array = atomList, atomicNo$index = 0, atomicNo$max = atomicNo$array.length; atomicNo$index < atomicNo$max; ++atomicNo$index) {
          atomicNo = atomicNo$array[atomicNo$index];
          if (!carc2.isAtomicNoElectronegative(atomicNo))
            return false;
        }
        return true;
      }
    }
    return carc2.isAtomicNoElectronegative(this.mMol.getAtomicNo_0(atom));
  };
  _.qualifiesAsPiBond = function qualifiesAsPiBond(bond) {
    return this.mMol.getBondOrder_0(bond) > 1 || this.mMol.getBondType_0(bond) == 8;
  };
  _.updateAromaticity = function updateAromaticity() {
    var atom, atom$array, atom$array0, atom$index, atom$index0, atom$max, atom$max0, bond, bond$array, bond$array0, bond$index, bond$index0, bond$iterator, bond$max, bond$max0, isHeteroAromatic, ring;
    for (ring = 0; ring < this.mIsAromatic.length; ring++) {
      if (this.mIsAromatic[ring]) {
        isHeteroAromatic = false;
        for (atom$array0 = castTo(this.mRingAtomSet.getAtIndex(ring), 6), atom$index0 = 0, atom$max0 = atom$array0.length; atom$index0 < atom$max0; ++atom$index0) {
          atom = atom$array0[atom$index0];
          this.mAtomRingFeatures[atom] |= 65536;
          if (this.qualifiesAsHeteroAtom(atom))
            isHeteroAromatic = true;
        }
        for (bond$array0 = castTo(this.mRingBondSet.getAtIndex(ring), 6), bond$index0 = 0, bond$max0 = bond$array0.length; bond$index0 < bond$max0; ++bond$index0) {
          bond = bond$array0[bond$index0];
          this.mBondRingFeatures[bond] |= 65536;
        }
        if (this.mIsDelocalized[ring]) {
          for (atom$array = castTo(this.mRingAtomSet.getAtIndex(ring), 6), atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
            atom = atom$array[atom$index];
            this.mAtomRingFeatures[atom] |= 131072;
          }
          for (bond$array = castTo(this.mRingBondSet.getAtIndex(ring), 6), bond$index = 0, bond$max = bond$array.length; bond$index < bond$max; ++bond$index) {
            bond = bond$array[bond$index];
            this.mBondRingFeatures[bond] |= 131072;
          }
        }
        if (isHeteroAromatic) {
          for (atom$array = castTo(this.mRingAtomSet.getAtIndex(ring), 6), atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
            atom = atom$array[atom$index];
            this.mAtomRingFeatures[atom] |= 262144;
          }
          for (bond$array = castTo(this.mRingBondSet.getAtIndex(ring), 6), bond$index = 0, bond$max = bond$array.length; bond$index < bond$max; ++bond$index) {
            bond = bond$array[bond$index];
            this.mBondRingFeatures[bond] |= 262144;
          }
        }
      }
    }
    for (bond$iterator = this.mAzuleneBridgeBonds.iterator(); bond$iterator.hasNext_0(); ) {
      bond = castTo(bond$iterator.next_3(), 35).intValue();
      this.mBondRingFeatures[bond] = 0;
    }
  };
  _.updateRingSize = function updateRingSize(ringAtom, ringBond) {
    var atom, atom$array, atom$index, atom$max, bond, bond$array, bond$index, bond$max, currentSize, ringSize;
    ringSize = ringAtom.length;
    for (atom$array = ringAtom, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
      atom = atom$array[atom$index];
      currentSize = this.mAtomRingFeatures[atom] & 65535;
      if (currentSize == 0 || currentSize > ringSize) {
        this.mAtomRingFeatures[atom] &= ~65535;
        this.mAtomRingFeatures[atom] |= ringSize;
      }
    }
    for (bond$array = ringBond, bond$index = 0, bond$max = bond$array.length; bond$index < bond$max; ++bond$index) {
      bond = bond$array[bond$index];
      currentSize = this.mBondRingFeatures[bond] & 65535;
      if (currentSize == 0 || currentSize > ringSize) {
        this.mBondRingFeatures[bond] &= ~65535;
        this.mBondRingFeatures[bond] |= ringSize;
      }
    }
  };
  _.validateMemberIndex_0 = function validateMemberIndex(ringNo, index_0) {
    var ringSize;
    ringSize = castTo(this.mRingBondSet.getAtIndex(ringNo), 6).length;
    while (index_0 >= ringSize)
      index_0 -= ringSize;
    while (index_0 < 0)
      index_0 += ringSize;
    return index_0;
  };
  _.mMaxSmallRingSize = 0;
  carc2.FEATURES_AROMATIC = 65536;
  carc2.FEATURES_DELOCALIZED = 131072;
  carc2.FEATURES_HETERO_AROMATIC = 262144;
  carc2.FEATURES_RING_SIZE = 65535;
  carc2.MAX_SMALL_RING_COUNT = 1024;
  carc2.MAX_SMALL_RING_SIZE = 7;
  carc2.MODE_AROMATICITY = 4;
  carc2.MODE_INCLUDE_TAUTOMERIC_BONDS = 8;
  carc2.MODE_LARGE_RINGS = 2;
  carc2.MODE_SMALL_AND_LARGE_RINGS = 0;
  carc2.MODE_SMALL_AND_LARGE_RINGS_AND_AROMATICITY = 0;
  carc2.MODE_SMALL_RINGS = 1;
  carc2.MODE_SMALL_RINGS_AND_AROMATICITY = 0;
  carc2.MODE_SMALL_RINGS_ONLY = 1;
  cggl.Lcom_actelion_research_chem_RingCollection_2_classLit = createForClass("com.actelion.research.chem", "RingCollection", 166, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_SSSearcher = function $clinit_SSSearcher() {
    carc2.$clinit_SSSearcher = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.SSSearcher = function SSSearcher2() {
    carc2.$clinit_SSSearcher();
    Object_0.call(this);
    this.$init_43();
    this.mDefaultMatchMode = 8;
    this.mSortedMatchSet = new ju.TreeSet_0(new caru.IntArrayComparator());
  };
  carc2.SSSearcher_0 = function SSSearcher_0(matchMode) {
    carc2.$clinit_SSSearcher();
    Object_0.call(this);
    this.$init_43();
    this.mDefaultMatchMode = matchMode;
    this.mSortedMatchSet = new ju.TreeSet_0(new caru.IntArrayComparator());
  };
  carc2.copyOf_4 = function copyOf_4(original, newLength) {
    var copy;
    copy = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, newLength, 15, 1);
    jl.arraycopy(original, 0, copy, 0, $wnd.Math.min(original.length, newLength));
    return copy;
  };
  carc2.copyOf_5 = function copyOf_5(original, newLength) {
    var copy;
    copy = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, newLength, 16, 1);
    jl.arraycopy(original, 0, copy, 0, $wnd.Math.min(original.length, newLength));
    return copy;
  };
  defineClass(77, 1, { 1: 1 }, carc2.SSSearcher, carc2.SSSearcher_0);
  _.$init_43 = function $init_43() {
  };
  _.addMatchAtoms = function addMatchAtoms() {
    this.mMatchList.add(carc2.copyOf_4(this.mMatchTable, this.mMatchTable.length));
    if (isNotNull(this.mBridgeBondList))
      this.mBridgeBondAtomList.add(carc2.copyOf_5(this.mIsBridgeBondAtom, this.mIsBridgeBondAtom.length));
  };
  _.addMatchIfQualifies = function addMatchIfQualifies(countMode) {
    var atom, atom$array, atom$index, atom$max, existing, existing$iterator, existingIndex, found, sortedMatch;
    if (countMode == 2 || countMode == 5) {
      this.addMatchAtoms();
    } else if (countMode == 4) {
      sortedMatch = this.getSortedMatch(carc2.copyOf_4(this.mMatchTable, this.mMatchTable.length));
      if (!this.mSortedMatchSet.contains(sortedMatch)) {
        this.mSortedMatchSet.add(sortedMatch);
        this.addMatchAtoms();
      }
    } else if (countMode == 3) {
      sortedMatch = this.getSortedMatch(carc2.copyOf_4(this.mMatchTable, this.mMatchTable.length));
      if (!this.mSortedMatchSet.contains(sortedMatch)) {
        found = false;
        for (existing$iterator = this.mSortedMatchSet.iterator(); existing$iterator.hasNext_0(); ) {
          existing = castTo(existing$iterator.next_3(), 6);
          existingIndex = 0;
          for (atom$array = sortedMatch, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
            atom = atom$array[atom$index];
            while (existingIndex < existing.length && existing[existingIndex] < atom)
              existingIndex++;
            if (existingIndex < existing.length) {
              if (atom == existing[existingIndex]) {
                found = true;
                break;
              }
            }
          }
          if (found)
            break;
        }
        if (!found) {
          this.mSortedMatchSet.add(sortedMatch);
          this.addMatchAtoms();
        }
      }
    } else if (countMode == 6) {
      sortedMatch = this.getSortedSymmetryMatch(carc2.copyOf_4(this.mMatchTable, this.mMatchTable.length));
      if (!this.mSortedMatchSet.contains(sortedMatch)) {
        this.mSortedMatchSet.add(sortedMatch);
        this.addMatchAtoms();
      }
    }
  };
  _.areAtomsSimilar = function areAtomsSimilar(moleculeAtom, fragmentAtom) {
    var fragmentConnAtoms, fragmentList, fragmentQF, fragmentRingQF, moleculeConnAtoms, moleculeList, moleculeQF, moleculeRingQF, oxidationState, smallestRingSize, targetRingSize;
    moleculeConnAtoms = this.mMolecule.getConnAtoms_0(moleculeAtom);
    fragmentConnAtoms = this.mFragmentConnAtoms[fragmentAtom];
    if (fragmentConnAtoms > moleculeConnAtoms)
      return false;
    moleculeQF = this.mMolecule.getAtomQueryFeatures(moleculeAtom);
    fragmentQF = this.mFragment.getAtomQueryFeatures(fragmentAtom);
    fragmentList = this.mFragment.getAtomList_0(fragmentAtom);
    moleculeList = this.mMolecule.getAtomList_0(moleculeAtom);
    if (neq(and_0(fragmentQF, 1), 0)) {
      if (jsNotEquals(fragmentList, null)) {
        if (neq(and_0(moleculeQF, 1), 0)) {
          if (jsEquals(moleculeList, null))
            return false;
          if (!this.isSubListOf(fragmentList, moleculeList))
            return false;
        } else {
          if (jsNotEquals(moleculeList, null)) {
            if (this.listsOverlap(moleculeList, fragmentList))
              return false;
          } else {
            if (this.isListMember(this.mMolecule.getAtomicNo_0(moleculeAtom), fragmentList))
              return false;
          }
        }
      }
    } else {
      if (neq(and_0(moleculeQF, 1), 0))
        return false;
      if (jsNotEquals(fragmentList, null)) {
        if (jsNotEquals(moleculeList, null)) {
          if (!this.isSubListOf(moleculeList, fragmentList))
            return false;
        } else {
          if (!this.isListMember(this.mMolecule.getAtomicNo_0(moleculeAtom), fragmentList))
            return false;
        }
      } else {
        if (jsNotEquals(moleculeList, null))
          return false;
        if (this.mMoleculeAtomType[moleculeAtom] != this.mFragmentAtomType[fragmentAtom])
          return false;
      }
    }
    if (neq(or_0(moleculeQF, fragmentQF), 0)) {
      if (neq(and_0(fragmentQF, 2048), 0)) {
        if (this.mMolecule.isFragment_0() && eq(and_0(moleculeQF, 2048), 0))
          return false;
        else if (fragmentConnAtoms != moleculeConnAtoms)
          return false;
      }
      if (neq(and_0(fragmentQF, 4096), 0)) {
        if (fragmentConnAtoms >= moleculeConnAtoms && eq(and_0(moleculeQF, 4096), 0))
          return false;
      }
    }
    if (neq(and_0(this.mMoleculeAtomFeatures[moleculeAtom], not_0(this.mFragmentAtomFeatures[fragmentAtom])), 0))
      return false;
    if (neq(and_0(this.mFragmentRingFeatures[fragmentAtom], not_0(this.mMoleculeRingFeatures[moleculeAtom])), 0))
      return false;
    fragmentRingQF = and_0(fragmentQF, 545460846592);
    if (this.mMolecule.isFragment_0()) {
      moleculeRingQF = and_0(fragmentQF, 545460846592);
      if (neq(moleculeRingQF, 0) && (eq(fragmentRingQF, 0) || neq(and_0(fragmentRingQF, not_0(moleculeRingQF)), 0)))
        return false;
    } else {
      if (neq(fragmentRingQF, 0) && eq(and_0(fragmentRingQF, this.mMoleculeRingFeatures[moleculeAtom]), 0))
        return false;
    }
    if (this.mFragment.getAtomCharge_0(fragmentAtom) != 0 && this.mFragment.getAtomCharge_0(fragmentAtom) != this.mMolecule.getAtomCharge_0(moleculeAtom))
      return false;
    if (this.mFragment.getAtomMass_0(fragmentAtom) != 0 && this.mFragment.getAtomMass_0(fragmentAtom) != this.mMolecule.getAtomMass_0(moleculeAtom))
      return false;
    if (this.mFragment.getAtomRadical_0(fragmentAtom) != 0 && this.mFragment.getAtomRadical_0(fragmentAtom) != this.mMolecule.getAtomRadical_0(moleculeAtom))
      return false;
    oxidationState = and_0(fragmentQF, { l: 0, m: 0, h: 120 });
    if (neq(oxidationState, 0) && this.mMolecule.getOxidationState(moleculeAtom) != toInt_0(shr_0(oxidationState, 47)) - 7)
      return false;
    smallestRingSize = and_0(fragmentQF, 29360128);
    if (neq(smallestRingSize, 0)) {
      smallestRingSize = shr_0(smallestRingSize, 22);
      if (!this.mMolecule.isFragment_0()) {
        return this.mMolecule.getAtomRingSize_0(moleculeAtom) == toInt_0(smallestRingSize);
      } else {
        targetRingSize = toInt_0(shr_0(and_0(this.mMolecule.getAtomQueryFeatures(moleculeAtom), 29360128), 22));
        return toInt_0(smallestRingSize) == targetRingSize;
      }
    }
    return true;
  };
  _.areBondsSimilar = function areBondsSimilar(moleculeBond, fragmentBond) {
    var found, frgBondType, frgBondTypes, frgDefaults, i, molBondType, molDefaults, moleculeRingSize, ringSet, ringSize;
    molDefaults = this.mMoleculeBondFeatures[moleculeBond];
    frgDefaults = this.mFragmentBondFeatures[fragmentBond];
    if ((this.mFragment.getBondQueryFeatures_0(fragmentBond) & 8388608) != 0) {
      molBondType = this.mMolecule.getBondTypeSimple_0(moleculeBond);
      frgBondType = this.mFragment.getBondTypeSimple_0(fragmentBond);
      frgBondTypes = this.mFragment.getBondQueryFeatures_0(fragmentBond) & 127;
      if (molBondType != frgBondType && !(molBondType == 1 && (frgBondTypes & 1) != 0) && !(molBondType == 2 && (frgBondTypes & 2) != 0) && !(molBondType == 4 && (frgBondTypes & 4) != 0) && !(molBondType == 32 && (frgBondTypes & 32) != 0) && !(molBondType == 64 && (frgBondTypes & 64) != 0) && !(molBondType == 16 && (frgBondTypes & 16) != 0) && !(molBondType == 8 && (frgBondTypes & 8) != 0))
        return false;
      molDefaults &= ~127;
      frgDefaults &= ~127;
    }
    if ((molDefaults & ~frgDefaults) != 0)
      return false;
    ringSize = (this.mFragment.getBondQueryFeatures_0(fragmentBond) & 917504) >> 17;
    if (ringSize != 0) {
      if (this.mMolecule.isFragment_0() && ringSize == (this.mMolecule.getBondQueryFeatures_0(fragmentBond) & 917504) >> 17)
        return true;
      if (ringSize <= 2) {
        moleculeRingSize = this.mMolecule.getBondRingSize_0(moleculeBond);
        if (ringSize == 1)
          return moleculeRingSize >= 8 && moleculeRingSize <= 12;
        else
          return moleculeRingSize >= 12;
      }
      found = false;
      ringSet = this.mMolecule.getRingSet_0();
      for (i = 0; i < ringSet.getSize_0(); i++) {
        if (ringSet.getRingSize_0(i) == ringSize) {
          if (ringSet.isBondMember_0(i, moleculeBond)) {
            found = true;
            break;
          }
        }
      }
      if (!found)
        return false;
    }
    return true;
  };
  _.buildBridgeBondList = function buildBridgeBondList() {
    var bond, bridgeBond;
    this.mBridgeBondList = null;
    for (bond = 0; bond < this.mFragment.getBonds_0(); bond++) {
      if (this.mFragment.isBondBridge_0(bond)) {
        if (isNull(this.mBridgeBondList))
          this.mBridgeBondList = new ju.ArrayList();
        bridgeBond = new carc2.SSSearcher$BridgeBond();
        bridgeBond.atom1 = this.mFragment.getBondAtom_0(0, bond);
        bridgeBond.atom2 = this.mFragment.getBondAtom_0(1, bond);
        bridgeBond.minBridgeSize = this.mFragment.getBondBridgeMinSize_0(bond);
        bridgeBond.maxBridgeSize = this.mFragment.getBondBridgeMaxSize_0(bond);
        this.mBridgeBondList.add(bridgeBond);
      }
    }
  };
  _.buildFragmentGraph = function buildFragmentGraph() {
    var atom, atom0, current, excludeGroupNo, excludeGroupNo0, fragmentAtomUsed, fragmentBondUsed, graphAllocation, highest, i, i0, i1;
    this.mFragment.ensureHelperArrays_0(this.mRequiredHelperLevel);
    graphAllocation = $wnd.Math.max(this.mFragment.getAtoms_0(), this.mFragment.getBonds_0()) + 16;
    this.mFragmentGraphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, graphAllocation, 15, 1);
    this.mFragmentGraphParentAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, graphAllocation, 15, 1);
    this.mFragmentGraphParentBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, graphAllocation, 15, 1);
    this.mFragmentGraphIsRingClosure = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, graphAllocation + 1, 16, 1);
    fragmentAtomUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mFragment.getAtoms_0(), 16, 1);
    fragmentBondUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mFragment.getBonds_0(), 16, 1);
    current = 0;
    for (atom0 = 0; atom0 < this.mFragment.getAtoms_0(); atom0++) {
      if (!this.mIsExcludeAtom[atom0] && !fragmentAtomUsed[atom0]) {
        this.mFragmentGraphAtom[current] = atom0;
        this.mFragmentGraphParentBond[current] = -1;
        this.mFragmentGraphParentAtom[current] = -1;
        highest = current;
        while (current <= highest) {
          for (i = 0; i < this.mFragment.getAllConnAtomsPlusMetalBonds_0(this.mFragmentGraphAtom[current]); i++)
            highest = this.tryAddCandidate(current, highest, i, fragmentAtomUsed, fragmentBondUsed, -1);
          while (this.mFragmentGraphIsRingClosure[++current])
            ;
        }
      }
    }
    this.mFragmentGraphSize = current;
    if (this.mFragmentExcludeAtoms != 0) {
      highest = this.mFragmentGraphSize - 1;
      for (excludeGroupNo0 = 0; excludeGroupNo0 < this.mExcludeGroupCount; excludeGroupNo0++) {
        current = 0;
        while (current <= highest) {
          for (i0 = 0; i0 < this.mFragment.getAllConnAtomsPlusMetalBonds_0(this.mFragmentGraphAtom[current]); i0++)
            highest = this.tryAddCandidate(current, highest, i0, fragmentAtomUsed, fragmentBondUsed, excludeGroupNo0);
          while (this.mFragmentGraphIsRingClosure[++current])
            ;
        }
      }
      for (atom = 0; atom < this.mFragment.getAtoms_0(); atom++) {
        if (this.mIsExcludeAtom[atom] && !fragmentAtomUsed[atom]) {
          this.mFragmentGraphAtom[current] = atom;
          this.mFragmentGraphParentBond[current] = -1;
          this.mFragmentGraphParentAtom[current] = -1;
          highest = current;
          while (current <= highest) {
            for (i0 = 0; i0 < this.mFragment.getAllConnAtomsPlusMetalBonds_0(this.mFragmentGraphAtom[current]); i0++)
              if (this.mFragment.getConnAtom_0(this.mFragmentGraphAtom[current], i0) < this.mFragment.getAtoms_0())
                highest = this.tryAddCandidate(current, highest, i0, fragmentAtomUsed, fragmentBondUsed, this.mExcludeGroupNo[atom]);
            while (this.mFragmentGraphIsRingClosure[++current])
              ;
          }
        }
      }
      this.mExcludeGroupGraphIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mExcludeGroupCount, 15, 1);
      for (i1 = 0; i1 < this.mExcludeGroupCount; i1++)
        this.mExcludeGroupGraphIndex[i1] = -1;
      for (i = this.mFragmentGraphSize; i < current; i++) {
        excludeGroupNo = this.mExcludeGroupNo[this.mFragmentGraphAtom[i]];
        if (this.mExcludeGroupGraphIndex[excludeGroupNo] == -1)
          this.mExcludeGroupGraphIndex[excludeGroupNo] = i;
      }
    }
    this.mFragmentGraphSizeWithExcludeGroups = current;
  };
  _.calculateImplicitSmallRingBondParity = function calculateImplicitSmallRingBondParity(moleculeBond) {
    var atom, bondAtom, i, j, memberCount, r, relevantAtom, ringSet;
    ringSet = this.mMolecule.getRingSet_0();
    for (r = 0; r < ringSet.getSize_0(); r++) {
      if (ringSet.isBondMember_0(r, moleculeBond)) {
        relevantAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
        for (i = 0; i < 2; i++) {
          relevantAtom[i] = 2147483647;
          bondAtom = this.mMolecule.getBondAtom_0(i, moleculeBond);
          for (j = 0; j < this.mMolecule.getConnAtoms_0(bondAtom); j++) {
            atom = this.mMolecule.getConnAtom_0(bondAtom, j);
            if (atom != this.mMolecule.getBondAtom_0(1 - i, moleculeBond) && relevantAtom[i] > atom)
              relevantAtom[i] = atom;
          }
        }
        memberCount = 0;
        if (ringSet.isAtomMember_0(r, relevantAtom[0]))
          memberCount++;
        if (ringSet.isAtomMember_0(r, relevantAtom[1]))
          memberCount++;
        if (memberCount == 2)
          return 2;
        if (memberCount == 1)
          return 1;
        return 2;
      }
    }
    return 0;
  };
  _.doBridgeBondsMatch = function doBridgeBondsMatch(moleculeAtomUsed, excludeGroupNo) {
    var bb, bb$iterator, bridgeSize, i, pathAtom;
    if (isNotNull(this.mBridgeBondList)) {
      this.mIsBridgeBondAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, moleculeAtomUsed.length, 16, 1);
      for (bb$iterator = this.mBridgeBondList.iterator(); bb$iterator.hasNext_0(); ) {
        bb = castTo(bb$iterator.next_3(), 202);
        if (jsEquals(this.mExcludeGroupNo, null) || excludeGroupNo == -1 && this.mExcludeGroupNo[bb.atom1] == -1 && this.mExcludeGroupNo[bb.atom2] == -1 || excludeGroupNo != -1 && (this.mExcludeGroupNo[bb.atom1] == excludeGroupNo || this.mExcludeGroupNo[bb.atom2] == excludeGroupNo)) {
          pathAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, bb.maxBridgeSize + 2, 15, 1);
          bridgeSize = this.mMolecule.getPath_1(pathAtom, this.mMatchTable[bb.atom1], this.mMatchTable[bb.atom2], bb.maxBridgeSize + 1, moleculeAtomUsed, null) - 1;
          if (bridgeSize < bb.minBridgeSize || bridgeSize > bb.maxBridgeSize)
            return false;
          for (i = 1; i <= bridgeSize; i++)
            this.mIsBridgeBondAtom[pathAtom[i]] = true;
        }
      }
    }
    return true;
  };
  _.doEZParitiesMatch = function doEZParitiesMatch(excludeGroupNo) {
    var fragmentAtom1, fragmentAtom2, fragmentBond, fragmentParity, moleculeAtom1, moleculeAtom2, moleculeBond, moleculeParity;
    for (fragmentBond = 0; fragmentBond < this.mFragment.getBonds_0(); fragmentBond++) {
      if ((this.mFragment.getBondQueryFeatures_0(fragmentBond) & 1048576) != 0) {
        fragmentParity = this.mFragment.getBondParity_0(fragmentBond);
        if (fragmentParity == 0)
          continue;
        fragmentAtom1 = this.mFragment.getBondAtom_0(0, fragmentBond);
        fragmentAtom2 = this.mFragment.getBondAtom_0(1, fragmentBond);
        if (jsEquals(this.mExcludeGroupNo, null) || excludeGroupNo == -1 && this.mExcludeGroupNo[fragmentAtom1] == -1 && this.mExcludeGroupNo[fragmentAtom2] == -1 || excludeGroupNo != -1 && (this.mExcludeGroupNo[fragmentAtom1] == excludeGroupNo || this.mExcludeGroupNo[fragmentAtom2] == excludeGroupNo)) {
          moleculeAtom1 = this.mMatchTable[fragmentAtom1];
          moleculeAtom2 = this.mMatchTable[fragmentAtom2];
          moleculeBond = this.mMolecule.getBond_0(moleculeAtom1, moleculeAtom2);
          moleculeParity = this.mMolecule.getBondParity_0(moleculeBond);
          if (moleculeParity == 0) {
            if (this.mMolecule.isSmallRingBond_0(moleculeBond))
              moleculeParity = this.calculateImplicitSmallRingBondParity(moleculeBond);
            if (moleculeParity == 0)
              continue;
          }
          if (fragmentParity == 3)
            continue;
          if (moleculeParity == 3)
            continue;
          if (this.isEZParityInversion(fragmentBond, moleculeBond) == (fragmentParity == moleculeParity))
            return false;
        }
      }
    }
    return true;
  };
  _.doTHParitiesMatch = function doTHParitiesMatch(excludeGroupNo) {
    var baseGroupAndType, baseParityComparison, esrAtom, esrAtomIndex, esrGroupAtomCount, fragmentAtom, fragmentAtom0, fragmentAtom1, fragmentBaseAtom, fragmentParity, moleculeAtom, moleculeBaseAtom, moleculeParity, parityComparison;
    esrGroupAtomCount = 0;
    for (fragmentAtom0 = 0; fragmentAtom0 < this.mFragment.getAtoms_0(); fragmentAtom0++) {
      if ((jsEquals(this.mExcludeGroupNo, null) || this.mExcludeGroupNo[fragmentAtom0] == excludeGroupNo) && neq(and_0(this.mFragment.getAtomQueryFeatures(fragmentAtom0), 8192), 0)) {
        moleculeAtom = this.mMatchTable[fragmentAtom0];
        fragmentParity = this.mFragment.getAtomParity_0(fragmentAtom0);
        moleculeParity = this.mMolecule.getAtomParity_0(moleculeAtom);
        if (fragmentParity == 0)
          continue;
        if (fragmentParity == 3)
          continue;
        if (moleculeParity == 0 || moleculeParity == 3)
          return false;
        if (this.mFragment.getAtomESRType_0(fragmentAtom0) == 1) {
          esrGroupAtomCount++;
          continue;
        }
        if (this.mMolecule.getAtomESRType_0(moleculeAtom) == 1)
          return false;
        if (this.mFragment.getAtomESRType_0(fragmentAtom0) == 2) {
          esrGroupAtomCount++;
          continue;
        }
        if (this.mMolecule.getAtomESRType_0(moleculeAtom) == 2)
          return false;
        if (this.isTHParityInversion(fragmentAtom0) == (fragmentParity == moleculeParity))
          return false;
      }
    }
    if (esrGroupAtomCount != 0) {
      esrAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, esrGroupAtomCount, 15, 1);
      esrAtomIndex = 0;
      for (fragmentAtom1 = 0; fragmentAtom1 < this.mFragment.getAtoms_0(); fragmentAtom1++) {
        if ((jsEquals(this.mExcludeGroupNo, null) || this.mExcludeGroupNo[fragmentAtom1] == excludeGroupNo) && neq(and_0(this.mFragment.getAtomQueryFeatures(fragmentAtom1), 8192), 0)) {
          fragmentParity = this.mFragment.getAtomParity_0(fragmentAtom1);
          if (fragmentParity != 0 && fragmentParity != 3) {
            esrAtom[esrAtomIndex++] = this.mFragment.getAtomESRGroup_0(fragmentAtom1) << 24 | this.mFragment.getAtomESRType_0(fragmentAtom1) << 22 | fragmentAtom1;
          }
        }
      }
      ju.sort_3(esrAtom);
      esrAtomIndex = 0;
      while (esrAtomIndex < esrAtom.length) {
        fragmentBaseAtom = esrAtom[esrAtomIndex] & 4194303;
        moleculeBaseAtom = this.mMatchTable[fragmentBaseAtom];
        baseGroupAndType = esrAtom[esrAtomIndex] & -4194304;
        baseParityComparison = this.isTHParityInversion(fragmentBaseAtom) ^ this.mFragment.getAtomParity_0(fragmentBaseAtom) == this.mMolecule.getAtomParity_0(moleculeBaseAtom);
        for (esrAtomIndex++; esrAtomIndex < esrAtom.length && (esrAtom[esrAtomIndex] & -4194304) == baseGroupAndType; esrAtomIndex++) {
          fragmentAtom = esrAtom[esrAtomIndex] & 4194303;
          moleculeAtom = this.mMatchTable[fragmentAtom];
          if (this.mMolecule.getAtomESRType_0(moleculeAtom) != this.mMolecule.getAtomESRType_0(moleculeBaseAtom) || this.mMolecule.getAtomESRGroup_0(moleculeAtom) != this.mMolecule.getAtomESRGroup_0(moleculeBaseAtom))
            return false;
          parityComparison = this.isTHParityInversion(fragmentAtom) ^ this.mFragment.getAtomParity_0(fragmentAtom) == this.mMolecule.getAtomParity_0(moleculeAtom);
          if (parityComparison != baseParityComparison)
            return false;
        }
      }
    }
    return true;
  };
  _.findFragmentInMolecule = function findFragmentInMolecule(countMode, matchMode) {
    return this.findFragmentInMolecule_0(countMode, matchMode, null);
  };
  _.findFragmentInMolecule_0 = function findFragmentInMolecule_0(countMode, matchMode, atomExcluded) {
    var atom, atomUsed, candidate, current, excludeGroup, index_0, isExcludedMatch, maxIndex;
    this.mStop = false;
    this.mMatchList = new ju.ArrayList();
    this.mBridgeBondAtomList = new ju.ArrayList();
    this.mSortedMatchSet.clear();
    if (isNull(this.mMolecule) || isNull(this.mFragment))
      return 0;
    if (this.mFragment.getAtoms_0() - this.mFragmentExcludeAtoms > this.mMolecule.getAtoms_0() || this.mFragment.getBonds_0() - this.mFragmentExcludeBonds > this.mMolecule.getBonds_0())
      return 0;
    if (this.mFragment.getAtoms_0() == 0)
      return 0;
    if (countMode == 6)
      this.mRequiredHelperLevel = 63;
    this.setupAtomAndBondFeatures(matchMode);
    atomUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMolecule.getAtoms_0(), 16, 1);
    if (jsNotEquals(atomExcluded, null))
      for (atom = 0; atom < this.mMolecule.getAtoms_0(); atom++)
        atomUsed[atom] = atomExcluded[atom];
    this.mMatchTable = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mFragment.getAtoms_0(), 15, 1);
    ju.fill_0(this.mMatchTable, -1);
    index_0 = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mFragmentGraphSizeWithExcludeGroups, 15, 1);
    ju.fill_0(index_0, -1);
    current = 0;
    while (!this.mStop) {
      if (this.mFragmentGraphSize != 0) {
        maxIndex = this.mFragmentGraphParentAtom[current] == -1 ? this.mMolecule.getAtoms_0() : this.mMolecule.getAllConnAtomsPlusMetalBonds_0(this.mMatchTable[this.mFragmentGraphParentAtom[current]]);
        index_0[current]++;
        if (index_0[current] == maxIndex) {
          index_0[current] = -1;
          if (current == 0)
            break;
          current--;
          if (!this.mFragmentGraphIsRingClosure[current])
            atomUsed[this.mMatchTable[this.mFragmentGraphAtom[current]]] = false;
          continue;
        }
        if (this.mFragmentGraphParentAtom[current] == -1) {
          if (!atomUsed[index_0[current]]) {
            if (this.areAtomsSimilar(index_0[current], this.mFragmentGraphAtom[current])) {
              this.mMatchTable[this.mFragmentGraphAtom[current]] = index_0[current];
              atomUsed[index_0[current]] = true;
              current++;
            }
          }
        } else {
          if (this.mMolecule.getConnAtom_0(this.mMatchTable[this.mFragmentGraphParentAtom[current]], index_0[current]) >= this.mMolecule.getAtoms_0())
            continue;
          candidate = this.mMolecule.getConnAtom_0(this.mMatchTable[this.mFragmentGraphParentAtom[current]], index_0[current]);
          if (!this.mFragmentGraphIsRingClosure[current]) {
            if (!atomUsed[candidate]) {
              if (this.areAtomsSimilar(candidate, this.mFragmentGraphAtom[current]) && this.areBondsSimilar(this.mMolecule.getConnBond_0(this.mMatchTable[this.mFragmentGraphParentAtom[current]], index_0[current]), this.mFragmentGraphParentBond[current])) {
                atomUsed[candidate] = true;
                this.mMatchTable[this.mFragmentGraphAtom[current]] = candidate;
                current++;
              }
            }
          } else {
            if (candidate == this.mMatchTable[this.mFragmentGraphAtom[current]] && this.areBondsSimilar(this.mMolecule.getConnBond_0(this.mMatchTable[this.mFragmentGraphParentAtom[current]], index_0[current]), this.mFragmentGraphParentBond[current])) {
              current++;
            }
          }
        }
      }
      if (current == this.mFragmentGraphSize) {
        if (this.doTHParitiesMatch(-1) && this.doEZParitiesMatch(-1) && this.doBridgeBondsMatch(atomUsed, -1)) {
          isExcludedMatch = false;
          for (excludeGroup = 0; excludeGroup < this.mExcludeGroupCount; excludeGroup++) {
            if (this.isExcludeGroupMatch(atomUsed, index_0, excludeGroup)) {
              isExcludedMatch = true;
              break;
            }
          }
          if (countMode == 1 && !isExcludedMatch)
            return 1;
          if (!isExcludedMatch) {
            this.addMatchIfQualifies(countMode);
            if (countMode == 2)
              return 1;
          }
        }
        if (current == 0)
          break;
        current--;
        if (!this.mFragmentGraphIsRingClosure[current])
          atomUsed[this.mMatchTable[this.mFragmentGraphAtom[current]]] = false;
      }
    }
    return this.mMatchList.size();
  };
  _.getAtomQueryDefaults = function getAtomQueryDefaults(mol, atom) {
    var charge, eValue, hydrogens, neighbours, piElectrons, queryDefaults, ringBonds;
    queryDefaults = 0;
    if (!mol.isFragment_0()) {
      if (mol.isHeteroAromaticAtom(atom))
        queryDefaults = or_0(queryDefaults, or_0(2, { l: 0, m: 0, h: 4 }));
      else if (mol.isAromaticAtom_0(atom))
        queryDefaults = or_0(queryDefaults, 2);
      else
        queryDefaults = or_0(queryDefaults, 4);
      if (mol.isAtomStereoCenter_0(atom))
        queryDefaults = or_0(queryDefaults, { l: 0, m: 0, h: 1 });
      else
        queryDefaults = or_0(queryDefaults, { l: 0, m: 0, h: 2 });
      ringBonds = mol.getAtomRingBondCount_0(atom);
      if (ringBonds == 0)
        queryDefaults = or_0(queryDefaults, or_0(or_0(16, 32), 64));
      else if (ringBonds == 2)
        queryDefaults = or_0(queryDefaults, or_0(or_0(8, 32), 64));
      else if (ringBonds == 3)
        queryDefaults = or_0(queryDefaults, or_0(or_0(8, 16), 64));
      else
        queryDefaults = or_0(queryDefaults, or_0(or_0(8, 16), 32));
      charge = mol.getAtomCharge_0(atom);
      if (charge == 0)
        queryDefaults = or_0(queryDefaults, or_0(33554432, 134217728));
      else if (charge < 0)
        queryDefaults = or_0(queryDefaults, or_0(67108864, 134217728));
      else
        queryDefaults = or_0(queryDefaults, or_0(67108864, 33554432));
      hydrogens = mol.getAllHydrogens_0(atom);
      switch (hydrogens) {
        case 0:
          queryDefaults = or_0(queryDefaults, and_0(1920, not_0(128)));
          break;
        case 1:
          queryDefaults = or_0(queryDefaults, and_0(1920, not_0(256)));
          break;
        case 2:
          queryDefaults = or_0(queryDefaults, and_0(1920, not_0(512)));
          break;
        default:
          queryDefaults = or_0(queryDefaults, and_0(1920, not_0(1024)));
          break;
      }
      neighbours = mol.getConnAtoms_0(atom);
      switch (neighbours) {
        case 0:
          queryDefaults = or_0(queryDefaults, and_0(4063232, not_0(131072)));
          break;
        case 1:
          queryDefaults = or_0(queryDefaults, and_0(4063232, not_0(262144)));
          break;
        case 2:
          queryDefaults = or_0(queryDefaults, and_0(4063232, not_0(524288)));
          break;
        case 3:
          queryDefaults = or_0(queryDefaults, and_0(4063232, not_0(1048576)));
          break;
        default:
          queryDefaults = or_0(queryDefaults, and_0(4063232, not_0(2097152)));
          break;
      }
      eValue = mol.getAtomElectronegativeNeighbours(atom);
      switch (eValue) {
        case 0:
          queryDefaults = or_0(queryDefaults, and_0(17042430230528, not_0(549755813888)));
          break;
        case 1:
          queryDefaults = or_0(queryDefaults, and_0(17042430230528, not_0(1099511627776)));
          break;
        case 2:
          queryDefaults = or_0(queryDefaults, and_0(17042430230528, not_0(2199023255552)));
          break;
        case 3:
          queryDefaults = or_0(queryDefaults, and_0(17042430230528, not_0(4398046511104)));
          break;
        default:
          queryDefaults = or_0(queryDefaults, and_0(17042430230528, not_0(8796093022208)));
          break;
      }
      piElectrons = mol.getAtomPi_0(atom);
      switch (piElectrons) {
        case 0:
          queryDefaults = or_0(queryDefaults, or_0(32768, 65536));
          break;
        case 1:
          queryDefaults = or_0(queryDefaults, or_0(16384, 65536));
          break;
        default:
          queryDefaults = or_0(queryDefaults, or_0(16384, 32768));
          break;
      }
    } else {
      if (mol.isHeteroAromaticAtom(atom))
        queryDefaults = or_0(queryDefaults, or_0(2, { l: 0, m: 0, h: 4 }));
      else if (mol.isAromaticAtom_0(atom))
        queryDefaults = or_0(queryDefaults, 2);
      ringBonds = mol.getAtomRingBondCount_0(atom);
      if (ringBonds != 0) {
        queryDefaults = or_0(queryDefaults, 8);
        if (ringBonds > 2)
          queryDefaults = or_0(queryDefaults, 16);
        if (ringBonds > 3)
          queryDefaults = or_0(queryDefaults, 32);
      }
      charge = mol.getAtomCharge_0(atom);
      if (charge < 0)
        queryDefaults = or_0(queryDefaults, or_0(67108864, 134217728));
      else if (charge > 0)
        queryDefaults = or_0(queryDefaults, or_0(67108864, 33554432));
      neighbours = mol.getConnAtoms_0(atom);
      switch (neighbours) {
        case 0:
          break;
        case 1:
          queryDefaults = or_0(queryDefaults, 131072);
          break;
        case 2:
          queryDefaults = or_0(queryDefaults, or_0(131072, 262144));
          break;
        case 3:
          queryDefaults = or_0(queryDefaults, or_0(or_0(131072, 262144), 524288));
          break;
        default:
          queryDefaults = or_0(queryDefaults, and_0(4063232, not_0(2097152)));
          break;
      }
      eValue = mol.getAtomElectronegativeNeighbours(atom);
      switch (eValue) {
        case 0:
          break;
        case 1:
          queryDefaults = or_0(queryDefaults, 549755813888);
          break;
        case 2:
          queryDefaults = or_0(queryDefaults, or_0(549755813888, 1099511627776));
          break;
        case 3:
          queryDefaults = or_0(queryDefaults, or_0(or_0(549755813888, 1099511627776), 2199023255552));
          break;
        default:
          queryDefaults = or_0(queryDefaults, and_0(17042430230528, not_0(8796093022208)));
          break;
      }
      piElectrons = mol.getAtomPi_0(atom);
      if (piElectrons > 0)
        queryDefaults = or_0(queryDefaults, 16384);
      if (piElectrons > 1)
        queryDefaults = or_0(queryDefaults, 32768);
    }
    return queryDefaults;
  };
  _.getBondQueryDefaults = function getBondQueryDefaults(mol, bond) {
    var queryDefaults;
    queryDefaults = 0;
    if (mol.isDelocalizedBond_0(bond) || mol.getBondType_0(bond) == 8)
      queryDefaults |= 8;
    else
      switch (mol.getBondOrder_0(bond)) {
        case 0:
          queryDefaults |= 16;
          break;
        case 1:
          queryDefaults |= 1;
          break;
        case 2:
          queryDefaults |= 2;
          break;
        case 3:
          queryDefaults |= 4;
          break;
        case 4:
          queryDefaults |= 32;
          break;
        case 5:
          queryDefaults |= 64;
          break;
      }
    if (mol.isRingBond_0(bond))
      queryDefaults |= 256;
    else if (!mol.isFragment_0())
      queryDefaults |= 128;
    if (mol.isAromaticBond_0(bond))
      queryDefaults |= 2097152;
    else if (!mol.isFragment_0())
      queryDefaults |= 4194304;
    return queryDefaults;
  };
  _.getMatchList = function getMatchList() {
    return this.mMatchList;
  };
  _.getSortedMatch = function getSortedMatch(match_0) {
    var atom, atom$array, atom$array0, atom$index, atom$index0, atom$max, atom$max0, count, index_0, oldMatch;
    count = 0;
    for (atom$array0 = match_0, atom$index0 = 0, atom$max0 = atom$array0.length; atom$index0 < atom$max0; ++atom$index0) {
      atom = atom$array0[atom$index0];
      if (atom == -1)
        count++;
    }
    if (count != 0) {
      oldMatch = match_0;
      match_0 = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, oldMatch.length - count, 15, 1);
      index_0 = 0;
      for (atom$array = oldMatch, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
        atom = atom$array[atom$index];
        if (atom != -1)
          match_0[index_0++] = atom;
      }
    }
    ju.sort_3(match_0);
    return match_0;
  };
  _.getSortedSymmetryMatch = function getSortedSymmetryMatch(match_0) {
    var atom, atom$array, atom$index, atom$max, count, i, index_0, symmetryMatch;
    count = 0;
    for (atom$array = match_0, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
      atom = atom$array[atom$index];
      if (atom == -1)
        count++;
    }
    symmetryMatch = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, match_0.length - count, 15, 1);
    index_0 = 0;
    for (i = 0; i < match_0.length; i++) {
      if (match_0[i] != -1) {
        symmetryMatch[index_0] = this.mFragment.getSymmetryRank_0(i) << 16 | this.mMolecule.getSymmetryRank_0(match_0[i]);
        if (jsNotEquals(this.mFragmentAtomContextRank, null))
          symmetryMatch[index_0] |= this.mFragmentAtomContextRank[i] << 24;
        index_0++;
      }
    }
    ju.sort_3(symmetryMatch);
    return symmetryMatch;
  };
  _.isEZParityInversion = function isEZParityInversion(fragmentBond, moleculeBond) {
    var fragmentAtom, fragmentNeighbour, i, inversion, j, j0, lowFragmentNeighbour, lowMoleculeNeighbour, moleculeAtom, moleculeNeighbour, otherFragmentAtom, otherMoleculeAtom;
    inversion = false;
    for (i = 0; i < 2; i++) {
      fragmentAtom = this.mFragment.getBondAtom_0(i, fragmentBond);
      moleculeAtom = this.mMatchTable[fragmentAtom];
      if (this.mMolecule.getConnAtoms_0(moleculeAtom) > 2) {
        otherFragmentAtom = this.mFragment.getBondAtom_0(1 - i, fragmentBond);
        lowFragmentNeighbour = 2147483647;
        for (j0 = 0; j0 < this.mFragment.getConnAtoms_0(fragmentAtom); j0++) {
          fragmentNeighbour = this.mFragment.getConnAtom_0(fragmentAtom, j0);
          if (fragmentNeighbour != otherFragmentAtom && lowFragmentNeighbour > fragmentNeighbour)
            lowFragmentNeighbour = fragmentNeighbour;
        }
        otherMoleculeAtom = this.mMatchTable[otherFragmentAtom];
        lowMoleculeNeighbour = 2147483647;
        for (j = 0; j < this.mMolecule.getConnAtoms_0(moleculeAtom); j++) {
          moleculeNeighbour = this.mMolecule.getConnAtom_0(moleculeAtom, j);
          if (moleculeNeighbour != otherMoleculeAtom && lowMoleculeNeighbour > moleculeNeighbour)
            lowMoleculeNeighbour = moleculeNeighbour;
        }
        if (this.mMatchTable[lowFragmentNeighbour] != lowMoleculeNeighbour)
          inversion = !inversion;
      }
    }
    return inversion;
  };
  _.isExcludeGroupMatch = function isExcludeGroupMatch(atomUsed, index_0, excludeGroupNo) {
    var atom, candidate, current, excludeGroupGraphBase, excludeGroupGraphMax, i, i0, maxIndex;
    excludeGroupGraphBase = this.mExcludeGroupGraphIndex[excludeGroupNo];
    excludeGroupGraphMax = excludeGroupGraphBase + 1;
    while (excludeGroupGraphMax < this.mFragmentGraphSizeWithExcludeGroups && this.mExcludeGroupNo[this.mFragmentGraphAtom[excludeGroupGraphMax]] == excludeGroupNo)
      excludeGroupGraphMax++;
    for (i0 = excludeGroupGraphBase; i0 < excludeGroupGraphMax; i0++)
      index_0[i0] = -1;
    current = excludeGroupGraphBase;
    while (true) {
      maxIndex = this.mFragmentGraphParentAtom[current] == -1 ? this.mMolecule.getAtoms_0() : this.mMolecule.getAllConnAtomsPlusMetalBonds_0(this.mMatchTable[this.mFragmentGraphParentAtom[current]]);
      index_0[current]++;
      if (index_0[current] == maxIndex) {
        index_0[current] = -1;
        if (current == excludeGroupGraphBase)
          break;
        current--;
        if (!this.mFragmentGraphIsRingClosure[current]) {
          atomUsed[this.mMatchTable[this.mFragmentGraphAtom[current]]] = false;
          this.mMatchTable[this.mFragmentGraphAtom[current]] = -1;
        }
        continue;
      }
      if (this.mFragmentGraphParentAtom[current] == -1) {
        if (!atomUsed[index_0[current]]) {
          if (this.areAtomsSimilar(index_0[current], this.mFragmentGraphAtom[current])) {
            this.mMatchTable[this.mFragmentGraphAtom[current]] = index_0[current];
            atomUsed[index_0[current]] = true;
            current++;
          }
        }
      } else {
        if (this.mMolecule.getConnAtom_0(this.mMatchTable[this.mFragmentGraphParentAtom[current]], index_0[current]) >= this.mMolecule.getAtoms_0())
          continue;
        candidate = this.mMolecule.getConnAtom_0(this.mMatchTable[this.mFragmentGraphParentAtom[current]], index_0[current]);
        if (!this.mFragmentGraphIsRingClosure[current]) {
          if (!atomUsed[candidate]) {
            if (this.areAtomsSimilar(candidate, this.mFragmentGraphAtom[current]) && this.areBondsSimilar(this.mMolecule.getConnBond_0(this.mMatchTable[this.mFragmentGraphParentAtom[current]], index_0[current]), this.mFragmentGraphParentBond[current])) {
              atomUsed[candidate] = true;
              this.mMatchTable[this.mFragmentGraphAtom[current]] = candidate;
              current++;
            }
          }
        } else {
          if (candidate == this.mMatchTable[this.mFragmentGraphAtom[current]] && this.areBondsSimilar(this.mMolecule.getConnBond_0(this.mMatchTable[this.mFragmentGraphParentAtom[current]], index_0[current]), this.mFragmentGraphParentBond[current])) {
            current++;
          }
        }
      }
      if (current == excludeGroupGraphMax) {
        if (this.doTHParitiesMatch(excludeGroupNo) && this.doEZParitiesMatch(excludeGroupNo) && this.doBridgeBondsMatch(atomUsed, excludeGroupNo)) {
          for (i = excludeGroupGraphBase; i < excludeGroupGraphMax; i++) {
            if (!this.mFragmentGraphIsRingClosure[i]) {
              atom = this.mFragmentGraphAtom[i];
              atomUsed[this.mMatchTable[atom]] = false;
              this.mMatchTable[atom] = -1;
            }
          }
          return true;
        }
        current--;
        if (!this.mFragmentGraphIsRingClosure[current]) {
          atomUsed[this.mMatchTable[this.mFragmentGraphAtom[current]]] = false;
          this.mMatchTable[this.mFragmentGraphAtom[current]] = -1;
        }
      }
    }
    return false;
  };
  _.isFragmentInMolecule_0 = function isFragmentInMolecule() {
    return this.findFragmentInMolecule(1, this.mDefaultMatchMode) > 0;
  };
  _.isFragmentInMolecule_1 = function isFragmentInMolecule_0(matchMode) {
    return this.findFragmentInMolecule(1, matchMode) > 0;
  };
  _.isListMember = function isListMember(atomicNo, list) {
    var i;
    for (i = 0; i < list.length; i++)
      if (list[i] == atomicNo)
        return true;
    return false;
  };
  _.isSubListOf = function isSubListOf(list1, list2) {
    var atomicNo1, i1, i2;
    i2 = 0;
    for (i1 = 0; i1 < list1.length; i1++) {
      atomicNo1 = list1[i1];
      while (list2[i2] < atomicNo1) {
        i2++;
        if (i2 == list2.length)
          return false;
      }
      if (list2[i2] > atomicNo1)
        return false;
    }
    return true;
  };
  _.isTHParityInversion = function isTHParityInversion(fragmentAtom) {
    var connAtom, connAtom1, connAtom2, i, inversion, j, neighbour, neighbours;
    inversion = false;
    if (this.mFragment.getAtomPi_0(fragmentAtom) == 0) {
      for (i = 1; i < this.mFragment.getConnAtoms_0(fragmentAtom); i++) {
        for (j = 0; j < i; j++) {
          connAtom1 = this.mFragment.getConnAtom_0(fragmentAtom, i);
          connAtom2 = this.mFragment.getConnAtom_0(fragmentAtom, j);
          if (this.mMatchTable[connAtom1] > this.mMatchTable[connAtom2] ^ connAtom1 > connAtom2)
            inversion = !inversion;
        }
      }
    } else {
      for (i = 0; i < this.mFragment.getConnAtoms_0(fragmentAtom); i++) {
        connAtom = this.mFragment.getConnAtom_0(fragmentAtom, i);
        neighbours = 0;
        neighbour = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
        for (j = 0; j < this.mFragment.getConnAtoms_0(connAtom); j++) {
          neighbour[neighbours] = this.mFragment.getConnAtom_0(connAtom, j);
          if (neighbour[neighbours] != fragmentAtom)
            neighbours++;
        }
        if (neighbours == 2 && this.mMatchTable[neighbour[0]] > this.mMatchTable[neighbour[1]] ^ neighbour[0] > neighbour[1])
          inversion = !inversion;
      }
    }
    return inversion;
  };
  _.listsOverlap = function listsOverlap(list1, list2) {
    var atomicNo1, atomicNo2, i1, i2;
    i1 = 0;
    i2 = 0;
    while (i1 < list1.length && i2 < list2.length) {
      atomicNo1 = list1[i1];
      atomicNo2 = list2[i2];
      if (atomicNo1 == atomicNo2)
        return true;
      if (atomicNo1 < atomicNo2)
        i1++;
      else
        i2++;
    }
    return false;
  };
  _.setFragment_1 = function setFragment_0(fragment) {
    var atom, atom0, atom1, bond, bond0;
    if (isNull(fragment) || fragment.getAllAtoms_0() == 0 || !fragment.isFragment_0()) {
      this.mFragment = null;
      return;
    }
    this.mFragment = fragment;
    this.mFragmentFeaturesValid = false;
    this.mFragment.ensureHelperArrays_0(1);
    this.mRequiredHelperLevel = 7;
    for (atom0 = 0; atom0 < this.mFragment.getAtoms_0(); atom0++)
      if (neq(and_0(this.mFragment.getAtomQueryFeatures(atom0), or_0({ l: 0, m: 0, h: 3 }, 8192)), 0))
        this.mRequiredHelperLevel = 15;
    for (bond0 = 0; bond0 < this.mFragment.getBonds_0(); bond0++)
      if ((this.mFragment.getBondQueryFeatures_0(bond0) & 1048576) != 0)
        this.mRequiredHelperLevel = 15;
    if (this.mMoleculeFeaturesValid && this.mRequiredHelperLevel != 7)
      this.mMolecule.ensureHelperArrays_0(this.mRequiredHelperLevel);
    this.mFragmentExcludeAtoms = 0;
    this.mFragmentExcludeBonds = 0;
    this.mIsExcludeAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mFragment.getAtoms_0(), 16, 1);
    for (atom1 = 0; atom1 < this.mFragment.getAtoms_0(); atom1++) {
      this.mIsExcludeAtom[atom1] = this.mFragment.isExcludeGroupAtom(atom1);
      if (this.mIsExcludeAtom[atom1])
        this.mFragmentExcludeAtoms++;
    }
    this.mExcludeGroupCount = 0;
    this.mExcludeGroupNo = null;
    this.mFragmentAtomContextRank = null;
    if (this.mFragmentExcludeAtoms != 0) {
      for (bond = 0; bond < this.mFragment.getBonds_0(); bond++)
        if (this.mIsExcludeAtom[this.mFragment.getBondAtom_0(0, bond)] || this.mIsExcludeAtom[this.mFragment.getBondAtom_0(1, bond)])
          this.mFragmentExcludeBonds++;
      for (atom = 0; atom < this.mFragment.getAllAtoms_0(); atom++)
        this.mFragment.setAtomMarker_0(atom, this.mIsExcludeAtom[atom]);
      this.mExcludeGroupNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mFragment.getAllAtoms_0(), 15, 1);
      this.mExcludeGroupCount = this.mFragment.getFragmentNumbers_0(this.mExcludeGroupNo, true, false);
    }
  };
  _.setFragmentSymmetryConstraints = function setFragmentSymmetryConstraints(fragmentContextRank) {
    this.mFragmentAtomContextRank = fragmentContextRank;
  };
  _.setMol_0 = function setMol(fragment, molecule) {
    this.setMolecule_0(molecule);
    this.setFragment_1(fragment);
  };
  _.setMolecule_0 = function setMolecule(molecule) {
    if (isNull(molecule) || molecule.getAllAtoms_0() == 0) {
      this.mMolecule = null;
      return;
    }
    this.mMolecule = molecule;
    this.mMoleculeFeaturesValid = false;
    this.mMolecule.ensureHelperArrays_0(1);
  };
  _.setupAtomAndBondFeatures = function setupAtomAndBondFeatures(matchMode) {
    if (!this.mMoleculeFeaturesValid) {
      this.setupMoleculeFeatures(matchMode);
      this.mMoleculeFeaturesValid = true;
    }
    if (!this.mFragmentFeaturesValid) {
      this.setupFragmentFeatures(matchMode);
      this.buildFragmentGraph();
      this.buildBridgeBondList();
      this.mFragmentFeaturesValid = true;
    }
  };
  _.setupFragmentFeatures = function setupFragmentFeatures(matchMode) {
    var atom, atom0, atom1, atomFeaturesWithoutExcludeAtoms, atomTypeWithoutExcludeAtoms, bond, bondFeaturesWithoutExcludeAtoms, fragmentWithoutExcludeGroups, index_0, isNonExcludeAtom;
    atomFeaturesWithoutExcludeAtoms = null;
    bondFeaturesWithoutExcludeAtoms = null;
    atomTypeWithoutExcludeAtoms = null;
    this.mFragment.ensureHelperArrays_0(this.mRequiredHelperLevel);
    this.mFragmentConnAtoms = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mFragment.getAtoms_0(), 15, 1);
    for (atom0 = 0; atom0 < this.mFragment.getAtoms_0(); atom0++)
      this.mFragmentConnAtoms[atom0] = this.mFragment.getConnAtoms_0(atom0);
    if (this.mFragmentExcludeAtoms != 0) {
      fragmentWithoutExcludeGroups = new carc2.StereoMolecule_0(this.mFragment.getAllAtoms_0(), this.mFragment.getAllBonds_0());
      isNonExcludeAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mFragment.getAllAtoms_0(), 16, 1);
      for (atom1 = 0; atom1 < this.mFragment.getAllAtoms_0(); atom1++)
        isNonExcludeAtom[atom1] = !this.mIsExcludeAtom[atom1];
      this.mFragment.copyMoleculeByAtoms_0(fragmentWithoutExcludeGroups, isNonExcludeAtom, true, null);
      fragmentWithoutExcludeGroups.ensureHelperArrays_0(this.mRequiredHelperLevel);
      this.setupFragmentFeatures_0(fragmentWithoutExcludeGroups, matchMode);
      atomFeaturesWithoutExcludeAtoms = this.mFragmentAtomFeatures;
      bondFeaturesWithoutExcludeAtoms = this.mFragmentBondFeatures;
      atomTypeWithoutExcludeAtoms = this.mFragmentAtomType;
      index_0 = 0;
      for (atom = 0; atom < this.mFragment.getAtoms_0(); atom++)
        if (!this.mIsExcludeAtom[atom])
          this.mFragmentConnAtoms[atom] = fragmentWithoutExcludeGroups.getConnAtoms_0(index_0++);
    }
    this.setupFragmentFeatures_0(this.mFragment, matchMode);
    if (this.mFragmentExcludeAtoms != 0) {
      index_0 = 0;
      for (atom = 0; atom < this.mFragment.getAllAtoms_0(); atom++) {
        if (!this.mIsExcludeAtom[atom]) {
          this.mFragmentAtomFeatures[atom] = atomFeaturesWithoutExcludeAtoms[index_0];
          this.mFragmentAtomType[atom] = atomTypeWithoutExcludeAtoms[index_0++];
        }
      }
      index_0 = 0;
      for (bond = 0; bond < this.mFragment.getAllBonds_0(); bond++) {
        if (!this.mIsExcludeAtom[this.mFragment.getBondAtom_0(0, bond)] && !this.mIsExcludeAtom[this.mFragment.getBondAtom_0(1, bond)]) {
          this.mFragmentBondFeatures[bond] = bondFeaturesWithoutExcludeAtoms[index_0++];
        }
      }
    }
  };
  _.setupFragmentFeatures_0 = function setupFragmentFeatures_0(fragment, matchMode) {
    var atom, atom$array, atom$index, atom$max, atom0, bond, bond$array, bond$index, bond$max, bond0, containsBridgeBond, i, nTotalFragmentAtoms, nTotalFragmentBonds, ringSet, ringSize;
    nTotalFragmentAtoms = fragment.getAtoms_0();
    this.mFragmentAtomFeatures = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, fragment.getAtoms_0(), 14, 1);
    this.mFragmentAtomType = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, fragment.getAtoms_0(), 15, 1);
    for (atom0 = 0; atom0 < nTotalFragmentAtoms; atom0++) {
      this.mFragmentAtomFeatures[atom0] = xor_0(and_0(or_0(this.getAtomQueryDefaults(fragment, atom0), fragment.getAtomQueryFeatures(atom0)), { l: 4179966, m: 4063288, h: 7 }), { l: 4194302, m: 4193343, h: 127 });
      this.mFragmentAtomType[atom0] = fragment.getAtomicNo_0(atom0);
      if ((matchMode & 1) != 0)
        this.mFragmentAtomType[atom0] += fragment.getAtomCharge_0(atom0) + 16 << 8;
      if ((matchMode & 2) != 0)
        this.mFragmentAtomType[atom0] += fragment.getAtomMass_0(atom0) << 16;
    }
    this.mFragmentRingFeatures = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, fragment.getAtoms_0(), 14, 1);
    ringSet = fragment.getRingSet_0();
    for (i = 0; i < ringSet.getSize_0(); i++) {
      containsBridgeBond = false;
      for (bond$array = ringSet.getRingBonds_0(i), bond$index = 0, bond$max = bond$array.length; bond$index < bond$max; ++bond$index) {
        bond0 = bond$array[bond$index];
        if (fragment.isBondBridge_0(bond0)) {
          containsBridgeBond = true;
          break;
        }
      }
      if (!containsBridgeBond) {
        ringSize = ringSet.getRingSize_0(i);
        for (atom$array = ringSet.getRingAtoms_0(i), atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
          atom = atom$array[atom$index];
          if (ringSize == 3)
            this.mFragmentRingFeatures[atom] = or_0(this.mFragmentRingFeatures[atom], 8589934592);
          else if (ringSize == 4)
            this.mFragmentRingFeatures[atom] = or_0(this.mFragmentRingFeatures[atom], 17179869184);
          else if (ringSize == 5)
            this.mFragmentRingFeatures[atom] = or_0(this.mFragmentRingFeatures[atom], 34359738368);
          else if (ringSize == 6)
            this.mFragmentRingFeatures[atom] = or_0(this.mFragmentRingFeatures[atom], 68719476736);
          else if (ringSize == 7)
            this.mFragmentRingFeatures[atom] = or_0(this.mFragmentRingFeatures[atom], 137438953472);
        }
      }
    }
    nTotalFragmentBonds = fragment.getBonds_0();
    this.mFragmentBondFeatures = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, fragment.getBonds_0(), 15, 1);
    for (bond = 0; bond < nTotalFragmentBonds; bond++) {
      this.mFragmentBondFeatures[bond] = (this.getBondQueryDefaults(fragment, bond) | fragment.getBondQueryFeatures_0(bond)) & 6291967 ^ 6291840;
      if ((matchMode & 4) != 0) {
        if ((this.mFragmentBondFeatures[bond] & 2) != 0)
          this.mFragmentBondFeatures[bond] |= 8;
      } else if ((matchMode & 8) != 0) {
        if ((this.mFragmentBondFeatures[bond] & 2) != 0 && fragment.isAromaticBond_0(bond))
          this.mFragmentBondFeatures[bond] |= 8;
      }
    }
  };
  _.setupMoleculeFeatures = function setupMoleculeFeatures(matchMode) {
    var atom, atom$array, atom$index, atom$max, atom0, atom1, bond, i, nTotalMoleculeAtoms, nTotalMoleculeBonds, ringSet, ringSize;
    this.mMolecule.ensureHelperArrays_0(this.mRequiredHelperLevel);
    nTotalMoleculeAtoms = this.mMolecule.getAtoms_0();
    this.mMoleculeAtomType = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, nTotalMoleculeAtoms, 15, 1);
    this.mMoleculeAtomFeatures = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, nTotalMoleculeAtoms, 14, 1);
    for (atom0 = 0; atom0 < nTotalMoleculeAtoms; atom0++) {
      this.mMoleculeAtomFeatures[atom0] = xor_0(and_0(or_0(this.getAtomQueryDefaults(this.mMolecule, atom0), this.mMolecule.getAtomQueryFeatures(atom0)), { l: 4179966, m: 4063288, h: 7 }), { l: 4194302, m: 4193343, h: 127 });
      this.mMoleculeAtomType[atom0] = this.mMolecule.getAtomicNo_0(atom0);
      if ((matchMode & 1) != 0)
        this.mMoleculeAtomType[atom0] += this.mMolecule.getAtomCharge_0(atom0) + 16 << 8;
      if ((matchMode & 2) != 0)
        this.mMoleculeAtomType[atom0] += this.mMolecule.getAtomMass_0(atom0) << 16;
    }
    this.mMoleculeRingFeatures = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, nTotalMoleculeAtoms, 14, 1);
    ringSet = this.mMolecule.getRingSet_0();
    for (i = 0; i < ringSet.getSize_0(); i++) {
      ringSize = ringSet.getRingSize_0(i);
      for (atom$array = ringSet.getRingAtoms_0(i), atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
        atom1 = atom$array[atom$index];
        if (ringSize == 3)
          this.mMoleculeRingFeatures[atom1] = or_0(this.mMoleculeRingFeatures[atom1], 8589934592);
        else if (ringSize == 4)
          this.mMoleculeRingFeatures[atom1] = or_0(this.mMoleculeRingFeatures[atom1], 17179869184);
        else if (ringSize == 5)
          this.mMoleculeRingFeatures[atom1] = or_0(this.mMoleculeRingFeatures[atom1], 34359738368);
        else if (ringSize == 6)
          this.mMoleculeRingFeatures[atom1] = or_0(this.mMoleculeRingFeatures[atom1], 68719476736);
        else if (ringSize == 7)
          this.mMoleculeRingFeatures[atom1] = or_0(this.mMoleculeRingFeatures[atom1], 137438953472);
      }
    }
    for (atom = 0; atom < nTotalMoleculeAtoms; atom++) {
      ringSize = this.mMolecule.getAtomRingSize_0(atom);
      if (ringSize == 0)
        this.mMoleculeRingFeatures[atom] = or_0(this.mMoleculeRingFeatures[atom], 4294967296);
      else if (ringSize > 7)
        this.mMoleculeRingFeatures[atom] = or_0(this.mMoleculeRingFeatures[atom], 274877906944);
    }
    nTotalMoleculeBonds = this.mMolecule.getBonds_0();
    this.mMoleculeBondFeatures = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, nTotalMoleculeBonds, 15, 1);
    for (bond = 0; bond < nTotalMoleculeBonds; bond++)
      this.mMoleculeBondFeatures[bond] = (this.getBondQueryDefaults(this.mMolecule, bond) | this.mMolecule.getBondQueryFeatures_0(bond)) & (6291967 | 130560) ^ 6291840;
  };
  _.tryAddCandidate = function tryAddCandidate(current, highest, i, fragmentAtomUsed, fragmentBondUsed, excludeGroupNo) {
    var candidate, candidateBond;
    candidate = this.mFragment.getConnAtom_0(this.mFragmentGraphAtom[current], i);
    if (candidate < this.mIsExcludeAtom.length && (!this.mIsExcludeAtom[candidate] || this.mExcludeGroupNo[candidate] == excludeGroupNo) && candidate != this.mFragmentGraphParentAtom[current]) {
      candidateBond = this.mFragment.getConnBond_0(this.mFragmentGraphAtom[current], i);
      if (!fragmentBondUsed[candidateBond] && !this.mFragment.isBondBridge_0(candidateBond)) {
        this.mFragmentGraphAtom[++highest] = candidate;
        this.mFragmentGraphParentAtom[highest] = this.mFragmentGraphAtom[current];
        this.mFragmentGraphParentBond[highest] = candidateBond;
        fragmentBondUsed[candidateBond] = true;
        if (fragmentAtomUsed[candidate])
          this.mFragmentGraphIsRingClosure[highest] = true;
        else
          fragmentAtomUsed[candidate] = true;
      }
    }
    return highest;
  };
  _.mDefaultMatchMode = 0;
  _.mExcludeGroupCount = 0;
  _.mFragmentExcludeAtoms = 0;
  _.mFragmentExcludeBonds = 0;
  _.mFragmentFeaturesValid = false;
  _.mFragmentGraphSize = 0;
  _.mFragmentGraphSizeWithExcludeGroups = 0;
  _.mMoleculeFeaturesValid = false;
  _.mRequiredHelperLevel = 0;
  _.mStop = false;
  carc2.cCountModeExistence = 1;
  carc2.cCountModeFirstMatch = 2;
  carc2.cCountModeOverlapping = 4;
  carc2.cCountModeRigorous = 5;
  carc2.cCountModeSeparated = 3;
  carc2.cCountModeUnique = 6;
  carc2.cDefaultMatchMode = 8;
  carc2.cIndexMatchMode = 4;
  carc2.cMatchAromDBondToDelocalized = 8;
  carc2.cMatchAtomCharge = 1;
  carc2.cMatchAtomMass = 2;
  carc2.cMatchDBondToDelocalized = 4;
  cggl.Lcom_actelion_research_chem_SSSearcher_2_classLit = createForClass("com.actelion.research.chem", "SSSearcher", 77, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_SSSearcher$BridgeBond = function $clinit_SSSearcher$BridgeBond() {
    carc2.$clinit_SSSearcher$BridgeBond = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.SSSearcher$BridgeBond = function SSSearcher$BridgeBond() {
    carc2.$clinit_SSSearcher$BridgeBond();
    Object_0.call(this);
    this.$init_44();
  };
  defineClass(202, 1, { 202: 1, 1: 1 }, carc2.SSSearcher$BridgeBond);
  _.$init_44 = function $init_44() {
  };
  _.atom1 = 0;
  _.atom2 = 0;
  _.maxBridgeSize = 0;
  _.minBridgeSize = 0;
  cggl.Lcom_actelion_research_chem_SSSearcher$BridgeBond_2_classLit = createForClass("com.actelion.research.chem", "SSSearcher/BridgeBond", 202, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_SSSearcherWithIndex = function $clinit_SSSearcherWithIndex() {
    carc2.$clinit_SSSearcherWithIndex = emptyMethod;
    jl.$clinit_Object();
    carc2.cKeyIDCode = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["QM@HzAmdqjF@", "RF@Q``", "qC`@ISTAlQE`", "`J@H", "QM@HzAmdqbF@", "qC`@ISTAlQEhqPp@", "sJP@DiZhAmQEb", "RF@QPvR@", "QM@HzA@", "qC`@ISTAlQEhpPp@", "qC`@Qz`MbHl", "sJP@DiZhAmQEcFZF@", "RFPDXH", "qC`@IVtAlQE`", "QM@HvAmdqfF@", "sGP@DiVj`FsDVM@", "`L@H", "sJP@DizhAmQEcFBF@", "sJP@DjvhAmQEb", "sFp@DiTt@@AlqEcP", "sGP@LdbMU@MfHlZ", "QMHAIhD", "QM@HzAy@", "sJP@DkVhAmQEb", "sNp@DiUjj@[\\QXu`", "sJP@DiZhAmQEcFBF@", "sGP@DjVj`FsDVM@", "RFPDTH", "RG@DXOH@", "sGP@Divj`FsDVMcAC@", "sGP@Dj}j`FsDVM@", "qC`@Qz`MbHmFRF@", "sNp@LdbJjj@[\\QXu`", "QMHAIhGe@", "QM@HzAyd`", "QM`AIhD", "qC`@ISTA@", "sGP@DkUj`FsDVM@", "qC`@IVtAlQEhqPp@", "sNp@DiUjj@[\\QXuqea`@", "KAx@@IRjuUPAlHPfES\\", "QM`BN`P", "sJP@DjZhAmQEcFJF@", "Hid@@DjU^nBBH@FtaBXUMp`", "sNp@Diujj@[\\QXuq`a`@", "sJP@DjvhAmQEcFZF@", "sJP@DjZhAmQEcFFF@", "sOp@DjWkB@@FwDVM\\YhX@", "sNp@Dj}Zj@[\\QXu`", "sNp@DiWjj@[\\QXuq`a`@", "sOp@DjWkB@@D", "KAx@@ITouUPAlHPfES\\", "KAx@@YIDTjjh@vDHSBin@", "sNp@DkUZj@[\\QXu`", "RFPDXOH@", "QM`BN`^L`", "qC`@ISTAy@", "sGP@LdbMU@MfHl[FVF@", "qCb@AIZ`H", "KAx@@IRjuUPAlHPfES]FFa`@", "KAx@@ITnuUPAlHPfES\\", "HiD@@DiUVjj`AmHPfES\\H", "sNp@DjUjj@[\\QXu`", "sJP@DkVhAmQEcFJF@", "sGP@DjVj`FsDVMcCC@", "qC`@Qz`MbHmFBF@", "sJP@DkfhAmQEb", "qC`@IVtAlQEhsPp@", "sGP@Djuj`FsDVM@", "sGP@Dj}j`FsDVMcMC@", "sJP@DiZhA@", "KAx@@ISjuUPAlHPfES]F@a`@", "sJP@DjZhAmQEcFRF@", "KAx@@IRnuUPAlHPfES]F@a`@", "HiD@@DjWvjj`AmHPfES\\H", "QMHAIhGd@", "sNp@DiUjj@[\\QXuq`a`@", "KAx@@IVjmUPAlHPfES\\", "sGP@DjVj`FsDVMcMC@", "QM`AIhGe@", "HiD@@LdbJRjjh@[RDIaTwB", "qCp@AIZ`H", "sGP@LdbMU@MfHl[FFF@", "QMDARVA@", "sNp@LdbJjj@[\\QXuqba`@", "sNp@LdbJjj@[\\QXuqca`@", "sGP@Dkej`FsDVM@", "qCb@AIZ`OI@", "HaD@@DjUZxHH@AlHPfES]FLa`@", "sGP@DkYj`FsDVM@", "qCb@AIV`H", "sNp@LdbJjj@[\\QXuqea`@", "sGP@DkUj`FsDVMcEC@", "sFp@DiTt@@Axa@", "Hmt@@DjU_ZxHHj@AmhPfES\\Lj", "QM`BN`^P", "qCb@AIZ`OH`", "sFp@DiTt@@AxaP", "sGP@Djuj`FsDVMcEC@", "sGP@Djuj`FsDVMcIC@", "sGP@DkUj`FsDVMcKC@", "sJP@DkfhAmQEcFRF@", "sGP@DjVj`FsDVMcIC@", "HaD@@DjUZxHH@AlHPfES]FFa`@", "qC`@IRtDVqDV@", "sNp@Dj}Zj@[\\QXuqfa`@", "KAx@@ITnuUPAlHPfES]FFa`@", "HiD@@DkUUjj`AmHPfES\\H", "sJQ@@dkU@H", "qC`@Qz`H", "KAx@@IUkmUPAlHPfES\\", "KAx@@ITouUPAlHPfES]FJa`@", "sJP@H~j@[TQX`", "sGP@DjZj`FsDVM@", "sJP@DkVhAmQEcFFF@", "sJX@@eKU@H", "sJP@DizhAy@", "QMHAIhGbP", "KAx@@ITouUPAlHPfES]FNa`@", "HaD@@DjUZxHD@AlHPfES\\", "HaD@@DjUZxHH@A@", "sNp@LdbJjj@[\\QXuqaa`@", "Hed@@LdbRQUUUP@vTHSBinFP", "KAx@@ITouUPAlHPfES]FLa`@", "sNp@DkUZj@[\\QXuqba`@", "KAx@@ITjuUPAlHPfES]FNa`@", "KAx@@YIDTjjh@vDHSBincGPp@", "HaD@@DjYvxH`@AlHPfES]FLa`@", "RF@QP`", "qCb@AIj`H", "sNp@DjUjj@[\\QXuqaa`@", "sNp@DkVZj@[\\QXu`", "KAx@@YIDUJjh@vDHSBin@", "sGP@DkYj`FsDVMcIC@", "sGP@DjVj`FsDVMcAC@", "sGP@DiVj`D", "sJP@DkVhAmQEcFZF@", "sNp@LdbLjj@[\\QXu`", "QM@HvAmdqbF@", "HaD@@DjWjXHB@AlHPfES\\", "sNp@DjwZj@[\\QXuqba`@", "sNp@LdbJjj@[\\QXuqda`@", "sFp@DiTt@@Axa`", "HiD@@Djuujj`AmHPfES\\H", "sNp@DkUZj@[\\QXuqca`@", "sJP@DiZhAy@", "KAx@@YIDTjjh@vDHSBincCPp@", "KAx@@IWNmUPAlHPfES\\", "KAx@@IVkMUPAlHPfES\\", "sJQ@@dju@H", "qCb@AIZ`OH@", "qC`@ISTAxa@", "sNp@DjyZj@[\\QXu`", "Hid@@DjUfaBB`@FtaBXUMp`", "HiD@@DiUVjj`AmHPfES\\LXBF@", "KAx@@IUjmUPAlHPfES\\", "HiD@@DjWvjj`AmHPfES\\LXjF@", "sJP@DjVhAmQEb", "qCb@AIV`OH`", "HiD@@LdbJRjjh@[RDIaTwCFDa`@", "KAx@@YIDTjjh@vDHSBinc@Pp@", "sNp@DjUjj@[\\QXuqda`@", "qC`@Qz`OED", "sJP@DkfhAmQEcFZF@", "KAx@@YIDbjjh@vDHSBincDPp@", "sGP@Djyj`FsDVMcMC@", "KAx@@IVrmUPAlHPfES\\", "qCp@AIZ`OI@", "sJX@@dkU@H", "sJQ@@dkU@OH`", "sNp@Di]ZjBBvxbqk@", "Hkl@@DjU_Uk``bj`@[VDIaTwCJzX", "sGP@DjZj`FsDVMcEC@", "Hid@@DjU^nBBH@FtaBXUMpqcHX@", "sNp@DkeZj@[\\QXu`", "sNp@DjYjj@[\\QXuqca`@", "sGQ@@djuT@`", "HiD@@LdbJTjjh@[RDIaTwB", "sOp@DjWkB@@Gd`", "HeT@@LdbbRKBDQD@CYPaLJfxY@", "qCr@XIKTA@", "HiD@@DjW^jj`AmHPfES\\LXJF@", "HeT@@DjU]k``b`@[JDIaTwCH", "sGP@Djuj`FsDVMcCC@", "`IH`B", "sOp@DjWkB@@GdX", "sJQ@@eKU@H", "KAx@@YIDUJjh@vDHSBincBPp@", "sJX@@eKU@OH@", "KAx@@YIDTjjh@vDHSBincAPp@", "sOq@@drm\\@@@`", "KAx@@IUkMUPAlHPfES\\", "qCp@AIj`H", "Hed@@DjUUjjj@FraBXUMpr", "sGX@@eJuT@`", "sGP@DkUj`FsDVMcCC@", "HiD@@Dj}Ujj`AmHPfES\\LXrF@", "KAx@@ITouUPAlHPfES]FHa`@", "Hed@@DjWujjj@FraBXUMpsFIa`@", "sGP@DiUj``mfHlZ", "sFp@DiTvjhAlqEcP", "Hid@@DjU^nBBH@FtaBXUMpq`XX@", "sJP@DkVdAmQEb", "qCp@AIZ`OH`", "QMhDRVA@", "qC`@ISJAlQE`", "qCp@BOTAyhl", "sJX@@eOU@ODB", "sFp@DiTt@@AyaB", "sGP@DkUj`FsDVMcMC@", "Hid@@DjYUaBH`@FtaBXUMpqcHX@", "qC`@Qz`OH@", "HiD@@DjUVjj`AmHPfES\\LXZF@", "sJP@H~j@[TQXqda`@", "sJX@@eKU@OI@", "sNp@Djejj@[\\QXu`", "sJQ@@dsU@H", "sJQ@@dkU@OI`", "KAx@@YIMDVjh@vDHSBin@", "Hid@@DjU^nBBD@FtaBXUMp`", "sNp@DkgZj@[\\QXuqca`@", "qC`@IRtDVqDVcEC@", "Hed@@LdbRQeUUP@vTHSBinFP", "sNp@DiUjj@P", "qC`@IRtDT", "sNp@DkYZj@[\\QXuqca`@", "KAx@@IUkmUPAlHPfES]FDa`@", "KAx@@IVjmUPAlHPfES]FNa`@", "sOx@@drm\\@@@`", "KAx@@ITjuUPAlHPfES]FBa`@", "QMDARVAyH", "sJP`@dfvhA@", "HeT@@DjU_k``b`@[JDIaTwCLXfF@", "KAx@@IToUUPAlHPfES]FJa`@", "sGP@DkYj`FsDVMcEC@", "qCb@AIZ`ODH", "`I@`B", "KAx@@IUzmUPAlHPfES]FFa`@", "sNp@DkfZj@[\\QXu`", "KAx@@ITnuUPAlHPfES]F@a`@", "HiD@@LddURjjh@[RDIaTwB", "sNp@Dj~Zj@[\\QXuqfa`@", "Hed@@Dj{uZjj@FraBXUMpr", "KAx@@ITsUUPAlHPfES\\", "Hid@@LdbRQk``b@AmHPfES\\LXrF@", "sOp@DjWkB@@GdH", "sJQ@@dkU@OH@", "Hid@@DjU^nBBH@FtaBXUMpqahX@", "sGP@DiYj``mfHlZ", "KAx@@IToUUPAlHPfES]FLa`@", "qCp@AJZ`ODH", "Hmt@@DjU]ZxHHj@AmhPfES\\Lj", "sGP@DkUjPFsDVM@", "qC`@IVtA@", "Hed@@LdbJReUUP@vTHSBinFP", "sNp@DjuZj@[\\QXuqea`@", "KAx@@IUkmUPAlHPfES]FNa`@", "HiD@@DkVUjj`AmHPfES\\H", "Hed@@DkUeZjj@FraBXUMpr", "sNp@DkVZj@[\\QXuqea`@", "sJP@DiVhHKZbKFLLL@", "HiD@@Djuyjj`AmHPfES\\H", "sNp@DjUjj@[\\QXuq`a`@", "HeT@@DjYUXPbH`@[JDIaTwCH", "HiD@@DjwUjj`AmHPfES\\LXRF@", "sNq@@djmUPB", "KAx@@YIEEZjh@vDHSBincCPp@", "sGP@Di^V`dmfHlZ", "Hid@@DjYUaBHP@FtaBXUMp`", "sNp@DjYjj@[\\QXuqba`@", "sGP@Dkej`FsDVMcKC@", "HeT@@DjU^k``b`@[JDIaTwCH", "qC`@Qv`MbHmFBF@", "sGQ@@djmT@`", "qCr@XIKTAyH", "qC`@IVtAlQEhpPp@", "Hid@@LdbbQxXF@@AmHPfES\\LXjF@", "sGP@DkYj`FsDVMcCC@", "KAx@@IVsMUPAlHPfES\\", "qCp@AIj`ODl", "HiD@@DkeUjj`AmHPfES\\H", "deT@@DjU[k``b`@vTHSBinFP", "sJP@DkVdAmQEcFRF@", "HiD@@LdbJTjjh@[RDIaTwCFDa`@", "HiD@@DkYyjj`AmHPfES\\H", "sJP@DjZhAyH", "KAx@@IVkMUPAlHPfES]FDa`@", "sJX@@dkU@OI@", "Hed@@LdbRQUUUP@vTHSBinFXpLL@", "Hed@@DjuUZjj@FraBXUMpr", "sGP@Djfj`FsDVMcKC@", "sNp@DkVZj@[\\QXuqba`@", "sNp@DjyZj@[\\QXuqfa`@", "qCb@AIj`OH@", "sNp@DjUZj@[\\QXu`", "KAx@@IWOMUPAlHPfES\\", "Hid@@DjU^nBBH@D", "Hed@@DjuvZjj@FraBXUMpr", "sJP@DiVhHKZbKFLtL@", "dmt@@DjU_ZxHHj@C[PaLJfxYVLKC@", "sNp@DjuZj@[\\QXuqca`@", "sJP@DkfhAmQEcFJF@", "sNp@LdbJZj@[\\QXu`", "HeT@@DjU_k``b`@[JDIaTwCLXFF@", "KAx@@IVlmUPAlHPfES]FNa`@", "HeT@@LdbbRKBDQD@CYPaLJfxYcEPp@", "Hid@@DjUZnBBH@FtaBXUMpqcHX@", "qCa@CIKTA@", "HiD@@Dj~]jj`AmHPfES\\LXFF@", "sKP@Di\\Zj@[TQX`", "sGP@Djfj`FsDVMcEC@", "HiD@@DkgYjj`AmHPfES\\H", "sNp@DjuZj@[\\QXuqaa`@", "KAx@@YIMDVjh@vDHSBincDPp@", "sJP@DjVhHKZbKFLTL@", "Hid@@LdbRQk``b@AmHPfES\\LXZF@", "HiD@@Dj}Ujj`AmHPfES\\LXzF@", "HeT@@DjU_k``bP@[JDIaTwCH", "sNp@DkUZi@[\\QXu`", "HiD@@DjYfjj`AmHPfES\\H", "sGP@DjZj`FsDVMcAC@", "Hmt@@DjU_jxHHj@AmhPfES\\Lj", "Hid@@LdbRQk``R@AmHPfES\\H", "KAx@@YIDUJjh@vDHSBincDPp@", "qCr@XIKTAyD", "sOq@@drm\\@@@|`@", "Hed@@DjW^jjj@FraBXUMpsFBa`@", "HeT@@DjY]zXFB@@[JDIaTwCH", "Hkl@@DjU_Vk``bj`@[VDIaTwCJzX", "Hid@@DjY}nBHH@FtaBXUMpqcHX@", "sGX@@eKuT@|d@", "sGP@Dj^Y`FsDVM@", "HcL@@DjU_ZnBBJh@FqaBXUMprn`", "sJP@DkVdAmQEcFJF@", "sOq@@drm\\@@@|b@", "sNp@DjyZj@[\\QXuqaa`@", "HaD@@DjUZxHH@AyD@", "qC`@Qv`H", "dmt@@DjU_ZxHHj@C[PaLJfxYVLYC@", "sGP@Dkej`FsDVMcMC@", "Hed@@DjUUjjj@FraBXUMpsFHa`@", "HeT@@LdbbRkBDQD@CYPaLJfxY@", "KAx@@IU{MUPAlHPfES]FLa`@", "RG@DTH", "sJY@DDeVhA@", "KAx@@YIDUJjh@vDHSBinc@Pp@", "sJX@@dkU@OI`", "sJQ@@dju@OI`", "HeT@@LdbbRKBDQD@CYPaLJfxYcFPp@", "sFp@DiTvjhAlqEcXpPp@", "HaD@@DjUZxHH@AyG@", "sNx@@eJ}UPB", "sNp@LddUjj@[\\QXuqca`@", "HaDH@@RVU[j@@@D", "sNp@DkgZi@[\\QXu`", "sGY@LDeVj`D", "sNp@LdbJfZBZvxbqk@", "sJP`@dfvhAyL", "sGX@AddQjhAxe`", "Hmt@@DjU_ZxHHj@AmhPfES\\LkFIa`@", "qCh@CIKTA@", "sNp@LdbLjj@[\\QXuq`a`@", "sOq@@drm\\@@@|a@", "KAx@@IUzmUPAlHPfES]FJa`@", "sNx@AddQUUPB", "sGP@Di]jP`mfHlZ", "sJP`@TeZhA@", "KAx@@IRjmUPHKXPaLJfx", "HeT@@LdbRTM\\DDT@CYPaLJfxY@", "HaF@@@Rfu[j@@@D", "Hid@@DjYUaBH`@FtaBXUMpqchX@", "KAx@@IUjmTpAlHPfES\\", "Hid@@DjU^nBBD@FtaBXUMpqcHX@", "sGP@DiUj``mfHl[FFF@", "KAx@@IUvmUPAlHPfES]FLa`@", "Hed@@LdbQTUUUP@vTHSBinFXqDL@", "sJP@DkVhA@", "sOx@@drm\\@@@|b@", "KAx@@IUkMUPAlHPfES]FDa`@", "HeT@@LdbRQU\\DDT@CYPaLJfxY@", "HiD@@Dj}Yjj`AmHPfES\\LXrF@", "HiD@@Dj{ujj`AmHPfES\\LXFF@", "KAx@@IWNmUPAlHPfES]FFa`@", "KAx@@IRkMUPHKXPaLJfx", "sJP@DjYdAmQEcFZF@", "sJY@LDeZhAyL", "HaDH@@RVU[f@@@D", "sJP`@deVhAyB", "HaD@@DjWjZjj`AlHPfES\\", "sGP@DkYj`FsDVMcMC@", "sNp@DkgZj@[\\QXuqea`@", "sJQ@@dlu@H", "HeT@@DjU]k``b`@[JDIaTwCLXrF@", "sJX@@dkU@OH`", "RFDDQFCr`", "sJP@DiYXIKZbKFLLL@", "KAx@@YIHjjjh@vDHSBincGPp@", "Hk\\@@DjU^ukmLHH@@@AmXPfES\\Lki`", "sGQ@@djmT@|b@", "Hid@@DjUfaBB`@FtaBXUMpqahX@", "sNx@@eRmUPB", "Hmt@@LdbRVak``ah@FvaBXUMprh", "qCr@XIJtA@", "KAx@@IWMmUPAlHPfES]FNa`@", "HeT@@DjYYZPbJ@@[JDIaTwCH", "sNp@DkfZj@[\\QXuqea`@", "Hid@@DjU^nBAHAEVtaBXUMp`", "dmt@@DjUgZDHJJ@C[PaLJfxYT", "sGP@DkejPFsDVM@", "sNx@@eJmUPB", "qCb@AIf`H", "HcL@@DjU_VnBBJh@FqaBXUMprnqcXX@", "Hid@@DjUZnBBH@FtaBXUMpqahX@", "sNp@LdbQZjBBvxbqkcGC@", "sOx@@drm\\@@@|c@", "sJP@H~j@^R@", "KAx@@YIDcFjhDElHPfES\\", "Hid@@DjUZnBAH@FtaBXUMp`", "sNp@LddUji@[\\QXu`", "sGP@DjfjPFsDVM@", "HeT@@DjYUXPbD`@[JDIaTwCH", "KAx@@IUoMUPAlHPfES]FDa`@", "sFp@DiTt@@AyaD", "Hed@@DjuuZjj@FraBXUMpsFIa`@", "HeT@@DjUghP`h`@[JDIaTwCLXfF@", "sOp@DjWkjj`FwDVM\\YhX@", "sGP@Djfj`FsDVMcIC@", "KAx@@IRkmUPHKXPaLJfzL]C@", "sNx@@djmUPB", "QM`AIdD", "sOp@DjWkB@@Gbe@", "sNp@DjyZj@[\\QXuqca`@", "QM@HuAmd`", "sNp@LddUjj@[\\QXuqea`@", "daD@@DjUZxHD@CXPaLJfzLYC@", "qCb@AIZPH", "HiD@@LdbJTjjh@[RDIaTwCF@a`@", "Hmt@@DjU_ZxHHi@AmhPfES\\Lj", "HaDH@@RYWih@H@D", "HiD@@LdbJTjjh@[RDIaTwCFHa`@", "sGX@@djuT@|a@", "sNp@DkfZj@[\\QXuqaa`@", "Hid@@DjU^nBBH@GdL", "KAx@@IVkMUPAlHPfES]FJa`@", "qCr@XIKTAy@", "HmT@@Dj{uVjjh@[ZDIaTwCJqaXX@", "dmt@@DjYWVDHbJ@C[PaLJfxYT", "Hif@@@RUe^Fh@@@P", "HaDH@@Rfu[j@@@GdH", "KAx@@IVsMUPAlHPfES]FDa`@", "sKP@Di\\Zj@[TQXq`a`@", "sJX@@eMU@OH@", "HeT@@DjU^k``b`@[JDIaTwCLXFF@", "Hmt@@LdbbRJXPbHh@FvaBXUMprh", "sJP@DjvhAmQEcFBF@", "dmt@@LdbbRNXPbHh@MmBDpj[aeXplL@", "sJP`@dfvhAyD", "sGP@Di^V`dmfHl[FVF@", "KAx@@IVsmUPAlHPfES]FBa`@", "sOq@@drm\\@@@|PP", "sJY@BDeZhA@", "HeT@@LdbRbmBDED@CYPaLJfxY@", "Hed@@Djy[Zjj@FraBXUMpr", "HeT@@DjU]k``b`@[JDIaTwCLXFF@", "Hid@@DjUfaBB`@D", "qCa@CIJtA@", "QMPARVA@", "Hid@@DjUfaBB`@FtaBXUMpqcHX@", "sJY@BDfZhA@", "HeT@@DjUghP`hP@[JDIaTwCH", "Hed@@Dj{uZjj@FraBXUMpsFIa`@", "dmt@@DjYUvDHbJ@C[PaLJfxYVLUC@", "sNp`@dfuZj@P", "sJQ@@dmU@OH@", "sJX@@dmU@H", "HeT@@DjU]k``b`@[JDIaTwCLXZF@", "HiD@@LdfbJZjh@[RDIaTwCFAa`@", "sOx@@drm\\@@@|a@", "deT@@DjUfhP`h`@vTHSBinFP", "dmt@@DjU]ZxHHj@C[PaLJfxYVLKC@", "sOp@DjWkjj`FwDVM\\XHX@", "HcL@@LdbbRNSBDQEP@McBDpj[ae]cFpp@", "HiD@@Dj}Yji`AmHPfES\\H", "HaDH@@RYe[hB@@D", "Hid@@DjU^njjj@FtaBXUMpq`XX@", "deT@@LdbbRKBDQB@FraBXUMpr", "QMPARZA@", "sOq@@drm\\@@@|QX", "HaD@@DjYvxH`@A@", "HcL@@LdbbRNcBDQEP@McBDpj[ae]@", "QMhDRZA@", "RG@DXLHmP", "QM`BN`XQYd", "RG@DTLHmP", "QMHAIXFEVd", "QMDARVAaH", "RFPDXLHmP", "RF@Q`vRbdLEC@", "RF@QpvR@", "QO@HyjAmd`", "`II@B", "`II@CFspqJp", "`II@CF[@hM@prB`", "`H@[T[|B`XN@PdM@p|@bHrBcDk@", "RG@DXMj}F@", "QM`BN`[L~b@", "RG@DTMj}D@", "QMHAIXFt~j@", "QMDARVA}L@", "RFPDXMj}D@", "sKP@Di\\YZ@[TQXqaa`@", "eF`BHD"]);
  };
  carc2.SSSearcherWithIndex = function SSSearcherWithIndex2() {
    carc2.$clinit_SSSearcherWithIndex();
    Object_0.call(this);
    this.$init_45();
    this.mSSSearcher = new carc2.SSSearcher();
    this.init_2();
  };
  carc2.getHexStringFromIndex = function getHexStringFromIndex(index_0) {
    carc2.$clinit_SSSearcherWithIndex();
    var bytes, code_0, i, j, value_0;
    if (jsEquals(index_0, null))
      return null;
    bytes = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, index_0.length * 8, 15, 1);
    for (i = 0; i < index_0.length; i++) {
      value_0 = index_0[i];
      for (j = 7; j >= 0; j--) {
        code_0 = value_0 & 15;
        if (code_0 > 9)
          code_0 += 7;
        bytes[i * 8 + j] = narrow_byte(48 + code_0);
        value_0 >>= 4;
      }
    }
    return jl.$create_12(bytes, (jnc.$clinit_StandardCharsets(), jnc.UTF_8));
  };
  carc2.getIndexFromHexString = function getIndexFromHexString(hex) {
    carc2.$clinit_SSSearcherWithIndex();
    var code_0, i, index_0, j;
    if (jl.length__I__devirtual$_0(hex) == 0 || (jl.length__I__devirtual$_0(hex) & 7) != 0)
      return null;
    index_0 = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, narrow_int(jl.length__I__devirtual$_0(hex) / 8), 15, 1);
    for (i = 0; i < jl.length__I__devirtual$_0(hex); i++) {
      j = narrow_int(i / 8);
      code_0 = jl.charAt_I_C__devirtual$_0(hex, i) - 48;
      if (code_0 > 16)
        code_0 -= 7;
      index_0[j] <<= 4;
      index_0[j] += code_0;
    }
    return index_0;
  };
  carc2.getSimilarityAngleCosine = function getSimilarityAngleCosine(index1, index2) {
    carc2.$clinit_SSSearcherWithIndex();
    var i, index1Keys, index2Keys, sharedKeys;
    sharedKeys = 0;
    index1Keys = 0;
    index2Keys = 0;
    for (i = 0; i < index1.length; i++) {
      sharedKeys += bitCount_1(index1[i] & index2[i]);
      index1Keys += bitCount_1(index1[i]);
      index2Keys += bitCount_1(index2[i]);
    }
    return sharedKeys / $wnd.Math.sqrt(index1Keys * index2Keys);
  };
  carc2.getSimilarityTanimoto = function getSimilarityTanimoto(index1, index2) {
    carc2.$clinit_SSSearcherWithIndex();
    var allKeys, i, sharedKeys;
    sharedKeys = 0;
    allKeys = 0;
    for (i = 0; i < index1.length; i++) {
      sharedKeys += bitCount_1(index1[i] & index2[i]);
      allKeys += bitCount_1(index1[i] | index2[i]);
    }
    return sharedKeys / allKeys;
  };
  defineClass(173, 1, { 1: 1 }, carc2.SSSearcherWithIndex);
  _.$init_45 = function $init_45() {
  };
  _.createIndex_0 = function createIndex(mol) {
    var i, index_0;
    if (isNull(mol))
      return null;
    index_0 = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, narrow_int((carc2.cKeyIDCode.length + 31) / 32), 15, 1);
    mol = this.removeExcludeGroups(mol);
    this.mSSSearcher.setMolecule_0(mol);
    for (i = 0; i < carc2.cKeyIDCode.length; i++) {
      this.mSSSearcher.setFragment_1(carc2.sKeyFragment[i]);
      if (this.mSSSearcher.isFragmentInMolecule_1(4))
        index_0[narrow_int(i / 32)] |= 1 << 31 - i % 32;
    }
    return index_0;
  };
  _.createLongIndex = function createLongIndex(mol) {
    var i, index_0;
    if (isNull(mol))
      return null;
    if (isNotNull(this.mDescriptorHandler))
      return castTo(this.mDescriptorHandler.createDescriptor(mol), 49);
    index_0 = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, narrow_int((carc2.cKeyIDCode.length + 63) / 64), 14, 1);
    mol = this.removeExcludeGroups(mol);
    this.mSSSearcher.setMolecule_0(mol);
    for (i = 0; i < carc2.cKeyIDCode.length; i++) {
      this.mSSSearcher.setFragment_1(carc2.sKeyFragment[i]);
      if (this.mSSSearcher.isFragmentInMolecule_1(4))
        index_0[narrow_int(i / 64)] = or_0(index_0[narrow_int(i / 64)], shl_0(1, 63 - i % 64));
    }
    return index_0;
  };
  _.findFragmentInMolecule = function findFragmentInMolecule_1(countMode, matchMode) {
    return this.findFragmentInMolecule_0(countMode, matchMode, null);
  };
  _.findFragmentInMolecule_0 = function findFragmentInMolecule_2(countMode, matchMode, atomExcluded) {
    var i;
    if (jsNotEquals(this.mMoleculeIndexLong, null)) {
      for (i = 0; i < this.mMoleculeIndexLong.length; i++)
        if (neq(and_0(this.mFragmentIndexLong[i], not_0(this.mMoleculeIndexLong[i])), 0))
          return 0;
    } else if (jsNotEquals(this.mMoleculeIndexInt, null)) {
      for (i = 0; i < this.mMoleculeIndexInt.length; i++)
        if ((this.mFragmentIndexInt[i] & ~this.mMoleculeIndexInt[i]) != 0)
          return 0;
    } else {
      return 0;
    }
    if (isNull(this.mMolecule))
      this.mMolecule = new carc2.IDCodeParser(false).getCompactMolecule_1(this.mMoleculeIDCode);
    if (isNull(this.mFragment))
      this.mFragment = new carc2.IDCodeParser(false).getCompactMolecule_1(this.mFragmentIDCode);
    this.mSSSearcher.setMolecule_0(this.mMolecule);
    this.mSSSearcher.setFragment_1(this.mFragment);
    return this.mSSSearcher.findFragmentInMolecule_0(countMode, matchMode, atomExcluded);
  };
  _.getGraphMatcher = function getGraphMatcher() {
    return this.mSSSearcher;
  };
  _.getMolecule_0 = function getMolecule_1() {
    if (isNull(this.mMolecule) && jsNotEquals(this.mMoleculeIDCode, null))
      this.mMolecule = new carc2.IDCodeParser(false).getCompactMolecule_1(this.mMoleculeIDCode);
    return this.mMolecule;
  };
  _.init_2 = function init_2() {
    var i, theParser;
    {
      cggl.Lcom_actelion_research_chem_SSSearcherWithIndex_2_classLit;
      if (jsEquals(carc2.sKeyFragment, null)) {
        theParser = new carc2.IDCodeParser(false);
        carc2.sKeyFragment = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_StereoMolecule_2_classLit, { 95: 1, 4: 1, 1: 1, 7: 1 }, 17, carc2.cKeyIDCode.length, 0, 1);
        for (i = 0; i < carc2.cKeyIDCode.length; i++) {
          setCheck(carc2.sKeyFragment, i, theParser.getCompactMolecule(carc2.cKeyIDCode[i]));
          carc2.sKeyFragment[i].ensureHelperArrays_0(1);
        }
      }
    }
  };
  _.isFragmentInMolecule_0 = function isFragmentInMolecule_1() {
    var i;
    if (jsNotEquals(this.mMoleculeIndexLong, null)) {
      for (i = 0; i < this.mMoleculeIndexLong.length; i++)
        if (neq(and_0(this.mFragmentIndexLong[i], not_0(this.mMoleculeIndexLong[i])), 0))
          return false;
    } else if (jsNotEquals(this.mMoleculeIndexInt, null)) {
      for (i = 0; i < this.mMoleculeIndexInt.length; i++)
        if ((this.mFragmentIndexInt[i] & ~this.mMoleculeIndexInt[i]) != 0)
          return false;
    } else {
      return false;
    }
    return this.isFragmentInMoleculeWithoutIndex();
  };
  _.isFragmentInMoleculeWithoutIndex = function isFragmentInMoleculeWithoutIndex() {
    if (isNull(this.mMolecule))
      this.mMolecule = new carc2.IDCodeParser(false).getCompactMolecule_1(this.mMoleculeIDCode);
    if (isNull(this.mFragment))
      this.mFragment = new carc2.IDCodeParser(false).getCompactMolecule_1(this.mFragmentIDCode);
    this.mSSSearcher.setMolecule_0(this.mMolecule);
    this.mSSSearcher.setFragment_1(this.mFragment);
    return this.mSSSearcher.isFragmentInMolecule_0();
  };
  _.removeExcludeGroups = function removeExcludeGroups(mol) {
    var atom, i;
    if (mol.isFragment_0()) {
      for (atom = 0; atom < mol.getAllAtoms_0(); atom++) {
        if (mol.isExcludeGroupAtom(atom)) {
          mol = new carc2.StereoMolecule_1(mol);
          for (i = atom; i < mol.getAllAtoms_0(); i++)
            if (mol.isExcludeGroupAtom(i))
              mol.markAtomForDeletion_0(i);
          mol.deleteMarkedAtomsAndBonds_0();
        }
      }
    }
    return mol;
  };
  _.setFragment_2 = function setFragment_1(fragment, index_0) {
    this.mFragmentIDCode = null;
    this.mFragmentIndexLong = null;
    this.mFragment = fragment;
    if (jsEquals(index_0, null))
      this.mFragmentIndexInt = this.createIndex_0(fragment);
    else
      this.mFragmentIndexInt = index_0;
  };
  _.setFragment_3 = function setFragment_2(fragment, index_0) {
    this.mFragmentIDCode = null;
    this.mFragmentIndexInt = null;
    this.mFragment = fragment;
    if (jsEquals(index_0, null))
      this.mFragmentIndexLong = this.createLongIndex(fragment);
    else
      this.mFragmentIndexLong = index_0;
  };
  _.setMolecule_1 = function setMolecule_0(molecule, index_0) {
    this.mMoleculeIDCode = null;
    this.mMoleculeIndexLong = null;
    this.mMolecule = molecule;
    if (jsEquals(index_0, null))
      this.mMoleculeIndexInt = this.createIndex_0(molecule);
    else
      this.mMoleculeIndexInt = index_0;
  };
  _.setMolecule_2 = function setMolecule_1(molecule, index_0) {
    this.mMoleculeIDCode = null;
    this.mMoleculeIndexInt = null;
    this.mMolecule = molecule;
    if (jsEquals(index_0, null))
      this.mMoleculeIndexLong = this.createLongIndex(molecule);
    else
      this.mMoleculeIndexLong = index_0;
  };
  carc2.cIndexVersion = "1.2.1";
  cggl.Lcom_actelion_research_chem_SSSearcherWithIndex_2_classLit = createForClass("com.actelion.research.chem", "SSSearcherWithIndex", 173, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_SVGDepictor = function $clinit_SVGDepictor() {
    carc2.$clinit_SVGDepictor = emptyMethod;
    carc2.$clinit_AbstractDepictor();
  };
  carc2.SVGDepictor = function SVGDepictor(mol, displayMode, id_0) {
    carc2.$clinit_SVGDepictor();
    carc2.AbstractDepictor_0.call(this, mol, displayMode);
    this.$init_46();
    this.id_0 = id_0;
    carc2.instanceCnt++;
  };
  carc2.escapeXML = function escapeXML(s) {
    var c, ch_0, i, length_0, sb;
    sb = new jl.StringBuilder();
    length_0 = jl.length__I__devirtual$_0(s);
    for (i = 0; i < length_0; i++) {
      c = jl.codePointAt_I_I__devirtual$(s, i);
      ch_0 = narrow_char(c);
      switch (c) {
        case 38:
          sb.append_9("&amp;");
          break;
        case 60:
          sb.append_9("&lt;");
          break;
        case 62:
          sb.append_9("&gt;");
          break;
        case 34:
          sb.append_9("&quot;");
          break;
        case 39:
          sb.append_9("&apos;");
          break;
        default:
          sb.append_4(ch_0);
      }
    }
    return sb.toString_0();
  };
  carc2.makeColor = function makeColor(r, g, b) {
    return "rgb(" + r + "," + g + "," + b + ")";
  };
  carc2.round_0 = function round_0(number) {
    return new jm.BigDecimal(number).setScale(2, (jm.$clinit_RoundingMode(), jm.HALF_EVEN)).doubleValue();
  };
  defineClass(286, 161, { 1: 1 }, carc2.SVGDepictor);
  _.$init_46 = function $init_46() {
    this.lineWidth = 1;
    this.textSize = 10;
    this.width_0 = 400;
    this.height_0 = 400;
    this.legacyMode = true;
    this.currentColor = "black";
    this.bonds = new ju.ArrayList();
    this.atoms = new ju.ArrayList();
    this.buffer = new jl.StringBuilder();
    this.currentFont = new ja.Font("Helvetica", 0, 12);
  };
  _.drawBlackLine = function drawBlackLine(theLine) {
    var s;
    s = '<line x1="' + carc2.round_0(theLine.x1) + '" y1="' + carc2.round_0(theLine.y1) + '" x2="' + carc2.round_0(theLine.x2) + '" y2="' + carc2.round_0(theLine.y2) + '" stroke="' + this.currentColor + '" stroke-width="' + this.lineWidth + '" />';
    this.write_1(s);
  };
  _.drawDottedLine_0 = function drawDottedLine(theLine) {
    var d, s;
    d = carc2.round_0(3 * this.lineWidth);
    s = '<line stroke-dasharray="' + d + "," + d + '" x1="' + carc2.round_0(theLine.x1) + '" y1="' + carc2.round_0(theLine.y1) + '" x2="' + carc2.round_0(theLine.x2) + '" y2="' + carc2.round_0(theLine.y2) + '" stroke="' + this.currentColor + '" stroke-width:' + this.lineWidth + '" />';
    this.write_1(s);
  };
  _.drawPolygon_0 = function drawPolygon(p) {
    var i, s;
    s = new jl.StringBuilder_1('<polygon points="');
    for (i = 0; i < p.getSize_0(); i++) {
      s.append_6(jl.round_1(p.getX_0(i)));
      s.append_9(",");
      s.append_6(jl.round_1(p.getY_0(i)));
      s.append_9(" ");
    }
    s.append_9('" fill="' + this.currentColor + '" stroke="' + this.currentColor + '" stroke-width="' + this.lineWidth + '" />');
    this.write_1(s.toString_0());
  };
  _.drawString_0 = function drawString(theString, x_0, y_0) {
    var s, strWidth;
    strWidth = this.getStringWidth(theString);
    s = '<text x="' + carc2.round_0(x_0 - strWidth / 2) + '" y="' + carc2.round_0(y_0 + this.textSize / 3) + '" stroke="none" font-size="' + this.currentFont.getSize_0() + '" fill="' + carc2.escapeXML(this.currentColor) + '">' + carc2.escapeXML(theString) + "</text>";
    this.write_1(s);
  };
  _.fillCircle_0 = function fillCircle(x_0, y_0, d) {
    var s;
    s = '<circle cx="' + carc2.round_0(x_0 + d / 2) + '" cy="' + carc2.round_0(y_0 + d / 2) + '" r="' + carc2.round_0(d / 2) + '" fill="' + this.currentColor + '" />';
    this.write_1(s);
  };
  _.getId = function getId() {
    return jsNotEquals(this.id_0, null) ? this.id_0 : "mol" + carc2.instanceCnt;
  };
  _.getStringWidth = function getStringWidth(theString) {
    var ret;
    ret = this.currentFont.getStringBounds(theString, this.graphics.getFontRenderContext()).getWidth_0();
    return ret;
  };
  _.getTextSize = function getTextSize() {
    return this.textSize;
  };
  _.onDrawAtom = function onDrawAtom_0(atom, symbol, x_0, y_0) {
    var atomMapNo, s;
    atomMapNo = this.getMolecule_0().getAtomMapNo_0(atom);
    s = '<circle id="' + carc2.escapeXML(this.getId()) + ":Atom:" + atom + '" class="event" ' + (atomMapNo == 0 ? "" : 'data-atom-map-no="' + atomMapNo + '" ') + 'cx="' + carc2.round_0(x_0) + '" cy="' + carc2.round_0(y_0) + '" r="8" opacity="0" />';
    this.atoms.add(s);
  };
  _.onDrawBond = function onDrawBond_0(bond, x1, y1, x2, y2) {
    var s;
    s = '<line id="' + carc2.escapeXML(this.getId()) + ":Bond:" + bond + '" class="event" x1="' + carc2.round_0(x1) + '" y1="' + carc2.round_0(y1) + '" x2="' + carc2.round_0(x2) + '" y2="' + carc2.round_0(y2) + '" stroke-width="8" opacity="0" />';
    this.bonds.add(s);
  };
  _.setLineWidth_0 = function setLineWidth(width_0) {
    this.lineWidth = toDouble_0(jl.round_1(100 * $wnd.Math.max(width_0, 1))) / 100;
  };
  _.setRGB_0 = function setRGB(rgb) {
    this.currentColor = carc2.makeColor((rgb & 16711680) >> 16, (rgb & 65280) >> 8, rgb & 255);
  };
  _.setTextSize = function setTextSize(theSize) {
    if (this.textSize != theSize) {
      this.textSize = theSize;
      this.currentFont = new ja.Font("Helvetica", 0, theSize);
    }
  };
  _.simpleValidateView = function simpleValidateView_0(viewRect, mode) {
    var img;
    this.width_0 = toInt_0(jl.round_1(viewRect.getWidth_0()));
    this.height_0 = toInt_0(jl.round_1(viewRect.getHeight_0()));
    img = new jai.BufferedImage(this.width_0, this.height_0, 2);
    this.graphics = img.createGraphics();
    return getClassPrototype(161).simpleValidateView.call(this, viewRect, mode);
  };
  _.toString_0 = function toString_11() {
    var a, a$iterator, b, b$iterator, footer, header, style;
    header = '<svg id="' + carc2.escapeXML(this.getId()) + '" xmlns="http://www.w3.org/2000/svg" version="1.1" width="' + this.width_0 + 'px" height="' + this.height_0 + 'px" viewBox="0 0 ' + this.width_0 + " " + this.height_0 + '">\n';
    footer = "</svg>";
    style = this.legacyMode ? "<style> #" + carc2.escapeXML(this.getId()) + " { pointer-events:none; } #" + carc2.escapeXML(this.getId()) + " .event  { pointer-events:all; } line { stroke-linecap:round; } polygon { stroke-linejoin:round; } </style>\n" : '<g style="font-size:' + this.getTextSize() + 'px; fill-opacity:1; stroke-opacity:1; fill:black; stroke:black; font-weight:normal; text-rendering:optimizeLegibility; font-family:sans-serif; stroke-linejoin:round; stroke-linecap:round; stroke-dashoffset:0;">';
    header += "  ";
    header += "" + style;
    if (this.legacyMode) {
      for (b$iterator = this.bonds.iterator(); b$iterator.hasNext_0(); ) {
        b = castToString(b$iterator.next_3());
        this.write_1(b);
      }
      for (a$iterator = this.atoms.iterator(); a$iterator.hasNext_0(); ) {
        a = castToString(a$iterator.next_3());
        this.write_1(a);
      }
    }
    if (!this.legacyMode)
      this.write_1("</g>");
    return header + ("" + this.buffer.toString_0()) + footer;
  };
  _.write_1 = function write_0(s) {
    this.buffer.append_9("  ");
    this.buffer.append_9(s);
    this.buffer.append_9("\n");
  };
  _.height_0 = 0;
  _.legacyMode = false;
  _.lineWidth = 0;
  _.textSize = 0;
  _.width_0 = 0;
  carc2.DEFAULT_ELEM_WIDTH = 8;
  carc2.FONTNAME = "Helvetica";
  carc2.instanceCnt = 0;
  cggl.Lcom_actelion_research_chem_SVGDepictor_2_classLit = createForClass("com.actelion.research.chem", "SVGDepictor", 286, cggl.Lcom_actelion_research_chem_AbstractDepictor_2_classLit);
  carc2.$clinit_SmilesAtom = function $clinit_SmilesAtom() {
    carc2.$clinit_SmilesAtom = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.SmilesAtom = function SmilesAtom(atom, bond, parent_0, isSideChainStart, isSideChainEnd) {
    carc2.$clinit_SmilesAtom();
    Object_0.call(this);
    this.$init_47();
    this.atom = atom;
    this.bond = bond;
    this.parent_0 = parent_0;
    this.isSideChainStart = isSideChainStart;
    this.isSideChainEnd = isSideChainEnd;
  };
  defineClass(66, 1, { 66: 1, 1: 1 }, carc2.SmilesAtom);
  _.$init_47 = function $init_47() {
  };
  _.isOpeningClosureTo = function isOpeningClosureTo(atom) {
    var i;
    if (jsNotEquals(this.closureNeighbour, null)) {
      for (i = 0; i < this.closureNeighbour.length; i++)
        if (atom == this.closureNeighbour[i] && this.closureOpens[i])
          return true;
    }
    return false;
  };
  _.atom = 0;
  _.bond = 0;
  _.isSideChainEnd = false;
  _.isSideChainStart = false;
  _.parent_0 = 0;
  cggl.Lcom_actelion_research_chem_SmilesAtom_2_classLit = createForClass("com.actelion.research.chem", "SmilesAtom", 66, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_SmilesAtomParser = function $clinit_SmilesAtomParser() {
    carc2.$clinit_SmilesAtomParser = emptyMethod;
    jl.$clinit_Object();
    carc2.HYDROGEN_ANY = -1;
  };
  carc2.SmilesAtomParser = function SmilesAtomParser(parser, mode) {
    carc2.$clinit_SmilesAtomParser();
    Object_0.call(this);
    this.$init_48();
    this.mParentParser = parser;
    this.mMode = mode;
    this.mAllowCactvs = (mode & 16) == 0;
    this.atomicNo = -1;
    this.charge = 0;
    this.mapNo = 0;
    this.abnormalValence = -1;
    this.explicitHydrogens = -1;
    this.atomQueryFeatures = 0;
  };
  defineClass(327, 1, { 1: 1 }, carc2.SmilesAtomParser);
  _.$init_48 = function $init_48() {
  };
  _.addAtomToList = function addAtomToList(atomicNo) {
    if (isNull(this.atomList))
      this.atomList = new caru.SortedList();
    this.atomList.add_10(jl.valueOf_12(atomicNo));
  };
  _.addParsedAtom = function addParsedAtom(mol, theChar, position) {
    var atom, bytes, group, group$iterator, i, list;
    atom = mol.addAtom_2(this.atomicNo);
    mol.setAtomCharge_0(atom, this.charge);
    mol.setAtomMapNo_0(atom, this.mapNo, false);
    mol.setAtomAbnormalValence_0(atom, this.abnormalValence);
    if (neq(this.atomQueryFeatures, 0)) {
      if (neq(and_0(this.atomQueryFeatures, 2), 0)) {
        this.atomQueryFeatures = and_0(this.atomQueryFeatures, not_0(2));
        mol.setAtomMarker_0(atom, true);
      } else {
        mol.setAtomMarker_0(atom, false);
      }
      mol.setAtomQueryFeature_0(atom, this.atomQueryFeatures, true);
    }
    if (isNotNull(this.atomList)) {
      list = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.atomList.size_1(), 15, 1);
      for (i = 0; i < this.atomList.size_1(); i++)
        list[i] = castTo(this.atomList.get_3(i), 35).intValue();
      mol.setAtomList_0(atom, list);
      this.atomList.removeAll_0();
    } else {
      if (isLowerCase_0(theChar)) {
        if (this.atomicNo != 5 && this.atomicNo != 6 && this.atomicNo != 7 && this.atomicNo != 8 && this.atomicNo != 15 && this.atomicNo != 16 && this.atomicNo != 33 && this.atomicNo != 34)
          throw toJs(new jl.Exception_1("SmilesParser: atomicNo " + this.atomicNo + " must not be aromatic. Position:" + (position - 1)));
        mol.setAtomMarker_0(atom, true);
      } else {
        mol.setAtomMarker_0(atom, false);
      }
    }
    if (isNotNull(this.excludeGroupList)) {
      for (group$iterator = this.excludeGroupList.iterator(); group$iterator.hasNext_0(); ) {
        group = castTo(group$iterator.next_3(), 17);
        this.smartsFeatureFound = true;
        group.setAtomicNo_0(0, 0);
        mol.setFragment_0(true);
        mol.addSubstituent_0(group, atom);
      }
    }
    if (this.explicitHydrogens != -1 && this.atomicNo != 1) {
      bytes = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, 1, 15, 1);
      bytes[0] = narrow_byte(this.explicitHydrogens);
      mol.setAtomCustomLabel_1(atom, bytes);
    }
    return atom;
  };
  _.advanceJustAfterClosingBracket = function advanceJustAfterClosingBracket(smiles, position) {
    var level;
    level = 0;
    while (position < smiles.length && (smiles[position] != 93 || level != 0)) {
      if (smiles[position] == 91)
        level++;
      else if (smiles[position] == 93)
        level--;
      position++;
    }
    if (position == smiles.length)
      throw toJs(new jl.Exception_1("SmilesParser: No matching closing bracket found."));
    return position + 1;
  };
  _.foundParities = function foundParities() {
    return this.parityFound;
  };
  _.foundSmartsFeatures = function foundSmartsFeatures() {
    return this.smartsFeatureFound;
  };
  _.getAtomicNo_1 = function getAtomicNo_0() {
    return this.atomicNo;
  };
  _.getExplicitHydrogens_1 = function getExplicitHydrogens_0() {
    return this.explicitHydrogens;
  };
  _.getRecursiveGroup = function getRecursiveGroup() {
    return isNull(this.recursiveSmartsList) ? null : castTo(this.recursiveSmartsList.getAtIndex(0), 17);
  };
  _.isClockwise_0 = function isClockwise_0() {
    return this.isClockwise;
  };
  _.isRepeatedAllowedORFeature = function isRepeatedAllowedORFeature(smiles, commaPosition, skipCount) {
    var index1, index2;
    if (commaPosition < 3)
      return false;
    index1 = commaPosition - 1;
    if (smiles[index1] == 43 || smiles[index1] == 45)
      index1--;
    if (!jl.isDigit_0(smiles[index1]))
      return false;
    index1--;
    if (smiles[index1] != 68 && smiles[index1] != 82 && smiles[index1] != 88 && smiles[index1] != 122)
      return false;
    skipCount[0] = 0;
    while (index1 > 0 && isLetter(smiles[index1 - 1])) {
      index1--;
      skipCount[0]++;
    }
    index2 = commaPosition + 1;
    while (isLetter(smiles[index1])) {
      if (smiles.length <= index2 || smiles[index1] != smiles[index2])
        return false;
      index1++;
      index2++;
    }
    return true;
  };
  _.parseAtomInsideBrackets = function parseAtomInsideBrackets(smiles, position, endIndex, allowSmarts, allowAtomOptions) {
    var flags, hybridization, isNot, isNotList, labelInfo, localCharge, mayBeAliphatic, mayBeAromatic, piElectrons, range, ringSize, skipCount, squareBracketOpen, start_0, valence, valences;
    if (smiles[position - 1] == 36) {
      this.smartsFeatureFound = true;
      this.recursiveSmartsList = new ju.ArrayList();
      position += this.parseRecursiveGroup(smiles, position - 1, this.recursiveSmartsList) - 1;
      if (smiles[position++] != 93) {
        if (!allowAtomOptions)
          throw toJs(new jl.Exception_1("SmilesParser: A positive recursive SMARTS followed by another one or by atom query features is not supported. Position:" + (position - 1)));
        if ((this.mMode & 128) == 0)
          position = this.advanceJustAfterClosingBracket(smiles, position);
      }
      return position;
    }
    if (smiles[position - 1] == 42) {
      this.atomicNo = 6;
      this.atomQueryFeatures = or_0(this.atomQueryFeatures, 1);
    } else if (smiles[position - 1] == 63) {
      this.atomicNo = 0;
    } else {
      isNotList = smiles[position - 1] == 33;
      if (isNotList) {
        this.smartsFeatureFound = true;
        this.atomQueryFeatures = or_0(this.atomQueryFeatures, 1);
        position++;
      }
      if (smiles[position - 1] == 82 && allowSmarts && (jl.isDigit_0(smiles[position]) || this.mAllowCactvs && smiles[position] == 123)) {
        this.atomicNo = 6;
        this.atomQueryFeatures = or_0(this.atomQueryFeatures, 1);
        position--;
        if (isNotList)
          position--;
      } else {
        labelInfo = new carc2.SmilesAtomParser$AtomLabelInfo();
        if (!this.parseAtomLabelInBrackets(smiles, position - 1, endIndex, labelInfo))
          throw toJs(new jl.Exception_1("SmilesParser: Unexpected character in atom definition:'" + charToString(narrow_char(smiles[position - 1])) + "' position:" + (position - 1)));
        this.atomicNo = labelInfo.atomicNo;
        position += labelInfo.labelLength - 1;
        if ((this.mMode & 3) != 2)
          this.explicitHydrogens = 9;
        if (allowSmarts && (smiles[position] == 44 || isNotList)) {
          mayBeAromatic = labelInfo.mayBeAromatic;
          mayBeAliphatic = labelInfo.mayBeAliphatic;
          start_0 = position - labelInfo.labelLength;
          while (start_0 < endIndex) {
            if (!this.parseAtomLabelInBrackets(smiles, start_0, endIndex, labelInfo)) {
              if (!isNotList)
                throw toJs(new jl.Exception_1("SmilesParser: Unexpected character in atom list:'" + charToString(narrow_char(smiles[start_0])) + "'. Position:" + start_0));
              break;
            }
            if (labelInfo.atomicNo == 1) {
              if (!isNotList)
                throw toJs(new jl.Exception_1("SmilesParser: Hydrogen is not supported in positive atom lists:'" + jl.$create_7(ju.copyOfRange(smiles, start_0, endIndex)) + "'. Position:" + start_0));
            } else {
              this.addAtomToList(labelInfo.atomicNo);
              mayBeAromatic = mayBeAromatic | labelInfo.mayBeAromatic;
              mayBeAliphatic = mayBeAliphatic | labelInfo.mayBeAliphatic;
            }
            start_0 += labelInfo.labelLength;
            if (isNotList && smiles[start_0] != 59 && smiles[start_0] != 38)
              break;
            if (!isNotList && smiles[start_0] != 44)
              break;
            if (isNotList && smiles[start_0 + 1] != 33)
              break;
            start_0++;
            if (smiles[start_0] == 33)
              start_0++;
          }
          if (isNotNull(this.atomList) && this.atomList.size_1() > 1) {
            this.explicitHydrogens = -1;
            if (!mayBeAliphatic)
              this.atomQueryFeatures = or_0(this.atomQueryFeatures, 2);
            else if (!mayBeAromatic)
              this.atomQueryFeatures = or_0(this.atomQueryFeatures, 4);
          }
          position = start_0;
        }
      }
    }
    range = new carc2.SmilesAtomParser$SmilesRange(smiles);
    skipCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 1, 15, 1);
    squareBracketOpen = true;
    while (squareBracketOpen) {
      if (smiles[position] == 64) {
        position++;
        if (smiles[position] == 64) {
          this.isClockwise = true;
          position++;
        }
        this.parityFound = true;
        continue;
      }
      if (smiles[position] == 58) {
        position++;
        while (jl.isDigit_0(smiles[position])) {
          this.mapNo = 10 * this.mapNo + smiles[position] - 48;
          position++;
        }
        continue;
      }
      if (smiles[position] == 91)
        throw toJs(new jl.Exception_1("SmilesParser: nested square brackets found. Position:" + position));
      if (smiles[position] == 93) {
        position++;
        squareBracketOpen = false;
        continue;
      }
      this.charge = this.parseCharge(smiles, position, skipCount);
      if (skipCount[0] != 0) {
        position += skipCount[0];
        if (this.charge == 0)
          this.atomQueryFeatures = or_0(this.atomQueryFeatures, or_0(33554432, 134217728));
        continue;
      }
      isNot = smiles[position] == 33;
      if (isNot)
        position++;
      if (smiles[position] == 72) {
        position++;
        position += range.parse_6(position, 1, 1);
        flags = 0;
        if (range.min_0 <= 0 && range.max_0 >= 0)
          flags = or_0(flags, 128);
        if (range.min_0 <= 1 && range.max_0 >= 1)
          flags = or_0(flags, 256);
        if (range.min_0 <= 2 && range.max_0 >= 2)
          flags = or_0(flags, 512);
        if (range.min_0 <= 3 && range.max_0 >= 3)
          flags = or_0(flags, 1024);
        if (isNot) {
          this.atomQueryFeatures = or_0(this.atomQueryFeatures, flags);
          this.explicitHydrogens = -1;
        } else {
          if (range.isSingle()) {
            this.explicitHydrogens = range.min_0;
          } else {
            this.atomQueryFeatures = or_0(this.atomQueryFeatures, and_0(1920, not_0(flags)));
            this.explicitHydrogens = -1;
          }
        }
        continue;
      }
      if (smiles[position] == 68 || smiles[position] == 100) {
        position++;
        position += range.parse_6(position, 1, 1);
        flags = 0;
        if (range.min_0 <= 0 && range.max_0 >= 0)
          flags = or_0(flags, 131072);
        if (range.min_0 <= 1 && range.max_0 >= 1)
          flags = or_0(flags, 262144);
        if (range.min_0 <= 2 && range.max_0 >= 2)
          flags = or_0(flags, 524288);
        if (range.min_0 <= 3 && range.max_0 >= 3)
          flags = or_0(flags, 1048576);
        if (range.min_0 <= 4 && range.max_0 >= 4)
          flags = or_0(flags, 2097152);
        if (neq(flags, 0)) {
          if (isNot)
            this.atomQueryFeatures = or_0(this.atomQueryFeatures, flags);
          else if (neq(and_0(this.atomQueryFeatures, 4063232), 0))
            this.atomQueryFeatures = and_0(this.atomQueryFeatures, not_0(flags));
          else {
            flags = xor_0(flags, 4063232);
            this.atomQueryFeatures = or_0(this.atomQueryFeatures, flags);
          }
        }
        continue;
      }
      if (smiles[position] == 122 && this.mAllowCactvs) {
        position++;
        position += range.parse_6(position, 1, 4);
        flags = 0;
        if (range.min_0 <= 0 && range.max_0 >= 0)
          flags = or_0(flags, 549755813888);
        if (range.min_0 <= 1 && range.max_0 >= 1)
          flags = or_0(flags, 1099511627776);
        if (range.min_0 <= 2 && range.max_0 >= 2)
          flags = or_0(flags, 2199023255552);
        if (range.min_0 <= 3 && range.max_0 >= 3)
          flags = or_0(flags, 4398046511104);
        if (range.min_0 <= 4 && range.max_0 >= 4)
          flags = or_0(flags, 8796093022208);
        if (neq(flags, 0)) {
          if (isNot)
            this.atomQueryFeatures = or_0(this.atomQueryFeatures, flags);
          else if (neq(and_0(this.atomQueryFeatures, 17042430230528), 0))
            this.atomQueryFeatures = and_0(this.atomQueryFeatures, not_0(flags));
          else {
            flags = xor_0(flags, 17042430230528);
            this.atomQueryFeatures = or_0(this.atomQueryFeatures, flags);
          }
        }
        continue;
      }
      if (smiles[position] == 88) {
        position++;
        position += range.parse_6(position, 1, 1);
        valences = (carc2.$clinit_Molecule(), carc2.cAtomValence)[this.atomicNo];
        if (jsEquals(valences, null))
          continue;
        valence = valences[0];
        localCharge = this.parseCharge(smiles, position, skipCount);
        if (skipCount[0] != 0) {
          if (carc2.isAtomicNoElectronegative(this.atomicNo))
            valence += localCharge;
          else if (this.atomicNo == 6)
            valence -= $wnd.Math.abs(localCharge);
          else
            valence -= localCharge;
        }
        flags = 0;
        if (valence - range.min_0 <= 0 && valence - range.max_0 >= 0)
          flags = or_0(flags, 16384);
        if (valence - range.min_0 <= 1 && valence - range.max_0 >= 1)
          flags = or_0(flags, 32768);
        if (valence - range.min_0 <= 2 && valence - range.max_0 >= 2)
          flags = or_0(flags, 65536);
        if (neq(flags, 0)) {
          if (isNot)
            this.atomQueryFeatures = or_0(this.atomQueryFeatures, flags);
          else if (neq(and_0(this.atomQueryFeatures, 114688), 0))
            this.atomQueryFeatures = and_0(this.atomQueryFeatures, not_0(flags));
          else {
            flags = xor_0(flags, 114688);
            this.atomQueryFeatures = or_0(this.atomQueryFeatures, flags);
          }
        }
        continue;
      }
      if (smiles[position] == 65 || smiles[position] == 97) {
        this.atomQueryFeatures = or_0(this.atomQueryFeatures, isNot ^ smiles[position] == 65 ? 4 : 2);
        position++;
        continue;
      }
      if (smiles[position] == 82) {
        position++;
        position += range.parse_6(position, 1, 3);
        flags = 0;
        if (range.min_0 <= 0 && range.max_0 >= 0)
          flags = or_0(flags, 8);
        if (range.min_0 <= 1 && range.max_0 >= 1)
          flags = or_0(flags, 16);
        if (range.min_0 <= 2 && range.max_0 >= 2)
          flags = or_0(flags, 32);
        if (range.min_0 <= 3 && range.max_0 >= 3)
          flags = or_0(flags, 64);
        if (range.max_0 > 3)
          this.mParentParser.smartsWarning((isNot ? "!R" : "R") + range.max_0);
        if (neq(flags, 0)) {
          if (isNot)
            this.atomQueryFeatures = or_0(this.atomQueryFeatures, flags);
          else if (neq(and_0(this.atomQueryFeatures, 120), 0))
            this.atomQueryFeatures = and_0(this.atomQueryFeatures, not_0(flags));
          else {
            flags = xor_0(flags, 120);
            this.atomQueryFeatures = or_0(this.atomQueryFeatures, flags);
          }
        }
        continue;
      }
      if (smiles[position] == 114) {
        position++;
        position += range.parse_6(position, 1, 1);
        if (range.isDefault) {
          if (isNot)
            this.atomQueryFeatures = or_0(this.atomQueryFeatures, and_0(384, not_0(8)));
          else
            this.atomQueryFeatures = or_0(this.atomQueryFeatures, 8);
          continue;
        }
        ringSize = range.min_0;
        if (range.isRange())
          this.mParentParser.smartsWarning((isNot ? "!r" : "r") + ("" + range.toString_0()));
        if (!isNot && ringSize >= 3 && ringSize <= 7)
          this.atomQueryFeatures = or_0(this.atomQueryFeatures, fromInt_0(ringSize << 22));
        else if (!range.isRange())
          this.mParentParser.smartsWarning((isNot ? "!r" : "r") + ringSize);
        continue;
      }
      if (smiles[position] == 118) {
        position++;
        position += range.parse_6(position, 1, 1);
        valence = range.min_0;
        if (range.isRange())
          this.mParentParser.smartsWarning((isNot ? "!v" : "v") + ("" + range.toString_0()));
        if (!isNot && valence <= 14)
          this.abnormalValence = valence;
        else if (!range.isRange())
          this.mParentParser.smartsWarning((isNot ? "!v" : "v") + valence);
        continue;
      }
      if (smiles[position] == 94) {
        position++;
        hybridization = smiles[position++] - 48;
        if (hybridization < 1 || hybridization > 3)
          throw toJs(new jl.Exception_1("SmilesParser: Unsupported hybridization. Position:" + position));
        piElectrons = hybridization == 1 ? 65536 : hybridization == 2 ? 32768 : 16384;
        if (!isNot)
          piElectrons = and_0(114688, not_0(piElectrons));
        this.atomQueryFeatures = or_0(this.atomQueryFeatures, piElectrons);
        continue;
      }
      if (smiles[position] == 36) {
        if (!isNot)
          throw toJs(new jl.Exception_1("SmilesParser: non-negated recursive SMARTS relating to preceding atom are not supported yet. Position:" + position));
        if (isNull(this.excludeGroupList))
          this.excludeGroupList = new ju.ArrayList();
        this.smartsFeatureFound = true;
        position += this.parseRecursiveGroup(smiles, position, this.excludeGroupList);
        continue;
      }
      if (allowSmarts && (smiles[position] == 59 || smiles[position] == 38)) {
        this.smartsFeatureFound = true;
        position++;
        continue;
      }
      if (allowSmarts && smiles[position] == 44 && this.isRepeatedAllowedORFeature(smiles, position, skipCount)) {
        this.smartsFeatureFound = true;
        position += skipCount[0] + 1;
        continue;
      }
      if (allowSmarts && smiles[position] == 44 && (this.mMode & 128) != 0) {
        this.smartsFeatureFound = true;
        position += 1;
        break;
      }
      if (smiles[position] == 44)
        throw toJs(new jl.Exception_1("SmilesParser: alternative atom definitions not supported. (Tip: enumerate SMARTS): '" + charToString(narrow_char(smiles[position])) + "', position:" + position));
      throw toJs(new jl.Exception_1("SmilesParser: unexpected character inside brackets: '" + charToString(narrow_char(smiles[position])) + "', position:" + position));
    }
    return position;
  };
  _.parseAtomLabelInBrackets = function parseAtomLabelInBrackets(smiles, position, endIndex, info) {
    info.mayBeAromatic = true;
    info.mayBeAliphatic = true;
    if (smiles[position] == 35) {
      position++;
      this.smartsFeatureFound = true;
      info.atomicNo = 0;
      info.labelLength = 1;
      while (position < endIndex && jl.isDigit_0(smiles[position])) {
        info.atomicNo = 10 * info.atomicNo + smiles[position] - 48;
        info.labelLength++;
        position++;
      }
      if (info.atomicNo == 0 || info.atomicNo >= (carc2.$clinit_Molecule(), carc2.cAtomLabel).length)
        throw toJs(new jl.Exception_1("SmilesParser: Atomic number out of range. position:" + (position - 1)));
      return true;
    }
    if (smiles[position] >= 65 && smiles[position] <= 90) {
      info.labelLength = smiles[position + 1] >= 97 && smiles[position + 1] <= 122 ? 2 : 1;
      info.atomicNo = carc2.getAtomicNoFromLabel(jl.$create_10(smiles, position, info.labelLength, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
      if (info.labelLength == 2 && info.atomicNo == 0) {
        info.labelLength = 1;
        info.atomicNo = carc2.getAtomicNoFromLabel(jl.$create_10(smiles, position, info.labelLength, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
      }
      info.mayBeAromatic = false;
      if (info.atomicNo == 0)
        throw toJs(new jl.Exception_1("SmilesParser: Unknown atom label. position:" + (position - 1)));
      return true;
    }
    if (smiles[position] == 65 && smiles[position + 1] == 115 || smiles[position] == 83 && smiles[position + 1] == 101) {
      info.labelLength = 2;
      info.atomicNo = carc2.getAtomicNoFromLabel(jl.$create_10(smiles, position, info.labelLength, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
      info.mayBeAliphatic = false;
      return true;
    }
    if (smiles[position] == 99 || smiles[position] == 110 || smiles[position] == 111 || smiles[position] == 112 || smiles[position] == 115) {
      info.labelLength = 1;
      info.atomicNo = carc2.getAtomicNoFromLabel(jl.$create_10(smiles, position, info.labelLength, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
      info.mayBeAliphatic = false;
      return true;
    }
    return false;
  };
  _.parseAtomOutsideBrackets = function parseAtomOutsideBrackets(smiles, position, endIndex, allowSmarts) {
    if (smiles[position - 1] == 42) {
      this.atomicNo = 6;
      this.atomQueryFeatures = or_0(this.atomQueryFeatures, 1);
    } else if (smiles[position - 1] == 63) {
      this.atomicNo = 0;
    } else if ((smiles[position - 1] == 65 || smiles[position - 1] == 97) && allowSmarts) {
      this.atomicNo = 6;
      this.atomQueryFeatures = or_0(this.atomQueryFeatures, 1);
      this.atomQueryFeatures = or_0(this.atomQueryFeatures, smiles[position - 1] == 65 ? 4 : 2);
      this.smartsFeatureFound = true;
    } else {
      switch (toUpperCase(smiles[position - 1])) {
        case 66:
          if (position < endIndex && smiles[position] == 114) {
            this.atomicNo = 35;
            position++;
          } else
            this.atomicNo = 5;
          break;
        case 67:
          if (position < endIndex && smiles[position] == 108) {
            this.atomicNo = 17;
            position++;
          } else
            this.atomicNo = 6;
          break;
        case 70:
          this.atomicNo = 9;
          break;
        case 73:
          this.atomicNo = 53;
          break;
        case 78:
          this.atomicNo = 7;
          break;
        case 79:
          this.atomicNo = 8;
          break;
        case 80:
          this.atomicNo = 15;
          break;
        case 83:
          this.atomicNo = 16;
          break;
      }
    }
    return position;
  };
  _.parseCharge = function parseCharge(smiles, position, characterCount) {
    var charge, symbol;
    characterCount[0] = 0;
    if (smiles[position] == 43 || smiles[position] == 45) {
      symbol = smiles[position];
      charge = 1;
      characterCount[0]++;
      while (smiles[position + characterCount[0]] == symbol) {
        charge++;
        characterCount[0]++;
      }
      if (charge == 1 && jl.isDigit_0(smiles[position + 1])) {
        charge = smiles[position + 1] - 48;
        characterCount[0]++;
      }
      return symbol == 43 ? charge : -charge;
    }
    return 0;
  };
  _.parseRecursiveGroup = function parseRecursiveGroup(smiles, dollarIndex, groupList) {
    var atom, endIndex, group, openBrackets, parser;
    if (smiles[dollarIndex + 1] != 40)
      throw toJs(new jl.Exception_1("SmilesParser: '$' for recursive SMARTS must be followed by '('. position:" + dollarIndex));
    openBrackets = 1;
    endIndex = dollarIndex + 2;
    while (endIndex < smiles.length && openBrackets > 0) {
      if (smiles[endIndex] == 40)
        openBrackets++;
      else if (smiles[endIndex] == 41)
        openBrackets--;
      endIndex++;
    }
    if (openBrackets > 0)
      throw toJs(new jl.Exception_1("SmilesParser: Missing closing ')' for recursive SMARTS. '('-position:" + (dollarIndex + 1)));
    group = new carc2.StereoMolecule_0(16, 16);
    parser = new carc2.SmilesParser_0(this.mMode);
    parser.setEnumerationPositionList(this.mParentParser.getEnumerationPositionList());
    parser.parse_7(group, smiles, dollarIndex + 2, endIndex - 1);
    group.setFragment_0(true);
    groupList.add(group);
    if (smiles[dollarIndex - 1] == 33)
      for (atom = 0; atom < group.getAllAtoms_0(); atom++)
        group.setAtomQueryFeature_0(atom, 536870912, true);
    return endIndex - dollarIndex;
  };
  _.abnormalValence = 0;
  _.atomQueryFeatures = 0;
  _.atomicNo = 0;
  _.charge = 0;
  _.explicitHydrogens = 0;
  _.isClockwise = false;
  _.mAllowCactvs = false;
  _.mMode = 0;
  _.mapNo = 0;
  _.parityFound = false;
  _.smartsFeatureFound = false;
  carc2.HYDROGEN_ANY = 0;
  cggl.Lcom_actelion_research_chem_SmilesAtomParser_2_classLit = createForClass("com.actelion.research.chem", "SmilesAtomParser", 327, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_SmilesAtomParser$AtomLabelInfo = function $clinit_SmilesAtomParser$AtomLabelInfo() {
    carc2.$clinit_SmilesAtomParser$AtomLabelInfo = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.SmilesAtomParser$AtomLabelInfo = function SmilesAtomParser$AtomLabelInfo() {
    carc2.$clinit_SmilesAtomParser$AtomLabelInfo();
    Object_0.call(this);
    this.$init_49();
    this.atomicNo = -1;
  };
  defineClass(454, 1, { 1: 1 }, carc2.SmilesAtomParser$AtomLabelInfo);
  _.$init_49 = function $init_49() {
  };
  _.atomicNo = 0;
  _.labelLength = 0;
  _.mayBeAliphatic = false;
  _.mayBeAromatic = false;
  cggl.Lcom_actelion_research_chem_SmilesAtomParser$AtomLabelInfo_2_classLit = createForClass("com.actelion.research.chem", "SmilesAtomParser/AtomLabelInfo", 454, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_SmilesAtomParser$SmilesRange = function $clinit_SmilesAtomParser$SmilesRange() {
    carc2.$clinit_SmilesAtomParser$SmilesRange = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.SmilesAtomParser$SmilesRange = function SmilesAtomParser$SmilesRange(smiles) {
    carc2.$clinit_SmilesAtomParser$SmilesRange();
    Object_0.call(this);
    this.$init_50();
    this.smiles = smiles;
  };
  defineClass(455, 1, { 1: 1 }, carc2.SmilesAtomParser$SmilesRange);
  _.$init_50 = function $init_50() {
  };
  _.isRange = function isRange() {
    return this.max_0 > this.min_0;
  };
  _.isSingle = function isSingle() {
    return this.max_0 == this.min_0;
  };
  _.parse_6 = function parse_6(position, defaultMin, defaultMax) {
    var firstLetter, i, letterCount, lettersMatch, val;
    this.isDefault = false;
    this.pos = position;
    if (jl.isDigit_0(this.smiles[position])) {
      val = this.parseInt_0();
      this.min_0 = this.max_0 = val;
      firstLetter = position - 1;
      while (firstLetter > 1 && isLetterOrDigit(this.smiles[firstLetter - 1]))
        firstLetter--;
      while (this.smiles[this.pos] == 44) {
        lettersMatch = true;
        letterCount = position - firstLetter;
        for (i = 0; i < letterCount; i++) {
          if (this.smiles[firstLetter + i] != this.smiles[this.pos + 1 + i]) {
            lettersMatch = false;
            break;
          }
        }
        if (!lettersMatch)
          break;
        this.pos += 1 + letterCount;
        val = this.parseInt_0();
        if (this.min_0 > val)
          this.min_0 = val;
        else if (this.max_0 < val)
          this.max_0 = val;
      }
      return this.pos - position;
    }
    if (this.smiles[position] == 123 && jl.isDigit_0(this.smiles[position + 1])) {
      this.pos++;
      this.min_0 = this.parseInt_0();
      if (this.smiles[this.pos++] != 45)
        return 0;
      if (!jl.isDigit_0(this.smiles[this.pos]))
        return 0;
      this.max_0 = this.parseInt_0();
      if (this.smiles[this.pos++] != 125)
        return 0;
      return this.pos - position;
    }
    this.min_0 = defaultMin;
    this.max_0 = defaultMax;
    this.isDefault = true;
    return 0;
  };
  _.parseInt_0 = function parseInt_0() {
    var num;
    num = this.smiles[this.pos++] - 48;
    if (jl.isDigit_0(this.smiles[this.pos]))
      num = 10 * num + (this.smiles[this.pos++] - 48);
    return num;
  };
  _.toString_0 = function toString_12() {
    return "{" + this.min_0 + "-" + this.max_0 + "}";
  };
  _.isDefault = false;
  _.max_0 = 0;
  _.min_0 = 0;
  _.pos = 0;
  cggl.Lcom_actelion_research_chem_SmilesAtomParser$SmilesRange_2_classLit = createForClass("com.actelion.research.chem", "SmilesAtomParser/SmilesRange", 455, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_SmilesParser = function $clinit_SmilesParser() {
    carc2.$clinit_SmilesParser = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.SmilesParser = function SmilesParser2() {
    carc2.$clinit_SmilesParser();
    carc2.SmilesParser_0.call(this, 0);
  };
  carc2.SmilesParser_0 = function SmilesParser_0(mode) {
    carc2.$clinit_SmilesParser();
    Object_0.call(this);
    this.$init_51();
    this.mMode = mode & ~3;
    this.mSmartsMode = mode & 3;
    this.mSingleDotSeparator = (mode & 32) != 0;
    this.mCreateSmartsWarnings = (mode & 64) != 0;
    this.mMakeHydrogenExplicit = (mode & 8) != 0;
    this.mCoordinateMode = 2;
    if ((mode & 4) != 0)
      this.mCoordinateMode |= 1;
    if (this.mMakeHydrogenExplicit)
      this.mCoordinateMode &= ~2;
  };
  defineClass(129, 1, { 1: 1 }, carc2.SmilesParser, carc2.SmilesParser_0);
  _.$init_51 = function $init_51() {
  };
  _.addConnection = function addConnection(a1, a2, bondType, pos1, pos2) {
    var bond;
    bond = this.mMol.addBond_1(a1, a2, bondType);
    this.mapConnectionBonds.put(a1 + "_" + a2, stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [pos1, pos2]));
    this.mapConnectionBonds.put(a2 + "_" + a1, stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [pos1, pos2]));
    this.bsAtomHasConnections.set_3(a1);
    this.bsAtomHasConnections.set_3(a2);
    return bond;
  };
  _.addLargeAromaticRing = function addLargeAromaticRing(bond) {
    var atom1, atom2, candidate, candidateBond, current, graphAtom, graphBond, graphLevel, graphParent, highest, i, j, parent_0;
    graphLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    graphBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    graphParent = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    atom1 = this.mMol.getBondAtom_0(0, bond);
    atom2 = this.mMol.getBondAtom_0(1, bond);
    graphAtom[0] = atom1;
    graphAtom[1] = atom2;
    graphBond[0] = -1;
    graphBond[1] = bond;
    graphLevel[atom1] = 1;
    graphLevel[atom2] = 2;
    graphParent[atom1] = -1;
    graphParent[atom2] = atom1;
    current = 1;
    highest = 1;
    while (current <= highest && graphLevel[graphAtom[current]] < 15) {
      parent_0 = graphAtom[current];
      for (i = 0; i < this.mMol.getConnAtoms_0(parent_0); i++) {
        candidate = this.mMol.getConnAtom_0(parent_0, i);
        if (candidate != graphParent[parent_0]) {
          candidateBond = this.mMol.getConnBond_0(parent_0, i);
          if (candidate == atom1) {
            graphBond[0] = candidateBond;
            for (j = 0; j <= highest; j++) {
              if (!this.mIsAromaticBond[graphBond[i]]) {
                this.mIsAromaticBond[graphBond[i]] = true;
                this.mAromaticBonds++;
              }
            }
            return;
          }
          if (this.mMol.isMarkedAtom_0(candidate) && graphLevel[candidate] == 0) {
            highest++;
            graphAtom[highest] = candidate;
            graphBond[highest] = candidateBond;
            graphLevel[candidate] = graphLevel[parent_0] + 1;
            graphParent[candidate] = parent_0;
          }
        }
      }
      current++;
    }
    return;
  };
  _.assignKnownEZBondParities = function assignKnownEZBondParities() {
    var atom, bond, bond0, connBond, i, i0, i1, isZ, j, otherAtom, paritiesFound, refAtom, refBond;
    this.mMol.ensureHelperArrays_0(7);
    paritiesFound = false;
    refAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    refBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    otherAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    for (bond0 = 0; bond0 < this.mMol.getBonds_0(); bond0++) {
      if (!this.mMol.isSmallRingBond_0(bond0) && this.mMol.getBondType_0(bond0) == 2) {
        for (i0 = 0; i0 < 2; i0++) {
          refAtom[i0] = -1;
          otherAtom[i0] = -1;
          atom = this.mMol.getBondAtom_0(i0, bond0);
          for (j = 0; j < this.mMol.getConnAtoms_0(atom); j++) {
            connBond = this.mMol.getConnBond_0(atom, j);
            if (connBond != bond0) {
              if (refAtom[i0] == -1 && (this.mMol.getBondType_0(connBond) == 257 || this.mMol.getBondType_0(connBond) == 129)) {
                refAtom[i0] = this.mMol.getConnAtom_0(atom, j);
                refBond[i0] = connBond;
              } else {
                otherAtom[i0] = this.mMol.getConnAtom_0(atom, j);
              }
            }
          }
          if (refAtom[i0] == -1)
            break;
        }
        if (refAtom[0] != -1 && refAtom[1] != -1) {
          isZ = this.mMol.getBondType_0(refBond[0]) == this.mMol.getBondType_0(refBond[1]);
          for (i1 = 0; i1 < 2; i1++)
            if (refAtom[i1] == this.mMol.getBondAtom_0(0, refBond[i1]))
              isZ = !isZ;
          for (i = 0; i < 2; i++)
            if (otherAtom[i] != -1 && otherAtom[i] < refAtom[i])
              isZ = !isZ;
          this.mMol.setBondParity_0(bond0, isZ ? 2 : 1, false);
          paritiesFound = true;
        }
      }
    }
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++)
      if (this.mMol.getBondType_0(bond) == 257 || this.mMol.getBondType_0(bond) == 129)
        this.mMol.setBondType_0(bond, 1);
    return paritiesFound;
  };
  _.bondSymbolToQueryFeature = function bondSymbolToQueryFeature(symbol) {
    return symbol == 61 ? 2 : symbol == 35 ? 4 : symbol == 36 ? 32 : symbol == 58 ? 8 : symbol == 62 ? 16 : symbol == 126 ? 127 : 1;
  };
  _.connectConjugatedRadicalPairs = function connectConjugatedRadicalPairs(isAromaticBond) {
    var atom, bond, bondOrder, candidate, current, graphAtom, graphLevel, graphParent, highest, i, parent_0;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mMol.isMarkedAtom_0(atom)) {
        graphLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
        graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
        graphParent = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
        graphAtom[0] = atom;
        graphLevel[atom] = 1;
        graphParent[atom] = -1;
        current = 0;
        highest = 0;
        while (current <= highest) {
          bondOrder = (graphLevel[graphAtom[current]] & 1) == 1 ? 1 : 2;
          for (i = 0; i < this.mMol.getConnAtoms_0(graphAtom[current]); i++) {
            bond = this.mMol.getConnBond_0(graphAtom[current], i);
            if (this.mMol.getBondOrder_0(bond) == bondOrder && isAromaticBond[bond]) {
              candidate = this.mMol.getConnAtom_0(graphAtom[current], i);
              if (graphLevel[candidate] == 0) {
                if (bondOrder == 1 && this.mMol.isMarkedAtom_0(candidate)) {
                  parent_0 = graphAtom[current];
                  while (parent_0 != -1) {
                    this.mMol.setBondType_0(this.mMol.getBond_0(candidate, parent_0), bondOrder == 1 ? 2 : 1);
                    bondOrder = 3 - bondOrder;
                    candidate = parent_0;
                    parent_0 = graphParent[parent_0];
                  }
                  this.mMol.setAtomMarker_0(atom, false);
                  this.mMol.setAtomMarker_0(candidate, false);
                  this.mAromaticAtoms -= 2;
                  return true;
                }
                graphAtom[++highest] = candidate;
                graphParent[candidate] = graphAtom[current];
                graphLevel[candidate] = graphLevel[graphAtom[current]] + 1;
              }
            }
          }
          current++;
        }
      }
    }
    return false;
  };
  _.correctValenceExceededNitrogen = function correctValenceExceededNitrogen() {
    var atom, connAtom, connBond, i;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mMol.getAtomicNo_0(atom) == 7 && this.mMol.getAtomCharge_0(atom) == 0 && this.mMol.getOccupiedValence_0(atom) > 3 && this.mMol.getAtomPi_0(atom) > 0) {
        for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++) {
          connAtom = this.mMol.getConnAtom_0(atom, i);
          connBond = this.mMol.getConnBond_0(atom, i);
          if (this.mMol.getBondOrder_0(connBond) > 1 && this.mMol.isElectronegative_0(connAtom)) {
            if (this.mMol.getBondType_0(connBond) == 4)
              this.mMol.setBondType_0(connBond, 2);
            else
              this.mMol.setBondType_0(connBond, 1);
            this.mMol.setAtomCharge_0(atom, this.mMol.getAtomCharge_0(atom) + 1);
            this.mMol.setAtomCharge_0(connAtom, this.mMol.getAtomCharge_0(connAtom) - 1);
            this.mMol.setAtomAbnormalValence_0(atom, -1);
            break;
          }
        }
      }
    }
  };
  _.getEnumerationPositionList = function getEnumerationPositionList() {
    return this.mEnumerationPositionList;
  };
  _.getSmartsWarning_0 = function getSmartsWarning() {
    return isNull(this.mSmartsWarningBuffer) ? "" : "Unresolved SMARTS features:" + this.mSmartsWarningBuffer;
  };
  _.isBondSymbol = function isBondSymbol(theChar) {
    return theChar == 45 || theChar == 61 || theChar == 35 || theChar == 36 || theChar == 58 || theChar == 47 || theChar == 92 || theChar == 60 || theChar == 126 || theChar == 33 || theChar == 64;
  };
  _.locateAromaticDoubleBonds = function locateAromaticDoubleBonds(allowSmartsFeatures, smartsFeatureFound) {
    var aromaticConnBonds, atom, atom1, atom2, bond, bond$array, bond$index, bond$max, bond0, bond1, bond2, bondAtom, connBond, i, isAromaticBond, isAromaticRing, isAromaticRingAtom, isFullyDelocalized, j, j$array, j$array0, j$array1, j$index, j$index0, j$index1, j$max, j$max0, j$max1, k, k$array, k$index, k$max, qualifyingBondFound, qualifyingNo, ring, ring0, ring1, ringAtom, ringBond, ringSet;
    this.mMol.ensureHelperArrays_0(1);
    this.mIsAromaticBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 16, 1);
    this.mAromaticBonds = 0;
    for (bond0 = 0; bond0 < this.mMol.getBonds_0(); bond0++) {
      if (this.mMol.getBondType_0(bond0) == 8) {
        this.mMol.setBondType_0(bond0, 1);
        this.mIsAromaticBond[bond0] = true;
        this.mAromaticBonds++;
      }
    }
    isAromaticRingAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    ringSet = new carc2.RingCollection(this.mMol, 3);
    isAromaticRing = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, ringSet.getSize_0(), 16, 1);
    for (ring0 = 0; ring0 < ringSet.getSize_0(); ring0++) {
      ringAtom = ringSet.getRingAtoms_0(ring0);
      isAromaticRing[ring0] = true;
      for (j$array0 = ringAtom, j$index0 = 0, j$max0 = j$array0.length; j$index0 < j$max0; ++j$index0) {
        j = j$array0[j$index0];
        if (!this.mMol.isMarkedAtom_0(j)) {
          isAromaticRing[ring0] = false;
          break;
        }
      }
      if (isAromaticRing[ring0]) {
        for (j$array1 = ringAtom, j$index1 = 0, j$max1 = j$array1.length; j$index1 < j$max1; ++j$index1) {
          j = j$array1[j$index1];
          isAromaticRingAtom[j] = true;
        }
        ringBond = ringSet.getRingBonds_0(ring0);
        for (j$array = ringBond, j$index = 0, j$max = j$array.length; j$index < j$max; ++j$index) {
          j = j$array[j$index];
          if (!this.mIsAromaticBond[j]) {
            this.mIsAromaticBond[j] = true;
            this.mAromaticBonds++;
          }
        }
      }
    }
    for (bond1 = 0; bond1 < this.mMol.getBonds_0(); bond1++) {
      if (!this.mIsAromaticBond[bond1] && ringSet.getBondRingSize_0(bond1) != 0 && this.mMol.isMarkedAtom_0(this.mMol.getBondAtom_0(0, bond1)) && this.mMol.isMarkedAtom_0(this.mMol.getBondAtom_0(1, bond1))) {
        this.addLargeAromaticRing(bond1);
      }
    }
    for (bond2 = 0; bond2 < this.mMol.getBonds_0(); bond2++) {
      if (!this.mIsAromaticBond[bond2]) {
        atom1 = this.mMol.getBondAtom_0(0, bond2);
        atom2 = this.mMol.getBondAtom_0(1, bond2);
        if (!isAromaticRingAtom[atom1] && !isAromaticRingAtom[atom2] && this.mMol.isMarkedAtom_0(atom1) && this.mMol.isMarkedAtom_0(atom2)) {
          this.mIsAromaticBond[bond2] = true;
          this.mAromaticBonds++;
        }
      }
    }
    this.mMol.ensureHelperArrays_0(7);
    if (this.mSmartsMode == 2 || this.mSmartsMode == 1 && this.mSmartsFeatureFound)
      this.protectExplicitAromaticBonds();
    isAromaticBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 16, 1);
    if (this.mMol.getBonds_0() >= 0)
      jl.arraycopy(this.mIsAromaticBond, 0, isAromaticBond, 0, this.mMol.getBonds_0());
    for (ring1 = 0; ring1 < ringSet.getSize_0(); ring1++) {
      if (isAromaticRing[ring1]) {
        ringAtom = ringSet.getRingAtoms_0(ring1);
        for (k$array = ringAtom, k$index = 0, k$max = k$array.length; k$index < k$max; ++k$index) {
          k = k$array[k$index];
          if (!this.qualifiesForPi(k)) {
            if (this.mMol.isMarkedAtom_0(k)) {
              this.mMol.setAtomMarker_0(k, false);
              this.mAromaticAtoms--;
            }
            for (j = 0; j < this.mMol.getConnAtoms_0(k); j++) {
              connBond = this.mMol.getConnBond_0(k, j);
              if (this.mIsAromaticBond[connBond]) {
                this.mIsAromaticBond[connBond] = false;
                this.mAromaticBonds--;
              }
            }
          }
        }
      }
    }
    this.promoteObviousBonds_0();
    for (ring = 0; ring < ringSet.getSize_0(); ring++) {
      if (isAromaticRing[ring] && ringSet.getRingSize_0(ring) == 6) {
        ringBond = ringSet.getRingBonds_0(ring);
        isFullyDelocalized = true;
        for (bond$array = ringBond, bond$index = 0, bond$max = bond$array.length; bond$index < bond$max; ++bond$index) {
          bond = bond$array[bond$index];
          if (!this.mIsAromaticBond[bond]) {
            isFullyDelocalized = false;
            break;
          }
        }
        if (isFullyDelocalized) {
          this.promoteBond_0(ringBond[0]);
          this.promoteBond_0(ringBond[2]);
          this.promoteBond_0(ringBond[4]);
          this.promoteObviousBonds_0();
        }
      }
    }
    for (qualifyingNo = 5; qualifyingNo >= 4; qualifyingNo--) {
      do {
        qualifyingBondFound = false;
        for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
          if (this.mIsAromaticBond[bond]) {
            aromaticConnBonds = 0;
            for (i = 0; i < 2; i++) {
              bondAtom = this.mMol.getBondAtom_0(i, bond);
              for (j = 0; j < this.mMol.getConnAtoms_0(bondAtom); j++)
                if (this.mIsAromaticBond[this.mMol.getConnBond_0(bondAtom, j)])
                  aromaticConnBonds++;
            }
            if (aromaticConnBonds == qualifyingNo) {
              this.promoteBond_0(bond);
              this.promoteObviousBonds_0();
              qualifyingBondFound = true;
              break;
            }
          }
        }
      } while (qualifyingBondFound);
    }
    while (this.mAromaticAtoms >= 2)
      if (!this.connectConjugatedRadicalPairs(isAromaticBond))
        break;
    if (allowSmartsFeatures) {
      if (this.mAromaticAtoms != 0) {
        for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
          if (this.mMol.isMarkedAtom_0(atom)) {
            this.mMol.setAtomMarker_0(atom, false);
            this.mMol.setAtomQueryFeature_0(atom, 2, true);
            this.mAromaticAtoms--;
            smartsFeatureFound = true;
          }
        }
      }
      if (this.mAromaticBonds != 0) {
        for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
          if (this.mIsAromaticBond[bond]) {
            this.mIsAromaticBond[bond] = false;
            this.mMol.setBondType_0(bond, 8);
            this.mAromaticBonds--;
            smartsFeatureFound = true;
          }
        }
      }
    } else {
      for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
        if (this.mMol.isMarkedAtom_0(atom) && this.mMol.getImplicitHydrogens_1(atom) != 0) {
          this.mMol.setAtomMarker_0(atom, false);
          this.mMol.setAtomRadical_0(atom, 32);
          this.mAromaticAtoms--;
        }
      }
    }
    if (this.mSmartsMode == 0 || this.mSmartsMode == 1 && !smartsFeatureFound) {
      if (this.mAromaticAtoms != 0)
        throw toJs(new jl.Exception_1("Assignment of aromatic double bonds failed"));
      if (this.mAromaticBonds != 0)
        throw toJs(new jl.Exception_1("Assignment of aromatic double bonds failed"));
    }
  };
  _.parse_0 = function parse_7(mol, smiles) {
    this.parse_9(mol, jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$(smiles, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)), true, true);
  };
  _.parse_7 = function parse_8(mol, smiles, position, endIndex) {
    this.parse_8(mol, smiles, position, endIndex, true, true);
  };
  _.parse_8 = function parse_9(mol, smiles, position, endIndex, createCoordinates, readStereoFeatures) {
    var a1, a2, allowSmarts, atom, atom0, atomMass, atomParser, baseAtom, bond, bondQueryFeatures, bondType, bondTypePosition, bracketLevel, compatibleValenceFound, ep, excludedBonds, explicitHydrogen, fromAtom, handleHydrogenAtomMap, hasBondType, hasLeadingBracket, hydrogenCount, i, i0, inventor, isDoubleDigit, newSize, number, oldSize, parity, parity$iterator, parityMap, rca, rca$array, rca$index, rca$max, ringClosureAtom, ringClosureBondQueryFeatures, ringClosureBondType, ringClosurePosition, squareBracketOpen, theChar, usedValence, valence, valence$array, valence$index, valence$max, valences;
    this.smiles = smiles;
    this.mMol = mol;
    this.mMol.clear_0();
    this.mapConnectionBonds = new ju.HashMap();
    this.bsAtomHasConnections = new ju.BitSet();
    if (isNotNull(this.mSmartsWarningBuffer))
      this.mSmartsWarningBuffer.setLength(0);
    this.mAromaticAtoms = 0;
    this.mSmartsFeatureFound = false;
    allowSmarts = this.mSmartsMode != 0;
    parityMap = null;
    baseAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 32, 15, 1);
    baseAtom[0] = -1;
    ringClosureAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 16, 15, 1);
    ringClosurePosition = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 16, 15, 1);
    ringClosureBondType = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 16, 15, 1);
    ringClosureBondQueryFeatures = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 16, 15, 1);
    for (i0 = 0; i0 < 16; i0++)
      ringClosureAtom[i0] = -1;
    atomMass = 0;
    fromAtom = -1;
    squareBracketOpen = false;
    isDoubleDigit = false;
    hasLeadingBracket = false;
    bracketLevel = 0;
    bondType = 1;
    bondQueryFeatures = 0;
    while (smiles[position] <= 32)
      position++;
    while (position < endIndex) {
      theChar = narrow_char(smiles[position++]);
      if (jl.isLetter_0(theChar) || theChar == 42 || theChar == 63 || theChar == 33 && allowSmarts && squareBracketOpen || theChar == 35 && allowSmarts && squareBracketOpen || theChar == 36 && allowSmarts && squareBracketOpen) {
        atomParser = new carc2.SmilesAtomParser(this, this.mMode | this.mSmartsMode);
        if (!squareBracketOpen) {
          position = atomParser.parseAtomOutsideBrackets(smiles, position, endIndex, allowSmarts);
        } else if ((this.mMode & 128) != 0) {
          ep = new carc2.SmilesParser$EnumerationPosition(this, position - 1);
          position = atomParser.parseAtomInsideBrackets(smiles, position, endIndex, true, true);
          if (smiles[position - 1] != 93) {
            while (smiles[position - 1] != 93) {
              position = atomParser.parseAtomInsideBrackets(smiles, position + 1, endIndex, true, true);
              ep.increase();
            }
            this.mEnumerationPositionList.add(ep);
          }
        } else {
          position = atomParser.parseAtomInsideBrackets(smiles, position, endIndex, allowSmarts, false);
        }
        squareBracketOpen = false;
        if (isNotNull(atomParser.getRecursiveGroup())) {
          fromAtom = baseAtom[bracketLevel];
          baseAtom[bracketLevel] = mol.getAllAtoms_0();
          mol.addMolecule_0(atomParser.getRecursiveGroup());
          if (fromAtom != -1 && bondType != 512) {
            bond = this.mMol.addBond_1(fromAtom, fromAtom, bondType);
            if (bondQueryFeatures != 0) {
              this.mSmartsFeatureFound = true;
              this.mMol.setBondQueryFeature_0(bond, bondQueryFeatures, true);
              this.mMol.adaptBondTypeToQueryFeatures(bond);
            }
          }
          bondType = 1;
          bondQueryFeatures = 0;
          continue;
        }
        if (atomParser.getAtomicNo_1() == -1 && theChar != 63)
          throw toJs(new jl.Exception_1("SmilesParser: unknown element label found. Position:" + (position - 1)));
        if (atomParser.foundSmartsFeatures())
          this.mSmartsFeatureFound = true;
        atom0 = atomParser.addParsedAtom(this.mMol, theChar, position);
        if (this.mMol.isMarkedAtom_0(atom0))
          this.mAromaticAtoms++;
        fromAtom = baseAtom[bracketLevel];
        if (fromAtom != -1 && bondType != 512) {
          bond = this.mMol.addBond_1(fromAtom, atom0, bondType);
          if (bondQueryFeatures != 0) {
            this.mSmartsFeatureFound = true;
            this.mMol.setBondQueryFeature_0(bond, bondQueryFeatures, true);
            this.mMol.adaptBondTypeToQueryFeatures(bond);
          }
        }
        bondType = 1;
        bondQueryFeatures = 0;
        baseAtom[bracketLevel] = atom0;
        if (atomMass != 0) {
          this.mMol.setAtomMass_0(atom0, atomMass);
          atomMass = 0;
        }
        if (readStereoFeatures) {
          parity = isNull(parityMap) ? null : castTo(parityMap.get(jl.valueOf_12(fromAtom)), 133);
          if (isNotNull(parity))
            parity.addNeighbor(atom0, position, atomParser.getAtomicNo_1() == 1 && this.mMol.getAtomMass_0(atom0) == 0);
          if (atomParser.foundParities()) {
            if (isNull(parityMap))
              parityMap = new ju.TreeMap();
            hydrogenCount = atomParser.getExplicitHydrogens_1() == 9 ? 0 : atomParser.getExplicitHydrogens_1();
            parityMap.put(jl.valueOf_12(atom0), new carc2.SmilesParser$THParity(this, atom0, position - 2, fromAtom, hydrogenCount, atomParser.isClockwise_0()));
          }
        }
        continue;
      }
      if (theChar == 46) {
        baseAtom[bracketLevel] = -1;
        bondType = 512;
        continue;
      }
      if (this.isBondSymbol(theChar)) {
        if (squareBracketOpen)
          throw toJs(new jl.Exception_1("SmilesParser: unexpected bond symbol inside square brackets: '" + charToString(theChar) + "', position:" + (position - 1)));
        excludedBonds = 0;
        while (this.isBondSymbol(theChar)) {
          if (theChar == 33) {
            theChar = narrow_char(smiles[position++]);
            if (theChar == 64)
              bondQueryFeatures |= 128;
            else if (theChar == 45 && smiles[position] == 62 || theChar == 60 && smiles[position] == 45) {
              excludedBonds |= 16;
              position++;
            } else if (theChar == 45)
              excludedBonds |= 1;
            else if (theChar == 61)
              excludedBonds |= 2;
            else if (theChar == 35)
              excludedBonds |= 4;
            else if (theChar == 36)
              excludedBonds |= 32;
            else if (theChar == 58)
              excludedBonds |= 8;
            else
              throw toJs(new jl.Exception_1("SmilesParser: bond symbol '" + charToString(theChar) + "' not allowed after '!'. Position:" + (position - 1)));
          } else {
            if (theChar == 64)
              bondQueryFeatures |= 256;
            else if (theChar == 61)
              bondType = 2;
            else if (theChar == 35)
              bondType = 4;
            else if (theChar == 36)
              bondType = 32;
            else if (theChar == 58)
              bondType = 8;
            else if (theChar == 126)
              bondQueryFeatures |= 1 | 2 | 4 | 8;
            else if (theChar == 47) {
              if (readStereoFeatures)
                bondType = 257;
            } else if (theChar == 92) {
              if (readStereoFeatures)
                bondType = 129;
            } else if (theChar == 45 && smiles[position] == 62 || theChar == 60 && smiles[position] == 45) {
              bondType = 16;
              position++;
            }
            if (smiles[position] == 44) {
              bondQueryFeatures |= this.bondSymbolToQueryFeature(bondType == 16 ? 62 : theChar);
              while (smiles[position] == 44) {
                if (smiles[position + 1] == 60 && smiles[position + 2] == 45 || smiles[position + 1] == 45 && smiles[position + 2] == 62) {
                  bondQueryFeatures |= this.bondSymbolToQueryFeature(62);
                  position += 3;
                } else {
                  bondQueryFeatures |= this.bondSymbolToQueryFeature(narrow_char(smiles[position + 1]));
                  position += 2;
                }
              }
            }
          }
          if (smiles[position] == 59) {
            position++;
            theChar = narrow_char(smiles[position++]);
            continue;
          }
          if (excludedBonds != 0)
            bondQueryFeatures |= 127 & ~excludedBonds;
          break;
        }
        continue;
      }
      if (theChar <= 32) {
        position = endIndex;
        continue;
      }
      if (isDigit(theChar)) {
        number = theChar - 48;
        if (squareBracketOpen) {
          while (position < endIndex && jl.isDigit_0(smiles[position])) {
            number = 10 * number + smiles[position] - 48;
            position++;
          }
          atomMass = number;
        } else {
          bondTypePosition = isDoubleDigit ? position - 3 : position - 2;
          hasBondType = smiles[bondTypePosition] == 45 || smiles[bondTypePosition] == 47 || smiles[bondTypePosition] == 92 || smiles[bondTypePosition] == 61 || smiles[bondTypePosition] == 35 || smiles[bondTypePosition] == 36 || smiles[bondTypePosition] == 58 || smiles[bondTypePosition] == 62 || smiles[bondTypePosition] == 126;
          if (isDoubleDigit && position < endIndex && jl.isDigit_0(smiles[position])) {
            number = 10 * number + smiles[position] - 48;
            isDoubleDigit = false;
            position++;
          }
          if (number >= ringClosureAtom.length) {
            if (number >= 100)
              throw toJs(new jl.Exception_1("SmilesParser: ringClosureAtom number out of range: " + number));
            oldSize = ringClosureAtom.length;
            newSize = ringClosureAtom.length;
            while (newSize <= number)
              newSize = $wnd.Math.min(100, newSize + 16);
            ringClosureAtom = ju.copyOf_9(ringClosureAtom, newSize);
            ringClosurePosition = ju.copyOf_9(ringClosurePosition, newSize);
            ringClosureBondType = ju.copyOf_9(ringClosureBondType, newSize);
            ringClosureBondQueryFeatures = ju.copyOf_9(ringClosureBondQueryFeatures, newSize);
            for (i = oldSize; i < newSize; i++)
              ringClosureAtom[i] = -1;
          }
          if (ringClosureAtom[number] == -1) {
            ringClosureAtom[number] = baseAtom[bracketLevel];
            ringClosurePosition[number] = position - 1;
            ringClosureBondType[number] = hasBondType ? bondType : -1;
            ringClosureBondQueryFeatures[number] = hasBondType ? bondQueryFeatures : 0;
          } else {
            if (ringClosureAtom[number] == baseAtom[bracketLevel])
              throw toJs(new jl.Exception_1("SmilesParser: ring closure to same atom"));
            if (readStereoFeatures && isNotNull(parityMap)) {
              parity = castTo(parityMap.get(jl.valueOf_12(ringClosureAtom[number])), 133);
              if (isNotNull(parity))
                parity.addNeighbor(baseAtom[bracketLevel], ringClosurePosition[number], false);
              parity = castTo(parityMap.get(jl.valueOf_12(baseAtom[bracketLevel])), 133);
              if (isNotNull(parity))
                parity.addNeighbor(ringClosureAtom[number], position - 1, false);
            }
            if (ringClosureBondType[number] != -1)
              bondType = ringClosureBondType[number];
            else if (bondType == 257)
              bondType = 129;
            else if (bondType == 129)
              bondType = 257;
            a1 = ringClosureAtom[number];
            a2 = baseAtom[bracketLevel];
            bond = this.addConnection(a1, a2, bondType, ringClosurePosition[number], position - 1);
            if (ringClosureBondQueryFeatures[number] != 0)
              bondQueryFeatures = ringClosureBondQueryFeatures[number];
            if (bondQueryFeatures != 0) {
              this.mSmartsFeatureFound = true;
              this.mMol.setBondQueryFeature_0(bond, ringClosureBondQueryFeatures[number], true);
              this.mMol.adaptBondTypeToQueryFeatures(bond);
            }
            ringClosureAtom[number] = -1;
          }
          bondType = 1;
          bondQueryFeatures = 0;
        }
        continue;
      }
      if (theChar == 43) {
        throw toJs(new jl.Exception_1("SmilesParser: '+' found outside brackets. Position:" + (position - 1)));
      }
      if (theChar == 40) {
        if (baseAtom[bracketLevel] == -1) {
          hasLeadingBracket = true;
          continue;
        }
        bracketLevel++;
        if (baseAtom.length == bracketLevel)
          baseAtom = ju.copyOf_9(baseAtom, baseAtom.length + 32);
        baseAtom[bracketLevel] = baseAtom[bracketLevel - 1];
        continue;
      }
      if (theChar == 41) {
        if (bracketLevel == 0) {
          if (!hasLeadingBracket)
            throw toJs(new jl.Exception_1("SmilesParser: Closing ')' without opening counterpart. Position:" + (position - 1)));
          baseAtom[0] = -1;
          hasLeadingBracket = false;
          continue;
        }
        bracketLevel--;
        continue;
      }
      if (theChar == 91) {
        squareBracketOpen = true;
        continue;
      }
      if (theChar == 93) {
        throw toJs(new jl.Exception_1("SmilesParser: closing bracket at unexpected position:" + (position - 1)));
      }
      if (theChar == 37) {
        isDoubleDigit = true;
        continue;
      }
      throw toJs(new jl.Exception_1("SmilesParser: unexpected character outside brackets: '" + charToString(theChar) + "' position:" + (position - 1)));
    }
    if (bondType != 1)
      throw toJs(new jl.Exception_1("SmilesParser: dangling open bond"));
    for (rca$array = ringClosureAtom, rca$index = 0, rca$max = rca$array.length; rca$index < rca$max; ++rca$index) {
      rca = rca$array[rca$index];
      if (rca != -1)
        throw toJs(new jl.Exception_1("SmilesParser: dangling ring closure."));
    }
    handleHydrogenAtomMap = this.mMol.getHandleHydrogenMap_0();
    this.mMol.setHydrogenProtection_0(true);
    this.mMol.ensureHelperArrays_0(1);
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      if (jsNotEquals(this.mMol.getAtomCustomLabel_0(atom), null)) {
        explicitHydrogen = this.mMol.getAtomCustomLabelBytes(atom)[0];
        if (this.mSmartsFeatureFound || this.mSmartsMode == 2) {
          if (explicitHydrogen != 9) {
            if (this.mMakeHydrogenExplicit) {
              for (i = 0; i < explicitHydrogen; i++)
                this.mMol.addBond_1(atom, this.mMol.addAtom_2(1), 1);
            } else {
              if (explicitHydrogen == 0)
                this.mMol.setAtomQueryFeature_0(atom, and_0(1920, not_0(128)), true);
              if (explicitHydrogen == 1)
                this.mMol.setAtomQueryFeature_0(atom, and_0(1920, not_0(256)), true);
              if (explicitHydrogen == 2)
                this.mMol.setAtomQueryFeature_0(atom, and_0(1920, not_0(512)), true);
              if (explicitHydrogen == 3)
                this.mMol.setAtomQueryFeature_0(atom, and_0(1920, not_0(1024)), true);
            }
          }
        } else {
          if (explicitHydrogen == 9)
            explicitHydrogen = 0;
          if (!this.mMol.isMetalAtom_0(atom) && (!this.mMol.isMarkedAtom_0(atom) || this.mMol.getAtomicNo_0(atom) == 6 && this.mMol.getAtomCharge_0(atom) == 0)) {
            valences = carc2.getAllowedValences(this.mMol.getAtomicNo_0(atom));
            compatibleValenceFound = false;
            usedValence = this.mMol.getOccupiedValence_0(atom);
            usedValence -= this.mMol.getElectronValenceCorrection_0(atom, usedValence);
            usedValence += explicitHydrogen;
            if (this.mMol.isMarkedAtom_0(atom))
              usedValence++;
            for (valence$array = valences, valence$index = 0, valence$max = valence$array.length; valence$index < valence$max; ++valence$index) {
              valence = valence$array[valence$index];
              if (usedValence <= valence) {
                compatibleValenceFound = true;
                if (valence == usedValence + 2)
                  this.mMol.setAtomRadical_0(atom, 48);
                else if (valence == usedValence + 1)
                  this.mMol.setAtomRadical_0(atom, 32);
                else if (valence != usedValence || valence != valences[0])
                  this.mMol.setAtomAbnormalValence_0(atom, usedValence);
                break;
              }
            }
            if (!compatibleValenceFound)
              this.mMol.setAtomAbnormalValence_0(atom, usedValence);
          }
          if (this.mMakeHydrogenExplicit || !this.mMol.supportsImplicitHydrogen_0(atom))
            for (i = 0; i < explicitHydrogen; i++)
              this.mMol.addBond_1(atom, this.mMol.addAtom_2(1), 1);
        }
      } else if (!this.mMakeHydrogenExplicit && (this.mSmartsFeatureFound || this.mSmartsMode == 2)) {
        explicitHydrogen = this.mMol.getExplicitHydrogens_0(atom);
        if (explicitHydrogen >= 1)
          this.mMol.setAtomQueryFeature_0(atom, 128, true);
        if (explicitHydrogen >= 2)
          this.mMol.setAtomQueryFeature_0(atom, 256, true);
        if (explicitHydrogen >= 3)
          this.mMol.setAtomQueryFeature_0(atom, 512, true);
        if (explicitHydrogen >= 4)
          this.mMol.setAtomQueryFeature_0(atom, 1024, true);
      }
    }
    if (!this.mMakeHydrogenExplicit && (this.mSmartsFeatureFound || this.mSmartsMode == 2))
      this.mMol.removeExplicitHydrogens_0(false);
    this.mMol.ensureHelperArrays_0(1);
    this.correctValenceExceededNitrogen();
    this.locateAromaticDoubleBonds(allowSmarts, this.mSmartsFeatureFound);
    this.mMol.removeAtomCustomLabels_0();
    this.mMol.setHydrogenProtection_0(false);
    if (readStereoFeatures) {
      this.assignKnownEZBondParities();
      if (isNotNull(parityMap)) {
        for (parity$iterator = parityMap.values().iterator(); parity$iterator.hasNext_0(); ) {
          parity = castTo(parity$iterator.next_3(), 133);
          this.mMol.setAtomParity_0(handleHydrogenAtomMap[parity.mCentralAtom], parity.calculateParity(handleHydrogenAtomMap), false);
        }
        this.mMol.setParitiesValid_0(0);
      }
    }
    this.mMol.setParitiesValid_0(0);
    if (createCoordinates) {
      inventor = new carcc3.CoordinateInventor_0(this.mCoordinateMode);
      if (neq(this.mRandomSeed, 0))
        inventor.setRandomSeed_0(this.mRandomSeed);
      inventor.invent(this.mMol);
      if (readStereoFeatures)
        this.mMol.setUnknownParitiesToExplicitlyUnknown_0();
    }
    if (this.mSmartsFeatureFound || this.mSmartsMode == 2) {
      this.mMol.setFragment_0(true);
      this.mMol.validateAtomQueryFeatures();
      this.mMol.validateBondQueryFeatures();
    }
  };
  _.parse_9 = function parse_10(mol, smiles, createCoordinates, readStereoFeatures) {
    this.parse_8(mol, smiles, 0, smiles.length, createCoordinates, readStereoFeatures);
  };
  _.parseReaction_0 = function parseReaction(smiles) {
    return jsEquals(smiles, null) ? null : this.parseReaction_1(jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$(smiles, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
  };
  _.parseReaction_1 = function parseReaction_0(smiles) {
    var closingGroupBracketIndex, end, i, index_0, index1, index2, level, mol, molend, part, rxn;
    index1 = caru.indexOf_2(smiles, narrow_byte(62));
    while (index1 > 0 && smiles[index1 - 1] == narrow_byte(45))
      index1 = caru.indexOf_3(smiles, narrow_byte(62), index1 + 1);
    index2 = index1 == -1 ? -1 : caru.indexOf_3(smiles, narrow_byte(62), index1 + 1);
    while (index2 > 0 && smiles[index2 - 1] == narrow_byte(45))
      index2 = caru.indexOf_3(smiles, narrow_byte(62), index2 + 1);
    if (index2 == -1)
      throw toJs(new jl.Exception_1("Missing one or both separators ('>')."));
    if (caru.indexOf_3(smiles, narrow_byte(62), index2 + 1) != -1)
      throw toJs(new jl.Exception_1("Found more than 2 separators ('>')."));
    rxn = new carcr.Reaction();
    part = 0;
    index_0 = 0;
    closingGroupBracketIndex = -1;
    while (index_0 < smiles.length) {
      while (index_0 < smiles.length && smiles[index_0] == 46)
        index_0++;
      if (smiles[index_0] == 40) {
        if (closingGroupBracketIndex != -1)
          throw toJs(new jl.Exception_1("Second open group bracket found before closing first one."));
        index_0++;
        level = 0;
        for (i = index_0; i < smiles.length; i++) {
          if (smiles[i] == 40) {
            level++;
          } else if (smiles[i] == 41) {
            if (level-- == 0) {
              closingGroupBracketIndex = i;
              break;
            }
          }
        }
      }
      end = index_0;
      while (end < smiles.length && smiles[end] != 62 && !(smiles[end] == 46 && (this.mSingleDotSeparator && closingGroupBracketIndex == -1 || closingGroupBracketIndex == end - 1 || end + 1 == smiles.length || smiles[end + 1] == 46)))
        end++;
      molend = end;
      if (closingGroupBracketIndex == end - 1) {
        molend--;
        closingGroupBracketIndex = -1;
      }
      if (index_0 != molend) {
        mol = new carc2.StereoMolecule();
        this.parse_7(mol, smiles, index_0, molend);
        if (this.mSmartsMode == 1 && this.mSmartsFeatureFound)
          return new carc2.SmilesParser_0(this.mMode | 2).parseReaction_1(smiles);
        if (part == 0)
          rxn.addReactant_0(mol);
        else if (part == 1)
          rxn.addCatalyst_0(mol);
        else
          rxn.addProduct_0(mol);
      }
      index_0 = end;
      while (index_0 < smiles.length && smiles[index_0] == 62) {
        index_0++;
        part++;
      }
    }
    return rxn;
  };
  _.promoteBond_0 = function promoteBond_0(bond) {
    var bondAtom, connBond, i, j;
    if (this.mMol.getBondType_0(bond) == 1)
      this.mMol.setBondType_0(bond, 2);
    for (i = 0; i < 2; i++) {
      bondAtom = this.mMol.getBondAtom_0(i, bond);
      if (this.mMol.isMarkedAtom_0(bondAtom)) {
        this.mMol.setAtomMarker_0(bondAtom, false);
        this.mAromaticAtoms--;
      }
      for (j = 0; j < this.mMol.getConnAtoms_0(bondAtom); j++) {
        connBond = this.mMol.getConnBond_0(bondAtom, j);
        if (this.mIsAromaticBond[connBond]) {
          this.mIsAromaticBond[connBond] = false;
          this.mAromaticBonds--;
        }
      }
    }
  };
  _.promoteObviousBonds_0 = function promoteObviousBonds_0() {
    var aromaticNeighbourFound, bond, bondAtom, i, isTerminalAromaticBond, j, terminalAromaticBondFound;
    do {
      terminalAromaticBondFound = false;
      for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
        if (this.mIsAromaticBond[bond]) {
          isTerminalAromaticBond = false;
          for (i = 0; i < 2; i++) {
            aromaticNeighbourFound = false;
            bondAtom = this.mMol.getBondAtom_0(i, bond);
            for (j = 0; j < this.mMol.getConnAtoms_0(bondAtom); j++) {
              if (bond != this.mMol.getConnBond_0(bondAtom, j) && this.mIsAromaticBond[this.mMol.getConnBond_0(bondAtom, j)]) {
                aromaticNeighbourFound = true;
                break;
              }
            }
            if (!aromaticNeighbourFound) {
              isTerminalAromaticBond = true;
              break;
            }
          }
          if (isTerminalAromaticBond) {
            terminalAromaticBondFound = true;
            this.promoteBond_0(bond);
          }
        }
      }
    } while (terminalAromaticBondFound);
  };
  _.protectExplicitAromaticBonds = function protectExplicitAromaticBonds() {
    var bond, bondAtom, i, i0, isSingleAromaticBond, j;
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      if (this.mIsAromaticBond[bond]) {
        isSingleAromaticBond = true;
        for (i0 = 0; i0 < 2 && isSingleAromaticBond; i0++) {
          bondAtom = this.mMol.getBondAtom_0(i0, bond);
          for (j = 0; j < this.mMol.getConnAtoms_0(bondAtom) && isSingleAromaticBond; j++) {
            if (bond != this.mMol.getConnBond_0(bondAtom, j) && this.mIsAromaticBond[this.mMol.getConnBond_0(bondAtom, j)])
              isSingleAromaticBond = false;
          }
        }
        if (isSingleAromaticBond) {
          this.mMol.setBondType_0(bond, 8);
          this.mAromaticBonds--;
          for (i = 0; i < 2; i++) {
            bondAtom = this.mMol.getBondAtom_0(i, bond);
            if (this.mMol.isMarkedAtom_0(bondAtom)) {
              this.mMol.setAtomMarker_0(bondAtom, false);
              this.mAromaticAtoms--;
            }
          }
        }
      }
    }
  };
  _.qualifiesForPi = function qualifiesForPi(atom) {
    var explicitHydrogens, freeValence;
    if (!carc2.qualifiesAsAromaticAtomicNo(this.mMol.getAtomicNo_0(atom)))
      return false;
    if (this.mMol.getAtomicNo_0(atom) == 6) {
      if (!this.mMol.isMarkedAtom_0(atom))
        return false;
      if (this.mMol.getAtomCharge_0(atom) > 0)
        return false;
    }
    explicitHydrogens = jsEquals(this.mMol.getAtomCustomLabel_0(atom), null) || this.mMol.getAtomCustomLabelBytes(atom)[0] == 9 ? 0 : this.mMol.getAtomCustomLabelBytes(atom)[0];
    freeValence = this.mMol.getFreeValence_0(atom) - explicitHydrogens;
    if (freeValence < 1)
      return false;
    if (this.mMol.getAtomicNo_0(atom) == 16 || this.mMol.getAtomicNo_0(atom) == 34 || this.mMol.getAtomicNo_0(atom) == 52) {
      if (this.mMol.getConnAtoms_0(atom) == 2 && this.mMol.getAtomCharge_0(atom) <= 0)
        return false;
      return freeValence != 2;
    }
    return true;
  };
  _.setEnumerationPositionList = function setEnumerationPositionList(l) {
    this.mEnumerationPositionList = l;
  };
  _.setRandomSeed_0 = function setRandomSeed(seed) {
    this.mRandomSeed = seed;
  };
  _.smartsWarning = function smartsWarning(feature) {
    if (this.mCreateSmartsWarnings) {
      if (isNull(this.mSmartsWarningBuffer))
        this.mSmartsWarningBuffer = new jl.StringBuilder();
      this.mSmartsWarningBuffer.append_9(" ");
      this.mSmartsWarningBuffer.append_9(feature);
    }
  };
  _.mAromaticAtoms = 0;
  _.mAromaticBonds = 0;
  _.mCoordinateMode = 0;
  _.mCreateSmartsWarnings = false;
  _.mMakeHydrogenExplicit = false;
  _.mMode = 0;
  _.mRandomSeed = 0;
  _.mSingleDotSeparator = false;
  _.mSmartsFeatureFound = false;
  _.mSmartsMode = 0;
  carc2.BRACKET_LEVELS = 32;
  carc2.HYDROGEN_IMPLICIT_ZERO = 9;
  carc2.INITIAL_CONNECTIONS = 16;
  carc2.MAX_AROMATIC_RING_SIZE = 15;
  carc2.MAX_CONNECTIONS = 100;
  carc2.MODE_CREATE_SMARTS_WARNING = 64;
  carc2.MODE_ENUMERATE_SMARTS = 128;
  carc2.MODE_MAKE_HYDROGEN_EXPLICIT = 8;
  carc2.MODE_NO_CACTUS_SYNTAX = 16;
  carc2.MODE_SINGLE_DOT_SEPARATOR = 32;
  carc2.MODE_SKIP_COORDINATE_TEMPLATES = 4;
  carc2.SMARTS_MODE_GUESS = 1;
  carc2.SMARTS_MODE_IS_SMARTS = 2;
  carc2.SMARTS_MODE_IS_SMILES = 0;
  carc2.SMARTS_MODE_MASK = 3;
  cggl.Lcom_actelion_research_chem_SmilesParser_2_classLit = createForClass("com.actelion.research.chem", "SmilesParser", 129, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_SmilesParser$EnumerationPosition = function $clinit_SmilesParser$EnumerationPosition() {
    carc2.$clinit_SmilesParser$EnumerationPosition = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.SmilesParser$EnumerationPosition = function SmilesParser$EnumerationPosition(this$0, position) {
    carc2.$clinit_SmilesParser$EnumerationPosition();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_52();
    this.mPosition = position;
    this.mCount = 1;
  };
  defineClass(203, 1, { 203: 1, 22: 1, 1: 1 }, carc2.SmilesParser$EnumerationPosition);
  _.$init_52 = function $init_52() {
  };
  _.compareTo_1 = function compareTo_10(o) {
    return this.compareTo_5(castTo(o, 203));
  };
  _.compareTo_5 = function compareTo_9(o) {
    return compare_25(o.mPosition, this.mPosition);
  };
  _.increase = function increase() {
    this.mCount++;
  };
  _.mCount = 0;
  _.mPosition = 0;
  cggl.Lcom_actelion_research_chem_SmilesParser$EnumerationPosition_2_classLit = createForClass("com.actelion.research.chem", "SmilesParser/EnumerationPosition", 203, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_SmilesParser$THParity = function $clinit_SmilesParser$THParity() {
    carc2.$clinit_SmilesParser$THParity = emptyMethod;
    jl.$clinit_Object();
    carc2.PSEUDO_ATOM_HYDROGEN = 2147483647 - 1;
  };
  carc2.SmilesParser$THParity = function SmilesParser$THParity(this$0, centralAtom, centralAtomPosition, fromAtom, explicitHydrogen, isClockwise) {
    carc2.$clinit_SmilesParser$THParity();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_53();
    if (explicitHydrogen != 0 && explicitHydrogen != 1) {
      this.mError = true;
    } else {
      this.mCentralAtom = centralAtom;
      this.mCentralAtomPosition = centralAtomPosition;
      this.mIsClockwise = isClockwise;
      this.mNeighbourList = new ju.ArrayList();
      if (fromAtom != -1)
        this.addNeighbor(fromAtom, centralAtomPosition - 1, false);
      if (fromAtom != -1 && explicitHydrogen == 1)
        this.addNeighbor(2147483646, centralAtomPosition + 1, false);
    }
  };
  defineClass(133, 1, { 133: 1, 1: 1 }, carc2.SmilesParser$THParity);
  _.$init_53 = function $init_53() {
  };
  _.addNeighbor = function addNeighbor(atom, position, unused) {
    if (!this.mError) {
      if (this.mNeighbourList.size() == 4) {
        this.mError = true;
        return;
      }
      this.mNeighbourList.add(new carc2.SmilesParser$THParity$ParityNeighbour(this, atom, position));
    }
  };
  _.calculateParity = function calculateParity(handleHydrogenAtomMap) {
    var isInverse, neighbour, neighbour$iterator;
    if (this.mError)
      return 3;
    for (neighbour$iterator = this.mNeighbourList.iterator(); neighbour$iterator.hasNext_0(); ) {
      neighbour = castTo(neighbour$iterator.next_3(), 79);
      if (neighbour.mAtom != 2147483646 && neighbour.mAtom != 2147483647)
        neighbour.mAtom = handleHydrogenAtomMap[neighbour.mAtom];
    }
    isInverse = false;
    switch (this.mNeighbourList.size()) {
      case 2:
        if (castTo(this.mNeighbourList.getAtIndex(0), 79).mAtom >= 2147483646 || castTo(this.mNeighbourList.getAtIndex(1), 79).mAtom >= 2147483646)
          return 3;
        isInverse = this.isInverseOrderAllene(handleHydrogenAtomMap);
        break;
      case 3:
        this.mNeighbourList.add(new carc2.SmilesParser$THParity$ParityNeighbour(this, 2147483647, this.mCentralAtomPosition));
      case 4:
        isInverse = this.isInverseOrderTH();
        break;
      default:
        return 3;
    }
    return this.mIsClockwise ^ isInverse ? 1 : 2;
  };
  _.checkAlleneInversion = function checkAlleneInversion(smiles2MolMap, index_0, inversion) {
    var a1, a2, b, b1, b2, bond, c, centerAtom, connAtom, connAtoms, connBonds, hasConnections, hasImplicitH, i, isFirst, mMol, n, nConnected, otherAtom, p, p1, p2, positions, positions1, positions2, smilesAtom;
    mMol = this.this$01.mMol;
    a1 = castTo(this.mNeighbourList.getAtIndex(index_0), 79);
    smilesAtom = a1.mAtom;
    centerAtom = smiles2MolMap[this.mCentralAtom];
    hasImplicitH = mMol.getImplicitHydrogens_1(smilesAtom) > 0 && mMol.getConnAtoms_0(smilesAtom) == mMol.getAllConnAtoms_0(smilesAtom);
    hasConnections = this.this$01.bsAtomHasConnections.get_4(this.this$01.mol2SmilesMap[smilesAtom]);
    if (!hasImplicitH && !hasConnections) {
      b = mMol.getConnAtom_0(smilesAtom, 2);
      if (mMol.getAtomicNo_0(b) == 1) {
        b = this.this$01.mol2SmilesMap[b];
        if (index_0 == 0 ? b > smilesAtom : this.this$01.mol2SmilesMap[mMol.getConnAtom_0(smilesAtom, 1)] > b) {
          inversion = !inversion;
        }
      }
      return inversion;
    }
    if (hasImplicitH) {
      a2 = mMol.getConnAtom_0(smilesAtom, index_0);
      b = this.this$01.mol2SmilesMap[a2];
      if (b > smilesAtom) {
        inversion = !inversion;
        if (mMol.getAtomicNo_0(a2) == 1) {
          inversion = !inversion;
        }
      }
    }
    if (hasConnections) {
      n = mMol.getAllConnAtoms_0(smilesAtom);
      connAtoms = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, n - 1, 15, 1);
      connBonds = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, n - 1, 15, 1);
      nConnected = 0;
      for (i = 0, p = 0; i < n; i++) {
        b = mMol.getConnAtom_0(smilesAtom, i);
        if (b == centerAtom)
          continue;
        connAtoms[p] = b;
        bond = mMol.getBond_0(smilesAtom, b);
        positions = castTo(this.this$01.mapConnectionBonds.get(this.this$01.mol2SmilesMap[smilesAtom] + "_" + this.this$01.mol2SmilesMap[b]), 6);
        connBonds[p++] = jsEquals(positions, null) ? -1 : bond;
        if (jsNotEquals(positions, null))
          nConnected++;
      }
      if (hasImplicitH) {
        if (connAtoms[0] < smilesAtom) {
          inversion = !inversion;
        }
      } else {
        switch (nConnected) {
          case 1:
            if (mMol.getImplicitHydrogens_1(smilesAtom) > 0) {
              break;
            }
            isFirst = connBonds[0] >= 0;
            connAtom = connAtoms[isFirst ? 0 : 1];
            otherAtom = connAtoms[isFirst ? 1 : 0];
            if (otherAtom > smilesAtom) {
              if (connAtom > smilesAtom) {
                if (mMol.getAtomicNo_0(otherAtom) != 1) {
                  inversion = !inversion;
                }
              }
            } else {
              if (connAtom < smilesAtom)
                inversion = !inversion;
            }
            break;
          case 2:
            b1 = this.getOtherAtom(connBonds[0], smilesAtom);
            b2 = this.getOtherAtom(connBonds[1], smilesAtom);
            positions1 = castTo(this.this$01.mapConnectionBonds.get(smilesAtom + "_" + this.this$01.mol2SmilesMap[b1]), 6);
            positions2 = castTo(this.this$01.mapConnectionBonds.get(smilesAtom + "_" + this.this$01.mol2SmilesMap[b2]), 6);
            c = this.mCentralAtomPosition;
            if (index_0 == 0) {
              p1 = positions1[1] < c ? positions1[1] : positions1[0];
              p2 = positions2[1] < c ? positions2[1] : positions2[0];
            } else {
              p1 = positions1[0] < c ? positions1[1] : positions1[0];
              p2 = positions2[0] < c ? positions2[1] : positions2[0];
            }
            if (p1 < p2 != b1 < b2) {
              inversion = !inversion;
            }
            break;
        }
      }
    }
    return inversion;
  };
  _.getOtherAtom = function getOtherAtom(b, a) {
    return this.this$01.mMol.mBondAtom[0][b] == a ? this.this$01.mMol.mBondAtom[1][b] : this.this$01.mMol.mBondAtom[0][b];
  };
  _.isInverseOrderAllene = function isInverseOrderAllene(smiles2MolMap) {
    var i, inversion;
    inversion = false;
    if (jsEquals(this.this$01.mol2SmilesMap, null)) {
      this.this$01.mol2SmilesMap = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, smiles2MolMap.length, 15, 1);
      for (i = this.this$01.mol2SmilesMap.length; --i >= 0; ) {
        this.this$01.mol2SmilesMap[smiles2MolMap[i]] = i;
      }
    }
    inversion = this.checkAlleneInversion(smiles2MolMap, 0, inversion);
    inversion = this.checkAlleneInversion(smiles2MolMap, 1, inversion);
    return inversion;
  };
  _.isInverseOrderTH = function isInverseOrderTH() {
    var i, inversion, j;
    inversion = false;
    for (i = 1; i < this.mNeighbourList.size(); i++) {
      for (j = 0; j < i; j++) {
        if (castTo(this.mNeighbourList.getAtIndex(j), 79).mAtom > castTo(this.mNeighbourList.getAtIndex(i), 79).mAtom)
          inversion = !inversion;
        if (castTo(this.mNeighbourList.getAtIndex(j), 79).mPosition > castTo(this.mNeighbourList.getAtIndex(i), 79).mPosition)
          inversion = !inversion;
      }
    }
    return inversion;
  };
  _.mCentralAtom = 0;
  _.mCentralAtomPosition = 0;
  _.mError = false;
  _.mIsClockwise = false;
  carc2.PSEUDO_ATOM_HYDROGEN = 0;
  carc2.PSEUDO_ATOM_LONE_PAIR = 2147483647;
  cggl.Lcom_actelion_research_chem_SmilesParser$THParity_2_classLit = createForClass("com.actelion.research.chem", "SmilesParser/THParity", 133, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_SmilesParser$THParity$ParityNeighbour = function $clinit_SmilesParser$THParity$ParityNeighbour() {
    carc2.$clinit_SmilesParser$THParity$ParityNeighbour = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.SmilesParser$THParity$ParityNeighbour = function SmilesParser$THParity$ParityNeighbour(this$1, atom, position) {
    carc2.$clinit_SmilesParser$THParity$ParityNeighbour();
    this.this$11 = this$1;
    Object_0.call(this);
    this.$init_54();
    this.mAtom = atom;
    this.mPosition = position;
  };
  defineClass(79, 1, { 79: 1, 1: 1 }, carc2.SmilesParser$THParity$ParityNeighbour);
  _.$init_54 = function $init_54() {
  };
  _.toString_0 = function toString_13() {
    return "[" + (this.mAtom == 2147483646 ? "h" : this.mAtom == 2147483647 ? "lp" : this.this$11.this$01.mMol.getAtomLabel_0(this.mAtom)) + this.mPosition + "]";
  };
  _.mAtom = 0;
  _.mPosition = 0;
  cggl.Lcom_actelion_research_chem_SmilesParser$THParity$ParityNeighbour_2_classLit = createForClass("com.actelion.research.chem", "SmilesParser/THParity/ParityNeighbour", 79, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_SortedStringList = function $clinit_SortedStringList() {
    carc2.$clinit_SortedStringList = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.SortedStringList = function SortedStringList() {
    carc2.$clinit_SortedStringList();
    Object_0.call(this);
    this.$init_55();
  };
  defineClass(96, 1, { 96: 1, 4: 1, 1: 1 }, carc2.SortedStringList);
  _.$init_55 = function $init_55() {
    this.mList = new ju.ArrayList();
  };
  _.addString = function addString(theString) {
    var comparison, increment, index_0, vectorSize;
    vectorSize = this.mList.size();
    if (vectorSize == 0) {
      this.mList.addAtIndex(0, theString);
      return 0;
    }
    index_0 = 1;
    while (2 * index_0 <= vectorSize)
      index_0 <<= 1;
    increment = index_0;
    index_0--;
    while (increment != 0) {
      increment >>= 1;
      if (index_0 >= vectorSize) {
        index_0 -= increment;
        continue;
      }
      comparison = jl.compareTo_Ljava_lang_String__I__devirtual$(theString, castToString(this.mList.getAtIndex(index_0)));
      if (comparison == 0)
        return -1;
      if (increment == 0)
        break;
      if (comparison < 0) {
        index_0 -= increment;
      } else {
        index_0 += increment;
      }
    }
    if (index_0 < vectorSize && jl.compareTo_Ljava_lang_String__I__devirtual$(theString, castToString(this.mList.getAtIndex(index_0))) > 0)
      index_0++;
    this.mList.addAtIndex(index_0, theString);
    return index_0;
  };
  _.contains_1 = function contains_1(theString) {
    return this.getListIndex(theString) != -1;
  };
  _.getListIndex = function getListIndex(theString) {
    var comparison, increment, index_0, vectorSize;
    vectorSize = this.mList.size();
    if (vectorSize == 0)
      return -1;
    index_0 = 1;
    while (2 * index_0 <= vectorSize)
      index_0 <<= 1;
    increment = index_0;
    index_0--;
    while (increment != 0) {
      increment >>= 1;
      if (index_0 >= vectorSize) {
        index_0 -= increment;
        continue;
      }
      comparison = jl.compareTo_Ljava_lang_String__I__devirtual$(theString, castToString(this.mList.getAtIndex(index_0)));
      if (comparison == 0)
        return index_0;
      if (increment == 0)
        break;
      if (comparison < 0) {
        index_0 -= increment;
      } else {
        index_0 += increment;
      }
    }
    return -1;
  };
  _.getSize_0 = function getSize_0() {
    return this.mList.size();
  };
  _.getStringAt = function getStringAt(i) {
    return castToString(this.mList.getAtIndex(i));
  };
  _.toArray_1 = function toArray_3() {
    return castTo(this.mList.toArray_0(initUnidimensionalArray(cggl.Ljava_lang_String_2_classLit, { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 0, 6, 1)), 9);
  };
  carc2.serialVersionUID_3 = 537265952;
  cggl.Lcom_actelion_research_chem_SortedStringList_2_classLit = createForClass("com.actelion.research.chem", "SortedStringList", 96, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_StereoMolecule = function $clinit_StereoMolecule() {
    carc2.$clinit_StereoMolecule = emptyMethod;
    carc2.$clinit_ExtendedMolecule();
    carc2.VALIDATION_ERRORS_STEREO = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Members of ESR groups must only be stereo centers with known configuration.", "Over- or under-specified stereo feature or more than one racemic type bond", "Ambiguous configuration at stereo center because of 2 parallel bonds"]);
  };
  carc2.StereoMolecule = function StereoMolecule() {
    carc2.$clinit_StereoMolecule();
    carc2.ExtendedMolecule.call(this);
    this.$init_56();
  };
  carc2.StereoMolecule_0 = function StereoMolecule_0(maxAtoms, maxBonds) {
    carc2.$clinit_StereoMolecule();
    carc2.ExtendedMolecule_0.call(this, maxAtoms, maxBonds);
    this.$init_56();
  };
  carc2.StereoMolecule_1 = function StereoMolecule_1(mol) {
    carc2.$clinit_StereoMolecule();
    carc2.ExtendedMolecule_1.call(this, mol);
    this.$init_56();
  };
  defineClass(17, 150, { 60: 1, 17: 1, 4: 1, 1: 1 }, carc2.StereoMolecule, carc2.StereoMolecule_0, carc2.StereoMolecule_1);
  _.$init_56 = function $init_56() {
  };
  _.clear_0 = function clear_5() {
    getClassPrototype(60).clear_0.call(this);
    this.mCanonizer = null;
  };
  _.copyMoleculeProperties_0 = function copyMoleculeProperties_0(destMol) {
    getClassPrototype(60).copyMoleculeProperties_0.call(this, destMol);
    if (isNotNull(this.mCanonizer))
      destMol.mValidHelperArrays = 0;
  };
  _.createMolecule = function createMolecule(atoms, bonds) {
    return new carc2.StereoMolecule_0(atoms, bonds);
  };
  _.ensureHelperArrays_0 = function ensureHelperArrays_0(required) {
    var atom, bond, rankBits, rankMode;
    getClassPrototype(150).ensureHelperArrays_0.call(this, required);
    if ((required & ~this.mValidHelperArrays) == 0)
      return;
    if ((this.mValidHelperArrays & 15) != 0 && this.mAllAtoms > 1 && this.mCoordinates[0].equals_0(this.mCoordinates[1]))
      new carcc3.CoordinateInventor_0(0).invent(this);
    if (this.mAssignParitiesToNitrogen)
      required |= 128;
    for (atom = 0; atom < this.getAllAtoms_0(); atom++)
      this.mAtomFlags[atom] &= ~67223559;
    for (bond = 0; bond < this.getBonds_0(); bond++)
      this.mBondFlags[bond] &= ~63;
    rankBits = 0;
    rankMode = 0;
    if ((required & 32) != 0) {
      rankBits = 32;
      rankMode = 1;
    } else if ((required & 64) != 0) {
      rankBits = 64;
      rankMode = 1 | 2;
    }
    if ((required & 128) != 0) {
      rankBits |= 128;
      rankMode |= 32;
    }
    this.mCanonizer = new carc2.Canonizer_0(this, rankMode);
    this.mCanonizer.setParities_0();
    this.mCanonizer.setStereoCenters();
    this.mCanonizer.setCIPParities();
    if (this.validateESR())
      this.mCanonizer = new carc2.Canonizer_0(this, rankMode);
    this.mValidHelperArrays |= 8 | 16 | rankBits;
  };
  _.getAbsoluteAtomParity_0 = function getAbsoluteAtomParity(atom) {
    return this.mCanonizer.getTHParity(atom);
  };
  _.getAbsoluteBondParity_0 = function getAbsoluteBondParity(bond) {
    return this.mCanonizer.getEZParity(bond);
  };
  _.getChiralText_0 = function getChiralText_0() {
    var count;
    this.ensureHelperArrays_0(31);
    count = this.mChirality & 65535;
    switch (this.mChirality & ~65535) {
      case 65536:
        return null;
      case 131072:
        return count == 1 ? "meso" : "" + count + " meso diastereomers";
      case 0:
        return "unknown chirality";
      case 196608:
        return "both enantiomers";
      case 262144:
        return "this enantiomer";
      case 327680:
        return "this or other enantiomer";
      case 393216:
        return "two epimers";
      default:
        return count == 1 ? "one stereo isomer" : "" + count + " stereo isomers";
    }
  };
  _.getCompactCopy_0 = function getCompactCopy() {
    var theCopy;
    theCopy = new carc2.StereoMolecule_0(this.mAllAtoms, this.mAllBonds);
    this.copyMolecule_0(theCopy);
    return theCopy;
  };
  _.getESRGroupMemberCounts = function getESRGroupMemberCounts() {
    var atom, atom0, bond, bond0, esrGroupMembers, maxESRGroup, type_0;
    this.ensureHelperArrays_0(15);
    maxESRGroup = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    for (atom0 = 0; atom0 < this.getAtoms_0(); atom0++) {
      if (this.isAtomStereoCenter_0(atom0)) {
        type_0 = this.getAtomESRType_0(atom0);
        if (type_0 != 0)
          maxESRGroup[type_0] = $wnd.Math.max(maxESRGroup[type_0], this.getAtomESRGroup_0(atom0));
      }
    }
    for (bond0 = 0; bond0 < this.getBonds_0(); bond0++) {
      if ((this.getBondParity_0(bond0) == 1 || this.getBondParity_0(bond0) == 2) && this.getBondType_0(bond0) == 1) {
        type_0 = this.getBondESRType_0(bond0);
        if (type_0 != 0)
          maxESRGroup[type_0] = $wnd.Math.max(maxESRGroup[type_0], this.getBondESRGroup_0(bond0));
      }
    }
    esrGroupMembers = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 3, 0, 2);
    esrGroupMembers[1] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 1 + maxESRGroup[1], 15, 1);
    esrGroupMembers[2] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 1 + maxESRGroup[2], 15, 1);
    for (atom = 0; atom < this.getAtoms_0(); atom++) {
      if (this.isAtomStereoCenter_0(atom)) {
        type_0 = this.getAtomESRType_0(atom);
        if (type_0 != 0)
          esrGroupMembers[type_0][this.getAtomESRGroup_0(atom)]++;
      }
    }
    for (bond = 0; bond < this.getBonds_0(); bond++) {
      if ((this.getBondParity_0(bond) == 1 || this.getBondParity_0(bond) == 2) && this.getBondType_0(bond) == 1) {
        type_0 = this.getBondESRType_0(bond);
        if (type_0 != 0)
          esrGroupMembers[type_0][this.getBondESRGroup_0(bond)]++;
      }
    }
    return esrGroupMembers;
  };
  _.getFragments_0 = function getFragments() {
    var fragmentNo, fragments;
    fragmentNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    fragments = this.getFragmentNumbers_0(fragmentNo, false, false);
    return this.getFragments_1(fragmentNo, fragments);
  };
  _.getFragments_1 = function getFragments_0(fragmentNo, fragmentCount) {
    var atom, atom0, atomMap, atoms, bond, bond0, bonds, f, f$array, f$index, f$max, f1, f2, fragment, i;
    fragment = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_StereoMolecule_2_classLit, { 95: 1, 4: 1, 1: 1, 7: 1 }, 17, fragmentCount, 0, 1);
    atoms = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, fragmentCount, 15, 1);
    bonds = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, fragmentCount, 15, 1);
    atomMap = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAllAtoms, 15, 1);
    for (atom0 = 0; atom0 < this.mAllAtoms; atom0++)
      if (fragmentNo[atom0] != -1)
        atomMap[atom0] = atoms[fragmentNo[atom0]]++;
    for (bond0 = 0; bond0 < this.mAllBonds; bond0++) {
      f1 = fragmentNo[this.mBondAtom[0][bond0]];
      f2 = fragmentNo[this.mBondAtom[1][bond0]];
      if (f1 == f2 && f1 != -1)
        bonds[f1]++;
    }
    for (i = 0; i < fragmentCount; i++) {
      setCheck(fragment, i, this.createMolecule(atoms[i], bonds[i]));
      this.copyMoleculeProperties_0(fragment[i]);
    }
    for (atom = 0; atom < this.mAllAtoms; atom++)
      if (fragmentNo[atom] != -1)
        this.copyAtom_0(fragment[fragmentNo[atom]], atom, 0, 0);
    for (bond = 0; bond < this.mAllBonds; bond++) {
      f1 = fragmentNo[this.mBondAtom[0][bond]];
      f2 = fragmentNo[this.mBondAtom[1][bond]];
      if (f1 == f2 && f1 != -1)
        this.copyBond_1(fragment[f1], bond, 0, 0, atomMap, false);
    }
    for (f$array = fragment, f$index = 0, f$max = f$array.length; f$index < f$max; ++f$index) {
      f = f$array[f$index];
      f.renumberESRGroups_0(1);
      f.renumberESRGroups_0(2);
    }
    return fragment;
  };
  _.getIDCode_0 = function getIDCode_2() {
    this.ensureHelperArrays_0(15);
    if (isNull(this.mCanonizer) && (this.getAtoms_0() < 2 || !this.mCoordinates[0].equals_0(this.mCoordinates[1])))
      this.mCanonizer = new carc2.Canonizer(this);
    return isNull(this.mCanonizer) ? null : this.mCanonizer.getIDCode_0();
  };
  _.getIDCoordinates_0 = function getIDCoordinates() {
    this.ensureHelperArrays_0(15);
    if (isNull(this.mCanonizer) && (this.getAtoms_0() < 2 || !this.mCoordinates[0].equals_0(this.mCoordinates[1])))
      this.mCanonizer = new carc2.Canonizer(this);
    return isNull(this.mCanonizer) ? null : this.mCanonizer.getEncodedCoordinates_0();
  };
  _.getStereoCenterCount_0 = function getStereoCenterCount() {
    var atom, scCount;
    this.ensureHelperArrays_0(31);
    scCount = 0;
    for (atom = 0; atom < this.getAtoms_0(); atom++)
      if (this.getAtomParity_0(atom) != 0 && !this.isAtomParityPseudo_0(atom))
        scCount++;
    return scCount;
  };
  _.getSymmetryRank_0 = function getSymmetryRank_0(atom) {
    return this.mCanonizer.getSymmetryRank_0(atom);
  };
  _.setAssignParitiesToNitrogen_0 = function setAssignParitiesToNitrogen(b) {
    this.mAssignParitiesToNitrogen = b;
    this.mValidHelperArrays &= ~(15 | 128);
  };
  _.setUnknownParitiesToExplicitlyUnknown_0 = function setUnknownParitiesToExplicitlyUnknown_0() {
    this.ensureHelperArrays_0(31);
    if (isNotNull(this.mCanonizer))
      this.mCanonizer.setUnknownParitiesToExplicitlyUnknown_0();
  };
  _.stripStereoInformation_0 = function stripStereoInformation() {
    var atom, bond;
    this.ensureHelperArrays_0(15);
    this.mIsRacemate = false;
    for (atom = 0; atom < this.mAllAtoms; atom++) {
      this.mAtomFlags[atom] &= ~33292288;
      if ((this.mAtomFlags[atom] & 3) != 0)
        this.mAtomFlags[atom] |= 33554432;
      else
        this.mAtomFlags[atom] &= ~33554432;
    }
    for (bond = 0; bond < this.mAllBonds; bond++)
      if ((this.mBondFlags[bond] & 3) != 0 && this.getBondOrder_0(bond) == 2)
        this.mBondType[bond] = 386;
      else
        this.mBondType[bond] &= ~384;
    this.mValidHelperArrays &= ~248;
  };
  _.translateTHParity = function translateTHParity(atom, targetAtomIndex) {
    var connAtom, connAtom1, connAtom2, i, inversion, j, neighbour, neighbours, parity;
    parity = this.getAtomParity_0(atom);
    if (parity == 1 || parity == 2) {
      inversion = false;
      if (this.isCentralAlleneAtom(atom)) {
        for (i = 0; i < this.getConnAtoms_0(atom); i++) {
          connAtom = this.getConnAtom_0(atom, i);
          neighbours = 0;
          neighbour = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
          for (j = 0; j < this.getConnAtoms_0(connAtom); j++) {
            neighbour[neighbours] = this.getConnAtom_0(connAtom, j);
            if (neighbour[neighbours] != atom)
              neighbours++;
          }
          if (neighbours == 2 && neighbour[0] < neighbour[1] ^ targetAtomIndex[neighbour[0]] < targetAtomIndex[neighbour[1]])
            inversion = !inversion;
        }
      } else {
        for (i = 1; i < this.getConnAtoms_0(atom); i++) {
          for (j = 0; j < i; j++) {
            connAtom1 = this.getConnAtom_0(atom, i);
            connAtom2 = this.getConnAtom_0(atom, j);
            if (connAtom1 < connAtom2 ^ targetAtomIndex[connAtom1] < targetAtomIndex[connAtom2])
              inversion = !inversion;
          }
        }
      }
      if (inversion)
        parity = parity == 1 ? 2 : 1;
    }
    return parity;
  };
  _.validate_0 = function validate_0() {
    var angle, atom, i, i0, j;
    getClassPrototype(150).validate_0.call(this);
    this.ensureHelperArrays_0(31);
    for (atom = 0; atom < this.getAtoms_0(); atom++) {
      if ((this.getAtomESRType_0(atom) == 1 || this.getAtomESRType_0(atom) == 2) && (!this.isAtomStereoCenter_0(atom) || this.getAtomParity_0(atom) == 3))
        throw toJs(new jl.Exception_1("Members of ESR groups must only be stereo centers with known configuration."));
      if ((this.mAtomFlags[atom] & 65536) != 0)
        throw toJs(new jl.Exception_1("Over- or under-specified stereo feature or more than one racemic type bond"));
      if ((this.getAtomParity_0(atom) == 1 || this.getAtomParity_0(atom) == 2) && this.getAtomPi_0(atom) == 0) {
        angle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.getConnAtoms_0(atom), 15, 1);
        for (i0 = 0; i0 < this.getConnAtoms_0(atom); i0++)
          angle[i0] = this.getBondAngle_0(atom, this.getConnAtom_0(atom, i0));
        for (i = 1; i < this.getConnAtoms_0(atom); i++)
          if (!this.isStereoBond_1(this.getConnBond_0(atom, i), atom)) {
            for (j = 0; j < i; j++)
              if (!this.isStereoBond_1(this.getConnBond_0(atom, j), atom)) {
                if (this.bondsAreParallel(angle[i], angle[j]))
                  throw toJs(new jl.Exception_1("Ambiguous configuration at stereo center because of 2 parallel bonds"));
              }
          }
      }
    }
  };
  _.validateESR = function validateESR() {
    var atom, atom0, atom1, atom2, bond, isIndependentRacemicAtom, paritiesUpdated;
    paritiesUpdated = false;
    for (atom0 = 0; atom0 < this.getAtoms_0(); atom0++)
      if (!this.isAtomStereoCenter_0(atom0) || this.getAtomParity_0(atom0) == 3)
        this.mAtomFlags[atom0] &= ~33292288;
    for (bond = 0; bond < this.getBonds_0(); bond++)
      if (this.getBondOrder_0(bond) != 1 || this.getBondParity_0(bond) == 0 || this.getBondParity_0(bond) == 3)
        this.mBondFlags[bond] &= ~32512;
    if (this.mIsRacemate) {
      if ((this.mChirality & ~65535) != 131072) {
        isIndependentRacemicAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.getAtoms_0(), 16, 1);
        for (atom1 = 0; atom1 < this.getAtoms_0(); atom1++)
          if (this.isAtomStereoCenter_0(atom1) && this.getAtomParity_0(atom1) != 3 && this.getAtomESRType_0(atom1) == 1)
            isIndependentRacemicAtom[atom1] = true;
        for (atom2 = 0; atom2 < this.getAtoms_0(); atom2++) {
          if (this.isAtomStereoCenter_0(atom2) && this.getAtomParity_0(atom2) != 3) {
            this.setAtomESR_0(atom2, 1, 0);
            paritiesUpdated = true;
          }
        }
        for (atom = 0; atom < this.getAtoms_0(); atom++) {
          if (isIndependentRacemicAtom[atom]) {
            this.setAtomParity_0(atom, 1, false);
            this.setAtomESR_0(atom, 1, -1);
            paritiesUpdated = true;
          }
        }
      }
      this.mIsRacemate = false;
    }
    this.renumberESRGroups_0(1);
    this.renumberESRGroups_0(2);
    return paritiesUpdated;
  };
  _.mAssignParitiesToNitrogen = false;
  carc2.VALIDATION_ERROR_AMBIGUOUS_CONFIGURATION = "Ambiguous configuration at stereo center because of 2 parallel bonds";
  carc2.VALIDATION_ERROR_ESR_CENTER_UNKNOWN = "Members of ESR groups must only be stereo centers with known configuration.";
  carc2.VALIDATION_ERROR_OVER_UNDER_SPECIFIED = "Over- or under-specified stereo feature or more than one racemic type bond";
  carc2.serialVersionUID_4 = 537316094;
  cggl.Lcom_actelion_research_chem_StereoMolecule_2_classLit = createForClass("com.actelion.research.chem", "StereoMolecule", 17, cggl.Lcom_actelion_research_chem_ExtendedMolecule_2_classLit);
  carc2.$clinit_TautomerHelper = function $clinit_TautomerHelper() {
    carc2.$clinit_TautomerHelper = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.TautomerHelper = function TautomerHelper(mol) {
    carc2.$clinit_TautomerHelper();
    var i, valence;
    Object_0.call(this);
    this.$init_57();
    this.mOriginalMol = mol.getCompactCopy_0();
    this.moveDeuteriumAndTritiumToTableEnd();
    this.mOriginalMol.ensureHelperArrays_0(7);
    this.mIsTautomerBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mOriginalMol.getBonds_0(), 16, 1);
    this.mHasFreeValence = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mOriginalMol.getAtoms_0(), 16, 1);
    for (i = 0; i < this.mOriginalMol.getAtoms_0(); i++) {
      valence = carc2.getAllowedValences(this.mOriginalMol.getAtomicNo_0(i))[0];
      this.mHasFreeValence[i] = this.mOriginalMol.getNonHydrogenNeighbourCount_0(i) < valence;
    }
    this.createAllTautomers();
    this.assignRegionNumbers();
    this.countAndRemoveDAndT();
    this.compileRegionCounts();
  };
  defineClass(265, 1, { 1: 1 }, carc2.TautomerHelper);
  _.$init_57 = function $init_57() {
  };
  _.addAllTautomers = function addAllTautomers(mol) {
    var atom1, atom2, atom3, bond12, bond23, bondList, i, isUsedAtom, j, order12, order23;
    bondList = new ju.ArrayList();
    mol.ensureHelperArrays_0(1);
    isUsedAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 16, 1);
    for (atom1 = 0; atom1 < mol.getAtoms_0(); atom1++) {
      if (this.isValidHeteroAtom(atom1)) {
        isUsedAtom[atom1] = true;
        for (i = 0; i < mol.getConnAtoms_0(atom1); i++) {
          atom2 = mol.getConnAtom_0(atom1, i);
          bond12 = mol.getConnBond_0(atom1, i);
          order12 = mol.getConnBondOrder_0(atom1, i);
          if (mol.getAtomPi_0(atom2) != 0 && mol.getAtomPi_0(atom1) < order12) {
            isUsedAtom[atom2] = true;
            bondList.add(jl.valueOf_12(bond12));
            for (j = 0; j < mol.getConnAtoms_0(atom2); j++) {
              atom3 = mol.getConnAtom_0(atom2, j);
              if (!isUsedAtom[atom3]) {
                isUsedAtom[atom3] = true;
                bond23 = mol.getConnBond_0(atom2, j);
                order23 = mol.getConnBondOrder_0(atom2, j);
                if (mol.getAtomPi_0(atom2) + 2 == order12 + order23) {
                  bondList.add(jl.valueOf_12(bond23));
                  if (order12 >= order23) {
                    if (mol.getAtomPi_0(atom3) < order23) {
                      if (this.hasAcidicHydrogen(mol, atom3))
                        this.addVinylogousTautomers(mol, atom3, true, false, isUsedAtom, bondList);
                    } else {
                      this.addVinylogousTautomers(mol, atom3, true, true, isUsedAtom, bondList);
                    }
                  }
                  if (order23 >= order12 && this.hasAcidicHydrogen(mol, atom1)) {
                    this.addVinylogousTautomers(mol, atom3, false, false, isUsedAtom, bondList);
                  }
                  if (this.isValidDonorAtom(atom3) && mol.getAtomPi_0(atom3) < order23) {
                    if (order12 <= 2 && order23 >= 2 && this.hasAcidicHydrogen(mol, atom1)) {
                      this.addDirectTautomer(mol, bond12, bond23);
                    }
                    if (order12 >= 2 && order23 <= 2 && this.hasAcidicHydrogen(mol, atom3)) {
                      this.addDirectTautomer(mol, bond23, bond12);
                    }
                  }
                  bondList.removeAtIndex(bondList.size() - 1);
                }
                isUsedAtom[atom3] = false;
              }
            }
            bondList.removeAtIndex(bondList.size() - 1);
            isUsedAtom[atom2] = false;
          }
        }
        isUsedAtom[atom1] = false;
      }
    }
  };
  _.addDirectTautomer = function addDirectTautomer(mol, bondSToD, bondDToS) {
    var bondOrders;
    bondOrders = new carc2.TautomerHelper$BondOrders(this, mol);
    bondOrders.setBond(bondSToD, mol.getBondOrder_0(bondSToD) == 1 ? 2 : 3);
    bondOrders.setBond(bondDToS, mol.getBondOrder_0(bondDToS) == 2 ? 1 : 2);
    this.mIsTautomerBond[bondSToD] = true;
    this.mIsTautomerBond[bondDToS] = true;
    this.addTautomerIfNew(bondOrders);
  };
  _.addTautomerIfNew = function addTautomerIfNew(bondOrders) {
    if (this.mBondOrderSet.add(bondOrders))
      this.mBondOrderDeque.add(bondOrders);
  };
  _.addVinylogousTautomers = function addVinylogousTautomers(mol, atom1, firstBondIsDouble, thirdBondIsDouble, isUsedAtom, bondList) {
    var atom2, atom3, bond, bond12, bond23, bondOrders, i, j, k, makeDouble, order12, order23;
    for (i = 0; i < mol.getConnAtoms_0(atom1); i++) {
      atom2 = mol.getConnAtom_0(atom1, i);
      if (!isUsedAtom[atom2]) {
        bond12 = mol.getConnBond_0(atom1, i);
        order12 = mol.getBondOrder_0(bond12);
        if (firstBondIsDouble && order12 >= 2 || !firstBondIsDouble && order12 <= 2) {
          isUsedAtom[atom2] = true;
          bondList.add(jl.valueOf_12(bond12));
          for (j = 0; j < mol.getConnAtoms_0(atom2); j++) {
            atom3 = mol.getConnAtom_0(atom2, j);
            if (!isUsedAtom[atom3]) {
              bond23 = mol.getConnBond_0(atom2, j);
              order23 = mol.getBondOrder_0(bond23);
              if (mol.getAtomPi_0(atom2) + 2 == order12 + order23 && (firstBondIsDouble && order23 <= 2 || !firstBondIsDouble && order23 >= 2)) {
                isUsedAtom[atom3] = true;
                bondList.add(jl.valueOf_12(bond23));
                if (this.isValidDonorAtom(atom3) && (!firstBondIsDouble || this.hasAcidicHydrogen(mol, atom3))) {
                  bondOrders = new carc2.TautomerHelper$BondOrders(this, mol);
                  for (k = 0; k < bondList.size(); k++) {
                    bond = castTo(bondList.getAtIndex(k), 35).intValue();
                    makeDouble = k < 2 ? firstBondIsDouble ^ (k & 1) == 0 : thirdBondIsDouble ^ (k & 1) == 0;
                    if (makeDouble)
                      bondOrders.setBond(bond, mol.getBondOrder_0(bond) == 1 ? 2 : 3);
                    else
                      bondOrders.setBond(bond, mol.getBondOrder_0(bond) == 2 ? 1 : 2);
                    this.mIsTautomerBond[bond] = true;
                  }
                  this.addTautomerIfNew(bondOrders);
                } else {
                  this.addVinylogousTautomers(mol, atom3, firstBondIsDouble, thirdBondIsDouble, isUsedAtom, bondList);
                }
                bondList.removeAtIndex(bondList.size() - 1);
                isUsedAtom[atom3] = false;
              }
            }
          }
          bondList.removeAtIndex(bondList.size() - 1);
          isUsedAtom[atom2] = false;
        }
      }
    }
    return false;
  };
  _.assignRegionNumbers = function assignRegionNumbers() {
    var atom, bond, bondWasSeen, connAtom, connBond, current, graphAtom, highest, i, j, region;
    this.mAtomRegionNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mOriginalMol.getAtoms_0(), 15, 1);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mOriginalMol.getAtoms_0(), 15, 1);
    bondWasSeen = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mOriginalMol.getBonds_0(), 16, 1);
    region = 0;
    for (bond = 0; bond < this.mOriginalMol.getBonds_0(); bond++) {
      if (!bondWasSeen[bond] && this.mIsTautomerBond[bond]) {
        region++;
        this.mAtomRegionNo[this.mOriginalMol.getBondAtom_0(0, bond)] = region;
        this.mAtomRegionNo[this.mOriginalMol.getBondAtom_0(1, bond)] = region;
        bondWasSeen[bond] = true;
        for (i = 0; i < 2; i++) {
          atom = this.mOriginalMol.getBondAtom_0(i, bond);
          this.mAtomRegionNo[atom] = region;
          current = 0;
          highest = 0;
          graphAtom[0] = atom;
          while (current <= highest) {
            for (j = 0; j < this.mOriginalMol.getConnAtoms_0(graphAtom[current]); j++) {
              connBond = this.mOriginalMol.getConnBond_0(graphAtom[current], j);
              if (!bondWasSeen[connBond] && this.mIsTautomerBond[connBond]) {
                bondWasSeen[connBond] = true;
                connAtom = this.mOriginalMol.getConnAtom_0(graphAtom[current], j);
                if (this.mAtomRegionNo[connAtom] == 0) {
                  this.mAtomRegionNo[connAtom] = region;
                  graphAtom[++highest] = connAtom;
                }
              }
            }
            current++;
          }
        }
      }
    }
    this.mRegionCount = region;
  };
  _.compileRegionCounts = function compileRegionCounts() {
    var atom, bond, regionIndex;
    this.mRegionPiCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRegionCount, 15, 1);
    this.mRegionDCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRegionCount, 15, 1);
    this.mRegionTCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRegionCount, 15, 1);
    for (atom = 0; atom < this.mOriginalMol.getAtoms_0(); atom++) {
      if (this.mAtomRegionNo[atom] != 0) {
        regionIndex = this.mAtomRegionNo[atom] - 1;
        if (jsNotEquals(this.mAtomDCount, null))
          this.mRegionDCount[regionIndex] += this.mAtomDCount[atom];
        if (jsNotEquals(this.mAtomTCount, null))
          this.mRegionTCount[regionIndex] += this.mAtomTCount[atom];
      }
    }
    for (bond = 0; bond < this.mOriginalMol.getBonds_0(); bond++) {
      if (this.mIsTautomerBond[bond] && this.mOriginalMol.getBondOrder_0(bond) == 2) {
        this.mRegionPiCount[this.mAtomRegionNo[this.mOriginalMol.getBondAtom_0(0, bond)] - 1] += 2;
      }
    }
  };
  _.countAndRemoveDAndT = function countAndRemoveDAndT() {
    var atom1, atom2, bond, i;
    for (bond = 0; bond < this.mOriginalMol.getAllBonds_0(); bond++) {
      for (i = 0; i < 2; i++) {
        atom1 = this.mOriginalMol.getBondAtom_0(i, bond);
        atom2 = this.mOriginalMol.getBondAtom_0(1 - i, bond);
        if (this.mOriginalMol.getAtomicNo_0(atom1) == 1 && this.mOriginalMol.getAtomMass_0(atom1) > 1 && this.mOriginalMol.getAtomicNo_0(atom2) > 1 && this.mAtomRegionNo[atom2] != 0) {
          if (this.mOriginalMol.getAtomMass_0(atom1) == 2) {
            if (jsEquals(this.mAtomDCount, null))
              this.mAtomDCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mOriginalMol.getAllAtoms_0(), 15, 1);
            this.mAtomDCount[atom2]++;
          } else {
            if (jsEquals(this.mAtomTCount, null))
              this.mAtomTCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mOriginalMol.getAllAtoms_0(), 15, 1);
            this.mAtomTCount[atom2]++;
          }
          this.mOriginalMol.markAtomForDeletion_0(atom1);
        }
      }
    }
    if (jsNotEquals(this.mAtomDCount, null) || jsNotEquals(this.mAtomTCount, null))
      this.mOriginalMol.deleteMarkedAtomsAndBonds_0();
  };
  _.createAllTautomers = function createAllTautomers() {
    var tautomer;
    this.mBondOrderSet = new ju.TreeSet();
    this.mBondOrderDeque = new ju.ArrayDeque();
    this.addTautomerIfNew(new carc2.TautomerHelper$BondOrders(this, this.mOriginalMol));
    tautomer = this.mOriginalMol.getCompactCopy_0();
    while (!this.mBondOrderDeque.isEmpty()) {
      castTo(this.mBondOrderDeque.poll(), 143).copyToTautomer(tautomer);
      this.addAllTautomers(tautomer);
      if (this.mBondOrderSet.size() >= carc2.sMaxTautomers) {
        if (!carc2.sSuppressWarning)
          (jl.$clinit_System(), jl.out_0).println_0("Tautomer count exceeds maximum: " + new carc2.Canonizer(this.mOriginalMol).getIDCode_0());
        break;
      }
    }
  };
  _.createGenericTautomer = function createGenericTautomer() {
    var atom, atom0, atomRank, bond, i, label_0, maxAtom, maxRank, mol, regionIndex;
    if (this.mBondOrderSet.size() == 1)
      return this.mOriginalMol;
    mol = this.mOriginalMol.getCompactCopy_0();
    mol.setFragment_0(true);
    mol.ensureHelperArrays_0(7);
    for (bond = 0; bond < mol.getBonds_0(); bond++) {
      if (this.mIsTautomerBond[bond]) {
        mol.setBondType_0(bond, 1);
        mol.setBondQueryFeature_0(bond, 1 | 2, true);
      }
    }
    for (atom0 = 0; atom0 < mol.getAtoms_0(); atom0++) {
      if (this.mAtomRegionNo[atom0] != 0 && this.mOriginalMol.getNonHydrogenNeighbourCount_0(atom0) < 4) {
        mol.convertStereoBondsToSingleBonds_0(atom0);
        mol.setAtomConfigurationUnknown_0(atom0, false);
        mol.setAtomESR_0(atom0, 0, -1);
      }
    }
    maxAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRegionCount, 15, 1);
    maxRank = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRegionCount, 15, 1);
    atomRank = new carc2.Canonizer(mol).getFinalRank_0();
    for (atom = 0; atom < mol.getAtoms_0(); atom++) {
      if (this.mAtomRegionNo[atom] != 0) {
        regionIndex = this.mAtomRegionNo[atom] - 1;
        if (maxRank[regionIndex] < atomRank[atom]) {
          maxRank[regionIndex] = atomRank[atom];
          maxAtom[regionIndex] = atom;
        }
      }
    }
    for (i = 0; i < this.mRegionCount; i++) {
      label_0 = "" + this.mRegionPiCount[i] + "|" + this.mRegionDCount[i] + "|" + this.mRegionTCount[i];
      mol.setAtomCustomLabel_0(maxAtom[i], label_0);
    }
    return mol;
  };
  _.hasAcidicHydrogen = function hasAcidicHydrogen(mol, atom) {
    if (mol.getAllHydrogens_0(atom) <= 0)
      return false;
    if (mol.isElectronegative_0(atom))
      return true;
    if (mol.getAtomPi_0(atom) != 0)
      return false;
    return true;
  };
  _.isValidDonorAtom = function isValidDonorAtom(atom) {
    return this.mHasFreeValence[atom] && (this.mOriginalMol.getAtomicNo_0(atom) == 5 || this.mOriginalMol.getAtomicNo_0(atom) == 6 || this.mOriginalMol.getAtomicNo_0(atom) == 7 || this.mOriginalMol.getAtomicNo_0(atom) == 8 || this.mOriginalMol.getAtomicNo_0(atom) == 16 || this.mOriginalMol.getAtomicNo_0(atom) == 34 || this.mOriginalMol.getAtomicNo_0(atom) == 52);
  };
  _.isValidHeteroAtom = function isValidHeteroAtom(atom) {
    return this.mHasFreeValence[atom] && (this.mOriginalMol.getAtomicNo_0(atom) == 7 || this.mOriginalMol.getAtomicNo_0(atom) == 8 || this.mOriginalMol.getAtomicNo_0(atom) == 16 || this.mOriginalMol.getAtomicNo_0(atom) == 34 || this.mOriginalMol.getAtomicNo_0(atom) == 52);
  };
  _.moveDeuteriumAndTritiumToTableEnd = function moveDeuteriumAndTritiumToTableEnd() {
    var atom, atom1, atom2, bond, bond0, isHydrogenBond, lastNonHAtom, lastNonHBond;
    this.mOriginalMol.ensureHelperArrays_0(1);
    lastNonHAtom = this.mOriginalMol.getAtoms_0();
    do
      lastNonHAtom--;
    while (lastNonHAtom >= 0 && this.mOriginalMol.getAtomicNo_0(lastNonHAtom) == 1);
    for (atom = 0; atom < lastNonHAtom; atom++) {
      if (this.mOriginalMol.getAtomicNo_0(atom) == 1) {
        this.mOriginalMol.swapAtoms_0(atom, lastNonHAtom);
        do
          lastNonHAtom--;
        while (this.mOriginalMol.getAtomicNo_0(lastNonHAtom) == 1);
      }
    }
    if (lastNonHAtom == this.mOriginalMol.getAtoms_0() - 1)
      return;
    isHydrogenBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mOriginalMol.getBonds_0(), 16, 1);
    for (bond0 = 0; bond0 < this.mOriginalMol.getBonds_0(); bond0++) {
      atom1 = this.mOriginalMol.getBondAtom_0(0, bond0);
      atom2 = this.mOriginalMol.getBondAtom_0(1, bond0);
      if (this.mOriginalMol.getAtomicNo_0(atom1) == 1 || this.mOriginalMol.getAtomicNo_0(atom2) == 1)
        isHydrogenBond[bond0] = true;
    }
    lastNonHBond = this.mOriginalMol.getBonds_0();
    do
      lastNonHBond--;
    while (lastNonHBond >= 0 && isHydrogenBond[lastNonHBond]);
    for (bond = 0; bond < lastNonHBond; bond++) {
      if (isHydrogenBond[bond]) {
        this.mOriginalMol.swapBonds_0(bond, lastNonHBond);
        isHydrogenBond[bond] = false;
        do
          lastNonHBond--;
        while (isHydrogenBond[lastNonHBond]);
      }
    }
  };
  _.mRegionCount = 0;
  carc2.MAX_TAUTOMERS = 1e5;
  carc2.sMaxTautomers = 1e5;
  carc2.sSuppressWarning = false;
  cggl.Lcom_actelion_research_chem_TautomerHelper_2_classLit = createForClass("com.actelion.research.chem", "TautomerHelper", 265, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_TautomerHelper$BondOrders = function $clinit_TautomerHelper$BondOrders() {
    carc2.$clinit_TautomerHelper$BondOrders = emptyMethod;
    jl.$clinit_Object();
  };
  carc2.TautomerHelper$BondOrders = function TautomerHelper$BondOrders(this$0, mol) {
    carc2.$clinit_TautomerHelper$BondOrders();
    var i;
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_58();
    this.encoding = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, narrow_int((this$0.mOriginalMol.getBonds_0() + 15) / 16), 15, 1);
    for (i = 0; i < this$0.mOriginalMol.getBonds_0(); i++)
      this.encoding[i >> 4] |= $wnd.Math.min(3, mol.getBondOrder_0(i)) << 2 * (i & 15);
  };
  defineClass(143, 1, { 143: 1, 22: 1, 1: 1 }, carc2.TautomerHelper$BondOrders);
  _.$init_58 = function $init_58() {
  };
  _.compareTo_1 = function compareTo_12(o) {
    return this.compareTo_6(castTo(o, 143));
  };
  _.compareTo_6 = function compareTo_11(o) {
    return new caru.IntArrayComparator().compare_2(this.encoding, o.encoding);
  };
  _.copyToTautomer = function copyToTautomer(tautomer) {
    var bo, i;
    for (i = 0; i < this.this$01.mOriginalMol.getBonds_0(); i++) {
      if (this.this$01.mIsTautomerBond[i]) {
        bo = 3 & this.encoding[i >> 4] >> 2 * (i & 15);
        tautomer.setBondType_0(i, bo == 1 ? 1 : bo == 2 ? this.this$01.mIsTautomerBond[i] && !this.this$01.mOriginalMol.isSmallRingBond_0(i) ? 386 : 2 : bo == 3 ? 4 : 16);
      }
    }
  };
  _.setBond = function setBond(bond, order) {
    var high, shift_0;
    high = bond >> 4;
    shift_0 = 2 * (bond & 15);
    this.encoding[high] &= ~(3 << shift_0);
    this.encoding[high] |= order << shift_0;
  };
  cggl.Lcom_actelion_research_chem_TautomerHelper$BondOrders_2_classLit = createForClass("com.actelion.research.chem", "TautomerHelper/BondOrders", 143, cggl.Ljava_lang_Object_2_classLit);
  carc2.$clinit_TextDrawingObject = function $clinit_TextDrawingObject() {
    carc2.$clinit_TextDrawingObject = emptyMethod;
    carc2.$clinit_AbstractDrawingObject();
  };
  carc2.TextDrawingObject = function TextDrawingObject() {
    carc2.$clinit_TextDrawingObject();
    carc2.TextDrawingObject_1.call(this, "", new cargg.GenericPoint(), 9, 0);
  };
  carc2.TextDrawingObject_0 = function TextDrawingObject_0(descriptorDetail) {
    carc2.$clinit_TextDrawingObject();
    var index1, index2, key, value_0;
    carc2.TextDrawingObject.call(this);
    index1 = 0;
    while (index1 != -1) {
      index2 = jl.indexOf_Ljava_lang_String_I_I__devirtual$(descriptorDetail, '="', index1);
      if (index2 == -1)
        break;
      key = jl.substring_II_Ljava_lang_String___devirtual$(descriptorDetail, index1 + 1, index2);
      index1 = jl.indexOf_Ljava_lang_String_I_I__devirtual$(descriptorDetail, '"', index2 + 2);
      value_0 = index1 == -1 ? jl.substring_I_Ljava_lang_String___devirtual$(descriptorDetail, index2 + 1) : jl.substring_II_Ljava_lang_String___devirtual$(descriptorDetail, index2 + 1, index1);
      if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(key, "text"))
        this.setText_0(value_0);
      else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(key, "x"))
        this.setX(value_0);
      else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(key, "y"))
        this.setY(value_0);
      else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(key, "size"))
        this.setSize_0(value_0);
      else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(key, "style"))
        this.setStyle(value_0);
    }
  };
  carc2.TextDrawingObject_1 = function TextDrawingObject_1(text_0, pt, size_0, style) {
    carc2.AbstractDrawingObject.call(this);
    this.$init_59();
    this.mText = text_0;
    this.mSize = size_0;
    this.mStyle = style;
    this.mPoint = initUnidimensionalArray(cggl.Lcom_actelion_research_gui_generic_GenericPoint_2_classLit, { 4: 1, 1: 1, 7: 1 }, 67, 1, 0, 1);
    setCheck(this.mPoint, 0, pt);
  };
  defineClass(97, 38, { 38: 1, 97: 1, 1: 1 }, carc2.TextDrawingObject, carc2.TextDrawingObject_0);
  _.$init_59 = function $init_59() {
  };
  _.calculateBoundingRect = function calculateBoundingRect(context, textList) {
    var height, maxWidth, text_0, text$iterator, width_0;
    maxWidth = 0;
    for (text$iterator = textList.iterator(); text$iterator.hasNext_0(); ) {
      text_0 = castToString(text$iterator.next_3());
      if (jl.length__I__devirtual$_0(text_0) != 0) {
        width_0 = context.getBounds_1(text_0).getWidth_0();
        if (maxWidth < width_0)
          maxWidth = width_0;
      }
    }
    height = this.mSize * 1.399999976158142 * (textList.size() - 1) + this.mSize;
    return new cargg.GenericRectangle_0(this.mPoint[0].x_0, this.mPoint[0].y_0 - this.mSize / 2, maxWidth, height);
  };
  _.checkHiliting = function checkHiliting(x_0, y_0) {
    this.mHilite = this.contains_0(x_0, y_0);
    return this.mHilite;
  };
  _.clearHiliting = function clearHiliting() {
    this.mHilite = false;
  };
  _.clone_0 = function clone() {
    var duplicate;
    duplicate = new carc2.TextDrawingObject();
    duplicate.setValues(this.mText, this.mSize, this.mStyle);
    duplicate.setCoordinates(this.mPoint[0].x_0, this.mPoint[0].y_0);
    duplicate.mIsSelected = this.mIsSelected;
    return duplicate;
  };
  _.contains_0 = function contains_2(x_0, y_0) {
    return isNotNull(this.mLastBounds) && this.mLastBounds.contains_0(x_0, y_0);
  };
  _.decodeText = function decodeText(source) {
    var h, index_0, l, startIndex, text_0;
    index_0 = jl.indexOf_I_I__devirtual$(source, 38);
    if (index_0 == -1)
      return source;
    startIndex = 0;
    text_0 = new jl.StringBuffer();
    while (index_0 != -1) {
      text_0.append_2(jl.substring_II_Ljava_lang_String___devirtual$(source, startIndex, index_0));
      if (jl.charAt_I_C__devirtual$_0(source, index_0 + 1) == 38) {
        text_0.append_0(38);
        startIndex = index_0 + 2;
      } else {
        h = jl.charAt_I_C__devirtual$_0(source, index_0 + 1);
        h = h - (h < 65 ? 48 : h < 97 ? 65 : 97);
        l = jl.charAt_I_C__devirtual$_0(source, index_0 + 2);
        l = l - (l < 65 ? 48 : l < 97 ? 65 : 97);
        text_0.append_0(narrow_char(16 * h + l));
        startIndex = index_0 + 3;
      }
      index_0 = jl.indexOf_II_I__devirtual$(source, 38, startIndex);
    }
    text_0.append_2(jl.substring_I_Ljava_lang_String___devirtual$(source, startIndex));
    return text_0.toString_0();
  };
  _.draw = function draw(context, t) {
    var i, size_0, textList;
    size_0 = isNull(t) ? this.mSize : t.getScaling() * this.mSize;
    context.setFont_0(jl.round_2(size_0), (this.mStyle & 1) != 0, (this.mStyle & 2) != 0);
    context.setRGB_0(this.mIsSelected ? -65536 : context.isDarkBackground_0() ? -1 : -16777216);
    textList = this.getTextLineList();
    this.mLastBounds = this.calculateBoundingRect(context, textList);
    if (isNotNull(t))
      t.applyTo_3(this.mLastBounds);
    for (i = 0; i < textList.size(); i++)
      context.drawString_1(this.mLastBounds.x_0, this.mLastBounds.y_0 + 1 + size_0 * 5 / 6 + size_0 * 1.399999976158142 * i, castToString(textList.getAtIndex(i)));
  };
  _.encodeText = function encodeText(source) {
    var i, text_0;
    text_0 = new jl.StringBuffer();
    for (i = 0; i < jl.length__I__devirtual$_0(source); i++) {
      switch (jl.charAt_I_C__devirtual$_0(source, i)) {
        case 38:
          text_0.append_2("&&");
          break;
        case 9:
          text_0.append_2("&09");
          break;
        case 10:
          text_0.append_2("&0A");
          break;
        case 32:
          text_0.append_2("&20");
          break;
        default:
          text_0.append_0(jl.charAt_I_C__devirtual$_0(source, i));
          break;
      }
    }
    return text_0.toString_0();
  };
  _.getBoundingRect_0 = function getBoundingRect_1(context) {
    var textList;
    textList = this.getTextLineList();
    return this.calculateBoundingRect(context, textList);
  };
  _.getDescriptorDetail = function getDescriptorDetail() {
    var detail;
    detail = new jl.StringBuilder();
    detail.append_9(' text="' + this.encodeText(this.mText) + '"');
    detail.append_9(' x="' + this.mPoint[0].x_0 + '"');
    detail.append_9(' y="' + this.mPoint[0].y_0 + '"');
    if (this.mSize != 9)
      detail.append_9(' size="' + new jm.BigDecimal_1(this.mSize, new jm.MathContext(4)).toString_0() + '"');
    if (this.mStyle != 0)
      detail.append_9(' style="' + this.mStyle + '"');
    return detail.toString_0();
  };
  _.getSize_1 = function getSize_1() {
    return this.mSize;
  };
  _.getStyle = function getStyle() {
    return this.mStyle;
  };
  _.getText_0 = function getText() {
    return this.mText;
  };
  _.getTextLineList = function getTextLineList() {
    var lineBreak, textList, textStart;
    textList = new ju.ArrayList();
    lineBreak = jl.indexOf_I_I__devirtual$(this.mText, 10);
    if (lineBreak == -1) {
      textList.add(this.mText);
    } else {
      textStart = 0;
      while (lineBreak != -1) {
        textList.add(jl.substring_II_Ljava_lang_String___devirtual$(this.mText, textStart, lineBreak));
        textStart = lineBreak + 1;
        lineBreak = jl.indexOf_II_I__devirtual$(this.mText, 10, textStart);
      }
      textList.add(jl.substring_I_Ljava_lang_String___devirtual$(this.mText, textStart));
    }
    return textList;
  };
  _.getTypeString = function getTypeString() {
    return "text";
  };
  _.hilite = function hilite(context) {
    var bounds;
    bounds = this.getBoundingRect_0(context);
    context.setRGB_0(context.getSelectionBackgroundRGB_0());
    context.fillRectangle_0(bounds.x_0, bounds.y_0, bounds.width_0, bounds.height_0);
  };
  _.scale_0 = function scale_2(f) {
    getClassPrototype(38).scale_0.call(this, f);
    this.mSize *= f;
  };
  _.setCoordinates = function setCoordinates(x_0, y_0) {
    this.mPoint[0].x_0 = x_0;
    this.mPoint[0].y_0 = y_0;
  };
  _.setSize_0 = function setSize_0(value_0) {
    var nfe;
    try {
      this.mSize = parseFloat_0(value_0);
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 47)) {
        nfe = $e0;
      } else
        throw toJs($e0);
    }
  };
  _.setStyle = function setStyle(value_0) {
    var nfe;
    try {
      this.mStyle = jl.parseInt_2(value_0);
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 47)) {
        nfe = $e0;
      } else
        throw toJs($e0);
    }
  };
  _.setText_0 = function setText(value_0) {
    this.mText = this.decodeText(value_0);
  };
  _.setValues = function setValues(text_0, size_0, style) {
    this.mText = text_0;
    this.mSize = size_0;
    this.mStyle = style;
  };
  _.setX = function setX(value_0) {
    var nfe;
    try {
      this.mPoint[0].x_0 = parseFloat_0(value_0);
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 47)) {
        nfe = $e0;
      } else
        throw toJs($e0);
    }
  };
  _.setY = function setY(value_0) {
    var nfe;
    try {
      this.mPoint[0].y_0 = parseFloat_0(value_0);
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 47)) {
        nfe = $e0;
      } else
        throw toJs($e0);
    }
  };
  _.zoomAndRotate_0 = function zoomAndRotate_1(zoom, angle) {
    getClassPrototype(38).zoomAndRotate_0.call(this, zoom, angle);
    this.mSize = this.mZoomReferenceSize * zoom;
  };
  _.zoomAndRotateInit_0 = function zoomAndRotateInit_1(x_0, y_0) {
    getClassPrototype(38).zoomAndRotateInit_0.call(this, x_0, y_0);
    this.mZoomReferenceSize = this.mSize;
  };
  _.mHilite = false;
  _.mSize = 0;
  _.mStyle = 0;
  _.mZoomReferenceSize = 0;
  carc2.DEFAULT_SIZE = 9;
  carc2.DEFAULT_STYLE = 0;
  carc2.LINE_SPACING = 1.399999976158142;
  carc2.TYPE_STRING = "text";
  cggl.Lcom_actelion_research_chem_TextDrawingObject_2_classLit = createForClass("com.actelion.research.chem", "TextDrawingObject", 97, cggl.Lcom_actelion_research_chem_AbstractDrawingObject_2_classLit);
  carc2.$clinit_UniqueStringList = function $clinit_UniqueStringList() {
    carc2.$clinit_UniqueStringList = emptyMethod;
    carc2.$clinit_SortedStringList();
  };
  carc2.UniqueStringList = function UniqueStringList() {
    carc2.$clinit_UniqueStringList();
    carc2.SortedStringList.call(this);
    this.$init_60();
  };
  defineClass(326, 96, { 96: 1, 4: 1, 1: 1 }, carc2.UniqueStringList);
  _.$init_60 = function $init_60() {
    this.mOriginalOrder = new ju.ArrayList();
    this.mIndexList = new ju.ArrayList();
  };
  _.addString = function addString_0(theString) {
    var index_0, position;
    index_0 = getClassPrototype(96).addString.call(this, theString);
    if (index_0 == -1)
      return -1;
    position = this.mOriginalOrder.size();
    this.mOriginalOrder.add(theString);
    this.mIndexList.addAtIndex(index_0, jl.valueOf_12(position));
    return position;
  };
  _.getListIndex = function getListIndex_0(s) {
    var index_0;
    index_0 = getClassPrototype(96).getListIndex.call(this, s);
    if (index_0 == -1)
      return -1;
    return castTo(this.mIndexList.getAtIndex(index_0), 35).intValue();
  };
  _.getStringAt = function getStringAt_0(i) {
    return castToString(this.mOriginalOrder.getAtIndex(i));
  };
  _.toArray_1 = function toArray_4() {
    return castTo(this.mOriginalOrder.toArray_0(initUnidimensionalArray(cggl.Ljava_lang_String_2_classLit, { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 0, 6, 1)), 9);
  };
  carc2.serialVersionUID_5 = 537265952;
  cggl.Lcom_actelion_research_chem_UniqueStringList_2_classLit = createForClass("com.actelion.research.chem", "UniqueStringList", 326, cggl.Lcom_actelion_research_chem_SortedStringList_2_classLit);
  carcc.$clinit_BondAngleSet = function $clinit_BondAngleSet() {
    carcc.$clinit_BondAngleSet = emptyMethod;
    jl.$clinit_Object();
    carcc.TO_RADIAN = 3.141592653589793 / 180;
  };
  carcc.BondAngleSet = function BondAngleSet(mol, set_0) {
    carcc.$clinit_BondAngleSet();
    var angle, atom, atom0, cTotalAngleCount, connAtoms, consideredRingSize, i, i0, i1, isAromaticAtom, isAromaticRing, isMissingIndex, j, j0, ring, ring0, ringAtom, ringAtom$array, ringAtom$index, ringAtom$max, ringSet, ringSize;
    Object_0.call(this);
    this.$init_61();
    this.mBondLengthSet = isNull(set_0) ? new carcc.BondLengthSet(mol) : set_0;
    this.mMol = mol;
    this.mBondAngle = initUnidimensionalArray(cggl.F_classLit, { 4: 1, 1: 1, 7: 1 }, 837, this.mMol.getAtoms_0(), 0, 3);
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
      this.mBondAngle[atom0] = initUnidimensionalArray(cggl.F_classLit, { 837: 1, 4: 1, 1: 1, 7: 1 }, 44, this.mMol.getAllConnAtoms_0(atom0), 0, 2);
      for (i = 1; i < this.mMol.getAllConnAtoms_0(atom0); i++)
        this.mBondAngle[atom0][i] = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, i, 15, 1);
    }
    this.mDefinedAngleCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    this.mDefinedAngleSum = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 15, 1);
    this.mTinyRingSizeSum = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getBonds_0(), 15, 1);
    ringSet = this.mMol.getRingSet_0();
    isAromaticRing = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, ringSet.getSize_0(), 16, 1);
    ringSet.determineAromaticity_1(isAromaticRing, initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, ringSet.getSize_0(), 16, 1), initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, ringSet.getSize_0(), 15, 1), true);
    for (consideredRingSize = 3; consideredRingSize <= 7; consideredRingSize++) {
      for (ring0 = 0; ring0 < ringSet.getSize_0(); ring0++) {
        ringSize = ringSet.getRingSize_0(ring0);
        if (ringSize == consideredRingSize) {
          if (isAromaticRing[ring0])
            this.calculateBondAnglesOfAromaticRing(ring0);
          else if (ringSize <= 4)
            this.calculateBondAnglesOfSmallRing(ring0);
        }
      }
    }
    isAromaticAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    for (ring = 0; ring < ringSet.getSize_0(); ring++)
      if (isAromaticRing[ring])
        for (ringAtom$array = ringSet.getRingAtoms_0(ring), ringAtom$index = 0, ringAtom$max = ringAtom$array.length; ringAtom$index < ringAtom$max; ++ringAtom$index) {
          ringAtom = ringAtom$array[ringAtom$index];
          isAromaticAtom[ringAtom] = true;
        }
    cTotalAngleCount = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [0, 0, 1, 3, 6, 10, 15, 21]);
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      connAtoms = this.mMol.getAllConnAtoms_0(atom);
      if (connAtoms > 4) {
        for (i = 1; i < connAtoms; i++)
          for (j = 0; j < i; j++)
            this.mBondAngle[atom][i][j] = 3.141592653589793 / 2;
        this.mDefinedAngleCount[atom] = cTotalAngleCount[connAtoms];
        continue;
      }
      if (this.mDefinedAngleCount[atom] == cTotalAngleCount[connAtoms])
        continue;
      if (this.mMol.isSmallRingAtom_0(atom) && (isAromaticAtom[atom] || this.mMol.getAtomRingSize_0(atom) <= 4 && this.mMol.getAtomPi_0(atom) > 0)) {
        if (connAtoms > 2) {
          if (this.mDefinedAngleCount[atom] == 1) {
            if (this.mMol.getAtomicNo_0(atom) <= 14)
              angle = (2 * 3.141592653589793 - this.mDefinedAngleSum[atom]) / 2;
            else
              angle = this.calculateRemainingTetrahedralAngle(this.mDefinedAngleSum[atom]);
          } else {
            angle = 2 * 3.141592653589793 - this.mDefinedAngleSum[atom];
            if (connAtoms > 3) {
              if (this.mDefinedAngleCount[atom] == 2) {
                isMissingIndex = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllConnAtoms_0(atom), 16, 1);
                for (i0 = 1; i0 < connAtoms; i0++) {
                  for (j0 = 0; j0 < i0; j0++) {
                    if (this.mBondAngle[atom][i0][j0] != 0) {
                      isMissingIndex[i0] = !isMissingIndex[i0];
                      isMissingIndex[j0] = !isMissingIndex[j0];
                    }
                  }
                }
                for (i1 = 0; i1 < connAtoms; i1++) {
                  if (isMissingIndex[i1]) {
                    for (j0 = i1 + 1; j0 < connAtoms; j0++) {
                      if (isMissingIndex[j0]) {
                        this.mBondAngle[atom][j0][i1] = angle;
                        break;
                      }
                    }
                    break;
                  }
                }
              }
              angle = 3.141592653589793 / 2;
            }
          }
          for (i = 1; i < connAtoms; i++)
            for (j = 0; j < i; j++)
              if (this.mBondAngle[atom][i][j] == 0)
                this.mBondAngle[atom][i][j] = angle;
        }
      } else if (this.mMol.isSmallRingAtom_0(atom) && this.mMol.getAtomRingSize_0(atom) <= 4) {
        switch (this.getRingStrainClass(atom)) {
          case 771:
            this.setRingStrainAngles(atom, 0, 3, 2.0653998851776123);
            this.setRingStrainAngles(atom, 0, 0, 113.52999877929688 * carcc.TO_RADIAN);
            break;
          case 1028:
            this.setRingStrainAngles(atom, 0, 4, 1.9797999858856201);
            this.setRingStrainAngles(atom, 0, 0, 111.55000305175781 * carcc.TO_RADIAN);
            break;
          case 393987:
            this.setRingStrainAngles(atom, 0, 3, 2.2639999389648438);
            this.setRingStrainAngles(atom, 0, 6, 2.2639999389648438);
            this.setRingStrainAngles(atom, 3, 3, 98.71499633789062 * carcc.TO_RADIAN);
            break;
          case 459779:
            this.setRingStrainAngles(atom, 0, 3, 2.16759991645813);
            this.setRingStrainAngles(atom, 0, 4, 2.16759991645813);
            this.setRingStrainAngles(atom, 0, 7, 2.16759991645813);
            this.setRingStrainAngles(atom, 3, 4, 110.70999908447266 * carcc.TO_RADIAN);
            break;
          case 525316:
            this.setRingStrainAngles(atom, 0, 4, 2.0662999153137207);
            this.setRingStrainAngles(atom, 0, 8, 2.0662999153137207);
            this.setRingStrainAngles(atom, 4, 4, 114.55999755859375 * carcc.TO_RADIAN);
          case 394758:
            this.setRingStrainAngles(atom, 0, 6, 2.526099920272827);
            break;
          case 460550:
            this.setRingStrainAngles(atom, 0, 6, 2.3561999797821045);
            this.setRingStrainAngles(atom, 0, 7, 2.3561999797821045);
            break;
          case 526087:
            this.setRingStrainAngles(atom, 0, 7, 2.2844998836517334);
            this.setRingStrainAngles(atom, 0, 8, 2.2844998836517334);
            break;
          case 526344:
            this.setRingStrainAngles(atom, 0, 8, 2.186300039291382);
            break;
          case 50529027:
            this.setRingStrainAngles(atom, 3, 3, 2.4189000129699707);
            break;
          case 67371779:
            this.setRingStrainAngles(atom, 3, 4, 2.2298998832702637);
            break;
          case 67372036:
            this.setRingStrainAngles(atom, 4, 4, 2.094399929046631);
            break;
          case 101057283:
            this.setRingStrainAngles(atom, 3, 6, 105.41999816894531 * carcc.TO_RADIAN);
            this.setRingStrainAngles(atom, 3, 3, 166.50999450683594 * carcc.TO_RADIAN);
            break;
          case 117834755:
            this.setRingStrainAngles(atom, 3, 4, 161.1300048828125 * carcc.TO_RADIAN);
            this.setRingStrainAngles(atom, 3, 7, 102.62000274658203 * carcc.TO_RADIAN);
            this.setRingStrainAngles(atom, 4, 6, 121.61000061035156 * carcc.TO_RADIAN);
            break;
          case 134677507:
            this.setRingStrainAngles(atom, 3, 4, 151.39999389648438 * carcc.TO_RADIAN);
            this.setRingStrainAngles(atom, 3, 8, 116.18000030517578 * carcc.TO_RADIAN);
            this.setRingStrainAngles(atom, 4, 7, 129 * carcc.TO_RADIAN);
            break;
          case 117900035:
            this.setRingStrainAngles(atom, 3, 7, 120.87999725341797 * carcc.TO_RADIAN);
            this.setRingStrainAngles(atom, 3, 3, 177.9199981689453 * carcc.TO_RADIAN);
            break;
          case 117900292:
            this.setRingStrainAngles(atom, 4, 7, 119.79000091552734 * carcc.TO_RADIAN);
            this.setRingStrainAngles(atom, 4, 4, 146.1999969482422 * carcc.TO_RADIAN);
            break;
          case 134743044:
            this.setRingStrainAngles(atom, 4, 8, 122.56999969482422 * carcc.TO_RADIAN);
            this.setRingStrainAngles(atom, 4, 4, 134.75999450683594 * carcc.TO_RADIAN);
            break;
        }
      } else {
        angle = this.mMol.getAtomicNo_0(atom) > 10 ? 109.47000122070312 * 3.141592653589793 / 180 : this.mMol.getAtomPi_0(atom) == 2 ? 3.141592653589793 : this.mMol.isFlatNitrogen_0(atom) ? 120 * 3.141592653589793 / 180 : this.mMol.getAtomPi_0(atom) == 0 ? 109.47000122070312 * 3.141592653589793 / 180 : 120 * 3.141592653589793 / 180;
        for (i = 1; i < connAtoms; i++)
          for (j = 0; j < i; j++)
            this.mBondAngle[atom][i][j] = angle;
      }
    }
  };
  defineClass(472, 1, { 1: 1 }, carcc.BondAngleSet);
  _.$init_61 = function $init_61() {
  };
  _.calculateBondAnglesOfAromaticRing = function calculateBondAnglesOfAromaticRing(ring) {
    var angle, angleInc, angleSum, bondAngle, cycle, cycles, dError_ddir, dirDif1, dirDif2, direction, factor, force, gapDirection, gapGain, gapSize, i, i0, i1, i2, i3, i4, i5, im1, ip1, isRegularRing, maxForce, maxForceIndex, optAngle, optDif, ringAtom, ringBond, ringSet, ringSize, sx, sy;
    ringSet = this.mMol.getRingSet_0();
    ringSize = ringSet.getRingSize_0(ring);
    ringAtom = ringSet.getRingAtoms_0(ring);
    ringBond = ringSet.getRingBonds_0(ring);
    isRegularRing = true;
    for (i0 = 1; i0 < ringSize; i0++) {
      if (this.mBondLengthSet.getLength_0(ringBond[i0]) != this.mBondLengthSet.getLength_0(ringBond[0])) {
        isRegularRing = false;
        break;
      }
    }
    if (isRegularRing) {
      bondAngle = (ringSize - 2) * 3.141592653589793 / ringSize;
      for (i1 = 0; i1 < ringSize; i1++)
        this.setBondAngle(ringAtom[i1], ringBond[i1], ringBond[i1 == 0 ? ringSize - 1 : i1 - 1], bondAngle);
      return;
    }
    optAngle = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, ringSize, 15, 1);
    angleSum = 0;
    for (i2 = 0; i2 < ringSize; i2++) {
      optAngle[i2] = this.mMol.getAtomPi_0(ringAtom[i2]) == 0 ? 109.47000122070312 * carcc.TO_RADIAN : this.mMol.getAtomPi_0(ringAtom[i2]) == 1 ? 0.666700005531311 * 3.141592653589793 : 3.141592653589793;
      angleSum += optAngle[i2];
    }
    angleInc = ((ringSize - 2) * 3.141592653589793 - angleSum) / ringSize;
    for (i3 = 0; i3 < ringSize; i3++)
      optAngle[i3] += angleInc;
    direction = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, ringSize, 15, 1);
    for (i4 = 1; i4 < ringSize; i4++)
      direction[i4] = direction[i4 - 1] + 3.141592653589793 - optAngle[i4];
    dError_ddir = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, ringSize, 15, 1);
    cycles = 100;
    for (cycle = 0; cycle < 100; cycle++) {
      sx = 0;
      sy = 0;
      for (i1 = 0; i1 < ringSize; i1++) {
        sx += this.mBondLengthSet.getLength_0(ringBond[i1]) * $wnd.Math.sin(direction[i1]);
        sy += this.mBondLengthSet.getLength_0(ringBond[i1]) * $wnd.Math.cos(direction[i1]);
      }
      gapDirection = carc2.getAngle_0(0, 0, sx, sy);
      gapSize = $wnd.Math.sqrt(sx * sx + sy * sy);
      maxForceIndex = -1;
      maxForce = 0;
      for (i5 = 0; i5 < ringSize; i5++) {
        im1 = i5 == 0 ? ringSize - 1 : i5 - 1;
        ip1 = i5 + 1 == ringSize ? 0 : i5 + 1;
        dirDif1 = carc2.getAngleDif(direction[i5], direction[im1]);
        dirDif2 = carc2.getAngleDif(direction[ip1], direction[i5]);
        optDif = carc2.getAngleDif(optAngle[i5], optAngle[ip1]);
        dError_ddir[i5] = 2 * dirDif1 - 2 * dirDif2 + 2 * optDif;
        gapGain = $wnd.Math.cos(direction[i5] - 3.141592653589793 / 2 - gapDirection);
        force = gapSize * gapGain - 0.029999999329447746 * dError_ddir[i5];
        if ($wnd.Math.abs(force) > $wnd.Math.abs(maxForce)) {
          maxForce = force;
          maxForceIndex = i5;
        }
      }
      factor = $wnd.Math.exp(-5 * cycle / 100);
      direction[maxForceIndex] += factor * maxForce;
    }
    for (i = 0; i < ringSize; i++) {
      im1 = i == 0 ? ringSize - 1 : i - 1;
      angle = direction[im1] + 3.141592653589793 - direction[i];
      if (angle > 2 * 3.141592653589793)
        angle -= 2 * 3.141592653589793;
      this.setBondAngle(ringAtom[i], ringBond[im1], ringBond[i], angle);
    }
  };
  _.calculateBondAnglesOfSmallRing = function calculateBondAnglesOfSmallRing(ring) {
    var angle, i, i0, i1, ringAtom, ringBond, ringSet, ringSize, untouchedBondFound;
    ringSet = this.mMol.getRingSet_0();
    ringSize = ringSet.getRingSize_0(ring);
    ringBond = ringSet.getRingBonds_0(ring);
    untouchedBondFound = false;
    for (i0 = 0; i0 < ringSize; i0++) {
      if (this.mTinyRingSizeSum[ringBond[i0]] == 0) {
        untouchedBondFound = true;
        break;
      }
    }
    if (untouchedBondFound) {
      angle = (180 * ringSize - 360) / ringSize * carcc.TO_RADIAN;
      ringAtom = ringSet.getRingAtoms_0(ring);
      for (i1 = 0; i1 < ringSize; i1++) {
        this.setBondAngle(ringAtom[i1], ringBond[i1 == 0 ? ringSize - 1 : i1 - 1], ringBond[i1], angle);
      }
      if (ringSize <= 4) {
        for (i = 0; i < ringSize; i++)
          this.mTinyRingSizeSum[ringBond[i]] += ringSize;
      }
    }
  };
  _.calculateRemainingTetrahedralAngle = function calculateRemainingTetrahedralAngle(firstAngle) {
    var a109;
    a109 = 109.47000122070312 * 3.141592653589793 / 180;
    return a109 + (a109 - firstAngle) * 0.18000000715255737;
  };
  _.getAngle_1 = function getAngle_1(atom, conn1, conn2) {
    var conn, connIndex1, connIndex2, i;
    connIndex1 = -1;
    connIndex2 = -1;
    for (i = 0; i < this.mMol.getAllConnAtoms_0(atom); i++) {
      conn = this.mMol.getConnAtom_0(atom, i);
      if (conn == conn1 || conn == conn2) {
        if (connIndex2 == -1) {
          connIndex2 = i;
        } else {
          connIndex1 = i;
          break;
        }
      }
    }
    return this.mBondAngle[atom][connIndex1][connIndex2];
  };
  _.getConnAngle = function getConnAngle(atom, i1, i2) {
    return i1 < i2 ? this.mBondAngle[atom][i2][i1] : this.mBondAngle[atom][i1][i2];
  };
  _.getRingStrainClass = function getRingStrainClass(atom) {
    var bond, handled, i, j, largestIndex, largestSum, strainClass;
    handled = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getConnAtoms_0(atom), 16, 1);
    strainClass = 0;
    for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++) {
      largestSum = 0;
      largestIndex = -1;
      for (j = 0; j < this.mMol.getConnAtoms_0(atom); j++) {
        if (!handled[j]) {
          bond = this.mMol.getConnBond_0(atom, j);
          if (largestSum < this.mTinyRingSizeSum[bond]) {
            largestSum = this.mTinyRingSizeSum[bond];
            largestIndex = j;
          }
        }
      }
      if (largestSum == 0)
        return strainClass;
      strainClass <<= 8;
      strainClass += largestSum;
      handled[largestIndex] = true;
    }
    return strainClass;
  };
  _.setBondAngle = function setBondAngle(atom, bond1, bond2, angle) {
    var conn1, conn2, connBond, i;
    conn1 = -1;
    conn2 = -1;
    for (i = 0; i < this.mMol.getAllConnAtoms_0(atom); i++) {
      connBond = this.mMol.getConnBond_0(atom, i);
      if (connBond == bond1 || connBond == bond2) {
        if (conn1 == -1) {
          conn1 = i;
        } else {
          conn2 = i;
          break;
        }
      }
    }
    if (this.mBondAngle[atom][conn2][conn1] == 0) {
      this.mBondAngle[atom][conn2][conn1] = angle;
      this.mDefinedAngleSum[atom] += angle;
      this.mDefinedAngleCount[atom]++;
    }
  };
  _.setRingStrainAngles = function setRingStrainAngles(atom, tinyRingSizeSum1, tinyRingSizeSum2, angle) {
    var allConnAtoms, bondSum1, bondSum2, connAtoms, i, j;
    allConnAtoms = this.mMol.getAllConnAtoms_0(atom);
    connAtoms = this.mMol.getConnAtoms_0(atom);
    for (i = 1; i < allConnAtoms; i++) {
      bondSum1 = i < connAtoms ? this.mTinyRingSizeSum[this.mMol.getConnBond_0(atom, i)] : 0;
      for (j = 0; j < i; j++) {
        if (this.mBondAngle[atom][i][j] == 0) {
          bondSum2 = j < connAtoms ? this.mTinyRingSizeSum[this.mMol.getConnBond_0(atom, j)] : 0;
          if (bondSum1 == tinyRingSizeSum1 && bondSum2 == tinyRingSizeSum2 || bondSum1 == tinyRingSizeSum2 && bondSum2 == tinyRingSizeSum1)
            this.mBondAngle[atom][i][j] = angle;
        }
      }
    }
  };
  carcc.TO_RADIAN = 0;
  cggl.Lcom_actelion_research_chem_conf_BondAngleSet_2_classLit = createForClass("com.actelion.research.chem.conf", "BondAngleSet", 472, cggl.Ljava_lang_Object_2_classLit);
  carcc.$clinit_BondLengthSet = function $clinit_BondLengthSet() {
    carcc.$clinit_BondLengthSet = emptyMethod;
    jl.$clinit_Object();
    carcc.CONSIDER_PI = stampJavaTypeInfo(getClassLiteralForArray(cggl.Z_classLit, 1), { 10: 1, 4: 1, 1: 1 }, 5, 16, [false, false, false, false, false, true, true, true, true, false, false, false, false, false, false, true, true]);
  };
  carcc.BondLengthSet = function BondLengthSet(mol) {
    carcc.$clinit_BondLengthSet();
    var bond, index_0;
    Object_0.call(this);
    this.$init_62();
    mol.ensureHelperArrays_0(7);
    this.mBondLength = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, mol.getAllBonds_0(), 15, 1);
    this.mBondStdDev = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, mol.getAllBonds_0(), 15, 1);
    for (bond = 0; bond < mol.getAllBonds_0(); bond++) {
      index_0 = carcc.getBondIndex_1(mol, bond);
      if (index_0 == -1) {
        this.mBondLength[bond] = carcc.getBondLengthFromCovalentRadii(mol, bond);
        this.mBondStdDev[bond] = carcc.getStdDevFromCovalentRadii(mol, bond);
      } else {
        this.mBondLength[bond] = carcc.getBondLength_0(index_0);
        this.mBondStdDev[bond] = carcc.getBondStdDev(index_0);
      }
    }
  };
  carcc.getAtomPi_0 = function getAtomPi_0(mol, atom) {
    if (atom >= mol.getAtoms_0())
      return 0;
    if (mol.isAromaticAtom_0(atom) && mol.getAtomicNo_0(atom) == 6 && mol.getAtomCharge_0(atom) != 0)
      return 1;
    return mol.getAtomPi_0(atom);
  };
  carcc.getBondID = function getBondID(bondOrder, isAromatic, isDelocalized, atomicNo1, atomicNo2, atomPi1, atomPi2, conns1, conns2) {
    var atomType1, atomType2, bondType, pi1, pi2;
    pi1 = atomicNo1 < carcc.CONSIDER_PI.length && carcc.CONSIDER_PI[atomicNo1] ? $wnd.Math.min(3, atomPi1) : 0;
    pi2 = atomicNo2 < carcc.CONSIDER_PI.length && carcc.CONSIDER_PI[atomicNo2] ? $wnd.Math.min(3, atomPi2) : 0;
    conns1 = $wnd.Math.min(7, conns1);
    conns2 = $wnd.Math.min(7, conns2);
    atomType1 = conns1 + (pi1 << 3) + ($wnd.Math.min(127, atomicNo1) << 5);
    atomType2 = conns2 + (pi2 << 3) + ($wnd.Math.min(127, atomicNo2) << 5);
    bondType = isDelocalized ? 8 : isAromatic ? 8 + bondOrder : bondOrder;
    return (bondType << 24) + (atomType1 < atomType2 ? (atomType1 << 12) + atomType2 : (atomType2 << 12) + atomType1);
  };
  carcc.getBondIndex_0 = function getBondIndex_0(bondOrder, isAromatic, isDelocalized, atomicNo1, atomicNo2, atomPi1, atomPi2, conns1, conns2, exact) {
    var index_0;
    index_0 = carcc.lookupBondIndex(carcc.getBondID(bondOrder, isAromatic, isDelocalized, atomicNo1, atomicNo2, atomPi1, atomPi2, conns1, conns2));
    if (!exact && index_0 == -1) {
      index_0 = carcc.lookupBondIndex(carcc.getBondID(bondOrder, isAromatic, isDelocalized, atomicNo1, atomicNo2, atomPi1, atomPi2, 7, 7));
      if (index_0 == -1)
        index_0 = carcc.lookupBondIndex(carcc.getBondID(bondOrder, isAromatic, isDelocalized, atomicNo1, atomicNo2, 3, 3, 7, 7));
    }
    return index_0;
  };
  carcc.getBondIndex_1 = function getBondIndex_1(mol, bond) {
    return carcc.getBondIndex_2(mol, bond, false);
  };
  carcc.getBondIndex_2 = function getBondIndex_2(mol, bond, exact) {
    var atom1, atom2, atomicNo1, atomicNo2, conns1, conns2;
    atom1 = mol.getBondAtom_0(0, bond);
    atom2 = mol.getBondAtom_0(1, bond);
    atomicNo1 = mol.getAtomicNo_0(atom1);
    atomicNo2 = mol.getAtomicNo_0(atom2);
    conns1 = mol.getConnAtoms_0(atom1);
    conns2 = mol.getConnAtoms_0(atom2);
    return carcc.getBondIndex_0(mol.getBondOrder_0(bond), mol.isAromaticBond_0(bond), mol.isDelocalizedBond_0(bond), atomicNo1, atomicNo2, carcc.getAtomPi_0(mol, atom1), carcc.getAtomPi_0(mol, atom2), conns1, conns2, exact);
  };
  carcc.getBondLength_0 = function getBondLength_0(index_0) {
    return index_0 == -1 ? 2.000499963760376 : carcc.BOND_LENGTH[index_0];
  };
  carcc.getBondLengthFromCovalentRadii = function getBondLengthFromCovalentRadii(mol, bond) {
    var atomicNo1, atomicNo2;
    atomicNo1 = mol.getAtomicNo_0(mol.getBondAtom_0(0, bond));
    atomicNo2 = mol.getAtomicNo_0(mol.getBondAtom_0(1, bond));
    return carcc.getCovalentRadius(atomicNo1) + carcc.getCovalentRadius(atomicNo2);
  };
  carcc.getBondStdDev = function getBondStdDev(index_0) {
    return index_0 == -1 ? 1 : carcc.BOND_STDDEV[index_0];
  };
  carcc.getCovalentRadius = function getCovalentRadius(atomicNo) {
    return atomicNo < (carcc.$clinit_VDWRadii(), carcc.COVALENT_RADIUS).length ? (carcc.$clinit_VDWRadii(), carcc.COVALENT_RADIUS)[atomicNo] : atomicNo < (carcc.$clinit_VDWRadii(), carcc.VDW_RADIUS).length ? 0.6000000238418579 * (carcc.$clinit_VDWRadii(), carcc.VDW_RADIUS)[atomicNo] : 1.7999999523162842;
  };
  carcc.getStdDevFromCovalentRadii = function getStdDevFromCovalentRadii(mol, bond) {
    var atomicNo1, atomicNo2;
    atomicNo1 = mol.getAtomicNo_0(mol.getBondAtom_0(0, bond));
    atomicNo2 = mol.getAtomicNo_0(mol.getBondAtom_0(1, bond));
    return (atomicNo1 < (carcc.$clinit_VDWRadii(), carcc.COVALENT_RADIUS).length ? 0.05000000074505806 : 0.125) + (atomicNo2 < (carcc.$clinit_VDWRadii(), carcc.COVALENT_RADIUS).length ? 0.05000000074505806 : 0.125);
  };
  carcc.initialize_1 = function initialize_1() {
    var bdr, count, countString, e, i, item_0, line, nfe;
    if (!carcc.isInitialized) {
      {
        cggl.Lcom_actelion_research_chem_conf_BondLengthSet_2_classLit;
        try {
          bdr = jsEquals(carcc.sCustomBondDataFile, null) ? carcc.openReader("bondLengthData.txt") : new ji.BufferedReader(new ji.FileReader_0(carcc.sCustomBondDataFile));
          countString = bdr.readLine();
          count = jsEquals(countString, null) ? 0 : jl.parseInt_2(countString);
          carcc.BOND_ID = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, count, 15, 1);
          carcc.BOND_LENGTH = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, count, 15, 1);
          carcc.BOND_STDDEV = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, count, 15, 1);
          carcc.BOND_COUNT = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, count, 15, 1);
          for (i = 0; i < count; i++) {
            line = bdr.readLine();
            if (jsNotEquals(line, null)) {
              item_0 = jl.split_Ljava_lang_String___Ljava_lang_String___devirtual$(line, "\\t");
              if (item_0.length == 4) {
                try {
                  carcc.BOND_ID[i] = jl.parseInt_2(item_0[0]);
                  carcc.BOND_LENGTH[i] = parseFloat_0(item_0[1]);
                  carcc.BOND_STDDEV[i] = parseFloat_0(item_0[2]);
                  carcc.BOND_COUNT[i] = jl.parseInt_2(item_0[3]);
                } catch ($e0) {
                  $e0 = toJava($e0);
                  if (instanceOf($e0, 47)) {
                    nfe = $e0;
                    break;
                  } else
                    throw toJs($e0);
                }
              }
            }
          }
          bdr.close_0();
          carcc.isInitialized = true;
        } catch ($e1) {
          $e1 = toJava($e1);
          if (instanceOf($e1, 50)) {
            e = $e1;
            e.printStackTrace();
          } else
            throw toJs($e1);
        }
      }
    }
  };
  carcc.lookupBondIndex = function lookupBondIndex(id_0) {
    var comparison, i, increment, index_0;
    if (!carcc.isInitialized)
      carcc.initialize_1();
    index_0 = 4096;
    increment = 2048;
    for (i = 0; i < 13; i++) {
      comparison = index_0 >= carcc.BOND_ID.length || id_0 < carcc.BOND_ID[index_0] ? -1 : id_0 == carcc.BOND_ID[index_0] ? 0 : 1;
      if (comparison == 0)
        return index_0;
      index_0 = comparison < 0 ? index_0 - increment : index_0 + increment;
      increment = narrow_int(increment / 2);
    }
    return -1;
  };
  defineClass(274, 1, { 1: 1 }, carcc.BondLengthSet);
  _.$init_62 = function $init_62() {
  };
  _.getLength_0 = function getLength_0(bond) {
    return this.mBondLength[bond];
  };
  carcc.DEFAULT_BOND_LENGTH = 2.000499963760376;
  carcc.DEFAULT_BOND_STDDEV = 1;
  carcc.cBondDataFile = "bondLengthData.txt";
  carcc.isInitialized = false;
  carcc.sCustomBondDataFile = null;
  cggl.Lcom_actelion_research_chem_conf_BondLengthSet_2_classLit = createForClass("com.actelion.research.chem.conf", "BondLengthSet", 274, cggl.Ljava_lang_Object_2_classLit);
  carcc.$clinit_Conformer = function $clinit_Conformer() {
    carcc.$clinit_Conformer = emptyMethod;
    jl.$clinit_Object();
  };
  carcc.Conformer = function Conformer(mol) {
    carcc.$clinit_Conformer();
    var atom;
    Object_0.call(this);
    this.$init_63();
    this.mMol = mol;
    this.mCoordinates = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_Coordinates_2_classLit, { 151: 1, 4: 1, 1: 1, 7: 1 }, 33, mol.getAllAtoms_0(), 0, 1);
    for (atom = 0; atom < mol.getAllAtoms_0(); atom++)
      this.mCoordinates[atom] = new carc2.Coordinates_2(mol.getAtomCoordinates_0(atom));
    this.mEnergy = NaN;
  };
  carcc.Conformer_0 = function Conformer_0(c) {
    carcc.$clinit_Conformer();
    carcc.Conformer_1.call(this, c, c.mMol);
  };
  carcc.Conformer_1 = function Conformer_1(c, mol) {
    var i;
    Object_0.call(this);
    this.$init_63();
    this.mMol = mol;
    this.mCoordinates = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_Coordinates_2_classLit, { 151: 1, 4: 1, 1: 1, 7: 1 }, 33, c.mCoordinates.length, 0, 1);
    for (i = 0; i < this.mCoordinates.length; i++)
      this.mCoordinates[i] = new carc2.Coordinates_2(c.mCoordinates[i]);
    if (jsNotEquals(c.mBondTorsion, null))
      this.mBondTorsion = ju.copyOf_11(c.mBondTorsion, c.mBondTorsion.length);
    this.mName = jsEquals(c.mName, null) || jl.endsWith_Ljava_lang_String__Z__devirtual$(c.mName, " (copy)") ? c.mName : jl.concat_Ljava_lang_String__Ljava_lang_String___devirtual$(c.mName, " (copy)");
    this.mEnergy = NaN;
  };
  defineClass(61, 1, { 61: 1, 22: 1, 1: 1 }, carcc.Conformer_0);
  _.$init_63 = function $init_63() {
  };
  _.compareTo_1 = function compareTo_14(conformer) {
    return this.compareTo_7(castTo(conformer, 61));
  };
  _.calculateDescriptor = function calculateDescriptor(rotatableBond) {
    this.mTorsionDescriptor = new carcc.TorsionDescriptorHelper_0(this.getMolecule_0(), rotatableBond).getTorsionDescriptor(this);
  };
  _.calculateTorsion_0 = function calculateTorsion_0(atom) {
    var c1, c2, c3, c4, n1, n2, v1, v2, v3;
    c1 = this.getCoordinates(atom[0]);
    c2 = this.getCoordinates(atom[1]);
    c3 = this.getCoordinates(atom[2]);
    c4 = this.getCoordinates(atom[3]);
    v1 = c2.subC(c1);
    v2 = c3.subC(c2);
    v3 = c4.subC(c3);
    n1 = v1.cross(v2);
    n2 = v2.cross(v3);
    return -$wnd.Math.atan2(v2.getLength() * v1.dot(n2), n1.dot(n2));
  };
  _.compareTo_7 = function compareTo_13(conformer) {
    this.ensureDescriptors(conformer);
    return this.mTorsionDescriptor.compareTo_8(conformer.mTorsionDescriptor);
  };
  _.copyFrom = function copyFrom(mol) {
    var atom;
    for (atom = 0; atom < mol.getAllAtoms_0(); atom++)
      this.mCoordinates[atom].set_1(mol.getAtomCoordinates_0(atom));
  };
  _.copyFrom_0 = function copyFrom_0(conformer) {
    var atom;
    for (atom = 0; atom < conformer.getSize_0(); atom++)
      this.mCoordinates[atom].set_1(conformer.mCoordinates[atom]);
    if (jsEquals(conformer.mBondTorsion, null))
      this.mBondTorsion = null;
    else
      this.mBondTorsion = ju.copyOf_11(conformer.mBondTorsion, conformer.mBondTorsion.length);
  };
  _.ensureDescriptors = function ensureDescriptors(c) {
    var tdh;
    if (isNull(this.mTorsionDescriptor) || isNull(c.mTorsionDescriptor)) {
      tdh = new carcc.TorsionDescriptorHelper(this.mMol);
      if (isNull(this.mTorsionDescriptor))
        this.mTorsionDescriptor = tdh.getTorsionDescriptor(this);
      if (isNull(c.mTorsionDescriptor))
        c.mTorsionDescriptor = tdh.getTorsionDescriptor(c);
    }
  };
  _.equals_1 = function equals_8(conformer) {
    this.ensureDescriptors(conformer);
    return this.mTorsionDescriptor.equals_2(conformer.mTorsionDescriptor);
  };
  _.getBondTorsion = function getBondTorsion(bond) {
    return jsEquals(this.mBondTorsion, null) ? -1 : this.mBondTorsion[bond];
  };
  _.getCoordinates = function getCoordinates_0(atom) {
    return this.mCoordinates[atom];
  };
  _.getEnergy = function getEnergy() {
    return this.mEnergy;
  };
  _.getLikelihood = function getLikelihood() {
    return this.mLikelihood_0;
  };
  _.getMolecule_0 = function getMolecule_2() {
    return this.mMol;
  };
  _.getName_0 = function getName_1() {
    return jsEquals(this.mName, null) ? this.mMol.getName_0() : this.mName;
  };
  _.getSize_0 = function getSize_2() {
    return this.mCoordinates.length;
  };
  _.getX_0 = function getX(atom) {
    return this.mCoordinates[atom].x_0;
  };
  _.getY_0 = function getY(atom) {
    return this.mCoordinates[atom].y_0;
  };
  _.getZ = function getZ(atom) {
    return this.mCoordinates[atom].z_0;
  };
  _.setBondTorsion = function setBondTorsion(bond, torsion) {
    if (jsEquals(this.mBondTorsion, null)) {
      this.mBondTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, this.mMol.getAllBonds_0(), 15, 1);
      ju.fill_3(this.mBondTorsion, narrow_short(-1));
    }
    while (torsion < 0)
      torsion = narrow_short(torsion + 360);
    while (torsion >= 360)
      torsion = narrow_short(torsion - 360);
    this.mBondTorsion[bond] = torsion;
  };
  _.setCoordinates_0 = function setCoordinates_0(atom, coords) {
    this.mCoordinates[atom].set_1(coords);
  };
  _.setCoordinatesReplace = function setCoordinatesReplace(atom, coords) {
    this.mCoordinates[atom] = coords;
  };
  _.setEnergy = function setEnergy(energy) {
    this.mEnergy = energy;
  };
  _.setLikelihood = function setLikelihood(likelihood) {
    this.mLikelihood_0 = likelihood;
  };
  _.setName_0 = function setName_0(name_0) {
    this.mName = name_0;
  };
  _.setX_0 = function setX_0(atom, x_0) {
    this.mCoordinates[atom].x_0 = x_0;
  };
  _.setY_0 = function setY_0(atom, y_0) {
    this.mCoordinates[atom].y_0 = y_0;
  };
  _.setZ = function setZ(atom, z_0) {
    this.mCoordinates[atom].z_0 = z_0;
  };
  _.toMolecule = function toMolecule() {
    return this.toMolecule_0(this.mMol);
  };
  _.toMolecule_0 = function toMolecule_0(mol) {
    var atom;
    if (isNull(mol))
      mol = this.mMol.getCompactCopy_0();
    for (atom = 0; atom < mol.getAllAtoms_0(); atom++)
      mol.getAtomCoordinates_0(atom).set_1(this.mCoordinates[atom]);
    if (jsNotEquals(this.mName, null))
      mol.setName_0(this.mName);
    return mol;
  };
  _.mEnergy = 0;
  _.mLikelihood_0 = 0;
  cggl.Lcom_actelion_research_chem_conf_Conformer_2_classLit = createForClass("com.actelion.research.chem.conf", "Conformer", 61, cggl.Ljava_lang_Object_2_classLit);
  carcc.$clinit_TorsionDB = function $clinit_TorsionDB() {
    carcc.$clinit_TorsionDB = emptyMethod;
    jl.$clinit_Object();
    carcc.TORSION_NOT_FOUND = -1;
  };
  carcc.TorsionDB = function TorsionDB() {
    Object_0.call(this);
    this.$init_64();
    this.mTreeMap = new ju.TreeMap();
    this.mSupportedModes = 0;
  };
  carcc.calculateTorsionExtended = function calculateTorsionExtended(mol, conformer, atom) {
    var angle1, angle2, central, connAtom, i, i0, index_0, index1, index2, j, rearAtom, terminal, terminal1, terminal2;
    angle1 = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    rearAtom = carcc.findRearAtoms(mol, atom);
    for (i0 = 0; i0 < 2; i0++) {
      if (atom[3 * i0] != -1) {
        central = 2 - i0;
        terminal = 3 - 3 * i0;
        index_0 = 0;
        for (j = 0; j < 3; j++) {
          connAtom = mol.getConnAtom_0(atom[central], j);
          if (connAtom != rearAtom[1 - i0] && mol.getAtomicNo_0(connAtom) != 1) {
            atom[terminal] = connAtom;
            if (isNotNull(conformer))
              angle1[index_0++] = conformer.calculateTorsion_0(atom);
            else
              angle1[index_0++] = mol.calculateTorsion_0(atom);
          }
        }
        atom[terminal] = -1;
        return carcc.calculateVirtualTorsion(angle1);
      }
    }
    angle2 = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    index1 = 0;
    for (i = 0; i < 3; i++) {
      terminal1 = mol.getConnAtom_0(atom[1], i);
      if (terminal1 != rearAtom[0] && mol.getAtomicNo_0(terminal1) != 1) {
        atom[0] = terminal1;
        index2 = 0;
        for (j = 0; j < 3; j++) {
          terminal2 = mol.getConnAtom_0(atom[2], j);
          if (terminal2 != rearAtom[1] && mol.getAtomicNo_0(terminal2) != 1) {
            atom[3] = terminal2;
            if (isNotNull(conformer))
              angle2[index2++] = conformer.calculateTorsion_0(atom);
            else
              angle2[index2++] = mol.calculateTorsion_0(atom);
          }
        }
        angle1[index1++] = carcc.calculateVirtualTorsion(angle2);
      }
    }
    atom[0] = -1;
    atom[3] = -1;
    return carcc.calculateVirtualTorsion(angle1);
  };
  carcc.calculateTorsionExtended_0 = function calculateTorsionExtended_0(conformer, atom) {
    carcc.$clinit_TorsionDB();
    if (atom[0] != -1 && atom[3] != -1)
      return conformer.calculateTorsion_0(atom);
    return carcc.calculateTorsionExtended(conformer.getMolecule_0(), conformer, atom);
  };
  carcc.calculateVirtualTorsion = function calculateVirtualTorsion(angle) {
    var angleDif, meanAngle;
    meanAngle = (angle[1] + angle[0]) / 2;
    angleDif = $wnd.Math.abs(angle[1] - angle[0]);
    if (angleDif > 3.141592653589793)
      return meanAngle;
    return meanAngle < 0 ? meanAngle + 3.141592653589793 : meanAngle - 3.141592653589793;
  };
  carcc.findRearAtoms = function findRearAtoms(mol, torsionAtom) {
    var pathAtom, pathLength, rearAtom;
    rearAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    if (mol.getBond_0(torsionAtom[1], torsionAtom[2]) != -1) {
      rearAtom[0] = torsionAtom[2];
      rearAtom[1] = torsionAtom[1];
    } else {
      pathAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 15 + 1, 15, 1);
      pathLength = mol.getPath_0(pathAtom, torsionAtom[1], torsionAtom[2], 15, null);
      rearAtom[0] = pathAtom[1];
      rearAtom[1] = pathAtom[pathLength - 1];
    }
    return rearAtom;
  };
  carcc.findRotatableBonds = function findRotatableBonds(mol, skipAllRingBonds, isRotatableBond) {
    carcc.$clinit_TorsionDB();
    var alkyneAtomCount, bond, bond0, bondHandled, centralAtom, connAtom, connBond, count, i, i0, j, rearAtom, relevantBond, startAtom, substituentSize0, substituentSize1;
    mol.ensureHelperArrays_0(7);
    if (jsEquals(isRotatableBond, null))
      isRotatableBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getBonds_0(), 16, 1);
    count = 0;
    for (bond0 = 0; bond0 < mol.getBonds_0(); bond0++) {
      if (mol.getBondOrder_0(bond0) == 1 && !mol.isAromaticBond_0(bond0) && mol.getNonHydrogenNeighbourCount_0(mol.getBondAtom_0(0, bond0)) > 1 && mol.getNonHydrogenNeighbourCount_0(mol.getBondAtom_0(1, bond0)) > 1 && !(skipAllRingBonds && mol.isRingBond_0(bond0)) && !(mol.isSmallRingBond_0(bond0) && mol.getBondRingSize_0(bond0) <= 5)) {
        isRotatableBond[bond0] = true;
        count++;
      }
    }
    centralAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    rearAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    bondHandled = null;
    for (bond = 0; bond < mol.getBonds_0(); bond++) {
      if (isRotatableBond[bond] && (jsEquals(bondHandled, null) || !bondHandled[bond])) {
        alkyneAtomCount = 0;
        for (i0 = 0; i0 < 2; i0++) {
          centralAtom[i0] = mol.getBondAtom_0(i0, bond);
          rearAtom[i0] = mol.getBondAtom_0(1 - i0, bond);
          startAtom = rearAtom[i0];
          while (mol.getAtomPi_0(centralAtom[i0]) == 2 && mol.getNonHydrogenNeighbourCount_0(centralAtom[i0]) == 2 && mol.getAtomicNo_0(centralAtom[i0]) < 10) {
            for (j = 0; j < 2; j++) {
              connAtom = mol.getConnAtom_0(centralAtom[i0], j);
              if (connAtom != rearAtom[i0]) {
                connBond = mol.getConnBond_0(centralAtom[i0], j);
                if (isRotatableBond[connBond] && mol.getBondOrder_0(connBond) == 1) {
                  isRotatableBond[connBond] = false;
                  count--;
                }
                rearAtom[i0] = centralAtom[i0];
                centralAtom[i0] = connAtom;
                alkyneAtomCount++;
                break;
              }
            }
            if (centralAtom[i0] == startAtom) {
              alkyneAtomCount = 0;
              break;
            }
          }
        }
        if (alkyneAtomCount != 0) {
          isRotatableBond[bond] = false;
          count--;
          if (mol.getNonHydrogenNeighbourCount_0(centralAtom[0]) > 1 && mol.getNonHydrogenNeighbourCount_0(centralAtom[1]) > 1) {
            substituentSize0 = mol.getSubstituentSize_0(rearAtom[0], centralAtom[0]);
            substituentSize1 = mol.getSubstituentSize_0(rearAtom[1], centralAtom[1]);
            i = substituentSize0 < substituentSize1 ? 0 : 1;
            relevantBond = mol.getBond_0(rearAtom[i], centralAtom[i]);
            if (jsEquals(bondHandled, null))
              bondHandled = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getBonds_0(), 16, 1);
            bondHandled[relevantBond] = true;
            isRotatableBond[relevantBond] = true;
            count++;
          }
        }
      }
    }
    return count;
  };
  carcc.getSymmetryType = function getSymmetryType(torsionID) {
    return jl.endsWith_Ljava_lang_String__Z__devirtual$(torsionID, "<") || jl.endsWith_Ljava_lang_String__Z__devirtual$(torsionID, ">") ? 0 : jl.endsWith_Ljava_lang_String__Z__devirtual$(torsionID, "-") || jl.endsWith_Ljava_lang_String__Z__devirtual$(torsionID, "+") ? 1 : jl.endsWith_Ljava_lang_String__Z__devirtual$(torsionID, "=") ? 3 : 2;
  };
  carcc.getTorsionFrequencies = function getTorsionFrequencies(torsionID) {
    carcc.$clinit_TorsionDB();
    var ti;
    ti = carcc.sInstance.getTorsionInfo(torsionID);
    return isNull(ti) ? null : ti.get360DegreeFrequencies();
  };
  carcc.getTorsionID = function getTorsionID(mol, bond, torsionAtom, detail) {
    carcc.$clinit_TorsionDB();
    if (isNull(detail))
      detail = new carcc.TorsionDetail();
    detail.classify(mol, bond);
    if (jsNotEquals(torsionAtom, null)) {
      torsionAtom[0] = detail.getReferenceAtom(0);
      torsionAtom[1] = detail.getCentralAtom(0);
      torsionAtom[2] = detail.getCentralAtom(1);
      torsionAtom[3] = detail.getReferenceAtom(1);
    }
    return detail.getID();
  };
  carcc.getTorsionRanges = function getTorsionRanges(torsionID) {
    carcc.$clinit_TorsionDB();
    var ti;
    ti = carcc.sInstance.getTorsionInfo(torsionID);
    return isNull(ti) ? null : ti.get360DegreeRanges();
  };
  carcc.getTorsions = function getTorsions(torsionID) {
    carcc.$clinit_TorsionDB();
    var ti;
    ti = carcc.sInstance.getTorsionInfo(torsionID);
    return isNull(ti) ? null : ti.get360DegreeAngles();
  };
  carcc.initialize_2 = function initialize_2(mode) {
    carcc.$clinit_TorsionDB();
    carcc.initialize_3(mode, 15);
  };
  carcc.initialize_3 = function initialize_3(mode, mergeSpan) {
    var newMode;
    {
      cggl.Lcom_actelion_research_chem_conf_TorsionDB_2_classLit;
      if (isNull(carcc.sInstance))
        carcc.sInstance = new carcc.TorsionDB();
      if (mode == 1 && (carcc.sInstance.mSupportedModes & 1) != 0 && carcc.sInstance.mMergeSpan != mergeSpan)
        (jl.$clinit_System(), jl.out_0).println_0("WARNING: TorsionDB already initialized in ANGLE mode with different merge span.");
      newMode = mode & ~carcc.sInstance.mSupportedModes;
      if (newMode != 0) {
        carcc.sInstance.init_3(newMode);
        if (newMode == 1 && mergeSpan != 0)
          carcc.sInstance.mergeTorsions(mergeSpan);
      }
    }
  };
  carcc.isInverted_0 = function isInverted_0(torsionID) {
    return jl.endsWith_Ljava_lang_String__Z__devirtual$(torsionID, "<") || jl.endsWith_Ljava_lang_String__Z__devirtual$(torsionID, "-");
  };
  carcc.normalizeID = function normalizeID(torsionID) {
    return jl.endsWith_Ljava_lang_String__Z__devirtual$(torsionID, "<") ? jl.substring_II_Ljava_lang_String___devirtual$(torsionID, 0, jl.length__I__devirtual$_0(torsionID) - 1) + ">" : jl.endsWith_Ljava_lang_String__Z__devirtual$(torsionID, "-") ? jl.substring_II_Ljava_lang_String___devirtual$(torsionID, 0, jl.length__I__devirtual$_0(torsionID) - 1) + "+" : torsionID;
  };
  carcc.openReader = function openReader(resourceName) {
    carcc.$clinit_TorsionDB();
    var is;
    if (jsNotEquals(carcc.sExternalResourcePath, null))
      return new ji.BufferedReader(new ji.FileReader_0(carcc.sExternalResourcePath + ("" + resourceName)));
    if (jsEquals(carcc.sDatabase, null)) {
      is = ocu.getResourceAsStream("/resources/csd/" + resourceName);
      if (isNotNull(is)) {
        carcc.sDatabase = "csd/";
        return new ji.BufferedReader(new ji.InputStreamReader_0(is, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
      }
      carcc.sDatabase = "cod/";
    }
    return new ji.BufferedReader(new ji.InputStreamReader_0(ocu.getResourceAsStream("/resources/" + carcc.sDatabase + resourceName), (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
  };
  defineClass(456, 1, { 1: 1 }, carcc.TorsionDB);
  _.$init_64 = function $init_64() {
  };
  _.getTorsionInfo = function getTorsionInfo(torsionID) {
    var ti;
    if (jsEquals(torsionID, null))
      return null;
    ti = castTo(this.mTreeMap.get(torsionID), 125);
    if (isNotNull(ti))
      return ti;
    if (carcc.isInverted_0(torsionID)) {
      ti = castTo(this.mTreeMap.get(carcc.normalizeID(torsionID)), 125);
      if (isNotNull(ti)) {
        ti = new carcc.TorsionInfo_0(ti);
        this.mTreeMap.put(torsionID, ti);
        return ti;
      }
    }
    return null;
  };
  _.init_3 = function init_3(mode) {
    var angle, ar, binSize, br, e, fr, frequency, i, index_0, range, rr, torsionInfo, tr, type_0;
    this.mSupportedModes |= mode;
    try {
      tr = carcc.openReader("torsionID.txt");
      ar = (mode & 1) == 0 ? null : carcc.openReader("torsionAngle.txt");
      rr = (mode & 1) == 0 ? null : carcc.openReader("torsionRange.txt");
      fr = (mode & 1) == 0 ? null : carcc.openReader("torsionFrequency.txt");
      br = (mode & 2) == 0 ? null : carcc.openReader("torsionBins.txt");
      type_0 = tr.readLine();
      while (jsNotEquals(type_0, null)) {
        torsionInfo = castTo(this.mTreeMap.get(type_0), 125);
        if (isNull(torsionInfo)) {
          torsionInfo = new carcc.TorsionInfo(carcc.getSymmetryType(type_0));
          this.mTreeMap.put(type_0, torsionInfo);
        }
        if (isNotNull(ar)) {
          angle = jl.split_Ljava_lang_String___Ljava_lang_String___devirtual$(ar.readLine(), ",");
          torsionInfo.angle = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, angle.length, 15, 1);
          for (i = 0; i < angle.length; i++)
            torsionInfo.angle[i] = jl.parseShort(angle[i]);
        }
        if (isNotNull(rr)) {
          range = jl.split_Ljava_lang_String___Ljava_lang_String___devirtual$(rr.readLine(), ",");
          torsionInfo.range = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [range.length, 2], 2);
          for (i = 0; i < range.length; i++) {
            index_0 = jl.indexOf_II_I__devirtual$(range[i], 45, 1);
            torsionInfo.range[i][0] = jl.parseShort(jl.substring_II_Ljava_lang_String___devirtual$(range[i], 0, index_0));
            torsionInfo.range[i][1] = jl.parseShort(jl.substring_I_Ljava_lang_String___devirtual$(range[i], index_0 + 1));
          }
        }
        if (isNotNull(fr)) {
          frequency = jl.split_Ljava_lang_String___Ljava_lang_String___devirtual$(fr.readLine(), ",");
          torsionInfo.frequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, frequency.length, 15, 1);
          for (i = 0; i < frequency.length; i++)
            torsionInfo.frequency[i] = jl.parseByte(frequency[i]);
        }
        if (isNotNull(br)) {
          binSize = jl.split_Ljava_lang_String___Ljava_lang_String___devirtual$(br.readLine(), ",");
          torsionInfo.binSize = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, binSize.length, 15, 1);
          for (i = 0; i < binSize.length; i++)
            torsionInfo.binSize[i] = jl.parseByte(binSize[i]);
        }
        type_0 = tr.readLine();
      }
      tr.close_0();
      if (isNotNull(ar))
        ar.close_0();
      if (isNotNull(rr))
        rr.close_0();
      if (isNotNull(fr))
        fr.close_0();
      if (isNotNull(br))
        br.close_0();
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 50)) {
        e = $e0;
        e.printStackTrace();
      } else
        throw toJs($e0);
    }
  };
  _.mergeTorsions = function mergeTorsions(mergeSpan) {
    var ti, ti$iterator;
    this.mMergeSpan = mergeSpan;
    for (ti$iterator = this.mTreeMap.values().iterator(); ti$iterator.hasNext_0(); ) {
      ti = castTo(ti$iterator.next_3(), 125);
      ti.mergeTorsions_0(mergeSpan);
    }
  };
  _.mMergeSpan = 0;
  _.mSupportedModes = 0;
  carcc.DATABASE_COD = "cod/";
  carcc.DATABASE_CSD = "csd/";
  carcc.DEFAULT_MERGE_SPAN = 15;
  carcc.MAX_SP_CHAIN_LENGTH = 15;
  carcc.MODE_ANGLES = 1;
  carcc.MODE_BINS = 2;
  carcc.TORSION_GREEN = 0;
  carcc.TORSION_NOT_FOUND = 0;
  carcc.TORSION_RED = 2;
  carcc.TORSION_YELLOW = 1;
  carcc.cBasePath = "/resources/";
  carcc.cTorsionAngleFile = "torsionAngle.txt";
  carcc.cTorsionBinsFile = "torsionBins.txt";
  carcc.cTorsionFrequencyFile = "torsionFrequency.txt";
  carcc.cTorsionIDFile = "torsionID.txt";
  carcc.cTorsionRangeFile = "torsionRange.txt";
  cggl.Lcom_actelion_research_chem_conf_TorsionDB_2_classLit = createForClass("com.actelion.research.chem.conf", "TorsionDB", 456, cggl.Ljava_lang_Object_2_classLit);
  carcc.$clinit_TorsionDescriptor = function $clinit_TorsionDescriptor() {
    carcc.$clinit_TorsionDescriptor = emptyMethod;
    jl.$clinit_Object();
    carcc.TORSION_EQUIVALENCE_TOLERANCE = 3.141592653589793 / 12;
  };
  carcc.TorsionDescriptor = function TorsionDescriptor(torsion, maxTorsion) {
    carcc.$clinit_TorsionDescriptor();
    Object_0.call(this);
    this.$init_65();
    this.mTorsion = torsion;
    this.mMaxTorsion = maxTorsion;
  };
  defineClass(223, 1, { 223: 1, 22: 1, 1: 1 }, carcc.TorsionDescriptor);
  _.$init_65 = function $init_65() {
  };
  _.compareTo_1 = function compareTo_16(td) {
    return this.compareTo_8(castTo(td, 223));
  };
  _.compareTo_8 = function compareTo_15(td) {
    var dif, i;
    for (i = 0; i < this.mTorsion.length; i++) {
      dif = $wnd.Math.abs(this.mTorsion[i] - td.mTorsion[i]);
      if (dif > 0.2617993950843811 && dif < this.mMaxTorsion[i] - 0.2617993950843811)
        return dif < this.mMaxTorsion[i] / 2 ^ this.mTorsion[i] < td.mTorsion[i] ? 1 : -1;
    }
    return 0;
  };
  _.equals_2 = function equals_9(td) {
    var dif, i;
    for (i = 0; i < this.mTorsion.length; i++) {
      dif = $wnd.Math.abs(this.mTorsion[i] - td.mTorsion[i]);
      if (dif > 0.2617993950843811 && dif < this.mMaxTorsion[i] - 0.2617993950843811)
        return false;
    }
    return true;
  };
  _.toString_0 = function toString_14() {
    var i, sb;
    sb = new jl.StringBuilder();
    for (i = 0; i < this.mTorsion.length; i++) {
      sb.append_9(i == 0 ? "Torsions: " : ", ");
      sb.append_9(caru.toString_23(this.mTorsion[i], 3) + "(" + jl.round_2(this.mMaxTorsion[i] + 0.5) + ")");
    }
    return sb.toString_0();
  };
  carcc.TORSION_EQUIVALENCE_TOLERANCE = 0;
  cggl.Lcom_actelion_research_chem_conf_TorsionDescriptor_2_classLit = createForClass("com.actelion.research.chem.conf", "TorsionDescriptor", 223, cggl.Ljava_lang_Object_2_classLit);
  carcc.$clinit_TorsionDescriptorHelper = function $clinit_TorsionDescriptorHelper() {
    carcc.$clinit_TorsionDescriptorHelper = emptyMethod;
    jl.$clinit_Object();
    carcc.SYMMETRY_REDUNDANCY_ANGLE = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [2 * 3.141592653589793, 3.141592653589793, 2 * 3.141592653589793 / 3, 3.141592653589793 / 3]);
    carcc.SYMMETRY = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 2), { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 0, [stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [0, 0, 0, 2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [0, 0, 1, 2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [0, 1, 1, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [2, 2, 3, 2])]);
  };
  carcc.TorsionDescriptorHelper = function TorsionDescriptorHelper(mol) {
    carcc.$clinit_TorsionDescriptorHelper();
    Object_0.call(this);
    this.$init_66();
    this.mMol = mol;
    this.mMol.ensureHelperArrays_0(63);
    this.mRotatableBond = carcc.findRotatableBonds_0(mol);
    this.findAtomSequences();
  };
  carcc.TorsionDescriptorHelper_0 = function TorsionDescriptorHelper_0(mol, rotatableBond) {
    carcc.$clinit_TorsionDescriptorHelper();
    Object_0.call(this);
    this.$init_66();
    this.mMol = mol;
    this.mMol.ensureHelperArrays_0(63);
    this.mRotatableBond = rotatableBond;
    this.findAtomSequences();
  };
  carcc.findRotatableBonds_0 = function findRotatableBonds_0(mol) {
    carcc.$clinit_TorsionDescriptorHelper();
    var bond, bond0, count, isRotatableBond, rotatableBond;
    mol.ensureHelperArrays_0(7);
    isRotatableBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getBonds_0(), 16, 1);
    count = 0;
    for (bond0 = 0; bond0 < mol.getBonds_0(); bond0++) {
      if (carcc.qualifiesAsDescriptorBond(mol, bond0)) {
        isRotatableBond[bond0] = true;
        count++;
      }
    }
    rotatableBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, count, 15, 1);
    count = 0;
    for (bond = 0; bond < mol.getBonds_0(); bond++)
      if (isRotatableBond[bond])
        rotatableBond[count++] = bond;
    return rotatableBond;
  };
  carcc.getFirstNonSPAtom = function getFirstNonSPAtom(mol, startAtom, atom, maxBond) {
    var i, nextAtom, nextBond;
    for (i = 0; i < 2; i++) {
      nextAtom = mol.getConnAtom_0(atom[1], i);
      if (nextAtom != atom[0]) {
        if (nextAtom == startAtom)
          return false;
        nextBond = mol.getConnBond_0(atom[1], i);
        atom[0] = atom[1];
        atom[1] = nextAtom;
        if (mol.getConnAtoms_0(nextAtom) == 1)
          return false;
        if (jsNotEquals(maxBond, null) && !mol.isMarkedAtom_0(atom[0]) && !mol.isMarkedAtom_0(atom[1]))
          maxBond[0] = $wnd.Math.max(maxBond[0], nextBond);
        if (!carcc.isLinearAtom(mol, nextAtom))
          return true;
        return carcc.getFirstNonSPAtom(mol, startAtom, atom, maxBond);
      }
    }
    return false;
  };
  carcc.getNormalizedTorsion = function getNormalizedTorsion(angle, symmetryClass) {
    var limit;
    limit = carcc.SYMMETRY_REDUNDANCY_ANGLE[symmetryClass] / 2;
    while (angle < -limit)
      angle += 2 * 3.141592653589793;
    while (angle >= limit)
      angle -= carcc.SYMMETRY_REDUNDANCY_ANGLE[symmetryClass];
    return angle;
  };
  carcc.isLinearAtom = function isLinearAtom(mol, atom) {
    return mol.getConnAtoms_0(atom) == 2 && mol.getAtomPi_0(atom) == 2 && mol.getAtomicNo_0(atom) <= 7;
  };
  carcc.qualifiesAsDescriptorBond = function qualifiesAsDescriptorBond(mol, bond) {
    var bondAtom, chainEndAtom, connAtom, connAtoms, i, i0, i1, i2, j, maxBond, qualifiedConnAtoms;
    if (mol.getBondOrder_0(bond) != 1 || mol.isAromaticBond_0(bond) || mol.getBondRingSize_0(bond) == 3)
      return false;
    bondAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    for (i0 = 0; i0 < 2; i0++) {
      bondAtom[i0] = mol.getBondAtom_0(i0, bond);
      if (mol.isMarkedAtom_0(bondAtom[i0]) || mol.getNonHydrogenNeighbourCount_0(bondAtom[i0]) <= 1)
        return false;
    }
    if (carcc.isLinearAtom(mol, bondAtom[0]) || carcc.isLinearAtom(mol, bondAtom[1])) {
      maxBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 1, 15, 1);
      maxBond[0] = bond;
      chainEndAtom = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 2, 0, 2);
      for (i1 = 0; i1 < 2; i1++) {
        if (carcc.isLinearAtom(mol, bondAtom[i1])) {
          chainEndAtom[i1] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
          chainEndAtom[i1][0] = bondAtom[1 - i1];
          chainEndAtom[i1][1] = bondAtom[i1];
          if (!carcc.getFirstNonSPAtom(mol, bondAtom[1 - i1], chainEndAtom[i1], maxBond))
            return false;
        }
      }
      if (jsNotEquals(maxBond, null) && bond != maxBond[0])
        return false;
      for (i2 = 0; i2 < 2; i2++)
        if (jsNotEquals(chainEndAtom[i2], null))
          bondAtom[i2] = chainEndAtom[i2][1];
    }
    for (i = 0; i < 2; i++) {
      connAtoms = mol.getConnAtoms_0(bondAtom[i]);
      if (connAtoms == 1)
        return false;
      qualifiedConnAtoms = 0;
      for (j = 0; j < connAtoms; j++) {
        connAtom = mol.getConnAtom_0(bondAtom[i], j);
        if (!mol.isMarkedAtom_0(connAtom))
          qualifiedConnAtoms++;
      }
      if (qualifiedConnAtoms < 2)
        return false;
    }
    return true;
  };
  defineClass(275, 1, { 1: 1 }, carcc.TorsionDescriptorHelper, carcc.TorsionDescriptorHelper_0);
  _.$init_66 = function $init_66() {
  };
  _.chooseSequenceEndAtom = function chooseSequenceEndAtom(rootAtom, rearAtom, halfSymmetry) {
    var connAtom, i, maxRank, maxRankAtom;
    if (halfSymmetry == 1 && !this.isFlatAtom(rootAtom)) {
      if (this.mMol.getConnAtoms_0(rootAtom) == 3)
        return -1;
      if (this.mMol.getConnAtoms_0(rootAtom) == 3) {
        connAtom = this.getTerminalAtoms(rootAtom, rearAtom);
        if (this.mMol.getSymmetryRank_0(connAtom[0]) == this.mMol.getSymmetryRank_0(connAtom[1]))
          return connAtom[2];
        if (this.mMol.getSymmetryRank_0(connAtom[0]) == this.mMol.getSymmetryRank_0(connAtom[2]))
          return connAtom[1];
        else
          return connAtom[0];
      }
    }
    maxRank = -1;
    maxRankAtom = -1;
    for (i = 0; i < this.mMol.getConnAtoms_0(rootAtom); i++) {
      connAtom = this.mMol.getConnAtom_0(rootAtom, i);
      if (connAtom != rearAtom && maxRank < this.mMol.getSymmetryRank_0(connAtom)) {
        maxRank = this.mMol.getSymmetryRank_0(connAtom);
        maxRankAtom = connAtom;
      }
    }
    return maxRankAtom;
  };
  _.findAtomSequences = function findAtomSequences() {
    var atom, halfSymmetry1, halfSymmetry2, i, j;
    this.mAtomSequence = initMultidimensionalArray(cggl.I_classLit, [{ 25: 1, 4: 1, 1: 1, 7: 1 }, { 6: 1, 4: 1, 1: 1 }], [6, 5], 15, [this.mRotatableBond.length, 4], 2);
    this.mRearAtom = initMultidimensionalArray(cggl.I_classLit, [{ 25: 1, 4: 1, 1: 1, 7: 1 }, { 6: 1, 4: 1, 1: 1 }], [6, 5], 15, [this.mRotatableBond.length, 2], 2);
    this.mSymmetryClass = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRotatableBond.length, 15, 1);
    atom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    for (i = 0; i < this.mRotatableBond.length; i++) {
      for (j = 0; j < 2; j++) {
        atom[0] = this.mMol.getBondAtom_0(1 - j, this.mRotatableBond[i]);
        atom[1] = this.mMol.getBondAtom_0(j, this.mRotatableBond[i]);
        if (carcc.isLinearAtom(this.mMol, atom[1]))
          carcc.getFirstNonSPAtom(this.mMol, atom[0], atom, null);
        this.mAtomSequence[i][1 + j] = atom[1];
        this.mRearAtom[i][j] = atom[0];
      }
      halfSymmetry1 = this.getHalfSymmetry(this.mAtomSequence[i][1], this.mRearAtom[i][0]);
      halfSymmetry2 = this.getHalfSymmetry(this.mAtomSequence[i][2], this.mRearAtom[i][1]);
      this.mSymmetryClass[i] = carcc.SYMMETRY[halfSymmetry1][halfSymmetry2];
      this.mAtomSequence[i][0] = this.chooseSequenceEndAtom(this.mAtomSequence[i][1], this.mRearAtom[i][0], halfSymmetry1);
      this.mAtomSequence[i][3] = this.chooseSequenceEndAtom(this.mAtomSequence[i][2], this.mRearAtom[i][1], halfSymmetry2);
    }
  };
  _.getHalfSymmetry = function getHalfSymmetry(atom, rearAtom) {
    var connAtom;
    if (this.mMol.getConnAtoms_0(atom) == 2)
      return 1;
    connAtom = this.getTerminalAtoms(atom, rearAtom);
    if (this.mMol.getConnAtoms_0(atom) == 3) {
      if (this.mMol.getSymmetryRank_0(connAtom[0]) == this.mMol.getSymmetryRank_0(connAtom[1]))
        return this.isFlatAtom(atom) ? 2 : 1;
      else
        return this.isFlatAtom(atom) ? 1 : 0;
    }
    if (this.mMol.getConnAtoms_0(atom) == 4) {
      if (this.mMol.getSymmetryRank_0(connAtom[0]) == this.mMol.getSymmetryRank_0(connAtom[1]) && this.mMol.getSymmetryRank_0(connAtom[0]) == this.mMol.getSymmetryRank_0(connAtom[2]))
        return 3;
      if (this.mMol.getSymmetryRank_0(connAtom[0]) == this.mMol.getSymmetryRank_0(connAtom[1]) || this.mMol.getSymmetryRank_0(connAtom[0]) == this.mMol.getSymmetryRank_0(connAtom[2]) || this.mMol.getSymmetryRank_0(connAtom[1]) == this.mMol.getSymmetryRank_0(connAtom[2]))
        return 1;
    }
    return 0;
  };
  _.getTerminalAtoms = function getTerminalAtoms(atom, rearAtom) {
    var connAtom, i, index_0;
    index_0 = 0;
    connAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getConnAtoms_0(atom) - 1, 15, 1);
    for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++)
      if (this.mMol.getConnAtom_0(atom, i) != rearAtom)
        connAtom[index_0++] = this.mMol.getConnAtom_0(atom, i);
    return connAtom;
  };
  _.getTorsionDescriptor = function getTorsionDescriptor(conformer) {
    var i, maxTorsion, torsion;
    torsion = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, this.mRotatableBond.length, 15, 1);
    maxTorsion = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, this.mRotatableBond.length, 15, 1);
    for (i = 0; i < this.mRotatableBond.length; i++) {
      torsion[i] = carcc.getNormalizedTorsion(carcc.calculateTorsionExtended_0(conformer, this.mAtomSequence[i]), this.mSymmetryClass[i]);
      maxTorsion[i] = carcc.SYMMETRY_REDUNDANCY_ANGLE[this.mSymmetryClass[i]];
    }
    return new carcc.TorsionDescriptor(torsion, maxTorsion);
  };
  _.isFlatAtom = function isFlatAtom(atom) {
    if (this.mMol.getAtomPi_0(atom) == 1 && this.mMol.getAtomicNo_0(atom) < 10 || this.mMol.isAromaticAtom_0(atom) || this.mMol.isFlatNitrogen_0(atom))
      return true;
    return false;
  };
  carcc.HALF_SYMMETRY_C1 = 0;
  carcc.HALF_SYMMETRY_D1 = 1;
  carcc.HALF_SYMMETRY_D2 = 2;
  carcc.HALF_SYMMETRY_D3 = 3;
  carcc.SYMMETRY_120 = 2;
  carcc.SYMMETRY_180 = 1;
  carcc.SYMMETRY_360 = 0;
  carcc.SYMMETRY_60 = 3;
  cggl.Lcom_actelion_research_chem_conf_TorsionDescriptorHelper_2_classLit = createForClass("com.actelion.research.chem.conf", "TorsionDescriptorHelper", 275, cggl.Ljava_lang_Object_2_classLit);
  carcc.$clinit_TorsionDetail = function $clinit_TorsionDetail() {
    carcc.$clinit_TorsionDetail = emptyMethod;
    jl.$clinit_Object();
    carcc.SYMMETRY_0 = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 2), { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 0, [stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [0, 0, 1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [0, 2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 3, 3])]);
    carcc.FRAGMENT_ATOMS = 8 + 2 * 8;
    carcc.FRAGMENT_BONDS = 13 + 2 * 8;
  };
  carcc.TorsionDetail = function TorsionDetail() {
    carcc.$clinit_TorsionDetail();
    Object_0.call(this);
    this.$init_67();
    this.mFragment = new carc2.StereoMolecule_0(24, 29);
    this.mToMoleculeAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 24, 15, 1);
    this.mCentralAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    this.mRearAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    this.mRefAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
  };
  defineClass(220, 1, { 1: 1 }, carcc.TorsionDetail);
  _.$init_67 = function $init_67() {
  };
  _.classify = function classify(mol, bond) {
    var atom, atomMask, bondInFragment, connAtom, connBond, delocalizedBondFound, esrType1, esrType2, esrTypeChanged, fatom1, fatom2, fconn1, fconn2, feature, fragBond, fragmentAtom, halfSymmetry1, halfSymmetry2, hasZ, i, i0, i1, i2, i3, i4, idcode, isInverted, isSmallRingBond, j, nonHNeighbours, preferredBond, rank1, rank2, ratom1, ratom2, ringNo, ringSet, ringSize, symmetryID, symmetryType, temp;
    this.mFragment.clear_0();
    this.mID = null;
    mol.ensureHelperArrays_0(63);
    if (mol.getBondOrder_0(bond) != 1 || mol.isAromaticBond_0(bond))
      return false;
    if (mol.getAtomicNo_0(mol.getBondAtom_0(0, bond)) == 1 || mol.getAtomicNo_0(mol.getBondAtom_0(1, bond)) == 1)
      return false;
    isSmallRingBond = mol.isSmallRingBond_0(bond);
    if (isSmallRingBond && mol.getBondRingSize_0(bond) < 6)
      return false;
    atomMask = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 16, 1);
    this.mAlkyneAtomCount = 0;
    for (i0 = 0; i0 < 2; i0++) {
      this.mCentralAtom[i0] = mol.getBondAtom_0(i0, bond);
      this.mRearAtom[i0] = mol.getBondAtom_0(1 - i0, bond);
      while (mol.getAtomPi_0(this.mCentralAtom[i0]) == 2 && mol.getNonHydrogenNeighbourCount_0(this.mCentralAtom[i0]) == 2 && mol.getAtomicNo_0(this.mCentralAtom[i0]) < 10) {
        for (j = 0; j < mol.getConnAtoms_0(this.mCentralAtom[i0]); j++) {
          connAtom = mol.getConnAtom_0(this.mCentralAtom[i0], j);
          if (connAtom != this.mRearAtom[i0] && mol.getAtomicNo_0(connAtom) != 1) {
            if (mol.getConnAtoms_0(connAtom) == 1 || this.mAlkyneAtomCount == 2 * 8)
              return false;
            atomMask[this.mCentralAtom[i0]] = true;
            this.mRearAtom[i0] = this.mCentralAtom[i0];
            this.mCentralAtom[i0] = connAtom;
            this.mAlkyneAtomCount++;
            break;
          }
        }
      }
      nonHNeighbours = mol.getNonHydrogenNeighbourCount_0(this.mCentralAtom[i0]);
      if (nonHNeighbours > 4 || nonHNeighbours == 1)
        return false;
      atomMask[this.mCentralAtom[i0]] = true;
    }
    for (i1 = 0; i1 < 2; i1++) {
      for (j = 0; j < mol.getConnAtoms_0(this.mCentralAtom[i1]); j++) {
        connAtom = mol.getConnAtom_0(this.mCentralAtom[i1], j);
        if (mol.getAtomicNo_0(connAtom) != 1)
          atomMask[connAtom] = true;
      }
    }
    this.mToFragmentAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 15, 1);
    mol.copyMoleculeByAtoms_0(this.mFragment, atomMask, true, this.mToFragmentAtom);
    for (i2 = 0; i2 < this.mToFragmentAtom.length; i2++)
      if (this.mToFragmentAtom[i2] != -1)
        this.mToMoleculeAtom[this.mToFragmentAtom[i2]] = i2;
    this.mFragment.setFragment_0(true);
    if (isSmallRingBond) {
      bondInFragment = this.mFragment.getBond_0(this.mToFragmentAtom[this.mCentralAtom[0]], this.mToFragmentAtom[this.mCentralAtom[1]]);
      if (bondInFragment != -1) {
        this.mFragment.setBondQueryFeature_0(bondInFragment, 256, true);
        ringSet = mol.getRingSet_0();
        for (ringNo = 0; ringNo < ringSet.getSize_0(); ringNo++) {
          if (ringSet.isBondMember_0(ringNo, bond)) {
            for (i3 = 0; i3 < 2; i3++) {
              for (j = 0; j < mol.getConnAtoms_0(this.mCentralAtom[i3]); j++) {
                connAtom = mol.getConnAtom_0(this.mCentralAtom[i3], j);
                if (connAtom != this.mRearAtom[i3]) {
                  if (ringSet.isAtomMember_0(ringNo, connAtom) && mol.getAtomicNo_0(connAtom) != 1) {
                    this.mFragment.setBondQueryFeature_0(this.mFragment.getBond_0(this.mToFragmentAtom[this.mCentralAtom[i3]], this.mToFragmentAtom[connAtom]), 256, true);
                    break;
                  }
                }
              }
            }
          }
        }
      }
    }
    for (i4 = 0; i4 < 2; i4++) {
      if (mol.isFlatNitrogen_0(this.mCentralAtom[i4]))
        this.mFragment.setAtomQueryFeature_0(this.mToFragmentAtom[this.mCentralAtom[i4]], 268435456, true);
      delocalizedBondFound = false;
      for (j = 0; j < mol.getConnAtoms_0(this.mCentralAtom[i4]); j++) {
        connAtom = mol.getConnAtom_0(this.mCentralAtom[i4], j);
        if (connAtom != this.mRearAtom[i4] && mol.getAtomicNo_0(connAtom) != 1) {
          fragBond = this.mFragment.getBond_0(this.mToFragmentAtom[this.mCentralAtom[i4]], this.mToFragmentAtom[connAtom]);
          if (this.mFragment.getBondType_0(fragBond) == 8) {
            delocalizedBondFound = true;
          } else if (mol.getAtomicNo_0(connAtom) == 6 && !mol.isAromaticAtom_0(this.mCentralAtom[i4])) {
            feature = mol.isAromaticAtom_0(connAtom) ? 2 : 4;
            this.mFragment.setAtomQueryFeature_0(this.mToFragmentAtom[connAtom], feature, true);
          }
          connBond = mol.getConnBond_0(this.mCentralAtom[i4], j);
          ringSize = mol.getBondRingSize_0(connBond);
          if (ringSize == 3 || ringSize == 4)
            this.mFragment.setBondQueryFeature_0(fragBond, ringSize << 17, true);
          if (mol.isAromaticBond_0(connBond) || mol.getConnBondOrder_0(this.mCentralAtom[i4], j) == 2) {
            nonHNeighbours = mol.getNonHydrogenNeighbourCount_0(connAtom);
            hasZ = nonHNeighbours == 3;
            if (!hasZ && nonHNeighbours == 2 && !mol.isRingAtom_0(connAtom))
              hasZ = mol.getZNeighbour_0(this.mCentralAtom[1 - i4], connBond) != -1;
            if (hasZ) {
              feature = and_0(4063232, not_0(1048576));
              this.mFragment.setAtomQueryFeature_0(this.mToFragmentAtom[connAtom], feature, true);
            } else if (mol.isAromaticBond_0(connBond)) {
              feature = and_0(4063232, not_0(524288));
              this.mFragment.setAtomQueryFeature_0(this.mToFragmentAtom[connAtom], feature, true);
            }
          }
          if (mol.getConnBondOrder_0(this.mCentralAtom[i4], j) == 1) {
            if (mol.getNonHydrogenNeighbourCount_0(connAtom) == 4) {
              feature = and_0(4063232, not_0(2097152));
              this.mFragment.setAtomQueryFeature_0(this.mToFragmentAtom[connAtom], feature, true);
            } else if (mol.getAtomicNo_0(connAtom) == 6) {
              this.mFragment.setAtomQueryFeature_0(this.mToFragmentAtom[connAtom], 2097152, true);
            }
          }
        }
      }
      if (!delocalizedBondFound) {
        if (mol.isAromaticAtom_0(this.mCentralAtom[i4]))
          this.mFragment.setAtomQueryFeature_0(this.mToFragmentAtom[this.mCentralAtom[i4]], 2, true);
        else
          this.mFragment.setAtomQueryFeature_0(this.mToFragmentAtom[this.mCentralAtom[i4]], 4, true);
      }
    }
    this.mFragment.ensureHelperArrays_0(63 | 128);
    for (i = 0; i < 2; i++) {
      fragmentAtom = this.mToFragmentAtom[this.mCentralAtom[i]];
      if (this.mFragment.getAtomParity_0(fragmentAtom) == 3) {
        if (mol.getAtomParity_0(this.mCentralAtom[i]) == 3) {
          return false;
        } else {
          preferredBond = this.mFragment.getAtomPreferredStereoBond_0(fragmentAtom);
          this.mFragment.setBondType_0(preferredBond, 257);
          if (this.mFragment.getBondAtom_0(0, preferredBond) != fragmentAtom) {
            this.mFragment.setBondAtom_0(1, preferredBond, this.mFragment.getBondAtom_0(0, preferredBond));
            this.mFragment.setBondAtom_0(0, preferredBond, fragmentAtom);
          }
          this.mFragment.ensureHelperArrays_0(63 | 128);
        }
      }
    }
    fatom1 = this.mToFragmentAtom[this.mCentralAtom[0]];
    fatom2 = this.mToFragmentAtom[this.mCentralAtom[1]];
    ratom1 = this.mToFragmentAtom[this.mRearAtom[0]];
    ratom2 = this.mToFragmentAtom[this.mRearAtom[1]];
    esrType1 = this.mFragment.getAtomESRType_0(fatom1);
    esrType2 = this.mFragment.getAtomESRType_0(fatom2);
    if (this.mFragment.isAtomStereoCenter_0(fatom1) && this.mFragment.isAtomStereoCenter_0(fatom2)) {
      if ((esrType1 != 0 || esrType2 != 0) && (esrType1 != esrType2 || this.mFragment.getAtomESRGroup_0(fatom1) != this.mFragment.getAtomESRGroup_0(fatom2)))
        return false;
    }
    esrTypeChanged = false;
    if (this.mFragment.isAtomStereoCenter_0(fatom1) && esrType1 != 0) {
      this.mFragment.setAtomESR_0(fatom1, 0, -1);
      esrTypeChanged = true;
    }
    if (this.mFragment.isAtomStereoCenter_0(fatom2) && esrType2 != 0) {
      this.mFragment.setAtomESR_0(fatom2, 0, -1);
      esrTypeChanged = true;
    }
    if (esrTypeChanged)
      this.mFragment.ensureHelperArrays_0(63 | 128);
    rank1 = this.mFragment.getSymmetryRank_0(fatom1);
    rank2 = this.mFragment.getSymmetryRank_0(fatom2);
    if (rank1 < rank2) {
      temp = this.mCentralAtom[0];
      this.mCentralAtom[0] = this.mCentralAtom[1];
      this.mCentralAtom[1] = temp;
      temp = this.mRearAtom[0];
      this.mRearAtom[0] = this.mRearAtom[1];
      this.mRearAtom[1] = temp;
      temp = fatom1;
      fatom1 = fatom2;
      fatom2 = temp;
      temp = ratom1;
      ratom1 = ratom2;
      ratom2 = temp;
    }
    isInverted = false;
    if (this.mFragment.isAtomStereoCenter_0(fatom1) || this.mFragment.isAtomStereoCenter_0(fatom2)) {
      if (this.mFragment.isAtomStereoCenter_0(fatom1)) {
        isInverted = this.mFragment.getAbsoluteAtomParity_0(fatom1) == 1;
      } else if (this.mFragment.isAtomStereoCenter_0(fatom2)) {
        isInverted = this.mFragment.getAbsoluteAtomParity_0(fatom2) == 1;
      }
      if (isInverted) {
        for (atom = 0; atom < this.mFragment.getAllAtoms_0(); atom++)
          this.mFragment.setAtomX_0(atom, -this.mFragment.getAtomX_0(atom));
        this.mFragment.ensureHelperArrays_0(63 | 128);
      }
    }
    fconn1 = this.getReferenceNeighbor(fatom1, ratom1);
    fconn2 = this.getReferenceNeighbor(fatom2, ratom2);
    this.mRefAtom[0] = fconn1 == -1 ? -1 : this.mToMoleculeAtom[fconn1];
    this.mRefAtom[1] = fconn2 == -1 ? -1 : this.mToMoleculeAtom[fconn2];
    idcode = this.mFragment.getIDCode_0();
    if (jsEquals(idcode, null))
      return false;
    halfSymmetry1 = this.getHalfSymmetry_0(fatom1, ratom1);
    halfSymmetry2 = this.getHalfSymmetry_0(fatom2, ratom2);
    if (halfSymmetry1 == 0 && halfSymmetry2 == 0 && (this.mFragment.getChirality_0() & ~65535) == 131072)
      symmetryType = 2;
    else
      symmetryType = carcc.SYMMETRY_0[halfSymmetry1][halfSymmetry2];
    symmetryID = symmetryType == 0 ? isInverted ? "<" : ">" : symmetryType == 1 ? isInverted ? "-" : "+" : symmetryType == 3 ? "=" : "";
    this.mID = idcode + ("" + symmetryID);
    return true;
  };
  _.getCentralAtom = function getCentralAtom(no) {
    return this.mCentralAtom[no];
  };
  _.getFragment = function getFragment() {
    return this.mFragment;
  };
  _.getHalfSymmetry_0 = function getHalfSymmetry_0(atom, rearAtom) {
    var connAtom, i, j, rank;
    if (this.mFragment.getConnAtoms_0(atom) == 2)
      return 1;
    connAtom = this.getTerminalAtoms_0(atom, rearAtom);
    if (this.mFragment.getConnAtoms_0(atom) == 3) {
      if (this.mFragment.getSymmetryRank_0(connAtom[0]) == this.mFragment.getSymmetryRank_0(connAtom[1]))
        return this.isFlatAtom_0(atom) ? 2 : 1;
      else
        return this.isFlatAtom_0(atom) ? 1 : 0;
    }
    if (this.mFragment.getConnAtoms_0(atom) == 4) {
      for (i = 0; i < connAtom.length; i++) {
        rank = this.mFragment.getSymmetryRank_0(connAtom[i]);
        for (j = i + 1; j < connAtom.length; j++)
          if (rank == this.mFragment.getSymmetryRank_0(connAtom[j]))
            return 1;
      }
    }
    return 0;
  };
  _.getID = function getID() {
    return this.mID;
  };
  _.getRearAtom = function getRearAtom(no) {
    return this.mRearAtom[no];
  };
  _.getReferenceAtom = function getReferenceAtom(no) {
    return this.mRefAtom[no];
  };
  _.getReferenceNeighbor = function getReferenceNeighbor(atom, remoteBondAtom) {
    var candidate, conn, connHandled, connRank, equalRankFound, i, j, maxConn, maxRank, symConn;
    maxConn = -1;
    maxRank = -1;
    symConn = -1;
    connHandled = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mFragment.getConnAtoms_0(atom), 16, 1);
    for (i = 0; i < this.mFragment.getConnAtoms_0(atom); i++) {
      if (!connHandled[i]) {
        conn = this.mFragment.getConnAtom_0(atom, i);
        if (conn != remoteBondAtom) {
          connRank = this.mFragment.getSymmetryRank_0(conn);
          if (maxRank < connRank) {
            equalRankFound = false;
            for (j = i + 1; j < this.mFragment.getConnAtoms_0(atom); j++) {
              candidate = this.mFragment.getConnAtom_0(atom, j);
              if (candidate != remoteBondAtom && this.mFragment.getSymmetryRank_0(candidate) == connRank) {
                connHandled[j] = true;
                if (equalRankFound)
                  return conn;
                equalRankFound = true;
              }
            }
            if (!equalRankFound) {
              maxRank = connRank;
              maxConn = conn;
            } else {
              symConn = conn;
            }
          }
        }
      }
    }
    if (maxConn == -1) {
      if (this.isFlatAtom_0(atom))
        return symConn;
    }
    return maxConn;
  };
  _.getTerminalAtoms_0 = function getTerminalAtoms_0(atom, rearAtom) {
    var connAtom, i, index_0;
    index_0 = 0;
    connAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mFragment.getConnAtoms_0(atom) - 1, 15, 1);
    for (i = 0; i < this.mFragment.getConnAtoms_0(atom); i++)
      if (this.mFragment.getConnAtom_0(atom, i) != rearAtom)
        connAtom[index_0++] = this.mFragment.getConnAtom_0(atom, i);
    return connAtom;
  };
  _.isFlatAtom_0 = function isFlatAtom_0(atom) {
    return this.mFragment.getAtomPi_0(atom) == 1 && this.mFragment.getAtomicNo_0(atom) < 10 || this.mFragment.isAromaticAtom_0(atom) || this.mFragment.isFlatNitrogen_0(atom);
  };
  _.mAlkyneAtomCount = 0;
  carcc.FRAGMENT_ATOMS = 0;
  carcc.FRAGMENT_BONDS = 0;
  carcc.HALF_SYMMETRY_C1_0 = 0;
  carcc.HALF_SYMMETRY_D1_0 = 1;
  carcc.HALF_SYMMETRY_D2_0 = 2;
  carcc.MAX_TRIPLE_BONDS = 8;
  carcc.SYMMETRY_C1C1_OR_C1D1 = 0;
  carcc.SYMMETRY_C1D2 = 1;
  carcc.SYMMETRY_D1D1 = 2;
  carcc.SYMMETRY_D1D2_OR_D2D2 = 3;
  cggl.Lcom_actelion_research_chem_conf_TorsionDetail_2_classLit = createForClass("com.actelion.research.chem.conf", "TorsionDetail", 220, cggl.Ljava_lang_Object_2_classLit);
  carcc.$clinit_TorsionInfo = function $clinit_TorsionInfo() {
    carcc.$clinit_TorsionInfo = emptyMethod;
    jl.$clinit_Object();
  };
  carcc.TorsionInfo = function TorsionInfo(symmetryClass) {
    carcc.$clinit_TorsionInfo();
    Object_0.call(this);
    this.$init_68();
    this.symmetryClass = symmetryClass;
  };
  carcc.TorsionInfo_0 = function TorsionInfo_0(ti) {
    carcc.$clinit_TorsionInfo();
    var i;
    Object_0.call(this);
    this.$init_68();
    this.symmetryClass = ti.symmetryClass;
    if (jsNotEquals(ti.angle, null)) {
      this.angle = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, ti.angle.length, 15, 1);
      for (i = 0; i < this.angle.length; i++)
        this.angle[i] = narrow_short(360 - ti.angle[this.angle.length - i - 1]);
    }
    if (jsNotEquals(ti.range, null)) {
      this.range = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [ti.range.length, 2], 2);
      for (i = 0; i < this.range.length; i++) {
        this.range[i][0] = narrow_short(360 - ti.range[this.angle.length - i - 1][1]);
        this.range[i][1] = narrow_short(360 - ti.range[this.angle.length - i - 1][0]);
      }
    }
    if (jsNotEquals(ti.frequency, null)) {
      this.frequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, ti.frequency.length, 15, 1);
      for (i = 0; i < this.frequency.length; i++)
        this.frequency[i] = ti.frequency[this.frequency.length - i - 1];
    }
    if (jsNotEquals(ti.binSize, null)) {
      this.binSize = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, ti.binSize.length, 15, 1);
      for (i = 0; i < this.binSize.length; i++)
        this.binSize[i] = ti.binSize[this.binSize.length - i - 1];
    }
  };
  defineClass(125, 1, { 125: 1, 1: 1 }, carcc.TorsionInfo, carcc.TorsionInfo_0);
  _.$init_68 = function $init_68() {
  };
  _.get360DegreeAngles = function get360DegreeAngles() {
    var fullAngle, i, i0, i1, i2, i3, i4, i5, length_0;
    fullAngle = null;
    switch (this.symmetryClass) {
      case 1:
        fullAngle = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 2 * this.angle.length, 15, 1);
        for (i0 = 0; i0 < this.angle.length; i0++) {
          fullAngle[i0] = this.angle[i0];
          fullAngle[this.angle.length + i0] = narrow_short(180 + this.angle[i0]);
        }
        return fullAngle;
      case 2:
        i1 = this.angle[0] == 0 ? 1 : 0;
        i2 = this.angle[this.angle.length - 1] == 180 ? this.angle.length - 1 : this.angle.length;
        length_0 = i2 - i1;
        fullAngle = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, this.angle.length + length_0, 15, 1);
        for (i3 = 0; i3 < this.angle.length; i3++)
          fullAngle[i3] = this.angle[i3];
        for (i4 = i1; i4 < i2; i4++)
          fullAngle[fullAngle.length - 1 - i4 + i1] = narrow_short(360 - this.angle[i4]);
        return fullAngle;
      case 3:
        i1 = this.angle[0] == 0 ? 1 : 0;
        i2 = this.angle[this.angle.length - 1] == 90 ? this.angle.length - 1 : this.angle.length;
        length_0 = i2 - i1;
        fullAngle = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 2 * this.angle.length + 2 * length_0, 15, 1);
        for (i5 = 0; i5 < this.angle.length; i5++) {
          fullAngle[i5] = this.angle[i5];
          fullAngle[this.angle.length + length_0 + i5] = narrow_short(180 + this.angle[i5]);
        }
        for (i = i1; i < i2; i++) {
          fullAngle[this.angle.length + length_0 - 1 - i + i1] = narrow_short(180 - this.angle[i]);
          fullAngle[fullAngle.length - 1 - i + i1] = narrow_short(360 - this.angle[i]);
        }
        return fullAngle;
      default:
        return this.angle;
    }
  };
  _.get360DegreeFrequencies = function get360DegreeFrequencies() {
    var fullFrequency, i, i0, i1, i2, i3, i4, i5, length_0, size_0;
    fullFrequency = null;
    size_0 = this.frequency.length;
    switch (this.symmetryClass) {
      case 1:
        fullFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 2 * size_0, 15, 1);
        for (i0 = 0; i0 < size_0; i0++) {
          fullFrequency[i0] = this.frequency[i0];
          fullFrequency[size_0 + i0] = this.frequency[i0];
        }
        return fullFrequency;
      case 2:
        i1 = this.angle[0] == 0 ? 1 : 0;
        i2 = this.angle[size_0 - 1] == 180 ? size_0 - 1 : size_0;
        length_0 = i2 - i1;
        fullFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, size_0 + length_0, 15, 1);
        for (i3 = 0; i3 < size_0; i3++)
          fullFrequency[i3] = this.frequency[i3];
        for (i4 = i1; i4 < i2; i4++)
          fullFrequency[fullFrequency.length - 1 - i4 + i1] = this.frequency[i4];
        return fullFrequency;
      case 3:
        i1 = this.angle[0] == 0 ? 1 : 0;
        i2 = this.angle[size_0 - 1] == 90 ? size_0 - 1 : size_0;
        length_0 = i2 - i1;
        fullFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 2 * size_0 + 2 * length_0, 15, 1);
        for (i5 = 0; i5 < size_0; i5++) {
          fullFrequency[i5] = this.frequency[i5];
          fullFrequency[size_0 + length_0 + i5] = this.frequency[i5];
        }
        for (i = i1; i < i2; i++) {
          fullFrequency[size_0 + length_0 - 1 - i + i1] = this.frequency[i];
          fullFrequency[fullFrequency.length - 1 - i + i1] = this.frequency[i];
        }
        return fullFrequency;
      default:
        return this.frequency;
    }
  };
  _.get360DegreeRanges = function get360DegreeRanges() {
    var fullRange, i, i0, i1, i2, i3, i4, i5, length_0, size_0;
    fullRange = null;
    size_0 = this.range.length;
    switch (this.symmetryClass) {
      case 1:
        fullRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [2 * size_0, 2], 2);
        for (i0 = 0; i0 < size_0; i0++) {
          fullRange[i0][0] = this.range[i0][0];
          fullRange[i0][1] = this.range[i0][1];
          fullRange[size_0 + i0][0] = narrow_short(180 + this.range[i0][0]);
          fullRange[size_0 + i0][1] = narrow_short(180 + this.range[i0][1]);
        }
        return fullRange;
      case 2:
        i1 = this.angle[0] == 0 ? 1 : 0;
        i2 = this.angle[size_0 - 1] == 180 ? size_0 - 1 : size_0;
        length_0 = i2 - i1;
        fullRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [size_0 + length_0, 2], 2);
        for (i3 = 0; i3 < size_0; i3++) {
          fullRange[i3][0] = this.range[i3][0];
          fullRange[i3][1] = this.range[i3][1];
        }
        for (i4 = i1; i4 < i2; i4++) {
          fullRange[fullRange.length - 1 - i4 + i1][0] = narrow_short(360 - this.range[i4][1]);
          fullRange[fullRange.length - 1 - i4 + i1][1] = narrow_short(360 - this.range[i4][0]);
        }
        return fullRange;
      case 3:
        i1 = this.angle[0] == 0 ? 1 : 0;
        i2 = this.angle[size_0 - 1] == 90 ? size_0 - 1 : size_0;
        length_0 = i2 - i1;
        fullRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [2 * size_0 + 2 * length_0, 2], 2);
        for (i5 = 0; i5 < size_0; i5++) {
          fullRange[i5][0] = this.range[i5][0];
          fullRange[i5][1] = this.range[i5][1];
          fullRange[size_0 + length_0 + i5][0] = narrow_short(180 + this.range[i5][0]);
          fullRange[size_0 + length_0 + i5][1] = narrow_short(180 + this.range[i5][1]);
        }
        for (i = i1; i < i2; i++) {
          fullRange[size_0 + length_0 - 1 - i + i1][0] = narrow_short(180 - this.range[i][1]);
          fullRange[size_0 + length_0 - 1 - i + i1][1] = narrow_short(180 - this.range[i][0]);
          fullRange[fullRange.length - 1 - i + i1][0] = narrow_short(360 - this.range[i][1]);
          fullRange[fullRange.length - 1 - i + i1][1] = narrow_short(360 - this.range[i][0]);
        }
        return fullRange;
      default:
        return this.range;
    }
  };
  _.mergeAngles = function mergeAngles(mergedAngle, iTarget, iDelete, range1, range2) {
    var i, iNew, newAngle, newFrequency, newRange, newSize;
    this.angle[iTarget] = narrow_short(mergedAngle);
    this.frequency[iTarget] = narrow_short(this.frequency[iTarget] + this.frequency[iDelete]);
    this.range[iTarget][0] = narrow_short(range1);
    this.range[iTarget][1] = narrow_short(range2);
    newSize = this.angle.length - 1;
    newAngle = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, newSize, 15, 1);
    newFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, newSize, 15, 1);
    newRange = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 7: 1, 40: 1 }, 13, newSize, 0, 2);
    iNew = 0;
    for (i = 0; i < this.angle.length; i++) {
      if (i != iDelete) {
        newAngle[iNew] = this.angle[i];
        newFrequency[iNew] = this.frequency[i];
        newRange[iNew] = this.range[i];
        iNew++;
      }
    }
    this.angle = newAngle;
    this.frequency = newFrequency;
    this.range = newRange;
  };
  _.mergeTorsions_0 = function mergeTorsions_0(mergeSpan) {
    var additionalFrequency, angle1, angle2, i, i1, i10, i2, i20, mergedAngle, minAngleDif, minIndex, startIndex;
    additionalFrequency = 0;
    while (this.angle.length != 0) {
      if (this.angle.length == 1) {
        if (this.symmetryClass == 1 || this.symmetryClass == 0)
          break;
        else if (this.symmetryClass == 2 && (this.angle[0] == 0 || this.angle[0] == 180))
          break;
        else if (this.symmetryClass == 3 && (this.angle[0] == 0 || this.angle[0] == 90))
          break;
      }
      startIndex = this.angle[0] != 0 && (this.symmetryClass == 2 || this.symmetryClass == 3) ? -1 : 0;
      minIndex = -1;
      minAngleDif = 2147483647;
      for (i10 = startIndex; i10 < this.angle.length; i10++) {
        i20 = i10 + 1;
        angle1 = i10 >= 0 ? this.angle[i10] : -this.angle[0];
        angle2 = i20 < this.angle.length ? this.angle[i20] : this.symmetryClass == 1 ? this.angle[0] + 180 : this.symmetryClass == 2 ? 360 - this.angle[this.angle[i10] == 180 ? i10 - 1 : i10] : this.symmetryClass == 3 ? 180 - this.angle[this.angle[i10] == 90 ? i10 - 1 : i10] : this.angle[0] + 360;
        if (minAngleDif > angle2 - angle1) {
          minAngleDif = angle2 - angle1;
          minIndex = i10;
        }
      }
      if (minAngleDif > mergeSpan)
        break;
      i1 = minIndex;
      i2 = i1 + 1;
      if (i1 == -1) {
        additionalFrequency += this.frequency[0];
        this.angle[0] = 0;
        this.frequency[0] = narrow_short(this.frequency[0] * 2);
        this.range[0][0] = -this.range[0][1];
      } else if (i2 < this.angle.length) {
        mergedAngle = this.mergedAngle(i1, i2, this.angle[i2]);
        this.mergeAngles(mergedAngle, i1, i2, this.range[i1][0], this.range[i2][1]);
      } else if (this.symmetryClass == 1) {
        i2 = 0;
        mergedAngle = this.mergedAngle(i1, i2, this.angle[i2] + 180);
        if (mergedAngle <= 180)
          this.mergeAngles(mergedAngle, i1, i2, this.range[i1][0], this.range[i2][1] + 180);
        else
          this.mergeAngles(mergedAngle - 180, i2, i1, this.range[i2][0], this.range[i1][1] - 180);
      } else if (this.symmetryClass == 2) {
        i2 = this.angle[i1] == 180 ? i1 - 1 : i1;
        if (this.angle[i1] < 180) {
          additionalFrequency += this.frequency[i1];
          this.angle[i1] = 180;
          this.frequency[i1] = narrow_short(this.frequency[i1] * 2);
          this.range[i1][1] = narrow_short(360 - this.range[i1][0]);
        } else {
          (jl.$clinit_System(), jl.out_0).println_0("WARNING: TorsionDB - Should have caught the symmetrical situation one peak earlier.");
          mergedAngle = this.mergedAngle(i1, i2, this.angle[i2]);
          this.mergeAngles(mergedAngle, i2, i1, this.range[i2][0], this.range[i1][1]);
        }
      } else if (this.symmetryClass == 3) {
        i2 = this.angle[i1] == 90 ? i1 - 1 : i1;
        if (this.angle[i1] < 90) {
          additionalFrequency += this.frequency[i1];
          this.angle[i1] = 90;
          this.frequency[i1] = narrow_short(this.frequency[i1] * 2);
          this.range[i1][1] = narrow_short(180 - this.range[i1][0]);
        } else {
          (jl.$clinit_System(), jl.out_0).println_0("WARNING: TorsionDB - Should have caught the symmetrical situation one peak earlier.");
          mergedAngle = this.mergedAngle(i1, i2, this.angle[i2]);
          this.mergeAngles(mergedAngle, i2, i1, this.range[i2][0], this.range[i1][1]);
        }
      } else {
        i2 = 0;
        mergedAngle = this.mergedAngle(i1, i2, this.angle[i2] + 360);
        if (mergedAngle <= 360)
          this.mergeAngles(mergedAngle, i1, i2, this.range[i1][0], this.range[i2][1] + 360);
        else
          this.mergeAngles(mergedAngle - 360, i2, i1, this.range[i2][0], this.range[i1][1] - 360);
      }
    }
    if (additionalFrequency != 0)
      for (i = 0; i < this.frequency.length; i++)
        this.frequency[i] = narrow_short(jl.round_2(100 * this.frequency[i] / (100 + additionalFrequency)));
  };
  _.mergedAngle = function mergedAngle_0(i1, i2, angle2) {
    return jl.round_2((this.angle[i1] * this.frequency[i1] + angle2 * this.frequency[i2]) / (this.frequency[i1] + this.frequency[i2]));
  };
  _.symmetryClass = 0;
  cggl.Lcom_actelion_research_chem_conf_TorsionInfo_2_classLit = createForClass("com.actelion.research.chem.conf", "TorsionInfo", 125, cggl.Ljava_lang_Object_2_classLit);
  carcc.$clinit_TorsionPrediction = function $clinit_TorsionPrediction() {
    carcc.$clinit_TorsionPrediction = emptyMethod;
    jl.$clinit_Object();
  };
  carcc.TorsionPrediction = function TorsionPrediction(mol, torsionAtom) {
    carcc.$clinit_TorsionPrediction();
    var atom1, atom2, conns1, conns2;
    Object_0.call(this);
    this.$init_69();
    atom1 = torsionAtom[1];
    atom2 = torsionAtom[2];
    conns1 = mol.getConnAtoms_0(atom1) - 1;
    conns2 = mol.getConnAtoms_0(atom2) - 1;
    if (conns1 > 3 || conns2 > 3) {
      this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 4, 15, 1);
      this.mTorsion[0] = 45;
      this.mTorsion[1] = 135;
      this.mTorsion[2] = 225;
      this.mTorsion[2] = 315;
      this.mTorsionRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [4, 2], 2);
      this.mTorsionRange[0][0] = 30;
      this.mTorsionRange[0][1] = 60;
      this.mTorsionRange[1][0] = 120;
      this.mTorsionRange[1][1] = 150;
      this.mTorsionRange[2][0] = 210;
      this.mTorsionRange[2][1] = 240;
      this.mTorsionRange[2][0] = 300;
      this.mTorsionRange[2][1] = 330;
      this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 4, 15, 1);
      this.mFrequency[0] = 25;
      this.mFrequency[1] = 25;
      this.mFrequency[2] = 25;
      this.mFrequency[3] = 25;
    } else if ((mol.getAtomPi_0(atom1) == 0 || mol.getAtomicNo_0(atom1) > 9) && (mol.getAtomPi_0(atom2) == 0 || mol.getAtomicNo_0(atom2) > 9)) {
      if (conns1 == 3 && conns2 == 3 || conns1 == 3 && conns2 == 2 || conns1 == 3 && conns2 == 1 || conns1 == 2 && conns2 == 3 || conns1 == 1 && conns2 == 3 || conns1 == 2 && conns2 == 2 && (torsionAtom[0] != -1 || torsionAtom[3] != -1)) {
        this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 3, 15, 1);
        this.mTorsion[0] = 60;
        this.mTorsion[1] = 180;
        this.mTorsion[2] = 300;
        this.mTorsionRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [3, 2], 2);
        this.mTorsionRange[0][0] = 45;
        this.mTorsionRange[0][1] = 75;
        this.mTorsionRange[1][0] = 165;
        this.mTorsionRange[1][1] = 195;
        this.mTorsionRange[2][0] = 285;
        this.mTorsionRange[2][1] = 315;
        this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 3, 15, 1);
        this.mFrequency[0] = 33;
        this.mFrequency[1] = 33;
        this.mFrequency[2] = 33;
      } else if (conns1 == 1 && conns2 == 2 && torsionAtom[3] == -1 || conns1 == 2 && conns2 == 1 && torsionAtom[0] == -1) {
        this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 3, 15, 1);
        this.mTorsion[0] = 60;
        this.mTorsion[1] = 180;
        this.mTorsion[2] = 300;
        this.mTorsionRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [3, 2], 2);
        this.mTorsionRange[0][0] = 45;
        this.mTorsionRange[0][1] = 75;
        this.mTorsionRange[1][0] = 165;
        this.mTorsionRange[1][1] = 195;
        this.mTorsionRange[2][0] = 285;
        this.mTorsionRange[2][1] = 315;
        this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 3, 15, 1);
        this.mFrequency[0] = 40;
        this.mFrequency[1] = 20;
        this.mFrequency[2] = 40;
      } else if (conns1 == 1 && conns2 == 1 || conns1 == 1 && conns2 == 2 && torsionAtom[3] != -1 || conns1 == 2 && conns2 == 1 && torsionAtom[0] != -1 || conns1 == 2 && conns2 == 2 && torsionAtom[0] == -1 && torsionAtom[3] == -1) {
        this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 3, 15, 1);
        this.mTorsion[0] = 60;
        this.mTorsion[1] = 180;
        this.mTorsion[2] = 300;
        this.mTorsionRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [3, 2], 2);
        this.mTorsionRange[0][0] = 45;
        this.mTorsionRange[0][1] = 75;
        this.mTorsionRange[1][0] = 165;
        this.mTorsionRange[1][1] = 195;
        this.mTorsionRange[2][0] = 285;
        this.mTorsionRange[2][1] = 315;
        this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 3, 15, 1);
        this.mFrequency[0] = 25;
        this.mFrequency[1] = 50;
        this.mFrequency[2] = 25;
      }
    } else if ((mol.getAtomPi_0(atom1) == 0 || mol.getAtomicNo_0(atom1) > 9) && mol.getAtomPi_0(atom2) == 1 || (mol.getAtomPi_0(atom2) == 0 || mol.getAtomicNo_0(atom2) > 9) && mol.getAtomPi_0(atom1) == 1) {
      if (conns1 == 3 || conns2 == 3) {
        this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 6, 15, 1);
        this.mTorsion[0] = 0;
        this.mTorsion[1] = 60;
        this.mTorsion[2] = 120;
        this.mTorsion[3] = 180;
        this.mTorsion[4] = 240;
        this.mTorsion[5] = 300;
        this.mTorsionRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [6, 2], 2);
        this.mTorsionRange[0][0] = -15;
        this.mTorsionRange[0][1] = 15;
        this.mTorsionRange[1][0] = 45;
        this.mTorsionRange[1][1] = 75;
        this.mTorsionRange[2][0] = 105;
        this.mTorsionRange[2][1] = 135;
        this.mTorsionRange[3][0] = 165;
        this.mTorsionRange[3][1] = 195;
        this.mTorsionRange[4][0] = 225;
        this.mTorsionRange[4][1] = 255;
        this.mTorsionRange[5][0] = 285;
        this.mTorsionRange[5][1] = 315;
        this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 6, 15, 1);
        this.mFrequency[0] = 16;
        this.mFrequency[1] = 16;
        this.mFrequency[2] = 16;
        this.mFrequency[3] = 16;
        this.mFrequency[4] = 16;
        this.mFrequency[5] = 16;
      } else if (conns1 == 1 && conns2 == 1) {
        this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 2, 15, 1);
        this.mTorsion[0] = 120;
        this.mTorsion[1] = 240;
        this.mTorsionRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [2, 2], 2);
        this.mTorsionRange[0][0] = 105;
        this.mTorsionRange[0][1] = 135;
        this.mTorsionRange[1][0] = 225;
        this.mTorsionRange[1][1] = 255;
        this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 2, 15, 1);
        this.mFrequency[0] = 50;
        this.mFrequency[1] = 50;
      } else if (mol.getAtomPi_0(atom1) == 1 && conns1 == 2 && conns2 == 1 || mol.getAtomPi_0(atom2) == 1 && conns2 == 2 && conns1 == 1) {
        this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 2, 15, 1);
        this.mTorsion[0] = 90;
        this.mTorsion[1] = 270;
        this.mTorsionRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [2, 2], 2);
        this.mTorsionRange[0][0] = 75;
        this.mTorsionRange[0][1] = 105;
        this.mTorsionRange[1][0] = 255;
        this.mTorsionRange[1][1] = 285;
        this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 2, 15, 1);
        this.mFrequency[0] = 50;
        this.mFrequency[1] = 50;
      } else if (mol.getAtomPi_0(atom1) == 1 && conns1 == 1 && conns2 == 2 && torsionAtom[3] == -1 || mol.getAtomPi_0(atom2) == 1 && conns2 == 1 && conns1 == 2 && torsionAtom[0] == -1) {
        this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 3, 15, 1);
        this.mTorsion[0] = 0;
        this.mTorsion[1] = 120;
        this.mTorsion[2] = 240;
        this.mTorsionRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [3, 2], 2);
        this.mTorsionRange[0][0] = -15;
        this.mTorsionRange[0][1] = 15;
        this.mTorsionRange[1][0] = 105;
        this.mTorsionRange[1][1] = 135;
        this.mTorsionRange[2][0] = 225;
        this.mTorsionRange[2][1] = 255;
        this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 3, 15, 1);
        this.mFrequency[0] = 60;
        this.mFrequency[1] = 20;
        this.mFrequency[2] = 20;
      } else if (mol.getAtomPi_0(atom1) == 1 && conns1 == 1 && conns2 == 2 && torsionAtom[3] != -1 || mol.getAtomPi_0(atom2) == 1 && conns2 == 1 && conns1 == 2 && torsionAtom[0] != -1) {
        this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 3, 15, 1);
        this.mTorsion[0] = 0;
        this.mTorsion[1] = 120;
        this.mTorsion[2] = 240;
        this.mTorsionRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [3, 2], 2);
        this.mTorsionRange[0][0] = -15;
        this.mTorsionRange[0][1] = 15;
        this.mTorsionRange[1][0] = 105;
        this.mTorsionRange[1][1] = 135;
        this.mTorsionRange[2][0] = 225;
        this.mTorsionRange[2][1] = 255;
        this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 3, 15, 1);
        this.mFrequency[0] = 20;
        this.mFrequency[1] = 40;
        this.mFrequency[2] = 40;
      } else if (conns1 == 2 && conns2 == 2) {
        if (torsionAtom[0] == -1 || torsionAtom[3] == -1) {
          this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 2, 15, 1);
          this.mTorsion[0] = 0;
          this.mTorsion[1] = 180;
          this.mTorsionRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [2, 2], 2);
          this.mTorsionRange[0][0] = -15;
          this.mTorsionRange[0][1] = 15;
          this.mTorsionRange[1][0] = 165;
          this.mTorsionRange[1][1] = 195;
          this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 2, 15, 1);
          this.mFrequency[0] = 50;
          this.mFrequency[1] = 50;
        } else {
          this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 2, 15, 1);
          this.mTorsion[0] = 90;
          this.mTorsion[1] = 270;
          this.mTorsionRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [2, 2], 2);
          this.mTorsionRange[0][0] = 75;
          this.mTorsionRange[0][1] = 105;
          this.mTorsionRange[1][0] = 255;
          this.mTorsionRange[1][1] = 285;
          this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 2, 15, 1);
          this.mFrequency[0] = 50;
          this.mFrequency[1] = 50;
        }
      }
    } else if (mol.getAtomPi_0(atom1) == 1 && mol.getAtomPi_0(atom2) == 1) {
      if (conns1 == 1 && conns2 == 1) {
        this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 2, 15, 1);
        this.mTorsion[0] = 0;
        this.mTorsion[1] = 180;
        this.mTorsionRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [2, 2], 2);
        this.mTorsionRange[0][0] = -15;
        this.mTorsionRange[0][1] = 15;
        this.mTorsionRange[1][0] = 165;
        this.mTorsionRange[1][1] = 195;
        this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 2, 15, 1);
        this.mFrequency[0] = 10;
        this.mFrequency[1] = 90;
      } else {
        this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 6, 15, 1);
        this.mTorsion[0] = 0;
        this.mTorsion[1] = 50;
        this.mTorsion[2] = 130;
        this.mTorsion[3] = 180;
        this.mTorsion[4] = 230;
        this.mTorsion[5] = 310;
        this.mTorsionRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [6, 2], 2);
        this.mTorsionRange[0][0] = -15;
        this.mTorsionRange[0][1] = 15;
        this.mTorsionRange[1][0] = 35;
        this.mTorsionRange[1][1] = 65;
        this.mTorsionRange[2][0] = 115;
        this.mTorsionRange[2][1] = 145;
        this.mTorsionRange[3][0] = 165;
        this.mTorsionRange[3][1] = 195;
        this.mTorsionRange[4][0] = 215;
        this.mTorsionRange[4][1] = 245;
        this.mTorsionRange[5][0] = 295;
        this.mTorsionRange[5][1] = 325;
        this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 6, 15, 1);
        this.mFrequency[0] = 40;
        this.mFrequency[1] = 5;
        this.mFrequency[2] = 5;
        this.mFrequency[3] = 40;
        this.mFrequency[4] = 5;
        this.mFrequency[5] = 5;
      }
    } else {
      this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 1, 15, 1);
      this.mTorsion[0] = 180;
      this.mTorsionRange = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [1, 2], 2);
      this.mTorsionRange[0][0] = 165;
      this.mTorsionRange[0][1] = 195;
      this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 1, 15, 1);
      this.mFrequency[0] = 100;
    }
  };
  defineClass(273, 1, { 1: 1 }, carcc.TorsionPrediction);
  _.$init_69 = function $init_69() {
  };
  _.getTorsionFrequencies = function getTorsionFrequencies_0() {
    return this.mFrequency;
  };
  _.getTorsionRanges = function getTorsionRanges_0() {
    return this.mTorsionRange;
  };
  _.getTorsions = function getTorsions_0() {
    return this.mTorsion;
  };
  cggl.Lcom_actelion_research_chem_conf_TorsionPrediction_2_classLit = createForClass("com.actelion.research.chem.conf", "TorsionPrediction", 273, cggl.Ljava_lang_Object_2_classLit);
  carcc.$clinit_VDWRadii = function $clinit_VDWRadii() {
    carcc.$clinit_VDWRadii = emptyMethod;
    carcc.VDW_RADIUS = stampJavaTypeInfo(getClassLiteralForArray(cggl.F_classLit, 1), { 44: 1, 4: 1, 1: 1 }, 5, 15, [1, 1.2000000476837158, 1.4299999475479126, 2.119999885559082, 1.9800000190734863, 1.909999966621399, 1.7699999809265137, 1.659999966621399, 1.5, 1.4600000381469727, 1.5800000429153442, 2.5, 2.509999990463257, 2.25, 2.190000057220459, 1.899999976158142, 1.8899999856948853, 1.8200000524520874, 1.8300000429153442, 2.7300000190734863, 2.619999885559082, 2.5799999237060547, 2.4600000381469727, 2.4200000762939453, 2.450000047683716, 2.450000047683716, 2.440000057220459, 2.4000000953674316, 2.4000000953674316, 2.380000114440918, 2.390000104904175, 2.319999933242798, 2.2899999618530273, 1.8799999952316284, 1.8200000524520874, 1.8600000143051147, 2.25, 3.2100000381469727, 2.8399999141693115, 2.75, 2.5199999809265137, 2.559999942779541, 2.450000047683716, 2.440000057220459, 2.4600000381469727, 2.440000057220459, 2.1500000953674316, 2.5299999713897705, 2.490000009536743, 2.430000066757202, 2.4200000762939453, 2.4700000286102295, 1.9900000095367432, 2.0399999618530273, 2.059999942779541, 3.4800000190734863, 3.0299999713897705, 2.9800000190734863, 2.880000114440918, 2.9200000762939453, 2.950000047683716, 2.9200000762939453, 2.9000000953674316, 2.869999885559082, 2.8299999237060547, 2.7899999618530273, 2.869999885559082, 2.809999942779541, 2.8299999237060547, 2.7899999618530273, 2.799999952316284, 2.740000009536743, 2.630000114440918, 2.5299999713897705, 2.569999933242798, 2.490000009536743, 2.4800000190734863, 2.4100000858306885, 2.2899999618530273, 2.319999933242798, 2.450000047683716, 2.4700000286102295, 2.5999999046325684, 2.5399999618530273, 2.5, 2.5, 2.5, 2.5, 2.5, 2.799999952316284, 2.930000066757202, 2.880000114440918, 2.7100000381469727, 2.819999933242798, 2.809999942779541, 2.8299999237060547, 3.049999952316284, 3.4000000953674316, 3.049999952316284, 2.700000047683716]);
    carcc.COVALENT_RADIUS = stampJavaTypeInfo(getClassLiteralForArray(cggl.F_classLit, 1), { 44: 1, 4: 1, 1: 1 }, 5, 15, [0.25, 0.3199999928474426, 0.46000000834465027, 1.3300000429153442, 1.0199999809265137, 0.8500000238418579, 0.75, 0.7099999785423279, 0.6299999952316284, 0.6399999856948853, 0.9599999785423279, 1.600000023841858, 1.3899999856948853, 1.2599999904632568, 1.159999966621399, 1.1100000143051147, 1.0299999713897705, 0.9900000095367432, 1.0700000524520874, 1.9600000381469727, 1.7100000381469727, 1.4800000190734863, 1.3600000143051147, 1.340000033378601, 1.2200000286102295, 1.190000057220459, 1.159999966621399, 1.1100000143051147, 1.100000023841858, 1.2000000476837158, 1.2000000476837158, 1.2400000095367432, 1.2100000381469727, 1.2100000381469727, 1.159999966621399, 1.1399999856948853, 1.2100000381469727, 2.0999999046325684, 1.850000023841858, 1.6299999952316284, 1.5399999618530273, 1.4700000286102295, 1.3799999952316284, 1.2799999713897705, 1.25, 1.25, 1.2000000476837158, 1.3899999856948853, 1.440000057220459, 1.4600000381469727, 1.399999976158142, 1.399999976158142, 1.3600000143051147, 1.3300000429153442, 1.350000023841858, 2.319999933242798, 1.9600000381469727, 1.7999999523162842, 1.6299999952316284, 1.7599999904632568, 1.7400000095367432, 1.7300000190734863, 1.7200000286102295, 1.6799999475479126, 1.690000057220459, 1.6799999475479126, 1.6699999570846558, 1.659999966621399, 1.649999976158142, 1.6399999856948853, 1.7000000476837158, 1.6200000047683716, 1.5199999809265137, 1.4600000381469727, 1.3700000047683716, 1.309999942779541, 1.2899999618530273, 1.2200000286102295, 1.2300000190734863, 1.2400000095367432, 1.4199999570846558, 1.5, 1.440000057220459, 1.5099999904632568, 1.4500000476837158, 1.4700000286102295, 1.4500000476837158, 2.2300000190734863, 2.009999990463257, 1.8600000143051147, 1.75, 1.690000057220459, 1.7000000476837158, 1.7100000381469727, 1.7200000286102295, 1.659999966621399, 1.659999966621399, 1.6799999475479126, 1.6799999475479126, 1.649999976158142, 1.6699999570846558, 1.7300000190734863, 1.7599999904632568, 1.6100000143051147, 1.5700000524520874, 1.4900000095367432, 1.4299999475479126, 1.409999966621399, 1.340000033378601, 1.2899999618530273, 1.2799999713897705, 1.2100000381469727, 1.3700000047683716, 1.3600000143051147, 1.4299999475479126, 1.6200000047683716, 1.75, 1.649999976158142, 1.5700000524520874]);
  };
  cggl.Lcom_actelion_research_chem_conf_VDWRadii_2_classLit = createForInterface("com.actelion.research.chem.conf", "VDWRadii");
  carcc2.$clinit_DiastereotopicAtomID = function $clinit_DiastereotopicAtomID() {
    carcc2.$clinit_DiastereotopicAtomID = emptyMethod;
    jl.$clinit_Object();
    carcc2.xAtomicNumber = carc2.getAtomicNoFromLabel_0("X", 32);
  };
  carcc2.addMissingChirality = function addMissingChirality(molecule) {
    carcc2.$clinit_DiastereotopicAtomID();
    carcc2.addMissingChirality_0(molecule, 1);
  };
  carcc2.addMissingChirality_0 = function addMissingChirality_0(molecule, esrType) {
    carcc2.$clinit_DiastereotopicAtomID();
    var connAtom, i, iAtom, stereoBond, tempMolecule;
    for (iAtom = 0; iAtom < molecule.getAllAtoms_0(); iAtom++) {
      tempMolecule = molecule.getCompactCopy_0();
      carcc2.changeAtomForStereo(tempMolecule, iAtom);
      tempMolecule.ensureHelperArrays_0(15);
      for (i = 0; i < tempMolecule.getAtoms_0(); i++) {
        if (tempMolecule.isAtomStereoCenter_0(i) && tempMolecule.getStereoBond_0(i) == -1) {
          stereoBond = tempMolecule.getAtomPreferredStereoBond_0(i);
          if (stereoBond != -1) {
            molecule.setBondType_0(stereoBond, 257);
            if (molecule.getBondAtom_0(1, stereoBond) == i) {
              connAtom = molecule.getBondAtom_0(0, stereoBond);
              molecule.setBondAtom_0(0, stereoBond, i);
              molecule.setBondAtom_0(1, stereoBond, connAtom);
            }
            molecule.setAtomESR_0(i, esrType, 0);
          }
        }
      }
    }
  };
  carcc2.changeAtom_0 = function changeAtom_0(molecule, iAtom) {
    molecule.setAtomCustomLabel_0(iAtom, molecule.getAtomLabel_0(iAtom) + "*");
    if (molecule.getAtomicNo_0(iAtom) == 1) {
      molecule.setAtomicNo_0(iAtom, carcc2.xAtomicNumber);
    } else {
      molecule.setAtomMass_0(iAtom, molecule.getAtomMass_0(iAtom) + 5);
    }
  };
  carcc2.changeAtomForStereo = function changeAtomForStereo(molecule, iAtom) {
    molecule.setAtomicNo_0(iAtom, carcc2.xAtomicNumber);
  };
  carcc2.getAtomIds = function getAtomIds(molecule) {
    carcc2.$clinit_DiastereotopicAtomID();
    var iAtom, ids, numberAtoms, tempMolecule;
    carcc2.addMissingChirality(molecule);
    numberAtoms = molecule.getAllAtoms_0();
    ids = initUnidimensionalArray(cggl.Ljava_lang_String_2_classLit, { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, numberAtoms, 6, 1);
    for (iAtom = 0; iAtom < numberAtoms; iAtom++) {
      tempMolecule = molecule.getCompactCopy_0();
      carcc2.changeAtom_0(tempMolecule, iAtom);
      carcc2.makeRacemic(tempMolecule);
      ids[iAtom] = new carc2.Canonizer_0(tempMolecule, 8).getIDCode_0();
    }
    return ids;
  };
  carcc2.makeRacemic = function makeRacemic(molecule) {
    var i;
    molecule.ensureHelperArrays_0(15);
    for (i = 0; i < molecule.getAllAtoms_0(); i++) {
      if (molecule.getAtomParity_0(i) != 0) {
        molecule.setAtomESR_0(i, 1, 0);
      }
    }
  };
  defineClass(643, 1, { 1: 1 });
  carcc2.xAtomicNumber = 0;
  cggl.Lcom_actelion_research_chem_contrib_DiastereotopicAtomID_2_classLit = createForClass("com.actelion.research.chem.contrib", "DiastereotopicAtomID", 643, cggl.Ljava_lang_Object_2_classLit);
  carcc2.$clinit_HoseCodeCreator = function $clinit_HoseCodeCreator() {
    carcc2.$clinit_HoseCodeCreator = emptyMethod;
    jl.$clinit_Object();
  };
  carcc2.getHoseCodes = function getHoseCodes(mol, maxSphereSize, type_0) {
    carcc2.$clinit_HoseCodeCreator();
    var ids, rootAtom;
    ids = initMultidimensionalArray(cggl.Ljava_lang_String_2_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 4: 1, 1: 1, 7: 1, 9: 1 }], [9, 2], 6, [mol.getAtoms_0(), maxSphereSize], 2);
    mol.ensureHelperArrays_0(7);
    for (rootAtom = 0; rootAtom < mol.getAtoms_0(); rootAtom++) {
      ids[rootAtom] = carcc2.getHoseCodesForAtom(mol, rootAtom, maxSphereSize, type_0);
    }
    return ids;
  };
  carcc2.getHoseCodesForAtom = function getHoseCodesForAtom(mol, rootAtom, maxSphereSize, type_0) {
    var atom, atomList, atomMask, connAtom, fragment, i, ids, j, max_0, min_0, newMax, sphere;
    fragment = new carc2.StereoMolecule_0(mol.getAtoms_0(), mol.getBonds_0());
    ids = new ju.Vector();
    min_0 = 0;
    max_0 = 0;
    atomMask = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 16, 1);
    atomList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 15, 1);
    for (sphere = 0; sphere < maxSphereSize && max_0 < mol.getAtoms_0(); sphere++) {
      if (max_0 == 0) {
        atomList[0] = rootAtom;
        atomMask[rootAtom] = true;
        max_0 = 1;
      } else {
        newMax = max_0;
        for (i = min_0; i < max_0; i++) {
          atom = atomList[i];
          for (j = 0; j < mol.getConnAtoms_0(atom); j++) {
            connAtom = mol.getConnAtom_0(atom, j);
            if (false)
              (jl.$clinit_System(), jl.out_0).println_0("---> " + atom + " to " + connAtom);
            if (!atomMask[connAtom]) {
              switch (type_0) {
                case 0:
                  atomMask[connAtom] = true;
                  atomList[newMax++] = connAtom;
                  break;
                case 1:
                  if (!(carcc2.isCsp3(mol, atom) && carcc2.isCsp3(mol, connAtom))) {
                    if (false)
                      (jl.$clinit_System(), jl.out_0).println_0("NO SKIP");
                    atomMask[connAtom] = true;
                    atomList[newMax++] = connAtom;
                  } else {
                    if (false)
                      (jl.$clinit_System(), jl.out_0).println_0("SKIP");
                  }
                  break;
              }
            }
          }
        }
        min_0 = max_0;
        max_0 = newMax;
      }
      mol.copyMoleculeByAtoms_0(fragment, atomMask, true, null);
      ids.add(new carc2.Canonizer_0(fragment, 8).getIDCode_0());
    }
    return castTo(ids.toArray_0(initUnidimensionalArray(cggl.Ljava_lang_String_2_classLit, { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, ids.size(), 6, 1)), 9);
  };
  carcc2.getHoseCodesFromDiaID = function getHoseCodesFromDiaID(diastereotopicID, maxSphereSize, type_0) {
    carcc2.$clinit_HoseCodeCreator();
    var atomCustomLabel, atomID, i, molecule;
    molecule = new carc2.IDCodeParser(true).getCompactMolecule(diastereotopicID);
    atomID = -1;
    for (i = 0; i < molecule.getAllAtoms_0(); i++) {
      atomCustomLabel = molecule.getAtomCustomLabel_0(i);
      if (jsNotEquals(atomCustomLabel, null) && jl.endsWith_Ljava_lang_String__Z__devirtual$(atomCustomLabel, "*")) {
        atomID = i;
        break;
      }
    }
    if (atomID >= 0) {
      return carcc2.getHoseCodesForAtom(molecule, atomID, maxSphereSize, type_0);
    }
    return initUnidimensionalArray(cggl.Ljava_lang_String_2_classLit, { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 0, 6, 1);
  };
  carcc2.isCsp3 = function isCsp3(mol, atomID) {
    if (mol.getAtomicNo_0(atomID) != 6)
      return false;
    if (mol.getAtomCharge_0(atomID) != 0)
      return false;
    if (mol.getImplicitHydrogens_1(atomID) + mol.getConnAtoms_0(atomID) != 4)
      return false;
    return true;
  };
  defineClass(644, 1, { 1: 1 });
  carcc2.DEBUG = false;
  carcc2.FULL_HOSE_CODE = 0;
  carcc2.HOSE_CODE_CUT_C_SP3_SP3 = 1;
  cggl.Lcom_actelion_research_chem_contrib_HoseCodeCreator_2_classLit = createForClass("com.actelion.research.chem.contrib", "HoseCodeCreator", 644, cggl.Ljava_lang_Object_2_classLit);
  carcc2.$clinit_HydrogenHandler = function $clinit_HydrogenHandler() {
    carcc2.$clinit_HydrogenHandler = emptyMethod;
    jl.$clinit_Object();
    carcc2.cos30 = $wnd.Math.cos(30 / 360 * 3.141592653589793 * 2);
    carcc2.sin30 = $wnd.Math.sin(30 / 360 * 3.141592653589793 * 2);
    carcc2.cos330 = $wnd.Math.cos(-30 / 360 * 3.141592653589793 * 2);
    carcc2.sin330 = $wnd.Math.sin(-30 / 360 * 3.141592653589793 * 2);
    carcc2.cos60 = $wnd.Math.cos(60 / 360 * 3.141592653589793 * 2);
    carcc2.sin60 = $wnd.Math.sin(60 / 360 * 3.141592653589793 * 2);
    carcc2.cos300 = $wnd.Math.cos(-60 / 360 * 3.141592653589793 * 2);
    carcc2.sin300 = $wnd.Math.sin(-60 / 360 * 3.141592653589793 * 2);
    carcc2.cos45 = $wnd.Math.cos(45 / 360 * 3.141592653589793 * 2);
    carcc2.sin45 = $wnd.Math.sin(45 / 360 * 3.141592653589793 * 2);
    carcc2.cos315 = $wnd.Math.cos(-45 / 360 * 3.141592653589793 * 2);
    carcc2.sin315 = $wnd.Math.sin(-45 / 360 * 3.141592653589793 * 2);
  };
  carcc2.addImplicitHydrogens = function addImplicitHydrogens(molecule) {
    carcc2.$clinit_HydrogenHandler();
    var iAtom, nAtomsBefore;
    molecule.ensureHelperArrays_0(1);
    nAtomsBefore = molecule.getAtoms_0();
    for (iAtom = 0; iAtom < nAtomsBefore; iAtom++) {
      carcc2.addImplicitHydrogens_0(molecule, iAtom);
    }
  };
  carcc2.addImplicitHydrogens_0 = function addImplicitHydrogens_0(molecule, iAtom) {
    carcc2.$clinit_HydrogenHandler();
    var angle1, angle2, angle3, atom, atomicNo, averageLength, bond, currentDistance, distance, dx, dx1, dx2, dy, dy1, dy2, i, i0, iHydrogen, iNew, length_0, length1, length2, nHydrogens, nNeighbours, nNeighbours0, normal, stereoAtom1, stereoAtom2, stereoBond, x_0, y_0;
    atomicNo = 1;
    nHydrogens = molecule.getImplicitHydrogens_1(iAtom);
    x_0 = molecule.getAtomX_0(iAtom);
    y_0 = molecule.getAtomY_0(iAtom);
    switch (nHydrogens) {
      case 1:
        {
          nNeighbours0 = molecule.getConnAtoms_0(iAtom);
          if (nNeighbours0 == 0) {
            dx = molecule.getAverageBondLength_5(true);
            dy = 0;
          } else {
            dx = x_0 - molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 0));
            dy = y_0 - molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 0));
          }
          if (nNeighbours0 == 1) {
            iNew = molecule.addAtom_0(x_0 + carcc2.cos45 * dx + carcc2.sin45 * dy, y_0 - carcc2.sin45 * dx + carcc2.cos45 * dy);
          } else if (nNeighbours0 == 2) {
            dx = x_0 - 0.5 * (molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 0)) + molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 1)));
            dy = y_0 - 0.5 * (molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 0)) + molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 1)));
            iNew = molecule.addAtom_0(x_0 + dx, y_0 + dy);
          } else if (nNeighbours0 == 3) {
            stereoAtom1 = molecule.getConnAtom_0(iAtom, 0);
            for (i0 = 1; i0 < 3; i0++) {
              bond = molecule.getConnBond_0(iAtom, i0);
              if (molecule.getBondType_0(bond) == 129 || molecule.getBondType_0(bond) == 257) {
                stereoAtom1 = molecule.getConnAtom_0(iAtom, i0);
              }
            }
            angle1 = $wnd.Math.abs(carc2.getAngleDif(carc2.getAngle_0(molecule.getAtomX_0(iAtom), molecule.getAtomY_0(iAtom), molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 0)), molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 0))), carc2.getAngle_0(molecule.getAtomX_0(iAtom), molecule.getAtomY_0(iAtom), molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 1)), molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 1)))));
            angle2 = $wnd.Math.abs(carc2.getAngleDif(carc2.getAngle_0(molecule.getAtomX_0(iAtom), molecule.getAtomY_0(iAtom), molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 0)), molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 0))), carc2.getAngle_0(molecule.getAtomX_0(iAtom), molecule.getAtomY_0(iAtom), molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 2)), molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 2)))));
            angle3 = $wnd.Math.abs(carc2.getAngleDif(carc2.getAngle_0(molecule.getAtomX_0(iAtom), molecule.getAtomY_0(iAtom), molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 1)), molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 1))), carc2.getAngle_0(molecule.getAtomX_0(iAtom), molecule.getAtomY_0(iAtom), molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 2)), molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 2)))));
            normal = true;
            if (angle1 > angle2 && angle1 > angle3) {
              if (angle2 + angle3 < 3.141592653589793) {
                normal = false;
                dx = x_0 - 0.5 * (molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 0)) + molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 1)));
                dy = y_0 - 0.5 * (molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 0)) + molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 1)));
              }
            } else if (angle2 > angle1 && angle2 > angle3) {
              if (angle1 + angle3 < 3.141592653589793) {
                normal = false;
                dx = x_0 - 0.5 * (molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 0)) + molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 2)));
                dy = y_0 - 0.5 * (molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 0)) + molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 2)));
              }
            } else {
              if (angle1 + angle2 < 3.141592653589793) {
                normal = false;
                dx = x_0 - 0.5 * (molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 1)) + molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 2)));
                dy = y_0 - 0.5 * (molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 1)) + molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 2)));
              }
            }
            if (normal) {
              stereoAtom2 = molecule.getConnAtom_0(iAtom, 0);
              distance = 17976931348623157e292;
              for (i = 0; i < 3; i++) {
                atom = molecule.getConnAtom_0(iAtom, i);
                if (atom != stereoAtom1) {
                  currentDistance = $wnd.Math.pow(molecule.getAtomX_0(iAtom) - molecule.getAtomX_0(atom), 2) + $wnd.Math.pow(molecule.getAtomY_0(iAtom) - molecule.getAtomY_0(atom), 2);
                  if (currentDistance < distance) {
                    stereoAtom2 = atom;
                    distance = currentDistance;
                    (jl.$clinit_System(), jl.out_0).println_0("Minimal distance: " + stereoAtom1 + " - " + stereoAtom2 + " - " + distance + " - " + molecule.getAtomicNo_0(stereoAtom2));
                  }
                }
              }
              iNew = molecule.addAtom_0((molecule.getAtomX_0(stereoAtom1) + molecule.getAtomX_0(stereoAtom2)) / 2, (molecule.getAtomY_0(stereoAtom1) + molecule.getAtomY_0(stereoAtom2)) / 2);
            } else {
              iNew = molecule.addAtom_0(x_0 + dx, y_0 + dy);
            }
          } else {
            iNew = molecule.addAtom_0(x_0 + dx, y_0 + dy);
          }
          molecule.setAtomicNo_0(iNew, 1);
          molecule.addBond_1(iAtom, iNew, 1);
        }
        break;
      case 2:
        nNeighbours = molecule.getConnAtoms_0(iAtom);
        if (nNeighbours == 1) {
          dx = x_0 - molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 0));
          dy = y_0 - molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 0));
          iNew = molecule.addAtom_0(x_0 + (carcc2.cos60 * dx - carcc2.sin60 * dy) * 0.7, y_0 + (carcc2.sin60 * dx + carcc2.cos60 * dy) * 0.7);
          molecule.setAtomicNo_0(iNew, 1);
          molecule.addBond_1(iAtom, iNew, 1);
          iNew = molecule.addAtom_0(x_0 + (carcc2.cos300 * dx - carcc2.sin300 * dy) * 0.7, y_0 + (carcc2.sin300 * dx + carcc2.cos300 * dy) * 0.7);
          molecule.setAtomicNo_0(iNew, 1);
          molecule.addBond_1(iAtom, iNew, 1);
        } else if (nNeighbours == 2) {
          dx1 = x_0 - molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 0));
          dy1 = y_0 - molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 0));
          dx2 = x_0 - molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 1));
          dy2 = y_0 - molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 1));
          length1 = $wnd.Math.sqrt(dx1 * dx1 + dy1 * dy1) * 0.7;
          length2 = $wnd.Math.sqrt(dx2 * dx2 + dy2 * dy2) * 0.7;
          dx = dx1 + dx2;
          dy = dy1 + dy2;
          length_0 = $wnd.Math.sqrt(dx * dx + dy * dy);
          averageLength = (length1 + length2) / 2;
          dx = dx / length_0 * averageLength;
          dy = dy / length_0 * averageLength;
          stereoBond = molecule.getStereoBond_0(iAtom);
          iNew = molecule.addAtom_0(x_0 + carcc2.cos30 * dx - carcc2.sin30 * dy, y_0 + carcc2.sin30 * dx + carcc2.cos30 * dy);
          molecule.setAtomicNo_0(iNew, 1);
          if (stereoBond > -1) {
            molecule.addBond_1(iAtom, iNew, 1);
          } else {
            molecule.addBond_1(iAtom, iNew, 257);
          }
          iNew = molecule.addAtom_0(x_0 + carcc2.cos330 * dx - carcc2.sin330 * dy, y_0 + carcc2.sin330 * dx + carcc2.cos330 * dy);
          molecule.setAtomicNo_0(iNew, 1);
          molecule.addBond_1(iAtom, iNew, 1);
        } else {
          for (iHydrogen = 0; iHydrogen < nHydrogens; iHydrogen++) {
            iNew = molecule.addAtom_0(x_0, y_0);
            molecule.setAtomicNo_0(iNew, 1);
            molecule.addBond_1(iAtom, iNew, 1);
          }
        }
        break;
      case 3:
        {
          if (molecule.getConnAtom_0(iAtom, 0) > 0) {
            dx = (x_0 - molecule.getAtomX_0(molecule.getConnAtom_0(iAtom, 0))) * 0.7;
            dy = (y_0 - molecule.getAtomY_0(molecule.getConnAtom_0(iAtom, 0))) * 0.7;
            iNew = molecule.addAtom_0(x_0 + dx, y_0 + dy);
            molecule.setAtomicNo_0(iNew, 1);
            molecule.addBond_1(iAtom, iNew, 1);
            iNew = molecule.addAtom_0(x_0 - dy, y_0 + dx);
            molecule.setAtomicNo_0(iNew, 1);
            molecule.addBond_1(iAtom, iNew, 1);
            iNew = molecule.addAtom_0(x_0 + dy, y_0 - dx);
            molecule.setAtomicNo_0(iNew, 1);
            molecule.addBond_1(iAtom, iNew, 1);
          } else {
            dx = molecule.getAverageBondLength_5(true);
            dy = molecule.getAverageBondLength_5(true);
            iNew = molecule.addAtom_0(x_0 + dx, y_0 + dy);
            molecule.setAtomicNo_0(iNew, 1);
            molecule.addBond_1(iAtom, iNew, 1);
            iNew = molecule.addAtom_0(x_0 - dy * carcc2.cos60, y_0 + dx * carcc2.sin60);
            molecule.setAtomicNo_0(iNew, 1);
            molecule.addBond_1(iAtom, iNew, 1);
            iNew = molecule.addAtom_0(x_0 - dy * carcc2.cos60, y_0 - dx * carcc2.sin60);
            molecule.setAtomicNo_0(iNew, 1);
            molecule.addBond_1(iAtom, iNew, 1);
          }
        }
        break;
      default: {
        for (iHydrogen = 0; iHydrogen < nHydrogens; iHydrogen++) {
          iNew = molecule.addAtom_0(x_0, y_0);
          molecule.setAtomicNo_0(iNew, 1);
          molecule.addBond_1(iAtom, iNew, 1);
        }
        break;
      }
    }
  };
  carcc2.getNumberOfHydrogens = function getNumberOfHydrogens(molecule) {
    carcc2.$clinit_HydrogenHandler();
    var iAtom, nbHydrogens;
    molecule.ensureHelperArrays_0(1);
    nbHydrogens = 0;
    for (iAtom = 0; iAtom < molecule.getAllAtoms_0(); iAtom++) {
      if (molecule.getAtomicNo_0(iAtom) == 1)
        nbHydrogens++;
      else
        nbHydrogens += molecule.getPlainHydrogens(iAtom);
    }
    return nbHydrogens;
  };
  defineClass(642, 1, { 1: 1 });
  carcc2.H_BOND_RATIO = 0.7;
  carcc2.cos30 = 0;
  carcc2.cos300 = 0;
  carcc2.cos315 = 0;
  carcc2.cos330 = 0;
  carcc2.cos45 = 0;
  carcc2.cos60 = 0;
  carcc2.sin30 = 0;
  carcc2.sin300 = 0;
  carcc2.sin315 = 0;
  carcc2.sin330 = 0;
  carcc2.sin45 = 0;
  carcc2.sin60 = 0;
  cggl.Lcom_actelion_research_chem_contrib_HydrogenHandler_2_classLit = createForClass("com.actelion.research.chem.contrib", "HydrogenHandler", 642, cggl.Ljava_lang_Object_2_classLit);
  carcc3.$clinit_CoordinateInventor = function $clinit_CoordinateInventor() {
    carcc3.$clinit_CoordinateInventor = emptyMethod;
    jl.$clinit_Object();
    carcc3.MODE_CONSIDER_MARKED_ATOMS = 4 | 8;
    carcc3.TOTAL_FLIPS = 32 + 64 + 128;
  };
  carcc3.CoordinateInventor = function CoordinateInventor() {
    carcc3.$clinit_CoordinateInventor();
    carcc3.CoordinateInventor_0.call(this, 2);
  };
  carcc3.CoordinateInventor_0 = function CoordinateInventor_0(mode) {
    carcc3.$clinit_CoordinateInventor();
    Object_0.call(this);
    this.$init_70();
    this.mMode = mode;
    if ((mode & 1) == 0 && isNull(carcc3.sDefaultTemplateList))
      carcc3.buildDefaultTemplateList();
  };
  carcc3.buildDefaultTemplateList = function buildDefaultTemplateList() {
    if (isNull(carcc3.sDefaultTemplateList))
      carcc3.sDefaultTemplateList = new carcc3.InventorDefaultTemplateList();
  };
  carcc3.getMeanAngle = function getMeanAngle(angle, noOfAngles) {
    carcc3.$clinit_CoordinateInventor();
    var cosSum, i, length_0, meanAngle, sinSum;
    sinSum = 0;
    cosSum = 0;
    for (i = 0; i < noOfAngles; i++) {
      sinSum += angle[i].mLength * $wnd.Math.sin(angle[i].mAngle);
      cosSum += angle[i].mLength * $wnd.Math.cos(angle[i].mAngle);
    }
    if (cosSum == 0)
      meanAngle = sinSum > 0 ? 3.141592653589793 / 2 : -3.141592653589793 / 2;
    else {
      meanAngle = $wnd.Math.atan(sinSum / cosSum);
      if (cosSum < 0)
        meanAngle += 3.141592653589793;
    }
    length_0 = $wnd.Math.sqrt(sinSum * sinSum + cosSum * cosSum) / noOfAngles;
    return new carcc3.InventorAngle(meanAngle, length_0);
  };
  carcc3.lambda$0_0 = function lambda$0_0(o1_0, o2_1) {
    carcc3.$clinit_CoordinateInventor();
    var c1, c2;
    {
      c1 = $wnd.Math.abs(o1_0.charge);
      c2 = $wnd.Math.abs(o2_1.charge);
      return compare_25(c1, c2);
    }
  };
  defineClass(84, 1, { 1: 1 }, carcc3.CoordinateInventor, carcc3.CoordinateInventor_0);
  _.$init_70 = function $init_70() {
  };
  _.addRingFragment = function addRingFragment(ringAtom, ringBond) {
    var f, i, ringSize;
    ringSize = ringAtom.length;
    f = new carcc3.InventorFragment(this.mMol, ringSize, false);
    f.mAtomX[0] = 0;
    f.mAtomY[0] = 0;
    for (i = 0; i < ringSize; i++) {
      f.mPriority[i] = 128 - ringSize;
      f.mGlobalAtom[i] = ringAtom[i];
    }
    if (ringSize < 8)
      this.createRegularRingFragment(f);
    else
      this.createLargeRingFragment(f, ringAtom, ringBond);
    this.mFragmentList.add(f);
  };
  _.calcNextBaseValues = function calcNextBaseValues(baseValue, symRank, atomBits, maxConnAtoms) {
    var atom, connRank, i, i0, j, k, neighbours, rank;
    connRank = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, maxConnAtoms, 15, 1);
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      for (i0 = 0; i0 < this.mMol.getAllConnAtoms_0(atom); i0++) {
        rank = symRank[this.mMol.getConnAtom_0(atom, i0)];
        for (j = 0; j < i0; j++)
          if (rank < connRank[j])
            break;
        for (k = i0; k > j; k--)
          connRank[k] = connRank[k - 1];
        connRank[j] = rank;
      }
      neighbours = this.mMol.getAllConnAtoms_0(atom);
      baseValue[atom].init_0(atom);
      baseValue[atom].add_0(atomBits, fromInt_0(symRank[atom]));
      baseValue[atom].add_0((maxConnAtoms - neighbours) * (atomBits + 1), 0);
      for (i = 0; i < neighbours; i++)
        baseValue[atom].add_0(atomBits + 1, fromInt_0(connRank[i]));
    }
  };
  _.calculateAtomSymmetries = function calculateAtomSymmetries() {
    var atom, atom0, atomBits, baseValue, baseValueSize, bond, bondParity, maxConnAtoms, newNoOfRanks, oldNoOfRanks, symRank;
    atomBits = carc2.getNeededBits(this.mMol.getAtoms_0());
    maxConnAtoms = 2;
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++)
      maxConnAtoms = $wnd.Math.max(maxConnAtoms, this.mMol.getAllConnAtoms_0(atom0));
    baseValueSize = narrow_int((62 + 2 * atomBits + maxConnAtoms * (atomBits + 1)) / 63);
    baseValue = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_CanonizerBaseValue_2_classLit, { 4: 1, 1: 1, 7: 1 }, 106, this.mMol.getAllAtoms_0(), 0, 1);
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      setCheck(baseValue, atom, new carc2.CanonizerBaseValue(baseValueSize));
      baseValue[atom].init_0(atom);
    }
    symRank = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      bondParity = this.mMol.getBondParity_0(bond);
      if (bondParity == 1 || bondParity == 2) {
        baseValue[this.mMol.getBondAtom_0(0, bond)].add_1(fromInt_0(bondParity));
        baseValue[this.mMol.getBondAtom_0(1, bond)].add_1(fromInt_0(bondParity));
      }
    }
    newNoOfRanks = this.consolidateRanks(baseValue, symRank);
    do {
      oldNoOfRanks = newNoOfRanks;
      this.calcNextBaseValues(baseValue, symRank, atomBits, maxConnAtoms);
      newNoOfRanks = this.consolidateRanks(baseValue, symRank);
    } while (oldNoOfRanks != newNoOfRanks);
    return symRank;
  };
  _.consolidateRanks = function consolidateRanks(baseValue, symRank) {
    var i, rank;
    rank = 0;
    ju.sort_5(baseValue);
    for (i = 0; i < baseValue.length; i++) {
      if (i == 0 || baseValue[i].compareTo_0(baseValue[i - 1]) != 0)
        rank++;
      symRank[baseValue[i].getAtom()] = rank;
    }
    return rank;
  };
  _.correctChainEZParities = function correctChainEZParities() {
    var angle1, angle2, bond, bondAtom, connAtom, dbAngle, f, f$iterator, i, j, k, minConnAtom;
    for (f$iterator = this.mFragmentList.iterator(); f$iterator.hasNext_0(); ) {
      f = castTo(f$iterator.next_3(), 31);
      for (i = 0; i < f.mGlobalBond.length; i++) {
        bond = f.mGlobalBond[i];
        if (this.mMol.getBondOrder_0(bond) == 2) {
          if (!this.mMol.isSmallRingBond_0(bond) && (this.mMol.getBondParity_0(bond) == 3 || this.mMol.getBondParity_0(bond) == 0))
            this.mMol.setBondParityUnknownOrNone_0(bond);
          if (!this.mMol.isRingBond_0(bond) && this.mMol.getConnAtoms_0(this.mMol.getBondAtom_0(0, bond)) > 1 && this.mMol.getConnAtoms_0(this.mMol.getBondAtom_0(1, bond)) > 1 && (this.mMol.getBondParity_0(bond) == 1 || this.mMol.getBondParity_0(bond) == 2)) {
            minConnAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
            bondAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
            for (j = 0; j < 2; j++) {
              minConnAtom[j] = this.mMol.getMaxAtoms_0();
              bondAtom[j] = this.mMol.getBondAtom_0(j, bond);
              for (k = 0; k < this.mMol.getAllConnAtoms_0(bondAtom[j]); k++) {
                connAtom = this.mMol.getConnAtom_0(bondAtom[j], k);
                if (connAtom != this.mMol.getBondAtom_0(1 - j, bond) && minConnAtom[j] > connAtom)
                  minConnAtom[j] = connAtom;
              }
            }
            dbAngle = carcc3.getAngle_2(f.mAtomX[f.mGlobalToLocalAtom[bondAtom[0]]], f.mAtomY[f.mGlobalToLocalAtom[bondAtom[0]]], f.mAtomX[f.mGlobalToLocalAtom[bondAtom[1]]], f.mAtomY[f.mGlobalToLocalAtom[bondAtom[1]]]);
            angle1 = carcc3.getAngle_2(f.mAtomX[f.mGlobalToLocalAtom[minConnAtom[0]]], f.mAtomY[f.mGlobalToLocalAtom[minConnAtom[0]]], f.mAtomX[f.mGlobalToLocalAtom[bondAtom[0]]], f.mAtomY[f.mGlobalToLocalAtom[bondAtom[0]]]);
            angle2 = carcc3.getAngle_2(f.mAtomX[f.mGlobalToLocalAtom[bondAtom[1]]], f.mAtomY[f.mGlobalToLocalAtom[bondAtom[1]]], f.mAtomX[f.mGlobalToLocalAtom[minConnAtom[1]]], f.mAtomY[f.mGlobalToLocalAtom[minConnAtom[1]]]);
            if (this.getAngleDif_0(dbAngle, angle1) < 0 ^ this.getAngleDif_0(dbAngle, angle2) < 0 ^ this.mMol.getBondParity_0(bond) == 2) {
              f.flipOneSide(bond);
            }
          }
        }
      }
    }
  };
  _.createChargeAssociation = function createChargeAssociation() {
    var atom, charge, chargeList, f, f$iterator, fragmentCharge, i, ic, ic$iterator, nc, nc$iterator, negChargeList, pc, pc$iterator, pc$iterator0, pc$iterator1, posChargeList;
    negChargeList = new ju.ArrayList();
    posChargeList = new ju.ArrayList();
    chargeList = new ju.ArrayList();
    for (f$iterator = this.mFragmentList.iterator(); f$iterator.hasNext_0(); ) {
      f = castTo(f$iterator.next_3(), 31);
      fragmentCharge = 0;
      chargeList.clear();
      for (i = 0; i < f.size_1(); i++) {
        atom = f.getGlobalAtom(i);
        charge = this.mUnPairedCharge[atom];
        if (charge != 0) {
          chargeList.add(new carcc3.InventorCharge(f, i, charge));
          fragmentCharge += charge;
        }
      }
      if (fragmentCharge != 0) {
        chargeList.sort_0(new carcc3.CoordinateInventor$lambda$0$Type());
        for (ic$iterator = chargeList.iterator(); ic$iterator.hasNext_0(); ) {
          ic = castTo(ic$iterator.next_3(), 58);
          if (fragmentCharge * ic.charge > 0) {
            charge = $wnd.Math.abs(fragmentCharge) >= $wnd.Math.abs(ic.charge) ? ic.charge : fragmentCharge;
            fragmentCharge -= charge;
            (charge < 0 ? negChargeList : posChargeList).add(new carcc3.InventorCharge(f, ic.atom, charge));
            if (fragmentCharge == 0)
              break;
          }
        }
      }
    }
    if (negChargeList.isEmpty() || posChargeList.isEmpty())
      return null;
    posChargeList.sort_0(new carcc3.CoordinateInventor$2(this));
    negChargeList.sort_0(new carcc3.CoordinateInventor$3(this));
    for (pc$iterator0 = posChargeList.iterator(); pc$iterator0.hasNext_0(); ) {
      pc = castTo(pc$iterator0.next_3(), 58);
      for (nc$iterator = negChargeList.iterator(); nc$iterator.hasNext_0(); ) {
        nc = castTo(nc$iterator.next_3(), 58);
        if (pc.charge == -nc.charge) {
          this.mUnPairedCharge[pc.fragment_0.getGlobalAtom(pc.atom)] -= pc.charge;
          this.mUnPairedCharge[nc.fragment_0.getGlobalAtom(nc.atom)] -= nc.charge;
          return new carcc3.FragmentAssociation_0(pc.fragment_0, nc.fragment_0, pc.atom, nc.atom);
        }
      }
    }
    for (pc$iterator1 = posChargeList.iterator(); pc$iterator1.hasNext_0(); ) {
      pc = castTo(pc$iterator1.next_3(), 58);
      for (nc$iterator = negChargeList.iterator(); nc$iterator.hasNext_0(); ) {
        nc = castTo(nc$iterator.next_3(), 58);
        if (pc.charge > -nc.charge) {
          this.mUnPairedCharge[pc.fragment_0.getGlobalAtom(pc.atom)] += nc.charge;
          this.mUnPairedCharge[nc.fragment_0.getGlobalAtom(nc.atom)] -= nc.charge;
          return new carcc3.FragmentAssociation_0(pc.fragment_0, nc.fragment_0, pc.atom, nc.atom);
        }
      }
    }
    for (pc$iterator = posChargeList.iterator(); pc$iterator.hasNext_0(); ) {
      pc = castTo(pc$iterator.next_3(), 58);
      for (nc$iterator = negChargeList.iterator(); nc$iterator.hasNext_0(); ) {
        nc = castTo(nc$iterator.next_3(), 58);
        if (pc.charge < -nc.charge) {
          this.mUnPairedCharge[pc.fragment_0.getGlobalAtom(pc.atom)] -= pc.charge;
          this.mUnPairedCharge[nc.fragment_0.getGlobalAtom(nc.atom)] += pc.charge;
          return new carcc3.FragmentAssociation_0(pc.fragment_0, nc.fragment_0, pc.atom, nc.atom);
        }
      }
    }
    return null;
  };
  _.createDisconnectedAssociation = function createDisconnectedAssociation() {
    if (this.mFragmentList.size() < 2)
      return null;
    return new carcc3.FragmentAssociation(castTo(this.mFragmentList.getAtIndex(0), 31), castTo(this.mFragmentList.getAtIndex(1), 31));
  };
  _.createLargeRingFragment = function createLargeRingFragment(f, ringAtom, ringBond) {
    var FIRST_RING_SIZE, LAST_RING_SIZE, bit, bondAngle, bondEConstraint, bondParity, bondZConstraint, bondZList, cAngleCorrection, cBondZList, correction, i, i0, inverted, isRightTurn, isSymmetrical, maxBit, newBondZList, rightTurns, ringIndex, rotation, tempZList, wasRightTurn, zList;
    FIRST_RING_SIZE = 9;
    LAST_RING_SIZE = 25;
    cAngleCorrection = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 2), { 4: 1, 1: 1, 7: 1 }, 11, 0, [stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [20]), null, null, stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [0, 10]), null, null, stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [-4, 12]), stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [0, 0, -7.5]), null, null, null, null, stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [60 / 7, -60 / 7]), null, null, null, stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [-2.4])]);
    cBondZList = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 2), { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 0, [stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [146]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [627]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [2457, 1170]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [2451, 8643, 2519]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [9362, 14798]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [34377, -2147448999, 26214]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [37449, 137313, 95703, 34371, 37815, 54891, 132867, -2147309741, 54857, 55129, -2147449005, -2147449065]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [530697, 531819, 899169, 137289, 694617, -2146951863, -2146952797, -2146939175, -2146929547, -2146929564, -2146625111, -2146931799, -2146940503, -2146931935]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1007293, 610915]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [542985, 137283, 2122017, 530691, 2206773, -2144711351, 219209, 2840841, 137555, -2146871031, -2147264167, 613705, -2145360543, -2146625271, 694611, 2454837, -2145356703, -2147345133, -2146928951, -2146931805, -2144641719, -2146951869, -2146625237, -2146624183, 2841963, 1074905, -2146625117, 2799955, -2144723645, 138583, 859225, -2145264843, -2145216253, -2146624149, -2144700727, -2146928917, -2143905527, -2144045771, -2146789097, 2288547, 544407, 2104323, -2146911977, -2144479405, 3633737, -2146870089, -2146952169]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [8487297, 2172633, 2116611, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8829813]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [14071213])]);
    maxBit = 1 << f.size_1();
    bondEConstraint = 0;
    bondZConstraint = 0;
    if (f.size_1() > 7) {
      for (i = 0; i < f.size_1(); i++) {
        bondParity = this.getLargeRingBondParity(ringAtom, ringBond, i);
        if (bondParity == 1)
          bondEConstraint += maxBit;
        else if (bondParity == 2)
          bondZConstraint += maxBit;
        bondEConstraint >>>= 1;
        bondZConstraint >>>= 1;
      }
    }
    ringIndex = f.size_1() - 9;
    if (f.size_1() >= 9 && f.size_1() <= 25 && jsNotEquals(cBondZList[ringIndex], null)) {
      for (zList = 0; zList < cBondZList[ringIndex].length; zList++) {
        isSymmetrical = (-2147483648 & cBondZList[ringIndex][zList]) == 0;
        bondZList = 2147483647 & cBondZList[ringIndex][zList];
        for (inverted = false; !inverted; inverted = !inverted) {
          if (inverted) {
            if (isSymmetrical)
              break;
            newBondZList = 0;
            for (bit = 1; bit != maxBit; bit <<= 1) {
              newBondZList <<= 1;
              if ((bondZList & bit) != 0)
                newBondZList |= 1;
            }
            bondZList = newBondZList;
          }
          for (rotation = 0; rotation < f.size_1(); rotation++) {
            if ((bondZList & bondEConstraint) == 0 && (~bondZList & bondZConstraint) == 0) {
              bondAngle = 0;
              correction = 3.141592653589793 / 180 * (jsEquals(cAngleCorrection[ringIndex], null) ? 0 : cAngleCorrection[ringIndex][zList]);
              rightTurns = 0;
              tempZList = bondZList;
              isRightTurn = true;
              for (i0 = 0; i0 < f.size_1(); i0++) {
                if (isRightTurn)
                  rightTurns++;
                if ((tempZList & 1) == 0)
                  isRightTurn = !isRightTurn;
                tempZList >>>= 1;
              }
              wasRightTurn = rightTurns > narrow_int(f.size_1() / 2);
              for (i = 1; i < f.size_1(); i++) {
                f.mAtomX[i] = f.mAtomX[i - 1] + $wnd.Math.sin(bondAngle);
                f.mAtomY[i] = f.mAtomY[i - 1] + $wnd.Math.cos(bondAngle);
                if ((bondZList & 1) == 0)
                  wasRightTurn = !wasRightTurn;
                bondAngle += correction + (wasRightTurn ? 3.141592653589793 / 3 : -3.141592653589793 / 3);
                bondZList >>>= 1;
              }
              return;
            }
            if ((bondZList & 1) != 0)
              bondZList |= maxBit;
            bondZList >>>= 1;
          }
        }
      }
    }
    this.createRegularRingFragment_0(f, bondEConstraint, bondZConstraint);
  };
  _.createMetalBondAssociations = function createMetalBondAssociations() {
    var associationList, atom1, atom2, atomIndex1, atomIndex2, bond, f1, f2, fa, temp;
    associationList = null;
    fa = null;
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      if (this.mMol.getBondType_0(bond) == 16) {
        atom1 = this.mMol.getBondAtom_0(0, bond);
        atomIndex1 = -1;
        f1 = 0;
        for (; f1 < this.mFragmentList.size(); f1++) {
          atomIndex1 = castTo(this.mFragmentList.getAtIndex(f1), 31).getLocalAtom(atom1);
          if (atomIndex1 != -1)
            break;
        }
        atom2 = this.mMol.getBondAtom_0(1, bond);
        atomIndex2 = -1;
        f2 = 0;
        for (; f2 < this.mFragmentList.size(); f2++) {
          atomIndex2 = castTo(this.mFragmentList.getAtIndex(f2), 31).getLocalAtom(atom2);
          if (atomIndex2 != -1)
            break;
        }
        if (f1 != f2) {
          if (f1 > f2) {
            temp = f1;
            f1 = f2;
            f2 = temp;
            temp = atomIndex1;
            atomIndex1 = atomIndex2;
            atomIndex2 = temp;
          }
          if (jsEquals(fa, null))
            fa = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_coords_FragmentAssociation_2_classLit, { 4: 1, 1: 1, 7: 1 }, 834, this.mFragmentList.size(), 0, 2);
          if (jsEquals(fa[f2], null))
            setCheck(fa, f2, initUnidimensionalArray(cggl.Lcom_actelion_research_chem_coords_FragmentAssociation_2_classLit, { 834: 1, 4: 1, 1: 1, 7: 1 }, 115, f2, 0, 1));
          if (isNotNull(fa[f2][f1]))
            fa[f2][f1].add_6(atomIndex1, atomIndex2);
          else {
            setCheck(fa[f2], f1, new carcc3.FragmentAssociation_0(castTo(this.mFragmentList.getAtIndex(f1), 31), castTo(this.mFragmentList.getAtIndex(f2), 31), atomIndex1, atomIndex2));
            if (isNull(associationList))
              associationList = new ju.ArrayList();
            associationList.add(fa[f2][f1]);
          }
        }
      }
    }
    return associationList;
  };
  _.createRegularRingFragment = function createRegularRingFragment(f) {
    var angleChange, i;
    angleChange = 3.141592653589793 - 3.141592653589793 * (f.size_1() - 2) / f.size_1();
    for (i = 1; i < f.size_1(); i++) {
      f.mAtomX[i] = f.mAtomX[i - 1] + $wnd.Math.sin(angleChange * (i - 1));
      f.mAtomY[i] = f.mAtomY[i - 1] + $wnd.Math.cos(angleChange * (i - 1));
    }
  };
  _.createRegularRingFragment_0 = function createRegularRingFragment_0(f, bondEConstraint, bondZConstraint) {
    var angleChange, bitMinus1, bitMinus2, bitPlus1, currentBit, i, i0, i1, index_0, moveToCenter, offset, priority, shift_0, startIndex, startPriority;
    if (bondEConstraint == 0 || (bondEConstraint & bondZConstraint) != 0) {
      this.createRegularRingFragment(f);
      return;
    }
    startIndex = -1;
    startPriority = 0;
    bitMinus2 = 1 << f.size_1() - 2;
    bitMinus1 = 1 << f.size_1() - 1;
    currentBit = 1;
    bitPlus1 = 2;
    for (i0 = 0; i0 < f.size_1(); i0++) {
      if ((bondZConstraint & (bitMinus1 | currentBit)) == 0 && (bondEConstraint & (bitMinus1 | currentBit)) != 0 && (bondEConstraint & bitMinus2) == 0) {
        priority = 0;
        if ((bondZConstraint & bitMinus2) != 0)
          priority += 4;
        if ((bondEConstraint & bitMinus1) != 0)
          priority += 2;
        if ((bondEConstraint & currentBit) != 0)
          priority += 1;
        if (startPriority < priority) {
          startPriority = priority;
          startIndex = i0;
        }
      }
      bitMinus2 = bitMinus1;
      bitMinus1 = currentBit;
      currentBit = bitPlus1;
      bitPlus1 = 1 << (i0 + 2 < f.size_1() ? i0 + 2 : i0 + 2 - f.size_1());
    }
    if (startIndex == -1) {
      this.createRegularRingFragment(f);
      return;
    }
    moveToCenter = 0;
    moveToCenter |= 1 << startIndex;
    offset = 2;
    while (offset < f.size_1() - 1) {
      index_0 = startIndex + offset < f.size_1() ? startIndex + offset : startIndex + offset - f.size_1();
      bitMinus1 = 1 << (index_0 == 0 ? f.size_1() - 1 : index_0 - 1);
      if ((bondZConstraint & bitMinus1) != 0) {
        offset++;
        continue;
      }
      currentBit = 1 << index_0;
      if ((bondEConstraint & bitMinus1) != 0) {
        if ((bondZConstraint & currentBit) != 0) {
          this.createRegularRingFragment(f);
          return;
        }
        moveToCenter |= currentBit;
        offset += 2;
        continue;
      }
      bitPlus1 = 1 << (index_0 + 1 < f.size_1() ? index_0 + 1 : index_0 + 1 - f.size_1());
      if ((bondEConstraint & currentBit) != 0 && (bondZConstraint & bitPlus1) != 0) {
        moveToCenter |= currentBit;
        offset += 3;
        continue;
      }
      offset++;
    }
    if (moveToCenter == 0) {
      this.createRegularRingFragment(f);
      return;
    }
    angleChange = 3.141592653589793 - 3.141592653589793 * (f.size_1() - 2) / f.size_1();
    for (i1 = 1; i1 < f.size_1(); i1++) {
      f.mAtomX[i1] = f.mAtomX[i1 - 1] + $wnd.Math.sin(angleChange * (i1 - 1));
      f.mAtomY[i1] = f.mAtomY[i1 - 1] + $wnd.Math.cos(angleChange * (i1 - 1));
    }
    currentBit = 1;
    shift_0 = 2 * $wnd.Math.sin(angleChange / 2);
    for (i = 0; i < f.size_1(); i++) {
      if ((moveToCenter & currentBit) != 0) {
        f.mAtomX[i] += shift_0 * $wnd.Math.cos(angleChange * (i - 0.5));
        f.mAtomY[i] -= shift_0 * $wnd.Math.sin(angleChange * (i - 0.5));
      }
      currentBit <<= 1;
    }
  };
  _.getAngleDif_0 = function getAngleDif_0(angle1, angle2) {
    var angleDif;
    angleDif = angle1 - angle2;
    while (angleDif < -3.141592653589793)
      angleDif += 2 * 3.141592653589793;
    while (angleDif > 3.141592653589793)
      angleDif -= 2 * 3.141592653589793;
    return angleDif;
  };
  _.getConnAtoms_1 = function getConnAtoms_0(f, atom) {
    var connAtoms, i;
    connAtoms = 0;
    for (i = 0; i < this.mMol.getAllConnAtoms_0(atom); i++) {
      if (f.isMember_0(this.mMol.getConnAtom_0(atom, i)))
        connAtoms++;
    }
    return connAtoms;
  };
  _.getFusedFragment = function getFusedFragment(f1, f2, commonAtom) {
    var angle1, angle2, angleInc, index1, index2;
    index1 = f1.getLocalAtom(commonAtom);
    index2 = f2.getLocalAtom(commonAtom);
    f2.translate(f1.mAtomX[index1] - f2.mAtomX[index2], f1.mAtomY[index1] - f2.mAtomY[index2]);
    angle1 = this.suggestNewBondAngle(f1, commonAtom);
    angle2 = this.suggestNewBondAngle(f2, commonAtom);
    angleInc = 0;
    if (this.getConnAtoms_1(f1, commonAtom) == 1 && this.getConnAtoms_1(f2, commonAtom) == 1)
      angleInc = 3.141592653589793 / 3;
    f2.rotate_0(f2.mAtomX[index2], f2.mAtomY[index2], angle1 - angle2 + angleInc + 3.141592653589793);
    return this.getMergedFragment(f1, f2, 1);
  };
  _.getFusedFragment_0 = function getFusedFragment_0(f1, f2, commonAtom, commonAtoms) {
    var angleDif, angleDifFlip, connAtom, connIndex, f1Angle, f1NeighbourAngle, f2Angle, f2NeighbourAngle, f2NeighbourAngleFlip, i, i0, i1, i2, i3, index1, index2, j, meanAngleDif, meanAngleDifFlip, meanNeighbourAngleF1, meanNeighbourAngleF2, meanNeighbourAngleF2Flip, meanX1, meanX2, meanY1, meanY2, neighbourAngle, neighbourCountF1, neighbourCountF2;
    index1 = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, commonAtoms, 15, 1);
    index2 = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, commonAtoms, 15, 1);
    for (i0 = 0; i0 < commonAtoms; i0++) {
      index1[i0] = f1.getLocalAtom(commonAtom[i0]);
      index2[i0] = f2.getLocalAtom(commonAtom[i0]);
    }
    meanX1 = 0;
    meanY1 = 0;
    meanX2 = 0;
    meanY2 = 0;
    for (i1 = 0; i1 < commonAtoms; i1++) {
      meanX1 += f1.mAtomX[index1[i1]];
      meanY1 += f1.mAtomY[index1[i1]];
      meanX2 += f2.mAtomX[index2[i1]];
      meanY2 += f2.mAtomY[index2[i1]];
    }
    meanX1 /= commonAtoms;
    meanY1 /= commonAtoms;
    meanX2 /= commonAtoms;
    meanY2 /= commonAtoms;
    f2.translate(meanX1 - meanX2, meanY1 - meanY2);
    f1Angle = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_coords_InventorAngle_2_classLit, { 4: 1, 1: 1, 7: 1 }, 45, commonAtoms, 0, 1);
    f2Angle = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_coords_InventorAngle_2_classLit, { 4: 1, 1: 1, 7: 1 }, 45, commonAtoms, 0, 1);
    angleDif = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_coords_InventorAngle_2_classLit, { 4: 1, 1: 1, 7: 1 }, 45, commonAtoms, 0, 1);
    angleDifFlip = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_coords_InventorAngle_2_classLit, { 4: 1, 1: 1, 7: 1 }, 45, commonAtoms, 0, 1);
    for (i2 = 0; i2 < commonAtoms; i2++) {
      setCheck(f1Angle, i2, new carcc3.InventorAngle_0(meanX1, meanY1, f1.mAtomX[index1[i2]], f1.mAtomY[index1[i2]]));
      setCheck(f2Angle, i2, new carcc3.InventorAngle_0(meanX1, meanY1, f2.mAtomX[index2[i2]], f2.mAtomY[index2[i2]]));
      setCheck(angleDif, i2, new carcc3.InventorAngle(f1Angle[i2].mAngle - f2Angle[i2].mAngle, f1Angle[i2].mLength * f2Angle[i2].mLength));
      setCheck(angleDifFlip, i2, new carcc3.InventorAngle(f1Angle[i2].mAngle + f2Angle[i2].mAngle, f1Angle[i2].mLength * f2Angle[i2].mLength));
    }
    meanAngleDif = carcc3.getMeanAngle(angleDif, commonAtoms);
    meanAngleDifFlip = carcc3.getMeanAngle(angleDifFlip, commonAtoms);
    neighbourCountF1 = 0;
    neighbourCountF2 = 0;
    for (i3 = 0; i3 < commonAtoms; i3++) {
      for (j = 0; j < this.mMol.getAllConnAtoms_0(commonAtom[i3]); j++) {
        connAtom = this.mMol.getConnAtom_0(commonAtom[i3], j);
        if (f1.isMember_0(connAtom) && !f2.isMember_0(connAtom))
          neighbourCountF1++;
        if (!f1.isMember_0(connAtom) && f2.isMember_0(connAtom))
          neighbourCountF2++;
      }
    }
    f1NeighbourAngle = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_coords_InventorAngle_2_classLit, { 4: 1, 1: 1, 7: 1 }, 45, neighbourCountF1, 0, 1);
    f2NeighbourAngle = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_coords_InventorAngle_2_classLit, { 4: 1, 1: 1, 7: 1 }, 45, neighbourCountF2, 0, 1);
    f2NeighbourAngleFlip = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_coords_InventorAngle_2_classLit, { 4: 1, 1: 1, 7: 1 }, 45, neighbourCountF2, 0, 1);
    neighbourCountF1 = 0;
    neighbourCountF2 = 0;
    for (i = 0; i < commonAtoms; i++) {
      for (j = 0; j < this.mMol.getAllConnAtoms_0(commonAtom[i]); j++) {
        connAtom = this.mMol.getConnAtom_0(commonAtom[i], j);
        if (f1.isMember_0(connAtom) && !f2.isMember_0(connAtom)) {
          connIndex = f1.getLocalAtom(connAtom);
          setCheck(f1NeighbourAngle, neighbourCountF1, new carcc3.InventorAngle_0(f1.mAtomX[index1[i]], f1.mAtomY[index1[i]], f1.mAtomX[connIndex], f1.mAtomY[connIndex]));
          neighbourCountF1++;
        }
        if (!f1.isMember_0(connAtom) && f2.isMember_0(connAtom)) {
          connIndex = f2.getLocalAtom(connAtom);
          neighbourAngle = new carcc3.InventorAngle_0(f2.mAtomX[index2[i]], f2.mAtomY[index2[i]], f2.mAtomX[connIndex], f2.mAtomY[connIndex]);
          setCheck(f2NeighbourAngle, neighbourCountF2, new carcc3.InventorAngle(meanAngleDif.mAngle + neighbourAngle.mAngle, neighbourAngle.mLength));
          setCheck(f2NeighbourAngleFlip, neighbourCountF2, new carcc3.InventorAngle(meanAngleDifFlip.mAngle - neighbourAngle.mAngle, neighbourAngle.mLength));
          neighbourCountF2++;
        }
      }
    }
    meanNeighbourAngleF1 = carcc3.getMeanAngle(f1NeighbourAngle, neighbourCountF1);
    meanNeighbourAngleF2 = carcc3.getMeanAngle(f2NeighbourAngle, neighbourCountF2);
    meanNeighbourAngleF2Flip = carcc3.getMeanAngle(f2NeighbourAngleFlip, neighbourCountF2);
    if ($wnd.Math.abs(this.getAngleDif_0(meanNeighbourAngleF1.mAngle, meanNeighbourAngleF2.mAngle)) > $wnd.Math.abs(this.getAngleDif_0(meanNeighbourAngleF1.mAngle, meanNeighbourAngleF2Flip.mAngle))) {
      f2.rotate_0(meanX1, meanY1, meanAngleDif.mAngle);
    } else {
      f2.flip(meanX1, meanY1, 0);
      f2.rotate_0(meanX1, meanY1, meanAngleDifFlip.mAngle);
    }
    return this.getMergedFragment(f1, f2, commonAtoms);
  };
  _.getLargeRingBondParity = function getLargeRingBondParity(ringAtom, ringBond, index_0) {
    var bondParity, higherIndex, highestIndex, lowerIndex, sharedRing1, sharedRing2;
    higherIndex = index_0 == ringAtom.length - 1 ? 0 : index_0 + 1;
    lowerIndex = index_0 == 0 ? ringAtom.length - 1 : index_0 - 1;
    highestIndex = higherIndex == ringAtom.length - 1 ? 0 : higherIndex + 1;
    if (this.mMol.getBondOrder_0(ringBond[index_0]) == 2) {
      bondParity = this.mMol.getBondParity_0(ringBond[index_0]);
      if (bondParity == 1 || bondParity == 2) {
        if (this.isLowestIndexNeighbour(ringAtom[lowerIndex], ringAtom[index_0], ringAtom[higherIndex]) ^ this.isLowestIndexNeighbour(ringAtom[highestIndex], ringAtom[higherIndex], ringAtom[index_0]))
          bondParity = bondParity == 1 ? 2 : 1;
        return bondParity;
      }
    }
    if (this.mMol.isSmallRingBond_0(ringBond[index_0])) {
      sharedRing1 = this.mMol.getRingSet_0().getSharedRing_0(ringBond[lowerIndex], ringBond[index_0]);
      sharedRing2 = this.mMol.getRingSet_0().getSharedRing_0(ringBond[higherIndex], ringBond[index_0]);
      if (sharedRing1 != -1 || sharedRing2 != -1)
        return sharedRing1 == sharedRing2 ? 2 : 1;
      return 2;
    }
    return 0;
  };
  _.getLongestUnhandledChain = function getLongestUnhandledChain(atom) {
    var candidate, current, graphAtom, graphBond, graphLevel, graphParent, highest, i, index_0, j, theBond, theChain;
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    graphBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    graphLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    graphParent = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    graphAtom[0] = atom;
    graphLevel[atom] = 1;
    graphParent[0] = -1;
    current = 0;
    highest = 0;
    while (current <= highest) {
      if (current == 0 || !this.mAtomHandled[graphAtom[current]]) {
        for (i = 0; i < this.mMol.getAllConnAtoms_0(graphAtom[current]); i++) {
          candidate = this.mMol.getConnAtom_0(graphAtom[current], i);
          theBond = this.mMol.getConnBond_0(graphAtom[current], i);
          if (graphLevel[candidate] == 0 && !this.mBondHandled[theBond]) {
            graphAtom[++highest] = candidate;
            graphBond[highest] = theBond;
            graphLevel[candidate] = graphLevel[graphAtom[current]] + 1;
            graphParent[highest] = current;
          }
        }
      }
      if (current == highest) {
        theChain = new carcc3.InventorChain(graphLevel[graphAtom[current]]);
        index_0 = current;
        for (j = 0; j < theChain.getChainLength(); j++) {
          theChain.mAtom[j] = graphAtom[index_0];
          theChain.mBond[j] = graphBond[index_0];
          index_0 = graphParent[index_0];
        }
        return theChain;
      }
      current++;
    }
    return null;
  };
  _.getMaxPriorityAssociation = function getMaxPriorityAssociation(associationList) {
    var association, association$iterator, maxFA, maxPriority;
    maxPriority = 0;
    maxFA = null;
    for (association$iterator = associationList.iterator(); association$iterator.hasNext_0(); ) {
      association = castTo(association$iterator.next_3(), 115);
      if (maxPriority < association.getPriority()) {
        maxPriority = association.getPriority();
        maxFA = association;
      }
    }
    return maxFA;
  };
  _.getMergedFragment = function getMergedFragment(f1, f2, commonAtoms) {
    var count, f, i, i0, index_0;
    f = new carcc3.InventorFragment(this.mMol, f1.mGlobalAtom.length + f2.mGlobalAtom.length - commonAtoms, f1.mKeepMarkedAtoms | f2.mKeepMarkedAtoms);
    count = 0;
    for (i0 = 0; i0 < f1.mGlobalAtom.length; i0++) {
      f.mGlobalAtom[count] = f1.mGlobalAtom[i0];
      f.mPriority[count] = f1.mPriority[i0];
      f.mAtomX[count] = f1.mAtomX[i0];
      f.mAtomY[count++] = f1.mAtomY[i0];
    }
    for (i = 0; i < f2.mGlobalAtom.length; i++) {
      index_0 = f1.getLocalAtom(f2.mGlobalAtom[i]);
      if (index_0 == -1) {
        f.mGlobalAtom[count] = f2.mGlobalAtom[i];
        f.mPriority[count] = f2.mPriority[i];
        f.mAtomX[count] = f2.mAtomX[i];
        f.mAtomY[count++] = f2.mAtomY[i];
      } else {
        if (f.mPriority[index_0] < f2.mPriority[i]) {
          f.mPriority[index_0] = f2.mPriority[i];
          f.mAtomX[index_0] = f2.mAtomX[i];
          f.mAtomY[index_0] = f2.mAtomY[i];
        }
      }
    }
    return f;
  };
  _.getShortestConnection = function getShortestConnection(atom1, atom2) {
    var bondSequence, candidate, chainLength, current, graphAtom, graphBond, graphLevel, graphParent, highest, i, j, theBond;
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    graphBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    graphLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    graphParent = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    graphAtom[0] = atom2;
    graphLevel[atom2] = 1;
    graphParent[0] = -1;
    current = 0;
    highest = 0;
    while (current <= highest) {
      for (i = 0; i < this.mMol.getAllConnAtoms_0(graphAtom[current]); i++) {
        candidate = this.mMol.getConnAtom_0(graphAtom[current], i);
        theBond = this.mMol.getConnBond_0(graphAtom[current], i);
        if (candidate == atom1) {
          chainLength = graphLevel[graphAtom[current]];
          bondSequence = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, chainLength, 15, 1);
          bondSequence[0] = theBond;
          for (j = 1; j < chainLength; j++) {
            bondSequence[j] = graphBond[current];
            current = graphParent[current];
          }
          return bondSequence;
        }
        if (graphLevel[candidate] == 0) {
          graphAtom[++highest] = candidate;
          graphBond[highest] = theBond;
          graphLevel[candidate] = graphLevel[graphAtom[current]] + 1;
          graphParent[highest] = current;
        }
      }
      if (current == highest)
        return null;
      current++;
    }
    return null;
  };
  _.getSmallestRingFromBond = function getSmallestRingFromBond(bond) {
    var atom1, atom2, candidate, current, graphAtom, graphBond, graphLevel, graphParent, highest, i, index_0, j, theRing;
    atom1 = this.mMol.getBondAtom_0(0, bond);
    atom2 = this.mMol.getBondAtom_0(1, bond);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    graphBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    graphLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    graphParent = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    graphAtom[0] = atom1;
    graphAtom[1] = atom2;
    graphBond[1] = bond;
    graphLevel[atom1] = 1;
    graphLevel[atom2] = 2;
    graphParent[0] = -1;
    graphParent[1] = 0;
    current = 1;
    highest = 1;
    while (current <= highest) {
      for (i = 0; i < this.mMol.getConnAtoms_0(graphAtom[current]); i++) {
        candidate = this.mMol.getConnAtom_0(graphAtom[current], i);
        if (current > 1 && candidate == atom1) {
          theRing = new carcc3.InventorChain(graphLevel[graphAtom[current]]);
          graphBond[0] = this.mMol.getConnBond_0(graphAtom[current], i);
          index_0 = current;
          for (j = 0; j < theRing.getChainLength(); j++) {
            theRing.mAtom[j] = graphAtom[index_0];
            theRing.mBond[j] = graphBond[index_0];
            index_0 = graphParent[index_0];
          }
          return theRing;
        }
        if (graphLevel[candidate] == 0 && this.mMol.isRingAtom_0(candidate)) {
          graphAtom[++highest] = candidate;
          graphBond[highest] = this.mMol.getConnBond_0(graphAtom[current], i);
          graphLevel[candidate] = graphLevel[graphAtom[current]] + 1;
          graphParent[highest] = current;
        }
      }
      current++;
    }
    return null;
  };
  _.getSmallestRingSize = function getSmallestRingSize(atom1, atom2, atom3) {
    var candidate, current, graphAtom, graphLevel, highest, i;
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    graphLevel = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    graphAtom[0] = atom2;
    graphAtom[1] = atom1;
    graphLevel[atom2] = 1;
    graphLevel[atom1] = 2;
    current = 1;
    highest = 1;
    while (current <= highest) {
      for (i = 0; i < this.mMol.getConnAtoms_0(graphAtom[current]); i++) {
        candidate = this.mMol.getConnAtom_0(graphAtom[current], i);
        if (candidate == atom3)
          return 1 + graphLevel[graphAtom[current]];
        if (graphLevel[candidate] == 0 && this.mMol.isRingAtom_0(candidate)) {
          graphAtom[++highest] = candidate;
          graphLevel[candidate] = graphLevel[graphAtom[current]] + 1;
        }
      }
      current++;
    }
    return 0;
  };
  _.invent = function invent(mol) {
    this.invent_0(mol, null);
  };
  _.invent_0 = function invent_0(mol, ffp) {
    var atom, f, f$iterator, f$iterator0, j, paritiesPresent, parityState;
    paritiesPresent = (mol.getHelperArrayStatus_0() & 15) != 0;
    parityState = mol.getHelperArrayStatus_0() & 248;
    if (isNull(this.mRandom))
      this.mRandom = new ju.Random();
    if ((this.mMode & 2) != 0)
      mol.removeExplicitHydrogens_0(false);
    this.mMol = mol;
    this.mMol.ensureHelperArrays_0(7);
    this.mFFP = ffp;
    this.mFragmentList = new carcc3.CoordinateInventor$1(this);
    this.mAtomHandled = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 16, 1);
    this.mBondHandled = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllBonds_0(), 16, 1);
    this.mUnPairedCharge = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++)
      this.mUnPairedCharge[atom] = this.mMol.getAtomCharge_0(atom);
    if ((this.mMode & 12) != 0) {
      this.locateMarkedFragments();
    }
    if (isNotNull(this.mCustomTemplateList))
      this.mAtomIsPartOfCustomTemplate = this.locateTemplateFragments(this.mCustomTemplateList, 512);
    if ((this.mMode & 1) == 0 && isNotNull(carcc3.sDefaultTemplateList))
      this.locateTemplateFragments(carcc3.sDefaultTemplateList, 256);
    this.locateInitialFragments();
    this.joinOverlappingFragments();
    this.locateChainFragments();
    this.joinOverlappingFragments();
    for (f$iterator0 = this.mFragmentList.iterator(); f$iterator0.hasNext_0(); ) {
      f = castTo(f$iterator0.next_3(), 31);
      f.locateBonds();
    }
    this.correctChainEZParities();
    this.optimizeFragments();
    this.locateSingleAtoms();
    this.joinMetalBondedFragments();
    this.joinChargedFragments();
    this.joinRemainingFragments();
    for (f$iterator = this.mFragmentList.iterator(); f$iterator.hasNext_0(); ) {
      f = castTo(f$iterator.next_3(), 31);
      for (j = 0; j < f.size_1(); j++) {
        this.mMol.setAtomX_0(f.mGlobalAtom[j], f.mAtomX[j]);
        this.mMol.setAtomY_0(f.mGlobalAtom[j], f.mAtomY[j]);
        this.mMol.setAtomZ_0(f.mGlobalAtom[j], 0);
      }
    }
    if (paritiesPresent) {
      this.mMol.setParitiesValid_0(parityState);
      this.mMol.setStereoBondsFromParity_0();
    }
    if (this.mAbsoluteOrientationTemplateFound)
      this.mMol.removeAtomMarkers_0();
  };
  _.isLowestIndexNeighbour = function isLowestIndexNeighbour(atom, rootAtom, excludeAtom) {
    var connAtom, i;
    for (i = 0; i < this.mMol.getConnAtoms_0(rootAtom); i++) {
      connAtom = this.mMol.getConnAtom_0(rootAtom, i);
      if (connAtom != excludeAtom && connAtom < atom)
        return false;
    }
    return true;
  };
  _.joinAssociatedFragments = function joinAssociatedFragments(association, minDistance) {
    var mergedFragment;
    association.arrange(minDistance, (this.mMode & 12) != 0);
    mergedFragment = this.getMergedFragment(association.getFragment_0(0), association.getFragment_0(1), 0);
    this.updateFragmentList(association.getFragment_0(0), association.getFragment_0(1), mergedFragment);
  };
  _.joinChargedFragments = function joinChargedFragments() {
    var association;
    association = this.createChargeAssociation();
    while (isNotNull(association)) {
      this.joinAssociatedFragments(association, 1.399999976158142);
      association = this.createChargeAssociation();
    }
  };
  _.joinFragments = function joinFragments(f1, f2, commonAtoms) {
    var commonAtom, count, i, j, joinedFragment;
    commonAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, commonAtoms, 15, 1);
    count = 0;
    for (i = 0; i < f1.mGlobalAtom.length; i++)
      for (j = 0; j < f2.mGlobalAtom.length; j++)
        if (f1.mGlobalAtom[i] == f2.mGlobalAtom[j])
          commonAtom[count++] = f1.mGlobalAtom[i];
    joinedFragment = commonAtoms == 1 ? this.getFusedFragment(f1, f2, commonAtom[0]) : this.getFusedFragment_0(f1, f2, commonAtom, commonAtoms);
    this.updateFragmentList(f1, f2, joinedFragment);
  };
  _.joinMetalBondedFragments = function joinMetalBondedFragments() {
    var association, associationList;
    associationList = this.createMetalBondAssociations();
    while (isNotNull(associationList)) {
      association = this.getMaxPriorityAssociation(associationList);
      this.joinAssociatedFragments(association, 1.2000000476837158);
      associationList = this.createMetalBondAssociations();
    }
  };
  _.joinOverlappingFragments = function joinOverlappingFragments() {
    var commonAtom, commonAtoms, f1, f2, handlePreferred, i, j, joinPriority, k, k0, k1, l, maxCommonAtoms, maxF1Priority, maxF2Priority, maxFragment1, maxFragment2, maxJoinPriority;
    while (true) {
      maxJoinPriority = 0;
      maxCommonAtoms = 0;
      maxFragment1 = null;
      maxFragment2 = null;
      for (i = 1; i < this.mFragmentList.size(); i++) {
        f1 = castTo(this.mFragmentList.getAtIndex(i), 31);
        for (j = 0; j < i; j++) {
          f2 = castTo(this.mFragmentList.getAtIndex(j), 31);
          commonAtom = 0;
          commonAtoms = 0;
          maxF1Priority = 0;
          maxF2Priority = 0;
          for (k0 = 0; k0 < f1.size_1(); k0++) {
            for (l = 0; l < f2.size_1(); l++) {
              if (f1.mGlobalAtom[k0] == f2.mGlobalAtom[l]) {
                commonAtoms++;
                commonAtom = f1.mGlobalAtom[k0];
                if (maxF1Priority < f1.mPriority[k0])
                  maxF1Priority = f1.mPriority[k0];
                if (maxF2Priority < f2.mPriority[l])
                  maxF2Priority = f2.mPriority[l];
              }
            }
          }
          if (commonAtoms > 0) {
            handlePreferred = commonAtoms == 1 && this.getConnAtoms_1(f1, commonAtom) == 1 && this.getConnAtoms_1(f2, commonAtom) == 1 ? 0 : 1;
            if (maxF1Priority > maxF2Priority)
              joinPriority = (handlePreferred << 24) + (maxF1Priority << 16) + (maxF2Priority << 8) + commonAtoms;
            else
              joinPriority = (handlePreferred << 24) + (maxF2Priority << 16) + (maxF1Priority << 8) + commonAtoms;
            if (maxJoinPriority < joinPriority) {
              maxJoinPriority = joinPriority;
              maxCommonAtoms = commonAtoms;
              maxF1Priority = 0;
              maxF2Priority = 0;
              for (k1 = 0; k1 < f1.size_1(); k1++)
                if (maxF1Priority < f1.mPriority[k1])
                  maxF1Priority = f1.mPriority[k1];
              for (k = 0; k < f2.size_1(); k++)
                if (maxF2Priority < f2.mPriority[k])
                  maxF2Priority = f2.mPriority[k];
              if (maxF1Priority > maxF2Priority) {
                maxFragment1 = f1;
                maxFragment2 = f2;
              } else {
                maxFragment1 = f2;
                maxFragment2 = f1;
              }
            }
          }
        }
      }
      if (maxJoinPriority == 0)
        break;
      if (maxCommonAtoms == maxFragment1.size_1())
        this.mFragmentList.remove(maxFragment1);
      else if (maxCommonAtoms == maxFragment2.size_1())
        this.mFragmentList.remove(maxFragment2);
      else
        this.joinFragments(maxFragment1, maxFragment2, maxCommonAtoms);
    }
  };
  _.joinRemainingFragments = function joinRemainingFragments() {
    var association;
    association = this.createDisconnectedAssociation();
    while (isNotNull(association)) {
      this.joinAssociatedFragments(association, 1.600000023841858);
      association = this.createDisconnectedAssociation();
    }
  };
  _.locateChainFragments = function locateChainFragments() {
    var atom, f, i, i0, longestChain, theChain, unhandledBonds;
    while (true) {
      longestChain = null;
      for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
        unhandledBonds = 0;
        for (i0 = 0; i0 < this.mMol.getAllConnAtoms_0(atom); i0++)
          if (!this.mBondHandled[this.mMol.getConnBond_0(atom, i0)])
            unhandledBonds++;
        if (unhandledBonds == 1) {
          theChain = this.getLongestUnhandledChain(atom);
          if (isNull(longestChain) || theChain.getChainLength() > longestChain.getChainLength())
            longestChain = theChain;
        }
      }
      if (isNull(longestChain))
        break;
      f = new carcc3.InventorFragment(this.mMol, longestChain.getChainLength(), false);
      for (i = 0; i < longestChain.getChainLength(); i++) {
        this.mAtomHandled[longestChain.mAtom[i]] = true;
        if (i < longestChain.getChainLength() - 1)
          this.mBondHandled[longestChain.mBond[i]] = true;
        f.mGlobalAtom[i] = longestChain.mAtom[i];
        f.mAtomX[i] = $wnd.Math.cos(3.141592653589793 / 6) * i;
        f.mAtomY[i] = (i & 1) == 1 ? 0 : 0.5;
        f.mPriority[i] = 128 + longestChain.getChainLength();
      }
      this.mFragmentList.add(f);
    }
  };
  _.locateFlipBonds = function locateFlipBonds(bondFlipPriority, atomSymRank) {
    var atom1, atom2, bond, bondAtom, connAtom, connSymRank, i, j, oneBondEndIsSymmetric, symmetricEndFound;
    for (bond = 0; bond < this.mMol.getAllBonds_0(); bond++) {
      atom1 = this.mMol.getBondAtom_0(0, bond);
      atom2 = this.mMol.getBondAtom_0(1, bond);
      if (this.mMol.isRingBond_0(bond) || this.mMol.getBondOrder_0(bond) != 1 || this.mMol.getAllConnAtoms_0(atom1) == 1 || this.mMol.getAllConnAtoms_0(atom2) == 1)
        continue;
      if ((this.mMode & 4) != 0 && this.mMol.isMarkedAtom_0(atom1) && this.mMol.isMarkedAtom_0(atom2))
        continue;
      oneBondEndIsSymmetric = false;
      for (i = 0; i < 2; i++) {
        bondAtom = this.mMol.getBondAtom_0(i, bond);
        if (this.mMol.getAllConnAtoms_0(bondAtom) > 2) {
          symmetricEndFound = true;
          connSymRank = -1;
          for (j = 0; j < this.mMol.getAllConnAtoms_0(bondAtom); j++) {
            connAtom = this.mMol.getConnAtom_0(bondAtom, j);
            if (connAtom != this.mMol.getBondAtom_0(1 - i, bond)) {
              if (connSymRank == -1)
                connSymRank = atomSymRank[connAtom];
              else if (connSymRank != atomSymRank[connAtom])
                symmetricEndFound = false;
            }
          }
          if (symmetricEndFound) {
            oneBondEndIsSymmetric = true;
            break;
          }
        }
      }
      if (!oneBondEndIsSymmetric) {
        if ((this.mMode & 8) != 0 && this.mMol.isMarkedAtom_0(atom1) && this.mMol.isMarkedAtom_0(atom2))
          bondFlipPriority[bond] = 1;
        else
          bondFlipPriority[bond] = 2;
      }
    }
  };
  _.locateInitialFragments = function locateInitialFragments() {
    var alleneAtom, atom, atom0, atom1, atom2, bond, bond0, bond1, connAtom, count, current, f, found, i, i0, i1, isElementaryRing, j, j0, j1, last, members, nextIndex, primaryConnAtom, primaryConnBond, primaryConns, ringAtom, ringBond, ringNo, ringSet, ringSize, skipRing, temp, theRing;
    for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
      if (this.mMol.getAllConnAtoms_0(atom0) > 4) {
        f = new carcc3.InventorFragment(this.mMol, 1 + this.mMol.getAllConnAtoms_0(atom0), false);
        f.mAtomX[this.mMol.getAllConnAtoms_0(atom0)] = 0;
        f.mAtomY[this.mMol.getAllConnAtoms_0(atom0)] = 0;
        f.mPriority[this.mMol.getAllConnAtoms_0(atom0)] = 32;
        f.mGlobalAtom[this.mMol.getAllConnAtoms_0(atom0)] = atom0;
        this.mAtomHandled[atom0] = true;
        for (i = 0; i < this.mMol.getAllConnAtoms_0(atom0); i++) {
          connAtom = this.mMol.getConnAtom_0(atom0, i);
          f.mAtomX[i] = $wnd.Math.sin(3.141592653589793 / 3 * i - 3.141592653589793 / 3 * 2);
          f.mAtomY[i] = $wnd.Math.cos(3.141592653589793 / 3 * i - 3.141592653589793 / 3 * 2);
          f.mPriority[i] = 32;
          f.mGlobalAtom[i] = connAtom;
          this.mAtomHandled[connAtom] = true;
          this.mBondHandled[this.mMol.getConnBond_0(atom0, i)] = true;
        }
        this.mFragmentList.add(f);
      }
    }
    ringSet = this.mMol.getRingSet_0();
    for (ringNo = 0; ringNo < ringSet.getSize_0(); ringNo++) {
      ringSize = ringSet.getRingSize_0(ringNo);
      ringAtom = ringSet.getRingAtoms_0(ringNo);
      skipRing = false;
      if ((this.mMode & 12) != 0) {
        skipRing = true;
        for (i = 0; i < ringSize; i++) {
          if (!this.mMol.isMarkedAtom_0(ringAtom[i])) {
            skipRing = false;
            break;
          }
        }
      }
      if (!skipRing) {
        isElementaryRing = false;
        for (i0 = 0; i0 < ringSize; i0++) {
          if (this.mMol.getAtomRingSize_0(ringAtom[i0]) == ringSize) {
            isElementaryRing = true;
            break;
          }
        }
        if (isElementaryRing) {
          ringBond = ringSet.getRingBonds_0(ringNo);
          this.addRingFragment(ringAtom, ringBond);
          for (i = 0; i < ringSize; i++) {
            this.mAtomHandled[ringAtom[i]] = true;
            this.mBondHandled[ringBond[i]] = true;
          }
        }
      }
    }
    for (bond0 = 0; bond0 < this.mMol.getBonds_0(); bond0++) {
      if (this.mMol.isRingBond_0(bond0) && !this.mBondHandled[bond0]) {
        theRing = this.getSmallestRingFromBond(bond0);
        ringAtom = theRing.getRingAtoms_1();
        ringBond = theRing.getRingBonds_2();
        this.addRingFragment(ringAtom, ringBond);
        for (i = 0; i < theRing.getChainLength(); i++) {
          this.mAtomHandled[ringAtom[i]] = true;
          this.mBondHandled[ringBond[i]] = true;
        }
      }
    }
    for (bond1 = 0; bond1 < this.mMol.getAllBonds_0(); bond1++) {
      if (!this.mBondHandled[bond1] && this.mMol.getBondOrder_0(bond1) == 3) {
        atom1 = this.mMol.getBondAtom_0(0, bond1);
        atom2 = this.mMol.getBondAtom_0(1, bond1);
        members = this.mMol.getAllConnAtoms_0(atom1) + this.mMol.getAllConnAtoms_0(atom2);
        if (members > 2) {
          f = new carcc3.InventorFragment(this.mMol, members, false);
          count = 0;
          for (i0 = 0; i0 < this.mMol.getAllConnAtoms_0(atom1); i0++) {
            connAtom = this.mMol.getConnAtom_0(atom1, i0);
            if (connAtom != atom2) {
              f.mGlobalAtom[count++] = connAtom;
              this.mAtomHandled[connAtom] = true;
              this.mBondHandled[this.mMol.getConnBond_0(atom1, i0)] = true;
            }
          }
          f.mGlobalAtom[count++] = atom1;
          f.mGlobalAtom[count++] = atom2;
          for (i1 = 0; i1 < this.mMol.getAllConnAtoms_0(atom2); i1++) {
            connAtom = this.mMol.getConnAtom_0(atom2, i1);
            if (connAtom != atom1) {
              f.mGlobalAtom[count++] = connAtom;
              this.mAtomHandled[connAtom] = true;
              this.mBondHandled[this.mMol.getConnBond_0(atom2, i1)] = true;
            }
          }
          for (i = 0; i < members; i++) {
            f.mAtomX[i] = i;
            f.mAtomY[i] = 0;
            f.mPriority[i] = 1;
          }
          this.mAtomHandled[atom1] = true;
          this.mAtomHandled[atom2] = true;
          this.mBondHandled[bond1] = true;
          this.mFragmentList.add(f);
        }
      }
    }
    for (bond = 0; bond < this.mMol.getAllBonds_0(); bond++) {
      if (!this.mBondHandled[bond] && this.mMol.getBondOrder_0(bond) == 2) {
        alleneAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
        for (i = 0; i < 2; i++) {
          alleneAtom[0] = this.mMol.getBondAtom_0(i, bond);
          alleneAtom[1] = this.mMol.getBondAtom_0(1 - i, bond);
          if (this.mMol.getAtomPi_0(alleneAtom[0]) == 1 && this.mMol.getAtomPi_0(alleneAtom[1]) == 2 && this.mMol.getAllConnAtoms_0(alleneAtom[1]) == 2) {
            this.mAtomHandled[alleneAtom[0]] = true;
            this.mAtomHandled[alleneAtom[1]] = true;
            this.mBondHandled[bond] = true;
            last = 1;
            do {
              nextIndex = this.mMol.getConnAtom_0(alleneAtom[last], 0) == alleneAtom[last - 1] ? 1 : 0;
              alleneAtom[last + 1] = this.mMol.getConnAtom_0(alleneAtom[last], nextIndex);
              if (this.mMol.getAtomPi_0(alleneAtom[last + 1]) == 2 && this.mMol.getAllConnAtoms_0(alleneAtom[last + 1]) > 2)
                break;
              this.mAtomHandled[alleneAtom[last + 1]] = true;
              this.mBondHandled[this.mMol.getConnBond_0(alleneAtom[last], nextIndex)] = true;
              last++;
            } while (this.mMol.getAtomPi_0(alleneAtom[last]) == 2 && this.mMol.getAllConnAtoms_0(alleneAtom[last]) == 2);
            members = this.mMol.getAllConnAtoms_0(alleneAtom[0]) + this.mMol.getAllConnAtoms_0(alleneAtom[last]) + last - 1;
            f = new carcc3.InventorFragment(this.mMol, members, false);
            for (j0 = 0; j0 <= last; j0++) {
              f.mAtomX[j0] = j0;
              f.mAtomY[j0] = 0;
              f.mPriority[j0] = 64;
              f.mGlobalAtom[j0] = alleneAtom[j0];
            }
            current = last + 1;
            found = false;
            for (j1 = 0; j1 < this.mMol.getAllConnAtoms_0(alleneAtom[0]); j1++) {
              connAtom = this.mMol.getConnAtom_0(alleneAtom[0], j1);
              if (connAtom != alleneAtom[1]) {
                f.mAtomX[current] = -0.5;
                f.mAtomY[current] = found ? $wnd.Math.sin(3.141592653589793 / 3) : -$wnd.Math.sin(3.141592653589793 / 3);
                f.mPriority[current] = 64;
                f.mGlobalAtom[current] = connAtom;
                current++;
                found = true;
              }
            }
            found = false;
            for (j = 0; j < this.mMol.getAllConnAtoms_0(alleneAtom[last]); j++) {
              connAtom = this.mMol.getConnAtom_0(alleneAtom[last], j);
              if (connAtom != alleneAtom[last - 1]) {
                f.mAtomX[current] = last + 0.5;
                f.mAtomY[current] = found ? -$wnd.Math.sin(3.141592653589793 / 3) : $wnd.Math.sin(3.141592653589793 / 3);
                f.mPriority[current] = 64;
                f.mGlobalAtom[current] = connAtom;
                current++;
                found = true;
              }
            }
            this.mFragmentList.add(f);
          }
        }
      }
    }
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      if (this.mMol.getAllConnAtoms_0(atom) == 4) {
        primaryConnAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
        primaryConnBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
        primaryConns = 0;
        for (i0 = 0; i0 < 4; i0++) {
          primaryConnAtom[primaryConns] = this.mMol.getConnAtom_0(atom, i0);
          primaryConnBond[primaryConns] = this.mMol.getConnBond_0(atom, i0);
          if (this.mMol.getAllConnAtoms_0(primaryConnAtom[primaryConns]) == 1 && !this.mBondHandled[primaryConnBond[primaryConns]])
            primaryConns++;
        }
        if (primaryConns == 2) {
          f = new carcc3.InventorFragment(this.mMol, 3, false);
          for (i = 0; i < 2; i++) {
            this.mAtomHandled[primaryConnAtom[i]] = true;
            this.mBondHandled[primaryConnBond[i]] = true;
            f.mGlobalAtom[i] = primaryConnAtom[i];
            f.mPriority[i] = 32;
          }
          f.mAtomX[0] = -0.5;
          f.mAtomY[0] = 0.866;
          f.mAtomX[1] = 0.5;
          f.mAtomY[1] = 0.866;
          f.mAtomX[2] = 0;
          f.mAtomY[2] = 0;
          f.mPriority[2] = 32;
          f.mGlobalAtom[2] = atom;
          this.mFragmentList.add(f);
        }
        if (primaryConns == 3) {
          for (i1 = 0; i1 < 2; i1++) {
            if (this.mMol.getBondOrder_0(primaryConnBond[i1]) == 1) {
              temp = primaryConnAtom[i1];
              primaryConnAtom[i1] = primaryConnAtom[2];
              primaryConnAtom[2] = temp;
              temp = primaryConnBond[i1];
              primaryConnBond[i1] = primaryConnBond[2];
              primaryConnBond[2] = temp;
            }
          }
          f = new carcc3.InventorFragment(this.mMol, 4, false);
          for (i = 0; i < 3; i++) {
            this.mAtomHandled[primaryConnAtom[i]] = true;
            this.mBondHandled[primaryConnBond[i]] = true;
            f.mGlobalAtom[i] = primaryConnAtom[i];
            f.mPriority[i] = 32;
          }
          f.mAtomX[0] = -1;
          f.mAtomY[0] = 0;
          f.mAtomX[1] = 1;
          f.mAtomY[1] = 0;
          f.mAtomX[2] = 0;
          f.mAtomY[2] = 1;
          f.mAtomX[3] = 0;
          f.mAtomY[3] = 0;
          f.mPriority[3] = 32;
          f.mGlobalAtom[3] = atom;
          this.mFragmentList.add(f);
        }
      }
    }
  };
  _.locateMarkedFragments = function locateMarkedFragments() {
    var atom, atom0, atom1, atom2, atom3, atom4, atomCount, atomIndex, avbl, bond, bondCount, coreFragmentCount, f, f0, f1, f2, fragment, fragmentAtomCount, fragmentNo, maxFragment, maxFragmentAtoms;
    atomCount = 0;
    for (atom0 = 0; atom0 < this.mMol.getAllAtoms_0(); atom0++)
      if (this.mMol.isMarkedAtom_0(atom0))
        atomCount++;
    if (atomCount < 2)
      return;
    bondCount = 0;
    avbl = 0;
    for (bond = 0; bond < this.mMol.getAllBonds_0(); bond++) {
      atom1 = this.mMol.getBondAtom_0(0, bond);
      atom2 = this.mMol.getBondAtom_0(1, bond);
      if (this.mMol.isMarkedAtom_0(atom1) && this.mMol.isMarkedAtom_0(atom2)) {
        this.mBondHandled[bond] = true;
        this.mAtomHandled[atom1] = true;
        this.mAtomHandled[atom2] = true;
        avbl += this.mMol.getBondLength_0(bond);
        bondCount++;
      }
    }
    if (bondCount != 0 && avbl != 0)
      avbl /= bondCount;
    else {
      avbl = this.mMol.getAverageBondLength_0();
    }
    for (atom3 = 0; atom3 < this.mMol.getAllAtoms_0(); atom3++)
      if (this.mMol.isMarkedAtom_0(atom3) && !this.mAtomHandled[atom3])
        atomCount--;
    if (atomCount < 2)
      return;
    fragmentNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    coreFragmentCount = this.mMol.getFragmentNumbers_0(fragmentNo, true, true);
    fragmentAtomCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, coreFragmentCount, 15, 1);
    for (atom4 = 0; atom4 < this.mMol.getAllAtoms_0(); atom4++)
      if (fragmentNo[atom4] != -1)
        fragmentAtomCount[fragmentNo[atom4]]++;
    fragment = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_coords_InventorFragment_2_classLit, { 4: 1, 1: 1, 7: 1 }, 31, coreFragmentCount, 0, 1);
    for (f0 = 0; f0 < coreFragmentCount; f0++)
      setCheck(fragment, f0, new carcc3.InventorFragment(this.mMol, fragmentAtomCount[f0], true));
    atomIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, coreFragmentCount, 15, 1);
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      f1 = fragmentNo[atom];
      if (f1 != -1) {
        fragment[f1].mPriority[atomIndex[f1]] = 1024;
        fragment[f1].mGlobalAtom[atomIndex[f1]] = atom;
        fragment[f1].mAtomX[atomIndex[f1]] = this.mMol.getAtomX_0(atom) / avbl;
        fragment[f1].mAtomY[atomIndex[f1]] = this.mMol.getAtomY_0(atom) / avbl;
        atomIndex[f1]++;
      }
    }
    maxFragment = -1;
    maxFragmentAtoms = 0;
    for (f2 = 0; f2 < coreFragmentCount; f2++) {
      if (maxFragmentAtoms < fragmentAtomCount[f2]) {
        maxFragmentAtoms = fragmentAtomCount[f2];
        maxFragment = f2;
      }
    }
    this.mFragmentList.add(fragment[maxFragment]);
    for (f = 0; f < coreFragmentCount; f++)
      if (f != maxFragment)
        this.mFragmentList.add(fragment[f]);
  };
  _.locateSingleAtoms = function locateSingleAtoms() {
    var atom, f;
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      if (!this.mAtomHandled[atom] && this.mMol.getAllConnAtoms_0(atom) == 0) {
        f = new carcc3.InventorFragment(this.mMol, 1, false);
        this.mAtomHandled[atom] = true;
        f.mGlobalAtom[0] = atom;
        f.mAtomX[0] = 0;
        f.mAtomY[0] = 0;
        f.mPriority[0] = 0;
        this.mFragmentList.add(f);
      }
    }
  };
  _.locateTemplateFragments = function locateTemplateFragments(templateList, priority) {
    var atom, atom$array, atom$index, atom$max, atomIsPartOfTemplate, b, definesAbsoluteOrientation, fragment, i, match_0, match$iterator, matchList, searcher, searcherWithIndex, template, template$iterator, templateAtomCount, templateMol, useFFP;
    useFFP = jsNotEquals(this.mFFP, null) && !templateList.isEmpty() && jsNotEquals(castTo(templateList.getAtIndex(0), 190).getFFP(), null);
    searcher = null;
    searcherWithIndex = null;
    if (useFFP) {
      searcherWithIndex = new carc2.SSSearcherWithIndex();
      searcherWithIndex.setMolecule_2(this.mMol, this.mFFP);
    } else {
      searcher = new carc2.SSSearcher();
      searcher.setMolecule_0(this.mMol);
    }
    atomIsPartOfTemplate = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAtoms_0(), 16, 1);
    for (template$iterator = templateList.iterator(); template$iterator.hasNext_0(); ) {
      template = castTo(template$iterator.next_3(), 190);
      matchList = null;
      templateMol = template.getFragment();
      if (useFFP) {
        searcherWithIndex.setFragment_3(templateMol, template.getFFP());
        if (searcherWithIndex.findFragmentInMolecule(4, 8) != 0)
          matchList = searcherWithIndex.getGraphMatcher().getMatchList();
      } else {
        searcher.setFragment_1(templateMol);
        if (searcher.findFragmentInMolecule(4, 8) != 0)
          matchList = searcher.getMatchList();
      }
      if (isNotNull(matchList)) {
        for (match$iterator = matchList.iterator(); match$iterator.hasNext_0(); ) {
          match_0 = castTo(match$iterator.next_3(), 6);
          templateAtomCount = 0;
          for (atom$array = match_0, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
            atom = atom$array[atom$index];
            if (atomIsPartOfTemplate[atom])
              templateAtomCount++;
          }
          if (templateAtomCount <= 1) {
            definesAbsoluteOrientation = template.keepAbsoluteOrientation();
            if (this.mAbsoluteOrientationTemplateFound)
              definesAbsoluteOrientation = false;
            else
              this.mAbsoluteOrientationTemplateFound = true;
            fragment = new carcc3.InventorFragment(this.mMol, match_0.length, definesAbsoluteOrientation);
            for (i = 0; i < match_0.length; i++) {
              atom = match_0[i];
              if (definesAbsoluteOrientation)
                this.mMol.setAtomMarker_0(atom, true);
              fragment.mPriority[i] = priority;
              fragment.mGlobalAtom[i] = atom;
              fragment.mAtomX[i] = template.getNormalizedAtomX(i);
              fragment.mAtomY[i] = template.getNormalizedAtomY(i);
              atomIsPartOfTemplate[atom] = true;
              this.mAtomHandled[atom] = true;
            }
            for (b = 0; b < templateMol.getBonds_0(); b++)
              this.mBondHandled[this.mMol.getBond_0(match_0[templateMol.getBondAtom_0(0, b)], match_0[templateMol.getBondAtom_0(1, b)])] = true;
            this.mFragmentList.add(fragment);
          }
        }
      }
    }
    return atomIsPartOfTemplate;
  };
  _.optimizeFragments = function optimizeFragments() {
    var atomSymRank, availableBond, availableBonds, bond, bondFlipPriority, bondSequence, collidingAtom, collisionList, collisionNo, currentRank, f, flip, fragmentNo, i, lastBond, minCollisionFragment, minCollisionPanalty, nextAvailableRank, theBond, theRank;
    atomSymRank = this.calculateAtomSymmetries();
    bondFlipPriority = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllBonds_0(), 15, 1);
    this.locateFlipBonds(bondFlipPriority, atomSymRank);
    for (bond = 0; bond < this.mMol.getAllBonds_0(); bond++)
      if (bondFlipPriority[bond] == 2 && (this.mMol.isRingAtom_0(this.mMol.getBondAtom_0(0, bond)) || this.mMol.isRingAtom_0(this.mMol.getBondAtom_0(1, bond))))
        bondFlipPriority[bond] = 3;
    for (fragmentNo = 0; fragmentNo < this.mFragmentList.size(); fragmentNo++) {
      f = castTo(this.mFragmentList.getAtIndex(fragmentNo), 31);
      collisionList = f.getCollisionList();
      minCollisionPanalty = f.getCollisionPanalty();
      minCollisionFragment = new carcc3.InventorFragment_0(f);
      lastBond = -1;
      for (flip = 0; flip < 224 && !collisionList.isEmpty(); flip++) {
        collisionNo = this.mRandom.nextInt_0(collisionList.size());
        collidingAtom = castTo(collisionList.getAtIndex(collisionNo), 6);
        bondSequence = this.getShortestConnection(collidingAtom[0], collidingAtom[1]);
        availableBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, bondSequence.length, 15, 1);
        availableBonds = 0;
        if (flip < 32) {
          for (i = 1; i < bondSequence.length - 1; i++)
            if (bondFlipPriority[bondSequence[i]] == 3)
              availableBond[availableBonds++] = bondSequence[i];
        } else if (flip < 32 + 64) {
          for (i = 1; i < bondSequence.length - 1; i++)
            if (bondFlipPriority[bondSequence[i]] >= 2)
              availableBond[availableBonds++] = bondSequence[i];
        } else {
          for (i = 1; i < bondSequence.length - 1; i++)
            if (bondFlipPriority[bondSequence[i]] >= 1)
              availableBond[availableBonds++] = bondSequence[i];
        }
        if (availableBonds != 0) {
          theBond = availableBond[0];
          if (availableBonds > 1) {
            do {
              theBond = availableBond[this.mRandom.nextInt_0(availableBonds)];
            } while (theBond == lastBond);
          }
          if (theBond != lastBond) {
            lastBond = theBond;
            f.flipOneSide(theBond);
            collisionList = f.getCollisionList();
            if (minCollisionPanalty > f.getCollisionPanalty()) {
              minCollisionPanalty = f.getCollisionPanalty();
              minCollisionFragment = new carcc3.InventorFragment_0(f);
            }
          }
        }
      }
      this.mFragmentList.setAtIndex(fragmentNo, minCollisionFragment);
      f = minCollisionFragment;
      currentRank = 1;
      do {
        nextAvailableRank = 9999;
        for (i = 0; i < f.size_1(); i++) {
          theRank = atomSymRank[f.mGlobalAtom[i]];
          if (theRank == currentRank)
            f.optimizeAtomCoordinates(i);
          else if (theRank > currentRank && theRank < nextAvailableRank)
            nextAvailableRank = theRank;
        }
        currentRank = nextAvailableRank;
      } while (nextAvailableRank != 9999);
    }
  };
  _.setRandomSeed_0 = function setRandomSeed_0(seed) {
    this.mRandom = new ju.Random_0(seed);
  };
  _.suggestNewBondAngle = function suggestNewBondAngle(f, atom) {
    var angleDif, connAngle, connAngles, connAtom, connBond, i, i0, i1, index_0, j, maxAngleDif, maxIndex, ringSize, rootIndex, tempAngle, tempAtom, tempBond;
    connAngle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllConnAtoms_0(atom) + 1, 15, 1);
    connAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllConnAtoms_0(atom) + 1, 15, 1);
    connBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllConnAtoms_0(atom) + 1, 15, 1);
    rootIndex = f.getLocalAtom(atom);
    connAngles = 0;
    for (i0 = 0; i0 < this.mMol.getAllConnAtoms_0(atom); i0++) {
      connAtom[connAngles] = this.mMol.getConnAtom_0(atom, i0);
      connBond[connAngles] = this.mMol.getConnBond_0(atom, i0);
      index_0 = f.getLocalAtom(connAtom[connAngles]);
      if (index_0 != -1)
        connAngle[connAngles++] = carcc3.getAngle_2(f.mAtomX[rootIndex], f.mAtomY[rootIndex], f.mAtomX[index_0], f.mAtomY[index_0]);
    }
    if (connAngles == 1)
      return connAngle[0] + 3.141592653589793;
    for (i1 = connAngles - 1; i1 > 0; i1--) {
      for (j = 0; j < i1; j++) {
        if (connAngle[j] > connAngle[j + 1]) {
          tempAngle = connAngle[j];
          connAngle[j] = connAngle[j + 1];
          connAngle[j + 1] = tempAngle;
          tempAtom = connAtom[j];
          connAtom[j] = connAtom[j + 1];
          connAtom[j + 1] = tempAtom;
          tempBond = connBond[j];
          connBond[j] = connBond[j + 1];
          connBond[j + 1] = tempBond;
        }
      }
    }
    connAngle[connAngles] = connAngle[0] + 2 * 3.141592653589793;
    connAtom[connAngles] = connAtom[0];
    connBond[connAngles] = connBond[0];
    maxAngleDif = -100;
    maxIndex = 0;
    for (i = 0; i < connAngles; i++) {
      angleDif = connAngle[i + 1] - connAngle[i];
      if (connAngles > 2 && this.mMol.isRingBond_0(connBond[i]) && this.mMol.isRingBond_0(connBond[i + 1])) {
        ringSize = this.getSmallestRingSize(connAtom[i], atom, connAtom[i + 1]);
        if (ringSize != 0)
          angleDif -= 100 - ringSize;
      }
      if (maxAngleDif < angleDif) {
        maxAngleDif = angleDif;
        maxIndex = i;
      }
    }
    return (connAngle[maxIndex] + connAngle[maxIndex + 1]) / 2;
  };
  _.updateFragmentList = function updateFragmentList(fOld1, fOld2, fJoined) {
    var index_0;
    index_0 = $wnd.Math.min(this.mFragmentList.indexOf(fOld1), this.mFragmentList.indexOf(fOld2));
    this.mFragmentList.addAtIndex(index_0, fJoined);
    this.mFragmentList.remove(fOld1);
    this.mFragmentList.remove(fOld2);
  };
  _.mAbsoluteOrientationTemplateFound = false;
  _.mMode = 0;
  carcc3.FLIP_AS_LAST_RESORT = 1;
  carcc3.FLIP_POSSIBLE = 2;
  carcc3.FLIP_PREFERRED = 3;
  carcc3.JOIN_DISTANCE_CHARGED_ATOMS = 1.399999976158142;
  carcc3.JOIN_DISTANCE_METAL_BONDS = 1.2000000476837158;
  carcc3.JOIN_DISTANCE_UNCHARGED_FRAGMENTS = 1.600000023841858;
  carcc3.LAST_RESORT_FLIPS = 128;
  carcc3.MODE_CONSIDER_MARKED_ATOMS = 0;
  carcc3.MODE_DEFAULT = 2;
  carcc3.MODE_KEEP_MARKED_ATOM_COORDS = 4;
  carcc3.MODE_PREFER_MARKED_ATOM_COORDS = 8;
  carcc3.MODE_REMOVE_HYDROGEN = 2;
  carcc3.MODE_SKIP_DEFAULT_TEMPLATES = 1;
  carcc3.POSSIBLE_FLIPS = 64;
  carcc3.PREFERRED_FLIPS = 32;
  carcc3.TOTAL_FLIPS = 0;
  cggl.Lcom_actelion_research_chem_coords_CoordinateInventor_2_classLit = createForClass("com.actelion.research.chem.coords", "CoordinateInventor", 84, cggl.Ljava_lang_Object_2_classLit);
  carcc3.$clinit_CoordinateInventor$1 = function $clinit_CoordinateInventor$1() {
    carcc3.$clinit_CoordinateInventor$1 = emptyMethod;
    ju.$clinit_ArrayList();
  };
  carcc3.CoordinateInventor$1 = function CoordinateInventor$1(this$0) {
    carcc3.$clinit_CoordinateInventor$1();
    this.this$01 = this$0;
    ju.ArrayList.call(this);
    this.$init_71();
  };
  defineClass(368, 16, { 4: 1, 1: 1, 16: 1, 29: 1, 59: 1, 126: 1 }, carcc3.CoordinateInventor$1);
  _.$init_71 = function $init_71() {
  };
  _.add = function add_11(f) {
    return this.add_5(castTo(f, 31));
  };
  _.add_5 = function add_10(f) {
    var ff, ff$iterator;
    for (ff$iterator = this.iterator(); ff$iterator.hasNext_0(); ) {
      ff = castTo(ff$iterator.next_3(), 31);
      if (ff.equals_3(f))
        return false;
    }
    return getClassPrototype(16).add.call(this, f);
  };
  cggl.Lcom_actelion_research_chem_coords_CoordinateInventor$1_2_classLit = createForClass("com.actelion.research.chem.coords", "CoordinateInventor/1", 368, cggl.Ljava_util_ArrayList_2_classLit);
  carcc3.$clinit_CoordinateInventor$2 = function $clinit_CoordinateInventor$2() {
    carcc3.$clinit_CoordinateInventor$2 = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Comparator();
  };
  carcc3.CoordinateInventor$2 = function CoordinateInventor$2(this$0) {
    carcc3.$clinit_CoordinateInventor$2();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_72();
  };
  defineClass(370, 1, { 1: 1, 36: 1 }, carcc3.CoordinateInventor$2);
  _.$init_72 = function $init_72() {
  };
  _.compare_0 = function compare_8(o1, o2) {
    return this.compare_3(castTo(o1, 58), castTo(o2, 58));
  };
  _.equals_0 = function equals_10(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  _.compare_3 = function compare_7(o1, o2) {
    var c1, c2;
    c1 = o1.fragment_0.size_1();
    c2 = o1.fragment_0.size_1();
    return compare_25(c2, c1);
  };
  cggl.Lcom_actelion_research_chem_coords_CoordinateInventor$2_2_classLit = createForClass("com.actelion.research.chem.coords", "CoordinateInventor/2", 370, cggl.Ljava_lang_Object_2_classLit);
  carcc3.$clinit_CoordinateInventor$3 = function $clinit_CoordinateInventor$3() {
    carcc3.$clinit_CoordinateInventor$3 = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Comparator();
  };
  carcc3.CoordinateInventor$3 = function CoordinateInventor$3(this$0) {
    carcc3.$clinit_CoordinateInventor$3();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_73();
  };
  defineClass(371, 1, { 1: 1, 36: 1 }, carcc3.CoordinateInventor$3);
  _.$init_73 = function $init_73() {
  };
  _.compare_0 = function compare_10(o1, o2) {
    return this.compare_3(castTo(o1, 58), castTo(o2, 58));
  };
  _.equals_0 = function equals_11(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  _.compare_3 = function compare_9(o1, o2) {
    var c1, c2;
    c1 = o1.fragment_0.size_1();
    c2 = o1.fragment_0.size_1();
    return compare_25(c1, c2);
  };
  cggl.Lcom_actelion_research_chem_coords_CoordinateInventor$3_2_classLit = createForClass("com.actelion.research.chem.coords", "CoordinateInventor/3", 371, cggl.Ljava_lang_Object_2_classLit);
  carcc3.$clinit_CoordinateInventor$lambda$0$Type = function $clinit_CoordinateInventor$lambda$0$Type() {
    carcc3.$clinit_CoordinateInventor$lambda$0$Type = emptyMethod;
  };
  carcc3.CoordinateInventor$lambda$0$Type = function CoordinateInventor$lambda$0$Type() {
    carcc3.$clinit_CoordinateInventor$lambda$0$Type();
  };
  defineClass(369, 1, { 1: 1, 36: 1 }, carcc3.CoordinateInventor$lambda$0$Type);
  _.compare_0 = function compare_11(arg0, arg1) {
    return carcc3.lambda$0_0(castTo(arg0, 58), castTo(arg1, 58));
  };
  _.equals_0 = function equals_12(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  cggl.Lcom_actelion_research_chem_coords_CoordinateInventor$lambda$0$Type_2_classLit = createForClass("com.actelion.research.chem.coords", "CoordinateInventor/lambda$0$Type", 369, cggl.Ljava_lang_Object_2_classLit);
  carcc3.$clinit_FragmentAssociation = function $clinit_FragmentAssociation() {
    carcc3.$clinit_FragmentAssociation = emptyMethod;
    jl.$clinit_Object();
  };
  carcc3.FragmentAssociation = function FragmentAssociation(f1, f2) {
    carcc3.$clinit_FragmentAssociation();
    var i, j;
    Object_0.call(this);
    this.$init_74();
    this.mFragment = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_coords_InventorFragment_2_classLit, { 4: 1, 1: 1, 7: 1 }, 31, 2, 0, 1);
    setCheck(this.mFragment, 0, f1);
    setCheck(this.mFragment, 1, f2);
    this.mX = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    this.mY = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    this.mCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    for (i = 0; i < 2; i++) {
      for (j = 0; j < this.mFragment[i].size_1(); j++) {
        this.mX[i] += this.mFragment[i].getAtomX_0(j);
        this.mY[i] += this.mFragment[i].getAtomY_0(j);
      }
      this.mCount[i] = this.mFragment[i].size_1();
    }
  };
  carcc3.FragmentAssociation_0 = function FragmentAssociation_0(f1, f2, atomIndex1, atomIndex2) {
    carcc3.$clinit_FragmentAssociation();
    Object_0.call(this);
    this.$init_74();
    this.mFragment = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_coords_InventorFragment_2_classLit, { 4: 1, 1: 1, 7: 1 }, 31, 2, 0, 1);
    setCheck(this.mFragment, 0, f1);
    setCheck(this.mFragment, 1, f2);
    this.mX = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    this.mY = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    this.mX[0] = this.mFragment[0].getAtomX_0(atomIndex1);
    this.mY[0] = this.mFragment[0].getAtomY_0(atomIndex1);
    this.mX[1] = this.mFragment[1].getAtomX_0(atomIndex2);
    this.mY[1] = this.mFragment[1].getAtomY_0(atomIndex2);
    this.mCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    this.mCount[0] = 1;
    this.mCount[1] = 1;
  };
  defineClass(115, 1, { 115: 1, 1: 1 }, carcc3.FragmentAssociation, carcc3.FragmentAssociation_0);
  _.$init_74 = function $init_74() {
  };
  _.add_6 = function add_12(atomIndex1, atomIndex2) {
    this.mX[0] += this.mFragment[0].getAtomX_0(atomIndex1);
    this.mY[0] += this.mFragment[0].getAtomY_0(atomIndex1);
    this.mX[1] += this.mFragment[1].getAtomX_0(atomIndex2);
    this.mY[1] += this.mFragment[1].getAtomY_0(atomIndex2);
    this.mCount[0]++;
    this.mCount[1]++;
  };
  _.arrange = function arrange(minDistance, keepFirstFragment) {
    var angle, binCount, dx, dy, high, i, i0, i1, i2, i3, i4, i5, index_0, j, leftX, low, range, relY, yMax, yMin;
    angle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    for (i0 = 0; i0 < 2; i0++) {
      this.mX[i0] /= this.mCount[i0];
      this.mY[i0] /= this.mCount[i0];
      angle[i0] = this.mFragment[i0].calculatePreferredAttachmentAngle(this.mX[i0], this.mY[i0], this.mFragment[1 - i0].size_1(), minDistance);
    }
    this.mFragment[0].rotate_0(this.mX[0], this.mY[0], 3.141592653589793 / 2 - angle[0]);
    this.mFragment[1].rotate_0(this.mX[1], this.mY[1], 3.141592653589793 * 3 / 2 - angle[1]);
    yMin = 17976931348623157e292;
    yMax = -17976931348623157e292;
    dy = this.mY[0] - this.mY[1];
    for (i1 = 0; i1 < this.mFragment[1].mAtomY.length; i1++) {
      this.mFragment[1].mAtomY[i1] += dy;
      if (yMin > this.mFragment[1].mAtomY[i1])
        yMin = this.mFragment[1].mAtomY[i1];
      if (yMax < this.mFragment[1].mAtomY[i1])
        yMax = this.mFragment[1].mAtomY[i1];
    }
    range = yMax - yMin + 2 * minDistance;
    binCount = round_int($wnd.Math.ceil(range));
    yMin += (range - binCount) / 2 - minDistance;
    leftX = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, binCount, 15, 1);
    for (i2 = 0; i2 < binCount; i2++)
      leftX[i2] = this.mX[1] + minDistance;
    for (i3 = 0; i3 < this.mFragment[1].mAtomY.length; i3++) {
      relY = this.mFragment[1].mAtomY[i3] - yMin;
      low = round_int(relY - minDistance);
      high = $wnd.Math.min(round_int(relY + minDistance), binCount - 1);
      for (j = low; j <= high; j++) {
        if (leftX[j] > this.mFragment[1].mAtomX[i3])
          leftX[j] = this.mFragment[1].mAtomX[i3];
      }
    }
    for (i4 = 0; i4 < binCount; i4++)
      leftX[i4] -= minDistance;
    dx = this.mX[0] - this.mX[1];
    for (i5 = 0; i5 < this.mFragment[0].mAtomX.length; i5++) {
      index_0 = round_int(this.mFragment[0].mAtomY[i5] - yMin);
      if (index_0 >= 0 && index_0 < leftX.length && dx < this.mFragment[0].mAtomX[i5] - leftX[index_0])
        dx = this.mFragment[0].mAtomX[i5] - leftX[index_0];
    }
    for (i = 0; i < this.mFragment[1].mAtomX.length; i++)
      this.mFragment[1].mAtomX[i] += dx;
    if (keepFirstFragment) {
      this.mFragment[0].rotate_0(this.mX[0], this.mY[0], angle[0] - 3.141592653589793 / 2);
      this.mFragment[1].rotate_0(this.mX[0], this.mY[0], angle[0] - 3.141592653589793 / 2);
    }
  };
  _.getFragment_0 = function getFragment_0(i) {
    return this.mFragment[i];
  };
  _.getPriority = function getPriority() {
    return this.mFragment[0].size_1() * this.mFragment[1].size_1();
  };
  cggl.Lcom_actelion_research_chem_coords_FragmentAssociation_2_classLit = createForClass("com.actelion.research.chem.coords", "FragmentAssociation", 115, cggl.Ljava_lang_Object_2_classLit);
  carcc3.$clinit_InventorAngle = function $clinit_InventorAngle() {
    carcc3.$clinit_InventorAngle = emptyMethod;
    jl.$clinit_Object();
  };
  carcc3.InventorAngle = function InventorAngle(angle, length_0) {
    carcc3.$clinit_InventorAngle();
    Object_0.call(this);
    this.$init_75();
    this.mAngle = angle;
    this.mLength = length_0;
  };
  carcc3.InventorAngle_0 = function InventorAngle_0(x1, y1, x2, y2) {
    carcc3.$clinit_InventorAngle();
    var xdif, ydif;
    Object_0.call(this);
    this.$init_75();
    this.mAngle = carcc3.getAngle_2(x1, y1, x2, y2);
    xdif = x2 - x1;
    ydif = y2 - y1;
    this.mLength = $wnd.Math.sqrt(xdif * xdif + ydif * ydif);
  };
  carcc3.getAngle_2 = function getAngle_2(x1, y1, x2, y2) {
    carcc3.$clinit_InventorAngle();
    var angle, xdif, ydif;
    xdif = x2 - x1;
    ydif = y2 - y1;
    if (ydif != 0) {
      angle = $wnd.Math.atan(xdif / ydif);
      if (ydif < 0) {
        if (xdif < 0)
          angle -= 3.141592653589793;
        else
          angle += 3.141592653589793;
      }
    } else
      angle = xdif > 0 ? 3.141592653589793 / 2 : -3.141592653589793 / 2;
    return angle;
  };
  defineClass(45, 1, { 45: 1, 1: 1 }, carcc3.InventorAngle, carcc3.InventorAngle_0);
  _.$init_75 = function $init_75() {
  };
  _.mAngle = 0;
  _.mLength = 0;
  cggl.Lcom_actelion_research_chem_coords_InventorAngle_2_classLit = createForClass("com.actelion.research.chem.coords", "InventorAngle", 45, cggl.Ljava_lang_Object_2_classLit);
  carcc3.$clinit_InventorChain = function $clinit_InventorChain() {
    carcc3.$clinit_InventorChain = emptyMethod;
    jl.$clinit_Object();
  };
  carcc3.InventorChain = function InventorChain(chainLength) {
    carcc3.$clinit_InventorChain();
    Object_0.call(this);
    this.$init_76();
    this.mAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, chainLength, 15, 1);
    this.mBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, chainLength, 15, 1);
  };
  defineClass(272, 1, { 1: 1 }, carcc3.InventorChain);
  _.$init_76 = function $init_76() {
  };
  _.getChainLength = function getChainLength() {
    return this.mAtom.length;
  };
  _.getRingAtoms_1 = function getRingAtoms_0() {
    return this.mAtom;
  };
  _.getRingBonds_2 = function getRingBonds_1() {
    return this.mBond;
  };
  cggl.Lcom_actelion_research_chem_coords_InventorChain_2_classLit = createForClass("com.actelion.research.chem.coords", "InventorChain", 272, cggl.Ljava_lang_Object_2_classLit);
  carcc3.$clinit_InventorCharge = function $clinit_InventorCharge() {
    carcc3.$clinit_InventorCharge = emptyMethod;
    jl.$clinit_Object();
  };
  carcc3.InventorCharge = function InventorCharge(fragment, atom, charge) {
    carcc3.$clinit_InventorCharge();
    Object_0.call(this);
    this.$init_77();
    this.fragment_0 = fragment;
    this.atom = atom;
    this.charge = charge;
  };
  defineClass(58, 1, { 58: 1, 1: 1 }, carcc3.InventorCharge);
  _.$init_77 = function $init_77() {
  };
  _.atom = 0;
  _.charge = 0;
  cggl.Lcom_actelion_research_chem_coords_InventorCharge_2_classLit = createForClass("com.actelion.research.chem.coords", "InventorCharge", 58, cggl.Ljava_lang_Object_2_classLit);
  carcc3.$clinit_InventorDefaultTemplateList = function $clinit_InventorDefaultTemplateList() {
    carcc3.$clinit_InventorDefaultTemplateList = emptyMethod;
    ju.$clinit_ArrayList();
    carcc3.DEFAULT_TEMPLATE = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["gkvt@@@@LddTTTrbTRTRTRRRRRRRRRRRRRrVRrIh\\IAaQxlY@gRHdJCJcRXlv_CfJx|A\\hRHejiLaQjTje^kSjtFcIhvXmVKMjt{lN{Kavy\\^wGjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjh@@vo@HBC@PhLN@bPhtFKCcpDbILaRhtzCIbsX\\nOO`JDbqDjSKdJeJmQjtz}Ahr[LVkMnpz\\nwGj{PBhBdBlBBBjBfBnBaBiBeBmBcBkBgBoB`bhbdblbbbjbfbnbabibebmbcbkbgbob`RhRdRlRbRjRfRnRaRiReRmRcRkRgRoR`rhrdrlrbrjrfrnrarirermrcrkrgror`JhJdJlJbJjJfJnJaJiJeJmJcJkJgJoJ`jhjdjljbjjjfjnjajijej` !BnkjyVwsVr|iQn|Q|goTZWPIJwbudnRkVYBez]siZymNJZUqNFBqZWxS~iCXVU]SeRjwrtSPAjkvXLpBAZauDPzq]PfMlecrMnkv|@\\SFD`m|mWiEoCXp`SIe_J[l|[XCbloTV`[Gc@FJGopyyoOlFQfUy^w\\Bgz|", "gcrt@@@@LdbbbbTRbRbRbRRRRRRRRRRRRVRrVQIA`HtRGAaIxZAHfShTjCIbqylQGKgqdBaXeQJeruBiPitZmFoPZLFSYbvZlVGMnsZ]vWSmr{]UUUUUUUUUUUUUUUUUUUUUUUUUUUUUT@@[G`DAA`HTFG@QHTZCEaqxBQDfPiTZ]AdqYlNWGgpEBQXbUIerEReVhuZ]^`tYMfKUfwX]NW[jkPBhBdBlBbBjBfBnBaBiBeBmBcBkBgBoB`bhbdblbbbjbfbnbabibebmbcbkbgbob`RhRdRlRbRjRfRnRaRiReRmRcRkRgRoR`rhrdrlrbrjrfrnrarirermrcrkrgror`JhJdJlJbJjJfJnJaJiJeJmJcJkJgJoJ`jhjdjljbjjjfjnjajij` !B^cR]`]Fm]QkfljE\\p\x7FUVfgOmFXsQe_gXPyXis_wF|vUUX_XbxpzU]HUFgYViwFo~@uemc@}~T\x7FIEPioYVwr]JnM~[ZEC\\g}~o_pUfdo~irsklTLiyVJshnw^iVAsZ`_~}PYkckURH{FYMImFaRaccUlCZSHMfP", "dml@@Dje^VGiyZjjjh@vtHSBinFU@ !BPTCTy[skMzUPF`AJbBixEZHS[Il", "dml@@DjYVvGiyZjjjh@vtHSBinFU@ !BwLo~BJ~UquhXBinZ\\ykA@F_eMrT", "dml@@LdfbbQX^fUZjjj`C[PaLJfxYT !BzxIHVc{OiJVRpprePho~]}y\x7FwLl", "deL@@DjUYkfEijjjj@MeBDpj[ad !B\x7FaA\x7FMVr[AvkKzm_jKvVbD{sk", "dil@@LddTQRl[NX^Fjjjj@MiBDpj[a@ !BPfL@\x7Fox@M~T@\x7Fox@\x7F`C~@@", "daL@@DjYtKJqjynjjjj@MaBDpj[` !B`bL@_gx@@Gy~@Gx@_`@"]);
  };
  carcc3.InventorDefaultTemplateList = function InventorDefaultTemplateList() {
    carcc3.$clinit_InventorDefaultTemplateList();
    var ffp, fragment, idcode, idcode$array, idcode$index, idcode$max, searcher, template;
    ju.ArrayList.call(this);
    this.$init_78();
    searcher = new carc2.SSSearcherWithIndex();
    for (idcode$array = carcc3.DEFAULT_TEMPLATE, idcode$index = 0, idcode$max = idcode$array.length; idcode$index < idcode$max; ++idcode$index) {
      idcode = idcode$array[idcode$index];
      fragment = new carc2.IDCodeParserWithoutCoordinateInvention().getCompactMolecule(idcode);
      ffp = searcher.createLongIndex(fragment);
      template = new carcc3.InventorTemplate(fragment, ffp, false);
      template.normalizeCoordinates();
      this.add(template);
    }
  };
  defineClass(451, 16, { 4: 1, 1: 1, 16: 1, 29: 1, 59: 1, 126: 1 }, carcc3.InventorDefaultTemplateList);
  _.$init_78 = function $init_78() {
  };
  cggl.Lcom_actelion_research_chem_coords_InventorDefaultTemplateList_2_classLit = createForClass("com.actelion.research.chem.coords", "InventorDefaultTemplateList", 451, cggl.Ljava_util_ArrayList_2_classLit);
  carcc3.$clinit_InventorFragment = function $clinit_InventorFragment() {
    carcc3.$clinit_InventorFragment = emptyMethod;
    jl.$clinit_Object();
  };
  carcc3.InventorFragment = function InventorFragment(mol, atoms, keepMarkedAtoms) {
    carcc3.$clinit_InventorFragment();
    Object_0.call(this);
    this.$init_79();
    this.mMol = mol;
    this.mKeepMarkedAtoms = keepMarkedAtoms;
    this.mGlobalAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, atoms, 15, 1);
    this.mPriority = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, atoms, 15, 1);
    this.mAtomX = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, atoms, 15, 1);
    this.mAtomY = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, atoms, 15, 1);
  };
  carcc3.InventorFragment_0 = function InventorFragment_0(f) {
    carcc3.$clinit_InventorFragment();
    var i, i0;
    Object_0.call(this);
    this.$init_79();
    this.mMol = f.mMol;
    this.mKeepMarkedAtoms = f.mKeepMarkedAtoms;
    this.mGlobalAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, f.size_1(), 15, 1);
    this.mPriority = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, f.size_1(), 15, 1);
    this.mAtomX = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, f.size_1(), 15, 1);
    this.mAtomY = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, f.size_1(), 15, 1);
    for (i0 = 0; i0 < f.size_1(); i0++) {
      this.mGlobalAtom[i0] = f.mGlobalAtom[i0];
      this.mPriority[i0] = f.mPriority[i0];
      this.mAtomX[i0] = f.mAtomX[i0];
      this.mAtomY[i0] = f.mAtomY[i0];
    }
    if (jsNotEquals(f.mGlobalBond, null)) {
      this.mGlobalBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, f.mGlobalBond.length, 15, 1);
      for (i = 0; i < f.mGlobalBond.length; i++)
        this.mGlobalBond[i] = f.mGlobalBond[i];
    }
    if (jsNotEquals(f.mGlobalToLocalAtom, null)) {
      this.mGlobalToLocalAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, f.mGlobalToLocalAtom.length, 15, 1);
      for (i = 0; i < f.mGlobalToLocalAtom.length; i++)
        this.mGlobalToLocalAtom[i] = f.mGlobalToLocalAtom[i];
    }
  };
  defineClass(31, 1, { 31: 1, 1: 1 }, carcc3.InventorFragment, carcc3.InventorFragment_0);
  _.$init_79 = function $init_79() {
  };
  _.calculateMinMax = function calculateMinMax() {
    var i, surplus;
    if (this.mMinMaxAvail)
      return;
    this.mMinX = this.mAtomX[0];
    this.mMaxX = this.mAtomX[0];
    this.mMinY = this.mAtomY[0];
    this.mMaxY = this.mAtomY[0];
    for (i = 0; i < this.mGlobalAtom.length; i++) {
      surplus = this.getAtomSurplus(i);
      if (this.mMinX > this.mAtomX[i] - surplus)
        this.mMinX = this.mAtomX[i] - surplus;
      if (this.mMaxX < this.mAtomX[i] + surplus)
        this.mMaxX = this.mAtomX[i] + surplus;
      if (this.mMinY > this.mAtomY[i] - surplus)
        this.mMinY = this.mAtomY[i] - surplus;
      if (this.mMaxY < this.mAtomY[i] + surplus)
        this.mMaxY = this.mAtomY[i] + surplus;
    }
    this.mMinMaxAvail = true;
  };
  _.calculatePreferredAttachmentAngle = function calculatePreferredAttachmentAngle(x_0, y_0, neighbourAtomCount, padding) {
    var BIN_ANGLE, angle, bin, bin0, cos_0, d, distance, dx, dy, i, i0, i1, i2, i3, j, localMinDistance, maxBin, maxDistance, minBin, minDistance, neighbourBin, neighbourCount, neighbourRadius, preferredBin, sd, sin_0, squareRadius;
    if (this.size_1() == 1)
      return 0;
    BIN_ANGLE = 2 * 3.141592653589793 / this.CIRCULAR_BINS;
    neighbourRadius = padding + $wnd.Math.sqrt(neighbourAtomCount);
    distance = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.CIRCULAR_BINS, 15, 1);
    for (i0 = 0; i0 < this.mGlobalAtom.length; i0++) {
      angle = carcc3.getAngle_2(x_0, y_0, this.mAtomX[i0], this.mAtomY[i0]);
      bin0 = this.correctBin(toInt_0(jl.round_1(angle * this.CIRCULAR_BINS / (2 * 3.141592653589793))));
      dx = x_0 - this.mAtomX[i0];
      dy = y_0 - this.mAtomY[i0];
      sd = dx * dx + dy * dy;
      if (distance[bin0] < sd)
        distance[bin0] = sd;
    }
    maxDistance = -1;
    maxBin = -1;
    for (i1 = 0; i1 < this.CIRCULAR_BINS; i1++) {
      distance[i1] = $wnd.Math.sqrt(distance[i1]);
      if (maxDistance < distance[i1]) {
        maxDistance = distance[i1];
        maxBin = i1;
      }
    }
    preferredBin = this.correctBin(maxBin - narrow_int(this.CIRCULAR_BINS / 2));
    for (i2 = 0; i2 <= narrow_int(this.CIRCULAR_BINS / 2); i2++) {
      distance[this.correctBin(preferredBin + i2)] += 0.01 * i2;
      distance[this.correctBin(preferredBin - i2)] += 0.01 * i2;
    }
    neighbourCount = narrow_int(this.CIRCULAR_BINS / 4);
    sin_0 = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, neighbourCount, 15, 1);
    cos_0 = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, neighbourCount, 15, 1);
    for (i3 = 1; i3 < neighbourCount; i3++) {
      sin_0[i3] = $wnd.Math.sin(i3 * 0.17453292519943295);
      cos_0[i3] = $wnd.Math.cos(i3 * 0.17453292519943295);
    }
    squareRadius = neighbourRadius * neighbourRadius;
    minDistance = 17976931348623157e292;
    minBin = -1;
    for (bin = 0; bin < this.CIRCULAR_BINS; bin++) {
      if (distance[bin] >= minDistance)
        continue;
      localMinDistance = distance[bin];
      for (i = 1; i < neighbourCount; i++) {
        for (j = -1; j <= 1; j += 2) {
          neighbourBin = this.correctBin(bin + j * i);
          if (distance[neighbourBin] * cos_0[i] <= localMinDistance)
            continue;
          d = cos_0[i] * $wnd.Math.min(distance[neighbourBin], neighbourRadius / sin_0[i]);
          if (localMinDistance < d) {
            localMinDistance = d;
            if (minDistance <= localMinDistance)
              break;
          }
        }
        if (minDistance <= localMinDistance)
          break;
      }
      if (minDistance > localMinDistance) {
        minDistance = localMinDistance;
        minBin = bin;
      }
    }
    return 3.141592653589793 * 2 * minBin / this.CIRCULAR_BINS;
  };
  _.correctBin = function correctBin(bin) {
    return bin < 0 ? bin + this.CIRCULAR_BINS : bin >= this.CIRCULAR_BINS ? bin - this.CIRCULAR_BINS : bin;
  };
  _.equals_3 = function equals_13(f) {
    var i, sorted, sortedF;
    if (f.size_1() != this.size_1())
      return false;
    sorted = this.getSortedAtoms();
    sortedF = f.getSortedAtoms();
    for (i = 0; i < sorted.length; i++)
      if (sorted[i] != sortedF[i])
        return false;
    return true;
  };
  _.flip = function flip_0(x_0, y_0, mirrorAngle) {
    var angle, distance, i;
    for (i = 0; i < this.mGlobalAtom.length; i++) {
      distance = $wnd.Math.sqrt((this.mAtomX[i] - x_0) * (this.mAtomX[i] - x_0) + (this.mAtomY[i] - y_0) * (this.mAtomY[i] - y_0));
      angle = 2 * mirrorAngle - carcc3.getAngle_2(x_0, y_0, this.mAtomX[i], this.mAtomY[i]);
      this.mAtomX[i] = x_0 + distance * $wnd.Math.sin(angle);
      this.mAtomY[i] = y_0 + distance * $wnd.Math.cos(angle);
    }
  };
  _.flipOneSide = function flipOneSide(bond) {
    var angle, atom, atom1, atom2, candidate, coreOffSide, coreOnSide, count, current, distance, flipOtherSide, graphAtom, highest, i, i0, i1, index_0, isOnSide, mirrorAngle, x_0, y_0;
    if (jsEquals(this.mFlipList, null))
      this.mFlipList = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, this.mMol.getAllBonds_0(), 0, 2);
    if (jsEquals(this.mFlipList[bond], null)) {
      graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mGlobalAtom.length, 15, 1);
      isOnSide = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 16, 1);
      atom1 = this.mMol.getBondAtom_0(0, bond);
      atom2 = this.mMol.getBondAtom_0(1, bond);
      graphAtom[0] = atom1;
      isOnSide[atom1] = true;
      current = 0;
      highest = 0;
      while (current <= highest) {
        for (i0 = 0; i0 < this.mMol.getAllConnAtoms_0(graphAtom[current]); i0++) {
          candidate = this.mMol.getConnAtom_0(graphAtom[current], i0);
          if (!isOnSide[candidate] && candidate != atom2) {
            graphAtom[++highest] = candidate;
            isOnSide[candidate] = true;
          }
        }
        if (current == highest)
          break;
        current++;
      }
      flipOtherSide = highest + 1 > narrow_int(this.mGlobalAtom.length / 2);
      if (this.mKeepMarkedAtoms) {
        coreOnSide = false;
        coreOffSide = false;
        for (i0 = 0; i0 < this.mGlobalAtom.length; i0++) {
          atom = this.mGlobalAtom[i0];
          if (this.mMol.isMarkedAtom_0(atom) && atom != atom1 && atom != atom2) {
            if (isOnSide[this.mGlobalAtom[i0]])
              coreOnSide = true;
            else
              coreOffSide = true;
          }
        }
        if (coreOnSide != coreOffSide)
          flipOtherSide = coreOnSide;
      }
      count = 2;
      this.mFlipList[bond] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, flipOtherSide ? this.mGlobalAtom.length - highest : highest + 2, 15, 1);
      for (i1 = 0; i1 < this.mGlobalAtom.length; i1++) {
        if (this.mGlobalAtom[i1] == atom1)
          this.mFlipList[bond][flipOtherSide ? 0 : 1] = i1;
        else if (this.mGlobalAtom[i1] == atom2)
          this.mFlipList[bond][flipOtherSide ? 1 : 0] = i1;
        else if (flipOtherSide ^ isOnSide[this.mGlobalAtom[i1]])
          this.mFlipList[bond][count++] = i1;
      }
    }
    x_0 = this.mAtomX[this.mFlipList[bond][0]];
    y_0 = this.mAtomY[this.mFlipList[bond][0]];
    mirrorAngle = carcc3.getAngle_2(x_0, y_0, this.mAtomX[this.mFlipList[bond][1]], this.mAtomY[this.mFlipList[bond][1]]);
    for (i = 2; i < this.mFlipList[bond].length; i++) {
      index_0 = this.mFlipList[bond][i];
      distance = $wnd.Math.sqrt((this.mAtomX[index_0] - x_0) * (this.mAtomX[index_0] - x_0) + (this.mAtomY[index_0] - y_0) * (this.mAtomY[index_0] - y_0));
      angle = 2 * mirrorAngle - carcc3.getAngle_2(x_0, y_0, this.mAtomX[index_0], this.mAtomY[index_0]);
      this.mAtomX[index_0] = x_0 + distance * $wnd.Math.sin(angle);
      this.mAtomY[index_0] = y_0 + distance * $wnd.Math.cos(angle);
    }
  };
  _.getAtomSurplus = function getAtomSurplus(atom) {
    return neq(this.mMol.getAtomQueryFeatures(this.mGlobalAtom[atom]), 0) ? 0.6 : this.mMol.getAtomicNo_0(this.mGlobalAtom[atom]) != 6 ? 0.25 : 0;
  };
  _.getAtomX_0 = function getAtomX_1(index_0) {
    return this.mAtomX[index_0];
  };
  _.getAtomY_0 = function getAtomY_1(index_0) {
    return this.mAtomY[index_0];
  };
  _.getCollisionList = function getCollisionList() {
    var collidingAtom, collisionList, dist, i, j, panalty, xdif, ydif;
    this.mCollisionPanalty = 0;
    collisionList = new ju.ArrayList();
    for (i = 1; i < this.mGlobalAtom.length; i++) {
      for (j = 0; j < i; j++) {
        xdif = $wnd.Math.abs(this.mAtomX[i] - this.mAtomX[j]);
        ydif = $wnd.Math.abs(this.mAtomY[i] - this.mAtomY[j]);
        dist = $wnd.Math.sqrt(xdif * xdif + ydif * ydif);
        if (dist < 0.8) {
          collidingAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
          collidingAtom[0] = this.mGlobalAtom[i];
          collidingAtom[1] = this.mGlobalAtom[j];
          collisionList.add(collidingAtom);
        }
        panalty = 1 - $wnd.Math.min(dist, 1);
        this.mCollisionPanalty += panalty * panalty;
      }
    }
    return collisionList;
  };
  _.getCollisionPanalty = function getCollisionPanalty() {
    return this.mCollisionPanalty;
  };
  _.getGlobalAtom = function getGlobalAtom(localAtom) {
    return this.mGlobalAtom[localAtom];
  };
  _.getHeight_0 = function getHeight() {
    this.calculateMinMax();
    return this.mMaxY - this.mMinY + 1;
  };
  _.getLocalAtom = function getLocalAtom(globalAtom) {
    var i;
    for (i = 0; i < this.mGlobalAtom.length; i++)
      if (globalAtom == this.mGlobalAtom[i])
        return i;
    return -1;
  };
  _.getSortedAtoms = function getSortedAtoms() {
    if (jsEquals(this.mSortedAtom, null)) {
      this.mSortedAtom = ju.copyOf_9(this.mGlobalAtom, this.mGlobalAtom.length);
      ju.sort_3(this.mSortedAtom);
    }
    return this.mSortedAtom;
  };
  _.getWidth_0 = function getWidth() {
    this.calculateMinMax();
    return this.mMaxX - this.mMinX + 1;
  };
  _.isMember_0 = function isMember_0(globalAtom) {
    var i;
    for (i = 0; i < this.mGlobalAtom.length; i++)
      if (globalAtom == this.mGlobalAtom[i])
        return true;
    return false;
  };
  _.locateBonds = function locateBonds() {
    var atom, connAtoms, fragmentBonds, i, i0, j;
    fragmentBonds = 0;
    for (i0 = 0; i0 < this.mGlobalAtom.length; i0++) {
      atom = this.mGlobalAtom[i0];
      connAtoms = this.mMol.getAllConnAtoms_0(atom);
      for (j = 0; j < connAtoms; j++)
        if (this.mMol.getConnAtom_0(atom, j) > atom)
          fragmentBonds++;
    }
    this.mGlobalBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, fragmentBonds, 15, 1);
    this.mGlobalToLocalAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    fragmentBonds = 0;
    for (i = 0; i < this.mGlobalAtom.length; i++) {
      atom = this.mGlobalAtom[i];
      connAtoms = this.mMol.getAllConnAtoms_0(atom);
      this.mGlobalToLocalAtom[atom] = i;
      for (j = 0; j < connAtoms; j++)
        if (this.mMol.getConnAtom_0(atom, j) > atom)
          this.mGlobalBond[fragmentBonds++] = this.mMol.getConnBond_0(atom, j);
    }
  };
  _.optimizeAtomCoordinates = function optimizeAtomCoordinates(atom) {
    var a1, a2, bondLength, collisionForce, d, d1, d2, force, forces, i, m1, m2, x_0, x1, x2, xs, y_0, y1, y2, ys;
    x_0 = this.mAtomX[atom];
    y_0 = this.mAtomY[atom];
    collisionForce = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_coords_InventorAngle_2_classLit, { 4: 1, 1: 1, 7: 1 }, 45, 4, 0, 1);
    forces = 0;
    for (i = 0; i < this.mGlobalBond.length; i++) {
      if (forces >= 4)
        break;
      if (atom == this.mGlobalToLocalAtom[this.mMol.getBondAtom_0(0, this.mGlobalBond[i])] || atom == this.mGlobalToLocalAtom[this.mMol.getBondAtom_0(1, this.mGlobalBond[i])])
        continue;
      x1 = this.mAtomX[this.mGlobalToLocalAtom[this.mMol.getBondAtom_0(0, this.mGlobalBond[i])]];
      y1 = this.mAtomY[this.mGlobalToLocalAtom[this.mMol.getBondAtom_0(0, this.mGlobalBond[i])]];
      x2 = this.mAtomX[this.mGlobalToLocalAtom[this.mMol.getBondAtom_0(1, this.mGlobalBond[i])]];
      y2 = this.mAtomY[this.mGlobalToLocalAtom[this.mMol.getBondAtom_0(1, this.mGlobalBond[i])]];
      d1 = $wnd.Math.sqrt((x1 - x_0) * (x1 - x_0) + (y1 - y_0) * (y1 - y_0));
      d2 = $wnd.Math.sqrt((x2 - x_0) * (x2 - x_0) + (y2 - y_0) * (y2 - y_0));
      bondLength = $wnd.Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
      if (d1 < bondLength && d2 < bondLength) {
        if (x1 == x2) {
          d = $wnd.Math.abs(x_0 - x1);
          if (d < 0.5)
            setCheck(collisionForce, forces++, new carcc3.InventorAngle(carcc3.getAngle_2(x1, y_0, x_0, y_0), (0.5 - d) / 2));
        } else if (y1 == y2) {
          d = $wnd.Math.abs(y_0 - y1);
          if (d < 0.5)
            setCheck(collisionForce, forces++, new carcc3.InventorAngle(carcc3.getAngle_2(x_0, y1, x_0, y_0), (0.5 - d) / 2));
        } else {
          m1 = (y2 - y1) / (x2 - x1);
          m2 = -1 / m1;
          a1 = y1 - m1 * x1;
          a2 = y_0 - m2 * x_0;
          xs = (a2 - a1) / (m1 - m2);
          ys = m1 * xs + a1;
          d = $wnd.Math.sqrt((xs - x_0) * (xs - x_0) + (ys - y_0) * (ys - y_0));
          if (d < 0.5)
            setCheck(collisionForce, forces++, new carcc3.InventorAngle(carcc3.getAngle_2(xs, ys, x_0, y_0), (0.5 - d) / 2));
        }
        continue;
      }
      if (d1 < 0.5) {
        setCheck(collisionForce, forces++, new carcc3.InventorAngle(carcc3.getAngle_2(x1, y1, x_0, y_0), (0.5 - d1) / 2));
        continue;
      }
      if (d2 < 0.5) {
        setCheck(collisionForce, forces++, new carcc3.InventorAngle(carcc3.getAngle_2(x2, y2, x_0, y_0), (0.5 - d2) / 2));
        continue;
      }
    }
    if (forces > 0) {
      force = carcc3.getMeanAngle(collisionForce, forces);
      this.mAtomX[atom] += force.mLength * $wnd.Math.sin(force.mAngle);
      this.mAtomY[atom] += force.mLength * $wnd.Math.cos(force.mAngle);
    }
  };
  _.rotate_0 = function rotate_0(x_0, y_0, angleDif) {
    var angle, distance, i;
    for (i = 0; i < this.mGlobalAtom.length; i++) {
      distance = $wnd.Math.sqrt((this.mAtomX[i] - x_0) * (this.mAtomX[i] - x_0) + (this.mAtomY[i] - y_0) * (this.mAtomY[i] - y_0));
      angle = carcc3.getAngle_2(x_0, y_0, this.mAtomX[i], this.mAtomY[i]) + angleDif;
      this.mAtomX[i] = x_0 + distance * $wnd.Math.sin(angle);
      this.mAtomY[i] = y_0 + distance * $wnd.Math.cos(angle);
    }
  };
  _.size_1 = function size_2() {
    return this.mGlobalAtom.length;
  };
  _.translate = function translate_0(dx, dy) {
    var i;
    for (i = 0; i < this.mGlobalAtom.length; i++) {
      this.mAtomX[i] += dx;
      this.mAtomY[i] += dy;
    }
  };
  _.CIRCULAR_BINS = 36;
  _.mCollisionPanalty = 0;
  _.mKeepMarkedAtoms = false;
  _.mMaxX = 0;
  _.mMaxY = 0;
  _.mMinMaxAvail = false;
  _.mMinX = 0;
  _.mMinY = 0;
  carcc3.cCollisionLimitAtomMovement = 0.5;
  carcc3.cCollisionLimitBondRotation = 0.8;
  cggl.Lcom_actelion_research_chem_coords_InventorFragment_2_classLit = createForClass("com.actelion.research.chem.coords", "InventorFragment", 31, cggl.Ljava_lang_Object_2_classLit);
  carcc3.$clinit_InventorTemplate = function $clinit_InventorTemplate() {
    carcc3.$clinit_InventorTemplate = emptyMethod;
    jl.$clinit_Object();
  };
  carcc3.InventorTemplate = function InventorTemplate(fragment, ffp, keepAbsoluteOrientation) {
    carcc3.$clinit_InventorTemplate();
    Object_0.call(this);
    this.$init_80();
    this.mFragment = fragment;
    this.mFFP = ffp;
    this.mKeepAbsoluteOrientation = keepAbsoluteOrientation;
  };
  defineClass(190, 1, { 190: 1, 1: 1 }, carcc3.InventorTemplate);
  _.$init_80 = function $init_80() {
  };
  _.getFFP = function getFFP() {
    return this.mFFP;
  };
  _.getFragment = function getFragment_1() {
    return this.mFragment;
  };
  _.getNormalizedAtomX = function getNormalizedAtomX(atom) {
    return this.mFragment.getAtomX_0(atom) / this.mAVBL;
  };
  _.getNormalizedAtomY = function getNormalizedAtomY(atom) {
    return this.mFragment.getAtomY_0(atom) / this.mAVBL;
  };
  _.keepAbsoluteOrientation = function keepAbsoluteOrientation_0() {
    return this.mKeepAbsoluteOrientation;
  };
  _.normalizeCoordinates = function normalizeCoordinates() {
    this.mAVBL = this.mFragment.getAverageBondLength_0();
  };
  _.mAVBL = 0;
  _.mKeepAbsoluteOrientation = false;
  cggl.Lcom_actelion_research_chem_coords_InventorTemplate_2_classLit = createForClass("com.actelion.research.chem.coords", "InventorTemplate", 190, cggl.Ljava_lang_Object_2_classLit);
  carcd.$clinit_ISimilarityCalculator = function $clinit_ISimilarityCalculator() {
    carcd.$clinit_ISimilarityCalculator = emptyMethod;
  };
  cggl.Lcom_actelion_research_chem_descriptor_ISimilarityCalculator_2_classLit = createForInterface("com.actelion.research.chem.descriptor", "ISimilarityCalculator");
  carcd.$clinit_DescriptorHandler = function $clinit_DescriptorHandler() {
    carcd.$clinit_DescriptorHandler = emptyMethod;
  };
  cggl.Lcom_actelion_research_chem_descriptor_DescriptorHandler_2_classLit = createForInterface("com.actelion.research.chem.descriptor", "DescriptorHandler");
  carcd.$clinit_AbstractDescriptorHandlerLongFP = function $clinit_AbstractDescriptorHandlerLongFP() {
    carcd.$clinit_AbstractDescriptorHandlerLongFP = emptyMethod;
  };
  defineClass(802, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_descriptor_AbstractDescriptorHandlerLongFP_2_classLit = createForClass("com.actelion.research.chem.descriptor", "AbstractDescriptorHandlerLongFP", 802, cggl.Ljava_lang_Object_2_classLit);
  carcf.$clinit_ForceField = function $clinit_ForceField() {
    carcf.$clinit_ForceField = emptyMethod;
  };
  cggl.Lcom_actelion_research_chem_forcefield_ForceField_2_classLit = createForInterface("com.actelion.research.chem.forcefield", "ForceField");
  carcf.$clinit_AbstractForceField = function $clinit_AbstractForceField() {
    carcf.$clinit_AbstractForceField = emptyMethod;
    jl.$clinit_Object();
    carcf.TOLX = 4 * 3e-8;
  };
  carcf.AbstractForceField = function AbstractForceField(mol) {
    carcf.$clinit_AbstractForceField();
    var at, i, implicitHydrogens;
    Object_0.call(this);
    this.$init_81();
    implicitHydrogens = 0;
    for (at = 0; at < mol.getAtoms_0(); at++) {
      implicitHydrogens += mol.getImplicitHydrogens_1(at);
    }
    if (implicitHydrogens > 0) {
      throw toJs(new jl.IllegalArgumentException_0("molecule needs explicit hydrogen atoms for force field calculations"));
    }
    this.mMol = mol;
    this.mDim = 3 * mol.getAllAtoms_0();
    this.mGrad = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDim, 15, 1);
    this.mPos = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDim, 15, 1);
    this.mNewpos = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDim, 15, 1);
    this.mIsInterrupted = false;
    this.mTimeInterval = 20;
    for (i = 0; i < mol.getAllAtoms_0(); i++) {
      this.mPos[3 * i] = mol.getAtomX_0(i);
      this.mPos[3 * i + 1] = mol.getAtomY_0(i);
      this.mPos[3 * i + 2] = mol.getAtomZ_0(i);
    }
  };
  defineClass(318, 1, { 1: 1 });
  _.$init_81 = function $init_81() {
    this.listeners = new ju.ArrayList();
  };
  _.linearSearch = function linearSearch(oldPt, oldVal, dir_0, newPt, maxStep) {
    var MAX_ITER_LINEAR_SEARCH, a, b, disc, i, i0, i1, i2, i3, i4, it, lambda, lambda2, lambdaMin, ret, rhs1, rhs2, slope, sum, temp, test_0, tmpLambda, tmpPt, val2;
    MAX_ITER_LINEAR_SEARCH = 1e3;
    ret = -1;
    tmpPt = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDim, 15, 1);
    sum = 0;
    slope = 0;
    test_0 = 0;
    lambda = 0;
    lambda2 = 0;
    lambdaMin = 0;
    tmpLambda = 0;
    val2 = 0;
    sum = 0;
    for (i0 = 0; i0 < this.mDim; i0++)
      sum += dir_0[i0] * dir_0[i0];
    sum = $wnd.Math.sqrt(sum);
    if (sum > maxStep)
      for (i1 = 0; i1 < this.mDim; i1++)
        dir_0[i1] *= maxStep / sum;
    slope = 0;
    for (i2 = 0; i2 < this.mDim; i2++)
      slope += dir_0[i2] * this.mGrad[i2];
    if (slope >= 0)
      return ret;
    test_0 = 0;
    for (i3 = 0; i3 < this.mDim; i3++) {
      temp = $wnd.Math.abs(dir_0[i3]) / $wnd.Math.max($wnd.Math.abs(oldPt[i3]), 1);
      if (temp > test_0)
        test_0 = temp;
    }
    lambdaMin = 1e-7 / test_0;
    lambda = 1;
    it = 0;
    while (it < 1e3) {
      if (lambda < lambdaMin) {
        ret = 1;
        break;
      }
      for (i4 = 0; i4 < this.mDim; i4++)
        newPt[i4] = oldPt[i4] + lambda * dir_0[i4];
      this.mTotalEnergy = this.getTotalEnergy_1(newPt);
      if (this.mTotalEnergy - oldVal <= 1e-4 * lambda * slope)
        return 0;
      if (it == 0)
        tmpLambda = -slope / (2 * (this.mTotalEnergy - oldVal - slope));
      else {
        rhs1 = this.mTotalEnergy - oldVal - lambda * slope;
        rhs2 = val2 - oldVal - lambda2 * slope;
        a = (rhs1 / (lambda * lambda) - rhs2 / (lambda2 * lambda2)) / (lambda - lambda2);
        b = (-lambda2 * rhs1 / (lambda * lambda) + lambda * rhs2 / (lambda2 * lambda2)) / (lambda - lambda2);
        if (a == 0)
          tmpLambda = -slope / (2 * b);
        else {
          disc = b * b - 3 * a * slope;
          if (disc < 0)
            tmpLambda = 0.5 * lambda;
          else if (b <= 0)
            tmpLambda = (-b + $wnd.Math.sqrt(disc)) / (3 * a);
          else
            tmpLambda = -slope / (b + $wnd.Math.sqrt(disc));
        }
        if (tmpLambda > 0.5 * lambda)
          tmpLambda = 0.5 * lambda;
      }
      lambda2 = lambda;
      val2 = this.mTotalEnergy;
      lambda = $wnd.Math.max(tmpLambda, 0.1 * lambda);
      ++it;
    }
    for (i = 0; i < this.mDim; i++)
      newPt[i] = oldPt[i];
    return ret;
  };
  _.minimise = function minimise() {
    return this.minimise_0(4e3, 1e-4, 1e-6);
  };
  _.minimise_0 = function minimise_0(maxIts, gradTol, funcTol) {
    var i, i0, listener, listener$iterator, res;
    res = 1;
    for (i0 = 0; i0 < this.mMol.getAllAtoms_0(); i0++) {
      this.mPos[3 * i0] = this.mMol.getAtomX_0(i0);
      this.mPos[3 * i0 + 1] = this.mMol.getAtomY_0(i0);
      this.mPos[3 * i0 + 2] = this.mMol.getAtomZ_0(i0);
    }
    res = this.run_minimiser(maxIts, gradTol, funcTol);
    if (res == 0) {
      for (i = 0; i < this.mMol.getAllAtoms_0(); i++) {
        this.mMol.setAtomX_0(i, this.mPos[3 * i]);
        this.mMol.setAtomY_0(i, this.mPos[3 * i + 1]);
        this.mMol.setAtomZ_0(i, this.mPos[3 * i + 2]);
      }
    }
    for (listener$iterator = this.listeners.iterator(); listener$iterator.hasNext_0(); ) {
      listener = castTo(listener$iterator.next_3(), 580);
      listener.stateChanged();
    }
    return res;
  };
  _.run_minimiser = function run_minimiser(maxIts, gradTol, funcTol) {
    var dGrad, fac, fad, fae, fp, gradScale, hessDGrad, i, i0, i1, i2, i3, i4, i5, i6, invHessian, itab, iter, j, listener, listener$iterator, maxStep, newPos, status_0, sum, sumDGrad, sumXi, t0, t1, temp, term, test_0, timePassed, tmp, xi;
    this.mGrad = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDim, 15, 1);
    dGrad = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDim, 15, 1);
    hessDGrad = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDim, 15, 1);
    newPos = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDim, 15, 1);
    xi = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDim, 15, 1);
    invHessian = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDim * this.mDim, 15, 1);
    for (i0 = 0; i0 < this.mDim; i0++)
      newPos[i0] = this.mPos[i0];
    fp = this.getTotalEnergy_1(this.mPos);
    this.updateGradient();
    this.zeroGradient();
    sum = 0;
    for (i1 = 0; i1 < this.mDim; i1++) {
      invHessian[i1 * this.mDim + i1] = 1;
      xi[i1] = -this.mGrad[i1];
      sum += this.mPos[i1] * this.mPos[i1];
    }
    maxStep = 100 * $wnd.Math.max($wnd.Math.sqrt(sum), this.mDim);
    t0 = jl.currentTimeMillis_0();
    for (iter = 1; iter <= maxIts && !this.mIsInterrupted; iter++) {
      status_0 = this.linearSearch(this.mPos, fp, xi, newPos, maxStep);
      if (status_0 < 0)
        return 2;
      fp = this.mTotalEnergy;
      test_0 = 0;
      for (i2 = 0; i2 < this.mDim; i2++) {
        xi[i2] = newPos[i2] - this.mPos[i2];
        this.mPos[i2] = newPos[i2];
        temp = $wnd.Math.abs(xi[i2]) / $wnd.Math.max($wnd.Math.abs(this.mPos[i2]), 1);
        if (temp > test_0)
          test_0 = temp;
        dGrad[i2] = this.mGrad[i2];
      }
      if (test_0 < 12e-8) {
        return 0;
      }
      gradScale = this.updateGradient();
      this.zeroGradient();
      test_0 = 0;
      term = $wnd.Math.max(this.mTotalEnergy * gradScale, 1);
      for (i3 = 0; i3 < this.mDim; i3++) {
        tmp = $wnd.Math.abs(this.mGrad[i3]) * $wnd.Math.max($wnd.Math.abs(this.mPos[i3]), 1);
        test_0 = $wnd.Math.max(test_0, tmp);
        dGrad[i3] = this.mGrad[i3] - dGrad[i3];
      }
      test_0 /= term;
      if (test_0 < gradTol) {
        return 0;
      }
      fac = 0;
      fae = 0;
      sumDGrad = 0;
      sumXi = 0;
      for (i4 = 0; i4 < this.mDim; i4++) {
        itab = i4 * this.mDim;
        hessDGrad[i4] = 0;
        for (j = 0; j < this.mDim; j++)
          hessDGrad[i4] += invHessian[itab + j] * dGrad[j];
        fac += dGrad[i4] * xi[i4];
        fae += dGrad[i4] * hessDGrad[i4];
        sumDGrad += dGrad[i4] * dGrad[i4];
        sumXi += xi[i4] * xi[i4];
      }
      if (fac > $wnd.Math.sqrt(3e-8 * sumDGrad * sumXi)) {
        fac = 1 / fac;
        fad = 1 / fae;
        for (i5 = 0; i5 < this.mDim; i5++)
          dGrad[i5] = fac * xi[i5] - fad * hessDGrad[i5];
        for (i6 = 0; i6 < this.mDim; i6++) {
          itab = i6 * this.mDim;
          for (j = i6; j < this.mDim; j++) {
            invHessian[itab + j] += fac * xi[i6] * xi[j] - fad * hessDGrad[i6] * hessDGrad[j] + fae * dGrad[i6] * dGrad[j];
            invHessian[j * this.mDim + i6] = invHessian[itab + j];
          }
        }
      }
      for (i = 0; i < this.mDim; i++) {
        itab = i * this.mDim;
        xi[i] = 0;
        for (j = 0; j < this.mDim; j++)
          xi[i] -= invHessian[itab + j] * this.mGrad[j];
      }
      t1 = jl.currentTimeMillis_0();
      timePassed = sub_2(t1, t0);
      if (gte_0(timePassed, this.mTimeInterval)) {
        for (listener$iterator = this.listeners.iterator(); listener$iterator.hasNext_0(); ) {
          listener = castTo(listener$iterator.next_3(), 580);
          listener.stateChanged();
        }
        t0 = t1;
      }
    }
    return 1;
  };
  _.zeroGradient = function zeroGradient() {
    var i, i$array, i$index, i$max;
    if (jsNotEquals(this.mFixedAtoms, null)) {
      for (i$array = this.mFixedAtoms, i$index = 0, i$max = i$array.length; i$index < i$max; ++i$index) {
        i = i$array[i$index];
        this.mGrad[3 * i] = 0;
        this.mGrad[3 * i + 1] = 0;
        this.mGrad[3 * i + 2] = 0;
      }
    }
  };
  _.mDim = 0;
  _.mIsInterrupted = false;
  _.mTimeInterval = 0;
  _.mTotalEnergy = 0;
  carcf.EPS = 3e-8;
  carcf.FUNCTOL = 1e-4;
  carcf.MAXSTEP = 100;
  carcf.MOVETOL = 1e-7;
  carcf.TOLX = 0;
  cggl.Lcom_actelion_research_chem_forcefield_AbstractForceField_2_classLit = createForClass("com.actelion.research.chem.forcefield", "AbstractForceField", 318, cggl.Ljava_lang_Object_2_classLit);
  carcf.$clinit_ForceFieldChangeListener = function $clinit_ForceFieldChangeListener() {
    carcf.$clinit_ForceFieldChangeListener = emptyMethod;
  };
  cggl.Lcom_actelion_research_chem_forcefield_ForceFieldChangeListener_2_classLit = createForInterface("com.actelion.research.chem.forcefield", "ForceFieldChangeListener");
  carcfm.$clinit_EnergyTerm = function $clinit_EnergyTerm() {
    carcfm.$clinit_EnergyTerm = emptyMethod;
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_EnergyTerm_2_classLit = createForInterface("com.actelion.research.chem.forcefield.mmff", "EnergyTerm");
  carcfm.$clinit_AngleBend = function $clinit_AngleBend() {
    carcfm.$clinit_AngleBend = emptyMethod;
    jl.$clinit_Object();
  };
  carcfm.AngleBend = function AngleBend(table, mol, a1, a2, a3) {
    Object_0.call(this);
    this.$init_82();
    this.mol = mol;
    this.a1 = a1;
    this.a2 = a2;
    this.a3 = a3;
    this.isLinear = table.atom.linear(mol.getAtomType(a2));
    this.theta0 = table.angle.theta_0(mol, a1, a2, a3);
    this.ka = table.angle.ka_1(mol, a1, a2, a3);
  };
  carcfm.findIn = function findIn(t, mol) {
    carcfm.$clinit_AngleBend();
    var angles, atom, i, k, nbr_i, nbr_k;
    angles = new ju.ArrayList();
    for (atom = 0; atom < mol.getAllAtoms_0(); atom++) {
      if (mol.getAllConnAtoms_0(atom) > 1) {
        for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
          nbr_i = mol.getConnAtom_0(atom, i);
          for (k = i + 1; k < mol.getAllConnAtoms_0(atom); k++) {
            nbr_k = mol.getConnAtom_0(atom, k);
            angles.add(new carcfm.AngleBend(t, mol, nbr_i, atom, nbr_k));
          }
        }
      }
    }
    return angles;
  };
  defineClass(437, 1, { 118: 1, 1: 1 }, carcfm.AngleBend);
  _.$init_82 = function $init_82() {
  };
  _.getEnergy_0 = function getEnergy_0(pos, detail, detailID, skipHydrogen) {
    var angle, c2, cb, e, theta;
    if (skipHydrogen && (this.mol.getAtomicNo_0(this.a1) == 1 || this.mol.getAtomicNo_0(this.a3) == 1))
      return 0;
    theta = new carcfm.Vector3_4(pos, this.a2, this.a1).angle_0(new carcfm.Vector3_4(pos, this.a2, this.a3));
    angle = jl.toDegrees(theta) - this.theta0;
    cb = -6981317e-9;
    c2 = 143.9325 * 0.017453292519943295 * 0.017453292519943295;
    e = this.isLinear ? 143.9325 * this.ka * (1 + $wnd.Math.cos(theta)) : 0.5 * 0.043844346773450435 * this.ka * angle * angle * (1 + -6981317e-9 * angle);
    if (isNotNull(detail))
      detail.append_9(detailID + "	angleBend	" + caru.toString_22(jl.toDegrees(theta)) + "	" + caru.toString_22(this.theta0) + "	" + this.a1 + "," + this.a2 + "," + this.a3 + "	" + caru.toString_22(e) + "\n");
    return e;
  };
  _.getGradient = function getGradient(pos, grad) {
    var angleTerm, c2, cb, cosTheta, dCos_dS, dE_dTheta, dist0, dist1, r0, r1, sinTheta, sinThetaSq;
    r0 = new carcfm.Vector3_4(pos, this.a2, this.a1).normalise();
    r1 = new carcfm.Vector3_4(pos, this.a2, this.a3).normalise();
    dist0 = new carcfm.Vector3_4(pos, this.a2, this.a1).length_2();
    dist1 = new carcfm.Vector3_4(pos, this.a2, this.a3).length_2();
    cosTheta = r0.cosAngle(r1);
    sinThetaSq = 1 - cosTheta * cosTheta;
    sinTheta = 1e-8;
    if (sinThetaSq > 0)
      sinTheta = $wnd.Math.sqrt(sinThetaSq);
    angleTerm = 57.29577951308232 * $wnd.Math.acos(cosTheta) - this.theta0;
    cb = -6981317e-9;
    c2 = 143.9325 * 0.017453292519943295 * 0.017453292519943295;
    dE_dTheta = 57.29577951308232 * c2 * this.ka * angleTerm * (1 + 1.5 * cb * angleTerm);
    if (this.isLinear)
      dE_dTheta = -143.9325 * this.ka * sinTheta;
    dCos_dS = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [1 / dist0 * (r1.x_0 - cosTheta * r0.x_0), 1 / dist0 * (r1.y_0 - cosTheta * r0.y_0), 1 / dist0 * (r1.z_0 - cosTheta * r0.z_0), 1 / dist1 * (r0.x_0 - cosTheta * r1.x_0), 1 / dist1 * (r0.y_0 - cosTheta * r1.y_0), 1 / dist1 * (r0.z_0 - cosTheta * r1.z_0)]);
    grad[3 * this.a1] += dE_dTheta * dCos_dS[0] / -sinTheta;
    grad[3 * this.a1 + 1] += dE_dTheta * dCos_dS[1] / -sinTheta;
    grad[3 * this.a1 + 2] += dE_dTheta * dCos_dS[2] / -sinTheta;
    grad[3 * this.a2] += dE_dTheta * (-dCos_dS[0] - dCos_dS[3]) / -sinTheta;
    grad[3 * this.a2 + 1] += dE_dTheta * (-dCos_dS[1] - dCos_dS[4]) / -sinTheta;
    grad[3 * this.a2 + 2] += dE_dTheta * (-dCos_dS[2] - dCos_dS[5]) / -sinTheta;
    grad[3 * this.a3] += dE_dTheta * dCos_dS[3] / -sinTheta;
    grad[3 * this.a3 + 1] += dE_dTheta * dCos_dS[4] / -sinTheta;
    grad[3 * this.a3 + 2] += dE_dTheta * dCos_dS[5] / -sinTheta;
  };
  _.a1 = 0;
  _.a2 = 0;
  _.a3 = 0;
  _.isLinear = false;
  _.ka = 0;
  _.theta0 = 0;
  cggl.Lcom_actelion_research_chem_forcefield_mmff_AngleBend_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "AngleBend", 437, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_BadAtomTypeException = function $clinit_BadAtomTypeException() {
    carcfm.$clinit_BadAtomTypeException = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  carcfm.BadAtomTypeException = function BadAtomTypeException(message) {
    carcfm.$clinit_BadAtomTypeException();
    jl.RuntimeException_1.call(this, message);
    this.$init_86();
  };
  defineClass(209, 23, { 209: 1, 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, carcfm.BadAtomTypeException);
  _.$init_86 = function $init_86() {
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_BadAtomTypeException_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "BadAtomTypeException", 209, cggl.Ljava_lang_RuntimeException_2_classLit);
  carcfm.$clinit_BadRingAromException = function $clinit_BadRingAromException() {
    carcfm.$clinit_BadRingAromException = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  carcfm.BadRingAromException = function BadRingAromException() {
    carcfm.$clinit_BadRingAromException();
    jl.RuntimeException.call(this);
    this.$init_87();
  };
  defineClass(382, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, carcfm.BadRingAromException);
  _.$init_87 = function $init_87() {
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_BadRingAromException_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "BadRingAromException", 382, cggl.Ljava_lang_RuntimeException_2_classLit);
  carcfm.$clinit_BondStretch = function $clinit_BondStretch() {
    carcfm.$clinit_BondStretch = emptyMethod;
    jl.$clinit_Object();
  };
  carcfm.BondStretch = function BondStretch(table, mol, bond) {
    carcfm.BondStretch_0.call(this, table, mol, mol.getBondAtom_0(0, bond), mol.getBondAtom_0(1, bond));
  };
  carcfm.BondStretch_0 = function BondStretch_0(table, mol, a1, a2) {
    Object_0.call(this);
    this.$init_88();
    this.mol = mol;
    this.a1 = a1;
    this.a2 = a2;
    this.r0 = table.bond.r0_1(mol, a1, a2);
    this.kb = table.bond.kb_1(mol, a1, a2);
  };
  carcfm.findIn_0 = function findIn_0(t, mol) {
    carcfm.$clinit_BondStretch();
    var b, bstretches;
    bstretches = new ju.ArrayList();
    for (b = 0; b < mol.getAllBonds_0(); b++)
      bstretches.add(new carcfm.BondStretch(t, mol, b));
    return bstretches;
  };
  defineClass(261, 1, { 118: 1, 1: 1 }, carcfm.BondStretch);
  _.$init_88 = function $init_88() {
  };
  _.getEnergy_0 = function getEnergy_1(pos, detail, detailID, skipHydrogen) {
    var c1, c3, cs, diff, dist, e;
    if (skipHydrogen && (this.mol.getAtomicNo_0(this.a1) == 1 || this.mol.getAtomicNo_0(this.a2) == 1))
      return 0;
    c1 = 143.9325;
    cs = -2;
    c3 = 7 / 12;
    dist = new carcfm.Vector3_3(pos, this.a1).distance_0(new carcfm.Vector3_3(pos, this.a2));
    diff = (dist - this.r0) * (dist - this.r0);
    e = 0.5 * 143.9325 * this.kb * diff * (1 + -2 * (dist - this.r0) + 0.5833333333333334 * -2 * -2 * diff);
    if (isNotNull(detail))
      detail.append_9(detailID + "	bondStretch	" + caru.toString_22(dist) + "	" + caru.toString_22(this.r0) + "	" + this.a1 + "," + this.a2 + "	" + caru.toString_22(e) + "\n");
    return e;
  };
  _.getGradient = function getGradient_0(pos, grad) {
    var c1, c3, cs, dE_dr, dist, distTerm, i;
    cs = -2;
    c1 = 143.9325;
    c3 = 7 / 12;
    dist = new carcfm.Vector3_3(pos, this.a1).distance_0(new carcfm.Vector3_3(pos, this.a2));
    distTerm = dist - this.r0;
    dE_dr = 143.9325 * this.kb * distTerm * (1 + 1.5 * -2 * distTerm + 2 * 0.5833333333333334 * -2 * -2 * distTerm * distTerm);
    if (dist > 0) {
      for (i = 0; i < 3; i++) {
        grad[3 * this.a1 + i] += dE_dr * (pos[3 * this.a1 + i] - pos[3 * this.a2 + i]) / dist;
        grad[3 * this.a2 + i] -= dE_dr * (pos[3 * this.a1 + i] - pos[3 * this.a2 + i]) / dist;
      }
    }
  };
  _.a1 = 0;
  _.a2 = 0;
  _.kb = 0;
  _.r0 = 0;
  cggl.Lcom_actelion_research_chem_forcefield_mmff_BondStretch_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "BondStretch", 261, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_Csv = function $clinit_Csv() {
    carcfm.$clinit_Csv = emptyMethod;
    jl.$clinit_Object();
  };
  carcfm.readFile = function readFile(path) {
    carcfm.$clinit_Csv();
    var br, c, e, format, line, ln, row, size_0, table;
    br = null;
    try {
      br = new ji.BufferedReader(new ji.InputStreamReader_0(ocu.getResourceAsStream(path), (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
      size_0 = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(br.readLine()));
      format = jl.split_Ljava_lang_String___Ljava_lang_String___devirtual$(jl.trim__Ljava_lang_String___devirtual$(br.readLine()), ",");
      table = initMultidimensionalArray(cggl.Ljava_lang_Object_2_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 4: 1, 1: 1, 7: 1 }], [7, 1], 5, [size_0, format.length], 2);
      for (ln = 0; jsNotEquals(line = br.readLine(), null) && ln < size_0; ln++) {
        row = jl.split_Ljava_lang_String___Ljava_lang_String___devirtual$(jl.trim__Ljava_lang_String___devirtual$(line), ",");
        for (c = 0; c < format.length; c++) {
          switch (jl.charAt_I_C__devirtual$_0(format[c], 0)) {
            case 105:
              setCheck(table[ln], c, jl.valueOf_12(jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(row[c]))));
              break;
            case 102:
              setCheck(table[ln], c, jl.valueOf_9(parseDouble(jl.trim__Ljava_lang_String___devirtual$(row[c]))));
              break;
            case 99:
              setCheck(table[ln], c, valueOf_8(jl.charAt_I_C__devirtual$_0(jl.replace_Ljava_lang_CharSequence_Ljava_lang_CharSequence__Ljava_lang_String___devirtual$(jl.replace_Ljava_lang_CharSequence_Ljava_lang_CharSequence__Ljava_lang_String___devirtual$(jl.trim__Ljava_lang_String___devirtual$(row[c]), "'", ""), '"', ""), 0)));
              break;
          }
        }
      }
      return table;
    } catch ($e1) {
      $e1 = toJava($e1);
      if (instanceOf($e1, 276)) {
        e = $e1;
        (jl.$clinit_System(), jl.out_0).println_0("Could not find file: '" + path + "'");
      } else if (instanceOf($e1, 50)) {
        e = $e1;
        (jl.$clinit_System(), jl.out_0).println_0("IO Exception!");
      } else
        throw toJs($e1);
    } finally {
      try {
        if (isNotNull(br))
          br.close_0();
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 50)) {
          e = $e0;
          (jl.$clinit_System(), jl.out_0).println_0("Couldn't close buffered reader!");
        } else
          throw toJs($e0);
      }
    }
    return initMultidimensionalArray(cggl.Ljava_lang_Object_2_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 4: 1, 1: 1, 7: 1 }], [7, 1], 5, [1, 1], 2);
  };
  carcfm.readIntsFile = function readIntsFile(path) {
    carcfm.$clinit_Csv();
    var cols_0, i, j, newtable, rows_0, table;
    table = carcfm.readFile(path);
    rows_0 = table.length;
    cols_0 = table[0].length;
    newtable = initMultidimensionalArray(cggl.I_classLit, [{ 25: 1, 4: 1, 1: 1, 7: 1 }, { 6: 1, 4: 1, 1: 1 }], [6, 5], 15, [rows_0, cols_0], 2);
    for (i = 0; i < rows_0; i++)
      for (j = 0; j < cols_0; j++)
        newtable[i][j] = castTo(table[i][j], 35).intValue();
    return newtable;
  };
  defineClass(809, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_forcefield_mmff_Csv_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "Csv", 809, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_Electrostatic = function $clinit_Electrostatic() {
    carcfm.$clinit_Electrostatic = emptyMethod;
    jl.$clinit_Object();
  };
  carcfm.Electrostatic = function Electrostatic(mol, a1, a2, rel_0, chge1, chge2, distModel, dielConst) {
    Object_0.call(this);
    this.$init_89();
    this.mol = mol;
    this.a1 = a1;
    this.a2 = a2;
    this.rel_0 = rel_0;
    this.distModel = distModel;
    this.charge_term = chge1 * chge2 / dielConst;
  };
  carcfm.findIn_1 = function findIn_1(table, mol, sep, nonbondedCutoff, dielModel, dielConst) {
    carcfm.$clinit_Electrostatic();
    var charges, eles, i, j, relation;
    eles = new ju.ArrayList();
    charges = carcfmt2.getCharges(table, mol);
    for (i = 0; i < mol.getAllAtoms_0(); i++) {
      for (j = 0; j < i + 1; j++) {
        relation = sep.get_1(new carcfm.SortedPair(i, j));
        if ((jsEquals(relation, (carcfm.$clinit_Separation$Relation(), carcfm.ONE_FOUR)) || jsEquals(relation, (carcfm.$clinit_Separation$Relation(), carcfm.ONE_X))) && $wnd.Math.abs(charges[i]) > 1e-5 && $wnd.Math.abs(charges[j]) > 1e-5) {
          if (new carcfm.Vector3_1(mol, i, j).length_2() < nonbondedCutoff) {
            eles.add(new carcfm.Electrostatic(mol, i, j, relation, charges[i], charges[j], dielModel, dielConst));
          }
        }
      }
    }
    return eles;
  };
  defineClass(438, 1, { 118: 1, 1: 1 }, carcfm.Electrostatic);
  _.$init_89 = function $init_89() {
  };
  _.getEnergy_0 = function getEnergy_2(pos, detail, detailID, skipHydrogen) {
    var corr_dist, diel, dist, e;
    if (skipHydrogen && (this.mol.getAtomicNo_0(this.a1) == 1 || this.mol.getAtomicNo_0(this.a2) == 1))
      return 0;
    dist = new carcfm.Vector3_4(pos, this.a1, this.a2).length_2();
    corr_dist = dist + 0.05;
    diel = 332.0716;
    if (this.distModel)
      corr_dist *= corr_dist;
    e = diel * this.charge_term / corr_dist * (jsEquals(this.rel_0, (carcfm.$clinit_Separation$Relation(), carcfm.ONE_FOUR)) ? 0.75 : 1);
    if (isNotNull(detail))
      detail.append_9(detailID + "	electrostatic	" + caru.toString_22(dist) + "		" + this.a1 + "," + this.a2 + "	" + caru.toString_22(e) + "\n");
    return e;
  };
  _.getGradient = function getGradient_1(pos, grad) {
    var corr_dist, dE_dr, dGrad, dist, i;
    dist = new carcfm.Vector3_4(pos, this.a1, this.a2).length_2();
    corr_dist = dist + 0.05;
    corr_dist *= this.distModel ? corr_dist * corr_dist : corr_dist;
    dE_dr = -332.0716 * (this.distModel ? 2 : 1) * this.charge_term / corr_dist * (jsEquals(this.rel_0, (carcfm.$clinit_Separation$Relation(), carcfm.ONE_FOUR)) ? 0.75 : 1);
    for (i = 0; i < 3; i++) {
      dGrad = 0.02;
      if (dist > 0)
        dGrad = dE_dr * (pos[3 * this.a1 + i] - pos[3 * this.a2 + i]) / dist;
      grad[3 * this.a1 + i] += dGrad;
      grad[3 * this.a2 + i] -= dGrad;
    }
  };
  _.a1 = 0;
  _.a2 = 0;
  _.charge_term = 0;
  _.distModel = false;
  cggl.Lcom_actelion_research_chem_forcefield_mmff_Electrostatic_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "Electrostatic", 438, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_ForceFieldMMFF94 = function $clinit_ForceFieldMMFF94() {
    carcfm.$clinit_ForceFieldMMFF94 = emptyMethod;
    carcf.$clinit_AbstractForceField();
    carcfm.mTables = new ju.HashMap();
  };
  carcfm.ForceFieldMMFF94 = function ForceFieldMMFF942(mol, tablename) {
    carcfm.$clinit_ForceFieldMMFF94();
    carcfm.ForceFieldMMFF94_0.call(this, mol, tablename, new ju.HashMap());
  };
  carcfm.ForceFieldMMFF94_0 = function ForceFieldMMFF94_0(m, tablename, options) {
    carcfm.$clinit_ForceFieldMMFF94();
    var dielConst, dielModel, nonBondedThresh, sep, table;
    carcf.AbstractForceField.call(this, m);
    this.$init_90();
    this.mMMFFMol = new carcfm.MMFFMolecule(m);
    this.mMol.ensureHelperArrays_0(7);
    table = castTo(carcfm.mTables.get(tablename), 201);
    nonBondedThresh = options.containsKey("nonbonded cutoff") ? jl.doubleValue__D__devirtual$_0(castToDouble(castToDouble(options.get("nonbonded cutoff")))) : 100;
    dielConst = options.containsKey("dielectric constant") ? jl.doubleValue__D__devirtual$_0(castToDouble(castToDouble(options.get("dielectric constant")))) : 1;
    dielModel = options.containsKey("dielectric model") && jl.equals_Ljava_lang_Object__Z__devirtual$(options.get("dielectric model"), "distance");
    sep = new carcfm.Separation(this.mMMFFMol);
    if (!options.containsKey("angle bend") || jl.booleanValue__Z__devirtual$(castToBoolean(castToBoolean(options.get("angle bend")))))
      this.mEnergies.addAll(carcfm.findIn(table, this.mMMFFMol));
    if (!options.containsKey("bond stretch") || jl.booleanValue__Z__devirtual$(castToBoolean(castToBoolean(options.get("bond stretch")))))
      this.mEnergies.addAll(carcfm.findIn_0(table, this.mMMFFMol));
    if (!options.containsKey("electrostatic") || jl.booleanValue__Z__devirtual$(castToBoolean(castToBoolean(options.get("electrostatic")))))
      this.mEnergies.addAll(carcfm.findIn_1(table, this.mMMFFMol, sep, nonBondedThresh, dielModel, dielConst));
    if (!options.containsKey("out of plane") || jl.booleanValue__Z__devirtual$(castToBoolean(castToBoolean(options.get("out of plane")))))
      this.mEnergies.addAll(carcfm.findIn_2(table, this.mMMFFMol));
    if (!options.containsKey("stretch bend") || jl.booleanValue__Z__devirtual$(castToBoolean(castToBoolean(options.get("stretch bend")))))
      this.mEnergies.addAll(carcfm.findIn_3(table, this.mMMFFMol));
    if (!options.containsKey("torsion angle") || jl.booleanValue__Z__devirtual$(castToBoolean(castToBoolean(options.get("torsion angle")))))
      this.mEnergies.addAll(carcfm.findIn_4(table, this.mMMFFMol));
    if (!options.containsKey("van der waals") || jl.booleanValue__Z__devirtual$(castToBoolean(castToBoolean(options.get("van der waals")))))
      this.mEnergies.addAll(carcfm.findIn_5(table, this.mMMFFMol, sep, nonBondedThresh));
  };
  carcfm.initialize_4 = function initialize_4(tableSet) {
    carcfm.$clinit_ForceFieldMMFF94();
    carcfm.loadTable(tableSet, carcfm.newMMFF94(tableSet));
  };
  carcfm.loadTable = function loadTable(name_0, table) {
    if (!carcfm.mTables.containsKey(name_0))
      carcfm.mTables.put(name_0, table);
  };
  defineClass(200, 318, { 1: 1 }, carcfm.ForceFieldMMFF94, carcfm.ForceFieldMMFF94_0);
  _.$init_90 = function $init_90() {
    this.mEnergies = new ju.ArrayList();
  };
  _.getTotalEnergy_0 = function getTotalEnergy() {
    return this.getTotalEnergy_2(this.mPos, null, false);
  };
  _.getTotalEnergy_1 = function getTotalEnergy_0(pos) {
    return this.getTotalEnergy_2(pos, null, false);
  };
  _.getTotalEnergy_2 = function getTotalEnergy_1(pos, detail, skipHydrogen) {
    var energy, no, term, term$iterator, total;
    if (isNotNull(detail))
      detail.append_9("no	type	is_property	opt_property	atoms	energy\n");
    total = 0;
    no = 1;
    for (term$iterator = this.mEnergies.iterator(); term$iterator.hasNext_0(); ) {
      term = castTo(term$iterator.next_3(), 118);
      energy = term.getEnergy_0(pos, detail, jl.toString_41(no), skipHydrogen);
      if (energy != 0) {
        total += energy;
        no++;
      }
    }
    return total;
  };
  _.size_1 = function size_3() {
    return this.mMMFFMol.getAllAtoms_0();
  };
  _.updateGradient = function updateGradient() {
    var engy, engy$iterator, gradScale, i, i0, maxGrad;
    this.mGrad = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDim, 15, 1);
    for (engy$iterator = this.mEnergies.iterator(); engy$iterator.hasNext_0(); ) {
      engy = castTo(engy$iterator.next_3(), 118);
      engy.getGradient(this.mPos, this.mGrad);
    }
    maxGrad = -1e8;
    gradScale = 0.1;
    for (i0 = 0; i0 < this.mDim; i0++) {
      this.mGrad[i0] *= gradScale;
      if (this.mGrad[i0] > maxGrad)
        maxGrad = this.mGrad[i0];
    }
    if (maxGrad > 10) {
      while (maxGrad * gradScale > 10)
        gradScale *= 0.5;
      for (i = 0; i < this.mDim; i++)
        this.mGrad[i] *= gradScale;
    }
    return gradScale;
  };
  _.zeroGradient = function zeroGradient_0() {
    var hydrogenMap, i, i$array, i$index, i$max, mappedIndex;
    if (jsNotEquals(this.mFixedAtoms, null)) {
      hydrogenMap = this.mMMFFMol.getHydrogenMap();
      for (i$array = this.mFixedAtoms, i$index = 0, i$max = i$array.length; i$index < i$max; ++i$index) {
        i = i$array[i$index];
        mappedIndex = hydrogenMap[i];
        this.mGrad[3 * mappedIndex] = 0;
        this.mGrad[3 * mappedIndex + 1] = 0;
        this.mGrad[3 * mappedIndex + 2] = 0;
      }
    }
  };
  carcfm.MMFF94 = "MMFF94";
  carcfm.MMFF94S = "MMFF94s";
  carcfm.MMFF94SPLUS = "MMFF94s+";
  cggl.Lcom_actelion_research_chem_forcefield_mmff_ForceFieldMMFF94_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "ForceFieldMMFF94", 200, cggl.Lcom_actelion_research_chem_forcefield_AbstractForceField_2_classLit);
  carcfm.$clinit_MMFFMolecule = function $clinit_MMFFMolecule() {
    carcfm.$clinit_MMFFMolecule = emptyMethod;
    carc2.$clinit_StereoMolecule();
  };
  carcfm.MMFFMolecule = function MMFFMolecule(mol) {
    carcfm.$clinit_MMFFMolecule();
    var allset, changed, i, r, rings;
    carc2.StereoMolecule_1.call(this, mol);
    this.$init_91();
    this.mHydrogenMap = this.getHandleHydrogenMap_0();
    rings = this.getRingSet_0();
    this.mRingArom = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_forcefield_mmff_RingBoolean_2_classLit, { 4: 1, 1: 1, 7: 1 }, 144, rings.getSize_0(), 0, 1);
    ju.fill_2(this.mRingArom, (carcfm.$clinit_RingBoolean(), carcfm.NOT_SET));
    allset = false;
    changed = true;
    while (!allset && changed) {
      allset = true;
      changed = false;
      for (r = 0; r < rings.getSize_0(); r++) {
        if (jsEquals(this.mRingArom[r], (carcfm.$clinit_RingBoolean(), carcfm.NOT_SET))) {
          setCheck(this.mRingArom, r, carcfmt2.ringIsMMFFAromatic_0(this, r));
          if (jsNotEquals(this.mRingArom[r], (carcfm.$clinit_RingBoolean(), carcfm.NOT_SET)))
            changed = true;
        }
        if (jsEquals(this.mRingArom[r], (carcfm.$clinit_RingBoolean(), carcfm.NOT_SET)))
          allset = false;
      }
    }
    if (!allset)
      throw toJs(new carcfm.BadRingAromException());
    this.mAtomTypes = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.getAllAtoms_0(), 15, 1);
    for (i = 0; i < this.mAtomTypes.length; i++) {
      this.mAtomTypes[i] = -1;
      this.mAtomTypes[i] = carcfmt2.getType_0(this, i);
      if (this.mAtomTypes[i] == 0)
        throw toJs(new carcfm.BadAtomTypeException("Couldn't assign an atom type to atom " + i + " (" + this.getAtomLabel_0(i) + ")"));
    }
  };
  defineClass(319, 17, { 60: 1, 17: 1, 4: 1, 1: 1 }, carcfm.MMFFMolecule);
  _.$init_91 = function $init_91() {
  };
  _.getAtomType = function getAtomType_0(a) {
    return this.mAtomTypes[a];
  };
  _.getHydrogenMap = function getHydrogenMap() {
    return this.mHydrogenMap;
  };
  _.isSetRingMMFFAromaticity = function isSetRingMMFFAromaticity(r) {
    return jsNotEquals(this.mRingArom[r], (carcfm.$clinit_RingBoolean(), carcfm.NOT_SET));
  };
  _.ringIsMMFFAromatic = function ringIsMMFFAromatic(r) {
    return jsEquals(this.mRingArom[r], (carcfm.$clinit_RingBoolean(), carcfm.TRUE));
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_MMFFMolecule_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "MMFFMolecule", 319, cggl.Lcom_actelion_research_chem_StereoMolecule_2_classLit);
  carcfm.$clinit_OutOfPlane = function $clinit_OutOfPlane() {
    carcfm.$clinit_OutOfPlane = emptyMethod;
    jl.$clinit_Object();
  };
  carcfm.OutOfPlane = function OutOfPlane(table, mol, ac, a1, a2, a3) {
    Object_0.call(this);
    this.$init_92();
    this.mol = mol;
    this.ac = ac;
    this.a1 = a1;
    this.a2 = a2;
    this.a3 = a3;
    this.koop = table.oop.getKoop(mol, ac, a1, a2, a3);
  };
  carcfm.findIn_2 = function findIn_2(t, mol) {
    carcfm.$clinit_OutOfPlane();
    var a1, a2, a3, ac, oops;
    oops = new ju.ArrayList();
    for (ac = 0; ac < mol.getAllAtoms_0(); ac++) {
      if (mol.getAllConnAtoms_0(ac) != 3)
        continue;
      a1 = mol.getConnAtom_0(ac, 0);
      a2 = mol.getConnAtom_0(ac, 1);
      a3 = mol.getConnAtom_0(ac, 2);
      oops.add(new carcfm.OutOfPlane(t, mol, ac, a1, a2, a3));
      oops.add(new carcfm.OutOfPlane(t, mol, ac, a1, a3, a2));
      oops.add(new carcfm.OutOfPlane(t, mol, ac, a2, a3, a1));
    }
    return oops;
  };
  defineClass(215, 1, { 118: 1, 1: 1 }, carcfm.OutOfPlane);
  _.$init_92 = function $init_92() {
  };
  _.getEnergy_0 = function getEnergy_3(pos, detail, detailID, skipHydrogen) {
    var c2, chi, e, n, rji, rjk, rjl;
    if (skipHydrogen && (this.mol.getAtomicNo_0(this.a1) == 1 || this.mol.getAtomicNo_0(this.a2) == 1 || this.mol.getAtomicNo_0(this.a3) == 1))
      return 0;
    rji = new carcfm.Vector3_4(pos, this.ac, this.a1).normalise();
    rjk = new carcfm.Vector3_4(pos, this.ac, this.a2).normalise();
    rjl = new carcfm.Vector3_4(pos, this.ac, this.a3).normalise();
    n = rji.cross_0(rjk).normalise();
    chi = 57.29577951308232 * $wnd.Math.asin(n.dot_0(rjl));
    c2 = 143.9325 * 0.017453292519943295 * 0.017453292519943295;
    e = 0.5 * c2 * this.koop * chi * chi;
    if (isNotNull(detail))
      detail.append_9(detailID + "	outOfPlane	" + caru.toString_22(chi) + "		" + this.a1 + "," + this.a2 + "," + this.a3 + "	" + caru.toString_22(e) + "\n");
    return e;
  };
  _.getGradient = function getGradient_2(pos, grad) {
    var c2, chi, cosChi, cosChiSq, cosTheta, dE_dChi, dji, djk, djl, i, n, rji, rjk, rjl, sinChi, sinTheta, sinThetaSq, t1, t2, t3, term1, term2, tg1, tg3, tg4;
    rji = new carcfm.Vector3_4(pos, this.ac, this.a1);
    rjk = new carcfm.Vector3_4(pos, this.ac, this.a2);
    rjl = new carcfm.Vector3_4(pos, this.ac, this.a3);
    dji = rji.length_2();
    djk = rjk.length_2();
    djl = rjl.length_2();
    rji = rji.normalise();
    rjk = rjk.normalise();
    rjl = rjl.normalise();
    n = rji.negate().cross_0(rjk).normalise();
    c2 = 143.9325 * 0.017453292519943295 * 0.017453292519943295;
    sinChi = rjl.dot_0(n);
    cosChiSq = 1 - sinChi * sinChi;
    cosChi = $wnd.Math.max(cosChiSq > 0 ? $wnd.Math.sqrt(cosChiSq) : 0, 1e-8);
    chi = 57.29577951308232 * $wnd.Math.asin(sinChi);
    cosTheta = rji.dot_0(rjk);
    sinThetaSq = $wnd.Math.max(1 - cosTheta * cosTheta, 1e-8);
    sinTheta = $wnd.Math.max(sinThetaSq > 0 ? $wnd.Math.sqrt(sinThetaSq) : 0, 1e-8);
    dE_dChi = 57.29577951308232 * 0.043844346773450435 * this.koop * chi;
    t1 = rjl.cross_0(rjk);
    t2 = rji.cross_0(rjl);
    t3 = rjk.cross_0(rji);
    term1 = cosChi * sinTheta;
    term2 = sinChi / (cosChi * sinThetaSq);
    tg1 = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [(t1.x_0 / term1 - (rji.x_0 - rjk.x_0 * cosTheta) * term2) / dji, (t1.y_0 / term1 - (rji.y_0 - rjk.y_0 * cosTheta) * term2) / dji, (t1.z_0 / term1 - (rji.z_0 - rjk.z_0 * cosTheta) * term2) / dji]);
    tg3 = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [(t2.x_0 / term1 - (rjk.x_0 - rji.x_0 * cosTheta) * term2) / djk, (t2.y_0 / term1 - (rjk.y_0 - rji.y_0 * cosTheta) * term2) / djk, (t2.z_0 / term1 - (rjk.z_0 - rji.z_0 * cosTheta) * term2) / djk]);
    tg4 = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [(t3.x_0 / term1 - rjl.x_0 * sinChi / cosChi) / djl, (t3.y_0 / term1 - rjl.y_0 * sinChi / cosChi) / djl, (t3.z_0 / term1 - rjl.z_0 * sinChi / cosChi) / djl]);
    for (i = 0; i < 3; i++) {
      grad[3 * this.a1 + i] += dE_dChi * tg1[i];
      grad[3 * this.ac + i] += -dE_dChi * (tg1[i] + tg3[i] + tg4[i]);
      grad[3 * this.a2 + i] += dE_dChi * tg3[i];
      grad[3 * this.a3 + i] += dE_dChi * tg4[i];
    }
  };
  _.a1 = 0;
  _.a2 = 0;
  _.a3 = 0;
  _.ac = 0;
  _.koop = 0;
  cggl.Lcom_actelion_research_chem_forcefield_mmff_OutOfPlane_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "OutOfPlane", 215, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_PeriodicTable_0 = function $clinit_PeriodicTable_0() {
    carcfm.$clinit_PeriodicTable_0 = emptyMethod;
    jl.$clinit_Object();
  };
  carcfm.row_0 = function row_0(ano) {
    carcfm.$clinit_PeriodicTable_0();
    if (ano < 3)
      return 0;
    else if (ano < 11)
      return 1;
    else if (ano < 19)
      return 2;
    else if (ano < 37)
      return 3;
    else if (ano < 55)
      return 4;
    return 0;
  };
  carcfm.rowtm = function rowtm(ano) {
    carcfm.$clinit_PeriodicTable_0();
    var row;
    row = 0;
    if (ano == 2)
      row = 1;
    else if (ano >= 3 && ano <= 10)
      row = 2;
    else if (ano >= 11 && ano <= 18)
      row = 3;
    else if (ano >= 19 && ano <= 36)
      row = 4;
    else if (ano >= 37 && ano <= 54)
      row = 5;
    if (ano >= 21 && ano <= 30 || ano >= 39 && ano <= 48)
      row *= 10;
    return row;
  };
  defineClass(808, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_forcefield_mmff_PeriodicTable_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "PeriodicTable", 808, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_RingBoolean = function $clinit_RingBoolean() {
    carcfm.$clinit_RingBoolean = emptyMethod;
    jl.$clinit_Enum();
    carcfm.TRUE = new carcfm.RingBoolean("TRUE", 0);
    carcfm.FALSE = new carcfm.RingBoolean("FALSE", 1);
    carcfm.NOT_SET = new carcfm.RingBoolean("NOT_SET", 2);
  };
  carcfm.RingBoolean = function RingBoolean(enum$name, enum$ordinal) {
    Enum.call(this, enum$name, enum$ordinal);
    this.$init_93();
  };
  carcfm.valueOf_1 = function valueOf_1(name_0) {
    carcfm.$clinit_RingBoolean();
    return valueOf((carcfm.$clinit_RingBoolean$Map(), carcfm.$MAP_0), name_0);
  };
  carcfm.values_1 = function values_1() {
    carcfm.$clinit_RingBoolean();
    return stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_forcefield_mmff_RingBoolean_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 144, 0, [carcfm.TRUE, carcfm.FALSE, carcfm.NOT_SET]);
  };
  defineClass(144, 48, { 144: 1, 4: 1, 22: 1, 48: 1, 1: 1 }, carcfm.RingBoolean);
  _.$init_93 = function $init_93() {
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_RingBoolean_2_classLit = createForEnum("com.actelion.research.chem.forcefield.mmff", "RingBoolean", 144, cggl.Ljava_lang_Enum_2_classLit, carcfm.values_1, carcfm.valueOf_1);
  carcfm.$clinit_RingBoolean$Map = function $clinit_RingBoolean$Map() {
    carcfm.$clinit_RingBoolean$Map = emptyMethod;
    carcfm.$MAP_0 = createValueOfMap(carcfm.values_1());
  };
  defineClass(759, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_forcefield_mmff_RingBoolean$Map_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "RingBoolean/Map", 759, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_Search = function $clinit_Search() {
    carcfm.$clinit_Search = emptyMethod;
    jl.$clinit_Object();
  };
  carcfm.binary = function binary(col, val, lo, hi, findlow, arr) {
    carcfm.$clinit_Search();
    var at, max_0, min_0, vat;
    lo = $wnd.Math.max(0, lo);
    hi = $wnd.Math.min(arr.length_1(), hi);
    at = narrow_int((hi - lo) / 2);
    min_0 = lo;
    max_0 = hi;
    if (arr.get_0(min_0, col) > val || arr.get_0(max_0 - 1, col) < val)
      return -1;
    while (hi >= lo) {
      at = lo + narrow_int((hi - lo) / 2);
      vat = arr.get_0(at, col);
      if (vat == val) {
        if (findlow && at > min_0 && arr.get_0(at - 1, col) == val)
          hi = at;
        else if (!findlow && at < max_0 - 1 && arr.get_0(at + 1, col) == val)
          lo = at;
        else
          return at;
      } else if (vat > val)
        hi = at;
      else if (vat < val)
        lo = at;
      if (hi - lo == 1 && arr.get_0(lo, col) < val && arr.get_0(hi, col) > val)
        break;
    }
    return -1;
  };
  carcfm.binary_0 = function binary_0(col, val, data_0) {
    carcfm.$clinit_Search();
    return carcfm.binary(col, val, 0, data_0.length_1(), true, data_0);
  };
  carcfm.binary_1 = function binary_1(cols_0, vals, data_0) {
    carcfm.$clinit_Search();
    var hi, i, lo;
    if (cols_0.length != vals.length)
      return -1;
    lo = 0;
    hi = data_0.length_1();
    for (i = 0; i < cols_0.length - 1; i++) {
      lo = carcfm.binary(cols_0[i], vals[i], lo, hi + 1, true, data_0);
      hi = carcfm.binary(cols_0[i], vals[i], lo, hi + 1, false, data_0);
      if (lo == -1 || hi == -1)
        return -1;
    }
    return carcfm.binary(cols_0[i], vals[i], lo, hi + 1, true, data_0);
  };
  carcfm.s_1 = function s_1(a, b) {
    carcfm.$clinit_Search();
    return a;
  };
  defineClass(806, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_forcefield_mmff_Search_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "Search", 806, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_Searchable = function $clinit_Searchable() {
    carcfm.$clinit_Searchable = emptyMethod;
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_Searchable_2_classLit = createForInterface("com.actelion.research.chem.forcefield.mmff", "Searchable");
  carcfm.$clinit_Separation = function $clinit_Separation() {
    carcfm.$clinit_Separation = emptyMethod;
    jl.$clinit_Object();
  };
  carcfm.Separation = function Separation(mol) {
    carcfm.$clinit_Separation();
    var atom, i, j, k, keyfour, keythree, keytwo, nbr1, nbr2, nbr3;
    Object_0.call(this);
    this.$init_94();
    for (atom = 0; atom < mol.getAllAtoms_0(); atom++) {
      this.table.put(new carcfm.SortedPair(atom, atom), (carcfm.$clinit_Separation$Relation(), carcfm.ONE_ONE));
      for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
        nbr1 = mol.getConnAtom_0(atom, i);
        keytwo = new carcfm.SortedPair(atom, nbr1);
        this.table.put(keytwo, (carcfm.$clinit_Separation$Relation(), carcfm.ONE_TWO));
        for (j = 0; j < mol.getAllConnAtoms_0(nbr1); j++) {
          nbr2 = mol.getConnAtom_0(nbr1, j);
          keythree = new carcfm.SortedPair(atom, nbr2);
          if (!this.table.containsKey(keythree) || maskUndefined(this.table.get(keythree)) === maskUndefined((carcfm.$clinit_Separation$Relation(), carcfm.ONE_FOUR)))
            this.table.put(keythree, (carcfm.$clinit_Separation$Relation(), carcfm.ONE_THREE));
          for (k = 0; k < mol.getAllConnAtoms_0(nbr2); k++) {
            nbr3 = mol.getConnAtom_0(nbr2, k);
            keyfour = new carcfm.SortedPair(atom, nbr3);
            if (!this.table.containsKey(keyfour))
              this.table.put(keyfour, (carcfm.$clinit_Separation$Relation(), carcfm.ONE_FOUR));
          }
        }
      }
    }
  };
  defineClass(320, 1, { 1: 1 }, carcfm.Separation);
  _.$init_94 = function $init_94() {
    this.table = new ju.HashMap();
  };
  _.get_1 = function get_1(key) {
    return jsNotEquals(this.table.get(key), null) ? castTo(this.table.get(key), 112) : (carcfm.$clinit_Separation$Relation(), carcfm.ONE_X);
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_Separation_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "Separation", 320, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_Separation$Relation = function $clinit_Separation$Relation() {
    carcfm.$clinit_Separation$Relation = emptyMethod;
    jl.$clinit_Enum();
    carcfm.ONE_ONE = new carcfm.Separation$Relation("ONE_ONE", 0);
    carcfm.ONE_TWO = new carcfm.Separation$Relation("ONE_TWO", 1);
    carcfm.ONE_THREE = new carcfm.Separation$Relation("ONE_THREE", 2);
    carcfm.ONE_FOUR = new carcfm.Separation$Relation("ONE_FOUR", 3);
    carcfm.ONE_X = new carcfm.Separation$Relation("ONE_X", 4);
  };
  carcfm.Separation$Relation = function Separation$Relation(enum$name, enum$ordinal) {
    Enum.call(this, enum$name, enum$ordinal);
    this.$init_95();
  };
  carcfm.valueOf_2 = function valueOf_2(name_0) {
    carcfm.$clinit_Separation$Relation();
    return valueOf((carcfm.$clinit_Separation$Relation$Map(), carcfm.$MAP_1), name_0);
  };
  carcfm.values_2 = function values_2() {
    carcfm.$clinit_Separation$Relation();
    return stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_forcefield_mmff_Separation$Relation_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 112, 0, [carcfm.ONE_ONE, carcfm.ONE_TWO, carcfm.ONE_THREE, carcfm.ONE_FOUR, carcfm.ONE_X]);
  };
  defineClass(112, 48, { 112: 1, 4: 1, 22: 1, 48: 1, 1: 1 }, carcfm.Separation$Relation);
  _.$init_95 = function $init_95() {
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_Separation$Relation_2_classLit = createForEnum("com.actelion.research.chem.forcefield.mmff", "Separation/Relation", 112, cggl.Ljava_lang_Enum_2_classLit, carcfm.values_2, carcfm.valueOf_2);
  carcfm.$clinit_Separation$Relation$Map = function $clinit_Separation$Relation$Map() {
    carcfm.$clinit_Separation$Relation$Map = emptyMethod;
    carcfm.$MAP_1 = createValueOfMap(carcfm.values_2());
  };
  defineClass(745, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_forcefield_mmff_Separation$Relation$Map_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "Separation/Relation/Map", 745, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_SortedPair = function $clinit_SortedPair() {
    carcfm.$clinit_SortedPair = emptyMethod;
    jl.$clinit_Object();
  };
  carcfm.SortedPair = function SortedPair(a, b) {
    carcfm.$clinit_SortedPair();
    Object_0.call(this);
    this.$init_96();
    this.a = a > b ? a : b;
    this.b = a > b ? b : a;
  };
  defineClass(91, 1, { 91: 1, 22: 1, 1: 1 }, carcfm.SortedPair);
  _.$init_96 = function $init_96() {
  };
  _.compareTo_1 = function compareTo_18(that) {
    return this.compareTo_9(castTo(that, 91));
  };
  _.compareTo_9 = function compareTo_17(that) {
    if (this.a > that.a)
      return 1;
    if (this.a < that.a)
      return -1;
    if (this.b > that.b)
      return 1;
    if (this.b < that.b)
      return -1;
    return 0;
  };
  _.equals_0 = function equals_14(obj) {
    var that;
    if (maskUndefined(obj) === maskUndefined(this))
      return true;
    if (!instanceOf(obj, 91))
      return false;
    that = castTo(obj, 91);
    return this.a == that.a && this.b == that.b;
  };
  _.hashCode_1 = function hashCode_3() {
    return jl.hashCode_16(this.a) ^ jl.hashCode_16(this.b);
  };
  _.toString_0 = function toString_17() {
    return this.a + "," + this.b;
  };
  _.a = 0;
  _.b = 0;
  cggl.Lcom_actelion_research_chem_forcefield_mmff_SortedPair_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "SortedPair", 91, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_StretchBend = function $clinit_StretchBend() {
    carcfm.$clinit_StretchBend = emptyMethod;
    jl.$clinit_Object();
  };
  carcfm.StretchBend = function StretchBend(table, mol, a1, a2, a3) {
    Object_0.call(this);
    this.$init_97();
    this.mol = mol;
    this.a1 = a1;
    this.a2 = a2;
    this.a3 = a3;
    this.theta0 = table.angle.theta_0(mol, a1, a2, a3);
    this.r0i = table.bond.r0_1(mol, a1, a2);
    this.r0k = table.bond.r0_1(mol, a3, a2);
    this.kba_ijk = table.stbn.kba(mol, a1, a2, a3);
    this.kba_kji = table.stbn.kba(mol, a3, a2, a1);
  };
  carcfm.findIn_3 = function findIn_3(t, mol) {
    carcfm.$clinit_StretchBend();
    var atom, atomt, bend, i, k, nbr_i, nbr_k, stbn;
    stbn = new ju.ArrayList();
    for (atom = 0; atom < mol.getAllAtoms_0(); atom++) {
      atomt = mol.getAtomType(atom);
      if (mol.getAllConnAtoms_0(atom) <= 1 && t.atom.linear(atomt))
        continue;
      for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
        nbr_i = mol.getConnAtom_0(atom, i);
        for (k = 0; k < mol.getAllConnAtoms_0(atom); k++) {
          nbr_k = mol.getConnAtom_0(atom, k);
          if (nbr_i > nbr_k)
            continue;
          if (carcfm.valid(t, mol, nbr_i, atom, nbr_k)) {
            bend = new carcfm.StretchBend(t, mol, nbr_i, atom, nbr_k);
            if ($wnd.Math.abs(bend.kba_ijk) > 1e-4 || $wnd.Math.abs(bend.kba_kji) > 1e-4) {
              stbn.add(bend);
            }
          }
        }
      }
    }
    return stbn;
  };
  carcfm.valid = function valid(table, mol, a1, a2, a3) {
    var a2t;
    a2t = mol.getAtomType(a2);
    if (table.atom.linear(a2t) || a1 == a3)
      return false;
    if (mol.getBond_0(a1, a2) == -1 || mol.getBond_0(a2, a3) == -1)
      return false;
    return true;
  };
  defineClass(439, 1, { 118: 1, 1: 1 }, carcfm.StretchBend);
  _.$init_97 = function $init_97() {
  };
  _.getEnergy_0 = function getEnergy_4(pos, detail, detailID, skipHydrogen) {
    var dist1, dist2, e, factor, theta;
    if (skipHydrogen && (this.mol.getAtomicNo_0(this.a1) == 1 || this.mol.getAtomicNo_0(this.a3) == 1))
      return 0;
    dist1 = new carcfm.Vector3_4(pos, this.a2, this.a1).length_2();
    dist2 = new carcfm.Vector3_4(pos, this.a2, this.a3).length_2();
    theta = new carcfm.Vector3_4(pos, this.a2, this.a1).angle_0(new carcfm.Vector3_4(pos, this.a2, this.a3));
    factor = 143.9325 * 0.017453292519943295 * (jl.toDegrees(theta) - this.theta0);
    e = factor * (dist1 - this.r0i) * this.kba_ijk + factor * (dist2 - this.r0k) * this.kba_kji;
    if (isNotNull(detail))
      detail.append_9(detailID + "	stretchBend	" + caru.toString_22(dist1) + "," + caru.toString_22(dist2) + "," + caru.toString_22(jl.toDegrees(theta)) + "	" + caru.toString_22(this.r0i) + "," + caru.toString_22(this.r0k) + "," + caru.toString_22(this.theta0) + "	" + this.a1 + "," + this.a2 + "," + this.a3 + "	" + caru.toString_22(e) + "\n");
    return e;
  };
  _.getGradient = function getGradient_3(pos, grad) {
    var angleTerm, c5, cosTheta, dCos_dS1, dCos_dS2, dCos_dS3, dCos_dS4, dCos_dS5, dCos_dS6, dist1, dist2, distTerm, p12, p32, sinTheta, sinThetaSq;
    dist1 = new carcfm.Vector3_4(pos, this.a2, this.a1).length_2();
    dist2 = new carcfm.Vector3_4(pos, this.a2, this.a3).length_2();
    p12 = new carcfm.Vector3_4(pos, this.a2, this.a1).normalise();
    p32 = new carcfm.Vector3_4(pos, this.a2, this.a3).normalise();
    c5 = 143.9325 * 0.017453292519943295;
    cosTheta = p12.dot_0(p32);
    sinThetaSq = 1 - cosTheta * cosTheta;
    sinTheta = $wnd.Math.max(sinThetaSq > 0 ? $wnd.Math.sqrt(sinThetaSq) : 0, 1e-8);
    angleTerm = 57.29577951308232 * $wnd.Math.acos(cosTheta) - this.theta0;
    distTerm = 57.29577951308232 * (this.kba_ijk * (dist1 - this.r0i) + this.kba_kji * (dist2 - this.r0k));
    dCos_dS1 = 1 / dist1 * (p32.x_0 - cosTheta * p12.x_0);
    dCos_dS2 = 1 / dist1 * (p32.y_0 - cosTheta * p12.y_0);
    dCos_dS3 = 1 / dist1 * (p32.z_0 - cosTheta * p12.z_0);
    dCos_dS4 = 1 / dist2 * (p12.x_0 - cosTheta * p32.x_0);
    dCos_dS5 = 1 / dist2 * (p12.y_0 - cosTheta * p32.y_0);
    dCos_dS6 = 1 / dist2 * (p12.z_0 - cosTheta * p32.z_0);
    grad[3 * this.a1 + 0] += 2.5120960256267386 * (p12.x_0 * this.kba_ijk * angleTerm + dCos_dS1 / -sinTheta * distTerm);
    grad[3 * this.a1 + 1] += 2.5120960256267386 * (p12.y_0 * this.kba_ijk * angleTerm + dCos_dS2 / -sinTheta * distTerm);
    grad[3 * this.a1 + 2] += 2.5120960256267386 * (p12.z_0 * this.kba_ijk * angleTerm + dCos_dS3 / -sinTheta * distTerm);
    grad[3 * this.a2 + 0] += 2.5120960256267386 * ((-p12.x_0 * this.kba_ijk - p32.x_0 * this.kba_kji) * angleTerm + (-dCos_dS1 - dCos_dS4) / -sinTheta * distTerm);
    grad[3 * this.a2 + 1] += 2.5120960256267386 * ((-p12.y_0 * this.kba_ijk - p32.y_0 * this.kba_kji) * angleTerm + (-dCos_dS2 - dCos_dS5) / -sinTheta * distTerm);
    grad[3 * this.a2 + 2] += 2.5120960256267386 * ((-p12.z_0 * this.kba_ijk - p32.z_0 * this.kba_kji) * angleTerm + (-dCos_dS3 - dCos_dS6) / -sinTheta * distTerm);
    grad[3 * this.a3 + 0] += 2.5120960256267386 * (p32.x_0 * this.kba_kji * angleTerm + dCos_dS4 / -sinTheta * distTerm);
    grad[3 * this.a3 + 1] += 2.5120960256267386 * (p32.y_0 * this.kba_kji * angleTerm + dCos_dS5 / -sinTheta * distTerm);
    grad[3 * this.a3 + 2] += 2.5120960256267386 * (p32.z_0 * this.kba_kji * angleTerm + dCos_dS6 / -sinTheta * distTerm);
  };
  _.a1 = 0;
  _.a2 = 0;
  _.a3 = 0;
  _.kba_ijk = 0;
  _.kba_kji = 0;
  _.r0i = 0;
  _.r0k = 0;
  _.theta0 = 0;
  cggl.Lcom_actelion_research_chem_forcefield_mmff_StretchBend_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "StretchBend", 439, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_Tables = function $clinit_Tables() {
    carcfm.$clinit_Tables = emptyMethod;
    jl.$clinit_Object();
  };
  carcfm.Tables = function Tables(csv_angle, csv_atom, csv_bci, csv_bndk, csv_bond, csv_covrad, csv_dfsb, csv_def, csv_hblaurie, csv_oop, csv_pbci, csv_stbn, csv_torsion, csv_vdws) {
    Object_0.call(this);
    this.$init_98();
    this.angle = new carcfmt.Angle(this, csv_angle);
    this.chge = new carcfmt.Charge(this, csv_pbci, csv_bci);
    this.atom = new carcfmt.Atom(this, csv_atom);
    this.bndk = new carcfmt.Bndk(this, csv_bndk);
    this.bond = new carcfmt.Bond(this, csv_bond);
    this.covrad = new carcfmt.CovRad(this, csv_covrad);
    this.dfsb = new carcfmt.Dfsb(this, csv_dfsb);
    this.def = new carcfmt.Def(this, csv_def);
    this.hblaurie = new carcfmt.HerschbachLaurie(this, csv_hblaurie);
    this.oop = new carcfmt.OutOfPlane_0(this, csv_oop);
    this.stbn = new carcfmt.Stbn(this, csv_stbn);
    this.torsion = new carcfmt.Torsion(this, csv_torsion);
    this.vdws = new carcfmt.VanDerWaals_0(this, csv_vdws);
  };
  carcfm.newMMFF94 = function newMMFF94(tableSet) {
    carcfm.$clinit_Tables();
    return new carcfm.Tables("/resources/forcefield/mmff94/angle.csv", "/resources/forcefield/mmff94/atom.csv", "/resources/forcefield/mmff94/bci.csv", "/resources/forcefield/mmff94/bndk.csv", "/resources/forcefield/mmff94/bond.csv", "/resources/forcefield/mmff94/covrad.csv", "/resources/forcefield/mmff94/dfsb.csv", "/resources/forcefield/mmff94/def.csv", "/resources/forcefield/mmff94/herschbachlaurie.csv", "/resources/forcefield/mmff94/" + (jl.equals_Ljava_lang_Object__Z__devirtual$_2(tableSet, "MMFF94s") || jl.equals_Ljava_lang_Object__Z__devirtual$_2(tableSet, "MMFF94s+") ? "94s/outofplane.csv" : "outofplane.csv"), "/resources/forcefield/mmff94/pbci.csv", "/resources/forcefield/mmff94/stbn.csv", "/resources/forcefield/mmff94/" + (jl.equals_Ljava_lang_Object__Z__devirtual$_2(tableSet, "MMFF94s") ? "94s/torsion.csv" : jl.equals_Ljava_lang_Object__Z__devirtual$_2(tableSet, "MMFF94s+") ? "94s/torsionPlus.csv" : "torsion.csv"), "/resources/forcefield/mmff94/vanderwaals.csv");
  };
  defineClass(201, 1, { 201: 1, 1: 1 }, carcfm.Tables);
  _.$init_98 = function $init_98() {
  };
  carcfm.RESOURCE_PATH = "/resources/forcefield/mmff94/";
  cggl.Lcom_actelion_research_chem_forcefield_mmff_Tables_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "Tables", 201, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_TorsionAngle = function $clinit_TorsionAngle() {
    carcfm.$clinit_TorsionAngle = emptyMethod;
    jl.$clinit_Object();
  };
  carcfm.TorsionAngle = function TorsionAngle(table, mol, a1, a2, a3, a4) {
    var kbs;
    Object_0.call(this);
    this.$init_99();
    this.a1 = a1;
    this.a2 = a2;
    this.a3 = a3;
    this.a4 = a4;
    this.a1t = mol.getAtomType(a1);
    this.a2t = mol.getAtomType(a2);
    this.a3t = mol.getAtomType(a3);
    this.a4t = mol.getAtomType(a4);
    kbs = table.torsion.getForceConstants(mol, a1, a2, a3, a4);
    this.v1 = kbs.v1;
    this.v2 = kbs.v2;
    this.v3 = kbs.v3;
  };
  carcfm.findIn_4 = function findIn_4(t, mol) {
    carcfm.$clinit_TorsionAngle();
    var a1, a2, a3, a4, j, k, l, tor, tors;
    tors = new ju.ArrayList();
    for (a1 = 0; a1 < mol.getAllAtoms_0(); a1++) {
      for (j = 0; j < mol.getAllConnAtoms_0(a1); j++) {
        a2 = mol.getConnAtom_0(a1, j);
        for (k = 0; k < mol.getAllConnAtoms_0(a2); k++) {
          a3 = mol.getConnAtom_0(a2, k);
          if (a1 == a3)
            continue;
          for (l = 0; l < mol.getAllConnAtoms_0(a3); l++) {
            a4 = mol.getConnAtom_0(a3, l);
            if (a2 == a4 || a1 == a4)
              continue;
            if (a4 > a1) {
              tor = new carcfm.TorsionAngle(t, mol, a1, a2, a3, a4);
              if (tor.nonZero())
                tors.add(tor);
            }
          }
        }
      }
    }
    return tors;
  };
  defineClass(440, 1, { 118: 1, 1: 1 }, carcfm.TorsionAngle);
  _.$init_99 = function $init_99() {
  };
  _.getEnergy_0 = function getEnergy_5(pos, detail, detailID, skipHydrogen) {
    var cos2Phi, cos3Phi, cosPhi, e, r1, r2, r3, r4, t1, t2;
    r1 = new carcfm.Vector3_4(pos, this.a1, this.a2);
    r2 = new carcfm.Vector3_4(pos, this.a3, this.a2);
    r3 = new carcfm.Vector3_4(pos, this.a2, this.a3);
    r4 = new carcfm.Vector3_4(pos, this.a4, this.a3);
    t1 = r1.cross_0(r2);
    t2 = r3.cross_0(r4);
    cosPhi = t1.cosAngle(t2);
    cos2Phi = 2 * cosPhi * cosPhi - 1;
    cos3Phi = cosPhi * (2 * cos2Phi - 1);
    e = 0.5 * (this.v1 * (1 + cosPhi) + this.v2 * (1 - cos2Phi) + this.v3 * (1 + cos3Phi));
    if (isNotNull(detail))
      detail.append_9(detailID + "	torsion	" + caru.toString_22(jl.toDegrees(t1.angle_0(t2))) + "		" + this.a1 + "," + this.a2 + "," + this.a3 + "," + this.a4 + "	" + caru.toString_22(e) + "\n");
    return e;
  };
  _.getGradient = function getGradient_4(pos, grad) {
    var cosPhi, d, dCos_dT, dE_dPhi, r, sin2Phi, sin3Phi, sinPhi, sinPhiSq, sinTerm, t;
    r = stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_forcefield_mmff_Vector3_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 21, 0, [new carcfm.Vector3_4(pos, this.a2, this.a1), new carcfm.Vector3_4(pos, this.a2, this.a3), new carcfm.Vector3_4(pos, this.a3, this.a2), new carcfm.Vector3_4(pos, this.a3, this.a4)]);
    t = stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_forcefield_mmff_Vector3_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 21, 0, [r[0].cross_0(r[1]), r[2].cross_0(r[3])]);
    d = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [t[0].length_2(), t[1].length_2()]);
    if ($wnd.Math.abs(d[0]) < 1e-5 || $wnd.Math.abs(d[1]) < 1e-5)
      return;
    setCheck(t, 0, t[0].normalise());
    setCheck(t, 1, t[1].normalise());
    cosPhi = t[0].dot_0(t[1]);
    sinPhiSq = 1 - cosPhi * cosPhi;
    sinPhi = sinPhiSq > 0 ? $wnd.Math.sqrt(sinPhiSq) : 0;
    sin2Phi = 2 * sinPhi * cosPhi;
    sin3Phi = 3 * sinPhi - 4 * sinPhi * sinPhiSq;
    dE_dPhi = 0.5 * (-this.v1 * sinPhi + 2 * this.v2 * sin2Phi - 3 * this.v3 * sin3Phi);
    sinTerm = -dE_dPhi * ($wnd.Math.abs(sinPhi) < 1e-5 ? 1 / cosPhi : 1 / sinPhi);
    dCos_dT = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [1 / d[0] * (t[1].x_0 - cosPhi * t[0].x_0), 1 / d[0] * (t[1].y_0 - cosPhi * t[0].y_0), 1 / d[0] * (t[1].z_0 - cosPhi * t[0].z_0), 1 / d[1] * (t[0].x_0 - cosPhi * t[1].x_0), 1 / d[1] * (t[0].y_0 - cosPhi * t[1].y_0), 1 / d[1] * (t[0].z_0 - cosPhi * t[1].z_0)]);
    grad[3 * this.a1 + 0] += sinTerm * (dCos_dT[2] * r[1].y_0 - dCos_dT[1] * r[1].z_0);
    grad[3 * this.a1 + 1] += sinTerm * (dCos_dT[0] * r[1].z_0 - dCos_dT[2] * r[1].x_0);
    grad[3 * this.a1 + 2] += sinTerm * (dCos_dT[1] * r[1].x_0 - dCos_dT[0] * r[1].y_0);
    grad[3 * this.a2 + 0] += sinTerm * (dCos_dT[1] * (r[1].z_0 - r[0].z_0) + dCos_dT[2] * (r[0].y_0 - r[1].y_0) + dCos_dT[4] * -r[3].z_0 + dCos_dT[5] * r[3].y_0);
    grad[3 * this.a2 + 1] += sinTerm * (dCos_dT[0] * (r[0].z_0 - r[1].z_0) + dCos_dT[2] * (r[1].x_0 - r[0].x_0) + dCos_dT[3] * r[3].z_0 + dCos_dT[5] * -r[3].x_0);
    grad[3 * this.a2 + 2] += sinTerm * (dCos_dT[0] * (r[1].y_0 - r[0].y_0) + dCos_dT[1] * (r[0].x_0 - r[1].x_0) + dCos_dT[3] * -r[3].y_0 + dCos_dT[4] * r[3].x_0);
    grad[3 * this.a3 + 0] += sinTerm * (dCos_dT[1] * r[0].z_0 + dCos_dT[2] * -r[0].y_0 + dCos_dT[4] * (r[3].z_0 - r[2].z_0) + dCos_dT[5] * (r[2].y_0 - r[3].y_0));
    grad[3 * this.a3 + 1] += sinTerm * (dCos_dT[0] * -r[0].z_0 + dCos_dT[2] * r[0].x_0 + dCos_dT[3] * (r[2].z_0 - r[3].z_0) + dCos_dT[5] * (r[3].x_0 - r[2].x_0));
    grad[3 * this.a3 + 2] += sinTerm * (dCos_dT[0] * r[0].y_0 + dCos_dT[1] * -r[0].x_0 + dCos_dT[3] * (r[3].y_0 - r[2].y_0) + dCos_dT[4] * (r[2].x_0 - r[3].x_0));
    grad[3 * this.a4 + 0] += sinTerm * (dCos_dT[4] * r[2].z_0 - dCos_dT[5] * r[2].y_0);
    grad[3 * this.a4 + 1] += sinTerm * (dCos_dT[5] * r[2].x_0 - dCos_dT[3] * r[2].z_0);
    grad[3 * this.a4 + 2] += sinTerm * (dCos_dT[3] * r[2].y_0 - dCos_dT[4] * r[2].x_0);
  };
  _.nonZero = function nonZero() {
    return $wnd.Math.abs(this.v1) > 1e-3 || $wnd.Math.abs(this.v2) > 1e-3 || $wnd.Math.abs(this.v3) > 1e-3;
  };
  _.a1 = 0;
  _.a1t = 0;
  _.a2 = 0;
  _.a2t = 0;
  _.a3 = 0;
  _.a3t = 0;
  _.a4 = 0;
  _.a4t = 0;
  _.v1 = 0;
  _.v2 = 0;
  _.v3 = 0;
  cggl.Lcom_actelion_research_chem_forcefield_mmff_TorsionAngle_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "TorsionAngle", 440, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_VanDerWaals = function $clinit_VanDerWaals() {
    carcfm.$clinit_VanDerWaals = emptyMethod;
    jl.$clinit_Object();
  };
  carcfm.VanDerWaals = function VanDerWaals(table, mol, a1, a2) {
    var rs, wd;
    Object_0.call(this);
    this.$init_100();
    this.mol = mol;
    this.a1t = mol.getAtomType(a1);
    this.a2t = mol.getAtomType(a2);
    this.a1 = a1;
    this.a2 = a2;
    rs = this.minimum(table);
    wd = this.wellDepth(table, rs);
    this.da1 = table.vdws.da(this.a1t);
    this.da2 = table.vdws.da(this.a2t);
    if (this.da1 == 68 && this.da2 == 65 || this.da1 == 65 && this.da2 == 68) {
      rs = rs * table.vdws.darad;
      wd *= table.vdws.daeps;
    }
    this.rstar_ij = rs;
    this.well_depth = wd;
  };
  carcfm.findIn_5 = function findIn_5(table, mol, sep, nonbondedCutoff) {
    carcfm.$clinit_VanDerWaals();
    var atompair, i, j, relation, vdws;
    vdws = new ju.ArrayList();
    for (i = 0; i < mol.getAllAtoms_0(); i++) {
      for (j = i + 1; j < mol.getAllAtoms_0(); j++) {
        atompair = new carcfm.SortedPair(i, j);
        relation = sep.get_1(atompair);
        if ((jsEquals(relation, (carcfm.$clinit_Separation$Relation(), carcfm.ONE_FOUR)) || jsEquals(relation, (carcfm.$clinit_Separation$Relation(), carcfm.ONE_X))) && new carcfm.Vector3_1(mol, i, j).length_2() < nonbondedCutoff) {
          vdws.add(new carcfm.VanDerWaals(table, mol, i, j));
        }
      }
    }
    return vdws;
  };
  defineClass(441, 1, { 118: 1, 1: 1 }, carcfm.VanDerWaals);
  _.$init_100 = function $init_100() {
  };
  _.getEnergy_0 = function getEnergy_6(pos, detail, detailID, skipHydrogen) {
    var aTerm, aTerm2, aTerm7, bTerm, dist, dist2, dist7, e, rstar_ij2, rstar_ij7, vdw1, vdw1m1, vdw2, vdw2m1;
    if (skipHydrogen && (this.mol.getAtomicNo_0(this.a1) == 1 || this.mol.getAtomicNo_0(this.a2) == 1))
      return 0;
    dist = new carcfm.Vector3_4(pos, this.a1, this.a2).length_2();
    vdw1 = 1.07;
    vdw1m1 = 1.07 - 1;
    vdw2 = 1.12;
    vdw2m1 = 1.12 - 1;
    dist2 = dist * dist;
    dist7 = dist2 * dist2 * dist2 * dist;
    aTerm = 1.07 * this.rstar_ij / (dist + 0.07000000000000006 * this.rstar_ij);
    aTerm2 = aTerm * aTerm;
    aTerm7 = aTerm2 * aTerm2 * aTerm2 * aTerm;
    rstar_ij2 = this.rstar_ij * this.rstar_ij;
    rstar_ij7 = rstar_ij2 * rstar_ij2 * rstar_ij2 * this.rstar_ij;
    bTerm = 1.12 * rstar_ij7 / (dist7 + 0.1200000000000001 * rstar_ij7) - 2;
    e = aTerm7 * bTerm * this.well_depth;
    if (isNotNull(detail))
      detail.append_9(detailID + "	vanDerWaals	" + caru.toString_22(dist) + "		" + this.a1 + "," + this.a2 + "	" + caru.toString_22(e) + "\n");
    return e;
  };
  _.getGradient = function getGradient_5(pos, grad) {
    var dE_dr, dGrad, dist, i, q, q2, q6, q7, q7pvdw2m1, t, t2, t7, vdw1, vdw1m1, vdw2, vdw2m1, vdw2t7;
    vdw1 = 1.07;
    vdw1m1 = 1.07 - 1;
    vdw2 = 1.12;
    vdw2m1 = 1.12 - 1;
    vdw2t7 = 1.12 * 7;
    dist = new carcfm.Vector3_4(pos, this.a1, this.a2).length_2();
    q = dist / this.rstar_ij;
    q2 = q * q;
    q6 = q2 * q2 * q2;
    q7 = q6 * q;
    q7pvdw2m1 = q7 + 0.1200000000000001;
    t = 1.07 / (q + 1.07 - 1);
    t2 = t * t;
    t7 = t2 * t2 * t2 * t;
    dE_dr = this.well_depth / this.rstar_ij * t7 * (-7.840000000000001 * q6 / (q7pvdw2m1 * q7pvdw2m1) + (-7.840000000000001 / q7pvdw2m1 + 14) / (q + 0.07000000000000006));
    for (i = 0; i < 3; i++) {
      dGrad = 0.01 * this.rstar_ij;
      if (dist > 0)
        dGrad = dE_dr * (pos[3 * this.a1 + i] - pos[3 * this.a2 + i]) / dist;
      grad[3 * this.a1 + i] += dGrad;
      grad[3 * this.a2 + i] -= dGrad;
    }
  };
  _.minimum = function minimum(table) {
    var da1, da2, gamma_ij, rs1, rs2;
    rs1 = table.vdws.r_star(this.a1t);
    rs2 = table.vdws.r_star(this.a2t);
    da1 = table.vdws.da(this.a1t);
    da2 = table.vdws.da(this.a2t);
    gamma_ij = (rs1 - rs2) / (rs1 + rs2);
    return 0.5 * (rs1 + rs2) * (1 + (da1 == 68 || da2 == 68 ? 0 : table.vdws.b * (1 - $wnd.Math.exp(-table.vdws.beta_0 * gamma_ij * gamma_ij))));
  };
  _.wellDepth = function wellDepth(table, rs) {
    var alpha1, alpha2, c4, gi1, gi2, ni1, ni2, rstar_ij2;
    gi1 = table.vdws.g_i(this.a1t);
    gi2 = table.vdws.g_i(this.a2t);
    alpha1 = table.vdws.alpha_i(this.a1t);
    alpha2 = table.vdws.alpha_i(this.a2t);
    ni1 = table.vdws.n_i(this.a1t);
    ni2 = table.vdws.n_i(this.a2t);
    rstar_ij2 = rs * rs;
    c4 = 181.16;
    return c4 * gi1 * gi2 * alpha1 * alpha2 / (($wnd.Math.sqrt(alpha1 / ni1) + $wnd.Math.sqrt(alpha2 / ni2)) * rstar_ij2 * rstar_ij2 * rstar_ij2);
  };
  _.a1 = 0;
  _.a1t = 0;
  _.a2 = 0;
  _.a2t = 0;
  _.da1 = 0;
  _.da2 = 0;
  _.rstar_ij = 0;
  _.well_depth = 0;
  cggl.Lcom_actelion_research_chem_forcefield_mmff_VanDerWaals_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "VanDerWaals", 441, cggl.Ljava_lang_Object_2_classLit);
  carcfm.$clinit_Vector3 = function $clinit_Vector3() {
    carcfm.$clinit_Vector3 = emptyMethod;
    jl.$clinit_Object();
  };
  carcfm.Vector3 = function Vector3(x_0, y_0, z_0) {
    Object_0.call(this);
    this.$init_101();
    this.x_0 = x_0;
    this.y_0 = y_0;
    this.z_0 = z_0;
  };
  carcfm.Vector3_0 = function Vector3_0(mol, atom) {
    Object_0.call(this);
    this.$init_101();
    this.x_0 = mol.getAtomX_0(atom);
    this.y_0 = mol.getAtomY_0(atom);
    this.z_0 = mol.getAtomZ_0(atom);
  };
  carcfm.Vector3_1 = function Vector3_1(mol, atom1, atom2) {
    carcfm.$clinit_Vector3();
    carcfm.Vector3_2.call(this, new carcfm.Vector3_0(mol, atom1).to(new carcfm.Vector3_0(mol, atom2)));
  };
  carcfm.Vector3_2 = function Vector3_2(that) {
    Object_0.call(this);
    this.$init_101();
    this.x_0 = that.x_0;
    this.y_0 = that.y_0;
    this.z_0 = that.z_0;
  };
  carcfm.Vector3_3 = function Vector3_3(pos, offset) {
    carcfm.$clinit_Vector3();
    Object_0.call(this);
    this.$init_101();
    this.x_0 = pos[3 * offset];
    this.y_0 = pos[3 * offset + 1];
    this.z_0 = pos[3 * offset + 2];
  };
  carcfm.Vector3_4 = function Vector3_4(pos, atom1, atom2) {
    carcfm.$clinit_Vector3();
    carcfm.Vector3_2.call(this, new carcfm.Vector3_3(pos, atom1).to(new carcfm.Vector3_3(pos, atom2)));
  };
  defineClass(21, 1, { 21: 1, 1: 1 }, carcfm.Vector3, carcfm.Vector3_0, carcfm.Vector3_1, carcfm.Vector3_3, carcfm.Vector3_4);
  _.$init_101 = function $init_101() {
  };
  _.angle_0 = function angle_0(that) {
    return $wnd.Math.acos(this.dot_0(that) / (this.length_2() * that.length_2()));
  };
  _.cosAngle = function cosAngle(that) {
    return this.dot_0(that) / (this.length_2() * that.length_2());
  };
  _.cross_0 = function cross_0(that) {
    return new carcfm.Vector3(this.y_0 * that.z_0 - this.z_0 * that.y_0, this.z_0 * that.x_0 - this.x_0 * that.z_0, this.x_0 * that.y_0 - this.y_0 * that.x_0);
  };
  _.distance_0 = function distance_1(that) {
    return $wnd.Math.sqrt((this.x_0 - that.x_0) * (this.x_0 - that.x_0) + (this.y_0 - that.y_0) * (this.y_0 - that.y_0) + (this.z_0 - that.z_0) * (this.z_0 - that.z_0));
  };
  _.dot_0 = function dot_1(that) {
    return this.x_0 * that.x_0 + this.y_0 * that.y_0 + this.z_0 * that.z_0;
  };
  _.equals_0 = function equals_15(obj) {
    var that;
    if (maskUndefined(obj) === maskUndefined(this))
      return true;
    if (!instanceOf(obj, 21))
      return false;
    that = castTo(obj, 21);
    return $wnd.Math.abs(this.x_0 - that.x_0) < 0.01 && $wnd.Math.abs(this.y_0 - that.y_0) < 0.01 && $wnd.Math.abs(this.z_0 - that.z_0) < 0.01;
  };
  _.hashCode_1 = function hashCode_4() {
    return jl.hashCode_12(this.x_0) + jl.hashCode_12(this.y_0) + jl.hashCode_12(this.z_0);
  };
  _.length_2 = function length_1() {
    return $wnd.Math.sqrt(this.x_0 * this.x_0 + this.y_0 * this.y_0 + this.z_0 * this.z_0);
  };
  _.negate = function negate() {
    return new carcfm.Vector3(-this.x_0, -this.y_0, -this.z_0);
  };
  _.normalise = function normalise() {
    if (this.length_2() > 0)
      return new carcfm.Vector3(this.x_0 / this.length_2(), this.y_0 / this.length_2(), this.z_0 / this.length_2());
    return new carcfm.Vector3(0, 0, 0);
  };
  _.to = function to_0(that) {
    return new carcfm.Vector3(that.x_0 - this.x_0, that.y_0 - this.y_0, that.z_0 - this.z_0);
  };
  _.x_0 = 0;
  _.y_0 = 0;
  _.z_0 = 0;
  carcfm.TOL = 0.01;
  cggl.Lcom_actelion_research_chem_forcefield_mmff_Vector3_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff", "Vector3", 21, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_Angle = function $clinit_Angle() {
    carcfmt.$clinit_Angle = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.Angle = function Angle(t, csvpath) {
    carcfmt.$clinit_Angle();
    Object_0.call(this);
    this.$init_102();
    this.table = carcfm.readFile(csvpath);
    this.t = t;
  };
  defineClass(475, 1, { 1: 1 }, carcfmt.Angle);
  _.$init_102 = function $init_102() {
  };
  _.get_0 = function get_2(row, col) {
    return jl.intValue__I__devirtual$(castTo(this.table[row][col], 19));
  };
  _.getEmpiricalKa = function getEmpiricalKa(mol, a1, a2, a3, theta0) {
    var D, atno, beta_0, c, i, r0_ij, r0_jk, theta0_rad, z_0;
    z_0 = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [0, 0, 0]);
    c = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [0, 0, 0]);
    atno = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [mol.getAtomicNo_0(a1), mol.getAtomicNo_0(a2), mol.getAtomicNo_0(a3)]);
    beta_0 = 1.75;
    for (i = 0; i < 3; i++) {
      switch (atno[i]) {
        case 1:
          z_0[i] = 1.395;
          break;
        case 6:
          z_0[i] = 2.494;
          c[i] = 1.016;
          break;
        case 7:
          z_0[i] = 2.711;
          c[i] = 1.113;
          break;
        case 8:
          z_0[i] = 3.045;
          c[i] = 1.337;
          break;
        case 9:
          z_0[i] = 2.847;
          break;
        case 14:
          z_0[i] = 2.35;
          c[i] = 0.811;
          break;
        case 15:
          z_0[i] = 2.35;
          c[i] = 1.068;
          break;
        case 16:
          z_0[i] = 2.98;
          c[i] = 1.249;
          break;
        case 17:
          z_0[i] = 2.909;
          c[i] = 1.078;
          break;
        case 35:
          z_0[i] = 3.017;
          break;
        case 53:
          z_0[i] = 3.086;
          break;
      }
    }
    r0_ij = this.t.bond.r0_1(mol, a1, a2);
    r0_jk = this.t.bond.r0_1(mol, a2, a3);
    D = (r0_ij - r0_jk) * (r0_ij - r0_jk) / ((r0_ij + r0_jk) * (r0_ij + r0_jk));
    theta0_rad = 0.017453292519943295 * theta0;
    if (carcfmt2.inRingOfSize(mol, a1, a2, a3, 4))
      beta_0 *= 0.85;
    else if (carcfmt2.inRingOfSize(mol, a1, a2, a3, 3))
      beta_0 *= 0.05;
    return beta_0 * z_0[0] * c[1] * z_0[2] / ((r0_ij + r0_jk) * theta0_rad * theta0_rad * $wnd.Math.exp(2 * D));
  };
  _.getEmpiricalTheta0 = function getEmpiricalTheta0(mol, a1, a2, a3) {
    var a2t;
    if (carcfmt2.inRingOfSize(mol, a1, a2, a3, 3))
      return 60;
    else if (carcfmt2.inRingOfSize(mol, a1, a2, a3, 4))
      return 90;
    a2t = mol.getAtomType(a2);
    switch (this.t.atom.crd(a2t)) {
      case 2:
        if (mol.getAtomicNo_0(a2) == 8)
          return 105;
        else if (this.t.atom.linear(a2t))
          return 180;
        break;
      case 3:
        if (this.t.atom.val_0(a2t) == 3 && this.t.atom.mltb(a2t) == 0) {
          if (mol.getAtomicNo_0(a2) == 7)
            return 107;
          else
            return 92;
        }
        break;
      case 4:
        return 109.45;
    }
    return 120;
  };
  _.index_1 = function index_1(mol, a1, a2, a3) {
    var a1t, a1tf, a2t, a3t, a3tf, angt, i, index_0;
    a1t = mol.getAtomType(a1);
    a2t = mol.getAtomType(a2);
    a3t = mol.getAtomType(a3);
    angt = carcfmt2.getType(this.t, mol, a1, a2, a3);
    index_0 = -1;
    for (i = 0; i < 5 && index_0 < 0; i++) {
      a1tf = this.t.def.table[a1t - 1][i];
      a3tf = this.t.def.table[a3t - 1][i];
      if (a1tf > a3tf)
        a1tf = castTo(carcfm.s_1(jl.valueOf_12(a3tf), jl.valueOf_12(a3tf = a1tf)), 35).intValue();
      index_0 = carcfm.binary_1(stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [2, 1, 3, 0]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [a2t, a1tf, a3tf, angt]), this);
    }
    return index_0;
  };
  _.ka_0 = function ka(index_0) {
    return jl.doubleValue__D__devirtual$(castTo(this.table[index_0][4], 19));
  };
  _.ka_1 = function ka_0(mol, a1, a2, a3) {
    var index_0;
    index_0 = this.index_1(mol, a1, a2, a3);
    if (index_0 < 0)
      return this.getEmpiricalKa(mol, a1, a2, a3, this.getEmpiricalTheta0(mol, a1, a2, a3));
    else {
      if ($wnd.Math.abs(this.ka_0(index_0)) < 1e-3)
        return this.getEmpiricalKa(mol, a1, a2, a3, this.theta(index_0));
      else
        return this.ka_0(index_0);
    }
  };
  _.length_1 = function length_2() {
    return this.table.length;
  };
  _.theta = function theta_0(index_0) {
    return jl.doubleValue__D__devirtual$(castTo(this.table[index_0][5], 19));
  };
  _.theta_0 = function theta_1(mol, a1, a2, a3) {
    var index_0;
    index_0 = this.index_1(mol, a1, a2, a3);
    if (index_0 < 0)
      return this.getEmpiricalTheta0(mol, a1, a2, a3);
    else
      return this.theta(index_0);
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_Angle_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "Angle", 475, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_Atom = function $clinit_Atom() {
    carcfmt.$clinit_Atom = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.Atom = function Atom(t, csvpath) {
    carcfmt.$clinit_Atom();
    Object_0.call(this);
    this.$init_103();
    this.table = carcfm.readIntsFile(csvpath);
  };
  defineClass(466, 1, { 1: 1 }, carcfmt.Atom);
  _.$init_103 = function $init_103() {
  };
  _.arom = function arom(type_0) {
    return this.table[this.index_2(type_0)][6] > 0;
  };
  _.crd = function crd(type_0) {
    return this.table[this.index_2(type_0)][2];
  };
  _.get_0 = function get_3(row, col) {
    return this.table[row][col];
  };
  _.index_2 = function index_2(type_0) {
    return carcfm.binary_0(0, type_0, this);
  };
  _.length_1 = function length_3() {
    return this.table.length;
  };
  _.linear = function linear(type_0) {
    var idx;
    idx = this.index_2(type_0);
    return idx >= 0 ? this.table[idx][7] > 0 : false;
  };
  _.mltb = function mltb(type_0) {
    return this.table[this.index_2(type_0)][5];
  };
  _.pilp = function pilp(type_0) {
    return this.table[this.index_2(type_0)][4];
  };
  _.sbmb = function sbmb(type_0) {
    return this.table[this.index_2(type_0)][8] > 0;
  };
  _.val_0 = function val_0(type_0) {
    return this.table[this.index_2(type_0)][3];
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_Atom_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "Atom", 466, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_Bndk = function $clinit_Bndk() {
    carcfmt.$clinit_Bndk = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.Bndk = function Bndk(t, csvpath) {
    carcfmt.$clinit_Bndk();
    Object_0.call(this);
    this.$init_104();
    this.table = carcfm.readFile(csvpath);
  };
  defineClass(483, 1, { 1: 1 }, carcfmt.Bndk);
  _.$init_104 = function $init_104() {
  };
  _.get_0 = function get_4(row, col) {
    return jl.intValue__I__devirtual$(castTo(this.table[row][col], 19));
  };
  _.kb_0 = function kb(index_0) {
    return jl.doubleValue__D__devirtual$(castTo(this.table[index_0][3], 19));
  };
  _.length_1 = function length_4() {
    return this.table.length;
  };
  _.r0_0 = function r0_0(index_0) {
    return jl.doubleValue__D__devirtual$(castTo(this.table[index_0][2], 19));
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_Bndk_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "Bndk", 483, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_Bond = function $clinit_Bond() {
    carcfmt.$clinit_Bond = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.Bond = function Bond(t, csvpath) {
    carcfmt.$clinit_Bond();
    Object_0.call(this);
    this.$init_105();
    this.table = carcfm.readFile(csvpath);
    this.t = t;
  };
  defineClass(479, 1, { 1: 1 }, carcfmt.Bond);
  _.$init_105 = function $init_105() {
  };
  _.get_0 = function get_5(row, col) {
    return jl.intValue__I__devirtual$(castTo(this.table[row][col], 19));
  };
  _.kb_0 = function kb_0(index_0) {
    return jl.doubleValue__D__devirtual$(castTo(this.table[index_0][3], 19));
  };
  _.kb_1 = function kb_1(mol, atom1, atom2) {
    var a1no, a1t, a2no, a2t, bidx, bndk_idx, bondt, coeff, index_0, r0;
    bondt = carcfmt2.getType_1(this.t, mol, mol.getBond_0(atom1, atom2));
    a1t = mol.getAtomType(atom1);
    a2t = mol.getAtomType(atom2);
    if (a1t > a2t)
      a1t = castTo(carcfm.s_1(jl.valueOf_12(a2t), jl.valueOf_12(a2t = a1t)), 35).intValue();
    index_0 = carcfm.binary_1(stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 2, 0]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [a1t, a2t, bondt]), this);
    if (index_0 >= 0) {
      return this.kb_0(index_0);
    } else {
      a1no = mol.getAtomicNo_0(atom1);
      a2no = mol.getAtomicNo_0(atom2);
      if (a1no > a2no)
        a1no = castTo(carcfm.s_1(jl.valueOf_12(a2no), jl.valueOf_12(a2no = a1no)), 35).intValue();
      r0 = this.r0_1(mol, atom1, atom2);
      bndk_idx = carcfm.binary_1(stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [0, 1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [a1no, a2no]), this.t.bndk);
      if (bndk_idx >= 0) {
        coeff = $wnd.Math.pow(this.t.bndk.r0_0(bndk_idx) / r0, 6);
        return this.t.bndk.kb_0(bndk_idx) * coeff;
      } else {
        bidx = carcfm.binary_1(stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [0, 1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [carcfm.rowtm(a1no), carcfm.rowtm(a2no)]), this.t.hblaurie);
        return $wnd.Math.pow(10, -(r0 - this.t.hblaurie.fget(bidx, 2)) / this.t.hblaurie.fget(bidx, 3));
      }
    }
  };
  _.length_1 = function length_5() {
    return this.table.length;
  };
  _.r0_0 = function r0_1(index_0) {
    return jl.doubleValue__D__devirtual$(castTo(this.table[index_0][4], 19));
  };
  _.r0_1 = function r0_2(mol, atom1, atom2) {
    var a1cri, a1no, a1t, a2cri, a2no, a2t, bondt, c, chi_i, chi_j, index_0, r0_i, r0_j;
    bondt = carcfmt2.getType_1(this.t, mol, mol.getBond_0(atom1, atom2));
    a1t = mol.getAtomType(atom1);
    a2t = mol.getAtomType(atom2);
    if (a1t > a2t)
      a1t = castTo(carcfm.s_1(jl.valueOf_12(a2t), jl.valueOf_12(a2t = a1t)), 35).intValue();
    index_0 = carcfm.binary_1(stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 2, 0]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [a1t, a2t, bondt]), this);
    if (index_0 >= 0)
      return this.r0_0(index_0);
    else {
      a1no = mol.getAtomicNo_0(atom1);
      a2no = mol.getAtomicNo_0(atom2);
      if (a1no > a2no)
        a1no = castTo(carcfm.s_1(jl.valueOf_12(a2no), jl.valueOf_12(a2no = a1no)), 35).intValue();
      a1cri = carcfm.binary_0(0, a1no, this.t.covrad);
      a2cri = carcfm.binary_0(0, a2no, this.t.covrad);
      r0_i = this.t.covrad.r0_0(a1cri);
      r0_j = this.t.covrad.r0_0(a2cri);
      chi_i = this.t.covrad.chi(a1cri);
      chi_j = this.t.covrad.chi(a2cri);
      c = a1no == 1 || a2no == 1 ? 0.05 : 0.085;
      return r0_i + r0_j - c * $wnd.Math.pow($wnd.Math.abs(chi_i - chi_j), 1.4);
    }
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_Bond_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "Bond", 479, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_Charge = function $clinit_Charge() {
    carcfmt.$clinit_Charge = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.Charge = function Charge(t, csv_pbci, csv_bci) {
    carcfmt.$clinit_Charge();
    Object_0.call(this);
    this.$init_106();
    this.pbci = carcfm.readFile(csv_pbci);
    this.bci = carcfm.readFile(csv_bci);
  };
  defineClass(476, 1, { 1: 1 }, carcfmt.Charge);
  _.$init_106 = function $init_106() {
  };
  _.bci_binary_search = function bci_binary_search(col, val, lo, hi, findlow) {
    return carcfm.binary(col, val, lo, hi, findlow, new carcfmt.Charge$1(this));
  };
  _.getFcadj = function getFcadj(type_0) {
    return jl.doubleValue__D__devirtual$(castTo(this.pbci[type_0 - 1][2], 19));
  };
  _.getPartial = function getPartial(bondt, a1t, a2t) {
    var a1hi, a1lo, a2hi, a2lo, ath, atl, sign;
    sign = a1t > a2t ? 1 : -1;
    atl = a1t > a2t ? a2t : a1t;
    ath = a1t > a2t ? a1t : a2t;
    a1lo = this.bci_binary_search(1, atl, 0, this.bci.length, true);
    a1hi = this.bci_binary_search(1, atl, 0, this.bci.length, false);
    if (a1lo == -1 || a1hi == -1)
      return this.getPbci(a1t) - this.getPbci(a2t);
    a2lo = this.bci_binary_search(2, ath, a1lo, a1hi + 1, true);
    a2hi = this.bci_binary_search(2, ath, a1lo, a1hi + 1, false);
    if (a2lo == -1 || a2hi == -1)
      return this.getPbci(a1t) - this.getPbci(a2t);
    if (bondt == 0 && this.get_bci_n(a2lo, 0) == 0)
      return sign * this.get_bci_f(a2lo, 3);
    else if (bondt == 1 && this.get_bci_n(a2hi, 0) == 1)
      return sign * this.get_bci_f(a2hi, 3);
    return this.getPbci(a1t) - this.getPbci(a2t);
  };
  _.getPbci = function getPbci(type_0) {
    return jl.doubleValue__D__devirtual$(castTo(this.pbci[type_0 - 1][1], 19));
  };
  _.get_bci_f = function get_bci_f(row, col) {
    return jl.doubleValue__D__devirtual$(castTo(this.bci[row][col], 19));
  };
  _.get_bci_n = function get_bci_n(row, col) {
    return jl.intValue__I__devirtual$(castTo(this.bci[row][col], 19));
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_Charge_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "Charge", 476, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_Charge$1 = function $clinit_Charge$1() {
    carcfmt.$clinit_Charge$1 = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.Charge$1 = function Charge$1(this$0) {
    carcfmt.$clinit_Charge$1();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_107();
  };
  defineClass(477, 1, { 1: 1 }, carcfmt.Charge$1);
  _.$init_107 = function $init_107() {
  };
  _.get_0 = function get_6(row, col) {
    return jl.intValue__I__devirtual$(castTo(this.this$01.bci[row][col], 19));
  };
  _.length_1 = function length_6() {
    return this.this$01.bci.length;
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_Charge$1_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "Charge/1", 477, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_CovRad = function $clinit_CovRad() {
    carcfmt.$clinit_CovRad = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.CovRad = function CovRad(t, csvpath) {
    carcfmt.$clinit_CovRad();
    Object_0.call(this);
    this.$init_108();
    this.table = carcfm.readFile(csvpath);
  };
  defineClass(484, 1, { 1: 1 }, carcfmt.CovRad);
  _.$init_108 = function $init_108() {
  };
  _.chi = function chi_0(index_0) {
    return jl.doubleValue__D__devirtual$(castTo(this.table[index_0][2], 19));
  };
  _.get_0 = function get_7(row, col) {
    return jl.intValue__I__devirtual$(castTo(this.table[row][col], 19));
  };
  _.length_1 = function length_7() {
    return this.table.length;
  };
  _.r0_0 = function r0_3(index_0) {
    return jl.doubleValue__D__devirtual$(castTo(this.table[index_0][1], 19));
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_CovRad_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "CovRad", 484, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_Def = function $clinit_Def() {
    carcfmt.$clinit_Def = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.Def = function Def(t, csvpath) {
    carcfmt.$clinit_Def();
    Object_0.call(this);
    this.$init_109();
    this.table = carcfm.readIntsFile(csvpath);
  };
  defineClass(486, 1, { 1: 1 }, carcfmt.Def);
  _.$init_109 = function $init_109() {
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_Def_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "Def", 486, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_Dfsb = function $clinit_Dfsb() {
    carcfmt.$clinit_Dfsb = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.Dfsb = function Dfsb(t, csvpath) {
    carcfmt.$clinit_Dfsb();
    Object_0.call(this);
    this.$init_110();
    this.table = carcfm.readFile(csvpath);
  };
  defineClass(485, 1, { 1: 1 }, carcfmt.Dfsb);
  _.$init_110 = function $init_110() {
  };
  _.get_0 = function get_8(row, col) {
    return jl.intValue__I__devirtual$(castTo(this.table[row][col], 19));
  };
  _.index_1 = function index_3(mol, a1, a2, a3) {
    var a1r, a2r, a3r;
    a1r = carcfm.row_0(mol.getAtomicNo_0(a1));
    a2r = carcfm.row_0(mol.getAtomicNo_0(a2));
    a3r = carcfm.row_0(mol.getAtomicNo_0(a3));
    if (a1r > a3r)
      a1r = castTo(carcfm.s_1(jl.valueOf_12(a3r), jl.valueOf_12(a3r = a1r)), 35).intValue();
    return carcfm.binary_1(stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 0, 2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [a2r, a1r, a3r]), this);
  };
  _.kb_2 = function kb_2(mol, a1, a2, a3) {
    var a1r, a3r, at, idx;
    a1r = carcfm.row_0(mol.getAtomicNo_0(a1));
    a3r = carcfm.row_0(mol.getAtomicNo_0(a3));
    at = a1r > a3r ? 4 : 3;
    idx = this.index_1(mol, a1, a2, a3);
    return idx >= 0 ? jl.doubleValue__D__devirtual$(castTo(this.table[idx][at], 19)) : 0;
  };
  _.length_1 = function length_8() {
    return this.table.length;
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_Dfsb_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "Dfsb", 485, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_HerschbachLaurie = function $clinit_HerschbachLaurie() {
    carcfmt.$clinit_HerschbachLaurie = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.HerschbachLaurie = function HerschbachLaurie(t, csvpath) {
    carcfmt.$clinit_HerschbachLaurie();
    Object_0.call(this);
    this.$init_111();
    this.table = carcfm.readFile(csvpath);
  };
  defineClass(487, 1, { 1: 1 }, carcfmt.HerschbachLaurie);
  _.$init_111 = function $init_111() {
  };
  _.fget = function fget(row, col) {
    return jl.doubleValue__D__devirtual$(castTo(this.table[row][col], 19));
  };
  _.get_0 = function get_9(row, col) {
    return jl.intValue__I__devirtual$(castTo(this.table[row][col], 19));
  };
  _.length_1 = function length_9() {
    return this.table.length;
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_HerschbachLaurie_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "HerschbachLaurie", 487, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_OutOfPlane_0 = function $clinit_OutOfPlane_0() {
    carcfmt.$clinit_OutOfPlane_0 = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.OutOfPlane_0 = function OutOfPlane_0(t, csvpath) {
    carcfmt.$clinit_OutOfPlane_0();
    Object_0.call(this);
    this.$init_112();
    this.table = carcfm.readFile(csvpath);
    this.t = t;
  };
  defineClass(478, 1, { 1: 1 }, carcfmt.OutOfPlane_0);
  _.$init_112 = function $init_112() {
  };
  _.get_0 = function get_10(row, col) {
    return jl.intValue__I__devirtual$(castTo(this.table[row][col], 19));
  };
  _.getKoop = function getKoop(mol, ac, a1, a2, a3) {
    var act, i, index_0, n, nbr, nbrf;
    act = mol.getAtomType(ac);
    nbr = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [mol.getAtomType(a1), mol.getAtomType(a2), mol.getAtomType(a3)]);
    for (i = 0; i < 4; i++) {
      nbrf = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
      for (n = 0; n < 3; n++)
        nbrf[n] = this.t.def.table[nbr[n] - 1][i + 1];
      ju.sort_3(nbrf);
      index_0 = carcfm.binary_1(stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 0, 2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [act, nbrf[0], nbrf[1], nbrf[2]]), this);
      if (index_0 >= 0)
        return jl.doubleValue__D__devirtual$(castTo(this.table[index_0][4], 19));
    }
    return 0;
  };
  _.length_1 = function length_10() {
    return this.table.length;
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_OutOfPlane_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "OutOfPlane", 478, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_Stbn = function $clinit_Stbn() {
    carcfmt.$clinit_Stbn = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.Stbn = function Stbn(t, csvpath) {
    carcfmt.$clinit_Stbn();
    Object_0.call(this);
    this.$init_113();
    this.table = carcfm.readFile(csvpath);
    this.t = t;
  };
  defineClass(480, 1, { 1: 1 }, carcfmt.Stbn);
  _.$init_113 = function $init_113() {
  };
  _.get_0 = function get_11(row, col) {
    return jl.intValue__I__devirtual$(castTo(this.table[row][col], 19));
  };
  _.index_1 = function index_4(mol, a1, a2, a3) {
    var a1t, a2t, a3t, angt;
    a1t = mol.getAtomType(a1);
    a2t = mol.getAtomType(a2);
    a3t = mol.getAtomType(a3);
    angt = carcfmt2.getStbnType(this.t, mol, a1, a2, a3);
    if (a1t > a3t)
      a1t = castTo(carcfm.s_1(jl.valueOf_12(a3t), jl.valueOf_12(a3t = a1t)), 35).intValue();
    return carcfm.binary_1(stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [2, 1, 3, 0]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [a2t, a1t, a3t, angt]), this);
  };
  _.kba = function kba(mol, a1, a2, a3) {
    var a1t, a3t, at, b1t, b2t, idx;
    a1t = mol.getAtomType(a1);
    a3t = mol.getAtomType(a3);
    b1t = carcfmt2.getType_2(this.t, mol, a1, a2);
    b2t = carcfmt2.getType_2(this.t, mol, a2, a3);
    idx = this.index_1(mol, a1, a2, a3);
    at = a1t > a3t || a1t == a3t && b1t < b2t ? 1 : 0;
    if (idx >= 0)
      return jl.doubleValue__D__devirtual$(castTo(this.table[idx][4 + at], 19));
    return this.t.dfsb.kb_2(mol, a1, a2, a3);
  };
  _.length_1 = function length_11() {
    return this.table.length;
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_Stbn_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "Stbn", 480, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_Torsion = function $clinit_Torsion() {
    carcfmt.$clinit_Torsion = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.Torsion = function Torsion(t, csvpath) {
    carcfmt.$clinit_Torsion();
    Object_0.call(this);
    this.$init_114();
    this.table = carcfm.readFile(csvpath);
    this.t = t;
  };
  carcfmt.s_2 = function s_2(a, b) {
    return a;
  };
  defineClass(481, 1, { 1: 1 }, carcfmt.Torsion);
  _.$init_114 = function $init_114() {
  };
  _.get_0 = function get_12(row, col) {
    return jl.intValue__I__devirtual$(castTo(this.table[row][col], 19));
  };
  _.getForceConstants = function getForceConstants(mol, a1, a2, a3, a4) {
    var N_jk, U, V, W, a1t, a2t, a3t, a4t, atno, beta_0, bond, canIAtomType, canJAtomType, canKAtomType, canLAtomType, canTorType, i, iWildCard, idx, iter, lWildCard, maxIter, pi_jk, tort, tort1, tort2;
    a1t = mol.getAtomType(a1);
    a2t = mol.getAtomType(a2);
    a3t = mol.getAtomType(a3);
    a4t = mol.getAtomType(a4);
    tort = carcfmt2.getType_3(this.t, mol, a1, a2, a3, a4);
    tort1 = tort > 10 ? narrow_int(tort / 10) : tort;
    tort2 = tort > 10 ? tort - tort1 * 10 : 0;
    idx = -1;
    iter = 0;
    iWildCard = 0;
    lWildCard = 0;
    canTorType = tort1;
    maxIter = 5;
    while (iter < maxIter && (idx == -1 || maxIter == 4) || iter == 4 && tort1 == 5 && tort2 > 0) {
      if (maxIter == 5 && iter == 4) {
        maxIter = 4;
        iter = 0;
        canTorType = tort2;
      }
      if (iter == 1) {
        iWildCard = 1;
        lWildCard = 3;
      } else if (iter == 2) {
        iWildCard = 3;
        lWildCard = 1;
      } else {
        iWildCard = iter;
        lWildCard = iter;
      }
      canIAtomType = this.t.def.table[a1t - 1][$wnd.Math.min(iWildCard + 1, 4)];
      canJAtomType = a2t;
      canKAtomType = a3t;
      canLAtomType = this.t.def.table[a4t - 1][$wnd.Math.min(lWildCard + 1, 4)];
      if (canJAtomType > canKAtomType) {
        canKAtomType = castTo(carcfmt.s_2(jl.valueOf_12(canJAtomType), jl.valueOf_12(canJAtomType = canKAtomType)), 35).intValue();
        canLAtomType = castTo(carcfmt.s_2(jl.valueOf_12(canIAtomType), jl.valueOf_12(canIAtomType = canLAtomType)), 35).intValue();
      } else if (canJAtomType == canKAtomType && canIAtomType > canLAtomType) {
        canLAtomType = castTo(carcfmt.s_2(jl.valueOf_12(canIAtomType), jl.valueOf_12(canIAtomType = canLAtomType)), 35).intValue();
      }
      idx = this.index_3(canIAtomType, canJAtomType, canKAtomType, canLAtomType, canTorType);
      if (idx != -1 && maxIter == 4)
        break;
      iter++;
    }
    if (idx >= 0)
      return new carcfmt.Torsion$Kb_1(this, idx);
    bond = mol.getBond_0(a2, a3);
    U = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [0, 0]);
    V = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [0, 0]);
    W = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [0, 0]);
    atno = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [mol.getAtomicNo_0(a2), mol.getAtomicNo_0(a3)]);
    N_jk = (this.t.atom.crd(a2t) - 1) * (this.t.atom.crd(a3t) - 1);
    for (i = 0; i < 2; i++) {
      switch (atno[i]) {
        case 6:
          U[i] = 2;
          V[i] = 2.12;
          break;
        case 7:
          U[i] = 2;
          V[i] = 1.5;
          break;
        case 8:
          U[i] = 2;
          V[i] = 0.2;
          W[i] = 2;
          break;
        case 14:
          U[i] = 1.25;
          V[i] = 1.22;
          break;
        case 15:
          U[i] = 1.25;
          V[i] = 2.4;
          break;
        case 16:
          U[i] = 1.25;
          V[i] = 0.49;
          W[i] = 8;
          break;
      }
    }
    if (this.t.atom.linear(a2t) || this.t.atom.linear(a3t))
      return new carcfmt.Torsion$Kb_0(this, 0, 0, 0);
    if (this.t.atom.arom(a2t) && this.t.atom.arom(a3t) && mol.isAromaticBond_0(bond)) {
      beta_0 = this.t.atom.val_0(a2t) == 3 && this.t.atom.val_0(a3t) == 4 || this.t.atom.val_0(a2t) == 4 && this.t.atom.val_0(a3t) == 3 ? 3 : 6;
      pi_jk = this.t.atom.pilp(a2t) == 0 && this.t.atom.pilp(a3t) == 0 ? 0.5 : 0.3;
      return new carcfmt.Torsion$Kb_0(this, 0, beta_0 * pi_jk * $wnd.Math.sqrt(U[0] * U[1]), 0);
    }
    if (mol.getBondOrder_0(bond) == 2) {
      beta_0 = 6;
      pi_jk = this.t.atom.mltb(a2t) == 2 && this.t.atom.mltb(a3t) == 2 ? 1 : 0.4;
      return new carcfmt.Torsion$Kb_0(this, 0, beta_0 * pi_jk * $wnd.Math.sqrt(U[0] * U[1]), 0);
    }
    if (this.t.atom.crd(a2t) == 4 && this.t.atom.crd(a3t) == 4)
      return new carcfmt.Torsion$Kb_0(this, 0, 0, $wnd.Math.sqrt(V[0] * V[1]) / N_jk);
    if (this.t.atom.crd(a2t) == 4 && this.t.atom.crd(a3t) != 4) {
      if (this.t.atom.crd(a3t) == 3 && (this.t.atom.val_0(a3t) == 4 || this.t.atom.val_0(a3t) == 34 || this.t.atom.mltb(a3t) > 0) || this.t.atom.crd(a3t) == 2 && (this.t.atom.val_0(a3t) == 3 || this.t.atom.mltb(a3t) > 0))
        return new carcfmt.Torsion$Kb(this);
      else
        return new carcfmt.Torsion$Kb_0(this, 0, 0, $wnd.Math.sqrt(V[0] * V[1]) / N_jk);
    }
    if (this.t.atom.crd(a3t) == 4 && this.t.atom.crd(a2t) != 4) {
      if (this.t.atom.crd(a2t) == 3 && (this.t.atom.val_0(a2t) == 4 || this.t.atom.val_0(a2t) == 34 || this.t.atom.mltb(a2t) > 0) || this.t.atom.crd(a2t) == 2 && (this.t.atom.val_0(a2t) == 3 || this.t.atom.mltb(a2t) > 0))
        return new carcfmt.Torsion$Kb(this);
      else
        return new carcfmt.Torsion$Kb_0(this, 0, 0, $wnd.Math.sqrt(V[0] * V[1]) / N_jk);
    }
    if (mol.getBondOrder_0(bond) == 1 && this.t.atom.mltb(a2t) > 0 && this.t.atom.mltb(a3t) > 0 || this.t.atom.mltb(a2t) > 0 && this.t.atom.pilp(a3t) > 0 || this.t.atom.pilp(a2t) > 0 && this.t.atom.mltb(a3t) > 0) {
      if (this.t.atom.pilp(a2t) > 0 && this.t.atom.pilp(a3t) > 0)
        return new carcfmt.Torsion$Kb(this);
      if (this.t.atom.pilp(a2t) > 0 && this.t.atom.mltb(a3t) > 0) {
        beta_0 = 6;
        pi_jk = 0;
        if (this.t.atom.mltb(a2t) == 1)
          pi_jk = 0.5;
        else if (carcfm.row_0(atno[0]) == 2 && carcfm.row_0(atno[1]) == 2)
          pi_jk = 0.3;
        else if (carcfm.row_0(atno[0]) != 2 || carcfm.row_0(atno[1]) != 2)
          pi_jk = 0.15;
        return new carcfmt.Torsion$Kb_0(this, 0, beta_0 * pi_jk * $wnd.Math.sqrt(U[0] * U[1]), 0);
      }
      if (this.t.atom.pilp(a3t) > 0 && this.t.atom.mltb(a2t) > 0) {
        beta_0 = 6;
        pi_jk = 0;
        if (this.t.atom.mltb(a3t) == 1)
          pi_jk = 0.5;
        else if (carcfm.row_0(atno[0]) == 2 && carcfm.row_0(atno[1]) == 2)
          pi_jk = 0.3;
        else if (carcfm.row_0(atno[0]) != 2 || carcfm.row_0(atno[1]) != 2)
          pi_jk = 0.15;
        return new carcfmt.Torsion$Kb_0(this, 0, beta_0 * pi_jk * $wnd.Math.sqrt(U[0] * U[1]), 0);
      }
      if ((this.t.atom.mltb(a2t) == 1 || this.t.atom.mltb(a3t) == 1) && (atno[0] != 6 || atno[1] != 6))
        return new carcfmt.Torsion$Kb_0(this, 0, 6 * 0.4 * $wnd.Math.sqrt(U[0] * U[1]), 0);
      return new carcfmt.Torsion$Kb_0(this, 0, 6 * 0.15 * $wnd.Math.sqrt(U[0] * U[1]), 0);
    }
    if ((atno[0] == 8 || atno[0] == 16) && (atno[1] == 8 || atno[1] == 16))
      return new carcfmt.Torsion$Kb_0(this, 0, -$wnd.Math.sqrt(W[0] * W[1]), 0);
    return new carcfmt.Torsion$Kb_0(this, 0, 0, $wnd.Math.sqrt(V[0] * V[1]) / N_jk);
  };
  _.index_3 = function index_5(a1t, a2t, a3t, a4t, tort) {
    return carcfm.binary_1(stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [2, 3, 1, 4, 0]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [a2t, a3t, a1t, a4t, tort]), this);
  };
  _.length_1 = function length_12() {
    return this.table.length;
  };
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_Torsion_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "Torsion", 481, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_Torsion$Kb = function $clinit_Torsion$Kb() {
    carcfmt.$clinit_Torsion$Kb = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.Torsion$Kb = function Torsion$Kb(this$0) {
    carcfmt.$clinit_Torsion$Kb();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_115();
    this.v1 = 0;
    this.v2 = 0;
    this.v3 = 0;
  };
  carcfmt.Torsion$Kb_0 = function Torsion$Kb_0(this$0, v1, v2, v3) {
    carcfmt.$clinit_Torsion$Kb();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_115();
    this.v1 = v1;
    this.v2 = v2;
    this.v3 = v3;
  };
  carcfmt.Torsion$Kb_1 = function Torsion$Kb_1(this$0, index_0) {
    carcfmt.$clinit_Torsion$Kb();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_115();
    this.v1 = jl.doubleValue__D__devirtual$(castTo(this$0.table[index_0][5], 19));
    this.v2 = jl.doubleValue__D__devirtual$(castTo(this$0.table[index_0][6], 19));
    this.v3 = jl.doubleValue__D__devirtual$(castTo(this$0.table[index_0][7], 19));
  };
  defineClass(57, 1, { 1: 1 }, carcfmt.Torsion$Kb, carcfmt.Torsion$Kb_0, carcfmt.Torsion$Kb_1);
  _.$init_115 = function $init_115() {
  };
  _.toString_0 = function toString_18() {
    return this.v1 + "," + this.v2 + "," + this.v3;
  };
  _.v1 = 0;
  _.v2 = 0;
  _.v3 = 0;
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_Torsion$Kb_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "Torsion/Kb", 57, cggl.Ljava_lang_Object_2_classLit);
  carcfmt.$clinit_VanDerWaals_0 = function $clinit_VanDerWaals_0() {
    carcfmt.$clinit_VanDerWaals_0 = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt.VanDerWaals_0 = function VanDerWaals_0(t, csvpath) {
    carcfmt.$clinit_VanDerWaals_0();
    Object_0.call(this);
    this.$init_116();
    this.table = carcfm.readFile(csvpath);
  };
  defineClass(482, 1, { 1: 1 }, carcfmt.VanDerWaals_0);
  _.$init_116 = function $init_116() {
  };
  _.alpha_i = function alpha_i(type_0) {
    return jl.doubleValue__D__devirtual$(castTo(this.table[this.index_4(type_0)][1], 19));
  };
  _.da = function da(type_0) {
    return castTo(this.table[this.index_4(type_0)][5], 110).charValue();
  };
  _.g_i = function g_i(type_0) {
    return jl.doubleValue__D__devirtual$(castTo(this.table[this.index_4(type_0)][4], 19));
  };
  _.get_0 = function get_13(row, col) {
    return jl.intValue__I__devirtual$(castTo(this.table[row][col], 19));
  };
  _.index_4 = function index_6(type_0) {
    return carcfm.binary_0(0, type_0, this);
  };
  _.length_1 = function length_13() {
    return this.table.length;
  };
  _.n_i = function n_i(type_0) {
    return jl.doubleValue__D__devirtual$(castTo(this.table[this.index_4(type_0)][2], 19));
  };
  _.r_star = function r_star(type_0) {
    var idx;
    idx = this.index_4(type_0);
    return jl.doubleValue__D__devirtual$(castTo(this.table[idx][3], 19)) * $wnd.Math.pow(jl.doubleValue__D__devirtual$(castTo(this.table[idx][1], 19)), this.power);
  };
  _.b = 0.2;
  _.beta_0 = 12;
  _.daeps = 0.5;
  _.darad = 0.8;
  _.power = 0.25;
  cggl.Lcom_actelion_research_chem_forcefield_mmff_table_VanDerWaals_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.table", "VanDerWaals", 482, cggl.Ljava_lang_Object_2_classLit);
  carcfmt2.$clinit_Angle_0 = function $clinit_Angle_0() {
    carcfmt2.$clinit_Angle_0 = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt2.getStbnType = function getStbnType(table, mol, a1, a2, a3) {
    carcfmt2.$clinit_Angle_0();
    var a1t, a3t, angt, b1t, b1tf, b2t, b2tf;
    a1t = mol.getAtomType(a1);
    a3t = mol.getAtomType(a3);
    b1tf = carcfmt2.getType_2(table, mol, a1, a2);
    b2tf = carcfmt2.getType_2(table, mol, a2, a3);
    b1t = a1t <= a3t ? b1tf : b2tf;
    b2t = a1t < a3t ? b2tf : b1tf;
    angt = carcfmt2.getType(table, mol, a1, a2, a3);
    switch (angt) {
      case 1:
        return b1t > 0 || b1t == b2t ? 1 : 2;
      case 2:
        return 3;
      case 3:
        return 5;
      case 4:
        return 4;
      case 5:
        return b1t > 0 || b1t == b2t ? 6 : 7;
      case 6:
        return 8;
      case 7:
        return b1t > 0 || b1t == b2t ? 9 : 10;
      case 8:
        return 11;
    }
    return 0;
  };
  carcfmt2.getType = function getType(table, mol, a1, a2, a3) {
    carcfmt2.$clinit_Angle_0();
    var bondsum, type_0;
    bondsum = carcfmt2.getType_2(table, mol, a1, a2) + carcfmt2.getType_2(table, mol, a2, a3);
    type_0 = bondsum;
    if (carcfmt2.inRingOfSize(mol, a1, a2, a3, 3))
      type_0 += bondsum > 0 ? 4 : 3;
    else if (carcfmt2.inRingOfSize(mol, a1, a2, a3, 4))
      type_0 += bondsum > 0 ? 6 : 4;
    return type_0;
  };
  carcfmt2.inRingOfSize = function inRingOfSize(mol, a1, a2, a3, size_0) {
    carcfmt2.$clinit_Angle_0();
    var a, a$array, a$index, a$max, angle, r, ring, rings;
    rings = mol.getRingSet_0();
    angle = new ju.HashSet();
    angle.add(jl.valueOf_12(a1));
    angle.add(jl.valueOf_12(a2));
    angle.add(jl.valueOf_12(a3));
    if (mol.getBond_0(a1, a2) >= 0 && mol.getBond_0(a2, a3) >= 0) {
      for (r = 0; r < rings.getSize_0(); r++)
        if (rings.getRingSize_0(r) == size_0) {
          ring = new ju.HashSet();
          for (a$array = rings.getRingAtoms_0(r), a$index = 0, a$max = a$array.length; a$index < a$max; ++a$index) {
            a = a$array[a$index];
            ring.add(jl.valueOf_12(a));
          }
          if (ring.containsAll(angle))
            return true;
        }
    }
    return false;
  };
  defineClass(816, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_forcefield_mmff_type_Angle_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.type", "Angle", 816, cggl.Ljava_lang_Object_2_classLit);
  carcfmt2.$clinit_Atom_0 = function $clinit_Atom_0() {
    carcfmt2.$clinit_Atom_0 = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt2.degree = function degree(mol, atom) {
    return mol.getAllConnAtoms_0(atom) + mol.getImplicitHydrogens_1(atom);
  };
  carcfmt2.getHeavyType = function getHeavyType(mol, atom) {
    var EdoubledC, EtripledC, N2toC, N3toC, NtoN, OtoC, OtoN, OtoN3, StoC, StoN, alpha_0, alpha$iterator, alphaBetaSameRing, alphaHet, beta_0, beta$iterator, betaHet, bond, doubleBondedElement, doubleCN, i, i0, i1, inAromatic6Ring, isAlphaOS, isBetaOS, isCarbonylO, isCarboxylateO, isCdoubleS, isImineOrAzo, isIsonitrile, isNAZT, isNCNplus, isNCOorNCS, isNGDplus, isNNNorNNC, isNOxideO, isNSO, isNSP, isNbrBenzeneC, isNbrC, isNitroO, isNitroso, isNitrosoO, isOdoubleS, isOxideOtoC, isOxideOtoH, isOxideOtoN, isPhosphateOrPerchlorateO, isSulfateO, isSulfonamideN, isSulfoxideO, isThioSulfinateO, j, j0, k, nFormalCharge, nHtoO, nIn5Ring, nIn6Ring, nN, nN2, nN3, nNtoS, nO, nONtoS, nOtoS, nOtoSP, nS, nStoS, nTermOtoN, nTermOtoS, nbr, nbr2, nbr3, nbrTermS, surroundedByArom, surroundedByBenzeneC;
    if (mol.isAromaticAtom_0(atom)) {
      if (carcfmt2.isInAromaticRingOfSize(mol, atom, 5)) {
        alphaHet = new ju.ArrayList_0(mol.getAllAtoms_0());
        betaHet = new ju.ArrayList_0(mol.getAllAtoms_0());
        alphaBetaSameRing = false;
        isAlphaOS = false;
        isBetaOS = false;
        if (mol.getAtomicNo_0(atom) == 6 || mol.getAtomicNo_0(atom) == 7) {
          for (i0 = 0; i0 < mol.getAllConnAtoms_0(atom); i0++) {
            nbr = mol.getConnAtom_0(atom, i0);
            if (!carcfmt2.isInAromaticRingOfSize(mol, nbr, 5))
              continue;
            if (carcfmt2.inSameRing(mol, atom, nbr, 5) && (mol.getAtomicNo_0(nbr) == 8 || mol.getAtomicNo_0(nbr) == 16 || mol.getAtomicNo_0(nbr) == 7 && carcfmt2.degree(mol, nbr) == 3 && !carcfmt2.isAtomNOxide(mol, nbr)))
              alphaHet.add(jl.valueOf_12(nbr));
            for (j0 = 0; j0 < mol.getAllConnAtoms_0(nbr); j0++) {
              nbr2 = mol.getConnAtom_0(nbr, j0);
              if (nbr2 == atom)
                continue;
              if (!carcfmt2.isInAromaticRingOfSize(mol, nbr2, 5))
                continue;
              if (carcfmt2.inSameRing(mol, atom, nbr2, 5) && (mol.getAtomicNo_0(nbr2) == 8 || mol.getAtomicNo_0(nbr2) == 16 || mol.getAtomicNo_0(nbr2) == 7 && carcfmt2.degree(mol, nbr2) == 3 && !carcfmt2.isAtomNOxide(mol, nbr2)))
                betaHet.add(jl.valueOf_12(nbr2));
            }
          }
          for (alpha$iterator = alphaHet.iterator(); alpha$iterator.hasNext_0(); ) {
            alpha_0 = castTo(alpha$iterator.next_3(), 35).intValue();
            if (mol.getAtomicNo_0(alpha_0) == 8 || mol.getAtomicNo_0(alpha_0) == 16) {
              isAlphaOS = true;
              break;
            }
          }
          for (beta$iterator = betaHet.iterator(); beta$iterator.hasNext_0(); ) {
            beta_0 = castTo(beta$iterator.next_3(), 35).intValue();
            if (mol.getAtomicNo_0(beta_0) == 8 || mol.getAtomicNo_0(beta_0) == 16) {
              isBetaOS = true;
              break;
            }
          }
          for (i = 0; i < alphaHet.size(); i++)
            for (j = i; j < betaHet.size(); j++)
              if (carcfmt2.inSameRing(mol, castTo(alphaHet.getAtIndex(i), 35).intValue(), castTo(betaHet.getAtIndex(j), 35).intValue(), 5)) {
                alphaBetaSameRing = true;
                break;
              }
        }
        switch (mol.getAtomicNo_0(atom)) {
          case 6:
            if (betaHet.isEmpty()) {
              nN = 0;
              nFormalCharge = 0;
              nIn5Ring = 0;
              nIn6Ring = 0;
              for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
                nbr = mol.getConnAtom_0(atom, i);
                if (mol.getAtomicNo_0(nbr) == 7 && carcfmt2.degree(mol, nbr) == 3) {
                  nN++;
                  if (mol.getAtomCharge_0(nbr) > 0 && !carcfmt2.isAtomNOxide(mol, nbr))
                    nFormalCharge++;
                  if (carcfmt2.isInAromaticRingOfSize(mol, nbr, 5))
                    nIn5Ring++;
                  if (carcfmt2.isInAromaticRingOfSize(mol, nbr, 6))
                    nIn6Ring++;
                }
              }
              if ((nN == 2 && nIn5Ring > 0 || nN == 3 && nIn5Ring == 2) && nFormalCharge > 0 && nIn6Ring == 0)
                return 80;
            }
            if (!(alphaHet.isEmpty() ^ betaHet.isEmpty())) {
              surroundedByBenzeneC = true;
              surroundedByArom = true;
              for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
                nbr = mol.getConnAtom_0(atom, i);
                if (mol.getAtomicNo_0(nbr) != 6 || !carcfmt2.inRingOfSize_0(mol, nbr, 6))
                  surroundedByBenzeneC = false;
                if (carcfmt2.inSameRing(mol, atom, nbr, 5) && !mol.isAromaticAtom_0(nbr))
                  surroundedByArom = false;
              }
              if (alphaHet.isEmpty() && betaHet.isEmpty() && !surroundedByBenzeneC && surroundedByArom)
                return 78;
              if (!alphaHet.isEmpty() && !alphaHet.isEmpty() && (!alphaBetaSameRing || !isAlphaOS && !isBetaOS))
                return 78;
            }
            if (!alphaHet.isEmpty() && (betaHet.isEmpty() || isAlphaOS))
              return 63;
            if (!betaHet.isEmpty() && (alphaHet.isEmpty() || isBetaOS))
              return 64;
            break;
          case 7:
            if (carcfmt2.isAtomNOxide(mol, atom))
              return 82;
            if (alphaHet.isEmpty() && betaHet.isEmpty()) {
              if (carcfmt2.degree(mol, atom) == 3)
                return 39;
              return 76;
            }
            if (carcfmt2.degree(mol, atom) == 3) {
              if (alphaHet.isEmpty() ^ betaHet.isEmpty())
                return 81;
            }
            if (!alphaHet.isEmpty() && (betaHet.isEmpty() || isAlphaOS))
              return 65;
            if (!betaHet.isEmpty() && (alphaHet.isEmpty() || isBetaOS))
              return 66;
            if (!alphaHet.isEmpty() && !betaHet.isEmpty())
              return 79;
            break;
          case 8:
            return 59;
          case 16:
            return 44;
        }
      }
      if (carcfmt2.isInAromaticRingOfSize(mol, atom, 6)) {
        switch (mol.getAtomicNo_0(atom)) {
          case 6:
            return 37;
          case 7:
            if (carcfmt2.isAtomNOxide(mol, atom))
              return 69;
            if (carcfmt2.degree(mol, atom) == 3)
              return 58;
            return 38;
        }
      }
    }
    switch (mol.getAtomicNo_0(atom)) {
      case 3:
        if (mol.getConnAtoms_0(atom) == 0)
          return 92;
        break;
      case 6:
        if (carcfmt2.degree(mol, atom) == 4) {
          if (mol.getAtomRingSize_0(atom) == 3)
            return 22;
          if (mol.getAtomRingSize_0(atom) == 4)
            return 20;
          return 1;
        }
        if (carcfmt2.degree(mol, atom) == 3) {
          nN2 = 0;
          nN3 = 0;
          nO = 0;
          nS = 0;
          doubleBondedElement = 0;
          for (i0 = 0; i0 < mol.getAllConnAtoms_0(atom); i0++) {
            nbr = mol.getConnAtom_0(atom, i0);
            if (mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 2)
              doubleBondedElement = mol.getAtomicNo_0(nbr);
            if (carcfmt2.degree(mol, nbr) == 1) {
              if (mol.getAtomicNo_0(nbr) == 8)
                nO++;
              if (mol.getAtomicNo_0(nbr) == 16)
                nS++;
            } else if (mol.getAtomicNo_0(nbr) == 7) {
              if (carcfmt2.degree(mol, nbr) == 3)
                nN3++;
              else if (carcfmt2.degree(mol, nbr) == 2 && mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 2)
                nN2++;
            }
          }
          if (nN3 >= 2 && nN2 == 0 && doubleBondedElement == 7) {
            return 57;
          }
          if (nO == 2 || nS == 2) {
            return 41;
          }
          if (mol.getAtomRingSize_0(atom) == 4 && doubleBondedElement == 6) {
            return 30;
          }
          if (doubleBondedElement == 7 || doubleBondedElement == 8 || doubleBondedElement == 15 || doubleBondedElement == 16) {
            return 3;
          }
          return 2;
        }
        if (carcfmt2.degree(mol, atom) == 2) {
          return 4;
        }
        if (carcfmt2.degree(mol, atom) == 1) {
          return 60;
        }
        break;
      case 7:
        nTermOtoN = 0;
        isSulfonamideN = false;
        for (i1 = 0; i1 < mol.getAllConnAtoms_0(atom); i1++) {
          nbr = mol.getConnAtom_0(atom, i1);
          if (mol.getAtomicNo_0(nbr) == 8 && carcfmt2.degree(mol, nbr) == 1)
            nTermOtoN++;
          if (mol.getOccupiedValence_0(atom) + mol.getImplicitHydrogens_1(atom) >= 3 && (mol.getAtomicNo_0(nbr) == 15 || mol.getAtomicNo_0(nbr) == 16)) {
            nOtoSP = 0;
            for (j = 0; j < mol.getAllConnAtoms_0(nbr); j++) {
              nbr2 = mol.getConnAtom_0(nbr, j);
              if (mol.getAtomicNo_0(nbr2) == 8 && carcfmt2.degree(mol, nbr2) == 1)
                nOtoSP++;
            }
            if (!isSulfonamideN)
              isSulfonamideN = nOtoSP >= 2;
          }
        }
        if (carcfmt2.degree(mol, atom) == 4) {
          if (carcfmt2.isAtomNOxide(mol, atom))
            return 68;
          return 34;
        }
        if (carcfmt2.degree(mol, atom) == 3) {
          if (mol.getOccupiedValence_0(atom) + mol.getImplicitHydrogens_1(atom) >= 4) {
            doubleCN = false;
            for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
              nbr = mol.getConnAtom_0(atom, i);
              if (mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 2) {
                doubleCN = mol.getAtomicNo_0(nbr) == 7 || mol.getAtomicNo_0(nbr) == 6;
                if (mol.getAtomicNo_0(nbr) == 6) {
                  for (j = 0; doubleCN && j < mol.getAllConnAtoms_0(nbr); j++) {
                    nbr2 = mol.getConnAtom_0(nbr, j);
                    if (nbr2 == atom)
                      continue;
                    doubleCN = !(mol.getAtomicNo_0(nbr2) == 7 && carcfmt2.degree(mol, nbr2) == 3);
                  }
                }
              }
            }
            if (nTermOtoN == 1)
              return 67;
            if (nTermOtoN >= 2)
              return 45;
            if (doubleCN)
              return 54;
          }
          if (mol.getOccupiedValence_0(atom) + mol.getImplicitHydrogens_1(atom) >= 3) {
            isNCOorNCS = false;
            isNCNplus = false;
            isNGDplus = false;
            isNNNorNNC = false;
            isNbrC = false;
            isNbrBenzeneC = false;
            EdoubledC = 0;
            EtripledC = 0;
            N2toC = 0;
            N3toC = 0;
            OtoC = 0;
            StoC = 0;
            for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
              nbr = mol.getConnAtom_0(atom, i);
              if (mol.getAtomicNo_0(nbr) == 6) {
                isNbrC = true;
                if (mol.isAromaticAtom_0(nbr) && mol.getAtomRingSize_0(nbr) == 6)
                  isNbrBenzeneC = true;
                N2toC = 0;
                N3toC = 0;
                OtoC = 0;
                StoC = 0;
                nFormalCharge = 0;
                inAromatic6Ring = 0;
                for (j = 0; j < mol.getAllConnAtoms_0(nbr); j++) {
                  nbr2 = mol.getConnAtom_0(nbr, j);
                  bond = mol.getBond_0(nbr, nbr2);
                  if (mol.getBondOrder_0(bond) == 2 && (mol.getAtomicNo_0(nbr2) == 8 || mol.getAtomicNo_0(nbr2) == 16))
                    isNCOorNCS = true;
                  if (mol.getBondOrder_0(bond) == 2 || mol.isAromaticBond_0(bond) && (mol.getAtomicNo_0(nbr2) == 6 || mol.getAtomicNo_0(nbr2) == 7 && carcfmt2.inRings(mol, nbr2) == 1))
                    EdoubledC = mol.getAtomicNo_0(nbr2);
                  if (mol.getBondOrder_0(bond) == 3)
                    EtripledC = mol.getAtomicNo_0(nbr2);
                  if (mol.getAtomicNo_0(nbr2) == 7 && carcfmt2.degree(mol, nbr2) == 3) {
                    if (mol.getAtomCharge_0(nbr2) == 1)
                      nFormalCharge++;
                    if (carcfmt2.isInAromaticRingOfSize(mol, nbr, 6))
                      inAromatic6Ring++;
                    OtoN3 = 0;
                    for (k = 0; k < mol.getAllConnAtoms_0(nbr2); k++) {
                      nbr3 = mol.getConnAtom_0(nbr2, k);
                      if (mol.getAtomicNo_0(nbr3) == 8)
                        OtoN3++;
                    }
                    if (OtoN3 < 2)
                      N3toC++;
                  }
                  if (mol.getAtomicNo_0(nbr2) == 7 && carcfmt2.degree(mol, nbr2) == 2 && (mol.getBondOrder_0(bond) == 2 || mol.isAromaticBond_0(bond)))
                    N2toC++;
                  if (mol.isAromaticAtom_0(nbr2)) {
                    if (mol.getAtomicNo_0(nbr2) == 8)
                      OtoC++;
                    if (mol.getAtomicNo_0(nbr2) == 16)
                      StoC++;
                  }
                }
                if (EdoubledC == 7) {
                  if (N3toC == 2 && N2toC == 0 && nFormalCharge > 0 && inAromatic6Ring == 0 && carcfmt2.degree(mol, nbr) < 4)
                    isNCNplus = true;
                  if (N3toC == 3)
                    isNGDplus = true;
                }
              } else if (mol.getAtomicNo_0(nbr) == 7) {
                NtoN = 0;
                OtoN = 0;
                StoN = 0;
                for (j = 0; j < mol.getAllConnAtoms_0(nbr); j++) {
                  nbr2 = mol.getConnAtom_0(nbr, j);
                  bond = mol.getBond_0(nbr, nbr2);
                  if (mol.getBondOrder_0(bond) == 2) {
                    if (mol.getAtomicNo_0(nbr2) == 6) {
                      for (k = 0; k < mol.getAllConnAtoms_0(nbr2); k++) {
                        nbr3 = mol.getConnAtom_0(nbr2, k);
                        if (nbr3 == atom)
                          continue;
                        if (mol.getAtomicNo_0(nbr3) == 7)
                          NtoN++;
                        else if (mol.getAtomicNo_0(nbr3) == 8)
                          OtoN++;
                        else if (mol.getAtomicNo_0(nbr3) == 16)
                          StoN++;
                      }
                      if (NtoN == 0 && OtoN == 0 && StoN == 0 && !isNbrBenzeneC)
                        isNNNorNNC = true;
                    }
                    if (mol.getAtomicNo_0(nbr2) == 7 && !isNbrBenzeneC)
                      isNNNorNNC = true;
                  }
                }
              }
            }
            if (isNbrC) {
              if (EtripledC == 7)
                isSulfonamideN = true;
              if (isNCNplus)
                return 55;
              if (isNGDplus)
                return 56;
              if (!isNCOorNCS && !isSulfonamideN && (OtoC == 0 && StoC == 0 && isNbrBenzeneC || EdoubledC == 6 || EdoubledC == 7 || EdoubledC == 15 || EtripledC == 6))
                return 40;
            }
            if (!isSulfonamideN && (isNCOorNCS || isNNNorNNC))
              return 10;
          }
        }
        if (carcfmt2.degree(mol, atom) == 2) {
          if (mol.getOccupiedValence_0(atom) + mol.getImplicitHydrogens_1(atom) == 4) {
            isIsonitrile = false;
            for (i = 0; !isIsonitrile && i < mol.getAllConnAtoms_0(atom); i++) {
              nbr = mol.getConnAtom_0(atom, i);
              isIsonitrile = mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 3;
            }
            if (isIsonitrile)
              return 61;
            return 53;
          }
          if (mol.getOccupiedValence_0(atom) + mol.getImplicitHydrogens_1(atom) == 3) {
            isNitroso = false;
            isImineOrAzo = false;
            for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
              nbr = mol.getConnAtom_0(atom, i);
              if (mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 2) {
                isNitroso = mol.getAtomicNo_0(nbr) == 8 && nTermOtoN == 1;
                isImineOrAzo = mol.getAtomicNo_0(nbr) == 6 || mol.getAtomicNo_0(nbr) == 7;
              }
            }
            if (isNitroso && !isImineOrAzo)
              return 46;
            if (isImineOrAzo)
              return 9;
          }
          if (mol.getOccupiedValence_0(atom) + mol.getImplicitHydrogens_1(atom) >= 2) {
            isNSO = false;
            for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
              nbr = mol.getConnAtom_0(atom, i);
              if (mol.getAtomicNo_0(nbr) == 16) {
                nTermOtoS = 0;
                for (j = 0; j < mol.getAllConnAtoms_0(nbr); j++) {
                  nbr2 = mol.getConnAtom_0(nbr, j);
                  if (mol.getAtomicNo_0(nbr2) == 8 && carcfmt2.degree(mol, nbr2) == 1)
                    nTermOtoS++;
                }
                isNSO = nTermOtoS == 1;
              }
            }
            if (isNSO)
              return 48;
            if (!isSulfonamideN)
              return 62;
          }
        }
        if (isSulfonamideN)
          return 43;
        if (carcfmt2.degree(mol, atom) == 1) {
          isNSP = false;
          isNAZT = false;
          for (i = 0; !isNSP && !isNAZT && i < mol.getAllConnAtoms_0(atom); i++) {
            nbr = mol.getConnAtom_0(atom, i);
            isNSP = mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 3;
            if (mol.getAtomicNo_0(nbr) == 7 && carcfmt2.degree(mol, nbr) == 2) {
              for (j = 0; !isNAZT && j < mol.getAllConnAtoms_0(nbr); j++) {
                nbr2 = mol.getConnAtom_0(nbr, j);
                isNAZT = mol.getAtomicNo_0(nbr2) == 7 && carcfmt2.degree(mol, nbr2) == 2 || mol.getAtomicNo_0(nbr2) == 6 && carcfmt2.degree(mol, nbr2) == 3;
              }
            }
          }
          if (isNSP)
            return 42;
          if (isNAZT)
            return 47;
        }
        return 8;
      case 8:
        if (carcfmt2.degree(mol, atom) == 3)
          return 49;
        if (carcfmt2.degree(mol, atom) == 2) {
          if (mol.getOccupiedValence_0(atom) + mol.getImplicitHydrogens_1(atom) == 3)
            return 51;
          nHtoO = 0;
          for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
            nbr = mol.getConnAtom_0(atom, i);
            if (mol.getAtomicNo_0(nbr) == 1)
              nHtoO++;
          }
          if (nHtoO + mol.getImplicitHydrogens_1(atom) == 2)
            return 70;
          return 6;
        }
        if (mol.getConnAtoms_0(atom) <= 1) {
          nNtoS = 0;
          nOtoS = 0;
          nStoS = 0;
          isOxideOtoH = mol.getAllConnAtoms_0(atom) - mol.getConnAtoms_0(atom) + mol.getImplicitHydrogens_1(atom) > 0 ? true : false;
          isCarboxylateO = false;
          isCarbonylO = false;
          isOxideOtoC = false;
          isNitrosoO = false;
          isOxideOtoN = false;
          isNOxideO = false;
          isNitroO = false;
          isThioSulfinateO = false;
          isSulfateO = false;
          isSulfoxideO = false;
          isPhosphateOrPerchlorateO = false;
          for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
            if (isOxideOtoH)
              break;
            if (isCarboxylateO)
              break;
            if (isCarbonylO)
              break;
            if (isOxideOtoC)
              break;
            if (isNitrosoO)
              break;
            if (isOxideOtoN)
              break;
            if (isNOxideO)
              break;
            if (isNitroO)
              break;
            if (isThioSulfinateO)
              break;
            if (isSulfateO)
              break;
            if (isSulfoxideO)
              break;
            if (isPhosphateOrPerchlorateO)
              break;
            nbr = mol.getConnAtom_0(atom, i);
            if (mol.getAtomicNo_0(nbr) == 6 || mol.getAtomicNo_0(nbr) == 7 || mol.getAtomicNo_0(nbr) == 16) {
              for (j = 0; j < mol.getAllConnAtoms_0(nbr); j++) {
                nbr2 = mol.getConnAtom_0(nbr, j);
                if (mol.getAtomicNo_0(nbr2) == 7 && carcfmt2.degree(mol, nbr2) == 2)
                  nNtoS++;
                if (mol.getAtomicNo_0(nbr2) == 8 && carcfmt2.degree(mol, nbr2) == 1)
                  nOtoS++;
                if (mol.getAtomicNo_0(nbr2) == 16 && carcfmt2.degree(mol, nbr2) == 1)
                  nStoS++;
              }
            }
            isOxideOtoH = mol.getAtomicNo_0(nbr) == 1;
            if (mol.getAtomicNo_0(nbr) == 6) {
              isCarboxylateO = nOtoS == 2;
              isCarbonylO = mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 2;
              isOxideOtoC = mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 1 && nOtoS == 1;
            }
            if (mol.getAtomicNo_0(nbr) == 7) {
              isNitrosoO = mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 2;
              if (mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 1 && nOtoS == 1) {
                isOxideOtoN = carcfmt2.degree(mol, nbr) == 2 || mol.getOccupiedValence_0(nbr) + mol.getImplicitHydrogens_1(nbr) == 3;
                isNOxideO = mol.getOccupiedValence_0(nbr) + mol.getImplicitHydrogens_1(nbr) == 4;
              }
              isNitroO = nOtoS >= 2;
            }
            if (mol.getAtomicNo_0(nbr) == 16) {
              isThioSulfinateO = nStoS == 1;
              isSulfateO = mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 1 || mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 2 && nOtoS + nNtoS > 1;
              isSulfoxideO = mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 2 && nOtoS + nNtoS == 1;
            }
            isPhosphateOrPerchlorateO = mol.getAtomicNo_0(nbr) == 15 || mol.getAtomicNo_0(nbr) == 17;
          }
          if (isOxideOtoC || isOxideOtoN || isOxideOtoH)
            return 35;
          if (isCarboxylateO || isNitroO || isNOxideO || isThioSulfinateO || isSulfateO || isPhosphateOrPerchlorateO)
            return 32;
          if (isCarbonylO || isNitrosoO || isSulfoxideO)
            return 7;
        }
        break;
      case 9:
        if (mol.getConnAtoms_0(atom) == 1)
          return 11;
        if (mol.getConnAtoms_0(atom) == 0)
          return 89;
        break;
      case 11:
        if (mol.getConnAtoms_0(atom) == 0)
          return 93;
        break;
      case 12:
        if (mol.getConnAtoms_0(atom) == 0)
          return 99;
        break;
      case 14:
        return 19;
      case 15:
        if (carcfmt2.degree(mol, atom) == 4)
          return 25;
        if (carcfmt2.degree(mol, atom) == 3)
          return 26;
        if (carcfmt2.degree(mol, atom) == 2)
          return 75;
        break;
      case 16:
        if (carcfmt2.degree(mol, atom) == 3 || carcfmt2.degree(mol, atom) == 4) {
          nONtoS = 0;
          nStoS = 0;
          isCdoubleS = false;
          for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
            nbr = mol.getConnAtom_0(atom, i);
            if (mol.getAtomicNo_0(nbr) == 6 && mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 2)
              isCdoubleS = true;
            if (mol.getConnAtoms_0(nbr) == 1 && mol.getAtomicNo_0(nbr) == 8 || carcfmt2.degree(mol, nbr) == 2 && mol.getAtomicNo_0(nbr) == 7)
              nONtoS++;
            if (mol.getConnAtoms_0(nbr) == 1 && mol.getAtomicNo_0(nbr) == 16)
              nStoS++;
          }
          if (carcfmt2.degree(mol, atom) == 3 && nONtoS == 2 && isCdoubleS || carcfmt2.degree(mol, atom) == 4)
            return 18;
          if (nONtoS > 0 && nStoS > 0 || nONtoS == 2 && !isCdoubleS)
            return 73;
          return 17;
        }
        if (carcfmt2.degree(mol, atom) == 2) {
          isOdoubleS = false;
          for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
            nbr = mol.getConnAtom_0(atom, i);
            if (mol.getAtomicNo_0(nbr) == 8 && mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 2)
              isOdoubleS = true;
          }
          if (isOdoubleS)
            return 74;
          return 15;
        }
        if (carcfmt2.degree(mol, atom) == 1) {
          nbrTermS = 0;
          isCdoubleS = false;
          for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
            nbr = mol.getConnAtom_0(atom, i);
            for (j = 0; j < mol.getAllConnAtoms_0(nbr); j++) {
              nbr2 = mol.getConnAtom_0(nbr, j);
              if (mol.getAtomicNo_0(nbr2) == 16 && carcfmt2.degree(mol, nbr2) == 1)
                nbrTermS++;
            }
            if (mol.getAtomicNo_0(nbr) == 6 && mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 2)
              isCdoubleS = true;
          }
          if (isCdoubleS && nbrTermS != 2)
            return 16;
          return 72;
        }
        break;
      case 17:
        if (mol.getConnAtoms_0(atom) == 4) {
          nO = 0;
          for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
            nbr = mol.getConnAtom_0(atom, i);
            if (mol.getAtomicNo_0(nbr) == 8)
              nO++;
          }
          if (nO == 4)
            return 77;
        }
        if (mol.getConnAtoms_0(atom) == 1)
          return 12;
        if (mol.getConnAtoms_0(atom) == 0)
          return 90;
        break;
      case 19:
        if (mol.getConnAtoms_0(atom) == 0)
          return 94;
        break;
      case 20:
        if (mol.getConnAtoms_0(atom) == 0)
          return 96;
        break;
      case 26:
        if (mol.getConnAtoms_0(atom) == 0) {
          if (mol.getAtomCharge_0(atom) == 2)
            return 87;
          if (mol.getAtomCharge_0(atom) == 3)
            return 88;
        }
        break;
      case 29:
        if (mol.getConnAtoms_0(atom) == 0) {
          if (mol.getAtomCharge_0(atom) == 1)
            return 97;
          if (mol.getAtomCharge_0(atom) == 2)
            return 98;
        }
        break;
      case 30:
        if (mol.getConnAtoms_0(atom) == 0)
          return 95;
        break;
      case 35:
        if (mol.getConnAtoms_0(atom) == 1)
          return 13;
        if (mol.getConnAtoms_0(atom) == 0)
          return 91;
        break;
      case 53:
        if (mol.getConnAtoms_0(atom) == 1)
          return 14;
        break;
    }
    return 0;
  };
  carcfmt2.getHydrogenType = function getHydrogenType(mol, atom) {
    var bond, i, isHOCCorHOCN, isHOCO, isHOP, isHOS, j, k, nbr, nbr2, nbr3;
    for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
      nbr = mol.getConnAtom_0(atom, i);
      switch (mol.getAtomicNo_0(nbr)) {
        case 6:
          return 5;
        case 7:
          switch (carcfmt2.getHeavyType(mol, nbr)) {
            case 8:
            case 39:
            case 62:
            case 67:
            case 68:
              return 23;
            case 34:
            case 54:
            case 55:
            case 56:
            case 58:
            case 81:
              return 36;
            case 9:
              return 27;
            default:
              return 28;
          }
        case 8:
          switch (carcfmt2.getHeavyType(mol, nbr)) {
            case 49:
              return 50;
            case 51:
              return 52;
            case 70:
              return 31;
            case 6:
              isHOCCorHOCN = false;
              isHOCO = false;
              isHOP = false;
              isHOS = false;
              for (j = 0; j < mol.getAllConnAtoms_0(nbr); j++) {
                nbr2 = mol.getConnAtom_0(nbr, j);
                if (mol.getAtomicNo_0(nbr2) == 6) {
                  for (k = 0; k < mol.getAllConnAtoms_0(nbr2); k++) {
                    nbr3 = mol.getConnAtom_0(nbr2, k);
                    if (nbr3 == nbr)
                      continue;
                    bond = mol.getBond_0(nbr2, nbr3);
                    if ((mol.getAtomicNo_0(nbr3) == 6 || mol.getAtomicNo_0(nbr3) == 7) && (mol.getBondOrder_0(bond) == 2 || mol.isAromaticBond_0(bond)))
                      isHOCCorHOCN = true;
                    if (mol.getAtomicNo_0(nbr3) == 8 && mol.getBondOrder_0(bond) == 2)
                      isHOCO = true;
                  }
                }
                if (mol.getAtomicNo_0(nbr2) == 15)
                  isHOP = true;
                if (mol.getAtomicNo_0(nbr2) == 16)
                  isHOS = true;
              }
              if (isHOCO || isHOP)
                return 24;
              if (isHOCCorHOCN)
                return 29;
              if (isHOS)
                return 33;
            default:
              return 21;
          }
        case 14:
          return 5;
        case 15:
          return 71;
        case 16:
          return 71;
      }
    }
    return 0;
  };
  carcfmt2.getType_0 = function getType_0(mol, atom) {
    carcfmt2.$clinit_Atom_0();
    if (mol.getAtomType(atom) > -1)
      return mol.getAtomType(atom);
    if (mol.getAtomicNo_0(atom) == 1)
      return carcfmt2.getHydrogenType(mol, atom);
    else
      return carcfmt2.getHeavyType(mol, atom);
  };
  carcfmt2.inRingOfSize_0 = function inRingOfSize_0(mol, atom, size_0) {
    var r, rings;
    if (mol.isRingAtom_0(atom)) {
      rings = mol.getRingSet_0();
      for (r = 0; r < rings.getSize_0(); r++)
        if (rings.getRingSize_0(r) == size_0 && rings.isAtomMember_0(r, atom))
          return true;
    }
    return false;
  };
  carcfmt2.inRings = function inRings(mol, atom) {
    var r, rc, rings;
    rings = mol.getRingSet_0();
    rc = 0;
    for (r = 0; r < rings.getSize_0(); r++)
      if (rings.getAtomIndex_0(r, atom) >= 0)
        rc++;
    return rc;
  };
  carcfmt2.inSameRing = function inSameRing(mol, a1, a2, size_0) {
    var r, rings;
    if (!mol.isRingAtom_0(a1) || !mol.isRingAtom_0(a2))
      return false;
    rings = mol.getRingSet_0();
    for (r = 0; r < rings.getSize_0(); r++)
      if (rings.getRingSize_0(r) == size_0 && rings.isAtomMember_0(r, a1) && rings.isAtomMember_0(r, a2))
        return true;
    return false;
  };
  carcfmt2.isAtomNOxide = function isAtomNOxide(mol, atom) {
    var i, nbr;
    if (mol.getAtomicNo_0(atom) == 7 && carcfmt2.degree(mol, atom) >= 3) {
      for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
        nbr = mol.getConnAtom_0(atom, i);
        if (mol.getAtomicNo_0(nbr) == 8 && carcfmt2.degree(mol, nbr) == 1)
          return true;
      }
    }
    return false;
  };
  carcfmt2.isInAromaticRingOfSize = function isInAromaticRingOfSize(mol, atom, size_0) {
    var r, rings;
    if (mol.isAromaticAtom_0(atom)) {
      rings = mol.getRingSet_0();
      for (r = 0; r < rings.getSize_0(); r++) {
        if (rings.getRingSize_0(r) != size_0 || !rings.isAtomMember_0(r, atom))
          continue;
        if (mol.ringIsMMFFAromatic(r))
          return true;
      }
    }
    return false;
  };
  carcfmt2.ringIsMMFFAromatic_0 = function ringIsMMFFAromatic_0(mol, r) {
    carcfmt2.$clinit_Atom_0();
    var a, a$array, a$index, a$max, atom, b, b$array, b$index, b$max, c, i, j, nbr, passes, ri, rings;
    rings = mol.getRingSet_0();
    if (!rings.isAromatic_0(r))
      return carcfm.$clinit_RingBoolean(), carcfm.FALSE;
    if (rings.getRingSize_0(r) == 6) {
      for (a$array = rings.getRingAtoms_0(r), a$index = 0, a$max = a$array.length; a$index < a$max; ++a$index) {
        a = a$array[a$index];
        if (mol.getOccupiedValence_0(a) + mol.getImplicitHydrogens_1(a) != carcfmt2.degree(mol, a) + 1)
          return carcfm.$clinit_RingBoolean(), carcfm.FALSE;
      }
      for (b$array = rings.getRingBonds_0(r), b$index = 0, b$max = b$array.length; b$index < b$max; ++b$index) {
        b = b$array[b$index];
        c = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [-1, -1]);
        if (mol.getBondOrder_0(b) == 1) {
          for (j = 0; j <= 1; j++) {
            atom = mol.getBondAtom_0(j, b);
            for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
              nbr = mol.getConnAtom_0(atom, i);
              if (!rings.isAtomMember_0(r, nbr) && mol.getBondOrder_0(mol.getBond_0(atom, nbr)) == 2) {
                c[j] = nbr;
                break;
              }
            }
          }
          if (c[0] > -1 && c[1] > -1) {
            for (ri = 0; ri < rings.getSize_0(); ri++) {
              if (rings.isAtomMember_0(ri, c[0]) && rings.isAtomMember_0(ri, c[1]) && !mol.isSetRingMMFFAromaticity(ri))
                return carcfm.$clinit_RingBoolean(), carcfm.NOT_SET;
              if (rings.isAtomMember_0(ri, c[0]) && rings.isAtomMember_0(ri, c[1]) && !mol.ringIsMMFFAromatic(ri))
                return carcfm.$clinit_RingBoolean(), carcfm.FALSE;
            }
          }
        }
      }
    }
    if (rings.getRingSize_0(r) == 5) {
      passes = 1;
      for (a$array = rings.getRingAtoms_0(r), a$index = 0, a$max = a$array.length; a$index < a$max; ++a$index) {
        a = a$array[a$index];
        if (mol.getOccupiedValence_0(a) + mol.getImplicitHydrogens_1(a) == carcfmt2.degree(mol, a) && passes > 0) {
          passes--;
          continue;
        }
        if (mol.getOccupiedValence_0(a) + mol.getImplicitHydrogens_1(a) != carcfmt2.degree(mol, a) + 1) {
          return carcfm.$clinit_RingBoolean(), carcfm.FALSE;
        }
      }
    }
    return carcfm.$clinit_RingBoolean(), carcfm.TRUE;
  };
  defineClass(760, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_forcefield_mmff_type_Atom_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.type", "Atom", 760, cggl.Ljava_lang_Object_2_classLit);
  carcfmt2.$clinit_Bond_0 = function $clinit_Bond_0() {
    carcfmt2.$clinit_Bond_0 = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt2.getType_1 = function getType_1(table, mol, bond) {
    carcfmt2.$clinit_Bond_0();
    return carcfmt2.getType_2(table, mol, mol.getBondAtom_0(0, bond), mol.getBondAtom_0(1, bond));
  };
  carcfmt2.getType_2 = function getType_2(table, mol, atom1, atom2) {
    carcfmt2.$clinit_Bond_0();
    var a1t, a2t, b, b$array, b$index, b$max, bond, notInAromaticRing, r, rings;
    a1t = mol.getAtomType(atom1);
    a2t = mol.getAtomType(atom2);
    bond = mol.getBond_0(atom1, atom2);
    notInAromaticRing = true;
    rings = mol.getRingSet_0();
    for (r = 0; r < rings.getSize_0() && notInAromaticRing; r++) {
      for (b$array = rings.getRingBonds_0(r), b$index = 0, b$max = b$array.length; b$index < b$max; ++b$index) {
        b = b$array[b$index];
        if (b == bond && mol.ringIsMMFFAromatic(r)) {
          notInAromaticRing = false;
          break;
        }
      }
    }
    return mol.getBondOrder_0(bond) == 1 && notInAromaticRing && (table.atom.arom(a1t) && table.atom.arom(a2t) || table.atom.sbmb(a1t) && table.atom.sbmb(a2t)) ? 1 : 0;
  };
  defineClass(799, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_forcefield_mmff_type_Bond_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.type", "Bond", 799, cggl.Ljava_lang_Object_2_classLit);
  carcfmt2.$clinit_Charge_0 = function $clinit_Charge_0() {
    carcfmt2.$clinit_Charge_0 = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt2.degree_0 = function degree_0(mol, atom) {
    return mol.getAllConnAtoms_0(atom) + mol.getImplicitHydrogens_1(atom);
  };
  carcfmt2.getCharges = function getCharges(table, mol) {
    carcfmt2.$clinit_Charge_0();
    var M, atom, bond, bondType, charges, fcharges, i, i0, i1, nbr, nbrType, q0, sumFormal, sumPartial, type_0, v;
    fcharges = carcfmt2.getFormalCharges(mol);
    charges = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, fcharges.length, 15, 1);
    for (atom = 0; atom < fcharges.length; atom++) {
      type_0 = mol.getAtomType(atom);
      q0 = fcharges[atom];
      v = table.chge.getFcadj(type_0);
      M = table.atom.crd(type_0);
      sumFormal = 0;
      sumPartial = 0;
      if ($wnd.Math.abs(v) < 1e-4)
        for (i0 = 0; i0 < mol.getAllConnAtoms_0(atom); i0++) {
          nbr = mol.getConnAtom_0(atom, i0);
          if (fcharges[nbr] < 0)
            q0 += fcharges[nbr] / (2 * mol.getAllConnAtoms_0(nbr));
        }
      if (type_0 == 62)
        for (i1 = 0; i1 < mol.getAllConnAtoms_0(atom); i1++) {
          nbr = mol.getConnAtom_0(atom, i1);
          if (fcharges[nbr] > 0)
            q0 -= fcharges[nbr] / 2;
        }
      for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
        nbr = mol.getConnAtom_0(atom, i);
        bond = mol.getBond_0(atom, nbr);
        nbrType = mol.getAtomType(nbr);
        bondType = carcfmt2.getType_1(table, mol, bond);
        sumPartial += table.chge.getPartial(bondType, type_0, nbrType);
        sumFormal += fcharges[nbr];
      }
      charges[atom] = (1 - M * v) * q0 + v * sumFormal + sumPartial;
    }
    return charges;
  };
  carcfmt2.getFormalCharges = function getFormalCharges(mol) {
    var a, a$array, a$index, a$max, atom, charges, conj, i, i0, i1, j, k, nConj, nNitrogensIn5Ring, nSecNtoNbr, nTermOStoNbr, nbr, nbr2, nbr2type, nbrType, old_nConj, r, ring, rings, type_0;
    charges = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 15, 1);
    overatoms: for (atom = 0; atom < charges.length; atom++) {
      type_0 = mol.getAtomType(atom);
      charges[atom] = 0;
      switch (type_0) {
        case 32:
        case 72:
          for (i0 = 0; i0 < mol.getAllConnAtoms_0(atom); i0++) {
            nbr = mol.getConnAtom_0(atom, i0);
            nbrType = mol.getAtomType(nbr);
            nSecNtoNbr = 0;
            nTermOStoNbr = 0;
            for (j = 0; j < mol.getAllConnAtoms_0(nbr); j++) {
              nbr2 = mol.getConnAtom_0(nbr, j);
              if (mol.getAtomicNo_0(nbr2) == 7 && carcfmt2.degree_0(mol, nbr2) == 2 && !mol.isAromaticAtom_0(nbr2))
                nSecNtoNbr++;
              if ((mol.getAtomicNo_0(nbr2) == 8 || mol.getAtomicNo_0(nbr2) == 16) && carcfmt2.degree_0(mol, nbr2) == 1)
                nTermOStoNbr++;
            }
            if (mol.getAtomicNo_0(nbr) == 16 && nTermOStoNbr == 2 && nSecNtoNbr == 1)
              nSecNtoNbr = 0;
            if (mol.getAtomicNo_0(nbr) == 6 && nTermOStoNbr > 0) {
              charges[atom] = nTermOStoNbr == 1 ? -1 : -(nTermOStoNbr - 1) / nTermOStoNbr;
              continue overatoms;
            }
            if (nbrType == 45 && nTermOStoNbr == 3) {
              charges[atom] = -1 / 3;
              continue overatoms;
            }
            if (nbrType == 25 && nTermOStoNbr > 0) {
              charges[atom] = nTermOStoNbr == 1 ? 0 : -(nTermOStoNbr - 1) / nTermOStoNbr;
              continue overatoms;
            }
            if (nbrType == 18 && nTermOStoNbr > 0) {
              charges[atom] = nSecNtoNbr + nTermOStoNbr == 2 ? 0 : -(nSecNtoNbr + nTermOStoNbr - 2) / nTermOStoNbr;
              continue overatoms;
            }
            if (nbrType == 73 && nTermOStoNbr > 0) {
              charges[atom] = nTermOStoNbr == 1 ? 0 : -(nTermOStoNbr - 1) / nTermOStoNbr;
              continue overatoms;
            }
            if (nbrType == 77 && nTermOStoNbr > 0) {
              charges[atom] = -1 / nTermOStoNbr;
              continue overatoms;
            }
          }
          break;
        case 76:
          ring = 0;
          rings = mol.getRingSet_0();
          for (r = 0; r < rings.getSize_0(); r++)
            if (rings.isAtomMember_0(r, atom)) {
              ring = r;
              break;
            }
          if (ring < rings.getSize_0()) {
            nNitrogensIn5Ring = 0;
            for (a$array = rings.getRingAtoms_0(ring), a$index = 0, a$max = a$array.length; a$index < a$max; ++a$index) {
              a = a$array[a$index];
              if (a > -1 && mol.getAtomType(a) == 76)
                nNitrogensIn5Ring++;
            }
            if (nNitrogensIn5Ring > 0) {
              charges[atom] = -1 / nNitrogensIn5Ring;
              continue overatoms;
            }
          }
          break;
        case 55:
        case 56:
        case 81:
          charges[atom] = mol.getAtomCharge_0(atom);
          nConj = 1;
          old_nConj = 0;
          conj = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 16, 1);
          conj[atom] = true;
          while (nConj > old_nConj) {
            old_nConj = nConj;
            for (i1 = 0; i1 < mol.getAllAtoms_0(); i1++) {
              if (!conj[i1])
                continue;
              for (j = 0; j < mol.getAllConnAtoms_0(i1); j++) {
                nbr = mol.getConnAtom_0(i1, j);
                nbrType = mol.getAtomType(nbr);
                if (nbrType != 57 && nbrType != 80)
                  continue;
                for (k = 0; k < mol.getAllConnAtoms_0(nbr); k++) {
                  nbr2 = mol.getConnAtom_0(nbr, k);
                  nbr2type = mol.getAtomType(nbr2);
                  if (nbr2type != 55 && nbr2type != 56 && nbr2type != 81)
                    continue;
                  if (conj[nbr2])
                    continue;
                  conj[nbr2] = true;
                  charges[atom] += mol.getAtomCharge_0(nbr2);
                  nConj++;
                }
              }
            }
          }
          charges[atom] /= nConj;
          continue overatoms;
        case 61:
          for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
            nbr = mol.getConnAtom_0(atom, i);
            if (mol.getAtomType(nbr) == 42) {
              charges[atom] = 1;
              continue overatoms;
            }
          }
          continue overatoms;
        case 34:
        case 49:
        case 51:
        case 54:
        case 58:
        case 92:
        case 93:
        case 94:
        case 97:
          charges[atom] = 1;
          continue overatoms;
        case 87:
        case 95:
        case 96:
        case 98:
        case 99:
          charges[atom] = 2;
          continue overatoms;
        case 88:
          charges[atom] = 3;
          continue overatoms;
        case 35:
        case 62:
        case 89:
        case 90:
        case 91:
          charges[atom] = -1;
          continue overatoms;
      }
      charges[atom] = 0;
    }
    return charges;
  };
  defineClass(761, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_forcefield_mmff_type_Charge_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.type", "Charge", 761, cggl.Ljava_lang_Object_2_classLit);
  carcfmt2.$clinit_Torsion_0 = function $clinit_Torsion_0() {
    carcfmt2.$clinit_Torsion_0 = emptyMethod;
    jl.$clinit_Object();
  };
  carcfmt2.getType_3 = function getType_3(table, mol, a1, a2, a3, a4) {
    carcfmt2.$clinit_Torsion_0();
    var bijt, bjkt, bklt, bond_jk, size_0, tort;
    bond_jk = mol.getBond_0(a2, a3);
    bijt = carcfmt2.getType_2(table, mol, a1, a2);
    bjkt = carcfmt2.getType_2(table, mol, a2, a3);
    bklt = carcfmt2.getType_2(table, mol, a3, a4);
    tort = bjkt;
    if (bjkt == 0 && mol.getBondOrder_0(bond_jk) == 1 && (bijt == 1 || bklt == 1))
      tort = 2;
    size_0 = carcfmt2.inRingOfSize_1(mol, a1, a2, a3, a4);
    if (size_0 == 4 && mol.getBond_0(a1, a3) == -1 && mol.getBond_0(a2, a4) == -1)
      return 40 + tort;
    if (size_0 == 5 && (mol.getAtomType(a1) == 1 || mol.getAtomType(a2) == 1 || mol.getAtomType(a3) == 1 || mol.getAtomType(a4) == 1))
      return 50 + tort;
    return tort;
  };
  carcfmt2.inRingOfSize_1 = function inRingOfSize_1(mol, a1, a2, a3, a4) {
    var a, a$array, a$index, a$max, r, ring, rings, tor;
    if (mol.getBond_0(a1, a2) == -1 || mol.getBond_0(a2, a3) == -1 || mol.getBond_0(a3, a4) == -1)
      return 0;
    if (mol.getBond_0(a4, a1) >= 0)
      return 4;
    rings = mol.getRingSet_0();
    tor = new ju.HashSet();
    tor.add(jl.valueOf_12(a1));
    tor.add(jl.valueOf_12(a2));
    tor.add(jl.valueOf_12(a3));
    tor.add(jl.valueOf_12(a4));
    for (r = 0; r < rings.getSize_0(); r++)
      if (rings.getRingSize_0(r) == 5) {
        ring = new ju.HashSet();
        for (a$array = rings.getRingAtoms_0(r), a$index = 0, a$max = a$array.length; a$index < a$max; ++a$index) {
          a = a$array[a$index];
          ring.add(jl.valueOf_12(a));
        }
        if (ring.containsAll(tor))
          return 5;
      }
    return 0;
  };
  defineClass(807, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_forcefield_mmff_type_Torsion_2_classLit = createForClass("com.actelion.research.chem.forcefield.mmff.type", "Torsion", 807, cggl.Ljava_lang_Object_2_classLit);
  carci.$clinit_CompoundFileParser = function $clinit_CompoundFileParser() {
    carci.$clinit_CompoundFileParser = emptyMethod;
    jl.$clinit_Object();
  };
  carci.CompoundFileParser = function CompoundFileParser() {
    carci.$clinit_CompoundFileParser();
    Object_0.call(this);
    this.$init_117();
  };
  defineClass(325, 1, { 1: 1 });
  _.$init_117 = function $init_117() {
  };
  _.close_0 = function close_0() {
    var ioe;
    if (isNotNull(this.mReader)) {
      try {
        this.mReader.close_0();
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 50)) {
          ioe = $e0;
        } else
          throw toJs($e0);
      }
    }
  };
  _.getCoordinates_0 = function getCoordinates_1() {
    this.updateIDCodeAndCoords();
    return this.mCoords;
  };
  _.getIDCode_0 = function getIDCode_3() {
    this.updateIDCodeAndCoords();
    return this.mIDCode;
  };
  _.getMolecule_0 = function getMolecule_3() {
    var coords, e, idcode;
    if (!this.mStructureUpToDate) {
      idcode = this.getIDCode_0();
      coords = this.getCoordinates_0();
      this.mMol_0 = null;
      try {
        this.mMol_0 = new carc2.IDCodeParser(jsEquals(coords, null)).getCompactMolecule_0(idcode, coords);
        if (isNotNull(this.mMol_0))
          this.mMol_0.setName_0(this.getMoleculeName());
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
        } else
          throw toJs($e0);
      }
    }
    this.mStructureUpToDate = true;
    return this.mMol_0;
  };
  _.next_1 = function next_0() {
    this.mStructureUpToDate = false;
    this.mIDCodeUpToDate = false;
    return this.advanceToNext();
  };
  _.updateIDCodeAndCoords = function updateIDCodeAndCoords() {
    var canonizer, e, mol;
    if (!this.mIDCodeUpToDate) {
      try {
        mol = new carc2.StereoMolecule_1(this.getMolecule_0());
        mol.normalizeAmbiguousBonds_0();
        mol.canonizeCharge_0(true);
        canonizer = new carc2.Canonizer(mol);
        this.mIDCode = canonizer.getIDCode_0();
        this.mCoords = canonizer.getEncodedCoordinates_0();
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
          this.mIDCode = null;
          this.mCoords = null;
        } else
          throw toJs($e0);
      }
      this.mIDCodeUpToDate = true;
    }
  };
  _.mIDCodeUpToDate = false;
  _.mStructureUpToDate = false;
  cggl.Lcom_actelion_research_chem_io_CompoundFileParser_2_classLit = createForClass("com.actelion.research.chem.io", "CompoundFileParser", 325, cggl.Ljava_lang_Object_2_classLit);
  carci.$clinit_RXNFileCreator = function $clinit_RXNFileCreator() {
    carci.$clinit_RXNFileCreator = emptyMethod;
    jl.$clinit_Object();
    carci.NL = jl.lineSeparator();
  };
  carci.RXNFileCreator = function RXNFileCreator(r, programName) {
    carci.$clinit_RXNFileCreator();
    var e, i, rxn, scale, theWriter;
    Object_0.call(this);
    this.$init_118();
    rxn = new carcr.Reaction_0(r);
    try {
      theWriter = new ji.StringWriter();
      theWriter.write_3("$RXN" + carci.NL);
      theWriter.write_3(jsNotEquals(programName, null) ? programName : "");
      theWriter.write_3(carci.NL + ("" + carci.NL));
      theWriter.write_3("OCL_RXN_V1.0:" + carcr.encode(r, true, 1 | 2 | 8 | 16));
      theWriter.write_3(carci.NL);
      theWriter.write_3("  " + rxn.getReactants_0() + "  " + rxn.getProducts_0() + carci.NL);
      scale = this.getScalingFactor(rxn);
      for (i = 0; i < rxn.getMolecules_0(); i++) {
        theWriter.write_3("$MOL" + carci.NL);
        new carc2.MolfileCreator_1(rxn.getMolecule_1(i), true, scale, null).writeMolfile(theWriter);
      }
      this.rxnbuffer = theWriter.getBuffer();
      theWriter.close_0();
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 12)) {
        e = $e0;
        (jl.$clinit_System(), jl.err).println_0("Error in RXNFileCreator: " + e);
      } else
        throw toJs($e0);
    }
  };
  defineClass(322, 1, { 1: 1 }, carci.RXNFileCreator);
  _.$init_118 = function $init_118() {
    this.rxnbuffer = null;
  };
  _.getRXNfile = function getRXNfile() {
    return isNotNull(this.rxnbuffer) ? this.rxnbuffer.toString_0() : null;
  };
  _.getScalingFactor = function getScalingFactor(rxn) {
    var avbl, bondCount, m;
    avbl = 0;
    bondCount = 0;
    for (m = 0; m < rxn.getMolecules_0(); m++) {
      avbl += rxn.getMolecule_1(m).getAverageBondLength_0() * rxn.getMolecule_1(m).getAllBonds_0();
      bondCount += rxn.getMolecule_1(m).getAllBonds_0();
    }
    if (bondCount != 0)
      return bondCount / avbl;
    return 1;
  };
  carci.RXN_CODE_TAG = "OCL_RXN_V1.0:";
  cggl.Lcom_actelion_research_chem_io_RXNFileCreator_2_classLit = createForClass("com.actelion.research.chem.io", "RXNFileCreator", 322, cggl.Ljava_lang_Object_2_classLit);
  carci.$clinit_RXNFileParser = function $clinit_RXNFileParser() {
    carci.$clinit_RXNFileParser = emptyMethod;
    jl.$clinit_Object();
  };
  carci.RXNFileParser = function RXNFileParser() {
    carci.$clinit_RXNFileParser();
    Object_0.call(this);
    this.$init_119();
  };
  defineClass(321, 1, { 1: 1 }, carci.RXNFileParser);
  _.$init_119 = function $init_119() {
  };
  _.getReaction_1 = function getReaction_0(buffer) {
    return this.getReaction_2(buffer, false);
  };
  _.getReaction_2 = function getReaction_1(buffer, ignoreIdCode) {
    var theReaction, theReader;
    theReaction = new carcr.Reaction();
    theReader = new ji.BufferedReader(new ji.StringReader(buffer));
    this.parse_10(theReaction, theReader, ignoreIdCode);
    return theReaction;
  };
  _.parse_10 = function parse_11(theReaction, theReader, ignoreIdCode) {
    var ok, theLine;
    theLine = theReader.readLine();
    ok = false;
    if (jsEquals(theLine, null) || !jl.startsWith_Ljava_lang_String__Z__devirtual$(theLine, "$RXN")) {
      throw toJs(new jl.Exception_1("'$RXN' tag not found"));
    }
    if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(theLine, "$RXN V3000")) {
      ok = this.parseV3(theReaction, theReader, ignoreIdCode);
    } else {
      ok = this.parseV2(theReaction, theReader, ignoreIdCode);
    }
    return ok;
  };
  _.parseV2 = function parseV2(theReaction, theReader, ignoreIdCode) {
    var comment, encoding, i, i0, molParser, molfile, name_0, product, productCount, reactant, reactantCount, theLine;
    name_0 = jl.trim__Ljava_lang_String___devirtual$(theReader.readLine());
    if (jl.length__I__devirtual$_0(name_0) != 0)
      theReaction.setName_0(name_0);
    theReader.readLine();
    comment = theReader.readLine();
    if (!ignoreIdCode && jl.startsWith_Ljava_lang_String__Z__devirtual$(comment, "OCL_RXN_V1.0:")) {
      encoding = jl.substring_I_Ljava_lang_String___devirtual$(comment, jl.length__I__devirtual$_0("OCL_RXN_V1.0:"));
      if (isNotNull(carcr.decode_3(encoding, true, theReaction)))
        return true;
    }
    theLine = theReader.readLine();
    reactantCount = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(theLine, 0, 3)));
    productCount = jl.parseInt_2(jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(theLine, 3, 6)));
    molParser = new carc2.MolfileParser();
    for (i0 = 0; i0 < reactantCount; i0++) {
      theLine = theReader.readLine();
      if (jsEquals(theLine, null) || !jl.startsWith_Ljava_lang_String__Z__devirtual$(theLine, "$MOL")) {
        throw toJs(new jl.Exception_1("'$MOL' tag not found"));
      }
      reactant = new carc2.StereoMolecule();
      molfile = new jl.StringBuffer_0(32768);
      do {
        theLine = theReader.readLine();
        molfile.append_2(theLine);
        molfile.append_2("\n");
      } while (jsNotEquals(theLine, null) && !jl.startsWith_Ljava_lang_String__Z__devirtual$(theLine, "M  END"));
      if (jsEquals(theLine, null)) {
        throw toJs(new jl.Exception_1("'M  END' not found"));
      }
      molParser.parse_5(reactant, molfile);
      theReaction.addReactant_0(reactant);
    }
    for (i = 0; i < productCount; i++) {
      theLine = theReader.readLine();
      if (jsEquals(theLine, null) || !jl.startsWith_Ljava_lang_String__Z__devirtual$(theLine, "$MOL")) {
        throw toJs(new jl.Exception_1("'$MOL' tag not found"));
      }
      product = new carc2.StereoMolecule();
      molfile = new jl.StringBuffer_0(32768);
      do {
        theLine = theReader.readLine();
        molfile.append_2(theLine);
        molfile.append_2("\n");
      } while (jsNotEquals(theLine, null) && !jl.startsWith_Ljava_lang_String__Z__devirtual$(theLine, "M  END"));
      if (jsEquals(theLine, null)) {
        throw toJs(new jl.Exception_1("'M  END' not found"));
      }
      molParser.parse_5(product, molfile);
      theReaction.addProduct_0(product);
    }
    return true;
  };
  _.parseV3 = function parseV3(theReaction, theReader, ignoreIdCode) {
    var comment, encoding, i, molParser, molecule, molfile, name_0, p, productCount, reactantCount, t, theLine;
    name_0 = jl.trim__Ljava_lang_String___devirtual$(theReader.readLine());
    if (jl.length__I__devirtual$_0(name_0) != 0)
      theReaction.setName_0(name_0);
    theReader.readLine();
    comment = theReader.readLine();
    if (!ignoreIdCode && jl.startsWith_Ljava_lang_String__Z__devirtual$(comment, "OCL_RXN_V1.0:")) {
      encoding = jl.substring_I_Ljava_lang_String___devirtual$(comment, jl.length__I__devirtual$_0("OCL_RXN_V1.0:"));
      if (isNotNull(carcr.decode_3(encoding, true, theReaction)))
        return true;
    }
    theLine = theReader.readLine();
    molParser = new carc2.MolfileParser();
    if (jsNotEquals(theLine, null) && jl.startsWith_Ljava_lang_String__Z__devirtual$(theLine, "M  V30 COUNTS")) {
      t = jl.trim__Ljava_lang_String___devirtual$(jl.substring_I_Ljava_lang_String___devirtual$(theLine, 13));
      p = jl.split_Ljava_lang_String___Ljava_lang_String___devirtual$(t, " ");
      reactantCount = jl.parseInt_2(p[0]);
      productCount = jl.parseInt_2(p[1]);
      if (reactantCount > 0) {
        theLine = theReader.readLine();
        if (jl.equals_Ljava_lang_Object__Z__devirtual$_2("M  V30 BEGIN REACTANT", theLine)) {
          for (i = 0; i < reactantCount; i++) {
            molecule = new carc2.StereoMolecule();
            molfile = new jl.StringBuffer_0(32768);
            molfile.append_2("\nActelion Java MolfileCreator 2.0\n\n  0  0  0  0  0  0              0 V3000\n");
            do {
              theLine = theReader.readLine();
              molfile.append_2(theLine);
              molfile.append_2("\n");
            } while (jsNotEquals(theLine, null) && !jl.startsWith_Ljava_lang_String__Z__devirtual$(theLine, "M  V30 END CTAB"));
            molParser.parse_5(molecule, molfile);
            theReaction.addReactant_0(molecule);
          }
        }
        theLine = theReader.readLine();
      }
      if (productCount > 0) {
        theLine = theReader.readLine();
        if (jl.equals_Ljava_lang_Object__Z__devirtual$_2("M  V30 BEGIN PRODUCT", theLine)) {
          for (i = 0; i < productCount; i++) {
            molecule = new carc2.StereoMolecule();
            molfile = new jl.StringBuffer_0(32768);
            molfile.append_2("\nActelion Java MolfileCreator 2.0\n\n  0  0  0  0  0  0              0 V3000\n");
            do {
              theLine = theReader.readLine();
              molfile.append_2(theLine);
              molfile.append_2("\n");
            } while (jsNotEquals(theLine, null) && !jl.startsWith_Ljava_lang_String__Z__devirtual$(theLine, "M  V30 END CTAB"));
            molParser.parse_5(molecule, molfile);
            theReaction.addProduct_0(molecule);
          }
          theLine = theReader.readLine();
        }
      }
      return true;
    }
    return false;
  };
  carci.AUX_MOLFILE_HEADER = "\nActelion Java MolfileCreator 2.0\n\n  0  0  0  0  0  0              0 V3000\n";
  carci.DEFAULT_CAPACITY = 32768;
  carci.END_CTAB = "M  V30 END CTAB";
  carci.END_MOL_TAG = "M  END";
  carci.MOL_MAGIC = "$MOL";
  carci.RXN_MAGIC = "$RXN";
  carci.RXN_V3_COUNTS_LINE = "M  V30 COUNTS";
  carci.RXN_V3_MAGIC = "$RXN V3000";
  carci.V30_BEGIN_PRODUCT = "M  V30 BEGIN PRODUCT";
  carci.V30_BEGIN_REACTANT = "M  V30 BEGIN REACTANT";
  cggl.Lcom_actelion_research_chem_io_RXNFileParser_2_classLit = createForClass("com.actelion.research.chem.io", "RXNFileParser", 321, cggl.Ljava_lang_Object_2_classLit);
  carci.$clinit_RXNFileV3Creator = function $clinit_RXNFileV3Creator() {
    carci.$clinit_RXNFileV3Creator = emptyMethod;
    jl.$clinit_Object();
    carci.NL_0 = jl.lineSeparator();
  };
  carci.RXNFileV3Creator = function RXNFileV3Creator(r, programName) {
    carci.$clinit_RXNFileV3Creator();
    var e, i, pcnt, rcnt, rxn, scalingFactor, theWriter;
    Object_0.call(this);
    this.$init_120();
    rxn = new carcr.Reaction_0(r);
    try {
      theWriter = new ji.StringWriter();
      theWriter.write_3("$RXN V3000" + carci.NL_0);
      theWriter.write_3(jsNotEquals(programName, null) ? programName : "");
      theWriter.write_3(carci.NL_0 + ("" + carci.NL_0));
      theWriter.write_3("OCL_RXN_V1.0:" + carcr.encode(r, true, 1 | 2 | 8));
      theWriter.write_3(carci.NL_0);
      rcnt = rxn.getReactants_0();
      pcnt = rxn.getProducts_0();
      theWriter.write_3("M  V30 COUNTS " + rcnt + " " + pcnt + carci.NL_0);
      scalingFactor = this.getScalingFactor_0(rxn);
      if (rcnt > 0) {
        theWriter.write_3("M  V30 BEGIN REACTANT" + carci.NL_0);
        for (i = 0; i < rxn.getReactants_0(); i++) {
          theWriter.write_3(carc2.writeCTAB(rxn.getReactant_0(i), scalingFactor));
        }
        theWriter.write_3("M  V30 END REACTANT" + carci.NL_0);
      }
      if (pcnt > 0) {
        theWriter.write_3("M  V30 BEGIN PRODUCT" + carci.NL_0);
        for (i = 0; i < rxn.getProducts_0(); i++) {
          theWriter.write_3(carc2.writeCTAB(rxn.getProduct_0(i), scalingFactor));
        }
        theWriter.write_3("M  V30 END PRODUCT" + carci.NL_0);
      }
      theWriter.write_3("M  END" + carci.NL_0);
      this.rxnbuffer = theWriter.getBuffer();
      theWriter.close_0();
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 12)) {
        e = $e0;
        (jl.$clinit_System(), jl.err).println_0("Error in RXNFileCreator: " + e);
      } else
        throw toJs($e0);
    }
  };
  defineClass(323, 1, { 1: 1 }, carci.RXNFileV3Creator);
  _.$init_120 = function $init_120() {
    this.rxnbuffer = null;
  };
  _.getRXNfile = function getRXNfile_0() {
    return isNotNull(this.rxnbuffer) ? this.rxnbuffer.toString_0() : null;
  };
  _.getScalingFactor_0 = function getScalingFactor_0(rxn) {
    var avbl, bondCount, m;
    avbl = 0;
    bondCount = 0;
    for (m = 0; m < rxn.getMolecules_0(); m++) {
      avbl += rxn.getMolecule_1(m).getAverageBondLength_0() * rxn.getMolecule_1(m).getAllBonds_0();
      bondCount += rxn.getMolecule_1(m).getAllBonds_0();
    }
    if (bondCount != 0)
      return bondCount / avbl;
    return 1;
  };
  carci.RXN_CODE_TAG_0 = "OCL_RXN_V1.0:";
  cggl.Lcom_actelion_research_chem_io_RXNFileV3Creator_2_classLit = createForClass("com.actelion.research.chem.io", "RXNFileV3Creator", 323, cggl.Ljava_lang_Object_2_classLit);
  carci.$clinit_SDFileParser = function $clinit_SDFileParser() {
    carci.$clinit_SDFileParser = emptyMethod;
    carci.$clinit_CompoundFileParser();
    carci.cIDFieldNames = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Idorsia No", "Actelion No", "ID", "IDNUMBER", "COMPOUND_ID", "NAME", "COMPND"]);
  };
  carci.SDFileParser = function SDFileParser2(reader, fieldName) {
    carci.$clinit_SDFileParser();
    carci.CompoundFileParser.call(this);
    this.$init_121();
    this.mNoOfRecords = -1;
    this.mFieldName = fieldName;
    this.mReader = instanceOf(reader, 62) ? castTo(reader, 62) : new ji.BufferedReader(reader);
    this.init_4();
  };
  defineClass(324, 325, { 1: 1 }, carci.SDFileParser);
  _.$init_121 = function $init_121() {
  };
  _.advanceToNext = function advanceToNext() {
    var e, field, fieldIndex, fieldName, idName, idName$array, idName$index, idName$max, line, molfileComplete;
    if (isNull(this.mReader))
      return false;
    this.mMolfileBuffer.setLength(0);
    this.mDataBuffer.setLength(0);
    this.mMol = null;
    molfileComplete = false;
    fieldIndex = -1;
    fieldName = null;
    this.mFieldData = jsEquals(this.mFieldName, null) ? null : initUnidimensionalArray(cggl.Ljava_lang_String_2_classLit, { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, this.mFieldName.length, 6, 1);
    this.mIDFieldIndex = -1;
    do {
      try {
        line = this.mReader.readLine();
        if (jsEquals(line, null)) {
          this.mMolfileBuffer.setLength(0);
          this.mReader.close_0();
          return false;
        }
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 50)) {
          e = $e0;
          this.mMolfileBuffer.setLength(0);
          return false;
        } else
          throw toJs($e0);
      }
      if (!molfileComplete) {
        if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, ">")) {
          molfileComplete = true;
          this.mMolfileBuffer.append_9("M  END");
          this.mMolfileBuffer.append_4(10);
          this.mDataBuffer.append_9(line);
          this.mDataBuffer.append_4(10);
        } else {
          this.mMolfileBuffer.append_9(line);
          this.mMolfileBuffer.append_4(10);
          if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "M  END"))
            molfileComplete = true;
          continue;
        }
      } else {
        this.mDataBuffer.append_9(line);
        this.mDataBuffer.append_4(10);
      }
      if (jsNotEquals(this.mFieldName, null)) {
        if (jl.length__I__devirtual$_0(line) == 0) {
          fieldIndex = -1;
        } else if (fieldIndex == -1) {
          fieldName = this.extractFieldName(line);
          if (jsNotEquals(fieldName, null)) {
            fieldIndex = -1;
            for (field = 0; field < this.mFieldName.length; field++) {
              if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(fieldName, this.mFieldName[field])) {
                fieldIndex = field;
                break;
              }
            }
            if (this.mIDFieldIndex == -1) {
              for (idName$array = carci.cIDFieldNames, idName$index = 0, idName$max = idName$array.length; idName$index < idName$max; ++idName$index) {
                idName = idName$array[idName$index];
                if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(fieldName, idName)) {
                  this.mIDFieldIndex = fieldIndex;
                  break;
                }
              }
            }
          }
        } else {
          if (jsEquals(this.mFieldData[fieldIndex], null)) {
            this.mFieldData[fieldIndex] = line;
          } else {
            this.mFieldData[fieldIndex] = jl.concat_Ljava_lang_String__Ljava_lang_String___devirtual$(jl.concat_Ljava_lang_String__Ljava_lang_String___devirtual$(this.mFieldData[fieldIndex], "\n"), line);
          }
        }
      }
    } while (!jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "$$$$"));
    return true;
  };
  _.extractAllFieldNames = function extractAllFieldNames(recordsToInspect) {
    var e, fieldName, fieldNameList, line, records;
    records = 0;
    fieldNameList = new carc2.UniqueStringList();
    while (records < recordsToInspect) {
      try {
        line = this.mReader.readLine();
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 50)) {
          e = $e0;
          if (records < recordsToInspect)
            this.mNoOfRecords = records;
          break;
        } else
          throw toJs($e0);
      }
      if (jsEquals(line, null)) {
        if (records < recordsToInspect)
          this.mNoOfRecords = records;
        break;
      }
      if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, "$$$$"))
        records++;
      if (jl.startsWith_Ljava_lang_String__Z__devirtual$(line, ">")) {
        fieldName = this.extractFieldName(line);
        if (jsNotEquals(fieldName, null))
          fieldNameList.addString(fieldName);
      }
    }
    try {
      this.mReader.close_0();
    } catch ($e1) {
      $e1 = toJava($e1);
      if (instanceOf($e1, 50)) {
        e = $e1;
      } else
        throw toJs($e1);
    }
    this.mFieldName = fieldNameList.toArray_1();
  };
  _.extractFieldName = function extractFieldName(line) {
    var closeBracket, i, index_0, openBracket;
    if (jl.length__I__devirtual$_0(line) == 0 || jl.charAt_I_C__devirtual$_0(line, 0) != 62)
      return null;
    index_0 = 1;
    openBracket = 0;
    closeBracket = 0;
    while (index_0 < jl.length__I__devirtual$_0(line)) {
      if (jl.charAt_I_C__devirtual$_0(line, index_0) == 60) {
        if (openBracket != 0)
          return null;
        openBracket = index_0;
      } else if (jl.charAt_I_C__devirtual$_0(line, index_0) == 62) {
        if (closeBracket != 0)
          return null;
        closeBracket = index_0;
      }
      index_0++;
    }
    if (openBracket != 0 && openBracket < closeBracket)
      return jl.substring_II_Ljava_lang_String___devirtual$(line, openBracket + 1, closeBracket);
    index_0 = jl.indexOf_Ljava_lang_String_I_I__devirtual$(line, "DT", 1);
    if (index_0 == -1)
      return null;
    i = index_0 + 2;
    while (jl.length__I__devirtual$_0(line) > i && isDigit(jl.charAt_I_C__devirtual$_0(line, i)))
      i++;
    return i == index_0 + 2 ? null : jl.substring_II_Ljava_lang_String___devirtual$(line, index_0, i);
  };
  _.getFieldData_0 = function getFieldData(index_0) {
    if (jsEquals(this.mFieldData, null))
      return null;
    return this.mFieldData[index_0];
  };
  _.getFieldNames_0 = function getFieldNames() {
    if (jsEquals(this.mFieldName, null))
      this.extractAllFieldNames(10240);
    return this.mFieldName;
  };
  _.getFieldNames_1 = function getFieldNames_0(recordsToInspect) {
    if (jsEquals(this.mFieldName, null))
      this.extractAllFieldNames(recordsToInspect);
    return this.mFieldName;
  };
  _.getMolecule_0 = function getMolecule_4() {
    var molfileParser;
    if (isNotNull(this.mMol))
      return this.mMol;
    molfileParser = new carc2.MolfileParser();
    if (this.mAssumeChiralTrue)
      molfileParser.setAssumeChiralTrue(true);
    this.mMol = molfileParser.getCompactMolecule(this.getNextMolFile_0());
    if (isNotNull(this.mMol) && (jsEquals(this.mMol.getName_0(), null) || jl.length__I__devirtual$_0(this.mMol.getName_0()) == 0))
      this.mMol.setName_0(this.getMoleculeName());
    return this.mMol;
  };
  _.getMoleculeName = function getMoleculeName() {
    return this.mIDFieldIndex != -1 && jsNotEquals(this.mFieldData, null) ? this.mFieldData[this.mIDFieldIndex] : isNotNull(this.mMol) ? this.mMol.getName_0() : null;
  };
  _.getNextFieldData_0 = function getNextFieldData() {
    var fieldData;
    fieldData = this.mDataBuffer.toString_0();
    return fieldData;
  };
  _.getNextMolFile_0 = function getNextMolFile() {
    var molfile;
    molfile = this.mMolfileBuffer.toString_0();
    return molfile;
  };
  _.init_4 = function init_4() {
    this.mMolfileBuffer = new jl.StringBuilder_0(10240);
    this.mDataBuffer = new jl.StringBuilder_0(10240);
  };
  _.setAssumeChiralTrue = function setAssumeChiralTrue_0(b) {
    this.mAssumeChiralTrue = b;
  };
  _.mAssumeChiralTrue = false;
  _.mIDFieldIndex = 0;
  _.mNoOfRecords = 0;
  carci.DEFAULT_RECORDS_TO_INSPECT = 10240;
  carci.cNewLineString = "\n";
  cggl.Lcom_actelion_research_chem_io_SDFileParser_2_classLit = createForClass("com.actelion.research.chem.io", "SDFileParser", 324, cggl.Lcom_actelion_research_chem_io_CompoundFileParser_2_classLit);
  carcn.$clinit_IStructureNameResolver = function $clinit_IStructureNameResolver() {
    carcn.$clinit_IStructureNameResolver = emptyMethod;
  };
  cggl.Lcom_actelion_research_chem_name_IStructureNameResolver_2_classLit = createForInterface("com.actelion.research.chem.name", "IStructureNameResolver");
  carcn.$clinit_StructureNameResolver = function $clinit_StructureNameResolver() {
    carcn.$clinit_StructureNameResolver = emptyMethod;
    jl.$clinit_Object();
  };
  carcn.getInstance_0 = function getInstance_0() {
    carcn.$clinit_StructureNameResolver();
    return carcn.sResolver;
  };
  defineClass(811, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_name_StructureNameResolver_2_classLit = createForClass("com.actelion.research.chem.name", "StructureNameResolver", 811, cggl.Ljava_lang_Object_2_classLit);
  carcp.$clinit_CLogPPredictor = function $clinit_CLogPPredictor() {
    carcp.$clinit_CLogPPredictor = emptyMethod;
    jl.$clinit_Object();
    carcp.ATOM_TYPE = stampJavaTypeInfo(getClassLiteralForArray(cggl.J_classLit, 1), { 4: 1, 1: 1, 49: 1 }, 5, 14, [524290, 524292, 589826, 589827, 589828, 589829, 589832, 589833, 589837, 589838, 598019, 598020, 598024, 606211, 688130, 688131, 688132, 688137, 688142, 696324, 819202, 819203, 819204, 819205, 819214, 827396, 1048580, 1114114, 1114115, 1114116, 1114120, 1212420, 1220611, 1343492, 1343496, 1638402, 1638403, 17367042, 17367043, 17367044, 17367045, 17367048, 17367049, 17367053, 17367054, 17375236, 17465346, 17465348, 17465353, 17473540, 1208483842, 1208483848, 1208483912, 1208549378, 1208549379, 1208549380, 1208549384, 1208549388, 1208549442, 1208549443, 1208549444, 1208549448, 1208557571, 1208565763, 1208565827, 1409875970, 1409875971, 1409875972, 1409875976, 1409876034, 1409876035, 1409876036, 1409876040, 1409884163, 1409974274, 1409974280, 1409974338, 1678245892, 1678311426, 1678311427, 1678311428, 1678311432, 1678311490, 1678311491, 1678311492, 1678311496, 1678409730, 1678409731, 1678409732, 1678409794, 1678540802, 1678540808, 1678540810, 1678540866, 2282291202, 2282291203, 2282291266, 2282291267, 2282389506, 2282389507, 2282389570, 2282389571, 2282389572, 2282520578, 2282520579, 2282520642, 2282520643, 2282537027, 2483617794, 2483617795, 2483617858, 2483617859, 2483617860, 2483617864, 2483716098, 2483716099, 2483716162, 2483716163, 2484150275, 2484248579, 2752675842, 3356033026, 3356139523, 3557359618, 3557457922, 3557588994, 34510798914, 34510798915, 34510798916, 34510798920, 34510807107, 34510815299, 34712125506, 34712125507, 34712125508, 34712125512, 34712223810, 34712223811, 34712223812, 34712223816, 34980560962, 34980560963, 34980659266, 34980659267, 34980659268, 35568287746, 35568287747, 35568287748, 35568287752, 35568287756, 35568287810, 35568287811, 35568287812, 35568287816, 35568287820, 35568386050, 35568386051, 35568386052, 35568386114, 35568386120, 35568517122, 35568517123, 35568517124, 35568517128, 35568517186, 35568517187, 35568517188, 35568517192, 35568812034, 35568812035, 35568812098, 35568812099, 35568910338, 35568910339, 35568910403, 35569336322, 35569434626, 35585064962, 35585064963, 35585064964, 35585064968, 35585065026, 35585065027, 35585065028, 35585065032, 35769614338, 35769614340, 35769614402, 35769712642, 35770138626, 35770236930, 35786391554, 35786391555, 2475109646403, 2475109711874, 2475109711875, 2475109711938, 2475109711939, 2475109720067, 2475109720131, 2475109728259, 2475109728323, 2887426572290, 2887426572291, 2887426572354, 2887426572355, 2887627898882, 2887627898883, 2887627898946, 2887627997186, 2887627997250, 3437182386178, 3437182386179, 3437182386242, 3437182386243, 3437383712770, 3437383712771, 3437383712834, 3437383811074, 3437652148226, 3437652377602, 4674132967426, 4674132967490, 4674132967491, 4674132975619, 4674334294018, 4674334294082, 4674334294083, 4674334302211, 4674334302275, 4674334392322, 4674334392386, 4674602729474, 4674602729538, 4674602827842, 4674602958850, 4674602958914, 5086449827842, 5086449827848, 5086449827906, 5086449827907, 5086449827912, 5086651154434, 5086651154498, 5086651162627, 5086651252738, 5086651252743, 5086651252802, 5086651252808, 5086651260931, 5086919589890, 5086919589954, 5086919688194, 5086919688258, 5086919819330, 5636205641794, 5636406968322, 5636406968386, 5636407066626, 5636407066690, 5636675403842, 5636675502082, 5636675502146, { l: 589890, m: 73760, h: 4 }, { l: 589891, m: 73760, h: 4 }, { l: 598083, m: 73760, h: 4 }, { l: 688194, m: 73760, h: 4 }, { l: 688195, m: 73760, h: 4 }, { l: 696387, m: 73760, h: 4 }, { l: 819266, m: 73760, h: 4 }, { l: 65602, m: 73764, h: 4 }, { l: 65603, m: 73764, h: 4 }, { l: 589890, m: 172064, h: 4 }, { l: 589891, m: 172064, h: 4 }, { l: 598083, m: 172064, h: 4 }, { l: 688194, m: 172064, h: 4 }, { l: 688195, m: 172064, h: 4 }, { l: 696387, m: 172064, h: 4 }, { l: 819266, m: 172064, h: 4 }, { l: 65602, m: 172068, h: 4 }, { l: 65603, m: 172068, h: 4 }, { l: 589890, m: 172112, h: 4 }, { l: 589891, m: 172112, h: 4 }, { l: 688194, m: 172112, h: 4 }, { l: 819266, m: 172112, h: 4 }, { l: 65602, m: 172116, h: 4 }, { l: 65608, m: 172116, h: 4 }, { l: 163906, m: 172116, h: 4 }, { l: 589890, m: 303136, h: 4 }, { l: 688194, m: 303136, h: 4 }, { l: 819266, m: 303136, h: 4 }, { l: 65602, m: 303140, h: 4 }, { l: 589890, m: 303184, h: 4 }, { l: 688194, m: 303184, h: 4 }, { l: 819266, m: 303184, h: 4 }, { l: 65602, m: 303188, h: 4 }, { l: 65602, m: 303252, h: 4 }, { l: 589826, m: 590112, h: 4 }, { l: 589827, m: 590112, h: 4 }, { l: 589890, m: 590112, h: 4 }, { l: 589891, m: 590112, h: 4 }, { l: 589826, m: 590160, h: 4 }, { l: 589827, m: 590160, h: 4 }, { l: 589890, m: 590160, h: 4 }, { l: 589891, m: 590160, h: 4 }, { l: 688130, m: 590160, h: 4 }, { l: 688194, m: 590160, h: 4 }, { l: 589826, m: 590224, h: 4 }, { l: 589827, m: 590224, h: 4 }, { l: 589890, m: 590224, h: 4 }, { l: 589891, m: 590224, h: 4 }, { l: 688131, m: 590224, h: 4 }, { l: 688194, m: 590224, h: 4 }, { l: 819203, m: 590224, h: 4 }, { l: 589826, m: 590368, h: 4 }, { l: 589890, m: 590368, h: 4 }, { l: 688130, m: 590368, h: 4 }, { l: 688194, m: 590368, h: 4 }, { l: 696323, m: 590368, h: 4 }, { l: 819202, m: 590368, h: 4 }, { l: 819208, m: 590368, h: 4 }, { l: 819266, m: 590368, h: 4 }, { l: 589826, m: 590416, h: 4 }, { l: 589832, m: 590416, h: 4 }, { l: 589890, m: 590416, h: 4 }, { l: 589891, m: 590416, h: 4 }, { l: 589896, m: 590416, h: 4 }, { l: 688130, m: 590416, h: 4 }, { l: 688136, m: 590416, h: 4 }, { l: 688194, m: 590416, h: 4 }, { l: 696323, m: 590416, h: 4 }, { l: 819202, m: 590416, h: 4 }, { l: 819266, m: 590416, h: 4 }, { l: 688130, m: 590480, h: 4 }, { l: 688194, m: 590480, h: 4 }, { l: 65602, m: 598052, h: 4 }, { l: 65603, m: 598052, h: 4 }, { l: 65602, m: 598100, h: 4 }, { l: 65603, m: 598100, h: 4 }, { l: 73795, m: 598100, h: 4 }, { l: 163906, m: 598100, h: 4 }, { l: 163907, m: 598100, h: 4 }, { l: 65602, m: 598164, h: 4 }, { l: 163906, m: 598164, h: 4 }, { l: 589826, m: 598304, h: 4 }, { l: 589827, m: 598304, h: 4 }, { l: 589890, m: 598304, h: 4 }, { l: 589891, m: 598304, h: 4 }, { l: 688130, m: 598304, h: 4 }, { l: 688194, m: 598304, h: 4 }, { l: 1114114, m: 598304, h: 4 }, { l: 1114178, m: 598304, h: 4 }, { l: 1212418, m: 598304, h: 4 }, { l: 1212424, m: 598304, h: 4 }, { l: 1212482, m: 598304, h: 4 }, { l: 589826, m: 598308, h: 4 }, { l: 589826, m: 688416, h: 4 }, { l: 589890, m: 688416, h: 4 }, { l: 589826, m: 688464, h: 4 }, { l: 589890, m: 688464, h: 4 }, { l: 589890, m: 688528, h: 4 }, { l: 589826, m: 688720, h: 4 }, { l: 688130, m: 688720, h: 4 }, { l: 688130, m: 688784, h: 4 }, { l: 65602, m: 696356, h: 4 }, { l: 65602, m: 696404, h: 4 }, { l: 163906, m: 696404, h: 4 }, { l: 589826, m: 696608, h: 4 }, { l: 1114178, m: 696608, h: 4 }, { l: 1212418, m: 696608, h: 4 }, { l: 589826, m: 696612, h: 4 }, { l: 524355, m: 590112, h: 288 }, { l: 589825, m: 590112, h: 288 }, { l: 589826, m: 590112, h: 288 }, { l: 589890, m: 590112, h: 288 }, { l: 598019, m: 590112, h: 288 }, { l: 598083, m: 590112, h: 288 }, { l: 589826, m: 590112, h: 336 }, { l: 589890, m: 590112, h: 336 }, { l: 598019, m: 590112, h: 336 }, { l: 598083, m: 590112, h: 336 }, { l: 589826, m: 688416, h: 336 }, { l: 589890, m: 688416, h: 336 }, { l: 589826, m: 688464, h: 336 }, { l: 589890, m: 688464, h: 336 }, { l: 688130, m: 688464, h: 336 }, { l: 589826, m: 590112, h: 400 }, { l: 589827, m: 590112, h: 400 }, { l: 589890, m: 590112, h: 400 }, { l: 589891, m: 590112, h: 400 }, { l: 589826, m: 688416, h: 400 }, { l: 589826, m: 688464, h: 400 }, { l: 688130, m: 688464, h: 400 }, { l: 589826, m: 819488, h: 400 }, { l: 589890, m: 819488, h: 400 }, { l: 589826, m: 819536, h: 400 }, { l: 589826, m: 819600, h: 400 }, { l: 688130, m: 819600, h: 400 }, { l: 819202, m: 819600, h: 400 }, { l: 589827, m: 819488, h: 544 }, { l: 589831, m: 688416, h: 592 }, { l: 589831, m: 688464, h: 592 }, { l: 688135, m: 688464, h: 592 }, { l: 688199, m: 688464, h: 592 }, { l: 589831, m: 819536, h: 592 }, { l: 688135, m: 819536, h: 592 }, { l: 688135, m: 819600, h: 592 }, { l: 688202, m: 819600, h: 592 }, { l: 589832, m: 1212704, h: 592 }, { l: 589896, m: 1212704, h: 592 }, { l: 589832, m: 1212752, h: 592 }, { l: 688136, m: 1212752, h: 592 }, { l: 688200, m: 1212752, h: 592 }, { l: 589831, m: 688464, h: 656 }, { l: 688135, m: 688464, h: 656 }, { l: 688135, m: 819536, h: 656 }, { l: 589891, m: 65936, h: 8228 }, { l: 589826, m: 590112, h: 8480 }, { l: 589890, m: 590112, h: 8480 }, { l: 598019, m: 590112, h: 8480 }, { l: 589826, m: 688416, h: 8480 }, { l: 589890, m: 688416, h: 8480 }, { l: 589826, m: 688464, h: 8480 }, { l: 589890, m: 688464, h: 8480 }, { l: 688130, m: 688464, h: 8480 }, { l: 819202, m: 819600, h: 8480 }, { l: 688135, m: 1212752, h: 8480 }, { l: 589832, m: 1213008, h: 8480 }, { l: 589896, m: 1213008, h: 8480 }, { l: 688136, m: 1213008, h: 8480 }, { l: 688200, m: 1213008, h: 8480 }, { l: 688135, m: 1343824, h: 8480 }, { l: 589826, m: 590112, h: 8484 }, { l: 589890, m: 590112, h: 8484 }, { l: 589826, m: 590160, h: 8484 }, { l: 589890, m: 590160, h: 8484 }, { l: 1212424, m: 590416, h: 8484 }, { l: 1212488, m: 590416, h: 8484 }, { l: 688130, m: 598304, h: 8484 }, { l: 688194, m: 598304, h: 8484 }, { l: 589826, m: 590112, h: 8528 }, { l: 589890, m: 590112, h: 8528 }]);
    carcp.INCREMENT = stampJavaTypeInfo(getClassLiteralForArray(cggl.F_classLit, 1), { 44: 1, 4: 1, 1: 1 }, 5, 15, [0.6966999769210815, 0, 0.4885999858379364, -0.47269999980926514, -0.07490000128746033, 0.6262000203132629, 0.273499995470047, 0.5699999928474426, 0.7009999752044678, 0.9534000158309937, -3.6435000896453857, -2.150899887084961, 0.4975000023841858, -2.19950008392334, -0.2809000015258789, -0.8259999752044678, -0.1784999966621399, -1.620300054550171, -1.0959999561309814, -0.3619999885559082, 0.13950000703334808, -0.29750001430511475, -1.2907999753952026, 1.0161999464035034, -1.3825000524520874, -2.5383999347686768, 0.33169999718666077, 0.4291999936103821, -0.5824000239372253, -0.1834000051021576, 0.1306000053882599, -0.5015000104904175, 0.6262000203132629, -0.5257999897003174, 0.4244000017642975, -0.16099999845027924, -0.2777999937534332, 0.5110999941825867, -0.435699999332428, -0.10409999638795853, 0.3424000144004822, -0.061500001698732376, 0.6035000085830688, 0.7226999998092651, 0.43459999561309814, -1.6821000576019287, -0.3310000002384186, -0.49799999594688416, -1.4915000200271606, -0.3650999963283539, 0.45969998836517334, 0.3384000062942505, 0.6632999777793884, 0.4544000029563904, 0.15970000624656677, 0.633899986743927, 0.35040000081062317, 0.04490000009536743, 0.34200000762939453, 0.26109999418258667, 0.40459999442100525, 0.5218999981880188, -1.065000057220459, -1.2314000129699707, -1.802299976348877, -0.36320000886917114, -0.4108000099658966, 0.30570000410079956, -0.14560000598430634, -0.27129998803138733, -0.5192999839782715, 0.45260000228881836, 0.5539000034332275, 0.8374000191688538, -0.7070000171661377, -0.48809999227523804, -0.4099999964237213, 0, 0.14790000021457672, 0.3447999954223633, 0.42980000376701355, 0.5579000115394592, -0.1264999955892563, -0.042500000447034836, 0.07670000195503235, 0.6635000109672546, -0.38119998574256897, -0.8367999792098999, 1.0286999940872192, -0.10209999978542328, 0.3587000072002411, -0.5945000052452087, 0.16920000314712524, -0.121799997985363, 0.32829999923706055, 0.22390000522136688, 0.20430000126361847, 0.05900000035762787, -0.48350000381469727, 0.6165000200271606, -0.4011000096797943, 0.5577999949455261, -0.21639999747276306, -0.017500000074505806, 0.29809999465942383, 0.10999999940395355, 0.27149999141693115, -0.2994999885559082, -0.46700000762939453, 0.1565999984741211, 0.046799998730421066, -0.13210000097751617, 1.3686000108718872, 0, -0.4115999937057495, 1.0185999870300293, -0.3935000002384186, 0.5223000049591064, 0.3684999942779541, 0.25769999623298645, 1.5192999839782715, 0.2705000042915344, 0.3790999948978424, 0.012000000104308128, -0.33970001339912415, 0.14830000698566437, 0.2766000032424927, 0.35929998755455017, 0.7714999914169312, 0.3149999976158142, -1.618499994277954, 0.18889999389648438, -0.2651999890804291, -0.09650000184774399, 0.420199990272522, 0.18709999322891235, -0.3684000074863434, -0.07779999822378159, 0.8942999839782715, 0.3693999946117401, 0.28790000081062317, 0.4489000141620636, -0.26010000705718994, 0.4771000146865845, 0.1923000067472458, 0.43810001015663147, 0.16949999332427979, 0.45249998569488525, 0.3352000117301941, 0.1582999974489212, 0.4036000072956085, -0.04800000041723251, 0.5023000240325928, -0.26489999890327454, 0.76910001039505, -0.35519999265670776, 1.0300999879837036, -0.11410000175237656, -0.5932000279426575, 0.17489999532699585, 0.13130000233650208, -0.18039999902248383, 0.399399995803833, 0.22910000383853912, 0.31690001487731934, 0.35989999771118164, -0.0038999998942017555, -0.2955999970436096, 0.4408999979496002, -0.16089999675750732, 0.3774999976158142, -0.13459999859333038, 0.2838999927043915, 0.5128999948501587, 0.1265999972820282, 0.4293999969959259, 0.28060001134872437, 0.49070000648498535, 0.3540000021457672, 0.219200000166893, 0.15649999678134918, 0.6934999823570251, 0.3617999851703644, 0.6735000014305115, 0.5777999758720398, -0.5636000037193298, 0.5569000244140625, 0.30379998683929443, -0.32760000228881836, -0.6991999745368958, 0.010300000198185444, -0.4659000039100647, 0.38179999589920044, 0.33169999718666077, 0.18410000205039978, 0.707099974155426, 0.12269999831914902, 0.7949000000953674, -0.6592000126838684, -1.3148000240325928, -0.4066999852657318, -0.1316000074148178, -0.4925000071525574, -0.09290000051259995, -0.4352000057697296, -0.2206999957561493, -0.9959999918937683, -0.723800003528595, -0.5468999743461609, -1.2939000129699707, -0.01360000018030405, 0.065700002014637, 0.7189000248908997, 0.05700000002980232, 0.661899983882904, -0.6381000280380249, -0.8072999715805054, 0.23549999296665192, 0.30480000376701355, -0.019899999722838402, -0.07519999891519547, 0.44609999656677246, 0.1559000015258789, 1.1167999505996704, -1.8039000034332275, 0.23649999499320984, -0.22059999406337738, 0.4480000138282776, -1.1339999437332153, -0.5652999877929688, -0.40529999136924744, -0.13609999418258667, 0.2198999971151352, 0.053599998354911804, -0.020999999716877937, 0.6984999775886536, 0.9642999768257141, -0.41519999504089355, -1.0369000434875488, -0.18299999833106995, 0.5882999897003174, -0.29179999232292175, -0.5293999910354614, -0.6541000008583069, 0.9473000168800354, -0.19059999287128448, -0.8483999967575073, -0.3456999957561493, 0.9541000127792358, 1.4230999946594238, -0.7924000024795532, -0.6019999980926514, 0.07999999821186066, -0.2596000134944916, 0.8381999731063843, -0.4415999948978424, -0.37040001153945923, -0.7487000226974487, -0.10790000110864639, -0.29919999837875366, -0.3276999890804291, 0.025100000202655792, -0.9187999963760376, 0.10939999669790268, 0.8230999708175659, -3.233299970626831, 0.03500000014901161, 0.38179999589920044, -0.7379999756813049, 0.2791000008583069, 0.3206000030040741, 0.5662000179290771, -0.3783999979496002, 0.4032000005245209, -1.794800043106079, -0.15539999306201935, 0.3785000145435333, 0.05339999869465828, -0.16529999673366547, -0.09870000183582306, -0.10050000250339508, -0.6460999846458435, 0.8034999966621399, -0.24050000309944153, -0.12380000203847885, -0.35760000348091125, 0.09610000252723694, -0.6401000022888184, 0.2029000073671341, 0.23589999973773956, 0.4950999915599823, 0.19210000336170197, -0.37450000643730164, 0.34630000591278076, 0.289900004863739, -0.15330000221729279, -0.4169999957084656, 0.37700000405311584, 0.6998000144958496, 0.593999981880188, 0.5911999940872192, -0.5570999979972839, 0.023800000548362732, -0.2475000023841858, 0.030700000002980232, -0.38749998807907104, -0.7437000274658203, 0.5144000053405762, 0.00570000009611249, 0.765500009059906, 0.1720000058412552, -2.5624001026153564, -0.30660000443458557, 0.36469998955726624, 0.17270000278949738, -0.03290000185370445, -0.18930000066757202, 0.07020000368356705, -1.2453999519348145, 0.14959999918937683, -1.3825000524520874, 0.4146000146865845, -0.2667999863624573, -0.11060000211000443, 0.03620000183582306, -0.3188999891281128, -0.7278000116348267, -0.08940000087022781, -0.22769999504089355, -0.2393999993801117, 1.011199951171875, -0.2962000072002411, 0.7775999903678894, 0.2944999933242798, -0.22339999675750732, 0.27639999985694885, 0.8011000156402588, -0.17440000176429749, 0.15809999406337738, -1.7552000284194946, -0.384799987077713, 0.5993000268936157, 0.5267999768257141, -0.04170000180602074, 0.4733000099658966, -0.3400999903678894, -0.14499999582767487, 0.7088000178337097, -0.13179999589920044, 0.04259999841451645, -0.5027999877929688, 0.3831999897956848, -0.011800000444054604, -0.4357999861240387, 0.3749000132083893, -0.12030000239610672, -0.5648000240325928, -0.1972000002861023, -0.8769000172615051, -0.3675000071525574, -0.2003999948501587, -0.6069999933242798, -0.18569999933242798, 0.3467999994754791, -0.36239999532699585, 0.5357999801635742, -0.3700999915599823, 0.13359999656677246, 0.9545000195503235, 0.11389999836683273, -0.16990000009536743, 0.33169999718666077, 0.2890999913215637, 0.2612999975681305, -0.03440000116825104, -1.9498000144958496, -2.024899959564209, -0.6004999876022339, -0.6258000135421753, -1.2348999977111816, 0.328000009059906, -0.54339998960495, -0.7712000012397766, -0.9057000279426575, -0.16680000722408295, -0.9904999732971191, -0.03720000013709068, -1.1638000011444092, 0.12620000541210175, -0.5248000025749207, -0.15379999577999115, -0.36820000410079956, 0.3249000012874603, 0.06499999761581421, 0.051100000739097595, -0.46070000529289246, 0.22310000658035278, 0.28220000863075256, 0.1396999955177307, -0.49380001425743103, 0.39480000734329224, -0.4074999988079071, -0.6410999894142151, -0.009100000374019146, -0.13330000638961792, -0.5192000269889832, -0.16609999537467957, 0.33169999718666077, -0.07069999724626541, 0.4805999994277954, 0.38280001282691956, 0.22290000319480896, 0.6159999966621399, 0.33709999918937683, 0.188400000333786, 0.13809999823570251, -1.4915000200271606, 0.2833000123500824, -0.1225999966263771, -3.9189000129699707, -0.459199994802475, -0.3434999883174896, -0.6654000282287598, -0.5055999755859375, -0.863099992275238, 0.15360000729560852, -0.6427000164985657, -0.08839999884366989, -0.0471000000834465, 0.11060000211000443, 0.382099986076355, -0.23919999599456787, -0.4050999879837036, 0.08910000324249268, -0.6972000002861023, -0.4699000120162964, 0.09220000356435776, 0.08060000091791153, -0.6773999929428101, -0.062199998646974564, -0.9300000071525574, 0.13369999825954437]);
    carcp.cCLogPUnknown = -999;
  };
  carcp.CLogPPredictor = function CLogPPredictor() {
    carcp.$clinit_CLogPPredictor();
    var l, l$array, l$index, l$max;
    Object_0.call(this);
    this.$init_122();
    if (isNull(carcp.sSortedTypeList)) {
      {
        cggl.Lcom_actelion_research_chem_prediction_CLogPPredictor_2_classLit;
        if (isNull(carcp.sSortedTypeList)) {
          carcp.sSortedTypeList = new caru.SortedList();
          for (l$array = carcp.ATOM_TYPE, l$index = 0, l$max = l$array.length; l$index < l$max; ++l$index) {
            l = jl.valueOf_13(l$array[l$index]);
            carcp.sSortedTypeList.add_10(l);
          }
        }
      }
    }
  };
  defineClass(237, 1, { 1: 1 }, carcp.CLogPPredictor);
  _.$init_122 = function $init_122() {
  };
  _.assessCLogP = function assessCLogP(mol) {
    var atom, cLogP, e, index_0, type_0;
    cLogP = 0;
    mol.normalizeAmbiguousBonds_0();
    mol.ensureHelperArrays_0(7);
    for (atom = 0; atom < mol.getAtoms_0(); atom++) {
      try {
        type_0 = carc2.getAtomType(mol, atom, 6241);
        index_0 = carcp.sSortedTypeList.getIndex_0(jl.valueOf_13(type_0));
        if (index_0 != -1)
          cLogP += carcp.INCREMENT[index_0];
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
        } else
          throw toJs($e0);
      }
    }
    return cLogP;
  };
  _.getDetail_0 = function getDetail(mol) {
    var atom, atomType, countMap, detail, e, errorCount, formatter, type_0, type$iterator, typeCount;
    detail = new carcp.ParameterizedStringList();
    detail.add_7("cLogP Values are estimated applying an atom-type based increment system.", 2);
    detail.add_7("Atom-types are 64-bit numbers describing atoms and their near surrounding.", 2);
    detail.add_7("Recognized atom types and their contributions are:", 2);
    if (isNotNull(mol)) {
      mol.normalizeAmbiguousBonds_0();
      mol.ensureHelperArrays_0(7);
      errorCount = 0;
      countMap = new ju.TreeMap();
      formatter = new jt.DecimalFormat("#0.000");
      for (atom = 0; atom < mol.getAtoms_0(); atom++) {
        try {
          atomType = carc2.getAtomType(mol, atom, 6241);
          typeCount = castTo(countMap.get(jl.valueOf_13(atomType)), 35);
          if (isNull(typeCount))
            countMap.put(jl.valueOf_13(atomType), jl.valueOf_12(1));
          else
            countMap.put(jl.valueOf_13(atomType), jl.valueOf_12(typeCount.intValue() + 1));
        } catch ($e0) {
          $e0 = toJava($e0);
          if (instanceOf($e0, 12)) {
            e = $e0;
            errorCount++;
          } else
            throw toJs($e0);
        }
      }
      if (errorCount != 0)
        detail.add_7("Warning: " + errorCount + " atom type(s) could not be determined.", 2);
      for (type$iterator = countMap.keySet().iterator(); type$iterator.hasNext_0(); ) {
        type_0 = castTo(type$iterator.next_3(), 111);
        if (carcp.sSortedTypeList.contains_3(type_0))
          detail.add_7(countMap.get(type_0) + " * " + formatter.format_0(carcp.INCREMENT[carcp.sSortedTypeList.getIndex_0(type_0)]) + " AtomType: 0x" + toHexString_0(type_0.longValue()), 2);
        else
          detail.add_7("Warning: For atom type 0x" + toHexString_0(type_0.longValue()) + " (" + countMap.get(type_0) + " times found) is no increment available.", 2);
      }
    }
    return detail;
  };
  carcp.ATOM_TYPE_MODE = 6241;
  carcp.cCLogPUnknown = 0;
  cggl.Lcom_actelion_research_chem_prediction_CLogPPredictor_2_classLit = createForClass("com.actelion.research.chem.prediction", "CLogPPredictor", 237, cggl.Ljava_lang_Object_2_classLit);
  carcp.$clinit_DrugScoreCalculator = function $clinit_DrugScoreCalculator() {
    carcp.$clinit_DrugScoreCalculator = emptyMethod;
    jl.$clinit_Object();
  };
  carcp.calculate = function calculate(mCLogP, mSolubility, mMolweight, mDruglikeness, toxRisks) {
    carcp.$clinit_DrugScoreCalculator();
    var cLogPScore, drugLikenessScore, drugScore, i, molweightScore, solubilityScore;
    cLogPScore = 1 / (1 + $wnd.Math.exp(mCLogP - 5));
    solubilityScore = 1 - 1 / (1 + $wnd.Math.exp(mSolubility + 5));
    molweightScore = 1 / (1 + $wnd.Math.exp(0.012 * mMolweight - 6));
    drugLikenessScore = 1 - 1 / (1 + $wnd.Math.exp(mDruglikeness));
    drugScore = (0.5 + cLogPScore / 2) * (0.5 + solubilityScore / 2) * (0.5 + molweightScore / 2) * (0.5 + drugLikenessScore / 2);
    for (i = 0; jsNotEquals(toxRisks, null) && i < toxRisks.length; i++) {
      if (toxRisks[i] == 2)
        drugScore *= 0.8;
      else if (toxRisks[i] == 3)
        drugScore *= 0.6;
    }
    return drugScore;
  };
  defineClass(649, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_prediction_DrugScoreCalculator_2_classLit = createForClass("com.actelion.research.chem.prediction", "DrugScoreCalculator", 649, cggl.Ljava_lang_Object_2_classLit);
  carcp.$clinit_DruglikenessPredictor = function $clinit_DruglikenessPredictor() {
    carcp.$clinit_DruglikenessPredictor = emptyMethod;
    jl.$clinit_Object();
    carcp.cDruglikenessUnknown = -999;
  };
  carcp.DruglikenessPredictor = function DruglikenessPredictor2() {
    carcp.$clinit_DruglikenessPredictor();
    var e;
    Object_0.call(this);
    this.$init_123();
    {
      cggl.Lcom_actelion_research_chem_prediction_DruglikenessPredictor_2_classLit;
      if (!carcp.sInitialized) {
        try {
          carcp.sIncrementTable = new carcp.IncrementTable("/resources/druglikenessNoIndex.txt");
          carcp.sInitialized = true;
        } catch ($e0) {
          $e0 = toJava($e0);
          if (instanceOf($e0, 12)) {
            e = $e0;
            (jl.$clinit_System(), jl.out_0).println_0("Unable to initialize DruglikenessPredictor");
          } else
            throw toJs($e0);
        }
      }
    }
  };
  defineClass(316, 1, { 1: 1 }, carcp.DruglikenessPredictor);
  _.$init_123 = function $init_123() {
  };
  _.assessDruglikeness_0 = function assessDruglikeness(mol, threadMaster) {
    var detail, druglikeness, fragment, fragmentCount, i, increment, incrementSum, nastyIncrementSum, sss;
    detail = new carcp.ParameterizedStringList();
    if (!carcp.sInitialized) {
      detail.add_7("Druglikeness predictor not properly initialized.", 2);
      return -999;
    }
    detail.add_7("Found sub-structure fragments and their contributions:", 2);
    detail.add_7("(yellow atoms carry at least one more substituent)", 2);
    nastyIncrementSum = 0;
    incrementSum = 0;
    fragmentCount = 0;
    sss = new carc2.SSSearcher_0(1);
    fragment = new carc2.StereoMolecule();
    for (i = 0; i < carcp.sIncrementTable.getSize_0(); i++) {
      if (isNotNull(threadMaster) && threadMaster.threadMustDie())
        return -999;
      jl.yield_0();
      new carc2.IDCodeParser(false).parse_0(fragment, carcp.sIncrementTable.getFragment_1(i));
      sss.setMol_0(fragment, mol);
      if (sss.isFragmentInMolecule_0()) {
        increment = carcp.sIncrementTable.getIncrement(i);
        if (increment < -1)
          nastyIncrementSum += increment;
        else {
          incrementSum += increment;
          fragmentCount++;
        }
        detail.add_7(carcp.sIncrementTable.getFragment_1(i), 1);
        detail.add_7(jl.toString_37(increment), 3);
      }
    }
    if (fragmentCount == 0)
      return -1;
    druglikeness = nastyIncrementSum + incrementSum / $wnd.Math.sqrt(fragmentCount);
    druglikeness = druglikeness + 0.0625 * (fragmentCount - 40);
    this.mDetail = detail;
    return druglikeness;
  };
  _.getDetail_1 = function getDetail_0() {
    return this.mDetail;
  };
  _.getDruglikenessString_0 = function getDruglikenessString(testMolecule) {
    var druglikeness, fragment, fragmentCount, i, incrementSum, sss;
    if (!carcp.sInitialized)
      return "Druglikeness predictor not properly initialized.";
    incrementSum = 0;
    fragmentCount = 0;
    sss = new carc2.SSSearcher_0(1);
    fragment = new carc2.StereoMolecule();
    for (i = 0; i < carcp.sIncrementTable.getSize_0(); i++) {
      new carc2.IDCodeParser(false).parse_0(fragment, carcp.sIncrementTable.getFragment_1(i));
      sss.setMol_0(fragment, testMolecule);
      if (sss.isFragmentInMolecule_0()) {
        incrementSum += carcp.sIncrementTable.getIncrement(i);
        fragmentCount++;
      }
    }
    druglikeness = fragmentCount == 0 ? -1 : incrementSum / $wnd.Math.sqrt(fragmentCount);
    return druglikeness + "	" + fragmentCount + "	" + testMolecule.getAtoms_0();
  };
  carcp.cDruglikenessUnknown = 0;
  carcp.sInitialized = false;
  cggl.Lcom_actelion_research_chem_prediction_DruglikenessPredictor_2_classLit = createForClass("com.actelion.research.chem.prediction", "DruglikenessPredictor", 316, cggl.Ljava_lang_Object_2_classLit);
  carcp.$clinit_IncrementTable = function $clinit_IncrementTable() {
    carcp.$clinit_IncrementTable = emptyMethod;
    jl.$clinit_Object();
  };
  carcp.IncrementTable = function IncrementTable(filename) {
    carcp.$clinit_IncrementTable();
    var idcode, increment, tabPosition, theLine, theReader;
    Object_0.call(this);
    this.$init_124();
    theReader = new ji.BufferedReader(new ji.InputStreamReader_0(ocu.getResourceAsStream(filename), (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
    this.mRecords = new ju.ArrayList();
    while (true) {
      theLine = theReader.readLine();
      if (jsEquals(theLine, null))
        break;
      tabPosition = jl.indexOf_I_I__devirtual$(theLine, 9);
      if (tabPosition == -1)
        throw toJs(new jl.Exception_1("line without TAB"));
      idcode = jl.substring_II_Ljava_lang_String___devirtual$(theLine, 0, tabPosition);
      increment = jl.doubleValue__D__devirtual$_0(valueOf_10(jl.substring_I_Ljava_lang_String___devirtual$(theLine, tabPosition + 1)));
      this.mRecords.add(new carcp.IncrementTableRecord(idcode, increment));
    }
    theReader.close_0();
  };
  defineClass(317, 1, { 1: 1 }, carcp.IncrementTable);
  _.$init_124 = function $init_124() {
  };
  _.getFragment_1 = function getFragment_2(i) {
    return castTo(this.mRecords.getAtIndex(i), 187).mIDCode;
  };
  _.getIncrement = function getIncrement(i) {
    return castTo(this.mRecords.getAtIndex(i), 187).mIncrement;
  };
  _.getSize_0 = function getSize_3() {
    return this.mRecords.size();
  };
  cggl.Lcom_actelion_research_chem_prediction_IncrementTable_2_classLit = createForClass("com.actelion.research.chem.prediction", "IncrementTable", 317, cggl.Ljava_lang_Object_2_classLit);
  carcp.$clinit_IncrementTableRecord = function $clinit_IncrementTableRecord() {
    carcp.$clinit_IncrementTableRecord = emptyMethod;
    jl.$clinit_Object();
  };
  carcp.IncrementTableRecord = function IncrementTableRecord(idcode, increment) {
    carcp.$clinit_IncrementTableRecord();
    Object_0.call(this);
    this.$init_125();
    this.mIDCode = idcode;
    this.mIncrement = increment;
  };
  defineClass(187, 1, { 187: 1, 1: 1 }, carcp.IncrementTableRecord);
  _.$init_125 = function $init_125() {
  };
  _.mIncrement = 0;
  cggl.Lcom_actelion_research_chem_prediction_IncrementTableRecord_2_classLit = createForClass("com.actelion.research.chem.prediction", "IncrementTableRecord", 187, cggl.Ljava_lang_Object_2_classLit);
  carcp.$clinit_ParameterizedString = function $clinit_ParameterizedString() {
    carcp.$clinit_ParameterizedString = emptyMethod;
    jl.$clinit_Object();
  };
  carcp.ParameterizedString = function ParameterizedString(s, t) {
    carcp.$clinit_ParameterizedString();
    Object_0.call(this);
    this.$init_126();
    this.mString = s;
    this.mType = t;
  };
  defineClass(183, 1, { 183: 1, 1: 1 }, carcp.ParameterizedString);
  _.$init_126 = function $init_126() {
  };
  _.mType = 0;
  cggl.Lcom_actelion_research_chem_prediction_ParameterizedString_2_classLit = createForClass("com.actelion.research.chem.prediction", "ParameterizedString", 183, cggl.Ljava_lang_Object_2_classLit);
  carcp.$clinit_ParameterizedStringList = function $clinit_ParameterizedStringList() {
    carcp.$clinit_ParameterizedStringList = emptyMethod;
    jl.$clinit_Object();
  };
  carcp.ParameterizedStringList = function ParameterizedStringList() {
    carcp.$clinit_ParameterizedStringList();
    Object_0.call(this);
    this.$init_127();
  };
  defineClass(157, 1, { 1: 1 }, carcp.ParameterizedStringList);
  _.$init_127 = function $init_127() {
    this.mList = new ju.ArrayList();
  };
  _.add_7 = function add_13(s, t) {
    this.mList.add(new carcp.ParameterizedString(s, t));
  };
  _.getSize_0 = function getSize_4() {
    return this.mList.size();
  };
  _.getStringAt = function getStringAt_1(i) {
    return castTo(this.mList.getAtIndex(i), 183).mString;
  };
  _.getStringTypeAt = function getStringTypeAt(i) {
    return castTo(this.mList.getAtIndex(i), 183).mType;
  };
  carcp.cStringTypeDouble = 3;
  carcp.cStringTypeIDCode = 1;
  carcp.cStringTypeText = 2;
  cggl.Lcom_actelion_research_chem_prediction_ParameterizedStringList_2_classLit = createForClass("com.actelion.research.chem.prediction", "ParameterizedStringList", 157, cggl.Ljava_lang_Object_2_classLit);
  carcp.$clinit_PolarSurfaceAreaPredictor = function $clinit_PolarSurfaceAreaPredictor() {
    carcp.$clinit_PolarSurfaceAreaPredictor = emptyMethod;
    jl.$clinit_Object();
    carcp.cPSAUnknown = -1;
    carcp.cPolarAtomTypeName = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["[N](-*)(-*)-*", "[N](-*)=*", "[N]#*", "[N](-*)(=*)=* as in nitro", "[N](=*)#* middle atom of azide", "[N]1(-*)-*-*-1 3-membered ring", "[NH](-*)-*", "[NH]1-*-*-1 3-membered ring", "[NH]=*", "[NH2]-*", "[N+](-*)(-*)(-*)-*", "[N+](-*)(-*)=*", "[N+](-*)#* N in isocyano", "[NH+](-*)(-*)-*", "[NH+](-*)=*", "[NH2+](-*)-*", "[NH2+]=*", "[NH3+]-*", "[n](:*):*", "[n](:*)(:*):*", "[n](-*)(:*):*", "[n](=*)(:*):* as in pyridine-N-oxid", "[nH](:*):*", "[n+](:*)(:*):*", "[n+](-*)(:*):*", "[nH+](:*):*", "[O](-*)-*", "[O]1-*-*-1 3-membered ring", "[O]=*", "[OH]-*", "[O-]-*", "[o](:*):*", "[S](-*)-*", "[S]=*", "[S](-*)(-*)=*", "[S](-*)(-*)(=*)=*", "[SH]-*", "[s](:*):*", "[s](=*)(:*):*", "[P](-*)(-*)-*", "[P](-*)=*", "[P](-*)(-*)(-*)=*", "[PH](-*)(-*)=*"]);
    carcp.cTPSAIncrement = stampJavaTypeInfo(getClassLiteralForArray(cggl.F_classLit, 1), { 44: 1, 4: 1, 1: 1 }, 5, 15, [3.240000009536743, 12.359999656677246, 23.790000915527344, 11.680000305175781, 13.600000381469727, 3.009999990463257, 12.029999732971191, 21.940000534057617, 23.850000381469727, 26.020000457763672, 0, 3.009999990463257, 4.360000133514404, 4.440000057220459, 13.970000267028809, 16.610000610351562, 25.59000015258789, 27.639999389648438, 12.890000343322754, 4.409999847412109, 4.929999828338623, 8.390000343322754, 15.789999961853027, 4.099999904632568, 3.880000114440918, 14.140000343322754, 9.229999542236328, 12.529999732971191, 17.06999969482422, 20.229999542236328, 23.059999465942383, 13.140000343322754, 25.299999237060547, 32.09000015258789, 19.209999084472656, 8.380000114440918, 38.79999923706055, 28.239999771118164, 21.700000762939453, 13.59000015258789, 34.13999938964844, 9.8100004196167, 23.469999313354492]);
  };
  carcp.PolarSurfaceAreaPredictor = function PolarSurfaceAreaPredictor() {
    carcp.$clinit_PolarSurfaceAreaPredictor();
    Object_0.call(this);
    this.$init_128();
  };
  defineClass(239, 1, { 1: 1 }, carcp.PolarSurfaceAreaPredictor);
  _.$init_128 = function $init_128() {
  };
  _.addTPSAIncrements = function addTPSAIncrements(mol, detail) {
    var count, i;
    count = this.getPolarAtomTypeCounts(mol);
    for (i = 0; i < carcp.cTPSAIncrement.length; i++)
      if (count[i] != 0)
        detail.add_7("" + count[i] + " * " + carcp.cTPSAIncrement[i] + "   AtomType: " + carcp.cPolarAtomTypeName[i], 2);
  };
  _.assessPSA = function assessPSA(mol) {
    var count, i, psa;
    count = this.getPolarAtomTypeCounts(mol);
    psa = 0;
    for (i = 0; i < carcp.cTPSAIncrement.length; i++)
      psa += count[i] * carcp.cTPSAIncrement[i];
    return psa;
  };
  _.getDetail_0 = function getDetail_1(mol) {
    var detail;
    detail = new carcp.ParameterizedStringList();
    detail.add_7("The polar surface area prediction is based on an atom-type based", 2);
    detail.add_7("increment system, published by P. Ertl, B. Rohde, P. Selzer", 2);
    detail.add_7("in J. Med. Chem. 2000, 43, 3714-3717", 2);
    detail.add_7("Recognized atom types and their contributions are:", 2);
    this.addTPSAIncrements(mol, detail);
    return detail;
  };
  _.getPolarAtomType = function getPolarAtomType(mol, atom) {
    var i;
    switch (mol.getAtomicNo_0(atom)) {
      case 7:
        if (mol.isAromaticAtom_0(atom)) {
          if (mol.getAtomCharge_0(atom) == 0) {
            if (mol.getAllHydrogens_0(atom) == 0) {
              if (mol.getNonHydrogenNeighbourCount_0(atom) == 2)
                return 18;
              else {
                for (i = 0; i < mol.getNonHydrogenNeighbourCount_0(atom); i++)
                  if (!mol.isAromaticBond_0(mol.getConnBond_0(atom, i)))
                    return 20;
                return 19;
              }
            } else
              return 22;
          } else if (mol.getAtomCharge_0(atom) == 1) {
            if (mol.getAllHydrogens_0(atom) == 0) {
              for (i = 0; i < mol.getNonHydrogenNeighbourCount_0(atom); i++)
                if (!mol.isAromaticBond_0(mol.getConnBond_0(atom, i)))
                  return mol.getAtomCharge_0(mol.getConnAtom_0(atom, i)) < 0 ? 21 : 24;
              return 23;
            } else
              return 25;
          }
        } else {
          if (mol.getAtomCharge_0(atom) == 0) {
            switch (mol.getAllHydrogens_0(atom)) {
              case 0:
                switch (mol.getAtomPi_0(atom)) {
                  case 0:
                    if (mol.getAtomRingSize_0(atom) == 3)
                      return 5;
                    else
                      return 0;
                  case 1:
                    return 1;
                  case 2:
                    return 2;
                }
                break;
              case 1:
                switch (mol.getAtomPi_0(atom)) {
                  case 0:
                    if (mol.getAtomRingSize_0(atom) == 3)
                      return 7;
                    else
                      return 6;
                  case 1:
                    return 8;
                }
                break;
              case 2:
                return 9;
            }
          } else if (mol.getAtomCharge_0(atom) == 1) {
            switch (mol.getAllHydrogens_0(atom)) {
              case 0:
                switch (mol.getAtomPi_0(atom)) {
                  case 0:
                    return 10;
                  case 1:
                    return this.hasNegativeNeighbour_0(mol, atom) ? 3 : 11;
                  case 2:
                    if (mol.getConnBondOrder_0(atom, 0) == 2)
                      return this.hasNegativeNeighbour_0(mol, atom) ? 4 : carcp.cTPSAIncrement.length + 1;
                    else
                      return 12;
                }
                break;
              case 1:
                switch (mol.getAtomPi_0(atom)) {
                  case 0:
                    return 13;
                  case 1:
                    return 14;
                }
                break;
              case 2:
                return mol.getAtomPi_0(atom) == 0 ? 15 : 16;
              case 3:
                return 17;
            }
          }
        }
        return carcp.cTPSAIncrement.length + 1;
      case 8:
        if (mol.isAromaticAtom_0(atom)) {
          if (mol.getAtomCharge_0(atom) == 0)
            return 31;
        } else {
          if (mol.getAtomCharge_0(atom) == 0) {
            if (mol.getAtomPi_0(atom) > 0)
              return 28;
            if (mol.getNonHydrogenNeighbourCount_0(atom) == 1)
              return 29;
            if (mol.getAtomRingSize_0(atom) == 3)
              return 27;
            return 26;
          } else if (mol.getAtomCharge_0(atom) == -1) {
            if (mol.getNonHydrogenNeighbourCount_0(atom) == 1 && mol.getAtomCharge_0(mol.getConnAtom_0(atom, 0)) > 0)
              return 28;
            return 30;
          }
        }
        return carcp.cTPSAIncrement.length + 1;
      case 15:
        if (mol.getAtomCharge_0(atom) == 0) {
          if (mol.getAllHydrogens_0(atom) == 0) {
            if (mol.getNonHydrogenNeighbourCount_0(atom) == 3 && mol.getAtomPi_0(atom) == 0)
              return 39;
            if (mol.getNonHydrogenNeighbourCount_0(atom) == 2 && mol.getAtomPi_0(atom) == 1)
              return 40;
            if (mol.getNonHydrogenNeighbourCount_0(atom) == 4 && mol.getAtomPi_0(atom) == 1)
              return 41;
          } else if (mol.getAllHydrogens_0(atom) == 1) {
            if (mol.getNonHydrogenNeighbourCount_0(atom) == 3 && mol.getAtomPi_0(atom) == 1)
              return 42;
          }
        }
        return carcp.cTPSAIncrement.length + 1;
      case 16:
        if (mol.getAtomCharge_0(atom) == 0) {
          if (mol.isAromaticAtom_0(atom)) {
            if (mol.getNonHydrogenNeighbourCount_0(atom) == 2)
              return 37;
            else
              return 38;
          } else {
            if (mol.getAllHydrogens_0(atom) == 0) {
              if (mol.getNonHydrogenNeighbourCount_0(atom) == 2 && mol.getAtomPi_0(atom) == 0)
                return 32;
              if (mol.getNonHydrogenNeighbourCount_0(atom) == 1 && mol.getAtomPi_0(atom) == 1)
                return 33;
              if (mol.getNonHydrogenNeighbourCount_0(atom) == 3 && mol.getAtomPi_0(atom) == 1)
                return 34;
              if (mol.getNonHydrogenNeighbourCount_0(atom) == 4 && mol.getAtomPi_0(atom) == 2)
                return 35;
            } else if (mol.getAllHydrogens_0(atom) == 1) {
              if (mol.getNonHydrogenNeighbourCount_0(atom) == 1)
                return 36;
            }
          }
        }
        return carcp.cTPSAIncrement.length + 1;
    }
    return carcp.cTPSAIncrement.length;
  };
  _.getPolarAtomTypeCounts = function getPolarAtomTypeCounts(mol) {
    var atom, count;
    count = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, carcp.cTPSAIncrement.length + 2, 15, 1);
    mol.ensureHelperArrays_0(7);
    for (atom = 0; atom < mol.getAtoms_0(); atom++)
      count[this.getPolarAtomType(mol, atom)]++;
    return count;
  };
  _.hasNegativeNeighbour_0 = function hasNegativeNeighbour_0(mol, atom) {
    var i;
    for (i = 0; i < mol.getConnAtoms_0(atom); i++)
      if (mol.getAtomCharge_0(mol.getConnAtom_0(atom, i)) < 0)
        return true;
    return false;
  };
  carcp.cPSAUnknown = 0;
  cggl.Lcom_actelion_research_chem_prediction_PolarSurfaceAreaPredictor_2_classLit = createForClass("com.actelion.research.chem.prediction", "PolarSurfaceAreaPredictor", 239, cggl.Ljava_lang_Object_2_classLit);
  carcp.$clinit_PropertyCalculator = function $clinit_PropertyCalculator() {
    carcp.$clinit_PropertyCalculator = emptyMethod;
    jl.$clinit_Object();
  };
  carcp.PropertyCalculator = function PropertyCalculator(mol) {
    carcp.$clinit_PropertyCalculator();
    Object_0.call(this);
    this.$init_129();
    this.mMolecule = mol;
    mol.normalizeAmbiguousBonds_0();
  };
  defineClass(78, 1, { 1: 1 });
  _.$init_129 = function $init_129() {
  };
  _.getAcceptorCount = function getAcceptorCount() {
    var atom, count;
    count = 0;
    for (atom = 0; atom < this.mMolecule.getAllAtoms_0(); atom++)
      if (this.mMolecule.getAtomicNo_0(atom) == 7 || this.mMolecule.getAtomicNo_0(atom) == 8)
        count++;
    return count;
  };
  _.getDonorCount = function getDonorCount() {
    var atom, count;
    count = 0;
    for (atom = 0; atom < this.mMolecule.getAllAtoms_0(); atom++)
      if ((this.mMolecule.getAtomicNo_0(atom) == 7 || this.mMolecule.getAtomicNo_0(atom) == 8) && this.mMolecule.getAllHydrogens_0(atom) > 0)
        count++;
    return count;
  };
  _.getLogP = function getLogP() {
    var e;
    try {
      return new carcp.CLogPPredictor().assessCLogP(this.mMolecule);
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 12)) {
        e = $e0;
        e.printStackTrace();
        return -999;
      } else
        throw toJs($e0);
    }
  };
  _.getLogPDetail = function getLogPDetail() {
    return new carcp.CLogPPredictor().getDetail_0(this.mMolecule);
  };
  _.getLogS = function getLogS() {
    return new carcp.SolubilityPredictor().assessSolubility(this.mMolecule);
  };
  _.getLogSDetail = function getLogSDetail() {
    return new carcp.SolubilityPredictor().getDetail_0(this.mMolecule);
  };
  _.getPolarSurfaceArea = function getPolarSurfaceArea() {
    return new carcp.PolarSurfaceAreaPredictor().assessPSA(this.mMolecule);
  };
  _.getPolarSurfaceAreaDetail = function getPolarSurfaceAreaDetail() {
    return new carcp.PolarSurfaceAreaPredictor().getDetail_0(this.mMolecule);
  };
  _.getRotatableBondCount_0 = function getRotatableBondCount_0() {
    return this.mMolecule.getRotatableBondCount_0();
  };
  _.getStereoCenterCount_0 = function getStereoCenterCount_0() {
    return this.mMolecule.getStereoCenterCount_0();
  };
  cggl.Lcom_actelion_research_chem_prediction_PropertyCalculator_2_classLit = createForClass("com.actelion.research.chem.prediction", "PropertyCalculator", 78, cggl.Ljava_lang_Object_2_classLit);
  carcp.$clinit_SolubilityPredictor = function $clinit_SolubilityPredictor() {
    carcp.$clinit_SolubilityPredictor = emptyMethod;
    jl.$clinit_Object();
    carcp.cSolubilityUnknown = -999;
    carcp.cAtomType = stampJavaTypeInfo(getClassLiteralForArray(cggl.J_classLit, 1), { 4: 1, 1: 1, 49: 1 }, 5, 14, [524290, 524292, 524297, 524301, 589826, 589827, 589828, 589829, 589832, 589833, 589837, 589838, 688130, 688131, 688132, 688137, 688141, 819202, 819203, 819204, 819205, 819208, 819209, 1114114, 1114115, 1114116, 1114120, 1212420, 1343492, 1343496, 1638402, 1638403, 17367042, 17367043, 17367044, 17367045, 17367048, 17367049, 17367053, 17367054, 17465346, 1074266116, 1208483842, 1208483844, 1208549378, 1208549379, 1208549380, 1208549384, 1208549388, 1409810434, 1409875970, 1409875971, 1409875972, 1409875976, 1409974274, 1409974280, 1409974284, 1678311426, 1678311427, 1678311428, 1678311432, 1678311436, 1678409730, 1678409731, 1678409732, 1678540802, 1678540803, 1678540804, 1678540808, 2282291202, 2282291203, 2282389506, 2282389507, 2282520578, 2282520579, 2483617794, 2483617795, 2483716098, 2483716099, 2752675842, 3356033026, 3557359618, 3557457922, 3557588994, 34510798850, 34510798851, 34510798852, 34510798856, 34712125442, 34712125443, 34712125444, 34712125448, 34712223746, 34712223747, 34712223748, 34980560898, 34980560899, 34980659202, 35568287746, 35568287747, 35568287748, 35568287752, 35568386050, 35568386051, 35568386052, 35568517122, 35568517123, 35568517124, 35568517128, 35568812034, 35568812035, 35568910338, 35568910339, 35568910350, 35569336322, 35585064962, 35585064963, 35585064964, 35585064968, 35769548802, 35769614338, 35769712642, 35769843714, 35786391554, 2475109711874, 2475109711875, 2887426572290, 2887426572291, 2887627898882, 2887627898883, 2887627997186, 3437182386178, 3437182386179, 3437383712770, 3437383811074, 3437652148226, 3437652377602, 3437652377603, 4674132967426, 4674334294018, 4674334294019, 4674334392322, 4674602729474, 4674602827778, 4674602958850, 5086449827842, 5086449827848, 5086651154434, 5086651154435, 5086651252738, 5086651252739, 5086651252743, 5086651252744, 5086919589890, 5086919589896, 5086919688194, 5086919819266, 5636406968322, 5636407066626, 5636675502082, 5636675633154, { l: 589826, m: 73760, h: 4 }, { l: 589827, m: 73760, h: 4 }, { l: 688130, m: 73760, h: 4 }, { l: 819202, m: 73760, h: 4 }, { l: 65538, m: 73764, h: 4 }, { l: 65539, m: 73764, h: 4 }, { l: 589826, m: 172064, h: 4 }, { l: 589827, m: 172064, h: 4 }, { l: 688130, m: 172064, h: 4 }, { l: 819202, m: 172064, h: 4 }, { l: 819203, m: 172064, h: 4 }, { l: 65538, m: 172068, h: 4 }, { l: 65539, m: 172068, h: 4 }, { l: 589826, m: 172112, h: 4 }, { l: 589827, m: 172112, h: 4 }, { l: 688130, m: 172112, h: 4 }, { l: 819202, m: 172112, h: 4 }, { l: 65538, m: 172116, h: 4 }, { l: 163842, m: 172116, h: 4 }, { l: 589826, m: 303136, h: 4 }, { l: 688130, m: 303136, h: 4 }, { l: 819202, m: 303136, h: 4 }, { l: 65538, m: 303140, h: 4 }, { l: 589826, m: 303184, h: 4 }, { l: 688130, m: 303184, h: 4 }, { l: 819202, m: 303184, h: 4 }, { l: 65538, m: 303188, h: 4 }, { l: 589826, m: 590112, h: 4 }, { l: 589827, m: 590112, h: 4 }, { l: 589826, m: 590160, h: 4 }, { l: 589827, m: 590160, h: 4 }, { l: 688130, m: 590160, h: 4 }, { l: 589826, m: 590224, h: 4 }, { l: 589827, m: 590224, h: 4 }, { l: 688130, m: 590224, h: 4 }, { l: 819202, m: 590224, h: 4 }, { l: 819203, m: 590224, h: 4 }, { l: 589826, m: 590368, h: 4 }, { l: 688130, m: 590368, h: 4 }, { l: 819202, m: 590368, h: 4 }, { l: 819208, m: 590368, h: 4 }, { l: 589826, m: 590416, h: 4 }, { l: 589832, m: 590416, h: 4 }, { l: 688130, m: 590416, h: 4 }, { l: 688135, m: 590416, h: 4 }, { l: 819202, m: 590416, h: 4 }, { l: 1212430, m: 590416, h: 4 }, { l: 65538, m: 598052, h: 4 }, { l: 65538, m: 598100, h: 4 }, { l: 65539, m: 598100, h: 4 }, { l: 163842, m: 598100, h: 4 }, { l: 163843, m: 598100, h: 4 }, { l: 589826, m: 598304, h: 4 }, { l: 589827, m: 598304, h: 4 }, { l: 688130, m: 598304, h: 4 }, { l: 688131, m: 598304, h: 4 }, { l: 1114114, m: 598304, h: 4 }, { l: 1212418, m: 598304, h: 4 }, { l: 589826, m: 598308, h: 4 }, { l: 589826, m: 688416, h: 4 }, { l: 589826, m: 688464, h: 4 }, { l: 589826, m: 688672, h: 4 }, { l: 589826, m: 688720, h: 4 }, { l: 688130, m: 688720, h: 4 }, { l: 589826, m: 590112, h: 288 }, { l: 589826, m: 590112, h: 336 }, { l: 589827, m: 590112, h: 336 }, { l: 589826, m: 688416, h: 336 }, { l: 589826, m: 688464, h: 336 }, { l: 688130, m: 688464, h: 336 }, { l: 589826, m: 590112, h: 400 }, { l: 589826, m: 688416, h: 400 }, { l: 589826, m: 688464, h: 400 }, { l: 688130, m: 688464, h: 400 }, { l: 589826, m: 819488, h: 400 }, { l: 589826, m: 819536, h: 400 }, { l: 688130, m: 819536, h: 400 }, { l: 589826, m: 819600, h: 400 }, { l: 688130, m: 819600, h: 400 }, { l: 819202, m: 819600, h: 400 }, { l: 589831, m: 590112, h: 592 }, { l: 589831, m: 688416, h: 592 }, { l: 589831, m: 688464, h: 592 }, { l: 688135, m: 688464, h: 592 }, { l: 589831, m: 819536, h: 592 }, { l: 688135, m: 819536, h: 592 }, { l: 688135, m: 819600, h: 592 }, { l: 819207, m: 819600, h: 592 }, { l: 589832, m: 1212704, h: 592 }, { l: 589832, m: 1212752, h: 592 }, { l: 688136, m: 1212752, h: 592 }, { l: 589832, m: 1212816, h: 592 }, { l: 688136, m: 1212816, h: 592 }, { l: 589831, m: 688464, h: 656 }, { l: 589826, m: 590112, h: 8480 }, { l: 589826, m: 688416, h: 8480 }, { l: 589826, m: 688464, h: 8480 }, { l: 688130, m: 688464, h: 8480 }, { l: 589826, m: 819488, h: 8480 }, { l: 819202, m: 819600, h: 8480 }, { l: 688135, m: 1212752, h: 8480 }, { l: 589832, m: 1213008, h: 8480 }, { l: 688136, m: 1213008, h: 8480 }, { l: 819208, m: 1213008, h: 8480 }, { l: 589826, m: 590112, h: 8484 }, { l: 589826, m: 590160, h: 8484 }, { l: 688130, m: 590160, h: 8484 }, { l: 589826, m: 598304, h: 8484 }, { l: 688130, m: 598304, h: 8484 }, { l: 819202, m: 598304, h: 8484 }]);
    carcp.cIncrement = stampJavaTypeInfo(getClassLiteralForArray(cggl.F_classLit, 1), { 44: 1, 4: 1, 1: 1 }, 5, 15, [-0.1899999976158142, 1.2699999809265137, -0.7009999752044678, 2.690999984741211, -0.22699999809265137, 0.029999999329447746, 0.10599999874830246, -0.47600001096725464, -0.44699999690055847, -0.19099999964237213, -0.3330000042915344, 0.0860000029206276, 0.24699999392032623, -0.06199999898672104, 0.01600000075995922, 0.3869999945163727, 0.23499999940395355, -0.4320000112056732, -0.902999997138977, 0.38999998569488525, 0.5809999704360962, 4.52400016784668, -0.6349999904632568, -0.2800000011920929, 0.7699999809265137, -0.05000000074505806, 1.0870000123977661, 0.19200000166893005, 0.19599999487400055, -0.5199999809265137, 0.5419999957084656, 0.3630000054836273, 0.7919999957084656, 0.5920000076293945, 0.9639999866485596, 0.3540000021457672, -0.6850000023841858, -0.3149999976158142, -0.4129999876022339, -0.5950000286102295, 0.2199999988079071, -1.4320000410079956, -2.253999948501587, 0.4399999976158142, -0.27000001072883606, -0.13300000131130219, -0.26899999380111694, 0.2669999897480011, 0.5720000267028809, -0.5680000185966492, 0.17399999499320984, -0.1850000023841858, -0.23499999940395355, -0.17000000178813934, -0.1809999942779541, -0.34200000762939453, -0.3479999899864197, -0.43700000643730164, -0.8040000200271606, -0.41200000047683716, -0.2150000035762787, -0.625, -0.8309999704360962, 0.4970000088214874, -0.4309999942779541, -1.3309999704360962, 0.5070000290870667, -0.6320000290870667, -0.5989999771118164, -0.15600000321865082, -0.3529999852180481, -0.164000004529953, -0.4410000145435333, -0.4970000088214874, -1.059999942779541, 0.11500000208616257, -0.22499999403953552, -0.15399999916553497, -0.03099999949336052, -1.5740000009536743, -1.093000054359436, -0.7379999756813049, -0.44999998807907104, -0.5559999942779541, -0.1809999942779541, 2.384000062942505, 1.75, -1.6660000085830688, -1.065999984741211, 1.3270000219345093, 0.8029999732971191, -1.5049999952316284, -2.5369999408721924, -0.17000000178813934, 0.14900000393390656, 0.5210000276565552, 2.9049999713897705, -0.25200000405311584, 0.8600000143051147, 0.3610000014305115, 0.40299999713897705, 0.004999999888241291, 1.1460000276565552, 0.9359999895095825, -0.30000001192092896, 0.20900000631809235, -0.5830000042915344, -0.024000000208616257, -0.009999999776482582, 0.6110000014305115, 0.4860000014305115, 0.8619999885559082, -0.03500000014901161, -0.5960000157356262, 1.1610000133514404, 1.6469999551773071, 0.843999981880188, 0.125, 0.1420000046491623, -0.17100000381469727, 0.44200000166893005, 0.08799999952316284, 3.065999984741211, 1.6519999504089355, -0.2029999941587448, -0.017999999225139618, 0.023000000044703484, 0.0729999989271164, 0.2540000081062317, 0.5540000200271606, 0.5950000286102295, -0.4059999883174896, -0.6370000243186951, -0.17399999499320984, -0.10100000351667404, -0.5429999828338623, -2.4059998989105225, -3.2920000553131104, -0.05299999937415123, -0.19300000369548798, 1.850000023841858, -1.2610000371932983, -0.656000018119812, -0.7300000190734863, -0.9380000233650208, 0.12800000607967377, 1.1540000438690186, 0.24199999868869781, -0.5289999842643738, -0.27799999713897705, -0.8019999861717224, 0.9120000004768372, -1.38100004196167, 0.46299999952316284, 1.0740000009536743, -0.628000020980835, -0.9620000123977661, -1.8320000171661377, -1.4989999532699585, -2.115999937057495, -2.2070000171661377, -1.3170000314712524, 2.500999927520752, -0.8489999771118164, -0.6019999980926514, -0.621999979019165, 2.121999979019165, -2.2260000705718994, 0.9129999876022339, -2.259000062942505, -1.25, 1.3940000534057617, -1.4019999504089355, 2.072999954223633, -2.9570000171661377, 0.29100000858306885, -3.4760000705718994, -2.7269999980926514, -3.131999969482422, -2.119999885559082, -0.7250000238418579, -0.296999990940094, 0.08299999684095383, 0.34700000286102295, -1.4249999523162842, -1.659999966621399, -1.281999945640564, -1.2649999856948853, 0.718999981880188, 0.1379999965429306, 1.3020000457763672, 0.859000027179718, 1.3589999675750732, 0.6589999794960022, -0.9399999976158142, 0.8999999761581421, 0.3190000057220459, -2.571000099182129, 1.1089999675750732, 0.972000002861023, 1.652999997138977, 2.6019999980926514, 0.7289999723434448, 1.065999984741211, 1.0670000314712524, -0.3109999895095825, 0.03099999949336052, -0.2029999941587448, -0.6809999942779541, -1.2580000162124634, 1.0700000524520874, -3.0959999561309814, -0.2280000001192093, 1.9329999685287476, 0.11900000274181366, 2.1080000400543213, 0.11299999803304672, 1.628000020980835, 1.3079999685287476, 3.3359999656677246, 0.7540000081062317, -0.4650000035762787, -0.3970000147819519, 0.07699999958276749, -0.4790000021457672, -0.15299999713897705, 0.14100000262260437, 2.134999990463257, 0.23399999737739563, 0.460999995470047, 0.6700000166893005, -0.3610000014305115, -1.0390000343322754, -0.4830000102519989, 0.13699999451637268, -0.7680000066757202, -0.5109999775886536, 3.4240000247955322, -0.8550000190734863, -0.5849999785423279, -1.5670000314712524, 3.3429999351501465, 1.840000033378601, 0.3889999985694885, 1.121999979019165, 1.6299999952316284, 1.3350000381469727, 0.3659999966621399, -0.5569999814033508, 0.4320000112056732, 0.20399999618530273, 0.8820000290870667, 0.4659999907016754, -0.4580000042915344, 0.40400001406669617, 0.6570000052452087, 1.1150000095367432, 1.9759999513626099, 1.7860000133514404, -0.035999998450279236, -1.0499999523162842, 1.0449999570846558, 0.04399999976158142, 1.0329999923706055, -1.0800000429153442, 2.5390000343322754, 2.234999895095825, 2.2899999618530273, 3.121000051498413, 3.931999921798706, 2.75]);
  };
  carcp.SolubilityPredictor = function SolubilityPredictor() {
    carcp.$clinit_SolubilityPredictor();
    Object_0.call(this);
    this.$init_130();
  };
  defineClass(238, 1, { 1: 1 }, carcp.SolubilityPredictor);
  _.$init_130 = function $init_130() {
  };
  _.assessSolubility = function assessSolubility(mol) {
    var atom, e, i, logS, type_0;
    logS = -0.5299999713897705;
    mol.normalizeAmbiguousBonds_0();
    mol.ensureHelperArrays_0(7);
    for (atom = 0; atom < mol.getAtoms_0(); atom++) {
      type_0 = fromInt_0(-1);
      try {
        type_0 = carc2.getAtomType(mol, atom, 2144);
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 12)) {
          e = $e0;
        } else
          throw toJs($e0);
      }
      for (i = 0; i < carcp.cIncrement.length; i++) {
        if (eq(carcp.cAtomType[i], type_0)) {
          logS += carcp.cIncrement[i];
          break;
        }
      }
    }
    return logS;
  };
  _.getDetail_0 = function getDetail_2(mol) {
    var atom, count, detail, e, formatter, i, i0, type_0;
    detail = new carcp.ParameterizedStringList();
    detail.add_7("Solubility values are estimated applying an atom-type based increment system.", 2);
    detail.add_7("Atom-types are 64-bit numbers describing atoms and their near surrounding.", 2);
    detail.add_7("Recognized atom types and their contributions are:", 2);
    detail.add_7("Base value = -0.530", 2);
    count = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, carcp.cIncrement.length, 15, 1);
    if (isNotNull(mol)) {
      mol.normalizeAmbiguousBonds_0();
      mol.ensureHelperArrays_0(7);
      for (atom = 0; atom < mol.getAtoms_0(); atom++) {
        type_0 = fromInt_0(-1);
        try {
          type_0 = carc2.getAtomType(mol, atom, 2144);
        } catch ($e0) {
          $e0 = toJava($e0);
          if (instanceOf($e0, 12)) {
            e = $e0;
          } else
            throw toJs($e0);
        }
        for (i0 = 0; i0 < carcp.cIncrement.length; i0++) {
          if (eq(carcp.cAtomType[i0], type_0)) {
            count[i0]++;
            break;
          }
        }
      }
    }
    formatter = new jt.DecimalFormat("#0.000");
    for (i = 0; i < carcp.cIncrement.length; i++)
      if (count[i] != 0)
        detail.add_7("" + count[i] + " * " + formatter.format_0(carcp.cIncrement[i]) + "   AtomType: 0x" + toHexString_0(carcp.cAtomType[i]), 2);
    return detail;
  };
  carcp.cSolubilityUnknown = 0;
  cggl.Lcom_actelion_research_chem_prediction_SolubilityPredictor_2_classLit = createForClass("com.actelion.research.chem.prediction", "SolubilityPredictor", 238, cggl.Ljava_lang_Object_2_classLit);
  carcp.$clinit_ToxicityPredictor = function $clinit_ToxicityPredictor() {
    carcp.$clinit_ToxicityPredictor = emptyMethod;
    jl.$clinit_Object();
    carcp.RISK_NAME = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["unknown", "none", "low", "high"]);
    carcp.cRiskNameA = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["mutagenic", "tumorigenic", "irritant", "reproductive effective"]);
    carcp.cRiskNameN = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Mutagenicity", "Tumorigenicity", "Irritating effects", "Reproductive effects"]);
  };
  carcp.ToxicityPredictor = function ToxicityPredictor2() {
    carcp.$clinit_ToxicityPredictor();
    var e;
    Object_0.call(this);
    this.$init_131();
    {
      cggl.Lcom_actelion_research_chem_prediction_ToxicityPredictor_2_classLit;
      if (!carcp.sInitialized_0) {
        try {
          carcp.sRiskMolecules = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_SortedStringList_2_classLit, { 4: 1, 1: 1, 7: 1 }, 96, 4, 0, 1);
          carcp.sHighRiskFragments = initUnidimensionalArray(cggl.Ljava_util_ArrayList_2_classLit, { 4: 1, 1: 1, 7: 1 }, 16, 4, 0, 1);
          carcp.sLowRiskFragments = initUnidimensionalArray(cggl.Ljava_util_ArrayList_2_classLit, { 4: 1, 1: 1, 7: 1 }, 16, 4, 0, 1);
          setCheck(carcp.sHighRiskFragments, 0, this.readIDCodeFile("/resources/toxpredictor/m1.txt"));
          setCheck(carcp.sHighRiskFragments, 1, this.readIDCodeFile("/resources/toxpredictor/t1.txt"));
          setCheck(carcp.sHighRiskFragments, 2, this.readIDCodeFile("/resources/toxpredictor/i1.txt"));
          setCheck(carcp.sHighRiskFragments, 3, this.readIDCodeFile("/resources/toxpredictor/r1.txt"));
          setCheck(carcp.sLowRiskFragments, 0, this.readIDCodeFile("/resources/toxpredictor/m2.txt"));
          setCheck(carcp.sLowRiskFragments, 1, this.readIDCodeFile("/resources/toxpredictor/t2.txt"));
          setCheck(carcp.sLowRiskFragments, 2, this.readIDCodeFile("/resources/toxpredictor/i2.txt"));
          setCheck(carcp.sLowRiskFragments, 3, this.readIDCodeFile("/resources/toxpredictor/r2.txt"));
          setCheck(carcp.sRiskMolecules, 0, this.readAndSortIDCodeFile("/resources/toxpredictor/m3.txt"));
          setCheck(carcp.sRiskMolecules, 1, this.readAndSortIDCodeFile("/resources/toxpredictor/t3.txt"));
          setCheck(carcp.sRiskMolecules, 2, this.readAndSortIDCodeFile("/resources/toxpredictor/i3.txt"));
          setCheck(carcp.sRiskMolecules, 3, this.readAndSortIDCodeFile("/resources/toxpredictor/r3.txt"));
          carcp.sInitialized_0 = true;
        } catch ($e0) {
          $e0 = toJava($e0);
          if (instanceOf($e0, 12)) {
            e = $e0;
            (jl.$clinit_System(), jl.out_0).println_0("Error ToxicityPredictor::initialize() " + e);
          } else
            throw toJs($e0);
        }
      }
    }
  };
  defineClass(328, 1, { 1: 1 }, carcp.ToxicityPredictor);
  _.$init_131 = function $init_131() {
  };
  _.assessRisk_0 = function assessRisk(mol, riskType, threadMaster) {
    var fragment, i, i0, sss;
    if (!carcp.sInitialized_0)
      return 0;
    if (carcp.sRiskMolecules[riskType].contains_1(new carc2.Canonizer(mol).getIDCode_0()))
      return 3;
    sss = new carc2.SSSearcher_0(1);
    fragment = new carc2.StereoMolecule();
    for (i0 = 0; i0 < carcp.sHighRiskFragments[riskType].size(); i0++) {
      if (isNotNull(threadMaster) && threadMaster.threadMustDie())
        return 0;
      jl.yield_0();
      new carc2.IDCodeParser(false).parse_0(fragment, castToString(carcp.sHighRiskFragments[riskType].getAtIndex(i0)));
      sss.setMol_0(fragment, mol);
      if (sss.isFragmentInMolecule_0())
        return 3;
    }
    for (i = 0; i < carcp.sLowRiskFragments[riskType].size(); i++) {
      if (isNotNull(threadMaster) && threadMaster.threadMustDie())
        return 0;
      jl.yield_0();
      new carc2.IDCodeParser(false).parse_0(fragment, castToString(carcp.sLowRiskFragments[riskType].getAtIndex(i)));
      sss.setMol_0(fragment, mol);
      if (sss.isFragmentInMolecule_0())
        return 2;
    }
    return 1;
  };
  _.getDetail_2 = function getDetail_3(testMolecule, riskType) {
    var found, fragment, i, i0, idcode, sss, theDetail;
    theDetail = new carcp.ParameterizedStringList();
    if (!carcp.sInitialized_0) {
      theDetail.add_7("Toxicity predictor not properly initialized.", 2);
      return theDetail;
    }
    idcode = new carc2.Canonizer(testMolecule).getIDCode_0();
    if (carcp.sRiskMolecules[riskType].contains_1(idcode)) {
      theDetail.add_7("This molecule is known to be " + carcp.cRiskNameA[riskType] + ":", 2);
      theDetail.add_7(idcode, 1);
      return theDetail;
    }
    sss = new carc2.SSSearcher_0(1);
    found = false;
    fragment = new carc2.StereoMolecule();
    for (i0 = 0; i0 < carcp.sHighRiskFragments[riskType].size(); i0++) {
      new carc2.IDCodeParser(false).parse_0(fragment, castToString(carcp.sHighRiskFragments[riskType].getAtIndex(i0)));
      sss.setMol_0(fragment, testMolecule);
      if (sss.isFragmentInMolecule_0()) {
        if (!found)
          theDetail.add_7("High-risk fragments indicating " + carcp.cRiskNameN[riskType] + ":", 2);
        found = true;
        theDetail.add_7(castToString(carcp.sHighRiskFragments[riskType].getAtIndex(i0)), 1);
      }
    }
    found = false;
    for (i = 0; i < carcp.sLowRiskFragments[riskType].size(); i++) {
      new carc2.IDCodeParser(false).parse_0(fragment, castToString(carcp.sLowRiskFragments[riskType].getAtIndex(i)));
      sss.setMol_0(fragment, testMolecule);
      if (sss.isFragmentInMolecule_0()) {
        if (!found)
          theDetail.add_7("Medium-risk fragments indicating " + carcp.cRiskNameN[riskType] + ":", 2);
        found = true;
        theDetail.add_7(castToString(carcp.sLowRiskFragments[riskType].getAtIndex(i)), 1);
      }
    }
    if (theDetail.getSize_0() == 0)
      theDetail.add_7("No indication for " + carcp.cRiskNameN[riskType] + " found.", 2);
    return theDetail;
  };
  _.readAndSortIDCodeFile = function readAndSortIDCodeFile(filename) {
    var e, idcode, molecules, theReader;
    theReader = new ji.BufferedReader(new ji.InputStreamReader_0(ocu.getResourceAsStream(filename), (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
    molecules = new carc2.SortedStringList();
    while (true) {
      try {
        idcode = theReader.readLine();
        if (jsNotEquals(idcode, null))
          molecules.addString(idcode);
        else
          break;
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 50)) {
          e = $e0;
          break;
        } else
          throw toJs($e0);
      }
    }
    theReader.close_0();
    return molecules;
  };
  _.readIDCodeFile = function readIDCodeFile(filename) {
    var e, fragments, idcode, theReader;
    theReader = new ji.BufferedReader(new ji.InputStreamReader_0(ocu.getResourceAsStream(filename), (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
    fragments = new ju.ArrayList();
    while (true) {
      try {
        idcode = theReader.readLine();
        if (jsNotEquals(idcode, null))
          fragments.add(idcode);
        else
          break;
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 50)) {
          e = $e0;
          break;
        } else
          throw toJs($e0);
      }
    }
    theReader.close_0();
    return fragments;
  };
  carcp.cHighRisk = 3;
  carcp.cLowRisk = 2;
  carcp.cNoRisk = 1;
  carcp.cRiskTypeIrritant = 2;
  carcp.cRiskTypeMutagenic = 0;
  carcp.cRiskTypeReproductiveEffective = 3;
  carcp.cRiskTypeTumorigenic = 1;
  carcp.cRiskTypes = 4;
  carcp.cUnknownRisk = 0;
  carcp.sInitialized_0 = false;
  cggl.Lcom_actelion_research_chem_prediction_ToxicityPredictor_2_classLit = createForClass("com.actelion.research.chem.prediction", "ToxicityPredictor", 328, cggl.Ljava_lang_Object_2_classLit);
  carcr.$clinit_IReactionMapper = function $clinit_IReactionMapper() {
    carcr.$clinit_IReactionMapper = emptyMethod;
  };
  cggl.Lcom_actelion_research_chem_reaction_IReactionMapper_2_classLit = createForInterface("com.actelion.research.chem.reaction", "IReactionMapper");
  carcr.$clinit_Reaction = function $clinit_Reaction() {
    carcr.$clinit_Reaction = emptyMethod;
    jl.$clinit_Object();
  };
  carcr.Reaction = function Reaction2() {
    carcr.$clinit_Reaction();
    Object_0.call(this);
    this.$init_132();
    this.mReactant = new ju.ArrayList();
    this.mProduct = new ju.ArrayList();
    this.mCatalyst = new ju.ArrayList();
    this.mMaxMapNo = -1;
    this.mIsFragment = false;
  };
  carcr.Reaction_0 = function Reaction_0(rxn) {
    carcr.$clinit_Reaction();
    var c, i, i0, i1, p, r;
    carcr.Reaction.call(this);
    r = isNull(rxn) ? 0 : isNull(rxn.mReactant) ? 0 : rxn.mReactant.size();
    p = isNull(rxn) ? 0 : isNull(rxn.mProduct) ? 0 : rxn.mProduct.size();
    c = isNull(rxn) ? 0 : isNull(rxn.mCatalyst) ? 0 : rxn.mCatalyst.size();
    for (i0 = 0; i0 < r; i0++)
      this.mReactant.add(new carc2.StereoMolecule_1(rxn.getReactant_0(i0)));
    for (i1 = 0; i1 < p; i1++)
      this.mProduct.add(new carc2.StereoMolecule_1(rxn.getProduct_0(i1)));
    for (i = 0; i < c; i++)
      this.mCatalyst.add(new carc2.StereoMolecule_1(rxn.getCatalyst_0(i)));
    this.mDrawingObjectList = new carc2.DrawingObjectList_0(rxn.getDrawingObjects());
    if (jsNotEquals(rxn.mName, null))
      this.mName = rxn.mName;
    this.mIsFragment = rxn.isFragment_0();
  };
  carcr.Reaction_1 = function Reaction_1(mol, reactantCount) {
    carcr.$clinit_Reaction();
    carcr.Reaction.call(this);
    if (jsNotEquals(mol, null)) {
      this.mReactant.addAll(ju.asList(mol).subList(0, reactantCount));
      this.mProduct.addAll(ju.asList(mol).subList(reactantCount, mol.length));
    }
    this.mIsFragment = this.determineFragment();
  };
  defineClass(65, 1, { 4: 1, 1: 1 }, carcr.Reaction, carcr.Reaction_0, carcr.Reaction_1);
  _.$init_132 = function $init_132() {
  };
  _.addCatalyst_0 = function addCatalyst(catalyst) {
    this.mCatalyst.add(catalyst);
  };
  _.addCatalyst_1 = function addCatalyst_0(catalyst, position) {
    this.mCatalyst.addAtIndex(position, catalyst);
  };
  _.addProduct_0 = function addProduct(product) {
    this.mProduct.add(product);
    this.mMaxMapNo = -1;
  };
  _.addProduct_1 = function addProduct_0(product, position) {
    this.mProduct.addAtIndex(position, product);
    this.mMaxMapNo = -1;
  };
  _.addReactant_0 = function addReactant(reactant) {
    this.mReactant.add(reactant);
    this.mMaxMapNo = -1;
  };
  _.addReactant_1 = function addReactant_0(reactant, position) {
    this.mReactant.addAtIndex(position, reactant);
    this.mMaxMapNo = -1;
  };
  _.clear_0 = function clear_6() {
    this.mReactant.clear();
    this.mProduct.clear();
    this.mCatalyst.clear();
    this.mDrawingObjectList = null;
    this.mMaxMapNo = -1;
  };
  _.determineFragment = function determineFragment() {
    var mol, mol$iterator, mol$iterator0;
    for (mol$iterator0 = this.mReactant.iterator(); mol$iterator0.hasNext_0(); ) {
      mol = castTo(mol$iterator0.next_3(), 17);
      if (mol.isFragment_0())
        return true;
    }
    for (mol$iterator = this.mProduct.iterator(); mol$iterator.hasNext_0(); ) {
      mol = castTo(mol$iterator.next_3(), 17);
      if (mol.isFragment_0())
        return true;
    }
    return false;
  };
  _.getAverageBondLength_0 = function getAverageBondLength_5() {
    var avbl, bondCount, i, mol;
    bondCount = 0;
    avbl = 0;
    for (i = 0; i < this.getMolecules_0(); i++) {
      mol = this.getMolecule_1(i);
      if (mol.getAllBonds_0() != 0) {
        bondCount += mol.getAllBonds_0();
        avbl += mol.getAverageBondLength_0() * mol.getAllBonds_0();
      }
    }
    return bondCount == 0 ? carc2.getDefaultAverageBondLength() : avbl / bondCount;
  };
  _.getCatalyst_0 = function getCatalyst(no) {
    return castTo(this.mCatalyst.getAtIndex(no), 17);
  };
  _.getCatalysts_0 = function getCatalysts() {
    return this.mCatalyst.size();
  };
  _.getDrawingObjects = function getDrawingObjects() {
    return this.mDrawingObjectList;
  };
  _.getHighestMapNo_0 = function getHighestMapNo() {
    var atom, i, mol;
    if (this.mMaxMapNo != -1)
      return this.mMaxMapNo;
    this.mMaxMapNo = 0;
    for (i = 0; i < this.getMolecules_0(); i++) {
      mol = this.getMolecule_1(i);
      for (atom = 0; atom < mol.getAllAtoms_0(); atom++) {
        if (this.mMaxMapNo < mol.getAtomMapNo_0(atom))
          this.mMaxMapNo = mol.getAtomMapNo_0(atom);
      }
    }
    return this.mMaxMapNo;
  };
  _.getMergedCopy_0 = function getMergedCopy() {
    var i, mergedReaction, product, reactant;
    mergedReaction = new carcr.Reaction();
    if (!this.mReactant.isEmpty()) {
      reactant = new carc2.StereoMolecule_1(castTo(this.mReactant.getAtIndex(0), 60));
      for (i = 1; i < this.mReactant.size(); i++)
        reactant.addMolecule_0(castTo(this.mReactant.getAtIndex(i), 60));
      mergedReaction.addReactant_0(reactant);
    }
    if (!this.mProduct.isEmpty()) {
      product = new carc2.StereoMolecule_1(castTo(this.mProduct.getAtIndex(0), 60));
      for (i = 1; i < this.mProduct.size(); i++)
        product.addMolecule_0(castTo(this.mProduct.getAtIndex(i), 60));
      mergedReaction.addProduct_0(product);
    }
    return mergedReaction;
  };
  _.getMolecule_1 = function getMolecule_5(no) {
    return no < this.mReactant.size() ? castTo(this.mReactant.getAtIndex(no), 17) : castTo(this.mProduct.getAtIndex(no - this.mReactant.size()), 17);
  };
  _.getMolecules_0 = function getMolecules() {
    return this.mReactant.size() + this.mProduct.size();
  };
  _.getName_0 = function getName_2() {
    return jsEquals(this.mName, null) ? "" : this.mName;
  };
  _.getProduct_0 = function getProduct(no) {
    return castTo(this.mProduct.getAtIndex(no), 17);
  };
  _.getProducts_0 = function getProducts() {
    return this.mProduct.size();
  };
  _.getReactant_0 = function getReactant(no) {
    return castTo(this.mReactant.getAtIndex(no), 17);
  };
  _.getReactants_0 = function getReactants() {
    return this.mReactant.size();
  };
  _.getReactionCenterMapNos_0 = function getReactionCenterMapNos() {
    var atom, connMapNo, connMapNoFound, i, i0, isReactionCenter, j, k, l, mapNo, mapNo2Atom, maxMapNo, pAtom, pBond, product, productConnMapNo, rAtom, rBond, reactant;
    if (this.getReactants_0() == 0 || this.getProducts_0() == 0)
      return null;
    maxMapNo = this.getHighestMapNo_0();
    if (maxMapNo == 0)
      return null;
    mapNo2Atom = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, this.getProducts_0(), 0, 2);
    for (i0 = 0; i0 < this.getProducts_0(); i0++) {
      product = this.getProduct_0(i0);
      product.ensureHelperArrays_0(15);
      mapNo2Atom[i0] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, maxMapNo + 1, 15, 1);
      ju.fill_0(mapNo2Atom[i0], -1);
      for (atom = 0; atom < product.getAllAtoms_0(); atom++) {
        mapNo = product.getAtomMapNo_0(atom);
        if (mapNo != 0 && mapNo2Atom[i0][mapNo] != -1)
          return null;
        mapNo2Atom[i0][mapNo] = atom;
      }
    }
    isReactionCenter = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, maxMapNo + 1, 16, 1);
    for (i = 0; i < this.getReactants_0(); i++) {
      reactant = this.getReactant_0(i);
      reactant.ensureHelperArrays_0(15);
      for (rAtom = 0; rAtom < reactant.getAllAtoms_0(); rAtom++) {
        mapNo = reactant.getAtomMapNo_0(rAtom);
        if (mapNo != 0 && !isReactionCenter[mapNo]) {
          for (j = 0; j < this.getProducts_0(); j++) {
            pAtom = mapNo2Atom[j][mapNo];
            if (pAtom != -1) {
              product = this.getProduct_0(j);
              if (reactant.getConnAtoms_0(rAtom) != product.getConnAtoms_0(pAtom)) {
                isReactionCenter[mapNo] = true;
                break;
              }
              if (reactant.getAtomParity_0(rAtom) != product.getAtomParity_0(pAtom)) {
                isReactionCenter[mapNo] = true;
                break;
              }
              for (k = 0; k < reactant.getConnAtoms_0(rAtom); k++) {
                connMapNo = reactant.getAtomMapNo_0(reactant.getConnAtom_0(rAtom, k));
                if (connMapNo == 0) {
                  isReactionCenter[mapNo] = true;
                } else {
                  rBond = reactant.getConnBond_0(rAtom, k);
                  connMapNoFound = false;
                  for (l = 0; l < product.getConnAtoms_0(pAtom); l++) {
                    productConnMapNo = product.getAtomMapNo_0(product.getConnAtom_0(pAtom, l));
                    if (productConnMapNo == 0) {
                      isReactionCenter[mapNo] = true;
                      break;
                    }
                    if (productConnMapNo == connMapNo) {
                      connMapNoFound = true;
                      pBond = product.getConnBond_0(pAtom, l);
                      if (reactant.isDelocalizedBond_0(rBond) ^ product.isDelocalizedBond_0(pBond) || !reactant.isDelocalizedBond_0(rBond) && (reactant.getBondOrder_0(rBond) != product.getBondOrder_0(pBond) || reactant.getBondParity_0(rBond) != product.getBondParity_0(pBond))) {
                        isReactionCenter[mapNo] = true;
                        isReactionCenter[connMapNo] = true;
                        break;
                      }
                      break;
                    }
                  }
                  if (!connMapNoFound) {
                    isReactionCenter[mapNo] = true;
                  }
                }
              }
            }
          }
        }
      }
    }
    return isReactionCenter;
  };
  _.isEmpty_0 = function isEmpty_1() {
    var mol, mol$iterator, mol$iterator0, mol$iterator1;
    for (mol$iterator0 = this.mReactant.iterator(); mol$iterator0.hasNext_0(); ) {
      mol = castTo(mol$iterator0.next_3(), 17);
      if (mol.getAllAtoms_0() != 0)
        return false;
    }
    for (mol$iterator1 = this.mProduct.iterator(); mol$iterator1.hasNext_0(); ) {
      mol = castTo(mol$iterator1.next_3(), 17);
      if (mol.getAllAtoms_0() != 0)
        return false;
    }
    for (mol$iterator = this.mCatalyst.iterator(); mol$iterator.hasNext_0(); ) {
      mol = castTo(mol$iterator.next_3(), 17);
      if (mol.getAllAtoms_0() != 0)
        return false;
    }
    return true;
  };
  _.isFragment_0 = function isFragment_2() {
    return this.mIsFragment || this.determineFragment();
  };
  _.isPerfectlyMapped_0 = function isPerfectlyMapped() {
    var atom, atoms, isUsed, mapNo, maxMapNo, product, product$iterator, product$iterator0, reactant, reactant$iterator, reactant$iterator0;
    atoms = 0;
    for (reactant$iterator0 = this.mReactant.iterator(); reactant$iterator0.hasNext_0(); ) {
      reactant = castTo(reactant$iterator0.next_3(), 17);
      reactant.ensureHelperArrays_0(1);
      if (reactant.isFragment_0()) {
        for (atom = 0; atom < reactant.getAtoms_0(); atom++) {
          if (!reactant.isExcludeGroupAtom(atom))
            atoms++;
          else if (reactant.getAtomMapNo_0(atom) != 0)
            return false;
        }
      } else {
        atoms += reactant.getAtoms_0();
      }
    }
    for (product$iterator0 = this.mProduct.iterator(); product$iterator0.hasNext_0(); ) {
      product = castTo(product$iterator0.next_3(), 17);
      product.ensureHelperArrays_0(1);
      if (product.isFragment_0()) {
        for (atom = 0; atom < product.getAtoms_0(); atom++) {
          if (!product.isExcludeGroupAtom(atom))
            atoms--;
          else if (product.getAtomMapNo_0(atom) != 0)
            return false;
        }
      } else {
        atoms -= product.getAtoms_0();
      }
    }
    if (atoms != 0)
      return false;
    maxMapNo = this.getHighestMapNo_0();
    isUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, maxMapNo + 1, 16, 1);
    for (reactant$iterator = this.mReactant.iterator(); reactant$iterator.hasNext_0(); ) {
      reactant = castTo(reactant$iterator.next_3(), 17);
      for (atom = 0; atom < reactant.getAtoms_0(); atom++) {
        if (!reactant.isFragment_0() || !reactant.isExcludeGroupAtom(atom)) {
          mapNo = reactant.getAtomMapNo_0(atom);
          if (isUsed[mapNo])
            return false;
          isUsed[mapNo] = true;
        }
      }
    }
    for (product$iterator = this.mProduct.iterator(); product$iterator.hasNext_0(); ) {
      product = castTo(product$iterator.next_3(), 17);
      product.ensureHelperArrays_0(1);
      for (atom = 0; atom < product.getAtoms_0(); atom++) {
        if (!product.isFragment_0() || !product.isExcludeGroupAtom(atom)) {
          mapNo = product.getAtomMapNo_0(atom);
          if (mapNo >= maxMapNo || !isUsed[mapNo])
            return false;
          isUsed[mapNo] = false;
        }
      }
    }
    return true;
  };
  _.isReactionLayoutRequired_0 = function isReactionLayoutRequired() {
    var avbl, i, j, r;
    if (this.getMolecules_0() <= 1)
      return false;
    avbl = this.getAverageBondLength_0();
    r = initUnidimensionalArray(cggl.Lcom_actelion_research_gui_generic_GenericRectangle_2_classLit, { 4: 1, 1: 1, 7: 1 }, 32, this.getMolecules_0(), 0, 1);
    for (i = 0; i < this.getMolecules_0(); i++) {
      setCheck(r, i, this.getMolecule_1(i).getBounds_0(castTo(null, 32)));
      if (isNotNull(r[i])) {
        for (j = 0; j < i; j++) {
          if (isNotNull(r[j])) {
            if (r[i].x_0 + r[i].width_0 >= r[j].x_0 && r[i].x_0 <= r[j].x_0 + r[j].width_0)
              return true;
            if (r[i].y_0 + r[i].height_0 >= r[j].y_0 && r[i].y_0 <= r[j].y_0 + r[j].height_0)
              return true;
          }
        }
        if (i != 0 && isNotNull(r[i - 1])) {
          if (r[i].x_0 - r[i - 1].x_0 - r[i].width_0 > 5 * avbl)
            return true;
          if (r[i].y_0 - r[i - 1].y_0 - r[i].height_0 > 5 * avbl)
            return true;
        }
      }
    }
    return false;
  };
  _.removeCatalysts_0 = function removeCatalysts() {
    this.mCatalyst.clear();
  };
  _.setDrawingObjects = function setDrawingObjects(l) {
    this.mDrawingObjectList = l;
  };
  _.setFragment_0 = function setFragment_3(f) {
    var mol, mol$iterator, mol$iterator0;
    this.mIsFragment = f;
    for (mol$iterator0 = this.mReactant.iterator(); mol$iterator0.hasNext_0(); ) {
      mol = castTo(mol$iterator0.next_3(), 17);
      mol.setFragment_0(f);
    }
    for (mol$iterator = this.mProduct.iterator(); mol$iterator.hasNext_0(); ) {
      mol = castTo(mol$iterator.next_3(), 17);
      mol.setFragment_0(f);
    }
  };
  _.setName_0 = function setName_1(name_0) {
    this.mName = name_0;
  };
  _.validateMapping_0 = function validateMapping() {
    var i, j, mapNo, mapNo0, mapNoInProduct, mapNoInReactant, maxMapNo, newMapNo, product, product$iterator, product$iterator0, reactant, reactant$iterator, reactant$iterator0;
    maxMapNo = this.getHighestMapNo_0();
    mapNoInReactant = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, maxMapNo + 1, 16, 1);
    for (reactant$iterator0 = this.mReactant.iterator(); reactant$iterator0.hasNext_0(); ) {
      reactant = castTo(reactant$iterator0.next_3(), 17);
      for (j = 0; j < reactant.getAllAtoms_0(); j++) {
        mapNo0 = reactant.getAtomMapNo_0(j);
        if (mapNo0 != 0) {
          if (mapNoInReactant[mapNo0])
            throw toJs(new jl.Exception_1("Duplicate mapping no in reactants"));
          mapNoInReactant[mapNo0] = true;
        }
      }
    }
    mapNoInProduct = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, maxMapNo + 1, 16, 1);
    for (product$iterator0 = this.mProduct.iterator(); product$iterator0.hasNext_0(); ) {
      product = castTo(product$iterator0.next_3(), 17);
      for (j = 0; j < product.getAllAtoms_0(); j++) {
        mapNo0 = product.getAtomMapNo_0(j);
        if (mapNo0 != 0) {
          if (mapNoInProduct[mapNo0])
            throw toJs(new jl.Exception_1("Duplicate mapping no in products"));
          mapNoInProduct[mapNo0] = true;
        }
      }
    }
    newMapNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, maxMapNo + 1, 15, 1);
    mapNo = 0;
    for (i = 1; i <= maxMapNo; i++)
      if (mapNoInReactant[i] && mapNoInProduct[i])
        newMapNo[i] = ++mapNo;
    if (mapNo != maxMapNo) {
      for (reactant$iterator = this.mReactant.iterator(); reactant$iterator.hasNext_0(); ) {
        reactant = castTo(reactant$iterator.next_3(), 17);
        for (j = 0; j < reactant.getAllAtoms_0(); j++)
          reactant.setAtomMapNo_0(j, newMapNo[reactant.getAtomMapNo_0(j)], reactant.isAutoMappedAtom_0(j));
      }
      for (product$iterator = this.mProduct.iterator(); product$iterator.hasNext_0(); ) {
        product = castTo(product$iterator.next_3(), 17);
        for (j = 0; j < product.getAllAtoms_0(); j++)
          product.setAtomMapNo_0(j, newMapNo[product.getAtomMapNo_0(j)], product.isAutoMappedAtom_0(j));
      }
    }
  };
  _.mIsFragment = false;
  _.mMaxMapNo = 0;
  carcr.serialVersionUID_6 = 537316094;
  cggl.Lcom_actelion_research_chem_reaction_Reaction_2_classLit = createForClass("com.actelion.research.chem.reaction", "Reaction", 65, cggl.Ljava_lang_Object_2_classLit);
  carcr.$clinit_ReactionArrow = function $clinit_ReactionArrow() {
    carcr.$clinit_ReactionArrow = emptyMethod;
    carc2.$clinit_AbstractDrawingObject();
  };
  carcr.ReactionArrow = function ReactionArrow() {
    carcr.$clinit_ReactionArrow();
    carc2.AbstractDrawingObject.call(this);
    this.$init_133();
    this.mPoint = initUnidimensionalArray(cggl.Lcom_actelion_research_gui_generic_GenericPoint_2_classLit, { 4: 1, 1: 1, 7: 1 }, 67, 2, 0, 1);
    setCheck(this.mPoint, 0, new cargg.GenericPoint());
    setCheck(this.mPoint, 1, new cargg.GenericPoint());
    this.mHiliteStatus = 0;
  };
  carcr.ReactionArrow_0 = function ReactionArrow_0(descriptorDetail) {
    carcr.$clinit_ReactionArrow();
    var index1, index2, key, nfe, value_0;
    carcr.ReactionArrow.call(this);
    index1 = 0;
    while (index1 != -1) {
      index2 = jl.indexOf_Ljava_lang_String_I_I__devirtual$(descriptorDetail, '="', index1);
      if (index2 == -1)
        break;
      key = jl.substring_II_Ljava_lang_String___devirtual$(descriptorDetail, index1 + 1, index2);
      index1 = jl.indexOf_Ljava_lang_String_I_I__devirtual$(descriptorDetail, '"', index2 + 2);
      value_0 = index1 == -1 ? jl.substring_I_Ljava_lang_String___devirtual$(descriptorDetail, index2 + 1) : jl.substring_II_Ljava_lang_String___devirtual$(descriptorDetail, index2 + 1, index1);
      if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(key, "x1"))
        try {
          this.mPoint[0].x_0 = parseFloat_0(value_0);
        } catch ($e0) {
          $e0 = toJava($e0);
          if (instanceOf($e0, 47)) {
            nfe = $e0;
          } else
            throw toJs($e0);
        }
      else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(key, "y1"))
        try {
          this.mPoint[0].y_0 = parseFloat_0(value_0);
        } catch ($e1) {
          $e1 = toJava($e1);
          if (instanceOf($e1, 47)) {
            nfe = $e1;
          } else
            throw toJs($e1);
        }
      else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(key, "x2"))
        try {
          this.mPoint[1].x_0 = parseFloat_0(value_0);
        } catch ($e2) {
          $e2 = toJava($e2);
          if (instanceOf($e2, 47)) {
            nfe = $e2;
          } else
            throw toJs($e2);
        }
      else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(key, "y2"))
        try {
          this.mPoint[1].y_0 = parseFloat_0(value_0);
        } catch ($e3) {
          $e3 = toJava($e3);
          if (instanceOf($e3, 47)) {
            nfe = $e3;
          } else
            throw toJs($e3);
        }
    }
  };
  defineClass(42, 38, { 38: 1, 42: 1, 1: 1 }, carcr.ReactionArrow, carcr.ReactionArrow_0);
  _.$init_133 = function $init_133() {
  };
  _.checkHiliting = function checkHiliting_0(x_0, y_0) {
    this.mHiliteStatus = this.findPart(x_0, y_0);
    return this.mHiliteStatus != 0;
  };
  _.clearHiliting = function clearHiliting_0() {
    this.mHiliteStatus = 0;
  };
  _.clone_0 = function clone_0() {
    var arrow;
    arrow = new carcr.ReactionArrow();
    arrow.mPoint[0].x_0 = this.mPoint[0].x_0;
    arrow.mPoint[0].y_0 = this.mPoint[0].y_0;
    arrow.mPoint[1].x_0 = this.mPoint[1].x_0;
    arrow.mPoint[1].y_0 = this.mPoint[1].y_0;
    arrow.mIsSelected = this.mIsSelected;
    return arrow;
  };
  _.contains_0 = function contains_3(x_0, y_0) {
    return this.findPart(x_0, y_0) != 0;
  };
  _.draw = function draw_0(context, t) {
    var dx, dy, p, x1, x2, y1, y2;
    context.setRGB_0(this.mIsSelected ? caru.getContrastColor_0(16711680, context.getBackgroundRGB_0()) : context.getForegroundRGB_0());
    x1 = isNull(t) ? this.mPoint[0].x_0 : t.transformX(this.mPoint[0].x_0);
    y1 = isNull(t) ? this.mPoint[0].y_0 : t.transformY(this.mPoint[0].y_0);
    x2 = isNull(t) ? this.mPoint[1].x_0 : t.transformX(this.mPoint[1].x_0);
    y2 = isNull(t) ? this.mPoint[1].y_0 : t.transformY(this.mPoint[1].y_0);
    dx = x2 - x1;
    dy = y2 - y1;
    context.setLineWidth_1($wnd.Math.max(1, 0.019999999552965164 * $wnd.Math.sqrt(dx * dx + dy * dy)));
    context.drawLine_1(x1, y1, x2, y2);
    p = new cargg.GenericPolygon_0(4);
    p.addPoint(x2 + dx / 40, y2 + dy / 40);
    p.addPoint(x2 - dx / 5 + dy / 10, y2 - dy / 5 - dx / 10);
    p.addPoint(x2 - dx / 20, y2 - dy / 20);
    p.addPoint(x2 - dx / 5 - dy / 10, y2 - dy / 5 + dx / 10);
    context.fillPolygon_0(p);
  };
  _.findPart = function findPart(x_0, y_0) {
    var arrowLength, distanceToEnd, distanceToStart;
    distanceToStart = $wnd.Math.sqrt((this.mPoint[0].x_0 - x_0) * (this.mPoint[0].x_0 - x_0) + (this.mPoint[0].y_0 - y_0) * (this.mPoint[0].y_0 - y_0));
    if (distanceToStart < 8)
      return 1;
    distanceToEnd = $wnd.Math.sqrt((this.mPoint[1].x_0 - x_0) * (this.mPoint[1].x_0 - x_0) + (this.mPoint[1].y_0 - y_0) * (this.mPoint[1].y_0 - y_0));
    if (distanceToEnd < 8)
      return 2;
    arrowLength = $wnd.Math.sqrt((this.mPoint[1].x_0 - this.mPoint[0].x_0) * (this.mPoint[1].x_0 - this.mPoint[0].x_0) + (this.mPoint[1].y_0 - this.mPoint[0].y_0) * (this.mPoint[1].y_0 - this.mPoint[0].y_0));
    if (distanceToStart + distanceToEnd < arrowLength + 5)
      return 3;
    return 0;
  };
  _.getBoundingRect_0 = function getBoundingRect_2(context) {
    var angle, bounds, dx, dy, f, length_0;
    length_0 = this.getLength_1();
    f = $wnd.Math.max(length_0 / 8, 3);
    angle = carc2.getAngle_0(this.mPoint[0].x_0, this.mPoint[0].y_0, this.mPoint[1].x_0, this.mPoint[1].y_0);
    dx = $wnd.Math.abs(f * $wnd.Math.cos(angle));
    dy = $wnd.Math.abs(f * $wnd.Math.sin(angle));
    bounds = new cargg.GenericRectangle();
    if (this.mPoint[0].x_0 < this.mPoint[1].x_0) {
      bounds.x_0 = this.mPoint[0].x_0 - dx;
      bounds.width_0 = this.mPoint[1].x_0 - this.mPoint[0].x_0 + 2 * dx;
    } else {
      bounds.x_0 = this.mPoint[1].x_0 - dx;
      bounds.width_0 = this.mPoint[0].x_0 - this.mPoint[1].x_0 + 2 * dx;
    }
    if (this.mPoint[0].y_0 < this.mPoint[1].y_0) {
      bounds.y_0 = this.mPoint[0].y_0 - dy;
      bounds.height_0 = this.mPoint[1].y_0 - this.mPoint[0].y_0 + 2 * dy;
    } else {
      bounds.y_0 = this.mPoint[1].y_0 - dy;
      bounds.height_0 = this.mPoint[0].y_0 - this.mPoint[1].y_0 + 2 * dy;
    }
    return bounds;
  };
  _.getDescriptorDetail = function getDescriptorDetail_0() {
    var detail;
    detail = new jl.StringBuilder();
    detail.append_9(' x1="' + this.mPoint[0].x_0 + '"');
    detail.append_9(' y1="' + this.mPoint[0].y_0 + '"');
    detail.append_9(' x2="' + this.mPoint[1].x_0 + '"');
    detail.append_9(' y2="' + this.mPoint[1].y_0 + '"');
    return detail.toString_0();
  };
  _.getLength_1 = function getLength_1() {
    var dx, dy;
    dx = round_int(this.mPoint[1].x_0 - this.mPoint[0].x_0);
    dy = round_int(this.mPoint[1].y_0 - this.mPoint[0].y_0);
    return $wnd.Math.sqrt(dx * dx + dy * dy);
  };
  _.getTypeString = function getTypeString_0() {
    return "arrow";
  };
  _.hilite = function hilite_0(context) {
    var angle, dx, dy, f, length_0, p;
    context.setRGB_0(context.getSelectionBackgroundRGB_0());
    switch (this.mHiliteStatus) {
      case 1:
        context.fillCircle_0(this.mPoint[0].x_0 - 8, this.mPoint[0].y_0 - 8, 16);
        break;
      case 2:
        context.fillCircle_0(this.mPoint[1].x_0 - 8, this.mPoint[1].y_0 - 8, 16);
        break;
      case 3:
        length_0 = this.getLength_1();
        f = $wnd.Math.max(length_0 / 8, 3);
        angle = carc2.getAngle_0(this.mPoint[0].x_0, this.mPoint[0].y_0, this.mPoint[1].x_0, this.mPoint[1].y_0);
        dx = f * $wnd.Math.cos(angle);
        dy = -f * $wnd.Math.sin(angle);
        p = new cargg.GenericPolygon_0(4);
        p.addPoint(this.mPoint[0].x_0 + dx, this.mPoint[0].y_0 + dy);
        p.addPoint(this.mPoint[1].x_0 + dx, this.mPoint[1].y_0 + dy);
        p.addPoint(this.mPoint[1].x_0 - dx, this.mPoint[1].y_0 - dy);
        p.addPoint(this.mPoint[0].x_0 - dx, this.mPoint[0].y_0 - dy);
        context.fillPolygon_0(p);
        break;
    }
  };
  _.isOnProductSide = function isOnProductSide_0(x_0, y_0) {
    var dx, dy, m, mx, my, sx;
    dx = this.mPoint[1].x_0 - this.mPoint[0].x_0;
    dy = this.mPoint[1].y_0 - this.mPoint[0].y_0;
    mx = (this.mPoint[0].x_0 + this.mPoint[1].x_0) / 2;
    my = (this.mPoint[0].y_0 + this.mPoint[1].y_0) / 2;
    if (dx == 0)
      return dy < 0 ^ y_0 > my;
    if (dy == 0)
      return dx < 0 ^ x_0 > mx;
    m = -dx / dy;
    sx = (this.mPoint[0].x_0 + m * m * x_0 - m * y_0 + m * this.mPoint[0].y_0) / (1 + m * m);
    return dx < 0 ^ sx > mx;
  };
  _.setCoordinates_1 = function setCoordinates_1(x1, y1, x2, y2) {
    this.mPoint[0].x_0 = x1;
    this.mPoint[0].y_0 = y1;
    this.mPoint[1].x_0 = x2;
    this.mPoint[1].y_0 = y2;
  };
  _.translate = function translate_1(x_0, y_0) {
    switch (this.mHiliteStatus) {
      case 1:
        this.mPoint[0].x_0 = this.mTransformationValue1[0] + x_0 - this.mTransformationReferenceX;
        this.mPoint[0].y_0 = this.mTransformationValue2[0] + y_0 - this.mTransformationReferenceY;
        break;
      case 2:
        this.mPoint[1].x_0 = this.mTransformationValue1[1] + x_0 - this.mTransformationReferenceX;
        this.mPoint[1].y_0 = this.mTransformationValue2[1] + y_0 - this.mTransformationReferenceY;
        break;
      default:
        getClassPrototype(38).translate.call(this, x_0, y_0);
        break;
    }
  };
  _.mHiliteStatus = 0;
  carcr.PART_ARROW = 3;
  carcr.PART_ARROW_END = 2;
  carcr.PART_ARROW_START = 1;
  carcr.PART_NONE = 0;
  carcr.TYPE_STRING_0 = "arrow";
  cggl.Lcom_actelion_research_chem_reaction_ReactionArrow_2_classLit = createForClass("com.actelion.research.chem.reaction", "ReactionArrow", 42, cggl.Lcom_actelion_research_chem_AbstractDrawingObject_2_classLit);
  carcr.$clinit_ReactionEncoder = function $clinit_ReactionEncoder() {
    carcr.$clinit_ReactionEncoder = emptyMethod;
    jl.$clinit_Object();
    carcr.INCLUDE_DEFAULT = 1 | 2;
  };
  carcr.decode_0 = function decode_0(s, includeOptions, rxn) {
    carcr.$clinit_ReactionEncoder();
    var index1, index2, index3, index4, rxnCatalysts, rxnCode, rxnCoords, rxnMapping, rxnObjects;
    if (jsEquals(s, null))
      return null;
    rxnCode = s;
    rxnMapping = null;
    rxnCoords = null;
    rxnObjects = null;
    rxnCatalysts = null;
    index1 = jl.indexOf_I_I__devirtual$(s, 35);
    if (index1 == -1) {
      rxnCode = s;
    } else {
      rxnCode = jl.substring_II_Ljava_lang_String___devirtual$(s, 0, index1);
      index2 = jl.indexOf_II_I__devirtual$(s, 35, index1 + 1);
      if (index2 == -1) {
        rxnMapping = jl.substring_I_Ljava_lang_String___devirtual$(s, index1 + 1);
      } else {
        rxnMapping = jl.substring_II_Ljava_lang_String___devirtual$(s, index1 + 1, index2);
        index3 = jl.indexOf_II_I__devirtual$(s, 35, index2 + 1);
        if (index3 == -1) {
          rxnCoords = jl.substring_I_Ljava_lang_String___devirtual$(s, index2 + 1);
        } else {
          rxnCoords = jl.substring_II_Ljava_lang_String___devirtual$(s, index2 + 1, index3);
          index4 = jl.indexOf_II_I__devirtual$(s, 35, index3 + 1);
          if (index4 == -1) {
            rxnObjects = jl.substring_I_Ljava_lang_String___devirtual$(s, index3 + 1);
          } else {
            rxnObjects = jl.substring_II_Ljava_lang_String___devirtual$(s, index3 + 1, index4);
            rxnCatalysts = jl.substring_I_Ljava_lang_String___devirtual$(s, index4 + 1);
          }
        }
      }
    }
    return carcr.decode_1(rxnCode, (includeOptions & 1) != 0 ? rxnMapping : null, (includeOptions & 2) != 0 ? rxnCoords : null, (includeOptions & 4) != 0 ? rxnObjects : null, (includeOptions & 8) != 0 ? rxnCatalysts : null, false, rxn);
  };
  carcr.decode_1 = function decode_1(rxnCode, rxnMapping, rxnCoords, rxnObjects, rxnCatalysts, ensureCoordinates, rxn) {
    var coords, coordsIndex, delimiterIndex, idcode, idcodeIndex, index1, index2, isProduct, mapping, mappingIndex, mol, parser, productIndex;
    if (jsEquals(rxnCode, null) || jl.length__I__devirtual$_0(rxnCode) == 0) {
      return null;
    }
    isProduct = false;
    idcodeIndex = 0;
    mappingIndex = 0;
    coordsIndex = 0;
    productIndex = jl.indexOf_I_I__devirtual$(rxnCode, 33);
    if (productIndex == -1) {
      return null;
    }
    if (isNull(rxn))
      rxn = new carcr.Reaction();
    else
      rxn.clear_0();
    while (idcodeIndex != -1) {
      if (idcodeIndex > productIndex) {
        isProduct = true;
      }
      delimiterIndex = jl.indexOf_II_I__devirtual$(rxnCode, 32, idcodeIndex);
      if (!isProduct && (delimiterIndex > productIndex || delimiterIndex == -1)) {
        delimiterIndex = productIndex;
      }
      idcode = null;
      if (delimiterIndex == -1) {
        idcode = jl.substring_I_Ljava_lang_String___devirtual$(rxnCode, idcodeIndex);
        idcodeIndex = -1;
      } else {
        idcode = jl.substring_II_Ljava_lang_String___devirtual$(rxnCode, idcodeIndex, delimiterIndex);
        idcodeIndex = delimiterIndex + 1;
      }
      mapping = null;
      if (jsNotEquals(rxnMapping, null) && jl.length__I__devirtual$_0(rxnMapping) != 0) {
        delimiterIndex = jl.indexOf_II_I__devirtual$(rxnMapping, 32, mappingIndex);
        if (delimiterIndex == -1) {
          mapping = jl.substring_I_Ljava_lang_String___devirtual$(rxnMapping, mappingIndex);
        } else {
          mapping = jl.substring_II_Ljava_lang_String___devirtual$(rxnMapping, mappingIndex, delimiterIndex);
          mappingIndex = delimiterIndex + 1;
        }
      }
      coords = null;
      if (jsNotEquals(rxnCoords, null) && jl.length__I__devirtual$_0(rxnCoords) != 0) {
        delimiterIndex = jl.indexOf_II_I__devirtual$(rxnCoords, 32, coordsIndex);
        if (delimiterIndex == -1) {
          coords = jl.substring_I_Ljava_lang_String___devirtual$(rxnCoords, coordsIndex);
        } else {
          coords = jl.substring_II_Ljava_lang_String___devirtual$(rxnCoords, coordsIndex, delimiterIndex);
          coordsIndex = delimiterIndex + 1;
        }
      }
      parser = new carc2.IDCodeParser(ensureCoordinates);
      mol = parser.getCompactMolecule_0(idcode, coords);
      if (jsNotEquals(mapping, null)) {
        parser.parseMapping(jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$(mapping, (jnc.$clinit_StandardCharsets(), jnc.UTF_8)));
      }
      if (isProduct) {
        rxn.addProduct_0(mol);
      } else {
        rxn.addReactant_0(mol);
      }
    }
    if (jsNotEquals(rxnObjects, null) && jl.length__I__devirtual$_0(rxnObjects) != 0) {
      rxn.setDrawingObjects(new carc2.DrawingObjectList_1(rxnObjects));
    }
    if (jsNotEquals(rxnCatalysts, null) && jl.length__I__devirtual$_0(rxnCatalysts) != 0) {
      parser = new carc2.IDCodeParser(ensureCoordinates);
      index1 = 0;
      index2 = jl.indexOf_I_I__devirtual$(rxnCatalysts, 43);
      while (index2 != -1) {
        rxn.addCatalyst_0(parser.getCompactMolecule(jl.substring_II_Ljava_lang_String___devirtual$(rxnCatalysts, index1, index2)));
        index1 = index2 + 1;
        index2 = jl.indexOf_II_I__devirtual$(rxnCatalysts, 43, index1);
      }
      rxn.addCatalyst_0(parser.getCompactMolecule(jl.substring_I_Ljava_lang_String___devirtual$(rxnCatalysts, index1)));
    }
    return rxn;
  };
  carcr.decode_2 = function decode_2(s, ensureCoordinates) {
    carcr.$clinit_ReactionEncoder();
    return carcr.decode_3(s, ensureCoordinates, null);
  };
  carcr.decode_3 = function decode_3(s, ensureCoordinates, rxn) {
    carcr.$clinit_ReactionEncoder();
    var index1, index2, index3, index4, rxnCatalysts, rxnCode, rxnCoords, rxnMapping, rxnObjects;
    if (jsEquals(s, null))
      return null;
    rxnCode = s;
    rxnMapping = null;
    rxnCoords = null;
    rxnObjects = null;
    rxnCatalysts = null;
    index1 = jl.indexOf_I_I__devirtual$(s, 35);
    if (index1 == -1) {
      rxnCode = s;
    } else {
      rxnCode = jl.substring_II_Ljava_lang_String___devirtual$(s, 0, index1);
      index2 = jl.indexOf_II_I__devirtual$(s, 35, index1 + 1);
      if (index2 == -1) {
        rxnMapping = jl.substring_I_Ljava_lang_String___devirtual$(s, index1 + 1);
      } else {
        rxnMapping = jl.substring_II_Ljava_lang_String___devirtual$(s, index1 + 1, index2);
        index3 = jl.indexOf_II_I__devirtual$(s, 35, index2 + 1);
        if (index3 == -1) {
          rxnCoords = jl.substring_I_Ljava_lang_String___devirtual$(s, index2 + 1);
        } else {
          rxnCoords = jl.substring_II_Ljava_lang_String___devirtual$(s, index2 + 1, index3);
          index4 = jl.indexOf_II_I__devirtual$(s, 35, index3 + 1);
          if (index4 == -1) {
            rxnObjects = jl.substring_I_Ljava_lang_String___devirtual$(s, index3 + 1);
          } else {
            rxnObjects = jl.substring_II_Ljava_lang_String___devirtual$(s, index3 + 1, index4);
            rxnCatalysts = jl.substring_I_Ljava_lang_String___devirtual$(s, index4 + 1);
          }
        }
      }
    }
    return carcr.decode_1(rxnCode, rxnMapping, rxnCoords, rxnObjects, rxnCatalysts, ensureCoordinates, rxn);
  };
  carcr.encode = function encode(reaction, keepAbsoluteCoordinates, mode) {
    carcr.$clinit_ReactionEncoder();
    var buf, result;
    result = carcr.encode_0(reaction, keepAbsoluteCoordinates, (mode & 16) == 0);
    if (jsEquals(result, null)) {
      return null;
    }
    buf = new jl.StringBuffer_1(result[0]);
    if (mode != 0) {
      buf.append_0(35);
      if ((mode & 1) != 0 && result.length > 1 && jsNotEquals(result[1], null)) {
        buf.append_2(result[1]);
      }
    }
    mode &= ~1;
    if (mode != 0) {
      buf.append_0(35);
      if ((mode & 2) != 0 && result.length > 2 && jsNotEquals(result[2], null)) {
        buf.append_2(result[2]);
      }
    }
    mode &= ~2;
    if (mode != 0) {
      buf.append_0(35);
      if ((mode & 4) != 0 && result.length > 3 && jsNotEquals(result[3], null)) {
        buf.append_2(result[3]);
      }
    }
    mode &= ~4;
    if (mode != 0) {
      buf.append_0(35);
      if ((mode & 8) != 0 && result.length > 4 && jsNotEquals(result[4], null)) {
        buf.append_2(result[4]);
      }
    }
    return buf.toString_0();
  };
  carcr.encode_0 = function encode_0(reaction, keepAbsoluteCoordinates, sortByIDCode) {
    carcr.$clinit_ReactionEncoder();
    var atom, canonizer, coords, coordsSequence, i, i0, i1, idcode, idcodeSequence, index_0, j, mapping, mappingSequence, maxString, mol, result;
    if (isNull(reaction) || reaction.getReactants_0() == 0 || reaction.getProducts_0() == 0) {
      return null;
    }
    idcode = initUnidimensionalArray(cggl.Ljava_lang_String_2_classLit, { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, reaction.getMolecules_0(), 6, 1);
    mapping = initUnidimensionalArray(cggl.Ljava_lang_String_2_classLit, { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, reaction.getMolecules_0(), 6, 1);
    coords = initUnidimensionalArray(cggl.Ljava_lang_String_2_classLit, { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, reaction.getMolecules_0(), 6, 1);
    for (i0 = 0; i0 < reaction.getMolecules_0(); i0++) {
      mol = reaction.getMolecule_1(i0);
      if (mol.isFragment_0() && i0 < reaction.getReactants_0())
        for (atom = 0; atom < mol.getAllAtoms_0(); atom++)
          mol.setAtomQueryFeature_0(atom, 3221225472, false);
      canonizer = new carc2.Canonizer(mol);
      idcode[i0] = canonizer.getIDCode_0();
      if (jsEquals(idcode[i0], null)) {
        return null;
      }
      mapping[i0] = canonizer.getEncodedMapping_0();
      coords[i0] = canonizer.getEncodedCoordinates_1(keepAbsoluteCoordinates);
    }
    idcodeSequence = new jl.StringBuilder();
    coordsSequence = new jl.StringBuilder();
    mappingSequence = new jl.StringBuilder();
    for (i1 = 0; i1 < reaction.getReactants_0(); i1++) {
      index_0 = i1;
      if (sortByIDCode) {
        maxString = "";
        index_0 = -1;
        for (j = 0; j < reaction.getReactants_0(); j++) {
          if (jl.compareTo_Ljava_lang_String__I__devirtual$(maxString, idcode[j]) < 0) {
            maxString = idcode[j];
            index_0 = j;
          }
        }
      }
      if (i1 > 0) {
        idcodeSequence.append_4(32);
        mappingSequence.append_4(32);
        coordsSequence.append_4(32);
      }
      idcodeSequence.append_9(idcode[index_0]);
      mappingSequence.append_9(mapping[index_0]);
      coordsSequence.append_9(coords[index_0]);
      idcode[index_0] = "";
    }
    idcodeSequence.append_4(33);
    mappingSequence.append_4(32);
    coordsSequence.append_4(32);
    for (i = reaction.getReactants_0(); i < reaction.getMolecules_0(); i++) {
      index_0 = i;
      if (sortByIDCode) {
        maxString = "";
        index_0 = -1;
        for (j = reaction.getReactants_0(); j < reaction.getMolecules_0(); j++) {
          if (jl.compareTo_Ljava_lang_String__I__devirtual$(maxString, idcode[j]) < 0) {
            maxString = idcode[j];
            index_0 = j;
          }
        }
      }
      if (i > reaction.getReactants_0()) {
        idcodeSequence.append_4(32);
        mappingSequence.append_4(32);
        coordsSequence.append_4(32);
      }
      idcodeSequence.append_9(idcode[index_0]);
      mappingSequence.append_9(mapping[index_0]);
      coordsSequence.append_9(coords[index_0]);
      idcode[index_0] = "";
    }
    result = initUnidimensionalArray(cggl.Ljava_lang_String_2_classLit, { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 5, 6, 1);
    result[0] = idcodeSequence.toString_0();
    if (mappingSequence.length_1() > reaction.getMolecules_0() - 1) {
      result[1] = mappingSequence.toString_0();
    }
    if (coordsSequence.length_1() > reaction.getMolecules_0() - 1) {
      result[2] = coordsSequence.toString_0();
    }
    if (isNotNull(reaction.getDrawingObjects())) {
      result[3] = reaction.getDrawingObjects().toString_0();
    }
    if (reaction.getCatalysts_0() != 0) {
      result[4] = carcr.encodeCatalysts(reaction, keepAbsoluteCoordinates);
    }
    return result;
  };
  carcr.encodeCatalysts = function encodeCatalysts(reaction, keepAbsoluteCoordinates) {
    var canonizer, i, sb;
    sb = new jl.StringBuilder();
    for (i = 0; i < reaction.getCatalysts_0(); i++) {
      if (sb.length_1() != 0)
        sb.append_4(43);
      canonizer = new carc2.Canonizer(reaction.getCatalyst_0(i));
      sb.append_9(canonizer.getIDCode_0());
      if (keepAbsoluteCoordinates) {
        sb.append_9(" ");
        sb.append_9(canonizer.getEncodedCoordinates_1(true));
      }
    }
    return sb.toString_0();
  };
  defineClass(650, 1, { 1: 1 });
  carcr.CATALYST_DELIMITER = 43;
  carcr.INCLUDE_ALL = 15;
  carcr.INCLUDE_CATALYSTS = 8;
  carcr.INCLUDE_COORDS = 2;
  carcr.INCLUDE_DEFAULT = 0;
  carcr.INCLUDE_DRAWING_OBJECTS = 4;
  carcr.INCLUDE_MAPPING = 1;
  carcr.INCLUDE_RXN_CODE_ONLY = 0;
  carcr.MOLECULE_DELIMITER = 32;
  carcr.MOLECULE_DELIMITER_STRING = " ";
  carcr.OBJECT_DELIMITER = 35;
  carcr.OBJECT_DELIMITER_STRING = "#";
  carcr.PRODUCT_IDENTIFIER = 33;
  carcr.RETAIN_REACTANT_AND_PRODUCT_ORDER = 16;
  cggl.Lcom_actelion_research_chem_reaction_ReactionEncoder_2_classLit = createForClass("com.actelion.research.chem.reaction", "ReactionEncoder", 650, cggl.Ljava_lang_Object_2_classLit);
  carcr.$clinit_Reactor = function $clinit_Reactor() {
    carcr.$clinit_Reactor = emptyMethod;
    jl.$clinit_Object();
  };
  carcr.Reactor = function Reactor2(reaction, mode, maxProducts) {
    var dif, i, i0, i1, i2, j, k, l, mapNo, product, reactant;
    Object_0.call(this);
    this.$init_134();
    this.mRetainCoordinates = (mode & 1) != 0;
    this.mFullyMapReactions = (mode & 2) != 0;
    this.mUniqueProductsOnly = (mode & 4) != 0;
    this.mAllowChargeCorrections = (mode & 8) != 0;
    this.mMaxCount = maxProducts;
    this.mGenericReaction = reaction;
    this.mReactant = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_StereoMolecule_2_classLit, { 95: 1, 4: 1, 1: 1, 7: 1 }, 17, reaction.getReactants_0(), 0, 1);
    for (i0 = 0; i0 < reaction.getReactants_0(); i0++) {
      reaction.getReactant_0(i0).setFragment_0(true);
      reaction.getReactant_0(i0).ensureHelperArrays_0(15);
    }
    for (i1 = 0; i1 < reaction.getProducts_0(); i1++)
      reaction.getProduct_0(i1).ensureHelperArrays_0(15);
    this.removeMappingErrors(reaction);
    this.mMinFreeValence = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, reaction.getReactants_0(), 0, 2);
    for (i2 = 0; i2 < reaction.getReactants_0(); i2++) {
      reactant = reaction.getReactant_0(i2);
      this.mMinFreeValence[i2] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, reactant.getAtoms_0(), 15, 1);
      for (j = 0; j < reactant.getAtoms_0(); j++) {
        mapNo = reactant.getAtomMapNo_0(j);
        if (mapNo != 0) {
          for (k = 0; k < reaction.getProducts_0(); k++) {
            product = reaction.getProduct_0(k);
            for (l = 0; l < product.getAtoms_0(); l++) {
              if (product.getAtomMapNo_0(l) == mapNo) {
                dif = reactant.getFreeValence_0(j) - product.getFreeValence_0(l);
                this.mMinFreeValence[i2][j] = $wnd.Math.max(dif, 0);
              }
            }
          }
        }
      }
    }
    this.mIsReactionCenter = initUnidimensionalArray(cggl.Z_classLit, { 4: 1, 1: 1, 7: 1 }, 10, reaction.getProducts_0(), 0, 2);
    for (i = 0; i < reaction.getProducts_0(); i++) {
      product = reaction.getProduct_0(i);
      this.mIsReactionCenter[i] = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, product.getAtoms_0(), 16, 1);
      for (j = 0; j < product.getAtoms_0(); j++) {
        mapNo = product.getAtomMapNo_0(j);
        if (mapNo != 0) {
          for (k = 0; k < reaction.getReactants_0(); k++) {
            reactant = reaction.getReactant_0(k);
            for (l = 0; l < reactant.getAtoms_0(); l++) {
              if (reactant.getAtomMapNo_0(l) == mapNo) {
                if (new caru.IntArrayComparator().compare_2(this.getSortedConnectedMapNos(product, j), this.getSortedConnectedMapNos(reactant, l)) != 0 || new caru.IntArrayComparator().compare_2(this.getSortedConnectedAtomicNos(product, j), this.getSortedConnectedAtomicNos(reactant, l)) != 0)
                  this.mIsReactionCenter[i][j] = true;
              }
            }
          }
        }
      }
    }
    this.mSSSearcher = new carc2.SSSearcher();
    this.mMatchList = initUnidimensionalArray(cggl.Ljava_util_ArrayList_2_classLit, { 4: 1, 1: 1, 7: 1 }, 16, this.mReactant.length, 0, 1);
  };
  carcr.Reactor_0 = function Reactor_0(reaction, retainCoordinates) {
    carcr.$clinit_Reactor();
    carcr.Reactor.call(this, reaction, (retainCoordinates ? 1 : 0) + 4, 2147483647);
  };
  defineClass(240, 1, { 1: 1 }, carcr.Reactor_0);
  _.$init_134 = function $init_134() {
  };
  _.copyConfigurationFromGenericProduct = function copyConfigurationFromGenericProduct(genericProduct, genericProductAtom, product, productAtom) {
    var genericReactant, i, mapNo, reactantAtom;
    if (genericProduct.getAtomParity_0(genericProductAtom) != 0 && !genericProduct.isAtomParityPseudo_0(genericProductAtom) && eq(and_0(genericProduct.getAtomQueryFeatures(genericProductAtom), 3221225472), 0)) {
      mapNo = genericProduct.getAtomMapNo_0(genericProductAtom);
      if (mapNo != 0) {
        for (i = 0; i < this.mGenericReaction.getReactants_0(); i++) {
          genericReactant = this.mGenericReaction.getReactant_0(i);
          for (reactantAtom = 0; reactantAtom < genericReactant.getAtoms_0(); reactantAtom++) {
            if (genericReactant.getAtomMapNo_0(reactantAtom) == mapNo) {
              if (genericProduct.getConnAtoms_0(genericProductAtom) == product.getConnAtoms_0(productAtom))
                return true;
              if (neq(and_0(genericReactant.getAtomQueryFeatures(reactantAtom), 8192), 0))
                return true;
              if (genericReactant.getAtomESRType_0(reactantAtom) != genericProduct.getAtomESRType_0(genericProductAtom))
                return true;
              return false;
            }
          }
        }
      }
    }
    return false;
  };
  _.copyPseudoParitiesFromGenericProduct = function copyPseudoParitiesFromGenericProduct(genericProduct, firstPseudoParityAtom, product, newAtomNo, pseudoParityHandled) {
    var i, invertedAbsParityFound, matchingAbsParityFound, parity, ps, pseudoParity, pseudoParity$iterator, pseudoParityList, relatedAtom, relatedAtomCount;
    relatedAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, genericProduct.getAtoms_0(), 15, 1);
    relatedAtomCount = this.findRelatedPseudoParityAtoms(genericProduct, firstPseudoParityAtom, relatedAtom);
    matchingAbsParityFound = false;
    invertedAbsParityFound = false;
    pseudoParityList = new ju.ArrayList();
    for (i = 0; i < relatedAtomCount; i++) {
      if (genericProduct.isAtomParityPseudo_0(relatedAtom[i])) {
        pseudoParity = genericProduct.translateTHParity(relatedAtom[i], newAtomNo);
        if (pseudoParity == 1 || pseudoParity == 2) {
          parity = product.getAtomParity_0(newAtomNo[relatedAtom[i]]);
          if (parity == 1 || parity == 2) {
            if (pseudoParity == parity)
              matchingAbsParityFound = true;
            else
              invertedAbsParityFound = true;
          }
        }
        ps = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
        ps[0] = relatedAtom[i];
        ps[1] = pseudoParity;
        pseudoParityList.add(ps);
      }
    }
    if (!matchingAbsParityFound || !invertedAbsParityFound) {
      for (pseudoParity$iterator = pseudoParityList.iterator(); pseudoParity$iterator.hasNext_0(); ) {
        pseudoParity = castTo(pseudoParity$iterator.next_3(), 6);
        ps = pseudoParity[1];
        if ((ps == 1 || ps == 2) && invertedAbsParityFound)
          ps = ps == 1 ? 2 : 1;
        product.setAtomParity_0(newAtomNo[pseudoParity[0]], ps, true);
      }
    }
  };
  _.ensureProducts = function ensureProducts() {
    var atom, count, firstFreeMapNo, gr, i, index_0, j, matchListIndex, uniqueBuilder, uniqueList;
    if (jsNotEquals(this.mProduct, null))
      return;
    if (this.mFullyMapReactions) {
      firstFreeMapNo = this.mMaxGenericMapNo + 1;
      this.mReactantMapNo = initUnidimensionalArray(cggl.I_classLit, { 4: 1, 1: 1, 7: 1 }, 25, this.mReactant.length, 0, 3);
      for (i = 0; i < this.mReactant.length; i++) {
        this.mReactantMapNo[i] = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, this.mMatchList[i].size(), 0, 2);
        for (j = 0; j < this.mMatchList[i].size(); j++)
          this.mReactantMapNo[i][j] = this.getReactantMapNos(i, castTo(this.mMatchList[i].getAtIndex(j), 6), firstFreeMapNo);
        firstFreeMapNo += this.mReactant[i].getAtoms_0();
        gr = this.mGenericReaction.getReactant_0(i);
        for (atom = 0; atom < gr.getAtoms_0(); atom++)
          if (!gr.isExcludeGroupAtom(atom))
            firstFreeMapNo--;
      }
    }
    this.mProduct = initMultidimensionalArray(cggl.Lcom_actelion_research_chem_StereoMolecule_2_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 95: 1, 4: 1, 1: 1, 7: 1 }], [95, 17], 0, [this.mReactantMatchCombinationCount, this.mGenericReaction.getProducts_0()], 2);
    this.mIDCode = initMultidimensionalArray(cggl.Ljava_lang_String_2_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 4: 1, 1: 1, 7: 1, 9: 1 }], [9, 2], 6, [this.mReactantMatchCombinationCount, this.mGenericReaction.getProducts_0()], 2);
    this.mIsDuplicate = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mReactantMatchCombinationCount, 16, 1);
    uniqueList = new carc2.SortedStringList();
    uniqueBuilder = new jl.StringBuilder();
    index_0 = 0;
    count = 0;
    if (this.mReactantMatchCombinationCount != 0) {
      matchListIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mReactant.length, 15, 1);
      do {
        uniqueBuilder.setLength(0);
        for (i = 0; i < this.mGenericReaction.getProducts_0(); i++) {
          setCheck(this.mProduct[index_0], i, this.generateProduct(this.mMatchList, matchListIndex, i));
          this.mIDCode[index_0][i] = new carc2.Canonizer(this.mProduct[index_0][i]).getIDCode_0();
          uniqueBuilder.append_9(this.mIDCode[index_0][i]);
        }
        this.mIsDuplicate[index_0] = uniqueList.addString(uniqueBuilder.toString_0()) == -1;
        if (!this.mUniqueProductsOnly || !this.mIsDuplicate[index_0])
          count++;
        index_0++;
      } while (this.nextMatchListCombination(matchListIndex) && count < this.mMaxCount);
    }
  };
  _.findRelatedPseudoParityAtoms = function findRelatedPseudoParityAtoms(genericProduct, firstAtom, relatedAtom) {
    var connAtom, connBond, current, i, isRelated, relatedAtoms;
    isRelated = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, genericProduct.getAtoms_0(), 16, 1);
    relatedAtom[0] = firstAtom;
    relatedAtoms = 1;
    isRelated[firstAtom] = true;
    for (current = 0; current < relatedAtoms; current++) {
      for (i = 0; i < genericProduct.getConnAtoms_0(relatedAtom[current]); i++) {
        connBond = genericProduct.getConnBond_0(relatedAtom[current], i);
        if (genericProduct.isRingBond_0(connBond) || genericProduct.getBondOrder_0(connBond) == 2 || genericProduct.isBINAPChiralityBond_0(connBond)) {
          connAtom = genericProduct.getConnAtom_0(relatedAtom[current], i);
          if (!isRelated[connAtom]) {
            relatedAtom[relatedAtoms++] = connAtom;
            isRelated[connAtom] = true;
          }
        }
      }
    }
    return relatedAtoms;
  };
  _.generateProduct = function generateProduct(matchList, matchListIndex, genericProductNo) {
    var atom, atom$iterator, atom0, atom1, atom2, atom3, bond, bondAtom1, bondAtom2, connAtom, esrGroup, esrGroupCountAND, esrGroupCountOR, esrGroupsChanged, esrType, excludeAtom, excludeBond, excludedAtom, found, found0, genericProduct, genericReactant, gpBond, gpMapNo1, gpMapNo2, grAtom1, grAtom2, grBond, grMapNo1, grMapNo2, i, i0, includeAtom, inversion, j, j$array, j$index, j$max, j0, j1, j2, j3, j4, j5, j6, k, k0, l, m, mapNo, matchingAtom, mode, newAtomNo, newAtomNo0, otherConnAtom, parity, product, productBond, productParityHint, productQFBondType, pseudoParityHandled, rAtom1, rAtom2, rBond, rBondOrder, rBondType, racemicAtomList, reactantQFBondType;
    genericProduct = this.mGenericReaction.getProduct_0(genericProductNo);
    product = new carc2.StereoMolecule();
    esrGroupCountAND = 0;
    esrGroupCountOR = 0;
    racemicAtomList = null;
    for (i0 = 0; i0 < this.mReactant.length; i0++) {
      genericReactant = this.mGenericReaction.getReactant_0(i0);
      this.mReactant[i0].ensureHelperArrays_0(1);
      matchingAtom = castTo(matchList[i0].getAtIndex(matchListIndex[i0]), 6);
      mapNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mReactant[i0].getAtoms_0(), 15, 1);
      excludeAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mReactant[i0].getAtoms_0(), 16, 1);
      excludeBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mReactant[i0].getBonds_0(), 16, 1);
      for (j0 = 0; j0 < genericReactant.getAtoms_0(); j0++) {
        if (matchingAtom[j0] != -1) {
          if (genericReactant.getAtomMapNo_0(j0) == 0) {
            excludedAtom = matchingAtom[j0];
            excludeAtom[excludedAtom] = true;
            for (k0 = 0; k0 < this.mReactant[i0].getConnAtoms_0(excludedAtom); k0++)
              excludeBond[this.mReactant[i0].getConnBond_0(excludedAtom, k0)] = true;
            for (k = this.mReactant[i0].getAllConnAtoms_0(excludedAtom); k < this.mReactant[i0].getAllConnAtomsPlusMetalBonds_0(excludedAtom); k++)
              excludeBond[this.mReactant[i0].getConnBond_0(excludedAtom, k)] = true;
          } else {
            mapNo[matchingAtom[j0]] = genericReactant.getAtomMapNo_0(j0);
          }
        }
      }
      for (j1 = 0; j1 < genericReactant.getBonds_0(); j1++) {
        bondAtom1 = genericReactant.getBondAtom_0(0, j1);
        bondAtom2 = genericReactant.getBondAtom_0(1, j1);
        if (genericReactant.getAtomMapNo_0(bondAtom1) != 0 && genericReactant.getAtomMapNo_0(bondAtom2) != 0) {
          atom1 = matchingAtom[bondAtom1];
          atom2 = matchingAtom[bondAtom2];
          if (atom1 != -1 && atom2 != -1) {
            for (k = 0; k < this.mReactant[i0].getBonds_0(); k++) {
              if (this.mReactant[i0].getBondAtom_0(0, k) == atom1 && this.mReactant[i0].getBondAtom_0(1, k) == atom2 || this.mReactant[i0].getBondAtom_0(0, k) == atom2 && this.mReactant[i0].getBondAtom_0(1, k) == atom1) {
                excludeBond[k] = true;
                break;
              }
            }
          }
        }
      }
      newAtomNo0 = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mReactant[i0].getAtoms_0(), 15, 1);
      for (j2 = 0; j2 < this.mReactant[i0].getAtoms_0(); j2++) {
        if (!excludeAtom[j2]) {
          newAtomNo0[j2] = this.mReactant[i0].copyAtom_0(product, j2, esrGroupCountAND, esrGroupCountOR);
          if (this.mFullyMapReactions)
            product.setAtomMapNo_0(newAtomNo0[j2], this.mReactantMapNo[i0][matchListIndex[i0]][j2], false);
          if (mapNo[j2] != 0) {
            product.setAtomMapNo_0(newAtomNo0[j2], mapNo[j2], false);
            for (k = 0; k < genericProduct.getAtoms_0(); k++) {
              if (genericProduct.getAtomMapNo_0(k) == mapNo[j2]) {
                product.setAtomCharge_0(newAtomNo0[j2], genericProduct.getAtomCharge_0(k));
                product.setAtomRadical_0(newAtomNo0[j2], genericProduct.getAtomRadical_0(k));
                if (this.mIsReactionCenter[genericProductNo][k]) {
                  parity = this.mReactant[i0].getAtomParity_0(j2);
                  productParityHint = and_0(genericProduct.getAtomQueryFeatures(k), 3221225472);
                  if (eq(productParityHint, 0)) {
                    product.setAtomParity_0(newAtomNo0[j2], 3, false);
                  } else if (eq(productParityHint, 3221225472)) {
                    if (isNull(racemicAtomList))
                      racemicAtomList = new ju.ArrayList();
                    racemicAtomList.add(jl.valueOf_12(newAtomNo0[j2]));
                  } else {
                    if (parity == 1 || parity == 2) {
                      inversion = eq(productParityHint, 2147483648);
                      for (l = 0; l < this.mReactant[i0].getConnAtoms_0(j2); l++) {
                        connAtom = this.mReactant[i0].getConnAtom_0(j2, l);
                        if (excludeAtom[connAtom]) {
                          for (m = 0; m < this.mReactant[i0].getConnAtoms_0(j2); m++) {
                            otherConnAtom = this.mReactant[i0].getConnAtom_0(j2, m);
                            if (!excludeAtom[otherConnAtom] && otherConnAtom > connAtom)
                              inversion = !inversion;
                          }
                        }
                      }
                      if (inversion)
                        parity = parity == 1 ? 2 : 1;
                      product.setAtomParity_0(newAtomNo0[j2], parity, false);
                    } else {
                      product.setAtomParity_0(newAtomNo0[j2], 0, false);
                    }
                  }
                }
                break;
              }
            }
          }
        }
      }
      for (j3 = 0; j3 < this.mReactant[i0].getBonds_0(); j3++)
        if (!excludeBond[j3])
          this.mReactant[i0].copyBond_1(product, j3, esrGroupCountAND, esrGroupCountOR, newAtomNo0, true);
      esrGroupCountAND = product.renumberESRGroups_0(1);
      esrGroupCountOR = product.renumberESRGroups_0(2);
    }
    newAtomNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, genericProduct.getAtoms_0(), 15, 1);
    for (j4 = 0; j4 < genericProduct.getAtoms_0(); j4++) {
      mapNo = genericProduct.getAtomMapNo_0(j4);
      if (mapNo == 0) {
        newAtomNo[j4] = genericProduct.copyAtom_0(product, j4, esrGroupCountAND, esrGroupCountOR);
      } else {
        for (k = 0; k < product.getAllAtoms_0(); k++) {
          if (product.getAtomMapNo_0(k) == mapNo) {
            newAtomNo[j4] = k;
            break;
          }
        }
      }
    }
    if (this.mRetainCoordinates) {
      for (j0 = 0; j0 < genericProduct.getAtoms_0(); j0++) {
        product.setAtomMarker_0(newAtomNo[j0], true);
        product.setAtomX_0(newAtomNo[j0], genericProduct.getAtomX_0(j0));
        product.setAtomY_0(newAtomNo[j0], genericProduct.getAtomY_0(j0));
      }
    }
    for (gpBond = 0; gpBond < genericProduct.getBonds_0(); gpBond++) {
      if (genericProduct.isBondBridge_0(gpBond))
        continue;
      productBond = genericProduct.copyBond_1(product, gpBond, esrGroupCountAND, esrGroupCountOR, newAtomNo, false);
      productQFBondType = genericProduct.getBondQueryFeatures_0(gpBond) & 31;
      if (productQFBondType != 0) {
        found0 = false;
        product.setBondQueryFeature_0(productBond, 31, false);
        gpMapNo1 = genericProduct.getAtomMapNo_0(genericProduct.getBondAtom_0(0, gpBond));
        gpMapNo2 = genericProduct.getAtomMapNo_0(genericProduct.getBondAtom_0(1, gpBond));
        for (i = 0; !found0 && i < this.mGenericReaction.getReactants_0(); i++) {
          genericReactant = this.mGenericReaction.getReactant_0(i);
          for (grBond = 0; !found0 && grBond < genericReactant.getBonds_0(); grBond++) {
            grAtom1 = genericReactant.getBondAtom_0(0, grBond);
            grAtom2 = genericReactant.getBondAtom_0(1, grBond);
            grMapNo1 = genericReactant.getAtomMapNo_0(grAtom1);
            grMapNo2 = genericReactant.getAtomMapNo_0(grAtom2);
            if (grMapNo1 != 0 && grMapNo2 != 0 && (grMapNo1 == gpMapNo1 && grMapNo2 == gpMapNo2 || grMapNo1 == gpMapNo2 && grMapNo2 == gpMapNo1)) {
              found0 = true;
              reactantQFBondType = genericReactant.getBondQueryFeatures_0(grBond) & 31;
              if (reactantQFBondType != 0) {
                matchingAtom = castTo(matchList[i].getAtIndex(matchListIndex[i]), 6);
                rAtom1 = matchingAtom[grAtom1];
                rAtom2 = matchingAtom[grAtom2];
                rBond = this.mReactant[i].getBond_0(rAtom1, rAtom2);
                rBondType = this.mReactant[i].getBondType_0(rBond);
                rBondOrder = this.mReactant[i].getBondOrder_0(rBond);
                reactantQFBondType &= 1 | 2 | 4;
                productQFBondType &= 1 | 2 | 4;
                if (reactantQFBondType == (1 | 2) && productQFBondType == (2 | 4)) {
                  product.setBondType_0(productBond, rBondOrder <= 1 ? 2 : 4);
                } else if (reactantQFBondType == (2 | 4) && productQFBondType == (1 | 2)) {
                  product.setBondType_0(productBond, rBondOrder == 3 ? 2 : 1);
                } else {
                  product.setBondType_0(productBond, rBondType);
                }
              }
            }
          }
        }
      }
    }
    product.ensureHelperArrays_0(1);
    esrGroupsChanged = false;
    for (j5 = 0; j5 < genericProduct.getAtoms_0(); j5++) {
      if (genericProduct.getAtomMapNo_0(j5) == 0) {
        parity = genericProduct.translateTHParity(j5, newAtomNo);
        product.setAtomParity_0(newAtomNo[j5], parity, false);
      } else if (this.mIsReactionCenter[genericProductNo][j5] && this.copyConfigurationFromGenericProduct(genericProduct, j5, product, newAtomNo[j5])) {
        parity = genericProduct.translateTHParity(j5, newAtomNo);
        product.setAtomParity_0(newAtomNo[j5], parity, false);
        if (parity == 1 || parity == 2) {
          esrType = genericProduct.getAtomESRType_0(j5);
          esrGroup = genericProduct.getAtomESRGroup_0(j5);
          if (esrType == 1)
            esrGroup += esrGroupCountAND;
          else if (esrType == 2)
            esrGroup += esrGroupCountOR;
          product.setAtomESR_0(newAtomNo[j5], esrType, esrGroup);
          esrGroupsChanged = true;
        }
      }
    }
    if (esrGroupsChanged) {
      esrGroupCountAND = product.renumberESRGroups_0(1);
      esrGroupCountOR = product.renumberESRGroups_0(2);
    }
    pseudoParityHandled = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, genericProduct.getAllAtoms_0(), 16, 1);
    for (j6 = 0; j6 < genericProduct.getAtoms_0(); j6++)
      if (this.mIsReactionCenter[genericProductNo][j6] && !pseudoParityHandled[j6] && genericProduct.isAtomParityPseudo_0(j6) && eq(and_0(genericProduct.getAtomQueryFeatures(j6), 3221225472), 0) && genericProduct.getConnAtoms_0(j6) == product.getConnAtoms_0(newAtomNo[j6]))
        this.copyPseudoParitiesFromGenericProduct(genericProduct, j6, product, newAtomNo, pseudoParityHandled);
    includeAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, product.getAllAtoms_0(), 16, 1);
    for (j$array = newAtomNo, j$index = 0, j$max = j$array.length; j$index < j$max; ++j$index) {
      j = j$array[j$index];
      includeAtom[j] = true;
    }
    found = true;
    while (found) {
      found = false;
      for (bond = 0; bond < product.getAllBonds_0(); bond++) {
        atom1 = product.getBondAtom_0(0, bond);
        atom2 = product.getBondAtom_0(1, bond);
        if (includeAtom[atom1] && !includeAtom[atom2]) {
          includeAtom[atom2] = true;
          found = true;
        } else if (includeAtom[atom2] && !includeAtom[atom1]) {
          includeAtom[atom1] = true;
          found = true;
        }
      }
    }
    for (atom0 = 0; atom0 < product.getAllAtoms_0(); atom0++)
      product.setAtomSelection_0(atom0, !includeAtom[atom0]);
    product.deleteSelectedAtoms_0();
    if (!this.mFullyMapReactions)
      for (atom3 = 0; atom3 < product.getAllAtoms_0(); atom3++)
        product.setAtomMapNo_0(atom3, 0, false);
    new carc2.AromaticityResolver(product).locateDelocalizedDoubleBonds(null);
    product.setParitiesValid_0(0);
    mode = 2 | (this.mRetainCoordinates ? 8 : 0);
    new carcc3.CoordinateInventor_0(mode).invent(product);
    if (isNotNull(racemicAtomList)) {
      product.ensureHelperArrays_0(15);
      for (atom$iterator = racemicAtomList.iterator(); atom$iterator.hasNext_0(); ) {
        atom = castTo(atom$iterator.next_3(), 35).intValue();
        if (product.isAtomStereoCenter_0(atom)) {
          product.setAtomParity_0(atom, 1, false);
          product.setAtomESR_0(atom, 1, esrGroupCountAND++);
        }
      }
    }
    return product;
  };
  _.getProductCount = function getProductCount() {
    var count, i;
    count = this.mReactantMatchCombinationCount;
    if (this.mUniqueProductsOnly) {
      for (i = 0; i < this.mReactantMatchCombinationCount; i++)
        if (this.mIsDuplicate[i])
          count--;
    }
    if (this.mMaxCount > 0 && count > this.mMaxCount)
      count = this.mMaxCount;
    return count;
  };
  _.getProducts_1 = function getProducts_0() {
    var count, i, uniqueProduct;
    this.ensureProducts();
    uniqueProduct = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_StereoMolecule_2_classLit, { 4: 1, 1: 1, 7: 1 }, 95, this.getProductCount(), 0, 2);
    count = 0;
    for (i = 0; i < this.mReactantMatchCombinationCount && count < this.mMaxCount; i++)
      if (!this.mUniqueProductsOnly || !this.mIsDuplicate[i])
        setCheck(uniqueProduct, count++, this.mProduct[i]);
    return uniqueProduct;
  };
  _.getReactantMapNos = function getReactantMapNos(reactant, matchList, firstMapNo) {
    var atom, genericReactant, i, reactantMapNo;
    reactantMapNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mReactant[reactant].getAtoms_0(), 15, 1);
    ju.fill_0(reactantMapNo, -1);
    genericReactant = this.mGenericReaction.getReactant_0(reactant);
    for (atom = 0; atom < genericReactant.getAtoms_0(); atom++)
      if (matchList[atom] != -1)
        reactantMapNo[matchList[atom]] = genericReactant.getAtomMapNo_0(atom);
    for (i = 0; i < reactantMapNo.length; i++)
      if (reactantMapNo[i] == -1)
        reactantMapNo[i] = firstMapNo++;
    return reactantMapNo;
  };
  _.getSortedConnectedAtomicNos = function getSortedConnectedAtomicNos(mol, atom) {
    var atomicNo, connAtom, i, index_0;
    atomicNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getConnAtoms_0(atom) - mol.getExcludedNeighbourCount_0(atom), 15, 1);
    index_0 = 0;
    for (i = 0; i < mol.getConnAtoms_0(atom); i++) {
      connAtom = mol.getConnAtom_0(atom, i);
      if (!mol.isExcludeGroupAtom(connAtom))
        atomicNo[index_0++] = mol.getAtomicNo_0(connAtom);
    }
    ju.sort_3(atomicNo);
    return atomicNo;
  };
  _.getSortedConnectedMapNos = function getSortedConnectedMapNos(mol, atom) {
    var connAtom, i, index_0, mapNo;
    mapNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getConnAtoms_0(atom) - mol.getExcludedNeighbourCount_0(atom), 15, 1);
    index_0 = 0;
    for (i = 0; i < mol.getConnAtoms_0(atom); i++) {
      connAtom = mol.getConnAtom_0(atom, i);
      if (!mol.isExcludeGroupAtom(connAtom))
        mapNo[index_0++] = mol.getAtomMapNo_0(connAtom);
    }
    ju.sort_3(mapNo);
    return mapNo;
  };
  _.nextMatchListCombination = function nextMatchListCombination(matchListIndex) {
    var i;
    for (i = 0; i < matchListIndex.length; i++) {
      if (matchListIndex[i] < this.mMatchList[i].size() - 1) {
        matchListIndex[i]++;
        return true;
      }
      matchListIndex[i] = 0;
    }
    return false;
  };
  _.removeMappingErrors = function removeMappingErrors(rxn) {
    var atom, i, i0, i1, i2, mapNo, mol, product, reactant, used;
    this.mMaxGenericMapNo = 0;
    for (i0 = 0; i0 < rxn.getMolecules_0(); i0++) {
      mol = this.mGenericReaction.getMolecule_1(i0);
      for (atom = 0; atom < mol.getAtoms_0(); atom++) {
        if (mol.isExcludeGroupAtom(atom))
          mol.setAtomMapNo_0(atom, 0, false);
        else if (this.mMaxGenericMapNo < mol.getAtomMapNo_0(atom))
          this.mMaxGenericMapNo = mol.getAtomMapNo_0(atom);
      }
    }
    used = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMaxGenericMapNo + 1, 16, 1);
    for (i1 = 0; i1 < rxn.getReactants_0(); i1++) {
      reactant = rxn.getReactant_0(i1);
      for (atom = 0; atom < reactant.getAtoms_0(); atom++) {
        mapNo = reactant.getAtomMapNo_0(atom);
        if (mapNo != 0)
          used[mapNo] = true;
      }
    }
    for (i2 = 0; i2 < rxn.getProducts_0(); i2++) {
      product = rxn.getProduct_0(i2);
      for (atom = 0; atom < product.getAtoms_0(); atom++) {
        mapNo = product.getAtomMapNo_0(atom);
        if (mapNo != 0) {
          if (!used[mapNo])
            product.setAtomMapNo_0(atom, 0, false);
          else
            used[mapNo] = false;
        }
      }
    }
    for (i = 0; i < rxn.getReactants_0(); i++) {
      reactant = rxn.getReactant_0(i);
      for (atom = 0; atom < reactant.getAtoms_0(); atom++) {
        mapNo = reactant.getAtomMapNo_0(atom);
        if (mapNo != 0 && used[mapNo])
          reactant.setAtomMapNo_0(atom, 0, false);
      }
    }
  };
  _.setReactant_0 = function setReactant(no, reactant) {
    var correction, genericReactant, i, j, k, matchMode, matchingAtom, valence;
    setCheck(this.mReactant, no, reactant);
    this.mProduct = null;
    genericReactant = this.mGenericReaction.getReactant_0(no);
    this.mSSSearcher.setMol_0(genericReactant, this.mReactant[no]);
    matchMode = 8 + (this.mAllowChargeCorrections ? 0 : 1);
    if (this.mSSSearcher.findFragmentInMolecule(5, matchMode) == 0) {
      setCheck(this.mMatchList, no, new ju.ArrayList());
      this.mReactantMatchCombinationCount = 0;
      return false;
    }
    setCheck(this.mMatchList, no, this.mSSSearcher.getMatchList());
    for (j = this.mMatchList[no].size() - 1; j >= 0; j--) {
      matchingAtom = castTo(this.mMatchList[no].getAtIndex(j), 6);
      for (k = 0; k < matchingAtom.length; k++) {
        if (matchingAtom[k] != -1) {
          correction = 0;
          if (this.mAllowChargeCorrections && genericReactant.getAtomCharge_0(k) == 0 && this.mReactant[no].getAtomCharge_0(matchingAtom[k]) != 0) {
            valence = this.mReactant[no].getMaxValenceUncharged_0(matchingAtom[k]);
            correction = this.mReactant[no].getElectronValenceCorrection_0(matchingAtom[k], valence);
          }
          if (this.mMinFreeValence[no][k] > 0 && this.mMinFreeValence[no][k] > this.mReactant[no].getFreeValence_0(matchingAtom[k]) - correction) {
            this.mMatchList[no].removeAtIndex(j);
            break;
          }
        }
      }
    }
    this.mReactantMatchCombinationCount = 1;
    for (i = 0; i < this.mReactant.length; i++)
      this.mReactantMatchCombinationCount *= isNull(this.mMatchList[i]) ? 0 : this.mMatchList[i].size();
    return true;
  };
  _.mAllowChargeCorrections = false;
  _.mFullyMapReactions = false;
  _.mMaxCount = 0;
  _.mMaxGenericMapNo = 0;
  _.mReactantMatchCombinationCount = 0;
  _.mRetainCoordinates = false;
  _.mUniqueProductsOnly = false;
  carcr.MODE_ALLOW_CHARGE_CORRECTIONS = 8;
  carcr.MODE_FULLY_MAP_REACTIONS = 2;
  carcr.MODE_REMOVE_DUPLICATE_PRODUCTS = 4;
  carcr.MODE_RETAIN_COORDINATES = 1;
  cggl.Lcom_actelion_research_chem_reaction_Reactor_2_classLit = createForClass("com.actelion.research.chem.reaction", "Reactor", 240, cggl.Ljava_lang_Object_2_classLit);
  carcr.$clinit_Transformer = function $clinit_Transformer() {
    carcr.$clinit_Transformer = emptyMethod;
    jl.$clinit_Object();
  };
  carcr.Transformer = function Transformer2(reactant, product, name_0) {
    carcr.$clinit_Transformer();
    var bond, bond0, dif, i, i0, index_0, j, rule;
    Object_0.call(this);
    this.$init_135();
    this.mName = name_0;
    reactant.ensureHelperArrays_0(7);
    product.ensureHelperArrays_0(7);
    this.mBondGain = product.getBonds_0() - reactant.getBonds_0();
    this.mReactant = reactant;
    this.mRuleList = new caru.SortedList();
    for (bond0 = 0; bond0 < reactant.getBonds_0(); bond0++)
      this.mRuleList.add_10(new carcr.TransformerRule(reactant, bond0));
    for (bond = 0; bond < product.getBonds_0(); bond++) {
      rule = new carcr.TransformerRule(product, bond);
      index_0 = this.mRuleList.getIndex_0(rule);
      if (index_0 == -1) {
        rule.finishProductOnly();
        this.mRuleList.add_10(rule);
      } else {
        castTo(this.mRuleList.get_3(index_0), 88).finishWithProduct(rule);
      }
    }
    for (i0 = this.mRuleList.size_1() - 1; i0 >= 0; i0--) {
      rule = castTo(this.mRuleList.get_3(i0), 88);
      if (!rule.isFinished())
        rule.finishNoProduct();
      else if (castTo(this.mRuleList.get_3(i0), 88).isNoChange())
        this.mRuleList.remove_0(i0);
    }
    this.mMinFreeValence = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, reactant.getAtoms_0(), 15, 1);
    for (i = 0; i < reactant.getAtoms_0(); i++) {
      for (j = 0; j < product.getAtoms_0(); j++) {
        if (product.getAtomMapNo_0(j) == reactant.getAtomMapNo_0(i)) {
          dif = reactant.getFreeValence_0(i) - product.getFreeValence_0(j);
          this.mMinFreeValence[i] = dif > 0 ? dif : 0;
          break;
        }
      }
    }
    this.mSSSearcher = new carc2.SSSearcher();
  };
  defineClass(329, 1, { 1: 1 }, carcr.Transformer);
  _.$init_135 = function $init_135() {
  };
  _.applyTransformation_1 = function applyTransformation_0(mol, matchNo) {
    var i, matchAtom, rule;
    mol.ensureHelperArrays_0(1);
    matchAtom = castTo(this.mMatchList.getAtIndex(matchNo), 6);
    for (i = 0; i < this.mRuleList.size_1(); i++) {
      rule = castTo(this.mRuleList.get_3(i), 88);
      rule.adaptBondOrder(mol, matchAtom);
    }
    mol.deleteMarkedAtomsAndBonds_0();
  };
  _.getName_0 = function getName_3() {
    return this.mName;
  };
  _.setMolecule_3 = function setMolecule_2(molecule, countMode) {
    var j, k, matchMode, matchingAtom;
    this.mTargetMolecule = molecule;
    this.mSSSearcher.setMol_0(this.mReactant, this.mTargetMolecule);
    matchMode = 8;
    if (this.mSSSearcher.findFragmentInMolecule(countMode, matchMode) == 0) {
      this.mMatchList = null;
      return 0;
    }
    this.mMatchList = this.mSSSearcher.getMatchList();
    for (j = this.mMatchList.size() - 1; j >= 0; j--) {
      matchingAtom = castTo(this.mMatchList.getAtIndex(j), 6);
      for (k = 0; k < matchingAtom.length; k++) {
        if (matchingAtom[k] != -1) {
          if (this.mMinFreeValence[k] > 0 && this.mMinFreeValence[k] > this.mTargetMolecule.getFreeValence_0(matchingAtom[k])) {
            this.mMatchList.removeAtIndex(j);
            break;
          }
        }
      }
    }
    return this.mMatchList.size();
  };
  _.mBondGain = 0;
  cggl.Lcom_actelion_research_chem_reaction_Transformer_2_classLit = createForClass("com.actelion.research.chem.reaction", "Transformer", 329, cggl.Ljava_lang_Object_2_classLit);
  carcr.$clinit_TransformerRule = function $clinit_TransformerRule() {
    carcr.$clinit_TransformerRule = emptyMethod;
    jl.$clinit_Object();
  };
  carcr.TransformerRule = function TransformerRule(mol, bond) {
    carcr.$clinit_TransformerRule();
    var bondType, mapNo1, mapNo2;
    Object_0.call(this);
    this.$init_136();
    this.mAtom1 = mol.getBondAtom_0(0, bond);
    this.mAtom2 = mol.getBondAtom_0(1, bond);
    mapNo1 = mol.getAtomMapNo_0(this.mAtom1);
    mapNo2 = mol.getAtomMapNo_0(this.mAtom2);
    if (mapNo1 < mapNo2) {
      this.mMapNo1 = mapNo1;
      this.mMapNo2 = mapNo2;
    } else {
      this.mMapNo1 = mapNo2;
      this.mMapNo2 = mapNo1;
    }
    this.mBondQFTypes = mol.getBondQueryFeatures_0(bond) & 31;
    bondType = mol.getBondTypeSimple_0(bond);
    if (bondType == 16)
      this.mBondQFTypes |= 16;
    else if (bondType == 2)
      this.mBondQFTypes |= 2;
    else if (bondType == 4)
      this.mBondQFTypes |= 4;
    else
      this.mBondQFTypes |= 1;
    this.mType = (carcr.$clinit_TransformerRule$TYPE(), carcr.UNKNOWN);
  };
  defineClass(88, 1, { 88: 1, 22: 1, 1: 1 }, carcr.TransformerRule);
  _.$init_136 = function $init_136() {
  };
  _.compareTo_1 = function compareTo_20(o) {
    return this.compareTo_10(castTo(o, 88));
  };
  _.adaptBondOrder = function adaptBondOrder(mol, matchAtom) {
    var atom1, atom2, bond, targetBondOrder;
    atom1 = matchAtom[this.mAtom1];
    atom2 = matchAtom[this.mAtom2];
    if (jsEquals(this.mType, (carcr.$clinit_TransformerRule$TYPE(), carcr.CREATE))) {
      mol.addBond_1(atom1, atom2, this.mTargetBondType);
      return true;
    } else {
      bond = mol.getBond_0(atom1, atom2);
      if (jsEquals(this.mType, (carcr.$clinit_TransformerRule$TYPE(), carcr.CHANGE_ABS))) {
        mol.setBondType_0(bond, this.mTargetBondType);
        return true;
      } else if (jsEquals(this.mType, (carcr.$clinit_TransformerRule$TYPE(), carcr.CHANGE_DIF))) {
        targetBondOrder = mol.getBondOrder_0(bond) + this.mTargetBondDif;
        if (targetBondOrder >= 0 && targetBondOrder <= 3) {
          mol.setBondType_0(bond, carc2.bondOrderToType(targetBondOrder, true));
          return true;
        }
      } else if (jsEquals(this.mType, (carcr.$clinit_TransformerRule$TYPE(), carcr.REMOVE))) {
        mol.markBondForDeletion_0(bond);
        return true;
      }
    }
    return false;
  };
  _.compareTo_10 = function compareTo_19(o) {
    if (this.mMapNo1 != o.mMapNo1)
      return this.mMapNo1 < o.mMapNo1 ? -1 : 1;
    if (this.mMapNo2 != o.mMapNo2)
      return this.mMapNo2 < o.mMapNo2 ? -1 : 1;
    return 0;
  };
  _.equals_0 = function equals_16(o) {
    return this.mMapNo1 == castTo(o, 88).mMapNo1 && this.mMapNo2 == castTo(o, 88).mMapNo2;
  };
  _.finishNoProduct = function finishNoProduct() {
    this.mType = (carcr.$clinit_TransformerRule$TYPE(), carcr.REMOVE);
  };
  _.finishProductOnly = function finishProductOnly() {
    this.mType = (carcr.$clinit_TransformerRule$TYPE(), carcr.CREATE);
  };
  _.finishWithProduct = function finishWithProduct(productRule) {
    var sourceBondOrder, targetBondOrder;
    if (this.mBondQFTypes == productRule.mBondQFTypes) {
      this.mType = (carcr.$clinit_TransformerRule$TYPE(), carcr.NO_CHANGE);
    } else if (bitCount_1(productRule.mBondQFTypes) == 1) {
      this.mTargetBondType = productRule.mBondQFTypes == 1 ? 1 : productRule.mBondQFTypes == 2 ? 386 : productRule.mBondQFTypes == 4 ? 4 : productRule.mBondQFTypes == 16 ? 16 : 8;
      this.mType = (carcr.$clinit_TransformerRule$TYPE(), carcr.CHANGE_ABS);
    } else {
      sourceBondOrder = (this.mBondQFTypes & 16) != 0 ? 0 : (this.mBondQFTypes & 1) != 0 ? 1 : (this.mBondQFTypes & 2) != 0 ? 2 : 3;
      targetBondOrder = (productRule.mBondQFTypes & 16) != 0 ? 0 : (productRule.mBondQFTypes & 1) != 0 ? 1 : (productRule.mBondQFTypes & 2) != 0 ? 2 : 3;
      if (targetBondOrder == sourceBondOrder)
        this.mType = (carcr.$clinit_TransformerRule$TYPE(), carcr.NO_CHANGE);
      else {
        this.mTargetBondDif = targetBondOrder - sourceBondOrder;
        this.mType = (carcr.$clinit_TransformerRule$TYPE(), carcr.CHANGE_DIF);
      }
    }
  };
  _.isFinished = function isFinished() {
    return jsNotEquals(this.mType, (carcr.$clinit_TransformerRule$TYPE(), carcr.UNKNOWN));
  };
  _.isNoChange = function isNoChange() {
    return jsEquals(this.mType, (carcr.$clinit_TransformerRule$TYPE(), carcr.NO_CHANGE));
  };
  _.mAtom1 = 0;
  _.mAtom2 = 0;
  _.mBondQFTypes = 0;
  _.mMapNo1 = 0;
  _.mMapNo2 = 0;
  _.mTargetBondDif = 0;
  _.mTargetBondType = 0;
  cggl.Lcom_actelion_research_chem_reaction_TransformerRule_2_classLit = createForClass("com.actelion.research.chem.reaction", "TransformerRule", 88, cggl.Ljava_lang_Object_2_classLit);
  carcr.$clinit_TransformerRule$TYPE = function $clinit_TransformerRule$TYPE() {
    carcr.$clinit_TransformerRule$TYPE = emptyMethod;
    jl.$clinit_Enum();
    carcr.CREATE = new carcr.TransformerRule$TYPE("CREATE", 0);
    carcr.CHANGE_DIF = new carcr.TransformerRule$TYPE("CHANGE_DIF", 1);
    carcr.CHANGE_ABS = new carcr.TransformerRule$TYPE("CHANGE_ABS", 2);
    carcr.REMOVE = new carcr.TransformerRule$TYPE("REMOVE", 3);
    carcr.NO_CHANGE = new carcr.TransformerRule$TYPE("NO_CHANGE", 4);
    carcr.UNKNOWN = new carcr.TransformerRule$TYPE("UNKNOWN", 5);
  };
  carcr.TransformerRule$TYPE = function TransformerRule$TYPE(enum$name, enum$ordinal) {
    Enum.call(this, enum$name, enum$ordinal);
    this.$init_137();
  };
  carcr.valueOf_3 = function valueOf_3(name_0) {
    carcr.$clinit_TransformerRule$TYPE();
    return valueOf((carcr.$clinit_TransformerRule$TYPE$Map(), carcr.$MAP_2), name_0);
  };
  carcr.values_3 = function values_3() {
    carcr.$clinit_TransformerRule$TYPE();
    return stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_actelion_research_chem_reaction_TransformerRule$TYPE_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 113, 0, [carcr.CREATE, carcr.CHANGE_DIF, carcr.CHANGE_ABS, carcr.REMOVE, carcr.NO_CHANGE, carcr.UNKNOWN]);
  };
  defineClass(113, 48, { 113: 1, 4: 1, 22: 1, 48: 1, 1: 1 }, carcr.TransformerRule$TYPE);
  _.$init_137 = function $init_137() {
  };
  cggl.Lcom_actelion_research_chem_reaction_TransformerRule$TYPE_2_classLit = createForEnum("com.actelion.research.chem.reaction", "TransformerRule/TYPE", 113, cggl.Ljava_lang_Enum_2_classLit, carcr.values_3, carcr.valueOf_3);
  carcr.$clinit_TransformerRule$TYPE$Map = function $clinit_TransformerRule$TYPE$Map() {
    carcr.$clinit_TransformerRule$TYPE$Map = emptyMethod;
    carcr.$MAP_2 = createValueOfMap(carcr.values_3());
  };
  defineClass(748, 1, { 1: 1 });
  cggl.Lcom_actelion_research_chem_reaction_TransformerRule$TYPE$Map_2_classLit = createForClass("com.actelion.research.chem.reaction", "TransformerRule/TYPE/Map", 748, cggl.Ljava_lang_Object_2_classLit);
  carcrm.$clinit_ChemicalRule = function $clinit_ChemicalRule() {
    carcrm.$clinit_ChemicalRule = emptyMethod;
    jl.$clinit_Object();
  };
  carcrm.ChemicalRule = function ChemicalRule(name_0, idcode) {
    carcrm.$clinit_ChemicalRule();
    var atom, atom0, atom1, atom2, atom3, atom4, bond, bondList, count, isHandledFragmentAtom, mapNo1, mapNo2, productAtom, productAtom1, productAtom2, productBond, productBondType, productParity, reactantAtom, reactantBond, reactantBondFoundInProduct, reactantBondType, reactantParity, rxn;
    Object_0.call(this);
    this.$init_138();
    this.mName = name_0;
    rxn = carcr.decode_2(idcode, false);
    if (rxn.getReactants_0() != 1 || rxn.getProducts_0() != 1)
      (jl.$clinit_System(), jl.out_0).println_0("ERROR: Rule '" + this.mName + "' doesn't contain exactly one reactant and one product!");
    if (!rxn.isFragment_0())
      (jl.$clinit_System(), jl.out_0).println_0("ERROR: Rule '" + this.mName + "' reactant and product are not marked as fragment!");
    this.mReactant = rxn.getReactant_0(0);
    this.mProduct = rxn.getProduct_0(0);
    this.mReactant.ensureHelperArrays_0(1);
    this.mProduct.ensureHelperArrays_0(63);
    bondList = new caru.SortedList();
    this.mMapNoToReactantAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mReactant.getAtoms_0() + 1, 15, 1);
    this.mMapNoToReactantAtom[0] = -1;
    for (atom0 = 0; atom0 < this.mReactant.getAtoms_0(); atom0++)
      if (this.mReactant.getAtomMapNo_0(atom0) != 0)
        this.mMapNoToReactantAtom[this.mReactant.getAtomMapNo_0(atom0)] = atom0;
    this.calculateReactantAtomSymmetryConstraints(this.mMapNoToReactantAtom);
    reactantBondFoundInProduct = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mReactant.getBonds_0(), 16, 1);
    for (productBond = 0; productBond < this.mProduct.getBonds_0(); productBond++) {
      productAtom1 = this.mProduct.getBondAtom_0(0, productBond);
      productAtom2 = this.mProduct.getBondAtom_0(1, productBond);
      mapNo1 = this.mProduct.getAtomMapNo_0(productAtom1);
      mapNo2 = this.mProduct.getAtomMapNo_0(productAtom2);
      if (mapNo1 != 0 && mapNo2 != 0) {
        atom1 = this.mMapNoToReactantAtom[mapNo1];
        atom2 = this.mMapNoToReactantAtom[mapNo2];
        productBondType = this.mProduct.getBondTypeSimple_0(productBond);
        reactantBond = this.mReactant.getBond_0(atom1, atom2);
        if (reactantBond == -1) {
          bondList.add_10(new carcrm.ChemicalRuleBond(atom1, atom2, mapNo1, mapNo2, productBondType));
        } else {
          if ((this.mReactant.getBondQueryFeatures_0(reactantBond) & 31) == 0) {
            reactantBondType = this.mReactant.getBondTypeSimple_0(reactantBond);
            if (reactantBondType != productBondType)
              bondList.add_10(new carcrm.ChemicalRuleBond(atom1, atom2, mapNo1, mapNo2, productBondType));
          }
          reactantBondFoundInProduct[reactantBond] = true;
        }
      }
    }
    for (bond = 0; bond < this.mReactant.getBonds_0(); bond++) {
      if (!reactantBondFoundInProduct[bond]) {
        atom1 = this.mReactant.getBondAtom_0(0, bond);
        atom2 = this.mReactant.getBondAtom_0(1, bond);
        if (!this.mReactant.isExcludeGroupAtom(atom1) && !this.mReactant.isExcludeGroupAtom(atom2)) {
          mapNo1 = this.mReactant.getAtomMapNo_0(atom1);
          mapNo2 = this.mReactant.getAtomMapNo_0(atom2);
          if (mapNo1 != 0 || mapNo2 != 0)
            bondList.add_10(new carcrm.ChemicalRuleBond(atom1, atom2, mapNo1, mapNo2, -1));
        }
      }
    }
    this.mRuleBonds = castTo(bondList.toArray_0(initUnidimensionalArray(cggl.Lcom_actelion_research_chem_reaction_mapping_ChemicalRuleBond_2_classLit, { 838: 1, 4: 1, 1: 1, 7: 1 }, 148, 0, 0, 1)), 838);
    count = 0;
    for (atom3 = 0; atom3 < this.mReactant.getAtoms_0(); atom3++)
      if (this.mReactant.getAtomMapNo_0(atom3) == 0 && !this.mReactant.isExcludeGroupAtom(atom3))
        count++;
    this.mReactantAtomsForRemoval = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, count, 15, 1);
    count = 0;
    for (atom4 = 0; atom4 < this.mReactant.getAtoms_0(); atom4++)
      if (this.mReactant.getAtomMapNo_0(atom4) == 0 && !this.mReactant.isExcludeGroupAtom(atom4))
        this.mReactantAtomsForRemoval[count++] = atom4;
    this.mRuleFragmentList = new ju.ArrayList();
    isHandledFragmentAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mProduct.getAtoms_0(), 16, 1);
    for (atom = 0; atom < this.mProduct.getAtoms_0(); atom++)
      if (this.mProduct.getAtomMapNo_0(atom) == 0 && !this.mProduct.isExcludeGroupAtom(atom) && !isHandledFragmentAtom[atom])
        this.mRuleFragmentList.add(new carcrm.RuleIncomingFragment(this.mProduct, atom, isHandledFragmentAtom));
    this.mIsStoichiometrical = this.mReactantAtomsForRemoval.length == 0 && this.mRuleFragmentList.isEmpty();
    this.mInvertedTHParity = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 0, 15, 1);
    for (productAtom = 0; productAtom < this.mProduct.getAtoms_0(); productAtom++) {
      productParity = this.mProduct.getAtomParity_0(productAtom);
      if (productParity == 1 || productParity == 2) {
        reactantAtom = this.mMapNoToReactantAtom[this.mProduct.getAtomMapNo_0(productAtom)];
        if (reactantAtom != -1) {
          reactantParity = this.mReactant.getAtomParity_0(reactantAtom);
          if (this.isTHParityInversion_0(productAtom, this.mMapNoToReactantAtom) == (reactantParity == productParity))
            this.addInvertedParityAtom(reactantAtom);
        }
      }
    }
    this.mPanalty = this.calculatePenalty();
  };
  defineClass(224, 1, { 224: 1, 1: 1 }, carcrm.ChemicalRule);
  _.$init_138 = function $init_138() {
  };
  _.addInvertedParityAtom = function addInvertedParityAtom(atom) {
    this.mInvertedTHParity = ju.copyOf_9(this.mInvertedTHParity, this.mInvertedTHParity.length + 1);
    this.mInvertedTHParity[this.mInvertedTHParity.length - 1] = atom;
  };
  _.apply_0 = function apply_0(reactant, match_0) {
    var atom, atom$array, atom$index, atom$max, originalToAppliedAtom, reactantAtom, reactantAtom1, reactantAtom2, reactantBond, reactantParity, ruleBond, ruleBond$array, ruleBond$index, ruleBond$max;
    reactant.ensureHelperArrays_0(1);
    for (ruleBond$array = this.mRuleBonds, ruleBond$index = 0, ruleBond$max = ruleBond$array.length; ruleBond$index < ruleBond$max; ++ruleBond$index) {
      ruleBond = ruleBond$array[ruleBond$index];
      reactantAtom1 = match_0[ruleBond.atom1];
      reactantAtom2 = match_0[ruleBond.atom2];
      reactantBond = reactant.getBond_0(reactantAtom1, reactantAtom2);
      if (reactantBond == -1)
        reactant.addBond_1(reactantAtom1, reactantAtom2, ruleBond.newBondType);
      else if (ruleBond.newBondType == -1)
        reactant.markBondForDeletion_0(reactantBond);
      else if (ruleBond.newBondType != -2)
        reactant.setBondType_0(reactantBond, ruleBond.newBondType);
    }
    originalToAppliedAtom = reactant.deleteMarkedAtomsAndBonds_0();
    if (this.mInvertedTHParity.length != 0) {
      reactant.ensureHelperArrays_0(7);
      for (atom$array = this.mInvertedTHParity, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
        atom = atom$array[atom$index];
        reactantAtom = jsEquals(originalToAppliedAtom, null) ? match_0[atom] : originalToAppliedAtom[match_0[atom]];
        reactantParity = reactant.getAtomParity_0(reactantAtom);
        reactant.setAtomParity_0(reactantAtom, reactantParity == 1 ? 2 : 1, false);
        reactant.setStereoBondFromAtomParity_0(reactantAtom);
      }
    }
    return originalToAppliedAtom;
  };
  _.calculatePenalty = function calculatePenalty() {
    var i, i0, productMapNo, reactantMapNo, scorer;
    scorer = new carcrm.MappingScorer(this.mReactant, this.mProduct);
    reactantMapNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mReactant.getAllAtoms_0(), 15, 1);
    for (i0 = 0; i0 < this.mReactant.getAllAtoms_0(); i0++)
      reactantMapNo[i0] = this.mReactant.getAtomMapNo_0(i0);
    productMapNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mProduct.getAllAtoms_0(), 15, 1);
    for (i = 0; i < this.mProduct.getAllAtoms_0(); i++)
      productMapNo[i] = this.mProduct.getAtomMapNo_0(i);
    return -scorer.scoreMapping(scorer.createReactantToProductAtomMap(reactantMapNo, productMapNo)) * 0.25;
  };
  _.calculateReactantAtomSymmetryConstraints = function calculateReactantAtomSymmetryConstraints(mapNoToReactantAtom) {
    var atom, atom0, atomIndex, fragmentCount, fragmentNo;
    this.mReactantAtomSymmetryConstraint = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mReactant.getAtoms_0(), 15, 1);
    for (atom0 = 0; atom0 < this.mProduct.getAtoms_0(); atom0++)
      if (this.mProduct.getAtomMapNo_0(atom0) != 0)
        this.mReactantAtomSymmetryConstraint[mapNoToReactantAtom[this.mProduct.getAtomMapNo_0(atom0)]] = this.mProduct.getSymmetryRank_0(atom0);
    fragmentNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mReactant.getAllAtoms_0(), 15, 1);
    fragmentCount = this.mReactant.getFragmentNumbers_0(fragmentNo, false, false);
    if (fragmentCount > 1) {
      atomIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, fragmentCount, 15, 1);
      for (atom = 0; atom < this.mReactant.getAtoms_0(); atom++)
        this.mReactantAtomSymmetryConstraint[atom] |= atomIndex[fragmentNo[atom]]++ << 5;
    }
  };
  _.createVetoMatrix = function createVetoMatrix(reactantAtoms, reactantMatch, productAtoms, productMatch) {
    var i, i0, productMask, vetoMatrix;
    if (this.mReactantAtomsForRemoval.length == 0 || this.mRuleFragmentList.isEmpty())
      return null;
    vetoMatrix = initUnidimensionalArray(cggl.Z_classLit, { 4: 1, 1: 1, 7: 1 }, 10, reactantAtoms, 0, 2);
    productMask = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, productAtoms, 16, 1);
    for (i0 = 0; i0 < productMatch.length; i0++)
      if (productMatch[i0] != -1 && this.mProduct.getAtomMapNo_0(i0) == 0)
        productMask[productMatch[i0]] = true;
    for (i = 0; i < reactantMatch.length; i++)
      if (reactantMatch[i] != -1 && this.mReactant.getAtomMapNo_0(i) == 0)
        vetoMatrix[reactantMatch[i]] = productMask;
    return vetoMatrix;
  };
  _.getName_0 = function getName_4() {
    return this.mName + (this.mIsStoichiometrical ? "_S" : this.mReactantAtomsForRemoval.length == 0 ? "_L" : this.mRuleFragmentList.isEmpty() ? "_I" : "_U");
  };
  _.getPanalty = function getPanalty() {
    return this.mPanalty;
  };
  _.getProduct_1 = function getProduct_0() {
    return this.mProduct;
  };
  _.getReactant_1 = function getReactant_0() {
    return this.mReactant;
  };
  _.getReactantAtomSymmetryConstraints = function getReactantAtomSymmetryConstraints() {
    return this.mReactantAtomSymmetryConstraint;
  };
  _.isTHParityInversion_0 = function isTHParityInversion_0(reactantAtom, mapNoToProduct) {
    var connAtom1, connAtom2, connMapNo1, connMapNo2, i, inversion, j;
    inversion = false;
    if (this.mReactant.getAtomPi_0(reactantAtom) == 0) {
      for (i = 1; i < this.mReactant.getConnAtoms_0(reactantAtom); i++) {
        for (j = 0; j < i; j++) {
          connAtom1 = this.mReactant.getConnAtom_0(reactantAtom, i);
          connAtom2 = this.mReactant.getConnAtom_0(reactantAtom, j);
          connMapNo1 = this.mReactant.getAtomMapNo_0(connAtom1);
          connMapNo2 = this.mReactant.getAtomMapNo_0(connAtom2);
          if (mapNoToProduct[connMapNo1] > mapNoToProduct[connMapNo2] ^ connAtom1 > connAtom2)
            inversion = !inversion;
        }
      }
    }
    return inversion;
  };
  _.mIsStoichiometrical = false;
  _.mPanalty = 0;
  cggl.Lcom_actelion_research_chem_reaction_mapping_ChemicalRule_2_classLit = createForClass("com.actelion.research.chem.reaction.mapping", "ChemicalRule", 224, cggl.Ljava_lang_Object_2_classLit);
  carcrm.$clinit_ChemicalRuleBond = function $clinit_ChemicalRuleBond() {
    carcrm.$clinit_ChemicalRuleBond = emptyMethod;
    jl.$clinit_Object();
    carcrm.BOND_TYPE_KEEP_UNCHANGED = -2;
    carcrm.BOND_TYPE_DELETE = -1;
  };
  carcrm.ChemicalRuleBond = function ChemicalRuleBond(atom1, atom2, mapNo1, mapNo2, newBondType) {
    carcrm.$clinit_ChemicalRuleBond();
    Object_0.call(this);
    this.$init_139();
    if (mapNo1 < mapNo2) {
      this.atom1 = atom1;
      this.atom2 = atom2;
      this.mapNo1 = mapNo1;
      this.mapNo2 = mapNo2;
    } else {
      this.atom1 = atom2;
      this.atom2 = atom1;
      this.mapNo1 = mapNo2;
      this.mapNo2 = mapNo1;
    }
    this.newBondType = newBondType;
  };
  defineClass(148, 1, { 148: 1, 22: 1, 1: 1 }, carcrm.ChemicalRuleBond);
  _.$init_139 = function $init_139() {
  };
  _.compareTo_1 = function compareTo_22(crb) {
    return this.compareTo_11(castTo(crb, 148));
  };
  _.compareTo_11 = function compareTo_21(crb) {
    if (this.mapNo1 < crb.mapNo1)
      return -1;
    if (this.mapNo1 > crb.mapNo1)
      return 1;
    if (this.mapNo2 < crb.mapNo2)
      return -1;
    if (this.mapNo2 > crb.mapNo2)
      return 1;
    return 0;
  };
  _.atom1 = 0;
  _.atom2 = 0;
  _.mapNo1 = 0;
  _.mapNo2 = 0;
  _.newBondType = 0;
  carcrm.BOND_TYPE_DELETE = 0;
  carcrm.BOND_TYPE_KEEP_UNCHANGED = 0;
  cggl.Lcom_actelion_research_chem_reaction_mapping_ChemicalRuleBond_2_classLit = createForClass("com.actelion.research.chem.reaction.mapping", "ChemicalRuleBond", 148, cggl.Ljava_lang_Object_2_classLit);
  carcrm.$clinit_ChemicalRuleEnhancedReactionMapper = function $clinit_ChemicalRuleEnhancedReactionMapper() {
    carcrm.$clinit_ChemicalRuleEnhancedReactionMapper = emptyMethod;
    jl.$clinit_Object();
    carcrm.CHEMICAL_RULE = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 2), { 4: 1, 1: 1, 7: 1 }, 9, 0, [stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["e", "daXJ@@PjyITuiX@`!dahJ@@SJYIMMfPB#IaLJfxP IaAhl[`#!BDpAl@AL@[@Be}aL@[@@ !B|Osp?QZR?O_}}zGze`@##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["g", "gBa`@lde@XS@!gCA`@mDPOdku`#qbq qJt#!B[G|S_qgq !BjW}q]cga##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["o", "gGQHDDqIUjdB!gGQHHDqAeMjhB#qbqk qfQ]#!B@AL@[@@S@Fp@Dp !BFQ{~_q|ZGvUSYp##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["r", "gOQdEjHbAFQRBrtAaJ!gNQdEbHbABCTKPFDH#qbMwX qbM~X#!BNDm`ra?UjW~YBYX@ !Ba[zw?_x@?g~H?XO~##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["s", "gOp`ATigujj`H!gOp`ATiVKjj`H#qnyS` qY~eP#!BTLtk^sE?BOs|]pc} !BbOvw?_y??g~H?[_}##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["t", "gOP`@dcUZdB!gNp`@tiTMjj@`#q{ir` qkLrx#!Be`Bzr_wp?OC}|Osp !B?g~w@k_}m?vw@n[a##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["u", "daXB`Hrn@HrPEILt`D!daXB`DJn@HRUMjV@H#IxVaLJ` IylJhPP#!B[G}l@OKyDpAl@AL@[@@ !B@Fp@DpAl@AN]?`Al@AL##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Sakurai", "gOQH@wAINvZ@pdcFe@x@!gOQH@wAIgJi@pdcFe@x@#qreKx qrLkx#!BDpAl@IknDw|S@Fp@ !Bb@JH?_x@b@JH?Ven##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Mitsunobu", "gFP`ATfRhdPp`}KEYg]d@!gFP`ATfRhd`pekL{l`#qrLk qZLn#!B@hc}b@C~@h`YM` !B@hc}b@C~@h`YM`##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Aldol-Addition", "gOQ@AdTAcS@[Q^crJTLES`DJsL?vH!gGQ@@dsuRAcJg@HUaX#qYEbp qYub#!BxOyBzLKg`dG~xG~{ !Bb@K~@Hc}FBIA@@##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Aldol-Condensation", "gOQ@AdTAcS@[Q^crJTLES`DJsL?vH!gFQ@@`rrpdlHHpipBEXf@#qYEbp q^aU#!B{ZRRqA?AQfyA@L_C !B}QFw@h`B_tnH_P##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Acetal-Aldol-Addition", "dmdB@@serQS@sJjfd@p`Xir\\@`j\\@aUJXK@!daxL@@[df[ZjT@qQdxACdxABjTqf@#qB@`OuX qBtM{#!B_]]}rHKWw?y}uy[~GJbBu{wWqG| !BfJK~TIa]fJJghg{`pP@##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Acetal-Aldol-Condensation", "dmdB@@serQS@sJjfd@p`Xir\\@`j\\@aUJXK@!gNp`CTjUiV@qQS`DJg@HUVXV@#qB@`OuX qqj{`#!B?[_}b@Jw_?{}m~[~[N@Bm?vwkN| !BfsK~yzPrw}m?rzQM##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Acetal-Aldol-Condensation-Cyclization", "dkLB@@ZURYUvUjljh@paHpr\\@`!didD@@yIfUXXHL@CFNS`D@#IXljNPY@@@ IXljIyA#!BbOw~_x`Bm?vH?[_}b@JH?_y?b@Jw?Xc} !BbOvH?Oy??`BH?Xa}?`C~_p##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Enolester-Cleavage", "gOQ`@fdscT`_Qp!gOQ`@cdTASS@P#q}Kr` q}cNP#!B@k]}mpC~@k]}mqdY !Bb@K~@Hc}BfzH@hc}##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["propargylEnone", "gCa@@dmXFD@!gCa@@dkHD#qNT qLV#!BbOw~_?y? !B@AL@[@@S##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Arndt-Eistert", "daiDaJYBBHj^{HhAYMpAaA@!daiD`FzLBHPVsZl@p`@#IyHHZ[@ IzDGBi`#!B?`Bw?H`Bn]{~\\g?~@Ox !B@rzH?_y?b@JH?_n~bOt##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Curtius", "gO]IcVaDF[s{HhCIe@`!gN]HMWADHJfm`XP@#q~Jk` qytUX#!B@O{|b@Jw\\o{~_?x@ !Bj]y??g?~?[^G_hc}##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["diazomethanHomologation", "gFU@lQioIIs\\AyH!gFU@CPdimXD#qbM^ qbqk#!B?X`BbFZN?`C~_p !B@AL@[@@Su[x@Dp##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["ene-Metathesis", "deD@@LdbEdSTu@FqHWSDda`JFChXIa`?tdKi@!deD@@Ldb`\\SUM@FqHPsDda`JF@XXIa`?tdHY@#qTEApX qQECf@#!BQzK~}ubbW`BEgcb]?a@gg[zO !BQzK~}ubbW`Ag{VVAQzJ~c?xP##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["ene-Metathesis", "deD@@LdbEdSTu@FqHWSDda`JFChXIa`?tdKi@!gC`@DiZDE@#qPDA@p qQf#!BmpK~_x`Bm?tAs[]}?`BH_[_| !B_vp@[G|S##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["yne-Metathesis", "daX@@LdPLWWPAlRXwQIHXLa`ZFChXO}IL[`!daX@@LdPLWWPAlRXwQIHXLa`ZFChXO}IL[`#qT@q@ qt@Q@#!BZmoi@Fjo|SFe|IkGiU@ !BZmoi@Fjo|SFe|IkGiU@##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["ene-yne-Metathesis", "dcd@@LdPLPLWSSPAlrXwKlVRFCHXFa`zFAXXMa`?udqnWP!dcT@@LdbbplTsTt@[MeMr{Ela`jFAhXNa`VFCXXO}[J[et#qe@N@S@ qeHP@s@#!B?g?~@Oy?^gG}bOvw?H`E@PJw@hc}mp !B?`BH?[_}mpJH@oy??`AuC`Jw@hc}mp##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Alkyne-Cyclisation", "gG`@DcO|CFAFC`@!gFp@DiTt@@CFAFC`@#qi\\V qiSt#!B_y[qA`Biu^zV@@ !B?g~w@k_}m?vw@`##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Elimination-Claisen", "gNp`AldTQji@~a`!gGQ@@djmRA@#qtHUX qtSi#!Bm?vH?[\\B?g~H@hc} !B@AL@[@@S@Fp@Dp##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["imineFormationAzaCope", "daZH@LAIMUjd@pRL@!daZH@HAAn]jd@p`@#IGfaLJ` IFDzfK@#!BDpAl@IkqDpAl@AL@[@@ !BFaFw@h`BbOw~@H`BbOt##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["didehydroCopeWithAromatisation", "gNp@Di]ejDcjcr|wK`!gOp@DjWkB@@H#qrLkx q\\oQp#!B?g~H?K_}bGvH?H`B !Bm?w~@Hc}mpJw@ox@##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["symAldolNitrogenRing", "dovJ@GBfttf\\v\\qjViPCADGbDodnGp!doNJ@JCSmtefWTCaYjje@H#IlZXi]]yL~C IqMVCzaIim?#!BQtl_riY?Qtl_rfuvNCQ`uZd@NCQ`uVVu}?sA]P !B?`BH@ox@bGvH@k\\Bb@JH_Xa}b@K~_rYltUr|W@##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Diels-Alder", "gFP@LdPLjA@!gFp@DiTujhB#qiZf qMSf#!B?_C}}?spIPFV@@ !B?g~w@k_}m?vw@`##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Claisen-RA", "gGQ@@eKtRA@!gGQ@@djqRA@#qMsT qM\\V#!B_qL@Dw}l@Fp@Dp !B@AL@[@@S@Fp@Dp##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Cope", "gGQ@DeZmRAbhcApIF@P@!gGQ@HeZmRAbhc@HIFC`@#qkNT qi\\V#!B_vp@[@@S@Fp@Dp !B_vp@[@@S@Fp@Dp##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["OxyCope", "gNq@@dr}SHFD@!gNq@@djkUHD#qynZ` qykbp#!B?g~w?Xc}mpJH@hc} !B@Fp@DpAl@AL@[@@S##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Vinylcyclopropane", "gKP@DklVj@`!gKP@Di\\Vj@`#qaVh qTqh#!Bm?vH?PC~?K\\ !B?g|_Fa}eTv\\##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Furan-CH2-OH-Rearrangement", "gOp`@tiguif`H!gOp`@tfWMZZ`H#qZna@ qZtM@#!BTLtk^sE?BOs|]pc} !BBOuPtdy?UGm@V]Ho##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["rearrangement1032", "gOp`ATieMji`H!gOp`ATeekZj`H#qaSnx qa]~P#!BTLtk^pc|LW?|]pc} !BBOpH?UCRSg}T^tAY##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Pinacol-Rearrangement", "gNp`ATffjj@pPh!gOP`@tfXZhCAA`#qb^ix qb^oH#!B@k^H@k_}@k_~@Hc} !BbOvH@oy??`BH?PFf##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["1,3-WaterEliminationWith12Shift", "gJQ@@dmU@_SP!gKa@@`vtA}A@#qiTp qjap#!BbOvH@ox@bOt !BJdE?[@Al@AL##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Epoxydation", "gB``ADcdCB@!gC``AhtUPGtt@#qqb qtQ#!BjW}Y\\YX@ !B?g~w?^Va##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["oxydativePropargylAmine13Shift", "gKi@HDEZpLHOQP!gJY@BDeVXB#qMr` qNTh#!BqiXTy{U?mW| !B@Fp@DpAl@AL##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Baeyer-Villiger", "gFQ`@[dTAZ`LHP!gFQ`@jdrMPGtl@#qrak qrlK#!B_?{}mwvHs^FVP@ !BbOvH@oy?bOuQzP##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Halogenation ring closure", "gGa@@dYs@XHFJIBDQbUeHPbLRl@!gFQ@@eNUPFJIBDQbUeHPbLRls@`#qbq] qfQk#!B@AOIDW}l@tD@Dp !B_qL@Dw}l_qNcDP##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Halogenation ring closure", "gBa@@d\\`XP@!gJQ@@eOU@XpdHQFIVY`P#qbq qfQ@#!B@AOIDW}l !B_qL@Dw}l_qL##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Hantzsch Thiazol", "daZHPDp@chaIMefh@ppDzTD~hYmC^bhbcPp]dQbUg~pp!gKXHL@aJWFe`H#qNPe@ qNj`#!BvuK[KUxv_yS[k_zhvuH !BTqa`FbpX?`@##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Oxadiazole", "gOX`BEdTASW@XQ@!gOu@HPeKNMKTA@#qrDMX qpULX#!BmpK~@K_}Mlx@?`C~ !BZ?`C}v|m_rYR[z?\\##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Imidazole", "dmeHPNg@qJqLbTtATijZ@LLJnuDmhWtSDXUFC`?rIoTAP!gOt@ATieuej`H#qDPpM_@ q~ZM`#!BqvKGg_yOqvKGg_xphrGkLcz@_sD !BTMHkACD@BOw|B@QT##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["1,2,3-Triazole", "gB`HAbIGXFDWiM@!gF|@ADeKXmT`P#QIp Q@v#!B_vpU?g}l !BTv]`YRqg?g|XK@##"]), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["1,2,4-Triazole", "deFD@NALbbfASUW@FD]YJZLUCAVJ}?nES@!gO|@ABeKNLuRA@#qDB@FM q@LuP#!BY?r~@F_]jDJW`j`}Iaxx[UC] !BTv]@IPqgog|hCBT_##"])]);
  };
  carcrm.ChemicalRuleEnhancedReactionMapper = function ChemicalRuleEnhancedReactionMapper() {
    carcrm.$clinit_ChemicalRuleEnhancedReactionMapper();
    Object_0.call(this);
    this.$init_140();
    this.mMaxRuleTries = 2147483647;
  };
  carcrm.initialize_5 = function initialize_5() {
    var chemicalRule, i;
    if (jsEquals(carcrm.sChemicalRule, null)) {
      cggl.Lcom_actelion_research_chem_reaction_mapping_ChemicalRuleEnhancedReactionMapper_2_classLit;
      if (jsEquals(carcrm.sChemicalRule, null)) {
        chemicalRule = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_reaction_mapping_ChemicalRule_2_classLit, { 4: 1, 1: 1, 7: 1 }, 224, carcrm.CHEMICAL_RULE.length, 0, 1);
        for (i = 0; i < carcrm.CHEMICAL_RULE.length; i++)
          setCheck(chemicalRule, i, new carcrm.ChemicalRule(carcrm.CHEMICAL_RULE[i][0], carcrm.CHEMICAL_RULE[i][1]));
        carcrm.sChemicalRule = chemicalRule;
      }
    }
  };
  defineClass(338, 1, { 1: 1 }, carcrm.ChemicalRuleEnhancedReactionMapper);
  _.$init_140 = function $init_140() {
  };
  _.getScore = function getScore() {
    return this.mScore;
  };
  _.map_1 = function map_1(rxn) {
    var adaptedReactant, adaptedReactantMapNo, bestGraphMapNoCount, bestProductMapNo, bestReactantMapNo, historyScore, mapper, originalToAdaptedAtom, pairSequences, pairSequences0, product, productMapNo, productMapNo0, productMatch, productSearcher, reactant, reactantMapNo, reactantMatch, reactantMatch$iterator, reactantSearcher, rule, rule$array, rule$index, rule$max, ruleApplicationCount, score, score0, vetoMatrix;
    carcrm.initialize_5();
    mapper = new carcrm.SimilarityGraphBasedReactionMapper();
    mapper.mergeReactantsAndProducts(rxn);
    reactant = mapper.getReactant_1();
    product = mapper.getProduct_1();
    reactant.ensureHelperArrays_0(1);
    product.ensureHelperArrays_0(1);
    reactantSearcher = new carc2.SSSearcher();
    productSearcher = new carc2.SSSearcher();
    reactantSearcher.setMolecule_0(reactant);
    productSearcher.setMolecule_0(product);
    this.mScore = -2147483648;
    bestReactantMapNo = null;
    bestProductMapNo = null;
    bestGraphMapNoCount = 0;
    this.mAppliedRule = null;
    ruleApplicationCount = 0;
    this.mHistory = new jl.StringBuilder();
    if (false)
      (jl.$clinit_System(), jl.out_0).println_0("Reaction	Score");
    adaptedReactant = new carc2.StereoMolecule();
    for (rule$array = carcrm.sChemicalRule, rule$index = 0, rule$max = rule$array.length; rule$index < rule$max; ++rule$index) {
      rule = rule$array[rule$index];
      if (ruleApplicationCount++ == this.mMaxRuleTries)
        break;
      reactantSearcher.setFragment_1(rule.getReactant_1());
      reactantSearcher.setFragmentSymmetryConstraints(rule.getReactantAtomSymmetryConstraints());
      if (0 != reactantSearcher.findFragmentInMolecule(6, 8)) {
        productSearcher.setFragment_1(rule.getProduct_1());
        if (0 != productSearcher.findFragmentInMolecule(2, 8) && reactantSearcher.getMatchList().size() <= 512) {
          historyScore = -1e4;
          productMatch = castTo(productSearcher.getMatchList().getAtIndex(0), 6);
          for (reactantMatch$iterator = reactantSearcher.getMatchList().iterator(); reactantMatch$iterator.hasNext_0(); ) {
            reactantMatch = castTo(reactantMatch$iterator.next_3(), 6);
            if (ruleApplicationCount++ >= this.mMaxRuleTries)
              break;
            reactant.copyMolecule_0(adaptedReactant);
            originalToAdaptedAtom = rule.apply_0(adaptedReactant, reactantMatch);
            vetoMatrix = rule.createVetoMatrix(reactant.getAtoms_0(), reactantMatch, product.getAtoms_0(), productMatch);
            adaptedReactant.ensureHelperArrays_0(1);
            adaptedReactantMapNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, adaptedReactant.getAtoms_0(), 15, 1);
            productMapNo0 = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, product.getAtoms_0(), 15, 1);
            mapper.map_2(adaptedReactant, product, adaptedReactantMapNo, productMapNo0, vetoMatrix);
            score0 = mapper.getScore() - rule.getPanalty();
            if (false) {
            }
            if (historyScore < score0)
              historyScore = score0;
            if (this.mScore < score0) {
              this.mScore = score0;
              bestReactantMapNo = this.mapNoToOriginal(adaptedReactantMapNo, productMapNo0, originalToAdaptedAtom, reactant.getAtoms_0());
              bestProductMapNo = productMapNo0;
              bestGraphMapNoCount = mapper.getGraphMapNoCount();
              this.mAppliedRule = rule;
            }
          }
          pairSequences0 = mapper.getAtomPairSequenceCount() <= 1 ? "" : " (rootPairSets:" + mapper.getAtomPairSequenceCount() + ")";
          this.mHistory.append_9(rule.getName_0() + ("" + caru.toString_22(historyScore)) + pairSequences0 + "\n");
        }
      }
    }
    reactantMapNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, reactant.getAtoms_0(), 15, 1);
    productMapNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, product.getAtoms_0(), 15, 1);
    mapper.map_2(reactant, product, reactantMapNo, productMapNo, null);
    score = mapper.getScore();
    if (this.mScore <= score) {
      this.mAppliedRule = null;
      this.mScore = score;
      bestReactantMapNo = reactantMapNo;
      bestProductMapNo = productMapNo;
      bestGraphMapNoCount = mapper.getGraphMapNoCount();
    }
    pairSequences = mapper.getAtomPairSequenceCount() <= 1 ? "" : " (rootPairSets:" + mapper.getAtomPairSequenceCount() + ")";
    this.mHistory.append_9("no rule:" + caru.toString_22(score) + pairSequences + "\n");
    if (this.mScore != -2147483648)
      mapper.copyMapNosToReaction(rxn, bestReactantMapNo, bestProductMapNo, bestGraphMapNoCount);
    if (false)
      (jl.$clinit_System(), jl.out_0).println_0("Done; used " + ruleApplicationCount + " of " + this.mMaxRuleTries + " allowed rule application tries.");
  };
  _.mapNoToOriginal = function mapNoToOriginal(adaptedReactantMapNo, productMapNo, originalToAdaptedAtom, origAtomCount) {
    var adaptedAtom, i, isUsedMapNo, origAtom, origMapNo;
    isUsedMapNo = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, adaptedReactantMapNo.length + 1, 16, 1);
    origMapNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, origAtomCount, 15, 1);
    for (origAtom = 0; origAtom < origAtomCount; origAtom++) {
      adaptedAtom = jsEquals(originalToAdaptedAtom, null) ? origAtom : originalToAdaptedAtom[origAtom];
      if (adaptedAtom != -1) {
        origMapNo[origAtom] = adaptedReactantMapNo[adaptedAtom];
        isUsedMapNo[origMapNo[origAtom]] = true;
      }
    }
    for (i = 0; i < productMapNo.length; i++)
      if (!isUsedMapNo[productMapNo[i]])
        productMapNo[i] = 0;
    return origMapNo;
  };
  _.mMaxRuleTries = 0;
  _.mScore = 0;
  carcrm.DEBUG_PRINT_MOLFILES_AFTER_APPLYING_RULE = false;
  carcrm.DEBUG_PRINT_REACTION_AFTER_APPLYING_RULE = false;
  carcrm.MAX_MATCH_COUNT = 512;
  carcrm.RULES_DATAWARRIOR_FILE = "/home/thomas/data/reactionmapping/ChemicalRuleEnhancedReactionMapper_allRules.dwar";
  cggl.Lcom_actelion_research_chem_reaction_mapping_ChemicalRuleEnhancedReactionMapper_2_classLit = createForClass("com.actelion.research.chem.reaction.mapping", "ChemicalRuleEnhancedReactionMapper", 338, cggl.Ljava_lang_Object_2_classLit);
  carcrm.$clinit_MappingScorer = function $clinit_MappingScorer() {
    carcrm.$clinit_MappingScorer = emptyMethod;
    jl.$clinit_Object();
  };
  carcrm.MappingScorer = function MappingScorer(reactant, product) {
    carcrm.$clinit_MappingScorer();
    Object_0.call(this);
    this.$init_141();
    this.mReactant = reactant;
    this.mProduct = product;
  };
  defineClass(226, 1, { 1: 1 }, carcrm.MappingScorer);
  _.$init_141 = function $init_141() {
  };
  _.createReactantToProductAtomMap = function createReactantToProductAtomMap(reactantMapNo, productMapNo) {
    var atom, atom0, mapNoToProductAtom, reactantToProductAtom;
    mapNoToProductAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mReactant.getAtoms_0() + 1, 15, 1);
    ju.fill_0(mapNoToProductAtom, -1);
    for (atom0 = 0; atom0 < productMapNo.length; atom0++)
      if (productMapNo[atom0] != 0)
        mapNoToProductAtom[productMapNo[atom0]] = atom0;
    reactantToProductAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mReactant.getAtoms_0(), 15, 1);
    ju.fill_0(reactantToProductAtom, -1);
    for (atom = 0; atom < reactantMapNo.length; atom++)
      reactantToProductAtom[atom] = mapNoToProductAtom[reactantMapNo[atom]];
    return reactantToProductAtom;
  };
  _.getBondChangePenalty = function getBondChangePenalty(rBond, pBond) {
    if (false)
      return $wnd.Math.abs(this.getFractionalBondOrder(this.mReactant, rBond) - this.getFractionalBondOrder(this.mProduct, pBond));
    return this.getBondType_1(this.mReactant, rBond) == this.getBondType_1(this.mProduct, pBond) ? 0 : 1;
  };
  _.getBondCreateOrBreakPenalty = function getBondCreateOrBreakPenalty(mol, bond) {
    var atom1, atom2, isHetero1, isHetero2;
    if (false)
      return mol.getBondOrder_0(bond);
    atom1 = mol.getBondAtom_0(0, bond);
    atom2 = mol.getBondAtom_0(1, bond);
    isHetero1 = mol.isElectronegative_0(atom1);
    isHetero2 = mol.isElectronegative_0(atom2);
    if (!isHetero1 && !isHetero2)
      return mol.isAromaticBond_0(bond) ? 2.0999999046325684 : 1.899999976158142 + mol.getBondOrder_0(bond) / 10;
    if (isHetero1 && isHetero2)
      return 1.7000000476837158;
    if (isHetero1 && mol.isMetalAtom_0(atom2) || isHetero2 && mol.isMetalAtom_0(atom1))
      return 1.7000000476837158;
    if (isHetero1 && carcrm.hasOxo_1(mol, atom2, atom1) || isHetero2 && carcrm.hasOxo_1(mol, atom1, atom2))
      return 1.7999999523162842;
    if (isHetero1 && carcrm.hasNonCarbonNeighbour_0(mol, atom2, atom1) || isHetero2 && carcrm.hasNonCarbonNeighbour_0(mol, atom1, atom2))
      return 1.850000023841858;
    if (isHetero1 && mol.isAromaticAtom_0(atom2) || isHetero2 && mol.isAromaticAtom_0(atom1))
      return 1.9500000476837158;
    return 1.899999976158142;
  };
  _.getBondType_1 = function getBondType_0(mol, bond) {
    if (mol.isDelocalizedBond_0(bond))
      return 0;
    return mol.getBondTypeSimple_0(bond);
  };
  _.getFractionalBondOrder = function getFractionalBondOrder(mol, bond) {
    return mol.isDelocalizedBond_0(bond) ? 1.5 : mol.getBondOrder_0(bond);
  };
  _.getParityInversionPenalty = function getParityInversionPenalty(reactantAtom, reactantToProductAtom) {
    var productAtom, productParity, reactantParity;
    productAtom = reactantToProductAtom[reactantAtom];
    if (productAtom != -1 && this.mProduct.getAtomParity_0(productAtom) != 0 && this.hasSameNeighbours(reactantAtom, productAtom, reactantToProductAtom)) {
      reactantParity = this.mReactant.getAtomParity_0(reactantAtom);
      productParity = this.mProduct.getAtomParity_0(productAtom);
      if (reactantParity == 3) {
        if (productParity == 1 || productParity == 2)
          return false ? 4 : 5;
      } else {
        if (productParity == 3 || this.isTHParityInversion_1(reactantAtom, reactantToProductAtom) == (reactantParity == productParity))
          return false ? 4 : 5;
      }
    }
    return 0;
  };
  _.hasSameNeighbours = function hasSameNeighbours(reactantAtom, productAtom, reactantToProductAtom) {
    var found, i, j, rConn;
    if (this.mReactant.getConnAtoms_0(reactantAtom) != this.mProduct.getConnAtoms_0(productAtom))
      return false;
    for (i = 0; i < this.mReactant.getConnAtoms_0(reactantAtom); i++) {
      rConn = this.mReactant.getConnAtom_0(reactantAtom, i);
      found = false;
      for (j = 0; j < this.mProduct.getConnAtoms_0(productAtom); j++) {
        if (reactantToProductAtom[rConn] == this.mProduct.getConnAtom_0(productAtom, j)) {
          found = true;
          break;
        }
      }
      if (!found)
        return false;
    }
    return true;
  };
  _.isTHParityInversion_1 = function isTHParityInversion_1(reactantAtom, reactantToProductAtom) {
    var connAtom1, connAtom2, connProductAtom1, connProductAtom2, i, inversion, j;
    inversion = false;
    if (this.mReactant.getAtomPi_0(reactantAtom) == 0) {
      for (i = 1; i < this.mReactant.getConnAtoms_0(reactantAtom); i++) {
        for (j = 0; j < i; j++) {
          connAtom1 = this.mReactant.getConnAtom_0(reactantAtom, i);
          connAtom2 = this.mReactant.getConnAtom_0(reactantAtom, j);
          connProductAtom1 = reactantToProductAtom[connAtom1];
          connProductAtom2 = reactantToProductAtom[connAtom2];
          if (connProductAtom1 != -1 && connProductAtom2 != -1 && connProductAtom1 > connProductAtom2 ^ connAtom1 > connAtom2)
            inversion = !inversion;
        }
      }
    }
    return inversion;
  };
  _.scoreMapping = function scoreMapping(reactantToProductAtom) {
    var atom, atom$array, atom$index, atom$max, hydrogenBondPenalty, isAssignedProductAtom, pAtom, pAtom1, pAtom2, pBond, pBond0, penalty, productBondHandled, rAtom, rAtom1, rAtom2, rBond, rBondOrder;
    penalty = 0;
    hydrogenBondPenalty = false ? initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, this.mProduct.getAtoms_0(), 15, 1) : null;
    isAssignedProductAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mProduct.getAtoms_0(), 16, 1);
    for (atom$array = reactantToProductAtom, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
      atom = atom$array[atom$index];
      if (atom != -1)
        isAssignedProductAtom[atom] = true;
    }
    productBondHandled = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mProduct.getBonds_0(), 16, 1);
    for (rBond = 0; rBond < this.mReactant.getBonds_0(); rBond++) {
      rAtom1 = this.mReactant.getBondAtom_0(0, rBond);
      rAtom2 = this.mReactant.getBondAtom_0(1, rBond);
      if (this.mReactant.isFragment_0() && (this.mReactant.isExcludeGroupAtom(rAtom1) || this.mReactant.isExcludeGroupAtom(rAtom2)))
        continue;
      pAtom1 = reactantToProductAtom[rAtom1];
      pAtom2 = reactantToProductAtom[rAtom2];
      rBondOrder = this.getFractionalBondOrder(this.mReactant, rBond);
      if (pAtom1 == -1 || pAtom2 == -1) {
        if (pAtom1 != -1 || pAtom2 != -1)
          penalty += this.getBondCreateOrBreakPenalty(this.mReactant, rBond);
        if (false) {
        }
        continue;
      }
      pBond0 = this.mProduct.getBond_0(pAtom1, pAtom2);
      if (pBond0 == -1) {
        penalty += this.getBondCreateOrBreakPenalty(this.mReactant, rBond);
        if (false) {
        }
        continue;
      }
      if (false) {
      }
      productBondHandled[pBond0] = true;
      penalty += this.getBondChangePenalty(rBond, pBond0);
    }
    for (pBond = 0; pBond < this.mProduct.getBonds_0(); pBond++) {
      if (this.mProduct.isFragment_0() && (this.mProduct.isExcludeGroupAtom(this.mProduct.getBondAtom_0(0, pBond)) || this.mProduct.isExcludeGroupAtom(this.mProduct.getBondAtom_0(1, pBond))))
        continue;
      if (!productBondHandled[pBond]) {
        penalty += this.getBondCreateOrBreakPenalty(this.mProduct, pBond);
        if (false) {
        }
      }
    }
    for (rAtom = 0; rAtom < this.mReactant.getAtoms_0(); rAtom++)
      if (this.mReactant.getAtomParity_0(rAtom) != 0)
        penalty += this.getParityInversionPenalty(rAtom, reactantToProductAtom);
    if (false)
      for (pAtom = 0; pAtom < this.mProduct.getAtoms_0(); pAtom++)
        penalty += 0.5 * $wnd.Math.abs(hydrogenBondPenalty[pAtom]);
    return -penalty;
  };
  carcrm.SCORE_HYDROGEN = false;
  carcrm.SCORE_SIMPLE = false;
  cggl.Lcom_actelion_research_chem_reaction_mapping_MappingScorer_2_classLit = createForClass("com.actelion.research.chem.reaction.mapping", "MappingScorer", 226, cggl.Ljava_lang_Object_2_classLit);
  carcrm.$clinit_ReactionCenterMapper = function $clinit_ReactionCenterMapper() {
    carcrm.$clinit_ReactionCenterMapper = emptyMethod;
    jl.$clinit_Object();
  };
  carcrm.ReactionCenterMapper = function ReactionCenterMapper(reactant, product, reactantMapNo, productMapNo, mapNo, vetoMatrix) {
    carcrm.$clinit_ReactionCenterMapper();
    var atom, atom0, atomClass, atomClassMap, uca, uca$iterator;
    Object_0.call(this);
    this.$init_142();
    this.mReactant = reactant;
    this.mProduct = product;
    this.mReactantMapNo = reactantMapNo;
    this.mProductMapNo = productMapNo;
    this.mStartMapNo = mapNo;
    this.mMapNo = mapNo;
    this.mVetoMatrix = vetoMatrix;
    atomClassMap = new ju.TreeMap();
    for (atom0 = 0; atom0 < reactant.getAtoms_0(); atom0++) {
      if (reactantMapNo[atom0] == 0) {
        atomClass = reactant.getAtomicNo_0(atom0) + (reactant.getAtomMass_0(atom0) << 16);
        uca = castTo(atomClassMap.get(jl.valueOf_12(atomClass)), 83);
        if (isNull(uca)) {
          uca = new carcrm.ReactionCenterMapper$UnmappedCenterAtoms(this);
          atomClassMap.put(jl.valueOf_12(atomClass), uca);
        }
        uca.addReactantAtom(atom0);
      }
    }
    for (atom = 0; atom < product.getAtoms_0(); atom++) {
      if (productMapNo[atom] == 0) {
        atomClass = product.getAtomicNo_0(atom) + (product.getAtomMass_0(atom) << 16);
        uca = castTo(atomClassMap.get(jl.valueOf_12(atomClass)), 83);
        if (isNull(uca)) {
          uca = new carcrm.ReactionCenterMapper$UnmappedCenterAtoms(this);
          atomClassMap.put(jl.valueOf_12(atomClass), uca);
        }
        uca.addProductAtom(atom);
      }
    }
    this.mAtomClasses = new ju.ArrayList();
    for (uca$iterator = atomClassMap.values().iterator(); uca$iterator.hasNext_0(); ) {
      uca = castTo(uca$iterator.next_3(), 83);
      if (!uca.mapObviousAtoms())
        this.mAtomClasses.add(uca);
    }
  };
  defineClass(500, 1, { 1: 1 }, carcrm.ReactionCenterMapper);
  _.$init_142 = function $init_142() {
  };
  _.completeAndScoreMapping = function completeAndScoreMapping() {
    var atomCount, atomOffset, bestProductAtom, bestReactantAtom, bestScore, cumulatedAtomCount, i, i0, i1, i2, mapNo, nextPermutationAvailable, permutationCount, permutationIndex, reactantToProductAtom, score, scorer, totalPermutationCount, uca, uca$iterator, veto;
    scorer = new carcrm.MappingScorer(this.mReactant, this.mProduct);
    reactantToProductAtom = scorer.createReactantToProductAtomMap(this.mReactantMapNo, this.mProductMapNo);
    if (this.mAtomClasses.isEmpty())
      return scorer.scoreMapping(reactantToProductAtom);
    totalPermutationCount = 1;
    for (uca$iterator = this.mAtomClasses.iterator(); uca$iterator.hasNext_0(); ) {
      uca = castTo(uca$iterator.next_3(), 83);
      totalPermutationCount *= uca.getPermutationCount();
    }
    if (totalPermutationCount > 4e6) {
      (jl.$clinit_System(), jl.out_0).println_0("permutationCount exceeds maximum:" + totalPermutationCount);
      return -totalPermutationCount;
    }
    atomCount = 0;
    cumulatedAtomCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAtomClasses.size(), 15, 1);
    permutationCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAtomClasses.size(), 15, 1);
    for (i0 = 0; i0 < this.mAtomClasses.size(); i0++) {
      uca = castTo(this.mAtomClasses.getAtIndex(i0), 83);
      permutationCount[i0] = uca.initializePermutations();
      cumulatedAtomCount[i0] = atomCount;
      atomCount += uca.getMappableAtomCount();
    }
    bestScore = -1e10;
    bestReactantAtom = null;
    bestProductAtom = null;
    permutationIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mAtomClasses.size(), 15, 1);
    nextPermutationAvailable = !this.mAtomClasses.isEmpty();
    while (nextPermutationAvailable) {
      veto = false;
      if (jsNotEquals(this.mVetoMatrix, null)) {
        for (i1 = 0; i1 < this.mAtomClasses.size(); i1++) {
          if (castTo(this.mAtomClasses.getAtIndex(i1), 83).isVetoPermutation(permutationIndex[i1], this.mVetoMatrix)) {
            veto = true;
            break;
          }
        }
      }
      if (!veto) {
        for (i1 = 0; i1 < this.mAtomClasses.size(); i1++)
          castTo(this.mAtomClasses.getAtIndex(i1), 83).completeReactantToProductAtomMap(permutationIndex[i1], reactantToProductAtom);
        score = scorer.scoreMapping(reactantToProductAtom);
        if (bestScore < score) {
          bestScore = score;
          bestReactantAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, atomCount, 15, 1);
          bestProductAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, atomCount, 15, 1);
          atomOffset = 0;
          for (i2 = 0; i2 < this.mAtomClasses.size(); i2++) {
            uca = castTo(this.mAtomClasses.getAtIndex(i2), 83);
            uca.getReactantAtoms(permutationIndex[i2], bestReactantAtom, atomOffset);
            uca.getProductAtoms(permutationIndex[i2], bestProductAtom, atomOffset);
            atomOffset += uca.mMappableAtomCount;
          }
        }
      }
      nextPermutationAvailable = false;
      for (i = 0; i < permutationIndex.length; i++) {
        permutationIndex[i]++;
        if (permutationIndex[i] < permutationCount[i]) {
          nextPermutationAvailable = true;
          break;
        }
        permutationIndex[i] = 0;
      }
    }
    if (bestScore != -1e10) {
      mapNo = this.mMapNo;
      for (i = 0; i < atomCount; i++) {
        mapNo++;
        this.mReactantMapNo[bestReactantAtom[i]] = mapNo;
        this.mProductMapNo[bestProductAtom[i]] = mapNo;
      }
    }
    return bestScore;
  };
  _.getMappedAtomCount = function getMappedAtomCount() {
    return this.mMapNo - this.mStartMapNo;
  };
  _.mMapNo = 0;
  _.mStartMapNo = 0;
  carcrm.MAX_PERMUTATION_COUNT = 4e6;
  cggl.Lcom_actelion_research_chem_reaction_mapping_ReactionCenterMapper_2_classLit = createForClass("com.actelion.research.chem.reaction.mapping", "ReactionCenterMapper", 500, cggl.Ljava_lang_Object_2_classLit);
  carcrm.$clinit_ReactionCenterMapper$UnmappedCenterAtoms = function $clinit_ReactionCenterMapper$UnmappedCenterAtoms() {
    carcrm.$clinit_ReactionCenterMapper$UnmappedCenterAtoms = emptyMethod;
    jl.$clinit_Object();
  };
  carcrm.ReactionCenterMapper$UnmappedCenterAtoms = function ReactionCenterMapper$UnmappedCenterAtoms(this$0) {
    carcrm.$clinit_ReactionCenterMapper$UnmappedCenterAtoms();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_143();
  };
  defineClass(83, 1, { 83: 1, 1: 1 }, carcrm.ReactionCenterMapper$UnmappedCenterAtoms);
  _.$init_143 = function $init_143() {
    this.mReactantAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 0, 15, 1);
    this.mProductAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 0, 15, 1);
    this.mMappableAtomCount = 0;
  };
  _.addAtom_3 = function addAtom_2(atom, atoms) {
    var i, newAtoms;
    newAtoms = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, atoms.length + 1, 15, 1);
    for (i = 0; i < atoms.length; i++)
      newAtoms[i] = atoms[i];
    newAtoms[atoms.length] = atom;
    return newAtoms;
  };
  _.addProductAtom = function addProductAtom(atom) {
    this.mProductAtom = this.addAtom_3(atom, this.mProductAtom);
    if (this.mProductAtom.length <= this.mReactantAtom.length)
      this.mMappableAtomCount = this.mProductAtom.length;
  };
  _.addReactantAtom = function addReactantAtom(atom) {
    this.mReactantAtom = this.addAtom_3(atom, this.mReactantAtom);
    if (this.mReactantAtom.length <= this.mProductAtom.length)
      this.mMappableAtomCount = this.mReactantAtom.length;
  };
  _.areEqualSingleAtoms = function areEqualSingleAtoms(atoms, mol) {
    var atom, atom$array, atom$index, atom$max, charge, i;
    for (atom$array = atoms, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
      atom = atom$array[atom$index];
      if (mol.getConnAtoms_0(atom) != 0)
        return false;
    }
    charge = mol.getAtomCharge_0(atoms[0]);
    for (i = 1; i < atoms.length; i++)
      if (mol.getAtomCharge_0(atoms[i]) != charge)
        return false;
    return true;
  };
  _.completeReactantToProductAtomMap = function completeReactantToProductAtomMap(permutationIndex, reactantToProductAtomMap) {
    var atom, atom$array, atom$index, atom$max, i, permutation;
    permutation = castTo(this.mPermutationList.getAtIndex(permutationIndex), 6);
    if (this.mReactantAtom.length <= this.mProductAtom.length) {
      for (i = 0; i < this.mMappableAtomCount; i++)
        reactantToProductAtomMap[this.mReactantAtom[i]] = this.mProductAtom[permutation[i]];
    } else {
      for (atom$array = this.mReactantAtom, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
        atom = atom$array[atom$index];
        reactantToProductAtomMap[atom] = -1;
      }
      for (i = 0; i < this.mMappableAtomCount; i++)
        reactantToProductAtomMap[this.mReactantAtom[permutation[i]]] = this.mProductAtom[i];
    }
  };
  _.getMappableAtomCount = function getMappableAtomCount() {
    return this.mMappableAtomCount;
  };
  _.getPermutationCount = function getPermutationCount() {
    var i, permutationCount, totalAtomCount;
    totalAtomCount = $wnd.Math.max(this.mReactantAtom.length, this.mProductAtom.length);
    permutationCount = 1;
    for (i = totalAtomCount - this.mMappableAtomCount + 1; i <= totalAtomCount; i++)
      permutationCount *= i;
    return permutationCount;
  };
  _.getProductAtoms = function getProductAtoms(permutationIndex, productAtom, productAtomOffset) {
    var i, permutation;
    if (this.mReactantAtom.length > this.mProductAtom.length) {
      for (i = 0; i < this.mMappableAtomCount; i++)
        productAtom[productAtomOffset + i] = this.mProductAtom[i];
    } else {
      permutation = castTo(this.mPermutationList.getAtIndex(permutationIndex), 6);
      for (i = 0; i < this.mMappableAtomCount; i++)
        productAtom[productAtomOffset + i] = this.mProductAtom[permutation[i]];
    }
  };
  _.getReactantAtoms = function getReactantAtoms(permutationIndex, reactantAtom, reactantAtomOffset) {
    var i, permutation;
    if (this.mReactantAtom.length <= this.mProductAtom.length) {
      for (i = 0; i < this.mMappableAtomCount; i++)
        reactantAtom[reactantAtomOffset + i] = this.mReactantAtom[i];
    } else {
      permutation = castTo(this.mPermutationList.getAtIndex(permutationIndex), 6);
      for (i = 0; i < this.mMappableAtomCount; i++)
        reactantAtom[reactantAtomOffset + i] = this.mReactantAtom[permutation[i]];
    }
  };
  _.initializePermutations = function initializePermutations() {
    var isUsed, solution;
    this.mPermutationList = new ju.ArrayList();
    solution = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMappableAtomCount, 15, 1);
    isUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, $wnd.Math.max(this.mReactantAtom.length, this.mProductAtom.length), 16, 1);
    this.permute(0, isUsed, solution);
    return this.mPermutationList.size();
  };
  _.isVetoPermutation = function isVetoPermutation(permutationIndex, vetoMatrix) {
    var i, permutation;
    permutation = castTo(this.mPermutationList.getAtIndex(permutationIndex), 6);
    if (this.mReactantAtom.length <= this.mProductAtom.length) {
      for (i = 0; i < this.mMappableAtomCount; i++)
        if (jsNotEquals(vetoMatrix[this.mReactantAtom[i]], null) && vetoMatrix[this.mReactantAtom[i]][this.mProductAtom[permutation[i]]])
          return true;
    } else {
      for (i = 0; i < this.mMappableAtomCount; i++)
        if (jsNotEquals(vetoMatrix[this.mReactantAtom[permutation[i]]], null) && vetoMatrix[this.mReactantAtom[permutation[i]]][this.mProductAtom[i]])
          return true;
    }
    return false;
  };
  _.mapObviousAtoms = function mapObviousAtoms() {
    var matchable, p, r;
    if (this.mMappableAtomCount == 0)
      return true;
    if (this.mReactantAtom.length == 1 && this.mProductAtom.length == 1) {
      if (jsEquals(this.this$01.mVetoMatrix, null) || jsEquals(this.this$01.mVetoMatrix[this.mReactantAtom[0]], null) || !this.this$01.mVetoMatrix[this.mReactantAtom[0]][this.mProductAtom[0]]) {
        this.this$01.mMapNo++;
        this.this$01.mReactantMapNo[this.mReactantAtom[0]] = this.this$01.mMapNo;
        this.this$01.mProductMapNo[this.mProductAtom[0]] = this.this$01.mMapNo;
      }
      return true;
    }
    if (this.areEqualSingleAtoms(this.mReactantAtom, this.this$01.mReactant) || this.areEqualSingleAtoms(this.mProductAtom, this.this$01.mProduct)) {
      matchable = $wnd.Math.min(this.mReactantAtom.length, this.mProductAtom.length);
      for (r = 0; matchable != 0 && r < this.mReactantAtom.length; r++) {
        for (p = 0; p < this.mProductAtom.length; p++) {
          if (this.this$01.mProductMapNo[this.mProductAtom[p]] == 0 && (jsEquals(this.this$01.mVetoMatrix, null) || jsEquals(this.this$01.mVetoMatrix[this.mReactantAtom[r]], null) || !this.this$01.mVetoMatrix[this.mReactantAtom[r]][this.mProductAtom[p]])) {
            matchable--;
            this.this$01.mMapNo++;
            this.this$01.mReactantMapNo[this.mReactantAtom[r]] = this.this$01.mMapNo;
            this.this$01.mProductMapNo[this.mProductAtom[p]] = this.this$01.mMapNo;
            break;
          }
        }
      }
      return true;
    }
    return false;
  };
  _.permute = function permute(index_0, isUsed, solution) {
    var i;
    for (i = 0; i < isUsed.length; i++) {
      if (!isUsed[i]) {
        isUsed[i] = true;
        solution[index_0] = i;
        if (index_0 + 1 == solution.length)
          this.mPermutationList.add(ju.copyOf_9(solution, solution.length));
        else
          this.permute(index_0 + 1, isUsed, solution);
        isUsed[i] = false;
      }
    }
  };
  _.mMappableAtomCount = 0;
  cggl.Lcom_actelion_research_chem_reaction_mapping_ReactionCenterMapper$UnmappedCenterAtoms_2_classLit = createForClass("com.actelion.research.chem.reaction.mapping", "ReactionCenterMapper/UnmappedCenterAtoms", 83, cggl.Ljava_lang_Object_2_classLit);
  carcrm.$clinit_RootAtomPair = function $clinit_RootAtomPair() {
    carcrm.$clinit_RootAtomPair = emptyMethod;
    jl.$clinit_Object();
  };
  carcrm.RootAtomPair = function RootAtomPair(reactantAtom, productAtom) {
    carcrm.$clinit_RootAtomPair();
    Object_0.call(this);
    this.$init_144();
    this.reactantAtom = reactantAtom;
    this.productAtom = productAtom;
  };
  defineClass(116, 1, { 116: 1, 22: 1, 1: 1 }, carcrm.RootAtomPair);
  _.$init_144 = function $init_144() {
  };
  _.compareTo_1 = function compareTo_24(pair) {
    return this.compareTo_12(castTo(pair, 116));
  };
  _.compareTo_12 = function compareTo_23(pair) {
    return this.reactantAtom < pair.reactantAtom ? -1 : this.reactantAtom > pair.reactantAtom ? 1 : this.productAtom < pair.productAtom ? -1 : this.productAtom > pair.productAtom ? 1 : 0;
  };
  _.productAtom = 0;
  _.reactantAtom = 0;
  cggl.Lcom_actelion_research_chem_reaction_mapping_RootAtomPair_2_classLit = createForClass("com.actelion.research.chem.reaction.mapping", "RootAtomPair", 116, cggl.Ljava_lang_Object_2_classLit);
  carcrm.$clinit_RootAtomPairDecisionHelper = function $clinit_RootAtomPairDecisionHelper() {
    carcrm.$clinit_RootAtomPairDecisionHelper = emptyMethod;
    jl.$clinit_Object();
  };
  carcrm.RootAtomPairDecisionHelper = function RootAtomPairDecisionHelper() {
    carcrm.$clinit_RootAtomPairDecisionHelper();
    Object_0.call(this);
    this.$init_145();
    this.mRootNode = new carcrm.RootAtomPairDecisionNode();
    this.mCurrentNode = this.mRootNode;
  };
  defineClass(499, 1, { 1: 1 }, carcrm.RootAtomPairDecisionHelper);
  _.$init_145 = function $init_145() {
  };
  _.getNextChoice = function getNextChoice(choiceCount) {
    var choice;
    choice = this.mCurrentNode.getNextChoice(choiceCount);
    this.mCurrentNode = this.mCurrentNode.getChild(choice);
    return choice;
  };
  _.isComplete = function isComplete() {
    return this.mRootNode.isComplete();
  };
  _.reset_0 = function reset_0() {
    this.mCurrentNode = this.mRootNode;
  };
  cggl.Lcom_actelion_research_chem_reaction_mapping_RootAtomPairDecisionHelper_2_classLit = createForClass("com.actelion.research.chem.reaction.mapping", "RootAtomPairDecisionHelper", 499, cggl.Ljava_lang_Object_2_classLit);
  carcrm.$clinit_RootAtomPairDecisionNode = function $clinit_RootAtomPairDecisionNode() {
    carcrm.$clinit_RootAtomPairDecisionNode = emptyMethod;
    jl.$clinit_Object();
  };
  carcrm.RootAtomPairDecisionNode = function RootAtomPairDecisionNode() {
    carcrm.$clinit_RootAtomPairDecisionNode();
    Object_0.call(this);
    this.$init_146();
    this.mChoiceCount = -1;
  };
  defineClass(192, 1, { 192: 1, 1: 1 }, carcrm.RootAtomPairDecisionNode);
  _.$init_146 = function $init_146() {
  };
  _.getChild = function getChild(no) {
    return this.mChildren[no];
  };
  _.getNextChoice = function getNextChoice_0(choiceCount) {
    if (this.mChoiceCount == -1) {
      this.mChildren = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_reaction_mapping_RootAtomPairDecisionNode_2_classLit, { 4: 1, 1: 1, 7: 1 }, 192, choiceCount, 0, 1);
      this.mChoiceCount = choiceCount;
      this.mCurrentChoice = choiceCount - 1;
    } else {
      do {
        this.mCurrentChoice = this.mCurrentChoice == 0 ? this.mChoiceCount - 1 : this.mCurrentChoice - 1;
      } while (isNotNull(this.mChildren[this.mCurrentChoice]) && this.mChildren[this.mCurrentChoice].isComplete());
    }
    if (isNull(this.mChildren[this.mCurrentChoice]))
      setCheck(this.mChildren, this.mCurrentChoice, new carcrm.RootAtomPairDecisionNode());
    return this.mCurrentChoice;
  };
  _.isComplete = function isComplete_0() {
    var child, child$array, child$index, child$max, nullChildFound;
    if (!this.mIsComplete) {
      if (this.mChoiceCount == -1) {
        this.mIsComplete = true;
      } else {
        nullChildFound = false;
        for (child$array = this.mChildren, child$index = 0, child$max = child$array.length; child$index < child$max; ++child$index) {
          child = child$array[child$index];
          if (isNull(child))
            nullChildFound = true;
          else if (!child.isComplete())
            return false;
        }
        this.mIsComplete = !nullChildFound;
      }
    }
    return this.mIsComplete;
  };
  _.mChoiceCount = 0;
  _.mCurrentChoice = 0;
  _.mIsComplete = false;
  cggl.Lcom_actelion_research_chem_reaction_mapping_RootAtomPairDecisionNode_2_classLit = createForClass("com.actelion.research.chem.reaction.mapping", "RootAtomPairDecisionNode", 192, cggl.Ljava_lang_Object_2_classLit);
  carcrm.$clinit_RootAtomPairSource = function $clinit_RootAtomPairSource() {
    carcrm.$clinit_RootAtomPairSource = emptyMethod;
    jl.$clinit_Object();
    carcrm.PSEUDO_MAP_NO_SKIPPED_PAIR = -99999;
  };
  carcrm.RootAtomPairSource = function RootAtomPairSource(reactant, product, reactantMapNo, productMapNo, vetoMatrix) {
    carcrm.$clinit_RootAtomPairSource();
    var atoms, envKey, envKey$iterator;
    Object_0.call(this);
    this.$init_147();
    this.mReactant = reactant;
    this.mProduct = product;
    this.mReactantMapNo = reactantMapNo;
    this.mProductMapNo = productMapNo;
    this.mVetoMatrix = vetoMatrix;
    this.initializeAtomRanking();
    this.initializeRanks();
    this.mEnvToAtomsMap = this.buildEnvToAtomMaps();
    this.mEnvKey = this.getEnvKeys(this.mEnvToAtomsMap);
    this.mMappableAtomCount = 0;
    for (envKey$iterator = this.mEnvToAtomsMap[0].keySet().iterator(); envKey$iterator.hasNext_0(); ) {
      envKey = castTo(envKey$iterator.next_3(), 8);
      atoms = castTo(this.mEnvToAtomsMap[0].get(envKey), 25);
      this.mMappableAtomCount += $wnd.Math.min(atoms[0].length, atoms[1].length);
    }
    this.mIsStoichiometric = this.mMappableAtomCount == this.mReactant.getAtoms_0() && this.mReactant.getAtoms_0() == this.mProduct.getAtoms_0();
    this.mReactantFragmentNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mReactant.getAtoms_0(), 15, 1);
    this.mProductFragmentNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mProduct.getAtoms_0(), 15, 1);
    this.mReactantFragmentUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mReactant.getFragmentNumbers_0(this.mReactantFragmentNo, false, false), 16, 1);
    this.mProductFragmentUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mProduct.getFragmentNumbers_0(this.mProductFragmentNo, false, false), 16, 1);
    this.mManualMapCount = this.assignManuallyMappedPairs();
    this.mCurrentRadius = 7;
    this.mSequenceCount = 0;
  };
  defineClass(498, 1, { 1: 1 }, carcrm.RootAtomPairSource);
  _.$init_147 = function $init_147() {
  };
  _.areEquivalentAndInDifferentUnusedFragments = function areEquivalentAndInDifferentUnusedFragments(atom, mapNo, fragmentNo, fragmentUsed, symmetryRank) {
    var a, a$array, a$array0, a$index, a$index0, a$max, a$max0, rank, sameFragmentUsed;
    sameFragmentUsed = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, fragmentUsed.length, 16, 1);
    for (a$array0 = atom, a$index0 = 0, a$max0 = a$array0.length; a$index0 < a$max0; ++a$index0) {
      a = a$array0[a$index0];
      if (mapNo[a] == 0) {
        if (fragmentUsed[fragmentNo[a]])
          return false;
        if (sameFragmentUsed[fragmentNo[a]])
          return false;
        sameFragmentUsed[fragmentNo[a]] = true;
      }
    }
    rank = -1;
    for (a$array = atom, a$index = 0, a$max = a$array.length; a$index < a$max; ++a$index) {
      a = a$array[a$index];
      if (mapNo[a] == 0) {
        if (rank == -1)
          rank = symmetryRank[a];
        else if (symmetryRank[a] != rank)
          return false;
      }
    }
    return true;
  };
  _.assignManuallyMappedPairs = function assignManuallyMappedPairs() {
    var atom, atom0, mapNo, mapNoToProductAtom, maxMapNo, productAtom, reactantAtom, reactantMapNo;
    this.mPairBuffer = new ju.ArrayList();
    mapNo = 1;
    maxMapNo = 0;
    for (atom0 = 0; atom0 < this.mProduct.getAtoms_0(); atom0++)
      if (this.mProduct.getAtomMapNo_0(atom0) != 0 && !this.mProduct.isAutoMappedAtom_0(atom0))
        maxMapNo = $wnd.Math.max(maxMapNo, this.mProduct.getAtomMapNo_0(atom0));
    if (maxMapNo != 0) {
      mapNoToProductAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, maxMapNo + 1, 15, 1);
      for (atom = 0; atom < this.mProduct.getAtoms_0(); atom++)
        if (this.mProduct.getAtomMapNo_0(atom) != 0 && !this.mProduct.isAutoMappedAtom_0(atom))
          mapNoToProductAtom[this.mProduct.getAtomMapNo_0(atom)] = atom + 1;
      for (reactantAtom = 0; reactantAtom < this.mReactant.getAtoms_0(); reactantAtom++) {
        reactantMapNo = this.mReactant.getAtomMapNo_0(reactantAtom);
        if (reactantMapNo != 0 && reactantMapNo <= maxMapNo && !this.mReactant.isAutoMappedAtom_0(reactantAtom) && mapNoToProductAtom[reactantMapNo] != 0) {
          productAtom = mapNoToProductAtom[reactantMapNo] - 1;
          this.mReactantMapNo[reactantAtom] = mapNo;
          this.mProductMapNo[productAtom] = mapNo++;
          this.mPairBuffer.add(new carcrm.RootAtomPair(reactantAtom, productAtom));
        }
      }
    }
    return this.mPairBuffer.size();
  };
  _.buildEnvToAtomMaps = function buildEnvToAtomMaps() {
    var atoms, envKey, envKey$iterator, envMap, productAtomEnv, productAtoms, productMap, radius, reactantAtomEnv, reactantAtoms, reactantMap;
    reactantAtomEnv = this.classifyAtomEnvironment(this.mReactant);
    productAtomEnv = this.classifyAtomEnvironment(this.mProduct);
    envMap = initUnidimensionalArray(cggl.Ljava_util_TreeMap_2_classLit, { 4: 1, 1: 1, 7: 1 }, 51, 7 + 1, 0, 1);
    reactantMap = this.buildEnvToAtomMaps_0(this.mReactant, reactantAtomEnv);
    productMap = this.buildEnvToAtomMaps_0(this.mProduct, productAtomEnv);
    for (radius = 0; radius <= 7; radius++) {
      setCheck(envMap, radius, new ju.TreeMap_0(new caru.ByteArrayComparator()));
      for (envKey$iterator = reactantMap[radius].keySet().iterator(); envKey$iterator.hasNext_0(); ) {
        envKey = castTo(envKey$iterator.next_3(), 8);
        reactantAtoms = castTo(reactantMap[radius].get(envKey), 6);
        productAtoms = castTo(productMap[radius].get(envKey), 6);
        if (jsNotEquals(productAtoms, null)) {
          atoms = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 2, 0, 2);
          atoms[0] = reactantAtoms;
          atoms[1] = productAtoms;
          envMap[radius].put(envKey, atoms);
        }
      }
    }
    return envMap;
  };
  _.buildEnvToAtomMaps_0 = function buildEnvToAtomMaps_0(mol, atomEnv) {
    var atom, atoms, env, map_0, radius;
    map_0 = initUnidimensionalArray(cggl.Ljava_util_TreeMap_2_classLit, { 4: 1, 1: 1, 7: 1 }, 51, 7 + 1, 0, 1);
    for (radius = 0; radius <= 7; radius++) {
      setCheck(map_0, radius, new ju.TreeMap_0(new caru.ByteArrayComparator()));
      for (atom = 0; atom < mol.getAtoms_0(); atom++) {
        env = atomEnv[atom][radius];
        if (jsNotEquals(env, null)) {
          atoms = castTo(map_0[radius].get(env), 6);
          atoms = jsEquals(atoms, null) ? initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 1, 15, 1) : ju.copyOf_9(atoms, atoms.length + 1);
          atoms[atoms.length - 1] = atom;
          map_0[radius].put(env, atoms);
        }
      }
    }
    return map_0;
  };
  _.canCalcNextBaseValues_0 = function canCalcNextBaseValues_0(mol, atomRank) {
    var atom, atom0, connBond, connRank, i, i0, i1, j, k, neighbour, neighbours, rank;
    connRank = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMaxConnAtoms, 15, 1);
    for (atom0 = 0; atom0 < mol.getAtoms_0(); atom0++) {
      neighbours = mol.getConnAtoms_0(atom0) + mol.getMetalBondedConnAtoms_0(atom0);
      neighbour = 0;
      for (i0 = 0; i0 < mol.getAllConnAtomsPlusMetalBonds_0(atom0); i0++) {
        if (i0 < mol.getConnAtoms_0(atom0) || i0 >= mol.getAllConnAtoms_0(atom0)) {
          rank = 2 * atomRank[mol.getConnAtom_0(atom0, i0)];
          connBond = mol.getConnBond_0(atom0, i0);
          if (mol.getBondOrder_0(connBond) == 2) {
            if (!mol.isAromaticBond_0(connBond))
              rank++;
          }
          for (j = 0; j < neighbour; j++)
            if (rank < connRank[j])
              break;
          for (k = neighbour; k > j; k--)
            connRank[k] = connRank[k - 1];
          connRank[j] = rank;
          neighbour++;
        }
      }
      this.mCanBase[atom0].init_0(atom0);
      this.mCanBase[atom0].add_0(this.mAtomBits, fromInt_0(atomRank[atom0]));
      for (i1 = neighbours; i1 < this.mMaxConnAtoms; i1++)
        this.mCanBase[atom0].add_0(this.mAtomBits + 1, 0);
      for (i = 0; i < neighbours; i++)
        this.mCanBase[atom0].add_0(this.mAtomBits + 1, fromInt_0(connRank[i]));
    }
    for (atom = mol.getAtoms_0(); atom < this.mCanBase.length; atom++) {
      this.mCanBase[atom].init_0(atom);
      this.mCanBase[atom].add_0(this.mAtomBits, fromInt_0(mol.getAtoms_0() + 1));
      for (i = 0; i < this.mMaxConnAtoms; i++)
        this.mCanBase[atom].add_0(this.mAtomBits + 1, 0);
    }
  };
  _.classifyAtomEnvironment = function classifyAtomEnvironment(mol) {
    var atom, atom0, atomList, atomMask, bondMask, connAtom, environment, fragment, i, j, max_0, min_0, newMax, rootAtom, sphere;
    mol.ensureHelperArrays_0(7);
    fragment = new carc2.StereoMolecule_0(mol.getAtoms_0(), mol.getBonds_0());
    environment = initMultidimensionalArray(cggl.B_classLit, [{ 229: 1, 4: 1, 1: 1, 7: 1 }, { 68: 1, 4: 1, 1: 1, 7: 1 }], [68, 8], 0, [mol.getAtoms_0(), 7 + 1], 2);
    atomList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 15, 1);
    atomMask = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 16, 1);
    bondMask = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getBonds_0(), 16, 1);
    for (rootAtom = 0; rootAtom < mol.getAtoms_0(); rootAtom++) {
      if (rootAtom != 0) {
        ju.fill_4(atomMask, false);
        ju.fill_4(bondMask, false);
      }
      environment[rootAtom][0] = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
      environment[rootAtom][0][0] = narrow_byte(mol.getAtomicNo_0(rootAtom));
      environment[rootAtom][0][1] = narrow_byte(mol.getAtomMass_0(rootAtom));
      atomList[0] = rootAtom;
      atomMask[rootAtom] = true;
      min_0 = 0;
      max_0 = 1;
      mol.setAtomSelection_0(rootAtom, true);
      for (sphere = 1; sphere <= 7 && max_0 < mol.getAtoms_0(); sphere++) {
        newMax = max_0;
        for (i = min_0; i < max_0; i++) {
          atom0 = atomList[i];
          for (j = 0; j < mol.getConnAtoms_0(atom0); j++) {
            connAtom = mol.getConnAtom_0(atom0, j);
            if (!atomMask[connAtom]) {
              atomMask[connAtom] = true;
              atomList[newMax++] = connAtom;
            }
            bondMask[mol.getConnBond_0(atom0, j)] = true;
          }
        }
        if (newMax == max_0)
          break;
        min_0 = max_0;
        max_0 = newMax;
        mol.copyMoleculeByBonds_0(fragment, bondMask, true, null);
        for (atom = 0; atom < fragment.getAllAtoms_0(); atom++) {
          fragment.setAtomCharge_0(atom, 0);
          fragment.setAtomRadical_0(atom, 0);
        }
        environment[rootAtom][sphere] = jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$(new carc2.Canonizer_0(fragment, 16).getIDCode_0(), (jnc.$clinit_StandardCharsets(), jnc.UTF_8));
      }
      mol.setAtomSelection_0(rootAtom, false);
    }
    return environment;
  };
  _.consolidateRanking = function consolidateRanking(atomRank) {
    var canRank, i, index_0;
    canRank = 0;
    ju.sort_5(this.mCanBase);
    for (i = 0; i < atomRank.length; i++) {
      if (i == 0 || this.mCanBase[i].compareTo_0(this.mCanBase[i - 1]) != 0)
        canRank++;
      index_0 = this.mCanBase[i].getAtom();
      atomRank[index_0] = canRank;
    }
    return canRank;
  };
  _.createDistinctRankPairs = function createDistinctRankPairs(reactantAtom, productAtom) {
    var pa, pa$array, pa$index, pa$max, pair, ra, ra$array, ra$index, ra$max, rankPairSet;
    rankPairSet = new ju.TreeSet_0(new caru.IntArrayComparator());
    for (ra$array = reactantAtom, ra$index = 0, ra$max = ra$array.length; ra$index < ra$max; ++ra$index) {
      ra = ra$array[ra$index];
      for (pa$array = productAtom, pa$index = 0, pa$max = pa$array.length; pa$index < pa$max; ++pa$index) {
        pa = pa$array[pa$index];
        pair = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
        pair[0] = this.mReactantRank[ra];
        pair[1] = this.mProductRank[pa];
        rankPairSet.add(pair);
      }
    }
    return castTo(rankPairSet.toArray_0(initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 0, 0, 2)), 25);
  };
  _.createPair = function createPair(reactantAtom, productAtom) {
    if (this.mProduct.getConnAtoms_0(productAtom) != 0)
      this.mReactantFragmentUsed[this.mReactantFragmentNo[reactantAtom]] = true;
    if (this.mReactant.getConnAtoms_0(reactantAtom) != 0)
      this.mProductFragmentUsed[this.mProductFragmentNo[productAtom]] = true;
    return new carcrm.RootAtomPair(reactantAtom, productAtom);
  };
  _.elevateAtomRank = function elevateAtomRank(mol, atomRank, atom, maxRank) {
    var currentAtomRank, i, i0, oldMaxRank, sharedRankFound;
    currentAtomRank = atomRank[atom];
    sharedRankFound = false;
    for (i0 = 0; i0 < mol.getAtoms_0(); i0++) {
      if (i0 != atom && atomRank[i0] == currentAtomRank) {
        sharedRankFound = true;
        break;
      }
    }
    if (!sharedRankFound)
      return maxRank;
    for (i = 0; i < mol.getAtoms_0(); i++)
      if (i == atom || atomRank[i] > currentAtomRank)
        atomRank[i]++;
    maxRank++;
    do {
      oldMaxRank = maxRank;
      this.canCalcNextBaseValues_0(mol, atomRank);
      maxRank = this.consolidateRanking(atomRank);
    } while (oldMaxRank != maxRank);
    return maxRank;
  };
  _.getEnvKeys = function getEnvKeys(envMap) {
    var index_0, key, key$iterator, keys_0, radius;
    keys_0 = initUnidimensionalArray(cggl.B_classLit, { 229: 1, 4: 1, 1: 1, 7: 1 }, 68, 7 + 1, 0, 3);
    for (radius = 0; radius <= 7; radius++) {
      keys_0[radius] = initUnidimensionalArray(cggl.B_classLit, { 68: 1, 4: 1, 1: 1, 7: 1 }, 8, envMap[radius].size(), 0, 2);
      index_0 = 0;
      for (key$iterator = envMap[radius].keySet().iterator(); key$iterator.hasNext_0(); ) {
        key = castTo(key$iterator.next_3(), 8);
        keys_0[radius][index_0++] = key;
      }
    }
    return keys_0;
  };
  _.getManualMapCount = function getManualMapCount() {
    return this.mManualMapCount;
  };
  _.getMappableAtomCount = function getMappableAtomCount_0() {
    return this.mMappableAtomCount;
  };
  _.getUnmappedAtoms = function getUnmappedAtoms(atoms, mapNo) {
    var atom, atom$array, atom$array0, atom$index, atom$index0, atom$max, atom$max0, unmappedAtom, unmappedAtomCount;
    unmappedAtomCount = 0;
    for (atom$array0 = atoms, atom$index0 = 0, atom$max0 = atom$array0.length; atom$index0 < atom$max0; ++atom$index0) {
      atom = atom$array0[atom$index0];
      if (mapNo[atom] == 0)
        unmappedAtomCount++;
    }
    if (unmappedAtomCount == 0)
      return null;
    unmappedAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, unmappedAtomCount, 15, 1);
    unmappedAtomCount = 0;
    for (atom$array = atoms, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
      atom = atom$array[atom$index];
      if (mapNo[atom] == 0)
        unmappedAtom[unmappedAtomCount++] = atom;
    }
    return unmappedAtom;
  };
  _.hasNextPairSequence = function hasNextPairSequence() {
    if (this.mSequenceCount++ == 64)
      return false;
    if (isNull(this.mDecisionHelper)) {
      this.mDecisionHelper = new carcrm.RootAtomPairDecisionHelper();
      return true;
    }
    if (this.mDecisionHelper.isComplete())
      return false;
    this.reset_1();
    return true;
  };
  _.initializeAtomRanking = function initializeAtomRanking() {
    var atom, atom0, atom1, baseValueSize, maxAtomCount;
    maxAtomCount = $wnd.Math.max(this.mReactant.getAtoms_0(), this.mProduct.getAtoms_0());
    this.mAtomBits = carc2.getNeededBits(maxAtomCount);
    this.mMaxConnAtoms = 2;
    for (atom0 = 0; atom0 < this.mReactant.getAtoms_0(); atom0++)
      this.mMaxConnAtoms = $wnd.Math.max(this.mMaxConnAtoms, this.mReactant.getConnAtoms_0(atom0) + this.mReactant.getMetalBondedConnAtoms_0(atom0));
    for (atom1 = 0; atom1 < this.mProduct.getAtoms_0(); atom1++)
      this.mMaxConnAtoms = $wnd.Math.max(this.mMaxConnAtoms, this.mProduct.getConnAtoms_0(atom1) + this.mProduct.getMetalBondedConnAtoms_0(atom1));
    baseValueSize = $wnd.Math.max(2, narrow_int((62 + this.mAtomBits + this.mMaxConnAtoms * (this.mAtomBits + 5)) / 63));
    this.mCanBase = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_CanonizerBaseValue_2_classLit, { 4: 1, 1: 1, 7: 1 }, 106, maxAtomCount, 0, 1);
    for (atom = 0; atom < maxAtomCount; atom++)
      setCheck(this.mCanBase, atom, new carc2.CanonizerBaseValue(baseValueSize));
    this.mReactantCanonizer = new carc2.Canonizer_0(this.mReactant, 1);
    this.mProductCanonizer = new carc2.Canonizer_0(this.mProduct, 1);
  };
  _.initializeRanks = function initializeRanks() {
    var productRank_, rank, rank$array, rank$array0, rank$index, rank$index0, rank$max, rank$max0, reactantRank_;
    reactantRank_ = this.mReactantCanonizer.getSymmetryRanks_0();
    this.mReactantRank = ju.copyOf_9(reactantRank_, reactantRank_.length);
    productRank_ = this.mProductCanonizer.getSymmetryRanks_0();
    this.mProductRank = ju.copyOf_9(productRank_, productRank_.length);
    for (rank$array0 = this.mReactantRank, rank$index0 = 0, rank$max0 = rank$array0.length; rank$index0 < rank$max0; ++rank$index0) {
      rank = rank$array0[rank$index0];
      if (this.mHighestReactionRank < rank)
        this.mHighestReactionRank = rank;
    }
    for (rank$array = this.mProductRank, rank$index = 0, rank$max = rank$array.length; rank$index < rank$max; ++rank$index) {
      rank = rank$array[rank$index];
      if (this.mHighestProductRank < rank)
        this.mHighestProductRank = rank;
    }
  };
  _.makePairsFromSimilarAtoms = function makePairsFromSimilarAtoms(reactantAtoms, productAtoms) {
    var atom, atom$array, atom$array0, atom$index, atom$index0, atom$max, atom$max0, choice, chosenProductAtom, chosenReactantAtom, rankPairList, unusedProductAtom, unusedReactantAtom;
    unusedReactantAtom = this.getUnmappedAtoms(reactantAtoms, this.mReactantMapNo);
    if (jsEquals(unusedReactantAtom, null))
      return null;
    unusedProductAtom = this.getUnmappedAtoms(productAtoms, this.mProductMapNo);
    if (jsEquals(unusedProductAtom, null))
      return null;
    if (unusedReactantAtom.length == 1 && unusedProductAtom.length == 1)
      return new carcrm.RootAtomPair(unusedReactantAtom[0], unusedProductAtom[0]);
    rankPairList = this.createDistinctRankPairs(unusedReactantAtom, unusedProductAtom);
    if (rankPairList.length == 1)
      return new carcrm.RootAtomPair(unusedReactantAtom[0], unusedProductAtom[0]);
    choice = this.mDecisionHelper.getNextChoice(rankPairList.length);
    chosenReactantAtom = -1;
    for (atom$array0 = unusedReactantAtom, atom$index0 = 0, atom$max0 = atom$array0.length; atom$index0 < atom$max0; ++atom$index0) {
      atom = atom$array0[atom$index0];
      if (this.mReactantRank[atom] == rankPairList[choice][0]) {
        chosenReactantAtom = atom;
        break;
      }
    }
    chosenProductAtom = -1;
    for (atom$array = unusedProductAtom, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
      atom = atom$array[atom$index];
      if (this.mProductRank[atom] == rankPairList[choice][1]) {
        chosenProductAtom = atom;
        break;
      }
    }
    this.mHighestReactionRank = this.elevateAtomRank(this.mReactant, this.mReactantRank, chosenReactantAtom, this.mHighestReactionRank);
    this.mHighestProductRank = this.elevateAtomRank(this.mProduct, this.mProductRank, chosenProductAtom, this.mHighestProductRank);
    return new carcrm.RootAtomPair(chosenReactantAtom, chosenProductAtom);
  };
  _.nextPair = function nextPair() {
    var i, i0, pair, productAtomHasUnmappedNeighbours, reactantAtomHasUnmappedNeighbours;
    pair = this.nextRawPair();
    while (isNotNull(pair)) {
      reactantAtomHasUnmappedNeighbours = false;
      for (i0 = 0; i0 < this.mReactant.getConnAtoms_0(pair.reactantAtom); i0++)
        if (this.mReactantMapNo[this.mReactant.getConnAtom_0(pair.reactantAtom, i0)] == 0)
          reactantAtomHasUnmappedNeighbours = true;
      productAtomHasUnmappedNeighbours = false;
      for (i = 0; i < this.mProduct.getConnAtoms_0(pair.productAtom); i++)
        if (this.mProductMapNo[this.mProduct.getConnAtom_0(pair.productAtom, i)] == 0)
          productAtomHasUnmappedNeighbours = true;
      if (reactantAtomHasUnmappedNeighbours && productAtomHasUnmappedNeighbours)
        break;
      this.mReactantMapNo[pair.reactantAtom] = -99999;
      this.mProductMapNo[pair.productAtom] = -99999;
      pair = this.nextRawPair();
    }
    if (isNull(pair)) {
      for (i0 = 0; i0 < this.mReactantMapNo.length; i0++)
        if (this.mReactantMapNo[i0] == -99999)
          this.mReactantMapNo[i0] = 0;
      for (i = 0; i < this.mProductMapNo.length; i++)
        if (this.mProductMapNo[i] == -99999)
          this.mProductMapNo[i] = 0;
    }
    return pair;
  };
  _.nextRawPair = function nextRawPair() {
    var atoms, envKey, pair, productIndex, reactantIndex;
    while (!this.mPairBuffer.isEmpty()) {
      pair = castTo(this.mPairBuffer.removeAtIndex(0), 116);
      if (this.mReactantMapNo[pair.reactantAtom] == 0 && this.mProductMapNo[pair.productAtom] == 0)
        return pair;
    }
    while (this.mCurrentRadius >= 0) {
      while (this.mCurrentRadius >= 2 && this.mCurrentEnvIndex0 < this.mEnvKey[this.mCurrentRadius].length) {
        envKey = this.mEnvKey[this.mCurrentRadius][this.mCurrentEnvIndex0];
        atoms = castTo(this.mEnvToAtomsMap[this.mCurrentRadius].get(envKey), 25);
        if (this.mReactant.getAtomicNo_0(atoms[0][0]) == 6) {
          pair = this.makePairsFromSimilarAtoms(atoms[0], atoms[1]);
          if (isNotNull(pair))
            return pair;
        }
        this.mCurrentEnvIndex0++;
      }
      while (this.mCurrentRadius >= 2 && this.mCurrentEnvIndex1 < this.mEnvKey[this.mCurrentRadius].length) {
        envKey = this.mEnvKey[this.mCurrentRadius][this.mCurrentEnvIndex1];
        atoms = castTo(this.mEnvToAtomsMap[this.mCurrentRadius].get(envKey), 25);
        if (this.mReactant.getAtomicNo_0(atoms[0][0]) != 6) {
          pair = this.makePairsFromSimilarAtoms(atoms[0], atoms[1]);
          if (isNotNull(pair))
            return pair;
        }
        this.mCurrentEnvIndex1++;
      }
      while (this.mIsStoichiometric && this.mCurrentRadius == 0 && this.mCurrentEnvIndex2 < this.mEnvKey[0].length) {
        envKey = this.mEnvKey[0][this.mCurrentEnvIndex2++];
        atoms = castTo(this.mEnvToAtomsMap[this.mCurrentRadius].get(envKey), 25);
        if (atoms[0].length == 1 && atoms[1].length == 1) {
          pair = this.tryCreatePair(atoms[0][0], atoms[1][0]);
          if (isNotNull(pair))
            return pair;
        }
      }
      while (this.mCurrentRadius == 0 && this.mCurrentEnvIndex3 < this.mEnvKey[this.mCurrentRadius].length) {
        envKey = this.mEnvKey[this.mCurrentRadius][this.mCurrentEnvIndex3++];
        atoms = castTo(this.mEnvToAtomsMap[this.mCurrentRadius].get(envKey), 25);
        if (atoms[0].length >= atoms[1].length && this.areEquivalentAndInDifferentUnusedFragments(atoms[0], this.mReactantMapNo, this.mReactantFragmentNo, this.mReactantFragmentUsed, this.mReactantRank) || atoms[1].length >= atoms[0].length && this.areEquivalentAndInDifferentUnusedFragments(atoms[1], this.mProductMapNo, this.mProductFragmentNo, this.mProductFragmentUsed, this.mProductRank)) {
          reactantIndex = 0;
          productIndex = 0;
          while (reactantIndex < atoms[0].length && this.mReactantMapNo[atoms[0][reactantIndex]] != 0)
            reactantIndex++;
          while (productIndex < atoms[1].length && this.mProductMapNo[atoms[1][productIndex]] != 0)
            productIndex++;
          if (reactantIndex < atoms[0].length && productIndex < atoms[1].length) {
            pair = this.tryCreatePair(atoms[0][reactantIndex], atoms[1][productIndex]);
            if (isNotNull(pair))
              return pair;
          }
        }
      }
      this.mCurrentRadius--;
      this.mCurrentEnvIndex0 = 0;
      this.mCurrentEnvIndex1 = 0;
      this.mCurrentEnvIndex2 = 0;
      this.mCurrentEnvIndex3 = 0;
    }
    return null;
  };
  _.reset_1 = function reset_1() {
    ju.fill_0(this.mReactantMapNo, 0);
    ju.fill_0(this.mProductMapNo, 0);
    ju.fill_4(this.mReactantFragmentUsed, false);
    ju.fill_4(this.mProductFragmentUsed, false);
    this.initializeRanks();
    this.mDecisionHelper.reset_0();
    this.mManualMapCount = this.assignManuallyMappedPairs();
    this.mCurrentRadius = 7;
    this.mCurrentEnvIndex0 = 0;
    this.mCurrentEnvIndex1 = 0;
    this.mCurrentEnvIndex2 = 0;
    this.mCurrentEnvIndex3 = 0;
  };
  _.tryCreatePair = function tryCreatePair(reactantAtom, productAtom) {
    if (jsNotEquals(this.mVetoMatrix, null) && jsNotEquals(this.mVetoMatrix[reactantAtom], null) && this.mVetoMatrix[reactantAtom][productAtom])
      return null;
    if (this.mReactantMapNo[reactantAtom] == 0 && this.mProductMapNo[productAtom] == 0)
      return this.createPair(reactantAtom, productAtom);
    return null;
  };
  _.mAtomBits = 0;
  _.mCurrentEnvIndex0 = 0;
  _.mCurrentEnvIndex1 = 0;
  _.mCurrentEnvIndex2 = 0;
  _.mCurrentEnvIndex3 = 0;
  _.mCurrentRadius = 0;
  _.mHighestProductRank = 0;
  _.mHighestReactionRank = 0;
  _.mIsStoichiometric = false;
  _.mManualMapCount = 0;
  _.mMappableAtomCount = 0;
  _.mMaxConnAtoms = 0;
  _.mSequenceCount = 0;
  carcrm.MAX_ENVIRONMENT_RADIUS = 7;
  carcrm.MAX_PAIR_SEQUENCES = 64;
  carcrm.MIN_ENVIRONMENT_RADIUS = 2;
  carcrm.PSEUDO_MAP_NO_SKIPPED_PAIR = 0;
  cggl.Lcom_actelion_research_chem_reaction_mapping_RootAtomPairSource_2_classLit = createForClass("com.actelion.research.chem.reaction.mapping", "RootAtomPairSource", 498, cggl.Ljava_lang_Object_2_classLit);
  carcrm.$clinit_RuleIncomingFragment = function $clinit_RuleIncomingFragment() {
    carcrm.$clinit_RuleIncomingFragment = emptyMethod;
    jl.$clinit_Object();
  };
  carcrm.RuleIncomingFragment = function RuleIncomingFragment(ruleProduct, rootAtom, isUsedAtom) {
    carcrm.$clinit_RuleIncomingFragment();
    var candidate, connAtoms, current, highest, i;
    Object_0.call(this);
    this.$init_148();
    this.mGraphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, ruleProduct.getAtoms_0(), 15, 1);
    this.mGraphAtom[0] = rootAtom;
    isUsedAtom[rootAtom] = true;
    current = 0;
    highest = 0;
    while (current <= highest) {
      connAtoms = ruleProduct.getConnAtoms_0(this.mGraphAtom[current]);
      for (i = 0; i < connAtoms; i++) {
        candidate = ruleProduct.getConnAtom_0(this.mGraphAtom[current], i);
        if (ruleProduct.getAtomMapNo_0(candidate) == 0 && !ruleProduct.isExcludeGroupAtom(candidate) && !isUsedAtom[candidate]) {
          this.mGraphAtom[++highest] = candidate;
          isUsedAtom[candidate] = true;
        }
      }
      current++;
    }
    this.mGraphAtoms = current;
    this.mRuleProduct = ruleProduct;
  };
  defineClass(497, 1, { 1: 1 }, carcrm.RuleIncomingFragment);
  _.$init_148 = function $init_148() {
  };
  _.mGraphAtoms = 0;
  cggl.Lcom_actelion_research_chem_reaction_mapping_RuleIncomingFragment_2_classLit = createForClass("com.actelion.research.chem.reaction.mapping", "RuleIncomingFragment", 497, cggl.Ljava_lang_Object_2_classLit);
  carcrm.$clinit_SimilarityGraphBasedReactionMapper = function $clinit_SimilarityGraphBasedReactionMapper() {
    carcrm.$clinit_SimilarityGraphBasedReactionMapper = emptyMethod;
    jl.$clinit_Object();
    carcrm.MAX_ENVIRONMENT_SIMILARITY = 8 << 8;
    carcrm.MAX_SKELETON_SIMILARITY = 8 - 2 << 8;
  };
  carcrm.SimilarityGraphBasedReactionMapper = function SimilarityGraphBasedReactionMapper() {
    carcrm.$clinit_SimilarityGraphBasedReactionMapper();
    Object_0.call(this);
    this.$init_149();
  };
  carcrm.hasNonCarbonNeighbour = function hasNonCarbonNeighbour(mol, atom) {
    var i;
    for (i = 0; i < mol.getConnAtoms_0(atom); i++)
      if (mol.getAtomicNo_0(mol.getConnAtom_0(atom, i)) != 6)
        return true;
    return false;
  };
  carcrm.hasNonCarbonNeighbour_0 = function hasNonCarbonNeighbour_0(mol, atom, notThisAtom) {
    carcrm.$clinit_SimilarityGraphBasedReactionMapper();
    var i;
    for (i = 0; i < mol.getConnAtoms_0(atom); i++)
      if (mol.getAtomicNo_0(mol.getConnAtom_0(atom, i)) != 6 && mol.getConnAtom_0(atom, i) != notThisAtom)
        return true;
    return false;
  };
  carcrm.hasOxo_0 = function hasOxo_0(mol, atom) {
    var i;
    for (i = 0; i < mol.getConnAtoms_0(atom); i++)
      if (mol.getConnBondOrder_0(atom, i) == 2 && mol.getAtomicNo_0(mol.getConnAtom_0(atom, i)) > 6)
        return true;
    return false;
  };
  carcrm.hasOxo_1 = function hasOxo_1(mol, atom, notThisAtom) {
    carcrm.$clinit_SimilarityGraphBasedReactionMapper();
    var i;
    for (i = 0; i < mol.getConnAtoms_0(atom); i++)
      if (mol.getConnBondOrder_0(atom, i) == 2 && mol.getAtomicNo_0(mol.getConnAtom_0(atom, i)) > 6 && mol.getConnAtom_0(atom, i) != notThisAtom)
        return true;
    return false;
  };
  defineClass(496, 1, { 1: 1 }, carcrm.SimilarityGraphBasedReactionMapper);
  _.$init_149 = function $init_149() {
  };
  _.classifyNeighbourAtomEnvironment = function classifyNeighbourAtomEnvironment(mol, skeletonOnly, isWithoutPi) {
    var atom, atomList, atomMap, atomMask, bond, connAtom, connIndex, environment, fragment, fromAtom, i, i0, j, max_0, min_0, newMax, rootAtom, sphere;
    mol.ensureHelperArrays_0(7);
    fragment = new carc2.StereoMolecule_0(mol.getAtoms_0(), mol.getBonds_0());
    environment = initMultidimensionalArray(cggl.B_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 229: 1, 4: 1, 1: 1, 7: 1 }], [229, 68], 0, [mol.getAtoms_0(), 8], 2);
    atomList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 15, 1);
    atomMap = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 15, 1);
    atomMask = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 16, 1);
    for (rootAtom = 0; rootAtom < mol.getAtoms_0(); rootAtom++) {
      environment[rootAtom] = initMultidimensionalArray(cggl.B_classLit, [{ 229: 1, 4: 1, 1: 1, 7: 1 }, { 68: 1, 4: 1, 1: 1, 7: 1 }], [68, 8], 0, [mol.getConnAtoms_0(rootAtom), 8], 2);
      if (skeletonOnly && mol.getAtomicNo_0(rootAtom) != 6)
        continue;
      for (connIndex = 0; connIndex < mol.getConnAtoms_0(rootAtom); connIndex++) {
        fromAtom = mol.getConnAtom_0(rootAtom, connIndex);
        if (jsEquals(atomMask, null))
          atomMask = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 16, 1);
        else
          ju.fill_4(atomMask, false);
        min_0 = 1;
        max_0 = 2;
        mol.setAtomSelection_0(fromAtom, true);
        for (sphere = 0; sphere < 8 && max_0 < mol.getAtoms_0(); sphere++) {
          if (sphere == 0) {
            atomList[0] = fromAtom;
            atomMask[fromAtom] = true;
            atomList[1] = rootAtom;
            atomMask[rootAtom] = true;
          } else {
            newMax = max_0;
            for (i0 = min_0; i0 < max_0; i0++) {
              atom = atomList[i0];
              for (j = 0; j < mol.getConnAtoms_0(atom); j++) {
                connAtom = mol.getConnAtom_0(atom, j);
                if (!atomMask[connAtom] && (!skeletonOnly || mol.getAtomicNo_0(connAtom) == 6)) {
                  atomMask[connAtom] = true;
                  atomList[newMax++] = connAtom;
                }
              }
            }
            if (newMax == max_0) {
              if (!skeletonOnly)
                for (i = sphere; i < 8; i++)
                  environment[rootAtom][connIndex][i] = environment[rootAtom][connIndex][i - 1];
              break;
            }
            min_0 = max_0;
            max_0 = newMax;
          }
          if (sphere == 0) {
            environment[rootAtom][connIndex][sphere] = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
            environment[rootAtom][connIndex][sphere][0] = narrow_byte(mol.getAtomicNo_0(rootAtom));
            environment[rootAtom][connIndex][sphere][1] = narrow_byte(mol.getAtomMass_0(rootAtom));
          } else {
            mol.copyMoleculeByAtoms_0(fragment, atomMask, true, atomMap);
            fragment.setAtomCharge_0(atomMap[fromAtom], 0);
            fragment.setAtomRadical_0(atomMap[fromAtom], 0);
            for (atom = 0; atom < mol.getAtoms_0(); atom++)
              if (atomMap[atom] != -1 && mol.getConnAtoms_0(atom) > fragment.getConnAtoms_0(atomMap[atom]))
                fragment.setAtomQueryFeature_0(atomMap[atom], 4096, true);
            if (skeletonOnly || isWithoutPi)
              for (bond = 0; bond < fragment.getBonds_0(); bond++)
                fragment.setBondType_0(bond, 1);
            environment[rootAtom][connIndex][sphere] = jl.getBytes_Ljava_nio_charset_Charset___B__devirtual$(new carc2.Canonizer_0(fragment, 16).getIDCode_0(), (jnc.$clinit_StandardCharsets(), jnc.UTF_8));
          }
        }
        mol.setAtomSelection_0(fromAtom, false);
      }
    }
    return environment;
  };
  _.connAtomsOfAtomicNo = function connAtomsOfAtomicNo(mol, atom, atomicNo) {
    var count, i;
    count = 0;
    for (i = 0; i < mol.getConnAtoms_0(atom); i++)
      if (mol.getAtomicNo_0(mol.getConnAtom_0(atom, i)) == atomicNo)
        count++;
    return count;
  };
  _.copyMapNosToReaction = function copyMapNosToReaction(rxn, reactantMapNo, productMapNo, graphMapNoCount) {
    var atom, atom0, product, productAtom, productIndex, reactant, reactantAtom, reactantIndex;
    reactantIndex = 0;
    reactantAtom = -1;
    for (atom0 = 0; atom0 < this.mReactant.getAtoms_0(); atom0++) {
      reactant = rxn.getReactant_0(reactantIndex);
      reactant.ensureHelperArrays_0(1);
      do {
        if (++reactantAtom == reactant.getAtoms_0()) {
          reactantAtom = 0;
          reactant = rxn.getReactant_0(++reactantIndex);
        }
      } while (reactant.isFragment_0() && reactant.isExcludeGroupAtom(reactantAtom));
      reactant.setAtomMapNo_0(reactantAtom, reactantMapNo[atom0], reactantMapNo[atom0] <= graphMapNoCount || false);
    }
    productIndex = 0;
    productAtom = -1;
    for (atom = 0; atom < this.mProduct.getAtoms_0(); atom++) {
      product = rxn.getProduct_0(productIndex);
      product.ensureHelperArrays_0(1);
      do {
        if (++productAtom == product.getAtoms_0()) {
          productAtom = 0;
          product = rxn.getProduct_0(++productIndex);
        }
      } while (product.isFragment_0() && product.isExcludeGroupAtom(productAtom));
      product.setAtomMapNo_0(productAtom, productMapNo[atom], productMapNo[atom] <= graphMapNoCount || false);
    }
  };
  _.getAtomPairSequenceCount = function getAtomPairSequenceCount() {
    return this.mAtomPairSequenceCount;
  };
  _.getAtomSimilarity = function getAtomSimilarity(reactantRoot, reactantAtom, productRoot, productAtom) {
    var i, i0, productConnIndex, radius, reactantConnIndex;
    reactantConnIndex = -1;
    for (i0 = 0; i0 < this.mReactant.getConnAtoms_0(reactantAtom); i0++) {
      if (this.mReactant.getConnAtom_0(reactantAtom, i0) == reactantRoot) {
        reactantConnIndex = i0;
        break;
      }
    }
    productConnIndex = -1;
    for (i = 0; i < this.mProduct.getConnAtoms_0(productAtom); i++) {
      if (this.mProduct.getConnAtom_0(productAtom, i) == productRoot) {
        productConnIndex = i;
        break;
      }
    }
    for (radius = 0; radius < 8; radius++)
      if (this.mSimilarityComparator.compare_4(this.mReactantConnAtomEnv[reactantAtom][reactantConnIndex][radius], this.mProductConnAtomEnv[productAtom][productConnIndex][radius]) != 0)
        return radius << 8;
    return 2048;
  };
  _.getBondType_2 = function getBondType_1(mol, bond) {
    if (mol.isDelocalizedBond_0(bond))
      return 0;
    return mol.getBondTypeSimple_0(bond);
  };
  _.getGraphMapNoCount = function getGraphMapNoCount() {
    return this.mGraphMapNoCount;
  };
  _.getNextNeighbour = function getNextNeighbour(mol, rootAtom, atom) {
    var connAtom, i;
    for (i = 0; i < mol.getConnAtoms_0(atom); i++) {
      connAtom = mol.getConnAtom_0(atom, i);
      if (connAtom != rootAtom)
        return connAtom;
    }
    return -1;
  };
  _.getPiAndHeteroBondCount = function getPiAndHeteroBondCount(mol, atom) {
    var count, i;
    count = mol.getAtomPi_0(atom);
    for (i = 0; i < mol.getConnAtoms_0(atom); i++)
      if (mol.isElectronegative_0(mol.getConnAtom_0(atom, i)))
        count++;
    return count;
  };
  _.getProduct_1 = function getProduct_1() {
    return this.mProduct;
  };
  _.getReactant_1 = function getReactant_1() {
    return this.mReactant;
  };
  _.getScore = function getScore_0() {
    return this.mScore;
  };
  _.getSkeletonSimilarity = function getSkeletonSimilarity(reactantRoot, reactantAtom, productRoot, productAtom) {
    var i, i0, productConnIndex, radius, reactantConnIndex;
    reactantConnIndex = -1;
    for (i0 = 0; i0 < this.mReactant.getConnAtoms_0(reactantAtom); i0++) {
      if (this.mReactant.getConnAtom_0(reactantAtom, i0) == reactantRoot) {
        reactantConnIndex = i0;
        break;
      }
    }
    productConnIndex = -1;
    for (i = 0; i < this.mProduct.getConnAtoms_0(productAtom); i++) {
      if (this.mProduct.getConnAtom_0(productAtom, i) == productRoot) {
        productConnIndex = i;
        break;
      }
    }
    for (radius = 2; radius < 8; radius++) {
      if (jsEquals(this.mReactantSkelAtomEnv[reactantAtom][reactantConnIndex][radius], null) || this.mSimilarityComparator.compare_4(this.mReactantSkelAtomEnv[reactantAtom][reactantConnIndex][radius], this.mProductSkelAtomEnv[productAtom][productConnIndex][radius]) != 0)
        return radius - 2 << 8;
    }
    return 1536;
  };
  _.initializeRingMembership = function initializeRingMembership() {
    this.mReactantRingMembership = this.initializeRingMembership_0(this.mReactant);
    this.mProductRingMembership = this.initializeRingMembership_0(this.mProduct);
  };
  _.initializeRingMembership_0 = function initializeRingMembership_0(mol) {
    var atom, atom$array, atom$index, atom$max, ring, ringAtom, ringMembership, ringSet;
    ringMembership = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 15, 1);
    ringSet = mol.getRingSet_0();
    for (ring = 0; ring < $wnd.Math.min(32, ringSet.getSize_0()); ring++) {
      ringAtom = ringSet.getRingAtoms_0(ring);
      for (atom$array = ringAtom, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
        atom = atom$array[atom$index];
        ringMembership[atom] |= 1 << ring;
      }
    }
    return ringMembership;
  };
  _.leavesRing = function leavesRing(atom1, atom2, atom3, ringMembership) {
    return (ringMembership[atom1] & ringMembership[atom2] & ~ringMembership[atom3]) != 0;
  };
  _.map_2 = function map_2(reactant, product, reactantMapNo, productMapNo, vetoMatrix) {
    var centerMapper, i, i0, mappableAtomCount, pair, rootAtomPairSource, score, scorer;
    this.mReactant = reactant;
    this.mProduct = product;
    this.mReactantMapNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, reactantMapNo.length, 15, 1);
    this.mProductMapNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, productMapNo.length, 15, 1);
    this.mReactantConnAtomEnv = this.classifyNeighbourAtomEnvironment(this.mReactant, false, false);
    this.mReactantSkelAtomEnv = this.classifyNeighbourAtomEnvironment(this.mReactant, true, false);
    this.mProductConnAtomEnv = this.classifyNeighbourAtomEnvironment(this.mProduct, false, false);
    this.mProductSkelAtomEnv = this.classifyNeighbourAtomEnvironment(this.mProduct, true, false);
    this.initializeRingMembership();
    this.mSimilarityComparator = new caru.ByteArrayComparator();
    this.mScore = -1e10;
    rootAtomPairSource = new carcrm.RootAtomPairSource(reactant, product, this.mReactantMapNo, this.mProductMapNo, vetoMatrix);
    this.mAtomPairSequenceCount = 0;
    while (rootAtomPairSource.hasNextPairSequence()) {
      this.mAtomPairSequenceCount++;
      this.mMapNo = rootAtomPairSource.getManualMapCount();
      mappableAtomCount = rootAtomPairSource.getMappableAtomCount();
      pair = rootAtomPairSource.nextPair();
      while (isNotNull(pair)) {
        if (false) {
        }
        this.mapFromRootAtoms(pair);
        if (false) {
        }
        if (false) {
        }
        pair = rootAtomPairSource.nextPair();
      }
      this.mGraphMapNoCount = this.mMapNo;
      if (this.mMapNo < mappableAtomCount) {
        if (false) {
        }
        centerMapper = new carcrm.ReactionCenterMapper(this.mReactant, this.mProduct, this.mReactantMapNo, this.mProductMapNo, this.mMapNo, vetoMatrix);
        score = centerMapper.completeAndScoreMapping();
        this.mMapNo += centerMapper.getMappedAtomCount();
      } else {
        scorer = new carcrm.MappingScorer(this.mReactant, this.mProduct);
        score = scorer.scoreMapping(scorer.createReactantToProductAtomMap(this.mReactantMapNo, this.mProductMapNo));
      }
      if (false)
        (jl.$clinit_System(), jl.out_0).println_0("@ score:" + score);
      if (false) {
      }
      if (this.mScore < score) {
        this.mScore = score;
        for (i0 = 0; i0 < reactantMapNo.length; i0++)
          reactantMapNo[i0] = this.mReactantMapNo[i0];
        for (i = 0; i < productMapNo.length; i++)
          productMapNo[i] = this.mProductMapNo[i];
      }
    }
  };
  _.map_1 = function map_4(rxn) {
    this.mergeReactantsAndProducts(rxn);
    this.map_2(this.mReactant, this.mProduct, initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mReactant.getAtoms_0(), 15, 1), initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mProduct.getAtoms_0(), 15, 1), null);
    this.copyMapNosToReaction(rxn, this.mReactantMapNo, this.mProductMapNo, this.mGraphMapNoCount);
  };
  _.mapFromRootAtoms = function mapFromRootAtoms(root) {
    var bestMatch, bestProductAtom, bestReactantAtom, bondType, candidateBond, current, envSimilarity, graphAtom, graphParent, highest, i, i0, isStereoMatch, j, match_0, productAtom, productCandidate, productParent, productRoot, reactantCandidate, reactantRoot, similarity, skelSimilarity;
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mReactant.getAtoms_0(), 15, 1);
    productAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mProduct.getAtoms_0(), 15, 1);
    graphParent = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mReactant.getAtoms_0(), 15, 1);
    productParent = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mProduct.getAtoms_0(), 15, 1);
    graphAtom[0] = root.reactantAtom;
    graphParent[root.reactantAtom] = root.reactantAtom;
    productAtom[0] = root.productAtom;
    productParent[root.productAtom] = root.productAtom;
    if (this.mReactantMapNo[root.reactantAtom] == 0) {
      this.mMapNo++;
      this.mReactantMapNo[root.reactantAtom] = this.mMapNo;
      this.mProductMapNo[root.productAtom] = this.mMapNo;
    }
    current = 0;
    highest = 0;
    while (current <= highest) {
      reactantRoot = graphAtom[current];
      productRoot = productAtom[current];
      match_0 = initMultidimensionalArray(cggl.I_classLit, [{ 25: 1, 4: 1, 1: 1, 7: 1 }, { 6: 1, 4: 1, 1: 1 }], [6, 5], 15, [this.mReactant.getConnAtoms_0(reactantRoot), this.mProduct.getConnAtoms_0(productRoot)], 2);
      for (i0 = 0; i0 < this.mReactant.getConnAtoms_0(reactantRoot); i0++) {
        reactantCandidate = this.mReactant.getConnAtom_0(reactantRoot, i0);
        if (this.mReactantMapNo[reactantCandidate] != 0)
          continue;
        bondType = this.getBondType_2(this.mReactant, this.mReactant.getConnBond_0(reactantRoot, i0));
        for (j = 0; j < this.mProduct.getConnAtoms_0(productRoot); j++) {
          productCandidate = this.mProduct.getConnAtom_0(productRoot, j);
          if (this.mProductMapNo[productCandidate] == 0 && this.mReactant.getAtomicNo_0(reactantCandidate) == this.mProduct.getAtomicNo_0(productCandidate)) {
            candidateBond = this.mProduct.getConnBond_0(productRoot, j);
            skelSimilarity = this.getSkeletonSimilarity(reactantRoot, reactantCandidate, productRoot, productCandidate);
            if (bondType == this.getBondType_2(this.mProduct, candidateBond) || skelSimilarity != 0) {
              if (this.passesBasicRules(reactantRoot, reactantCandidate, productRoot, productCandidate)) {
                envSimilarity = this.getAtomSimilarity(reactantRoot, reactantCandidate, productRoot, productCandidate);
                similarity = $wnd.Math.max(skelSimilarity, envSimilarity);
                if (similarity != 0) {
                  isStereoMatch = this.matchesStereo(graphParent[reactantRoot], reactantRoot, reactantCandidate, productParent[productRoot], productRoot, productCandidate);
                  if (this.passesSimilarityDependentRules(reactantRoot, reactantCandidate, productRoot, productCandidate, similarity, isStereoMatch)) {
                    match_0[i0][j] = similarity;
                    if (isStereoMatch)
                      match_0[i0][j] += 64;
                    if (this.leavesRing(graphParent[reactantRoot], reactantRoot, reactantCandidate, this.mReactantRingMembership) == this.leavesRing(productParent[productRoot], productRoot, productCandidate, this.mProductRingMembership))
                      match_0[i0][j] += 128;
                    if (this.getPiAndHeteroBondCount(this.mReactant, reactantCandidate) == this.getPiAndHeteroBondCount(this.mProduct, productCandidate))
                      match_0[i0][j] += 1;
                  }
                }
              }
            } else if (this.getAtomSimilarity(reactantRoot, reactantCandidate, productRoot, productCandidate) == 2048) {
              match_0[i0][j] = 3 << 8;
            }
          }
        }
      }
      while (true) {
        bestMatch = 0;
        bestReactantAtom = -1;
        bestProductAtom = -1;
        for (i = 0; i < match_0.length; i++) {
          reactantCandidate = this.mReactant.getConnAtom_0(reactantRoot, i);
          if (this.mReactantMapNo[reactantCandidate] == 0) {
            for (j = 0; j < match_0[i].length; j++) {
              productCandidate = this.mProduct.getConnAtom_0(productRoot, j);
              if (this.mProductMapNo[productCandidate] == 0) {
                if (bestMatch < match_0[i][j]) {
                  bestMatch = match_0[i][j];
                  bestReactantAtom = reactantCandidate;
                  bestProductAtom = productCandidate;
                }
              }
            }
          }
        }
        if (bestMatch == 0)
          break;
        highest++;
        graphAtom[highest] = bestReactantAtom;
        graphParent[bestReactantAtom] = graphAtom[current];
        productAtom[highest] = bestProductAtom;
        productParent[bestProductAtom] = productAtom[current];
        this.mMapNo++;
        this.mReactantMapNo[bestReactantAtom] = this.mMapNo;
        this.mProductMapNo[bestProductAtom] = this.mMapNo;
      }
      current++;
    }
    return highest + 1;
  };
  _.matchesStereo = function matchesStereo(reactantParent, reactantAtom, reactantConn, productParent, productAtom, productConn) {
    var i, i0, lastNeighbour, productInversion, reactantInversion;
    if (this.mReactant.getConnAtoms_0(reactantAtom) == 3 && (this.mReactant.getAtomParity_0(reactantAtom) == 1 || this.mReactant.getAtomParity_0(reactantAtom) == 2) && this.mProduct.getConnAtoms_0(productAtom) == 3 && (this.mProduct.getAtomParity_0(productAtom) == 1 || this.mProduct.getAtomParity_0(productAtom) == 2)) {
      reactantInversion = reactantParent > reactantConn;
      lastNeighbour = -1;
      for (i0 = 0; i0 < this.mReactant.getConnAtoms_0(reactantAtom); i0++) {
        lastNeighbour = this.mReactant.getConnAtom_0(reactantAtom, i0);
        if (lastNeighbour != reactantParent && lastNeighbour != reactantConn) {
          if (lastNeighbour > reactantConn && lastNeighbour < reactantParent || lastNeighbour < reactantConn && lastNeighbour > reactantParent)
            reactantInversion = !reactantInversion;
          break;
        }
      }
      productInversion = productParent > productConn;
      for (i = 0; i < this.mProduct.getConnAtoms_0(productAtom); i++) {
        lastNeighbour = this.mProduct.getConnAtom_0(productAtom, i);
        if (lastNeighbour != productParent && lastNeighbour != productConn) {
          if (lastNeighbour > productConn && lastNeighbour < productParent || lastNeighbour < productConn && lastNeighbour > productParent)
            productInversion = !productInversion;
          break;
        }
      }
      return reactantInversion == productInversion == (this.mReactant.getAtomParity_0(reactantAtom) == this.mProduct.getAtomParity_0(productAtom));
    }
    return true;
  };
  _.mergeReactantsAndProducts = function mergeReactantsAndProducts(rxn) {
    var i, i0, product, reactant;
    this.mReactant = new carc2.StereoMolecule();
    for (i0 = 0; i0 < rxn.getReactants_0(); i0++) {
      reactant = rxn.getReactant_0(i0);
      reactant.ensureHelperArrays_0(1);
      this.mReactant.addMolecule_3(reactant, reactant.getAtoms_0(), reactant.getBonds_0(), !reactant.isFragment_0());
    }
    this.mProduct = new carc2.StereoMolecule();
    for (i = 0; i < rxn.getProducts_0(); i++) {
      product = rxn.getProduct_0(i);
      product.ensureHelperArrays_0(1);
      this.mProduct.addMolecule_3(product, product.getAtoms_0(), product.getBonds_0(), !product.isFragment_0());
    }
    this.mReactant.normalizeAmbiguousBonds_0();
    this.mProduct.normalizeAmbiguousBonds_0();
  };
  _.passesBasicRules = function passesBasicRules(reactantAtom, reactantConn, productAtom, productConn) {
    var productConnIndex, reactantConnIndex;
    if (this.mReactant.getAtomicNo_0(reactantConn) == 6 && $wnd.Math.abs(this.mReactant.getConnAtoms_0(reactantConn) - this.mProduct.getConnAtoms_0(productConn)) > 1)
      return false;
    if (this.mReactant.getAtomicNo_0(reactantConn) == 8 && this.mReactant.getConnAtoms_0(reactantConn) == 2 && this.connAtomsOfAtomicNo(this.mReactant, reactantAtom, 8) > this.connAtomsOfAtomicNo(this.mProduct, productAtom, 8))
      return false;
    if (this.mProduct.getAtomicNo_0(productConn) == 8 && this.mProduct.getConnAtoms_0(productConn) == 2 && this.connAtomsOfAtomicNo(this.mReactant, reactantAtom, 8) < this.connAtomsOfAtomicNo(this.mProduct, productAtom, 8))
      return false;
    if (this.mReactant.getAtomicNo_0(reactantConn) == 8 && this.mReactant.getConnAtoms_0(reactantConn) == 2 && this.mProduct.getConnAtoms_0(productConn) == 2) {
      reactantConnIndex = this.mReactant.getConnAtom_0(reactantConn, 0) == reactantAtom ? 0 : 1;
      productConnIndex = this.mProduct.getConnAtom_0(productConn, 0) == productAtom ? 0 : 1;
      if (this.mSimilarityComparator.compare_4(this.mReactantSkelAtomEnv[reactantConn][reactantConnIndex][3], this.mProductSkelAtomEnv[productConn][productConnIndex][3]) != 0)
        return false;
    }
    if (this.mReactant.getAtomicNo_0(reactantConn) == 7 && this.connAtomsOfAtomicNo(this.mReactant, reactantAtom, 7) < this.connAtomsOfAtomicNo(this.mProduct, productAtom, 7))
      return false;
    if (this.mProduct.getAtomicNo_0(productConn) == 7 && this.connAtomsOfAtomicNo(this.mReactant, reactantAtom, 7) > this.connAtomsOfAtomicNo(this.mProduct, productAtom, 7))
      return false;
    if (this.mReactant.getBondRingSize_0(this.mReactant.getBond_0(reactantAtom, reactantConn)) == 3 ^ this.mProduct.getBondRingSize_0(this.mProduct.getBond_0(productAtom, productConn)) == 3)
      return false;
    return true;
  };
  _.passesSimilarityDependentRules = function passesSimilarityDependentRules(reactantAtom, reactantConn, productAtom, productConn, similarity, isStereoMatch) {
    if (this.mReactant.getAtomicNo_0(reactantConn) == 8 && this.mReactant.getAtomPi_0(reactantConn) == 0 && carcrm.hasOxo_0(this.mReactant, reactantAtom) && carcrm.hasOxo_0(this.mProduct, productAtom) && similarity != 2048)
      return false;
    if (this.mReactant.getAtomicNo_0(reactantConn) == 8 && this.mReactant.getConnAtoms_0(reactantConn) == 2 && carcrm.hasOxo_0(this.mReactant, this.getNextNeighbour(this.mReactant, reactantAtom, reactantConn)) && similarity < 3 << 8)
      return false;
    if (this.mReactant.getAtomicNo_0(reactantAtom) == 8 && (carcrm.hasOxo_0(this.mReactant, reactantConn) || carcrm.hasOxo_0(this.mProduct, productConn)) && similarity < 2 << 8)
      return false;
    if (!isStereoMatch && (this.mReactant.getAtomicNo_0(reactantConn) != 6 || !carcrm.hasNonCarbonNeighbour(this.mReactant, reactantAtom)))
      return false;
    if (this.mReactant.getAtomicNo_0(reactantConn) == 8 && this.mReactant.getAtomicNo_0(reactantAtom) != 6 && similarity != 2048)
      return false;
    if (this.mReactant.getAtomicNo_0(reactantAtom) == 5 && this.mReactant.getAtomicNo_0(reactantConn) == 6 && similarity < 3 << 8)
      return false;
    return true;
  };
  _.mAtomPairSequenceCount = 0;
  _.mGraphMapNoCount = 0;
  _.mMapNo = 0;
  _.mScore = 0;
  carcrm.DEBUG_0 = false;
  carcrm.DEBUG_PRINT_MOLFILES_BEFORE_CENTER_MAPPING = false;
  carcrm.DEBUG_PRINT_REACTION_BEFORE_CENTER_MAPPING = false;
  carcrm.DEBUG_RED_CENTER_MAPPING = true;
  carcrm.ENDO_RING_PLUS = 128;
  carcrm.MAX_ENVIRONMENT_RADIUS_0 = 8;
  carcrm.MAX_ENVIRONMENT_SIMILARITY = 0;
  carcrm.MAX_SKELETON_SIMILARITY = 0;
  carcrm.NO_PI_PENALTY = 1;
  carcrm.PI_AND_HETERO_PLUS = 1;
  carcrm.PRINT_SCORES = false;
  carcrm.SIMILARITY_SHIFT = 8;
  carcrm.SKELETON_PENALTY = 2;
  carcrm.STEREO_MATCH_PLUS = 64;
  cggl.Lcom_actelion_research_chem_reaction_mapping_SimilarityGraphBasedReactionMapper_2_classLit = createForClass("com.actelion.research.chem.reaction.mapping", "SimilarityGraphBasedReactionMapper", 496, cggl.Ljava_lang_Object_2_classLit);
  carg.$clinit_LookAndFeelHelper = function $clinit_LookAndFeelHelper() {
    carg.$clinit_LookAndFeelHelper = emptyMethod;
    jl.$clinit_Object();
  };
  carg.isDarkLookAndFeel = function isDarkLookAndFeel() {
    carg.$clinit_LookAndFeelHelper();
    var lafName;
    lafName = js.getLookAndFeel().getName_0();
    return jl.startsWith_Ljava_lang_String__Z__devirtual$(lafName, "Substance Graphite") || jl.startsWith_Ljava_lang_String__Z__devirtual$(lafName, "Radiance Graphite") || jl.startsWith_Ljava_lang_String__Z__devirtual$(lafName, "Radiance Night");
  };
  defineClass(750, 1, { 1: 1 });
  cggl.Lcom_actelion_research_gui_LookAndFeelHelper_2_classLit = createForClass("com.actelion.research.gui", "LookAndFeelHelper", 750, cggl.Ljava_lang_Object_2_classLit);
  cargc.$clinit_IClipboardHandler = function $clinit_IClipboardHandler() {
    cargc.$clinit_IClipboardHandler = emptyMethod;
  };
  cggl.Lcom_actelion_research_gui_clipboard_IClipboardHandler_2_classLit = createForInterface("com.actelion.research.gui.clipboard", "IClipboardHandler");
  cargg.$clinit_GenericEventListener = function $clinit_GenericEventListener() {
    cargg.$clinit_GenericEventListener = emptyMethod;
  };
  cggl.Lcom_actelion_research_gui_generic_GenericEventListener_2_classLit = createForInterface("com.actelion.research.gui.generic", "GenericEventListener");
  carge.$clinit_AtomQueryFeatureDialogBuilder = function $clinit_AtomQueryFeatureDialogBuilder() {
    carge.$clinit_AtomQueryFeatureDialogBuilder = emptyMethod;
    jl.$clinit_Object();
    carge.RING_SIZE_SHORT_TEXT = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["", "r0", "r", "r3", "r3-4", "r3-5", "r3-6", "r3-7", "r4", "r4-5", "r4-6", "r4-7", "r>3", "r5", "r5-6", "r5-7", "r>4", "r6", "r6-7", "r>5", "r7", "r>6", "r>7"]);
    carge.RING_SIZE_OPTIONS = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["any", "is not in a ring", "is in any ring", "3 members", "3-4 members", "3-5 members", "3-6 members", "3-7 members", "4 members", "4-5 members", "4-6 members", "4-7 members", "> 3 members", "5 members", "5-6 members", "5-7 members", "> 4 members", "6 members", "6-7 members", "> 5 members", "7 members", "> 6 members", "> 7 members"]);
    carge.RING_SIZE_VALUES = stampJavaTypeInfo(getClassLiteralForArray(cggl.J_classLit, 1), { 4: 1, 1: 1, 49: 1 }, 5, 14, [0, 4294967296, xor_0(545460846592, 4294967296), 8589934592, or_0(8589934592, 17179869184), or_0(or_0(8589934592, 17179869184), 34359738368), or_0(or_0(or_0(8589934592, 17179869184), 34359738368), 68719476736), xor_0(545460846592, or_0(4294967296, 274877906944)), 17179869184, or_0(17179869184, 34359738368), or_0(or_0(17179869184, 34359738368), 68719476736), or_0(or_0(or_0(17179869184, 34359738368), 68719476736), 137438953472), xor_0(545460846592, or_0(4294967296, 8589934592)), 34359738368, or_0(34359738368, 68719476736), or_0(or_0(34359738368, 68719476736), 137438953472), or_0(or_0(or_0(34359738368, 68719476736), 137438953472), 274877906944), 68719476736, or_0(68719476736, 137438953472), or_0(or_0(68719476736, 137438953472), 274877906944), 137438953472, or_0(137438953472, 274877906944), 274877906944]);
  };
  carge.AtomQueryFeatureDialogBuilder = function AtomQueryFeatureDialogBuilder(dialogHelper, mol, atom, includeReactionHints) {
    carge.$clinit_AtomQueryFeatureDialogBuilder();
    Object_0.call(this);
    this.$init_150();
    this.mDialog = dialogHelper.createDialog_0(mol.isSelectedAtom_0(atom) ? "Atom Query Features (Multiple)" : "Atom Query Features", this);
    this.build(mol, atom, includeReactionHints);
  };
  defineClass(336, 1, { 109: 1, 1: 1 }, carge.AtomQueryFeatureDialogBuilder);
  _.$init_150 = function $init_150() {
  };
  _.eventHappened_0 = function eventHappened_0(e) {
    this.eventHappened(castTo(e, 80));
  };
  _.build = function build(mol, atom, includeReactionHints) {
    var g, g$array, g$array0, g$index, g$index0, g$max, g$max0, gap, gap1, gap2, hLayout, i, index_0, option, option$array, option$index, option$max, vLayout;
    this.mMol = mol;
    this.mAtom = atom;
    gap = cargh.scale_3(8);
    gap1 = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [gap, narrow_int(gap / 2), narrow_int(gap * 3 / 2), narrow_int(gap / 2), narrow_int(gap / 2), narrow_int(gap / 2), narrow_int(gap / 2), narrow_int(gap / 2), narrow_int(gap / 2), narrow_int(gap / 2), narrow_int(gap / 2), narrow_int(gap / 2), narrow_int(gap * 3 / 2), narrow_int(gap / 4), narrow_int(gap / 2), narrow_int(gap / 2), narrow_int(gap / 4)]);
    gap2 = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [narrow_int(gap * 3 / 2), narrow_int(gap / 2)]);
    hLayout = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [gap, -2, gap, -2, gap]);
    vLayout = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 1 + 2 * gap1.length + (includeReactionHints ? 2 * gap2.length : 0), 15, 1);
    index_0 = 0;
    for (g$array0 = gap1, g$index0 = 0, g$max0 = g$array0.length; g$index0 < g$max0; ++g$index0) {
      g = g$array0[g$index0];
      vLayout[index_0++] = g;
      vLayout[index_0++] = -2;
    }
    if (includeReactionHints)
      for (g$array = gap2, g$index = 0, g$max = g$array.length; g$index < g$max; ++g$index) {
        g = g$array[g$index];
        vLayout[index_0++] = g;
        vLayout[index_0++] = -2;
      }
    vLayout[index_0++] = gap;
    this.mDialog.setLayout_0(hLayout, vLayout);
    this.mCBAny = this.mDialog.createCheckBox_0("Any atomic number");
    this.mCBAny.addEventConsumer(this);
    this.mDialog.add_9(this.mCBAny, 1, 1, 3, 1);
    this.mLabelAtomList = this.mDialog.createLabel_0("Excluded atoms:");
    this.mTFAtomList = this.mDialog.createTextField_0(16, 1);
    this.mDialog.add_8(this.mLabelAtomList, 1, 3);
    this.mDialog.add_8(this.mTFAtomList, 3, 3);
    this.mChoiceArom = this.mDialog.createComboBox_0();
    this.mChoiceArom.addItem_0("any");
    this.mChoiceArom.addItem_0("is aromatic");
    this.mChoiceArom.addItem_0("is hetero-aromatic");
    this.mChoiceArom.addItem_0("is not aromatic");
    this.mDialog.add_8(this.mDialog.createLabel_0("Aromaticity:"), 1, 5);
    this.mDialog.add_8(this.mChoiceArom, 3, 5);
    this.mChoiceRingState = this.mDialog.createComboBox_0();
    this.mChoiceRingState.addItem_0("any");
    this.mChoiceRingState.addItem_0("0 (not in a ring)");
    this.mChoiceRingState.addItem_0("0 or 2 (0 or 1 ring)");
    this.mChoiceRingState.addItem_0(">=2 (any ring count)");
    this.mChoiceRingState.addItem_0("2 (in 1 ring)");
    this.mChoiceRingState.addItem_0("3 (bridge head; 2 rings)");
    this.mChoiceRingState.addItem_0(">3 (in more than 2 rings)");
    this.mDialog.add_8(this.mDialog.createLabel_0("Ring bonds:"), 1, 7);
    this.mDialog.add_8(this.mChoiceRingState, 3, 7);
    this.mChoiceSmallRingSize = this.mDialog.createComboBox_0();
    this.mChoiceSmallRingSize.addItem_0("any");
    this.mChoiceSmallRingSize.addItem_0("3 members");
    this.mChoiceSmallRingSize.addItem_0("4 members");
    this.mChoiceSmallRingSize.addItem_0("5 members");
    this.mChoiceSmallRingSize.addItem_0("6 members");
    this.mChoiceSmallRingSize.addItem_0("7 members");
    this.mDialog.add_8(this.mDialog.createLabel_0("Smallest ring size:"), 1, 9);
    this.mDialog.add_8(this.mChoiceSmallRingSize, 3, 9);
    this.mChoiceRingSize = this.mDialog.createComboBox_0();
    for (option$array = carge.RING_SIZE_OPTIONS, option$index = 0, option$max = option$array.length; option$index < option$max; ++option$index) {
      option = option$array[option$index];
      this.mChoiceRingSize.addItem_0(option);
    }
    this.mDialog.add_8(this.mDialog.createLabel_0("Any ring size:"), 1, 11);
    this.mDialog.add_8(this.mChoiceRingSize, 3, 11);
    this.mChoiceCharge = this.mDialog.createComboBox_0();
    this.mChoiceCharge.addItem_0("any");
    this.mChoiceCharge.addItem_0("not charged");
    this.mChoiceCharge.addItem_0("has negative charge");
    this.mChoiceCharge.addItem_0("has positive charge");
    this.mDialog.add_8(this.mDialog.createLabel_0("Charge:"), 1, 13);
    this.mDialog.add_8(this.mChoiceCharge, 3, 13);
    this.mChoiceNeighbours = this.mDialog.createComboBox_0();
    this.mChoiceNeighbours.addItem_0("any");
    this.mChoiceNeighbours.addItem_0("exactly 1");
    this.mChoiceNeighbours.addItem_0("exactly 2");
    this.mChoiceNeighbours.addItem_0("exactly 3");
    this.mChoiceNeighbours.addItem_0("less than 3");
    this.mChoiceNeighbours.addItem_0("less than 4");
    this.mChoiceNeighbours.addItem_0("at least 1");
    this.mChoiceNeighbours.addItem_0("at least 2");
    this.mChoiceNeighbours.addItem_0("at least 3");
    this.mChoiceNeighbours.addItem_0("at least 4");
    this.mChoiceNeighbours.addItem_0("1 or 2");
    this.mChoiceNeighbours.addItem_0("1,2, or 3");
    this.mChoiceNeighbours.addItem_0("2 or 3");
    this.mDialog.add_8(this.mDialog.createLabel_0("Non-H neighbours:"), 1, 15);
    this.mDialog.add_8(this.mChoiceNeighbours, 3, 15);
    this.mChoiceENeighbours = this.mDialog.createComboBox_0();
    this.mChoiceENeighbours.addItem_0("any");
    this.mChoiceENeighbours.addItem_0("exactly 0");
    this.mChoiceENeighbours.addItem_0("exactly 1");
    this.mChoiceENeighbours.addItem_0("exactly 2");
    this.mChoiceENeighbours.addItem_0("exactly 3");
    this.mChoiceENeighbours.addItem_0("less than 2");
    this.mChoiceENeighbours.addItem_0("less than 3");
    this.mChoiceENeighbours.addItem_0("less than 4");
    this.mChoiceENeighbours.addItem_0("at least 1");
    this.mChoiceENeighbours.addItem_0("at least 2");
    this.mChoiceENeighbours.addItem_0("at least 3");
    this.mChoiceENeighbours.addItem_0("at least 4");
    this.mChoiceENeighbours.addItem_0("1 or 2");
    this.mChoiceENeighbours.addItem_0("1,2, or 3");
    this.mChoiceENeighbours.addItem_0("2 or 3");
    this.mDialog.add_8(this.mDialog.createLabel_0("Electroneg. neighbours:"), 1, 17);
    this.mDialog.add_8(this.mChoiceENeighbours, 3, 17);
    this.mChoiceHydrogen = this.mDialog.createComboBox_0();
    this.mChoiceHydrogen.addItem_0("any");
    this.mChoiceHydrogen.addItem_0("none");
    this.mChoiceHydrogen.addItem_0("exactly 1");
    this.mChoiceHydrogen.addItem_0("exactly 2");
    this.mChoiceHydrogen.addItem_0("at least 1");
    this.mChoiceHydrogen.addItem_0("at least 2");
    this.mChoiceHydrogen.addItem_0("at least 3");
    this.mChoiceHydrogen.addItem_0("less than 2");
    this.mChoiceHydrogen.addItem_0("less than 3");
    this.mChoiceHydrogen.addItem_0("1 or 2");
    this.mDialog.add_8(this.mDialog.createLabel_0("Hydrogen count:"), 1, 19);
    this.mDialog.add_8(this.mChoiceHydrogen, 3, 19);
    this.mChoicePi = this.mDialog.createComboBox_0();
    this.mChoicePi.addItem_0("any");
    this.mChoicePi.addItem_0("none");
    this.mChoicePi.addItem_0("exactly 1");
    this.mChoicePi.addItem_0("exactly 2");
    this.mChoicePi.addItem_0("at least 1");
    this.mDialog.add_8(this.mDialog.createLabel_0("Pi-electron count:"), 1, 21);
    this.mDialog.add_8(this.mChoicePi, 3, 21);
    this.mChoiceOxidationState = this.mDialog.createComboBox_0();
    this.mChoiceOxidationState.addItem_0("any");
    for (i = 1; i < 15; i++)
      this.mChoiceOxidationState.addItem_0(jl.toString_41(i - 7));
    this.mDialog.add_8(this.mDialog.createLabel_0("Oxidation state:"), 1, 23);
    this.mDialog.add_8(this.mChoiceOxidationState, 3, 23);
    this.mCBBlocked = this.mDialog.createCheckBox_0("prohibit further substitution");
    this.mCBBlocked.addEventConsumer(this);
    this.mDialog.add_9(this.mCBBlocked, 1, 25, 3, 25);
    this.mCBSubstituted = this.mDialog.createCheckBox_0("require further substitution");
    this.mCBSubstituted.addEventConsumer(this);
    this.mDialog.add_9(this.mCBSubstituted, 1, 27, 3, 27);
    this.mChoiceStereoCenter = this.mDialog.createComboBox_0();
    this.mChoiceStereoCenter.addItem_0("any");
    this.mChoiceStereoCenter.addItem_0("is a stereo center");
    this.mChoiceStereoCenter.addItem_0("is not a stereo center");
    this.mDialog.add_8(this.mDialog.createLabel_0("Stereo center:"), 1, 29);
    this.mDialog.add_8(this.mChoiceStereoCenter, 3, 29);
    this.mCBMatchStereo = this.mDialog.createCheckBox_0("match stereo center");
    this.mDialog.add_9(this.mCBMatchStereo, 1, 31, 3, 31);
    this.mCBExcludeGroup = this.mDialog.createCheckBox_0("is part of exclude group");
    this.mDialog.add_9(this.mCBExcludeGroup, 1, 33, 3, 33);
    if (includeReactionHints) {
      this.mDialog.add_9(this.mDialog.createLabel_0("Stereo center hint for product:"), 1, 35, 3, 35);
      this.mChoiceReactionParityHint = this.mDialog.createComboBox_0();
      this.mChoiceReactionParityHint.addItem_0("Copy from generic product");
      this.mChoiceReactionParityHint.addItem_0("Keep reactant configuration");
      this.mChoiceReactionParityHint.addItem_0("Invert reactant configuration");
      this.mChoiceReactionParityHint.addItem_0("Racemise configuration");
      this.mDialog.add_9(this.mChoiceReactionParityHint, 1, 37, 3, 37);
    }
    this.mMol.ensureHelperArrays_0(31);
    this.setInitialStates();
  };
  _.createAtomList = function createAtomList() {
    var atomicNo, delimiterIndex, found, i, i0, label_0, list, listString, newList;
    list = null;
    listString = jl.trim__Ljava_lang_String___devirtual$(this.mTFAtomList.getText_0());
    while (jl.length__I__devirtual$_0(listString) != 0) {
      delimiterIndex = jl.indexOf_I_I__devirtual$(listString, 44);
      if (delimiterIndex == -1) {
        label_0 = jl.trim__Ljava_lang_String___devirtual$(listString);
        listString = "";
      } else {
        label_0 = jl.trim__Ljava_lang_String___devirtual$(jl.substring_II_Ljava_lang_String___devirtual$(listString, 0, delimiterIndex));
        listString = jl.trim__Ljava_lang_String___devirtual$(jl.substring_I_Ljava_lang_String___devirtual$(listString, delimiterIndex + 1));
      }
      if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(label_0, "X")) {
        if (jl.length__I__devirtual$_0(listString) != 0)
          listString = ",";
        listString = jl.concat_Ljava_lang_String__Ljava_lang_String___devirtual$(listString, "F,Cl,Br,I");
        continue;
      }
      atomicNo = carc2.getAtomicNoFromLabel(label_0);
      if (atomicNo != 0) {
        if (atomicNo == 1) {
          this.mDialog.showMessage_0("'H' cannot be part of an atom list and is removed.");
        } else if (jsEquals(list, null)) {
          list = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 1, 15, 1);
          list[0] = atomicNo;
        } else {
          found = false;
          for (i0 = 0; i0 < list.length; i0++) {
            if (atomicNo == list[i0]) {
              found = true;
              break;
            }
          }
          if (!found) {
            newList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, list.length + 1, 15, 1);
            for (i = 0; i < list.length; i++)
              newList[i] = list[i];
            newList[list.length] = atomicNo;
            list = newList;
          }
        }
      }
    }
    if (jsNotEquals(list, null))
      ju.sort_3(list);
    return list;
  };
  _.eventHappened = function eventHappened(e) {
    if (e.getWhat() == 0) {
      this.setQueryFeatures();
      this.mOKSelected = true;
      this.mDialog.disposeDialog_0();
    } else if (e.getWhat() == 1) {
      this.mDialog.disposeDialog_0();
    } else if (maskUndefined(e.getSource()) === maskUndefined(this.mCBAny)) {
      if (e.getValue() == 1) {
        this.mTFAtomList.setText_0("");
        this.mLabelAtomList.setText_0("Excluded atoms:");
      } else {
        this.mTFAtomList.setText_0(this.mMol.getAtomLabel_0(this.mAtom));
        this.mLabelAtomList.setText_0("Allowed atoms:");
      }
    } else if (maskUndefined(e.getSource()) === maskUndefined(this.mCBBlocked)) {
      this.mCBSubstituted.setSelected_0(false);
      this.mChoiceNeighbours.setSelectedIndex_0(0);
      this.mChoiceENeighbours.setSelectedIndex_0(0);
    } else if (maskUndefined(e.getSource()) === maskUndefined(this.mCBSubstituted))
      this.mCBBlocked.setSelected_0(false);
  };
  _.setInitialStates = function setInitialStates() {
    var aromState, chargeFeatures, customOption, eNeighbourFeatures, hydrogenFeatures, i, index_0, neighbourFeatures, piFeatures, queryFeatures, rawOxidationStateIndex, ringSize, ringState, rxnStereo, smallRingSize, stereoFeatures;
    queryFeatures = this.mMol.getAtomQueryFeatures(this.mAtom);
    if (neq(and_0(queryFeatures, 1), 0)) {
      this.mCBAny.setSelected_0(true);
      this.mLabelAtomList.setText_0("Excluded atoms:");
    } else
      this.mLabelAtomList.setText_0("Allowed atoms:");
    this.mTFAtomList.setText_0(jsEquals(this.mMol.getAtomList_0(this.mAtom), null) ? "" : this.mMol.getAtomListString_0(this.mAtom));
    aromState = and_0(queryFeatures, { l: 6, m: 0, h: 4 });
    if (neq(and_0(aromState, { l: 0, m: 0, h: 4 }), 0))
      this.mChoiceArom.setSelectedIndex_0(2);
    else if (eq(aromState, 2))
      this.mChoiceArom.setSelectedIndex_0(1);
    else if (eq(aromState, 4))
      this.mChoiceArom.setSelectedIndex_0(3);
    else
      this.mChoiceArom.setSelectedIndex_0(0);
    ringState = and_0(queryFeatures, 120);
    if (eq(ringState, or_0(or_0(16, 32), 64)))
      this.mChoiceRingState.setSelectedIndex_0(1);
    else if (eq(ringState, or_0(32, 64)))
      this.mChoiceRingState.setSelectedIndex_0(2);
    else if (eq(ringState, 8))
      this.mChoiceRingState.setSelectedIndex_0(3);
    else if (eq(ringState, or_0(or_0(8, 32), 64)))
      this.mChoiceRingState.setSelectedIndex_0(4);
    else if (eq(ringState, or_0(or_0(8, 16), 64)))
      this.mChoiceRingState.setSelectedIndex_0(5);
    else if (eq(ringState, or_0(or_0(8, 16), 32)))
      this.mChoiceRingState.setSelectedIndex_0(6);
    else
      this.mChoiceRingState.setSelectedIndex_0(0);
    smallRingSize = toInt_0(shr_0(and_0(queryFeatures, 29360128), 22));
    this.mChoiceSmallRingSize.setSelectedIndex_0(smallRingSize == 0 ? 0 : smallRingSize - 2);
    ringSize = and_0(queryFeatures, 545460846592);
    index_0 = -1;
    for (i = 0; i < carge.RING_SIZE_VALUES.length; i++) {
      if (eq(ringSize, carge.RING_SIZE_VALUES[i])) {
        index_0 = i;
        break;
      }
    }
    if (index_0 != -1) {
      this.mChoiceRingSize.setSelectedIndex_0(index_0);
    } else {
      customOption = new jl.StringBuilder_1("Custom:");
      if (neq(and_0(ringSize, 4294967296), 0))
        customOption.append_9(" 0");
      if (neq(and_0(ringSize, 8589934592), 0))
        customOption.append_9(" 3");
      if (neq(and_0(ringSize, 17179869184), 0))
        customOption.append_9(" 4");
      if (neq(and_0(ringSize, 34359738368), 0))
        customOption.append_9(" 5");
      if (neq(and_0(ringSize, 68719476736), 0))
        customOption.append_9(" 6");
      if (neq(and_0(ringSize, 137438953472), 0))
        customOption.append_9(" 7");
      if (neq(and_0(ringSize, 274877906944), 0))
        customOption.append_9(" >=8");
      this.mRingSizeCustomValue = ringSize;
      this.mChoiceRingSize.addItem_0(customOption.toString_0());
      this.mChoiceRingSize.setSelectedIndex_0(carge.RING_SIZE_VALUES.length);
    }
    neighbourFeatures = and_0(queryFeatures, 4063232);
    if (eq(neighbourFeatures, and_0(4063232, not_0(262144))))
      this.mChoiceNeighbours.setSelectedIndex_0(1);
    else if (eq(neighbourFeatures, and_0(4063232, not_0(524288))))
      this.mChoiceNeighbours.setSelectedIndex_0(2);
    else if (eq(neighbourFeatures, and_0(4063232, not_0(1048576))))
      this.mChoiceNeighbours.setSelectedIndex_0(3);
    else if (eq(neighbourFeatures, or_0(1048576, 2097152)))
      this.mChoiceNeighbours.setSelectedIndex_0(4);
    else if (eq(neighbourFeatures, 2097152))
      this.mChoiceNeighbours.setSelectedIndex_0(5);
    else if (eq(neighbourFeatures, 131072))
      this.mChoiceNeighbours.setSelectedIndex_0(6);
    else if (eq(neighbourFeatures, or_0(131072, 262144)))
      this.mChoiceNeighbours.setSelectedIndex_0(7);
    else if (eq(neighbourFeatures, or_0(or_0(131072, 262144), 524288)))
      this.mChoiceNeighbours.setSelectedIndex_0(8);
    else if (eq(neighbourFeatures, and_0(4063232, not_0(2097152))))
      this.mChoiceNeighbours.setSelectedIndex_0(9);
    else if (eq(neighbourFeatures, or_0(or_0(131072, 1048576), 2097152)))
      this.mChoiceNeighbours.setSelectedIndex_0(10);
    else if (eq(neighbourFeatures, or_0(131072, 2097152)))
      this.mChoiceNeighbours.setSelectedIndex_0(11);
    else if (eq(neighbourFeatures, or_0(or_0(131072, 262144), 2097152)))
      this.mChoiceNeighbours.setSelectedIndex_0(12);
    else
      this.mChoiceNeighbours.setSelectedIndex_0(0);
    eNeighbourFeatures = and_0(queryFeatures, 17042430230528);
    if (eq(eNeighbourFeatures, and_0(17042430230528, not_0(549755813888))))
      this.mChoiceENeighbours.setSelectedIndex_0(1);
    else if (eq(eNeighbourFeatures, and_0(17042430230528, not_0(1099511627776))))
      this.mChoiceENeighbours.setSelectedIndex_0(2);
    else if (eq(eNeighbourFeatures, and_0(17042430230528, not_0(2199023255552))))
      this.mChoiceENeighbours.setSelectedIndex_0(3);
    else if (eq(eNeighbourFeatures, and_0(17042430230528, not_0(4398046511104))))
      this.mChoiceENeighbours.setSelectedIndex_0(4);
    else if (eq(eNeighbourFeatures, or_0(or_0(2199023255552, 4398046511104), 8796093022208)))
      this.mChoiceENeighbours.setSelectedIndex_0(5);
    else if (eq(eNeighbourFeatures, or_0(4398046511104, 8796093022208)))
      this.mChoiceENeighbours.setSelectedIndex_0(6);
    else if (eq(eNeighbourFeatures, 8796093022208))
      this.mChoiceENeighbours.setSelectedIndex_0(7);
    else if (eq(eNeighbourFeatures, 549755813888))
      this.mChoiceENeighbours.setSelectedIndex_0(8);
    else if (eq(eNeighbourFeatures, or_0(549755813888, 1099511627776)))
      this.mChoiceENeighbours.setSelectedIndex_0(9);
    else if (eq(eNeighbourFeatures, or_0(or_0(549755813888, 1099511627776), 2199023255552)))
      this.mChoiceENeighbours.setSelectedIndex_0(10);
    else if (eq(eNeighbourFeatures, and_0(17042430230528, not_0(8796093022208))))
      this.mChoiceENeighbours.setSelectedIndex_0(11);
    else if (eq(eNeighbourFeatures, or_0(or_0(549755813888, 4398046511104), 8796093022208)))
      this.mChoiceENeighbours.setSelectedIndex_0(12);
    else if (eq(eNeighbourFeatures, or_0(549755813888, 8796093022208)))
      this.mChoiceENeighbours.setSelectedIndex_0(13);
    else if (eq(eNeighbourFeatures, or_0(or_0(549755813888, 1099511627776), 8796093022208)))
      this.mChoiceENeighbours.setSelectedIndex_0(14);
    else
      this.mChoiceENeighbours.setSelectedIndex_0(0);
    chargeFeatures = and_0(queryFeatures, 234881024);
    if (eq(chargeFeatures, or_0(33554432, 134217728)))
      this.mChoiceCharge.setSelectedIndex_0(1);
    else if (eq(chargeFeatures, or_0(67108864, 134217728)))
      this.mChoiceCharge.setSelectedIndex_0(2);
    else if (eq(chargeFeatures, or_0(67108864, 33554432)))
      this.mChoiceCharge.setSelectedIndex_0(3);
    else
      this.mChoiceCharge.setSelectedIndex_0(0);
    hydrogenFeatures = and_0(queryFeatures, 1920);
    if (eq(hydrogenFeatures, or_0(or_0(256, 512), 1024)))
      this.mChoiceHydrogen.setSelectedIndex_0(1);
    else if (eq(hydrogenFeatures, or_0(or_0(128, 512), 1024)))
      this.mChoiceHydrogen.setSelectedIndex_0(2);
    else if (eq(hydrogenFeatures, or_0(or_0(128, 256), 1024)))
      this.mChoiceHydrogen.setSelectedIndex_0(3);
    else if (eq(hydrogenFeatures, 128))
      this.mChoiceHydrogen.setSelectedIndex_0(4);
    else if (eq(hydrogenFeatures, or_0(128, 256)))
      this.mChoiceHydrogen.setSelectedIndex_0(5);
    else if (eq(hydrogenFeatures, or_0(or_0(128, 256), 512)))
      this.mChoiceHydrogen.setSelectedIndex_0(6);
    else if (eq(hydrogenFeatures, or_0(512, 1024)))
      this.mChoiceHydrogen.setSelectedIndex_0(7);
    else if (eq(hydrogenFeatures, 1024))
      this.mChoiceHydrogen.setSelectedIndex_0(8);
    else if (eq(hydrogenFeatures, or_0(128, 1024)))
      this.mChoiceHydrogen.setSelectedIndex_0(9);
    else
      this.mChoiceHydrogen.setSelectedIndex_0(0);
    piFeatures = and_0(queryFeatures, 114688);
    if (eq(piFeatures, or_0(32768, 65536)))
      this.mChoicePi.setSelectedIndex_0(1);
    else if (eq(piFeatures, or_0(16384, 65536)))
      this.mChoicePi.setSelectedIndex_0(2);
    else if (eq(piFeatures, or_0(16384, 32768)))
      this.mChoicePi.setSelectedIndex_0(3);
    else if (eq(piFeatures, 16384))
      this.mChoicePi.setSelectedIndex_0(4);
    else
      this.mChoicePi.setSelectedIndex_0(0);
    rawOxidationStateIndex = shr_0(and_0(queryFeatures, { l: 0, m: 0, h: 120 }), 47);
    this.mChoiceOxidationState.setSelectedIndex_0(toInt_0(rawOxidationStateIndex));
    if (neq(and_0(queryFeatures, 2048), 0))
      this.mCBBlocked.setSelected_0(true);
    if (neq(and_0(queryFeatures, 4096), 0))
      this.mCBSubstituted.setSelected_0(true);
    stereoFeatures = and_0(queryFeatures, { l: 0, m: 0, h: 3 });
    if (eq(stereoFeatures, { l: 0, m: 0, h: 1 }))
      this.mChoiceStereoCenter.setSelectedIndex_0(1);
    else if (eq(stereoFeatures, { l: 0, m: 0, h: 2 }))
      this.mChoiceStereoCenter.setSelectedIndex_0(2);
    else
      this.mChoiceStereoCenter.setSelectedIndex_0(0);
    if (neq(and_0(queryFeatures, 8192), 0))
      this.mCBMatchStereo.setSelected_0(true);
    if (neq(and_0(queryFeatures, 536870912), 0))
      this.mCBExcludeGroup.setSelected_0(true);
    if (isNotNull(this.mChoiceReactionParityHint)) {
      rxnStereo = and_0(queryFeatures, 3221225472);
      if (eq(rxnStereo, 1073741824))
        this.mChoiceReactionParityHint.setSelectedIndex_0(1);
      else if (eq(rxnStereo, 2147483648))
        this.mChoiceReactionParityHint.setSelectedIndex_0(2);
      else if (eq(rxnStereo, 3221225472))
        this.mChoiceReactionParityHint.setSelectedIndex_0(3);
      else
        this.mChoiceReactionParityHint.setSelectedIndex_0(0);
    }
  };
  _.setQueryFeatures = function setQueryFeatures() {
    var atom, atomList;
    atomList = this.createAtomList();
    if (this.mMol.isSelectedAtom_0(this.mAtom)) {
      for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++)
        if (this.mMol.isSelectedAtom_0(atom))
          this.setQueryFeatures_0(atom, atomList);
    } else {
      this.setQueryFeatures_0(this.mAtom, atomList);
    }
    this.mMol.validateAtomQueryFeatures();
  };
  _.setQueryFeatures_0 = function setQueryFeatures_0(atom, atomList) {
    var eNeighbours, i, queryFeatures, realNeighbours, ringBonds, ringSizeIndex;
    queryFeatures = 0;
    if (this.mCBAny.isSelected_0()) {
      queryFeatures = or_0(queryFeatures, 1);
      this.mMol.setAtomList_1(atom, atomList, true);
    } else
      this.mMol.setAtomList_1(atom, atomList, false);
    if (this.mChoiceArom.getSelectedIndex_0() == 2) {
      if (!this.mMol.isHeteroAromaticAtom(atom))
        queryFeatures = or_0(queryFeatures, or_0(2, { l: 0, m: 0, h: 4 }));
    } else if (!this.mMol.isAromaticAtom_0(atom)) {
      if (this.mChoiceArom.getSelectedIndex_0() == 1)
        queryFeatures = or_0(queryFeatures, 2);
      else if (this.mChoiceArom.getSelectedIndex_0() == 3)
        queryFeatures = or_0(queryFeatures, 4);
    }
    ringBonds = 0;
    for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++)
      if (neq(and_0(this.mMol.getAtomQueryFeatures(this.mMol.getConnAtom_0(atom, i)), 536870912), 0) && this.mMol.isRingBond_0(this.mMol.getConnBond_0(atom, i)))
        ringBonds++;
    switch (this.mChoiceRingState.getSelectedIndex_0()) {
      case 1:
        if (ringBonds == 0)
          queryFeatures = or_0(queryFeatures, or_0(or_0(16, 32), 64));
        break;
      case 2:
        if (ringBonds <= 2)
          queryFeatures = or_0(queryFeatures, or_0(32, 64));
        break;
      case 3:
        queryFeatures = or_0(queryFeatures, 8);
        break;
      case 4:
        if (ringBonds < 3)
          queryFeatures = or_0(queryFeatures, or_0(or_0(8, 32), 64));
        break;
      case 5:
        if (ringBonds < 4)
          queryFeatures = or_0(queryFeatures, or_0(or_0(8, 16), 64));
        break;
      case 6:
        queryFeatures = or_0(queryFeatures, or_0(or_0(8, 16), 32));
        break;
    }
    if (this.mChoiceSmallRingSize.getSelectedIndex_0() != 0)
      queryFeatures = or_0(queryFeatures, shl_0(fromInt_0(this.mChoiceSmallRingSize.getSelectedIndex_0() + 2), 22));
    ringSizeIndex = this.mChoiceRingSize.getSelectedIndex_0();
    if (ringSizeIndex == carge.RING_SIZE_VALUES.length)
      queryFeatures = or_0(queryFeatures, this.mRingSizeCustomValue);
    else if (ringSizeIndex != 0)
      queryFeatures = or_0(queryFeatures, carge.RING_SIZE_VALUES[ringSizeIndex]);
    switch (this.mChoiceCharge.getSelectedIndex_0()) {
      case 1:
        queryFeatures = or_0(queryFeatures, and_0(234881024, not_0(67108864)));
        break;
      case 2:
        queryFeatures = or_0(queryFeatures, and_0(234881024, not_0(33554432)));
        break;
      case 3:
        queryFeatures = or_0(queryFeatures, and_0(234881024, not_0(134217728)));
        break;
    }
    realNeighbours = this.mMol.getNotExcludedConnAtoms(atom);
    switch (this.mChoiceNeighbours.getSelectedIndex_0()) {
      case 1:
        if (realNeighbours == 1)
          queryFeatures = or_0(queryFeatures, 2048);
        else if (realNeighbours < 1)
          queryFeatures = or_0(queryFeatures, and_0(4063232, not_0(262144)));
        break;
      case 2:
        if (realNeighbours == 2)
          queryFeatures = or_0(queryFeatures, 2048);
        else if (realNeighbours < 2)
          queryFeatures = or_0(queryFeatures, and_0(4063232, not_0(524288)));
        break;
      case 3:
        if (realNeighbours == 3)
          queryFeatures = or_0(queryFeatures, 2048);
        else if (realNeighbours < 3)
          queryFeatures = or_0(queryFeatures, and_0(4063232, not_0(1048576)));
        break;
      case 4:
        if (realNeighbours == 2)
          queryFeatures = or_0(queryFeatures, 2048);
        else if (realNeighbours < 2)
          queryFeatures = or_0(queryFeatures, or_0(1048576, 2097152));
        break;
      case 5:
        if (realNeighbours == 3)
          queryFeatures = or_0(queryFeatures, 2048);
        else if (realNeighbours < 3)
          queryFeatures = or_0(queryFeatures, 2097152);
        break;
      case 6:
        if (realNeighbours == 0)
          queryFeatures = or_0(queryFeatures, 4096);
        break;
      case 7:
        if (realNeighbours == 1)
          queryFeatures = or_0(queryFeatures, 4096);
        else if (realNeighbours < 1)
          queryFeatures = or_0(queryFeatures, or_0(131072, 262144));
        break;
      case 8:
        if (realNeighbours == 2)
          queryFeatures = or_0(queryFeatures, 4096);
        else if (realNeighbours < 2)
          queryFeatures = or_0(queryFeatures, or_0(or_0(131072, 262144), 524288));
        break;
      case 9:
        if (realNeighbours == 3)
          queryFeatures = or_0(queryFeatures, 4096);
        else if (realNeighbours < 3)
          queryFeatures = or_0(queryFeatures, and_0(4063232, not_0(2097152)));
        break;
      case 10:
        if (realNeighbours == 0)
          queryFeatures = or_0(queryFeatures, or_0(or_0(131072, 1048576), 2097152));
        else
          queryFeatures = or_0(queryFeatures, or_0(1048576, 2097152));
        break;
      case 11:
        if (realNeighbours == 0)
          queryFeatures = or_0(queryFeatures, or_0(131072, 2097152));
        else
          queryFeatures = or_0(queryFeatures, 2097152);
        break;
      case 12:
        if (realNeighbours <= 1)
          queryFeatures = or_0(queryFeatures, or_0(or_0(131072, 1099511627776), 2097152));
        else if (realNeighbours <= 3)
          queryFeatures = or_0(queryFeatures, 2097152);
        break;
    }
    eNeighbours = this.mMol.getAtomElectronegativeNeighbours(atom);
    switch (this.mChoiceENeighbours.getSelectedIndex_0()) {
      case 1:
        if (eNeighbours == 0)
          queryFeatures = or_0(queryFeatures, and_0(17042430230528, not_0(549755813888)));
        break;
      case 2:
        if (eNeighbours <= 1)
          queryFeatures = or_0(queryFeatures, and_0(17042430230528, not_0(1099511627776)));
        break;
      case 3:
        if (eNeighbours <= 2)
          queryFeatures = or_0(queryFeatures, and_0(17042430230528, not_0(2199023255552)));
        break;
      case 4:
        if (eNeighbours <= 3)
          queryFeatures = or_0(queryFeatures, and_0(17042430230528, not_0(4398046511104)));
        break;
      case 5:
        if (eNeighbours < 2)
          queryFeatures = or_0(queryFeatures, or_0(or_0(2199023255552, 4398046511104), 8796093022208));
        break;
      case 6:
        if (eNeighbours < 3)
          queryFeatures = or_0(queryFeatures, or_0(4398046511104, 8796093022208));
        break;
      case 7:
        if (eNeighbours < 4)
          queryFeatures = or_0(queryFeatures, 8796093022208);
        break;
      case 8:
        if (eNeighbours == 0)
          queryFeatures = or_0(queryFeatures, 549755813888);
        break;
      case 9:
        if (eNeighbours < 2)
          queryFeatures = or_0(queryFeatures, or_0(549755813888, 1099511627776));
        break;
      case 10:
        if (eNeighbours < 3)
          queryFeatures = or_0(queryFeatures, or_0(or_0(549755813888, 1099511627776), 2199023255552));
        break;
      case 11:
        if (eNeighbours < 4)
          queryFeatures = or_0(queryFeatures, and_0(17042430230528, not_0(8796093022208)));
        break;
      case 12:
        if (eNeighbours < 2)
          queryFeatures = or_0(queryFeatures, or_0(or_0(549755813888, 4398046511104), 8796093022208));
        break;
      case 13:
        if (eNeighbours < 3)
          queryFeatures = or_0(queryFeatures, or_0(549755813888, 8796093022208));
        break;
      case 14:
        if (eNeighbours < 3)
          queryFeatures = or_0(queryFeatures, or_0(or_0(549755813888, 1099511627776), 8796093022208));
        break;
    }
    switch (this.mChoiceHydrogen.getSelectedIndex_0()) {
      case 1:
        queryFeatures = or_0(queryFeatures, or_0(or_0(256, 512), 1024));
        break;
      case 2:
        queryFeatures = or_0(queryFeatures, or_0(or_0(128, 512), 1024));
        break;
      case 3:
        queryFeatures = or_0(queryFeatures, or_0(or_0(128, 256), 1024));
        break;
      case 4:
        queryFeatures = or_0(queryFeatures, 128);
        break;
      case 5:
        queryFeatures = or_0(queryFeatures, or_0(128, 256));
        break;
      case 6:
        queryFeatures = or_0(queryFeatures, or_0(or_0(128, 256), 512));
        break;
      case 7:
        queryFeatures = or_0(queryFeatures, or_0(512, 1024));
        break;
      case 8:
        queryFeatures = or_0(queryFeatures, 1024);
        break;
      case 9:
        queryFeatures = or_0(queryFeatures, or_0(128, 1024));
        break;
    }
    switch (this.mChoicePi.getSelectedIndex_0()) {
      case 1:
        queryFeatures = or_0(queryFeatures, or_0(32768, 65536));
        break;
      case 2:
        queryFeatures = or_0(queryFeatures, or_0(16384, 65536));
        break;
      case 3:
        queryFeatures = or_0(queryFeatures, or_0(16384, 32768));
        break;
      case 4:
        queryFeatures = or_0(queryFeatures, 16384);
        break;
    }
    if (this.mChoiceOxidationState.getSelectedIndex_0() != 0)
      queryFeatures = or_0(queryFeatures, shl_0(fromInt_0(this.mChoiceOxidationState.getSelectedIndex_0()), 47));
    if (this.mCBBlocked.isSelected_0() && (this.mMol.getFreeValence_0(atom) > 0 || this.mMol.getAtomCharge_0(atom) == 0 && (this.mMol.getAtomicNo_0(atom) == 5 || this.mMol.isNitrogenFamily_0(atom) || this.mMol.isChalcogene_0(atom))))
      queryFeatures = or_0(queryFeatures, 2048);
    if (this.mCBSubstituted.isSelected_0() && (this.mMol.getFreeValence_0(atom) > 0 || this.mMol.getAtomCharge_0(atom) == 0 && (this.mMol.getAtomicNo_0(atom) == 5 || this.mMol.isNitrogenFamily_0(atom) || this.mMol.isChalcogene_0(atom))))
      queryFeatures = or_0(queryFeatures, 4096);
    switch (this.mChoiceStereoCenter.getSelectedIndex_0()) {
      case 1:
        queryFeatures = or_0(queryFeatures, { l: 0, m: 0, h: 1 });
        break;
      case 2:
        queryFeatures = or_0(queryFeatures, { l: 0, m: 0, h: 2 });
        break;
    }
    if (this.mCBMatchStereo.isSelected_0())
      queryFeatures = or_0(queryFeatures, 8192);
    if (this.mCBExcludeGroup.isSelected_0())
      queryFeatures = or_0(queryFeatures, 536870912);
    if (isNotNull(this.mChoiceReactionParityHint)) {
      switch (this.mChoiceReactionParityHint.getSelectedIndex_0()) {
        case 1:
          queryFeatures = or_0(queryFeatures, 1073741824);
          break;
        case 2:
          queryFeatures = or_0(queryFeatures, 2147483648);
          break;
        case 3:
          queryFeatures = or_0(queryFeatures, 3221225472);
          break;
      }
    }
    this.mMol.setAtomQueryFeature_0(atom, -1, false);
    this.mMol.setAtomQueryFeature_0(atom, queryFeatures, true);
  };
  _.showDialog_0 = function showDialog() {
    this.mOKSelected = false;
    this.mDialog.showDialog_1();
    return this.mOKSelected;
  };
  _.mAtom = 0;
  _.mOKSelected = false;
  _.mRingSizeCustomValue = 0;
  cggl.Lcom_actelion_research_gui_editor_AtomQueryFeatureDialogBuilder_2_classLit = createForClass("com.actelion.research.gui.editor", "AtomQueryFeatureDialogBuilder", 336, cggl.Ljava_lang_Object_2_classLit);
  carge.$clinit_BondQueryFeatureDialogBuilder = function $clinit_BondQueryFeatureDialogBuilder() {
    carge.$clinit_BondQueryFeatureDialogBuilder = emptyMethod;
    jl.$clinit_Object();
  };
  carge.BondQueryFeatureDialogBuilder = function BondQueryFeatureDialogBuilder(dialogHelper, mol, bond) {
    carge.$clinit_BondQueryFeatureDialogBuilder();
    Object_0.call(this);
    this.$init_151();
    this.mDialog = dialogHelper.createDialog_0(mol.isSelectedAtom_0(mol.getBondAtom_0(0, bond)) && mol.isSelectedAtom_0(mol.getBondAtom_0(1, bond)) ? "Bond Query Features (Multiple)" : "Bond Query Features", this);
    this.build_0(mol, bond);
  };
  defineClass(337, 1, { 109: 1, 1: 1 }, carge.BondQueryFeatureDialogBuilder);
  _.$init_151 = function $init_151() {
  };
  _.eventHappened_0 = function eventHappened_2(e) {
    this.eventHappened(castTo(e, 80));
  };
  _.build_0 = function build_0(mol, bond) {
    var gap, hLayout, i, itemCount, vLayout;
    this.mMol = mol;
    this.mBond = bond;
    gap = cargh.scale_3(8);
    hLayout = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [gap, -1, -2, -2, gap]);
    vLayout = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [gap, -2, gap, -2, -2, -2, -2, -2, -2, -2, gap, -2, gap, -2, gap, -2, gap, -2, 2 * gap, -2, narrow_int(gap / 2), -2, narrow_int(gap / 2), -2, 2 * gap]);
    this.mDialog.setLayout_0(hLayout, vLayout);
    this.mDialog.add_9(this.mDialog.createLabel_0("Desired Bond type(s):"), 1, 1, 3, 1);
    this.mCBSingle = this.mDialog.createCheckBox_0("Single");
    this.mDialog.add_9(this.mCBSingle, 1, 3, 3, 3);
    this.mCBDouble = this.mDialog.createCheckBox_0("Double");
    this.mDialog.add_9(this.mCBDouble, 1, 4, 3, 4);
    this.mCBTriple = this.mDialog.createCheckBox_0("Triple");
    this.mDialog.add_9(this.mCBTriple, 1, 5, 3, 5);
    this.mCBQuadruple = this.mDialog.createCheckBox_0("Quadruple");
    this.mDialog.add_9(this.mCBQuadruple, 1, 6, 3, 6);
    this.mCBQuintuple = this.mDialog.createCheckBox_0("Quintuple");
    this.mDialog.add_9(this.mCBQuintuple, 1, 7, 3, 7);
    this.mCBDelocalized = this.mDialog.createCheckBox_0("Delocalized");
    this.mDialog.add_9(this.mCBDelocalized, 1, 8, 3, 8);
    this.mCBMetalLigand = this.mDialog.createCheckBox_0("Coordinate (0-order)");
    this.mDialog.add_9(this.mCBMetalLigand, 1, 9, 3, 9);
    this.mComboBoxRing = this.mDialog.createComboBox_0();
    this.mComboBoxRing.addItem_0("any ring state");
    this.mComboBoxRing.addItem_0("is not in a ring");
    this.mComboBoxRing.addItem_0("is any ring bond");
    this.mComboBoxRing.addItem_0("is non-aromatic ring bond");
    this.mComboBoxRing.addItem_0("is aromatic bond");
    this.mComboBoxRing.addItem_0("is any non-aromatic bond");
    this.mComboBoxRing.addEventConsumer(this);
    this.mDialog.add_9(this.mComboBoxRing, 1, 11, 3, 11);
    this.mComboBoxRingSize = this.mDialog.createComboBox_0();
    this.mComboBoxRingSize.addItem_0("any ring size");
    this.mComboBoxRingSize.addItem_0("is in 3-membered ring");
    this.mComboBoxRingSize.addItem_0("is in 4-membered ring");
    this.mComboBoxRingSize.addItem_0("is in 5-membered ring");
    this.mComboBoxRingSize.addItem_0("is in 6-membered ring");
    this.mComboBoxRingSize.addItem_0("is in 7-membered ring");
    this.mComboBoxRingSize.addItem_0("smallest ring 8 to 11");
    this.mComboBoxRingSize.addItem_0("smallest ring >= 12");
    this.mDialog.add_9(this.mComboBoxRingSize, 1, 13, 3, 13);
    this.mCBMatchFormalOrder = this.mDialog.createCheckBox_0("Match formal bond order");
    this.mCBMatchFormalOrder.setSelected_0((mol.getBondQueryFeatures_0(bond) & 8388608) != 0);
    this.mCBMatchFormalOrder.addEventConsumer(this);
    this.mDialog.add_9(this.mCBMatchFormalOrder, 1, 15, 3, 15);
    this.mCBMatchStereo = this.mDialog.createCheckBox_0("Match Stereo Configuration");
    this.mCBMatchStereo.setSelected_0((mol.getBondQueryFeatures_0(bond) & 1048576) != 0);
    this.mCBMatchStereo.addEventConsumer(this);
    this.mDialog.add_9(this.mCBMatchStereo, 1, 17, 3, 17);
    this.mCBIsBridge = this.mDialog.createCheckBox_0("Is atom bridge between");
    this.mCBIsBridge.addEventConsumer(this);
    this.mDialog.add_9(this.mCBIsBridge, 1, 19, 3, 19);
    this.mComboBoxMinAtoms = this.mDialog.createComboBox_0();
    itemCount = 1 << 4;
    for (i = 0; i < itemCount; i++)
      this.mComboBoxMinAtoms.addItem_0("" + i);
    this.mDialog.add_8(this.mComboBoxMinAtoms, 2, 21);
    this.mDialog.add_8(this.mDialog.createLabel_0(" and"), 3, 21);
    this.mComboBoxMinAtoms.addEventConsumer(this);
    this.mComboBoxMaxAtoms = this.mDialog.createComboBox_0();
    this.populateComboBoxMaxAtoms(0);
    this.mDialog.add_8(this.mComboBoxMaxAtoms, 2, 23);
    this.mDialog.add_8(this.mDialog.createLabel_0(" atoms"), 3, 23);
    this.mMol.ensureHelperArrays_0(7);
    this.setInitialStates_0();
  };
  _.enableItems = function enableItems() {
    var bridgeIsSelected;
    bridgeIsSelected = this.mCBIsBridge.isSelected_0();
    this.mCBSingle.setEnabled_0(!bridgeIsSelected);
    this.mCBDouble.setEnabled_0(!bridgeIsSelected);
    this.mCBTriple.setEnabled_0(!bridgeIsSelected);
    this.mCBQuadruple.setEnabled_0(!bridgeIsSelected);
    this.mCBQuintuple.setEnabled_0(!bridgeIsSelected);
    this.mCBDelocalized.setEnabled_0(!bridgeIsSelected);
    this.mCBMetalLigand.setEnabled_0(!bridgeIsSelected);
    this.mCBMatchStereo.setEnabled_0(!bridgeIsSelected && this.mMol.getBondOrder_0(this.mBond) == 2 && this.mMol.getBondParity_0(this.mBond) != 0 && this.mMol.getBondParity_0(this.mBond) != 3);
    this.mComboBoxRing.setEnabled_0(!bridgeIsSelected);
    this.mComboBoxRingSize.setEnabled_0(!bridgeIsSelected && this.mComboBoxRing.getSelectedIndex_0() != 1);
    this.mComboBoxMinAtoms.setEnabled_0(bridgeIsSelected);
    this.mComboBoxMaxAtoms.setEnabled_0(bridgeIsSelected);
  };
  _.eventHappened = function eventHappened_1(e) {
    var itemCount, maxAtoms, minAtoms;
    if (e.getWhat() == 1) {
      this.mDialog.disposeDialog_0();
    } else if (e.getWhat() == 0) {
      this.setQueryFeatures_1();
      this.mOKSelected = true;
      this.mDialog.disposeDialog_0();
    } else if (maskUndefined(e.getSource()) === maskUndefined(this.mCBIsBridge) || maskUndefined(e.getSource()) === maskUndefined(this.mComboBoxRing)) {
      this.enableItems();
    } else if (maskUndefined(e.getSource()) === maskUndefined(this.mComboBoxMinAtoms)) {
      minAtoms = this.mComboBoxMinAtoms.getSelectedIndex_0();
      if (this.mFirstSpanItem != minAtoms) {
        maxAtoms = this.mFirstSpanItem + this.mComboBoxMaxAtoms.getSelectedIndex_0();
        itemCount = this.populateComboBoxMaxAtoms(minAtoms);
        if (maxAtoms < minAtoms)
          this.mComboBoxMaxAtoms.setSelectedIndex_0(0);
        else if (maxAtoms < minAtoms + itemCount)
          this.mComboBoxMaxAtoms.setSelectedIndex_0(maxAtoms - minAtoms);
        else
          this.mComboBoxMaxAtoms.setSelectedIndex_0(itemCount - 1);
        this.mFirstSpanItem = minAtoms;
      }
    }
  };
  _.isSelectedBond_1 = function isSelectedBond_0(bond) {
    return this.mMol.isSelectedAtom_0(this.mMol.getBondAtom_0(0, bond)) && this.mMol.isSelectedAtom_0(this.mMol.getBondAtom_0(1, bond));
  };
  _.populateComboBoxMaxAtoms = function populateComboBoxMaxAtoms(minAtoms) {
    var i, itemCount;
    this.mComboBoxMaxAtoms.removeAllItems_0();
    itemCount = 1 << 4;
    for (i = 0; i < itemCount; i++)
      this.mComboBoxMaxAtoms.addItem_0("" + (minAtoms + i));
    return itemCount;
  };
  _.setInitialStates_0 = function setInitialStates_0() {
    var aromState, atomSpan, bondOrder, minAtoms, queryFeatures, ringSize, ringState;
    queryFeatures = this.mMol.getBondQueryFeatures_0(this.mBond);
    bondOrder = this.mMol.getBondType_0(this.mBond) == 8 || this.mMol.isDelocalizedBond_0(this.mBond) ? 6 : this.mMol.getBondOrder_0(this.mBond);
    if ((queryFeatures & 1) != 0 || bondOrder == 1)
      this.mCBSingle.setSelected_0(true);
    if ((queryFeatures & 2) != 0 || bondOrder == 2)
      this.mCBDouble.setSelected_0(true);
    if ((queryFeatures & 4) != 0 || bondOrder == 3)
      this.mCBTriple.setSelected_0(true);
    if ((queryFeatures & 32) != 0 || bondOrder == 4)
      this.mCBQuadruple.setSelected_0(true);
    if ((queryFeatures & 64) != 0 || bondOrder == 5)
      this.mCBQuintuple.setSelected_0(true);
    if ((queryFeatures & 8) != 0 || bondOrder == 6)
      this.mCBDelocalized.setSelected_0(true);
    if ((queryFeatures & 16) != 0 || bondOrder == 0)
      this.mCBMetalLigand.setSelected_0(true);
    if ((queryFeatures & 8388608) != 0)
      this.mCBMatchFormalOrder.setSelected_0(true);
    if ((queryFeatures & 1048576) != 0)
      this.mCBMatchStereo.setSelected_0(true);
    ringState = queryFeatures & 384;
    aromState = queryFeatures & 6291456;
    if (ringState == 128)
      this.mComboBoxRing.setSelectedIndex_0(1);
    else if (aromState == 2097152)
      this.mComboBoxRing.setSelectedIndex_0(4);
    else if (ringState == 256)
      this.mComboBoxRing.setSelectedIndex_0(aromState == 0 ? 2 : 3);
    else
      this.mComboBoxRing.setSelectedIndex_0(aromState == 0 ? 0 : 5);
    ringSize = (queryFeatures & 917504) >> 17;
    this.mComboBoxRingSize.setSelectedIndex_0(ringSize == 0 ? 0 : ringSize <= 2 ? ringSize + 5 : ringSize - 2);
    if ((queryFeatures & 130560) != 0) {
      this.mCBIsBridge.setSelected_0(true);
      minAtoms = (queryFeatures & 7680) >> 9;
      atomSpan = (queryFeatures & 122880) >> 13;
      this.mComboBoxMinAtoms.setSelectedIndex_0(minAtoms);
      this.populateComboBoxMaxAtoms(minAtoms);
      this.mComboBoxMaxAtoms.setSelectedIndex_0(atomSpan);
    } else
      this.mComboBoxMaxAtoms.setSelectedIndex_0(0);
    this.enableItems();
  };
  _.setQueryFeatures_1 = function setQueryFeatures_1() {
    var bond;
    if (this.isSelectedBond_1(this.mBond)) {
      for (bond = 0; bond < this.mMol.getAllBonds_0(); bond++)
        if (this.isSelectedBond_1(bond))
          this.setQueryFeatures_2(bond);
    } else {
      this.setQueryFeatures_2(this.mBond);
    }
    this.mMol.validateBondQueryFeatures();
  };
  _.setQueryFeatures_2 = function setQueryFeatures_2(bond) {
    var atomSpan, implicitSize, minAtoms, queryFeatures, ringSize;
    queryFeatures = 0;
    if (this.mCBIsBridge.isSelected_0()) {
      minAtoms = this.mComboBoxMinAtoms.getSelectedIndex_0();
      atomSpan = this.mComboBoxMaxAtoms.getSelectedIndex_0();
      queryFeatures |= minAtoms << 9;
      queryFeatures |= atomSpan << 13;
      queryFeatures &= ~127;
      this.mMol.setBondType_0(bond, 1);
    } else {
      if (this.mCBSingle.isSelected_0())
        queryFeatures |= 1;
      if (this.mCBDouble.isSelected_0())
        queryFeatures |= 2;
      if (this.mCBTriple.isSelected_0())
        queryFeatures |= 4;
      if (this.mCBQuadruple.isSelected_0())
        queryFeatures |= 32;
      if (this.mCBQuintuple.isSelected_0())
        queryFeatures |= 64;
      if (this.mCBDelocalized.isSelected_0())
        queryFeatures |= 8;
      if (this.mCBMetalLigand.isSelected_0())
        queryFeatures |= 16;
      if (this.mComboBoxRing.getSelectedIndex_0() != 0) {
        if (this.mComboBoxRing.getSelectedIndex_0() == 1) {
          if (!this.mMol.isRingBond_0(bond))
            queryFeatures |= 128;
        } else if (this.mComboBoxRing.getSelectedIndex_0() == 2) {
          if (!this.mMol.isRingBond_0(bond))
            queryFeatures |= 256;
        } else if (this.mComboBoxRing.getSelectedIndex_0() == 3) {
          if (!this.mMol.isAromaticBond_0(bond))
            queryFeatures |= 4194304 | 256;
        } else if (this.mComboBoxRing.getSelectedIndex_0() == 4) {
          if (!this.mMol.isAromaticBond_0(bond))
            queryFeatures |= 2097152;
        } else if (this.mComboBoxRing.getSelectedIndex_0() == 5) {
          if (!this.mMol.isAromaticBond_0(bond))
            queryFeatures |= 4194304;
        }
      }
      if (this.mComboBoxRingSize.getSelectedIndex_0() != 0) {
        ringSize = this.mComboBoxRingSize.getSelectedIndex_0() + 2;
        if (ringSize > 7)
          ringSize -= 7;
        implicitSize = this.mMol.getBondRingSize_0(bond);
        if (ringSize <= 2 || ringSize != implicitSize) {
          queryFeatures |= ringSize << 17;
        }
      }
      if (this.mCBMatchFormalOrder.isSelected_0())
        queryFeatures |= 8388608;
      if (this.mCBMatchStereo.isSelected_0())
        queryFeatures |= 1048576;
    }
    this.mMol.setBondQueryFeature_0(bond, 16777215, false);
    this.mMol.setBondQueryFeature_0(bond, queryFeatures, true);
    this.mMol.adaptBondTypeToQueryFeatures(bond);
  };
  _.showDialog_0 = function showDialog_0() {
    this.mOKSelected = false;
    this.mDialog.showDialog_1();
    return this.mOKSelected;
  };
  _.mBond = 0;
  _.mFirstSpanItem = 0;
  _.mOKSelected = false;
  cggl.Lcom_actelion_research_gui_editor_BondQueryFeatureDialogBuilder_2_classLit = createForClass("com.actelion.research.gui.editor", "BondQueryFeatureDialogBuilder", 337, cggl.Ljava_lang_Object_2_classLit);
  carge.$clinit_CustomAtomDialogBuilder = function $clinit_CustomAtomDialogBuilder() {
    carge.$clinit_CustomAtomDialogBuilder = emptyMethod;
    jl.$clinit_Object();
    carge.RADICAL_STATES = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["None", "One electron (duplet)", "Two electrons (triplet)", "Two electrons (singulet)"]);
  };
  carge.CustomAtomDialogBuilder = function CustomAtomDialogBuilder(dialogHelper, editorArea, atomicNo, mass, valence, radical, label_0) {
    carge.$clinit_CustomAtomDialogBuilder();
    Object_0.call(this);
    this.$init_152();
    this.mDialog = dialogHelper.createDialog_0("Atom Properties", this);
    this.mEditorArea = editorArea;
    this.mAtom = -1;
    this.mOldAtomicNo = atomicNo;
    this.mOldAtomMass = mass;
    this.mOldAtomValence = valence;
    this.mOldAtomRadical = radical;
    this.mOldCustomLabel = label_0;
    this.build_1();
  };
  carge.CustomAtomDialogBuilder_0 = function CustomAtomDialogBuilder_0(dialogHelper, editorArea, mol, atom) {
    carge.$clinit_CustomAtomDialogBuilder();
    Object_0.call(this);
    this.$init_152();
    this.mDialog = dialogHelper.createDialog_0("Atom Properties", this);
    this.mEditorArea = editorArea;
    this.mMol = mol;
    this.mAtom = atom;
    this.mOldAtomicNo = this.mMol.getAtomicNo_0(atom);
    this.mOldAtomMass = this.mMol.getAtomMass_0(atom);
    this.mOldAtomValence = this.mMol.getAtomAbnormalValence_0(atom);
    this.mOldAtomRadical = this.mMol.getAtomRadical_0(atom);
    this.mOldCustomLabel = this.mMol.getAtomCustomLabel_0(atom);
    this.build_1();
  };
  defineClass(244, 1, { 109: 1, 1: 1 }, carge.CustomAtomDialogBuilder, carge.CustomAtomDialogBuilder_0);
  _.$init_152 = function $init_152() {
  };
  _.eventHappened_0 = function eventHappened_4(e) {
    this.eventHappened(castTo(e, 80));
  };
  _.build_1 = function build_1() {
    var customLabel, hLayout, label_0, s, s$array, s$index, s$max, state, vLayout;
    hLayout = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [8, -2, 8, -2, 8]);
    vLayout = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [8, -2, 4, -2, 12, -2, 4, -2, 12, -2, 4, -2, 12, -2, 8]);
    this.mDialog.setLayout_0(hLayout, vLayout);
    this.mTextFieldLabel = this.mDialog.createTextField_0(1, 1);
    this.mTextFieldLabel.addEventConsumer(this);
    this.mDialog.add_8(this.mDialog.createLabel_0("Atom Label:"), 1, 1);
    this.mDialog.add_8(this.mTextFieldLabel, 3, 1);
    this.mDialog.add_9(this.mDialog.createLabel_0("(examples: 'D', 'Li', 'Cys', 'R12', 'R3@C')"), 1, 3, 3, 3);
    this.mTextFieldMass = this.mDialog.createTextField_0(1, 1);
    this.mTextFieldMass.addEventConsumer(this);
    this.mDialog.add_8(this.mDialog.createLabel_0("Atom Mass:"), 1, 5);
    this.mDialog.add_8(this.mTextFieldMass, 3, 5);
    this.mDialog.add_9(this.mDialog.createLabel_0("(empty for natural abundance)"), 1, 7, 3, 7);
    this.mTextFieldValence = this.mDialog.createTextField_0(1, 1);
    this.mTextFieldValence.addEventConsumer(this);
    this.mDialog.add_8(this.mDialog.createLabel_0("Abnormal Valence:"), 1, 9);
    this.mDialog.add_8(this.mTextFieldValence, 3, 9);
    this.mDialog.add_9(this.mDialog.createLabel_0("(empty for default valence)"), 1, 11, 3, 11);
    if (this.mAtom == -1) {
      label_0 = (carc2.$clinit_Molecule(), carc2.cAtomLabel)[this.mOldAtomicNo];
      this.mTextFieldLabel.setText_0(jsEquals(this.mOldCustomLabel, null) ? label_0 : this.mOldCustomLabel + "@" + label_0);
      if (this.mOldAtomMass != 0)
        this.mTextFieldMass.setText_0("" + this.mOldAtomMass);
      if (this.mOldAtomValence != -1)
        this.mTextFieldValence.setText_0("" + this.mOldAtomValence);
    } else {
      label_0 = this.mMol.getAtomLabel_0(this.mAtom);
      customLabel = this.mMol.getAtomCustomLabel_0(this.mAtom);
      this.mTextFieldLabel.setText_0(jsEquals(customLabel, null) ? label_0 : customLabel + "@" + label_0);
      if (this.mMol.getAtomMass_0(this.mAtom) != 0)
        this.mTextFieldMass.setText_0("" + this.mMol.getAtomMass_0(this.mAtom));
      if (this.mMol.getAtomAbnormalValence_0(this.mAtom) != -1)
        this.mTextFieldValence.setText_0("" + this.mMol.getAtomAbnormalValence_0(this.mAtom));
    }
    this.mComboBoxRadical = this.mDialog.createComboBox_0();
    for (s$array = carge.RADICAL_STATES, s$index = 0, s$max = s$array.length; s$index < s$max; ++s$index) {
      s = s$array[s$index];
      this.mComboBoxRadical.addItem_0(s);
    }
    state = this.mAtom == -1 ? this.mOldAtomRadical : this.mMol.getAtomRadical_0(this.mAtom);
    this.mComboBoxRadical.setSelectedIndex_0(state == 32 ? 1 : state == 48 ? 2 : state == 16 ? 3 : 0);
    this.mDialog.add_8(this.mDialog.createLabel_0("Radical State:"), 1, 13);
    this.mDialog.add_8(this.mComboBoxRadical, 3, 13);
  };
  _.eventHappened = function eventHappened_3(e) {
    if (false) {
    } else if (e.getWhat() == 1) {
      if (this.mAtom != -1) {
        this.mMol.setAtomicNo_0(this.mAtom, this.mOldAtomicNo);
        this.mMol.setAtomMass_0(this.mAtom, this.mOldAtomMass);
        this.mMol.setAtomAbnormalValence_0(this.mAtom, this.mOldAtomValence);
        this.mMol.setAtomRadical_0(this.mAtom, this.mOldAtomRadical);
        this.mMol.setAtomCustomLabel_0(this.mAtom, this.mOldCustomLabel);
      }
      this.mDialog.disposeDialog_0();
    } else if (e.getWhat() == 0) {
      this.processAtomLabel(true);
      this.mDialog.disposeDialog_0();
    }
  };
  _.processAtomLabel = function processAtomLabel(updateDefault) {
    var atomicNo, customLabel, index_0, mass, nfe, radical, text_0, valence;
    text_0 = this.mTextFieldLabel.getText_0();
    customLabel = null;
    if (jl.length__I__devirtual$_0(text_0) != 0) {
      index_0 = jl.indexOf_I_I__devirtual$(text_0, 64);
      if (index_0 != -1) {
        customLabel = jl.substring_II_Ljava_lang_String___devirtual$(text_0, 0, index_0);
        text_0 = jl.substring_I_Ljava_lang_String___devirtual$(text_0, index_0 + 1);
      }
    }
    if (jl.length__I__devirtual$_0(text_0) != 0) {
      atomicNo = carc2.getAtomicNoFromLabel_0(text_0, this.mEditorArea.getAllowedPseudoAtoms());
      if (atomicNo != 0 || jl.equals_Ljava_lang_Object__Z__devirtual$_2(text_0, "?")) {
        mass = 0;
        if (jl.length__I__devirtual$_0(this.mTextFieldMass.getText_0()) != 0) {
          try {
            mass = jl.parseInt_2(this.mTextFieldMass.getText_0());
            if (mass < (carc2.$clinit_Molecule(), carc2.cRoundedMass)[atomicNo] - 18 || mass > (carc2.$clinit_Molecule(), carc2.cRoundedMass)[atomicNo] + 12) {
              this.mDialog.showMessage_0("Your mass is out of range!");
              return;
            }
          } catch ($e0) {
            $e0 = toJava($e0);
            if (instanceOf($e0, 47)) {
              nfe = $e0;
              this.mDialog.showMessage_0("Your mass is not a number!");
              return;
            } else
              throw toJs($e0);
          }
        }
        valence = -1;
        if (jl.length__I__devirtual$_0(this.mTextFieldValence.getText_0()) != 0) {
          try {
            valence = jl.parseInt_2(this.mTextFieldValence.getText_0());
            if (valence < 0 || valence > 15) {
              this.mDialog.showMessage_0("Your valence is out of range!");
              return;
            }
          } catch ($e1) {
            $e1 = toJava($e1);
            if (instanceOf($e1, 47)) {
              nfe = $e1;
              this.mDialog.showMessage_0("Your valence is not a number!");
              return;
            } else
              throw toJs($e1);
          }
        }
        radical = this.mComboBoxRadical.getSelectedIndex_0() == 1 ? 32 : this.mComboBoxRadical.getSelectedIndex_0() == 2 ? 48 : this.mComboBoxRadical.getSelectedIndex_0() == 3 ? 16 : 0;
        if (updateDefault)
          this.mEditorArea.setCustomAtom(atomicNo, mass, valence, radical, customLabel);
        if (this.mAtom != -1) {
          this.mMol.changeAtom_0(this.mAtom, atomicNo, mass, valence, radical);
          this.mMol.setAtomCustomLabel_0(this.mAtom, customLabel);
        }
        this.mOKSelected = true;
        this.mDialog.disposeDialog_0();
      }
    }
  };
  _.showDialog_0 = function showDialog_1() {
    this.mOKSelected = false;
    this.mDialog.showDialog_1();
    return this.mOKSelected;
  };
  _.mAtom = 0;
  _.mOKSelected = false;
  _.mOldAtomMass = 0;
  _.mOldAtomRadical = 0;
  _.mOldAtomValence = 0;
  _.mOldAtomicNo = 0;
  cggl.Lcom_actelion_research_gui_editor_CustomAtomDialogBuilder_2_classLit = createForClass("com.actelion.research.gui.editor", "CustomAtomDialogBuilder", 244, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_EventObject = function $clinit_EventObject() {
    ju.$clinit_EventObject = emptyMethod;
    jl.$clinit_Object();
  };
  ju.EventObject = function EventObject(source) {
    ju.$clinit_EventObject();
    Object_0.call(this);
    this.$init_153();
    this.source = source;
  };
  defineClass(385, 1, { 1: 1 });
  _.$init_153 = function $init_153() {
  };
  _.getSource = function getSource() {
    return this.source;
  };
  cggl.Ljava_util_EventObject_2_classLit = createForClass("java.util", "EventObject", 385, cggl.Ljava_lang_Object_2_classLit);
  cargg.$clinit_GenericEvent = function $clinit_GenericEvent() {
    cargg.$clinit_GenericEvent = emptyMethod;
    ju.$clinit_EventObject();
  };
  cargg.GenericEvent = function GenericEvent(what, source) {
    cargg.$clinit_GenericEvent();
    ju.EventObject.call(this, source);
    this.$init_154();
    this.mWhat = what;
  };
  defineClass(185, 385, { 1: 1 });
  _.$init_154 = function $init_154() {
  };
  _.getWhat = function getWhat() {
    return this.mWhat;
  };
  _.mWhat = 0;
  cggl.Lcom_actelion_research_gui_generic_GenericEvent_2_classLit = createForClass("com.actelion.research.gui.generic", "GenericEvent", 185, cggl.Ljava_util_EventObject_2_classLit);
  carge.$clinit_EditorEvent = function $clinit_EditorEvent() {
    carge.$clinit_EditorEvent = emptyMethod;
    cargg.$clinit_GenericEvent();
  };
  carge.EditorEvent = function EditorEvent(source, what, isUserChange) {
    carge.$clinit_EditorEvent();
    cargg.GenericEvent.call(this, what, source);
    this.$init_155();
    this.mIsUserChange = isUserChange;
  };
  defineClass(108, 185, { 108: 1, 1: 1 }, carge.EditorEvent);
  _.$init_155 = function $init_155() {
  };
  _.isUserChange = function isUserChange_0() {
    return this.mIsUserChange;
  };
  _.mIsUserChange = false;
  carge.WHAT_HILITE_ATOM_CHANGED = 4;
  carge.WHAT_HILITE_BOND_CHANGED = 8;
  carge.WHAT_MOLECULE_CHANGED = 1;
  carge.WHAT_SELECTION_CHANGED = 2;
  carge.serialVersionUID_7 = 537462289;
  cggl.Lcom_actelion_research_gui_editor_EditorEvent_2_classLit = createForClass("com.actelion.research.gui.editor", "EditorEvent", 108, cggl.Lcom_actelion_research_gui_generic_GenericEvent_2_classLit);
  carge.$clinit_GenericEditorArea = function $clinit_GenericEditorArea() {
    carge.$clinit_GenericEditorArea = emptyMethod;
    jl.$clinit_Object();
    carge.DEFAULT_ALLOWED_PSEUDO_ATOMS = 1 | 64 | 8 | 2 | 256;
    carge.ITEM_PASTE_WITH_NAME = "Paste Structure or Name";
    carge.FRAGMENT_GROUPING_DISTANCE = 1.600000023841858 + 0.10000000149011612;
    carge.FRAGMENT_CLEANUP_DISTANCE = 1.600000023841858 + 0.20000000298023224;
  };
  carge.GenericEditorArea = function GenericEditorArea(mol, mode, helper, canvas) {
    carge.$clinit_GenericEditorArea();
    Object_0.call(this);
    this.$init_156();
    this.mMol = mol;
    this.mMode = mode;
    this.mUIHelper = helper;
    this.mCanvas = canvas;
    this.mListeners = new ju.ArrayList();
    this.mCurrentTool = 5;
    this.mCurrentHiliteAtom = -1;
    this.mCurrentHiliteBond = -1;
    this.mCurrentHiliteObject = null;
    this.mAtom1 = -1;
    this.mCustomAtomicNo = 6;
    this.mCustomAtomMass = 0;
    this.mCustomAtomValence = -1;
    this.mCustomAtomRadical = 0;
    this.mCustomAtomLabel = null;
    this.mAllowQueryFeatures = true;
    this.mAllowFragmentChangeOnPasteOrDrop = false;
    this.mPendingRequest = 0;
    this.mCurrentCursor = 11;
    this.mAtomKeyStrokeBuffer = new jl.StringBuilder();
    this.mAllowedPseudoAtoms = 331;
    this.mTextSizeFactor = 1;
    this.mUIScaling = cargh.getUIScaleFactor();
    this.mMaxAVBL = cargh.scale_3(24);
    if ((this.mMode & (4 | 2)) != 0) {
      this.mMode |= 1;
    }
    if ((this.mMode & (8 | 4)) != 0) {
      this.mDrawingObjectList = new carc2.DrawingObjectList();
    }
    this.mUpdateMode = 4;
  };
  carge.chainHiliteColor = function chainHiliteColor(context) {
    var background, selectionColor;
    background = context.getBackgroundRGB_0();
    selectionColor = carge.selectionColor_0(context);
    return caru.intermediateColor(selectionColor, background, 0.5);
  };
  carge.lassoColor = function lassoColor(context) {
    var selectionColor;
    selectionColor = carge.selectionColor_0(context);
    return caru.createColor(selectionColor, carg.isDarkLookAndFeel() ? 0.6499999761581421 : 0.3499999940395355);
  };
  carge.mapToolColor = function mapToolColor(context) {
    var background;
    background = context.getBackgroundRGB_0();
    return caru.getContrastColor_0(-8388608, background);
  };
  carge.selectionColor_0 = function selectionColor_0(context) {
    var selectionColor;
    selectionColor = context.getSelectionBackgroundRGB_0();
    return selectionColor != 0 ? selectionColor : -8346432;
  };
  defineClass(330, 1, { 109: 1, 1: 1 }, carge.GenericEditorArea);
  _.$init_156 = function $init_156() {
  };
  _.lambda$0 = function lambda$0_1(what_1, e_2) {
    carge.$clinit_GenericEditorArea();
    var l, l$iterator;
    {
      this.mEventsScheduled &= ~what_1;
      for (l$iterator = this.mListeners.iterator(); l$iterator.hasNext_0(); ) {
        l = castTo(l$iterator.next_3(), 109);
        l.eventHappened_0(e_2);
      }
    }
  };
  _.lambda$1 = function lambda$1(cog_1, fragmentDescriptor1_1, fragmentDescriptor2_2) {
    carge.$clinit_GenericEditorArea();
    {
      if ((this.mMode & (4 | 2)) != 0) {
        if (fragmentDescriptor1_1[1] != fragmentDescriptor2_2[1]) {
          return fragmentDescriptor1_1[1] == 0 ? -1 : 1;
        }
      }
      return compare_23(cog_1[fragmentDescriptor1_1[0]].x_0 + cog_1[fragmentDescriptor1_1[0]].y_0, cog_1[fragmentDescriptor2_2[0]].x_0 + cog_1[fragmentDescriptor2_2[0]].y_0);
    }
  };
  _.addDrawAreaListener = function addDrawAreaListener(l) {
    this.mListeners.add(l);
  };
  _.addPastedOrDropped_0 = function addPastedOrDropped(mol, p) {
    var atom, avbl, editorIsFragment, originalAtoms;
    if (isNull(mol) || mol.getAllAtoms_0() == 0)
      return false;
    if (mol.getAllBonds_0() != 0) {
      avbl = this.getScaledAVBL();
      new cargg.GenericDepictor(mol).updateCoords(this.mCanvas.getDrawContext_0(), new cargg.GenericRectangle_0(0, 0, this.mCanvas.getCanvasWidth_0(), this.mCanvas.getCanvasHeight_0()), 65536 + round_int(avbl));
      while (this.atomCoordinatesCollide(mol, 0.2 * avbl))
        mol.translateCoords_0(0.5 * avbl, 0.5 * avbl);
    }
    this.storeState();
    mol.removeAtomColors_0();
    mol.removeBondHiliting_0();
    editorIsFragment = this.mMol.isFragment_0();
    if (this.mMol.getAllAtoms_0() == 0) {
      mol.copyMolecule_0(this.mMol);
      if (!this.mAllowFragmentChangeOnPasteOrDrop)
        this.mMol.setFragment_0(editorIsFragment);
      this.updateAndFireEvent(4);
    } else {
      if (isNotNull(p))
        mol.translateCoords_0(p.x_0 - this.mCanvas.getCanvasWidth_0() / 2, p.y_0 - this.mCanvas.getCanvasHeight_0() / 2);
      originalAtoms = this.mMol.getAllAtoms_0();
      this.mMol.addMolecule_0(mol);
      if (!this.mAllowFragmentChangeOnPasteOrDrop)
        this.mMol.setFragment_0(editorIsFragment);
      for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++)
        this.mMol.setAtomSelection_0(atom, atom >= originalAtoms);
      this.updateAndFireEvent(3);
    }
    return true;
  };
  _.analyseCopy = function analyseCopy(doCopy) {
    var arrow, atom, isBothSideSelection, isOnProductSide, isReaction, selectionFound;
    isReaction = (this.mMode & 4) != 0;
    selectionFound = false;
    isBothSideSelection = false;
    isOnProductSide = false;
    arrow = null;
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      if (this.mMol.isSelectedAtom_0(atom)) {
        if (!selectionFound) {
          selectionFound = true;
          if (!isReaction) {
            break;
          }
          arrow = castTo(castTo(this.mDrawingObjectList.getAtIndex(0), 42), 42);
          isOnProductSide = arrow.isOnProductSide(this.mMol.getAtomX_0(atom), this.mMol.getAtomY_0(atom));
        } else {
          if (isOnProductSide != arrow.isOnProductSide(this.mMol.getAtomX_0(atom), this.mMol.getAtomY_0(atom))) {
            isBothSideSelection = true;
            break;
          }
        }
      }
    }
    if (!doCopy)
      return isReaction && (isBothSideSelection || !selectionFound);
    if (isReaction) {
      if (isBothSideSelection) {
        this.copyReaction_0(true);
        return true;
      } else if (selectionFound) {
        this.copyMolecule_2(true);
        return false;
      } else {
        this.copyReaction_0(false);
        return true;
      }
    }
    this.copyMolecule_2(selectionFound);
    return false;
  };
  _.analyzeFragmentMembership = function analyzeFragmentMembership() {
    var fragmentNo, fragments;
    this.mMol.ensureHelperArrays_0(15);
    fragmentNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    fragments = this.mMol.getFragmentNumbers_0(fragmentNo, false, true);
    fragments = this.joinCloseFragments(fragmentNo, fragments);
    this.sortFragmentsByPosition(fragmentNo, fragments);
    this.mFragmentNo = fragmentNo;
    this.mFragment = this.mMol.getFragments_1(fragmentNo, fragments);
  };
  _.areAtomsMappingCompatible = function areAtomsMappingCompatible(atom1, atom2) {
    var atomList1, atomList2, i, isAny1, isAny2;
    if (this.mMol.isFragment_0()) {
      if (this.mMol.isExcludeGroupAtom(atom1) || this.mMol.isExcludeGroupAtom(atom2))
        return false;
      atomList1 = this.mMol.getAtomList_0(atom1);
      atomList2 = this.mMol.getAtomList_0(atom2);
      if (jsEquals(atomList1, null) ^ jsEquals(atomList2, null)) {
        return false;
      }
      if (jsNotEquals(atomList1, null)) {
        if (atomList1.length != atomList2.length) {
          return false;
        }
        for (i = 0; i < atomList1.length; i++) {
          if (atomList1[i] != atomList2[i]) {
            return false;
          }
        }
      }
      isAny1 = neq(and_0(this.mMol.getAtomQueryFeatures(atom1), 1), 0);
      isAny2 = neq(and_0(this.mMol.getAtomQueryFeatures(atom2), 1), 0);
      if (isAny1 != isAny2) {
        return false;
      }
    }
    return this.mMol.getAtomicNo_0(atom1) == this.mMol.getAtomicNo_0(atom2);
  };
  _.atomCoordinatesCollide = function atomCoordinatesCollide(mol, tolerance) {
    var count, dx, dy, found, i, j, x1, x2, y1, y2;
    count = 0;
    tolerance *= tolerance;
    for (i = 0; i < mol.getAllAtoms_0(); i++) {
      x1 = mol.getAtomX_0(i);
      y1 = mol.getAtomY_0(i);
      found = false;
      for (j = 0; j < this.mMol.getAllAtoms_0(); j++) {
        x2 = this.mMol.getAtomX_0(j);
        y2 = this.mMol.getAtomY_0(j);
        dx = x2 - x1;
        dy = y2 - y1;
        if (dx * dx + dy * dy < tolerance) {
          found = true;
          break;
        }
      }
      if (found)
        count++;
    }
    return count == mol.getAllAtoms_0();
  };
  _.autoMapReaction = function autoMapReaction() {
    var atom, fragment, fragmentAtom;
    this.analyzeFragmentMembership();
    new carcrm.ChemicalRuleEnhancedReactionMapper().map_1(this.getReaction_0());
    fragmentAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mFragment.length, 15, 1);
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      fragment = this.mFragmentNo[atom];
      this.mMol.setAtomMapNo_0(atom, this.mFragment[fragment].getAtomMapNo_0(fragmentAtom[fragment]), this.mMol.getAtomMapNo_0(atom) == 0 || this.mMol.isAutoMappedAtom_0(atom));
      fragmentAtom[fragment]++;
    }
  };
  _.buttonPressed = function buttonPressed(button) {
    switch (button) {
      case 0:
        this.clearAll_0();
        return;
      case 1:
        this.storeState();
        this.updateAndFireEvent(6);
        return;
      case 17:
        this.restoreState();
        this.updateAndFireEvent(2);
        return;
    }
  };
  _.calculateCenterOfGravity = function calculateCenterOfGravity(selectedOnly) {
    var atom, atoms, sumx, sumy;
    atoms = 0;
    sumx = 0;
    sumy = 0;
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      if (!selectedOnly || this.mMol.isSelectedAtom_0(atom)) {
        sumx += this.mMol.getAtomX_0(atom);
        sumy += this.mMol.getAtomY_0(atom);
        atoms++;
      }
    }
    return atoms > 1 ? new jag.Point2D$Double_0(sumx / atoms, sumy / atoms) : null;
  };
  _.calculateFragmentCenterOfGravity = function calculateFragmentCenterOfGravity(fragmentNo, fragments) {
    var atom, fragment, fragment0, fragmentAtoms, fragmentCOG;
    fragmentCOG = initUnidimensionalArray(cggl.Ljava_awt_geom_Point2D$Double_2_classLit, { 4: 1, 1: 1, 7: 1 }, 177, fragments, 0, 1);
    fragmentAtoms = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, fragments, 15, 1);
    for (fragment0 = 0; fragment0 < fragments; fragment0++) {
      setCheck(fragmentCOG, fragment0, new jag.Point2D$Double());
    }
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      fragmentCOG[fragmentNo[atom]].x_0 += this.mMol.getAtomX_0(atom);
      fragmentCOG[fragmentNo[atom]].y_0 += this.mMol.getAtomY_0(atom);
      fragmentAtoms[fragmentNo[atom]]++;
    }
    for (fragment = 0; fragment < fragments; fragment++) {
      fragmentCOG[fragment].x_0 /= fragmentAtoms[fragment];
      fragmentCOG[fragment].y_0 /= fragmentAtoms[fragment];
    }
    return fragmentCOG;
  };
  _.changeAtomicNo = function changeAtomicNo(atomicNo) {
    this.storeState();
    if (this.mMol.addOrChangeAtom_0(this.mX1, this.mY1, atomicNo, 0, -1, 0, null)) {
      this.mCurrentHiliteAtom = -1;
      this.updateAndFireEvent(3);
    }
  };
  _.changeHighlightedBond = function changeHighlightedBond(type_0) {
    this.storeState();
    return this.mMol.changeBond_0(this.mCurrentHiliteBond, type_0);
  };
  _.cleanupCoordinates = function cleanupCoordinates(context) {
    var atom, selectedAtomCount, selectedOnly;
    selectedAtomCount = 0;
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      if (this.mMol.isSelectedAtom_0(atom)) {
        selectedAtomCount++;
      }
    }
    selectedOnly = selectedAtomCount != 0 && selectedAtomCount != this.mMol.getAllAtoms_0();
    if ((this.mMode & 1) != 0)
      this.cleanupMultiFragmentCoordinates(context, selectedOnly);
    else
      this.cleanupMoleculeCoordinates(context, selectedOnly);
  };
  _.cleanupMoleculeCoordinates = function cleanupMoleculeCoordinates(context, selectedOnly) {
    var atom;
    if (this.mUpdateMode == 6) {
      if (selectedOnly)
        for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++)
          this.mMol.setAtomMarker_0(atom, !this.mMol.isSelectedAtom_0(atom));
      new carcc3.CoordinateInventor_0(selectedOnly ? 4 : 0).invent(this.mMol);
      if (selectedOnly)
        this.mMol.removeAtomMarkers_0();
    }
    this.mDepictor.updateCoords_0(context, new cargg.GenericRectangle_0(0, 0, this.mCanvas.getCanvasWidth_0(), this.mCanvas.getCanvasHeight_0()), 65536 | this.mMaxAVBL);
  };
  _.cleanupMultiFragmentCoordinates = function cleanupMultiFragmentCoordinates(context, selectedOnly) {
    var arrowWidth, atom, atom0, avbl, boundingRect, d, dx, dy, fragment, fragment0, fragment1, fragment2, fragmentAtom, fragmentAtom0, rawX, spacing;
    if (selectedOnly && this.mUpdateMode == 6) {
      fragmentAtom0 = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mFragment.length, 15, 1);
      for (atom0 = 0; atom0 < this.mMol.getAllAtoms_0(); atom0++) {
        fragment0 = this.mFragmentNo[atom0];
        this.mFragment[fragment0].setAtomMarker_0(fragmentAtom0[fragment0], !this.mMol.isSelectedAtom_0(atom0));
        fragmentAtom0[fragment0]++;
      }
    }
    boundingRect = initUnidimensionalArray(cggl.Lcom_actelion_research_gui_generic_GenericRectangle_2_classLit, { 4: 1, 1: 1, 7: 1 }, 32, this.mFragment.length, 0, 1);
    for (fragment1 = 0; fragment1 < this.mFragment.length; fragment1++) {
      if (this.mUpdateMode == 6) {
        new carcc3.CoordinateInventor_0(selectedOnly ? 4 : 0).invent(this.mFragment[fragment1]);
        this.mFragment[fragment1].setStereoBondsFromParity_0();
      }
      d = new cargg.GenericDepictor(this.mFragment[fragment1]);
      d.updateCoords(context, null, 65536 | this.mMaxAVBL);
      setCheck(boundingRect, fragment1, d.getBoundingRect());
    }
    spacing = 1.8000000715255737 * this.mMaxAVBL;
    avbl = this.getScaledAVBL();
    arrowWidth = (this.mMode & 4) == 0 ? 0 : this.mUpdateMode == 5 ? 0.07999999821186066 * this.mCanvas.getCanvasWidth_0() : castTo(castTo(this.mDrawingObjectList.getAtIndex(0), 42), 42).getLength_1() * this.mMaxAVBL / avbl;
    rawX = 0.5 * spacing;
    for (fragment2 = 0; fragment2 <= this.mFragment.length; fragment2++) {
      if ((this.mMode & 4) != 0 && fragment2 == this.mReactantCount) {
        castTo(castTo(this.mDrawingObjectList.getAtIndex(0), 42), 42).setCoordinates_1(rawX - spacing / 2, this.mCanvas.getCanvasHeight_0() / 2, rawX - spacing / 2 + arrowWidth, this.mCanvas.getCanvasHeight_0() / 2);
        rawX += arrowWidth;
      }
      if (fragment2 == this.mFragment.length) {
        break;
      }
      dx = rawX - boundingRect[fragment2].x_0;
      dy = 0.5 * (this.mCanvas.getCanvasHeight_0() - boundingRect[fragment2].height_0) - boundingRect[fragment2].y_0;
      this.mFragment[fragment2].translateCoords_0(dx, dy);
      rawX += spacing + boundingRect[fragment2].width_0;
    }
    this.mDepictor.updateCoords_0(context, new cargg.GenericRectangle_0(0, 0, this.mCanvas.getCanvasWidth_0(), this.mCanvas.getCanvasHeight_0()), 65536 | this.mMaxAVBL);
    fragmentAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mFragment.length, 15, 1);
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      fragment = this.mFragmentNo[atom];
      this.mMol.setAtomX_0(atom, this.mFragment[fragment].getAtomX_0(fragmentAtom[fragment]));
      this.mMol.setAtomY_0(atom, this.mFragment[fragment].getAtomY_0(fragmentAtom[fragment]));
      fragmentAtom[fragment]++;
    }
    this.mMol.setStereoBondsFromParity_0();
  };
  _.clearAll_0 = function clearAll() {
    var isFragment;
    if (isNotNull(this.mDrawingObjectList)) {
      this.mDrawingObjectList.clear();
      this.update(1);
    }
    this.storeState();
    isFragment = this.mMol.isFragment_0();
    this.mMol.clear_0();
    this.mMol.setFragment_0(isFragment);
    if (this.mUndoMol.getAllAtoms_0() != 0)
      this.updateAndFireEvent(1);
    else
      this.update(1);
  };
  _.copy = function copy_0() {
    this.analyseCopy(true);
  };
  _.copyMolecule_2 = function copyMolecule_0(selectionOnly) {
    if (this.mMol.getAllAtoms_0() != 0 && isNotNull(this.mClipboardHandler)) {
      return this.mClipboardHandler.copyMolecule_1(selectionOnly ? this.getSelectedCopy(this.mMol) : this.mMol.getCompactCopy_0());
    }
    return false;
  };
  _.copyReaction_0 = function copyReaction(selectionOnly) {
    var rxn;
    rxn = selectionOnly ? this.getSelectedReaction() : this.getReaction_0();
    if (isNotNull(rxn) && isNotNull(this.mClipboardHandler)) {
      return this.mClipboardHandler.copyReaction(rxn);
    }
    return false;
  };
  _.deleteAt = function deleteAt(x_0, y_0) {
    var drawingObject;
    if (this.mMol.deleteAtomOrBond_0(x_0, y_0)) {
      this.updateAndFireEvent(1);
      return true;
    }
    drawingObject = this.findDrawingObject(x_0, y_0, null, true);
    if (isNotNull(drawingObject)) {
      this.mDrawingObjectList.remove(drawingObject);
      this.mCurrentHiliteObject = null;
      this.update(1);
      return true;
    }
    return false;
  };
  _.deleteHilited = function deleteHilited() {
    if (this.mCurrentHiliteAtom != -1) {
      this.mMol.deleteAtom_0(this.mCurrentHiliteAtom);
      this.mCurrentHiliteAtom = -1;
      this.updateAndFireEvent(1);
      return true;
    }
    if (this.mCurrentHiliteBond != -1) {
      this.mMol.deleteBondAndSurrounding_0(this.mCurrentHiliteBond);
      this.mCurrentHiliteBond = -1;
      this.updateAndFireEvent(1);
      return true;
    }
    if (isNotNull(this.mCurrentHiliteObject) && this.mCurrentHiliteObject.isDeletable()) {
      this.mDrawingObjectList.remove(this.mCurrentHiliteObject);
      this.mCurrentHiliteObject = null;
      this.update(1);
      return true;
    }
    return false;
  };
  _.drawHiliting = function drawHiliting(context) {
    var atom, i, mapNo;
    if (jsNotEquals(this.mHiliteBondSet, null)) {
      context.setRGB_0(carge.chainHiliteColor(context));
      for (i = 0; i < this.mHiliteBondSet.length; i++) {
        this.hiliteBond(context, this.mHiliteBondSet[i]);
      }
    }
    if (this.mCurrentHiliteAtom != -1) {
      context.setRGB_0(carge.selectionColor_0(context));
      this.hiliteAtom(context, this.mCurrentHiliteAtom);
      if (this.mCurrentTool == 19) {
        mapNo = this.mMol.getAtomMapNo_0(this.mCurrentHiliteAtom);
        if (mapNo != 0) {
          for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
            if (atom != this.mCurrentHiliteAtom && this.mMol.getAtomMapNo_0(atom) == mapNo) {
              this.hiliteAtom(context, atom);
            }
          }
        }
      }
    }
    if (this.mCurrentHiliteBond != -1) {
      context.setRGB_0(carge.selectionColor_0(context));
      this.hiliteBond(context, this.mCurrentHiliteBond);
    }
    if (isNotNull(this.mCurrentHiliteObject)) {
      this.mCurrentHiliteObject.hilite(context);
    }
  };
  _.duplicateSelected = function duplicateSelected() {
    var atom, atom0, atom1, atom2, atomCount, atomMap, bond, esrGroupCountAND, esrGroupCountOR, i, newAtom, object, originalAtoms, originalBonds;
    atomCount = 0;
    for (atom0 = 0; atom0 < this.mMol.getAllAtoms_0(); atom0++) {
      if (this.mMol.isSelectedAtom_0(atom0)) {
        atomCount++;
      }
    }
    originalAtoms = this.mMol.getAllAtoms_0();
    originalBonds = this.mMol.getAllBonds_0();
    this.mX = ju.copyOf_8(this.mX, this.mX.length + atomCount);
    this.mY = ju.copyOf_8(this.mY, this.mY.length + atomCount);
    atomMap = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    esrGroupCountAND = this.mMol.renumberESRGroups_0(1);
    esrGroupCountOR = this.mMol.renumberESRGroups_0(2);
    for (atom1 = 0; atom1 < originalAtoms; atom1++) {
      if (this.mMol.isSelectedAtom_0(atom1)) {
        newAtom = this.mMol.getAllAtoms_0();
        this.mX[newAtom] = this.mX[atom1];
        this.mY[newAtom] = this.mY[atom1];
        atomMap[atom1] = newAtom;
        this.mMol.copyAtom_0(this.mMol, atom1, esrGroupCountAND, esrGroupCountOR);
      }
    }
    for (bond = 0; bond < originalBonds; bond++) {
      if (this.mMol.isSelectedBond_0(bond)) {
        this.mMol.copyBond_1(this.mMol, bond, esrGroupCountAND, esrGroupCountOR, atomMap, false);
      }
    }
    for (atom2 = 0; atom2 < originalAtoms; atom2++) {
      this.mMol.setAtomSelection_0(atom2, false);
    }
    for (atom = originalAtoms; atom < this.mMol.getAllAtoms_0(); atom++) {
      this.mMol.setAtomMapNo_0(atom, 0, false);
    }
    if (isNotNull(this.mDrawingObjectList)) {
      for (i = this.mDrawingObjectList.size() - 1; i >= 0; i--) {
        object = castTo(this.mDrawingObjectList.getAtIndex(i), 38);
        if (object.isSelected_0() && !instanceOf(object, 42)) {
          this.mDrawingObjectList.add(object.clone_0());
        }
      }
    }
  };
  _.editTextObject = function editTextObject(object) {
    var i, nonWhiteSpaceFound;
    new carge.TextDrawingObjectDialogBuilder(this.mUIHelper, object);
    nonWhiteSpaceFound = false;
    for (i = 0; i < jl.length__I__devirtual$_0(object.getText_0()); i++) {
      if (!isWhitespace(jl.charAt_I_C__devirtual$_0(object.getText_0(), i))) {
        nonWhiteSpaceFound = true;
        break;
      }
    }
    if (!nonWhiteSpaceFound)
      this.mDrawingObjectList.remove(object);
    this.mCanvas.repaint_0();
  };
  _.eventHappened_1 = function eventHappened_5(e) {
    var atom, color_0, command, i, index_0;
    command = e.getMessage();
    if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Copy Structure") || jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Copy Reaction")) {
      this.copy();
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Paste Reaction")) {
      this.pasteReaction_0();
    } else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(command, "Use Reaction Template...")) {
      this.useTemplate(jl.substring_I_Ljava_lang_String___devirtual$(command, jl.length__I__devirtual$_0("Use Reaction Template...")));
    } else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(command, "Paste Structure")) {
      this.pasteMolecule_1();
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Open Reaction File...")) {
      this.openReaction();
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Auto-Map Reaction")) {
      this.autoMapReaction();
      this.updateAndFireEvent($wnd.Math.max(this.mUpdateMode, 1));
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Remove Entire Atom Mapping")) {
      this.removeMapping(true, true);
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Remove Explicit Mapping (red)")) {
      this.removeMapping(false, true);
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Remove Auto-Mapping (green)")) {
      this.removeMapping(true, false);
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Make Auto-Mapping Explicit")) {
      this.makeAutoMappingExplicit();
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Automatically Complete Mapping")) {
      carge.sKeepAutoMapped = !carge.sKeepAutoMapped;
      if (carge.sKeepAutoMapped)
        this.autoMapReaction();
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Flip Horizontally")) {
      this.flip_0(true);
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Flip Vertically")) {
      this.flip_0(false);
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Rotate 180\xB0")) {
      this.rotate180();
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Help Me")) {
      this.showHelpDialog_0();
    } else if (jl.startsWith_Ljava_lang_String__Z__devirtual$(command, "atomColor")) {
      index_0 = jl.indexOf_I_I__devirtual$(command, 58);
      atom = jl.parseInt_2(jl.substring_II_Ljava_lang_String___devirtual$(command, 9, index_0));
      color_0 = jl.parseInt_2(jl.substring_I_Ljava_lang_String___devirtual$(command, index_0 + 1));
      if (this.mMol.isSelectedAtom_0(atom)) {
        for (i = 0; i < this.mMol.getAtoms_0(); i++) {
          if (this.mMol.isSelectedAtom_0(i)) {
            this.mMol.setAtomColor_0(i, color_0);
          }
        }
      } else {
        this.mMol.setAtomColor_0(atom, color_0);
      }
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Show Atom & Bond Numbers")) {
      this.setDisplayMode(2 | 4);
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Show Symmetry")) {
      this.setDisplayMode(256);
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(command, "Show Normal")) {
      this.setDisplayMode(this.mCurrentTool == 19 ? 16 : 0);
    }
  };
  _.eventHappened_0 = function eventHappened_6(e) {
    if (instanceOf(e, 80))
      this.eventHappened_1(castTo(e, 80));
    else if (instanceOf(e, 175))
      this.eventHappened_2(castTo(e, 175));
    else if (instanceOf(e, 134))
      this.eventHappened_3(castTo(e, 134));
  };
  _.eventHappened_2 = function eventHappened_7(e) {
    var atom1, atom2, bondChanged, ch_0, chainAtoms, hydrogenCount, i, isFirst, list, newRadical;
    if (this.mMouseIsDown)
      return;
    if (e.getWhat() == 1) {
      if (e.getKey() == -3) {
        this.mShiftIsDown = true;
        this.updateCursor();
      }
      if (e.getKey() == -2) {
        this.mAltIsDown = true;
        this.updateCursor();
      }
      if (e.getKey() == -1) {
        this.updateCursor();
      }
      if (e.isMenuShortcut()) {
        if (e.getKey() == 122) {
          this.restoreState();
          this.updateAndFireEvent(2);
        } else if (e.getKey() == 99) {
          this.copy();
        } else if (e.getKey() == 118) {
          this.paste();
        }
      } else if (e.getKey() == -4) {
        if (this.mCurrentTool != 19) {
          this.storeState();
          if (!this.deleteHilited()) {
            if (this.mMol.deleteSelectedAtoms_0()) {
              this.updateAndFireEvent(1);
            }
          }
        }
      } else if (e.getKey() == -6 || this.mCurrentHiliteAtom == -1 && e.getKey() == 63) {
        this.showHelpDialog_0();
        return;
      } else if (e.getKey() == -8) {
        if (this.mAtomKeyStrokeBuffer.length_1() != 0) {
          this.expandAtomKeyStrokes(this.mAtomKeyStrokeBuffer.toString_0());
          this.mAtomKeyStrokeBuffer.setLength(0);
        }
      } else if (this.mCurrentHiliteBond != -1) {
        ch_0 = e.getKey();
        if (ch_0 == 113 && this.mMol.isFragment_0()) {
          this.showBondQFDialog(this.mCurrentHiliteBond);
        } else if (ch_0 == 118) {
          if (this.mMol.addRingToBond_0(this.mCurrentHiliteBond, 3, false, this.getScaledAVBL()))
            this.updateAndFireEvent(3);
        } else if (ch_0 >= 52 && ch_0 <= 55) {
          if (this.mMol.addRingToBond_0(this.mCurrentHiliteBond, ch_0 - 48, false, this.getScaledAVBL()))
            this.updateAndFireEvent(3);
        } else if (ch_0 == 97 || ch_0 == 98) {
          if (this.mMol.addRingToBond_0(this.mCurrentHiliteBond, 6, true, this.getScaledAVBL()))
            this.updateAndFireEvent(3);
        } else {
          bondChanged = ch_0 == 48 ? this.changeHighlightedBond(16) : ch_0 == 49 ? this.changeHighlightedBond(1) : ch_0 == 50 ? this.changeHighlightedBond(2) : ch_0 == 51 ? this.changeHighlightedBond(4) : ch_0 == 117 ? this.changeHighlightedBond(257) : ch_0 == 100 ? this.changeHighlightedBond(129) : ch_0 == 99 ? this.changeHighlightedBond(386) : ch_0 == 109 ? this.changeHighlightedBond(16) : false;
          if (bondChanged)
            this.updateAndFireEvent(1);
        }
      } else if (this.mCurrentHiliteAtom != -1) {
        ch_0 = e.getKey();
        isFirst = this.mAtomKeyStrokeBuffer.length_1() == 0;
        if (isFirst)
          this.mFirstAtomKey = ch_0;
        else {
          if (this.mFirstAtomKey == 108) {
            this.mAtomKeyStrokeBuffer.setLength(0);
            this.mAtomKeyStrokeBuffer.append_4(76);
          }
          this.mFirstAtomKey = -1;
        }
        if (isFirst && ch_0 == 108) {
          this.mAtomKeyStrokeBuffer.append_9("Cl");
          this.update(1);
        } else if (isFirst && (ch_0 == 43 || ch_0 == 45)) {
          this.storeState();
          if (this.mMol.changeAtomCharge_1(this.mCurrentHiliteAtom, ch_0 == 43))
            this.updateAndFireEvent(3);
        } else if (isFirst && ch_0 == 46) {
          this.storeState();
          newRadical = this.mMol.getAtomRadical_0(this.mCurrentHiliteAtom) == 32 ? 0 : 32;
          this.mMol.setAtomRadical_0(this.mCurrentHiliteAtom, newRadical);
          this.updateAndFireEvent(3);
        } else if (isFirst && ch_0 == 58) {
          this.storeState();
          newRadical = this.mMol.getAtomRadical_0(this.mCurrentHiliteAtom) == 48 ? 16 : this.mMol.getAtomRadical_0(this.mCurrentHiliteAtom) == 16 ? 0 : 48;
          this.mMol.setAtomRadical_0(this.mCurrentHiliteAtom, newRadical);
          this.updateAndFireEvent(3);
        } else if (isFirst && ch_0 == 113 && this.mMol.isFragment_0()) {
          this.showAtomQFDialog(this.mCurrentHiliteAtom);
        } else if (isFirst && this.mMol.isFragment_0() && (ch_0 == 120 || ch_0 == 88)) {
          list = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [9, 17, 35, 53]);
          this.mMol.setAtomList_0(this.mCurrentHiliteAtom, list);
          this.updateAndFireEvent(3);
        } else if (isFirst && ch_0 == 63) {
          this.storeState();
          if (this.mMol.changeAtom_0(this.mCurrentHiliteAtom, 0, 0, -1, 0)) {
            this.updateAndFireEvent(3);
          }
        } else if (isFirst && ch_0 > 48 && ch_0 <= 57) {
          if (this.mMol.getFreeValence_0(this.mCurrentHiliteAtom) > 0) {
            this.storeState();
            chainAtoms = ch_0 - 47;
            atom1 = this.mCurrentHiliteAtom;
            hydrogenCount = this.mMol.getAllAtoms_0() - this.mMol.getAtoms_0();
            for (i = 1; i < chainAtoms; i++) {
              this.suggestNewX2AndY2(atom1);
              atom2 = this.mMol.addAtom_0(this.mX2, this.mY2);
              if (atom2 == -1) {
                break;
              }
              this.mMol.addBond_0(atom1, atom2);
              atom1 = atom2 - hydrogenCount;
              this.mMol.ensureHelperArrays_0(1);
            }
            this.updateAndFireEvent(3);
          }
        } else if (!isFirst && e.getKey() == -7) {
          this.mAtomKeyStrokeBuffer.setLength(0);
          this.update(1);
        } else if (!isFirst && e.getKey() == -5) {
          this.mAtomKeyStrokeBuffer.setLength(this.mAtomKeyStrokeBuffer.length_1() - 1);
          this.update(1);
        } else if (ch_0 >= 65 && ch_0 <= 90 || ch_0 >= 97 && ch_0 <= 122 || ch_0 >= 48 && ch_0 <= 57 || ch_0 == 45) {
          this.mAtomKeyStrokeBuffer.append_4(narrow_char(ch_0));
          this.update(1);
        } else if (ch_0 == 10 || ch_0 == 13) {
          this.expandAtomKeyStrokes(this.mAtomKeyStrokeBuffer.toString_0());
        }
      } else {
        if ((this.mMode & (4 | 2 | 1)) == 0) {
          ch_0 = e.getKey();
          if (ch_0 == 104)
            this.flip_0(true);
          if (ch_0 == 118)
            this.flip_0(false);
        }
      }
    }
    if (e.getWhat() == 2) {
      if (e.getKey() == -3) {
        this.mShiftIsDown = false;
        this.updateCursor();
      }
      if (e.getKey() == -2) {
        this.mAltIsDown = false;
        this.updateCursor();
      }
      if (e.getKey() == -1) {
        this.updateCursor();
      }
    }
  };
  _.eventHappened_3 = function eventHappened_8(e) {
    var angleChange, atom, drawingObject, drawingObject$iterator, i, i0, i1, isSelected, magnification, object, repaintNeeded, selectedAtomsFound, selectedObjectsFound, selectedOnly, selectedShape, x_0, y_0;
    if (e.getWhat() == 1) {
      if (this.mCurrentHiliteAtom != -1 && this.mAtomKeyStrokeBuffer.length_1() != 0)
        this.expandAtomKeyStrokes(this.mAtomKeyStrokeBuffer.toString_0());
      this.mAtomKeyStrokeBuffer.setLength(0);
      if (e.isPopupTrigger()) {
        this.handlePopupTrigger(e.getX_1(), e.getY_1());
        return;
      }
      if (e.getButton() == 1) {
        if (e.getClickCount() == 2) {
          return;
        }
        this.mMouseIsDown = true;
        this.updateCursor();
        this.mousePressedButton1(e);
      }
    }
    if (e.getWhat() == 2) {
      if (e.isPopupTrigger()) {
        this.handlePopupTrigger(e.getX_1(), e.getY_1());
        return;
      }
      if (e.getButton() == 1) {
        this.mMouseIsDown = false;
        this.updateCursor();
        this.mouseReleasedButton1();
      }
    }
    if (e.getWhat() == 3) {
      if (e.getButton() == 1) {
        if (e.getClickCount() == 2) {
          this.handleDoubleClick(e.getX_1(), e.getY_1());
          return;
        }
      }
    }
    if (e.getWhat() == 4) {
      this.mUIHelper.grabFocus_0();
      this.updateCursor();
    }
    if (e.getWhat() == 6) {
      this.mMouseIsDown = false;
      x_0 = e.getX_1();
      y_0 = e.getY_1();
      if (this.trackHiliting(x_0, y_0, false)) {
        this.mCanvas.repaint_0();
      }
      this.updateCursor();
    }
    if (e.getWhat() == 7) {
      this.mMouseIsDown = true;
      this.mX2 = e.getX_1();
      this.mY2 = e.getY_1();
      repaintNeeded = this.trackHiliting(this.mX2, this.mY2, true);
      switch (this.mPendingRequest) {
        case 2:
          if (this.suggestNewChain())
            repaintNeeded = true;
          break;
        case 1:
          if ((this.mX2 - this.mX1) * (this.mX2 - this.mX1) + (this.mY2 - this.mY1) * (this.mY2 - this.mY1) < 100) {
            this.suggestNewX2AndY2(this.mAtom1);
          }
          repaintNeeded = true;
          break;
        case 3:
          this.mMol.setAtomX_0(this.mAtom1, this.mX[this.mAtom1] + this.mX2 - this.mX1);
          this.mMol.setAtomY_0(this.mAtom1, this.mY[this.mAtom1] + this.mY2 - this.mY1);
          if (this.mAtom2 != -1) {
            this.mMol.setAtomX_0(this.mAtom2, this.mX[this.mAtom2] + this.mX2 - this.mX1);
            this.mMol.setAtomY_0(this.mAtom2, this.mY[this.mAtom2] + this.mY2 - this.mY1);
          }
          this.update(2);
          break;
        case 9:
          this.duplicateSelected();
          this.mPendingRequest = 4;
        case 4:
          if (isNotNull(this.mDrawingObjectList)) {
            for (drawingObject$iterator = this.mDrawingObjectList.iterator(); drawingObject$iterator.hasNext_0(); ) {
              drawingObject = castTo(drawingObject$iterator.next_3(), 38);
              if (drawingObject.isSelected_0()) {
                drawingObject.translate(this.mX2, this.mY2);
              }
            }
          }
          for (i0 = 0; i0 < this.mMol.getAllAtoms_0(); i0++) {
            if (this.mMol.isSelectedAtom_0(i0)) {
              this.mMol.setAtomX_0(i0, this.mX[i0] + this.mX2 - this.mX1);
              this.mMol.setAtomY_0(i0, this.mY[i0] + this.mY2 - this.mY1);
            }
          }
          this.update(2);
          break;
        case 11:
          this.mDrawingObjectList.add(this.mCurrentHiliteObject.clone_0());
          this.mPendingRequest = 10;
        case 10:
          this.mCurrentHiliteObject.translate(this.mX2, this.mY2);
          this.update(2);
          break;
        case 7:
          selectedAtomsFound = false;
          for (atom = 0; atom < this.mMol.getAllAtoms_0() && !selectedAtomsFound; atom++) {
            selectedAtomsFound = this.mMol.isSelectedAtom_0(atom);
          }
          selectedObjectsFound = false;
          if (isNotNull(this.mDrawingObjectList)) {
            for (i1 = 0; i1 < this.mDrawingObjectList.size() && !selectedObjectsFound; i1++) {
              selectedObjectsFound = castTo(this.mDrawingObjectList.getAtIndex(i1), 38).isSelected_0();
            }
          }
          magnification = $wnd.Math.abs(this.mY2 - this.mY1) < 20 ? 1 : $wnd.Math.exp((this.mY2 - this.mY1) / 100);
          angleChange = $wnd.Math.abs(this.mX2 - this.mX1) < 20 ? 0 : (this.mX2 - this.mX1) / 50;
          selectedOnly = selectedAtomsFound || selectedObjectsFound;
          if (isNotNull(this.mDrawingObjectList) && (!selectedOnly || selectedObjectsFound)) {
            for (i1 = 0; i1 < this.mDrawingObjectList.size(); i1++) {
              if (!selectedOnly || castTo(this.mDrawingObjectList.getAtIndex(i1), 38).isSelected_0()) {
                castTo(this.mDrawingObjectList.getAtIndex(i1), 38).zoomAndRotate_0(magnification, angleChange);
              }
            }
            this.update(2);
          }
          if (!selectedOnly || selectedAtomsFound) {
            this.mMol.zoomAndRotate_1(magnification, angleChange, selectedOnly);
            this.update(2);
          }
          break;
        case 5:
        case 6:
          selectedShape = null;
          if (this.mPendingRequest == 5) {
            if ($wnd.Math.abs(this.mX2 - this.mLassoRegion.getX_0(this.mLassoRegion.getSize_0() - 1)) < 3 && $wnd.Math.abs(this.mY2 - this.mLassoRegion.getY_0(this.mLassoRegion.getSize_0() - 1)) < 3)
              break;
            this.mLassoRegion.removeLastPoint();
            this.mLassoRegion.addPoint(this.mX2, this.mY2);
            this.mLassoRegion.addPoint(this.mX1, this.mY1);
            selectedShape = this.mLassoRegion;
          } else {
            selectedShape = new cargg.GenericRectangle_0($wnd.Math.min(this.mX1, this.mX2), $wnd.Math.min(this.mY1, this.mY2), $wnd.Math.abs(this.mX2 - this.mX1), $wnd.Math.abs(this.mY2 - this.mY1));
          }
          if (isNotNull(this.mDrawingObjectList)) {
            for (i1 = 0; i1 < this.mDrawingObjectList.size(); i1++) {
              object = castTo(this.mDrawingObjectList.getAtIndex(i1), 38);
              isSelected = object.isSurroundedBy(selectedShape);
              if ((!this.mIsAddingToSelection || !this.mIsSelectedObject[i1]) && isSelected != object.isSelected_0()) {
                object.setSelected_0(isSelected);
                this.mUpdateMode = $wnd.Math.max(this.mUpdateMode, 1);
              }
            }
          }
          for (i = 0; i < this.mMol.getAllAtoms_0(); i++) {
            isSelected = selectedShape.contains_0(round_int(this.mMol.getAtomX_0(i)), round_int(this.mMol.getAtomY_0(i)));
            if ((!this.mIsAddingToSelection || !this.mIsSelectedAtom[i]) && isSelected != this.mMol.isSelectedAtom_0(i)) {
              this.mMol.setAtomSelection_0(i, isSelected);
              this.mUpdateMode = $wnd.Math.max(this.mUpdateMode, 1);
            }
          }
          repaintNeeded = true;
          break;
        case 8:
          repaintNeeded = true;
          break;
      }
      if (repaintNeeded) {
        this.mCanvas.repaint_0();
      }
    }
  };
  _.expandAtomKeyStrokes = function expandAtomKeyStrokes(keyStrokes) {
    var atom, atomicNo, dx, dy, firstAtomInFragment, firstAtomInMol, fragment, i, sourceAVBL, substituent, substituentAtoms;
    this.mAtomKeyStrokeBuffer.setLength(0);
    atomicNo = carc2.getAtomicNoFromLabel_0(keyStrokes, this.mAllowedPseudoAtoms);
    if (atomicNo != 0) {
      this.storeState();
      if (this.mMol.changeAtom_0(this.mCurrentHiliteAtom, atomicNo, 0, -1, 0)) {
        this.updateAndFireEvent(3);
        return;
      } else {
        this.update(0);
      }
    }
    if (jsNotEquals(this.mAtomKeyStrokeSuggestion, null) && !jl.isEmpty__Z__devirtual$(this.mAtomKeyStrokeSuggestion))
      keyStrokes = this.mAtomKeyStrokeSuggestion;
    substituent = carc2.getSubstituent_0(keyStrokes);
    if (isNotNull(substituent)) {
      this.storeState();
      fragment = new carc2.StereoMolecule();
      fragment.addFragment_0(this.mMol, this.mCurrentHiliteAtom, null);
      sourceAVBL = fragment.getAverageBondLength_1(this.mUIScaling * 24);
      firstAtomInFragment = fragment.getAllAtoms_0();
      for (atom = 0; atom < fragment.getAllAtoms_0(); atom++)
        fragment.setAtomMarker_0(atom, true);
      fragment.addSubstituent_0(substituent, 0);
      new carcc3.CoordinateInventor_0(4).invent(fragment);
      dx = this.mMol.getAtomX_0(this.mCurrentHiliteAtom) - sourceAVBL * fragment.getAtomX_0(0);
      dy = this.mMol.getAtomY_0(this.mCurrentHiliteAtom) - sourceAVBL * fragment.getAtomY_0(0);
      firstAtomInMol = this.mMol.getAllAtoms_0();
      this.mMol.addSubstituent_0(substituent, this.mCurrentHiliteAtom);
      substituentAtoms = this.mMol.getAllAtoms_0() - firstAtomInMol;
      for (i = 0; i < substituentAtoms; i++) {
        this.mMol.setAtomX_0(firstAtomInMol + i, sourceAVBL * fragment.getAtomX_0(firstAtomInFragment + i) + dx);
        this.mMol.setAtomY_0(firstAtomInMol + i, sourceAVBL * fragment.getAtomY_0(firstAtomInFragment + i) + dy);
      }
      this.mMol.setStereoBondsFromParity_0();
      this.updateAndFireEvent(3);
    }
  };
  _.findDrawingObject = function findDrawingObject(x_0, y_0, type_0, forDeletion) {
    var drawingObject, drawingObject$iterator;
    if (isNotNull(this.mDrawingObjectList)) {
      for (drawingObject$iterator = this.mDrawingObjectList.iterator(); drawingObject$iterator.hasNext_0(); ) {
        drawingObject = castTo(drawingObject$iterator.next_3(), 38);
        if ((jsEquals(type_0, null) || jl.equals_Ljava_lang_Object__Z__devirtual$_2(type_0, drawingObject.getTypeString()) && !forDeletion || drawingObject.isDeletable()) && drawingObject.contains_0(x_0, y_0)) {
          return drawingObject;
        }
      }
    }
    return null;
  };
  _.findFragment = function findFragment(x_0, y_0) {
    var atom, distance, dx, dy, fragment, minDistance;
    fragment = -1;
    minDistance = 17976931348623157e292;
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      dx = this.mX1 - this.mMol.getAtomX_0(atom);
      dy = this.mY1 - this.mMol.getAtomY_0(atom);
      distance = $wnd.Math.sqrt(dx * dx + dy * dy);
      if (distance < 24 && minDistance > distance) {
        minDistance = distance;
        fragment = this.mFragmentNo[atom];
      }
    }
    return fragment;
  };
  _.fireEventLater = function fireEventLater(e) {
    var what;
    what = e.getWhat();
    if ((what & this.mEventsScheduled) == 0) {
      this.mUIHelper.runLater_0(new carge.GenericEditorArea$lambda$0$Type(this, what, e));
      this.mEventsScheduled |= what;
    }
  };
  _.flip_0 = function flip_1(horiz) {
    var atom, atom0, bond, cog, selectedOnly;
    selectedOnly = false;
    for (atom0 = 0; atom0 < this.mMol.getAllAtoms_0(); atom0++) {
      if (this.mMol.isSelectedAtom_0(atom0)) {
        selectedOnly = true;
        break;
      }
    }
    cog = this.calculateCenterOfGravity(selectedOnly);
    if (isNotNull(cog)) {
      this.storeState();
      for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
        if (!selectedOnly || this.mMol.isSelectedAtom_0(atom)) {
          if (horiz) {
            this.mMol.setAtomX_0(atom, 2 * cog.getX_2() - this.mMol.getAtomX_0(atom));
          } else {
            this.mMol.setAtomY_0(atom, 2 * cog.getY_2() - this.mMol.getAtomY_0(atom));
          }
        }
      }
      for (bond = 0; bond < this.mMol.getAllBonds_0(); bond++) {
        if (!selectedOnly || this.mMol.isSelectedBond_0(bond)) {
          if (this.mMol.getBondType_0(bond) == 257)
            this.mMol.setBondType_0(bond, 129);
          else if (this.mMol.getBondType_0(bond) == 129)
            this.mMol.setBondType_0(bond, 257);
        }
      }
      this.update(1);
    }
  };
  _.getAllowedPseudoAtoms = function getAllowedPseudoAtoms() {
    return this.mAllowedPseudoAtoms;
  };
  _.getAtomKeyStrokeValidity = function getAtomKeyStrokeValidity(s) {
    if (carc2.getAtomicNoFromLabel_0(s, this.mAllowedPseudoAtoms) != 0)
      return 1;
    this.mAtomKeyStrokeSuggestion = carc2.identify(s);
    if (jsEquals(this.mAtomKeyStrokeSuggestion, null))
      return this.isValidAtomKeyStrokeStart(s) ? 3 : 4;
    if (jl.isEmpty__Z__devirtual$(this.mAtomKeyStrokeSuggestion))
      return 3;
    else
      return 2;
  };
  _.getDrawingObjects = function getDrawingObjects_0() {
    return this.mDrawingObjectList;
  };
  _.getESRAtom = function getESRAtom(stereoBond) {
    var atom, connAtom, i;
    atom = this.mMol.getBondAtom_0(0, stereoBond);
    if (this.mMol.getAtomParity_0(atom) != 0) {
      return this.mMol.isAtomParityPseudo_0(atom) || this.mMol.getAtomParity_0(atom) != 1 && this.mMol.getAtomParity_0(atom) != 2 ? -1 : atom;
    }
    if (this.mMol.getAtomPi_0(atom) == 1) {
      for (i = 0; i < this.mMol.getConnAtoms_0(atom); i++) {
        if (this.mMol.getConnBondOrder_0(atom, i) == 2) {
          connAtom = this.mMol.getConnAtom_0(atom, i);
          if (this.mMol.getAtomPi_0(connAtom) == 2 && (this.mMol.getAtomParity_0(connAtom) == 1 || this.mMol.getAtomParity_0(connAtom) == 2)) {
            return connAtom;
          }
        }
      }
    }
    return -1;
  };
  _.getESRBond = function getESRBond(stereoBond) {
    var bond;
    bond = this.mMol.findBINAPChiralityBond_0(this.mMol.getBondAtom_0(0, stereoBond));
    if (bond != -1 && this.mMol.getBondParity_0(bond) != 1 && this.mMol.getBondParity_0(bond) != 2) {
      bond = -1;
    }
    return bond;
  };
  _.getFragments_0 = function getFragments_1() {
    return this.mFragment;
  };
  _.getMode_0 = function getMode() {
    return this.mMode;
  };
  _.getMolecule_0 = function getMolecule_6() {
    return this.mMol;
  };
  _.getReaction_0 = function getReaction_2() {
    var i, rxn;
    if ((this.mMode & 4) == 0 || jsEquals(this.mFragment, null)) {
      return null;
    }
    rxn = new carcr.Reaction();
    for (i = 0; i < this.mFragment.length; i++) {
      if (i < this.mReactantCount) {
        rxn.addReactant_0(this.mFragment[i]);
      } else {
        rxn.addProduct_0(this.mFragment[i]);
      }
    }
    return rxn;
  };
  _.getScaledAVBL = function getScaledAVBL() {
    return this.mMol.getAverageBondLength_1(24 * this.mUIScaling);
  };
  _.getSelectedCopy = function getSelectedCopy(sourceMol) {
    var atom, atom0, atomCount, bond, bondCount, destMol, includeAtom;
    atomCount = 0;
    for (atom0 = 0; atom0 < sourceMol.getAllAtoms_0(); atom0++) {
      if (sourceMol.isSelectedAtom_0(atom0)) {
        atomCount++;
      }
    }
    if (atomCount == 0) {
      return null;
    }
    bondCount = 0;
    for (bond = 0; bond < sourceMol.getAllBonds_0(); bond++) {
      if (sourceMol.isSelectedBond_0(bond)) {
        bondCount++;
      }
    }
    includeAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, sourceMol.getAllAtoms_0(), 16, 1);
    for (atom = 0; atom < sourceMol.getAllAtoms_0(); atom++) {
      includeAtom[atom] = sourceMol.isSelectedAtom_0(atom);
    }
    destMol = new carc2.StereoMolecule_0(atomCount, bondCount);
    sourceMol.copyMoleculeByAtoms_0(destMol, includeAtom, false, null);
    return destMol;
  };
  _.getSelectedReaction = function getSelectedReaction() {
    var i, rxn, selectedMol;
    rxn = new carcr.Reaction();
    for (i = 0; i < this.mFragment.length; i++) {
      selectedMol = this.getSelectedCopy(this.mFragment[i]);
      if (isNotNull(selectedMol)) {
        if (i < this.mReactantCount) {
          rxn.addReactant_0(selectedMol);
        } else {
          rxn.addProduct_0(selectedMol);
        }
      }
    }
    return rxn;
  };
  _.getUIHelper = function getUIHelper() {
    return this.mUIHelper;
  };
  _.handleDoubleClick = function handleDoubleClick(x_0, y_0) {
    var ado, ado$iterator, atom, bond, centerX, drawingObject, drawingObject$iterator, fragment, fragmentMember, i, i0, i1, maxX, minX, rootAtom;
    atom = this.mMol.findAtom_0(x_0, y_0);
    bond = this.mMol.findBond_0(x_0, y_0);
    if (this.mCurrentTool == 2) {
      if (this.mMol.isFragment_0()) {
        if (atom != -1) {
          this.showAtomQFDialog(atom);
        } else if (bond != -1) {
          this.showBondQFDialog(bond);
        } else if (isNotNull(this.mCurrentHiliteObject)) {
          if (!this.mShiftIsDown) {
            for (i = 0; i < this.mMol.getAllAtoms_0(); i++)
              this.mMol.setAtomSelection_0(i, false);
            for (ado$iterator = this.mDrawingObjectList.iterator(); ado$iterator.hasNext_0(); ) {
              ado = castTo(ado$iterator.next_3(), 38);
              ado.setSelected_0(false);
            }
          }
          this.mCurrentHiliteObject.setSelected_0(true);
          this.update(1);
        }
      } else {
        rootAtom = -1;
        if (atom != -1) {
          rootAtom = atom;
        } else if (bond != -1) {
          rootAtom = this.mMol.getBondAtom_0(0, bond);
        }
        if (rootAtom != -1 || isNotNull(this.mCurrentHiliteObject)) {
          if (!this.mShiftIsDown) {
            for (i = 0; i < this.mMol.getAllAtoms_0(); i++) {
              this.mMol.setAtomSelection_0(i, false);
            }
            if (isNotNull(this.mDrawingObjectList)) {
              for (drawingObject$iterator = this.mDrawingObjectList.iterator(); drawingObject$iterator.hasNext_0(); ) {
                drawingObject = castTo(drawingObject$iterator.next_3(), 38);
                drawingObject.setSelected_0(false);
              }
            }
          }
          if (rootAtom != -1) {
            if ((this.mMode & 1) != 0) {
              fragment = this.mFragmentNo[rootAtom];
              for (i = 0; i < this.mMol.getAllAtoms_0(); i++) {
                if (this.mFragmentNo[i] == fragment) {
                  this.mMol.setAtomSelection_0(i, true);
                }
              }
            } else {
              fragmentMember = this.mMol.getFragmentAtoms_0(rootAtom);
              for (i = 0; i < fragmentMember.length; i++) {
                this.mMol.setAtomSelection_0(fragmentMember[i], true);
              }
            }
          } else {
            this.mCurrentHiliteObject.setSelected_0(true);
          }
          this.update(1);
        }
      }
    } else if (this.mCurrentTool == 18) {
      fragment = -2;
      if ((this.mMode & 1) != 0) {
        fragment = this.findFragment(x_0, y_0);
      }
      if (fragment != -1) {
        minX = 2147483647;
        maxX = -2147483648;
        for (i0 = 0; i0 < this.mMol.getAllAtoms_0(); i0++) {
          if (fragment == -2 || this.mFragmentNo[i0] == fragment) {
            if (minX > this.mMol.getAtomX_0(i0)) {
              minX = this.mMol.getAtomX_0(i0);
            }
            if (maxX < this.mMol.getAtomX_0(i0)) {
              maxX = this.mMol.getAtomX_0(i0);
            }
          }
        }
        if (maxX > minX) {
          centerX = (maxX + minX) / 2;
          for (i1 = 0; i1 < this.mMol.getAllAtoms_0(); i1++) {
            if (fragment == -2 || this.mFragmentNo[i1] == fragment) {
              this.mMol.setAtomX_0(i1, 2 * centerX - this.mMol.getAtomX_0(i1));
            }
          }
          for (i = 0; i < this.mMol.getAllBonds_0(); i++) {
            if (fragment == -2 || this.mFragmentNo[this.mMol.getBondAtom_0(0, i)] == fragment) {
              switch (this.mMol.getBondType_0(i)) {
                case 257:
                  this.mMol.setBondType_0(i, 129);
                  break;
                case 129:
                  this.mMol.setBondType_0(i, 257);
                  break;
              }
            }
          }
        }
        this.updateAndFireEvent(1);
      }
    } else if (this.mCurrentTool == 33) {
      this.mUIHelper.showMessage_0("To change current custom atom properties hold 'Ctrl'\nwhile clicking an atom with the left mouse button.");
    }
  };
  _.handlePopupTrigger = function handlePopupTrigger(x_0, y_0) {
    var atomColor, isSubMenu, item1, item3, popup, template, template$array, template$index, template$max;
    popup = null;
    if (isNotNull(this.mClipboardHandler)) {
      popup = this.mUIHelper.createPopupMenu_0(this);
      item1 = this.analyseCopy(false) ? "Copy Reaction" : "Copy Structure";
      popup.addItem_1(item1, null, this.mMol.getAllAtoms_0() != 0);
      item3 = isNull(carcn.getInstance_0()) ? "Paste Structure" : "Paste Structure or Name";
      popup.addItem_1(item3, null, true);
      if ((this.mMode & 4) != 0) {
        popup.addItem_1("Paste Reaction", null, true);
        popup.addSeparator();
        if (jsNotEquals(carge.sReactionQueryTemplates, null) && this.mMol.isFragment_0()) {
          isSubMenu = false;
          for (template$array = carge.sReactionQueryTemplates, template$index = 0, template$max = template$array.length; template$index < template$max; ++template$index) {
            template = template$array[template$index];
            if (jl.equals_Ljava_lang_Object__Z__devirtual$_2("SECTION", template[0])) {
              if (isSubMenu)
                popup.endSubMenu();
              popup.startSubMenu("Use " + template[1] + " Template");
              isSubMenu = true;
              continue;
            }
            if (!isSubMenu) {
              popup.startSubMenu("Use Template");
              isSubMenu = true;
            }
            popup.addItem_1(template[0], "Use Reaction Template..." + template[1], true);
          }
          popup.endSubMenu();
        }
      }
      if ((this.mMode & 4) != 0)
        popup.addItem_1("Open Reaction File...", null, true);
    }
    if ((this.mMode & 4) != 0 && this.mCurrentTool == 19) {
      if (isNull(popup))
        popup = this.mUIHelper.createPopupMenu_0(this);
      else
        popup.addSeparator();
      popup.addItem_1("Auto-Map Reaction", null, true);
      popup.addItem_1("Remove Entire Atom Mapping", null, true);
      popup.addItem_1("Remove Explicit Mapping (red)", null, true);
      popup.addItem_1("Remove Auto-Mapping (green)", null, true);
      popup.addItem_1("Make Auto-Mapping Explicit", null, true);
      popup.addRadioButtonItem("Automatically Complete Mapping", null, 0, carge.sKeepAutoMapped);
    }
    if (this.mCurrentTool == 18) {
      if (isNull(popup))
        popup = this.mUIHelper.createPopupMenu_0(this);
      else
        popup.addSeparator();
      popup.addItem_1("Flip Horizontally", null, true);
      popup.addItem_1("Flip Vertically", null, true);
      popup.addItem_1("Rotate 180\xB0", null, true);
    }
    if (this.mAtomColorSupported && this.mCurrentHiliteAtom != -1) {
      atomColor = this.mMol.getAtomColor_0(this.mCurrentHiliteAtom);
      if (isNull(popup))
        popup = this.mUIHelper.createPopupMenu_0(this);
      else
        popup.addSeparator();
      popup.startSubMenu("Set Atom Color");
      popup.addRadioButtonItem("	  ", "atomColor" + this.mCurrentHiliteAtom + ":0", -16777216, atomColor == 0);
      popup.addRadioButtonItem("	  ", "atomColor" + this.mCurrentHiliteAtom + ":64", -14655233, atomColor == 64);
      popup.addRadioButtonItem("	  ", "atomColor" + this.mCurrentHiliteAtom + ":448", -6291456, atomColor == 448);
      popup.addRadioButtonItem("	  ", "atomColor" + this.mCurrentHiliteAtom + ":128", -65536, atomColor == 128);
      popup.addRadioButtonItem("	  ", "atomColor" + this.mCurrentHiliteAtom + ":384", -16744448, atomColor == 384);
      popup.addRadioButtonItem("	  ", "atomColor" + this.mCurrentHiliteAtom + ":192", -16711936, atomColor == 192);
      popup.addRadioButtonItem("	  ", "atomColor" + this.mCurrentHiliteAtom + ":256", -4194049, atomColor == 256);
      popup.addRadioButtonItem("	  ", "atomColor" + this.mCurrentHiliteAtom + ":320", -24576, atomColor == 320);
      popup.endSubMenu();
    }
    if (isNull(popup))
      popup = this.mUIHelper.createPopupMenu_0(this);
    else
      popup.addSeparator();
    popup.addItem_1("Help Me", null, true);
    if (false) {
    }
    if (isNotNull(popup))
      popup.show(x_0, y_0);
  };
  _.hiliteAtom = function hiliteAtom(context, atom) {
    var radius, x_0, y_0;
    radius = round_int(0.3199999928474426 * this.mMol.getAverageBondLength_0());
    x_0 = round_int(this.mMol.getAtomX_0(atom));
    y_0 = round_int(this.mMol.getAtomY_0(atom));
    context.fillCircle_0(x_0 - radius, y_0 - radius, 2 * radius);
  };
  _.hiliteBond = function hiliteBond(context, bond) {
    var oldWidth, width_0, x1, x2, y1, y2;
    width_0 = round_int(0.3199999928474426 * this.mMol.getAverageBondLength_0());
    x1 = round_int(this.mMol.getAtomX_0(this.mMol.getBondAtom_0(0, bond)));
    y1 = round_int(this.mMol.getAtomY_0(this.mMol.getBondAtom_0(0, bond)));
    x2 = round_int(this.mMol.getAtomX_0(this.mMol.getBondAtom_0(1, bond)));
    y2 = round_int(this.mMol.getAtomY_0(this.mMol.getBondAtom_0(1, bond)));
    oldWidth = context.getLineWidth_0();
    context.setLineWidth_1(width_0);
    context.drawLine_1(x1, y1, x2, y2);
    context.setLineWidth_1(oldWidth);
  };
  _.isValidAtomKeyStrokeStart = function isValidAtomKeyStrokeStart(s) {
    var i;
    if (jl.length__I__devirtual$_0(s) < 3) {
      for (i = 1; i < (carc2.$clinit_Molecule(), carc2.cAtomLabel).length; i++)
        if (jl.startsWith_Ljava_lang_String__Z__devirtual$((carc2.$clinit_Molecule(), carc2.cAtomLabel)[i], s))
          return true;
    }
    return false;
  };
  _.joinCloseFragments = function joinCloseFragments(fragmentNo, fragments) {
    var atom, atom1, atom2, avbl, distance, dx, dy, fragment, fragment1, fragment2, i, i0, index1, index2, j, k, maxIndex, mergeCount, mergeFragments, minIndex, newFragmentIndex;
    if (fragments < 2) {
      return fragments;
    }
    mergeFragments = initUnidimensionalArray(cggl.Z_classLit, { 4: 1, 1: 1, 7: 1 }, 10, fragments, 0, 2);
    for (i0 = 1; i0 < fragments; i0++) {
      mergeFragments[i0] = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, i0, 16, 1);
    }
    avbl = this.getScaledAVBL();
    for (atom1 = 1; atom1 < this.mMol.getAllAtoms_0(); atom1++) {
      for (atom2 = 0; atom2 < atom1; atom2++) {
        dx = this.mMol.getAtomX_0(atom2) - this.mMol.getAtomX_0(atom1);
        dy = this.mMol.getAtomY_0(atom2) - this.mMol.getAtomY_0(atom1);
        distance = $wnd.Math.sqrt(dx * dx + dy * dy);
        if (distance < 1.7000000476837158 * avbl) {
          fragment1 = fragmentNo[atom1];
          fragment2 = fragmentNo[atom2];
          if (fragment1 != fragment2) {
            if (fragment1 > fragment2) {
              mergeFragments[fragment1][fragment2] = true;
            } else {
              mergeFragments[fragment2][fragment1] = true;
            }
          }
        }
      }
    }
    newFragmentIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, fragments, 15, 1);
    for (fragment = 0; fragment < fragments; fragment++) {
      newFragmentIndex[fragment] = fragment;
    }
    mergeCount = 0;
    for (i = 1; i < fragments; i++) {
      for (j = 0; j < i; j++) {
        if (mergeFragments[i][j]) {
          index1 = newFragmentIndex[i];
          index2 = newFragmentIndex[j];
          if (index1 != index2) {
            mergeCount++;
            minIndex = $wnd.Math.min(index1, index2);
            maxIndex = $wnd.Math.max(index1, index2);
            for (k = 0; k < fragments; k++) {
              if (newFragmentIndex[k] == maxIndex) {
                newFragmentIndex[k] = minIndex;
              } else if (newFragmentIndex[k] > maxIndex) {
                newFragmentIndex[k]--;
              }
            }
          }
        }
      }
    }
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      fragmentNo[atom] = newFragmentIndex[fragmentNo[atom]];
    }
    return fragments - mergeCount;
  };
  _.makeAutoMappingExplicit = function makeAutoMappingExplicit() {
    var atom, changed;
    changed = false;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mMol.getAtomMapNo_0(atom) != 0 && this.mMol.isAutoMappedAtom_0(atom)) {
        if (!changed) {
          this.storeState();
          changed = true;
        }
        this.mMol.setAtomMapNo_0(atom, this.mMol.getAtomMapNo_0(atom), false);
      }
    }
    if (changed) {
      this.updateAndFireEvent($wnd.Math.max(this.mUpdateMode, 1));
    }
  };
  _.moleculeChanged_0 = function moleculeChanged() {
    this.update(4);
    this.fireEventLater(new carge.EditorEvent(this, 1, false));
  };
  _.mousePressedButton1 = function mousePressedButton1(gme) {
    var atom, bond, bondClicked, bondType, drawingObject, drawingObject$iterator, i, i0, i1, object, theAtom, x_0, y_0;
    this.mX1 = gme.getX_1();
    this.mY1 = gme.getY_1();
    switch (this.mCurrentTool) {
      case 18:
        x_0 = this.mX1;
        y_0 = this.mY1;
        this.mAtom1 = this.mMol.findAtom_0(this.mX1, this.mY1);
        if (this.mAtom1 != -1) {
          this.mX1 = this.mMol.getAtomX_0(this.mAtom1);
          this.mY1 = this.mMol.getAtomY_0(this.mAtom1);
        }
        this.mMol.zoomAndRotateInit_0(x_0, y_0);
        if (isNotNull(this.mDrawingObjectList)) {
          for (drawingObject$iterator = this.mDrawingObjectList.iterator(); drawingObject$iterator.hasNext_0(); ) {
            drawingObject = castTo(drawingObject$iterator.next_3(), 38);
            drawingObject.zoomAndRotateInit_0(x_0, y_0);
          }
        }
        this.storeState();
        this.mPendingRequest = 7;
        break;
      case 2:
        this.mPendingRequest = 0;
        this.mAtom1 = this.mMol.findAtom_0(this.mX1, this.mY1);
        if (this.mAtom1 != -1) {
          this.mAtom2 = -1;
          this.mX1 = this.mMol.getAtomX_0(this.mAtom1);
          this.mY1 = this.mMol.getAtomY_0(this.mAtom1);
          if (this.mMol.isSelectedAtom_0(this.mAtom1)) {
            this.mPendingRequest = this.mShiftIsDown ? 9 : 4;
          } else {
            this.mPendingRequest = 3;
          }
        }
        if (this.mPendingRequest == 0) {
          bondClicked = this.mMol.findBond_0(this.mX1, this.mY1);
          if (bondClicked != -1) {
            this.mAtom1 = this.mMol.getBondAtom_0(0, bondClicked);
            this.mAtom2 = this.mMol.getBondAtom_0(1, bondClicked);
            if (this.mMol.isSelectedBond_0(bondClicked)) {
              this.mPendingRequest = this.mShiftIsDown ? 9 : 4;
            } else {
              this.mPendingRequest = 3;
            }
          }
        }
        if (this.mPendingRequest == 0) {
          if (isNotNull(this.mCurrentHiliteObject)) {
            if (this.mCurrentHiliteObject.isSelected_0()) {
              this.mPendingRequest = this.mShiftIsDown ? 9 : 4;
            } else {
              this.mPendingRequest = this.mShiftIsDown && !instanceOf(this.mCurrentHiliteObject, 42) ? 11 : 10;
            }
          }
        }
        if (this.mPendingRequest != 0) {
          this.mX = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
          this.mY = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
          for (i0 = 0; i0 < this.mMol.getAllAtoms_0(); i0++) {
            this.mX[i0] = this.mMol.getAtomX_0(i0);
            this.mY[i0] = this.mMol.getAtomY_0(i0);
          }
          if (isNotNull(this.mDrawingObjectList)) {
            for (drawingObject$iterator = this.mDrawingObjectList.iterator(); drawingObject$iterator.hasNext_0(); ) {
              drawingObject = castTo(drawingObject$iterator.next_3(), 38);
              drawingObject.translateInit(this.mX1, this.mY1);
            }
          }
          this.storeState();
          break;
        }
        this.mIsSelectedAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 16, 1);
        if (isNotNull(this.mDrawingObjectList)) {
          this.mIsSelectedObject = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mDrawingObjectList.size(), 16, 1);
        }
        this.mIsAddingToSelection = gme.isShiftDown();
        for (i1 = 0; i1 < this.mMol.getAllAtoms_0(); i1++) {
          this.mIsSelectedAtom[i1] = this.mMol.isSelectedAtom_0(i1);
        }
        if (isNotNull(this.mDrawingObjectList)) {
          for (i = 0; i < this.mDrawingObjectList.size(); i++) {
            this.mIsSelectedObject[i] = castTo(this.mDrawingObjectList.getAtIndex(i), 38).isSelected_0();
          }
        }
        if (gme.isAltDown()) {
          this.mPendingRequest = 6;
        } else {
          this.mLassoRegion = new cargg.GenericPolygon();
          this.mLassoRegion.addPoint(this.mX1, this.mY1);
          this.mLassoRegion.addPoint(this.mX1, this.mY1);
          this.mPendingRequest = 5;
        }
        break;
      case 4:
        this.storeState();
        this.deleteAt(this.mX1, this.mY1);
        break;
      case 3:
        theAtom = this.mMol.findAtom_0(this.mX1, this.mY1);
        if (theAtom != -1) {
          this.storeState();
          this.mMol.setAtomConfigurationUnknown_0(theAtom, !this.mMol.isAtomConfigurationUnknown_0(theAtom));
          this.updateAndFireEvent(1);
        }
        break;
      case 101:
      case 103:
      case 102:
        if (this.mCurrentHiliteBond != -1 && this.qualifiesForESR(this.mCurrentHiliteBond)) {
          this.storeState();
          this.setESRInfo(this.mCurrentHiliteBond, this.mCurrentTool == 101 ? 0 : this.mCurrentTool == 103 ? 1 : 2);
          this.updateAndFireEvent(1);
        }
        break;
      case 5:
      case 6:
      case 23:
        this.mAtom1 = this.mMol.findAtom_0(this.mX1, this.mY1);
        if (this.mAtom1 == -1) {
          bond = this.mMol.findBond_0(this.mX1, this.mY1);
          if (bond != -1) {
            this.storeState();
            bondType = 511;
            if (this.mCurrentTool == 6) {
              bondType = 257;
            } else if (this.mCurrentTool == 23) {
              bondType = 129;
            }
            if (this.mMol.changeBond_0(bond, bondType))
              this.updateAndFireEvent(1);
            break;
          }
        } else {
          if (this.mMol.getAllConnAtomsPlusMetalBonds_0(this.mAtom1) == 8) {
            return;
          }
          this.mX1 = this.mMol.getAtomX_0(this.mAtom1);
          this.mY1 = this.mMol.getAtomY_0(this.mAtom1);
        }
        this.mPendingRequest = 1;
        this.suggestNewX2AndY2(this.mAtom1);
        this.mCanvas.repaint_0();
        break;
      case 22:
        this.mAtom1 = this.mMol.findAtom_0(this.mX1, this.mY1);
        if (this.mAtom1 != -1) {
          if (this.mMol.getAllConnAtomsPlusMetalBonds_0(this.mAtom1) == 8) {
            return;
          }
          this.mX1 = this.mMol.getAtomX_0(this.mAtom1);
          this.mY1 = this.mMol.getAtomY_0(this.mAtom1);
        }
        this.mPendingRequest = 2;
        this.mChainAtoms = 0;
        break;
      case 7:
        this.storeState();
        if (this.mMol.addRing_0(this.mX1, this.mY1, 3, false, this.getScaledAVBL()))
          this.updateAndFireEvent(3);
        break;
      case 24:
        this.storeState();
        if (this.mMol.addRing_0(this.mX1, this.mY1, 4, false, this.getScaledAVBL()))
          this.updateAndFireEvent(3);
        break;
      case 8:
        this.storeState();
        if (this.mMol.addRing_0(this.mX1, this.mY1, 5, false, this.getScaledAVBL()))
          this.updateAndFireEvent(3);
        break;
      case 25:
        this.storeState();
        if (this.mMol.addRing_0(this.mX1, this.mY1, 6, false, this.getScaledAVBL()))
          this.updateAndFireEvent(3);
        break;
      case 9:
        this.storeState();
        if (this.mMol.addRing_0(this.mX1, this.mY1, 7, false, this.getScaledAVBL()))
          this.updateAndFireEvent(3);
        break;
      case 26:
        this.storeState();
        if (this.mMol.addRing_0(this.mX1, this.mY1, 6, true, this.getScaledAVBL()))
          this.updateAndFireEvent(3);
        break;
      case 10:
        this.storeState();
        if (this.mMol.changeAtomCharge_0(this.mX1, this.mY1, true))
          this.updateAndFireEvent(3);
        break;
      case 27:
        this.storeState();
        if (this.mMol.changeAtomCharge_0(this.mX1, this.mY1, false))
          this.updateAndFireEvent(3);
        break;
      case 16:
        this.changeAtomicNo(1);
        break;
      case 11:
        this.changeAtomicNo(6);
        break;
      case 12:
        this.changeAtomicNo(7);
        break;
      case 13:
        this.changeAtomicNo(8);
        break;
      case 28:
        this.changeAtomicNo(14);
        break;
      case 29:
        this.changeAtomicNo(15);
        break;
      case 30:
        this.changeAtomicNo(16);
        break;
      case 14:
        this.changeAtomicNo(9);
        break;
      case 31:
        this.changeAtomicNo(17);
        break;
      case 15:
        this.changeAtomicNo(35);
        break;
      case 32:
        this.changeAtomicNo(53);
        break;
      case 33:
        if (gme.isControlDown() || gme.isAltDown()) {
          atom = this.mMol.findAtom_0(this.mX1, this.mY1);
          if (atom != -1) {
            this.showCustomAtomDialog(atom);
          }
        } else {
          this.storeState();
          if (this.mMol.addOrChangeAtom_0(this.mX1, this.mY1, this.mCustomAtomicNo, this.mCustomAtomMass, this.mCustomAtomValence, this.mCustomAtomRadical, this.mCustomAtomLabel)) {
            this.mCurrentHiliteAtom = -1;
            this.updateAndFireEvent(3);
          }
        }
        break;
      case 19:
        this.mAtom1 = this.mMol.findAtom_0(this.mX1, this.mY1);
        if (this.mAtom1 != -1 && this.mAtom1 < this.mMol.getAtoms_0() && (!this.mMol.isFragment_0() || !this.mMol.isExcludeGroupAtom(this.mAtom1))) {
          this.mX1 = this.mMol.getAtomX_0(this.mAtom1);
          this.mY1 = this.mMol.getAtomY_0(this.mAtom1);
          this.mPendingRequest = 8;
        }
        break;
      case 21:
        object = null;
        if (isNull(this.mCurrentHiliteObject)) {
          object = new carc2.TextDrawingObject();
          object.setCoordinates(this.mX1, this.mY1);
          this.mDrawingObjectList.add(object);
        } else if (instanceOf(this.mCurrentHiliteObject, 97)) {
          object = castTo(this.mCurrentHiliteObject, 97);
        }
        this.editTextObject(object);
        this.storeState();
        this.update(3);
        break;
    }
  };
  _.mouseReleasedButton1 = function mouseReleasedButton1() {
    var atom, atom0, atom2, bondType, freeMapNo, i, i0, mapNo, mapNoAtom1, mapNoAtom2, mapNoChanged, pendingRequest, selectionChanged, stopAtom, wasAutoMapped;
    pendingRequest = this.mPendingRequest;
    this.mPendingRequest = 0;
    switch (pendingRequest) {
      case 1:
        stopAtom = this.mMol.findAtom_0(this.mX2, this.mY2);
        if (stopAtom != -1 && this.mMol.getAllConnAtomsPlusMetalBonds_0(stopAtom) == 8) {
          return;
        }
        this.storeState();
        if (this.mAtom1 == -1) {
          this.mAtom1 = this.mMol.addAtom_0(this.mX1, this.mY1);
        }
        if (stopAtom == -1) {
          stopAtom = this.mMol.addAtom_0(this.mX2, this.mY2);
        }
        if (this.mAtom1 != -1 && stopAtom != -1) {
          bondType = this.mMol.isMetalAtom_0(this.mAtom1) || this.mMol.isMetalAtom_0(stopAtom) ? 16 : 1;
          if (this.mCurrentTool == 6) {
            bondType = 257;
          }
          if (this.mCurrentTool == 23) {
            bondType = 129;
          }
          this.mMol.addOrChangeBond_0(this.mAtom1, stopAtom, bondType);
        }
        this.updateAndFireEvent(3);
        break;
      case 2:
        this.storeState();
        if (this.mChainAtoms > 0) {
          if (this.mAtom1 == -1) {
            this.mAtom1 = this.mMol.addAtom_0(this.mX1, this.mY1);
          }
          if (this.mChainAtom[0] == -1) {
            this.mChainAtom[0] = this.mMol.addAtom_0(this.mChainAtomX[0], this.mChainAtomY[0]);
          }
          if (this.mChainAtom[0] != -1) {
            this.mMol.addBond_0(this.mAtom1, this.mChainAtom[0]);
          }
        }
        if (this.mChainAtoms > 1) {
          for (i0 = 1; i0 < this.mChainAtoms; i0++) {
            if (this.mChainAtom[i0] == -1) {
              this.mChainAtom[i0] = this.mMol.addAtom_0(this.mChainAtomX[i0], this.mChainAtomY[i0]);
            }
            if (this.mChainAtom[i0] != -1) {
              this.mMol.addBond_0(this.mChainAtom[i0 - 1], this.mChainAtom[i0]);
            }
          }
        }
        this.updateAndFireEvent(3);
        break;
      case 3:
      case 4:
      case 7:
        this.updateAndFireEvent(3);
        break;
      case 10:
        this.update(3);
        break;
      case 5:
      case 6:
        selectionChanged = false;
        for (i = 0; i < this.mMol.getAllAtoms_0(); i++) {
          if (this.mIsSelectedAtom[i] != this.mMol.isSelectedAtom_0(i)) {
            selectionChanged = true;
            break;
          }
        }
        this.mCanvas.repaint_0();
        if (selectionChanged)
          this.fireEventLater(new carge.EditorEvent(this, 2, true));
        break;
      case 8:
        mapNoChanged = false;
        atom2 = this.mCurrentHiliteAtom;
        if (atom2 != -1 && this.mMol.isFragment_0() && this.mMol.isExcludeGroupAtom(atom2))
          atom2 = -1;
        mapNoAtom1 = this.mMol.getAtomMapNo_0(this.mAtom1);
        if (atom2 == -1) {
          this.storeState();
          if (mapNoAtom1 != 0) {
            mapNoChanged = true;
            wasAutoMapped = false;
            for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
              if (this.mMol.getAtomMapNo_0(atom) == mapNoAtom1) {
                wasAutoMapped = wasAutoMapped | this.mMol.isAutoMappedAtom_0(atom);
                this.mMol.setAtomMapNo_0(atom, 0, false);
              }
            }
            if (carge.sKeepAutoMapped && !wasAutoMapped)
              this.autoMapReaction();
          }
        } else {
          this.storeState();
          mapNoChanged = true;
          wasAutoMapped = false;
          if (this.mAtom1 == atom2) {
            mapNo = this.mMol.getAtomMapNo_0(this.mAtom1);
            for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
              if (this.mMol.getAtomMapNo_0(atom) == mapNo) {
                wasAutoMapped = wasAutoMapped | this.mMol.isAutoMappedAtom_0(atom);
                this.mMol.setAtomMapNo_0(atom, 0, false);
              }
            }
          } else {
            mapNoAtom2 = this.mMol.getAtomMapNo_0(atom2);
            for (atom0 = 0; atom0 < this.mMol.getAtoms_0(); atom0++) {
              if (this.mMol.getAtomMapNo_0(atom0) == mapNoAtom1 || this.mMol.getAtomMapNo_0(atom0) == mapNoAtom2) {
                this.mMol.setAtomMapNo_0(atom0, 0, false);
              }
            }
            freeMapNo = 1;
            for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
              if (this.mMol.getAtomMapNo_0(atom) == freeMapNo) {
                freeMapNo++;
                atom = -1;
              }
            }
            this.mMol.setAtomMapNo_0(this.mAtom1, freeMapNo, false);
            this.mMol.setAtomMapNo_0(atom2, freeMapNo, false);
          }
          if (carge.sKeepAutoMapped && !wasAutoMapped)
            this.autoMapReaction();
        }
        if (mapNoChanged)
          this.updateAndFireEvent($wnd.Math.max(this.mUpdateMode, 1));
        this.mCanvas.repaint_0();
        break;
    }
  };
  _.openReaction = function openReaction() {
  };
  _.paintContent = function paintContent(context) {
    var arrow, background, dx, fontSize, foreground, h, i, isScaledView, mx, my, p, s, saveRGB, t1, t2, validity, w, x_0, x1, x2, xdiff, xx1, xx2, y_0, y1, y2, ydiff, yy1, yy2;
    if (this.mWidth != this.mCanvas.getCanvasWidth_0() || this.mHeight != this.mCanvas.getCanvasHeight_0()) {
      this.mWidth = this.mCanvas.getCanvasWidth_0();
      this.mHeight = this.mCanvas.getCanvasHeight_0();
      if (this.mUpdateMode < 3) {
        this.mUpdateMode = 3;
      }
    }
    background = context.getBackgroundRGB_0();
    foreground = context.getForegroundRGB_0();
    context.setRGB_0(background);
    context.fillRectangle_0(0, 0, this.mWidth, this.mHeight);
    if ((this.mMode & 4) != 0 && this.mDrawingObjectList.isEmpty()) {
      mx = 0.5 * this.mWidth;
      my = 0.5 * this.mHeight;
      dx = 0.5 * 0.07999999821186066 * this.mWidth;
      arrow = new carcr.ReactionArrow();
      arrow.setCoordinates_1(mx - dx, my, mx + dx, my);
      arrow.setDeletable(false);
      this.mDrawingObjectList.add(arrow);
    }
    isScaledView = false;
    if (this.mUpdateMode != 0) {
      if ((this.mMode & 1) != 0 && this.mUpdateMode != 5)
        this.analyzeFragmentMembership();
      this.mDepictor = (this.mMode & 4) != 0 ? new carc2.ExtendedDepictor_0(new carcr.Reaction_1(this.mFragment, this.mReactantCount), this.mDrawingObjectList, false) : (this.mMode & 2) != 0 ? new carc2.ExtendedDepictor_1(this.mFragment, this.mReactantCount, this.mDrawingObjectList) : (this.mMode & 1) != 0 ? new carc2.ExtendedDepictor_2(this.mFragment, this.mDrawingObjectList) : new carc2.ExtendedDepictor(this.mMol, this.mDrawingObjectList);
      this.mDepictor.setForegroundColor(foreground, background);
      this.mDepictor.setDefaultAVBL(this.mMaxAVBL);
      this.mDepictor.setFragmentNoColor((this.mMode & 1) == 0 ? 0 : carg.isDarkLookAndFeel() ? caru.brighter(background, 0.8500000238418579) : caru.darker(background, 0.8500000238418579));
      this.mDepictor.setFactorTextSize(this.mTextSizeFactor);
      this.mDepictor.setDisplayMode(this.mDisplayMode | 8 | (this.mCurrentTool == 19 ? 16 | 64 : 0));
      if ((this.mMode & (4 | 2 | 1)) == 0) {
        this.mDepictor.getMoleculeDepictor(0).setAtomText(this.mAtomText);
      }
      switch (this.mUpdateMode) {
        case 6:
        case 4:
        case 5:
          this.cleanupCoordinates(context);
          break;
        case 3:
          t1 = this.mDepictor.updateCoords_0(context, new cargg.GenericRectangle_0(0, 0, this.mWidth, this.mHeight), 0);
          if (isNotNull(t1) && (this.mMode & 1) != 0) {
            t1.applyTo_1(this.mMol);
          }
          break;
        case 2:
          t2 = this.mDepictor.validateView_0(context, new cargg.GenericRectangle_0(0, 0, this.mWidth, this.mHeight), 0);
          isScaledView = isNotNull(t2) && !t2.isVoidTransformation();
          break;
      }
      this.mUpdateMode = 0;
    }
    if (isNotNull(this.mDepictor)) {
      this.mDepictor.paintFragmentNumbers(context);
    }
    if (!isScaledView) {
      this.drawHiliting(context);
    }
    if (isNotNull(this.mDepictor)) {
      this.mDepictor.paintStructures(context);
      this.mDepictor.paintDrawingObjects(context);
    }
    if (this.mCurrentHiliteAtom != -1 && this.mAtomKeyStrokeBuffer.length_1() != 0) {
      x_0 = round_int(this.mMol.getAtomX_0(this.mCurrentHiliteAtom));
      y_0 = round_int(this.mMol.getAtomY_0(this.mCurrentHiliteAtom));
      s = this.mAtomKeyStrokeBuffer.toString_0();
      validity = this.getAtomKeyStrokeValidity(s);
      context.setRGB_0(validity == 1 ? foreground : validity == 2 ? -16776961 : -8355712);
      if (validity == 1)
        s = (carc2.$clinit_Molecule(), carc2.cAtomLabel)[carc2.getAtomicNoFromLabel_0(s, this.mAllowedPseudoAtoms)];
      else if (validity == 2)
        s = jl.substring_II_Ljava_lang_String___devirtual$(this.mAtomKeyStrokeSuggestion, 0, jl.length__I__devirtual$_0(s));
      fontSize = narrow_int(3 * context.getFontSize_0() / 2);
      context.setFont_0(fontSize, false, false);
      context.drawString_1(x_0, y_0, s);
      if (validity == 4) {
        context.setRGB_0(-65536);
        context.drawCenteredString_0(x_0 + context.getBounds_1(s).getWidth_0() / 2, y_0 + fontSize, "<unknown>");
      }
      if (validity == 2) {
        context.setRGB_0(-8355712);
        context.drawString_1(x_0 + context.getBounds_1(s).getWidth_0(), y_0, jl.substring_I_Ljava_lang_String___devirtual$(this.mAtomKeyStrokeSuggestion, jl.length__I__devirtual$_0(s)));
      }
    }
    context.setRGB_0(foreground);
    switch (this.mPendingRequest) {
      case 1:
        x1 = round_int(this.mX1);
        y1 = round_int(this.mY1);
        if (this.mCurrentHiliteAtom == -1 || this.mCurrentHiliteAtom == this.mAtom1) {
          x2 = round_int(this.mX2);
          y2 = round_int(this.mY2);
        } else {
          x2 = round_int(this.mMol.getAtomX_0(this.mCurrentHiliteAtom));
          y2 = round_int(this.mMol.getAtomY_0(this.mCurrentHiliteAtom));
        }
        switch (this.mCurrentTool) {
          case 5:
            context.drawLine_1(x1, y1, x2, y2);
            break;
          case 6:
            xdiff = narrow_int((y1 - y2) / 9);
            ydiff = narrow_int((x2 - x1) / 9);
            p = new cargg.GenericPolygon_0(3);
            p.addPoint(x1, y1);
            p.addPoint(x2 + xdiff, y2 + ydiff);
            p.addPoint(x2 - xdiff, y2 - ydiff);
            context.fillPolygon_0(p);
            break;
          case 23:
            xdiff = x2 - x1;
            ydiff = y2 - y1;
            for (i = 2; i < 17; i += 2) {
              xx1 = x1 + narrow_int(i * xdiff / 17) - narrow_int(i * ydiff / 128);
              yy1 = y1 + narrow_int(i * ydiff / 17) + narrow_int(i * xdiff / 128);
              xx2 = x1 + narrow_int(i * xdiff / 17) + narrow_int(i * ydiff / 128);
              yy2 = y1 + narrow_int(i * ydiff / 17) - narrow_int(i * xdiff / 128);
              context.drawLine_1(xx1, yy1, xx2, yy2);
            }
            break;
        }
        break;
      case 2:
        if (this.mChainAtoms > 0) {
          context.drawLine_1(round_int(this.mX1), round_int(this.mY1), round_int(this.mChainAtomX[0]), round_int(this.mChainAtomY[0]));
        }
        if (this.mChainAtoms > 1) {
          for (i = 1; i < this.mChainAtoms; i++) {
            context.drawLine_1(round_int(this.mChainAtomX[i - 1]), round_int(this.mChainAtomY[i - 1]), round_int(this.mChainAtomX[i]), round_int(this.mChainAtomY[i]));
          }
        }
        break;
      case 5:
        context.setRGB_0(carge.lassoColor(context));
        context.drawPolygon_0(this.mLassoRegion);
        context.setRGB_0(foreground);
        break;
      case 6:
        x_0 = this.mX1 < this.mX2 ? round_int(this.mX1) : round_int(this.mX2);
        y_0 = this.mY1 < this.mY2 ? round_int(this.mY1) : round_int(this.mY2);
        w = round_int($wnd.Math.abs(this.mX2 - this.mX1));
        h = round_int($wnd.Math.abs(this.mY2 - this.mY1));
        context.setRGB_0(carge.lassoColor(context));
        context.drawRectangle_0(x_0, y_0, w, h);
        context.setRGB_0(foreground);
        break;
      case 8:
        x1 = round_int(this.mX1);
        y1 = round_int(this.mY1);
        if (this.mCurrentHiliteAtom == -1 || this.mCurrentHiliteAtom == this.mAtom1) {
          x2 = round_int(this.mX2);
          y2 = round_int(this.mY2);
        } else {
          x2 = round_int(this.mMol.getAtomX_0(this.mCurrentHiliteAtom));
          y2 = round_int(this.mMol.getAtomY_0(this.mCurrentHiliteAtom));
        }
        context.setRGB_0(carge.mapToolColor(context));
        context.drawLine_1(x1, y1, x2, y2);
        context.setRGB_0(foreground);
        break;
    }
    if (jsNotEquals(this.mWarningMessage, null)) {
      context.setFont_0(12, true, false);
      saveRGB = context.getRGB_0();
      context.setRGB_0(-65536);
      context.drawCenteredString_0(this.mWidth / 2, context.getFontSize_0(), this.mWarningMessage);
      context.setRGB_0(saveRGB);
    }
  };
  _.paste = function paste() {
    if ((this.mMode & 4) != 0) {
      if (this.pasteReaction_0()) {
        return;
      }
    }
    this.pasteMolecule_1();
  };
  _.pasteMolecule_1 = function pasteMolecule() {
    var mol;
    if (isNotNull(this.mClipboardHandler)) {
      mol = this.mClipboardHandler.pasteMolecule_0();
      if (this.addPastedOrDropped_0(mol, null))
        return true;
      this.showWarningMessage("No molecule on clipboard!");
    }
    return false;
  };
  _.pasteReaction_0 = function pasteReaction() {
    var i, ret, rxn;
    ret = false;
    if (isNotNull(this.mClipboardHandler)) {
      rxn = this.mClipboardHandler.pasteReaction();
      if (isNotNull(rxn)) {
        if (!this.mAllowFragmentChangeOnPasteOrDrop)
          for (i = 0; i < rxn.getMolecules_0(); i++)
            rxn.getMolecule_1(i).setFragment_0(this.mMol.isFragment_0());
        this.storeState();
        this.setReaction_0(rxn);
        ret = true;
      } else {
        this.showWarningMessage("No reaction on clipboard!");
      }
    }
    return ret;
  };
  _.qualifiesForESR = function qualifiesForESR(stereoBond) {
    return this.mMol.isStereoBond_0(stereoBond) && (this.getESRAtom(stereoBond) != -1 || this.getESRBond(stereoBond) != -1);
  };
  _.removeMapping = function removeMapping(autoMapping, explicitMapping) {
    var atom, changed;
    changed = false;
    for (atom = 0; atom < this.mMol.getAtoms_0(); atom++) {
      if (this.mMol.getAtomMapNo_0(atom) != 0 && (explicitMapping && !this.mMol.isAutoMappedAtom_0(atom) || autoMapping && this.mMol.isAutoMappedAtom_0(atom))) {
        if (!changed) {
          this.storeState();
          changed = true;
        }
        this.mMol.setAtomMapNo_0(atom, 0, false);
      }
    }
    if (changed) {
      if (!autoMapping)
        this.autoMapReaction();
      this.updateAndFireEvent($wnd.Math.max(this.mUpdateMode, 1));
    }
  };
  _.restoreState = function restoreState() {
    if (isNull(this.mUndoMol)) {
      return;
    }
    this.mUndoMol.copyMolecule_0(this.mMol);
    this.mDrawingObjectList = isNull(this.mUndoDrawingObjectList) ? null : new carc2.DrawingObjectList_0(this.mUndoDrawingObjectList);
  };
  _.rotate180 = function rotate180() {
    var atom, atom0, cog, selectedOnly;
    selectedOnly = false;
    for (atom0 = 0; atom0 < this.mMol.getAllAtoms_0(); atom0++) {
      if (this.mMol.isSelectedAtom_0(atom0)) {
        selectedOnly = true;
        break;
      }
    }
    cog = this.calculateCenterOfGravity(selectedOnly);
    if (isNotNull(cog)) {
      this.storeState();
      for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
        if (!selectedOnly || this.mMol.isSelectedAtom_0(atom)) {
          this.mMol.setAtomX_0(atom, 2 * cog.getX_2() - this.mMol.getAtomX_0(atom));
          this.mMol.setAtomY_0(atom, 2 * cog.getY_2() - this.mMol.getAtomY_0(atom));
        }
      }
      this.update(1);
    }
  };
  _.setAtomText = function setAtomText_0(atomText) {
    this.mAtomText = atomText;
  };
  _.setClipboardHandler = function setClipboardHandler(h) {
    this.mClipboardHandler = h;
  };
  _.setCustomAtom = function setCustomAtom(atomicNo, mass, valence, radical, customLabel) {
    this.mCustomAtomicNo = atomicNo;
    this.mCustomAtomMass = mass;
    this.mCustomAtomValence = valence;
    this.mCustomAtomRadical = radical;
    this.mCustomAtomLabel = customLabel;
  };
  _.setDisplayMode = function setDisplayMode_1(dMode) {
    this.mDisplayMode = dMode;
    this.update(1);
  };
  _.setDrawingObjects = function setDrawingObjects_0(drawingObjectList) {
    this.mDrawingObjectList = drawingObjectList;
    this.storeState();
    this.update(4);
  };
  _.setESRInfo = function setESRInfo(stereoBond, type_0) {
    var a, atom, b, bond, group, grp, i, i0, i1, i2, maxGroup, selectedShareOneGroup;
    group = -1;
    atom = this.getESRAtom(stereoBond);
    bond = atom == -1 ? this.getESRBond(stereoBond) : -1;
    if (type_0 != 0) {
      maxGroup = -1;
      for (i0 = 0; i0 < this.mMol.getAtoms_0(); i0++) {
        if (i0 != atom && this.mMol.getAtomESRType_0(i0) == type_0 && (!this.mMol.isSelectedBond_0(stereoBond) || !this.mMol.isSelectedAtom_0(i0))) {
          grp = this.mMol.getAtomESRGroup_0(i0);
          if (maxGroup < grp) {
            maxGroup = grp;
          }
        }
      }
      for (i1 = 0; i1 < this.mMol.getBonds_0(); i1++) {
        if (i1 != bond && this.mMol.getBondESRType_0(i1) == type_0 && (!this.mMol.isSelectedBond_0(stereoBond) || !this.mMol.isSelectedBond_0(i1))) {
          grp = this.mMol.getBondESRGroup_0(i1);
          if (maxGroup < grp) {
            maxGroup = grp;
          }
        }
      }
      if ((atom == -1 ? this.mMol.getBondESRType_0(bond) : this.mMol.getAtomESRType_0(atom)) != type_0) {
        group = $wnd.Math.min(maxGroup + 1, 32 - 1);
      } else {
        group = atom == -1 ? this.mMol.getBondESRGroup_0(bond) : this.mMol.getAtomESRGroup_0(atom);
        if (this.mMol.isSelectedBond_0(stereoBond)) {
          selectedShareOneGroup = true;
          for (i2 = 0; i2 < this.mMol.getAtoms_0(); i2++) {
            if (i2 != atom && this.mMol.isSelectedAtom_0(i2) && this.mMol.getAtomESRType_0(i2) == type_0 && this.mMol.getAtomESRGroup_0(i2) != group) {
              selectedShareOneGroup = false;
              break;
            }
          }
          for (i = 0; i < this.mMol.getBonds_0(); i++) {
            if (i != bond && this.mMol.isSelectedBond_0(i) && this.mMol.getBondESRType_0(i) == type_0 && this.mMol.getBondESRGroup_0(i) != group) {
              selectedShareOneGroup = false;
              break;
            }
          }
          if (selectedShareOneGroup) {
            if (group <= maxGroup) {
              group++;
              if (group == 32) {
                group = 0;
              }
            } else {
              group = 0;
            }
          }
        } else {
          if (group <= maxGroup) {
            group++;
            if (group == 32) {
              group = 0;
            }
          } else {
            group = 0;
          }
        }
      }
    }
    if (this.mMol.isSelectedBond_0(stereoBond)) {
      for (i = 0; i < this.mMol.getBonds_0(); i++) {
        if (this.mMol.isSelectedBond_0(i) && this.mMol.isStereoBond_0(i)) {
          a = this.getESRAtom(i);
          b = this.getESRBond(i);
          if (a != -1) {
            this.mMol.setAtomESR_0(a, type_0, group);
          } else if (b != -1) {
            this.mMol.setBondESR_0(b, type_0, group);
          }
        }
      }
    } else {
      if (atom != -1) {
        this.mMol.setAtomESR_0(atom, type_0, group);
      } else if (bond != -1) {
        this.mMol.setBondESR_0(bond, type_0, group);
      }
    }
  };
  _.setMolecule_0 = function setMolecule_3(theMolecule) {
    if (jsEquals(this.mMol, theMolecule)) {
      return;
    }
    this.storeState();
    this.mMol = theMolecule;
    this.mMode = 0;
    this.mDrawingObjectList = null;
    this.moleculeChanged_0();
  };
  _.setReaction_0 = function setReaction(rxn) {
    var atom, f, i, j;
    this.mMol.clear_0();
    this.mFragment = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_StereoMolecule_2_classLit, { 95: 1, 4: 1, 1: 1, 7: 1 }, 17, rxn.getMolecules_0(), 0, 1);
    this.mReactantCount = rxn.getReactants_0();
    for (i = 0; i < rxn.getMolecules_0(); i++) {
      setCheck(this.mFragment, i, rxn.getMolecule_1(i));
      this.mMol.addMolecule_0(this.mFragment[i]);
    }
    this.mMol.setFragment_0(rxn.isFragment_0());
    this.storeState();
    this.mFragmentNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllAtoms_0(), 15, 1);
    for (atom = 0, f = 0; f < this.mFragment.length; f++) {
      for (j = 0; j < this.mFragment[f].getAllAtoms_0(); j++) {
        this.mFragmentNo[atom++] = f;
      }
    }
    this.mDrawingObjectList = new carc2.DrawingObjectList();
    this.mMode = 1 | 4;
    this.update(5);
    this.fireEventLater(new carge.EditorEvent(this, 1, false));
  };
  _.shareSameReactionSide = function shareSameReactionSide(atom1, atom2) {
    var arrow;
    arrow = castTo(castTo(this.mDrawingObjectList.getAtIndex(0), 42), 42);
    return arrow.isOnProductSide(this.mMol.getAtomX_0(atom1), this.mMol.getAtomY_0(atom1)) == arrow.isOnProductSide(this.mMol.getAtomX_0(atom2), this.mMol.getAtomY_0(atom2));
  };
  _.showAtomQFDialog = function showAtomQFDialog(atom) {
    var builder, showReactionHints;
    if (this.mAllowQueryFeatures) {
      this.storeState();
      showReactionHints = (this.mMode & 4) != 0;
      builder = new carge.AtomQueryFeatureDialogBuilder(this.mUIHelper, this.mMol, atom, showReactionHints);
      if (builder.showDialog_0())
        this.updateAndFireEvent(1);
    }
  };
  _.showBondQFDialog = function showBondQFDialog(bond) {
    var builder;
    if (this.mAllowQueryFeatures) {
      this.storeState();
      builder = new carge.BondQueryFeatureDialogBuilder(this.mUIHelper, this.mMol, bond);
      if (builder.showDialog_0())
        this.updateAndFireEvent(1);
    }
  };
  _.showCustomAtomDialog = function showCustomAtomDialog(atom) {
    var builder;
    this.storeState();
    builder = atom == -1 ? new carge.CustomAtomDialogBuilder(this.mUIHelper, this, this.mCustomAtomicNo, this.mCustomAtomMass, this.mCustomAtomValence, this.mCustomAtomRadical, this.mCustomAtomLabel) : new carge.CustomAtomDialogBuilder_0(this.mUIHelper, this, this.mMol, atom);
    if (builder.showDialog_0() && atom != -1)
      this.updateAndFireEvent(1);
  };
  _.showHelpDialog_0 = function showHelpDialog() {
    this.mUIHelper.showHelpDialog_1("/html/editor/editor.html", "Structure Editor Help");
  };
  _.showWarningMessage = function showWarningMessage(msg) {
  };
  _.sortFragmentsByPosition = function sortFragmentsByPosition(fragmentNo, fragments) {
    var arrow, atom, atom1, cog, fragment, fragment0, fragment1, fragmentCOG, fragmentDescriptor, newFragmentIndex, oldIndex;
    fragmentDescriptor = initMultidimensionalArray(cggl.I_classLit, [{ 25: 1, 4: 1, 1: 1, 7: 1 }, { 6: 1, 4: 1, 1: 1 }], [6, 5], 15, [fragments, (this.mMode & (4 | 2)) != 0 ? 2 : 1], 2);
    for (fragment0 = 0; fragment0 < fragments; fragment0++) {
      fragmentDescriptor[fragment0][0] = fragment0;
    }
    fragmentCOG = this.calculateFragmentCenterOfGravity(fragmentNo, fragments);
    if ((this.mMode & 4) != 0) {
      this.mReactantCount = 0;
      arrow = (this.mMode & 4) != 0 ? castTo(castTo(this.mDrawingObjectList.getAtIndex(0), 42), 42) : null;
      for (fragment1 = 0; fragment1 < fragments; fragment1++) {
        fragmentDescriptor[fragment1][1] = arrow.isOnProductSide(fragmentCOG[fragment1].x_0, fragmentCOG[fragment1].y_0) ? 1 : 0;
        if (fragmentDescriptor[fragment1][1] == 0) {
          this.mReactantCount++;
        }
      }
    } else if ((this.mMode & 2) != 0) {
      this.mReactantCount = fragments;
      for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
        if (this.mMol.getAtomicNo_0(atom) == 0 && fragmentDescriptor[fragmentNo[atom]][1] == 0) {
          fragmentDescriptor[fragmentNo[atom]][1] = 1;
          this.mReactantCount--;
        }
      }
    }
    cog = fragmentCOG;
    ju.sort_7(fragmentDescriptor, new carge.GenericEditorArea$lambda$1$Type(this, cog));
    newFragmentIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, fragments, 15, 1);
    for (fragment = 0; fragment < fragments; fragment++) {
      oldIndex = castTo(fragmentDescriptor[fragment], 6)[0];
      newFragmentIndex[oldIndex] = fragment;
    }
    for (atom1 = 0; atom1 < this.mMol.getAllAtoms_0(); atom1++) {
      fragmentNo[atom1] = newFragmentIndex[fragmentNo[atom1]];
    }
  };
  _.storeState = function storeState() {
    if (isNull(this.mUndoMol)) {
      this.mUndoMol = new carc2.Molecule();
    }
    this.mMol.copyMolecule_0(this.mUndoMol);
    this.mUndoDrawingObjectList = isNull(this.mDrawingObjectList) ? null : new carc2.DrawingObjectList_0(this.mDrawingObjectList);
  };
  _.suggestNewChain = function suggestNewChain() {
    var avbl, bondAngle, candidate1, candidate2, connAngle, dx, dy, exitAngle, i, i0, lastChainAtoms, lastX1, lastX2, lastY1, lastY2, leftAngle, mdx, mdy, mouseAngle, nextAngle;
    mouseAngle = carc2.getAngle_0(this.mX1, this.mY1, this.mX2, this.mY2);
    mdx = this.mX2 - this.mX1;
    mdy = this.mY2 - this.mY1;
    lastChainAtoms = this.mChainAtoms;
    lastX1 = 0;
    lastY1 = 0;
    lastX2 = 0;
    lastY2 = 0;
    if (lastChainAtoms > 0) {
      lastX1 = toInt_0(jl.round_1(this.mChainAtomX[0]));
      lastY1 = toInt_0(jl.round_1(this.mChainAtomY[0]));
    }
    if (lastChainAtoms > 1) {
      lastX2 = toInt_0(jl.round_1(this.mChainAtomX[1]));
      lastY2 = toInt_0(jl.round_1(this.mChainAtomY[1]));
    }
    exitAngle = 0;
    if (this.mAtom1 == -1 || this.mMol.getAllConnAtomsPlusMetalBonds_0(this.mAtom1) == 0) {
      exitAngle = 3.141592653589793 / 3 * toDouble_0(jl.round_1(mouseAngle * 3 / 3.141592653589793));
    } else if (this.mMol.getAllConnAtomsPlusMetalBonds_0(this.mAtom1) == 1) {
      bondAngle = this.mMol.getBondAngle_0(this.mMol.getConnAtom_0(this.mAtom1, 0), this.mAtom1);
      candidate1 = bondAngle - 3.141592653589793 / 3;
      candidate2 = bondAngle + 3.141592653589793 / 3;
      exitAngle = $wnd.Math.abs(carc2.getAngleDif(mouseAngle, candidate1)) < $wnd.Math.abs(carc2.getAngleDif(mouseAngle, candidate2)) ? candidate1 : candidate2;
    } else {
      connAngle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mMol.getAllConnAtomsPlusMetalBonds_0(this.mAtom1), 15, 1);
      for (i0 = 0; i0 < this.mMol.getAllConnAtomsPlusMetalBonds_0(this.mAtom1); i0++)
        connAngle[i0] = this.mMol.getBondAngle_0(this.mAtom1, this.mMol.getConnAtom_0(this.mAtom1, i0));
      ju.sort_2(connAngle);
      for (i = 0; i < connAngle.length; i++) {
        leftAngle = i == 0 ? connAngle[connAngle.length - 1] - 2 * 3.141592653589793 : connAngle[i - 1];
        if (leftAngle < mouseAngle && mouseAngle < connAngle[i]) {
          exitAngle = (connAngle[i] + leftAngle) / 2;
          break;
        }
        if (leftAngle < mouseAngle - 2 * 3.141592653589793 && mouseAngle - 2 * 3.141592653589793 < connAngle[i]) {
          exitAngle = (connAngle[i] + leftAngle) / 2;
          break;
        }
      }
    }
    avbl = this.getScaledAVBL();
    this.mChainAtoms = $wnd.Math.abs(carc2.getAngleDif(mouseAngle, exitAngle)) > 3.141592653589793 / 3 ? 0 : round_int($wnd.Math.sqrt(mdx * mdx + mdy * mdy) / avbl);
    if (this.mChainAtoms > 0) {
      if (jsEquals(this.mChainAtomX, null) || this.mChainAtomX.length < this.mChainAtoms) {
        this.mChainAtomX = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mChainAtoms, 15, 1);
        this.mChainAtomY = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mChainAtoms, 15, 1);
      }
      dx = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
      dy = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
      nextAngle = carc2.getAngleDif(mouseAngle, exitAngle) < 0 ? exitAngle - 3.141592653589793 / 3 : exitAngle + 3.141592653589793 / 3;
      dx[0] = avbl * $wnd.Math.sin(exitAngle);
      dy[0] = avbl * $wnd.Math.cos(exitAngle);
      dx[1] = avbl * $wnd.Math.sin(nextAngle);
      dy[1] = avbl * $wnd.Math.cos(nextAngle);
      for (i0 = 0; i0 < this.mChainAtoms; i0++) {
        this.mChainAtomX[i0] = (i0 == 0 ? this.mX1 : this.mChainAtomX[i0 - 1]) + dx[i0 & 1];
        this.mChainAtomY[i0] = (i0 == 0 ? this.mY1 : this.mChainAtomY[i0 - 1]) + dy[i0 & 1];
      }
      this.mChainAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mChainAtoms, 15, 1);
      for (i = 0; i < this.mChainAtoms; i++) {
        this.mChainAtom[i] = this.mMol.findAtom_0(this.mChainAtomX[i], this.mChainAtomY[i]);
        if (this.mChainAtom[i] != -1) {
          this.mChainAtomX[i] = this.mMol.getAtomX_0(this.mChainAtom[i]);
          this.mChainAtomY[i] = this.mMol.getAtomY_0(this.mChainAtom[i]);
        }
      }
    }
    return lastChainAtoms != this.mChainAtoms || this.mChainAtoms != 0 && (lastX1 != toInt_0(jl.round_1(this.mChainAtomX[0])) || lastY1 != toInt_0(jl.round_1(this.mChainAtomY[0]))) || this.mChainAtoms > 1 && (lastX2 != toInt_0(jl.round_1(this.mChainAtomX[1])) || lastY2 != toInt_0(jl.round_1(this.mChainAtomY[1])));
  };
  _.suggestNewX2AndY2 = function suggestNewX2AndY2(atom) {
    var angle, angleDiff, avbl, i, i0, i1, j, largestDiff, largestNo, newAngle, temp;
    newAngle = 3.141592653589793 * 2 / 3;
    if (atom != -1) {
      angle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 8 + 1, 15, 1);
      for (i0 = 0; i0 < this.mMol.getAllConnAtomsPlusMetalBonds_0(atom); i0++) {
        angle[i0] = this.mMol.getBondAngle_0(atom, this.mMol.getConnAtom_0(atom, i0));
      }
      if (this.mMol.getAllConnAtomsPlusMetalBonds_0(atom) == 1) {
        if (angle[0] < -3.141592653589793 * 5 / 6) {
          newAngle = 3.141592653589793 / 3;
        } else if (angle[0] < -3.141592653589793 / 2) {
          newAngle = 3.141592653589793 * 2 / 3;
        } else if (angle[0] < -3.141592653589793 / 6) {
          newAngle = 3.141592653589793 / 3;
        } else if (angle[0] < 0) {
          newAngle = 3.141592653589793 * 2 / 3;
        } else if (angle[0] < 3.141592653589793 / 6) {
          newAngle = -3.141592653589793 * 2 / 3;
        } else if (angle[0] < 3.141592653589793 / 2) {
          newAngle = -3.141592653589793 / 3;
        } else if (angle[0] < 3.141592653589793 * 5 / 6) {
          newAngle = -3.141592653589793 * 2 / 3;
        } else {
          newAngle = -3.141592653589793 / 3;
        }
      } else {
        for (i1 = this.mMol.getAllConnAtomsPlusMetalBonds_0(atom) - 1; i1 > 0; i1--) {
          for (j = 0; j < i1; j++) {
            if (angle[j] > angle[j + 1]) {
              temp = angle[j];
              angle[j] = angle[j + 1];
              angle[j + 1] = temp;
            }
          }
        }
        angle[this.mMol.getAllConnAtomsPlusMetalBonds_0(atom)] = angle[0] + 3.141592653589793 * 2;
        largestNo = 0;
        largestDiff = 0;
        for (i = 0; i < this.mMol.getAllConnAtomsPlusMetalBonds_0(atom); i++) {
          angleDiff = angle[i + 1] - angle[i];
          if (largestDiff < angleDiff) {
            largestDiff = angleDiff;
            largestNo = i;
          }
        }
        newAngle = (angle[largestNo] + angle[largestNo + 1]) / 2;
      }
    }
    avbl = this.getScaledAVBL();
    this.mX2 = (atom == -1 ? this.mX1 : this.mMol.getAtomX_0(atom)) + avbl * $wnd.Math.sin(newAngle);
    this.mY2 = (atom == -1 ? this.mY1 : this.mMol.getAtomY_0(atom)) + avbl * $wnd.Math.cos(newAngle);
  };
  _.toolChanged_0 = function toolChanged(newTool) {
    if (this.mCurrentTool != newTool) {
      if (this.mCurrentTool == 19 || newTool == 19) {
        this.mCurrentTool = newTool;
        this.update(1);
      } else {
        this.mCurrentTool = newTool;
      }
    }
  };
  _.trackHiliting = function trackHiliting(x_0, y_0, isDragging) {
    var hiliteObject, repaintNeeded, theAtom, theBond, theObject, theObject$iterator;
    theAtom = this.mMol.findAtom_0(x_0, y_0);
    theBond = -1;
    if (isDragging && this.mPendingRequest == 8 && theAtom != -1 && (!this.areAtomsMappingCompatible(this.mAtom1, theAtom) || this.mMol.getAtomMapNo_0(this.mAtom1) != 0 && this.mMol.getAtomMapNo_0(this.mAtom1) == this.mMol.getAtomMapNo_0(theAtom) && !this.mMol.isAutoMappedAtom_0(this.mAtom1) || this.shareSameReactionSide(this.mAtom1, theAtom))) {
      theAtom = -1;
    }
    if (theAtom != -1) {
      if (this.mCurrentTool == 101 || this.mCurrentTool == 103 || this.mCurrentTool == 102) {
        theBond = this.mMol.getStereoBond_0(theAtom);
        theAtom = -1;
      } else if (this.mCurrentTool == 19 && theAtom >= this.mMol.getAtoms_0()) {
        theAtom = -1;
      }
    }
    if (theBond == -1 && theAtom == -1 && this.mCurrentTool != 22 && this.mCurrentTool != 19 && this.mCurrentTool != 3 && this.mCurrentTool != 10 && this.mCurrentTool != 27 && this.mCurrentTool != 16 && this.mCurrentTool != 11 && this.mCurrentTool != 12 && this.mCurrentTool != 13 && this.mCurrentTool != 28 && this.mCurrentTool != 29 && this.mCurrentTool != 30 && this.mCurrentTool != 14 && this.mCurrentTool != 31 && this.mCurrentTool != 15 && this.mCurrentTool != 32 && this.mCurrentTool != 33) {
      theBond = this.mMol.findBond_0(x_0, y_0);
    }
    if (theBond != -1 && (this.mCurrentTool == 101 || this.mCurrentTool == 103 || this.mCurrentTool == 102) && !this.qualifiesForESR(theBond)) {
      theBond = -1;
    }
    hiliteObject = this.mCurrentHiliteObject;
    if (!isDragging && isNotNull(this.mDrawingObjectList)) {
      hiliteObject = null;
      if (theAtom == -1 && theBond == -1 && (this.mCurrentTool == 2 || this.mCurrentTool == 4 || this.mCurrentTool == 21)) {
        for (theObject$iterator = this.mDrawingObjectList.iterator(); theObject$iterator.hasNext_0(); ) {
          theObject = castTo(theObject$iterator.next_3(), 38);
          if (this.mCurrentTool == 2 || this.mCurrentTool == 4 && !instanceOf(theObject, 42) || this.mCurrentTool == 21 && instanceOf(theObject, 97)) {
            if (theObject.checkHiliting(x_0, y_0)) {
              hiliteObject = theObject;
              if (isNotNull(this.mCurrentHiliteObject) && jsNotEquals(this.mCurrentHiliteObject, theObject)) {
                this.mCurrentHiliteObject.clearHiliting();
              }
              break;
            }
          }
        }
      }
    }
    repaintNeeded = this.mCurrentHiliteAtom != theAtom || this.mCurrentHiliteBond != theBond || jsNotEquals(this.mCurrentHiliteObject, hiliteObject) || isNotNull(hiliteObject);
    if (this.mCurrentHiliteAtom != theAtom) {
      if (this.mCurrentHiliteAtom != -1 && this.mAtomKeyStrokeBuffer.length_1() != 0)
        this.expandAtomKeyStrokes(this.mAtomKeyStrokeBuffer.toString_0());
      this.mCurrentHiliteAtom = theAtom;
      this.mAtomKeyStrokeBuffer.setLength(0);
      this.fireEventLater(new carge.EditorEvent(this, 4, true));
    }
    if (this.mCurrentHiliteBond != theBond) {
      this.mCurrentHiliteBond = theBond;
      this.fireEventLater(new carge.EditorEvent(this, 8, true));
    }
    this.mCurrentHiliteObject = hiliteObject;
    return repaintNeeded;
  };
  _.update = function update(mode) {
    this.mUpdateMode = $wnd.Math.max(this.mUpdateMode, mode);
    this.mCanvas.repaint_0();
  };
  _.updateAndFireEvent = function updateAndFireEvent(updateMode) {
    this.update(updateMode);
    this.fireEventLater(new carge.EditorEvent(this, 1, true));
  };
  _.updateCursor = function updateCursor() {
    var cursor;
    cursor = -1;
    switch (this.mCurrentTool) {
      case 18:
        cursor = 9;
        break;
      case 2:
        if (this.mCurrentHiliteAtom != -1 && this.mMol.isSelectedAtom_0(this.mCurrentHiliteAtom) || this.mCurrentHiliteBond != -1 && this.mMol.isSelectedBond_0(this.mCurrentHiliteBond)) {
          cursor = this.mMouseIsDown ? 4 : this.mShiftIsDown ? 3 : 2;
        } else if (this.mCurrentHiliteAtom != -1 || this.mCurrentHiliteBond != -1) {
          cursor = 11;
        } else if (isNotNull(this.mCurrentHiliteObject)) {
          cursor = this.mMouseIsDown ? 4 : this.mShiftIsDown && !instanceOf(this.mCurrentHiliteObject, 42) ? 3 : 2;
        } else {
          cursor = this.mShiftIsDown ? this.mAltIsDown ? 8 : 6 : this.mAltIsDown ? 7 : 5;
        }
        break;
      case 4:
        cursor = 1;
        break;
      case 22:
        cursor = 0;
        break;
      case 21:
        cursor = 12;
        break;
      default:
        cursor = 11;
        break;
    }
    if (this.mCurrentCursor != cursor) {
      this.mCurrentCursor = cursor;
      this.mUIHelper.setCursor_0(cursor);
    }
  };
  _.useTemplate = function useTemplate(rxncode) {
    this.storeState();
    this.setReaction_0(carcr.decode_2(rxncode, true));
  };
  _.mAllowFragmentChangeOnPasteOrDrop = false;
  _.mAllowQueryFeatures = false;
  _.mAllowedPseudoAtoms = 0;
  _.mAltIsDown = false;
  _.mAtom1 = 0;
  _.mAtom2 = 0;
  _.mAtomColorSupported = false;
  _.mChainAtoms = 0;
  _.mCurrentCursor = 0;
  _.mCurrentHiliteAtom = 0;
  _.mCurrentHiliteBond = 0;
  _.mCurrentTool = 0;
  _.mCustomAtomMass = 0;
  _.mCustomAtomRadical = 0;
  _.mCustomAtomValence = 0;
  _.mCustomAtomicNo = 0;
  _.mDisplayMode = 0;
  _.mEventsScheduled = 0;
  _.mFirstAtomKey = 0;
  _.mHeight = 0;
  _.mIsAddingToSelection = false;
  _.mMaxAVBL = 0;
  _.mMode = 0;
  _.mMouseIsDown = false;
  _.mPendingRequest = 0;
  _.mReactantCount = 0;
  _.mShiftIsDown = false;
  _.mTextSizeFactor = 0;
  _.mUIScaling = 0;
  _.mUpdateMode = 0;
  _.mWidth = 0;
  _.mX1 = 0;
  _.mX2 = 0;
  _.mY1 = 0;
  _.mY2 = 0;
  carge.DEFAULT_ALLOWED_PSEUDO_ATOMS = 0;
  carge.DEFAULT_ARROW_LENGTH = 0.07999999821186066;
  carge.DEFAULT_SELECTION_BACKGROUND = -8346432;
  carge.FRAGMENT_CLEANUP_DISTANCE = 0;
  carge.FRAGMENT_GROUPING_DISTANCE = 0;
  carge.FRAGMENT_MAX_CLICK_DISTANCE = 24;
  carge.ITEM_ADD_AUTO_MAPPING = "Auto-Map Reaction";
  carge.ITEM_COPY_REACTION = "Copy Reaction";
  carge.ITEM_COPY_STRUCTURE = "Copy Structure";
  carge.ITEM_FLIP_HORIZONTALLY = "Flip Horizontally";
  carge.ITEM_FLIP_ROTATE180 = "Rotate 180\xB0";
  carge.ITEM_FLIP_VERTICALLY = "Flip Vertically";
  carge.ITEM_KEEP_AUTO_MAPPED = "Automatically Complete Mapping";
  carge.ITEM_LOAD_REACTION = "Open Reaction File...";
  carge.ITEM_MAKE_AUTO_MAPPING_EXPLICIT = "Make Auto-Mapping Explicit";
  carge.ITEM_PASTE_REACTION = "Paste Reaction";
  carge.ITEM_PASTE_STRUCTURE = "Paste Structure";
  carge.ITEM_REMOVE_ALL_MAPPING = "Remove Entire Atom Mapping";
  carge.ITEM_REMOVE_AUTO_MAPPING = "Remove Auto-Mapping (green)";
  carge.ITEM_REMOVE_EXPLICIT_MAPPING = "Remove Explicit Mapping (red)";
  carge.ITEM_SHOW_ATOM_BOND_NUMBERS = "Show Atom & Bond Numbers";
  carge.ITEM_SHOW_HELP = "Help Me";
  carge.ITEM_SHOW_NORMAL = "Show Normal";
  carge.ITEM_SHOW_SYMMETRY = "Show Symmetry";
  carge.ITEM_USE_TEMPLATE = "Use Reaction Template...";
  carge.KEY_IS_ATOM_LABEL = 1;
  carge.KEY_IS_INVALID = 4;
  carge.KEY_IS_SUBSTITUENT = 2;
  carge.KEY_IS_VALID_START = 3;
  carge.MAX_CONNATOMS = 8;
  carge.MIN_BOND_LENGTH_SQUARE = 100;
  carge.MODE_DRAWING_OBJECTS = 8;
  carge.MODE_MARKUSH_STRUCTURE = 2;
  carge.MODE_MULTIPLE_FRAGMENTS = 1;
  carge.MODE_REACTION = 4;
  carge.RGB_BLACK = -16777216;
  carge.RGB_BLUE = -16776961;
  carge.RGB_DARK_RED = -8388608;
  carge.RGB_GRAY = -8355712;
  carge.RGB_RED = -65536;
  carge.TEMPLATE_SECTION_KEY = "SECTION";
  carge.TEMPLATE_TYPE_KEY = "TEMPLATE";
  carge.TEMPLATE_TYPE_REACTION_QUERIES = "REACTION_QUERIES";
  carge.UPDATE_CHECK_COORDS = 3;
  carge.UPDATE_CHECK_VIEW = 2;
  carge.UPDATE_INVENT_COORDS = 6;
  carge.UPDATE_NONE = 0;
  carge.UPDATE_REDRAW = 1;
  carge.UPDATE_SCALE_COORDS = 4;
  carge.UPDATE_SCALE_COORDS_USE_FRAGMENTS = 5;
  carge.WARNING_MILLIS = 1200;
  carge.cRequestCopyObject = 11;
  carge.cRequestCopySelected = 9;
  carge.cRequestLassoSelect = 5;
  carge.cRequestMapAtoms = 8;
  carge.cRequestMoveObject = 10;
  carge.cRequestMoveSelected = 4;
  carge.cRequestMoveSingle = 3;
  carge.cRequestNewBond = 1;
  carge.cRequestNewChain = 2;
  carge.cRequestNone = 0;
  carge.cRequestSelectRect = 6;
  carge.cRequestZoomAndRotate = 7;
  carge.sKeepAutoMapped = true;
  cggl.Lcom_actelion_research_gui_editor_GenericEditorArea_2_classLit = createForClass("com.actelion.research.gui.editor", "GenericEditorArea", 330, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_Runnable = function $clinit_Runnable() {
    jl.$clinit_Runnable = emptyMethod;
  };
  cggl.Ljava_lang_Runnable_2_classLit = createForInterface("java.lang", "Runnable");
  carge.$clinit_GenericEditorArea$lambda$0$Type = function $clinit_GenericEditorArea$lambda$0$Type() {
    carge.$clinit_GenericEditorArea$lambda$0$Type = emptyMethod;
  };
  carge.GenericEditorArea$lambda$0$Type = function GenericEditorArea$lambda$0$Type($$outer_0, what_1, e_2) {
    carge.$clinit_GenericEditorArea$lambda$0$Type();
    this.$$outer_0 = $$outer_0;
    this.what_1 = what_1;
    this.e_2 = e_2;
  };
  defineClass(340, 1, { 1: 1, 130: 1 }, carge.GenericEditorArea$lambda$0$Type);
  _.run = function run() {
    this.$$outer_0.lambda$0(this.what_1, this.e_2);
  };
  _.what_1 = 0;
  cggl.Lcom_actelion_research_gui_editor_GenericEditorArea$lambda$0$Type_2_classLit = createForClass("com.actelion.research.gui.editor", "GenericEditorArea/lambda$0$Type", 340, cggl.Ljava_lang_Object_2_classLit);
  carge.$clinit_GenericEditorArea$lambda$1$Type = function $clinit_GenericEditorArea$lambda$1$Type() {
    carge.$clinit_GenericEditorArea$lambda$1$Type = emptyMethod;
  };
  carge.GenericEditorArea$lambda$1$Type = function GenericEditorArea$lambda$1$Type($$outer_0, cog_1) {
    carge.$clinit_GenericEditorArea$lambda$1$Type();
    this.$$outer_0 = $$outer_0;
    this.cog_1 = cog_1;
  };
  defineClass(341, 1, { 1: 1, 36: 1 }, carge.GenericEditorArea$lambda$1$Type);
  _.compare_0 = function compare_12(arg0, arg1) {
    return this.$$outer_0.lambda$1(this.cog_1, castTo(arg0, 6), castTo(arg1, 6));
  };
  _.equals_0 = function equals_17(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  cggl.Lcom_actelion_research_gui_editor_GenericEditorArea$lambda$1$Type_2_classLit = createForClass("com.actelion.research.gui.editor", "GenericEditorArea/lambda$1$Type", 341, cggl.Ljava_lang_Object_2_classLit);
  carge.$clinit_GenericEditorToolbar = function $clinit_GenericEditorToolbar() {
    carge.$clinit_GenericEditorToolbar = emptyMethod;
    jl.$clinit_Object();
    carge.cBorder = jl.round_2(cargh.scale_3(2));
    carge.cSourceButtonSize = 4 * 21;
    carge.cButtonSize = cargh.getUIScaleFactor() * 21;
  };
  carge.GenericEditorToolbar = function GenericEditorToolbar(toolbarCanvas, theArea) {
    carge.$clinit_GenericEditorToolbar();
    Object_0.call(this);
    this.$init_157();
    this.mToolbarCanvas = toolbarCanvas;
    this.mArea = theArea;
    this.init_5();
  };
  defineClass(342, 1, { 109: 1, 1: 1 }, carge.GenericEditorToolbar);
  _.$init_157 = function $init_157() {
  };
  _.eventHappened_0 = function eventHappened_9(e) {
    this.eventHappened_4(castTo(e, 134));
  };
  _.drawButton = function drawButton(context, button, background, isDisabled) {
    var bl;
    background |= -2147483648;
    bl = this.getButtonLocation(button);
    if (background != -1) {
      context.setRGB_0(background);
      context.fillRectangle_0(bl[0], bl[1], carge.cButtonSize, carge.cButtonSize);
    }
    if (button == 20)
      context.drawImage_1(this.mESRImageNormal, 0, this.mESRSelected * 84, 84, 84, bl[0], bl[1], carge.cButtonSize, carge.cButtonSize);
    else
      context.drawImage_1(isDisabled ? this.mImageDisabled : this.mImageNormal, (bl[0] - carge.cBorder) * this.mImageScaling, (bl[1] - carge.cBorder) * this.mImageScaling, 84, 84, bl[0], bl[1], carge.cButtonSize, carge.cButtonSize);
  };
  _.eventHappened_4 = function eventHappened_10(e) {
    var b, releasedButton;
    if (e.getWhat() == 1) {
      b = this.getButtonNo(e);
      if (!this.isSelectableButton(b))
        return;
      if (b == 20 && b == this.mCurrentTool)
        this.mESRSelected = ++this.mESRSelected % 3;
      this.mSelectedButton = b;
      this.mToolbarCanvas.repaint_0();
    } else if (e.getWhat() == 2) {
      if (this.mSelectedButton == -1)
        return;
      releasedButton = this.getButtonNo(e);
      if (releasedButton != this.mSelectedButton || this.mSelectedButton == 19 && (this.mArea.getMode_0() & 4) == 0 || this.mSelectedButton == 21 && (this.mArea.getMode_0() & 8) == 0) {
        this.mSelectedButton = -1;
        this.mToolbarCanvas.repaint_0();
        return;
      }
      this.mSelectedButton = -1;
      if (releasedButton == 0 || releasedButton == 1 || releasedButton == 17) {
        this.mToolbarCanvas.repaint_0();
        this.mArea.buttonPressed(releasedButton);
        return;
      }
      this.mCurrentTool = releasedButton;
      this.mToolbarCanvas.repaint_0();
      if (this.mCurrentTool == 20) {
        this.mArea.toolChanged_0(this.mESRSelected == 0 ? 101 : this.mESRSelected == 1 ? 103 : 102);
      } else if (this.mCurrentTool == 33) {
        this.mArea.showCustomAtomDialog(-1);
        this.mArea.toolChanged_0(releasedButton);
      } else {
        this.mArea.toolChanged_0(releasedButton);
      }
    } else if (e.getWhat() == 6 || e.getWhat() == 5) {
      b = this.getButtonNo(e);
      if (b == this.mSelectedButton)
        b = -1;
      if (b != this.mHighlightedButton) {
        this.mHighlightedButton = b;
        this.mToolbarCanvas.repaint_0();
      }
    }
  };
  _.getButtonLocation = function getButtonLocation(button) {
    var p;
    p = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    p[0] = carge.cButtonSize * narrow_int(button / 17) + carge.cBorder;
    p[1] = carge.cButtonSize * (button % 17) + carge.cBorder;
    return p;
  };
  _.getButtonNo = function getButtonNo(e) {
    var button, x_0, y_0;
    x_0 = e.getX_1() - carge.cBorder;
    y_0 = e.getY_1() - carge.cBorder;
    if (x_0 < 0 || x_0 >= 2 * carge.cButtonSize || y_0 < 0 || y_0 >= 17 * carge.cButtonSize)
      return -1;
    button = 17 * round_int(x_0 / carge.cButtonSize) + round_int(y_0 / carge.cButtonSize);
    return this.isSelectableButton(button) ? button : -1;
  };
  _.getHeight_1 = function getHeight_0() {
    return this.mHeight;
  };
  _.getWidth_1 = function getWidth_0() {
    return this.mWidth;
  };
  _.init_5 = function init_5() {
    this.mImageNormal = this.mArea.getUIHelper().createImage_1("editorButtons.png");
    cargh.adaptForLookAndFeel(this.mImageNormal);
    this.mImageDisabled = this.mArea.getUIHelper().createImage_1("editorButtons.png");
    cargh.disableImage(this.mImageDisabled);
    this.mWidth = 2 * carge.cBorder + cargh.scale_3(narrow_int(this.mImageNormal.getWidth_1() / 4));
    this.mHeight = 2 * carge.cBorder + cargh.scale_3(narrow_int(this.mImageNormal.getHeight_1() / 4));
    this.mESRImageNormal = this.mArea.getUIHelper().createImage_1("esrButtons.png");
    this.mImageScaling = 4 / cargh.getUIScaleFactor();
    this.mCurrentTool = 5;
    this.mSelectedButton = -1;
    this.mHighlightedButton = -1;
  };
  _.isSelectableButton = function isSelectableButton(b) {
    return b >= 0 && b < 2 * 17 && (b != this.mCurrentTool || b == 20 || b == 33) && (b != 19 || (this.mArea.getMode_0() & 4) != 0) && (b != 21 || (this.mArea.getMode_0() & 8) != 0);
  };
  _.paintContent = function paintContent_0(context) {
    var background, highlightBackground, isDark, l, selectedBackground, sh, sw;
    background = this.mToolbarCanvas.getBackgroundRGB_0();
    isDark = caru.perceivedBrightness_0(background) < 0.5;
    highlightBackground = isDark ? caru.brighter(background, 0.30000001192092896) : caru.darker(background, 0.6000000238418579);
    selectedBackground = isDark ? caru.brighter(background, 0.5) : caru.darker(background, 0.800000011920929);
    sw = this.mImageNormal.getWidth_1();
    sh = this.mImageNormal.getHeight_1();
    context.drawImage_1(this.mImageNormal, 0, 0, sw, sh, carge.cBorder, carge.cBorder, sw / this.mImageScaling, sh / this.mImageScaling);
    l = this.getButtonLocation(20);
    context.drawImage_1(this.mESRImageNormal, 0, this.mESRSelected * 84, 84, 84, l[0], l[1], carge.cButtonSize, carge.cButtonSize);
    if ((this.mArea.getMode_0() & 4) == 0)
      this.drawButton(context, 19, -1, true);
    if ((this.mArea.getMode_0() & 8) == 0)
      this.drawButton(context, 21, -1, true);
    this.drawButton(context, this.mCurrentTool, selectedBackground, false);
    if (this.mHighlightedButton != -1 && this.mHighlightedButton != this.mSelectedButton)
      this.drawButton(context, this.mHighlightedButton, highlightBackground, false);
    if (this.mSelectedButton != -1)
      this.drawButton(context, this.mSelectedButton, 7167924, false);
  };
  _.mCurrentTool = 0;
  _.mESRSelected = 0;
  _.mHeight = 0;
  _.mHighlightedButton = 0;
  _.mImageScaling = 0;
  _.mSelectedButton = 0;
  _.mWidth = 0;
  carge.cBorder = 0;
  carge.cButtonCleanStructure = 1;
  carge.cButtonClear = 0;
  carge.cButtonSize = 0;
  carge.cButtonUndo = 17;
  carge.cButtonsPerColumn = 17;
  carge.cImageOversize = 4;
  carge.cSourceButtonSize = 0;
  carge.cTool3Ring = 7;
  carge.cTool4Ring = 24;
  carge.cTool5Ring = 8;
  carge.cTool6Ring = 25;
  carge.cTool7Ring = 9;
  carge.cToolAromRing = 26;
  carge.cToolAtomBr = 15;
  carge.cToolAtomC = 11;
  carge.cToolAtomCl = 31;
  carge.cToolAtomF = 14;
  carge.cToolAtomH = 16;
  carge.cToolAtomI = 32;
  carge.cToolAtomN = 12;
  carge.cToolAtomO = 13;
  carge.cToolAtomP = 29;
  carge.cToolAtomS = 30;
  carge.cToolAtomSi = 28;
  carge.cToolChain = 22;
  carge.cToolCustomAtom = 33;
  carge.cToolDelete = 4;
  carge.cToolDownBond = 23;
  carge.cToolESR = 20;
  carge.cToolESRAbs = 101;
  carge.cToolESRAnd = 103;
  carge.cToolESROr = 102;
  carge.cToolLassoPointer = 2;
  carge.cToolMapper = 19;
  carge.cToolNegCharge = 27;
  carge.cToolPosCharge = 10;
  carge.cToolStdBond = 5;
  carge.cToolText = 21;
  carge.cToolUnknownParity = 3;
  carge.cToolUpBond = 6;
  carge.cToolZoom = 18;
  cggl.Lcom_actelion_research_gui_editor_GenericEditorToolbar_2_classLit = createForClass("com.actelion.research.gui.editor", "GenericEditorToolbar", 342, cggl.Ljava_lang_Object_2_classLit);
  carge.$clinit_TextDrawingObjectDialogBuilder = function $clinit_TextDrawingObjectDialogBuilder() {
    carge.$clinit_TextDrawingObjectDialogBuilder = emptyMethod;
    jl.$clinit_Object();
    carge.TEXT_STYLE = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [0, 2, 1, 2 | 1]);
    carge.TEXT_STYLE_LIST = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["plain", "italic", "bold", "italics & bold"]);
    carge.TEXT_SIZE_LIST = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["8", "9", "10", "12", "14", "18", "24", "32"]);
  };
  carge.TextDrawingObjectDialogBuilder = function TextDrawingObjectDialogBuilder(dialogHelper, textObject) {
    carge.$clinit_TextDrawingObjectDialogBuilder();
    Object_0.call(this);
    this.$init_158();
    this.mDialog = dialogHelper.createDialog_0("Edit Text", this);
    this.mTextObject = textObject;
    this.build_2();
  };
  defineClass(339, 1, { 109: 1, 1: 1 }, carge.TextDrawingObjectDialogBuilder);
  _.$init_158 = function $init_158() {
  };
  _.eventHappened_0 = function eventHappened_12(e) {
    this.eventHappened(castTo(e, 80));
  };
  _.build_2 = function build_2() {
    var hLayout, i, item_0, item$array, item$array0, item$index, item$index0, item$max, item$max0, styleIndex, vLayout;
    this.mComboBoxTextSize = this.mDialog.createComboBox_0();
    for (item$array0 = carge.TEXT_SIZE_LIST, item$index0 = 0, item$max0 = item$array0.length; item$index0 < item$max0; ++item$index0) {
      item_0 = item$array0[item$index0];
      this.mComboBoxTextSize.addItem_0(item_0);
    }
    this.mComboBoxTextSize.setEditable_0(true);
    this.mComboBoxTextSize.setSelectedItem_0("" + round_int(this.mTextObject.getSize_1()));
    this.mComboBoxStyle = this.mDialog.createComboBox_0();
    for (item$array = carge.TEXT_STYLE_LIST, item$index = 0, item$max = item$array.length; item$index < item$max; ++item$index) {
      item_0 = item$array[item$index];
      this.mComboBoxStyle.addItem_0(item_0);
    }
    styleIndex = 0;
    for (i = 0; i < carge.TEXT_STYLE.length; i++) {
      if (this.mTextObject.getStyle() == carge.TEXT_STYLE[i]) {
        styleIndex = i;
        break;
      }
    }
    this.mComboBoxStyle.setSelectedIndex_0(styleIndex);
    hLayout = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [8, -2, 4, -2, 8]);
    vLayout = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [8, -2, 4, -2, 8, -2, 8]);
    this.mDialog.setLayout_0(hLayout, vLayout);
    this.mDialog.add_8(this.mDialog.createLabel_0("Text size:"), 1, 1);
    this.mDialog.add_8(this.mComboBoxTextSize, 3, 1);
    this.mDialog.add_8(this.mDialog.createLabel_0("Text style:"), 1, 3);
    this.mDialog.add_8(this.mComboBoxStyle, 3, 3);
    this.mTextArea = this.mDialog.createTextField_0(20, 3);
    this.mTextArea.setText_0(this.mTextObject.getText_0());
    this.mDialog.add_9(this.mTextArea, 1, 5, 3, 5);
  };
  _.eventHappened = function eventHappened_11(e) {
    var nfe, textSize, textStyle;
    if (e.getWhat() == 0) {
      try {
        textSize = jl.parseInt_2(this.mComboBoxTextSize.getSelectedItem_0());
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 47)) {
          nfe = $e0;
          this.mDialog.showMessage_0("Illegal text size.");
          return;
        } else
          throw toJs($e0);
      }
      textStyle = carge.TEXT_STYLE[this.mComboBoxStyle.getSelectedIndex_0()];
      this.mTextObject.setValues(this.mTextArea.getText_0(), textSize, textStyle);
      this.mOKSelected = true;
    }
    this.mDialog.disposeDialog_0();
  };
  _.showDialog_0 = function showDialog_2() {
    this.mOKSelected = false;
    this.mDialog.showDialog_1();
    return this.mOKSelected;
  };
  _.mOKSelected = false;
  carge.serialVersionUID_8 = 537985829;
  cggl.Lcom_actelion_research_gui_editor_TextDrawingObjectDialogBuilder_2_classLit = createForClass("com.actelion.research.gui.editor", "TextDrawingObjectDialogBuilder", 339, cggl.Ljava_lang_Object_2_classLit);
  cargg.$clinit_GenericActionEvent = function $clinit_GenericActionEvent() {
    cargg.$clinit_GenericActionEvent = emptyMethod;
    cargg.$clinit_GenericEvent();
  };
  cargg.GenericActionEvent = function GenericActionEvent(source, what, value_0) {
    cargg.$clinit_GenericActionEvent();
    cargg.GenericEvent.call(this, what, source);
    this.$init_159();
    this.mValue = value_0;
  };
  defineClass(80, 185, { 80: 1, 1: 1 }, cargg.GenericActionEvent);
  _.$init_159 = function $init_159() {
  };
  _.getMessage = function getMessage_0() {
    return this.mMessage;
  };
  _.getValue = function getValue_0() {
    return this.mValue;
  };
  _.mValue = 0;
  cargg.WHAT_CANCEL = 1;
  cargg.WHAT_ITEM_SELECTED = 2;
  cargg.WHAT_OK = 0;
  cargg.WHAT_STATE_TOGGLED = 3;
  cggl.Lcom_actelion_research_gui_generic_GenericActionEvent_2_classLit = createForClass("com.actelion.research.gui.generic", "GenericActionEvent", 80, cggl.Lcom_actelion_research_gui_generic_GenericEvent_2_classLit);
  cargg.$clinit_GenericCanvas = function $clinit_GenericCanvas() {
    cargg.$clinit_GenericCanvas = emptyMethod;
  };
  cggl.Lcom_actelion_research_gui_generic_GenericCanvas_2_classLit = createForInterface("com.actelion.research.gui.generic", "GenericCanvas");
  cargg.$clinit_GenericEventSource = function $clinit_GenericEventSource() {
    cargg.$clinit_GenericEventSource = emptyMethod;
  };
  cggl.Lcom_actelion_research_gui_generic_GenericEventSource_2_classLit = createForInterface("com.actelion.research.gui.generic", "GenericEventSource");
  cargg.$clinit_GenericComponent = function $clinit_GenericComponent() {
    cargg.$clinit_GenericComponent = emptyMethod;
  };
  cggl.Lcom_actelion_research_gui_generic_GenericComponent_2_classLit = createForInterface("com.actelion.research.gui.generic", "GenericComponent");
  cargg.$clinit_GenericCheckBox = function $clinit_GenericCheckBox() {
    cargg.$clinit_GenericCheckBox = emptyMethod;
  };
  cggl.Lcom_actelion_research_gui_generic_GenericCheckBox_2_classLit = createForInterface("com.actelion.research.gui.generic", "GenericCheckBox");
  cargg.$clinit_GenericComboBox = function $clinit_GenericComboBox() {
    cargg.$clinit_GenericComboBox = emptyMethod;
  };
  cggl.Lcom_actelion_research_gui_generic_GenericComboBox_2_classLit = createForInterface("com.actelion.research.gui.generic", "GenericComboBox");
  cargg.$clinit_GenericCursorHelper = function $clinit_GenericCursorHelper() {
    cargg.$clinit_GenericCursorHelper = emptyMethod;
    jl.$clinit_Object();
    cargg.IMAGE_DATA_16 = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 2), { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 0, [stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [-1432180054, -1434146134, -1441453406, -1471067516, -1589095916, -2060839854, 1420461386, 1454022954, 1454024874]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [-1431677611, -1431764987, -1432092655, -1433403327, -1438646015, -1459616762, -1543499750, -1879031702, 1431634346, 1073809066, 1073814186, 1073834666, 1431677610]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [-1431737686, -1453057622, -1542187926, -1542188954, -1459351471, -1459351487, -1774190527, 1094713345, 1077936134, -1879048186, -1543503866, -1543503846, -1459617766, -1438646166, -1433403286, -1433403286]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [-1431737686, -1453057622, -1542187926, -1542188954, -1459351471, -1459351487, -1774190527, 1094713345, 1077952518, -1879031802, -1543154682, -1543487462, -1459601382, -1438646166, -1433403286, -1433403286]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [-1431655766, -1431655766, -1431741782, -1437330070, -1459351462, -1459351482, -1774190527, -1858076671, -1874853882, -1879048186, -1543503866, -1543503846, -1459617766, -1438646166, -1433403286, -1433403286]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [-1431655766, -1432005270, -1454374890, -1543503871, -1879048191, 1073741825, 1073741846, 1073743210, -1795073366, 1079421610, 1147841194, -1783977302, -1448432982, -1448432982, -1498764630]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [-1431655766, -1432005270, -1454374890, -1543438335, -1878982655, 1075138561, 1073807382, 1073808746, -1795073366, 1079421610, 1147841194, -1783977302, -1448432982, -1448432982, -1498764630]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1431655786, 1073741866, 1073741930, 1073741866, 1073741930, 1073741866, 1073741930, 1073741866, 1073741930, 1073741866, 1073741930, 1073741866, 1145324650]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1431655786, 1073741866, 1073741930, 1073741866, 1073741930, 1073741866, 1073758314, 1073758250, 1074091114, 1073758250, 1073758314, 1073741866, 1145324650]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [-1432003926, -1437248086, 1767548266, 1437248090, 1437248086, 1433053846, 1433037477, -1431672155, -1432004955, 1433037477, 1433037462, 1437248086, 1437248090, 1767548266, -1437248086, -1432003926]), null]);
    cargg.HOTSPOT_16 = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 7, 7, 5, 8, 7, 8, 7, 8, 7, 2, 14, 2, 14, 0, 0, 0, 0, 8, 8, 0, 0]);
    cargg.HOTSPOT_32 = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [4, 20, 10, 29, 18, 18, 18, 18, 18, 18, 16, 11, 16, 11, 4, 5, 4, 5, 16, 16, 16, 16, 0, 0, 0, 0, 12, 2]);
    cargg.IMAGE_NAME_32 = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["chain.png", "eraser.png", "hand.png", "handPlus.png", "fist.png", "lasso.png", "lassoPlus.png", "rect.png", "rectPlus.png", "zoom.png", "invisible.png", null, null, "pointingHand.png"]);
  };
  cargg.build16x16CursorImage = function build16x16CursorImage(image, cursor) {
    cargg.$clinit_GenericCursorHelper();
    var j, j0, k, row;
    if (jsNotEquals(cargg.IMAGE_DATA_16[cursor], null)) {
      for (j0 = 0; j0 < cargg.IMAGE_DATA_16[cursor].length; j0++) {
        row = cargg.IMAGE_DATA_16[cursor][j0];
        for (k = 15; k >= 0; k--) {
          if ((row & 3) == 0)
            image.setRGB_1(k, j0, -1);
          row >>= 2;
        }
      }
      for (j = 0; j < cargg.IMAGE_DATA_16[cursor].length; j++) {
        row = cargg.IMAGE_DATA_16[cursor][j];
        for (k = 15; k >= 0; k--) {
          if ((row & 3) == 1)
            image.setRGB_1(k, j, -16777216);
          row >>= 2;
        }
      }
    }
  };
  defineClass(651, 1, { 1: 1 });
  cargg.cChainCursor = 0;
  cargg.cCursorCount = 14;
  cargg.cDeleteCursor = 1;
  cargg.cFistCursor = 4;
  cargg.cHandCursor = 2;
  cargg.cHandPlusCursor = 3;
  cargg.cInvisibleCursor = 10;
  cargg.cLassoCursor = 5;
  cargg.cLassoPlusCursor = 6;
  cargg.cPointedHandCursor = 13;
  cargg.cPointerCursor = 11;
  cargg.cSelectRectCursor = 7;
  cargg.cSelectRectPlusCursor = 8;
  cargg.cTextCursor = 12;
  cargg.cZoomCursor = 9;
  cggl.Lcom_actelion_research_gui_generic_GenericCursorHelper_2_classLit = createForClass("com.actelion.research.gui.generic", "GenericCursorHelper", 651, cggl.Ljava_lang_Object_2_classLit);
  cargg.$clinit_GenericDepictor = function $clinit_GenericDepictor() {
    cargg.$clinit_GenericDepictor = emptyMethod;
    carc2.$clinit_AbstractDepictor();
  };
  cargg.GenericDepictor = function GenericDepictor(mol) {
    cargg.$clinit_GenericDepictor();
    carc2.AbstractDepictor.call(this, mol);
    this.$init_160();
  };
  defineClass(121, 161, { 121: 1, 1: 1 }, cargg.GenericDepictor);
  _.$init_160 = function $init_160() {
  };
  _.drawBlackLine = function drawBlackLine_0(theLine) {
    castTo(this.mContext, 89).drawLine_1(theLine.x1, theLine.y1, theLine.x2, theLine.y2);
  };
  _.drawDottedLine_0 = function drawDottedLine_0(theLine) {
    castTo(this.mContext, 89).drawDottedLine_1(theLine.x1, theLine.y1, theLine.x2, theLine.y2);
  };
  _.drawPolygon_0 = function drawPolygon_0(p) {
    castTo(this.mContext, 89).fillPolygon_0(p);
  };
  _.drawString_0 = function drawString_0(theString, x_0, y_0) {
    castTo(this.mContext, 89).drawCenteredString_0(x_0, y_0, theString);
  };
  _.fillCircle_0 = function fillCircle_0(x_0, y_0, d) {
    castTo(this.mContext, 89).fillCircle_0(x_0, y_0, d);
  };
  _.getStringWidth = function getStringWidth_0(theString) {
    return castTo(this.mContext, 89).getBounds_1(theString).getWidth_0();
  };
  _.getTextSize = function getTextSize_0() {
    return this.mTextSize;
  };
  _.hiliteAtomBackgrounds = function hiliteAtomBackgrounds_0(atomARGB, radius) {
    var alpha_0, atom, atomRadius, atomSquare, avbl, background, c, image, imageARGB, imageH, imageW, imageX, imageY, index_0, intensity, maxRadius, pixelARGB, rect, rx, ry, squareDistance, x_0, x0, y_0, y0;
    avbl = this.getTransformation().getScaling() * this.getMolecule_0().getAverageBondLength_0();
    maxRadius = jsEquals(radius, null) ? 0.6 * avbl : 0.75 * avbl;
    rect = this.simpleCalculateBounds();
    imageX = round_int($wnd.Math.floor(rect.x_0 - maxRadius));
    imageY = round_int($wnd.Math.floor(rect.y_0 - maxRadius));
    imageW = round_int($wnd.Math.ceil(rect.x_0 + rect.width_0 + maxRadius)) - imageX + 1;
    imageH = round_int($wnd.Math.ceil(rect.y_0 + rect.height_0 + maxRadius)) - imageY + 1;
    imageARGB = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, 4 * imageW * imageH, 15, 1);
    pixelARGB = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
    background = this.getBackgroundColor().getRGBColorComponents(null);
    for (atom = 0; atom < this.getMolecule_0().getAtoms_0(); atom++) {
      if ((atomARGB[atom] & -16777216) != 0) {
        x0 = toInt_0(jl.round_1(this.getAtomX_0(atom))) - imageX;
        y0 = toInt_0(jl.round_1(this.getAtomY_0(atom))) - imageY;
        alpha_0 = ((atomARGB[atom] & -16777216) >>> 24) / 255;
        pixelARGB[1] = ((atomARGB[atom] & 16711680) >> 16) / 255;
        pixelARGB[2] = ((atomARGB[atom] & 65280) >> 8) / 255;
        pixelARGB[3] = (atomARGB[atom] & 255) / 255;
        if (alpha_0 != 1) {
          pixelARGB[1] = background[0] + alpha_0 * (pixelARGB[1] - background[0]);
          pixelARGB[2] = background[1] + alpha_0 * (pixelARGB[2] - background[1]);
          pixelARGB[3] = background[2] + alpha_0 * (pixelARGB[3] - background[2]);
        }
        atomRadius = jsEquals(radius, null) ? round_int(maxRadius) : round_int(maxRadius * radius[atom]);
        atomSquare = atomRadius * atomRadius;
        for (rx = 0; rx <= atomRadius; rx++) {
          for (ry = 0; ry <= atomRadius; ry++) {
            squareDistance = rx * rx + ry * ry;
            if (squareDistance <= atomSquare) {
              pixelARGB[0] = 1 - $wnd.Math.sqrt(squareDistance) / atomRadius;
              if (rx != 0 && ry != 0)
                this.mixInColor(imageARGB, 4 * ((y0 - ry) * imageW + x0 - rx), pixelARGB);
              if (ry != 0)
                this.mixInColor(imageARGB, 4 * ((y0 - ry) * imageW + x0 + rx), pixelARGB);
              if (rx != 0)
                this.mixInColor(imageARGB, 4 * ((y0 + ry) * imageW + x0 - rx), pixelARGB);
              this.mixInColor(imageARGB, 4 * ((y0 + ry) * imageW + x0 + rx), pixelARGB);
            }
          }
        }
      }
    }
    image = castTo(this.mContext, 89).createARGBImage_0(imageW, imageH);
    index_0 = 0;
    for (y_0 = 0; y_0 < imageH; y_0++) {
      for (x_0 = 0; x_0 < imageW; x_0++) {
        c = 0;
        if (imageARGB[index_0] != 0) {
          if (imageARGB[index_0] > 1) {
            intensity = imageARGB[index_0++];
            c = -16777216;
            c += round_int(255 * imageARGB[index_0++] / intensity) << 16;
            c += round_int(255 * imageARGB[index_0++] / intensity) << 8;
            c += round_int(255 * imageARGB[index_0++] / intensity);
          } else {
            c = round_int(255 * imageARGB[index_0++]) << 24;
            c += round_int(255 * imageARGB[index_0++]) << 16;
            c += round_int(255 * imageARGB[index_0++]) << 8;
            c += round_int(255 * imageARGB[index_0++]);
          }
        } else {
          index_0 += 4;
        }
        image.setRGB_1(x_0, y_0, c);
      }
    }
    castTo(this.mContext, 89).drawImage_0(image, imageX, imageY);
  };
  _.init = function init_6() {
    getClassPrototype(161).init.call(this);
    this.mLineWidth = 1;
  };
  _.mixInColor = function mixInColor(imageARGB, index_0, pixelARGB) {
    var newIntensity, oldIntensity;
    if (imageARGB[index_0] == 0) {
      imageARGB[index_0++] = pixelARGB[0];
      imageARGB[index_0++] = pixelARGB[1];
      imageARGB[index_0++] = pixelARGB[2];
      imageARGB[index_0++] = pixelARGB[3];
    } else {
      oldIntensity = imageARGB[index_0];
      newIntensity = imageARGB[index_0] + pixelARGB[0];
      imageARGB[index_0] = newIntensity;
      index_0++;
      imageARGB[index_0] = (imageARGB[index_0] * oldIntensity + pixelARGB[1] * pixelARGB[0]) / newIntensity;
      index_0++;
      imageARGB[index_0] = (imageARGB[index_0] * oldIntensity + pixelARGB[2] * pixelARGB[0]) / newIntensity;
      index_0++;
      imageARGB[index_0] = (imageARGB[index_0] * oldIntensity + pixelARGB[3] * pixelARGB[0]) / newIntensity;
    }
  };
  _.setLineWidth_0 = function setLineWidth_0(lineWidth) {
    this.mLineWidth = lineWidth;
    castTo(this.mContext, 89).setLineWidth_1(this.mLineWidth);
  };
  _.setRGB_0 = function setRGB_0(rgb) {
    castTo(this.mContext, 89).setRGB_0(rgb);
  };
  _.setTextSize = function setTextSize_0(theSize) {
    this.mTextSize = theSize;
    if (jsNotEquals(this.mContext, null))
      castTo(this.mContext, 89).setFont_0(theSize, false, false);
  };
  _.mLineWidth = 0;
  _.mTextSize = 0;
  cggl.Lcom_actelion_research_gui_generic_GenericDepictor_2_classLit = createForClass("com.actelion.research.gui.generic", "GenericDepictor", 121, cggl.Lcom_actelion_research_chem_AbstractDepictor_2_classLit);
  cargg.$clinit_GenericDialog = function $clinit_GenericDialog() {
    cargg.$clinit_GenericDialog = emptyMethod;
    cargg.PREFERRED = -2;
    cargg.FILL = -1;
  };
  cargg.FILL = 0;
  cargg.PREFERRED = 0;
  cggl.Lcom_actelion_research_gui_generic_GenericDialog_2_classLit = createForInterface("com.actelion.research.gui.generic", "GenericDialog");
  cargg.$clinit_GenericDrawContext = function $clinit_GenericDrawContext() {
    cargg.$clinit_GenericDrawContext = emptyMethod;
  };
  cggl.Lcom_actelion_research_gui_generic_GenericDrawContext_2_classLit = createForInterface("com.actelion.research.gui.generic", "GenericDrawContext");
  cargg.$clinit_GenericEventHandler = function $clinit_GenericEventHandler() {
    cargg.$clinit_GenericEventHandler = emptyMethod;
    jl.$clinit_Object();
  };
  cargg.GenericEventHandler = function GenericEventHandler(source) {
    cargg.$clinit_GenericEventHandler();
    Object_0.call(this);
    this.$init_161();
    this.mSource = source;
    this.mListeners = new ju.ArrayList();
  };
  defineClass(245, 1, { 1: 1 });
  _.$init_161 = function $init_161() {
  };
  _.addListener = function addListener(e) {
    this.mListeners.add(e);
  };
  _.fireEvent = function fireEvent(e) {
    var gel, gel$iterator;
    for (gel$iterator = this.mListeners.iterator(); gel$iterator.hasNext_0(); ) {
      gel = castTo(gel$iterator.next_3(), 109);
      gel.eventHappened_0(e);
    }
  };
  _.getSource = function getSource_0() {
    return this.mSource;
  };
  cggl.Lcom_actelion_research_gui_generic_GenericEventHandler_2_classLit = createForClass("com.actelion.research.gui.generic", "GenericEventHandler", 245, cggl.Ljava_lang_Object_2_classLit);
  cargg.$clinit_GenericImage = function $clinit_GenericImage() {
    cargg.$clinit_GenericImage = emptyMethod;
  };
  cggl.Lcom_actelion_research_gui_generic_GenericImage_2_classLit = createForInterface("com.actelion.research.gui.generic", "GenericImage");
  cargg.$clinit_GenericKeyEvent = function $clinit_GenericKeyEvent() {
    cargg.$clinit_GenericKeyEvent = emptyMethod;
    cargg.$clinit_GenericEvent();
    cargg.KEY_CTRL = -1;
    cargg.KEY_ALT = -2;
    cargg.KEY_SHIFT = -3;
    cargg.KEY_DELETE = -4;
    cargg.KEY_BACK_SPACE = -5;
    cargg.KEY_HELP = -6;
    cargg.KEY_ESCAPE = -7;
    cargg.KEY_ENTER = -8;
  };
  cargg.GenericKeyEvent = function GenericKeyEvent(what, key, isAltDown, isCtrlDown, isShiftDown, isMenuShortcut, source) {
    cargg.$clinit_GenericKeyEvent();
    cargg.GenericEvent.call(this, what, source);
    this.$init_162();
    this.mKey = key;
    this.mIsAltDown = isAltDown;
    this.mIsCtrlDown = isCtrlDown;
    this.mIsShiftDown = isShiftDown;
    this.mIsMenuShortcut = isMenuShortcut;
  };
  defineClass(175, 185, { 175: 1, 1: 1 }, cargg.GenericKeyEvent);
  _.$init_162 = function $init_162() {
  };
  _.getKey = function getKey() {
    return this.mKey;
  };
  _.isAltDown = function isAltDown_0() {
    return this.mIsAltDown;
  };
  _.isMenuShortcut = function isMenuShortcut_0() {
    return this.mIsMenuShortcut;
  };
  _.isShiftDown = function isShiftDown_0() {
    return this.mIsShiftDown;
  };
  _.mIsAltDown = false;
  _.mIsCtrlDown = false;
  _.mIsMenuShortcut = false;
  _.mIsShiftDown = false;
  _.mKey = 0;
  cargg.KEY_ALT = 0;
  cargg.KEY_BACK_SPACE = 0;
  cargg.KEY_CTRL = 0;
  cargg.KEY_DELETE = 0;
  cargg.KEY_ENTER = 0;
  cargg.KEY_ESCAPE = 0;
  cargg.KEY_HELP = 0;
  cargg.KEY_PRESSED = 1;
  cargg.KEY_RELEASED = 2;
  cargg.KEY_SHIFT = 0;
  cggl.Lcom_actelion_research_gui_generic_GenericKeyEvent_2_classLit = createForClass("com.actelion.research.gui.generic", "GenericKeyEvent", 175, cggl.Lcom_actelion_research_gui_generic_GenericEvent_2_classLit);
  cargg.$clinit_GenericLabel = function $clinit_GenericLabel() {
    cargg.$clinit_GenericLabel = emptyMethod;
  };
  cggl.Lcom_actelion_research_gui_generic_GenericLabel_2_classLit = createForInterface("com.actelion.research.gui.generic", "GenericLabel");
  cargg.$clinit_GenericMouseEvent = function $clinit_GenericMouseEvent() {
    cargg.$clinit_GenericMouseEvent = emptyMethod;
    cargg.$clinit_GenericEvent();
    cargg.WHAT_MESSAGE = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["none", "pressed", "released", "clicked", "entered", "exited", "moved", "dragged"]);
  };
  cargg.GenericMouseEvent = function GenericMouseEvent(what, button, clickCount, x_0, y_0, shiftDown, controlDown, altDown, isPopupTrigger, source) {
    cargg.$clinit_GenericMouseEvent();
    cargg.GenericEvent.call(this, what, source);
    this.$init_163();
    this.mButton = button;
    this.mClickCount = clickCount;
    this.mX = x_0;
    this.mY = y_0;
    this.mShiftDown = shiftDown;
    this.mControlDown = controlDown;
    this.mAltDown = altDown;
    this.mIsPopupTrigger = isPopupTrigger;
  };
  defineClass(134, 185, { 134: 1, 1: 1 }, cargg.GenericMouseEvent);
  _.$init_163 = function $init_163() {
  };
  _.getButton = function getButton() {
    return this.mButton;
  };
  _.getClickCount = function getClickCount() {
    return this.mClickCount;
  };
  _.getX_1 = function getX_0() {
    return this.mX;
  };
  _.getY_1 = function getY_0() {
    return this.mY;
  };
  _.isAltDown = function isAltDown_1() {
    return this.mAltDown;
  };
  _.isControlDown = function isControlDown() {
    return this.mControlDown;
  };
  _.isPopupTrigger = function isPopupTrigger_0() {
    return this.mIsPopupTrigger;
  };
  _.isShiftDown = function isShiftDown_1() {
    return this.mShiftDown;
  };
  _.toString_0 = function toString_19() {
    return cargg.WHAT_MESSAGE[this.getWhat()] + " x:" + this.mX + " y:" + this.mY + " button:" + this.mButton + " clicks:" + this.mClickCount + (this.mShiftDown ? " shift" : "") + (this.mControlDown ? " ctrl" : "") + (this.mAltDown ? " alt" : "") + " isPopup:" + (this.mIsPopupTrigger ? "y" : "n");
  };
  _.mAltDown = false;
  _.mButton = 0;
  _.mClickCount = 0;
  _.mControlDown = false;
  _.mIsPopupTrigger = false;
  _.mShiftDown = false;
  _.mX = 0;
  _.mY = 0;
  cargg.MOUSE_CLICKED = 3;
  cargg.MOUSE_DRAGGED = 7;
  cargg.MOUSE_ENTERED = 4;
  cargg.MOUSE_EXITED = 5;
  cargg.MOUSE_MOVED = 6;
  cargg.MOUSE_PRESSED = 1;
  cargg.MOUSE_RELEASED = 2;
  cggl.Lcom_actelion_research_gui_generic_GenericMouseEvent_2_classLit = createForClass("com.actelion.research.gui.generic", "GenericMouseEvent", 134, cggl.Lcom_actelion_research_gui_generic_GenericEvent_2_classLit);
  cargg.$clinit_GenericPoint = function $clinit_GenericPoint() {
    cargg.$clinit_GenericPoint = emptyMethod;
    jl.$clinit_Object();
  };
  cargg.GenericPoint = function GenericPoint() {
    cargg.$clinit_GenericPoint();
    Object_0.call(this);
    this.$init_164();
  };
  cargg.GenericPoint_0 = function GenericPoint_0(x_0, y_0) {
    cargg.$clinit_GenericPoint();
    Object_0.call(this);
    this.$init_164();
    this.x_0 = x_0;
    this.y_0 = y_0;
  };
  defineClass(67, 1, { 67: 1, 1: 1 }, cargg.GenericPoint, cargg.GenericPoint_0);
  _.$init_164 = function $init_164() {
  };
  _.getX_2 = function getX_1() {
    return this.x_0;
  };
  _.getY_2 = function getY_1() {
    return this.y_0;
  };
  _.toString_0 = function toString_20() {
    return "x:" + this.x_0 + " y:" + this.y_0;
  };
  _.x_0 = 0;
  _.y_0 = 0;
  cggl.Lcom_actelion_research_gui_generic_GenericPoint_2_classLit = createForClass("com.actelion.research.gui.generic", "GenericPoint", 67, cggl.Ljava_lang_Object_2_classLit);
  cargg.$clinit_GenericShape = function $clinit_GenericShape() {
    cargg.$clinit_GenericShape = emptyMethod;
  };
  cggl.Lcom_actelion_research_gui_generic_GenericShape_2_classLit = createForInterface("com.actelion.research.gui.generic", "GenericShape");
  cargg.$clinit_GenericPolygon = function $clinit_GenericPolygon() {
    cargg.$clinit_GenericPolygon = emptyMethod;
    jl.$clinit_Object();
  };
  cargg.GenericPolygon = function GenericPolygon() {
    cargg.$clinit_GenericPolygon();
    Object_0.call(this);
    this.$init_165();
    this.mX = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 64, 15, 1);
    this.mY = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 64, 15, 1);
    this.mIndex = 0;
  };
  cargg.GenericPolygon_0 = function GenericPolygon_0(size_0) {
    cargg.$clinit_GenericPolygon();
    Object_0.call(this);
    this.$init_165();
    this.mX = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, size_0, 15, 1);
    this.mY = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, size_0, 15, 1);
    this.mIndex = 0;
  };
  defineClass(135, 1, { 1: 1 }, cargg.GenericPolygon, cargg.GenericPolygon_0);
  _.$init_165 = function $init_165() {
  };
  _.addPoint = function addPoint(x_0, y_0) {
    if (this.mIndex == this.mX.length) {
      this.mX = ju.copyOf_8(this.mX, 2 * this.mIndex);
      this.mY = ju.copyOf_8(this.mY, 2 * this.mIndex);
    }
    this.mX[this.mIndex] = x_0;
    this.mY[this.mIndex] = y_0;
    this.mIndex++;
  };
  _.clear_0 = function clear_7() {
    this.mIndex = 0;
  };
  _.contains_0 = function contains_4(x_0, y_0) {
    var i, j, result;
    result = false;
    j = this.mIndex - 1;
    for (i = 0; i < this.mIndex; i++) {
      if (this.mY[i] > y_0 != this.mY[j] > y_0 && x_0 < (this.mX[j] - this.mX[i]) * (y_0 - this.mY[i]) / (this.mY[j] - this.mY[i]) + this.mX[i])
        result = !result;
      j = i;
    }
    return result;
  };
  _.getSize_0 = function getSize_5() {
    return this.mIndex;
  };
  _.getX_0 = function getX_2(i) {
    return this.mX[i];
  };
  _.getY_0 = function getY_2(i) {
    return this.mY[i];
  };
  _.removeLastPoint = function removeLastPoint() {
    if (this.mIndex > 0)
      this.mIndex--;
  };
  _.mIndex = 0;
  cggl.Lcom_actelion_research_gui_generic_GenericPolygon_2_classLit = createForClass("com.actelion.research.gui.generic", "GenericPolygon", 135, cggl.Ljava_lang_Object_2_classLit);
  cargg.$clinit_GenericPopupMenu = function $clinit_GenericPopupMenu() {
    cargg.$clinit_GenericPopupMenu = emptyMethod;
  };
  cggl.Lcom_actelion_research_gui_generic_GenericPopupMenu_2_classLit = createForInterface("com.actelion.research.gui.generic", "GenericPopupMenu");
  cargg.$clinit_GenericRectangle = function $clinit_GenericRectangle() {
    cargg.$clinit_GenericRectangle = emptyMethod;
    jl.$clinit_Object();
  };
  cargg.GenericRectangle = function GenericRectangle() {
    cargg.$clinit_GenericRectangle();
    Object_0.call(this);
    this.$init_166();
  };
  cargg.GenericRectangle_0 = function GenericRectangle_0(x_0, y_0, w, h) {
    cargg.$clinit_GenericRectangle();
    Object_0.call(this);
    this.$init_166();
    this.x_0 = x_0;
    this.y_0 = y_0;
    this.width_0 = w;
    this.height_0 = h;
  };
  defineClass(32, 1, { 32: 1, 1: 1 }, cargg.GenericRectangle, cargg.GenericRectangle_0);
  _.$init_166 = function $init_166() {
  };
  _.contains_0 = function contains_5(x_0, y_0) {
    return x_0 >= this.x_0 && x_0 <= this.x_0 + this.width_0 && y_0 >= this.y_0 && y_0 <= this.y_0 + this.height_0;
  };
  _.contains_2 = function contains_6(r) {
    return this.contains_0(r.x_0, r.y_0) && this.contains_0(r.x_0 + r.width_0, r.y_0 + r.height_0);
  };
  _.getHeight_0 = function getHeight_1() {
    return this.height_0;
  };
  _.getWidth_0 = function getWidth_1() {
    return this.width_0;
  };
  _.getX_2 = function getX_3() {
    return this.x_0;
  };
  _.getY_2 = function getY_3() {
    return this.y_0;
  };
  _.set_2 = function set_5(x_0, y_0, w, h) {
    this.x_0 = x_0;
    this.y_0 = y_0;
    this.width_0 = w;
    this.height_0 = h;
  };
  _.toString_0 = function toString_21() {
    return "x:" + this.x_0 + " y:" + this.y_0 + " w:" + this.width_0 + " h:" + this.height_0;
  };
  _.union = function union(r) {
    var h, w, x_0, y_0;
    x_0 = $wnd.Math.min(this.x_0, r.x_0);
    y_0 = $wnd.Math.min(this.y_0, r.y_0);
    w = $wnd.Math.max(this.x_0 + this.width_0, r.x_0 + r.width_0) - x_0;
    h = $wnd.Math.max(this.y_0 + this.height_0, r.y_0 + r.height_0) - y_0;
    return new cargg.GenericRectangle_0(x_0, y_0, w, h);
  };
  _.height_0 = 0;
  _.width_0 = 0;
  _.x_0 = 0;
  _.y_0 = 0;
  cggl.Lcom_actelion_research_gui_generic_GenericRectangle_2_classLit = createForClass("com.actelion.research.gui.generic", "GenericRectangle", 32, cggl.Ljava_lang_Object_2_classLit);
  cargg.$clinit_GenericTextField = function $clinit_GenericTextField() {
    cargg.$clinit_GenericTextField = emptyMethod;
  };
  cggl.Lcom_actelion_research_gui_generic_GenericTextField_2_classLit = createForInterface("com.actelion.research.gui.generic", "GenericTextField");
  cargg.$clinit_GenericUIHelper = function $clinit_GenericUIHelper() {
    cargg.$clinit_GenericUIHelper = emptyMethod;
  };
  cggl.Lcom_actelion_research_gui_generic_GenericUIHelper_2_classLit = createForInterface("com.actelion.research.gui.generic", "GenericUIHelper");
  cargh.$clinit_HiDPIHelper = function $clinit_HiDPIHelper() {
    cargh.$clinit_HiDPIHelper = emptyMethod;
    jl.$clinit_Object();
    cargh.sUIScaleFactor = -1;
  };
  cargh.disableImage = function disableImage(image) {
    cargh.$clinit_HiDPIHelper();
    var argb, gray, grayRGB, x_0, y_0;
    gray = caru.brighter_0(new ja.Color_0(238, 238, 238), 0.800000011920929);
    grayRGB = 16777215 & gray.getRGB_0();
    for (x_0 = 0; x_0 < image.getWidth_1(); x_0++) {
      for (y_0 = 0; y_0 < image.getHeight_1(); y_0++) {
        argb = image.getRGB_1(x_0, y_0);
        image.setRGB_1(x_0, y_0, (-16777216 & argb) + grayRGB);
      }
    }
  };
  cargh.getDevicePixelRatio = function getDevicePixelRatio() {
    return globalThis.devicePixelRatio || 1;
  };
  cargh.getUIScaleFactor = function getUIScaleFactor() {
    cargh.$clinit_HiDPIHelper();
    if (cargh.sUIScaleFactor == -1) {
      cargh.sUIScaleFactor = cargh.getDevicePixelRatio();
    }
    return cargh.sUIScaleFactor;
  };
  cargh.scale_3 = function scale_3(value_0) {
    cargh.$clinit_HiDPIHelper();
    return jl.round_2(cargh.getUIScaleFactor() * value_0);
  };
  defineClass(749, 1, { 1: 1 });
  cargh.sUIScaleFactor = 0;
  cggl.Lcom_actelion_research_gui_hidpi_HiDPIHelper_2_classLit = createForClass("com.actelion.research.gui.hidpi", "HiDPIHelper", 749, cggl.Ljava_lang_Object_2_classLit);
  cargh.$clinit_HiDPIIcon = function $clinit_HiDPIIcon() {
    cargh.$clinit_HiDPIIcon = emptyMethod;
    jl.$clinit_Object();
    cargh.ICON_SPOT_COLOR = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [5258420, 0]);
    cargh.DARK_LAF_SPOT_COLOR = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [11837695, 14737632]);
  };
  cargh.adaptForLookAndFeel = function adaptForLookAndFeel(image) {
    cargh.$clinit_HiDPIIcon();
    if (jsNotEquals(cargh.sSpotColor, null))
      cargh.replaceSpotColors(image, cargh.sSpotColor);
    else if (carg.isDarkLookAndFeel())
      cargh.replaceSpotColors(image, cargh.DARK_LAF_SPOT_COLOR);
  };
  cargh.replaceSpotColors = function replaceSpotColors(image, altRGB) {
    var argb, i, rgb, x_0, y_0;
    for (x_0 = 0; x_0 < image.getWidth_1(); x_0++) {
      for (y_0 = 0; y_0 < image.getHeight_1(); y_0++) {
        argb = image.getRGB_1(x_0, y_0);
        rgb = argb & 16777215;
        for (i = 0; i < cargh.ICON_SPOT_COLOR.length; i++) {
          if (rgb == cargh.ICON_SPOT_COLOR[i]) {
            image.setRGB_1(x_0, y_0, (-16777216 & argb) + altRGB[i]);
            break;
          }
        }
      }
    }
  };
  defineClass(766, 1, { 1: 1 });
  cargh.sSpotColor = null;
  cggl.Lcom_actelion_research_gui_hidpi_HiDPIIcon_2_classLit = createForClass("com.actelion.research.gui.hidpi", "HiDPIIcon", 766, cggl.Ljava_lang_Object_2_classLit);
  cggcc.$clinit_EntryPoint = function $clinit_EntryPoint() {
    cggcc.$clinit_EntryPoint = emptyMethod;
  };
  cggl.Lcom_google_gwt_core_client_EntryPoint_2_classLit = createForInterface("com.google.gwt.core.client", "EntryPoint");
  cargj.$clinit_JsEntrypoint = function $clinit_JsEntrypoint() {
    cargj.$clinit_JsEntrypoint = emptyMethod;
    jl.$clinit_Object();
  };
  cargj.JsEntrypoint = function JsEntrypoint() {
    cargj.$clinit_JsEntrypoint();
    Object_0.call(this);
    this.$init_167();
  };
  defineClass(284, 1, { 502: 1, 1: 1 }, cargj.JsEntrypoint);
  _.$init_167 = function $init_167() {
  };
  _.onModuleLoad = function onModuleLoad() {
  };
  cggl.Lcom_actelion_research_gwt_js_JsEntrypoint_2_classLit = createForClass("com.actelion.research.gwt.js", "JsEntrypoint", 284, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSCanonizer = function $clinit_JSCanonizer() {
    cargja.$clinit_JSCanonizer = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSCanonizer = function JSCanonizer(mol, options) {
    cargja.$clinit_JSCanonizer();
    Object_0.call(this);
    this.$init_168();
    this.canonizer = new carc2.Canonizer_0(mol.getStereoMolecule(), this.getMode_1(options));
  };
  defineClass(507, 1, { 1: 1 }, cargja.JSCanonizer);
  _.$init_168 = function $init_168() {
  };
  _.getCanMolecule = function getCanMolecule_0(includeExplicitHydrogen) {
    var mol;
    mol = this.canonizer.getCanMolecule_0(includeExplicitHydrogen);
    return new cargja.JSMolecule_1(mol);
  };
  _.getEncodedCoordinates = function getEncodedCoordinates_1(keepPositionAndScale) {
    return this.canonizer.getEncodedCoordinates_1(keepPositionAndScale);
  };
  _.getEncodedMapping = function getEncodedMapping_0() {
    return this.canonizer.getEncodedMapping_0();
  };
  _.getFinalRank = function getFinalRank_0() {
    return this.canonizer.getFinalRank_0();
  };
  _.getGraphAtoms = function getGraphAtoms_0() {
    return this.canonizer.getGraphAtoms_0();
  };
  _.getGraphIndexes = function getGraphIndexes_0() {
    return this.canonizer.getGraphIndexes_0();
  };
  _.getIDCode = function getIDCode_4() {
    return this.canonizer.getIDCode_0();
  };
  _.getMode_1 = function getMode_0(options) {
    options = options || {};
    var mode = 0;
    if (options.createSymmetryRank)
      mode |= 1;
    if (options.considerStereoheterotopicity)
      mode |= 2;
    if (options.encodeAtomCustomLabels)
      mode |= 8;
    if (options.encodeAtomSelection)
      mode |= 16;
    if (options.assignParitiesToTetrahedralN)
      mode |= 32;
    if (options.coordsAre3d)
      mode |= 64;
    if (options.createPseudoStereoGroups)
      mode |= 128;
    if (options.distinguishRacemicOrGroups)
      mode |= 256;
    if (options.tieBreakFreeValenceAtoms)
      mode |= 512;
    if (options.encodeAtomCustomLabelsWithoutRanking)
      mode |= 1024;
    if (options.neglectAnyStereoInformation)
      mode |= 2048;
    return mode;
  };
  _.getSymmetryRank = function getSymmetryRank_1(atom) {
    return this.canonizer.getSymmetryRank_0(atom);
  };
  _.getSymmetryRanks = function getSymmetryRanks_0() {
    return this.canonizer.getSymmetryRanks_0();
  };
  _.hasCIPParityDistinctionProblem = function hasCIPParityDistinctionProblem_0() {
    return this.canonizer.hasCIPParityDistinctionProblem_0();
  };
  _.invalidateCoordinates = function invalidateCoordinates_0() {
    this.canonizer.invalidateCoordinates_0();
  };
  _.normalizeEnantiomer = function normalizeEnantiomer_0() {
    return this.canonizer.normalizeEnantiomer_0();
  };
  _.setParities = function setParities_0() {
    this.canonizer.setParities_0();
  };
  cggl.Lcom_actelion_research_gwt_js_api_JSCanonizer_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSCanonizer", 507, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSCanonizerUtil = function $clinit_JSCanonizerUtil() {
    cargja.$clinit_JSCanonizerUtil = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSCanonizerUtil = function JSCanonizerUtil() {
    cargja.$clinit_JSCanonizerUtil();
    Object_0.call(this);
    this.$init_169();
  };
  cargja.getIDCode_5 = function getIDCode_5(mol, type_0) {
    cargja.$clinit_JSCanonizerUtil();
    switch (type_0) {
      case 0:
        return carc2.getIDCode_0(mol.getStereoMolecule(), (carc2.$clinit_CanonizerUtil$IDCODE_TYPE(), carc2.NORMAL), false);
      case 1:
        return carc2.getIDCode_0(mol.getStereoMolecule(), (carc2.$clinit_CanonizerUtil$IDCODE_TYPE(), carc2.NOSTEREO), false);
      case 2:
        return carc2.getIDCode_0(mol.getStereoMolecule(), (carc2.$clinit_CanonizerUtil$IDCODE_TYPE(), carc2.BACKBONE), false);
      case 3:
        return carc2.getIDCode_0(mol.getStereoMolecule(), (carc2.$clinit_CanonizerUtil$IDCODE_TYPE(), carc2.TAUTOMER), false);
      case 4:
        return carc2.getIDCode_0(mol.getStereoMolecule(), (carc2.$clinit_CanonizerUtil$IDCODE_TYPE(), carc2.NOSTEREO_TAUTOMER), false);
      default:
        return carc2.getIDCode_0(mol.getStereoMolecule(), (carc2.$clinit_CanonizerUtil$IDCODE_TYPE(), carc2.NORMAL), false);
    }
  };
  defineClass(575, 1, { 1: 1 }, cargja.JSCanonizerUtil);
  _.$init_169 = function $init_169() {
  };
  cargja.BACKBONE_0 = 2;
  cargja.NORMAL_0 = 0;
  cargja.NOSTEREO_0 = 1;
  cargja.NOSTEREO_TAUTOMER_0 = 4;
  cargja.TAUTOMER_0 = 3;
  cggl.Lcom_actelion_research_gwt_js_api_JSCanonizerUtil_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSCanonizerUtil", 575, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSConformerGenerator = function $clinit_JSConformerGenerator() {
    cargja.$clinit_JSConformerGenerator = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSConformerGenerator = function JSConformerGenerator(seed) {
    cargja.$clinit_JSConformerGenerator();
    Object_0.call(this);
    this.$init_170();
    cargja.checkHasRegistered();
    this.oclGenerator = new ooccg.ConformerGenerator_0(fromInt_0(seed), false);
  };
  defineClass(576, 1, { 1: 1 }, cargja.JSConformerGenerator);
  _.$init_170 = function $init_170() {
  };
  _.getConformerCount = function getConformerCount() {
    return this.oclGenerator.getConformerCount_0();
  };
  _.getNextConformerAsMolecule = function getNextConformerAsMolecule(mol) {
    var arg, newMol;
    arg = isNull(mol) ? null : mol.getStereoMolecule();
    newMol = this.oclGenerator.getNextConformerAsMolecule_0(arg);
    if (isNull(newMol))
      return null;
    if (jsEquals(newMol, arg))
      return mol;
    return new cargja.JSMolecule_1(newMol);
  };
  _.getOneConformerAsMolecule = function getOneConformerAsMolecule(mol) {
    var result;
    result = this.oclGenerator.getOneConformerAsMolecule_0(mol.getStereoMolecule());
    return isNull(result) ? null : mol;
  };
  _.getPotentialConformerCount = function getPotentialConformerCount() {
    return this.oclGenerator.getPotentialConformerCount_0();
  };
  _.initializeConformers_0 = function initializeConformers(mol, strategy, maxTorsionSets, use60degreeSteps) {
    return this.oclGenerator.initializeConformers_1(mol.getStereoMolecule(), strategy, maxTorsionSets, use60degreeSteps);
  };
  _.initializeConformers = function initializeConformers_0(mol, options) {
    if (options === void 0)
      options = {};
    var strategy = options.strategy;
    if (strategy === void 0)
      strategy = 3;
    var maxTorsionSets = options.maxTorsionSets;
    if (maxTorsionSets === void 0)
      maxTorsionSets = 1e5;
    var use60degreeSteps = options.use60degreeSteps;
    if (use60degreeSteps === void 0)
      use60degreeSteps = false;
    return this.initializeConformers_0(mol, strategy, maxTorsionSets, use60degreeSteps);
  };
  cargja.STRATEGY_ADAPTIVE_RANDOM = 4;
  cargja.STRATEGY_LIKELY_RANDOM = 3;
  cargja.STRATEGY_LIKELY_SYSTEMATIC = 1;
  cargja.STRATEGY_PURE_RANDOM = 2;
  cggl.Lcom_actelion_research_gwt_js_api_JSConformerGenerator_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSConformerGenerator", 576, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSDrugScoreCalculator = function $clinit_JSDrugScoreCalculator() {
    cargja.$clinit_JSDrugScoreCalculator = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSDrugScoreCalculator = function JSDrugScoreCalculator() {
    cargja.$clinit_JSDrugScoreCalculator();
    Object_0.call(this);
    this.$init_171();
  };
  cargja.calculate_0 = function calculate_0(mCLogP, mSolubility, mMolweight, mDruglikeness, toxRisks) {
    cargja.$clinit_JSDrugScoreCalculator();
    return carcp.calculate(mCLogP, mSolubility, mMolweight, mDruglikeness, toxRisks);
  };
  defineClass(577, 1, { 1: 1 }, cargja.JSDrugScoreCalculator);
  _.$init_171 = function $init_171() {
  };
  cggl.Lcom_actelion_research_gwt_js_api_JSDrugScoreCalculator_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSDrugScoreCalculator", 577, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSDruglikenessPredictor = function $clinit_JSDruglikenessPredictor() {
    cargja.$clinit_JSDruglikenessPredictor = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSDruglikenessPredictor = function JSDruglikenessPredictor() {
    cargja.$clinit_JSDruglikenessPredictor();
    Object_0.call(this);
    this.$init_172();
    cargja.checkHasRegistered();
    this.predictor = new carcp.DruglikenessPredictor();
  };
  defineClass(578, 1, { 1: 1 }, cargja.JSDruglikenessPredictor);
  _.$init_172 = function $init_172() {
  };
  _.assessDruglikeness = function assessDruglikeness_0(molecule) {
    return this.predictor.assessDruglikeness_0(molecule.getStereoMolecule(), cargju.getInstance_1());
  };
  _.getDetail = function getDetail_4() {
    var detail;
    detail = this.predictor.getDetail_1();
    if (isNull(detail)) {
      this.throwDetailError();
    }
    return cargju.convertParameterizedStringList(detail);
  };
  _.getDruglikenessString = function getDruglikenessString_0(molecule) {
    return this.predictor.getDruglikenessString_0(molecule.getStereoMolecule());
  };
  _.throwDetailError = function throwDetailError() {
    throw new Error("drug likeness must be assessed first");
  };
  cargja.DRUGLIKENESS_UNKNOWN = -999;
  cggl.Lcom_actelion_research_gwt_js_api_JSDruglikenessPredictor_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSDruglikenessPredictor", 578, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSForceFieldMMFF94 = function $clinit_JSForceFieldMMFF94() {
    cargja.$clinit_JSForceFieldMMFF94 = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSForceFieldMMFF94 = function JSForceFieldMMFF94(molecule, tablename, options) {
    cargja.$clinit_JSForceFieldMMFF94();
    Object_0.call(this);
    this.$init_173();
    cargja.checkHasRegistered();
    cargja.initializeTables(tablename);
    this.oclMmff = new carcfm.ForceFieldMMFF94_0(molecule.getStereoMolecule(), tablename, new ju.HashMap());
  };
  cargja.initializeTables = function initializeTables(tablename) {
    if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(tablename, "MMFF94") && !cargja.isMMFF94Init) {
      carcfm.initialize_4("MMFF94");
      cargja.isMMFF94Init = true;
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(tablename, "MMFF94s") && !cargja.isMMFF94SInit) {
      carcfm.initialize_4("MMFF94s");
      cargja.isMMFF94SInit = true;
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(tablename, "MMFF94s+") && !cargja.isMMFF94SPLUSInit) {
      carcfm.initialize_4("MMFF94s+");
      cargja.isMMFF94SPLUSInit = true;
    }
  };
  defineClass(579, 1, { 1: 1 }, cargja.JSForceFieldMMFF94);
  _.$init_173 = function $init_173() {
  };
  _._minimise = function _minimise(maxIts, gradTol, funcTol) {
    return this.oclMmff.minimise_0(maxIts, gradTol, funcTol);
  };
  _.getTotalEnergy = function getTotalEnergy_2() {
    return this.oclMmff.getTotalEnergy_0();
  };
  _.size = function size_4() {
    return this.oclMmff.size_1();
  };
  cargja.MMFF94_0 = "MMFF94";
  cargja.MMFF94S_0 = "MMFF94s";
  cargja.MMFF94SPLUS_0 = "MMFF94s+";
  cargja.isMMFF94Init = false;
  cargja.isMMFF94SInit = false;
  cargja.isMMFF94SPLUSInit = false;
  cggl.Lcom_actelion_research_gwt_js_api_JSForceFieldMMFF94_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSForceFieldMMFF94", 579, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSMolecule = function $clinit_JSMolecule() {
    cargja.$clinit_JSMolecule = emptyMethod;
    jl.$clinit_Object();
    cargja.rectangle = new cargg.GenericRectangle();
    cargja.CANONIZER_CONSIDER_STEREOHETEROTOPICITY = 2 | 4;
    cargja.cHelperRingsSimple_0 = 1 | 2;
    cargja.cHelperRings_0 = 3 | 4;
    cargja.cHelperParities_0 = 7 | 8;
    cargja.cHelperCIP_0 = 15 | 16;
    cargja.cHelperSymmetrySimple_0 = 31 | 32;
    cargja.cHelperSymmetryStereoHeterotopicity_0 = 31 | 64;
    cargja.cDefaultAllowedPseudoAtoms_0 = 1 | 64 | 256;
    cargja.cAtomLabel_0 = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["?", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In", "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At", "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "R4", "R5", "R6", "R7", "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15", "R16", "R1", "R2", "R3", "A", "A1", "A2", "A3", "??", "??", "D", "T", "X", "R", "H2", "H+", "Nnn", "HYD", "Pol", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "??", "Ala", "Arg", "Asn", "Asp", "Cys", "Gln", "Glu", "Gly", "His", "Ile", "Leu", "Lys", "Met", "Phe", "Pro", "Ser", "Thr", "Trp", "Tyr", "Val"]);
    cargja.cRoundedMass_0 = stampJavaTypeInfo(getClassLiteralForArray(cggl.S_classLit, 1), { 4: 1, 1: 1, 13: 1 }, 5, 15, [0, 1, 4, 7, 9, 11, 12, 14, 16, 19, 20, 23, 24, 27, 28, 31, 32, 35, 40, 39, 40, 45, 48, 51, 52, 55, 56, 59, 58, 63, 64, 69, 74, 75, 80, 79, 84, 85, 88, 89, 90, 93, 98, 0, 102, 103, 106, 107, 114, 115, 120, 121, 130, 127, 132, 133, 138, 139, 140, 141, 142, 0, 152, 153, 158, 159, 164, 165, 166, 169, 174, 175, 180, 181, 184, 187, 192, 193, 195, 197, 202, 205, 208, 209, 209, 210, 222, 223, 226, 227, 232, 231, 238, 237, 244, 243, 247, 247, 251, 252, 257, 258, 259, 262, 267, 268, 271, 270, 277, 276, 281, 281, 283, 285, 289, 289, 293, 294, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 156, 114, 115, 103, 128, 129, 57, 137, 113, 113, 128, 131, 147, 97, 87, 101, 186, 163, 99]);
    cargja.cAtomValence_0 = stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 2), { 68: 1, 4: 1, 1: 1, 7: 1 }, 8, 0, [null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [0]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [0]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 3, 5, 7]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [0]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), null, null, null, null, null, null, null, null, null, null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 3, 5, 7]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [0, 2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), null, null, null, null, null, null, null, null, null, null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 3, 5, 7]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [0, 2, 4, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2])]);
    cargja.cCommonOxidationState_0 = stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 2), { 68: 1, 4: 1, 1: 1, 7: 1 }, 8, 0, [null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), null, null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-1]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-1]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3, 4, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3, 4, 7]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-3, 3, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-1]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4, 6, 7]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-3, 3, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-2, 4, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-1]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4, 6, 7]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-2, 2, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [-1, 1]), null, stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [1]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [4, 5]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4, 5, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4, 5, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4, 5, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4, 5, 6]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3, 4]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.B_classLit, 1), { 8: 1, 4: 1, 1: 1 }, 5, 15, [3])]);
    cargja.FISCHER_PROJECTION_LIMIT_0 = 3.141592653589793 / 36;
    cargja.STEREO_ANGLE_LIMIT = 3.141592653589793 / 36;
    cargja.VALIDATION_ERRORS_STEREO_0 = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["Members of ESR groups must only be stereo centers with known configuration.", "Over- or under-specified stereo feature or more than one racemic type bond", "Ambiguous configuration at stereo center because of 2 parallel bonds"]);
  };
  cargja.JSMolecule = function JSMolecule() {
    cargja.$clinit_JSMolecule();
    cargja.JSMolecule_0.call(this, 32, 32, null);
  };
  cargja.JSMolecule_0 = function JSMolecule_0(maxAtoms, maxBonds, mol) {
    cargja.$clinit_JSMolecule();
    Object_0.call(this);
    this.$init_174();
    if (isNotNull(mol)) {
      this.oclMolecule = mol;
    } else {
      this.oclMolecule = new carc2.StereoMolecule_0(maxAtoms, maxBonds);
    }
  };
  cargja.JSMolecule_1 = function JSMolecule_1(mol) {
    cargja.$clinit_JSMolecule();
    cargja.JSMolecule_0.call(this, 0, 0, mol);
  };
  cargja.createMolfileWithAtomMap = function createMolfileWithAtomMap(mol, map_0) {
    return { molecule: mol, map: map_0 };
  };
  cargja.fromIDCode = function fromIDCode(idcode, coordinates) {
    cargja.$clinit_JSMolecule();
    var mol;
    if (typeof coordinates === "undefined") {
      coordinates = true;
    }
    if (typeof coordinates === "boolean") {
      mol = cargja.fromIDCode_1(idcode, coordinates);
    } else if (typeof coordinates === "string") {
      mol = cargja.fromIDCode_0(idcode, coordinates);
    }
    return mol;
  };
  cargja.fromIDCode_0 = function fromIDCode_0(idcode, coordinates) {
    return new cargja.JSMolecule_1(new carc2.IDCodeParser(false).getCompactMolecule_0(idcode, coordinates));
  };
  cargja.fromIDCode_1 = function fromIDCode_1(idcode, ensure2DCoordinates) {
    return new cargja.JSMolecule_1(new carc2.IDCodeParser(ensure2DCoordinates).getCompactMolecule(idcode));
  };
  cargja.fromMolfile = function fromMolfile(molfile) {
    cargja.$clinit_JSMolecule();
    return new cargja.JSMolecule_1(new carc2.MolfileParser().getCompactMolecule(molfile));
  };
  cargja.fromMolfileWithAtomMap = function fromMolfileWithAtomMap(molfile) {
    cargja.$clinit_JSMolecule();
    var map_0, mol, parser;
    parser = new carc2.MolfileParser_0(1);
    mol = parser.getCompactMolecule(molfile);
    map_0 = parser.getHandleHydrogenMap_0();
    return cargja.createMolfileWithAtomMap(new cargja.JSMolecule_1(mol), map_0);
  };
  cargja.fromSmiles = function fromSmiles(smiles, options) {
    cargja.$clinit_JSMolecule();
    options = options || {};
    var createCoordinates = !options.noCoordinates;
    var readStereoFeatures = !options.noStereo;
    return cargja.fromSmiles_0(smiles, createCoordinates, readStereoFeatures);
  };
  cargja.fromSmiles_0 = function fromSmiles_0(smiles, createCoordinates, readStereoFeatures) {
    var mol, parser;
    parser = new carc2.SmilesParser();
    mol = new cargja.JSMolecule();
    parser.parse_9(mol.oclMolecule, jl.getBytes___B__devirtual$(smiles), createCoordinates, readStereoFeatures);
    return mol;
  };
  cargja.getAngle_3 = function getAngle_3(x1, y1, x2, y2) {
    cargja.$clinit_JSMolecule();
    return carc2.getAngle_0(x1, y1, x2, y2);
  };
  cargja.getAngleDif_1 = function getAngleDif_1(angle1, angle2) {
    cargja.$clinit_JSMolecule();
    return carc2.getAngleDif(angle1, angle2);
  };
  cargja.getAtomicNoFromLabel_1 = function getAtomicNoFromLabel_1(atomLabel, allowedPseudoAtomGroups) {
    cargja.$clinit_JSMolecule();
    return carc2.getAtomicNoFromLabel_0(atomLabel, allowedPseudoAtomGroups);
  };
  cargja.getDefaultAverageBondLength_0 = function getDefaultAverageBondLength_0() {
    cargja.$clinit_JSMolecule();
    return carc2.getDefaultAverageBondLength();
  };
  cargja.isAtomicNoElectronegative_0 = function isAtomicNoElectronegative_0(atomicNo) {
    cargja.$clinit_JSMolecule();
    return carc2.isAtomicNoElectronegative(atomicNo);
  };
  cargja.isAtomicNoElectropositive_0 = function isAtomicNoElectropositive_0(atomicNo) {
    cargja.$clinit_JSMolecule();
    return carc2.isAtomicNoElectropositive(atomicNo);
  };
  cargja.setDefaultAverageBondLength_0 = function setDefaultAverageBondLength_0(defaultAVBL) {
    cargja.$clinit_JSMolecule();
    carc2.setDefaultAverageBondLength(defaultAVBL);
  };
  defineClass(46, 1, { 46: 1, 1: 1 }, cargja.JSMolecule, cargja.JSMolecule_0, cargja.JSMolecule_1);
  _.$init_174 = function $init_174() {
  };
  _.addAtom = function addAtom_3(atomicNo) {
    return this.oclMolecule.addAtom_2(atomicNo);
  };
  _.addBond = function addBond_1(atom1, atom2) {
    return this.oclMolecule.addBond_0(atom1, atom2);
  };
  _.addFragment = function addFragment_0(sourceMol, rootAtom, atomMap) {
    this.oclMolecule.addFragment_0(sourceMol.getStereoMolecule(), rootAtom, atomMap);
  };
  _.addImplicitHydrogens_0 = function addImplicitHydrogens_1() {
    carcc2.addImplicitHydrogens(this.oclMolecule);
  };
  _.addImplicitHydrogens_1 = function addImplicitHydrogens_2(atomNumber) {
    carcc2.addImplicitHydrogens_0(this.oclMolecule, atomNumber);
  };
  _.addImplicitHydrogens = function addImplicitHydrogens_3(atomNumber) {
    if (atomNumber === void 0) {
      this.addImplicitHydrogens_0();
    } else {
      this.addImplicitHydrogens_1(atomNumber);
    }
  };
  _.addMissingChirality_0 = function addMissingChirality_1() {
    carcc2.addMissingChirality(this.oclMolecule);
  };
  _.addMissingChirality_1 = function addMissingChirality_2(esrType) {
    carcc2.addMissingChirality_0(this.oclMolecule, esrType);
  };
  _.addMissingChirality = function addMissingChirality_3(esrType) {
    if (esrType === void 0) {
      this.addMissingChirality_0();
    } else {
      this.addMissingChirality_1(esrType);
    }
  };
  _.addMolecule = function addMolecule_3(mol) {
    return this.oclMolecule.addMolecule_0(mol.getStereoMolecule());
  };
  _.addOrChangeAtom = function addOrChangeAtom_0(x_0, y_0, atomicNo, mass, abnormalValence, radical, customLabel) {
    return this.oclMolecule.addOrChangeAtom_0(x_0, y_0, atomicNo, mass, abnormalValence, radical, customLabel);
  };
  _.addOrChangeBond = function addOrChangeBond_0(atm1, atm2, type_0) {
    return this.oclMolecule.addOrChangeBond_0(atm1, atm2, type_0);
  };
  _.addRing = function addRing_0(x_0, y_0, ringSize, aromatic, bondLength) {
    return this.oclMolecule.addRing_0(x_0, y_0, ringSize, aromatic, bondLength);
  };
  _.addRingToAtom = function addRingToAtom_0(atom, ringSize, aromatic, bondLength) {
    return this.oclMolecule.addRingToAtom_0(atom, ringSize, aromatic, bondLength);
  };
  _.addRingToBond = function addRingToBond_0(bond, ringSize, aromatic, bondLength) {
    return this.oclMolecule.addRingToBond_0(bond, ringSize, aromatic, bondLength);
  };
  _.addSubstituent = function addSubstituent_0(substituent, connectionAtom) {
    return this.oclMolecule.addSubstituent_0(substituent.getStereoMolecule(), connectionAtom);
  };
  _.calculateTorsion = function calculateTorsion_1(atom) {
    return this.oclMolecule.calculateTorsion_0(atom);
  };
  _.canonizeCharge = function canonizeCharge_1(allowUnbalancedCharge) {
    return this.oclMolecule.canonizeCharge_0(allowUnbalancedCharge);
  };
  _.changeAtom = function changeAtom_1(atom, atomicNo, mass, abnormalValence, radical) {
    return this.oclMolecule.changeAtom_0(atom, atomicNo, mass, abnormalValence, radical);
  };
  _.changeAtomCharge = function changeAtomCharge_1(atom, positive) {
    return this.oclMolecule.changeAtomCharge_1(atom, positive);
  };
  _.changeBond = function changeBond_0(bnd, type_0) {
    return this.oclMolecule.changeBond_0(bnd, type_0);
  };
  _.clear = function clear_8() {
    this.oclMolecule.clear_0();
  };
  _.convertStereoBondsToSingleBonds = function convertStereoBondsToSingleBonds_0(atom) {
    this.oclMolecule.convertStereoBondsToSingleBonds_0(atom);
  };
  _.copyAtom = function copyAtom_0(destMol, sourceAtom, esrGroupOffsetAND, esrGroupOffsetOR) {
    return this.oclMolecule.copyAtom_0(destMol.getStereoMolecule(), sourceAtom, esrGroupOffsetAND, esrGroupOffsetOR);
  };
  _.copyBond = function copyBond_1(destMol, sourceBond, esrGroupOffsetAND, esrGroupOffsetOR, atomMap, useBondTypeDelocalized) {
    return this.oclMolecule.copyBond_1(destMol.getStereoMolecule(), sourceBond, esrGroupOffsetAND, esrGroupOffsetOR, atomMap, useBondTypeDelocalized);
  };
  _.copyMolecule = function copyMolecule_1(destMol) {
    this.oclMolecule.copyMolecule_0(destMol.getStereoMolecule());
  };
  _.copyMoleculeByAtoms = function copyMoleculeByAtoms_0(destMol, includeAtom, recognizeDelocalizedBonds, atomMap) {
    this.oclMolecule.copyMoleculeByAtoms_0(destMol.getStereoMolecule(), includeAtom, recognizeDelocalizedBonds, atomMap);
  };
  _.copyMoleculeByBonds = function copyMoleculeByBonds_0(destMol, includeBond, recognizeDelocalizedBonds, atomMap) {
    return this.oclMolecule.copyMoleculeByBonds_0(destMol.getStereoMolecule(), includeBond, recognizeDelocalizedBonds, atomMap);
  };
  _.copyMoleculeProperties = function copyMoleculeProperties_1(destMol) {
    this.oclMolecule.copyMoleculeProperties_0(destMol.getStereoMolecule());
  };
  _.deleteAtom = function deleteAtom_1(atom) {
    this.oclMolecule.deleteAtom_0(atom);
  };
  _.deleteAtomOrBond = function deleteAtomOrBond_0(x_0, y_0) {
    return this.oclMolecule.deleteAtomOrBond_0(x_0, y_0);
  };
  _.deleteAtoms = function deleteAtoms_1(atomList) {
    return this.oclMolecule.deleteAtoms_0(atomList);
  };
  _.deleteBond = function deleteBond_0(bond) {
    this.oclMolecule.deleteBond_0(bond);
  };
  _.deleteBondAndSurrounding = function deleteBondAndSurrounding_0(bond) {
    this.oclMolecule.deleteBondAndSurrounding_0(bond);
  };
  _.deleteMarkedAtomsAndBonds = function deleteMarkedAtomsAndBonds_0() {
    return this.oclMolecule.deleteMarkedAtomsAndBonds_0();
  };
  _.deleteMolecule = function deleteMolecule_0() {
    this.oclMolecule.clear_0();
  };
  _.deleteSelectedAtoms = function deleteSelectedAtoms_0() {
    return this.oclMolecule.deleteSelectedAtoms_0();
  };
  _.ensureHelperArrays = function ensureHelperArrays_1(required) {
    this.oclMolecule.ensureHelperArrays_0(required);
  };
  _.findAlleneCenterAtom = function findAlleneCenterAtom_0(atom) {
    return this.oclMolecule.findAlleneCenterAtom_0(atom);
  };
  _.findAlleneEndAtom = function findAlleneEndAtom_0(atom1, atom2) {
    return this.oclMolecule.findAlleneEndAtom_0(atom1, atom2);
  };
  _.findAtom = function findAtom_0(pickx, picky) {
    return this.oclMolecule.findAtom_0(pickx, picky);
  };
  _.findBINAPChiralityBond = function findBINAPChiralityBond_0(atom) {
    return this.oclMolecule.findBINAPChiralityBond_0(atom);
  };
  _.findBond = function findBond_0(pickx, picky) {
    return this.oclMolecule.findBond_0(pickx, picky);
  };
  _.findRingSystem = function findRingSystem_0(startAtom, aromaticOnly, isMemberAtom, isMemberBond) {
    this.oclMolecule.findRingSystem_0(startAtom, aromaticOnly, isMemberAtom, isMemberBond);
  };
  _.getAbsoluteAtomParity = function getAbsoluteAtomParity_0(atom) {
    return this.oclMolecule.getAbsoluteAtomParity_0(atom);
  };
  _.getAbsoluteBondParity = function getAbsoluteBondParity_0(bond) {
    return this.oclMolecule.getAbsoluteBondParity_0(bond);
  };
  _.getAllAtoms = function getAllAtoms_0() {
    return this.oclMolecule.getAllAtoms_0();
  };
  _.getAllBonds = function getAllBonds_0() {
    return this.oclMolecule.getAllBonds_0();
  };
  _.getAllConnAtoms = function getAllConnAtoms_0(atom) {
    return this.oclMolecule.getAllConnAtoms_0(atom);
  };
  _.getAllConnAtomsPlusMetalBonds = function getAllConnAtomsPlusMetalBonds_0(atom) {
    return this.oclMolecule.getAllConnAtomsPlusMetalBonds_0(atom);
  };
  _.getAllHydrogens = function getAllHydrogens_0(atom) {
    return this.oclMolecule.getAllHydrogens_0(atom);
  };
  _.getAromaticRingCount = function getAromaticRingCount_0() {
    return this.oclMolecule.getAromaticRingCount_0();
  };
  _.getAtomAbnormalValence = function getAtomAbnormalValence_0(atom) {
    return this.oclMolecule.getAtomAbnormalValence_0(atom);
  };
  _.getAtomCIPParity = function getAtomCIPParity_0(atom) {
    return this.oclMolecule.getAtomCIPParity_0(atom);
  };
  _.getAtomCharge = function getAtomCharge_0(atom) {
    return this.oclMolecule.getAtomCharge_0(atom);
  };
  _.getAtomColor = function getAtomColor_0(atom) {
    return this.oclMolecule.getAtomColor_0(atom);
  };
  _.getAtomCustomLabel = function getAtomCustomLabel_0(atom) {
    return this.oclMolecule.getAtomCustomLabel_0(atom);
  };
  _.getAtomESRGroup = function getAtomESRGroup_0(atom) {
    return this.oclMolecule.getAtomESRGroup_0(atom);
  };
  _.getAtomESRType = function getAtomESRType_0(atom) {
    return this.oclMolecule.getAtomESRType_0(atom);
  };
  _.getAtomLabel = function getAtomLabel_0(atom) {
    return this.oclMolecule.getAtomLabel_0(atom);
  };
  _.getAtomList = function getAtomList_0(atom) {
    return this.oclMolecule.getAtomList_0(atom);
  };
  _.getAtomListString = function getAtomListString_0(atom) {
    return this.oclMolecule.getAtomListString_0(atom);
  };
  _.getAtomMapNo = function getAtomMapNo_0(atom) {
    return this.oclMolecule.getAtomMapNo_0(atom);
  };
  _.getAtomMass = function getAtomMass_0(atom) {
    return this.oclMolecule.getAtomMass_0(atom);
  };
  _.getAtomParity = function getAtomParity_0(atom) {
    return this.oclMolecule.getAtomParity_0(atom);
  };
  _.getAtomPi = function getAtomPi_1(atom) {
    return this.oclMolecule.getAtomPi_0(atom);
  };
  _.getAtomPreferredStereoBond = function getAtomPreferredStereoBond_0(atom) {
    return this.oclMolecule.getAtomPreferredStereoBond_0(atom);
  };
  _.getAtomQueryFeaturesObject = function getAtomQueryFeaturesObject(atom) {
    return cargju.getAtomQueryFeatures_0(this.oclMolecule, atom);
  };
  _.getAtomRadical = function getAtomRadical_0(atom) {
    return this.oclMolecule.getAtomRadical_0(atom);
  };
  _.getAtomRingBondCount = function getAtomRingBondCount_0(atom) {
    return this.oclMolecule.getAtomRingBondCount_0(atom);
  };
  _.getAtomRingCount = function getAtomRingCount_0(atom, maxRingSize) {
    return this.oclMolecule.getAtomRingCount_0(atom, maxRingSize);
  };
  _.getAtomRingSize = function getAtomRingSize_1(atom) {
    return this.oclMolecule.getAtomRingSize_0(atom);
  };
  _.getAtomX = function getAtomX_2(atom) {
    return this.oclMolecule.getAtomX_0(atom);
  };
  _.getAtomY = function getAtomY_2(atom) {
    return this.oclMolecule.getAtomY_0(atom);
  };
  _.getAtomZ = function getAtomZ_0(atom) {
    return this.oclMolecule.getAtomZ_0(atom);
  };
  _.getAtomicNo = function getAtomicNo_1(atom) {
    return this.oclMolecule.getAtomicNo_0(atom);
  };
  _.getAtoms = function getAtoms_0() {
    return this.oclMolecule.getAtoms_0();
  };
  _.getAverageBondLength = function getAverageBondLength_6(nonHydrogenBondsOnly) {
    return this.oclMolecule.getAverageBondLength_5(nonHydrogenBondsOnly);
  };
  _.getAverageTopologicalAtomDistance = function getAverageTopologicalAtomDistance_0() {
    return this.oclMolecule.getAverageTopologicalAtomDistance_0();
  };
  _.getBond = function getBond_0(atom1, atom2) {
    return this.oclMolecule.getBond_0(atom1, atom2);
  };
  _.getBondAngle = function getBondAngle_0(atom1, atom2) {
    return this.oclMolecule.getBondAngle_0(atom1, atom2);
  };
  _.getBondAtom = function getBondAtom_0(no, bond) {
    return this.oclMolecule.getBondAtom_0(no, bond);
  };
  _.getBondBridgeMaxSize = function getBondBridgeMaxSize_0(bond) {
    return this.oclMolecule.getBondBridgeMaxSize_0(bond);
  };
  _.getBondBridgeMinSize = function getBondBridgeMinSize_0(bond) {
    return this.oclMolecule.getBondBridgeMinSize_0(bond);
  };
  _.getBondCIPParity = function getBondCIPParity_0(bond) {
    return this.oclMolecule.getBondCIPParity_0(bond);
  };
  _.getBondESRGroup = function getBondESRGroup_0(bond) {
    return this.oclMolecule.getBondESRGroup_0(bond);
  };
  _.getBondESRType = function getBondESRType_0(bond) {
    return this.oclMolecule.getBondESRType_0(bond);
  };
  _.getBondLength = function getBondLength_1(bond) {
    return this.oclMolecule.getBondLength_0(bond);
  };
  _.getBondOrder = function getBondOrder_0(bond) {
    return this.oclMolecule.getBondOrder_0(bond);
  };
  _.getBondParity = function getBondParity_0(bnd) {
    return this.oclMolecule.getBondParity_0(bnd);
  };
  _.getBondPreferredStereoBond = function getBondPreferredStereoBond_0(bond) {
    return this.oclMolecule.getBondPreferredStereoBond_0(bond);
  };
  _.getBondQueryFeatures = function getBondQueryFeatures_0(bnd) {
    return this.oclMolecule.getBondQueryFeatures_0(bnd);
  };
  _.getBondQueryFeaturesObject = function getBondQueryFeaturesObject(atom) {
    return cargju.getBondQueryFeatures_1(this.oclMolecule, atom);
  };
  _.getBondRingSize = function getBondRingSize_1(bond) {
    return this.oclMolecule.getBondRingSize_0(bond);
  };
  _.getBondType = function getBondType_2(bond) {
    return this.oclMolecule.getBondType_0(bond);
  };
  _.getBondTypeSimple = function getBondTypeSimple_0(bond) {
    return this.oclMolecule.getBondTypeSimple_0(bond);
  };
  _.getBonds = function getBonds_0() {
    return this.oclMolecule.getBonds_0();
  };
  _.getBounds = function getBounds_0() {
    var r;
    r = this.oclMolecule.getBounds_0(cargja.rectangle);
    if (isNull(r))
      return null;
    return this.getBounds_2(r.x_0, r.y_0, r.width_0, r.height_0);
  };
  _.getBounds_2 = function getBounds_1(x_0, y_0, width_0, height) {
    return { x: x_0, y: y_0, width: width_0, height };
  };
  _.getCanonizedIDCode = function getCanonizedIDCode(flag) {
    var canonizer;
    canonizer = new carc2.Canonizer_0(this.oclMolecule, flag);
    return canonizer.getIDCode_0();
  };
  _.getChiralText = function getChiralText_1() {
    return this.oclMolecule.getChiralText_0();
  };
  _.getChirality = function getChirality_0() {
    return this.oclMolecule.getChirality_0();
  };
  _.getCompactCopy = function getCompactCopy_0() {
    return new cargja.JSMolecule_1(this.oclMolecule.getCompactCopy_0());
  };
  _.getConnAtom = function getConnAtom_0(atom, i) {
    return this.oclMolecule.getConnAtom_0(atom, i);
  };
  _.getConnAtoms = function getConnAtoms_1(atom) {
    return this.oclMolecule.getConnAtoms_0(atom);
  };
  _.getConnBond = function getConnBond_0(atom, i) {
    return this.oclMolecule.getConnBond_0(atom, i);
  };
  _.getConnBondOrder = function getConnBondOrder_0(atom, i) {
    return this.oclMolecule.getConnBondOrder_0(atom, i);
  };
  _.getDefaultMaxValenceUncharged = function getDefaultMaxValenceUncharged_0(atom) {
    return this.oclMolecule.getDefaultMaxValenceUncharged_0(atom);
  };
  _.getDiastereotopicAtomIDs = function getDiastereotopicAtomIDs() {
    return carcc2.getAtomIds(this.oclMolecule);
  };
  _.getElectronValenceCorrection = function getElectronValenceCorrection_1(atom, occupiedValence) {
    return this.oclMolecule.getElectronValenceCorrection_0(atom, occupiedValence);
  };
  _.getExcludedNeighbourCount = function getExcludedNeighbourCount_0(atom) {
    return this.oclMolecule.getExcludedNeighbourCount_0(atom);
  };
  _.getExplicitHydrogens = function getExplicitHydrogens_1(atom) {
    return this.oclMolecule.getExplicitHydrogens_0(atom);
  };
  _.getFinalRanks = function getFinalRanks(flag) {
    var canonizer;
    canonizer = new carc2.Canonizer_0(this.oclMolecule, flag);
    return canonizer.getFinalRank_0();
  };
  _.getFisherProjectionParity = function getFisherProjectionParity_0(atom, sortedConnMap, angle, direction) {
    return this.oclMolecule.getFisherProjectionParity_0(atom, sortedConnMap, angle, direction);
  };
  _.getFragmentAtoms = function getFragmentAtoms_2(rootAtom, considerMetalBonds) {
    return this.oclMolecule.getFragmentAtoms_1(rootAtom, considerMetalBonds);
  };
  _.getFragmentNumbers = function getFragmentNumbers_1(fragmentNo, markedAtomsOnly, considerMetalBonds) {
    return this.oclMolecule.getFragmentNumbers_0(fragmentNo, markedAtomsOnly, considerMetalBonds);
  };
  _.getFragments = function getFragments_2() {
    var fragments, i, newFragments;
    fragments = this.oclMolecule.getFragments_0();
    newFragments = initUnidimensionalArray(cggl.Lcom_actelion_research_gwt_js_api_JSMolecule_2_classLit, { 194: 1, 4: 1, 1: 1, 7: 1 }, 46, fragments.length, 0, 1);
    for (i = 0; i < fragments.length; i++) {
      setCheck(newFragments, i, new cargja.JSMolecule_1(fragments[i]));
    }
    return newFragments;
  };
  _.getFreeValence = function getFreeValence_0(atom) {
    return this.oclMolecule.getFreeValence_0(atom);
  };
  _.getHandleHydrogenMap = function getHandleHydrogenMap_1() {
    return this.oclMolecule.getHandleHydrogenMap_0();
  };
  _.getHelperArrayStatus = function getHelperArrayStatus_0() {
    return this.oclMolecule.getHelperArrayStatus_0();
  };
  _.getHoseCodes = function getHoseCodes_0(options) {
    options = options || {};
    var maxSphereSize = (typeof options.maxSphereSize === "undefined" ? 5 : options.maxSphereSize) | 0;
    var type_0 = (typeof options.type === "undefined" ? 0 : options.type) | 0;
    return carcc2.getHoseCodes(this.oclMolecule, maxSphereSize, type_0);
  };
  _.getIDCode = function getIDCode_6() {
    var idCode;
    idCode = this.oclMolecule.getIDCode_0();
    if (jsEquals(idCode, null)) {
      idCode = new carc2.Canonizer(this.oclMolecule).getIDCode_0();
    }
    return idCode;
  };
  _.getIDCodeAndCoordinates = function getIDCodeAndCoordinates() {
    return { idCode: this.getIDCode(), coordinates: this.getIDCoordinates() };
  };
  _.getIDCoordinates = function getIDCoordinates_0() {
    var idCoordinates;
    idCoordinates = this.oclMolecule.getIDCoordinates_0();
    if (jsEquals(idCoordinates, null)) {
      idCoordinates = new carc2.Canonizer(this.oclMolecule).getEncodedCoordinates_0();
    }
    return idCoordinates;
  };
  _.getImplicitHigherValence = function getImplicitHigherValence_0(atom, neglectExplicitHydrogen) {
    return this.oclMolecule.getImplicitHigherValence_0(atom, neglectExplicitHydrogen);
  };
  _.getImplicitHydrogens = function getImplicitHydrogens_1(atom) {
    return this.oclMolecule.getImplicitHydrogens_1(atom);
  };
  _.getIndex = function getIndex() {
    return cargju.createSSSearcherIndex(this.oclMolecule);
  };
  _.getLowestFreeValence = function getLowestFreeValence_1(atom) {
    return this.oclMolecule.getLowestFreeValence_0(atom);
  };
  _.getMaxAtoms = function getMaxAtoms_0() {
    return this.oclMolecule.getMaxAtoms_0();
  };
  _.getMaxBonds = function getMaxBonds_0() {
    return this.oclMolecule.getMaxBonds_0();
  };
  _.getMaxValence = function getMaxValence_0(atom) {
    return this.oclMolecule.getMaxValence_0(atom);
  };
  _.getMaxValenceUncharged = function getMaxValenceUncharged_0(atom) {
    return this.oclMolecule.getMaxValenceUncharged_0(atom);
  };
  _.getMetalBondedConnAtoms = function getMetalBondedConnAtoms_0(atom) {
    return this.oclMolecule.getMetalBondedConnAtoms_0(atom);
  };
  _.getMolecularFormula = function getMolecularFormula() {
    return new cargja.MolecularFormula_0(this.oclMolecule);
  };
  _.getMoleculeColor = function getMoleculeColor_0() {
    return this.oclMolecule.getMoleculeColor_0();
  };
  _.getMolweight = function getMolweight_0() {
    return this.oclMolecule.getMolweight_0();
  };
  _.getName = function getName_5() {
    return this.oclMolecule.getName_0();
  };
  _.getNonHydrogenNeighbourCount = function getNonHydrogenNeighbourCount_0(atom) {
    return this.oclMolecule.getNonHydrogenNeighbourCount_0(atom);
  };
  _.getNumberOfHydrogens = function getNumberOfHydrogens_0() {
    return carcc2.getNumberOfHydrogens(this.oclMolecule);
  };
  _.getOccupiedValence = function getOccupiedValence_1(atom) {
    return this.oclMolecule.getOccupiedValence_0(atom);
  };
  _.getPath = function getPath_1(pathAtom, atom1, atom2, maxLength, neglectBond) {
    return this.oclMolecule.getPath_0(pathAtom, atom1, atom2, maxLength, neglectBond);
  };
  _.getPathBonds = function getPathBonds_0(pathAtom, pathBond, pathLength) {
    this.oclMolecule.getPathBonds_0(pathAtom, pathBond, pathLength);
  };
  _.getPathLength = function getPathLength_1(atom1, atom2) {
    return this.oclMolecule.getPathLength_0(atom1, atom2);
  };
  _.getRingSet = function getRingSet_0() {
    return new cargja.JSRingCollection(this.oclMolecule.getRingSet_0());
  };
  _.getRotatableBondCount = function getRotatableBondCount_1() {
    return this.oclMolecule.getRotatableBondCount_0();
  };
  _.getSVG = function getSVG(width_0, height, factorTextSize, autoCrop, autoCropMargin, id_0, options) {
    var b, d, degenerated, i, mode, mol, newHeight, newWidth, newX, newY, result;
    degenerated = true;
    for (i = 0; i < this.oclMolecule.getAllAtoms_0() - 1; i++) {
      if (this.oclMolecule.getAtomX_0(i) != this.oclMolecule.getAtomX_0(i + 1) || this.oclMolecule.getAtomY_0(i) != this.oclMolecule.getAtomY_0(i + 1)) {
        degenerated = false;
        break;
      }
    }
    mol = degenerated ? this.oclMolecule.getCompactCopy_0() : this.oclMolecule;
    if (degenerated) {
      new carcc3.CoordinateInventor_0(0).invent(mol);
    }
    mode = cargju.getDisplayMode(options);
    d = new carc2.SVGDepictor(mol, mode, id_0);
    d.setFactorTextSize(factorTextSize);
    d.validateView(null, new cargg.GenericRectangle_0(0, 0, width_0, height), 65536);
    b = d.getBoundingRect();
    d.paint(null);
    result = d.toString_0();
    if (!autoCrop) {
      return result;
    } else {
      newWidth = toInt_0(jl.round_1(b.width_0 + autoCropMargin * 2));
      newHeight = toInt_0(jl.round_1(b.height_0 + autoCropMargin * 2));
      newX = toInt_0(jl.round_1(b.x_0 - autoCropMargin));
      newY = toInt_0(jl.round_1(b.y_0 - autoCropMargin));
      return jl.replaceAll_Ljava_lang_String_Ljava_lang_String__Ljava_lang_String___devirtual$(result, 'width="\\d+px" height="\\d+px" viewBox="0 0 \\d+ \\d+"', 'width="' + newWidth + 'px" height="' + newHeight + 'px" viewBox="' + newX + " " + newY + " " + newWidth + " " + newHeight + '"');
    }
  };
  _.getStereoBond = function getStereoBond_0(atom) {
    return this.oclMolecule.getStereoBond_0(atom);
  };
  _.getStereoCenterCount = function getStereoCenterCount_1() {
    return this.oclMolecule.getStereoCenterCount_0();
  };
  _.getStereoMolecule = function getStereoMolecule() {
    return this.oclMolecule;
  };
  _.getStereoProblem = function getStereoProblem_0(atom) {
    return this.oclMolecule.getStereoProblem_0(atom);
  };
  _.getSubstituent = function getSubstituent_1(coreAtom, firstAtom, isMemberAtom, substituent, atomMap) {
    return this.oclMolecule.getSubstituent_0(coreAtom, firstAtom, isMemberAtom, substituent.getStereoMolecule(), atomMap);
  };
  _.getSubstituentSize = function getSubstituentSize_0(coreAtom, firstAtom) {
    return this.oclMolecule.getSubstituentSize_0(coreAtom, firstAtom);
  };
  _.getSymmetryRank = function getSymmetryRank_2(atom) {
    return this.oclMolecule.getSymmetryRank_0(atom);
  };
  _.getZNeighbour = function getZNeighbour_0(connAtom, bond) {
    return this.oclMolecule.getZNeighbour_0(connAtom, bond);
  };
  _.invalidateHelperArrays = function invalidateHelperArrays_0(helperBits) {
    this.oclMolecule.invalidateHelperArrays_0(helperBits);
  };
  _.inventCoordinates = function inventCoordinates_1() {
    var inventor;
    inventor = new carcc3.CoordinateInventor();
    inventor.setRandomSeed_0(0);
    inventor.invent(this.oclMolecule);
    this.oclMolecule.setStereoBondsFromParity_0();
  };
  _.is3D = function is3D_0() {
    return this.oclMolecule.is3D_0();
  };
  _.isAlkaliMetal = function isAlkaliMetal_0(atom) {
    return this.oclMolecule.isAlkaliMetal_0(atom);
  };
  _.isAllylicAtom = function isAllylicAtom_0(atom) {
    return this.oclMolecule.isAllylicAtom_0(atom);
  };
  _.isAmideTypeBond = function isAmideTypeBond_0(bond) {
    return this.oclMolecule.isAmideTypeBond_0(bond);
  };
  _.isAromaticAtom = function isAromaticAtom_2(atom) {
    return this.oclMolecule.isAromaticAtom_0(atom);
  };
  _.isAromaticBond = function isAromaticBond_2(bnd) {
    return this.oclMolecule.isAromaticBond_0(bnd);
  };
  _.isAtomConfigurationUnknown = function isAtomConfigurationUnknown_0(atom) {
    return this.oclMolecule.isAtomConfigurationUnknown_0(atom);
  };
  _.isAtomMarkedForDeletion = function isAtomMarkedForDeletion_0(atom) {
    return this.oclMolecule.isAtomMarkedForDeletion_0(atom);
  };
  _.isAtomParityPseudo = function isAtomParityPseudo_0(atom) {
    return this.oclMolecule.isAtomParityPseudo_0(atom);
  };
  _.isAtomStereoCenter = function isAtomStereoCenter_0(atom) {
    return this.oclMolecule.isAtomStereoCenter_0(atom);
  };
  _.isAutoMappedAtom = function isAutoMappedAtom_0(atom) {
    return this.oclMolecule.isAutoMappedAtom_0(atom);
  };
  _.isBINAPChiralityBond = function isBINAPChiralityBond_0(bond) {
    return this.oclMolecule.isBINAPChiralityBond_0(bond);
  };
  _.isBondBackgroundHilited = function isBondBackgroundHilited_0(bond) {
    return this.oclMolecule.isBondBackgroundHilited_0(bond);
  };
  _.isBondBridge = function isBondBridge_0(bond) {
    return this.oclMolecule.isBondBridge_0(bond);
  };
  _.isBondForegroundHilited = function isBondForegroundHilited_0(bond) {
    return this.oclMolecule.isBondForegroundHilited_0(bond);
  };
  _.isBondMarkedForDeletion = function isBondMarkedForDeletion_0(bond) {
    return this.oclMolecule.isBondMarkedForDeletion_0(bond);
  };
  _.isBondParityPseudo = function isBondParityPseudo_0(bond) {
    return this.oclMolecule.isBondParityPseudo_0(bond);
  };
  _.isBondParityUnknownOrNone = function isBondParityUnknownOrNone_0(bond) {
    return this.oclMolecule.isBondParityUnknownOrNone_0(bond);
  };
  _.isChalcogene = function isChalcogene_0(atom) {
    return this.oclMolecule.isChalcogene_0(atom);
  };
  _.isDelocalizedBond = function isDelocalizedBond_3(bond) {
    return this.oclMolecule.isDelocalizedBond_0(bond);
  };
  _.isEarthAlkaliMetal = function isEarthAlkaliMetal_0(atom) {
    return this.oclMolecule.isEarthAlkaliMetal_0(atom);
  };
  _.isElectronegative = function isElectronegative_0(atom) {
    return this.oclMolecule.isElectronegative_0(atom);
  };
  _.isElectropositive = function isElectropositive_0(atom) {
    return this.oclMolecule.isElectropositive_0(atom);
  };
  _.isFlatNitrogen = function isFlatNitrogen_1(atom) {
    return this.oclMolecule.isFlatNitrogen_0(atom);
  };
  _.isFragment = function isFragment_3() {
    return this.oclMolecule.isFragment_0();
  };
  _.isHalogene = function isHalogene_0(atom) {
    return this.oclMolecule.isHalogene_0(atom);
  };
  _.isMarkedAtom = function isMarkedAtom_0(atom) {
    return this.oclMolecule.isMarkedAtom_0(atom);
  };
  _.isMetalAtom = function isMetalAtom_0(atom) {
    return this.oclMolecule.isMetalAtom_0(atom);
  };
  _.isNaturalAbundance = function isNaturalAbundance_0(atom) {
    return this.oclMolecule.isNaturalAbundance_0(atom);
  };
  _.isNitrogenFamily = function isNitrogenFamily_0(atom) {
    return this.oclMolecule.isNitrogenFamily_0(atom);
  };
  _.isOrganicAtom = function isOrganicAtom_0(atom) {
    return this.oclMolecule.isOrganicAtom_0(atom);
  };
  _.isPseudoRotatableBond = function isPseudoRotatableBond_0(bond) {
    return this.oclMolecule.isPseudoRotatableBond_0(bond);
  };
  _.isPurelyOrganic = function isPurelyOrganic_0() {
    return this.oclMolecule.isPurelyOrganic_0();
  };
  _.isRingAtom = function isRingAtom_0(atom) {
    return this.oclMolecule.isRingAtom_0(atom);
  };
  _.isRingBond = function isRingBond_0(bnd) {
    return this.oclMolecule.isRingBond_0(bnd);
  };
  _.isSelectedAtom = function isSelectedAtom_0(atom) {
    return this.oclMolecule.isSelectedAtom_0(atom);
  };
  _.isSelectedBond = function isSelectedBond_1(bond) {
    return this.oclMolecule.isSelectedBond_0(bond);
  };
  _.isSimpleHydrogen = function isSimpleHydrogen_1(atom) {
    return this.oclMolecule.isSimpleHydrogen_0(atom);
  };
  _.isSmallRingAtom = function isSmallRingAtom_0(atom) {
    return this.oclMolecule.isSmallRingAtom_0(atom);
  };
  _.isSmallRingBond = function isSmallRingBond_1(bond) {
    return this.oclMolecule.isSmallRingBond_0(bond);
  };
  _.isStabilizedAtom = function isStabilizedAtom_0(atom) {
    return this.oclMolecule.isStabilizedAtom_0(atom);
  };
  _.isStereoBond = function isStereoBond_1(bond) {
    return this.oclMolecule.isStereoBond_0(bond);
  };
  _.markAtomForDeletion = function markAtomForDeletion_0(atom) {
    this.oclMolecule.markAtomForDeletion_0(atom);
  };
  _.markBondForDeletion = function markBondForDeletion_0(bond) {
    this.oclMolecule.markBondForDeletion_0(bond);
  };
  _.normalizeAmbiguousBonds = function normalizeAmbiguousBonds_0() {
    return this.oclMolecule.normalizeAmbiguousBonds_0();
  };
  _.removeAtomColors = function removeAtomColors_0() {
    this.oclMolecule.removeAtomColors_0();
  };
  _.removeAtomCustomLabels = function removeAtomCustomLabels_0() {
    this.oclMolecule.removeAtomCustomLabels_0();
  };
  _.removeAtomMarkers = function removeAtomMarkers_0() {
    this.oclMolecule.removeAtomMarkers_0();
  };
  _.removeAtomSelection = function removeAtomSelection_0() {
    this.oclMolecule.removeAtomSelection_0();
  };
  _.removeBondHiliting = function removeBondHiliting_0() {
    this.oclMolecule.removeBondHiliting_0();
  };
  _.removeExplicitHydrogens = function removeExplicitHydrogens_0() {
    this.oclMolecule.removeExplicitHydrogens_0(true);
  };
  _.removeQueryFeatures = function removeQueryFeatures_0() {
    return this.oclMolecule.removeQueryFeatures_0();
  };
  _.renumberESRGroups = function renumberESRGroups_0(type_0) {
    return this.oclMolecule.renumberESRGroups_0(type_0);
  };
  _.scaleCoords = function scaleCoords_0(f) {
    this.oclMolecule.scaleCoords_0(f);
  };
  _.setAllAtoms = function setAllAtoms_0(no) {
    this.oclMolecule.setAllAtoms_0(no);
  };
  _.setAllBonds = function setAllBonds_0(no) {
    this.oclMolecule.setAllBonds_0(no);
  };
  _.setAssignParitiesToNitrogen = function setAssignParitiesToNitrogen_0(b) {
    this.oclMolecule.setAssignParitiesToNitrogen_0(b);
  };
  _.setAtomAbnormalValence = function setAtomAbnormalValence_0(atom, valence) {
    this.oclMolecule.setAtomAbnormalValence_0(atom, valence);
  };
  _.setAtomCIPParity = function setAtomCIPParity_0(atom, parity) {
    this.oclMolecule.setAtomCIPParity_0(atom, parity);
  };
  _.setAtomCharge = function setAtomCharge_0(atom, charge) {
    this.oclMolecule.setAtomCharge_0(atom, charge);
  };
  _.setAtomColor = function setAtomColor_0(atom, color_0) {
    this.oclMolecule.setAtomColor_0(atom, color_0);
  };
  _.setAtomConfigurationUnknown = function setAtomConfigurationUnknown_0(atom, u) {
    this.oclMolecule.setAtomConfigurationUnknown_0(atom, u);
  };
  _.setAtomCustomLabel = function setAtomCustomLabel_1(atom, label_0) {
    this.oclMolecule.setAtomCustomLabel_0(atom, label_0);
  };
  _.setAtomESR = function setAtomESR_0(atom, type_0, group) {
    this.oclMolecule.setAtomESR_0(atom, type_0, group);
  };
  _.setAtomList = function setAtomList_1(atom, list, isExcludeList) {
    this.oclMolecule.setAtomList_1(atom, list, isExcludeList);
  };
  _.setAtomMapNo = function setAtomMapNo_0(atom, mapNo, autoMapped) {
    this.oclMolecule.setAtomMapNo_0(atom, mapNo, autoMapped);
  };
  _.setAtomMarker = function setAtomMarker_0(atom, s) {
    this.oclMolecule.setAtomMarker_0(atom, s);
  };
  _.setAtomMass = function setAtomMass_0(atom, mass) {
    this.oclMolecule.setAtomMass_0(atom, mass);
  };
  _.setAtomParity = function setAtomParity_0(atom, parity, isPseudo) {
    this.oclMolecule.setAtomParity_0(atom, parity, isPseudo);
  };
  _.setAtomQueryFeature = function setAtomQueryFeature_0(atom, feature, value_0) {
    this.oclMolecule.setAtomQueryFeature_0(atom, feature, value_0);
  };
  _.setAtomRadical = function setAtomRadical_0(atom, radical) {
    this.oclMolecule.setAtomRadical_0(atom, radical);
  };
  _.setAtomSelection = function setAtomSelection_0(atom, s) {
    this.oclMolecule.setAtomSelection_0(atom, s);
  };
  _.setAtomX = function setAtomX_0(atom, x_0) {
    this.oclMolecule.setAtomX_0(atom, x_0);
  };
  _.setAtomY = function setAtomY_0(atom, y_0) {
    this.oclMolecule.setAtomY_0(atom, y_0);
  };
  _.setAtomZ = function setAtomZ_0(atom, z_0) {
    this.oclMolecule.setAtomZ_0(atom, z_0);
  };
  _.setAtomicNo = function setAtomicNo_0(atom, no) {
    this.oclMolecule.setAtomicNo_0(atom, no);
  };
  _.setBondAtom = function setBondAtom_0(no, bond, atom) {
    this.oclMolecule.setBondAtom_0(no, bond, atom);
  };
  _.setBondBackgroundHiliting = function setBondBackgroundHiliting_0(bond, s) {
    this.oclMolecule.setBondBackgroundHiliting_0(bond, s);
  };
  _.setBondCIPParity = function setBondCIPParity_0(bond, parity) {
    this.oclMolecule.setBondCIPParity_0(bond, parity);
  };
  _.setBondESR = function setBondESR_0(bond, type_0, group) {
    this.oclMolecule.setBondESR_0(bond, type_0, group);
  };
  _.setBondForegroundHiliting = function setBondForegroundHiliting_0(bond, s) {
    this.oclMolecule.setBondForegroundHiliting_0(bond, s);
  };
  _.setBondOrder = function setBondOrder_0(bond, order) {
    this.oclMolecule.setBondOrder_0(bond, order);
  };
  _.setBondParity = function setBondParity_0(bond, parity, isPseudo) {
    this.oclMolecule.setBondParity_0(bond, parity, isPseudo);
  };
  _.setBondParityUnknownOrNone = function setBondParityUnknownOrNone_0(bond) {
    this.oclMolecule.setBondParityUnknownOrNone_0(bond);
  };
  _.setBondQueryFeature = function setBondQueryFeature_0(bond, feature, value_0) {
    this.oclMolecule.setBondQueryFeature_0(bond, feature, value_0);
  };
  _.setBondType = function setBondType_0(bond, type_0) {
    this.oclMolecule.setBondType_0(bond, type_0);
  };
  _.setChirality = function setChirality_0(c) {
    this.oclMolecule.setChirality_0(c);
  };
  _.setFragment = function setFragment_4(isFragment) {
    this.oclMolecule.setFragment_0(isFragment);
  };
  _.setHelperValidity = function setHelperValidity_0(helperValidity) {
    this.oclMolecule.setHelperValidity_0(helperValidity);
  };
  _.setHydrogenProtection = function setHydrogenProtection_0(protectHydrogen) {
    this.oclMolecule.setHydrogenProtection_0(protectHydrogen);
  };
  _.setMaxAtoms = function setMaxAtoms_0(v) {
    this.oclMolecule.setMaxAtoms_0(v);
  };
  _.setMaxBonds = function setMaxBonds_0(v) {
    this.oclMolecule.setMaxBonds_0(v);
  };
  _.setMoleculeColor = function setMoleculeColor_0(color_0) {
    this.oclMolecule.setMoleculeColor_0(color_0);
  };
  _.setName = function setName_2(name_0) {
    this.oclMolecule.setName_0(name_0);
  };
  _.setParitiesValid = function setParitiesValid_0(helperStereoBits) {
    this.oclMolecule.setParitiesValid_0(helperStereoBits);
  };
  _.setStereoBondFromAtomParity = function setStereoBondFromAtomParity_0(atom) {
    this.oclMolecule.setStereoBondFromAtomParity_0(atom);
  };
  _.setStereoBondFromBondParity = function setStereoBondFromBondParity_0(bond) {
    this.oclMolecule.setStereoBondFromBondParity_0(bond);
  };
  _.setStereoBondsFromParity = function setStereoBondsFromParity_0() {
    this.oclMolecule.setStereoBondsFromParity_0();
  };
  _.setToRacemate = function setToRacemate_0() {
    this.oclMolecule.setToRacemate_0();
  };
  _.setUnknownParitiesToExplicitlyUnknown = function setUnknownParitiesToExplicitlyUnknown_1() {
    this.oclMolecule.setUnknownParitiesToExplicitlyUnknown_0();
  };
  _.shareSameFragment = function shareSameFragment_0(atom1, atom2) {
    return this.oclMolecule.shareSameFragment_0(atom1, atom2);
  };
  _.stripIsotopInfo = function stripIsotopInfo_0() {
    return this.oclMolecule.stripIsotopInfo_0();
  };
  _.stripSmallFragments = function stripSmallFragments_0(considerMetalBonds) {
    return this.oclMolecule.stripSmallFragments_0(considerMetalBonds);
  };
  _.stripStereoInformation = function stripStereoInformation_0() {
    this.oclMolecule.stripStereoInformation_0();
  };
  _.suggestBondType = function suggestBondType_0(atom1, atom2) {
    return this.oclMolecule.suggestBondType_0(atom1, atom2);
  };
  _.supportsImplicitHydrogen = function supportsImplicitHydrogen_0(atom) {
    return this.oclMolecule.supportsImplicitHydrogen_0(atom);
  };
  _.swapAtoms = function swapAtoms_0(atom1, atom2) {
    this.oclMolecule.swapAtoms_0(atom1, atom2);
  };
  _.swapBonds = function swapBonds_0(bond1, bond2) {
    this.oclMolecule.swapBonds_0(bond1, bond2);
  };
  _.toIsomericSmiles = function toIsomericSmiles(options) {
    options = options || {};
    var createSmarts = options.createSmarts === true;
    var includeMapping = options.includeMapping === true;
    var kekulizedOutput = options.kekulizedOutput === true;
    return this.toIsomericSmilesInternal(createSmarts, includeMapping, kekulizedOutput);
  };
  _.toIsomericSmilesInternal = function toIsomericSmilesInternal(createSmarts, includeMapping, kekulizedOutput) {
    var mode;
    mode = 0;
    if (createSmarts) {
      mode |= 1;
    }
    if (includeMapping) {
      mode |= 2;
    }
    if (kekulizedOutput) {
      mode |= 4;
    }
    return new carc2.IsomericSmilesCreator_0(this.oclMolecule, mode).getSmiles();
  };
  _.toMolfile = function toMolfile() {
    var creator;
    creator = new carc2.MolfileCreator(this.oclMolecule);
    return creator.getMolfile();
  };
  _.toMolfileV3 = function toMolfileV3() {
    var creator;
    creator = new carc2.MolfileV3Creator_0(this.oclMolecule);
    return creator.getMolfile();
  };
  _.toSVG = function toSVG(width_0, height, id_0, options) {
    if (typeof width_0 !== "number" || typeof height !== "number") {
      throw new Error("Molecule#toSVG requires width and height to be specified");
    }
    options = options || {};
    var factorTextSize = options.factorTextSize || 1;
    var autoCrop = options.autoCrop === true;
    var autoCropMargin = typeof options.autoCropMargin === "undefined" ? 5 : options.autoCropMargin;
    var svg = this.getSVG(width_0, height, factorTextSize, autoCrop, autoCropMargin, id_0, options);
    svg = svg.replace("<style>", "<style> text {font-family: sans-serif;}");
    if (options.fontWeight) {
      svg = svg.replace(/font-size=/g, 'font-weight="' + options.fontWeight + '" font-size=');
    }
    if (options.strokeWidth) {
      svg = svg.replace(/stroke-width="[^"]+"/g, 'stroke-width="' + options.strokeWidth + '"');
    }
    return svg;
  };
  _.toSmarts = function toSmarts() {
    return new carc2.IsomericSmilesCreator_0(this.oclMolecule, 1).getSmiles();
  };
  _.toSmiles = function toSmiles() {
    return this.toIsomericSmilesInternal(false, false, true);
  };
  _.translateCoords = function translateCoords_0(dx, dy) {
    this.oclMolecule.translateCoords_0(dx, dy);
  };
  _.validate = function validate_1() {
    this.oclMolecule.validate_0();
  };
  _.zoomAndRotate = function zoomAndRotate_2(zoom, angle, selected) {
    this.oclMolecule.zoomAndRotate_1(zoom, angle, selected);
  };
  _.zoomAndRotateInit = function zoomAndRotateInit_2(x_0, y_0) {
    this.oclMolecule.zoomAndRotateInit_0(x_0, y_0);
  };
  cargja.CANONIZER_ASSIGN_PARITIES_TO_TETRAHEDRAL_N = 32;
  cargja.CANONIZER_CONSIDER_DIASTEREOTOPICITY = 2;
  cargja.CANONIZER_CONSIDER_ENANTIOTOPICITY = 4;
  cargja.CANONIZER_CONSIDER_STEREOHETEROTOPICITY = 0;
  cargja.CANONIZER_COORDS_ARE_3D = 64;
  cargja.CANONIZER_CREATE_PSEUDO_STEREO_GROUPS = 128;
  cargja.CANONIZER_CREATE_SYMMETRY_RANK = 1;
  cargja.CANONIZER_DISTINGUISH_RACEMIC_OR_GROUPS = 256;
  cargja.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS = 8;
  cargja.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS_WITHOUT_RANKING = 1024;
  cargja.CANONIZER_ENCODE_ATOM_SELECTION = 16;
  cargja.CANONIZER_NEGLECT_ANY_STEREO_INFORMATION = 2048;
  cargja.CANONIZER_TIE_BREAK_FREE_VALENCE_ATOMS = 512;
  cargja.FISCHER_PROJECTION_LIMIT_0 = 0;
  cargja.FISCHER_PROJECTION_RING_LIMIT_0 = 24;
  cargja.STEREO_ANGLE_LIMIT = 0;
  cargja.VALIDATION_ERROR_AMBIGUOUS_CONFIGURATION_0 = "Ambiguous configuration at stereo center because of 2 parallel bonds";
  cargja.VALIDATION_ERROR_ESR_CENTER_UNKNOWN_0 = "Members of ESR groups must only be stereo centers with known configuration.";
  cargja.VALIDATION_ERROR_OVER_UNDER_SPECIFIED_0 = "Over- or under-specified stereo feature or more than one racemic type bond";
  cargja.cAtomCIPParityNone_0 = 0;
  cargja.cAtomCIPParityProblem_0 = 3;
  cargja.cAtomCIPParityRorM_0 = 1;
  cargja.cAtomCIPParitySorP_0 = 2;
  cargja.cAtomColorBlue_0 = 64;
  cargja.cAtomColorDarkGreen_0 = 384;
  cargja.cAtomColorDarkRed_0 = 448;
  cargja.cAtomColorGreen_0 = 192;
  cargja.cAtomColorMagenta_0 = 256;
  cargja.cAtomColorNone_0 = 0;
  cargja.cAtomColorOrange_0 = 320;
  cargja.cAtomColorRed_0 = 128;
  cargja.cAtomParity1_0 = 1;
  cargja.cAtomParity2_0 = 2;
  cargja.cAtomParityIsPseudo_0 = 4;
  cargja.cAtomParityNone_0 = 0;
  cargja.cAtomParityUnknown_0 = 3;
  cargja.cAtomQFAny_0 = 1;
  cargja.cAtomQFAromState_0 = { l: 6, m: 0, h: 4 };
  cargja.cAtomQFAromStateBits_0 = 2;
  cargja.cAtomQFAromStateShift_0 = 1;
  cargja.cAtomQFAromatic_0 = 2;
  cargja.cAtomQFCharge_0 = 234881024;
  cargja.cAtomQFChargeBits_0 = 3;
  cargja.cAtomQFChargeShift_0 = 25;
  cargja.cAtomQFENeighbourBits_0 = 5;
  cargja.cAtomQFENeighbourShift_0 = 39;
  cargja.cAtomQFENeighbours_0 = 17042430230528;
  cargja.cAtomQFExcludeGroup_0 = 536870912;
  cargja.cAtomQFFlatNitrogen_0 = 268435456;
  cargja.cAtomQFHeteroAromatic_0 = { l: 0, m: 0, h: 4 };
  cargja.cAtomQFHydrogen_0 = 1920;
  cargja.cAtomQFHydrogenBits_0 = 4;
  cargja.cAtomQFHydrogenShift_0 = 7;
  cargja.cAtomQFIsNotStereo_0 = { l: 0, m: 0, h: 2 };
  cargja.cAtomQFIsStereo_0 = { l: 0, m: 0, h: 1 };
  cargja.cAtomQFMatchStereo_0 = 8192;
  cargja.cAtomQFMoreNeighbours_0 = 4096;
  cargja.cAtomQFNarrowing_0 = { l: 4194302, m: 4193343, h: 7 };
  cargja.cAtomQFNeighbourBits_0 = 5;
  cargja.cAtomQFNeighbourShift_0 = 17;
  cargja.cAtomQFNeighbours_0 = 4063232;
  cargja.cAtomQFNewRingSize_0 = 545460846592;
  cargja.cAtomQFNewRingSizeBits_0 = 7;
  cargja.cAtomQFNewRingSizeShift_0 = 32;
  cargja.cAtomQFNoMoreNeighbours_0 = 2048;
  cargja.cAtomQFNoOfBits_0 = 46;
  cargja.cAtomQFNot0ENeighbours_0 = 549755813888;
  cargja.cAtomQFNot0Hydrogen_0 = 128;
  cargja.cAtomQFNot0Neighbours_0 = 131072;
  cargja.cAtomQFNot0PiElectrons_0 = 16384;
  cargja.cAtomQFNot1ENeighbour_0 = 1099511627776;
  cargja.cAtomQFNot1Hydrogen_0 = 256;
  cargja.cAtomQFNot1Neighbour_0 = 262144;
  cargja.cAtomQFNot1PiElectron_0 = 32768;
  cargja.cAtomQFNot2ENeighbours_0 = 2199023255552;
  cargja.cAtomQFNot2Hydrogen_0 = 512;
  cargja.cAtomQFNot2Neighbours_0 = 524288;
  cargja.cAtomQFNot2PiElectrons_0 = 65536;
  cargja.cAtomQFNot2RingBonds_0 = 16;
  cargja.cAtomQFNot3ENeighbours_0 = 4398046511104;
  cargja.cAtomQFNot3Hydrogen_0 = 1024;
  cargja.cAtomQFNot3Neighbours_0 = 1048576;
  cargja.cAtomQFNot3RingBonds_0 = 32;
  cargja.cAtomQFNot4ENeighbours_0 = 8796093022208;
  cargja.cAtomQFNot4Neighbours_0 = 2097152;
  cargja.cAtomQFNot4RingBonds_0 = 64;
  cargja.cAtomQFNotAromatic_0 = 4;
  cargja.cAtomQFNotChain_0 = 8;
  cargja.cAtomQFNotCharge0_0 = 67108864;
  cargja.cAtomQFNotChargeNeg_0 = 33554432;
  cargja.cAtomQFNotChargePos_0 = 134217728;
  cargja.cAtomQFPiElectronBits_0 = 3;
  cargja.cAtomQFPiElectronShift_0 = 14;
  cargja.cAtomQFPiElectrons_0 = 114688;
  cargja.cAtomQFRingSize0_0 = 4294967296;
  cargja.cAtomQFRingSize3_0 = 8589934592;
  cargja.cAtomQFRingSize4_0 = 17179869184;
  cargja.cAtomQFRingSize5_0 = 34359738368;
  cargja.cAtomQFRingSize6_0 = 68719476736;
  cargja.cAtomQFRingSize7_0 = 137438953472;
  cargja.cAtomQFRingSizeLarge_0 = 274877906944;
  cargja.cAtomQFRingState_0 = 120;
  cargja.cAtomQFRingStateBits_0 = 4;
  cargja.cAtomQFRingStateShift_0 = 3;
  cargja.cAtomQFRxnParityBits_0 = 2;
  cargja.cAtomQFRxnParityHint_0 = 3221225472;
  cargja.cAtomQFRxnParityInvert_0 = 2147483648;
  cargja.cAtomQFRxnParityRacemize_0 = 3221225472;
  cargja.cAtomQFRxnParityRetain_0 = 1073741824;
  cargja.cAtomQFRxnParityShift_0 = 30;
  cargja.cAtomQFSimpleFeatures_0 = { l: 4179966, m: 4063288, h: 7 };
  cargja.cAtomQFSmallRingSize_0 = 29360128;
  cargja.cAtomQFSmallRingSizeBits_0 = 3;
  cargja.cAtomQFSmallRingSizeShift_0 = 22;
  cargja.cAtomQFStereoState_0 = { l: 0, m: 0, h: 3 };
  cargja.cAtomQFStereoStateBits_0 = 2;
  cargja.cAtomQFStereoStateShift_0 = 44;
  cargja.cAtomRadicalState_0 = 48;
  cargja.cAtomRadicalStateD_0 = 32;
  cargja.cAtomRadicalStateNone_0 = 0;
  cargja.cAtomRadicalStateS_0 = 16;
  cargja.cAtomRadicalStateShift_0 = 4;
  cargja.cAtomRadicalStateT_0 = 48;
  cargja.cBondCIPParityEorP_0 = 1;
  cargja.cBondCIPParityNone_0 = 0;
  cargja.cBondCIPParityProblem_0 = 3;
  cargja.cBondCIPParityZorM_0 = 2;
  cargja.cBondFlagsHelper2_0 = 704;
  cargja.cBondFlagsHelper3_0 = 63;
  cargja.cBondParityEor1_0 = 1;
  cargja.cBondParityNone_0 = 0;
  cargja.cBondParityUnknown_0 = 3;
  cargja.cBondParityZor2_0 = 2;
  cargja.cBondQFAllFeatures_0 = 16777215;
  cargja.cBondQFAromState_0 = 6291456;
  cargja.cBondQFAromStateBits_0 = 2;
  cargja.cBondQFAromStateShift_0 = 21;
  cargja.cBondQFAromatic_0 = 2097152;
  cargja.cBondQFBondTypes_0 = 31;
  cargja.cBondQFBondTypesBits_0 = 5;
  cargja.cBondQFBondTypesShift_0 = 0;
  cargja.cBondQFBridge_0 = 130560;
  cargja.cBondQFBridgeBits_0 = 8;
  cargja.cBondQFBridgeMin_0 = 7680;
  cargja.cBondQFBridgeMinBits_0 = 4;
  cargja.cBondQFBridgeMinShift_0 = 9;
  cargja.cBondQFBridgeShift_0 = 9;
  cargja.cBondQFBridgeSpan_0 = 122880;
  cargja.cBondQFBridgeSpanBits_0 = 4;
  cargja.cBondQFBridgeSpanShift_0 = 13;
  cargja.cBondQFDelocalized = 8;
  cargja.cBondQFDouble = 2;
  cargja.cBondQFMatchFormalOrder_0 = 8388608;
  cargja.cBondQFMatchStereo_0 = 1048576;
  cargja.cBondQFMetalLigand = 16;
  cargja.cBondQFNarrowing_0 = 6291840;
  cargja.cBondQFNoOfBits_0 = 23;
  cargja.cBondQFNotAromatic_0 = 4194304;
  cargja.cBondQFNotRing_0 = 128;
  cargja.cBondQFQuadruple = 32;
  cargja.cBondQFQuintuple = 64;
  cargja.cBondQFRareBondTypes_0 = 96;
  cargja.cBondQFRareBondTypesBits_0 = 2;
  cargja.cBondQFRareBondTypesShift_0 = 5;
  cargja.cBondQFRing_0 = 256;
  cargja.cBondQFRingSize_0 = 917504;
  cargja.cBondQFRingSizeBits_0 = 3;
  cargja.cBondQFRingSizeShift_0 = 17;
  cargja.cBondQFRingState_0 = 384;
  cargja.cBondQFRingStateBits_0 = 2;
  cargja.cBondQFRingStateShift_0 = 7;
  cargja.cBondQFSimpleFeatures_0 = 6291967;
  cargja.cBondQFSingle = 1;
  cargja.cBondQFTriple = 4;
  cargja.cBondTypeCross_0 = 386;
  cargja.cBondTypeDeleted_0 = 512;
  cargja.cBondTypeDelocalized_0 = 8;
  cargja.cBondTypeDouble_0 = 2;
  cargja.cBondTypeDown_0 = 129;
  cargja.cBondTypeIncreaseOrder_0 = 511;
  cargja.cBondTypeMaskSimple_0 = 127;
  cargja.cBondTypeMaskStereo_0 = 384;
  cargja.cBondTypeMetalLigand_0 = 16;
  cargja.cBondTypeQuadruple_0 = 32;
  cargja.cBondTypeQuintuple_0 = 64;
  cargja.cBondTypeSingle_0 = 1;
  cargja.cBondTypeTriple_0 = 4;
  cargja.cBondTypeUp_0 = 257;
  cargja.cChiralityDiastereomers_0 = 458752;
  cargja.cChiralityEpimers_0 = 393216;
  cargja.cChiralityIsomerCountMask_0 = 65535;
  cargja.cChiralityKnownEnantiomer_0 = 262144;
  cargja.cChiralityMeso_0 = 131072;
  cargja.cChiralityNotChiral_0 = 65536;
  cargja.cChiralityRacemic_0 = 196608;
  cargja.cChiralityUnknown_0 = 0;
  cargja.cChiralityUnknownEnantiomer_0 = 327680;
  cargja.cDefaultAVBL_0 = 24;
  cargja.cDefaultAllowedPseudoAtoms_0 = 0;
  cargja.cDefaultAtomValence_0 = 6;
  cargja.cESRGroupBits_0 = 5;
  cargja.cESRMaxGroups_0 = 32;
  cargja.cESRTypeAbs_0 = 0;
  cargja.cESRTypeAnd_0 = 1;
  cargja.cESRTypeOr_0 = 2;
  cargja.cHelperAll_0 = 255;
  cargja.cHelperBitCIP_0 = 16;
  cargja.cHelperBitIncludeNitrogenParities_0 = 128;
  cargja.cHelperBitNeighbours_0 = 1;
  cargja.cHelperBitParities_0 = 8;
  cargja.cHelperBitRings_0 = 4;
  cargja.cHelperBitRingsSimple_0 = 2;
  cargja.cHelperBitSymmetrySimple_0 = 32;
  cargja.cHelperBitSymmetryStereoHeterotopicity_0 = 64;
  cargja.cHelperBitsStereo_0 = 248;
  cargja.cHelperCIP_0 = 0;
  cargja.cHelperNeighbours_0 = 1;
  cargja.cHelperNone_0 = 0;
  cargja.cHelperParities_0 = 0;
  cargja.cHelperRings_0 = 0;
  cargja.cHelperRingsSimple_0 = 0;
  cargja.cHelperSymmetrySimple_0 = 0;
  cargja.cHelperSymmetryStereoHeterotopicity_0 = 0;
  cargja.cMaxAtomicNo_0 = 190;
  cargja.cMaxConnAtoms_0 = 16;
  cargja.cMoleculeColorDefault_0 = 0;
  cargja.cMoleculeColorNeutral_0 = 1;
  cargja.cPseudoAtomA_0 = 16;
  cargja.cPseudoAtomAttachmentPoint_0 = 256;
  cargja.cPseudoAtomPolymer_0 = 128;
  cargja.cPseudoAtomR_0 = 8;
  cargja.cPseudoAtomX_0 = 32;
  cargja.cPseudoAtomsAGroups_0 = 4;
  cargja.cPseudoAtomsAll_0 = 511;
  cargja.cPseudoAtomsAminoAcids_0 = 64;
  cargja.cPseudoAtomsHydrogenIsotops_0 = 1;
  cargja.cPseudoAtomsRGroups_0 = 2;
  cggl.Lcom_actelion_research_gwt_js_api_JSMolecule_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSMolecule", 46, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSMoleculeProperties = function $clinit_JSMoleculeProperties() {
    cargja.$clinit_JSMoleculeProperties = emptyMethod;
    carcp.$clinit_PropertyCalculator();
  };
  cargja.JSMoleculeProperties = function JSMoleculeProperties(mol) {
    cargja.$clinit_JSMoleculeProperties();
    carcp.PropertyCalculator.call(this, mol.getStereoMolecule());
    this.$init_175();
  };
  defineClass(581, 78, { 1: 1 }, cargja.JSMoleculeProperties);
  _.$init_175 = function $init_175() {
  };
  defineProperties(_, { acceptorCount: {
    "get": function getAcceptorCount_0() {
      return getClassPrototype(78).getAcceptorCount.call(this);
    }
  } });
  _.getAcceptorCount = function() {
    return this.acceptorCount;
  };
  defineProperties(_, { donorCount: {
    "get": function getDonorCount_0() {
      return getClassPrototype(78).getDonorCount.call(this);
    }
  } });
  _.getDonorCount = function() {
    return this.donorCount;
  };
  defineProperties(_, { logP: {
    "get": function getLogP_0() {
      return getClassPrototype(78).getLogP.call(this);
    }
  } });
  _.getLogP = function() {
    return this.logP;
  };
  defineProperties(_, { logPString: {
    "get": function getLogPString() {
      return cargju.convertParameterizedStringList(getClassPrototype(78).getLogPDetail.call(this));
    }
  } });
  defineProperties(_, { logS: {
    "get": function getLogS_0() {
      return getClassPrototype(78).getLogS.call(this);
    }
  } });
  _.getLogS = function() {
    return this.logS;
  };
  defineProperties(_, { logSString: {
    "get": function getLogSString() {
      return cargju.convertParameterizedStringList(getClassPrototype(78).getLogSDetail.call(this));
    }
  } });
  defineProperties(_, { polarSurfaceArea: {
    "get": function getPolarSurfaceArea_0() {
      return getClassPrototype(78).getPolarSurfaceArea.call(this);
    }
  } });
  _.getPolarSurfaceArea = function() {
    return this.polarSurfaceArea;
  };
  defineProperties(_, { polarSurfaceAreaString: {
    "get": function getPolarSurfaceAreaString() {
      return cargju.convertParameterizedStringList(getClassPrototype(78).getPolarSurfaceAreaDetail.call(this));
    }
  } });
  defineProperties(_, { rotatableBondCount: {
    "get": function getRotatableBondCount_2() {
      return getClassPrototype(78).getRotatableBondCount_0.call(this);
    }
  } });
  _.getRotatableBondCount_0 = function() {
    return this.rotatableBondCount;
  };
  defineProperties(_, { stereoCenterCount: {
    "get": function getStereoCenterCount_2() {
      return getClassPrototype(78).getStereoCenterCount_0.call(this);
    }
  } });
  _.getStereoCenterCount_0 = function() {
    return this.stereoCenterCount;
  };
  cggl.Lcom_actelion_research_gwt_js_api_JSMoleculeProperties_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSMoleculeProperties", 581, cggl.Lcom_actelion_research_chem_prediction_PropertyCalculator_2_classLit);
  cargja.$clinit_JSReaction = function $clinit_JSReaction() {
    cargja.$clinit_JSReaction = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSReaction = function JSReaction(reaction) {
    cargja.$clinit_JSReaction();
    Object_0.call(this);
    this.$init_176();
    this.oclReaction = reaction;
  };
  cargja.create = function create() {
    cargja.$clinit_JSReaction();
    return new cargja.JSReaction(new carcr.Reaction());
  };
  cargja.fromMolecules = function fromMolecules(mol, reactantCount) {
    cargja.$clinit_JSReaction();
    var i, oclMol;
    oclMol = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_StereoMolecule_2_classLit, { 95: 1, 4: 1, 1: 1, 7: 1 }, 17, mol.length, 0, 1);
    for (i = 0; i < mol.length; i++) {
      setCheck(oclMol, i, mol[i].getStereoMolecule());
    }
    return new cargja.JSReaction(new carcr.Reaction_1(oclMol, reactantCount));
  };
  cargja.fromRxn = function fromRxn(rxn) {
    cargja.$clinit_JSReaction();
    var parser;
    parser = new carci.RXNFileParser();
    return new cargja.JSReaction(parser.getReaction_1(rxn));
  };
  cargja.fromSmiles_1 = function fromSmiles_1(smiles) {
    cargja.$clinit_JSReaction();
    var reaction;
    reaction = new carc2.SmilesParser().parseReaction_1(jl.getBytes___B__devirtual$(smiles));
    return new cargja.JSReaction(reaction);
  };
  defineClass(87, 1, { 1: 1 }, cargja.JSReaction);
  _.$init_176 = function $init_176() {
  };
  _.addCatalyst = function addCatalyst_1(catalyst) {
    this.oclReaction.addCatalyst_0(catalyst.getStereoMolecule());
  };
  _.addCatalystAt = function addCatalystAt(catalyst, position) {
    this.oclReaction.addCatalyst_1(catalyst.getStereoMolecule(), position);
  };
  _.addProduct = function addProduct_1(product) {
    this.oclReaction.addProduct_0(product.getStereoMolecule());
  };
  _.addProductAt = function addProductAt(product, position) {
    this.oclReaction.addProduct_1(product.getStereoMolecule(), position);
  };
  _.addReactant = function addReactant_1(reactant) {
    this.oclReaction.addReactant_0(reactant.getStereoMolecule());
  };
  _.addReactantAt = function addReactantAt(reactant, position) {
    this.oclReaction.addReactant_1(reactant.getStereoMolecule(), position);
  };
  _.clear = function clear_9() {
    this.oclReaction.clear_0();
  };
  _.clone = function clone_1() {
    return new cargja.JSReaction(new carcr.Reaction_0(this.oclReaction));
  };
  _.getAverageBondLength = function getAverageBondLength_7() {
    return this.oclReaction.getAverageBondLength_0();
  };
  _.getCatalyst = function getCatalyst_0(no) {
    return new cargja.JSMolecule_1(this.oclReaction.getCatalyst_0(no));
  };
  _.getCatalysts = function getCatalysts_0() {
    return this.oclReaction.getCatalysts_0();
  };
  _.getHighestMapNo = function getHighestMapNo_0() {
    return this.oclReaction.getHighestMapNo_0();
  };
  _.getMergedCopy = function getMergedCopy_0() {
    return new cargja.JSReaction(this.oclReaction.getMergedCopy_0());
  };
  _.getMolecule = function getMolecule_7(no) {
    return new cargja.JSMolecule_1(this.oclReaction.getMolecule_1(no));
  };
  _.getMolecules = function getMolecules_0() {
    return this.oclReaction.getMolecules_0();
  };
  _.getName = function getName_6() {
    return this.oclReaction.getName_0();
  };
  _.getProduct = function getProduct_2(no) {
    return new cargja.JSMolecule_1(this.oclReaction.getProduct_0(no));
  };
  _.getProducts = function getProducts_1() {
    return this.oclReaction.getProducts_0();
  };
  _.getReactant = function getReactant_2(no) {
    return new cargja.JSMolecule_1(this.oclReaction.getReactant_0(no));
  };
  _.getReactants = function getReactants_0() {
    return this.oclReaction.getReactants_0();
  };
  _.getReaction_0 = function getReaction_3() {
    return this.oclReaction;
  };
  _.getReactionCenterMapNos = function getReactionCenterMapNos_0() {
    return this.oclReaction.getReactionCenterMapNos_0();
  };
  _.isEmpty = function isEmpty_2() {
    return this.oclReaction.isEmpty_0();
  };
  _.isFragment = function isFragment_4() {
    return this.oclReaction.isFragment_0();
  };
  _.isPerfectlyMapped = function isPerfectlyMapped_0() {
    return this.oclReaction.isPerfectlyMapped_0();
  };
  _.isReactionLayoutRequired = function isReactionLayoutRequired_0() {
    return this.oclReaction.isReactionLayoutRequired_0();
  };
  _.removeCatalysts = function removeCatalysts_0() {
    this.oclReaction.removeCatalysts_0();
  };
  _.setFragment = function setFragment_5(f) {
    this.oclReaction.setFragment_0(f);
  };
  _.setName = function setName_3(name_0) {
    this.oclReaction.setName_0(name_0);
  };
  _.toRxn = function toRxn(programName) {
    var creator;
    creator = new carci.RXNFileCreator(this.oclReaction, programName);
    return creator.getRXNfile();
  };
  _.toRxnV3 = function toRxnV3(programName) {
    var creator;
    creator = new carci.RXNFileV3Creator(this.oclReaction, programName);
    return creator.getRXNfile();
  };
  _.toSmiles = function toSmiles_0() {
    return carc2.createReactionSmiles(this.oclReaction);
  };
  _.validateMapping = function validateMapping_0() {
    this.oclReaction.validateMapping_0();
  };
  cggl.Lcom_actelion_research_gwt_js_api_JSReaction_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSReaction", 87, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSReactionEncoder = function $clinit_JSReactionEncoder() {
    cargja.$clinit_JSReactionEncoder = emptyMethod;
    jl.$clinit_Object();
    cargja.PRODUCT_IDENTIFIER_0 = jl.valueOf_15(33);
    cargja.CATALYST_DELIMITER_0 = jl.valueOf_15(43);
  };
  cargja.JSReactionEncoder = function JSReactionEncoder() {
    cargja.$clinit_JSReactionEncoder();
    Object_0.call(this);
    this.$init_177();
  };
  cargja.decode_4 = function decode_4(reaction, options) {
    cargja.$clinit_JSReactionEncoder();
    if (!options)
      options = { mode: 3 };
    options = Object.assign({}, options);
    if ("ensureCoordinates" in options) {
      options.ensureCoordinates = Boolean(options.ensureCoordinates);
      return cargja.decodeCoords(reaction, options.ensureCoordinates);
    }
    if (typeof options.mode !== "number")
      options.mode = 3;
    options.mode = Math.trunc(options.mode);
    return cargja.decodeMode(reaction, options.mode);
  };
  cargja.decodeCoords = function decodeCoords(strReaction, ensureCoordinates) {
    var reaction;
    reaction = carcr.decode_3(strReaction, ensureCoordinates, null);
    if (isNull(reaction))
      return null;
    return new cargja.JSReaction(reaction);
  };
  cargja.decodeMode = function decodeMode(strReaction, mode) {
    var reaction;
    reaction = carcr.decode_0(strReaction, mode, null);
    if (isNull(reaction))
      return null;
    return new cargja.JSReaction(reaction);
  };
  cargja.encode_1 = function encode_1(reaction, options) {
    cargja.$clinit_JSReactionEncoder();
    if (!options)
      options = { keepAbsoluteCoordinates: false, mode: 3 };
    options = Object.assign({}, options);
    options.keepAbsoluteCoordinates = Boolean(options.keepAbsoluteCoordinates);
    if ("sortByIDCode" in options) {
      options.sortByIDCode = Boolean(options.sortByIDCode);
      return cargja.encodeSort(reaction, options.keepAbsoluteCoordinates, options.sortByIDCode);
    }
    if (typeof options.mode !== "number")
      options.mode = 3;
    options.mode = Math.trunc(options.mode);
    return cargja.encodeMode(reaction, options.keepAbsoluteCoordinates, options.mode);
  };
  cargja.encodeMode = function encodeMode(reaction, keepAbsoluteCoordinates, mode) {
    return carcr.encode(reaction.getReaction_0(), keepAbsoluteCoordinates, mode);
  };
  cargja.encodeSort = function encodeSort(reaction, keepAbsoluteCoordinates, sortByIDCode) {
    return jl.join_2("#", carcr.encode_0(reaction.getReaction_0(), keepAbsoluteCoordinates, sortByIDCode));
  };
  defineClass(582, 1, { 1: 1 }, cargja.JSReactionEncoder);
  _.$init_177 = function $init_177() {
  };
  cargja.INCLUDE_ALL_0 = 15;
  cargja.INCLUDE_CATALYSTS_0 = 8;
  cargja.INCLUDE_COORDS_0 = 2;
  cargja.INCLUDE_DEFAULT_0 = 3;
  cargja.INCLUDE_DRAWING_OBJECTS_0 = 4;
  cargja.INCLUDE_MAPPING_0 = 1;
  cargja.INCLUDE_RXN_CODE_ONLY_0 = 0;
  cargja.MOLECULE_DELIMITER_0 = " ";
  cargja.OBJECT_DELIMITER_0 = "#";
  cargja.RETAIN_REACTANT_AND_PRODUCT_ORDER_0 = 16;
  cggl.Lcom_actelion_research_gwt_js_api_JSReactionEncoder_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSReactionEncoder", 582, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSReactor = function $clinit_JSReactor() {
    cargja.$clinit_JSReactor = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSReactor = function JSReactor(reaction) {
    cargja.$clinit_JSReactor();
    Object_0.call(this);
    this.$init_178();
    this.reactor = new carcr.Reactor_0(reaction.getReaction_0(), true);
  };
  defineClass(583, 1, { 1: 1 }, cargja.JSReactor);
  _.$init_178 = function $init_178() {
  };
  _.getProducts = function getProducts_2() {
    var i, j, jsProducts, products;
    products = this.reactor.getProducts_1();
    if (jsEquals(products, null) || products.length == 0) {
      return initMultidimensionalArray(cggl.Lcom_actelion_research_gwt_js_api_JSMolecule_2_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 194: 1, 4: 1, 1: 1, 7: 1 }], [194, 46], 0, [0, 0], 2);
    }
    jsProducts = initMultidimensionalArray(cggl.Lcom_actelion_research_gwt_js_api_JSMolecule_2_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 194: 1, 4: 1, 1: 1, 7: 1 }], [194, 46], 0, [products.length, products[0].length], 2);
    for (i = 0; i < products.length; i++) {
      for (j = 0; j < products[0].length; j++) {
        setCheck(jsProducts[i], j, new cargja.JSMolecule_1(products[i][j]));
      }
    }
    return jsProducts;
  };
  _.setReactant = function setReactant_0(no, reactant) {
    return this.reactor.setReactant_0(no, reactant.getStereoMolecule());
  };
  cggl.Lcom_actelion_research_gwt_js_api_JSReactor_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSReactor", 583, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSResources = function $clinit_JSResources() {
    cargja.$clinit_JSResources = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSResources = function JSResources() {
    cargja.$clinit_JSResources();
    Object_0.call(this);
    this.$init_179();
  };
  cargja._register = function _register(data_0) {
    cargja.$clinit_JSResources();
    ocu.registerResources(data_0);
    cargja.hasRegistered = true;
  };
  cargja.checkHasRegistered = function checkHasRegistered() {
    cargja.$clinit_JSResources();
    if (!cargja.hasRegistered) {
      cargja.throwUnregistered();
    }
  };
  cargja.throwUnregistered = function throwUnregistered() {
    throw new Error("static resources must be registered first");
  };
  defineClass(584, 1, { 1: 1 }, cargja.JSResources);
  _.$init_179 = function $init_179() {
  };
  cargja.hasRegistered = false;
  cggl.Lcom_actelion_research_gwt_js_api_JSResources_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSResources", 584, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSRingCollection = function $clinit_JSRingCollection() {
    cargja.$clinit_JSRingCollection = emptyMethod;
    jl.$clinit_Object();
    cargja.MODE_SMALL_AND_LARGE_RINGS_0 = 1 | 2;
    cargja.MODE_SMALL_RINGS_AND_AROMATICITY_0 = 1 | 4;
    cargja.MODE_SMALL_AND_LARGE_RINGS_AND_AROMATICITY_0 = 1 | 2 | 4;
  };
  cargja.JSRingCollection = function JSRingCollection(input_0) {
    cargja.$clinit_JSRingCollection();
    Object_0.call(this);
    this.$init_180();
    this.coll = input_0;
  };
  defineClass(288, 1, { 1: 1 }, cargja.JSRingCollection);
  _.$init_180 = function $init_180() {
  };
  _.determineAromaticity = function determineAromaticity_1(isAromatic, isDelocalized, heteroPosition, includeTautomericBonds) {
    this.coll.determineAromaticity_1(isAromatic, isDelocalized, heteroPosition, includeTautomericBonds);
  };
  _.getAtomIndex = function getAtomIndex_0(ringNo, atom) {
    return this.coll.getAtomIndex_0(ringNo, atom);
  };
  _.getAtomRingSize = function getAtomRingSize_2(atom) {
    return this.coll.getAtomRingSize_0(atom);
  };
  _.getBondIndex = function getBondIndex_3(ringNo, bond) {
    return this.coll.getBondIndex_0(ringNo, bond);
  };
  _.getBondRingSize = function getBondRingSize_2(bond) {
    return this.coll.getBondRingSize_0(bond);
  };
  _.getHeteroPosition = function getHeteroPosition_0(ringNo) {
    return this.coll.getHeteroPosition_0(ringNo);
  };
  _.getRingAtoms = function getRingAtoms_1(ringNo) {
    return this.coll.getRingAtoms_0(ringNo);
  };
  _.getRingBonds = function getRingBonds_2(ringNo) {
    return this.coll.getRingBonds_0(ringNo);
  };
  _.getRingSize = function getRingSize_0(ringNo) {
    return this.coll.getRingSize_0(ringNo);
  };
  _.getSharedRing = function getSharedRing_0(bond1, bond2) {
    return this.coll.getSharedRing_0(bond1, bond2);
  };
  _.getSize = function getSize_6() {
    return this.coll.getSize_0();
  };
  _.isAromatic = function isAromatic_1(ringNo) {
    return this.coll.isAromatic_0(ringNo);
  };
  _.isAtomMember = function isAtomMember_0(ringNo, atom) {
    return this.coll.isAtomMember_0(ringNo, atom);
  };
  _.isBondMember = function isBondMember_0(ringNo, bond) {
    return this.coll.isBondMember_0(ringNo, bond);
  };
  _.isDelocalized = function isDelocalized_1(ringNo) {
    return this.coll.isDelocalized_0(ringNo);
  };
  _.qualifiesAsAmideTypeBond = function qualifiesAsAmideTypeBond_0(bond) {
    return this.coll.qualifiesAsAmideTypeBond_0(bond);
  };
  _.validateMemberIndex = function validateMemberIndex_0(ringNo, index_0) {
    return this.coll.validateMemberIndex_0(ringNo, index_0);
  };
  cargja.MAX_SMALL_RING_SIZE_0 = 7;
  cargja.MODE_AROMATICITY_0 = 4;
  cargja.MODE_LARGE_RINGS_0 = 2;
  cargja.MODE_SMALL_AND_LARGE_RINGS_0 = 0;
  cargja.MODE_SMALL_AND_LARGE_RINGS_AND_AROMATICITY_0 = 0;
  cargja.MODE_SMALL_RINGS_0 = 1;
  cargja.MODE_SMALL_RINGS_AND_AROMATICITY_0 = 0;
  cargja.MODE_SMALL_RINGS_ONLY_0 = 1;
  cggl.Lcom_actelion_research_gwt_js_api_JSRingCollection_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSRingCollection", 288, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSSDFileParser = function $clinit_JSSDFileParser() {
    cargja.$clinit_JSSDFileParser = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSSDFileParser = function JSSDFileParser(sdf, fields) {
    cargja.$clinit_JSSDFileParser();
    Object_0.call(this);
    this.$init_181();
    this.parser = new carci.SDFileParser(new ji.StringReader(sdf), fields);
  };
  defineClass(585, 1, { 1: 1 }, cargja.JSSDFileParser);
  _.$init_181 = function $init_181() {
  };
  _.getField = function getField(name_0) {
    var i, names;
    names = this.parser.getFieldNames_0();
    for (i = 0; i < names.length; i++) {
      if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(names[i], name_0)) {
        return this.parser.getFieldData_0(i);
      }
    }
    return null;
  };
  _.getFieldData = function getFieldData_0(idx) {
    return this.parser.getFieldData_0(idx);
  };
  _.getFieldNames = function getFieldNames_1(recordsToInspect) {
    return this.parser.getFieldNames_1(recordsToInspect);
  };
  _.getMolecule = function getMolecule_8() {
    return new cargja.JSMolecule_1(this.parser.getMolecule_0());
  };
  _.getNextFieldData = function getNextFieldData_0() {
    return this.parser.getNextFieldData_0();
  };
  _.getNextMolFile = function getNextMolFile_0() {
    return this.parser.getNextMolFile_0();
  };
  _.next = function next_1() {
    return this.parser.next_1();
  };
  cggl.Lcom_actelion_research_gwt_js_api_JSSDFileParser_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSSDFileParser", 585, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSSSSearcher = function $clinit_JSSSSearcher() {
    cargja.$clinit_JSSSSearcher = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSSSSearcher = function JSSSSearcher() {
    cargja.$clinit_JSSSSearcher();
    Object_0.call(this);
    this.$init_182();
  };
  defineClass(586, 1, { 1: 1 }, cargja.JSSSSearcher);
  _.$init_182 = function $init_182() {
    this.searcher = new carc2.SSSearcher();
  };
  _.isFragmentInMolecule = function isFragmentInMolecule_2() {
    return this.searcher.isFragmentInMolecule_0();
  };
  _.setFragment = function setFragment_6(fragment) {
    this.searcher.setFragment_1(fragment.getStereoMolecule());
  };
  _.setMol = function setMol_0(fragment, molecule) {
    this.setMolecule(molecule);
    this.setFragment(fragment);
  };
  _.setMolecule = function setMolecule_4(molecule) {
    this.searcher.setMolecule_0(molecule.getStereoMolecule());
  };
  cggl.Lcom_actelion_research_gwt_js_api_JSSSSearcher_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSSSSearcher", 586, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSSSSearcherWithIndex = function $clinit_JSSSSearcherWithIndex() {
    cargja.$clinit_JSSSSearcherWithIndex = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSSSSearcherWithIndex = function JSSSSearcherWithIndex() {
    cargja.$clinit_JSSSSearcherWithIndex();
    Object_0.call(this);
    this.$init_183();
  };
  cargja.bitCount_0 = function bitCount_0(x_0) {
    cargja.$clinit_JSSSSearcherWithIndex();
    return bitCount_1(x_0);
  };
  cargja.getHexStringFromIndex_0 = function getHexStringFromIndex_0(index_0) {
    cargja.$clinit_JSSSSearcherWithIndex();
    return carc2.getHexStringFromIndex(index_0);
  };
  cargja.getIndexFromHexString_0 = function getIndexFromHexString_0(hex) {
    cargja.$clinit_JSSSSearcherWithIndex();
    return carc2.getIndexFromHexString(hex);
  };
  cargja.getKeyIDCode = function getKeyIDCode() {
    cargja.$clinit_JSSSSearcherWithIndex();
    return carc2.$clinit_SSSearcherWithIndex(), carc2.cKeyIDCode;
  };
  cargja.getSimilarityAngleCosine_0 = function getSimilarityAngleCosine_0(index1, index2) {
    cargja.$clinit_JSSSSearcherWithIndex();
    return carc2.getSimilarityAngleCosine(index1, index2);
  };
  cargja.getSimilarityTanimoto_0 = function getSimilarityTanimoto_0(index1, index2) {
    cargja.$clinit_JSSSSearcherWithIndex();
    return carc2.getSimilarityTanimoto(index1, index2);
  };
  defineClass(587, 1, { 1: 1 }, cargja.JSSSSearcherWithIndex);
  _.$init_183 = function $init_183() {
    this.searcher = new carc2.SSSearcherWithIndex();
  };
  _.createIndex = function createIndex_0(molecule) {
    return this.searcher.createIndex_0(molecule.getStereoMolecule());
  };
  _.isFragmentInMolecule = function isFragmentInMolecule_3() {
    return this.searcher.isFragmentInMolecule_0();
  };
  _.setFragment = function setFragment_7(fragment, index_0) {
    this.searcher.setFragment_2(fragment.getStereoMolecule(), index_0);
  };
  _.setMolecule = function setMolecule_5(molecule, index_0) {
    this.searcher.setMolecule_1(molecule.getStereoMolecule(), index_0);
  };
  cggl.Lcom_actelion_research_gwt_js_api_JSSSSearcherWithIndex_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSSSSearcherWithIndex", 587, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSSmilesParser = function $clinit_JSSmilesParser() {
    cargja.$clinit_JSSmilesParser = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSSmilesParser = function JSSmilesParser(options) {
    cargja.$clinit_JSSmilesParser();
    Object_0.call(this);
    this.$init_184();
    this.init_6(options);
  };
  defineClass(588, 1, { 1: 1 }, cargja.JSSmilesParser);
  _.$init_184 = function $init_184() {
  };
  _.getSmartsWarning = function getSmartsWarning_0() {
    return this.oclParser.getSmartsWarning_0();
  };
  _.init_6 = function init_7(options) {
    options = options || {};
    var smartsMode = options.smartsMode || "smiles";
    var skipCoordinateTemplates = options.skipCoordinateTemplates || false;
    var makeHydrogenExplicit = options.makeHydrogenExplicit || false;
    var noCactvs = options.noCactvs || false;
    var singleDotSeparator = options.singleDotSeparator || false;
    var createSmartsWarnings = options.createSmartsWarnings || false;
    this.init_7(smartsMode, skipCoordinateTemplates, makeHydrogenExplicit, noCactvs, singleDotSeparator, createSmartsWarnings);
  };
  _.init_7 = function init_8(smartsMode, skipCoordinateTemplates, makeHydrogenExplicit, noCactvs, singleDotSeparator, createSmartsWarnings) {
    var mode;
    mode = 0;
    switch (smartsMode) {
      case "smarts":
        mode = 2;
        break;
      case "guess":
        mode = 1;
        break;
    }
    if (makeHydrogenExplicit) {
      mode |= 8;
    }
    if (skipCoordinateTemplates) {
      mode |= 4;
    }
    if (noCactvs) {
      mode |= 16;
    }
    if (singleDotSeparator) {
      mode |= 32;
    }
    if (createSmartsWarnings) {
      mode |= 64;
    }
    this.oclParser = new carc2.SmilesParser_0(mode);
  };
  _.parseMolecule_0 = function parseMolecule(molecule, smiles, createCoordinates, readStereoFeatures) {
    this.oclParser.parse_9(molecule.getStereoMolecule(), jl.getBytes___B__devirtual$(smiles), createCoordinates, readStereoFeatures);
    return molecule;
  };
  _.parseMolecule = function parseMolecule_0(smiles, options) {
    options = options || {};
    var molecule = options.molecule || new cargja.JSMolecule();
    var createCoordinates = !options.noCoordinates;
    var readStereoFeatures = !options.noStereo;
    return this.parseMolecule_0(molecule, smiles, createCoordinates, readStereoFeatures);
  };
  _.parseReaction = function parseReaction_1(smiles) {
    return new cargja.JSReaction(this.oclParser.parseReaction_0(smiles));
  };
  _.setRandomSeed = function setRandomSeed_1(seed) {
    this.oclParser.setRandomSeed_0(fromInt_0(seed));
  };
  cggl.Lcom_actelion_research_gwt_js_api_JSSmilesParser_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSSmilesParser", 588, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSToxicityPredictor = function $clinit_JSToxicityPredictor() {
    cargja.$clinit_JSToxicityPredictor = emptyMethod;
    jl.$clinit_Object();
    cargja.RISK_NAMES = (carcp.$clinit_ToxicityPredictor(), carcp.cRiskNameN);
  };
  cargja.JSToxicityPredictor = function JSToxicityPredictor() {
    cargja.$clinit_JSToxicityPredictor();
    Object_0.call(this);
    this.$init_185();
    cargja.checkHasRegistered();
    this.predictor = new carcp.ToxicityPredictor();
  };
  defineClass(589, 1, { 1: 1 }, cargja.JSToxicityPredictor);
  _.$init_185 = function $init_185() {
  };
  _.assessRisk = function assessRisk_0(molecule, riskType) {
    return this.predictor.assessRisk_0(molecule.getStereoMolecule(), riskType, cargju.getInstance_1());
  };
  _.getDetail = function getDetail_5(molecule, riskType) {
    return cargju.convertParameterizedStringList(this.predictor.getDetail_2(molecule.getStereoMolecule(), riskType));
  };
  cargja.RISK_HIGH = 3;
  cargja.RISK_LOW = 2;
  cargja.RISK_NO = 1;
  cargja.RISK_UNKNOWN = 0;
  cargja.TYPE_IRRITANT = 2;
  cargja.TYPE_MUTAGENIC = 0;
  cargja.TYPE_REPRODUCTIVE_EFFECTIVE = 3;
  cargja.TYPE_TUMORIGENIC = 1;
  cggl.Lcom_actelion_research_gwt_js_api_JSToxicityPredictor_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSToxicityPredictor", 589, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSTransformer = function $clinit_JSTransformer() {
    cargja.$clinit_JSTransformer = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSTransformer = function JSTransformer(reactant, product, name_0) {
    cargja.$clinit_JSTransformer();
    Object_0.call(this);
    this.$init_186();
    this.transformer = new carcr.Transformer(reactant.getStereoMolecule(), product.getStereoMolecule(), name_0);
  };
  defineClass(590, 1, { 1: 1 }, cargja.JSTransformer);
  _.$init_186 = function $init_186() {
  };
  _.applyTransformation = function applyTransformation_1(molecule, matchNo) {
    this.transformer.applyTransformation_1(molecule.getStereoMolecule(), matchNo);
  };
  _.setMolecule = function setMolecule_6(molecule, countMode) {
    return this.transformer.setMolecule_3(molecule.getStereoMolecule(), 4);
  };
  cggl.Lcom_actelion_research_gwt_js_api_JSTransformer_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSTransformer", 590, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_JSUtil = function $clinit_JSUtil() {
    cargja.$clinit_JSUtil = emptyMethod;
    jl.$clinit_Object();
  };
  cargja.JSUtil = function JSUtil() {
    cargja.$clinit_JSUtil();
    Object_0.call(this);
    this.$init_187();
  };
  cargja.getHoseCodesFromDiastereotopicID = function getHoseCodesFromDiastereotopicID(diastereotopicID, options) {
    cargja.$clinit_JSUtil();
    options = options || {};
    var maxSphereSize = (typeof options.maxSphereSize === "undefined" ? 5 : options.maxSphereSize) | 0;
    var type_0 = (typeof options.type === "undefined" ? 0 : options.type) | 0;
    return carcc2.getHoseCodesFromDiaID(diastereotopicID, maxSphereSize, type_0);
  };
  defineClass(591, 1, { 1: 1 }, cargja.JSUtil);
  _.$init_187 = function $init_187() {
  };
  cggl.Lcom_actelion_research_gwt_js_api_JSUtil_2_classLit = createForClass("com.actelion.research.gwt.js.api", "JSUtil", 591, cggl.Ljava_lang_Object_2_classLit);
  cargja.$clinit_MolecularFormula_0 = function $clinit_MolecularFormula_0() {
    cargja.$clinit_MolecularFormula_0 = emptyMethod;
    carc2.$clinit_MolecularFormula();
  };
  cargja.MolecularFormula_0 = function MolecularFormula_0(mol) {
    cargja.$clinit_MolecularFormula_0();
    carc2.MolecularFormula.call(this, mol);
    this.$init_188();
  };
  defineClass(287, 105, { 105: 1, 1: 1 }, cargja.MolecularFormula_0);
  _.$init_188 = function $init_188() {
  };
  defineProperties(_, { absoluteWeight: {
    "get": function getAbsoluteWeight_0() {
      return getClassPrototype(105).getAbsoluteWeight.call(this);
    }
  } });
  _.getAbsoluteWeight = function() {
    return this.absoluteWeight;
  };
  defineProperties(_, { formula: {
    "get": function getFormula_0() {
      return getClassPrototype(105).getFormula.call(this);
    }
  } });
  _.getFormula = function() {
    return this.formula;
  };
  defineProperties(_, { relativeWeight: {
    "get": function getRelativeWeight_0() {
      return getClassPrototype(105).getRelativeWeight.call(this);
    }
  } });
  _.getRelativeWeight = function() {
    return this.relativeWeight;
  };
  cggl.Lcom_actelion_research_gwt_js_api_MolecularFormula_2_classLit = createForClass("com.actelion.research.gwt.js.api", "MolecularFormula", 287, cggl.Lcom_actelion_research_chem_MolecularFormula_2_classLit);
  cargjag.$clinit_JSEditorArea = function $clinit_JSEditorArea() {
    cargjag.$clinit_JSEditorArea = emptyMethod;
    jl.$clinit_Object();
    cargjag.IMAGE_DATA_16_0 = (cargg.$clinit_GenericCursorHelper(), cargg.IMAGE_DATA_16);
    cargjag.HOTSPOT_16_0 = (cargg.$clinit_GenericCursorHelper(), cargg.HOTSPOT_16);
    cargjag.HOTSPOT_32_0 = (cargg.$clinit_GenericCursorHelper(), cargg.HOTSPOT_32);
    cargjag.IMAGE_NAME_32_0 = (cargg.$clinit_GenericCursorHelper(), cargg.IMAGE_NAME_32);
    cargjag.TableLayoutPreferred = -2;
    cargjag.TableLayoutFill = -1;
  };
  cargjag.JSEditorArea = function JSEditorArea(mode, jsObject, uiHelper) {
    cargjag.$clinit_JSEditorArea();
    var clipboardHandler;
    Object_0.call(this);
    this.$init_189();
    this.mDrawArea = new carge.GenericEditorArea(new carc2.StereoMolecule(), mode, uiHelper, this);
    this.mDrawArea.addDrawAreaListener(new cargjag.JSEditorArea$1(this));
    this.mJsObject = jsObject;
    this.mUIHelper = uiHelper;
    this.mMouseHandler = new cargjagi.JSMouseHandler(this.mDrawArea);
    this.mMouseHandler.addListener(this.mDrawArea);
    this.mKeyHandler = new cargjagi.JSKeyHandler(this.mDrawArea);
    this.mKeyHandler.addListener(this.mDrawArea);
    clipboardHandler = this.getClipboardHandler_0();
    this.mDrawArea.setClipboardHandler(new cargjagi.JSClipboardHandler(clipboardHandler));
  };
  defineClass(592, 1, { 1: 1 }, cargjag.JSEditorArea);
  _.$init_189 = function $init_189() {
  };
  _.lambda$0_0 = function lambda$0_2() {
    cargjag.$clinit_JSEditorArea();
    this.draw_0();
  };
  _.addPastedOrDropped = function addPastedOrDropped_0(mol, x_0, y_0) {
    this.mDrawArea.addPastedOrDropped_0(mol.getStereoMolecule(), null);
  };
  _.callJsEventListener = function callJsEventListener(what, isUserChange) {
    cargjag.$clinit_JSEditorArea();
    var jsObject = this.getJsObject();
    return jsObject.onChange(what, isUserChange);
  };
  _.clearAll = function clearAll_0() {
    this.mDrawArea.clearAll_0();
  };
  _.draw_0 = function draw_1() {
    this.mDrawPending = false;
    this.mDrawArea.paintContent(this.getDrawContext_0());
  };
  _.fireKeyEvent = function fireKeyEvent(what, key, isAltDown, isCtrlDown, isShiftDown, isMenuShortcut) {
    var gke;
    gke = new cargg.GenericKeyEvent(what, key, isAltDown, isCtrlDown, isShiftDown, isMenuShortcut, this.mDrawArea);
    this.mKeyHandler.fireEvent(gke);
  };
  _.fireMouseEvent = function fireMouseEvent(what, button, clickCount, x_0, y_0, shiftDown, ctrlDown, altDown, isPopupTrigger) {
    var gme;
    gme = new cargg.GenericMouseEvent(what, button, clickCount, x_0, y_0, shiftDown, ctrlDown, altDown, isPopupTrigger, this.mDrawArea);
    this.mMouseHandler.fireEvent(gme);
  };
  _.getBackgroundRGB_0 = function getBackgroundRGB_0() {
    var jsObject = this.getJsObject();
    return jsObject.getBackgroundRGB();
  };
  _.getCanvasHeight_0 = function getCanvasHeight() {
    var jsObject = this.getJsObject();
    return jsObject.getCanvasHeight();
  };
  _.getCanvasWidth_0 = function getCanvasWidth() {
    var jsObject = this.getJsObject();
    return jsObject.getCanvasWidth();
  };
  _.getClipboardHandler_0 = function getClipboardHandler() {
    var jsObject = this.getJsObject();
    return jsObject.getClipboardHandler();
  };
  _.getDrawContext_0 = function getDrawContext() {
    return new cargjagi.JSDrawContext(this.getDrawContextFromJsObject());
  };
  _.getDrawContextFromJsObject = function getDrawContextFromJsObject() {
    var jsObject = this.getJsObject();
    return jsObject.getDrawContext();
  };
  _.getGenericEditorArea = function getGenericEditorArea() {
    return this.mDrawArea;
  };
  _.getJsObject = function getJsObject() {
    return this.mJsObject;
  };
  _.getMode = function getMode_1() {
    return this.mDrawArea.getMode_0();
  };
  _.getMolecule = function getMolecule_9() {
    return new cargja.JSMolecule_1(this.mDrawArea.getMolecule_0());
  };
  _.getReaction = function getReaction_4() {
    return new cargja.JSReaction(this.mDrawArea.getReaction_0());
  };
  _.moleculeChanged = function moleculeChanged_0() {
    this.mDrawArea.moleculeChanged_0();
  };
  _.repaint = function repaint() {
    if (!this.mDrawPending) {
      this.mDrawPending = true;
      this.mUIHelper.runLater(new cargjag.JSEditorArea$lambda$0$Type(this));
    }
  };
  _.repaint_0 = function() {
    this.repaint();
  };
  _.setMolecule = function setMolecule_7(molecule) {
    this.mDrawArea.setMolecule_0(molecule.getStereoMolecule());
  };
  _.setReaction = function setReaction_0(reaction) {
    this.mDrawArea.setReaction_0(reaction.getReaction_0());
  };
  _.toolChanged = function toolChanged_0(newTool) {
    this.mDrawArea.toolChanged_0(newTool);
  };
  _.mDrawPending = false;
  cargjag.EDITOR_EVENT_HIGHLIGHT_ATOM_CHANGED = 4;
  cargjag.EDITOR_EVENT_HIGHLIGHT_BOND_CHANGED = 8;
  cargjag.EDITOR_EVENT_MOLECULE_CHANGED = 1;
  cargjag.EDITOR_EVENT_SELECTION_CHANGED = 2;
  cargjag.KEY_ALT_0 = -2;
  cargjag.KEY_BACK_SPACE_0 = -5;
  cargjag.KEY_CTRL_0 = -1;
  cargjag.KEY_DELETE_0 = -4;
  cargjag.KEY_ENTER_0 = -8;
  cargjag.KEY_ESCAPE_0 = -7;
  cargjag.KEY_EVENT_PRESSED = 1;
  cargjag.KEY_EVENT_RELEASED = 2;
  cargjag.KEY_HELP_0 = -6;
  cargjag.KEY_SHIFT_0 = -3;
  cargjag.MODE_DRAWING_OBJECTS_0 = 8;
  cargjag.MODE_MARKUSH_STRUCTURE_0 = 2;
  cargjag.MODE_MULTIPLE_FRAGMENTS_0 = 1;
  cargjag.MODE_REACTION_0 = 4;
  cargjag.MOUSE_EVENT_CLICKED = 3;
  cargjag.MOUSE_EVENT_DRAGGED = 7;
  cargjag.MOUSE_EVENT_ENTERED = 4;
  cargjag.MOUSE_EVENT_EXITED = 5;
  cargjag.MOUSE_EVENT_MOVED = 6;
  cargjag.MOUSE_EVENT_PRESSED = 1;
  cargjag.MOUSE_EVENT_RELEASED = 2;
  cargjag.TableLayoutFill = 0;
  cargjag.TableLayoutPreferred = 0;
  cargjag.cChainCursor_0 = 0;
  cargjag.cDeleteCursor_0 = 1;
  cargjag.cFistCursor_0 = 4;
  cargjag.cHandCursor_0 = 2;
  cargjag.cHandPlusCursor_0 = 3;
  cargjag.cInvisibleCursor_0 = 10;
  cargjag.cLassoCursor_0 = 5;
  cargjag.cLassoPlusCursor_0 = 6;
  cargjag.cPointedHandCursor_0 = 13;
  cargjag.cPointerCursor_0 = 11;
  cargjag.cSelectRectCursor_0 = 7;
  cargjag.cSelectRectPlusCursor_0 = 8;
  cargjag.cTextCursor_0 = 12;
  cargjag.cZoomCursor_0 = 9;
  cggl.Lcom_actelion_research_gwt_js_api_generic_JSEditorArea_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic", "JSEditorArea", 592, cggl.Ljava_lang_Object_2_classLit);
  cargjag.$clinit_JSEditorArea$1 = function $clinit_JSEditorArea$1() {
    cargjag.$clinit_JSEditorArea$1 = emptyMethod;
    jl.$clinit_Object();
  };
  cargjag.JSEditorArea$1 = function JSEditorArea$1(this$0) {
    cargjag.$clinit_JSEditorArea$1();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_190();
  };
  defineClass(331, 1, { 109: 1, 1: 1 }, cargjag.JSEditorArea$1);
  _.$init_190 = function $init_190() {
  };
  _.eventHappened_0 = function eventHappened_14(e) {
    this.eventHappened_5(castTo(e, 108));
  };
  _.eventHappened_5 = function eventHappened_13(e) {
    this.this$01.callJsEventListener(e.getWhat(), e.isUserChange());
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_JSEditorArea$1_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic", "JSEditorArea/1", 331, cggl.Ljava_lang_Object_2_classLit);
  cargjag.$clinit_JSEditorArea$lambda$0$Type = function $clinit_JSEditorArea$lambda$0$Type() {
    cargjag.$clinit_JSEditorArea$lambda$0$Type = emptyMethod;
  };
  cargjag.JSEditorArea$lambda$0$Type = function JSEditorArea$lambda$0$Type($$outer_0) {
    cargjag.$clinit_JSEditorArea$lambda$0$Type();
    this.$$outer_0 = $$outer_0;
  };
  defineClass(334, 1, { 1: 1, 130: 1 }, cargjag.JSEditorArea$lambda$0$Type);
  _.run = function run_0() {
    this.$$outer_0.lambda$0_0();
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_JSEditorArea$lambda$0$Type_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic", "JSEditorArea/lambda$0$Type", 334, cggl.Ljava_lang_Object_2_classLit);
  cargjag.$clinit_JSEditorToolbar = function $clinit_JSEditorToolbar() {
    cargjag.$clinit_JSEditorToolbar = emptyMethod;
    jl.$clinit_Object();
  };
  cargjag.JSEditorToolbar = function JSEditorToolbar(jsEditorArea, jsObject, uiHelper) {
    cargjag.$clinit_JSEditorToolbar();
    Object_0.call(this);
    this.$init_191();
    this.mGenericToolbar = new carge.GenericEditorToolbar(this, jsEditorArea.getGenericEditorArea());
    this.mJsObject = jsObject;
    this.mUIHelper = uiHelper;
    this.mMouseHandler = new cargjagi.JSMouseHandler(this.mGenericToolbar);
    this.mMouseHandler.addListener(this.mGenericToolbar);
    this.setDimensions(this.mGenericToolbar.getWidth_1(), this.mGenericToolbar.getHeight_1());
    this.draw_1();
  };
  defineClass(595, 1, { 1: 1 }, cargjag.JSEditorToolbar);
  _.$init_191 = function $init_191() {
  };
  _.getDrawContext_0 = function getDrawContext_0() {
    return this.getDrawContext_1();
  };
  _.lambda$0_1 = function lambda$0_3() {
    cargjag.$clinit_JSEditorToolbar();
    this.draw_1();
  };
  _.draw_1 = function draw_2() {
    var ctx_0;
    this.mDrawPending = false;
    ctx_0 = this.getDrawContext_1();
    ctx_0.clearRect_0(0, 0, this.getWidth(), this.getHeight());
    this.mGenericToolbar.paintContent(this.getDrawContext_1());
  };
  _.fireMouseEvent = function fireMouseEvent_0(what, button, clickCount, x_0, y_0, shiftDown, ctrlDown, altDown, isPopupTrigger) {
    var gme;
    gme = new cargg.GenericMouseEvent(what, button, clickCount, x_0, y_0, shiftDown, ctrlDown, altDown, isPopupTrigger, this.mGenericToolbar);
    this.mMouseHandler.fireEvent(gme);
  };
  _.getBackgroundRGB_0 = function getBackgroundRGB_1() {
    var jsObject = this.getJsObject_0();
    return jsObject.getBackgroundRGB();
  };
  _.getCanvasHeight_0 = function getCanvasHeight_0() {
    var jsObject = this.getJsObject_0();
    return jsObject.getCanvasHeight();
  };
  _.getCanvasWidth_0 = function getCanvasWidth_0() {
    var jsObject = this.getJsObject_0();
    return jsObject.getCanvasWidth();
  };
  _.getDrawContext_1 = function getDrawContext_1() {
    return new cargjagi.JSDrawContext(this.getDrawContextFromJsObject_0());
  };
  _.getDrawContextFromJsObject_0 = function getDrawContextFromJsObject_0() {
    var jsObject = this.getJsObject_0();
    return jsObject.getDrawContext();
  };
  _.getHeight = function getHeight_2() {
    return this.mGenericToolbar.getHeight_1();
  };
  _.getJsObject_0 = function getJsObject_0() {
    return this.mJsObject;
  };
  _.getWidth = function getWidth_2() {
    return this.mGenericToolbar.getWidth_1();
  };
  _.repaint_0 = function repaint_0() {
    if (!this.mDrawPending) {
      this.mDrawPending = true;
      this.mUIHelper.runLater(new cargjag.JSEditorToolbar$lambda$0$Type(this));
    }
  };
  _.setDimensions = function setDimensions(width_0, height) {
    var jsObject = this.getJsObject_0();
    return jsObject.setDimensions(width_0, height);
  };
  _.mDrawPending = false;
  cggl.Lcom_actelion_research_gwt_js_api_generic_JSEditorToolbar_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic", "JSEditorToolbar", 595, cggl.Ljava_lang_Object_2_classLit);
  cargjag.$clinit_JSEditorToolbar$lambda$0$Type = function $clinit_JSEditorToolbar$lambda$0$Type() {
    cargjag.$clinit_JSEditorToolbar$lambda$0$Type = emptyMethod;
  };
  cargjag.JSEditorToolbar$lambda$0$Type = function JSEditorToolbar$lambda$0$Type($$outer_0) {
    cargjag.$clinit_JSEditorToolbar$lambda$0$Type();
    this.$$outer_0 = $$outer_0;
  };
  defineClass(343, 1, { 1: 1, 130: 1 }, cargjag.JSEditorToolbar$lambda$0$Type);
  _.run = function run_1() {
    this.$$outer_0.lambda$0_1();
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_JSEditorToolbar$lambda$0$Type_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic", "JSEditorToolbar/lambda$0$Type", 343, cggl.Ljava_lang_Object_2_classLit);
  cargjag.$clinit_JSUIHelper = function $clinit_JSUIHelper() {
    cargjag.$clinit_JSUIHelper = emptyMethod;
    jl.$clinit_Object();
  };
  cargjag.JSUIHelper = function JSUIHelper(jsObject) {
    cargjag.$clinit_JSUIHelper();
    Object_0.call(this);
    this.$init_192();
    this.mJsObject = jsObject;
    this.registerToJs();
  };
  defineClass(593, 1, { 1: 1 }, cargjag.JSUIHelper);
  _.$init_192 = function $init_192() {
  };
  _.createImage_0 = function createImage(width_0, height) {
    return this.createImage(width_0, height);
  };
  _.build16x16CursorImage = function build16x16CursorImage_0(cursor) {
    var cursorImage;
    cursorImage = this.createImage(16, 16);
    cargg.build16x16CursorImage(cursorImage, cursor);
    return cursorImage.getJsImage();
  };
  _.createDialog = function createDialog(title_0, consumer) {
    var dialog;
    dialog = new cargjagi.JSDialog(this.createNativeDialog(title_0), this.mEditorArea);
    dialog.setEventConsumer_0(consumer);
    return dialog;
  };
  _.createDialog_0 = function(title_0, consumer) {
    return this.createDialog(title_0, consumer);
  };
  _.createImage = function createImage_0(width_0, height) {
    var jsObject = this.getJsObject_1();
    var image = jsObject.createImage(width_0, height);
    return new cargjagi.JSImage(image);
  };
  _.createImage_1 = function createImage_1(name_0) {
    var data_0;
    if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(name_0, "editorButtons.png")) {
      data_0 = "%5968%UDy0ClA8tJ9QPLT6UDy08FA8tJVQPLQK%858%BQPLQdUDy0yVA8tP9QPLT/UDy0/1A8tP9QPLSW%362%D4BwYC+AYGAvgHBgE%303%D/AAAB/wAAAQ%159%FA8tC1QPLThUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTl%330%D5BgcB+AcGBPkHBhX5BwdN+QYHefgHB2/5Bwc8+AYGFfgGBgj5BgcF+AYGAvkHBgE%245%/wAAAf8AAAL/AAAG/wAAEP8AACP/AAA7/wAAP/8AAD3/AAAg/wAABw%154%UDy0RFA8tPJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT5%325%PkFCAT4BgZE+QcHo/gHB+X5Bwb/+QcH//kHB//4Bwf9+QYH1vgHB5X5BwZD+QcGDvkHBwb5BgYD+QcGAQ%228%D/AAAS/wAARP8AAIL/AAC4/wAA2/8AAPf/AAD//wAA//8AAPj/AAB+/wAADw%148%BQPLRnUDy0+1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%314%D5BwYC+AYHK/kHBrb4Bwf4+AcH//gHB//5Bwf/+AcG//kHBv/5Bwf/+AYH//gHB/75Bwf3+AYHs/kHBkH5BgcR+QYGB/kFBgL6BgYB%197%P8AAAH/AAAI/wAAKP8AAIj/AADh/wAA9/8AAP3/AAD//wAA//8AAP//AAD6/wAAzv8AAGH/AAAq/wAAEw%143%FA8tI9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%304%+QYHAfoIBwX4BgZu+QcH6fkGB//5Bgf/+QYH//kHB//5Bwf/+QcG//kHBv/4Bwb/+AcH//gHB//5Bgf/+AcH//kHBvT5Bwas+QYGO/kGBgr5BgUG+gUFAQ%175%P8AAAE%5%/wAACv8AAFX/AACy/wAA8P8AAP//AAD//wAA//8AAP//AAD//wAA//8AANP/AACD/wAARf8AACz/AAAZ/wAACQ%132%BQPLQJUDy0qlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%304%+QcGBPkGB374Bwf5+AcH//kHB//5Bwf/+QcH//kHBv/4Bwf/+AcH//gHB//5Bwf/+QcG//gHB//5Bwf/+QcG//gGB//4Bwb/+QYG8PkGBoD5BgYg+gYFCvoFBQQ%165%/wAAAf8AAA7/AABV/wAAzf8AAPv/AAD//wAA//8AAP//AAD//wAA//8AAPz/AADo/wAAkf8AAEr/AAAz/wAAH/8AAA//AAAG/wAAAQ%127%FA8tBNQPLTDUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%304%+QYGUvgHBvn4Bwf/+AcH//kHB//5Bwf/+QcH//kHB//4Bgf/+QcH//gHB//4Bwb/+AcH//gHB//4Bgf/+QcG//gGB//5Bwf/+QYG//kGBv76BgbL+gYFTfoFBQ76BQUH+gUEAQ%148%D/AAAG/wAAWf8AAMb/AAD9/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA7P8AAJ3/AABW/wAANP8AACL/AAAS/wAAB/8AAAI%133%UDy0I1A8tNtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%293%PkHBwH4BwYD+AYHwfgHB//4Bwb/+QYH//gGBv/4Bwf/+QYH//kGB//5Bwf/+AcH//gHB//5Bwb/+AcH//kGB//4Bwf/+AYG//kHB//4Bwb/+AYG//kHB//5BQb/+QYF8/oFBX76BQUd+wQFCfsEBAI%133%/wAABv8AADj/AAC5/wAA/P8AAP//AAD//wAA//8AAP//AAD//wAA//8AAPP/AAC6/wAAXv8AADn/AAAm/wAAE/8AAAj/AAAC/wAAAQ%132%BQPLQ7UDy06FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%293%PgGBgH4BggD+QcGqPgHB//4Bwf/+AcH//gHB//4Bwf/+AcG//gHB//4Bgf/+QYG//gGBv/5Bgb/+AcH//kHB//4Bgb/+QcH//gHB//5Bwf/+QcH//kHBv/5Bgb/+gYG//oFBfz6BQW++wQFMfoFBAz7BAQE%112%/wAAAQ%4%D/AAAf/wAAo/8AAPD/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA0P8AAHL/AABB/wAAKf8AABb/AAAJ/wAAA/8AAAE%138%FA8tFNQPLT2UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%293%PgGBwH4BwcE+AcHJ/gHB8j4Bgf/+AcH//kHBv/4Bwf/+QcH//gHB//5Bgb/+AcG//gHB//4Bwf/+AYH//gHB//4Bwb/+QcH//kGB//5Bwf/+AYH//kHBv/5Bgb/+QYG//oFBv/6BQX/+gQF3foEBVL7BAQR+wMEBvwDAwE%101%/wAAEP8AAGj/AADm/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAOj/AACX/wAASP8AADD/AAAb/wAADP8AAAT/AAAB%144%UDy0blA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0LlA8tAI%287%D5BgcC+QcGC/gGBir5Bwea+QcH9vkHB//4Bwb/+QYG//gHB//4Bwf/+QYG//gGB//4Bwf/+AcH//gGBv/4Bwf/+QYH//kGB//4Bgf/+QcH//gHBv/5Bgb/+QUG//kGBf/6BQX/+gUF//oEBfD7BAR0/AQEFPsDAwj8BAMC%80%/wAAAf8AAAL/AAA1/wAAyv8AAPr/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD8/wAAwv8AAGD/AAA5/wAAI/8AABD/AAAG/wAAAg%143%FA8tAFQPLSRUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTmUDy0yFA8tJpQPLR4UDy0UFA8tCI%261%+AYHA/gGBw35BwYa+AYHWPkHBr75Bwf4+AcH//kHB//4Bwf/+AYH//gHB//5Bwf/+QcH//gHB//4Bwb/+QcG//kHBv/4Bwf/+QcG//gHBv/5Bgb/+QYG//oGBv/6BQX/+gUF//sEBf/7BAT+/AQEkvwDAx38AwMK/QMDAg%74%/wAAFP8AAIP/AADy/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAO7/AACX/wAAR/8AAC7/AAAX/wAACf8AAAI%149%UDy0B1A8tKpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTzUDy0v1A8tI1QPLRSUDy0Fw%239%PkHBwL4BwcI+AYGFPgHByf5Bgdh+AYHzPkHB/v5Bwf/+QcG//kHBv/4Bwb/+QcG//kHB//5Bwf/+QYG//gHBv/4Bwf/+QcH//gGB//5Bwb/+QYG//oGBv/6BgX/+gQF//oFBP/7BAT/+wQE/fwEBK/8BAMk/AMDDPwCAgM%53%/wAAAf8AAAP/AAA5/wAA0v8AAP3/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+/wAA3P8AAGz/AAA8/wAAIv8AAA//AAAF/wAAAQ%148%BQPLQTUDy0xlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNdQPLSTUDy0TlA8tAw%223%D4BgYB+QcHBPkHBgv4BwcV+AYGK/gHB3H4BwfM+AcH/vgHB//4Bgf/+QYG//gHB//4Bwb/+AYH//gHBv/5Bwf/+QcH//gHB//4Bwb/+QYG//kGBv/6Bgb/+gUF//sEBf/7BAT/+wQE//wEBP78AwS7/AMDLP0DAgz9AgID%37%P8AAAE%5%/wAAEP8AAIL/AADx/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAC5/wAAVv8AADH/AAAa/wAACf8AAAI%154%FA8tCBQPLTZUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPxQPLS3UDy0aVA8tBg%218%PkHBwH5BwcF+QYHDPgHBxn5Bwct+QYHd/kHBt/5Bwb8+AcG//gHB//4Bwf/+QcG//gGBv/4Bwf/+AcG//gHB//5Bgb/+QcH//kGBv/6BgX/+gYF//oFBf/7BAX/+wUE//sEBP/7AwT//AMDy/0DAzP8AwIO/QIDB%32%P8AAAP/AAAr/wAAx/8AAP3/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA9v8AAJz/AABG/wAAK/8AABP/AAAG/wAAAQ%154%UDy0NVA8tONQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS2UDy0XlA8tAg%213%+QYGAfgHBgX4BwcN+QcHGPgHBzf4BgeF+QcH4/gGBv/4Bwb/+AcH//gHB//5Bwf/+QcG//gHB//5Bwb/+QYG//kGBv/5Bgb/+QYF//oFBf/7BQX/+gUE//sEBP/8BAP//AMD//wDAtD9AgI3/QICDv0CAgQ%21%/wAAAv8AAG7/AADo/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AADq/wAAgf8AAD7/AAAk/wAADv8AAAQ%159%BQPLRJUDy09VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOxQPLSSUDy0L%213%D5BwcB+QYHBfgGBg/5Bgcb+AcGOfgHB6D5Bwfv+QcH//kGBv/5Bwb/+AcH//gGB//5Bwf/+QYG//kGBv/5Bgb/+gUG//oGBf/6BAX/+gQF//sEBP/7BAP/+wMD//wDA//9AwPW/QMCOf0CAg/9AQIE%5%P4BAQH/AQEd/wEApv8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AANz/AABo/wAAOP8AAB7/AAAL/wAAAw%159%FA8tGZQPLT5UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLxQPLRB%213%PgHBwL5BgcH+AcHEPkHBh/5BgZN+AYHsfgGB/v4Bwf/+AYG//gHBv/4Bgf/+QYH//kGBv/5Bgb/+gYG//oFBf/6BQX/+gQF//sEBP/7BAP//AQE//wDA//8AwP//QID0/0CAjP9AgEP/QEBAv4BAUf+AQDX/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAx/8AAFz/AAAz/wAAGP8AAAj/AAAB%160%UDy0elA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0zFA8tEQ%207%D5BgcB+QcHAvgHBwj4BwYT+AYGIfgHB2j5BgfW+QcH/PkHBv/5Bwf/+AYH//gHBv/5Bgb/+QUF//oFBv/7BQX/+gUF//sFBP/7BAT//AME//wDA//8AwL//AMD//wCAsv+AgI8/QEBfP4BAfb+AQH//wEA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAPv/AAC6/wAAUP8AAC7/AAAV/wAABv8AAAE%159%BQPLSYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTAUDy0Mw%207%PkHBwH4BwcD+QcHCvgHBhb5Bwcy+QYHh/kHB/H4Bwf/+AcH//kGBv/5Bgb/+QYG//oFBv/6BQX/+gUF//oFBP/7BAT/+wQD//sDA//8AwP//QMD//0DAv79AgLp/gIC+/4CAf/+AQH//wAB//8AAP//AAD//wAA//8AAP//AAD//wAA+f8AAKL/AABJ/wAAKf8AABH/AAAF%165%FA8tJdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tJZQPLQO%208%+AYGAfkHBwT4BgYO+QYGGfgHB0n5Bwe7+QcH+vkHBv/5Bgb/+gYF//kGBv/6BgX/+wUF//oEBf/7BAT/+wME//wDA//8AwP//AMD//wCAv/9AgL//QIC//4BAf/+AQH//gAA//8AAf//AAD//wAA//8AAP//AAD1/wAAmf8AAEP/AAAm/wAADv8AAAQ%170%FA8tPNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLToUDy0VQ%212%D4BwcC+AcHB/kHBxL5BgYm+QcHb/kGB+n5Bwf++QYG//kFBv/5BgX/+wUF//sFBf/7BAT/+wME//wDA//8AwT//AMD//0DAv/9AgL//QIC//4CAf/+AgH//gAB//4AAP//AAD//wAA//8AAPT/AACF/wAAQP8AACL/AAAN/wAAAw%175%FA8tPRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tK1QPLQP%208%+AcHAfkHBwT4BwcL+QcHF/gHBj/5Bgau+QYG+/oFBv/6BQX/+gUF//sFBf/7BQT/+wQE//sEBP/8AwP//AMD//wCA//9AgL//gEC//4CAf/+AQH//gEA//4BAf//AAD//wAA6/8AAHz/AAA7/wAAH/8AAAv/AAAC%181%FA8tHVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTgUDy0Mw%212%D5BwYB+QcHBvgHBhH5Bwci+QYHbPoGBuX5Bgb++gUG//oFBf/7BAT/+wUE//sEBP/8AwT//AMD//0CAv/9AgL//QIC//4BAf/+AgL//gEB//8AAP/+AADs/wAAcv8AADr/AAAd/wAACv8AAAI%191%BQPLSNUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09VA8tFs%213%+AcHAfgHBwP4BwcK+QYGFfkGBkD5BQWz+gUF/PoFBf/7BAT/+wQE//sEBP/7BAP//AME//wDA//8AgL//QIC//0CAv/9AgL//gEB//8BAPf/AAB5/wAAPP8AABz/AAAI/wAAAQ%202%UDy0f1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRt%218%D5BwYB+AYGBfkGBhH6BQYk+gUFqfsEBf77BAX/+wUF//sEBP/7BAP//AMD//wDA//9AwL//QMD//0BAv/+AQL//gEB//4BAf/+AAG//wAANP8AABH/AAAD%213%FA8tGhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0iw%218%+AcGAfkGBgn6BgaD+QUF8foFBf/7BQX/+wUE//sEBP/7BAT//AMD//wDBP/9AwP//QMC//4CAv/+AQL//gIB//4BAf//AAD8/wAAjf8AABr/AAAI/wAAAQ%212%BQPLRSUDy09VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tHM%213%+AcHEfkGB5X6BgX7+gYF//oFBf/6BAX/+wUE//sEBP/7AwT//AMD//wDA//8AwL//AMD//0CAv/+AgL//gIB//4BAf/+AQD//wAA9/8AAGH/AAAU/wAABg%218%UDy0OlA8tO9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRf%202%D5BwcZ+AYHvfkGB/75Bgb/+gYG//oFBf/6BQX/+gQE//sEBP/7BAT//AQE//wDA//9AwP//AMD//0CAv/9AgL//gIB//4BAf/+AAD//wAA//8AAOT/AABE/wAAEf8AAAQ%218%FA8tCJQPLTfUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT2UDy0O%187%9wcIAfkHByz5BgfN+QcH//kGBv/5Bgb/+QYG//oFBf/6BQX/+gUE//sEBP/7BAT//AQE//wEA//9AwP//QID//0CAv/9AgL//QIC//4BAf//AQH//gAB//8AAf//AADB/wAAKP8AAAz/AAAC%218%BQPLQXUDy0yVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy031A8tAw%175%D4BwcB+AcGPPgHB9/4Bwb/+AcH//kHBv/5Bgb/+gYG//kGBf/6BQX/+gUE//oFBP/7BAX/+wQE//wDA/38AwP//AMD//0CA//9AgL//QIB//4CAv/+AQH//wEB//8AAP//AAD+/wAAn/8AAB3/AAAI/wAAAQ%218%UDy0ClA8tLFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKM%165%+AcGAfgGBwP5BwdU+AcH7fgGB//5Bgf/+AcH//kHB//5Bgb/+QYG//kFBv/6BQX/+wUF//oFBP/7BAT/+wQE5fwDBIr8AwPM/AMD//0DA//9AgL//QIC//0BAv/+AQH//gEA//8BAP//AAD//wAA9f8AAGb/AAAV/wAABQ%223%FA8tAFQPLSXUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLQ7%160%+QcGAvkHB2D5Bgfx+AYH//kGBv/4Bwf/+QYH//kHBv/4Bgb/+QYG//oGBv/6Bgb/+gUF//sEBP/7BATp+wQEbPwDBD78AwM6/AMDuP0DA/79AgL//gIC//0CAf/+AQL//gEB//8AAP//AAD//wAA//8AAOX/AAA8/wAAEP8AAAQ%229%UDy0cVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%10%BQPLQRUDy0MVA8tFJQPLRvUDy0lVA8tMdQPLTwUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTI%149%PgGBgH4BwYE+AYGcvgHB/r4Bwb/+QcG//kHB//5Bwb/+AcG//gHB//4Bwb/+QYG//kGBv/6BgX/+gUF//oEBev7BARy+wQENvsEBBz8AwQU/AMDKP0DA6b8AgL//QIC//4CAv/+AgH//gAB//4AAP//AAD//wAA//8AAP//AAC8/wAAJv8AAAz/AAAB%229%FA8tFNQPLT2UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%48%UDy0LFA8tGFQPLSgUDy05FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Pw%138%+QcHAfkGBgT4Bgd5+QcG/PkHB//5Bwb/+AYH//gGB//5Bwf/+AcH//kGBv/5Bwf/+QYG//oGBv/5Bgb/+gUF8/oFBX/6BQU6+wQEGvwEBAj7AwQD/AMDDP0DAx39AgKV/QIC+f4CAv/9AQH//gEB//8AAf//AAD//wAA//8AAP//AAD7/wAAe/8AABj/AAAH/wAAAQ%228%BQPLQ7UDy051A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%69%FA8tClQPLSAUDy0z1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0rg%132%D4BgcB+QcGA/gGB3/5Bgf8+QcH//kHB//4Bwf/+QYH//gGBv/5Bgf/+AcG//gHBv/5Bwb/+AYG//kGBv/5Bgb8+gYGlfoFBT37BQQe+wUECfsEBAE%5%/AMDAvwCAwr8AwIb/QICi/4CAvn+AgH//gEB//4BAP/+AAD//wAA//8AAP//AAD//wAA7v8AAEz/AAAS/wAAAw%234%UDy0IlA8tNxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%85%FA8tCdQPLSEUDy05lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/FA8tBU%122%PkHBgH5BQcG+QcHfPgHB/75Bgb/+AYH//kGB//4Bwf/+QcG//gHB//5Bwf/+QcH//gHBv/5Bgf/+AcG//kGB/75Bgax+gUGRPkFBSL6BQQK+wQFAg%15%PwDAwL8AgIJ/QMCGP4CAYD+AQL2/gEB//4BAP//AQH//wAB//8AAP//AAD//wAA//8AAML/AAAp/wAADP8AAAI%234%FA8tBRQPLTCUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%96%UDy0CFA8tFpQPLTQUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tF4%117%+QcGAfkHBwP5Bwd8+QcG+/gHB//4Bwf/+QcH//kGB//5Bwf/+AcH//kHBv/5Bwf/+AcH//kHB//5Bwf/+QcH//kGBtD6BgZR+gYGKPoFBg36BQUC%26%D9AwMB/QIDCP0CAhf9AgJ5/gIB9/4BAf//AQH//wAA//8AAP//AAD//wAA//8AAPv/AAB7/wAAF/8AAAc%239%BQPLQJUDy0rVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%112%UDy0UVA8tNlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJ8%117%+QcGBPkHBm34Bwf7+QYH//gGB//4Bwf/+AcH//kHB//5Bwf/+AcH//kHB//4Bwb/+AcH//gHB//4Bgf/+AcG5/gGB2D5BgYv+gUFEvoFBgM%37%/QICAf0CAgj+AgEW/gEBgP4BAfn+AQH//wAB//8AAP//AAD//wAA//8AAP//AADt/wAARP8AABH/AAAD%245%FA8tI5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%122%BQPLRoUDy08FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMw%111%D5BwcB+QcHXPgHB/T4Bwb/+QcG//kHB//5Bwf/+AcH//kHBv/5Bwf/+QcG//kHBv/4Bgb/+QcH//kHBv/5Bgf7+AcHhPkGBjj5BgYX+QYGBQ%47%P0DAgH9AgII/QECGP4BAYP+AQD7/wEA//4AAP//AAD//wAA//8AAP//AAD//wAAsv8AACP/AAAK/wAAAQ%244%BQPLRmUDy0+1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%128%UDy0HFA8tMBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO4%106%PkJBQH5BgdD+AcG7/gHBv/5Bgf/+QcG//gHB//4Bgf/+AcG//kHB//5Bwf/+AcH//gHB//4Bwf/+QcG//gGB/75Bwen+QcHPvkHBh75BgYI+QYGAQ%52%D+AgIB/QEBCf4BARj+AQGX/gEB/v8AAf//AAD//wAA//8AAP//AAD//wAA9/8AAGL/AAAV/wAABg%250%UDy0RFA8tPFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT2%133%FA8tARQPLSVUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%101%+QcGAfkHByv4Bgfg+QcG//kHB//4Bwb/+QYG//kHB//4Bgb/+QcG//gHBv/5Bwf/+AcH//gGBv/5Bwf/+QcG//kHB9D4BwZP+QcGJ/gHBgv5BwcC%64%/QICAf0BAgn+AQEc/gEBo/8AAP//AAD//wAA//8AAP//AAD//wAA//8AANv/AAAx/wAADv8AAAI%250%FA8tCtQPLTgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTd%144%UDy0i1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%95%D6BwcB+AcHFPgGB8j4Bwf/+AcG//gHB//4Bgf/+QcG//kHB//4Bwb/+QcG//kHB//4Bwf/+AYH//gHB//4Bgf/+QcH7vgHBmr5BwYw+AYHEfgHBgM%74%P4CAQH+AQEK/gEBJP8BALz/AAD//wAA//8AAP//AAD//wAA//8AAP3/AACQ/wAAHP8AAAc%255%BQPLQRUDy0wlA8tP9QPLT/UDy0/1A8tP9QPLSb%149%FA8tItQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%90%PkHBwH4BgcJ+AYHp/kHBv/4Bgf/+QYG//gHB//4Bgb/+AcH//kHBv/4Bwf/+QYH//kHB//4Bwf/+QYH//kHB//4Bgf7+QcHjPkGBzn5BwcY+QYGBQ%84%D9AQEC/gEBC/4AASv/AQDT/wAA//8AAP//AAD//wAA//8AAP//AADq/wAAQ/8AABL/AAAD%256%UDy0B1A8tIlQPLT8UDy0+1A8tKFQPLQK%154%BQPLSnUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPs%95%D5Bwdk+QcH+fgGB//4Bwf/+QcH//kHBv/4Bgf/+QcG//kHBv/4Bwf/+QcH//gHB//4Bwf/+AcH//kGB//5BwbA+QcHR/gHByL5BgcJ+AcHAQ%90%/gEBA/8BAAz/AABD/wAA5v8AAP//AAD//wAA//8AAP//AAD//wAAt/8AACP/AAAK/wAAAQ%436%BQPLQLUDy03lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN0%85%+AcGAfkGBy35Bgbw+QcH//kHB//5Bwf/+QYH//gGB//5Bgf/+AcG//kHB//4Bwb/+AcH//gGB//4Bgf/+QcH//kHBuf5Bwdb+AcGK/gHBg75BwcC%101%P4AAAT/AQEO/wAAZP8AAPn/AAD//wAA//8AAP//AAD//wAA9v8AAGP/AAAW/wAAB%443%UDy0UFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tL%80%D4BwYB+AcHC/gHBrb4Bwf/+QcH//gHB//5Bwf/+QcG//gGB//4Bgf/+QcH//gHB//4Bwf/+AYH//kHB//4Bwb/+AYH9/kHB4H4Bwc2+QcHFfgHBgU%111%D+AQEF/wAAEv8AAIb/AAD7/wAA//8AAP//AAD//wAA//8AAMb/AAAp/wAADf8AAAE%442%FA8tNJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tHk%85%+AcGWfkHBvz5Bwb/+QYG//kHBv/4Bwb/+QYG//gHBv/4Bgf/+AcH//gHB//5Bgf/+QcH//gHB//4Bwf/+AcHu/gHBkT5BwYf+AYHB/gGBwE%111%D/AAAB/wEAB/8AAB3/AAC8/wAA//8AAP//AAD//wAA//8AAP//AABu/wAAFv8AAAU%442%FA8tHZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tCo%74%PgHBwH5BwcV+AcH4PgHB//4Bgf/+QcH//kGB//5Bwb/+QcH//kHB//5Bwb/+QcH//gHB//5Bwb/+QYH//gHB//5Bwfh+QcHV/gHByn4BwcN+AcHAg%122%/wEAAf8AAAn/AAAu/wAA2/8AAP//AAD//wAA//8AAP//AADW/wAAMP8AAA3/AAAC%437%FA8tDFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy01%80%PgHBwL5BgZ2+AYG/fgGB//5Bwf/+AYH//gHB//4Bwf/+AcG//gHB//4Bwf/+AcG//kHB//4Bwf/+AcH//gHB/j4BwaB+QcHNfkGBxT5BwcD%133%P8AAAP/AAAN/wAAWf8AAPT/AAD//wAA//8AAP//AAD4/wAAcf8AABn/AAAF%442%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0ag%79%PgHBw/4BwbO+QYH//kHBv/5Bwb/+AYH//kHBv/5Bwf/+QcG//gGB//4Bgb/+QYH//gHB//5Bgf/+QYH//gHB7r5BwdD+QcGHvkHBgf5BwcB%138%D/AAAE/wAAEf8AAJP/AAD//wAA//8AAP//AAD//wAAyP8AACn/AAAN/wAAAQ%436%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTmUDy0Cg%79%PkHBkb4Bgf9+QcH//gGBv/5Bwb/+AYH//gHB//4Bwb/+AcG//kHB//4Bwf/+AcG//kHBv/4Bwb/+QcG4/kHB1j4BwYp+AcGDfkGBwE%143%D/AAAB/wAAB/8AAB7/AADO/wAA//8AAP//AAD//wAA/v8AAGT/AAAX/wAABQ%436%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRs%85%PkHB6H4Bgb/+QYH//kHBv/4Bwf/+QYH//kHBv/4Bwb/+AYH//kHBv/4Bgb/+QYH//gHBv/4Bwf5+QYGifkGBzj5BwYV+QcHB%155%/wAAAf8AAAv/AABW/wAA9v8AAP//AAD//wAA//8AAMH/AAAp/wAACv8AAAE%426%FA8tBdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNRQPLQE%80%+QcHGPgGB+j4Bgb/+AcH//gHB//4Bgf/+AcG//kGBv/5Bwb/+QYH//kGBv/5Bwf/+AcH//gGB//5Bwbw+AcHWPgGByT5BwYJ%165%P8AAAT/AAAP/wAAnv8AAP//AAD//wAA//8AAO7/AABN/wAAFP8AAAM%426%FA8tExQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+lA8tDU%79%D5BgcB+AcHQ/gGBvj4Bwf/+AcH//gHB//5Bwb/+QcH//kHB//5Bwf/+QcH//kHB//4Bwf/+QcH//kHBv/5Bwfs+QcGS/kHBhn5BwcE%170%D/AAAH/wAAJf8AANj/AAD//wAA//8AAP7/AACL/wAAHv8AAAc%426%FA8tKNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0dw%84%D4BwcC+QcHZ/kHB/v5Bwf/+AcH//gGBv/4Bwb/+AcH//kHBv/5Bwf/+AYH//kHB//4Bgf/+QcG//gHB//5Bwfs+AYHR/gGBhb5BgYD%170%D/AAAC/wAADP8AAGf/AAD8/wAA//8AAP//AADR/wAALf8AAA7/AAAC%416%UDy0FlA8tPZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSq%90%D4BgYC+AcHe/gHB/35Bwf/+QYH//kHBv/4Bgb/+QcH//kHBv/5Bgf/+AcG//kGB//4Bwb/+AcH//gGB//4Bwfs+AcGR/kHBhb5BwcD%176%/wAABP8AABL/AACz/wAA//8AAP//AAD8/wAAVP8AABX/AAAD%416%UDy0kVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMNQPLQJ%90%D5BwcD+AcHgPkGB/35Bwf/+QcH//gHB//4Bgb/+QcG//gGB//5Bwf/+QcH//gGBv/5Bwb/+QYH//kHB//4Bwbs+QcHR/kHBxX4BwcD%176%/wAAAf8AAAj/AAAy/wAA4/8AAP//AAD//wAAjf8AAB//AAAG%410%BQPLQ0UDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy00lA8tAs%95%D5BgcE+AYHePkGBvz5Bwf/+AcH//kGB//5Bwb/+QcH//gHB//4Bgf/+QcH//kGBv/4Bwf/+QYH//gGB//5Bwbm+QYHQPgGBxX4BwYD%181%P8AAAP/AAAO/wAAfP8AAP3/AAD//wAAvP8AACr/AAAL%405%FA8tBBQPLTeUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTDUDy0EQ%100%D4BwcD+AcHXfgGB/r4Bwb/+QcH//kGB//4Bwf/+QcH//kHB//5Bwf/+AYH//gHB//4Bwb/+AcH//kHB//4BwfQ+QYHOPkHBhL5BwYC%186%D/AAAF/wAAF/8AALz/AAD//wAA1v8AADb/AAAP/wAAAQ%394%UDy0ClA8tMJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLVQPLQK%106%D4BgcC+QYGNfkGB/b4Bwf/+QcH//gHBv/4Bwb/+QcH//gGB//5Bwf/+QcH//gGB//4Bwf/+AYG//kGB//4Bwem+AcGLfgHBw75BgYB%186%D/AAAB/wAACf8AADr/AADp/wAA3v8AADz/AAAS/wAAAg%388%BQPLQKUDy0uVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0hVA8tAI%111%D4BwcC+AYGEPgHB9P5Bgf/+AcG//gHBv/4Bwf/+AcG//gHB//5Bgf/+AcH//gGB//5Bwb/+QcH//kHB/34BwZt+AcHJvkHBgn4BwcB%192%/wAAA/8AAA7/AAB2/wAA0v8AADH/AAAR/wAAAg%383%FA8tBxQPLTKUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOtQPLRL%128%9wgHA/kGB275Bwf/+QYG//kHBv/4Bgf/+AcH//kHB//5Bwf/+QcH//gHB//4Bwb/+AcH//kHB9H5BwdF+QcHG/gHBgU%202%P8AAAb/AAAT/wAAOv8AABz/AAAK/wAAAQ%378%UDy0PlA8tOhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0s1A8tBc%133%+QYHBPkGBxv5BwfO+AYG//gHB//5Bwf/+QcH//kGB//4Bwf/+QcG//kHB//5Bwf/+AcH+fkHB4T5Bwcx+AcHD/kHBwI%202%P8AAAH/AAAG/wAACv8AAAr/AAAE%373%FA8tA9QPLSWUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOJQPLRS%144%+QcGAfgHBgr5BwZS+QYH8/kHBv/5Bwf/+QcH//gHBv/5Bwb/+QYH//gGB//4Bwf/+AcHs/gHB0H4Bwcd+QYHBw%212%D/AAAB/wAAAf8AAAH/AAAB%368%UDy0W1A8tOdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT0UDy0ilA8tAs%154%PkHBgT5BgYO+QYHYvgHB+n5Bgb/+AYH//gHBv/4Bgb/+AYG//kHB/n5Bwa5+AcHSvkHBif5BgcN+QcHAQ%591%FA8tFFQPLTSUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+lA8tJZQPLQb%165%PkHBwH5BwcG+QcGEvkHBkj5Bweq+QcG5fgHB/v4Bwbx+AYHzfgGB4b5BwdE+AcHJ/gGBxD4BgcD%592%UDy0blA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPJQPLSNUDy0Gw%186%+AcHBfkGBxH4Bwce+QcGOPgHBkz5BwdL+AcHPPkHBy/5Bwce+QYHDfgGBwM%597%UDy0mFA8tP9QPLT/UDy0/1A8tP9QPLTeUDy0clA8tA4%202%PkHBwP5BwcJ+QYHEPgGBxb4BgcY+AcGFfgHBg75BwYH+QcHAg%602%UDy0PlA8tOtQPLTtUDy0nlA8tERQPLQB%10133%FA8tEFQPLTPUDy0/1A8tOhQPLR3%128%UDy0Z1A8tOhQPLT/UDy01lA8tEQ%709%UDy0LFA8tPhQPLT/UDy0/1A8tP9QPLT/UDy0ag%116%BQPLRiUDy0/1A8tP9QPLT/UDy0/1A8tPhQPLQ0%704%UDy0kFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy06FA9tAM%106%FI+tQFQPLTgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSY%704%UDy0nVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tFg%106%FA8tExQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSe%704%UDy0c1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tL0%106%FA8tLNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLR3%704%UDy0D1A8tPhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLQo%96%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPxQPLQZ%709%FA8tJpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSU%96%UDy0h1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKg%714%FA8tDRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT0UDy0D%85%BQPLQHUDy061A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tE%720%BQPLTIUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0a%85%BQPLRbUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy00Q%724%BQPLRjUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy00g%84%BQPLTJUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0aw%724%BQPLQIUDy071A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tDg%74%FA8tDFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTwUDy0Dg%730%UDy0ilA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKY%74%FA8tJxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSa%736%UDy0JFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPtQPLQV%64%UDy0DVA8tPNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLQt%741%FA8tLlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLR9%64%UDy0blA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMM%746%FA8tExQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTgUj+1AQ%58%UDy02VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tFs%746%FE+tAFQPLTlUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0U%53%BQPLRAUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy06FA8tAc%751%BQPLR6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0tQ%52%BQPLSrUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0h%757%BQPLQTUDy0+1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tBk%42%FA8tApQPLT8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0Hg%762%UDy0olA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tDI%42%FA8tCpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSv%768%UDy0O1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy07lA8tAk%42%FJAtQFQPLTnUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLQ/%506%BRPrQBUDy0IVE9tAM%111%BQPLQsUDy0kFA8tJ5QPLR/UDy0GQ%111%FA8tJhQPLT/UDy0/1A8tP9QPLT+UDy0Xw%52%BQPLRVUDy0/lA8tP9QPLT/UDy0/1A8tJs%111%BQPLQUUDy0eFA8tJ5QPLSYUDy0N%357%BQPLQBUDy0I1A8tHFQPLTNUDy0/FA8tJ1QPLQD%101%FA8tEFQPLT4UDy0/1A8tP9QPLT/UDy0/FA8tKhQPLRB%106%BQPLRQUDy0mFA8tI9QPLQ2%64%UDy0MFA8tI9QPLSYUDy0Ww%106%UDy0PVA8tKdQPLT4UDy0/1A8tP9QPLT/UDy0+FA8tEQ%335%BQPLQBUDy0I1A8tHFQPLTNUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLSdUT20Aw%95%FA8tM9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy01lA8tGtQPLQR%288%UDy0DlA8tGpQPLTRUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNY%319%BQPLQBUDy0I1A8tHFQPLTNUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0nVE9tAM%90%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT1UDy0mlA8tC8%266%FA8tCxQPLSTUDy071A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%303%BQPLQBUDy0I1A8tHFQPLTNUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJ1RPbQD%85%FA8tOVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTDUDy0XFA8tAc%234%FA8tAdQPLRUUDy0wFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOg%287%BQPLQBUDy0I1A8tHFQPLTNUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSdUDy0Aw%79%FA8tGFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOxQPLSIUDy0Hg%212%BQPLQYUDy0glA8tOhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tGc%271%BQPLQBUDy0I1A8tHFQPLTNUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0nVE9tAM%79%BQPLRZUDy02VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tK9QPLRH%192%UDy0PVA8tK9QPLT7UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTgUDy0Yg%260%BQPLQBUDy0I1A8tHFQPLTNUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJ1RPbQD%80%Uj61AVA8tEVQPLSzUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0qw%74%UDy0EFA8tEBQPLRkUDy0ZFA8tEJQPLQT%74%BQPLSbUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0tVA8tE9SP7UB%250%BQPLQBUDy0I1A8tHFQPLTNUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSdUT20Aw%90%UDy0HFA8tIZQPLTrUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tGI%58%FA8tEpQPLS6UDy0/VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0xFA8tFY%58%FA8tFtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy07FA8tI5QPLQk%250%BQPLQBUDy0I1A8tHFQPLTNUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0nVA8tAM%95%BQPLQHUDy0W1A8tMRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKE%47%BQPLQYUDy0t1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTAUDy0Hw%47%FA8tJhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMlQPLReUDy0CQ%244%BQPLQBUDy0I1A8tHFQPLTNUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJ1RPbQD%106%BQPLQwUDy0mlA8tPRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJ0%42%FA8tCFQPLTgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy07VA8tD%43%FA8tI9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPRQPLSdUDy0Mg%244%BQPLQBUDy0I1A8tHFQPLTNUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSdUT20Aw%111%FA8tA1QPLRuUDy02FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tDY%37%UDy0EVA8tOBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOdQPLQf%37%FA8tDBQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTaUDy0cFA8tBQ%245%UDy0HVA8tGxQPLTHUDy091A8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0mFI+tQE%122%FA8tD9QPLSrUDy0/FA8tP9QPLTuUDy0Xw%42%UDy0r1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS/%42%BQPLRVUDy051A8tP9QPLT9UDy0rVA8tEc%261%UT20A1A8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tDhQPLTgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPxQPLRiUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BQ%138%UDy0ClA8tC1RPrUB%42%BQPLRAUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0V%43%UkC1AVA8tCpQPLQO%352%UDy0UlA8tOxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tI8%287%BQPLStUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0x%400%FA8tANQPLRwUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0rVE9tAM%282%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tBM%389%UDy0BFA8tJ1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTNUDy0Ew%287%FA8tDVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tEo%383%BQPLQTUDy0y1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOxQPLQj%293%FA8tF9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tGU%378%FA8tDJQPLTcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1A8tDQ%298%FA8tGRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tGY%373%UDy0UlA8tOxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT8UDy0Yg%303%FA8tFRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tGU%362%FA8tANQPLRwUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLR/%309%FA8tClQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tDo%357%UDy0BFA8tJ1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJ5RPbQD%309%FJAtQFQPLTpUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09FA8tAo%351%BQPLQUUDy0y1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0zVA8tBE%261%UDy0E1A8tDJQPLQJ%42%BQPLSPUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0og%42%UDy0CFA8tDJQPLQZ%293%FA8tDJQPLTrUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTrUDy0F%251%Uj+1AVA8tEdQPLS0UDy0/VA8tP9QPLTyUDy0Yw%36%BQPLQfUDy09lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT9UDy0Kw%36%BQPLRfUDy07lA8tP9QPLT/UDy0tFA8tFBSP7UB%272%UDy0YVA8tO5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO5QPLQy%245%FA8tBRQPLR0UDy031A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tD0%37%UDy0fVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSO%37%FA8tDBQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTgUDy0d1A8tBU%250%FA8tANQPLR/UDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/FA8tGE%239%BQPLQ3UDy0oFA8tPRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJ0%37%UT60AVA8tLdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMFQPLQJ%37%FA8tI9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPtQPLSkUDy0O%235%UDy0EVA8tJ5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0fw%228%BQPLQMUDy0Y1A8tMpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKE%42%FA8tAlQPLSyUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vlA8tAs%42%FA8tJhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNJQPLRmUDy0D%213%BQPLQ0UDy0zVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSdUDy0Aw%218%UDy0JFA8tI5QPLTtUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tFs%53%UDy0dlA8tPFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPJQPLR7UT20Aw%47%FA8tFBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09FA8tJNQPLQo%85%FA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tGJQPLT7UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tM9QPLQJUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVQPLQFUDy0BVA8tAVRPrUB%96%UD20A1A8tE9QPLS7UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0mw%63%FA8tA9QPLRyUDy0vlA8tPlQPLT/UDy0/1A8tPxQPLTFUDy0fVA8tBQ%63%BQPLSYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vVA8tFhQPbQD%64%UT60AVA8tJhQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPxQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT6UDy0+lA8tPpQPLT0UDy0q1A8tFpQPLQP%90%BQPLRiUDy05lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1A8tKpQPLQ9%90%BRPbQBUDy0Bg%90%UDy0O1A8tKdQPLT7UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLToUDy0ag%63%FE9tANQPLSdUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0sVA8tGBQPLQU%101%FA8tGFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOVQPLSCUDy0G%213%BQPLQTUDy0elA8tOVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tHs%63%BRPbQDUDy0nVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0sVA8tGBQPLQU%117%FA8tOVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS+UDy0VFE+tQE%234%FE+tAFQPLRMUDy0uVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOo%69%UT20A1A8tJ1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0sVA8tGBQPLQU%133%FA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTvUDy0klA8tCw%266%FA8tCRQPLSMUDy071A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%74%FE9tANQPLSdUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0sVA8tGBQPLQU%149%FA8tMhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy00FA8tGRQPLQM%288%UDy0CFA8tGNQPLTJUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNY%79%BRPbQDUDy0nVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0sVA8tGBQPLQU%165%FA8tDlQPLT1UDy0/1A8tP9QPLT/UDy0+FA8tKJQPLQ5%106%BQPLRbUDy0oVA8tJ1QPLQ9%64%UDy0NlA8tJNQPLShUDy0Yg%106%UDy0NVA8tKBQPLT4UDy0/1A8tP9QPLT/UDy0+FA8tEQ%85%UT20A1A8tJ1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0sVA8tGBQPLQU%186%BQPLQkUDy0jlA8tJ5QPLR4UDy0FQ%111%FA8tJtQPLT/UDy0/1A8tP9QPLT/UDy0Yw%52%BQPLRVUDy0/lA8tP9QPLT/UDy0/1A8tKs%111%BQPLQPUDy0c1A8tJ1QPLSQUDy0L%96%FE9tANQPLSdUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0sVA8tGBQPLQU%336%UDy0PFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy08lA8tAk%42%FJAtQFQPLTnUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRH%234%BRPbQDUDy0nVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0sVA8tGBQPLQU%352%UDy0p1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tDI%42%FA8tCpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS3%240%UT20A1A8tJ1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0sVA8tGBQPLQU%362%BQPLQWUDy0+1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tBk%42%FA8tApQPLT8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0Hg%239%FE9tANQPLSdUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0sVA8tGBQPLQU%378%BQPLR5UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0t%53%BQPLSoUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0ig%244%BRPbQDUDy0nVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0sVA8tGBQPLQU%389%FE+tAFQPLTlUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0T%53%BQPLQ/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy07FA8tAc%245%UT20A1A8tJ1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0sVA8tGBQPLQU%405%FA8tFBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTfUj+1AQ%58%UDy02FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tFw%250%FE9tANQPLSdUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0sVA8tGBQPLQU%421%FA8tLxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLR0%64%UDy0bFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMM%255%BRPbQDUDy0nVA8tP9QPLT/UDy0/1A8tP9QPLT6UDy0sVA8tGBQPLQU%432%UDy0JlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPpQPLQV%64%UDy0DVA8tPRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLQv%256%UT20A1A8tJ1QPLT6UDy0sVA8tGBQPLQU%448%UDy0jFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKQ%74%FA8tJRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSb%261%FE9tANQPLQT%458%BQPLQIUDy071A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tDg%74%FA8tC9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT1UDy0EQ%724%BQPLRjUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy00Q%84%BQPLTEUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0bQ%724%BQPLTQUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Zg%84%BQPLRbUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy01g%719%FA8tDVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTtUDy0D%85%BQPLQHUDy061A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tEE%714%FA8tKFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLST%96%UDy0hlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tK0%709%UDy0EFA8tPhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLQo%96%UDy0HFA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPxQPLQZ%704%UDy0c1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLw%106%FA8tLJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSB%704%UDy0nVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tFQ%106%FA8tEVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSe%704%UDy0jlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy05lA9tAM%106%FI+tQFQPLTZUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSY%704%UDy0JFA8tPVQPLT/UDy0/1A8tP9QPLT/UDy0Yw%116%BQPLRZUDy0/1A8tP9QPLT/UDy0/1A8tPhQPLQ0%709%FA8tDlQPLTIUDy0/lA8tOhQPLRn%128%UDy0YVA8tOVQPLT/UDy0z1A8tEE%7914%FA8tAJQPLQNUDy0RVA8tG9QPLSFUDy0vFA8tMFQPLTgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04FA8tMFQPLS3UDy0g1A8tG1QPLRFUDy0DVA8tAI%762%FA8tBlQPLRaUDy0nFA8tNdQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/VA8tNZQPLSdUDy0W1A8tBk%730%FA8tBpQPLRtUDy0vFA8tP1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP1QPLS8UDy0bVA8tBo%485%UDy0P1A8tJZQPLTWUDy0+VA8tPlQPLTWUDy0llA8tD8%170%FA8tAJQPLREUDy0rFA8tPdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPhQPLSrUDy0Q1A8tAI%458%FA8tBpQPLSTUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSTUDy0Gg%148%BQPLQCUDy0SlA8tMdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMdQPLRKUDy0Ag%442%UDy0GlA8tKdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0p1A8tBo%138%FA8tD9QPLTJUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy03VA8tLFQPLSUUDy0XVA8tFlQPLQjUDy0HFA8tBxQPLQcUDy0HFA8tBxQPLQcUDy0JFA8tFhQPLRdUDy0lFA8tLBQPLTeUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0yVA8tD4%437%UDy0k1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJM%127%BQPLQWUDy0plA8tPtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTeUDy0nFA8tFVQPLQXUDy0Ag%84%BQPLQCUDy0FlA8tFRQPLScUDy031A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPtQPLSlUDy0Fw%420%BQPLQ/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLQ/%117%FA8tExQPLTmUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLToUDy0j1A8tDFQPLQE%128%UDy0BFA8tDFQPLSPUDy06FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy05lA8tEw%415%BQPLSWUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSW%106%BQPLQEUDy0j1A8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0z1A8tFpQPLQJ%160%UDy0CVA8tFlQPLTPUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPxQPLSPUDy0Aw%404%BQPLTWUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTW%101%FA8tA1QPLTBUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tM9QPLRRUDy0Ag%180%BQPLQCUDy0UVA8tM9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0wVA8tA0%399%BQPLT5UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT5%96%UDy0EFA8tMNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTwUDy0a1A8tAQ%202%FA8tAVQPLRsUDy071A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMNQPLQQ%394%BQPLT5UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT5%90%BQPLQOUDy0yVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLlQPLQf%224%UDy0HVA8tLlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTHUDy0Dg%388%BQPLTWUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTW%85%FA8tA9QPLTFUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT4UDy0ew%244%BQPLR7UDy0+FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0xVA8tA8%383%BQPLSWUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSW%80%UDy0AlA8tKxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPhQPLRN%256%UDy0TVA8tPhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKtQPLQC%378%BQPLQ/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLQ/%80%UDy0cVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy091A8tEs%266%FA8tEtQPLT3UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRx%384%UDy0k1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJM%79%BQPLQsUDy0+FA8tP9QPLT/UDy0/1A8tP9QPLT3UDy0Sg%276%BQPLRKUDy091A8tP9QPLT/UDy0/1A8tP9QPLT3UDy0LQ%378%UDy0GlA8tKdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0p1A8tBo%74%FA8tANQPLTCUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRc%288%UDy0XFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0wlA8tAM%378%FA8tBpQPLSTUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSTUDy0Gg%79%FA8tE9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJpQPLUB%288%UDy1AVA8tJpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tE8%389%UDy0P1A8tJZQPLTWUDy0+VA8tPlQPLTWUDy0llA8tD8%85%UDy0A1A8tNFQPLT/UDy0/1A8tP9QPLT/UDy03VA8tA0%298%FA8tA1QPLTdUDy0/1A8tP9QPLT/UDy0/1A8tNFQPLQD%277%FE9tAJQPLSlUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%149%UDy0SlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0W%309%BQPLRYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRK%282%BQPLQFUDy0plA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%149%UDy0qVA8tP9QPLT/UDy0/1A8tP9QPLTSUDy0BQ%308%BQPLQFUDy00lA8tP9QPLT/UDy0/1A8tP9QPLSp%288%UDy0BVA8tKZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%143%BQPLQLUDy081A8tP9QPLT/UDy0/1A8tP9QPLRe%320%UDy0XlA8tP9QPLT/UDy0/1A8tP9QPLT0UDy0Cw%287%FA8tAVQPLSmUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%143%BQPLRNUDy0/1A8tP9QPLT/UDy0/1A8tO9QPLQM%320%UDy0DFA8tO9QPLT/UDy0/1A8tP9QPLT/UDy0Tg%292%BQPLQFUDy0plA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%143%BQPLSHUDy0/1A8tP9QPLT/UDy0/1A8tLM%330%FA8tLFQPLT/UDy0/1A8tP9QPLT/UDy0hw%298%UDy0BVA8tLpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%143%BQPLS+UDy0/1A8tP9QPLT/UDy0/1A8tH%331%FA8tG9QPLT/UDy0/1A8tP9QPLT/UDy0vg%298%UDy0fFA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%143%BQPLTVUDy0/1A8tP9QPLT/UDy0/1A8tEQ%330%FA8tEVQPLT/UDy0/1A8tP9QPLT/UDy01w%292%BQPLQIUDy0+FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%143%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tCQ%330%FA8tCRQPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLQOUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%143%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tCQ%330%FA8tCRQPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLQEUDy06FA8tP9QPLT/UDy0/1A8tP5QPLS6UDy0/1A8tP9QPLT/UDy0/1A8tP8%143%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tCQ%330%FA8tCRQPLT/UDy0/1A8tP9QPLT/UDy0/w%271%FNAtQJQPLRlUDy01VA8tNVQPLRlUDy0N1A8tOhQPLT+UDy0+FA8tHxQPLQFUDy0plA8tP9QPLT/UDy0/1A8tP8%143%BQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tCU%330%FA8tCRQPLT/UDy0/1A8tP9QPLT/UDy0/g%271%FA8tGVQPLT+UDy0/1A8tP9QPLT+UDy0ZVA8tARQPLQOUDy0C%11%UDy0BVA8tKZQPLT/UDy0/1A8tP8%143%BQPLTGUDy0/1A8tP9QPLT/UDy0/1A8tFs%330%FA8tFRQPLT/UDy0/1A8tP9QPLT/UDy0y%272%FA8tNVQPLT/UDy0/1A8tP9QPLT/UDy01Q%31%FA8tAVQPLSmUDy0/1A8tP8%143%BQPLSsUDy0/1A8tP9QPLT/UDy0/1A8tI0%213%UDy0BQ%111%FA8tIBQPLT/UDy0/1A8tP9QPLT/UDy0sw%271%FA8tNVQPLT/UDy0/1A8tP9QPLT/UDy01Q%36%BQPLQFUDy0plA8tP8%143%BQPLRvUDy0/1A8tP9QPLT/UDy0/1A8tNxQPLQC%208%UDy0n1A8tFNQPLQB%101%FA8tMNQPLT/UDy0/1A8tP9QPLT/UDy0f%256%FA9tAhQPLQOUT20BFA8tGVQPLT+UDy0/1A8tP9QPLT+UDy0ZQ%42%UD20BVA8tKU%143%BQPLQtUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLQ9%208%UDy0sFA8tP9QPLSTUDy0Cg%90%UDy0HFA8tPdQPLT/UDy0/1A8tP9QPLT/UDy0P%251%UDy0fFA8tPhQPLT+UDy06FA8tDdQPLRlUDy01VA8tNVQPLRlUDy0Ag%47%FE9tAI%143%BQPLQDUDy01lA8tP9QPLT/UDy0/1A8tP9QPLSx%208%UDy0sFA8tP9QPLT/UDy0y1A8tCM%85%UDy0d1A8tP9QPLT/UDy0/1A8tP9QPLTmUDy0B%245%BQPLQ1UDy0/lA8tP9QPLT/UDy0/1A8tOhRPbQE%224%UDy0b1A8tP9QPLT/UDy0/1A8tP9QPLT9UDy0T%203%UDy0sFA8tP9QPLT/UDy0/1A8tPNQPLRY%74%BQPLQLUDy06FA8tP9QPLT/UDy0/1A8tP9QPLSb%250%BQPLSGUDy0/1A8tP9QPLT/UDy0/1A8tP5QPLQO%224%UDy0CVA8tOZQPLT/UDy0/1A8tP9QPLT/UDy02FA8tAw%197%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0mFA8tAo%63%BQPLR1UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLQv%250%BQPLRaUDy0/1A8tP9QPLT/UDy0/1A8tPhQPLQI%229%FA8tG9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKdQPLQD%192%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNBQPLQk%53%FA8tCBQPLTzUDy0/1A8tP9QPLT/UDy0/1A8tLI%239%BQPLQ1UDy0hlA8tFpQPLQIUDy0zFA8tP9QPLT/UDy0/lA8tHw%234%FA8tAVQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRz%192%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT2UDy0XFA8tQE%37%UDy0BlA8tL5QPLT/UDy0/1A8tP9QPLT/UDy0/VA8tD%235%FA8tHxQPLT+UDy0/1A8tP9QPLTMUDy0CFA8tFpQPLSGUDy0NQ%244%BQPLQyUDy081A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0d%187%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJxQPLQJ%32%UDy0ilA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0n%235%UDy0CFA8tPhQPLT/UDy0/1A8tP9QPLT/UDy0Wg%266%UDy0a1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tHU%181%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTUUDy0Jw%20%BQPLQqUDy09lA8tP9QPLT/UDy0/1A8tP9QPLTlUDy0FQ%234%UDy0DlA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0hg%266%UDy0BFA8tKBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLR3%176%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy091A8tGFQPLQB%16%UDy0LlA8tNRQPLT/UDy0/1A8tPxQPLRJ%240%UDy0BFA8tOhQPLT/UDy0/1A8tP9QPLT+UDy0NQ%271%FA8tANQPLSuUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0kFA8tAc%165%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLShUDy0EQ%15%FA8tBBQPLShUDy0/1A8tHw%170%FE9tAI%47%BTQLUCUDy0ZVA8tNVQPLTVUDy0ZVA8tDdQPLToUDy0/lA8tPhQPLR8%282%BQPLQRUDy0zFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLJQPLQV%160%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04FA8tDs%15%BQPLQDUDy0PFA8tAM%170%FA8tKVQPLQF%42%BQPLRlUDy0/lA8tP9QPLT/UDy0/lA8tGVQPLQEUDy0DlA8tAg%293%UDy0ElA8tLtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTbUDy0Lw%4%BQPLQRUDy0M1A8tGpQPLRzUDy0qVA8tKpQPLSqUDy0qlA8tJBQPLRsUDy0UlA8tCk%85%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPdQPLR1%197%FA8tP9QPLSmUDy0BQ%36%BQPLTVUDy0/1A8tP9QPLT/UDy0/1A8tNU%314%FA8tARQPLSbUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09FA8tMlQPLT1UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLTnUDy0oVA8tFJQPLQF%64%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0tVA8tAk%186%FA8tP9QPLT/UDy0plA8tAU%31%BQPLTVUDy0/1A8tP9QPLT/UDy0/1A8tNU%319%BQPLQCUDy0ilA8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTkUDy0eFA8tAY%53%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tL9QPLQi%181%FA8tP9QPLT/UDy0/1A8tKZQPLQF%10%BQPLQIUDy0DlA8tARQPLRlUDy0/lA8tP9QPLT/UDy0/lA8tGU%330%FA8tGZQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNlQPLQ2%48%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTgUDy0Qg%175%FA8tP9QPLT/UDy0/1A8tP9QPLSmUDy0BVA8tHxQPLT4UDy0/lA8tOhQPLQ3UDy0ZVA8tNVQPLTVUDy0ZVA8tAI%325%UDy0E1A8tMxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT2UDy0ZQ%42%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT8UDy0ig%175%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0ulA8tP5QPLT/UDy0/1A8tP9QPLToUDy0B%341%BQPLQDUDy0t1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08VA8tHlQPLRyUDy0clA8tHtQPLSwUDy01FA8tPhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1A8tDo%37%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tMZQPLQs%181%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0Dg%340%BQPLRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMpQPLQc%21%FA8tBhQPLRTUDy0vFA8tP1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNxQPLRVUDy0alA8tJNQPLSZUDy0T%11%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTcUDy0Ug%191%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT4UDy0C%341%BQPLTLUDy0/1A8tP9QPLT/UDy0/1A8tPlQPLSIUDy0SVA8tOlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTpUDy0Qw%31%FA8tDxQPLTUUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Xw%10%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08FA8tIJQPLQI%197%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLR8%341%FA8tAZQPLTxUDy0/1A8tP9QPLT/UDy0/lA8tFw%10%FA8tBdQPLTAUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09lA8tHI%31%BQPLQTUDy021A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Xw%10%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0YQ%207%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLpQPLQF%341%FA8tBJQPLT2UDy0/1A8tP9QPLT/UDy0+lA8tB8%15%BQPLQCUDy0g1A8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLSKUDy0Bw%26%UDy0qVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Xw%10%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04FA8tAw%202%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSmUDy0BQ%340%BQPLToUDy0/1A8tP9QPLT/UDy0/1A8tMBQPLQh%21%FA8tExQPLTrUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0slA8tAc%15%BQPLRzUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Xw%10%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tIM%202%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0plA8tAU%335%BQPLSUUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTzUDy0hFA8tBc%15%BQPLQmUDy0y1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLNQPLQJUDy0SVA8tMdQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tPxQPLTGUDy0lVA8tIlQPLR9UDy0H%11%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPlQPLQ1%197%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKZQPLQF%330%BQPLQcUDy06lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPpQPLS8UDy0fFA8tEJQPLQoUDy0FlA8tKxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT3UDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tIc%37%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTCUDy0AQ%191%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSmUD20BQ%330%UDy0V1A8tPtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT9UDy0+lA8tPtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0xlA8tAY%37%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLTUUDy0VVA8tDdQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0d%192%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0pVE9tAI%330%FA8tFJQPLTpUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSkUDy0Dw%42%UDy0sFA8tP9QPLT/UDy091A8tHRQPLQM%10%BQPLSWUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy091A8tBs%122%FA8tD9QPLSWUDy01lA8tPlQPLT5UDy01lA8tJZQPLQ/%442%BQPLQaUDy0sFA8tPtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy05VA8tFxQPLQC%48%UDy0sFA8tPtQPLSfUDy0Gg%20%BQPLQeUDy08VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLVQPLQD%106%BQPLQaUDy0k1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0k1A8tBo%442%FA8tDNQPLSWUDy071A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Uw%58%UDy0glA8tDY%37%UDy0dFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRi%101%FA8tBpQPLSnUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKdQPLQa%448%UDy0C1A8tD9QPLR9UDy0rVA8tOBQPLTnUDy0/1A8tP9QPLT/UDy0/1A8tPVQPLTgUDy03FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy04lA8tB%102%UDy0A1A8tNBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTmUDy0F%96%FA8tJNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLST%474%BQPLQFUDy0HFA8tBxQPLQcUDy0HFA8tBI%5%UDy0AVA8tJJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKJQPLQB%101%FA8tE1QPLT8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0p%91%UDy0P1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Pw%511%FA8tAlQPLTIUDy0/1A8tP9QPLT/UDy0/1A8tP5QPLQ7%106%BQPLSzUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/VA8tEE%85%UDy0llA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0lg%516%BQPLQoUDy09FA8tP9QPLT/UDy0/1A8tP9QPLS/UDy0AQ%100%BQPLQrUDy091A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNhQPLQL%80%UDy01lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy01g%522%UDy0dlA8tP9QPLT/UDy0/1A8tP9QPLT+UDy0Pw%106%UDy0klA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSR%80%UDy0+VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+Q%522%UDy0CVA8tN1QPLT/UDy0/1A8tP9QPLT/UDy0sg%106%UDy0DlA8tOVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTyUDy0HQ%74%UDy0+VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+Q%527%FA8tGVQPLT/UDy0/1A8tP9QPLT/UDy0+1A8tB8%106%FA8tG9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMZQPLQ5%80%UDy01lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy01g%527%FA8tAxQPLTuUDy0/1A8tP9QPLT/UDy0/1A8tG0%106%FA8tAFQPLTQUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTwUDy0ZFA8tAY%85%UDy0llA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0lg%532%BQPLSXUDy0/1A8tP9QPLT/UDy0/1A8tLQ%111%BQPLQ0UDy0/VA8tP9QPLT/UDy0+VA8tIxQPLQS%96%UDy0P1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Pw%532%BQPLRIUDy0/1A8tP9QPLT/UDy0/1A8tPFQPLQB%106%BQPLUBUDy0qVA8tP5QPLS+UDy0Jw%111%FA8tJNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLST%538%BQPLQRUDy09lA8tP9QPLT/UDy0/1A8tP5QPLQu%112%UDy0GVA8tFo%122%FA8tBpQPLSnUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKdQPLQa%544%UDy02FA8tP9QPLT/UDy0/1A8tP9QPLRM%250%BQPLQaUDy0k1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0k1A8tBo%549%UDy0sVA8tP9QPLT/UDy0/1A8tP9QPLRz%261%FA8tD9QPLSWUDy01lA8tPlQPLT5UDy01lA8tJZQPLQ/%560%UDy0qlA8tP9QPLT/UDy0/1A8tP9QPLRz%864%UDy0eVA8tP9QPLT/UDy0/1A8tP9QPLRz%14133%FA8tAZQPLRgUDy0r1A8tLdQPLR8UDy0Fw%308%BQPLQGUDy0MVA8tDhQPLQO%528%UDy0BlA8tK1QPLT+UDy0/1A8tP9QPLT/UDy07VA8tH9QPLQT%288%UDy0AVA8tExQPLTZUDy0/lA8tP5QPLTtUDy0a1A8tAE%517%UDy0YFA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTsUDy0f1A8tBM%266%FA8tAFQPLRBUDy0vlA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/VA8tFo%517%UDy0r1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOtQPLRgUDy0B%245%BQPLQDUDy0TlA8tL5QPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tM9QPLQC%512%UDy0t1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy021A8tGBQPLQE%224%UDy0AVA8tEFQPLS+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPZQPLQF%512%UDy0fFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTbUDy0YFA8tAM%202%FA8tAFQPLRBUDy0vlA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOBQPLQD%512%UDy0ElA8tNdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tL5QPLRBUDy0AQ%186%UDy0MlA8tL5QPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tH4%522%FA8tBtQPLSkUDy0+1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0vlA8tEFQPLQB%165%FA8tCRQPLSfUDy0+1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT9UDy0qFA8tAk%533%UDy0JFA8tJ9QPLT7UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLS+UDy0Mg%148%BQPLQkUDy0n1A8tPtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tK1QPLQ+UDy0Ag%548%BQPLQkUDy0rVA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1A8tJ9QPLQk%128%UDy0JFA8tJ9QPLT7UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLS+UDy0QVA8tAE%565%UDy0AVA8tEFQPLS+UDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT7UDy0n1A8tCQ%106%FA8tCRQPLSfUDy0+1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0vlA8tEFQPLQB%586%BQPLQBUDy0QVA8tL5QPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPtQPLSRUDy0F%85%BQPLQkUDy0n1A8tPtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tM1QPLRBUDy0AQ%607%FA8tAFQPLRCUDy021A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+lA8tIFQPLQT%64%UDy0JFA8tJ9QPLT7UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTbUDy0YFA8tAQ%629%UDy0BFA8tGBQPLTbUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTsUDy0f1A8tBM%42%FA8tCRQPLSfUDy0+1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy021A8tGBQPLQE%650%BQPLQEUDy0YFA8tNtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOtQPLRgUDy0B%21%BQPLQTUDy0kVA8tPtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNxQPLRgUDy0B%672%FA8tARQPLR+UDy07FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy021A8tGBQPLQEUDy0E1A8tH9QPLTsUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTsUDy0f1A8tBE%693%UDy0E1A8tH9QPLTsUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTdUDy07FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy07FA8tH9QPLQT%714%BQPLQTUDy0f1A8tOxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOxQPLR/UDy0Ew%735%FA8tBRQPLSfUDy0+1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT7UDy0n1A8tBQ%757%UDy0JFA8tJ9QPLT7UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1A8tJ9QPLQk%730%D/AAAD/wAAKP8AAE3/AABg/wAAYf8AAE3/AAAm/wAAAw%4%BQPLQnUDy0olA8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPtQPLSfUDy0J%16%FA8tARQPLR6UDy0fVA8tH1QPLR9UDy0Jg%682%/wAAC/8AAHH/AADZ/wAA/f8AAP//AAD//wAA//8AAP//AAD9/wAA2/8AAHX/AAAN/wAAAlA8tEFQPLS+UDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0vlA8tDI%26%FA8tAhQPLT6UDy0/1A8tP9QPLT/UDy0Tw%676%D/AAAs/wAA1f8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AADe/wAAPQ%4%BQPLQBUDy0QVA8tL5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tL5QPLRBUDy0AQ%31%FA8tAhQPLT6UDy0/1A8tP9QPLT/UDy0Tw%671%P8AACH/AADm/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA9P8AAEM%10%FA8tAdQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0wVA8tAE%42%FA8tAhQPLT6UDy0/1A8tP9QPLT/UDy0Tw%666%/wAAAf8AALP/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD8/wAA+/8AAP7/AAD//wAA//8AAP//AAD//wAA//8AAOj/AAAZ%5%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%47%FA8tAhQPLT6UDy0/1A8tP9QPLT/UDy0Tw%666%/wAAMP8AAPz/AAD//wAA//8AAP//AAD//wAA7P8AAGj/AAAa/wAAEv8AAEn/AADP/wAA//8AAP//AAD//wAA//8AAP//AACR%5%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%15%FA8tGhQPLRYUDy0E%16%FA8tAhQPLT6UDy0/1A8tP9QPLT/UDy0Tw%15%FA8tAZQPLQ/UDy0hlA8tAU%629%/wAAiP8AAP//AAD//wAA//8AAP//AAD0/wAANQ%20%D/AAAR/wAA0v8AAP//AAD//wAA//8AAP//AADr/wAACFA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%10%UDy0B1A8tOdQPLT/UDy08lA8tK5QPLRaUDy0ElA8tAhQPLT6UDy0/1A8tP9QPLT/UDy0T1A8tAdQPLRCUDy0lVA8tONQPLT+UDy0/lA8tDs%623%D/AAAB/wAAx/8AAP//AAD//wAA//8AAP//AACI%32%/wAATP8AAP7/AAD//wAA//8AAP//AAD+/wAAMlA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%10%UDy0QVA8tP5QPLT/UDy0/1A8tP9QPLT/UDy081A8tLRQPLT9UDy0/1A8tP9QPLT/UDy0wVA8tOVQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tIo%623%D/AAAF/wAA7/8AAP//AAD//wAA//8AAP3/AAAw%32%/wAAC/8AAPf/AAD//wAA//8AAP//AAD//wAAUFA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%10%UDy0kVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNdQPLQD%618%D/AAAS/wAA+/8AAP//AAD//wAA//8AAPr/AAAM%32%/wAABP8AAPD/AAD//wAA//8AAP//AAD//wAAVVA8tAhQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%4%BQPLQBUDy0e1A8tOFQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09lA8tLdQPLQP%618%D/AAAM/wAAdP8AAHb/AAB2/wAAdv8AAHP/AAAC%32%/wAAIv8AAPz/AAD//wAA//8AAP//AAD//wAAQFA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%15%FA8tAVQPLQ9UDy0kFA8tN9QPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08lA8tLBQPLReUDy0FVA8tAE%687%D/AAAB/wAAlP8AAP//AAD//wAA//8AAP//AAD5/wAAGFA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%31%FA8tARQPLQ6UDy0uFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOJQPLRVUDy0Dw%708%D/AABh/wAA/P8AAP//AAD//wAA//8AAP//AAC2/wAAAVA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%36%BQPLQVUDy04VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPtQPLRH%704%/wAAAv8AAHj/AAD7/wAA//8AAP//AAD//wAA//8AAPT/AAAx%5%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%31%FA8tAJQPLSrUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTiUDy0Fw%692%D/AAAG/wAAmv8AAP7/AAD//wAA//8AAP//AAD//wAA9v8AAFE%10%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%31%FA8tGVQPLT+UDy0/1A8tP9QPLT/UDy03FA8tKpQPLT/UDy0/1A8tP9QPLT/UDy0rVA8tAI%682%P8AAAH/AACc/wAA//8AAP//AAD//wAA//8AAP//AADn/wAAQw%15%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%26%UDy0KVA8tPFQPLT/UDy0/1A8tP9QPLT5UDy0PVA8tBBQPLTaUDy0/1A8tP9QPLT/UDy0/lA8tGc%682%P8AAE//AAD+/wAA//8AAP//AAD//wAA//8AALz/AAAe%21%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%20%BQPLQIUDy0yFA8tP9QPLT/UDy0/1A8tP9QPLS%11%BQPLQ7UDy0+FA8tP9QPLT/UDy0/1A8tPJQPLQq%672%/wAAAv8AAMf/AAD//wAA//8AAP//AAD+/wAAkf8AAAY%26%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%20%BQPLQdUDy001A8tP9QPLT/UDy0/1A8tMNQPLQG%16%UDy0fVA8tP9QPLT/UDy0/1A8tPBQPLRL%672%/wAAHP8AAPv/AAD//wAA//8AAP//AAC6/wAAAw%31%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%26%UDy0DlA8tJ1QPLT+UDy07lA8tCQ%21%UDy0BlA8tMBQPLT/UDy0zFA8tCk%677%/wAAQf8AAP//AAD//wAA//8AAP//AABv%37%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%31%FA8tAFQPLReUDy0W%32%FA8tCJQPLSKUDy0Cw%682%/wAASv8AAPH/AADx/wAA8f8AAPH/AABU%37%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%778%/wAAAf8AAAT/AAAE/wAABP8AAAT/AAAC%37%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%778%/wAAA/8AAAX/AAAF/wAABf8AAAX/AAAE%37%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%778%/wAAqP8AAPT/AAD0/wAA9P8AAPT/AADh/wAAB%32%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%778%/wAAr/8AAP//AAD//wAA//8AAP//AADr/wAAB%32%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%778%/wAAr/8AAP//AAD//wAA//8AAP//AADr/wAAB%32%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%778%/wAAr/8AAP//AAD//wAA//8AAP//AADr/wAAB%32%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%778%/wAAr/8AAP//AAD//wAA//8AAP//AADr/wAAB%32%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%778%/wAAWP8AAH//AAB//wAAf/8AAH//AAB2/wAAAg%31%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%847%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%847%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%847%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%847%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%847%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%847%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%847%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%847%FA8tAVQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vw%847%FA8tARQPLTrUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0rw%852%BQPLSfUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0Y%853%BQPLQbUDy011A8tP9QPLT/UDy0/1A8tP5QPLStUDy0Bg%858%UDy0ElA8tHxQPLS3UDy0r1A8tGBQPLQG%19749%FA8tCxQPLTgUDy0/FA8tHk%869%UDy0K1A8tOlQPLT/UDy0/1A8tP9QPLSE%858%BQPLQqUDy06FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0dw%847%FA8tClQPLToUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tHU%837%UDy0KFA8tOdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSB%826%BQPLQnUDy05lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT9UDy0e%816%FA8tCZQPLTlUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tH%806%UDy0JVA8tOVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLR1UDy0AQ%788%BQPLQkUDy05FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTvUDy0uVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0bw%783%FA8tCNQPLTjUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPBQPLQ2UDy0CFA8tKVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tGtQPLQB%768%UDy0IlA8tONQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08VA8tDc%10%FA8tAZQPLSqUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRz%762%BQPLQhUDy04lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTxUDy0O%21%BQPLQFUDy0rFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0bg%751%FA8tCBQPLTcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPJQPLQ5%32%UDy0AlA8tLZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tGY%741%UDy0H1A8tOBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08lA8tDo%42%FA8tANQPLStUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLR1%730%BQPLQfUDy031A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTzUDy0Ow%52%BQPLQDUDy0rlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT5UDy0Yw%719%FA8tB5QPLTeUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPNQPLQ9%64%UDy0ClA8tKpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tGI%709%UDy0HVA8tN1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09FA8tD4%74%FA8tAtQPLSvUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLRk%698%BQPLQcUDy03FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT0UDy0Pw%84%BQPLQFUDy0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Yg%79%FE9tXVQPbSgUD20oFA9tKBQPbSgUD20oFA9tKBQPbSgUD20oFA9tKBQPbSgUD20oFA9tKBQPbSgUD20oFA9tKBQPbSgUD20oFA9tKBQPbSgUD20oFA9tKBQPbSgUD20oFA7tH0%474%FA8tBxQPLTbUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPVQPLR%97%UDy0ClA8tLRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/VA8tF0%74%FA8tLxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMg%469%UDy0G1A8tNpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09VA8tEE%106%FA8tAVQPLTAUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP1QPLRc%69%FA8tLxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMg%218%Es8tBFQPbNQUD2zUFA9s1BQPbNQUD2zUE47tTQ%207%BQPLQaUDy02VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT2UDy0Qw%116%BQPLQEUDy0uFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT8UDy0WQ%63%FA8tLxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMg%218%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%202%FA8tBpQPLTYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPZQPLRE%128%UDy0BVA8tMlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+Q%63%FA8tLxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMg%218%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%197%UDy0GVA8tNdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09lA8tEY%133%UDy0SFA8tPVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0w%64%FE9tXVQPbSgUD20oFA9tKBQPbSgUD20oFA9tKBQPbSgUD20oFA8tMtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPFQPbSgUD20oFA9tKBQPbSgUD20oFA9tKBQPbSgUD20oFA7tH0%218%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%191%BQPLQYUDy01lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT3UDy0Rw%132%BQPLRHUDy09VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTPUDy0Gw%111%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%266%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%186%FA8tBdQPLTVUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPdQPLRI%133%FA8tD9QPLT1UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN1QPLQc%117%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%69%gACAAk0zswo%186%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%181%UDy0FlA8tM9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+FA8tEo%133%UDy0PlA8tPRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy03lA8tB0%122%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%47%BVQLUYUDu0cFA7s71QPLToUDy0/VA8tP9QPLT5UDy00FA9tI9SPbMy%26%BgQL8ITz20pFA7tLBQO7SwUDu0sFA7tLBQO7SwUTy0q1VAqgw%26%FUrqgZQPLSmUDu0sFA7tLBQO7SwUDu0sFA7tLBQPLSpTjuxDUlJtgdSO7Y4Uju2OFA7tGNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLtSO7Y4Uju2OE47tTQ%159%BQPLQWUDy01FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT4UDy0Sw%132%BQPLRBUDy081A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTeUDy0GQ%127%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%37%QEC/BFA7s3lQPLTzUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy1r0w5sxs%21%UD20bVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tX8%26%FE8tW5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLV8%5%FBAtyBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP%155%FA8tBVQPLTTUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPlQPLRM%133%FA8tEFQPLTzUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN9QPLQa%133%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%31%BJSbYHUDu0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOtOPrU+%18%D/AVA8tMNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPJVPbYV%16%VUCqDFA8tOpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tM9AQL8E%5%FBAtyBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP%150%UDy0FFA8tNJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+VA8tE0%133%UDy0OlA8tPNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04FA8tC%139%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%31%BRPLSrUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTyUj2zMg%15%FM+syVQPLT2UDy0/1A8tP9QPLT/UDy0/1A8tP9QO7SS%16%UDy1f1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+04+tjE%10%FBAtyBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP%144%BQPLQTUDy00VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0Tw%132%BQPLQ5UDy08lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTbUDy0IQ%143%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%26%FA8tV1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QO7O9UT20flA7s3lQPLSmUDy0+FA8tP9QPLT/UDy0/1A8tP9QPLT/UTy01GYzzAU%15%BRPbV1UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT5Uzy0Ig%4%BNQLMUUDy08lA8tP9QPLT/UDy0/1A8tP9QPLT/Tzy0h%16%FE6uRZQO7SwUDu0sFE7tMFQPLT/UDy0/1A8tP9QPLT/UDy0/1E8tORQO7SwUDu0sFA8s6U%143%BQPLSIUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPpQPLRQ%133%FA8tDhQPLTxUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN1QPLQi%149%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%21%ZjPMBU88tOdQPLT/UDy0/1A8tP9QPLT/UDy0/FE8tFU%21%Uz6zJVA8tN5QPLT/UDy0/1A8tP9QPLT/UDy0/088tGo%15%BVVaoDUDy0yVA8tP9QPLT/UDy0/1A8tP9QPLT/UDyzpQ%4%BQPLWQUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTVSUm2Bw%31%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%159%BQPLSGUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPVQPLRX%128%UDy0N1A8tPFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04lA8tCM%154%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%21%UT20WFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0j%32%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tM8%21%TTuyK1A8tPlQPLT/UDy0/1A8tP9QPLT/UDy0/lA9s1BQPLT5UDy0/1A8tP9QPLT/UDy0/1A8tP1PPLU3%37%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%159%BQPLQQUDy0y1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT8UDy0VQ%116%BQPLQ2UDy08FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTjUDy0J%160%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%21%UDu0sFA8tP9QPLT/UDy0/1A8tP9QPLT/UkC2H%37%BQPLTDUDy0/1A8tP9QPLT/UDy0/1A8tP9TObMo%21%FA7tH1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tIw%42%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%143%D/AAAK/wAAC%11%UDy0EVA8tMxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1A8tFQ%106%FA8tDVQPLTvUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tORQPLQf%165%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%21%UDy06FA8tP9QPLT/UDy0/1A8tP9RPLTU%42%BQPLV/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPbVg%21%GYzzAVQPLTQUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD2021U5qgk%42%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%133%/wAABv8AAKb/AAD//wAA+/8AAIM%10%FA8tBFQPLTNUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPtQPLRT%96%UDy0OVA8tO9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy05FA8tC%171%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%15%BSQLYcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTPTz21ZE89tWRPPbVkTz21ZE89tWRPPbVkTz21ZE89tWRQPLSdUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSV%26%BOPrYxUDy0+1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+Tj61Pg%47%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%127%D/AAAF/wAAtf8AAP//AAD//wAA//8AAP//AACI%10%BQPLQSUDy0z1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0UQ%84%BQPLQ5UDy07lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTeUDy0Iw%175%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%15%BQPLQzUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QO7Sw%32%UD21hlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSV%53%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%122%P8AAAX/AAC5/wAA//8AAP//AAD//wAA//8AAP//AAD//wAAhg%10%UDy0E1A8tNBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+lA8tEs%74%FA8tDFQPLTyUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOFQPLQn%181%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%15%BPPLREUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLX%33%YEC/CFA8tPJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPlLPLQR%53%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%117%/wAABf8AAK3/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAIQ%10%FA8tBRQPLTRUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPlQPLRP%64%UDy0MFA8tPJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy051A8tCg%186%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%15%BSPbRLUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTM%32%UD20bVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RPLR7%53%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%111%D/AAAF/wAAq/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AACD%10%BQPLQUUDy00lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT5UDy0Tg%52%BQPLQzUDy07VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLToUDy0KQ%191%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%15%BSPbY7UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTLTzy0hE88tIRPPLSETzy0hE88tIRPPLSETzy0hE88tIRPPLSETzy0hE88tIRPPLSETzy0hE88tIRQPLRm%26%BNPrIhUDy09FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT5TTuyKw%47%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%106%P8AAAT/AACq/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAgQ%10%UDy0FVA8tNNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+FA8tEw%42%FA8tDRQPLTrUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOlQPLQq%197%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%15%BRPrQpUDy0/1A8tP9QPLT/UDy0/1A8tP9RPLWh%104%/wFRPLS+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21ylVVqgM%42%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%101%/wAABP8AAKj/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAH8%10%FA8tBZQPLTUUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPhQPLRL%32%UDy0LVA8tOpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy06VA8tCY%202%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%15%BVK6oGTzy091A8tP9QPLT/UDy0/1A8tP9QPLTC%101%FA9tGlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9s3Y%42%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%95%D/AAAE/wAAp/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAB+%10%BQPLQXUDy01VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT4UDy0SQ%20%BQPLQyUDy06lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTqUDy0Jw%207%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%21%Tzy0xFA8tP9QPLT/UDy0/1A8tP9PPLT3Rka5Cw%36%BTPLQiTz21ZE89tWRPPbVkTz21ZE89tWRRPLMv%16%Ujq1H1A8tPJQPLT/UDy0/1A8tP9QPLT/UDy0/087tWdQPLT8UDy0/1A8tP9QPLT/UDy0/088tPdTObMo%37%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%90%P8AAAP/AACl/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAf%11%UDy0F1A8tNZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy091A8tEg%10%FA8tC9QPLTpUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOtQPLQo%213%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%21%UT21dVA8tP9QPLT/UDy0/1A8tP9QPLT/Tz21cQ%34%/wFQO7O9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPbM2%16%UDy0u1A8tP9QPLT/UDy0/1A8tP9QPLT/UT20sQ%4%BRO7ObUDy0/1A8tP9QPLT/UDy0/1A8tP9QPbTGgACAAg%31%FI7tjhQPLT/UDy0/1A8tP9QPLT/UDy0/1A7s6w%85%/wAAA/8AAKT/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAHo%10%FA8tBhQPLTXUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPdQPLRHUDy0L1A8tOlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy06FA8tC0%218%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%21%Szy0EVA8tPVQPLT/UDy0/1A8tP9QPLT/UDy09lE8tUw%21%TjuxDVE8taFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMU%15%BQPLRmUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT8UT60KQ%4%BOO7EaUDy09lA8tP9QPLT/UDy0/1A8tP9QPLT/UTyzcg%31%FA9szZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNI%79%D/AAAD/wAAo/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAB4%10%BQPLQZUDy02FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT3UDy06FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTnUDy0Lw%223%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%26%FE9tH5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QO7POTzy0mlA8tZBQPLStUDy08lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+lI9szI%10%E8+sB1QPLTxUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSZ%16%UD21hlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy09lM+syU%26%FM5syhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLO2UD20gk88tIQ%63%D/AACM/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAdw%10%UDy0GlA8tNlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOdQPLQw%229%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%26%FVVqgNQPLTFUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTu0Xw%15%E88tLdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPRVQLUY%16%VUS7D1A9tOxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMIAAP8B%21%GYzzAVQPLT0UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP%64%D/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAHU%10%FA8tBpQPLTaUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy07FA8tDI%234%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%31%BQQK8QUDy0wlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPZQO7VW%16%UTy0YlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/087tIE%26%FA7tHBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPbRt%26%BRPLSYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP%64%D/AADW/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AABz%10%BQPLQbUDy021A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTuUDy0Lw%239%E87tHRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%37%YEC/CFA9tIJQPLT1UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDu0sFA6tiM%15%BMObMbUDy08FA8tP9QPLT/UDy0/1A8tP9QPLT/UDyz6VVAqgw%26%FUrqgZQPLTeUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT0Uzy0Ig%20%BVRLsPUDy0zFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP%64%D/AAAu/wAA6/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAcQ%10%UDy0HFA8tNxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO9QPLQ0%330%BON7EXUD20aVE9tLFPPLTXUD207FA8tPBQPLTeTzy0t1A8tXxQOrYj%176%SUm2B1E8tWtQO7O9Tzy051A8tPRQPLPpUDy00E88s5E%69%/wAAL/8AAOv/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAG8%10%FA8tBxQPLTdUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy071A8tC8%682%P8AADD/AADs/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AABu%10%BQPLQdUDy03lA8tP9QPLT/UDy0/1A8tP9QPLTwUDy0Ng%692%D/AAAx/wAA7f8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAb%11%UDy0HlA8tN9QPLT/UDy0/1A8tOxQPLQ3%704%/wAAMv8AAO7/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAGo%10%FA8tB9QPLSzUDy0v1A8tC0%714%P8AADP/AADu/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AABp%746%D/AAA0/wAA7/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+/wAAZ%747%/wAANf8AAPD/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA8v8AAB%747%P8AADb/AADw/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AACU%751%D/AAA4/wAA8f8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAxQ%762%/wAAOf8AAPH/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AADW/wAAFw%767%P8AADr/AADy/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AANf/AAAY%778%D/AAA7/wAA8/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA2P8AABg%789%/wAAPP8AAPP/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AADZ/wAAGQ%799%P8AAD3/AAD0/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AANr/AAAa%810%D/AAA//wAA9P8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA2/8AABs%821%/wAAQP8AAOT/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAC8/wAAGw%24986%UDy0GFA8tI5QPLTHUDy0tVA8tFFQPLQB%858%BQPLQWUDy021A8tP9QPLT/UDy0/1A8tP1QPLRz%858%BQPLSFUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTzUDy0K%853%BQPLS3UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy071A8tD0%847%BQPLShUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPJQPLQ9%842%BQPLQ9UDy0+VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTzUDy0Pg%842%UDy0aVA8tPVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy081A8tD4%842%FA8tIxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPNQPLQ/%842%BQPLSLUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTzUDy0Pw%431%FA8tANQPLRvUDy0cFA8tAM%229%UDy0D1A8tH9QPLRY%144%UDy0i1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09FA8tE%422%UDy0BFA8tK1QPLT/UDy0/1A8tLBQPLQG%218%BQPLQXUDy011A8tP9QPLT/UDy0Uw%143%FA8tIpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPRQPLR%411%BQPLQDUDy0pFA8tP9QPLT/UDy0/1A8tP9QPLSqUDy0BQ%207%FA8tBJQPLTQUDy0/1A8tP9QPLT/UDy0xQ%148%BQPLSJUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT0UDy0QQ%399%FA8tAFQPLScUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0o1A8tAI%197%UDy0EFA8tMxQPLT/UDy0/1A8tP9QPLT/UDy0/lA8tAI%149%UDy0iFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09FA8tEI%394%FA8tJRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJ0%191%BQPLQMUDy0x1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tAQ%154%FA8tIhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPVQPLRC%384%UDy0jFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSWUDy0AQ%175%FA8tApQPLTBUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tAI%159%BQPLSHUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTkUDy0HQ%372%BQPLSDUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0jQ%170%UDy0CFA8tLpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0zQ%170%UDy0hlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy021A8tB0%362%FA8tHpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tIQ%159%BQPLQGUDy0s1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Xw%175%FA8tIVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNtQPLQe%352%UDy0clA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLR7%149%FA8tARQPLSrUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSZ%186%BQPLSLUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTcUDy0Hg%340%BQPLRqUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTPUDy0yVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0cg%138%UDy0AlA8tKRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKFQPLQC%186%BQPLQKUDy0ulA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy03FA8tB4%330%FA8tGRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNFQPLQSUDy0EVA8tM9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tGk%127%BQPLQBUDy0nVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0p1A8tAQ%197%UDy0CVA8tLpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN1QPLQf%320%UDy0W1A8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy01FA8tBg%10%FA8tBVQPLTUUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLRi%117%FA8tAFQPLSVUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSuUDy0BQ%207%FA8tAlQPLS5UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTdUDy0Hw%308%BQPLRbUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTcUDy0Fg%20%BQPLQYUDy02VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT9UDy0Wg%111%FA8tI9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLdQPLQD%218%BQPLQJUDy0uFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy03VA8tC%299%FA8tFdQPLT5UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNxQPLQb%32%UDy0GlA8tN5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+lA8tFQ%101%UDy0h1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0u1A8tAc%229%UDy0CVA8tLhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN5QPLQg%288%UDy0S1A8tPdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy03lA8tBw%42%FA8tCBQPLTgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPlQPLRN%90%BQPLR7UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS8UDy0Cg%239%FA8tAhQPLS3UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTeUDy0I%277%BQPLRHUDy0+1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTmUDy0I%53%BQPLQiUDy05VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT3UDy0RQ%79%FA8tHlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMVQPLQL%250%BQPLQIUDy0t1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy031A8tCE%266%FA8tEVQPLT4UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOZQPLQl%64%UDy0JFA8tOtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+FA8tEI%69%UDy0c1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0yFA8tA4%261%UDy0CFA8tLZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN9QPLQh%256%UDy0QFA8tPRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy05VA8tCY%74%FA8tCtQPLTqUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPRQPLRB%58%BQPLRqUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTJUDy0D%272%FA8tAhQPLS2UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTfUDy0Ig%244%BQPLQ8UDy08lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTpUDy0Lg%84%BQPLQtUDy06FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTzUDy0Nw%47%FA8tGRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNFQPLQR%282%BQPLQHUDy0tVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy031A8tAk%234%FA8tDRQPLT0UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO9QPLQx%96%UDy0L1A8tO5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08FA8tDU%37%UDy0YFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy001A8tBc%293%UDy0B1A8tLRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLpQPLQJ%224%UDy0MVA8tPFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08FA8tDQ%106%FA8tDdQPLT0UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPJQPLQ0%26%BQPLRdUDy0/VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTVUDy0Fg%303%FA8tAdQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS6UDy0CQ%212%BQPLQvUDy07FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT0UDy0Ow%116%BQPLQ4UDy08lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTsUDy0L%16%FA8tFlQPLT5UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNxQPLQb%314%BQPLQeUDy03FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0u1A8tAo%202%FA8tCpQPLTpUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPVQPLR%129%UDy0O1A8tPVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy05lA8tCo%5%UDy0TVA8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy03lA8tBs%325%UDy0HlA8tNtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLtQPLQK%192%UDy0JFA8tOVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy091A8tEY%138%FA8tERQPLT1UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOdQPLRtUDy0+1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLThUDy0IQ%335%FA8tB1QPLTbUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS8UDy0Cg%180%BQPLQfUDy04lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0Tg%148%BQPLRHUDy0+VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOZQPLQm%346%BQPLQdUDy021A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vFA8tAo%170%FA8tANQPLTWUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPxQPLRV%160%UDy0TFA8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy06VA8tCk%357%UDy0HVA8tNpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tL1QPLQK%165%FA8tFZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/VA8tFw%170%FA8tFRQPLT7UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTsUDy0Lg%367%FA8tBxQPLTaUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS9UDy0Cw%159%FA8tJRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0Z%181%BQPLRcUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPBQPLQ0%378%BQPLQcUDy02VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vlA8tAs%154%FA8tJpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLRs%192%UDy0ZFA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy081A8tDo%389%UDy0HFA8tNlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tL9QPLQL%149%FA8tJpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tHM%202%FA8tGtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT1UDy0Q%400%FA8tBtQPLTZUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS/UDy0Cw%143%FA8tGxQPLT/UDy0/1A8tP9QPLT/UDy0fg%212%BQPLR0UDy0/1A8tP9QPLT/UDy0/1A8tPhQPLRG%410%BQPLQbUDy02FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0wFA8tAw%138%FA8tBNQPLTvUDy0/1A8tP9QPLSG%224%UDy0fVA8tP9QPLT/UDy0+lA8tE0%421%UDy0GlA8tNhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMBQPLQM%138%BQPLRBUDy0tFA8tGg%234%FA8tHNQPLS0UDy0Tg%431%FA8tBtQPLTyUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSh%842%BQPLQ+UDy081A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0jg%842%UDy0PVA8tPJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tI4%842%FA8tD1QPLTyUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSP%842%BQPLQ8UDy08lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0k%843%UDy0PFA8tPJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJE%842%FA8tDtQPLTxUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSHUDy0BQ%836%BQPLQ7UDy08VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0jg%842%UDy0OlA8tPFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+VA8tBk%842%FA8tDpQPLTxUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tD8%847%BQPLQ5UDy07lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1A8tB4%853%UDy0L1A8tPJQPLT/UDy0/1A8tP9QPLT/UDy0nQ%863%FA8tDxQPLTHUDy0+FA8tOlQPLSKUDy0Cg%868%BQPLQCUDy0CVA8tAY%22101%UDy0SFA8tNpQPLTsUDy0Xg%442%UDy0MlA8tLdQPLT/UDy0mFA8tCo%405%UDy04FA8tP9QPLT/UDy0/1A8tJFQPLQH%426%BQPLRGUDy0/FA8tP9QPLT/UDy0/1A8tO5QPLQO%400%UDy07FA8tP9QPLT/UDy0/1A8tP9QPLTVUDy0Kw%415%FA8tEZQPLT8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLR6%400%UDy0XlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy071A8tFw%405%UDy0R1A8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLR8%405%FA8tJFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPJQPLRi%400%UDy01lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRE%405%FA8tAZQPLS9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT8UDy0lVE9tAM%389%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tItQPLQB%410%BQPLQYUDy03VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMNQPLQV%384%UDy07FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0i1A8tAE%421%UDy0N1A8tPFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTkUDy0Mw%378%UDy0a1A8tP9QPLT/UDy0/1A8tP9QPLSLUDy0AQ%431%FA8tGJQPLT8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy091A8tF8%378%FA8tDhQPLSyUDy0vVA8tERQPLQB%37%FA8tBdQPLSxUDy051A8tOVQPLRd%378%BQPLSVUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLSRUDy0BQ%426%UDy0F1A8tN1QPLT/UDy0/1A8tP9QPLT/UDy0Uw%372%BRPbQDUDy0w1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vVA8tBc%415%BQPLQXUDy03VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0q%379%UDy0FVA8tORQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN5QPLQ1%405%FA8tBdQPLTdUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0r%384%FA8tDNQPLT3UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTyUDy0Y%395%UDy0F1A8tN1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0cw%388%BQPLRfUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/FA8tJRQPLQE%378%BQPLQXUDy03VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSF%400%UDy0kVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTCUDy0Fg%367%FA8tAFQPLTSUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tIU%405%UDy0BVA8tL1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy041A8tDQ%362%FA8tC9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0hQ%42%UDy0AlA8tAhQPLQIUDy0AQ%351%FA8tBdQPLTeUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPdQPLRf%357%FA8tC1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSF%42%BQPLQgUDy0qVA8tP9QPLT/UDy0sFA8tAw%351%BQPLQ1UDy08lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0kVA8tAU%351%BQPLS9UDy0/1A8tP9QPLT/UDy0/1A8tIU%42%FA8tCBQPLTdUDy0/1A8tP9QPLT/UDy0/1A8tLw%357%UDy0YFA8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tL5QPLQX%346%BQPLQMUDy0oVA8tP5QPLT0UDy0cg%42%UDy0IFA8tN1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPNQPLQT%357%FA8tJRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTgUDy0N%405%BQPLQhUDy03FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPFQPLQS%357%FA8tARQPLTCUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09FA8tF8%394%FA8tCFQPLTcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJ4%367%BQPLQWUDy041A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP1QPLSTUDy0Bg%378%UDy0IFA8tNxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0x1A8tAo%373%UDy0NFA8tPdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0wVA8tBc%367%BQPLQgUDy03VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTIUDy0CQ%383%FA8tF9QPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOJQPLQ1%357%FA8tB9QPLTdUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMhQPLQJ%42%BQPLQ1UDy0R1A8tBQ%335%BQPLSRUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT3UDy0Xw%346%UDy0AlA8tMhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0yFA8tAg%37%UDy0A1A8tK1QPLT9UDy0/1A8tPhQPLR%331%BQPLQFUDy0vlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJFQPLQF%336%UDy0QVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTIUDy0C%37%BQPLQDUDy0rFA8tP9QPLT/UDy0/1A8tP9QPLT5UDy0F%331%UDy0F1A8tOBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS/UDy0Fg%330%UDy0WlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMhQPLQJ%37%FA8tARQPLSsUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0WQ%335%FA8tDRQPLT0UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04FA8tDM%325%UDy0B1A8tPVQPLT/UDy0/1A8tP9QPLT/UDy0x1A8tAk%37%UDy0BFA8tKxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0S%341%BQPLRfUDy0/VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPVQPLRdUj+1AQ%319%FA8tD1QPLTpUDy0/1A8tP9QPLS3UDy0Cg%36%BQPLQEUDy0q1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT%353%UDy0k1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0kVA8tAc%319%BQPLQLUDy0HVA8tB0%42%FA8tARQPLSrUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMBQPLQJ%352%UDy0BlA8tMFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMBQPLQY%368%UDy0BFA8tKtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0v1A8tAk%362%FA8tBdQPLTiUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLThUDy0NQ%356%BQPLQEUDy0rFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS/UDy0Cg%42%UDy0LlA8tH1QPLQgUDy0Ag%308%BQPLQ1UDy091A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09lA8tF8%346%FA8tANQPLSsUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tL5QPLQK%37%FA8tARQPLSMUDy0/lA8tP9QPLT/UDy0mFA8tAI%309%UDy0X1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSRUDy0BQ%330%UDy0A1A8tKxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vlA8tAs%37%UDy0BFA8tLRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tGo%314%FA8tJFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0v1A8tBU%325%UDy0rVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS+UDy0Cw%36%BQPLQDUDy0tFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKQ%314%FA8tAVQPLS/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOFQPLQy%314%BQPLQ1UDy0/VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tL9QPLQK%37%FA8tANQPLS1UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tHo%319%BQPLQWUDy04FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT3UDy0XFE+tAE%303%BQPLR8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0v1A8tAo%37%UDy0AlA8tLVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy07VA8tA8%325%UDy0M1A8tPVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tI9QPLQJ%298%BQPLRGUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTAUDy0CQ%36%BQPLQCUDy0tVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTsUDy0Kw%335%FA8tF1QPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS+UDy0GQ%298%UDy0klA8tP9QPLT/UDy0/1A8tMBQPLQJ%37%FA8tAJQPLS2UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOtQPLQs%341%FI/tQFQPLSRUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04FA8tDY%298%FA8tFRQPLSdUDy0X1A8tAg%37%UDy0AlA8tLVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy06lA8tC0%42%FA8tClQPLSSUDy0dFA8tB8%287%BQPLQHUDy0wFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPZQPLRf%346%BQPLQDUDy0tVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTpUDy0Lg%42%UDy0aVA8tP9QPLT/UDy0/1A8tNpQPLQe%288%UDy0GFA8tOFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0kVA8tAQ%330%FA8tANQPLS1UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOlQPLQu%42%BQPLRpUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS/%293%FA8tDVQPLT2UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMBQPLQU%320%UDy0BFA8tLRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy06VA8tC8%42%FA8tGpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%298%BQPLRfUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTiUDy0MQ%308%BQPLQEUDy0tFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTpUDy0Lw%42%UDy0alA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTJ%304%UDy0kVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+FA8tFtRPbQB%298%BQPLSmUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOlQPLQu%42%BQPLRqUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLQp%304%UDy0BVA8tL9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSE%293%FA8tE5QPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy06lA8tC4%42%FA8tGtQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tGU%314%FA8tBVQPLThUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT8%293%FA8tHxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTrUDy0LQ%42%UDy0a1A8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0ZQ%324%BQPLQyUDy091A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTo%293%FA8tGlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOxQPLQs%42%BQPLRrUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLRm%336%UDy0XFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPRQPLRB%293%FA8tAtQPLTbUDy0/1A8tP9QPLT/UDy07FA8tCs%42%FA8tGtQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tGY%341%UT60AVA8tI9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09FA8tEE%303%BQPLQVUDy0q1A8tNxQPLSzUDy0L%43%UDy0a1A8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0Zg%351%FA8tAlQPLS+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT0UDy0QQ%372%BQPLRqUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP1QPLRn%362%BQPLQZUDy04FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPRQPLRB%373%FA8tGpQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/VA8tGc%373%UDy0NlA8tPZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09FA8tEE%373%UDy0alA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT9UDy0Zw%383%FA8tF9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT0UDy0QQ%372%BQPLRpUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLRn%394%BQPLSRUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPRQPLRB%373%FA8tGlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tGY%399%BQPLQEUDy0wFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09FA8tEE%373%UDy0SFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0Zg%410%UDy0FFA8tOJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT0UDy0QQ%378%UDy0p1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRm%421%FA8tDFQPLT4UDy0/1A8tP9QPLT/UDy0/1A8tPRQPLRB%384%UDy0pVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tGU%431%BQPLRbUDy0/1A8tP9QPLT/UDy09FA8tEE%389%UDy0OVA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0ZQ%436%BRPbQBUDy0hFA8tPxQPLToUDy0QQ%399%FA8tFFQPLT+UDy0/1A8tOVQPLRE%32549%FA8tAlQPLQ2UDy0K%421%BQPLQOUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0Cg%282%UDy0E1A8tNpQPLT/UDy0/lA8tK1QPLQj%405%FA8tDFQPLTsUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04lA8tCE%277%UDy0ZlA8tP9QPLT/UDy0/1A8tP9QPLT7UDy0g1A8tAs%394%FA8tKNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tIc%277%UDy0aFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN9QPLRbUT20Ag%383%FA8tKlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0ylA8tDM%378%FA8tKlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSjUDy0H%368%FA8tKlQPLT/UDy0/1A8tP9QPLT0UDy0QFA8tEFQPLRBUDy0QVA8tEFQPLRBUDy0QVA8tEFQPLRBUDy0QVA8tEFQPLRBUDy0QVA8tEFQPLRBUDy0QVA8tEFQPLRBUDy0QVA8tEFQPLRBUDy0QVA8tEFQPLRBUDy03lA8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy07VA8tHpQPLQG%357%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpQPLQ8UDy001A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTbUDy0UFJAtQE%346%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUBUD20A1A8tG9QPLToUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMJQPLQq%341%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%10%BQPLQWUDy0jVA8tP1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT9UDy0j1A8tBY%330%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%21%FA8tCpQPLTAUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOlQPLRwUT20Ag%319%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%26%BRPrQBUDy0UFA8tNhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy01VA8tD0%314%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%37%FA8tAdQPLR5UDy07FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLSvUDy0J%304%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%48%UDy0HFA8tKJQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+VA8tIVQPLQS%293%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%58%BQPLQzUDy0yFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTjUDy0X%288%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%64%UT60AVA8tFxQPLTcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tM1QPLQ5%277%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%74%BQPLQNUDy0g1A8tPlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTI%277%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%80%Uj+1AVA8tGFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTxUDy0Bw%271%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%74%BQPLQnUDy0sVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS0%277%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%64%UDy0C1A8tIlQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tJ5QPLQN%277%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%53%FE9tAJQPLRfUDy05FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTGUDy0Lg%287%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%48%UDy0N1A8tM9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04VA8tGBRPrUB%293%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%37%FA8tB5QPLSdUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPpQPLR+UDy0Dw%303%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%26%BQPLQGUDy0f1A8tO9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0p1A8tB8%314%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%21%FA8tFZQPLTfUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tM1QPLRC%325%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUB%10%BQPLQvUDy0vFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTmUDy0a1A9tAM%330%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPpSPrUBUDy0GFA8tJRQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/FA8tIhQPLQT%341%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tPtQPLR3UDy061A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLS8UDy0Jw%351%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy00lA8tE0%362%FA8tKlQPLT/UDy0/1A8tP9QPLTx%128%UDy001A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPVQPLR1UDy0Bw%367%FA8tKlQPLT/UDy0/1A8tP9QPLT3UDy0d1A8tHhQPLR4UDy0eFA8tHhQPLR4UDy0eFA8tHhQPLR4UDy0eFA8tHhQPLR4UDy0eFA8tHhQPLR4UDy0eFA8tHhQPLR4UDy0eFA8tHhQPLR4UDy0eFA8tHhQPLR3UDy06FA8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT7UDy0nlA8tBg%378%FA8tKlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tI0%277%UDy0aFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tMJQPLQx%389%FA8tKlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tI0%277%UDy0XlA8tP9QPLT/UDy0/1A8tP9QPLTiUDy0WQ%399%FA8tJhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tIc%277%UDy0DFA8tL5QPLT/UDy091A8tH9QPLQO%405%FA8tCZQPLTeUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy03lA8tCE%282%FE9tAJQPLQQUDy0Cw%420%BQPLQHUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUDy0I1A8tCNQPLQjUT20Ag%33967%FA8tBhQPLQd%874%BQPLQYUDy0n1A8tPxQPLT/UDy0xlA8tC4%853%UT20AlA8tHZQPLTrUDy0/1A8tP9QPLT/UDy0/1A8tP1QPLSTUDy0G%837%BQPLRNUDy02FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy06lA8tHRRPbQC%816%UDy0KlA8tLFQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTXUDy0QQ%420%BQPLQlUDy0TFA8tCU%362%FA8tBRQPLSKUDy0+VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPtQPLT2UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tLJQPLQn%394%BQPLQjUDy0d1A8tMpQPLT+UDy0/1A8tPhQPLRM%346%BRPbQDUDy0a1A8tOVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0wVA8tDJQPLQaUDy0n1A8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0iFA8tBQ%362%FNAtQFQPLQgUDy0elA8tMhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTlUDy0Gw%335%FA8tDtQPLTOUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNlQPLRZ%21%FA8tDFQPLTEUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOVQPLRgUj+1AQ%340%BQPLQ2UDy0hFA8tNNQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0wlE9tAM%319%BQPLQmUDy0plA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT2UDy0gFA8tA0%31%BSP7UBUDy0WVA8tOJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0z1A8tDg%319%BQPLQ0UDy0hlA8tNxQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tIc%309%UDy0CFA8tH9QPLTzUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/VA8tKtQPLQb%53%FA8tA9QPLSAUDy091A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP1QPLSnUDy0Iw%287%FA8tAZQPLQuUDy0ilA8tNlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPpQPLTaUDy0/1A8tP9QPLT/UDy0/1A8tPpQPLQ+%293%FE9tANQPLRUUDy04VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTIUDy0Ow%74%UDy0HlA8tKtQPLT8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09VA8tH9QPLQG%261%FA9tANQPLRFUDy0lVA8tOpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPtQPLS+UDy0bVA8tBhRPbQCUDy0wlA8tP9QPLT/UDy0/1A8tP9QPLTeUDy0Cw%282%UDy0NVA8tMNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy07FA8tGI%95%BQPLQ8UDy0y1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTeUDy0VVE9tAE%234%FE9tAJQPLRGUDy0llA8tOhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPVQPLSxUDy0V1A8tA8%21%UDy0HVA8tO9QPLT/UDy0/1A8tP9QPLT/UDy0qlI/tQE%266%FA8tBVQPLSbUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPlQPLSLUDy0E%107%UDy0B1A8tGdQPLTqUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMRQPLQy%213%FA8tAxQPLRLUDy0mFA8tOdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPRQPLSyUDy0WVA8tA4%42%FA8tFZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tGY%255%BQPLQHUDy0c1A8tO1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0tFA8tC%128%BQPLQSUDy0jFA8tPhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0k1A8tBc%186%FA8tAZQPLRUUDy0pVA8tPVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO5QPLSnUDy0XVA8tAw%63%BQPLSfUDy0/1A8tP9QPLT/UDy0/1A8tPFQPLQo%240%UT60AVA8tElQPLTeUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNVQPLRD%149%FA8tCFQPLS2UDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOtQPLRzUDy0BQ%175%FA8tK9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO1QPLSgUDy0RVA8tAg%79%BQPLQOUDy00lA8tP9QPLT/UDy0/1A8tP9QPLTTUDy0Bw%228%BQPLQeUDy0ulA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTyUDy0a1A8tAk%165%UDy0UFA8tNRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy02lA8tEg%165%UDy0HFA8tP1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOxQPLShUDy0R1A8tAg%101%UDy0NVA8tPtQPLT/UDy0/1A8tP9QPLT/UDy0kQ%228%BQPLTNUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/VA8tJRQPLQU%181%FA8tApQPLRsUDy08lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPtQPLQY%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOJQPLSLUDy0TVA8tAQ%122%FA8tG9QPLT/UDy0/1A8tP9QPLT/UDy0/FA8tE4%223%BQPLT2UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS9UDy0Jw%202%UDy0FVA8tJZQPLT8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLS3UDy0NlA9tAM%143%BQPLS0UDy0/1A8tP9QPLT/UDy0/1A8tOtQPLQV%218%BQPLT2UDy0/1A8tP9QPLT/UDy03FA8tFhSP7UB%218%BQPLQzUDy0xFA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%154%BQPLQZUDy05lA8tP9QPLT/UDy0/1A8tP9QPLS8UDy0BQ%212%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%160%UDy0QlA8tP1QPLT/UDy0/1A8tP9QPLT/UDy0dw%212%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%165%FA8tIlQPLT/UDy0/1A8tP9QPLT/UDy0+FA8tDc%207%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%165%FA8tAlQPLTGUDy0/1A8tP9QPLT/UDy0/1A8tOJQPLQQ%202%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%170%BQPLQlUDy09FA8tP9QPLT/UDy0/1A8tP9QPLSj%202%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%176%UDy0WlA8tP5QPLT/UDy0/1A8tP9QPLT+UDy0YQ%196%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%181%FA8tKRQPLT/UDy0/1A8tP9QPLT/UDy09FA8tCI%191%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%181%FA8tA9QPLTbUDy0/1A8tP9QPLT/UDy0/1A8tMxQPLQM%186%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%186%BQPLQxUDy091A8tP9QPLT/UDy0/1A8tP9QPLSI%186%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%192%UDy0dlA8tP9QPLT/UDy0/1A8tP9QPLT9UDy0SQ%180%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%192%UDy0BVA8tLZQPLT/UDy0/1A8tP9QPLT/UDy07VA8tBs%175%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%197%FA8tBlQPLTrUDy0/1A8tP9QPLT/UDy0/1A8tJ4%175%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%202%BQPLSrUDy0/1A8tP9QPLT/UDy0/1A8tLg%175%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%197%FA8tFJQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tF4%175%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%192%UDy0HlA8tPJQPLT/UDy0/1A8tP9QPLT/UDy0rVA9tAM%175%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%186%BSPrUBUDy0vlA8tP9QPLT/UDy0/1A8tP9QPLTmUDy0Ew%180%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%186%BQPLSBUDy0/1A8tP9QPLT/UDy0/1A8tPhQPLR%187%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%181%FA8tDpQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tIk%191%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%176%UDy0FlA8tN5QPLT/UDy0/1A8tP9QPLT/UDy0xFA8tAU%191%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%176%UDy0plA8tP9QPLT/UDy0/1A8tP9QPLTtUDy0HQ%196%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%170%BQPLRnUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRa%202%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%165%FA8tChQPLT5UDy0/1A8tP9QPLT/UDy0/1A8tJk%207%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%160%UDy0BVA8tNBQPLT/UDy0/1A8tP9QPLT/UDy02FA8tAo%207%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR2%160%UDy0l1A8tP9QPLT/UDy0/1A8tP9QPLTyUDy0MQ%212%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLR3%154%BQPLRNUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLR1%218%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLT3UDy0rlA8tFlQPLQQ%133%FA8tB9QPLTnUDy0/1A8tP9QPLT/UDy0/1A8tLJSP7UB%218%BQPLT2UDy0/1A8tP9QPLT/UDy0bg%234%UDy0PVA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0IlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT4UDy0q1A8tFtQPLQO%112%UD20A1A8tLpQPLT/UDy0/1A8tP9QPLT/UDy05lA8tBI%223%BQPLT2UDy0/1A8tP9QPLT/UDy08VA8tHRQPLQI%213%FA9tANQPLRRUDy03VA8tP9QPLT/UDy0/1A8tP9QPLRb%160%UDy0CVA8tPBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT1UDy0ulA8tGhQPLQa%96%UDy0fVA8tP9QPLT/UDy0/1A8tP9QPLT+UDy0RQ%228%BQPLT2UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTeUDy0T%203%UDy0KVA8tLlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRY%165%FA8tElQPLTdUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT7UDy0wVA8tGpQPLQa%74%BQPLQ2UDy0/FA8tP9QPLT/UDy0/1A8tP9QPLSE%234%BQPLTEUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLJQPLQq%181%FA8tBFQPLSVUDy0+FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOtQPLQV%176%UDy0NFA8tIRQPLTdUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0u1A8tGxQPLQY%53%FA8tAxQPLTgUDy0/1A8tP9QPLT/UDy0/1A8tMhQPLQE%234%BQPLQWUDy0mlA8tPlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT4UDy0lFA8tA8%159%BQPLQGUDy0alA8tO9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0u1A8tCk%191%BRPbQCUDy0MFA8tIpQPLTTUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT8UDy01FA8tHhQPLQp%32%UT20AlA8tK1QPLT/UDy0/1A8tP9QPLT/UDy07FA8tCY%250%FA8tDZQPLS6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO1QPLRpUDy0Bw%143%FA8tEVQPLTUUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN9QPLRMUT20AQ%218%UDy0I1A8tHRQPLTNUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT9UDy001A8tHhQPLQo%16%UDy0X1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Xw%260%BQPbQDUDy0TlA8tN9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0yVA8tEU%127%BQPLQgUDy0sVA8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTxUDy0dVA8tAY%245%UDy0JVA8tHJQPLTQUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0zVA8tIRQPLRZUDy08FA8tP9QPLT/UDy0/1A8tP9QPLSd%277%FA8tAhQPLR2UDy08VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPxQPLStUDy0IQ%106%UDy0DlA8tIlQPLT3UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tJ1QPLQe%272%UDy0I1A8tHhQPLS2UDy0/VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNxQPLQL%288%UDy0HlA8tJ5QPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09VA8tIlQPLQN%85%FE9tAJQPLRhUDy07FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTGUDy0Og%298%UDy0FlA8tGVQPLS7UDy0+lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+lA8tDI%303%BQPLQ8UDy0xVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTiUDy0XFA9tAQ%69%UDy0OlA8tMNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy05lA8tFdSPrUB%320%UDy0FlA8tGNQPLTAUDy0+FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0bQ%314%UD20A1A8tFdQPLTnUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMFQPLQ7%53%FA8tBhQPLSoUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPRQPLSLUDy0CQ%346%UDy0FlA8tFtQPLSnUDy09lA8tP9QPLT/UDy0/1A8tP9QPLS4UT20Ag%324%BQPLQKUDy0i1A8tPZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDy0qFA8tBg%31%BQPLQJUDy0dFA8tPVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0qVA8tCQ%373%UDy0DVA8tFRQPLSpUDy0w1A8tKtQPLQa%341%FA8tCRQPLSoUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPNQPLRzUDy0CQ%15%FA8tFdQPLTbUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tM1QPLRD%768%UDy0RFA8tNlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy02lA8tFZQPLQxUDy0u1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTrUDy0a1A9tAM%778%FA9tANQPLRtUDy07FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09lA8tJVQPLQO%800%UDy0DlA8tJZQPLT4UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSxUDy0L%821%BQPLQrUDy0vlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy031A8tEtRPrUB%837%FA8tE5QPLTgUDy0/1A8tP9QPLT/UDy0/1A8tO5QPLR1UDy0Bw%852%BQPLQGUDy0dlA8tOhQPLT4UDy0p1A8tBU%874%FA8tARQPLQI%13829%FE9tANQPbQD%880%UDy0ZlA8tOVQPLTrUDy0u1A8tH5QPLRAUDy0EQ%847%FA8tAZQPLSMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1A8tM1QPLSaUDy0V1A8tCE%821%UDy0FlA8tLpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTjUDy0pFA8tHBQPLQxUDy0Cw%788%BQPLQxUDy03FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08lA8tMFQPLSDUDy0T1A8tA4%383%BQPLQvUDy0VlA8tBM%362%FA8tFhQPLTyUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLToUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP1QPLTUUDy0llA8tGRQPLQmUT20AQ%346%UDy0JFA8tKlQPLT9UDy0/1A8tPNQPLRtUD20Aw%340%BQPLQIUDy0ilA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tL5QPLQeUT20AlA8tDpQPLR6UDy0rVA8tOZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy05FA8tLJQPLR0UDy0QlA8tAs%314%FA8tAZQPLSBUDy09lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy00VA8tEU%330%FA8tBpQPLTAUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0lFA8tAo%26%FA9tARQPLQpUDy0XVA8tJxQPLTPUDy0+lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPhQPLTEUDy0kFA8tCk%287%BRPbQBUDy0WFA8tOBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSrUDy0IQ%314%UDy0N1A8tOBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPlQPLRiUT20AQ%58%UDy0EVA8tEpQPLSDUDy0u1A8tPNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO5QPLQl%277%FA8tDRQPLTHUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+lA8tIJQPLQR%293%FI+tQFQPLRgUDy09VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy041A8tDY%90%FA8tAZQPLQ3UDy0alA8tKhQPLTnUDy0/VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSb%266%BQPLQZUDy0nVA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT4UDy011A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTiUDy0Yw%282%UDy0ClA8tJJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTDUDy0Gg%122%UDy0HlA8tFlQPLSMUDy0zFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT0UDy0Fg%250%UDy0BlA8tHZQPLTsUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tLRQPLQgUT20AlA8tF1QPLTgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMpQPLQx%266%BQPLQdUDy0vVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJdQPLQH%149%FA8tAdQPLRFUDy0hFA8tMxQPLT/UDy0/1A8tP9QPLT/UDy0hw%239%FE9tAJQPLRMUDy021A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTRUDy0Qw%20%BQPLQMUDy0g1A8tPJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT9UDy0olA8tBw%250%FA8tDpQPLTdUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT7UDy0ZVI/tQE%170%FA8tB1QPLT3UDy0/1A8tP9QPLT/UDy09FA8tBU%229%UDy0LlA8tLtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08FA8tGpQPLQK%37%FA8tCVQPLSuUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPVQPLR4UDy0Dg%234%UDy0YlA8tPNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOpQPLQ2%186%BQPLSXUDy0/1A8tP9QPLT/UDy0/1A8tIk%218%FA8tBFQPLSQUDy09lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPtQPLSUUDy0F%21%BQPLQ8UDy0vlA8tMlQPLRuUDy0BQ%10%UDy0P1A8tNFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy02lA8tF%219%FE9tAJQPLSTUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vFA8tBY%191%BQPLQeUDy0/1A8tP9QPLT/UDy0/1A8tPJQPLQU%202%BQPLQFUDy0alA8tOlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0vFA8tDI%26%FA8tA5QPLTzUDy0/1A8tP9QPLT/UDy021A8tEU%10%FE9tANQPLRpUDy06lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLTBUDy0Kw%202%UDy0FlA8tMNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSPUDy0BQ%202%UDy0rlA8tP9QPLT/UDy0/1A8tP9QPLR2%192%Uj+1AVA8tD9QPLTNUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNpQPLRW%37%FA8tD9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS3UDy0Jw%10%UDy0F1A8tJBQPLT7UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1A8tJdQPLQV%186%BQPLQ0UDy04lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+VA8tFw%213%UDy0M1A8tP5QPLT/UDy0/1A8tP9QPLTlUDy0C%181%BQPLQmUDy0p1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT2UDy0dFA8tAs%42%FA8tAZQPLThUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09FA8tI9QPLQL%10%BQPLQpUDy0u1A8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTnUDy0b1E9tAI%170%FA8tF5QPLT2UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTmUDy0Lw%223%FA8tLBQPLT/UDy0/1A8tP9QPLT/UDy0bg%170%UDy0ClA8tIpQPLTyUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tKhQPLQY%58%BQPLQrUDy0wVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLToUDy0ZVE+tAE%10%FA8tEtQPLTWUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNNQPLRG%154%BRPbQCUDy0kVA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMBQPLQS%229%FA8tDJQPLT9UDy0/1A8tP9QPLT/UDy041A8tAc%154%FE9tAJQPLRVUDy05VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTFUDy0OQ%74%Uj61AVA8tF1QPLTfUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNRQPLQ9%10%BQPLQMUDy0dlA8tPJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0tVA8tB8%138%FA8tBBQPLTAUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0kVA9tAQ%239%BQPLSzUDy0/1A8tP9QPLT/UDy0/1A8tG8%149%UDy0I1A8tNBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04VA8tGBRPrQB%90%BQPLQMUDy0elA8tPdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy0olA8tC%11%FA8tBtQPLSdUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPdQPLSIUD20Aw%127%FA8tI1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPdQPLRf%250%BQPLRCUDy0/1A8tP9QPLT/UDy0/1A8tOJQPLQI%144%UDy0r1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPpQPLSJUDy0Dg%111%FA8tBxQPLSuUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPJQPLSEUDy0Bg%10%UDy0LlA8tMVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Sw%127%FA8tLFQPLT/UDy0/1A8tP9QPLT/UDy05VA8tDQ%255%BRPrQBUDy0y1A8tP9QPLT/UDy0/1A8tP9QPLRQ%144%UDy09VA8tP9QPLT/UDy0/1A8tP9QPLT+UDy0sVA8tB8%133%UDy0QFA8tMdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04lA8tFFSP7UB%10%BQPLRgUDy03lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTwUDy0F%267%UDy0S1A8tP9QPLT/UDy0/1A8tP9QPLTPUT61AQ%138%UDy09VA8tP9QPLT/UDy0/1A8tN1QPLRC%149%FA9tARQPLRlUDy05VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTAUDy0NQ%10%UDy0D1A8tH5QPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%272%UT20A1A8tMxQPLT/UDy0/1A8tP9QPLT/UDy0Ug%138%UDy09VA8tP9QPLT/UDy0/1A8tKQ%165%UDy0EVA8tJBQPLT4UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/VA8tEw%10%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%277%FA8tExQPLT/UDy0/1A8tP9QPLT/UDy0zQ%138%UDy09VA8tP9QPLT/UDy0/1A8tKQ%10%FA8tC9QPLTTUDy06VA8tK1QPLQL%138%BQPLQlUDy0tlA8tP1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLw%10%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%277%FE9tAJQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tFI%133%UDy09VA8tP9QPLT/UDy0/1A8tKQ%10%FA8tNNQPLT/UDy0/1A8tP9QPLR1%149%FA8tEtQPLTOUDy0/1A8tP9QPLT/UDy0/1A8tLM%10%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%282%BQPLRpUDy0/1A8tP9QPLT/UDy0/1A8tMM%133%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%154%BQPLQJUDy0cFA8tPFQPLT/UDy06lA8tDc%10%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%282%BQPLQIUDy04lA8tP9QPLT/UDy0/1A8tP9QPLQ3%128%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%165%FA8tAhQPLQ6UD20Aw%15%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%288%UDy0ZlA8tP9QPLT/UDy0/1A8tP9QPLSz%128%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%288%UDy0CVA8tOJQPLT/UDy0/1A8tP9QPLT/UDy0Ng%122%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%293%FA8tGhQPLT/UDy0/1A8tP9QPLT/UDy0tQ%122%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%293%FA8tAdQPLTsUDy0/1A8tP9QPLT/UDy0/VA8tDU%117%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%298%BQPLSDUDy0/1A8tP9QPLT/UDy0/1A8tJ8%117%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%298%BQPLQUUDy08lA8tP9QPLT/UDy0/1A8tPpQPLQg%112%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%304%UDy0hFA8tP9QPLT/UDy0/1A8tP9QPLSX%112%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%304%UDy0GFA8tP5QPLT/UDy0/1A8tP9QPLTI%112%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%304%UDy0X1A8tP9QPLT/UDy0/1A8tP9QPLS8%112%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%298%BRPbQCUDy0zFA8tP9QPLT/UDy0/1A8tP9QPLRT%112%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%298%BQPLRKUDy0/1A8tP9QPLT/UDy0/1A8tM9SP7UB%112%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%293%FE9tAJQPLTLUDy0/1A8tP9QPLT/UDy0/1A8tFE%117%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%293%FA8tExQPLT/UDy0/1A8tP9QPLT/UDy00FE9tAM%117%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%293%FA8tMpQPLT/UDy0/1A8tP9QPLT/UDy0Zg%122%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%288%UDy0OlA8tP9QPLT/UDy0/1A8tP9QPLTjUDy0Bw%122%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%288%UDy0sFA8tP9QPLT/UDy0/1A8tP9QPLRv%128%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%197%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%282%BQPLQyUDy0/lA8tP9QPLT/UDy0/1A8tOVQPLQI%128%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0DlA8tP9QPLT/UDy0/1A8tP9QPLSH%160%UDy0BlA8tGVQPLSaUDy0blI/tQE%10%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%282%BQPLStUDy0/1A8tP9QPLT/UDy0/1A8tGw%133%UDy09VA8tP9QPLT/UDy0/1A8tKQ%5%UDy0CVA8tPNQPLT/UDy0/1A8tP9QPLSI%154%BQPLRMUDy04FA8tP9QPLT/UDy0/1A8tHE%10%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%277%FA8tDJQPLT/UDy0/1A8tP9QPLT/UDy05lA8tAo%133%UDy09VA8tP9QPLT/UDy0/1A8tKQ%10%FA8tJ9QPLT/UDy0/1A8tP5QPLQ4%144%UDy0K1A8tL1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMM%10%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTp%277%FA8tK5QPLT/UDy0/1A8tP9QPLT/UDy0ig%138%UDy09VA8tP9QPLT/UDy0/1A8tKQ%10%FA8tAdQPLRnUDy0iFA8tDg%138%FA8tA1QPLSVUDy09lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJQ%10%FA8tAZQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLTrUT61AQ%266%UDy0HFA8tPZQPLT/UDy0/1A8tP9QPLT0UDy0FQ%138%UDy09VA8tP9QPLT/UDy0/1A8tK9SP7UB%154%BRPbQCUDy0a1A8tOxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0sVA8tB0%10%FA8tBNQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tLFQPLT/UDy0/1A8tP9QPLT/UDy0mlA8tAw%261%UDy0k1A8tP9QPLT/UDy0/1A8tP9QPLSI%144%UDy09VA8tP9QPLT/UDy0/1A8tP9QPLS1UDy0Lw%143%FA8tENQPLTYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNtQPLRY%10%BQPLQEUDy0YVA8tOtQPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tJtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMNQPLQi%250%BQPLQdUDy0+FA8tP9QPLT/UDy0/1A8tPRQPLQX%144%UDy05FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+VA8tI1QPLQL%122%BQPLQjUDy0p1A8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT1UDy0dFA8tAk%10%FA8tD1QPLTDUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0X%128%FA8tDpQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLThUDy0QQ%244%BQPLSRUDy0/1A8tP9QPLT/UDy0/1A8tIg%149%UDy0h1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLToUDy0ZFA9tAQ%101%UDy0CVA8tIpQPLT1UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1A8tJ5QPLQY%10%BQPLQaUDy0qlA8tPpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTyUDy0Iw%132%BQPLQvUDy02FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy09VA8tGs%234%FA8tBxQPLT4UDy0/1A8tP9QPLT/UDy0+1A8tBk%149%UD20BFA8tFhQPLThUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNJQPLQ/%85%FE9tAJQPLRhUDy05lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTCUDy0Ow%10%UDy0ClA8tHZQPLT0UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tKVQPLQi%144%UDy0E1A8tLRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLSdUDy0Bg%223%FA8tIhQPLT/UDy0/1A8tP9QPLT/UDy0pQ%164%BQPLQMUDy0e1A8tPRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT9UDy0olA8tB8%69%UDy0OlA8tMRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04lA8tF9QPbQD%5%FI/tQFQPLRYUDy03FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTMUDy0Qg%159%FA8tARQPLSFUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0yVA8tCc%213%UDy0DlA8tOtQPLT/UDy0/1A8tP9QPLT9UDy0KQ%175%FA8tBhQPLSmUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPNQPLSDUDy0Cg%52%BQPLSDUDy0/VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPZQPLSKUDy0Dg%10%UDy0M1A8tLxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy061A8tGpRPbQC%176%UDy0VFA8tPdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOVQPLRI%208%UDy0dlA8tP9QPLT/UDy0/1A8tP9QPLSj%192%UDy0QlA8tMhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy05VA8tFhQPbQE%37%FA8tBtQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT8UDy0sFA8tCE%10%FA8tBNQPLSUUDy0+lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPdQPLSTUDy0D%192%FA8tChQPLTeUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT3UDy0cw%196%BQPLQNUDy061A8tP9QPLT/UDy0/1A8tP1QPLQr%197%FA8tAZQPLRdUDy06lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS8UDy0O%32%FA8tChQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMpQPLRG%10%BQPLQGUDy0bFA8tPJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0sFA8tCk%207%BQPLQPUDy0uFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lA8tKZQPLQJ%186%BQPLR4UDy0/1A8tP9QPLT/UDy0/1A8tKU%213%UDy0DlA8tIZQPLT4UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+VA8tJ5QPLQX%21%FE9tAJQPLS7UDy0/1A8tP9QPLTvUDy0alA8tAc%10%FA8tE9QPLTWUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN9QPLRL%224%UD20A1A8tIhQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTPUDy0I%176%FA8tAxQPLTqUDy0/1A8tP9QPLT/UDy0/1A8tDw%223%BQPLQoUDy0rlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTvUDy0eFA8tAg%15%BQPLQMUDy0VVA8tGVQPLQR%10%BQPLQgUDy0s1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTvUDy0dFA8tAU%239%BQPLRWUDy09VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy06VA8tEM%159%BRPbQCUDy0H1A8tIhQPLT/UDy0/1A8tP9QPLT/UDy0w%240%FA8tEpQPLTRUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNdQPLRMUT20AQ%26%UDy0DlA8tIpQPLT6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+FA8tJ5QPLQS%256%UDy0LVA8tOFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPpQPLRw%133%FA8tAZQPLQ6UDy0eFA8tKtQPLTnUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Qg%244%BQPLQHUDy0clA8tPBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0s1A8tC4%10%FA8tAVQPLRhUDy07VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTEUDy0Mg%271%FA8tA5QPLSxUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0o1A8tAY%101%UDy0FVA8tFFQPLSJUDy0yVA8tPZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT%262%FA8tBFQPLSaUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPZQPLSNUDy0RVA8tM5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy05VA8tFRRPbQC%282%BRPbQCUDy0f1A8tP1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNBQPLQZ%69%FA8tAVQPLQrUDy0YFA8tJ9QPLTdUDy0+lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLRB%272%UDy0L1A8tLhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPJQPLR+UDy0CQ%303%FA8tE5QPLTyUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTtUDy0Pw%42%UDy0C1A8tD9QPLR+UDy0u1A8tOhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UDy041A8tHxRPrQB%282%BQPLRUUDy05FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0pVA8tCU%319%BQPLQnUDy03FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1A8tG4%15%BQPLQiUDy0U1A8tJBQPLTCUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLTPUDy0lFA8tFVQPLQk%304%UDy0CFA8tHxQPLT0UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMxQPLQ/Uj+1AQ%330%UDy0C1A8tLRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSrUDy0oVA8tOBQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy06lA8tL5QPLSAUDy0QVA8tA4%335%BQPLQWUDy0pVA8tPxQPLT/UDy0/1A8tP9QPLToUDy0XlA8tAQ%346%FE+tQFQPLSCUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPtQPLTgUDy0oVA8tG5QPLQuUDy0Bg%367%FA8tDdQPLS1UDy0yVA8tJBQPLQQ%368%UDy0UlA8tO9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy091A8tMxQPLSMUDy0V1A8tBY%794%FA8tC1QPLTXUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLTqUDy0rVA8tHpQPLQ9UDy0C%821%BQPLQSUDy0tFA8tP9QPLT/UDy0/1A8tNFQPLSdUDy0X1A8tCxRPbQC%848%UT20A1A8tDpQPLRBUDy0Fg%31375%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%789%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%277%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%341%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%853%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%41162%BOO7cnUT21T1E8tW5QPLV8UDyzg087tHRRPLRiTzyzTUw5sxs%357%UECvEFE+tkJRO7RfUDyzb1E9tH5PPLSEUTy0e088tGpRPbVPUz6zJQAA/wE%415%BPPLREUTy1oVA8tOpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTgUDu0n1I7tjg%325%Tz22KlA8tY1QPbTbUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO9PPLSnUTu0UkBAvwQ%63%BQPbVTUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy01Q%282%UTy1SFA8tM9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTJUD2zQw%303%FM+syVQPLS8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOBRPLVrVVWqAw%52%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%272%EZGuQtQPLOiUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/k88s5RNM7MK%288%UDuzbE88tPdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0xU0+siE%47%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%267%Uj24GVA8tNBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTMVUS7Dw%276%BQPLRzUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tONNPLMe%42%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%261%BROrkWTzy011A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0yE47sQ0%266%FE9tU9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTWVSuqBg%36%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%256%EBAvwRQPLTCUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8s6U%261%YEC/CFA7tN9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTvUDy0yFA8tLhRPLS+UDy0z1A8tPZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Tzu0d%37%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%256%FA8s4NQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT5UDyzs088s2FQPLNATju3J049sS5QO7ZJUDyzg1A8tOBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QOrNG%256%Tzu1Z1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTy0q1I7tjg%26%IAAgAJROrM5UTy1nlA8tP1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08FVAqgw%31%BQPbM2UTy0mFE8tJhRPLSYUTy0mFE8tJhRPLSYUDy0j%251%UzmzKFA8tPpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tblNPLMe%37%FVVqgNQPLRzUDy0+VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTW%256%Tzy0t1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RPbNl%53%E87tD1QPLTwUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tV0%325%UDy0qlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0j%59%UT21T1A8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Uju2O%245%BmM8wFUDy0+FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKY%63%BOO7ROUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A7tKM%319%BQOrYjUDy0/VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9PPbSkAAD/AQ%63%FE9tItQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0lQ%244%BMObMbUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E8tUw%69%UD21ylA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E8tdE%31%BJSbYHTUCzFE1AsxRNQLMUTUCzFE1AsxRNQLMUVTm4Eg%244%BQPLODUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOpQQK8Q%69%Ek3tg5QPLTyUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Tzy01w%244%BSPbMyUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9szY%69%UTy0e1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO0%31%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%245%BQPLTZUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tGk%79%BQPLSZUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1UrqgY%239%BSO7Y4UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/087s1c%69%UTqzOU89tKRPPbSkTz20pE89tKRPPbSkTz20pFE8tZ4%31%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%FI6tR9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09k47sQ0%79%BRPLVMUDy08FA8tPBQPLTwUDy08FA8tPBQPLTwUDy08FM5syg%239%BRPLUmUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMKAAIAC%138%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%E88tVpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0qQ%372%BNM7MKUDy0+lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLWvUkC2H%133%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%FA8tYlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTuza%379%UDy0xVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+lA8ta9QPLVdVUC1G%117%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%FE8tK5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTqzOQ%378%Tzu1Z1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN1QPLSmTzu0dFE+tkJVObgS%90%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%FA8tMlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/TjuxDQ%378%VSuqBlA8tNxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04FE8tK5QO7N5Tz60OmYzzAU%63%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%FA8tNxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT7%389%FE6tCxQPLTyUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPNRPLWhUDyzQ%53%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%FA8tOVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTt%394%BRPrQpUDy01VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tcBOPrYx%42%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%FA8tOpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTj%400%VSuqBk88tGpQPLTjUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT5TzyzYQ%36%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%FA8tONQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTt%410%CAAIACUD2zQ088tJpQPLTeUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E8tFU%31%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%FA8tNlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT7%432%Uj24GVA9tVNQPbWGUDy0uFA8s+lQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPJROrkW%26%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%FA8tMNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/STe2Dg%452%BSQLYcTzyzTVE7tIVQPLS/UDy0+lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9PPLSE%26%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%E88tKdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Tz60Og%474%VUS7D1A8tGZQPLTaUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTc%26%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%FA8tX9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD20aQ%484%BVK6oGUTy0mFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Uj24GQ%20%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%FE9tU9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0rQ%84%BRPrZCUDy09FA8tPRQPLT0UDy09FA8tPRQPLT0UDy09FE7tFI%359%D/AU88tMRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTqzOQ%20%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%240%FU5uBJQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+FVEuw8%79%BPPbVxUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tDM%239%BRPbVPUT20WFE9tFhRPbRYUT20WFE9tFhRPbRYTzu0PQ%79%E88tVpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Uj20Sw%20%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%245%BPPLPHUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/089tXE%79%BQO7O9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1VEuw8%239%BQO7POUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0z%80%E4+tjFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTy1T%21%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%245%BQPbRtUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO5RNq4T%69%E47tydQPLT8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDyz2%245%BQPLSqUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+VU5uBI%74%FI9tjtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Uj22Ow%20%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%245%BRNq4TUDy09VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RPbSxVVWqAw%58%gACAAlA8tLtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD20gg%244%BQPLV/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/089tHo%74%FE8tHtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTq5Fg%20%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%251%UDy1jVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTy1nmYzzAU%47%BVVaoDUTy0mFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/TTuyKw%244%BOPbEuUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/088tPdSO7Y4%64%TTyzHlA8tO1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTa%26%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%251%UTauE1A8tOtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E8tdFPPrQ6%37%FA8tDNRO7TBUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QO7Os%256%UDy01VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT0UT2zZYAAgAI%47%BQPLNAUDy041A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9PPLSE%26%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%256%FA8tVlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy02k88s5FPO7R0UD21YFE8tW5QPbSPUDy0zVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPVNPLMe%256%UD20XFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN1QPbWGUTy1TE45sSRVPbYVUECvEFJAthxRPLM8UDyzb1A8tMJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/088tPdMObMb%26%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%261%BQPLSWUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/087tWc%266%FE8tL5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E8tHs%31%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%261%BAQL8EUDy0rVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy1f%272%FI6tR9QPLThUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Tzy0tFVVqgM%31%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%267%ZjPMBVA8tJxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPxPPbR6%282%BTPLQiUDy04VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RPbSxVTmqCQ%36%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%277%BPPLNhUDy071A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy03lE6szk%293%VT22FU89tKRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08FE7s2gAAP8B%42%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%283%UTq5FlA8tY1QPLTzUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNpRPLVrTTOzCg%308%BQPbNDUD20tVA8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOpQPLWNVUC1G%53%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD207%293%BGRrkLUTuzW1A8s6JQPLTcUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy09VE7tMFPPLSEUD2zQ4AAgAI%330%E47sRpQPbRtUDu0o1A8tNZQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08VA8tcBQPLWNTju0TmYzzAU%421%ZjPMBVBAtyBROrQsTj2xLk08sx5GRrkL%378%BVVaoDVTm4Ek0+siFRPLMvUT60KU47sRpGRrkL%40704%UDy0w1A8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tOhRPbNl%74%BQPLS4UDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06%293%BQPLTDUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tOhQPLToTzy051A8tN1QPLTLUDy0uFA9tYZSPbRLVUCqD%315%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPbTsSzy0EQ%68%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy071E8tIhVPbYV%304%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDu0kg%68%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9PPLTnUDyzQ%299%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+007sis%63%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/FE8tUw%293%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tLw%63%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPFTObMo%288%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RO7RS%58%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLWy%288%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QO7TfYEC/C%53%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1E8tJhRPLSYUTy0mFE8tJhRPLSYUTy0mFE8tJhQPLScUTy0rlA8tNpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTyzLw%282%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy1f%53%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%53%BPPrUtUTy0vlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD20gg%282%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09VJAthw%47%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%59%QEC/BFE8tL5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0wg%282%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKY%47%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%64%E49sS5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08g%282%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RPLM8%42%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%69%BQO7TfUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1UrqgY%277%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5QPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QO7POgACAAg%36%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%69%BQPLS7UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1VAtRg%277%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPRQO7SjUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Zg%36%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%69%BRPbSxUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E2rhM%277%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPROO7EaUDy081A8tP9QPLT/UDy0/1A8tP9QPLT/UDy061BArx%32%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%69%BQPLTFUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/oAAgAI%277%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%5%UDuzeVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tZ%32%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%64%ElJtgdQPLT1UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy06w%282%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%5%SUm2B1A8tN1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPtPPbYq%26%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%64%FE7s2hQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD20tQ%282%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%10%FE9tU9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS6%26%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%59%UTyzPFA8tPRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTy1e%283%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%15%BQPLS6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UT21Tw%20%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09EBAvwRAQL8EQEC/BEBAvwRAQL8EQEC/BEBAvwRgQL8IUj24GVE8tUhQO7SfUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT9UDq2Iw%282%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%15%BPPbYqUDy0+1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy03UlJtgc%15%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSt%288%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%21%UDy1kFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/089tHo%15%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPZPPbYq%288%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%21%UECvEFA8tOtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPRMObMb%10%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tGY%293%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%26%FA8tGZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9PPbSk%10%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy1fw%298%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%26%IAAgAJQO7POUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Tz60Og%4%BQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO5PPLNe%304%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%31%BPO7Q9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0zIAAgAJQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTgUTy0iEs8tBE%309%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%37%Tzy0p1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/089tWRQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+VA8tXxQPLV8UDy1fFA8tXxQPLV8UDy1fFA8tXxQPLV8UDy1fFE8tHtPPLRqTz2zVE07sis%325%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%37%Tz6wHVA8tPVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOpQPLTaUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%395%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%42%FA7tH1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%395%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%42%GBAvwhQO7TfUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%395%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%47%BQPbVTUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%395%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%53%UTy0vlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%395%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%53%Tz61LVA8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%395%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%58%E88s5RQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%395%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%58%FU5uBJQPLTtUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%395%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%63%BPPLRqUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%395%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%63%BVVaoDUDy00lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%395%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%69%UDyzQFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%395%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FE8tKtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%395%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FI6tR9QPLT2UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%292%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%39872%EBAvwRQOrUwUTy0VVE8s3JRPbR+Tzy0hFA7s3lRO7NoUDqzRkw5sxs%389%UECvEFE+tkJRO7RfUDyzb1E9tH5PPLSEUTy0e088tGpRPbVPUz6zJQAA/wE%378%FU5qglPPLVaUDyzs1A8tPNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTeTzyzkVI6sjU%357%Tz22KlA8tY1QPbTbUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO9PPLSnUTu0UkBAvwQ%351%BmM8wFUTyzclA8tOhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RO7TBTzu0PQ%335%FM+syVQPLS8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOBRPLVrVVWqAw%335%FI9szJQPLTTUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/lE7s5tNM7MK%320%UDuzbE88tPdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0xU0+siE%325%UDy1WVA8tPZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RPLXRUjq1Hw%308%BQPLRzUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tONNPLMe%314%BPPLNhUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04E0+siE%298%FE9tU9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTWVSuqBg%303%FE8tUxQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tNtLPLQR%288%YEC/CFA7tN9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTvUDy0yFA8tLhRPLS+UDy0z1A8tPZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Tzu0d%299%UDq2I1A8tPFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLThUDy0jFE9tU9QPbM2Tju3J1E9sj9QPLVdUDy0qVA8tPRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS4%288%Tzu1Z1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTy0q1I7tjg%26%IAAgAJROrM5UTy1nlA8tP1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08FVAqgw%290%P8BUTu0wVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy07k89tWQAAP8B%37%FVEuw9PPLSaUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Tzu1Zw%282%Tzy0t1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RPbNl%53%E87tD1QPLTwUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tV0%287%BQPbRcUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTaTDmzGw%58%TzyzUVA8tPtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy07lBArx%272%BmM8wFUDy0+FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tKY%63%BOO7ROUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A7tKM%282%FVVqgNQPLTdUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOBSQLYc%69%FE8tFVQPLT+UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8s4M%271%BMObMbUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E8tUw%69%UD21ylA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E8tdE%282%FE9tU9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/047tEE%79%BPPLSaUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOpVK6oG%266%BSPbMyUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9szY%69%UTy0e1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO0%282%FE9tLFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTy1ng%84%BQQK8QUDy06lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPbVT%266%BSO7Y4UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/087s1c%69%UTqzOU89tKRPPbSkTz20pE89tKRPPbSkTz20pFE8tZ4%277%VTmqCVA8tPZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Tz22Kg%90%Tzyzh1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RPLWh%266%BRPLUmUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMKAAIAC%384%UTu1RVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9PPLTE%96%TjmxJFA8tP5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTm%266%BNM7MKUDy0+lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLWvUkC2H%379%Tz20elA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QO7N5%101%FA8tNVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/TjuxGg%266%UDy0xVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+lA8ta9QPLVdVUC1G%363%UDyzpVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPbND%101%FA8s6JQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Tz20Rw%266%Tzu1Z1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN1QPLSmTzu0dFE+tkJVObgS%336%Tzy0xFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9LPLQR%101%FA8s29QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UT2zZQ%266%VSuqBlA8tNxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04FE8tK5QO7N5Tz60OmYzzAU%309%UDy02lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPw%106%FA8tVlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UT20fg%271%FE6tCxQPLTyUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPNRPLWhUDyzQ%299%UTy05FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO0%106%FA7tklQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy1iQ%276%BRPrQpUDy01VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tcBOPrYx%288%UDyz6VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E8tOQ%106%FE8szxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/TzyzkQ%282%VSuqBk88tGpQPLTjUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT5TzyzYQ%282%UDy14lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPI%106%FE8tUhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UT20iw%292%CAAIACUD2zQ088tJpQPLTeUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E8tFU%277%UDy01lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP5VVaoD%101%FA8tVlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDyzg%315%Uj24GVA9tVNQPbWGUDy0uFA8s+lQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPJROrkW%272%UDy0u1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9NPLMe%101%FA8tHNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0Zg%340%BSQLYcTzyzTVE7tIVQPLS/UDy0+lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9PPLSE%272%Tzy0mlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9PPbNU%101%FA8tKlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDqzRg%362%VUS7D1A8tGZQPLTaUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTc%272%Tzy0alA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSM%101%FA8tOFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTq5Fg%372%BVK6oGUTy0mFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Uj24GQ%266%Uj2zMlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLXigACAAg%90%Tz60OlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTe%386%D/AU88tMRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTqzOQ%268%D/AVA8tOZQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/TzuzSg%90%UDu0o1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9PPLOU%266%BRPbVPUT20WFE9tFhRPbRYUT20WFE9tFhRPbRYTzu0PQ%79%E88tVpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Uj20Sw%271%E88s5RQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0zFVVqgM%79%BOPbEuUDy0+lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLN%267%BQO7POUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0z%80%E4+tjFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTy1T%272%FE8sy9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/087tHQ%74%FVVqgNQPLTMUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8s9g%271%BQPLSqUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+VU5uBI%74%FI9tjtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Uj22Ow%276%BQPbW5UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPpPPLNN%64%gACAAlA7tKNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/088s2E%271%BQPLV/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/089tHo%74%FE8tHtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTq5Fg%276%BOO7U0UDy0/VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT5UTuzWw%52%BOO7ENUDyzpVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTy01FVVqgM%271%BOPbEuUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/088tPdSO7Y4%64%TTyzHlA8tO1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTa%288%UDu0klA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tLVSOrI1%32%VTmqCVE7s1tQPLTjUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT9Uju2O%283%UDy01VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT0UT2zZYAAgAI%47%BQPLNAUDy041A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9PPLSE%288%TTOzClA8tNJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy03VA8s6JRPLSIUTy0e088s5FRPbSxUDy09FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLO%289%UD20XFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tN1QPbWGUTy1TE45sSRVPbYVUECvEFJAthxRPLM8UDyzb1A8tMJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/088tPdMObMb%293%E0+siFQPLPpUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tK0AAP8B%293%FE8tL5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E8tHs%303%BNO7IrUDyz6VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Tzy0tFUrqgY%298%FI6tR9QPLThUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Tzy0tFVVqgM%309%TT6yIVE8tdFQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9PPbWXZjPMBQ%308%BTPLQiUDy04VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RPbSxVTmqCQ%319%FU5qglRPbSLUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Tzy051A9tVM%325%VT22FU89tKRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08FE7s2gAAP8B%336%Tju3J1A9tKBQPLT4UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOZRPLV4TjuxDQ%340%BQPbNDUD20tVA8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOpQPLWNVUC1G%357%BQQK8QTzyzYU89tKRQPLTcUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy09VA8tMxQPLWQUDqzRlVVqgM%362%E47sRpQPbRtUDu0o1A8tNZQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08VA8tcBQPLWNTju0TmYzzAU%389%ZjPMBVI6tR9NO7IrTj62MU47tydON7EX%410%BVVaoDVTm4Ek0+siFRPLMvUT60KU47sRpGRrkL%39354%BOO7cnUT21T1E8tW5QPLV8UDyzg087tHRRPLRiTzyzTUw5sxs%831%BPPLREUTy1oVA8tOpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTgUDu0n1I7tjg%69%TzyzkVA8tOhQPLToUDy06FA8tOhQPLToUDy06FE8tJg%255%BQPLTDUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06FA9tLU%293%UTy1SFA8tM9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTJUD2zQw%58%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMg%282%EZGuQtQPLOiUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/k88s5RNM7MK%48%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMg%277%Uj24GVA8tNBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTMVUS7Dw%42%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMg%271%BROrkWTzy011A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0yE47sQ0%37%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMg%266%EBAvwRQPLTCUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8s6U%37%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMg%266%FA8s4NQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT5UDyzs088s2FQPLNATju3J049sS5QO7ZJUDyzg1A8tOBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QOrNG%32%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1E8tJhRPLSYUTy0mFE8tJhRPLSYUTy0mFE8tJhRPLSYUTy0mFE8tJhRPLSYUTy0mFE8tJhRPLSYUTy0mFE8tJhRPLSYUTy0mFA9s3Y%261%UzmzKFA8tPpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tblNPLMe%37%FVVqgNQPLRzUDy0+VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTW%32%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%363%UDy0qlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0j%59%UT21T1A8tPxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Uju2O%27%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%357%BQOrYjUDy0/VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9PPbSkAAD/AQ%63%FE9tItQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0lQ%26%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%357%BQPLODUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOpQQK8Q%69%Ek3tg5QPLTyUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Tzy01w%26%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%357%BQPLTZUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tGk%79%BQPLSZUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1UrqgY%21%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%352%FI6tR9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09k47sQ0%79%BRPLVMUDy08FA8tPBQPLTwUDy08FA8tPBQPLTwUDy08FM5syg%21%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%352%E88tVpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0qQ%154%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%352%FA8tYlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTuza%155%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%352%FE8tK5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTqzOQ%154%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/VE8tNRRPLTUUTy01FE8tNRRPLTUUTy01FE8tNRRPLTUUTy01FE8tNRRPLTUUTy01FE8tNRRPLTUUTy01FE8tNRQPLRz%261%FA8tMlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/TjuxDQ%154%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSM%261%FA8tNxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT7%160%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSM%261%FA8tOVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTt%160%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSM%261%FA8tOpQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTj%160%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSM%261%FA8tONQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTt%160%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSM%261%FA8tNlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT7%160%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/FA7s6xQO7OsUDuzrFA7s6xQO7OsUDuzrFA7s6xQO7OsUDuzrFA7s6xQO7OsUDuzrFA7s6xQO7OsUDuzrFA7s6xPPLNe%261%FA8tMNQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/STe2Dg%154%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%352%E88tKdQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/Tz60Og%154%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%352%FA8tX9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD20aQ%154%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%352%FE9tU9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0rQ%84%BRPrZCUDy09FA8tPRQPLT0UDy09FA8tPRQPLT0UDy09FE7tFI%21%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%352%FU5uBJQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+FVEuw8%79%BPPbVxUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tDM%21%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%357%BPPLPHUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/089tXE%79%BQO7O9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1VEuw8%21%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%357%BQPbRtUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO5RNq4T%69%E47tydQPLT8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDyz2%27%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%357%BRNq4TUDy09VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RPbSxVVWqAw%58%gACAAlA8tLtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD20gg%26%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%363%UDy1jVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTy1nmYzzAU%47%BVVaoDUTy0mFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/TTuyKw%26%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%363%UTauE1A8tOtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E8tdFPPrQ6%37%FA8tDNRO7TBUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QO7Os%32%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%368%FA8tVlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy02k88s5FPO7R0UD21YFE8tW5QPbSPUDy0zVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPVNPLMe%32%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%373%BQPLSWUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/087tWc%37%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%373%BAQL8EUDy0rVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy1f%43%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%379%ZjPMBVA8tJxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPxPPbR6%48%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%389%BPPLNhUDy071A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy03lE6szk%53%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%395%UTq5FlA8tY1QPLTzUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNpRPLVrTTOzCg%58%UD20oFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tag%255%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%405%BGRrkLUTuzW1A8s6JQPLTcUDy0/FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy09VE7tMFPPLSEUD2zQ4AAgAI%837%ZjPMBVBAtyBROrQsTj2xLk08sx5GRrkL%40650%BQPLTDUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tONQPLPYUDy0v1E7s5tRPLRiVUC1G%443%UDy0w1A8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tN0%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/U88tLRROrM5%432%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT+UTy0mFUrqgY%421%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tLVVVaoD%416%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RPLR7%416%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT5UTy1Jg%410%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+1E8tJhRPLSYUTy0mFE8tJhRPLSYUTy0mFE8tJhRPLSYTzy0mlA9tahQPLTNUDy0/VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTy1ng%410%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%59%UkC2HFA8tKlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09mBAvwg%405%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%67%/wFQPbS1UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/047tEE%405%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%69%BOO7RBUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/088s2E%31%BVQKoMTUCzFE1AsxRNQLMUTUCzFE1AsxRNQLMUTjuxDQ%20%BAQL8EUD2zQ1A9s3ZPPLOHUTq0L%283%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%69%BVPbYVUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E7s2g%31%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%16%E88s2FRPLTkUDy0/1A8tP9QPLT/UT20W%283%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%69%BOO7EaUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/047tE4%31%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%5%BVK6oGUDyzpVA8tP9QPLT/UDy0/1A8tP9QPLT/UT20W%283%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%69%BRO7RSUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/FE6uRY%31%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%5%BRPLWhUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UT20W%283%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%64%FVAqgxRPLXRUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDuzr%37%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21qFE9tFhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UT20W%283%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%53%BGRrkLUD21U1A8tNVQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTxUzy0Ig%36%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0rVA8teJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UT20W%283%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/VE8tNRRPLTUUTy01FE8tNRRPLTUUTy01FE8tNRRPLTUUDy01VA8tONQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/088tPdQOrNG%42%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UT20W%283%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDyz6VE8szw%47%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPxRPLXRUDy0ulA9tLVQPLTJUTy1T%283%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS4VUC1G%53%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTyUDu0cEk3tg4%309%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RPLTkTzyzTQ%52%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPFNO7Ir%320%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tIyAAIAC%42%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/088tGo%325%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLOlVVWqAw%36%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+U0zswo%325%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/FA7s6xQO7OsUDuzrFA7s6xQO7OsUDuzrFA7s6xQO7OsUDuzrFA7tLBRO7TBUD207FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UT20iw%36%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0yQ%330%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%61%D/AVA9s0NQPLTSUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/087tD0%31%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UT20sQ%330%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%69%BJN7YOUDy01lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tMI%31%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%75%Tz2zVFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9TPLQi%26%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%75%UECvEFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9PPLNe%26%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%80%FA8tPlQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLV8%26%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%75%YEC/CFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RPbR+%26%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%75%Tju0QVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPbRp%26%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%69%CAAIACUDuzvVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9ROrM5%26%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy09%64%FI9uBlRPLSuUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPBAQL8E%26%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+lA8s4BQPLOAUDyzgFA8s4BQPLOAUDyzgFA8s4BQPLOAUDyzgFA8s4NQPbSTUDy1wFA8tPtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E9tIs%31%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08k47sRo%31%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDu0Yw%36%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLSd%42%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0+087tIGAAIAC%42%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPpQPLSmTz22Kg%52%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%287%BQPLPYUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP1QPLT1UDy041A8tMVPPbWXUD20XEs8tBE%63%BQPbSgUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UD21q%331%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%41055%BLPLQRUD21U1A8s4BQPLSdUDy0qlA8s6VPPLORUTy0e1E7tUVNM7MK%448%UDy0w1A8tOhQPLToUDy06FA8tOhQPLToUDy06FA8tN0%74%Ek3tg5QPLToUDy06FA8tOhQPLToUDy06FA8tOhQPLToUD20tQ%218%Tj61PlA7tLBQPLT8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT6UDu0sFI7tjg%437%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FBArxBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%208%FE6uRZQPbWoUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QO7SwVTm4Eg%426%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FBArxBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%203%Uzy0IlA8tN1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04VI9szI%421%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FBArxBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%197%BRNq4TUDy04VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOpQOrYj%416%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FBArxBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%197%BQO7SfUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTZYEC/C%411%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FBArxBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%192%FE8tSZQPLT9UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP1QPLS7UTu0hVE9tH5PPLSnUDy08lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTy1e%411%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FBArxBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%192%FE7tI5QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy03FA8tDM%21%VT22FVA8tbJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy08UZGuQs%405%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FBArxBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%192%FA7tN9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLToUkC2H%32%FVVqgNQPLS6UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E9tU8%405%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FBArxBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%187%UkC2HFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9PO7NX%42%BNPLMeUDy0+lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tJk%405%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FBArxBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%187%UT20WFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8teKAAIAC%48%Tzy0tFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E8tL4%405%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FBArxBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%187%Tz20elA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E8tZ4%53%UDyzgFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNU%405%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FBArxBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%187%UTu0jlA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E8tXg%53%UDy0c1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tOM%405%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FBArxBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%187%UDu0n1A8tPxQPLT8UDy0/FA8tPxQPLT8UDy0/E87tWc%53%UD20k1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tNY%405%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%FBArxBQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%277%CAAIACUDy02VA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tLU%405%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPxQPLS4UDy0uFA8tLhQPLS4UDy0uFA8tLhQPLS4UDy0uFA8tLhQPLS4UDy0uFA8tLhQPLS4UDy0uFA8tLxQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%277%BPPLNeUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8s4%406%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%272%E8+tS1QPLTzUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E6tCw%405%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%267%Tju1NFA8tOtQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDu0s%411%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%261%BRPLVMUDy09FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLPpUj24GQ%410%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%256%FA9tG1QPLT8UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tO9QOrUw%416%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%251%Tzy0d1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy04VE6tCw%421%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP1QPLTIUDy0yFA8tMhQPLTIUDy0yFA8tMhQPLTIUDy0yFA8tMhQPLTIUDy0yFA8tMhQPLTIUDy0yFA8tMhQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%245%BRPbVPUDy0/lA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLS7TjexFw%426%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%240%FU5qglQPLThUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/FA7tH2AAIAC%432%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%240%FA9tG1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLTvUD2zQw%442%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%240%FA8tMJQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPZQPLQz%448%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%235%Rka5C1A8tP1QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tZ%454%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%235%Uz6zJVA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A9tVM%453%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%235%UTyzPFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E6szk%453%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%235%Uz6zJVA8tIxQPLSMUDy0jFA8tIxQPLSMUDy0jEw5sxs%453%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%731%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%731%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%235%UD2zdlE8tJhRPLSYUTy0mFE8tJhRPLSYUTy0mFE8tJiAAIAC%69%E87tD1RPLSYUTy0mFE8tJhRPLSYUTy0mFE8tJhRPLSYTzu0PQ%20%BPO7Q9UTy0mFE8tJhRPLSYUTy0mFE8tJhRPLSYUTy0mE87tD0%21%Tzu0PVE8tJhRPLSYUTy0mFE8tJhRPLSYUTy0mFE8tJhPO7Q9%192%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%235%UDy0yFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9AQL8E%69%FE7s2hQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTuza%21%BRO7NoUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E7s2g%21%UTuzaFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RO7No%192%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%235%UDy0yFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9AQL8E%69%FE7s2hQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTuza%21%BRO7NoUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E7s2g%21%UTuzaFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RO7No%192%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%235%UDy0yFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9AQL8E%69%FE7s2hQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTuza%21%BRO7NoUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E7s2g%21%UTuzaFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RO7No%192%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%235%UDy0yFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9AQL8E%69%FE7s2hQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTuza%21%BRO7NoUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E7s2g%21%UTuzaFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RO7No%192%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%235%UDy0yFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9AQL8E%69%FE7s2hQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTuza%21%BRO7NoUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E7s2g%21%UTuzaFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RO7No%192%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%235%UDy0yFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9AQL8E%69%FE7s2hQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTuza%21%BRO7NoUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E7s2g%21%UTuzaFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RO7No%192%UDyz2FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tPQ%74%EBAvwRQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0y%235%UDy0yFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9AQL8E%69%FE7s2hQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UTuza%21%BRO7NoUDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1E7s2g%21%UTuzaFA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9RO7No%20656%";
      return new cargjagi.JSImage(this.createImageFromBase64_0(168, 1428, data_0));
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(name_0, "esrButtons.png")) {
      return new cargjagi.JSImage(this.createImageFromBase64_0(84, 252, "%2549%P8AAO7/AAD/%432%/wAA3P8AAP//AAD//wAA/w%420%D/AACt/wAA//8AAP//AAD//wAA//8AAP8%163%D/%250%D/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/%158%D/%4%/w%239%P8AAPz/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/w%152%D/%4%/wAAAP8%229%/wAA6/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP8%147%D/%4%/wAAAP8AAAD/%218%D/AAC9/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/%142%D/%4%/wAAAP8AAAD/%4%/w%207%P8AAI//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/w%136%D/%4%/wAAAP8AAAD/%4%/wAAAP8%202%P8AAPz/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP8%131%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%192%/wAA7P8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/%126%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%180%D/AADN/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/w%120%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8%170%P8AAJ7/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP8%115%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%165%P8AAP7/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/%110%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%154%/wAA7v8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/w%104%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8%143%D/AADc/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP8%99%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%133%P8AAK3/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/%94%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%127%P8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/w%88%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%128%/wAA/P8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP8%83%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8%127%D/AADr/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/%78%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%127%P8AAL3/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA/w%72%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%133%P8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA6w%72%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8%133%/wAA/P8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP7/AACt%78%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%132%D/AADs/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA3%89%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%133%P8AAM3/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAPw%99%D/%4%/wAAAP8AAAD/%4%/wAAAP8%138%P8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA3%105%D/%4%/wAAAP8AAAD/%4%/w%138%/wAA/v8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAPs%115%D/%4%/wAAAP8AAAD/%138%D/AADu/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAzQ%120%D/%4%/wAAAP8%138%P8AANz/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAPs%131%D/%4%/w%138%/wAArf8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAvg%136%D/%144%/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAO4%287%D/AAD8/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAAvQ%287%P8AAOv/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAOs%293%/wAAvf8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD+%304%/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAOs%303%D/AAD8/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD8%309%P8AAOz/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AANw%309%/wAAzf8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD7%320%/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAM0%319%D/AAD+/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD7%325%P8AAO7/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAL4%325%/wAA3P8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AADu%336%/wAA//8AAP//AAD//wAA//8AAP//AAD/UDy0/1A8tP9QPLT/UDy0/1A8tP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAL0%335%D/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/UDy0/1A8tP9QPLT/UDy0/1A8tP//AAD//wAA//8AAP//AAD//wAA//8AAP//AADr%341%P8AAPz/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/UDy0/1A8tP9QPLT/UDy0/1A8tP//AAD//wAA//8AAP//AAD//wAA/g%346%/wAA6/8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/UDy0/1A8tP9QPLT/UDy0/1A8tP//AAD//wAA//8AAP//AADr%352%/wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/UDy0/1A8tP9QPLT/UDy0/1A8tP//AAD//wAA/%357%D/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/UDy0/1A8tP9QPLT/UDy0/1A8tP//AADc%357%P8AAPz/AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/UDy0/1A8tP9QPLT/UDy0/1A8tP8%325%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/UDy0/1A8tP9QPLT/UDy0/1A8tP8%15%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%79%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%144%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD/UDy0/1A8tP9QPLT/UDy0/1A8tP8%10%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%58%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%122%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP//AAD//wAA//8AAP//AAD//wAA//8AAP//AADNUDy0/1A8tP9QPLT/UDy0/1A8tP8%5%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%47%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%111%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP//AAD//wAA//8AAP//AAD//wAA7g%10%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%37%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%106%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT//wAA//8AAP8%21%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%5%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%96%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%5%P8AABH/AAD//wAA//8AAP//AAD/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT//wAA7%27%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%21%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%26%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%96%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%5%P8AABH/AAD//wAA//8AAP//AAD//wAA/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%31%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%26%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%37%FA8tP9QPLT/UDy0/1A8tP9QPLT/%96%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%10%D/AAAD/wAA//8AAP//AAD//wAA/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%42%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%21%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%208%/wAAA/8AAP//AAD/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%42%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%21%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%181%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP8%47%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%21%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%144%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP8%53%UDy0/1A8tP9QPLT/UDy0/1A8tP8%26%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%116%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP8%53%UDy0/1A8tP9QPLT/UDy0/1A8tP8%31%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%106%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%15%FA8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP8%53%UDy0/1A8tP9QPLT/UDy0/1A8tP8%42%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%96%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%31%FA8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP8%47%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%63%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%90%UDy0/1A8tP9QPLT/UDy0/1A8tP8%42%FA8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%42%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%79%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%90%UDy0/1A8tP9QPLT/UDy0/1A8tP8%37%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%42%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%90%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%90%UDy0/1A8tP9QPLT/UDy0/1A8tP8%37%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%31%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%20%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%42%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%90%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%26%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%21%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%20%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%37%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%90%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%96%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%101%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%5%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%26%UDy0/1A8tP9QPLT/UDy0/1A8tP8%5%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%42%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%111%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%10%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%26%UDy0/1A8tP9QPLT/UDy0/1A8tP8%10%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%52%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%127%FA8tP9QPLT/UDy0/1A8tP9QPLT/%122%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%79%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%6208%D/AP8A/wD/%433%P8A/wD/AP8A/wD/AP8A/w%422%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%163%D/%252%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%158%D/%4%/w%240%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%152%D/%4%/wAAAP8%230%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%147%D/%4%/wAAAP8AAAD/%220%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%142%D/%4%/wAAAP8AAAD/%4%/w%208%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%136%D/%4%/wAAAP8AAAD/%4%/wAAAP8%203%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%131%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%193%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%126%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%182%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%120%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8%171%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%115%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%166%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%110%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%155%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%104%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8%145%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%99%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%134%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%94%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%128%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%88%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%129%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%83%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8%129%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%78%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%128%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%72%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%134%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%72%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8%134%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%78%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%134%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%88%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%134%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%99%D/%4%/wAAAP8AAAD/%4%/wAAAP8%139%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%104%D/%4%/wAAAP8AAAD/%4%/w%139%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%115%D/%4%/wAAAP8AAAD/%140%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%120%D/%4%/wAAAP8%139%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%131%D/%4%/w%139%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%136%D/%145%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%289%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%288%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%294%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%305%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%305%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%310%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%310%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%321%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%321%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%326%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%326%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%337%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%63%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%241%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%64%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%224%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%68%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%214%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%69%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%214%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%79%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%4%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%204%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%80%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%21%FA8tP9QPLT/UDy0/1A8tP9QPLT/%198%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%90%UDy0/1A8tP9QPLT/UDy0/1A8tP8%26%FA8tP9QPLT/UDy0/1A8tP9QPLT/%193%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%96%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%21%FA8tP9QPLT/UDy0/1A8tP9QPLT/%188%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%106%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%21%FA8tP9QPLT/UDy0/1A8tP9QPLT/%188%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/%117%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%10%UDy0/1A8tP9QPLT/UDy0/1A8tP8%187%D/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%127%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%187%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%143%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%182%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%154%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%193%/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8%159%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%203%P8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/w%159%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%26%FA8tP9QPLT/UDy0/1A8tP9QPLT/%150%D/AP8A/wD/AP8A/wD/AP8%165%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%21%FA8tP9QPLT/UDy0/1A8tP9QPLT/%156%/wD/AP8A/w%164%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%15%FA8tP9QPLT/UDy0/1A8tP8%330%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%15%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%5%UDy0/1A8tP9QPLT/UDy0/1A8tP8%330%FA8tP9QPLT/UDy0/1A8tP9QPLT/%26%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%5%UDy0/1A8tP9QPLT/UDy0/1A8tP8%325%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%32%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%325%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%37%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%330%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%37%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%330%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%42%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%336%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%36%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%341%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%21%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%335%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%335%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%336%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%5%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%335%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%21%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%351%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%6242%//8AAP//%434%D//wAA//8AAP//AAD//w%423%P//AAD//wAA//8AAP//AAD//wAA//8%163%D/%253%P//AAD//wAA//8AAP//AAD//wAA//8AAP//%158%D/%4%/w%242%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%152%D/%4%/wAAAP8%231%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%147%D/%4%/wAAAP8AAAD/%221%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%142%D/%4%/wAAAP8AAAD/%4%/w%210%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%136%D/%4%/wAAAP8AAAD/%4%/wAAAP8%205%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%131%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%194%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%126%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%183%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%120%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8%173%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%115%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%168%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%110%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%156%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%104%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8%146%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%99%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%136%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%94%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%130%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%88%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%130%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%83%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8%130%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%78%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%130%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%72%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%136%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%72%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/wAAAP8%135%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%78%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%4%/w%135%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%88%D/%4%/wAAAP8AAAD/%4%/wAAAP8AAAD/%136%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%99%D/%4%/wAAAP8AAAD/%4%/wAAAP8%141%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%104%D/%4%/wAAAP8AAAD/%4%/w%140%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%115%D/%4%/wAAAP8AAAD/%141%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%120%D/%4%/wAAAP8%141%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%131%D/%4%/w%140%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%136%D/%146%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%290%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%290%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%295%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%306%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%306%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%312%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%311%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%322%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%322%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%328%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%327%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%338%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%338%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%344%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%348%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%354%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%359%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%360%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%364%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%48%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%63%FA8tP9QPLT/UDy0/1A8tP9QPLT/%21%FA8tP9QPLT/UDy0/w%151%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%42%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%53%FA8tP9QPLT/UDy0/1A8tP9QPLT/%10%BQPLT/UDy0/1A8tP9QPLT/UDy0/w%151%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//%42%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%47%FA8tP9QPLT/UDy0/1A8tP9QPLT/%5%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%146%//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%47%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%42%FA8tP9QPLT/UDy0/1A8tP9QPLT/%5%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%140%D//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%53%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%37%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%135%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//w%58%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%26%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%31%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%135%P//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8%63%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%37%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%31%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%167%D//wAA//8AAP//AAD//wAA//8AAP//AAD//w%68%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%47%BQPLT/UDy0/1A8tP9QPLT/UDy0/w%31%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%178%//8AAP//AAD//wAA//8%79%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%47%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%26%FA8tP9QPLT/UDy0/1A8tP9QPLT/%189%P//AAD//w%84%BQPLT/UDy0/1A8tP9QPLT/UDy0/w%52%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%26%FA8tP9QPLT/UDy0/1A8tP9QPLT/%282%BQPLT/UDy0/1A8tP9QPLT/UDy0/w%52%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%26%FA8tP9QPLT/UDy0/1A8tP9QPLT/%282%BQPLT/UDy0/1A8tP9QPLT/UDy0/w%52%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%26%FA8tP9QPLT/UDy0/1A8tP9QPLT/%282%BQPLT/UDy0/1A8tP9QPLT/UDy0/w%52%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%26%FA8tP9QPLT/UDy0/1A8tP9QPLT/%282%BQPLT/UDy0/1A8tP9QPLT/UDy0/w%52%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%26%FA8tP9QPLT/UDy0/1A8tP9QPLT/%282%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%47%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%26%FA8tP9QPLT/UDy0/1A8tP9QPLT/%282%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%47%BQPLT/UDy0/1A8tP9QPLT/UDy0/w%31%FA8tP9QPLT/UDy0/1A8tP9QPLT/%282%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%37%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%31%FA8tP9QPLT/UDy0/1A8tP9QPLT/%288%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%26%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%31%FA8tP9QPLT/UDy0/1A8tP9QPLT/%288%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%37%FA8tP9QPLT/UDy0/1A8tP9QPLT/%293%FA8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP8%42%FA8tP9QPLT/UDy0/1A8tP9QPLT/%298%BQPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%47%FA8tP9QPLT/UDy0/1A8tP9QPLT/%304%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/%53%FA8tP9QPLT/UDy0/1A8tP9QPLT/%320%UDy0/1A8tP9QPLT/UDy0/1A8tP9QPLT/UDy0/w%3754%"));
    } else {
      return null;
    }
  };
  _.createImageFromBase64_0 = function createImageFromBase64(width_0, height, base64) {
    var jsObject = this.getJsObject_1();
    return jsObject.createImageFromBase64(width_0, height, base64);
  };
  _.createNativeDialog = function createNativeDialog(title_0) {
    var jsObject = this.getJsObject_1();
    return jsObject.createDialog(title_0);
  };
  _.createPopupMenu = function createPopupMenu(consumer) {
    return null;
  };
  _.createPopupMenu_0 = function(consumer) {
    return this.createPopupMenu(consumer);
  };
  _.getJsObject_1 = function getJsObject_1() {
    return this.mJsObject;
  };
  _.grabFocus = function grabFocus() {
    var jsObject = this.getJsObject_1();
    return jsObject.grabFocus();
  };
  _.grabFocus_0 = function() {
    this.grabFocus();
  };
  _.openChemistryFile = function openChemistryFile(isReaction) {
    return null;
  };
  _.openChemistryFile_0 = function(isReaction) {
    return this.openChemistryFile(isReaction);
  };
  _.registerToJs = function registerToJs() {
    var jsObject = this.getJsObject_1();
    jsObject.register(this);
  };
  _.runLater = function runLater(r) {
    var that = this;
    var jsObject = this.getJsObject_1();
    jsObject.runLater(
      function() {
        that.runNow(r);
      }
    );
  };
  _.runLater_0 = function(r) {
    this.runLater(r);
  };
  _.runNow = function runNow(r) {
    r.run();
  };
  _.setCursor = function setCursor(cursor) {
    var jsObject = this.getJsObject_1();
    return jsObject.setCursor(cursor);
  };
  _.setCursor_0 = function(cursor) {
    this.setCursor(cursor);
  };
  _.setEditorArea = function setEditorArea(editorArea) {
    this.mEditorArea = editorArea;
  };
  _.showHelpDialog = function showHelpDialog_0(url_0, title_0) {
    var jsObject = this.getJsObject_1();
    return jsObject.showHelpDialog(url_0, title_0);
  };
  _.showHelpDialog_1 = function(url_0, title_0) {
    this.showHelpDialog(url_0, title_0);
  };
  _.showMessage = function showMessage(message) {
  };
  _.showMessage_0 = function(message) {
    this.showMessage(message);
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_JSUIHelper_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic", "JSUIHelper", 593, cggl.Ljava_lang_Object_2_classLit);
  cargjagi.$clinit_JSComponent = function $clinit_JSComponent() {
    cargjagi.$clinit_JSComponent = emptyMethod;
    jl.$clinit_Object();
  };
  cargjagi.JSComponent = function JSComponent(jsComponent) {
    cargjagi.$clinit_JSComponent();
    Object_0.call(this);
    this.$init_193();
    this.mJsComponent = jsComponent;
    this.mConsumerList = new ju.ArrayList();
    this.setEventHandler_0(jsComponent);
  };
  defineClass(193, 1, { 1: 1 });
  _.$init_193 = function $init_193() {
  };
  _.fireEvent = function fireEvent_1(event_0) {
    this.fireEvent_0(castTo(event_0, 80));
  };
  _.addEventConsumer = function addEventConsumer(consumer) {
    this.mConsumerList.add(consumer);
  };
  _.fireEvent_0 = function fireEvent_0(event_0) {
    var consumer, consumer$iterator;
    for (consumer$iterator = this.mConsumerList.iterator(); consumer$iterator.hasNext_0(); ) {
      consumer = castTo(consumer$iterator.next_3(), 109);
      consumer.eventHappened_0(event_0);
    }
  };
  _.fireEventFromJs = function fireEventFromJs(what, value_0) {
    this.fireEvent_0(new cargg.GenericActionEvent(this, what, value_0));
  };
  _.getJsComponent = function getJsComponent() {
    return this.mJsComponent;
  };
  _.setEnabled_0 = function setEnabled(b) {
    var component = this.getJsComponent();
    return component.setEnabled(b);
  };
  _.setEventHandler_0 = function setEventHandler(jsComponent) {
    var component = this;
    jsComponent.setEventHandler(
      function(what, value_0) {
        component.fireEventFromJs(what, value_0);
      }
    );
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSComponent_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic.internal", "JSComponent", 193, cggl.Ljava_lang_Object_2_classLit);
  cargjagi.$clinit_JSCheckBox = function $clinit_JSCheckBox() {
    cargjagi.$clinit_JSCheckBox = emptyMethod;
    cargjagi.$clinit_JSComponent();
  };
  cargjagi.JSCheckBox = function JSCheckBox(jsCheckBox) {
    cargjagi.$clinit_JSCheckBox();
    cargjagi.JSComponent.call(this, jsCheckBox);
    this.$init_194();
  };
  defineClass(823, 193, { 1: 1 }, cargjagi.JSCheckBox);
  _.$init_194 = function $init_194() {
  };
  _.isSelected_0 = function isSelected_1() {
    var component = this.getJsComponent();
    return component.isSelected();
  };
  _.setSelected_0 = function setSelected_0(b) {
    var component = this.getJsComponent();
    return component.setSelected(b);
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSCheckBox_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic.internal", "JSCheckBox", 823, cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSComponent_2_classLit);
  cargjagi.$clinit_JSClipboardHandler = function $clinit_JSClipboardHandler() {
    cargjagi.$clinit_JSClipboardHandler = emptyMethod;
    jl.$clinit_Object();
  };
  cargjagi.JSClipboardHandler = function JSClipboardHandler(jsHandler) {
    cargjagi.$clinit_JSClipboardHandler();
    Object_0.call(this);
    this.$init_195();
    this.mJsHandler = jsHandler;
  };
  defineClass(333, 1, { 1: 1 }, cargjagi.JSClipboardHandler);
  _.$init_195 = function $init_195() {
  };
  _.copyMolecule_1 = function copyMolecule_2(mol) {
    var handler = this.getJsHandler();
    var jsMolecule = new cargja.JSMolecule_1(mol);
    return handler.copyMolecule(jsMolecule);
  };
  _.copyReaction = function copyReaction_0(r) {
    var test_0;
    test_0 = null;
    (jl.$clinit_System(), jl.out_0).println_0("test: " + toString_29(test_0));
    return true;
  };
  _.getJsHandler = function getJsHandler() {
    return this.mJsHandler;
  };
  _.pasteMolecule_0 = function pasteMolecule_0() {
    var handler = this.getJsHandler();
    var jsMolecule = handler.pasteMolecule();
    if (jsMolecule) {
      return jsMolecule.getStereoMolecule();
    } else {
      return null;
    }
  };
  _.pasteReaction = function pasteReaction_0() {
    var test_0;
    test_0 = null;
    (jl.$clinit_System(), jl.out_0).println_0("test: " + toString_29(test_0));
    return null;
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSClipboardHandler_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic.internal", "JSClipboardHandler", 333, cggl.Ljava_lang_Object_2_classLit);
  cargjagi.$clinit_JSComboBox = function $clinit_JSComboBox() {
    cargjagi.$clinit_JSComboBox = emptyMethod;
    cargjagi.$clinit_JSComponent();
  };
  cargjagi.JSComboBox = function JSComboBox(jsComboBox) {
    cargjagi.$clinit_JSComboBox();
    cargjagi.JSComponent.call(this, jsComboBox);
    this.$init_196();
  };
  defineClass(824, 193, { 1: 1 }, cargjagi.JSComboBox);
  _.$init_196 = function $init_196() {
  };
  _.addItem_0 = function addItem(item_0) {
    var component = this.getJsComponent();
    return component.addItem(item_0);
  };
  _.getSelectedIndex_0 = function getSelectedIndex() {
    var component = this.getJsComponent();
    return component.getSelectedIndex();
  };
  _.getSelectedItem_0 = function getSelectedItem() {
    var component = this.getJsComponent();
    return component.getSelectedItem();
  };
  _.removeAllItems_0 = function removeAllItems() {
    var component = this.getJsComponent();
    return component.removeAllItems();
  };
  _.setEditable_0 = function setEditable(b) {
    var component = this.getJsComponent();
    return component.setEditable(b);
  };
  _.setSelectedIndex_0 = function setSelectedIndex(index_0) {
    var component = this.getJsComponent();
    return component.setSelectedIndex(index_0);
  };
  _.setSelectedItem_0 = function setSelectedItem(item_0) {
    var component = this.getJsComponent();
    return component.setSelectedItem(item_0);
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSComboBox_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic.internal", "JSComboBox", 824, cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSComponent_2_classLit);
  cargjagi.$clinit_JSDialog = function $clinit_JSDialog() {
    cargjagi.$clinit_JSDialog = emptyMethod;
    jl.$clinit_Object();
  };
  cargjagi.JSDialog = function JSDialog(jsDialog, editorArea) {
    cargjagi.$clinit_JSDialog();
    Object_0.call(this);
    this.$init_197();
    this.mJsDialog = jsDialog;
    this.mEditorArea = editorArea;
  };
  defineClass(335, 1, { 1: 1 }, cargjagi.JSDialog);
  _.$init_197 = function $init_197() {
  };
  _.add_8 = function add_14(c, x_0, y_0) {
    var jsDialog = this.getJsDialog();
    var jsComponent = c.getJsComponent();
    return jsDialog.add(jsComponent, x_0, y_0);
  };
  _.add_9 = function add_15(c, x1, y1, x2, y2) {
    var jsDialog = this.getJsDialog();
    var jsComponent = c.getJsComponent();
    return jsDialog.add(jsComponent, x1, y1, x2, y2);
  };
  _.createCheckBox_0 = function createCheckBox(text_0) {
    var jsDialog = this.getJsDialog();
    var checkBox = jsDialog.createCheckBox(text_0);
    return new cargjagi.JSCheckBox(checkBox);
  };
  _.createComboBox_0 = function createComboBox() {
    var jsDialog = this.getJsDialog();
    var comboBox = jsDialog.createComboBox();
    return new cargjagi.JSComboBox(comboBox);
  };
  _.createLabel_0 = function createLabel(text_0) {
    var jsDialog = this.getJsDialog();
    var label_0 = jsDialog.createLabel(text_0);
    return new cargjagi.JSLabel(label_0);
  };
  _.createTextField_0 = function createTextField(width_0, height) {
    var jsDialog = this.getJsDialog();
    var textField = jsDialog.createTextField(width_0, height);
    return new cargjagi.JSTextField(textField);
  };
  _.disposeDialog_0 = function disposeDialog() {
    var jsDialog = this.getJsDialog();
    jsDialog.disposeDialog();
  };
  _.fireCancel_0 = function fireCancel() {
    if (isNotNull(this.mConsumer)) {
      this.mConsumer.eventHappened_0(new cargg.GenericActionEvent(this, 1, 0));
    }
  };
  _.fireOk_0 = function fireOk() {
    if (isNotNull(this.mConsumer)) {
      this.mConsumer.eventHappened_0(new cargg.GenericActionEvent(this, 0, 0));
    }
    this.mEditorArea.getGenericEditorArea().updateAndFireEvent(1);
  };
  _.getJsDialog = function getJsDialog() {
    return this.mJsDialog;
  };
  _.setEventConsumer_0 = function setEventConsumer(consumer) {
    this.mConsumer = consumer;
    var jsDialog = this.getJsDialog();
    var that = this;
    function ok() {
      that.fireOk_0();
    }
    function cancel() {
      that.fireCancel_0();
    }
    var jsConsumer = { fireOk: ok, fireCancel: cancel };
    jsDialog.setEventConsumer(jsConsumer);
  };
  _.setLayout_0 = function setLayout(hLayout, vLayout) {
    var jsDialog = this.getJsDialog();
    return jsDialog.setLayout(hLayout, vLayout);
  };
  _.showDialog_1 = function showDialog_3() {
    var jsDialog = this.getJsDialog();
    jsDialog.showDialog();
  };
  _.showMessage_0 = function showMessage_0(message) {
    var jsDialog = this.getJsDialog();
    jsDialog.showMessage(message);
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSDialog_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic.internal", "JSDialog", 335, cggl.Ljava_lang_Object_2_classLit);
  cargjagi.$clinit_JSDrawContext = function $clinit_JSDrawContext() {
    cargjagi.$clinit_JSDrawContext = emptyMethod;
    jl.$clinit_Object();
  };
  cargjagi.JSDrawContext = function JSDrawContext(jsContext) {
    cargjagi.$clinit_JSDrawContext();
    Object_0.call(this);
    this.$init_198();
    this.mJsContext = jsContext;
  };
  defineClass(242, 1, { 89: 1, 1: 1 }, cargjagi.JSDrawContext);
  _.$init_198 = function $init_198() {
  };
  _.clearRect_0 = function clearRect(x_0, y_0, w, h) {
    var jsContext = this.getJsContext();
    return jsContext.clearRect(x_0, y_0, w, h);
  };
  _.createARGBImage_0 = function createARGBImage(width_0, height) {
    var jsContext = this.getJsContext();
    var image = ctx.createARGBImage(width_0, height);
    return new cargjagi.JSImage(image);
  };
  _.drawCenteredString_0 = function drawCenteredString(x_0, y_0, s) {
    var jsContext = this.getJsContext();
    return jsContext.drawCenteredString(x_0, y_0, s);
  };
  _.drawDottedLine_1 = function drawDottedLine_1(x1, y1, x2, y2) {
    var jsContext = this.getJsContext();
    return jsContext.drawDottedLine(x1, y1, x2, y2);
  };
  _.drawImage_0 = function drawImage(image, x_0, y_0) {
    var jsContext = this.getJsContext();
    var jsImage = image.get_2();
    return jsContext.drawImage(jsImage, x_0, y_0);
  };
  _.drawImage_1 = function drawImage_0(image, sx, sy, sw, sh, dx, dy, dw, dh) {
    var jsContext = this.getJsContext();
    var jsImage = image.get_2();
    return jsContext.drawImage(jsImage, sx, sy, sw, sh, dx, dy, dw, dh);
  };
  _.drawLine_1 = function drawLine_0(x1, y1, x2, y2) {
    var jsContext = this.getJsContext();
    return jsContext.drawLine(x1, y1, x2, y2);
  };
  _.drawPolygon_0 = function drawPolygon_1(p) {
    this.drawPolygon_1(new cargjagi.JSPolygon(p));
  };
  _.drawPolygon_1 = function drawPolygon_2(jsPolygon) {
    var jsContext = this.getJsContext();
    return jsContext.drawPolygon(jsPolygon);
  };
  _.drawRectangle_0 = function drawRectangle(x_0, y_0, w, h) {
    var jsContext = this.getJsContext();
    return jsContext.drawRectangle(x_0, y_0, w, h);
  };
  _.drawString_1 = function drawString_1(x_0, y_0, s) {
    var jsContext = this.getJsContext();
    return jsContext.drawString(x_0, y_0, s);
  };
  _.fillCircle_0 = function fillCircle_1(x_0, y_0, d) {
    var jsContext = this.getJsContext();
    return jsContext.fillCircle(x_0, y_0, d);
  };
  _.fillPolygon_0 = function fillPolygon(p) {
    this.fillPolygon_1(new cargjagi.JSPolygon(p));
  };
  _.fillPolygon_1 = function fillPolygon_0(jsPolygon) {
    var jsContext = this.getJsContext();
    return jsContext.fillPolygon(jsPolygon);
  };
  _.fillRectangle_0 = function fillRectangle(x_0, y_0, w, h) {
    var jsContext = this.getJsContext();
    return jsContext.fillRectangle(x_0, y_0, w, h);
  };
  _.getBackgroundRGB_0 = function getBackgroundRGB_2() {
    var jsContext = this.getJsContext();
    return jsContext.getBackgroundRGB();
  };
  _.getBounds_1 = function getBounds_2(s) {
    var jsContext = this.getJsContext();
    var bounds = jsContext.getBounds(s);
    return new cargg.GenericRectangle_0(bounds.x, bounds.y, bounds.width, bounds.height);
  };
  _.getFontSize_0 = function getFontSize() {
    var jsContext = this.getJsContext();
    return jsContext.getFontSize();
  };
  _.getForegroundRGB_0 = function getForegroundRGB() {
    var jsContext = this.getJsContext();
    return jsContext.getForegroundRGB();
  };
  _.getJsContext = function getJsContext() {
    return this.mJsContext;
  };
  _.getLineWidth_0 = function getLineWidth() {
    var jsContext = this.getJsContext();
    return jsContext.getLineWidth();
  };
  _.getRGB_0 = function getRGB() {
    var jsContext = this.getJsContext();
    return jsContext.getRGB();
  };
  _.getSelectionBackgroundRGB_0 = function getSelectionBackgroundRGB() {
    var jsContext = this.getJsContext();
    return jsContext.getSelectionBackgroundRGB();
  };
  _.isDarkBackground_0 = function isDarkBackground() {
    var jsContext = this.getJsContext();
    return jsContext.isDarkBackground();
  };
  _.setFont_0 = function setFont(size_0, isBold, isItalic) {
    var jsContext = this.getJsContext();
    return jsContext.setFont(size_0, isBold, isItalic);
  };
  _.setLineWidth_1 = function setLineWidth_1(lineWidth) {
    var jsContext = this.getJsContext();
    return jsContext.setLineWidth(lineWidth);
  };
  _.setRGB_0 = function setRGB_1(rgb) {
    var jsContext = this.getJsContext();
    return jsContext.setRGB(rgb);
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSDrawContext_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic.internal", "JSDrawContext", 242, cggl.Ljava_lang_Object_2_classLit);
  cargjagi.$clinit_JSImage = function $clinit_JSImage() {
    cargjagi.$clinit_JSImage = emptyMethod;
    jl.$clinit_Object();
  };
  cargjagi.JSImage = function JSImage(jsImage) {
    cargjagi.$clinit_JSImage();
    Object_0.call(this);
    this.$init_199();
    this.mJsImage = jsImage;
  };
  defineClass(243, 1, { 1: 1 }, cargjagi.JSImage);
  _.$init_199 = function $init_199() {
  };
  _.get_2 = function get_14() {
    var jsImage = this.getJsImage();
    return jsImage;
  };
  _.getHeight_1 = function getHeight_3() {
    var jsImage = this.getJsImage();
    return jsImage.getHeight();
  };
  _.getJsImage = function getJsImage() {
    return this.mJsImage;
  };
  _.getRGB_1 = function getRGB_0(x_0, y_0) {
    var jsImage = this.getJsImage();
    return jsImage.getRGB(x_0, y_0);
  };
  _.getWidth_1 = function getWidth_3() {
    var jsImage = this.getJsImage();
    return jsImage.getWidth();
  };
  _.setRGB_1 = function setRGB_2(x_0, y_0, argb) {
    var jsImage = this.getJsImage();
    jsImage.setRGB(x_0, y_0, argb);
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSImage_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic.internal", "JSImage", 243, cggl.Ljava_lang_Object_2_classLit);
  cargjagi.$clinit_JSKeyHandler = function $clinit_JSKeyHandler() {
    cargjagi.$clinit_JSKeyHandler = emptyMethod;
    cargg.$clinit_GenericEventHandler();
  };
  cargjagi.JSKeyHandler = function JSKeyHandler(source) {
    cargjagi.$clinit_JSKeyHandler();
    cargg.GenericEventHandler.call(this, source);
    this.$init_200();
  };
  defineClass(332, 245, { 1: 1 }, cargjagi.JSKeyHandler);
  _.$init_200 = function $init_200() {
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSKeyHandler_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic.internal", "JSKeyHandler", 332, cggl.Lcom_actelion_research_gui_generic_GenericEventHandler_2_classLit);
  cargjagi.$clinit_JSLabel = function $clinit_JSLabel() {
    cargjagi.$clinit_JSLabel = emptyMethod;
    cargjagi.$clinit_JSComponent();
  };
  cargjagi.JSLabel = function JSLabel(jsLabel) {
    cargjagi.$clinit_JSLabel();
    cargjagi.JSComponent.call(this, jsLabel);
    this.$init_201();
  };
  defineClass(822, 193, { 1: 1 }, cargjagi.JSLabel);
  _.$init_201 = function $init_201() {
  };
  _.setText_0 = function setText_0(text_0) {
    var component = this.getJsComponent();
    return component.setText(text_0);
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSLabel_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic.internal", "JSLabel", 822, cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSComponent_2_classLit);
  cargjagi.$clinit_JSMouseHandler = function $clinit_JSMouseHandler() {
    cargjagi.$clinit_JSMouseHandler = emptyMethod;
    cargg.$clinit_GenericEventHandler();
  };
  cargjagi.JSMouseHandler = function JSMouseHandler(source) {
    cargjagi.$clinit_JSMouseHandler();
    cargg.GenericEventHandler.call(this, source);
    this.$init_202();
  };
  defineClass(241, 245, { 1: 1 }, cargjagi.JSMouseHandler);
  _.$init_202 = function $init_202() {
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSMouseHandler_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic.internal", "JSMouseHandler", 241, cggl.Lcom_actelion_research_gui_generic_GenericEventHandler_2_classLit);
  cargjagi.$clinit_JSPolygon = function $clinit_JSPolygon() {
    cargjagi.$clinit_JSPolygon = emptyMethod;
    jl.$clinit_Object();
  };
  cargjagi.JSPolygon = function JSPolygon(polygon) {
    cargjagi.$clinit_JSPolygon();
    Object_0.call(this);
    this.$init_203();
    this.mPolygon = polygon;
  };
  defineClass(246, 1, { 1: 1 }, cargjagi.JSPolygon);
  _.$init_203 = function $init_203() {
  };
  _.getSize = function getSize_7() {
    return this.mPolygon.getSize_0();
  };
  _.getX = function getX_4(i) {
    return this.mPolygon.getX_0(i);
  };
  _.getY = function getY_4(i) {
    return this.mPolygon.getY_0(i);
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSPolygon_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic.internal", "JSPolygon", 246, cggl.Ljava_lang_Object_2_classLit);
  cargjagi.$clinit_JSTextField = function $clinit_JSTextField() {
    cargjagi.$clinit_JSTextField = emptyMethod;
    cargjagi.$clinit_JSComponent();
  };
  cargjagi.JSTextField = function JSTextField(jsTextField) {
    cargjagi.$clinit_JSTextField();
    cargjagi.JSComponent.call(this, jsTextField);
    this.$init_204();
  };
  defineClass(825, 193, { 1: 1 }, cargjagi.JSTextField);
  _.$init_204 = function $init_204() {
  };
  _.getText_0 = function getText_0() {
    var component = this.getJsComponent();
    return component.getText();
  };
  _.setText_0 = function setText_1(text_0) {
    var component = this.getJsComponent();
    return component.setText(text_0);
  };
  cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSTextField_2_classLit = createForClass("com.actelion.research.gwt.js.api.generic.internal", "JSTextField", 825, cggl.Lcom_actelion_research_gwt_js_api_generic_internal_JSComponent_2_classLit);
  cargju.$clinit_MoleculeQueryFeatures = function $clinit_MoleculeQueryFeatures() {
    cargju.$clinit_MoleculeQueryFeatures = emptyMethod;
    jl.$clinit_Object();
  };
  cargju.getAtomQueryFeatures_0 = function getAtomQueryFeatures_0(oclMolecule, atom) {
    cargju.$clinit_MoleculeQueryFeatures();
    var atomQueryFeatures, toReturn2;
    toReturn2 = ocu.create_8();
    atomQueryFeatures = oclMolecule.getAtomQueryFeatures(atom);
    ocu.$setPropertyBoolean(toReturn2, "aromatic", gt(and_0(atomQueryFeatures, 2), 0));
    ocu.$setPropertyBoolean(toReturn2, "notAromatic", gt(and_0(atomQueryFeatures, 4), 0));
    ocu.$setPropertyBoolean(toReturn2, "notChain", gt(and_0(atomQueryFeatures, 8), 0));
    ocu.$setPropertyBoolean(toReturn2, "not2RingBonds", gt(and_0(atomQueryFeatures, 16), 0));
    ocu.$setPropertyBoolean(toReturn2, "not3RingBonds", gt(and_0(atomQueryFeatures, 32), 0));
    ocu.$setPropertyBoolean(toReturn2, "not4RingBonds", gt(and_0(atomQueryFeatures, 64), 0));
    ocu.$setPropertyBoolean(toReturn2, "noMoreNeighbours", gt(and_0(atomQueryFeatures, 2048), 0));
    ocu.$setPropertyBoolean(toReturn2, "moreNeighbours", gt(and_0(atomQueryFeatures, 4096), 0));
    ocu.$setPropertyBoolean(toReturn2, "matchStereo", gt(and_0(atomQueryFeatures, 8192), 0));
    ocu.$setPropertyBoolean(toReturn2, "not0PiElectrons", gt(and_0(atomQueryFeatures, 16384), 0));
    ocu.$setPropertyBoolean(toReturn2, "not1PiElectron", gt(and_0(atomQueryFeatures, 32768), 0));
    ocu.$setPropertyBoolean(toReturn2, "not2PiElectrons", gt(and_0(atomQueryFeatures, 65536), 0));
    ocu.$setPropertyBoolean(toReturn2, "not0Hydrogen", gt(and_0(atomQueryFeatures, 128), 0));
    ocu.$setPropertyBoolean(toReturn2, "not1Hydrogen", gt(and_0(atomQueryFeatures, 256), 0));
    ocu.$setPropertyBoolean(toReturn2, "not2Hydrogen", gt(and_0(atomQueryFeatures, 512), 0));
    ocu.$setPropertyBoolean(toReturn2, "not3Hydrogen", gt(and_0(atomQueryFeatures, 1024), 0));
    ocu.$setPropertyBoolean(toReturn2, "not0Neighbours", gt(and_0(atomQueryFeatures, 131072), 0));
    ocu.$setPropertyBoolean(toReturn2, "not1Neighbour", gt(and_0(atomQueryFeatures, 262144), 0));
    ocu.$setPropertyBoolean(toReturn2, "not2Neighbours", gt(and_0(atomQueryFeatures, 524288), 0));
    ocu.$setPropertyBoolean(toReturn2, "not3Neighbours", gt(and_0(atomQueryFeatures, 1048576), 0));
    ocu.$setPropertyBoolean(toReturn2, "not4Neighbours", gt(and_0(atomQueryFeatures, 2097152), 0));
    ocu.$setPropertyBoolean(toReturn2, "notChargeNeg", gt(and_0(atomQueryFeatures, 33554432), 0));
    ocu.$setPropertyBoolean(toReturn2, "notCharge0", gt(and_0(atomQueryFeatures, 67108864), 0));
    ocu.$setPropertyBoolean(toReturn2, "noChargePos", gt(and_0(atomQueryFeatures, 134217728), 0));
    ocu.$setPropertyBoolean(toReturn2, "ringSize0", gt(and_0(atomQueryFeatures, 4294967296), 0));
    ocu.$setPropertyBoolean(toReturn2, "ringSize3", gt(and_0(atomQueryFeatures, 8589934592), 0));
    ocu.$setPropertyBoolean(toReturn2, "ringSize4", gt(and_0(atomQueryFeatures, 17179869184), 0));
    ocu.$setPropertyBoolean(toReturn2, "ringSize5", gt(and_0(atomQueryFeatures, 34359738368), 0));
    ocu.$setPropertyBoolean(toReturn2, "ringSize6", gt(and_0(atomQueryFeatures, 68719476736), 0));
    ocu.$setPropertyBoolean(toReturn2, "ringSize7", gt(and_0(atomQueryFeatures, 137438953472), 0));
    ocu.$setPropertyBoolean(toReturn2, "ringSizeLarge", gt(and_0(atomQueryFeatures, 274877906944), 0));
    return toReturn2;
  };
  cargju.getBondQueryFeatures_1 = function getBondQueryFeatures_1(oclMolecule, bond) {
    cargju.$clinit_MoleculeQueryFeatures();
    var bondQueryFeatures, toReturn2;
    toReturn2 = ocu.create_8();
    bondQueryFeatures = fromInt_0(oclMolecule.getBondQueryFeatures_0(bond));
    ocu.$setPropertyBoolean(toReturn2, "single", gt(and_0(bondQueryFeatures, 1), 0));
    ocu.$setPropertyBoolean(toReturn2, "double", gt(and_0(bondQueryFeatures, 2), 0));
    ocu.$setPropertyBoolean(toReturn2, "triple", gt(and_0(bondQueryFeatures, 4), 0));
    ocu.$setPropertyBoolean(toReturn2, "delocalized", gt(and_0(bondQueryFeatures, 8), 0));
    ocu.$setPropertyBoolean(toReturn2, "metalLigand", gt(and_0(bondQueryFeatures, 16), 0));
    ocu.$setPropertyBoolean(toReturn2, "quadruple", gt(and_0(bondQueryFeatures, 32), 0));
    ocu.$setPropertyBoolean(toReturn2, "quintuple", gt(and_0(bondQueryFeatures, 64), 0));
    ocu.$setPropertyBoolean(toReturn2, "notRing", gt(and_0(bondQueryFeatures, 128), 0));
    ocu.$setPropertyBoolean(toReturn2, "ring", gt(and_0(bondQueryFeatures, 256), 0));
    ocu.$setPropertyBoolean(toReturn2, "aromatic", gt(and_0(bondQueryFeatures, 2097152), 0));
    ocu.$setPropertyBoolean(toReturn2, "nonAromatic", gt(and_0(bondQueryFeatures, 4194304), 0));
    ocu.$setPropertyInt(toReturn2, "ringSize", toInt_0(and_0(bondQueryFeatures, 917504)) >> 17);
    ocu.$setPropertyInt(toReturn2, "brigdeMin", toInt_0(and_0(bondQueryFeatures, 7680)) >> 9);
    ocu.$setPropertyInt(toReturn2, "brigdeSpan", toInt_0(and_0(bondQueryFeatures, 122880)) >> 13);
    return toReturn2;
  };
  defineClass(645, 1, { 1: 1 });
  cggl.Lcom_actelion_research_gwt_js_utils_MoleculeQueryFeatures_2_classLit = createForClass("com.actelion.research.gwt.js.utils", "MoleculeQueryFeatures", 645, cggl.Ljava_lang_Object_2_classLit);
  cargju.$clinit_ThreadMaster_0 = function $clinit_ThreadMaster_0() {
    cargju.$clinit_ThreadMaster_0 = emptyMethod;
    jl.$clinit_Object();
  };
  cargju.ThreadMaster = function ThreadMaster() {
    Object_0.call(this);
    this.$init_205();
  };
  cargju.getInstance_1 = function getInstance_1() {
    cargju.$clinit_ThreadMaster_0();
    if (isNull(cargju.instance_0)) {
      cargju.instance_0 = new cargju.ThreadMaster();
    }
    return cargju.instance_0;
  };
  defineClass(375, 1, { 1: 1 }, cargju.ThreadMaster);
  _.$init_205 = function $init_205() {
  };
  _.threadMustDie = function threadMustDie() {
    return false;
  };
  cargju.instance_0 = null;
  cggl.Lcom_actelion_research_gwt_js_utils_ThreadMaster_2_classLit = createForClass("com.actelion.research.gwt.js.utils", "ThreadMaster", 375, cggl.Ljava_lang_Object_2_classLit);
  cargju.$clinit_Util = function $clinit_Util() {
    cargju.$clinit_Util = emptyMethod;
    jl.$clinit_Object();
  };
  cargju.convertParameterizedStringList = function convertParameterizedStringList(list) {
    cargju.$clinit_Util();
    var array, i, size_0;
    size_0 = list.getSize_0();
    array = cargju.newJsArray(size_0);
    for (i = 0; i < size_0; i++) {
      cggcc.$set(array, i, cargju.getParameterizedString(list.getStringAt(i), list.getStringTypeAt(i)));
    }
    return array;
  };
  cargju.createSSSearcherIndex = function createSSSearcherIndex(molecule) {
    cargju.$clinit_Util();
    if (isNull(cargju.searcher_0)) {
      cargju.searcher_0 = new carc2.SSSearcherWithIndex();
    }
    return cargju.searcher_0.createIndex_0(molecule);
  };
  cargju.getDisplayMode = function getDisplayMode(options) {
    cargju.$clinit_Util();
    if (!options)
      return 0;
    var displayMode = 0;
    if (options.inflateToMaxAVBL)
      displayMode |= 65536;
    if (options.inflateToHighResAVBL)
      displayMode |= 131072;
    if (options.chiralTextBelowMolecule)
      displayMode |= 0;
    if (options.chiralTextAboveMolecule)
      displayMode |= 262144;
    if (options.chiralTextOnFrameTop)
      displayMode |= 524288;
    if (options.chiralTextOnFrameBottom)
      displayMode |= 786432;
    if (options.noTabus)
      displayMode |= 1;
    if (options.showAtomNumber)
      displayMode |= 2;
    if (options.showBondNumber)
      displayMode |= 4;
    if (options.highlightQueryFeatures)
      displayMode |= 8;
    if (options.showMapping)
      displayMode |= 16;
    if (options.suppressChiralText)
      displayMode |= 32;
    if (options.suppressCIPParity)
      displayMode |= 64;
    if (options.suppressESR)
      displayMode |= 128;
    if (options.showSymmetryAny)
      displayMode |= 768;
    if (options.showSymmetrySimple)
      displayMode |= 256;
    if (options.showSymmetryStereoHeterotopicity)
      displayMode |= 512;
    if (options.noImplicitAtomLabelColors)
      displayMode |= 1024;
    if (options.noStereoProblem)
      displayMode |= 2048;
    if (options.noColorOnESRAndCIP)
      displayMode |= 4096;
    if (options.noImplicitHydrogen)
      displayMode |= 8192;
    if (options.drawBondsInGray)
      displayMode |= 16384;
    return displayMode;
  };
  cargju.getParameterizedString = function getParameterizedString(string, stringType) {
    return { type: stringType, value: string };
  };
  cargju.newJsArray = function newJsArray(length_0) {
    return new Array(length_0);
  };
  defineClass(641, 1, { 1: 1 });
  cargju.searcher_0 = null;
  cggl.Lcom_actelion_research_gwt_js_utils_Util_2_classLit = createForClass("com.actelion.research.gwt.js.utils", "Util", 641, cggl.Ljava_lang_Object_2_classLit);
  caru.$clinit_Angle_1 = function $clinit_Angle_1() {
    caru.$clinit_Angle_1 = emptyMethod;
    jl.$clinit_Object();
  };
  caru.difference = function difference(a2, a1) {
    caru.$clinit_Angle_1();
    var a;
    a = a2 - a1;
    if (a >= 3.141592653589793)
      a -= 2 * 3.141592653589793;
    else if (a < -3.141592653589793)
      a += 2 * 3.141592653589793;
    return a;
  };
  defineClass(754, 1, { 1: 1 });
  cggl.Lcom_actelion_research_util_Angle_2_classLit = createForClass("com.actelion.research.util", "Angle", 754, cggl.Ljava_lang_Object_2_classLit);
  caru.$clinit_ArrayUtils = function $clinit_ArrayUtils() {
    caru.$clinit_ArrayUtils = emptyMethod;
    jl.$clinit_Object();
  };
  caru.indexOf_2 = function indexOf_2(array, obj) {
    caru.$clinit_ArrayUtils();
    return caru.indexOf_3(array, obj, 0);
  };
  caru.indexOf_3 = function indexOf_3(array, obj, startIndex) {
    caru.$clinit_ArrayUtils();
    var i;
    for (i = startIndex; i < array.length; i++) {
      if (array[i] == obj)
        return i;
    }
    return -1;
  };
  defineClass(747, 1, { 1: 1 });
  cggl.Lcom_actelion_research_util_ArrayUtils_2_classLit = createForClass("com.actelion.research.util", "ArrayUtils", 747, cggl.Ljava_lang_Object_2_classLit);
  caru.$clinit_ByteArrayComparator = function $clinit_ByteArrayComparator() {
    caru.$clinit_ByteArrayComparator = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Comparator();
  };
  caru.ByteArrayComparator = function ByteArrayComparator() {
    caru.$clinit_ByteArrayComparator();
    Object_0.call(this);
    this.$init_206();
  };
  defineClass(227, 1, { 4: 1, 1: 1, 36: 1 }, caru.ByteArrayComparator);
  _.$init_206 = function $init_206() {
  };
  _.compare_0 = function compare_13(b1, b2) {
    return this.compare_4(castTo(b1, 8), castTo(b2, 8));
  };
  _.equals_0 = function equals_18(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  _.compare_4 = function compare_14(b1, b2) {
    var i;
    if (jsEquals(b1, null))
      return jsEquals(b2, null) ? 0 : 1;
    if (jsEquals(b2, null))
      return -1;
    for (i = 0; i < b1.length; i++) {
      if (b2.length == i)
        return 1;
      if (b1[i] != b2[i])
        return b1[i] < b2[i] ? -1 : 1;
    }
    return b2.length > b1.length ? -1 : 0;
  };
  caru.serialVersionUID_9 = 538052617;
  cggl.Lcom_actelion_research_util_ByteArrayComparator_2_classLit = createForClass("com.actelion.research.util", "ByteArrayComparator", 227, cggl.Ljava_lang_Object_2_classLit);
  caru.$clinit_ColorHelper = function $clinit_ColorHelper() {
    caru.$clinit_ColorHelper = emptyMethod;
    jl.$clinit_Object();
    caru.PERCEIVED_BRIGHTNESS = stampJavaTypeInfo(getClassLiteralForArray(cggl.F_classLit, 1), { 44: 1, 4: 1, 1: 1 }, 5, 15, [0.29899999499320984, 0.5870000123977661, 0.11400000005960464]);
  };
  caru.brighter = function brighter(argb, factor) {
    caru.$clinit_ColorHelper();
    var alpha_0, b, g, i, r;
    alpha_0 = argb & -16777216;
    r = (argb & 16711680) >> 16;
    g = (argb & 65280) >> 8;
    b = argb & 255;
    i = round_int(1 / (1 - factor));
    if (r == 0 && g == 0 && b == 0)
      return alpha_0 | i << 16 | i << 8 | i;
    if (r > 0 && r < i)
      r = i;
    if (g > 0 && g < i)
      g = i;
    if (b > 0 && b < i)
      b = i;
    return alpha_0 | $wnd.Math.min(round_int(r / factor), 255) << 16 | $wnd.Math.min(round_int(g / factor), 255) << 8 | $wnd.Math.min(round_int(b / factor), 255);
  };
  caru.brighter_0 = function brighter_0(c, factor) {
    caru.$clinit_ColorHelper();
    var alpha_0, b, g, i, r;
    r = c.getRed();
    g = c.getGreen();
    b = c.getBlue();
    alpha_0 = c.getAlpha();
    i = round_int(1 / (1 - factor));
    if (r == 0 && g == 0 && b == 0) {
      return new ja.Color_1(i, i, i, alpha_0);
    }
    if (r > 0 && r < i)
      r = i;
    if (g > 0 && g < i)
      g = i;
    if (b > 0 && b < i)
      b = i;
    return new ja.Color_1($wnd.Math.min(round_int(r / factor), 255), $wnd.Math.min(round_int(g / factor), 255), $wnd.Math.min(round_int(b / factor), 255), alpha_0);
  };
  caru.createColor = function createColor(argb, perceivedBrightness) {
    caru.$clinit_ColorHelper();
    var cc, f;
    cc = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
    f = 1 / 255;
    cc[0] = f * ((argb & 16711680) >> 16);
    cc[1] = f * ((argb & 65280) >> 8);
    cc[2] = f * (argb & 255);
    caru.createColor_0(cc, perceivedBrightness);
    return argb & -16777216 | jl.round_2(cc[0] * 255) << 16 | jl.round_2(cc[1] * 255) << 8 | jl.round_2(cc[2] * 255);
  };
  caru.createColor_0 = function createColor_0(cc, perceivedBrightness) {
    var f, i, i0, i1, pb, remainingBrightness, sum, surplusBrightness;
    pb = caru.perceivedBrightness_1(cc);
    if (pb == 0) {
      cc[0] = 0;
      cc[1] = 0;
      cc[2] = 0;
      return;
    }
    f = perceivedBrightness / pb;
    surplusBrightness = 0;
    sum = 0;
    for (i0 = 0; i0 < 3; i0++) {
      cc[i0] *= f;
      if (cc[i0] < 1) {
        sum += caru.PERCEIVED_BRIGHTNESS[i0];
      } else {
        surplusBrightness += (cc[i0] - 1) * caru.PERCEIVED_BRIGHTNESS[i0];
        cc[i0] = 1;
      }
    }
    if (surplusBrightness != 0) {
      remainingBrightness = 0;
      for (i1 = 0; i1 < 3; i1++) {
        if (cc[i1] < 1) {
          cc[i1] += surplusBrightness / sum;
          if (cc[i1] > 1) {
            remainingBrightness += (cc[i1] - 1) * caru.PERCEIVED_BRIGHTNESS[i1];
            cc[i1] = 1;
          }
        }
      }
      if (remainingBrightness != 0) {
        for (i = 0; i < 3; i++) {
          if (cc[i] < 1) {
            cc[i] += remainingBrightness / caru.PERCEIVED_BRIGHTNESS[i];
            if (cc[i] > 1) {
              cc[i] = 1;
            }
          }
        }
      }
    }
  };
  caru.darker = function darker(argb, factor) {
    caru.$clinit_ColorHelper();
    return argb & -16777216 | jl.round_2(factor * ((argb & 16711680) >> 16)) << 16 | jl.round_2(factor * ((argb & 65280) >> 8)) << 8 | jl.round_2(factor * (argb & 255));
  };
  caru.getContrastColor_0 = function getContrastColor_0(fgRGB, bgRGB) {
    caru.$clinit_ColorHelper();
    var bgb, brightnessFactor, contrast, darken, fgb, hsbBG, hsbFG, hueDif, hueDifferenceFactor, neededContrast, saturationFactor;
    bgb = caru.perceivedBrightness_0(bgRGB);
    fgb = caru.perceivedBrightness_0(fgRGB);
    contrast = $wnd.Math.abs(bgb - fgb);
    if (contrast > 0.30000001192092896)
      return fgRGB;
    hsbBG = ja.RGBtoHSB((bgRGB & 16711680) >> 16, (bgRGB & 65280) >> 8, bgRGB & 255, null);
    hsbFG = ja.RGBtoHSB((fgRGB & 16711680) >> 16, (fgRGB & 65280) >> 8, fgRGB & 255, null);
    hueDif = $wnd.Math.abs(hsbFG[0] - hsbBG[0]);
    if (hueDif > 0.5)
      hueDif = 1 - hueDif;
    saturationFactor = 1 - $wnd.Math.max(hsbFG[1], hsbBG[1]);
    brightnessFactor = $wnd.Math.abs(fgb + bgb - 1);
    hueDifferenceFactor = $wnd.Math.cos(3.141592653589793 * hueDif * 3);
    neededContrast = 0.30000001192092896 * $wnd.Math.max(saturationFactor, $wnd.Math.max(brightnessFactor, hueDifferenceFactor));
    if (contrast > neededContrast)
      return fgRGB;
    darken = fgb > bgb ? fgb + neededContrast > 1 : fgb - neededContrast > 0;
    return caru.createColor(fgRGB, darken ? bgb - neededContrast : bgb + neededContrast);
  };
  caru.intermediateColor = function intermediateColor(rgb1, rgb2, ratio) {
    caru.$clinit_ColorHelper();
    var b1, b2, g1, g2, r1, r2;
    r1 = (rgb1 & 16711680) >> 16;
    g1 = (rgb1 & 65280) >> 8;
    b1 = rgb1 & 255;
    r2 = (rgb2 & 16711680) >> 16;
    g2 = (rgb2 & 65280) >> 8;
    b2 = rgb2 & 255;
    return (r1 + jl.round_2(ratio * (r2 - r1)) << 16) + (g1 + jl.round_2(ratio * (g2 - g1)) << 8) + b1 + jl.round_2(ratio * (b2 - b1));
  };
  caru.perceivedBrightness_0 = function perceivedBrightness_0(argb) {
    caru.$clinit_ColorHelper();
    return (caru.PERCEIVED_BRIGHTNESS[0] * ((argb & 16711680) >> 16) + caru.PERCEIVED_BRIGHTNESS[1] * ((argb & 65280) >> 8) + caru.PERCEIVED_BRIGHTNESS[2] * (argb & 255)) / 255;
  };
  caru.perceivedBrightness_1 = function perceivedBrightness_1(cc) {
    return caru.PERCEIVED_BRIGHTNESS[0] * cc[0] + caru.PERCEIVED_BRIGHTNESS[1] * cc[1] + caru.PERCEIVED_BRIGHTNESS[2] * cc[2];
  };
  defineClass(751, 1, { 1: 1 });
  caru.MIN_CONTRAST_TO_BACKGROUND = 0.30000001192092896;
  cggl.Lcom_actelion_research_util_ColorHelper_2_classLit = createForClass("com.actelion.research.util", "ColorHelper", 751, cggl.Ljava_lang_Object_2_classLit);
  caru.$clinit_DoubleFormat = function $clinit_DoubleFormat() {
    caru.$clinit_DoubleFormat = emptyMethod;
    jl.$clinit_Object();
    caru.ZEROS = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["", "0", "00", "000", "0000", "00000", "000000", "0000000", "00000000"]);
  };
  caru.toString_22 = function toString_22(theDouble) {
    caru.$clinit_DoubleFormat();
    return caru.toString_24(theDouble, 5, true);
  };
  caru.toString_23 = function toString_23(value_0, significantDigits) {
    caru.$clinit_DoubleFormat();
    return caru.toString_24(value_0, significantDigits, true);
  };
  caru.toString_24 = function toString_24(value_0, significantDigits, skipTrailingZeros) {
    var exponent, i, limit1, limit2;
    if (isNaN(value_0))
      return "NaN";
    if (jl.isInfinite(value_0))
      return "Infinity";
    if (value_0 == 0)
      return skipTrailingZeros || significantDigits == 1 ? "0" : "0." + caru.zeros(significantDigits - 1);
    limit1 = 1;
    for (i = 1; i < significantDigits; i++)
      limit1 *= 10;
    limit2 = limit1 * 10;
    exponent = 0;
    while ($wnd.Math.abs(value_0) + 0.5 < limit1) {
      value_0 *= 10;
      exponent--;
    }
    while ($wnd.Math.abs(value_0) + 0.5 >= limit2) {
      value_0 /= 10;
      exponent++;
    }
    return caru.toString_25(fromDouble_0(value_0 + (value_0 < 0 ? -0.5 : 0.5)), exponent, significantDigits, skipTrailingZeros);
  };
  caru.toString_25 = function toString_25(value_0, exponent, significantDigits, skipTrailingZeros) {
    var cipherString, label_0, noOfCiphers, temp, trailingZeros, useScientificNotation;
    noOfCiphers = 1;
    if (eq(value_0, 0))
      return skipTrailingZeros || significantDigits == 1 ? "0" : "0." + caru.zeros(significantDigits - 1);
    if (neq(value_0, 0)) {
      while (eq(mod_0(value_0, 10), 0)) {
        value_0 = div_0(value_0, 10);
        exponent++;
      }
      noOfCiphers = 0;
      for (temp = value_0; neq(temp, 0); temp = div_0(temp, 10))
        noOfCiphers++;
    }
    label_0 = new jl.StringBuilder();
    if (lt(value_0, 0))
      label_0.append_4(45);
    trailingZeros = $wnd.Math.max(0, significantDigits - noOfCiphers);
    cipherString = jl.toString_44(jl.abs_0(value_0));
    if (exponent == 0) {
      label_0.append_9(cipherString);
      if (!skipTrailingZeros && trailingZeros != 0) {
        label_0.append_9(".");
        label_0.append_9(caru.zeros(trailingZeros));
      }
    } else if (exponent > 0) {
      useScientificNotation = skipTrailingZeros ? exponent > 4 : exponent - trailingZeros > 4;
      if (useScientificNotation) {
        if (noOfCiphers == 1) {
          label_0.append_9(cipherString);
          if (significantDigits > 1) {
            label_0.append_9(".");
            if (skipTrailingZeros)
              label_0.append_9("0");
            else
              label_0.append_9(caru.zeros(trailingZeros));
          }
        } else {
          label_0.append_9(jl.substring_II_Ljava_lang_String___devirtual$(cipherString, 0, 1));
          label_0.append_9(".");
          label_0.append_9(jl.substring_I_Ljava_lang_String___devirtual$(cipherString, 1));
          if (!skipTrailingZeros && trailingZeros != 0)
            label_0.append_9(caru.zeros(trailingZeros));
        }
        label_0.append_9("e");
        label_0.append_9(jl.toString_41(exponent + noOfCiphers - 1));
      } else {
        label_0.append_9(cipherString);
        label_0.append_9(caru.zeros(exponent));
        if (!skipTrailingZeros && trailingZeros > exponent) {
          label_0.append_9(".");
          label_0.append_9(caru.zeros(trailingZeros - exponent));
        }
      }
    } else {
      if (-exponent < noOfCiphers) {
        label_0.append_9(jl.substring_II_Ljava_lang_String___devirtual$(cipherString, 0, noOfCiphers + exponent));
        label_0.append_9(".");
        label_0.append_9(jl.substring_I_Ljava_lang_String___devirtual$(cipherString, noOfCiphers + exponent));
        if (!skipTrailingZeros && trailingZeros != 0)
          label_0.append_9(caru.zeros(trailingZeros));
      } else if (-exponent == noOfCiphers) {
        label_0.append_9("0.");
        label_0.append_9(cipherString);
        if (!skipTrailingZeros && trailingZeros != 0)
          label_0.append_9(caru.zeros(trailingZeros));
      } else {
        if (exponent + noOfCiphers < -2) {
          if (noOfCiphers == 1) {
            label_0.append_9(cipherString);
            if (significantDigits > 1) {
              label_0.append_9(".");
              if (skipTrailingZeros)
                label_0.append_9("0");
              else
                label_0.append_9(caru.zeros(trailingZeros));
            }
          } else {
            label_0.append_4(jl.charAt_I_C__devirtual$_0(cipherString, 0));
            label_0.append_9(".");
            label_0.append_9(jl.substring_I_Ljava_lang_String___devirtual$(cipherString, 1));
            if (!skipTrailingZeros && trailingZeros != 0)
              label_0.append_9(caru.zeros(trailingZeros));
          }
          label_0.append_9("e-");
          label_0.append_9(jl.toString_41(1 - exponent - noOfCiphers));
        } else {
          label_0.append_9("0.");
          label_0.append_9(caru.zeros(-exponent - noOfCiphers));
          label_0.append_9(cipherString);
          if (!skipTrailingZeros && trailingZeros != 0)
            label_0.append_9(caru.zeros(trailingZeros));
        }
      }
    }
    return label_0.toString_0();
  };
  caru.zeros = function zeros(i) {
    var b;
    if (i < caru.ZEROS.length)
      return caru.ZEROS[i];
    b = new jl.StringBuilder();
    while (i >= caru.ZEROS.length) {
      b.append_9(caru.ZEROS[caru.ZEROS.length - 1]);
      i -= caru.ZEROS.length - 1;
    }
    b.append_9(caru.ZEROS[i]);
    return b.toString_0();
  };
  defineClass(805, 1, { 1: 1 });
  cggl.Lcom_actelion_research_util_DoubleFormat_2_classLit = createForClass("com.actelion.research.util", "DoubleFormat", 805, cggl.Ljava_lang_Object_2_classLit);
  caru.$clinit_IntArrayComparator = function $clinit_IntArrayComparator() {
    caru.$clinit_IntArrayComparator = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Comparator();
  };
  caru.IntArrayComparator = function IntArrayComparator() {
    caru.$clinit_IntArrayComparator();
    Object_0.call(this);
    this.$init_207();
  };
  defineClass(107, 1, { 4: 1, 1: 1, 36: 1 }, caru.IntArrayComparator);
  _.$init_207 = function $init_207() {
  };
  _.compare_0 = function compare_15(ia1, ia2) {
    return this.compare_2(castTo(ia1, 6), castTo(ia2, 6));
  };
  _.equals_0 = function equals_19(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  _.compare_2 = function compare_16(ia1, ia2) {
    var i;
    if (jsEquals(ia1, null))
      return jsEquals(ia2, null) ? 0 : 1;
    if (jsEquals(ia2, null))
      return -1;
    for (i = 0; i < ia1.length; i++) {
      if (ia2.length == i)
        return 1;
      if (ia1[i] != ia2[i])
        return ia1[i] < ia2[i] ? -1 : 1;
    }
    return ia2.length > ia1.length ? -1 : 0;
  };
  caru.serialVersionUID_10 = 538185762;
  cggl.Lcom_actelion_research_util_IntArrayComparator_2_classLit = createForClass("com.actelion.research.util", "IntArrayComparator", 107, cggl.Ljava_lang_Object_2_classLit);
  caru.$clinit_SortedList = function $clinit_SortedList() {
    caru.$clinit_SortedList = emptyMethod;
    jl.$clinit_Object();
  };
  caru.SortedList = function SortedList() {
    caru.$clinit_SortedList();
    caru.SortedList_0.call(this, null);
  };
  caru.SortedList_0 = function SortedList_0(comparator) {
    caru.$clinit_SortedList();
    Object_0.call(this);
    this.$init_208();
    this.mComparator = comparator;
  };
  defineClass(73, 1, { 1: 1 }, caru.SortedList, caru.SortedList_0);
  _.$init_208 = function $init_208() {
    this.mList = new ju.ArrayList();
  };
  _.add_10 = function add_16(object) {
    var index_0;
    index_0 = this.getIndexOrInsertIndex(object);
    if (index_0 < 0) {
      index_0 = -(index_0 + 1);
      this.mList.addAtIndex(index_0, object);
    }
    return index_0;
  };
  _.compare_5 = function compare_17(o1, o2) {
    return isNotNull(this.mComparator) ? this.mComparator.compare_0(o1, o2) : jl.compareTo_Ljava_lang_Object__I__devirtual$_0(castTo(castTo(o1, 22), 22), o2);
  };
  _.contains_3 = function contains_7(object) {
    return this.getIndex_0(object) != -1;
  };
  _.get_3 = function get_15(index_0) {
    return index_0 < 0 ? null : this.mList.getAtIndex(index_0);
  };
  _.getIndex_0 = function getIndex_0(object) {
    var index_0;
    index_0 = this.getIndexOrInsertIndex(object);
    return index_0 < 0 ? -1 : index_0;
  };
  _.getIndexOrInsertIndex = function getIndexOrInsertIndex(object) {
    var comparison, increment, index_0, vectorSize;
    vectorSize = this.mList.size();
    if (vectorSize == 0) {
      return -1;
    }
    index_0 = 1;
    while (2 * index_0 <= vectorSize)
      index_0 <<= 1;
    increment = index_0;
    index_0--;
    while (increment != 0) {
      increment >>= 1;
      if (index_0 >= vectorSize) {
        index_0 -= increment;
        continue;
      }
      comparison = this.compare_5(object, this.mList.getAtIndex(index_0));
      if (comparison == 0)
        return index_0;
      if (increment == 0)
        break;
      if (comparison < 0) {
        index_0 -= increment;
      } else {
        index_0 += increment;
      }
    }
    if (index_0 < vectorSize && this.compare_5(object, this.mList.getAtIndex(index_0)) > 0)
      index_0++;
    return -(index_0 + 1);
  };
  _.remove_0 = function remove_4(index_0) {
    this.mList.removeAtIndex(index_0);
  };
  _.removeAll_0 = function removeAll_0() {
    this.mList.clear();
  };
  _.size_1 = function size_5() {
    return this.mList.size();
  };
  _.toArray_0 = function toArray_5(e) {
    return this.mList.toArray_0(e);
  };
  caru.serialVersionUID_11 = 538314278;
  cggl.Lcom_actelion_research_util_SortedList_2_classLit = createForClass("com.actelion.research.util", "SortedList", 73, cggl.Ljava_lang_Object_2_classLit);
  caru.$clinit_UniqueList = function $clinit_UniqueList() {
    caru.$clinit_UniqueList = emptyMethod;
    caru.$clinit_SortedList();
  };
  caru.UniqueList = function UniqueList() {
    caru.$clinit_UniqueList();
    caru.SortedList.call(this);
    this.$init_209();
  };
  defineClass(474, 73, { 4: 1, 1: 1 }, caru.UniqueList);
  _.$init_209 = function $init_209() {
    this.mOriginalOrder = new ju.ArrayList();
  };
  _.add_10 = function add_17(s) {
    var index_0, oldSize;
    oldSize = this.size_1();
    index_0 = getClassPrototype(73).add_10.call(this, s);
    if (this.size_1() != oldSize) {
      this.mOriginalOrder.add(s);
      this.mOriginalIndex = null;
      return oldSize;
    }
    if (jsEquals(this.mOriginalIndex, null))
      this.createOriginalIndex();
    return this.mOriginalIndex[index_0];
  };
  _.contains_3 = function contains_8(object) {
    return getClassPrototype(73).getIndex_0.call(this, object) != -1;
  };
  _.createOriginalIndex = function createOriginalIndex() {
    var i, t, t$iterator;
    this.mOriginalIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.size_1(), 15, 1);
    i = 0;
    for (t$iterator = this.mOriginalOrder.iterator(); t$iterator.hasNext_0(); ) {
      t = t$iterator.next_3();
      this.mOriginalIndex[getClassPrototype(73).getIndex_0.call(this, t)] = i++;
    }
  };
  _.get_3 = function get_16(i) {
    return this.mOriginalOrder.getAtIndex(i);
  };
  _.getIndex_0 = function getIndex_1(s) {
    var index_0;
    index_0 = getClassPrototype(73).getIndex_0.call(this, s);
    if (index_0 == -1)
      return -1;
    if (jsEquals(this.mOriginalIndex, null))
      this.createOriginalIndex();
    return this.mOriginalIndex[index_0];
  };
  _.toArray_0 = function toArray_6(e) {
    return this.mOriginalOrder.toArray_0(e);
  };
  caru.serialVersionUID_12 = 538054678;
  cggl.Lcom_actelion_research_util_UniqueList_2_classLit = createForClass("com.actelion.research.util", "UniqueList", 474, cggl.Lcom_actelion_research_util_SortedList_2_classLit);
  cggcc.$clinit_Callback = function $clinit_Callback() {
    cggcc.$clinit_Callback = emptyMethod;
  };
  cggl.Lcom_google_gwt_core_client_Callback_2_classLit = createForInterface("com.google.gwt.core.client", "Callback");
  cggcc.$clinit_CodeDownloadException = function $clinit_CodeDownloadException() {
    cggcc.$clinit_CodeDownloadException = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  cggcc.CodeDownloadException = function CodeDownloadException(message) {
    cggcc.$clinit_CodeDownloadException();
    jl.RuntimeException_1.call(this, message);
    this.$init_210();
    this.reason = (cggcc.$clinit_CodeDownloadException$Reason(), cggcc.TERMINATED);
  };
  defineClass(828, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, cggcc.CodeDownloadException);
  _.$init_210 = function $init_210() {
  };
  cggl.Lcom_google_gwt_core_client_CodeDownloadException_2_classLit = createForClass("com.google.gwt.core.client", "CodeDownloadException", 828, cggl.Ljava_lang_RuntimeException_2_classLit);
  cggcc.$clinit_CodeDownloadException$Reason = function $clinit_CodeDownloadException$Reason() {
    cggcc.$clinit_CodeDownloadException$Reason = emptyMethod;
    jl.$clinit_Enum();
    cggcc.TERMINATED = new cggcc.CodeDownloadException$Reason("TERMINATED", 0);
  };
  cggcc.CodeDownloadException$Reason = function CodeDownloadException$Reason(enum$name, enum$ordinal) {
    Enum.call(this, enum$name, enum$ordinal);
    this.$init_211();
  };
  cggcc.valueOf_4 = function valueOf_4(name_0) {
    cggcc.$clinit_CodeDownloadException$Reason();
    return valueOf((cggcc.$clinit_CodeDownloadException$Reason$Map(), cggcc.$MAP_3), name_0);
  };
  cggcc.values_4 = function values_4() {
    cggcc.$clinit_CodeDownloadException$Reason();
    return stampJavaTypeInfo(getClassLiteralForArray(cggl.Lcom_google_gwt_core_client_CodeDownloadException$Reason_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 228, 0, [cggcc.TERMINATED]);
  };
  defineClass(228, 48, { 228: 1, 4: 1, 22: 1, 48: 1, 1: 1 }, cggcc.CodeDownloadException$Reason);
  _.$init_211 = function $init_211() {
  };
  cggl.Lcom_google_gwt_core_client_CodeDownloadException$Reason_2_classLit = createForEnum("com.google.gwt.core.client", "CodeDownloadException/Reason", 228, cggl.Ljava_lang_Enum_2_classLit, cggcc.values_4, cggcc.valueOf_4);
  cggcc.$clinit_CodeDownloadException$Reason$Map = function $clinit_CodeDownloadException$Reason$Map() {
    cggcc.$clinit_CodeDownloadException$Reason$Map = emptyMethod;
    cggcc.$MAP_3 = createValueOfMap(cggcc.values_4());
  };
  defineClass(829, 1, { 1: 1 });
  cggl.Lcom_google_gwt_core_client_CodeDownloadException$Reason$Map_2_classLit = createForClass("com.google.gwt.core.client", "CodeDownloadException/Reason/Map", 829, cggl.Ljava_lang_Object_2_classLit);
  cggcc.$clinit_Duration = function $clinit_Duration() {
    cggcc.$clinit_Duration = emptyMethod;
    jl.$clinit_Object();
  };
  cggcc.Duration = function Duration() {
    cggcc.$clinit_Duration();
    Object_0.call(this);
    this.$init_212();
  };
  cggcc.currentTimeMillis = function currentTimeMillis() {
    cggcc.$clinit_Duration();
    return cggcc.now_1();
  };
  cggcc.uncheckedConversion = function uncheckedConversion(elapsed) {
    return elapsed;
  };
  defineClass(494, 1, { 1: 1 }, cggcc.Duration);
  _.$init_212 = function $init_212() {
    this.start_0 = cggcc.currentTimeMillis();
  };
  _.elapsedMillis = function elapsedMillis() {
    return cggcc.uncheckedConversion(cggcc.currentTimeMillis() - this.start_0);
  };
  _.start_0 = 0;
  cggl.Lcom_google_gwt_core_client_Duration_2_classLit = createForClass("com.google.gwt.core.client", "Duration", 494, cggl.Ljava_lang_Object_2_classLit);
  cggcc.$clinit_Scheduler$ScheduledCommand = function $clinit_Scheduler$ScheduledCommand() {
    cggcc.$clinit_Scheduler$ScheduledCommand = emptyMethod;
  };
  cggl.Lcom_google_gwt_core_client_Scheduler$ScheduledCommand_2_classLit = createForInterface("com.google.gwt.core.client", "Scheduler/ScheduledCommand");
  cggcc.$clinit_GWT$1 = function $clinit_GWT$1() {
    cggcc.$clinit_GWT$1 = emptyMethod;
  };
  defineClass(506, 1, { 1: 1 });
  cggl.Lcom_google_gwt_core_client_GWT$1_2_classLit = createForClass("com.google.gwt.core.client", "GWT/1", 506, cggl.Ljava_lang_Object_2_classLit);
  cggcc.$clinit_GWT$UncaughtExceptionHandler = function $clinit_GWT$UncaughtExceptionHandler() {
    cggcc.$clinit_GWT$UncaughtExceptionHandler = emptyMethod;
  };
  cggl.Lcom_google_gwt_core_client_GWT$UncaughtExceptionHandler_2_classLit = createForInterface("com.google.gwt.core.client", "GWT/UncaughtExceptionHandler");
  cggcc.$clinit_GWT$DefaultUncaughtExceptionHandler = function $clinit_GWT$DefaultUncaughtExceptionHandler() {
    cggcc.$clinit_GWT$DefaultUncaughtExceptionHandler = emptyMethod;
  };
  defineClass(505, 1, { 1: 1 });
  cggl.Lcom_google_gwt_core_client_GWT$DefaultUncaughtExceptionHandler_2_classLit = createForClass("com.google.gwt.core.client", "GWT/DefaultUncaughtExceptionHandler", 505, cggl.Ljava_lang_Object_2_classLit);
  cggcc.$clinit_JsArray = function $clinit_JsArray() {
    cggcc.$clinit_JsArray = emptyMethod;
    cggcc.$clinit_JavaScriptObject();
  };
  cggcc.$get = function $get(this$static, index_0) {
    cggcc.$clinit_JsArray();
    return this$static[index_0];
  };
  cggcc.$length = function $length(this$static) {
    cggcc.$clinit_JsArray();
    return this$static.length;
  };
  cggcc.$push = function $push(this$static, value_0) {
    cggcc.$clinit_JsArray();
    this$static[this$static.length] = value_0;
  };
  cggcc.$set = function $set(this$static, index_0, value_0) {
    cggcc.$clinit_JsArray();
    this$static[index_0] = value_0;
  };
  cggcc.$setLength = function $setLength(this$static, newLength) {
    this$static.length = newLength;
  };
  cggcc.$clinit_JsArrayString = function $clinit_JsArrayString() {
    cggcc.$clinit_JsArrayString = emptyMethod;
    cggcc.$clinit_JavaScriptObject();
  };
  cggcc.$get_0 = function $get_0(this$static, index_0) {
    cggcc.$clinit_JsArrayString();
    return this$static[index_0];
  };
  cggcc.$length_0 = function $length_0(this$static) {
    cggcc.$clinit_JsArrayString();
    return this$static.length;
  };
  cggcc.$setLength_0 = function $setLength_0(this$static, newLength) {
    this$static.length = newLength;
  };
  cggcc.$clinit_JsDate = function $clinit_JsDate() {
    cggcc.$clinit_JsDate = emptyMethod;
    cggcc.$clinit_JavaScriptObject();
  };
  cggcc.now_1 = function now_1() {
    cggcc.$clinit_JsDate();
    return Date.now();
  };
  cggcc.$clinit_RunAsyncCallback = function $clinit_RunAsyncCallback() {
    cggcc.$clinit_RunAsyncCallback = emptyMethod;
  };
  cggl.Lcom_google_gwt_core_client_RunAsyncCallback_2_classLit = createForInterface("com.google.gwt.core.client", "RunAsyncCallback");
  cggcc.$clinit_Scheduler = function $clinit_Scheduler() {
    cggcc.$clinit_Scheduler = emptyMethod;
    jl.$clinit_Object();
  };
  cggcc.Scheduler_0 = function Scheduler_0() {
    cggcc.$clinit_Scheduler();
    Object_0.call(this);
    this.$init_216();
  };
  cggcc.get_17 = function get_17() {
    cggcc.$clinit_Scheduler();
    return cggcci.$clinit_SchedulerImpl(), cggcci.INSTANCE;
  };
  defineClass(285, 1, { 1: 1 });
  _.$init_216 = function $init_216() {
  };
  cggl.Lcom_google_gwt_core_client_Scheduler_2_classLit = createForClass("com.google.gwt.core.client", "Scheduler", 285, cggl.Ljava_lang_Object_2_classLit);
  cggcc.$clinit_Scheduler$RepeatingCommand = function $clinit_Scheduler$RepeatingCommand() {
    cggcc.$clinit_Scheduler$RepeatingCommand = emptyMethod;
  };
  cggl.Lcom_google_gwt_core_client_Scheduler$RepeatingCommand_2_classLit = createForInterface("com.google.gwt.core.client", "Scheduler/RepeatingCommand");
  cggcc.$clinit_ScriptInjector = function $clinit_ScriptInjector() {
    cggcc.$clinit_ScriptInjector = emptyMethod;
    jl.$clinit_Object();
    cggcc.TOP_WINDOW = cggcc.nativeTopWindow();
  };
  cggcc.attachListeners = function attachListeners(scriptElement, callback, removeTag) {
    cggcc.$clinit_ScriptInjector();
    function clearCallbacks() {
      scriptElement.onerror = scriptElement.onreadystatechange = scriptElement.onload = null;
      if (removeTag) {
        cggcc.nativeRemove(scriptElement);
      }
    }
    scriptElement.onload = $entry(
      function() {
        clearCallbacks();
        if (callback) {
          callback.onSuccess(null);
        }
      }
    );
    scriptElement.onerror = $entry(
      function() {
        clearCallbacks();
        if (callback) {
          var ex = new cggcc.CodeDownloadException("onerror() called.");
          callback.onFailure(ex);
        }
      }
    );
    scriptElement.onreadystatechange = $entry(
      function() {
        if (/loaded|complete/.test(scriptElement.readyState)) {
          scriptElement.onload();
        }
      }
    );
  };
  cggcc.fromUrl = function fromUrl(scriptUrl) {
    cggcc.$clinit_ScriptInjector();
    return new cggcc.ScriptInjector$FromUrl(scriptUrl);
  };
  cggcc.nativeAttachToHead = function nativeAttachToHead(doc, scriptElement) {
    cggcc.$clinit_ScriptInjector();
    doc.head.appendChild(scriptElement);
  };
  cggcc.nativeDefaultWindow = function nativeDefaultWindow() {
    cggcc.$clinit_ScriptInjector();
    return window;
  };
  cggcc.nativeGetDocument = function nativeGetDocument(wnd) {
    cggcc.$clinit_ScriptInjector();
    return wnd.document;
  };
  cggcc.nativeMakeScriptElement = function nativeMakeScriptElement(doc) {
    cggcc.$clinit_ScriptInjector();
    return doc.createElement("script");
  };
  cggcc.nativePropagateScriptNonceIfPossible = function nativePropagateScriptNonceIfPossible(doc, element) {
    cggcc.$clinit_ScriptInjector();
    if (doc.querySelector && doc.querySelector("script[nonce]")) {
      var firstNoncedScript = doc.querySelector("script[nonce]");
      var nonce = firstNoncedScript["nonce"] || firstNoncedScript.getAttribute("nonce");
      element.setAttribute("nonce", nonce);
    }
  };
  cggcc.nativeRemove = function nativeRemove(scriptElement) {
    scriptElement.parentNode.removeChild(scriptElement);
  };
  cggcc.nativeSetSrc = function nativeSetSrc(element, url_0) {
    cggcc.$clinit_ScriptInjector();
    element.src = url_0;
  };
  cggcc.nativeTopWindow = function nativeTopWindow() {
    return $wnd;
  };
  defineClass(826, 1, { 1: 1 });
  cggl.Lcom_google_gwt_core_client_ScriptInjector_2_classLit = createForClass("com.google.gwt.core.client", "ScriptInjector", 826, cggl.Ljava_lang_Object_2_classLit);
  cggcc.$clinit_ScriptInjector$FromString = function $clinit_ScriptInjector$FromString() {
    cggcc.$clinit_ScriptInjector$FromString = emptyMethod;
  };
  defineClass(827, 1, { 1: 1 });
  cggl.Lcom_google_gwt_core_client_ScriptInjector$FromString_2_classLit = createForClass("com.google.gwt.core.client", "ScriptInjector/FromString", 827, cggl.Ljava_lang_Object_2_classLit);
  cggcc.$clinit_ScriptInjector$FromUrl = function $clinit_ScriptInjector$FromUrl() {
    cggcc.$clinit_ScriptInjector$FromUrl = emptyMethod;
    jl.$clinit_Object();
  };
  cggcc.ScriptInjector$FromUrl = function ScriptInjector$FromUrl(scriptUrl) {
    cggcc.$clinit_ScriptInjector$FromUrl();
    Object_0.call(this);
    this.$init_217();
    this.scriptUrl = scriptUrl;
  };
  defineClass(501, 1, { 1: 1 }, cggcc.ScriptInjector$FromUrl);
  _.$init_217 = function $init_217() {
    this.removeTag = false;
  };
  _.inject = function inject() {
    var doc, scriptElement, wnd;
    wnd = isNull(this.window_0) ? cggcc.nativeDefaultWindow() : this.window_0;
    doc = cggcc.nativeGetDocument(wnd);
    scriptElement = cggcc.nativeMakeScriptElement(doc);
    if (isNotNull(this.callback) || this.removeTag) {
      cggcc.attachListeners(scriptElement, this.callback, this.removeTag);
    }
    cggcc.nativeSetSrc(scriptElement, this.scriptUrl);
    cggcc.nativePropagateScriptNonceIfPossible(doc, scriptElement);
    cggcc.nativeAttachToHead(doc, scriptElement);
    return scriptElement;
  };
  _.setCallback = function setCallback(callback) {
    this.callback = callback;
    return this;
  };
  _.setRemoveTag = function setRemoveTag(removeTag) {
    this.removeTag = removeTag;
    return this;
  };
  _.removeTag = false;
  cggl.Lcom_google_gwt_core_client_ScriptInjector$FromUrl_2_classLit = createForClass("com.google.gwt.core.client", "ScriptInjector/FromUrl", 501, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_AsyncFragmentLoader = function $clinit_AsyncFragmentLoader() {
    cggcci.$clinit_AsyncFragmentLoader = emptyMethod;
    jl.$clinit_Object();
    BROWSER_LOADER = cggcci.makeBrowserLoader(1, stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, []));
  };
  function AsyncFragmentLoader(numEntries, initialLoadSequence, loadingStrategy, logger, executor) {
    var numEntriesPlusOne;
    Object_0.call(this);
    this.$init_218();
    this.numEntries = numEntries;
    this.initialLoadSequence = initialLoadSequence;
    this.loadingStrategy = loadingStrategy;
    this.logger = logger;
    this.onSuccessExecutor = executor;
    numEntriesPlusOne = numEntries + 1;
    this.allCallbacks = initUnidimensionalArray(cggl.Ljava_lang_Object_2_classLit, { 4: 1, 1: 1, 7: 1 }, 7, numEntriesPlusOne, 3, 2);
    this.requestedExclusives = new cggcci.AsyncFragmentLoader$BoundedIntQueue(numEntriesPlusOne);
    this.isLoaded = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, numEntriesPlusOne, 16, 1);
    this.pendingDownloadErrorHandlers = initUnidimensionalArray(cggl.Lcom_google_gwt_core_client_impl_AsyncFragmentLoader$LoadTerminatedHandler_2_classLit, { 4: 1, 1: 1, 7: 1 }, 249, numEntriesPlusOne, 0, 1);
  }
  cggcci.makeBrowserLoader = function makeBrowserLoader(numFragments, initialLoad) {
    if (isClient()) {
      return new AsyncFragmentLoader(numFragments, initialLoad, castTo(castTo(new cggcci.ScriptTagLoadingStrategy(), 247), 247), castTo(castTo(new cggcci.AsyncFragmentLoader$StandardLogger(), 347), 347), castTo(castTo(new cggcci.OnSuccessExecutor(), 178), 178));
    } else {
      return null;
    }
  };
  function onLoad(fragment) {
    cggcci.$clinit_AsyncFragmentLoader();
    BROWSER_LOADER.onLoadImpl(fragment);
  }
  function runAsync(fragment, callback) {
    cggcci.$clinit_AsyncFragmentLoader();
    BROWSER_LOADER.runAsyncImpl(fragment, callback);
  }
  defineClass(348, 1, { 1: 1 }, AsyncFragmentLoader);
  _.$init_218 = function $init_218() {
    this.fragmentLoading = -1;
    this.prefetching = false;
    this.prefetchQueue = null;
    this.remainingInitialFragments = null;
  };
  _.anyPrefetchesRequested = function anyPrefetchesRequested() {
    return this.prefetching && isNotNull(this.prefetchQueue) && this.prefetchQueue.size_1() > 0;
  };
  _.clearRequestsAlreadyLoaded = function clearRequestsAlreadyLoaded() {
    var offset;
    while (this.requestedExclusives.size_1() > 0 && this.isLoaded[this.requestedExclusives.peek()]) {
      offset = this.requestedExclusives.remove_1();
      if (offset < this.pendingDownloadErrorHandlers.length) {
        setCheck(this.pendingDownloadErrorHandlers, offset, null);
      }
    }
    if (isNotNull(this.prefetchQueue)) {
      while (this.prefetchQueue.size_1() > 0 && this.isLoaded[this.prefetchQueue.peek()]) {
        this.prefetchQueue.remove_1();
      }
    }
  };
  _.downloadGroup = function downloadGroup(fragment) {
    return fragment == this.leftoversFragment() ? "leftoversDownload" : cggcci.downloadGroupForExclusive(fragment);
  };
  _.executeOnSuccess0 = function executeOnSuccess0(callback) {
    callback.onSuccess_0();
  };
  _.fragmentHasLoaded = function fragmentHasLoaded(fragment) {
    this.logFragmentLoaded(fragment);
    if (fragment < this.pendingDownloadErrorHandlers.length) {
      setCheck(this.pendingDownloadErrorHandlers, fragment, null);
    }
    if (this.isInitial(fragment) && isNotNull(this.remainingInitialFragments)) {
      this.remainingInitialFragments.remove_1();
    }
    this.fragmentLoading = -1;
    this.isLoaded[fragment] = true;
    this.startLoadingNextFragment();
  };
  _.haveInitialFragmentsLoaded = function haveInitialFragmentsLoaded() {
    return isNotNull(this.remainingInitialFragments) && this.remainingInitialFragments.size_1() == 0;
  };
  _.initializeRemainingInitialFragments = function initializeRemainingInitialFragments() {
    var sp, sp$array, sp$index, sp$max;
    if (isNull(this.remainingInitialFragments)) {
      this.remainingInitialFragments = new cggcci.AsyncFragmentLoader$BoundedIntQueue(this.initialLoadSequence.length + 1);
      for (sp$array = this.initialLoadSequence, sp$index = 0, sp$max = sp$array.length; sp$index < sp$max; ++sp$index) {
        sp = sp$array[sp$index];
        this.remainingInitialFragments.add_4(sp);
      }
      this.remainingInitialFragments.add_4(this.leftoversFragment());
    }
  };
  _.inject_0 = function inject_0(splitPoint, loadErrorHandler) {
    setCheck(this.pendingDownloadErrorHandlers, splitPoint, loadErrorHandler);
    if (!this.isInitial(splitPoint)) {
      this.requestedExclusives.add_4(splitPoint);
    }
    this.startLoadingNextFragment();
  };
  _.isEmpty_1 = function isEmpty_3(array) {
    var i;
    for (i = 0; i < array.length; i++) {
      if (jsNotEquals(array[i], null)) {
        return false;
      }
    }
    return true;
  };
  _.isInitial = function isInitial(splitPoint) {
    var sp, sp$array, sp$index, sp$max;
    if (splitPoint == this.leftoversFragment()) {
      return true;
    }
    for (sp$array = this.initialLoadSequence, sp$index = 0, sp$max = sp$array.length; sp$index < sp$max; ++sp$index) {
      sp = sp$array[sp$index];
      if (sp == splitPoint) {
        return true;
      }
    }
    return false;
  };
  _.isLoading = function isLoading(splitPoint) {
    return isNotNull(this.pendingDownloadErrorHandlers[splitPoint]);
  };
  _.leftoversFragment = function leftoversFragment() {
    return this.numEntries;
  };
  _.logDownloadStart = function logDownloadStart(fragment) {
    this.logEventProgress_0(this.downloadGroup(fragment), "begin", fragment, -1);
  };
  _.logEventProgress = function logEventProgress(eventGroup, type_0) {
    this.logEventProgress_0(eventGroup, type_0, -1, -1);
  };
  _.logEventProgress_0 = function logEventProgress_0(eventGroup, type_0, fragment, size_0) {
    this.logger.logEventProgress_1(eventGroup, type_0, fragment, size_0);
  };
  _.logFragmentLoaded = function logFragmentLoaded(fragment) {
    var logGroup;
    logGroup = this.downloadGroup(fragment);
    this.logEventProgress_0(logGroup, "end", fragment, -1);
  };
  _.onLoadImpl = function onLoadImpl(fragment) {
    var callback, callback$array, callback$index, callback$max, callbacks, t;
    this.fragmentHasLoaded(fragment);
    callbacks = this.allCallbacks[fragment];
    if (jsNotEquals(callbacks, null)) {
      this.logEventProgress("runCallbacks" + fragment, "begin");
      setCheck(this.allCallbacks, fragment, null);
      for (callback$array = callbacks, callback$index = 0, callback$max = callback$array.length; callback$index < callback$max; ++callback$index) {
        callback = callback$array[callback$index];
        try {
          castTo(callback, 344).onSuccess_0();
        } catch ($e0) {
          $e0 = toJava($e0);
          if (instanceOf($e0, 18)) {
            t = $e0;
            reportUncaughtException(t);
          } else
            throw toJs($e0);
        }
      }
      this.logEventProgress("runCallbacks" + fragment, "end");
    }
  };
  _.runAsyncImpl = function runAsyncImpl(fragment, callback) {
    var callbacks;
    if (this.isLoaded[fragment]) {
      this.onSuccessExecutor.execute_1(this, callback);
      return;
    }
    callbacks = this.allCallbacks[fragment];
    if (jsEquals(callbacks, null)) {
      callbacks = setCheck(this.allCallbacks, fragment, initUnidimensionalArray(cggl.Lcom_google_gwt_core_client_RunAsyncCallback_2_classLit, { 4: 1, 1: 1, 7: 1 }, 344, 0, 0, 1));
    }
    setCheck(callbacks, callbacks.length, callback);
    if (!this.isLoading(fragment)) {
      this.inject_0(fragment, new cggcci.AsyncFragmentLoader$1(this, fragment));
    }
  };
  _.startLoadingFragment = function startLoadingFragment(fragment) {
    this.fragmentLoading = fragment;
    this.logDownloadStart(fragment);
    this.loadingStrategy.startLoadingFragment_0(fragment, new cggcci.AsyncFragmentLoader$ResetAfterDownloadFailure(this, fragment));
  };
  _.startLoadingNextFragment = function startLoadingNextFragment() {
    if (this.fragmentLoading >= 0) {
      return;
    }
    this.initializeRemainingInitialFragments();
    this.clearRequestsAlreadyLoaded();
    if (this.isEmpty_1(this.pendingDownloadErrorHandlers) && !this.anyPrefetchesRequested()) {
      return;
    }
    if (this.remainingInitialFragments.size_1() > 0) {
      this.startLoadingFragment(this.remainingInitialFragments.peek());
      return;
    }
    if (this.requestedExclusives.size_1() > 0) {
      this.startLoadingFragment(this.requestedExclusives.remove_1());
      return;
    }
    if (this.anyPrefetchesRequested()) {
      this.startLoadingFragment(this.prefetchQueue.remove_1());
      return;
    }
  };
  _.fragmentLoading = 0;
  _.numEntries = 0;
  _.prefetching = false;
  var BROWSER_LOADER;
  cggl.Lcom_google_gwt_core_client_impl_AsyncFragmentLoader_2_classLit = createForClass("com.google.gwt.core.client.impl", "AsyncFragmentLoader", 348, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_AsyncFragmentLoader$LoadTerminatedHandler = function $clinit_AsyncFragmentLoader$LoadTerminatedHandler() {
    cggcci.$clinit_AsyncFragmentLoader$LoadTerminatedHandler = emptyMethod;
  };
  cggl.Lcom_google_gwt_core_client_impl_AsyncFragmentLoader$LoadTerminatedHandler_2_classLit = createForInterface("com.google.gwt.core.client.impl", "AsyncFragmentLoader/LoadTerminatedHandler");
  cggcci.$clinit_AsyncFragmentLoader$1 = function $clinit_AsyncFragmentLoader$1() {
    cggcci.$clinit_AsyncFragmentLoader$1 = emptyMethod;
    jl.$clinit_Object();
  };
  cggcci.AsyncFragmentLoader$1 = function AsyncFragmentLoader$1(this$0, val$fragment) {
    cggcci.$clinit_AsyncFragmentLoader$1();
    this.this$01 = this$0;
    this.val$fragment2 = val$fragment;
    Object_0.call(this);
    this.$init_219();
  };
  defineClass(349, 1, { 249: 1, 1: 1 }, cggcci.AsyncFragmentLoader$1);
  _.$init_219 = function $init_219() {
  };
  _.loadTerminated = function loadTerminated(reason) {
    var callback, callback$array, callback$index, callback$max, callbacks;
    callbacks = this.this$01.allCallbacks[this.val$fragment2];
    if (jsNotEquals(callbacks, null)) {
      setCheck(this.this$01.allCallbacks, this.val$fragment2, null);
      for (callback$array = callbacks, callback$index = 0, callback$max = callback$array.length; callback$index < callback$max; ++callback$index) {
        callback = callback$array[callback$index];
        castTo(callback, 344).onFailure_0(reason);
      }
    }
  };
  _.val$fragment2 = 0;
  cggl.Lcom_google_gwt_core_client_impl_AsyncFragmentLoader$1_2_classLit = createForClass("com.google.gwt.core.client.impl", "AsyncFragmentLoader/1", 349, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_AsyncFragmentLoader$BoundedIntQueue = function $clinit_AsyncFragmentLoader$BoundedIntQueue() {
    cggcci.$clinit_AsyncFragmentLoader$BoundedIntQueue = emptyMethod;
    jl.$clinit_Object();
  };
  cggcci.AsyncFragmentLoader$BoundedIntQueue = function AsyncFragmentLoader$BoundedIntQueue(maxPuts) {
    cggcci.$clinit_AsyncFragmentLoader$BoundedIntQueue();
    Object_0.call(this);
    this.$init_220();
    this.array = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, maxPuts, 15, 1);
  };
  defineClass(248, 1, { 1: 1 }, cggcci.AsyncFragmentLoader$BoundedIntQueue);
  _.$init_220 = function $init_220() {
    this.read = 0;
    this.write_0 = 0;
  };
  _.add_4 = function add_18(x_0) {
    this.array[this.write_0++] = x_0;
  };
  _.clear_0 = function clear_10() {
    this.read = 0;
    this.write_0 = 0;
  };
  _.peek = function peek() {
    return this.array[this.read];
  };
  _.remove_1 = function remove_5() {
    return this.array[this.read++];
  };
  _.size_1 = function size_6() {
    return this.write_0 - this.read;
  };
  _.read = 0;
  _.write_0 = 0;
  cggl.Lcom_google_gwt_core_client_impl_AsyncFragmentLoader$BoundedIntQueue_2_classLit = createForClass("com.google.gwt.core.client.impl", "AsyncFragmentLoader/BoundedIntQueue", 248, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_AsyncFragmentLoader$HttpDownloadFailure = function $clinit_AsyncFragmentLoader$HttpDownloadFailure() {
    cggcci.$clinit_AsyncFragmentLoader$HttpDownloadFailure = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  cggcci.AsyncFragmentLoader$HttpDownloadFailure = function AsyncFragmentLoader$HttpDownloadFailure(url_0, statusCode, statusText) {
    cggcci.$clinit_AsyncFragmentLoader$HttpDownloadFailure();
    jl.RuntimeException_1.call(this, "Download of " + url_0 + " failed with status " + statusCode + "(" + statusText + ")");
    this.$init_221();
    this.statusCode = statusCode;
  };
  defineClass(351, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, cggcci.AsyncFragmentLoader$HttpDownloadFailure);
  _.$init_221 = function $init_221() {
  };
  _.statusCode = 0;
  cggl.Lcom_google_gwt_core_client_impl_AsyncFragmentLoader$HttpDownloadFailure_2_classLit = createForClass("com.google.gwt.core.client.impl", "AsyncFragmentLoader/HttpDownloadFailure", 351, cggl.Ljava_lang_RuntimeException_2_classLit);
  cggcci.$clinit_AsyncFragmentLoader$HttpInstallFailure = function $clinit_AsyncFragmentLoader$HttpInstallFailure() {
    cggcci.$clinit_AsyncFragmentLoader$HttpInstallFailure = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  cggcci.AsyncFragmentLoader$HttpInstallFailure = function AsyncFragmentLoader$HttpInstallFailure(url_0, text_0, rootCause) {
    cggcci.$clinit_AsyncFragmentLoader$HttpInstallFailure();
    jl.RuntimeException_2.call(this, "Install of " + url_0 + " failed with text " + text_0, rootCause);
    this.$init_222();
  };
  defineClass(352, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, cggcci.AsyncFragmentLoader$HttpInstallFailure);
  _.$init_222 = function $init_222() {
  };
  cggl.Lcom_google_gwt_core_client_impl_AsyncFragmentLoader$HttpInstallFailure_2_classLit = createForClass("com.google.gwt.core.client.impl", "AsyncFragmentLoader/HttpInstallFailure", 352, cggl.Ljava_lang_RuntimeException_2_classLit);
  cggcci.$clinit_AsyncFragmentLoader$LoadingStrategy = function $clinit_AsyncFragmentLoader$LoadingStrategy() {
    cggcci.$clinit_AsyncFragmentLoader$LoadingStrategy = emptyMethod;
  };
  cggl.Lcom_google_gwt_core_client_impl_AsyncFragmentLoader$LoadingStrategy_2_classLit = createForInterface("com.google.gwt.core.client.impl", "AsyncFragmentLoader/LoadingStrategy");
  cggcci.$clinit_AsyncFragmentLoader$Logger = function $clinit_AsyncFragmentLoader$Logger() {
    cggcci.$clinit_AsyncFragmentLoader$Logger = emptyMethod;
  };
  cggl.Lcom_google_gwt_core_client_impl_AsyncFragmentLoader$Logger_2_classLit = createForInterface("com.google.gwt.core.client.impl", "AsyncFragmentLoader/Logger");
  cggcci.$clinit_AsyncFragmentLoader$LwmLabels = function $clinit_AsyncFragmentLoader$LwmLabels() {
    cggcci.$clinit_AsyncFragmentLoader$LwmLabels = emptyMethod;
    jl.$clinit_Object();
  };
  cggcci.downloadGroupForExclusive = function downloadGroupForExclusive(splitPoint) {
    cggcci.$clinit_AsyncFragmentLoader$LwmLabels();
    return "download" + splitPoint;
  };
  defineClass(596, 1, { 1: 1 });
  cggcci.BEGIN = "begin";
  cggcci.END = "end";
  cggcci.LEFTOVERS_DOWNLOAD = "leftoversDownload";
  cggl.Lcom_google_gwt_core_client_impl_AsyncFragmentLoader$LwmLabels_2_classLit = createForClass("com.google.gwt.core.client.impl", "AsyncFragmentLoader/LwmLabels", 596, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_AsyncFragmentLoader$ResetAfterDownloadFailure = function $clinit_AsyncFragmentLoader$ResetAfterDownloadFailure() {
    cggcci.$clinit_AsyncFragmentLoader$ResetAfterDownloadFailure = emptyMethod;
    jl.$clinit_Object();
  };
  cggcci.AsyncFragmentLoader$ResetAfterDownloadFailure = function AsyncFragmentLoader$ResetAfterDownloadFailure(this$0, myFragment) {
    cggcci.$clinit_AsyncFragmentLoader$ResetAfterDownloadFailure();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_223();
    this.fragment_0 = myFragment;
  };
  defineClass(350, 1, { 249: 1, 1: 1 }, cggcci.AsyncFragmentLoader$ResetAfterDownloadFailure);
  _.$init_223 = function $init_223() {
  };
  _.loadTerminated = function loadTerminated_0(reason) {
    var e, handler, handler$array, handler$index, handler$max, handlersToRun, lastException;
    if (this.this$01.fragmentLoading != this.fragment_0) {
      return;
    }
    handlersToRun = this.this$01.pendingDownloadErrorHandlers;
    this.this$01.pendingDownloadErrorHandlers = initUnidimensionalArray(cggl.Lcom_google_gwt_core_client_impl_AsyncFragmentLoader$LoadTerminatedHandler_2_classLit, { 4: 1, 1: 1, 7: 1 }, 249, this.this$01.numEntries + 1, 0, 1);
    this.this$01.requestedExclusives.clear_0();
    this.this$01.fragmentLoading = -1;
    lastException = null;
    for (handler$array = handlersToRun, handler$index = 0, handler$max = handler$array.length; handler$index < handler$max; ++handler$index) {
      handler = handler$array[handler$index];
      if (isNotNull(handler)) {
        try {
          handler.loadTerminated(reason);
        } catch ($e0) {
          $e0 = toJava($e0);
          if (instanceOf($e0, 23)) {
            e = $e0;
            lastException = e;
          } else
            throw toJs($e0);
        }
      }
    }
    if (isNotNull(lastException)) {
      throw toJs(lastException);
    }
  };
  _.fragment_0 = 0;
  cggl.Lcom_google_gwt_core_client_impl_AsyncFragmentLoader$ResetAfterDownloadFailure_2_classLit = createForClass("com.google.gwt.core.client.impl", "AsyncFragmentLoader/ResetAfterDownloadFailure", 350, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_AsyncFragmentLoader$StandardLogger = function $clinit_AsyncFragmentLoader$StandardLogger() {
    cggcci.$clinit_AsyncFragmentLoader$StandardLogger = emptyMethod;
    jl.$clinit_Object();
  };
  cggcci.AsyncFragmentLoader$StandardLogger = function AsyncFragmentLoader$StandardLogger() {
    cggcci.$clinit_AsyncFragmentLoader$StandardLogger();
    Object_0.call(this);
    this.$init_224();
  };
  cggcci.stats = function stats(data_0) {
    return $stats(data_0);
  };
  defineClass(346, 1, { 347: 1, 1: 1 }, cggcci.AsyncFragmentLoader$StandardLogger);
  _.$init_224 = function $init_224() {
  };
  _.createStatsEvent = function createStatsEvent(eventGroup, type_0, fragment, size_0) {
    var evt = { moduleName: getModuleName(), sessionId: $sessionId, subSystem: "runAsync", evtGroup: eventGroup, millis: (/* @__PURE__ */ new Date()).getTime(), type: type_0 };
    if (fragment >= 0) {
      evt.fragment = fragment;
    }
    if (size_0 >= 0) {
      evt.size = size_0;
    }
    return evt;
  };
  _.isStatsAvailable = function isStatsAvailable() {
    return !!$stats;
  };
  _.logEventProgress_1 = function logEventProgress_1(eventGroup, type_0, fragment, size_0) {
    var toss;
    toss = this.isStatsAvailable() && cggcci.stats(this.createStatsEvent(eventGroup, type_0, fragment, size_0));
  };
  cggl.Lcom_google_gwt_core_client_impl_AsyncFragmentLoader$StandardLogger_2_classLit = createForClass("com.google.gwt.core.client.impl", "AsyncFragmentLoader/StandardLogger", 346, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_Impl = function $clinit_Impl() {
    cggcci.$clinit_Impl = emptyMethod;
    jl.$clinit_Object();
    {
      if (isScript() && isNotNull((cggcci.$clinit_StackTraceCreator(), cggcci.collector_1))) {
      }
    }
    watchdogEntryDepthTimerId = -1;
  };
  cggcci.apply_1 = function apply_1(jsFunction, thisObj, args) {
    if (isScript()) {
      return jsFunction.apply(thisObj, args);
    } else {
      var __0 = jsFunction.apply(thisObj, args);
      if (__0 != null) {
        __0 = { val: __0 };
      }
      return __0;
    }
  };
  cggcci.enter = function enter() {
    var now_0;
    if (isScript() && entryDepth != 0) {
      now_0 = cggcc.currentTimeMillis();
      if (now_0 - watchdogEntryDepthLastScheduled > 2e3) {
        watchdogEntryDepthLastScheduled = now_0;
        watchdogEntryDepthTimerId = cggcci.watchdogEntryDepthSchedule();
      }
    }
    if (entryDepth++ == 0) {
      (cggcci.$clinit_SchedulerImpl(), cggcci.INSTANCE).flushEntryCommands();
      return true;
    }
    return false;
  };
  function entry_0(jsFunction) {
    cggcci.$clinit_Impl();
    return function() {
      if (isScript()) {
        return cggcci.entry0(jsFunction, this, arguments);
      } else {
        var __0 = cggcci.entry0(jsFunction, this, arguments);
        if (__0 != null) {
          __0 = __0.val;
        }
        return __0;
      }
    };
  }
  cggcci.entry0 = function entry0(jsFunction, thisObj, args) {
    var initialEntry, t;
    initialEntry = cggcci.enter();
    try {
      if (isNotNull(getUncaughtExceptionHandler())) {
        try {
          return cggcci.apply_1(jsFunction, thisObj, args);
        } catch ($e0) {
          $e0 = toJava($e0);
          if (instanceOf($e0, 18)) {
            t = $e0;
            reportUncaughtException_0(t);
            return cggcci.undefined_0();
          } else
            throw toJs($e0);
        }
      } else {
        return cggcci.apply_1(jsFunction, thisObj, args);
      }
    } finally {
      cggcci.exit(initialEntry);
    }
  };
  cggcci.exit = function exit(initialEntry) {
    if (initialEntry) {
      (cggcci.$clinit_SchedulerImpl(), cggcci.INSTANCE).flushFinallyCommands();
    }
    entryDepth--;
    if (initialEntry) {
      if (isScript() && watchdogEntryDepthTimerId != -1) {
        cggcci.watchdogEntryDepthCancel(watchdogEntryDepthTimerId);
        watchdogEntryDepthTimerId = -1;
      }
    }
  };
  function getModuleName_0() {
    cggcci.$clinit_Impl();
    return $moduleName;
  }
  function getNameOf(jsniIdent) {
    cggcci.$clinit_Impl();
    throw toJs(new jl.UnsupportedOperationException_0("Impl.getNameOf() is unimplemented in Development Mode"));
  }
  function registerEntry() {
    cggcci.$clinit_Impl();
    if (isScript()) {
      return entry_0;
    } else {
      return $entry = entry_0;
    }
  }
  cggcci.reportToBrowser = function reportToBrowser(e) {
    $wnd.setTimeout(
      function() {
        throw e;
      },
      0
    );
  };
  cggcci.reportToBrowser_0 = function reportToBrowser_0(e) {
    cggcci.reportToBrowser(instanceOf(e, 159) ? castTo(e, 159).getThrown() : e);
  };
  function reportUncaughtException_0(e) {
    cggcci.$clinit_Impl();
    cggcci.reportUncaughtException_1(e, true);
  }
  cggcci.reportUncaughtException_1 = function reportUncaughtException_1(e, reportSwallowedExceptionToBrowser) {
    var handler;
    if (isNotNull(uncaughtExceptionHandlerForTest)) {
      uncaughtExceptionHandlerForTest.onUncaughtException(e);
    }
    handler = getUncaughtExceptionHandler();
    if (isNotNull(handler)) {
      if (jsEquals(handler, uncaughtExceptionHandlerForTest)) {
        return;
      }
      handler.onUncaughtException(e);
      return;
    }
    if (isClient() && reportSwallowedExceptionToBrowser) {
      cggcci.reportToBrowser_0(e);
    } else {
      (jl.$clinit_System(), jl.err).print_1("Uncaught exception ");
      e.printStackTrace_0((jl.$clinit_System(), jl.err));
    }
  };
  cggcci.undefined_0 = function undefined_0() {
    return;
  };
  cggcci.watchdogEntryDepthCancel = function watchdogEntryDepthCancel(timerId) {
    $wnd.clearTimeout(timerId);
  };
  cggcci.watchdogEntryDepthRun = function watchdogEntryDepthRun() {
    if (isScript() && entryDepth != 0) {
      entryDepth = 0;
    }
    watchdogEntryDepthTimerId = -1;
  };
  cggcci.watchdogEntryDepthSchedule = function watchdogEntryDepthSchedule() {
    return $wnd.setTimeout(cggcci.watchdogEntryDepthRun, 10);
  };
  defineClass(597, 1, { 1: 1 });
  var WATCHDOG_ENTRY_DEPTH_CHECK_INTERVAL_MS = 2e3;
  var entryDepth = 0;
  var uncaughtExceptionHandlerForTest;
  var watchdogEntryDepthLastScheduled = 0;
  var watchdogEntryDepthTimerId = 0;
  cggl.Lcom_google_gwt_core_client_impl_Impl_2_classLit = createForClass("com.google.gwt.core.client.impl", "Impl", 597, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_LoadingStrategyBase = function $clinit_LoadingStrategyBase() {
    cggcci.$clinit_LoadingStrategyBase = emptyMethod;
    jl.$clinit_Object();
  };
  cggcci.LoadingStrategyBase = function LoadingStrategyBase(downloadStrategy) {
    cggcci.$clinit_LoadingStrategyBase();
    Object_0.call(this);
    this.$init_225();
    this.downloadStrategy = downloadStrategy;
  };
  cggcci.gwtInstallCode = function gwtInstallCode(text_0) {
    cggcci.$clinit_LoadingStrategyBase();
    __gwtInstallCode(text_0);
  };
  cggcci.gwtStartLoadingFragment = function gwtStartLoadingFragment(fragment, loadErrorHandler) {
    function loadFailed(e) {
      loadErrorHandler.loadTerminated(e);
    }
    return __gwtStartLoadingFragment(fragment, $entry(loadFailed));
  };
  defineClass(444, 1, { 247: 1, 1: 1 });
  _.$init_225 = function $init_225() {
    this.manualRetryNumbers = cggcci.create_1();
  };
  _.getManualRetryNum = function getManualRetryNum(fragment) {
    var ser;
    ser = cggcci.$get_1(this.manualRetryNumbers, fragment);
    cggcci.$put(this.manualRetryNumbers, fragment, ser + 1);
    return ser;
  };
  _.getMaxAutoRetryCount = function getMaxAutoRetryCount() {
    return cggcci.MAX_AUTO_RETRY_COUNT;
  };
  _.startLoadingFragment_0 = function startLoadingFragment_0(fragment, loadErrorHandler) {
    var connector, manualRetry, request, url_0;
    url_0 = cggcci.gwtStartLoadingFragment(fragment, loadErrorHandler);
    if (jsEquals(url_0, null)) {
      return;
    }
    manualRetry = this.getManualRetryNum(fragment);
    if (manualRetry > 0) {
      connector = jl.contains_Ljava_lang_CharSequence__Z__devirtual$(url_0, "?") ? 38 : 63;
      url_0 += charToString(connector) + "manualRetry=" + manualRetry;
    }
    request = new cggcci.LoadingStrategyBase$RequestData(url_0, loadErrorHandler, fragment, this.downloadStrategy, this.getMaxAutoRetryCount());
    request.tryDownload_0();
  };
  cggcci.MAX_AUTO_RETRY_COUNT = 3;
  cggl.Lcom_google_gwt_core_client_impl_LoadingStrategyBase_2_classLit = createForClass("com.google.gwt.core.client.impl", "LoadingStrategyBase", 444, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_LoadingStrategyBase$DownloadStrategy = function $clinit_LoadingStrategyBase$DownloadStrategy() {
    cggcci.$clinit_LoadingStrategyBase$DownloadStrategy = emptyMethod;
  };
  cggl.Lcom_google_gwt_core_client_impl_LoadingStrategyBase$DownloadStrategy_2_classLit = createForInterface("com.google.gwt.core.client.impl", "LoadingStrategyBase/DownloadStrategy");
  cggcci.$clinit_LoadingStrategyBase$FragmentReloadTracker = function $clinit_LoadingStrategyBase$FragmentReloadTracker() {
    cggcci.$clinit_LoadingStrategyBase$FragmentReloadTracker = emptyMethod;
    cggcc.$clinit_JavaScriptObject();
  };
  cggcci.$get_1 = function $get_1(this$static, x_0) {
    cggcci.$clinit_LoadingStrategyBase$FragmentReloadTracker();
    return this$static[x_0] ? this$static[x_0] : 0;
  };
  cggcci.$put = function $put(this$static, x_0, y_0) {
    cggcci.$clinit_LoadingStrategyBase$FragmentReloadTracker();
    this$static[x_0] = y_0;
  };
  cggcci.create_1 = function create_1() {
    cggcci.$clinit_LoadingStrategyBase$FragmentReloadTracker();
    return cggcc.createArray();
  };
  cggcci.$clinit_LoadingStrategyBase$RequestData = function $clinit_LoadingStrategyBase$RequestData() {
    cggcci.$clinit_LoadingStrategyBase$RequestData = emptyMethod;
    jl.$clinit_Object();
  };
  cggcci.LoadingStrategyBase$RequestData = function LoadingStrategyBase$RequestData(url_0, errorHandler, fragment, downloadStrategy, maxRetryCount) {
    cggcci.$clinit_LoadingStrategyBase$RequestData();
    Object_0.call(this);
    this.$init_226();
    this.url_0 = url_0;
    this.originalUrl = url_0;
    this.errorHandler = errorHandler;
    this.maxRetryCount = maxRetryCount;
    this.retryCount = 0;
    this.fragment_0 = fragment;
    this.downloadStrategy = downloadStrategy;
  };
  defineClass(447, 1, { 1: 1 }, cggcci.LoadingStrategyBase$RequestData);
  _.$init_226 = function $init_226() {
    this.errorHandler = null;
  };
  _.getFragment_2 = function getFragment_3() {
    return this.fragment_0;
  };
  _.getUrl = function getUrl() {
    return this.url_0;
  };
  _.onLoadError = function onLoadError(e, mayRetry) {
    var connector;
    if (mayRetry) {
      this.retryCount++;
      if (this.retryCount <= this.maxRetryCount) {
        connector = jl.contains_Ljava_lang_CharSequence__Z__devirtual$(this.originalUrl, "?") ? 38 : 63;
        this.url_0 = this.originalUrl + charToString(connector) + "autoRetry=" + this.retryCount;
        this.downloadStrategy.tryDownload(this);
        return;
      }
    }
    this.errorHandler.loadTerminated(e);
  };
  _.tryDownload_0 = function tryDownload() {
    this.downloadStrategy.tryDownload(this);
  };
  _.tryInstall = function tryInstall(code_0) {
    var e, textIntro;
    try {
      cggcci.gwtInstallCode(code_0);
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 23)) {
        e = $e0;
        textIntro = code_0;
        if (jsNotEquals(textIntro, null) && jl.length__I__devirtual$_0(textIntro) > 200) {
          textIntro = jl.substring_II_Ljava_lang_String___devirtual$(textIntro, 0, 200) + "...";
        }
        this.onLoadError(new cggcci.AsyncFragmentLoader$HttpInstallFailure(this.url_0, textIntro, e), false);
      } else
        throw toJs($e0);
    }
  };
  _.fragment_0 = 0;
  _.maxRetryCount = 0;
  _.retryCount = 0;
  cggcci.MAX_LOG_LENGTH = 200;
  cggl.Lcom_google_gwt_core_client_impl_LoadingStrategyBase$RequestData_2_classLit = createForClass("com.google.gwt.core.client.impl", "LoadingStrategyBase/RequestData", 447, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_OnSuccessExecutor = function $clinit_OnSuccessExecutor() {
    cggcci.$clinit_OnSuccessExecutor = emptyMethod;
    jl.$clinit_Object();
  };
  cggcci.OnSuccessExecutor = function OnSuccessExecutor() {
    cggcci.$clinit_OnSuccessExecutor();
    Object_0.call(this);
    this.$init_227();
  };
  defineClass(178, 1, { 178: 1, 1: 1 }, cggcci.OnSuccessExecutor);
  _.$init_227 = function $init_227() {
  };
  _.execute_1 = function execute(fragmentLoader, callback) {
    cggcc.get_17().scheduleDeferred(new cggcci.OnSuccessExecutor$1(this, fragmentLoader, callback));
  };
  cggl.Lcom_google_gwt_core_client_impl_OnSuccessExecutor_2_classLit = createForClass("com.google.gwt.core.client.impl", "OnSuccessExecutor", 178, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_OnSuccessExecutor$1 = function $clinit_OnSuccessExecutor$1() {
    cggcci.$clinit_OnSuccessExecutor$1 = emptyMethod;
    jl.$clinit_Object();
  };
  cggcci.OnSuccessExecutor$1 = function OnSuccessExecutor$1(this$0, val$fragmentLoader, val$callback) {
    cggcci.$clinit_OnSuccessExecutor$1();
    this.this$01 = this$0;
    this.val$fragmentLoader2 = val$fragmentLoader;
    this.val$callback3 = val$callback;
    Object_0.call(this);
    this.$init_228();
  };
  defineClass(448, 1, { 1: 1 }, cggcci.OnSuccessExecutor$1);
  _.$init_228 = function $init_228() {
  };
  _.execute_0 = function execute_0() {
    this.val$fragmentLoader2.executeOnSuccess0(this.val$callback3);
  };
  cggl.Lcom_google_gwt_core_client_impl_OnSuccessExecutor$1_2_classLit = createForClass("com.google.gwt.core.client.impl", "OnSuccessExecutor/1", 448, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_SchedulerImpl = function $clinit_SchedulerImpl() {
    cggcci.$clinit_SchedulerImpl = emptyMethod;
    cggcc.$clinit_Scheduler();
    cggcci.INSTANCE = castTo(new cggcci.SchedulerImpl(), 221);
  };
  cggcci.SchedulerImpl = function SchedulerImpl() {
    cggcc.Scheduler_0.call(this);
    this.$init_229();
  };
  cggcci.createQueue = function createQueue() {
    return cggcc.$cast(cggcc.createArray());
  };
  cggcci.execute_1 = function execute_1(cmd) {
    return cmd.execute();
  };
  cggcci.push_0 = function push_0(queue, task) {
    if (isNull(queue)) {
      queue = cggcci.createQueue();
    }
    cggcc.$push(queue, task);
    return queue;
  };
  cggcci.runScheduledTasks = function runScheduledTasks(tasks, rescheduled) {
    var e, i, j, t;
    for (i = 0, j = cggcc.$length(tasks); i < j; i++) {
      t = cggcc.$get(tasks, i);
      try {
        if (cggcci.$isRepeating(t)) {
          if (cggcci.$executeRepeating(t)) {
            rescheduled = cggcci.push_0(rescheduled, t);
          }
        } else {
          cggcci.$executeScheduled(t);
        }
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 18)) {
          e = $e0;
          reportUncaughtException(e);
        } else
          throw toJs($e0);
      }
    }
    return rescheduled;
  };
  cggcci.scheduleFixedDelayImpl = function scheduleFixedDelayImpl(cmd, delayMs) {
    function callback() {
      var ret = $entry(cggcci.execute_1)(cmd);
      if (!isScript()) {
        ret = ret == true;
      }
      if (ret) {
        $wnd.setTimeout(callback, delayMs);
      }
    }
    $wnd.setTimeout(callback, delayMs);
  };
  defineClass(221, 285, { 221: 1, 1: 1 }, cggcci.SchedulerImpl);
  _.$init_229 = function $init_229() {
    this.flushRunning = false;
    this.shouldBeRunning = false;
  };
  _.createDuration = function createDuration() {
    return new cggcc.Duration();
  };
  _.flushEntryCommands = function flushEntryCommands() {
    var oldQueue, rescheduled;
    if (isNotNull(this.entryCommands)) {
      rescheduled = null;
      do {
        oldQueue = this.entryCommands;
        this.entryCommands = null;
        rescheduled = cggcci.runScheduledTasks(oldQueue, rescheduled);
      } while (isNotNull(this.entryCommands));
      this.entryCommands = rescheduled;
    }
  };
  _.flushFinallyCommands = function flushFinallyCommands() {
    var oldQueue, rescheduled;
    if (isNotNull(this.finallyCommands)) {
      rescheduled = null;
      do {
        oldQueue = this.finallyCommands;
        this.finallyCommands = null;
        rescheduled = cggcci.runScheduledTasks(oldQueue, rescheduled);
      } while (isNotNull(this.finallyCommands));
      this.finallyCommands = rescheduled;
    }
  };
  _.flushPostEventPumpCommands = function flushPostEventPumpCommands() {
    var oldDeferred;
    if (isNotNull(this.deferredCommands)) {
      oldDeferred = this.deferredCommands;
      this.deferredCommands = null;
      if (isNull(this.incrementalCommands)) {
        this.incrementalCommands = cggcci.createQueue();
      }
      cggcci.runScheduledTasks(oldDeferred, this.incrementalCommands);
    }
    if (isNotNull(this.incrementalCommands)) {
      this.incrementalCommands = this.runRepeatingTasks(this.incrementalCommands);
    }
  };
  _.isWorkQueued = function isWorkQueued() {
    return isNotNull(this.deferredCommands) || isNotNull(this.incrementalCommands);
  };
  _.maybeSchedulePostEventPumpCommands = function maybeSchedulePostEventPumpCommands() {
    if (!this.shouldBeRunning) {
      this.shouldBeRunning = true;
      if (isNull(this.flusher)) {
        this.flusher = new cggcci.SchedulerImpl$Flusher(this);
      }
      cggcci.scheduleFixedDelayImpl(this.flusher, 1);
      if (isNull(this.rescue)) {
        this.rescue = new cggcci.SchedulerImpl$Rescuer(this);
      }
      cggcci.scheduleFixedDelayImpl(this.rescue, 50);
    }
  };
  _.runRepeatingTasks = function runRepeatingTasks(tasks) {
    var canceledSomeTasks, duration, executedSomeTask, i, length_0, newTasks, t;
    length_0 = cggcc.$length(tasks);
    if (length_0 == 0) {
      return null;
    }
    canceledSomeTasks = false;
    duration = this.createDuration();
    while (duration.elapsedMillis() < 16) {
      executedSomeTask = false;
      for (i = 0; i < length_0; i++) {
        t = cggcc.$get(tasks, i);
        if (isNull(t)) {
          continue;
        }
        executedSomeTask = true;
        if (!cggcci.$executeRepeating(t)) {
          cggcc.$set(tasks, i, null);
          canceledSomeTasks = true;
        }
      }
      if (!executedSomeTask) {
        break;
      }
    }
    if (canceledSomeTasks) {
      newTasks = cggcci.createQueue();
      for (i = 0; i < length_0; i++) {
        if (isNotNull(cggcc.$get(tasks, i))) {
          cggcc.$push(newTasks, cggcc.$get(tasks, i));
        }
      }
      return cggcc.$length(newTasks) == 0 ? null : newTasks;
    } else {
      return tasks;
    }
  };
  _.scheduleDeferred = function scheduleDeferred(cmd) {
    this.deferredCommands = cggcci.push_0(this.deferredCommands, cggcci.create_2(cmd));
    this.maybeSchedulePostEventPumpCommands();
  };
  _.scheduleFixedDelay = function scheduleFixedDelay(cmd, delayMs) {
    cggcci.scheduleFixedDelayImpl(cmd, delayMs);
  };
  _.flushRunning = false;
  _.shouldBeRunning = false;
  cggcci.FLUSHER_DELAY = 1;
  cggcci.RESCUE_DELAY = 50;
  cggcci.TIME_SLICE = 16;
  cggl.Lcom_google_gwt_core_client_impl_SchedulerImpl_2_classLit = createForClass("com.google.gwt.core.client.impl", "SchedulerImpl", 221, cggl.Lcom_google_gwt_core_client_Scheduler_2_classLit);
  cggcci.$clinit_SchedulerImpl$Flusher = function $clinit_SchedulerImpl$Flusher() {
    cggcci.$clinit_SchedulerImpl$Flusher = emptyMethod;
    jl.$clinit_Object();
  };
  cggcci.SchedulerImpl$Flusher = function SchedulerImpl$Flusher(this$0) {
    cggcci.$clinit_SchedulerImpl$Flusher();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_230();
  };
  defineClass(489, 1, { 1: 1 }, cggcci.SchedulerImpl$Flusher);
  _.$init_230 = function $init_230() {
  };
  _.execute = function execute_2() {
    this.this$01.flushRunning = true;
    this.this$01.flushPostEventPumpCommands();
    this.this$01.flushRunning = false;
    return this.this$01.shouldBeRunning = this.this$01.isWorkQueued();
  };
  cggl.Lcom_google_gwt_core_client_impl_SchedulerImpl$Flusher_2_classLit = createForClass("com.google.gwt.core.client.impl", "SchedulerImpl/Flusher", 489, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_SchedulerImpl$Rescuer = function $clinit_SchedulerImpl$Rescuer() {
    cggcci.$clinit_SchedulerImpl$Rescuer = emptyMethod;
    jl.$clinit_Object();
  };
  cggcci.SchedulerImpl$Rescuer = function SchedulerImpl$Rescuer(this$0) {
    cggcci.$clinit_SchedulerImpl$Rescuer();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_231();
  };
  defineClass(490, 1, { 1: 1 }, cggcci.SchedulerImpl$Rescuer);
  _.$init_231 = function $init_231() {
  };
  _.execute = function execute_3() {
    if (this.this$01.flushRunning) {
      this.this$01.scheduleFixedDelay(this.this$01.flusher, 1);
    }
    return this.this$01.shouldBeRunning;
  };
  cggl.Lcom_google_gwt_core_client_impl_SchedulerImpl$Rescuer_2_classLit = createForClass("com.google.gwt.core.client.impl", "SchedulerImpl/Rescuer", 490, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_SchedulerImpl$Task = function $clinit_SchedulerImpl$Task() {
    cggcci.$clinit_SchedulerImpl$Task = emptyMethod;
    cggcc.$clinit_JavaScriptObject();
  };
  cggcci.$executeRepeating = function $executeRepeating(this$static) {
    cggcci.$clinit_SchedulerImpl$Task();
    return cggcci.$getRepeating(this$static).execute();
  };
  cggcci.$executeScheduled = function $executeScheduled(this$static) {
    cggcci.$clinit_SchedulerImpl$Task();
    cggcci.$getScheduled(this$static).execute_0();
  };
  cggcci.$getRepeating = function $getRepeating(this$static) {
    return this$static[0];
  };
  cggcci.$getScheduled = function $getScheduled(this$static) {
    return this$static[0];
  };
  cggcci.$isRepeating = function $isRepeating(this$static) {
    cggcci.$clinit_SchedulerImpl$Task();
    return this$static[1];
  };
  cggcci.create_2 = function create_2(cmd) {
    cggcci.$clinit_SchedulerImpl$Task();
    return [cmd, false];
  };
  cggcci.$clinit_ScriptTagLoadingStrategy = function $clinit_ScriptTagLoadingStrategy() {
    cggcci.$clinit_ScriptTagLoadingStrategy = emptyMethod;
    cggcci.$clinit_LoadingStrategyBase();
  };
  cggcci.ScriptTagLoadingStrategy = function ScriptTagLoadingStrategy() {
    cggcci.$clinit_ScriptTagLoadingStrategy();
    cggcci.LoadingStrategyBase.call(this, new cggcci.ScriptTagLoadingStrategy$ScriptTagDownloadStrategy());
    this.$init_232();
  };
  cggcci.asyncCallback = function asyncCallback(request, code_0) {
    var firstTimeCalled;
    firstTimeCalled = cggcci.clearAsyncCallback(request.getFragment_2());
    if (firstTimeCalled) {
      request.tryInstall(code_0);
    }
  };
  cggcci.cleanup = function cleanup(request) {
    cggcci.$clinit_ScriptTagLoadingStrategy();
    var neverCalled;
    neverCalled = cggcci.clearAsyncCallback(request.getFragment_2());
    if (neverCalled) {
      request.onLoadError(new cggcci.AsyncFragmentLoader$HttpDownloadFailure(request.getUrl(), 404, "Script Tag Failure - no status available"), true);
    }
  };
  cggcci.clearAsyncCallback = function clearAsyncCallback(fragment) {
    if (!__gwtModuleFunction["runAsyncCallback" + fragment]) {
      return false;
    }
    delete __gwtModuleFunction["runAsyncCallback" + fragment];
    return true;
  };
  cggcci.setAsyncCallback = function setAsyncCallback(fragment, request) {
    cggcci.$clinit_ScriptTagLoadingStrategy();
    __gwtModuleFunction["runAsyncCallback" + fragment] = $entry(
      function(code_0, instance) {
        cggcci.asyncCallback(request, code_0);
      }
    );
  };
  defineClass(345, 444, { 247: 1, 1: 1 }, cggcci.ScriptTagLoadingStrategy);
  _.$init_232 = function $init_232() {
  };
  cggl.Lcom_google_gwt_core_client_impl_ScriptTagLoadingStrategy_2_classLit = createForClass("com.google.gwt.core.client.impl", "ScriptTagLoadingStrategy", 345, cggl.Lcom_google_gwt_core_client_impl_LoadingStrategyBase_2_classLit);
  cggcci.$clinit_ScriptTagLoadingStrategy$ScriptTagDownloadStrategy = function $clinit_ScriptTagLoadingStrategy$ScriptTagDownloadStrategy() {
    cggcci.$clinit_ScriptTagLoadingStrategy$ScriptTagDownloadStrategy = emptyMethod;
    jl.$clinit_Object();
  };
  cggcci.ScriptTagLoadingStrategy$ScriptTagDownloadStrategy = function ScriptTagLoadingStrategy$ScriptTagDownloadStrategy() {
    cggcci.$clinit_ScriptTagLoadingStrategy$ScriptTagDownloadStrategy();
    Object_0.call(this);
    this.$init_233();
  };
  defineClass(445, 1, { 1: 1 }, cggcci.ScriptTagLoadingStrategy$ScriptTagDownloadStrategy);
  _.$init_233 = function $init_233() {
  };
  _.tryDownload = function tryDownload_0(request) {
    cggcci.setAsyncCallback(request.getFragment_2(), request);
    cggcc.fromUrl(request.getUrl()).setRemoveTag(true).setCallback(new cggcci.ScriptTagLoadingStrategy$ScriptTagDownloadStrategy$1(this, request)).inject();
  };
  cggl.Lcom_google_gwt_core_client_impl_ScriptTagLoadingStrategy$ScriptTagDownloadStrategy_2_classLit = createForClass("com.google.gwt.core.client.impl", "ScriptTagLoadingStrategy/ScriptTagDownloadStrategy", 445, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_ScriptTagLoadingStrategy$ScriptTagDownloadStrategy$1 = function $clinit_ScriptTagLoadingStrategy$ScriptTagDownloadStrategy$1() {
    cggcci.$clinit_ScriptTagLoadingStrategy$ScriptTagDownloadStrategy$1 = emptyMethod;
    jl.$clinit_Object();
  };
  cggcci.ScriptTagLoadingStrategy$ScriptTagDownloadStrategy$1 = function ScriptTagLoadingStrategy$ScriptTagDownloadStrategy$1(this$1, val$request) {
    cggcci.$clinit_ScriptTagLoadingStrategy$ScriptTagDownloadStrategy$1();
    this.this$11 = this$1;
    this.val$request2 = val$request;
    Object_0.call(this);
    this.$init_234();
  };
  defineClass(446, 1, { 1: 1 }, cggcci.ScriptTagLoadingStrategy$ScriptTagDownloadStrategy$1);
  _.$init_234 = function $init_234() {
  };
  _.onFailure = function onFailure_0(reason) {
    this.onFailure_1(castTo(reason, 12));
  };
  _.onSuccess = function onSuccess(result) {
    this.onSuccess_1(castTo(result, 280));
  };
  _.onFailure_1 = function onFailure(reason) {
    cggcci.cleanup(this.val$request2);
  };
  _.onSuccess_1 = function onSuccess_0(result) {
    cggcci.cleanup(this.val$request2);
  };
  cggl.Lcom_google_gwt_core_client_impl_ScriptTagLoadingStrategy$ScriptTagDownloadStrategy$1_2_classLit = createForClass("com.google.gwt.core.client.impl", "ScriptTagLoadingStrategy/ScriptTagDownloadStrategy/1", 446, cggl.Ljava_lang_Object_2_classLit);
  cggcci.$clinit_StackTraceCreator$CollectorEmulated = function $clinit_StackTraceCreator$CollectorEmulated() {
    cggcci.$clinit_StackTraceCreator$CollectorEmulated = emptyMethod;
  };
  defineClass(637, 180, { 1: 1 });
  cggl.Lcom_google_gwt_core_client_impl_StackTraceCreator$CollectorEmulated_2_classLit = createForClass("com.google.gwt.core.client.impl", "StackTraceCreator/CollectorEmulated", 637, cggl.Lcom_google_gwt_core_client_impl_StackTraceCreator$Collector_2_classLit);
  cggcci.$clinit_StackTraceCreator$CollectorNull = function $clinit_StackTraceCreator$CollectorNull() {
    cggcci.$clinit_StackTraceCreator$CollectorNull = emptyMethod;
  };
  defineClass(638, 180, { 1: 1 });
  cggl.Lcom_google_gwt_core_client_impl_StackTraceCreator$CollectorNull_2_classLit = createForClass("com.google.gwt.core.client.impl", "StackTraceCreator/CollectorNull", 638, cggl.Lcom_google_gwt_core_client_impl_StackTraceCreator$Collector_2_classLit);
  cggccp.$clinit_PrefetchableResource = function $clinit_PrefetchableResource() {
    cggccp.$clinit_PrefetchableResource = emptyMethod;
  };
  cggl.Lcom_google_gwt_core_client_prefetch_PrefetchableResource_2_classLit = createForInterface("com.google.gwt.core.client.prefetch", "PrefetchableResource");
  cggccp.$clinit_RunAsyncCode = function $clinit_RunAsyncCode() {
    cggccp.$clinit_RunAsyncCode = emptyMethod;
  };
  defineClass(598, 1, { 1: 1 });
  cggl.Lcom_google_gwt_core_client_prefetch_RunAsyncCode_2_classLit = createForClass("com.google.gwt.core.client.prefetch", "RunAsyncCode", 598, cggl.Ljava_lang_Object_2_classLit);
  cggcs.$clinit_GWT_0 = function $clinit_GWT_0() {
    cggcs.$clinit_GWT_0 = emptyMethod;
    jl.$clinit_Object();
    {
      if (cggcs.isScript_0()) {
        cggcs.logger_0 = castTo(new cggcsi.JsLogger(), 216);
      } else {
        cggcs.logger_0 = null;
      }
    }
  };
  cggcs.create_3 = function create_3(classLiteral) {
    return cggcs.createImpl(classLiteral);
  };
  cggcs.createImpl = function createImpl(classLiteral) {
    cggcs.$clinit_GWT_0();
    if (isNull(cggcs.sGWTBridge)) {
      throw toJs(new jl.UnsupportedOperationException_0("ERROR: GWT.create() is only usable in client code!  It cannot be called, for example, from server code.  If you are running a unit test, check that your test case extends GWTTestCase and that GWT.create() is not called from within an initializer or constructor."));
    } else {
      return cggcs.sGWTBridge.create_0(classLiteral);
    }
  };
  cggcs.isScript_0 = function isScript_0() {
    return true;
  };
  defineClass(713, 1, { 1: 1 });
  cggcs.sGWTBridge = null;
  cggl.Lcom_google_gwt_core_shared_GWT_2_classLit = createForClass("com.google.gwt.core.shared", "GWT", 713, cggl.Ljava_lang_Object_2_classLit);
  cggcs.$clinit_GWTBridge = function $clinit_GWTBridge() {
    cggcs.$clinit_GWTBridge = emptyMethod;
  };
  defineClass(752, 1, { 1: 1 });
  cggl.Lcom_google_gwt_core_shared_GWTBridge_2_classLit = createForClass("com.google.gwt.core.shared", "GWTBridge", 752, cggl.Ljava_lang_Object_2_classLit);
  cggcsi.$clinit_JsLogger = function $clinit_JsLogger() {
    cggcsi.$clinit_JsLogger = emptyMethod;
    jl.$clinit_Object();
  };
  cggcsi.JsLogger = function JsLogger() {
    cggcsi.$clinit_JsLogger();
    Object_0.call(this);
    this.$init_239();
  };
  defineClass(216, 1, { 216: 1, 1: 1 }, cggcsi.JsLogger);
  _.$init_239 = function $init_239() {
  };
  cggl.Lcom_google_gwt_core_shared_impl_JsLogger_2_classLit = createForClass("com.google.gwt.core.shared.impl", "JsLogger", 216, cggl.Ljava_lang_Object_2_classLit);
  cggl.$clinit_BigLongLibBase = function $clinit_BigLongLibBase() {
    cggl.$clinit_BigLongLibBase = emptyMethod;
    jl.$clinit_Object();
    cggl.BITS01 = 2 * 22;
    cggl.BITS2 = 64 - 44;
    cggl.MASK = (1 << 22) - 1;
    cggl.MASK_2 = (1 << 20) - 1;
    cggl.SIGN_BIT = 20 - 1;
    cggl.SIGN_BIT_VALUE = 1 << 19;
    cggl.TWO_PWR_31_DBL = 65536 * 32768;
    cggl.TWO_PWR_32_DBL = 65536 * 65536;
    cggl.TWO_PWR_44_DBL = 4194304 * 4194304;
    cggl.TWO_PWR_63_DBL = 4294967296 * 2147483648;
  };
  cggl.create_4 = function create_4() {
    if (cggl.$clinit_LongLib(), RUN_IN_JVM) {
      return new cggl.BigLongLibBase$BigLong();
    }
    return cggl.create0(0, 0, 0);
  };
  cggl.create_5 = function create_5(value_0) {
    cggl.$clinit_BigLongLibBase();
    var a, a0, a1, a2;
    a0 = value_0 & 4194303;
    a1 = value_0 >> 22 & 4194303;
    a2 = value_0 < 0 ? 1048575 : 0;
    if (cggl.$clinit_LongLib(), RUN_IN_JVM) {
      a = new cggl.BigLongLibBase$BigLong();
      a.l_0 = a0;
      a.m_0 = a1;
      a.h_0 = a2;
      return a;
    }
    return cggl.create0(a0, a1, a2);
  };
  cggl.create_6 = function create_6(a0, a1, a2) {
    cggl.$clinit_BigLongLibBase();
    var a;
    if (cggl.$clinit_LongLib(), RUN_IN_JVM) {
      a = new cggl.BigLongLibBase$BigLong();
      a.l_0 = a0;
      a.m_0 = a1;
      a.h_0 = a2;
      return a;
    }
    return cggl.create0(a0, a1, a2);
  };
  cggl.create_7 = function create_7(a) {
    cggl.$clinit_BigLongLibBase();
    var b;
    if (cggl.$clinit_LongLib(), RUN_IN_JVM) {
      b = new cggl.BigLongLibBase$BigLong();
      b.l_0 = cggl.getL(a);
      b.m_0 = cggl.getM(a);
      b.h_0 = cggl.getH(a);
      return b;
    }
    return cggl.create0(cggl.getL(a), cggl.getM(a), cggl.getH(a));
  };
  cggl.create0 = function create0(l, m, h) {
    return { l, m, h };
  };
  cggl.divMod = function divMod(a, b, computeRemainder) {
    cggl.$clinit_BigLongLibBase();
    var aIsCopy, aIsMinValue, aIsNegative, bpower, c, negative;
    if (cggl.isZero(b)) {
      throw toJs(new jl.ArithmeticException("divide by zero"));
    }
    if (cggl.isZero(a)) {
      if (computeRemainder) {
        cggl.remainder_0 = cggl.create_4();
      }
      return cggl.create_4();
    }
    if (cggl.isMinValue(b)) {
      return cggl.divModByMinValue(a, computeRemainder);
    }
    negative = false;
    if (cggl.isNegative_0(b)) {
      b = cggl.neg(b);
      negative = !negative;
    }
    bpower = cggl.powerOfTwo_0(b);
    aIsNegative = false;
    aIsMinValue = false;
    aIsCopy = false;
    if (cggl.isMinValue(a)) {
      aIsMinValue = true;
      aIsNegative = true;
      if (bpower == -1) {
        a = cggl.create_7((cggl.$clinit_BigLongLib$Const(), cggl.MAX_VALUE));
        aIsCopy = true;
        negative = !negative;
      } else {
        c = cggl.shr(a, bpower);
        if (negative) {
          cggl.negate_0(c);
        }
        if (computeRemainder) {
          cggl.remainder_0 = cggl.create_4();
        }
        return c;
      }
    } else if (cggl.isNegative_0(a)) {
      aIsNegative = true;
      a = cggl.neg(a);
      aIsCopy = true;
      negative = !negative;
    }
    if (bpower != -1) {
      return cggl.divModByShift(a, bpower, negative, aIsNegative, computeRemainder);
    }
    if (cggl.compare_18(a, b) < 0) {
      if (computeRemainder) {
        if (aIsNegative) {
          cggl.remainder_0 = cggl.neg(a);
        } else {
          cggl.remainder_0 = cggl.create_7(a);
        }
      }
      return cggl.create_4();
    }
    return cggl.divModHelper(aIsCopy ? a : cggl.create_7(a), b, negative, aIsNegative, aIsMinValue, computeRemainder);
  };
  cggl.divModByMinValue = function divModByMinValue(a, computeRemainder) {
    if (cggl.isMinValue(a)) {
      if (computeRemainder) {
        cggl.remainder_0 = cggl.create_4();
      }
      return cggl.create_7((cggl.$clinit_BigLongLib$Const(), cggl.ONE));
    }
    if (computeRemainder) {
      cggl.remainder_0 = cggl.create_7(a);
    }
    return cggl.create_4();
  };
  cggl.divModByShift = function divModByShift(a, bpower, negative, aIsNegative, computeRemainder) {
    var c;
    c = cggl.shr(a, bpower);
    if (negative) {
      cggl.negate_0(c);
    }
    if (computeRemainder) {
      a = cggl.maskRight(a, bpower);
      if (aIsNegative) {
        cggl.remainder_0 = cggl.neg(a);
      } else {
        cggl.remainder_0 = cggl.create_7(a);
      }
    }
    return c;
  };
  cggl.divModHelper = function divModHelper(a, b, negative, aIsNegative, aIsMinValue, computeRemainder) {
    var bshift, gte, quotient, shift_0;
    shift_0 = cggl.numberOfLeadingZeros(b) - cggl.numberOfLeadingZeros(a);
    bshift = cggl.shl(b, shift_0);
    quotient = cggl.create_4();
    while (shift_0 >= 0) {
      gte = cggl.trialSubtract(a, bshift);
      if (gte) {
        cggl.setBit(quotient, shift_0);
        if (cggl.isZero(a)) {
          break;
        }
      }
      cggl.toShru1(bshift);
      shift_0--;
    }
    if (negative) {
      cggl.negate_0(quotient);
    }
    if (computeRemainder) {
      if (aIsNegative) {
        cggl.remainder_0 = cggl.neg(a);
        if (aIsMinValue) {
          cggl.remainder_0 = cggl.sub_1(cggl.remainder_0, (cggl.$clinit_BigLongLib$Const(), cggl.ONE));
        }
      } else {
        cggl.remainder_0 = cggl.create_7(a);
      }
    }
    return quotient;
  };
  cggl.getH = function getH(a) {
    cggl.$clinit_BigLongLibBase();
    if (cggl.$clinit_LongLib(), RUN_IN_JVM) {
      return a.h_0;
    }
    return cggl.getHNative(a);
  };
  cggl.getHNative = function getHNative(a) {
    return a.h;
  };
  cggl.getL = function getL(a) {
    cggl.$clinit_BigLongLibBase();
    if (cggl.$clinit_LongLib(), RUN_IN_JVM) {
      return a.l_0;
    }
    return cggl.getLNative(a);
  };
  cggl.getLNative = function getLNative(a) {
    return a.l;
  };
  cggl.getM = function getM(a) {
    cggl.$clinit_BigLongLibBase();
    if (cggl.$clinit_LongLib(), RUN_IN_JVM) {
      return a.m_0;
    }
    return cggl.getMNative(a);
  };
  cggl.getMNative = function getMNative(a) {
    return a.m;
  };
  cggl.isMinValue = function isMinValue(a) {
    cggl.$clinit_BigLongLibBase();
    return cggl.getH(a) == 524288 && cggl.getM(a) == 0 && cggl.getL(a) == 0;
  };
  cggl.isNegative_0 = function isNegative_0(a) {
    cggl.$clinit_BigLongLibBase();
    return cggl.sign_0(a) != 0;
  };
  cggl.isZero = function isZero(a) {
    cggl.$clinit_BigLongLibBase();
    return cggl.getL(a) == 0 && cggl.getM(a) == 0 && cggl.getH(a) == 0;
  };
  cggl.maskRight = function maskRight(a, bits) {
    var b0, b1, b2;
    if (bits <= 22) {
      b0 = cggl.getL(a) & (1 << bits) - 1;
      b1 = b2 = 0;
    } else if (bits <= 44) {
      b0 = cggl.getL(a);
      b1 = cggl.getM(a) & (1 << bits - 22) - 1;
      b2 = 0;
    } else {
      b0 = cggl.getL(a);
      b1 = cggl.getM(a);
      b2 = cggl.getH(a) & (1 << bits - 44) - 1;
    }
    return cggl.create_6(b0, b1, b2);
  };
  cggl.negate_0 = function negate_0(a) {
    cggl.$clinit_BigLongLibBase();
    var neg0, neg1, neg2;
    neg0 = ~cggl.getL(a) + 1 & 4194303;
    neg1 = ~cggl.getM(a) + (neg0 == 0 ? 1 : 0) & 4194303;
    neg2 = ~cggl.getH(a) + (neg0 == 0 && neg1 == 0 ? 1 : 0) & 1048575;
    if (cggl.$clinit_LongLib(), RUN_IN_JVM) {
      a.l_0 = neg0;
      a.m_0 = neg1;
      a.h_0 = neg2;
    } else {
      cggl.setL(a, neg0);
      cggl.setM(a, neg1);
      cggl.setH(a, neg2);
    }
  };
  cggl.numberOfLeadingZeros = function numberOfLeadingZeros(a) {
    var b1, b2;
    b2 = numberOfLeadingZeros_0(cggl.getH(a));
    if (b2 == 32) {
      b1 = numberOfLeadingZeros_0(cggl.getM(a));
      if (b1 == 32) {
        return numberOfLeadingZeros_0(cggl.getL(a)) + 32;
      } else {
        return b1 + 20 - (32 - 22);
      }
    } else {
      return b2 - (32 - 20);
    }
  };
  cggl.powerOfTwo_0 = function powerOfTwo_0(a) {
    var h, l, m;
    l = cggl.getL(a);
    if ((l & l - 1) != 0) {
      return -1;
    }
    m = cggl.getM(a);
    if ((m & m - 1) != 0) {
      return -1;
    }
    h = cggl.getH(a);
    if ((h & h - 1) != 0) {
      return -1;
    }
    if (h == 0 && m == 0 && l == 0) {
      return -1;
    }
    if (h == 0 && m == 0 && l != 0) {
      return numberOfTrailingZeros(l);
    }
    if (h == 0 && m != 0 && l == 0) {
      return numberOfTrailingZeros(m) + 22;
    }
    if (h != 0 && m == 0 && l == 0) {
      return numberOfTrailingZeros(h) + 44;
    }
    return -1;
  };
  cggl.setBit = function setBit(a, bit) {
    if (cggl.$clinit_LongLib(), RUN_IN_JVM) {
      if (bit < 22) {
        a.l_0 |= 1 << bit;
      } else if (bit < 44) {
        a.m_0 |= 1 << bit - 22;
      } else {
        a.h_0 |= 1 << bit - 44;
      }
    } else {
      if (bit < 22) {
        cggl.setBitL(a, bit);
      } else if (bit < 44) {
        cggl.setBitM(a, bit - 22);
      } else {
        cggl.setBitH(a, bit - 44);
      }
    }
  };
  cggl.setBitH = function setBitH(a, bit) {
    a.h |= 1 << bit;
  };
  cggl.setBitL = function setBitL(a, bit) {
    a.l |= 1 << bit;
  };
  cggl.setBitM = function setBitM(a, bit) {
    a.m |= 1 << bit;
  };
  cggl.setH = function setH(a, x_0) {
    a.h = x_0;
  };
  cggl.setL = function setL(a, x_0) {
    a.l = x_0;
  };
  cggl.setM = function setM(a, x_0) {
    a.m = x_0;
  };
  cggl.sign_0 = function sign_0(a) {
    cggl.$clinit_BigLongLibBase();
    return cggl.getH(a) >> 20 - 1;
  };
  cggl.toDoubleHelper = function toDoubleHelper(a) {
    cggl.$clinit_BigLongLibBase();
    return cggl.getL(a) + cggl.getM(a) * 4194304 + cggl.getH(a) * 17592186044416;
  };
  cggl.toShru1 = function toShru1(a) {
    var a0, a1, a2;
    a1 = cggl.getM(a);
    a2 = cggl.getH(a);
    a0 = cggl.getL(a);
    if (cggl.$clinit_LongLib(), RUN_IN_JVM) {
      a.h_0 = a2 >>> 1;
      a.m_0 = a1 >>> 1 | (a2 & 1) << 22 - 1;
      a.l_0 = a0 >>> 1 | (a1 & 1) << 22 - 1;
    } else {
      cggl.setH(a, a2 >>> 1);
      cggl.setM(a, a1 >>> 1 | (a2 & 1) << 22 - 1);
      cggl.setL(a, a0 >>> 1 | (a1 & 1) << 22 - 1);
    }
  };
  cggl.trialSubtract = function trialSubtract(a, b) {
    var sum0, sum1, sum2;
    sum2 = cggl.getH(a) - cggl.getH(b);
    if (sum2 < 0) {
      return false;
    }
    sum0 = cggl.getL(a) - cggl.getL(b);
    sum1 = cggl.getM(a) - cggl.getM(b) + (sum0 >> 22);
    sum2 += sum1 >> 22;
    if (sum2 < 0) {
      return false;
    }
    if (cggl.$clinit_LongLib(), RUN_IN_JVM) {
      a.l_0 = sum0 & 4194303;
      a.m_0 = sum1 & 4194303;
      a.h_0 = sum2 & 1048575;
    } else {
      cggl.setL(a, sum0 & 4194303);
      cggl.setM(a, sum1 & 4194303);
      cggl.setH(a, sum2 & 1048575);
    }
    return true;
  };
  defineClass(625, 1, { 1: 1 });
  cggl.BITS = 22;
  cggl.BITS01 = 0;
  cggl.BITS2 = 0;
  cggl.MASK = 0;
  cggl.MASK_2 = 0;
  cggl.SIGN_BIT = 0;
  cggl.SIGN_BIT_VALUE = 0;
  cggl.TWO_PWR_15_DBL = 32768;
  cggl.TWO_PWR_16_DBL = 65536;
  cggl.TWO_PWR_22_DBL = 4194304;
  cggl.TWO_PWR_31_DBL = 0;
  cggl.TWO_PWR_32_DBL = 0;
  cggl.TWO_PWR_44_DBL = 0;
  cggl.TWO_PWR_63_DBL = 0;
  cggl.Lcom_google_gwt_lang_BigLongLibBase_2_classLit = createForClass("com.google.gwt.lang", "BigLongLibBase", 625, cggl.Ljava_lang_Object_2_classLit);
  cggl.$clinit_BigLongLib = function $clinit_BigLongLib() {
    cggl.$clinit_BigLongLib = emptyMethod;
    cggl.$clinit_BigLongLibBase();
  };
  cggl.add_19 = function add_19(a, b) {
    cggl.$clinit_BigLongLib();
    var sum0, sum1, sum2;
    sum0 = cggl.getL(a) + cggl.getL(b);
    sum1 = cggl.getM(a) + cggl.getM(b) + (sum0 >> 22);
    sum2 = cggl.getH(a) + cggl.getH(b) + (sum1 >> 22);
    return cggl.create_6(sum0 & 4194303, sum1 & 4194303, sum2 & 1048575);
  };
  cggl.and = function and(a, b) {
    cggl.$clinit_BigLongLib();
    return cggl.create_6(cggl.getL(a) & cggl.getL(b), cggl.getM(a) & cggl.getM(b), cggl.getH(a) & cggl.getH(b));
  };
  cggl.compare_18 = function compare_18(a, b) {
    cggl.$clinit_BigLongLib();
    var a0, a1, a2, b0, b1, b2, signA, signB;
    signA = cggl.sign_0(a);
    signB = cggl.sign_0(b);
    if (signA != signB) {
      return signB - signA;
    }
    a2 = cggl.getH(a);
    b2 = cggl.getH(b);
    if (a2 != b2) {
      return a2 - b2;
    }
    a1 = cggl.getM(a);
    b1 = cggl.getM(b);
    if (a1 != b1) {
      return a1 - b1;
    }
    a0 = cggl.getL(a);
    b0 = cggl.getL(b);
    return a0 - b0;
  };
  cggl.div = function div(a, b) {
    cggl.$clinit_BigLongLib();
    return cggl.divMod(a, b, false);
  };
  cggl.fromDouble = function fromDouble(value_0) {
    cggl.$clinit_BigLongLib();
    var a0, a1, a2, negative, result;
    if (isNaN(value_0)) {
      return cggl.$clinit_BigLongLib$Const(), cggl.ZERO;
    }
    if (value_0 < -9223372036854776e3) {
      return cggl.$clinit_BigLongLib$Const(), cggl.MIN_VALUE;
    }
    if (value_0 >= 9223372036854776e3) {
      return cggl.$clinit_BigLongLib$Const(), cggl.MAX_VALUE;
    }
    negative = false;
    if (value_0 < 0) {
      negative = true;
      value_0 = -value_0;
    }
    a2 = 0;
    if (value_0 >= 17592186044416) {
      a2 = round_int(value_0 / 17592186044416);
      value_0 -= a2 * 17592186044416;
    }
    a1 = 0;
    if (value_0 >= 4194304) {
      a1 = round_int(value_0 / 4194304);
      value_0 -= a1 * 4194304;
    }
    a0 = round_int(value_0);
    result = cggl.create_6(a0, a1, a2);
    if (negative) {
      cggl.negate_0(result);
    }
    return result;
  };
  cggl.fromInt = function fromInt(value_0) {
    cggl.$clinit_BigLongLib();
    return cggl.create_5(value_0);
  };
  cggl.getAsLongArray = function getAsLongArray(l) {
    cggl.$clinit_BigLongLib();
    var a;
    a = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, 3, 14, 1);
    a[0] = fromInt_0(toInt_0(and_0(l, 4194303)));
    a[1] = fromInt_0(toInt_0(and_0(shr_0(l, 22), 4194303)));
    a[2] = fromInt_0(toInt_0(and_0(shr_0(l, 44), 1048575)));
    return a;
  };
  cggl.mod = function mod(a, b) {
    cggl.$clinit_BigLongLib();
    cggl.divMod(a, b, true);
    return cggl.$clinit_BigLongLibBase(), cggl.remainder_0;
  };
  cggl.mul = function mul(a, b) {
    cggl.$clinit_BigLongLib();
    var a0, a1, a2, a3, a4, b0, b1, b2, b3, b4, c0, c00, c01, c1, c10, c11, c12, c13, c2, c22, c23, c24, p0, p1, p2, p3, p4;
    a0 = cggl.getL(a) & 8191;
    a1 = cggl.getL(a) >> 13 | (cggl.getM(a) & 15) << 9;
    a2 = cggl.getM(a) >> 4 & 8191;
    a3 = cggl.getM(a) >> 17 | (cggl.getH(a) & 255) << 5;
    a4 = (cggl.getH(a) & 1048320) >> 8;
    b0 = cggl.getL(b) & 8191;
    b1 = cggl.getL(b) >> 13 | (cggl.getM(b) & 15) << 9;
    b2 = cggl.getM(b) >> 4 & 8191;
    b3 = cggl.getM(b) >> 17 | (cggl.getH(b) & 255) << 5;
    b4 = (cggl.getH(b) & 1048320) >> 8;
    p0 = a0 * b0;
    p1 = a1 * b0;
    p2 = a2 * b0;
    p3 = a3 * b0;
    p4 = a4 * b0;
    if (b1 != 0) {
      p1 += a0 * b1;
      p2 += a1 * b1;
      p3 += a2 * b1;
      p4 += a3 * b1;
    }
    if (b2 != 0) {
      p2 += a0 * b2;
      p3 += a1 * b2;
      p4 += a2 * b2;
    }
    if (b3 != 0) {
      p3 += a0 * b3;
      p4 += a1 * b3;
    }
    if (b4 != 0) {
      p4 += a0 * b4;
    }
    c00 = p0 & 4194303;
    c01 = (p1 & 511) << 13;
    c0 = c00 + c01;
    c10 = p0 >> 22;
    c11 = p1 >> 9;
    c12 = (p2 & 262143) << 4;
    c13 = (p3 & 31) << 17;
    c1 = c10 + c11 + c12 + c13;
    c22 = p2 >> 18;
    c23 = p3 >> 5;
    c24 = (p4 & 4095) << 8;
    c2 = c22 + c23 + c24;
    c1 += c0 >> 22;
    c0 &= 4194303;
    c2 += c1 >> 22;
    c1 &= 4194303;
    c2 &= 1048575;
    return cggl.create_6(c0, c1, c2);
  };
  cggl.neg = function neg(a) {
    cggl.$clinit_BigLongLib();
    var neg0, neg1, neg2;
    neg0 = ~cggl.getL(a) + 1 & 4194303;
    neg1 = ~cggl.getM(a) + (neg0 == 0 ? 1 : 0) & 4194303;
    neg2 = ~cggl.getH(a) + (neg0 == 0 && neg1 == 0 ? 1 : 0) & 1048575;
    return cggl.create_6(neg0, neg1, neg2);
  };
  cggl.not = function not(a) {
    cggl.$clinit_BigLongLib();
    return cggl.create_6(~cggl.getL(a) & 4194303, ~cggl.getM(a) & 4194303, ~cggl.getH(a) & 1048575);
  };
  cggl.or = function or(a, b) {
    cggl.$clinit_BigLongLib();
    return cggl.create_6(cggl.getL(a) | cggl.getL(b), cggl.getM(a) | cggl.getM(b), cggl.getH(a) | cggl.getH(b));
  };
  cggl.shl = function shl(a, n) {
    cggl.$clinit_BigLongLib();
    var res0, res1, res2;
    n &= 63;
    if (n < 22) {
      res0 = cggl.getL(a) << n;
      res1 = cggl.getM(a) << n | cggl.getL(a) >> 22 - n;
      res2 = cggl.getH(a) << n | cggl.getM(a) >> 22 - n;
    } else if (n < 44) {
      res0 = 0;
      res1 = cggl.getL(a) << n - 22;
      res2 = cggl.getM(a) << n - 22 | cggl.getL(a) >> 44 - n;
    } else {
      res0 = 0;
      res1 = 0;
      res2 = cggl.getL(a) << n - 44;
    }
    return cggl.create_6(res0 & 4194303, res1 & 4194303, res2 & 1048575);
  };
  cggl.shr = function shr(a, n) {
    cggl.$clinit_BigLongLib();
    var a2, negative, res0, res1, res2;
    n &= 63;
    a2 = cggl.getH(a);
    negative = (a2 & 524288) != 0;
    if (negative) {
      a2 |= ~1048575;
    }
    if (n < 22) {
      res2 = a2 >> n;
      res1 = cggl.getM(a) >> n | a2 << 22 - n;
      res0 = cggl.getL(a) >> n | cggl.getM(a) << 22 - n;
    } else if (n < 44) {
      res2 = negative ? 1048575 : 0;
      res1 = a2 >> n - 22;
      res0 = cggl.getM(a) >> n - 22 | a2 << 44 - n;
    } else {
      res2 = negative ? 1048575 : 0;
      res1 = negative ? 4194303 : 0;
      res0 = a2 >> n - 44;
    }
    return cggl.create_6(res0 & 4194303, res1 & 4194303, res2 & 1048575);
  };
  cggl.shru = function shru(a, n) {
    cggl.$clinit_BigLongLib();
    var a2, res0, res1, res2;
    n &= 63;
    a2 = cggl.getH(a) & 1048575;
    if (n < 22) {
      res2 = a2 >>> n;
      res1 = cggl.getM(a) >> n | a2 << 22 - n;
      res0 = cggl.getL(a) >> n | cggl.getM(a) << 22 - n;
    } else if (n < 44) {
      res2 = 0;
      res1 = a2 >>> n - 22;
      res0 = cggl.getM(a) >> n - 22 | cggl.getH(a) << 44 - n;
    } else {
      res2 = 0;
      res1 = 0;
      res0 = a2 >>> n - 44;
    }
    return cggl.create_6(res0 & 4194303, res1 & 4194303, res2 & 1048575);
  };
  cggl.sub_1 = function sub_1(a, b) {
    cggl.$clinit_BigLongLib();
    var sum0, sum1, sum2;
    sum0 = cggl.getL(a) - cggl.getL(b);
    sum1 = cggl.getM(a) - cggl.getM(b) + (sum0 >> 22);
    sum2 = cggl.getH(a) - cggl.getH(b) + (sum1 >> 22);
    return cggl.create_6(sum0 & 4194303, sum1 & 4194303, sum2 & 1048575);
  };
  cggl.toDouble = function toDouble(a) {
    cggl.$clinit_BigLongLib();
    if (cggl.compare_18(a, (cggl.$clinit_BigLongLib$Const(), cggl.ZERO)) < 0) {
      return -cggl.toDoubleHelper(cggl.neg(a));
    }
    return cggl.toDoubleHelper(a);
  };
  cggl.toInt = function toInt(a) {
    cggl.$clinit_BigLongLib();
    return cggl.getL(a) | cggl.getM(a) << 22;
  };
  cggl.toString_26 = function toString_26(a) {
    cggl.$clinit_BigLongLib();
    var digits, rem, res, tenPower, tenPowerLong, tenPowerZeroes, zeroesNeeded;
    if (cggl.isZero(a)) {
      return "0";
    }
    if (cggl.isMinValue(a)) {
      return "-9223372036854775808";
    }
    if (cggl.isNegative_0(a)) {
      return "-" + cggl.toString_26(cggl.neg(a));
    }
    rem = a;
    res = "";
    while (!cggl.isZero(rem)) {
      tenPowerZeroes = 9;
      tenPower = 1e9;
      tenPowerLong = cggl.fromInt(1e9);
      rem = cggl.divMod(rem, tenPowerLong, true);
      digits = "" + cggl.toInt((cggl.$clinit_BigLongLibBase(), cggl.remainder_0));
      if (!cggl.isZero(rem)) {
        zeroesNeeded = 9 - jl.length__I__devirtual$_0(digits);
        for (; zeroesNeeded > 0; zeroesNeeded--) {
          digits = "0" + digits;
        }
      }
      res = digits + ("" + res);
    }
    return res;
  };
  cggl.xor = function xor(a, b) {
    cggl.$clinit_BigLongLib();
    return cggl.create_6(cggl.getL(a) ^ cggl.getL(b), cggl.getM(a) ^ cggl.getM(b), cggl.getH(a) ^ cggl.getH(b));
  };
  defineClass(711, 625, { 1: 1 });
  cggl.Lcom_google_gwt_lang_BigLongLib_2_classLit = createForClass("com.google.gwt.lang", "BigLongLib", 711, cggl.Lcom_google_gwt_lang_BigLongLibBase_2_classLit);
  cggl.$clinit_BigLongLib$Const = function $clinit_BigLongLib$Const() {
    cggl.$clinit_BigLongLib$Const = emptyMethod;
    jl.$clinit_Object();
    cggl.MAX_VALUE = cggl.create_6(4194303, 4194303, 1048575 >> 1);
    cggl.MIN_VALUE = cggl.create_6(0, 0, 524288);
    cggl.ONE = cggl.fromInt(1);
    cggl.TWO = cggl.fromInt(2);
    cggl.ZERO = cggl.fromInt(0);
  };
  defineClass(712, 1, { 1: 1 });
  cggl.Lcom_google_gwt_lang_BigLongLib$Const_2_classLit = createForClass("com.google.gwt.lang", "BigLongLib/Const", 712, cggl.Ljava_lang_Object_2_classLit);
  cggl.$clinit_BigLongLibBase$BigLong = function $clinit_BigLongLibBase$BigLong() {
    cggl.$clinit_BigLongLibBase$BigLong = emptyMethod;
    jl.$clinit_Object();
  };
  cggl.BigLongLibBase$BigLong = function BigLongLibBase$BigLong() {
    cggl.$clinit_BigLongLibBase$BigLong();
    Object_0.call(this);
    this.$init_241();
  };
  defineClass(179, 1, { 1: 1 }, cggl.BigLongLibBase$BigLong);
  _.$init_241 = function $init_241() {
  };
  _.h_0 = 0;
  _.l_0 = 0;
  _.m_0 = 0;
  cggl.Lcom_google_gwt_lang_BigLongLibBase$BigLong_2_classLit = createForClass("com.google.gwt.lang", "BigLongLibBase/BigLong", 179, cggl.Ljava_lang_Object_2_classLit);
  cggl.$clinit_LongLib = function $clinit_LongLib() {
    cggl.$clinit_LongLib = emptyMethod;
    jl.$clinit_Object();
  };
  cggl.LongLib = function LongLib() {
    Object_0.call(this);
    this.$init_244();
  };
  function add_20(a, b) {
    cggl.$clinit_LongLib();
    var result;
    if (cggl.isSmallLong(a) && cggl.isSmallLong(b)) {
      result = cggl.asDouble(a) + cggl.asDouble(b);
      if (cggl.isSafeIntegerRange(result)) {
        return cggl.createSmallLongEmul(result);
      }
    }
    return cggl.createLongEmul(cggl.add_19(cggl.toBigLong(a), cggl.toBigLong(b)));
  }
  function and_0(a, b) {
    cggl.$clinit_LongLib();
    return cggl.createLongEmul(cggl.and(cggl.toBigLong(a), cggl.toBigLong(b)));
  }
  function asBigLong(value_0) {
    cggl.$clinit_LongLib();
    if (RUN_IN_JVM) {
      return value_0.big_0;
    }
    return cggl.asBigLong0(value_0);
  }
  cggl.asBigLong0 = function asBigLong0(value_0) {
    return value_0;
  };
  cggl.asDouble = function asDouble(value_0) {
    return cggl.asDouble_0(cggl.asSmallLong(value_0));
  };
  cggl.asDouble_0 = function asDouble_0(value_0) {
    if (RUN_IN_JVM) {
      return isNull(value_0) ? NaN : value_0.d;
    }
    return cggl.asDouble0(value_0);
  };
  cggl.asDouble0 = function asDouble0(value_0) {
    return value_0;
  };
  cggl.asSmallLong = function asSmallLong(value_0) {
    if (RUN_IN_JVM) {
      return value_0.small_0;
    }
    return cggl.asSmallLong0(value_0);
  };
  cggl.asSmallLong0 = function asSmallLong0(value_0) {
    return value_0;
  };
  cggl.coerceToInt = function coerceToInt(value_0) {
    if (RUN_IN_JVM) {
      return toInt_0(fromDouble_0(value_0));
    }
    return cggl.coerceToInt0(value_0);
  };
  cggl.coerceToInt0 = function coerceToInt0(value_0) {
    return value_0 | 0;
  };
  function compare_19(a, b) {
    cggl.$clinit_LongLib();
    var result;
    if (cggl.isSmallLong(a) && cggl.isSmallLong(b)) {
      result = cggl.asDouble(a) - cggl.asDouble(b);
      if (!isNaN(result)) {
        return result;
      }
    }
    return cggl.compare_18(cggl.toBigLong(a), cggl.toBigLong(b));
  }
  function copy_1(value_0) {
    cggl.$clinit_LongLib();
    if (cggl.isSmallLong(value_0)) {
      return cggl.createSmallLongEmul(cggl.asDouble(value_0));
    } else {
      return cggl.createBigLongEmul(cggl.create_7(asBigLong(value_0)));
    }
  }
  cggl.createBigLongEmul = function createBigLongEmul(big_0) {
    var emul;
    if (RUN_IN_JVM) {
      emul = new cggl.LongLib$LongEmul();
      emul.big_0 = big_0;
      return emul;
    }
    return cggl.createBigLongEmul0(big_0);
  };
  cggl.createBigLongEmul0 = function createBigLongEmul0(value_0) {
    return value_0;
  };
  cggl.createLongEmul = function createLongEmul(big_0) {
    var a2;
    a2 = cggl.getH(big_0);
    if (a2 == 0) {
      return cggl.createSmallLongEmul(cggl.getL(big_0) + cggl.getM(big_0) * 4194304);
    }
    if (a2 == 1048575) {
      return cggl.createSmallLongEmul(cggl.getL(big_0) + cggl.getM(big_0) * 4194304 - 17592186044416);
    }
    return cggl.createBigLongEmul(big_0);
  };
  cggl.createSmallLongEmul = function createSmallLongEmul(value_0) {
    var emul, small_0;
    if (RUN_IN_JVM) {
      small_0 = new cggl.LongLib$SmallLong();
      small_0.d = value_0;
      emul = new cggl.LongLib$LongEmul();
      emul.small_0 = small_0;
      return emul;
    }
    return cggl.createSmallLongEmul0(value_0);
  };
  cggl.createSmallLongEmul0 = function createSmallLongEmul0(value_0) {
    return value_0;
  };
  function div_0(a, b) {
    cggl.$clinit_LongLib();
    var result;
    if (cggl.isSmallLong(a) && cggl.isSmallLong(b)) {
      result = cggl.asDouble(a) / cggl.asDouble(b);
      if (cggl.isSafeIntegerRange(result)) {
        return cggl.createSmallLongEmul(cggl.truncate(result));
      }
    }
    return cggl.createLongEmul(cggl.div(cggl.toBigLong(a), cggl.toBigLong(b)));
  }
  function eq(a, b) {
    cggl.$clinit_LongLib();
    return compare_19(a, b) == 0;
  }
  function fromDouble_0(value_0) {
    cggl.$clinit_LongLib();
    if (cggl.isSafeIntegerRange(value_0)) {
      return cggl.createSmallLongEmul(cggl.truncate(value_0));
    }
    return cggl.createLongEmul(cggl.fromDouble(value_0));
  }
  function fromInt_0(value_0) {
    cggl.$clinit_LongLib();
    return cggl.createSmallLongEmul(value_0);
  }
  function getAsLongArray_0(l) {
    cggl.$clinit_LongLib();
    if (cggl.isSafeIntegerRange(toDouble_0(l))) {
      return stampJavaTypeInfo(getClassLiteralForArray(cggl.J_classLit, 1), { 4: 1, 1: 1, 49: 1 }, 5, 14, [l]);
    }
    return cggl.getAsLongArray(l);
  }
  function gt(a, b) {
    cggl.$clinit_LongLib();
    return compare_19(a, b) > 0;
  }
  function gte_0(a, b) {
    cggl.$clinit_LongLib();
    return compare_19(a, b) >= 0;
  }
  cggl.isSafeIntegerRange = function isSafeIntegerRange(value_0) {
    return -17592186044416 < value_0 && value_0 < 17592186044416;
  };
  cggl.isSmallLong = function isSmallLong(value_0) {
    if (RUN_IN_JVM) {
      return isNotNull(value_0.small_0);
    }
    return cggl.isSmallLong0(value_0);
  };
  cggl.isSmallLong0 = function isSmallLong0(value_0) {
    return typeof value_0 === "number";
  };
  function lt(a, b) {
    cggl.$clinit_LongLib();
    return compare_19(a, b) < 0;
  }
  function lte(a, b) {
    cggl.$clinit_LongLib();
    return compare_19(a, b) <= 0;
  }
  function mod_0(a, b) {
    cggl.$clinit_LongLib();
    var result;
    if (cggl.isSmallLong(a) && cggl.isSmallLong(b)) {
      result = cggl.asDouble(a) % cggl.asDouble(b);
      if (cggl.isSafeIntegerRange(result)) {
        return cggl.createSmallLongEmul(result);
      }
    }
    return cggl.createLongEmul(cggl.mod(cggl.toBigLong(a), cggl.toBigLong(b)));
  }
  function mul_0(a, b) {
    cggl.$clinit_LongLib();
    var result;
    if (cggl.isSmallLong(a) && cggl.isSmallLong(b)) {
      result = cggl.asDouble(a) * cggl.asDouble(b);
      if (cggl.isSafeIntegerRange(result)) {
        return cggl.createSmallLongEmul(result);
      }
    }
    return cggl.createLongEmul(cggl.mul(cggl.toBigLong(a), cggl.toBigLong(b)));
  }
  function neg_0(a) {
    cggl.$clinit_LongLib();
    var result;
    if (cggl.isSmallLong(a)) {
      result = 0 - cggl.asDouble(a);
      if (!isNaN(result)) {
        return cggl.createSmallLongEmul(result);
      }
    }
    return cggl.createLongEmul(cggl.neg(asBigLong(a)));
  }
  function neq(a, b) {
    cggl.$clinit_LongLib();
    return compare_19(a, b) != 0;
  }
  function not_0(a) {
    cggl.$clinit_LongLib();
    return cggl.createLongEmul(cggl.not(cggl.toBigLong(a)));
  }
  function or_0(a, b) {
    cggl.$clinit_LongLib();
    return cggl.createLongEmul(cggl.or(cggl.toBigLong(a), cggl.toBigLong(b)));
  }
  function shl_0(a, n) {
    cggl.$clinit_LongLib();
    return cggl.createLongEmul(cggl.shl(cggl.toBigLong(a), n));
  }
  function shr_0(a, n) {
    cggl.$clinit_LongLib();
    return cggl.createLongEmul(cggl.shr(cggl.toBigLong(a), n));
  }
  function shru_0(a, n) {
    cggl.$clinit_LongLib();
    return cggl.createLongEmul(cggl.shru(cggl.toBigLong(a), n));
  }
  function sub_2(a, b) {
    cggl.$clinit_LongLib();
    var result;
    if (cggl.isSmallLong(a) && cggl.isSmallLong(b)) {
      result = cggl.asDouble(a) - cggl.asDouble(b);
      if (cggl.isSafeIntegerRange(result)) {
        return cggl.createSmallLongEmul(result);
      }
    }
    return cggl.createLongEmul(cggl.sub_1(cggl.toBigLong(a), cggl.toBigLong(b)));
  }
  cggl.toBigLong = function toBigLong(value_0) {
    return cggl.isSmallLong(value_0) ? cggl.toBigLong_0(cggl.asSmallLong(value_0)) : asBigLong(value_0);
  };
  cggl.toBigLong_0 = function toBigLong_0(longValue) {
    var a0, a1, a3, value_0;
    value_0 = cggl.asDouble_0(longValue);
    a3 = 0;
    if (value_0 < 0) {
      value_0 += 17592186044416;
      a3 = 1048575;
    }
    a1 = round_int(value_0 / 4194304);
    a0 = round_int(value_0 - a1 * 4194304);
    return cggl.create_6(a0, a1, a3);
  };
  function toDouble_0(a) {
    cggl.$clinit_LongLib();
    var d;
    if (cggl.isSmallLong(a)) {
      d = cggl.asDouble(a);
      return d == -0 ? 0 : d;
    }
    return cggl.toDouble(asBigLong(a));
  }
  function toInt_0(a) {
    cggl.$clinit_LongLib();
    if (cggl.isSmallLong(a)) {
      return cggl.coerceToInt(cggl.asDouble(a));
    }
    return cggl.toInt(asBigLong(a));
  }
  cggl.toString_27 = function toString_27(value_0) {
    if (RUN_IN_JVM) {
      return jl.valueOf_19(fromDouble_0(value_0));
    }
    return jl.valueOf_16(value_0);
  };
  function toString_28(a) {
    cggl.$clinit_LongLib();
    if (cggl.isSmallLong(a)) {
      return cggl.toString_27(cggl.asDouble(a));
    }
    return cggl.toString_26(asBigLong(a));
  }
  cggl.truncate = function truncate(value_0) {
    return value_0 < 0 ? $wnd.Math.ceil(value_0) : $wnd.Math.floor(value_0);
  };
  function xor_0(a, b) {
    cggl.$clinit_LongLib();
    return cggl.createLongEmul(cggl.xor(cggl.toBigLong(a), cggl.toBigLong(b)));
  }
  defineClass(603, 1, { 1: 1 });
  _.$init_244 = function $init_244() {
  };
  var RUN_IN_JVM = false;
  cggl.Lcom_google_gwt_lang_LongLib_2_classLit = createForClass("com.google.gwt.lang", "LongLib", 603, cggl.Ljava_lang_Object_2_classLit);
  cggl.$clinit_LongLib$LongEmul = function $clinit_LongLib$LongEmul() {
    cggl.$clinit_LongLib$LongEmul = emptyMethod;
    jl.$clinit_Object();
  };
  cggl.LongLib$LongEmul = function LongLib$LongEmul() {
    cggl.$clinit_LongLib$LongEmul();
    Object_0.call(this);
    this.$init_245();
  };
  defineClass(250, 1, { 1: 1 }, cggl.LongLib$LongEmul);
  _.$init_245 = function $init_245() {
  };
  cggl.Lcom_google_gwt_lang_LongLib$LongEmul_2_classLit = createForClass("com.google.gwt.lang", "LongLib/LongEmul", 250, cggl.Ljava_lang_Object_2_classLit);
  cggl.$clinit_LongLib$SmallLong = function $clinit_LongLib$SmallLong() {
    cggl.$clinit_LongLib$SmallLong = emptyMethod;
    jl.$clinit_Object();
  };
  cggl.LongLib$SmallLong = function LongLib$SmallLong() {
    cggl.$clinit_LongLib$SmallLong();
    Object_0.call(this);
    this.$init_246();
  };
  defineClass(354, 1, { 1: 1 }, cggl.LongLib$SmallLong);
  _.$init_246 = function $init_246() {
  };
  _.d = 0;
  cggl.Lcom_google_gwt_lang_LongLib$SmallLong_2_classLit = createForClass("com.google.gwt.lang", "LongLib/SmallLong", 354, cggl.Ljava_lang_Object_2_classLit);
  cggl.$clinit_Stats = function $clinit_Stats() {
    cggl.$clinit_Stats = emptyMethod;
    jl.$clinit_Object();
  };
  function Stats() {
    Object_0.call(this);
    this.$init_247();
  }
  function isStatsAvailable_0() {
    cggl.$clinit_Stats();
    return !!$stats;
  }
  function onModuleStart(mainClassName) {
    cggl.$clinit_Stats();
    return $stats({ moduleName: $moduleName, sessionId: $sessionId, subSystem: "startup", evtGroup: "moduleStartup", millis: (/* @__PURE__ */ new Date()).getTime(), type: "onModuleLoadStart", className: mainClassName });
  }
  defineClass(606, 1, { 1: 1 });
  _.$init_247 = function $init_247() {
  };
  cggl.Lcom_google_gwt_lang_Stats_2_classLit = createForClass("com.google.gwt.lang", "Stats", 606, cggl.Ljava_lang_Object_2_classLit);
  cggl.$clinit_com_00046actelion_00046research_00046gwt_00046Js__EntryMethodHolder = function $clinit_com_00046actelion_00046research_00046gwt_00046Js__EntryMethodHolder() {
    cggl.$clinit_com_00046actelion_00046research_00046gwt_00046Js__EntryMethodHolder = emptyMethod;
    jl.$clinit_Object();
  };
  function init_9() {
    cggl.$clinit_com_00046actelion_00046research_00046gwt_00046Js__EntryMethodHolder();
    castTo(new cargj.JsEntrypoint(), 502).onModuleLoad();
  }
  defineClass(503, 1, { 1: 1 });
  cggl.Lcom_google_gwt_lang_com_100046actelion_100046research_100046gwt_100046Js_1_1EntryMethodHolder_2_classLit = createForClass("com.google.gwt.lang", "com_00046actelion_00046research_00046gwt_00046Js__EntryMethodHolder", 503, cggl.Ljava_lang_Object_2_classLit);
  ja.$clinit_Color = function $clinit_Color() {
    ja.$clinit_Color = emptyMethod;
    jl.$clinit_Object();
    ja.white = new ja.Color_0(255, 255, 255);
    ja.WHITE = ja.white;
    ja.gray_0 = new ja.Color_0(128, 128, 128);
    ja.GRAY = ja.gray_0;
    ja.black = new ja.Color_0(0, 0, 0);
    ja.BLACK = ja.black;
    ja.green_0 = new ja.Color_0(0, 255, 0);
    ja.GREEN = ja.green_0;
    ja.yellow = new ja.Color_0(255, 255, 0);
    ja.YELLOW = ja.yellow;
    ja.orange = new ja.Color_0(255, 200, 0);
    ja.ORANGE = ja.orange;
    ja.red_0 = new ja.Color_0(255, 0, 0);
    ja.RED = ja.red_0;
    ja.cyan = new ja.Color_0(0, 255, 255);
    ja.CYAN = ja.cyan;
    ja.blue_0 = new ja.Color_0(0, 0, 255);
    ja.BLUE = ja.blue_0;
    ja.magenta = new ja.Color_0(255, 0, 255);
    ja.MAGENTA = ja.magenta;
  };
  ja.Color = function Color(rgb) {
    ja.$clinit_Color();
    Object_0.call(this);
    this.$init_249();
    this.rgbValue = -16777216 | rgb;
  };
  ja.Color_0 = function Color_0(red, green, blue) {
    ja.$clinit_Color();
    ja.Color_1.call(this, red, green, blue, 255);
  };
  ja.Color_1 = function Color_1(red, green, blue, alpha_0) {
    ja.$clinit_Color();
    Object_0.call(this);
    this.$init_249();
    this.rgbValue = (alpha_0 & 255) << 24 | (red & 255) << 16 | (green & 255) << 8 | (blue & 255) << 0;
  };
  ja.RGBtoHSB = function RGBtoHSB(r, g, b, hsbvals) {
    ja.$clinit_Color();
    return ja.RGBtoHSV(r / 255, g / 255, b / 255, hsbvals);
  };
  ja.RGBtoHSV = function RGBtoHSV(r, g, b, hsbvals) {
    var brightness, delta, hue, max_0, min_0, saturation;
    hue = 0;
    saturation = 0;
    brightness = 0;
    if (jsEquals(hsbvals, null)) {
      hsbvals = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    }
    min_0 = $wnd.Math.min(r, $wnd.Math.min(g, b));
    max_0 = $wnd.Math.max(r, $wnd.Math.max(g, b));
    brightness = max_0;
    delta = max_0 - min_0;
    if (delta == 0) {
      brightness = min_0;
      hue = 0;
      hsbvals[0] = hue;
      hsbvals[1] = saturation;
      hsbvals[2] = brightness;
      return hsbvals;
    }
    if (max_0 != 0)
      saturation = delta / max_0;
    else {
      saturation = 0;
      hue = 0;
      hsbvals[0] = hue;
      hsbvals[1] = saturation;
      hsbvals[2] = brightness;
      return hsbvals;
    }
    if (r == max_0)
      hue = (g - b) / delta;
    else if (g == max_0)
      hue = 2 + (b - r) / delta;
    else
      hue = 4 + (r - g) / delta;
    hue *= 60;
    if (hue < 0)
      hue += 360;
    hsbvals[0] = hue / 360;
    hsbvals[1] = saturation;
    hsbvals[2] = brightness;
    return hsbvals;
  };
  defineClass(63, 1, { 1: 1 }, ja.Color, ja.Color_0, ja.Color_1);
  _.$init_249 = function $init_249() {
    this.realRGBValues = null;
    this.alphaValue = 0;
  };
  _.getAlpha = function getAlpha() {
    return this.rgbValue >> 24 & 255;
  };
  _.getBlue = function getBlue() {
    return this.rgbValue >> 0 & 255;
  };
  _.getGreen = function getGreen() {
    return this.rgbValue >> 8 & 255;
  };
  _.getRGB_0 = function getRGB_1() {
    return this.rgbValue;
  };
  _.getRGBColorComponents = function getRGBColorComponents(compArray) {
    var f;
    if (jsEquals(compArray, null)) {
      f = initUnidimensionalArray(cggl.F_classLit, { 44: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    } else {
      f = compArray;
    }
    if (jsEquals(this.realRGBValues, null)) {
      f[0] = this.getRed() / 255;
      f[1] = this.getGreen() / 255;
      f[2] = this.getBlue() / 255;
    } else {
      f[0] = this.realRGBValues[0];
      f[1] = this.realRGBValues[1];
      f[2] = this.realRGBValues[2];
    }
    return f;
  };
  _.getRed = function getRed() {
    return this.rgbValue >> 16 & 255;
  };
  _.alphaValue = 0;
  _.rgbValue = 0;
  cggl.Ljava_awt_Color_2_classLit = createForClass("java.awt", "Color", 63, cggl.Ljava_lang_Object_2_classLit);
  ja.$clinit_Font = function $clinit_Font() {
    ja.$clinit_Font = emptyMethod;
    jl.$clinit_Object();
    ja.helveticaSizes = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [5.55, 15, 15, 15, 15, 15, 15, 15, 15, 5.56, 5.56, 5.56, 5.56, 5.56, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 5.56, 5.56, 7.1, 11.12, 11.12, 17.78, 13.34, 3.82, 6.66, 6.66, 7.78, 11.68, 5.56, 6.66, 5.56, 5.56, 11.12, 11.12, 11.12, 11.12, 11.12, 11.12, 11.12, 11.12, 11.12, 11.12, 5.56, 5.56, 11.68, 11.68, 11.68, 11.12, 20.3, 13.34, 13.34, 14.44, 14.44, 13.34, 12.22, 15.56, 14.44, 5.56, 10, 13.34, 11.12, 16.66, 14.44, 15.56, 13.34, 15.56, 14.44, 13.34, 12.22, 14.44, 13.34, 18.88, 13.34, 13.34, 12.22, 5.56, 5.56, 5.56, 9.38, 11.12, 6.66, 11.12, 11.12, 10, 11.12, 11.12, 5.56, 11.12, 11.12, 4.44, 4.44, 10, 4.44, 16.66, 11.12, 11.12, 11.12, 11.12, 6.66, 10, 5.56, 11.12, 10, 14.44, 10, 10, 10, 6.68, 5.2, 6.68, 11.68, 10.5]);
  };
  ja.Font = function Font(name_0, type_0, size_0) {
    ja.$clinit_Font();
    Object_0.call(this);
    this.$init_250();
    this.name_0 = name_0;
    this.size_0 = size_0;
  };
  defineClass(264, 1, { 1: 1 }, ja.Font);
  _.$init_250 = function $init_250() {
  };
  _.getCharWidth = function getCharWidth(ch_0) {
    var width_0;
    if (ch_0 < 128) {
      width_0 = ja.helveticaSizes[ch_0];
    } else {
      width_0 = 5.56;
    }
    return width_0 * this.size_0 / 20;
  };
  _.getName_0 = function getName_8() {
    return this.name_0;
  };
  _.getSize_0 = function getSize_8() {
    return this.size_0;
  };
  _.getStringBounds = function getStringBounds(theString, fontRenderContext) {
    var width_0;
    width_0 = this.getStringWidth_0(theString);
    return new jag.Rectangle2D$Double(0, 0, width_0, 0);
  };
  _.getStringWidth_0 = function getStringWidth_1(text_0) {
    var ch_0, i, n, total;
    if (jl.equals_Ljava_lang_Object__Z__devirtual$_2(this.name_0, "Helvetica")) {
      total = 0;
      for (i = 0, n = jl.length__I__devirtual$_0(text_0); i < n; i++) {
        ch_0 = jl.charAt_I_C__devirtual$_0(text_0, i);
        total += this.getCharWidth(ch_0);
      }
      return total;
    } else {
      return this.getStringWidthCanvas(text_0);
    }
  };
  _.getStringWidthCanvas = function getStringWidthCanvas(text_0) {
    var canvas = ja.canvas_0;
    if (!canvas) {
      canvas = $doc.createElement("canvas");
      ja.canvas_0 = canvas;
    }
    var f = "" + this.size_0 + "px " + this.name_0;
    var ctx_0 = canvas.getContext("2d");
    ctx_0.font = f;
    var text_0 = ctx_0.measureText(text_0);
    return text_0.width;
  };
  _.size_0 = 0;
  ja.BOLD = 1;
  ja.ITALIC = 2;
  ja.PLAIN = 0;
  ja.canvas_0 = null;
  cggl.Ljava_awt_Font_2_classLit = createForClass("java.awt", "Font", 264, cggl.Ljava_lang_Object_2_classLit);
  ja.$clinit_Graphics2D = function $clinit_Graphics2D() {
    ja.$clinit_Graphics2D = emptyMethod;
    jl.$clinit_Object();
  };
  ja.Graphics2D = function Graphics2D() {
    ja.$clinit_Graphics2D();
    Object_0.call(this);
    this.$init_251();
  };
  defineClass(453, 1, { 1: 1 }, ja.Graphics2D);
  _.$init_251 = function $init_251() {
  };
  _.getFontRenderContext = function getFontRenderContext() {
    return new jaf.FontRenderContext();
  };
  cggl.Ljava_awt_Graphics2D_2_classLit = createForClass("java.awt", "Graphics2D", 453, cggl.Ljava_lang_Object_2_classLit);
  jag.$clinit_Point2D = function $clinit_Point2D() {
    jag.$clinit_Point2D = emptyMethod;
    jl.$clinit_Object();
  };
  jag.Point2D = function Point2D() {
    jag.$clinit_Point2D();
    Object_0.call(this);
    this.$init_252();
  };
  defineClass(92, 1, { 92: 1, 1: 1 });
  _.$init_252 = function $init_252() {
  };
  _.equals_0 = function equals_20(obj) {
    var p2d;
    if (maskUndefined(this) === maskUndefined(obj))
      return true;
    if (instanceOf(obj, 92)) {
      p2d = castTo(obj, 92);
      return this.getX_2() == p2d.getX_2() && this.getY_2() == p2d.getY_2();
    }
    return getClassPrototype(1).equals_0.call(this, obj);
  };
  _.hashCode_1 = function hashCode_5() {
    var sum;
    sum = this.getX_2() + this.getY_2();
    return round_int(sum) * 37;
  };
  cggl.Ljava_awt_geom_Point2D_2_classLit = createForClass("java.awt.geom", "Point2D", 92, cggl.Ljava_lang_Object_2_classLit);
  ja.$clinit_Point = function $clinit_Point() {
    ja.$clinit_Point = emptyMethod;
    jag.$clinit_Point2D();
  };
  ja.Point = function Point() {
    ja.$clinit_Point();
    ja.Point_0.call(this, 0, 0);
  };
  ja.Point_0 = function Point_0(x_0, y_0) {
    jag.Point2D.call(this);
    this.$init_253();
    this.x_0 = x_0;
    this.y_0 = y_0;
  };
  defineClass(163, 92, { 163: 1, 92: 1, 1: 1 }, ja.Point);
  _.$init_253 = function $init_253() {
  };
  _.equals_0 = function equals_21(obj) {
    var pt;
    if (instanceOf(obj, 163)) {
      pt = castTo(obj, 163);
      return this.x_0 == pt.x_0 && this.y_0 == pt.y_0;
    }
    return getClassPrototype(92).equals_0.call(this, obj);
  };
  _.getX_2 = function getX_5() {
    return this.x_0;
  };
  _.getY_2 = function getY_5() {
    return this.y_0;
  };
  _.x_0 = 0;
  _.y_0 = 0;
  cggl.Ljava_awt_Point_2_classLit = createForClass("java.awt", "Point", 163, cggl.Ljava_awt_geom_Point2D_2_classLit);
  ja.$clinit_Shape = function $clinit_Shape() {
    ja.$clinit_Shape = emptyMethod;
  };
  cggl.Ljava_awt_Shape_2_classLit = createForInterface("java.awt", "Shape");
  jaf.$clinit_FontRenderContext = function $clinit_FontRenderContext() {
    jaf.$clinit_FontRenderContext = emptyMethod;
    jl.$clinit_Object();
  };
  jaf.FontRenderContext = function FontRenderContext() {
    jaf.$clinit_FontRenderContext();
    Object_0.call(this);
    this.$init_254();
  };
  defineClass(470, 1, { 1: 1 }, jaf.FontRenderContext);
  _.$init_254 = function $init_254() {
  };
  cggl.Ljava_awt_font_FontRenderContext_2_classLit = createForClass("java.awt.font", "FontRenderContext", 470, cggl.Ljava_lang_Object_2_classLit);
  jag.$clinit_Point2D$Double = function $clinit_Point2D$Double() {
    jag.$clinit_Point2D$Double = emptyMethod;
    jag.$clinit_Point2D();
  };
  jag.Point2D$Double = function Point2D$Double() {
    jag.$clinit_Point2D$Double();
    jag.Point2D.call(this);
    this.$init_255();
  };
  jag.Point2D$Double_0 = function Point2D$Double_0(x_0, y_0) {
    jag.$clinit_Point2D$Double();
    jag.Point2D.call(this);
    this.$init_255();
    this.x_0 = x_0;
    this.y_0 = y_0;
  };
  defineClass(177, 92, { 92: 1, 177: 1, 4: 1, 1: 1 }, jag.Point2D$Double, jag.Point2D$Double_0);
  _.$init_255 = function $init_255() {
  };
  _.getX_2 = function getX_6() {
    return this.x_0;
  };
  _.getY_2 = function getY_6() {
    return this.y_0;
  };
  _.x_0 = 0;
  _.y_0 = 0;
  cggl.Ljava_awt_geom_Point2D$Double_2_classLit = createForClass("java.awt.geom", "Point2D/Double", 177, cggl.Ljava_awt_geom_Point2D_2_classLit);
  jag.$clinit_Point2D$Float = function $clinit_Point2D$Float() {
    jag.$clinit_Point2D$Float = emptyMethod;
  };
  defineClass(764, 92, { 92: 1, 1: 1 });
  cggl.Ljava_awt_geom_Point2D$Float_2_classLit = createForClass("java.awt.geom", "Point2D/Float", 764, cggl.Ljava_awt_geom_Point2D_2_classLit);
  jag.$clinit_RectangularShape = function $clinit_RectangularShape() {
    jag.$clinit_RectangularShape = emptyMethod;
    jl.$clinit_Object();
  };
  jag.RectangularShape = function RectangularShape() {
    jag.$clinit_RectangularShape();
    Object_0.call(this);
    this.$init_256();
  };
  defineClass(469, 1, { 1: 1 });
  _.$init_256 = function $init_256() {
  };
  cggl.Ljava_awt_geom_RectangularShape_2_classLit = createForClass("java.awt.geom", "RectangularShape", 469, cggl.Ljava_lang_Object_2_classLit);
  jag.$clinit_Rectangle2D = function $clinit_Rectangle2D() {
    jag.$clinit_Rectangle2D = emptyMethod;
    jag.$clinit_RectangularShape();
  };
  jag.Rectangle2D = function Rectangle2D() {
    jag.$clinit_Rectangle2D();
    jag.RectangularShape.call(this);
    this.$init_257();
  };
  defineClass(146, 469, { 146: 1, 1: 1 });
  _.$init_257 = function $init_257() {
  };
  _.contains_0 = function contains_9(x_0, y_0) {
    var x0, y0;
    x0 = this.getX_2();
    y0 = this.getY_2();
    return x_0 >= x0 && y_0 >= y0 && x_0 < x0 + this.getWidth_0() && y_0 < y0 + this.getHeight_0();
  };
  _.equals_0 = function equals_22(obj) {
    var r2d;
    if (maskUndefined(obj) === maskUndefined(this)) {
      return true;
    }
    if (instanceOf(obj, 146)) {
      r2d = castTo(obj, 146);
      return this.getX_2() == r2d.getX_2() && this.getY_2() == r2d.getY_2() && this.getWidth_0() == r2d.getWidth_0() && this.getHeight_0() == r2d.getHeight_0();
    }
    return false;
  };
  _.hashCode_1 = function hashCode_6() {
    var bits;
    bits = doubleToLongBits(this.getX_2());
    bits = add_20(bits, mul_0(doubleToLongBits(this.getY_2()), 37));
    bits = add_20(bits, mul_0(doubleToLongBits(this.getWidth_0()), 43));
    bits = add_20(bits, mul_0(doubleToLongBits(this.getHeight_0()), 47));
    return toInt_0(bits) ^ toInt_0(shr_0(bits, 32));
  };
  jag.OUT_BOTTOM = 8;
  jag.OUT_LEFT = 1;
  jag.OUT_RIGHT = 4;
  jag.OUT_TOP = 2;
  cggl.Ljava_awt_geom_Rectangle2D_2_classLit = createForClass("java.awt.geom", "Rectangle2D", 146, cggl.Ljava_awt_geom_RectangularShape_2_classLit);
  jag.$clinit_Rectangle2D$Double = function $clinit_Rectangle2D$Double() {
    jag.$clinit_Rectangle2D$Double = emptyMethod;
    jag.$clinit_Rectangle2D();
  };
  jag.Rectangle2D$Double = function Rectangle2D$Double(x_0, y_0, w, h) {
    jag.$clinit_Rectangle2D$Double();
    jag.Rectangle2D.call(this);
    this.$init_258();
    this.setRect(x_0, y_0, w, h);
  };
  defineClass(471, 146, { 146: 1, 1: 1 }, jag.Rectangle2D$Double);
  _.$init_258 = function $init_258() {
  };
  _.getHeight_0 = function getHeight_4() {
    return this.height_0;
  };
  _.getWidth_0 = function getWidth_4() {
    return this.width_0;
  };
  _.getX_2 = function getX_7() {
    return this.x_0;
  };
  _.getY_2 = function getY_7() {
    return this.y_0;
  };
  _.isEmpty_0 = function isEmpty_4() {
    return this.width_0 <= 0 || this.height_0 <= 0;
  };
  _.setRect = function setRect(x_0, y_0, w, h) {
    this.x_0 = x_0;
    this.y_0 = y_0;
    this.width_0 = w;
    this.height_0 = h;
  };
  _.height_0 = 0;
  _.width_0 = 0;
  _.x_0 = 0;
  _.y_0 = 0;
  cggl.Ljava_awt_geom_Rectangle2D$Double_2_classLit = createForClass("java.awt.geom", "Rectangle2D/Double", 471, cggl.Ljava_awt_geom_Rectangle2D_2_classLit);
  jag.$clinit_Rectangle2D$Float = function $clinit_Rectangle2D$Float() {
    jag.$clinit_Rectangle2D$Float = emptyMethod;
  };
  defineClass(798, 146, { 146: 1, 1: 1 });
  cggl.Ljava_awt_geom_Rectangle2D$Float_2_classLit = createForClass("java.awt.geom", "Rectangle2D/Float", 798, cggl.Ljava_awt_geom_Rectangle2D_2_classLit);
  jai.$clinit_BufferedImage = function $clinit_BufferedImage() {
    jai.$clinit_BufferedImage = emptyMethod;
    jl.$clinit_Object();
  };
  jai.BufferedImage = function BufferedImage(width_0, height, typeIntArgb) {
    jai.$clinit_BufferedImage();
    Object_0.call(this);
    this.$init_259();
  };
  defineClass(452, 1, { 1: 1 }, jai.BufferedImage);
  _.$init_259 = function $init_259() {
  };
  _.createGraphics = function createGraphics() {
    return new ja.Graphics2D();
  };
  jai.TYPE_CUSTOM = 0;
  jai.TYPE_INT_ARGB = 2;
  jai.TYPE_INT_ARGB_PRE = 3;
  jai.TYPE_INT_RGB = 1;
  cggl.Ljava_awt_image_BufferedImage_2_classLit = createForClass("java.awt.image", "BufferedImage", 452, cggl.Ljava_lang_Object_2_classLit);
  ji.$clinit_Reader = function $clinit_Reader() {
    ji.$clinit_Reader = emptyMethod;
    jl.$clinit_Object();
  };
  ji.Reader = function Reader() {
    ji.$clinit_Reader();
    Object_0.call(this);
    this.$init_260();
  };
  defineClass(184, 1, { 1: 1 });
  _.$init_260 = function $init_260() {
  };
  _.read_0 = function read_0() {
    var chr;
    chr = initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, 1, 15, 1);
    return this.read_1(chr) == -1 ? -1 : chr[0];
  };
  _.read_1 = function read_1(buf) {
    return this.read_2(buf, 0, buf.length);
  };
  _.reset_0 = function reset_2() {
    throw toJs(new ji.IOException("Not supported"));
  };
  ji.MAX_SKIP_BUFFER_SIZE = 1024;
  cggl.Ljava_io_Reader_2_classLit = createForClass("java.io", "Reader", 184, cggl.Ljava_lang_Object_2_classLit);
  ji.$clinit_BufferedReader = function $clinit_BufferedReader() {
    ji.$clinit_BufferedReader = emptyMethod;
    ji.$clinit_Reader();
  };
  ji.BufferedReader = function BufferedReader(source) {
    ji.$clinit_BufferedReader();
    ji.Reader.call(this);
    this.$init_261();
    this.source = source;
    this.savedNextChar = -2;
  };
  defineClass(62, 184, { 62: 1, 1: 1 }, ji.BufferedReader);
  _.$init_261 = function $init_261() {
  };
  _.close_0 = function close_1() {
  };
  _.getSource_0 = function getSource_1() {
    return this.source;
  };
  _.read_0 = function read_2() {
    var result;
    result = -1;
    if (this.savedNextChar != -2) {
      result = this.savedNextChar;
      this.savedNextChar = -2;
    } else {
      result = this.getSource_0().read_0();
    }
    return result;
  };
  _.read_2 = function read_3(cbuf, off, len) {
    return this.source.read_2(cbuf, off, len);
  };
  _.readLine = function readLine() {
    var eol, nextChar, sb;
    nextChar = this.read_0();
    if (nextChar == -1)
      return null;
    sb = new jl.StringBuilder();
    eol = false;
    while (!eol) {
      if (nextChar == 10) {
        eol = true;
      } else if (nextChar == 13) {
        eol = true;
        nextChar = this.read_0();
        if (nextChar != 10) {
          this.savedNextChar = nextChar;
        }
      }
      if (!eol) {
        if (nextChar == -1) {
          break;
        }
        sb.append_4(narrow_char(nextChar));
        nextChar = this.read_0();
      }
    }
    return sb.toString_0();
  };
  _.savedNextChar = 0;
  cggl.Ljava_io_BufferedReader_2_classLit = createForClass("java.io", "BufferedReader", 62, cggl.Ljava_io_Reader_2_classLit);
  jl.$clinit_Appendable = function $clinit_Appendable() {
    jl.$clinit_Appendable = emptyMethod;
  };
  cggl.Ljava_lang_Appendable_2_classLit = createForInterface("java.lang", "Appendable");
  jl.$clinit_AutoCloseable = function $clinit_AutoCloseable() {
    jl.$clinit_AutoCloseable = emptyMethod;
  };
  cggl.Ljava_lang_AutoCloseable_2_classLit = createForInterface("java.lang", "AutoCloseable");
  ji.$clinit_Closeable = function $clinit_Closeable() {
    ji.$clinit_Closeable = emptyMethod;
  };
  cggl.Ljava_io_Closeable_2_classLit = createForInterface("java.io", "Closeable");
  ji.$clinit_Flushable = function $clinit_Flushable() {
    ji.$clinit_Flushable = emptyMethod;
  };
  cggl.Ljava_io_Flushable_2_classLit = createForInterface("java.io", "Flushable");
  ji.$clinit_Writer = function $clinit_Writer() {
    ji.$clinit_Writer = emptyMethod;
    jl.$clinit_Object();
  };
  ji.Writer = function Writer() {
    ji.$clinit_Writer();
    Object_0.call(this);
    this.$init_262();
  };
  defineClass(442, 1, { 1: 1 });
  _.$init_262 = function $init_262() {
  };
  _.close_0 = function close_2() {
  };
  _.flush = function flush() {
  };
  _.write_2 = function write_1(c) {
    if (jsEquals(this.writeBuffer, null)) {
      this.writeBuffer = initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, this.writeBufferSize, 15, 1);
    }
    this.writeBuffer[0] = narrow_char(c);
    this.write_5(this.writeBuffer, 0, 1);
  };
  _.write_3 = function write_2(str) {
    this.write_4(str, 0, jl.length__I__devirtual$_0(str));
  };
  _.write_4 = function write_3(str, off, len) {
    var cbuf;
    if (len <= this.writeBufferSize) {
      if (jsEquals(this.writeBuffer, null)) {
        this.writeBuffer = initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, this.writeBufferSize, 15, 1);
      }
      cbuf = this.writeBuffer;
    } else {
      cbuf = initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, len, 15, 1);
    }
    jl.getChars_II_CI_V__devirtual$(str, off, off + len, cbuf, 0);
    this.write_5(cbuf, 0, len);
  };
  _.write_5 = function write_4(cbuf, off, len) {
  };
  _.writeBufferSize = 1024;
  cggl.Ljava_io_Writer_2_classLit = createForClass("java.io", "Writer", 442, cggl.Ljava_lang_Object_2_classLit);
  ji.$clinit_BufferedWriter = function $clinit_BufferedWriter() {
    ji.$clinit_BufferedWriter = emptyMethod;
  };
  defineClass(813, 442, { 1: 1 });
  _.newLine = function newLine() {
    ocu.throwUnimplemented();
  };
  cggl.Ljava_io_BufferedWriter_2_classLit = createForClass("java.io", "BufferedWriter", 813, cggl.Ljava_io_Writer_2_classLit);
  ji.$clinit_File = function $clinit_File() {
    ji.$clinit_File = emptyMethod;
  };
  defineClass(594, 1, { 1: 1 });
  cggl.Ljava_io_File_2_classLit = createForClass("java.io", "File", 594, cggl.Ljava_lang_Object_2_classLit);
  ji.$clinit_IOException = function $clinit_IOException() {
    ji.$clinit_IOException = emptyMethod;
    jl.$clinit_Exception();
  };
  ji.IOException = function IOException(message) {
    ji.$clinit_IOException();
    jl.Exception_1.call(this, message);
    this.$init_263();
  };
  ji.IOException_0 = function IOException_0(throwable) {
    ji.$clinit_IOException();
    jl.Exception_3.call(this, throwable);
    this.$init_263();
  };
  defineClass(50, 12, { 50: 1, 4: 1, 12: 1, 1: 1, 18: 1 }, ji.IOException, ji.IOException_0);
  _.$init_263 = function $init_263() {
  };
  cggl.Ljava_io_IOException_2_classLit = createForClass("java.io", "IOException", 50, cggl.Ljava_lang_Exception_2_classLit);
  ji.$clinit_FileNotFoundException = function $clinit_FileNotFoundException() {
    ji.$clinit_FileNotFoundException = emptyMethod;
  };
  defineClass(276, 50, { 276: 1, 50: 1, 4: 1, 12: 1, 1: 1, 18: 1 });
  cggl.Ljava_io_FileNotFoundException_2_classLit = createForClass("java.io", "FileNotFoundException", 276, cggl.Ljava_io_IOException_2_classLit);
  ji.$clinit_FileReader = function $clinit_FileReader() {
    ji.$clinit_FileReader = emptyMethod;
    ji.$clinit_Reader();
  };
  ji.FileReader_0 = function FileReader_0(filename) {
    ji.$clinit_FileReader();
    ji.Reader.call(this);
    this.$init_264();
  };
  defineClass(278, 184, { 1: 1 }, ji.FileReader_0);
  _.$init_264 = function $init_264() {
  };
  _.close_0 = function close_3() {
    ocu.throwUnimplemented();
  };
  _.read_0 = function read_4() {
    ocu.throwUnimplemented();
    return 0;
  };
  _.read_2 = function read_5(cbuf, off, len) {
    ocu.throwUnimplemented();
    return 0;
  };
  cggl.Ljava_io_FileReader_2_classLit = createForClass("java.io", "FileReader", 278, cggl.Ljava_io_Reader_2_classLit);
  ji.$clinit_OutputStream = function $clinit_OutputStream() {
    ji.$clinit_OutputStream = emptyMethod;
    jl.$clinit_Object();
  };
  ji.OutputStream = function OutputStream() {
    ji.$clinit_OutputStream();
    Object_0.call(this);
    this.$init_265();
  };
  defineClass(304, 1, { 1: 1 });
  _.$init_265 = function $init_265() {
  };
  _.close_0 = function close_4() {
  };
  _.flush = function flush_0() {
  };
  _.write_6 = function write_5(buffer) {
    ji2.checkNotNull_0(buffer);
    this.write_7(buffer, 0, buffer.length);
  };
  _.write_7 = function write_6(buffer, offset, count) {
    var i;
    ji.checkOffsetAndCount_0(buffer, offset, count);
    for (i = offset; i < offset + count; i++) {
      this.write_2(buffer[i]);
    }
  };
  cggl.Ljava_io_OutputStream_2_classLit = createForClass("java.io", "OutputStream", 304, cggl.Ljava_lang_Object_2_classLit);
  ji.$clinit_FilterOutputStream = function $clinit_FilterOutputStream() {
    ji.$clinit_FilterOutputStream = emptyMethod;
    ji.$clinit_OutputStream();
  };
  ji.FilterOutputStream = function FilterOutputStream(out) {
    ji.$clinit_FilterOutputStream();
    ji.OutputStream.call(this);
    this.$init_266();
    this.out = out;
  };
  defineClass(303, 304, { 1: 1 });
  _.$init_266 = function $init_266() {
  };
  _.close_0 = function close_5() {
    var e, thrown;
    thrown = null;
    try {
      this.flush();
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 18)) {
        e = $e0;
        thrown = e;
      } else
        throw toJs($e0);
    }
    try {
      this.out.close_0();
    } catch ($e1) {
      $e1 = toJava($e1);
      if (instanceOf($e1, 18)) {
        e = $e1;
        if (isNull(thrown)) {
          thrown = e;
        }
      } else
        throw toJs($e1);
    }
    if (isNotNull(thrown)) {
      throw toJs(new ji.IOException_0(thrown));
    }
  };
  _.flush = function flush_1() {
    this.out.flush();
  };
  _.write_2 = function write_7(oneByte) {
    this.out.write_2(oneByte);
  };
  _.write_7 = function write_8(buffer, offset, length_0) {
    var i;
    ji.checkOffsetAndCount_0(buffer, offset, length_0);
    for (i = 0; i < length_0; i++) {
      this.write_2(buffer[offset + i]);
    }
  };
  cggl.Ljava_io_FilterOutputStream_2_classLit = createForClass("java.io", "FilterOutputStream", 303, cggl.Ljava_io_OutputStream_2_classLit);
  ji.$clinit_HasSerializableTypeMarker = function $clinit_HasSerializableTypeMarker() {
    ji.$clinit_HasSerializableTypeMarker = emptyMethod;
  };
  ji.$clinit_IOUtils = function $clinit_IOUtils() {
    ji.$clinit_IOUtils = emptyMethod;
    jl.$clinit_Object();
  };
  ji.checkOffsetAndCount = function checkOffsetAndCount(length_0, offset, count) {
    if (offset < 0 || count < 0 || offset + count > length_0) {
      throw toJs(new jl.IndexOutOfBoundsException());
    }
  };
  ji.checkOffsetAndCount_0 = function checkOffsetAndCount_0(buffer, byteOffset, byteCount) {
    ji.$clinit_IOUtils();
    ji2.checkNotNull_0(buffer);
    ji.checkOffsetAndCount(buffer.length, byteOffset, byteCount);
  };
  defineClass(800, 1, { 1: 1 });
  cggl.Ljava_io_IOUtils_2_classLit = createForClass("java.io", "IOUtils", 800, cggl.Ljava_lang_Object_2_classLit);
  ji.$clinit_InputStream = function $clinit_InputStream() {
    ji.$clinit_InputStream = emptyMethod;
    jl.$clinit_Object();
  };
  ji.InputStream = function InputStream() {
    ji.$clinit_InputStream();
    Object_0.call(this);
    this.$init_267();
  };
  defineClass(383, 1, { 1: 1 });
  _.$init_267 = function $init_267() {
  };
  _.close_0 = function close_6() {
    ocu.throwUnimplemented();
  };
  _.read_0 = function read_6() {
    ocu.throwUnimplemented();
    return -1;
  };
  _.read_3 = function read_7(b) {
    ocu.throwUnimplemented();
    return -1;
  };
  cggl.Ljava_io_InputStream_2_classLit = createForClass("java.io", "InputStream", 383, cggl.Ljava_lang_Object_2_classLit);
  ji.$clinit_InputStreamReader = function $clinit_InputStreamReader() {
    ji.$clinit_InputStreamReader = emptyMethod;
    ji.$clinit_Reader();
  };
  ji.InputStreamReader = function InputStreamReader(in_0) {
    ji.Reader.call(this);
    this.$init_268();
    this.mStream = in_0;
  };
  ji.InputStreamReader_0 = function InputStreamReader_0(in_0, cs) {
    ji.$clinit_InputStreamReader();
    ji.InputStreamReader.call(this, in_0);
  };
  defineClass(120, 184, { 1: 1 }, ji.InputStreamReader_0);
  _.$init_268 = function $init_268() {
  };
  _.close_0 = function close_7() {
    this.mStream.close_0();
  };
  _.read_0 = function read_8() {
    return this.mStream.read_0();
  };
  _.read_1 = function read_9(cbuf) {
    return this.read_2(cbuf, 0, cbuf.length);
  };
  _.read_2 = function read_10(cbuf, offset, length_0) {
    var b, i, read;
    b = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, length_0, 15, 1);
    read = this.mStream.read_3(b);
    for (i = 0; i < read; i++) {
      cbuf[offset + i] = narrow_char(b[i]);
    }
    return read;
  };
  cggl.Ljava_io_InputStreamReader_2_classLit = createForClass("java.io", "InputStreamReader", 120, cggl.Ljava_io_Reader_2_classLit);
  ji.$clinit_PrintStream = function $clinit_PrintStream() {
    ji.$clinit_PrintStream = emptyMethod;
    ji.$clinit_FilterOutputStream();
  };
  ji.PrintStream = function PrintStream(out) {
    ji.$clinit_PrintStream();
    ji.FilterOutputStream.call(this, out);
    this.$init_269();
  };
  defineClass(234, 303, { 1: 1 }, ji.PrintStream);
  _.$init_269 = function $init_269() {
    this.ioError = false;
  };
  _.close_0 = function close_8() {
    var e;
    this.flush();
    if (isNotNull(this.out)) {
      try {
        this.out.close_0();
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 50)) {
          e = $e0;
          this.setError();
        } else
          throw toJs($e0);
      } finally {
        this.out = null;
      }
    }
  };
  _.flush = function flush_2() {
    var e;
    if (isNotNull(this.out)) {
      try {
        this.out.flush();
        return;
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 50)) {
          e = $e0;
        } else
          throw toJs($e0);
      }
    }
    this.setError();
  };
  _.newline = function newline() {
    this.print_0(10);
  };
  _.print_0 = function print_0(x_0) {
    this.print_1(jl.valueOf_15(x_0));
  };
  _.print_1 = function print_1(s) {
    var e;
    if (isNull(this.out)) {
      this.setError();
      return;
    }
    if (jsEquals(s, null)) {
      this.print_1("null");
      return;
    }
    try {
      this.write_6(jl.getBytes___B__devirtual$(s));
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 50)) {
        e = $e0;
        this.setError();
      } else
        throw toJs($e0);
    }
  };
  _.println = function println() {
    this.newline();
  };
  _.println_0 = function println_0(s) {
    this.print_1(s);
    this.newline();
  };
  _.setError = function setError() {
    this.ioError = true;
  };
  _.write_2 = function write_9(oneByte) {
    var b, e, isNewline;
    if (isNull(this.out)) {
      this.setError();
      return;
    }
    try {
      this.out.write_2(oneByte);
      b = oneByte & 255;
      isNewline = b == 10 || b == 21;
      if (isNewline) {
        this.flush();
      }
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 50)) {
        e = $e0;
        this.setError();
      } else
        throw toJs($e0);
    }
  };
  _.write_7 = function write_10(buffer, offset, length_0) {
    var e;
    ji.checkOffsetAndCount_0(buffer, offset, length_0);
    if (isNull(this.out)) {
      this.setError();
      return;
    }
    try {
      this.out.write_7(buffer, offset, length_0);
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 50)) {
        e = $e0;
        this.setError();
      } else
        throw toJs($e0);
    }
  };
  _.ioError = false;
  cggl.Ljava_io_PrintStream_2_classLit = createForClass("java.io", "PrintStream", 234, cggl.Ljava_io_FilterOutputStream_2_classLit);
  ji.$clinit_StringReader = function $clinit_StringReader() {
    ji.$clinit_StringReader = emptyMethod;
    ji.$clinit_Reader();
  };
  ji.StringReader = function StringReader(text_0) {
    ji.$clinit_StringReader();
    ji.Reader.call(this);
    this.$init_270();
    this.text_0 = text_0;
    this.position = 0;
  };
  defineClass(172, 184, { 1: 1 }, ji.StringReader);
  _.$init_270 = function $init_270() {
  };
  _.close_0 = function close_9() {
  };
  _.read_0 = function read_11() {
    return this.position == jl.length__I__devirtual$_0(this.text_0) ? -1 : jl.charAt_I_C__devirtual$_0(this.text_0, this.position++);
  };
  _.read_2 = function read_12(cbuf, off, len) {
    var n;
    if (this.position >= jl.length__I__devirtual$_0(this.text_0))
      return -1;
    n = $wnd.Math.min(jl.length__I__devirtual$_0(this.text_0) - this.position, len);
    jl.getChars_II_CI_V__devirtual$(this.text_0, this.position, this.position + n, cbuf, off);
    this.position += n;
    return n;
  };
  _.position = 0;
  cggl.Ljava_io_StringReader_2_classLit = createForClass("java.io", "StringReader", 172, cggl.Ljava_io_Reader_2_classLit);
  ji.$clinit_StringWriter = function $clinit_StringWriter() {
    ji.$clinit_StringWriter = emptyMethod;
    ji.$clinit_Writer();
  };
  ji.StringWriter = function StringWriter() {
    ji.$clinit_StringWriter();
    ji.Writer.call(this);
    this.$init_271();
    this.buf = new jl.StringBuffer();
  };
  defineClass(262, 442, { 1: 1 }, ji.StringWriter);
  _.$init_271 = function $init_271() {
  };
  _.close_0 = function close_10() {
  };
  _.flush = function flush_3() {
  };
  _.getBuffer = function getBuffer() {
    return this.buf;
  };
  _.toString_0 = function toString_30() {
    return this.buf.toString_0();
  };
  _.write_2 = function write_11(c) {
    this.buf.append_0(narrow_char(c));
  };
  _.write_3 = function write_12(str) {
    this.buf.append_2(str);
  };
  _.write_4 = function write_13(str, off, len) {
    this.buf.append_2(jl.substring_II_Ljava_lang_String___devirtual$(str, off, off + len));
  };
  _.write_5 = function write_14(cbuf, off, len) {
    if (off < 0 || off > cbuf.length || len < 0 || off + len > cbuf.length || off + len < 0) {
      throw toJs(new jl.IndexOutOfBoundsException());
    } else if (len == 0) {
      return;
    }
    this.buf.append_3(cbuf, off, len);
  };
  cggl.Ljava_io_StringWriter_2_classLit = createForClass("java.io", "StringWriter", 262, cggl.Ljava_io_Writer_2_classLit);
  ji.$clinit_UnsupportedEncodingException = function $clinit_UnsupportedEncodingException() {
    ji.$clinit_UnsupportedEncodingException = emptyMethod;
    ji.$clinit_IOException();
  };
  ji.UnsupportedEncodingException = function UnsupportedEncodingException(msg) {
    ji.$clinit_UnsupportedEncodingException();
    ji.IOException.call(this, msg);
    this.$init_272();
  };
  defineClass(290, 50, { 50: 1, 4: 1, 12: 1, 1: 1, 18: 1 }, ji.UnsupportedEncodingException);
  _.$init_272 = function $init_272() {
  };
  cggl.Ljava_io_UnsupportedEncodingException_2_classLit = createForClass("java.io", "UnsupportedEncodingException", 290, cggl.Ljava_io_IOException_2_classLit);
  jl.$clinit_AbstractStringBuilder = function $clinit_AbstractStringBuilder() {
    jl.$clinit_AbstractStringBuilder = emptyMethod;
    jl.$clinit_Object();
    jl.$clinit_CharSequence();
  };
  jl.AbstractStringBuilder = function AbstractStringBuilder(string) {
    jl.$clinit_AbstractStringBuilder();
    Object_0.call(this);
    this.$init_273();
    this.string = string;
  };
  defineClass(131, 1, { 167: 1, 1: 1 });
  _.$init_273 = function $init_273() {
  };
  _.chars = function chars_0() {
    return jl.$chars(this);
  };
  _.charAt = function charAt(index_0) {
    return jl.charAt_I_C__devirtual$_0(this.string, index_0);
  };
  _.getChars = function getChars(srcStart, srcEnd, dst, dstStart) {
    jl.getChars_II_CI_V__devirtual$(this.string, srcStart, srcEnd, dst, dstStart);
  };
  _.indexOf_1 = function indexOf_4(x_0) {
    return jl.indexOf_Ljava_lang_String__I__devirtual$(this.string, x_0);
  };
  _.indexOf_2 = function indexOf_5(x_0, start_0) {
    return jl.indexOf_Ljava_lang_String_I_I__devirtual$(this.string, x_0, start_0);
  };
  _.lastIndexOf_1 = function lastIndexOf_2(s) {
    return jl.lastIndexOf_Ljava_lang_String__I__devirtual$(this.string, s);
  };
  _.lastIndexOf_2 = function lastIndexOf_3(s, start_0) {
    return jl.lastIndexOf_Ljava_lang_String_I_I__devirtual$(this.string, s, start_0);
  };
  _.length_1 = function length_14() {
    return jl.length__I__devirtual$_0(this.string);
  };
  _.replace0 = function replace0(start_0, end, toInsert) {
    var length_0;
    length_0 = jl.length__I__devirtual$_0(this.string);
    if (end > length_0) {
      end = length_0;
    } else {
      ji2.checkStringElementIndex(start_0, end + 1);
    }
    this.string = jl.substring_II_Ljava_lang_String___devirtual$(this.string, 0, start_0) + ("" + toInsert) + jl.substring_I_Ljava_lang_String___devirtual$(this.string, end);
  };
  _.setLength = function setLength(newLength) {
    var oldLength;
    oldLength = this.length_1();
    if (newLength < oldLength) {
      this.string = jl.substring_II_Ljava_lang_String___devirtual$(this.string, 0, newLength);
    } else if (newLength > oldLength) {
      this.string += "" + jl.valueOf_22(initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, newLength - oldLength, 15, 1));
    }
  };
  _.subSequence = function subSequence(start_0, end) {
    return jl.substring_II_Ljava_lang_String___devirtual$(this.string, start_0, end);
  };
  _.substring_0 = function substring(begin) {
    return jl.substring_I_Ljava_lang_String___devirtual$(this.string, begin);
  };
  _.substring_1 = function substring_0(begin, end) {
    return jl.substring_II_Ljava_lang_String___devirtual$(this.string, begin, end);
  };
  _.toString_0 = function toString_31() {
    return this.string;
  };
  cggl.Ljava_lang_AbstractStringBuilder_2_classLit = createForClass("java.lang", "AbstractStringBuilder", 131, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_ArithmeticException = function $clinit_ArithmeticException() {
    jl.$clinit_ArithmeticException = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  jl.ArithmeticException = function ArithmeticException(explanation) {
    jl.$clinit_ArithmeticException();
    jl.RuntimeException_1.call(this, explanation);
    this.$init_274();
  };
  defineClass(102, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, jl.ArithmeticException);
  _.$init_274 = function $init_274() {
  };
  cggl.Ljava_lang_ArithmeticException_2_classLit = createForClass("java.lang", "ArithmeticException", 102, cggl.Ljava_lang_RuntimeException_2_classLit);
  jl.$clinit_ArrayIndexOutOfBoundsException = function $clinit_ArrayIndexOutOfBoundsException() {
    jl.$clinit_ArrayIndexOutOfBoundsException = emptyMethod;
    jl.$clinit_IndexOutOfBoundsException();
  };
  jl.ArrayIndexOutOfBoundsException = function ArrayIndexOutOfBoundsException() {
    jl.$clinit_ArrayIndexOutOfBoundsException();
    jl.IndexOutOfBoundsException.call(this);
    this.$init_276();
  };
  jl.ArrayIndexOutOfBoundsException_0 = function ArrayIndexOutOfBoundsException_0(msg) {
    jl.$clinit_ArrayIndexOutOfBoundsException();
    jl.IndexOutOfBoundsException_0.call(this, msg);
    this.$init_276();
  };
  defineClass(222, 82, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, jl.ArrayIndexOutOfBoundsException, jl.ArrayIndexOutOfBoundsException_0);
  _.$init_276 = function $init_276() {
  };
  cggl.Ljava_lang_ArrayIndexOutOfBoundsException_2_classLit = createForClass("java.lang", "ArrayIndexOutOfBoundsException", 222, cggl.Ljava_lang_IndexOutOfBoundsException_2_classLit);
  jl.$clinit_Byte = function $clinit_Byte() {
    jl.$clinit_Byte = emptyMethod;
    jl.$clinit_Number();
    MIN_VALUE_0 = narrow_byte(128);
    MAX_VALUE_0 = narrow_byte(127);
    BYTES = narrow_int(8 / 8);
    TYPE_0 = cggl.B_classLit;
  };
  jl.Byte = function Byte(value_0) {
    jl.$clinit_Byte();
    jl.Number_0.call(this);
    this.$init_281();
    this.value_0 = value_0;
  };
  function compare_21(x_0, y_0) {
    jl.$clinit_Byte();
    return x_0 - y_0;
  }
  jl.hashCode_9 = function hashCode_9(b) {
    return b;
  };
  jl.parseByte = function parseByte(s) {
    jl.$clinit_Byte();
    return parseByte_0(s, 10);
  };
  function parseByte_0(s, radix) {
    jl.$clinit_Byte();
    return narrow_byte(jl.__parseAndValidateInt(s, radix, -128, 127));
  }
  jl.toString_34 = function toString_34(b) {
    return jl.valueOf_18(b);
  };
  jl.valueOf_7 = function valueOf_7(b) {
    return jl.get_18(b);
  };
  defineClass(136, 19, { 4: 1, 136: 1, 22: 1, 19: 1, 1: 1 }, jl.Byte);
  _.$init_281 = function $init_281() {
  };
  _.compareTo_1 = function compareTo_26(b) {
    return this.compareTo_13(castTo(b, 136));
  };
  _.byteValue = function byteValue_0() {
    return this.value_0;
  };
  _.compareTo_13 = function compareTo_25(b) {
    return compare_21(this.value_0, b.value_0);
  };
  _.doubleValue = function doubleValue_0() {
    return this.value_0;
  };
  _.equals_0 = function equals_23(o) {
    return instanceOf(o, 136) && castTo(o, 136).value_0 == this.value_0;
  };
  _.floatValue = function floatValue() {
    return this.value_0;
  };
  _.hashCode_1 = function hashCode_8() {
    return jl.hashCode_9(this.value_0);
  };
  _.intValue = function intValue_0() {
    return this.value_0;
  };
  _.longValue = function longValue_0() {
    return fromInt_0(this.value_0);
  };
  _.shortValue = function shortValue_0() {
    return this.value_0;
  };
  _.toString_0 = function toString_33() {
    return jl.toString_34(this.value_0);
  };
  _.value_0 = 0;
  var BYTES = 0;
  var MAX_VALUE_0 = 0;
  var MIN_VALUE_0 = 0;
  var SIZE = 8;
  var TYPE_0;
  cggl.Ljava_lang_Byte_2_classLit = createForClass("java.lang", "Byte", 136, cggl.Ljava_lang_Number_2_classLit);
  jl.$clinit_Byte$BoxedValues = function $clinit_Byte$BoxedValues() {
    jl.$clinit_Byte$BoxedValues = emptyMethod;
    jl.$clinit_Object();
    jl.boxedValues = initUnidimensionalArray(cggl.Ljava_lang_Byte_2_classLit, { 4: 1, 1: 1, 7: 1 }, 136, 256, 0, 1);
  };
  jl.get_18 = function get_18(b) {
    jl.$clinit_Byte$BoxedValues();
    var rebase, result;
    rebase = b + 128;
    result = jl.boxedValues[rebase];
    if (isNull(result)) {
      result = jl.boxedValues[rebase] = new jl.Byte(b);
    }
    return result;
  };
  defineClass(608, 1, { 1: 1 });
  cggl.Ljava_lang_Byte$BoxedValues_2_classLit = createForClass("java.lang", "Byte/BoxedValues", 608, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Iterator = function $clinit_Iterator() {
    ju.$clinit_Iterator = emptyMethod;
  };
  ju.$forEachRemaining = function $forEachRemaining(this$static, consumer) {
    ji2.checkNotNull_0(consumer);
    while (this$static.hasNext_0()) {
      consumer.accept_0(this$static.next_3());
    }
  };
  ju.$remove = function $remove(this$static) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  cggl.Ljava_util_Iterator_2_classLit = createForInterface("java.util", "Iterator");
  ju.$clinit_PrimitiveIterator = function $clinit_PrimitiveIterator() {
    ju.$clinit_PrimitiveIterator = emptyMethod;
  };
  cggl.Ljava_util_PrimitiveIterator_2_classLit = createForInterface("java.util", "PrimitiveIterator");
  ju.$clinit_PrimitiveIterator$OfInt = function $clinit_PrimitiveIterator$OfInt() {
    ju.$clinit_PrimitiveIterator$OfInt = emptyMethod;
  };
  ju.$forEachRemaining_0 = function $forEachRemaining_0(this$static, consumer) {
    this$static.forEachRemaining_1(castTo(consumer, 30));
  };
  ju.$forEachRemaining_1 = function $forEachRemaining_1(this$static, consumer) {
    if (instanceOf(consumer, 30)) {
      this$static.forEachRemaining_1(castTo(consumer, 30));
    } else {
      this$static.forEachRemaining_1(castTo(new ju.PrimitiveIterator$OfInt$1methodref$accept$Type(consumer), 30));
    }
  };
  ju.$forEachRemaining_2 = function $forEachRemaining_2(this$static, consumer) {
    ji2.checkNotNull_0(consumer);
    while (this$static.hasNext_0()) {
      consumer.accept(this$static.nextInt());
    }
  };
  ju.$next = function $next(this$static) {
    return jl.valueOf_12(this$static.nextInt());
  };
  ju.$next_0 = function $next_0(this$static) {
    return this$static.next_2();
  };
  cggl.Ljava_util_PrimitiveIterator$OfInt_2_classLit = createForInterface("java.util", "PrimitiveIterator/OfInt");
  jl.$clinit_CharSequence$1 = function $clinit_CharSequence$1() {
    jl.$clinit_CharSequence$1 = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
    ju.$clinit_PrimitiveIterator$OfInt();
  };
  jl.CharSequence$1 = function CharSequence$1(this$0) {
    jl.$clinit_CharSequence$1();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_282();
  };
  defineClass(293, 1, { 1: 1, 41: 1, 295: 1 }, jl.CharSequence$1);
  _.$init_282 = function $init_282() {
  };
  _.forEachRemaining = function forEachRemaining(arg0) {
    this.forEachRemaining_1(castTo(arg0, 30));
  };
  _.forEachRemaining_0 = function forEachRemaining_0(consumer) {
    ju.$forEachRemaining_1(this, consumer);
  };
  _.forEachRemaining_1 = function forEachRemaining_1(consumer) {
    ju.$forEachRemaining_2(this, consumer);
  };
  _.next_2 = function next_2() {
    return ju.$next(this);
  };
  _.next_3 = function next_3() {
    return this.next_2();
  };
  _.remove_2 = function remove_6() {
    ju.$remove(this);
  };
  _.hasNext_0 = function hasNext() {
    return this.cursor < jl.length__I__devirtual$(this.this$01);
  };
  _.nextInt = function nextInt() {
    ji2.checkElement(this.hasNext_0());
    return jl.charAt_I_C__devirtual$(this.this$01, this.cursor++);
  };
  _.cursor = 0;
  cggl.Ljava_lang_CharSequence$1_2_classLit = createForClass("java.lang", "CharSequence/1", 293, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_Supplier = function $clinit_Supplier() {
    juf.$clinit_Supplier = emptyMethod;
  };
  cggl.Ljava_util_function_Supplier_2_classLit = createForInterface("java.util.function", "Supplier");
  jl.$clinit_CharSequence$lambda$0$Type = function $clinit_CharSequence$lambda$0$Type() {
    jl.$clinit_CharSequence$lambda$0$Type = emptyMethod;
  };
  jl.CharSequence$lambda$0$Type = function CharSequence$lambda$0$Type($$outer_0) {
    jl.$clinit_CharSequence$lambda$0$Type();
    this.$$outer_0 = $$outer_0;
  };
  defineClass(292, 1, { 1: 1, 64: 1 }, jl.CharSequence$lambda$0$Type);
  _.get_2 = function get_19() {
    return jl.$lambda$0(this.$$outer_0);
  };
  cggl.Ljava_lang_CharSequence$lambda$0$Type_2_classLit = createForClass("java.lang", "CharSequence/lambda$0$Type", 292, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_Character = function $clinit_Character() {
    jl.$clinit_Character = emptyMethod;
    jl.$clinit_Object();
    TYPE_1 = cggl.Ljava_lang_Character_2_classLit;
  };
  function Character(value_0) {
    Object_0.call(this);
    this.$init_283();
    this.value_0 = value_0;
  }
  function charCount_0(codePoint) {
    jl.$clinit_Character();
    return codePoint >= 65536 ? 2 : 1;
  }
  function checkCriticalArgument(expression) {
    jl.$clinit_Character();
    if (!expression) {
      throw toJs(new jl.IllegalArgumentException());
    }
  }
  function codePointAt(cs, index_0, limit) {
    jl.$clinit_Character();
    var hiSurrogate, loSurrogate;
    hiSurrogate = jl.charAt_I_C__devirtual$(cs, index_0++);
    if (isHighSurrogate(hiSurrogate) && index_0 < limit && isLowSurrogate(loSurrogate = jl.charAt_I_C__devirtual$(cs, index_0))) {
      return toCodePoint(hiSurrogate, loSurrogate);
    }
    return hiSurrogate;
  }
  function codePointBefore(cs, index_0, start_0) {
    jl.$clinit_Character();
    var highSurrogate, loSurrogate;
    loSurrogate = jl.charAt_I_C__devirtual$(cs, --index_0);
    if (isLowSurrogate(loSurrogate) && index_0 > start_0 && isHighSurrogate(highSurrogate = jl.charAt_I_C__devirtual$(cs, index_0 - 1))) {
      return toCodePoint(highSurrogate, loSurrogate);
    }
    return loSurrogate;
  }
  function codePointCount(seq, beginIndex, endIndex) {
    jl.$clinit_Character();
    var ch_0, count, idx;
    count = 0;
    for (idx = beginIndex; idx < endIndex; ) {
      ch_0 = jl.charAt_I_C__devirtual$(seq, idx++);
      if (isHighSurrogate(ch_0) && idx < endIndex && isLowSurrogate(jl.charAt_I_C__devirtual$(seq, idx))) {
        ++idx;
      }
      ++count;
    }
    return count;
  }
  function compare_22(x_0, y_0) {
    jl.$clinit_Character();
    return x_0 - y_0;
  }
  function digit_0(c, radix) {
    jl.$clinit_Character();
    if (radix < 2 || radix > 36) {
      return -1;
    }
    if (c >= 48 && c < 48 + $wnd.Math.min(radix, 10)) {
      return c - 48;
    }
    if (c >= 97 && c < radix + 97 - 10) {
      return c - 97 + 10;
    }
    if (c >= 65 && c < radix + 65 - 10) {
      return c - 65 + 10;
    }
    return -1;
  }
  function forDigit(digit) {
    jl.$clinit_Character();
    var overBaseTen;
    overBaseTen = digit - 10;
    return narrow_char(overBaseTen < 0 ? 48 + digit : 97 + overBaseTen);
  }
  jl.forDigit_0 = function forDigit_0(digit, radix) {
    jl.$clinit_Character();
    if (radix < 2 || radix > 36) {
      return 0;
    }
    if (digit < 0 || digit >= radix) {
      return 0;
    }
    return forDigit(digit);
  };
  function getHighSurrogate(codePoint) {
    jl.$clinit_Character();
    return narrow_char(55296 + (codePoint - 65536 >> 10 & 1023));
  }
  function getLowSurrogate(codePoint) {
    jl.$clinit_Character();
    return narrow_char(56320 + (codePoint - 65536 & 1023));
  }
  jl.hashCode_11 = function hashCode_11(c) {
    return c;
  };
  function isDigit(c) {
    jl.$clinit_Character();
    return /\d/.test(String.fromCharCode(c));
  }
  jl.isDigit_0 = function isDigit_0(c) {
    jl.$clinit_Character();
    return isDigit(narrow_char(c));
  };
  function isHighSurrogate(ch_0) {
    jl.$clinit_Character();
    return ch_0 >= 55296 && ch_0 <= 56319;
  }
  function isLetter(c) {
    jl.$clinit_Character();
    return /[A-Z]/i.test(String.fromCharCode(c));
  }
  jl.isLetter_0 = function isLetter_0(c) {
    jl.$clinit_Character();
    return /[A-Z]/i.test(String.fromCharCode(c));
  };
  function isLetterOrDigit(c) {
    jl.$clinit_Character();
    return /[A-Z\d]/i.test(String.fromCharCode(c));
  }
  function isLowSurrogate(ch_0) {
    jl.$clinit_Character();
    return ch_0 >= 56320 && ch_0 <= 57343;
  }
  function isLowerCase_0(c) {
    jl.$clinit_Character();
    return toLowerCase(c) == c && jl.isLetter_0(c);
  }
  function isWhitespace(c) {
    jl.$clinit_Character();
    return String.fromCodePoint(c).trim() === "";
  }
  function offsetByCodePoints(seq, index_0, codePointOffset) {
    jl.$clinit_Character();
    if (codePointOffset < 0) {
      while (codePointOffset < 0) {
        --index_0;
        if (isLowSurrogate(jl.charAt_I_C__devirtual$(seq, index_0)) && isHighSurrogate(jl.charAt_I_C__devirtual$(seq, index_0 - 1))) {
          --index_0;
        }
        ++codePointOffset;
      }
    } else {
      while (codePointOffset > 0) {
        if (isHighSurrogate(jl.charAt_I_C__devirtual$(seq, index_0)) && isLowSurrogate(jl.charAt_I_C__devirtual$(seq, index_0 + 1))) {
          ++index_0;
        }
        ++index_0;
        --codePointOffset;
      }
    }
    return index_0;
  }
  function toChars(codePoint, dst, dstIndex) {
    jl.$clinit_Character();
    checkCriticalArgument(codePoint >= 0 && codePoint <= 1114111);
    if (codePoint >= 65536) {
      dst[dstIndex++] = getHighSurrogate(codePoint);
      dst[dstIndex] = getLowSurrogate(codePoint);
      return 2;
    } else {
      dst[dstIndex] = narrow_char(codePoint);
      return 1;
    }
  }
  function toCodePoint(highSurrogate, lowSurrogate) {
    jl.$clinit_Character();
    return 65536 + ((highSurrogate & 1023) << 10) + (lowSurrogate & 1023);
  }
  function toLowerCase(c) {
    jl.$clinit_Character();
    return String.fromCharCode(c).toLowerCase().charCodeAt(0);
  }
  function toUpperCase(c) {
    jl.$clinit_Character();
    return String.fromCharCode(c).toUpperCase().charCodeAt(0);
  }
  function valueOf_8(c) {
    jl.$clinit_Character();
    var result;
    if (c < 128) {
      result = (jl.$clinit_Character$BoxedValues(), jl.boxedValues_0)[c];
      if (isNull(result)) {
        result = (jl.$clinit_Character$BoxedValues(), jl.boxedValues_0)[c] = new Character(c);
      }
      return result;
    }
    return new Character(c);
  }
  defineClass(110, 1, { 4: 1, 110: 1, 22: 1, 1: 1 }, Character);
  _.$init_283 = function $init_283() {
  };
  _.compareTo_1 = function compareTo_28(c) {
    return this.compareTo_14(castTo(c, 110));
  };
  _.charValue = function charValue() {
    return this.value_0;
  };
  _.compareTo_14 = function compareTo_27(c) {
    return compare_22(this.value_0, c.value_0);
  };
  _.equals_0 = function equals_24(o) {
    return instanceOf(o, 110) && castTo(o, 110).value_0 == this.value_0;
  };
  _.hashCode_1 = function hashCode_10() {
    return jl.hashCode_11(this.value_0);
  };
  _.toString_0 = function toString_35() {
    return jl.valueOf_15(this.value_0);
  };
  _.value_0 = 0;
  var MAX_CODE_POINT = 1114111;
  var MAX_HIGH_SURROGATE = 56319;
  var MAX_LOW_SURROGATE = 57343;
  var MAX_RADIX = 36;
  var MAX_SURROGATE = 57343;
  var MAX_VALUE_1 = 65535;
  var MIN_CODE_POINT = 0;
  var MIN_HIGH_SURROGATE = 55296;
  var MIN_LOW_SURROGATE = 56320;
  var MIN_RADIX = 2;
  var MIN_SUPPLEMENTARY_CODE_POINT = 65536;
  var MIN_SURROGATE = 55296;
  var MIN_VALUE_1 = 0;
  var SIZE_0 = 16;
  var TYPE_1;
  cggl.Ljava_lang_Character_2_classLit = createForClass("java.lang", "Character", 110, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_Character$BoxedValues = function $clinit_Character$BoxedValues() {
    jl.$clinit_Character$BoxedValues = emptyMethod;
    jl.$clinit_Object();
    jl.boxedValues_0 = initUnidimensionalArray(cggl.Ljava_lang_Character_2_classLit, { 4: 1, 1: 1, 7: 1 }, 110, 128, 0, 1);
  };
  defineClass(611, 1, { 1: 1 });
  cggl.Ljava_lang_Character$BoxedValues_2_classLit = createForClass("java.lang", "Character/BoxedValues", 611, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_Character$CharSequenceAdapter = function $clinit_Character$CharSequenceAdapter() {
    jl.$clinit_Character$CharSequenceAdapter = emptyMethod;
  };
  defineClass(610, 1, { 167: 1, 1: 1 });
  cggl.Ljava_lang_Character$CharSequenceAdapter_2_classLit = createForClass("java.lang", "Character/CharSequenceAdapter", 610, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_Float = function $clinit_Float() {
    jl.$clinit_Float = emptyMethod;
    jl.$clinit_Number();
    MIN_EXPONENT_0 = -126;
    NaN_1 = 0 / 0;
    NEGATIVE_INFINITY_0 = -1 / 0;
    POSITIVE_INFINITY_0 = 1 / 0;
    BYTES_1 = narrow_int(32 / 8);
    TYPE_3 = cggl.F_classLit;
  };
  jl.Float = function Float(value_0) {
    jl.Number_0.call(this);
    this.$init_286();
    this.value_0 = value_0;
  };
  function compare_24(x_0, y_0) {
    jl.$clinit_Float();
    return compare_23(x_0, y_0);
  }
  jl.hashCode_14 = function hashCode_14(f) {
    return round_int(f);
  };
  jl.isInfinite_1 = function isInfinite_1(x_0) {
    return jl.isInfinite(x_0);
  };
  jl.isNaN_2 = function isNaN_2(x_0) {
    return isNaN(x_0);
  };
  function parseFloat_0(s) {
    jl.$clinit_Float();
    var doubleValue;
    doubleValue = jl.__parseAndValidateDouble(s);
    if (doubleValue > 34028234663852886e22) {
      return Infinity;
    } else if (doubleValue < -34028234663852886e22) {
      return -Infinity;
    }
    return doubleValue;
  }
  jl.toString_39 = function toString_39(b) {
    return jl.valueOf_17(b);
  };
  jl.valueOf_11 = function valueOf_11(f) {
    return new jl.Float(f);
  };
  defineClass(160, 19, { 4: 1, 22: 1, 160: 1, 19: 1, 1: 1 }, jl.Float);
  _.$init_286 = function $init_286() {
  };
  _.compareTo_1 = function compareTo_30(b) {
    return this.compareTo_15(castTo(b, 160));
  };
  _.byteValue = function byteValue_1() {
    return round_byte(this.value_0);
  };
  _.compareTo_15 = function compareTo_29(b) {
    return compare_24(this.value_0, b.value_0);
  };
  _.doubleValue = function doubleValue_1() {
    return this.value_0;
  };
  _.equals_0 = function equals_25(o) {
    return instanceOf(o, 160) && jl.equals_Ljava_lang_Object__Z__devirtual$_1(jl.valueOf_9(this.value_0), jl.valueOf_9(castTo(o, 160).value_0));
  };
  _.floatValue = function floatValue_0() {
    return this.value_0;
  };
  _.hashCode_1 = function hashCode_13() {
    return jl.hashCode_14(this.value_0);
  };
  _.intValue = function intValue_1() {
    return round_int(this.value_0);
  };
  _.isInfinite = function isInfinite_0() {
    return jl.isInfinite_1(this.value_0);
  };
  _.isNaN_0 = function isNaN_1() {
    return jl.isNaN_2(this.value_0);
  };
  _.longValue = function longValue_1() {
    return fromDouble_0(this.value_0);
  };
  _.shortValue = function shortValue_1() {
    return round_short(this.value_0);
  };
  _.toString_0 = function toString_38() {
    return jl.toString_39(this.value_0);
  };
  _.value_0 = 0;
  var BYTES_1 = 0;
  var MAX_EXPONENT_0 = 127;
  var MAX_VALUE_3 = 34028234663852886e22;
  var MIN_EXPONENT_0 = 0;
  var MIN_NORMAL_0 = 11754943508222875e-54;
  var MIN_VALUE_3 = 1401298464324817e-60;
  var NEGATIVE_INFINITY_0 = 0;
  var NaN_1 = 0;
  var POSITIVE_INFINITY_0 = 0;
  var POWER_31_INT = 2147483648;
  var SIZE_2 = 32;
  var TYPE_3;
  cggl.Ljava_lang_Float_2_classLit = createForClass("java.lang", "Float", 160, cggl.Ljava_lang_Number_2_classLit);
  jl.$clinit_HasCharSequenceTypeMarker = function $clinit_HasCharSequenceTypeMarker() {
    jl.$clinit_HasCharSequenceTypeMarker = emptyMethod;
  };
  jl.$clinit_HasCloneableTypeMarker = function $clinit_HasCloneableTypeMarker() {
    jl.$clinit_HasCloneableTypeMarker = emptyMethod;
  };
  jl.$clinit_HasComparableTypeMarker = function $clinit_HasComparableTypeMarker() {
    jl.$clinit_HasComparableTypeMarker = emptyMethod;
  };
  jl.$clinit_IllegalArgumentException = function $clinit_IllegalArgumentException() {
    jl.$clinit_IllegalArgumentException = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  jl.IllegalArgumentException = function IllegalArgumentException() {
    jl.$clinit_IllegalArgumentException();
    jl.RuntimeException.call(this);
    this.$init_287();
  };
  jl.IllegalArgumentException_0 = function IllegalArgumentException_0(message) {
    jl.$clinit_IllegalArgumentException();
    jl.RuntimeException_1.call(this, message);
    this.$init_287();
  };
  defineClass(72, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, jl.IllegalArgumentException, jl.IllegalArgumentException_0);
  _.$init_287 = function $init_287() {
  };
  cggl.Ljava_lang_IllegalArgumentException_2_classLit = createForClass("java.lang", "IllegalArgumentException", 72, cggl.Ljava_lang_RuntimeException_2_classLit);
  jl.$clinit_Integer$BoxedValues = function $clinit_Integer$BoxedValues() {
    jl.$clinit_Integer$BoxedValues = emptyMethod;
    jl.$clinit_Object();
    jl.boxedValues_1 = initUnidimensionalArray(cggl.Ljava_lang_Integer_2_classLit, { 4: 1, 1: 1, 7: 1 }, 35, 256, 0, 1);
  };
  jl.get_20 = function get_20(i) {
    jl.$clinit_Integer$BoxedValues();
    var rebase, result;
    rebase = i + 128;
    result = jl.boxedValues_1[rebase];
    if (isNull(result)) {
      result = jl.boxedValues_1[rebase] = new jl.Integer(i);
    }
    return result;
  };
  defineClass(612, 1, { 1: 1 });
  cggl.Ljava_lang_Integer$BoxedValues_2_classLit = createForClass("java.lang", "Integer/BoxedValues", 612, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_Integer$ReverseNibbles = function $clinit_Integer$ReverseNibbles() {
    jl.$clinit_Integer$ReverseNibbles = emptyMethod;
  };
  defineClass(613, 1, { 1: 1 });
  cggl.Ljava_lang_Integer$ReverseNibbles_2_classLit = createForClass("java.lang", "Integer/ReverseNibbles", 613, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_Long = function $clinit_Long() {
    jl.$clinit_Long = emptyMethod;
    jl.$clinit_Number();
    BYTES_3 = narrow_int(64 / 8);
    TYPE_5 = cggl.J_classLit;
  };
  jl.Long = function Long(value_0) {
    jl.$clinit_Long();
    jl.Number_0.call(this);
    this.$init_290();
    this.value_0 = value_0;
  };
  function compare_26(x_0, y_0) {
    jl.$clinit_Long();
    if (lt(x_0, y_0)) {
      return -1;
    } else if (gt(x_0, y_0)) {
      return 1;
    } else {
      return 0;
    }
  }
  jl.hashCode_18 = function hashCode_18(l) {
    return ji2.getHighBits(l) ^ toInt_0(l);
  };
  function numberOfLeadingZeros_1(l) {
    jl.$clinit_Long();
    var high;
    high = ji2.getHighBits(l);
    if (high != 0) {
      return numberOfLeadingZeros_0(high);
    } else {
      return numberOfLeadingZeros_0(toInt_0(l)) + 32;
    }
  }
  function signum_1(i) {
    jl.$clinit_Long();
    if (eq(i, 0)) {
      return 0;
    } else if (lt(i, 0)) {
      return -1;
    } else {
      return 1;
    }
  }
  function toHexString_0(value_0) {
    jl.$clinit_Long();
    return jl.toPowerOfTwoUnsignedString(value_0, 4);
  }
  jl.toPowerOfTwoUnsignedString = function toPowerOfTwoUnsignedString(value_0, shift_0) {
    var buf, bufSize, highBits, mask, pos, radix;
    radix = 1 << shift_0;
    highBits = ji2.getHighBits(value_0);
    if (highBits == 0) {
      return toUnsignedString(toInt_0(value_0), radix);
    }
    mask = radix - 1;
    bufSize = narrow_int(64 / shift_0) + 1;
    buf = initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, bufSize, 15, 1);
    pos = bufSize;
    do {
      buf[--pos] = forDigit(toInt_0(value_0) & mask);
      value_0 = shru_0(value_0, shift_0);
    } while (neq(value_0, 0));
    return jl.valueOf_23(buf, pos, bufSize - pos);
  };
  jl.toString_44 = function toString_44(value_0) {
    jl.$clinit_Long();
    return jl.valueOf_19(value_0);
  };
  jl.toString_45 = function toString_45(value_0, intRadix) {
    jl.$clinit_Long();
    var buf, bufLen, cursor, intValue, negative, q, radix;
    if (intRadix == 10 || intRadix < 2 || intRadix > 36) {
      return jl.valueOf_19(value_0);
    }
    intValue = toInt_0(value_0);
    if (eq(fromInt_0(intValue), value_0)) {
      return jl.toString_42(intValue, intRadix);
    }
    negative = lt(value_0, 0);
    if (!negative) {
      value_0 = neg_0(value_0);
    }
    bufLen = intRadix < 8 ? 65 : 23;
    buf = initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, bufLen, 15, 1);
    cursor = bufLen;
    radix = fromInt_0(intRadix);
    do {
      q = div_0(value_0, radix);
      buf[--cursor] = forDigit(toInt_0(sub_2(mul_0(radix, q), value_0)));
      value_0 = q;
    } while (neq(value_0, 0));
    if (negative) {
      buf[--cursor] = 45;
    }
    return jl.valueOf_23(buf, cursor, bufLen - cursor);
  };
  jl.valueOf_13 = function valueOf_13(l) {
    jl.$clinit_Long();
    if (gt(l, fromInt_0(-129)) && lt(l, 128)) {
      return jl.get_21(l);
    }
    return new jl.Long(l);
  };
  defineClass(111, 19, { 4: 1, 22: 1, 111: 1, 19: 1, 1: 1 }, jl.Long);
  _.$init_290 = function $init_290() {
  };
  _.compareTo_1 = function compareTo_34(b) {
    return this.compareTo_17(castTo(b, 111));
  };
  _.byteValue = function byteValue_3() {
    return narrow_byte(toInt_0(this.value_0));
  };
  _.compareTo_17 = function compareTo_33(b) {
    return compare_26(this.value_0, b.value_0);
  };
  _.doubleValue = function doubleValue_3() {
    return toDouble_0(this.value_0);
  };
  _.equals_0 = function equals_27(o) {
    return instanceOf(o, 111) && eq(castTo(o, 111).value_0, this.value_0);
  };
  _.floatValue = function floatValue_2() {
    return toDouble_0(this.value_0);
  };
  _.hashCode_1 = function hashCode_17() {
    return jl.hashCode_18(this.value_0);
  };
  _.intValue = function intValue_3() {
    return toInt_0(this.value_0);
  };
  _.longValue = function longValue_3() {
    return this.value_0;
  };
  _.shortValue = function shortValue_3() {
    return narrow_short(toInt_0(this.value_0));
  };
  _.toString_0 = function toString_43() {
    return jl.toString_44(this.value_0);
  };
  _.value_0 = 0;
  var BYTES_3 = 0;
  var MAX_VALUE_5 = { l: 4194303, m: 4194303, h: 524287 };
  var MIN_VALUE_5 = { l: 0, m: 0, h: 524288 };
  var SIZE_4 = 64;
  var TYPE_5;
  cggl.Ljava_lang_Long_2_classLit = createForClass("java.lang", "Long", 111, cggl.Ljava_lang_Number_2_classLit);
  jl.$clinit_Long$BoxedValues = function $clinit_Long$BoxedValues() {
    jl.$clinit_Long$BoxedValues = emptyMethod;
    jl.$clinit_Object();
    jl.boxedValues_2 = initUnidimensionalArray(cggl.Ljava_lang_Long_2_classLit, { 4: 1, 1: 1, 7: 1 }, 111, 256, 0, 1);
  };
  jl.get_21 = function get_21(l) {
    jl.$clinit_Long$BoxedValues();
    var rebase, result;
    rebase = toInt_0(l) + 128;
    result = jl.boxedValues_2[rebase];
    if (isNull(result)) {
      result = jl.boxedValues_2[rebase] = new jl.Long(l);
    }
    return result;
  };
  defineClass(614, 1, { 1: 1 });
  cggl.Ljava_lang_Long$BoxedValues_2_classLit = createForClass("java.lang", "Long/BoxedValues", 614, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_Math = function $clinit_Math() {
    jl.$clinit_Math = emptyMethod;
    jl.$clinit_Object();
    jl.PI_OVER_180 = 3.141592653589793 / 180;
    jl.PI_UNDER_180 = 180 / 3.141592653589793;
  };
  jl.abs_0 = function abs_0(x_0) {
    jl.$clinit_Math();
    return lt(x_0, 0) ? neg_0(x_0) : x_0;
  };
  jl.log10 = function log10(x_0) {
    jl.$clinit_Math();
    return $wnd.Math.log(x_0) * (jl.$clinit_Math$NativeMath(), $wnd.Math.LOG10E);
  };
  jl.round_1 = function round_1(x_0) {
    jl.$clinit_Math();
    return fromDouble_0($wnd.Math.round(x_0));
  };
  jl.round_2 = function round_2(x_0) {
    jl.$clinit_Math();
    return round_int($wnd.Math.round(x_0));
  };
  jl.signum_2 = function signum_2(d) {
    if (d == 0 || isNaN(d)) {
      return d;
    } else {
      return d < 0 ? -1 : 1;
    }
  };
  jl.signum_3 = function signum_3(f) {
    jl.$clinit_Math();
    return jl.signum_2(f);
  };
  jl.toDegrees = function toDegrees(x_0) {
    jl.$clinit_Math();
    return x_0 * 57.29577951308232;
  };
  defineClass(635, 1, { 1: 1 });
  jl.E_0 = 2.718281828459045;
  jl.PI_0 = 3.141592653589793;
  jl.PI_OVER_180 = 0;
  jl.PI_UNDER_180 = 0;
  cggl.Ljava_lang_Math_2_classLit = createForClass("java.lang", "Math", 635, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_Math$NativeMath = function $clinit_Math$NativeMath() {
    jl.$clinit_Math$NativeMath = emptyMethod;
    jl.$clinit_Object();
  };
  jl.$clinit_NegativeArraySizeException = function $clinit_NegativeArraySizeException() {
    jl.$clinit_NegativeArraySizeException = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  jl.NegativeArraySizeException = function NegativeArraySizeException(message) {
    jl.$clinit_NegativeArraySizeException();
    jl.RuntimeException_1.call(this, message);
    this.$init_291();
  };
  defineClass(491, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, jl.NegativeArraySizeException);
  _.$init_291 = function $init_291() {
  };
  cggl.Ljava_lang_NegativeArraySizeException_2_classLit = createForClass("java.lang", "NegativeArraySizeException", 491, cggl.Ljava_lang_RuntimeException_2_classLit);
  jl.$clinit_Number$__Decode = function $clinit_Number$__Decode() {
    jl.$clinit_Number$__Decode = emptyMethod;
    jl.$clinit_Object();
  };
  jl.Number$__Decode = function Number$__Decode(radix, payload) {
    jl.$clinit_Number$__Decode();
    Object_0.call(this);
    this.$init_293();
    this.radix = radix;
    this.payload = payload;
  };
  defineClass(356, 1, { 1: 1 }, jl.Number$__Decode);
  _.$init_293 = function $init_293() {
  };
  _.radix = 0;
  cggl.Ljava_lang_Number$_1_1Decode_2_classLit = createForClass("java.lang", "Number/__Decode", 356, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_Number$__ParseLong = function $clinit_Number$__ParseLong() {
    jl.$clinit_Number$__ParseLong = emptyMethod;
    var i;
    jl.$clinit_Object();
    jl.maxDigitsForRadix = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [-1, -1, 30, 19, 15, 13, 11, 11, 10, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5]);
    jl.maxDigitsRadixPower = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 37, 15, 1);
    jl.maxLengthForRadix = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [-1, -1, 63, 40, 32, 28, 25, 23, 21, 20, 19, 19, 18, 18, 17, 17, 16, 16, 16, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13]);
    jl.maxValueForRadix = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, 37, 14, 1);
    {
      for (i = 2; i <= 36; i++) {
        jl.maxDigitsRadixPower[i] = round_int($wnd.Math.pow(i, jl.maxDigitsForRadix[i]));
        jl.maxValueForRadix[i] = div_0({ l: 4194303, m: 4194303, h: 524287 }, fromInt_0(jl.maxDigitsRadixPower[i]));
      }
    }
  };
  defineClass(609, 1, { 1: 1 });
  cggl.Ljava_lang_Number$_1_1ParseLong_2_classLit = createForClass("java.lang", "Number/__ParseLong", 609, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_NumberFormatException = function $clinit_NumberFormatException() {
    jl.$clinit_NumberFormatException = emptyMethod;
    jl.$clinit_IllegalArgumentException();
  };
  jl.NumberFormatException = function NumberFormatException(message) {
    jl.$clinit_NumberFormatException();
    jl.IllegalArgumentException_0.call(this, message);
    this.$init_294();
  };
  jl.forInputString = function forInputString(s) {
    jl.$clinit_NumberFormatException();
    return new jl.NumberFormatException('For input string: "' + s + '"');
  };
  jl.forNullInputString = function forNullInputString() {
    jl.$clinit_NumberFormatException();
    return new jl.NumberFormatException("null");
  };
  jl.forRadix = function forRadix(radix) {
    jl.$clinit_NumberFormatException();
    return new jl.NumberFormatException("radix " + radix + " out of range");
  };
  defineClass(47, 72, { 4: 1, 12: 1, 47: 1, 1: 1, 23: 1, 18: 1 }, jl.NumberFormatException);
  _.$init_294 = function $init_294() {
  };
  cggl.Ljava_lang_NumberFormatException_2_classLit = createForClass("java.lang", "NumberFormatException", 47, cggl.Ljava_lang_IllegalArgumentException_2_classLit);
  jl.$clinit_Short = function $clinit_Short() {
    jl.$clinit_Short = emptyMethod;
    jl.$clinit_Number();
    MIN_VALUE_6 = narrow_short(32768);
    MAX_VALUE_6 = narrow_short(32767);
    BYTES_4 = narrow_int(16 / 8);
    TYPE_6 = cggl.S_classLit;
  };
  jl.Short = function Short(value_0) {
    jl.$clinit_Short();
    jl.Number_0.call(this);
    this.$init_295();
    this.value_0 = value_0;
  };
  function compare_27(x_0, y_0) {
    jl.$clinit_Short();
    return x_0 - y_0;
  }
  jl.hashCode_20 = function hashCode_20(s) {
    return s;
  };
  jl.parseShort = function parseShort(s) {
    jl.$clinit_Short();
    return parseShort_0(s, 10);
  };
  function parseShort_0(s, radix) {
    jl.$clinit_Short();
    return narrow_short(jl.__parseAndValidateInt(s, radix, -32768, 32767));
  }
  jl.toString_47 = function toString_47(b) {
    return jl.valueOf_18(b);
  };
  jl.valueOf_14 = function valueOf_14(s) {
    if (s > -129 && s < 128) {
      return jl.get_22(s);
    }
    return new jl.Short(s);
  };
  defineClass(123, 19, { 4: 1, 22: 1, 19: 1, 1: 1, 123: 1 }, jl.Short);
  _.$init_295 = function $init_295() {
  };
  _.compareTo_1 = function compareTo_35(b) {
    return this.compareTo_18(castTo(b, 123));
  };
  _.byteValue = function byteValue_4() {
    return narrow_byte(this.value_0);
  };
  _.compareTo_18 = function compareTo_36(b) {
    return compare_27(this.value_0, b.value_0);
  };
  _.doubleValue = function doubleValue_4() {
    return this.value_0;
  };
  _.equals_0 = function equals_28(o) {
    return instanceOf(o, 123) && castTo(o, 123).value_0 == this.value_0;
  };
  _.floatValue = function floatValue_3() {
    return this.value_0;
  };
  _.hashCode_1 = function hashCode_19() {
    return jl.hashCode_20(this.value_0);
  };
  _.intValue = function intValue_4() {
    return this.value_0;
  };
  _.longValue = function longValue_4() {
    return fromInt_0(this.value_0);
  };
  _.shortValue = function shortValue_4() {
    return this.value_0;
  };
  _.toString_0 = function toString_46() {
    return jl.toString_47(this.value_0);
  };
  _.value_0 = 0;
  var BYTES_4 = 0;
  var MAX_VALUE_6 = 0;
  var MIN_VALUE_6 = 0;
  var SIZE_5 = 16;
  var TYPE_6;
  cggl.Ljava_lang_Short_2_classLit = createForClass("java.lang", "Short", 123, cggl.Ljava_lang_Number_2_classLit);
  jl.$clinit_Short$BoxedValues = function $clinit_Short$BoxedValues() {
    jl.$clinit_Short$BoxedValues = emptyMethod;
    jl.$clinit_Object();
    jl.boxedValues_3 = initUnidimensionalArray(cggl.Ljava_lang_Short_2_classLit, { 4: 1, 1: 1, 7: 1 }, 123, 256, 0, 1);
  };
  jl.get_22 = function get_22(s) {
    jl.$clinit_Short$BoxedValues();
    var rebase, result;
    rebase = s + 128;
    result = jl.boxedValues_3[rebase];
    if (isNull(result)) {
      result = jl.boxedValues_3[rebase] = new jl.Short(s);
    }
    return result;
  };
  defineClass(615, 1, { 1: 1 });
  cggl.Ljava_lang_Short$BoxedValues_2_classLit = createForClass("java.lang", "Short/BoxedValues", 615, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_StackTraceElement = function $clinit_StackTraceElement() {
    jl.$clinit_StackTraceElement = emptyMethod;
    jl.$clinit_Object();
  };
  jl.StackTraceElement = function StackTraceElement(className, methodName, fileName, lineNumber) {
    jl.$clinit_StackTraceElement();
    Object_0.call(this);
    this.$init_296();
    this.className_0 = className;
    this.methodName = methodName;
    this.fileName = fileName;
    this.lineNumber = lineNumber;
  };
  defineClass(74, 1, { 4: 1, 1: 1, 74: 1 }, jl.StackTraceElement);
  _.$init_296 = function $init_296() {
  };
  _.equals_0 = function equals_29(other) {
    var st;
    if (instanceOf(other, 74)) {
      st = castTo(other, 74);
      return this.lineNumber == st.lineNumber && equals_49(this.methodName, st.methodName) && equals_49(this.className_0, st.className_0) && equals_49(this.fileName, st.fileName);
    }
    return false;
  };
  _.getMethodName = function getMethodName() {
    return this.methodName;
  };
  _.hashCode_1 = function hashCode_21() {
    return hash_1(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [jl.valueOf_12(this.lineNumber), this.className_0, this.methodName, this.fileName]));
  };
  _.toString_0 = function toString_48() {
    return this.className_0 + "." + this.methodName + "(" + (jsNotEquals(this.fileName, null) ? this.fileName : "Unknown Source") + (this.lineNumber >= 0 ? ":" + this.lineNumber : "") + ")";
  };
  _.lineNumber = 0;
  cggl.Ljava_lang_StackTraceElement_2_classLit = createForClass("java.lang", "StackTraceElement", 74, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterator = function $clinit_Spliterator() {
    ju.$clinit_Spliterator = emptyMethod;
  };
  ju.$forEachRemaining_3 = function $forEachRemaining_3(this$static, consumer) {
    while (this$static.tryAdvance(consumer)) {
    }
  };
  ju.CONCURRENT = 4096;
  ju.DISTINCT = 1;
  ju.IMMUTABLE = 1024;
  ju.NONNULL = 256;
  ju.ORDERED = 16;
  ju.SIZED = 64;
  ju.SORTED = 4;
  ju.SUBSIZED = 16384;
  cggl.Ljava_util_Spliterator_2_classLit = createForInterface("java.util", "Spliterator");
  ju.$clinit_Spliterators$BaseSpliterator = function $clinit_Spliterators$BaseSpliterator() {
    ju.$clinit_Spliterators$BaseSpliterator = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Spliterator();
  };
  ju.Spliterators$BaseSpliterator = function Spliterators$BaseSpliterator(size_0, characteristics) {
    ju.$clinit_Spliterators$BaseSpliterator();
    Object_0.call(this);
    this.$init_298();
    this.sizeEstimate = size_0;
    this.characteristics = (characteristics & 64) != 0 ? characteristics | 16384 : characteristics;
  };
  defineClass(231, 1, { 1: 1, 20: 1 });
  _.$init_298 = function $init_298() {
  };
  _.forEachRemaining_0 = function forEachRemaining_2(consumer) {
    ju.$forEachRemaining_3(this, consumer);
  };
  _.characteristics_0 = function characteristics_0() {
    return this.characteristics;
  };
  _.estimateSize_0 = function estimateSize() {
    return this.sizeEstimate;
  };
  _.characteristics = 0;
  _.sizeEstimate = 0;
  cggl.Ljava_util_Spliterators$BaseSpliterator_2_classLit = createForClass("java.util", "Spliterators/BaseSpliterator", 231, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterators$AbstractSpliterator = function $clinit_Spliterators$AbstractSpliterator() {
    ju.$clinit_Spliterators$AbstractSpliterator = emptyMethod;
    ju.$clinit_Spliterators$BaseSpliterator();
    ju.$clinit_Spliterator();
  };
  ju.Spliterators$AbstractSpliterator = function Spliterators$AbstractSpliterator(size_0, characteristics) {
    ju.$clinit_Spliterators$AbstractSpliterator();
    ju.Spliterators$BaseSpliterator.call(this, size_0, characteristics);
    this.$init_299();
  };
  defineClass(230, 231, { 1: 1, 20: 1 });
  _.$init_299 = function $init_299() {
  };
  cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit = createForClass("java.util", "Spliterators/AbstractSpliterator", 230, cggl.Ljava_util_Spliterators$BaseSpliterator_2_classLit);
  jl.$clinit_String$LinesSpliterator = function $clinit_String$LinesSpliterator() {
    jl.$clinit_String$LinesSpliterator = emptyMethod;
    ju.$clinit_Spliterators$AbstractSpliterator();
  };
  jl.String$LinesSpliterator = function String$LinesSpliterator(this$0) {
    jl.$clinit_String$LinesSpliterator();
    this.this$01 = this$0;
    ju.Spliterators$AbstractSpliterator.call(this, { l: 4194303, m: 4194303, h: 524287 }, 1024 | 16);
    this.$init_300();
  };
  defineClass(291, 230, { 1: 1, 20: 1 }, jl.String$LinesSpliterator);
  _.$init_300 = function $init_300() {
    this.nextIndex = 0;
    this.rPosition = -1;
    this.nPosition = -1;
  };
  _.cappedIndexOf = function cappedIndexOf(c) {
    var index_0;
    index_0 = jl.indexOf_II_I__devirtual$(this.this$01, c, this.nextIndex);
    return index_0 == -1 ? jl.length__I__devirtual$_0(this.this$01) : index_0;
  };
  _.tryAdvance = function tryAdvance(action) {
    var lineEnd;
    if (jl.isEmpty__Z__devirtual$(this.this$01)) {
      return false;
    }
    if (this.rPosition < this.nextIndex) {
      this.rPosition = this.cappedIndexOf(13);
    }
    if (this.nPosition < this.nextIndex) {
      this.nPosition = this.cappedIndexOf(10);
    }
    lineEnd = $wnd.Math.min(this.nPosition, this.rPosition);
    action.accept_0(jl.substring_II_Ljava_lang_String___devirtual$(this.this$01, this.nextIndex, lineEnd));
    this.nextIndex = lineEnd + 1;
    if (this.nPosition == this.rPosition + 1) {
      this.nextIndex++;
    }
    return this.nextIndex < jl.length__I__devirtual$_0(this.this$01);
  };
  _.nPosition = 0;
  _.nextIndex = 0;
  _.rPosition = 0;
  cggl.Ljava_lang_String$LinesSpliterator_2_classLit = createForClass("java.lang", "String/LinesSpliterator", 291, cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit);
  jl.$clinit_String$NativeFunction = function $clinit_String$NativeFunction() {
    jl.$clinit_String$NativeFunction = emptyMethod;
    jl.$clinit_Object();
  };
  jl.$clinit_String$NativeString = function $clinit_String$NativeString() {
    jl.$clinit_String$NativeString = emptyMethod;
    jl.$clinit_Object();
  };
  jl.$clinit_StringBuffer = function $clinit_StringBuffer() {
    jl.$clinit_StringBuffer = emptyMethod;
    jl.$clinit_AbstractStringBuilder();
  };
  jl.StringBuffer = function StringBuffer() {
    jl.$clinit_StringBuffer();
    jl.AbstractStringBuilder.call(this, "");
    this.$init_301();
  };
  jl.StringBuffer_0 = function StringBuffer_0(ignoredCapacity) {
    jl.$clinit_StringBuffer();
    jl.AbstractStringBuilder.call(this, "");
    this.$init_301();
  };
  jl.StringBuffer_1 = function StringBuffer_1(s) {
    jl.$clinit_StringBuffer();
    jl.AbstractStringBuilder.call(this, castToString(ji2.checkNotNull_0(s)));
    this.$init_301();
  };
  defineClass(85, 131, { 167: 1, 1: 1 }, jl.StringBuffer, jl.StringBuffer_0, jl.StringBuffer_1);
  _.$init_301 = function $init_301() {
  };
  _.append_0 = function append_0(x_0) {
    this.string += charToString(x_0);
    return this;
  };
  _.append_1 = function append_1(x_0) {
    this.string += x_0;
    return this;
  };
  _.append_2 = function append_2(x_0) {
    this.string += "" + x_0;
    return this;
  };
  _.append_3 = function append_3(x_0, start_0, len) {
    this.string += "" + jl.valueOf_23(x_0, start_0, len);
    return this;
  };
  cggl.Ljava_lang_StringBuffer_2_classLit = createForClass("java.lang", "StringBuffer", 85, cggl.Ljava_lang_AbstractStringBuilder_2_classLit);
  jl.$clinit_StringBuilder = function $clinit_StringBuilder() {
    jl.$clinit_StringBuilder = emptyMethod;
    jl.$clinit_AbstractStringBuilder();
  };
  jl.StringBuilder = function StringBuilder() {
    jl.$clinit_StringBuilder();
    jl.AbstractStringBuilder.call(this, "");
    this.$init_302();
  };
  jl.StringBuilder_0 = function StringBuilder_0(ignoredCapacity) {
    jl.$clinit_StringBuilder();
    jl.AbstractStringBuilder.call(this, "");
    this.$init_302();
  };
  jl.StringBuilder_1 = function StringBuilder_1(s) {
    jl.$clinit_StringBuilder();
    jl.AbstractStringBuilder.call(this, castToString(ji2.checkNotNull_0(s)));
    this.$init_302();
  };
  defineClass(26, 131, { 167: 1, 1: 1 }, jl.StringBuilder, jl.StringBuilder_0, jl.StringBuilder_1);
  _.$init_302 = function $init_302() {
  };
  _.append_4 = function append_4(x_0) {
    this.string += charToString(x_0);
    return this;
  };
  _.append_5 = function append_5(x_0) {
    this.string += x_0;
    return this;
  };
  _.append_6 = function append_6(x_0) {
    this.string += toString_28(x_0);
    return this;
  };
  _.append_7 = function append_7(x_0) {
    this.string += "" + x_0;
    return this;
  };
  _.append_8 = function append_8(x_0, start_0, end) {
    this.string += "" + jl.substring_II_Ljava_lang_String___devirtual$(valueOf_20(x_0), start_0, end);
    return this;
  };
  _.append_9 = function append_9(x_0) {
    this.string += "" + x_0;
    return this;
  };
  _.append_10 = function append_10(x_0, start_0, len) {
    this.string += "" + jl.valueOf_23(x_0, start_0, len);
    return this;
  };
  _.insert = function insert(index_0, x_0) {
    return this.insert_0(index_0, jl.valueOf_15(x_0));
  };
  _.insert_0 = function insert_0(index_0, x_0) {
    this.replace0(index_0, index_0, x_0);
    return this;
  };
  _.insert_1 = function insert_1(index_0, x_0, offset, len) {
    return this.insert_0(index_0, jl.valueOf_23(x_0, offset, len));
  };
  cggl.Ljava_lang_StringBuilder_2_classLit = createForClass("java.lang", "StringBuilder", 26, cggl.Ljava_lang_AbstractStringBuilder_2_classLit);
  jl.$clinit_System = function $clinit_System() {
    jl.$clinit_System = emptyMethod;
    jl.$clinit_Object();
    jl.err = new ji.PrintStream(null);
    jl.out_0 = new ji.PrintStream(null);
  };
  jl.arrayTypeMatch = function arrayTypeMatch(srcComp, destComp) {
    if (srcComp.isPrimitive()) {
      return jl.equals_Ljava_lang_Object__Z__devirtual$(srcComp, destComp);
    } else {
      return !destComp.isPrimitive();
    }
  };
  jl.arraycopy = function arraycopy(src_0, srcOfs, dest, destOfs, len) {
    jl.$clinit_System();
    var destArray, destComp, destEnd, destType, srcArray, srcComp, srcType;
    ji2.checkNotNull_1(src_0, "src");
    ji2.checkNotNull_1(dest, "dest");
    if (!ji2.isTypeChecked()) {
      jl.checkArrayCopyIndicies(src_0, srcOfs, dest, destOfs, len);
      ji2.copy_2(src_0, srcOfs, dest, destOfs, len);
      return;
    }
    srcType = jl.getClass__Ljava_lang_Class___devirtual$(src_0);
    destType = jl.getClass__Ljava_lang_Class___devirtual$(dest);
    ji2.checkArrayType_0(srcType.isArray_0(), "srcType is not an array");
    ji2.checkArrayType_0(destType.isArray_0(), "destType is not an array");
    srcComp = srcType.getComponentType();
    destComp = destType.getComponentType();
    ji2.checkArrayType_0(jl.arrayTypeMatch(srcComp, destComp), "Array types don't match");
    jl.checkArrayCopyIndicies(src_0, srcOfs, dest, destOfs, len);
    if (!srcComp.isPrimitive() && !jl.equals_Ljava_lang_Object__Z__devirtual$(srcType, destType)) {
      srcArray = castToArray(src_0);
      destArray = castToArray(dest);
      if (maskUndefined(src_0) === maskUndefined(dest) && srcOfs < destOfs) {
        srcOfs += len;
        for (destEnd = destOfs + len; destEnd-- > destOfs; ) {
          setCheck(destArray, destEnd, srcArray[--srcOfs]);
        }
      } else {
        for (destEnd = destOfs + len; destOfs < destEnd; ) {
          setCheck(destArray, destOfs++, srcArray[srcOfs++]);
        }
      }
    } else {
      ji2.copy_2(src_0, srcOfs, dest, destOfs, len);
    }
  };
  jl.checkArrayCopyIndicies = function checkArrayCopyIndicies(src_0, srcOfs, dest, destOfs, len) {
    var destlen, srclen;
    srclen = ji2.getLength_2(src_0);
    destlen = ji2.getLength_2(dest);
    if (srcOfs < 0 || destOfs < 0 || len < 0 || srcOfs + len > srclen || destOfs + len > destlen) {
      throw toJs(new jl.IndexOutOfBoundsException());
    }
  };
  jl.currentTimeMillis_0 = function currentTimeMillis_0() {
    jl.$clinit_System();
    return fromDouble_0(Date.now());
  };
  jl.lineSeparator = function lineSeparator() {
    jl.$clinit_System();
    return "\n";
  };
  defineClass(639, 1, { 1: 1 });
  jl.MILLIS_TO_NANOS = 1e6;
  cggl.Ljava_lang_System_2_classLit = createForClass("java.lang", "System", 639, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_Thread = function $clinit_Thread() {
    jl.$clinit_Thread = emptyMethod;
    jl.$clinit_Object();
  };
  jl.yield_0 = function yield_0() {
    jl.$clinit_Thread();
  };
  defineClass(744, 1, { 1: 1 });
  cggl.Ljava_lang_Thread_2_classLit = createForClass("java.lang", "Thread", 744, cggl.Ljava_lang_Object_2_classLit);
  jl.$clinit_Throwable$HasJavaThrowable = function $clinit_Throwable$HasJavaThrowable() {
    jl.$clinit_Throwable$HasJavaThrowable = emptyMethod;
  };
  jl.$clinit_UnsupportedOperationException = function $clinit_UnsupportedOperationException() {
    jl.$clinit_UnsupportedOperationException = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  jl.UnsupportedOperationException = function UnsupportedOperationException() {
    jl.$clinit_UnsupportedOperationException();
    jl.RuntimeException.call(this);
    this.$init_304();
  };
  jl.UnsupportedOperationException_0 = function UnsupportedOperationException_0(message) {
    jl.$clinit_UnsupportedOperationException();
    jl.RuntimeException_1.call(this, message);
    this.$init_304();
  };
  defineClass(37, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, jl.UnsupportedOperationException, jl.UnsupportedOperationException_0);
  _.$init_304 = function $init_304() {
  };
  cggl.Ljava_lang_UnsupportedOperationException_2_classLit = createForClass("java.lang", "UnsupportedOperationException", 37, cggl.Ljava_lang_RuntimeException_2_classLit);
  jl.$clinit_Void = function $clinit_Void() {
    jl.$clinit_Void = emptyMethod;
  };
  defineClass(280, 1, { 1: 1, 280: 1 });
  cggl.Ljava_lang_Void_2_classLit = createForClass("java.lang", "Void", 280, cggl.Ljava_lang_Object_2_classLit);
  jm.$clinit_BigDecimal = function $clinit_BigDecimal() {
    jm.$clinit_BigDecimal = emptyMethod;
    var i, j, j0;
    jl.$clinit_Number();
    jm.ONE_0 = new jm.BigDecimal_2(1, 0);
    jm.TEN = new jm.BigDecimal_2(10, 0);
    jm.ZERO_0 = new jm.BigDecimal_2(0, 0);
    jm.BI_SCALED_BY_ZERO = initUnidimensionalArray(cggl.Ljava_math_BigDecimal_2_classLit, { 4: 1, 1: 1, 7: 1 }, 43, 11, 0, 1);
    jm.CH_ZEROS = initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, 100, 15, 1);
    jm.DOUBLE_FIVE_POW = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625, 48828125, 244140625, 1220703125, 6103515625, 30517578125, 152587890625, 762939453125, 3814697265625, 19073486328125, 95367431640625, 476837158203125, 2384185791015625]);
    jm.DOUBLE_FIVE_POW_BIT_LENGTH = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, jm.DOUBLE_FIVE_POW.length, 15, 1);
    jm.DOUBLE_TEN_POW = stampJavaTypeInfo(getClassLiteralForArray(cggl.D_classLit, 1), { 11: 1, 4: 1, 1: 1 }, 5, 15, [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16]);
    jm.DOUBLE_TEN_POW_BIT_LENGTH = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, jm.DOUBLE_TEN_POW.length, 15, 1);
    jm.ZERO_SCALED_BY = initUnidimensionalArray(cggl.Ljava_math_BigDecimal_2_classLit, { 4: 1, 1: 1, 7: 1 }, 43, 11, 0, 1);
    {
      i = 0;
      for (; i < jm.ZERO_SCALED_BY.length; i++) {
        setCheck(jm.BI_SCALED_BY_ZERO, i, new jm.BigDecimal_2(fromInt_0(i), 0));
        setCheck(jm.ZERO_SCALED_BY, i, new jm.BigDecimal_2(0, i));
        jm.CH_ZEROS[i] = 48;
      }
      for (; i < jm.CH_ZEROS.length; i++) {
        jm.CH_ZEROS[i] = 48;
      }
      for (j0 = 0; j0 < jm.DOUBLE_FIVE_POW_BIT_LENGTH.length; j0++) {
        jm.DOUBLE_FIVE_POW_BIT_LENGTH[j0] = jm.bitLength(jm.DOUBLE_FIVE_POW[j0]);
      }
      for (j = 0; j < jm.DOUBLE_TEN_POW_BIT_LENGTH.length; j++) {
        jm.DOUBLE_TEN_POW_BIT_LENGTH[j] = jm.bitLength(jm.DOUBLE_TEN_POW[j]);
      }
      jm.TEN_POW = (jm.$clinit_Multiplication(), jm.bigTenPows);
      jm.FIVE_POW = (jm.$clinit_Multiplication(), jm.bigFivePows);
    }
  };
  jm.BigDecimal = function BigDecimal(val) {
    jm.$clinit_BigDecimal();
    jl.Number_0.call(this);
    this.$init_305();
    if (jl.isInfinite(val) || isNaN(val)) {
      throw toJs(new jl.NumberFormatException("Infinite or NaN"));
    }
    this.initFrom(ji2.toPrecision(val, 20));
  };
  jm.BigDecimal_0 = function BigDecimal_0(smallValue, scale) {
    jl.Number_0.call(this);
    this.$init_305();
    this.smallValue = smallValue;
    this.scale = scale;
    this.bitLength = jm.bitLength(smallValue);
  };
  jm.BigDecimal_1 = function BigDecimal_1(val, mc) {
    jm.$clinit_BigDecimal();
    jm.BigDecimal.call(this, val);
    this.inplaceRound(mc);
  };
  jm.BigDecimal_2 = function BigDecimal_2(smallValue, scale) {
    jl.Number_0.call(this);
    this.$init_305();
    this.scale = scale;
    this.bitLength = jm.bitLength_0(smallValue);
    if (this.bitLength < 54) {
      this.smallValue = toDouble_0(smallValue);
    } else {
      this.intVal = jm.valueOf_27(smallValue);
    }
  };
  jm.BigDecimal_3 = function BigDecimal_3(val) {
    jm.BigDecimal_5.call(this, val, 0);
  };
  jm.BigDecimal_4 = function BigDecimal_4(unscaledVal, scale) {
    jl.Number_0.call(this);
    this.$init_305();
    this.scale = scale;
    this.setUnscaledValue(castTo(ji2.checkNotNull_0(unscaledVal), 24));
  };
  jm.BigDecimal_5 = function BigDecimal_5(unscaledVal, scale) {
    jm.BigDecimal_4.call(this, unscaledVal, scale);
  };
  jm.bitLength = function bitLength(value_0) {
    var negative, result;
    if (value_0 > -140737488355328 && value_0 < 140737488355328) {
      if (value_0 == 0) {
        return 0;
      }
      negative = value_0 < 0;
      if (negative) {
        value_0 = -value_0;
      }
      result = round_int($wnd.Math.floor($wnd.Math.log(value_0) / 0.6931471805599453));
      if (!negative || value_0 != $wnd.Math.pow(2, result)) {
        result++;
      }
      return result;
    }
    return jm.bitLength_0(fromDouble_0(value_0));
  };
  jm.bitLength_0 = function bitLength_0(value_0) {
    if (lt(value_0, 0)) {
      value_0 = not_0(value_0);
    }
    return 64 - numberOfLeadingZeros_1(value_0);
  };
  jm.divideBigIntegers = function divideBigIntegers(scaledDividend, scaledDivisor, scale, roundingMode) {
    var compRem, divisor, quotAndRem, quotient, rem, remainder, sign;
    quotAndRem = scaledDividend.divideAndRemainder(scaledDivisor);
    quotient = quotAndRem[0];
    remainder = quotAndRem[1];
    if (remainder.signum() == 0) {
      return new jm.BigDecimal_5(quotient, scale);
    }
    sign = scaledDividend.signum() * scaledDivisor.signum();
    if (scaledDivisor.bitLength_0() < 54) {
      rem = remainder.longValue();
      divisor = scaledDivisor.longValue();
      compRem = compare_26(shl_0(jl.abs_0(rem), 1), jl.abs_0(divisor));
      compRem = jm.roundingBehavior(quotient.testBit(0) ? 1 : 0, sign * (5 + compRem), roundingMode);
    } else {
      compRem = remainder.abs_0().shiftLeftOneBit().compareTo_20(scaledDivisor.abs_0());
      compRem = jm.roundingBehavior(quotient.testBit(0) ? 1 : 0, sign * (5 + compRem), roundingMode);
    }
    if (compRem != 0) {
      if (quotient.bitLength_0() < 54) {
        return jm.valueOf_26(add_20(quotient.longValue(), fromInt_0(compRem)), scale);
      }
      quotient = quotient.add_11(jm.valueOf_27(fromInt_0(compRem)));
      return new jm.BigDecimal_5(quotient, scale);
    }
    return new jm.BigDecimal_5(quotient, scale);
  };
  jm.dividePrimitiveDoubles = function dividePrimitiveDoubles(scaledDividend, scaledDivisor, scale, roundingMode) {
    var compRem, quotient, remainder, sign;
    quotient = jm.intDivide(scaledDividend, scaledDivisor);
    remainder = scaledDividend % scaledDivisor;
    sign = compare_23(scaledDividend * scaledDivisor, 0);
    if (remainder != 0) {
      compRem = compare_23($wnd.Math.abs(remainder) * 2, $wnd.Math.abs(scaledDivisor));
      quotient += jm.roundingBehavior(round_int(quotient) & 1, sign * (5 + compRem), roundingMode);
    }
    return jm.valueOf_24(quotient, scale);
  };
  jm.intDivide = function intDivide(dividend, divisor) {
    var quotient;
    quotient = dividend / divisor;
    return quotient > 0 ? $wnd.Math.floor(quotient) : $wnd.Math.ceil(quotient);
  };
  jm.isValidBigUnscaledDecimal = function isValidBigUnscaledDecimal(str) {
    if (jsEquals(jm.unscaledRegex, null)) {
      jm.unscaledRegex = new RegExp("^[+-]?\\d*$", "i");
    }
    return jm.unscaledRegex.test(str);
  };
  jm.parseUnscaled = function parseUnscaled(str) {
    return jm.isValidBigUnscaledDecimal(str) ? parseInt(str, 10) : NaN;
  };
  jm.roundingBehavior = function roundingBehavior(parityBit, fraction, roundingMode) {
    var increment;
    increment = 0;
    switch (roundingMode.ordinal()) {
      case (jm.$clinit_RoundingMode(), jm.UNNECESSARY).ordinal():
        if (fraction != 0) {
          throw toJs(new jl.ArithmeticException("Rounding necessary"));
        }
        break;
      case (jm.$clinit_RoundingMode(), jm.UP).ordinal():
        increment = signum_0(fraction);
        break;
      case (jm.$clinit_RoundingMode(), jm.DOWN).ordinal():
        break;
      case (jm.$clinit_RoundingMode(), jm.CEILING).ordinal():
        increment = $wnd.Math.max(signum_0(fraction), 0);
        break;
      case (jm.$clinit_RoundingMode(), jm.FLOOR).ordinal():
        increment = $wnd.Math.min(signum_0(fraction), 0);
        break;
      case (jm.$clinit_RoundingMode(), jm.HALF_UP).ordinal():
        if ($wnd.Math.abs(fraction) >= 5) {
          increment = signum_0(fraction);
        }
        break;
      case (jm.$clinit_RoundingMode(), jm.HALF_DOWN).ordinal():
        if ($wnd.Math.abs(fraction) > 5) {
          increment = signum_0(fraction);
        }
        break;
      case (jm.$clinit_RoundingMode(), jm.HALF_EVEN).ordinal():
        if ($wnd.Math.abs(fraction) + parityBit > 5) {
          increment = signum_0(fraction);
        }
        break;
    }
    return increment;
  };
  jm.toIntScale = function toIntScale(doubleScale) {
    if (doubleScale < -2147483648) {
      throw toJs(new jl.ArithmeticException("Overflow"));
    } else if (doubleScale > 2147483647) {
      throw toJs(new jl.ArithmeticException("Underflow"));
    } else {
      return round_int(doubleScale);
    }
  };
  jm.valueOf_24 = function valueOf_24(smallValue, scale) {
    return new jm.BigDecimal_0(smallValue, scale);
  };
  jm.valueOf_25 = function valueOf_25(unscaledVal) {
    if (gte_0(unscaledVal, 0) && lt(unscaledVal, 11)) {
      return jm.BI_SCALED_BY_ZERO[toInt_0(unscaledVal)];
    }
    return new jm.BigDecimal_2(unscaledVal, 0);
  };
  jm.valueOf_26 = function valueOf_26(unscaledVal, scale) {
    if (scale == 0) {
      return jm.valueOf_25(unscaledVal);
    }
    if (eq(unscaledVal, 0) && scale >= 0 && scale < jm.ZERO_SCALED_BY.length) {
      return jm.ZERO_SCALED_BY[scale];
    }
    return new jm.BigDecimal_2(unscaledVal, scale);
  };
  defineClass(43, 19, { 4: 1, 22: 1, 19: 1, 1: 1, 43: 1 }, jm.BigDecimal, jm.BigDecimal_0, jm.BigDecimal_1, jm.BigDecimal_2, jm.BigDecimal_3, jm.BigDecimal_5);
  _.$init_305 = function $init_305() {
  };
  _.compareTo_1 = function compareTo_37(val) {
    return this.compareTo_19(castTo(val, 43));
  };
  _.approxPrecision = function approxPrecision() {
    return this.precision > 0 ? this.precision : $wnd.Math.floor((this.bitLength - 1) * 0.3010299956639812) + 1;
  };
  _.compareTo_19 = function compareTo_38(val) {
    var diffPrecision, diffScale, thisSign, thisUnscaled, valUnscaled, valueSign;
    thisSign = this.signum();
    valueSign = val.signum();
    if (thisSign == valueSign) {
      if (this.scale == val.scale && this.bitLength < 54 && val.bitLength < 54) {
        return this.smallValue < val.smallValue ? -1 : this.smallValue > val.smallValue ? 1 : 0;
      }
      diffScale = this.scale - val.scale;
      diffPrecision = this.approxPrecision() - val.approxPrecision();
      if (diffPrecision > diffScale + 1) {
        return thisSign;
      } else if (diffPrecision < diffScale - 1) {
        return -thisSign;
      } else {
        thisUnscaled = this.getUnscaledValue();
        valUnscaled = val.getUnscaledValue();
        if (diffScale < 0) {
          thisUnscaled = thisUnscaled.multiply(jm.powerOf10(-diffScale));
        } else if (diffScale > 0) {
          valUnscaled = valUnscaled.multiply(jm.powerOf10(diffScale));
        }
        return thisUnscaled.compareTo_20(valUnscaled);
      }
    } else if (thisSign < valueSign) {
      return -1;
    } else {
      return 1;
    }
  };
  _.doubleValue = function doubleValue_5() {
    return parseDouble(this.toString_0());
  };
  _.equals_0 = function equals_31(x_0) {
    var x1;
    if (maskUndefined(this) === maskUndefined(x_0)) {
      return true;
    }
    if (instanceOf(x_0, 43)) {
      x1 = castTo(x_0, 43);
      return this.scale == x1.scale && this.compareTo_19(x1) == 0;
    }
    return false;
  };
  _.floatValue = function floatValue_4() {
    var floatResult, powerOfTwo;
    floatResult = this.signum();
    powerOfTwo = this.bitLength - this.scale / 0.3010299956639812;
    if (powerOfTwo < -149 || floatResult == 0) {
      floatResult *= 0;
    } else if (powerOfTwo > 129) {
      floatResult *= Infinity;
    } else {
      floatResult = this.doubleValue();
    }
    return floatResult;
  };
  _.getUnscaledValue = function getUnscaledValue() {
    if (isNull(this.intVal)) {
      this.intVal = jm.valueOf_27(fromDouble_0(this.smallValue));
    }
    return this.intVal;
  };
  _.hashCode_1 = function hashCode_22() {
    var longValue;
    if (this.hashCode_0 != 0) {
      return this.hashCode_0;
    }
    if (this.bitLength < 54) {
      longValue = fromDouble_0(this.smallValue);
      this.hashCode_0 = toInt_0(and_0(longValue, -1));
      this.hashCode_0 = 33 * this.hashCode_0 + toInt_0(and_0(shr_0(longValue, 32), -1));
      this.hashCode_0 = 17 * this.hashCode_0 + round_int(this.scale);
      return this.hashCode_0;
    }
    this.hashCode_0 = 17 * this.intVal.hashCode_1() + round_int(this.scale);
    return this.hashCode_0;
  };
  _.initFrom = function initFrom(val) {
    var begin, ch_0, i, last, offset, scaleString, unscaled, unscaledBuffer;
    begin = 0;
    offset = 0;
    last = jl.length__I__devirtual$_0(val);
    scaleString = null;
    unscaledBuffer = new jl.StringBuilder_0(jl.length__I__devirtual$_0(val));
    if (offset < last && jl.charAt_I_C__devirtual$_0(val, offset) == 43) {
      offset++;
      begin++;
      if (offset < last && (jl.charAt_I_C__devirtual$_0(val, offset) == 43 || jl.charAt_I_C__devirtual$_0(val, offset) == 45)) {
        throw toJs(new jl.NumberFormatException('For input string: "' + val + '"'));
      }
    }
    while (offset < last && jl.charAt_I_C__devirtual$_0(val, offset) != 46 && jl.charAt_I_C__devirtual$_0(val, offset) != 101 && jl.charAt_I_C__devirtual$_0(val, offset) != 69) {
      offset++;
    }
    unscaledBuffer.append_8(val, begin, offset);
    if (offset < last && jl.charAt_I_C__devirtual$_0(val, offset) == 46) {
      offset++;
      begin = offset;
      while (offset < last && jl.charAt_I_C__devirtual$_0(val, offset) != 101 && jl.charAt_I_C__devirtual$_0(val, offset) != 69) {
        offset++;
      }
      this.scale = offset - begin;
      unscaledBuffer.append_8(val, begin, offset);
    } else {
      this.scale = 0;
    }
    if (offset < last && (jl.charAt_I_C__devirtual$_0(val, offset) == 101 || jl.charAt_I_C__devirtual$_0(val, offset) == 69)) {
      offset++;
      begin = offset;
      if (offset < last && jl.charAt_I_C__devirtual$_0(val, offset) == 43) {
        offset++;
        if (offset < last && jl.charAt_I_C__devirtual$_0(val, offset) != 45) {
          begin++;
        }
      }
      scaleString = jl.substring_II_Ljava_lang_String___devirtual$(val, begin, last);
      this.scale = this.scale - jl.parseInt_2(scaleString);
      if (this.scale != round_int(this.scale)) {
        throw toJs(new jl.NumberFormatException("Scale out of range."));
      }
    }
    unscaled = unscaledBuffer.toString_0();
    if (jl.length__I__devirtual$_0(unscaled) < 16) {
      this.smallValue = jm.parseUnscaled(unscaled);
      if (isNaN(this.smallValue)) {
        throw toJs(new jl.NumberFormatException('For input string: "' + val + '"'));
      }
      this.bitLength = jm.bitLength(this.smallValue);
    } else {
      this.setUnscaledValue(new jm.BigInteger_3(unscaled));
    }
    this.precision = unscaledBuffer.length_1();
    for (i = 0; i < unscaledBuffer.length_1(); ++i) {
      ch_0 = unscaledBuffer.charAt(i);
      if (ch_0 != 45 && ch_0 != 48) {
        break;
      }
      --this.precision;
    }
    if (this.precision == 0) {
      this.precision = 1;
    }
  };
  _.inplaceRound = function inplaceRound(mc) {
    var compRem, discardedPrecision, integerAndFraction, mcPrecision, newScale, sizeOfFraction, tempBD;
    mcPrecision = mc.getPrecision();
    if (this.approxPrecision() - mcPrecision < 0 || mcPrecision == 0) {
      return;
    }
    discardedPrecision = this.precision_0() - mcPrecision;
    if (discardedPrecision <= 0) {
      return;
    }
    if (this.bitLength < 54) {
      this.smallRound(mc, discardedPrecision);
      return;
    }
    sizeOfFraction = jm.powerOf10(discardedPrecision);
    integerAndFraction = this.getUnscaledValue().divideAndRemainder(sizeOfFraction);
    newScale = this.scale - discardedPrecision;
    if (integerAndFraction[1].signum() != 0) {
      compRem = integerAndFraction[1].abs_0().shiftLeftOneBit().compareTo_20(sizeOfFraction);
      compRem = jm.roundingBehavior(integerAndFraction[0].testBit(0) ? 1 : 0, integerAndFraction[1].signum() * (5 + compRem), mc.getRoundingMode());
      if (compRem != 0) {
        setCheck(integerAndFraction, 0, integerAndFraction[0].add_11(jm.valueOf_27(fromInt_0(compRem))));
      }
      tempBD = new jm.BigDecimal_3(integerAndFraction[0]);
      if (tempBD.precision_0() > mcPrecision) {
        setCheck(integerAndFraction, 0, integerAndFraction[0].divide((jm.$clinit_BigInteger(), jm.TEN_0)));
        newScale--;
      }
    }
    this.scale = jm.toIntScale(newScale);
    this.precision = mcPrecision;
    this.setUnscaledValue(integerAndFraction[0]);
  };
  _.intValue = function intValue_5() {
    return this.scale <= -32 || this.scale > this.approxPrecision() ? 0 : this.toBigInteger().intValue();
  };
  _.isZero = function isZero_0() {
    return this.bitLength == 0 && this.smallValue != -1;
  };
  _.longValue = function longValue_5() {
    return this.scale <= -64 || this.scale > this.approxPrecision() ? 0 : this.toBigInteger().longValue();
  };
  _.precision_0 = function precision_0() {
    var decimalDigits, doubleUnsc;
    if (this.precision > 0) {
      return this.precision;
    }
    decimalDigits = 1;
    doubleUnsc = 1;
    if (this.bitLength < 54) {
      if (this.bitLength >= 1) {
        doubleUnsc = this.smallValue;
      }
      decimalDigits += jl.log10($wnd.Math.abs(doubleUnsc));
    } else {
      decimalDigits += (this.bitLength - 1) * 0.3010299956639812;
      if (this.getUnscaledValue().divide(jm.powerOf10(decimalDigits)).signum() != 0) {
        decimalDigits++;
      }
    }
    this.precision = round_int(decimalDigits);
    return this.precision;
  };
  _.setScale = function setScale(newScale, roundingMode) {
    var diffScale;
    ji2.checkNotNull_0(roundingMode);
    diffScale = newScale - this.scale;
    if (diffScale == 0) {
      return this;
    }
    if (diffScale > 0) {
      if (diffScale < jm.DOUBLE_TEN_POW.length && this.bitLength + jm.DOUBLE_TEN_POW_BIT_LENGTH[round_int(diffScale)] < 54) {
        return jm.valueOf_24(this.smallValue * jm.DOUBLE_TEN_POW[round_int(diffScale)], newScale);
      }
      return new jm.BigDecimal_5(jm.multiplyByTenPow(this.getUnscaledValue(), round_int(diffScale)), newScale);
    }
    if (this.bitLength < 54 && -diffScale < jm.DOUBLE_TEN_POW.length) {
      return jm.dividePrimitiveDoubles(this.smallValue, jm.DOUBLE_TEN_POW[round_int(-diffScale)], newScale, roundingMode);
    }
    return jm.divideBigIntegers(this.getUnscaledValue(), jm.powerOf10(-diffScale), newScale, roundingMode);
  };
  _.setUnscaledValue = function setUnscaledValue(unscaledValue) {
    this.intVal = unscaledValue;
    this.bitLength = unscaledValue.bitLength_0();
    if (this.bitLength < 54) {
      this.smallValue = toDouble_0(unscaledValue.longValue());
    }
  };
  _.signum = function signum_4() {
    if (this.bitLength < 54) {
      return this.smallValue < 0 ? -1 : this.smallValue > 0 ? 1 : 0;
    }
    return this.getUnscaledValue().signum();
  };
  _.smallRound = function smallRound(mc, discardedPrecision) {
    var $tmp, compRem, fraction, integer, newScale, sizeOfFraction, unscaledVal;
    sizeOfFraction = fromDouble_0(jm.DOUBLE_TEN_POW[discardedPrecision]);
    newScale = sub_2(fromDouble_0(this.scale), fromInt_0(discardedPrecision));
    unscaledVal = fromDouble_0(this.smallValue);
    integer = div_0(unscaledVal, sizeOfFraction);
    fraction = mod_0(unscaledVal, sizeOfFraction);
    if (neq(fraction, 0)) {
      compRem = compare_26(shl_0(jl.abs_0(fraction), 1), sizeOfFraction);
      integer = add_20(integer, fromInt_0(jm.roundingBehavior(toInt_0(integer) & 1, signum_1(fraction) * (5 + compRem), mc.getRoundingMode())));
      if (jl.log10(toDouble_0(jl.abs_0(integer))) >= mc.getPrecision()) {
        integer = div_0(integer, 10);
        $tmp = newScale, newScale = sub_2(newScale, 1), $tmp;
      }
    }
    this.scale = jm.toIntScale(toDouble_0(newScale));
    this.precision = mc.getPrecision();
    this.smallValue = toDouble_0(integer);
    this.bitLength = jm.bitLength_0(integer);
    this.intVal = null;
  };
  _.toBigInteger = function toBigInteger() {
    if (this.scale == 0 || this.isZero()) {
      return this.getUnscaledValue();
    } else if (this.scale < 0) {
      return this.getUnscaledValue().multiply(jm.powerOf10(-this.scale));
    } else {
      return this.getUnscaledValue().divide(jm.powerOf10(this.scale));
    }
  };
  _.toString_0 = function toString_49() {
    var begin, end, exponent, intString, result;
    if (jsNotEquals(this.toStringImage, null)) {
      return this.toStringImage;
    }
    if (this.bitLength < 32) {
      this.toStringImage = jm.toDecimalScaledString(fromDouble_0(this.smallValue), round_int(this.scale));
      return this.toStringImage;
    }
    intString = this.getUnscaledValue().toString_0();
    if (this.scale == 0) {
      return intString;
    }
    begin = this.getUnscaledValue().signum() < 0 ? 2 : 1;
    end = jl.length__I__devirtual$_0(intString);
    exponent = -this.scale + end - begin;
    result = new jl.StringBuilder();
    result.append_9(intString);
    if (this.scale > 0 && exponent >= -6) {
      if (exponent >= 0) {
        result.insert(end - round_int(this.scale), 46);
      } else {
        result.insert_0(begin - 1, "0.");
        result.insert_1(begin + 1, jm.CH_ZEROS, 0, -round_int(exponent) - 1);
      }
    } else {
      if (end - begin >= 1) {
        result.insert(begin, 46);
        end++;
      }
      result.insert(end, 69);
      if (exponent > 0) {
        result.insert(++end, 43);
      }
      result.insert_0(++end, jl.toString_44(fromDouble_0(exponent)));
    }
    this.toStringImage = result.toString_0();
    return this.toStringImage;
  };
  _.bitLength = 0;
  _.hashCode_0 = 0;
  _.precision = 0;
  _.scale = 0;
  _.smallValue = 0;
  jm.BI_SCALED_BY_ZERO_LENGTH = 11;
  jm.LOG10_2 = 0.3010299956639812;
  jm.LOG2 = 0.6931471805599453;
  jm.POW47 = 140737488355328;
  jm.ROUND_CEILING = 2;
  jm.ROUND_DOWN = 1;
  jm.ROUND_FLOOR = 3;
  jm.ROUND_HALF_DOWN = 5;
  jm.ROUND_HALF_EVEN = 6;
  jm.ROUND_HALF_UP = 4;
  jm.ROUND_UNNECESSARY = 7;
  jm.ROUND_UP = 0;
  jm.SMALL_VALUE_BITS = 54;
  jm.serialVersionUID_13 = { l: 75855, m: 1400806, h: 347249 };
  cggl.Ljava_math_BigDecimal_2_classLit = createForClass("java.math", "BigDecimal", 43, cggl.Ljava_lang_Number_2_classLit);
  jm.$clinit_BigInteger = function $clinit_BigInteger() {
    jm.$clinit_BigInteger = emptyMethod;
    var i;
    jl.$clinit_Number();
    jm.ONE_1 = new jm.BigInteger(1, 1);
    jm.TEN_0 = new jm.BigInteger(1, 10);
    jm.ZERO_1 = new jm.BigInteger(0, 0);
    jm.LESS = -1;
    jm.MINUS_ONE = new jm.BigInteger(-1, 1);
    jm.SMALL_VALUES = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_math_BigInteger_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 24, 0, [jm.ZERO_1, jm.ONE_1, new jm.BigInteger(1, 2), new jm.BigInteger(1, 3), new jm.BigInteger(1, 4), new jm.BigInteger(1, 5), new jm.BigInteger(1, 6), new jm.BigInteger(1, 7), new jm.BigInteger(1, 8), new jm.BigInteger(1, 9), jm.TEN_0]);
    jm.serialVersionUID_14 = neg_0({ l: 263395, m: 229723, h: 471094 });
    {
      jm.TWO_POWS = initUnidimensionalArray(cggl.Ljava_math_BigInteger_2_classLit, { 4: 1, 1: 1, 7: 1 }, 24, 32, 0, 1);
      for (i = 0; i < jm.TWO_POWS.length; i++) {
        setCheck(jm.TWO_POWS, i, jm.valueOf_27(shl_0(1, i)));
      }
    }
  };
  jm.BigInteger = function BigInteger(sign, bits) {
    jm.$clinit_BigInteger();
    jm.BigInteger_1.call(this, sign, 1, stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [bits]));
  };
  jm.BigInteger_0 = function BigInteger_0(sign, lowBits, highBits) {
    jm.BigInteger_1.call(this, sign, 2, stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [lowBits, highBits]));
  };
  jm.BigInteger_1 = function BigInteger_1(sign, numberLength, digits) {
    jm.$clinit_BigInteger();
    jl.Number_0.call(this);
    this.$init_306();
    this.sign = sign;
    this.numberLength = numberLength;
    this.digits = digits;
  };
  jm.BigInteger_2 = function BigInteger_2(signum, digits) {
    jm.$clinit_BigInteger();
    jl.Number_0.call(this);
    this.$init_306();
    if (digits.length == 0) {
      this.sign = 0;
      this.numberLength = 1;
      this.digits = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [0]);
    } else {
      this.sign = signum;
      this.numberLength = digits.length;
      this.digits = digits;
      this.cutOffLeadingZeroes();
    }
  };
  jm.BigInteger_3 = function BigInteger_3(val) {
    jm.$clinit_BigInteger();
    jm.BigInteger_4.call(this, val, 10);
  };
  jm.BigInteger_4 = function BigInteger_4(val, radix) {
    jl.Number_0.call(this);
    this.$init_306();
    ji2.checkNotNull_0(val);
    if (radix < 2 || radix > 36) {
      throw toJs(new jl.NumberFormatException("Radix out of range"));
    }
    if (jl.isEmpty__Z__devirtual$(val)) {
      throw toJs(new jl.NumberFormatException("Zero length BigInteger"));
    }
    jm.setFromString(this, val, radix);
  };
  jm.fromBits = function fromBits(bits) {
    var highBits, lowBits;
    lowBits = toInt_0(bits);
    highBits = ji2.getHighBits(bits);
    if (highBits != 0) {
      return new jm.BigInteger_0(1, lowBits, highBits);
    }
    if (lowBits > 10 || lowBits < 0) {
      return new jm.BigInteger(1, lowBits);
    }
    return jm.SMALL_VALUES[lowBits];
  };
  jm.getPowerOfTwo = function getPowerOfTwo(exp_0) {
    var bitN, intCount, resDigits;
    if (exp_0 < jm.TWO_POWS.length) {
      return jm.TWO_POWS[exp_0];
    }
    intCount = exp_0 >> 5;
    bitN = exp_0 & 31;
    resDigits = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, intCount + 1, 15, 1);
    resDigits[intCount] = 1 << bitN;
    return new jm.BigInteger_1(1, intCount + 1, resDigits);
  };
  jm.setFromString = function setFromString(bi, val, radix) {
    var bigRadix, bigRadixDigit, bigRadixDigitsLength, charsPerInt, digitIndex, digits, endChar, newDigit, numberLength, sign, startChar, stringLength, substrEnd, substrStart, topChars;
    stringLength = jl.length__I__devirtual$_0(val);
    endChar = stringLength;
    if (jl.charAt_I_C__devirtual$_0(val, 0) == 45) {
      sign = -1;
      startChar = 1;
      stringLength--;
    } else {
      sign = 1;
      startChar = 0;
    }
    charsPerInt = (jm.$clinit_Conversion(), jm.digitFitInInt)[radix];
    bigRadixDigitsLength = narrow_int(stringLength / charsPerInt);
    topChars = stringLength % charsPerInt;
    if (topChars != 0) {
      bigRadixDigitsLength++;
    }
    digits = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, bigRadixDigitsLength, 15, 1);
    bigRadix = (jm.$clinit_Conversion(), jm.bigRadices)[radix - 2];
    digitIndex = 0;
    substrEnd = startChar + (topChars == 0 ? charsPerInt : topChars);
    for (substrStart = startChar; substrStart < endChar; substrStart = substrEnd, substrEnd = substrStart + charsPerInt) {
      bigRadixDigit = parseInt_3(jl.substring_II_Ljava_lang_String___devirtual$(val, substrStart, substrEnd), radix);
      newDigit = jm.multiplyByInt(digits, digitIndex, bigRadix);
      newDigit += jm.inplaceAdd(digits, digitIndex, bigRadixDigit);
      digits[digitIndex++] = newDigit;
    }
    numberLength = digitIndex;
    bi.sign = sign;
    bi.numberLength = numberLength;
    bi.digits = digits;
    bi.cutOffLeadingZeroes();
  };
  jm.valueOf_27 = function valueOf_27(val) {
    jm.$clinit_BigInteger();
    return gte_0(val, 0) ? jm.fromBits(val) : jm.fromBits(neg_0(val)).negate_0();
  };
  defineClass(24, 19, { 4: 1, 22: 1, 19: 1, 1: 1, 24: 1 }, jm.BigInteger, jm.BigInteger_0, jm.BigInteger_1, jm.BigInteger_2, jm.BigInteger_3);
  _.$init_306 = function $init_306() {
    this.firstNonzeroDigit = -2;
    this.hashCode_0 = 0;
  };
  _.compareTo_1 = function compareTo_39(val) {
    return this.compareTo_20(castTo(val, 24));
  };
  _.abs_0 = function abs_1() {
    return this.sign < 0 ? this.negate_0() : this;
  };
  _.add_11 = function add_21(val) {
    return jm.add_22(this, val);
  };
  _.bitLength_0 = function bitLength_1() {
    return jm.bitLength_2(this);
  };
  _.compareTo_20 = function compareTo_40(val) {
    if (this.sign > val.sign) {
      return 1;
    }
    if (this.sign < val.sign) {
      return -1;
    }
    if (this.numberLength > val.numberLength) {
      return this.sign;
    }
    if (this.numberLength < val.numberLength) {
      return -val.sign;
    }
    return this.sign * jm.compareArrays(this.digits, val.digits, this.numberLength);
  };
  _.cutOffLeadingZeroes = function cutOffLeadingZeroes() {
    while (this.numberLength > 0 && this.digits[--this.numberLength] == 0) {
    }
    if (this.digits[this.numberLength++] == 0) {
      this.sign = 0;
    }
  };
  _.divide = function divide(divisor) {
    var cmp, divisorLen, divisorSign, resDigits, resLength, resSign, result, thisLen, thisSign, val;
    if (divisor.sign == 0) {
      throw toJs(new jl.ArithmeticException("BigInteger divide by zero"));
    }
    divisorSign = divisor.sign;
    if (divisor.isOne()) {
      return divisor.sign > 0 ? this : this.negate_0();
    }
    thisSign = this.sign;
    thisLen = this.numberLength;
    divisorLen = divisor.numberLength;
    if (thisLen + divisorLen == 2) {
      val = div_0(and_0(fromInt_0(this.digits[0]), 4294967295), and_0(fromInt_0(divisor.digits[0]), 4294967295));
      if (thisSign != divisorSign) {
        val = neg_0(val);
      }
      return jm.valueOf_27(val);
    }
    cmp = thisLen != divisorLen ? thisLen > divisorLen ? 1 : -1 : jm.compareArrays(this.digits, divisor.digits, thisLen);
    if (cmp == 0) {
      return thisSign == divisorSign ? jm.ONE_1 : jm.MINUS_ONE;
    }
    if (cmp == -1) {
      return jm.ZERO_1;
    }
    resLength = thisLen - divisorLen + 1;
    resDigits = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, resLength, 15, 1);
    resSign = thisSign == divisorSign ? 1 : -1;
    if (divisorLen == 1) {
      jm.divideArrayByInt(resDigits, this.digits, thisLen, divisor.digits[0]);
    } else {
      jm.divide_0(resDigits, resLength, this.digits, thisLen, divisor.digits, divisorLen);
    }
    result = new jm.BigInteger_1(resSign, resLength, resDigits);
    result.cutOffLeadingZeroes();
    return result;
  };
  _.divideAndRemainder = function divideAndRemainder(divisor) {
    var cmp, divisorDigits, divisorLen, divisorSign, quotientDigits, quotientLength, quotientSign, remainderDigits, remainderLength, result0, result1, thisDigits, thisLen, thisSign;
    divisorSign = divisor.sign;
    if (divisorSign == 0) {
      throw toJs(new jl.ArithmeticException("BigInteger divide by zero"));
    }
    divisorLen = divisor.numberLength;
    divisorDigits = divisor.digits;
    if (divisorLen == 1) {
      return jm.divideAndRemainderByInteger(this, divisorDigits[0], divisorSign);
    }
    thisDigits = this.digits;
    thisLen = this.numberLength;
    cmp = thisLen != divisorLen ? thisLen > divisorLen ? 1 : -1 : jm.compareArrays(thisDigits, divisorDigits, thisLen);
    if (cmp < 0) {
      return stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_math_BigInteger_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 24, 0, [jm.ZERO_1, this]);
    }
    thisSign = this.sign;
    quotientLength = thisLen - divisorLen + 1;
    remainderLength = divisorLen;
    quotientSign = thisSign == divisorSign ? 1 : -1;
    quotientDigits = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, quotientLength, 15, 1);
    remainderDigits = jm.divide_0(quotientDigits, quotientLength, thisDigits, thisLen, divisorDigits, divisorLen);
    result0 = new jm.BigInteger_1(quotientSign, quotientLength, quotientDigits);
    result1 = new jm.BigInteger_1(thisSign, remainderLength, remainderDigits);
    result0.cutOffLeadingZeroes();
    result1.cutOffLeadingZeroes();
    return stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_math_BigInteger_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 24, 0, [result0, result1]);
  };
  _.doubleValue = function doubleValue_6() {
    return parseDouble(this.toString_0());
  };
  _.equals_0 = function equals_32(x_0) {
    var x1;
    if (maskUndefined(this) === maskUndefined(x_0)) {
      return true;
    }
    if (instanceOf(x_0, 24)) {
      x1 = castTo(x_0, 24);
      return this.sign == x1.sign && this.numberLength == x1.numberLength && this.equalsArrays(x1.digits);
    }
    return false;
  };
  _.equalsArrays = function equalsArrays(b) {
    var i;
    for (i = this.numberLength - 1; i >= 0 && this.digits[i] == b[i]; i--) {
    }
    return i < 0;
  };
  _.floatValue = function floatValue_5() {
    return parseFloat_0(this.toString_0());
  };
  _.getFirstNonzeroDigit = function getFirstNonzeroDigit() {
    var i;
    if (this.firstNonzeroDigit == -2) {
      if (this.sign == 0) {
        i = -1;
      } else {
        for (i = 0; this.digits[i] == 0; i++) {
        }
      }
      this.firstNonzeroDigit = i;
    }
    return this.firstNonzeroDigit;
  };
  _.hashCode_1 = function hashCode_23() {
    var i;
    if (this.hashCode_0 != 0) {
      return this.hashCode_0;
    }
    for (i = 0; i < this.digits.length; i++) {
      this.hashCode_0 = this.hashCode_0 * 33 + (this.digits[i] & -1);
    }
    this.hashCode_0 = this.hashCode_0 * this.sign;
    return this.hashCode_0;
  };
  _.intValue = function intValue_6() {
    var i;
    i = this.digits[0];
    return this.sign > 0 ? i : ji2.ensureInt(-i);
  };
  _.isOne = function isOne() {
    return this.numberLength == 1 && this.digits[0] == 1;
  };
  _.longValue = function longValue_6() {
    var value_0;
    value_0 = this.numberLength > 1 ? ji2.fromBits_0(this.digits[0], this.digits[1]) : ji2.fromBits_0(this.digits[0], 0);
    return this.sign > 0 ? value_0 : neg_0(value_0);
  };
  _.multiply = function multiply(val) {
    if (val.sign == 0 || this.sign == 0) {
      return jm.ZERO_1;
    }
    return jm.multiply_0(this, val);
  };
  _.negate_0 = function negate_1() {
    return this.sign == 0 ? this : new jm.BigInteger_1(-this.sign, this.numberLength, this.digits);
  };
  _.pow_0 = function pow_0(exp_0) {
    var x_0;
    if (exp_0 < 0) {
      throw toJs(new jl.ArithmeticException("Negative exponent"));
    }
    if (exp_0 == 0) {
      return jm.ONE_1;
    } else if (exp_0 == 1 || this.equals_0(jm.ONE_1) || this.equals_0(jm.ZERO_1)) {
      return this;
    }
    if (!this.testBit(0)) {
      x_0 = 1;
      while (!this.testBit(x_0)) {
        x_0++;
      }
      return jm.getPowerOfTwo(x_0 * exp_0).multiply(this.shiftRight(x_0).pow_0(exp_0));
    }
    return jm.pow_1(this, exp_0);
  };
  _.shiftLeft = function shiftLeft(n) {
    if (n == 0 || this.sign == 0) {
      return this;
    }
    return n > 0 ? jm.shiftLeft_0(this, n) : jm.shiftRight_0(this, -n);
  };
  _.shiftLeftOneBit = function shiftLeftOneBit() {
    return this.sign == 0 ? this : jm.shiftLeftOneBit_0(this);
  };
  _.shiftRight = function shiftRight(n) {
    if (n == 0 || this.sign == 0) {
      return this;
    }
    return n > 0 ? jm.shiftRight_0(this, n) : jm.shiftLeft_0(this, -n);
  };
  _.signum = function signum_5() {
    return this.sign;
  };
  _.subtract = function subtract(val) {
    return jm.subtract_0(this, val);
  };
  _.testBit = function testBit(n) {
    var digit, firstNonZeroDigit, intCount;
    if (n == 0) {
      return (this.digits[0] & 1) != 0;
    }
    if (n < 0) {
      throw toJs(new jl.ArithmeticException("Negative bit address"));
    }
    intCount = n >> 5;
    if (intCount >= this.numberLength) {
      return this.sign < 0;
    }
    digit = this.digits[intCount];
    n = 1 << (n & 31);
    if (this.sign < 0) {
      firstNonZeroDigit = this.getFirstNonzeroDigit();
      if (intCount < firstNonZeroDigit) {
        return false;
      } else if (firstNonZeroDigit == intCount) {
        digit = -digit;
      } else {
        digit = ~digit;
      }
    }
    return (digit & n) != 0;
  };
  _.toString_0 = function toString_50() {
    return jm.toDecimalScaledString_0(this, 0);
  };
  _.toString_2 = function toString_51(radix) {
    return jm.bigInteger2String(this, radix);
  };
  _.firstNonzeroDigit = 0;
  _.hashCode_0 = 0;
  _.numberLength = 0;
  _.sign = 0;
  jm.EQUALS = 0;
  jm.GREATER = 1;
  jm.LESS = 0;
  jm.serialVersionUID_14 = 0;
  cggl.Ljava_math_BigInteger_2_classLit = createForClass("java.math", "BigInteger", 24, cggl.Ljava_lang_Number_2_classLit);
  jm.$clinit_BitLevel = function $clinit_BitLevel() {
    jm.$clinit_BitLevel = emptyMethod;
    jl.$clinit_Object();
  };
  jm.bitLength_2 = function bitLength_2(val) {
    jm.$clinit_BitLevel();
    var bLength, highDigit, i;
    if (val.sign == 0) {
      return 0;
    }
    bLength = val.numberLength << 5;
    highDigit = val.digits[val.numberLength - 1];
    if (val.sign < 0) {
      i = val.getFirstNonzeroDigit();
      if (i == val.numberLength - 1) {
        highDigit--;
        highDigit = ji2.ensureInt(highDigit);
      }
    }
    bLength -= numberOfLeadingZeros_0(highDigit);
    return bLength;
  };
  jm.shiftLeft_0 = function shiftLeft_0(source, count) {
    jm.$clinit_BitLevel();
    var intCount, resDigits, resLength, result;
    intCount = count >> 5;
    count &= 31;
    resLength = source.numberLength + intCount + (count == 0 ? 0 : 1);
    resDigits = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, resLength, 15, 1);
    jm.shiftLeft_1(resDigits, source.digits, intCount, count);
    result = new jm.BigInteger_1(source.sign, resLength, resDigits);
    result.cutOffLeadingZeroes();
    return result;
  };
  jm.shiftLeft_1 = function shiftLeft_1(result, source, intCount, count) {
    jm.$clinit_BitLevel();
    var i, i0, rightShiftCount;
    if (count == 0) {
      jl.arraycopy(source, 0, result, intCount, result.length - intCount);
    } else {
      rightShiftCount = 32 - count;
      result[result.length - 1] = 0;
      for (i0 = result.length - 1; i0 > intCount; i0--) {
        result[i0] |= source[i0 - intCount - 1] >>> rightShiftCount;
        result[i0 - 1] = source[i0 - intCount - 1] << count;
      }
    }
    for (i = 0; i < intCount; i++) {
      result[i] = 0;
    }
  };
  jm.shiftLeftOneBit_0 = function shiftLeftOneBit_0(source) {
    jm.$clinit_BitLevel();
    var resDigits, resLen, result, srcLen;
    srcLen = source.numberLength;
    resLen = srcLen + 1;
    resDigits = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, resLen, 15, 1);
    jm.shiftLeftOneBit_1(resDigits, source.digits, srcLen);
    result = new jm.BigInteger_1(source.sign, resLen, resDigits);
    result.cutOffLeadingZeroes();
    return result;
  };
  jm.shiftLeftOneBit_1 = function shiftLeftOneBit_1(result, source, srcLen) {
    jm.$clinit_BitLevel();
    var carry, i, val;
    carry = 0;
    for (i = 0; i < srcLen; i++) {
      val = source[i];
      result[i] = val << 1 | carry;
      carry = val >>> 31;
    }
    if (carry != 0) {
      result[srcLen] = carry;
    }
  };
  jm.shiftRight_0 = function shiftRight_0(source, count) {
    jm.$clinit_BitLevel();
    var i, intCount, resDigits, resLength, result;
    intCount = count >> 5;
    count &= 31;
    if (intCount >= source.numberLength) {
      return source.sign < 0 ? (jm.$clinit_BigInteger(), jm.MINUS_ONE) : (jm.$clinit_BigInteger(), jm.ZERO_1);
    }
    resLength = source.numberLength - intCount;
    resDigits = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, resLength + 1, 15, 1);
    jm.shiftRight_1(resDigits, resLength, source.digits, intCount, count);
    if (source.sign < 0) {
      for (i = 0; i < intCount && source.digits[i] == 0; i++) {
      }
      if (i < intCount || count > 0 && source.digits[i] << 32 - count != 0) {
        for (i = 0; i < resLength && resDigits[i] == -1; i++) {
          resDigits[i] = 0;
        }
        if (i == resLength) {
          resLength++;
        }
        resDigits[i]++;
      }
    }
    result = new jm.BigInteger_1(source.sign, resLength, resDigits);
    result.cutOffLeadingZeroes();
    return result;
  };
  jm.shiftRight_1 = function shiftRight_1(result, resultLen, source, intCount, count) {
    jm.$clinit_BitLevel();
    var allZero, i, leftShiftCount;
    allZero = true;
    for (i = 0; i < intCount; i++) {
      allZero = allZero & source[i] == 0;
    }
    if (count == 0) {
      jl.arraycopy(source, intCount, result, 0, resultLen);
      i = resultLen;
    } else {
      leftShiftCount = 32 - count;
      allZero = allZero & source[i] << leftShiftCount == 0;
      for (i = 0; i < resultLen - 1; i++) {
        result[i] = source[i + intCount] >>> count | source[i + intCount + 1] << leftShiftCount;
      }
      result[i] = source[i + intCount] >>> count;
      i++;
    }
    return allZero;
  };
  defineClass(819, 1, { 1: 1 });
  cggl.Ljava_math_BitLevel_2_classLit = createForClass("java.math", "BitLevel", 819, cggl.Ljava_lang_Object_2_classLit);
  jm.$clinit_Conversion = function $clinit_Conversion() {
    jm.$clinit_Conversion = emptyMethod;
    jl.$clinit_Object();
    jm.bigRadices = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [-2147483648, 1162261467, 1073741824, 1220703125, 362797056, 1977326743, 1073741824, 387420489, 1e9, 214358881, 429981696, 815730721, 1475789056, 170859375, 268435456, 410338673, 612220032, 893871739, 128e7, 1801088541, 113379904, 148035889, 191102976, 244140625, 308915776, 387420489, 481890304, 594823321, 729e6, 887503681, 1073741824, 1291467969, 1544804416, 1838265625, 60466176]);
    jm.digitFitInInt = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [-1, -1, 31, 19, 15, 13, 11, 11, 10, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5]);
  };
  jm.bigInteger2String = function bigInteger2String(val, radix) {
    jm.$clinit_Conversion();
    var bigRadix, bitsForRadixDigit, charsPerInt, currentChar, delta, digits, highDigit, i, j, numberLength, previous, resDigit, resLengthInChars, result, sign, temp, tempLen, v;
    sign = val.sign;
    numberLength = val.numberLength;
    digits = val.digits;
    if (sign == 0) {
      return "0";
    }
    if (numberLength == 1) {
      highDigit = digits[numberLength - 1];
      v = and_0(fromInt_0(highDigit), 4294967295);
      if (sign < 0) {
        v = neg_0(v);
      }
      return jl.toString_45(v, radix);
    }
    if (radix == 10 || radix < 2 || radix > 36) {
      return val.toString_0();
    }
    bitsForRadixDigit = $wnd.Math.log(radix) / $wnd.Math.log(2);
    resLengthInChars = round_int(val.abs_0().bitLength_0() / bitsForRadixDigit + (sign < 0 ? 1 : 0)) + 1;
    result = initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, resLengthInChars, 15, 1);
    currentChar = resLengthInChars;
    if (radix != 16) {
      temp = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, numberLength, 15, 1);
      jl.arraycopy(digits, 0, temp, 0, numberLength);
      tempLen = numberLength;
      charsPerInt = jm.digitFitInInt[radix];
      bigRadix = jm.bigRadices[radix - 2];
      while (true) {
        resDigit = jm.divideArrayByInt(temp, temp, tempLen, bigRadix);
        previous = currentChar;
        do {
          result[--currentChar] = jl.forDigit_0(resDigit % radix, radix);
        } while ((resDigit = narrow_int(resDigit / radix)) != 0 && currentChar != 0);
        delta = charsPerInt - previous + currentChar;
        for (i = 0; i < delta && currentChar > 0; i++) {
          result[--currentChar] = 48;
        }
        for (i = tempLen - 1; i > 0 && temp[i] == 0; i--) {
        }
        tempLen = i + 1;
        if (tempLen == 1 && temp[0] == 0) {
          break;
        }
      }
    } else {
      for (i = 0; i < numberLength; i++) {
        for (j = 0; j < 8 && currentChar > 0; j++) {
          resDigit = digits[i] >> (j << 2) & 15;
          result[--currentChar] = jl.forDigit_0(resDigit, 16);
        }
      }
    }
    while (result[currentChar] == 48) {
      currentChar++;
    }
    if (sign == -1) {
      result[--currentChar] = 45;
    }
    return jl.$create_14(result, currentChar, resLengthInChars - currentChar);
  };
  jm.divideLongByBillion = function divideLongByBillion(a) {
    var aPos, bLong, bPos, quot, rem;
    if (gte_0(a, 0)) {
      bLong = 1e9;
      quot = div_0(a, bLong);
      rem = mod_0(a, bLong);
    } else {
      aPos = shru_0(a, 1);
      bPos = shru_0(1e9, 1);
      quot = div_0(aPos, bPos);
      rem = mod_0(aPos, bPos);
      rem = add_20(shl_0(rem, 1), and_0(a, 1));
    }
    return or_0(shl_0(rem, 32), and_0(quot, 4294967295));
  };
  jm.toDecimalScaledString = function toDecimalScaledString(value_0, scale) {
    jm.$clinit_Conversion();
    var currentChar, endPoint, exponent, insertPoint, j, j0, negNumber, prev, resLengthInChars, result, result1, result10, startPoint, v;
    negNumber = lt(value_0, 0);
    if (negNumber) {
      value_0 = neg_0(value_0);
    }
    if (eq(value_0, 0)) {
      switch (scale) {
        case 0:
          return "0";
        case 1:
          return "0.0";
        case 2:
          return "0.00";
        case 3:
          return "0.000";
        case 4:
          return "0.0000";
        case 5:
          return "0.00000";
        case 6:
          return "0.000000";
        default:
          result10 = new jl.StringBuilder();
          if (scale < 0) {
            result10.append_9("0E+");
          } else {
            result10.append_9("0E");
          }
          result10.append_9(scale == -2147483648 ? "2147483648" : jl.toString_41(-scale));
          return result10.toString_0();
      }
    }
    resLengthInChars = 18;
    result = initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, resLengthInChars + 1, 15, 1);
    currentChar = resLengthInChars;
    v = value_0;
    do {
      prev = v;
      v = div_0(v, 10);
      result[--currentChar] = narrow_char(toInt_0(add_20(48, sub_2(prev, mul_0(v, 10)))));
    } while (neq(v, 0));
    exponent = sub_2(sub_2(sub_2(fromInt_0(resLengthInChars), fromInt_0(currentChar)), fromInt_0(scale)), 1);
    if (scale == 0) {
      if (negNumber) {
        result[--currentChar] = 45;
      }
      return jl.$create_14(result, currentChar, resLengthInChars - currentChar);
    }
    if (scale > 0 && gte_0(exponent, fromInt_0(-6))) {
      if (gte_0(exponent, 0)) {
        insertPoint = currentChar + toInt_0(exponent);
        for (j0 = resLengthInChars - 1; j0 >= insertPoint; j0--) {
          result[j0 + 1] = result[j0];
        }
        result[++insertPoint] = 46;
        if (negNumber) {
          result[--currentChar] = 45;
        }
        return jl.$create_14(result, currentChar, resLengthInChars - currentChar + 1);
      }
      for (j = 2; lt(fromInt_0(j), add_20(neg_0(exponent), 1)); j++) {
        result[--currentChar] = 48;
      }
      result[--currentChar] = 46;
      result[--currentChar] = 48;
      if (negNumber) {
        result[--currentChar] = 45;
      }
      return jl.$create_14(result, currentChar, resLengthInChars - currentChar);
    }
    startPoint = currentChar + 1;
    endPoint = resLengthInChars;
    result1 = new jl.StringBuilder_0(16 + endPoint - startPoint);
    if (negNumber) {
      result1.append_4(45);
    }
    if (endPoint - startPoint >= 1) {
      result1.append_4(result[currentChar]);
      result1.append_4(46);
      result1.append_10(result, currentChar + 1, resLengthInChars - currentChar - 1);
    } else {
      result1.append_10(result, currentChar, resLengthInChars - currentChar);
    }
    result1.append_4(69);
    if (gt(exponent, 0)) {
      result1.append_4(43);
    }
    result1.append_9(jl.toString_44(exponent));
    return result1.toString_0();
  };
  jm.toDecimalScaledString_0 = function toDecimalScaledString_0(val, scale) {
    jm.$clinit_Conversion();
    var currentChar, delta, digits, endPoint, exponent, highDigit, i, i1, insertPoint, j, j0, negNumber, numberLength, prev, previous, res, resDigit, resLengthInChars, result, result1, result10, result11, sign, startPoint, temp, temp1, tempLen, v;
    sign = val.sign;
    numberLength = val.numberLength;
    digits = val.digits;
    if (sign == 0) {
      switch (scale) {
        case 0:
          return "0";
        case 1:
          return "0.0";
        case 2:
          return "0.00";
        case 3:
          return "0.000";
        case 4:
          return "0.0000";
        case 5:
          return "0.00000";
        case 6:
          return "0.000000";
        default:
          result10 = new jl.StringBuilder();
          if (scale < 0) {
            result10.append_9("0E+");
          } else {
            result10.append_9("0E");
          }
          result10.append_5(-scale);
          return result10.toString_0();
      }
    }
    resLengthInChars = numberLength * 10 + 1 + 7;
    result = initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, resLengthInChars + 1, 15, 1);
    currentChar = resLengthInChars;
    if (numberLength == 1) {
      highDigit = digits[0];
      if (highDigit < 0) {
        v = and_0(fromInt_0(highDigit), 4294967295);
        do {
          prev = v;
          v = div_0(v, 10);
          result[--currentChar] = narrow_char(48 + toInt_0(sub_2(prev, mul_0(v, 10))));
        } while (neq(v, 0));
      } else {
        v = highDigit;
        do {
          prev = v;
          v = narrow_int(v / 10);
          result[--currentChar] = narrow_char(48 + (prev - v * 10));
        } while (v != 0);
      }
    } else {
      temp = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, numberLength, 15, 1);
      tempLen = numberLength;
      jl.arraycopy(digits, 0, temp, 0, tempLen);
      BIG_LOOP: while (true) {
        result11 = 0;
        for (i1 = tempLen - 1; i1 >= 0; i1--) {
          temp1 = add_20(shl_0(result11, 32), and_0(fromInt_0(temp[i1]), 4294967295));
          res = jm.divideLongByBillion(temp1);
          temp[i1] = toInt_0(res);
          result11 = fromInt_0(toInt_0(shr_0(res, 32)));
        }
        resDigit = toInt_0(result11);
        previous = currentChar;
        do {
          result[--currentChar] = narrow_char(48 + resDigit % 10);
        } while ((resDigit = narrow_int(resDigit / 10)) != 0 && currentChar != 0);
        delta = 9 - previous + currentChar;
        for (i = 0; i < delta && currentChar > 0; i++) {
          result[--currentChar] = 48;
        }
        j = tempLen - 1;
        for (; temp[j] == 0; j--) {
          if (j == 0) {
            break BIG_LOOP;
          }
        }
        tempLen = j + 1;
      }
      while (result[currentChar] == 48) {
        currentChar++;
      }
    }
    negNumber = sign < 0;
    exponent = resLengthInChars - currentChar - scale - 1;
    if (scale == 0) {
      if (negNumber) {
        result[--currentChar] = 45;
      }
      return jl.$create_14(result, currentChar, resLengthInChars - currentChar);
    }
    if (scale > 0 && exponent >= -6) {
      if (exponent >= 0) {
        insertPoint = currentChar + exponent;
        for (j0 = resLengthInChars - 1; j0 >= insertPoint; j0--) {
          result[j0 + 1] = result[j0];
        }
        result[++insertPoint] = 46;
        if (negNumber) {
          result[--currentChar] = 45;
        }
        return jl.$create_14(result, currentChar, resLengthInChars - currentChar + 1);
      }
      for (j = 2; j < -exponent + 1; j++) {
        result[--currentChar] = 48;
      }
      result[--currentChar] = 46;
      result[--currentChar] = 48;
      if (negNumber) {
        result[--currentChar] = 45;
      }
      return jl.$create_14(result, currentChar, resLengthInChars - currentChar);
    }
    startPoint = currentChar + 1;
    endPoint = resLengthInChars;
    result1 = new jl.StringBuilder_0(16 + endPoint - startPoint);
    if (negNumber) {
      result1.append_4(45);
    }
    if (endPoint - startPoint >= 1) {
      result1.append_4(result[currentChar]);
      result1.append_4(46);
      result1.append_10(result, currentChar + 1, resLengthInChars - currentChar - 1);
    } else {
      result1.append_10(result, currentChar, resLengthInChars - currentChar);
    }
    result1.append_4(69);
    if (exponent > 0) {
      result1.append_4(43);
    }
    result1.append_9(jl.toString_41(exponent));
    return result1.toString_0();
  };
  defineClass(818, 1, { 1: 1 });
  cggl.Ljava_math_Conversion_2_classLit = createForClass("java.math", "Conversion", 818, cggl.Ljava_lang_Object_2_classLit);
  jm.$clinit_Division = function $clinit_Division() {
    jm.$clinit_Division = emptyMethod;
    jl.$clinit_Object();
  };
  jm.divide_0 = function divide_0(quot, quotLength, a, aLength, b, bLength) {
    jm.$clinit_Division();
    var borrow, carry, divisorShift, firstDivisorDigit, guessDigit, i, j, k, leftHand, longR, normA, normB, normBLength, product, rOverflowed, rem, res, rightHand;
    normA = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, aLength + 1, 15, 1);
    normB = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, bLength + 1, 15, 1);
    normBLength = bLength;
    divisorShift = numberOfLeadingZeros_0(b[bLength - 1]);
    if (divisorShift != 0) {
      jm.shiftLeft_1(normB, b, 0, divisorShift);
      jm.shiftLeft_1(normA, a, 0, divisorShift);
    } else {
      jl.arraycopy(a, 0, normA, 0, aLength);
      jl.arraycopy(b, 0, normB, 0, bLength);
    }
    firstDivisorDigit = normB[normBLength - 1];
    i = quotLength - 1;
    j = aLength;
    while (i >= 0) {
      guessDigit = 0;
      if (normA[j] == firstDivisorDigit) {
        guessDigit = -1;
      } else {
        product = add_20(shl_0(and_0(fromInt_0(normA[j]), 4294967295), 32), and_0(fromInt_0(normA[j - 1]), 4294967295));
        res = jm.divideLongByInt(product, firstDivisorDigit);
        guessDigit = toInt_0(res);
        rem = toInt_0(shr_0(res, 32));
        if (guessDigit != 0) {
          leftHand = 0;
          rightHand = 0;
          rOverflowed = false;
          guessDigit++;
          do {
            guessDigit--;
            if (rOverflowed) {
              break;
            }
            leftHand = mul_0(and_0(fromInt_0(guessDigit), 4294967295), and_0(fromInt_0(normB[normBLength - 2]), 4294967295));
            rightHand = add_20(shl_0(fromInt_0(rem), 32), and_0(fromInt_0(normA[j - 2]), 4294967295));
            longR = add_20(and_0(fromInt_0(rem), 4294967295), and_0(fromInt_0(firstDivisorDigit), 4294967295));
            if (numberOfLeadingZeros_0(toInt_0(shru_0(longR, 32))) < 32) {
              rOverflowed = true;
            } else {
              rem = toInt_0(longR);
            }
          } while (gt(xor_0(leftHand, { l: 0, m: 0, h: 524288 }), xor_0(rightHand, { l: 0, m: 0, h: 524288 })));
        }
      }
      if (guessDigit != 0) {
        borrow = jm.multiplyAndSubtract(normA, j - normBLength, normB, normBLength, guessDigit);
        if (borrow != 0) {
          guessDigit--;
          carry = 0;
          for (k = 0; k < normBLength; k++) {
            carry = add_20(carry, add_20(and_0(fromInt_0(normA[j - normBLength + k]), 4294967295), and_0(fromInt_0(normB[k]), 4294967295)));
            normA[j - normBLength + k] = toInt_0(carry);
            carry = shru_0(carry, 32);
          }
        }
      }
      if (jsNotEquals(quot, null)) {
        quot[i] = guessDigit;
      }
      j--;
      i--;
    }
    if (divisorShift != 0) {
      jm.shiftRight_1(normB, normBLength, normA, 0, divisorShift);
      return normB;
    }
    jl.arraycopy(normA, 0, normB, 0, bLength);
    return normA;
  };
  jm.divideAndRemainderByInteger = function divideAndRemainderByInteger(val, divisor, divisorSign) {
    jm.$clinit_Division();
    var a, b, quo, quotientDigits, quotientLength, quotientSign, rem, remainderDigits, result0, result1, valDigits, valLen, valSign;
    valDigits = val.digits;
    valLen = val.numberLength;
    valSign = val.sign;
    if (valLen == 1) {
      a = and_0(fromInt_0(valDigits[0]), 4294967295);
      b = and_0(fromInt_0(divisor), 4294967295);
      quo = div_0(a, b);
      rem = mod_0(a, b);
      if (valSign != divisorSign) {
        quo = neg_0(quo);
      }
      if (valSign < 0) {
        rem = neg_0(rem);
      }
      return stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_math_BigInteger_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 24, 0, [jm.valueOf_27(quo), jm.valueOf_27(rem)]);
    }
    quotientLength = valLen;
    quotientSign = valSign == divisorSign ? 1 : -1;
    quotientDigits = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, quotientLength, 15, 1);
    remainderDigits = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [jm.divideArrayByInt(quotientDigits, valDigits, valLen, divisor)]);
    result0 = new jm.BigInteger_1(quotientSign, quotientLength, quotientDigits);
    result1 = new jm.BigInteger_1(valSign, 1, remainderDigits);
    result0.cutOffLeadingZeroes();
    result1.cutOffLeadingZeroes();
    return stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_math_BigInteger_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 24, 0, [result0, result1]);
  };
  jm.divideArrayByInt = function divideArrayByInt(dest, src_0, srcLength, divisor) {
    jm.$clinit_Division();
    var aPos, bLong, bPos, i, quot, rem, temp;
    rem = 0;
    bLong = and_0(fromInt_0(divisor), 4294967295);
    for (i = srcLength - 1; i >= 0; i--) {
      temp = or_0(shl_0(rem, 32), and_0(fromInt_0(src_0[i]), 4294967295));
      if (gte_0(temp, 0)) {
        quot = div_0(temp, bLong);
        rem = mod_0(temp, bLong);
      } else {
        aPos = shru_0(temp, 1);
        bPos = fromInt_0(divisor >>> 1);
        quot = div_0(aPos, bPos);
        rem = mod_0(aPos, bPos);
        rem = add_20(shl_0(rem, 1), and_0(temp, 1));
        if ((divisor & 1) != 0) {
          if (lte(quot, rem)) {
            rem = sub_2(rem, quot);
          } else {
            if (lte(sub_2(quot, rem), bLong)) {
              rem = add_20(rem, sub_2(bLong, quot));
              quot = sub_2(quot, 1);
            } else {
              rem = add_20(rem, sub_2(shl_0(bLong, 1), quot));
              quot = sub_2(quot, 2);
            }
          }
        }
      }
      dest[i] = toInt_0(and_0(quot, 4294967295));
    }
    return toInt_0(rem);
  };
  jm.divideLongByInt = function divideLongByInt(a, b) {
    var aPos, bLong, bPos, quot, rem;
    bLong = and_0(fromInt_0(b), 4294967295);
    if (gte_0(a, 0)) {
      quot = div_0(a, bLong);
      rem = mod_0(a, bLong);
    } else {
      aPos = shru_0(a, 1);
      bPos = fromInt_0(b >>> 1);
      quot = div_0(aPos, bPos);
      rem = mod_0(aPos, bPos);
      rem = add_20(shl_0(rem, 1), and_0(a, 1));
      if ((b & 1) != 0) {
        if (lte(quot, rem)) {
          rem = sub_2(rem, quot);
        } else {
          if (lte(sub_2(quot, rem), bLong)) {
            rem = add_20(rem, sub_2(bLong, quot));
            quot = sub_2(quot, 1);
          } else {
            rem = add_20(rem, sub_2(shl_0(bLong, 1), quot));
            quot = sub_2(quot, 2);
          }
        }
      }
    }
    return or_0(shl_0(rem, 32), and_0(quot, 4294967295));
  };
  jm.multiplyAndSubtract = function multiplyAndSubtract(a, start_0, b, bLen, c) {
    var carry0, carry1, i;
    carry0 = 0;
    carry1 = 0;
    for (i = 0; i < bLen; i++) {
      carry0 = jm.unsignedMultAddAdd(b[i], c, toInt_0(carry0), 0);
      carry1 = add_20(sub_2(and_0(fromInt_0(a[start_0 + i]), 4294967295), and_0(carry0, 4294967295)), carry1);
      a[start_0 + i] = toInt_0(carry1);
      carry1 = shr_0(carry1, 32);
      carry0 = shru_0(carry0, 32);
    }
    carry1 = add_20(sub_2(and_0(fromInt_0(a[start_0 + bLen]), 4294967295), carry0), carry1);
    a[start_0 + bLen] = toInt_0(carry1);
    return toInt_0(shr_0(carry1, 32));
  };
  defineClass(820, 1, { 1: 1 });
  cggl.Ljava_math_Division_2_classLit = createForClass("java.math", "Division", 820, cggl.Ljava_lang_Object_2_classLit);
  jm.$clinit_Elementary = function $clinit_Elementary() {
    jm.$clinit_Elementary = emptyMethod;
    jl.$clinit_Object();
  };
  jm.add_22 = function add_22(op1, op2) {
    jm.$clinit_Elementary();
    var a, b, cmp, op1Len, op1Sign, op2Len, op2Sign, res, res0, resDigits, resSign, valueHi, valueLo;
    op1Sign = op1.sign;
    op2Sign = op2.sign;
    if (op1Sign == 0) {
      return op2;
    }
    if (op2Sign == 0) {
      return op1;
    }
    op1Len = op1.numberLength;
    op2Len = op2.numberLength;
    if (op1Len + op2Len == 2) {
      a = and_0(fromInt_0(op1.digits[0]), 4294967295);
      b = and_0(fromInt_0(op2.digits[0]), 4294967295);
      if (op1Sign == op2Sign) {
        res0 = add_20(a, b);
        valueLo = toInt_0(res0);
        valueHi = toInt_0(shru_0(res0, 32));
        return valueHi == 0 ? new jm.BigInteger(op1Sign, valueLo) : new jm.BigInteger_1(op1Sign, 2, stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [valueLo, valueHi]));
      }
      return jm.valueOf_27(op1Sign < 0 ? sub_2(b, a) : sub_2(a, b));
    } else if (op1Sign == op2Sign) {
      resSign = op1Sign;
      resDigits = op1Len >= op2Len ? jm.add_23(op1.digits, op1Len, op2.digits, op2Len) : jm.add_23(op2.digits, op2Len, op1.digits, op1Len);
    } else {
      cmp = op1Len != op2Len ? op1Len > op2Len ? 1 : -1 : jm.compareArrays(op1.digits, op2.digits, op1Len);
      if (cmp == 0) {
        return jm.$clinit_BigInteger(), jm.ZERO_1;
      }
      if (cmp == 1) {
        resSign = op1Sign;
        resDigits = jm.subtract_1(op1.digits, op1Len, op2.digits, op2Len);
      } else {
        resSign = op2Sign;
        resDigits = jm.subtract_1(op2.digits, op2Len, op1.digits, op1Len);
      }
    }
    res = new jm.BigInteger_1(resSign, resDigits.length, resDigits);
    res.cutOffLeadingZeroes();
    return res;
  };
  jm.add_23 = function add_23(a, aSize, b, bSize) {
    var res;
    res = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, aSize + 1, 15, 1);
    jm.add_24(res, a, aSize, b, bSize);
    return res;
  };
  jm.add_24 = function add_24(res, a, aSize, b, bSize) {
    var carry, i;
    carry = add_20(and_0(fromInt_0(a[0]), 4294967295), and_0(fromInt_0(b[0]), 4294967295));
    res[0] = toInt_0(carry);
    carry = shr_0(carry, 32);
    if (aSize >= bSize) {
      for (i = 1; i < bSize; i++) {
        carry = add_20(carry, add_20(and_0(fromInt_0(a[i]), 4294967295), and_0(fromInt_0(b[i]), 4294967295)));
        res[i] = toInt_0(carry);
        carry = shr_0(carry, 32);
      }
      for (; i < aSize; i++) {
        carry = add_20(carry, and_0(fromInt_0(a[i]), 4294967295));
        res[i] = toInt_0(carry);
        carry = shr_0(carry, 32);
      }
    } else {
      for (i = 1; i < aSize; i++) {
        carry = add_20(carry, add_20(and_0(fromInt_0(a[i]), 4294967295), and_0(fromInt_0(b[i]), 4294967295)));
        res[i] = toInt_0(carry);
        carry = shr_0(carry, 32);
      }
      for (; i < bSize; i++) {
        carry = add_20(carry, and_0(fromInt_0(b[i]), 4294967295));
        res[i] = toInt_0(carry);
        carry = shr_0(carry, 32);
      }
    }
    if (neq(carry, 0)) {
      res[i] = toInt_0(carry);
    }
  };
  jm.compareArrays = function compareArrays(a, b, size_0) {
    jm.$clinit_Elementary();
    var i;
    for (i = size_0 - 1; i >= 0 && a[i] == b[i]; i--) {
    }
    return i < 0 ? 0 : lt(and_0(fromInt_0(a[i]), 4294967295), and_0(fromInt_0(b[i]), 4294967295)) ? -1 : 1;
  };
  jm.inplaceAdd = function inplaceAdd(a, aSize, addend) {
    jm.$clinit_Elementary();
    var carry, i;
    carry = and_0(fromInt_0(addend), 4294967295);
    for (i = 0; neq(carry, 0) && i < aSize; i++) {
      carry = add_20(carry, and_0(fromInt_0(a[i]), 4294967295));
      a[i] = toInt_0(carry);
      carry = shr_0(carry, 32);
    }
    return toInt_0(carry);
  };
  jm.subtract_0 = function subtract_0(op1, op2) {
    jm.$clinit_Elementary();
    var a, b, cmp, op1Len, op1Sign, op2Len, op2Sign, res, resDigits, resSign;
    op1Sign = op1.sign;
    op2Sign = op2.sign;
    if (op2Sign == 0) {
      return op1;
    }
    if (op1Sign == 0) {
      return op2.negate_0();
    }
    op1Len = op1.numberLength;
    op2Len = op2.numberLength;
    if (op1Len + op2Len == 2) {
      a = and_0(fromInt_0(op1.digits[0]), 4294967295);
      b = and_0(fromInt_0(op2.digits[0]), 4294967295);
      if (op1Sign < 0) {
        a = neg_0(a);
      }
      if (op2Sign < 0) {
        b = neg_0(b);
      }
      return jm.valueOf_27(sub_2(a, b));
    }
    cmp = op1Len != op2Len ? op1Len > op2Len ? 1 : -1 : jm.compareArrays(op1.digits, op2.digits, op1Len);
    if (cmp == -1) {
      resSign = -op2Sign;
      resDigits = op1Sign == op2Sign ? jm.subtract_1(op2.digits, op2Len, op1.digits, op1Len) : jm.add_23(op2.digits, op2Len, op1.digits, op1Len);
    } else {
      resSign = op1Sign;
      if (op1Sign == op2Sign) {
        if (cmp == 0) {
          return jm.$clinit_BigInteger(), jm.ZERO_1;
        }
        resDigits = jm.subtract_1(op1.digits, op1Len, op2.digits, op2Len);
      } else {
        resDigits = jm.add_23(op1.digits, op1Len, op2.digits, op2Len);
      }
    }
    res = new jm.BigInteger_1(resSign, resDigits.length, resDigits);
    res.cutOffLeadingZeroes();
    return res;
  };
  jm.subtract_1 = function subtract_1(a, aSize, b, bSize) {
    var res;
    res = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, aSize, 15, 1);
    jm.subtract_2(res, a, aSize, b, bSize);
    return res;
  };
  jm.subtract_2 = function subtract_2(res, a, aSize, b, bSize) {
    var borrow, i;
    borrow = 0;
    for (i = 0; i < bSize; i++) {
      borrow = add_20(borrow, sub_2(and_0(fromInt_0(a[i]), 4294967295), and_0(fromInt_0(b[i]), 4294967295)));
      res[i] = toInt_0(borrow);
      borrow = shr_0(borrow, 32);
    }
    for (; i < aSize; i++) {
      borrow = add_20(borrow, and_0(fromInt_0(a[i]), 4294967295));
      res[i] = toInt_0(borrow);
      borrow = shr_0(borrow, 32);
    }
  };
  defineClass(821, 1, { 1: 1 });
  cggl.Ljava_math_Elementary_2_classLit = createForClass("java.math", "Elementary", 821, cggl.Ljava_lang_Object_2_classLit);
  jm.$clinit_MathContext = function $clinit_MathContext() {
    jm.$clinit_MathContext = emptyMethod;
    jl.$clinit_Object();
    jm.DECIMAL128 = new jm.MathContext_0(34, (jm.$clinit_RoundingMode(), jm.HALF_EVEN));
    jm.DECIMAL32 = new jm.MathContext_0(7, (jm.$clinit_RoundingMode(), jm.HALF_EVEN));
    jm.DECIMAL64 = new jm.MathContext_0(16, (jm.$clinit_RoundingMode(), jm.HALF_EVEN));
    jm.UNLIMITED = new jm.MathContext_0(0, (jm.$clinit_RoundingMode(), jm.HALF_UP));
  };
  jm.MathContext = function MathContext(precision) {
    jm.$clinit_MathContext();
    jm.MathContext_0.call(this, precision, (jm.$clinit_RoundingMode(), jm.HALF_UP));
  };
  jm.MathContext_0 = function MathContext_0(precision, roundingMode) {
    Object_0.call(this);
    this.$init_307();
    ji2.checkCriticalArgument_1(precision >= 0, "Digits < 0");
    ji2.checkNotNull_1(roundingMode, "null RoundingMode");
    this.precision = precision;
    this.roundingMode = roundingMode;
  };
  defineClass(94, 1, { 4: 1, 1: 1, 94: 1 }, jm.MathContext, jm.MathContext_0);
  _.$init_307 = function $init_307() {
  };
  _.equals_0 = function equals_33(x_0) {
    return instanceOf(x_0, 94) && castTo(x_0, 94).getPrecision() == this.precision && jsEquals(castTo(x_0, 94).getRoundingMode(), this.roundingMode);
  };
  _.getPrecision = function getPrecision() {
    return this.precision;
  };
  _.getRoundingMode = function getRoundingMode() {
    return this.roundingMode;
  };
  _.hashCode_1 = function hashCode_24() {
    return this.precision << 3 | this.roundingMode.ordinal();
  };
  _.toString_0 = function toString_52() {
    return "precision=" + this.precision + " roundingMode=" + this.roundingMode;
  };
  _.precision = 0;
  jm.serialVersionUID_15 = { l: 3539455, m: 1515645, h: 317170 };
  cggl.Ljava_math_MathContext_2_classLit = createForClass("java.math", "MathContext", 94, cggl.Ljava_lang_Object_2_classLit);
  jm.$clinit_Multiplication = function $clinit_Multiplication() {
    jm.$clinit_Multiplication = emptyMethod;
    var fivePow, i;
    jl.$clinit_Object();
    jm.bigFivePows = initUnidimensionalArray(cggl.Ljava_math_BigInteger_2_classLit, { 4: 1, 1: 1, 7: 1 }, 24, 32, 0, 1);
    jm.bigTenPows = initUnidimensionalArray(cggl.Ljava_math_BigInteger_2_classLit, { 4: 1, 1: 1, 7: 1 }, 24, 32, 0, 1);
    jm.fivePows = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 5, 25, 125, 625, 3125, 15625, 78125, 390625, 1953125, 9765625, 48828125, 244140625, 1220703125]);
    jm.tenPows = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 10, 100, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9]);
    {
      fivePow = 1;
      for (i = 0; i <= 18; i++) {
        setCheck(jm.bigFivePows, i, jm.valueOf_27(fivePow));
        setCheck(jm.bigTenPows, i, jm.valueOf_27(shl_0(fivePow, i)));
        fivePow = mul_0(fivePow, 5);
      }
      for (; i < jm.bigTenPows.length; i++) {
        setCheck(jm.bigFivePows, i, jm.bigFivePows[i - 1].multiply(jm.bigFivePows[1]));
        setCheck(jm.bigTenPows, i, jm.bigTenPows[i - 1].multiply((jm.$clinit_BigInteger(), jm.TEN_0)));
      }
    }
  };
  jm.karatsuba = function karatsuba(op1, op2) {
    var lower, lowerOp1, lowerOp2, middle, ndiv2, temp, upper, upperOp1, upperOp2;
    if (op2.numberLength > op1.numberLength) {
      temp = op1;
      op1 = op2;
      op2 = temp;
    }
    if (op2.numberLength < 63) {
      return jm.multiplyPAP(op1, op2);
    }
    ndiv2 = (op1.numberLength & -2) << 4;
    upperOp1 = op1.shiftRight(ndiv2);
    upperOp2 = op2.shiftRight(ndiv2);
    lowerOp1 = op1.subtract(upperOp1.shiftLeft(ndiv2));
    lowerOp2 = op2.subtract(upperOp2.shiftLeft(ndiv2));
    upper = jm.karatsuba(upperOp1, upperOp2);
    lower = jm.karatsuba(lowerOp1, lowerOp2);
    middle = jm.karatsuba(upperOp1.subtract(lowerOp1), lowerOp2.subtract(upperOp2));
    middle = middle.add_11(upper).add_11(lower);
    middle = middle.shiftLeft(ndiv2);
    upper = upper.shiftLeft(ndiv2 << 1);
    return upper.add_11(middle).add_11(lower);
  };
  jm.multArraysPAP = function multArraysPAP(aDigits, aLen, bDigits, bLen, resDigits) {
    if (aLen == 0 || bLen == 0) {
      return;
    }
    if (aLen == 1) {
      resDigits[bLen] = jm.multiplyByInt_0(resDigits, bDigits, bLen, aDigits[0]);
    } else if (bLen == 1) {
      resDigits[aLen] = jm.multiplyByInt_0(resDigits, aDigits, aLen, bDigits[0]);
    } else {
      jm.multPAP(aDigits, bDigits, resDigits, aLen, bLen);
    }
  };
  jm.multPAP = function multPAP(a, b, t, aLen, bLen) {
    var aI, carry, i, j;
    if (maskUndefined(a) === maskUndefined(b) && aLen == bLen) {
      jm.square(a, aLen, t);
      return;
    }
    for (i = 0; i < aLen; i++) {
      carry = 0;
      aI = a[i];
      for (j = 0; j < bLen; j++) {
        carry = jm.unsignedMultAddAdd(aI, b[j], t[i + j], toInt_0(carry));
        t[i + j] = toInt_0(carry);
        carry = shru_0(carry, 32);
      }
      t[i + bLen] = toInt_0(carry);
    }
  };
  jm.multiply_0 = function multiply_0(x_0, y_0) {
    jm.$clinit_Multiplication();
    return jm.karatsuba(x_0, y_0);
  };
  jm.multiplyByInt = function multiplyByInt(a, aSize, factor) {
    jm.$clinit_Multiplication();
    return jm.multiplyByInt_0(a, a, aSize, factor);
  };
  jm.multiplyByInt_0 = function multiplyByInt_0(res, a, aSize, factor) {
    var carry, i;
    carry = 0;
    for (i = 0; i < aSize; i++) {
      carry = jm.unsignedMultAddAdd(a[i], factor, toInt_0(carry), 0);
      res[i] = toInt_0(carry);
      carry = shru_0(carry, 32);
    }
    return toInt_0(carry);
  };
  jm.multiplyByPositiveInt = function multiplyByPositiveInt(val, factor) {
    var aDigits, aNumberLength, res, resDigits, resHi, resLength, resLo, resSign, result;
    resSign = val.sign;
    if (resSign == 0) {
      return jm.$clinit_BigInteger(), jm.ZERO_1;
    }
    aNumberLength = val.numberLength;
    aDigits = val.digits;
    if (aNumberLength == 1) {
      res = jm.unsignedMultAddAdd(aDigits[0], factor, 0, 0);
      resLo = toInt_0(res);
      resHi = toInt_0(shru_0(res, 32));
      return resHi == 0 ? new jm.BigInteger(resSign, resLo) : new jm.BigInteger_1(resSign, 2, stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [resLo, resHi]));
    }
    resLength = aNumberLength + 1;
    resDigits = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, resLength, 15, 1);
    resDigits[aNumberLength] = jm.multiplyByInt_0(resDigits, aDigits, aNumberLength, factor);
    result = new jm.BigInteger_1(resSign, resLength, resDigits);
    result.cutOffLeadingZeroes();
    return result;
  };
  jm.multiplyByTenPow = function multiplyByTenPow(val, exp_0) {
    jm.$clinit_Multiplication();
    return exp_0 < jm.tenPows.length ? jm.multiplyByPositiveInt(val, jm.tenPows[exp_0]) : val.multiply(jm.powerOf10(exp_0));
  };
  jm.multiplyPAP = function multiplyPAP(a, b) {
    var aDigits, aLen, bDigits, bLen, resDigits, resLength, resSign, result, val, valueHi, valueLo;
    aLen = a.numberLength;
    bLen = b.numberLength;
    resLength = aLen + bLen;
    resSign = a.sign != b.sign ? -1 : 1;
    if (resLength == 2) {
      val = jm.unsignedMultAddAdd(a.digits[0], b.digits[0], 0, 0);
      valueLo = toInt_0(val);
      valueHi = toInt_0(shru_0(val, 32));
      return valueHi == 0 ? new jm.BigInteger(resSign, valueLo) : new jm.BigInteger_1(resSign, 2, stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [valueLo, valueHi]));
    }
    aDigits = a.digits;
    bDigits = b.digits;
    resDigits = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, resLength, 15, 1);
    jm.multArraysPAP(aDigits, aLen, bDigits, bLen, resDigits);
    result = new jm.BigInteger_1(resSign, resLength, resDigits);
    result.cutOffLeadingZeroes();
    return result;
  };
  jm.pow_1 = function pow_1(base, exponent) {
    jm.$clinit_Multiplication();
    var acc, res;
    res = (jm.$clinit_BigInteger(), jm.ONE_1);
    acc = base;
    for (; exponent > 1; exponent >>= 1) {
      if ((exponent & 1) != 0) {
        res = res.multiply(acc);
      }
      if (acc.numberLength == 1) {
        acc = acc.multiply(acc);
      } else {
        acc = new jm.BigInteger_2(1, jm.square(acc.digits, acc.numberLength, initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, acc.numberLength << 1, 15, 1)));
      }
    }
    res = res.multiply(acc);
    return res;
  };
  jm.powerOf10 = function powerOf10(exp_0) {
    jm.$clinit_Multiplication();
    var intExp, longExp, powerOfFive, res;
    intExp = round_int(exp_0);
    if (exp_0 < jm.bigTenPows.length) {
      return jm.bigTenPows[intExp];
    } else if (exp_0 <= 50) {
      return (jm.$clinit_BigInteger(), jm.TEN_0).pow_0(intExp);
    } else if (exp_0 <= 1e3) {
      return jm.bigFivePows[1].pow_0(intExp).shiftLeft(intExp);
    }
    if (exp_0 > 1e6) {
      throw toJs(new jl.ArithmeticException("power of ten too big"));
    }
    if (exp_0 <= 2147483647) {
      return jm.bigFivePows[1].pow_0(intExp).shiftLeft(intExp);
    }
    powerOfFive = jm.bigFivePows[1].pow_0(2147483647);
    res = powerOfFive;
    longExp = fromDouble_0(exp_0 - 2147483647);
    intExp = round_int(exp_0 % 2147483647);
    while (gt(longExp, 2147483647)) {
      res = res.multiply(powerOfFive);
      longExp = sub_2(longExp, 2147483647);
    }
    res = res.multiply(jm.bigFivePows[1].pow_0(intExp));
    res = res.shiftLeft(2147483647);
    longExp = fromDouble_0(exp_0 - 2147483647);
    while (gt(longExp, 2147483647)) {
      res = res.shiftLeft(2147483647);
      longExp = sub_2(longExp, 2147483647);
    }
    res = res.shiftLeft(intExp);
    return res;
  };
  jm.square = function square(a, aLen, res) {
    var carry, i, i0, index_0, j;
    for (i0 = 0; i0 < aLen; i0++) {
      carry = 0;
      for (j = i0 + 1; j < aLen; j++) {
        carry = jm.unsignedMultAddAdd(a[i0], a[j], res[i0 + j], toInt_0(carry));
        res[i0 + j] = toInt_0(carry);
        carry = shru_0(carry, 32);
      }
      res[i0 + aLen] = toInt_0(carry);
    }
    jm.shiftLeftOneBit_1(res, res, aLen << 1);
    carry = 0;
    for (i = 0, index_0 = 0; i < aLen; i++, index_0++) {
      carry = jm.unsignedMultAddAdd(a[i], a[i], res[index_0], toInt_0(carry));
      res[index_0] = toInt_0(carry);
      carry = shru_0(carry, 32);
      index_0++;
      carry = add_20(carry, and_0(fromInt_0(res[index_0]), 4294967295));
      res[index_0] = toInt_0(carry);
      carry = shru_0(carry, 32);
    }
    return res;
  };
  jm.unsignedMultAddAdd = function unsignedMultAddAdd(a, b, c, d) {
    jm.$clinit_Multiplication();
    return add_20(add_20(mul_0(and_0(fromInt_0(a), 4294967295), and_0(fromInt_0(b), 4294967295)), and_0(fromInt_0(c), 4294967295)), and_0(fromInt_0(d), 4294967295));
  };
  defineClass(812, 1, { 1: 1 });
  jm.whenUseKaratsuba = 63;
  cggl.Ljava_math_Multiplication_2_classLit = createForClass("java.math", "Multiplication", 812, cggl.Ljava_lang_Object_2_classLit);
  jm.$clinit_RoundingMode = function $clinit_RoundingMode() {
    jm.$clinit_RoundingMode = emptyMethod;
    jl.$clinit_Enum();
    jm.UP = new jm.RoundingMode("UP", 0);
    jm.DOWN = new jm.RoundingMode("DOWN", 1);
    jm.CEILING = new jm.RoundingMode("CEILING", 2);
    jm.FLOOR = new jm.RoundingMode("FLOOR", 3);
    jm.HALF_UP = new jm.RoundingMode("HALF_UP", 4);
    jm.HALF_DOWN = new jm.RoundingMode("HALF_DOWN", 5);
    jm.HALF_EVEN = new jm.RoundingMode("HALF_EVEN", 6);
    jm.UNNECESSARY = new jm.RoundingMode("UNNECESSARY", 7);
  };
  jm.RoundingMode = function RoundingMode(enum$name, enum$ordinal) {
    Enum.call(this, enum$name, enum$ordinal);
    this.$init_308();
  };
  jm.valueOf_28 = function valueOf_28(name_0) {
    jm.$clinit_RoundingMode();
    return valueOf((jm.$clinit_RoundingMode$Map(), jm.$MAP_4), name_0);
  };
  jm.values_5 = function values_5() {
    jm.$clinit_RoundingMode();
    return stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_math_RoundingMode_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 93, 0, [jm.UP, jm.DOWN, jm.CEILING, jm.FLOOR, jm.HALF_UP, jm.HALF_DOWN, jm.HALF_EVEN, jm.UNNECESSARY]);
  };
  defineClass(93, 48, { 4: 1, 22: 1, 48: 1, 1: 1, 93: 1 }, jm.RoundingMode);
  _.$init_308 = function $init_308() {
  };
  cggl.Ljava_math_RoundingMode_2_classLit = createForEnum("java.math", "RoundingMode", 93, cggl.Ljava_lang_Enum_2_classLit, jm.values_5, jm.valueOf_28);
  jm.$clinit_RoundingMode$Map = function $clinit_RoundingMode$Map() {
    jm.$clinit_RoundingMode$Map = emptyMethod;
    jm.$MAP_4 = createValueOfMap(jm.values_5());
  };
  defineClass(803, 1, { 1: 1 });
  cggl.Ljava_math_RoundingMode$Map_2_classLit = createForClass("java.math", "RoundingMode/Map", 803, cggl.Ljava_lang_Object_2_classLit);
  jnc.$clinit_Charset = function $clinit_Charset() {
    jnc.$clinit_Charset = emptyMethod;
    jl.$clinit_Object();
  };
  jnc.Charset = function Charset(name_0, aliasesIgnored) {
    jnc.$clinit_Charset();
    Object_0.call(this);
    this.$init_309();
    this.name_0 = name_0;
  };
  jnc.forName = function forName(charsetName) {
    jnc.$clinit_Charset();
    ji2.checkArgument_0(jsNotEquals(charsetName, null), "Null charset name");
    charsetName = jl.toUpperCase__Ljava_lang_String___devirtual$(charsetName);
    if (jl.equals_Ljava_lang_Object__Z__devirtual$_2((ji2.$clinit_EmulatedCharset(), ji2.ISO_8859_1_0).name_1(), charsetName)) {
      return ji2.$clinit_EmulatedCharset(), ji2.ISO_8859_1_0;
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2((ji2.$clinit_EmulatedCharset(), ji2.ISO_LATIN_1).name_1(), charsetName)) {
      return ji2.$clinit_EmulatedCharset(), ji2.ISO_LATIN_1;
    } else if (jl.equals_Ljava_lang_Object__Z__devirtual$_2((ji2.$clinit_EmulatedCharset(), ji2.UTF_8_0).name_1(), charsetName)) {
      return ji2.$clinit_EmulatedCharset(), ji2.UTF_8_0;
    }
    throw toJs(new jnc.UnsupportedCharsetException(charsetName));
  };
  defineClass(104, 1, { 22: 1, 1: 1, 104: 1 });
  _.$init_309 = function $init_309() {
  };
  _.compareTo_1 = function compareTo_41(that) {
    return this.compareTo_21(castTo(that, 104));
  };
  _.compareTo_21 = function compareTo_42(that) {
    return jl.compareToIgnoreCase_Ljava_lang_String__I__devirtual$(this.name_0, that.name_0);
  };
  _.equals_0 = function equals_34(o) {
    var that;
    if (maskUndefined(o) === maskUndefined(this)) {
      return true;
    }
    if (!instanceOf(o, 104)) {
      return false;
    }
    that = castTo(o, 104);
    return jl.equals_Ljava_lang_Object__Z__devirtual$_2(this.name_0, that.name_0);
  };
  _.hashCode_1 = function hashCode_25() {
    return jl.hashCode__I__devirtual$_2(this.name_0);
  };
  _.name_1 = function name_2() {
    return this.name_0;
  };
  _.toString_0 = function toString_53() {
    return this.name_0;
  };
  cggl.Ljava_nio_charset_Charset_2_classLit = createForClass("java.nio.charset", "Charset", 104, cggl.Ljava_lang_Object_2_classLit);
  jnc.$clinit_Charset$AvailableCharsets = function $clinit_Charset$AvailableCharsets() {
    jnc.$clinit_Charset$AvailableCharsets = emptyMethod;
  };
  defineClass(555, 1, { 1: 1 });
  cggl.Ljava_nio_charset_Charset$AvailableCharsets_2_classLit = createForClass("java.nio.charset", "Charset/AvailableCharsets", 555, cggl.Ljava_lang_Object_2_classLit);
  jnc.$clinit_StandardCharsets = function $clinit_StandardCharsets() {
    jnc.$clinit_StandardCharsets = emptyMethod;
    jl.$clinit_Object();
    jnc.ISO_8859_1 = (ji2.$clinit_EmulatedCharset(), ji2.ISO_8859_1_0);
    jnc.UTF_8 = (ji2.$clinit_EmulatedCharset(), ji2.UTF_8_0);
  };
  defineClass(739, 1, { 1: 1 });
  cggl.Ljava_nio_charset_StandardCharsets_2_classLit = createForClass("java.nio.charset", "StandardCharsets", 739, cggl.Ljava_lang_Object_2_classLit);
  jnc.$clinit_UnsupportedCharsetException = function $clinit_UnsupportedCharsetException() {
    jnc.$clinit_UnsupportedCharsetException = emptyMethod;
    jl.$clinit_IllegalArgumentException();
  };
  jnc.UnsupportedCharsetException = function UnsupportedCharsetException(charsetName) {
    jnc.$clinit_UnsupportedCharsetException();
    jl.IllegalArgumentException_0.call(this, valueOf_20(charsetName));
    this.$init_310();
    this.charsetName = charsetName;
  };
  defineClass(195, 72, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1, 195: 1 }, jnc.UnsupportedCharsetException);
  _.$init_310 = function $init_310() {
  };
  cggl.Ljava_nio_charset_UnsupportedCharsetException_2_classLit = createForClass("java.nio.charset", "UnsupportedCharsetException", 195, cggl.Ljava_lang_IllegalArgumentException_2_classLit);
  jt.$clinit_NumberFormat = function $clinit_NumberFormat() {
    jt.$clinit_NumberFormat = emptyMethod;
    jl.$clinit_Object();
  };
  jt.NumberFormat = function NumberFormat() {
    jt.$clinit_NumberFormat();
    Object_0.call(this);
    this.$init_311();
  };
  defineClass(467, 1, { 1: 1 });
  _.$init_311 = function $init_311() {
  };
  cggl.Ljava_text_NumberFormat_2_classLit = createForClass("java.text", "NumberFormat", 467, cggl.Ljava_lang_Object_2_classLit);
  jt.$clinit_DecimalFormat = function $clinit_DecimalFormat() {
    jt.$clinit_DecimalFormat = emptyMethod;
    jt.$clinit_NumberFormat();
  };
  jt.DecimalFormat = function DecimalFormat(pattern) {
    jt.$clinit_DecimalFormat();
    jt.NumberFormat.call(this);
    this.$init_312();
    this.numDigits = this.parsePattern(pattern);
  };
  jt.DecimalFormat_0 = function DecimalFormat_0(pattern, symbols) {
    jt.$clinit_DecimalFormat();
    jt.DecimalFormat.call(this, pattern);
  };
  defineClass(145, 467, { 1: 1 }, jt.DecimalFormat, jt.DecimalFormat_0);
  _.$init_312 = function $init_312() {
  };
  _.format = function format_0(number) {
    return this.formatNative(number, this.numDigits);
  };
  _.format_0 = function format_1(number) {
    return this.formatNative(number, this.numDigits);
  };
  _.formatNative = function formatNative(number, numDigits) {
    return number.toFixed(numDigits);
  };
  _.parsePattern = function parsePattern(pattern) {
    var result = /^#?0\.(0+)$/.exec(pattern);
    if (!result) {
      throw new Error("unimplemented DecimalFormat with pattern " + pattern);
    }
    return result[1].length;
  };
  _.numDigits = 0;
  cggl.Ljava_text_DecimalFormat_2_classLit = createForClass("java.text", "DecimalFormat", 145, cggl.Ljava_text_NumberFormat_2_classLit);
  jt.$clinit_DecimalFormatSymbols = function $clinit_DecimalFormatSymbols() {
    jt.$clinit_DecimalFormatSymbols = emptyMethod;
    jl.$clinit_Object();
  };
  jt.DecimalFormatSymbols = function DecimalFormatSymbols(locale) {
    jt.$clinit_DecimalFormatSymbols();
    Object_0.call(this);
    this.$init_313();
  };
  defineClass(269, 1, { 1: 1 }, jt.DecimalFormatSymbols);
  _.$init_313 = function $init_313() {
  };
  cggl.Ljava_text_DecimalFormatSymbols_2_classLit = createForClass("java.text", "DecimalFormatSymbols", 269, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Map = function $clinit_Map() {
    ju.$clinit_Map = emptyMethod;
  };
  ju.$compute = function $compute(this$static, key, remappingFunction) {
    var value_0;
    ji2.checkNotNull_0(remappingFunction);
    value_0 = remappingFunction.apply_2(key, this$static.get(key));
    if (jsNotEquals(value_0, null)) {
      this$static.put(key, value_0);
    } else {
      this$static.remove(key);
    }
    return value_0;
  };
  ju.$computeIfAbsent = function $computeIfAbsent(this$static, key, remappingFunction) {
    var value_0;
    ji2.checkNotNull_0(remappingFunction);
    value_0 = this$static.get(key);
    if (jsEquals(value_0, null)) {
      value_0 = remappingFunction.apply_1(key);
      if (jsNotEquals(value_0, null)) {
        this$static.put(key, value_0);
      }
    }
    return value_0;
  };
  ju.$computeIfPresent = function $computeIfPresent(this$static, key, remappingFunction) {
    var value_0;
    ji2.checkNotNull_0(remappingFunction);
    value_0 = this$static.get(key);
    if (jsNotEquals(value_0, null)) {
      value_0 = remappingFunction.apply_2(key, value_0);
      if (jsNotEquals(value_0, null)) {
        this$static.put(key, value_0);
      } else {
        this$static.remove(key);
      }
    }
    return value_0;
  };
  ju.$forEach_0 = function $forEach_0(this$static, consumer) {
    var entry, entry$iterator;
    ji2.checkNotNull_0(consumer);
    for (entry$iterator = this$static.entrySet_0().iterator(); entry$iterator.hasNext_0(); ) {
      entry = castTo(entry$iterator.next_3(), 27);
      consumer.accept_1(entry.getKey_0(), entry.getValue_0());
    }
  };
  ju.$getOrDefault = function $getOrDefault(this$static, key, defaultValue) {
    var currentValue;
    currentValue = this$static.get(key);
    return jsEquals(currentValue, null) && !this$static.containsKey(key) ? defaultValue : currentValue;
  };
  ju.$merge = function $merge(this$static, key, value_0, remappingFunction) {
    var currentValue, newValue;
    ji2.checkNotNull_0(remappingFunction);
    ji2.checkNotNull_0(value_0);
    currentValue = this$static.get(key);
    newValue = jsEquals(currentValue, null) ? value_0 : remappingFunction.apply_2(currentValue, value_0);
    if (jsEquals(newValue, null)) {
      this$static.remove(key);
    } else {
      this$static.put(key, newValue);
    }
    return newValue;
  };
  ju.$putIfAbsent = function $putIfAbsent(this$static, key, value_0) {
    var currentValue;
    currentValue = this$static.get(key);
    return jsNotEquals(currentValue, null) ? currentValue : this$static.put(key, value_0);
  };
  ju.$remove_0 = function $remove_0(this$static, key, value_0) {
    var currentValue;
    currentValue = this$static.get(key);
    if (!ju.equals_48(currentValue, value_0) || jsEquals(currentValue, null) && !this$static.containsKey(key)) {
      return false;
    }
    this$static.remove(key);
    return true;
  };
  ju.$replace_1 = function $replace_1(this$static, key, value_0) {
    return this$static.containsKey(key) ? this$static.put(key, value_0) : null;
  };
  ju.$replace_2 = function $replace_2(this$static, key, oldValue, newValue) {
    var currentValue;
    currentValue = this$static.get(key);
    if (!ju.equals_48(currentValue, oldValue) || jsEquals(currentValue, null) && !this$static.containsKey(key)) {
      return false;
    }
    this$static.put(key, newValue);
    return true;
  };
  ju.$replaceAll_1 = function $replaceAll_1(this$static, function_0) {
    var entry, entry$iterator;
    ji2.checkNotNull_0(function_0);
    for (entry$iterator = this$static.entrySet_0().iterator(); entry$iterator.hasNext_0(); ) {
      entry = castTo(entry$iterator.next_3(), 27);
      entry.setValue(function_0.apply_2(entry.getKey_0(), entry.getValue_0()));
    }
  };
  ju.copyOf_13 = function copyOf_13(map_0) {
    ju.$clinit_Map();
    return castTo(map_0.entrySet_0().stream().collect_0(jus.toUnmodifiableMap(new ju.Map$0methodref$getKey$Type(), new ju.Map$1methodref$getValue$Type())), 55);
  };
  ju.entry_1 = function entry_1(key, value_0) {
    return new ju.AbstractMap$SimpleImmutableEntry(ji2.checkNotNull_0(key), ji2.checkNotNull_0(value_0));
  };
  ju.of_12 = function of_12() {
    return ju.unmodifiableMap(ju.emptyMap());
  };
  ju.of_13 = function of_13(key, value_0) {
    return ju.ofEntries(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_Map$Entry_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 27, 0, [ju.entry_1(key, value_0)]));
  };
  ju.of_14 = function of_14(k1, v1, k2, v2) {
    return ju.ofEntries(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_Map$Entry_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 27, 0, [ju.entry_1(k1, v1), ju.entry_1(k2, v2)]));
  };
  ju.of_15 = function of_15(k1, v1, k2, v2, k3, v3) {
    return ju.ofEntries(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_Map$Entry_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 27, 0, [ju.entry_1(k1, v1), ju.entry_1(k2, v2), ju.entry_1(k3, v3)]));
  };
  ju.of_16 = function of_16(k1, v1, k2, v2, k3, v3, k4, v4) {
    return ju.ofEntries(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_Map$Entry_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 27, 0, [ju.entry_1(k1, v1), ju.entry_1(k2, v2), ju.entry_1(k3, v3), ju.entry_1(k4, v4)]));
  };
  ju.of_17 = function of_17(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5) {
    return ju.ofEntries(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_Map$Entry_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 27, 0, [ju.entry_1(k1, v1), ju.entry_1(k2, v2), ju.entry_1(k3, v3), ju.entry_1(k4, v4), ju.entry_1(k5, v5)]));
  };
  ju.of_18 = function of_18(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6) {
    return ju.ofEntries(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_Map$Entry_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 27, 0, [ju.entry_1(k1, v1), ju.entry_1(k2, v2), ju.entry_1(k3, v3), ju.entry_1(k4, v4), ju.entry_1(k5, v5), ju.entry_1(k6, v6)]));
  };
  ju.of_19 = function of_19(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7) {
    return ju.ofEntries(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_Map$Entry_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 27, 0, [ju.entry_1(k1, v1), ju.entry_1(k2, v2), ju.entry_1(k3, v3), ju.entry_1(k4, v4), ju.entry_1(k5, v5), ju.entry_1(k6, v6), ju.entry_1(k7, v7)]));
  };
  ju.of_20 = function of_20(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8) {
    return ju.ofEntries(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_Map$Entry_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 27, 0, [ju.entry_1(k1, v1), ju.entry_1(k2, v2), ju.entry_1(k3, v3), ju.entry_1(k4, v4), ju.entry_1(k5, v5), ju.entry_1(k6, v6), ju.entry_1(k7, v7), ju.entry_1(k8, v8)]));
  };
  ju.of_21 = function of_21(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9) {
    return ju.ofEntries(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_Map$Entry_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 27, 0, [ju.entry_1(k1, v1), ju.entry_1(k2, v2), ju.entry_1(k3, v3), ju.entry_1(k4, v4), ju.entry_1(k5, v5), ju.entry_1(k6, v6), ju.entry_1(k7, v7), ju.entry_1(k8, v8), ju.entry_1(k9, v9)]));
  };
  ju.of_22 = function of_22(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10) {
    return ju.ofEntries(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_Map$Entry_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 27, 0, [ju.entry_1(k1, v1), ju.entry_1(k2, v2), ju.entry_1(k3, v3), ju.entry_1(k4, v4), ju.entry_1(k5, v5), ju.entry_1(k6, v6), ju.entry_1(k7, v7), ju.entry_1(k8, v8), ju.entry_1(k9, v9), ju.entry_1(k10, v10)]));
  };
  ju.ofEntries = function ofEntries(entries) {
    var entry, i, map_0;
    map_0 = new ju.HashMap();
    for (i = 0; i < entries.length; i++) {
      entry = castTo(ji2.checkNotNull_0(entries[i]), 27);
      ji2.checkArgument_0(jsEquals(map_0.put(ji2.checkNotNull_0(entry.getKey_0()), ji2.checkNotNull_0(entry.getValue_0())), null), "Can't add multiple entries with the same key");
    }
    return ju.unmodifiableMap(map_0);
  };
  cggl.Ljava_util_Map_2_classLit = createForInterface("java.util", "Map");
  ju.$clinit_AbstractMap = function $clinit_AbstractMap() {
    ju.$clinit_AbstractMap = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Map();
  };
  ju.AbstractMap = function AbstractMap() {
    ju.$clinit_AbstractMap();
    Object_0.call(this);
    this.$init_314();
  };
  ju.getEntryKeyOrNull = function getEntryKeyOrNull(entry) {
    ju.$clinit_AbstractMap();
    return isNull(entry) ? null : entry.getKey_0();
  };
  ju.getEntryValueOrNull = function getEntryValueOrNull(entry) {
    ju.$clinit_AbstractMap();
    return isNull(entry) ? null : entry.getValue_0();
  };
  defineClass(139, 1, { 1: 1, 55: 1 });
  _.$init_314 = function $init_314() {
  };
  _.compute = function compute(key, remappingFunction) {
    return ju.$compute(this, key, remappingFunction);
  };
  _.computeIfAbsent = function computeIfAbsent(key, remappingFunction) {
    return ju.$computeIfAbsent(this, key, remappingFunction);
  };
  _.computeIfPresent = function computeIfPresent(key, remappingFunction) {
    return ju.$computeIfPresent(this, key, remappingFunction);
  };
  _.forEach_0 = function forEach_1(consumer) {
    ju.$forEach_0(this, consumer);
  };
  _.getOrDefault = function getOrDefault(key, defaultValue) {
    return ju.$getOrDefault(this, key, defaultValue);
  };
  _.merge = function merge(key, value_0, remappingFunction) {
    return ju.$merge(this, key, value_0, remappingFunction);
  };
  _.putIfAbsent = function putIfAbsent(key, value_0) {
    return ju.$putIfAbsent(this, key, value_0);
  };
  _.remove_3 = function remove_8(key, value_0) {
    return ju.$remove_0(this, key, value_0);
  };
  _.replace = function replace_0(key, value_0) {
    return ju.$replace_1(this, key, value_0);
  };
  _.replace_0 = function replace_1(key, oldValue, newValue) {
    return ju.$replace_2(this, key, oldValue, newValue);
  };
  _.replaceAll_0 = function replaceAll_1(function_0) {
    ju.$replaceAll_1(this, function_0);
  };
  _.clear = function clear_11() {
    this.entrySet_0().clear();
  };
  _.containsEntry = function containsEntry(entry) {
    var key, ourValue, value_0;
    key = entry.getKey_0();
    value_0 = entry.getValue_0();
    ourValue = this.get(key);
    if (!ju.equals_48(value_0, ourValue)) {
      return false;
    }
    if (jsEquals(ourValue, null) && !this.containsKey(key)) {
      return false;
    }
    return true;
  };
  _.containsKey = function containsKey(key) {
    return isNotNull(this.implFindEntry(key, false));
  };
  _.containsValue = function containsValue(value_0) {
    var entry, entry$iterator, v;
    for (entry$iterator = this.entrySet_0().iterator(); entry$iterator.hasNext_0(); ) {
      entry = castTo(entry$iterator.next_3(), 27);
      v = entry.getValue_0();
      if (ju.equals_48(value_0, v)) {
        return true;
      }
    }
    return false;
  };
  _.equals_0 = function equals_35(obj) {
    var entry, entry$iterator, otherMap;
    if (maskUndefined(obj) === maskUndefined(this)) {
      return true;
    }
    if (!instanceOf(obj, 55)) {
      return false;
    }
    otherMap = castTo(obj, 55);
    if (this.size() != otherMap.size()) {
      return false;
    }
    for (entry$iterator = otherMap.entrySet_0().iterator(); entry$iterator.hasNext_0(); ) {
      entry = castTo(entry$iterator.next_3(), 27);
      if (!this.containsEntry(entry)) {
        return false;
      }
    }
    return true;
  };
  _.get = function get_23(key) {
    return ju.getEntryValueOrNull(this.implFindEntry(key, false));
  };
  _.hashCode_1 = function hashCode_26() {
    return ju.hashCode_32(this.entrySet_0());
  };
  _.implFindEntry = function implFindEntry(key, remove) {
    var entry, iter, k;
    for (iter = this.entrySet_0().iterator(); iter.hasNext_0(); ) {
      entry = castTo(iter.next_3(), 27);
      k = entry.getKey_0();
      if (ju.equals_48(key, k)) {
        if (remove) {
          entry = new ju.AbstractMap$SimpleEntry(entry.getKey_0(), entry.getValue_0());
          iter.remove_2();
        }
        return entry;
      }
    }
    return null;
  };
  _.isEmpty = function isEmpty_5() {
    return this.size() == 0;
  };
  _.keySet = function keySet() {
    return new ju.AbstractMap$1(this);
  };
  _.put = function put(key, value_0) {
    throw toJs(new jl.UnsupportedOperationException_0("Put not supported on this map"));
  };
  _.putAll = function putAll(map_0) {
    var e, e$iterator;
    ji2.checkNotNull_0(map_0);
    for (e$iterator = map_0.entrySet_0().iterator(); e$iterator.hasNext_0(); ) {
      e = castTo(e$iterator.next_3(), 27);
      this.put(e.getKey_0(), e.getValue_0());
    }
  };
  _.remove = function remove_7(key) {
    return ju.getEntryValueOrNull(this.implFindEntry(key, true));
  };
  _.size = function size_7() {
    return this.entrySet_0().size();
  };
  _.toString_0 = function toString_54() {
    var entry, entry$iterator, joiner;
    joiner = new ju.StringJoiner_0(", ", "{", "}");
    for (entry$iterator = this.entrySet_0().iterator(); entry$iterator.hasNext_0(); ) {
      entry = castTo(entry$iterator.next_3(), 27);
      joiner.add_12(this.toString_4(entry));
    }
    return joiner.toString_0();
  };
  _.toString_3 = function toString_55(o) {
    return maskUndefined(o) === maskUndefined(this) ? "(this Map)" : valueOf_20(o);
  };
  _.toString_4 = function toString_56(entry) {
    return this.toString_3(entry.getKey_0()) + "=" + this.toString_3(entry.getValue_0());
  };
  _.values = function values_6() {
    return new ju.AbstractMap$2(this);
  };
  cggl.Ljava_util_AbstractMap_2_classLit = createForClass("java.util", "AbstractMap", 139, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_AbstractHashMap = function $clinit_AbstractHashMap() {
    ju.$clinit_AbstractHashMap = emptyMethod;
    ju.$clinit_AbstractMap();
  };
  ju.AbstractHashMap = function AbstractHashMap() {
    ju.$clinit_AbstractHashMap();
    ju.AbstractMap.call(this);
    this.$init_315();
    this.reset_2();
  };
  ju.AbstractHashMap_0 = function AbstractHashMap_0(ignored) {
    ju.$clinit_AbstractHashMap();
    ju.AbstractHashMap_1.call(this, ignored, 0);
  };
  ju.AbstractHashMap_1 = function AbstractHashMap_1(ignored, alsoIgnored) {
    ju.AbstractMap.call(this);
    this.$init_315();
    ji2.checkArgument_0(ignored >= 0, "Negative initial capacity");
    ji2.checkArgument_0(alsoIgnored >= 0, "Non-positive load factor");
    this.reset_2();
  };
  defineClass(206, 139, { 1: 1, 55: 1 });
  _.$init_315 = function $init_315() {
  };
  _.clear = function clear_12() {
    this.reset_2();
  };
  _.containsKey = function containsKey_0(key) {
    return instanceOfString(key) ? this.hasStringValue(ji2.uncheckedCast(key)) : this.hasHashValue(key);
  };
  _.containsValue = function containsValue_0(value_0) {
    return this.containsValue_0(value_0, this.stringMap) || this.containsValue_0(value_0, this.hashCodeMap);
  };
  _.containsValue_0 = function containsValue_1(value_0, entries) {
    var entry, entry$iterator;
    for (entry$iterator = entries.iterator(); entry$iterator.hasNext_0(); ) {
      entry = castTo(entry$iterator.next_3(), 27);
      if (this.equals_4(value_0, entry.getValue_0())) {
        return true;
      }
    }
    return false;
  };
  _.entrySet_0 = function entrySet() {
    return new ju.AbstractHashMap$EntrySet(this);
  };
  _.get = function get_24(key) {
    return instanceOfString(key) ? this.getStringValue(ji2.uncheckedCast(key)) : this.getHashValue(key);
  };
  _.getHashValue = function getHashValue(key) {
    return ju.getEntryValueOrNull(this.hashCodeMap.getEntry_0(key));
  };
  _.getStringValue = function getStringValue(key) {
    return jsEquals(key, null) ? this.getHashValue(null) : this.stringMap.get_5(key);
  };
  _.hasHashValue = function hasHashValue(key) {
    return isNotNull(this.hashCodeMap.getEntry_0(key));
  };
  _.hasStringValue = function hasStringValue(key) {
    return jsEquals(key, null) ? this.hasHashValue(null) : this.stringMap.contains_1(key);
  };
  _.put = function put_0(key, value_0) {
    return instanceOfString(key) ? this.putStringValue(ji2.uncheckedCast(key), value_0) : this.putHashValue(key, value_0);
  };
  _.putHashValue = function putHashValue(key, value_0) {
    return this.hashCodeMap.put_0(key, value_0);
  };
  _.putStringValue = function putStringValue(key, value_0) {
    return jsEquals(key, null) ? this.putHashValue(null, value_0) : this.stringMap.put_1(key, value_0);
  };
  _.remove = function remove_9(key) {
    return instanceOfString(key) ? this.removeStringValue(ji2.uncheckedCast(key)) : this.removeHashValue(key);
  };
  _.removeHashValue = function removeHashValue(key) {
    return this.hashCodeMap.remove_5(key);
  };
  _.removeStringValue = function removeStringValue(key) {
    return jsEquals(key, null) ? this.removeHashValue(null) : this.stringMap.remove_6(key);
  };
  _.reset_2 = function reset_3() {
    this.hashCodeMap = new ju.InternalHashCodeMap(this);
    this.stringMap = new ju.InternalStringMap(this);
    this.structureChanged();
  };
  _.size = function size_8() {
    return this.hashCodeMap.size_1() + this.stringMap.size_1();
  };
  _.structureChanged = function structureChanged() {
    if (!ji2.isApiChecked()) {
      return;
    }
    this.modCount++;
  };
  _.modCount = 0;
  cggl.Ljava_util_AbstractHashMap_2_classLit = createForClass("java.util", "AbstractHashMap", 206, cggl.Ljava_util_AbstractMap_2_classLit);
  ju.$clinit_Set = function $clinit_Set() {
    ju.$clinit_Set = emptyMethod;
  };
  ju.$spliterator_2 = function $spliterator_2(this$static) {
    return ju.spliterator_11(this$static, 1);
  };
  ju.copyOf_14 = function copyOf_14(coll) {
    ju.$clinit_Set();
    return castTo(coll.stream().collect_0(jus.toUnmodifiableSet()), 56);
  };
  ju.of_23 = function of_23() {
    return ju.unmodifiableSet(ju.emptySet());
  };
  ju.of_24 = function of_24(e1) {
    return ju.of_34(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1])));
  };
  ju.of_25 = function of_25(e1, e2) {
    return ju.of_34(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2])));
  };
  ju.of_26 = function of_26(e1, e2, e3) {
    return ju.of_34(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3])));
  };
  ju.of_27 = function of_27(e1, e2, e3, e4) {
    return ju.of_34(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3, e4])));
  };
  ju.of_28 = function of_28(e1, e2, e3, e4, e5) {
    return ju.of_34(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3, e4, e5])));
  };
  ju.of_29 = function of_29(e1, e2, e3, e4, e5, e6) {
    return ju.of_34(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3, e4, e5, e6])));
  };
  ju.of_30 = function of_30(e1, e2, e3, e4, e5, e6, e7) {
    return ju.of_34(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3, e4, e5, e6, e7])));
  };
  ju.of_31 = function of_31(e1, e2, e3, e4, e5, e6, e7, e8) {
    return ju.of_34(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3, e4, e5, e6, e7, e8])));
  };
  ju.of_32 = function of_32(e1, e2, e3, e4, e5, e6, e7, e8, e9) {
    return ju.of_34(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3, e4, e5, e6, e7, e8, e9])));
  };
  ju.of_33 = function of_33(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10) {
    return ju.of_34(castToArray(stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_Object_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 1, 5, [e1, e2, e3, e4, e5, e6, e7, e8, e9, e10])));
  };
  ju.of_34 = function of_34(elements) {
    var i, set_0;
    set_0 = new ju.HashSet();
    for (i = 0; i < elements.length; i++) {
      ji2.checkArgument_0(set_0.add(ji2.checkNotNull_0(elements[i])), "Can't add the same item multiple times");
    }
    return ju.unmodifiableSet(set_0);
  };
  cggl.Ljava_util_Set_2_classLit = createForInterface("java.util", "Set");
  ju.$clinit_AbstractSet = function $clinit_AbstractSet() {
    ju.$clinit_AbstractSet = emptyMethod;
    ju.$clinit_AbstractCollection();
    jl.$clinit_Iterable();
    ju.$clinit_Collection();
    ju.$clinit_Set();
  };
  ju.AbstractSet = function AbstractSet() {
    ju.$clinit_AbstractSet();
    ju.AbstractCollection.call(this);
    this.$init_316();
  };
  defineClass(99, 137, { 1: 1, 29: 1, 56: 1 });
  _.$init_316 = function $init_316() {
  };
  _.spliterator_0 = function spliterator_2() {
    return ju.$spliterator_2(this);
  };
  _.equals_0 = function equals_36(o) {
    var other;
    if (maskUndefined(o) === maskUndefined(this)) {
      return true;
    }
    if (!instanceOf(o, 56)) {
      return false;
    }
    other = castTo(o, 56);
    if (other.size() != this.size()) {
      return false;
    }
    return this.containsAll(other);
  };
  _.hashCode_1 = function hashCode_27() {
    return ju.hashCode_32(this);
  };
  _.removeAll = function removeAll_1(c) {
    var iter, o, o$iterator, size_0;
    ji2.checkNotNull_0(c);
    size_0 = this.size();
    if (size_0 < c.size()) {
      for (iter = this.iterator(); iter.hasNext_0(); ) {
        o = iter.next_3();
        if (c.contains(o)) {
          iter.remove_2();
        }
      }
    } else {
      for (o$iterator = c.iterator(); o$iterator.hasNext_0(); ) {
        o = o$iterator.next_3();
        this.remove(o);
      }
    }
    return size_0 != this.size();
  };
  cggl.Ljava_util_AbstractSet_2_classLit = createForClass("java.util", "AbstractSet", 99, cggl.Ljava_util_AbstractCollection_2_classLit);
  ju.$clinit_AbstractHashMap$EntrySet = function $clinit_AbstractHashMap$EntrySet() {
    ju.$clinit_AbstractHashMap$EntrySet = emptyMethod;
    ju.$clinit_AbstractSet();
  };
  ju.AbstractHashMap$EntrySet = function AbstractHashMap$EntrySet(this$0) {
    ju.$clinit_AbstractHashMap$EntrySet();
    this.this$01 = this$0;
    ju.AbstractSet.call(this);
    this.$init_317();
  };
  defineClass(376, 99, { 1: 1, 29: 1, 56: 1 }, ju.AbstractHashMap$EntrySet);
  _.$init_317 = function $init_317() {
  };
  _.clear = function clear_13() {
    this.this$01.clear();
  };
  _.contains = function contains_10(o) {
    if (instanceOf(o, 27)) {
      return this.this$01.containsEntry(castTo(o, 27));
    }
    return false;
  };
  _.iterator = function iterator_1() {
    return new ju.AbstractHashMap$EntrySetIterator(this.this$01);
  };
  _.remove = function remove_10(entry) {
    var key;
    if (this.contains(entry)) {
      key = castTo(entry, 27).getKey_0();
      this.this$01.remove(key);
      return true;
    }
    return false;
  };
  _.size = function size_9() {
    return this.this$01.size();
  };
  cggl.Ljava_util_AbstractHashMap$EntrySet_2_classLit = createForClass("java.util", "AbstractHashMap/EntrySet", 376, cggl.Ljava_util_AbstractSet_2_classLit);
  ju.$clinit_AbstractHashMap$EntrySetIterator = function $clinit_AbstractHashMap$EntrySetIterator() {
    ju.$clinit_AbstractHashMap$EntrySetIterator = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
  };
  ju.AbstractHashMap$EntrySetIterator = function AbstractHashMap$EntrySetIterator(this$0) {
    ju.$clinit_AbstractHashMap$EntrySetIterator();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_318();
  };
  defineClass(377, 1, { 1: 1, 41: 1 }, ju.AbstractHashMap$EntrySetIterator);
  _.$init_318 = function $init_318() {
    this.stringMapEntries = this.this$01.stringMap.iterator();
    this.current = this.stringMapEntries;
    this.hasNext = this.computeHasNext();
    this.lastModCount = this.this$01.modCount;
  };
  _.forEachRemaining_0 = function forEachRemaining_3(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.next_3 = function next_4() {
    return this.next_4();
  };
  _.computeHasNext = function computeHasNext() {
    if (this.current.hasNext_0()) {
      return true;
    }
    if (jsNotEquals(this.current, this.stringMapEntries)) {
      return false;
    }
    this.current = this.this$01.hashCodeMap.iterator();
    return this.current.hasNext_0();
  };
  _.hasNext_0 = function hasNext_0() {
    return this.hasNext;
  };
  _.next_4 = function next_5() {
    var rv;
    ji2.checkConcurrentModification_0(this.this$01.modCount, this.lastModCount);
    ji2.checkElement(this.hasNext_0());
    this.last = this.current;
    rv = castTo(this.current.next_3(), 27);
    this.hasNext = this.computeHasNext();
    return rv;
  };
  _.remove_2 = function remove_11() {
    ji2.checkState(isNotNull(this.last));
    ji2.checkConcurrentModification_0(this.this$01.modCount, this.lastModCount);
    this.last.remove_2();
    this.last = null;
    this.hasNext = this.computeHasNext();
    this.lastModCount = this.this$01.modCount;
  };
  _.hasNext = false;
  _.lastModCount = 0;
  cggl.Ljava_util_AbstractHashMap$EntrySetIterator_2_classLit = createForClass("java.util", "AbstractHashMap/EntrySetIterator", 377, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_AbstractList$IteratorImpl = function $clinit_AbstractList$IteratorImpl() {
    ju.$clinit_AbstractList$IteratorImpl = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
  };
  ju.AbstractList$IteratorImpl = function AbstractList$IteratorImpl(this$0) {
    ju.$clinit_AbstractList$IteratorImpl();
    this.this$01_0 = this$0;
    Object_0.call(this);
    this.$init_319();
  };
  defineClass(204, 1, { 1: 1, 41: 1 }, ju.AbstractList$IteratorImpl);
  _.$init_319 = function $init_319() {
    this.i = 0;
    this.last = -1;
  };
  _.forEachRemaining_0 = function forEachRemaining_4(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.hasNext_0 = function hasNext_1() {
    return this.i < this.this$01_0.size();
  };
  _.next_3 = function next_6() {
    ji2.checkElement(this.hasNext_0());
    return this.this$01_0.getAtIndex(this.last = this.i++);
  };
  _.remove_2 = function remove_12() {
    ji2.checkState(this.last != -1);
    this.this$01_0.removeAtIndex(this.last);
    this.i = this.last;
    this.last = -1;
  };
  _.i = 0;
  _.last = 0;
  cggl.Ljava_util_AbstractList$IteratorImpl_2_classLit = createForClass("java.util", "AbstractList/IteratorImpl", 204, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_ListIterator = function $clinit_ListIterator() {
    ju.$clinit_ListIterator = emptyMethod;
  };
  cggl.Ljava_util_ListIterator_2_classLit = createForInterface("java.util", "ListIterator");
  ju.$clinit_AbstractList$ListIteratorImpl = function $clinit_AbstractList$ListIteratorImpl() {
    ju.$clinit_AbstractList$ListIteratorImpl = emptyMethod;
    ju.$clinit_AbstractList$IteratorImpl();
    ju.$clinit_Iterator();
  };
  ju.AbstractList$ListIteratorImpl = function AbstractList$ListIteratorImpl(this$0, start_0) {
    ju.$clinit_AbstractList$ListIteratorImpl();
    this.this$01 = this$0;
    ju.AbstractList$IteratorImpl.call(this, this$0);
    this.$init_320();
    ji2.checkPositionIndex(start_0, this$0.size());
    this.i = start_0;
  };
  defineClass(373, 204, { 1: 1, 41: 1 }, ju.AbstractList$ListIteratorImpl);
  _.$init_320 = function $init_320() {
  };
  _.remove_2 = function remove_13() {
    getClassPrototype(204).remove_2.call(this);
  };
  cggl.Ljava_util_AbstractList$ListIteratorImpl_2_classLit = createForClass("java.util", "AbstractList/ListIteratorImpl", 373, cggl.Ljava_util_AbstractList$IteratorImpl_2_classLit);
  ju.$clinit_AbstractList$SubList = function $clinit_AbstractList$SubList() {
    ju.$clinit_AbstractList$SubList = emptyMethod;
    ju.$clinit_AbstractList();
  };
  ju.AbstractList$SubList = function AbstractList$SubList(wrapped, fromIndex, toIndex) {
    ju.$clinit_AbstractList$SubList();
    ju.AbstractList.call(this);
    this.$init_321();
    ji2.checkCriticalPositionIndexes(fromIndex, toIndex, wrapped.size());
    this.wrapped = wrapped;
    this.fromIndex = fromIndex;
    this.size_0 = toIndex - fromIndex;
  };
  defineClass(374, 138, { 1: 1, 29: 1, 59: 1 }, ju.AbstractList$SubList);
  _.$init_321 = function $init_321() {
  };
  _.addAtIndex = function add_25(index_0, element) {
    ji2.checkPositionIndex(index_0, this.size_0);
    this.wrapped.addAtIndex(this.fromIndex + index_0, element);
    this.size_0++;
  };
  _.getAtIndex = function get_25(index_0) {
    ji2.checkElementIndex(index_0, this.size_0);
    return this.wrapped.getAtIndex(this.fromIndex + index_0);
  };
  _.removeAtIndex = function remove_14(index_0) {
    var result;
    ji2.checkElementIndex(index_0, this.size_0);
    result = this.wrapped.removeAtIndex(this.fromIndex + index_0);
    this.size_0--;
    return result;
  };
  _.setAtIndex = function set_7(index_0, element) {
    ji2.checkElementIndex(index_0, this.size_0);
    return this.wrapped.setAtIndex(this.fromIndex + index_0, element);
  };
  _.size = function size_10() {
    return this.size_0;
  };
  _.fromIndex = 0;
  _.size_0 = 0;
  cggl.Ljava_util_AbstractList$SubList_2_classLit = createForClass("java.util", "AbstractList/SubList", 374, cggl.Ljava_util_AbstractList_2_classLit);
  ju.$clinit_AbstractMap$1 = function $clinit_AbstractMap$1() {
    ju.$clinit_AbstractMap$1 = emptyMethod;
    ju.$clinit_AbstractSet();
  };
  ju.AbstractMap$1 = function AbstractMap$1(this$0) {
    ju.$clinit_AbstractMap$1();
    this.this$01 = this$0;
    ju.AbstractSet.call(this);
    this.$init_322();
  };
  defineClass(378, 99, { 1: 1, 29: 1, 56: 1 }, ju.AbstractMap$1);
  _.$init_322 = function $init_322() {
  };
  _.clear = function clear_14() {
    this.this$01.clear();
  };
  _.contains = function contains_11(key) {
    return this.this$01.containsKey(key);
  };
  _.iterator = function iterator_2() {
    var outerIter;
    outerIter = this.this$01.entrySet_0().iterator();
    return new ju.AbstractMap$1$1(this, outerIter);
  };
  _.remove = function remove_15(key) {
    if (this.this$01.containsKey(key)) {
      this.this$01.remove(key);
      return true;
    }
    return false;
  };
  _.size = function size_11() {
    return this.this$01.size();
  };
  cggl.Ljava_util_AbstractMap$1_2_classLit = createForClass("java.util", "AbstractMap/1", 378, cggl.Ljava_util_AbstractSet_2_classLit);
  ju.$clinit_AbstractMap$1$1 = function $clinit_AbstractMap$1$1() {
    ju.$clinit_AbstractMap$1$1 = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
  };
  ju.AbstractMap$1$1 = function AbstractMap$1$1(this$1, val$outerIter) {
    ju.$clinit_AbstractMap$1$1();
    this.this$11 = this$1;
    this.val$outerIter2 = val$outerIter;
    Object_0.call(this);
    this.$init_323();
  };
  defineClass(379, 1, { 1: 1, 41: 1 }, ju.AbstractMap$1$1);
  _.$init_323 = function $init_323() {
  };
  _.forEachRemaining_0 = function forEachRemaining_5(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.hasNext_0 = function hasNext_2() {
    return this.val$outerIter2.hasNext_0();
  };
  _.next_3 = function next_7() {
    var entry;
    entry = castTo(this.val$outerIter2.next_3(), 27);
    return entry.getKey_0();
  };
  _.remove_2 = function remove_16() {
    this.val$outerIter2.remove_2();
  };
  cggl.Ljava_util_AbstractMap$1$1_2_classLit = createForClass("java.util", "AbstractMap/1/1", 379, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_AbstractMap$2 = function $clinit_AbstractMap$2() {
    ju.$clinit_AbstractMap$2 = emptyMethod;
    ju.$clinit_AbstractCollection();
  };
  ju.AbstractMap$2 = function AbstractMap$2(this$0) {
    ju.$clinit_AbstractMap$2();
    this.this$01 = this$0;
    ju.AbstractCollection.call(this);
    this.$init_324();
  };
  defineClass(380, 137, { 1: 1, 29: 1 }, ju.AbstractMap$2);
  _.$init_324 = function $init_324() {
  };
  _.clear = function clear_15() {
    this.this$01.clear();
  };
  _.contains = function contains_12(value_0) {
    return this.this$01.containsValue(value_0);
  };
  _.iterator = function iterator_3() {
    var outerIter;
    outerIter = this.this$01.entrySet_0().iterator();
    return new ju.AbstractMap$2$1(this, outerIter);
  };
  _.size = function size_12() {
    return this.this$01.size();
  };
  cggl.Ljava_util_AbstractMap$2_2_classLit = createForClass("java.util", "AbstractMap/2", 380, cggl.Ljava_util_AbstractCollection_2_classLit);
  ju.$clinit_AbstractMap$2$1 = function $clinit_AbstractMap$2$1() {
    ju.$clinit_AbstractMap$2$1 = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
  };
  ju.AbstractMap$2$1 = function AbstractMap$2$1(this$1, val$outerIter) {
    ju.$clinit_AbstractMap$2$1();
    this.this$11 = this$1;
    this.val$outerIter2 = val$outerIter;
    Object_0.call(this);
    this.$init_325();
  };
  defineClass(381, 1, { 1: 1, 41: 1 }, ju.AbstractMap$2$1);
  _.$init_325 = function $init_325() {
  };
  _.forEachRemaining_0 = function forEachRemaining_6(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.hasNext_0 = function hasNext_3() {
    return this.val$outerIter2.hasNext_0();
  };
  _.next_3 = function next_8() {
    var entry;
    entry = castTo(this.val$outerIter2.next_3(), 27);
    return entry.getValue_0();
  };
  _.remove_2 = function remove_17() {
    this.val$outerIter2.remove_2();
  };
  cggl.Ljava_util_AbstractMap$2$1_2_classLit = createForClass("java.util", "AbstractMap/2/1", 381, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Map$Entry = function $clinit_Map$Entry() {
    ju.$clinit_Map$Entry = emptyMethod;
  };
  cggl.Ljava_util_Map$Entry_2_classLit = createForInterface("java.util", "Map/Entry");
  ju.$clinit_AbstractMap$AbstractEntry = function $clinit_AbstractMap$AbstractEntry() {
    ju.$clinit_AbstractMap$AbstractEntry = emptyMethod;
    jl.$clinit_Object();
  };
  ju.AbstractMap$AbstractEntry = function AbstractMap$AbstractEntry(key, value_0) {
    ju.$clinit_AbstractMap$AbstractEntry();
    Object_0.call(this);
    this.$init_326();
    this.key = key;
    this.value_0 = value_0;
  };
  defineClass(207, 1, { 1: 1, 27: 1 });
  _.$init_326 = function $init_326() {
  };
  _.equals_0 = function equals_37(other) {
    var entry;
    if (!instanceOf(other, 27)) {
      return false;
    }
    entry = castTo(other, 27);
    return ju.equals_48(this.key, entry.getKey_0()) && ju.equals_48(this.value_0, entry.getValue_0());
  };
  _.getKey_0 = function getKey_0() {
    return this.key;
  };
  _.getValue_0 = function getValue_1() {
    return this.value_0;
  };
  _.hashCode_1 = function hashCode_28() {
    return hashCode_38(this.key) ^ hashCode_38(this.value_0);
  };
  _.setValue = function setValue(value_0) {
    var oldValue;
    oldValue = this.value_0;
    this.value_0 = value_0;
    return oldValue;
  };
  _.toString_0 = function toString_57() {
    return this.key + "=" + this.value_0;
  };
  cggl.Ljava_util_AbstractMap$AbstractEntry_2_classLit = createForClass("java.util", "AbstractMap/AbstractEntry", 207, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_AbstractMap$SimpleEntry = function $clinit_AbstractMap$SimpleEntry() {
    ju.$clinit_AbstractMap$SimpleEntry = emptyMethod;
    ju.$clinit_AbstractMap$AbstractEntry();
  };
  ju.AbstractMap$SimpleEntry = function AbstractMap$SimpleEntry(key, value_0) {
    ju.$clinit_AbstractMap$SimpleEntry();
    ju.AbstractMap$AbstractEntry.call(this, key, value_0);
    this.$init_327();
  };
  defineClass(208, 207, { 1: 1, 27: 1 }, ju.AbstractMap$SimpleEntry);
  _.$init_327 = function $init_327() {
  };
  cggl.Ljava_util_AbstractMap$SimpleEntry_2_classLit = createForClass("java.util", "AbstractMap/SimpleEntry", 208, cggl.Ljava_util_AbstractMap$AbstractEntry_2_classLit);
  ju.$clinit_AbstractMap$SimpleImmutableEntry = function $clinit_AbstractMap$SimpleImmutableEntry() {
    ju.$clinit_AbstractMap$SimpleImmutableEntry = emptyMethod;
    ju.$clinit_AbstractMap$AbstractEntry();
  };
  ju.AbstractMap$SimpleImmutableEntry = function AbstractMap$SimpleImmutableEntry(key, value_0) {
    ju.$clinit_AbstractMap$SimpleImmutableEntry();
    ju.AbstractMap$AbstractEntry.call(this, key, value_0);
    this.$init_328();
  };
  ju.AbstractMap$SimpleImmutableEntry_0 = function AbstractMap$SimpleImmutableEntry_0(entry) {
    ju.$clinit_AbstractMap$SimpleImmutableEntry();
    ju.AbstractMap$AbstractEntry.call(this, entry.getKey_0(), entry.getValue_0());
    this.$init_328();
  };
  defineClass(253, 207, { 1: 1, 27: 1 }, ju.AbstractMap$SimpleImmutableEntry, ju.AbstractMap$SimpleImmutableEntry_0);
  _.$init_328 = function $init_328() {
  };
  _.setValue = function setValue_0(value_0) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  cggl.Ljava_util_AbstractMap$SimpleImmutableEntry_2_classLit = createForClass("java.util", "AbstractMap/SimpleImmutableEntry", 253, cggl.Ljava_util_AbstractMap$AbstractEntry_2_classLit);
  ju.$clinit_AbstractMapEntry = function $clinit_AbstractMapEntry() {
    ju.$clinit_AbstractMapEntry = emptyMethod;
    jl.$clinit_Object();
  };
  ju.AbstractMapEntry = function AbstractMapEntry() {
    ju.$clinit_AbstractMapEntry();
    Object_0.call(this);
    this.$init_329();
  };
  defineClass(462, 1, { 1: 1, 27: 1 });
  _.$init_329 = function $init_329() {
  };
  _.equals_0 = function equals_38(other) {
    var entry;
    if (!instanceOf(other, 27)) {
      return false;
    }
    entry = castTo(other, 27);
    return ju.equals_48(this.getKey_0(), entry.getKey_0()) && ju.equals_48(this.getValue_0(), entry.getValue_0());
  };
  _.hashCode_1 = function hashCode_29() {
    return hashCode_38(this.getKey_0()) ^ hashCode_38(this.getValue_0());
  };
  _.toString_0 = function toString_58() {
    return this.getKey_0() + "=" + this.getValue_0();
  };
  cggl.Ljava_util_AbstractMapEntry_2_classLit = createForClass("java.util", "AbstractMapEntry", 462, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_SortedMap = function $clinit_SortedMap() {
    ju.$clinit_SortedMap = emptyMethod;
  };
  cggl.Ljava_util_SortedMap_2_classLit = createForInterface("java.util", "SortedMap");
  ju.$clinit_NavigableMap = function $clinit_NavigableMap() {
    ju.$clinit_NavigableMap = emptyMethod;
  };
  cggl.Ljava_util_NavigableMap_2_classLit = createForInterface("java.util", "NavigableMap");
  ju.$clinit_AbstractNavigableMap = function $clinit_AbstractNavigableMap() {
    ju.$clinit_AbstractNavigableMap = emptyMethod;
    ju.$clinit_AbstractMap();
    ju.$clinit_Map();
  };
  ju.AbstractNavigableMap = function AbstractNavigableMap() {
    ju.$clinit_AbstractNavigableMap();
    ju.AbstractMap.call(this);
    this.$init_330();
  };
  ju.copyOf_6 = function copyOf_6(entry) {
    return isNull(entry) ? null : new ju.AbstractMap$SimpleImmutableEntry_0(entry);
  };
  defineClass(429, 139, { 1: 1, 55: 1 });
  _.$init_330 = function $init_330() {
  };
  _.containsEntry = function containsEntry_0(entry) {
    var key, lookupEntry;
    key = entry.getKey_0();
    lookupEntry = this.getEntry(key);
    return isNotNull(lookupEntry) && ju.equals_48(lookupEntry.getValue_0(), entry.getValue_0());
  };
  _.containsKey = function containsKey_1(k) {
    var key;
    key = k;
    return isNotNull(this.getEntry(key));
  };
  _.entrySet_0 = function entrySet_0() {
    return new ju.AbstractNavigableMap$EntrySet(this);
  };
  _.get = function get_26(k) {
    var key;
    key = k;
    return ju.getEntryValueOrNull(this.getEntry(key));
  };
  _.keySet = function keySet_0() {
    return this.navigableKeySet();
  };
  _.navigableKeySet = function navigableKeySet() {
    return new ju.AbstractNavigableMap$NavigableKeySet(this);
  };
  _.pollEntry = function pollEntry(entry) {
    if (isNotNull(entry)) {
      this.removeEntry(entry);
    }
    return ju.copyOf_6(entry);
  };
  _.pollFirstEntry = function pollFirstEntry() {
    return this.pollEntry(this.getFirstEntry());
  };
  cggl.Ljava_util_AbstractNavigableMap_2_classLit = createForClass("java.util", "AbstractNavigableMap", 429, cggl.Ljava_util_AbstractMap_2_classLit);
  ju.$clinit_AbstractNavigableMap$DescendingMap = function $clinit_AbstractNavigableMap$DescendingMap() {
    ju.$clinit_AbstractNavigableMap$DescendingMap = emptyMethod;
  };
  defineClass(743, 429, { 1: 1, 55: 1 });
  cggl.Ljava_util_AbstractNavigableMap$DescendingMap_2_classLit = createForClass("java.util", "AbstractNavigableMap/DescendingMap", 743, cggl.Ljava_util_AbstractNavigableMap_2_classLit);
  ju.$clinit_AbstractNavigableMap$EntrySet = function $clinit_AbstractNavigableMap$EntrySet() {
    ju.$clinit_AbstractNavigableMap$EntrySet = emptyMethod;
    ju.$clinit_AbstractSet();
  };
  ju.AbstractNavigableMap$EntrySet = function AbstractNavigableMap$EntrySet(this$0) {
    ju.$clinit_AbstractNavigableMap$EntrySet();
    this.this$01_0 = this$0;
    ju.AbstractSet.call(this);
    this.$init_331();
  };
  defineClass(260, 99, { 1: 1, 29: 1, 56: 1 }, ju.AbstractNavigableMap$EntrySet);
  _.$init_331 = function $init_331() {
  };
  _.contains = function contains_13(o) {
    return instanceOf(o, 27) && this.this$01_0.containsEntry(castTo(o, 27));
  };
  _.iterator = function iterator_4() {
    return this.this$01_0.entryIterator();
  };
  _.remove = function remove_18(o) {
    var entry;
    if (instanceOf(o, 27)) {
      entry = castTo(o, 27);
      return this.this$01_0.removeEntry(entry);
    }
    return false;
  };
  _.size = function size_13() {
    return this.this$01_0.size();
  };
  cggl.Ljava_util_AbstractNavigableMap$EntrySet_2_classLit = createForClass("java.util", "AbstractNavigableMap/EntrySet", 260, cggl.Ljava_util_AbstractSet_2_classLit);
  ju.$clinit_SortedSet = function $clinit_SortedSet() {
    ju.$clinit_SortedSet = emptyMethod;
  };
  ju.$spliterator_3 = function $spliterator_3(this$static) {
    return new ju.SortedSet$1(this$static, this$static, 1 | 16 | 4);
  };
  cggl.Ljava_util_SortedSet_2_classLit = createForInterface("java.util", "SortedSet");
  ju.$clinit_NavigableSet = function $clinit_NavigableSet() {
    ju.$clinit_NavigableSet = emptyMethod;
  };
  cggl.Ljava_util_NavigableSet_2_classLit = createForInterface("java.util", "NavigableSet");
  ju.$clinit_AbstractNavigableMap$NavigableKeySet = function $clinit_AbstractNavigableMap$NavigableKeySet() {
    ju.$clinit_AbstractNavigableMap$NavigableKeySet = emptyMethod;
    ju.$clinit_AbstractSet();
    jl.$clinit_Iterable();
    ju.$clinit_Collection();
    ju.$clinit_Set();
    ju.$clinit_SortedSet();
  };
  ju.AbstractNavigableMap$NavigableKeySet = function AbstractNavigableMap$NavigableKeySet(map_0) {
    ju.$clinit_AbstractNavigableMap$NavigableKeySet();
    ju.AbstractSet.call(this);
    this.$init_332();
    this.map_0 = map_0;
  };
  defineClass(434, 99, { 1: 1, 29: 1, 56: 1 }, ju.AbstractNavigableMap$NavigableKeySet);
  _.$init_332 = function $init_332() {
  };
  _.spliterator_0 = function spliterator_3() {
    return ju.$spliterator_3(this);
  };
  _.clear = function clear_16() {
    this.map_0.clear();
  };
  _.contains = function contains_14(o) {
    return this.map_0.containsKey(o);
  };
  _.iterator = function iterator_5() {
    var entryIterator;
    entryIterator = this.map_0.entrySet_0().iterator();
    return new ju.AbstractNavigableMap$NavigableKeySet$1(this, entryIterator);
  };
  _.pollFirst = function pollFirst() {
    return ju.getEntryKeyOrNull(this.map_0.pollFirstEntry());
  };
  _.remove = function remove_19(o) {
    if (this.map_0.containsKey(o)) {
      this.map_0.remove(o);
      return true;
    }
    return false;
  };
  _.size = function size_14() {
    return this.map_0.size();
  };
  cggl.Ljava_util_AbstractNavigableMap$NavigableKeySet_2_classLit = createForClass("java.util", "AbstractNavigableMap/NavigableKeySet", 434, cggl.Ljava_util_AbstractSet_2_classLit);
  ju.$clinit_AbstractNavigableMap$NavigableKeySet$1 = function $clinit_AbstractNavigableMap$NavigableKeySet$1() {
    ju.$clinit_AbstractNavigableMap$NavigableKeySet$1 = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
  };
  ju.AbstractNavigableMap$NavigableKeySet$1 = function AbstractNavigableMap$NavigableKeySet$1(this$1, val$entryIterator) {
    ju.$clinit_AbstractNavigableMap$NavigableKeySet$1();
    this.this$11 = this$1;
    this.val$entryIterator2 = val$entryIterator;
    Object_0.call(this);
    this.$init_333();
  };
  defineClass(435, 1, { 1: 1, 41: 1 }, ju.AbstractNavigableMap$NavigableKeySet$1);
  _.$init_333 = function $init_333() {
  };
  _.forEachRemaining_0 = function forEachRemaining_7(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.hasNext_0 = function hasNext_4() {
    return this.val$entryIterator2.hasNext_0();
  };
  _.next_3 = function next_9() {
    var entry;
    entry = castTo(this.val$entryIterator2.next_3(), 27);
    return entry.getKey_0();
  };
  _.remove_2 = function remove_20() {
    this.val$entryIterator2.remove_2();
  };
  cggl.Ljava_util_AbstractNavigableMap$NavigableKeySet$1_2_classLit = createForClass("java.util", "AbstractNavigableMap/NavigableKeySet/1", 435, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Queue = function $clinit_Queue() {
    ju.$clinit_Queue = emptyMethod;
  };
  cggl.Ljava_util_Queue_2_classLit = createForInterface("java.util", "Queue");
  ju.$clinit_AbstractQueue = function $clinit_AbstractQueue() {
    ju.$clinit_AbstractQueue = emptyMethod;
    ju.$clinit_AbstractCollection();
    jl.$clinit_Iterable();
    ju.$clinit_Collection();
  };
  ju.AbstractQueue = function AbstractQueue() {
    ju.$clinit_AbstractQueue();
    ju.AbstractCollection.call(this);
    this.$init_334();
  };
  defineClass(404, 137, { 1: 1, 29: 1 });
  _.$init_334 = function $init_334() {
  };
  _.add = function add_26(o) {
    ji2.checkState_0(this.offer(o), "Unable to add element to queue");
    return true;
  };
  _.addAll = function addAll_3(c) {
    ji2.checkNotNull_0(c);
    ji2.checkArgument_0(jsNotEquals(c, this), "Can't add a queue to itself");
    return getClassPrototype(137).addAll.call(this, c);
  };
  _.clear = function clear_17() {
    while (jsNotEquals(this.poll(), null)) {
    }
  };
  cggl.Ljava_util_AbstractQueue_2_classLit = createForClass("java.util", "AbstractQueue", 404, cggl.Ljava_util_AbstractCollection_2_classLit);
  ju.$clinit_Deque = function $clinit_Deque() {
    ju.$clinit_Deque = emptyMethod;
  };
  cggl.Ljava_util_Deque_2_classLit = createForInterface("java.util", "Deque");
  ju.$clinit_ArrayDeque = function $clinit_ArrayDeque() {
    ju.$clinit_ArrayDeque = emptyMethod;
    ju.$clinit_AbstractCollection();
    jl.$clinit_Iterable();
    ju.$clinit_Collection();
  };
  ju.ArrayDeque = function ArrayDeque() {
    ju.$clinit_ArrayDeque();
    ju.AbstractCollection.call(this);
    this.$init_335();
    this.array = castToArray(initUnidimensionalArray(cggl.Ljava_lang_Object_2_classLit, { 4: 1, 1: 1, 7: 1 }, 1, 8, 5, 1));
  };
  ju.checkConcurrentModification = function checkConcurrentModification(expression) {
    ju.$clinit_ArrayDeque();
    if (!expression) {
      throw toJs(new ju.ConcurrentModificationException());
    }
  };
  ju.nextArrayLength = function nextArrayLength(numElements) {
    return ju.nextPowerOfTwo($wnd.Math.max(8, numElements));
  };
  ju.nextPowerOfTwo = function nextPowerOfTwo(num) {
    return highestOneBit(num) << 1;
  };
  defineClass(492, 137, { 1: 1, 29: 1 }, ju.ArrayDeque);
  _.$init_335 = function $init_335() {
  };
  _.add = function add_27(e) {
    this.addLast(e);
    return true;
  };
  _.addFirst = function addFirst(e) {
    ji2.checkCriticalNotNull(e);
    this.head_0 = this.head_0 - 1 & this.array.length - 1;
    setCheck(this.array, this.head_0, e);
    this.ensureCapacity();
  };
  _.addLast = function addLast(e) {
    ji2.checkCriticalNotNull(e);
    setCheck(this.array, this.tail, e);
    this.tail = this.tail + 1 & this.array.length - 1;
    this.ensureCapacity();
  };
  _.clear = function clear_18() {
    if (this.head_0 == this.tail) {
      return;
    }
    this.array = castToArray(initUnidimensionalArray(cggl.Ljava_lang_Object_2_classLit, { 4: 1, 1: 1, 7: 1 }, 1, 8, 5, 1));
    this.head_0 = 0;
    this.tail = 0;
  };
  _.contains = function contains_15(o) {
    return this.contains_4(this.iterator(), o);
  };
  _.contains_4 = function contains_16(it, o) {
    if (jsEquals(o, null)) {
      return false;
    }
    while (it.hasNext_0()) {
      if (jl.equals_Ljava_lang_Object__Z__devirtual$(o, it.next_3())) {
        return true;
      }
    }
    return false;
  };
  _.copyElements = function copyElements(dest, count) {
    var dstIdx, i, mask;
    mask = this.array.length - 1;
    for (i = this.head_0, dstIdx = 0; dstIdx < count; i = i + 1 & mask, ++dstIdx) {
      setCheck(dest, dstIdx, this.array[i]);
    }
  };
  _.ensureCapacity = function ensureCapacity() {
    var newArray, newLength, numElements;
    if (this.head_0 != this.tail) {
      return;
    }
    numElements = this.array.length;
    newLength = ju.nextArrayLength(numElements);
    if (this.head_0 != 0) {
      newArray = ji2.createFrom(this.array, newLength);
      this.copyElements(newArray, numElements);
      this.array = newArray;
      this.head_0 = 0;
    } else {
      ji2.setLength_0(this.array, newLength);
    }
    this.tail = numElements;
  };
  _.isEmpty = function isEmpty_6() {
    return this.head_0 == this.tail;
  };
  _.iterator = function iterator_6() {
    return new ju.ArrayDeque$IteratorImpl(this);
  };
  _.offer = function offer(e) {
    return this.offerLast(e);
  };
  _.offerLast = function offerLast(e) {
    this.addLast(e);
    return true;
  };
  _.peek_0 = function peek_0() {
    return this.peekFirst();
  };
  _.peekFirst = function peekFirst() {
    return this.peekFirstElement();
  };
  _.peekFirstElement = function peekFirstElement() {
    return this.array[this.head_0];
  };
  _.poll = function poll() {
    return this.pollFirst();
  };
  _.pollFirst = function pollFirst_0() {
    var e;
    e = this.peekFirstElement();
    if (jsEquals(e, null)) {
      return null;
    }
    setCheck(this.array, this.head_0, null);
    this.head_0 = this.head_0 + 1 & this.array.length - 1;
    return e;
  };
  _.push_0 = function push_1(e) {
    this.addFirst(e);
  };
  _.remove = function remove_21(o) {
    return this.removeFirstOccurrence(o);
  };
  _.remove_4 = function remove_22(it, o) {
    if (this.contains_4(it, o)) {
      it.remove_2();
      return true;
    }
    return false;
  };
  _.removeAtIndex_0 = function removeAtIndex(i) {
    ju.$clinit_ArrayDeque();
    var headDistance, mask, size_0, tailDistance;
    mask = this.array.length - 1;
    headDistance = i - this.head_0 & mask;
    tailDistance = this.tail - i & mask;
    size_0 = this.tail - this.head_0 & mask;
    ju.checkConcurrentModification(headDistance < size_0);
    if (headDistance >= tailDistance) {
      this.shiftLeftAtIndex(i);
      return -1;
    } else {
      this.shiftRightAtIndex(i);
      return 1;
    }
  };
  _.removeFirstOccurrence = function removeFirstOccurrence(o) {
    return this.remove_4(this.iterator(), o);
  };
  _.shiftLeftAtIndex = function shiftLeftAtIndex(i) {
    var mask, nextOffset;
    mask = this.array.length - 1;
    this.tail = this.tail - 1 & mask;
    while (i != this.tail) {
      nextOffset = i + 1 & mask;
      setCheck(this.array, i, this.array[nextOffset]);
      i = nextOffset;
    }
    setCheck(this.array, this.tail, null);
  };
  _.shiftRightAtIndex = function shiftRightAtIndex(i) {
    var mask, prevOffset;
    mask = this.array.length - 1;
    while (i != this.head_0) {
      prevOffset = i - 1 & mask;
      setCheck(this.array, i, this.array[prevOffset]);
      i = prevOffset;
    }
    setCheck(this.array, this.head_0, null);
    this.head_0 = this.head_0 + 1 & mask;
  };
  _.size = function size_15() {
    return this.tail - this.head_0 & this.array.length - 1;
  };
  _.spliterator_0 = function spliterator_4() {
    return ju.spliterator_11(this, 256 | 16);
  };
  _.toArray_0 = function toArray_7(out) {
    var size_0;
    size_0 = this.size();
    if (out.length < size_0) {
      out = ji2.createFrom(out, size_0);
    }
    this.copyElements(out, size_0);
    if (out.length > size_0) {
      setCheck(out, size_0, null);
    }
    return out;
  };
  _.head_0 = 0;
  _.tail = 0;
  ju.MIN_INITIAL_CAPACITY = 8;
  cggl.Ljava_util_ArrayDeque_2_classLit = createForClass("java.util", "ArrayDeque", 492, cggl.Ljava_util_AbstractCollection_2_classLit);
  ju.$clinit_ArrayDeque$DescendingIteratorImpl = function $clinit_ArrayDeque$DescendingIteratorImpl() {
    ju.$clinit_ArrayDeque$DescendingIteratorImpl = emptyMethod;
  };
  defineClass(804, 1, { 1: 1, 41: 1 });
  cggl.Ljava_util_ArrayDeque$DescendingIteratorImpl_2_classLit = createForClass("java.util", "ArrayDeque/DescendingIteratorImpl", 804, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_ArrayDeque$IteratorImpl = function $clinit_ArrayDeque$IteratorImpl() {
    ju.$clinit_ArrayDeque$IteratorImpl = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
  };
  ju.ArrayDeque$IteratorImpl = function ArrayDeque$IteratorImpl(this$0) {
    ju.$clinit_ArrayDeque$IteratorImpl();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_336();
  };
  defineClass(493, 1, { 1: 1, 41: 1 }, ju.ArrayDeque$IteratorImpl);
  _.$init_336 = function $init_336() {
    this.currentIndex = this.this$01.head_0;
    this.fence = this.this$01.tail;
    this.lastIndex = -1;
  };
  _.forEachRemaining_0 = function forEachRemaining_8(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.hasNext_0 = function hasNext_5() {
    return this.currentIndex != this.fence;
  };
  _.next_3 = function next_10() {
    var e;
    ji2.checkCriticalElement(this.hasNext_0());
    e = this.this$01.array[this.currentIndex];
    ju.checkConcurrentModification(this.fence == this.this$01.tail && jsNotEquals(e, null));
    this.lastIndex = this.currentIndex;
    this.currentIndex = this.currentIndex + 1 & this.this$01.array.length - 1;
    return e;
  };
  _.remove_2 = function remove_23() {
    ji2.checkState(this.lastIndex >= 0);
    if (this.this$01.removeAtIndex_0(this.lastIndex) < 0) {
      this.currentIndex = this.currentIndex - 1 & this.this$01.array.length - 1;
      this.fence = this.this$01.tail;
    }
    this.lastIndex = -1;
  };
  _.currentIndex = 0;
  _.fence = 0;
  _.lastIndex = 0;
  cggl.Ljava_util_ArrayDeque$IteratorImpl_2_classLit = createForClass("java.util", "ArrayDeque/IteratorImpl", 493, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_ArrayList$1 = function $clinit_ArrayList$1() {
    ju.$clinit_ArrayList$1 = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
  };
  ju.ArrayList$1 = function ArrayList$1(this$0) {
    ju.$clinit_ArrayList$1();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_337();
  };
  defineClass(372, 1, { 1: 1, 41: 1 }, ju.ArrayList$1);
  _.$init_337 = function $init_337() {
    this.i = 0;
    this.last = -1;
  };
  _.forEachRemaining_0 = function forEachRemaining_9(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.hasNext_0 = function hasNext_6() {
    return this.i < this.this$01.array.length;
  };
  _.next_3 = function next_11() {
    ji2.checkElement(this.hasNext_0());
    this.last = this.i++;
    return this.this$01.array[this.last];
  };
  _.remove_2 = function remove_24() {
    ji2.checkState(this.last != -1);
    this.this$01.removeAtIndex(this.i = this.last);
    this.last = -1;
  };
  _.i = 0;
  _.last = 0;
  cggl.Ljava_util_ArrayList$1_2_classLit = createForClass("java.util", "ArrayList/1", 372, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Arrays = function $clinit_Arrays() {
    ju.$clinit_Arrays = emptyMethod;
    jl.$clinit_Object();
  };
  ju.asList = function asList(array) {
    ju.$clinit_Arrays();
    return new ju.Arrays$ArrayList(array);
  };
  ju.checkCopyOfRange = function checkCopyOfRange(original, from, to) {
    var len;
    ji2.checkArgument_0(from <= to, from + " > " + to);
    len = ji2.getLength_2(original);
    ji2.checkCriticalArrayBounds(from, from, len);
  };
  ju.copyOf_7 = function copyOf_7(original, newLength) {
    ju.$clinit_Arrays();
    ji2.checkArraySize(newLength);
    return castTo(ju.copyPrimitiveArray(original, initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, newLength, 15, 1), 0, newLength), 8);
  };
  ju.copyOf_8 = function copyOf_8(original, newLength) {
    ju.$clinit_Arrays();
    ji2.checkArraySize(newLength);
    return castTo(ju.copyPrimitiveArray(original, initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, newLength, 15, 1), 0, newLength), 11);
  };
  ju.copyOf_9 = function copyOf_9(original, newLength) {
    ju.$clinit_Arrays();
    ji2.checkArraySize(newLength);
    return castTo(ju.copyPrimitiveArray(original, initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, newLength, 15, 1), 0, newLength), 6);
  };
  ju.copyOf_10 = function copyOf_10(original, newLength) {
    ju.$clinit_Arrays();
    ji2.checkArraySize(newLength);
    return castTo(ju.copyPrimitiveArray(original, initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, newLength, 14, 1), 0, newLength), 49);
  };
  ju.copyOf_11 = function copyOf_11(original, newLength) {
    ju.$clinit_Arrays();
    ji2.checkArraySize(newLength);
    return castTo(ju.copyPrimitiveArray(original, initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, newLength, 15, 1), 0, newLength), 13);
  };
  ju.copyOfRange = function copyOfRange(original, from, to) {
    ju.$clinit_Arrays();
    ju.checkCopyOfRange(original, from, to);
    return castTo(ju.copyPrimitiveArray(original, initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, to - from, 15, 1), from, to), 8);
  };
  ju.copyPrimitiveArray = function copyPrimitiveArray(original, copy, from, to) {
    var copyLen, len;
    len = ji2.getLength_2(original);
    copyLen = $wnd.Math.min(to, len) - from;
    ji2.copy_2(original, from, copy, 0, copyLen);
    return copy;
  };
  ju.fill = function fill(a, val) {
    ju.$clinit_Arrays();
    ju.fill0(a, 0, a.length, val);
  };
  ju.fill_0 = function fill_0(a, val) {
    ju.$clinit_Arrays();
    ju.fill0_0(a, 0, a.length, val);
  };
  ju.fill_1 = function fill_1(a, val) {
    ju.$clinit_Arrays();
    ju.fill0_1(a, 0, a.length, val);
  };
  ju.fill_2 = function fill_2(a, val) {
    ju.$clinit_Arrays();
    ju.fill0_2(a, 0, a.length, val);
  };
  ju.fill_3 = function fill_3(a, val) {
    ju.$clinit_Arrays();
    ju.fill0_3(a, 0, a.length, val);
  };
  ju.fill_4 = function fill_4(a, val) {
    ju.$clinit_Arrays();
    ju.fill0_4(a, 0, a.length, val);
  };
  ju.fill0 = function fill0(a, fromIndex, toIndex, val) {
    var i;
    for (i = fromIndex; i < toIndex; ++i) {
      a[i] = val;
    }
  };
  ju.fill0_0 = function fill0_0(a, fromIndex, toIndex, val) {
    var i;
    for (i = fromIndex; i < toIndex; ++i) {
      a[i] = val;
    }
  };
  ju.fill0_1 = function fill0_1(a, fromIndex, toIndex, val) {
    var i;
    for (i = fromIndex; i < toIndex; ++i) {
      a[i] = val;
    }
  };
  ju.fill0_2 = function fill0_2(a, fromIndex, toIndex, val) {
    var i;
    for (i = fromIndex; i < toIndex; ++i) {
      setCheck(a, i, val);
    }
  };
  ju.fill0_3 = function fill0_3(a, fromIndex, toIndex, val) {
    var i;
    for (i = fromIndex; i < toIndex; ++i) {
      a[i] = val;
    }
  };
  ju.fill0_4 = function fill0_4(a, fromIndex, toIndex, val) {
    var i;
    for (i = fromIndex; i < toIndex; ++i) {
      a[i] = val;
    }
  };
  ju.getDoubleComparator = function getDoubleComparator() {
    return ji2.uncheckedCast(castToFunction(makeLambdaFunction(ju.Arrays$0methodref$compare$Type.prototype.compare_7, ju.Arrays$0methodref$compare$Type, [])));
  };
  ju.getIntComparator = function getIntComparator() {
    return ji2.uncheckedCast(castToFunction(makeLambdaFunction(ju.Arrays$lambda$0$Type.prototype.compare_7, ju.Arrays$lambda$0$Type, [])));
  };
  ju.getLongComparator = function getLongComparator() {
    return ji2.uncheckedCast(castToFunction(makeLambdaFunction(ju.Arrays$1methodref$compare$Type.prototype.compare_8, ju.Arrays$1methodref$compare$Type, [])));
  };
  ju.hashCode_30 = function hashCode_30(a) {
    ju.$clinit_Arrays();
    var e, e$array, e$index, e$max, hashCode;
    if (jsEquals(a, null)) {
      return 0;
    }
    hashCode = 1;
    for (e$array = a, e$index = 0, e$max = e$array.length; e$index < e$max; ++e$index) {
      e = e$array[e$index];
      hashCode = 31 * hashCode + hashCode_38(e);
      hashCode = ji2.ensureInt(hashCode);
    }
    return hashCode;
  };
  ju.insertionSort = function insertionSort(array, low, high, comp) {
    var i, j, t;
    for (i = low + 1; i < high; ++i) {
      for (j = i; j > low && comp.compare_0(array[j - 1], array[j]) > 0; --j) {
        t = array[j];
        setCheck(array, j, array[j - 1]);
        setCheck(array, j - 1, t);
      }
    }
  };
  ju.lambda$0_4 = function lambda$0_4(a_0, b_1) {
    ju.$clinit_Arrays();
    return a_0 - b_1;
  };
  ju.merge_0 = function merge_0(src_0, srcLow, srcMid, srcHigh, dest, destLow, destHigh, comp) {
    var topIdx;
    topIdx = srcMid;
    while (destLow < destHigh) {
      if (topIdx >= srcHigh || srcLow < srcMid && comp.compare_0(src_0[srcLow], src_0[topIdx]) <= 0) {
        setCheck(dest, destLow++, src_0[srcLow++]);
      } else {
        setCheck(dest, destLow++, src_0[topIdx++]);
      }
    }
  };
  ju.mergeSort = function mergeSort(x_0, fromIndex, toIndex, comp) {
    var temp;
    comp = ju.nullToNaturalOrder(comp);
    temp = ji2.unsafeClone(x_0, fromIndex, toIndex);
    ju.mergeSort_0(temp, x_0, fromIndex, toIndex, -fromIndex, castTo(comp, 36));
  };
  ju.mergeSort_0 = function mergeSort_0(temp, array, low, high, ofs, comp) {
    var length_0, tempHigh, tempLow, tempMid;
    length_0 = high - low;
    if (length_0 < 7) {
      ju.insertionSort(array, low, high, comp);
      return;
    }
    tempLow = low + ofs;
    tempHigh = high + ofs;
    tempMid = tempLow + (tempHigh - tempLow >> 1);
    ju.mergeSort_0(array, temp, tempLow, tempMid, -ofs, comp);
    ju.mergeSort_0(array, temp, tempMid, tempHigh, -ofs, comp);
    if (comp.compare_0(temp[tempMid - 1], temp[tempMid]) <= 0) {
      while (low < high) {
        setCheck(array, low++, temp[tempLow++]);
      }
      return;
    }
    ju.merge_0(temp, tempLow, tempMid, tempHigh, array, low, high, comp);
  };
  ju.nativeIntegerSort = function nativeIntegerSort(array) {
    ji2.sort_11(array, ju.getIntComparator());
  };
  ju.sort_2 = function sort_2(array) {
    ju.$clinit_Arrays();
    ji2.sort_11(array, ju.getDoubleComparator());
  };
  ju.sort_3 = function sort_3(array) {
    ju.$clinit_Arrays();
    ju.nativeIntegerSort(array);
  };
  ju.sort_4 = function sort_4(array) {
    ju.$clinit_Arrays();
    ji2.sort_11(array, ju.getLongComparator());
  };
  ju.sort_5 = function sort_5(array) {
    ju.$clinit_Arrays();
    ju.sort_7(array, null);
  };
  ju.sort_6 = function sort_6(x_0, fromIndex, toIndex, c) {
    ju.$clinit_Arrays();
    ji2.checkCriticalArrayBounds(fromIndex, toIndex, x_0.length);
    ju.mergeSort(x_0, fromIndex, toIndex, c);
  };
  ju.sort_7 = function sort_7(x_0, c) {
    ju.$clinit_Arrays();
    ju.mergeSort(x_0, 0, x_0.length, c);
  };
  defineClass(709, 1, { 1: 1 });
  cggl.Ljava_util_Arrays_2_classLit = createForClass("java.util", "Arrays", 709, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Arrays$0methodref$compare$Type = function $clinit_Arrays$0methodref$compare$Type() {
    ju.$clinit_Arrays$0methodref$compare$Type = emptyMethod;
  };
  ju.$getClass_4 = function $getClass_4(this$static) {
    return cggl.Lcom_google_gwt_core_client_JavaScriptObject_2_classLit;
  };
  ju.Arrays$0methodref$compare$Type = function Arrays$0methodref$compare$Type() {
    ju.$clinit_Arrays$0methodref$compare$Type();
  };
  defineClass(843, $wnd.Function, { 1: 1, 835: 1 }, ju.Arrays$0methodref$compare$Type);
  _.compare_7 = function compare_30(d1, d2) {
    return compare_23(d1, d2);
  };
  ju.$clinit_Arrays$1methodref$compare$Type = function $clinit_Arrays$1methodref$compare$Type() {
    ju.$clinit_Arrays$1methodref$compare$Type = emptyMethod;
  };
  ju.$getClass_5 = function $getClass_5(this$static) {
    return cggl.Lcom_google_gwt_core_client_JavaScriptObject_2_classLit;
  };
  ju.Arrays$1methodref$compare$Type = function Arrays$1methodref$compare$Type() {
    ju.$clinit_Arrays$1methodref$compare$Type();
  };
  defineClass(844, $wnd.Function, { 1: 1, 845: 1 }, ju.Arrays$1methodref$compare$Type);
  _.compare_8 = function compare_31(d1, d2) {
    return compare_26(d1, d2);
  };
  ju.$clinit_Arrays$ArrayList = function $clinit_Arrays$ArrayList() {
    ju.$clinit_Arrays$ArrayList = emptyMethod;
    ju.$clinit_AbstractList();
  };
  ju.Arrays$ArrayList = function Arrays$ArrayList(array) {
    ju.$clinit_Arrays$ArrayList();
    ju.AbstractList.call(this);
    this.$init_338();
    ji2.checkNotNull_0(array);
    this.array = array;
  };
  defineClass(415, 138, { 4: 1, 1: 1, 29: 1, 59: 1, 126: 1 }, ju.Arrays$ArrayList);
  _.$init_338 = function $init_338() {
  };
  _.contains = function contains_17(o) {
    return this.indexOf(o) != -1;
  };
  _.forEach = function forEach_2(consumer) {
    var e, e$array, e$index, e$max;
    ji2.checkNotNull_0(consumer);
    for (e$array = this.array, e$index = 0, e$max = e$array.length; e$index < e$max; ++e$index) {
      e = e$array[e$index];
      consumer.accept_0(e);
    }
  };
  _.getAtIndex = function get_27(index_0) {
    ji2.checkElementIndex(index_0, this.size());
    return this.array[index_0];
  };
  _.replaceAll = function replaceAll_2(operator) {
    var i;
    ji2.checkNotNull_0(operator);
    for (i = 0; i < this.array.length; i++) {
      setCheck(this.array, i, operator.apply_1(this.array[i]));
    }
  };
  _.setAtIndex = function set_8(index_0, value_0) {
    var was;
    was = this.getAtIndex(index_0);
    setCheck(this.array, index_0, value_0);
    return was;
  };
  _.size = function size_16() {
    return this.array.length;
  };
  _.sort_0 = function sort_8(c) {
    ju.sort_6(this.array, 0, this.array.length, c);
  };
  _.toArray = function toArray_8() {
    return this.toArray_0(initUnidimensionalArray(cggl.Ljava_lang_Object_2_classLit, { 4: 1, 1: 1, 7: 1 }, 1, this.array.length, 5, 1));
  };
  _.toArray_0 = function toArray_9(out) {
    var i, size_0;
    size_0 = this.array.length;
    if (out.length < size_0) {
      out = ji2.createFrom(out, size_0);
    }
    for (i = 0; i < size_0; ++i) {
      setCheck(out, i, this.array[i]);
    }
    if (out.length > size_0) {
      setCheck(out, size_0, null);
    }
    return out;
  };
  cggl.Ljava_util_Arrays$ArrayList_2_classLit = createForClass("java.util", "Arrays/ArrayList", 415, cggl.Ljava_util_AbstractList_2_classLit);
  ju.$clinit_Arrays$lambda$0$Type = function $clinit_Arrays$lambda$0$Type() {
    ju.$clinit_Arrays$lambda$0$Type = emptyMethod;
  };
  ju.$getClass_6 = function $getClass_6(this$static) {
    return cggl.Lcom_google_gwt_core_client_JavaScriptObject_2_classLit;
  };
  ju.Arrays$lambda$0$Type = function Arrays$lambda$0$Type() {
    ju.$clinit_Arrays$lambda$0$Type();
  };
  defineClass(842, $wnd.Function, { 1: 1, 835: 1 }, ju.Arrays$lambda$0$Type);
  _.compare_7 = function compare_32(d1, d2) {
    return ju.lambda$0_4(d1, d2);
  };
  ju.$clinit_BitSet = function $clinit_BitSet() {
    ju.$clinit_BitSet = emptyMethod;
    jl.$clinit_Object();
  };
  ju.BitSet = function BitSet() {
    ju.$clinit_BitSet();
    Object_0.call(this);
    this.$init_339();
    this.array = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 0, 15, 1);
  };
  ju.bitIndex_0 = function bitIndex_0(wordIndex) {
    return wordIndex * 31;
  };
  ju.bitOffset = function bitOffset(bitIndex) {
    return bitIndex % 31;
  };
  ju.checkIndex = function checkIndex(bitIndex) {
    if (bitIndex < 0) {
      throw toJs(new jl.IndexOutOfBoundsException_0("bitIndex < 0: " + bitIndex));
    }
  };
  ju.enforceOverflow = function enforceOverflow(value_0) {
    return value_0 & -1;
  };
  ju.lastSetWordIndex = function lastSetWordIndex(array) {
    var i;
    i = array.length - 1;
    for (; i >= 0 && ju.wordAt(array, i) == 0; --i) {
    }
    return i;
  };
  ju.maybeGrowArrayToIndex = function maybeGrowArrayToIndex(array, newMaxIndex) {
    var newLength;
    newLength = newMaxIndex + 1;
    if (newLength > array.length) {
      ji2.setLength_0(array, newLength);
    }
  };
  ju.wordAt = function wordAt(array, index_0) {
    return array[index_0] | 0;
  };
  ju.wordIndex_0 = function wordIndex_0(bitIndex) {
    return narrow_int(bitIndex / 31);
  };
  defineClass(174, 1, { 1: 1, 174: 1 }, ju.BitSet);
  _.$init_339 = function $init_339() {
  };
  _.clear_0 = function clear_19() {
    ji2.setLength_0(this.array, 0);
  };
  _.equals_0 = function equals_39(obj) {
    var index_0, lastIndex, other;
    if (maskUndefined(this) === maskUndefined(obj)) {
      return true;
    }
    if (!instanceOf(obj, 174)) {
      return false;
    }
    other = castTo(obj, 174);
    lastIndex = ju.lastSetWordIndex(this.array);
    if (lastIndex != ju.lastSetWordIndex(other.array)) {
      return false;
    }
    for (index_0 = 0; index_0 <= lastIndex; index_0++) {
      if (ju.wordAt(this.array, index_0) != ju.wordAt(other.array, index_0)) {
        return false;
      }
    }
    return true;
  };
  _.get_4 = function get_28(bitIndex) {
    var index_0;
    ju.checkIndex(bitIndex);
    index_0 = ju.wordIndex_0(bitIndex);
    return index_0 < this.array.length && (ju.wordAt(this.array, index_0) >>> ju.bitOffset(bitIndex) & 1) == 1;
  };
  _.hashCode_1 = function hashCode_31() {
    var fnvOffset, fnvPrime, hash, i, lastIndex, value_0;
    fnvOffset = -2128831035;
    fnvPrime = 16777619;
    lastIndex = ju.lastSetWordIndex(this.array);
    hash = -2128831035 ^ lastIndex;
    for (i = 0; i <= lastIndex; i++) {
      value_0 = ju.wordAt(this.array, i);
      hash = ju.enforceOverflow(hash * 16777619) ^ value_0 & 255;
      hash = ju.enforceOverflow(hash * 16777619) ^ value_0 >>> 8 & 255;
      hash = ju.enforceOverflow(hash * 16777619) ^ value_0 >>> 16 & 255;
      hash = ju.enforceOverflow(hash * 16777619) ^ value_0 >>> 24;
    }
    return hash;
  };
  _.isEmpty_0 = function isEmpty_7() {
    return this.length_1() == 0;
  };
  _.length_1 = function length_15() {
    var lastIndex, word;
    lastIndex = ju.lastSetWordIndex(this.array);
    if (lastIndex == -1) {
      return 0;
    }
    word = ju.wordAt(this.array, lastIndex);
    return ju.bitIndex_0(lastIndex) + (32 - numberOfLeadingZeros_0(word));
  };
  _.nextSetBit = function nextSetBit(fromIndex) {
    var index_0, length_0, word;
    ju.checkIndex(fromIndex);
    index_0 = ju.wordIndex_0(fromIndex);
    length_0 = this.array.length;
    if (index_0 >= length_0) {
      return -1;
    }
    word = ju.wordAt(this.array, index_0) & 2147483647 << ju.bitOffset(fromIndex);
    while (word == 0) {
      if (++index_0 >= length_0) {
        return -1;
      }
      word = ju.wordAt(this.array, index_0);
    }
    return ju.bitIndex_0(index_0) + numberOfTrailingZeros(word);
  };
  _.set_3 = function set_9(bitIndex) {
    var index_0;
    ju.checkIndex(bitIndex);
    index_0 = ju.wordIndex_0(bitIndex);
    ju.maybeGrowArrayToIndex(this.array, index_0);
    this.array[index_0] = ju.wordAt(this.array, index_0) | 1 << ju.bitOffset(bitIndex);
  };
  _.size_1 = function size_17() {
    return this.array.length * 32;
  };
  _.toString_0 = function toString_59() {
    var next, sb;
    if (this.isEmpty_0()) {
      return "{}";
    }
    sb = new jl.StringBuilder_1("{");
    next = this.nextSetBit(0);
    sb.append_5(next);
    while ((next = this.nextSetBit(next + 1)) != -1) {
      sb.append_9(", ");
      sb.append_5(next);
    }
    sb.append_9("}");
    return sb.toString_0();
  };
  ju.BITS_PER_WORD = 31;
  ju.WORD_MASK = 2147483647;
  cggl.Ljava_util_BitSet_2_classLit = createForClass("java.util", "BitSet", 174, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Collections = function $clinit_Collections() {
    ju.$clinit_Collections = emptyMethod;
    jl.$clinit_Object();
    ju.EMPTY_LIST = new ju.Collections$EmptyList();
    ju.EMPTY_MAP = new ju.Collections$EmptyMap();
    ju.EMPTY_SET = new ju.Collections$EmptySet();
  };
  ju.emptyIterator = function emptyIterator() {
    ju.$clinit_Collections();
    return castTo((ju.$clinit_Collections$EmptyListIterator(), ju.INSTANCE_0), 41);
  };
  ju.emptyList = function emptyList() {
    ju.$clinit_Collections();
    return castTo(ju.EMPTY_LIST, 59);
  };
  ju.emptyListIterator = function emptyListIterator() {
    ju.$clinit_Collections();
    return castTo((ju.$clinit_Collections$EmptyListIterator(), ju.INSTANCE_0), 830);
  };
  ju.emptyMap = function emptyMap() {
    ju.$clinit_Collections();
    return castTo(ju.EMPTY_MAP, 55);
  };
  ju.emptySet = function emptySet() {
    ju.$clinit_Collections();
    return castTo(ju.EMPTY_SET, 56);
  };
  ju.hashCode_32 = function hashCode_32(collection) {
    ju.$clinit_Collections();
    var e, e$iterator, hashCode;
    hashCode = 0;
    for (e$iterator = collection.iterator(); e$iterator.hasNext_0(); ) {
      e = e$iterator.next_3();
      hashCode = hashCode + hashCode_38(e);
      hashCode = ji2.ensureInt(hashCode);
    }
    return hashCode;
  };
  ju.hashCode_33 = function hashCode_33(list) {
    ju.$clinit_Collections();
    var e, e$iterator, hashCode;
    hashCode = 1;
    for (e$iterator = list.iterator(); e$iterator.hasNext_0(); ) {
      e = e$iterator.next_3();
      hashCode = 31 * hashCode + hashCode_38(e);
      hashCode = ji2.ensureInt(hashCode);
    }
    return hashCode;
  };
  ju.singleton = function singleton(o) {
    ju.$clinit_Collections();
    var set_0;
    set_0 = new ju.HashSet_0(1);
    set_0.add(o);
    return ju.unmodifiableSet(set_0);
  };
  ju.unmodifiableList = function unmodifiableList(list) {
    ju.$clinit_Collections();
    return instanceOf(list, 126) ? new ju.Collections$UnmodifiableRandomAccessList(list) : new ju.Collections$UnmodifiableList(list);
  };
  ju.unmodifiableMap = function unmodifiableMap(map_0) {
    ju.$clinit_Collections();
    return new ju.Collections$UnmodifiableMap(map_0);
  };
  ju.unmodifiableSet = function unmodifiableSet(set_0) {
    ju.$clinit_Collections();
    return new ju.Collections$UnmodifiableSet(set_0);
  };
  defineClass(700, 1, { 1: 1 });
  cggl.Ljava_util_Collections_2_classLit = createForClass("java.util", "Collections", 700, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Enumeration = function $clinit_Enumeration() {
    ju.$clinit_Enumeration = emptyMethod;
  };
  cggl.Ljava_util_Enumeration_2_classLit = createForInterface("java.util", "Enumeration");
  ju.$clinit_Collections$1 = function $clinit_Collections$1() {
    ju.$clinit_Collections$1 = emptyMethod;
  };
  defineClass(707, 1, { 1: 1 });
  cggl.Ljava_util_Collections$1_2_classLit = createForClass("java.util", "Collections/1", 707, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Collections$EmptyList = function $clinit_Collections$EmptyList() {
    ju.$clinit_Collections$EmptyList = emptyMethod;
    ju.$clinit_AbstractList();
  };
  ju.Collections$EmptyList = function Collections$EmptyList() {
    ju.$clinit_Collections$EmptyList();
    ju.AbstractList.call(this);
    this.$init_340();
  };
  defineClass(405, 138, { 4: 1, 1: 1, 29: 1, 59: 1, 126: 1 }, ju.Collections$EmptyList);
  _.$init_340 = function $init_340() {
  };
  _.contains = function contains_18(object) {
    return false;
  };
  _.getAtIndex = function get_29(location_0) {
    ji2.checkElementIndex(location_0, 0);
    return null;
  };
  _.iterator = function iterator_7() {
    return ju.emptyIterator();
  };
  _.listIterator = function listIterator_1() {
    return ju.emptyListIterator();
  };
  _.size = function size_18() {
    return 0;
  };
  cggl.Ljava_util_Collections$EmptyList_2_classLit = createForClass("java.util", "Collections/EmptyList", 405, cggl.Ljava_util_AbstractList_2_classLit);
  ju.$clinit_Collections$EmptyListIterator = function $clinit_Collections$EmptyListIterator() {
    ju.$clinit_Collections$EmptyListIterator = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
    ju.INSTANCE_0 = new ju.Collections$EmptyListIterator();
  };
  ju.Collections$EmptyListIterator = function Collections$EmptyListIterator() {
    Object_0.call(this);
    this.$init_341();
  };
  defineClass(406, 1, { 1: 1, 41: 1, 830: 1 }, ju.Collections$EmptyListIterator);
  _.$init_341 = function $init_341() {
  };
  _.forEachRemaining_0 = function forEachRemaining_10(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.hasNext_0 = function hasNext_7() {
    return false;
  };
  _.next_3 = function next_12() {
    throw toJs(new ju.NoSuchElementException());
  };
  _.remove_2 = function remove_25() {
    throw toJs(new jl.IllegalStateException());
  };
  cggl.Ljava_util_Collections$EmptyListIterator_2_classLit = createForClass("java.util", "Collections/EmptyListIterator", 406, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Collections$EmptyMap = function $clinit_Collections$EmptyMap() {
    ju.$clinit_Collections$EmptyMap = emptyMethod;
    ju.$clinit_AbstractMap();
  };
  ju.Collections$EmptyMap = function Collections$EmptyMap() {
    ju.$clinit_Collections$EmptyMap();
    ju.AbstractMap.call(this);
    this.$init_342();
  };
  defineClass(408, 139, { 4: 1, 1: 1, 55: 1 }, ju.Collections$EmptyMap);
  _.$init_342 = function $init_342() {
  };
  _.containsKey = function containsKey_2(key) {
    return false;
  };
  _.containsValue = function containsValue_2(value_0) {
    return false;
  };
  _.entrySet_0 = function entrySet_1() {
    return ju.$clinit_Collections(), ju.EMPTY_SET;
  };
  _.get = function get_30(key) {
    return null;
  };
  _.keySet = function keySet_1() {
    return ju.$clinit_Collections(), ju.EMPTY_SET;
  };
  _.size = function size_19() {
    return 0;
  };
  _.values = function values_7() {
    return ju.$clinit_Collections(), ju.EMPTY_LIST;
  };
  cggl.Ljava_util_Collections$EmptyMap_2_classLit = createForClass("java.util", "Collections/EmptyMap", 408, cggl.Ljava_util_AbstractMap_2_classLit);
  ju.$clinit_Collections$EmptySet = function $clinit_Collections$EmptySet() {
    ju.$clinit_Collections$EmptySet = emptyMethod;
    ju.$clinit_AbstractSet();
  };
  ju.Collections$EmptySet = function Collections$EmptySet() {
    ju.$clinit_Collections$EmptySet();
    ju.AbstractSet.call(this);
    this.$init_343();
  };
  defineClass(407, 99, { 4: 1, 1: 1, 29: 1, 56: 1 }, ju.Collections$EmptySet);
  _.$init_343 = function $init_343() {
  };
  _.contains = function contains_19(object) {
    return false;
  };
  _.iterator = function iterator_8() {
    return ju.emptyIterator();
  };
  _.size = function size_20() {
    return 0;
  };
  cggl.Ljava_util_Collections$EmptySet_2_classLit = createForClass("java.util", "Collections/EmptySet", 407, cggl.Ljava_util_AbstractSet_2_classLit);
  ju.$clinit_Collections$LifoQueue = function $clinit_Collections$LifoQueue() {
    ju.$clinit_Collections$LifoQueue = emptyMethod;
  };
  defineClass(701, 404, { 4: 1, 1: 1, 29: 1 });
  cggl.Ljava_util_Collections$LifoQueue_2_classLit = createForClass("java.util", "Collections/LifoQueue", 701, cggl.Ljava_util_AbstractQueue_2_classLit);
  ju.$clinit_Collections$RandomHolder = function $clinit_Collections$RandomHolder() {
    ju.$clinit_Collections$RandomHolder = emptyMethod;
  };
  defineClass(706, 1, { 1: 1 });
  cggl.Ljava_util_Collections$RandomHolder_2_classLit = createForClass("java.util", "Collections/RandomHolder", 706, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Collections$SetFromMap = function $clinit_Collections$SetFromMap() {
    ju.$clinit_Collections$SetFromMap = emptyMethod;
  };
  defineClass(702, 99, { 4: 1, 1: 1, 29: 1, 56: 1 });
  cggl.Ljava_util_Collections$SetFromMap_2_classLit = createForClass("java.util", "Collections/SetFromMap", 702, cggl.Ljava_util_AbstractSet_2_classLit);
  ju.$clinit_Collections$SingletonList = function $clinit_Collections$SingletonList() {
    ju.$clinit_Collections$SingletonList = emptyMethod;
  };
  defineClass(703, 138, { 4: 1, 1: 1, 29: 1, 59: 1 });
  cggl.Ljava_util_Collections$SingletonList_2_classLit = createForClass("java.util", "Collections/SingletonList", 703, cggl.Ljava_util_AbstractList_2_classLit);
  ju.$clinit_Collections$UnmodifiableCollection = function $clinit_Collections$UnmodifiableCollection() {
    ju.$clinit_Collections$UnmodifiableCollection = emptyMethod;
    jl.$clinit_Object();
    jl.$clinit_Iterable();
    ju.$clinit_Collection();
  };
  ju.Collections$UnmodifiableCollection = function Collections$UnmodifiableCollection(coll) {
    ju.$clinit_Collections$UnmodifiableCollection();
    Object_0.call(this);
    this.$init_344();
    this.coll = coll;
  };
  defineClass(162, 1, { 1: 1, 29: 1 }, ju.Collections$UnmodifiableCollection);
  _.$init_344 = function $init_344() {
  };
  _.forEach = function forEach_3(action) {
    jl.$forEach(this, action);
  };
  _.spliterator_0 = function spliterator_5() {
    return ju.$spliterator_0(this);
  };
  _.stream = function stream_0() {
    return ju.$stream(this);
  };
  _.add = function add_28(o) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.addAll = function addAll_4(c) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.clear = function clear_20() {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.contains = function contains_20(o) {
    return this.coll.contains(o);
  };
  _.containsAll = function containsAll_0(c) {
    return this.coll.containsAll(c);
  };
  _.isEmpty = function isEmpty_8() {
    return this.coll.isEmpty();
  };
  _.iterator = function iterator_9() {
    return new ju.Collections$UnmodifiableCollectionIterator(this.coll.iterator());
  };
  _.remove = function remove_26(o) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.removeAll = function removeAll_2(c) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.retainAll = function retainAll_0(c) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.size = function size_21() {
    return this.coll.size();
  };
  _.toArray = function toArray_10() {
    return this.coll.toArray();
  };
  _.toArray_0 = function toArray_11(a) {
    return this.coll.toArray_0(a);
  };
  _.toString_0 = function toString_60() {
    return toString_29(this.coll);
  };
  cggl.Ljava_util_Collections$UnmodifiableCollection_2_classLit = createForClass("java.util", "Collections/UnmodifiableCollection", 162, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Collections$UnmodifiableCollectionIterator = function $clinit_Collections$UnmodifiableCollectionIterator() {
    ju.$clinit_Collections$UnmodifiableCollectionIterator = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
  };
  ju.Collections$UnmodifiableCollectionIterator = function Collections$UnmodifiableCollectionIterator(it) {
    ju.$clinit_Collections$UnmodifiableCollectionIterator();
    Object_0.call(this);
    this.$init_345();
    this.it = it;
  };
  defineClass(212, 1, { 1: 1, 41: 1 }, ju.Collections$UnmodifiableCollectionIterator);
  _.$init_345 = function $init_345() {
  };
  _.forEachRemaining_0 = function forEachRemaining_11(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.hasNext_0 = function hasNext_8() {
    return this.it.hasNext_0();
  };
  _.next_3 = function next_13() {
    return this.it.next_3();
  };
  _.remove_2 = function remove_27() {
    throw toJs(new jl.UnsupportedOperationException());
  };
  cggl.Ljava_util_Collections$UnmodifiableCollectionIterator_2_classLit = createForClass("java.util", "Collections/UnmodifiableCollectionIterator", 212, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Collections$UnmodifiableList = function $clinit_Collections$UnmodifiableList() {
    ju.$clinit_Collections$UnmodifiableList = emptyMethod;
    ju.$clinit_Collections$UnmodifiableCollection();
    jl.$clinit_Iterable();
    ju.$clinit_Collection();
    ju.$clinit_List();
  };
  ju.Collections$UnmodifiableList = function Collections$UnmodifiableList(list) {
    ju.$clinit_Collections$UnmodifiableList();
    ju.Collections$UnmodifiableCollection.call(this, list);
    this.$init_346();
    this.list = list;
  };
  defineClass(210, 162, { 1: 1, 29: 1, 59: 1 }, ju.Collections$UnmodifiableList);
  _.$init_346 = function $init_346() {
  };
  _.spliterator_0 = function spliterator_6() {
    return ju.$spliterator_1(this);
  };
  _.addAtIndex = function add_29(index_0, element) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.addAllAtIndex = function addAll_5(index_0, c) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.equals_0 = function equals_40(o) {
    return jl.equals_Ljava_lang_Object__Z__devirtual$(this.list, o);
  };
  _.getAtIndex = function get_31(index_0) {
    return this.list.getAtIndex(index_0);
  };
  _.hashCode_1 = function hashCode_34() {
    return jl.hashCode__I__devirtual$(this.list);
  };
  _.indexOf = function indexOf_6(o) {
    return this.list.indexOf(o);
  };
  _.isEmpty = function isEmpty_9() {
    return this.list.isEmpty();
  };
  _.lastIndexOf = function lastIndexOf_4(o) {
    return this.list.lastIndexOf(o);
  };
  _.listIterator = function listIterator_2() {
    return this.listIterator_0(0);
  };
  _.listIterator_0 = function listIterator_3(from) {
    return new ju.Collections$UnmodifiableListIterator(this.list.listIterator_0(from));
  };
  _.removeAtIndex = function remove_28(index_0) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.replaceAll = function replaceAll_3(operator) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.setAtIndex = function set_10(index_0, element) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.sort_0 = function sort_9(c) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.subList = function subList_0(fromIndex, toIndex) {
    return new ju.Collections$UnmodifiableList(this.list.subList(fromIndex, toIndex));
  };
  cggl.Ljava_util_Collections$UnmodifiableList_2_classLit = createForClass("java.util", "Collections/UnmodifiableList", 210, cggl.Ljava_util_Collections$UnmodifiableCollection_2_classLit);
  ju.$clinit_Collections$UnmodifiableListIterator = function $clinit_Collections$UnmodifiableListIterator() {
    ju.$clinit_Collections$UnmodifiableListIterator = emptyMethod;
    ju.$clinit_Collections$UnmodifiableCollectionIterator();
    ju.$clinit_Iterator();
  };
  ju.Collections$UnmodifiableListIterator = function Collections$UnmodifiableListIterator(lit) {
    ju.$clinit_Collections$UnmodifiableListIterator();
    ju.Collections$UnmodifiableCollectionIterator.call(this, lit);
    this.$init_347();
    this.lit = lit;
  };
  defineClass(412, 212, { 1: 1, 41: 1 }, ju.Collections$UnmodifiableListIterator);
  _.$init_347 = function $init_347() {
  };
  _.remove_2 = function remove_29() {
    getClassPrototype(212).remove_2.call(this);
  };
  cggl.Ljava_util_Collections$UnmodifiableListIterator_2_classLit = createForClass("java.util", "Collections/UnmodifiableListIterator", 412, cggl.Ljava_util_Collections$UnmodifiableCollectionIterator_2_classLit);
  ju.$clinit_Collections$UnmodifiableMap = function $clinit_Collections$UnmodifiableMap() {
    ju.$clinit_Collections$UnmodifiableMap = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Map();
  };
  ju.Collections$UnmodifiableMap = function Collections$UnmodifiableMap(map_0) {
    ju.$clinit_Collections$UnmodifiableMap();
    Object_0.call(this);
    this.$init_348();
    this.map_0 = map_0;
  };
  defineClass(409, 1, { 1: 1, 55: 1 }, ju.Collections$UnmodifiableMap);
  _.$init_348 = function $init_348() {
  };
  _.compute = function compute_0(key, remappingFunction) {
    return ju.$compute(this, key, remappingFunction);
  };
  _.computeIfAbsent = function computeIfAbsent_0(key, remappingFunction) {
    return ju.$computeIfAbsent(this, key, remappingFunction);
  };
  _.computeIfPresent = function computeIfPresent_0(key, remappingFunction) {
    return ju.$computeIfPresent(this, key, remappingFunction);
  };
  _.forEach_0 = function forEach_4(consumer) {
    ju.$forEach_0(this, consumer);
  };
  _.getOrDefault = function getOrDefault_0(key, defaultValue) {
    return ju.$getOrDefault(this, key, defaultValue);
  };
  _.merge = function merge_1(key, value_0, remappingFunction) {
    return ju.$merge(this, key, value_0, remappingFunction);
  };
  _.putIfAbsent = function putIfAbsent_0(key, value_0) {
    return ju.$putIfAbsent(this, key, value_0);
  };
  _.remove_3 = function remove_31(key, value_0) {
    return ju.$remove_0(this, key, value_0);
  };
  _.replace = function replace_2(key, value_0) {
    return ju.$replace_1(this, key, value_0);
  };
  _.replace_0 = function replace_3(key, oldValue, newValue) {
    return ju.$replace_2(this, key, oldValue, newValue);
  };
  _.replaceAll_0 = function replaceAll_4(function_0) {
    ju.$replaceAll_1(this, function_0);
  };
  _.clear = function clear_21() {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.containsKey = function containsKey_3(key) {
    return this.map_0.containsKey(key);
  };
  _.containsValue = function containsValue_3(val) {
    return this.map_0.containsValue(val);
  };
  _.entrySet_0 = function entrySet_2() {
    if (isNull(this.entrySet)) {
      this.entrySet = new ju.Collections$UnmodifiableMap$UnmodifiableEntrySet(this.map_0.entrySet_0());
    }
    return this.entrySet;
  };
  _.equals_0 = function equals_41(o) {
    return jl.equals_Ljava_lang_Object__Z__devirtual$(this.map_0, o);
  };
  _.get = function get_32(key) {
    return this.map_0.get(key);
  };
  _.hashCode_1 = function hashCode_35() {
    return jl.hashCode__I__devirtual$(this.map_0);
  };
  _.isEmpty = function isEmpty_10() {
    return this.map_0.isEmpty();
  };
  _.keySet = function keySet_2() {
    if (isNull(this.keySet_0)) {
      this.keySet_0 = new ju.Collections$UnmodifiableSet(this.map_0.keySet());
    }
    return this.keySet_0;
  };
  _.put = function put_1(key, value_0) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.putAll = function putAll_0(t) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.remove = function remove_30(key) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.size = function size_22() {
    return this.map_0.size();
  };
  _.toString_0 = function toString_61() {
    return toString_29(this.map_0);
  };
  _.values = function values_8() {
    if (isNull(this.values_0)) {
      this.values_0 = new ju.Collections$UnmodifiableCollection(this.map_0.values());
    }
    return this.values_0;
  };
  cggl.Ljava_util_Collections$UnmodifiableMap_2_classLit = createForClass("java.util", "Collections/UnmodifiableMap", 409, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Collections$UnmodifiableSet = function $clinit_Collections$UnmodifiableSet() {
    ju.$clinit_Collections$UnmodifiableSet = emptyMethod;
    ju.$clinit_Collections$UnmodifiableCollection();
    jl.$clinit_Iterable();
    ju.$clinit_Collection();
    ju.$clinit_Set();
  };
  ju.Collections$UnmodifiableSet = function Collections$UnmodifiableSet(set_0) {
    ju.$clinit_Collections$UnmodifiableSet();
    ju.Collections$UnmodifiableCollection.call(this, set_0);
    this.$init_349();
  };
  defineClass(211, 162, { 1: 1, 29: 1, 56: 1 }, ju.Collections$UnmodifiableSet);
  _.$init_349 = function $init_349() {
  };
  _.spliterator_0 = function spliterator_7() {
    return ju.$spliterator_2(this);
  };
  _.equals_0 = function equals_42(o) {
    return jl.equals_Ljava_lang_Object__Z__devirtual$(this.coll, o);
  };
  _.hashCode_1 = function hashCode_36() {
    return jl.hashCode__I__devirtual$(this.coll);
  };
  cggl.Ljava_util_Collections$UnmodifiableSet_2_classLit = createForClass("java.util", "Collections/UnmodifiableSet", 211, cggl.Ljava_util_Collections$UnmodifiableCollection_2_classLit);
  ju.$clinit_Collections$UnmodifiableMap$UnmodifiableEntrySet = function $clinit_Collections$UnmodifiableMap$UnmodifiableEntrySet() {
    ju.$clinit_Collections$UnmodifiableMap$UnmodifiableEntrySet = emptyMethod;
    ju.$clinit_Collections$UnmodifiableSet();
  };
  ju.Collections$UnmodifiableMap$UnmodifiableEntrySet = function Collections$UnmodifiableMap$UnmodifiableEntrySet(s) {
    ju.$clinit_Collections$UnmodifiableMap$UnmodifiableEntrySet();
    ju.Collections$UnmodifiableSet.call(this, castTo(s, 56));
    this.$init_350();
  };
  defineClass(410, 211, { 1: 1, 29: 1, 56: 1 }, ju.Collections$UnmodifiableMap$UnmodifiableEntrySet);
  _.$init_350 = function $init_350() {
  };
  _.contains = function contains_21(o) {
    return this.coll.contains(o);
  };
  _.containsAll = function containsAll_1(o) {
    return this.coll.containsAll(o);
  };
  _.iterator = function iterator_10() {
    var it;
    it = castTo(this.coll.iterator(), 41);
    return new ju.Collections$UnmodifiableMap$UnmodifiableEntrySet$1(this, it);
  };
  _.toArray = function toArray_12() {
    var array;
    array = getClassPrototype(162).toArray.call(this);
    this.wrap(array, array.length);
    return array;
  };
  _.toArray_0 = function toArray_13(a) {
    var result;
    result = getClassPrototype(162).toArray_0.call(this, a);
    this.wrap(result, this.coll.size());
    return castToArray(result);
  };
  _.wrap = function wrap(array, size_0) {
    var i;
    for (i = 0; i < size_0; ++i) {
      setCheck(array, i, new ju.Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry(castTo(array[i], 27)));
    }
  };
  cggl.Ljava_util_Collections$UnmodifiableMap$UnmodifiableEntrySet_2_classLit = createForClass("java.util", "Collections/UnmodifiableMap/UnmodifiableEntrySet", 410, cggl.Ljava_util_Collections$UnmodifiableSet_2_classLit);
  ju.$clinit_Collections$UnmodifiableMap$UnmodifiableEntrySet$1 = function $clinit_Collections$UnmodifiableMap$UnmodifiableEntrySet$1() {
    ju.$clinit_Collections$UnmodifiableMap$UnmodifiableEntrySet$1 = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
  };
  ju.Collections$UnmodifiableMap$UnmodifiableEntrySet$1 = function Collections$UnmodifiableMap$UnmodifiableEntrySet$1(this$2, val$it) {
    ju.$clinit_Collections$UnmodifiableMap$UnmodifiableEntrySet$1();
    this.this$21 = this$2;
    this.val$it2 = val$it;
    Object_0.call(this);
    this.$init_351();
  };
  defineClass(413, 1, { 1: 1, 41: 1 }, ju.Collections$UnmodifiableMap$UnmodifiableEntrySet$1);
  _.$init_351 = function $init_351() {
  };
  _.forEachRemaining_0 = function forEachRemaining_12(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.next_3 = function next_14() {
    return this.next_4();
  };
  _.hasNext_0 = function hasNext_9() {
    return this.val$it2.hasNext_0();
  };
  _.next_4 = function next_15() {
    return new ju.Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry(castTo(this.val$it2.next_3(), 27));
  };
  _.remove_2 = function remove_32() {
    throw toJs(new jl.UnsupportedOperationException());
  };
  cggl.Ljava_util_Collections$UnmodifiableMap$UnmodifiableEntrySet$1_2_classLit = createForClass("java.util", "Collections/UnmodifiableMap/UnmodifiableEntrySet/1", 413, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry = function $clinit_Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry() {
    ju.$clinit_Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry = emptyMethod;
    jl.$clinit_Object();
  };
  ju.Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry = function Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry(entry) {
    ju.$clinit_Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry();
    Object_0.call(this);
    this.$init_352();
    this.entry = entry;
  };
  defineClass(254, 1, { 1: 1, 27: 1 }, ju.Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry);
  _.$init_352 = function $init_352() {
  };
  _.equals_0 = function equals_43(o) {
    return this.entry.equals_0(o);
  };
  _.getKey_0 = function getKey_1() {
    return this.entry.getKey_0();
  };
  _.getValue_0 = function getValue_2() {
    return this.entry.getValue_0();
  };
  _.hashCode_1 = function hashCode_37() {
    return this.entry.hashCode_1();
  };
  _.setValue = function setValue_1(value_0) {
    throw toJs(new jl.UnsupportedOperationException());
  };
  _.toString_0 = function toString_62() {
    return toString_29(this.entry);
  };
  cggl.Ljava_util_Collections$UnmodifiableMap$UnmodifiableEntrySet$UnmodifiableEntry_2_classLit = createForClass("java.util", "Collections/UnmodifiableMap/UnmodifiableEntrySet/UnmodifiableEntry", 254, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Collections$UnmodifiableRandomAccessList = function $clinit_Collections$UnmodifiableRandomAccessList() {
    ju.$clinit_Collections$UnmodifiableRandomAccessList = emptyMethod;
    ju.$clinit_Collections$UnmodifiableList();
  };
  ju.Collections$UnmodifiableRandomAccessList = function Collections$UnmodifiableRandomAccessList(list) {
    ju.$clinit_Collections$UnmodifiableRandomAccessList();
    ju.Collections$UnmodifiableList.call(this, list);
    this.$init_353();
  };
  defineClass(411, 210, { 1: 1, 29: 1, 59: 1, 126: 1 }, ju.Collections$UnmodifiableRandomAccessList);
  _.$init_353 = function $init_353() {
  };
  cggl.Ljava_util_Collections$UnmodifiableRandomAccessList_2_classLit = createForClass("java.util", "Collections/UnmodifiableRandomAccessList", 411, cggl.Ljava_util_Collections$UnmodifiableList_2_classLit);
  ju.$clinit_Collections$UnmodifiableSortedMap = function $clinit_Collections$UnmodifiableSortedMap() {
    ju.$clinit_Collections$UnmodifiableSortedMap = emptyMethod;
  };
  defineClass(704, 409, { 1: 1, 55: 1 });
  cggl.Ljava_util_Collections$UnmodifiableSortedMap_2_classLit = createForClass("java.util", "Collections/UnmodifiableSortedMap", 704, cggl.Ljava_util_Collections$UnmodifiableMap_2_classLit);
  ju.$clinit_Collections$UnmodifiableSortedSet = function $clinit_Collections$UnmodifiableSortedSet() {
    ju.$clinit_Collections$UnmodifiableSortedSet = emptyMethod;
  };
  defineClass(705, 211, { 1: 1, 29: 1, 56: 1 });
  cggl.Ljava_util_Collections$UnmodifiableSortedSet_2_classLit = createForClass("java.util", "Collections/UnmodifiableSortedSet", 705, cggl.Ljava_util_Collections$UnmodifiableSet_2_classLit);
  ju.$clinit_Comparator$lambda$0$Type = function $clinit_Comparator$lambda$0$Type() {
    ju.$clinit_Comparator$lambda$0$Type = emptyMethod;
  };
  defineClass(551, 1, { 4: 1, 1: 1, 36: 1 });
  cggl.Ljava_util_Comparator$lambda$0$Type_2_classLit = createForClass("java.util", "Comparator/lambda$0$Type", 551, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Comparator$lambda$1$Type = function $clinit_Comparator$lambda$1$Type() {
    ju.$clinit_Comparator$lambda$1$Type = emptyMethod;
  };
  defineClass(552, 1, { 4: 1, 1: 1, 36: 1 });
  cggl.Ljava_util_Comparator$lambda$1$Type_2_classLit = createForClass("java.util", "Comparator/lambda$1$Type", 552, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Comparator$lambda$2$Type = function $clinit_Comparator$lambda$2$Type() {
    ju.$clinit_Comparator$lambda$2$Type = emptyMethod;
  };
  ju.Comparator$lambda$2$Type = function Comparator$lambda$2$Type(keyExtractor_0) {
    ju.$clinit_Comparator$lambda$2$Type();
    this.keyExtractor_0 = keyExtractor_0;
  };
  defineClass(302, 1, { 4: 1, 1: 1, 36: 1 }, ju.Comparator$lambda$2$Type);
  _.compare_0 = function compare_33(a, b) {
    return ju.lambda$2(this.keyExtractor_0, a, b);
  };
  _.equals_0 = function equals_44(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  cggl.Ljava_util_Comparator$lambda$2$Type_2_classLit = createForClass("java.util", "Comparator/lambda$2$Type", 302, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Comparator$lambda$3$Type = function $clinit_Comparator$lambda$3$Type() {
    ju.$clinit_Comparator$lambda$3$Type = emptyMethod;
  };
  defineClass(553, 1, { 4: 1, 1: 1, 36: 1 });
  cggl.Ljava_util_Comparator$lambda$3$Type_2_classLit = createForClass("java.util", "Comparator/lambda$3$Type", 553, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Comparator$lambda$4$Type = function $clinit_Comparator$lambda$4$Type() {
    ju.$clinit_Comparator$lambda$4$Type = emptyMethod;
  };
  defineClass(554, 1, { 4: 1, 1: 1, 36: 1 });
  cggl.Ljava_util_Comparator$lambda$4$Type_2_classLit = createForClass("java.util", "Comparator/lambda$4$Type", 554, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Comparators = function $clinit_Comparators() {
    ju.$clinit_Comparators = emptyMethod;
    jl.$clinit_Object();
    ju.INTERNAL_NATURAL_ORDER = new ju.Comparators$NaturalOrderComparator();
    ju.NATURAL_ORDER = new ju.Comparators$NaturalOrderComparator();
    ju.REVERSE_NATURAL_ORDER = new ju.Comparators$ReverseNaturalOrderComparator();
  };
  ju.nullToNaturalOrder = function nullToNaturalOrder(cmp) {
    ju.$clinit_Comparators();
    return isNull(cmp) ? castTo(ju.INTERNAL_NATURAL_ORDER, 36) : cmp;
  };
  defineClass(756, 1, { 1: 1 });
  cggl.Ljava_util_Comparators_2_classLit = createForClass("java.util", "Comparators", 756, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Comparators$NaturalOrderComparator = function $clinit_Comparators$NaturalOrderComparator() {
    ju.$clinit_Comparators$NaturalOrderComparator = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Comparator();
  };
  ju.Comparators$NaturalOrderComparator = function Comparators$NaturalOrderComparator() {
    ju.$clinit_Comparators$NaturalOrderComparator();
    Object_0.call(this);
    this.$init_354();
  };
  defineClass(268, 1, { 4: 1, 1: 1, 36: 1 }, ju.Comparators$NaturalOrderComparator);
  _.$init_354 = function $init_354() {
  };
  _.compare_0 = function compare_35(a, b) {
    return this.compare_9(castTo(a, 22), castTo(b, 22));
  };
  _.equals_0 = function equals_45(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  _.compare_9 = function compare_34(a, b) {
    return jl.compareTo_Ljava_lang_Object__I__devirtual$_0(castTo(ji2.checkNotNull_0(a), 22), ji2.checkNotNull_0(b));
  };
  cggl.Ljava_util_Comparators$NaturalOrderComparator_2_classLit = createForClass("java.util", "Comparators/NaturalOrderComparator", 268, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Comparators$NullComparator = function $clinit_Comparators$NullComparator() {
    ju.$clinit_Comparators$NullComparator = emptyMethod;
  };
  defineClass(758, 1, { 4: 1, 1: 1, 36: 1 });
  cggl.Ljava_util_Comparators$NullComparator_2_classLit = createForClass("java.util", "Comparators/NullComparator", 758, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Comparators$ReverseNaturalOrderComparator = function $clinit_Comparators$ReverseNaturalOrderComparator() {
    ju.$clinit_Comparators$ReverseNaturalOrderComparator = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Comparator();
  };
  ju.Comparators$ReverseNaturalOrderComparator = function Comparators$ReverseNaturalOrderComparator() {
    ju.$clinit_Comparators$ReverseNaturalOrderComparator();
    Object_0.call(this);
    this.$init_355();
  };
  defineClass(459, 1, { 4: 1, 1: 1, 36: 1 }, ju.Comparators$ReverseNaturalOrderComparator);
  _.$init_355 = function $init_355() {
  };
  _.compare_0 = function compare_37(a, b) {
    return this.compare_9(castTo(a, 22), castTo(b, 22));
  };
  _.equals_0 = function equals_46(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  _.compare_9 = function compare_36(a, b) {
    return jl.compareTo_Ljava_lang_Object__I__devirtual$_0(castTo(ji2.checkNotNull_0(b), 22), ji2.checkNotNull_0(a));
  };
  cggl.Ljava_util_Comparators$ReverseNaturalOrderComparator_2_classLit = createForClass("java.util", "Comparators/ReverseNaturalOrderComparator", 459, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Comparators$ReversedComparator = function $clinit_Comparators$ReversedComparator() {
    ju.$clinit_Comparators$ReversedComparator = emptyMethod;
  };
  defineClass(757, 1, { 4: 1, 1: 1, 36: 1 });
  cggl.Ljava_util_Comparators$ReversedComparator_2_classLit = createForClass("java.util", "Comparators/ReversedComparator", 757, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_ConcurrentModificationException = function $clinit_ConcurrentModificationException() {
    ju.$clinit_ConcurrentModificationException = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  ju.ConcurrentModificationException = function ConcurrentModificationException() {
    ju.$clinit_ConcurrentModificationException();
    jl.RuntimeException.call(this);
    this.$init_356();
  };
  defineClass(279, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, ju.ConcurrentModificationException);
  _.$init_356 = function $init_356() {
  };
  cggl.Ljava_util_ConcurrentModificationException_2_classLit = createForClass("java.util", "ConcurrentModificationException", 279, cggl.Ljava_lang_RuntimeException_2_classLit);
  ju.$clinit_Enumeration$1 = function $clinit_Enumeration$1() {
    ju.$clinit_Enumeration$1 = emptyMethod;
  };
  defineClass(708, 1, { 1: 1, 41: 1 });
  cggl.Ljava_util_Enumeration$1_2_classLit = createForClass("java.util", "Enumeration/1", 708, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_HashMap = function $clinit_HashMap() {
    ju.$clinit_HashMap = emptyMethod;
    ju.$clinit_AbstractHashMap();
  };
  ju.HashMap = function HashMap() {
    ju.$clinit_HashMap();
    ju.AbstractHashMap.call(this);
    this.$init_357();
  };
  ju.HashMap_0 = function HashMap_0(ignored) {
    ju.$clinit_HashMap();
    ju.AbstractHashMap_0.call(this, ignored);
    this.$init_357();
  };
  defineClass(69, 206, { 4: 1, 1: 1, 55: 1 }, ju.HashMap, ju.HashMap_0);
  _.$init_357 = function $init_357() {
  };
  _.equals_4 = function equals_47(value1, value2) {
    return ju.equals_48(value1, value2);
  };
  _.getHashCode = function getHashCode(key) {
    var hashCode;
    if (jsEquals(key, null)) {
      return 0;
    }
    hashCode = jl.hashCode__I__devirtual$(key);
    return ji2.ensureInt(hashCode);
  };
  cggl.Ljava_util_HashMap_2_classLit = createForClass("java.util", "HashMap", 69, cggl.Ljava_util_AbstractHashMap_2_classLit);
  ju.$clinit_HashSet = function $clinit_HashSet() {
    ju.$clinit_HashSet = emptyMethod;
    ju.$clinit_AbstractSet();
    jl.$clinit_Iterable();
    ju.$clinit_Collection();
    ju.$clinit_Set();
  };
  ju.HashSet = function HashSet() {
    ju.$clinit_HashSet();
    ju.AbstractSet.call(this);
    this.$init_358();
    this.map_0 = new ju.HashMap();
  };
  ju.HashSet_0 = function HashSet_0(initialCapacity) {
    ju.$clinit_HashSet();
    ju.AbstractSet.call(this);
    this.$init_358();
    this.map_0 = new ju.HashMap_0(initialCapacity);
  };
  defineClass(70, 99, { 4: 1, 1: 1, 29: 1, 70: 1, 56: 1 }, ju.HashSet, ju.HashSet_0);
  _.$init_358 = function $init_358() {
  };
  _.add = function add_30(o) {
    var old;
    old = this.map_0.put(o, this);
    return jsEquals(old, null);
  };
  _.clear = function clear_22() {
    this.map_0.clear();
  };
  _.contains = function contains_22(o) {
    return this.map_0.containsKey(o);
  };
  _.isEmpty = function isEmpty_11() {
    return this.map_0.isEmpty();
  };
  _.iterator = function iterator_11() {
    return this.map_0.keySet().iterator();
  };
  _.remove = function remove_33(o) {
    return jsNotEquals(this.map_0.remove(o), null);
  };
  _.size = function size_23() {
    return this.map_0.size();
  };
  cggl.Ljava_util_HashSet_2_classLit = createForClass("java.util", "HashSet", 70, cggl.Ljava_util_AbstractSet_2_classLit);
  ju.$clinit_InternalHashCodeMap = function $clinit_InternalHashCodeMap() {
    ju.$clinit_InternalHashCodeMap = emptyMethod;
    jl.$clinit_Object();
    jl.$clinit_Iterable();
  };
  ju.InternalHashCodeMap = function InternalHashCodeMap(host) {
    ju.$clinit_InternalHashCodeMap();
    Object_0.call(this);
    this.$init_359();
    this.host = host;
  };
  defineClass(464, 1, { 1: 1 }, ju.InternalHashCodeMap);
  _.$init_359 = function $init_359() {
    this.backingMap = ju.newJsMap();
  };
  _.forEach = function forEach_5(action) {
    jl.$forEach(this, action);
  };
  _.spliterator_0 = function spliterator_8() {
    return jl.$spliterator(this);
  };
  _.findEntryInChain = function findEntryInChain(key, chain) {
    var entry, entry$array, entry$index, entry$max;
    for (entry$array = chain, entry$index = 0, entry$max = entry$array.length; entry$index < entry$max; ++entry$index) {
      entry = entry$array[entry$index];
      if (this.host.equals_4(key, entry.getKey_0())) {
        return entry;
      }
    }
    return null;
  };
  _.getChainOrEmpty = function getChainOrEmpty(hashCode) {
    var chain;
    chain = ji2.uncheckedCast(this.backingMap.get(hashCode));
    return jsEquals(chain, null) ? this.newEntryChain() : chain;
  };
  _.getEntry_0 = function getEntry(key) {
    return this.findEntryInChain(key, this.getChainOrEmpty(this.hash(key)));
  };
  _.hash = function hash_0(key) {
    return this.host.getHashCode(key);
  };
  _.iterator = function iterator_12() {
    return new ju.InternalHashCodeMap$1(this);
  };
  _.newEntryChain = function newEntryChain() {
    ju.$clinit_InternalHashCodeMap();
    return ji2.uncheckedCast(initUnidimensionalArray(cggl.Ljava_lang_Object_2_classLit, { 4: 1, 1: 1, 7: 1 }, 1, 0, 5, 1));
  };
  _.put_0 = function put_2(key, value_0) {
    var chain, entry, hashCode;
    hashCode = this.hash(key);
    chain = this.getChainOrEmpty(hashCode);
    if (chain.length == 0) {
      this.backingMap.set(hashCode, chain);
    } else {
      entry = this.findEntryInChain(key, chain);
      if (isNotNull(entry)) {
        return entry.setValue(value_0);
      }
    }
    setCheck(chain, chain.length, new ju.AbstractMap$SimpleEntry(key, value_0));
    this.size_0++;
    this.host.structureChanged();
    return null;
  };
  _.remove_5 = function remove_34(key) {
    var chain, entry, hashCode, i;
    hashCode = this.hash(key);
    chain = this.getChainOrEmpty(hashCode);
    for (i = 0; i < chain.length; i++) {
      entry = chain[i];
      if (this.host.equals_4(key, entry.getKey_0())) {
        if (chain.length == 1) {
          ji2.setLength_0(chain, 0);
          ju.$delete(this.backingMap, hashCode);
        } else {
          ji2.removeFrom(chain, i, 1);
        }
        this.size_0--;
        this.host.structureChanged();
        return entry.getValue_0();
      }
    }
    return null;
  };
  _.size_1 = function size_24() {
    return this.size_0;
  };
  _.size_0 = 0;
  cggl.Ljava_util_InternalHashCodeMap_2_classLit = createForClass("java.util", "InternalHashCodeMap", 464, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_InternalHashCodeMap$1 = function $clinit_InternalHashCodeMap$1() {
    ju.$clinit_InternalHashCodeMap$1 = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
  };
  ju.InternalHashCodeMap$1 = function InternalHashCodeMap$1(this$0) {
    ju.$clinit_InternalHashCodeMap$1();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_360();
  };
  defineClass(465, 1, { 1: 1, 41: 1 }, ju.InternalHashCodeMap$1);
  _.$init_360 = function $init_360() {
    this.chains = this.this$01.backingMap.entries();
    this.itemIndex = 0;
    this.chain = this.this$01.newEntryChain();
    this.lastEntry = null;
  };
  _.forEachRemaining_0 = function forEachRemaining_13(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.next_3 = function next_16() {
    return this.next_4();
  };
  _.hasNext_0 = function hasNext_10() {
    var current;
    if (this.itemIndex < this.chain.length) {
      return true;
    }
    current = this.chains.next();
    if (!current.done) {
      this.chain = ji2.uncheckedCast(ju.$getValue(current));
      this.itemIndex = 0;
      return true;
    }
    return false;
  };
  _.next_4 = function next_17() {
    this.lastEntry = this.chain[this.itemIndex++];
    return this.lastEntry;
  };
  _.remove_2 = function remove_35() {
    this.this$01.remove_5(this.lastEntry.getKey_0());
    if (this.itemIndex != 0) {
      this.itemIndex--;
    }
  };
  _.itemIndex = 0;
  cggl.Ljava_util_InternalHashCodeMap$1_2_classLit = createForClass("java.util", "InternalHashCodeMap/1", 465, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_InternalJsMap = function $clinit_InternalJsMap() {
    ju.$clinit_InternalJsMap = emptyMethod;
  };
  ju.$delete = function $delete(this$static, key) {
    ju.$clinit_InternalJsMap();
    var fn;
    fn = ji2.getProperty(this$static, "delete");
    fn.call(this$static, key);
  };
  ju.$delete_0 = function $delete_0(this$static, key) {
    ju.$clinit_InternalJsMap();
    var fn;
    fn = ji2.getProperty(this$static, "delete");
    fn.call(this$static, key);
  };
  ju.$clinit_InternalJsMap$DeleteFunction = function $clinit_InternalJsMap$DeleteFunction() {
    ju.$clinit_InternalJsMap$DeleteFunction = emptyMethod;
  };
  ju.$clinit_InternalJsMap$Iterator = function $clinit_InternalJsMap$Iterator() {
    ju.$clinit_InternalJsMap$Iterator = emptyMethod;
  };
  ju.$clinit_InternalJsMap$IteratorEntry = function $clinit_InternalJsMap$IteratorEntry() {
    ju.$clinit_InternalJsMap$IteratorEntry = emptyMethod;
  };
  ju.$getKey = function $getKey(this$static) {
    ju.$clinit_InternalJsMap$IteratorEntry();
    return ji2.uncheckedCast(this$static.value[0]);
  };
  ju.$getValue = function $getValue(this$static) {
    ju.$clinit_InternalJsMap$IteratorEntry();
    return ji2.uncheckedCast(this$static.value[1]);
  };
  ju.$clinit_InternalJsMapFactory = function $clinit_InternalJsMapFactory() {
    ju.$clinit_InternalJsMapFactory = emptyMethod;
    jl.$clinit_Object();
    ju.jsMapCtor = ju.getJsMapConstructor();
  };
  ju.canHandleObjectCreateAndProto = function canHandleObjectCreateAndProto() {
    if (!Object.create || !Object.getOwnPropertyNames) {
      return false;
    }
    var protoField = "__proto__";
    var map_0 = /* @__PURE__ */ Object.create(null);
    if (map_0[protoField] !== void 0) {
      return false;
    }
    var keys_0 = Object.getOwnPropertyNames(map_0);
    if (keys_0.length != 0) {
      return false;
    }
    map_0[protoField] = 42;
    if (map_0[protoField] !== 42) {
      return false;
    }
    if (Object.getOwnPropertyNames(map_0).length == 0) {
      return false;
    }
    return true;
  };
  ju.getJsMapConstructor = function getJsMapConstructor() {
    function isCorrectIterationProtocol() {
      try {
        return (/* @__PURE__ */ new Map()).entries().next().done;
      } catch (e) {
        return false;
      }
    }
    if (typeof Map === "function" && (Map.prototype.entries && isCorrectIterationProtocol())) {
      return Map;
    } else {
      return ju.getJsMapPolyFill();
    }
  };
  ju.getJsMapPolyFill = function getJsMapPolyFill() {
    function Stringmap() {
      this.obj = this.createObject();
    }
    ;
    Stringmap.prototype.createObject = function(key) {
      return /* @__PURE__ */ Object.create(null);
    };
    Stringmap.prototype.get = function(key) {
      return this.obj[key];
    };
    Stringmap.prototype.set = function(key, value_0) {
      this.obj[key] = value_0;
    };
    Stringmap.prototype["delete"] = function(key) {
      delete this.obj[key];
    };
    Stringmap.prototype.keys = function() {
      return Object.getOwnPropertyNames(this.obj);
    };
    Stringmap.prototype.entries = function() {
      var keys_0 = this.keys();
      var map_0 = this;
      var nextIndex = 0;
      return {
        next: function() {
          if (nextIndex >= keys_0.length)
            return { done: true };
          var key = keys_0[nextIndex++];
          return { value: [key, map_0.get(key)], done: false };
        }
      };
    };
    if (!ju.canHandleObjectCreateAndProto()) {
      Stringmap.prototype.createObject = function() {
        return {};
      };
      Stringmap.prototype.get = function(key) {
        return this.obj[":" + key];
      };
      Stringmap.prototype.set = function(key, value_0) {
        this.obj[":" + key] = value_0;
      };
      Stringmap.prototype["delete"] = function(key) {
        delete this.obj[":" + key];
      };
      Stringmap.prototype.keys = function() {
        var result = [];
        for (var key in this.obj) {
          if (key.charCodeAt(0) == 58) {
            result.push(key.substring(1));
          }
        }
        return result;
      };
    }
    return Stringmap;
  };
  ju.newJsMap = function newJsMap() {
    ju.$clinit_InternalJsMapFactory();
    return new ju.jsMapCtor();
  };
  defineClass(815, 1, { 1: 1 });
  cggl.Ljava_util_InternalJsMapFactory_2_classLit = createForClass("java.util", "InternalJsMapFactory", 815, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_InternalStringMap = function $clinit_InternalStringMap() {
    ju.$clinit_InternalStringMap = emptyMethod;
    jl.$clinit_Object();
    jl.$clinit_Iterable();
  };
  ju.InternalStringMap = function InternalStringMap(host) {
    ju.$clinit_InternalStringMap();
    Object_0.call(this);
    this.$init_361();
    this.host = host;
  };
  ju.toNullIfUndefined = function toNullIfUndefined(value_0) {
    return ji2.isUndefined(value_0) ? null : value_0;
  };
  defineClass(460, 1, { 1: 1 }, ju.InternalStringMap);
  _.$init_361 = function $init_361() {
    this.backingMap = ju.newJsMap();
  };
  _.forEach = function forEach_6(action) {
    jl.$forEach(this, action);
  };
  _.spliterator_0 = function spliterator_9() {
    return jl.$spliterator(this);
  };
  _.contains_1 = function contains_23(key) {
    return !ji2.isUndefined(this.backingMap.get(key));
  };
  _.get_5 = function get_33(key) {
    return this.backingMap.get(key);
  };
  _.iterator = function iterator_13() {
    return new ju.InternalStringMap$1(this);
  };
  _.newMapEntry = function newMapEntry(entry, lastValueMod) {
    ju.$clinit_InternalStringMap();
    return new ju.InternalStringMap$2(this, entry, lastValueMod);
  };
  _.put_1 = function put_3(key, value_0) {
    var oldValue;
    oldValue = this.backingMap.get(key);
    this.backingMap.set(key, ju.toNullIfUndefined(value_0));
    if (ji2.isUndefined(oldValue)) {
      this.size_0++;
      this.host.structureChanged();
    } else {
      this.valueMod++;
    }
    return oldValue;
  };
  _.remove_6 = function remove_36(key) {
    var value_0;
    value_0 = this.backingMap.get(key);
    if (!ji2.isUndefined(value_0)) {
      ju.$delete_0(this.backingMap, key);
      this.size_0--;
      this.host.structureChanged();
    } else {
      this.valueMod++;
    }
    return value_0;
  };
  _.size_1 = function size_25() {
    return this.size_0;
  };
  _.size_0 = 0;
  _.valueMod = 0;
  cggl.Ljava_util_InternalStringMap_2_classLit = createForClass("java.util", "InternalStringMap", 460, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_InternalStringMap$1 = function $clinit_InternalStringMap$1() {
    ju.$clinit_InternalStringMap$1 = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
  };
  ju.InternalStringMap$1 = function InternalStringMap$1(this$0) {
    ju.$clinit_InternalStringMap$1();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_362();
  };
  defineClass(461, 1, { 1: 1, 41: 1 }, ju.InternalStringMap$1);
  _.$init_362 = function $init_362() {
    this.entries_0 = this.this$01.backingMap.entries();
    this.current = this.entries_0.next();
  };
  _.forEachRemaining_0 = function forEachRemaining_14(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.next_3 = function next_18() {
    return this.next_4();
  };
  _.hasNext_0 = function hasNext_11() {
    return !this.current.done;
  };
  _.next_4 = function next_19() {
    this.last = this.current;
    this.current = this.entries_0.next();
    return this.this$01.newMapEntry(this.last, this.this$01.valueMod);
  };
  _.remove_2 = function remove_37() {
    this.this$01.remove_6(ju.$getKey(this.last));
  };
  cggl.Ljava_util_InternalStringMap$1_2_classLit = createForClass("java.util", "InternalStringMap/1", 461, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_InternalStringMap$2 = function $clinit_InternalStringMap$2() {
    ju.$clinit_InternalStringMap$2 = emptyMethod;
    ju.$clinit_AbstractMapEntry();
  };
  ju.InternalStringMap$2 = function InternalStringMap$2(this$0, val$entry, val$lastValueMod) {
    ju.$clinit_InternalStringMap$2();
    this.this$01 = this$0;
    this.val$entry2 = val$entry;
    this.val$lastValueMod3 = val$lastValueMod;
    ju.AbstractMapEntry.call(this);
    this.$init_363();
  };
  defineClass(463, 462, { 1: 1, 27: 1 }, ju.InternalStringMap$2);
  _.$init_363 = function $init_363() {
  };
  _.getKey_0 = function getKey_2() {
    return ju.$getKey(this.val$entry2);
  };
  _.getValue_0 = function getValue_3() {
    if (this.this$01.valueMod != this.val$lastValueMod3) {
      return this.this$01.get_5(ju.$getKey(this.val$entry2));
    }
    return ju.$getValue(this.val$entry2);
  };
  _.setValue = function setValue_2(object) {
    return this.this$01.put_1(ju.$getKey(this.val$entry2), object);
  };
  _.val$lastValueMod3 = 0;
  cggl.Ljava_util_InternalStringMap$2_2_classLit = createForClass("java.util", "InternalStringMap/2", 463, cggl.Ljava_util_AbstractMapEntry_2_classLit);
  ju.$clinit_Locale = function $clinit_Locale() {
    ju.$clinit_Locale = emptyMethod;
    jl.$clinit_Object();
    ju.ROOT = new ju.Locale$1();
    ju.ENGLISH = new ju.Locale$2();
    ju.US = new ju.Locale$3();
    ju.defaultLocale = new ju.Locale$4();
  };
  ju.Locale = function Locale() {
    ju.$clinit_Locale();
    Object_0.call(this);
    this.$init_364();
  };
  ju.getDefault = function getDefault() {
    ju.$clinit_Locale();
    return ju.defaultLocale;
  };
  defineClass(169, 1, { 1: 1 });
  _.$init_364 = function $init_364() {
  };
  cggl.Ljava_util_Locale_2_classLit = createForClass("java.util", "Locale", 169, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Locale$1 = function $clinit_Locale$1() {
    ju.$clinit_Locale$1 = emptyMethod;
    ju.$clinit_Locale();
  };
  ju.Locale$1 = function Locale$1() {
    ju.$clinit_Locale$1();
    ju.Locale.call(this);
    this.$init_365();
  };
  defineClass(305, 169, { 1: 1 }, ju.Locale$1);
  _.$init_365 = function $init_365() {
  };
  _.toString_0 = function toString_63() {
    return "";
  };
  cggl.Ljava_util_Locale$1_2_classLit = createForClass("java.util", "Locale/1", 305, cggl.Ljava_util_Locale_2_classLit);
  ju.$clinit_Locale$2 = function $clinit_Locale$2() {
    ju.$clinit_Locale$2 = emptyMethod;
    ju.$clinit_Locale();
  };
  ju.Locale$2 = function Locale$2() {
    ju.$clinit_Locale$2();
    ju.Locale.call(this);
    this.$init_366();
  };
  defineClass(306, 169, { 1: 1 }, ju.Locale$2);
  _.$init_366 = function $init_366() {
  };
  _.toString_0 = function toString_64() {
    return "en";
  };
  cggl.Ljava_util_Locale$2_2_classLit = createForClass("java.util", "Locale/2", 306, cggl.Ljava_util_Locale_2_classLit);
  ju.$clinit_Locale$3 = function $clinit_Locale$3() {
    ju.$clinit_Locale$3 = emptyMethod;
    ju.$clinit_Locale();
  };
  ju.Locale$3 = function Locale$3() {
    ju.$clinit_Locale$3();
    ju.Locale.call(this);
    this.$init_367();
  };
  defineClass(307, 169, { 1: 1 }, ju.Locale$3);
  _.$init_367 = function $init_367() {
  };
  _.toString_0 = function toString_65() {
    return "en_US";
  };
  cggl.Ljava_util_Locale$3_2_classLit = createForClass("java.util", "Locale/3", 307, cggl.Ljava_util_Locale_2_classLit);
  ju.$clinit_Locale$4 = function $clinit_Locale$4() {
    ju.$clinit_Locale$4 = emptyMethod;
    ju.$clinit_Locale();
  };
  ju.Locale$4 = function Locale$4() {
    ju.$clinit_Locale$4();
    ju.Locale.call(this);
    this.$init_368();
  };
  defineClass(308, 169, { 1: 1 }, ju.Locale$4);
  _.$init_368 = function $init_368() {
  };
  _.toString_0 = function toString_66() {
    return "unknown";
  };
  cggl.Ljava_util_Locale$4_2_classLit = createForClass("java.util", "Locale/4", 308, cggl.Ljava_util_Locale_2_classLit);
  juf.$clinit_Function = function $clinit_Function() {
    juf.$clinit_Function = emptyMethod;
  };
  juf.$andThen = function $andThen(this$static, after) {
    ji2.checkCriticalNotNull(after);
    return new juf.Function$lambda$1$Type(this$static, after);
  };
  juf.$lambda$1 = function $lambda$1(this$static, after_1, t_1) {
    return after_1.apply_1(this$static.apply_1(t_1));
  };
  juf.identity_0 = function identity_0() {
    juf.$clinit_Function();
    return new juf.Function$lambda$0$Type();
  };
  juf.lambda$0_5 = function lambda$0_5(t_0) {
    juf.$clinit_Function();
    return t_0;
  };
  cggl.Ljava_util_function_Function_2_classLit = createForInterface("java.util.function", "Function");
  ju.$clinit_Map$0methodref$getKey$Type = function $clinit_Map$0methodref$getKey$Type() {
    ju.$clinit_Map$0methodref$getKey$Type = emptyMethod;
  };
  ju.Map$0methodref$getKey$Type = function Map$0methodref$getKey$Type() {
    ju.$clinit_Map$0methodref$getKey$Type();
  };
  defineClass(360, 1, { 1: 1 }, ju.Map$0methodref$getKey$Type);
  _.andThen = function andThen(after) {
    return juf.$andThen(this, after);
  };
  _.apply_1 = function apply_2(arg0) {
    return castTo(arg0, 27).getKey_0();
  };
  cggl.Ljava_util_Map$0methodref$getKey$Type_2_classLit = createForClass("java.util", "Map/0methodref$getKey$Type", 360, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Map$1methodref$getValue$Type = function $clinit_Map$1methodref$getValue$Type() {
    ju.$clinit_Map$1methodref$getValue$Type = emptyMethod;
  };
  ju.Map$1methodref$getValue$Type = function Map$1methodref$getValue$Type() {
    ju.$clinit_Map$1methodref$getValue$Type();
  };
  defineClass(361, 1, { 1: 1 }, ju.Map$1methodref$getValue$Type);
  _.andThen = function andThen_0(after) {
    return juf.$andThen(this, after);
  };
  _.apply_1 = function apply_3(arg0) {
    return castTo(arg0, 27).getValue_0();
  };
  cggl.Ljava_util_Map$1methodref$getValue$Type_2_classLit = createForClass("java.util", "Map/1methodref$getValue$Type", 361, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Map$Entry$lambda$0$Type = function $clinit_Map$Entry$lambda$0$Type() {
    ju.$clinit_Map$Entry$lambda$0$Type = emptyMethod;
  };
  defineClass(618, 1, { 4: 1, 1: 1, 36: 1 });
  cggl.Ljava_util_Map$Entry$lambda$0$Type_2_classLit = createForClass("java.util", "Map/Entry/lambda$0$Type", 618, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Map$Entry$lambda$1$Type = function $clinit_Map$Entry$lambda$1$Type() {
    ju.$clinit_Map$Entry$lambda$1$Type = emptyMethod;
  };
  defineClass(619, 1, { 4: 1, 1: 1, 36: 1 });
  cggl.Ljava_util_Map$Entry$lambda$1$Type_2_classLit = createForClass("java.util", "Map/Entry/lambda$1$Type", 619, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_NoSuchElementException = function $clinit_NoSuchElementException() {
    ju.$clinit_NoSuchElementException = emptyMethod;
    jl.$clinit_RuntimeException();
  };
  ju.NoSuchElementException = function NoSuchElementException() {
    ju.$clinit_NoSuchElementException();
    jl.RuntimeException.call(this);
    this.$init_369();
  };
  defineClass(277, 23, { 4: 1, 12: 1, 1: 1, 23: 1, 18: 1 }, ju.NoSuchElementException);
  _.$init_369 = function $init_369() {
  };
  cggl.Ljava_util_NoSuchElementException_2_classLit = createForClass("java.util", "NoSuchElementException", 277, cggl.Ljava_lang_RuntimeException_2_classLit);
  ju.$clinit_Objects = function $clinit_Objects() {
    ju.$clinit_Objects = emptyMethod;
    jl.$clinit_Object();
  };
  ju.equals_48 = function equals_48(a, b) {
    ju.$clinit_Objects();
    return maskUndefined(a) === maskUndefined(b) || jsNotEquals(a, null) && jl.equals_Ljava_lang_Object__Z__devirtual$(a, b);
  };
  function equals_49(a, b) {
    ju.$clinit_Objects();
    return jsEquals(a, b);
  }
  function hash_1(values) {
    ju.$clinit_Objects();
    return ju.hashCode_30(values);
  }
  function hashCode_38(o) {
    ju.$clinit_Objects();
    return jsNotEquals(o, null) ? jl.hashCode__I__devirtual$(o) : 0;
  }
  ju.requireNonNull = function requireNonNull(obj) {
    ju.$clinit_Objects();
    if (jsEquals(obj, null)) {
      throw toJs(new jl.NullPointerException());
    }
    return obj;
  };
  defineClass(622, 1, { 1: 1 });
  cggl.Ljava_util_Objects_2_classLit = createForClass("java.util", "Objects", 622, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_PrimitiveIterator$OfDouble = function $clinit_PrimitiveIterator$OfDouble() {
    ju.$clinit_PrimitiveIterator$OfDouble = emptyMethod;
  };
  cggl.Ljava_util_PrimitiveIterator$OfDouble_2_classLit = createForInterface("java.util", "PrimitiveIterator/OfDouble");
  juf.$clinit_DoubleConsumer = function $clinit_DoubleConsumer() {
    juf.$clinit_DoubleConsumer = emptyMethod;
  };
  cggl.Ljava_util_function_DoubleConsumer_2_classLit = createForInterface("java.util.function", "DoubleConsumer");
  ju.$clinit_PrimitiveIterator$OfDouble$0methodref$accept$Type = function $clinit_PrimitiveIterator$OfDouble$0methodref$accept$Type() {
    ju.$clinit_PrimitiveIterator$OfDouble$0methodref$accept$Type = emptyMethod;
  };
  defineClass(508, 1, { 1: 1 });
  cggl.Ljava_util_PrimitiveIterator$OfDouble$0methodref$accept$Type_2_classLit = createForClass("java.util", "PrimitiveIterator/OfDouble/0methodref$accept$Type", 508, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_IntConsumer = function $clinit_IntConsumer() {
    juf.$clinit_IntConsumer = emptyMethod;
  };
  cggl.Ljava_util_function_IntConsumer_2_classLit = createForInterface("java.util.function", "IntConsumer");
  ju.$clinit_PrimitiveIterator$OfInt$1methodref$accept$Type = function $clinit_PrimitiveIterator$OfInt$1methodref$accept$Type() {
    ju.$clinit_PrimitiveIterator$OfInt$1methodref$accept$Type = emptyMethod;
  };
  ju.PrimitiveIterator$OfInt$1methodref$accept$Type = function PrimitiveIterator$OfInt$1methodref$accept$Type($$outer_0) {
    ju.$clinit_PrimitiveIterator$OfInt$1methodref$accept$Type();
    this.$$outer_0 = $$outer_0;
  };
  defineClass(294, 1, { 1: 1, 30: 1 }, ju.PrimitiveIterator$OfInt$1methodref$accept$Type);
  _.accept = function accept(arg0) {
    this.$$outer_0.accept_0(jl.valueOf_12(arg0));
  };
  cggl.Ljava_util_PrimitiveIterator$OfInt$1methodref$accept$Type_2_classLit = createForClass("java.util", "PrimitiveIterator/OfInt/1methodref$accept$Type", 294, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_PrimitiveIterator$OfLong = function $clinit_PrimitiveIterator$OfLong() {
    ju.$clinit_PrimitiveIterator$OfLong = emptyMethod;
  };
  cggl.Ljava_util_PrimitiveIterator$OfLong_2_classLit = createForInterface("java.util", "PrimitiveIterator/OfLong");
  juf.$clinit_LongConsumer = function $clinit_LongConsumer() {
    juf.$clinit_LongConsumer = emptyMethod;
  };
  cggl.Ljava_util_function_LongConsumer_2_classLit = createForInterface("java.util.function", "LongConsumer");
  ju.$clinit_PrimitiveIterator$OfLong$2methodref$accept$Type = function $clinit_PrimitiveIterator$OfLong$2methodref$accept$Type() {
    ju.$clinit_PrimitiveIterator$OfLong$2methodref$accept$Type = emptyMethod;
  };
  defineClass(509, 1, { 1: 1 });
  cggl.Ljava_util_PrimitiveIterator$OfLong$2methodref$accept$Type_2_classLit = createForClass("java.util", "PrimitiveIterator/OfLong/2methodref$accept$Type", 509, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_PriorityQueue = function $clinit_PriorityQueue() {
    ju.$clinit_PriorityQueue = emptyMethod;
    ju.$clinit_AbstractQueue();
  };
  ju.PriorityQueue = function PriorityQueue() {
    ju.$clinit_PriorityQueue();
    ju.PriorityQueue_0.call(this, 11);
  };
  ju.PriorityQueue_0 = function PriorityQueue_0(initialCapacity) {
    ju.PriorityQueue_1.call(this, initialCapacity, null);
  };
  ju.PriorityQueue_1 = function PriorityQueue_1(initialCapacity, cmp) {
    ju.AbstractQueue.call(this);
    this.$init_370();
    this.heap = new ju.ArrayList_0(initialCapacity);
    this.cmp = ju.nullToNaturalOrder(cmp);
  };
  ju.PriorityQueue_2 = function PriorityQueue_2(comparator) {
    ju.$clinit_PriorityQueue();
    ju.PriorityQueue_1.call(this, 11, comparator);
  };
  ju.getLeftChild = function getLeftChild(node) {
    return 2 * node + 1;
  };
  ju.getParent = function getParent(node) {
    return narrow_int((node - 1) / 2);
  };
  ju.getRightChild = function getRightChild(node) {
    return 2 * node + 2;
  };
  ju.isLeaf_0 = function isLeaf_0(node, size_0) {
    return node * 2 + 1 >= size_0;
  };
  defineClass(164, 404, { 1: 1, 29: 1 }, ju.PriorityQueue, ju.PriorityQueue_2);
  _.$init_370 = function $init_370() {
  };
  _.addAll = function addAll_6(c) {
    var e, e$iterator, oldSize;
    ji2.checkNotNull_0(c);
    ji2.checkArgument(jsNotEquals(c, this));
    oldSize = this.heap.size();
    for (e$iterator = c.iterator(); e$iterator.hasNext_0(); ) {
      e = e$iterator.next_3();
      this.heap.add(ji2.checkCriticalNotNull(e));
    }
    if (oldSize != this.heap.size()) {
      this.makeHeap(0);
      return true;
    }
    return false;
  };
  _.clear = function clear_23() {
    this.heap.clear();
  };
  _.contains = function contains_24(o) {
    return this.indexOf_3(o) != -1;
  };
  _.getSmallestChild = function getSmallestChild(node, heapSize) {
    var leftChild, rightChild, smallestChild;
    leftChild = ju.getLeftChild(node);
    rightChild = leftChild + 1;
    smallestChild = leftChild;
    if (rightChild < heapSize && this.cmp.compare_0(this.heap.getAtIndex(rightChild), this.heap.getAtIndex(leftChild)) < 0) {
      smallestChild = rightChild;
    }
    return smallestChild;
  };
  _.indexOf_3 = function indexOf_7(o) {
    return jsEquals(o, null) ? -1 : this.heap.indexOf(o);
  };
  _.isLeaf = function isLeaf(node) {
    return ju.isLeaf_0(node, this.heap.size());
  };
  _.iterator = function iterator_14() {
    return new ju.PriorityQueue$1(this);
  };
  _.makeHeap = function makeHeap(node) {
    var rightChild;
    if (this.isLeaf(node)) {
      return;
    }
    this.makeHeap(ju.getLeftChild(node));
    rightChild = ju.getRightChild(node);
    if (rightChild < this.heap.size()) {
      this.makeHeap(rightChild);
    }
    this.mergeHeaps(node);
  };
  _.mergeHeaps = function mergeHeaps(node) {
    var heapSize, smallestChild, value_0;
    heapSize = this.heap.size();
    value_0 = this.heap.getAtIndex(node);
    while (!ju.isLeaf_0(node, heapSize)) {
      smallestChild = this.getSmallestChild(node, heapSize);
      if (this.cmp.compare_0(value_0, this.heap.getAtIndex(smallestChild)) < 0) {
        break;
      }
      this.heap.setAtIndex(node, this.heap.getAtIndex(smallestChild));
      node = smallestChild;
    }
    this.heap.setAtIndex(node, value_0);
  };
  _.offer = function offer_0(e) {
    var childNode, node;
    ji2.checkCriticalNotNull(e);
    node = this.heap.size();
    this.heap.add(e);
    while (node > 0) {
      childNode = node;
      node = ju.getParent(node);
      if (this.cmp.compare_0(this.heap.getAtIndex(node), e) <= 0) {
        this.heap.setAtIndex(childNode, e);
        return true;
      }
      this.heap.setAtIndex(childNode, this.heap.getAtIndex(node));
    }
    this.heap.setAtIndex(node, e);
    return true;
  };
  _.peek_0 = function peek_1() {
    return this.heap.isEmpty() ? null : this.heap.getAtIndex(0);
  };
  _.poll = function poll_0() {
    var value_0;
    value_0 = this.peek_0();
    if (jsNotEquals(value_0, null)) {
      this.removeAtIndex_1(0);
    }
    return value_0;
  };
  _.remove = function remove_38(o) {
    var index_0;
    index_0 = this.indexOf_3(o);
    if (index_0 < 0) {
      return false;
    }
    this.removeAtIndex_1(index_0);
    return true;
  };
  _.removeAll = function removeAll_3(c) {
    if (this.heap.removeAll(c)) {
      this.makeHeap(0);
      return true;
    }
    return false;
  };
  _.removeAtIndex_1 = function removeAtIndex_0(index_0) {
    ju.$clinit_PriorityQueue();
    var lastValue;
    lastValue = this.heap.removeAtIndex(this.heap.size() - 1);
    if (index_0 < this.heap.size()) {
      this.heap.setAtIndex(index_0, lastValue);
      this.mergeHeaps(index_0);
    }
  };
  _.retainAll = function retainAll_1(c) {
    if (this.heap.retainAll(c)) {
      this.makeHeap(0);
      return true;
    }
    return false;
  };
  _.size = function size_26() {
    return this.heap.size();
  };
  _.spliterator_0 = function spliterator_10() {
    return ju.spliterator_11(this, 256);
  };
  _.toArray = function toArray_14() {
    return this.heap.toArray();
  };
  _.toArray_0 = function toArray_15(a) {
    return this.heap.toArray_0(a);
  };
  ju.DEFAULT_INITIAL_CAPACITY = 11;
  cggl.Ljava_util_PriorityQueue_2_classLit = createForClass("java.util", "PriorityQueue", 164, cggl.Ljava_util_AbstractQueue_2_classLit);
  ju.$clinit_PriorityQueue$1 = function $clinit_PriorityQueue$1() {
    ju.$clinit_PriorityQueue$1 = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
  };
  ju.PriorityQueue$1 = function PriorityQueue$1(this$0) {
    ju.$clinit_PriorityQueue$1();
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_371();
  };
  defineClass(488, 1, { 1: 1, 41: 1 }, ju.PriorityQueue$1);
  _.$init_371 = function $init_371() {
    this.i = 0;
    this.last = -1;
  };
  _.forEachRemaining_0 = function forEachRemaining_15(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.hasNext_0 = function hasNext_12() {
    return this.i < this.this$01.heap.size();
  };
  _.next_3 = function next_20() {
    ji2.checkElement(this.hasNext_0());
    this.last = this.i++;
    return this.this$01.heap.getAtIndex(this.last);
  };
  _.remove_2 = function remove_39() {
    ji2.checkState(this.last != -1);
    this.this$01.removeAtIndex_1(this.i = this.last);
    this.last = -1;
  };
  _.i = 0;
  _.last = 0;
  cggl.Ljava_util_PriorityQueue$1_2_classLit = createForClass("java.util", "PriorityQueue/1", 488, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Random = function $clinit_Random() {
    ju.$clinit_Random = emptyMethod;
    var i, i0, twoToTheXMinus24Tmp, twoToTheXMinus48Tmp;
    jl.$clinit_Object();
    ju.twoToTheXMinus24 = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 25, 15, 1);
    ju.twoToTheXMinus48 = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 33, 15, 1);
    {
      twoToTheXMinus48Tmp = 152587890625e-16;
      for (i0 = 32; i0 >= 0; i0--) {
        ju.twoToTheXMinus48[i0] = twoToTheXMinus48Tmp;
        twoToTheXMinus48Tmp *= 0.5;
      }
      twoToTheXMinus24Tmp = 1;
      for (i = 24; i >= 0; i--) {
        ju.twoToTheXMinus24[i] = twoToTheXMinus24Tmp;
        twoToTheXMinus24Tmp *= 0.5;
      }
    }
  };
  ju.Random = function Random() {
    ju.$clinit_Random();
    var hi, lo, seed;
    Object_0.call(this);
    this.$init_372();
    seed = ju.uniqueSeed++ + Date.now();
    hi = round_int($wnd.Math.floor(seed * 5960464477539063e-23)) & 16777215;
    lo = round_int(seed - hi * 16777216);
    this.setSeed(hi, lo);
  };
  ju.Random_0 = function Random_0(seed) {
    ju.$clinit_Random();
    Object_0.call(this);
    this.$init_372();
    this.setSeed_0(seed);
  };
  defineClass(86, 1, { 1: 1 }, ju.Random, ju.Random_0);
  _.$init_372 = function $init_372() {
    this.haveNextNextGaussian = false;
  };
  _.nextDouble = function nextDouble() {
    return this.nextInternal(26) * 14901161193847656e-24 + this.nextInternal(27) * 11102230246251565e-32;
  };
  _.nextInt = function nextInt_0() {
    return round_int(this.nextInternal(32));
  };
  _.nextInt_0 = function nextInt_1(n) {
    var bits, val;
    ji2.checkCriticalArgument_0(n > 0);
    if ((n & -n) == n) {
      return round_int(n * this.nextInternal(31) * 4656612873077393e-25);
    }
    do {
      bits = this.nextInternal(31);
      val = bits % n;
    } while (bits - val + (n - 1) < 0);
    return round_int(val);
  };
  _.nextInternal = function nextInternal(bits) {
    var carry, dval, h, hi, l, lo;
    hi = this.seedhi * 15525485 + this.seedlo * 1502;
    lo = this.seedlo * 15525485 + 11;
    carry = $wnd.Math.floor(lo * 5960464477539063e-23);
    hi += carry;
    lo -= carry * 16777216;
    hi %= 16777216;
    this.seedhi = hi;
    this.seedlo = lo;
    if (bits <= 24) {
      return $wnd.Math.floor(this.seedhi * ju.twoToTheXMinus24[bits]);
    } else {
      h = this.seedhi * (1 << bits - 24);
      l = $wnd.Math.floor(this.seedlo * ju.twoToTheXMinus48[bits]);
      dval = h + l;
      if (dval >= 2147483648) {
        dval -= 4294967296;
      }
      return dval;
    }
  };
  _.setSeed = function setSeed(seedhi, seedlo) {
    this.seedhi = seedhi ^ 1502;
    this.seedlo = seedlo ^ 15525485;
    this.haveNextNextGaussian = false;
  };
  _.setSeed_0 = function setSeed_0(seed) {
    this.setSeed(toInt_0(and_0(shr_0(seed, 24), 16777215)), toInt_0(and_0(seed, 16777215)));
  };
  _.haveNextNextGaussian = false;
  _.seedhi = 0;
  _.seedlo = 0;
  ju.multiplierHi = 1502;
  ju.multiplierLo = 15525485;
  ju.twoToThe24 = 16777216;
  ju.twoToThe31 = 2147483648;
  ju.twoToThe32 = 4294967296;
  ju.twoToTheMinus24 = 5960464477539063e-23;
  ju.twoToTheMinus26 = 14901161193847656e-24;
  ju.twoToTheMinus31 = 4656612873077393e-25;
  ju.twoToTheMinus53 = 11102230246251565e-32;
  ju.uniqueSeed = 0;
  cggl.Ljava_util_Random_2_classLit = createForClass("java.util", "Random", 86, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterators$IteratorSpliterator = function $clinit_Spliterators$IteratorSpliterator() {
    ju.$clinit_Spliterators$IteratorSpliterator = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Spliterator();
  };
  ju.Spliterators$IteratorSpliterator = function Spliterators$IteratorSpliterator(collection, characteristics) {
    ju.$clinit_Spliterators$IteratorSpliterator();
    Object_0.call(this);
    this.$init_373();
    this.collection = castTo(ji2.checkNotNull_0(collection), 29);
    this.characteristics = ju.sizeKnownIteratorSpliteratorCharacteristics(characteristics);
  };
  ju.Spliterators$IteratorSpliterator_0 = function Spliterators$IteratorSpliterator_0(it, characteristics) {
    ju.$clinit_Spliterators$IteratorSpliterator();
    Object_0.call(this);
    this.$init_373();
    this.it = castTo(ji2.checkNotNull_0(it), 41);
    this.characteristics = ju.sizeUnknownSpliteratorCharacteristics(characteristics);
    this.estimateSize = { l: 4194303, m: 4194303, h: 524287 };
  };
  defineClass(196, 1, { 1: 1, 20: 1 }, ju.Spliterators$IteratorSpliterator, ju.Spliterators$IteratorSpliterator_0);
  _.$init_373 = function $init_373() {
  };
  _.characteristics_0 = function characteristics_1() {
    return this.characteristics;
  };
  _.estimateSize_0 = function estimateSize_0() {
    this.initIterator();
    return this.estimateSize;
  };
  _.forEachRemaining_0 = function forEachRemaining_16(consumer) {
    this.initIterator();
    this.it.forEachRemaining_0(consumer);
  };
  _.initIterator = function initIterator() {
    if (isNull(this.it)) {
      this.it = this.collection.iterator();
      this.estimateSize = fromInt_0(this.collection.size());
    }
  };
  _.tryAdvance = function tryAdvance_0(consumer) {
    ji2.checkNotNull_0(consumer);
    this.initIterator();
    if (this.it.hasNext_0()) {
      consumer.accept_0(this.it.next_3());
      return true;
    }
    return false;
  };
  _.characteristics = 0;
  _.estimateSize = 0;
  cggl.Ljava_util_Spliterators$IteratorSpliterator_2_classLit = createForClass("java.util", "Spliterators/IteratorSpliterator", 196, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_SortedSet$1 = function $clinit_SortedSet$1() {
    ju.$clinit_SortedSet$1 = emptyMethod;
    ju.$clinit_Spliterators$IteratorSpliterator();
  };
  ju.SortedSet$1 = function SortedSet$1(this$0, $anonymous0, $anonymous1) {
    ju.$clinit_SortedSet$1();
    this.this$01 = this$0;
    ju.Spliterators$IteratorSpliterator.call(this, $anonymous0, $anonymous1);
    this.$init_374();
  };
  defineClass(414, 196, { 1: 1, 20: 1 }, ju.SortedSet$1);
  _.$init_374 = function $init_374() {
  };
  cggl.Ljava_util_SortedSet$1_2_classLit = createForClass("java.util", "SortedSet/1", 414, cggl.Ljava_util_Spliterators$IteratorSpliterator_2_classLit);
  ju.$clinit_Spliterator$OfPrimitive = function $clinit_Spliterator$OfPrimitive() {
    ju.$clinit_Spliterator$OfPrimitive = emptyMethod;
  };
  ju.$forEachRemaining_5 = function $forEachRemaining_5(this$static, consumer) {
    while (this$static.tryAdvance_0(consumer)) {
    }
  };
  cggl.Ljava_util_Spliterator$OfPrimitive_2_classLit = createForInterface("java.util", "Spliterator/OfPrimitive");
  ju.$clinit_Spliterator$OfDouble = function $clinit_Spliterator$OfDouble() {
    ju.$clinit_Spliterator$OfDouble = emptyMethod;
  };
  cggl.Ljava_util_Spliterator$OfDouble_2_classLit = createForInterface("java.util", "Spliterator/OfDouble");
  ju.$clinit_Spliterator$OfDouble$0methodref$accept$Type = function $clinit_Spliterator$OfDouble$0methodref$accept$Type() {
    ju.$clinit_Spliterator$OfDouble$0methodref$accept$Type = emptyMethod;
  };
  defineClass(543, 1, { 1: 1 });
  cggl.Ljava_util_Spliterator$OfDouble$0methodref$accept$Type_2_classLit = createForClass("java.util", "Spliterator/OfDouble/0methodref$accept$Type", 543, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterator$OfDouble$1methodref$accept$Type = function $clinit_Spliterator$OfDouble$1methodref$accept$Type() {
    ju.$clinit_Spliterator$OfDouble$1methodref$accept$Type = emptyMethod;
  };
  defineClass(544, 1, { 1: 1 });
  cggl.Ljava_util_Spliterator$OfDouble$1methodref$accept$Type_2_classLit = createForClass("java.util", "Spliterator/OfDouble/1methodref$accept$Type", 544, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterator$OfInt = function $clinit_Spliterator$OfInt() {
    ju.$clinit_Spliterator$OfInt = emptyMethod;
  };
  ju.$forEachRemaining_4 = function $forEachRemaining_4(this$static, consumer) {
    if (instanceOf(consumer, 30)) {
      this$static.forEachRemaining(castTo(consumer, 30));
    } else {
      this$static.forEachRemaining(castTo(new ju.Spliterator$OfInt$3methodref$accept$Type(consumer), 30));
    }
  };
  ju.$tryAdvance = function $tryAdvance(this$static, consumer) {
    if (instanceOf(consumer, 30)) {
      return this$static.tryAdvance_0(castTo(consumer, 30));
    } else {
      return this$static.tryAdvance_0(castTo(new ju.Spliterator$OfInt$2methodref$accept$Type(consumer), 30));
    }
  };
  cggl.Ljava_util_Spliterator$OfInt_2_classLit = createForInterface("java.util", "Spliterator/OfInt");
  ju.$clinit_Spliterator$OfInt$2methodref$accept$Type = function $clinit_Spliterator$OfInt$2methodref$accept$Type() {
    ju.$clinit_Spliterator$OfInt$2methodref$accept$Type = emptyMethod;
  };
  ju.Spliterator$OfInt$2methodref$accept$Type = function Spliterator$OfInt$2methodref$accept$Type($$outer_0) {
    ju.$clinit_Spliterator$OfInt$2methodref$accept$Type();
    this.$$outer_0 = $$outer_0;
  };
  defineClass(300, 1, { 1: 1, 30: 1 }, ju.Spliterator$OfInt$2methodref$accept$Type);
  _.accept = function accept_0(arg0) {
    this.$$outer_0.accept_0(jl.valueOf_12(arg0));
  };
  cggl.Ljava_util_Spliterator$OfInt$2methodref$accept$Type_2_classLit = createForClass("java.util", "Spliterator/OfInt/2methodref$accept$Type", 300, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterator$OfInt$3methodref$accept$Type = function $clinit_Spliterator$OfInt$3methodref$accept$Type() {
    ju.$clinit_Spliterator$OfInt$3methodref$accept$Type = emptyMethod;
  };
  ju.Spliterator$OfInt$3methodref$accept$Type = function Spliterator$OfInt$3methodref$accept$Type($$outer_0) {
    ju.$clinit_Spliterator$OfInt$3methodref$accept$Type();
    this.$$outer_0 = $$outer_0;
  };
  defineClass(301, 1, { 1: 1, 30: 1 }, ju.Spliterator$OfInt$3methodref$accept$Type);
  _.accept = function accept_1(arg0) {
    this.$$outer_0.accept_0(jl.valueOf_12(arg0));
  };
  cggl.Ljava_util_Spliterator$OfInt$3methodref$accept$Type_2_classLit = createForClass("java.util", "Spliterator/OfInt/3methodref$accept$Type", 301, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterator$OfLong = function $clinit_Spliterator$OfLong() {
    ju.$clinit_Spliterator$OfLong = emptyMethod;
  };
  cggl.Ljava_util_Spliterator$OfLong_2_classLit = createForInterface("java.util", "Spliterator/OfLong");
  ju.$clinit_Spliterator$OfLong$4methodref$accept$Type = function $clinit_Spliterator$OfLong$4methodref$accept$Type() {
    ju.$clinit_Spliterator$OfLong$4methodref$accept$Type = emptyMethod;
  };
  defineClass(545, 1, { 1: 1 });
  cggl.Ljava_util_Spliterator$OfLong$4methodref$accept$Type_2_classLit = createForClass("java.util", "Spliterator/OfLong/4methodref$accept$Type", 545, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterator$OfLong$5methodref$accept$Type = function $clinit_Spliterator$OfLong$5methodref$accept$Type() {
    ju.$clinit_Spliterator$OfLong$5methodref$accept$Type = emptyMethod;
  };
  defineClass(546, 1, { 1: 1 });
  cggl.Ljava_util_Spliterator$OfLong$5methodref$accept$Type_2_classLit = createForClass("java.util", "Spliterator/OfLong/5methodref$accept$Type", 546, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterators = function $clinit_Spliterators() {
    ju.$clinit_Spliterators = emptyMethod;
    jl.$clinit_Object();
  };
  ju.iterator_15 = function iterator_15(spliterator) {
    ju.$clinit_Spliterators();
    return new ju.Spliterators$IntConsumerIterator(spliterator);
  };
  ju.iterator_16 = function iterator_16(spliterator) {
    ju.$clinit_Spliterators();
    return new ju.Spliterators$ConsumerIterator(spliterator);
  };
  ju.sizeKnownIteratorSpliteratorCharacteristics = function sizeKnownIteratorSpliteratorCharacteristics(characteristics) {
    ju.$clinit_Spliterators();
    return (characteristics & 4096) == 0 ? ju.sizeKnownSpliteratorCharacteristics(characteristics) : characteristics;
  };
  ju.sizeKnownSpliteratorCharacteristics = function sizeKnownSpliteratorCharacteristics(characteristics) {
    return characteristics | 64 | 16384;
  };
  ju.sizeUnknownSpliteratorCharacteristics = function sizeUnknownSpliteratorCharacteristics(characteristics) {
    ju.$clinit_Spliterators();
    return characteristics & ~(64 | 16384);
  };
  ju.spliterator_11 = function spliterator_11(c, characteristics) {
    ju.$clinit_Spliterators();
    return new ju.Spliterators$IteratorSpliterator(c, characteristics);
  };
  ju.spliterator_12 = function spliterator_12(it, size_0, characteristics) {
    ju.$clinit_Spliterators();
    return new ju.Spliterators$IntIteratorSpliterator(it, size_0, characteristics);
  };
  ju.spliteratorUnknownSize = function spliteratorUnknownSize(it, characteristics) {
    ju.$clinit_Spliterators();
    return new ju.Spliterators$IteratorSpliterator_0(it, characteristics);
  };
  defineClass(526, 1, { 1: 1 });
  cggl.Ljava_util_Spliterators_2_classLit = createForClass("java.util", "Spliterators", 526, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterators$AbstractDoubleSpliterator = function $clinit_Spliterators$AbstractDoubleSpliterator() {
    ju.$clinit_Spliterators$AbstractDoubleSpliterator = emptyMethod;
  };
  defineClass(527, 231, { 1: 1, 20: 1 });
  cggl.Ljava_util_Spliterators$AbstractDoubleSpliterator_2_classLit = createForClass("java.util", "Spliterators/AbstractDoubleSpliterator", 527, cggl.Ljava_util_Spliterators$BaseSpliterator_2_classLit);
  ju.$clinit_Spliterators$AbstractIntSpliterator = function $clinit_Spliterators$AbstractIntSpliterator() {
    ju.$clinit_Spliterators$AbstractIntSpliterator = emptyMethod;
    ju.$clinit_Spliterators$BaseSpliterator();
    ju.$clinit_Spliterator();
    ju.$clinit_Spliterator$OfPrimitive();
    ju.$clinit_Spliterator$OfInt();
  };
  ju.Spliterators$AbstractIntSpliterator = function Spliterators$AbstractIntSpliterator(size_0, characteristics) {
    ju.$clinit_Spliterators$AbstractIntSpliterator();
    ju.Spliterators$BaseSpliterator.call(this, size_0, characteristics);
    this.$init_375();
  };
  defineClass(232, 231, { 1: 1, 20: 1, 53: 1 });
  _.$init_375 = function $init_375() {
  };
  _.forEachRemaining = function forEachRemaining_17(consumer) {
    ju.$forEachRemaining_5(this, consumer);
  };
  _.forEachRemaining_0 = function forEachRemaining_18(consumer) {
    ju.$forEachRemaining_4(this, consumer);
  };
  _.tryAdvance = function tryAdvance_1(consumer) {
    return ju.$tryAdvance(this, consumer);
  };
  cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit = createForClass("java.util", "Spliterators/AbstractIntSpliterator", 232, cggl.Ljava_util_Spliterators$BaseSpliterator_2_classLit);
  ju.$clinit_Spliterators$AbstractLongSpliterator = function $clinit_Spliterators$AbstractLongSpliterator() {
    ju.$clinit_Spliterators$AbstractLongSpliterator = emptyMethod;
  };
  defineClass(528, 231, { 1: 1, 20: 1 });
  cggl.Ljava_util_Spliterators$AbstractLongSpliterator_2_classLit = createForClass("java.util", "Spliterators/AbstractLongSpliterator", 528, cggl.Ljava_util_Spliterators$BaseSpliterator_2_classLit);
  ju.$clinit_Spliterators$BaseArraySpliterator = function $clinit_Spliterators$BaseArraySpliterator() {
    ju.$clinit_Spliterators$BaseArraySpliterator = emptyMethod;
  };
  defineClass(538, 1, { 1: 1, 20: 1 });
  cggl.Ljava_util_Spliterators$BaseArraySpliterator_2_classLit = createForClass("java.util", "Spliterators/BaseArraySpliterator", 538, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterators$ArraySpliterator = function $clinit_Spliterators$ArraySpliterator() {
    ju.$clinit_Spliterators$ArraySpliterator = emptyMethod;
  };
  defineClass(539, 538, { 1: 1, 20: 1 });
  cggl.Ljava_util_Spliterators$ArraySpliterator_2_classLit = createForClass("java.util", "Spliterators/ArraySpliterator", 539, cggl.Ljava_util_Spliterators$BaseArraySpliterator_2_classLit);
  juf.$clinit_Consumer = function $clinit_Consumer() {
    juf.$clinit_Consumer = emptyMethod;
  };
  cggl.Ljava_util_function_Consumer_2_classLit = createForInterface("java.util.function", "Consumer");
  ju.$clinit_Spliterators$ConsumerIterator = function $clinit_Spliterators$ConsumerIterator() {
    ju.$clinit_Spliterators$ConsumerIterator = emptyMethod;
    jl.$clinit_Object();
    juf.$clinit_Consumer();
    ju.$clinit_Iterator();
  };
  ju.Spliterators$ConsumerIterator = function Spliterators$ConsumerIterator(spliterator) {
    ju.$clinit_Spliterators$ConsumerIterator();
    Object_0.call(this);
    this.$init_376();
    this.spliterator = castTo(ji2.checkNotNull_0(spliterator), 20);
  };
  defineClass(298, 1, { 1: 1, 41: 1 }, ju.Spliterators$ConsumerIterator);
  _.$init_376 = function $init_376() {
    this.hasElement = false;
  };
  _.forEachRemaining_0 = function forEachRemaining_19(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.remove_2 = function remove_40() {
    ju.$remove(this);
  };
  _.accept_0 = function accept_2(element) {
    this.nextElement = element;
  };
  _.hasNext_0 = function hasNext_13() {
    if (!this.hasElement) {
      this.hasElement = this.spliterator.tryAdvance(this);
    }
    return this.hasElement;
  };
  _.next_3 = function next_21() {
    var element;
    ji2.checkCriticalElement(this.hasNext_0());
    this.hasElement = false;
    element = this.nextElement;
    this.nextElement = null;
    return element;
  };
  _.hasElement = false;
  cggl.Ljava_util_Spliterators$ConsumerIterator_2_classLit = createForClass("java.util", "Spliterators/ConsumerIterator", 298, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterators$DoubleArraySpliterator = function $clinit_Spliterators$DoubleArraySpliterator() {
    ju.$clinit_Spliterators$DoubleArraySpliterator = emptyMethod;
  };
  defineClass(540, 538, { 1: 1, 20: 1 });
  cggl.Ljava_util_Spliterators$DoubleArraySpliterator_2_classLit = createForClass("java.util", "Spliterators/DoubleArraySpliterator", 540, cggl.Ljava_util_Spliterators$BaseArraySpliterator_2_classLit);
  ju.$clinit_Spliterators$DoubleConsumerIterator = function $clinit_Spliterators$DoubleConsumerIterator() {
    ju.$clinit_Spliterators$DoubleConsumerIterator = emptyMethod;
  };
  defineClass(534, 1, { 1: 1, 41: 1 });
  cggl.Ljava_util_Spliterators$DoubleConsumerIterator_2_classLit = createForClass("java.util", "Spliterators/DoubleConsumerIterator", 534, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterators$DoubleIteratorSpliterator = function $clinit_Spliterators$DoubleIteratorSpliterator() {
    ju.$clinit_Spliterators$DoubleIteratorSpliterator = emptyMethod;
  };
  defineClass(536, 527, { 1: 1, 20: 1 });
  cggl.Ljava_util_Spliterators$DoubleIteratorSpliterator_2_classLit = createForClass("java.util", "Spliterators/DoubleIteratorSpliterator", 536, cggl.Ljava_util_Spliterators$AbstractDoubleSpliterator_2_classLit);
  ju.$clinit_Spliterators$EmptySpliterator = function $clinit_Spliterators$EmptySpliterator() {
    ju.$clinit_Spliterators$EmptySpliterator = emptyMethod;
  };
  defineClass(529, 1, { 1: 1, 20: 1 });
  cggl.Ljava_util_Spliterators$EmptySpliterator_2_classLit = createForClass("java.util", "Spliterators/EmptySpliterator", 529, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterators$EmptySpliterator$OfDouble = function $clinit_Spliterators$EmptySpliterator$OfDouble() {
    ju.$clinit_Spliterators$EmptySpliterator$OfDouble = emptyMethod;
  };
  defineClass(531, 529, { 1: 1, 20: 1 });
  cggl.Ljava_util_Spliterators$EmptySpliterator$OfDouble_2_classLit = createForClass("java.util", "Spliterators/EmptySpliterator/OfDouble", 531, cggl.Ljava_util_Spliterators$EmptySpliterator_2_classLit);
  ju.$clinit_Spliterators$EmptySpliterator$OfInt = function $clinit_Spliterators$EmptySpliterator$OfInt() {
    ju.$clinit_Spliterators$EmptySpliterator$OfInt = emptyMethod;
  };
  defineClass(532, 529, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_Spliterators$EmptySpliterator$OfInt_2_classLit = createForClass("java.util", "Spliterators/EmptySpliterator/OfInt", 532, cggl.Ljava_util_Spliterators$EmptySpliterator_2_classLit);
  ju.$clinit_Spliterators$EmptySpliterator$OfLong = function $clinit_Spliterators$EmptySpliterator$OfLong() {
    ju.$clinit_Spliterators$EmptySpliterator$OfLong = emptyMethod;
  };
  defineClass(533, 529, { 1: 1, 20: 1 });
  cggl.Ljava_util_Spliterators$EmptySpliterator$OfLong_2_classLit = createForClass("java.util", "Spliterators/EmptySpliterator/OfLong", 533, cggl.Ljava_util_Spliterators$EmptySpliterator_2_classLit);
  ju.$clinit_Spliterators$EmptySpliterator$OfRef = function $clinit_Spliterators$EmptySpliterator$OfRef() {
    ju.$clinit_Spliterators$EmptySpliterator$OfRef = emptyMethod;
  };
  defineClass(530, 529, { 1: 1, 20: 1 });
  cggl.Ljava_util_Spliterators$EmptySpliterator$OfRef_2_classLit = createForClass("java.util", "Spliterators/EmptySpliterator/OfRef", 530, cggl.Ljava_util_Spliterators$EmptySpliterator_2_classLit);
  ju.$clinit_Spliterators$IntArraySpliterator = function $clinit_Spliterators$IntArraySpliterator() {
    ju.$clinit_Spliterators$IntArraySpliterator = emptyMethod;
  };
  defineClass(541, 538, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_Spliterators$IntArraySpliterator_2_classLit = createForClass("java.util", "Spliterators/IntArraySpliterator", 541, cggl.Ljava_util_Spliterators$BaseArraySpliterator_2_classLit);
  ju.$clinit_Spliterators$IntConsumerIterator = function $clinit_Spliterators$IntConsumerIterator() {
    ju.$clinit_Spliterators$IntConsumerIterator = emptyMethod;
    jl.$clinit_Object();
    juf.$clinit_IntConsumer();
    ju.$clinit_Iterator();
    ju.$clinit_PrimitiveIterator$OfInt();
  };
  ju.Spliterators$IntConsumerIterator = function Spliterators$IntConsumerIterator(spliterator) {
    ju.$clinit_Spliterators$IntConsumerIterator();
    Object_0.call(this);
    this.$init_377();
    this.spliterator = castTo(ji2.checkNotNull_0(spliterator), 53);
  };
  defineClass(299, 1, { 1: 1, 41: 1, 295: 1, 30: 1 }, ju.Spliterators$IntConsumerIterator);
  _.$init_377 = function $init_377() {
    this.hasElement = false;
  };
  _.forEachRemaining = function forEachRemaining_20(arg0) {
    this.forEachRemaining_1(castTo(arg0, 30));
  };
  _.forEachRemaining_0 = function forEachRemaining_21(consumer) {
    ju.$forEachRemaining_1(this, consumer);
  };
  _.forEachRemaining_1 = function forEachRemaining_22(consumer) {
    ju.$forEachRemaining_2(this, consumer);
  };
  _.next_2 = function next_22() {
    return ju.$next(this);
  };
  _.next_3 = function next_23() {
    return this.next_2();
  };
  _.remove_2 = function remove_41() {
    ju.$remove(this);
  };
  _.accept = function accept_3(i) {
    this.nextElement = i;
  };
  _.hasNext_0 = function hasNext_14() {
    if (!this.hasElement) {
      this.hasElement = this.spliterator.tryAdvance_0(this);
    }
    return this.hasElement;
  };
  _.nextInt = function nextInt_2() {
    ji2.checkCriticalElement(this.hasNext_0());
    this.hasElement = false;
    return this.nextElement;
  };
  _.hasElement = false;
  _.nextElement = 0;
  cggl.Ljava_util_Spliterators$IntConsumerIterator_2_classLit = createForClass("java.util", "Spliterators/IntConsumerIterator", 299, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterators$IntIteratorSpliterator = function $clinit_Spliterators$IntIteratorSpliterator() {
    ju.$clinit_Spliterators$IntIteratorSpliterator = emptyMethod;
    ju.$clinit_Spliterators$AbstractIntSpliterator();
  };
  ju.Spliterators$IntIteratorSpliterator = function Spliterators$IntIteratorSpliterator(it, size_0, characteristics) {
    ju.$clinit_Spliterators$IntIteratorSpliterator();
    ju.Spliterators$AbstractIntSpliterator.call(this, size_0, ju.sizeKnownIteratorSpliteratorCharacteristics(characteristics));
    this.$init_378();
    this.it = castTo(ji2.checkNotNull_0(it), 295);
  };
  defineClass(297, 232, { 1: 1, 20: 1, 53: 1 }, ju.Spliterators$IntIteratorSpliterator);
  _.$init_378 = function $init_378() {
  };
  _.forEachRemaining = function forEachRemaining_23(consumer) {
    this.forEachRemaining_1(castTo(consumer, 30));
  };
  _.tryAdvance_0 = function tryAdvance_2(consumer) {
    return this.tryAdvance_1(castTo(consumer, 30));
  };
  _.forEachRemaining_1 = function forEachRemaining_24(consumer) {
    this.it.forEachRemaining_1(consumer);
  };
  _.tryAdvance_1 = function tryAdvance_3(consumer) {
    ji2.checkNotNull_0(consumer);
    if (this.it.hasNext_0()) {
      consumer.accept(this.it.nextInt());
      return true;
    }
    return false;
  };
  cggl.Ljava_util_Spliterators$IntIteratorSpliterator_2_classLit = createForClass("java.util", "Spliterators/IntIteratorSpliterator", 297, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  ju.$clinit_Spliterators$LongArraySpliterator = function $clinit_Spliterators$LongArraySpliterator() {
    ju.$clinit_Spliterators$LongArraySpliterator = emptyMethod;
  };
  defineClass(542, 538, { 1: 1, 20: 1 });
  cggl.Ljava_util_Spliterators$LongArraySpliterator_2_classLit = createForClass("java.util", "Spliterators/LongArraySpliterator", 542, cggl.Ljava_util_Spliterators$BaseArraySpliterator_2_classLit);
  ju.$clinit_Spliterators$LongConsumerIterator = function $clinit_Spliterators$LongConsumerIterator() {
    ju.$clinit_Spliterators$LongConsumerIterator = emptyMethod;
  };
  defineClass(535, 1, { 1: 1, 41: 1 });
  cggl.Ljava_util_Spliterators$LongConsumerIterator_2_classLit = createForClass("java.util", "Spliterators/LongConsumerIterator", 535, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_Spliterators$LongIteratorSpliterator = function $clinit_Spliterators$LongIteratorSpliterator() {
    ju.$clinit_Spliterators$LongIteratorSpliterator = emptyMethod;
  };
  defineClass(537, 528, { 1: 1, 20: 1 });
  cggl.Ljava_util_Spliterators$LongIteratorSpliterator_2_classLit = createForClass("java.util", "Spliterators/LongIteratorSpliterator", 537, cggl.Ljava_util_Spliterators$AbstractLongSpliterator_2_classLit);
  ju.$clinit_StringJoiner = function $clinit_StringJoiner() {
    ju.$clinit_StringJoiner = emptyMethod;
    jl.$clinit_Object();
  };
  ju.StringJoiner = function StringJoiner(delimiter) {
    ju.$clinit_StringJoiner();
    ju.StringJoiner_0.call(this, delimiter, "", "");
  };
  ju.StringJoiner_0 = function StringJoiner_0(delimiter, prefix, suffix) {
    ju.$clinit_StringJoiner();
    Object_0.call(this);
    this.$init_379();
    this.delimiter = toString_29(delimiter);
    this.prefix = toString_29(prefix);
    this.suffix = toString_29(suffix);
    this.emptyValue = this.prefix + ("" + this.suffix);
  };
  defineClass(152, 1, { 1: 1 }, ju.StringJoiner, ju.StringJoiner_0);
  _.$init_379 = function $init_379() {
  };
  _.add_12 = function add_31(newElement) {
    this.initBuilderOrAddDelimiter();
    this.builder.append_7(newElement);
    return this;
  };
  _.initBuilderOrAddDelimiter = function initBuilderOrAddDelimiter() {
    if (isNull(this.builder)) {
      this.builder = new jl.StringBuilder_1(this.prefix);
    } else {
      this.builder.append_9(this.delimiter);
    }
  };
  _.length_1 = function length_16() {
    if (isNull(this.builder)) {
      return jl.length__I__devirtual$_0(this.emptyValue);
    }
    return this.builder.length_1() + jl.length__I__devirtual$_0(this.suffix);
  };
  _.toString_0 = function toString_67() {
    if (isNull(this.builder)) {
      return this.emptyValue;
    } else if (jl.isEmpty__Z__devirtual$(this.suffix)) {
      return this.builder.toString_0();
    } else {
      return this.builder.toString_0() + ("" + this.suffix);
    }
  };
  cggl.Ljava_util_StringJoiner_2_classLit = createForClass("java.util", "StringJoiner", 152, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_TreeMap = function $clinit_TreeMap() {
    ju.$clinit_TreeMap = emptyMethod;
    ju.$clinit_AbstractNavigableMap();
  };
  ju.TreeMap = function TreeMap() {
    ju.$clinit_TreeMap();
    ju.TreeMap_0.call(this, castTo(null, 36));
  };
  ju.TreeMap_0 = function TreeMap_0(c) {
    ju.$clinit_TreeMap();
    ju.AbstractNavigableMap.call(this);
    this.$init_380();
    this.root = null;
    this.cmp = ju.nullToNaturalOrder(c);
  };
  ju.otherChild = function otherChild(child) {
    return 1 - child;
  };
  defineClass(51, 429, { 4: 1, 1: 1, 55: 1, 51: 1 }, ju.TreeMap, ju.TreeMap_0);
  _.$init_380 = function $init_380() {
    this.size_0 = 0;
  };
  _.clear = function clear_24() {
    this.root = null;
    this.size_0 = 0;
  };
  _.entryIterator = function entryIterator_0() {
    return new ju.TreeMap$EntryIterator(this);
  };
  _.entrySet_0 = function entrySet_3() {
    return new ju.TreeMap$EntrySet(this);
  };
  _.getEntry = function getEntry_0(key) {
    var c, childNum, tree;
    tree = this.root;
    while (isNotNull(tree)) {
      c = this.cmp.compare_0(key, tree.getKey_0());
      if (c == 0) {
        return tree;
      }
      childNum = c < 0 ? 0 : 1;
      tree = tree.child[childNum];
    }
    return null;
  };
  _.getFirstEntry = function getFirstEntry() {
    var nextNode, node;
    if (isNull(this.root)) {
      return null;
    }
    node = this.root;
    while (isNotNull(nextNode = node.child[0])) {
      node = nextNode;
    }
    return node;
  };
  _.inOrderAdd = function inOrderAdd(list, type_0, current, fromKey, fromInclusive, toKey, toInclusive) {
    ju.$clinit_TreeMap();
    var leftNode, rightNode;
    if (isNull(current)) {
      return;
    }
    leftNode = current.child[0];
    if (isNotNull(leftNode)) {
      this.inOrderAdd(list, type_0, leftNode, fromKey, fromInclusive, toKey, toInclusive);
    }
    if (this.inRange(type_0, current.getKey_0(), fromKey, fromInclusive, toKey, toInclusive)) {
      list.add(current);
    }
    rightNode = current.child[1];
    if (isNotNull(rightNode)) {
      this.inOrderAdd(list, type_0, rightNode, fromKey, fromInclusive, toKey, toInclusive);
    }
  };
  _.inRange = function inRange(type_0, key, fromKey, fromInclusive, toKey, toInclusive) {
    if (type_0.fromKeyValid() && this.smaller(key, fromKey, !fromInclusive)) {
      return false;
    }
    if (type_0.toKeyValid() && this.larger(key, toKey, !toInclusive)) {
      return false;
    }
    return true;
  };
  _.insert_2 = function insert_2(tree, newNode, state) {
    var c, childNum;
    if (isNull(tree)) {
      return newNode;
    } else {
      c = this.cmp.compare_0(newNode.getKey_0(), tree.getKey_0());
      if (c == 0) {
        state.value_0 = tree.setValue(newNode.getValue_0());
        state.found = true;
        return tree;
      }
      childNum = c < 0 ? 0 : 1;
      setCheck(tree.child, childNum, this.insert_2(tree.child[childNum], newNode, state));
      if (this.isRed_0(tree.child[childNum])) {
        if (this.isRed_0(tree.child[ju.otherChild(childNum)])) {
          tree.isRed = true;
          tree.child[0].isRed = false;
          tree.child[1].isRed = false;
        } else {
          if (this.isRed_0(tree.child[childNum].child[childNum])) {
            tree = this.rotateSingle(tree, ju.otherChild(childNum));
          } else if (this.isRed_0(tree.child[childNum].child[ju.otherChild(childNum)])) {
            tree = this.rotateDouble(tree, ju.otherChild(childNum));
          }
        }
      }
    }
    return tree;
  };
  _.isRed_0 = function isRed_0(node) {
    return isNotNull(node) && node.isRed;
  };
  _.larger = function larger(a, b, orEqual) {
    var compare;
    compare = this.cmp.compare_0(a, b);
    return compare > 0 || orEqual && compare == 0;
  };
  _.put = function put_4(key, value_0) {
    var node, state;
    node = new ju.TreeMap$Node(key, value_0);
    state = new ju.TreeMap$State();
    this.root = this.insert_2(this.root, node, state);
    if (!state.found) {
      ++this.size_0;
    }
    this.root.isRed = false;
    return state.value_0;
  };
  _.remove = function remove_42(k) {
    var key, state;
    key = k;
    state = new ju.TreeMap$State();
    this.removeWithState(key, state);
    return state.value_0;
  };
  _.removeEntry = function removeEntry(entry) {
    var state;
    state = new ju.TreeMap$State();
    state.matchValue = true;
    state.value_0 = entry.getValue_0();
    return this.removeWithState(entry.getKey_0(), state);
  };
  _.removeWithState = function removeWithState(key, state) {
    var c, dir_0, dir2, found, grandparent, head, last, newNode, node, parent_0, sibling;
    if (isNull(this.root)) {
      return false;
    }
    found = null;
    parent_0 = null;
    head = new ju.TreeMap$Node(null, null);
    dir_0 = 1;
    setCheck(head.child, 1, this.root);
    node = head;
    while (isNotNull(node.child[dir_0])) {
      last = dir_0;
      grandparent = parent_0;
      parent_0 = node;
      node = node.child[dir_0];
      c = this.cmp.compare_0(key, node.getKey_0());
      dir_0 = c < 0 ? 0 : 1;
      if (c == 0 && (!state.matchValue || ju.equals_48(node.getValue_0(), state.value_0))) {
        found = node;
      }
      if (!this.isRed_0(node) && !this.isRed_0(node.child[dir_0])) {
        if (this.isRed_0(node.child[ju.otherChild(dir_0)])) {
          parent_0 = setCheck(parent_0.child, last, this.rotateSingle(node, dir_0));
        } else if (!this.isRed_0(node.child[ju.otherChild(dir_0)])) {
          sibling = parent_0.child[ju.otherChild(last)];
          if (isNotNull(sibling)) {
            if (!this.isRed_0(sibling.child[ju.otherChild(last)]) && !this.isRed_0(sibling.child[last])) {
              parent_0.isRed = false;
              sibling.isRed = true;
              node.isRed = true;
            } else {
              dir2 = jsEquals(grandparent.child[1], parent_0) ? 1 : 0;
              if (this.isRed_0(sibling.child[last])) {
                setCheck(grandparent.child, dir2, this.rotateDouble(parent_0, last));
              } else if (this.isRed_0(sibling.child[ju.otherChild(last)])) {
                setCheck(grandparent.child, dir2, this.rotateSingle(parent_0, last));
              }
              node.isRed = grandparent.child[dir2].isRed = true;
              grandparent.child[dir2].child[0].isRed = false;
              grandparent.child[dir2].child[1].isRed = false;
            }
          }
        }
      }
    }
    if (isNotNull(found)) {
      state.found = true;
      state.value_0 = found.getValue_0();
      if (jsNotEquals(node, found)) {
        newNode = new ju.TreeMap$Node(node.getKey_0(), node.getValue_0());
        this.replaceNode(head, found, newNode);
        if (jsEquals(parent_0, found)) {
          parent_0 = newNode;
        }
      }
      setCheck(parent_0.child, jsEquals(parent_0.child[1], node) ? 1 : 0, node.child[isNull(node.child[0]) ? 1 : 0]);
      this.size_0--;
    }
    this.root = head.child[1];
    if (isNotNull(this.root)) {
      this.root.isRed = false;
    }
    return state.found;
  };
  _.replaceNode = function replaceNode(head, node, newNode) {
    var direction, parent_0;
    parent_0 = head;
    direction = jsEquals(parent_0.getKey_0(), null) || this.cmp.compare_0(node.getKey_0(), parent_0.getKey_0()) > 0 ? 1 : 0;
    while (jsNotEquals(parent_0.child[direction], node)) {
      parent_0 = parent_0.child[direction];
      direction = this.cmp.compare_0(node.getKey_0(), parent_0.getKey_0()) > 0 ? 1 : 0;
    }
    setCheck(parent_0.child, direction, newNode);
    newNode.isRed = node.isRed;
    setCheck(newNode.child, 0, node.child[0]);
    setCheck(newNode.child, 1, node.child[1]);
    setCheck(node.child, 0, null);
    setCheck(node.child, 1, null);
  };
  _.rotateDouble = function rotateDouble(tree, rotateDirection) {
    var otherChildDir;
    otherChildDir = ju.otherChild(rotateDirection);
    setCheck(tree.child, otherChildDir, this.rotateSingle(tree.child[otherChildDir], otherChildDir));
    return this.rotateSingle(tree, rotateDirection);
  };
  _.rotateSingle = function rotateSingle(tree, rotateDirection) {
    var otherChildDir, save;
    otherChildDir = ju.otherChild(rotateDirection);
    save = tree.child[otherChildDir];
    setCheck(tree.child, otherChildDir, save.child[rotateDirection]);
    setCheck(save.child, rotateDirection, tree);
    tree.isRed = true;
    save.isRed = false;
    return save;
  };
  _.size = function size_27() {
    return this.size_0;
  };
  _.smaller = function smaller(a, b, orEqual) {
    var compare;
    compare = this.cmp.compare_0(a, b);
    return compare < 0 || orEqual && compare == 0;
  };
  _.size_0 = 0;
  ju.LEFT = 0;
  ju.RIGHT = 1;
  cggl.Ljava_util_TreeMap_2_classLit = createForClass("java.util", "TreeMap", 51, cggl.Ljava_util_AbstractNavigableMap_2_classLit);
  ju.$clinit_TreeMap$DescendingEntryIterator = function $clinit_TreeMap$DescendingEntryIterator() {
    ju.$clinit_TreeMap$DescendingEntryIterator = emptyMethod;
  };
  defineClass(740, 1, { 1: 1, 41: 1 });
  cggl.Ljava_util_TreeMap$DescendingEntryIterator_2_classLit = createForClass("java.util", "TreeMap/DescendingEntryIterator", 740, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_TreeMap$EntryIterator = function $clinit_TreeMap$EntryIterator() {
    ju.$clinit_TreeMap$EntryIterator = emptyMethod;
    jl.$clinit_Object();
    ju.$clinit_Iterator();
  };
  ju.TreeMap$EntryIterator = function TreeMap$EntryIterator(this$0) {
    ju.$clinit_TreeMap$EntryIterator();
    ju.TreeMap$EntryIterator_0.call(this, this$0, (ju.$clinit_TreeMap$SubMapType(), ju.All), null, false, null, false);
  };
  ju.TreeMap$EntryIterator_0 = function TreeMap$EntryIterator_0(this$0, type_0, fromKey, fromInclusive, toKey, toInclusive) {
    var list;
    this.this$01 = this$0;
    Object_0.call(this);
    this.$init_381();
    list = new ju.ArrayList();
    this$0.inOrderAdd(list, type_0, this$0.root, fromKey, fromInclusive, toKey, toInclusive);
    this.iter = list.listIterator();
  };
  defineClass(259, 1, { 1: 1, 41: 1 }, ju.TreeMap$EntryIterator);
  _.$init_381 = function $init_381() {
  };
  _.forEachRemaining_0 = function forEachRemaining_25(consumer) {
    ju.$forEachRemaining(this, consumer);
  };
  _.next_3 = function next_24() {
    return this.next_4();
  };
  _.hasNext_0 = function hasNext_15() {
    return this.iter.hasNext_0();
  };
  _.next_4 = function next_25() {
    return this.last = castTo(this.iter.next_3(), 27);
  };
  _.remove_2 = function remove_43() {
    this.iter.remove_2();
    this.this$01.removeEntry(this.last);
    this.last = null;
  };
  cggl.Ljava_util_TreeMap$EntryIterator_2_classLit = createForClass("java.util", "TreeMap/EntryIterator", 259, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_TreeMap$EntrySet = function $clinit_TreeMap$EntrySet() {
    ju.$clinit_TreeMap$EntrySet = emptyMethod;
    ju.$clinit_AbstractNavigableMap$EntrySet();
  };
  ju.TreeMap$EntrySet = function TreeMap$EntrySet(this$0) {
    ju.$clinit_TreeMap$EntrySet();
    this.this$01 = this$0;
    ju.AbstractNavigableMap$EntrySet.call(this, this$0);
    this.$init_382();
  };
  defineClass(430, 260, { 1: 1, 29: 1, 56: 1 }, ju.TreeMap$EntrySet);
  _.$init_382 = function $init_382() {
  };
  _.clear = function clear_25() {
    this.this$01.clear();
  };
  cggl.Ljava_util_TreeMap$EntrySet_2_classLit = createForClass("java.util", "TreeMap/EntrySet", 430, cggl.Ljava_util_AbstractNavigableMap$EntrySet_2_classLit);
  ju.$clinit_TreeMap$Node = function $clinit_TreeMap$Node() {
    ju.$clinit_TreeMap$Node = emptyMethod;
    ju.$clinit_AbstractMap$SimpleEntry();
  };
  ju.TreeMap$Node = function TreeMap$Node(key, value_0) {
    ju.$clinit_TreeMap$Node();
    ju.TreeMap$Node_0.call(this, key, value_0, true);
  };
  ju.TreeMap$Node_0 = function TreeMap$Node_0(key, value_0, isRed) {
    ju.AbstractMap$SimpleEntry.call(this, key, value_0);
    this.$init_383();
    this.isRed = isRed;
  };
  defineClass(142, 208, { 1: 1, 27: 1, 142: 1 }, ju.TreeMap$Node);
  _.$init_383 = function $init_383() {
    this.child = initUnidimensionalArray(cggl.Ljava_util_TreeMap$Node_2_classLit, { 4: 1, 1: 1, 7: 1 }, 142, 2, 0, 1);
  };
  _.isRed = false;
  cggl.Ljava_util_TreeMap$Node_2_classLit = createForClass("java.util", "TreeMap/Node", 142, cggl.Ljava_util_AbstractMap$SimpleEntry_2_classLit);
  ju.$clinit_TreeMap$State = function $clinit_TreeMap$State() {
    ju.$clinit_TreeMap$State = emptyMethod;
    jl.$clinit_Object();
  };
  ju.TreeMap$State = function TreeMap$State() {
    ju.$clinit_TreeMap$State();
    Object_0.call(this);
    this.$init_384();
  };
  defineClass(214, 1, { 1: 1 }, ju.TreeMap$State);
  _.$init_384 = function $init_384() {
  };
  _.toString_0 = function toString_68() {
    return "State: mv=" + this.matchValue + " value=" + this.value_0 + " done=" + this.done_0 + " found=" + this.found;
  };
  _.done_0 = false;
  _.found = false;
  _.matchValue = false;
  cggl.Ljava_util_TreeMap$State_2_classLit = createForClass("java.util", "TreeMap/State", 214, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_TreeMap$SubMap = function $clinit_TreeMap$SubMap() {
    ju.$clinit_TreeMap$SubMap = emptyMethod;
  };
  defineClass(741, 429, { 1: 1, 55: 1 });
  cggl.Ljava_util_TreeMap$SubMap_2_classLit = createForClass("java.util", "TreeMap/SubMap", 741, cggl.Ljava_util_AbstractNavigableMap_2_classLit);
  ju.$clinit_TreeMap$SubMapType = function $clinit_TreeMap$SubMapType() {
    ju.$clinit_TreeMap$SubMapType = emptyMethod;
    jl.$clinit_Enum();
    ju.All = new ju.TreeMap$SubMapType("All", 0);
    ju.Head = new ju.TreeMap$SubMapType$1("Head", 1);
    ju.Range_0 = new ju.TreeMap$SubMapType$2("Range", 2);
    ju.Tail = new ju.TreeMap$SubMapType$3("Tail", 3);
  };
  ju.TreeMap$SubMapType = function TreeMap$SubMapType(enum$name, enum$ordinal) {
    ju.$clinit_TreeMap$SubMapType();
    Enum.call(this, enum$name, enum$ordinal);
    this.$init_385();
  };
  ju.valueOf_29 = function valueOf_29(name_0) {
    ju.$clinit_TreeMap$SubMapType();
    return valueOf((ju.$clinit_TreeMap$SubMapType$Map(), ju.$MAP_5), name_0);
  };
  ju.values_9 = function values_9() {
    ju.$clinit_TreeMap$SubMapType();
    return stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_TreeMap$SubMapType_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 100, 0, [ju.All, ju.Head, ju.Range_0, ju.Tail]);
  };
  defineClass(100, 48, { 4: 1, 22: 1, 48: 1, 1: 1, 100: 1 }, ju.TreeMap$SubMapType);
  _.$init_385 = function $init_385() {
  };
  _.fromKeyValid = function fromKeyValid() {
    return false;
  };
  _.toKeyValid = function toKeyValid() {
    return false;
  };
  cggl.Ljava_util_TreeMap$SubMapType_2_classLit = createForEnum("java.util", "TreeMap/SubMapType", 100, cggl.Ljava_lang_Enum_2_classLit, ju.values_9, ju.valueOf_29);
  ju.$clinit_TreeMap$SubMapType$1 = function $clinit_TreeMap$SubMapType$1() {
    ju.$clinit_TreeMap$SubMapType$1 = emptyMethod;
    ju.$clinit_TreeMap$SubMapType();
  };
  ju.TreeMap$SubMapType$1 = function TreeMap$SubMapType$1(enum$name, enum$ordinal) {
    ju.$clinit_TreeMap$SubMapType$1();
    ju.TreeMap$SubMapType.call(this, enum$name, enum$ordinal);
    this.$init_386();
  };
  defineClass(431, 100, { 4: 1, 22: 1, 48: 1, 1: 1, 100: 1 }, ju.TreeMap$SubMapType$1);
  _.$init_386 = function $init_386() {
  };
  _.toKeyValid = function toKeyValid_0() {
    return true;
  };
  cggl.Ljava_util_TreeMap$SubMapType$1_2_classLit = createForEnum("java.util", "TreeMap/SubMapType/1", 431, cggl.Ljava_util_TreeMap$SubMapType_2_classLit, null, null);
  ju.$clinit_TreeMap$SubMapType$2 = function $clinit_TreeMap$SubMapType$2() {
    ju.$clinit_TreeMap$SubMapType$2 = emptyMethod;
    ju.$clinit_TreeMap$SubMapType();
  };
  ju.TreeMap$SubMapType$2 = function TreeMap$SubMapType$2(enum$name, enum$ordinal) {
    ju.$clinit_TreeMap$SubMapType$2();
    ju.TreeMap$SubMapType.call(this, enum$name, enum$ordinal);
    this.$init_387();
  };
  defineClass(432, 100, { 4: 1, 22: 1, 48: 1, 1: 1, 100: 1 }, ju.TreeMap$SubMapType$2);
  _.$init_387 = function $init_387() {
  };
  _.fromKeyValid = function fromKeyValid_0() {
    return true;
  };
  _.toKeyValid = function toKeyValid_1() {
    return true;
  };
  cggl.Ljava_util_TreeMap$SubMapType$2_2_classLit = createForEnum("java.util", "TreeMap/SubMapType/2", 432, cggl.Ljava_util_TreeMap$SubMapType_2_classLit, null, null);
  ju.$clinit_TreeMap$SubMapType$3 = function $clinit_TreeMap$SubMapType$3() {
    ju.$clinit_TreeMap$SubMapType$3 = emptyMethod;
    ju.$clinit_TreeMap$SubMapType();
  };
  ju.TreeMap$SubMapType$3 = function TreeMap$SubMapType$3(enum$name, enum$ordinal) {
    ju.$clinit_TreeMap$SubMapType$3();
    ju.TreeMap$SubMapType.call(this, enum$name, enum$ordinal);
    this.$init_388();
  };
  defineClass(433, 100, { 4: 1, 22: 1, 48: 1, 1: 1, 100: 1 }, ju.TreeMap$SubMapType$3);
  _.$init_388 = function $init_388() {
  };
  _.fromKeyValid = function fromKeyValid_1() {
    return true;
  };
  cggl.Ljava_util_TreeMap$SubMapType$3_2_classLit = createForEnum("java.util", "TreeMap/SubMapType/3", 433, cggl.Ljava_util_TreeMap$SubMapType_2_classLit, null, null);
  ju.$clinit_TreeMap$SubMapType$Map = function $clinit_TreeMap$SubMapType$Map() {
    ju.$clinit_TreeMap$SubMapType$Map = emptyMethod;
    ju.$MAP_5 = createValueOfMap(ju.values_9());
  };
  defineClass(742, 1, { 1: 1 });
  cggl.Ljava_util_TreeMap$SubMapType$Map_2_classLit = createForClass("java.util", "TreeMap/SubMapType/Map", 742, cggl.Ljava_lang_Object_2_classLit);
  ju.$clinit_TreeSet = function $clinit_TreeSet() {
    ju.$clinit_TreeSet = emptyMethod;
    ju.$clinit_AbstractSet();
    jl.$clinit_Iterable();
    ju.$clinit_Collection();
    ju.$clinit_Set();
    ju.$clinit_SortedSet();
  };
  ju.TreeSet = function TreeSet() {
    ju.$clinit_TreeSet();
    ju.AbstractSet.call(this);
    this.$init_389();
    this.map_0 = new ju.TreeMap();
  };
  ju.TreeSet_0 = function TreeSet_0(c) {
    ju.$clinit_TreeSet();
    ju.AbstractSet.call(this);
    this.$init_389();
    this.map_0 = new ju.TreeMap_0(c);
  };
  defineClass(158, 99, { 4: 1, 1: 1, 29: 1, 56: 1 }, ju.TreeSet, ju.TreeSet_0);
  _.$init_389 = function $init_389() {
  };
  _.spliterator_0 = function spliterator_13() {
    return ju.$spliterator_3(this);
  };
  _.add = function add_32(o) {
    return jsEquals(this.map_0.put(o, (jl.$clinit_Boolean(), FALSE_0)), null);
  };
  _.clear = function clear_26() {
    this.map_0.clear();
  };
  _.contains = function contains_25(o) {
    return this.map_0.containsKey(o);
  };
  _.iterator = function iterator_17() {
    return this.map_0.keySet().iterator();
  };
  _.pollFirst = function pollFirst_1() {
    return ju.getEntryKeyOrNull(this.map_0.pollFirstEntry());
  };
  _.remove = function remove_44(o) {
    return jsNotEquals(this.map_0.remove(o), null);
  };
  _.size = function size_28() {
    return this.map_0.size();
  };
  cggl.Ljava_util_TreeSet_2_classLit = createForClass("java.util", "TreeSet", 158, cggl.Ljava_util_AbstractSet_2_classLit);
  ju.$clinit_Vector = function $clinit_Vector() {
    ju.$clinit_Vector = emptyMethod;
    ju.$clinit_AbstractList();
    jl.$clinit_Iterable();
    ju.$clinit_Collection();
    ju.$clinit_List();
  };
  ju.Vector = function Vector() {
    ju.$clinit_Vector();
    ju.AbstractList.call(this);
    this.$init_390();
    this.arrayList = new ju.ArrayList();
  };
  ju.checkArrayElementIndex = function checkArrayElementIndex(index_0, size_0) {
    if (index_0 < 0 || index_0 >= size_0) {
      throw toJs(new jl.ArrayIndexOutOfBoundsException());
    }
  };
  ju.checkArrayIndexOutOfBounds = function checkArrayIndexOutOfBounds(expression, index_0) {
    if (!expression) {
      throw toJs(new jl.ArrayIndexOutOfBoundsException_0(jl.valueOf_18(index_0)));
    }
  };
  defineClass(450, 138, { 4: 1, 1: 1, 29: 1, 59: 1, 126: 1 }, ju.Vector);
  _.$init_390 = function $init_390() {
  };
  _.addAtIndex = function add_33(index_0, o) {
    ju.checkArrayElementIndex(index_0, this.size() + 1);
    this.arrayList.addAtIndex(index_0, o);
  };
  _.add = function add_34(o) {
    return this.arrayList.add(o);
  };
  _.addAllAtIndex = function addAll_7(index_0, c) {
    ju.checkArrayElementIndex(index_0, this.size() + 1);
    return this.arrayList.addAllAtIndex(index_0, c);
  };
  _.addAll = function addAll_8(c) {
    return this.arrayList.addAll(c);
  };
  _.clear = function clear_27() {
    this.arrayList.clear();
  };
  _.contains = function contains_26(elem) {
    return this.arrayList.contains(elem);
  };
  _.containsAll = function containsAll_2(c) {
    return this.arrayList.containsAll(c);
  };
  _.forEach = function forEach_7(consumer) {
    this.arrayList.forEach(consumer);
  };
  _.getAtIndex = function get_34(index_0) {
    ju.checkArrayElementIndex(index_0, this.size());
    return this.arrayList.getAtIndex(index_0);
  };
  _.indexOf = function indexOf_8(elem) {
    return this.arrayList.indexOf(elem);
  };
  _.indexOf_4 = function indexOf_9(elem, index_0) {
    ju.checkArrayIndexOutOfBounds(index_0 >= 0, index_0);
    return this.arrayList.indexOf_0(elem, index_0);
  };
  _.isEmpty = function isEmpty_12() {
    return this.arrayList.size() == 0;
  };
  _.iterator = function iterator_18() {
    return this.arrayList.iterator();
  };
  _.lastIndexOf = function lastIndexOf_5(o) {
    return this.arrayList.lastIndexOf(o);
  };
  _.lastIndexOf_3 = function lastIndexOf_6(o, index_0) {
    ju.checkArrayIndexOutOfBounds(index_0 < this.size(), index_0);
    return this.arrayList.lastIndexOf_0(o, index_0);
  };
  _.removeAtIndex = function remove_45(index_0) {
    ju.checkArrayElementIndex(index_0, this.size());
    return this.arrayList.removeAtIndex(index_0);
  };
  _.removeAll = function removeAll_4(c) {
    return this.arrayList.removeAll(c);
  };
  _.removeRange = function removeRange_1(fromIndex, endIndex) {
    this.arrayList.removeRange(fromIndex, endIndex);
  };
  _.replaceAll = function replaceAll_5(operator) {
    this.arrayList.replaceAll(operator);
  };
  _.setAtIndex = function set_11(index_0, elem) {
    ju.checkArrayElementIndex(index_0, this.size());
    return this.arrayList.setAtIndex(index_0, elem);
  };
  _.setSize_1 = function setSize_1(size_0) {
    ju.checkArrayIndexOutOfBounds(size_0 >= 0, size_0);
    this.arrayList.setSize(size_0);
  };
  _.size = function size_29() {
    return this.arrayList.size();
  };
  _.sort_0 = function sort_10(c) {
    this.arrayList.sort_0(c);
  };
  _.subList = function subList_1(fromIndex, toIndex) {
    return this.arrayList.subList(fromIndex, toIndex);
  };
  _.toArray = function toArray_16() {
    return this.arrayList.toArray();
  };
  _.toArray_0 = function toArray_17(a) {
    return this.arrayList.toArray_0(a);
  };
  _.toString_0 = function toString_69() {
    return this.arrayList.toString_0();
  };
  cggl.Ljava_util_Vector_2_classLit = createForClass("java.util", "Vector", 450, cggl.Ljava_util_AbstractList_2_classLit);
  juc.$clinit_ConcurrentMap = function $clinit_ConcurrentMap() {
    juc.$clinit_ConcurrentMap = emptyMethod;
  };
  cggl.Ljava_util_concurrent_ConcurrentMap_2_classLit = createForInterface("java.util.concurrent", "ConcurrentMap");
  juc.$clinit_ConcurrentHashMap = function $clinit_ConcurrentHashMap() {
    juc.$clinit_ConcurrentHashMap = emptyMethod;
    ju.$clinit_AbstractMap();
    ju.$clinit_Map();
  };
  juc.ConcurrentHashMap = function ConcurrentHashMap() {
    juc.$clinit_ConcurrentHashMap();
    ju.AbstractMap.call(this);
    this.$init_391();
    this.backingMap = new ju.HashMap();
  };
  defineClass(213, 139, { 1: 1, 55: 1 });
  _.$init_391 = function $init_391() {
  };
  _.contains_3 = function contains_27(value_0) {
    return this.containsValue(value_0);
  };
  _.containsKey = function containsKey_4(key) {
    if (jsEquals(key, null)) {
      throw toJs(new jl.NullPointerException());
    }
    return this.backingMap.containsKey(key);
  };
  _.containsValue = function containsValue_4(value_0) {
    if (jsEquals(value_0, null)) {
      throw toJs(new jl.NullPointerException());
    }
    return this.backingMap.containsValue(value_0);
  };
  _.entrySet_0 = function entrySet_4() {
    return this.backingMap.entrySet_0();
  };
  _.get = function get_35(key) {
    if (jsEquals(key, null)) {
      throw toJs(new jl.NullPointerException());
    }
    return this.backingMap.get(key);
  };
  _.put = function put_5(key, value_0) {
    if (jsEquals(key, null) || jsEquals(value_0, null)) {
      throw toJs(new jl.NullPointerException());
    }
    return this.backingMap.put(key, value_0);
  };
  _.putIfAbsent = function putIfAbsent_1(key, value_0) {
    if (!this.containsKey(key)) {
      return this.put(key, value_0);
    } else {
      return this.get(key);
    }
  };
  _.remove = function remove_46(key) {
    if (jsEquals(key, null)) {
      throw toJs(new jl.NullPointerException());
    }
    return this.backingMap.remove(key);
  };
  _.remove_3 = function remove_47(key, value_0) {
    if (this.containsKey(key) && jl.equals_Ljava_lang_Object__Z__devirtual$(this.get(key), value_0)) {
      this.remove(key);
      return true;
    } else {
      return false;
    }
  };
  _.replace = function replace_4(key, value_0) {
    if (jsEquals(value_0, null)) {
      throw toJs(new jl.NullPointerException());
    } else if (this.containsKey(key)) {
      return this.put(key, value_0);
    } else {
      return null;
    }
  };
  _.replace_0 = function replace_5(key, oldValue, newValue) {
    if (jsEquals(oldValue, null) || jsEquals(newValue, null)) {
      throw toJs(new jl.NullPointerException());
    } else if (this.containsKey(key) && jl.equals_Ljava_lang_Object__Z__devirtual$(this.get(key), oldValue)) {
      this.put(key, newValue);
      return true;
    } else {
      return false;
    }
  };
  cggl.Ljava_util_concurrent_ConcurrentHashMap_2_classLit = createForClass("java.util.concurrent", "ConcurrentHashMap", 213, cggl.Ljava_util_AbstractMap_2_classLit);
  juf.$clinit_BiConsumer = function $clinit_BiConsumer() {
    juf.$clinit_BiConsumer = emptyMethod;
  };
  cggl.Ljava_util_function_BiConsumer_2_classLit = createForInterface("java.util.function", "BiConsumer");
  juf.$clinit_BiConsumer$lambda$0$Type = function $clinit_BiConsumer$lambda$0$Type() {
    juf.$clinit_BiConsumer$lambda$0$Type = emptyMethod;
  };
  defineClass(621, 1, { 1: 1 });
  cggl.Ljava_util_function_BiConsumer$lambda$0$Type_2_classLit = createForClass("java.util.function", "BiConsumer/lambda$0$Type", 621, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_BiFunction = function $clinit_BiFunction() {
    juf.$clinit_BiFunction = emptyMethod;
  };
  cggl.Ljava_util_function_BiFunction_2_classLit = createForInterface("java.util.function", "BiFunction");
  juf.$clinit_BiFunction$lambda$0$Type = function $clinit_BiFunction$lambda$0$Type() {
    juf.$clinit_BiFunction$lambda$0$Type = emptyMethod;
  };
  defineClass(620, 1, { 1: 1 });
  cggl.Ljava_util_function_BiFunction$lambda$0$Type_2_classLit = createForClass("java.util.function", "BiFunction/lambda$0$Type", 620, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_BinaryOperator = function $clinit_BinaryOperator() {
    juf.$clinit_BinaryOperator = emptyMethod;
  };
  cggl.Ljava_util_function_BinaryOperator_2_classLit = createForInterface("java.util.function", "BinaryOperator");
  juf.$clinit_BinaryOperator$lambda$0$Type = function $clinit_BinaryOperator$lambda$0$Type() {
    juf.$clinit_BinaryOperator$lambda$0$Type = emptyMethod;
  };
  defineClass(697, 1, { 1: 1 });
  cggl.Ljava_util_function_BinaryOperator$lambda$0$Type_2_classLit = createForClass("java.util.function", "BinaryOperator/lambda$0$Type", 697, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_BinaryOperator$lambda$1$Type = function $clinit_BinaryOperator$lambda$1$Type() {
    juf.$clinit_BinaryOperator$lambda$1$Type = emptyMethod;
  };
  defineClass(698, 1, { 1: 1 });
  cggl.Ljava_util_function_BinaryOperator$lambda$1$Type_2_classLit = createForClass("java.util.function", "BinaryOperator/lambda$1$Type", 698, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_Consumer$lambda$0$Type = function $clinit_Consumer$lambda$0$Type() {
    juf.$clinit_Consumer$lambda$0$Type = emptyMethod;
  };
  defineClass(547, 1, { 1: 1 });
  cggl.Ljava_util_function_Consumer$lambda$0$Type_2_classLit = createForClass("java.util.function", "Consumer/lambda$0$Type", 547, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_DoubleConsumer$lambda$0$Type = function $clinit_DoubleConsumer$lambda$0$Type() {
    juf.$clinit_DoubleConsumer$lambda$0$Type = emptyMethod;
  };
  defineClass(510, 1, { 1: 1 });
  cggl.Ljava_util_function_DoubleConsumer$lambda$0$Type_2_classLit = createForClass("java.util.function", "DoubleConsumer/lambda$0$Type", 510, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_Function$lambda$0$Type = function $clinit_Function$lambda$0$Type() {
    juf.$clinit_Function$lambda$0$Type = emptyMethod;
  };
  juf.Function$lambda$0$Type = function Function$lambda$0$Type() {
    juf.$clinit_Function$lambda$0$Type();
  };
  defineClass(358, 1, { 1: 1 }, juf.Function$lambda$0$Type);
  _.andThen = function andThen_1(after) {
    return juf.$andThen(this, after);
  };
  _.apply_1 = function apply_4(t) {
    return juf.lambda$0_5(t);
  };
  cggl.Ljava_util_function_Function$lambda$0$Type_2_classLit = createForClass("java.util.function", "Function/lambda$0$Type", 358, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_Function$lambda$1$Type = function $clinit_Function$lambda$1$Type() {
    juf.$clinit_Function$lambda$1$Type = emptyMethod;
  };
  juf.Function$lambda$1$Type = function Function$lambda$1$Type($$outer_0, after_1) {
    juf.$clinit_Function$lambda$1$Type();
    this.$$outer_0 = $$outer_0;
    this.after_1 = after_1;
  };
  defineClass(359, 1, { 1: 1 }, juf.Function$lambda$1$Type);
  _.andThen = function andThen_2(after) {
    return juf.$andThen(this, after);
  };
  _.apply_1 = function apply_5(t) {
    return juf.$lambda$1(this.$$outer_0, this.after_1, t);
  };
  cggl.Ljava_util_function_Function$lambda$1$Type_2_classLit = createForClass("java.util.function", "Function/lambda$1$Type", 359, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_Function$lambda$2$Type = function $clinit_Function$lambda$2$Type() {
    juf.$clinit_Function$lambda$2$Type = emptyMethod;
  };
  defineClass(617, 1, { 1: 1 });
  cggl.Ljava_util_function_Function$lambda$2$Type_2_classLit = createForClass("java.util.function", "Function/lambda$2$Type", 617, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_IntConsumer$lambda$0$Type = function $clinit_IntConsumer$lambda$0$Type() {
    juf.$clinit_IntConsumer$lambda$0$Type = emptyMethod;
  };
  defineClass(511, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_function_IntConsumer$lambda$0$Type_2_classLit = createForClass("java.util.function", "IntConsumer/lambda$0$Type", 511, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_IntFunction = function $clinit_IntFunction() {
    juf.$clinit_IntFunction = emptyMethod;
  };
  cggl.Ljava_util_function_IntFunction_2_classLit = createForInterface("java.util.function", "IntFunction");
  juf.$clinit_IntPredicate = function $clinit_IntPredicate() {
    juf.$clinit_IntPredicate = emptyMethod;
  };
  cggl.Ljava_util_function_IntPredicate_2_classLit = createForInterface("java.util.function", "IntPredicate");
  juf.$clinit_IntPredicate$lambda$0$Type = function $clinit_IntPredicate$lambda$0$Type() {
    juf.$clinit_IntPredicate$lambda$0$Type = emptyMethod;
  };
  defineClass(548, 1, { 1: 1 });
  cggl.Ljava_util_function_IntPredicate$lambda$0$Type_2_classLit = createForClass("java.util.function", "IntPredicate/lambda$0$Type", 548, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_IntPredicate$lambda$1$Type = function $clinit_IntPredicate$lambda$1$Type() {
    juf.$clinit_IntPredicate$lambda$1$Type = emptyMethod;
  };
  defineClass(549, 1, { 1: 1 });
  cggl.Ljava_util_function_IntPredicate$lambda$1$Type_2_classLit = createForClass("java.util.function", "IntPredicate/lambda$1$Type", 549, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_IntPredicate$lambda$2$Type = function $clinit_IntPredicate$lambda$2$Type() {
    juf.$clinit_IntPredicate$lambda$2$Type = emptyMethod;
  };
  defineClass(550, 1, { 1: 1 });
  cggl.Ljava_util_function_IntPredicate$lambda$2$Type_2_classLit = createForClass("java.util.function", "IntPredicate/lambda$2$Type", 550, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_IntToDoubleFunction = function $clinit_IntToDoubleFunction() {
    juf.$clinit_IntToDoubleFunction = emptyMethod;
  };
  cggl.Ljava_util_function_IntToDoubleFunction_2_classLit = createForInterface("java.util.function", "IntToDoubleFunction");
  juf.$clinit_IntToLongFunction = function $clinit_IntToLongFunction() {
    juf.$clinit_IntToLongFunction = emptyMethod;
  };
  cggl.Ljava_util_function_IntToLongFunction_2_classLit = createForInterface("java.util.function", "IntToLongFunction");
  juf.$clinit_LongConsumer$lambda$0$Type = function $clinit_LongConsumer$lambda$0$Type() {
    juf.$clinit_LongConsumer$lambda$0$Type = emptyMethod;
  };
  defineClass(512, 1, { 1: 1 });
  cggl.Ljava_util_function_LongConsumer$lambda$0$Type_2_classLit = createForClass("java.util.function", "LongConsumer/lambda$0$Type", 512, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_ObjIntConsumer = function $clinit_ObjIntConsumer() {
    juf.$clinit_ObjIntConsumer = emptyMethod;
  };
  cggl.Ljava_util_function_ObjIntConsumer_2_classLit = createForInterface("java.util.function", "ObjIntConsumer");
  juf.$clinit_Predicate = function $clinit_Predicate() {
    juf.$clinit_Predicate = emptyMethod;
  };
  cggl.Ljava_util_function_Predicate_2_classLit = createForInterface("java.util.function", "Predicate");
  juf.$clinit_Predicate$0methodref$isNull$Type = function $clinit_Predicate$0methodref$isNull$Type() {
    juf.$clinit_Predicate$0methodref$isNull$Type = emptyMethod;
  };
  defineClass(568, 1, { 1: 1 });
  cggl.Ljava_util_function_Predicate$0methodref$isNull$Type_2_classLit = createForClass("java.util.function", "Predicate/0methodref$isNull$Type", 568, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_Predicate$1methodref$equals$Type = function $clinit_Predicate$1methodref$equals$Type() {
    juf.$clinit_Predicate$1methodref$equals$Type = emptyMethod;
  };
  defineClass(569, 1, { 1: 1 });
  cggl.Ljava_util_function_Predicate$1methodref$equals$Type_2_classLit = createForClass("java.util.function", "Predicate/1methodref$equals$Type", 569, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_Predicate$lambda$2$Type = function $clinit_Predicate$lambda$2$Type() {
    juf.$clinit_Predicate$lambda$2$Type = emptyMethod;
  };
  defineClass(570, 1, { 1: 1 });
  cggl.Ljava_util_function_Predicate$lambda$2$Type_2_classLit = createForClass("java.util.function", "Predicate/lambda$2$Type", 570, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_Predicate$lambda$3$Type = function $clinit_Predicate$lambda$3$Type() {
    juf.$clinit_Predicate$lambda$3$Type = emptyMethod;
  };
  defineClass(571, 1, { 1: 1 });
  cggl.Ljava_util_function_Predicate$lambda$3$Type_2_classLit = createForClass("java.util.function", "Predicate/lambda$3$Type", 571, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_Predicate$lambda$4$Type = function $clinit_Predicate$lambda$4$Type() {
    juf.$clinit_Predicate$lambda$4$Type = emptyMethod;
  };
  defineClass(572, 1, { 1: 1 });
  cggl.Ljava_util_function_Predicate$lambda$4$Type_2_classLit = createForClass("java.util.function", "Predicate/lambda$4$Type", 572, cggl.Ljava_lang_Object_2_classLit);
  juf.$clinit_ToDoubleFunction = function $clinit_ToDoubleFunction() {
    juf.$clinit_ToDoubleFunction = emptyMethod;
  };
  cggl.Ljava_util_function_ToDoubleFunction_2_classLit = createForInterface("java.util.function", "ToDoubleFunction");
  juf.$clinit_UnaryOperator = function $clinit_UnaryOperator() {
    juf.$clinit_UnaryOperator = emptyMethod;
  };
  cggl.Ljava_util_function_UnaryOperator_2_classLit = createForInterface("java.util.function", "UnaryOperator");
  juf.$clinit_UnaryOperator$lambda$0$Type = function $clinit_UnaryOperator$lambda$0$Type() {
    juf.$clinit_UnaryOperator$lambda$0$Type = emptyMethod;
  };
  defineClass(616, 1, { 1: 1 });
  cggl.Ljava_util_function_UnaryOperator$lambda$0$Type_2_classLit = createForClass("java.util.function", "UnaryOperator/lambda$0$Type", 616, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_BaseStream = function $clinit_BaseStream() {
    jus.$clinit_BaseStream = emptyMethod;
  };
  cggl.Ljava_util_stream_BaseStream_2_classLit = createForInterface("java.util.stream", "BaseStream");
  jus.$clinit_Collector = function $clinit_Collector() {
    jus.$clinit_Collector = emptyMethod;
  };
  jus.of_35 = function of_35(supplier, accumulator, combiner, finisher, characteristics) {
    jus.$clinit_Collector();
    ji2.checkNotNull_0(supplier);
    ji2.checkNotNull_0(accumulator);
    ji2.checkNotNull_0(combiner);
    ji2.checkNotNull_0(finisher);
    ji2.checkNotNull_0(characteristics);
    return new jus.CollectorImpl(supplier, accumulator, combiner, finisher, characteristics);
  };
  jus.of_36 = function of_36(supplier, accumulator, combiner, characteristics) {
    jus.$clinit_Collector();
    ji2.checkNotNull_0(supplier);
    ji2.checkNotNull_0(accumulator);
    ji2.checkNotNull_0(combiner);
    ji2.checkNotNull_0(characteristics);
    return new jus.CollectorImpl(supplier, accumulator, combiner, juf.identity_0(), characteristics);
  };
  cggl.Ljava_util_stream_Collector_2_classLit = createForInterface("java.util.stream", "Collector");
  jus.$clinit_Collector$Characteristics = function $clinit_Collector$Characteristics() {
    jus.$clinit_Collector$Characteristics = emptyMethod;
    jl.$clinit_Enum();
    jus.CONCURRENT_0 = new jus.Collector$Characteristics("CONCURRENT", 0);
    jus.IDENTITY_FINISH = new jus.Collector$Characteristics("IDENTITY_FINISH", 1);
    jus.UNORDERED = new jus.Collector$Characteristics("UNORDERED", 2);
  };
  jus.Collector$Characteristics = function Collector$Characteristics(enum$name, enum$ordinal) {
    Enum.call(this, enum$name, enum$ordinal);
    this.$init_392();
  };
  jus.valueOf_30 = function valueOf_30(name_0) {
    jus.$clinit_Collector$Characteristics();
    return valueOf((jus.$clinit_Collector$Characteristics$Map(), jus.$MAP_6), name_0);
  };
  jus.values_10 = function values_10() {
    jus.$clinit_Collector$Characteristics();
    return stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_stream_Collector$Characteristics_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 90, 0, [jus.CONCURRENT_0, jus.IDENTITY_FINISH, jus.UNORDERED]);
  };
  defineClass(90, 48, { 4: 1, 22: 1, 48: 1, 1: 1, 90: 1 }, jus.Collector$Characteristics);
  _.$init_392 = function $init_392() {
  };
  cggl.Ljava_util_stream_Collector$Characteristics_2_classLit = createForEnum("java.util.stream", "Collector/Characteristics", 90, cggl.Ljava_lang_Enum_2_classLit, jus.values_10, jus.valueOf_30);
  jus.$clinit_Collector$Characteristics$Map = function $clinit_Collector$Characteristics$Map() {
    jus.$clinit_Collector$Characteristics$Map = emptyMethod;
    jus.$MAP_6 = createValueOfMap(jus.values_10());
  };
  defineClass(699, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collector$Characteristics$Map_2_classLit = createForClass("java.util.stream", "Collector/Characteristics/Map", 699, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_CollectorImpl = function $clinit_CollectorImpl() {
    jus.$clinit_CollectorImpl = emptyMethod;
    jl.$clinit_Object();
  };
  jus.CollectorImpl = function CollectorImpl(supplier, accumulator, combiner, finisher, characteristics) {
    jus.$clinit_CollectorImpl();
    Object_0.call(this);
    this.$init_393();
    this.supplier = supplier;
    this.accumulator = accumulator;
    this.characteristics = ju.emptySet();
    this.combiner = combiner;
    this.finisher = finisher;
  };
  defineClass(189, 1, { 1: 1 }, jus.CollectorImpl);
  _.$init_393 = function $init_393() {
  };
  _.accumulator_0 = function accumulator_0() {
    return this.accumulator;
  };
  _.combiner_0 = function combiner_0() {
    return this.combiner;
  };
  _.finisher_0 = function finisher_0() {
    return this.finisher;
  };
  _.supplier_0 = function supplier_0() {
    return this.supplier;
  };
  cggl.Ljava_util_stream_CollectorImpl_2_classLit = createForClass("java.util.stream", "CollectorImpl", 189, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors = function $clinit_Collectors() {
    jus.$clinit_Collectors = emptyMethod;
    jl.$clinit_Object();
  };
  jus.addAll_9 = function addAll_9(collection, items) {
    collection.addAll(items);
    return collection;
  };
  jus.collectingAndThen = function collectingAndThen(downstream, finisher) {
    return new jus.CollectorImpl(downstream.supplier_0(), downstream.accumulator_0(), downstream.combiner_0(), downstream.finisher_0().andThen(finisher), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_stream_Collector$Characteristics_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 90, 0, []));
  };
  jus.disallowNulls = function disallowNulls(func) {
    return func.andThen(new jus.Collectors$27methodref$requireNonNull$Type());
  };
  jus.lambda$19 = function lambda$19(downstream_0, mapper_1, a_2, t_3) {
    jus.$clinit_Collectors();
    {
      downstream_0.accumulator_0().accept_1(a_2, mapper_1.apply_1(t_3));
    }
  };
  jus.lambda$45 = function lambda$45(c1_0, c2_1) {
    jus.$clinit_Collectors();
    return jus.addAll_9(c1_0, c2_1);
  };
  jus.lambda$49 = function lambda$49(m1_0, m2_1) {
    jus.$clinit_Collectors();
    {
      throw toJs(new jl.IllegalStateException_0("Can't assign multiple values to the same key"));
    }
  };
  jus.lambda$54 = function lambda$54(keyMapper_0, valueMapper_1, mergeFunction_2, map_3, item_4) {
    jus.$clinit_Collectors();
    var key, newValue;
    {
      key = keyMapper_0.apply_1(item_4);
      newValue = valueMapper_1.apply_1(item_4);
      if (map_3.containsKey(key)) {
        map_3.put(key, mergeFunction_2.apply_2(map_3.get(key), newValue));
      } else {
        map_3.put(key, newValue);
      }
    }
  };
  jus.lambda$55 = function lambda$55(mergeFunction_0, m1_1, m2_2) {
    jus.$clinit_Collectors();
    return jus.mergeAll(m1_1, m2_2, mergeFunction_0);
  };
  jus.lambda$58 = function lambda$58(c1_0, c2_1) {
    jus.$clinit_Collectors();
    return castTo(jus.addAll_9(c1_0, c2_1), 70);
  };
  jus.lambda$59 = function lambda$59(s_0) {
    jus.$clinit_Collectors();
    return s_0;
  };
  jus.mapping_0 = function mapping_0(mapper, downstream) {
    return new jus.CollectorImpl(downstream.supplier_0(), castTo(new jus.Collectors$lambda$19$Type(downstream, mapper), 831), downstream.combiner_0(), downstream.finisher_0(), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_stream_Collector$Characteristics_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 90, 0, []));
  };
  jus.mergeAll = function mergeAll(m1, m2, mergeFunction) {
    var entry, entry$iterator;
    for (entry$iterator = m2.entrySet_0().iterator(); entry$iterator.hasNext_0(); ) {
      entry = castTo(entry$iterator.next_3(), 27);
      m1.merge(entry.getKey_0(), entry.getValue_0(), mergeFunction);
    }
    return m1;
  };
  jus.toCollection = function toCollection(collectionFactory) {
    return jus.of_36(collectionFactory, new jus.Collectors$20methodref$add$Type(), new jus.Collectors$lambda$45$Type(), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_stream_Collector$Characteristics_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 90, 0, [(jus.$clinit_Collector$Characteristics(), jus.IDENTITY_FINISH)]));
  };
  jus.toList = function toList() {
    jus.$clinit_Collectors();
    return jus.toCollection(new jus.Collectors$21methodref$ctor$Type());
  };
  jus.toMap = function toMap(keyMapper, valueMapper) {
    return jus.toMap_0(keyMapper, valueMapper, new jus.Collectors$lambda$49$Type());
  };
  jus.toMap_0 = function toMap_0(keyMapper, valueMapper, mergeFunction) {
    return jus.toMap_1(keyMapper, valueMapper, mergeFunction, new jus.Collectors$24methodref$ctor$Type());
  };
  jus.toMap_1 = function toMap_1(keyMapper, valueMapper, mergeFunction, mapSupplier) {
    return jus.of_36(mapSupplier, new jus.Collectors$lambda$54$Type(keyMapper, valueMapper, mergeFunction), new jus.Collectors$lambda$55$Type(mergeFunction), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_stream_Collector$Characteristics_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 90, 0, [(jus.$clinit_Collector$Characteristics(), jus.IDENTITY_FINISH)]));
  };
  jus.toSet = function toSet() {
    return jus.of_35(new jus.Collectors$28methodref$ctor$Type(), new jus.Collectors$29methodref$add$Type(), new jus.Collectors$lambda$58$Type(), new jus.Collectors$lambda$59$Type(), stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_util_stream_Collector$Characteristics_2_classLit, 1), { 4: 1, 1: 1, 7: 1 }, 90, 0, [(jus.$clinit_Collector$Characteristics(), jus.UNORDERED), (jus.$clinit_Collector$Characteristics(), jus.IDENTITY_FINISH)]));
  };
  jus.toUnmodifiableList = function toUnmodifiableList() {
    jus.$clinit_Collectors();
    var mapping;
    mapping = jus.mapping_0(new jus.Collectors$22methodref$requireNonNull$Type(), jus.toList());
    return jus.collectingAndThen(mapping, new jus.Collectors$23methodref$unmodifiableList$Type());
  };
  jus.toUnmodifiableMap = function toUnmodifiableMap(keyMapper, valueMapper) {
    jus.$clinit_Collectors();
    return jus.collectingAndThen(jus.toMap(jus.disallowNulls(keyMapper), jus.disallowNulls(valueMapper)), new jus.Collectors$25methodref$unmodifiableMap$Type());
  };
  jus.toUnmodifiableSet = function toUnmodifiableSet() {
    jus.$clinit_Collectors();
    var mapping;
    mapping = jus.mapping_0(new jus.Collectors$30methodref$requireNonNull$Type(), jus.toSet());
    return jus.collectingAndThen(mapping, new jus.Collectors$31methodref$unmodifiableSet$Type());
  };
  defineClass(652, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors_2_classLit = createForClass("java.util.stream", "Collectors", 652, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$0methodref$getAverage$Type = function $clinit_Collectors$0methodref$getAverage$Type() {
    jus.$clinit_Collectors$0methodref$getAverage$Type = emptyMethod;
  };
  defineClass(653, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$0methodref$getAverage$Type_2_classLit = createForClass("java.util.stream", "Collectors/0methodref$getAverage$Type", 653, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$10methodref$merge$Type = function $clinit_Collectors$10methodref$merge$Type() {
    jus.$clinit_Collectors$10methodref$merge$Type = emptyMethod;
  };
  defineClass(670, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$10methodref$merge$Type_2_classLit = createForClass("java.util.stream", "Collectors/10methodref$merge$Type", 670, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$11methodref$toString$Type = function $clinit_Collectors$11methodref$toString$Type() {
    jus.$clinit_Collectors$11methodref$toString$Type = emptyMethod;
  };
  defineClass(671, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$11methodref$toString$Type_2_classLit = createForClass("java.util.stream", "Collectors/11methodref$toString$Type", 671, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$12methodref$test$Type = function $clinit_Collectors$12methodref$test$Type() {
    jus.$clinit_Collectors$12methodref$test$Type = emptyMethod;
  };
  defineClass(675, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$12methodref$test$Type_2_classLit = createForClass("java.util.stream", "Collectors/12methodref$test$Type", 675, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$13methodref$ctor$Type = function $clinit_Collectors$13methodref$ctor$Type() {
    jus.$clinit_Collectors$13methodref$ctor$Type = emptyMethod;
  };
  defineClass(676, 1, { 1: 1, 64: 1 });
  cggl.Ljava_util_stream_Collectors$13methodref$ctor$Type_2_classLit = createForClass("java.util.stream", "Collectors/13methodref$ctor$Type", 676, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$14methodref$of$Type = function $clinit_Collectors$14methodref$of$Type() {
    jus.$clinit_Collectors$14methodref$of$Type = emptyMethod;
  };
  defineClass(678, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$14methodref$of$Type_2_classLit = createForClass("java.util.stream", "Collectors/14methodref$of$Type", 678, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$15methodref$ctor$Type = function $clinit_Collectors$15methodref$ctor$Type() {
    jus.$clinit_Collectors$15methodref$ctor$Type = emptyMethod;
  };
  defineClass(684, 1, { 1: 1, 64: 1 });
  cggl.Ljava_util_stream_Collectors$15methodref$ctor$Type_2_classLit = createForClass("java.util.stream", "Collectors/15methodref$ctor$Type", 684, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$16methodref$ctor$Type = function $clinit_Collectors$16methodref$ctor$Type() {
    jus.$clinit_Collectors$16methodref$ctor$Type = emptyMethod;
  };
  defineClass(687, 1, { 1: 1, 64: 1 });
  cggl.Ljava_util_stream_Collectors$16methodref$ctor$Type_2_classLit = createForClass("java.util.stream", "Collectors/16methodref$ctor$Type", 687, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$17methodref$ctor$Type = function $clinit_Collectors$17methodref$ctor$Type() {
    jus.$clinit_Collectors$17methodref$ctor$Type = emptyMethod;
  };
  defineClass(690, 1, { 1: 1, 64: 1 });
  cggl.Ljava_util_stream_Collectors$17methodref$ctor$Type_2_classLit = createForClass("java.util.stream", "Collectors/17methodref$ctor$Type", 690, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$18methodref$getSum$Type = function $clinit_Collectors$18methodref$getSum$Type() {
    jus.$clinit_Collectors$18methodref$getSum$Type = emptyMethod;
  };
  defineClass(693, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$18methodref$getSum$Type_2_classLit = createForClass("java.util.stream", "Collectors/18methodref$getSum$Type", 693, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$19methodref$getSum$Type = function $clinit_Collectors$19methodref$getSum$Type() {
    jus.$clinit_Collectors$19methodref$getSum$Type = emptyMethod;
  };
  defineClass(695, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$19methodref$getSum$Type_2_classLit = createForClass("java.util.stream", "Collectors/19methodref$getSum$Type", 695, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$1methodref$getAverage$Type = function $clinit_Collectors$1methodref$getAverage$Type() {
    jus.$clinit_Collectors$1methodref$getAverage$Type = emptyMethod;
  };
  defineClass(654, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$1methodref$getAverage$Type_2_classLit = createForClass("java.util.stream", "Collectors/1methodref$getAverage$Type", 654, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$20methodref$add$Type = function $clinit_Collectors$20methodref$add$Type() {
    jus.$clinit_Collectors$20methodref$add$Type = emptyMethod;
  };
  jus.Collectors$20methodref$add$Type = function Collectors$20methodref$add$Type() {
    jus.$clinit_Collectors$20methodref$add$Type();
  };
  defineClass(387, 1, { 1: 1 }, jus.Collectors$20methodref$add$Type);
  _.accept_1 = function accept_4(arg0, arg1) {
    castTo(arg0, 29).add(arg1);
  };
  cggl.Ljava_util_stream_Collectors$20methodref$add$Type_2_classLit = createForClass("java.util.stream", "Collectors/20methodref$add$Type", 387, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$21methodref$ctor$Type = function $clinit_Collectors$21methodref$ctor$Type() {
    jus.$clinit_Collectors$21methodref$ctor$Type = emptyMethod;
  };
  jus.Collectors$21methodref$ctor$Type = function Collectors$21methodref$ctor$Type() {
    jus.$clinit_Collectors$21methodref$ctor$Type();
  };
  defineClass(389, 1, { 1: 1, 64: 1 }, jus.Collectors$21methodref$ctor$Type);
  _.get_2 = function get_36() {
    return new ju.ArrayList();
  };
  cggl.Ljava_util_stream_Collectors$21methodref$ctor$Type_2_classLit = createForClass("java.util.stream", "Collectors/21methodref$ctor$Type", 389, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$22methodref$requireNonNull$Type = function $clinit_Collectors$22methodref$requireNonNull$Type() {
    jus.$clinit_Collectors$22methodref$requireNonNull$Type = emptyMethod;
  };
  jus.Collectors$22methodref$requireNonNull$Type = function Collectors$22methodref$requireNonNull$Type() {
    jus.$clinit_Collectors$22methodref$requireNonNull$Type();
  };
  defineClass(390, 1, { 1: 1 }, jus.Collectors$22methodref$requireNonNull$Type);
  _.andThen = function andThen_3(after) {
    return juf.$andThen(this, after);
  };
  _.apply_1 = function apply_6(arg0) {
    return ju.requireNonNull(arg0);
  };
  cggl.Ljava_util_stream_Collectors$22methodref$requireNonNull$Type_2_classLit = createForClass("java.util.stream", "Collectors/22methodref$requireNonNull$Type", 390, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$23methodref$unmodifiableList$Type = function $clinit_Collectors$23methodref$unmodifiableList$Type() {
    jus.$clinit_Collectors$23methodref$unmodifiableList$Type = emptyMethod;
  };
  jus.Collectors$23methodref$unmodifiableList$Type = function Collectors$23methodref$unmodifiableList$Type() {
    jus.$clinit_Collectors$23methodref$unmodifiableList$Type();
  };
  defineClass(391, 1, { 1: 1 }, jus.Collectors$23methodref$unmodifiableList$Type);
  _.andThen = function andThen_4(after) {
    return juf.$andThen(this, after);
  };
  _.apply_1 = function apply_7(arg0) {
    return ju.unmodifiableList(castTo(arg0, 59));
  };
  cggl.Ljava_util_stream_Collectors$23methodref$unmodifiableList$Type_2_classLit = createForClass("java.util.stream", "Collectors/23methodref$unmodifiableList$Type", 391, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$24methodref$ctor$Type = function $clinit_Collectors$24methodref$ctor$Type() {
    jus.$clinit_Collectors$24methodref$ctor$Type = emptyMethod;
  };
  jus.Collectors$24methodref$ctor$Type = function Collectors$24methodref$ctor$Type() {
    jus.$clinit_Collectors$24methodref$ctor$Type();
  };
  defineClass(393, 1, { 1: 1, 64: 1 }, jus.Collectors$24methodref$ctor$Type);
  _.get_2 = function get_37() {
    return new ju.HashMap();
  };
  cggl.Ljava_util_stream_Collectors$24methodref$ctor$Type_2_classLit = createForClass("java.util.stream", "Collectors/24methodref$ctor$Type", 393, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$25methodref$unmodifiableMap$Type = function $clinit_Collectors$25methodref$unmodifiableMap$Type() {
    jus.$clinit_Collectors$25methodref$unmodifiableMap$Type = emptyMethod;
  };
  jus.Collectors$25methodref$unmodifiableMap$Type = function Collectors$25methodref$unmodifiableMap$Type() {
    jus.$clinit_Collectors$25methodref$unmodifiableMap$Type();
  };
  defineClass(394, 1, { 1: 1 }, jus.Collectors$25methodref$unmodifiableMap$Type);
  _.andThen = function andThen_5(after) {
    return juf.$andThen(this, after);
  };
  _.apply_1 = function apply_8(arg0) {
    return ju.unmodifiableMap(castTo(arg0, 55));
  };
  cggl.Ljava_util_stream_Collectors$25methodref$unmodifiableMap$Type_2_classLit = createForClass("java.util.stream", "Collectors/25methodref$unmodifiableMap$Type", 394, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$26methodref$unmodifiableMap$Type = function $clinit_Collectors$26methodref$unmodifiableMap$Type() {
    jus.$clinit_Collectors$26methodref$unmodifiableMap$Type = emptyMethod;
  };
  defineClass(696, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$26methodref$unmodifiableMap$Type_2_classLit = createForClass("java.util.stream", "Collectors/26methodref$unmodifiableMap$Type", 696, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$27methodref$requireNonNull$Type = function $clinit_Collectors$27methodref$requireNonNull$Type() {
    jus.$clinit_Collectors$27methodref$requireNonNull$Type = emptyMethod;
  };
  jus.Collectors$27methodref$requireNonNull$Type = function Collectors$27methodref$requireNonNull$Type() {
    jus.$clinit_Collectors$27methodref$requireNonNull$Type();
  };
  defineClass(395, 1, { 1: 1 }, jus.Collectors$27methodref$requireNonNull$Type);
  _.andThen = function andThen_6(after) {
    return juf.$andThen(this, after);
  };
  _.apply_1 = function apply_9(arg0) {
    return ju.requireNonNull(arg0);
  };
  cggl.Ljava_util_stream_Collectors$27methodref$requireNonNull$Type_2_classLit = createForClass("java.util.stream", "Collectors/27methodref$requireNonNull$Type", 395, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$28methodref$ctor$Type = function $clinit_Collectors$28methodref$ctor$Type() {
    jus.$clinit_Collectors$28methodref$ctor$Type = emptyMethod;
  };
  jus.Collectors$28methodref$ctor$Type = function Collectors$28methodref$ctor$Type() {
    jus.$clinit_Collectors$28methodref$ctor$Type();
  };
  defineClass(398, 1, { 1: 1, 64: 1 }, jus.Collectors$28methodref$ctor$Type);
  _.get_2 = function get_38() {
    return new ju.HashSet();
  };
  cggl.Ljava_util_stream_Collectors$28methodref$ctor$Type_2_classLit = createForClass("java.util.stream", "Collectors/28methodref$ctor$Type", 398, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$29methodref$add$Type = function $clinit_Collectors$29methodref$add$Type() {
    jus.$clinit_Collectors$29methodref$add$Type = emptyMethod;
  };
  jus.Collectors$29methodref$add$Type = function Collectors$29methodref$add$Type() {
    jus.$clinit_Collectors$29methodref$add$Type();
  };
  defineClass(399, 1, { 1: 1 }, jus.Collectors$29methodref$add$Type);
  _.accept_1 = function accept_5(arg0, arg1) {
    castTo(arg0, 70).add(arg1);
  };
  cggl.Ljava_util_stream_Collectors$29methodref$add$Type_2_classLit = createForClass("java.util.stream", "Collectors/29methodref$add$Type", 399, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$2methodref$getAverage$Type = function $clinit_Collectors$2methodref$getAverage$Type() {
    jus.$clinit_Collectors$2methodref$getAverage$Type = emptyMethod;
  };
  defineClass(655, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$2methodref$getAverage$Type_2_classLit = createForClass("java.util.stream", "Collectors/2methodref$getAverage$Type", 655, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$30methodref$requireNonNull$Type = function $clinit_Collectors$30methodref$requireNonNull$Type() {
    jus.$clinit_Collectors$30methodref$requireNonNull$Type = emptyMethod;
  };
  jus.Collectors$30methodref$requireNonNull$Type = function Collectors$30methodref$requireNonNull$Type() {
    jus.$clinit_Collectors$30methodref$requireNonNull$Type();
  };
  defineClass(402, 1, { 1: 1 }, jus.Collectors$30methodref$requireNonNull$Type);
  _.andThen = function andThen_7(after) {
    return juf.$andThen(this, after);
  };
  _.apply_1 = function apply_10(arg0) {
    return ju.requireNonNull(arg0);
  };
  cggl.Ljava_util_stream_Collectors$30methodref$requireNonNull$Type_2_classLit = createForClass("java.util.stream", "Collectors/30methodref$requireNonNull$Type", 402, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$31methodref$unmodifiableSet$Type = function $clinit_Collectors$31methodref$unmodifiableSet$Type() {
    jus.$clinit_Collectors$31methodref$unmodifiableSet$Type = emptyMethod;
  };
  jus.Collectors$31methodref$unmodifiableSet$Type = function Collectors$31methodref$unmodifiableSet$Type() {
    jus.$clinit_Collectors$31methodref$unmodifiableSet$Type();
  };
  defineClass(403, 1, { 1: 1 }, jus.Collectors$31methodref$unmodifiableSet$Type);
  _.andThen = function andThen_8(after) {
    return juf.$andThen(this, after);
  };
  _.apply_1 = function apply_11(arg0) {
    return ju.unmodifiableSet(castTo(arg0, 56));
  };
  cggl.Ljava_util_stream_Collectors$31methodref$unmodifiableSet$Type_2_classLit = createForClass("java.util.stream", "Collectors/31methodref$unmodifiableSet$Type", 403, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$3methodref$ctor$Type = function $clinit_Collectors$3methodref$ctor$Type() {
    jus.$clinit_Collectors$3methodref$ctor$Type = emptyMethod;
  };
  defineClass(658, 1, { 1: 1, 64: 1 });
  cggl.Ljava_util_stream_Collectors$3methodref$ctor$Type_2_classLit = createForClass("java.util.stream", "Collectors/3methodref$ctor$Type", 658, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$4methodref$addAll$Type = function $clinit_Collectors$4methodref$addAll$Type() {
    jus.$clinit_Collectors$4methodref$addAll$Type = emptyMethod;
  };
  defineClass(661, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$4methodref$addAll$Type_2_classLit = createForClass("java.util.stream", "Collectors/4methodref$addAll$Type", 661, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$5methodref$ctor$Type = function $clinit_Collectors$5methodref$ctor$Type() {
    jus.$clinit_Collectors$5methodref$ctor$Type = emptyMethod;
  };
  defineClass(664, 1, { 1: 1, 64: 1 });
  cggl.Ljava_util_stream_Collectors$5methodref$ctor$Type_2_classLit = createForClass("java.util.stream", "Collectors/5methodref$ctor$Type", 664, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$6methodref$append$Type = function $clinit_Collectors$6methodref$append$Type() {
    jus.$clinit_Collectors$6methodref$append$Type = emptyMethod;
  };
  defineClass(665, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$6methodref$append$Type_2_classLit = createForClass("java.util.stream", "Collectors/6methodref$append$Type", 665, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$7methodref$append$Type = function $clinit_Collectors$7methodref$append$Type() {
    jus.$clinit_Collectors$7methodref$append$Type = emptyMethod;
  };
  defineClass(666, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$7methodref$append$Type_2_classLit = createForClass("java.util.stream", "Collectors/7methodref$append$Type", 666, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$8methodref$toString$Type = function $clinit_Collectors$8methodref$toString$Type() {
    jus.$clinit_Collectors$8methodref$toString$Type = emptyMethod;
  };
  defineClass(667, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$8methodref$toString$Type_2_classLit = createForClass("java.util.stream", "Collectors/8methodref$toString$Type", 667, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$9methodref$add$Type = function $clinit_Collectors$9methodref$add$Type() {
    jus.$clinit_Collectors$9methodref$add$Type = emptyMethod;
  };
  defineClass(669, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$9methodref$add$Type_2_classLit = createForClass("java.util.stream", "Collectors/9methodref$add$Type", 669, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$15$Type = function $clinit_Collectors$lambda$15$Type() {
    jus.$clinit_Collectors$lambda$15$Type = emptyMethod;
  };
  defineClass(668, 1, { 1: 1, 64: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$15$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$15$Type", 668, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$19$Type = function $clinit_Collectors$lambda$19$Type() {
    jus.$clinit_Collectors$lambda$19$Type = emptyMethod;
  };
  jus.Collectors$lambda$19$Type = function Collectors$lambda$19$Type(downstream_0, mapper_1) {
    jus.$clinit_Collectors$lambda$19$Type();
    this.downstream_0 = downstream_0;
    this.mapper_1 = mapper_1;
  };
  defineClass(386, 1, { 1: 1, 831: 1 }, jus.Collectors$lambda$19$Type);
  _.accept_1 = function accept_6(arg0, arg1) {
    jus.lambda$19(this.downstream_0, this.mapper_1, arg0, arg1);
  };
  cggl.Ljava_util_stream_Collectors$lambda$19$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$19$Type", 386, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$20$Type = function $clinit_Collectors$lambda$20$Type() {
    jus.$clinit_Collectors$lambda$20$Type = emptyMethod;
  };
  defineClass(673, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$20$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$20$Type", 673, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$21$Type = function $clinit_Collectors$lambda$21$Type() {
    jus.$clinit_Collectors$lambda$21$Type = emptyMethod;
  };
  defineClass(672, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$21$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$21$Type", 672, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$22$Type = function $clinit_Collectors$lambda$22$Type() {
    jus.$clinit_Collectors$lambda$22$Type = emptyMethod;
  };
  defineClass(674, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$22$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$22$Type", 674, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$25$Type = function $clinit_Collectors$lambda$25$Type() {
    jus.$clinit_Collectors$lambda$25$Type = emptyMethod;
  };
  defineClass(677, 1, { 1: 1, 64: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$25$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$25$Type", 677, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$27$Type = function $clinit_Collectors$lambda$27$Type() {
    jus.$clinit_Collectors$lambda$27$Type = emptyMethod;
  };
  defineClass(679, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$27$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$27$Type", 679, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$28$Type = function $clinit_Collectors$lambda$28$Type() {
    jus.$clinit_Collectors$lambda$28$Type = emptyMethod;
  };
  defineClass(680, 1, { 1: 1, 64: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$28$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$28$Type", 680, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$29$Type = function $clinit_Collectors$lambda$29$Type() {
    jus.$clinit_Collectors$lambda$29$Type = emptyMethod;
  };
  defineClass(681, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$29$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$29$Type", 681, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$3$Type = function $clinit_Collectors$lambda$3$Type() {
    jus.$clinit_Collectors$lambda$3$Type = emptyMethod;
  };
  defineClass(656, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$3$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$3$Type", 656, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$30$Type = function $clinit_Collectors$lambda$30$Type() {
    jus.$clinit_Collectors$lambda$30$Type = emptyMethod;
  };
  defineClass(682, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$30$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$30$Type", 682, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$31$Type = function $clinit_Collectors$lambda$31$Type() {
    jus.$clinit_Collectors$lambda$31$Type = emptyMethod;
  };
  defineClass(683, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$31$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$31$Type", 683, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$33$Type = function $clinit_Collectors$lambda$33$Type() {
    jus.$clinit_Collectors$lambda$33$Type = emptyMethod;
  };
  defineClass(685, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$33$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$33$Type", 685, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$34$Type = function $clinit_Collectors$lambda$34$Type() {
    jus.$clinit_Collectors$lambda$34$Type = emptyMethod;
  };
  defineClass(686, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$34$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$34$Type", 686, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$36$Type = function $clinit_Collectors$lambda$36$Type() {
    jus.$clinit_Collectors$lambda$36$Type = emptyMethod;
  };
  defineClass(688, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$36$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$36$Type", 688, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$37$Type = function $clinit_Collectors$lambda$37$Type() {
    jus.$clinit_Collectors$lambda$37$Type = emptyMethod;
  };
  defineClass(689, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$37$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$37$Type", 689, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$39$Type = function $clinit_Collectors$lambda$39$Type() {
    jus.$clinit_Collectors$lambda$39$Type = emptyMethod;
  };
  defineClass(691, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$39$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$39$Type", 691, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$4$Type = function $clinit_Collectors$lambda$4$Type() {
    jus.$clinit_Collectors$lambda$4$Type = emptyMethod;
  };
  defineClass(657, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$4$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$4$Type", 657, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$40$Type = function $clinit_Collectors$lambda$40$Type() {
    jus.$clinit_Collectors$lambda$40$Type = emptyMethod;
  };
  defineClass(692, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$40$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$40$Type", 692, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$42$Type = function $clinit_Collectors$lambda$42$Type() {
    jus.$clinit_Collectors$lambda$42$Type = emptyMethod;
  };
  defineClass(694, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$42$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$42$Type", 694, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$45$Type = function $clinit_Collectors$lambda$45$Type() {
    jus.$clinit_Collectors$lambda$45$Type = emptyMethod;
  };
  jus.Collectors$lambda$45$Type = function Collectors$lambda$45$Type() {
    jus.$clinit_Collectors$lambda$45$Type();
  };
  defineClass(388, 1, { 1: 1 }, jus.Collectors$lambda$45$Type);
  _.apply_2 = function apply_12(arg0, arg1) {
    return jus.lambda$45(castTo(arg0, 29), castTo(arg1, 29));
  };
  cggl.Ljava_util_stream_Collectors$lambda$45$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$45$Type", 388, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$49$Type = function $clinit_Collectors$lambda$49$Type() {
    jus.$clinit_Collectors$lambda$49$Type = emptyMethod;
  };
  jus.Collectors$lambda$49$Type = function Collectors$lambda$49$Type() {
    jus.$clinit_Collectors$lambda$49$Type();
  };
  defineClass(392, 1, { 1: 1 }, jus.Collectors$lambda$49$Type);
  _.apply_2 = function apply_13(arg0, arg1) {
    return jus.lambda$49(arg0, arg1);
  };
  cggl.Ljava_util_stream_Collectors$lambda$49$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$49$Type", 392, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$54$Type = function $clinit_Collectors$lambda$54$Type() {
    jus.$clinit_Collectors$lambda$54$Type = emptyMethod;
  };
  jus.Collectors$lambda$54$Type = function Collectors$lambda$54$Type(keyMapper_0, valueMapper_1, mergeFunction_2) {
    jus.$clinit_Collectors$lambda$54$Type();
    this.keyMapper_0 = keyMapper_0;
    this.valueMapper_1 = valueMapper_1;
    this.mergeFunction_2 = mergeFunction_2;
  };
  defineClass(396, 1, { 1: 1 }, jus.Collectors$lambda$54$Type);
  _.accept_1 = function accept_7(arg0, arg1) {
    jus.lambda$54(this.keyMapper_0, this.valueMapper_1, this.mergeFunction_2, castTo(arg0, 55), arg1);
  };
  cggl.Ljava_util_stream_Collectors$lambda$54$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$54$Type", 396, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$55$Type = function $clinit_Collectors$lambda$55$Type() {
    jus.$clinit_Collectors$lambda$55$Type = emptyMethod;
  };
  jus.Collectors$lambda$55$Type = function Collectors$lambda$55$Type(mergeFunction_0) {
    jus.$clinit_Collectors$lambda$55$Type();
    this.mergeFunction_0 = mergeFunction_0;
  };
  defineClass(397, 1, { 1: 1 }, jus.Collectors$lambda$55$Type);
  _.apply_2 = function apply_14(arg0, arg1) {
    return jus.lambda$55(this.mergeFunction_0, castTo(arg0, 55), castTo(arg1, 55));
  };
  cggl.Ljava_util_stream_Collectors$lambda$55$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$55$Type", 397, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$58$Type = function $clinit_Collectors$lambda$58$Type() {
    jus.$clinit_Collectors$lambda$58$Type = emptyMethod;
  };
  jus.Collectors$lambda$58$Type = function Collectors$lambda$58$Type() {
    jus.$clinit_Collectors$lambda$58$Type();
  };
  defineClass(400, 1, { 1: 1 }, jus.Collectors$lambda$58$Type);
  _.apply_2 = function apply_15(arg0, arg1) {
    return jus.lambda$58(castTo(arg0, 70), castTo(arg1, 70));
  };
  cggl.Ljava_util_stream_Collectors$lambda$58$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$58$Type", 400, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$59$Type = function $clinit_Collectors$lambda$59$Type() {
    jus.$clinit_Collectors$lambda$59$Type = emptyMethod;
  };
  jus.Collectors$lambda$59$Type = function Collectors$lambda$59$Type() {
    jus.$clinit_Collectors$lambda$59$Type();
  };
  defineClass(401, 1, { 1: 1 }, jus.Collectors$lambda$59$Type);
  _.andThen = function andThen_9(after) {
    return juf.$andThen(this, after);
  };
  _.apply_1 = function apply_16(arg0) {
    return jus.lambda$59(castTo(arg0, 70));
  };
  cggl.Ljava_util_stream_Collectors$lambda$59$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$59$Type", 401, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$6$Type = function $clinit_Collectors$lambda$6$Type() {
    jus.$clinit_Collectors$lambda$6$Type = emptyMethod;
  };
  defineClass(659, 1, { 1: 1, 64: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$6$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$6$Type", 659, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$7$Type = function $clinit_Collectors$lambda$7$Type() {
    jus.$clinit_Collectors$lambda$7$Type = emptyMethod;
  };
  defineClass(660, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$7$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$7$Type", 660, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$8$Type = function $clinit_Collectors$lambda$8$Type() {
    jus.$clinit_Collectors$lambda$8$Type = emptyMethod;
  };
  defineClass(662, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$8$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$8$Type", 662, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Collectors$lambda$9$Type = function $clinit_Collectors$lambda$9$Type() {
    jus.$clinit_Collectors$lambda$9$Type = emptyMethod;
  };
  defineClass(663, 1, { 1: 1 });
  cggl.Ljava_util_stream_Collectors$lambda$9$Type_2_classLit = createForClass("java.util.stream", "Collectors/lambda$9$Type", 663, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStream = function $clinit_IntStream() {
    jus.$clinit_IntStream = emptyMethod;
  };
  jus.$iterator = function $iterator(this$static) {
    return this$static.iterator_0();
  };
  jus.$spliterator_4 = function $spliterator_4(this$static) {
    return this$static.spliterator_1();
  };
  cggl.Ljava_util_stream_IntStream_2_classLit = createForInterface("java.util.stream", "IntStream");
  jus.$clinit_IntStream$0methodref$close$Type = function $clinit_IntStream$0methodref$close$Type() {
    jus.$clinit_IntStream$0methodref$close$Type = emptyMethod;
  };
  defineClass(516, 1, { 1: 1, 130: 1 });
  cggl.Ljava_util_stream_IntStream$0methodref$close$Type_2_classLit = createForClass("java.util.stream", "IntStream/0methodref$close$Type", 516, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStream$Builder = function $clinit_IntStream$Builder() {
    jus.$clinit_IntStream$Builder = emptyMethod;
  };
  cggl.Ljava_util_stream_IntStream$Builder_2_classLit = createForInterface("java.util.stream", "IntStream/Builder");
  jus.$clinit_IntStream$1 = function $clinit_IntStream$1() {
    jus.$clinit_IntStream$1 = emptyMethod;
  };
  defineClass(513, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStream$1_2_classLit = createForClass("java.util.stream", "IntStream/1", 513, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStream$1methodref$close$Type = function $clinit_IntStream$1methodref$close$Type() {
    jus.$clinit_IntStream$1methodref$close$Type = emptyMethod;
  };
  defineClass(517, 1, { 1: 1, 130: 1 });
  cggl.Ljava_util_stream_IntStream$1methodref$close$Type_2_classLit = createForClass("java.util.stream", "IntStream/1methodref$close$Type", 517, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStream$2 = function $clinit_IntStream$2() {
    jus.$clinit_IntStream$2 = emptyMethod;
  };
  defineClass(514, 232, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_stream_IntStream$2_2_classLit = createForClass("java.util.stream", "IntStream/2", 514, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_IntStream$2$lambda$0$Type = function $clinit_IntStream$2$lambda$0$Type() {
    jus.$clinit_IntStream$2$lambda$0$Type = emptyMethod;
  };
  defineClass(515, 1, { 1: 1 });
  cggl.Ljava_util_stream_IntStream$2$lambda$0$Type_2_classLit = createForClass("java.util.stream", "IntStream/2/lambda$0$Type", 515, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStream$3 = function $clinit_IntStream$3() {
    jus.$clinit_IntStream$3 = emptyMethod;
  };
  defineClass(518, 232, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_stream_IntStream$3_2_classLit = createForClass("java.util.stream", "IntStream/3", 518, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_IntStream$4 = function $clinit_IntStream$4() {
    jus.$clinit_IntStream$4 = emptyMethod;
  };
  defineClass(520, 232, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_stream_IntStream$4_2_classLit = createForClass("java.util.stream", "IntStream/4", 520, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_IntStream$5 = function $clinit_IntStream$5() {
    jus.$clinit_IntStream$5 = emptyMethod;
  };
  defineClass(521, 232, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_stream_IntStream$5_2_classLit = createForClass("java.util.stream", "IntStream/5", 521, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_IntStream$6 = function $clinit_IntStream$6() {
    jus.$clinit_IntStream$6 = emptyMethod;
  };
  defineClass(522, 232, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_stream_IntStream$6_2_classLit = createForClass("java.util.stream", "IntStream/6", 522, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_IntStream$6$lambda$0$Type = function $clinit_IntStream$6$lambda$0$Type() {
    jus.$clinit_IntStream$6$lambda$0$Type = emptyMethod;
  };
  defineClass(523, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStream$6$lambda$0$Type_2_classLit = createForClass("java.util.stream", "IntStream/6/lambda$0$Type", 523, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStream$7 = function $clinit_IntStream$7() {
    jus.$clinit_IntStream$7 = emptyMethod;
  };
  defineClass(524, 232, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_stream_IntStream$7_2_classLit = createForClass("java.util.stream", "IntStream/7", 524, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_IntStream$7$lambda$0$Type = function $clinit_IntStream$7$lambda$0$Type() {
    jus.$clinit_IntStream$7$lambda$0$Type = emptyMethod;
  };
  defineClass(525, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStream$7$lambda$0$Type_2_classLit = createForClass("java.util.stream", "IntStream/7/lambda$0$Type", 525, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStream$lambda$2$Type = function $clinit_IntStream$lambda$2$Type() {
    jus.$clinit_IntStream$lambda$2$Type = emptyMethod;
  };
  defineClass(519, 1, { 1: 1 });
  cggl.Ljava_util_stream_IntStream$lambda$2$Type_2_classLit = createForClass("java.util.stream", "IntStream/lambda$2$Type", 519, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_TerminatableStream = function $clinit_TerminatableStream() {
    jus.$clinit_TerminatableStream = emptyMethod;
    jl.$clinit_Object();
  };
  jus.TerminatableStream = function TerminatableStream(previous) {
    jus.$clinit_TerminatableStream();
    Object_0.call(this);
    this.$init_394();
    if (isNull(previous)) {
      this.root = null;
      this.onClose = new ju.ArrayList();
    } else {
      this.root = previous;
      this.onClose = null;
    }
  };
  jus.lambda$0_6 = function lambda$0_6(throwables_0, runnable_1) {
    jus.$clinit_TerminatableStream();
    var e;
    {
      try {
        runnable_1.run();
      } catch ($e0) {
        $e0 = toJava($e0);
        if (instanceOf($e0, 18)) {
          e = $e0;
          throwables_0.add(e);
        } else
          throw toJs($e0);
      }
    }
  };
  defineClass(186, 1, { 1: 1 });
  _.$init_394 = function $init_394() {
    this.terminated = false;
  };
  _.close_0 = function close_11() {
    if (isNull(this.root)) {
      this.terminated = true;
      this.runClosers();
    } else {
      this.root.close_0();
    }
  };
  _.runClosers = function runClosers() {
    var e, i, size_0, suppressed, throwables;
    throwables = new ju.ArrayList();
    this.onClose.forEach(new jus.TerminatableStream$lambda$0$Type(throwables));
    this.onClose.clear();
    if (!throwables.isEmpty()) {
      e = castTo(throwables.getAtIndex(0), 18);
      for (i = 1, size_0 = throwables.size(); i < size_0; ++i) {
        suppressed = castTo(throwables.getAtIndex(i), 18);
        if (jsNotEquals(suppressed, e)) {
          e.addSuppressed(suppressed);
        }
      }
      if (instanceOf(e, 23)) {
        throw toJs(castTo(e, 23));
      }
      if (instanceOf(e, 122)) {
        throw toJs(castTo(e, 122));
      }
    }
  };
  _.terminate = function terminate() {
    if (isNull(this.root)) {
      this.throwIfTerminated();
      this.terminated = true;
    } else {
      this.root.terminate();
    }
  };
  _.throwIfTerminated = function throwIfTerminated() {
    if (isNotNull(this.root)) {
      this.root.throwIfTerminated();
    } else if (this.terminated) {
      throw toJs(new jl.IllegalStateException_0("Stream already terminated, can't be modified or used"));
    }
  };
  _.terminated = false;
  cggl.Ljava_util_stream_TerminatableStream_2_classLit = createForClass("java.util.stream", "TerminatableStream", 186, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl = function $clinit_IntStreamImpl() {
    jus.$clinit_IntStreamImpl = emptyMethod;
    jus.$clinit_TerminatableStream();
    jus.$clinit_IntStream();
  };
  jus.IntStreamImpl = function IntStreamImpl(previous, spliterator) {
    jus.$clinit_IntStreamImpl();
    jus.TerminatableStream.call(this, previous);
    this.$init_395();
    this.spliterator = spliterator;
  };
  defineClass(271, 186, { 1: 1, 296: 1 }, jus.IntStreamImpl);
  _.$init_395 = function $init_395() {
  };
  _.close_0 = function close_12() {
    getClassPrototype(186).close_0.call(this);
  };
  _.iterator = function iterator_19() {
    return this.iterator_0();
  };
  _.spliterator_0 = function spliterator_15() {
    return this.spliterator_1();
  };
  _.iterator_0 = function iterator_20() {
    return ju.iterator_15(this.spliterator_1());
  };
  _.spliterator_1 = function spliterator_14() {
    this.terminate();
    return this.spliterator;
  };
  cggl.Ljava_util_stream_IntStreamImpl_2_classLit = createForClass("java.util.stream", "IntStreamImpl", 271, cggl.Ljava_util_stream_TerminatableStream_2_classLit);
  jus.$clinit_IntStreamImpl$0methodref$ctor$Type = function $clinit_IntStreamImpl$0methodref$ctor$Type() {
    jus.$clinit_IntStreamImpl$0methodref$ctor$Type = emptyMethod;
  };
  defineClass(782, 1, { 1: 1, 64: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$0methodref$ctor$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/0methodref$ctor$Type", 782, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$1 = function $clinit_IntStreamImpl$1() {
    jus.$clinit_IntStreamImpl$1 = emptyMethod;
  };
  defineClass(789, 232, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$1_2_classLit = createForClass("java.util.stream", "IntStreamImpl/1", 789, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_IntStreamImpl$1$lambda$0$Type = function $clinit_IntStreamImpl$1$lambda$0$Type() {
    jus.$clinit_IntStreamImpl$1$lambda$0$Type = emptyMethod;
  };
  defineClass(790, 1, { 1: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$1$lambda$0$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/1/lambda$0$Type", 790, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$1methodref$combine$Type = function $clinit_IntStreamImpl$1methodref$combine$Type() {
    jus.$clinit_IntStreamImpl$1methodref$combine$Type = emptyMethod;
  };
  defineClass(784, 1, { 1: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$1methodref$combine$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/1methodref$combine$Type", 784, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$2 = function $clinit_IntStreamImpl$2() {
    jus.$clinit_IntStreamImpl$2 = emptyMethod;
  };
  defineClass(792, 232, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$2_2_classLit = createForClass("java.util.stream", "IntStreamImpl/2", 792, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_IntStreamImpl$2$lambda$0$Type = function $clinit_IntStreamImpl$2$lambda$0$Type() {
    jus.$clinit_IntStreamImpl$2$lambda$0$Type = emptyMethod;
  };
  defineClass(793, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$2$lambda$0$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/2/lambda$0$Type", 793, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$2methodref$add$Type = function $clinit_IntStreamImpl$2methodref$add$Type() {
    jus.$clinit_IntStreamImpl$2methodref$add$Type = emptyMethod;
  };
  defineClass(791, 1, { 1: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$2methodref$add$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/2methodref$add$Type", 791, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$3 = function $clinit_IntStreamImpl$3() {
    jus.$clinit_IntStreamImpl$3 = emptyMethod;
  };
  defineClass(794, 232, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$3_2_classLit = createForClass("java.util.stream", "IntStreamImpl/3", 794, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_IntStreamImpl$3methodref$valueOf$Type = function $clinit_IntStreamImpl$3methodref$valueOf$Type() {
    jus.$clinit_IntStreamImpl$3methodref$valueOf$Type = emptyMethod;
  };
  defineClass(797, 1, { 1: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$3methodref$valueOf$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/3methodref$valueOf$Type", 797, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$Empty = function $clinit_IntStreamImpl$Empty() {
    jus.$clinit_IntStreamImpl$Empty = emptyMethod;
  };
  defineClass(767, 186, { 1: 1, 296: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$Empty_2_classLit = createForClass("java.util.stream", "IntStreamImpl/Empty", 767, cggl.Ljava_util_stream_TerminatableStream_2_classLit);
  jus.$clinit_IntStreamImpl$FilterSpliterator = function $clinit_IntStreamImpl$FilterSpliterator() {
    jus.$clinit_IntStreamImpl$FilterSpliterator = emptyMethod;
  };
  defineClass(772, 232, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$FilterSpliterator_2_classLit = createForClass("java.util.stream", "IntStreamImpl/FilterSpliterator", 772, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_IntStreamImpl$FilterSpliterator$lambda$0$Type = function $clinit_IntStreamImpl$FilterSpliterator$lambda$0$Type() {
    jus.$clinit_IntStreamImpl$FilterSpliterator$lambda$0$Type = emptyMethod;
  };
  defineClass(780, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$FilterSpliterator$lambda$0$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/FilterSpliterator/lambda$0$Type", 780, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$LimitSpliterator = function $clinit_IntStreamImpl$LimitSpliterator() {
    jus.$clinit_IntStreamImpl$LimitSpliterator = emptyMethod;
  };
  defineClass(774, 232, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$LimitSpliterator_2_classLit = createForClass("java.util.stream", "IntStreamImpl/LimitSpliterator", 774, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_IntStreamImpl$MapToDoubleSpliterator = function $clinit_IntStreamImpl$MapToDoubleSpliterator() {
    jus.$clinit_IntStreamImpl$MapToDoubleSpliterator = emptyMethod;
  };
  defineClass(771, 527, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$MapToDoubleSpliterator_2_classLit = createForClass("java.util.stream", "IntStreamImpl/MapToDoubleSpliterator", 771, cggl.Ljava_util_Spliterators$AbstractDoubleSpliterator_2_classLit);
  jus.$clinit_IntStreamImpl$MapToDoubleSpliterator$lambda$0$Type = function $clinit_IntStreamImpl$MapToDoubleSpliterator$lambda$0$Type() {
    jus.$clinit_IntStreamImpl$MapToDoubleSpliterator$lambda$0$Type = emptyMethod;
  };
  defineClass(779, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$MapToDoubleSpliterator$lambda$0$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/MapToDoubleSpliterator/lambda$0$Type", 779, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$MapToIntSpliterator = function $clinit_IntStreamImpl$MapToIntSpliterator() {
    jus.$clinit_IntStreamImpl$MapToIntSpliterator = emptyMethod;
  };
  defineClass(768, 232, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$MapToIntSpliterator_2_classLit = createForClass("java.util.stream", "IntStreamImpl/MapToIntSpliterator", 768, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_IntStreamImpl$MapToIntSpliterator$lambda$0$Type = function $clinit_IntStreamImpl$MapToIntSpliterator$lambda$0$Type() {
    jus.$clinit_IntStreamImpl$MapToIntSpliterator$lambda$0$Type = emptyMethod;
  };
  defineClass(776, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$MapToIntSpliterator$lambda$0$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/MapToIntSpliterator/lambda$0$Type", 776, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$MapToLongSpliterator = function $clinit_IntStreamImpl$MapToLongSpliterator() {
    jus.$clinit_IntStreamImpl$MapToLongSpliterator = emptyMethod;
  };
  defineClass(770, 528, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$MapToLongSpliterator_2_classLit = createForClass("java.util.stream", "IntStreamImpl/MapToLongSpliterator", 770, cggl.Ljava_util_Spliterators$AbstractLongSpliterator_2_classLit);
  jus.$clinit_IntStreamImpl$MapToLongSpliterator$lambda$0$Type = function $clinit_IntStreamImpl$MapToLongSpliterator$lambda$0$Type() {
    jus.$clinit_IntStreamImpl$MapToLongSpliterator$lambda$0$Type = emptyMethod;
  };
  defineClass(778, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$MapToLongSpliterator$lambda$0$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/MapToLongSpliterator/lambda$0$Type", 778, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$MapToObjSpliterator = function $clinit_IntStreamImpl$MapToObjSpliterator() {
    jus.$clinit_IntStreamImpl$MapToObjSpliterator = emptyMethod;
  };
  defineClass(769, 230, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$MapToObjSpliterator_2_classLit = createForClass("java.util.stream", "IntStreamImpl/MapToObjSpliterator", 769, cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit);
  jus.$clinit_IntStreamImpl$MapToObjSpliterator$lambda$0$Type = function $clinit_IntStreamImpl$MapToObjSpliterator$lambda$0$Type() {
    jus.$clinit_IntStreamImpl$MapToObjSpliterator$lambda$0$Type = emptyMethod;
  };
  defineClass(777, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$MapToObjSpliterator$lambda$0$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/MapToObjSpliterator/lambda$0$Type", 777, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$SkipSpliterator = function $clinit_IntStreamImpl$SkipSpliterator() {
    jus.$clinit_IntStreamImpl$SkipSpliterator = emptyMethod;
  };
  defineClass(773, 232, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$SkipSpliterator_2_classLit = createForClass("java.util.stream", "IntStreamImpl/SkipSpliterator", 773, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_IntStreamImpl$SkipSpliterator$lambda$0$Type = function $clinit_IntStreamImpl$SkipSpliterator$lambda$0$Type() {
    jus.$clinit_IntStreamImpl$SkipSpliterator$lambda$0$Type = emptyMethod;
  };
  defineClass(781, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$SkipSpliterator$lambda$0$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/SkipSpliterator/lambda$0$Type", 781, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$ValueConsumer = function $clinit_IntStreamImpl$ValueConsumer() {
    jus.$clinit_IntStreamImpl$ValueConsumer = emptyMethod;
  };
  defineClass(775, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$ValueConsumer_2_classLit = createForClass("java.util.stream", "IntStreamImpl/ValueConsumer", 775, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$lambda$1$Type = function $clinit_IntStreamImpl$lambda$1$Type() {
    jus.$clinit_IntStreamImpl$lambda$1$Type = emptyMethod;
  };
  defineClass(783, 1, { 1: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$lambda$1$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/lambda$1$Type", 783, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$lambda$3$Type = function $clinit_IntStreamImpl$lambda$3$Type() {
    jus.$clinit_IntStreamImpl$lambda$3$Type = emptyMethod;
  };
  defineClass(785, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$lambda$3$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/lambda$3$Type", 785, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$lambda$4$Type = function $clinit_IntStreamImpl$lambda$4$Type() {
    jus.$clinit_IntStreamImpl$lambda$4$Type = emptyMethod;
  };
  defineClass(786, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$lambda$4$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/lambda$4$Type", 786, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$lambda$5$Type = function $clinit_IntStreamImpl$lambda$5$Type() {
    jus.$clinit_IntStreamImpl$lambda$5$Type = emptyMethod;
  };
  defineClass(787, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$lambda$5$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/lambda$5$Type", 787, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$lambda$6$Type = function $clinit_IntStreamImpl$lambda$6$Type() {
    jus.$clinit_IntStreamImpl$lambda$6$Type = emptyMethod;
  };
  defineClass(788, 1, { 1: 1, 30: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$lambda$6$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/lambda$6$Type", 788, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$lambda$8$Type = function $clinit_IntStreamImpl$lambda$8$Type() {
    jus.$clinit_IntStreamImpl$lambda$8$Type = emptyMethod;
  };
  defineClass(795, 1, { 1: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$lambda$8$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/lambda$8$Type", 795, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_IntStreamImpl$lambda$9$Type = function $clinit_IntStreamImpl$lambda$9$Type() {
    jus.$clinit_IntStreamImpl$lambda$9$Type = emptyMethod;
  };
  defineClass(796, 1, { 1: 1 });
  cggl.Ljava_util_stream_IntStreamImpl$lambda$9$Type_2_classLit = createForClass("java.util.stream", "IntStreamImpl/lambda$9$Type", 796, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Stream = function $clinit_Stream() {
    jus.$clinit_Stream = emptyMethod;
  };
  jus.of_37 = function of_37(t) {
    jus.$clinit_Stream();
    return ju.singleton(t).stream();
  };
  cggl.Ljava_util_stream_Stream_2_classLit = createForInterface("java.util.stream", "Stream");
  jus.$clinit_Stream$0methodref$close$Type = function $clinit_Stream$0methodref$close$Type() {
    jus.$clinit_Stream$0methodref$close$Type = emptyMethod;
  };
  defineClass(559, 1, { 1: 1, 130: 1 });
  cggl.Ljava_util_stream_Stream$0methodref$close$Type_2_classLit = createForClass("java.util.stream", "Stream/0methodref$close$Type", 559, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Stream$Builder = function $clinit_Stream$Builder() {
    jus.$clinit_Stream$Builder = emptyMethod;
  };
  cggl.Ljava_util_stream_Stream$Builder_2_classLit = createForInterface("java.util.stream", "Stream/Builder");
  jus.$clinit_Stream$1 = function $clinit_Stream$1() {
    jus.$clinit_Stream$1 = emptyMethod;
  };
  defineClass(556, 1, { 1: 1 });
  cggl.Ljava_util_stream_Stream$1_2_classLit = createForClass("java.util.stream", "Stream/1", 556, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Stream$1methodref$close$Type = function $clinit_Stream$1methodref$close$Type() {
    jus.$clinit_Stream$1methodref$close$Type = emptyMethod;
  };
  defineClass(560, 1, { 1: 1, 130: 1 });
  cggl.Ljava_util_stream_Stream$1methodref$close$Type_2_classLit = createForClass("java.util.stream", "Stream/1methodref$close$Type", 560, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Stream$2 = function $clinit_Stream$2() {
    jus.$clinit_Stream$2 = emptyMethod;
  };
  defineClass(557, 230, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_Stream$2_2_classLit = createForClass("java.util.stream", "Stream/2", 557, cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit);
  jus.$clinit_Stream$2$lambda$0$Type = function $clinit_Stream$2$lambda$0$Type() {
    jus.$clinit_Stream$2$lambda$0$Type = emptyMethod;
  };
  defineClass(558, 1, { 1: 1 });
  cggl.Ljava_util_stream_Stream$2$lambda$0$Type_2_classLit = createForClass("java.util.stream", "Stream/2/lambda$0$Type", 558, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Stream$3 = function $clinit_Stream$3() {
    jus.$clinit_Stream$3 = emptyMethod;
  };
  defineClass(561, 230, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_Stream$3_2_classLit = createForClass("java.util.stream", "Stream/3", 561, cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit);
  jus.$clinit_Stream$4 = function $clinit_Stream$4() {
    jus.$clinit_Stream$4 = emptyMethod;
  };
  defineClass(563, 230, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_Stream$4_2_classLit = createForClass("java.util.stream", "Stream/4", 563, cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit);
  jus.$clinit_Stream$5 = function $clinit_Stream$5() {
    jus.$clinit_Stream$5 = emptyMethod;
  };
  defineClass(564, 230, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_Stream$5_2_classLit = createForClass("java.util.stream", "Stream/5", 564, cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit);
  jus.$clinit_Stream$5$lambda$0$Type = function $clinit_Stream$5$lambda$0$Type() {
    jus.$clinit_Stream$5$lambda$0$Type = emptyMethod;
  };
  defineClass(565, 1, { 1: 1 });
  cggl.Ljava_util_stream_Stream$5$lambda$0$Type_2_classLit = createForClass("java.util.stream", "Stream/5/lambda$0$Type", 565, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Stream$6 = function $clinit_Stream$6() {
    jus.$clinit_Stream$6 = emptyMethod;
  };
  defineClass(566, 230, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_Stream$6_2_classLit = createForClass("java.util.stream", "Stream/6", 566, cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit);
  jus.$clinit_Stream$6$lambda$0$Type = function $clinit_Stream$6$lambda$0$Type() {
    jus.$clinit_Stream$6$lambda$0$Type = emptyMethod;
  };
  defineClass(567, 1, { 1: 1 });
  cggl.Ljava_util_stream_Stream$6$lambda$0$Type_2_classLit = createForClass("java.util.stream", "Stream/6/lambda$0$Type", 567, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_Stream$lambda$2$Type = function $clinit_Stream$lambda$2$Type() {
    jus.$clinit_Stream$lambda$2$Type = emptyMethod;
  };
  defineClass(562, 1, { 1: 1 });
  cggl.Ljava_util_stream_Stream$lambda$2$Type_2_classLit = createForClass("java.util.stream", "Stream/lambda$2$Type", 562, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl = function $clinit_StreamImpl() {
    jus.$clinit_StreamImpl = emptyMethod;
    jus.$clinit_TerminatableStream();
    jus.$clinit_Stream();
    jus.NULL_CONSUMER = new jus.StreamImpl$lambda$0$Type();
  };
  jus.StreamImpl = function StreamImpl(prev, spliterator) {
    jus.$clinit_StreamImpl();
    jus.TerminatableStream.call(this, prev);
    this.$init_396();
    this.spliterator = spliterator;
  };
  jus.lambda$0_7 = function lambda$0_7(value_0) {
    jus.$clinit_StreamImpl();
    {
    }
  };
  jus.lambda$2_0 = function lambda$2_0(arg0) {
    jus.$clinit_StreamImpl();
    return initUnidimensionalArray(cggl.Ljava_lang_Object_2_classLit, { 4: 1, 1: 1, 7: 1 }, 1, arg0, 5, 1);
  };
  jus.lambda$4 = function lambda$4(collector_0, a_1, t_2) {
    jus.$clinit_StreamImpl();
    {
      collector_0.accumulator_0().accept_1(a_1, t_2);
      return a_1;
    }
  };
  jus.lambda$5 = function lambda$5(consumer_0, accumulator_1, item_2) {
    jus.$clinit_StreamImpl();
    {
      consumer_0.accept_0(accumulator_1.apply_2(consumer_0.value_0, item_2));
    }
  };
  defineClass(256, 186, { 1: 1 }, jus.StreamImpl);
  _.$init_396 = function $init_396() {
  };
  _.close_0 = function close_13() {
    getClassPrototype(186).close_0.call(this);
  };
  _.collect_0 = function collect_1(collector) {
    return collector.finisher_0().apply_1(this.reduce(collector.supplier_0().get_2(), new jus.StreamImpl$lambda$4$Type(collector), collector.combiner_0()));
  };
  _.flatMapToInt = function flatMapToInt(mapper) {
    var flatMapSpliterator, spliteratorOfStreams;
    this.throwIfTerminated();
    spliteratorOfStreams = new jus.StreamImpl$MapToObjSpliterator(mapper, this.spliterator);
    flatMapSpliterator = new jus.StreamImpl$2(this, { l: 4194303, m: 4194303, h: 524287 }, 0, spliteratorOfStreams);
    return new jus.IntStreamImpl(this, flatMapSpliterator);
  };
  _.forEach = function forEach_8(action) {
    this.forEachOrdered(action);
  };
  _.forEachOrdered = function forEachOrdered(action) {
    this.terminate();
    this.spliterator.forEachRemaining_0(action);
  };
  _.iterator = function iterator_21() {
    return ju.iterator_16(this.spliterator_0());
  };
  _.map_3 = function map_5(mapper) {
    this.throwIfTerminated();
    return new jus.StreamImpl(this, new jus.StreamImpl$MapToObjSpliterator(mapper, this.spliterator));
  };
  _.reduce = function reduce(identity, accumulator, combiner) {
    var consumer;
    this.terminate();
    consumer = new jus.StreamImpl$ValueConsumer();
    consumer.value_0 = identity;
    this.spliterator.forEachRemaining_0(new jus.StreamImpl$lambda$5$Type(consumer, accumulator));
    return consumer.value_0;
  };
  _.spliterator_0 = function spliterator_16() {
    this.terminate();
    return this.spliterator;
  };
  _.toArray_2 = function toArray_18() {
    return this.toArray_3(new jus.StreamImpl$0methodref$lambda$2$Type());
  };
  _.toArray_3 = function toArray_19(generator) {
    var collected;
    collected = castTo(this.collect_0(jus.toList()), 59);
    return collected.toArray_0(castToArray(generator.apply_3(collected.size())));
  };
  cggl.Ljava_util_stream_StreamImpl_2_classLit = createForClass("java.util.stream", "StreamImpl", 256, cggl.Ljava_util_stream_TerminatableStream_2_classLit);
  jus.$clinit_StreamImpl$0methodref$lambda$2$Type = function $clinit_StreamImpl$0methodref$lambda$2$Type() {
    jus.$clinit_StreamImpl$0methodref$lambda$2$Type = emptyMethod;
  };
  jus.StreamImpl$0methodref$lambda$2$Type = function StreamImpl$0methodref$lambda$2$Type() {
    jus.$clinit_StreamImpl$0methodref$lambda$2$Type();
  };
  defineClass(420, 1, { 1: 1 }, jus.StreamImpl$0methodref$lambda$2$Type);
  _.apply_3 = function apply_17(arg0) {
    return jus.lambda$2_0(arg0);
  };
  cggl.Ljava_util_stream_StreamImpl$0methodref$lambda$2$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/0methodref$lambda$2$Type", 420, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$1 = function $clinit_StreamImpl$1() {
    jus.$clinit_StreamImpl$1 = emptyMethod;
  };
  defineClass(728, 230, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_StreamImpl$1_2_classLit = createForClass("java.util.stream", "StreamImpl/1", 728, cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit);
  jus.$clinit_StreamImpl$1$lambda$0$Type = function $clinit_StreamImpl$1$lambda$0$Type() {
    jus.$clinit_StreamImpl$1$lambda$0$Type = emptyMethod;
  };
  defineClass(729, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamImpl$1$lambda$0$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/1/lambda$0$Type", 729, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$1methodref$add$Type = function $clinit_StreamImpl$1methodref$add$Type() {
    jus.$clinit_StreamImpl$1methodref$add$Type = emptyMethod;
  };
  defineClass(734, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamImpl$1methodref$add$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/1methodref$add$Type", 734, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$2 = function $clinit_StreamImpl$2() {
    jus.$clinit_StreamImpl$2 = emptyMethod;
    ju.$clinit_Spliterators$AbstractIntSpliterator();
  };
  jus.StreamImpl$2 = function StreamImpl$2(this$0, $anonymous0, $anonymous1, val$spliteratorOfStreams) {
    jus.$clinit_StreamImpl$2();
    this.this$01 = this$0;
    this.val$spliteratorOfStreams5 = val$spliteratorOfStreams;
    ju.Spliterators$AbstractIntSpliterator.call(this, $anonymous0, $anonymous1);
    this.$init_397();
  };
  defineClass(423, 232, { 1: 1, 20: 1, 53: 1 }, jus.StreamImpl$2);
  _.$init_397 = function $init_397() {
  };
  _.lambda$0_2 = function lambda$0_8(n_0) {
    jus.$clinit_StreamImpl$2();
    {
      if (isNotNull(n_0)) {
        this.nextStream = n_0;
        this.next_0 = n_0.spliterator_1();
      }
    }
  };
  _.tryAdvance_0 = function tryAdvance_4(action) {
    return this.tryAdvance_1(castTo(action, 30));
  };
  _.advanceToNextSpliterator = function advanceToNextSpliterator() {
    while (isNull(this.next_0)) {
      if (!this.val$spliteratorOfStreams5.tryAdvance(new jus.StreamImpl$2$lambda$0$Type(this))) {
        return false;
      }
    }
    return true;
  };
  _.tryAdvance_1 = function tryAdvance_5(action) {
    while (this.advanceToNextSpliterator()) {
      if (this.next_0.tryAdvance_0(action)) {
        return true;
      } else {
        this.nextStream.close_0();
        this.nextStream = null;
        this.next_0 = null;
      }
    }
    return false;
  };
  cggl.Ljava_util_stream_StreamImpl$2_2_classLit = createForClass("java.util.stream", "StreamImpl/2", 423, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_StreamImpl$2$lambda$0$Type = function $clinit_StreamImpl$2$lambda$0$Type() {
    jus.$clinit_StreamImpl$2$lambda$0$Type = emptyMethod;
  };
  jus.StreamImpl$2$lambda$0$Type = function StreamImpl$2$lambda$0$Type($$outer_0) {
    jus.$clinit_StreamImpl$2$lambda$0$Type();
    this.$$outer_0 = $$outer_0;
  };
  defineClass(424, 1, { 1: 1 }, jus.StreamImpl$2$lambda$0$Type);
  _.accept_0 = function accept_8(arg0) {
    this.$$outer_0.lambda$0_2(castTo(arg0, 296));
  };
  cggl.Ljava_util_stream_StreamImpl$2$lambda$0$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/2/lambda$0$Type", 424, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$3 = function $clinit_StreamImpl$3() {
    jus.$clinit_StreamImpl$3 = emptyMethod;
  };
  defineClass(730, 528, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_StreamImpl$3_2_classLit = createForClass("java.util.stream", "StreamImpl/3", 730, cggl.Ljava_util_Spliterators$AbstractLongSpliterator_2_classLit);
  jus.$clinit_StreamImpl$3$lambda$0$Type = function $clinit_StreamImpl$3$lambda$0$Type() {
    jus.$clinit_StreamImpl$3$lambda$0$Type = emptyMethod;
  };
  defineClass(731, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamImpl$3$lambda$0$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/3/lambda$0$Type", 731, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$4 = function $clinit_StreamImpl$4() {
    jus.$clinit_StreamImpl$4 = emptyMethod;
  };
  defineClass(732, 527, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_StreamImpl$4_2_classLit = createForClass("java.util.stream", "StreamImpl/4", 732, cggl.Ljava_util_Spliterators$AbstractDoubleSpliterator_2_classLit);
  jus.$clinit_StreamImpl$4$lambda$0$Type = function $clinit_StreamImpl$4$lambda$0$Type() {
    jus.$clinit_StreamImpl$4$lambda$0$Type = emptyMethod;
  };
  defineClass(733, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamImpl$4$lambda$0$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/4/lambda$0$Type", 733, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$5 = function $clinit_StreamImpl$5() {
    jus.$clinit_StreamImpl$5 = emptyMethod;
  };
  defineClass(735, 230, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_StreamImpl$5_2_classLit = createForClass("java.util.stream", "StreamImpl/5", 735, cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit);
  jus.$clinit_StreamImpl$5$2methodref$add$Type = function $clinit_StreamImpl$5$2methodref$add$Type() {
    jus.$clinit_StreamImpl$5$2methodref$add$Type = emptyMethod;
  };
  defineClass(736, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamImpl$5$2methodref$add$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/5/2methodref$add$Type", 736, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$6 = function $clinit_StreamImpl$6() {
    jus.$clinit_StreamImpl$6 = emptyMethod;
  };
  defineClass(737, 230, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_StreamImpl$6_2_classLit = createForClass("java.util.stream", "StreamImpl/6", 737, cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit);
  jus.$clinit_StreamImpl$6$lambda$0$Type = function $clinit_StreamImpl$6$lambda$0$Type() {
    jus.$clinit_StreamImpl$6$lambda$0$Type = emptyMethod;
  };
  defineClass(738, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamImpl$6$lambda$0$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/6/lambda$0$Type", 738, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$Empty = function $clinit_StreamImpl$Empty() {
    jus.$clinit_StreamImpl$Empty = emptyMethod;
  };
  defineClass(714, 186, { 1: 1 });
  cggl.Ljava_util_stream_StreamImpl$Empty_2_classLit = createForClass("java.util.stream", "StreamImpl/Empty", 714, cggl.Ljava_util_stream_TerminatableStream_2_classLit);
  jus.$clinit_StreamImpl$FilterSpliterator = function $clinit_StreamImpl$FilterSpliterator() {
    jus.$clinit_StreamImpl$FilterSpliterator = emptyMethod;
  };
  defineClass(718, 230, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_StreamImpl$FilterSpliterator_2_classLit = createForClass("java.util.stream", "StreamImpl/FilterSpliterator", 718, cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit);
  jus.$clinit_StreamImpl$FilterSpliterator$lambda$0$Type = function $clinit_StreamImpl$FilterSpliterator$lambda$0$Type() {
    jus.$clinit_StreamImpl$FilterSpliterator$lambda$0$Type = emptyMethod;
  };
  defineClass(724, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamImpl$FilterSpliterator$lambda$0$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/FilterSpliterator/lambda$0$Type", 724, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$LimitSpliterator = function $clinit_StreamImpl$LimitSpliterator() {
    jus.$clinit_StreamImpl$LimitSpliterator = emptyMethod;
  };
  defineClass(720, 230, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_StreamImpl$LimitSpliterator_2_classLit = createForClass("java.util.stream", "StreamImpl/LimitSpliterator", 720, cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit);
  jus.$clinit_StreamImpl$MapToDoubleSpliterator = function $clinit_StreamImpl$MapToDoubleSpliterator() {
    jus.$clinit_StreamImpl$MapToDoubleSpliterator = emptyMethod;
  };
  defineClass(717, 527, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_StreamImpl$MapToDoubleSpliterator_2_classLit = createForClass("java.util.stream", "StreamImpl/MapToDoubleSpliterator", 717, cggl.Ljava_util_Spliterators$AbstractDoubleSpliterator_2_classLit);
  jus.$clinit_StreamImpl$MapToDoubleSpliterator$lambda$0$Type = function $clinit_StreamImpl$MapToDoubleSpliterator$lambda$0$Type() {
    jus.$clinit_StreamImpl$MapToDoubleSpliterator$lambda$0$Type = emptyMethod;
  };
  defineClass(723, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamImpl$MapToDoubleSpliterator$lambda$0$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/MapToDoubleSpliterator/lambda$0$Type", 723, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$MapToIntSpliterator = function $clinit_StreamImpl$MapToIntSpliterator() {
    jus.$clinit_StreamImpl$MapToIntSpliterator = emptyMethod;
  };
  defineClass(715, 232, { 1: 1, 20: 1, 53: 1 });
  cggl.Ljava_util_stream_StreamImpl$MapToIntSpliterator_2_classLit = createForClass("java.util.stream", "StreamImpl/MapToIntSpliterator", 715, cggl.Ljava_util_Spliterators$AbstractIntSpliterator_2_classLit);
  jus.$clinit_StreamImpl$MapToIntSpliterator$lambda$0$Type = function $clinit_StreamImpl$MapToIntSpliterator$lambda$0$Type() {
    jus.$clinit_StreamImpl$MapToIntSpliterator$lambda$0$Type = emptyMethod;
  };
  defineClass(721, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamImpl$MapToIntSpliterator$lambda$0$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/MapToIntSpliterator/lambda$0$Type", 721, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$MapToLongSpliterator = function $clinit_StreamImpl$MapToLongSpliterator() {
    jus.$clinit_StreamImpl$MapToLongSpliterator = emptyMethod;
  };
  defineClass(716, 528, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_StreamImpl$MapToLongSpliterator_2_classLit = createForClass("java.util.stream", "StreamImpl/MapToLongSpliterator", 716, cggl.Ljava_util_Spliterators$AbstractLongSpliterator_2_classLit);
  jus.$clinit_StreamImpl$MapToLongSpliterator$lambda$0$Type = function $clinit_StreamImpl$MapToLongSpliterator$lambda$0$Type() {
    jus.$clinit_StreamImpl$MapToLongSpliterator$lambda$0$Type = emptyMethod;
  };
  defineClass(722, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamImpl$MapToLongSpliterator$lambda$0$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/MapToLongSpliterator/lambda$0$Type", 722, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$MapToObjSpliterator = function $clinit_StreamImpl$MapToObjSpliterator() {
    jus.$clinit_StreamImpl$MapToObjSpliterator = emptyMethod;
    ju.$clinit_Spliterators$AbstractSpliterator();
  };
  jus.StreamImpl$MapToObjSpliterator = function StreamImpl$MapToObjSpliterator(map_0, original) {
    jus.$clinit_StreamImpl$MapToObjSpliterator();
    ju.Spliterators$AbstractSpliterator.call(this, original.estimateSize_0(), original.characteristics_0() & ~(4 | 1));
    this.$init_398();
    ji2.checkNotNull_0(map_0);
    this.map_0 = map_0;
    this.original = original;
  };
  defineClass(257, 230, { 1: 1, 20: 1 }, jus.StreamImpl$MapToObjSpliterator);
  _.$init_398 = function $init_398() {
  };
  _.lambda$0_3 = function lambda$0_9(action_1, u_1) {
    jus.$clinit_StreamImpl$MapToObjSpliterator();
    action_1.accept_0(this.map_0.apply_1(u_1));
  };
  _.tryAdvance = function tryAdvance_6(action) {
    return this.original.tryAdvance(new jus.StreamImpl$MapToObjSpliterator$lambda$0$Type(this, action));
  };
  cggl.Ljava_util_stream_StreamImpl$MapToObjSpliterator_2_classLit = createForClass("java.util.stream", "StreamImpl/MapToObjSpliterator", 257, cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit);
  jus.$clinit_StreamImpl$MapToObjSpliterator$lambda$0$Type = function $clinit_StreamImpl$MapToObjSpliterator$lambda$0$Type() {
    jus.$clinit_StreamImpl$MapToObjSpliterator$lambda$0$Type = emptyMethod;
  };
  jus.StreamImpl$MapToObjSpliterator$lambda$0$Type = function StreamImpl$MapToObjSpliterator$lambda$0$Type($$outer_0, action_1) {
    jus.$clinit_StreamImpl$MapToObjSpliterator$lambda$0$Type();
    this.$$outer_0 = $$outer_0;
    this.action_1 = action_1;
  };
  defineClass(418, 1, { 1: 1 }, jus.StreamImpl$MapToObjSpliterator$lambda$0$Type);
  _.accept_0 = function accept_9(arg0) {
    this.$$outer_0.lambda$0_3(this.action_1, arg0);
  };
  cggl.Ljava_util_stream_StreamImpl$MapToObjSpliterator$lambda$0$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/MapToObjSpliterator/lambda$0$Type", 418, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$SkipSpliterator = function $clinit_StreamImpl$SkipSpliterator() {
    jus.$clinit_StreamImpl$SkipSpliterator = emptyMethod;
  };
  defineClass(719, 230, { 1: 1, 20: 1 });
  cggl.Ljava_util_stream_StreamImpl$SkipSpliterator_2_classLit = createForClass("java.util.stream", "StreamImpl/SkipSpliterator", 719, cggl.Ljava_util_Spliterators$AbstractSpliterator_2_classLit);
  jus.$clinit_StreamImpl$SkipSpliterator$lambda$0$Type = function $clinit_StreamImpl$SkipSpliterator$lambda$0$Type() {
    jus.$clinit_StreamImpl$SkipSpliterator$lambda$0$Type = emptyMethod;
  };
  defineClass(725, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamImpl$SkipSpliterator$lambda$0$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/SkipSpliterator/lambda$0$Type", 725, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$ValueConsumer = function $clinit_StreamImpl$ValueConsumer() {
    jus.$clinit_StreamImpl$ValueConsumer = emptyMethod;
    jl.$clinit_Object();
    juf.$clinit_Consumer();
  };
  jus.StreamImpl$ValueConsumer = function StreamImpl$ValueConsumer() {
    jus.$clinit_StreamImpl$ValueConsumer();
    Object_0.call(this);
    this.$init_399();
  };
  defineClass(417, 1, { 1: 1 }, jus.StreamImpl$ValueConsumer);
  _.$init_399 = function $init_399() {
  };
  _.accept_0 = function accept_10(value_0) {
    this.value_0 = value_0;
  };
  cggl.Ljava_util_stream_StreamImpl$ValueConsumer_2_classLit = createForClass("java.util.stream", "StreamImpl/ValueConsumer", 417, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$lambda$0$Type = function $clinit_StreamImpl$lambda$0$Type() {
    jus.$clinit_StreamImpl$lambda$0$Type = emptyMethod;
  };
  jus.StreamImpl$lambda$0$Type = function StreamImpl$lambda$0$Type() {
    jus.$clinit_StreamImpl$lambda$0$Type();
  };
  defineClass(419, 1, { 1: 1 }, jus.StreamImpl$lambda$0$Type);
  _.accept_0 = function accept_11(arg0) {
    jus.lambda$0_7(arg0);
  };
  cggl.Ljava_util_stream_StreamImpl$lambda$0$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/lambda$0$Type", 419, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$lambda$1$Type = function $clinit_StreamImpl$lambda$1$Type() {
    jus.$clinit_StreamImpl$lambda$1$Type = emptyMethod;
  };
  defineClass(726, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamImpl$lambda$1$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/lambda$1$Type", 726, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$lambda$3$Type = function $clinit_StreamImpl$lambda$3$Type() {
    jus.$clinit_StreamImpl$lambda$3$Type = emptyMethod;
  };
  defineClass(727, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamImpl$lambda$3$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/lambda$3$Type", 727, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$lambda$4$Type = function $clinit_StreamImpl$lambda$4$Type() {
    jus.$clinit_StreamImpl$lambda$4$Type = emptyMethod;
  };
  jus.StreamImpl$lambda$4$Type = function StreamImpl$lambda$4$Type(collector_0) {
    jus.$clinit_StreamImpl$lambda$4$Type();
    this.collector_0 = collector_0;
  };
  defineClass(421, 1, { 1: 1 }, jus.StreamImpl$lambda$4$Type);
  _.apply_2 = function apply_18(arg0, arg1) {
    return jus.lambda$4(this.collector_0, arg0, arg1);
  };
  cggl.Ljava_util_stream_StreamImpl$lambda$4$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/lambda$4$Type", 421, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamImpl$lambda$5$Type = function $clinit_StreamImpl$lambda$5$Type() {
    jus.$clinit_StreamImpl$lambda$5$Type = emptyMethod;
  };
  jus.StreamImpl$lambda$5$Type = function StreamImpl$lambda$5$Type(consumer_0, accumulator_1) {
    jus.$clinit_StreamImpl$lambda$5$Type();
    this.consumer_0 = consumer_0;
    this.accumulator_1 = accumulator_1;
  };
  defineClass(422, 1, { 1: 1 }, jus.StreamImpl$lambda$5$Type);
  _.accept_0 = function accept_12(arg0) {
    jus.lambda$5(this.consumer_0, this.accumulator_1, arg0);
  };
  cggl.Ljava_util_stream_StreamImpl$lambda$5$Type_2_classLit = createForClass("java.util.stream", "StreamImpl/lambda$5$Type", 422, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamSupport = function $clinit_StreamSupport() {
    jus.$clinit_StreamSupport = emptyMethod;
    jl.$clinit_Object();
  };
  jus.intStream = function intStream(spliterator, parallel) {
    return new jus.IntStreamImpl(null, spliterator);
  };
  jus.intStream_0 = function intStream_0(supplier, characteristics, parallel) {
    jus.$clinit_StreamSupport();
    return jus.of_37(supplier).map_3(new jus.StreamSupport$1methodref$get$Type()).flatMapToInt(new jus.StreamSupport$lambda$3$Type(parallel));
  };
  jus.lambda$3 = function lambda$3(parallel_0, intSpliterator_1) {
    jus.$clinit_StreamSupport();
    {
      return jus.intStream(intSpliterator_1, parallel_0);
    }
  };
  jus.stream_1 = function stream_1(spliterator, parallel) {
    jus.$clinit_StreamSupport();
    return new jus.StreamImpl(null, spliterator);
  };
  defineClass(627, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamSupport_2_classLit = createForClass("java.util.stream", "StreamSupport", 627, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamSupport$0methodref$get$Type = function $clinit_StreamSupport$0methodref$get$Type() {
    jus.$clinit_StreamSupport$0methodref$get$Type = emptyMethod;
  };
  defineClass(628, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamSupport$0methodref$get$Type_2_classLit = createForClass("java.util.stream", "StreamSupport/0methodref$get$Type", 628, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamSupport$1methodref$get$Type = function $clinit_StreamSupport$1methodref$get$Type() {
    jus.$clinit_StreamSupport$1methodref$get$Type = emptyMethod;
  };
  jus.StreamSupport$1methodref$get$Type = function StreamSupport$1methodref$get$Type() {
    jus.$clinit_StreamSupport$1methodref$get$Type();
  };
  defineClass(363, 1, { 1: 1 }, jus.StreamSupport$1methodref$get$Type);
  _.andThen = function andThen_10(after) {
    return juf.$andThen(this, after);
  };
  _.apply_1 = function apply_19(arg0) {
    return castTo(arg0, 64).get_2();
  };
  cggl.Ljava_util_stream_StreamSupport$1methodref$get$Type_2_classLit = createForClass("java.util.stream", "StreamSupport/1methodref$get$Type", 363, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamSupport$2methodref$get$Type = function $clinit_StreamSupport$2methodref$get$Type() {
    jus.$clinit_StreamSupport$2methodref$get$Type = emptyMethod;
  };
  defineClass(630, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamSupport$2methodref$get$Type_2_classLit = createForClass("java.util.stream", "StreamSupport/2methodref$get$Type", 630, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamSupport$3methodref$get$Type = function $clinit_StreamSupport$3methodref$get$Type() {
    jus.$clinit_StreamSupport$3methodref$get$Type = emptyMethod;
  };
  defineClass(632, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamSupport$3methodref$get$Type_2_classLit = createForClass("java.util.stream", "StreamSupport/3methodref$get$Type", 632, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamSupport$lambda$1$Type = function $clinit_StreamSupport$lambda$1$Type() {
    jus.$clinit_StreamSupport$lambda$1$Type = emptyMethod;
  };
  defineClass(629, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamSupport$lambda$1$Type_2_classLit = createForClass("java.util.stream", "StreamSupport/lambda$1$Type", 629, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamSupport$lambda$3$Type = function $clinit_StreamSupport$lambda$3$Type() {
    jus.$clinit_StreamSupport$lambda$3$Type = emptyMethod;
  };
  jus.StreamSupport$lambda$3$Type = function StreamSupport$lambda$3$Type(parallel_0) {
    jus.$clinit_StreamSupport$lambda$3$Type();
    this.parallel_0 = parallel_0;
  };
  defineClass(364, 1, { 1: 1 }, jus.StreamSupport$lambda$3$Type);
  _.andThen = function andThen_11(after) {
    return juf.$andThen(this, after);
  };
  _.apply_1 = function apply_20(arg0) {
    return jus.lambda$3(this.parallel_0, castTo(arg0, 53));
  };
  _.parallel_0 = false;
  cggl.Ljava_util_stream_StreamSupport$lambda$3$Type_2_classLit = createForClass("java.util.stream", "StreamSupport/lambda$3$Type", 364, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamSupport$lambda$5$Type = function $clinit_StreamSupport$lambda$5$Type() {
    jus.$clinit_StreamSupport$lambda$5$Type = emptyMethod;
  };
  defineClass(631, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamSupport$lambda$5$Type_2_classLit = createForClass("java.util.stream", "StreamSupport/lambda$5$Type", 631, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_StreamSupport$lambda$7$Type = function $clinit_StreamSupport$lambda$7$Type() {
    jus.$clinit_StreamSupport$lambda$7$Type = emptyMethod;
  };
  defineClass(633, 1, { 1: 1 });
  cggl.Ljava_util_stream_StreamSupport$lambda$7$Type_2_classLit = createForClass("java.util.stream", "StreamSupport/lambda$7$Type", 633, cggl.Ljava_lang_Object_2_classLit);
  jus.$clinit_TerminatableStream$lambda$0$Type = function $clinit_TerminatableStream$lambda$0$Type() {
    jus.$clinit_TerminatableStream$lambda$0$Type = emptyMethod;
  };
  jus.TerminatableStream$lambda$0$Type = function TerminatableStream$lambda$0$Type(throwables_0) {
    jus.$clinit_TerminatableStream$lambda$0$Type();
    this.throwables_0 = throwables_0;
  };
  defineClass(425, 1, { 1: 1 }, jus.TerminatableStream$lambda$0$Type);
  _.accept_0 = function accept_13(arg0) {
    jus.lambda$0_6(this.throwables_0, castTo(arg0, 130));
  };
  cggl.Ljava_util_stream_TerminatableStream$lambda$0$Type_2_classLit = createForClass("java.util.stream", "TerminatableStream/lambda$0$Type", 425, cggl.Ljava_lang_Object_2_classLit);
  ji2.$clinit_ArrayHelper$NativeArray = function $clinit_ArrayHelper$NativeArray() {
    ji2.$clinit_ArrayHelper$NativeArray = emptyMethod;
    jl.$clinit_Object();
  };
  ji2.$clinit_ArrayHelper$NativeFunction = function $clinit_ArrayHelper$NativeFunction() {
    ji2.$clinit_ArrayHelper$NativeFunction = emptyMethod;
    jl.$clinit_Object();
  };
  ji2.$clinit_ArrayStamper = function $clinit_ArrayStamper() {
    ji2.$clinit_ArrayStamper = emptyMethod;
    jl.$clinit_Object();
  };
  ji2.stampJavaTypeInfo_1 = function stampJavaTypeInfo_1(array, referenceType) {
    ji2.$clinit_ArrayStamper();
    return cggl.stampJavaTypeInfo_0(array, referenceType);
  };
  defineClass(801, 1, { 1: 1 });
  cggl.Ljavaemul_internal_ArrayStamper_2_classLit = createForClass("javaemul.internal", "ArrayStamper", 801, cggl.Ljava_lang_Object_2_classLit);
  ji2.$clinit_EmulatedCharset = function $clinit_EmulatedCharset() {
    ji2.$clinit_EmulatedCharset = emptyMethod;
    jnc.$clinit_Charset();
    ji2.UTF_8_0 = new ji2.EmulatedCharset$UtfCharset("UTF-8");
    ji2.ISO_LATIN_1 = new ji2.EmulatedCharset$LatinCharset("ISO-LATIN-1");
    ji2.ISO_8859_1_0 = new ji2.EmulatedCharset$LatinCharset("ISO-8859-1");
  };
  ji2.EmulatedCharset = function EmulatedCharset(name_0) {
    ji2.$clinit_EmulatedCharset();
    jnc.Charset.call(this, name_0, null);
    this.$init_400();
  };
  defineClass(117, 104, { 22: 1, 1: 1, 104: 1, 117: 1 });
  _.$init_400 = function $init_400() {
  };
  cggl.Ljavaemul_internal_EmulatedCharset_2_classLit = createForClass("javaemul.internal", "EmulatedCharset", 117, cggl.Ljava_nio_charset_Charset_2_classLit);
  ji2.$clinit_EmulatedCharset$LatinCharset = function $clinit_EmulatedCharset$LatinCharset() {
    ji2.$clinit_EmulatedCharset$LatinCharset = emptyMethod;
    ji2.$clinit_EmulatedCharset();
  };
  ji2.EmulatedCharset$LatinCharset = function EmulatedCharset$LatinCharset(name_0) {
    ji2.$clinit_EmulatedCharset$LatinCharset();
    ji2.EmulatedCharset.call(this, name_0);
    this.$init_401();
  };
  defineClass(251, 117, { 22: 1, 1: 1, 104: 1, 117: 1 }, ji2.EmulatedCharset$LatinCharset);
  _.$init_401 = function $init_401() {
  };
  _.decodeString = function decodeString(bytes, ofs, len) {
    var chars2, i;
    chars2 = initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, len, 15, 1);
    for (i = 0; i < len; ++i) {
      chars2[i] = narrow_char(bytes[ofs + i] & 255);
    }
    return chars2;
  };
  _.getBytes = function getBytes(str) {
    var bytes, i, n;
    n = jl.length__I__devirtual$_0(str);
    bytes = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, n, 15, 1);
    for (i = 0; i < n; ++i) {
      bytes[i] = narrow_byte(jl.charAt_I_C__devirtual$_0(str, i) & 255);
    }
    return bytes;
  };
  cggl.Ljavaemul_internal_EmulatedCharset$LatinCharset_2_classLit = createForClass("javaemul.internal", "EmulatedCharset/LatinCharset", 251, cggl.Ljavaemul_internal_EmulatedCharset_2_classLit);
  ji2.$clinit_EmulatedCharset$UtfCharset = function $clinit_EmulatedCharset$UtfCharset() {
    ji2.$clinit_EmulatedCharset$UtfCharset = emptyMethod;
    ji2.$clinit_EmulatedCharset();
  };
  ji2.EmulatedCharset$UtfCharset = function EmulatedCharset$UtfCharset(name_0) {
    ji2.$clinit_EmulatedCharset$UtfCharset();
    ji2.EmulatedCharset.call(this, name_0);
    this.$init_402();
  };
  defineClass(367, 117, { 22: 1, 1: 1, 104: 1, 117: 1 }, ji2.EmulatedCharset$UtfCharset);
  _.$init_402 = function $init_402() {
  };
  _.decodeString = function decodeString_0(bytes, ofs, len) {
    var b, ch_0, charCount, chars2, count, i, i0, outIdx;
    charCount = 0;
    for (i0 = 0; i0 < len; ) {
      ++charCount;
      ch_0 = bytes[ofs + i0];
      if ((ch_0 & 192) == 128) {
        throw toJs(new jl.IllegalArgumentException_0("Invalid UTF8 sequence"));
      } else if ((ch_0 & 128) == 0) {
        ++i0;
      } else if ((ch_0 & 224) == 192) {
        i0 += 2;
      } else if ((ch_0 & 240) == 224) {
        i0 += 3;
      } else if ((ch_0 & 248) == 240) {
        i0 += 4;
      } else {
        throw toJs(new jl.IllegalArgumentException_0("Invalid UTF8 sequence"));
      }
      if (i0 > len) {
        throw toJs(new jl.IndexOutOfBoundsException_0("Invalid UTF8 sequence"));
      }
    }
    chars2 = initUnidimensionalArray(cggl.C_classLit, { 4: 1, 1: 1 }, 5, charCount, 15, 1);
    outIdx = 0;
    count = 0;
    for (i = 0; i < len; ) {
      ch_0 = bytes[ofs + i++];
      if ((ch_0 & 128) == 0) {
        count = 1;
        ch_0 &= 127;
      } else if ((ch_0 & 224) == 192) {
        count = 2;
        ch_0 &= 31;
      } else if ((ch_0 & 240) == 224) {
        count = 3;
        ch_0 &= 15;
      } else if ((ch_0 & 248) == 240) {
        count = 4;
        ch_0 &= 7;
      } else if ((ch_0 & 252) == 248) {
        count = 5;
        ch_0 &= 3;
      }
      while (--count > 0) {
        b = bytes[ofs + i++];
        if ((b & 192) != 128) {
          throw toJs(new jl.IllegalArgumentException_0("Invalid UTF8 sequence at " + (ofs + i - 1) + ", byte=" + toHexString(b)));
        }
        ch_0 = ch_0 << 6 | b & 63;
      }
      outIdx += toChars(ch_0, chars2, outIdx);
    }
    return chars2;
  };
  _.encodeUtf8 = function encodeUtf8(bytes, codePoint) {
    if (codePoint < 1 << 7) {
      ji2.push_2(bytes, narrow_byte(codePoint & 127));
    } else if (codePoint < 1 << 11) {
      ji2.push_2(bytes, narrow_byte(codePoint >> 6 & 31 | 192));
      ji2.push_2(bytes, narrow_byte(codePoint & 63 | 128));
    } else if (codePoint < 1 << 16) {
      ji2.push_2(bytes, narrow_byte(codePoint >> 12 & 15 | 224));
      ji2.push_2(bytes, narrow_byte(codePoint >> 6 & 63 | 128));
      ji2.push_2(bytes, narrow_byte(codePoint & 63 | 128));
    } else if (codePoint < 1 << 21) {
      ji2.push_2(bytes, narrow_byte(codePoint >> 18 & 7 | 240));
      ji2.push_2(bytes, narrow_byte(codePoint >> 12 & 63 | 128));
      ji2.push_2(bytes, narrow_byte(codePoint >> 6 & 63 | 128));
      ji2.push_2(bytes, narrow_byte(codePoint & 63 | 128));
    } else if (codePoint < 1 << 26) {
      ji2.push_2(bytes, narrow_byte(codePoint >> 24 & 3 | 248));
      ji2.push_2(bytes, narrow_byte(codePoint >> 18 & 63 | 128));
      ji2.push_2(bytes, narrow_byte(codePoint >> 12 & 63 | 128));
      ji2.push_2(bytes, narrow_byte(codePoint >> 6 & 63 | 128));
      ji2.push_2(bytes, narrow_byte(codePoint & 63 | 128));
    } else {
      throw toJs(new jl.IllegalArgumentException_0("Character out of range: " + codePoint));
    }
  };
  _.getBytes = function getBytes_0(str) {
    var bytes, ch_0, i, n;
    n = jl.length__I__devirtual$_0(str);
    bytes = initUnidimensionalArray(cggl.B_classLit, { 8: 1, 4: 1, 1: 1 }, 5, 0, 15, 1);
    for (i = 0; i < n; ) {
      ch_0 = jl.codePointAt_I_I__devirtual$(str, i);
      i += charCount_0(ch_0);
      this.encodeUtf8(bytes, ch_0);
    }
    return bytes;
  };
  cggl.Ljavaemul_internal_EmulatedCharset$UtfCharset_2_classLit = createForClass("javaemul.internal", "EmulatedCharset/UtfCharset", 367, cggl.Ljavaemul_internal_EmulatedCharset_2_classLit);
  ji2.$clinit_JsUtils$ArrayBuffer = function $clinit_JsUtils$ArrayBuffer() {
    ji2.$clinit_JsUtils$ArrayBuffer = emptyMethod;
    jl.$clinit_Object();
  };
  ji2.$clinit_JsUtils$Float32Array = function $clinit_JsUtils$Float32Array() {
    ji2.$clinit_JsUtils$Float32Array = emptyMethod;
    jl.$clinit_Object();
  };
  ji2.$clinit_JsUtils$Float64Array = function $clinit_JsUtils$Float64Array() {
    ji2.$clinit_JsUtils$Float64Array = emptyMethod;
    jl.$clinit_Object();
  };
  ji2.$clinit_JsUtils$NativeNumber = function $clinit_JsUtils$NativeNumber() {
    ji2.$clinit_JsUtils$NativeNumber = emptyMethod;
  };
  ji2.$clinit_JsUtils$Uint32Array = function $clinit_JsUtils$Uint32Array() {
    ji2.$clinit_JsUtils$Uint32Array = emptyMethod;
    jl.$clinit_Object();
  };
  ji2.$clinit_LongUtils = function $clinit_LongUtils() {
    ji2.$clinit_LongUtils = emptyMethod;
    jl.$clinit_Object();
  };
  ji2.fromBits_0 = function fromBits_0(lowBits, highBits) {
    ji2.$clinit_LongUtils();
    var highBitsLong, lowBitsLong;
    lowBitsLong = and_0(fromInt_0(lowBits), 4294967295);
    highBitsLong = shl_0(fromInt_0(highBits), 32);
    return or_0(highBitsLong, lowBitsLong);
  };
  ji2.getHighBits = function getHighBits(value_0) {
    ji2.$clinit_LongUtils();
    return toInt_0(shru_0(value_0, 32));
  };
  defineClass(710, 1, { 1: 1 });
  cggl.Ljavaemul_internal_LongUtils_2_classLit = createForClass("javaemul.internal", "LongUtils", 710, cggl.Ljava_lang_Object_2_classLit);
  ji2.$clinit_NativeRegExp = function $clinit_NativeRegExp() {
    ji2.$clinit_NativeRegExp = emptyMethod;
    jl.$clinit_Object();
  };
  ji2.$clinit_NativeRegExp$Match = function $clinit_NativeRegExp$Match() {
    ji2.$clinit_NativeRegExp$Match = emptyMethod;
  };
  ji2.$asArray = function $asArray(this$static) {
    ji2.$clinit_NativeRegExp$Match();
    return ji2.uncheckedCast(this$static);
  };
  js.$clinit_LookAndFeel = function $clinit_LookAndFeel() {
    js.$clinit_LookAndFeel = emptyMethod;
    jl.$clinit_Object();
  };
  js.LookAndFeel = function LookAndFeel() {
    js.$clinit_LookAndFeel();
    Object_0.call(this);
    this.$init_405();
  };
  defineClass(468, 1, { 1: 1 }, js.LookAndFeel);
  _.$init_405 = function $init_405() {
  };
  _.getName_0 = function getName_10() {
    return "Dummy look and feel";
  };
  cggl.Ljavax_swing_LookAndFeel_2_classLit = createForClass("javax.swing", "LookAndFeel", 468, cggl.Ljava_lang_Object_2_classLit);
  js.$clinit_UIManager = function $clinit_UIManager() {
    js.$clinit_UIManager = emptyMethod;
    jl.$clinit_Object();
    js.lookAndFeel = new js.LookAndFeel();
  };
  js.getLookAndFeel = function getLookAndFeel() {
    js.$clinit_UIManager();
    return js.lookAndFeel;
  };
  defineClass(763, 1, { 1: 1 });
  cggl.Ljavax_swing_UIManager_2_classLit = createForClass("javax.swing", "UIManager", 763, cggl.Ljava_lang_Object_2_classLit);
  ocu.$clinit_FakeFileInputStream = function $clinit_FakeFileInputStream() {
    ocu.$clinit_FakeFileInputStream = emptyMethod;
    ji.$clinit_InputStream();
  };
  ocu.FakeFileInputStream = function FakeFileInputStream(contents) {
    ji.InputStream.call(this);
    this.$init_406();
    this.mContents = contents;
    this.length_0 = this.getLength_2(contents);
  };
  ocu.getResourceAsStream = function getResourceAsStream(path) {
    ocu.$clinit_FakeFileInputStream();
    var contents;
    if (jl.contains_Ljava_lang_CharSequence__Z__devirtual$(path, "/csd/")) {
      return null;
    }
    contents = ocu.$getProperty(ocu.registeredResources, path);
    if (isNull(contents)) {
      ocu.throwError(path);
    }
    return new ocu.FakeFileInputStream(contents);
  };
  ocu.registerResources = function registerResources(contents) {
    ocu.$clinit_FakeFileInputStream();
    ocu.registeredResources = contents;
  };
  ocu.throwError = function throwError(path) {
    throw new Error("missing static resource: " + path);
  };
  defineClass(384, 383, { 1: 1 }, ocu.FakeFileInputStream);
  _.$init_406 = function $init_406() {
    this.currentByte = 0;
  };
  _.close_0 = function close_14() {
    this.mContents = null;
  };
  _.getLength_2 = function getLength_3(contents) {
    return contents.length;
  };
  _.read_0 = function read_13() {
    if (this.currentByte == this.length_0) {
      return -1;
    }
    return this.readByte(this.mContents, this.currentByte++);
  };
  _.read_3 = function read_14(b) {
    var bytes;
    if (this.currentByte == this.length_0) {
      return -1;
    }
    bytes = $wnd.Math.min(b.length, this.length_0 - this.currentByte);
    this.readBytes(b, this.mContents, this.currentByte, bytes);
    this.currentByte += bytes;
    return bytes;
  };
  _.readByte = function readByte(contents, index_0) {
    return contents[index_0];
  };
  _.readBytes = function readBytes(b, contents, offset, bytes) {
    for (var i = 0; i <= bytes; i++) {
      b[i] = contents[offset + i];
    }
  };
  _.currentByte = 0;
  _.length_0 = 0;
  ocu.registeredResources = null;
  cggl.Lorg_cheminfo_utils_FakeFileInputStream_2_classLit = createForClass("org.cheminfo.utils", "FakeFileInputStream", 384, cggl.Ljava_io_InputStream_2_classLit);
  ocu.$clinit_JSException = function $clinit_JSException() {
    ocu.$clinit_JSException = emptyMethod;
    jl.$clinit_Object();
  };
  ocu.throwError_0 = function throwError_0(message) {
    throw new Error(message);
  };
  ocu.throwUnimplemented = function throwUnimplemented() {
    ocu.$clinit_JSException();
    ocu.throwError_0("unimplemented");
  };
  defineClass(814, 1, { 1: 1 });
  cggl.Lorg_cheminfo_utils_JSException_2_classLit = createForClass("org.cheminfo.utils", "JSException", 814, cggl.Ljava_lang_Object_2_classLit);
  ocu.$clinit_PlainJSObject = function $clinit_PlainJSObject() {
    ocu.$clinit_PlainJSObject = emptyMethod;
    cggcc.$clinit_JavaScriptObject();
  };
  ocu.$getProperty = function $getProperty(this$static, key) {
    ocu.$clinit_PlainJSObject();
    var value_0 = this$static[key];
    return typeof value_0 === "object" ? value_0 : null;
  };
  ocu.$setPropertyBoolean = function $setPropertyBoolean(this$static, key, value_0) {
    ocu.$clinit_PlainJSObject();
    this$static[key] = value_0;
  };
  ocu.$setPropertyInt = function $setPropertyInt(this$static, key, value_0) {
    ocu.$clinit_PlainJSObject();
    this$static[key] = value_0;
  };
  ocu.create_8 = function create_8() {
    ocu.$clinit_PlainJSObject();
    return cggcc.$cast(createObject_0());
  };
  ooccg.$clinit_BaseConformer = function $clinit_BaseConformer() {
    ooccg.$clinit_BaseConformer = emptyMethod;
    carcc.$clinit_Conformer();
  };
  ooccg.BaseConformer = function BaseConformer(mol, rigidFragment, rotatableBond, fragmentPermutation, random) {
    ooccg.$clinit_BaseConformer();
    var bondIndex, bondIndex0, defaultTorsionRange, frequencies, i, isAttached, j, torsions;
    carcc.Conformer.call(this, mol);
    this.$init_407();
    this.mRandom = random;
    this.mRotatableBond = rotatableBond;
    this.mTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 7: 1, 40: 1 }, 13, rotatableBond.length, 0, 2);
    this.mFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 7: 1, 40: 1 }, 13, rotatableBond.length, 0, 2);
    this.mLikelyhood = initUnidimensionalArray(cggl.D_classLit, { 4: 1, 1: 1, 7: 1 }, 11, rotatableBond.length, 0, 2);
    defaultTorsionRange = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 7: 1 }, 40, rotatableBond.length, 0, 3);
    for (bondIndex0 = 0; bondIndex0 < rotatableBond.length; bondIndex0++) {
      torsions = rotatableBond[bondIndex0].getDefaultTorsions();
      this.mTorsion[bondIndex0] = ju.copyOf_11(torsions, torsions.length);
      frequencies = rotatableBond[bondIndex0].getDefaultFrequencies();
      this.mFrequency[bondIndex0] = ju.copyOf_11(frequencies, frequencies.length);
      this.mLikelyhood[bondIndex0] = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mTorsion[bondIndex0].length, 15, 1);
      defaultTorsionRange[bondIndex0] = rotatableBond[bondIndex0].getDefaultTorsionRanges();
    }
    this.mBestTorsionIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, rotatableBond.length, 15, 1);
    isAttached = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, rigidFragment.length, 16, 1);
    for (bondIndex = 0; bondIndex < rotatableBond.length; bondIndex++)
      this.connectFragments(rotatableBond[bondIndex], bondIndex, isAttached, fragmentPermutation, defaultTorsionRange[bondIndex]);
    for (i = 0; i < rigidFragment.length; i++)
      if (!isAttached[i])
        for (j = 0; j < rigidFragment[i].getCoreSize(); j++)
          this.setCoordinates_0(rigidFragment[i].coreToOriginalAtom(j), rigidFragment[i].getCoreCoordinates(fragmentPermutation[i], j));
    this.mEliminationRuleList = new ju.ArrayList();
  };
  ooccg.getRotationMatrix = function getRotationMatrix(n, alpha_0) {
    var cosAlpha, invcosAlpha, m, sinAlpha;
    sinAlpha = $wnd.Math.sin(alpha_0);
    cosAlpha = $wnd.Math.cos(alpha_0);
    invcosAlpha = 1 - cosAlpha;
    m = initMultidimensionalArray(cggl.D_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 11: 1, 4: 1, 1: 1 }], [11, 5], 15, [3, 3], 2);
    m[0][0] = n.x_0 * n.x_0 * invcosAlpha + cosAlpha;
    m[1][1] = n.y_0 * n.y_0 * invcosAlpha + cosAlpha;
    m[2][2] = n.z_0 * n.z_0 * invcosAlpha + cosAlpha;
    m[0][1] = n.x_0 * n.y_0 * invcosAlpha - n.z_0 * sinAlpha;
    m[1][2] = n.y_0 * n.z_0 * invcosAlpha - n.x_0 * sinAlpha;
    m[2][0] = n.z_0 * n.x_0 * invcosAlpha - n.y_0 * sinAlpha;
    m[0][2] = n.x_0 * n.z_0 * invcosAlpha + n.y_0 * sinAlpha;
    m[1][0] = n.y_0 * n.x_0 * invcosAlpha + n.z_0 * sinAlpha;
    m[2][1] = n.z_0 * n.y_0 * invcosAlpha + n.x_0 * sinAlpha;
    return m;
  };
  defineClass(198, 61, { 61: 1, 22: 1, 1: 1, 198: 1 }, ooccg.BaseConformer);
  _.$init_407 = function $init_407() {
  };
  _.calculateCollisionStrain = function calculateCollisionStrain(rotatableBond) {
    var atom1, atom2, bond, bondAtom1, bondAtom2, distance, dx, dy, dz, fragment1, fragment2, i, j, minDistance, p, panalty, vdwr1;
    fragment1 = rotatableBond.getFragment_3(0);
    fragment2 = rotatableBond.getFragment_3(1);
    bond = rotatableBond.getBond_1();
    panalty = 0;
    bondAtom1 = this.getMolecule_0().getBondAtom_0(0, bond);
    bondAtom2 = this.getMolecule_0().getBondAtom_0(1, bond);
    for (i = 0; i < fragment1.getCoreSize(); i++) {
      atom1 = fragment1.coreToOriginalAtom(i);
      if (atom1 != bondAtom1 && atom1 != bondAtom2) {
        vdwr1 = ooccg.getToleratedVDWRadius(this.getMolecule_0().getAtomicNo_0(atom1));
        for (j = 0; j < fragment2.getCoreSize(); j++) {
          atom2 = fragment2.coreToOriginalAtom(j);
          if (atom2 != bondAtom1 && atom2 != bondAtom2) {
            minDistance = vdwr1 + ooccg.getToleratedVDWRadius(this.getMolecule_0().getAtomicNo_0(atom2));
            dx = $wnd.Math.abs(this.getX_0(atom1) - this.getX_0(atom2));
            if (dx < minDistance) {
              dy = $wnd.Math.abs(this.getY_0(atom1) - this.getY_0(atom2));
              if (dy < minDistance) {
                dz = $wnd.Math.abs(this.getZ(atom1) - this.getZ(atom2));
                if (dz < minDistance) {
                  distance = $wnd.Math.sqrt(dx * dx + dy * dy + dz * dz);
                  if (distance < minDistance) {
                    p = (minDistance - distance) / minDistance;
                    panalty += p * p;
                  }
                }
              }
            }
          }
        }
      }
    }
    return panalty;
  };
  _.connectFragments = function connectFragments(rotatableBond, bondIndex, isAttached, fragmentPermutation, defaultTorsionRange) {
    var alpha_0, angle, atom, bestTorsionEdgeUsed, bestTorsionStrain, bond, bondAtomIndex, centerStrain, centerTorsion, connAtom, currentTorsion, escapeStrain, fAtom, fRearAtom, fRootAtom, fcoords, fragment, fragment1, fragment2, fragmentConformer, fragmentConformer0, fragmentNo, fragmentNo1, fragmentNo2, froot, fuv, i, i0, i1, largerFragment, largerFragmentNo, m, r, rangeStrain, rearAtom, relativeStrain, root, rootAtom, rotationAxis, startTorsion, step, t, t0, t1, torsionEdgeUsed, totalLikelyhood, usedRangeStrain, usedStrain, uv;
    fragmentNo1 = rotatableBond.getFragmentNo(0);
    fragmentNo2 = rotatableBond.getFragmentNo(1);
    fragment1 = rotatableBond.getFragment_3(0);
    fragment2 = rotatableBond.getFragment_3(1);
    if (!isAttached[fragmentNo1] && !isAttached[fragmentNo2]) {
      largerFragment = fragment1.getCoreSize() > fragment2.getCoreSize() ? fragment1 : fragment2;
      largerFragmentNo = fragment1.getCoreSize() > fragment2.getCoreSize() ? fragmentNo1 : fragmentNo2;
      isAttached[largerFragmentNo] = true;
      fragmentConformer0 = jsEquals(fragmentPermutation, null) ? 0 : fragmentPermutation[largerFragmentNo];
      for (i0 = 0; i0 < largerFragment.getExtendedSize(); i0++) {
        atom = largerFragment.extendedToOriginalAtom(i0);
        this.setCoordinates_0(atom, largerFragment.getExtendedCoordinates(fragmentConformer0, i0));
      }
    }
    if (isAttached[fragmentNo1]) {
      fragmentNo = fragmentNo2;
      fragment = fragment2;
      bondAtomIndex = rotatableBond.areBondAtomsInFragmentOrder() ? 1 : 0;
    } else {
      fragmentNo = fragmentNo1;
      fragment = fragment1;
      bondAtomIndex = rotatableBond.areBondAtomsInFragmentOrder() ? 0 : 1;
    }
    bond = rotatableBond.getBond_1();
    rootAtom = this.getMolecule_0().getBondAtom_0(bondAtomIndex, bond);
    rearAtom = this.getMolecule_0().getBondAtom_0(1 - bondAtomIndex, bond);
    fragmentConformer = jsEquals(fragmentPermutation, null) ? 0 : fragmentPermutation[fragmentNo];
    fRootAtom = fragment.originalToExtendedAtom(rootAtom);
    fRearAtom = fragment.originalToExtendedAtom(rearAtom);
    froot = fragment.getExtendedCoordinates(fragmentConformer, fRootAtom);
    root = this.getCoordinates(rootAtom);
    fuv = froot.subC(fragment.getExtendedCoordinates(fragmentConformer, fRearAtom)).unit();
    uv = root.subC(this.getCoordinates(rearAtom)).unit();
    alpha_0 = fuv.getAngle_0(uv);
    fcoords = initUnidimensionalArray(cggl.Lcom_actelion_research_chem_Coordinates_2_classLit, { 151: 1, 4: 1, 1: 1, 7: 1 }, 33, fragment.getExtendedSize(), 0, 1);
    if (alpha_0 < 0.0010000000474974513) {
      for (i0 = 0; i0 < fragment.getExtendedSize(); i0++) {
        atom = fragment.extendedToOriginalAtom(i0);
        if (atom != rootAtom && atom != rearAtom)
          fcoords[i0] = alpha_0 > 3.141592653589793 / 2 ? froot.subC(fragment.getExtendedCoordinates(fragmentConformer, i0)) : fragment.getExtendedCoordinates(fragmentConformer, i0).subC(froot);
      }
    } else {
      if (alpha_0 < 3.141592653589793 - 0.0010000000474974513) {
        rotationAxis = uv.cross(fuv);
      } else {
        if ($wnd.Math.abs(uv.x_0) >= $wnd.Math.abs(uv.y_0) && $wnd.Math.abs(uv.x_0) >= $wnd.Math.abs(uv.z_0))
          rotationAxis = new carc2.Coordinates_1(-(uv.y_0 + uv.z_0) / uv.x_0, 1, 1);
        else if ($wnd.Math.abs(uv.y_0) >= $wnd.Math.abs(uv.x_0) && $wnd.Math.abs(uv.y_0) >= $wnd.Math.abs(uv.z_0))
          rotationAxis = new carc2.Coordinates_1(1, -(uv.x_0 + uv.z_0) / uv.y_0, 1);
        else
          rotationAxis = new carc2.Coordinates_1(1, 1, -(uv.x_0 + uv.y_0) / uv.z_0);
      }
      m = ooccg.getRotationMatrix(rotationAxis.unit(), alpha_0);
      for (i0 = 0; i0 < fragment.getExtendedSize(); i0++) {
        atom = fragment.extendedToOriginalAtom(i0);
        if (atom != rootAtom && atom != rearAtom)
          fcoords[i0] = fragment.getExtendedCoordinates(fragmentConformer, i0).subC(froot).rotate(m);
      }
    }
    isAttached[fragmentNo] = true;
    for (i1 = 0; i1 < this.getMolecule_0().getConnAtoms_0(rootAtom); i1++) {
      connAtom = this.getMolecule_0().getConnAtom_0(rootAtom, i1);
      if (connAtom != rearAtom) {
        fAtom = fragment.originalToExtendedAtom(connAtom);
        this.setCoordinatesReplace(connAtom, fcoords[fAtom].addC(root));
      }
    }
    startTorsion = carcc.calculateTorsionExtended_0(this, rotatableBond.getTorsionAtoms());
    currentTorsion = -1;
    bestTorsionEdgeUsed = 0;
    bestTorsionStrain = 0;
    for (t0 = 0; t0 < this.mTorsion[bondIndex].length; t0++) {
      currentTorsion = this.mTorsion[bondIndex][t0];
      m = ooccg.getRotationMatrix(uv, 3.141592653589793 * currentTorsion / 180 - startTorsion);
      for (i0 = 0; i0 < fragment.getExtendedSize(); i0++) {
        atom = fragment.extendedToOriginalAtom(i0);
        if (atom != rootAtom && atom != rearAtom) {
          this.setCoordinates_0(atom, fcoords[i0]);
          this.getCoordinates(atom).rotate(m).add_3(root);
        }
      }
      centerStrain = this.calculateCollisionStrain(rotatableBond);
      usedStrain = centerStrain;
      torsionEdgeUsed = 0;
      if (centerStrain < 0.05000000074505806) {
        relativeStrain = centerStrain / 0.20000000298023224;
        this.mLikelyhood[bondIndex][t0] = this.mFrequency[bondIndex][t0] * (1 - relativeStrain * relativeStrain);
      } else {
        centerTorsion = this.mTorsion[bondIndex][t0];
        usedRangeStrain = 17976931348623157e292;
        for (r = 0; r < 2; r++) {
          currentTorsion = defaultTorsionRange[t0][r];
          if (currentTorsion != centerTorsion) {
            m = ooccg.getRotationMatrix(uv, 3.141592653589793 * currentTorsion / 180 - startTorsion);
            for (i = 0; i < fragment.getExtendedSize(); i++) {
              atom = fragment.extendedToOriginalAtom(i);
              if (atom != rootAtom && atom != rearAtom) {
                this.setCoordinates_0(atom, fcoords[i]);
                this.getCoordinates(atom).rotate(m).add_3(root);
              }
            }
            rangeStrain = this.calculateCollisionStrain(rotatableBond);
            if (rangeStrain < centerStrain * 0.800000011920929 && rangeStrain < usedRangeStrain) {
              this.mTorsion[bondIndex][t0] = defaultTorsionRange[t0][r];
              relativeStrain = rangeStrain / (0.800000011920929 * 0.20000000298023224);
              this.mLikelyhood[bondIndex][t0] = this.mFrequency[bondIndex][t0] * (1 - relativeStrain * relativeStrain);
              usedStrain = rangeStrain;
              torsionEdgeUsed = r + 1;
              usedRangeStrain = rangeStrain;
            }
          }
        }
        if (usedRangeStrain == 17976931348623157e292 && centerStrain < 0.20000000298023224) {
          relativeStrain = centerStrain / 0.20000000298023224;
          this.mLikelyhood[bondIndex][t0] = this.mFrequency[bondIndex][t0] * (1 - relativeStrain * relativeStrain);
        }
      }
      if (this.mLikelyhood[bondIndex][this.mBestTorsionIndex[bondIndex]] < this.mLikelyhood[bondIndex][t0]) {
        this.mBestTorsionIndex[bondIndex] = t0;
        bestTorsionEdgeUsed = torsionEdgeUsed;
        bestTorsionStrain = usedStrain;
      }
    }
    totalLikelyhood = 0;
    for (t1 = 0; t1 < this.mTorsion[bondIndex].length; t1++)
      if (this.mLikelyhood[bondIndex][t1] > 0)
        totalLikelyhood += this.mLikelyhood[bondIndex][t1];
    if (this.mLikelyhood[bondIndex][this.mBestTorsionIndex[bondIndex]] <= 0) {
      this.mLikelyhood[bondIndex][this.mBestTorsionIndex[bondIndex]] = 1;
      angle = bestTorsionEdgeUsed == 1 ? -8 : bestTorsionEdgeUsed == 2 ? 8 : this.mRandom.nextDouble() < 0.5 ? -8 : 8;
      for (step = 1; step <= 4; step++) {
        currentTorsion = narrow_short(this.mTorsion[bondIndex][this.mBestTorsionIndex[bondIndex]] + angle * step);
        m = ooccg.getRotationMatrix(uv, 3.141592653589793 * currentTorsion / 180 - startTorsion);
        for (i = 0; i < fragment.getExtendedSize(); i++) {
          atom = fragment.extendedToOriginalAtom(i);
          if (atom != rootAtom && atom != rearAtom) {
            this.setCoordinates_0(atom, fcoords[i]);
            this.getCoordinates(atom).rotate(m).add_3(root);
          }
        }
        escapeStrain = this.calculateCollisionStrain(rotatableBond);
        if (bestTorsionStrain - escapeStrain < 0.05)
          break;
        this.mTorsion[bondIndex][this.mBestTorsionIndex[bondIndex]] = currentTorsion;
      }
    } else {
      for (t = 0; t < this.mTorsion[bondIndex].length; t++)
        this.mLikelyhood[bondIndex][t] /= totalLikelyhood;
    }
    if (currentTorsion != this.mTorsion[bondIndex][this.mBestTorsionIndex[bondIndex]]) {
      m = ooccg.getRotationMatrix(uv, 3.141592653589793 * this.mTorsion[bondIndex][this.mBestTorsionIndex[bondIndex]] / 180 - startTorsion);
      for (i = 0; i < fragment.getExtendedSize(); i++) {
        atom = fragment.extendedToOriginalAtom(i);
        if (atom != rootAtom && atom != rearAtom) {
          this.setCoordinates_0(atom, fcoords[i]);
          this.getCoordinates(atom).rotate(m).add_3(root);
        }
      }
    }
    this.setBondTorsion(bond, this.mTorsion[bondIndex][this.mBestTorsionIndex[bondIndex]]);
  };
  _.deriveConformer = function deriveConformer(torsionIndex, name_0) {
    var conformer, rb;
    this.mConformerCount++;
    conformer = new carcc.Conformer_0(this);
    conformer.setName_0(name_0);
    for (rb = this.mRotatableBond.length - 1; rb >= 0; rb--)
      this.rotateToIndex(conformer, this.mRotatableBond[rb], rb, torsionIndex[rb]);
    return conformer;
  };
  _.getEliminationRules = function getEliminationRules() {
    return this.mEliminationRuleList;
  };
  _.getLikelyRandomTorsionIndex = function getLikelyRandomTorsionIndex(bondIndex, random, progress) {
    var contribution, sum, t;
    sum = 0;
    for (t = 0; t < this.mTorsion[bondIndex].length; t++) {
      contribution = (1 - progress) * this.mLikelyhood[bondIndex][t] + progress / this.mTorsion[bondIndex].length;
      sum += contribution;
      if (random <= sum)
        return t;
    }
    return this.mTorsion[bondIndex].length - 1;
  };
  _.getRotatableBonds = function getRotatableBonds() {
    return this.mRotatableBond;
  };
  _.getTorsion = function getTorsion(bondIndex, torsionIndex) {
    return this.mTorsion[bondIndex][torsionIndex];
  };
  _.getTorsionLikelyhood = function getTorsionLikelyhood(bondIndex, torsionIndex) {
    return this.mLikelyhood[bondIndex][torsionIndex];
  };
  _.rotateSmallerSide = function rotateSmallerSide(conformer, rotatableBond, alpha_0) {
    var atom, atom$array, atom$index, atom$max, m, rotationCenter, t2, torsionAtom, unit, x_0, y_0, z_0;
    torsionAtom = rotatableBond.getTorsionAtoms();
    rotationCenter = rotatableBond.getRotationCenter();
    t2 = conformer.getCoordinates(torsionAtom[2]);
    unit = t2.subC(conformer.getCoordinates(torsionAtom[1])).unit();
    m = ooccg.getRotationMatrix(unit, rotationCenter == torsionAtom[1] ? alpha_0 : -alpha_0);
    for (atom$array = rotatableBond.getSmallerSideAtoms(), atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
      atom = atom$array[atom$index];
      if (atom != rotationCenter) {
        x_0 = conformer.getX_0(atom) - t2.x_0;
        y_0 = conformer.getY_0(atom) - t2.y_0;
        z_0 = conformer.getZ(atom) - t2.z_0;
        conformer.setX_0(atom, x_0 * m[0][0] + y_0 * m[0][1] + z_0 * m[0][2] + t2.x_0);
        conformer.setY_0(atom, x_0 * m[1][0] + y_0 * m[1][1] + z_0 * m[1][2] + t2.y_0);
        conformer.setZ(atom, x_0 * m[2][0] + y_0 * m[2][1] + z_0 * m[2][2] + t2.z_0);
      }
    }
  };
  _.rotateTo = function rotateTo(conformer, rotatableBond, torsion) {
    var bond, deltaTorsion;
    while (torsion < 0)
      torsion = narrow_short(torsion + 360);
    while (torsion >= 360)
      torsion = narrow_short(torsion - 360);
    bond = rotatableBond.getBond_1();
    if (torsion != conformer.getBondTorsion(bond)) {
      deltaTorsion = torsion - conformer.getBondTorsion(bond);
      this.rotateSmallerSide(conformer, rotatableBond, 3.141592653589793 * deltaTorsion / 180);
      conformer.setBondTorsion(bond, torsion);
    }
  };
  _.rotateToIndex = function rotateToIndex(conformer, rotatableBond, bondIndex, torsionIndex) {
    this.rotateTo(conformer, rotatableBond, this.mTorsion[bondIndex][torsionIndex]);
  };
  _.mConformerCount = 0;
  ooccg.ACCEPTABLE_CENTER_STRAIN = 0.05000000074505806;
  ooccg.ANGLE_TOLERANCE = 0.0010000000474974513;
  ooccg.ESCAPE_ANGLE = 8;
  ooccg.ESCAPE_STEPS = 4;
  ooccg.MAXIMUM_CENTER_STRAIN = 0.20000000298023224;
  ooccg.MIN_ESCAPE_GAIN_PER_STEP = 0.05;
  ooccg.NECESSARY_EDGE_STRAIN_IMPROVEMENT_FACTOR = 0.800000011920929;
  cggl.Lorg_openmolecules_chem_conf_gen_BaseConformer_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "BaseConformer", 198, cggl.Lcom_actelion_research_chem_conf_Conformer_2_classLit);
  ooccg.$clinit_ConformerDiagnostics = function $clinit_ConformerDiagnostics() {
    ooccg.$clinit_ConformerDiagnostics = emptyMethod;
    jl.$clinit_Object();
  };
  ooccg.ConformerDiagnostics = function ConformerDiagnostics(ts) {
    ooccg.$clinit_ConformerDiagnostics();
    Object_0.call(this);
    this.$init_408();
    this.mTorsionIndex = ts.getTorsionIndexes();
    this.mConformerIndex = ts.getConformerIndexes();
    this.mCollisionLog = new jl.StringBuilder();
    this.mEliminationRules = new ju.ArrayList();
  };
  defineClass(219, 1, { 1: 1, 219: 1 }, ooccg.ConformerDiagnostics);
  _.$init_408 = function $init_408() {
  };
  _.addEliminationRule = function addEliminationRule(rule) {
    this.mEliminationRules.add(rule);
  };
  _.getCollisionAtoms = function getCollisionAtoms() {
    return this.mCollisionAtoms;
  };
  _.getCollisionIntensity = function getCollisionIntensity() {
    return this.mCollisionIntensity;
  };
  _.getEliminationRules = function getEliminationRules_0() {
    return this.mEliminationRules;
  };
  _.getIDCode_0 = function getIDCode_7() {
    return this.mIDCode;
  };
  _.getLikelihood = function getLikelihood_0() {
    return this.mLikelihood;
  };
  _.getName_0 = function getName_11() {
    return this.mName;
  };
  _.getTorsionIndexes = function getTorsionIndexes() {
    return this.mTorsionIndex;
  };
  _.setCollisionAtoms = function setCollisionAtoms(atoms) {
    this.mCollisionAtoms = atoms;
  };
  _.setCollisionStrain = function setCollisionStrain(v) {
    this.mCollisionIntensity = v;
  };
  _.setConformer = function setConformer(bc, c) {
    var can, i;
    can = new carc2.Canonizer(c.toMolecule_0(null));
    this.mIDCode = can.getIDCode_0();
    this.mCoords = can.getEncodedCoordinates_0();
    this.mBaseConformer = bc;
    this.mName = c.getName_0();
    this.mFixedTorsion = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, bc.getRotatableBonds().length, 15, 1);
    this.mLikelihood = c.getLikelihood();
    for (i = 0; i < this.mFixedTorsion.length; i++)
      this.mFixedTorsion[i] = c.getBondTorsion(bc.getRotatableBonds()[i].getBond_1());
  };
  _.setSuccess = function setSuccess(b) {
    this.mSuccess = b;
  };
  _.writeCollisionLog = function writeCollisionLog(log_0) {
    if (this.mCollisionLog.length_1() != 0)
      this.mCollisionLog.append_9("<NL>");
    this.mCollisionLog.append_9(log_0);
  };
  _.mCollisionIntensity = 0;
  _.mLikelihood = 0;
  _.mSuccess = false;
  cggl.Lorg_openmolecules_chem_conf_gen_ConformerDiagnostics_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "ConformerDiagnostics", 219, cggl.Ljava_lang_Object_2_classLit);
  ooccg.$clinit_ConformerGenerator = function $clinit_ConformerGenerator() {
    ooccg.$clinit_ConformerGenerator = emptyMethod;
    jl.$clinit_Object();
  };
  ooccg.ConformerGenerator = function ConformerGenerator2(seed, cache, optimizeRigidFragments) {
    Object_0.call(this);
    this.$init_409();
    carcc.initialize_2(1);
    this.mRandomSeed = seed;
    this.mRandom = eq(seed, 0) ? new ju.Random() : new ju.Random_0(seed);
    this.mRigidFragmentProvider = new ooccg.RigidFragmentProvider(seed, cache, optimizeRigidFragments);
  };
  ooccg.ConformerGenerator_0 = function ConformerGenerator_0(seed, optimizeRigidFragments) {
    ooccg.$clinit_ConformerGenerator();
    ooccg.ConformerGenerator.call(this, seed, ooccg.getDefaultInstance(), optimizeRigidFragments);
  };
  ooccg.addHydrogenAtoms = function addHydrogenAtoms(mol) {
    ooccg.$clinit_ConformerGenerator();
    var atom, atom0, atom1, bondLength, i, implicitHydrogen, oldStereoHelperBits;
    oldStereoHelperBits = mol.getHelperArrayStatus_0() & 248;
    mol.ensureHelperArrays_0(1);
    implicitHydrogen = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 15, 1);
    for (atom0 = 0; atom0 < mol.getAtoms_0(); atom0++)
      implicitHydrogen[atom0] = mol.getImplicitHydrogens_1(atom0);
    for (atom1 = 0; atom1 < implicitHydrogen.length; atom1++)
      if (implicitHydrogen[atom1] != 0)
        for (i = 0; i < implicitHydrogen[atom1]; i++)
          mol.addBond_1(atom1, mol.addAtom_2(1), 1);
    mol.ensureHelperArrays_0(1);
    bondLength = 0.8 * mol.getAverageBondLength_0();
    for (atom = 0; atom < implicitHydrogen.length; atom++)
      if (implicitHydrogen[atom] != 0)
        ooccg.setHydrogenLocations(mol, atom, implicitHydrogen[atom], bondLength);
    if ((oldStereoHelperBits & 8) != 0)
      mol.setParitiesValid_0(oldStereoHelperBits);
  };
  ooccg.getToleratedVDWRadius = function getToleratedVDWRadius(atomicNo) {
    ooccg.$clinit_ConformerGenerator();
    var vdwr;
    vdwr = (carcc.$clinit_VDWRadii(), carcc.VDW_RADIUS)[atomicNo < (carcc.$clinit_VDWRadii(), carcc.VDW_RADIUS).length ? atomicNo : 6];
    return vdwr * (atomicNo == 1 ? 0.9 : 0.9);
  };
  ooccg.lambda$0_10 = function lambda$0_10(b1_0, b2_1) {
    ooccg.$clinit_ConformerGenerator();
    return compare_25(b2_1.getSmallerSideAtoms().length, b1_0.getSmallerSideAtoms().length);
  };
  ooccg.setHydrogenLocations = function setHydrogenLocations(mol, atom, newHydrogenCount, bondLength) {
    var a1, a2, angle, angleIncrement, biggestAngleDif, bond, dif, firstNewHydrogenConnIndex, hydrogenAngle, i, i0, i1, newHydrogen, startAngle, stereoBondAngle, stereoBondCount, stereoBondIndex;
    firstNewHydrogenConnIndex = mol.getAllConnAtoms_0(atom) - newHydrogenCount;
    stereoBondIndex = -1;
    stereoBondAngle = NaN;
    for (i0 = 0; i0 < firstNewHydrogenConnIndex; i0++) {
      if (mol.isStereoBond_1(mol.getConnBond_0(atom, i0), atom)) {
        stereoBondIndex = i0;
        stereoBondAngle = mol.getBondAngle_0(atom, mol.getConnAtom_0(atom, i0));
        break;
      }
    }
    stereoBondCount = stereoBondIndex == -1 ? 0 : 1;
    angle = null;
    if (stereoBondCount < firstNewHydrogenConnIndex) {
      angle = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, firstNewHydrogenConnIndex - stereoBondCount, 15, 1);
      bond = 0;
      for (i1 = 0; i1 < firstNewHydrogenConnIndex; i1++)
        if (i1 != stereoBondIndex)
          angle[bond++] = mol.getBondAngle_0(atom, mol.getConnAtom_0(atom, i1));
      ju.sort_2(angle);
    }
    angleIncrement = 2 * 3.141592653589793 / $wnd.Math.max(newHydrogenCount, 3);
    startAngle = 0;
    if (jsNotEquals(angle, null)) {
      if (angle.length == 1 && newHydrogenCount == 1) {
        startAngle = angle[0];
      } else {
        biggestAngleDif = 0;
        for (i1 = 0; i1 < angle.length; i1++) {
          a1 = i1 == 0 ? angle[angle.length - 1] - 3.141592653589793 * 2 : angle[i1 - 1];
          a2 = angle[i1];
          if (biggestAngleDif < a2 - a1) {
            biggestAngleDif = a2 - a1;
            startAngle = a1;
          }
        }
        angleIncrement = biggestAngleDif / (newHydrogenCount + 1);
      }
    }
    for (i = 0; i < newHydrogenCount; i++) {
      startAngle += angleIncrement;
      hydrogenAngle = startAngle;
      if (stereoBondCount != 0) {
        dif = carc2.getAngleDif(hydrogenAngle, stereoBondAngle);
        if ($wnd.Math.abs(dif) < angleIncrement / 2) {
          if (dif < 0)
            hydrogenAngle = stereoBondAngle - angleIncrement / 2;
          else
            hydrogenAngle = stereoBondAngle + angleIncrement / 2;
        }
      }
      newHydrogen = mol.getConnAtom_0(atom, firstNewHydrogenConnIndex + i);
      mol.setAtomX_0(newHydrogen, mol.getAtomX_0(atom) + bondLength * $wnd.Math.sin(hydrogenAngle));
      mol.setAtomY_0(newHydrogen, mol.getAtomY_0(atom) + bondLength * $wnd.Math.cos(hydrogenAngle));
    }
  };
  defineClass(235, 1, { 1: 1 }, ooccg.ConformerGenerator_0);
  _.$init_409 = function $init_409() {
  };
  _.applyTimeOut = function applyTimeOut() {
    this.mStopMillis = eq(this.mTimeOut, 0) ? 0 : add_20(jl.currentTimeMillis_0(), this.mTimeOut);
    this.mRigidFragmentProvider.setStopTime(this.mStopMillis);
  };
  _.calculateCollision = function calculateCollision(torsionSet, conformer) {
    var atom1, atom2, atoms, collisionStrain, collisionStrainMatrix, collisionStrainSum, distance, dx, dy, dz, f1, f2, minDistance, mol, relativeCollision, vdwr1;
    if (this.mIsDiagnosticsMode)
      this.mDiagnostics.get_6(torsionSet).setCollisionAtoms(null);
    collisionStrainSum = 0;
    collisionStrainMatrix = null;
    mol = conformer.getMolecule_0();
    for (atom1 = 1; atom1 < mol.getAllAtoms_0(); atom1++) {
      vdwr1 = ooccg.getToleratedVDWRadius(mol.getAtomicNo_0(atom1));
      for (atom2 = 0; atom2 < atom1; atom2++) {
        if (!this.mSkipCollisionCheck[atom1][atom2]) {
          minDistance = vdwr1 + ooccg.getToleratedVDWRadius(mol.getAtomicNo_0(atom2));
          dx = $wnd.Math.abs(conformer.getX_0(atom1) - conformer.getX_0(atom2));
          if (dx < minDistance) {
            dy = $wnd.Math.abs(conformer.getY_0(atom1) - conformer.getY_0(atom2));
            if (dy < minDistance) {
              dz = $wnd.Math.abs(conformer.getZ(atom1) - conformer.getZ(atom2));
              if (dz < minDistance) {
                distance = $wnd.Math.sqrt(dx * dx + dy * dy + dz * dz);
                if (distance < minDistance) {
                  relativeCollision = (minDistance - distance) / minDistance;
                  collisionStrain = 20 * relativeCollision * relativeCollision;
                  collisionStrainSum += collisionStrain;
                  if (this.mIsDiagnosticsMode) {
                    this.mDiagnostics.get_6(torsionSet).writeCollisionLog("a1:" + atom1 + " f1:" + this.mFragmentNo[atom1] + " a2:" + atom2 + " f2:" + this.mFragmentNo[atom2] + " distance:" + caru.toString_22(distance) + " min:" + caru.toString_22(minDistance));
                    if (jsEquals(this.mDiagnostics.get_6(torsionSet).getCollisionAtoms(), null)) {
                      atoms = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
                      atoms[0] = atom1;
                      atoms[1] = atom2;
                      this.mDiagnostics.get_6(torsionSet).setCollisionAtoms(atoms);
                    }
                  }
                  if (jsEquals(collisionStrainMatrix, null))
                    collisionStrainMatrix = initUnidimensionalArray(cggl.D_classLit, { 4: 1, 1: 1, 7: 1 }, 11, this.mRigidFragment.length, 0, 2);
                  f1 = this.mFragmentNo[atom1];
                  f2 = this.mFragmentNo[atom2];
                  if (f1 < f2) {
                    if (jsEquals(collisionStrainMatrix[f2], null))
                      collisionStrainMatrix[f2] = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, f2, 15, 1);
                    collisionStrainMatrix[f2][f1] += collisionStrain;
                  } else {
                    if (jsEquals(collisionStrainMatrix[f1], null))
                      collisionStrainMatrix[f1] = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, f1, 15, 1);
                    collisionStrainMatrix[f1][f2] += collisionStrain;
                  }
                }
              }
            }
          }
        }
      }
    }
    torsionSet.setCollisionStrain_0(collisionStrainSum, collisionStrainMatrix);
    return collisionStrainSum != 0;
  };
  _.calculateCollisionStrain_0 = function calculateCollisionStrain_0(conformer, f1, f2) {
    var atom1, atom2, collisionStrain, collisionStrainSum, distance, dx, dy, dz, i, j, minDistance, relativeCollision, vdwr1;
    collisionStrainSum = 0;
    for (i = 0; i < f1.getCoreSize(); i++) {
      atom1 = f1.coreToOriginalAtom(i);
      vdwr1 = ooccg.getToleratedVDWRadius(this.mMolecule.getAtomicNo_0(atom1));
      for (j = 0; j < f2.getCoreSize(); j++) {
        atom2 = f2.coreToOriginalAtom(j);
        minDistance = vdwr1 + ooccg.getToleratedVDWRadius(this.mMolecule.getAtomicNo_0(atom2));
        dx = $wnd.Math.abs(conformer.getX_0(atom1) - conformer.getX_0(atom2));
        if (dx < minDistance) {
          dy = $wnd.Math.abs(conformer.getY_0(atom1) - conformer.getY_0(atom2));
          if (dy < minDistance) {
            dz = $wnd.Math.abs(conformer.getZ(atom1) - conformer.getZ(atom2));
            if (dz < minDistance) {
              distance = $wnd.Math.sqrt(dx * dx + dy * dy + dz * dz);
              if (distance < minDistance) {
                relativeCollision = (minDistance - distance) / minDistance;
                collisionStrain = relativeCollision * relativeCollision;
                collisionStrainSum += collisionStrain;
              }
            }
          }
        }
      }
    }
    return 20 * collisionStrainSum;
  };
  _.getBaseConformer = function getBaseConformer(fragmentPermutation) {
    var baseConformer;
    baseConformer = castTo(this.mBaseConformerMap.get(fragmentPermutation), 198);
    if (isNotNull(baseConformer))
      return baseConformer;
    baseConformer = new ooccg.BaseConformer(this.mMolecule, this.mRigidFragment, this.mRotatableBond, fragmentPermutation, this.mRandom);
    this.mBaseConformerMap.put(ju.copyOf_9(fragmentPermutation, fragmentPermutation.length), baseConformer);
    return baseConformer;
  };
  _.getConformerCount_0 = function getConformerCount_0() {
    return this.mReturnedConformerCount;
  };
  _.getNextConformer = function getNextConformer() {
    return this.getNextConformer_0(null);
  };
  _.getNextConformer_0 = function getNextConformer_0(torsionSetHolder) {
    var baseConformer, conformer;
    if (jsEquals(this.mRotatableBond, null) && isNull(this.mSelfOrganizer))
      return null;
    if (isNotNull(this.mSelfOrganizer)) {
      conformer = this.mSelfOrganizer.getNextConformer_1();
      if (isNotNull(conformer)) {
        this.separateDisconnectedFragments(conformer);
        this.mReturnedConformerCount++;
        conformer.setName_0("SO#" + ++this.mAllConformerCount);
        return conformer;
      }
      return null;
    }
    if (this.mIsFinished)
      return null;
    if (this.mBaseConformerMap.isEmpty())
      this.getBaseConformer(initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRigidFragment.length, 15, 1));
    this.mTorsionSet = this.mTorsionSetStrategy.getNextTorsionSet(this.mTorsionSet, this.mDiagnostics);
    while (isNotNull(this.mTorsionSet) && !this.mustStop()) {
      baseConformer = this.getBaseConformer(this.mTorsionSet.getConformerIndexes());
      if (isNull(this.mTorsionSet.getConformer())) {
        this.mTorsionSet.setConformer_0(baseConformer.deriveConformer(this.mTorsionSet.getTorsionIndexes(), "#" + ++this.mAllConformerCount));
        if (this.mIsDiagnosticsMode)
          this.mDiagnostics.addNew(this.mTorsionSet);
      }
      if (this.mTorsionSet.getCollisionStrainSum() == 0) {
        this.calculateCollision(this.mTorsionSet, this.mTorsionSet.getConformer());
        if (this.mTorsionSet.getCollisionStrainSum() != 0)
          this.tryFixCollisions(baseConformer, this.mTorsionSet);
        if (this.mIsDiagnosticsMode) {
          this.mDiagnostics.get_6(this.mTorsionSet).setConformer(baseConformer, this.mTorsionSet.getConformer());
          this.mDiagnostics.get_6(this.mTorsionSet).setCollisionStrain(this.mTorsionSet.getCollisionStrainSum());
        }
      }
      if (this.mTorsionSet.getCollisionStrainSum() > this.mTorsionSetStrategy.calculateCollisionTolerance()) {
        this.mTorsionSet = this.mTorsionSetStrategy.getNextTorsionSet(this.mTorsionSet, this.mDiagnostics);
        if (isNotNull(this.mTorsionSet) || this.mReturnedConformerCount != 0)
          continue;
        if (this.mUseSelfOrganizerIfAllFails) {
          this.mSelfOrganizer = new ooccs.ConformationSelfOrganizer(this.mMolecule, true);
          this.mSelfOrganizer.setThreadMaster(this.mThreadMaster);
          this.mSelfOrganizer.setStopTime(this.mStopMillis);
          this.mSelfOrganizer.initializeConformers_2(this.mRandomSeed, -1);
          conformer = this.mSelfOrganizer.getNextConformer_1();
          if (isNotNull(conformer)) {
            this.separateDisconnectedFragments(conformer);
            this.mReturnedConformerCount++;
            conformer.setName_0("SO#" + ++this.mAllConformerCount);
            return conformer;
          }
        }
        this.mTorsionSet = this.mTorsionSetStrategy.getBestCollidingTorsionIndexes();
        this.mIsFinished = true;
      }
      if (isNotNull(this.mTorsionSet)) {
        this.separateDisconnectedFragments(this.mTorsionSet.getConformer());
        this.mTorsionSet.setUsed();
        this.mReturnedConformerCount++;
        if (jsNotEquals(torsionSetHolder, null))
          setCheck(torsionSetHolder, 0, new ooccg.TorsionSet(this.mTorsionSet));
        if (this.mIsDiagnosticsMode)
          this.mDiagnostics.get_6(this.mTorsionSet).setSuccess(true);
        return this.mTorsionSet.getConformer();
      }
    }
    return null;
  };
  _.getNextConformerAsMolecule_0 = function getNextConformerAsMolecule_0(mol) {
    var conformer;
    conformer = this.getNextConformer();
    return isNull(conformer) ? null : conformer.toMolecule_0(mol);
  };
  _.getOneConformer = function getOneConformer(mol) {
    var conformer, sampler;
    if (!this.initialize_1(mol, false))
      return null;
    if (jsNotEquals(this.mRotatableBond, null)) {
      this.mTorsionSetStrategy = new ooccg.TorsionSetStrategyAdaptiveRandom(this, true, true, this.mRandomSeed);
      this.mTorsionSetStrategy.setMaxTotalCount(400);
      this.mBaseConformerMap = new ju.TreeMap_0(new caru.IntArrayComparator());
      return this.getNextConformer();
    } else {
      sampler = new ooccs.ConformationSelfOrganizer(mol, true);
      sampler.setThreadMaster(this.mThreadMaster);
      sampler.setStopTime(this.mStopMillis);
      conformer = sampler.generateOneConformer(this.mRandomSeed);
      this.separateDisconnectedFragments(conformer);
      conformer.setName_0("SO#1");
      return conformer;
    }
  };
  _.getOneConformerAsMolecule_0 = function getOneConformerAsMolecule_0(mol) {
    var conformer;
    conformer = this.getOneConformer(mol);
    return isNull(conformer) ? null : conformer.toMolecule_0(mol);
  };
  _.getPotentialConformerCount_0 = function getPotentialConformerCount_0() {
    return isNull(this.mTorsionSetStrategy) ? 1 : this.mTorsionSetStrategy.getPermutationCount_0();
  };
  _.getRigidFragments = function getRigidFragments() {
    return this.mRigidFragment;
  };
  _.getRotatableBondCount_0 = function getRotatableBondCount_3() {
    return jsEquals(this.mRotatableBond, null) ? 0 : this.mRotatableBond.length;
  };
  _.getRotatableBonds = function getRotatableBonds_0() {
    return this.mRotatableBond;
  };
  _.initialize_1 = function initialize_6(mol, use60degreeSteps) {
    var atom, atom0, atom1, atomParity, atomParityIsPseudo, bond, bond0, bondParity, bondParityIsPseudo, count, isRotatableBond, rotatableBond;
    this.applyTimeOut();
    this.mSelfOrganizer = null;
    mol.ensureHelperArrays_0(1);
    for (atom0 = 0; atom0 < mol.getAtoms_0(); atom0++)
      if (mol.getOccupiedValence_0(atom0) > mol.getMaxValence_0(atom0))
        return false;
    ooccg.addHydrogenAtoms(mol);
    mol.setHydrogenProtection_0(true);
    atomParity = null;
    bondParity = null;
    atomParityIsPseudo = null;
    bondParityIsPseudo = null;
    if ((mol.getHelperArrayStatus_0() & 8) != 0) {
      atomParity = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 15, 1);
      atomParityIsPseudo = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 16, 1);
      for (atom1 = 0; atom1 < mol.getAtoms_0(); atom1++) {
        atomParity[atom1] = mol.getAtomParity_0(atom1);
        atomParityIsPseudo[atom1] = mol.isAtomParityPseudo_0(atom1);
      }
      bondParity = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getBonds_0(), 15, 1);
      bondParityIsPseudo = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getBonds_0(), 16, 1);
      for (bond0 = 0; bond0 < mol.getBonds_0(); bond0++) {
        bondParity[bond0] = mol.getBondParity_0(bond0);
        bondParityIsPseudo[bond0] = mol.isBondParityPseudo_0(bond0);
      }
    }
    mol.ensureHelperArrays_0(63);
    if (jsNotEquals(atomParity, null)) {
      for (atom1 = 0; atom1 < mol.getAtoms_0(); atom1++)
        mol.setAtomParity_0(atom1, atomParity[atom1], atomParityIsPseudo[atom1]);
      for (bond0 = 0; bond0 < mol.getBonds_0(); bond0++)
        mol.setBondParity_0(bond0, bondParity[bond0], bondParityIsPseudo[bond0]);
    }
    this.mMolecule = mol;
    this.mAllConformerCount = 0;
    this.mReturnedConformerCount = 0;
    this.mTorsionSet = null;
    this.mRotatableBond = null;
    this.mDisconnectedFragmentNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 15, 1);
    this.mDisconnectedFragmentCount = mol.getFragmentNumbers_0(this.mDisconnectedFragmentNo, false, true);
    this.mDisconnectedFragmentSize = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mDisconnectedFragmentCount, 15, 1);
    for (atom = 0; atom < mol.getAllAtoms_0(); atom++)
      this.mDisconnectedFragmentSize[this.mDisconnectedFragmentNo[atom]]++;
    isRotatableBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAllBonds_0(), 16, 1);
    count = carcc.findRotatableBonds(mol, true, isRotatableBond);
    if (count == 0)
      return true;
    if (!this.locateInitialFragments_0(isRotatableBond))
      return false;
    this.mRotatableBond = initUnidimensionalArray(cggl.Lorg_openmolecules_chem_conf_gen_RotatableBond_2_classLit, { 4: 1, 1: 1, 7: 1 }, 156, count, 0, 1);
    rotatableBond = 0;
    for (bond = 0; bond < mol.getBonds_0(); bond++)
      if (isRotatableBond[bond])
        setCheck(this.mRotatableBond, rotatableBond++, new ooccg.RotatableBond(mol, bond, this.mFragmentNo, this.mDisconnectedFragmentNo, this.mDisconnectedFragmentSize[this.mDisconnectedFragmentNo[mol.getBondAtom_0(0, bond)]], this.mRigidFragment, use60degreeSteps));
    ju.sort_7(this.mRotatableBond, new ooccg.ConformerGenerator$lambda$0$Type());
    if (this.mIsDiagnosticsMode)
      this.mDiagnostics = new ooccg.ConformerSetDiagnostics(this);
    this.initializeCollisionCheck();
    return true;
  };
  _.initializeCollisionCheck = function initializeCollisionCheck() {
    var atom, atom0, atom1, atom2, i, i0, j, j0, rf, rf$array, rf$index, rf$max;
    this.mSkipCollisionCheck = initUnidimensionalArray(cggl.Z_classLit, { 4: 1, 1: 1, 7: 1 }, 10, this.mMolecule.getAllAtoms_0(), 0, 2);
    for (atom0 = 1; atom0 < this.mMolecule.getAllAtoms_0(); atom0++)
      this.mSkipCollisionCheck[atom0] = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, atom0, 16, 1);
    for (rf$array = this.mRigidFragment, rf$index = 0, rf$max = rf$array.length; rf$index < rf$max; ++rf$index) {
      rf = rf$array[rf$index];
      for (i0 = 1; i0 < rf.getExtendedSize(); i0++)
        for (j0 = 0; j0 < i0; j0++)
          this.skipCollisionCheck(rf.extendedToOriginalAtom(i0), rf.extendedToOriginalAtom(j0));
    }
    for (atom = 0; atom < this.mMolecule.getAtoms_0(); atom++)
      for (i = 1; i < this.mMolecule.getAllConnAtoms_0(atom); i++)
        for (j = 0; j < i; j++)
          this.skipCollisionCheck(this.mMolecule.getConnAtom_0(atom, i), this.mMolecule.getConnAtom_0(atom, j));
    if (jsNotEquals(this.mDisconnectedFragmentNo, null)) {
      for (atom1 = 1; atom1 < this.mMolecule.getAllAtoms_0(); atom1++)
        for (atom2 = 0; atom2 < atom1; atom2++)
          if (this.mDisconnectedFragmentNo[atom1] != this.mDisconnectedFragmentNo[atom2])
            this.mSkipCollisionCheck[atom1][atom2] = true;
    }
  };
  _.initializeConformers_1 = function initializeConformers_1(mol, strategy, maxTorsionSets, use60degreeSteps) {
    if (!this.initialize_1(mol, use60degreeSteps))
      return false;
    if (jsEquals(this.mRotatableBond, null)) {
      this.mSelfOrganizer = new ooccs.ConformationSelfOrganizer(mol, true);
      this.mSelfOrganizer.setThreadMaster(this.mThreadMaster);
      this.mSelfOrganizer.setStopTime(this.mStopMillis);
      this.mSelfOrganizer.initializeConformers_2(this.mRandomSeed, -1);
    } else {
      this.mBaseConformerMap = new ju.TreeMap_0(new caru.IntArrayComparator());
      switch (strategy) {
        case 2:
          this.mTorsionSetStrategy = new ooccg.TorsionSetStrategyRandom(this, false, this.mRandomSeed);
          break;
        case 3:
          this.mTorsionSetStrategy = new ooccg.TorsionSetStrategyRandom(this, true, this.mRandomSeed);
          break;
        case 4:
          this.mTorsionSetStrategy = new ooccg.TorsionSetStrategyAdaptiveRandom(this, true, true, this.mRandomSeed);
          break;
        case 1:
          this.mTorsionSetStrategy = new ooccg.TorsionSetStrategyLikelySystematic(this);
          break;
      }
      this.mTorsionSetStrategy.setMaxTotalCount(maxTorsionSets);
    }
    return true;
  };
  _.locateInitialFragments_0 = function locateInitialFragments_0(isRotatableBond) {
    var fragmentCount, i, ok;
    this.mFragmentNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mMolecule.getAllAtoms_0(), 15, 1);
    fragmentCount = this.mMolecule.getFragmentNumbers_1(this.mFragmentNo, isRotatableBond, true);
    this.mRigidFragment = initUnidimensionalArray(cggl.Lorg_openmolecules_chem_conf_gen_RigidFragment_2_classLit, { 4: 1, 1: 1, 7: 1 }, 199, fragmentCount, 0, 1);
    ok = true;
    for (i = 0; i < fragmentCount; i++)
      ok = ok & jsNotEquals(setCheck(this.mRigidFragment, i, this.mRigidFragmentProvider.createFragment(this.mMolecule, this.mFragmentNo, i)), null);
    return ok;
  };
  _.mustStop = function mustStop() {
    return isNotNull(this.mThreadMaster) && this.mThreadMaster.threadMustDie() || neq(this.mStopMillis, 0) && gt(jl.currentTimeMillis_0(), this.mStopMillis);
  };
  _.separateDisconnectedFragments = function separateDisconnectedFragments(conformer) {
    var SEPARATION_DISTANCE, atom, atom0, c, i, i0, i1, maxZ, meanX, meanY, minZ, shiftX, shiftY, shiftZ;
    SEPARATION_DISTANCE = 3;
    if (this.mDisconnectedFragmentCount > 1) {
      meanX = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDisconnectedFragmentCount, 15, 1);
      meanY = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDisconnectedFragmentCount, 15, 1);
      minZ = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDisconnectedFragmentCount, 15, 1);
      maxZ = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDisconnectedFragmentCount, 15, 1);
      for (i0 = 0; i0 < this.mDisconnectedFragmentCount; i0++) {
        minZ[i0] = 1e9;
        maxZ[i0] = -1e9;
      }
      for (atom0 = 0; atom0 < conformer.getSize_0(); atom0++) {
        meanX[this.mDisconnectedFragmentNo[atom0]] += conformer.getX_0(atom0);
        meanY[this.mDisconnectedFragmentNo[atom0]] += conformer.getY_0(atom0);
        if (minZ[this.mDisconnectedFragmentNo[atom0]] > conformer.getZ(atom0))
          minZ[this.mDisconnectedFragmentNo[atom0]] = conformer.getZ(atom0);
        if (maxZ[this.mDisconnectedFragmentNo[atom0]] < conformer.getZ(atom0))
          maxZ[this.mDisconnectedFragmentNo[atom0]] = conformer.getZ(atom0);
      }
      for (i1 = 0; i1 < this.mDisconnectedFragmentCount; i1++) {
        meanX[i1] /= this.mDisconnectedFragmentSize[i1];
        meanY[i1] /= this.mDisconnectedFragmentSize[i1];
      }
      shiftX = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDisconnectedFragmentCount, 15, 1);
      shiftY = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDisconnectedFragmentCount, 15, 1);
      shiftZ = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mDisconnectedFragmentCount, 15, 1);
      for (i = 1; i < this.mDisconnectedFragmentCount; i++) {
        shiftX[i] = meanX[0] - meanX[i];
        shiftY[i] = meanY[0] - meanY[i];
        shiftZ[i] = shiftZ[i - 1] + maxZ[i - 1] - minZ[i] + 3;
      }
      for (atom = 0; atom < conformer.getSize_0(); atom++) {
        if (this.mDisconnectedFragmentNo[atom] != 0) {
          c = conformer.getCoordinates(atom);
          c.x_0 += shiftX[this.mDisconnectedFragmentNo[atom]];
          c.y_0 += shiftY[this.mDisconnectedFragmentNo[atom]];
          c.z_0 += shiftZ[this.mDisconnectedFragmentNo[atom]];
        }
      }
    }
  };
  _.setThreadMaster = function setThreadMaster(tm) {
    this.mThreadMaster = tm;
    this.mRigidFragmentProvider.setThreadMaster(tm);
  };
  _.skipCollisionCheck = function skipCollisionCheck(atom1, atom2) {
    if (atom1 < atom2)
      this.mSkipCollisionCheck[atom2][atom1] = true;
    else
      this.mSkipCollisionCheck[atom1][atom2] = true;
  };
  _.tryFixCollisions = function tryFixCollisions(baseConformer, torsionSet) {
    var bestCollisionStrain, collisionStrain, conformer, f1, f10, f2, f20, globalBest, i, i0, localBest, origCollisionStrainMatrix, origCollisionStrainSum, r1, r2, rbIndex, remainingCollisionStrain, rotatableBond, startTorsion, step, strain, torsionDif;
    if (this.mustStop())
      return false;
    origCollisionStrainMatrix = torsionSet.getCollisionStrainMatrix();
    remainingCollisionStrain = 0;
    for (f10 = 1; f10 < origCollisionStrainMatrix.length; f10++)
      if (jsNotEquals(origCollisionStrainMatrix[f10], null)) {
        for (f20 = 0; f20 < f10; f20++)
          if (origCollisionStrainMatrix[f10][f20] != 0 && this.mTorsionSetStrategy.getBondsBetweenFragments(f10, f20).length != 2)
            remainingCollisionStrain += origCollisionStrainMatrix[f10][f20];
      }
    if (remainingCollisionStrain > 6)
      return false;
    conformer = null;
    localBest = null;
    globalBest = null;
    bestCollisionStrain = 17976931348623157e292;
    origCollisionStrainSum = torsionSet.getCollisionStrainSum();
    for (f1 = 1; f1 < origCollisionStrainMatrix.length; f1++) {
      if (jsNotEquals(origCollisionStrainMatrix[f1], null)) {
        for (f2 = 0; f2 < f1; f2++) {
          if (origCollisionStrainMatrix[f1][f2] > 1 && this.mTorsionSetStrategy.getBondsBetweenFragments(f1, f2).length == 2) {
            rbIndex = this.mTorsionSetStrategy.getBondsBetweenFragments(f1, f2);
            startTorsion = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
            for (i0 = 0; i0 < 2; i0++) {
              rotatableBond = this.mRotatableBond[rbIndex[i0]];
              startTorsion[i0] = torsionSet.getConformer().getBondTorsion(rotatableBond.getBond_1());
            }
            torsionDif = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
            for (r1 = -1; r1 <= 1; r1 += 2) {
              torsionDif[0] = r1 * 8;
              for (r2 = -1; r2 <= 1; r2 += 2) {
                torsionDif[1] = r2 * 8;
                collisionStrain = origCollisionStrainMatrix[f1][f2];
                for (step = 1; step <= 3; step++) {
                  if (isNull(conformer))
                    conformer = new carcc.Conformer_0(torsionSet.getConformer());
                  else
                    conformer.copyFrom_0(torsionSet.getConformer());
                  for (i = 0; i < 2; i++)
                    baseConformer.rotateTo(conformer, this.mRotatableBond[rbIndex[i]], narrow_short(startTorsion[i] + step * torsionDif[i]));
                  strain = this.calculateCollisionStrain_0(conformer, this.mRigidFragment[f1], this.mRigidFragment[f2]);
                  if (strain < collisionStrain - 1) {
                    collisionStrain = strain;
                    if (isNull(localBest))
                      localBest = new carcc.Conformer_0(conformer);
                    else
                      localBest.copyFrom_0(conformer);
                    if (collisionStrain < 1)
                      break;
                  } else {
                    break;
                  }
                }
                if (collisionStrain < origCollisionStrainMatrix[f1][f2] && collisionStrain < bestCollisionStrain) {
                  bestCollisionStrain = collisionStrain;
                  if (isNull(globalBest))
                    globalBest = new carcc.Conformer_0(localBest);
                  else
                    globalBest.copyFrom_0(localBest);
                }
              }
            }
          }
        }
      }
    }
    if (isNull(globalBest))
      return false;
    this.calculateCollision(torsionSet, globalBest);
    if (torsionSet.getCollisionStrainSum() >= origCollisionStrainSum) {
      torsionSet.setCollisionStrain_0(origCollisionStrainSum, origCollisionStrainMatrix);
      return false;
    }
    torsionSet.getConformer().copyFrom_0(globalBest);
    return true;
  };
  _.mAllConformerCount = 0;
  _.mDisconnectedFragmentCount = 0;
  _.mIsDiagnosticsMode = false;
  _.mIsFinished = false;
  _.mRandomSeed = 0;
  _.mReturnedConformerCount = 0;
  _.mStopMillis = 0;
  _.mTimeOut = 0;
  _.mUseSelfOrganizerIfAllFails = false;
  ooccg.COLLISION_STRAIN_TO_ENERGY_FACTOR = 20;
  ooccg.ESCAPE_ANGLE_0 = 8;
  ooccg.ESCAPE_STEPS_0 = 3;
  ooccg.MIN_ESCAPE_GAIN_PER_STEP_0 = 1;
  ooccg.STRATEGY_ADAPTIVE_RANDOM_0 = 4;
  ooccg.STRATEGY_LIKELY_RANDOM_0 = 3;
  ooccg.STRATEGY_LIKELY_SYSTEMATIC_0 = 1;
  ooccg.STRATEGY_PURE_RANDOM_0 = 2;
  ooccg.VDW_TOLERANCE_HYDROGEN = 0.9;
  ooccg.VDW_TOLERANCE_OTHER = 0.9;
  cggl.Lorg_openmolecules_chem_conf_gen_ConformerGenerator_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "ConformerGenerator", 235, cggl.Ljava_lang_Object_2_classLit);
  ooccg.$clinit_ConformerGenerator$lambda$0$Type = function $clinit_ConformerGenerator$lambda$0$Type() {
    ooccg.$clinit_ConformerGenerator$lambda$0$Type = emptyMethod;
  };
  ooccg.ConformerGenerator$lambda$0$Type = function ConformerGenerator$lambda$0$Type() {
    ooccg.$clinit_ConformerGenerator$lambda$0$Type();
  };
  defineClass(313, 1, { 1: 1, 36: 1 }, ooccg.ConformerGenerator$lambda$0$Type);
  _.compare_0 = function compare_38(arg0, arg1) {
    return ooccg.lambda$0_10(castTo(arg0, 156), castTo(arg1, 156));
  };
  _.equals_0 = function equals_50(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  cggl.Lorg_openmolecules_chem_conf_gen_ConformerGenerator$lambda$0$Type_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "ConformerGenerator/lambda$0$Type", 313, cggl.Ljava_lang_Object_2_classLit);
  ooccg.$clinit_ConformerSetDiagnostics = function $clinit_ConformerSetDiagnostics() {
    ooccg.$clinit_ConformerSetDiagnostics = emptyMethod;
    jl.$clinit_Object();
  };
  ooccg.ConformerSetDiagnostics = function ConformerSetDiagnostics(cg) {
    ooccg.$clinit_ConformerSetDiagnostics();
    Object_0.call(this);
    this.$init_410();
    this.mConformerGenerator = cg;
    this.mRotatableBond = cg.getRotatableBonds();
    this.mRigidFragment = cg.getRigidFragments();
    this.mDiagnosticsMap = new ju.TreeMap();
  };
  defineClass(314, 1, { 1: 1 }, ooccg.ConformerSetDiagnostics);
  _.$init_410 = function $init_410() {
  };
  _.addNew = function addNew(ts) {
    this.mDiagnosticsMap.put(ts.getConformer().getName_0(), new ooccg.ConformerDiagnostics(ts));
  };
  _.get_6 = function get_39(ts) {
    return castTo(this.mDiagnosticsMap.get(ts.getConformer().getName_0()), 219);
  };
  _.getRotatableBondCount_0 = function getRotatableBondCount_4() {
    return this.mRotatableBond.length;
  };
  _.setExitReason = function setExitReason(er) {
    this.mExitReason = er;
  };
  cggl.Lorg_openmolecules_chem_conf_gen_ConformerSetDiagnostics_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "ConformerSetDiagnostics", 314, cggl.Ljava_lang_Object_2_classLit);
  ooccg.$clinit_RigidFragment = function $clinit_RigidFragment() {
    ooccg.$clinit_RigidFragment = emptyMethod;
    jl.$clinit_Object();
  };
  ooccg.RigidFragment = function RigidFragment(coreAtomCount, coreToFragmentAtom, fragmentToOriginalAtom, extendedToFragmentAtom, originalToExtendedAtom, conformerList, conformerLikelyhood) {
    ooccg.$clinit_RigidFragment();
    Object_0.call(this);
    this.$init_411();
    this.mCoreAtomCount = coreAtomCount;
    this.mCoreToFragmentAtom = coreToFragmentAtom;
    this.mFragmentToOriginalAtom = fragmentToOriginalAtom;
    this.mExtendedToFragmentAtom = extendedToFragmentAtom;
    this.mOriginalToExtendedAtom = originalToExtendedAtom;
    this.mConformerList = conformerList;
    this.mConformerLikelihood = conformerLikelyhood;
  };
  defineClass(199, 1, { 1: 1, 199: 1 }, ooccg.RigidFragment);
  _.$init_411 = function $init_411() {
  };
  _.coreToOriginalAtom = function coreToOriginalAtom(atom) {
    return this.mFragmentToOriginalAtom[this.mCoreToFragmentAtom[atom]];
  };
  _.extendedToOriginalAtom = function extendedToOriginalAtom(atom) {
    return this.mFragmentToOriginalAtom[this.mExtendedToFragmentAtom[atom]];
  };
  _.getConformerCount_0 = function getConformerCount_1() {
    return this.mConformerList.length;
  };
  _.getConformerLikelihood = function getConformerLikelihood(i) {
    return this.mConformerLikelihood[i];
  };
  _.getConnectionPointCount = function getConnectionPointCount() {
    return this.mExtendedToFragmentAtom.length - this.mCoreToFragmentAtom.length;
  };
  _.getCoreCoordinates = function getCoreCoordinates(conformer, atom) {
    return this.mConformerList[conformer].getCoordinates(this.mCoreToFragmentAtom[atom]);
  };
  _.getCoreSize = function getCoreSize() {
    return this.mCoreToFragmentAtom.length;
  };
  _.getExtendedCoordinates = function getExtendedCoordinates(conformer, atom) {
    return this.mConformerList[conformer].getCoordinates(this.mExtendedToFragmentAtom[atom]);
  };
  _.getExtendedSize = function getExtendedSize() {
    return this.mExtendedToFragmentAtom.length;
  };
  _.getLikelyRandomConformerIndex = function getLikelyRandomConformerIndex(random, progress) {
    var contribution, sum, t;
    sum = 0;
    for (t = 0; t < this.mConformerLikelihood.length; t++) {
      contribution = (1 - progress) * this.mConformerLikelihood[t] + progress / this.mConformerLikelihood.length;
      sum += contribution;
      if (random <= sum)
        return t;
    }
    return this.mConformerLikelihood.length - 1;
  };
  _.originalToExtendedAtom = function originalToExtendedAtom_0(originalAtom) {
    return this.mOriginalToExtendedAtom[originalAtom];
  };
  _.mCoreAtomCount = 0;
  cggl.Lorg_openmolecules_chem_conf_gen_RigidFragment_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "RigidFragment", 199, cggl.Ljava_lang_Object_2_classLit);
  ooccg.$clinit_RigidFragmentCache = function $clinit_RigidFragmentCache() {
    ooccg.$clinit_RigidFragmentCache = emptyMethod;
    juc.$clinit_ConcurrentHashMap();
  };
  ooccg.RigidFragmentCache = function RigidFragmentCache() {
    juc.ConcurrentHashMap.call(this);
    this.$init_412();
    this.mMaxEntryCount = 5e5;
  };
  ooccg.getDefaultInstance = function getDefaultInstance() {
    ooccg.$clinit_RigidFragmentCache();
    if (isNotNull(ooccg.sInstance_0))
      return ooccg.sInstance_0;
    {
      cggl.Lorg_openmolecules_chem_conf_gen_RigidFragmentCache_2_classLit;
      if (isNull(ooccg.sInstance_0))
        ooccg.sInstance_0 = new ooccg.RigidFragmentCache();
      return ooccg.sInstance_0;
    }
  };
  defineClass(426, 213, { 4: 1, 1: 1, 55: 1 }, ooccg.RigidFragmentCache);
  _.$init_412 = function $init_412() {
  };
  _.get = function get_40(key) {
    return this.get_7(key);
  };
  _.put = function put_6(key, cacheEntry) {
    return this.put_2(castToString(key), castTo(cacheEntry, 141));
  };
  _.canAddEntry = function canAddEntry() {
    return this.size() < this.mMaxEntryCount;
  };
  _.clear = function clear_28() {
    getClassPrototype(139).clear.call(this);
    this.mDefaultCacheLoaded = false;
  };
  _.get_7 = function get_41(key) {
    var entry;
    entry = castTo(getClassPrototype(213).get.call(this, key), 141);
    this.mGetCount++;
    if (isNotNull(entry)) {
      entry.incrementHitCount();
      this.mHitCount++;
    }
    return entry;
  };
  _.increaseNonCachableCount = function increaseNonCachableCount() {
    this.mNonCachableCount++;
  };
  _.put_2 = function put_7(key, cacheEntry) {
    return this.size() < this.mMaxEntryCount ? castTo(getClassPrototype(213).put.call(this, key, cacheEntry), 141) : null;
  };
  _.mDefaultCacheLoaded = false;
  _.mGetCount = 0;
  _.mHitCount = 0;
  _.mMaxEntryCount = 0;
  _.mNonCachableCount = 0;
  ooccg.DEFAULT_CACHE_FILE = "/resources/defaultRigidFragments.zip";
  ooccg.DEFAULT_MAX_ENTRY_COUNT = 5e5;
  cggl.Lorg_openmolecules_chem_conf_gen_RigidFragmentCache_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "RigidFragmentCache", 426, cggl.Ljava_util_concurrent_ConcurrentHashMap_2_classLit);
  ooccg.$clinit_RigidFragmentCache$CacheEntry = function $clinit_RigidFragmentCache$CacheEntry() {
    ooccg.$clinit_RigidFragmentCache$CacheEntry = emptyMethod;
    jl.$clinit_Object();
  };
  ooccg.RigidFragmentCache$CacheEntry = function RigidFragmentCache$CacheEntry(coordinates, likelihoods) {
    ooccg.$clinit_RigidFragmentCache$CacheEntry();
    Object_0.call(this);
    this.$init_413();
    this.coordinates_0 = coordinates;
    this.likelihood = likelihoods;
  };
  defineClass(141, 1, { 22: 1, 1: 1, 141: 1 }, ooccg.RigidFragmentCache$CacheEntry);
  _.$init_413 = function $init_413() {
  };
  _.compareTo_1 = function compareTo_43(o) {
    return this.compareTo_22(castTo(o, 141));
  };
  _.compareTo_22 = function compareTo_44(o) {
    if (this.hitCount != o.hitCount)
      return this.hitCount < o.hitCount ? -1 : 1;
    return 0;
  };
  _.incrementHitCount = function incrementHitCount() {
    this.hitCount++;
  };
  _.hitCount = 0;
  cggl.Lorg_openmolecules_chem_conf_gen_RigidFragmentCache$CacheEntry_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "RigidFragmentCache/CacheEntry", 141, cggl.Ljava_lang_Object_2_classLit);
  ooccg.$clinit_RigidFragmentProvider = function $clinit_RigidFragmentProvider() {
    ooccg.$clinit_RigidFragmentProvider = emptyMethod;
    jl.$clinit_Object();
  };
  ooccg.RigidFragmentProvider = function RigidFragmentProvider(randomSeed, cache, optimizeRigidFragments) {
    ooccg.$clinit_RigidFragmentProvider();
    Object_0.call(this);
    this.$init_414();
    this.mRandomSeed = randomSeed;
    this.mCache = cache;
    this.mOptimizeFragments = optimizeRigidFragments;
    if (optimizeRigidFragments)
      this.forceFieldInitialize();
  };
  defineClass(312, 1, { 1: 1 }, ooccg.RigidFragmentProvider);
  _.$init_414 = function $init_414() {
  };
  _.createFragment = function createFragment(mol, fragmentNo, fragmentIndex) {
    var MMFF_ENERGY_FOR_FACTOR_10, SO_ENERGY_FOR_FACTOR_10, atom, atom0, atom1, atom2, atom3, atomCount, bestConformer, bond, bond0, bondCount, c, cacheEntry, canonizer, conf, conf$iterator, conf$iterator0, conf$iterator1, conformer, conformerList, connAtom, coords, coords$array, coords$index, coords$max, coreAtom, coreAtomCount, coreToFragmentAtom, energy, energyLimit, extendedAtom, extendedAtomCount, extendedToFragmentAtom, fragment, fragmentAtom, fragmentToOriginalAtom, graphIndex, i, i0, i1, i2, i3, includeAtom, index_0, invertedEnantiomer, isCoreFragment, isOuterShellAtom, j, key, likelihood, likelihoodSum, minEnergy, minStrain, originalToExtendedAtom, population, populationSum, selfOrganizer, strainLimit, useCache, validEnergyCount, xyz;
    coreAtomCount = 0;
    atomCount = 0;
    extendedAtomCount = 0;
    includeAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 16, 1);
    isOuterShellAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 16, 1);
    isCoreFragment = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 16, 1);
    for (atom0 = 0; atom0 < mol.getAllAtoms_0(); atom0++) {
      if (fragmentNo[atom0] == fragmentIndex) {
        isCoreFragment[atom0] = true;
        includeAtom[atom0] = true;
        atomCount++;
        coreAtomCount++;
      }
    }
    for (atom1 = 0; atom1 < mol.getAllAtoms_0(); atom1++) {
      if (isCoreFragment[atom1]) {
        for (i = 0; i < mol.getConnAtoms_0(atom1); i++) {
          connAtom = mol.getConnAtom_0(atom1, i);
          if (!includeAtom[connAtom]) {
            includeAtom[connAtom] = true;
            atomCount++;
            extendedAtomCount++;
          }
        }
      }
    }
    for (atom2 = 0; atom2 < mol.getAllAtoms_0(); atom2++) {
      if (includeAtom[atom2] && !isCoreFragment[atom2] && !isOuterShellAtom[atom2]) {
        for (i = 0; i < mol.getAllConnAtoms_0(atom2); i++) {
          connAtom = mol.getConnAtom_0(atom2, i);
          if (!includeAtom[connAtom]) {
            isOuterShellAtom[connAtom] = true;
            includeAtom[connAtom] = true;
            atomCount++;
          }
        }
      }
    }
    bondCount = 0;
    for (bond0 = 0; bond0 < mol.getAllBonds_0(); bond0++)
      if (includeAtom[mol.getBondAtom_0(0, bond0)] && includeAtom[mol.getBondAtom_0(1, bond0)])
        bondCount++;
    fragment = new carc2.StereoMolecule_0(atomCount, bondCount);
    mol.copyMoleculeByAtoms_0(fragment, includeAtom, false, null);
    fragment.setFragment_0(true);
    coreToFragmentAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, coreAtomCount, 15, 1);
    fragmentToOriginalAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, atomCount, 15, 1);
    extendedToFragmentAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, coreAtomCount + extendedAtomCount, 15, 1);
    originalToExtendedAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 15, 1);
    coreAtom = 0;
    fragmentAtom = 0;
    extendedAtom = 0;
    for (atom3 = 0; atom3 < mol.getAllAtoms_0(); atom3++) {
      if (includeAtom[atom3]) {
        if (mol.isFlatNitrogen_0(atom3))
          fragment.setAtomQueryFeature_0(fragmentAtom, 268435456, true);
        if (!isCoreFragment[atom3])
          fragment.setAtomMarker_0(fragmentAtom, true);
        if (isCoreFragment[atom3] || !isOuterShellAtom[atom3]) {
          extendedToFragmentAtom[extendedAtom] = fragmentAtom;
          originalToExtendedAtom[atom3] = extendedAtom;
          extendedAtom++;
        }
        if (isCoreFragment[atom3]) {
          coreToFragmentAtom[coreAtom] = fragmentAtom;
          coreAtom++;
        }
        fragmentToOriginalAtom[fragmentAtom] = atom3;
        if (fragment.getAtomicNo_0(fragmentAtom) == 1)
          fragment.setAtomMass_0(fragmentAtom, 2);
        fragmentAtom++;
      }
    }
    conformerList = null;
    likelihood = null;
    canonizer = null;
    key = null;
    invertedEnantiomer = false;
    useCache = isNotNull(this.mCache) && this.mCache.canAddEntry() && atomCount <= 32;
    if (useCache) {
      canonizer = new carc2.Canonizer_0(fragment, 512);
      for (atom = 0; atom < fragment.getAtoms_0(); atom++) {
        if (canonizer.getTHParity(atom) == 3) {
          useCache = false;
          break;
        }
      }
      for (bond = 0; bond < fragment.getBonds_0(); bond++) {
        if (canonizer.getEZParity(bond) == 3) {
          useCache = false;
          break;
        }
      }
      if (useCache)
        canonizer.setParities_0();
    }
    if (isNotNull(this.mCache) && !useCache)
      this.mCache.increaseNonCachableCount();
    fragment.setParitiesValid_0(0);
    if (useCache) {
      invertedEnantiomer = canonizer.normalizeEnantiomer_0();
      key = canonizer.getIDCode_0();
      cacheEntry = this.mCache.get_7(key);
      if (isNotNull(cacheEntry)) {
        graphIndex = canonizer.getGraphIndexes_0();
        conformerList = new ju.ArrayList();
        for (coords$array = cacheEntry.coordinates_0, coords$index = 0, coords$max = coords$array.length; coords$index < coords$max; ++coords$index) {
          coords = coords$array[coords$index];
          for (j = 0; j < fragment.getAllAtoms_0(); j++) {
            c = coords[graphIndex[j]];
            fragment.setAtomX_0(j, c.x_0);
            fragment.setAtomY_0(j, c.y_0);
            fragment.setAtomZ_0(j, invertedEnantiomer ? -c.z_0 : c.z_0);
          }
          conformerList.add(new ooccs.SelfOrganizedConformer(fragment));
        }
        likelihood = cacheEntry.likelihood;
      }
    }
    if (isNull(conformerList)) {
      if (this.mOptimizeFragments && !this.forceFieldAllowsOpenValences()) {
        fragment.setFragment_0(false);
        ooccg.addHydrogenAtoms(fragment);
      }
      selfOrganizer = new ooccs.ConformationSelfOrganizer(fragment, true);
      selfOrganizer.setThreadMaster(this.mThreadMaster);
      selfOrganizer.setStopTime(this.mStopMillis);
      selfOrganizer.initializeConformers_2(this.mRandomSeed, 16);
      conformerList = new ju.ArrayList();
      bestConformer = selfOrganizer.getNextConformer_1();
      conformerList.add(bestConformer);
      conformer = selfOrganizer.getNextConformer_1();
      while (isNotNull(conformer)) {
        conformerList.add(conformer);
        conformer = selfOrganizer.getNextConformer_1();
      }
      SO_ENERGY_FOR_FACTOR_10 = 10 * 1.36;
      MMFF_ENERGY_FOR_FACTOR_10 = 1.36;
      minStrain = 17976931348623157e292;
      for (conf$iterator0 = conformerList.iterator(); conf$iterator0.hasNext_0(); ) {
        conf = castTo(conf$iterator0.next_3(), 54);
        minStrain = $wnd.Math.min(minStrain, conf.getTotalStrain());
      }
      strainLimit = 2 * minStrain;
      for (i0 = conformerList.size() - 1; i0 >= 0; i0--)
        if (castTo(conformerList.getAtIndex(i0), 54).getTotalStrain() > strainLimit)
          conformerList.removeAtIndex(i0);
      likelihood = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, conformerList.size(), 15, 1);
      likelihoodSum = 0;
      index_0 = 0;
      for (i1 = 0; i1 < conformerList.size(); i1++) {
        conf = castTo(conformerList.getAtIndex(i1), 54);
        likelihood[i1] = $wnd.Math.pow(10, (minStrain - conf.getTotalStrain()) / SO_ENERGY_FOR_FACTOR_10);
        likelihoodSum += likelihood[i1];
      }
      for (i2 = 0; i2 < conformerList.size(); i2++)
        likelihood[i2] /= likelihoodSum;
      if (this.mOptimizeFragments) {
        validEnergyCount = 0;
        minEnergy = 17976931348623157e292;
        for (conf$iterator1 = conformerList.iterator(); conf$iterator1.hasNext_0(); ) {
          conf = castTo(conf$iterator1.next_3(), 54);
          energy = this.forceFieldMinimize(conf.toMolecule());
          conf.setEnergy(energy);
          if (!isNaN(energy)) {
            minEnergy = $wnd.Math.min(minEnergy, energy);
            validEnergyCount++;
          }
          conf.copyFrom(fragment);
        }
        energyLimit = minEnergy + 2 * MMFF_ENERGY_FOR_FACTOR_10;
        for (conf$iterator = conformerList.iterator(); conf$iterator.hasNext_0(); ) {
          conf = castTo(conf$iterator.next_3(), 54);
          if (!isNaN(conf.getEnergy()) && conf.getEnergy() > energyLimit) {
            conf.setEnergy(NaN);
            validEnergyCount--;
          }
        }
        if (validEnergyCount != 0) {
          population = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, validEnergyCount, 15, 1);
          populationSum = 0;
          index_0 = 0;
          for (i3 = conformerList.size() - 1; i3 >= 0; i3--) {
            conf = castTo(conformerList.getAtIndex(i3), 61);
            if (isNaN(conf.getEnergy()))
              conformerList.removeAtIndex(i3);
            else {
              population[index_0] = $wnd.Math.pow(10, (minEnergy - conf.getEnergy()) / MMFF_ENERGY_FOR_FACTOR_10);
              populationSum += population[index_0];
              index_0++;
            }
          }
          likelihood = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, validEnergyCount, 15, 1);
          for (i = 0; i < validEnergyCount; i++)
            likelihood[i] = population[i] / populationSum;
        }
      }
      if (useCache) {
        graphIndex = canonizer.getGraphIndexes_0();
        coords = initMultidimensionalArray(cggl.Lcom_actelion_research_chem_Coordinates_2_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 151: 1, 4: 1, 1: 1, 7: 1 }], [151, 33], 0, [conformerList.size(), graphIndex.length], 2);
        for (i = 0; i < coords.length; i++) {
          for (j = 0; j < graphIndex.length; j++) {
            xyz = castTo(conformerList.getAtIndex(i), 54).getCoordinates(j);
            coords[i][graphIndex[j]] = new carc2.Coordinates_1(xyz.x_0, xyz.y_0, invertedEnantiomer ? -xyz.z_0 : xyz.z_0);
          }
        }
        this.mCache.put_2(key, new ooccg.RigidFragmentCache$CacheEntry(coords, likelihood));
      }
    }
    return new ooccg.RigidFragment(coreAtomCount, coreToFragmentAtom, fragmentToOriginalAtom, extendedToFragmentAtom, originalToExtendedAtom, castTo(conformerList.toArray_0(initUnidimensionalArray(cggl.Lorg_openmolecules_chem_conf_so_SelfOrganizedConformer_2_classLit, { 4: 1, 1: 1, 7: 1, 283: 1 }, 54, 0, 0, 1)), 283), likelihood);
  };
  _.forceFieldAllowsOpenValences = function forceFieldAllowsOpenValences() {
    return true;
  };
  _.forceFieldInitialize = function forceFieldInitialize() {
    carcfm.initialize_4("MMFF94s+");
  };
  _.forceFieldMinimize = function forceFieldMinimize(mol) {
    var bate, ex, ff;
    try {
      ff = new carcfm.ForceFieldMMFF94(mol, "MMFF94s+");
      ff.minimise();
      return ff.getTotalEnergy_0();
    } catch ($e0) {
      $e0 = toJava($e0);
      if (instanceOf($e0, 209)) {
        bate = $e0;
        return NaN;
      } else if (instanceOf($e0, 12)) {
        ex = $e0;
        ex.printStackTrace();
        return NaN;
      } else
        throw toJs($e0);
    }
  };
  _.setStopTime = function setStopTime(millis) {
    this.mStopMillis = millis;
  };
  _.setThreadMaster = function setThreadMaster_0(tm) {
    this.mThreadMaster = tm;
  };
  _.mOptimizeFragments = false;
  _.mRandomSeed = 0;
  _.mStopMillis = 0;
  ooccg.MAX_ATOMS_FOR_CACHING = 32;
  ooccg.MAX_CONFORMERS = 16;
  cggl.Lorg_openmolecules_chem_conf_gen_RigidFragmentProvider_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "RigidFragmentProvider", 312, cggl.Ljava_lang_Object_2_classLit);
  ooccg.$clinit_RotatableBond = function $clinit_RotatableBond() {
    ooccg.$clinit_RotatableBond = emptyMethod;
    jl.$clinit_Object();
    ooccg.SIXTY_DEGREE_TORSION = stampJavaTypeInfo(getClassLiteralForArray(cggl.S_classLit, 1), { 4: 1, 1: 1, 13: 1 }, 5, 15, [0, 60, 120, 180, 240, 300]);
    ooccg.SIXTY_DEGREE_FREQUENCY = stampJavaTypeInfo(getClassLiteralForArray(cggl.S_classLit, 1), { 4: 1, 1: 1, 13: 1 }, 5, 15, [17, 17, 17, 17, 17, 17]);
    ooccg.SIXTY_DEGREE_RANGE = stampJavaTypeInfo(getClassLiteralForArray(cggl.S_classLit, 2), { 4: 1, 1: 1, 7: 1, 40: 1 }, 13, 0, [stampJavaTypeInfo(getClassLiteralForArray(cggl.S_classLit, 1), { 4: 1, 1: 1, 13: 1 }, 5, 15, [-20, 20]), stampJavaTypeInfo(getClassLiteralForArray(cggl.S_classLit, 1), { 4: 1, 1: 1, 13: 1 }, 5, 15, [40, 80]), stampJavaTypeInfo(getClassLiteralForArray(cggl.S_classLit, 1), { 4: 1, 1: 1, 13: 1 }, 5, 15, [100, 140]), stampJavaTypeInfo(getClassLiteralForArray(cggl.S_classLit, 1), { 4: 1, 1: 1, 13: 1 }, 5, 15, [160, 200]), stampJavaTypeInfo(getClassLiteralForArray(cggl.S_classLit, 1), { 4: 1, 1: 1, 13: 1 }, 5, 15, [220, 260]), stampJavaTypeInfo(getClassLiteralForArray(cggl.S_classLit, 1), { 4: 1, 1: 1, 13: 1 }, 5, 15, [280, 320])]);
  };
  ooccg.RotatableBond = function RotatableBond(mol, bond, fragmentNo, disconnectedFragmentNo, disconnectedFragmentSize, fragment, use60degreeSteps) {
    ooccg.$clinit_RotatableBond();
    var detail, prediction;
    Object_0.call(this);
    this.$init_415();
    if (carcc.getTorsionFrequencies("gGP`@dfyjidNcGI[WQCP`<")[0] == -1)
      (jl.$clinit_System(), jl.out_0).println_0("ERROR");
    this.mBond = bond;
    this.mTorsionAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
    this.mRearAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    detail = new carcc.TorsionDetail();
    if (jsNotEquals(carcc.getTorsionID(mol, bond, this.mTorsionAtom, detail), null)) {
      this.mRearAtom[0] = detail.getRearAtom(0);
      this.mRearAtom[1] = detail.getRearAtom(1);
    } else {
      this.predictAtomSequence(mol);
    }
    this.mFragmentNo1 = fragmentNo[this.mTorsionAtom[1]];
    this.mFragmentNo2 = fragmentNo[this.mTorsionAtom[2]];
    this.mFragment1 = fragment[this.mFragmentNo1];
    this.mFragment2 = fragment[this.mFragmentNo2];
    this.mBondAtomsInFragmentOrder = fragmentNo[mol.getBondAtom_0(0, bond)] == this.mFragmentNo1;
    if (carcc.getTorsionFrequencies("gGP`@dfyjidNcGI[WQCP`<")[0] == -1)
      (jl.$clinit_System(), jl.out_0).println_0("ERROR");
    if (use60degreeSteps) {
      this.mDefaultTorsion = ooccg.SIXTY_DEGREE_TORSION;
      this.mDefaultFrequency = ooccg.SIXTY_DEGREE_FREQUENCY;
      this.mDefaultTorsionRange = ooccg.SIXTY_DEGREE_RANGE;
    } else {
      this.mTorsionID = detail.getID();
      this.mDefaultTorsion = carcc.getTorsions(detail.getID());
      if (jsEquals(this.mDefaultTorsion, null)) {
        prediction = new carcc.TorsionPrediction(mol, this.mTorsionAtom);
        this.mDefaultTorsion = prediction.getTorsions();
        this.mDefaultFrequency = prediction.getTorsionFrequencies();
        this.mDefaultTorsionRange = prediction.getTorsionRanges();
      } else {
        this.mDefaultFrequency = carcc.getTorsionFrequencies(detail.getID());
        this.mDefaultTorsionRange = carcc.getTorsionRanges(detail.getID());
      }
    }
    this.removeIllegalTorsions(mol);
    this.removeEquivalentTorsions(mol);
    this.findSmallerSideAtomList(mol, disconnectedFragmentNo, disconnectedFragmentSize);
  };
  defineClass(156, 1, { 1: 1, 156: 1 }, ooccg.RotatableBond);
  _.$init_415 = function $init_415() {
  };
  _.areBondAtomsInFragmentOrder = function areBondAtomsInFragmentOrder() {
    return this.mBondAtomsInFragmentOrder;
  };
  _.countSymmetricalTerminalNeighbors = function countSymmetricalTerminalNeighbors(mol, atom, rearAtom) {
    var connAtom, i, rank;
    if (mol.getAtomPi_0(atom) == 2)
      return 1;
    if ((mol.getAtomPi_0(atom) == 1 || mol.isFlatNitrogen_0(atom)) && mol.getConnAtoms_0(atom) != 3)
      return 1;
    if (mol.getAtomPi_0(atom) == 0 && mol.getConnAtoms_0(atom) != 4)
      return 1;
    rank = -2;
    for (i = 0; i < mol.getConnAtoms_0(atom); i++) {
      connAtom = mol.getConnAtom_0(atom, i);
      if (connAtom != rearAtom) {
        if (rank == -2)
          rank = mol.getSymmetryRank_0(connAtom);
        else if (rank != mol.getSymmetryRank_0(connAtom))
          return 1;
      }
    }
    return mol.getConnAtoms_0(atom) - 1;
  };
  _.findSmallerSideAtomList = function findSmallerSideAtomList(mol, disconnectedFragmentNo, disconnectedFragmentSize) {
    var alkyneAtoms, atom, backAtom, connAtom, fragmentNo, invert, isMember, j, memberCount, memberNo, spAtom;
    isMember = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 16, 1);
    memberCount = mol.getSubstituent_0(this.mRearAtom[0], this.mTorsionAtom[1], isMember, null, null);
    alkyneAtoms = 0;
    if (this.mRearAtom[0] != this.mTorsionAtom[2])
      alkyneAtoms = mol.getPathLength_0(this.mRearAtom[0], this.mTorsionAtom[2]);
    invert = false;
    if (memberCount > disconnectedFragmentSize - alkyneAtoms - memberCount) {
      memberCount = disconnectedFragmentSize - alkyneAtoms - memberCount;
      invert = true;
    }
    if (invert && alkyneAtoms != 0) {
      spAtom = this.mRearAtom[0];
      backAtom = this.mTorsionAtom[1];
      while (mol.getAtomPi_0(spAtom) == 2 && mol.getConnAtoms_0(spAtom) == 2 && mol.getAtomicNo_0(spAtom) < 10) {
        isMember[spAtom] = true;
        for (j = 0; j < 2; j++) {
          connAtom = mol.getConnAtom_0(spAtom, j);
          if (connAtom != backAtom) {
            backAtom = spAtom;
            spAtom = connAtom;
            break;
          }
        }
      }
    }
    memberNo = 0;
    fragmentNo = disconnectedFragmentNo[this.mTorsionAtom[1]];
    this.mSmallerSideAtomList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, memberCount, 15, 1);
    for (atom = 0; atom < mol.getAllAtoms_0(); atom++)
      if (disconnectedFragmentNo[atom] == fragmentNo && isMember[atom] ^ invert)
        this.mSmallerSideAtomList[memberNo++] = atom;
    this.mBondRelevance = (memberCount == 1 ? 1 : 2 * memberCount) / mol.getAtoms_0();
    this.mRotationCenter = this.mTorsionAtom[invert ? 2 : 1];
  };
  _.getBond_1 = function getBond_1() {
    return this.mBond;
  };
  _.getDefaultFrequencies = function getDefaultFrequencies() {
    return this.mDefaultFrequency;
  };
  _.getDefaultTorsionRanges = function getDefaultTorsionRanges() {
    return this.mDefaultTorsionRange;
  };
  _.getDefaultTorsions = function getDefaultTorsions() {
    return this.mDefaultTorsion;
  };
  _.getFragment_3 = function getFragment_4(i) {
    return i == 0 ? this.mFragment1 : this.mFragment2;
  };
  _.getFragmentNo = function getFragmentNo(i) {
    return i == 0 ? this.mFragmentNo1 : this.mFragmentNo2;
  };
  _.getRotationCenter = function getRotationCenter() {
    return this.mRotationCenter;
  };
  _.getSmallerSideAtoms = function getSmallerSideAtoms() {
    return this.mSmallerSideAtomList;
  };
  _.getTorsionAtoms = function getTorsionAtoms() {
    return this.mTorsionAtom;
  };
  _.getTorsionCount = function getTorsionCount() {
    return this.mDefaultTorsion.length;
  };
  _.predictAtomSequence = function predictAtomSequence(mol) {
    var centralAtom, connAtom, i, i0, j, rearAtom;
    for (i0 = 0; i0 < 2; i0++) {
      centralAtom = mol.getBondAtom_0(i0, this.mBond);
      rearAtom = mol.getBondAtom_0(1 - i0, this.mBond);
      while (mol.getAtomPi_0(centralAtom) == 2 && mol.getConnAtoms_0(centralAtom) == 2 && mol.getAtomicNo_0(centralAtom) < 10) {
        for (j = 0; j < 2; j++) {
          connAtom = mol.getConnAtom_0(centralAtom, j);
          if (connAtom != rearAtom) {
            rearAtom = centralAtom;
            centralAtom = connAtom;
            break;
          }
        }
      }
      this.mTorsionAtom[i0 + 1] = centralAtom;
      this.mRearAtom[i0] = rearAtom;
    }
    if (mol.getAtomPi_0(this.mTorsionAtom[1]) == 0 && mol.getConnAtoms_0(this.mTorsionAtom[1]) == 3) {
      this.mTorsionAtom[0] = -1;
    } else {
      for (i = 0; i < mol.getConnAtoms_0(this.mTorsionAtom[1]); i++) {
        connAtom = mol.getConnAtom_0(this.mTorsionAtom[1], i);
        if (connAtom != this.mTorsionAtom[2]) {
          this.mTorsionAtom[0] = connAtom;
          break;
        }
      }
    }
    if (mol.getAtomPi_0(this.mTorsionAtom[2]) == 0 && mol.getConnAtoms_0(this.mTorsionAtom[2]) == 3) {
      this.mTorsionAtom[3] = -1;
    } else {
      for (i = 0; i < mol.getConnAtoms_0(this.mTorsionAtom[2]); i++) {
        connAtom = mol.getConnAtom_0(this.mTorsionAtom[2], i);
        if (connAtom != this.mTorsionAtom[1]) {
          this.mTorsionAtom[3] = connAtom;
          break;
        }
      }
    }
  };
  _.removeEquivalentTorsions = function removeEquivalentTorsions(mol) {
    var SYMMETRY_COUNT, count, frequencySum, i, i0, maxAngle, newFrequency, newRange, newTorsion, symmetryCount1, symmetryCount2;
    SYMMETRY_COUNT = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 2), { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 0, [stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [1, 2, 3]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [2, 4, 12]), stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [3, 12, 6])]);
    symmetryCount1 = this.mFragment1.getConnectionPointCount() != 1 ? 1 : this.countSymmetricalTerminalNeighbors(mol, this.mTorsionAtom[1], this.mRearAtom[0]);
    symmetryCount2 = this.mFragment2.getConnectionPointCount() != 1 ? 1 : this.countSymmetricalTerminalNeighbors(mol, this.mTorsionAtom[2], this.mRearAtom[1]);
    if (symmetryCount1 == 1 && symmetryCount2 == 1)
      return;
    maxAngle = narrow_int(360 / $wnd.Math.max(symmetryCount1, symmetryCount2));
    count = 0;
    frequencySum = 0;
    for (i0 = 0; i0 < this.mDefaultTorsion.length && this.mDefaultTorsion[i0] < maxAngle; i0++) {
      frequencySum += this.mDefaultFrequency[i0];
      count++;
    }
    if (count == 0)
      return;
    newTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, count, 15, 1);
    newFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, count, 15, 1);
    newRange = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 7: 1, 40: 1 }, 13, count, 0, 2);
    for (i = 0; i < count; i++) {
      newTorsion[i] = this.mDefaultTorsion[i];
      newFrequency[i] = narrow_short(narrow_int(this.mDefaultFrequency[i] * 100 / frequencySum));
      newRange[i] = this.mDefaultTorsionRange[i];
    }
    this.mDefaultTorsion = newTorsion;
    this.mDefaultFrequency = newFrequency;
    this.mDefaultTorsionRange = newRange;
  };
  _.removeIllegalTorsions = function removeIllegalTorsions(mol) {
    var atom, conn, count, frequencySum, i, i0, i1, inverse, j, newFrequency, newRange, newTorsion, other, rear;
    if (mol.getBondOrder_0(this.mBond) == 1 && (mol.getBondParity_0(this.mBond) == 1 || mol.getBondParity_0(this.mBond) == 2)) {
      inverse = false;
      for (i0 = 0; i0 < 2; i0++) {
        conn = this.mTorsionAtom[3 * i0];
        atom = this.mTorsionAtom[1 + i0];
        rear = this.mTorsionAtom[2 - i0];
        for (j = 0; j < mol.getConnAtoms_0(atom); j++) {
          other = mol.getConnAtom_0(atom, j);
          if (other != rear && other != conn) {
            if (other < conn)
              inverse = !inverse;
            break;
          }
        }
      }
      if (mol.getBondParity_0(this.mBond) == 1)
        inverse = !inverse;
      count = 0;
      frequencySum = 0;
      for (i1 = 0; i1 < this.mDefaultTorsion.length; i1++) {
        if (this.mDefaultTorsion[i1] < 180 ^ inverse) {
          frequencySum += this.mDefaultFrequency[i1];
          count++;
        }
      }
      if (count < this.mDefaultTorsion.length) {
        newTorsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, count, 15, 1);
        newFrequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, count, 15, 1);
        newRange = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 7: 1, 40: 1 }, 13, count, 0, 2);
        count = 0;
        for (i = 0; i < this.mDefaultTorsion.length; i++) {
          if (this.mDefaultTorsion[i] < 180 ^ inverse) {
            newTorsion[count] = this.mDefaultTorsion[i];
            newFrequency[count] = narrow_short(narrow_int(this.mDefaultFrequency[i] * 100 / frequencySum));
            newRange[count] = this.mDefaultTorsionRange[i];
            count++;
          }
        }
        this.mDefaultTorsion = newTorsion;
        this.mDefaultFrequency = newFrequency;
        this.mDefaultTorsionRange = newRange;
      }
    }
  };
  _.mBond = 0;
  _.mBondAtomsInFragmentOrder = false;
  _.mBondRelevance = 0;
  _.mFragmentNo1 = 0;
  _.mFragmentNo2 = 0;
  _.mRotationCenter = 0;
  cggl.Lorg_openmolecules_chem_conf_gen_RotatableBond_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "RotatableBond", 156, cggl.Ljava_lang_Object_2_classLit);
  ooccg.$clinit_TorsionSet = function $clinit_TorsionSet() {
    ooccg.$clinit_TorsionSet = emptyMethod;
    jl.$clinit_Object();
  };
  ooccg.TorsionSet = function TorsionSet(ref) {
    ooccg.$clinit_TorsionSet();
    Object_0.call(this);
    this.$init_416();
    this.mTorsionIndex = ju.copyOf_9(ref.mTorsionIndex, ref.mTorsionIndex.length);
    this.mConformerIndex = ju.copyOf_9(ref.mConformerIndex, ref.mConformerIndex.length);
    this.mEncodedBits = ju.copyOf_10(ref.mEncodedBits, ref.mEncodedBits.length);
  };
  ooccg.TorsionSet_0 = function TorsionSet_0(torsionIndex, conformerIndex, encoder) {
    ooccg.$clinit_TorsionSet();
    Object_0.call(this);
    this.$init_416();
    this.mTorsionIndex = torsionIndex;
    this.mConformerIndex = conformerIndex;
    this.mEncodedBits = encoder.encode_0(torsionIndex, conformerIndex);
  };
  defineClass(71, 1, { 22: 1, 1: 1, 71: 1 }, ooccg.TorsionSet, ooccg.TorsionSet_0);
  _.$init_416 = function $init_416() {
  };
  _.compareTo_1 = function compareTo_45(ts) {
    return this.compareTo_23(castTo(ts, 71));
  };
  _.compareTo_23 = function compareTo_46(ts) {
    var i;
    for (i = 0; i < this.mEncodedBits.length; i++)
      if (neq(this.mEncodedBits[i], ts.mEncodedBits[i]))
        return lt(this.mEncodedBits[i], ts.mEncodedBits[i]) ? -1 : 1;
    return 0;
  };
  _.equals_0 = function equals_51(ts) {
    return this.compareTo_23(castTo(ts, 71)) == 0;
  };
  _.getCollisionStrainIfMatches = function getCollisionStrainIfMatches(er) {
    return this.matches(er.getMask(), er.getData()) ? this.mCollisionIntensitySum : 0;
  };
  _.getCollisionStrainMatrix = function getCollisionStrainMatrix() {
    return this.mCollisionIntensityMatrix;
  };
  _.getCollisionStrainSum = function getCollisionStrainSum() {
    return this.mCollisionIntensitySum;
  };
  _.getConformer = function getConformer() {
    return this.mConformer;
  };
  _.getConformerIndexes = function getConformerIndexes() {
    return this.mConformerIndex;
  };
  _.getContribution = function getContribution() {
    return this.mContribution;
  };
  _.getTorsionIndexes = function getTorsionIndexes_0() {
    return this.mTorsionIndex;
  };
  _.isUsed = function isUsed_0() {
    return this.mIsUsed;
  };
  _.matches = function matches(mask, data_0) {
    var i;
    for (i = 0; i < mask.length; i++)
      if (neq(and_0(this.mEncodedBits[i], mask[i]), and_0(data_0[i], mask[i])))
        return false;
    return true;
  };
  _.setCollisionStrain_0 = function setCollisionStrain_0(sum, matrix) {
    this.mCollisionIntensitySum = sum;
    this.mCollisionIntensityMatrix = matrix;
    if (isNotNull(this.mConformer))
      this.mConformer.setLikelihood(this.mContribution * $wnd.Math.pow(10, -sum / 1.36));
  };
  _.setConformer_0 = function setConformer_0(c) {
    this.mConformer = c;
    this.mConformer.setLikelihood(this.mContribution * $wnd.Math.pow(10, -this.mCollisionIntensitySum / 1.36));
  };
  _.setContribution = function setContribution(contribution) {
    this.mContribution = contribution;
  };
  _.setUsed = function setUsed() {
    this.mIsUsed = true;
  };
  _.toString_0 = function toString_70() {
    var i, i$array, i$array0, i$index, i$index0, i$max, i$max0, sb;
    sb = new jl.StringBuilder();
    for (i$array0 = this.mTorsionIndex, i$index0 = 0, i$max0 = i$array0.length; i$index0 < i$max0; ++i$index0) {
      i = i$array0[i$index0];
      sb.append_5(i);
      sb.append_4(44);
    }
    if (this.mTorsionIndex.length != 0)
      sb.setLength(sb.length_1() - 1);
    sb.append_4(59);
    for (i$array = this.mConformerIndex, i$index = 0, i$max = i$array.length; i$index < i$max; ++i$index) {
      i = i$array[i$index];
      sb.append_5(i);
      sb.append_4(44);
    }
    if (this.mConformerIndex.length != 0)
      sb.setLength(sb.length_1() - 1);
    return sb.toString_0();
  };
  _.mCollisionIntensitySum = 0;
  _.mContribution = 0;
  _.mIsUsed = false;
  cggl.Lorg_openmolecules_chem_conf_gen_TorsionSet_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "TorsionSet", 71, cggl.Ljava_lang_Object_2_classLit);
  ooccg.$clinit_TorsionSetEliminationRule = function $clinit_TorsionSetEliminationRule() {
    ooccg.$clinit_TorsionSetEliminationRule = emptyMethod;
    jl.$clinit_Object();
  };
  ooccg.TorsionSetEliminationRule = function TorsionSetEliminationRule(torsionIndex, rotatableBondIndex, collisionIntensity, encoder) {
    ooccg.$clinit_TorsionSetEliminationRule();
    Object_0.call(this);
    this.$init_417();
    this.mMask = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, encoder.getEncodingLongCount(), 14, 1);
    this.mData = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, encoder.getEncodingLongCount(), 14, 1);
    encoder.encodeRule(torsionIndex, rotatableBondIndex, this.mMask, this.mData);
    this.mCollisionIntensity = collisionIntensity;
  };
  defineClass(147, 1, { 1: 1, 147: 1 }, ooccg.TorsionSetEliminationRule);
  _.$init_417 = function $init_417() {
  };
  _.getCollisionIntensity = function getCollisionIntensity_0() {
    return this.mCollisionIntensity;
  };
  _.getData = function getData() {
    return this.mData;
  };
  _.getMask = function getMask() {
    return this.mMask;
  };
  _.isCovered = function isCovered_0(rule) {
    var i, isCovered;
    isCovered = true;
    for (i = 0; i < this.mMask.length; i++)
      if (neq(and_0(not_0(rule.mMask[i]), this.mMask[i]), 0) || neq(and_0(rule.mData[i], this.mMask[i]), this.mData[i]))
        isCovered = false;
    return isCovered;
  };
  _.isMoreGeneral = function isMoreGeneral_0(rule) {
    var i, isMoreGeneral;
    isMoreGeneral = true;
    for (i = 0; i < this.mMask.length; i++)
      if (neq(and_0(not_0(this.mMask[i]), rule.mMask[i]), 0) || neq(and_0(this.mData[i], rule.mMask[i]), rule.mData[i]))
        isMoreGeneral = false;
    return isMoreGeneral;
  };
  _.mCollisionIntensity = 0;
  cggl.Lorg_openmolecules_chem_conf_gen_TorsionSetEliminationRule_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "TorsionSetEliminationRule", 147, cggl.Ljava_lang_Object_2_classLit);
  ooccg.$clinit_TorsionSetEncoder = function $clinit_TorsionSetEncoder() {
    ooccg.$clinit_TorsionSetEncoder = emptyMethod;
    jl.$clinit_Object();
    ooccg.BITS_0 = stampJavaTypeInfo(getClassLiteralForArray(cggl.J_classLit, 1), { 4: 1, 1: 1, 49: 1 }, 5, 14, [0, 1, 3, 7, 15, 31, 63, 127]);
  };
  ooccg.TorsionSetEncoder = function TorsionSetEncoder(rigidFragment, rotatableBond) {
    ooccg.$clinit_TorsionSetEncoder();
    var bitCount, bits, index_0, longIndex, rb, rb$array, rb$index, rb$max, rf, rf$array, rf$index, rf$max;
    Object_0.call(this);
    this.$init_418();
    this.mRigidFragment = rigidFragment;
    this.mRotatableBond = rotatableBond;
    this.mEncodingBitCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, rotatableBond.length + rigidFragment.length, 15, 1);
    this.mEncodingBitShift = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, rotatableBond.length + rigidFragment.length, 15, 1);
    this.mEncodingLongIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, rotatableBond.length + rigidFragment.length, 15, 1);
    bitCount = 0;
    longIndex = 0;
    index_0 = 0;
    for (rb$array = rotatableBond, rb$index = 0, rb$max = rb$array.length; rb$index < rb$max; ++rb$index) {
      rb = rb$array[rb$index];
      bits = this.neededBits(rb.getTorsionCount());
      if (bitCount + bits <= 64) {
        this.mEncodingBitShift[index_0] = bitCount;
        bitCount += bits;
      } else {
        longIndex++;
        this.mEncodingBitShift[index_0] = 0;
        bitCount = 0;
      }
      this.mEncodingBitCount[index_0] = bits;
      this.mEncodingLongIndex[index_0] = longIndex;
      index_0++;
    }
    for (rf$array = rigidFragment, rf$index = 0, rf$max = rf$array.length; rf$index < rf$max; ++rf$index) {
      rf = rf$array[rf$index];
      bits = this.neededBits(rf.getConformerCount_0());
      if (bitCount + bits <= 64) {
        this.mEncodingBitShift[index_0] = bitCount;
        bitCount += bits;
      } else {
        longIndex++;
        this.mEncodingBitShift[index_0] = 0;
        bitCount = 0;
      }
      this.mEncodingBitCount[index_0] = bits;
      this.mEncodingLongIndex[index_0] = longIndex;
      index_0++;
    }
    this.mEncodingLongCount = longIndex + 1;
  };
  defineClass(473, 1, { 1: 1 }, ooccg.TorsionSetEncoder);
  _.$init_418 = function $init_418() {
  };
  _.createRuleString = function createRuleString(rule, baseConformer) {
    var data_0, i, i0, i1, sb, sl;
    sb = new jl.StringBuilder();
    data_0 = this.decodeRule(rule);
    sb.append_9(" rb:");
    sl = sb.length_1();
    for (i0 = 0; i0 < data_0.length; i0++) {
      if (data_0[i0] != -1) {
        if (sb.length_1() != sl)
          sb.append_4(44);
        sb.append_5(i0);
      }
    }
    sb.append_9(" ti:");
    sl = sb.length_1();
    for (i1 = 0; i1 < data_0.length; i1++) {
      if (data_0[i1] != -1) {
        if (sb.length_1() != sl)
          sb.append_4(44);
        sb.append_5(data_0[i1]);
      }
    }
    sb.append_9(" (");
    sl = sb.length_1();
    for (i = 0; i < data_0.length; i++) {
      if (data_0[i] != -1) {
        if (sb.length_1() != sl)
          sb.append_4(44);
        sb.append_5(baseConformer.getTorsion(i, data_0[i]));
      }
    }
    sb.append_9(") " + caru.toString_23(rule.getCollisionIntensity(), 3));
    return sb.toString_0();
  };
  _.decodeRule = function decodeRule(rule) {
    var data_0, mask, rb;
    data_0 = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRotatableBond.length, 15, 1);
    for (rb = 0; rb < this.mRotatableBond.length; rb++) {
      mask = shl_0(ooccg.BITS_0[this.mEncodingBitCount[rb]], this.mEncodingBitShift[rb]);
      if (neq(and_0(rule.getMask()[this.mEncodingLongIndex[rb]], mask), 0))
        data_0[rb] = toInt_0(shr_0(and_0(rule.getData()[this.mEncodingLongIndex[rb]], mask), this.mEncodingBitShift[rb]));
      else
        data_0[rb] = -1;
    }
    return data_0;
  };
  _.encode_0 = function encode_2(torsionIndex, conformerIndex) {
    var i, index_0, index$array, index$array0, index$index, index$index0, index$max, index$max0, mEncodedBits;
    mEncodedBits = initUnidimensionalArray(cggl.J_classLit, { 4: 1, 1: 1, 49: 1 }, 5, 1 + this.mEncodingLongIndex[this.mEncodingLongIndex.length - 1], 14, 1);
    i = 0;
    for (index$array0 = torsionIndex, index$index0 = 0, index$max0 = index$array0.length; index$index0 < index$max0; ++index$index0) {
      index_0 = index$array0[index$index0];
      mEncodedBits[this.mEncodingLongIndex[i]] = add_20(mEncodedBits[this.mEncodingLongIndex[i]], fromInt_0(index_0 << this.mEncodingBitShift[i]));
      i++;
    }
    for (index$array = conformerIndex, index$index = 0, index$max = index$array.length; index$index < index$max; ++index$index) {
      index_0 = index$array[index$index];
      mEncodedBits[this.mEncodingLongIndex[i]] = add_20(mEncodedBits[this.mEncodingLongIndex[i]], fromInt_0(index_0 << this.mEncodingBitShift[i]));
      i++;
    }
    return mEncodedBits;
  };
  _.encodeRule = function encodeRule(torsionIndex, rotatableBondIndex, mask, data_0) {
    var rb, rb$array, rb$index, rb$max;
    for (rb$array = rotatableBondIndex, rb$index = 0, rb$max = rb$array.length; rb$index < rb$max; ++rb$index) {
      rb = rb$array[rb$index];
      data_0[this.mEncodingLongIndex[rb]] = add_20(data_0[this.mEncodingLongIndex[rb]], fromInt_0(torsionIndex[rb] << this.mEncodingBitShift[rb]));
      mask[this.mEncodingLongIndex[rb]] = add_20(mask[this.mEncodingLongIndex[rb]], shl_0(ooccg.BITS_0[this.mEncodingBitCount[rb]], this.mEncodingBitShift[rb]));
    }
  };
  _.getEncodingLongCount = function getEncodingLongCount() {
    return this.mEncodingLongCount;
  };
  _.isMaskSet = function isMaskSet(rule, torsionAndConformerIndex) {
    return neq(and_0(rule.getMask()[this.mEncodingLongIndex[torsionAndConformerIndex]], shl_0(1, this.mEncodingBitShift[torsionAndConformerIndex])), 0);
  };
  _.neededBits = function neededBits(count) {
    var bits, maxIndex;
    bits = 0;
    maxIndex = count - 1;
    while (maxIndex > 0) {
      maxIndex >>= 1;
      bits++;
    }
    return bits;
  };
  _.mEncodingLongCount = 0;
  cggl.Lorg_openmolecules_chem_conf_gen_TorsionSetEncoder_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "TorsionSetEncoder", 473, cggl.Ljava_lang_Object_2_classLit);
  ooccg.$clinit_TorsionSetStrategy = function $clinit_TorsionSetStrategy() {
    ooccg.$clinit_TorsionSetStrategy = emptyMethod;
    jl.$clinit_Object();
  };
  ooccg.TorsionSetStrategy = function TorsionSetStrategy(conformerGenerator) {
    ooccg.$clinit_TorsionSetStrategy();
    var count, f1, f10, f2, i, i0, rb, rb$array, rb$array0, rb$array1, rb$index, rb$index0, rb$index1, rb$max, rb$max0, rb$max1, rf, rf$array, rf$index, rf$max;
    Object_0.call(this);
    this.$init_419();
    this.mConformerGenerator = conformerGenerator;
    this.mRotatableBond = conformerGenerator.getRotatableBonds();
    this.mRigidFragment = conformerGenerator.getRigidFragments();
    this.mTorsionSetEncoder = new ooccg.TorsionSetEncoder(this.mRigidFragment, this.mRotatableBond);
    this.mFragmentCount = 0;
    for (rb$array0 = this.mRotatableBond, rb$index0 = 0, rb$max0 = rb$array0.length; rb$index0 < rb$max0; ++rb$index0) {
      rb = rb$array0[rb$index0];
      this.mFragmentCount = $wnd.Math.max(this.mFragmentCount, $wnd.Math.max(1 + rb.getFragmentNo(0), 1 + rb.getFragmentNo(1)));
    }
    count = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mFragmentCount, 15, 1);
    for (rb$array1 = this.mRotatableBond, rb$index1 = 0, rb$max1 = rb$array1.length; rb$index1 < rb$max1; ++rb$index1) {
      rb = rb$array1[rb$index1];
      count[rb.getFragmentNo(0)]++;
      count[rb.getFragmentNo(1)]++;
    }
    this.mConnFragmentNo = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, count.length, 0, 2);
    this.mConnRotatableBondNo = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, count.length, 0, 2);
    for (i0 = 0; i0 < count.length; i0++) {
      this.mConnFragmentNo[i0] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, count[i0], 15, 1);
      this.mConnRotatableBondNo[i0] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, count[i0], 15, 1);
    }
    ju.fill_0(count, 0);
    for (i = 0; i < this.mRotatableBond.length; i++) {
      f10 = this.mRotatableBond[i].getFragmentNo(0);
      f2 = this.mRotatableBond[i].getFragmentNo(1);
      this.mConnFragmentNo[f10][count[f10]] = f2;
      this.mConnFragmentNo[f2][count[f2]] = f10;
      this.mConnRotatableBondNo[f10][count[f10]] = i;
      this.mConnRotatableBondNo[f2][count[f2]] = i;
      count[f10]++;
      count[f2]++;
    }
    this.mGraphFragment = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mFragmentCount, 15, 1);
    this.mGraphBond = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mFragmentCount, 15, 1);
    this.mGraphParent = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mFragmentCount, 15, 1);
    this.mGraphFragmentHandled = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, this.mFragmentCount, 16, 1);
    this.mBondsBetweenFragments = initUnidimensionalArray(cggl.I_classLit, { 4: 1, 1: 1, 7: 1 }, 25, this.mFragmentCount, 0, 3);
    for (f1 = 1; f1 < this.mFragmentCount; f1++) {
      this.mBondsBetweenFragments[f1] = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, f1, 0, 2);
      for (f2 = 0; f2 < f1; f2++)
        this.mBondsBetweenFragments[f1][f2] = this.getRotatableBondsBetween(f1, f2);
    }
    this.mPermutationCount = 1;
    for (rb$array = this.mRotatableBond, rb$index = 0, rb$max = rb$array.length; rb$index < rb$max; ++rb$index) {
      rb = rb$array[rb$index];
      this.mPermutationCount *= rb.getTorsionCount();
    }
    for (rf$array = this.mRigidFragment, rf$index = 0, rf$max = rf$array.length; rf$index < rf$max; ++rf$index) {
      rf = rf$array[rf$index];
      this.mPermutationCount *= rf.getConformerCount_0();
    }
    if (this.mPermutationCount <= 0)
      this.mPermutationCount = 2147483647;
    this.mTorsionSetList = new caru.UniqueList();
    this.mSecondChoiceList = new caru.SortedList_0(ju.comparingDouble(new ooccg.TorsionSetStrategy$lambda$0$Type()));
    this.mStrainedTorsionSetCache = new caru.SortedList();
    this.mCollisionCount = 0;
    this.mSuccessCount = 0;
    this.mLowestCollisionStrain = 3;
    this.mUsingSecondChoices = false;
    this.mMaxTotalCount = $wnd.Math.min(1e4, this.mPermutationCount);
  };
  ooccg.lambda$0_11 = function lambda$0_11(ts_0) {
    ooccg.$clinit_TorsionSetStrategy();
    return castTo(ts_0, 71).getCollisionStrainSum();
  };
  defineClass(258, 1, { 1: 1 });
  _.$init_419 = function $init_419() {
  };
  _.calculateCollisionTolerance = function calculateCollisionTolerance() {
    return this.mLowestCollisionStrain + 3;
  };
  _.calculateKnownCollisionStrainSum = function calculateKnownCollisionStrainSum(ts, elimRules) {
    var er, er$iterator, sum;
    sum = 0;
    for (er$iterator = elimRules.iterator(); er$iterator.hasNext_0(); ) {
      er = castTo(er$iterator.next_3(), 147);
      sum += ts.getCollisionStrainIfMatches(er);
    }
    return sum;
  };
  _.createTorsionSet_0 = function createTorsionSet(torsionIndex, conformerIndex) {
    var ts;
    ts = new ooccg.TorsionSet_0(torsionIndex, conformerIndex, this.mTorsionSetEncoder);
    ts.setContribution(this.getContribution_0(ts));
    return ts;
  };
  _.getBestCollidingTorsionIndexes = function getBestCollidingTorsionIndexes() {
    return this.mBestUnacceptableTorsionSet;
  };
  _.getBestSecondChoice = function getBestSecondChoice() {
    var index_0, ts;
    if (this.mSecondChoiceList.size_1() == 0)
      return null;
    index_0 = instanceOf(this, 76) ? castTo(this, 76).getRandom().nextInt_0(this.mSecondChoiceList.size_1()) : 0;
    ts = castTo(this.mSecondChoiceList.get_3(index_0), 71);
    this.mSecondChoiceList.remove_0(index_0);
    return ts;
  };
  _.getBondAndFragmentCollisionIntensities = function getBondAndFragmentCollisionIntensities(collidingTorsionSet) {
    var collisionIntensity, elimRules, er, er$iterator, i;
    collisionIntensity = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mRotatableBond.length + this.mRigidFragment.length, 15, 1);
    elimRules = this.mConformerGenerator.getBaseConformer(collidingTorsionSet.getConformerIndexes()).getEliminationRules();
    for (er$iterator = elimRules.iterator(); er$iterator.hasNext_0(); ) {
      er = castTo(er$iterator.next_3(), 147);
      if (collidingTorsionSet.getCollisionStrainIfMatches(er) != 0) {
        for (i = 0; i < collisionIntensity.length; i++)
          if (this.mTorsionSetEncoder.isMaskSet(er, i))
            collisionIntensity[i] += er.getCollisionIntensity();
      }
    }
    return collisionIntensity;
  };
  _.getBondsBetweenFragments = function getBondsBetweenFragments(f1, f2) {
    return this.mBondsBetweenFragments[f1][f2];
  };
  _.getContribution_0 = function getContribution_0(torsionSet) {
    var baseConformer, likelyhood, rb, rf;
    likelyhood = 1;
    for (rf = 0; rf < this.mRigidFragment.length; rf++)
      likelyhood *= this.mRigidFragment[rf].getConformerLikelihood(torsionSet.getConformerIndexes()[rf]);
    baseConformer = this.mConformerGenerator.getBaseConformer(torsionSet.getConformerIndexes());
    for (rb = 0; rb < this.mRotatableBond.length; rb++)
      likelyhood *= baseConformer.getTorsionLikelyhood(rb, torsionSet.getTorsionIndexes()[rb]);
    return likelyhood;
  };
  _.getNextTorsionSet = function getNextTorsionSet(previousTorsionSet, diagnostics) {
    var baseConformer, collisionStrain, elimRuleCount, eliminationRules, i, tolerance, ts;
    if (isNotNull(previousTorsionSet) && previousTorsionSet.isUsed())
      this.mSuccessCount++;
    if (isNotNull(previousTorsionSet) && this.mLowestCollisionStrain > previousTorsionSet.getCollisionStrainSum())
      this.mLowestCollisionStrain = previousTorsionSet.getCollisionStrainSum();
    if (this.mUsingSecondChoices)
      return this.getBestSecondChoice();
    if (this.mTorsionSetList.size_1() == this.mMaxTotalCount) {
      if (isNotNull(diagnostics))
        diagnostics.setExitReason("maxTotal(" + this.mMaxTotalCount + ") reached A; collisions:" + this.mCollisionCount);
      return null;
    }
    if (isNotNull(previousTorsionSet) && previousTorsionSet.getCollisionStrainSum() > 3) {
      baseConformer = isNotNull(diagnostics) ? this.mConformerGenerator.getBaseConformer(previousTorsionSet.getConformerIndexes()) : null;
      eliminationRules = isNotNull(diagnostics) ? baseConformer.getEliminationRules() : null;
      elimRuleCount = isNull(diagnostics) ? 0 : eliminationRules.size();
      this.processCollisions(previousTorsionSet);
      if (isNotNull(diagnostics))
        for (i = elimRuleCount; i < eliminationRules.size(); i++)
          diagnostics.get_6(previousTorsionSet).addEliminationRule(this.mTorsionSetEncoder.createRuleString(castTo(eliminationRules.getAtIndex(i), 147), baseConformer));
      if (!previousTorsionSet.isUsed()) {
        if (previousTorsionSet.getCollisionStrainSum() < 6)
          this.mSecondChoiceList.add_10(previousTorsionSet);
        else if (isNull(this.mBestUnacceptableTorsionSet) || this.mBestUnacceptableTorsionSet.getCollisionStrainSum() > previousTorsionSet.getCollisionStrainSum())
          this.mBestUnacceptableTorsionSet = previousTorsionSet;
      }
      this.mCollisionCount++;
    }
    tolerance = this.calculateCollisionTolerance();
    ts = this.getTorsionSet(tolerance, previousTorsionSet);
    while (isNotNull(ts)) {
      collisionStrain = this.calculateKnownCollisionStrainSum(ts, this.mConformerGenerator.getBaseConformer(ts.getConformerIndexes()).getEliminationRules());
      if (collisionStrain < tolerance)
        break;
      if (collisionStrain < 6)
        this.mStrainedTorsionSetCache.add_10(new ooccg.TorsionSetWithEliminationRuleStrain(ts, collisionStrain));
      this.mCollisionCount++;
      this.mTorsionSetList.add_10(ts);
      if (this.mTorsionSetList.size_1() == this.mMaxTotalCount) {
        if (isNotNull(diagnostics))
          diagnostics.setExitReason('maxTotal("+mMaxTotalCount+") reached B; collisions:' + this.mCollisionCount);
        return null;
      }
      tolerance = this.calculateCollisionTolerance();
      ts = this.getTorsionSet(tolerance, ts);
    }
    if (isNull(ts)) {
      if (this.mSecondChoiceList.size_1() != 0) {
        this.mUsingSecondChoices = true;
        while (this.mSecondChoiceList.size_1() != 0 && castTo(this.mSecondChoiceList.get_3(this.mSecondChoiceList.size_1() - 1), 71).getCollisionStrainSum() > this.mLowestCollisionStrain + 3)
          this.mSecondChoiceList.remove_0(this.mSecondChoiceList.size_1() - 1);
        ts = this.getBestSecondChoice();
      }
      if (isNull(ts) && isNotNull(diagnostics))
        diagnostics.setExitReason("Inner strategy stop criterion hit");
      return ts;
    }
    this.mTorsionSetList.add_10(ts);
    return ts;
  };
  _.getPermutationCount_0 = function getPermutationCount_0() {
    return this.mPermutationCount;
  };
  _.getRotatableBondsBetween = function getRotatableBondsBetween(f1, f2) {
    var bondCount, candidate, current, highest, i, index_0, rotatableBondIndex;
    ju.fill_4(this.mGraphFragmentHandled, false);
    this.mGraphFragment[0] = f1;
    this.mGraphFragmentHandled[f1] = true;
    current = 0;
    highest = 0;
    while (current <= highest) {
      for (i = 0; i < this.mConnFragmentNo[this.mGraphFragment[current]].length; i++) {
        candidate = this.mConnFragmentNo[this.mGraphFragment[current]][i];
        if (candidate == f2) {
          bondCount = 1;
          index_0 = current;
          while (index_0 != 0) {
            bondCount++;
            index_0 = this.mGraphParent[index_0];
          }
          rotatableBondIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, bondCount, 15, 1);
          rotatableBondIndex[0] = this.mConnRotatableBondNo[this.mGraphFragment[current]][i];
          bondCount = 1;
          while (current != 0) {
            rotatableBondIndex[bondCount++] = this.mGraphBond[current];
            current = this.mGraphParent[current];
          }
          return rotatableBondIndex;
        }
        if (!this.mGraphFragmentHandled[candidate]) {
          this.mGraphFragmentHandled[candidate] = true;
          highest++;
          this.mGraphFragment[highest] = candidate;
          this.mGraphBond[highest] = this.mConnRotatableBondNo[this.mGraphFragment[current]][i];
          this.mGraphParent[highest] = current;
        }
      }
      current++;
    }
    return null;
  };
  _.getTorsionSet = function getTorsionSet(tolerance, previousTorsionSet) {
    var tswers;
    if (this.mStrainedTorsionSetCache.size_1() != 0) {
      tswers = castTo(this.mStrainedTorsionSetCache.get_3(0), 191);
      if (tswers.getRuleStrain() < tolerance) {
        this.mStrainedTorsionSetCache.remove_0(0);
        return tswers.getTorsionSet_0();
      }
    }
    return this.createTorsionSet(previousTorsionSet);
  };
  _.getTorsionSetCount = function getTorsionSetCount() {
    return this.mTorsionSetList.size_1();
  };
  _.isNewTorsionSet = function isNewTorsionSet(ts) {
    return !this.mTorsionSetList.contains_3(ts);
  };
  _.processCollisions = function processCollisions(torsionSet) {
    var collisionIntensityMatrix, currentList, er, er$iterator, f1, f2, isCovered, obsoleteList, rotatableBondIndex, rule, torsionIndex;
    collisionIntensityMatrix = torsionSet.getCollisionStrainMatrix();
    torsionIndex = torsionSet.getTorsionIndexes();
    for (f1 = 1; f1 < collisionIntensityMatrix.length; f1++) {
      if (jsNotEquals(collisionIntensityMatrix[f1], null)) {
        for (f2 = 0; f2 < f1; f2++) {
          if (collisionIntensityMatrix[f1][f2] != 0) {
            rotatableBondIndex = this.mBondsBetweenFragments[f1][f2];
            rule = new ooccg.TorsionSetEliminationRule(torsionIndex, rotatableBondIndex, collisionIntensityMatrix[f1][f2], this.mTorsionSetEncoder);
            isCovered = false;
            obsoleteList = null;
            currentList = this.mConformerGenerator.getBaseConformer(torsionSet.getConformerIndexes()).getEliminationRules();
            for (er$iterator = currentList.iterator(); er$iterator.hasNext_0(); ) {
              er = castTo(er$iterator.next_3(), 147);
              if (er.isCovered(rule)) {
                isCovered = true;
                break;
              }
              if (er.isMoreGeneral(rule)) {
                if (isNull(obsoleteList))
                  obsoleteList = new ju.ArrayList();
                obsoleteList.add(er);
              }
            }
            if (!isCovered) {
              if (isNotNull(obsoleteList))
                currentList.removeAll(obsoleteList);
              currentList.add(rule);
            }
          }
        }
      }
    }
  };
  _.setMaxTotalCount = function setMaxTotalCount(maxTotalCount) {
    this.mMaxTotalCount = $wnd.Math.min(maxTotalCount, this.mPermutationCount);
  };
  _.mCollisionCount = 0;
  _.mFragmentCount = 0;
  _.mLowestCollisionStrain = 0;
  _.mMaxTotalCount = 0;
  _.mPermutationCount = 0;
  _.mSuccessCount = 0;
  _.mUsingSecondChoices = false;
  ooccg.COLLISION_STRAIN_FOR_FACTOR_10 = 1.36;
  ooccg.MAX_COLLISION_STRAIN = 6;
  ooccg.MAX_LOWEST_COLLISION_STRAIN = 3;
  ooccg.MAX_TOTAL_COUNT = 1e4;
  ooccg.SECOND_CHOICE_TOLERANCE = 3;
  cggl.Lorg_openmolecules_chem_conf_gen_TorsionSetStrategy_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "TorsionSetStrategy", 258, cggl.Ljava_lang_Object_2_classLit);
  ooccg.$clinit_TorsionSetStrategy$lambda$0$Type = function $clinit_TorsionSetStrategy$lambda$0$Type() {
    ooccg.$clinit_TorsionSetStrategy$lambda$0$Type = emptyMethod;
  };
  ooccg.TorsionSetStrategy$lambda$0$Type = function TorsionSetStrategy$lambda$0$Type() {
    ooccg.$clinit_TorsionSetStrategy$lambda$0$Type();
  };
  defineClass(427, 1, { 1: 1 }, ooccg.TorsionSetStrategy$lambda$0$Type);
  _.applyAsDouble = function applyAsDouble(arg0) {
    return ooccg.lambda$0_11(arg0);
  };
  cggl.Lorg_openmolecules_chem_conf_gen_TorsionSetStrategy$lambda$0$Type_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "TorsionSetStrategy/lambda$0$Type", 427, cggl.Ljava_lang_Object_2_classLit);
  ooccg.$clinit_TorsionSetStrategyRandom = function $clinit_TorsionSetStrategyRandom() {
    ooccg.$clinit_TorsionSetStrategyRandom = emptyMethod;
    ooccg.$clinit_TorsionSetStrategy();
  };
  ooccg.TorsionSetStrategyRandom = function TorsionSetStrategyRandom(conformerGenerator, preferLikelyTorsions, seed) {
    ooccg.$clinit_TorsionSetStrategyRandom();
    ooccg.TorsionSetStrategy.call(this, conformerGenerator);
    this.$init_420();
    this.mPreferLikelyTorsions = preferLikelyTorsions;
    this.mRandom = eq(seed, 0) ? new ju.Random() : new ju.Random_0(seed);
  };
  defineClass(76, 258, { 1: 1, 76: 1 }, ooccg.TorsionSetStrategyRandom);
  _.$init_420 = function $init_420() {
  };
  _.createTorsionSet = function createTorsionSet_0(previousTorsionSet) {
    var baseConformer, conformerIndex, count, j, j0, progress, rb, rf, torsionIndex, ts;
    if (this.getTorsionSetCount() == this.getPermutationCount_0())
      return null;
    torsionIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRotatableBond.length, 15, 1);
    conformerIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRigidFragment.length, 15, 1);
    count = 0;
    do {
      if (count++ == 64)
        return null;
      if (this.mPreferLikelyTorsions) {
        progress = count / 64;
        for (rf = 0; rf < this.mRigidFragment.length; rf++)
          conformerIndex[rf] = this.mRigidFragment[rf].getLikelyRandomConformerIndex(this.mRandom.nextDouble(), progress);
        baseConformer = this.mConformerGenerator.getBaseConformer(conformerIndex);
        for (rb = 0; rb < this.mRotatableBond.length; rb++)
          torsionIndex[rb] = baseConformer.getLikelyRandomTorsionIndex(rb, this.mRandom.nextDouble(), progress);
      } else {
        for (j0 = 0; j0 < this.mRigidFragment.length; j0++)
          conformerIndex[j0] = this.mRandom.nextInt_0(this.mRigidFragment[j0].getConformerCount_0());
        for (j = 0; j < this.mRotatableBond.length; j++)
          torsionIndex[j] = this.mRandom.nextInt_0(this.mRotatableBond[j].getTorsionCount());
      }
      ts = this.createTorsionSet_0(torsionIndex, conformerIndex);
    } while (!this.isNewTorsionSet(ts));
    return ts;
  };
  _.getRandom = function getRandom() {
    return this.mRandom;
  };
  _.mPreferLikelyTorsions = false;
  ooccg.MAX_TRIES_FOR_NEW = 64;
  cggl.Lorg_openmolecules_chem_conf_gen_TorsionSetStrategyRandom_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "TorsionSetStrategyRandom", 76, cggl.Lorg_openmolecules_chem_conf_gen_TorsionSetStrategy_2_classLit);
  ooccg.$clinit_TorsionSetStrategyAdaptiveRandom = function $clinit_TorsionSetStrategyAdaptiveRandom() {
    ooccg.$clinit_TorsionSetStrategyAdaptiveRandom = emptyMethod;
    ooccg.$clinit_TorsionSetStrategyRandom();
  };
  ooccg.TorsionSetStrategyAdaptiveRandom = function TorsionSetStrategyAdaptiveRandom(conformerGenerator, preferLikelyTorsions, startWithMostProbable, seed) {
    ooccg.$clinit_TorsionSetStrategyAdaptiveRandom();
    ooccg.TorsionSetStrategyRandom.call(this, conformerGenerator, preferLikelyTorsions, seed);
    this.$init_421();
    this.mStartWithMostProbable = startWithMostProbable;
  };
  defineClass(236, 76, { 1: 1, 76: 1 }, ooccg.TorsionSetStrategyAdaptiveRandom);
  _.$init_421 = function $init_421() {
  };
  _.createTorsionSet = function createTorsionSet_1(previousTorsionSet) {
    var collidingConformerIndex, collidingTorsionIndex, collisionIntensitySum, conformerIndex, count, i, i0, index_0, indexTried, j, random, rigidFragment, rigidFragment$array, rigidFragment$index, rigidFragment$max, torsionIndex, ts;
    if (isNull(previousTorsionSet)) {
      if (this.mStartWithMostProbable)
        return this.createTorsionSet_0(initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRotatableBond.length, 15, 1), initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRigidFragment.length, 15, 1));
      else
        return getClassPrototype(76).createTorsionSet.call(this, null);
    }
    if (previousTorsionSet.getCollisionStrainSum() == 0)
      return getClassPrototype(76).createTorsionSet.call(this, previousTorsionSet);
    collisionIntensitySum = this.getBondAndFragmentCollisionIntensities(previousTorsionSet);
    collidingTorsionIndex = previousTorsionSet.getTorsionIndexes();
    collidingConformerIndex = previousTorsionSet.getConformerIndexes();
    indexTried = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, collisionIntensitySum.length, 16, 1);
    for (count = 0; count < 64; count++) {
      if (indexTried[0] || this.mRotatableBond[0].getTorsionCount() == 1)
        collisionIntensitySum[0] = 0;
      index_0 = 1;
      for (i0 = 1; i0 < this.mRotatableBond.length; i0++) {
        if (indexTried[index_0] || this.mRotatableBond[i0].getTorsionCount() == 1)
          collisionIntensitySum[index_0] = collisionIntensitySum[index_0 - 1];
        else
          collisionIntensitySum[index_0] += collisionIntensitySum[index_0 - 1];
        index_0++;
      }
      for (rigidFragment$array = this.mRigidFragment, rigidFragment$index = 0, rigidFragment$max = rigidFragment$array.length; rigidFragment$index < rigidFragment$max; ++rigidFragment$index) {
        rigidFragment = rigidFragment$array[rigidFragment$index];
        if (indexTried[index_0] || rigidFragment.getConformerCount_0() == 1)
          collisionIntensitySum[index_0] = collisionIntensitySum[index_0 - 1];
        else
          collisionIntensitySum[index_0] += collisionIntensitySum[index_0 - 1];
        index_0++;
      }
      if (collisionIntensitySum[collisionIntensitySum.length - 1] == 0)
        return getClassPrototype(76).createTorsionSet.call(this, previousTorsionSet);
      random = this.getRandom().nextDouble() * collisionIntensitySum[collisionIntensitySum.length - 1];
      for (i = 0; i < collisionIntensitySum.length; i++) {
        if (random < collisionIntensitySum[i]) {
          torsionIndex = ju.copyOf_9(collidingTorsionIndex, collidingTorsionIndex.length);
          conformerIndex = ju.copyOf_9(collidingConformerIndex, collidingConformerIndex.length);
          if (i < this.mRotatableBond.length) {
            for (j = 1; j < this.mRotatableBond[i].getTorsionCount(); j++) {
              torsionIndex[i]++;
              if (torsionIndex[i] == this.mRotatableBond[i].getTorsionCount())
                torsionIndex[i] = 0;
              ts = this.createTorsionSet_0(torsionIndex, conformerIndex);
              if (this.isNewTorsionSet(ts))
                return ts;
            }
          } else {
            i -= this.mRotatableBond.length;
            for (j = 1; j < this.mRigidFragment[i].getConformerCount_0(); j++) {
              conformerIndex[i]++;
              if (conformerIndex[i] == this.mRigidFragment[i].getConformerCount_0())
                conformerIndex[i] = 0;
              ts = this.createTorsionSet_0(torsionIndex, conformerIndex);
              if (this.isNewTorsionSet(ts))
                return ts;
            }
          }
          indexTried[i] = true;
          break;
        }
      }
    }
    return getClassPrototype(76).createTorsionSet.call(this, previousTorsionSet);
  };
  _.mStartWithMostProbable = false;
  ooccg.MAX_TRIES_FOR_NEW_0 = 64;
  cggl.Lorg_openmolecules_chem_conf_gen_TorsionSetStrategyAdaptiveRandom_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "TorsionSetStrategyAdaptiveRandom", 236, cggl.Lorg_openmolecules_chem_conf_gen_TorsionSetStrategyRandom_2_classLit);
  ooccg.$clinit_TorsionSetStrategyLikelySystematic = function $clinit_TorsionSetStrategyLikelySystematic() {
    ooccg.$clinit_TorsionSetStrategyLikelySystematic = emptyMethod;
    ooccg.$clinit_TorsionSetStrategy();
  };
  ooccg.TorsionSetStrategyLikelySystematic = function TorsionSetStrategyLikelySystematic(conformerGenerator) {
    ooccg.$clinit_TorsionSetStrategyLikelySystematic();
    ooccg.TorsionSetStrategy.call(this, conformerGenerator);
    this.$init_422();
    this.mCurrentMaxTorsionIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRotatableBond.length, 15, 1);
    this.mCurrentMaxConformerIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRigidFragment.length, 15, 1);
    this.mAvailableTorsionSet = initUnidimensionalArray(cggl.Lorg_openmolecules_chem_conf_gen_TorsionSet_2_classLit, { 4: 1, 1: 1, 7: 1 }, 71, 1, 0, 1);
    setCheck(this.mAvailableTorsionSet, 0, this.createTorsionSet_0(initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRotatableBond.length, 15, 1), initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mRigidFragment.length, 15, 1)));
    this.mAvailableTorsionSetIndex = -1;
  };
  ooccg.lambda$0_12 = function lambda$0_12(ts1_0, ts2_1) {
    ooccg.$clinit_TorsionSetStrategyLikelySystematic();
    {
      return compare_23(ts2_1.getContribution(), ts1_0.getContribution());
    }
  };
  defineClass(315, 258, { 1: 1 }, ooccg.TorsionSetStrategyLikelySystematic);
  _.$init_422 = function $init_422() {
  };
  _.createNextAvailableSet = function createNextAvailableSet() {
    var baseConformer, bestIndex, conformerCount, conformerIndex, count, i, i0, i1, isConformerIndex, j, j0, loss, minLoss, n, rb, rf, torsionCount, torsionIndex;
    bestIndex = -1;
    isConformerIndex = false;
    minLoss = 17976931348623157e292;
    baseConformer = this.mConformerGenerator.getBaseConformer(this.mCurrentMaxConformerIndex);
    for (rb = 0; rb < this.mCurrentMaxTorsionIndex.length; rb++) {
      if (this.mCurrentMaxTorsionIndex[rb] < this.mRotatableBond[rb].getTorsionCount() - 1) {
        loss = baseConformer.getTorsionLikelyhood(rb, this.mCurrentMaxTorsionIndex[rb]) / baseConformer.getTorsionLikelyhood(rb, this.mCurrentMaxTorsionIndex[rb] + 1);
        if (minLoss > loss) {
          minLoss = loss;
          bestIndex = rb;
        }
      }
    }
    for (rf = 0; rf < this.mCurrentMaxConformerIndex.length; rf++) {
      if (this.mCurrentMaxConformerIndex[rf] < this.mRigidFragment[rf].getConformerCount_0() - 1) {
        loss = this.mRigidFragment[rf].getConformerLikelihood(this.mCurrentMaxConformerIndex[rf]) / this.mRigidFragment[rf].getConformerLikelihood(this.mCurrentMaxConformerIndex[rf] + 1);
        if (minLoss > loss) {
          minLoss = loss;
          bestIndex = rf;
          isConformerIndex = true;
        }
      }
    }
    if (bestIndex == -1) {
      this.mAvailableTorsionSet = null;
      return;
    }
    count = 1;
    for (i0 = 0; i0 < this.mCurrentMaxTorsionIndex.length; i0++)
      if (isConformerIndex || i0 != bestIndex)
        count *= this.mCurrentMaxTorsionIndex[i0] + 1;
    for (i1 = 0; i1 < this.mCurrentMaxConformerIndex.length; i1++)
      if (!isConformerIndex || i1 != bestIndex)
        count *= this.mCurrentMaxConformerIndex[i1] + 1;
    this.mAvailableTorsionSet = initUnidimensionalArray(cggl.Lorg_openmolecules_chem_conf_gen_TorsionSet_2_classLit, { 4: 1, 1: 1, 7: 1 }, 71, count, 0, 1);
    if (isConformerIndex)
      this.mCurrentMaxConformerIndex[bestIndex]++;
    else
      this.mCurrentMaxTorsionIndex[bestIndex]++;
    for (i = 0; i < count; i++) {
      n = i;
      torsionIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mCurrentMaxTorsionIndex.length, 15, 1);
      for (j0 = 0; j0 < this.mCurrentMaxTorsionIndex.length; j0++) {
        if (isConformerIndex || j0 != bestIndex) {
          torsionCount = this.mCurrentMaxTorsionIndex[j0] + 1;
          if (torsionCount != 1) {
            torsionIndex[j0] = n % torsionCount;
            n = narrow_int(n / torsionCount);
          }
        }
      }
      conformerIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, this.mCurrentMaxConformerIndex.length, 15, 1);
      for (j = 0; j < this.mCurrentMaxConformerIndex.length; j++) {
        if (!isConformerIndex || j != bestIndex) {
          conformerCount = this.mCurrentMaxConformerIndex[j] + 1;
          if (conformerCount != 1) {
            conformerIndex[j] = n % conformerCount;
            n = narrow_int(n / conformerCount);
          }
        }
      }
      if (isConformerIndex)
        conformerIndex[bestIndex] = this.mCurrentMaxConformerIndex[bestIndex];
      else
        torsionIndex[bestIndex] = this.mCurrentMaxTorsionIndex[bestIndex];
      setCheck(this.mAvailableTorsionSet, i, this.createTorsionSet_0(torsionIndex, conformerIndex));
    }
    ju.sort_7(this.mAvailableTorsionSet, new ooccg.TorsionSetStrategyLikelySystematic$lambda$0$Type());
    this.mAvailableTorsionSetIndex = -1;
  };
  _.createTorsionSet = function createTorsionSet_2(previousTorsionSet) {
    if (jsEquals(this.mAvailableTorsionSet, null))
      return null;
    if (this.mAvailableTorsionSetIndex + 1 == this.mAvailableTorsionSet.length)
      this.createNextAvailableSet();
    if (jsEquals(this.mAvailableTorsionSet, null))
      return null;
    this.mAvailableTorsionSetIndex++;
    return this.mAvailableTorsionSet[this.mAvailableTorsionSetIndex];
  };
  _.mAvailableTorsionSetIndex = 0;
  cggl.Lorg_openmolecules_chem_conf_gen_TorsionSetStrategyLikelySystematic_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "TorsionSetStrategyLikelySystematic", 315, cggl.Lorg_openmolecules_chem_conf_gen_TorsionSetStrategy_2_classLit);
  ooccg.$clinit_TorsionSetStrategyLikelySystematic$lambda$0$Type = function $clinit_TorsionSetStrategyLikelySystematic$lambda$0$Type() {
    ooccg.$clinit_TorsionSetStrategyLikelySystematic$lambda$0$Type = emptyMethod;
  };
  ooccg.TorsionSetStrategyLikelySystematic$lambda$0$Type = function TorsionSetStrategyLikelySystematic$lambda$0$Type() {
    ooccg.$clinit_TorsionSetStrategyLikelySystematic$lambda$0$Type();
  };
  defineClass(436, 1, { 1: 1, 36: 1 }, ooccg.TorsionSetStrategyLikelySystematic$lambda$0$Type);
  _.compare_0 = function compare_39(arg0, arg1) {
    return ooccg.lambda$0_12(castTo(arg0, 71), castTo(arg1, 71));
  };
  _.equals_0 = function equals_52(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  cggl.Lorg_openmolecules_chem_conf_gen_TorsionSetStrategyLikelySystematic$lambda$0$Type_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "TorsionSetStrategyLikelySystematic/lambda$0$Type", 436, cggl.Ljava_lang_Object_2_classLit);
  ooccg.$clinit_TorsionSetWithEliminationRuleStrain = function $clinit_TorsionSetWithEliminationRuleStrain() {
    ooccg.$clinit_TorsionSetWithEliminationRuleStrain = emptyMethod;
    jl.$clinit_Object();
  };
  ooccg.TorsionSetWithEliminationRuleStrain = function TorsionSetWithEliminationRuleStrain(torsionSet, ruleStrain) {
    ooccg.$clinit_TorsionSetWithEliminationRuleStrain();
    Object_0.call(this);
    this.$init_423();
    this.mTorsionSet = torsionSet;
    this.mRuleStrain = ruleStrain;
  };
  defineClass(191, 1, { 22: 1, 1: 1, 191: 1 }, ooccg.TorsionSetWithEliminationRuleStrain);
  _.$init_423 = function $init_423() {
  };
  _.compareTo_1 = function compareTo_47(ts) {
    return this.compareTo_24(castTo(ts, 191));
  };
  _.compareTo_24 = function compareTo_48(ts) {
    return this.mRuleStrain < ts.mRuleStrain ? -1 : this.mRuleStrain > ts.mRuleStrain ? 1 : 0;
  };
  _.getRuleStrain = function getRuleStrain() {
    return this.mRuleStrain;
  };
  _.getTorsionSet_0 = function getTorsionSet_0() {
    return this.mTorsionSet;
  };
  _.mRuleStrain = 0;
  cggl.Lorg_openmolecules_chem_conf_gen_TorsionSetWithEliminationRuleStrain_2_classLit = createForClass("org.openmolecules.chem.conf.gen", "TorsionSetWithEliminationRuleStrain", 191, cggl.Ljava_lang_Object_2_classLit);
  ooccs.$clinit_ConformationRule = function $clinit_ConformationRule() {
    ooccs.$clinit_ConformationRule = emptyMethod;
    jl.$clinit_Object();
    ooccs.RULE_NAME = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["distance", "plane", "line", "torsion", "stereo", "binap"]);
  };
  ooccs.ConformationRule = function ConformationRule(atom) {
    ooccs.$clinit_ConformationRule();
    Object_0.call(this);
    this.$init_424();
    this.mAtom = atom;
    this.mIsEnabled = true;
  };
  ooccs.calculateNearestPlane = function calculateNearestPlane(conformer, atom, cog, n, coords) {
    ooccs.$clinit_ConformationRule();
    var S, U, i, i0, i1, i2, j, k, minIndex, squareMatrix, svd;
    for (i0 = 0; i0 < atom.length; i0++)
      cog.add_3(conformer.getCoordinates(atom[i0]));
    cog.scale_1(1 / atom.length);
    for (i1 = 0; i1 < atom.length; i1++) {
      coords[i1][0] = conformer.getX_0(atom[i1]) - cog.x_0;
      coords[i1][1] = conformer.getY_0(atom[i1]) - cog.y_0;
      coords[i1][2] = conformer.getZ(atom[i1]) - cog.z_0;
    }
    squareMatrix = initMultidimensionalArray(cggl.D_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 11: 1, 4: 1, 1: 1 }], [11, 5], 15, [3, 3], 2);
    for (i2 = 0; i2 < atom.length; i2++)
      for (j = 0; j < 3; j++)
        for (k = 0; k < 3; k++)
          squareMatrix[j][k] += coords[i2][j] * coords[i2][k];
    svd = new carc.SingularValueDecomposition(squareMatrix, null, null);
    S = svd.getSingularValues();
    minIndex = 0;
    for (i = 1; i < 3; i++)
      if (S[i] < S[minIndex])
        minIndex = i;
    U = svd.getU();
    n.x_0 = U[0][minIndex];
    n.y_0 = U[1][minIndex];
    n.z_0 = U[2][minIndex];
  };
  ooccs.rotateAtom = function rotateAtom(conformer, atom, p, unit, theta) {
    ooccs.$clinit_ConformationRule();
    var c, mx, my, mz, s, t, x_0, y_0, z_0;
    x_0 = unit.x_0;
    y_0 = unit.y_0;
    z_0 = unit.z_0;
    c = $wnd.Math.cos(theta);
    s = $wnd.Math.sin(theta);
    t = 1 - c;
    mx = conformer.getX_0(atom) - p.x_0;
    my = conformer.getY_0(atom) - p.y_0;
    mz = conformer.getZ(atom) - p.z_0;
    conformer.setX_0(atom, p.x_0 + (t * x_0 * x_0 + c) * mx + (t * x_0 * y_0 + s * z_0) * my + (t * x_0 * z_0 - s * y_0) * mz);
    conformer.setY_0(atom, p.y_0 + (t * x_0 * y_0 - s * z_0) * mx + (t * y_0 * y_0 + c) * my + (t * y_0 * z_0 + s * x_0) * mz);
    conformer.setZ(atom, p.z_0 + (t * x_0 * z_0 + s * y_0) * mx + (t * z_0 * y_0 - s * x_0) * my + (t * z_0 * z_0 + c) * mz);
  };
  ooccs.rotateGroup = function rotateGroup(conformer, atom, notList, p, n, theta) {
    ooccs.$clinit_ConformationRule();
    var avoidAtom, candidate, current, graphAtom, highest, i, mol, notAtom, notAtom$array, notAtom$index, notAtom$max;
    mol = conformer.getMolecule_0();
    avoidAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 16, 1);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 15, 1);
    graphAtom[0] = atom;
    avoidAtom[atom] = true;
    for (notAtom$array = notList, notAtom$index = 0, notAtom$max = notAtom$array.length; notAtom$index < notAtom$max; ++notAtom$index) {
      notAtom = notAtom$array[notAtom$index];
      avoidAtom[notAtom] = true;
    }
    ooccs.rotateAtom(conformer, atom, p, n, theta);
    current = 0;
    highest = 0;
    while (current <= highest) {
      for (i = 0; i < mol.getAllConnAtoms_0(graphAtom[current]); i++) {
        candidate = mol.getConnAtom_0(graphAtom[current], i);
        if (!avoidAtom[candidate]) {
          avoidAtom[candidate] = true;
          graphAtom[++highest] = candidate;
          ooccs.rotateAtom(conformer, candidate, p, n, theta);
        }
      }
      current++;
    }
  };
  defineClass(39, 1, { 1: 1, 39: 1 });
  _.$init_424 = function $init_424() {
  };
  _.addAtomList = function addAtomList(sb) {
    var i;
    if (jsEquals(this.mAtom, null)) {
      sb.append_9(" atoms:<null>");
    } else {
      sb.append_9(" atoms:" + this.mAtom[0]);
      for (i = 1; i < this.mAtom.length; i++)
        sb.append_9("," + this.mAtom[i]);
    }
  };
  _.getAtomList_1 = function getAtomList_1() {
    return this.mAtom;
  };
  _.isEnabled = function isEnabled() {
    return this.mIsEnabled;
  };
  _.moveGroup = function moveGroup(conformer, atom, notList, dx, dy, dz) {
    var connAtom, found, i, j, mol;
    conformer.getCoordinates(atom).add_2(dx, dy, dz);
    mol = conformer.getMolecule_0();
    for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
      connAtom = mol.getConnAtom_0(atom, i);
      found = false;
      if (jsNotEquals(notList, null)) {
        for (j = 0; j < notList.length; j++) {
          if (connAtom == notList[j]) {
            found = true;
            break;
          }
        }
      }
      if (!found) {
        if (mol.getAllConnAtoms_0(connAtom) == 1) {
          conformer.getCoordinates(connAtom).add_2(dx, dy, dz);
        } else if (mol.isRingBond_0(mol.getConnBond_0(atom, i))) {
          conformer.getCoordinates(connAtom).add_2(dx / 3, dy / 3, dz / 3);
        } else {
          this.moveSubstituent(conformer, atom, connAtom, dx, dy, dz);
        }
      }
    }
  };
  _.moveSubstituent = function moveSubstituent(conformer, rootAtom, firstAtom, dx, dy, dz) {
    var candidate, current, graphAtom, highest, i, isMemberAtom, mol;
    conformer.getCoordinates(firstAtom).add_2(dx, dy, dz);
    mol = conformer.getMolecule_0();
    isMemberAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 16, 1);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 15, 1);
    graphAtom[0] = firstAtom;
    isMemberAtom[rootAtom] = true;
    isMemberAtom[firstAtom] = true;
    current = 0;
    highest = 0;
    while (current <= highest) {
      for (i = 0; i < mol.getAllConnAtoms_0(graphAtom[current]); i++) {
        candidate = mol.getConnAtom_0(graphAtom[current], i);
        if (!isMemberAtom[candidate]) {
          isMemberAtom[candidate] = true;
          graphAtom[++highest] = candidate;
          conformer.getCoordinates(candidate).add_2(dx, dy, dz);
        }
      }
      current++;
    }
  };
  _.setEnabled_0 = function setEnabled_0(b) {
    this.mIsEnabled = b;
  };
  _.mIsEnabled = false;
  ooccs.RULE_TYPE_BINAP = 5;
  ooccs.RULE_TYPE_DISTANCE = 0;
  ooccs.RULE_TYPE_LINE = 2;
  ooccs.RULE_TYPE_PLANE = 1;
  ooccs.RULE_TYPE_STEREO = 4;
  ooccs.RULE_TYPE_TORSION = 3;
  cggl.Lorg_openmolecules_chem_conf_so_ConformationRule_2_classLit = createForClass("org.openmolecules.chem.conf.so", "ConformationRule", 39, cggl.Ljava_lang_Object_2_classLit);
  ooccs.$clinit_AxialStereoRule = function $clinit_AxialStereoRule() {
    ooccs.$clinit_AxialStereoRule = emptyMethod;
    ooccs.$clinit_ConformationRule();
  };
  ooccs.AxialStereoRule = function AxialStereoRule(mol, atom, rearArom, isInRing, positiveTorsionWanted) {
    ooccs.ConformationRule.call(this, atom);
    this.$init_425();
    this.mRotatableAtom = this.getRotatableAtoms(mol, isInRing, atom, rearArom);
    this.mPositiveTorsionWanted = positiveTorsionWanted;
  };
  ooccs.calculateRules = function calculateRules(ruleList, mol) {
    ooccs.$clinit_AxialStereoRule();
    var atom, atomList, bond, centralAtom, connAtom, i, j, lowConn, parity, rear, rearAtom;
    for (centralAtom = 0; centralAtom < mol.getAtoms_0(); centralAtom++) {
      if (mol.isCentralAlleneAtom(centralAtom)) {
        parity = mol.getAtomParity_0(centralAtom);
        if (parity == 1 || parity == 2) {
          atomList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
          rearAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
          for (i = 0; i < mol.getConnAtoms_0(centralAtom); i++) {
            atom = mol.getConnAtom_0(centralAtom, i);
            lowConn = 2147483647;
            for (j = 0; j < mol.getConnAtoms_0(atom); j++) {
              connAtom = mol.getConnAtom_0(atom, j);
              if (connAtom != centralAtom && lowConn > connAtom)
                lowConn = connAtom;
            }
            atomList[3 * i] = lowConn;
            atomList[1 + i] = atom;
            rearAtom[i] = centralAtom;
          }
          if (atomList[0] == 2147483647 || atomList[3] == 2147483647) {
            (jl.$clinit_System(), jl.out_0).println_0("Unexpected MAX_VALUE idcode:" + new carc2.Canonizer(mol).getIDCode_0());
            break;
          }
          ruleList.add(new ooccs.AxialStereoRule(mol, atomList, rearAtom, mol.isRingAtom_0(centralAtom), parity == 1));
        }
      }
    }
    for (bond = 0; bond < mol.getBonds_0(); bond++) {
      parity = mol.getBondParity_0(bond);
      if ((parity == 1 || parity == 2) && mol.getBondOrder_0(bond) != 2) {
        atomList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
        rearAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
        for (i = 0; i < 2; i++) {
          atom = mol.getBondAtom_0(i, bond);
          rear = mol.getBondAtom_0(1 - i, bond);
          lowConn = 2147483647;
          for (j = 0; j < mol.getConnAtoms_0(atom); j++) {
            connAtom = mol.getConnAtom_0(atom, j);
            if (connAtom != rear && lowConn > connAtom)
              lowConn = connAtom;
          }
          atomList[3 * i] = lowConn;
          atomList[1 + i] = atom;
          rearAtom[i] = mol.getBondAtom_0(1 - i, bond);
        }
        ruleList.add(new ooccs.AxialStereoRule(mol, atomList, rearAtom, mol.isRingBond_0(bond), parity == 2));
      }
    }
  };
  defineClass(267, 39, { 1: 1, 39: 1 }, ooccs.AxialStereoRule);
  _.$init_425 = function $init_425() {
  };
  _.addStrain = function addStrain(conformer, atomStrain) {
    var atom, atom$array, atom$index, atom$max, strain;
    strain = conformer.calculateTorsion_0(this.mAtom) < 0 ? 1 : 0;
    if (jsNotEquals(atomStrain, null))
      for (atom$array = this.mAtom, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
        atom = atom$array[atom$index];
        atomStrain[atom] += strain / 4;
      }
    return strain;
  };
  _.apply_4 = function apply_21(conformer, cycleFactor) {
    var atom, atom$array, atom$index, atom$max, rotation, torsion, unit;
    torsion = conformer.calculateTorsion_0(this.mAtom);
    if (torsion == 0 || this.mPositiveTorsionWanted == torsion > 0)
      return false;
    unit = conformer.getCoordinates(this.mAtom[2]).subC(conformer.getCoordinates(this.mAtom[1]));
    unit.unit();
    rotation = $wnd.Math.abs(torsion) < 3.141592653589793 / 2 ? -2 * torsion : 2 * (3.141592653589793 - torsion);
    if (this.mInverse)
      rotation = -rotation;
    for (atom$array = this.mRotatableAtom, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
      atom = atom$array[atom$index];
      ooccs.rotateAtom(conformer, atom, conformer.getCoordinates(this.mAtom[1]), unit, rotation);
    }
    return true;
  };
  _.getAromaticFragmentAtoms = function getAromaticFragmentAtoms(mol, firstAtom, rearAtom) {
    var aromAtom, atom, candidate, current, highest, i, i0, i1, isMember, j;
    aromAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 15, 1);
    isMember = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 16, 1);
    isMember[rearAtom] = true;
    isMember[firstAtom] = true;
    aromAtom[0] = firstAtom;
    current = 0;
    highest = 1;
    while (current <= highest) {
      for (i0 = 0; i0 < mol.getConnAtoms_0(aromAtom[current]); i0++) {
        if (mol.isAromaticBond_0(mol.getConnBond_0(aromAtom[current], i0))) {
          candidate = mol.getConnAtom_0(aromAtom[current], i0);
          if (!isMember[candidate]) {
            aromAtom[++highest] = candidate;
            isMember[candidate] = true;
          }
        }
      }
      current++;
    }
    for (i1 = 0; i1 <= highest; i1++) {
      for (j = 0; j < mol.getConnAtoms_0(aromAtom[i1]); j++) {
        candidate = mol.getConnAtom_0(aromAtom[i1], j);
        if (!isMember[candidate] && !mol.isRingBond_0(mol.getConnBond_0(aromAtom[i1], j)))
          mol.getSubstituent_0(aromAtom[i1], candidate, isMember, null, null);
      }
    }
    isMember[rearAtom] = false;
    for (i = 0; i <= highest; i++)
      isMember[aromAtom[i]] = false;
    for (atom = 0; atom < isMember.length; atom++)
      if (isMember[atom])
        aromAtom[++highest] = atom;
    return ju.copyOf_9(aromAtom, highest + 1);
  };
  _.getRotatableAtoms = function getRotatableAtoms(mol, isInRing, atomList, rearAtom) {
    var atom, count, i, index_0, isMemberAtom, rotatableAtom, smallerSubstituentIndex;
    if (isInRing)
      return this.getAromaticFragmentAtoms(mol, atomList[1], atomList[2]);
    isMemberAtom = initMultidimensionalArray(cggl.Z_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 10: 1, 4: 1, 1: 1 }], [10, 5], 16, [2, mol.getAllAtoms_0()], 2);
    count = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    for (i = 0; i < 2; i++)
      count[i] = mol.getSubstituent_0(atomList[1 + i], rearAtom[i], isMemberAtom[i], null, null);
    smallerSubstituentIndex = count[0] < count[1] ? 0 : 1;
    rotatableAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, count[smallerSubstituentIndex], 15, 1);
    index_0 = 0;
    for (atom = 0; atom < mol.getAllAtoms_0(); atom++)
      if (isMemberAtom[smallerSubstituentIndex][atom])
        rotatableAtom[index_0++] = atom;
    this.mInverse = smallerSubstituentIndex == 1;
    return rotatableAtom;
  };
  _.getRuleType = function getRuleType() {
    return 5;
  };
  _.toString_0 = function toString_71() {
    var sb;
    sb = new jl.StringBuilder_1("binap rule (" + (this.mPositiveTorsionWanted ? "positive" : "negative") + " torsion):");
    getClassPrototype(39).addAtomList.call(this, sb);
    return sb.toString_0();
  };
  _.mInverse = false;
  _.mPositiveTorsionWanted = false;
  cggl.Lorg_openmolecules_chem_conf_so_AxialStereoRule_2_classLit = createForClass("org.openmolecules.chem.conf.so", "AxialStereoRule", 267, cggl.Lorg_openmolecules_chem_conf_so_ConformationRule_2_classLit);
  ooccs.$clinit_ConformationSelfOrganizer = function $clinit_ConformationSelfOrganizer() {
    ooccs.$clinit_ConformationSelfOrganizer = emptyMethod;
    jl.$clinit_Object();
    ooccs.PHASE_CYCLES = stampJavaTypeInfo(getClassLiteralForArray(cggl.I_classLit, 1), { 6: 1, 4: 1, 1: 1 }, 5, 15, [40, 20, 20, 100, 20]);
    ooccs.PHASE_NAME = stampJavaTypeInfo(getClassLiteralForArray(cggl.Ljava_lang_String_2_classLit, 1), { 4: 1, 1: 1, 7: 1, 9: 1 }, 2, 6, ["preparation", "pre-optimization", "breakout", "optimization", "minimization"]);
  };
  ooccs.ConformationSelfOrganizer = function ConformationSelfOrganizer(mol, keepHydrogen) {
    ooccs.$clinit_ConformationSelfOrganizer();
    Object_0.call(this);
    this.$init_426();
    this.mMol = mol;
    if (!keepHydrogen)
      this.mMol.removeExplicitHydrogens_0(true);
    this.mMol.ensureHelperArrays_0(15);
    this.mRuleList = new ju.ArrayList();
    this.mSkipRule = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, (ooccs.$clinit_ConformationRule(), ooccs.RULE_NAME).length, 16, 1);
    this.mRuleCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, (ooccs.$clinit_ConformationRule(), ooccs.RULE_NAME).length, 15, 1);
    ooccs.calculateRules_0(this.mRuleList, mol);
    this.mRuleCount[0] = this.mRuleList.size();
    this.mRuleCount[1] = -this.mRuleList.size();
    ooccs.calculateRules_1(this.mRuleList, mol);
    this.mRuleCount[1] += this.mRuleList.size();
    this.mRuleCount[2] = -this.mRuleList.size();
    ooccs.calculateRules_2(this.mRuleList, mol);
    this.mRuleCount[2] += this.mRuleList.size();
    this.mRuleCount[4] = -this.mRuleList.size();
    ooccs.calculateRules_3(this.mRuleList, mol);
    this.mRuleCount[4] += this.mRuleList.size();
    this.mRuleCount[5] = -this.mRuleList.size();
    ooccs.calculateRules(this.mRuleList, mol);
    this.mRuleCount[5] += this.mRuleList.size();
    this.mRuleCount[3] = -this.mRuleList.size();
    ooccs.calculateRules_4(this.mRuleList, mol);
    this.mRuleCount[3] += this.mRuleList.size();
  };
  ooccs.lambda$0_13 = function lambda$0_13(c1_0, c2_1) {
    ooccs.$clinit_ConformationSelfOrganizer();
    return compare_23(c1_0.getTotalStrain(), c2_1.getTotalStrain());
  };
  defineClass(171, 1, { 1: 1 }, ooccs.ConformationSelfOrganizer);
  _.$init_426 = function $init_426() {
  };
  _.addIfNewOrReplaceIfBetter = function addIfNewOrReplaceIfBetter(conformer, conformerList, poolIndex) {
    var i, i0, maxStrain, soc;
    if (jsEquals(this.mRotatableBondForDescriptor, null))
      this.mRotatableBondForDescriptor = carcc.findRotatableBonds_0(this.getMolecule_0());
    maxStrain = $wnd.Math.max(this.mMinStrainInPool[poolIndex] + 2.72, this.mMinStrainInPool[poolIndex] * 2);
    if (conformer.getTotalStrain() > maxStrain)
      return false;
    conformer.calculateDescriptor(this.mRotatableBondForDescriptor);
    for (i0 = conformerList.size() - 1; i0 >= 0; i0--) {
      soc = castTo(conformerList.getAtIndex(i0), 54);
      if (conformer.equals_1(soc)) {
        if (soc.isWorseThan(conformer)) {
          conformerList.removeAtIndex(i0);
          conformerList.add(conformer);
          if (this.mMinStrainInPool[poolIndex] > conformer.getTotalStrain())
            this.mMinStrainInPool[poolIndex] = conformer.getTotalStrain();
          return true;
        }
        return false;
      }
    }
    conformerList.add(conformer);
    if (this.mMinStrainInPool[poolIndex] > conformer.getTotalStrain()) {
      this.mMinStrainInPool[poolIndex] = conformer.getTotalStrain();
      for (i = conformerList.size() - 1; i >= 0; i--) {
        soc = castTo(conformerList.getAtIndex(i), 54);
        if (soc.getTotalStrain() > maxStrain)
          conformerList.removeAtIndex(i);
      }
    }
    return true;
  };
  _.containsTrappedAtom = function containsTrappedAtom(conformer) {
    var atom;
    for (atom = 0; atom < conformer.getMolecule_0().getAllAtoms_0(); atom++)
      if (conformer.getAtomStrain(atom) > 1e3 || conformer.getAtomStrain(atom) > 2e3)
        return true;
    return false;
  };
  _.escapeFromTrappedStates = function escapeFromTrappedStates(conformer) {
    var atom, atom0, atom1, atomCount, atomStrain, c, cn, distance, e, neighbourCount;
    conformer.calculateStrain(this.mRuleList);
    atomCount = 0;
    for (atom0 = 0; atom0 < this.mMol.getAllAtoms_0(); atom0++) {
      atomStrain = conformer.getAtomStrain(atom0);
      if (atomStrain > 1e3 && this.tryEscapeFromFlatRingTrap(conformer, atom0))
        atomCount++;
    }
    if (atomCount == 0) {
      neighbourCount = 16;
      for (atom1 = 0; atom1 < this.mMol.getAllAtoms_0(); atom1++)
        if (neighbourCount > this.mMol.getAllConnAtoms_0(atom1) && conformer.getAtomStrain(atom1) > this.maxCageBreakoutStrain(atom1))
          neighbourCount = this.mMol.getAllConnAtoms_0(atom1);
      if (neighbourCount != 16) {
        for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
          if (neighbourCount == this.mMol.getAllConnAtoms_0(atom) && conformer.getAtomStrain(atom) > this.maxCageBreakoutStrain(atom)) {
            if (isNotNull(ooccs.mDWWriter)) {
              try {
                this.writeStrains(conformer, null, "escapeCage", conformer.getAtomStrain(atom), NaN);
              } catch ($e0) {
                $e0 = toJava($e0);
                if (instanceOf($e0, 12)) {
                  e = $e0;
                  e.printStackTrace();
                } else
                  throw toJs($e0);
              }
            }
            c = conformer.getCoordinates(atom);
            if (this.mMol.getAllConnAtoms_0(atom) == 1) {
              cn = conformer.getCoordinates(this.mMol.getConnAtom_0(atom, 0));
              c.add_2(2 * (cn.x_0 - c.x_0), 2 * (cn.y_0 - c.y_0), 2 * (cn.z_0 - c.z_0));
            } else {
              distance = this.mMol.getAllConnAtoms_0(atom) == 0 ? 2 * 8 : 8;
              c.add_2(distance * this.mRandom.nextDouble() - distance / 2, distance * this.mRandom.nextDouble() - distance / 2, distance * this.mRandom.nextDouble() - distance / 2);
            }
            atomCount++;
          }
        }
      }
    }
    if (atomCount != 0)
      conformer.invalidateStrain();
    return atomCount;
  };
  _.generateOneConformer = function generateOneConformer(randomSeed) {
    var bestConformer, conformer, i, tempConformer;
    this.mRandom = eq(randomSeed, 0) ? new ju.Random() : new ju.Random_0(randomSeed);
    conformer = new ooccs.SelfOrganizedConformer(this.mMol);
    bestConformer = null;
    for (i = 0; i < 12; i++) {
      if (this.mustStop_0())
        break;
      if (this.tryGenerateConformer(conformer) || neq(randomSeed, 0))
        return conformer;
      if (isNull(bestConformer)) {
        bestConformer = conformer;
        conformer = new ooccs.SelfOrganizedConformer(this.mMol);
      } else if (bestConformer.isWorseThan(conformer)) {
        tempConformer = bestConformer;
        bestConformer = conformer;
        conformer = tempConformer;
      }
    }
    return bestConformer;
  };
  _.getMolecule_0 = function getMolecule_10() {
    return this.mMol;
  };
  _.getNextConformer_1 = function getNextConformer_1() {
    var bestConformer, conformer, conformer$iterator;
    if (isNull(this.mConformerList))
      return null;
    if (!this.mPoolIsClosed)
      this.increaseConformerPool(1);
    bestConformer = null;
    for (conformer$iterator = this.mConformerList.iterator(); conformer$iterator.hasNext_0(); ) {
      conformer = castTo(conformer$iterator.next_3(), 54);
      if (!conformer.isUsed() && (isNull(bestConformer) || bestConformer.isWorseThan(conformer))) {
        bestConformer = conformer;
      }
    }
    if (isNotNull(bestConformer))
      bestConformer.setUsed_0(true);
    else
      this.mConformerList = null;
    return bestConformer;
  };
  _.increaseConformerPool = function increaseConformerPool(newConformerCount) {
    var backupConformer, backupConformerList, bestRefusedConformer, conformer, finalPoolSize, i, tryCount;
    bestRefusedConformer = null;
    conformer = null;
    finalPoolSize = this.mConformerList.size() + newConformerCount;
    tryCount = newConformerCount * 12;
    backupConformerList = new ju.ArrayList();
    for (i = 0; i < tryCount && this.mConformerList.size() < finalPoolSize && !this.mustStop_0(); i++) {
      if (isNull(conformer))
        conformer = new ooccs.SelfOrganizedConformer(this.mMol);
      if (this.tryGenerateConformer(conformer)) {
        if (this.addIfNewOrReplaceIfBetter(conformer, this.mConformerList, 0))
          conformer = null;
      } else {
        if (this.addIfNewOrReplaceIfBetter(conformer, backupConformerList, 1))
          conformer = null;
      }
    }
    if (this.mConformerList.isEmpty() && !backupConformerList.isEmpty()) {
      backupConformer = castTo(backupConformerList.toArray_0(initUnidimensionalArray(cggl.Lorg_openmolecules_chem_conf_so_SelfOrganizedConformer_2_classLit, { 4: 1, 1: 1, 7: 1, 283: 1 }, 54, 0, 0, 1)), 283);
      ju.sort_7(backupConformer, new ooccs.ConformationSelfOrganizer$lambda$0$Type());
      this.mConformerList.addAll(ju.asList(backupConformer).subList(0, $wnd.Math.min(newConformerCount, backupConformer.length)));
      this.mPoolIsClosed = true;
    }
    if (this.mConformerList.size() < finalPoolSize || this.mConformerList.size() == this.mMaxConformers)
      this.mPoolIsClosed = true;
  };
  _.initializeConformers_2 = function initializeConformers_2(randomSeed, maxConformers) {
    var backupConformerList, bond, freeBondCount, ringBondCount;
    this.mRandom = eq(randomSeed, 0) ? new ju.Random() : new ju.Random_0(randomSeed);
    this.mConformerList = new ju.ArrayList();
    backupConformerList = new ju.ArrayList();
    this.mMinStrainInPool = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    this.mMinStrainInPool[0] = 17976931348623157e292;
    this.mMinStrainInPool[1] = 17976931348623157e292;
    this.mPoolIsClosed = false;
    freeBondCount = 0;
    ringBondCount = 0;
    for (bond = 0; bond < this.mMol.getBonds_0(); bond++) {
      if (!this.mMol.isAromaticBond_0(bond) && this.mMol.getBondOrder_0(bond) == 1 && this.mMol.getAllConnAtoms_0(this.mMol.getBondAtom_0(0, bond)) > 1 && this.mMol.getAllConnAtoms_0(this.mMol.getBondAtom_0(1, bond)) > 1) {
        if (!this.mMol.isRingBond_0(bond))
          freeBondCount++;
        else if (this.mMol.getBondRingSize_0(bond) > 4)
          ringBondCount++;
      }
    }
    this.mMaxConformers = maxConformers == -1 ? 1 << 1 + freeBondCount + narrow_int(ringBondCount / 2) : maxConformers;
    this.increaseConformerPool($wnd.Math.min(8, this.mMaxConformers));
  };
  _.isAcceptable = function isAcceptable(conformer) {
    var atom;
    for (atom = 0; atom < conformer.getMolecule_0().getAllAtoms_0(); atom++)
      if (conformer.getAtomStrain(atom) > 2.72)
        return false;
    return true;
  };
  _.jumbleAtoms = function jumbleAtoms(conformer) {
    var atom, atom0, boxSize, connAtom;
    boxSize = 2 + 2 * $wnd.Math.sqrt(this.mMol.getAllAtoms_0());
    for (atom0 = 0; atom0 < this.mMol.getAllAtoms_0(); atom0++) {
      if (this.mMol.getAllConnAtoms_0(atom0) != 1) {
        conformer.setX_0(atom0, boxSize * this.mRandom.nextDouble() - boxSize / 2);
        conformer.setY_0(atom0, boxSize * this.mRandom.nextDouble() - boxSize / 2);
        conformer.setZ(atom0, boxSize * this.mRandom.nextDouble() - boxSize / 2);
      }
    }
    for (atom = 0; atom < this.mMol.getAllAtoms_0(); atom++) {
      if (this.mMol.getAllConnAtoms_0(atom) == 1) {
        connAtom = this.mMol.getConnAtom_0(atom, 0);
        conformer.setX_0(atom, conformer.getX_0(connAtom) + 4 * this.mRandom.nextDouble() - 2);
        conformer.setY_0(atom, conformer.getY_0(connAtom) + 4 * this.mRandom.nextDouble() - 2);
        conformer.setZ(atom, conformer.getZ(connAtom) + 4 * this.mRandom.nextDouble() - 2);
      }
    }
    conformer.invalidateStrain();
  };
  _.maxCageBreakoutStrain = function maxCageBreakoutStrain(atom) {
    var connAtoms;
    connAtoms = $wnd.Math.min(4, this.mMol.getAllConnAtoms_0(atom));
    return 2e3 / 5 + connAtoms * 2e3 / 5;
  };
  _.mustStop_0 = function mustStop_0() {
    return isNotNull(this.mThreadMaster) && this.mThreadMaster.threadMustDie() || neq(this.mStopMillis, 0) && gt(jl.currentTimeMillis_0(), this.mStopMillis);
  };
  _.optimize = function optimize(conformer, bestConformer, phase) {
    var atomsSquare, averagePreviousStrain, conformerChanged, cycleFactor, cycles, e, innerCycle, outerCycle, previousTotalStrainIndex, previousTotalStrains, reductionFactor, rule, s1, s2, strain, strain$array, strain$index, strain$max;
    cycles = ooccs.PHASE_CYCLES[phase];
    cycleFactor = 1;
    reductionFactor = phase == 4 ? $wnd.Math.exp($wnd.Math.log(0.01) / cycles) : 1;
    this.mDWMode = ooccs.PHASE_NAME[phase];
    atomsSquare = this.mMol.getAllAtoms_0() * this.mMol.getAllAtoms_0();
    previousTotalStrains = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 10, 15, 1);
    previousTotalStrainIndex = 0;
    for (outerCycle = 0; outerCycle < cycles && !this.mustStop_0(); outerCycle++) {
      if (phase != 0 && outerCycle % 10 == 0)
        this.tryEscapeTwistBoats(conformer);
      for (innerCycle = 0; innerCycle < atomsSquare && !this.mustStop_0(); innerCycle++) {
        rule = null;
        if (false) {
        } else {
          rule = castTo(this.mRuleList.getAtIndex(round_int(this.mRandom.nextDouble() * this.mRuleList.size())), 39);
        }
        if (rule.isEnabled() && !this.mSkipRule[rule.getRuleType()]) {
          conformerChanged = rule.apply_4(conformer, cycleFactor);
          if (conformerChanged)
            conformer.invalidateStrain();
          if (isNotNull(ooccs.mDWWriter) && conformerChanged) {
            try {
              s1 = isNull(ooccs.mLastDWConformer) ? 0 : rule.addStrain(ooccs.mLastDWConformer, null);
              s2 = rule.addStrain(conformer, null);
              this.writeStrains(conformer, rule, null, s1, s2);
            } catch ($e0) {
              $e0 = toJava($e0);
              if (instanceOf($e0, 12)) {
                e = $e0;
                e.printStackTrace();
              } else
                throw toJs($e0);
            }
          }
        }
      }
      conformer.calculateStrain(this.mRuleList);
      previousTotalStrains[previousTotalStrainIndex++] = conformer.getTotalStrain();
      if (previousTotalStrainIndex == 10)
        previousTotalStrainIndex = 0;
      if (outerCycle > 10) {
        averagePreviousStrain = 0;
        for (strain$array = previousTotalStrains, strain$index = 0, strain$max = strain$array.length; strain$index < strain$max; ++strain$index) {
          strain = strain$array[strain$index];
          averagePreviousStrain += strain;
        }
        averagePreviousStrain /= 10;
        if (conformer.getTotalStrain() > averagePreviousStrain)
          break;
      }
      if (bestConformer.getTotalStrain() > conformer.getTotalStrain())
        bestConformer.copyFrom_1(conformer);
      cycleFactor *= reductionFactor;
    }
    if (conformer.isWorseThan(bestConformer))
      conformer.copyFrom_1(bestConformer);
  };
  _.setStopTime = function setStopTime_0(millis) {
    this.mStopMillis = millis;
  };
  _.setThreadMaster = function setThreadMaster_1(tm) {
    this.mThreadMaster = tm;
  };
  _.tryEscapeFromFlatRingTrap = function tryEscapeFromFlatRingTrap(conformer, atom) {
    var ca, cc, connAtom, e, i, ringAtom, va, vr;
    if (this.mMol.getAllConnAtoms_0(atom) == 1) {
      connAtom = this.mMol.getConnAtom_0(atom, 0);
      if (this.mMol.isSmallRingAtom_0(connAtom)) {
        ca = conformer.getCoordinates(atom);
        cc = conformer.getCoordinates(connAtom);
        va = cc.subC(ca);
        for (i = 0; i < this.mMol.getConnAtoms_0(connAtom); i++) {
          ringAtom = this.mMol.getConnAtom_0(connAtom, i);
          if (this.mMol.isRingAtom_0(ringAtom)) {
            vr = cc.subC(conformer.getCoordinates(ringAtom));
            if (va.getAngle_0(vr) > 3.141592653589793 / 2)
              return false;
          }
        }
        ca.add_3(va).add_3(va);
        if (isNotNull(ooccs.mDWWriter)) {
          try {
            this.writeStrains(conformer, null, "escapeFlatRing", conformer.getAtomStrain(atom), NaN);
          } catch ($e0) {
            $e0 = toJava($e0);
            if (instanceOf($e0, 12)) {
              e = $e0;
              e.printStackTrace();
            } else
              throw toJs($e0);
          }
        }
        return true;
      }
    }
    return false;
  };
  _.tryEscapeTwistBoats = function tryEscapeTwistBoats(conformer) {
    var angle, axis_0, center, changeDone, cog, connAtom, coords, distance, e, i, i0, isBridgedRingAtom, isCandidate, j, n, notAtom, pAtom, r, rb, rb$array, rb$index, rb$max, ringAtom, ringSet, sideMatchCount, strain1, theta;
    changeDone = false;
    ringSet = this.mMol.getRingSet_0();
    for (r = 0; r < ringSet.getSize_0(); r++) {
      ringAtom = ringSet.getRingAtoms_0(r);
      if (ringAtom.length == 6 && !ringSet.isDelocalized_0(r)) {
        isCandidate = true;
        for (rb$array = ringSet.getRingBonds_0(r), rb$index = 0, rb$max = rb$array.length; rb$index < rb$max; ++rb$index) {
          rb = rb$array[rb$index];
          if (this.mMol.getBondOrder_0(rb) != 1 || this.mMol.isDelocalizedBond_0(rb)) {
            isCandidate = false;
            break;
          }
        }
        if (isCandidate) {
          cog = new carc2.Coordinates_0();
          n = new carc2.Coordinates_0();
          coords = initMultidimensionalArray(cggl.D_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 11: 1, 4: 1, 1: 1 }], [11, 5], 15, [6, 3], 2);
          ooccs.calculateNearestPlane(conformer, ringAtom, cog, n, coords);
          distance = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, ringAtom.length, 15, 1);
          sideMatchCount = 0;
          for (i0 = 0; i0 < ringAtom.length; i0++) {
            distance[i0] = -(n.x_0 * coords[i0][0] + n.y_0 * coords[i0][1] + n.z_0 * coords[i0][2]);
            if (distance[i0] < 0 ^ (i0 & 1) == 1)
              sideMatchCount++;
          }
          if (sideMatchCount != 0 && sideMatchCount != 6) {
            for (i = 0; i < ringAtom.length; i++) {
              if (distance[i] < 0 ^ (i & 1) == 1 ^ sideMatchCount >= 3) {
                notAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
                notAtom[0] = ringAtom[i == 0 ? 5 : i - 1];
                notAtom[1] = ringAtom[i == 5 ? 0 : i + 1];
                pAtom = conformer.getCoordinates(ringAtom[i]);
                axis_0 = conformer.getCoordinates(ringAtom[i]).subC(cog).cross(n).unit();
                angle = 0.6 + $wnd.Math.asin($wnd.Math.abs(distance[i]) / pAtom.distance(cog));
                theta = distance[i] < 0 ? angle : -angle;
                center = new carc2.Coordinates_2(pAtom).center(cog);
                isBridgedRingAtom = false;
                if (this.mMol.getConnAtoms_0(ringAtom[i]) > 2) {
                  for (j = 0; j < this.mMol.getConnAtoms_0(ringAtom[i]); j++) {
                    connAtom = this.mMol.getConnAtom_0(ringAtom[i], j);
                    if (connAtom != notAtom[0] && connAtom != notAtom[1] && this.mMol.isRingBond_0(this.mMol.getConnBond_0(ringAtom[i], j))) {
                      isBridgedRingAtom = true;
                      break;
                    }
                  }
                }
                if (!isBridgedRingAtom)
                  ooccs.rotateGroup(conformer, ringAtom[i], notAtom, center, axis_0, theta);
              }
            }
            changeDone = true;
          }
        }
      }
    }
    if (changeDone) {
      strain1 = conformer.getTotalStrain();
      conformer.invalidateStrain();
      conformer.calculateStrain(this.mRuleList);
      if (isNotNull(ooccs.mDWWriter)) {
        try {
          this.writeStrains(conformer, null, "escapeTwistBoat", strain1, conformer.getTotalStrain());
        } catch ($e0) {
          $e0 = toJava($e0);
          if (instanceOf($e0, 12)) {
            e = $e0;
            e.printStackTrace();
          } else
            throw toJs($e0);
        }
      }
    }
    return changeDone;
  };
  _.tryGenerateConformer = function tryGenerateConformer(conformer) {
    var bestConformer, i, i0, rule, rule$iterator;
    if (this.mMol.getAllAtoms_0() < 2)
      return true;
    for (rule$iterator = this.mRuleList.iterator(); rule$iterator.hasNext_0(); ) {
      rule = castTo(rule$iterator.next_3(), 39);
      rule.setEnabled_0(true);
    }
    for (i0 = 0; i0 < this.mSkipRule.length; i0++)
      this.mSkipRule[i0] = false;
    if (!ooccs.KEEP_INITIAL_COORDINATES)
      this.jumbleAtoms(conformer);
    if (false)
      this.mSkipRule[3] = true;
    bestConformer = new ooccs.SelfOrganizedConformer_0(conformer);
    this.optimize(conformer, bestConformer, 0);
    if (false) {
    }
    for (i = 0; this.containsTrappedAtom(conformer) && i < 3 && !this.mustStop_0(); i++) {
      if (this.escapeFromTrappedStates(conformer) == 0)
        break;
      this.optimize(conformer, bestConformer, 2);
    }
    this.optimize(conformer, bestConformer, 3);
    this.optimize(conformer, bestConformer, 4);
    return this.isAcceptable(conformer);
  };
  _.writeStrains = function writeStrains(newConformer, rule, stepName, strain1, strain2) {
    var atom, atom0, atomList, atoms, i, i0, i1, idcode, mol, newCanonizer, newCoords, oldCanonizer, oldCoords, oldStrainSum, ruleName, s, s$array, s$index, s$max, strain, strainSum;
    newConformer.calculateStrain(this.mRuleList);
    strain = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, (ooccs.$clinit_ConformationRule(), ooccs.RULE_NAME).length, 15, 1);
    strainSum = 0;
    for (i0 = 0; i0 < (ooccs.$clinit_ConformationRule(), ooccs.RULE_NAME).length; i0++) {
      strain[i0] = newConformer.getRuleStrain_0(i0);
      strainSum += strain[i0];
    }
    oldStrainSum = 0;
    if (jsNotEquals(this.mDWStrain, null))
      for (i1 = 0; i1 < this.mDWStrain.length; i1++)
        oldStrainSum += this.mDWStrain[i1];
    ruleName = isNotNull(rule) ? (ooccs.$clinit_ConformationRule(), ooccs.RULE_NAME)[rule.getRuleType()] : stepName;
    mol = this.mMol.getCompactCopy_0();
    for (atom0 = 0; atom0 < mol.getAllAtoms_0(); atom0++) {
      if (mol.getAtomicNo_0(atom0) == 1)
        mol.setAtomicNo_0(atom0, 9);
    }
    atoms = "";
    if (isNotNull(rule)) {
      atomList = rule.getAtomList_1();
      for (i = 0; i < atomList.length; i++) {
        if (i != 0)
          atoms = atoms + ",";
        atoms = atoms + atomList[i];
        if (atomList[i] != -1)
          mol.setAtomicNo_0(atomList[i], 5);
      }
    }
    newConformer.toMolecule_0(mol);
    newCanonizer = new carc2.Canonizer(mol);
    newCoords = newCanonizer.getEncodedCoordinates_0();
    if (isNotNull(ooccs.mLastDWConformer)) {
      ooccs.mLastDWConformer.toMolecule_0(mol);
      oldCanonizer = new carc2.Canonizer(mol);
      idcode = oldCanonizer.getIDCode_0();
      oldCoords = oldCanonizer.getEncodedCoordinates_0();
      ooccs.mDWWriter.write_3(idcode + "	" + oldCoords + "	" + newCoords + "	" + ooccs.mDWCycle + "	" + this.mDWMode + "	" + ruleName + "	" + atoms + "	" + (isNotNull(rule) ? rule.toString_0() : stepName));
      for (s$array = strain, s$index = 0, s$max = s$array.length; s$index < s$max; ++s$index) {
        s = s$array[s$index];
        ooccs.mDWWriter.write_3("	" + caru.toString_22(s));
      }
      ooccs.mDWWriter.write_3("	" + caru.toString_22(strainSum) + "	" + caru.toString_22(oldStrainSum - strainSum) + "	" + caru.toString_22(strain1) + "	" + caru.toString_22(strain2) + "	" + caru.toString_22(strain1 - strain2));
      for (atom = 0; atom < mol.getAllAtoms_0(); atom++) {
        ooccs.mDWWriter.write_3(atom == 0 ? "	" : " ");
        ooccs.mDWWriter.write_3(atom + ":" + caru.toString_23(newConformer.getAtomStrain(atom), 2));
      }
      ooccs.mDWWriter.newLine();
      this.mDWStrain = strain;
      ooccs.mDWCycle++;
    }
    ooccs.mLastDWConformer = new carcc.Conformer_0(newConformer);
  };
  _.mMaxConformers = 0;
  _.mPoolIsClosed = false;
  _.mStopMillis = 0;
  ooccs.ATOM_ACCEPTABLE_STRAIN = 2.72;
  ooccs.ATOM_CAGE_BREAKOUT_STRAIN = 2e3;
  ooccs.ATOM_FLAT_RING_BREAKOUT_STRAIN = 1e3;
  ooccs.BACKUP_POOL_INDEX = 1;
  ooccs.BREAKOUT_DISTANCE = 8;
  ooccs.CONSIDERED_PREVIOUS_CYCLE_COUNT = 10;
  ooccs.DATAWARRIOR_DEBUG_FILE = "/home/thomas/data/debug/conformationSampler.dwar";
  ooccs.INITIALLY_SKIP_TORSION_RULES = false;
  ooccs.INITIAL_POOL_SIZE = 8;
  ooccs.KEEP_INITIAL_COORDINATES = false;
  ooccs.MAIN_POOL_INDEX = 0;
  ooccs.MAX_BREAKOUT_ROUNDS = 3;
  ooccs.MAX_CONFORMER_TRIES = 12;
  ooccs.MAX_POOL_STRAIN_DIF = 2.72;
  ooccs.MAX_POOL_STRAIN_FACTOR = 2;
  ooccs.MINIMIZATION_END_FACTOR = 0.01;
  ooccs.PHASE_BREAKOUT = 2;
  ooccs.PHASE_MINIMIZATION = 4;
  ooccs.PHASE_OPTIMIZATION = 3;
  ooccs.PHASE_PREPARATION = 0;
  ooccs.PHASE_PRE_OPTIMIZATION = 1;
  ooccs.PREFER_HIGH_STRAIN_RULES = false;
  ooccs.STANDARD_CYCLE_FACTOR = 1;
  ooccs.TWIST_BOAT_ESCAPE_ANGLE = 0.6;
  ooccs.TWIST_BOAT_ESCAPE_FREQUENCY = 10;
  ooccs.WRITE_DW_FILE = false;
  ooccs.mDWCycle = 0;
  cggl.Lorg_openmolecules_chem_conf_so_ConformationSelfOrganizer_2_classLit = createForClass("org.openmolecules.chem.conf.so", "ConformationSelfOrganizer", 171, cggl.Ljava_lang_Object_2_classLit);
  ooccs.$clinit_ConformationSelfOrganizer$lambda$0$Type = function $clinit_ConformationSelfOrganizer$lambda$0$Type() {
    ooccs.$clinit_ConformationSelfOrganizer$lambda$0$Type = emptyMethod;
  };
  ooccs.ConformationSelfOrganizer$lambda$0$Type = function ConformationSelfOrganizer$lambda$0$Type() {
    ooccs.$clinit_ConformationSelfOrganizer$lambda$0$Type();
  };
  defineClass(428, 1, { 1: 1, 36: 1 }, ooccs.ConformationSelfOrganizer$lambda$0$Type);
  _.compare_0 = function compare_40(arg0, arg1) {
    return ooccs.lambda$0_13(castTo(arg0, 54), castTo(arg1, 54));
  };
  _.equals_0 = function equals_53(other) {
    return getClassPrototype(1).equals_0.call(this, other);
  };
  cggl.Lorg_openmolecules_chem_conf_so_ConformationSelfOrganizer$lambda$0$Type_2_classLit = createForClass("org.openmolecules.chem.conf.so", "ConformationSelfOrganizer/lambda$0$Type", 428, cggl.Ljava_lang_Object_2_classLit);
  ooccs.$clinit_DistanceRule = function $clinit_DistanceRule() {
    ooccs.$clinit_DistanceRule = emptyMethod;
    ooccs.$clinit_ConformationRule();
  };
  ooccs.DistanceRule = function DistanceRule() {
    ooccs.ConformationRule.call(this, null);
    this.$init_427();
  };
  ooccs.DistanceRule_0 = function DistanceRule_0(atom, minDistance, maxDistance, priority) {
    ooccs.ConformationRule.call(this, atom);
    this.$init_427();
    this.mDistance = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    this.mDistance[0] = minDistance;
    this.mDistance[1] = maxDistance;
    this.mPriority = priority;
  };
  ooccs.DistanceRule_1 = function DistanceRule_1(atom, notList, minDistance, maxDistance, priority) {
    ooccs.ConformationRule.call(this, atom);
    this.$init_427();
    this.mDistance = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    this.mDistance[0] = minDistance;
    this.mDistance[1] = maxDistance;
    this.mNotList = notList;
    this.mPriority = priority;
  };
  ooccs.DistanceRule_2 = function DistanceRule_2(atom, notList, distance, priority) {
    ooccs.ConformationRule.call(this, atom);
    this.$init_427();
    this.mDistance = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 1, 15, 1);
    this.mDistance[0] = distance;
    this.mNotList = notList;
    this.mPriority = priority;
  };
  ooccs.calculateDisconnectedDistanceRules = function calculateDisconnectedDistanceRules(rule, mol) {
    var atom1, atom2;
    for (atom1 = 1; atom1 < mol.getAllAtoms_0(); atom1++) {
      for (atom2 = 0; atom2 < atom1; atom2++) {
        if (isNull(rule[atom1][atom2])) {
          setCheck(rule[atom1], atom2, new ooccs.DistanceRule_0(ooccs.combineAtoms(atom1, atom2), ooccs.getVDWRadius(atom1, mol) + ooccs.getVDWRadius(atom2, mol), 17976931348623157e292, -1));
        }
      }
    }
  };
  ooccs.calculateLongDistanceRules = function calculateLongDistanceRules(rule, rootAtom, mol, bondLengthSet) {
    var bondCount, candidate, current, distanceToRoot, graphAtom, highest, i, notList, parent_0;
    bondCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 15, 1);
    graphAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 15, 1);
    distanceToRoot = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 15, 1);
    graphAtom[0] = rootAtom;
    current = 0;
    highest = 0;
    while (current <= highest) {
      parent_0 = graphAtom[current];
      for (i = 0; i < mol.getAllConnAtoms_0(parent_0); i++) {
        candidate = mol.getConnAtom_0(parent_0, i);
        if (bondCount[candidate] == 0 && candidate != rootAtom) {
          graphAtom[++highest] = candidate;
          bondCount[candidate] = bondCount[parent_0] + 1;
          if (bondCount[candidate] == 2)
            distanceToRoot[candidate] = candidate < rootAtom ? rule[rootAtom][candidate].mDistance[0] : rule[candidate][rootAtom].mDistance[0];
          else if (bondCount[candidate] > 2) {
            distanceToRoot[candidate] = distanceToRoot[parent_0] + bondLengthSet.getLength_0(mol.getConnBond_0(parent_0, i));
            if (candidate < rootAtom && isNull(rule[rootAtom][candidate])) {
              if (bondCount[candidate] == 3) {
                setCheck(rule[rootAtom], candidate, new ooccs.DistanceRule());
              } else {
                notList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
                notList[0] = graphAtom[1];
                notList[1] = parent_0;
                setCheck(rule[rootAtom], candidate, new ooccs.DistanceRule_1(ooccs.combineAtoms(rootAtom, candidate), notList, ooccs.getVDWRadius(rootAtom, mol) + ooccs.getVDWRadius(candidate, mol), distanceToRoot[candidate], 0));
              }
            }
          }
        }
      }
      current++;
    }
  };
  ooccs.calculateRules_0 = function calculateRules_0(ruleList, mol) {
    ooccs.$clinit_DistanceRule();
    var angle, angle1, angle2, atom, atom0, atom1, atom2, atom3, atom4, bond, bond0, bondAngleSet, bondLength1, bondLength2, bondLengthSet, conn1, conn2, connAngle, connAtom, connAtom1, connAtom2, connBond, connBond1, connBond2, connIndex, distance, doubleBondOpponentIndex, dx, dy, dz, i, i0, i1, i2, i3, isE, j, j0, j1, notAtom, opponentIndex, outerAtom, rule;
    bondLengthSet = new carcc.BondLengthSet(mol);
    bondAngleSet = new carcc.BondAngleSet(mol, bondLengthSet);
    rule = initUnidimensionalArray(cggl.Lorg_openmolecules_chem_conf_so_DistanceRule_2_classLit, { 4: 1, 1: 1, 7: 1 }, 836, mol.getAllAtoms_0(), 0, 2);
    for (i0 = 1; i0 < mol.getAllAtoms_0(); i0++)
      setCheck(rule, i0, initUnidimensionalArray(cggl.Lorg_openmolecules_chem_conf_so_DistanceRule_2_classLit, { 4: 1, 1: 1, 7: 1, 836: 1 }, 101, i0, 0, 1));
    for (bond0 = 0; bond0 < mol.getAllBonds_0(); bond0++) {
      atom0 = ooccs.combineAtoms(mol.getBondAtom_0(0, bond0), mol.getBondAtom_0(1, bond0));
      ooccs.setFixedDistance(rule, atom0, atom0, bondLengthSet.getLength_0(bond0), 10);
    }
    for (atom3 = 0; atom3 < mol.getAtoms_0(); atom3++) {
      for (i1 = 1; i1 < mol.getAllConnAtoms_0(atom3); i1++) {
        connAtom1 = mol.getConnAtom_0(atom3, i1);
        connBond1 = mol.getConnBond_0(atom3, i1);
        bondLength1 = bondLengthSet.getLength_0(connBond1);
        for (j0 = 0; j0 < i1; j0++) {
          connAtom2 = mol.getConnAtom_0(atom3, j0);
          connBond2 = mol.getConnBond_0(atom3, j0);
          angle = bondAngleSet.getConnAngle(atom3, i1, j0);
          bondLength2 = bondLengthSet.getLength_0(connBond2);
          distance = $wnd.Math.sqrt(bondLength1 * bondLength1 + bondLength2 * bondLength2 - 2 * bondLength1 * bondLength2 * $wnd.Math.cos(angle));
          notAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 1, 15, 1);
          notAtom[0] = atom3;
          ooccs.setFixedDistance(rule, ooccs.combineAtoms(connAtom1, connAtom2), notAtom, distance, 5);
        }
      }
    }
    for (bond = 0; bond < mol.getAllBonds_0(); bond++) {
      if (mol.isAromaticBond_0(bond) || mol.isRingBond_0(bond) && mol.getBondRingSize_0(bond) <= 5)
        continue;
      atom0 = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
      for (i1 = 0; i1 < 2; i1++)
        atom0[i1] = mol.getBondAtom_0(i1, bond);
      if (mol.getAllConnAtoms_0(atom0[0]) > 1 && mol.getAllConnAtoms_0(atom0[1]) > 1) {
        if (mol.getBondOrder_0(bond) == 3) {
          distance = bondLengthSet.getLength_0(bond);
          outerAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
          for (i2 = 0; i2 < 2; i2++) {
            for (j0 = 0; j0 < mol.getAllConnAtoms_0(atom0[i2]); j0++) {
              connBond = mol.getConnBond_0(atom0[i2], j0);
              if (connBond != bond) {
                distance += bondLengthSet.getLength_0(connBond);
                outerAtom[i2] = mol.getConnAtom_0(atom0[i2], j0);
                break;
              }
            }
          }
          notAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
          notAtom[0] = atom0[0];
          notAtom[1] = atom0[1];
          ooccs.setFixedDistance(rule, ooccs.combineAtoms(outerAtom[0], outerAtom[1]), notAtom, distance, 3);
        } else if (mol.getBondOrder_0(bond) == 2 && mol.getAtomPi_0(atom0[0]) == 1 && mol.getAtomPi_0(atom0[1]) == 1 && mol.getBondParity_0(bond) != 3) {
          connAtom = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 2, 0, 2);
          connBond = initUnidimensionalArray(cggl.I_classLit, { 25: 1, 4: 1, 1: 1, 7: 1 }, 6, 2, 0, 2);
          connAngle = initUnidimensionalArray(cggl.D_classLit, { 4: 1, 1: 1, 7: 1 }, 11, 2, 0, 2);
          for (i2 = 0; i2 < 2; i2++) {
            connAtom[i2] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAllConnAtoms_0(atom0[i2]) - 1, 15, 1);
            connBond[i2] = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAllConnAtoms_0(atom0[i2]) - 1, 15, 1);
            connAngle[i2] = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, mol.getAllConnAtoms_0(atom0[i2]) - 1, 15, 1);
            doubleBondOpponentIndex = -1;
            for (j0 = 0; j0 < mol.getAllConnAtoms_0(atom0[i2]); j0++) {
              if (mol.getConnAtom_0(atom0[i2], j0) == atom0[1 - i2]) {
                doubleBondOpponentIndex = j0;
                break;
              }
            }
            connIndex = 0;
            for (j1 = 0; j1 < mol.getAllConnAtoms_0(atom0[i2]); j1++) {
              if (j1 != doubleBondOpponentIndex) {
                connAtom[i2][connIndex] = mol.getConnAtom_0(atom0[i2], j1);
                connBond[i2][connIndex] = mol.getConnBond_0(atom0[i2], j1);
                connAngle[i2][connIndex] = bondAngleSet.getConnAngle(atom0[i2], doubleBondOpponentIndex, j1);
                connIndex++;
              }
            }
          }
          for (i3 = 0; i3 < connAtom[0].length; i3++) {
            for (j0 = 0; j0 < connAtom[1].length; j0++) {
              isE = mol.getBondParity_0(bond) == 1;
              if (connAtom[0].length == 2 && connAtom[0][i3] > connAtom[0][1 - i3])
                isE = !isE;
              if (connAtom[1].length == 2 && connAtom[1][j0] > connAtom[1][1 - j0])
                isE = !isE;
              ooccs.setDoubleBondDistance(connAtom[0][i3], connAtom[1][j0], connBond[0][i3], connBond[1][j0], connAngle[0][i3], connAngle[1][j0], bond, isE, bondLengthSet, rule, mol);
            }
          }
        } else if (mol.getBondOrder_0(bond) != 0) {
          opponentIndex = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
          for (i2 = 0; i2 < 2; i2++) {
            for (j0 = 0; j0 < mol.getAllConnAtoms_0(atom0[i2]); j0++) {
              if (mol.getConnAtom_0(atom0[i2], j0) == atom0[1 - i2]) {
                opponentIndex[i2] = j0;
                break;
              }
            }
          }
          for (i3 = 0; i3 < mol.getAllConnAtoms_0(atom0[0]); i3++) {
            if (i3 != opponentIndex[0]) {
              for (j0 = 0; j0 < mol.getAllConnAtoms_0(atom0[1]); j0++) {
                if (j0 != opponentIndex[1]) {
                  if (mol.getAtomPi_0(atom0[0]) == 0 && mol.getAtomPi_0(atom0[1]) == 0)
                    ooccs.setSingleBondConnAtomDistance(mol.getConnAtom_0(atom0[0], i3), mol.getConnAtom_0(atom0[1], j0), mol.getConnBond_0(atom0[0], i3), mol.getConnBond_0(atom0[1], j0), bondAngleSet.getConnAngle(atom0[0], opponentIndex[0], i3), bondAngleSet.getConnAngle(atom0[1], opponentIndex[1], j0), bond, bondLengthSet, rule, mol);
                  else
                    ooccs.setAnyBondConnAtomDistance(mol.getConnAtom_0(atom0[0], i3), mol.getConnAtom_0(atom0[1], j0), mol.getConnBond_0(atom0[0], i3), mol.getConnBond_0(atom0[1], j0), bondAngleSet.getConnAngle(atom0[0], opponentIndex[0], i3), bondAngleSet.getConnAngle(atom0[1], opponentIndex[1], j0), bond, bondLengthSet, rule, mol);
                }
              }
            }
          }
        }
      }
    }
    for (atom4 = 0; atom4 < mol.getAtoms_0(); atom4++) {
      if (mol.getAtomPi_0(atom4) == 2 && mol.getConnAtoms_0(atom4) == 2 && mol.getConnBondOrder_0(atom4, 0) == 2 && mol.getConnBondOrder_0(atom4, 1) == 2) {
        atom1 = mol.getConnAtom_0(atom4, 0);
        atom2 = mol.getConnAtom_0(atom4, 1);
        for (i1 = 0; i1 < mol.getAllConnAtoms_0(atom1); i1++) {
          conn1 = mol.getConnAtom_0(atom1, i1);
          if (conn1 != atom4) {
            for (j0 = 0; j0 < mol.getAllConnAtoms_0(atom2); j0++) {
              conn2 = mol.getConnAtom_0(atom2, j0);
              if (conn2 != atom4) {
                angle1 = bondAngleSet.getAngle_1(atom1, atom4, conn1);
                angle2 = bondAngleSet.getAngle_1(atom2, atom4, conn2);
                bondLength1 = bondLengthSet.getLength_0(mol.getConnBond_0(atom1, i1));
                bondLength2 = bondLengthSet.getLength_0(mol.getConnBond_0(atom2, j0));
                dx = bondLengthSet.getLength_0(mol.getConnBond_0(atom4, 0)) + bondLengthSet.getLength_0(mol.getConnBond_0(atom4, 1)) - bondLength1 * $wnd.Math.cos(angle1) - bondLength2 * $wnd.Math.cos(angle2);
                dy = bondLength1 * $wnd.Math.sin(angle1);
                dz = bondLength2 * $wnd.Math.sin(angle2);
                notAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
                notAtom[0] = atom1;
                notAtom[1] = atom2;
                ooccs.setFixedDistance(rule, ooccs.combineAtoms(conn1, conn2), notAtom, $wnd.Math.sqrt(dx * dx + dy * dy + dz * dz), 3);
              }
            }
          }
        }
      }
    }
    for (atom = 0; atom < mol.getAllAtoms_0(); atom++)
      ooccs.calculateLongDistanceRules(rule, atom, mol, bondLengthSet);
    ooccs.calculateDisconnectedDistanceRules(rule, mol);
    for (i = 1; i < mol.getAllAtoms_0(); i++)
      for (j = 0; j < i; j++)
        if (jsNotEquals(rule[i][j].mDistance, null))
          ruleList.add(rule[i][j]);
  };
  ooccs.combineAtoms = function combineAtoms(atom1, atom2) {
    var atom;
    atom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    if (atom1 > atom2) {
      atom[0] = atom1;
      atom[1] = atom2;
    } else {
      atom[0] = atom2;
      atom[1] = atom1;
    }
    return atom;
  };
  ooccs.getVDWRadius = function getVDWRadius(atom, mol) {
    var atomicNo;
    atomicNo = mol.getAtomicNo_0(atom);
    return atomicNo < (carcc.$clinit_VDWRadii(), carcc.VDW_RADIUS).length ? (carcc.$clinit_VDWRadii(), carcc.VDW_RADIUS)[atomicNo] : 2;
  };
  ooccs.mergeNotLists = function mergeNotLists(nl1, nl2) {
    var atom, atom$array, atom$array0, atom$index, atom$index0, atom$max, atom$max0, index_0, nl;
    if (jsEquals(nl1, null))
      return nl2;
    if (jsEquals(nl2, null))
      return nl1;
    nl = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, nl1.length + nl2.length, 15, 1);
    index_0 = 0;
    for (atom$array0 = nl1, atom$index0 = 0, atom$max0 = atom$array0.length; atom$index0 < atom$max0; ++atom$index0) {
      atom = atom$array0[atom$index0];
      nl[index_0++] = atom;
    }
    for (atom$array = nl2, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
      atom = atom$array[atom$index];
      nl[index_0++] = atom;
    }
    return nl;
  };
  ooccs.setAnyBondConnAtomDistance = function setAnyBondConnAtomDistance(atom1, atom2, bond1, bond2, angle1, angle2, centralBond, bondLengthSet, rule, mol) {
    var atom, currentRule, dx, dyMax, dyMin, max_0, min_0, notAtom, s1, s2;
    if (atom1 == atom2)
      return;
    atom = ooccs.combineAtoms(atom1, atom2);
    if (isNotNull(rule[atom[0]][atom[1]]) && rule[atom[0]][atom[1]].isFixedDistance())
      return;
    dx = bondLengthSet.getLength_0(centralBond) - bondLengthSet.getLength_0(bond1) * $wnd.Math.cos(angle1) - bondLengthSet.getLength_0(bond2) * $wnd.Math.cos(angle2);
    s1 = bondLengthSet.getLength_0(bond1) * $wnd.Math.sin(angle1);
    s2 = bondLengthSet.getLength_0(bond2) * $wnd.Math.sin(angle2);
    dyMax = s1 + s2;
    dyMin = s1 - s2;
    min_0 = $wnd.Math.sqrt(dx * dx + dyMin * dyMin);
    max_0 = $wnd.Math.sqrt(dx * dx + dyMax * dyMax);
    notAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    notAtom[0] = mol.getBondAtom_0(0, centralBond);
    notAtom[1] = mol.getBondAtom_0(1, centralBond);
    currentRule = rule[atom[0]][atom[1]];
    if (isNull(currentRule)) {
      setCheck(rule[atom[0]], atom[1], new ooccs.DistanceRule_1(atom, notAtom, min_0, max_0, 3));
    } else {
      currentRule.mDistance[0] = $wnd.Math.min(currentRule.mDistance[0], min_0);
      currentRule.mDistance[1] = $wnd.Math.min(currentRule.mDistance[1], max_0);
    }
  };
  ooccs.setDoubleBondDistance = function setDoubleBondDistance(atom1, atom2, bond1, bond2, angle1, angle2, ezBond, isE, bondLengthSet, rule, mol) {
    var notAtom, s1, s2;
    s1 = bondLengthSet.getLength_0(ezBond) - bondLengthSet.getLength_0(bond1) * $wnd.Math.cos(angle1) - bondLengthSet.getLength_0(bond2) * $wnd.Math.cos(angle2);
    s2 = bondLengthSet.getLength_0(bond1) * $wnd.Math.sin(angle1);
    if (isE)
      s2 += bondLengthSet.getLength_0(bond2) * $wnd.Math.sin(angle2);
    else
      s2 -= bondLengthSet.getLength_0(bond2) * $wnd.Math.sin(angle2);
    notAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    notAtom[0] = mol.getBondAtom_0(0, ezBond);
    notAtom[1] = mol.getBondAtom_0(1, ezBond);
    ooccs.setFixedDistance(rule, ooccs.combineAtoms(atom1, atom2), notAtom, $wnd.Math.sqrt(s1 * s1 + s2 * s2), 3);
  };
  ooccs.setFixedDistance = function setFixedDistance(rule, atom, notList, distance, priority) {
    if (isNull(rule[atom[0]][atom[1]])) {
      setCheck(rule[atom[0]], atom[1], new ooccs.DistanceRule_2(atom, notList, distance, priority));
    } else if (rule[atom[0]][atom[1]].mDistance.length == 2 || rule[atom[0]][atom[1]].mPriority < priority) {
      setCheck(rule[atom[0]], atom[1], new ooccs.DistanceRule_2(atom, notList, distance, priority));
    } else if (rule[atom[0]][atom[1]].mPriority == priority) {
      rule[atom[0]][atom[1]].mDistance[0] = (rule[atom[0]][atom[1]].mDistance[0] + distance) / 2;
      rule[atom[0]][atom[1]].mNotList = ooccs.mergeNotLists(rule[atom[0]][atom[1]].mNotList, notList);
    }
  };
  ooccs.setSingleBondConnAtomDistance = function setSingleBondConnAtomDistance(atom1, atom2, bond1, bond2, angle1, angle2, centralBond, bondLengthSet, rule, mol) {
    var atom, cosTorsion, currentRule, dx, dyMax, dyMin, dz, max_0, min_0, notAtom, ringSize, s1, s2, sinTorsion;
    if (atom1 == atom2)
      return;
    atom = ooccs.combineAtoms(atom1, atom2);
    if (isNotNull(rule[atom[0]][atom[1]]) && rule[atom[0]][atom[1]].isFixedDistance())
      return;
    sinTorsion = 0.866;
    cosTorsion = 0.5;
    if (mol.isRingBond_0(centralBond)) {
      ringSize = mol.getBondRingSize_0(centralBond);
      if (ringSize < 6) {
        sinTorsion = 0;
        cosTorsion = 1;
      }
    }
    dx = bondLengthSet.getLength_0(centralBond) - bondLengthSet.getLength_0(bond1) * $wnd.Math.cos(angle1) - bondLengthSet.getLength_0(bond2) * $wnd.Math.cos(angle2);
    s1 = bondLengthSet.getLength_0(bond1) * $wnd.Math.sin(angle1);
    s2 = bondLengthSet.getLength_0(bond2) * $wnd.Math.sin(angle2);
    dyMax = s1 + s2;
    dyMin = s1 - s2 * cosTorsion;
    dz = s2 * sinTorsion;
    min_0 = $wnd.Math.sqrt(dx * dx + dyMin * dyMin + dz * dz);
    max_0 = $wnd.Math.sqrt(dx * dx + dyMax * dyMax);
    notAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    notAtom[0] = mol.getBondAtom_0(0, centralBond);
    notAtom[1] = mol.getBondAtom_0(1, centralBond);
    currentRule = rule[atom[0]][atom[1]];
    if (isNull(currentRule)) {
      setCheck(rule[atom[0]], atom[1], new ooccs.DistanceRule_1(atom, notAtom, min_0, max_0, 3));
    } else {
      currentRule.mDistance[0] = $wnd.Math.min(currentRule.mDistance[0], min_0);
      currentRule.mDistance[1] = $wnd.Math.min(currentRule.mDistance[1], max_0);
    }
  };
  defineClass(101, 39, { 1: 1, 39: 1, 101: 1 }, ooccs.DistanceRule, ooccs.DistanceRule_0, ooccs.DistanceRule_1, ooccs.DistanceRule_2);
  _.$init_427 = function $init_427() {
  };
  _.addStrain = function addStrain_0(conformer, atomStrain) {
    var strain;
    strain = this.getStrain(conformer);
    if (jsNotEquals(atomStrain, null) && strain > 0) {
      atomStrain[this.mAtom[0]] += strain / 2;
      atomStrain[this.mAtom[1]] += strain / 2;
    }
    return strain;
  };
  _.apply_4 = function apply_22(conformer, cycleFactor) {
    var distance, distanceFactor, dx, dy, dz, factor, mol;
    dx = conformer.getX_0(this.mAtom[1]) - conformer.getX_0(this.mAtom[0]);
    dy = conformer.getY_0(this.mAtom[1]) - conformer.getY_0(this.mAtom[0]);
    dz = conformer.getZ(this.mAtom[1]) - conformer.getZ(this.mAtom[0]);
    distance = $wnd.Math.sqrt(dx * dx + dy * dy + dz * dz);
    distanceFactor = 0;
    if (this.mDistance.length == 2) {
      if (distance < this.mDistance[0]) {
        distanceFactor = (distance - this.mDistance[0]) / distance;
      } else if (distance > this.mDistance[1]) {
        distanceFactor = (distance - this.mDistance[1]) / distance;
      }
    } else {
      if (distance < this.mDistance[0]) {
        distanceFactor = (distance - this.mDistance[0]) / distance;
      } else if (distance > this.mDistance[0]) {
        distanceFactor = (distance - this.mDistance[0]) / distance;
      }
    }
    if ($wnd.Math.abs(distanceFactor) < 1e-3)
      return false;
    factor = cycleFactor * distanceFactor;
    mol = conformer.getMolecule_0();
    if (this.mPriority == 10) {
      if (mol.getAllConnAtoms_0(this.mAtom[0]) == 1 && mol.getAllConnAtoms_0(this.mAtom[1]) != 1) {
        conformer.getCoordinates(this.mAtom[0]).add_2(dx * factor, dy * factor, dz * factor);
        return true;
      }
      if (mol.getAllConnAtoms_0(this.mAtom[0]) != 1 && mol.getAllConnAtoms_0(this.mAtom[1]) == 1) {
        conformer.getCoordinates(this.mAtom[1]).add_2(-dx * factor, -dy * factor, -dz * factor);
        return true;
      }
    }
    factor /= 2;
    this.moveGroup(conformer, this.mAtom[0], this.mNotList, dx * factor, dy * factor, dz * factor);
    this.moveGroup(conformer, this.mAtom[1], this.mNotList, -dx * factor, -dy * factor, -dz * factor);
    return true;
  };
  _.calculateDirectConnectionStrain = function calculateDirectConnectionStrain(deltaDistance) {
    return 1e4 * deltaDistance * deltaDistance;
  };
  _.calculateRelaxedStrain = function calculateRelaxedStrain(deltaDistance) {
    return 4e3 * deltaDistance * deltaDistance;
  };
  _.calculateTwoBondStrain = function calculateTwoBondStrain(deltaDistance) {
    return 8e3 * deltaDistance * deltaDistance;
  };
  _.calculateVDWStrain = function calculateVDWStrain(mol, distance) {
    var constant, reldist, reldist6, vdwradii;
    vdwradii = 1.02 * ooccs.getVDWRadius(this.mAtom[1], mol) + ooccs.getVDWRadius(this.mAtom[0], mol);
    reldist = distance / vdwradii;
    reldist6 = $wnd.Math.pow(reldist, -6);
    constant = 2;
    return reldist >= 1 ? 0 : constant * (reldist6 * reldist6 - reldist6);
  };
  _.getRuleType = function getRuleType_0() {
    return 0;
  };
  _.getStrain = function getStrain(conformer) {
    var distance, strain;
    distance = conformer.getCoordinates(this.mAtom[1]).distance(conformer.getCoordinates(this.mAtom[0]));
    if (this.mDistance.length == 2) {
      if (distance < 1.02 * this.mDistance[0]) {
        return this.calculateVDWStrain(conformer.getMolecule_0(), distance);
      } else if (distance > this.mDistance[1]) {
        return this.calculateRelaxedStrain((distance - this.mDistance[1]) / distance);
      }
    } else {
      strain = this.mPriority == 10 ? this.calculateDirectConnectionStrain($wnd.Math.abs(this.mDistance[0] - distance) / $wnd.Math.max(this.mDistance[0], distance)) : this.mPriority == 5 ? this.calculateTwoBondStrain($wnd.Math.abs(this.mDistance[0] - distance) / $wnd.Math.max(this.mDistance[0], distance)) : this.calculateRelaxedStrain($wnd.Math.abs(this.mDistance[0] - distance) / $wnd.Math.max(this.mDistance[0], distance));
      if ($wnd.Math.abs(strain) > 0.009999999776482582)
        return strain;
    }
    return 0;
  };
  _.isFixedDistance = function isFixedDistance() {
    return this.mDistance.length == 1;
  };
  _.toString_0 = function toString_72() {
    var i, sb;
    sb = new jl.StringBuilder_1("distance rule:");
    getClassPrototype(39).addAtomList.call(this, sb);
    if (this.mDistance.length == 1)
      sb.append_9(" distance:" + caru.toString_22(this.mDistance[0]));
    else
      sb.append_9(" min:" + caru.toString_22(this.mDistance[0]) + " max:" + caru.toString_22(this.mDistance[1]));
    if (jsNotEquals(this.mNotList, null)) {
      sb.append_9(" not:" + this.mNotList[0]);
      for (i = 1; i < this.mNotList.length; i++)
        sb.append_9("," + this.mNotList[i]);
    }
    return sb.toString_0();
  };
  _.mPriority = 0;
  ooccs.PRIORITY_DISCONNECTED = 0;
  ooccs.PRIORITY_FOUR_AND_MORE_BONDS = 1;
  ooccs.PRIORITY_ONE_BOND = 10;
  ooccs.PRIORITY_THREE_BONDS = 3;
  ooccs.PRIORITY_TWO_BONDS = 5;
  ooccs.VDW_RADIUS_CORRECTION = 1.02;
  cggl.Lorg_openmolecules_chem_conf_so_DistanceRule_2_classLit = createForClass("org.openmolecules.chem.conf.so", "DistanceRule", 101, cggl.Lorg_openmolecules_chem_conf_so_ConformationRule_2_classLit);
  ooccs.$clinit_PlaneRule = function $clinit_PlaneRule() {
    ooccs.$clinit_PlaneRule = emptyMethod;
    ooccs.$clinit_ConformationRule();
  };
  ooccs.PlaneRule = function PlaneRule(atom, mol) {
    var count, i, i0;
    ooccs.ConformationRule.call(this, atom);
    this.$init_428();
    count = 0;
    for (i0 = 0; i0 < atom.length; i0++)
      if (mol.getConnAtoms_0(atom[i0]) != 1)
        count++;
    if (count > 2) {
      this.mPlaneAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, count, 15, 1);
      count = 0;
      for (i = 0; i < atom.length; i++)
        if (mol.getConnAtoms_0(atom[i]) != 1)
          this.mPlaneAtom[count++] = atom[i];
    } else {
      this.mPlaneAtom = atom;
    }
  };
  ooccs.calculateRules_1 = function calculateRules_1(ruleList, mol) {
    ooccs.$clinit_PlaneRule();
    var atom, atomList, atomicNo, bond, bond0, bond1, bondAtom1, bondAtom2, carbon, connAtom, count, fragmentAtom, i, i0, isAromaticRing, isFlatBond, isFlatBondAtom, j, ring, ringSet;
    isFlatBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getBonds_0(), 16, 1);
    ringSet = mol.getRingSet_0();
    isAromaticRing = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, ringSet.getSize_0(), 16, 1);
    ringSet.determineAromaticity_1(isAromaticRing, initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, ringSet.getSize_0(), 16, 1), initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, ringSet.getSize_0(), 15, 1), true);
    for (ring = 0; ring < ringSet.getSize_0(); ring++)
      if (isAromaticRing[ring])
        for (i0 = 0; i0 < ringSet.getRingSize_0(ring); i0++)
          isFlatBond[ringSet.getRingBonds_0(ring)[i0]] = true;
    atomicNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
    for (bond0 = 0; bond0 < mol.getBonds_0(); bond0++) {
      bondAtom1 = mol.getBondAtom_0(0, bond0);
      bondAtom2 = mol.getBondAtom_0(1, bond0);
      atomicNo[0] = mol.getAtomicNo_0(bondAtom1);
      atomicNo[1] = mol.getAtomicNo_0(bondAtom2);
      isFlatBond[bond0] = isFlatBond[bond0] | (mol.isAromaticBond_0(bond0) || mol.getBondOrder_0(bond0) == 2 && atomicNo[0] <= 8 && atomicNo[1] <= 8 && mol.getAtomPi_0(bondAtom1) == 1 && mol.getAtomPi_0(bondAtom2) == 1 && mol.getAllConnAtoms_0(bondAtom1) > 1 && mol.getAllConnAtoms_0(bondAtom2) > 1);
      if (!isFlatBond[bond0]) {
        if (mol.getBondOrder_0(bond0) == 1) {
          for (i = 0; i < 2; i++) {
            if ((atomicNo[i] == 7 || atomicNo[i] == 8) && atomicNo[1 - i] == 6) {
              carbon = mol.getBondAtom_0(1 - i, bond0);
              for (j = 0; j < mol.getConnAtoms_0(carbon); j++) {
                if (mol.getConnBondOrder_0(carbon, j) == 2) {
                  connAtom = mol.getConnAtom_0(carbon, j);
                  if (mol.getAtomicNo_0(connAtom) == 7 || mol.getAtomicNo_0(connAtom) == 8 || mol.getAtomicNo_0(connAtom) == 16) {
                    isFlatBond[bond0] = true;
                    break;
                  }
                }
              }
            }
          }
        }
      }
    }
    isFlatBondAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAtoms_0(), 16, 1);
    for (bond1 = 0; bond1 < mol.getBonds_0(); bond1++) {
      if (isFlatBond[bond1]) {
        isFlatBondAtom[mol.getBondAtom_0(0, bond1)] = true;
        isFlatBondAtom[mol.getBondAtom_0(1, bond1)] = true;
      }
    }
    fragmentAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 15, 1);
    for (bond = 0; bond < mol.getBonds_0(); bond++) {
      if (isFlatBond[bond]) {
        fragmentAtom[0] = mol.getBondAtom_0(0, bond);
        count = ooccs.getFlatFragmentAtoms(fragmentAtom, isFlatBond, mol);
        atomList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, count, 15, 1);
        for (i = 0; i < count; i++)
          atomList[i] = fragmentAtom[i];
        ruleList.add(new ooccs.PlaneRule(atomList, mol));
      }
    }
    for (atom = 0; atom < mol.getAtoms_0(); atom++) {
      if (!isFlatBondAtom[atom]) {
        if (mol.getAtomicNo_0(atom) == 5 && mol.getAtomCharge_0(atom) == 0 && mol.getAllConnAtoms_0(atom) <= 3 || mol.getAtomicNo_0(atom) <= 8 && mol.getAtomPi_0(atom) == 1 && mol.getAllConnAtoms_0(atom) > 1 || mol.isFlatNitrogen_0(atom) && mol.getAtomPi_0(atom) != 2 && mol.getAllConnAtoms_0(atom) > 1) {
          atomList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 1 + mol.getAllConnAtoms_0(atom), 15, 1);
          for (i = 0; i < mol.getAllConnAtoms_0(atom); i++)
            atomList[i] = mol.getConnAtom_0(atom, i);
          atomList[mol.getAllConnAtoms_0(atom)] = atom;
          ruleList.add(new ooccs.PlaneRule(atomList, mol));
        }
      }
    }
  };
  ooccs.getFlatFragmentAtoms = function getFlatFragmentAtoms(fragmentAtom, isFlatBond, mol) {
    var candidateAtom, candidateBond, connAtom, current, highest, i, i0, isFragmentMember, j;
    isFragmentMember = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 16, 1);
    isFragmentMember[fragmentAtom[0]] = true;
    current = 0;
    highest = 0;
    while (current <= highest && mol.getAtomPi_0(fragmentAtom[current]) < 2) {
      for (i0 = 0; i0 < mol.getConnAtoms_0(fragmentAtom[current]); i0++) {
        candidateAtom = mol.getConnAtom_0(fragmentAtom[current], i0);
        candidateBond = mol.getConnBond_0(fragmentAtom[current], i0);
        if (isFlatBond[candidateBond]) {
          if (!isFragmentMember[candidateAtom]) {
            fragmentAtom[++highest] = candidateAtom;
            isFragmentMember[candidateAtom] = true;
          }
          isFlatBond[candidateBond] = false;
        }
      }
      current++;
    }
    for (i = highest; i >= 0; i--) {
      if (mol.getAtomicNo_0(fragmentAtom[i]) <= 8) {
        for (j = 0; j < mol.getAllConnAtoms_0(fragmentAtom[i]); j++) {
          connAtom = mol.getConnAtom_0(fragmentAtom[i], j);
          if (!isFragmentMember[connAtom] && mol.getConnBondOrder_0(fragmentAtom[i], j) != 0) {
            fragmentAtom[++highest] = connAtom;
            isFragmentMember[connAtom] = true;
          }
        }
      }
    }
    return highest + 1;
  };
  defineClass(266, 39, { 1: 1, 39: 1 }, ooccs.PlaneRule);
  _.$init_428 = function $init_428() {
  };
  _.addStrain = function addStrain_1(conformer, atomStrain) {
    var cog, coords, distance, i, n, panalty, totalStrain;
    cog = new carc2.Coordinates_0();
    n = new carc2.Coordinates_0();
    coords = initMultidimensionalArray(cggl.D_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 11: 1, 4: 1, 1: 1 }], [11, 5], 15, [this.mAtom.length, 3], 2);
    ooccs.calculateNearestPlane(conformer, this.mAtom, cog, n, coords);
    totalStrain = 0;
    for (i = 0; i < this.mAtom.length; i++) {
      distance = -(n.x_0 * coords[i][0] + n.y_0 * coords[i][1] + n.z_0 * coords[i][2]);
      panalty = 20 * distance * distance;
      if (jsNotEquals(atomStrain, null))
        atomStrain[this.mAtom[i]] += panalty;
      totalStrain += panalty;
    }
    return totalStrain;
  };
  _.apply_4 = function apply_23(conformer, cycleFactor) {
    var cog, coords, distance, i, n;
    cog = new carc2.Coordinates_0();
    n = new carc2.Coordinates_0();
    coords = initMultidimensionalArray(cggl.D_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 11: 1, 4: 1, 1: 1 }], [11, 5], 15, [this.mPlaneAtom.length, 3], 2);
    ooccs.calculateNearestPlane(conformer, this.mPlaneAtom, cog, n, coords);
    for (i = 0; i < this.mAtom.length; i++) {
      distance = -(n.x_0 * (conformer.getX_0(this.mAtom[i]) - cog.x_0) + n.y_0 * (conformer.getY_0(this.mAtom[i]) - cog.y_0) + n.z_0 * (conformer.getZ(this.mAtom[i]) - cog.z_0));
      this.moveGroup(conformer, this.mAtom[i], this.mAtom, 0.5 * distance * cycleFactor * n.x_0, 0.5 * distance * cycleFactor * n.y_0, 0.5 * distance * cycleFactor * n.z_0);
    }
    return true;
  };
  _.getRuleType = function getRuleType_1() {
    return 1;
  };
  _.toString_0 = function toString_73() {
    var sb;
    sb = new jl.StringBuilder_1("plane rule:");
    getClassPrototype(39).addAtomList.call(this, sb);
    return sb.toString_0();
  };
  cggl.Lorg_openmolecules_chem_conf_so_PlaneRule_2_classLit = createForClass("org.openmolecules.chem.conf.so", "PlaneRule", 266, cggl.Lorg_openmolecules_chem_conf_so_ConformationRule_2_classLit);
  ooccs.$clinit_SelfOrganizedConformer = function $clinit_SelfOrganizedConformer() {
    ooccs.$clinit_SelfOrganizedConformer = emptyMethod;
    carcc.$clinit_Conformer();
  };
  ooccs.SelfOrganizedConformer = function SelfOrganizedConformer(mol) {
    ooccs.$clinit_SelfOrganizedConformer();
    carcc.Conformer.call(this, mol);
    this.$init_429();
    this.mTotalStrain = NaN;
  };
  ooccs.SelfOrganizedConformer_0 = function SelfOrganizedConformer_0(conformer) {
    ooccs.$clinit_SelfOrganizedConformer();
    carcc.Conformer_0.call(this, conformer);
    this.$init_429();
    this.copyStrainFrom(conformer);
  };
  defineClass(54, 61, { 61: 1, 22: 1, 1: 1, 54: 1 }, ooccs.SelfOrganizedConformer, ooccs.SelfOrganizedConformer_0);
  _.$init_429 = function $init_429() {
  };
  _.calculateStrain = function calculateStrain(ruleList) {
    var atom, rule, rule$iterator;
    if (jsNotEquals(this.mAtomStrain, null))
      return;
    this.mAtomStrain = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.getMolecule_0().getAllAtoms_0(), 15, 1);
    this.mRuleStrain = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, (ooccs.$clinit_ConformationRule(), ooccs.RULE_NAME).length, 15, 1);
    for (rule$iterator = ruleList.iterator(); rule$iterator.hasNext_0(); ) {
      rule = castTo(rule$iterator.next_3(), 39);
      if (rule.isEnabled())
        this.mRuleStrain[rule.getRuleType()] += rule.addStrain(this, this.mAtomStrain);
    }
    this.mTotalStrain = 0;
    for (atom = 0; atom < this.getMolecule_0().getAllAtoms_0(); atom++)
      this.mTotalStrain += this.mAtomStrain[atom];
    this.mLikelihood = -1;
  };
  _.copyFrom_1 = function copyFrom_1(conformer) {
    getClassPrototype(61).copyFrom_0.call(this, conformer);
    this.copyStrainFrom(conformer);
  };
  _.copyStrainFrom = function copyStrainFrom(conformer) {
    this.mTotalStrain = conformer.mTotalStrain;
    this.mLikelihood = conformer.mLikelihood;
    this.mIsUsed = conformer.mIsUsed;
    this.mAtomStrain = jsEquals(conformer.mAtomStrain, null) ? null : ju.copyOf_8(conformer.mAtomStrain, conformer.mAtomStrain.length);
    this.mRuleStrain = jsEquals(conformer.mRuleStrain, null) ? null : ju.copyOf_8(conformer.mRuleStrain, conformer.mRuleStrain.length);
  };
  _.getAtomStrain = function getAtomStrain(atom) {
    return jsEquals(this.mAtomStrain, null) ? NaN : this.mAtomStrain[atom];
  };
  _.getLikelihood = function getLikelihood_1() {
    if (this.mLikelihood == -1)
      this.mLikelihood = $wnd.Math.pow(10, -this.mTotalStrain / 1.36);
    return this.mLikelihood;
  };
  _.getRuleStrain_0 = function getRuleStrain_0(rule) {
    return jsEquals(this.mRuleStrain, null) ? NaN : this.mRuleStrain[rule];
  };
  _.getTotalStrain = function getTotalStrain() {
    return this.mTotalStrain;
  };
  _.invalidateStrain = function invalidateStrain() {
    this.mTotalStrain = 17976931348623157e292;
    this.mAtomStrain = null;
    this.mRuleStrain = null;
  };
  _.isUsed = function isUsed_1() {
    return this.mIsUsed;
  };
  _.isWorseThan = function isWorseThan(conformer) {
    return this.mTotalStrain > conformer.mTotalStrain;
  };
  _.setUsed_0 = function setUsed_0(isUsed) {
    this.mIsUsed = isUsed;
  };
  _.mIsUsed = false;
  _.mLikelihood = 0;
  _.mTotalStrain = 0;
  ooccs.STRAIN_FOR_LIKELIHOOD_FACTOR_10 = 1.36;
  cggl.Lorg_openmolecules_chem_conf_so_SelfOrganizedConformer_2_classLit = createForClass("org.openmolecules.chem.conf.so", "SelfOrganizedConformer", 54, cggl.Lcom_actelion_research_chem_conf_Conformer_2_classLit);
  ooccs.$clinit_StraightLineRule = function $clinit_StraightLineRule() {
    ooccs.$clinit_StraightLineRule = emptyMethod;
    ooccs.$clinit_ConformationRule();
  };
  ooccs.StraightLineRule = function StraightLineRule(atom) {
    ooccs.ConformationRule.call(this, atom);
    this.$init_430();
  };
  ooccs.calculateRules_2 = function calculateRules_2(ruleList, mol) {
    ooccs.$clinit_StraightLineRule();
    var atom, atomHandled, atomList, i;
    atomHandled = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 16, 1);
    for (atom = 0; atom < mol.getAtoms_0(); atom++) {
      if (!atomHandled[atom] && mol.getAtomPi_0(atom) == 2 && mol.getAtomicNo_0(atom) <= 8) {
        atomList = ooccs.getLineFragmentAtoms(atom, mol);
        for (i = 0; i < atomList.length; i++)
          atomHandled[atomList[i]] = true;
        if (atomList[0] != atomList[atomList.length - 1])
          ruleList.add(new ooccs.StraightLineRule(atomList));
      }
    }
  };
  ooccs.getLineFragmentAtoms = function getLineFragmentAtoms(seedAtom, mol) {
    var atomList, backAtom, count, firstAtom, headAtom, i, rearAtom, tempAtom;
    firstAtom = seedAtom;
    backAtom = mol.getConnAtom_0(firstAtom, 0);
    while (mol.getAllConnAtoms_0(firstAtom) != 1 && mol.getAtomPi_0(firstAtom) == 2) {
      tempAtom = backAtom;
      backAtom = firstAtom;
      firstAtom = mol.getConnAtom_0(firstAtom, 0) == tempAtom ? mol.getConnAtom_0(firstAtom, 1) : mol.getConnAtom_0(firstAtom, 0);
      if (firstAtom == seedAtom)
        break;
    }
    rearAtom = firstAtom;
    headAtom = backAtom;
    count = 2;
    while (mol.getAllConnAtoms_0(headAtom) != 1 && mol.getAtomPi_0(headAtom) == 2) {
      tempAtom = rearAtom;
      rearAtom = headAtom;
      headAtom = mol.getConnAtom_0(headAtom, 0) == tempAtom ? mol.getConnAtom_0(headAtom, 1) : mol.getConnAtom_0(headAtom, 0);
      count++;
      if (headAtom == firstAtom)
        break;
    }
    atomList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, count, 15, 1);
    atomList[0] = firstAtom;
    atomList[1] = backAtom;
    for (i = 2; i < count; i++)
      atomList[i] = mol.getConnAtom_0(atomList[i - 1], 0) == atomList[i - 2] ? mol.getConnAtom_0(atomList[i - 1], 1) : mol.getConnAtom_0(atomList[i - 1], 0);
    return atomList;
  };
  defineClass(457, 39, { 1: 1, 39: 1 }, ooccs.StraightLineRule);
  _.$init_430 = function $init_430() {
  };
  _.addStrain = function addStrain_2(conformer, atomStrain) {
    var A, S, U, cog, dx, dy, dz, i, i0, i1, i2, i3, i4, j, j0, k, lambda, maxIndex, n, squareMatrix, strain, svd, totalStrain;
    cog = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    for (i0 = 0; i0 < this.mAtom.length; i0++) {
      cog[0] += conformer.getX_0(this.mAtom[i0]);
      cog[1] += conformer.getY_0(this.mAtom[i0]);
      cog[2] += conformer.getZ(this.mAtom[i0]);
    }
    for (j0 = 0; j0 < 3; j0++)
      cog[j0] /= this.mAtom.length;
    A = initMultidimensionalArray(cggl.D_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 11: 1, 4: 1, 1: 1 }], [11, 5], 15, [this.mAtom.length, 3], 2);
    for (i1 = 0; i1 < this.mAtom.length; i1++) {
      A[i1][0] = conformer.getX_0(this.mAtom[i1]) - cog[0];
      A[i1][1] = conformer.getY_0(this.mAtom[i1]) - cog[1];
      A[i1][2] = conformer.getZ(this.mAtom[i1]) - cog[2];
    }
    squareMatrix = initMultidimensionalArray(cggl.D_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 11: 1, 4: 1, 1: 1 }], [11, 5], 15, [3, 3], 2);
    for (i2 = 0; i2 < this.mAtom.length; i2++)
      for (j = 0; j < 3; j++)
        for (k = 0; k < 3; k++)
          squareMatrix[j][k] += A[i2][j] * A[i2][k];
    svd = new carc.SingularValueDecomposition(squareMatrix, null, null);
    S = svd.getSingularValues();
    maxIndex = 0;
    for (i3 = 1; i3 < 3; i3++)
      if (S[i3] > S[maxIndex])
        maxIndex = i3;
    U = svd.getU();
    n = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    for (i4 = 0; i4 < 3; i4++)
      n[i4] = U[i4][maxIndex];
    totalStrain = 0;
    for (i = 0; i < this.mAtom.length; i++) {
      lambda = n[0] * A[i][0] + n[1] * A[i][1] + n[2] * A[i][2];
      dx = lambda * n[0] - A[i][0];
      dy = lambda * n[1] - A[i][1];
      dz = lambda * n[2] - A[i][2];
      strain = 10 * dx * dx + dy * dy + dz * dz;
      if (jsNotEquals(atomStrain, null))
        atomStrain[this.mAtom[i]] += strain;
      totalStrain += strain;
    }
    return totalStrain;
  };
  _.apply_4 = function apply_24(conformer, cycleFactor) {
    var A, S, U, cog, i, i0, i1, i2, i3, i4, i5, i6, isInconsistent, isIncreasing, j, j0, k, lambda, maxIndex, n, squareMatrix, svd;
    cog = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    for (i0 = 0; i0 < this.mAtom.length; i0++) {
      cog[0] += conformer.getX_0(this.mAtom[i0]);
      cog[1] += conformer.getY_0(this.mAtom[i0]);
      cog[2] += conformer.getZ(this.mAtom[i0]);
    }
    for (j0 = 0; j0 < 3; j0++)
      cog[j0] /= this.mAtom.length;
    A = initMultidimensionalArray(cggl.D_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 11: 1, 4: 1, 1: 1 }], [11, 5], 15, [this.mAtom.length, 3], 2);
    for (i1 = 0; i1 < this.mAtom.length; i1++) {
      A[i1][0] = conformer.getX_0(this.mAtom[i1]) - cog[0];
      A[i1][1] = conformer.getY_0(this.mAtom[i1]) - cog[1];
      A[i1][2] = conformer.getZ(this.mAtom[i1]) - cog[2];
    }
    squareMatrix = initMultidimensionalArray(cggl.D_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 11: 1, 4: 1, 1: 1 }], [11, 5], 15, [3, 3], 2);
    for (i2 = 0; i2 < this.mAtom.length; i2++)
      for (j = 0; j < 3; j++)
        for (k = 0; k < 3; k++)
          squareMatrix[j][k] += A[i2][j] * A[i2][k];
    svd = new carc.SingularValueDecomposition(squareMatrix, null, null);
    S = svd.getSingularValues();
    maxIndex = 0;
    for (i3 = 1; i3 < 3; i3++)
      if (S[i3] > S[maxIndex])
        maxIndex = i3;
    U = svd.getU();
    n = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    for (i4 = 0; i4 < 3; i4++)
      n[i4] = U[i4][maxIndex];
    lambda = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, this.mAtom.length, 15, 1);
    for (i5 = 0; i5 < this.mAtom.length; i5++)
      lambda[i5] = n[0] * A[i5][0] + n[1] * A[i5][1] + n[2] * A[i5][2];
    if (cycleFactor == 1) {
      isInconsistent = false;
      isIncreasing = lambda[0] < lambda[1];
      for (i6 = 2; i6 < this.mAtom.length; i6++) {
        if (isIncreasing != lambda[i6 - 1] < lambda[i6]) {
          isInconsistent = true;
          break;
        }
      }
      if (isInconsistent)
        return false;
    }
    for (i = 0; i < this.mAtom.length; i++) {
      conformer.getCoordinates(this.mAtom[i]).add_2(cycleFactor * (lambda[i] * n[0] - A[i][0]), cycleFactor * (lambda[i] * n[1] - A[i][1]), cycleFactor * (lambda[i] * n[2] - A[i][2]));
    }
    return true;
  };
  _.getRuleType = function getRuleType_2() {
    return 2;
  };
  _.toString_0 = function toString_74() {
    var sb;
    sb = new jl.StringBuilder_1("line rule:");
    getClassPrototype(39).addAtomList.call(this, sb);
    return sb.toString_0();
  };
  cggl.Lorg_openmolecules_chem_conf_so_StraightLineRule_2_classLit = createForClass("org.openmolecules.chem.conf.so", "StraightLineRule", 457, cggl.Lorg_openmolecules_chem_conf_so_ConformationRule_2_classLit);
  ooccs.$clinit_TetrahedralStereoRule = function $clinit_TetrahedralStereoRule() {
    ooccs.$clinit_TetrahedralStereoRule = emptyMethod;
    ooccs.$clinit_ConformationRule();
  };
  ooccs.TetrahedralStereoRule = function TetrahedralStereoRule(mol, neighbourAtom, neighbourBond) {
    ooccs.ConformationRule.call(this, neighbourAtom);
    this.$init_431();
    this.calculateRotatableAtoms(mol, neighbourAtom, neighbourBond);
  };
  ooccs.calculateRules_3 = function calculateRules_3(ruleList, mol) {
    ooccs.$clinit_TetrahedralStereoRule();
    var atom, atomList, bondList, connAtom, connBond, i, index_0, j, parity, temp;
    for (atom = 0; atom < mol.getAtoms_0(); atom++) {
      if (mol.getAllConnAtoms_0(atom) >= 3) {
        parity = mol.getAtomParity_0(atom);
        if ((parity == 1 || parity == 2) && !mol.isCentralAlleneAtom(atom)) {
          atomList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 5, 15, 1);
          bondList = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
          for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
            connAtom = mol.getConnAtom_0(atom, i);
            connBond = mol.getConnBond_0(atom, i);
            index_0 = 0;
            while (index_0 < i && connAtom > atomList[index_0])
              index_0++;
            for (j = i - 1; j >= index_0; j--) {
              atomList[j + 1] = atomList[j];
              bondList[j + 1] = bondList[j];
            }
            atomList[index_0] = connAtom;
            bondList[index_0] = connBond;
          }
          if (mol.getAllConnAtoms_0(atom) == 3) {
            atomList[3] = -1;
            bondList[3] = -1;
          }
          atomList[4] = atom;
          if (parity == 1) {
            temp = atomList[1];
            atomList[1] = atomList[0];
            atomList[0] = temp;
            temp = bondList[1];
            bondList[1] = bondList[0];
            bondList[0] = temp;
          }
          ruleList.add(new ooccs.TetrahedralStereoRule(mol, atomList, bondList));
        }
      }
    }
  };
  defineClass(458, 39, { 1: 1, 39: 1 }, ooccs.TetrahedralStereoRule);
  _.$init_431 = function $init_431() {
  };
  _.addStrain = function addStrain_3(conformer, atomStrain) {
    var i, n, panalty, totalStrain, wrongCount;
    totalStrain = 0;
    n = this.getPlaneVector(conformer);
    wrongCount = 0;
    if (this.mAtom[3] == -1) {
      if (!this.isOnSameSide(conformer, n, this.mAtom[4], this.mAtom[2]))
        wrongCount++;
    } else {
      if (!this.isOnSameSide(conformer, n, this.mAtom[4], this.mAtom[2]))
        wrongCount++;
      if (this.isOnSameSide(conformer, n, this.mAtom[4], this.mAtom[3]))
        wrongCount++;
    }
    if (wrongCount != 0) {
      for (i = 0; i < this.mAtom.length; i++) {
        if (this.mAtom[i] != -1) {
          panalty = 0.68 * wrongCount;
          if (jsNotEquals(atomStrain, null))
            atomStrain[this.mAtom[i]] += panalty;
          totalStrain += panalty;
        }
      }
    }
    return totalStrain;
  };
  _.apply_4 = function apply_25(conformer, cycleFactor) {
    var atom, atom$array, atom$index, atom$max, invert, n, rotationAxis;
    n = this.getPlaneVector(conformer);
    invert = this.mAtom[3] == -1 && !this.isOnSameSide(conformer, n, this.mAtom[4], this.mAtom[2]) || this.mAtom[3] != -1 && !this.isOnSameSide(conformer, n, this.mAtom[4], this.mAtom[2]) && this.isOnSameSide(conformer, n, this.mAtom[4], this.mAtom[3]);
    if (!invert)
      return false;
    rotationAxis = this.calculateRotationAxis(conformer);
    for (atom$array = this.mRotatableAtom, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
      atom = atom$array[atom$index];
      ooccs.rotateAtom(conformer, atom, conformer.getCoordinates(this.mAtom[4]), rotationAxis, 3.141592653589793);
    }
    return true;
  };
  _.calculateRotatableAtoms = function calculateRotatableAtoms(mol, neighbourAtom, neighbourBond) {
    var a, b, b$array, b$index, b$max, f, f$array, f$index, f$max, f0, fragmentCount, fragmentNo, fragmentSize, i, i0, i1, i2, i3, i4, index_0, isNeighbourFragment, isRotatableAtom, isSmallerFragment, j, k, k$array, k$array0, k$array1, k$array2, k$index, k$index0, k$index1, k$index2, k$max, k$max0, k$max1, k$max2, lastSmallestFragmentIndex, neglectBond, neighbourFragmentBondCount, neighbourFragmentCount, neighbourFragmentNo, neighbourFragmentSize, neighbours, remainingNeighboursToRotate, rotatableAtomCount, rotatableIndex, smallestFragmentIndex, smallestFragmentSize, staticIndex, staticNeighbourCount, stereoCenter;
    stereoCenter = neighbourAtom[4];
    neighbours = neighbourAtom[3] == -1 ? 3 : 4;
    fragmentNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 15, 1);
    neglectBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAllBonds_0(), 16, 1);
    for (i0 = 0; i0 < neighbours; i0++)
      neglectBond[neighbourBond[i0]] = true;
    fragmentCount = mol.getFragmentNumbers_1(fragmentNo, neglectBond, false);
    fragmentSize = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, fragmentCount, 15, 1);
    for (f$array = fragmentNo, f$index = 0, f$max = f$array.length; f$index < f$max; ++f$index) {
      f0 = f$array[f$index];
      fragmentSize[f0]++;
    }
    neighbourFragmentCount = 0;
    isNeighbourFragment = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, fragmentCount, 16, 1);
    for (i1 = 0; i1 < neighbours; i1++) {
      f0 = fragmentNo[neighbourAtom[i1]];
      if (!isNeighbourFragment[f0]) {
        isNeighbourFragment[f0] = true;
        neighbourFragmentCount++;
      }
    }
    neighbourFragmentNo = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, neighbourFragmentCount, 15, 1);
    neighbourFragmentSize = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, neighbourFragmentCount, 15, 1);
    neighbourFragmentBondCount = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, neighbourFragmentCount, 15, 1);
    index_0 = 0;
    for (f = 0; f < fragmentCount; f++) {
      if (isNeighbourFragment[f]) {
        neighbourFragmentNo[index_0] = f;
        neighbourFragmentSize[index_0] = fragmentSize[f];
        for (i2 = 0; i2 < neighbours; i2++)
          if (f == fragmentNo[neighbourAtom[i2]])
            neighbourFragmentBondCount[index_0]++;
        index_0++;
      }
    }
    isRotatableAtom = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAllAtoms_0(), 16, 1);
    rotatableAtomCount = 0;
    staticNeighbourCount = 2;
    if (neighbourFragmentCount == neighbours) {
      lastSmallestFragmentIndex = -1;
      for (i2 = 0; i2 < neighbours - 2; i2++) {
        smallestFragmentIndex = -1;
        smallestFragmentSize = 2147483647;
        for (j = 0; j < neighbourFragmentCount; j++) {
          if (j != lastSmallestFragmentIndex && neighbourFragmentSize[j] < smallestFragmentSize) {
            smallestFragmentIndex = j;
            smallestFragmentSize = neighbourFragmentSize[j];
          }
        }
        for (a = 0; a < mol.getAllAtoms_0(); a++) {
          if (fragmentNo[a] == neighbourFragmentNo[smallestFragmentIndex]) {
            isRotatableAtom[a] = true;
            rotatableAtomCount++;
          }
        }
        lastSmallestFragmentIndex = smallestFragmentIndex;
      }
    } else {
      for (i2 = 0; i2 < neighbourFragmentNo.length; i2++) {
        if (neighbourFragmentBondCount[i2] == 1 && neighbours == 3) {
          isSmallerFragment = 2 * neighbourFragmentSize[i2] < mol.getAllAtoms_0();
          if (!isSmallerFragment)
            staticNeighbourCount = 1;
          for (a = 0; a < mol.getAllAtoms_0(); a++) {
            if (a != stereoCenter) {
              if (fragmentNo[a] == neighbourFragmentNo[i2] == isSmallerFragment) {
                isRotatableAtom[a] = true;
                rotatableAtomCount++;
              }
            }
          }
          break;
        }
        if (neighbourFragmentBondCount[i2] == 2 && neighbours == 4) {
          isSmallerFragment = 2 * neighbourFragmentSize[i2] < mol.getAllAtoms_0();
          for (a = 0; a < mol.getAllAtoms_0(); a++) {
            if (a != stereoCenter) {
              if (fragmentNo[a] == neighbourFragmentNo[i2] == isSmallerFragment) {
                isRotatableAtom[a] = true;
                rotatableAtomCount++;
              }
            }
          }
          break;
        }
      }
    }
    if (rotatableAtomCount == 0) {
      for (i2 = 0; i2 < neighbourFragmentNo.length; i2++) {
        if (neighbourFragmentBondCount[i2] == 1) {
          for (a = 0; a < mol.getAllAtoms_0(); a++) {
            if (fragmentNo[a] == neighbourFragmentNo[i2]) {
              isRotatableAtom[a] = true;
              rotatableAtomCount++;
            }
          }
          break;
        }
      }
      remainingNeighboursToRotate = neighbours - 2 - (rotatableAtomCount == 0 ? 0 : 1);
      for (i3 = 0; i3 < remainingNeighboursToRotate; i3++) {
        for (j = 0; j < neighbours; j++) {
          if (!isRotatableAtom[neighbourAtom[j]]) {
            isRotatableAtom[neighbourAtom[j]] = true;
            rotatableAtomCount++;
            break;
          }
        }
      }
    }
    index_0 = 0;
    this.mRotatableAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, rotatableAtomCount, 15, 1);
    for (i4 = 0; i4 < isRotatableAtom.length; i4++)
      if (isRotatableAtom[i4])
        this.mRotatableAtom[index_0++] = i4;
    staticIndex = 0;
    rotatableIndex = 0;
    this.mStaticNeighbour = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, staticNeighbourCount, 15, 1);
    this.mRotatableNeighbour = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, neighbours - staticNeighbourCount, 15, 1);
    for (i = 0; i < neighbours; i++)
      if (isRotatableAtom[neighbourAtom[i]]) {
        if (rotatableIndex >= this.mRotatableNeighbour.length) {
          (jl.$clinit_System(), jl.out_0).println_0("##### Out of bounds exception:" + new carc2.MolfileCreator(mol).getMolfile());
          (jl.$clinit_System(), jl.out_0).print_1("neighbours:" + neighbours + " ");
          (jl.$clinit_System(), jl.out_0).print_1("neighbourAtom:");
          for (k$array0 = neighbourAtom, k$index0 = 0, k$max0 = k$array0.length; k$index0 < k$max0; ++k$index0) {
            k = k$array0[k$index0];
            (jl.$clinit_System(), jl.out_0).print_1(" " + k);
          }
          (jl.$clinit_System(), jl.out_0).println();
          (jl.$clinit_System(), jl.out_0).print_1("neighbourBond:");
          for (k$array1 = neighbourBond, k$index1 = 0, k$max1 = k$array1.length; k$index1 < k$max1; ++k$index1) {
            k = k$array1[k$index1];
            (jl.$clinit_System(), jl.out_0).print_1(" " + k);
          }
          (jl.$clinit_System(), jl.out_0).println();
          (jl.$clinit_System(), jl.out_0).print_1("fragmentNo:");
          for (k$array2 = fragmentNo, k$index2 = 0, k$max2 = k$array2.length; k$index2 < k$max2; ++k$index2) {
            k = k$array2[k$index2];
            (jl.$clinit_System(), jl.out_0).print_1(" " + k);
          }
          (jl.$clinit_System(), jl.out_0).println();
          (jl.$clinit_System(), jl.out_0).print_1("isNeighbourFragment:");
          for (k$array = isNeighbourFragment, k$index = 0, k$max = k$array.length; k$index < k$max; ++k$index) {
            k = k$array[k$index];
            (jl.$clinit_System(), jl.out_0).print_1(" " + k);
          }
          (jl.$clinit_System(), jl.out_0).println();
          (jl.$clinit_System(), jl.out_0).print_1("isRotatableAtom:");
          for (b$array = isRotatableAtom, b$index = 0, b$max = b$array.length; b$index < b$max; ++b$index) {
            b = b$array[b$index];
            (jl.$clinit_System(), jl.out_0).print_1(" " + b);
          }
          (jl.$clinit_System(), jl.out_0).println();
        }
        this.mRotatableNeighbour[rotatableIndex++] = neighbourAtom[i];
      } else
        this.mStaticNeighbour[staticIndex++] = neighbourAtom[i];
  };
  _.calculateRotationAxis = function calculateRotationAxis(conformer) {
    var atom, atom$array, atom$index, atom$max, axis_0, neighbour;
    axis_0 = new carc2.Coordinates_0();
    neighbour = this.mStaticNeighbour.length == 2 ? this.mStaticNeighbour : this.mRotatableNeighbour;
    for (atom$array = neighbour, atom$index = 0, atom$max = atom$array.length; atom$index < atom$max; ++atom$index) {
      atom = atom$array[atom$index];
      axis_0.add_3(conformer.getCoordinates(atom));
    }
    axis_0.scale_1(0.5);
    axis_0.sub_0(conformer.getCoordinates(this.mAtom[4])).unit();
    return axis_0;
  };
  _.getPlaneVector = function getPlaneVector(conformer) {
    var coords, i, v;
    coords = initMultidimensionalArray(cggl.D_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 11: 1, 4: 1, 1: 1 }], [11, 5], 15, [2, 3], 2);
    for (i = 0; i < 2; i++) {
      coords[i][0] = conformer.getX_0(this.mAtom[i]) - conformer.getX_0(this.mAtom[4]);
      coords[i][1] = conformer.getY_0(this.mAtom[i]) - conformer.getY_0(this.mAtom[4]);
      coords[i][2] = conformer.getZ(this.mAtom[i]) - conformer.getZ(this.mAtom[4]);
    }
    v = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    v[0] = coords[0][1] * coords[1][2] - coords[0][2] * coords[1][1];
    v[1] = coords[0][2] * coords[1][0] - coords[0][0] * coords[1][2];
    v[2] = coords[0][0] * coords[1][1] - coords[0][1] * coords[1][0];
    return v;
  };
  _.getRuleType = function getRuleType_3() {
    return 4;
  };
  _.isOnSameSide = function isOnSameSide(conformer, n, atom0, atom1) {
    var v;
    v = initUnidimensionalArray(cggl.D_classLit, { 11: 1, 4: 1, 1: 1 }, 5, 3, 15, 1);
    v[0] = conformer.getX_0(atom1) - conformer.getX_0(atom0);
    v[1] = conformer.getY_0(atom1) - conformer.getY_0(atom0);
    v[2] = conformer.getZ(atom1) - conformer.getZ(atom0);
    return v[0] * n[0] + v[1] * n[1] + v[2] * n[2] > 0;
  };
  _.toString_0 = function toString_75() {
    var ra, ra$array, ra$index, ra$max, sb;
    sb = new jl.StringBuilder_1("stereo rule:");
    getClassPrototype(39).addAtomList.call(this, sb);
    sb.append_9(" rotatable:");
    for (ra$array = this.mRotatableAtom, ra$index = 0, ra$max = ra$array.length; ra$index < ra$max; ++ra$index) {
      ra = ra$array[ra$index];
      sb.append_9(ra + " ");
    }
    return sb.toString_0();
  };
  cggl.Lorg_openmolecules_chem_conf_so_TetrahedralStereoRule_2_classLit = createForClass("org.openmolecules.chem.conf.so", "TetrahedralStereoRule", 458, cggl.Lorg_openmolecules_chem_conf_so_ConformationRule_2_classLit);
  ooccs.$clinit_TorsionRule = function $clinit_TorsionRule() {
    ooccs.$clinit_TorsionRule = emptyMethod;
    ooccs.$clinit_ConformationRule();
  };
  ooccs.TorsionRule = function TorsionRule(torsion, frequency, range, torsionAtom, atomToRotate, smallerSubstituentIndex) {
    ooccs.ConformationRule.call(this, torsionAtom);
    this.$init_432();
    this.mTorsion = torsion;
    this.mFrequency = frequency;
    this.mRange = range;
    this.mAtomToRotate = atomToRotate;
    this.mSmallerSubstituentIndex = smallerSubstituentIndex;
  };
  ooccs.addDegree60Rule = function addDegree60Rule(mol, bondAtom, rearAtom, hCount, ruleList) {
    var atomToRotate, connAtom, frequency, hIndex, i, range, torsion, torsionAtom;
    atomToRotate = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, hCount, 15, 1);
    torsionAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
    torsionAtom[0] = mol.getConnAtom_0(rearAtom, mol.getConnAtom_0(rearAtom, 0) == bondAtom ? 1 : 0);
    torsionAtom[1] = rearAtom;
    torsionAtom[2] = bondAtom;
    torsionAtom[3] = mol.getConnAtom_0(bondAtom, mol.getConnAtom_0(bondAtom, 0) == rearAtom ? 1 : 0);
    hIndex = 0;
    for (i = 0; i < mol.getAllConnAtoms_0(bondAtom); i++) {
      connAtom = mol.getConnAtom_0(bondAtom, i);
      if (connAtom != rearAtom)
        atomToRotate[hIndex++] = connAtom;
    }
    torsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 3, 15, 1);
    frequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, 3, 15, 1);
    range = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [3, 2], 2);
    torsion[0] = 60;
    torsion[1] = 180;
    torsion[2] = 300;
    frequency[0] = 33;
    frequency[1] = 33;
    frequency[2] = 33;
    range[0][0] = 45;
    range[0][1] = 75;
    range[1][0] = 165;
    range[1][1] = 195;
    range[2][0] = 285;
    range[2][1] = 315;
    ruleList.add(new ooccs.TorsionRule(torsion, frequency, range, torsionAtom, atomToRotate, 1));
  };
  ooccs.addHeteroPiRule = function addHeteroPiRule(mol, bondAtom, piAtom, hCount, ruleList) {
    var atomToRotate, connAtom, frequency, hIndex, j, j0, piNeighbour, range, stateCount, torsion, torsionAtom;
    piNeighbour = -1;
    for (j0 = 0; j0 < mol.getConnAtoms_0(piAtom); j0++)
      if (mol.getConnBondOrder_0(piAtom, j0) == 2)
        piNeighbour = mol.getConnAtom_0(piAtom, j0);
    atomToRotate = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, hCount, 15, 1);
    torsionAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
    torsionAtom[0] = piNeighbour;
    torsionAtom[1] = piAtom;
    torsionAtom[2] = bondAtom;
    hIndex = 0;
    for (j = 0; j < mol.getAllConnAtoms_0(bondAtom); j++) {
      connAtom = mol.getConnAtom_0(bondAtom, j);
      if (mol.getAtomicNo_0(connAtom) == 1) {
        if (hIndex == 0)
          torsionAtom[3] = connAtom;
        atomToRotate[hIndex++] = connAtom;
      }
    }
    stateCount = !mol.isAromaticAtom_0(piAtom) && hCount == 1 ? 1 : 2;
    torsion = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, stateCount, 15, 1);
    frequency = initUnidimensionalArray(cggl.S_classLit, { 4: 1, 1: 1, 13: 1 }, 5, stateCount, 15, 1);
    range = initMultidimensionalArray(cggl.S_classLit, [{ 4: 1, 1: 1, 7: 1, 40: 1 }, { 4: 1, 1: 1, 13: 1 }], [13, 5], 15, [stateCount, 2], 2);
    if (!mol.isAromaticAtom_0(piAtom) && hCount == 1) {
      torsion[0] = 0;
      frequency[0] = 100;
      range[0][0] = -15;
      range[0][1] = 15;
    } else {
      torsion[0] = 0;
      torsion[1] = 180;
      frequency[0] = 50;
      frequency[1] = 50;
      range[0][0] = -15;
      range[0][1] = 15;
      range[1][0] = 165;
      range[1][1] = 195;
    }
    ruleList.add(new ooccs.TorsionRule(torsion, frequency, range, torsionAtom, atomToRotate, 1));
  };
  ooccs.calculateRules_4 = function calculateRules_4(ruleList, mol) {
    ooccs.$clinit_TorsionRule();
    var a, atomToRotate, atomicNo, bond, bond0, bondAtom, count, frequency, hCount, i, index_0, isMemberAtom, isRotatableBond, nonHNeighbours, prediction, range, rearAtom, smallerSubstituentIndex, torsion, torsionAtom, torsionDetail, torsionID;
    carcc.initialize_2(1);
    isRotatableBond = initUnidimensionalArray(cggl.Z_classLit, { 10: 1, 4: 1, 1: 1 }, 5, mol.getAllBonds_0(), 16, 1);
    carcc.findRotatableBonds(mol, true, isRotatableBond);
    for (bond0 = 0; bond0 < mol.getBonds_0(); bond0++) {
      if (isRotatableBond[bond0]) {
        torsionAtom = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 4, 15, 1);
        torsionDetail = new carcc.TorsionDetail();
        torsionID = carcc.getTorsionID(mol, bond0, torsionAtom, torsionDetail);
        if (jsNotEquals(torsionID, null) && !ooccs.conflictWithPlaneRules(torsionAtom, ruleList)) {
          torsion = carcc.getTorsions(torsionID);
          frequency = carcc.getTorsionFrequencies(torsionID);
          range = carcc.getTorsionRanges(torsionID);
          if (jsEquals(torsion, null)) {
            prediction = new carcc.TorsionPrediction(mol, torsionAtom);
            torsion = prediction.getTorsions();
            frequency = prediction.getTorsionFrequencies();
            range = prediction.getTorsionRanges();
          }
          if (jsNotEquals(torsion, null)) {
            atomToRotate = null;
            smallerSubstituentIndex = 0;
            if (!mol.isRingBond_0(bond0)) {
              isMemberAtom = initMultidimensionalArray(cggl.Z_classLit, [{ 4: 1, 1: 1, 7: 1 }, { 10: 1, 4: 1, 1: 1 }], [10, 5], 16, [2, mol.getAllAtoms_0()], 2);
              count = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, 2, 15, 1);
              for (i = 0; i < 2; i++)
                count[i] = mol.getSubstituent_0(torsionDetail.getRearAtom(i), torsionDetail.getCentralAtom(i), isMemberAtom[i], null, null);
              smallerSubstituentIndex = count[0] < count[1] ? 0 : 1;
              atomToRotate = initUnidimensionalArray(cggl.I_classLit, { 6: 1, 4: 1, 1: 1 }, 5, count[smallerSubstituentIndex], 15, 1);
              index_0 = 0;
              for (a = 0; a < mol.getAllAtoms_0(); a++)
                if (isMemberAtom[smallerSubstituentIndex][a])
                  atomToRotate[index_0++] = a;
            }
            ruleList.add(new ooccs.TorsionRule(torsion, frequency, range, torsionAtom, atomToRotate, smallerSubstituentIndex));
          }
        }
      }
    }
    for (bond = 0; bond < mol.getBonds_0(); bond++) {
      if (mol.getBondType_0(bond) == 1 && !mol.isRingBond_0(bond)) {
        for (i = 0; i < 2; i++) {
          bondAtom = mol.getBondAtom_0(i, bond);
          nonHNeighbours = mol.getNonHydrogenNeighbourCount_0(bondAtom);
          hCount = mol.getAllConnAtoms_0(bondAtom) - nonHNeighbours;
          if (nonHNeighbours == 1 && hCount != 0) {
            rearAtom = mol.getBondAtom_0(1 - i, bond);
            atomicNo = mol.getAtomicNo_0(bondAtom);
            if (atomicNo > 6 && mol.getAtomPi_0(rearAtom) == 1)
              ooccs.addHeteroPiRule(mol, bondAtom, rearAtom, hCount, ruleList);
            else if (mol.getAtomPi_0(rearAtom) != 2 && mol.getAllConnAtoms_0(rearAtom) > 1)
              ooccs.addDegree60Rule(mol, bondAtom, rearAtom, hCount, ruleList);
            break;
          }
        }
      }
    }
  };
  ooccs.conflictWithPlaneRules = function conflictWithPlaneRules(torsionAtom, ruleList) {
    var found, pa, pa$array, pa$index, pa$max, planeAtom, rule, rule$iterator, ta, ta$array, ta$index, ta$max;
    for (rule$iterator = ruleList.iterator(); rule$iterator.hasNext_0(); ) {
      rule = castTo(rule$iterator.next_3(), 39);
      if (rule.getRuleType() == 1) {
        planeAtom = rule.getAtomList_1();
        for (ta$array = torsionAtom, ta$index = 0, ta$max = ta$array.length; ta$index < ta$max; ++ta$index) {
          ta = ta$array[ta$index];
          if (ta == -1)
            return false;
          found = false;
          for (pa$array = planeAtom, pa$index = 0, pa$max = pa$array.length; pa$index < pa$max; ++pa$index) {
            pa = pa$array[pa$index];
            if (ta == pa) {
              found = true;
              break;
            }
          }
          if (!found)
            return false;
        }
        return true;
      }
    }
    return false;
  };
  defineClass(218, 39, { 1: 1, 39: 1 }, ooccs.TorsionRule);
  _.$init_432 = function $init_432() {
  };
  _.addStrain = function addStrain_4(conformer, atomStrain) {
    var angle, dif, i, i0, index_0, mol, severity, strain, t, t$array, t$index, t$max, torsion, totalStrain;
    angle = carcc.calculateTorsionExtended_0(conformer, this.mAtom);
    if (isNaN(angle))
      return 0;
    if (angle < 0)
      angle += 2 * 3.141592653589793;
    torsion = 180 * angle / 3.141592653589793;
    index_0 = this.findApplicableTorsionIndex(angle);
    if (index_0 == -1) {
      (jl.$clinit_System(), jl.out_0).print_1("TorsionRule angle: " + angle + " torsions:");
      for (t$array = this.mTorsion, t$index = 0, t$max = t$array.length; t$index < t$max; ++t$index) {
        t = t$array[t$index];
        (jl.$clinit_System(), jl.out_0).print_1(" " + t);
      }
      (jl.$clinit_System(), jl.out_0).println();
    }
    severity = this.getSeverity(angle, index_0);
    if (severity == 0)
      return 0;
    dif = $wnd.Math.abs(torsion - this.mTorsion[index_0]);
    if (dif > 180)
      dif = 360 - dif;
    if (dif > 60)
      dif = 60;
    mol = conformer.getMolecule_0();
    strain = 3 * severity * dif * dif / 3600;
    totalStrain = 0;
    for (i0 = 0; i0 < mol.getAllConnAtoms_0(this.mAtom[1]); i0++) {
      if (mol.getConnAtom_0(this.mAtom[1], i0) != this.mAtom[2]) {
        if (jsNotEquals(atomStrain, null))
          atomStrain[mol.getConnAtom_0(this.mAtom[1], i0)] += strain;
        totalStrain += strain;
      }
    }
    for (i = 0; i < mol.getAllConnAtoms_0(this.mAtom[2]); i++) {
      if (mol.getConnAtom_0(this.mAtom[2], i) != this.mAtom[1]) {
        if (jsNotEquals(atomStrain, null))
          atomStrain[mol.getConnAtom_0(this.mAtom[2], i)] += strain;
        totalStrain += strain;
      }
    }
    return totalStrain;
  };
  _.apply_4 = function apply_26(conformer, cycleFactor) {
    var a, a$array, a$index, a$max, angleCorrection, bond, currentTorsion, factor, firstConn, i, index_0, isFiveMemberedRing, j, k, mol, rotation, secondConn, severity, unit;
    currentTorsion = carcc.calculateTorsionExtended_0(conformer, this.mAtom);
    if (isNaN(currentTorsion))
      return false;
    if (currentTorsion < 0)
      currentTorsion += 2 * 3.141592653589793;
    index_0 = this.findApplicableTorsionIndex(currentTorsion);
    severity = this.getSeverity(currentTorsion, index_0);
    if (severity == 0)
      return false;
    angleCorrection = 3.141592653589793 * this.mTorsion[index_0] / 180 - currentTorsion;
    if ($wnd.Math.abs(angleCorrection) > 3.141592653589793)
      angleCorrection = angleCorrection < 0 ? 2 * 3.141592653589793 + angleCorrection : angleCorrection - 2 * 3.141592653589793;
    if ($wnd.Math.abs(angleCorrection) < 1e-3 * 3.141592653589793)
      return false;
    unit = conformer.getCoordinates(this.mAtom[2]).subC(conformer.getCoordinates(this.mAtom[1]));
    unit.unit();
    angleCorrection *= cycleFactor * severity;
    mol = conformer.getMolecule_0();
    if (jsNotEquals(this.mAtomToRotate, null)) {
      rotation = this.mSmallerSubstituentIndex == 0 ? -angleCorrection : angleCorrection;
      for (a$array = this.mAtomToRotate, a$index = 0, a$max = a$array.length; a$index < a$max; ++a$index) {
        a = a$array[a$index];
        ooccs.rotateAtom(conformer, a, conformer.getCoordinates(this.mAtom[1]), unit, rotation);
      }
    } else {
      bond = mol.getBond_0(this.mAtom[1], this.mAtom[2]);
      isFiveMemberedRing = bond != -1 && mol.getBondRingSize_0(bond) <= 5;
      for (i = 1; i <= 2; i++) {
        factor = (i == 1 ? -2 : 2) * mol.getAtomRingBondCount_0(this.mAtom[i]);
        for (j = 0; j < mol.getAllConnAtoms_0(this.mAtom[i]); j++) {
          firstConn = mol.getConnAtom_0(this.mAtom[i], j);
          if (firstConn != this.mAtom[3 - i]) {
            this.rotateGroup(conformer, firstConn, this.mAtom[i], unit, angleCorrection / factor);
            if (!isFiveMemberedRing) {
              for (k = 0; k < mol.getConnAtoms_0(firstConn); k++) {
                secondConn = mol.getConnAtom_0(firstConn, k);
                if (secondConn != firstConn && mol.getAllConnAtoms_0(secondConn) != 1) {
                  this.rotateGroup(conformer, secondConn, this.mAtom[i], unit, angleCorrection / (4 * factor));
                }
              }
            }
          }
        }
      }
    }
    return true;
  };
  _.findApplicableTorsionIndex = function findApplicableTorsionIndex(torsion) {
    var dif, i, index_0, minDif, t;
    index_0 = -1;
    minDif = 17976931348623157e292;
    for (i = 0; i < this.mTorsion.length; i++) {
      t = 3.141592653589793 * this.mTorsion[i] / 180;
      dif = $wnd.Math.abs(torsion - t);
      if (dif > 3.141592653589793)
        dif = 2 * 3.141592653589793 - dif;
      dif /= 10 + $wnd.Math.sqrt(this.mFrequency[i]);
      if (minDif > dif) {
        minDif = dif;
        index_0 = i;
      }
    }
    return index_0;
  };
  _.getRuleType = function getRuleType_4() {
    return 3;
  };
  _.getSeverity = function getSeverity(angle, index_0) {
    var dif, range0, range1, torsion;
    range0 = this.mRange[index_0][0] * 3.141592653589793 / 180;
    range1 = this.mRange[index_0][1] * 3.141592653589793 / 180;
    torsion = this.mTorsion[index_0] * 3.141592653589793 / 180;
    if (angle < torsion - 3.141592653589793)
      angle += 2 * 3.141592653589793;
    else if (angle > torsion + 3.141592653589793)
      angle -= 2 * 3.141592653589793;
    dif = (torsion - angle) / (torsion - (angle < torsion ? range0 : range1));
    if (dif < 1)
      return 0;
    if (dif < 2) {
      dif -= 1;
      return dif * dif;
    }
    return 1;
  };
  _.rotateGroup = function rotateGroup_0(conformer, atom, refAtom, unit, theta) {
    var connAtom, i, mol;
    ooccs.rotateAtom(conformer, atom, conformer.getCoordinates(refAtom), unit, theta);
    mol = conformer.getMolecule_0();
    for (i = 0; i < mol.getAllConnAtoms_0(atom); i++) {
      connAtom = mol.getConnAtom_0(atom, i);
      if (mol.getAllConnAtoms_0(connAtom) == 1)
        ooccs.rotateAtom(conformer, connAtom, conformer.getCoordinates(refAtom), unit, theta);
    }
  };
  _.toString_0 = function toString_76() {
    var i, sb;
    sb = new jl.StringBuilder_1("torsion rule:");
    getClassPrototype(39).addAtomList.call(this, sb);
    sb.append_9(" torsions:");
    for (i = 0; i < this.mTorsion.length; i++) {
      if (i != 0)
        sb.append_9(",");
      sb.append_9(this.mTorsion[i] + "(" + this.mFrequency[i] + ")");
    }
    return sb.toString_0();
  };
  _.mSmallerSubstituentIndex = 0;
  ooccs.COLLIDING_ATOM_STRAIN = 0.1;
  cggl.Lorg_openmolecules_chem_conf_so_TorsionRule_2_classLit = createForClass("org.openmolecules.chem.conf.so", "TorsionRule", 218, cggl.Lorg_openmolecules_chem_conf_so_ConformationRule_2_classLit);
  cggl.Z_classLit = createForPrimitive("boolean", "Z");
  cggl.B_classLit = createForPrimitive("byte", "B");
  cggl.C_classLit = createForPrimitive("char", "C");
  cggl.D_classLit = createForPrimitive("double", "D");
  cggl.F_classLit = createForPrimitive("float", "F");
  cggl.I_classLit = createForPrimitive("int", "I");
  cggl.J_classLit = createForPrimitive("long", "J");
  cggl.S_classLit = createForPrimitive("short", "S");
  cggl.V_classLit = createForPrimitive("void", "V");
  cargja.$clinit_JSCanonizer();
  _ = provide("OCL.Canonizer", cargja.JSCanonizer);
  cargja.$clinit_JSCanonizerUtil();
  _ = provide("OCL.CanonizerUtil", cargja.JSCanonizerUtil);
  _.BACKBONE = cargja.BACKBONE_0;
  _.NORMAL = cargja.NORMAL_0;
  _.NOSTEREO = cargja.NOSTEREO_0;
  _.NOSTEREO_TAUTOMER = cargja.NOSTEREO_TAUTOMER_0;
  _.TAUTOMER = cargja.TAUTOMER_0;
  _.getIDCode = cargja.getIDCode_5;
  cargja.$clinit_JSConformerGenerator();
  _ = provide("OCL.ConformerGenerator", cargja.JSConformerGenerator);
  _.STRATEGY_ADAPTIVE_RANDOM = cargja.STRATEGY_ADAPTIVE_RANDOM;
  _.STRATEGY_LIKELY_RANDOM = cargja.STRATEGY_LIKELY_RANDOM;
  _.STRATEGY_LIKELY_SYSTEMATIC = cargja.STRATEGY_LIKELY_SYSTEMATIC;
  _.STRATEGY_PURE_RANDOM = cargja.STRATEGY_PURE_RANDOM;
  cargja.$clinit_JSDrugScoreCalculator();
  _ = provide("OCL.DrugScoreCalculator", cargja.JSDrugScoreCalculator);
  _.calculate = cargja.calculate_0;
  cargja.$clinit_JSDruglikenessPredictor();
  _ = provide("OCL.DruglikenessPredictor", cargja.JSDruglikenessPredictor);
  _.DRUGLIKENESS_UNKNOWN = cargja.DRUGLIKENESS_UNKNOWN;
  cargja.$clinit_JSForceFieldMMFF94();
  _ = provide("OCL.ForceFieldMMFF94", cargja.JSForceFieldMMFF94);
  _.MMFF94 = cargja.MMFF94_0;
  _.MMFF94S = cargja.MMFF94S_0;
  _.MMFF94SPLUS = cargja.MMFF94SPLUS_0;
  cargjag.$clinit_JSEditorArea();
  _ = provide("OCL.GenericEditorArea", cargjag.JSEditorArea);
  _.EDITOR_EVENT_HIGHLIGHT_ATOM_CHANGED = cargjag.EDITOR_EVENT_HIGHLIGHT_ATOM_CHANGED;
  _.EDITOR_EVENT_HIGHLIGHT_BOND_CHANGED = cargjag.EDITOR_EVENT_HIGHLIGHT_BOND_CHANGED;
  _.EDITOR_EVENT_MOLECULE_CHANGED = cargjag.EDITOR_EVENT_MOLECULE_CHANGED;
  _.EDITOR_EVENT_SELECTION_CHANGED = cargjag.EDITOR_EVENT_SELECTION_CHANGED;
  _.HOTSPOT_16 = cargjag.HOTSPOT_16_0;
  _.HOTSPOT_32 = cargjag.HOTSPOT_32_0;
  _.IMAGE_DATA_16 = cargjag.IMAGE_DATA_16_0;
  _.IMAGE_NAME_32 = cargjag.IMAGE_NAME_32_0;
  _.KEY_ALT = cargjag.KEY_ALT_0;
  _.KEY_BACK_SPACE = cargjag.KEY_BACK_SPACE_0;
  _.KEY_CTRL = cargjag.KEY_CTRL_0;
  _.KEY_DELETE = cargjag.KEY_DELETE_0;
  _.KEY_ENTER = cargjag.KEY_ENTER_0;
  _.KEY_ESCAPE = cargjag.KEY_ESCAPE_0;
  _.KEY_EVENT_PRESSED = cargjag.KEY_EVENT_PRESSED;
  _.KEY_EVENT_RELEASED = cargjag.KEY_EVENT_RELEASED;
  _.KEY_HELP = cargjag.KEY_HELP_0;
  _.KEY_SHIFT = cargjag.KEY_SHIFT_0;
  _.MODE_DRAWING_OBJECTS = cargjag.MODE_DRAWING_OBJECTS_0;
  _.MODE_MARKUSH_STRUCTURE = cargjag.MODE_MARKUSH_STRUCTURE_0;
  _.MODE_MULTIPLE_FRAGMENTS = cargjag.MODE_MULTIPLE_FRAGMENTS_0;
  _.MODE_REACTION = cargjag.MODE_REACTION_0;
  _.MOUSE_EVENT_CLICKED = cargjag.MOUSE_EVENT_CLICKED;
  _.MOUSE_EVENT_DRAGGED = cargjag.MOUSE_EVENT_DRAGGED;
  _.MOUSE_EVENT_ENTERED = cargjag.MOUSE_EVENT_ENTERED;
  _.MOUSE_EVENT_EXITED = cargjag.MOUSE_EVENT_EXITED;
  _.MOUSE_EVENT_MOVED = cargjag.MOUSE_EVENT_MOVED;
  _.MOUSE_EVENT_PRESSED = cargjag.MOUSE_EVENT_PRESSED;
  _.MOUSE_EVENT_RELEASED = cargjag.MOUSE_EVENT_RELEASED;
  _.TableLayoutFill = cargjag.TableLayoutFill;
  _.TableLayoutPreferred = cargjag.TableLayoutPreferred;
  _.cChainCursor = cargjag.cChainCursor_0;
  _.cDeleteCursor = cargjag.cDeleteCursor_0;
  _.cFistCursor = cargjag.cFistCursor_0;
  _.cHandCursor = cargjag.cHandCursor_0;
  _.cHandPlusCursor = cargjag.cHandPlusCursor_0;
  _.cInvisibleCursor = cargjag.cInvisibleCursor_0;
  _.cLassoCursor = cargjag.cLassoCursor_0;
  _.cLassoPlusCursor = cargjag.cLassoPlusCursor_0;
  _.cPointedHandCursor = cargjag.cPointedHandCursor_0;
  _.cPointerCursor = cargjag.cPointerCursor_0;
  _.cSelectRectCursor = cargjag.cSelectRectCursor_0;
  _.cSelectRectPlusCursor = cargjag.cSelectRectPlusCursor_0;
  _.cTextCursor = cargjag.cTextCursor_0;
  _.cZoomCursor = cargjag.cZoomCursor_0;
  cargjag.$clinit_JSEditorToolbar();
  _ = provide("OCL.GenericEditorToolbar", cargjag.JSEditorToolbar);
  cargjag.$clinit_JSUIHelper();
  _ = provide("OCL.GenericUIHelper", cargjag.JSUIHelper);
  cargja.$clinit_JSMolecule();
  _ = provide("OCL.Molecule", cargja.JSMolecule_0);
  _.CANONIZER_ASSIGN_PARITIES_TO_TETRAHEDRAL_N = cargja.CANONIZER_ASSIGN_PARITIES_TO_TETRAHEDRAL_N;
  _.CANONIZER_CONSIDER_DIASTEREOTOPICITY = cargja.CANONIZER_CONSIDER_DIASTEREOTOPICITY;
  _.CANONIZER_CONSIDER_ENANTIOTOPICITY = cargja.CANONIZER_CONSIDER_ENANTIOTOPICITY;
  _.CANONIZER_CONSIDER_STEREOHETEROTOPICITY = cargja.CANONIZER_CONSIDER_STEREOHETEROTOPICITY;
  _.CANONIZER_COORDS_ARE_3D = cargja.CANONIZER_COORDS_ARE_3D;
  _.CANONIZER_CREATE_PSEUDO_STEREO_GROUPS = cargja.CANONIZER_CREATE_PSEUDO_STEREO_GROUPS;
  _.CANONIZER_CREATE_SYMMETRY_RANK = cargja.CANONIZER_CREATE_SYMMETRY_RANK;
  _.CANONIZER_DISTINGUISH_RACEMIC_OR_GROUPS = cargja.CANONIZER_DISTINGUISH_RACEMIC_OR_GROUPS;
  _.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS = cargja.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS;
  _.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS_WITHOUT_RANKING = cargja.CANONIZER_ENCODE_ATOM_CUSTOM_LABELS_WITHOUT_RANKING;
  _.CANONIZER_ENCODE_ATOM_SELECTION = cargja.CANONIZER_ENCODE_ATOM_SELECTION;
  _.CANONIZER_NEGLECT_ANY_STEREO_INFORMATION = cargja.CANONIZER_NEGLECT_ANY_STEREO_INFORMATION;
  _.CANONIZER_TIE_BREAK_FREE_VALENCE_ATOMS = cargja.CANONIZER_TIE_BREAK_FREE_VALENCE_ATOMS;
  _.FISCHER_PROJECTION_LIMIT = cargja.FISCHER_PROJECTION_LIMIT_0;
  _.FISCHER_PROJECTION_RING_LIMIT = cargja.FISCHER_PROJECTION_RING_LIMIT_0;
  _.STEREO_ANGLE_LIMIT = cargja.STEREO_ANGLE_LIMIT;
  _.VALIDATION_ERRORS_STEREO = cargja.VALIDATION_ERRORS_STEREO_0;
  _.VALIDATION_ERROR_AMBIGUOUS_CONFIGURATION = cargja.VALIDATION_ERROR_AMBIGUOUS_CONFIGURATION_0;
  _.VALIDATION_ERROR_ESR_CENTER_UNKNOWN = cargja.VALIDATION_ERROR_ESR_CENTER_UNKNOWN_0;
  _.VALIDATION_ERROR_OVER_UNDER_SPECIFIED = cargja.VALIDATION_ERROR_OVER_UNDER_SPECIFIED_0;
  _.cAtomCIPParityNone = cargja.cAtomCIPParityNone_0;
  _.cAtomCIPParityProblem = cargja.cAtomCIPParityProblem_0;
  _.cAtomCIPParityRorM = cargja.cAtomCIPParityRorM_0;
  _.cAtomCIPParitySorP = cargja.cAtomCIPParitySorP_0;
  _.cAtomColorBlue = cargja.cAtomColorBlue_0;
  _.cAtomColorDarkGreen = cargja.cAtomColorDarkGreen_0;
  _.cAtomColorDarkRed = cargja.cAtomColorDarkRed_0;
  _.cAtomColorGreen = cargja.cAtomColorGreen_0;
  _.cAtomColorMagenta = cargja.cAtomColorMagenta_0;
  _.cAtomColorNone = cargja.cAtomColorNone_0;
  _.cAtomColorOrange = cargja.cAtomColorOrange_0;
  _.cAtomColorRed = cargja.cAtomColorRed_0;
  _.cAtomLabel = cargja.cAtomLabel_0;
  _.cAtomParity1 = cargja.cAtomParity1_0;
  _.cAtomParity2 = cargja.cAtomParity2_0;
  _.cAtomParityIsPseudo = cargja.cAtomParityIsPseudo_0;
  _.cAtomParityNone = cargja.cAtomParityNone_0;
  _.cAtomParityUnknown = cargja.cAtomParityUnknown_0;
  _.cAtomQFAny = cargja.cAtomQFAny_0;
  _.cAtomQFAromState = cargja.cAtomQFAromState_0;
  _.cAtomQFAromStateBits = cargja.cAtomQFAromStateBits_0;
  _.cAtomQFAromStateShift = cargja.cAtomQFAromStateShift_0;
  _.cAtomQFAromatic = cargja.cAtomQFAromatic_0;
  _.cAtomQFCharge = cargja.cAtomQFCharge_0;
  _.cAtomQFChargeBits = cargja.cAtomQFChargeBits_0;
  _.cAtomQFChargeShift = cargja.cAtomQFChargeShift_0;
  _.cAtomQFENeighbourBits = cargja.cAtomQFENeighbourBits_0;
  _.cAtomQFENeighbourShift = cargja.cAtomQFENeighbourShift_0;
  _.cAtomQFENeighbours = cargja.cAtomQFENeighbours_0;
  _.cAtomQFExcludeGroup = cargja.cAtomQFExcludeGroup_0;
  _.cAtomQFFlatNitrogen = cargja.cAtomQFFlatNitrogen_0;
  _.cAtomQFHeteroAromatic = cargja.cAtomQFHeteroAromatic_0;
  _.cAtomQFHydrogen = cargja.cAtomQFHydrogen_0;
  _.cAtomQFHydrogenBits = cargja.cAtomQFHydrogenBits_0;
  _.cAtomQFHydrogenShift = cargja.cAtomQFHydrogenShift_0;
  _.cAtomQFIsNotStereo = cargja.cAtomQFIsNotStereo_0;
  _.cAtomQFIsStereo = cargja.cAtomQFIsStereo_0;
  _.cAtomQFMatchStereo = cargja.cAtomQFMatchStereo_0;
  _.cAtomQFMoreNeighbours = cargja.cAtomQFMoreNeighbours_0;
  _.cAtomQFNarrowing = cargja.cAtomQFNarrowing_0;
  _.cAtomQFNeighbourBits = cargja.cAtomQFNeighbourBits_0;
  _.cAtomQFNeighbourShift = cargja.cAtomQFNeighbourShift_0;
  _.cAtomQFNeighbours = cargja.cAtomQFNeighbours_0;
  _.cAtomQFNewRingSize = cargja.cAtomQFNewRingSize_0;
  _.cAtomQFNewRingSizeBits = cargja.cAtomQFNewRingSizeBits_0;
  _.cAtomQFNewRingSizeShift = cargja.cAtomQFNewRingSizeShift_0;
  _.cAtomQFNoMoreNeighbours = cargja.cAtomQFNoMoreNeighbours_0;
  _.cAtomQFNoOfBits = cargja.cAtomQFNoOfBits_0;
  _.cAtomQFNot0ENeighbours = cargja.cAtomQFNot0ENeighbours_0;
  _.cAtomQFNot0Hydrogen = cargja.cAtomQFNot0Hydrogen_0;
  _.cAtomQFNot0Neighbours = cargja.cAtomQFNot0Neighbours_0;
  _.cAtomQFNot0PiElectrons = cargja.cAtomQFNot0PiElectrons_0;
  _.cAtomQFNot1ENeighbour = cargja.cAtomQFNot1ENeighbour_0;
  _.cAtomQFNot1Hydrogen = cargja.cAtomQFNot1Hydrogen_0;
  _.cAtomQFNot1Neighbour = cargja.cAtomQFNot1Neighbour_0;
  _.cAtomQFNot1PiElectron = cargja.cAtomQFNot1PiElectron_0;
  _.cAtomQFNot2ENeighbours = cargja.cAtomQFNot2ENeighbours_0;
  _.cAtomQFNot2Hydrogen = cargja.cAtomQFNot2Hydrogen_0;
  _.cAtomQFNot2Neighbours = cargja.cAtomQFNot2Neighbours_0;
  _.cAtomQFNot2PiElectrons = cargja.cAtomQFNot2PiElectrons_0;
  _.cAtomQFNot2RingBonds = cargja.cAtomQFNot2RingBonds_0;
  _.cAtomQFNot3ENeighbours = cargja.cAtomQFNot3ENeighbours_0;
  _.cAtomQFNot3Hydrogen = cargja.cAtomQFNot3Hydrogen_0;
  _.cAtomQFNot3Neighbours = cargja.cAtomQFNot3Neighbours_0;
  _.cAtomQFNot3RingBonds = cargja.cAtomQFNot3RingBonds_0;
  _.cAtomQFNot4ENeighbours = cargja.cAtomQFNot4ENeighbours_0;
  _.cAtomQFNot4Neighbours = cargja.cAtomQFNot4Neighbours_0;
  _.cAtomQFNot4RingBonds = cargja.cAtomQFNot4RingBonds_0;
  _.cAtomQFNotAromatic = cargja.cAtomQFNotAromatic_0;
  _.cAtomQFNotChain = cargja.cAtomQFNotChain_0;
  _.cAtomQFNotCharge0 = cargja.cAtomQFNotCharge0_0;
  _.cAtomQFNotChargeNeg = cargja.cAtomQFNotChargeNeg_0;
  _.cAtomQFNotChargePos = cargja.cAtomQFNotChargePos_0;
  _.cAtomQFPiElectronBits = cargja.cAtomQFPiElectronBits_0;
  _.cAtomQFPiElectronShift = cargja.cAtomQFPiElectronShift_0;
  _.cAtomQFPiElectrons = cargja.cAtomQFPiElectrons_0;
  _.cAtomQFRingSize0 = cargja.cAtomQFRingSize0_0;
  _.cAtomQFRingSize3 = cargja.cAtomQFRingSize3_0;
  _.cAtomQFRingSize4 = cargja.cAtomQFRingSize4_0;
  _.cAtomQFRingSize5 = cargja.cAtomQFRingSize5_0;
  _.cAtomQFRingSize6 = cargja.cAtomQFRingSize6_0;
  _.cAtomQFRingSize7 = cargja.cAtomQFRingSize7_0;
  _.cAtomQFRingSizeLarge = cargja.cAtomQFRingSizeLarge_0;
  _.cAtomQFRingState = cargja.cAtomQFRingState_0;
  _.cAtomQFRingStateBits = cargja.cAtomQFRingStateBits_0;
  _.cAtomQFRingStateShift = cargja.cAtomQFRingStateShift_0;
  _.cAtomQFRxnParityBits = cargja.cAtomQFRxnParityBits_0;
  _.cAtomQFRxnParityHint = cargja.cAtomQFRxnParityHint_0;
  _.cAtomQFRxnParityInvert = cargja.cAtomQFRxnParityInvert_0;
  _.cAtomQFRxnParityRacemize = cargja.cAtomQFRxnParityRacemize_0;
  _.cAtomQFRxnParityRetain = cargja.cAtomQFRxnParityRetain_0;
  _.cAtomQFRxnParityShift = cargja.cAtomQFRxnParityShift_0;
  _.cAtomQFSimpleFeatures = cargja.cAtomQFSimpleFeatures_0;
  _.cAtomQFSmallRingSize = cargja.cAtomQFSmallRingSize_0;
  _.cAtomQFSmallRingSizeBits = cargja.cAtomQFSmallRingSizeBits_0;
  _.cAtomQFSmallRingSizeShift = cargja.cAtomQFSmallRingSizeShift_0;
  _.cAtomQFStereoState = cargja.cAtomQFStereoState_0;
  _.cAtomQFStereoStateBits = cargja.cAtomQFStereoStateBits_0;
  _.cAtomQFStereoStateShift = cargja.cAtomQFStereoStateShift_0;
  _.cAtomRadicalState = cargja.cAtomRadicalState_0;
  _.cAtomRadicalStateD = cargja.cAtomRadicalStateD_0;
  _.cAtomRadicalStateNone = cargja.cAtomRadicalStateNone_0;
  _.cAtomRadicalStateS = cargja.cAtomRadicalStateS_0;
  _.cAtomRadicalStateShift = cargja.cAtomRadicalStateShift_0;
  _.cAtomRadicalStateT = cargja.cAtomRadicalStateT_0;
  _.cAtomValence = cargja.cAtomValence_0;
  _.cBondCIPParityEorP = cargja.cBondCIPParityEorP_0;
  _.cBondCIPParityNone = cargja.cBondCIPParityNone_0;
  _.cBondCIPParityProblem = cargja.cBondCIPParityProblem_0;
  _.cBondCIPParityZorM = cargja.cBondCIPParityZorM_0;
  _.cBondParityEor1 = cargja.cBondParityEor1_0;
  _.cBondParityNone = cargja.cBondParityNone_0;
  _.cBondParityUnknown = cargja.cBondParityUnknown_0;
  _.cBondParityZor2 = cargja.cBondParityZor2_0;
  _.cBondQFAllFeatures = cargja.cBondQFAllFeatures_0;
  _.cBondQFAromState = cargja.cBondQFAromState_0;
  _.cBondQFAromStateBits = cargja.cBondQFAromStateBits_0;
  _.cBondQFAromStateShift = cargja.cBondQFAromStateShift_0;
  _.cBondQFAromatic = cargja.cBondQFAromatic_0;
  _.cBondQFBondTypes = cargja.cBondQFBondTypes_0;
  _.cBondQFBondTypesBits = cargja.cBondQFBondTypesBits_0;
  _.cBondQFBondTypesShift = cargja.cBondQFBondTypesShift_0;
  _.cBondQFBridge = cargja.cBondQFBridge_0;
  _.cBondQFBridgeBits = cargja.cBondQFBridgeBits_0;
  _.cBondQFBridgeMin = cargja.cBondQFBridgeMin_0;
  _.cBondQFBridgeMinBits = cargja.cBondQFBridgeMinBits_0;
  _.cBondQFBridgeMinShift = cargja.cBondQFBridgeMinShift_0;
  _.cBondQFBridgeShift = cargja.cBondQFBridgeShift_0;
  _.cBondQFBridgeSpan = cargja.cBondQFBridgeSpan_0;
  _.cBondQFBridgeSpanBits = cargja.cBondQFBridgeSpanBits_0;
  _.cBondQFBridgeSpanShift = cargja.cBondQFBridgeSpanShift_0;
  _.cBondQFDelocalized = cargja.cBondQFDelocalized;
  _.cBondQFDouble = cargja.cBondQFDouble;
  _.cBondQFMatchFormalOrder = cargja.cBondQFMatchFormalOrder_0;
  _.cBondQFMatchStereo = cargja.cBondQFMatchStereo_0;
  _.cBondQFMetalLigand = cargja.cBondQFMetalLigand;
  _.cBondQFNarrowing = cargja.cBondQFNarrowing_0;
  _.cBondQFNoOfBits = cargja.cBondQFNoOfBits_0;
  _.cBondQFNotAromatic = cargja.cBondQFNotAromatic_0;
  _.cBondQFNotRing = cargja.cBondQFNotRing_0;
  _.cBondQFQuadruple = cargja.cBondQFQuadruple;
  _.cBondQFQuintuple = cargja.cBondQFQuintuple;
  _.cBondQFRareBondTypes = cargja.cBondQFRareBondTypes_0;
  _.cBondQFRareBondTypesBits = cargja.cBondQFRareBondTypesBits_0;
  _.cBondQFRareBondTypesShift = cargja.cBondQFRareBondTypesShift_0;
  _.cBondQFRing = cargja.cBondQFRing_0;
  _.cBondQFRingSize = cargja.cBondQFRingSize_0;
  _.cBondQFRingSizeBits = cargja.cBondQFRingSizeBits_0;
  _.cBondQFRingSizeShift = cargja.cBondQFRingSizeShift_0;
  _.cBondQFRingState = cargja.cBondQFRingState_0;
  _.cBondQFRingStateBits = cargja.cBondQFRingStateBits_0;
  _.cBondQFRingStateShift = cargja.cBondQFRingStateShift_0;
  _.cBondQFSimpleFeatures = cargja.cBondQFSimpleFeatures_0;
  _.cBondQFSingle = cargja.cBondQFSingle;
  _.cBondQFTriple = cargja.cBondQFTriple;
  _.cBondTypeCross = cargja.cBondTypeCross_0;
  _.cBondTypeDeleted = cargja.cBondTypeDeleted_0;
  _.cBondTypeDelocalized = cargja.cBondTypeDelocalized_0;
  _.cBondTypeDouble = cargja.cBondTypeDouble_0;
  _.cBondTypeDown = cargja.cBondTypeDown_0;
  _.cBondTypeIncreaseOrder = cargja.cBondTypeIncreaseOrder_0;
  _.cBondTypeMaskSimple = cargja.cBondTypeMaskSimple_0;
  _.cBondTypeMaskStereo = cargja.cBondTypeMaskStereo_0;
  _.cBondTypeMetalLigand = cargja.cBondTypeMetalLigand_0;
  _.cBondTypeQuadruple = cargja.cBondTypeQuadruple_0;
  _.cBondTypeQuintuple = cargja.cBondTypeQuintuple_0;
  _.cBondTypeSingle = cargja.cBondTypeSingle_0;
  _.cBondTypeTriple = cargja.cBondTypeTriple_0;
  _.cBondTypeUp = cargja.cBondTypeUp_0;
  _.cChiralityDiastereomers = cargja.cChiralityDiastereomers_0;
  _.cChiralityEpimers = cargja.cChiralityEpimers_0;
  _.cChiralityIsomerCountMask = cargja.cChiralityIsomerCountMask_0;
  _.cChiralityKnownEnantiomer = cargja.cChiralityKnownEnantiomer_0;
  _.cChiralityMeso = cargja.cChiralityMeso_0;
  _.cChiralityNotChiral = cargja.cChiralityNotChiral_0;
  _.cChiralityRacemic = cargja.cChiralityRacemic_0;
  _.cChiralityUnknown = cargja.cChiralityUnknown_0;
  _.cChiralityUnknownEnantiomer = cargja.cChiralityUnknownEnantiomer_0;
  _.cCommonOxidationState = cargja.cCommonOxidationState_0;
  _.cDefaultAVBL = cargja.cDefaultAVBL_0;
  _.cDefaultAllowedPseudoAtoms = cargja.cDefaultAllowedPseudoAtoms_0;
  _.cDefaultAtomValence = cargja.cDefaultAtomValence_0;
  _.cESRGroupBits = cargja.cESRGroupBits_0;
  _.cESRMaxGroups = cargja.cESRMaxGroups_0;
  _.cESRTypeAbs = cargja.cESRTypeAbs_0;
  _.cESRTypeAnd = cargja.cESRTypeAnd_0;
  _.cESRTypeOr = cargja.cESRTypeOr_0;
  _.cHelperAll = cargja.cHelperAll_0;
  _.cHelperBitCIP = cargja.cHelperBitCIP_0;
  _.cHelperBitIncludeNitrogenParities = cargja.cHelperBitIncludeNitrogenParities_0;
  _.cHelperBitNeighbours = cargja.cHelperBitNeighbours_0;
  _.cHelperBitParities = cargja.cHelperBitParities_0;
  _.cHelperBitRings = cargja.cHelperBitRings_0;
  _.cHelperBitRingsSimple = cargja.cHelperBitRingsSimple_0;
  _.cHelperBitSymmetrySimple = cargja.cHelperBitSymmetrySimple_0;
  _.cHelperBitSymmetryStereoHeterotopicity = cargja.cHelperBitSymmetryStereoHeterotopicity_0;
  _.cHelperBitsStereo = cargja.cHelperBitsStereo_0;
  _.cHelperCIP = cargja.cHelperCIP_0;
  _.cHelperNeighbours = cargja.cHelperNeighbours_0;
  _.cHelperNone = cargja.cHelperNone_0;
  _.cHelperParities = cargja.cHelperParities_0;
  _.cHelperRings = cargja.cHelperRings_0;
  _.cHelperRingsSimple = cargja.cHelperRingsSimple_0;
  _.cHelperSymmetrySimple = cargja.cHelperSymmetrySimple_0;
  _.cHelperSymmetryStereoHeterotopicity = cargja.cHelperSymmetryStereoHeterotopicity_0;
  _.cMaxAtomicNo = cargja.cMaxAtomicNo_0;
  _.cMaxConnAtoms = cargja.cMaxConnAtoms_0;
  _.cMoleculeColorDefault = cargja.cMoleculeColorDefault_0;
  _.cMoleculeColorNeutral = cargja.cMoleculeColorNeutral_0;
  _.cPseudoAtomA = cargja.cPseudoAtomA_0;
  _.cPseudoAtomAttachmentPoint = cargja.cPseudoAtomAttachmentPoint_0;
  _.cPseudoAtomPolymer = cargja.cPseudoAtomPolymer_0;
  _.cPseudoAtomR = cargja.cPseudoAtomR_0;
  _.cPseudoAtomX = cargja.cPseudoAtomX_0;
  _.cPseudoAtomsAGroups = cargja.cPseudoAtomsAGroups_0;
  _.cPseudoAtomsAll = cargja.cPseudoAtomsAll_0;
  _.cPseudoAtomsAminoAcids = cargja.cPseudoAtomsAminoAcids_0;
  _.cPseudoAtomsHydrogenIsotops = cargja.cPseudoAtomsHydrogenIsotops_0;
  _.cPseudoAtomsRGroups = cargja.cPseudoAtomsRGroups_0;
  _.cRoundedMass = cargja.cRoundedMass_0;
  _.fromIDCode = cargja.fromIDCode;
  _.fromMolfile = cargja.fromMolfile;
  _.fromMolfileWithAtomMap = cargja.fromMolfileWithAtomMap;
  _.fromSmiles = cargja.fromSmiles;
  _.getAngle = cargja.getAngle_3;
  _.getAngleDif = cargja.getAngleDif_1;
  _.getAtomicNoFromLabel = cargja.getAtomicNoFromLabel_1;
  _.getDefaultAverageBondLength = cargja.getDefaultAverageBondLength_0;
  _.isAtomicNoElectronegative = cargja.isAtomicNoElectronegative_0;
  _.isAtomicNoElectropositive = cargja.isAtomicNoElectropositive_0;
  _.setDefaultAverageBondLength = cargja.setDefaultAverageBondLength_0;
  cargja.$clinit_JSMoleculeProperties();
  _ = provide("OCL.MoleculeProperties", cargja.JSMoleculeProperties);
  cargja.$clinit_JSReaction();
  _ = provide("OCL.Reaction");
  _.create = cargja.create;
  _.fromMolecules = cargja.fromMolecules;
  _.fromRxn = cargja.fromRxn;
  _.fromSmiles = cargja.fromSmiles_1;
  cargja.$clinit_JSReactionEncoder();
  _ = provide("OCL.ReactionEncoder", cargja.JSReactionEncoder);
  _.CATALYST_DELIMITER = cargja.CATALYST_DELIMITER_0;
  _.INCLUDE_ALL = cargja.INCLUDE_ALL_0;
  _.INCLUDE_CATALYSTS = cargja.INCLUDE_CATALYSTS_0;
  _.INCLUDE_COORDS = cargja.INCLUDE_COORDS_0;
  _.INCLUDE_DEFAULT = cargja.INCLUDE_DEFAULT_0;
  _.INCLUDE_DRAWING_OBJECTS = cargja.INCLUDE_DRAWING_OBJECTS_0;
  _.INCLUDE_MAPPING = cargja.INCLUDE_MAPPING_0;
  _.INCLUDE_RXN_CODE_ONLY = cargja.INCLUDE_RXN_CODE_ONLY_0;
  _.MOLECULE_DELIMITER = cargja.MOLECULE_DELIMITER_0;
  _.OBJECT_DELIMITER = cargja.OBJECT_DELIMITER_0;
  _.PRODUCT_IDENTIFIER = cargja.PRODUCT_IDENTIFIER_0;
  _.RETAIN_REACTANT_AND_PRODUCT_ORDER = cargja.RETAIN_REACTANT_AND_PRODUCT_ORDER_0;
  _.decode = cargja.decode_4;
  _.encode = cargja.encode_1;
  cargja.$clinit_JSReactor();
  _ = provide("OCL.Reactor", cargja.JSReactor);
  cargja.$clinit_JSResources();
  _ = provide("OCL.Resources", cargja.JSResources);
  _._register = cargja._register;
  _ = provide("OCL.RingCollection");
  _.MAX_SMALL_RING_SIZE = cargja.MAX_SMALL_RING_SIZE_0;
  _.MODE_SMALL_AND_LARGE_RINGS = cargja.MODE_SMALL_AND_LARGE_RINGS_0;
  _.MODE_SMALL_AND_LARGE_RINGS_AND_AROMATICITY = cargja.MODE_SMALL_AND_LARGE_RINGS_AND_AROMATICITY_0;
  _.MODE_SMALL_RINGS_AND_AROMATICITY = cargja.MODE_SMALL_RINGS_AND_AROMATICITY_0;
  _.MODE_SMALL_RINGS_ONLY = cargja.MODE_SMALL_RINGS_ONLY_0;
  cargja.$clinit_JSSDFileParser();
  _ = provide("OCL.SDFileParser", cargja.JSSDFileParser);
  cargja.$clinit_JSSSSearcher();
  _ = provide("OCL.SSSearcher", cargja.JSSSSearcher);
  cargja.$clinit_JSSSSearcherWithIndex();
  _ = provide("OCL.SSSearcherWithIndex", cargja.JSSSSearcherWithIndex);
  _.bitCount = cargja.bitCount_0;
  _.getHexStringFromIndex = cargja.getHexStringFromIndex_0;
  _.getIndexFromHexString = cargja.getIndexFromHexString_0;
  _.getKeyIDCode = cargja.getKeyIDCode;
  _.getSimilarityAngleCosine = cargja.getSimilarityAngleCosine_0;
  _.getSimilarityTanimoto = cargja.getSimilarityTanimoto_0;
  cargja.$clinit_JSSmilesParser();
  _ = provide("OCL.SmilesParser", cargja.JSSmilesParser);
  cargja.$clinit_JSToxicityPredictor();
  _ = provide("OCL.ToxicityPredictor", cargja.JSToxicityPredictor);
  _.RISK_HIGH = cargja.RISK_HIGH;
  _.RISK_LOW = cargja.RISK_LOW;
  _.RISK_NAMES = cargja.RISK_NAMES;
  _.RISK_NO = cargja.RISK_NO;
  _.RISK_UNKNOWN = cargja.RISK_UNKNOWN;
  _.TYPE_IRRITANT = cargja.TYPE_IRRITANT;
  _.TYPE_MUTAGENIC = cargja.TYPE_MUTAGENIC;
  _.TYPE_REPRODUCTIVE_EFFECTIVE = cargja.TYPE_REPRODUCTIVE_EFFECTIVE;
  _.TYPE_TUMORIGENIC = cargja.TYPE_TUMORIGENIC;
  cargja.$clinit_JSTransformer();
  _ = provide("OCL.Transformer", cargja.JSTransformer);
  cargja.$clinit_JSUtil();
  _ = provide("OCL.Util", cargja.JSUtil);
  _.getHoseCodesFromDiastereotopicID = cargja.getHoseCodesFromDiastereotopicID;
  ji.$clinit_Serializable();
  _ = provide("java.io.Serializable");
  _.$isInstance = $isInstance;
  jl.$clinit_Boolean();
  _ = provide("java.lang.Boolean");
  _.$isInstance = $isInstance_0;
  jl.$clinit_CharSequence();
  _ = provide("java.lang.CharSequence");
  _.$isInstance = $isInstance_2;
  jl.$clinit_Cloneable();
  _ = provide("java.lang.Cloneable");
  _.$isInstance = $isInstance_3;
  jl.$clinit_Comparable();
  _ = provide("java.lang.Comparable");
  _.$isInstance = $isInstance_4;
  jl.$clinit_Double();
  _ = provide("java.lang.Double");
  _.$isInstance = $isInstance_5;
  jl.$clinit_Number();
  _ = provide("java.lang.Number");
  _.$isInstance = jl.$isInstance_1;
  jl.$clinit_String();
  _ = provide("java.lang.String");
  _.$isInstance = $isInstance_6;
  jl.$clinit_Throwable();
  _ = provide("java.lang.Throwable");
  _.of = of;
  ju.$clinit_List();
  _ = provide("java.util.List");
  _.copyOf = ju.copyOf_12;
  ju.$clinit_Map();
  _ = provide("java.util.Map");
  _.copyOf = ju.copyOf_13;
  ju.$clinit_Set();
  _ = provide("java.util.Set");
  _.copyOf = ju.copyOf_14;
  ji2.$clinit_HashCodes();
  _ = provide("javaemul.internal.HashCodes", ji2.HashCodes);
  _.getIdentityHashCode = ji2.getIdentityHashCode;
  _.getNextHash = ji2.getNextHash;
  _.getObjectIdentityHashCode = ji2.getObjectIdentityHashCode;
  ji2.$clinit_JsUtils();
  _ = provide("javaemul.internal.JsUtils");
  _.toDoubleFromUnsignedInt = ji2.toDoubleFromUnsignedInt;
  var $entry = registerEntry_0();
  var gwtOnLoad = gwtOnLoad = gwtOnLoad_0;
  addInitFunctions(init_9);
  setGwtProperty("permProps", [[]]);
  $sendStats("moduleStartup", "moduleEvalEnd");
  gwtOnLoad(__gwtModuleFunction.__errFn, __gwtModuleFunction.__moduleName, __gwtModuleFunction.__moduleBase, __gwtModuleFunction.__softPermutationId, __gwtModuleFunction.__computePropValue);
  $sendStats("moduleStartup", "end");
  $gwt && $gwt.permProps && __gwtModuleFunction.__moduleStartupDone($gwt.permProps);
  const toReturn = $wnd["OCL"];
  toReturn.version = "9.11.1";
  return toReturn;
}
var isBrowserWindow = typeof window !== "undefined" && typeof window.document !== "undefined";
var gwtWindow;
if (isBrowserWindow && false) {
  gwtWindow = window;
} else {
  gwtWindow = {
    document: {
      compatMode: "CSS1Compat"
    }
  };
  gwtWindow.setTimeout = globalThis.setTimeout ? globalThis.setTimeout.bind(globalThis) : noop;
  gwtWindow.clearTimeout = globalThis.clearTimeout ? globalThis.clearTimeout.bind(globalThis) : noop;
  gwtWindow.setInterval = globalThis.setInterval ? globalThis.setInterval.bind(globalThis) : noop;
  gwtWindow.clearInterval = globalThis.clearInterval ? globalThis.clearInterval.bind(globalThis) : noop;
  gwtWindow.Error = globalThis.Error;
  gwtWindow.Math = globalThis.Math;
  gwtWindow.RegExp = globalThis.RegExp;
  gwtWindow.TypeError = globalThis.TypeError;
}
var exportedApi = getExports(gwtWindow);
var openchemlib_debug_default = exportedApi;

// lib/register_resources.js
function addRegisterResources(OCL) {
  const _register = OCL.Resources._register.bind(OCL.Resources);
  delete OCL.Resources._register;
  OCL.Resources.register = function register(resources) {
    if (typeof resources === "string") {
      resources = JSON.parse(resources);
    }
    const textEncoder = new TextEncoder();
    if (typeof resources !== "object" || resources === null) {
      throw new TypeError("resources must be an object");
    }
    const resourcesTyped = {};
    for (const [key, value] of Object.entries(resources)) {
      if (typeof value !== "string") {
        throw new TypeError(`resource ${key} must be a string`);
      }
      resourcesTyped[key] = textEncoder.encode(value);
    }
    _register(resourcesTyped);
  };
  OCL.Resources.registerFromUrl = async function registerFromUrl(url = getDefaultResourcesUrl()) {
    const request = await fetch(url);
    const resources = await request.json();
    const textEncoder = new TextEncoder();
    const resourcesAsUint8 = Object.fromEntries(
      Object.entries(resources).map(([file, contents]) => [
        file,
        textEncoder.encode(contents)
      ])
    );
    _register(resourcesAsUint8);
  };
  if (typeof process !== "undefined") {
    let getDefaultResourcesPath2 = function() {
      const path = process.getBuiltinModule("node:path");
      let resourcesPath = path.join(import.meta.dirname, "resources.json");
      if (import.meta.filename.endsWith("register_resources.js")) {
        resourcesPath = path.join(
          import.meta.dirname,
          "../dist/resources.json"
        );
      }
      return resourcesPath;
    };
    var getDefaultResourcesPath = getDefaultResourcesPath2;
    OCL.Resources.registerFromNodejs = function registerFromNodejs(resourcesPath = getDefaultResourcesPath2()) {
      const fs = process.getBuiltinModule("node:fs");
      const resources = fs.readFileSync(resourcesPath, "ascii");
      OCL.Resources.register(resources);
    };
  } else {
    OCL.Resources.registerFromNodejs = function registerFromNodejs() {
      throw new Error(
        `Resources.registerFromNodejs can only be called from Node.js`
      );
    };
  }
}
function getDefaultResourcesUrl() {
  return new URL("resources.json", import.meta.url).href;
}

// lib/index.debug.js
init(openchemlib_debug_default);
extendOCL(openchemlib_debug_default);
addRegisterResources(openchemlib_debug_default);
var index_debug_default = openchemlib_debug_default;
var CanvasEditor = openchemlib_debug_default.CanvasEditor;
var registerCustomElement = openchemlib_debug_default.registerCustomElement;
var Canonizer = openchemlib_debug_default.Canonizer;
var CanonizerUtil = openchemlib_debug_default.CanonizerUtil;
var ConformerGenerator = openchemlib_debug_default.ConformerGenerator;
var DrugScoreCalculator = openchemlib_debug_default.DrugScoreCalculator;
var DruglikenessPredictor = openchemlib_debug_default.DruglikenessPredictor;
var ForceFieldMMFF94 = openchemlib_debug_default.ForceFieldMMFF94;
var Molecule = openchemlib_debug_default.Molecule;
var MoleculeProperties = openchemlib_debug_default.MoleculeProperties;
var Reaction = openchemlib_debug_default.Reaction;
var ReactionEncoder = openchemlib_debug_default.ReactionEncoder;
var Reactor = openchemlib_debug_default.Reactor;
var Resources = openchemlib_debug_default.Resources;
var RingCollection = openchemlib_debug_default.RingCollection;
var SDFileParser = openchemlib_debug_default.SDFileParser;
var SSSearcher = openchemlib_debug_default.SSSearcher;
var SSSearcherWithIndex = openchemlib_debug_default.SSSearcherWithIndex;
var SmilesParser = openchemlib_debug_default.SmilesParser;
var ToxicityPredictor = openchemlib_debug_default.ToxicityPredictor;
var Transformer = openchemlib_debug_default.Transformer;
var Util = openchemlib_debug_default.Util;
var version = openchemlib_debug_default.version;
export {
  Canonizer,
  CanonizerUtil,
  CanvasEditor,
  ConformerGenerator,
  DrugScoreCalculator,
  DruglikenessPredictor,
  ForceFieldMMFF94,
  Molecule,
  MoleculeProperties,
  Reaction,
  ReactionEncoder,
  Reactor,
  Resources,
  RingCollection,
  SDFileParser,
  SSSearcher,
  SSSearcherWithIndex,
  SmilesParser,
  ToxicityPredictor,
  Transformer,
  Util,
  index_debug_default as default,
  registerCustomElement,
  version
};
/**
 * openchemlib - Manipulate molecules
 * @version v9.11.1
 * @date 2025-10-14T12:21:07.725Z
 * @link https://github.com/cheminfo/openchemlib-js
 * @license BSD-3-Clause
*/
