user: 请从给定的汇编指令推导出C源代码:

```asm
<compute_cell_geometry>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x180,%rsp
  mov    %edi,-0x124(%rbp)
  mov    %rsi,-0x130(%rbp)
  mov    %rdx,-0x138(%rbp)
  mov    %rcx,-0x140(%rbp)
  mov    %r8,-0x148(%rbp)
  mov    %r9,-0x150(%rbp)
  mov    0x10(%rbp),%rax
  mov    %rax,-0x158(%rbp)
  mov    0x20(%rbp),%rax
  mov    %rax,-0x160(%rbp)
  mov    0x28(%rbp),%rax
  mov    %rax,-0x168(%rbp)
  mov    0x30(%rbp),%rax
  mov    %rax,-0x170(%rbp)
  mov    0x38(%rbp),%rax
  mov    %rax,-0x178(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movq   $0x0,-0x20(%rbp)
  movq   $0x0,-0x18(%rbp)
  movq   $0x0,-0x10(%rbp)
  movsd  D60(%rip),%xmm0
  movsd  %xmm0,-0xe8(%rbp)
  movl   $0x0,-0x114(%rbp)
  jmp    L448
L315:
  movl   $0x0,-0x120(%rbp)
  jmp    L146
L43:
  mov    -0x120(%rbp),%eax
  cltq
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x60(%rbp,%rax,8)
  addl   $0x1,-0x120(%rbp)
L146:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L43
  movl   $0x0,-0x120(%rbp)
  jmp    L38
L93:
  mov    -0x120(%rbp),%eax
  cltq
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x40(%rbp,%rax,8)
  addl   $0x1,-0x120(%rbp)
L38:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L93
  mov    -0x114(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x160(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x118(%rbp)
  jmp    L57
L310:
  mov    -0x118(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x168(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x10c(%rbp)
  movl   $0x0,-0x120(%rbp)
  jmp    L54
L162:
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0x60(%rbp,%rax,8),%xmm1
  mov    -0x10c(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %eax,%edx
  mov    -0x120(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x158(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x120(%rbp),%eax
  cltq
  movsd  %xmm0,-0x60(%rbp,%rax,8)
  addl   $0x1,-0x120(%rbp)
L54:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L162
  addl   $0x1,-0x118(%rbp)
L57:
  mov    -0x114(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x160(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,-0x118(%rbp)
  jl     L310
  mov    -0x114(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x160(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    -0x114(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x160(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rdx),%edx
  sub    %edx,%eax
  mov    %eax,-0x110(%rbp)
  movl   $0x0,-0x120(%rbp)
  jmp    L281
L216:
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0x60(%rbp,%rax,8),%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sdl -0x110(%rbp),%xmm1
  divsd  %xmm1,%xmm0
  mov    -0x120(%rbp),%eax
  cltq
  movsd  %xmm0,-0x60(%rbp,%rax,8)
  addl   $0x1,-0x120(%rbp)
L281:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L216
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x100(%rbp)
  mov    -0x114(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x160(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x118(%rbp)
  jmp    L417
L126:
  movl   $0x0,-0x120(%rbp)
  jmp    L317
L213:
  mov    -0x120(%rbp),%eax
  cltq
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0xe0(%rbp,%rax,8)
  addl   $0x1,-0x120(%rbp)
L317:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L213
  movl   $0x0,-0x120(%rbp)
  jmp    L156
L147:
  mov    -0x120(%rbp),%eax
  cltq
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x20(%rbp,%rax,8)
  addl   $0x1,-0x120(%rbp)
L156:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L147
  mov    -0x118(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x168(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x10c(%rbp)
  mov    -0x10c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x138(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x11c(%rbp)
  jmp    L398
L128:
  mov    -0x11c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x140(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x104(%rbp)
  movl   $0x0,-0x120(%rbp)
  jmp    L256
L275:
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0xe0(%rbp,%rax,8),%xmm1
  mov    -0x104(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %eax,%edx
  mov    -0x120(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x130(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x120(%rbp),%eax
  cltq
  movsd  %xmm0,-0xe0(%rbp,%rax,8)
  addl   $0x1,-0x120(%rbp)
L256:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L275
  addl   $0x1,-0x11c(%rbp)
L398:
  mov    -0x10c(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x138(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,-0x11c(%rbp)
  jl     L128
  mov    -0x10c(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x138(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    -0x10c(%rbp),%edx
  movslq %edx,%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    -0x138(%rbp),%rdx
  add    %rcx,%rdx
  mov    (%rdx),%edx
  sub    %edx,%eax
  mov    %eax,-0x108(%rbp)
  movl   $0x0,-0x120(%rbp)
  jmp    L251
L29:
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0xe0(%rbp,%rax,8),%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sdl -0x108(%rbp),%xmm1
  divsd  %xmm1,%xmm0
  mov    -0x120(%rbp),%eax
  cltq
  movsd  %xmm0,-0xe0(%rbp,%rax,8)
  addl   $0x1,-0x120(%rbp)
L251:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L29
  mov    -0x10c(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x138(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cltq
  shl    $0x2,%rax
  lea    -0x4(%rax),%rdx
  mov    -0x140(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x104(%rbp)
  movl   $0x0,-0x120(%rbp)
  jmp    L426
L151:
  mov    -0x104(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %eax,%edx
  mov    -0x120(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x130(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0xe0(%rbp,%rax,8),%xmm1
  subsd  %xmm1,%xmm0
  mov    -0x120(%rbp),%eax
  cltq
  movsd  %xmm0,-0xc0(%rbp,%rax,8)
  addl   $0x1,-0x120(%rbp)
L426:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L151
  mov    -0x10c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x138(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x11c(%rbp)
  jmp    L46
L250:
  mov    -0x11c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x140(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x104(%rbp)
  movl   $0x0,-0x120(%rbp)
  jmp    L133
L294:
  mov    -0x104(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %eax,%edx
  mov    -0x120(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x130(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0xe0(%rbp,%rax,8),%xmm1
  subsd  %xmm1,%xmm0
  mov    -0x120(%rbp),%eax
  cltq
  movsd  %xmm0,-0xa0(%rbp,%rax,8)
  addl   $0x1,-0x120(%rbp)
L133:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L294
  lea    -0x80(%rbp),%rdx
  lea    -0xa0(%rbp),%rcx
  lea    -0xc0(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <cross@plt>
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0xf8(%rbp)
  movl   $0x0,-0x120(%rbp)
  jmp    L365
L195:
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0x80(%rbp,%rax,8),%xmm1
  movsd  D36(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0xe0(%rbp,%rax,8),%xmm0
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0x60(%rbp,%rax,8),%xmm2
  subsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  movsd  -0xf8(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0xf8(%rbp)
  addl   $0x1,-0x120(%rbp)
L365:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L195
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0xf0(%rbp)
  movl   $0x0,-0x120(%rbp)
  jmp    L111
L141:
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0x80(%rbp,%rax,8),%xmm1
  mov    -0x10c(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %eax,%edx
  mov    -0x120(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x150(%rbp),%rax
  add    %rdx,%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  -0xf0(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0xf0(%rbp)
  addl   $0x1,-0x120(%rbp)
L111:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L141
  pxor   %xmm0,%xmm0
  comisd -0xf0(%rbp),%xmm0
  jbe    L348
  movsd  -0xf8(%rbp),%xmm0
  movq   D38(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,-0xf8(%rbp)
L348:
  mov    -0x10c(%rbp),%eax
  add    %eax,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x148(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,-0x114(%rbp)
  je     L235
  movsd  -0xf8(%rbp),%xmm0
  movq   D38(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,-0xf8(%rbp)
L235:
  movsd  -0x100(%rbp),%xmm0
  addsd  -0xf8(%rbp),%xmm0
  movsd  %xmm0,-0x100(%rbp)
  movl   $0x0,-0x120(%rbp)
  jmp    L240
L67:
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0xe0(%rbp,%rax,8),%xmm1
  movsd  -0xe8(%rbp),%xmm2
  movsd  D30(%rip),%xmm0
  mulsd  %xmm0,%xmm2
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0xc0(%rbp,%rax,8),%xmm3
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0xa0(%rbp,%rax,8),%xmm0
  addsd  %xmm3,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x120(%rbp),%eax
  cltq
  movsd  %xmm0,-0x20(%rbp,%rax,8)
  addl   $0x1,-0x120(%rbp)
L240:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L67
  movl   $0x0,-0x120(%rbp)
  jmp    L412
L96:
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0x40(%rbp,%rax,8),%xmm1
  movsd  -0xf8(%rbp),%xmm2
  movsd  D59(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  movsd  D37(%rip),%xmm3
  movapd %xmm0,%xmm2
  divsd  %xmm3,%xmm2
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0x20(%rbp,%rax,8),%xmm0
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0x60(%rbp,%rax,8),%xmm3
  subsd  %xmm3,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x120(%rbp),%eax
  cltq
  movsd  %xmm0,-0x40(%rbp,%rax,8)
  addl   $0x1,-0x120(%rbp)
L412:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L96
  movl   $0x0,-0x120(%rbp)
  jmp    L3
L246:
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0xa0(%rbp,%rax,8),%xmm0
  mov    -0x120(%rbp),%eax
  cltq
  movsd  %xmm0,-0xc0(%rbp,%rax,8)
  addl   $0x1,-0x120(%rbp)
L3:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L246
  addl   $0x1,-0x11c(%rbp)
L46:
  mov    -0x10c(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x138(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,-0x11c(%rbp)
  jl     L250
  addl   $0x1,-0x118(%rbp)
L417:
  mov    -0x114(%rbp),%eax
  cltq
  add    $0x1,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x160(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  cmp    %eax,-0x118(%rbp)
  jl     L126
  movl   $0x0,-0x120(%rbp)
  jmp    L297
L340:
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0x60(%rbp,%rax,8),%xmm1
  mov    -0x120(%rbp),%eax
  cltq
  movsd  -0x40(%rbp,%rax,8),%xmm0
  divsd  -0x100(%rbp),%xmm0
  mov    -0x114(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %eax,%edx
  mov    -0x120(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x170(%rbp),%rax
  add    %rdx,%rax
  addsd  %xmm1,%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x120(%rbp)
L297:
  mov    -0x120(%rbp),%eax
  cmp    -0x124(%rbp),%eax
  jl     L340
  mov    -0x114(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x178(%rbp),%rax
  add    %rdx,%rax
  movsd  -0x100(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  addl   $0x1,-0x114(%rbp)
L448:
  mov    -0x114(%rbp),%eax
  cmp    0x18(%rbp),%eax
  jl     L315
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L223
  call   <__stack_chk_fail@plt>
L223:
  leave
  ret
```

