type A* = proc () {.cdecl.}
type B* = proc () {.cdecl.}
type C* = proc (a0: int32, a1: int32): bool {.cdecl.}
type D* = proc (a0: int32): (proc (a0: float32): bool {.cdecl.}) {.cdecl.}
type E* = proc (): (ptr array[16, int32]) {.cdecl.}
type F* = ptr int32
type G* = ptr (ptr int32)
type H* = ptr (ptr int32)
type I* = ptr array[16, int32]
type J* = ptr (proc (a0: float32): float64 {.cdecl.})
type K* = array[16, int32]
type L* = array[16, ptr int32]
type M* = array[16, proc (a0: int32, a1: int32): bool {.cdecl.}]
type N* = array[16, proc (a0: int32, a1: int32) {.cdecl.}]
type P* = proc (named1st: int32, a1: bool, named3rd: bool, wild: int32) {.cdecl.}
type Q* = proc (v: pointer) {.cdecl.}
proc O*(): (proc () {.cdecl.}) {.importc: "O".}
proc root*(a: A,
b: B,
c: C,
d: D,
e: E,
f: F,
g: G,
h: H,
i: I,
j: J,
k: K,
l: L,
m: M,
n: N,
p: P,
q: Q) {.importc: "root".}