{"version":3,"file":"ink.mjs","sources":["../src/engine/Path.ts","../src/engine/Debug.ts","../src/engine/Value.ts","../src/engine/PushPop.ts","../src/engine/Error.ts","../src/engine/TypeAssertion.ts","../src/engine/NullException.ts","../src/engine/Object.ts","../src/engine/StringBuilder.ts","../src/engine/InkList.ts","../src/engine/StoryException.ts","../src/engine/TryGetResult.ts","../src/engine/SearchResult.ts","../src/engine/Container.ts","../src/engine/Glue.ts","../src/engine/ControlCommand.ts","../src/engine/Pointer.ts","../src/engine/Divert.ts","../src/engine/ChoicePoint.ts","../src/engine/VariableReference.ts","../src/engine/VariableAssignment.ts","../src/engine/Void.ts","../src/engine/NativeFunctionCall.ts","../src/engine/Tag.ts","../src/engine/Choice.ts","../src/engine/ListDefinition.ts","../src/engine/ListDefinitionsOrigin.ts","../src/engine/JsonSerialisation.ts","../src/engine/CallStack.ts","../src/engine/VariablesState.ts","../src/engine/PRNG.ts","../src/engine/StatePatch.ts","../src/engine/SimpleJson.ts","../src/engine/Flow.ts","../src/engine/StoryState.ts","../src/engine/StopWatch.ts","../src/engine/Story.ts"],"sourcesContent":["export class Path {\n  public static parentId = \"^\";\n\n  public _isRelative: boolean;\n  public _components: Path.Component[];\n  public _componentsString: string | null;\n\n  constructor();\n  constructor(componentsString: string);\n  constructor(head: Path.Component, tail: Path);\n  constructor(head: Path.Component[], relative?: boolean);\n  constructor() {\n    this._components = [];\n    this._componentsString = null;\n    this._isRelative = false;\n\n    if (typeof arguments[0] == \"string\") {\n      let componentsString = arguments[0] as string;\n      this.componentsString = componentsString;\n    } else if (\n      arguments[0] instanceof Path.Component &&\n      arguments[1] instanceof Path\n    ) {\n      let head = arguments[0] as Path.Component;\n      let tail = arguments[1] as Path;\n      this._components.push(head);\n      this._components = this._components.concat(tail._components);\n    } else if (arguments[0] instanceof Array) {\n      let head = arguments[0] as Path.Component[];\n      let relative = !!arguments[1] as boolean;\n      this._components = this._components.concat(head);\n      this._isRelative = relative;\n    }\n  }\n  get isRelative() {\n    return this._isRelative;\n  }\n  get componentCount(): number {\n    return this._components.length;\n  }\n  get head(): Path.Component | null {\n    if (this._components.length > 0) {\n      return this._components[0];\n    } else {\n      return null;\n    }\n  }\n  get tail(): Path {\n    if (this._components.length >= 2) {\n      // careful, the original code uses length-1 here. This is because the second argument of\n      // List.GetRange is a number of elements to extract, wherease Array.slice uses an index\n      let tailComps = this._components.slice(1, this._components.length);\n      return new Path(tailComps);\n    } else {\n      return Path.self;\n    }\n  }\n  get length(): number {\n    return this._components.length;\n  }\n  get lastComponent(): Path.Component | null {\n    let lastComponentIdx = this._components.length - 1;\n    if (lastComponentIdx >= 0) {\n      return this._components[lastComponentIdx];\n    } else {\n      return null;\n    }\n  }\n  get containsNamedComponent(): boolean {\n    for (let i = 0, l = this._components.length; i < l; i++) {\n      if (!this._components[i].isIndex) {\n        return true;\n      }\n    }\n    return false;\n  }\n  static get self(): Path {\n    let path = new Path();\n    path._isRelative = true;\n    return path;\n  }\n\n  public GetComponent(index: number): Path.Component {\n    return this._components[index];\n  }\n  public PathByAppendingPath(pathToAppend: Path): Path {\n    let p = new Path();\n\n    let upwardMoves = 0;\n    for (let i = 0; i < pathToAppend._components.length; ++i) {\n      if (pathToAppend._components[i].isParent) {\n        upwardMoves++;\n      } else {\n        break;\n      }\n    }\n\n    for (let i = 0; i < this._components.length - upwardMoves; ++i) {\n      p._components.push(this._components[i]);\n    }\n\n    for (let i = upwardMoves; i < pathToAppend._components.length; ++i) {\n      p._components.push(pathToAppend._components[i]);\n    }\n\n    return p;\n  }\n  get componentsString(): string {\n    if (this._componentsString == null) {\n      this._componentsString = this._components.join(\".\");\n      if (this.isRelative)\n        this._componentsString = \".\" + this._componentsString;\n    }\n\n    return this._componentsString;\n  }\n  set componentsString(value: string) {\n    this._components.length = 0;\n\n    this._componentsString = value;\n\n    if (this._componentsString == null || this._componentsString == \"\") return;\n\n    if (this._componentsString[0] == \".\") {\n      this._isRelative = true;\n      this._componentsString = this._componentsString.substring(1);\n    }\n\n    let componentStrings = this._componentsString.split(\".\");\n    for (let str of componentStrings) {\n      // we need to distinguish between named components that start with a number, eg \"42somewhere\", and indexed components\n      // the normal parseInt won't do for the detection because it's too relaxed.\n      // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt\n      if (/^(\\-|\\+)?([0-9]+|Infinity)$/.test(str)) {\n        this._components.push(new Path.Component(parseInt(str)));\n      } else {\n        this._components.push(new Path.Component(str));\n      }\n    }\n  }\n  public toString(): string {\n    return this.componentsString;\n  }\n  public Equals(otherPath: Path | null): boolean {\n    if (otherPath == null) return false;\n\n    if (otherPath._components.length != this._components.length) return false;\n\n    if (otherPath.isRelative != this.isRelative) return false;\n\n    // the original code uses SequenceEqual here, so we need to iterate over the components manually.\n    for (let i = 0, l = otherPath._components.length; i < l; i++) {\n      // it's not quite clear whether this test should use Equals or a simple == operator,\n      // see https://github.com/y-lohse/inkjs/issues/22\n      if (!otherPath._components[i].Equals(this._components[i])) return false;\n    }\n\n    return true;\n  }\n  public PathByAppendingComponent(c: Path.Component): Path {\n    let p = new Path();\n    p._components.push(...this._components);\n    p._components.push(c);\n    return p;\n  }\n}\n\nexport namespace Path {\n  export class Component {\n    public readonly index: number;\n    public readonly name: string | null;\n\n    constructor(indexOrName: string | number) {\n      this.index = -1;\n      this.name = null;\n      if (typeof indexOrName == \"string\") {\n        this.name = indexOrName;\n      } else {\n        this.index = indexOrName;\n      }\n    }\n    get isIndex(): boolean {\n      return this.index >= 0;\n    }\n    get isParent(): boolean {\n      return this.name == Path.parentId;\n    }\n\n    public static ToParent(): Component {\n      return new Component(Path.parentId);\n    }\n    public toString(): string | null {\n      if (this.isIndex) {\n        return this.index.toString();\n      } else {\n        return this.name;\n      }\n    }\n    public Equals(otherComp: Component): boolean {\n      if (otherComp != null && otherComp.isIndex == this.isIndex) {\n        if (this.isIndex) {\n          return this.index == otherComp.index;\n        } else {\n          return this.name == otherComp.name;\n        }\n      }\n\n      return false;\n    }\n  }\n}\n","export namespace Debug {\n  export function AssertType<T>(\n    variable: any,\n    type: new () => T,\n    message: string\n  ): void | never {\n    Assert(variable instanceof type, message);\n  }\n\n  export function Assert(condition: boolean, message?: string): void | never {\n    if (!condition) {\n      if (typeof message !== \"undefined\") {\n        console.warn(message);\n      }\n\n      if (console.trace) {\n        console.trace();\n      }\n\n      throw new Error(\"\");\n    }\n  }\n}\n","import { InkObject } from \"./Object\";\nimport { Path } from \"./Path\";\nimport { InkList, InkListItem } from \"./InkList\";\nimport { StoryException } from \"./StoryException\";\nimport { asOrNull, asOrThrows } from \"./TypeAssertion\";\nimport { tryParseInt, tryParseFloat } from \"./TryGetResult\";\nimport { throwNullException } from \"./NullException\";\n\nexport abstract class AbstractValue extends InkObject {\n  public abstract get valueType(): ValueType;\n  public abstract get isTruthy(): boolean;\n  public abstract get valueObject(): any;\n\n  public abstract Cast(newType: ValueType): Value<any>;\n\n  public static Create(\n    val: any,\n    preferredNumberType?: ValueType\n  ): Value<any> | null {\n    // This code doesn't exist in upstream and is simply here to enforce\n    // the creation of the proper number value.\n    // If `preferredNumberType` is not provided or if value doesn't match\n    // `preferredNumberType`, this conditional does nothing.\n    if (preferredNumberType) {\n      if (\n        preferredNumberType === (ValueType.Int as ValueType) &&\n        Number.isInteger(Number(val))\n      ) {\n        return new IntValue(Number(val));\n      } else if (\n        preferredNumberType === (ValueType.Float as ValueType) &&\n        !isNaN(val)\n      ) {\n        return new FloatValue(Number(val));\n      }\n    }\n\n    if (typeof val === \"boolean\") {\n      return new BoolValue(Boolean(val));\n    }\n\n    // https://github.com/y-lohse/inkjs/issues/425\n    // Changed condition sequence, because Number('') is\n    // parsed to 0, which made setting string to empty\n    // impossible\n    if (typeof val === \"string\") {\n      return new StringValue(String(val));\n    } else if (Number.isInteger(Number(val))) {\n      return new IntValue(Number(val));\n    } else if (!isNaN(val)) {\n      return new FloatValue(Number(val));\n    } else if (val instanceof Path) {\n      return new DivertTargetValue(asOrThrows(val, Path));\n    } else if (val instanceof InkList) {\n      return new ListValue(asOrThrows(val, InkList));\n    }\n\n    return null;\n  }\n  public Copy() {\n    return asOrThrows(AbstractValue.Create(this.valueObject), InkObject);\n  }\n  public BadCastException(targetType: ValueType) {\n    return new StoryException(\n      \"Can't cast \" +\n        this.valueObject +\n        \" from \" +\n        this.valueType +\n        \" to \" +\n        targetType\n    );\n  }\n}\n\nexport abstract class Value<\n  T extends { toString: () => string },\n> extends AbstractValue {\n  public value: T | null;\n\n  constructor(val: T | null) {\n    super();\n    this.value = val;\n  }\n  public get valueObject() {\n    return this.value;\n  }\n  public toString() {\n    if (this.value === null) return throwNullException(\"Value.value\");\n    return this.value.toString();\n  }\n}\n\nexport class BoolValue extends Value<boolean> {\n  constructor(val: boolean) {\n    super(val || false);\n  }\n  public get isTruthy() {\n    return Boolean(this.value);\n  }\n  public get valueType() {\n    return ValueType.Bool;\n  }\n\n  public Cast(newType: ValueType): Value<any> {\n    if (this.value === null) return throwNullException(\"Value.value\");\n\n    if (newType == this.valueType) {\n      return this;\n    }\n\n    if (newType == ValueType.Int) {\n      return new IntValue(this.value ? 1 : 0);\n    }\n\n    if (newType == ValueType.Float) {\n      return new FloatValue(this.value ? 1.0 : 0.0);\n    }\n\n    if (newType == ValueType.String) {\n      return new StringValue(this.value ? \"true\" : \"false\");\n    }\n\n    throw this.BadCastException(newType);\n  }\n\n  public toString() {\n    return this.value ? \"true\" : \"false\";\n  }\n}\n\nexport class IntValue extends Value<number> {\n  constructor(val: number) {\n    super(val || 0);\n  }\n  public get isTruthy() {\n    return this.value != 0;\n  }\n  public get valueType() {\n    return ValueType.Int;\n  }\n\n  public Cast(newType: ValueType): Value<any> {\n    if (this.value === null) return throwNullException(\"Value.value\");\n\n    if (newType == this.valueType) {\n      return this;\n    }\n\n    if (newType == ValueType.Bool) {\n      return new BoolValue(this.value === 0 ? false : true);\n    }\n\n    if (newType == ValueType.Float) {\n      return new FloatValue(this.value);\n    }\n\n    if (newType == ValueType.String) {\n      return new StringValue(\"\" + this.value);\n    }\n\n    throw this.BadCastException(newType);\n  }\n}\n\nexport class FloatValue extends Value<number> {\n  constructor(val: number) {\n    super(val || 0.0);\n  }\n  public get isTruthy() {\n    return this.value != 0.0;\n  }\n  public get valueType() {\n    return ValueType.Float;\n  }\n\n  public Cast(newType: ValueType): Value<any> {\n    if (this.value === null) return throwNullException(\"Value.value\");\n\n    if (newType == this.valueType) {\n      return this;\n    }\n\n    if (newType == ValueType.Bool) {\n      return new BoolValue(this.value === 0.0 ? false : true);\n    }\n\n    if (newType == ValueType.Int) {\n      return new IntValue(this.value);\n    }\n\n    if (newType == ValueType.String) {\n      return new StringValue(\"\" + this.value);\n    }\n\n    throw this.BadCastException(newType);\n  }\n}\n\nexport class StringValue extends Value<string> {\n  public _isNewline: boolean;\n  public _isInlineWhitespace: boolean;\n\n  constructor(val: string) {\n    super(val || \"\");\n\n    this._isNewline = this.value == \"\\n\";\n    this._isInlineWhitespace = true;\n\n    if (this.value === null) return throwNullException(\"Value.value\");\n\n    if (this.value.length > 0) {\n      this.value.split(\"\").every((c) => {\n        if (c != \" \" && c != \"\\t\") {\n          this._isInlineWhitespace = false;\n          return false;\n        }\n\n        return true;\n      });\n    }\n  }\n  public get valueType() {\n    return ValueType.String;\n  }\n  public get isTruthy() {\n    if (this.value === null) return throwNullException(\"Value.value\");\n    return this.value.length > 0;\n  }\n  public get isNewline() {\n    return this._isNewline;\n  }\n  public get isInlineWhitespace() {\n    return this._isInlineWhitespace;\n  }\n  public get isNonWhitespace() {\n    return !this.isNewline && !this.isInlineWhitespace;\n  }\n\n  public Cast(newType: ValueType): Value<any> {\n    if (newType == this.valueType) {\n      return this;\n    }\n\n    if (newType == ValueType.Int) {\n      let parsedInt = tryParseInt(this.value);\n      if (parsedInt.exists) {\n        return new IntValue(parsedInt.result);\n      } else {\n        throw this.BadCastException(newType);\n      }\n    }\n\n    if (newType == ValueType.Float) {\n      let parsedFloat = tryParseFloat(this.value);\n      if (parsedFloat.exists) {\n        return new FloatValue(parsedFloat.result);\n      } else {\n        throw this.BadCastException(newType);\n      }\n    }\n\n    throw this.BadCastException(newType);\n  }\n}\n\nexport class DivertTargetValue extends Value<Path> {\n  constructor(targetPath: Path | null = null) {\n    super(targetPath);\n  }\n  public get valueType() {\n    return ValueType.DivertTarget;\n  }\n  public get targetPath() {\n    if (this.value === null) return throwNullException(\"Value.value\");\n    return this.value;\n  }\n  public set targetPath(value: Path) {\n    this.value = value;\n  }\n  public get isTruthy(): never {\n    throw new Error(\"Shouldn't be checking the truthiness of a divert target\");\n  }\n\n  public Cast(newType: ValueType): Value<any> {\n    if (newType == this.valueType) return this;\n\n    throw this.BadCastException(newType);\n  }\n  public toString() {\n    return \"DivertTargetValue(\" + this.targetPath + \")\";\n  }\n}\n\nexport class VariablePointerValue extends Value<string> {\n  public _contextIndex: number;\n\n  constructor(variableName: string, contextIndex: number = -1) {\n    super(variableName);\n\n    this._contextIndex = contextIndex;\n  }\n\n  public get contextIndex() {\n    return this._contextIndex;\n  }\n  public set contextIndex(value: number) {\n    this._contextIndex = value;\n  }\n  public get variableName() {\n    if (this.value === null) return throwNullException(\"Value.value\");\n    return this.value;\n  }\n  public set variableName(value: string) {\n    this.value = value;\n  }\n  public get valueType() {\n    return ValueType.VariablePointer;\n  }\n\n  public get isTruthy(): never {\n    throw new Error(\n      \"Shouldn't be checking the truthiness of a variable pointer\"\n    );\n  }\n\n  public Cast(newType: ValueType): Value<any> {\n    if (newType == this.valueType) return this;\n\n    throw this.BadCastException(newType);\n  }\n  public toString() {\n    return \"VariablePointerValue(\" + this.variableName + \")\";\n  }\n  public Copy() {\n    return new VariablePointerValue(this.variableName, this.contextIndex);\n  }\n}\n\nexport class ListValue extends Value<InkList> {\n  public get isTruthy() {\n    if (this.value === null) {\n      return throwNullException(\"this.value\");\n    }\n    return this.value.Count > 0;\n  }\n  public get valueType() {\n    return ValueType.List;\n  }\n  public Cast(newType: ValueType): Value<any> {\n    if (this.value === null) return throwNullException(\"Value.value\");\n\n    if (newType == ValueType.Int) {\n      let max = this.value.maxItem;\n      if (max.Key.isNull) return new IntValue(0);\n      else return new IntValue(max.Value);\n    } else if (newType == ValueType.Float) {\n      let max = this.value.maxItem;\n      if (max.Key.isNull) return new FloatValue(0.0);\n      else return new FloatValue(max.Value);\n    } else if (newType == ValueType.String) {\n      let max = this.value.maxItem;\n      if (max.Key.isNull) return new StringValue(\"\");\n      else {\n        return new StringValue(max.Key.toString());\n      }\n    }\n\n    if (newType == this.valueType) return this;\n\n    throw this.BadCastException(newType);\n  }\n  constructor();\n  constructor(list: InkList);\n  constructor(listOrSingleItem: InkListItem, singleValue: number);\n  constructor(listOrSingleItem?: InkListItem | InkList, singleValue?: number) {\n    super(null);\n\n    if (!listOrSingleItem && !singleValue) {\n      this.value = new InkList();\n    } else if (listOrSingleItem instanceof InkList) {\n      this.value = new InkList(listOrSingleItem);\n    } else if (\n      listOrSingleItem instanceof InkListItem &&\n      typeof singleValue === \"number\"\n    ) {\n      this.value = new InkList({\n        Key: listOrSingleItem,\n        Value: singleValue,\n      });\n    }\n  }\n  public static RetainListOriginsForAssignment(\n    oldValue: InkObject | null,\n    newValue: InkObject\n  ) {\n    let oldList = asOrNull(oldValue, ListValue);\n    let newList = asOrNull(newValue, ListValue);\n\n    if (newList && newList.value === null)\n      return throwNullException(\"newList.value\");\n    if (oldList && oldList.value === null)\n      return throwNullException(\"oldList.value\");\n\n    // When assigning the empty list, try to retain any initial origin names\n    if (oldList && newList && newList.value!.Count == 0)\n      newList.value!.SetInitialOriginNames(oldList.value!.originNames);\n  }\n}\n\nexport enum ValueType {\n  Bool = -1,\n  Int = 0,\n  Float = 1,\n  List = 2,\n  String = 3,\n  DivertTarget = 4,\n  VariablePointer = 5,\n}\n","export enum PushPopType {\n  Tunnel = 0,\n  Function = 1,\n  FunctionEvaluationFromGame = 2,\n}\n","// TODO: Unify with Compiler.\n\nexport type ErrorHandler = (message: string, type: ErrorType) => void;\n\nexport enum ErrorType {\n  Author,\n  Warning,\n  Error,\n}\n","import { INamedContent } from \"./INamedContent\";\n\nexport function asOrNull<T>(\n  obj: any,\n  type: (new (...arg: any[]) => T) | (Function & { prototype: T })\n): T | null {\n  if (obj instanceof type) {\n    return unsafeTypeAssertion(obj, type);\n  } else {\n    return null;\n  }\n}\n\nexport function asOrThrows<T>(\n  obj: any,\n  type: (new (...arg: any[]) => T) | (Function & { prototype: T })\n): T | never {\n  if (obj instanceof type) {\n    return unsafeTypeAssertion(obj, type);\n  } else {\n    throw new Error(`${obj} is not of type ${type}`);\n  }\n}\n\nexport function asNumberOrThrows(obj: any) {\n  if (typeof obj === \"number\") {\n    return obj as number;\n  } else {\n    throw new Error(`${obj} is not a number`);\n  }\n}\n\nexport function asBooleanOrThrows(obj: any) {\n  if (typeof obj === \"boolean\") {\n    return obj as boolean;\n  } else {\n    throw new Error(`${obj} is not a boolean`);\n  }\n}\n\n// So here, in the reference implementation, contentObj is casted to an INamedContent\n// but here we use js-style duck typing: if it implements the same props as the interface,\n// we treat it as valid.\nexport function asINamedContentOrNull(obj: any): INamedContent | null {\n  if (obj.hasValidName && obj.name) {\n    return obj as INamedContent;\n  }\n\n  return null;\n}\n\nexport function nullIfUndefined<T>(obj: T | undefined): T | null {\n  if (typeof obj === \"undefined\") {\n    return null;\n  }\n\n  return obj;\n}\n\nexport function isEquatable(type: any) {\n  return typeof type === \"object\" && typeof type.Equals === \"function\";\n}\n\nfunction unsafeTypeAssertion<T>(\n  obj: any,\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  type: (new () => T) | (Function & { prototype: T })\n) {\n  return obj as T;\n}\n\nexport function filterUndef<T>(element: T | undefined): element is T {\n  return element != undefined;\n}\n","/**\n * In the original C# code, a SystemException would be thrown when passing\n * null to methods expected a valid instance. Javascript has no such\n * concept, but TypeScript will not allow `null` to be passed to methods\n * explicitely requiring a valid type.\n *\n * Whenever TypeScript complain about the possibility of a `null` value,\n * check the offending value and it it's null, throw this exception using\n * `throwNullException(name: string)`.\n */\nexport class NullException extends Error {}\n\n/**\n * Throw a NullException.\n *\n * @param name a short description of the offending value (often its name within the code).\n */\nexport function throwNullException(name: string): never {\n  throw new NullException(`${name} is null or undefined`);\n}\n","import { Path } from \"./Path\";\nimport { Container } from \"./Container\";\nimport { Debug } from \"./Debug\";\nimport { asOrNull, asINamedContentOrNull } from \"./TypeAssertion\";\nimport { throwNullException } from \"./NullException\";\nimport { SearchResult } from \"./SearchResult\";\nimport { DebugMetadata } from \"./DebugMetadata\";\n\nexport class InkObject {\n  public parent: InkObject | null = null;\n\n  get debugMetadata(): DebugMetadata | null {\n    if (this._debugMetadata === null) {\n      if (this.parent) {\n        return this.parent.debugMetadata;\n      }\n    }\n\n    return this._debugMetadata;\n  }\n\n  set debugMetadata(value) {\n    this._debugMetadata = value;\n  }\n\n  get ownDebugMetadata() {\n    return this._debugMetadata;\n  }\n\n  private _debugMetadata: DebugMetadata | null = null;\n\n  public DebugLineNumberOfPath(path: Path) {\n    if (path === null) return null;\n\n    // Try to get a line number from debug metadata\n    let root = this.rootContentContainer;\n    if (root) {\n      let targetContent = root.ContentAtPath(path).obj;\n      if (targetContent) {\n        let dm = targetContent.debugMetadata;\n        if (dm !== null) {\n          return dm.startLineNumber;\n        }\n      }\n    }\n\n    return null;\n  }\n\n  get path() {\n    if (this._path == null) {\n      if (this.parent == null) {\n        this._path = new Path();\n      } else {\n        let comps: Path.Component[] = [];\n\n        let child: InkObject = this;\n        let container = asOrNull(child.parent, Container);\n\n        while (container !== null) {\n          let namedChild = asINamedContentOrNull(child);\n          if (namedChild != null && namedChild.hasValidName) {\n            if (namedChild.name === null)\n              return throwNullException(\"namedChild.name\");\n            comps.unshift(new Path.Component(namedChild.name!));\n          } else {\n            comps.unshift(new Path.Component(container.content.indexOf(child)));\n          }\n\n          child = container;\n          container = asOrNull(container.parent, Container);\n        }\n\n        this._path = new Path(comps);\n      }\n    }\n\n    return this._path;\n  }\n  private _path: Path | null = null;\n\n  public ResolvePath(path: Path | null): SearchResult {\n    if (path === null) return throwNullException(\"path\");\n    if (path.isRelative) {\n      let nearestContainer = asOrNull(this, Container);\n\n      if (nearestContainer === null) {\n        Debug.Assert(\n          this.parent !== null,\n          \"Can't resolve relative path because we don't have a parent\"\n        );\n        nearestContainer = asOrNull(this.parent, Container);\n        Debug.Assert(\n          nearestContainer !== null,\n          \"Expected parent to be a container\"\n        );\n        Debug.Assert(path.GetComponent(0).isParent);\n        path = path.tail;\n      }\n\n      if (nearestContainer === null) {\n        return throwNullException(\"nearestContainer\");\n      }\n      return nearestContainer.ContentAtPath(path);\n    } else {\n      let contentContainer = this.rootContentContainer;\n      if (contentContainer === null) {\n        return throwNullException(\"contentContainer\");\n      }\n      return contentContainer.ContentAtPath(path);\n    }\n  }\n\n  public ConvertPathToRelative(globalPath: Path) {\n    let ownPath = this.path;\n\n    let minPathLength = Math.min(globalPath.length, ownPath.length);\n    let lastSharedPathCompIndex = -1;\n\n    for (let i = 0; i < minPathLength; ++i) {\n      let ownComp = ownPath.GetComponent(i);\n      let otherComp = globalPath.GetComponent(i);\n\n      if (ownComp.Equals(otherComp)) {\n        lastSharedPathCompIndex = i;\n      } else {\n        break;\n      }\n    }\n\n    // No shared path components, so just use global path\n    if (lastSharedPathCompIndex == -1) return globalPath;\n\n    let numUpwardsMoves = ownPath.componentCount - 1 - lastSharedPathCompIndex;\n\n    let newPathComps: Path.Component[] = [];\n\n    for (let up = 0; up < numUpwardsMoves; ++up)\n      newPathComps.push(Path.Component.ToParent());\n\n    for (\n      let down = lastSharedPathCompIndex + 1;\n      down < globalPath.componentCount;\n      ++down\n    )\n      newPathComps.push(globalPath.GetComponent(down));\n\n    let relativePath = new Path(newPathComps, true);\n    return relativePath;\n  }\n\n  public CompactPathString(otherPath: Path) {\n    let globalPathStr = null;\n    let relativePathStr = null;\n\n    if (otherPath.isRelative) {\n      relativePathStr = otherPath.componentsString;\n      globalPathStr = this.path.PathByAppendingPath(otherPath).componentsString;\n    } else {\n      let relativePath = this.ConvertPathToRelative(otherPath);\n      relativePathStr = relativePath.componentsString;\n      globalPathStr = otherPath.componentsString;\n    }\n\n    if (relativePathStr.length < globalPathStr.length) return relativePathStr;\n    else return globalPathStr;\n  }\n\n  get rootContentContainer() {\n    let ancestor: InkObject = this;\n    while (ancestor.parent) {\n      ancestor = ancestor.parent;\n    }\n    return asOrNull(ancestor, Container);\n  }\n\n  public Copy(): InkObject {\n    throw Error(\"Not Implemented: Doesn't support copying\");\n  }\n  // SetChild works slightly diferently in the js implementation.\n  // Since we can't pass an objets property by reference, we instead pass\n  // the object and the property string.\n  // TODO: This method can probably be rewritten with type-safety in mind.\n  public SetChild(obj: any, prop: any, value: any) {\n    if (obj[prop]) obj[prop] = null;\n\n    obj[prop] = value;\n\n    if (obj[prop]) obj[prop].parent = this;\n  }\n\n  public Equals(obj: any) {\n    return obj === this;\n  }\n}\n","export class StringBuilder {\n  private string: string;\n\n  constructor(str?: string) {\n    str = typeof str !== \"undefined\" ? str.toString() : \"\";\n    this.string = str;\n  }\n  get Length(): number {\n    return this.string.length;\n  }\n  public Append(str: string | null) {\n    if (str !== null) {\n      this.string += str;\n    }\n  }\n  public AppendLine(str?: string) {\n    if (typeof str !== \"undefined\") this.Append(str);\n    this.string += \"\\n\";\n  }\n  public AppendFormat(format: string, ...args: any[]) {\n    // taken from http://stackoverflow.com/questions/610406/javascript-equivalent-to-printf-string-format\n    this.string += format.replace(/{(\\d+)}/g, (match: string, num: number) =>\n      typeof args[num] != \"undefined\" ? args[num] : match\n    );\n  }\n  public toString(): string {\n    return this.string;\n  }\n\n  public Clear() {\n    this.string = \"\";\n  }\n}\n","import { throwNullException } from \"./NullException\";\nimport { StringBuilder } from \"./StringBuilder\";\nimport { ListDefinition } from \"./ListDefinition\";\nimport { Story } from \"./Story\";\n\nexport class InkListItem implements IInkListItem {\n  // InkListItem is a struct\n\n  public readonly originName: string | null = null;\n  public readonly itemName: string | null = null;\n\n  constructor(originName: string | null, itemName: string | null);\n  constructor(fullName: string | null);\n  constructor() {\n    if (typeof arguments[1] !== \"undefined\") {\n      let originName = arguments[0] as string | null;\n      let itemName = arguments[1] as string | null;\n\n      this.originName = originName;\n      this.itemName = itemName;\n    } else if (arguments[0]) {\n      let fullName = arguments[0] as string;\n\n      let nameParts = fullName.toString().split(\".\");\n      this.originName = nameParts[0];\n      this.itemName = nameParts[1];\n    }\n  }\n  public static get Null() {\n    return new InkListItem(null, null);\n  }\n  public get isNull() {\n    return this.originName == null && this.itemName == null;\n  }\n  get fullName() {\n    return (\n      (this.originName !== null ? this.originName : \"?\") + \".\" + this.itemName\n    );\n  }\n  public toString(): string {\n    return this.fullName;\n  }\n  public Equals(obj: InkListItem) {\n    if (obj instanceof InkListItem) {\n      let otherItem = obj;\n      return (\n        otherItem.itemName == this.itemName &&\n        otherItem.originName == this.originName\n      );\n    }\n\n    return false;\n  }\n\n  // These methods did not exist in the original C# code. Their purpose is to\n  // make `InkListItem` mimics the value-type semantics of the original\n  // struct. Please refer to the end of this file, for a more in-depth\n  // explanation.\n\n  /**\n   * Returns a shallow clone of the current instance.\n   */\n  public copy() {\n    return new InkListItem(this.originName, this.itemName);\n  }\n  /**\n   * Returns a `SerializedInkListItem` representing the current\n   * instance. The result is intended to be used as a key inside a Map.\n   */\n  public serialized(): SerializedInkListItem {\n    // We are simply using a JSON representation as a value-typed key.\n    return JSON.stringify({\n      originName: this.originName,\n      itemName: this.itemName,\n    });\n  }\n\n  /**\n   * Reconstructs a `InkListItem` from the given SerializedInkListItem.\n   */\n  public static fromSerializedKey(key: SerializedInkListItem): InkListItem {\n    let obj = JSON.parse(key);\n    if (!InkListItem.isLikeInkListItem(obj)) return InkListItem.Null;\n\n    let inkListItem = obj as IInkListItem;\n\n    return new InkListItem(inkListItem.originName, inkListItem.itemName);\n  }\n\n  /**\n   * Determines whether the given item is sufficiently `InkListItem`-like\n   * to be used as a template when reconstructing the InkListItem.\n   */\n  private static isLikeInkListItem(item: any) {\n    if (typeof item !== \"object\") return false;\n    if (!item.hasOwnProperty(\"originName\") || !item.hasOwnProperty(\"itemName\"))\n      return false;\n    if (typeof item.originName !== \"string\" && typeof item.originName !== null)\n      return false;\n    if (typeof item.itemName !== \"string\" && typeof item.itemName !== null)\n      return false;\n\n    return true;\n  }\n}\n\nexport class InkList extends Map<SerializedInkListItem, number> {\n  public origins: ListDefinition[] | null = null;\n  public _originNames: string[] | null = [];\n\n  constructor();\n  constructor(otherList: InkList);\n  constructor(singleOriginListName: string, originStory: Story);\n  constructor(singleElement: KeyValuePair<InkListItem, number>);\n  constructor() {\n    // Trying to be smart here, this emulates the constructor inheritance found\n    // in the original code, but only if otherList is an InkList. IIFE FTW.\n    super(\n      (() => {\n        if (arguments[0] instanceof InkList) {\n          return arguments[0];\n        } else {\n          return [];\n        }\n      })()\n    );\n\n    if (arguments[0] instanceof InkList) {\n      let otherList = arguments[0] as InkList;\n\n      let otherOriginNames = otherList.originNames as string[];\n      if (otherOriginNames !== null)\n        this._originNames = otherOriginNames.slice();\n      if (otherList.origins !== null) {\n        this.origins = otherList.origins.slice();\n      }\n    } else if (typeof arguments[0] === \"string\") {\n      let singleOriginListName = arguments[0] as string;\n      let originStory = arguments[1] as Story;\n      this.SetInitialOriginName(singleOriginListName);\n\n      if (originStory.listDefinitions === null) {\n        return throwNullException(\"originStory.listDefinitions\");\n      }\n      let def = originStory.listDefinitions.TryListGetDefinition(\n        singleOriginListName,\n        null\n      );\n      if (def.exists) {\n        // Throwing now, because if the value is `null` it will\n        // eventually throw down the line.\n        if (def.result === null) {\n          return throwNullException(\"def.result\");\n        }\n        this.origins = [def.result];\n      } else {\n        throw new Error(\n          \"InkList origin could not be found in story when constructing new list: \" +\n            singleOriginListName\n        );\n      }\n    } else if (\n      typeof arguments[0] === \"object\" &&\n      arguments[0].hasOwnProperty(\"Key\") &&\n      arguments[0].hasOwnProperty(\"Value\")\n    ) {\n      let singleElement = arguments[0] as KeyValuePair<InkListItem, number>;\n      this.Add(singleElement.Key, singleElement.Value);\n    }\n  }\n\n  public static FromString(myListItem: string, originStory: Story) {\n    if (myListItem == null || myListItem == \"\") return new InkList();\n    let listValue =\n      originStory.listDefinitions?.FindSingleItemListWithName(myListItem);\n    if (listValue) {\n      if (listValue.value === null) {\n        return throwNullException(\"listValue.value\");\n      }\n      return new InkList(listValue.value);\n    } else {\n      throw new Error(\n        \"Could not find the InkListItem from the string '\" +\n          myListItem +\n          \"' to create an InkList because it doesn't exist in the original list definition in ink.\"\n      );\n    }\n  }\n\n  public AddItem(\n    itemOrItemName: InkListItem | string | null,\n    storyObject: Story | null = null\n  ) {\n    if (itemOrItemName instanceof InkListItem) {\n      let item = itemOrItemName;\n\n      if (item.originName == null) {\n        this.AddItem(item.itemName);\n        return;\n      }\n\n      if (this.origins === null) return throwNullException(\"this.origins\");\n\n      for (let origin of this.origins) {\n        if (origin.name == item.originName) {\n          let intVal = origin.TryGetValueForItem(item, 0);\n          if (intVal.exists) {\n            this.Add(item, intVal.result);\n            return;\n          } else {\n            throw new Error(\n              \"Could not add the item \" +\n                item +\n                \" to this list because it doesn't exist in the original list definition in ink.\"\n            );\n          }\n        }\n      }\n\n      throw new Error(\n        \"Failed to add item to list because the item was from a new list definition that wasn't previously known to this list. Only items from previously known lists can be used, so that the int value can be found.\"\n      );\n    } else if (itemOrItemName !== null) {\n      //itemOrItemName is a string\n      let itemName = itemOrItemName as string;\n\n      let foundListDef: ListDefinition | null = null;\n\n      if (this.origins === null) return throwNullException(\"this.origins\");\n\n      for (let origin of this.origins) {\n        if (itemName === null) return throwNullException(\"itemName\");\n\n        if (origin.ContainsItemWithName(itemName)) {\n          if (foundListDef != null) {\n            throw new Error(\n              \"Could not add the item \" +\n                itemName +\n                \" to this list because it could come from either \" +\n                origin.name +\n                \" or \" +\n                foundListDef.name\n            );\n          } else {\n            foundListDef = origin;\n          }\n        }\n      }\n\n      if (foundListDef == null) {\n        if (storyObject == null) {\n          throw new Error(\n            \"Could not add the item \" +\n              itemName +\n              \" to this list because it isn't known to any list definitions previously associated with this list.\"\n          );\n        } else {\n          let newItem = InkList.FromString(itemName, storyObject)\n            .orderedItems[0];\n          this.Add(newItem.Key, newItem.Value);\n        }\n      } else {\n        let item = new InkListItem(foundListDef.name, itemName);\n        let itemVal = foundListDef.ValueForItem(item);\n        this.Add(item, itemVal);\n      }\n    }\n  }\n  public ContainsItemNamed(itemName: string | null) {\n    for (let [key] of this) {\n      let item = InkListItem.fromSerializedKey(key);\n      if (item.itemName == itemName) return true;\n    }\n\n    return false;\n  }\n  public ContainsKey(key: InkListItem) {\n    return this.has(key.serialized());\n  }\n  public Add(key: InkListItem, value: number) {\n    let serializedKey = key.serialized();\n    if (this.has(serializedKey)) {\n      // Throw an exception to match the C# behavior.\n      throw new Error(`The Map already contains an entry for ${key}`);\n    }\n    this.set(serializedKey, value);\n  }\n  public Remove(key: InkListItem) {\n    return this.delete(key.serialized());\n  }\n  get Count() {\n    return this.size;\n  }\n  get originOfMaxItem(): ListDefinition | null {\n    if (this.origins == null) return null;\n\n    let maxOriginName = this.maxItem.Key.originName;\n    let result = null;\n    this.origins.every((origin) => {\n      if (origin.name == maxOriginName) {\n        result = origin;\n        return false;\n      } else return true;\n    });\n\n    return result;\n  }\n  get originNames(): string[] {\n    if (this.Count > 0) {\n      if (this._originNames == null && this.Count > 0) this._originNames = [];\n      else {\n        if (!this._originNames) this._originNames = [];\n        this._originNames.length = 0;\n      }\n\n      for (let [key] of this) {\n        let item = InkListItem.fromSerializedKey(key);\n        if (item.originName === null)\n          return throwNullException(\"item.originName\");\n        this._originNames.push(item.originName);\n      }\n    }\n\n    return this._originNames as string[];\n  }\n  public SetInitialOriginName(initialOriginName: string) {\n    this._originNames = [initialOriginName];\n  }\n  public SetInitialOriginNames(initialOriginNames: string[]) {\n    if (initialOriginNames == null) this._originNames = null;\n    else this._originNames = initialOriginNames.slice(); // store a copy\n  }\n  get maxItem() {\n    let max: KeyValuePair<InkListItem, number> = {\n      Key: InkListItem.Null,\n      Value: 0,\n    };\n    for (let [key, value] of this) {\n      let item = InkListItem.fromSerializedKey(key);\n      if (max.Key.isNull || value > max.Value)\n        max = { Key: item, Value: value };\n    }\n\n    return max;\n  }\n  get minItem() {\n    let min: KeyValuePair<InkListItem, number> = {\n      Key: InkListItem.Null,\n      Value: 0,\n    };\n    for (let [key, value] of this) {\n      let item = InkListItem.fromSerializedKey(key);\n      if (min.Key.isNull || value < min.Value) {\n        min = { Key: item, Value: value };\n      }\n    }\n    return min;\n  }\n  get inverse() {\n    let list = new InkList();\n    if (this.origins != null) {\n      for (let origin of this.origins) {\n        for (let [key, value] of origin.items) {\n          let item = InkListItem.fromSerializedKey(key);\n          if (!this.ContainsKey(item)) list.Add(item, value);\n        }\n      }\n    }\n    return list;\n  }\n  get all() {\n    let list = new InkList();\n    if (this.origins != null) {\n      for (let origin of this.origins) {\n        for (let [key, value] of origin.items) {\n          let item = InkListItem.fromSerializedKey(key);\n          list.set(item.serialized(), value);\n        }\n      }\n    }\n    return list;\n  }\n  public Union(otherList: InkList) {\n    let union = new InkList(this);\n    for (let [key, value] of otherList) {\n      union.set(key, value);\n    }\n    return union;\n  }\n  public Intersect(otherList: InkList) {\n    let intersection = new InkList();\n    for (let [key, value] of this) {\n      if (otherList.has(key)) intersection.set(key, value);\n    }\n\n    return intersection;\n  }\n  public HasIntersection(otherList: InkList): boolean {\n    for (let [key] of this) {\n      if (otherList.has(key)) return true;\n    }\n    return false;\n  }\n  public Without(listToRemove: InkList) {\n    let result = new InkList(this);\n    for (let [key] of listToRemove) {\n      result.delete(key);\n    }\n\n    return result;\n  }\n\n  public Contains(key: string): boolean;\n  public Contains(otherList: InkList): boolean;\n  public Contains(what: string | InkList): boolean {\n    if (typeof what == \"string\") return this.ContainsItemNamed(what);\n    const otherList = what;\n    if (otherList.size == 0 || this.size == 0) return false;\n    for (let [key] of otherList) {\n      if (!this.has(key)) return false;\n    }\n\n    return true;\n  }\n  public GreaterThan(otherList: InkList) {\n    if (this.Count == 0) return false;\n    if (otherList.Count == 0) return true;\n\n    return this.minItem.Value > otherList.maxItem.Value;\n  }\n  public GreaterThanOrEquals(otherList: InkList) {\n    if (this.Count == 0) return false;\n    if (otherList.Count == 0) return true;\n\n    return (\n      this.minItem.Value >= otherList.minItem.Value &&\n      this.maxItem.Value >= otherList.maxItem.Value\n    );\n  }\n  public LessThan(otherList: InkList) {\n    if (otherList.Count == 0) return false;\n    if (this.Count == 0) return true;\n\n    return this.maxItem.Value < otherList.minItem.Value;\n  }\n  public LessThanOrEquals(otherList: InkList) {\n    if (otherList.Count == 0) return false;\n    if (this.Count == 0) return true;\n\n    return (\n      this.maxItem.Value <= otherList.maxItem.Value &&\n      this.minItem.Value <= otherList.minItem.Value\n    );\n  }\n  public MaxAsList() {\n    if (this.Count > 0) return new InkList(this.maxItem);\n    else return new InkList();\n  }\n  public MinAsList() {\n    if (this.Count > 0) return new InkList(this.minItem);\n    else return new InkList();\n  }\n  public ListWithSubRange(minBound: any, maxBound: any) {\n    if (this.Count == 0) return new InkList();\n\n    let ordered = this.orderedItems;\n\n    let minValue = 0;\n    let maxValue = Number.MAX_SAFE_INTEGER;\n\n    if (Number.isInteger(minBound)) {\n      minValue = minBound;\n    } else {\n      if (minBound instanceof InkList && minBound.Count > 0)\n        minValue = minBound.minItem.Value;\n    }\n\n    if (Number.isInteger(maxBound)) {\n      maxValue = maxBound;\n    } else {\n      if (maxBound instanceof InkList && maxBound.Count > 0)\n        maxValue = maxBound.maxItem.Value;\n    }\n\n    let subList = new InkList();\n    subList.SetInitialOriginNames(this.originNames);\n    for (let item of ordered) {\n      if (item.Value >= minValue && item.Value <= maxValue) {\n        subList.Add(item.Key, item.Value);\n      }\n    }\n\n    return subList;\n  }\n  public Equals(otherInkList: InkList) {\n    if (otherInkList instanceof InkList === false) return false;\n    if (otherInkList.Count != this.Count) return false;\n\n    for (let [key] of this) {\n      if (!otherInkList.has(key)) return false;\n    }\n\n    return true;\n  }\n  // GetHashCode not implemented\n  get orderedItems() {\n    // List<KeyValuePair<InkListItem, int>>\n    let ordered = new Array<KeyValuePair<InkListItem, number>>();\n\n    for (let [key, value] of this) {\n      let item = InkListItem.fromSerializedKey(key);\n      ordered.push({ Key: item, Value: value });\n    }\n\n    ordered.sort((x, y) => {\n      if (x.Key.originName === null) {\n        return throwNullException(\"x.Key.originName\");\n      }\n      if (y.Key.originName === null) {\n        return throwNullException(\"y.Key.originName\");\n      }\n\n      if (x.Value == y.Value) {\n        return x.Key.originName.localeCompare(y.Key.originName);\n      } else {\n        // TODO: refactor this bit into a numberCompareTo method?\n        if (x.Value < y.Value) return -1;\n        return x.Value > y.Value ? 1 : 0;\n      }\n    });\n\n    return ordered;\n  }\n\n  get singleItem(): InkListItem | null {\n    for (let item of this.orderedItems) {\n      return item.Key;\n    }\n    return null;\n  }\n\n  public toString() {\n    let ordered = this.orderedItems;\n\n    let sb = new StringBuilder();\n    for (let i = 0; i < ordered.length; i++) {\n      if (i > 0) sb.Append(\", \");\n\n      let item = ordered[i].Key;\n      if (item.itemName === null) return throwNullException(\"item.itemName\");\n      sb.Append(item.itemName);\n    }\n\n    return sb.toString();\n  }\n  // casting a InkList to a Number, for somereason, actually gives a number.\n  // This messes up the type detection when creating a Value from a InkList.\n  // Returning NaN here prevents that.\n  public valueOf() {\n    return NaN;\n  }\n}\n\n/**\n * In the original C# code, `InkListItem` was defined as value type, meaning\n * that two `InkListItem` would be considered equal as long as they held the\n * same values. This doesn't hold true in Javascript, as `InkListItem` is a\n * reference type (Javascript doesn't allow the creation of custom value types).\n *\n * The key equality of Map objects is based on the \"SameValueZero\" algorithm;\n * since `InkListItem` is a value type, two keys will only be considered\n * equal if they are, in fact, the same object. As we are trying to emulate\n * the original behavior as close as possible, this will lead to unforeseen\n * side effects.\n *\n * In order to have a key equality based on value semantics, we'll convert\n * `InkListItem` to a valid string representation and use this representation\n * as a key (strings are value types in Javascript). Rather than using the\n * type `string` directly, we'll alias it to `SerializedInkListItem` and use\n * this type as the key for our Map-based `InkList`.\n *\n * Reducing `InkListItem` to a JSON representation would not be bulletproof\n * in the general case, but for our needs it works well. The major downside of\n * this method is that we will have to to reconstruct the original `InkListItem`\n * every time we'll need to access its properties.\n */\nexport type SerializedInkListItem = string;\n\n/**\n * An interface inherited by `InkListItem`, defining exposed\n * properties. It's mainly used when deserializing a `InkListItem` from its\n * key (`SerializedInkListItem`)\n */\ninterface IInkListItem {\n  readonly originName: string | null;\n  readonly itemName: string | null;\n}\nexport interface KeyValuePair<K, V> {\n  Key: K;\n  Value: V;\n}\n","export class StoryException extends Error {\n  public useEndLineNumber: boolean;\n  public message: string;\n  public name: string;\n\n  constructor(message: string) {\n    super(message);\n    this.useEndLineNumber = false;\n    this.message = message;\n    this.name = \"StoryException\";\n  }\n}\n","/**\n * This interface normalize the `TryGet` behavior found in the original\n * C# project. Any `TryGet` method will return a object conforming to this\n * interface.\n *\n * The original function returns a boolean and has a second parameter called\n * item that is an `out`. Both are needed and we can't just return the item\n * because it'll always be truthy. Instead, we return an object containing\n * whether the result exists (`exists`) and the result itself (`result`).\n *\n * For instance a `TryGet` prototype would look like this:\n```\nTryGetItemWithValue(val: number, item: InkListItem): TryGetResult<InkListItem>{\n```\n *\n * On the other hand, dealing with the result can be done in the following way:\n```\nvar item = item.TryGetItemWithValue(intVal, InkListItem.Null);\nif (item.exists) {\n\tconsole.log(item.result)\n}\n```\n *\n */\nexport interface TryGetResult<T> {\n  result: T;\n  exists: boolean;\n}\n\nexport function tryGetValueFromMap<K, V>(\n  map: Map<K, V> | null,\n  key: K,\n  /* out */ value: V\n): TryGetResult<V> {\n  if (map === null) {\n    return { result: value, exists: false };\n  }\n\n  let val = map.get(key);\n\n  if (typeof val === \"undefined\") {\n    return { result: value, exists: false };\n  } else {\n    return { result: val, exists: true };\n  }\n}\n\nexport function tryParseInt(\n  value: any,\n  /* out */ defaultValue: number = 0\n): TryGetResult<number> {\n  let val = parseInt(value);\n\n  if (!Number.isNaN(val)) {\n    return { result: val, exists: true };\n  } else {\n    return { result: defaultValue, exists: false };\n  }\n}\n\nexport function tryParseFloat(\n  value: any,\n  /* out */ defaultValue: number = 0\n): TryGetResult<number> {\n  let val = parseFloat(value);\n\n  if (!Number.isNaN(val)) {\n    return { result: val, exists: true };\n  } else {\n    return { result: defaultValue, exists: false };\n  }\n}\n","import { InkObject } from \"./Object\";\nimport { Container } from \"./Container\";\n\nexport class SearchResult {\n  public obj: InkObject | null = null;\n  public approximate: boolean = false;\n\n  get correctObj() {\n    return this.approximate ? null : this.obj;\n  }\n\n  get container() {\n    return this.obj instanceof Container ? this.obj : null;\n  }\n\n  public copy() {\n    let searchResult = new SearchResult();\n    searchResult.obj = this.obj;\n    searchResult.approximate = this.approximate;\n\n    return searchResult;\n  }\n}\n","import { StringValue } from \"./Value\";\nimport { throwNullException } from \"./NullException\";\nimport { StringBuilder } from \"./StringBuilder\";\nimport { INamedContent } from \"./INamedContent\";\nimport { InkObject } from \"./Object\";\nimport { SearchResult } from \"./SearchResult\";\nimport { Path } from \"./Path\";\nimport { Debug } from \"./Debug\";\nimport { tryGetValueFromMap } from \"./TryGetResult\";\nimport { asINamedContentOrNull, asOrNull, asOrThrows } from \"./TypeAssertion\";\n\nexport class Container extends InkObject implements INamedContent {\n  public name: string | null = null;\n\n  public _content: InkObject[] = [];\n  public namedContent: Map<string, INamedContent> = new Map();\n\n  public visitsShouldBeCounted: boolean = false;\n  public turnIndexShouldBeCounted: boolean = false;\n  public countingAtStartOnly: boolean = false;\n\n  public _pathToFirstLeafContent: Path | null = null;\n\n  get hasValidName() {\n    return this.name != null && this.name.length > 0;\n  }\n  get content() {\n    return this._content;\n  }\n  set content(value: InkObject[]) {\n    this.AddContent(value);\n  }\n  get namedOnlyContent() {\n    let namedOnlyContentDict: Map<string, InkObject> | null = new Map();\n\n    for (let [key, value] of this.namedContent) {\n      let inkObject = asOrThrows(value, InkObject);\n      namedOnlyContentDict.set(key, inkObject);\n    }\n\n    for (let c of this.content) {\n      let named = asINamedContentOrNull(c);\n      if (named != null && named.hasValidName) {\n        namedOnlyContentDict.delete(named.name!);\n      }\n    }\n\n    if (namedOnlyContentDict.size == 0) namedOnlyContentDict = null;\n\n    return namedOnlyContentDict;\n  }\n  set namedOnlyContent(value: Map<string, InkObject> | null) {\n    let existingNamedOnly = this.namedOnlyContent;\n    if (existingNamedOnly != null) {\n      for (let [key] of existingNamedOnly) {\n        this.namedContent.delete(key);\n      }\n    }\n\n    if (value == null) return;\n\n    for (let [, val] of value) {\n      let named = asINamedContentOrNull(val);\n      if (named != null) this.AddToNamedContentOnly(named);\n    }\n  }\n  get countFlags(): number {\n    let flags: Container.CountFlags = 0;\n    if (this.visitsShouldBeCounted) flags |= Container.CountFlags.Visits;\n    if (this.turnIndexShouldBeCounted) flags |= Container.CountFlags.Turns;\n    if (this.countingAtStartOnly) flags |= Container.CountFlags.CountStartOnly;\n\n    if (flags == Container.CountFlags.CountStartOnly) {\n      flags = 0;\n    }\n\n    return flags;\n  }\n  set countFlags(value: number) {\n    let flag: Container.CountFlags = value;\n    if ((flag & Container.CountFlags.Visits) > 0)\n      this.visitsShouldBeCounted = true;\n    if ((flag & Container.CountFlags.Turns) > 0)\n      this.turnIndexShouldBeCounted = true;\n    if ((flag & Container.CountFlags.CountStartOnly) > 0)\n      this.countingAtStartOnly = true;\n  }\n  get pathToFirstLeafContent() {\n    if (this._pathToFirstLeafContent == null)\n      this._pathToFirstLeafContent = this.path.PathByAppendingPath(\n        this.internalPathToFirstLeafContent\n      );\n\n    return this._pathToFirstLeafContent;\n  }\n  get internalPathToFirstLeafContent() {\n    let components: Path.Component[] = [];\n    let container: Container = this;\n    while (container instanceof Container) {\n      if (container.content.length > 0) {\n        components.push(new Path.Component(0));\n        container = container.content[0] as Container;\n      }\n    }\n    return new Path(components);\n  }\n\n  public AddContent(contentObjOrList: InkObject | InkObject[]) {\n    if (contentObjOrList instanceof Array) {\n      let contentList = contentObjOrList as InkObject[];\n\n      for (let c of contentList) {\n        this.AddContent(c);\n      }\n    } else {\n      let contentObj = contentObjOrList as InkObject;\n\n      this._content.push(contentObj);\n\n      if (contentObj.parent) {\n        throw new Error(\"content is already in \" + contentObj.parent);\n      }\n\n      contentObj.parent = this;\n\n      this.TryAddNamedContent(contentObj);\n    }\n  }\n  public TryAddNamedContent(contentObj: InkObject) {\n    let namedContentObj = asINamedContentOrNull(contentObj);\n    if (namedContentObj != null && namedContentObj.hasValidName) {\n      this.AddToNamedContentOnly(namedContentObj);\n    }\n  }\n  public AddToNamedContentOnly(namedContentObj: INamedContent) {\n    Debug.AssertType(\n      namedContentObj,\n      InkObject,\n      \"Can only add Runtime.Objects to a Runtime.Container\"\n    );\n    let runtimeObj = asOrThrows(namedContentObj, InkObject);\n    runtimeObj.parent = this;\n\n    if (namedContentObj.name === null)\n      return throwNullException(\"namedContentObj.name\");\n    this.namedContent.set(namedContentObj.name!, namedContentObj);\n  }\n  public ContentAtPath(\n    path: Path,\n    partialPathStart: number = 0,\n    partialPathLength: number = -1\n  ) {\n    if (partialPathLength == -1) partialPathLength = path.length;\n\n    let result = new SearchResult();\n    result.approximate = false;\n\n    let currentContainer: Container | null = this;\n    let currentObj: InkObject = this;\n\n    for (let i = partialPathStart; i < partialPathLength; ++i) {\n      let comp = path.GetComponent(i);\n      if (currentContainer == null) {\n        result.approximate = true;\n        break;\n      }\n\n      let foundObj: InkObject | null =\n        currentContainer.ContentWithPathComponent(comp);\n\n      // Couldn't resolve entire path?\n      if (foundObj == null) {\n        result.approximate = true;\n        break;\n      }\n\n      // Are we about to loop into another container?\n      // Is the object a container as expected? It might\n      // no longer be if the content has shuffled around, so what\n      // was originally a container no longer is.\n      const nextContainer: Container | null = asOrNull(foundObj, Container);\n      if (i < partialPathLength - 1 && nextContainer == null) {\n        result.approximate = true;\n        break;\n      }\n\n      currentObj = foundObj;\n      currentContainer = nextContainer;\n    }\n\n    result.obj = currentObj;\n\n    return result;\n  }\n  public InsertContent(contentObj: InkObject, index: number) {\n    this.content.splice(index, 0, contentObj);\n\n    if (contentObj.parent) {\n      throw new Error(\"content is already in \" + contentObj.parent);\n    }\n\n    contentObj.parent = this;\n\n    this.TryAddNamedContent(contentObj);\n  }\n  public AddContentsOfContainer(otherContainer: Container) {\n    this.content.push(...otherContainer.content);\n\n    for (let obj of otherContainer.content) {\n      obj.parent = this;\n      this.TryAddNamedContent(obj);\n    }\n  }\n  public ContentWithPathComponent(component: Path.Component): InkObject | null {\n    if (component.isIndex) {\n      if (component.index >= 0 && component.index < this.content.length) {\n        return this.content[component.index];\n      } else {\n        return null;\n      }\n    } else if (component.isParent) {\n      return this.parent;\n    } else {\n      if (component.name === null) {\n        return throwNullException(\"component.name\");\n      }\n      let foundContent = tryGetValueFromMap(\n        this.namedContent,\n        component.name,\n        null\n      );\n      if (foundContent.exists) {\n        return asOrThrows(foundContent.result, InkObject);\n      } else {\n        return null;\n      }\n    }\n  }\n  public BuildStringOfHierarchy(): string;\n  public BuildStringOfHierarchy(\n    sb: StringBuilder,\n    indentation: number,\n    pointedObj: InkObject | null\n  ): string;\n  public BuildStringOfHierarchy() {\n    let sb: StringBuilder;\n    if (arguments.length == 0) {\n      sb = new StringBuilder();\n      this.BuildStringOfHierarchy(sb, 0, null);\n      return sb.toString();\n    }\n\n    sb = arguments[0] as StringBuilder;\n    let indentation = arguments[1] as number;\n    let pointedObj = arguments[2] as InkObject | null;\n\n    function appendIndentation() {\n      const spacesPerIndent = 4; // Truly const in the original code\n      for (let i = 0; i < spacesPerIndent * indentation; ++i) {\n        sb.Append(\" \");\n      }\n    }\n\n    appendIndentation();\n    sb.Append(\"[\");\n\n    if (this.hasValidName) {\n      sb.AppendFormat(\" ({0})\", this.name);\n    }\n\n    if (this == pointedObj) {\n      sb.Append(\"  <---\");\n    }\n\n    sb.AppendLine();\n\n    indentation++;\n\n    for (let i = 0; i < this.content.length; ++i) {\n      let obj = this.content[i];\n\n      if (obj instanceof Container) {\n        let container = obj as Container;\n\n        container.BuildStringOfHierarchy(sb, indentation, pointedObj);\n      } else {\n        appendIndentation();\n        if (obj instanceof StringValue) {\n          sb.Append('\"');\n          sb.Append(obj.toString().replace(\"\\n\", \"\\\\n\"));\n          sb.Append('\"');\n        } else {\n          sb.Append(obj.toString());\n        }\n      }\n\n      if (i != this.content.length - 1) {\n        sb.Append(\",\");\n      }\n\n      if (!(obj instanceof Container) && obj == pointedObj) {\n        sb.Append(\"  <---\");\n      }\n\n      sb.AppendLine();\n    }\n\n    let onlyNamed: Map<string, INamedContent> = new Map();\n\n    for (let [key, value] of this.namedContent) {\n      if (this.content.indexOf(asOrThrows(value, InkObject)) >= 0) {\n        continue;\n      } else {\n        onlyNamed.set(key, value);\n      }\n    }\n\n    if (onlyNamed.size > 0) {\n      appendIndentation();\n      sb.AppendLine(\"-- named: --\");\n\n      for (let [, value] of onlyNamed) {\n        Debug.AssertType(\n          value,\n          Container,\n          \"Can only print out named Containers\"\n        );\n        let container = value as Container;\n        container.BuildStringOfHierarchy(sb, indentation, pointedObj);\n        sb.AppendLine();\n      }\n    }\n\n    indentation--;\n\n    appendIndentation();\n    sb.Append(\"]\");\n  }\n}\n\nexport namespace Container {\n  export enum CountFlags {\n    Start = 0,\n    Visits = 1,\n    Turns = 2,\n    CountStartOnly = 4,\n  }\n}\n","import { InkObject } from \"./Object\";\n\nexport class Glue extends InkObject {\n  public toString() {\n    return \"Glue\";\n  }\n}\n","import { InkObject } from \"./Object\";\n\nexport class ControlCommand extends InkObject {\n  private _commandType: ControlCommand.CommandType;\n\n  get commandType(): ControlCommand.CommandType {\n    return this._commandType;\n  }\n\n  constructor(\n    commandType: ControlCommand.CommandType = ControlCommand.CommandType.NotSet\n  ) {\n    super();\n    this._commandType = commandType;\n  }\n\n  public Copy() {\n    return new ControlCommand(this.commandType);\n  }\n  public static EvalStart() {\n    return new ControlCommand(ControlCommand.CommandType.EvalStart);\n  }\n  public static EvalOutput() {\n    return new ControlCommand(ControlCommand.CommandType.EvalOutput);\n  }\n  public static EvalEnd() {\n    return new ControlCommand(ControlCommand.CommandType.EvalEnd);\n  }\n  public static Duplicate() {\n    return new ControlCommand(ControlCommand.CommandType.Duplicate);\n  }\n  public static PopEvaluatedValue() {\n    return new ControlCommand(ControlCommand.CommandType.PopEvaluatedValue);\n  }\n  public static PopFunction() {\n    return new ControlCommand(ControlCommand.CommandType.PopFunction);\n  }\n  public static PopTunnel() {\n    return new ControlCommand(ControlCommand.CommandType.PopTunnel);\n  }\n  public static BeginString() {\n    return new ControlCommand(ControlCommand.CommandType.BeginString);\n  }\n  public static EndString() {\n    return new ControlCommand(ControlCommand.CommandType.EndString);\n  }\n  public static NoOp() {\n    return new ControlCommand(ControlCommand.CommandType.NoOp);\n  }\n  public static ChoiceCount() {\n    return new ControlCommand(ControlCommand.CommandType.ChoiceCount);\n  }\n  public static Turns() {\n    return new ControlCommand(ControlCommand.CommandType.Turns);\n  }\n  public static TurnsSince() {\n    return new ControlCommand(ControlCommand.CommandType.TurnsSince);\n  }\n  public static ReadCount() {\n    return new ControlCommand(ControlCommand.CommandType.ReadCount);\n  }\n  public static Random() {\n    return new ControlCommand(ControlCommand.CommandType.Random);\n  }\n  public static SeedRandom() {\n    return new ControlCommand(ControlCommand.CommandType.SeedRandom);\n  }\n  public static VisitIndex() {\n    return new ControlCommand(ControlCommand.CommandType.VisitIndex);\n  }\n  public static SequenceShuffleIndex() {\n    return new ControlCommand(ControlCommand.CommandType.SequenceShuffleIndex);\n  }\n  public static StartThread() {\n    return new ControlCommand(ControlCommand.CommandType.StartThread);\n  }\n  public static Done() {\n    return new ControlCommand(ControlCommand.CommandType.Done);\n  }\n  public static End() {\n    return new ControlCommand(ControlCommand.CommandType.End);\n  }\n  public static ListFromInt() {\n    return new ControlCommand(ControlCommand.CommandType.ListFromInt);\n  }\n  public static ListRange() {\n    return new ControlCommand(ControlCommand.CommandType.ListRange);\n  }\n  public static ListRandom() {\n    return new ControlCommand(ControlCommand.CommandType.ListRandom);\n  }\n  public static BeginTag() {\n    return new ControlCommand(ControlCommand.CommandType.BeginTag);\n  }\n  public static EndTag() {\n    return new ControlCommand(ControlCommand.CommandType.EndTag);\n  }\n  public toString() {\n    return \"ControlCommand \" + this.commandType.toString();\n  }\n}\n\nexport namespace ControlCommand {\n  export enum CommandType {\n    NotSet = -1,\n    EvalStart, // 0\n    EvalOutput, // 1\n    EvalEnd, // 2\n    Duplicate, // 3\n    PopEvaluatedValue, // 4\n    PopFunction, // 5\n    PopTunnel, // 6\n    BeginString, // 7\n    EndString, // 8\n    NoOp, // 9\n    ChoiceCount, // 10\n    Turns, // 11\n    TurnsSince, // 12\n    ReadCount, // 13\n    Random, // 14\n    SeedRandom, // 15\n    VisitIndex, // 16\n    SequenceShuffleIndex, // 17\n    StartThread, // 18\n    Done, // 19\n    End, // 20\n    ListFromInt, // 21\n    ListRange, // 22\n    ListRandom, // 23\n    BeginTag, // 24\n    EndTag, // 25\n\n    TOTAL_VALUES,\n  }\n}\n","import { Path } from \"./Path\";\nimport { Container } from \"./Container\";\nimport { InkObject } from \"./Object\";\n\nexport class Pointer {\n  public container: Container | null = null;\n  public index: number = -1;\n\n  constructor();\n  constructor(container: Container | null, index: number);\n  constructor() {\n    if (arguments.length === 2) {\n      this.container = arguments[0];\n      this.index = arguments[1];\n    }\n  }\n\n  public Resolve(): InkObject | null {\n    if (this.index < 0) return this.container;\n    if (this.container == null) return null;\n    if (this.container.content.length == 0) return this.container;\n    if (this.index >= this.container.content.length) return null;\n\n    return this.container.content[this.index];\n  }\n\n  get isNull(): boolean {\n    return this.container == null;\n  }\n\n  get path(): Path | null {\n    if (this.isNull) return null;\n\n    if (this.index >= 0)\n      return this.container!.path.PathByAppendingComponent(\n        new Path.Component(this.index)\n      );\n    else return this.container!.path;\n  }\n\n  public toString(): string {\n    if (!this.container) return \"Ink Pointer (null)\";\n\n    return (\n      \"Ink Pointer -> \" +\n      this.container.path.toString() +\n      \" -- index \" +\n      this.index\n    );\n  }\n\n  // This method does not exist in the original C# code, but is here to maintain the\n  // value semantics of Pointer.\n  public copy(): Pointer {\n    return new Pointer(this.container, this.index);\n  }\n\n  public static StartOf(container: Container | null): Pointer {\n    return new Pointer(container, 0);\n  }\n\n  public static get Null(): Pointer {\n    return new Pointer(null, -1);\n  }\n}\n","import { Path } from \"./Path\";\nimport { PushPopType } from \"./PushPop\";\nimport { StringBuilder } from \"./StringBuilder\";\nimport { InkObject } from \"./Object\";\nimport { Pointer } from \"./Pointer\";\nimport { Container } from \"./Container\";\nimport { throwNullException } from \"./NullException\";\n\nexport class Divert extends InkObject {\n  get targetPath() {\n    if (this._targetPath != null && this._targetPath.isRelative) {\n      let targetObj = this.targetPointer.Resolve();\n      if (targetObj) {\n        this._targetPath = targetObj.path;\n      }\n    }\n\n    return this._targetPath;\n  }\n  set targetPath(value: Path | null) {\n    this._targetPath = value;\n    this._targetPointer = Pointer.Null;\n  }\n\n  public _targetPath: Path | null = null;\n\n  get targetPointer() {\n    if (this._targetPointer.isNull) {\n      let targetObj = this.ResolvePath(this._targetPath).obj;\n\n      if (this._targetPath === null)\n        return throwNullException(\"this._targetPath\");\n      if (this._targetPath.lastComponent === null)\n        return throwNullException(\"this._targetPath.lastComponent\");\n\n      if (this._targetPath.lastComponent.isIndex) {\n        if (targetObj === null) return throwNullException(\"targetObj\");\n        this._targetPointer.container =\n          targetObj.parent instanceof Container ? targetObj.parent : null;\n        this._targetPointer.index = this._targetPath.lastComponent.index;\n      } else {\n        this._targetPointer = Pointer.StartOf(\n          targetObj instanceof Container ? targetObj : null\n        );\n      }\n    }\n\n    return this._targetPointer.copy();\n  }\n\n  public _targetPointer: Pointer = Pointer.Null;\n\n  get targetPathString() {\n    if (this.targetPath == null) return null;\n\n    return this.CompactPathString(this.targetPath);\n  }\n  set targetPathString(value: string | null) {\n    if (value == null) {\n      this.targetPath = null;\n    } else {\n      this.targetPath = new Path(value);\n    }\n  }\n\n  public variableDivertName: string | null = null;\n  get hasVariableTarget() {\n    return this.variableDivertName != null;\n  }\n\n  public pushesToStack: boolean = false;\n  public stackPushType: PushPopType = 0;\n\n  public isExternal: boolean = false;\n  public externalArgs: number = 0;\n\n  public isConditional: boolean = false;\n\n  constructor(stackPushType?: PushPopType) {\n    super();\n    this.pushesToStack = false;\n\n    if (typeof stackPushType !== \"undefined\") {\n      this.pushesToStack = true;\n      this.stackPushType = stackPushType;\n    }\n  }\n\n  public Equals(obj: Divert | null) {\n    let otherDivert = obj;\n    if (otherDivert instanceof Divert) {\n      if (this.hasVariableTarget == otherDivert.hasVariableTarget) {\n        if (this.hasVariableTarget) {\n          return this.variableDivertName == otherDivert.variableDivertName;\n        } else {\n          if (this.targetPath === null)\n            return throwNullException(\"this.targetPath\");\n          return this.targetPath.Equals(otherDivert.targetPath);\n        }\n      }\n    }\n    return false;\n  }\n\n  public toString() {\n    if (this.hasVariableTarget) {\n      return \"Divert(variable: \" + this.variableDivertName + \")\";\n    } else if (this.targetPath == null) {\n      return \"Divert(null)\";\n    } else {\n      let sb = new StringBuilder();\n\n      let targetStr = this.targetPath.toString();\n      // int? targetLineNum = DebugLineNumberOfPath (targetPath);\n      let targetLineNum = null;\n      if (targetLineNum != null) {\n        targetStr = \"line \" + targetLineNum;\n      }\n\n      sb.Append(\"Divert\");\n\n      if (this.isConditional) sb.Append(\"?\");\n\n      if (this.pushesToStack) {\n        if (this.stackPushType == PushPopType.Function) {\n          sb.Append(\" function\");\n        } else {\n          sb.Append(\" tunnel\");\n        }\n      }\n\n      sb.Append(\" -> \");\n      sb.Append(this.targetPathString);\n\n      sb.Append(\" (\");\n      sb.Append(targetStr);\n      sb.Append(\")\");\n\n      return sb.toString();\n    }\n  }\n}\n","import { InkObject } from \"./Object\";\nimport { Path } from \"./Path\";\nimport { Container } from \"./Container\";\nimport { throwNullException } from \"./NullException\";\n\nexport class ChoicePoint extends InkObject {\n  public _pathOnChoice: Path | null = null;\n  public hasCondition: boolean = false;\n  public hasStartContent: boolean = false;\n  public hasChoiceOnlyContent: boolean = false;\n  public isInvisibleDefault: boolean = false;\n  public onceOnly: boolean = true;\n\n  constructor(onceOnly: boolean = true) {\n    super();\n    this.onceOnly = onceOnly;\n  }\n  get pathOnChoice(): Path | null {\n    if (this._pathOnChoice != null && this._pathOnChoice.isRelative) {\n      let choiceTargetObj = this.choiceTarget;\n      if (choiceTargetObj) {\n        this._pathOnChoice = choiceTargetObj.path;\n      }\n    }\n    return this._pathOnChoice;\n  }\n  set pathOnChoice(value: Path | null) {\n    this._pathOnChoice = value;\n  }\n  get choiceTarget(): Container | null {\n    if (this._pathOnChoice === null)\n      return throwNullException(\"ChoicePoint._pathOnChoice\");\n    return this.ResolvePath(this._pathOnChoice).container;\n  }\n  get pathStringOnChoice(): string {\n    if (this.pathOnChoice === null)\n      return throwNullException(\"ChoicePoint.pathOnChoice\");\n    return this.CompactPathString(this.pathOnChoice);\n  }\n  set pathStringOnChoice(value: string) {\n    this.pathOnChoice = new Path(value);\n  }\n  get flags(): number {\n    let flags = 0;\n    if (this.hasCondition) flags |= 1;\n    if (this.hasStartContent) flags |= 2;\n    if (this.hasChoiceOnlyContent) flags |= 4;\n    if (this.isInvisibleDefault) flags |= 8;\n    if (this.onceOnly) flags |= 16;\n    return flags;\n  }\n  set flags(value: number) {\n    this.hasCondition = (value & 1) > 0;\n    this.hasStartContent = (value & 2) > 0;\n    this.hasChoiceOnlyContent = (value & 4) > 0;\n    this.isInvisibleDefault = (value & 8) > 0;\n    this.onceOnly = (value & 16) > 0;\n  }\n  public toString(): string {\n    if (this.pathOnChoice === null)\n      return throwNullException(\"ChoicePoint.pathOnChoice\");\n    // int? targetLineNum = DebugLineNumberOfPath (pathOnChoice);\n    let targetLineNum = null;\n    let targetString = this.pathOnChoice.toString();\n\n    if (targetLineNum != null) {\n      targetString = \" line \" + targetLineNum + \"(\" + targetString + \")\";\n    }\n\n    return \"Choice: -> \" + targetString;\n  }\n}\n","import { InkObject } from \"./Object\";\nimport { Path } from \"./Path\";\n\nexport class VariableReference extends InkObject {\n  public name: string | null;\n  public pathForCount: Path | null = null;\n\n  get containerForCount() {\n    if (this.pathForCount === null) return null;\n    return this.ResolvePath(this.pathForCount).container;\n  }\n  get pathStringForCount() {\n    if (this.pathForCount === null) return null;\n\n    return this.CompactPathString(this.pathForCount);\n  }\n  set pathStringForCount(value: string | null) {\n    if (value === null) this.pathForCount = null;\n    else this.pathForCount = new Path(value);\n  }\n\n  constructor(name: string | null = null) {\n    super();\n    this.name = name;\n  }\n\n  public toString() {\n    if (this.name != null) {\n      return \"var(\" + this.name + \")\";\n    } else {\n      let pathStr = this.pathStringForCount;\n      return \"read_count(\" + pathStr + \")\";\n    }\n  }\n}\n","import { InkObject } from \"./Object\";\n\nexport class VariableAssignment extends InkObject {\n  public readonly variableName: string | null;\n  public readonly isNewDeclaration: boolean;\n  public isGlobal: boolean;\n\n  constructor(variableName: string | null, isNewDeclaration: boolean) {\n    super();\n    this.variableName = variableName || null;\n    this.isNewDeclaration = !!isNewDeclaration;\n    this.isGlobal = false;\n  }\n\n  public toString(): string {\n    return \"VarAssign to \" + this.variableName;\n  }\n}\n","import { InkObject } from \"./Object\";\n\nexport class Void extends InkObject {\n  public toString() {\n    return \"Void\";\n  }\n}\n","import { Value, ValueType, IntValue, ListValue, BoolValue } from \"./Value\";\nimport { StoryException } from \"./StoryException\";\nimport { Void } from \"./Void\";\nimport { Path } from \"./Path\";\nimport { InkList, InkListItem } from \"./InkList\";\nimport { InkObject } from \"./Object\";\nimport { asOrNull, asOrThrows, asBooleanOrThrows } from \"./TypeAssertion\";\nimport { throwNullException } from \"./NullException\";\n\ntype BinaryOp<T> = (left: T, right: T) => any;\ntype UnaryOp<T> = (val: T) => any;\n\nexport class NativeFunctionCall extends InkObject {\n  public static readonly Add: string = \"+\";\n  public static readonly Subtract: string = \"-\";\n  public static readonly Divide: string = \"/\";\n  public static readonly Multiply: string = \"*\";\n  public static readonly Mod: string = \"%\";\n  public static readonly Negate: string = \"_\";\n  public static readonly Equal: string = \"==\";\n  public static readonly Greater: string = \">\";\n  public static readonly Less: string = \"<\";\n  public static readonly GreaterThanOrEquals: string = \">=\";\n  public static readonly LessThanOrEquals: string = \"<=\";\n  public static readonly NotEquals: string = \"!=\";\n  public static readonly Not: string = \"!\";\n  public static readonly And: string = \"&&\";\n  public static readonly Or: string = \"||\";\n  public static readonly Min: string = \"MIN\";\n  public static readonly Max: string = \"MAX\";\n  public static readonly Pow: string = \"POW\";\n  public static readonly Floor: string = \"FLOOR\";\n  public static readonly Ceiling: string = \"CEILING\";\n  public static readonly Int: string = \"INT\";\n  public static readonly Float: string = \"FLOAT\";\n  public static readonly Has: string = \"?\";\n  public static readonly Hasnt: string = \"!?\";\n  public static readonly Intersect: string = \"^\";\n  public static readonly ListMin: string = \"LIST_MIN\";\n  public static readonly ListMax: string = \"LIST_MAX\";\n  public static readonly All: string = \"LIST_ALL\";\n  public static readonly Count: string = \"LIST_COUNT\";\n  public static readonly ValueOfList: string = \"LIST_VALUE\";\n  public static readonly Invert: string = \"LIST_INVERT\";\n\n  public static CallWithName(functionName: string) {\n    return new NativeFunctionCall(functionName);\n  }\n\n  public static CallExistsWithName(functionName: string) {\n    this.GenerateNativeFunctionsIfNecessary();\n    return this._nativeFunctions!.get(functionName);\n  }\n\n  get name() {\n    if (this._name === null)\n      return throwNullException(\"NativeFunctionCall._name\");\n    return this._name;\n  }\n  set name(value: string) {\n    this._name = value;\n    if (!this._isPrototype) {\n      if (NativeFunctionCall._nativeFunctions === null)\n        throwNullException(\"NativeFunctionCall._nativeFunctions\");\n      else\n        this._prototype =\n          NativeFunctionCall._nativeFunctions.get(this._name) || null;\n    }\n  }\n  public _name: string | null = null;\n\n  get numberOfParameters() {\n    if (this._prototype) {\n      return this._prototype.numberOfParameters;\n    } else {\n      return this._numberOfParameters;\n    }\n  }\n  set numberOfParameters(value: number) {\n    this._numberOfParameters = value;\n  }\n  public _numberOfParameters: number = 0;\n\n  public Call(parameters: InkObject[]): InkObject | null {\n    if (this._prototype) {\n      return this._prototype.Call(parameters);\n    }\n\n    if (this.numberOfParameters != parameters.length) {\n      throw new Error(\"Unexpected number of parameters\");\n    }\n\n    let hasList = false;\n    for (let p of parameters) {\n      if (p instanceof Void)\n        throw new StoryException(\n          \"Attempting to perform \" +\n            this.name +\n            ' on a void value. Did you forget to \"return\" a value from a function you called here?'\n        );\n      if (p instanceof ListValue) hasList = true;\n    }\n\n    if (parameters.length == 2 && hasList) {\n      return this.CallBinaryListOperation(parameters);\n    }\n\n    let coercedParams = this.CoerceValuesToSingleType(parameters);\n    let coercedType = coercedParams[0].valueType;\n\n    if (coercedType == ValueType.Int) {\n      return this.CallType<number>(coercedParams);\n    } else if (coercedType == ValueType.Float) {\n      return this.CallType<number>(coercedParams);\n    } else if (coercedType == ValueType.String) {\n      return this.CallType<string>(coercedParams);\n    } else if (coercedType == ValueType.DivertTarget) {\n      return this.CallType<Path>(coercedParams);\n    } else if (coercedType == ValueType.List) {\n      return this.CallType<InkList>(coercedParams);\n    }\n\n    return null;\n  }\n\n  public CallType<T extends { toString: () => string }>(\n    parametersOfSingleType: Array<Value<T>>\n  ) {\n    let param1 = asOrThrows(parametersOfSingleType[0], Value);\n    let valType = param1.valueType;\n\n    let val1 = param1 as Value<T>;\n\n    let paramCount = parametersOfSingleType.length;\n\n    if (paramCount == 2 || paramCount == 1) {\n      if (this._operationFuncs === null)\n        return throwNullException(\"NativeFunctionCall._operationFuncs\");\n      let opForTypeObj = this._operationFuncs.get(valType);\n      if (!opForTypeObj) {\n        const key = ValueType[valType];\n        throw new StoryException(\n          \"Cannot perform operation \" + this.name + \" on \" + key\n        );\n      }\n\n      if (paramCount == 2) {\n        let param2 = asOrThrows(parametersOfSingleType[1], Value);\n\n        let val2 = param2 as Value<T>;\n\n        let opForType = opForTypeObj as BinaryOp<T>;\n\n        if (val1.value === null || val2.value === null)\n          return throwNullException(\"NativeFunctionCall.Call BinaryOp values\");\n        let resultVal = opForType(val1.value, val2.value);\n\n        return Value.Create(resultVal);\n      } else {\n        let opForType = opForTypeObj as UnaryOp<T>;\n\n        if (val1.value === null)\n          return throwNullException(\"NativeFunctionCall.Call UnaryOp value\");\n        let resultVal = opForType(val1.value);\n\n        // This code is different from upstream. Since JavaScript treats\n        // integers and floats as the same numbers, it's impossible\n        // to force an number to be either an integer or a float.\n        //\n        // It can be useful to force a specific number type\n        // (especially for divisions), so the result of INT() & FLOAT()\n        // is coerced to the the proper value type.\n        //\n        // Note that we also force all other unary operation to\n        // return the same value type, although this is only\n        // meaningful for numbers. See `Value.Create`.\n        if (this.name === NativeFunctionCall.Int) {\n          return Value.Create(resultVal, ValueType.Int);\n        } else if (this.name === NativeFunctionCall.Float) {\n          return Value.Create(resultVal, ValueType.Float);\n        } else {\n          return Value.Create(resultVal, param1.valueType);\n        }\n      }\n    } else {\n      throw new Error(\n        \"Unexpected number of parameters to NativeFunctionCall: \" +\n          parametersOfSingleType.length\n      );\n    }\n  }\n\n  public CallBinaryListOperation(parameters: InkObject[]) {\n    if (\n      (this.name == \"+\" || this.name == \"-\") &&\n      parameters[0] instanceof ListValue &&\n      parameters[1] instanceof IntValue\n    )\n      return this.CallListIncrementOperation(parameters);\n\n    let v1 = asOrThrows(parameters[0], Value);\n    let v2 = asOrThrows(parameters[1], Value);\n\n    if (\n      (this.name == \"&&\" || this.name == \"||\") &&\n      (v1.valueType != ValueType.List || v2.valueType != ValueType.List)\n    ) {\n      if (this._operationFuncs === null)\n        return throwNullException(\"NativeFunctionCall._operationFuncs\");\n      let op = this._operationFuncs.get(ValueType.Int) as BinaryOp<number>;\n      if (op === null)\n        return throwNullException(\n          \"NativeFunctionCall.CallBinaryListOperation op\"\n        );\n      let result = asBooleanOrThrows(\n        op(v1.isTruthy ? 1 : 0, v2.isTruthy ? 1 : 0)\n      );\n      return new BoolValue(result);\n    }\n\n    if (v1.valueType == ValueType.List && v2.valueType == ValueType.List)\n      return this.CallType<InkList>([v1, v2]);\n\n    throw new StoryException(\n      \"Can not call use \" +\n        this.name +\n        \" operation on \" +\n        ValueType[v1.valueType] +\n        \" and \" +\n        ValueType[v2.valueType]\n    );\n  }\n\n  public CallListIncrementOperation(listIntParams: InkObject[]) {\n    let listVal = asOrThrows(listIntParams[0], ListValue);\n    let intVal = asOrThrows(listIntParams[1], IntValue);\n\n    let resultInkList = new InkList();\n\n    if (listVal.value === null)\n      return throwNullException(\n        \"NativeFunctionCall.CallListIncrementOperation listVal.value\"\n      );\n    for (let [listItemKey, listItemValue] of listVal.value) {\n      let listItem = InkListItem.fromSerializedKey(listItemKey);\n\n      if (this._operationFuncs === null)\n        return throwNullException(\"NativeFunctionCall._operationFuncs\");\n      let intOp = this._operationFuncs.get(ValueType.Int) as BinaryOp<number>;\n\n      if (intVal.value === null)\n        return throwNullException(\n          \"NativeFunctionCall.CallListIncrementOperation intVal.value\"\n        );\n      let targetInt = intOp(listItemValue, intVal.value);\n\n      let itemOrigin = null;\n      if (listVal.value.origins === null)\n        return throwNullException(\n          \"NativeFunctionCall.CallListIncrementOperation listVal.value.origins\"\n        );\n      for (let origin of listVal.value.origins) {\n        if (origin.name == listItem.originName) {\n          itemOrigin = origin;\n          break;\n        }\n      }\n      if (itemOrigin != null) {\n        let incrementedItem = itemOrigin.TryGetItemWithValue(\n          targetInt,\n          InkListItem.Null\n        );\n        if (incrementedItem.exists)\n          resultInkList.Add(incrementedItem.result, targetInt);\n      }\n    }\n\n    return new ListValue(resultInkList);\n  }\n\n  public CoerceValuesToSingleType(parametersIn: InkObject[]) {\n    let valType = ValueType.Int;\n\n    let specialCaseList: null | ListValue = null;\n\n    for (let obj of parametersIn) {\n      let val = asOrThrows(obj, Value);\n      if (val.valueType > valType) {\n        valType = val.valueType;\n      }\n\n      if (val.valueType == ValueType.List) {\n        specialCaseList = asOrNull(val, ListValue);\n      }\n    }\n\n    let parametersOut = [];\n\n    if (ValueType[valType] == ValueType[ValueType.List]) {\n      for (let inkObjectVal of parametersIn) {\n        let val = asOrThrows(inkObjectVal, Value);\n        if (val.valueType == ValueType.List) {\n          parametersOut.push(val);\n        } else if (val.valueType == ValueType.Int) {\n          let intVal = parseInt(val.valueObject);\n\n          specialCaseList = asOrThrows(specialCaseList, ListValue);\n          if (specialCaseList.value === null)\n            return throwNullException(\n              \"NativeFunctionCall.CoerceValuesToSingleType specialCaseList.value\"\n            );\n          let list = specialCaseList.value.originOfMaxItem;\n\n          if (list === null)\n            return throwNullException(\n              \"NativeFunctionCall.CoerceValuesToSingleType list\"\n            );\n          let item = list.TryGetItemWithValue(intVal, InkListItem.Null);\n          if (item.exists) {\n            let castedValue = new ListValue(item.result, intVal);\n            parametersOut.push(castedValue);\n          } else\n            throw new StoryException(\n              \"Could not find List item with the value \" +\n                intVal +\n                \" in \" +\n                list.name\n            );\n        } else {\n          const key = ValueType[val.valueType];\n          throw new StoryException(\n            \"Cannot mix Lists and \" + key + \" values in this operation\"\n          );\n        }\n      }\n    } else {\n      for (let inkObjectVal of parametersIn) {\n        let val = asOrThrows(inkObjectVal, Value);\n        let castedValue = val.Cast(valType);\n        parametersOut.push(castedValue);\n      }\n    }\n\n    return parametersOut;\n  }\n\n  constructor(name: string);\n  constructor(name: string, numberOfParameters: number);\n  constructor();\n  constructor() {\n    super();\n\n    if (arguments.length === 0) {\n      NativeFunctionCall.GenerateNativeFunctionsIfNecessary();\n    } else if (arguments.length === 1) {\n      let name = arguments[0];\n      NativeFunctionCall.GenerateNativeFunctionsIfNecessary();\n      this.name = name;\n    } else if (arguments.length === 2) {\n      let name = arguments[0];\n      let numberOfParameters = arguments[1];\n\n      this._isPrototype = true;\n      this.name = name;\n      this.numberOfParameters = numberOfParameters;\n    }\n  }\n\n  public static Identity<T>(t: T): any {\n    return t;\n  }\n\n  public static GenerateNativeFunctionsIfNecessary() {\n    if (this._nativeFunctions == null) {\n      this._nativeFunctions = new Map();\n\n      // Int operations\n      this.AddIntBinaryOp(this.Add, (x, y) => x + y);\n      this.AddIntBinaryOp(this.Subtract, (x, y) => x - y);\n      this.AddIntBinaryOp(this.Multiply, (x, y) => x * y);\n      this.AddIntBinaryOp(this.Divide, (x, y) => Math.floor(x / y));\n      this.AddIntBinaryOp(this.Mod, (x, y) => x % y);\n      this.AddIntUnaryOp(this.Negate, (x) => -x);\n\n      this.AddIntBinaryOp(this.Equal, (x, y) => x == y);\n      this.AddIntBinaryOp(this.Greater, (x, y) => x > y);\n      this.AddIntBinaryOp(this.Less, (x, y) => x < y);\n      this.AddIntBinaryOp(this.GreaterThanOrEquals, (x, y) => x >= y);\n      this.AddIntBinaryOp(this.LessThanOrEquals, (x, y) => x <= y);\n      this.AddIntBinaryOp(this.NotEquals, (x, y) => x != y);\n      this.AddIntUnaryOp(this.Not, (x) => x == 0);\n\n      this.AddIntBinaryOp(this.And, (x, y) => x != 0 && y != 0);\n      this.AddIntBinaryOp(this.Or, (x, y) => x != 0 || y != 0);\n\n      this.AddIntBinaryOp(this.Max, (x, y) => Math.max(x, y));\n      this.AddIntBinaryOp(this.Min, (x, y) => Math.min(x, y));\n\n      this.AddIntBinaryOp(this.Pow, (x, y) => Math.pow(x, y));\n      this.AddIntUnaryOp(this.Floor, NativeFunctionCall.Identity);\n      this.AddIntUnaryOp(this.Ceiling, NativeFunctionCall.Identity);\n      this.AddIntUnaryOp(this.Int, NativeFunctionCall.Identity);\n      this.AddIntUnaryOp(this.Float, (x) => x);\n\n      // Float operations\n      this.AddFloatBinaryOp(this.Add, (x, y) => x + y);\n      this.AddFloatBinaryOp(this.Subtract, (x, y) => x - y);\n      this.AddFloatBinaryOp(this.Multiply, (x, y) => x * y);\n      this.AddFloatBinaryOp(this.Divide, (x, y) => x / y);\n      this.AddFloatBinaryOp(this.Mod, (x, y) => x % y);\n      this.AddFloatUnaryOp(this.Negate, (x) => -x);\n\n      this.AddFloatBinaryOp(this.Equal, (x, y) => x == y);\n      this.AddFloatBinaryOp(this.Greater, (x, y) => x > y);\n      this.AddFloatBinaryOp(this.Less, (x, y) => x < y);\n      this.AddFloatBinaryOp(this.GreaterThanOrEquals, (x, y) => x >= y);\n      this.AddFloatBinaryOp(this.LessThanOrEquals, (x, y) => x <= y);\n      this.AddFloatBinaryOp(this.NotEquals, (x, y) => x != y);\n      this.AddFloatUnaryOp(this.Not, (x) => x == 0.0);\n\n      this.AddFloatBinaryOp(this.And, (x, y) => x != 0.0 && y != 0.0);\n      this.AddFloatBinaryOp(this.Or, (x, y) => x != 0.0 || y != 0.0);\n\n      this.AddFloatBinaryOp(this.Max, (x, y) => Math.max(x, y));\n      this.AddFloatBinaryOp(this.Min, (x, y) => Math.min(x, y));\n\n      this.AddFloatBinaryOp(this.Pow, (x, y) => Math.pow(x, y));\n      this.AddFloatUnaryOp(this.Floor, (x) => Math.floor(x));\n      this.AddFloatUnaryOp(this.Ceiling, (x) => Math.ceil(x));\n      this.AddFloatUnaryOp(this.Int, (x) => Math.floor(x));\n      this.AddFloatUnaryOp(this.Float, NativeFunctionCall.Identity);\n\n      // String operations\n      this.AddStringBinaryOp(this.Add, (x, y) => x + y); // concat\n      this.AddStringBinaryOp(this.Equal, (x, y) => x === y);\n      this.AddStringBinaryOp(this.NotEquals, (x, y) => !(x === y));\n      this.AddStringBinaryOp(this.Has, (x, y) => x.includes(y));\n      this.AddStringBinaryOp(this.Hasnt, (x, y) => !x.includes(y));\n\n      this.AddListBinaryOp(this.Add, (x, y) => x.Union(y));\n      this.AddListBinaryOp(this.Subtract, (x, y) => x.Without(y));\n      this.AddListBinaryOp(this.Has, (x, y) => x.Contains(y));\n      this.AddListBinaryOp(this.Hasnt, (x, y) => !x.Contains(y));\n      this.AddListBinaryOp(this.Intersect, (x, y) => x.Intersect(y));\n\n      this.AddListBinaryOp(this.Equal, (x, y) => x.Equals(y));\n      this.AddListBinaryOp(this.Greater, (x, y) => x.GreaterThan(y));\n      this.AddListBinaryOp(this.Less, (x, y) => x.LessThan(y));\n      this.AddListBinaryOp(this.GreaterThanOrEquals, (x, y) =>\n        x.GreaterThanOrEquals(y)\n      );\n      this.AddListBinaryOp(this.LessThanOrEquals, (x, y) =>\n        x.LessThanOrEquals(y)\n      );\n      this.AddListBinaryOp(this.NotEquals, (x, y) => !x.Equals(y));\n\n      this.AddListBinaryOp(this.And, (x, y) => x.Count > 0 && y.Count > 0);\n      this.AddListBinaryOp(this.Or, (x, y) => x.Count > 0 || y.Count > 0);\n\n      this.AddListUnaryOp(this.Not, (x) => (x.Count == 0 ? 1 : 0));\n\n      this.AddListUnaryOp(this.Invert, (x) => x.inverse);\n      this.AddListUnaryOp(this.All, (x) => x.all);\n      this.AddListUnaryOp(this.ListMin, (x) => x.MinAsList());\n      this.AddListUnaryOp(this.ListMax, (x) => x.MaxAsList());\n      this.AddListUnaryOp(this.Count, (x) => x.Count);\n      this.AddListUnaryOp(this.ValueOfList, (x) => x.maxItem.Value);\n\n      let divertTargetsEqual = (d1: Path, d2: Path) => d1.Equals(d2);\n      let divertTargetsNotEqual = (d1: Path, d2: Path) => !d1.Equals(d2);\n      this.AddOpToNativeFunc(\n        this.Equal,\n        2,\n        ValueType.DivertTarget,\n        divertTargetsEqual\n      );\n      this.AddOpToNativeFunc(\n        this.NotEquals,\n        2,\n        ValueType.DivertTarget,\n        divertTargetsNotEqual\n      );\n    }\n  }\n\n  public AddOpFuncForType(\n    valType: ValueType,\n    op: UnaryOp<number | InkList> | BinaryOp<number | string | InkList | Path>\n  ): void {\n    if (this._operationFuncs == null) {\n      this._operationFuncs = new Map();\n    }\n\n    this._operationFuncs.set(valType, op);\n  }\n\n  public static AddOpToNativeFunc(\n    name: string,\n    args: number,\n    valType: ValueType,\n    op: UnaryOp<any> | BinaryOp<any>\n  ): void {\n    if (this._nativeFunctions === null)\n      return throwNullException(\"NativeFunctionCall._nativeFunctions\");\n    let nativeFunc = this._nativeFunctions.get(name);\n    if (!nativeFunc) {\n      nativeFunc = new NativeFunctionCall(name, args);\n      this._nativeFunctions.set(name, nativeFunc);\n    }\n\n    nativeFunc.AddOpFuncForType(valType, op);\n  }\n\n  public static AddIntBinaryOp(name: string, op: BinaryOp<number>) {\n    this.AddOpToNativeFunc(name, 2, ValueType.Int, op);\n  }\n  public static AddIntUnaryOp(name: string, op: UnaryOp<number>) {\n    this.AddOpToNativeFunc(name, 1, ValueType.Int, op);\n  }\n\n  public static AddFloatBinaryOp(name: string, op: BinaryOp<number>) {\n    this.AddOpToNativeFunc(name, 2, ValueType.Float, op);\n  }\n  public static AddFloatUnaryOp(name: string, op: UnaryOp<number>) {\n    this.AddOpToNativeFunc(name, 1, ValueType.Float, op);\n  }\n\n  public static AddStringBinaryOp(name: string, op: BinaryOp<string>) {\n    this.AddOpToNativeFunc(name, 2, ValueType.String, op);\n  }\n\n  public static AddListBinaryOp(name: string, op: BinaryOp<InkList>) {\n    this.AddOpToNativeFunc(name, 2, ValueType.List, op);\n  }\n  public static AddListUnaryOp(name: string, op: UnaryOp<InkList>) {\n    this.AddOpToNativeFunc(name, 1, ValueType.List, op);\n  }\n\n  public toString() {\n    return 'Native \"' + this.name + '\"';\n  }\n\n  public _prototype: NativeFunctionCall | null = null;\n  public _isPrototype: boolean = false;\n  public _operationFuncs: Map<ValueType, BinaryOp<any> | UnaryOp<any>> | null =\n    null;\n  public static _nativeFunctions: Map<string, NativeFunctionCall> | null = null;\n}\n","import { InkObject } from \"./Object\";\n\n// New version of tags is dynamic - it constructs the tags\n// at runtime based on BeginTag and EndTag control commands.\n// Plain text that's in the output stream is turned into tags\n// when you do story.currentTags.\n// The only place this is used is when flattening tags down\n// to string in advance, during dynamic string generation if\n// there's a tag embedded in it. See how ControlCommand.EndString\n// is implemented in Story.cs for more details + comment\nexport class Tag extends InkObject {\n  public readonly text: string;\n\n  constructor(tagText: string) {\n    super();\n    this.text = tagText.toString() || \"\";\n  }\n\n  public toString(): string {\n    return \"# \" + this.text;\n  }\n}\n","import { Path } from \"./Path\";\nimport { CallStack } from \"./CallStack\";\nimport { throwNullException } from \"./NullException\";\nimport { InkObject } from \"./Object\";\n\nexport class Choice extends InkObject {\n  public text: string = \"\";\n  public index: number = 0;\n  public threadAtGeneration: CallStack.Thread | null = null;\n  public sourcePath: string = \"\";\n  public targetPath: Path | null = null;\n  public isInvisibleDefault: boolean = false;\n  public tags: string[] | null = null;\n  public originalThreadIndex: number = 0;\n\n  get pathStringOnChoice(): string {\n    if (this.targetPath === null)\n      return throwNullException(\"Choice.targetPath\");\n    return this.targetPath.toString();\n  }\n  set pathStringOnChoice(value: string) {\n    this.targetPath = new Path(value);\n  }\n\n  public Clone() {\n    let copy = new Choice();\n    copy.text = this.text;\n    copy.sourcePath = this.sourcePath;\n    copy.index = this.index;\n    copy.targetPath = this.targetPath;\n    copy.originalThreadIndex = this.originalThreadIndex;\n    copy.isInvisibleDefault = this.isInvisibleDefault;\n    if (this.threadAtGeneration !== null)\n      copy.threadAtGeneration = this.threadAtGeneration.Copy();\n\n    return copy;\n  }\n}\n","import { InkListItem, SerializedInkListItem } from \"./InkList\";\nimport { TryGetResult } from \"./TryGetResult\";\n\nexport class ListDefinition {\n  public _name: string;\n  public _items: Map<SerializedInkListItem, number> | null;\n  public _itemNameToValues: Map<string, number>;\n\n  constructor(name: string, items: Map<string, number> | null) {\n    this._name = name || \"\";\n    this._items = null;\n    this._itemNameToValues = items || new Map();\n  }\n  get name() {\n    return this._name;\n  }\n  get items() {\n    if (this._items == null) {\n      this._items = new Map();\n      for (let [key, value] of this._itemNameToValues) {\n        let item = new InkListItem(this.name, key);\n        this._items.set(item.serialized(), value);\n      }\n    }\n\n    return this._items;\n  }\n\n  public ValueForItem(item: InkListItem) {\n    if (!item.itemName) return 0;\n\n    let intVal = this._itemNameToValues.get(item.itemName);\n    if (typeof intVal !== \"undefined\") return intVal;\n    else return 0;\n  }\n  public ContainsItem(item: InkListItem) {\n    if (!item.itemName) return false;\n    if (item.originName != this.name) return false;\n\n    return this._itemNameToValues.has(item.itemName);\n  }\n  public ContainsItemWithName(itemName: string) {\n    return this._itemNameToValues.has(itemName);\n  }\n  public TryGetItemWithValue(\n    val: number,\n    /* out */ item: InkListItem\n  ): TryGetResult<InkListItem> {\n    for (let [key, value] of this._itemNameToValues) {\n      if (value == val) {\n        item = new InkListItem(this.name, key);\n        return { result: item, exists: true };\n      }\n    }\n\n    item = InkListItem.Null;\n    return { result: item, exists: false };\n  }\n\n  public TryGetValueForItem(\n    item: InkListItem,\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    /* out */ intVal: number\n  ): TryGetResult<number> {\n    if (!item.itemName) return { result: 0, exists: false };\n    let value = this._itemNameToValues.get(item.itemName);\n\n    if (!value) return { result: 0, exists: false };\n    return { result: value, exists: true };\n  }\n}\n","import { InkListItem } from \"./InkList\";\nimport { ListValue } from \"./Value\";\nimport { ListDefinition } from \"./ListDefinition\";\nimport { TryGetResult } from \"./TryGetResult\";\nimport { throwNullException } from \"./NullException\";\n\nexport class ListDefinitionsOrigin {\n  protected _lists: Map<string, ListDefinition>;\n  protected _allUnambiguousListValueCache: Map<string, ListValue>;\n\n  constructor(lists: ListDefinition[]) {\n    this._lists = new Map();\n    this._allUnambiguousListValueCache = new Map();\n\n    for (let list of lists) {\n      this._lists.set(list.name, list);\n\n      for (let [key, val] of list.items) {\n        let item = InkListItem.fromSerializedKey(key);\n        let listValue = new ListValue(item, val);\n\n        if (!item.itemName) {\n          throw new Error(\"item.itemName is null or undefined.\");\n        }\n\n        this._allUnambiguousListValueCache.set(item.itemName, listValue);\n        this._allUnambiguousListValueCache.set(item.fullName, listValue);\n      }\n    }\n  }\n  get lists(): ListDefinition[] {\n    let listOfLists: ListDefinition[] = [];\n\n    for (let [, value] of this._lists) {\n      listOfLists.push(value);\n    }\n\n    return listOfLists;\n  }\n  public TryListGetDefinition(\n    name: string | null,\n    /* out */ def: ListDefinition | null\n  ): TryGetResult<ListDefinition | null> {\n    if (name === null) {\n      return { result: def, exists: false };\n    }\n    // initially, this function returns a boolean and the second parameter is an out.\n    let definition = this._lists.get(name);\n    if (!definition) return { result: def, exists: false };\n\n    return { result: definition, exists: true };\n  }\n  public FindSingleItemListWithName(name: string | null) {\n    if (name === null) {\n      return throwNullException(\"name\");\n    }\n    let val = this._allUnambiguousListValueCache.get(name);\n\n    if (typeof val !== \"undefined\") {\n      return val;\n    }\n\n    return null;\n  }\n}\n","import { Container } from \"./Container\";\nimport {\n  Value,\n  IntValue,\n  FloatValue,\n  StringValue,\n  DivertTargetValue,\n  VariablePointerValue,\n  ListValue,\n  BoolValue,\n} from \"./Value\";\nimport { Glue } from \"./Glue\";\nimport { ControlCommand } from \"./ControlCommand\";\nimport { PushPopType } from \"./PushPop\";\nimport { Divert } from \"./Divert\";\nimport { ChoicePoint } from \"./ChoicePoint\";\nimport { VariableReference } from \"./VariableReference\";\nimport { VariableAssignment } from \"./VariableAssignment\";\nimport { NativeFunctionCall } from \"./NativeFunctionCall\";\nimport { Void } from \"./Void\";\nimport { Tag } from \"./Tag\";\nimport { Path } from \"./Path\";\nimport { Choice } from \"./Choice\";\nimport { ListDefinition } from \"./ListDefinition\";\nimport { ListDefinitionsOrigin } from \"./ListDefinitionsOrigin\";\nimport { InkListItem, InkList } from \"./InkList\";\nimport { InkObject } from \"./Object\";\nimport { asOrNull } from \"./TypeAssertion\";\nimport { throwNullException } from \"./NullException\";\nimport { SimpleJson } from \"./SimpleJson\";\n\nexport class JsonSerialisation {\n  public static JArrayToRuntimeObjList(\n    jArray: any[],\n    skipLast: boolean = false\n  ) {\n    let count = jArray.length;\n    if (skipLast) count--;\n\n    let list: InkObject[] = [];\n\n    for (let i = 0; i < count; i++) {\n      let jTok = jArray[i];\n      let runtimeObj = this.JTokenToRuntimeObject(jTok);\n      if (runtimeObj === null) {\n        return throwNullException(\"runtimeObj\");\n      }\n      list.push(runtimeObj);\n    }\n\n    return list;\n  }\n\n  public static WriteDictionaryRuntimeObjs(\n    writer: SimpleJson.Writer,\n    dictionary: Map<string, InkObject>\n  ) {\n    writer.WriteObjectStart();\n    for (let [key, value] of dictionary) {\n      writer.WritePropertyStart(key);\n      this.WriteRuntimeObject(writer, value);\n      writer.WritePropertyEnd();\n    }\n    writer.WriteObjectEnd();\n  }\n\n  public static WriteListRuntimeObjs(\n    writer: SimpleJson.Writer,\n    list: InkObject[]\n  ) {\n    writer.WriteArrayStart();\n    for (let value of list) {\n      this.WriteRuntimeObject(writer, value);\n    }\n    writer.WriteArrayEnd();\n  }\n\n  public static WriteIntDictionary(\n    writer: SimpleJson.Writer,\n    dict: Map<string, number>\n  ) {\n    writer.WriteObjectStart();\n    for (let [key, value] of dict) {\n      writer.WriteIntProperty(key, value);\n    }\n    writer.WriteObjectEnd();\n  }\n\n  public static WriteRuntimeObject(\n    writer: SimpleJson.Writer,\n    obj: InkObject\n  ): void {\n    let container = asOrNull(obj, Container);\n    if (container) {\n      this.WriteRuntimeContainer(writer, container);\n      return;\n    }\n\n    let divert = asOrNull(obj, Divert);\n    if (divert) {\n      let divTypeKey = \"->\";\n      if (divert.isExternal) {\n        divTypeKey = \"x()\";\n      } else if (divert.pushesToStack) {\n        if (divert.stackPushType == PushPopType.Function) {\n          divTypeKey = \"f()\";\n        } else if (divert.stackPushType == PushPopType.Tunnel) {\n          divTypeKey = \"->t->\";\n        }\n      }\n\n      let targetStr;\n      if (divert.hasVariableTarget) {\n        targetStr = divert.variableDivertName;\n      } else {\n        targetStr = divert.targetPathString;\n      }\n\n      writer.WriteObjectStart();\n      writer.WriteProperty(divTypeKey, targetStr);\n\n      if (divert.hasVariableTarget) {\n        writer.WriteProperty(\"var\", true);\n      }\n\n      if (divert.isConditional) {\n        writer.WriteProperty(\"c\", true);\n      }\n\n      if (divert.externalArgs > 0) {\n        writer.WriteIntProperty(\"exArgs\", divert.externalArgs);\n      }\n\n      writer.WriteObjectEnd();\n      return;\n    }\n\n    let choicePoint = asOrNull(obj, ChoicePoint);\n    if (choicePoint) {\n      writer.WriteObjectStart();\n      writer.WriteProperty(\"*\", choicePoint.pathStringOnChoice);\n      writer.WriteIntProperty(\"flg\", choicePoint.flags);\n      writer.WriteObjectEnd();\n      return;\n    }\n\n    let boolVal = asOrNull(obj, BoolValue);\n    if (boolVal) {\n      writer.WriteBool(boolVal.value);\n      return;\n    }\n\n    let intVal = asOrNull(obj, IntValue);\n    if (intVal) {\n      writer.WriteInt(intVal.value);\n      return;\n    }\n\n    let floatVal = asOrNull(obj, FloatValue);\n    if (floatVal) {\n      writer.WriteFloat(floatVal.value);\n      return;\n    }\n\n    let strVal = asOrNull(obj, StringValue);\n    if (strVal) {\n      if (strVal.isNewline) {\n        writer.Write(\"\\n\", false);\n      } else {\n        writer.WriteStringStart();\n        writer.WriteStringInner(\"^\");\n        writer.WriteStringInner(strVal.value);\n        writer.WriteStringEnd();\n      }\n      return;\n    }\n\n    let listVal = asOrNull(obj, ListValue);\n    if (listVal) {\n      this.WriteInkList(writer, listVal);\n      return;\n    }\n\n    let divTargetVal = asOrNull(obj, DivertTargetValue);\n    if (divTargetVal) {\n      writer.WriteObjectStart();\n      if (divTargetVal.value === null) {\n        return throwNullException(\"divTargetVal.value\");\n      }\n      writer.WriteProperty(\"^->\", divTargetVal.value.componentsString);\n      writer.WriteObjectEnd();\n\n      return;\n    }\n\n    let varPtrVal = asOrNull(obj, VariablePointerValue);\n    if (varPtrVal) {\n      writer.WriteObjectStart();\n      writer.WriteProperty(\"^var\", varPtrVal.value);\n      writer.WriteIntProperty(\"ci\", varPtrVal.contextIndex);\n      writer.WriteObjectEnd();\n      return;\n    }\n\n    let glue = asOrNull(obj, Glue);\n    if (glue) {\n      writer.Write(\"<>\");\n      return;\n    }\n\n    let controlCmd = asOrNull(obj, ControlCommand);\n    if (controlCmd) {\n      writer.Write(\n        JsonSerialisation._controlCommandNames[controlCmd.commandType]\n      );\n      return;\n    }\n\n    let nativeFunc = asOrNull(obj, NativeFunctionCall);\n    if (nativeFunc) {\n      let name = nativeFunc.name;\n\n      if (name == \"^\") name = \"L^\";\n\n      writer.Write(name);\n      return;\n    }\n\n    let varRef = asOrNull(obj, VariableReference);\n    if (varRef) {\n      writer.WriteObjectStart();\n      let readCountPath = varRef.pathStringForCount;\n      if (readCountPath != null) {\n        writer.WriteProperty(\"CNT?\", readCountPath);\n      } else {\n        writer.WriteProperty(\"VAR?\", varRef.name);\n      }\n\n      writer.WriteObjectEnd();\n      return;\n    }\n\n    let varAss = asOrNull(obj, VariableAssignment);\n    if (varAss) {\n      writer.WriteObjectStart();\n\n      let key = varAss.isGlobal ? \"VAR=\" : \"temp=\";\n      writer.WriteProperty(key, varAss.variableName);\n\n      // Reassignment?\n      if (!varAss.isNewDeclaration) writer.WriteProperty(\"re\", true);\n\n      writer.WriteObjectEnd();\n\n      return;\n    }\n\n    let voidObj = asOrNull(obj, Void);\n    if (voidObj) {\n      writer.Write(\"void\");\n      return;\n    }\n\n    let tag = asOrNull(obj, Tag);\n    if (tag) {\n      writer.WriteObjectStart();\n      writer.WriteProperty(\"#\", tag.text);\n      writer.WriteObjectEnd();\n      return;\n    }\n\n    let choice = asOrNull(obj, Choice);\n    if (choice) {\n      this.WriteChoice(writer, choice);\n      return;\n    }\n\n    throw new Error(\"Failed to convert runtime object to Json token: \" + obj);\n  }\n\n  public static JObjectToDictionaryRuntimeObjs(jObject: Record<string, any>) {\n    let dict: Map<string, InkObject> = new Map();\n\n    for (let key in jObject) {\n      if (jObject.hasOwnProperty(key)) {\n        let inkObject = this.JTokenToRuntimeObject(jObject[key]);\n        if (inkObject === null) {\n          return throwNullException(\"inkObject\");\n        }\n        dict.set(key, inkObject);\n      }\n    }\n\n    return dict;\n  }\n\n  public static JObjectToIntDictionary(jObject: Record<string, any>) {\n    let dict: Map<string, number> = new Map();\n    for (let key in jObject) {\n      if (jObject.hasOwnProperty(key)) {\n        dict.set(key, parseInt(jObject[key]));\n      }\n    }\n    return dict;\n  }\n\n  public static JTokenToRuntimeObject(token: any): InkObject | null {\n    if (\n      (typeof token === \"number\" && !isNaN(token)) ||\n      typeof token === \"boolean\"\n    ) {\n      return Value.Create(token);\n    }\n\n    if (typeof token === \"string\") {\n      let str = token.toString();\n\n      //Explicit float value of the form \"123.00f\"\n      const floatRepresentation = /^([0-9]+.[0-9]+f)$/.exec(str);\n      if (floatRepresentation) {\n        return new FloatValue(parseFloat(floatRepresentation[0]));\n      }\n\n      // String value\n      let firstChar = str[0];\n      if (firstChar == \"^\") return new StringValue(str.substring(1));\n      else if (firstChar == \"\\n\" && str.length == 1)\n        return new StringValue(\"\\n\");\n\n      // Glue\n      if (str == \"<>\") return new Glue();\n\n      // Control commands (would looking up in a hash set be faster?)\n      for (let i = 0; i < JsonSerialisation._controlCommandNames.length; ++i) {\n        let cmdName = JsonSerialisation._controlCommandNames[i];\n        if (str == cmdName) {\n          return new ControlCommand(i);\n        }\n      }\n\n      // Native functions\n      if (str == \"L^\") str = \"^\";\n      if (NativeFunctionCall.CallExistsWithName(str))\n        return NativeFunctionCall.CallWithName(str);\n\n      // Pop\n      if (str == \"->->\") return ControlCommand.PopTunnel();\n      else if (str == \"~ret\") return ControlCommand.PopFunction();\n\n      // Void\n      if (str == \"void\") return new Void();\n    }\n\n    if (typeof token === \"object\" && !Array.isArray(token)) {\n      let obj = token as Record<string, any>;\n      let propValue;\n\n      // Divert target value to path\n      if (obj[\"^->\"]) {\n        propValue = obj[\"^->\"];\n        return new DivertTargetValue(new Path(propValue.toString()));\n      }\n\n      // VariablePointerValue\n      if (obj[\"^var\"]) {\n        propValue = obj[\"^var\"];\n        let varPtr = new VariablePointerValue(propValue.toString());\n        if (\"ci\" in obj) {\n          propValue = obj[\"ci\"];\n          varPtr.contextIndex = parseInt(propValue);\n        }\n        return varPtr;\n      }\n\n      // Divert\n      let isDivert = false;\n      let pushesToStack = false;\n      let divPushType = PushPopType.Function;\n      let external = false;\n      if ((propValue = obj[\"->\"])) {\n        isDivert = true;\n      } else if ((propValue = obj[\"f()\"])) {\n        isDivert = true;\n        pushesToStack = true;\n        divPushType = PushPopType.Function;\n      } else if ((propValue = obj[\"->t->\"])) {\n        isDivert = true;\n        pushesToStack = true;\n        divPushType = PushPopType.Tunnel;\n      } else if ((propValue = obj[\"x()\"])) {\n        isDivert = true;\n        external = true;\n        pushesToStack = false;\n        divPushType = PushPopType.Function;\n      }\n\n      if (isDivert) {\n        let divert = new Divert();\n        divert.pushesToStack = pushesToStack;\n        divert.stackPushType = divPushType;\n        divert.isExternal = external;\n\n        let target = propValue.toString();\n\n        if ((propValue = obj[\"var\"])) divert.variableDivertName = target;\n        else divert.targetPathString = target;\n\n        divert.isConditional = !!obj[\"c\"];\n\n        if (external) {\n          if ((propValue = obj[\"exArgs\"]))\n            divert.externalArgs = parseInt(propValue);\n        }\n\n        return divert;\n      }\n\n      // Choice\n      if ((propValue = obj[\"*\"])) {\n        let choice = new ChoicePoint();\n        choice.pathStringOnChoice = propValue.toString();\n\n        if ((propValue = obj[\"flg\"])) choice.flags = parseInt(propValue);\n\n        return choice;\n      }\n\n      // Variable reference\n      if ((propValue = obj[\"VAR?\"])) {\n        return new VariableReference(propValue.toString());\n      } else if ((propValue = obj[\"CNT?\"])) {\n        let readCountVarRef = new VariableReference();\n        readCountVarRef.pathStringForCount = propValue.toString();\n        return readCountVarRef;\n      }\n\n      // Variable assignment\n      let isVarAss = false;\n      let isGlobalVar = false;\n      if ((propValue = obj[\"VAR=\"])) {\n        isVarAss = true;\n        isGlobalVar = true;\n      } else if ((propValue = obj[\"temp=\"])) {\n        isVarAss = true;\n        isGlobalVar = false;\n      }\n      if (isVarAss) {\n        let varName = propValue.toString();\n        let isNewDecl = !obj[\"re\"];\n        let varAss = new VariableAssignment(varName, isNewDecl);\n        varAss.isGlobal = isGlobalVar;\n        return varAss;\n      }\n      if (obj[\"#\"] !== undefined) {\n        propValue = obj[\"#\"];\n        return new Tag(propValue.toString());\n      }\n\n      // List value\n      if ((propValue = obj[\"list\"])) {\n        // var listContent = (Dictionary<string, object>)propValue;\n        let listContent = propValue as Record<string, any>;\n        let rawList = new InkList();\n        if ((propValue = obj[\"origins\"])) {\n          // var namesAsObjs = (List<object>)propValue;\n          let namesAsObjs = propValue as string[];\n          // rawList.SetInitialOriginNames(namesAsObjs.Cast<string>().ToList());\n          rawList.SetInitialOriginNames(namesAsObjs);\n        }\n\n        for (let key in listContent) {\n          if (listContent.hasOwnProperty(key)) {\n            let nameToVal = listContent[key];\n            let item = new InkListItem(key);\n            let val = parseInt(nameToVal);\n            rawList.Add(item, val);\n          }\n        }\n\n        return new ListValue(rawList);\n      }\n\n      if (obj[\"originalChoicePath\"] != null) return this.JObjectToChoice(obj);\n    }\n\n    // Array is always a Runtime.Container\n    if (Array.isArray(token)) {\n      return this.JArrayToContainer(token);\n    }\n\n    if (token === null || token === undefined) return null;\n\n    throw new Error(\n      \"Failed to convert token to runtime object: \" +\n        this.toJson(token, [\"parent\"])\n    );\n  }\n\n  public static toJson<T>(\n    me: T,\n    removes?: (keyof T)[],\n    space?: number\n  ): string {\n    return JSON.stringify(\n      me,\n      (k, v) => (removes?.some((r) => r === k) ? undefined : v),\n      space\n    );\n  }\n\n  public static WriteRuntimeContainer(\n    writer: SimpleJson.Writer,\n    container: Container | null,\n    withoutName: boolean = false\n  ) {\n    writer.WriteArrayStart();\n    if (container === null) {\n      return throwNullException(\"container\");\n    }\n    for (let c of container.content) this.WriteRuntimeObject(writer, c);\n\n    let namedOnlyContent = container.namedOnlyContent;\n    let countFlags = container.countFlags;\n    let hasNameProperty = container.name != null && !withoutName;\n\n    let hasTerminator =\n      namedOnlyContent != null || countFlags > 0 || hasNameProperty;\n    if (hasTerminator) {\n      writer.WriteObjectStart();\n    }\n\n    if (namedOnlyContent != null) {\n      for (let [key, value] of namedOnlyContent) {\n        let name = key;\n        let namedContainer = asOrNull(value, Container);\n        writer.WritePropertyStart(name);\n        this.WriteRuntimeContainer(writer, namedContainer, true);\n        writer.WritePropertyEnd();\n      }\n    }\n\n    if (countFlags > 0) writer.WriteIntProperty(\"#f\", countFlags);\n\n    if (hasNameProperty) writer.WriteProperty(\"#n\", container.name);\n\n    if (hasTerminator) writer.WriteObjectEnd();\n    else writer.WriteNull();\n\n    writer.WriteArrayEnd();\n  }\n\n  public static JArrayToContainer(jArray: any[]) {\n    let container = new Container();\n    container.content = this.JArrayToRuntimeObjList(jArray, true);\n\n    let terminatingObj = jArray[jArray.length - 1] as Record<string, any>;\n    if (terminatingObj != null) {\n      let namedOnlyContent = new Map();\n\n      for (let key in terminatingObj) {\n        if (key == \"#f\") {\n          container.countFlags = parseInt(terminatingObj[key]);\n        } else if (key == \"#n\") {\n          container.name = terminatingObj[key].toString();\n        } else {\n          let namedContentItem = this.JTokenToRuntimeObject(\n            terminatingObj[key]\n          );\n          // var namedSubContainer = namedContentItem as Container;\n          let namedSubContainer = asOrNull(namedContentItem, Container);\n          if (namedSubContainer) namedSubContainer.name = key;\n          namedOnlyContent.set(key, namedContentItem);\n        }\n      }\n\n      container.namedOnlyContent = namedOnlyContent;\n    }\n\n    return container;\n  }\n\n  public static JObjectToChoice(jObj: Record<string, any>) {\n    let choice = new Choice();\n    choice.text = jObj[\"text\"].toString();\n    choice.index = parseInt(jObj[\"index\"]);\n    choice.sourcePath = jObj[\"originalChoicePath\"].toString();\n    choice.originalThreadIndex = parseInt(jObj[\"originalThreadIndex\"]);\n    choice.pathStringOnChoice = jObj[\"targetPath\"].toString();\n    choice.tags = this.JArrayToTags(jObj);\n    choice.isInvisibleDefault = !!jObj[\"isInvisibleDefault\"];\n    return choice;\n  }\n\n  public static JArrayToTags(jObj: Record<string, any>) {\n    if (jObj[\"tags\"]) {\n      return jObj[\"tags\"];\n    } else {\n      return null;\n    }\n  }\n\n  public static WriteChoice(writer: SimpleJson.Writer, choice: Choice) {\n    writer.WriteObjectStart();\n    writer.WriteProperty(\"text\", choice.text);\n    writer.WriteIntProperty(\"index\", choice.index);\n    writer.WriteProperty(\"originalChoicePath\", choice.sourcePath);\n    writer.WriteIntProperty(\"originalThreadIndex\", choice.originalThreadIndex);\n    writer.WriteProperty(\"targetPath\", choice.pathStringOnChoice);\n    writer.WriteProperty(\"isInvisibleDefault\", choice.isInvisibleDefault);\n    this.WriteChoiceTags(writer, choice);\n    writer.WriteObjectEnd();\n  }\n\n  public static WriteChoiceTags(writer: SimpleJson.Writer, choice: Choice) {\n    if (choice.tags && choice.tags.length > 0) {\n      writer.WritePropertyStart(\"tags\");\n      writer.WriteArrayStart();\n      for (const tag of choice.tags!) {\n        writer.Write(tag);\n      }\n      writer.WriteArrayEnd();\n      writer.WritePropertyEnd();\n    }\n  }\n\n  public static WriteInkList(writer: SimpleJson.Writer, listVal: ListValue) {\n    let rawList = listVal.value;\n    if (rawList === null) {\n      return throwNullException(\"rawList\");\n    }\n\n    writer.WriteObjectStart();\n    writer.WritePropertyStart(\"list\");\n    writer.WriteObjectStart();\n\n    for (let [key, val] of rawList) {\n      let item = InkListItem.fromSerializedKey(key);\n      let itemVal = val;\n\n      if (item.itemName === null) {\n        return throwNullException(\"item.itemName\");\n      }\n\n      writer.WritePropertyNameStart();\n      writer.WritePropertyNameInner(item.originName ? item.originName : \"?\");\n      writer.WritePropertyNameInner(\".\");\n      writer.WritePropertyNameInner(item.itemName);\n      writer.WritePropertyNameEnd();\n\n      writer.Write(itemVal);\n\n      writer.WritePropertyEnd();\n    }\n\n    writer.WriteObjectEnd();\n\n    writer.WritePropertyEnd();\n\n    if (\n      rawList.Count == 0 &&\n      rawList.originNames != null &&\n      rawList.originNames.length > 0\n    ) {\n      writer.WritePropertyStart(\"origins\");\n      writer.WriteArrayStart();\n      for (let name of rawList.originNames) writer.Write(name);\n      writer.WriteArrayEnd();\n      writer.WritePropertyEnd();\n    }\n\n    writer.WriteObjectEnd();\n  }\n\n  public static ListDefinitionsToJToken(origin: ListDefinitionsOrigin) {\n    let result: Record<string, any> = {};\n\n    for (let def of origin.lists) {\n      let listDefJson: Record<string, any> = {};\n\n      for (let [key, val] of def.items) {\n        let item = InkListItem.fromSerializedKey(key);\n        if (item.itemName === null) {\n          return throwNullException(\"item.itemName\");\n        }\n        listDefJson[item.itemName] = val;\n      }\n\n      result[def.name] = listDefJson;\n    }\n\n    return result;\n  }\n\n  public static JTokenToListDefinitions(obj: Record<string, any>) {\n    // var defsObj = (Dictionary<string, object>)obj;\n    let defsObj = obj;\n\n    let allDefs: ListDefinition[] = [];\n\n    for (let key in defsObj) {\n      if (defsObj.hasOwnProperty(key)) {\n        let name = key.toString();\n        // var listDefJson = (Dictionary<string, object>)kv.Value;\n        let listDefJson = defsObj[key] as Record<string, any>;\n\n        // Cast (string, object) to (string, int) for items\n        let items: Map<string, number> = new Map();\n\n        for (let nameValueKey in listDefJson) {\n          if (defsObj.hasOwnProperty(key)) {\n            let nameValue = listDefJson[nameValueKey];\n            items.set(nameValueKey, parseInt(nameValue));\n          }\n        }\n\n        let def = new ListDefinition(name, items);\n        allDefs.push(def);\n      }\n    }\n\n    return new ListDefinitionsOrigin(allDefs);\n  }\n\n  private static _controlCommandNames = (() => {\n    let _controlCommandNames: string[] = [];\n\n    _controlCommandNames[ControlCommand.CommandType.EvalStart] = \"ev\";\n    _controlCommandNames[ControlCommand.CommandType.EvalOutput] = \"out\";\n    _controlCommandNames[ControlCommand.CommandType.EvalEnd] = \"/ev\";\n    _controlCommandNames[ControlCommand.CommandType.Duplicate] = \"du\";\n    _controlCommandNames[ControlCommand.CommandType.PopEvaluatedValue] = \"pop\";\n    _controlCommandNames[ControlCommand.CommandType.PopFunction] = \"~ret\";\n    _controlCommandNames[ControlCommand.CommandType.PopTunnel] = \"->->\";\n    _controlCommandNames[ControlCommand.CommandType.BeginString] = \"str\";\n    _controlCommandNames[ControlCommand.CommandType.EndString] = \"/str\";\n    _controlCommandNames[ControlCommand.CommandType.NoOp] = \"nop\";\n    _controlCommandNames[ControlCommand.CommandType.ChoiceCount] = \"choiceCnt\";\n    _controlCommandNames[ControlCommand.CommandType.Turns] = \"turn\";\n    _controlCommandNames[ControlCommand.CommandType.TurnsSince] = \"turns\";\n    _controlCommandNames[ControlCommand.CommandType.ReadCount] = \"readc\";\n    _controlCommandNames[ControlCommand.CommandType.Random] = \"rnd\";\n    _controlCommandNames[ControlCommand.CommandType.SeedRandom] = \"srnd\";\n    _controlCommandNames[ControlCommand.CommandType.VisitIndex] = \"visit\";\n    _controlCommandNames[ControlCommand.CommandType.SequenceShuffleIndex] =\n      \"seq\";\n    _controlCommandNames[ControlCommand.CommandType.StartThread] = \"thread\";\n    _controlCommandNames[ControlCommand.CommandType.Done] = \"done\";\n    _controlCommandNames[ControlCommand.CommandType.End] = \"end\";\n    _controlCommandNames[ControlCommand.CommandType.ListFromInt] = \"listInt\";\n    _controlCommandNames[ControlCommand.CommandType.ListRange] = \"range\";\n    _controlCommandNames[ControlCommand.CommandType.ListRandom] = \"lrnd\";\n    _controlCommandNames[ControlCommand.CommandType.BeginTag] = \"#\";\n    _controlCommandNames[ControlCommand.CommandType.EndTag] = \"/#\";\n\n    for (let i = 0; i < ControlCommand.CommandType.TOTAL_VALUES; ++i) {\n      if (_controlCommandNames[i] == null)\n        throw new Error(\"Control command not accounted for in serialisation\");\n    }\n\n    return _controlCommandNames;\n  })();\n}\n","import { PushPopType } from \"./PushPop\";\nimport { Path } from \"./Path\";\nimport { Story } from \"./Story\";\nimport { JsonSerialisation } from \"./JsonSerialisation\";\nimport { ListValue } from \"./Value\";\nimport { StringBuilder } from \"./StringBuilder\";\nimport { Pointer } from \"./Pointer\";\nimport { InkObject } from \"./Object\";\nimport { Debug } from \"./Debug\";\nimport { tryGetValueFromMap } from \"./TryGetResult\";\nimport { throwNullException } from \"./NullException\";\nimport { SimpleJson } from \"./SimpleJson\";\n\nexport class CallStack {\n  get elements() {\n    return this.callStack;\n  }\n\n  get depth() {\n    return this.elements.length;\n  }\n\n  get currentElement() {\n    let thread = this._threads[this._threads.length - 1];\n    let cs = thread.callstack;\n    return cs[cs.length - 1];\n  }\n\n  get currentElementIndex() {\n    return this.callStack.length - 1;\n  }\n\n  get currentThread(): CallStack.Thread {\n    return this._threads[this._threads.length - 1];\n  }\n  set currentThread(value: CallStack.Thread) {\n    Debug.Assert(\n      this._threads.length == 1,\n      \"Shouldn't be directly setting the current thread when we have a stack of them\"\n    );\n\n    this._threads.length = 0;\n    this._threads.push(value);\n  }\n\n  get canPop() {\n    return this.callStack.length > 1;\n  }\n\n  constructor(storyContext: Story);\n  constructor(toCopy: CallStack);\n  constructor() {\n    if (arguments[0] instanceof Story) {\n      let storyContext = arguments[0] as Story;\n\n      this._startOfRoot = Pointer.StartOf(storyContext.rootContentContainer);\n      this.Reset();\n    } else {\n      let toCopy = arguments[0] as CallStack;\n\n      this._threads = [];\n      for (let otherThread of toCopy._threads) {\n        this._threads.push(otherThread.Copy());\n      }\n      this._threadCounter = toCopy._threadCounter;\n      this._startOfRoot = toCopy._startOfRoot.copy();\n    }\n  }\n\n  public Reset() {\n    this._threads = [];\n    this._threads.push(new CallStack.Thread());\n\n    this._threads[0].callstack.push(\n      new CallStack.Element(PushPopType.Tunnel, this._startOfRoot)\n    );\n  }\n\n  public SetJsonToken(jObject: Record<string, any>, storyContext: Story) {\n    this._threads.length = 0;\n\n    // TODO: (List<object>) jObject [\"threads\"];\n    let jThreads: any[] = jObject[\"threads\"];\n\n    for (let jThreadTok of jThreads) {\n      // TODO: var jThreadObj = (Dictionary<string, object>)jThreadTok;\n      let jThreadObj = jThreadTok;\n      let thread = new CallStack.Thread(jThreadObj, storyContext);\n      this._threads.push(thread);\n    }\n\n    // TODO: (int)jObject [\"threadCounter\"];\n    this._threadCounter = parseInt(jObject[\"threadCounter\"]);\n    this._startOfRoot = Pointer.StartOf(storyContext.rootContentContainer);\n  }\n  public WriteJson(w: SimpleJson.Writer) {\n    w.WriteObject((writer) => {\n      writer.WritePropertyStart(\"threads\");\n      writer.WriteArrayStart();\n\n      for (let thread of this._threads) {\n        thread.WriteJson(writer);\n      }\n\n      writer.WriteArrayEnd();\n      writer.WritePropertyEnd();\n\n      writer.WritePropertyStart(\"threadCounter\");\n      writer.WriteInt(this._threadCounter);\n      writer.WritePropertyEnd();\n    });\n  }\n\n  public PushThread() {\n    let newThread = this.currentThread.Copy();\n    this._threadCounter++;\n    newThread.threadIndex = this._threadCounter;\n    this._threads.push(newThread);\n  }\n\n  public ForkThread() {\n    let forkedThread = this.currentThread.Copy();\n    this._threadCounter++;\n    forkedThread.threadIndex = this._threadCounter;\n    return forkedThread;\n  }\n\n  public PopThread() {\n    if (this.canPopThread) {\n      this._threads.splice(this._threads.indexOf(this.currentThread), 1); // should be equivalent to a pop()\n    } else {\n      throw new Error(\"Can't pop thread\");\n    }\n  }\n\n  get canPopThread() {\n    return this._threads.length > 1 && !this.elementIsEvaluateFromGame;\n  }\n\n  get elementIsEvaluateFromGame() {\n    return this.currentElement.type == PushPopType.FunctionEvaluationFromGame;\n  }\n\n  public Push(\n    type: PushPopType,\n    externalEvaluationStackHeight: number = 0,\n    outputStreamLengthWithPushed: number = 0\n  ) {\n    let element = new CallStack.Element(\n      type,\n      this.currentElement.currentPointer,\n      false\n    );\n\n    element.evaluationStackHeightWhenPushed = externalEvaluationStackHeight;\n    element.functionStartInOutputStream = outputStreamLengthWithPushed;\n\n    this.callStack.push(element);\n  }\n\n  public CanPop(type: PushPopType | null = null) {\n    if (!this.canPop) return false;\n\n    if (type == null) return true;\n\n    return this.currentElement.type == type;\n  }\n\n  public Pop(type: PushPopType | null = null) {\n    if (this.CanPop(type)) {\n      this.callStack.pop();\n      return;\n    } else {\n      throw new Error(\"Mismatched push/pop in Callstack\");\n    }\n  }\n\n  public GetTemporaryVariableWithName(\n    name: string | null,\n    contextIndex: number = -1\n  ) {\n    // contextIndex 0 means global, so index is actually 1-based\n    if (contextIndex == -1) contextIndex = this.currentElementIndex + 1;\n\n    let contextElement = this.callStack[contextIndex - 1];\n\n    let varValue = tryGetValueFromMap(\n      contextElement.temporaryVariables,\n      name,\n      null\n    );\n    if (varValue.exists) {\n      return varValue.result;\n    } else {\n      return null;\n    }\n  }\n\n  public SetTemporaryVariable(\n    name: string,\n    value: any,\n    declareNew: boolean,\n    contextIndex: number = -1\n  ) {\n    if (contextIndex == -1) contextIndex = this.currentElementIndex + 1;\n\n    let contextElement = this.callStack[contextIndex - 1];\n\n    if (!declareNew && !contextElement.temporaryVariables.get(name)) {\n      throw new Error(\"Could not find temporary variable to set: \" + name);\n    }\n\n    let oldValue = tryGetValueFromMap(\n      contextElement.temporaryVariables,\n      name,\n      null\n    );\n    if (oldValue.exists)\n      ListValue.RetainListOriginsForAssignment(oldValue.result, value);\n\n    contextElement.temporaryVariables.set(name, value);\n  }\n\n  public ContextForVariableNamed(name: string) {\n    if (this.currentElement.temporaryVariables.get(name)) {\n      return this.currentElementIndex + 1;\n    } else {\n      return 0;\n    }\n  }\n\n  public ThreadWithIndex(index: number) {\n    let filtered = this._threads.filter((t) => {\n      if (t.threadIndex == index) return t;\n    });\n\n    return filtered.length > 0 ? filtered[0] : null;\n  }\n\n  get callStack() {\n    return this.currentThread.callstack;\n  }\n\n  get callStackTrace() {\n    let sb = new StringBuilder();\n\n    for (let t = 0; t < this._threads.length; t++) {\n      let thread = this._threads[t];\n      let isCurrent = t == this._threads.length - 1;\n      sb.AppendFormat(\n        \"=== THREAD {0}/{1} {2}===\\n\",\n        t + 1,\n        this._threads.length,\n        isCurrent ? \"(current) \" : \"\"\n      );\n\n      for (let i = 0; i < thread.callstack.length; i++) {\n        if (thread.callstack[i].type == PushPopType.Function)\n          sb.Append(\"  [FUNCTION] \");\n        else sb.Append(\"  [TUNNEL] \");\n\n        let pointer = thread.callstack[i].currentPointer;\n        if (!pointer.isNull) {\n          sb.Append(\"<SOMEWHERE IN \");\n          if (pointer.container === null) {\n            return throwNullException(\"pointer.container\");\n          }\n          sb.Append(pointer.container.path.toString());\n          sb.AppendLine(\">\");\n        }\n      }\n    }\n\n    return sb.toString();\n  }\n\n  public _threads!: CallStack.Thread[]; // Banged because it's initialized in Reset().\n  public _threadCounter: number = 0;\n  public _startOfRoot: Pointer = Pointer.Null;\n}\n\nexport namespace CallStack {\n  export class Element {\n    public currentPointer: Pointer;\n    public inExpressionEvaluation: boolean;\n    public temporaryVariables: Map<string, InkObject>;\n    public type: PushPopType;\n\n    public evaluationStackHeightWhenPushed: number = 0;\n    public functionStartInOutputStream: number = 0;\n\n    constructor(\n      type: PushPopType,\n      pointer: Pointer,\n      inExpressionEvaluation: boolean = false\n    ) {\n      this.currentPointer = pointer.copy();\n      this.inExpressionEvaluation = inExpressionEvaluation;\n      this.temporaryVariables = new Map();\n      this.type = type;\n    }\n\n    public Copy() {\n      let copy = new Element(\n        this.type,\n        this.currentPointer,\n        this.inExpressionEvaluation\n      );\n      copy.temporaryVariables = new Map(this.temporaryVariables);\n      copy.evaluationStackHeightWhenPushed =\n        this.evaluationStackHeightWhenPushed;\n      copy.functionStartInOutputStream = this.functionStartInOutputStream;\n      return copy;\n    }\n  }\n\n  export class Thread {\n    public callstack: Element[];\n    public threadIndex: number = 0;\n    public previousPointer: Pointer = Pointer.Null;\n\n    constructor();\n    constructor(jThreadObj: any, storyContext: Story);\n    constructor() {\n      this.callstack = [];\n\n      if (arguments[0] && arguments[1]) {\n        let jThreadObj = arguments[0];\n        let storyContext = arguments[1];\n\n        // TODO: (int) jThreadObj['threadIndex'] can raise;\n        this.threadIndex = parseInt(jThreadObj[\"threadIndex\"]);\n\n        let jThreadCallstack = jThreadObj[\"callstack\"];\n\n        for (let jElTok of jThreadCallstack) {\n          let jElementObj = jElTok;\n\n          // TODO: (int) jElementObj['type'] can raise;\n          let pushPopType: PushPopType = parseInt(jElementObj[\"type\"]);\n\n          let pointer = Pointer.Null;\n\n          let currentContainerPathStr: string;\n          // TODO: jElementObj.TryGetValue (\"cPath\", out currentContainerPathStrToken);\n          let currentContainerPathStrToken = jElementObj[\"cPath\"];\n          if (typeof currentContainerPathStrToken !== \"undefined\") {\n            currentContainerPathStr = currentContainerPathStrToken.toString();\n\n            let threadPointerResult = storyContext.ContentAtPath(\n              new Path(currentContainerPathStr)\n            );\n            pointer.container = threadPointerResult.container;\n            pointer.index = parseInt(jElementObj[\"idx\"]);\n\n            if (threadPointerResult.obj == null)\n              throw new Error(\n                \"When loading state, internal story location couldn't be found: \" +\n                  currentContainerPathStr +\n                  \". Has the story changed since this save data was created?\"\n              );\n            else if (threadPointerResult.approximate) {\n              if (pointer.container !== null) {\n                storyContext.Warning(\n                  \"When loading state, exact internal story location couldn't be found: '\" +\n                    currentContainerPathStr +\n                    \"', so it was approximated to '\" +\n                    pointer.container.path.toString() +\n                    \"' to recover. Has the story changed since this save data was created?\"\n                );\n              } else {\n                storyContext.Warning(\n                  \"When loading state, exact internal story location couldn't be found: '\" +\n                    currentContainerPathStr +\n                    \"' and it may not be recoverable. Has the story changed since this save data was created?\"\n                );\n              }\n            }\n          }\n\n          let inExpressionEvaluation = !!jElementObj[\"exp\"];\n\n          let el = new Element(pushPopType, pointer, inExpressionEvaluation);\n\n          let temps = jElementObj[\"temp\"];\n          if (typeof temps !== \"undefined\") {\n            el.temporaryVariables =\n              JsonSerialisation.JObjectToDictionaryRuntimeObjs(temps);\n          } else {\n            el.temporaryVariables.clear();\n          }\n\n          this.callstack.push(el);\n        }\n\n        let prevContentObjPath = jThreadObj[\"previousContentObject\"];\n        if (typeof prevContentObjPath !== \"undefined\") {\n          let prevPath = new Path(prevContentObjPath.toString());\n          this.previousPointer = storyContext.PointerAtPath(prevPath);\n        }\n      }\n    }\n\n    public Copy() {\n      let copy = new Thread();\n      copy.threadIndex = this.threadIndex;\n      for (let e of this.callstack) {\n        copy.callstack.push(e.Copy());\n      }\n      copy.previousPointer = this.previousPointer.copy();\n      return copy;\n    }\n\n    public WriteJson(writer: SimpleJson.Writer) {\n      writer.WriteObjectStart();\n\n      writer.WritePropertyStart(\"callstack\");\n      writer.WriteArrayStart();\n      for (let el of this.callstack) {\n        writer.WriteObjectStart();\n        if (!el.currentPointer.isNull) {\n          if (el.currentPointer.container === null) {\n            return throwNullException(\"el.currentPointer.container\");\n          }\n          writer.WriteProperty(\n            \"cPath\",\n            el.currentPointer.container.path.componentsString\n          );\n          writer.WriteIntProperty(\"idx\", el.currentPointer.index);\n        }\n\n        writer.WriteProperty(\"exp\", el.inExpressionEvaluation);\n        writer.WriteIntProperty(\"type\", el.type);\n\n        if (el.temporaryVariables.size > 0) {\n          writer.WritePropertyStart(\"temp\");\n          JsonSerialisation.WriteDictionaryRuntimeObjs(\n            writer,\n            el.temporaryVariables\n          );\n          writer.WritePropertyEnd();\n        }\n\n        writer.WriteObjectEnd();\n      }\n      writer.WriteArrayEnd();\n      writer.WritePropertyEnd();\n\n      writer.WriteIntProperty(\"threadIndex\", this.threadIndex);\n\n      if (!this.previousPointer.isNull) {\n        let resolvedPointer = this.previousPointer.Resolve();\n        if (resolvedPointer === null) {\n          return throwNullException(\"this.previousPointer.Resolve()\");\n        }\n        writer.WriteProperty(\n          \"previousContentObject\",\n          resolvedPointer.path.toString()\n        );\n      }\n\n      writer.WriteObjectEnd();\n    }\n  }\n}\n","import {\n  AbstractValue,\n  Value,\n  VariablePointerValue,\n  ListValue,\n  IntValue,\n  FloatValue,\n  BoolValue,\n} from \"./Value\";\nimport { VariableAssignment } from \"./VariableAssignment\";\nimport { InkObject } from \"./Object\";\nimport { ListDefinitionsOrigin } from \"./ListDefinitionsOrigin\";\nimport { StoryException } from \"./StoryException\";\nimport { JsonSerialisation } from \"./JsonSerialisation\";\nimport { asOrThrows, asOrNull, isEquatable } from \"./TypeAssertion\";\nimport { tryGetValueFromMap } from \"./TryGetResult\";\nimport { throwNullException } from \"./NullException\";\nimport { CallStack } from \"./CallStack\";\nimport { StatePatch } from \"./StatePatch\";\nimport { SimpleJson } from \"./SimpleJson\";\nimport { InkList } from \"./Story\";\nimport { Path } from \"./Path\";\n\n// Fake class wrapper around VariableState to have correct typing\n// when using the Proxy syntax in typescript\nfunction VariablesStateAccessor<T>(): new () => Pick<T, keyof T> {\n  return class {} as any;\n}\n\ntype VariableStateValue = boolean | string | number | InkList | Path | null;\n\nexport class VariablesState extends VariablesStateAccessor<\n  Record<string, any>\n>() {\n  // The way variableChangedEvent is a bit different than the reference implementation.\n  // Originally it uses the C# += operator to add delegates, but in js we need to maintain\n  // an actual collection of delegates (ie. callbacks) to register a new one, there is a\n  // special ObserveVariableChange method below.\n  public variableChangedEventCallbacks: Array<\n    (variableName: string, newValue: InkObject) => void\n  > = [];\n  public variableChangedEvent(variableName: string, newValue: InkObject): void {\n    for (let callback of this.variableChangedEventCallbacks) {\n      callback(variableName, newValue);\n    }\n  }\n\n  public patch: StatePatch | null = null;\n\n  public StartVariableObservation() {\n    this._batchObservingVariableChanges = true;\n    this._changedVariablesForBatchObs = new Set();\n  }\n\n  public CompleteVariableObservation(): Map<string, any> {\n    this._batchObservingVariableChanges = false;\n    let changedVars = new Map<string, any>();\n    if (this._changedVariablesForBatchObs != null) {\n      for (let variableName of this._changedVariablesForBatchObs) {\n        let currentValue = this._globalVariables.get(variableName) as InkObject;\n        this.variableChangedEvent(variableName, currentValue);\n      }\n    }\n    // Patch may still be active - e.g. if we were in the middle of a background save\n    if (this.patch != null) {\n      for (let variableName of this.patch.changedVariables) {\n        let patchedVal = this.patch.TryGetGlobal(variableName, null);\n        if (patchedVal.exists) changedVars.set(variableName, patchedVal);\n      }\n    }\n    this._changedVariablesForBatchObs = null;\n    return changedVars;\n  }\n\n  public NotifyObservers(changedVars: Map<string, any>) {\n    for (const [key, value] of changedVars) {\n      this.variableChangedEvent(key, value);\n    }\n  }\n\n  get callStack() {\n    return this._callStack;\n  }\n  set callStack(callStack) {\n    this._callStack = callStack;\n  }\n\n  // the original code uses a magic getter and setter for global variables,\n  // allowing things like variableState['varname]. This is not quite possible\n  // in js without a Proxy, so it is replaced with this $ function.\n  public $(variableName: string): VariableStateValue;\n  public $(variableName: string, value: VariableStateValue): void;\n  public $(variableName: string, value?: any) {\n    if (typeof value === \"undefined\") {\n      let varContents = null;\n\n      if (this.patch !== null) {\n        varContents = this.patch.TryGetGlobal(variableName, null);\n        if (varContents.exists)\n          return (varContents.result as AbstractValue).valueObject;\n      }\n\n      varContents = this._globalVariables.get(variableName);\n\n      if (typeof varContents === \"undefined\") {\n        varContents = this._defaultGlobalVariables.get(variableName);\n      }\n\n      if (typeof varContents !== \"undefined\")\n        return (varContents as AbstractValue).valueObject;\n      else return null;\n    } else {\n      if (typeof this._defaultGlobalVariables.get(variableName) === \"undefined\")\n        throw new StoryException(\n          \"Cannot assign to a variable (\" +\n            variableName +\n            \") that hasn't been declared in the story\"\n        );\n\n      let val = Value.Create(value);\n      if (val == null) {\n        if (value == null) {\n          throw new Error(\"Cannot pass null to VariableState\");\n        } else {\n          throw new Error(\n            \"Invalid value passed to VariableState: \" + value.toString()\n          );\n        }\n      }\n\n      this.SetGlobal(variableName, val);\n    }\n  }\n\n  constructor(\n    callStack: CallStack,\n    listDefsOrigin: ListDefinitionsOrigin | null\n  ) {\n    super();\n    this._globalVariables = new Map();\n    this._callStack = callStack;\n    this._listDefsOrigin = listDefsOrigin;\n\n    // if es6 proxies are available, use them.\n    try {\n      // the proxy is used to allow direct manipulation of global variables.\n      // It first tries to access the objects own property, and if none is\n      // found it delegates the call to the $ method, defined below\n      let p = new Proxy(this, {\n        get(target: any, name) {\n          return name in target ? target[name] : target.$(name);\n        },\n        set(target: any, name, value) {\n          if (name in target) target[name] = value;\n          else target.$(name, value);\n          return true; // returning a falsy value make the trap fail\n        },\n        ownKeys(target: any) {\n          return [\n            ...new Set([\n              ...target._defaultGlobalVariables.keys(),\n              ...target._globalVariables.keys(),\n            ]),\n          ];\n        },\n        getOwnPropertyDescriptor(target, name) {\n          // called for every property\n          return {\n            enumerable: true,\n            configurable: true,\n            value: target.$(name),\n          };\n        },\n      });\n\n      return p;\n    } catch (e) {\n      // the proxy object is not available in this context. we should warn the\n      // dev but writing to the console feels a bit intrusive.\n      // console.log(\"ES6 Proxy not available - direct manipulation of global variables can't work, use $() instead.\");\n    }\n  }\n\n  public ApplyPatch() {\n    if (this.patch === null) {\n      return throwNullException(\"this.patch\");\n    }\n\n    for (let [namedVarKey, namedVarValue] of this.patch.globals) {\n      this._globalVariables.set(namedVarKey, namedVarValue);\n    }\n\n    if (this._changedVariablesForBatchObs !== null) {\n      for (let name of this.patch.changedVariables) {\n        this._changedVariablesForBatchObs.add(name);\n      }\n    }\n\n    this.patch = null;\n  }\n\n  public SetJsonToken(jToken: Record<string, any>) {\n    this._globalVariables.clear();\n\n    for (let [varValKey, varValValue] of this._defaultGlobalVariables) {\n      let loadedToken = jToken[varValKey];\n      if (typeof loadedToken !== \"undefined\") {\n        let tokenInkObject =\n          JsonSerialisation.JTokenToRuntimeObject(loadedToken);\n        if (tokenInkObject === null) {\n          return throwNullException(\"tokenInkObject\");\n        }\n        this._globalVariables.set(varValKey, tokenInkObject);\n      } else {\n        this._globalVariables.set(varValKey, varValValue);\n      }\n    }\n  }\n\n  public static dontSaveDefaultValues: boolean = true;\n\n  public WriteJson(writer: SimpleJson.Writer) {\n    writer.WriteObjectStart();\n    for (let [keyValKey, keyValValue] of this._globalVariables) {\n      let name = keyValKey;\n      let val = keyValValue;\n\n      if (VariablesState.dontSaveDefaultValues) {\n        if (this._defaultGlobalVariables.has(name)) {\n          let defaultVal = this._defaultGlobalVariables.get(name)!;\n          if (this.RuntimeObjectsEqual(val, defaultVal)) continue;\n        }\n      }\n\n      writer.WritePropertyStart(name);\n      JsonSerialisation.WriteRuntimeObject(writer, val);\n      writer.WritePropertyEnd();\n    }\n    writer.WriteObjectEnd();\n  }\n\n  public RuntimeObjectsEqual(\n    obj1: InkObject | null,\n    obj2: InkObject | null\n  ): boolean {\n    if (obj1 === null) {\n      return throwNullException(\"obj1\");\n    }\n    if (obj2 === null) {\n      return throwNullException(\"obj2\");\n    }\n\n    if (obj1.constructor !== obj2.constructor) return false;\n\n    let boolVal = asOrNull(obj1, BoolValue);\n    if (boolVal !== null) {\n      return boolVal.value === asOrThrows(obj2, BoolValue).value;\n    }\n\n    let intVal = asOrNull(obj1, IntValue);\n    if (intVal !== null) {\n      return intVal.value === asOrThrows(obj2, IntValue).value;\n    }\n\n    let floatVal = asOrNull(obj1, FloatValue);\n    if (floatVal !== null) {\n      return floatVal.value === asOrThrows(obj2, FloatValue).value;\n    }\n\n    let val1 = asOrNull(obj1, Value);\n    let val2 = asOrNull(obj2, Value);\n    if (val1 !== null && val2 !== null) {\n      if (isEquatable(val1.valueObject) && isEquatable(val2.valueObject)) {\n        return val1.valueObject.Equals(val2.valueObject);\n      } else {\n        return val1.valueObject === val2.valueObject;\n      }\n    }\n\n    throw new Error(\n      \"FastRoughDefinitelyEquals: Unsupported runtime object type: \" +\n        obj1.constructor.name\n    );\n  }\n\n  public GetVariableWithName(\n    name: string | null,\n    contextIndex: number = -1\n  ): InkObject | null {\n    let varValue = this.GetRawVariableWithName(name, contextIndex);\n\n    // var varPointer = varValue as VariablePointerValue;\n    let varPointer = asOrNull(varValue, VariablePointerValue);\n    if (varPointer !== null) {\n      varValue = this.ValueAtVariablePointer(varPointer);\n    }\n\n    return varValue;\n  }\n\n  public TryGetDefaultVariableValue(name: string | null): InkObject | null {\n    let val = tryGetValueFromMap(this._defaultGlobalVariables, name, null);\n    return val.exists ? val.result : null;\n  }\n\n  public GlobalVariableExistsWithName(name: string) {\n    return (\n      this._globalVariables.has(name) ||\n      (this._defaultGlobalVariables !== null &&\n        this._defaultGlobalVariables.has(name))\n    );\n  }\n\n  public GetRawVariableWithName(name: string | null, contextIndex: number) {\n    let varValue: InkObject | null = null;\n\n    if (contextIndex == 0 || contextIndex == -1) {\n      let variableValue = null;\n      if (this.patch !== null) {\n        variableValue = this.patch.TryGetGlobal(name, null);\n        if (variableValue.exists) return variableValue.result!;\n      }\n\n      // this is a conditional assignment\n      variableValue = tryGetValueFromMap(this._globalVariables, name, null);\n      if (variableValue.exists) return variableValue.result;\n\n      if (this._defaultGlobalVariables !== null) {\n        variableValue = tryGetValueFromMap(\n          this._defaultGlobalVariables,\n          name,\n          null\n        );\n        if (variableValue.exists) return variableValue.result;\n      }\n\n      if (this._listDefsOrigin === null)\n        return throwNullException(\"VariablesState._listDefsOrigin\");\n      let listItemValue = this._listDefsOrigin.FindSingleItemListWithName(name);\n      if (listItemValue) return listItemValue;\n    }\n\n    varValue = this._callStack.GetTemporaryVariableWithName(name, contextIndex);\n\n    return varValue;\n  }\n\n  public ValueAtVariablePointer(pointer: VariablePointerValue) {\n    return this.GetVariableWithName(pointer.variableName, pointer.contextIndex);\n  }\n\n  public Assign(varAss: VariableAssignment, value: InkObject) {\n    let name = varAss.variableName;\n    if (name === null) {\n      return throwNullException(\"name\");\n    }\n    let contextIndex = -1;\n\n    let setGlobal = false;\n    if (varAss.isNewDeclaration) {\n      setGlobal = varAss.isGlobal;\n    } else {\n      setGlobal = this.GlobalVariableExistsWithName(name);\n    }\n\n    if (varAss.isNewDeclaration) {\n      // var varPointer = value as VariablePointerValue;\n      let varPointer = asOrNull(value, VariablePointerValue);\n      if (varPointer !== null) {\n        let fullyResolvedVariablePointer =\n          this.ResolveVariablePointer(varPointer);\n        value = fullyResolvedVariablePointer;\n      }\n    } else {\n      let existingPointer = null;\n      do {\n        // existingPointer = GetRawVariableWithName (name, contextIndex) as VariablePointerValue;\n        existingPointer = asOrNull(\n          this.GetRawVariableWithName(name, contextIndex),\n          VariablePointerValue\n        );\n        if (existingPointer != null) {\n          name = existingPointer.variableName;\n          contextIndex = existingPointer.contextIndex;\n          setGlobal = contextIndex == 0;\n        }\n      } while (existingPointer != null);\n    }\n\n    if (setGlobal) {\n      this.SetGlobal(name, value);\n    } else {\n      this._callStack.SetTemporaryVariable(\n        name,\n        value,\n        varAss.isNewDeclaration,\n        contextIndex\n      );\n    }\n  }\n\n  public SnapshotDefaultGlobals() {\n    this._defaultGlobalVariables = new Map(this._globalVariables);\n  }\n\n  public RetainListOriginsForAssignment(\n    oldValue: InkObject,\n    newValue: InkObject\n  ) {\n    let oldList = asOrThrows(oldValue, ListValue);\n    let newList = asOrThrows(newValue, ListValue);\n\n    if (oldList.value && newList.value && newList.value.Count == 0) {\n      newList.value.SetInitialOriginNames(oldList.value.originNames);\n    }\n  }\n\n  public SetGlobal(variableName: string | null, value: InkObject) {\n    let oldValue = null;\n\n    if (this.patch === null) {\n      oldValue = tryGetValueFromMap(this._globalVariables, variableName, null);\n    }\n\n    if (this.patch !== null) {\n      oldValue = this.patch.TryGetGlobal(variableName, null);\n      if (!oldValue.exists) {\n        oldValue = tryGetValueFromMap(\n          this._globalVariables,\n          variableName,\n          null\n        );\n      }\n    }\n\n    ListValue.RetainListOriginsForAssignment(oldValue!.result!, value);\n\n    if (variableName === null) {\n      return throwNullException(\"variableName\");\n    }\n\n    if (this.patch !== null) {\n      this.patch.SetGlobal(variableName, value);\n    } else {\n      this._globalVariables.set(variableName, value);\n    }\n\n    // TODO: Not sure !== is equivalent to !value.Equals(oldValue)\n    if (\n      this.variableChangedEvent !== null &&\n      oldValue !== null &&\n      value !== oldValue.result\n    ) {\n      if (this._batchObservingVariableChanges) {\n        if (this._changedVariablesForBatchObs === null) {\n          return throwNullException(\"this._changedVariablesForBatchObs\");\n        }\n\n        if (this.patch !== null) {\n          this.patch.AddChangedVariable(variableName);\n        } else if (this._changedVariablesForBatchObs !== null) {\n          this._changedVariablesForBatchObs.add(variableName);\n        }\n      } else {\n        this.variableChangedEvent(variableName, value);\n      }\n    }\n  }\n\n  public ResolveVariablePointer(varPointer: VariablePointerValue) {\n    let contextIndex = varPointer.contextIndex;\n\n    if (contextIndex == -1)\n      contextIndex = this.GetContextIndexOfVariableNamed(\n        varPointer.variableName\n      );\n\n    let valueOfVariablePointedTo = this.GetRawVariableWithName(\n      varPointer.variableName,\n      contextIndex\n    );\n\n    // var doubleRedirectionPointer = valueOfVariablePointedTo as VariablePointerValue;\n    let doubleRedirectionPointer = asOrNull(\n      valueOfVariablePointedTo,\n      VariablePointerValue\n    );\n    if (doubleRedirectionPointer != null) {\n      return doubleRedirectionPointer;\n    } else {\n      return new VariablePointerValue(varPointer.variableName, contextIndex);\n    }\n  }\n\n  public GetContextIndexOfVariableNamed(varName: string) {\n    if (this.GlobalVariableExistsWithName(varName)) return 0;\n\n    return this._callStack.currentElementIndex;\n  }\n\n  /**\n   * This function is specific to the js version of ink. It allows to register a\n   * callback that will be called when a variable changes. The original code uses\n   * `state.variableChangedEvent += callback` instead.\n   *\n   * @param {function} callback\n   */\n  public ObserveVariableChange(\n    callback: (variableName: string, newValue: InkObject) => void\n  ) {\n    this.variableChangedEventCallbacks.push(callback);\n  }\n\n  private _globalVariables: Map<string, InkObject>;\n  private _defaultGlobalVariables: Map<string, InkObject> = new Map();\n\n  private _callStack: CallStack;\n  private _changedVariablesForBatchObs: Set<string> | null = new Set();\n  private _listDefsOrigin: ListDefinitionsOrigin | null;\n\n  private _batchObservingVariableChanges: boolean = false;\n}\n","// Taken from https://gist.github.com/blixt/f17b47c62508be59987b\n// Ink uses a seedable PRNG of which there is none in native javascript.\nexport class PRNG {\n  private seed: number;\n\n  constructor(seed: number) {\n    this.seed = seed % 2147483647;\n    if (this.seed <= 0) this.seed += 2147483646;\n  }\n  public next(): number {\n    return (this.seed = (this.seed * 48271) % 2147483647);\n  }\n  public nextFloat(): number {\n    return (this.next() - 1) / 2147483646;\n  }\n}\n","import { InkObject } from \"./Object\";\nimport { Container } from \"./Container\";\n\nexport class StatePatch {\n  get globals() {\n    return this._globals;\n  }\n  get changedVariables() {\n    return this._changedVariables;\n  }\n  get visitCounts() {\n    return this._visitCounts;\n  }\n  get turnIndices() {\n    return this._turnIndices;\n  }\n\n  constructor();\n  constructor(toCopy: StatePatch | null);\n  constructor() {\n    if (arguments.length === 1 && arguments[0] !== null) {\n      let toCopy = arguments[0] as StatePatch;\n      this._globals = new Map(toCopy._globals);\n      this._changedVariables = new Set(toCopy._changedVariables);\n      this._visitCounts = new Map(toCopy._visitCounts);\n      this._turnIndices = new Map(toCopy._turnIndices);\n    } else {\n      this._globals = new Map();\n      this._changedVariables = new Set();\n      this._visitCounts = new Map();\n      this._turnIndices = new Map();\n    }\n  }\n\n  public TryGetGlobal(name: string | null, /* out */ value: InkObject | null) {\n    if (name !== null && this._globals.has(name)) {\n      return { result: this._globals.get(name), exists: true };\n    }\n\n    return { result: value, exists: false };\n  }\n\n  public SetGlobal(name: string, value: InkObject) {\n    this._globals.set(name, value);\n  }\n\n  public AddChangedVariable(name: string) {\n    return this._changedVariables.add(name);\n  }\n\n  public TryGetVisitCount(container: Container, /* out */ count: number) {\n    if (this._visitCounts.has(container)) {\n      return { result: this._visitCounts.get(container), exists: true };\n    }\n\n    return { result: count, exists: false };\n  }\n\n  public SetVisitCount(container: Container, count: number) {\n    this._visitCounts.set(container, count);\n  }\n\n  public SetTurnIndex(container: Container, index: number) {\n    this._turnIndices.set(container, index);\n  }\n\n  public TryGetTurnIndex(container: Container, /* out */ index: number) {\n    if (this._turnIndices.has(container)) {\n      return { result: this._turnIndices.get(container), exists: true };\n    }\n\n    return { result: index, exists: false };\n  }\n\n  private _globals: Map<string, InkObject>;\n  private _changedVariables: Set<string> = new Set();\n  private _visitCounts: Map<Container, number> = new Map();\n  private _turnIndices: Map<Container, number> = new Map();\n}\n","export class SimpleJson {\n  public static TextToDictionary(text: string) {\n    return new SimpleJson.Reader(text).ToDictionary();\n  }\n\n  public static TextToArray(text: string) {\n    return new SimpleJson.Reader(text).ToArray();\n  }\n}\n\nexport namespace SimpleJson {\n  export class Reader {\n    constructor(text: string) {\n      // Before parsing the JSON, all floats of the form \"123.0\" are transformed into \"123.0f\"\n      // so that they are recognized as FLOAT in the ink runtime\n      const nativeFloatParsing = JSON.parse(\n        \"0\",\n        // @ts-expect-error : typing\n        (_, __, context) => context != null\n      );\n\n      if (!nativeFloatParsing) {\n        // When the nativeFloatParsing argument is false,\n        // we aggressively replace using a regexp\n        // At time of writing : only happen for Safari iOS and Mac\n        const jsonWithExplicitFloat = text.replace(\n          /(,\\s*)([0-9]+\\.[0]+)([,]*)/g,\n          '$1\"$2f\"$3'\n        );\n        this._rootObject = JSON.parse(jsonWithExplicitFloat);\n      } else {\n        // @ts-expect-error : typing\n        const explicitFloatReviver = (_, value, context) => {\n          // When the nativeFloatParsing argument is true,\n          // we use a custom reviver function\n          //see https://github.com/y-lohse/inkjs/pull/1100#issuecomment-2733148441\n          if (Number.isInteger(value) && context.source.endsWith(\".0\")) {\n            return context.source + \"f\";\n          }\n          return value;\n        };\n        // @ts-expect-error : typing\n        this._rootObject = JSON.parse(text, explicitFloatReviver);\n      }\n    }\n\n    public ToDictionary() {\n      return this._rootObject as Record<string, any>;\n    }\n\n    public ToArray() {\n      return this._rootObject as any[];\n    }\n\n    private _rootObject: any[] | Record<string, any>;\n  }\n\n  // In C#, this class writes json tokens directly to a StringWriter or\n  // another stream. Here, a temporary hierarchy is created in the form\n  // of a javascript object, which is serialised in the `toString` method.\n  // See individual methods and properties for more information.\n  export class Writer {\n    public WriteObject(inner: (w: Writer) => void) {\n      this.WriteObjectStart();\n      inner(this);\n      this.WriteObjectEnd();\n    }\n\n    // Add a new object.\n    public WriteObjectStart() {\n      this.StartNewObject(true);\n\n      let newObject: Record<string, any> = {};\n\n      if (this.state === SimpleJson.Writer.State.Property) {\n        // This object is created as the value of a property,\n        // inside an other object.\n        this.Assert(this.currentCollection !== null);\n        this.Assert(this.currentPropertyName !== null);\n\n        let propertyName = this._propertyNameStack.pop();\n        this.currentCollection![propertyName!] = newObject;\n        this._collectionStack.push(newObject);\n      } else if (this.state === SimpleJson.Writer.State.Array) {\n        // This object is created as the child of an array.\n        this.Assert(this.currentCollection !== null);\n\n        this.currentCollection!.push(newObject);\n        this._collectionStack.push(newObject);\n      } else {\n        // This object is the root object.\n        this.Assert(this.state === SimpleJson.Writer.State.None);\n        this._jsonObject = newObject;\n        this._collectionStack.push(newObject);\n      }\n\n      this._stateStack.push(\n        new SimpleJson.Writer.StateElement(SimpleJson.Writer.State.Object)\n      );\n    }\n\n    public WriteObjectEnd() {\n      this.Assert(this.state === SimpleJson.Writer.State.Object);\n      this._collectionStack.pop();\n      this._stateStack.pop();\n    }\n\n    // Write a property name / value pair to the current object.\n    public WriteProperty(\n      name: any,\n      // eslint-disable-next-line @typescript-eslint/no-unused-vars\n      innerOrContent: ((w: Writer) => void) | string | boolean | null\n    ) {\n      this.WritePropertyStart(name);\n      if (arguments[1] instanceof Function) {\n        let inner = arguments[1];\n        inner(this);\n      } else {\n        let content: string | boolean | null = arguments[1];\n        this.Write(content);\n      }\n      this.WritePropertyEnd();\n    }\n\n    // Int and Float are separate calls, since there both are\n    // numbers in JavaScript, but need to be handled differently.\n\n    public WriteIntProperty(name: any, content: number) {\n      this.WritePropertyStart(name);\n      this.WriteInt(content);\n      this.WritePropertyEnd();\n    }\n\n    public WriteFloatProperty(name: any, content: number) {\n      this.WritePropertyStart(name);\n      this.WriteFloat(content);\n      this.WritePropertyEnd();\n    }\n\n    // Prepare a new property name, which will be use to add the\n    // new object when calling _addToCurrentObject() from a Write\n    // method.\n    public WritePropertyStart(name: any) {\n      this.Assert(this.state === SimpleJson.Writer.State.Object);\n      this._propertyNameStack.push(name);\n\n      this.IncrementChildCount();\n\n      this._stateStack.push(\n        new SimpleJson.Writer.StateElement(SimpleJson.Writer.State.Property)\n      );\n    }\n\n    public WritePropertyEnd() {\n      this.Assert(this.state === SimpleJson.Writer.State.Property);\n      this.Assert(this.childCount === 1);\n      this._stateStack.pop();\n    }\n\n    // Prepare a new property name, except this time, the property name\n    // will be created by concatenating all the strings passed to\n    // WritePropertyNameInner.\n    public WritePropertyNameStart() {\n      this.Assert(this.state === SimpleJson.Writer.State.Object);\n      this.IncrementChildCount();\n\n      this._currentPropertyName = \"\";\n\n      this._stateStack.push(\n        new SimpleJson.Writer.StateElement(SimpleJson.Writer.State.Property)\n      );\n      this._stateStack.push(\n        new SimpleJson.Writer.StateElement(SimpleJson.Writer.State.PropertyName)\n      );\n    }\n\n    public WritePropertyNameEnd() {\n      this.Assert(this.state === SimpleJson.Writer.State.PropertyName);\n      this.Assert(this._currentPropertyName !== null);\n      this._propertyNameStack.push(this._currentPropertyName!);\n      this._currentPropertyName = null;\n      this._stateStack.pop();\n    }\n\n    public WritePropertyNameInner(str: string) {\n      this.Assert(this.state === SimpleJson.Writer.State.PropertyName);\n      this.Assert(this._currentPropertyName !== null);\n      this._currentPropertyName += str;\n    }\n\n    // Add a new array.\n    public WriteArrayStart() {\n      this.StartNewObject(true);\n\n      let newObject: any[] = [];\n\n      if (this.state === SimpleJson.Writer.State.Property) {\n        // This array is created as the value of a property,\n        // inside an object.\n        this.Assert(this.currentCollection !== null);\n        this.Assert(this.currentPropertyName !== null);\n\n        let propertyName = this._propertyNameStack.pop();\n        this.currentCollection![propertyName!] = newObject;\n        this._collectionStack.push(newObject);\n      } else if (this.state === SimpleJson.Writer.State.Array) {\n        // This array is created as the child of another array.\n        this.Assert(this.currentCollection !== null);\n\n        this.currentCollection!.push(newObject);\n        this._collectionStack.push(newObject);\n      } else {\n        // This array is the root object.\n        this.Assert(this.state === SimpleJson.Writer.State.None);\n        this._jsonObject = newObject;\n        this._collectionStack.push(newObject);\n      }\n\n      this._stateStack.push(\n        new SimpleJson.Writer.StateElement(SimpleJson.Writer.State.Array)\n      );\n    }\n\n    public WriteArrayEnd() {\n      this.Assert(this.state === SimpleJson.Writer.State.Array);\n      this._collectionStack.pop();\n      this._stateStack.pop();\n    }\n\n    // Add the value to the appropriate collection (array / object), given the current\n    // context.\n    public Write(\n      value: number | string | boolean | null,\n      // eslint-disable-next-line @typescript-eslint/no-unused-vars\n      escape: boolean = true\n    ) {\n      if (value === null) {\n        console.error(\"Warning: trying to write a null value\");\n        return;\n      }\n\n      this.StartNewObject(false);\n      this._addToCurrentObject(value);\n    }\n\n    public WriteBool(value: boolean | null) {\n      if (value === null) {\n        return;\n      }\n\n      this.StartNewObject(false);\n      this._addToCurrentObject(value);\n    }\n\n    public WriteInt(value: number | null) {\n      if (value === null) {\n        return;\n      }\n\n      this.StartNewObject(false);\n\n      // Math.floor is used as a precaution:\n      //     1. to ensure that the value is written as an integer\n      //        (without a fractional part -> 1 instead of 1.0), even\n      //        though it should be the default behaviour of\n      //        JSON.serialize;\n      //     2. to ensure that if a floating number is passed\n      //        accidentally, it's converted to an integer.\n      //\n      // This guarantees savegame compatibility with the reference\n      // implementation.\n      this._addToCurrentObject(Math.floor(value));\n    }\n\n    // Since JSON doesn't support NaN and Infinity, these values\n    // are converted here.\n    public WriteFloat(value: number | null) {\n      if (value === null) {\n        return;\n      }\n\n      this.StartNewObject(false);\n      if (value == Number.POSITIVE_INFINITY) {\n        this._addToCurrentObject(3.4e38);\n      } else if (value == Number.NEGATIVE_INFINITY) {\n        this._addToCurrentObject(-3.4e38);\n      } else if (isNaN(value)) {\n        this._addToCurrentObject(0.0);\n      } else {\n        this._addToCurrentObject(value);\n      }\n    }\n\n    public WriteNull() {\n      this.StartNewObject(false);\n      this._addToCurrentObject(null);\n    }\n\n    // Prepare a string before adding it to the current collection in\n    // WriteStringEnd(). The string will be a concatenation of all the\n    // strings passed to WriteStringInner.\n    public WriteStringStart() {\n      this.StartNewObject(false);\n      this._currentString = \"\";\n      this._stateStack.push(\n        new SimpleJson.Writer.StateElement(SimpleJson.Writer.State.String)\n      );\n    }\n\n    public WriteStringEnd() {\n      this.Assert(this.state == SimpleJson.Writer.State.String);\n      this._stateStack.pop();\n      this._addToCurrentObject(this._currentString);\n      this._currentString = null;\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    public WriteStringInner(str: string | null, escape: boolean = true) {\n      this.Assert(this.state === SimpleJson.Writer.State.String);\n\n      if (str === null) {\n        console.error(\"Warning: trying to write a null string\");\n        return;\n      }\n\n      this._currentString += str;\n    }\n\n    // Serialise the root object into a JSON string.\n    public toString() {\n      if (this._jsonObject === null) {\n        return \"\";\n      }\n\n      return JSON.stringify(this._jsonObject);\n    }\n\n    // Prepare the state stack when adding new objects / values.\n    private StartNewObject(container: boolean) {\n      if (container) {\n        this.Assert(\n          this.state === SimpleJson.Writer.State.None ||\n            this.state === SimpleJson.Writer.State.Property ||\n            this.state === SimpleJson.Writer.State.Array\n        );\n      } else {\n        this.Assert(\n          this.state === SimpleJson.Writer.State.Property ||\n            this.state === SimpleJson.Writer.State.Array\n        );\n      }\n\n      if (this.state === SimpleJson.Writer.State.Property) {\n        this.Assert(this.childCount === 0);\n      }\n\n      if (\n        this.state === SimpleJson.Writer.State.Array ||\n        this.state === SimpleJson.Writer.State.Property\n      ) {\n        this.IncrementChildCount();\n      }\n    }\n\n    // These getters peek all the different stacks.\n\n    private get state() {\n      if (this._stateStack.length > 0) {\n        return this._stateStack[this._stateStack.length - 1].type;\n      } else {\n        return SimpleJson.Writer.State.None;\n      }\n    }\n\n    private get childCount() {\n      if (this._stateStack.length > 0) {\n        return this._stateStack[this._stateStack.length - 1].childCount;\n      } else {\n        return 0;\n      }\n    }\n\n    private get currentCollection(): Record<string, any> | null {\n      if (this._collectionStack.length > 0) {\n        return this._collectionStack[this._collectionStack.length - 1];\n      } else {\n        return null;\n      }\n    }\n\n    private get currentPropertyName() {\n      if (this._propertyNameStack.length > 0) {\n        return this._propertyNameStack[this._propertyNameStack.length - 1];\n      } else {\n        return null;\n      }\n    }\n\n    private IncrementChildCount() {\n      this.Assert(this._stateStack.length > 0);\n      let currEl = this._stateStack.pop()!;\n      currEl.childCount++;\n      this._stateStack.push(currEl);\n    }\n\n    private Assert(condition: boolean) {\n      if (!condition) throw Error(\"Assert failed while writing JSON\");\n    }\n\n    // This method did not exist in the original C# code. It adds\n    // the given value to the current collection (used by Write methods).\n    private _addToCurrentObject(value: number | string | boolean | null) {\n      this.Assert(this.currentCollection !== null);\n      if (this.state === SimpleJson.Writer.State.Array) {\n        this.Assert(Array.isArray(this.currentCollection));\n        (this.currentCollection as any[]).push(value);\n      } else if (this.state === SimpleJson.Writer.State.Property) {\n        this.Assert(!Array.isArray(this.currentCollection));\n        this.Assert(this.currentPropertyName !== null);\n        (this.currentCollection as Record<string, any>)[\n          this.currentPropertyName!\n        ] = value;\n        this._propertyNameStack.pop();\n      }\n    }\n\n    // In addition to `_stateStack` present in the original code,\n    // this implementation of SimpleJson use two other stacks and two\n    // temporary variables holding the current context.\n\n    // Used to keep track of the current property name being built\n    // with `WritePropertyNameStart`, `WritePropertyNameInner` and\n    // `WritePropertyNameEnd`.\n    private _currentPropertyName: string | null = null;\n\n    // Used to keep track of the current string value being built\n    // with `WriteStringStart`, `WriteStringInner` and\n    // `WriteStringEnd`.\n    private _currentString: string | null = null;\n\n    private _stateStack: SimpleJson.Writer.StateElement[] = [];\n\n    // Keep track of the current collection being built (either an array\n    // or an object). For instance, at the '?' step during the hiarchy\n    // creation, this hierarchy:\n    // [3, {a: [b, ?]}] will have this corresponding stack:\n    // (bottom) [Array, Object, Array] (top)\n    private _collectionStack: Array<any[] | Record<string, any>> = [];\n\n    // Keep track of the current property being assigned. For instance, at\n    // the '?' step during the hiarchy creation, this hierarchy:\n    // [3, {a: [b, {c: ?}]}] will have this corresponding stack:\n    // (bottom) [a, c] (top)\n    private _propertyNameStack: string[] = [];\n\n    // Object containing the entire hiearchy.\n    private _jsonObject: Record<string, any> | any[] | null = null;\n  }\n\n  export namespace Writer {\n    export enum State {\n      None,\n      Object,\n      Array,\n      Property,\n      PropertyName,\n      String,\n    }\n\n    export class StateElement {\n      public type: SimpleJson.Writer.State = SimpleJson.Writer.State.None;\n      public childCount: number = 0;\n\n      constructor(type: SimpleJson.Writer.State) {\n        this.type = type;\n      }\n    }\n  }\n}\n","import { CallStack } from \"./CallStack\";\nimport { Choice } from \"./Choice\";\nimport { JsonSerialisation } from \"./JsonSerialisation\";\nimport { InkObject } from \"./Object\";\nimport { SimpleJson } from \"./SimpleJson\";\nimport { Story } from \"./Story\";\nimport { throwNullException } from \"./NullException\";\n\nexport class Flow {\n  public name: string;\n  public callStack: CallStack;\n  public outputStream: InkObject[];\n  public currentChoices: Choice[];\n\n  constructor(name: String, story: Story);\n  constructor(name: String, story: Story, jObject: Record<string, any>);\n  constructor() {\n    let name = arguments[0] as string;\n    let story = arguments[1] as Story;\n\n    this.name = name;\n    this.callStack = new CallStack(story);\n\n    if (arguments[2]) {\n      let jObject = arguments[2] as Record<string, any>;\n\n      this.callStack.SetJsonToken(jObject[\"callstack\"], story);\n      this.outputStream = JsonSerialisation.JArrayToRuntimeObjList(\n        jObject[\"outputStream\"]\n      );\n      this.currentChoices = JsonSerialisation.JArrayToRuntimeObjList(\n        jObject[\"currentChoices\"]\n      ) as Choice[];\n\n      let jChoiceThreadsObj = jObject[\"choiceThreads\"];\n      if (typeof jChoiceThreadsObj !== \"undefined\") {\n        this.LoadFlowChoiceThreads(jChoiceThreadsObj, story);\n      }\n    } else {\n      this.outputStream = [];\n      this.currentChoices = [];\n    }\n  }\n\n  public WriteJson(writer: SimpleJson.Writer) {\n    writer.WriteObjectStart();\n\n    writer.WriteProperty(\"callstack\", (w) => this.callStack.WriteJson(w));\n    writer.WriteProperty(\"outputStream\", (w) =>\n      JsonSerialisation.WriteListRuntimeObjs(w, this.outputStream)\n    );\n\n    let hasChoiceThreads = false;\n    for (let c of this.currentChoices) {\n      if (c.threadAtGeneration === null)\n        return throwNullException(\"c.threadAtGeneration\");\n\n      c.originalThreadIndex = c.threadAtGeneration.threadIndex;\n\n      if (this.callStack.ThreadWithIndex(c.originalThreadIndex) === null) {\n        if (!hasChoiceThreads) {\n          hasChoiceThreads = true;\n          writer.WritePropertyStart(\"choiceThreads\");\n          writer.WriteObjectStart();\n        }\n\n        writer.WritePropertyStart(c.originalThreadIndex);\n        c.threadAtGeneration.WriteJson(writer);\n        writer.WritePropertyEnd();\n      }\n    }\n\n    if (hasChoiceThreads) {\n      writer.WriteObjectEnd();\n      writer.WritePropertyEnd();\n    }\n\n    writer.WriteProperty(\"currentChoices\", (w) => {\n      w.WriteArrayStart();\n      for (let c of this.currentChoices) {\n        JsonSerialisation.WriteChoice(w, c);\n      }\n      w.WriteArrayEnd();\n    });\n\n    writer.WriteObjectEnd();\n  }\n\n  public LoadFlowChoiceThreads(\n    jChoiceThreads: Record<string, any>,\n    story: Story\n  ) {\n    for (let choice of this.currentChoices) {\n      let foundActiveThread = this.callStack.ThreadWithIndex(\n        choice.originalThreadIndex\n      );\n      if (foundActiveThread !== null) {\n        choice.threadAtGeneration = foundActiveThread.Copy();\n      } else {\n        let jSavedChoiceThread =\n          jChoiceThreads[`${choice.originalThreadIndex}`];\n        choice.threadAtGeneration = new CallStack.Thread(\n          jSavedChoiceThread,\n          story\n        );\n      }\n    }\n  }\n}\n","import { CallStack } from \"./CallStack\";\nimport { VariablesState } from \"./VariablesState\";\nimport { ValueType, Value, StringValue, ListValue } from \"./Value\";\nimport { PushPopType } from \"./PushPop\";\nimport { Tag } from \"./Tag\";\nimport { Glue } from \"./Glue\";\nimport { Path } from \"./Path\";\nimport { ControlCommand } from \"./ControlCommand\";\nimport { StringBuilder } from \"./StringBuilder\";\nimport { JsonSerialisation } from \"./JsonSerialisation\";\nimport { PRNG } from \"./PRNG\";\nimport { Void } from \"./Void\";\nimport { Pointer } from \"./Pointer\";\nimport { tryGetValueFromMap } from \"./TryGetResult\";\nimport { Choice } from \"./Choice\";\nimport { asOrNull, asOrThrows, nullIfUndefined } from \"./TypeAssertion\";\nimport { Debug } from \"./Debug\";\nimport { Container } from \"./Container\";\nimport { InkObject } from \"./Object\";\nimport { throwNullException } from \"./NullException\";\nimport { Story } from \"./Story\";\nimport { StatePatch } from \"./StatePatch\";\nimport { SimpleJson } from \"./SimpleJson\";\nimport { Flow } from \"./Flow\";\nimport { InkList } from \"./InkList\";\n\nexport class StoryState {\n  // Backward compatible changes since v8:\n  // v10: dynamic tags\n  // v9:  multi-flows\n  public readonly kInkSaveStateVersion = 10;\n  public readonly kMinCompatibleLoadVersion = 8;\n\n  public onDidLoadState: (() => void) | null = null;\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  public ToJson(indented: boolean = false) {\n    let writer = new SimpleJson.Writer();\n    this.WriteJson(writer);\n    return writer.toString();\n  }\n  public toJson(indented: boolean = false) {\n    return this.ToJson(indented);\n  }\n\n  public LoadJson(json: string) {\n    let jObject = SimpleJson.TextToDictionary(json);\n    this.LoadJsonObj(jObject);\n    if (this.onDidLoadState !== null) this.onDidLoadState();\n  }\n\n  public VisitCountAtPathString(pathString: string) {\n    let visitCountOut;\n\n    if (this._patch !== null) {\n      let container = this.story.ContentAtPath(new Path(pathString)).container;\n      if (container === null)\n        throw new Error(\"Content at path not found: \" + pathString);\n\n      visitCountOut = this._patch.TryGetVisitCount(container, 0);\n      if (visitCountOut.exists) return visitCountOut.result;\n    }\n\n    visitCountOut = tryGetValueFromMap(this._visitCounts, pathString, null);\n    if (visitCountOut.exists) return visitCountOut.result;\n\n    return 0;\n  }\n\n  public VisitCountForContainer(container: Container | null): number {\n    if (container === null) {\n      return throwNullException(\"container\");\n    }\n    if (!container.visitsShouldBeCounted) {\n      this.story.Error(\n        \"Read count for target (\" +\n          container.name +\n          \" - on \" +\n          container.debugMetadata +\n          \") unknown. The story may need to be compiled with countAllVisits flag (-c).\"\n      );\n      return 0;\n    }\n\n    if (this._patch !== null) {\n      let count = this._patch.TryGetVisitCount(container, 0);\n      if (count.exists) {\n        return count.result!;\n      }\n    }\n\n    let containerPathStr = container.path.toString();\n    let count2 = tryGetValueFromMap(this._visitCounts, containerPathStr, null);\n    if (count2.exists) {\n      return count2.result!;\n    }\n\n    return 0;\n  }\n\n  public IncrementVisitCountForContainer(container: Container) {\n    if (this._patch !== null) {\n      let currCount = this.VisitCountForContainer(container);\n      currCount++;\n      this._patch.SetVisitCount(container, currCount);\n      return;\n    }\n\n    let containerPathStr = container.path.toString();\n    let count = tryGetValueFromMap(this._visitCounts, containerPathStr, null);\n    if (count.exists) {\n      this._visitCounts.set(containerPathStr, count.result! + 1);\n    } else {\n      this._visitCounts.set(containerPathStr, 1);\n    }\n  }\n\n  public RecordTurnIndexVisitToContainer(container: Container) {\n    if (this._patch !== null) {\n      this._patch.SetTurnIndex(container, this.currentTurnIndex);\n      return;\n    }\n\n    let containerPathStr = container.path.toString();\n    this._turnIndices.set(containerPathStr, this.currentTurnIndex);\n  }\n\n  public TurnsSinceForContainer(container: Container) {\n    if (!container.turnIndexShouldBeCounted) {\n      this.story.Error(\n        \"TURNS_SINCE() for target (\" +\n          container.name +\n          \" - on \" +\n          container.debugMetadata +\n          \") unknown. The story may need to be compiled with countAllVisits flag (-c).\"\n      );\n    }\n\n    if (this._patch !== null) {\n      let index = this._patch.TryGetTurnIndex(container, 0);\n      if (index.exists) {\n        return this.currentTurnIndex - index.result!;\n      }\n    }\n\n    let containerPathStr = container.path.toString();\n    let index2 = tryGetValueFromMap(this._turnIndices, containerPathStr, 0);\n    if (index2.exists) {\n      return this.currentTurnIndex - index2.result!;\n    } else {\n      return -1;\n    }\n  }\n\n  get callstackDepth() {\n    return this.callStack.depth;\n  }\n\n  get outputStream() {\n    return this._currentFlow.outputStream;\n  }\n\n  get currentChoices() {\n    // If we can continue generating text content rather than choices,\n    // then we reflect the choice list as being empty, since choices\n    // should always come at the end.\n    if (this.canContinue) return [];\n    return this._currentFlow.currentChoices;\n  }\n\n  get generatedChoices() {\n    return this._currentFlow.currentChoices;\n  }\n\n  get currentErrors() {\n    return this._currentErrors;\n  }\n  private _currentErrors: string[] | null = null;\n\n  get currentWarnings() {\n    return this._currentWarnings;\n  }\n  private _currentWarnings: string[] | null = null;\n\n  get variablesState() {\n    return this._variablesState;\n  }\n  set variablesState(value) {\n    this._variablesState = value;\n  }\n  private _variablesState: VariablesState;\n\n  get callStack() {\n    return this._currentFlow.callStack;\n  }\n\n  get evaluationStack() {\n    return this._evaluationStack;\n  }\n  private _evaluationStack: InkObject[];\n\n  public divertedPointer: Pointer = Pointer.Null;\n\n  get currentTurnIndex() {\n    return this._currentTurnIndex;\n  }\n  set currentTurnIndex(value) {\n    this._currentTurnIndex = value;\n  }\n  private _currentTurnIndex: number = 0;\n\n  public storySeed: number = 0;\n  public previousRandom: number = 0;\n  public didSafeExit: boolean = false;\n\n  public story: Story;\n\n  get currentPathString() {\n    let pointer = this.currentPointer;\n    if (pointer.isNull) {\n      return null;\n    } else {\n      if (pointer.path === null) {\n        return throwNullException(\"pointer.path\");\n      }\n      return pointer.path.toString();\n    }\n  }\n\n  get previousPathString() {\n    let pointer = this.previousPointer;\n    if (pointer.isNull) {\n      return null;\n    } else {\n      if (pointer.path === null) {\n        return throwNullException(\"previousPointer.path\");\n      }\n      return pointer.path.toString();\n    }\n  }\n\n  get currentPointer() {\n    return this.callStack.currentElement.currentPointer.copy();\n  }\n\n  set currentPointer(value) {\n    this.callStack.currentElement.currentPointer = value.copy();\n  }\n\n  get previousPointer() {\n    return this.callStack.currentThread.previousPointer.copy();\n  }\n\n  set previousPointer(value) {\n    this.callStack.currentThread.previousPointer = value.copy();\n  }\n\n  get canContinue() {\n    return !this.currentPointer.isNull && !this.hasError;\n  }\n\n  get hasError() {\n    return this.currentErrors != null && this.currentErrors.length > 0;\n  }\n\n  get hasWarning() {\n    return this.currentWarnings != null && this.currentWarnings.length > 0;\n  }\n\n  get currentText() {\n    if (this._outputStreamTextDirty) {\n      let sb = new StringBuilder();\n\n      let inTag: boolean = false;\n\n      for (let outputObj of this.outputStream) {\n        // var textContent = outputObj as StringValue;\n        let textContent = asOrNull(outputObj, StringValue);\n        if (!inTag && textContent !== null) {\n          sb.Append(textContent.value);\n        } else {\n          let controlCommand = asOrNull(outputObj, ControlCommand);\n          if (controlCommand !== null) {\n            if (\n              controlCommand.commandType == ControlCommand.CommandType.BeginTag\n            ) {\n              inTag = true;\n            } else if (\n              controlCommand.commandType == ControlCommand.CommandType.EndTag\n            ) {\n              inTag = false;\n            }\n          }\n        }\n      }\n\n      this._currentText = this.CleanOutputWhitespace(sb.toString());\n      this._outputStreamTextDirty = false;\n    }\n\n    return this._currentText;\n  }\n  private _currentText: string | null = null;\n\n  public CleanOutputWhitespace(str: string) {\n    let sb = new StringBuilder();\n\n    let currentWhitespaceStart = -1;\n    let startOfLine = 0;\n\n    for (let i = 0; i < str.length; i++) {\n      let c = str.charAt(i);\n\n      let isInlineWhitespace = c == \" \" || c == \"\\t\";\n\n      if (isInlineWhitespace && currentWhitespaceStart == -1)\n        currentWhitespaceStart = i;\n\n      if (!isInlineWhitespace) {\n        if (\n          c != \"\\n\" &&\n          currentWhitespaceStart > 0 &&\n          currentWhitespaceStart != startOfLine\n        ) {\n          sb.Append(\" \");\n        }\n        currentWhitespaceStart = -1;\n      }\n\n      if (c == \"\\n\") startOfLine = i + 1;\n\n      if (!isInlineWhitespace) sb.Append(c);\n    }\n\n    return sb.toString();\n  }\n\n  get currentTags() {\n    if (this._outputStreamTagsDirty) {\n      this._currentTags = [];\n      let inTag: boolean = false;\n      let sb = new StringBuilder();\n\n      for (let outputObj of this.outputStream) {\n        let controlCommand = asOrNull(outputObj, ControlCommand);\n        if (controlCommand != null) {\n          if (\n            controlCommand.commandType == ControlCommand.CommandType.BeginTag\n          ) {\n            if (inTag && sb.Length > 0) {\n              let txt = this.CleanOutputWhitespace(sb.toString());\n              this._currentTags.push(txt);\n              sb.Clear();\n            }\n            inTag = true;\n          } else if (\n            controlCommand.commandType == ControlCommand.CommandType.EndTag\n          ) {\n            if (sb.Length > 0) {\n              let txt = this.CleanOutputWhitespace(sb.toString());\n              this._currentTags.push(txt);\n              sb.Clear();\n            }\n            inTag = false;\n          }\n        } else if (inTag) {\n          let strVal = asOrNull(outputObj, StringValue);\n          if (strVal !== null) {\n            sb.Append(strVal.value);\n          }\n        } else {\n          let tag = asOrNull(outputObj, Tag);\n          if (tag != null && tag.text != null && tag.text.length > 0) {\n            this._currentTags.push(tag.text); // tag.text has whitespae already cleaned\n          }\n        }\n      }\n\n      if (sb.Length > 0) {\n        let txt = this.CleanOutputWhitespace(sb.toString());\n        this._currentTags.push(txt);\n        sb.Clear();\n      }\n\n      this._outputStreamTagsDirty = false;\n    }\n\n    return this._currentTags;\n  }\n  private _currentTags: string[] | null = null;\n\n  get currentFlowName() {\n    return this._currentFlow.name;\n  }\n\n  get currentFlowIsDefaultFlow() {\n    return this._currentFlow.name == this.kDefaultFlowName;\n  }\n\n  get aliveFlowNames() {\n    if (this._aliveFlowNamesDirty) {\n      this._aliveFlowNames = [];\n\n      if (this._namedFlows != null) {\n        for (let flowName of this._namedFlows.keys()) {\n          if (flowName != this.kDefaultFlowName) {\n            this._aliveFlowNames.push(flowName);\n          }\n        }\n      }\n\n      this._aliveFlowNamesDirty = false;\n    }\n\n    return this._aliveFlowNames;\n  }\n\n  get inExpressionEvaluation() {\n    return this.callStack.currentElement.inExpressionEvaluation;\n  }\n  set inExpressionEvaluation(value) {\n    this.callStack.currentElement.inExpressionEvaluation = value;\n  }\n\n  constructor(story: Story) {\n    this.story = story;\n\n    this._currentFlow = new Flow(this.kDefaultFlowName, story);\n    this.OutputStreamDirty();\n\n    this._aliveFlowNamesDirty = true;\n    this._evaluationStack = [];\n\n    this._variablesState = new VariablesState(\n      this.callStack,\n      story.listDefinitions\n    );\n\n    this._visitCounts = new Map();\n    this._turnIndices = new Map();\n    this.currentTurnIndex = -1;\n\n    let timeSeed = new Date().getTime();\n    this.storySeed = new PRNG(timeSeed).next() % 100;\n    this.previousRandom = 0;\n\n    this.GoToStart();\n  }\n\n  public GoToStart() {\n    this.callStack.currentElement.currentPointer = Pointer.StartOf(\n      this.story.mainContentContainer\n    );\n  }\n\n  public SwitchFlow_Internal(flowName: string | null) {\n    if (flowName === null)\n      throw new Error(\"Must pass a non-null string to Story.SwitchFlow\");\n\n    if (this._namedFlows === null) {\n      this._namedFlows = new Map();\n      this._namedFlows.set(this.kDefaultFlowName, this._currentFlow);\n    }\n\n    if (flowName === this._currentFlow.name) {\n      return;\n    }\n\n    let flow: Flow;\n    let content = tryGetValueFromMap(this._namedFlows, flowName, null);\n    if (content.exists) {\n      flow = content.result!;\n    } else {\n      flow = new Flow(flowName, this.story);\n      this._namedFlows.set(flowName, flow);\n      this._aliveFlowNamesDirty = true;\n    }\n\n    this._currentFlow = flow;\n    this.variablesState.callStack = this._currentFlow.callStack;\n\n    this.OutputStreamDirty();\n  }\n\n  public SwitchToDefaultFlow_Internal() {\n    if (this._namedFlows === null) return;\n    this.SwitchFlow_Internal(this.kDefaultFlowName);\n  }\n\n  public RemoveFlow_Internal(flowName: string | null) {\n    if (flowName === null)\n      throw new Error(\"Must pass a non-null string to Story.DestroyFlow\");\n    if (flowName === this.kDefaultFlowName)\n      throw new Error(\"Cannot destroy default flow\");\n\n    if (this._currentFlow.name === flowName) {\n      this.SwitchToDefaultFlow_Internal();\n    }\n\n    if (this._namedFlows === null)\n      return throwNullException(\"this._namedFlows\");\n    this._namedFlows.delete(flowName);\n    this._aliveFlowNamesDirty = true;\n  }\n\n  public CopyAndStartPatching(forBackgroundSave: boolean) {\n    let copy = new StoryState(this.story);\n\n    copy._patch = new StatePatch(this._patch);\n\n    copy._currentFlow.name = this._currentFlow.name;\n    copy._currentFlow.callStack = new CallStack(this._currentFlow.callStack);\n    copy._currentFlow.outputStream.push(...this._currentFlow.outputStream);\n    copy.OutputStreamDirty();\n\n    // When background saving we need to make copies of choices since they each have\n    // a snapshot of the thread at the time of generation since the game could progress\n    // significantly and threads modified during the save process.\n    // However, when doing internal saving and restoring of snapshots this isn't an issue,\n    // and we can simply ref-copy the choices with their existing threads.\n\n    if (forBackgroundSave) {\n      for (let choice of this._currentFlow.currentChoices) {\n        copy._currentFlow.currentChoices.push(choice.Clone());\n      }\n    } else {\n      copy._currentFlow.currentChoices.push(\n        ...this._currentFlow.currentChoices\n      );\n    }\n\n    if (this._namedFlows !== null) {\n      copy._namedFlows = new Map();\n      for (let [namedFlowKey, namedFlowValue] of this._namedFlows) {\n        copy._namedFlows.set(namedFlowKey, namedFlowValue);\n        copy._aliveFlowNamesDirty = true;\n      }\n      copy._namedFlows.set(this._currentFlow.name, copy._currentFlow);\n    }\n\n    if (this.hasError) {\n      copy._currentErrors = [];\n      copy._currentErrors.push(...(this.currentErrors || []));\n    }\n\n    if (this.hasWarning) {\n      copy._currentWarnings = [];\n      copy._currentWarnings.push(...(this.currentWarnings || []));\n    }\n\n    copy.variablesState = this.variablesState;\n    copy.variablesState.callStack = copy.callStack;\n    copy.variablesState.patch = copy._patch;\n\n    copy.evaluationStack.push(...this.evaluationStack);\n\n    if (!this.divertedPointer.isNull)\n      copy.divertedPointer = this.divertedPointer.copy();\n\n    copy.previousPointer = this.previousPointer.copy();\n\n    copy._visitCounts = this._visitCounts;\n    copy._turnIndices = this._turnIndices;\n\n    copy.currentTurnIndex = this.currentTurnIndex;\n    copy.storySeed = this.storySeed;\n    copy.previousRandom = this.previousRandom;\n\n    copy.didSafeExit = this.didSafeExit;\n\n    return copy;\n  }\n\n  public RestoreAfterPatch() {\n    this.variablesState.callStack = this.callStack;\n    this.variablesState.patch = this._patch;\n  }\n\n  public ApplyAnyPatch() {\n    if (this._patch === null) return;\n\n    this.variablesState.ApplyPatch();\n\n    for (let [key, value] of this._patch.visitCounts)\n      this.ApplyCountChanges(key, value, true);\n\n    for (let [key, value] of this._patch.turnIndices)\n      this.ApplyCountChanges(key, value, false);\n\n    this._patch = null;\n  }\n\n  public ApplyCountChanges(\n    container: Container,\n    newCount: number,\n    isVisit: boolean\n  ) {\n    let counts = isVisit ? this._visitCounts : this._turnIndices;\n    counts.set(container.path.toString(), newCount);\n  }\n\n  public WriteJson(writer: SimpleJson.Writer) {\n    writer.WriteObjectStart();\n\n    writer.WritePropertyStart(\"flows\");\n    writer.WriteObjectStart();\n\n    // NOTE: Never pass `WriteJson` directly as an argument to `WriteProperty`.\n    // Call it inside a function to make sure `this` is correctly bound\n    // and passed down the call hierarchy.\n\n    if (this._namedFlows !== null) {\n      for (let [namedFlowKey, namedFlowValue] of this._namedFlows) {\n        writer.WriteProperty(namedFlowKey, (w) => namedFlowValue.WriteJson(w));\n      }\n    } else {\n      writer.WriteProperty(this._currentFlow.name, (w) =>\n        this._currentFlow.WriteJson(w)\n      );\n    }\n\n    writer.WriteObjectEnd();\n    writer.WritePropertyEnd();\n\n    writer.WriteProperty(\"currentFlowName\", this._currentFlow.name);\n\n    writer.WriteProperty(\"variablesState\", (w) =>\n      this.variablesState.WriteJson(w)\n    );\n\n    writer.WriteProperty(\"evalStack\", (w) =>\n      JsonSerialisation.WriteListRuntimeObjs(w, this.evaluationStack)\n    );\n\n    if (!this.divertedPointer.isNull) {\n      if (this.divertedPointer.path === null) {\n        return throwNullException(\"divertedPointer\");\n      }\n      writer.WriteProperty(\n        \"currentDivertTarget\",\n        this.divertedPointer.path.componentsString\n      );\n    }\n\n    writer.WriteProperty(\"visitCounts\", (w) =>\n      JsonSerialisation.WriteIntDictionary(w, this._visitCounts)\n    );\n    writer.WriteProperty(\"turnIndices\", (w) =>\n      JsonSerialisation.WriteIntDictionary(w, this._turnIndices)\n    );\n\n    writer.WriteIntProperty(\"turnIdx\", this.currentTurnIndex);\n    writer.WriteIntProperty(\"storySeed\", this.storySeed);\n    writer.WriteIntProperty(\"previousRandom\", this.previousRandom);\n\n    writer.WriteIntProperty(\"inkSaveVersion\", this.kInkSaveStateVersion);\n\n    writer.WriteIntProperty(\"inkFormatVersion\", Story.inkVersionCurrent);\n\n    writer.WriteObjectEnd();\n  }\n\n  public LoadJsonObj(value: Record<string, any>) {\n    let jObject = value;\n\n    let jSaveVersion = jObject[\"inkSaveVersion\"];\n    if (jSaveVersion == null) {\n      throw new Error(\"ink save format incorrect, can't load.\");\n    } else if (parseInt(jSaveVersion) < this.kMinCompatibleLoadVersion) {\n      throw new Error(\n        \"Ink save format isn't compatible with the current version (saw '\" +\n          jSaveVersion +\n          \"', but minimum is \" +\n          this.kMinCompatibleLoadVersion +\n          \"), so can't load.\"\n      );\n    }\n\n    let flowsObj = jObject[\"flows\"];\n    if (flowsObj != null) {\n      let flowsObjDict = flowsObj as Record<string, any>;\n\n      // Single default flow\n      if (Object.keys(flowsObjDict).length === 1) {\n        this._namedFlows = null;\n      } else if (this._namedFlows === null) {\n        this._namedFlows = new Map();\n      } else {\n        this._namedFlows.clear();\n      }\n\n      let flowsObjDictEntries = Object.entries(flowsObjDict);\n      for (let [namedFlowObjKey, namedFlowObjValue] of flowsObjDictEntries) {\n        let name = namedFlowObjKey;\n        let flowObj = namedFlowObjValue as Record<string, any>;\n\n        let flow = new Flow(name, this.story, flowObj);\n\n        if (Object.keys(flowsObjDict).length === 1) {\n          this._currentFlow = new Flow(name, this.story, flowObj);\n        } else {\n          if (this._namedFlows === null)\n            return throwNullException(\"this._namedFlows\");\n          this._namedFlows.set(name, flow);\n        }\n      }\n\n      if (this._namedFlows != null && this._namedFlows.size > 1) {\n        let currFlowName = jObject[\"currentFlowName\"] as string;\n        // Adding a bang at the end, because we're trusting the save, as\n        // done in upstream.  If the save is corrupted, the execution\n        // is undefined.\n        this._currentFlow = this._namedFlows.get(currFlowName)!;\n      }\n    } else {\n      this._namedFlows = null;\n      this._currentFlow.name = this.kDefaultFlowName;\n      this._currentFlow.callStack.SetJsonToken(\n        jObject[\"callstackThreads\"] as Record<string, any>,\n        this.story\n      );\n      this._currentFlow.outputStream = JsonSerialisation.JArrayToRuntimeObjList(\n        jObject[\"outputStream\"] as any[]\n      );\n      this._currentFlow.currentChoices =\n        JsonSerialisation.JArrayToRuntimeObjList(\n          jObject[\"currentChoices\"] as any[]\n        ) as Choice[];\n\n      let jChoiceThreadsObj = jObject[\"choiceThreads\"];\n      this._currentFlow.LoadFlowChoiceThreads(jChoiceThreadsObj, this.story);\n    }\n\n    this.OutputStreamDirty();\n    this._aliveFlowNamesDirty = true;\n\n    this.variablesState.SetJsonToken(jObject[\"variablesState\"]);\n    this.variablesState.callStack = this._currentFlow.callStack;\n\n    this._evaluationStack = JsonSerialisation.JArrayToRuntimeObjList(\n      jObject[\"evalStack\"]\n    );\n\n    let currentDivertTargetPath = jObject[\"currentDivertTarget\"];\n    if (currentDivertTargetPath != null) {\n      let divertPath = new Path(currentDivertTargetPath.toString());\n      this.divertedPointer = this.story.PointerAtPath(divertPath);\n    }\n\n    this._visitCounts = JsonSerialisation.JObjectToIntDictionary(\n      jObject[\"visitCounts\"]\n    );\n    this._turnIndices = JsonSerialisation.JObjectToIntDictionary(\n      jObject[\"turnIndices\"]\n    );\n    this.currentTurnIndex = parseInt(jObject[\"turnIdx\"]);\n    this.storySeed = parseInt(jObject[\"storySeed\"]);\n    this.previousRandom = parseInt(jObject[\"previousRandom\"]);\n  }\n\n  public ResetErrors() {\n    this._currentErrors = null;\n    this._currentWarnings = null;\n  }\n  public ResetOutput(objs: InkObject[] | null = null) {\n    this.outputStream.length = 0;\n    if (objs !== null) this.outputStream.push(...objs);\n    this.OutputStreamDirty();\n  }\n\n  public PushToOutputStream(obj: InkObject | null) {\n    // var text = obj as StringValue;\n    let text = asOrNull(obj, StringValue);\n    if (text !== null) {\n      let listText = this.TrySplittingHeadTailWhitespace(text);\n      if (listText !== null) {\n        for (let textObj of listText) {\n          this.PushToOutputStreamIndividual(textObj);\n        }\n        this.OutputStreamDirty();\n        return;\n      }\n    }\n\n    this.PushToOutputStreamIndividual(obj);\n    this.OutputStreamDirty();\n  }\n\n  public PopFromOutputStream(count: number) {\n    this.outputStream.splice(this.outputStream.length - count, count);\n    this.OutputStreamDirty();\n  }\n\n  public TrySplittingHeadTailWhitespace(single: StringValue) {\n    let str = single.value;\n    if (str === null) {\n      return throwNullException(\"single.value\");\n    }\n\n    let headFirstNewlineIdx = -1;\n    let headLastNewlineIdx = -1;\n    for (let i = 0; i < str.length; i++) {\n      let c = str[i];\n      if (c == \"\\n\") {\n        if (headFirstNewlineIdx == -1) headFirstNewlineIdx = i;\n        headLastNewlineIdx = i;\n      } else if (c == \" \" || c == \"\\t\") continue;\n      else break;\n    }\n\n    let tailLastNewlineIdx = -1;\n    let tailFirstNewlineIdx = -1;\n    for (let i = str.length - 1; i >= 0; i--) {\n      let c = str[i];\n      if (c == \"\\n\") {\n        if (tailLastNewlineIdx == -1) tailLastNewlineIdx = i;\n        tailFirstNewlineIdx = i;\n      } else if (c == \" \" || c == \"\\t\") continue;\n      else break;\n    }\n\n    // No splitting to be done?\n    if (headFirstNewlineIdx == -1 && tailLastNewlineIdx == -1) return null;\n\n    let listTexts: StringValue[] = [];\n    let innerStrStart = 0;\n    let innerStrEnd = str.length;\n\n    if (headFirstNewlineIdx != -1) {\n      if (headFirstNewlineIdx > 0) {\n        let leadingSpaces = new StringValue(\n          str.substring(0, headFirstNewlineIdx)\n        );\n        listTexts.push(leadingSpaces);\n      }\n      listTexts.push(new StringValue(\"\\n\"));\n      innerStrStart = headLastNewlineIdx + 1;\n    }\n\n    if (tailLastNewlineIdx != -1) {\n      innerStrEnd = tailFirstNewlineIdx;\n    }\n\n    if (innerStrEnd > innerStrStart) {\n      let innerStrText = str.substring(innerStrStart, innerStrEnd);\n      listTexts.push(new StringValue(innerStrText));\n    }\n\n    if (tailLastNewlineIdx != -1 && tailFirstNewlineIdx > headLastNewlineIdx) {\n      listTexts.push(new StringValue(\"\\n\"));\n      if (tailLastNewlineIdx < str.length - 1) {\n        let numSpaces = str.length - tailLastNewlineIdx - 1;\n        let trailingSpaces = new StringValue(\n          str.substring(\n            tailLastNewlineIdx + 1,\n            tailLastNewlineIdx + 1 + numSpaces\n          )\n        );\n        listTexts.push(trailingSpaces);\n      }\n    }\n\n    return listTexts;\n  }\n\n  public PushToOutputStreamIndividual(obj: InkObject | null) {\n    let glue = asOrNull(obj, Glue);\n    let text = asOrNull(obj, StringValue);\n\n    let includeInOutput = true;\n\n    if (glue) {\n      this.TrimNewlinesFromOutputStream();\n      includeInOutput = true;\n    } else if (text) {\n      let functionTrimIndex = -1;\n      let currEl = this.callStack.currentElement;\n      if (currEl.type == PushPopType.Function) {\n        functionTrimIndex = currEl.functionStartInOutputStream;\n      }\n\n      let glueTrimIndex = -1;\n      for (let i = this.outputStream.length - 1; i >= 0; i--) {\n        let o = this.outputStream[i];\n        let c = o instanceof ControlCommand ? o : null;\n        let g = o instanceof Glue ? o : null;\n\n        if (g != null) {\n          glueTrimIndex = i;\n          break;\n        } else if (\n          c != null &&\n          c.commandType == ControlCommand.CommandType.BeginString\n        ) {\n          if (i >= functionTrimIndex) {\n            functionTrimIndex = -1;\n          }\n          break;\n        }\n      }\n\n      let trimIndex = -1;\n      if (glueTrimIndex != -1 && functionTrimIndex != -1)\n        trimIndex = Math.min(functionTrimIndex, glueTrimIndex);\n      else if (glueTrimIndex != -1) trimIndex = glueTrimIndex;\n      else trimIndex = functionTrimIndex;\n\n      if (trimIndex != -1) {\n        if (text.isNewline) {\n          includeInOutput = false;\n        } else if (text.isNonWhitespace) {\n          if (glueTrimIndex > -1) this.RemoveExistingGlue();\n\n          if (functionTrimIndex > -1) {\n            let callStackElements = this.callStack.elements;\n            for (let i = callStackElements.length - 1; i >= 0; i--) {\n              let el = callStackElements[i];\n              if (el.type == PushPopType.Function) {\n                el.functionStartInOutputStream = -1;\n              } else {\n                break;\n              }\n            }\n          }\n        }\n      } else if (text.isNewline) {\n        if (this.outputStreamEndsInNewline || !this.outputStreamContainsContent)\n          includeInOutput = false;\n      }\n    }\n\n    if (includeInOutput) {\n      if (obj === null) {\n        return throwNullException(\"obj\");\n      }\n      this.outputStream.push(obj);\n      this.OutputStreamDirty();\n    }\n  }\n\n  public TrimNewlinesFromOutputStream() {\n    let removeWhitespaceFrom = -1;\n\n    let i = this.outputStream.length - 1;\n    while (i >= 0) {\n      let obj = this.outputStream[i];\n      let cmd = asOrNull(obj, ControlCommand);\n      let txt = asOrNull(obj, StringValue);\n\n      if (cmd != null || (txt != null && txt.isNonWhitespace)) {\n        break;\n      } else if (txt != null && txt.isNewline) {\n        removeWhitespaceFrom = i;\n      }\n      i--;\n    }\n\n    // Remove the whitespace\n    if (removeWhitespaceFrom >= 0) {\n      i = removeWhitespaceFrom;\n      while (i < this.outputStream.length) {\n        let text = asOrNull(this.outputStream[i], StringValue);\n        if (text) {\n          this.outputStream.splice(i, 1);\n        } else {\n          i++;\n        }\n      }\n    }\n\n    this.OutputStreamDirty();\n  }\n\n  public RemoveExistingGlue() {\n    for (let i = this.outputStream.length - 1; i >= 0; i--) {\n      let c = this.outputStream[i];\n      if (c instanceof Glue) {\n        this.outputStream.splice(i, 1);\n      } else if (c instanceof ControlCommand) {\n        break;\n      }\n    }\n\n    this.OutputStreamDirty();\n  }\n\n  get outputStreamEndsInNewline() {\n    if (this.outputStream.length > 0) {\n      for (let i = this.outputStream.length - 1; i >= 0; i--) {\n        let obj = this.outputStream[i];\n        if (obj instanceof ControlCommand) break;\n        let text = this.outputStream[i];\n        if (text instanceof StringValue) {\n          if (text.isNewline) return true;\n          else if (text.isNonWhitespace) break;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  get outputStreamContainsContent() {\n    for (let content of this.outputStream) {\n      if (content instanceof StringValue) return true;\n    }\n    return false;\n  }\n\n  get inStringEvaluation() {\n    for (let i = this.outputStream.length - 1; i >= 0; i--) {\n      let cmd = asOrNull(this.outputStream[i], ControlCommand);\n      if (\n        cmd instanceof ControlCommand &&\n        cmd.commandType == ControlCommand.CommandType.BeginString\n      ) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  public PushEvaluationStack(obj: InkObject | null) {\n    // var listValue = obj as ListValue;\n    let listValue = asOrNull(obj, ListValue);\n    if (listValue) {\n      // Update origin when list is has something to indicate the list origin\n      let rawList = listValue.value;\n      if (rawList === null) {\n        return throwNullException(\"rawList\");\n      }\n\n      if (rawList.originNames != null) {\n        if (!rawList.origins) rawList.origins = [];\n        rawList.origins.length = 0;\n\n        for (let n of rawList.originNames) {\n          if (this.story.listDefinitions === null)\n            return throwNullException(\"StoryState.story.listDefinitions\");\n          let def = this.story.listDefinitions.TryListGetDefinition(n, null);\n          if (def.result === null)\n            return throwNullException(\"StoryState def.result\");\n          if (rawList.origins.indexOf(def.result) < 0)\n            rawList.origins.push(def.result);\n        }\n      }\n    }\n\n    if (obj === null) {\n      return throwNullException(\"obj\");\n    }\n    this.evaluationStack.push(obj);\n  }\n\n  public PopEvaluationStack(): InkObject;\n  public PopEvaluationStack(numberOfObjects: number): InkObject[];\n  public PopEvaluationStack(numberOfObjects?: number) {\n    if (typeof numberOfObjects === \"undefined\") {\n      let obj = this.evaluationStack.pop();\n      return nullIfUndefined(obj);\n    } else {\n      if (numberOfObjects > this.evaluationStack.length) {\n        throw new Error(\"trying to pop too many objects\");\n      }\n\n      let popped = this.evaluationStack.splice(\n        this.evaluationStack.length - numberOfObjects,\n        numberOfObjects\n      );\n      return nullIfUndefined(popped);\n    }\n  }\n\n  public PeekEvaluationStack() {\n    return this.evaluationStack[this.evaluationStack.length - 1];\n  }\n\n  public ForceEnd() {\n    this.callStack.Reset();\n\n    this._currentFlow.currentChoices.length = 0;\n\n    this.currentPointer = Pointer.Null;\n    this.previousPointer = Pointer.Null;\n\n    this.didSafeExit = true;\n  }\n\n  public TrimWhitespaceFromFunctionEnd() {\n    Debug.Assert(this.callStack.currentElement.type == PushPopType.Function);\n    let functionStartPoint =\n      this.callStack.currentElement.functionStartInOutputStream;\n\n    if (functionStartPoint == -1) {\n      functionStartPoint = 0;\n    }\n\n    for (let i = this.outputStream.length - 1; i >= functionStartPoint; i--) {\n      let obj = this.outputStream[i];\n      let txt = asOrNull(obj, StringValue);\n      let cmd = asOrNull(obj, ControlCommand);\n\n      if (txt == null) continue;\n      if (cmd) break;\n\n      if (txt.isNewline || txt.isInlineWhitespace) {\n        this.outputStream.splice(i, 1);\n        this.OutputStreamDirty();\n      } else {\n        break;\n      }\n    }\n  }\n\n  public PopCallStack(popType: PushPopType | null = null) {\n    if (this.callStack.currentElement.type == PushPopType.Function)\n      this.TrimWhitespaceFromFunctionEnd();\n\n    this.callStack.Pop(popType);\n  }\n\n  public SetChosenPath(path: Path, incrementingTurnIndex: boolean) {\n    // Changing direction, assume we need to clear current set of choices\n    this._currentFlow.currentChoices.length = 0;\n\n    let newPointer = this.story.PointerAtPath(path);\n    if (!newPointer.isNull && newPointer.index == -1) newPointer.index = 0;\n\n    this.currentPointer = newPointer;\n\n    if (incrementingTurnIndex) {\n      this.currentTurnIndex++;\n    }\n  }\n\n  public StartFunctionEvaluationFromGame(\n    funcContainer: Container,\n    args: any[]\n  ) {\n    this.callStack.Push(\n      PushPopType.FunctionEvaluationFromGame,\n      this.evaluationStack.length\n    );\n    this.callStack.currentElement.currentPointer =\n      Pointer.StartOf(funcContainer);\n\n    this.PassArgumentsToEvaluationStack(args);\n  }\n\n  public PassArgumentsToEvaluationStack(args: any[] | null) {\n    if (args !== null) {\n      for (let i = 0; i < args.length; i++) {\n        if (\n          !(\n            typeof args[i] === \"number\" ||\n            typeof args[i] === \"string\" ||\n            typeof args[i] === \"boolean\" ||\n            args[i] instanceof InkList\n          )\n        ) {\n          throw new Error(\n            \"ink arguments when calling EvaluateFunction / ChoosePathStringWithParameters must be\" +\n              \"number, string, bool or InkList. Argument was \" +\n              (nullIfUndefined(args[i]) === null\n                ? \"null\"\n                : args[i].constructor.name)\n          );\n        }\n\n        this.PushEvaluationStack(Value.Create(args[i]));\n      }\n    }\n  }\n\n  public TryExitFunctionEvaluationFromGame() {\n    if (\n      this.callStack.currentElement.type ==\n      PushPopType.FunctionEvaluationFromGame\n    ) {\n      this.currentPointer = Pointer.Null;\n      this.didSafeExit = true;\n      return true;\n    }\n\n    return false;\n  }\n\n  public CompleteFunctionEvaluationFromGame() {\n    if (\n      this.callStack.currentElement.type !=\n      PushPopType.FunctionEvaluationFromGame\n    ) {\n      throw new Error(\n        \"Expected external function evaluation to be complete. Stack trace: \" +\n          this.callStack.callStackTrace\n      );\n    }\n\n    let originalEvaluationStackHeight =\n      this.callStack.currentElement.evaluationStackHeightWhenPushed;\n\n    let returnedObj: InkObject | null = null;\n    while (this.evaluationStack.length > originalEvaluationStackHeight) {\n      let poppedObj = this.PopEvaluationStack();\n      if (returnedObj === null) returnedObj = poppedObj;\n    }\n\n    this.PopCallStack(PushPopType.FunctionEvaluationFromGame);\n\n    if (returnedObj) {\n      if (returnedObj instanceof Void) return null;\n\n      // Some kind of value, if not void\n      // var returnVal = returnedObj as Runtime.Value;\n      let returnVal = asOrThrows(returnedObj, Value);\n\n      // DivertTargets get returned as the string of components\n      // (rather than a Path, which isn't public)\n      if (returnVal.valueType == ValueType.DivertTarget) {\n        return \"-> \" + returnVal.valueObject.toString();\n      }\n\n      // Other types can just have their exact object type:\n      // int, float, string. VariablePointers get returned as strings.\n      return returnVal.valueObject;\n    }\n\n    return null;\n  }\n\n  public AddError(message: string, isWarning: boolean) {\n    if (!isWarning) {\n      if (this._currentErrors == null) this._currentErrors = [];\n      this._currentErrors.push(message);\n    } else {\n      if (this._currentWarnings == null) this._currentWarnings = [];\n      this._currentWarnings.push(message);\n    }\n  }\n\n  public OutputStreamDirty() {\n    this._outputStreamTextDirty = true;\n    this._outputStreamTagsDirty = true;\n  }\n\n  private _visitCounts: Map<string, number>;\n  private _turnIndices: Map<string, number>;\n\n  private _outputStreamTextDirty = true;\n  private _outputStreamTagsDirty = true;\n\n  private _patch: StatePatch | null = null;\n\n  private _currentFlow: Flow;\n  private _aliveFlowNames: string[] | null = null;\n  private _namedFlows: Map<string, Flow> | null = null;\n  private readonly kDefaultFlowName = \"DEFAULT_FLOW\";\n  private _aliveFlowNamesDirty: boolean = true;\n}\n","// This is simple replacement of the Stopwatch class from the .NET Framework.\n// The original class can count time with much more accuracy than the Javascript version.\n// It might be worth considering using `window.performance` in the browser\n// or `process.hrtime()` in node.\nexport class Stopwatch {\n  private startTime: number | undefined;\n\n  constructor() {\n    this.startTime = undefined;\n  }\n\n  get ElapsedMilliseconds(): number {\n    if (typeof this.startTime === \"undefined\") {\n      return 0;\n    }\n    return new Date().getTime() - this.startTime;\n  }\n\n  public Start() {\n    this.startTime = new Date().getTime();\n  }\n  public Stop() {\n    this.startTime = undefined;\n  }\n}\n","import { Container } from \"./Container\";\nimport { InkObject } from \"./Object\";\nimport { JsonSerialisation } from \"./JsonSerialisation\";\nimport { StoryState } from \"./StoryState\";\nimport { ControlCommand } from \"./ControlCommand\";\nimport { PushPopType } from \"./PushPop\";\nimport { ChoicePoint } from \"./ChoicePoint\";\nimport { Choice } from \"./Choice\";\nimport { Divert } from \"./Divert\";\nimport {\n  Value,\n  StringValue,\n  IntValue,\n  DivertTargetValue,\n  VariablePointerValue,\n  ListValue,\n} from \"./Value\";\nimport { Path } from \"./Path\";\nimport { Void } from \"./Void\";\nimport { Tag } from \"./Tag\";\nimport { VariableAssignment } from \"./VariableAssignment\";\nimport { VariableReference } from \"./VariableReference\";\nimport { NativeFunctionCall } from \"./NativeFunctionCall\";\nimport { StoryException } from \"./StoryException\";\nimport { PRNG } from \"./PRNG\";\nimport { StringBuilder } from \"./StringBuilder\";\nimport { ListDefinitionsOrigin } from \"./ListDefinitionsOrigin\";\nimport { ListDefinition } from \"./ListDefinition\";\nimport { Stopwatch } from \"./StopWatch\";\nimport { Pointer } from \"./Pointer\";\nimport { InkList, InkListItem, KeyValuePair } from \"./InkList\";\nimport { asOrNull, asOrThrows } from \"./TypeAssertion\";\nimport { DebugMetadata } from \"./DebugMetadata\";\nimport { throwNullException } from \"./NullException\";\nimport { SimpleJson } from \"./SimpleJson\";\nimport { ErrorHandler, ErrorType } from \"./Error\";\n\nexport { InkList } from \"./InkList\";\n\nif (!Number.isInteger) {\n  Number.isInteger = function isInteger(nVal: any) {\n    return (\n      typeof nVal === \"number\" &&\n      isFinite(nVal) &&\n      nVal > -9007199254740992 &&\n      nVal < 9007199254740992 &&\n      Math.floor(nVal) === nVal\n    );\n  };\n}\n\nexport class Story extends InkObject {\n  public static inkVersionCurrent = 21;\n\n  public inkVersionMinimumCompatible = 18;\n\n  get currentChoices() {\n    let choices: Choice[] = [];\n\n    if (this._state === null) {\n      return throwNullException(\"this._state\");\n    }\n    for (let c of this._state.currentChoices) {\n      if (!c.isInvisibleDefault) {\n        c.index = choices.length;\n        choices.push(c);\n      }\n    }\n\n    return choices;\n  }\n\n  get currentText() {\n    this.IfAsyncWeCant(\"call currentText since it's a work in progress\");\n    return this.state.currentText;\n  }\n\n  get currentTags() {\n    this.IfAsyncWeCant(\"call currentTags since it's a work in progress\");\n    return this.state.currentTags;\n  }\n\n  get currentErrors() {\n    return this.state.currentErrors;\n  }\n\n  get currentWarnings() {\n    return this.state.currentWarnings;\n  }\n\n  get currentFlowName() {\n    return this.state.currentFlowName;\n  }\n\n  get currentFlowIsDefaultFlow() {\n    return this.state.currentFlowIsDefaultFlow;\n  }\n\n  get aliveFlowNames() {\n    return this.state.aliveFlowNames;\n  }\n\n  get hasError() {\n    return this.state.hasError;\n  }\n\n  get hasWarning() {\n    return this.state.hasWarning;\n  }\n\n  get variablesState() {\n    return this.state.variablesState;\n  }\n\n  get listDefinitions() {\n    return this._listDefinitions;\n  }\n\n  get state() {\n    return this._state;\n  }\n\n  public onError: ErrorHandler | null = null;\n\n  public onDidContinue: (() => void) | null = null;\n\n  public onMakeChoice: ((arg1: Choice) => void) | null = null;\n\n  public onEvaluateFunction: ((arg1: string, arg2: any[]) => void) | null =\n    null;\n\n  public onCompleteEvaluateFunction:\n    | ((arg1: string, arg2: any[], arg3: string, arg4: any) => void)\n    | null = null;\n\n  public onChoosePathString: ((arg1: string, arg2: any[]) => void) | null =\n    null;\n\n  // TODO: Implement Profiler\n  public StartProfiling() {\n    /* */\n  }\n  public EndProfiling() {\n    /* */\n  }\n\n  constructor(contentContainer: Container, lists: ListDefinition[] | null);\n  constructor(jsonString: string);\n  constructor(json: Record<string, any>);\n  constructor() {\n    super();\n\n    // Discrimination between constructors\n    let contentContainer: Container;\n    let lists: ListDefinition[] | null = null;\n    let json: Record<string, any> | null = null;\n\n    if (arguments[0] instanceof Container) {\n      contentContainer = arguments[0] as Container;\n\n      if (typeof arguments[1] !== \"undefined\") {\n        lists = arguments[1] as ListDefinition[];\n      }\n\n      // ------ Story (Container contentContainer, List<Runtime.ListDefinition> lists = null)\n      this._mainContentContainer = contentContainer;\n      // ------\n    } else {\n      if (typeof arguments[0] === \"string\") {\n        let jsonString = arguments[0] as string;\n\n        json = SimpleJson.TextToDictionary(jsonString);\n      } else {\n        json = arguments[0] as Record<string, any>;\n      }\n    }\n\n    // ------ Story (Container contentContainer, List<Runtime.ListDefinition> lists = null)\n    if (lists != null) this._listDefinitions = new ListDefinitionsOrigin(lists);\n\n    this._externals = new Map();\n    // ------\n\n    // ------ Story(string jsonString) : this((Container)null)\n    if (json !== null) {\n      let rootObject: Record<string, any> = json;\n\n      let versionObj = rootObject[\"inkVersion\"];\n      if (versionObj == null)\n        throw new Error(\n          \"ink version number not found. Are you sure it's a valid .ink.json file?\"\n        );\n\n      let formatFromFile = parseInt(versionObj);\n      if (formatFromFile > Story.inkVersionCurrent) {\n        throw new Error(\n          \"Version of ink used to build story was newer than the current version of the engine\"\n        );\n      } else if (formatFromFile < this.inkVersionMinimumCompatible) {\n        throw new Error(\n          \"Version of ink used to build story is too old to be loaded by this version of the engine\"\n        );\n      } else if (formatFromFile != Story.inkVersionCurrent) {\n        console.warn(\n          `WARNING: Version of ink ${Story.inkVersionCurrent} used to build story doesn't match current version of engine (${formatFromFile}). Non-critical, but recommend synchronising.`\n        );\n      }\n\n      let rootToken = rootObject[\"root\"];\n      if (rootToken == null)\n        throw new Error(\n          \"Root node for ink not found. Are you sure it's a valid .ink.json file?\"\n        );\n\n      let listDefsObj;\n      if ((listDefsObj = rootObject[\"listDefs\"])) {\n        this._listDefinitions =\n          JsonSerialisation.JTokenToListDefinitions(listDefsObj);\n      }\n\n      this._mainContentContainer = asOrThrows(\n        JsonSerialisation.JTokenToRuntimeObject(rootToken),\n        Container\n      );\n\n      this.ResetState();\n    }\n    // ------\n  }\n\n  // Merge together `public string ToJson()` and `void ToJson(SimpleJson.Writer writer)`.\n  // Will only return a value if writer was not provided.\n  public ToJson(writer?: SimpleJson.Writer): string | void {\n    let shouldReturn = false;\n\n    if (!writer) {\n      shouldReturn = true;\n      writer = new SimpleJson.Writer();\n    }\n\n    writer.WriteObjectStart();\n\n    writer.WriteIntProperty(\"inkVersion\", Story.inkVersionCurrent);\n\n    writer.WriteProperty(\"root\", (w) =>\n      JsonSerialisation.WriteRuntimeContainer(w, this._mainContentContainer)\n    );\n\n    if (this._listDefinitions != null) {\n      writer.WritePropertyStart(\"listDefs\");\n      writer.WriteObjectStart();\n\n      for (let def of this._listDefinitions.lists) {\n        writer.WritePropertyStart(def.name);\n        writer.WriteObjectStart();\n\n        for (let [key, value] of def.items) {\n          let item = InkListItem.fromSerializedKey(key);\n          let val = value;\n          writer.WriteIntProperty(item.itemName, val);\n        }\n\n        writer.WriteObjectEnd();\n        writer.WritePropertyEnd();\n      }\n\n      writer.WriteObjectEnd();\n      writer.WritePropertyEnd();\n    }\n\n    writer.WriteObjectEnd();\n\n    if (shouldReturn) return writer.toString();\n  }\n\n  public ResetState() {\n    this.IfAsyncWeCant(\"ResetState\");\n\n    this._state = new StoryState(this);\n    this._state.variablesState.ObserveVariableChange(\n      this.VariableStateDidChangeEvent.bind(this)\n    );\n\n    this.ResetGlobals();\n  }\n\n  public ResetErrors() {\n    if (this._state === null) {\n      return throwNullException(\"this._state\");\n    }\n    this._state.ResetErrors();\n  }\n\n  public ResetCallstack() {\n    this.IfAsyncWeCant(\"ResetCallstack\");\n    if (this._state === null) {\n      return throwNullException(\"this._state\");\n    }\n    this._state.ForceEnd();\n  }\n\n  public ResetGlobals() {\n    if (this._mainContentContainer.namedContent.get(\"global decl\")) {\n      let originalPointer = this.state.currentPointer.copy();\n\n      this.ChoosePath(new Path(\"global decl\"), false);\n\n      this.ContinueInternal();\n\n      this.state.currentPointer = originalPointer;\n    }\n\n    this.state.variablesState.SnapshotDefaultGlobals();\n  }\n\n  public SwitchFlow(flowName: string) {\n    this.IfAsyncWeCant(\"switch flow\");\n    if (this._asyncSaving) {\n      throw new Error(\n        \"Story is already in background saving mode, can't switch flow to \" +\n          flowName\n      );\n    }\n\n    this.state.SwitchFlow_Internal(flowName);\n  }\n\n  public RemoveFlow(flowName: string) {\n    this.state.RemoveFlow_Internal(flowName);\n  }\n\n  public SwitchToDefaultFlow() {\n    this.state.SwitchToDefaultFlow_Internal();\n  }\n\n  public Continue() {\n    this.ContinueAsync(0);\n    return this.currentText;\n  }\n\n  get canContinue() {\n    return this.state.canContinue;\n  }\n\n  get asyncContinueComplete() {\n    return !this._asyncContinueActive;\n  }\n\n  public ContinueAsync(millisecsLimitAsync: number) {\n    if (!this._hasValidatedExternals) this.ValidateExternalBindings();\n\n    this.ContinueInternal(millisecsLimitAsync);\n  }\n\n  public ContinueInternal(millisecsLimitAsync = 0) {\n    if (this._profiler != null) this._profiler.PreContinue();\n\n    let isAsyncTimeLimited = millisecsLimitAsync > 0;\n    this._recursiveContinueCount++;\n\n    if (!this._asyncContinueActive) {\n      this._asyncContinueActive = isAsyncTimeLimited;\n\n      if (!this.canContinue) {\n        throw new Error(\n          \"Can't continue - should check canContinue before calling Continue\"\n        );\n      }\n\n      this._state.didSafeExit = false;\n      this._state.ResetOutput();\n\n      if (this._recursiveContinueCount == 1)\n        this._state.variablesState.StartVariableObservation();\n    } else if (this._asyncContinueActive && !isAsyncTimeLimited) {\n      this._asyncContinueActive = false;\n    }\n\n    let durationStopwatch = new Stopwatch();\n    durationStopwatch.Start();\n\n    let outputStreamEndsInNewline = false;\n    this._sawLookaheadUnsafeFunctionAfterNewline = false;\n    do {\n      try {\n        outputStreamEndsInNewline = this.ContinueSingleStep();\n      } catch (e) {\n        if (!(e instanceof StoryException)) throw e;\n\n        this.AddError(e.message, undefined, e.useEndLineNumber);\n        break;\n      }\n\n      if (outputStreamEndsInNewline) break;\n\n      if (\n        this._asyncContinueActive &&\n        durationStopwatch.ElapsedMilliseconds > millisecsLimitAsync\n      ) {\n        break;\n      }\n    } while (this.canContinue);\n\n    durationStopwatch.Stop();\n\n    let changedVariablesToObserve: Map<string, any> | null = null;\n\n    if (outputStreamEndsInNewline || !this.canContinue) {\n      if (this._stateSnapshotAtLastNewline !== null) {\n        this.RestoreStateSnapshot();\n      }\n\n      if (!this.canContinue) {\n        if (this.state.callStack.canPopThread)\n          this.AddError(\n            \"Thread available to pop, threads should always be flat by the end of evaluation?\"\n          );\n\n        if (\n          this.state.generatedChoices.length == 0 &&\n          !this.state.didSafeExit &&\n          this._temporaryEvaluationContainer == null\n        ) {\n          if (this.state.callStack.CanPop(PushPopType.Tunnel))\n            this.AddError(\n              \"unexpectedly reached end of content. Do you need a '->->' to return from a tunnel?\"\n            );\n          else if (this.state.callStack.CanPop(PushPopType.Function))\n            this.AddError(\n              \"unexpectedly reached end of content. Do you need a '~ return'?\"\n            );\n          else if (!this.state.callStack.canPop)\n            this.AddError(\n              \"ran out of content. Do you need a '-> DONE' or '-> END'?\"\n            );\n          else\n            this.AddError(\n              \"unexpectedly reached end of content for unknown reason. Please debug compiler!\"\n            );\n        }\n      }\n\n      this.state.didSafeExit = false;\n      this._sawLookaheadUnsafeFunctionAfterNewline = false;\n\n      if (this._recursiveContinueCount == 1)\n        changedVariablesToObserve =\n          this._state.variablesState.CompleteVariableObservation();\n\n      this._asyncContinueActive = false;\n      if (this.onDidContinue !== null) this.onDidContinue();\n    }\n\n    this._recursiveContinueCount--;\n\n    if (this._profiler != null) this._profiler.PostContinue();\n\n    // In the following code, we're masking a lot of non-null assertion,\n    // because testing for against `hasError` or `hasWarning` makes sure\n    // the arrays are present and contain at least one element.\n    if (this.state.hasError || this.state.hasWarning) {\n      if (this.onError !== null) {\n        if (this.state.hasError) {\n          for (let err of this.state.currentErrors!) {\n            this.onError(err, ErrorType.Error);\n          }\n        }\n        if (this.state.hasWarning) {\n          for (let err of this.state.currentWarnings!) {\n            this.onError(err, ErrorType.Warning);\n          }\n        }\n        this.ResetErrors();\n      } else {\n        let sb = new StringBuilder();\n        sb.Append(\"Ink had \");\n        if (this.state.hasError) {\n          sb.Append(`${this.state.currentErrors!.length}`);\n          sb.Append(\n            this.state.currentErrors!.length == 1 ? \" error\" : \" errors\"\n          );\n          if (this.state.hasWarning) sb.Append(\" and \");\n        }\n        if (this.state.hasWarning) {\n          sb.Append(`${this.state.currentWarnings!.length}`);\n          sb.Append(\n            this.state.currentWarnings!.length == 1 ? \" warning\" : \" warnings\"\n          );\n          if (this.state.hasWarning) sb.Append(\" and \");\n        }\n        sb.Append(\n          \". It is strongly suggested that you assign an error handler to story.onError. The first issue was: \"\n        );\n        sb.Append(\n          this.state.hasError\n            ? this.state.currentErrors![0]\n            : this.state.currentWarnings![0]\n        );\n\n        throw new StoryException(sb.toString());\n      }\n    }\n    if (\n      changedVariablesToObserve != null &&\n      Object.keys(changedVariablesToObserve).length > 0\n    ) {\n      this._state.variablesState.NotifyObservers(changedVariablesToObserve);\n    }\n  }\n\n  public ContinueSingleStep() {\n    if (this._profiler != null) this._profiler.PreStep();\n\n    this.Step();\n\n    if (this._profiler != null) this._profiler.PostStep();\n\n    if (!this.canContinue && !this.state.callStack.elementIsEvaluateFromGame) {\n      this.TryFollowDefaultInvisibleChoice();\n    }\n\n    if (this._profiler != null) this._profiler.PreSnapshot();\n\n    if (!this.state.inStringEvaluation) {\n      if (this._stateSnapshotAtLastNewline !== null) {\n        if (this._stateSnapshotAtLastNewline.currentTags === null) {\n          return throwNullException(\"this._stateAtLastNewline.currentTags\");\n        }\n        if (this.state.currentTags === null) {\n          return throwNullException(\"this.state.currentTags\");\n        }\n\n        let change = this.CalculateNewlineOutputStateChange(\n          this._stateSnapshotAtLastNewline.currentText,\n          this.state.currentText,\n          this._stateSnapshotAtLastNewline.currentTags.length,\n          this.state.currentTags.length\n        );\n\n        if (\n          change == Story.OutputStateChange.ExtendedBeyondNewline ||\n          this._sawLookaheadUnsafeFunctionAfterNewline\n        ) {\n          this.RestoreStateSnapshot();\n\n          return true;\n        } else if (change == Story.OutputStateChange.NewlineRemoved) {\n          this.DiscardSnapshot();\n        }\n      }\n\n      if (this.state.outputStreamEndsInNewline) {\n        if (this.canContinue) {\n          if (this._stateSnapshotAtLastNewline == null) this.StateSnapshot();\n        } else {\n          this.DiscardSnapshot();\n        }\n      }\n    }\n\n    if (this._profiler != null) this._profiler.PostSnapshot();\n\n    return false;\n  }\n\n  public CalculateNewlineOutputStateChange(\n    prevText: string | null,\n    currText: string | null,\n    prevTagCount: number,\n    currTagCount: number\n  ) {\n    if (prevText === null) {\n      return throwNullException(\"prevText\");\n    }\n    if (currText === null) {\n      return throwNullException(\"currText\");\n    }\n\n    let newlineStillExists =\n      currText.length >= prevText.length &&\n      prevText.length > 0 &&\n      currText.charAt(prevText.length - 1) == \"\\n\";\n    if (\n      prevTagCount == currTagCount &&\n      prevText.length == currText.length &&\n      newlineStillExists\n    )\n      return Story.OutputStateChange.NoChange;\n\n    if (!newlineStillExists) {\n      return Story.OutputStateChange.NewlineRemoved;\n    }\n\n    if (currTagCount > prevTagCount)\n      return Story.OutputStateChange.ExtendedBeyondNewline;\n\n    for (let i = prevText.length; i < currText.length; i++) {\n      let c = currText.charAt(i);\n      if (c != \" \" && c != \"\\t\") {\n        return Story.OutputStateChange.ExtendedBeyondNewline;\n      }\n    }\n\n    return Story.OutputStateChange.NoChange;\n  }\n\n  public ContinueMaximally() {\n    this.IfAsyncWeCant(\"ContinueMaximally\");\n\n    let sb = new StringBuilder();\n\n    while (this.canContinue) {\n      sb.Append(this.Continue());\n    }\n\n    return sb.toString();\n  }\n\n  public ContentAtPath(path: Path) {\n    return this.mainContentContainer.ContentAtPath(path);\n  }\n\n  public KnotContainerWithName(name: string) {\n    let namedContainer = this.mainContentContainer.namedContent.get(name);\n    if (namedContainer instanceof Container) return namedContainer;\n    else return null;\n  }\n\n  public PointerAtPath(path: Path) {\n    if (path.length == 0) return Pointer.Null;\n\n    let p = new Pointer();\n\n    let pathLengthToUse = path.length;\n\n    let result = null;\n    if (path.lastComponent === null) {\n      return throwNullException(\"path.lastComponent\");\n    }\n\n    if (path.lastComponent.isIndex) {\n      pathLengthToUse = path.length - 1;\n      result = this.mainContentContainer.ContentAtPath(\n        path,\n        undefined,\n        pathLengthToUse\n      );\n      p.container = result.container;\n      p.index = path.lastComponent.index;\n    } else {\n      result = this.mainContentContainer.ContentAtPath(path);\n      p.container = result.container;\n      p.index = -1;\n    }\n\n    if (\n      result.obj == null ||\n      (result.obj == this.mainContentContainer && pathLengthToUse > 0)\n    ) {\n      this.Error(\n        \"Failed to find content at path '\" +\n          path +\n          \"', and no approximation of it was possible.\"\n      );\n    } else if (result.approximate)\n      this.Warning(\n        \"Failed to find content at path '\" +\n          path +\n          \"', so it was approximated to: '\" +\n          result.obj.path +\n          \"'.\"\n      );\n\n    return p;\n  }\n\n  public StateSnapshot() {\n    this._stateSnapshotAtLastNewline = this._state;\n    this._state = this._state.CopyAndStartPatching(false);\n  }\n\n  public RestoreStateSnapshot() {\n    if (this._stateSnapshotAtLastNewline === null) {\n      throwNullException(\"_stateSnapshotAtLastNewline\");\n    }\n    this._stateSnapshotAtLastNewline.RestoreAfterPatch();\n\n    this._state = this._stateSnapshotAtLastNewline;\n    this._stateSnapshotAtLastNewline = null;\n\n    if (!this._asyncSaving) {\n      this._state.ApplyAnyPatch();\n    }\n  }\n\n  public DiscardSnapshot() {\n    if (!this._asyncSaving) this._state.ApplyAnyPatch();\n\n    this._stateSnapshotAtLastNewline = null;\n  }\n\n  public CopyStateForBackgroundThreadSave() {\n    this.IfAsyncWeCant(\"start saving on a background thread\");\n\n    if (this._asyncSaving)\n      throw new Error(\n        \"Story is already in background saving mode, can't call CopyStateForBackgroundThreadSave again!\"\n      );\n\n    let stateToSave = this._state;\n    this._state = this._state.CopyAndStartPatching(true);\n    this._asyncSaving = true;\n    return stateToSave;\n  }\n\n  public BackgroundSaveComplete() {\n    if (this._stateSnapshotAtLastNewline === null) {\n      this._state.ApplyAnyPatch();\n    }\n\n    this._asyncSaving = false;\n  }\n\n  public Step() {\n    let shouldAddToStream = true;\n\n    let pointer = this.state.currentPointer.copy();\n    if (pointer.isNull) {\n      return;\n    }\n\n    // Container containerToEnter = pointer.Resolve () as Container;\n    let containerToEnter = asOrNull(pointer.Resolve(), Container);\n\n    while (containerToEnter) {\n      this.VisitContainer(containerToEnter, true);\n\n      // No content? the most we can do is step past it\n      if (containerToEnter.content.length == 0) {\n        break;\n      }\n\n      pointer = Pointer.StartOf(containerToEnter);\n      // containerToEnter = pointer.Resolve() as Container;\n      containerToEnter = asOrNull(pointer.Resolve(), Container);\n    }\n\n    this.state.currentPointer = pointer.copy();\n\n    if (this._profiler != null) this._profiler.Step(this.state.callStack);\n\n    // Is the current content object:\n    //  - Normal content\n    //  - Or a logic/flow statement - if so, do it\n    // Stop flow if we hit a stack pop when we're unable to pop (e.g. return/done statement in knot\n    // that was diverted to rather than called as a function)\n    let currentContentObj = pointer.Resolve();\n    let isLogicOrFlowControl =\n      this.PerformLogicAndFlowControl(currentContentObj);\n\n    // Has flow been forced to end by flow control above?\n    if (this.state.currentPointer.isNull) {\n      return;\n    }\n\n    if (isLogicOrFlowControl) {\n      shouldAddToStream = false;\n    }\n\n    // Choice with condition?\n    // var choicePoint = currentContentObj as ChoicePoint;\n    let choicePoint = asOrNull(currentContentObj, ChoicePoint);\n    if (choicePoint) {\n      let choice = this.ProcessChoice(choicePoint);\n      if (choice) {\n        this.state.generatedChoices.push(choice);\n      }\n\n      currentContentObj = null;\n      shouldAddToStream = false;\n    }\n\n    // If the container has no content, then it will be\n    // the \"content\" itself, but we skip over it.\n    if (currentContentObj instanceof Container) {\n      shouldAddToStream = false;\n    }\n\n    // Content to add to evaluation stack or the output stream\n    if (shouldAddToStream) {\n      // If we're pushing a variable pointer onto the evaluation stack, ensure that it's specific\n      // to our current (possibly temporary) context index. And make a copy of the pointer\n      // so that we're not editing the original runtime object.\n      // var varPointer = currentContentObj as VariablePointerValue;\n      let varPointer = asOrNull(currentContentObj, VariablePointerValue);\n      if (varPointer && varPointer.contextIndex == -1) {\n        // Create new object so we're not overwriting the story's own data\n        let contextIdx = this.state.callStack.ContextForVariableNamed(\n          varPointer.variableName\n        );\n        currentContentObj = new VariablePointerValue(\n          varPointer.variableName,\n          contextIdx\n        );\n      }\n\n      // Expression evaluation content\n      if (this.state.inExpressionEvaluation) {\n        this.state.PushEvaluationStack(currentContentObj);\n      }\n      // Output stream content (i.e. not expression evaluation)\n      else {\n        this.state.PushToOutputStream(currentContentObj);\n      }\n    }\n\n    // Increment the content pointer, following diverts if necessary\n    this.NextContent();\n\n    // Starting a thread should be done after the increment to the content pointer,\n    // so that when returning from the thread, it returns to the content after this instruction.\n    // var controlCmd = currentContentObj as ;\n    let controlCmd = asOrNull(currentContentObj, ControlCommand);\n    if (\n      controlCmd &&\n      controlCmd.commandType == ControlCommand.CommandType.StartThread\n    ) {\n      this.state.callStack.PushThread();\n    }\n  }\n\n  public VisitContainer(container: Container, atStart: boolean) {\n    if (!container.countingAtStartOnly || atStart) {\n      if (container.visitsShouldBeCounted)\n        this.state.IncrementVisitCountForContainer(container);\n\n      if (container.turnIndexShouldBeCounted)\n        this.state.RecordTurnIndexVisitToContainer(container);\n    }\n  }\n\n  private _prevContainers: Container[] = [];\n  public VisitChangedContainersDueToDivert() {\n    let previousPointer = this.state.previousPointer.copy();\n    let pointer = this.state.currentPointer.copy();\n\n    if (pointer.isNull || pointer.index == -1) return;\n\n    this._prevContainers.length = 0;\n    if (!previousPointer.isNull) {\n      // Container prevAncestor = previousPointer.Resolve() as Container ?? previousPointer.container as Container;\n      let resolvedPreviousAncestor = previousPointer.Resolve();\n      let prevAncestor =\n        asOrNull(resolvedPreviousAncestor, Container) ||\n        asOrNull(previousPointer.container, Container);\n      while (prevAncestor) {\n        this._prevContainers.push(prevAncestor);\n        // prevAncestor = prevAncestor.parent as Container;\n        prevAncestor = asOrNull(prevAncestor.parent, Container);\n      }\n    }\n\n    let currentChildOfContainer = pointer.Resolve();\n\n    if (currentChildOfContainer == null) return;\n\n    // Container currentContainerAncestor = currentChildOfContainer.parent as Container;\n    let currentContainerAncestor = asOrNull(\n      currentChildOfContainer.parent,\n      Container\n    );\n    let allChildrenEnteredAtStart = true;\n    while (\n      currentContainerAncestor &&\n      (this._prevContainers.indexOf(currentContainerAncestor) < 0 ||\n        currentContainerAncestor.countingAtStartOnly)\n    ) {\n      // Check whether this ancestor container is being entered at the start,\n      // by checking whether the child object is the first.\n      let enteringAtStart =\n        currentContainerAncestor.content.length > 0 &&\n        currentChildOfContainer == currentContainerAncestor.content[0] &&\n        allChildrenEnteredAtStart;\n\n      if (!enteringAtStart) allChildrenEnteredAtStart = false;\n\n      // Mark a visit to this container\n      this.VisitContainer(currentContainerAncestor, enteringAtStart);\n\n      currentChildOfContainer = currentContainerAncestor;\n      // currentContainerAncestor = currentContainerAncestor.parent as Container;\n      currentContainerAncestor = asOrNull(\n        currentContainerAncestor.parent,\n        Container\n      );\n    }\n  }\n\n  public PopChoiceStringAndTags(tags: string[]) {\n    let choiceOnlyStrVal = asOrThrows(\n      this.state.PopEvaluationStack(),\n      StringValue\n    );\n\n    while (\n      this.state.evaluationStack.length > 0 &&\n      asOrNull(this.state.PeekEvaluationStack(), Tag) != null\n    ) {\n      let tag = asOrNull(this.state.PopEvaluationStack(), Tag);\n      if (tag) tags.push(tag.text);\n    }\n    return choiceOnlyStrVal.value;\n  }\n\n  public ProcessChoice(choicePoint: ChoicePoint) {\n    let showChoice = true;\n\n    // Don't create choice if choice point doesn't pass conditional\n    if (choicePoint.hasCondition) {\n      let conditionValue = this.state.PopEvaluationStack();\n      if (!this.IsTruthy(conditionValue)) {\n        showChoice = false;\n      }\n    }\n\n    let startText = \"\";\n    let choiceOnlyText = \"\";\n    let tags: string[] = [];\n\n    if (choicePoint.hasChoiceOnlyContent) {\n      choiceOnlyText = this.PopChoiceStringAndTags(tags) || \"\";\n    }\n\n    if (choicePoint.hasStartContent) {\n      startText = this.PopChoiceStringAndTags(tags) || \"\";\n    }\n\n    // Don't create choice if player has already read this content\n    if (choicePoint.onceOnly) {\n      let visitCount = this.state.VisitCountForContainer(\n        choicePoint.choiceTarget\n      );\n      if (visitCount > 0) {\n        showChoice = false;\n      }\n    }\n\n    // We go through the full process of creating the choice above so\n    // that we consume the content for it, since otherwise it'll\n    // be shown on the output stream.\n    if (!showChoice) {\n      return null;\n    }\n\n    let choice = new Choice();\n    choice.targetPath = choicePoint.pathOnChoice;\n    choice.sourcePath = choicePoint.path.toString();\n    choice.isInvisibleDefault = choicePoint.isInvisibleDefault;\n    choice.threadAtGeneration = this.state.callStack.ForkThread();\n    choice.tags = tags.reverse(); //C# is a stack\n    choice.text = (startText + choiceOnlyText).replace(/^[ \\t]+|[ \\t]+$/g, \"\");\n\n    return choice;\n  }\n\n  public IsTruthy(obj: InkObject) {\n    let truthy = false;\n    if (obj instanceof Value) {\n      let val = obj;\n\n      if (val instanceof DivertTargetValue) {\n        let divTarget = val;\n        this.Error(\n          \"Shouldn't use a divert target (to \" +\n            divTarget.targetPath +\n            \") as a conditional value. Did you intend a function call 'likeThis()' or a read count check 'likeThis'? (no arrows)\"\n        );\n        return false;\n      }\n\n      return val.isTruthy;\n    }\n    return truthy;\n  }\n\n  public PerformLogicAndFlowControl(contentObj: InkObject | null) {\n    if (contentObj == null) {\n      return false;\n    }\n\n    // Divert\n    if (contentObj instanceof Divert) {\n      let currentDivert = contentObj;\n\n      if (currentDivert.isConditional) {\n        let conditionValue = this.state.PopEvaluationStack();\n\n        // False conditional? Cancel divert\n        if (!this.IsTruthy(conditionValue)) return true;\n      }\n\n      if (currentDivert.hasVariableTarget) {\n        let varName = currentDivert.variableDivertName;\n\n        let varContents =\n          this.state.variablesState.GetVariableWithName(varName);\n\n        if (varContents == null) {\n          this.Error(\n            \"Tried to divert using a target from a variable that could not be found (\" +\n              varName +\n              \")\"\n          );\n        } else if (!(varContents instanceof DivertTargetValue)) {\n          // var intContent = varContents as IntValue;\n          let intContent = asOrNull(varContents, IntValue);\n\n          let errorMessage =\n            \"Tried to divert to a target from a variable, but the variable (\" +\n            varName +\n            \") didn't contain a divert target, it \";\n          if (intContent instanceof IntValue && intContent.value == 0) {\n            errorMessage += \"was empty/null (the value 0).\";\n          } else {\n            errorMessage += \"contained '\" + varContents + \"'.\";\n          }\n\n          this.Error(errorMessage);\n        }\n\n        let target = asOrThrows(varContents, DivertTargetValue);\n        this.state.divertedPointer = this.PointerAtPath(target.targetPath);\n      } else if (currentDivert.isExternal) {\n        this.CallExternalFunction(\n          currentDivert.targetPathString,\n          currentDivert.externalArgs\n        );\n        return true;\n      } else {\n        this.state.divertedPointer = currentDivert.targetPointer.copy();\n      }\n\n      if (currentDivert.pushesToStack) {\n        this.state.callStack.Push(\n          currentDivert.stackPushType,\n          undefined,\n          this.state.outputStream.length\n        );\n      }\n\n      if (this.state.divertedPointer.isNull && !currentDivert.isExternal) {\n        if (\n          currentDivert &&\n          currentDivert.debugMetadata &&\n          currentDivert.debugMetadata.sourceName != null\n        ) {\n          this.Error(\n            \"Divert target doesn't exist: \" +\n              currentDivert.debugMetadata.sourceName\n          );\n        } else {\n          this.Error(\"Divert resolution failed: \" + currentDivert);\n        }\n      }\n\n      return true;\n    }\n\n    // Start/end an expression evaluation? Or print out the result?\n    else if (contentObj instanceof ControlCommand) {\n      let evalCommand = contentObj;\n\n      switch (evalCommand.commandType) {\n        case ControlCommand.CommandType.EvalStart:\n          this.Assert(\n            this.state.inExpressionEvaluation === false,\n            \"Already in expression evaluation?\"\n          );\n          this.state.inExpressionEvaluation = true;\n          break;\n\n        case ControlCommand.CommandType.EvalEnd:\n          this.Assert(\n            this.state.inExpressionEvaluation === true,\n            \"Not in expression evaluation mode\"\n          );\n          this.state.inExpressionEvaluation = false;\n          break;\n\n        case ControlCommand.CommandType.EvalOutput:\n          // If the expression turned out to be empty, there may not be anything on the stack\n          if (this.state.evaluationStack.length > 0) {\n            let output = this.state.PopEvaluationStack();\n\n            // Functions may evaluate to Void, in which case we skip output\n            if (!(output instanceof Void)) {\n              // TODO: Should we really always blanket convert to string?\n              // It would be okay to have numbers in the output stream the\n              // only problem is when exporting text for viewing, it skips over numbers etc.\n              let text = new StringValue(output.toString());\n\n              this.state.PushToOutputStream(text);\n            }\n          }\n          break;\n\n        case ControlCommand.CommandType.NoOp:\n          break;\n\n        case ControlCommand.CommandType.Duplicate:\n          this.state.PushEvaluationStack(this.state.PeekEvaluationStack());\n          break;\n\n        case ControlCommand.CommandType.PopEvaluatedValue:\n          this.state.PopEvaluationStack();\n          break;\n\n        case ControlCommand.CommandType.PopFunction:\n        case ControlCommand.CommandType.PopTunnel:\n          let popType =\n            evalCommand.commandType == ControlCommand.CommandType.PopFunction\n              ? PushPopType.Function\n              : PushPopType.Tunnel;\n\n          let overrideTunnelReturnTarget: DivertTargetValue | null = null;\n          if (popType == PushPopType.Tunnel) {\n            let popped = this.state.PopEvaluationStack();\n            // overrideTunnelReturnTarget = popped as DivertTargetValue;\n            overrideTunnelReturnTarget = asOrNull(popped, DivertTargetValue);\n            if (overrideTunnelReturnTarget === null) {\n              this.Assert(\n                popped instanceof Void,\n                \"Expected void if ->-> doesn't override target\"\n              );\n            }\n          }\n\n          if (this.state.TryExitFunctionEvaluationFromGame()) {\n            break;\n          } else if (\n            this.state.callStack.currentElement.type != popType ||\n            !this.state.callStack.canPop\n          ) {\n            let names: Map<PushPopType, string> = new Map();\n            names.set(\n              PushPopType.Function,\n              \"function return statement (~ return)\"\n            );\n            names.set(PushPopType.Tunnel, \"tunnel onwards statement (->->)\");\n\n            let expected = names.get(this.state.callStack.currentElement.type);\n            if (!this.state.callStack.canPop) {\n              expected = \"end of flow (-> END or choice)\";\n            }\n\n            let errorMsg =\n              \"Found \" + names.get(popType) + \", when expected \" + expected;\n\n            this.Error(errorMsg);\n          } else {\n            this.state.PopCallStack();\n\n            if (overrideTunnelReturnTarget)\n              this.state.divertedPointer = this.PointerAtPath(\n                overrideTunnelReturnTarget.targetPath\n              );\n          }\n          break;\n\n        case ControlCommand.CommandType.BeginString:\n          this.state.PushToOutputStream(evalCommand);\n\n          this.Assert(\n            this.state.inExpressionEvaluation === true,\n            \"Expected to be in an expression when evaluating a string\"\n          );\n          this.state.inExpressionEvaluation = false;\n          break;\n\n        // Leave it to story.currentText and story.currentTags to sort out the text from the tags\n        // This is mostly because we can't always rely on the existence of EndTag, and we don't want\n        // to try and flatten dynamic tags to strings every time \\n is pushed to output\n        case ControlCommand.CommandType.BeginTag:\n          this.state.PushToOutputStream(evalCommand);\n          break;\n\n        // EndTag has 2 modes:\n        //  - When in string evaluation (for choices)\n        //  - Normal\n        //\n        // The only way you could have an EndTag in the middle of\n        // string evaluation is if we're currently generating text for a\n        // choice, such as:\n        //\n        //   + choice # tag\n        //\n        // In the above case, the ink will be run twice:\n        //  - First, to generate the choice text. String evaluation\n        //    will be on, and the final string will be pushed to the\n        //    evaluation stack, ready to be popped to make a Choice\n        //    object.\n        //  - Second, when ink generates text after choosing the choice.\n        //    On this ocassion, it's not in string evaluation mode.\n        //\n        // On the writing side, we disallow manually putting tags within\n        // strings like this:\n        //\n        //   {\"hello # world\"}\n        //\n        // So we know that the tag must be being generated as part of\n        // choice content. Therefore, when the tag has been generated,\n        // we push it onto the evaluation stack in the exact same way\n        // as the string for the choice content.\n        case ControlCommand.CommandType.EndTag: {\n          if (this.state.inStringEvaluation) {\n            let contentStackForTag: InkObject[] = [];\n            let outputCountConsumed = 0;\n            for (let i = this.state.outputStream.length - 1; i >= 0; --i) {\n              let obj = this.state.outputStream[i];\n              outputCountConsumed++;\n\n              // var command = obj as ControlCommand;\n              let command = asOrNull(obj, ControlCommand);\n              if (command != null) {\n                if (\n                  command.commandType == ControlCommand.CommandType.BeginTag\n                ) {\n                  break;\n                } else {\n                  this.Error(\n                    \"Unexpected ControlCommand while extracting tag from choice\"\n                  );\n                  break;\n                }\n              }\n              if (obj instanceof StringValue) {\n                contentStackForTag.push(obj);\n              }\n            }\n\n            // Consume the content that was produced for this string\n            this.state.PopFromOutputStream(outputCountConsumed);\n            // Build string out of the content we collected\n            let sb = new StringBuilder();\n            for (let strVal of contentStackForTag.reverse()) {\n              sb.Append(strVal.toString());\n            }\n            let choiceTag = new Tag(\n              this.state.CleanOutputWhitespace(sb.toString())\n            );\n            // Pushing to the evaluation stack means it gets picked up\n            // when a Choice is generated from the next Choice Point.\n            this.state.PushEvaluationStack(choiceTag);\n          } else {\n            // Otherwise! Simply push EndTag, so that in the output stream we\n            // have a structure of: [BeginTag, \"the tag content\", EndTag]\n            this.state.PushToOutputStream(evalCommand);\n          }\n          break;\n        }\n\n        case ControlCommand.CommandType.EndString: {\n          let contentStackForString: InkObject[] = [];\n          let contentToRetain: InkObject[] = [];\n\n          let outputCountConsumed = 0;\n          for (let i = this.state.outputStream.length - 1; i >= 0; --i) {\n            let obj = this.state.outputStream[i];\n\n            outputCountConsumed++;\n\n            // var command = obj as ControlCommand;\n            let command = asOrNull(obj, ControlCommand);\n            if (\n              command &&\n              command.commandType == ControlCommand.CommandType.BeginString\n            ) {\n              break;\n            }\n            if (obj instanceof Tag) {\n              contentToRetain.push(obj);\n            }\n            if (obj instanceof StringValue) {\n              contentStackForString.push(obj);\n            }\n          }\n\n          // Consume the content that was produced for this string\n          this.state.PopFromOutputStream(outputCountConsumed);\n\n          // Rescue the tags that we want actually to keep on the output stack\n          // rather than consume as part of the string we're building.\n          // At the time of writing, this only applies to Tag objects generated\n          // by choices, which are pushed to the stack during string generation.\n          for (let rescuedTag of contentToRetain)\n            this.state.PushToOutputStream(rescuedTag);\n\n          // The C# version uses a Stack for contentStackForString, but we're\n          // using a simple array, so we need to reverse it before using it\n          contentStackForString = contentStackForString.reverse();\n\n          // Build string out of the content we collected\n          let sb = new StringBuilder();\n          for (let c of contentStackForString) {\n            sb.Append(c.toString());\n          }\n\n          // Return to expression evaluation (from content mode)\n          this.state.inExpressionEvaluation = true;\n          this.state.PushEvaluationStack(new StringValue(sb.toString()));\n          break;\n        }\n\n        case ControlCommand.CommandType.ChoiceCount:\n          let choiceCount = this.state.generatedChoices.length;\n          this.state.PushEvaluationStack(new IntValue(choiceCount));\n          break;\n\n        case ControlCommand.CommandType.Turns:\n          this.state.PushEvaluationStack(\n            new IntValue(this.state.currentTurnIndex + 1)\n          );\n          break;\n\n        case ControlCommand.CommandType.TurnsSince:\n        case ControlCommand.CommandType.ReadCount:\n          let target = this.state.PopEvaluationStack();\n          if (!(target instanceof DivertTargetValue)) {\n            let extraNote = \"\";\n            if (target instanceof IntValue)\n              extraNote =\n                \". Did you accidentally pass a read count ('knot_name') instead of a target ('-> knot_name')?\";\n            this.Error(\n              \"TURNS_SINCE / READ_COUNT expected a divert target (knot, stitch, label name), but saw \" +\n                target +\n                extraNote\n            );\n            break;\n          }\n\n          // var divertTarget = target as DivertTargetValue;\n          let divertTarget = asOrThrows(target, DivertTargetValue);\n          // var container = ContentAtPath (divertTarget.targetPath).correctObj as Container;\n          let container = asOrNull(\n            this.ContentAtPath(divertTarget.targetPath).correctObj,\n            Container\n          );\n\n          let eitherCount;\n          if (container != null) {\n            if (\n              evalCommand.commandType == ControlCommand.CommandType.TurnsSince\n            )\n              eitherCount = this.state.TurnsSinceForContainer(container);\n            else eitherCount = this.state.VisitCountForContainer(container);\n          } else {\n            if (\n              evalCommand.commandType == ControlCommand.CommandType.TurnsSince\n            )\n              eitherCount = -1;\n            else eitherCount = 0;\n\n            this.Warning(\n              \"Failed to find container for \" +\n                evalCommand.toString() +\n                \" lookup at \" +\n                divertTarget.targetPath.toString()\n            );\n          }\n\n          this.state.PushEvaluationStack(new IntValue(eitherCount));\n          break;\n\n        case ControlCommand.CommandType.Random: {\n          let maxInt = asOrNull(this.state.PopEvaluationStack(), IntValue);\n          let minInt = asOrNull(this.state.PopEvaluationStack(), IntValue);\n\n          if (minInt == null || minInt instanceof IntValue === false)\n            return this.Error(\n              \"Invalid value for minimum parameter of RANDOM(min, max)\"\n            );\n\n          if (maxInt == null || maxInt instanceof IntValue === false)\n            return this.Error(\n              \"Invalid value for maximum parameter of RANDOM(min, max)\"\n            );\n\n          // Originally a primitive type, but here, can be null.\n          // TODO: Replace by default value?\n          if (maxInt.value === null) {\n            return throwNullException(\"maxInt.value\");\n          }\n          if (minInt.value === null) {\n            return throwNullException(\"minInt.value\");\n          }\n\n          // This code is differs a bit from the reference implementation, since\n          // JavaScript has no true integers. Hence integer arithmetics and\n          // interger overflows don't apply here. A loss of precision can\n          // happen with big numbers however.\n          //\n          // The case where 'randomRange' is lower than zero is handled below,\n          // so there's no need to test against Number.MIN_SAFE_INTEGER.\n          let randomRange = maxInt.value - minInt.value + 1;\n          if (!isFinite(randomRange) || randomRange > Number.MAX_SAFE_INTEGER) {\n            randomRange = Number.MAX_SAFE_INTEGER;\n            this.Error(\n              \"RANDOM was called with a range that exceeds the size that ink numbers can use.\"\n            );\n          }\n          if (randomRange <= 0)\n            this.Error(\n              \"RANDOM was called with minimum as \" +\n                minInt.value +\n                \" and maximum as \" +\n                maxInt.value +\n                \". The maximum must be larger\"\n            );\n\n          let resultSeed = this.state.storySeed + this.state.previousRandom;\n          let random = new PRNG(resultSeed);\n\n          let nextRandom = random.next();\n          let chosenValue = (nextRandom % randomRange) + minInt.value;\n          this.state.PushEvaluationStack(new IntValue(chosenValue));\n\n          // Next random number (rather than keeping the Random object around)\n          this.state.previousRandom = nextRandom;\n          break;\n        }\n\n        case ControlCommand.CommandType.SeedRandom:\n          let seed = asOrNull(this.state.PopEvaluationStack(), IntValue);\n          if (seed == null || seed instanceof IntValue === false)\n            return this.Error(\"Invalid value passed to SEED_RANDOM\");\n\n          // Originally a primitive type, but here, can be null.\n          // TODO: Replace by default value?\n          if (seed.value === null) {\n            return throwNullException(\"minInt.value\");\n          }\n\n          this.state.storySeed = seed.value;\n          this.state.previousRandom = 0;\n\n          this.state.PushEvaluationStack(new Void());\n          break;\n\n        case ControlCommand.CommandType.VisitIndex:\n          let count =\n            this.state.VisitCountForContainer(\n              this.state.currentPointer.container\n            ) - 1; // index not count\n          this.state.PushEvaluationStack(new IntValue(count));\n          break;\n\n        case ControlCommand.CommandType.SequenceShuffleIndex:\n          let shuffleIndex = this.NextSequenceShuffleIndex();\n          this.state.PushEvaluationStack(new IntValue(shuffleIndex));\n          break;\n\n        case ControlCommand.CommandType.StartThread:\n          // Handled in main step function\n          break;\n\n        case ControlCommand.CommandType.Done:\n          // We may exist in the context of the initial\n          // act of creating the thread, or in the context of\n          // evaluating the content.\n          if (this.state.callStack.canPopThread) {\n            this.state.callStack.PopThread();\n          }\n\n          // In normal flow - allow safe exit without warning\n          else {\n            this.state.didSafeExit = true;\n\n            // Stop flow in current thread\n            this.state.currentPointer = Pointer.Null;\n          }\n\n          break;\n\n        // Force flow to end completely\n        case ControlCommand.CommandType.End:\n          this.state.ForceEnd();\n          break;\n\n        case ControlCommand.CommandType.ListFromInt:\n          // var intVal = state.PopEvaluationStack () as IntValue;\n          let intVal = asOrNull(this.state.PopEvaluationStack(), IntValue);\n          // var listNameVal = state.PopEvaluationStack () as StringValue;\n          let listNameVal = asOrThrows(\n            this.state.PopEvaluationStack(),\n            StringValue\n          );\n\n          if (intVal === null) {\n            throw new StoryException(\n              \"Passed non-integer when creating a list element from a numerical value.\"\n            );\n          }\n\n          let generatedListValue = null;\n\n          if (this.listDefinitions === null) {\n            return throwNullException(\"this.listDefinitions\");\n          }\n          let foundListDef = this.listDefinitions.TryListGetDefinition(\n            listNameVal.value,\n            null\n          );\n          if (foundListDef.exists) {\n            // Originally a primitive type, but here, can be null.\n            // TODO: Replace by default value?\n            if (intVal.value === null) {\n              return throwNullException(\"minInt.value\");\n            }\n\n            let foundItem = foundListDef.result!.TryGetItemWithValue(\n              intVal.value,\n              InkListItem.Null\n            );\n            if (foundItem.exists) {\n              generatedListValue = new ListValue(\n                foundItem.result!,\n                intVal.value\n              );\n            }\n          } else {\n            throw new StoryException(\n              \"Failed to find LIST called \" + listNameVal.value\n            );\n          }\n\n          if (generatedListValue == null) generatedListValue = new ListValue();\n\n          this.state.PushEvaluationStack(generatedListValue);\n          break;\n\n        case ControlCommand.CommandType.ListRange:\n          let max = asOrNull(this.state.PopEvaluationStack(), Value);\n          let min = asOrNull(this.state.PopEvaluationStack(), Value);\n\n          // var targetList = state.PopEvaluationStack () as ListValue;\n          let targetList = asOrNull(this.state.PopEvaluationStack(), ListValue);\n\n          if (targetList === null || min === null || max === null)\n            throw new StoryException(\n              \"Expected list, minimum and maximum for LIST_RANGE\"\n            );\n\n          if (targetList.value === null) {\n            return throwNullException(\"targetList.value\");\n          }\n          let result = targetList.value.ListWithSubRange(\n            min.valueObject,\n            max.valueObject\n          );\n\n          this.state.PushEvaluationStack(new ListValue(result));\n          break;\n\n        case ControlCommand.CommandType.ListRandom: {\n          let listVal = this.state.PopEvaluationStack() as ListValue;\n          if (listVal === null)\n            throw new StoryException(\"Expected list for LIST_RANDOM\");\n\n          let list = listVal.value;\n\n          let newList: InkList | null = null;\n\n          if (list === null) {\n            throw throwNullException(\"list\");\n          }\n          if (list.Count == 0) {\n            newList = new InkList();\n          } else {\n            // Generate a random index for the element to take\n            let resultSeed = this.state.storySeed + this.state.previousRandom;\n            let random = new PRNG(resultSeed);\n\n            let nextRandom = random.next();\n            let listItemIndex = nextRandom % list.Count;\n\n            // This bit is a little different from the original\n            // C# code, since iterators do not work in the same way.\n            // First, we iterate listItemIndex - 1 times, calling next().\n            // The listItemIndex-th time is made outside of the loop,\n            // in order to retrieve the value.\n            let listEnumerator = list.entries();\n            for (let i = 0; i <= listItemIndex - 1; i++) {\n              listEnumerator.next();\n            }\n            let value = listEnumerator.next().value;\n            let randomItem: KeyValuePair<InkListItem, number> = {\n              Key: InkListItem.fromSerializedKey(value[0]),\n              Value: value[1],\n            };\n\n            // Origin list is simply the origin of the one element\n            if (randomItem.Key.originName === null) {\n              return throwNullException(\"randomItem.Key.originName\");\n            }\n            newList = new InkList(randomItem.Key.originName, this);\n            newList.Add(randomItem.Key, randomItem.Value);\n\n            this.state.previousRandom = nextRandom;\n          }\n\n          this.state.PushEvaluationStack(new ListValue(newList));\n          break;\n        }\n\n        default:\n          this.Error(\"unhandled ControlCommand: \" + evalCommand);\n          break;\n      }\n\n      return true;\n    }\n\n    // Variable assignment\n    else if (contentObj instanceof VariableAssignment) {\n      let varAss = contentObj;\n      let assignedVal = this.state.PopEvaluationStack();\n\n      this.state.variablesState.Assign(varAss, assignedVal);\n\n      return true;\n    }\n\n    // Variable reference\n    else if (contentObj instanceof VariableReference) {\n      let varRef = contentObj;\n      let foundValue = null;\n\n      // Explicit read count value\n      if (varRef.pathForCount != null) {\n        let container = varRef.containerForCount;\n        let count = this.state.VisitCountForContainer(container);\n        foundValue = new IntValue(count);\n      }\n\n      // Normal variable reference\n      else {\n        foundValue = this.state.variablesState.GetVariableWithName(varRef.name);\n\n        if (foundValue == null) {\n          this.Warning(\n            \"Variable not found: '\" +\n              varRef.name +\n              \"'. Using default value of 0 (false). This can happen with temporary variables if the declaration hasn't yet been hit. Globals are always given a default value on load if a value doesn't exist in the save state.\"\n          );\n          foundValue = new IntValue(0);\n        }\n      }\n\n      this.state.PushEvaluationStack(foundValue);\n\n      return true;\n    }\n\n    // Native function call\n    else if (contentObj instanceof NativeFunctionCall) {\n      let func = contentObj;\n      let funcParams = this.state.PopEvaluationStack(func.numberOfParameters);\n      let result = func.Call(funcParams);\n      this.state.PushEvaluationStack(result);\n      return true;\n    }\n\n    // No control content, must be ordinary content\n    return false;\n  }\n\n  public ChoosePathString(\n    path: string,\n    resetCallstack = true,\n    args: any[] = []\n  ) {\n    this.IfAsyncWeCant(\"call ChoosePathString right now\");\n    if (this.onChoosePathString !== null) this.onChoosePathString(path, args);\n\n    if (resetCallstack) {\n      this.ResetCallstack();\n    } else {\n      if (this.state.callStack.currentElement.type == PushPopType.Function) {\n        let funcDetail = \"\";\n        let container =\n          this.state.callStack.currentElement.currentPointer.container;\n        if (container != null) {\n          funcDetail = \"(\" + container.path.toString() + \") \";\n        }\n        throw new Error(\n          \"Story was running a function \" +\n            funcDetail +\n            \"when you called ChoosePathString(\" +\n            path +\n            \") - this is almost certainly not not what you want! Full stack trace: \\n\" +\n            this.state.callStack.callStackTrace\n        );\n      }\n    }\n\n    this.state.PassArgumentsToEvaluationStack(args);\n    this.ChoosePath(new Path(path));\n  }\n\n  public IfAsyncWeCant(activityStr: string) {\n    if (this._asyncContinueActive)\n      throw new Error(\n        \"Can't \" +\n          activityStr +\n          \". Story is in the middle of a ContinueAsync(). Make more ContinueAsync() calls or a single Continue() call beforehand.\"\n      );\n  }\n\n  public ChoosePath(p: Path, incrementingTurnIndex: boolean = true) {\n    this.state.SetChosenPath(p, incrementingTurnIndex);\n\n    // Take a note of newly visited containers for read counts etc\n    this.VisitChangedContainersDueToDivert();\n  }\n\n  public ChooseChoiceIndex(choiceIdx: number) {\n    choiceIdx = choiceIdx;\n    let choices = this.currentChoices;\n    this.Assert(\n      choiceIdx >= 0 && choiceIdx < choices.length,\n      \"choice out of range\"\n    );\n\n    let choiceToChoose = choices[choiceIdx];\n    if (this.onMakeChoice !== null) this.onMakeChoice(choiceToChoose);\n\n    if (choiceToChoose.threadAtGeneration === null) {\n      return throwNullException(\"choiceToChoose.threadAtGeneration\");\n    }\n    if (choiceToChoose.targetPath === null) {\n      return throwNullException(\"choiceToChoose.targetPath\");\n    }\n\n    this.state.callStack.currentThread = choiceToChoose.threadAtGeneration;\n\n    this.ChoosePath(choiceToChoose.targetPath);\n  }\n\n  public HasFunction(functionName: string) {\n    try {\n      return this.KnotContainerWithName(functionName) != null;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  public EvaluateFunction(\n    functionName: string,\n    args: any[] = [],\n    returnTextOutput: boolean = false\n  ): Story.EvaluateFunctionTextOutput | any {\n    // EvaluateFunction behaves slightly differently than the C# version.\n    // In C#, you can pass a (second) parameter `out textOutput` to get the\n    // text outputted by the function. This is not possible in js. Instead,\n    // we maintain the regular signature (functionName, args), plus an\n    // optional third parameter returnTextOutput. If set to true, we will\n    // return both the textOutput and the returned value, as an object.\n\n    if (this.onEvaluateFunction !== null)\n      this.onEvaluateFunction(functionName, args);\n\n    this.IfAsyncWeCant(\"evaluate a function\");\n\n    if (functionName == null) {\n      throw new Error(\"Function is null\");\n    } else if (functionName == \"\" || functionName.trim() == \"\") {\n      throw new Error(\"Function is empty or white space.\");\n    }\n\n    let funcContainer = this.KnotContainerWithName(functionName);\n    if (funcContainer == null) {\n      throw new Error(\"Function doesn't exist: '\" + functionName + \"'\");\n    }\n\n    let outputStreamBefore: InkObject[] = [];\n    outputStreamBefore.push(...this.state.outputStream);\n    this._state.ResetOutput();\n\n    this.state.StartFunctionEvaluationFromGame(funcContainer, args);\n\n    // Evaluate the function, and collect the string output\n    let stringOutput = new StringBuilder();\n    while (this.canContinue) {\n      stringOutput.Append(this.Continue());\n    }\n    let textOutput = stringOutput.toString();\n\n    this._state.ResetOutput(outputStreamBefore);\n\n    let result = this.state.CompleteFunctionEvaluationFromGame();\n    if (this.onCompleteEvaluateFunction != null)\n      this.onCompleteEvaluateFunction(functionName, args, textOutput, result);\n\n    return returnTextOutput ? { returned: result, output: textOutput } : result;\n  }\n\n  public EvaluateExpression(exprContainer: Container) {\n    let startCallStackHeight = this.state.callStack.elements.length;\n\n    this.state.callStack.Push(PushPopType.Tunnel);\n\n    this._temporaryEvaluationContainer = exprContainer;\n\n    this.state.GoToStart();\n\n    let evalStackHeight = this.state.evaluationStack.length;\n\n    this.Continue();\n\n    this._temporaryEvaluationContainer = null;\n\n    // Should have fallen off the end of the Container, which should\n    // have auto-popped, but just in case we didn't for some reason,\n    // manually pop to restore the state (including currentPath).\n    if (this.state.callStack.elements.length > startCallStackHeight) {\n      this.state.PopCallStack();\n    }\n\n    let endStackHeight = this.state.evaluationStack.length;\n    if (endStackHeight > evalStackHeight) {\n      return this.state.PopEvaluationStack();\n    } else {\n      return null;\n    }\n  }\n\n  public allowExternalFunctionFallbacks: boolean = false;\n\n  public CallExternalFunction(\n    funcName: string | null,\n    numberOfArguments: number\n  ) {\n    if (funcName === null) {\n      return throwNullException(\"funcName\");\n    }\n    let funcDef = this._externals.get(funcName);\n    let fallbackFunctionContainer = null;\n\n    let foundExternal = typeof funcDef !== \"undefined\";\n\n    if (\n      foundExternal &&\n      !funcDef!.lookAheadSafe &&\n      this._state.inStringEvaluation\n    ) {\n      this.Error(\n        \"External function \" +\n          funcName +\n          ' could not be called because 1) it wasn\\'t marked as lookaheadSafe when BindExternalFunction was called and 2) the story is in the middle of string generation, either because choice text is being generated, or because you have ink like \"hello {func()}\". You can work around this by generating the result of your function into a temporary variable before the string or choice gets generated: ~ temp x = ' +\n          funcName +\n          \"()\"\n      );\n    }\n\n    if (\n      foundExternal &&\n      !funcDef!.lookAheadSafe &&\n      this._stateSnapshotAtLastNewline !== null\n    ) {\n      this._sawLookaheadUnsafeFunctionAfterNewline = true;\n      return;\n    }\n\n    if (!foundExternal) {\n      if (this.allowExternalFunctionFallbacks) {\n        fallbackFunctionContainer = this.KnotContainerWithName(funcName);\n        this.Assert(\n          fallbackFunctionContainer !== null,\n          \"Trying to call EXTERNAL function '\" +\n            funcName +\n            \"' which has not been bound, and fallback ink function could not be found.\"\n        );\n\n        // Divert direct into fallback function and we're done\n        this.state.callStack.Push(\n          PushPopType.Function,\n          undefined,\n          this.state.outputStream.length\n        );\n        this.state.divertedPointer = Pointer.StartOf(fallbackFunctionContainer);\n        return;\n      } else {\n        this.Assert(\n          false,\n          \"Trying to call EXTERNAL function '\" +\n            funcName +\n            \"' which has not been bound (and ink fallbacks disabled).\"\n        );\n      }\n    }\n\n    // Pop arguments\n    let args: any[] = [];\n    for (let i = 0; i < numberOfArguments; ++i) {\n      // var poppedObj = state.PopEvaluationStack () as Value;\n      let poppedObj = asOrThrows(this.state.PopEvaluationStack(), Value);\n      let valueObj = poppedObj.valueObject;\n      args.push(valueObj);\n    }\n\n    // Reverse arguments from the order they were popped,\n    // so they're the right way round again.\n    args.reverse();\n\n    // Run the function!\n    let funcResult = funcDef!.function(args);\n\n    // Convert return value (if any) to the a type that the ink engine can use\n    let returnObj = null;\n    if (funcResult != null) {\n      returnObj = Value.Create(funcResult);\n      this.Assert(\n        returnObj !== null,\n        \"Could not create ink value from returned object of type \" +\n          typeof funcResult\n      );\n    } else {\n      returnObj = new Void();\n    }\n\n    this.state.PushEvaluationStack(returnObj);\n  }\n\n  public BindExternalFunctionGeneral(\n    funcName: string,\n    func: Story.ExternalFunction,\n    lookaheadSafe: boolean = true\n  ) {\n    this.IfAsyncWeCant(\"bind an external function\");\n    this.Assert(\n      !this._externals.has(funcName),\n      \"Function '\" + funcName + \"' has already been bound.\"\n    );\n    this._externals.set(funcName, {\n      function: func,\n      lookAheadSafe: lookaheadSafe,\n    });\n  }\n\n  public TryCoerce(value: any) {\n    // We're skipping type coercition in this implementation. First of, js\n    // is loosely typed, so it's not that important. Secondly, there is no\n    // clean way (AFAIK) for the user to describe what type of parameters\n    // they expect.\n    return value;\n  }\n\n  public BindExternalFunction(\n    funcName: string,\n    func: Story.ExternalFunction,\n    lookaheadSafe: boolean = false\n  ) {\n    this.Assert(func != null, \"Can't bind a null function\");\n\n    this.BindExternalFunctionGeneral(\n      funcName,\n      (args: any) => {\n        this.Assert(\n          args.length >= func.length,\n          \"External function expected \" + func.length + \" arguments\"\n        );\n\n        let coercedArgs = [];\n        for (let i = 0, l = args.length; i < l; i++) {\n          coercedArgs[i] = this.TryCoerce(args[i]);\n        }\n        return func.apply(null, coercedArgs);\n      },\n      lookaheadSafe\n    );\n  }\n\n  public UnbindExternalFunction(funcName: string) {\n    this.IfAsyncWeCant(\"unbind an external a function\");\n    this.Assert(\n      this._externals.has(funcName),\n      \"Function '\" + funcName + \"' has not been bound.\"\n    );\n    this._externals.delete(funcName);\n  }\n\n  public ValidateExternalBindings(): void;\n  public ValidateExternalBindings(\n    c: Container | null,\n    missingExternals: Set<string>\n  ): void;\n  public ValidateExternalBindings(\n    o: InkObject | null,\n    missingExternals: Set<string>\n  ): void;\n  public ValidateExternalBindings() {\n    let c: Container | null = null;\n    let o: InkObject | null = null;\n    let missingExternals: Set<string> = arguments[1] || new Set();\n\n    if (arguments[0] instanceof Container) {\n      c = arguments[0];\n    }\n\n    if (arguments[0] instanceof InkObject) {\n      o = arguments[0];\n    }\n\n    if (c === null && o === null) {\n      this.ValidateExternalBindings(\n        this._mainContentContainer,\n        missingExternals\n      );\n      this._hasValidatedExternals = true;\n\n      // No problem! Validation complete\n      if (missingExternals.size == 0) {\n        this._hasValidatedExternals = true;\n      } else {\n        let message = \"Error: Missing function binding for external\";\n        message += missingExternals.size > 1 ? \"s\" : \"\";\n        message += \": '\";\n        message += Array.from(missingExternals).join(\"', '\");\n        message += \"' \";\n        message += this.allowExternalFunctionFallbacks\n          ? \", and no fallback ink function found.\"\n          : \" (ink fallbacks disabled)\";\n\n        this.Error(message);\n      }\n    } else if (c != null) {\n      for (let innerContent of c.content) {\n        let container = innerContent as Container;\n        if (container == null || !container.hasValidName)\n          this.ValidateExternalBindings(innerContent, missingExternals);\n      }\n      for (let [, value] of c.namedContent) {\n        this.ValidateExternalBindings(\n          asOrNull(value, InkObject),\n          missingExternals\n        );\n      }\n    } else if (o != null) {\n      let divert = asOrNull(o, Divert);\n      if (divert && divert.isExternal) {\n        let name = divert.targetPathString;\n        if (name === null) {\n          return throwNullException(\"name\");\n        }\n        if (!this._externals.has(name)) {\n          if (this.allowExternalFunctionFallbacks) {\n            let fallbackFound =\n              this.mainContentContainer.namedContent.has(name);\n            if (!fallbackFound) {\n              missingExternals.add(name);\n            }\n          } else {\n            missingExternals.add(name);\n          }\n        }\n      }\n    }\n  }\n\n  public ObserveVariable(\n    variableName: string,\n    observer: Story.VariableObserver\n  ) {\n    this.IfAsyncWeCant(\"observe a new variable\");\n\n    if (this._variableObservers === null) this._variableObservers = new Map();\n\n    if (!this.state.variablesState.GlobalVariableExistsWithName(variableName))\n      throw new Error(\n        \"Cannot observe variable '\" +\n          variableName +\n          \"' because it wasn't declared in the ink story.\"\n      );\n\n    if (this._variableObservers.has(variableName)) {\n      this._variableObservers.get(variableName)!.push(observer);\n    } else {\n      this._variableObservers.set(variableName, [observer]);\n    }\n  }\n\n  public ObserveVariables(\n    variableNames: string[],\n    observers: Story.VariableObserver[]\n  ) {\n    for (let i = 0, l = variableNames.length; i < l; i++) {\n      this.ObserveVariable(variableNames[i], observers[i]);\n    }\n  }\n\n  public RemoveVariableObserver(\n    observer?: Story.VariableObserver,\n    specificVariableName?: string\n  ) {\n    // A couple of things to know about this method:\n    //\n    // 1. Since `RemoveVariableObserver` is exposed to the JavaScript world,\n    //    optionality is marked as `undefined` rather than `null`.\n    //    To keep things simple, null-checks are performed using regular\n    //    equality operators, where undefined == null.\n    //\n    // 2. Since C# delegates are translated to arrays of functions,\n    //    -= becomes a call to splice and null-checks are replaced by\n    //    emptiness-checks.\n    //\n    this.IfAsyncWeCant(\"remove a variable observer\");\n\n    if (this._variableObservers === null) return;\n\n    if (specificVariableName != null) {\n      if (this._variableObservers.has(specificVariableName)) {\n        if (observer != null) {\n          let variableObservers =\n            this._variableObservers.get(specificVariableName);\n          if (variableObservers != null) {\n            variableObservers.splice(variableObservers.indexOf(observer), 1);\n            if (variableObservers.length === 0) {\n              this._variableObservers.delete(specificVariableName);\n            }\n          }\n        } else {\n          this._variableObservers.delete(specificVariableName);\n        }\n      }\n    } else if (observer != null) {\n      let keys = this._variableObservers.keys();\n      for (let varName of keys) {\n        let variableObservers = this._variableObservers.get(varName);\n        if (variableObservers != null) {\n          variableObservers.splice(variableObservers.indexOf(observer), 1);\n          if (variableObservers.length === 0) {\n            this._variableObservers.delete(varName);\n          }\n        }\n      }\n    }\n  }\n\n  public VariableStateDidChangeEvent(\n    variableName: string,\n    newValueObj: InkObject\n  ) {\n    if (this._variableObservers === null) return;\n\n    let observers = this._variableObservers.get(variableName);\n    if (typeof observers !== \"undefined\") {\n      if (!(newValueObj instanceof Value)) {\n        throw new Error(\n          \"Tried to get the value of a variable that isn't a standard type\"\n        );\n      }\n      // var val = newValueObj as Value;\n      let val = asOrThrows(newValueObj, Value);\n\n      for (let observer of observers) {\n        observer(variableName, val.valueObject);\n      }\n    }\n  }\n\n  get globalTags() {\n    return this.TagsAtStartOfFlowContainerWithPathString(\"\");\n  }\n\n  public TagsForContentAtPath(path: string) {\n    return this.TagsAtStartOfFlowContainerWithPathString(path);\n  }\n\n  public TagsAtStartOfFlowContainerWithPathString(pathString: string) {\n    let path = new Path(pathString);\n\n    let flowContainer = this.ContentAtPath(path).container;\n    if (flowContainer === null) {\n      return throwNullException(\"flowContainer\");\n    }\n    while (true) {\n      let firstContent: InkObject = flowContainer.content[0];\n      if (firstContent instanceof Container) flowContainer = firstContent;\n      else break;\n    }\n\n    let inTag = false;\n    let tags: string[] | null = null;\n\n    for (let c of flowContainer.content) {\n      // var tag = c as Runtime.Tag;\n      let command = asOrNull(c, ControlCommand);\n\n      if (command != null) {\n        if (command.commandType == ControlCommand.CommandType.BeginTag) {\n          inTag = true;\n        } else if (command.commandType == ControlCommand.CommandType.EndTag) {\n          inTag = false;\n        }\n      } else if (inTag) {\n        let str = asOrNull(c, StringValue);\n        if (str !== null) {\n          if (tags === null) tags = [];\n          if (str.value !== null) tags.push(str.value);\n        } else {\n          this.Error(\n            \"Tag contained non-text content. Only plain text is allowed when using globalTags or TagsAtContentPath. If you want to evaluate dynamic content, you need to use story.Continue().\"\n          );\n        }\n      } else {\n        break;\n      }\n    }\n\n    return tags;\n  }\n\n  public BuildStringOfHierarchy() {\n    let sb = new StringBuilder();\n\n    this.mainContentContainer.BuildStringOfHierarchy(\n      sb,\n      0,\n      this.state.currentPointer.Resolve()\n    );\n\n    return sb.toString();\n  }\n\n  public BuildStringOfContainer(container: Container) {\n    let sb = new StringBuilder();\n    container.BuildStringOfHierarchy(\n      sb,\n      0,\n      this.state.currentPointer.Resolve()\n    );\n    return sb.toString();\n  }\n\n  public NextContent() {\n    this.state.previousPointer = this.state.currentPointer.copy();\n\n    if (!this.state.divertedPointer.isNull) {\n      this.state.currentPointer = this.state.divertedPointer.copy();\n      this.state.divertedPointer = Pointer.Null;\n\n      this.VisitChangedContainersDueToDivert();\n\n      if (!this.state.currentPointer.isNull) {\n        return;\n      }\n    }\n\n    let successfulPointerIncrement = this.IncrementContentPointer();\n\n    if (!successfulPointerIncrement) {\n      let didPop = false;\n\n      if (this.state.callStack.CanPop(PushPopType.Function)) {\n        this.state.PopCallStack(PushPopType.Function);\n\n        if (this.state.inExpressionEvaluation) {\n          this.state.PushEvaluationStack(new Void());\n        }\n\n        didPop = true;\n      } else if (this.state.callStack.canPopThread) {\n        this.state.callStack.PopThread();\n\n        didPop = true;\n      } else {\n        this.state.TryExitFunctionEvaluationFromGame();\n      }\n\n      if (didPop && !this.state.currentPointer.isNull) {\n        this.NextContent();\n      }\n    }\n  }\n\n  public IncrementContentPointer() {\n    let successfulIncrement = true;\n\n    let pointer = this.state.callStack.currentElement.currentPointer.copy();\n    pointer.index++;\n\n    if (pointer.container === null) {\n      return throwNullException(\"pointer.container\");\n    }\n    while (pointer.index >= pointer.container.content.length) {\n      successfulIncrement = false;\n\n      // Container nextAncestor = pointer.container.parent as Container;\n      let nextAncestor = asOrNull(pointer.container.parent, Container);\n      if (nextAncestor instanceof Container === false) {\n        break;\n      }\n\n      let indexInAncestor = nextAncestor!.content.indexOf(pointer.container);\n      if (indexInAncestor == -1) {\n        break;\n      }\n\n      pointer = new Pointer(nextAncestor, indexInAncestor);\n\n      pointer.index++;\n\n      successfulIncrement = true;\n      if (pointer.container === null) {\n        return throwNullException(\"pointer.container\");\n      }\n    }\n\n    if (!successfulIncrement) pointer = Pointer.Null;\n\n    this.state.callStack.currentElement.currentPointer = pointer.copy();\n\n    return successfulIncrement;\n  }\n\n  public TryFollowDefaultInvisibleChoice() {\n    let allChoices = this._state.currentChoices;\n\n    let invisibleChoices = allChoices.filter((c) => c.isInvisibleDefault);\n\n    if (\n      invisibleChoices.length == 0 ||\n      allChoices.length > invisibleChoices.length\n    )\n      return false;\n\n    let choice = invisibleChoices[0];\n\n    if (choice.targetPath === null) {\n      return throwNullException(\"choice.targetPath\");\n    }\n\n    if (choice.threadAtGeneration === null) {\n      return throwNullException(\"choice.threadAtGeneration\");\n    }\n\n    this.state.callStack.currentThread = choice.threadAtGeneration;\n\n    if (this._stateSnapshotAtLastNewline !== null) {\n      this.state.callStack.currentThread = this.state.callStack.ForkThread();\n    }\n\n    this.ChoosePath(choice.targetPath, false);\n\n    return true;\n  }\n\n  public NextSequenceShuffleIndex() {\n    // var numElementsIntVal = state.PopEvaluationStack () as IntValue;\n    let numElementsIntVal = asOrNull(this.state.PopEvaluationStack(), IntValue);\n    if (!(numElementsIntVal instanceof IntValue)) {\n      this.Error(\"expected number of elements in sequence for shuffle index\");\n      return 0;\n    }\n\n    let seqContainer = this.state.currentPointer.container;\n    if (seqContainer === null) {\n      return throwNullException(\"seqContainer\");\n    }\n\n    // Originally a primitive type, but here, can be null.\n    // TODO: Replace by default value?\n    if (numElementsIntVal.value === null) {\n      return throwNullException(\"numElementsIntVal.value\");\n    }\n    let numElements = numElementsIntVal.value;\n\n    // var seqCountVal = state.PopEvaluationStack () as IntValue;\n    let seqCountVal = asOrThrows(this.state.PopEvaluationStack(), IntValue);\n    let seqCount = seqCountVal.value;\n\n    // Originally a primitive type, but here, can be null.\n    // TODO: Replace by default value?\n    if (seqCount === null) {\n      return throwNullException(\"seqCount\");\n    }\n\n    let loopIndex = seqCount / numElements;\n    let iterationIndex = seqCount % numElements;\n\n    let seqPathStr = seqContainer.path.toString();\n    let sequenceHash = 0;\n    for (let i = 0, l = seqPathStr.length; i < l; i++) {\n      sequenceHash += seqPathStr.charCodeAt(i) || 0;\n    }\n    let randomSeed = sequenceHash + loopIndex + this.state.storySeed;\n    let random = new PRNG(Math.floor(randomSeed));\n\n    let unpickedIndices = [];\n    for (let i = 0; i < numElements; ++i) {\n      unpickedIndices.push(i);\n    }\n\n    for (let i = 0; i <= iterationIndex; ++i) {\n      let chosen = random.next() % unpickedIndices.length;\n      let chosenIndex = unpickedIndices[chosen];\n      unpickedIndices.splice(chosen, 1);\n\n      if (i == iterationIndex) {\n        return chosenIndex;\n      }\n    }\n\n    throw new Error(\"Should never reach here\");\n  }\n\n  public Error(message: string, useEndLineNumber = false): never {\n    let e = new StoryException(message);\n    e.useEndLineNumber = useEndLineNumber;\n    throw e;\n  }\n\n  public Warning(message: string) {\n    this.AddError(message, true);\n  }\n\n  public AddError(\n    message: string,\n    isWarning = false,\n    useEndLineNumber = false\n  ) {\n    let dm = this.currentDebugMetadata;\n\n    let errorTypeStr = isWarning ? \"WARNING\" : \"ERROR\";\n\n    if (dm != null) {\n      let lineNum = useEndLineNumber ? dm.endLineNumber : dm.startLineNumber;\n      message =\n        \"RUNTIME \" +\n        errorTypeStr +\n        \": '\" +\n        dm.fileName +\n        \"' line \" +\n        lineNum +\n        \": \" +\n        message;\n    } else if (!this.state.currentPointer.isNull) {\n      message =\n        \"RUNTIME \" +\n        errorTypeStr +\n        \": (\" +\n        this.state.currentPointer +\n        \"): \" +\n        message;\n    } else {\n      message = \"RUNTIME \" + errorTypeStr + \": \" + message;\n    }\n\n    this.state.AddError(message, isWarning);\n\n    // In a broken state don't need to know about any other errors.\n    if (!isWarning) this.state.ForceEnd();\n  }\n\n  public Assert(condition: boolean, message: string | null = null) {\n    if (condition == false) {\n      if (message == null) {\n        message = \"Story assert\";\n      }\n\n      throw new Error(message + \" \" + this.currentDebugMetadata);\n    }\n  }\n\n  get currentDebugMetadata(): DebugMetadata | null {\n    let dm: DebugMetadata | null;\n\n    let pointer = this.state.currentPointer;\n    if (!pointer.isNull && pointer.Resolve() !== null) {\n      dm = pointer.Resolve()!.debugMetadata;\n      if (dm !== null) {\n        return dm;\n      }\n    }\n\n    for (let i = this.state.callStack.elements.length - 1; i >= 0; --i) {\n      pointer = this.state.callStack.elements[i].currentPointer;\n      if (!pointer.isNull && pointer.Resolve() !== null) {\n        dm = pointer.Resolve()!.debugMetadata;\n        if (dm !== null) {\n          return dm;\n        }\n      }\n    }\n\n    for (let i = this.state.outputStream.length - 1; i >= 0; --i) {\n      let outputObj = this.state.outputStream[i];\n      dm = outputObj.debugMetadata;\n      if (dm !== null) {\n        return dm;\n      }\n    }\n\n    return null;\n  }\n\n  get mainContentContainer() {\n    if (this._temporaryEvaluationContainer) {\n      return this._temporaryEvaluationContainer;\n    } else {\n      return this._mainContentContainer;\n    }\n  }\n\n  /**\n   * `_mainContentContainer` is almost guaranteed to be set in the\n   * constructor, unless the json is malformed.\n   */\n  private _mainContentContainer!: Container;\n  private _listDefinitions: ListDefinitionsOrigin | null = null;\n\n  private _externals: Map<string, Story.ExternalFunctionDef>;\n  private _variableObservers: Map<string, Story.VariableObserver[]> | null =\n    null;\n  private _hasValidatedExternals: boolean = false;\n\n  private _temporaryEvaluationContainer: Container | null = null;\n\n  /**\n   * `state` is almost guaranteed to be set in the constructor, unless\n   * using the compiler-specific constructor which will likely not be used in\n   * the real world.\n   */\n  private _state!: StoryState;\n\n  private _asyncContinueActive: boolean = false;\n  private _stateSnapshotAtLastNewline: StoryState | null = null;\n  private _sawLookaheadUnsafeFunctionAfterNewline: boolean = false;\n\n  private _recursiveContinueCount: number = 0;\n\n  private _asyncSaving: boolean = false;\n\n  private _profiler: any | null = null; // TODO: Profiler\n}\n\nexport namespace Story {\n  export enum OutputStateChange {\n    NoChange = 0,\n    ExtendedBeyondNewline = 1,\n    NewlineRemoved = 2,\n  }\n\n  export interface EvaluateFunctionTextOutput {\n    returned: any;\n    output: string;\n  }\n\n  export interface ExternalFunctionDef {\n    function: ExternalFunction;\n    lookAheadSafe: boolean;\n  }\n\n  export type VariableObserver = (variableName: string, newValue: any) => void;\n  export type ExternalFunction = (...args: any) => any;\n}\n"],"names":["Path","constructor","this","_components","_componentsString","_isRelative","arguments","componentsString","Component","head","tail","push","concat","Array","relative","isRelative","componentCount","length","tailComps","slice","self","lastComponent","lastComponentIdx","containsNamedComponent","i","l","isIndex","path","GetComponent","index","PathByAppendingPath","pathToAppend","p","upwardMoves","isParent","join","value","substring","componentStrings","split","str","test","parseInt","toString","Equals","otherPath","PathByAppendingComponent","c","Debug","ValueType","PushPopType","ErrorType","asOrNull","obj","type","unsafeTypeAssertion","asOrThrows","Error","asINamedContentOrNull","hasValidName","name","nullIfUndefined","isEquatable","parentId","indexOrName","ToParent","otherComp","Assert","condition","message","console","warn","trace","AssertType","variable","NullException","throwNullException","InkObject","parent","_debugMetadata","_path","debugMetadata","ownDebugMetadata","DebugLineNumberOfPath","root","rootContentContainer","targetContent","ContentAtPath","dm","startLineNumber","comps","child","container","Container","namedChild","unshift","content","indexOf","ResolvePath","nearestContainer","contentContainer","ConvertPathToRelative","globalPath","ownPath","minPathLength","Math","min","lastSharedPathCompIndex","ownComp","numUpwardsMoves","newPathComps","up","down","CompactPathString","globalPathStr","relativePathStr","ancestor","Copy","SetChild","prop","StringBuilder","string","Length","Append","AppendLine","AppendFormat","format","_len","args","_key","replace","match","num","Clear","InkListItem","originName","itemName","nameParts","Null","isNull","fullName","otherItem","copy","serialized","JSON","stringify","fromSerializedKey","key","parse","isLikeInkListItem","inkListItem","item","hasOwnProperty","InkList","Map","super","origins","_originNames","otherList","otherOriginNames","originNames","singleOriginListName","originStory","SetInitialOriginName","listDefinitions","def","TryListGetDefinition","exists","result","singleElement","Add","Key","Value","FromString","myListItem","listValue","_a","FindSingleItemListWithName","AddItem","itemOrItemName","storyObject","undefined","origin","intVal","TryGetValueForItem","foundListDef","ContainsItemWithName","newItem","orderedItems","itemVal","ValueForItem","ContainsItemNamed","ContainsKey","has","serializedKey","set","Remove","delete","Count","size","originOfMaxItem","maxOriginName","maxItem","every","initialOriginName","SetInitialOriginNames","initialOriginNames","max","minItem","inverse","list","items","all","Union","union","Intersect","intersection","HasIntersection","Without","listToRemove","Contains","what","GreaterThan","GreaterThanOrEquals","LessThan","LessThanOrEquals","MaxAsList","MinAsList","ListWithSubRange","minBound","maxBound","ordered","minValue","maxValue","Number","MAX_SAFE_INTEGER","isInteger","subList","otherInkList","sort","x","y","localeCompare","singleItem","sb","valueOf","NaN","StoryException","useEndLineNumber","tryGetValueFromMap","map","val","get","AbstractValue","Create","preferredNumberType","Int","IntValue","Float","isNaN","FloatValue","BoolValue","Boolean","StringValue","String","DivertTargetValue","ListValue","valueObject","BadCastException","targetType","valueType","isTruthy","Bool","Cast","newType","_isNewline","_isInlineWhitespace","isNewline","isInlineWhitespace","isNonWhitespace","parsedInt","defaultValue","tryParseInt","parsedFloat","parseFloat","tryParseFloat","DivertTarget","targetPath","VariablePointerValue","variableName","contextIndex","_contextIndex","VariablePointer","List","listOrSingleItem","singleValue","RetainListOriginsForAssignment","oldValue","newValue","oldList","newList","SearchResult","approximate","correctObj","searchResult","_content","namedContent","visitsShouldBeCounted","turnIndexShouldBeCounted","countingAtStartOnly","_pathToFirstLeafContent","AddContent","namedOnlyContent","namedOnlyContentDict","inkObject","named","existingNamedOnly","AddToNamedContentOnly","countFlags","flags","CountFlags","Visits","Turns","CountStartOnly","flag","pathToFirstLeafContent","internalPathToFirstLeafContent","components","contentObjOrList","contentList","contentObj","TryAddNamedContent","namedContentObj","partialPathStart","partialPathLength","currentContainer","currentObj","comp","foundObj","ContentWithPathComponent","nextContainer","InsertContent","splice","AddContentsOfContainer","otherContainer","component","foundContent","BuildStringOfHierarchy","indentation","pointedObj","appendIndentation","onlyNamed","Glue","ControlCommand","commandType","_commandType","CommandType","NotSet","EvalStart","EvalOutput","EvalEnd","Duplicate","PopEvaluatedValue","PopFunction","PopTunnel","BeginString","EndString","NoOp","ChoiceCount","TurnsSince","ReadCount","Random","SeedRandom","VisitIndex","SequenceShuffleIndex","StartThread","Done","End","ListFromInt","ListRange","ListRandom","BeginTag","EndTag","Pointer","Resolve","StartOf","Divert","_targetPath","targetObj","targetPointer","_targetPointer","targetPathString","hasVariableTarget","variableDivertName","stackPushType","pushesToStack","isExternal","externalArgs","isConditional","otherDivert","targetStr","Function","ChoicePoint","onceOnly","_pathOnChoice","hasCondition","hasStartContent","hasChoiceOnlyContent","isInvisibleDefault","pathOnChoice","choiceTargetObj","choiceTarget","pathStringOnChoice","VariableReference","containerForCount","pathForCount","pathStringForCount","VariableAssignment","isNewDeclaration","isGlobal","Void","NativeFunctionCall","CallWithName","functionName","CallExistsWithName","GenerateNativeFunctionsIfNecessary","_nativeFunctions","_name","_isPrototype","_prototype","numberOfParameters","_numberOfParameters","Call","parameters","hasList","CallBinaryListOperation","coercedParams","CoerceValuesToSingleType","coercedType","CallType","parametersOfSingleType","param1","valType","val1","paramCount","_operationFuncs","opForTypeObj","val2","opForType","resultVal","CallListIncrementOperation","v1","v2","op","asBooleanOrThrows","listIntParams","listVal","resultInkList","listItemKey","listItemValue","listItem","intOp","targetInt","itemOrigin","incrementedItem","TryGetItemWithValue","parametersIn","specialCaseList","parametersOut","inkObjectVal","castedValue","Identity","t","AddIntBinaryOp","Subtract","Multiply","Divide","floor","Mod","AddIntUnaryOp","Negate","Equal","Greater","Less","NotEquals","Not","And","Or","Max","Min","Pow","pow","Floor","Ceiling","AddFloatBinaryOp","AddFloatUnaryOp","ceil","AddStringBinaryOp","Has","includes","Hasnt","AddListBinaryOp","AddListUnaryOp","Invert","All","ListMin","ListMax","ValueOfList","divertTargetsEqual","d1","d2","divertTargetsNotEqual","AddOpToNativeFunc","AddOpFuncForType","nativeFunc","Tag","tagText","text","Choice","threadAtGeneration","sourcePath","tags","originalThreadIndex","Clone","ListDefinition","_items","_itemNameToValues","ContainsItem","ListDefinitionsOrigin","lists","_lists","_allUnambiguousListValueCache","listOfLists","definition","JsonSerialisation","JArrayToRuntimeObjList","jArray","skipLast","count","jTok","runtimeObj","JTokenToRuntimeObject","WriteDictionaryRuntimeObjs","writer","dictionary","WriteObjectStart","WritePropertyStart","WriteRuntimeObject","WritePropertyEnd","WriteObjectEnd","WriteListRuntimeObjs","WriteArrayStart","WriteArrayEnd","WriteIntDictionary","dict","WriteIntProperty","WriteRuntimeContainer","divert","divTypeKey","Tunnel","WriteProperty","choicePoint","boolVal","WriteBool","WriteInt","floatVal","WriteFloat","strVal","Write","WriteStringStart","WriteStringInner","WriteStringEnd","WriteInkList","divTargetVal","varPtrVal","controlCmd","_controlCommandNames","varRef","readCountPath","varAss","tag","choice","WriteChoice","JObjectToDictionaryRuntimeObjs","jObject","JObjectToIntDictionary","token","floatRepresentation","exec","firstChar","isArray","propValue","varPtr","isDivert","divPushType","external","target","readCountVarRef","isVarAss","isGlobalVar","varName","isNewDecl","listContent","rawList","namesAsObjs","nameToVal","JObjectToChoice","JArrayToContainer","toJson","me","removes","space","k","v","some","r","withoutName","hasNameProperty","hasTerminator","namedContainer","WriteNull","terminatingObj","namedContentItem","namedSubContainer","jObj","JArrayToTags","WriteChoiceTags","WritePropertyNameStart","WritePropertyNameInner","WritePropertyNameEnd","ListDefinitionsToJToken","listDefJson","JTokenToListDefinitions","defsObj","allDefs","nameValueKey","nameValue","TOTAL_VALUES","CallStack","elements","callStack","depth","currentElement","cs","_threads","callstack","currentElementIndex","currentThread","canPop","_threadCounter","_startOfRoot","Story","storyContext","Reset","toCopy","otherThread","Thread","Element","SetJsonToken","jThreads","jThreadTok","jThreadObj","thread","WriteJson","w","WriteObject","PushThread","newThread","threadIndex","ForkThread","forkedThread","PopThread","canPopThread","elementIsEvaluateFromGame","FunctionEvaluationFromGame","Push","externalEvaluationStackHeight","outputStreamLengthWithPushed","element","currentPointer","evaluationStackHeightWhenPushed","functionStartInOutputStream","CanPop","Pop","pop","GetTemporaryVariableWithName","varValue","temporaryVariables","SetTemporaryVariable","declareNew","contextElement","ContextForVariableNamed","ThreadWithIndex","filtered","filter","callStackTrace","isCurrent","pointer","inExpressionEvaluation","previousPointer","jThreadCallstack","jElTok","currentContainerPathStr","jElementObj","pushPopType","currentContainerPathStrToken","threadPointerResult","Warning","el","temps","clear","prevContentObjPath","prevPath","PointerAtPath","e","resolvedPointer","VariablesState","variableChangedEvent","callback","variableChangedEventCallbacks","StartVariableObservation","_batchObservingVariableChanges","_changedVariablesForBatchObs","Set","CompleteVariableObservation","changedVars","currentValue","_globalVariables","patch","changedVariables","patchedVal","TryGetGlobal","NotifyObservers","_callStack","$","varContents","_defaultGlobalVariables","SetGlobal","listDefsOrigin","_listDefsOrigin","Proxy","ownKeys","keys","getOwnPropertyDescriptor","enumerable","configurable","ApplyPatch","namedVarKey","namedVarValue","globals","add","jToken","varValKey","varValValue","loadedToken","tokenInkObject","keyValKey","keyValValue","dontSaveDefaultValues","defaultVal","RuntimeObjectsEqual","obj1","obj2","GetVariableWithName","GetRawVariableWithName","varPointer","ValueAtVariablePointer","TryGetDefaultVariableValue","GlobalVariableExistsWithName","variableValue","Assign","setGlobal","ResolveVariablePointer","existingPointer","SnapshotDefaultGlobals","AddChangedVariable","GetContextIndexOfVariableNamed","doubleRedirectionPointer","ObserveVariableChange","PRNG","seed","next","nextFloat","StatePatch","_globals","_changedVariables","visitCounts","_visitCounts","turnIndices","_turnIndices","TryGetVisitCount","SetVisitCount","SetTurnIndex","TryGetTurnIndex","SimpleJson","TextToDictionary","Reader","ToDictionary","TextToArray","ToArray","_","__","context","explicitFloatReviver","source","endsWith","_rootObject","jsonWithExplicitFloat","Writer","_currentPropertyName","_currentString","_stateStack","_collectionStack","_propertyNameStack","_jsonObject","inner","StartNewObject","newObject","state","State","Property","currentCollection","currentPropertyName","propertyName","None","StateElement","Object","innerOrContent","WriteFloatProperty","IncrementChildCount","childCount","PropertyName","_addToCurrentObject","error","POSITIVE_INFINITY","NEGATIVE_INFINITY","currEl","Flow","story","outputStream","currentChoices","jChoiceThreadsObj","LoadFlowChoiceThreads","hasChoiceThreads","jChoiceThreads","foundActiveThread","jSavedChoiceThread","StoryState","ToJson","indented","LoadJson","json","LoadJsonObj","onDidLoadState","VisitCountAtPathString","pathString","visitCountOut","_patch","VisitCountForContainer","containerPathStr","count2","IncrementVisitCountForContainer","currCount","RecordTurnIndexVisitToContainer","currentTurnIndex","TurnsSinceForContainer","index2","callstackDepth","_currentFlow","canContinue","generatedChoices","currentErrors","_currentErrors","currentWarnings","_currentWarnings","variablesState","_variablesState","evaluationStack","_evaluationStack","_currentTurnIndex","currentPathString","previousPathString","hasError","hasWarning","currentText","_outputStreamTextDirty","inTag","outputObj","textContent","controlCommand","_currentText","CleanOutputWhitespace","currentWhitespaceStart","startOfLine","charAt","currentTags","_outputStreamTagsDirty","_currentTags","txt","currentFlowName","currentFlowIsDefaultFlow","kDefaultFlowName","aliveFlowNames","_aliveFlowNamesDirty","_aliveFlowNames","_namedFlows","flowName","kInkSaveStateVersion","kMinCompatibleLoadVersion","divertedPointer","storySeed","previousRandom","didSafeExit","OutputStreamDirty","timeSeed","Date","getTime","GoToStart","mainContentContainer","SwitchFlow_Internal","flow","SwitchToDefaultFlow_Internal","RemoveFlow_Internal","CopyAndStartPatching","forBackgroundSave","namedFlowKey","namedFlowValue","RestoreAfterPatch","ApplyAnyPatch","ApplyCountChanges","newCount","isVisit","inkVersionCurrent","jSaveVersion","flowsObj","flowsObjDict","flowsObjDictEntries","entries","namedFlowObjKey","namedFlowObjValue","flowObj","currFlowName","currentDivertTargetPath","divertPath","ResetErrors","ResetOutput","objs","PushToOutputStream","listText","TrySplittingHeadTailWhitespace","textObj","PushToOutputStreamIndividual","PopFromOutputStream","single","headFirstNewlineIdx","headLastNewlineIdx","tailLastNewlineIdx","tailFirstNewlineIdx","listTexts","innerStrStart","innerStrEnd","leadingSpaces","innerStrText","numSpaces","trailingSpaces","glue","includeInOutput","TrimNewlinesFromOutputStream","functionTrimIndex","glueTrimIndex","o","trimIndex","RemoveExistingGlue","callStackElements","outputStreamEndsInNewline","outputStreamContainsContent","removeWhitespaceFrom","cmd","inStringEvaluation","PushEvaluationStack","n","PopEvaluationStack","numberOfObjects","PeekEvaluationStack","ForceEnd","TrimWhitespaceFromFunctionEnd","functionStartPoint","PopCallStack","popType","SetChosenPath","incrementingTurnIndex","newPointer","StartFunctionEvaluationFromGame","funcContainer","PassArgumentsToEvaluationStack","TryExitFunctionEvaluationFromGame","CompleteFunctionEvaluationFromGame","originalEvaluationStackHeight","returnedObj","poppedObj","returnVal","AddError","isWarning","Stopwatch","startTime","ElapsedMilliseconds","Start","Stop","nVal","isFinite","choices","_state","IfAsyncWeCant","_listDefinitions","StartProfiling","EndProfiling","inkVersionMinimumCompatible","onError","onDidContinue","onMakeChoice","onEvaluateFunction","onCompleteEvaluateFunction","onChoosePathString","_prevContainers","allowExternalFunctionFallbacks","_variableObservers","_hasValidatedExternals","_temporaryEvaluationContainer","_asyncContinueActive","_stateSnapshotAtLastNewline","_sawLookaheadUnsafeFunctionAfterNewline","_recursiveContinueCount","_asyncSaving","_profiler","_mainContentContainer","jsonString","_externals","rootObject","versionObj","formatFromFile","listDefsObj","rootToken","ResetState","shouldReturn","VariableStateDidChangeEvent","bind","ResetGlobals","ResetCallstack","originalPointer","ChoosePath","ContinueInternal","SwitchFlow","RemoveFlow","SwitchToDefaultFlow","Continue","ContinueAsync","asyncContinueComplete","millisecsLimitAsync","ValidateExternalBindings","PreContinue","isAsyncTimeLimited","durationStopwatch","ContinueSingleStep","changedVariablesToObserve","RestoreStateSnapshot","PostContinue","err","PreStep","Step","PostStep","TryFollowDefaultInvisibleChoice","PreSnapshot","change","CalculateNewlineOutputStateChange","OutputStateChange","ExtendedBeyondNewline","NewlineRemoved","DiscardSnapshot","StateSnapshot","PostSnapshot","prevText","currText","prevTagCount","currTagCount","newlineStillExists","NoChange","ContinueMaximally","KnotContainerWithName","pathLengthToUse","CopyStateForBackgroundThreadSave","stateToSave","BackgroundSaveComplete","shouldAddToStream","containerToEnter","VisitContainer","currentContentObj","isLogicOrFlowControl","PerformLogicAndFlowControl","ProcessChoice","contextIdx","NextContent","atStart","VisitChangedContainersDueToDivert","prevAncestor","currentChildOfContainer","currentContainerAncestor","allChildrenEnteredAtStart","enteringAtStart","PopChoiceStringAndTags","choiceOnlyStrVal","showChoice","conditionValue","IsTruthy","startText","choiceOnlyText","reverse","divTarget","currentDivert","intContent","errorMessage","CallExternalFunction","sourceName","evalCommand","output","overrideTunnelReturnTarget","popped","names","expected","errorMsg","contentStackForTag","outputCountConsumed","command","choiceTag","contentStackForString","contentToRetain","rescuedTag","choiceCount","extraNote","eitherCount","divertTarget","maxInt","minInt","randomRange","resultSeed","nextRandom","chosenValue","shuffleIndex","NextSequenceShuffleIndex","listNameVal","generatedListValue","foundItem","targetList","listItemIndex","listEnumerator","randomItem","assignedVal","foundValue","func","funcParams","ChoosePathString","resetCallstack","funcDetail","activityStr","ChooseChoiceIndex","choiceIdx","choiceToChoose","HasFunction","EvaluateFunction","returnTextOutput","trim","outputStreamBefore","stringOutput","textOutput","returned","EvaluateExpression","exprContainer","startCallStackHeight","evalStackHeight","funcName","numberOfArguments","funcDef","fallbackFunctionContainer","foundExternal","lookAheadSafe","valueObj","funcResult","function","returnObj","BindExternalFunctionGeneral","lookaheadSafe","TryCoerce","BindExternalFunction","coercedArgs","apply","UnbindExternalFunction","missingExternals","from","innerContent","ObserveVariable","observer","ObserveVariables","variableNames","observers","RemoveVariableObserver","specificVariableName","variableObservers","newValueObj","globalTags","TagsAtStartOfFlowContainerWithPathString","TagsForContentAtPath","flowContainer","firstContent","BuildStringOfContainer","IncrementContentPointer","didPop","successfulIncrement","nextAncestor","indexInAncestor","allChoices","invisibleChoices","numElementsIntVal","seqContainer","numElements","seqCount","loopIndex","iterationIndex","seqPathStr","sequenceHash","charCodeAt","randomSeed","random","unpickedIndices","chosen","chosenIndex","currentDebugMetadata","errorTypeStr","lineNum","endLineNumber","fileName"],"mappings":"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"}