tool_calls: name: read_data
arguments: label: D60
datatype: f64
name: read_data
arguments: label: D36
datatype: byte[8]
name: read_data
arguments: label: D38
datatype: f32[2]
name: read_data
arguments: label: D30
datatype: f64
name: read_data
arguments: label: D59
datatype: f32[2]
name: read_data
arguments: label: D37
datatype: f64

tool: D60: 0.6666666666666666

tool: {"D36": [0x55,0x55,0x55,0x55,0x55,0x55,0xc5,0x3f]}

tool: {"D38": [0.0,-0.0]}

tool: D30: 0.5

tool: {"D59": [0.0,2.125]}

tool: D37: 4

assistant: ```c
void compute_cell_geometry(int ndims, double *coords, int *nodepos, int *facenodes, int *neighbors, double *fnormals, double *fcentroids, int ncells, int *facepos, int *cellfaces, double *ccentroids, double *cvolumes) {
  int i, k, f, c;
  int face, node;
  double x[3];
  double u[3];
  double v[3];
  double w[3];
  double xcell[3];
  double ccell[3];
  double cface[3] = {0};
  int num_faces;
  double volume;
  double tet_volume, subnormal_sign;
  double twothirds = 0.666666666666666666666666666667;
#pragma omp parallel for default(none) private(i, k, f, c, face, node, x, u, v, w, xcell, ccell, cface, num_faces, volume, tet_volume, subnormal_sign) shared(coords, nodepos, facenodes, neighbors, fnormals, fcentroids, facepos, cellfaces, ccentroids, cvolumes) firstprivate(ncells, ndims, twothirds)
  for (c = 0; c < ncells; ++c) {
    for (i = 0; i < ndims; ++i)
      xcell[i] = 0.0;
    for (i = 0; i < ndims; ++i)
      ccell[i] = 0.0;
    for (f = facepos[c]; f < facepos[c + 1]; ++f) {
      face = cellfaces[f];
      for (i = 0; i < ndims; ++i)
        xcell[i] += fcentroids[3 * face + i];
    }
    num_faces = facepos[c + 1] - facepos[c];
    for (i = 0; i < ndims; ++i)
      xcell[i] /= num_faces;
    volume = 0;
    for (f = facepos[c]; f < facepos[c + 1]; ++f) {
      int num_face_nodes;
      for (i = 0; i < ndims; ++i)
        x[i] = 0.0;
      for (i = 0; i < ndims; ++i)
        cface[i] = 0.0;
      face = cellfaces[f];
      for (k = nodepos[face]; k < nodepos[face + 1]; ++k) {
        node = facenodes[k];
        for (i = 0; i < ndims; ++i)
          x[i] += coords[3 * node + i];
      }
      num_face_nodes = nodepos[face + 1] - nodepos[face];
      for (i = 0; i < ndims; ++i)
        x[i] /= num_face_nodes;
      node = facenodes[nodepos[face + 1] - 1];
      for (i = 0; i < ndims; ++i)
        u[i] = coords[3 * node + i] - x[i];
      for (k = nodepos[face]; k < nodepos[face + 1]; ++k) {
        node = facenodes[k];
        for (i = 0; i < ndims; ++i)
          v[i] = coords[3 * node + i] - x[i];
        cross(u, v, w);
        tet_volume = 0;
        for (i = 0; i < ndims; ++i) {
          tet_volume += 0.5 / 3 * w[i] * (x[i] - xcell[i]);
        }
        subnormal_sign = 0.0;
        for (i = 0; i < ndims; ++i) {
          subnormal_sign += w[i] * fnormals[3 * face + i];
        }
        if (subnormal_sign < 0) {
          tet_volume *= -1.0;
        }
        if (!(neighbors[2 * face + 0] == c)) {
          tet_volume *= -1.0;
        }
        volume += tet_volume;
        for (i = 0; i < ndims; ++i)
          cface[i] = (x[i] + (twothirds)*0.5 * (u[i] + v[i]));
        for (i = 0; i < ndims; ++i)
          ccell[i] += tet_volume * 3 / 4.0 * (cface[i] - xcell[i]);
        for (i = 0; i < ndims; ++i)
          u[i] = v[i];
      }
    }
    for (i = 0; i < ndims; ++i)
      ccentroids[3 * c + i] = xcell[i] + ccell[i] / volume;
    cvolumes[c] = volume;
  }
}
```