{"type": "func", "start": 6442480656, "end": 6442481508, "name": "sub_180007410", "pseudocode": "// \n// sub_180007410 from 0x180007410 to 0x180007764 (852 bytes)\n// \n// 5 xrefs:\n// > <???> @ 0x18017d840\n// > <???> @ 0x18017d880\n// > <???> @ 0x1801a4210\n// > <???> @ 0x1801a4228\n// > <???> @ 0x1801f6360\n// \n// This function is hookable on this platform!\n// \n// Using BromaIDA 8.0.0 @ https://github.com/Stazzical/BromaIDA\n// Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings\n// \n\n__int64 __fastcall sub_180007410(int *a1, __int64 a2, _DWORD *a3, float *a4)\n{\n  __int64 v4; // r13\n  int v6; // edx\n  int v7; // r10d\n  int v8; // ebp\n  int v9; // esi\n  int v10; // r12d\n  __int64 v11; // r15\n  __int64 v12; // rcx\n  int v13; // ebx\n  int v14; // ebx\n  int v15; // r11d\n  unsigned int v16; // edi\n  unsigned int v17; // r9d\n  __m128i v18; // xmm0\n  __m128i v19; // xmm2\n  __m128i v20; // xmm3\n  int v21; // r11d\n  __int64 v22; // rax\n  int v23; // esi\n  __m128 *v24; // r10\n  __m128i v25; // xmm6\n  __m128i v26; // xmm5\n  __m128 v27; // xmm4\n  __m128i v28; // xmm1\n  int v29; // r11d\n  __int32 v30; // ecx\n  __int64 v31; // rax\n  __int64 v32; // rcx\n  __int64 v33; // rax\n  unsigned __int64 v34; // r8\n  float v35; // xmm0_4\n  float v36; // xmm0_4\n  float v37; // xmm1_4\n  int v39; // [rsp+70h] [rbp+8h]\n  _DWORD *v41; // [rsp+80h] [rbp+18h]\n\n  v41 = a3;\n  v4 = a2;\n  v6 = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)a1 + 32LL) + 4LL * a1[10]) / 2;\n  v39 = v6;\n  if ( a3 )\n  {\n    v7 = *a3 * *(_DWORD *)(v4 + 56);\n    v8 = 1;\n    v9 = 0;\n    v10 = 0;\n    if ( *(int *)(v4 + 52) > 1 )\n    {\n      v11 = 1;\n      do\n      {\n        v12 = *(char *)(*(_QWORD *)(v4 + 24) + v11);\n        v13 = a3[v12] & 0x7FFF;\n        if ( v13 == a3[v12] )\n        {\n          v14 = *(_DWORD *)(v4 + 56) * v13;\n          v10 = *(unsigned __int16 *)(*(_QWORD *)(v4 + 16) + 2 * v12);\n          v15 = v10;\n          v16 = ((v14 - v7) << 20) / (v10 - v9);\n          v17 = (((v14 - v7) >> 31) & 0xFF800) + (v7 << 20) + 1024;\n          v18 = _mm_cvtsi32_si128(2 * v16);\n          v6 = v39;\n          v19 = _mm_cvtsi32_si128(v16);\n          v20 = _mm_cvtsi32_si128(3 * v16);\n          if ( v39 <= v10 )\n            v15 = v39;\n          v21 = v15 - v9;\n          v22 = v9;\n          v23 = v21 >> 2;\n          v24 = (__m128 *)&a4[v22];\n          v25 = _mm_shuffle_epi32(_mm_cvtsi32_si128(4 * v16), 0);\n          v26 = _mm_add_epi32(\n                  _mm_shuffle_epi32(_mm_cvtsi32_si128(v17), 0),\n                  _mm_unpacklo_epi64(_mm_unpacklo_epi32(v20, v18), _mm_unpacklo_epi32(v19, _mm_cvtsi32_si128(0))));\n          if ( v21 >> 2 )\n          {\n            do\n            {\n              v27 = *v24;\n              v28 = v26;\n              v26 = _mm_add_epi32(v26, v25);\n              xmmword_1801B2390 = (__int128)_mm_srai_epi32(v28, 0x14u);\n              *v24++ = _mm_mul_ps(\n                         _mm_movelh_ps(\n                           _mm_unpacklo_ps(\n                             (__m128)dword_180144700[SHIDWORD(xmmword_1801B2390)],\n                             (__m128)dword_180144700[SDWORD2(xmmword_1801B2390)]),\n                           _mm_unpacklo_ps(\n                             (__m128)dword_180144700[SDWORD1(xmmword_1801B2390)],\n                             (__m128)dword_180144700[_mm_cvtsi128_si32((__m128i)xmmword_1801B2390)])),\n                         v27);\n              --v23;\n            }\n            while ( v23 );\n            v4 = a2;\n            v6 = v39;\n          }\n          v29 = v21 & 3;\n          if ( v29 )\n          {\n            v30 = v26.m128i_i32[3];\n            do\n            {\n              v24 = (__m128 *)((char *)v24 + 4);\n              v31 = (__int64)v30 >> 20;\n              v30 += v16;\n              v24[-1].m128_f32[3] = *(float *)&dword_180144700[v31] * v24[-1].m128_f32[3];\n              --v29;\n            }\n            while ( v29 );\n          }\n          a3 = v41;\n          v9 = v10;\n          v7 = v14;\n        }\n        else\n        {\n          v6 = v39;\n        }\n        ++v8;\n        ++v11;\n      }\n      while ( v8 < *(_DWORD *)(v4 + 52) );\n    }\n    v32 = v10;\n    if ( v10 < (__int64)v6 )\n    {\n      if ( v6 - (__int64)v10 < 4 )\n        goto LABEL_26;\n      v33 = (__int64)&a4[v10 + 2];\n      v34 = ((unsigned __int64)(v6 - (__int64)v10 - 4) >> 2) + 1;\n      v32 = v10 + 4 * v34;\n      do\n      {\n        v35 = *(float *)(v33 - 8);\n        v33 += 16;\n        *(float *)(v33 - 24) = v35 * *(float *)&dword_180144700[v7];\n        v36 = *(float *)(v33 - 16);\n        *(float *)(v33 - 20) = *(float *)&dword_180144700[v7] * *(float *)(v33 - 20);\n        v37 = *(float *)(v33 - 12);\n        *(float *)(v33 - 16) = v36 * *(float *)&dword_180144700[v7];\n        *(float *)(v33 - 12) = v37 * *(float *)&dword_180144700[v7];\n        --v34;\n      }\n      while ( v34 );\n      if ( v32 < v6 )\n      {\nLABEL_26:\n        do\n        {\n          a4[v32] = a4[v32] * *(float *)&dword_180144700[v7];\n          ++v32;\n        }\n        while ( v32 < v6 );\n      }\n    }\n    return 1;\n  }\n  else\n  {\n    memset(a4, 0, 4LL * (*(_DWORD *)(*(_QWORD *)(*(_QWORD *)a1 + 32LL) + 4LL * a1[10]) / 2));\n    return 0;\n  }\n}", "assembly": "; \n; sub_180007410 from 0x180007410 to 0x180007764 (852 bytes)\n; \n; 5 xrefs:\n; > <???> @ 0x18017d840\n; > <???> @ 0x18017d880\n; > <???> @ 0x1801a4210\n; > <???> @ 0x1801a4228\n; > <???> @ 0x1801f6360\n; \n; This function is hookable on this platform!\n; \n; Using BromaIDA 8.0.0 @ https:;github.com/Stazzical/BromaIDA\n; Using bindings at commit ba9f177b at Thu Jul 16 22:52:06 2026 from https:;github.com/geode-sdk/bindings\n; \n\nmov     [rsp+arg_10], r8                                               ; +0x0, 0x180007410\nmov     [rsp+arg_8], rdx                                               ; +0x5, 0x180007415\npush    r13                                                            ; +0xa, 0x18000741a\npush    r14                                                            ; +0xc, 0x18000741c\nsub     rsp, 58h                                                       ; +0xe, 0x18000741e\nmovsxd  r10, dword ptr [rcx+28h]                                       ; +0x12, 0x180007422\nmov     r13, rdx                                                       ; +0x16, 0x180007426\nmov     rcx, [rcx]                                                     ; +0x19, 0x180007429\nmov     r14, r9                                                        ; +0x1c, 0x18000742c\nmov     rax, [rcx+20h]                                                 ; +0x1f, 0x18000742f\nmov     eax, [rax+r10*4]                                               ; +0x23, 0x180007433\ncdq                                                                    ; +0x27, 0x180007437\nsub     eax, edx                                                       ; +0x28, 0x180007438\nsar     eax, 1                                                         ; +0x2a, 0x18000743a\nmovsxd  rdx, eax                                                       ; +0x2c, 0x18000743c\nmov     [rsp+68h+arg_0], edx                                           ; +0x2f, 0x18000743f\ntest    r8, r8                                                         ; +0x33, 0x180007443\njz      loc_180007747                                                  ; +0x36, 0x180007446\nmov     r10d, [r13+38h]                                                ; +0x3c, 0x18000744c\nlea     r11, dword_180144700                                           ; +0x40, 0x180007450\nimul    r10d, [r8]                                                     ; +0x47, 0x180007457\nxor     eax, eax                                                       ; +0x4b, 0x18000745b\nmov     [rsp+68h+var_18], rbp                                          ; +0x4d, 0x18000745d\nmov     ebp, 1                                                         ; +0x52, 0x180007462\nmov     [rsp+68h+var_20], rsi                                          ; +0x57, 0x180007467\nmov     esi, eax                                                       ; +0x5c, 0x18000746c\nmov     [rsp+68h+var_30], r12                                          ; +0x5e, 0x18000746e\nmov     r12d, eax                                                      ; +0x63, 0x180007473\ncmp     [r13+34h], ebp                                                 ; +0x66, 0x180007476\njle     loc_180007686                                                  ; +0x6a, 0x18000747a\nmov     [rsp+68h+arg_18], rbx                                          ; +0x70, 0x180007480\nmov     [rsp+68h+var_28], rdi                                          ; +0x78, 0x180007488\nmov     [rsp+68h+var_38], r15                                          ; +0x7d, 0x18000748d\nmov     r15d, ebp                                                      ; +0x82, 0x180007492\nmovaps  [rsp+68h+var_48], xmm6                                         ; +0x85, 0x180007495\nnop     word ptr [rax+rax+00h]                                         ; +0x8a, 0x18000749a\nmov     rax, [r13+18h]                                                 ; +0x90, 0x1800074a0\nmovsx   rcx, byte ptr [rax+r15]                                        ; +0x94, 0x1800074a4\nmov     ebx, [r8+rcx*4]                                                ; +0x99, 0x1800074a9\nand     ebx, 7FFFh                                                     ; +0x9d, 0x1800074ad\ncmp     ebx, [r8+rcx*4]                                                ; +0xa3, 0x1800074b3\njnz     loc_180007655                                                  ; +0xa7, 0x1800074b7\nimul    ebx, [r13+38h]                                                 ; +0xad, 0x1800074bd\nmov     rax, [r13+10h]                                                 ; +0xb2, 0x1800074c2\nmovzx   r12d, word ptr [rax+rcx*2]                                     ; +0xb6, 0x1800074c6\nmov     r8d, ebx                                                       ; +0xbb, 0x1800074cb\nsub     r8d, r10d                                                      ; +0xbe, 0x1800074ce\nmov     ecx, r12d                                                      ; +0xc1, 0x1800074d1\nsub     ecx, esi                                                       ; +0xc4, 0x1800074d4\nshl     r10d, 14h                                                      ; +0xc6, 0x1800074d6\nmov     eax, r8d                                                       ; +0xca, 0x1800074da\nmov     r11d, r12d                                                     ; +0xcd, 0x1800074dd\nshl     eax, 14h                                                       ; +0xd0, 0x1800074e0\ncdq                                                                    ; +0xd3, 0x1800074e3\nsar     r8d, 1Fh                                                       ; +0xd4, 0x1800074e4\nidiv    ecx                                                            ; +0xd8, 0x1800074e8\nand     r8d, 0FF800h                                                   ; +0xda, 0x1800074ea\nlea     r9d, [r10+400h]                                                ; +0xe1, 0x1800074f1\nmov     edi, eax                                                       ; +0xe8, 0x1800074f8\nadd     r9d, r8d                                                       ; +0xea, 0x1800074fa\nlea     edx, [rax+rax]                                                 ; +0xed, 0x1800074fd\nlea     ecx, [rax+rax*2]                                               ; +0xf0, 0x180007500\nmovd    xmm0, edx                                                      ; +0xf3, 0x180007503\nmov     edx, [rsp+68h+arg_0]                                           ; +0xf7, 0x180007507\nxor     eax, eax                                                       ; +0xfb, 0x18000750b\ncmp     edx, r12d                                                      ; +0xfd, 0x18000750d\nmovd    xmm2, edi                                                      ; +0x100, 0x180007510\nmovd    xmm3, ecx                                                      ; +0x104, 0x180007514\ncmovle  r11d, edx                                                      ; +0x108, 0x180007518\npunpckldq xmm3, xmm0                                                   ; +0x10c, 0x18000751c\nmovd    xmm1, eax                                                      ; +0x110, 0x180007520\nsub     r11d, esi                                                      ; +0x114, 0x180007524\nlea     eax, ds:0[rdi*4]                                               ; +0x117, 0x180007527\npunpckldq xmm2, xmm1                                                   ; +0x11e, 0x18000752e\nmovd    xmm6, eax                                                      ; +0x122, 0x180007532\nmovsxd  rax, esi                                                       ; +0x126, 0x180007536\nmov     esi, r11d                                                      ; +0x129, 0x180007539\nmovd    xmm5, r9d                                                      ; +0x12c, 0x18000753c\nsar     esi, 2                                                         ; +0x131, 0x180007541\npunpcklqdq xmm3, xmm2                                                  ; +0x134, 0x180007544\npshufd  xmm5, xmm5, 0                                                  ; +0x138, 0x180007548\nlea     r10, [r14+rax*4]                                               ; +0x13d, 0x18000754d\npshufd  xmm6, xmm6, 0                                                  ; +0x141, 0x180007551\npaddd   xmm5, xmm3                                                     ; +0x146, 0x180007556\ntest    esi, esi                                                       ; +0x14a, 0x18000755a\njz      loc_1800075FE                                                  ; +0x14c, 0x18000755c\nlea     r13, dword_180144700                                           ; +0x152, 0x180007562\nnop     dword ptr [rax+00000000h]                                      ; +0x159, 0x180007569\nmovups  xmm4, xmmword ptr [r10]                                        ; +0x160, 0x180007570\nmovdqa  xmm1, xmm5                                                     ; +0x164, 0x180007574\npaddd   xmm5, xmm6                                                     ; +0x168, 0x180007578\npsrad   xmm1, 14h                                                      ; +0x16c, 0x18000757c\nmovd    eax, xmm1                                                      ; +0x171, 0x180007581\nmovdqa  xmm0, xmm1                                                     ; +0x175, 0x180007585\npsrldq  xmm0, 4                                                        ; +0x179, 0x180007589\nmovdqa  cs:xmmword_1801B2390, xmm1                                     ; +0x17e, 0x18000758e\nmovsxd  r9, eax                                                        ; +0x186, 0x180007596\nmovd    eax, xmm0                                                      ; +0x189, 0x180007599\nmovdqa  xmm0, xmm1                                                     ; +0x18d, 0x18000759d\npsrldq  xmm0, 8                                                        ; +0x191, 0x1800075a1\npsrldq  xmm1, 0Ch                                                      ; +0x196, 0x1800075a6\nmovsxd  r8, eax                                                        ; +0x19b, 0x1800075ab\nmovd    eax, xmm0                                                      ; +0x19e, 0x1800075ae\nmovss   xmm2, dword ptr [r13+r8*4+0]                                   ; +0x1a2, 0x1800075b2\nmovsxd  rdx, eax                                                       ; +0x1a9, 0x1800075b9\nmovd    eax, xmm1                                                      ; +0x1ac, 0x1800075bc\nmovss   xmm1, dword ptr [r13+r9*4+0]                                   ; +0x1b0, 0x1800075c0\nunpcklps xmm2, xmm1                                                    ; +0x1b7, 0x1800075c7\nmovss   xmm0, dword ptr [r13+rdx*4+0]                                  ; +0x1ba, 0x1800075ca\nmovsxd  rcx, eax                                                       ; +0x1c1, 0x1800075d1\nmovss   xmm3, dword ptr [r13+rcx*4+0]                                  ; +0x1c4, 0x1800075d4\nunpcklps xmm3, xmm0                                                    ; +0x1cb, 0x1800075db\nmovlhps xmm3, xmm2                                                     ; +0x1ce, 0x1800075de\nmulps   xmm3, xmm4                                                     ; +0x1d1, 0x1800075e1\nmovups  xmmword ptr [r10], xmm3                                        ; +0x1d4, 0x1800075e4\nadd     r10, 10h                                                       ; +0x1d8, 0x1800075e8\nsub     esi, 1                                                         ; +0x1dc, 0x1800075ec\njnz     loc_180007570                                                  ; +0x1df, 0x1800075ef\nmov     r13, [rsp+68h+arg_8]                                           ; +0x1e5, 0x1800075f5\nmov     edx, [rsp+68h+arg_0]                                           ; +0x1ea, 0x1800075fa\nand     r11d, 3                                                        ; +0x1ee, 0x1800075fe\njz      short loc_180007645                                            ; +0x1f2, 0x180007602\npsrldq  xmm5, 0Ch                                                      ; +0x1f4, 0x180007604\nlea     r8, dword_180144700                                            ; +0x1f9, 0x180007609\nmovd    ecx, xmm5                                                      ; +0x200, 0x180007610\nnop     dword ptr [rax+00h]                                            ; +0x204, 0x180007614\nnop     dword ptr [rax+rax+00000000h]                                  ; +0x208, 0x180007618\nmovsxd  rax, ecx                                                       ; +0x210, 0x180007620\nlea     r10, [r10+4]                                                   ; +0x213, 0x180007623\nsar     rax, 14h                                                       ; +0x217, 0x180007627\nadd     ecx, edi                                                       ; +0x21b, 0x18000762b\nmovss   xmm0, dword ptr [r8+rax*4]                                     ; +0x21d, 0x18000762d\nmulss   xmm0, dword ptr [r10-4]                                        ; +0x223, 0x180007633\nmovss   dword ptr [r10-4], xmm0                                        ; +0x229, 0x180007639\nsub     r11d, 1                                                        ; +0x22f, 0x18000763f\njnz     short loc_180007620                                            ; +0x233, 0x180007643\nmov     r8, [rsp+68h+arg_10]                                           ; +0x235, 0x180007645\nmov     esi, r12d                                                      ; +0x23d, 0x18000764d\nmov     r10d, ebx                                                      ; +0x240, 0x180007650\njmp     short loc_180007659                                            ; +0x243, 0x180007653\nmov     edx, [rsp+68h+arg_0]                                           ; +0x245, 0x180007655\ninc     ebp                                                            ; +0x249, 0x180007659\ninc     r15                                                            ; +0x24b, 0x18000765b\ncmp     ebp, [r13+34h]                                                 ; +0x24e, 0x18000765e\njl      loc_1800074A0                                                  ; +0x252, 0x180007662\nmovaps  xmm6, [rsp+68h+var_48]                                         ; +0x258, 0x180007668\nlea     r11, dword_180144700                                           ; +0x25d, 0x18000766d\nmov     r15, [rsp+68h+var_38]                                          ; +0x264, 0x180007674\nmov     rdi, [rsp+68h+var_28]                                          ; +0x269, 0x180007679\nmov     rbx, [rsp+68h+arg_18]                                          ; +0x26e, 0x18000767e\nmov     rsi, [rsp+68h+var_20]                                          ; +0x276, 0x180007686\nmov     rbp, [rsp+68h+var_18]                                          ; +0x27b, 0x18000768b\nmovsxd  rcx, r12d                                                      ; +0x280, 0x180007690\nmov     r12, [rsp+68h+var_30]                                          ; +0x283, 0x180007693\nmovsxd  r9, edx                                                        ; +0x288, 0x180007698\ncmp     rcx, r9                                                        ; +0x28b, 0x18000769b\njge     loc_180007739                                                  ; +0x28e, 0x18000769e\nmov     rax, r9                                                        ; +0x294, 0x1800076a4\nmovsxd  rdx, r10d                                                      ; +0x297, 0x1800076a7\nsub     rax, rcx                                                       ; +0x29a, 0x1800076aa\ncmp     rax, 4                                                         ; +0x29d, 0x1800076ad\njl      short loc_18000771F                                            ; +0x2a1, 0x1800076b1\nmov     r8, r9                                                         ; +0x2a3, 0x1800076b3\nlea     rax, [r14+8]                                                   ; +0x2a6, 0x1800076b6\nsub     r8, rcx                                                        ; +0x2aa, 0x1800076ba\nlea     rax, [rax+rcx*4]                                               ; +0x2ad, 0x1800076bd\nsub     r8, 4                                                          ; +0x2b1, 0x1800076c1\nshr     r8, 2                                                          ; +0x2b5, 0x1800076c5\ninc     r8                                                             ; +0x2b9, 0x1800076c9\nlea     rcx, [rcx+r8*4]                                                ; +0x2bc, 0x1800076cc\nmovss   xmm0, dword ptr [rax-8]                                        ; +0x2c0, 0x1800076d0\nlea     rax, [rax+10h]                                                 ; +0x2c5, 0x1800076d5\nmulss   xmm0, dword ptr [r11+rdx*4]                                    ; +0x2c9, 0x1800076d9\nmovss   dword ptr [rax-18h], xmm0                                      ; +0x2cf, 0x1800076df\nmovss   xmm1, dword ptr [r11+rdx*4]                                    ; +0x2d4, 0x1800076e4\nmulss   xmm1, dword ptr [rax-14h]                                      ; +0x2da, 0x1800076ea\nmovss   xmm0, dword ptr [rax-10h]                                      ; +0x2df, 0x1800076ef\nmovss   dword ptr [rax-14h], xmm1                                      ; +0x2e4, 0x1800076f4\nmovss   xmm1, dword ptr [rax-0Ch]                                      ; +0x2e9, 0x1800076f9\nmulss   xmm0, dword ptr [r11+rdx*4]                                    ; +0x2ee, 0x1800076fe\nmovss   dword ptr [rax-10h], xmm0                                      ; +0x2f4, 0x180007704\nmulss   xmm1, dword ptr [r11+rdx*4]                                    ; +0x2f9, 0x180007709\nmovss   dword ptr [rax-0Ch], xmm1                                      ; +0x2ff, 0x18000770f\nsub     r8, 1                                                          ; +0x304, 0x180007714\njnz     short loc_1800076D0                                            ; +0x308, 0x180007718\ncmp     rcx, r9                                                        ; +0x30a, 0x18000771a\njge     short loc_180007739                                            ; +0x30d, 0x18000771d\nmovss   xmm0, dword ptr [r14+rcx*4]                                    ; +0x30f, 0x18000771f\nmulss   xmm0, dword ptr [r11+rdx*4]                                    ; +0x315, 0x180007725\nmovss   dword ptr [r14+rcx*4], xmm0                                    ; +0x31b, 0x18000772b\ninc     rcx                                                            ; +0x321, 0x180007731\ncmp     rcx, r9                                                        ; +0x324, 0x180007734\njl      short loc_18000771F                                            ; +0x327, 0x180007737\nmov     eax, 1                                                         ; +0x329, 0x180007739\nadd     rsp, 58h                                                       ; +0x32e, 0x18000773e\npop     r14                                                            ; +0x332, 0x180007742\npop     r13                                                            ; +0x334, 0x180007744\nretn                                                                   ; +0x336, 0x180007746\nlea     r8, ds:0[rdx*4]; Size                                          ; +0x337, 0x180007747\nmov     rcx, r14; void *                                               ; +0x33f, 0x18000774f\nxor     edx, edx; Val                                                  ; +0x342, 0x180007752\ncall    memset                                                         ; +0x344, 0x180007754\nxor     eax, eax                                                       ; +0x349, 0x180007759\nadd     rsp, 58h                                                       ; +0x34b, 0x18000775b\npop     r14                                                            ; +0x34f, 0x18000775f\npop     r13                                                            ; +0x351, 0x180007761\nretn                                                                   ; +0x353, 0x180007763", "xrefs": ["<???> @ 0x18017d840", "<???> @ 0x18017d880", "<???> @ 0x1801a4210", "<???> @ 0x1801a4228", "<???> @ 0x1801f6360"], "is_objc": false, "is_arm32": false, "is_arm64": false, "bida_info": "8.0.0 @ https://github.com/Stazzical/BromaIDA", "bindings_info": "commit ba9f177b at Thu Jul 16 22:52:06 2026 from https://github.com/geode-sdk/bindings"}