'Programming'에 해당되는 글 1747건

  1. 2021.11.25 wasm interfacing example
  2. 2021.11.10 ::open()
  3. 2021.10.26 winform udp 소켓 여러개
  4. 2021.10.26 wasm text format
  5. 2021.10.26 wasm text 와 binary 상호변환
  6. 2021.10.25 emcc wasm 빌드
  7. 2021.10.24 wasm from c, cpp
  8. 2021.10.22 wasm
  9. 2021.10.20 c# thread
  10. 2021.10.20 Dispatcher / Control BeginInvoke()
Programming/wasm2021. 11. 25. 19:07

웹 어셈블리에서

인자로 입력 받아 결과를 웹에서 받는 예제를 찾아봄.

 

wasm으로 변환될 코드는 int 형을 받아서 int 형으로 출력할 것이고

#include <math.h>

extern "C" {

int int_sqrt(int x) {
  return sqrt(x);
}

}

 

빌드는 아래와 같이 emcc를 통해 ccall과 cwrap 방식으로 _int_sqrt 함수를 내보내라 인것 같은데

int_sqrt가 아니라 _int_sqrt는 calling convention때문인가?

$ emcc tests/hello_function.cpp -o function.html -s EXPORTED_FUNCTIONS='["_int_sqrt"]' -s EXPORTED_RUNTIME_METHODS='["ccall","cwrap"]'

 

웹에서 받는 법이 두가지라는데 cwrap으로 하면 int_sqrt 객체를 만들어서 한다는데 리턴이 되는진 모르겠고

ccall로 하면 인자를 던지는게 조금 귀찮아 지지만 var result에 결과가 들어가는 듯.

int_sqrt = Module.cwrap('int_sqrt', 'number', ['number'])
int_sqrt(12)
int_sqrt(28)

// Call C from JavaScript
var result = Module.ccall('int_sqrt', // name of C function
  'number', // return type
  ['number'], // argument types
  [28]); // arguments

// result is 5

[링크 : https://emscripten.org/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html]

 

 

[링크 : https://m.blog.daum.net/junek69/88]

[링크 : https://developer.mozilla.org/ko/docs/WebAssembly/C_to_wasm]

 

'Programming > wasm' 카테고리의 다른 글

wasm 배열 예제  (0) 2023.01.31
wasm text format  (0) 2021.10.26
wasm text 와 binary 상호변환  (0) 2021.10.26
emcc wasm 빌드  (0) 2021.10.25
wasm from c, cpp  (0) 2021.10.24
Posted by 구차니
Programming/C++ STL2021. 11. 10. 18:10

QT에서 QSeialPort.open() 이 있고

QSerialPort를 상속받은 클래스에서

open()을 하면 자동으로 부모인 QSeialPort.open() 를 호출하게 되는데

CPP가 아닌 C의 fnctl.h의 open()을 열고 싶으면

::open()을 하면 되...나?

 

[링크 : https://stackoverflow.com/questions/10772169/calling-same-name-function]

'Programming > C++ STL' 카테고리의 다른 글

cpp static_cast<type>  (0) 2023.02.09
vector 값 비우기  (0) 2021.10.02
cpp 부모타입으로 업 캐스팅 된 객체의 원래 클래스 알기  (0) 2021.09.30
cpp string 관련  (0) 2019.06.10
cpp stringstream << 연산자  (0) 2019.05.24
Posted by 구차니
Programming/c# & winform2021. 10. 26. 18:07

'Programming > c# & winform' 카테고리의 다른 글

window USB VID,PID enumeration  (0) 2022.04.27
c# postgresql 패키지  (0) 2022.04.27
c# thread  (0) 2021.10.20
Dispatcher / Control BeginInvoke()  (0) 2021.10.20
this.BeginInvoke()가 느려!  (0) 2021.10.20
Posted by 구차니
Programming/wasm2021. 10. 26. 11:08

wasm 파일은 바이너리라 열어봐도 내용이 안보이는데, 크롬으로 실행하고 디버거로 보면 텍스트로 변환(?) 된다.

 

단순한(?!) hello world 하나 출력할 뿐인데 드럽게 기네

(module
  (func $wasi_snapshot_preview1.fd_write (;0;) (import "wasi_snapshot_preview1" "fd_write") (param i32 i32 i32 i32) (result i32))
  (func $env.emscripten_memcpy_big (;1;) (import "env" "emscripten_memcpy_big") (param i32 i32 i32) (result i32))
  (func $env.setTempRet0 (;2;) (import "env" "setTempRet0") (param i32))
  (table $__indirect_function_table (;0;) (export "__indirect_function_table") 6 6 funcref)
  (memory $memory (;0;) (export "memory") 256 256)
  (global $global0 (mut i32) (i32.const 5245984))
  (global $global1 (mut i32) (i32.const 0))
  (global $global2 (mut i32) (i32.const 0))
  (elem $elem0 (i32.const 1) funcref (ref.func $func9) (ref.func $func8) (ref.func $func10) (ref.func $func41) (ref.func $func42))
  (func $__wasm_call_ctors (;3;) (export "__wasm_call_ctors")
    call $emscripten_stack_init
    call $func24
  )
  (func $func4 (result i32)
    (local $var0 i32) (local $var1 i32) (local $var2 i32) (local $var3 i32) (local $var4 i32) (local $var5 i32) (local $var6 i32) (local $var7 i32) (local $var8 i32)
    global.get $global0
    local.set $var0
    i32.const 16
    local.set $var1
    local.get $var0
    local.get $var1
    i32.sub
    local.set $var2
    local.get $var2
    global.set $global0
    i32.const 0
    local.set $var3
    local.get $var2
    local.get $var3
    i32.store offset=12
    i32.const 1078
    local.set $var4
    i32.const 0
    local.set $var5
    local.get $var4
    local.get $var5
    call $func44
    drop
    i32.const 0
    local.set $var6
    i32.const 16
    local.set $var7
    local.get $var2
    local.get $var7
    i32.add
    local.set $var8
    local.get $var8
    global.set $global0
    local.get $var6
    return
  )
  (func $main (;5;) (export "main") (param $var0 i32) (param $var1 i32) (result i32)
    (local $var2 i32)
    call $func4
    local.set $var2
    local.get $var2
    return
  )
  (func $__errno_location (;6;) (export "__errno_location") (result i32)
    i32.const 1744
  )
  (func $func7 (param $var0 i32) (result i32)
    block $label0
      local.get $var0
      br_if $label0
      i32.const 0
      return
    end $label0
    call $__errno_location
    local.get $var0
    i32.store
    i32.const -1
  )
  (func $func8 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
    (local $var3 i32) (local $var4 i32) (local $var5 i32) (local $var6 i32) (local $var7 i32) (local $var8 i32) (local $var9 i32)
    global.get $global0
    i32.const 32
    i32.sub
    local.tee $var3
    global.set $global0
    local.get $var3
    local.get $var0
    i32.load offset=28
    local.tee $var4
    i32.store offset=16
    local.get $var0
    i32.load offset=20
    local.set $var5
    local.get $var3
    local.get $var2
    i32.store offset=28
    local.get $var3
    local.get $var1
    i32.store offset=24
    local.get $var3
    local.get $var5
    local.get $var4
    i32.sub
    local.tee $var1
    i32.store offset=20
    local.get $var1
    local.get $var2
    i32.add
    local.set $var6
    i32.const 2
    local.set $var7
    local.get $var3
    i32.const 16
    i32.add
    local.set $var1
    block $label4
      block $label2
        block $label1
          block $label0
            local.get $var0
            i32.load offset=60
            local.get $var3
            i32.const 16
            i32.add
            i32.const 2
            local.get $var3
            i32.const 12
            i32.add
            call $wasi_snapshot_preview1.fd_write
            call $func7
            br_if $label0
            loop $label3
              local.get $var6
              local.get $var3
              i32.load offset=12
              local.tee $var4
              i32.eq
              br_if $label1
              local.get $var4
              i32.const -1
              i32.le_s
              br_if $label2
              local.get $var1
              local.get $var4
              local.get $var1
              i32.load offset=4
              local.tee $var8
              i32.gt_u
              local.tee $var5
              i32.const 3
              i32.shl
              i32.add
              local.tee $var9
              local.get $var9
              i32.load
              local.get $var4
              local.get $var8
              i32.const 0
              local.get $var5
              select
              i32.sub
              local.tee $var8
              i32.add
              i32.store
              local.get $var1
              i32.const 12
              i32.const 4
              local.get $var5
              select
              i32.add
              local.tee $var9
              local.get $var9
              i32.load
              local.get $var8
              i32.sub
              i32.store
              local.get $var6
              local.get $var4
              i32.sub
              local.set $var6
              local.get $var0
              i32.load offset=60
              local.get $var1
              i32.const 8
              i32.add
              local.get $var1
              local.get $var5
              select
              local.tee $var1
              local.get $var7
              local.get $var5
              i32.sub
              local.tee $var7
              local.get $var3
              i32.const 12
              i32.add
              call $wasi_snapshot_preview1.fd_write
              call $func7
              i32.eqz
              br_if $label3
            end $label3
          end $label0
          local.get $var6
          i32.const -1
          i32.ne
          br_if $label2
        end $label1
        local.get $var0
        local.get $var0
        i32.load offset=44
        local.tee $var1
        i32.store offset=28
        local.get $var0
        local.get $var1
        i32.store offset=20
        local.get $var0
        local.get $var1
        local.get $var0
        i32.load offset=48
        i32.add
        i32.store offset=16
        local.get $var2
        local.set $var4
        br $label4
      end $label2
      i32.const 0
      local.set $var4
      local.get $var0
      i32.const 0
      i32.store offset=28
      local.get $var0
      i64.const 0
      i64.store offset=16
      local.get $var0
      local.get $var0
      i32.load
      i32.const 32
      i32.or
      i32.store
      local.get $var7
      i32.const 2
      i32.eq
      br_if $label4
      local.get $var2
      local.get $var1
      i32.load offset=4
      i32.sub
      local.set $var4
    end $label4
    local.get $var3
    i32.const 32
    i32.add
    global.set $global0
    local.get $var4
  )
  (func $func9 (param $var0 i32) (result i32)
    i32.const 0
  )
  (func $func10 (param $var0 i32) (param $var1 i64) (param $var2 i32) (result i64)
    i64.const 0
  )
  (func $func11 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
    (local $var3 i32) (local $var4 i32) (local $var5 i32) (local $var6 i64)
    block $label0
      local.get $var2
      i32.eqz
      br_if $label0
      local.get $var2
      local.get $var0
      i32.add
      local.tee $var3
      i32.const -1
      i32.add
      local.get $var1
      i32.store8
      local.get $var0
      local.get $var1
      i32.store8
      local.get $var2
      i32.const 3
      i32.lt_u
      br_if $label0
      local.get $var3
      i32.const -2
      i32.add
      local.get $var1
      i32.store8
      local.get $var0
      local.get $var1
      i32.store8 offset=1
      local.get $var3
      i32.const -3
      i32.add
      local.get $var1
      i32.store8
      local.get $var0
      local.get $var1
      i32.store8 offset=2
      local.get $var2
      i32.const 7
      i32.lt_u
      br_if $label0
      local.get $var3
      i32.const -4
      i32.add
      local.get $var1
      i32.store8
      local.get $var0
      local.get $var1
      i32.store8 offset=3
      local.get $var2
      i32.const 9
      i32.lt_u
      br_if $label0
      local.get $var0
      i32.const 0
      local.get $var0
      i32.sub
      i32.const 3
      i32.and
      local.tee $var4
      i32.add
      local.tee $var3
      local.get $var1
      i32.const 255
      i32.and
      i32.const 16843009
      i32.mul
      local.tee $var1
      i32.store
      local.get $var3
      local.get $var2
      local.get $var4
      i32.sub
      i32.const -4
      i32.and
      local.tee $var4
      i32.add
      local.tee $var2
      i32.const -4
      i32.add
      local.get $var1
      i32.store
      local.get $var4
      i32.const 9
      i32.lt_u
      br_if $label0
      local.get $var3
      local.get $var1
      i32.store offset=8
      local.get $var3
      local.get $var1
      i32.store offset=4
      local.get $var2
      i32.const -8
      i32.add
      local.get $var1
      i32.store
      local.get $var2
      i32.const -12
      i32.add
      local.get $var1
      i32.store
      local.get $var4
      i32.const 25
      i32.lt_u
      br_if $label0
      local.get $var3
      local.get $var1
      i32.store offset=24
      local.get $var3
      local.get $var1
      i32.store offset=20
      local.get $var3
      local.get $var1
      i32.store offset=16
      local.get $var3
      local.get $var1
      i32.store offset=12
      local.get $var2
      i32.const -16
      i32.add
      local.get $var1
      i32.store
      local.get $var2
      i32.const -20
      i32.add
      local.get $var1
      i32.store
      local.get $var2
      i32.const -24
      i32.add
      local.get $var1
      i32.store
      local.get $var2
      i32.const -28
      i32.add
      local.get $var1
      i32.store
      local.get $var4
      local.get $var3
      i32.const 4
      i32.and
      i32.const 24
      i32.or
      local.tee $var5
      i32.sub
      local.tee $var2
      i32.const 32
      i32.lt_u
      br_if $label0
      local.get $var1
      i64.extend_i32_u
      i64.const 4294967297
      i64.mul
      local.set $var6
      local.get $var3
      local.get $var5
      i32.add
      local.set $var1
      loop $label1
        local.get $var1
        local.get $var6
        i64.store offset=24
        local.get $var1
        local.get $var6
        i64.store offset=16
        local.get $var1
        local.get $var6
        i64.store offset=8
        local.get $var1
        local.get $var6
        i64.store
        local.get $var1
        i32.const 32
        i32.add
        local.set $var1
        local.get $var2
        i32.const -32
        i32.add
        local.tee $var2
        i32.const 31
        i32.gt_u
        br_if $label1
      end $label1
    end $label0
    local.get $var0
  )
  (func $func12 (param $var0 i32) (result i32)
    local.get $var0
    i32.const -48
    i32.add
    i32.const 10
    i32.lt_u
  )
  (func $func13 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
    (local $var3 i32) (local $var4 i32)
    local.get $var2
    i32.const 0
    i32.ne
    local.set $var3
    block $label3
      block $label1
        block $label0
          local.get $var0
          i32.const 3
          i32.and
          i32.eqz
          br_if $label0
          local.get $var2
          i32.eqz
          br_if $label0
          local.get $var1
          i32.const 255
          i32.and
          local.set $var4
          loop $label2
            local.get $var0
            i32.load8_u
            local.get $var4
            i32.eq
            br_if $label1
            local.get $var2
            i32.const -1
            i32.add
            local.tee $var2
            i32.const 0
            i32.ne
            local.set $var3
            local.get $var0
            i32.const 1
            i32.add
            local.tee $var0
            i32.const 3
            i32.and
            i32.eqz
            br_if $label0
            local.get $var2
            br_if $label2
          end $label2
        end $label0
        local.get $var3
        i32.eqz
        br_if $label3
      end $label1
      block $label4
        local.get $var0
        i32.load8_u
        local.get $var1
        i32.const 255
        i32.and
        i32.eq
        br_if $label4
        local.get $var2
        i32.const 4
        i32.lt_u
        br_if $label4
        local.get $var1
        i32.const 255
        i32.and
        i32.const 16843009
        i32.mul
        local.set $var4
        loop $label5
          local.get $var0
          i32.load
          local.get $var4
          i32.xor
          local.tee $var3
          i32.const -1
          i32.xor
          local.get $var3
          i32.const -16843009
          i32.add
          i32.and
          i32.const -2139062144
          i32.and
          br_if $label4
          local.get $var0
          i32.const 4
          i32.add
          local.set $var0
          local.get $var2
          i32.const -4
          i32.add
          local.tee $var2
          i32.const 3
          i32.gt_u
          br_if $label5
        end $label5
      end $label4
      local.get $var2
      i32.eqz
      br_if $label3
      local.get $var1
      i32.const 255
      i32.and
      local.set $var3
      loop $label7
        block $label6
          local.get $var0
          i32.load8_u
          local.get $var3
          i32.ne
          br_if $label6
          local.get $var0
          return
        end $label6
        local.get $var0
        i32.const 1
        i32.add
        local.set $var0
        local.get $var2
        i32.const -1
        i32.add
        local.tee $var2
        br_if $label7
      end $label7
    end $label3
    i32.const 0
  )
  (func $func14 (param $var0 i32)
  )
  (func $func15 (param $var0 i32)
  )
  (func $func16 (result i32)
    i32.const 2856
    call $func14
    i32.const 2864
  )
  (func $func17
    i32.const 2856
    call $func15
  )
  (func $func18 (param $var0 i32) (result i32)
    (local $var1 i32)
    local.get $var0
    local.get $var0
    i32.load8_u offset=74
    local.tee $var1
    i32.const -1
    i32.add
    local.get $var1
    i32.or
    i32.store8 offset=74
    block $label0
      local.get $var0
      i32.load
      local.tee $var1
      i32.const 8
      i32.and
      i32.eqz
      br_if $label0
      local.get $var0
      local.get $var1
      i32.const 32
      i32.or
      i32.store
      i32.const -1
      return
    end $label0
    local.get $var0
    i64.const 0
    i64.store offset=4 align=4
    local.get $var0
    local.get $var0
    i32.load offset=44
    local.tee $var1
    i32.store offset=28
    local.get $var0
    local.get $var1
    i32.store offset=20
    local.get $var0
    local.get $var1
    local.get $var0
    i32.load offset=48
    i32.add
    i32.store offset=16
    i32.const 0
  )
  (func $func19 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
    (local $var3 i32) (local $var4 i32) (local $var5 i32)
    block $label0
      local.get $var2
      i32.const 512
      i32.lt_u
      br_if $label0
      local.get $var0
      local.get $var1
      local.get $var2
      call $env.emscripten_memcpy_big
      drop
      local.get $var0
      return
    end $label0
    local.get $var0
    local.get $var2
    i32.add
    local.set $var3
    block $label8
      block $label1
        local.get $var1
        local.get $var0
        i32.xor
        i32.const 3
        i32.and
        br_if $label1
        block $label3
          block $label2
            local.get $var0
            i32.const 3
            i32.and
            br_if $label2
            local.get $var0
            local.set $var2
            br $label3
          end $label2
          block $label4
            local.get $var2
            i32.const 1
            i32.ge_s
            br_if $label4
            local.get $var0
            local.set $var2
            br $label3
          end $label4
          local.get $var0
          local.set $var2
          loop $label5
            local.get $var2
            local.get $var1
            i32.load8_u
            i32.store8
            local.get $var1
            i32.const 1
            i32.add
            local.set $var1
            local.get $var2
            i32.const 1
            i32.add
            local.tee $var2
            i32.const 3
            i32.and
            i32.eqz
            br_if $label3
            local.get $var2
            local.get $var3
            i32.lt_u
            br_if $label5
          end $label5
        end $label3
        block $label6
          local.get $var3
          i32.const -4
          i32.and
          local.tee $var4
          i32.const 64
          i32.lt_u
          br_if $label6
          local.get $var2
          local.get $var4
          i32.const -64
          i32.add
          local.tee $var5
          i32.gt_u
          br_if $label6
          loop $label7
            local.get $var2
            local.get $var1
            i32.load
            i32.store
            local.get $var2
            local.get $var1
            i32.load offset=4
            i32.store offset=4
            local.get $var2
            local.get $var1
            i32.load offset=8
            i32.store offset=8
            local.get $var2
            local.get $var1
            i32.load offset=12
            i32.store offset=12
            local.get $var2
            local.get $var1
            i32.load offset=16
            i32.store offset=16
            local.get $var2
            local.get $var1
            i32.load offset=20
            i32.store offset=20
            local.get $var2
            local.get $var1
            i32.load offset=24
            i32.store offset=24
            local.get $var2
            local.get $var1
            i32.load offset=28
            i32.store offset=28
            local.get $var2
            local.get $var1
            i32.load offset=32
            i32.store offset=32
            local.get $var2
            local.get $var1
            i32.load offset=36
            i32.store offset=36
            local.get $var2
            local.get $var1
            i32.load offset=40
            i32.store offset=40
            local.get $var2
            local.get $var1
            i32.load offset=44
            i32.store offset=44
            local.get $var2
            local.get $var1
            i32.load offset=48
            i32.store offset=48
            local.get $var2
            local.get $var1
            i32.load offset=52
            i32.store offset=52
            local.get $var2
            local.get $var1
            i32.load offset=56
            i32.store offset=56
            local.get $var2
            local.get $var1
            i32.load offset=60
            i32.store offset=60
            local.get $var1
            i32.const 64
            i32.add
            local.set $var1
            local.get $var2
            i32.const 64
            i32.add
            local.tee $var2
            local.get $var5
            i32.le_u
            br_if $label7
          end $label7
        end $label6
        local.get $var2
        local.get $var4
        i32.ge_u
        br_if $label8
        loop $label9
          local.get $var2
          local.get $var1
          i32.load
          i32.store
          local.get $var1
          i32.const 4
          i32.add
          local.set $var1
          local.get $var2
          i32.const 4
          i32.add
          local.tee $var2
          local.get $var4
          i32.lt_u
          br_if $label9
          br $label8
        end $label9
        unreachable
      end $label1
      block $label10
        local.get $var3
        i32.const 4
        i32.ge_u
        br_if $label10
        local.get $var0
        local.set $var2
        br $label8
      end $label10
      block $label11
        local.get $var3
        i32.const -4
        i32.add
        local.tee $var4
        local.get $var0
        i32.ge_u
        br_if $label11
        local.get $var0
        local.set $var2
        br $label8
      end $label11
      local.get $var0
      local.set $var2
      loop $label12
        local.get $var2
        local.get $var1
        i32.load8_u
        i32.store8
        local.get $var2
        local.get $var1
        i32.load8_u offset=1
        i32.store8 offset=1
        local.get $var2
        local.get $var1
        i32.load8_u offset=2
        i32.store8 offset=2
        local.get $var2
        local.get $var1
        i32.load8_u offset=3
        i32.store8 offset=3
        local.get $var1
        i32.const 4
        i32.add
        local.set $var1
        local.get $var2
        i32.const 4
        i32.add
        local.tee $var2
        local.get $var4
        i32.le_u
        br_if $label12
      end $label12
    end $label8
    block $label13
      local.get $var2
      local.get $var3
      i32.ge_u
      br_if $label13
      loop $label14
        local.get $var2
        local.get $var1
        i32.load8_u
        i32.store8
        local.get $var1
        i32.const 1
        i32.add
        local.set $var1
        local.get $var2
        i32.const 1
        i32.add
        local.tee $var2
        local.get $var3
        i32.ne
        br_if $label14
      end $label14
    end $label13
    local.get $var0
  )
  (func $func20 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
    (local $var3 i32) (local $var4 i32) (local $var5 i32)
    block $label1
      block $label0
        local.get $var2
        i32.load offset=16
        local.tee $var3
        br_if $label0
        i32.const 0
        local.set $var4
        local.get $var2
        call $func18
        br_if $label1
        local.get $var2
        i32.load offset=16
        local.set $var3
      end $label0
      block $label2
        local.get $var3
        local.get $var2
        i32.load offset=20
        local.tee $var5
        i32.sub
        local.get $var1
        i32.ge_u
        br_if $label2
        local.get $var2
        local.get $var0
        local.get $var1
        local.get $var2
        i32.load offset=36
        call_indirect (param i32 i32 i32) (result i32)
        return
      end $label2
      block $label4
        block $label3
          local.get $var2
          i32.load8_s offset=75
          i32.const 0
          i32.ge_s
          br_if $label3
          i32.const 0
          local.set $var3
          br $label4
        end $label3
        local.get $var1
        local.set $var4
        loop $label6
          block $label5
            local.get $var4
            local.tee $var3
            br_if $label5
            i32.const 0
            local.set $var3
            br $label4
          end $label5
          local.get $var0
          local.get $var3
          i32.const -1
          i32.add
          local.tee $var4
          i32.add
          i32.load8_u
          i32.const 10
          i32.ne
          br_if $label6
        end $label6
        local.get $var2
        local.get $var0
        local.get $var3
        local.get $var2
        i32.load offset=36
        call_indirect (param i32 i32 i32) (result i32)
        local.tee $var4
        local.get $var3
        i32.lt_u
        br_if $label1
        local.get $var0
        local.get $var3
        i32.add
        local.set $var0
        local.get $var1
        local.get $var3
        i32.sub
        local.set $var1
        local.get $var2
        i32.load offset=20
        local.set $var5
      end $label4
      local.get $var5
      local.get $var0
      local.get $var1
      call $func19
      drop
      local.get $var2
      local.get $var2
      i32.load offset=20
      local.get $var1
      i32.add
      i32.store offset=20
      local.get $var3
      local.get $var1
      i32.add
      local.set $var4
    end $label1
    local.get $var4
  )
  (func $func21 (result i32)
    i32.const 42
  )
  (func $func22 (result i32)
    call $func21
  )
  (func $func23 (result i32)
    i32.const 2868
  )
  (func $func24
    i32.const 0
    i32.const 2792
    i32.const 40
    i32.add
    i32.store offset=3036
    i32.const 0
    call $func22
    i32.store offset=2904
  )
  (func $func25 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
    (local $var3 i32)
    i32.const 1
    local.set $var3
    block $label1
      block $label0
        local.get $var0
        i32.eqz
        br_if $label0
        local.get $var1
        i32.const 127
        i32.le_u
        br_if $label1
        block $label3
          block $label2
            call $func23
            i32.load offset=168
            i32.load
            br_if $label2
            local.get $var1
            i32.const -128
            i32.and
            i32.const 57216
            i32.eq
            br_if $label1
            call $__errno_location
            i32.const 25
            i32.store
            br $label3
          end $label2
          block $label4
            local.get $var1
            i32.const 2047
            i32.gt_u
            br_if $label4
            local.get $var0
            local.get $var1
            i32.const 63
            i32.and
            i32.const 128
            i32.or
            i32.store8 offset=1
            local.get $var0
            local.get $var1
            i32.const 6
            i32.shr_u
            i32.const 192
            i32.or
            i32.store8
            i32.const 2
            return
          end $label4
          block $label6
            block $label5
              local.get $var1
              i32.const 55296
              i32.lt_u
              br_if $label5
              local.get $var1
              i32.const -8192
              i32.and
              i32.const 57344
              i32.ne
              br_if $label6
            end $label5
            local.get $var0
            local.get $var1
            i32.const 63
            i32.and
            i32.const 128
            i32.or
            i32.store8 offset=2
            local.get $var0
            local.get $var1
            i32.const 12
            i32.shr_u
            i32.const 224
            i32.or
            i32.store8
            local.get $var0
            local.get $var1
            i32.const 6
            i32.shr_u
            i32.const 63
            i32.and
            i32.const 128
            i32.or
            i32.store8 offset=1
            i32.const 3
            return
          end $label6
          block $label7
            local.get $var1
            i32.const -65536
            i32.add
            i32.const 1048575
            i32.gt_u
            br_if $label7
            local.get $var0
            local.get $var1
            i32.const 63
            i32.and
            i32.const 128
            i32.or
            i32.store8 offset=3
            local.get $var0
            local.get $var1
            i32.const 18
            i32.shr_u
            i32.const 240
            i32.or
            i32.store8
            local.get $var0
            local.get $var1
            i32.const 6
            i32.shr_u
            i32.const 63
            i32.and
            i32.const 128
            i32.or
            i32.store8 offset=2
            local.get $var0
            local.get $var1
            i32.const 12
            i32.shr_u
            i32.const 63
            i32.and
            i32.const 128
            i32.or
            i32.store8 offset=1
            i32.const 4
            return
          end $label7
          call $__errno_location
          i32.const 25
          i32.store
        end $label3
        i32.const -1
        local.set $var3
      end $label0
      local.get $var3
      return
    end $label1
    local.get $var0
    local.get $var1
    i32.store8
    i32.const 1
  )
  (func $func26 (param $var0 i32) (param $var1 i32) (result i32)
    block $label0
      local.get $var0
      br_if $label0
      i32.const 0
      return
    end $label0
    local.get $var0
    local.get $var1
    i32.const 0
    call $func25
  )
  (func $func27 (param $var0 f64) (param $var1 i32) (result f64)
    (local $var2 i64) (local $var3 i32)
    block $label0
      local.get $var0
      i64.reinterpret_f64
      local.tee $var2
      i64.const 52
      i64.shr_u
      i32.wrap_i64
      i32.const 2047
      i32.and
      local.tee $var3
      i32.const 2047
      i32.eq
      br_if $label0
      block $label1
        local.get $var3
        br_if $label1
        block $label3
          block $label2
            local.get $var0
            f64.const 0.0
            f64.ne
            br_if $label2
            i32.const 0
            local.set $var3
            br $label3
          end $label2
          local.get $var0
          f64.const 18446744073709552000
          f64.mul
          local.get $var1
          call $func27
          local.set $var0
          local.get $var1
          i32.load
          i32.const -64
          i32.add
          local.set $var3
        end $label3
        local.get $var1
        local.get $var3
        i32.store
        local.get $var0
        return
      end $label1
      local.get $var1
      local.get $var3
      i32.const -1022
      i32.add
      i32.store
      local.get $var2
      i64.const -9218868437227405313
      i64.and
      i64.const 4602678819172646912
      i64.or
      f64.reinterpret_i64
      local.set $var0
    end $label0
    local.get $var0
  )
  (func $func28 (param $var0 i32) (param $var1 i64) (param $var2 i64) (param $var3 i32)
    (local $var4 i64)
    block $label1
      block $label0
        local.get $var3
        i32.const 64
        i32.and
        i32.eqz
        br_if $label0
        local.get $var1
        local.get $var3
        i32.const -64
        i32.add
        i64.extend_i32_u
        i64.shl
        local.set $var2
        i64.const 0
        local.set $var1
        br $label1
      end $label0
      local.get $var3
      i32.eqz
      br_if $label1
      local.get $var1
      i32.const 64
      local.get $var3
      i32.sub
      i64.extend_i32_u
      i64.shr_u
      local.get $var2
      local.get $var3
      i64.extend_i32_u
      local.tee $var4
      i64.shl
      i64.or
      local.set $var2
      local.get $var1
      local.get $var4
      i64.shl
      local.set $var1
    end $label1
    local.get $var0
    local.get $var1
    i64.store
    local.get $var0
    local.get $var2
    i64.store offset=8
  )
  (func $func29 (param $var0 i32) (param $var1 i64) (param $var2 i64) (param $var3 i32)
    (local $var4 i64)
    block $label1
      block $label0
        local.get $var3
        i32.const 64
        i32.and
        i32.eqz
        br_if $label0
        local.get $var2
        local.get $var3
        i32.const -64
        i32.add
        i64.extend_i32_u
        i64.shr_u
        local.set $var1
        i64.const 0
        local.set $var2
        br $label1
      end $label0
      local.get $var3
      i32.eqz
      br_if $label1
      local.get $var2
      i32.const 64
      local.get $var3
      i32.sub
      i64.extend_i32_u
      i64.shl
      local.get $var1
      local.get $var3
      i64.extend_i32_u
      local.tee $var4
      i64.shr_u
      i64.or
      local.set $var1
      local.get $var2
      local.get $var4
      i64.shr_u
      local.set $var2
    end $label1
    local.get $var0
    local.get $var1
    i64.store
    local.get $var0
    local.get $var2
    i64.store offset=8
  )
  (func $func30 (param $var0 i64) (param $var1 i64) (result f64)
    (local $var2 i32) (local $var3 i32) (local $var4 i64) (local $var5 i64)
    global.get $global0
    i32.const 32
    i32.sub
    local.tee $var2
    global.set $global0
    block $label2
      block $label0
        local.get $var1
        i64.const 9223372036854775807
        i64.and
        local.tee $var4
        i64.const -4323737117252386816
        i64.add
        local.get $var4
        i64.const -4899634919602388992
        i64.add
        i64.ge_u
        br_if $label0
        local.get $var0
        i64.const 60
        i64.shr_u
        local.get $var1
        i64.const 4
        i64.shl
        i64.or
        local.set $var4
        block $label1
          local.get $var0
          i64.const 1152921504606846975
          i64.and
          local.tee $var0
          i64.const 576460752303423489
          i64.lt_u
          br_if $label1
          local.get $var4
          i64.const 4611686018427387905
          i64.add
          local.set $var5
          br $label2
        end $label1
        local.get $var4
        i64.const 4611686018427387904
        i64.add
        local.set $var5
        local.get $var0
        i64.const 576460752303423488
        i64.xor
        i64.const 0
        i64.ne
        br_if $label2
        local.get $var5
        local.get $var4
        i64.const 1
        i64.and
        i64.add
        local.set $var5
        br $label2
      end $label0
      block $label3
        local.get $var0
        i64.eqz
        local.get $var4
        i64.const 9223090561878065152
        i64.lt_u
        local.get $var4
        i64.const 9223090561878065152
        i64.eq
        select
        br_if $label3
        local.get $var0
        i64.const 60
        i64.shr_u
        local.get $var1
        i64.const 4
        i64.shl
        i64.or
        i64.const 2251799813685247
        i64.and
        i64.const 9221120237041090560
        i64.or
        local.set $var5
        br $label2
      end $label3
      i64.const 9218868437227405312
      local.set $var5
      local.get $var4
      i64.const 4899634919602388991
      i64.gt_u
      br_if $label2
      i64.const 0
      local.set $var5
      local.get $var4
      i64.const 48
      i64.shr_u
      i32.wrap_i64
      local.tee $var3
      i32.const 15249
      i32.lt_u
      br_if $label2
      local.get $var2
      i32.const 16
      i32.add
      local.get $var0
      local.get $var1
      i64.const 281474976710655
      i64.and
      i64.const 281474976710656
      i64.or
      local.tee $var4
      local.get $var3
      i32.const -15233
      i32.add
      call $func28
      local.get $var2
      local.get $var0
      local.get $var4
      i32.const 15361
      local.get $var3
      i32.sub
      call $func29
      local.get $var2
      i64.load
      local.tee $var4
      i64.const 60
      i64.shr_u
      local.get $var2
      i32.const 8
      i32.add
      i64.load
      i64.const 4
      i64.shl
      i64.or
      local.set $var5
      block $label4
        local.get $var4
        i64.const 1152921504606846975
        i64.and
        local.get $var2
        i64.load offset=16
        local.get $var2
        i32.const 16
        i32.add
        i32.const 8
        i32.add
        i64.load
        i64.or
        i64.const 0
        i64.ne
        i64.extend_i32_u
        i64.or
        local.tee $var4
        i64.const 576460752303423489
        i64.lt_u
        br_if $label4
        local.get $var5
        i64.const 1
        i64.add
        local.set $var5
        br $label2
      end $label4
      local.get $var4
      i64.const 576460752303423488
      i64.xor
      i64.const 0
      i64.ne
      br_if $label2
      local.get $var5
      i64.const 1
      i64.and
      local.get $var5
      i64.add
      local.set $var5
    end $label2
    local.get $var2
    i32.const 32
    i32.add
    global.set $global0
    local.get $var5
    local.get $var1
    i64.const -9223372036854775808
    i64.and
    i64.or
    f64.reinterpret_i64
  )
  (func $func31 (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32) (param $var4 i32) (result i32)
    (local $var5 i32) (local $var6 i32) (local $var7 i32)
    global.get $global0
    i32.const 208
    i32.sub
    local.tee $var5
    global.set $global0
    local.get $var5
    local.get $var2
    i32.store offset=204
    i32.const 0
    local.set $var2
    local.get $var5
    i32.const 160
    i32.add
    i32.const 0
    i32.const 40
    call $func11
    drop
    local.get $var5
    local.get $var5
    i32.load offset=204
    i32.store offset=200
    block $label1
      block $label0
        i32.const 0
        local.get $var1
        local.get $var5
        i32.const 200
        i32.add
        local.get $var5
        i32.const 80
        i32.add
        local.get $var5
        i32.const 160
        i32.add
        local.get $var3
        local.get $var4
        call $func32
        i32.const 0
        i32.ge_s
        br_if $label0
        i32.const -1
        local.set $var1
        br $label1
      end $label0
      block $label2
        local.get $var0
        i32.load offset=76
        i32.const 0
        i32.lt_s
        br_if $label2
        local.get $var0
        call $func45
        local.set $var2
      end $label2
      local.get $var0
      i32.load
      local.set $var6
      block $label3
        local.get $var0
        i32.load8_s offset=74
        i32.const 0
        i32.gt_s
        br_if $label3
        local.get $var0
        local.get $var6
        i32.const -33
        i32.and
        i32.store
      end $label3
      local.get $var6
      i32.const 32
      i32.and
      local.set $var6
      block $label5
        block $label4
          local.get $var0
          i32.load offset=48
          i32.eqz
          br_if $label4
          local.get $var0
          local.get $var1
          local.get $var5
          i32.const 200
          i32.add
          local.get $var5
          i32.const 80
          i32.add
          local.get $var5
          i32.const 160
          i32.add
          local.get $var3
          local.get $var4
          call $func32
          local.set $var1
          br $label5
        end $label4
        local.get $var0
        i32.const 80
        i32.store offset=48
        local.get $var0
        local.get $var5
        i32.const 80
        i32.add
        i32.store offset=16
        local.get $var0
        local.get $var5
        i32.store offset=28
        local.get $var0
        local.get $var5
        i32.store offset=20
        local.get $var0
        i32.load offset=44
        local.set $var7
        local.get $var0
        local.get $var5
        i32.store offset=44
        local.get $var0
        local.get $var1
        local.get $var5
        i32.const 200
        i32.add
        local.get $var5
        i32.const 80
        i32.add
        local.get $var5
        i32.const 160
        i32.add
        local.get $var3
        local.get $var4
        call $func32
        local.set $var1
        local.get $var7
        i32.eqz
        br_if $label5
        local.get $var0
        i32.const 0
        i32.const 0
        local.get $var0
        i32.load offset=36
        call_indirect (param i32 i32 i32) (result i32)
        drop
        local.get $var0
        i32.const 0
        i32.store offset=48
        local.get $var0
        local.get $var7
        i32.store offset=44
        local.get $var0
        i32.const 0
        i32.store offset=28
        local.get $var0
        i32.const 0
        i32.store offset=16
        local.get $var0
        i32.load offset=20
        local.set $var3
        local.get $var0
        i32.const 0
        i32.store offset=20
        local.get $var1
        i32.const -1
        local.get $var3
        select
        local.set $var1
      end $label5
      local.get $var0
      local.get $var0
      i32.load
      local.tee $var3
      local.get $var6
      i32.or
      i32.store
      i32.const -1
      local.get $var1
      local.get $var3
      i32.const 32
      i32.and
      select
      local.set $var1
      local.get $var2
      i32.eqz
      br_if $label1
      local.get $var0
      call $func46
    end $label1
    local.get $var5
    i32.const 208
    i32.add
    global.set $global0
    local.get $var1
  )
  (func $func32 (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32) (param $var4 i32) (param $var5 i32) (param $var6 i32) (result i32)
    (local $var7 i32) (local $var8 i32) (local $var9 i32) (local $var10 i32) (local $var11 i32) (local $var12 i32) (local $var13 i32) (local $var14 i32) (local $var15 i32) (local $var16 i32) (local $var17 i32) (local $var18 i32) (local $var19 i32) (local $var20 i32) (local $var21 i32) (local $var22 i64)
    global.get $global0
    i32.const 80
    i32.sub
    local.tee $var7
    global.set $global0
    local.get $var7
    local.get $var1
    i32.store offset=76
    local.get $var7
    i32.const 55
    i32.add
    local.set $var8
    local.get $var7
    i32.const 56
    i32.add
    local.set $var9
    i32.const 0
    local.set $var10
    i32.const 0
    local.set $var11
    i32.const 0
    local.set $var1
    block $label24
      loop $label8
        block $label0
          local.get $var11
          i32.const 0
          i32.lt_s
          br_if $label0
          block $label1
            local.get $var1
            i32.const 2147483647
            local.get $var11
            i32.sub
            i32.le_s
            br_if $label1
            call $__errno_location
            i32.const 61
            i32.store
            i32.const -1
            local.set $var11
            br $label0
          end $label1
          local.get $var1
          local.get $var11
          i32.add
          local.set $var11
        end $label0
        local.get $var7
        i32.load offset=76
        local.tee $var12
        local.set $var1
        block $label29
          block $label32
            block $label45
              block $label16
                block $label2
                  local.get $var12
                  i32.load8_u
                  local.tee $var13
                  i32.eqz
                  br_if $label2
                  loop $label66
                    block $label5
                      block $label4
                        block $label3
                          local.get $var13
                          i32.const 255
                          i32.and
                          local.tee $var13
                          br_if $label3
                          local.get $var1
                          local.set $var13
                          br $label4
                        end $label3
                        local.get $var13
                        i32.const 37
                        i32.ne
                        br_if $label5
                        local.get $var1
                        local.set $var13
                        loop $label6
                          local.get $var1
                          i32.load8_u offset=1
                          i32.const 37
                          i32.ne
                          br_if $label4
                          local.get $var7
                          local.get $var1
                          i32.const 2
                          i32.add
                          local.tee $var14
                          i32.store offset=76
                          local.get $var13
                          i32.const 1
                          i32.add
                          local.set $var13
                          local.get $var1
                          i32.load8_u offset=2
                          local.set $var15
                          local.get $var14
                          local.set $var1
                          local.get $var15
                          i32.const 37
                          i32.eq
                          br_if $label6
                        end $label6
                      end $label4
                      local.get $var13
                      local.get $var12
                      i32.sub
                      local.set $var1
                      block $label7
                        local.get $var0
                        i32.eqz
                        br_if $label7
                        local.get $var0
                        local.get $var12
                        local.get $var1
                        call $func33
                      end $label7
                      local.get $var1
                      br_if $label8
                      i32.const -1
                      local.set $var16
                      i32.const 1
                      local.set $var13
                      local.get $var7
                      i32.load offset=76
                      i32.load8_s offset=1
                      call $func12
                      local.set $var14
                      local.get $var7
                      i32.load offset=76
                      local.set $var1
                      block $label9
                        local.get $var14
                        i32.eqz
                        br_if $label9
                        local.get $var1
                        i32.load8_u offset=2
                        i32.const 36
                        i32.ne
                        br_if $label9
                        local.get $var1
                        i32.load8_s offset=1
                        i32.const -48
                        i32.add
                        local.set $var16
                        i32.const 1
                        local.set $var10
                        i32.const 3
                        local.set $var13
                      end $label9
                      local.get $var7
                      local.get $var1
                      local.get $var13
                      i32.add
                      local.tee $var1
                      i32.store offset=76
                      i32.const 0
                      local.set $var17
                      block $label11
                        block $label10
                          local.get $var1
                          i32.load8_s
                          local.tee $var15
                          i32.const -32
                          i32.add
                          local.tee $var14
                          i32.const 31
                          i32.le_u
                          br_if $label10
                          local.get $var1
                          local.set $var13
                          br $label11
                        end $label10
                        i32.const 0
                        local.set $var17
                        local.get $var1
                        local.set $var13
                        i32.const 1
                        local.get $var14
                        i32.shl
                        local.tee $var14
                        i32.const 75913
                        i32.and
                        i32.eqz
                        br_if $label11
                        loop $label12
                          local.get $var7
                          local.get $var1
                          i32.const 1
                          i32.add
                          local.tee $var13
                          i32.store offset=76
                          local.get $var14
                          local.get $var17
                          i32.or
                          local.set $var17
                          local.get $var1
                          i32.load8_s offset=1
                          local.tee $var15
                          i32.const -32
                          i32.add
                          local.tee $var14
                          i32.const 32
                          i32.ge_u
                          br_if $label11
                          local.get $var13
                          local.set $var1
                          i32.const 1
                          local.get $var14
                          i32.shl
                          local.tee $var14
                          i32.const 75913
                          i32.and
                          br_if $label12
                        end $label12
                      end $label11
                      block $label18
                        block $label13
                          local.get $var15
                          i32.const 42
                          i32.ne
                          br_if $label13
                          block $label15
                            block $label14
                              local.get $var13
                              i32.load8_s offset=1
                              call $func12
                              i32.eqz
                              br_if $label14
                              local.get $var7
                              i32.load offset=76
                              local.tee $var13
                              i32.load8_u offset=2
                              i32.const 36
                              i32.ne
                              br_if $label14
                              local.get $var13
                              i32.load8_s offset=1
                              i32.const 2
                              i32.shl
                              local.get $var4
                              i32.add
                              i32.const -192
                              i32.add
                              i32.const 10
                              i32.store
                              local.get $var13
                              i32.const 3
                              i32.add
                              local.set $var1
                              local.get $var13
                              i32.load8_s offset=1
                              i32.const 3
                              i32.shl
                              local.get $var3
                              i32.add
                              i32.const -384
                              i32.add
                              i32.load
                              local.set $var18
                              i32.const 1
                              local.set $var10
                              br $label15
                            end $label14
                            local.get $var10
                            br_if $label16
                            i32.const 0
                            local.set $var10
                            i32.const 0
                            local.set $var18
                            block $label17
                              local.get $var0
                              i32.eqz
                              br_if $label17
                              local.get $var2
                              local.get $var2
                              i32.load
                              local.tee $var1
                              i32.const 4
                              i32.add
                              i32.store
                              local.get $var1
                              i32.load
                              local.set $var18
                            end $label17
                            local.get $var7
                            i32.load offset=76
                            i32.const 1
                            i32.add
                            local.set $var1
                          end $label15
                          local.get $var7
                          local.get $var1
                          i32.store offset=76
                          local.get $var18
                          i32.const -1
                          i32.gt_s
                          br_if $label18
                          i32.const 0
                          local.get $var18
                          i32.sub
                          local.set $var18
                          local.get $var17
                          i32.const 8192
                          i32.or
                          local.set $var17
                          br $label18
                        end $label13
                        local.get $var7
                        i32.const 76
                        i32.add
                        call $func34
                        local.tee $var18
                        i32.const 0
                        i32.lt_s
                        br_if $label16
                        local.get $var7
                        i32.load offset=76
                        local.set $var1
                      end $label18
                      i32.const -1
                      local.set $var19
                      block $label19
                        local.get $var1
                        i32.load8_u
                        i32.const 46
                        i32.ne
                        br_if $label19
                        block $label20
                          local.get $var1
                          i32.load8_u offset=1
                          i32.const 42
                          i32.ne
                          br_if $label20
                          block $label21
                            local.get $var1
                            i32.load8_s offset=2
                            call $func12
                            i32.eqz
                            br_if $label21
                            local.get $var7
                            i32.load offset=76
                            local.tee $var1
                            i32.load8_u offset=3
                            i32.const 36
                            i32.ne
                            br_if $label21
                            local.get $var1
                            i32.load8_s offset=2
                            i32.const 2
                            i32.shl
                            local.get $var4
                            i32.add
                            i32.const -192
                            i32.add
                            i32.const 10
                            i32.store
                            local.get $var1
                            i32.load8_s offset=2
                            i32.const 3
                            i32.shl
                            local.get $var3
                            i32.add
                            i32.const -384
                            i32.add
                            i32.load
                            local.set $var19
                            local.get $var7
                            local.get $var1
                            i32.const 4
                            i32.add
                            local.tee $var1
                            i32.store offset=76
                            br $label19
                          end $label21
                          local.get $var10
                          br_if $label16
                          block $label23
                            block $label22
                              local.get $var0
                              br_if $label22
                              i32.const 0
                              local.set $var19
                              br $label23
                            end $label22
                            local.get $var2
                            local.get $var2
                            i32.load
                            local.tee $var1
                            i32.const 4
                            i32.add
                            i32.store
                            local.get $var1
                            i32.load
                            local.set $var19
                          end $label23
                          local.get $var7
                          local.get $var7
                          i32.load offset=76
                          i32.const 2
                          i32.add
                          local.tee $var1
                          i32.store offset=76
                          br $label19
                        end $label20
                        local.get $var7
                        local.get $var1
                        i32.const 1
                        i32.add
                        i32.store offset=76
                        local.get $var7
                        i32.const 76
                        i32.add
                        call $func34
                        local.set $var19
                        local.get $var7
                        i32.load offset=76
                        local.set $var1
                      end $label19
                      i32.const 0
                      local.set $var13
                      loop $label25
                        local.get $var13
                        local.set $var14
                        i32.const -1
                        local.set $var20
                        local.get $var1
                        i32.load8_s
                        i32.const -65
                        i32.add
                        i32.const 57
                        i32.gt_u
                        br_if $label24
                        local.get $var7
                        local.get $var1
                        i32.const 1
                        i32.add
                        local.tee $var15
                        i32.store offset=76
                        local.get $var1
                        i32.load8_s
                        local.set $var13
                        local.get $var15
                        local.set $var1
                        local.get $var13
                        local.get $var14
                        i32.const 58
                        i32.mul
                        i32.add
                        i32.const 1039
                        i32.add
                        i32.load8_u
                        local.tee $var13
                        i32.const -1
                        i32.add
                        i32.const 8
                        i32.lt_u
                        br_if $label25
                      end $label25
                      block $label30
                        block $label28
                          block $label26
                            local.get $var13
                            i32.const 19
                            i32.eq
                            br_if $label26
                            local.get $var13
                            i32.eqz
                            br_if $label24
                            block $label27
                              local.get $var16
                              i32.const 0
                              i32.lt_s
                              br_if $label27
                              local.get $var4
                              local.get $var16
                              i32.const 2
                              i32.shl
                              i32.add
                              local.get $var13
                              i32.store
                              local.get $var7
                              local.get $var3
                              local.get $var16
                              i32.const 3
                              i32.shl
                              i32.add
                              i64.load
                              i64.store offset=64
                              br $label28
                            end $label27
                            local.get $var0
                            i32.eqz
                            br_if $label29
                            local.get $var7
                            i32.const 64
                            i32.add
                            local.get $var13
                            local.get $var2
                            local.get $var6
                            call $func35
                            local.get $var7
                            i32.load offset=76
                            local.set $var15
                            br $label30
                          end $label26
                          i32.const -1
                          local.set $var20
                          local.get $var16
                          i32.const -1
                          i32.gt_s
                          br_if $label24
                        end $label28
                        i32.const 0
                        local.set $var1
                        local.get $var0
                        i32.eqz
                        br_if $label8
                      end $label30
                      local.get $var17
                      i32.const -65537
                      i32.and
                      local.tee $var21
                      local.get $var17
                      local.get $var17
                      i32.const 8192
                      i32.and
                      select
                      local.set $var13
                      i32.const 0
                      local.set $var20
                      i32.const 1024
                      local.set $var16
                      local.get $var9
                      local.set $var17
                      block $label34
                        block $label33
                          block $label60
                            block $label59
                              block $label42
                                block $label44
                                  block $label39
                                    block $label54
                                      block $label46
                                        block $label35
                                          block $label37
                                            block $label31
                                              block $label38
                                                block $label36
                                                  block $label40
                                                    block $label41
                                                      local.get $var15
                                                      i32.const -1
                                                      i32.add
                                                      i32.load8_s
                                                      local.tee $var1
                                                      i32.const -33
                                                      i32.and
                                                      local.get $var1
                                                      local.get $var1
                                                      i32.const 15
                                                      i32.and
                                                      i32.const 3
                                                      i32.eq
                                                      select
                                                      local.get $var1
                                                      local.get $var14
                                                      select
                                                      local.tee $var1
                                                      i32.const -88
                                                      i32.add
                                                      br_table $label31 $label32 $label32 $label32 $label32 $label32 $label32 $label32 $label32 $label33 $label32 $label34 $label35 $label33 $label33 $label33 $label32 $label35 $label32 $label32 $label32 $label32 $label36 $label37 $label38 $label32 $label32 $label39 $label32 $label40 $label32 $label32 $label31 $label41
                                                    end $label41
                                                    local.get $var9
                                                    local.set $var17
                                                    block $label43
                                                      local.get $var1
                                                      i32.const -65
                                                      i32.add
                                                      br_table $label33 $label32 $label42 $label32 $label33 $label33 $label33 $label43
                                                    end $label43
                                                    local.get $var1
                                                    i32.const 83
                                                    i32.eq
                                                    br_if $label44
                                                    br $label45
                                                  end $label40
                                                  i32.const 0
                                                  local.set $var20
                                                  i32.const 1024
                                                  local.set $var16
                                                  local.get $var7
                                                  i64.load offset=64
                                                  local.set $var22
                                                  br $label46
                                                end $label36
                                                i32.const 0
                                                local.set $var1
                                                block $label53
                                                  block $label52
                                                    block $label51
                                                      block $label50
                                                        block $label49
                                                          block $label48
                                                            block $label47
                                                              local.get $var14
                                                              i32.const 255
                                                              i32.and
                                                              br_table $label47 $label48 $label49 $label50 $label51 $label8 $label52 $label53 $label8
                                                            end $label47
                                                            local.get $var7
                                                            i32.load offset=64
                                                            local.get $var11
                                                            i32.store
                                                            br $label8
                                                          end $label48
                                                          local.get $var7
                                                          i32.load offset=64
                                                          local.get $var11
                                                          i32.store
                                                          br $label8
                                                        end $label49
                                                        local.get $var7
                                                        i32.load offset=64
                                                        local.get $var11
                                                        i64.extend_i32_s
                                                        i64.store
                                                        br $label8
                                                      end $label50
                                                      local.get $var7
                                                      i32.load offset=64
                                                      local.get $var11
                                                      i32.store16
                                                      br $label8
                                                    end $label51
                                                    local.get $var7
                                                    i32.load offset=64
                                                    local.get $var11
                                                    i32.store8
                                                    br $label8
                                                  end $label52
                                                  local.get $var7
                                                  i32.load offset=64
                                                  local.get $var11
                                                  i32.store
                                                  br $label8
                                                end $label53
                                                local.get $var7
                                                i32.load offset=64
                                                local.get $var11
                                                i64.extend_i32_s
                                                i64.store
                                                br $label8
                                              end $label38
                                              local.get $var19
                                              i32.const 8
                                              local.get $var19
                                              i32.const 8
                                              i32.gt_u
                                              select
                                              local.set $var19
                                              local.get $var13
                                              i32.const 8
                                              i32.or
                                              local.set $var13
                                              i32.const 120
                                              local.set $var1
                                            end $label31
                                            local.get $var7
                                            i64.load offset=64
                                            local.get $var9
                                            local.get $var1
                                            i32.const 32
                                            i32.and
                                            call $func36
                                            local.set $var12
                                            i32.const 0
                                            local.set $var20
                                            i32.const 1024
                                            local.set $var16
                                            local.get $var7
                                            i64.load offset=64
                                            i64.eqz
                                            br_if $label54
                                            local.get $var13
                                            i32.const 8
                                            i32.and
                                            i32.eqz
                                            br_if $label54
                                            local.get $var1
                                            i32.const 4
                                            i32.shr_u
                                            i32.const 1024
                                            i32.add
                                            local.set $var16
                                            i32.const 2
                                            local.set $var20
                                            br $label54
                                          end $label37
                                          i32.const 0
                                          local.set $var20
                                          i32.const 1024
                                          local.set $var16
                                          local.get $var7
                                          i64.load offset=64
                                          local.get $var9
                                          call $func37
                                          local.set $var12
                                          local.get $var13
                                          i32.const 8
                                          i32.and
                                          i32.eqz
                                          br_if $label54
                                          local.get $var19
                                          local.get $var9
                                          local.get $var12
                                          i32.sub
                                          local.tee $var1
                                          i32.const 1
                                          i32.add
                                          local.get $var19
                                          local.get $var1
                                          i32.gt_s
                                          select
                                          local.set $var19
                                          br $label54
                                        end $label35
                                        block $label55
                                          local.get $var7
                                          i64.load offset=64
                                          local.tee $var22
                                          i64.const -1
                                          i64.gt_s
                                          br_if $label55
                                          local.get $var7
                                          i64.const 0
                                          local.get $var22
                                          i64.sub
                                          local.tee $var22
                                          i64.store offset=64
                                          i32.const 1
                                          local.set $var20
                                          i32.const 1024
                                          local.set $var16
                                          br $label46
                                        end $label55
                                        block $label56
                                          local.get $var13
                                          i32.const 2048
                                          i32.and
                                          i32.eqz
                                          br_if $label56
                                          i32.const 1
                                          local.set $var20
                                          i32.const 1025
                                          local.set $var16
                                          br $label46
                                        end $label56
                                        i32.const 1026
                                        i32.const 1024
                                        local.get $var13
                                        i32.const 1
                                        i32.and
                                        local.tee $var20
                                        select
                                        local.set $var16
                                      end $label46
                                      local.get $var22
                                      local.get $var9
                                      call $func38
                                      local.set $var12
                                    end $label54
                                    local.get $var13
                                    i32.const -65537
                                    i32.and
                                    local.get $var13
                                    local.get $var19
                                    i32.const -1
                                    i32.gt_s
                                    select
                                    local.set $var13
                                    block $label57
                                      local.get $var7
                                      i64.load offset=64
                                      local.tee $var22
                                      i64.const 0
                                      i64.ne
                                      br_if $label57
                                      local.get $var19
                                      br_if $label57
                                      i32.const 0
                                      local.set $var19
                                      local.get $var9
                                      local.set $var12
                                      br $label45
                                    end $label57
                                    local.get $var19
                                    local.get $var9
                                    local.get $var12
                                    i32.sub
                                    local.get $var22
                                    i64.eqz
                                    i32.add
                                    local.tee $var1
                                    local.get $var19
                                    local.get $var1
                                    i32.gt_s
                                    select
                                    local.set $var19
                                    br $label45
                                  end $label39
                                  i32.const 0
                                  local.set $var20
                                  local.get $var7
                                  i32.load offset=64
                                  local.tee $var1
                                  i32.const 1071
                                  local.get $var1
                                  select
                                  local.tee $var12
                                  i32.const 0
                                  local.get $var19
                                  call $func13
                                  local.tee $var1
                                  local.get $var12
                                  local.get $var19
                                  i32.add
                                  local.get $var1
                                  select
                                  local.set $var17
                                  local.get $var21
                                  local.set $var13
                                  local.get $var1
                                  local.get $var12
                                  i32.sub
                                  local.get $var19
                                  local.get $var1
                                  select
                                  local.set $var19
                                  br $label32
                                end $label44
                                block $label58
                                  local.get $var19
                                  i32.eqz
                                  br_if $label58
                                  local.get $var7
                                  i32.load offset=64
                                  local.set $var14
                                  br $label59
                                end $label58
                                i32.const 0
                                local.set $var1
                                local.get $var0
                                i32.const 32
                                local.get $var18
                                i32.const 0
                                local.get $var13
                                call $func39
                                br $label60
                              end $label42
                              local.get $var7
                              i32.const 0
                              i32.store offset=12
                              local.get $var7
                              local.get $var7
                              i64.load offset=64
                              i64.store32 offset=8
                              local.get $var7
                              local.get $var7
                              i32.const 8
                              i32.add
                              i32.store offset=64
                              i32.const -1
                              local.set $var19
                              local.get $var7
                              i32.const 8
                              i32.add
                              local.set $var14
                            end $label59
                            i32.const 0
                            local.set $var1
                            block $label61
                              loop $label63
                                local.get $var14
                                i32.load
                                local.tee $var15
                                i32.eqz
                                br_if $label61
                                block $label62
                                  local.get $var7
                                  i32.const 4
                                  i32.add
                                  local.get $var15
                                  call $func26
                                  local.tee $var15
                                  i32.const 0
                                  i32.lt_s
                                  local.tee $var12
                                  br_if $label62
                                  local.get $var15
                                  local.get $var19
                                  local.get $var1
                                  i32.sub
                                  i32.gt_u
                                  br_if $label62
                                  local.get $var14
                                  i32.const 4
                                  i32.add
                                  local.set $var14
                                  local.get $var19
                                  local.get $var15
                                  local.get $var1
                                  i32.add
                                  local.tee $var1
                                  i32.gt_u
                                  br_if $label63
                                  br $label61
                                end $label62
                              end $label63
                              i32.const -1
                              local.set $var20
                              local.get $var12
                              br_if $label24
                            end $label61
                            local.get $var0
                            i32.const 32
                            local.get $var18
                            local.get $var1
                            local.get $var13
                            call $func39
                            block $label64
                              local.get $var1
                              br_if $label64
                              i32.const 0
                              local.set $var1
                              br $label60
                            end $label64
                            i32.const 0
                            local.set $var14
                            local.get $var7
                            i32.load offset=64
                            local.set $var15
                            loop $label65
                              local.get $var15
                              i32.load
                              local.tee $var12
                              i32.eqz
                              br_if $label60
                              local.get $var7
                              i32.const 4
                              i32.add
                              local.get $var12
                              call $func26
                              local.tee $var12
                              local.get $var14
                              i32.add
                              local.tee $var14
                              local.get $var1
                              i32.gt_s
                              br_if $label60
                              local.get $var0
                              local.get $var7
                              i32.const 4
                              i32.add
                              local.get $var12
                              call $func33
                              local.get $var15
                              i32.const 4
                              i32.add
                              local.set $var15
                              local.get $var14
                              local.get $var1
                              i32.lt_u
                              br_if $label65
                            end $label65
                          end $label60
                          local.get $var0
                          i32.const 32
                          local.get $var18
                          local.get $var1
                          local.get $var13
                          i32.const 8192
                          i32.xor
                          call $func39
                          local.get $var18
                          local.get $var1
                          local.get $var18
                          local.get $var1
                          i32.gt_s
                          select
                          local.set $var1
                          br $label8
                        end $label33
                        local.get $var0
                        local.get $var7
                        f64.load offset=64
                        local.get $var18
                        local.get $var19
                        local.get $var13
                        local.get $var1
                        local.get $var5
                        call_indirect (param i32 f64 i32 i32 i32 i32) (result i32)
                        local.set $var1
                        br $label8
                      end $label34
                      local.get $var7
                      local.get $var7
                      i64.load offset=64
                      i64.store8 offset=55
                      i32.const 1
                      local.set $var19
                      local.get $var8
                      local.set $var12
                      local.get $var9
                      local.set $var17
                      local.get $var21
                      local.set $var13
                      br $label32
                    end $label5
                    local.get $var7
                    local.get $var1
                    i32.const 1
                    i32.add
                    local.tee $var14
                    i32.store offset=76
                    local.get $var1
                    i32.load8_u offset=1
                    local.set $var13
                    local.get $var14
                    local.set $var1
                    br $label66
                  end $label66
                  unreachable
                end $label2
                local.get $var11
                local.set $var20
                local.get $var0
                br_if $label24
                local.get $var10
                i32.eqz
                br_if $label29
                i32.const 1
                local.set $var1
                block $label67
                  loop $label68
                    local.get $var4
                    local.get $var1
                    i32.const 2
                    i32.shl
                    i32.add
                    i32.load
                    local.tee $var13
                    i32.eqz
                    br_if $label67
                    local.get $var3
                    local.get $var1
                    i32.const 3
                    i32.shl
                    i32.add
                    local.get $var13
                    local.get $var2
                    local.get $var6
                    call $func35
                    i32.const 1
                    local.set $var20
                    local.get $var1
                    i32.const 1
                    i32.add
                    local.tee $var1
                    i32.const 10
                    i32.ne
                    br_if $label68
                    br $label24
                  end $label68
                  unreachable
                end $label67
                i32.const 1
                local.set $var20
                local.get $var1
                i32.const 10
                i32.ge_u
                br_if $label24
                loop $label69
                  local.get $var4
                  local.get $var1
                  i32.const 2
                  i32.shl
                  i32.add
                  i32.load
                  br_if $label16
                  i32.const 1
                  local.set $var20
                  local.get $var1
                  i32.const 1
                  i32.add
                  local.tee $var1
                  i32.const 10
                  i32.eq
                  br_if $label24
                  br $label69
                end $label69
                unreachable
              end $label16
              i32.const -1
              local.set $var20
              br $label24
            end $label45
            local.get $var9
            local.set $var17
          end $label32
          local.get $var0
          i32.const 32
          local.get $var20
          local.get $var17
          local.get $var12
          i32.sub
          local.tee $var15
          local.get $var19
          local.get $var19
          local.get $var15
          i32.lt_s
          select
          local.tee $var17
          i32.add
          local.tee $var14
          local.get $var18
          local.get $var18
          local.get $var14
          i32.lt_s
          select
          local.tee $var1
          local.get $var14
          local.get $var13
          call $func39
          local.get $var0
          local.get $var16
          local.get $var20
          call $func33
          local.get $var0
          i32.const 48
          local.get $var1
          local.get $var14
          local.get $var13
          i32.const 65536
          i32.xor
          call $func39
          local.get $var0
          i32.const 48
          local.get $var17
          local.get $var15
          i32.const 0
          call $func39
          local.get $var0
          local.get $var12
          local.get $var15
          call $func33
          local.get $var0
          i32.const 32
          local.get $var1
          local.get $var14
          local.get $var13
          i32.const 8192
          i32.xor
          call $func39
          br $label8
        end $label29
      end $label8
      i32.const 0
      local.set $var20
    end $label24
    local.get $var7
    i32.const 80
    i32.add
    global.set $global0
    local.get $var20
  )
  (func $func33 (param $var0 i32) (param $var1 i32) (param $var2 i32)
    block $label0
      local.get $var0
      i32.load8_u
      i32.const 32
      i32.and
      br_if $label0
      local.get $var1
      local.get $var2
      local.get $var0
      call $func20
      drop
    end $label0
  )
  (func $func34 (param $var0 i32) (result i32)
    (local $var1 i32) (local $var2 i32) (local $var3 i32)
    i32.const 0
    local.set $var1
    block $label0
      local.get $var0
      i32.load
      i32.load8_s
      call $func12
      i32.eqz
      br_if $label0
      loop $label1
        local.get $var0
        i32.load
        local.tee $var2
        i32.load8_s
        local.set $var3
        local.get $var0
        local.get $var2
        i32.const 1
        i32.add
        i32.store
        local.get $var3
        local.get $var1
        i32.const 10
        i32.mul
        i32.add
        i32.const -48
        i32.add
        local.set $var1
        local.get $var2
        i32.load8_s offset=1
        call $func12
        br_if $label1
      end $label1
    end $label0
    local.get $var1
  )
  (func $func35 (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32)
    block $label0
      local.get $var1
      i32.const 20
      i32.gt_u
      br_if $label0
      block $label10
        block $label9
          block $label8
            block $label7
              block $label6
                block $label5
                  block $label4
                    block $label3
                      block $label2
                        block $label1
                          local.get $var1
                          i32.const -9
                          i32.add
                          br_table $label1 $label2 $label3 $label4 $label5 $label6 $label7 $label8 $label9 $label10 $label0
                        end $label1
                        local.get $var2
                        local.get $var2
                        i32.load
                        local.tee $var1
                        i32.const 4
                        i32.add
                        i32.store
                        local.get $var0
                        local.get $var1
                        i32.load
                        i32.store
                        return
                      end $label2
                      local.get $var2
                      local.get $var2
                      i32.load
                      local.tee $var1
                      i32.const 4
                      i32.add
                      i32.store
                      local.get $var0
                      local.get $var1
                      i64.load32_s
                      i64.store
                      return
                    end $label3
                    local.get $var2
                    local.get $var2
                    i32.load
                    local.tee $var1
                    i32.const 4
                    i32.add
                    i32.store
                    local.get $var0
                    local.get $var1
                    i64.load32_u
                    i64.store
                    return
                  end $label4
                  local.get $var2
                  local.get $var2
                  i32.load
                  i32.const 7
                  i32.add
                  i32.const -8
                  i32.and
                  local.tee $var1
                  i32.const 8
                  i32.add
                  i32.store
                  local.get $var0
                  local.get $var1
                  i64.load
                  i64.store
                  return
                end $label5
                local.get $var2
                local.get $var2
                i32.load
                local.tee $var1
                i32.const 4
                i32.add
                i32.store
                local.get $var0
                local.get $var1
                i64.load16_s
                i64.store
                return
              end $label6
              local.get $var2
              local.get $var2
              i32.load
              local.tee $var1
              i32.const 4
              i32.add
              i32.store
              local.get $var0
              local.get $var1
              i64.load16_u
              i64.store
              return
            end $label7
            local.get $var2
            local.get $var2
            i32.load
            local.tee $var1
            i32.const 4
            i32.add
            i32.store
            local.get $var0
            local.get $var1
            i64.load8_s
            i64.store
            return
          end $label8
          local.get $var2
          local.get $var2
          i32.load
          local.tee $var1
          i32.const 4
          i32.add
          i32.store
          local.get $var0
          local.get $var1
          i64.load8_u
          i64.store
          return
        end $label9
        local.get $var2
        local.get $var2
        i32.load
        i32.const 7
        i32.add
        i32.const -8
        i32.and
        local.tee $var1
        i32.const 8
        i32.add
        i32.store
        local.get $var0
        local.get $var1
        f64.load
        f64.store
        return
      end $label10
      local.get $var0
      local.get $var2
      local.get $var3
      call_indirect (param i32 i32)
    end $label0
  )
  (func $func36 (param $var0 i64) (param $var1 i32) (param $var2 i32) (result i32)
    (local $var3 i32)
    block $label0
      local.get $var0
      i64.eqz
      br_if $label0
      loop $label1
        local.get $var1
        i32.const -1
        i32.add
        local.tee $var1
        local.get $var0
        i32.wrap_i64
        i32.const 15
        i32.and
        i32.const 1568
        i32.add
        i32.load8_u
        local.get $var2
        i32.or
        i32.store8
        local.get $var0
        i64.const 15
        i64.gt_u
        local.set $var3
        local.get $var0
        i64.const 4
        i64.shr_u
        local.set $var0
        local.get $var3
        br_if $label1
      end $label1
    end $label0
    local.get $var1
  )
  (func $func37 (param $var0 i64) (param $var1 i32) (result i32)
    (local $var2 i32)
    block $label0
      local.get $var0
      i64.eqz
      br_if $label0
      loop $label1
        local.get $var1
        i32.const -1
        i32.add
        local.tee $var1
        local.get $var0
        i32.wrap_i64
        i32.const 7
        i32.and
        i32.const 48
        i32.or
        i32.store8
        local.get $var0
        i64.const 7
        i64.gt_u
        local.set $var2
        local.get $var0
        i64.const 3
        i64.shr_u
        local.set $var0
        local.get $var2
        br_if $label1
      end $label1
    end $label0
    local.get $var1
  )
  (func $func38 (param $var0 i64) (param $var1 i32) (result i32)
    (local $var2 i64) (local $var3 i32) (local $var4 i32) (local $var5 i32)
    block $label1
      block $label0
        local.get $var0
        i64.const 4294967296
        i64.ge_u
        br_if $label0
        local.get $var0
        local.set $var2
        br $label1
      end $label0
      loop $label2
        local.get $var1
        i32.const -1
        i32.add
        local.tee $var1
        local.get $var0
        local.get $var0
        i64.const 10
        i64.div_u
        local.tee $var2
        i64.const 10
        i64.mul
        i64.sub
        i32.wrap_i64
        i32.const 48
        i32.or
        i32.store8
        local.get $var0
        i64.const 42949672959
        i64.gt_u
        local.set $var3
        local.get $var2
        local.set $var0
        local.get $var3
        br_if $label2
      end $label2
    end $label1
    block $label3
      local.get $var2
      i32.wrap_i64
      local.tee $var3
      i32.eqz
      br_if $label3
      loop $label4
        local.get $var1
        i32.const -1
        i32.add
        local.tee $var1
        local.get $var3
        local.get $var3
        i32.const 10
        i32.div_u
        local.tee $var4
        i32.const 10
        i32.mul
        i32.sub
        i32.const 48
        i32.or
        i32.store8
        local.get $var3
        i32.const 9
        i32.gt_u
        local.set $var5
        local.get $var4
        local.set $var3
        local.get $var5
        br_if $label4
      end $label4
    end $label3
    local.get $var1
  )
  (func $func39 (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32) (param $var4 i32)
    (local $var5 i32)
    global.get $global0
    i32.const 256
    i32.sub
    local.tee $var5
    global.set $global0
    block $label0
      local.get $var4
      i32.const 73728
      i32.and
      br_if $label0
      local.get $var2
      local.get $var3
      i32.le_s
      br_if $label0
      local.get $var5
      local.get $var1
      i32.const 255
      i32.and
      local.get $var2
      local.get $var3
      i32.sub
      local.tee $var2
      i32.const 256
      local.get $var2
      i32.const 256
      i32.lt_u
      local.tee $var3
      select
      call $func11
      drop
      block $label1
        local.get $var3
        br_if $label1
        loop $label2
          local.get $var0
          local.get $var5
          i32.const 256
          call $func33
          local.get $var2
          i32.const -256
          i32.add
          local.tee $var2
          i32.const 255
          i32.gt_u
          br_if $label2
        end $label2
      end $label1
      local.get $var0
      local.get $var5
      local.get $var2
      call $func33
    end $label0
    local.get $var5
    i32.const 256
    i32.add
    global.set $global0
  )
  (func $func40 (param $var0 i32) (param $var1 i32) (param $var2 i32) (result i32)
    local.get $var0
    local.get $var1
    local.get $var2
    i32.const 4
    i32.const 5
    call $func31
  )
  (func $func41 (param $var0 i32) (param $var1 f64) (param $var2 i32) (param $var3 i32) (param $var4 i32) (param $var5 i32) (result i32)
    (local $var6 i32) (local $var7 i32) (local $var8 i32) (local $var9 i32) (local $var10 i32) (local $var11 i32) (local $var12 i32) (local $var13 i32) (local $var14 i32) (local $var15 i32) (local $var16 i32) (local $var17 i32) (local $var18 i32) (local $var19 i32) (local $var20 i32) (local $var21 i32) (local $var22 i32) (local $var23 i32) (local $var24 i64) (local $var25 i64) (local $var26 f64)
    global.get $global0
    i32.const 560
    i32.sub
    local.tee $var6
    global.set $global0
    i32.const 0
    local.set $var7
    local.get $var6
    i32.const 0
    i32.store offset=44
    block $label1
      block $label0
        local.get $var1
        call $func43
        local.tee $var24
        i64.const -1
        i64.gt_s
        br_if $label0
        i32.const 1
        local.set $var8
        i32.const 1034
        local.set $var9
        local.get $var1
        f64.neg
        local.tee $var1
        call $func43
        local.set $var24
        br $label1
      end $label0
      block $label2
        local.get $var4
        i32.const 2048
        i32.and
        i32.eqz
        br_if $label2
        i32.const 1
        local.set $var8
        i32.const 1037
        local.set $var9
        br $label1
      end $label2
      i32.const 1040
      i32.const 1035
      local.get $var4
      i32.const 1
      i32.and
      local.tee $var8
      select
      local.set $var9
      local.get $var8
      i32.eqz
      local.set $var7
    end $label1
    block $label4
      block $label3
        local.get $var24
        i64.const 9218868437227405312
        i64.and
        i64.const 9218868437227405312
        i64.ne
        br_if $label3
        local.get $var0
        i32.const 32
        local.get $var2
        local.get $var8
        i32.const 3
        i32.add
        local.tee $var10
        local.get $var4
        i32.const -65537
        i32.and
        call $func39
        local.get $var0
        local.get $var9
        local.get $var8
        call $func33
        local.get $var0
        i32.const 1053
        i32.const 1061
        local.get $var5
        i32.const 32
        i32.and
        local.tee $var11
        select
        i32.const 1057
        i32.const 1065
        local.get $var11
        select
        local.get $var1
        local.get $var1
        f64.ne
        select
        i32.const 3
        call $func33
        local.get $var0
        i32.const 32
        local.get $var2
        local.get $var10
        local.get $var4
        i32.const 8192
        i32.xor
        call $func39
        br $label4
      end $label3
      local.get $var6
      i32.const 16
      i32.add
      local.set $var12
      block $label7
        block $label8
          block $label6
            block $label5
              local.get $var1
              local.get $var6
              i32.const 44
              i32.add
              call $func27
              local.tee $var1
              local.get $var1
              f64.add
              local.tee $var1
              f64.const 0.0
              f64.eq
              br_if $label5
              local.get $var6
              local.get $var6
              i32.load offset=44
              local.tee $var11
              i32.const -1
              i32.add
              i32.store offset=44
              local.get $var5
              i32.const 32
              i32.or
              local.tee $var13
              i32.const 97
              i32.ne
              br_if $label6
              br $label7
            end $label5
            local.get $var5
            i32.const 32
            i32.or
            local.tee $var13
            i32.const 97
            i32.eq
            br_if $label7
            i32.const 6
            local.get $var3
            local.get $var3
            i32.const 0
            i32.lt_s
            select
            local.set $var14
            local.get $var6
            i32.load offset=44
            local.set $var15
            br $label8
          end $label6
          local.get $var6
          local.get $var11
          i32.const -29
          i32.add
          local.tee $var15
          i32.store offset=44
          i32.const 6
          local.get $var3
          local.get $var3
          i32.const 0
          i32.lt_s
          select
          local.set $var14
          local.get $var1
          f64.const 268435456
          f64.mul
          local.set $var1
        end $label8
        local.get $var6
        i32.const 48
        i32.add
        local.get $var6
        i32.const 336
        i32.add
        local.get $var15
        i32.const 0
        i32.lt_s
        select
        local.tee $var16
        local.set $var17
        loop $label11
          block $label10
            block $label9
              local.get $var1
              f64.const 4294967296
              f64.lt
              local.get $var1
              f64.const 0.0
              f64.ge
              i32.and
              i32.eqz
              br_if $label9
              local.get $var1
              i32.trunc_f64_u
              local.set $var11
              br $label10
            end $label9
            i32.const 0
            local.set $var11
          end $label10
          local.get $var17
          local.get $var11
          i32.store
          local.get $var17
          i32.const 4
          i32.add
          local.set $var17
          local.get $var1
          local.get $var11
          f64.convert_i32_u
          f64.sub
          f64.const 1000000000
          f64.mul
          local.tee $var1
          f64.const 0.0
          f64.ne
          br_if $label11
        end $label11
        block $label13
          block $label12
            local.get $var15
            i32.const 1
            i32.ge_s
            br_if $label12
            local.get $var15
            local.set $var3
            local.get $var17
            local.set $var11
            local.get $var16
            local.set $var18
            br $label13
          end $label12
          local.get $var16
          local.set $var18
          local.get $var15
          local.set $var3
          loop $label18
            local.get $var3
            i32.const 29
            local.get $var3
            i32.const 29
            i32.lt_s
            select
            local.set $var3
            block $label14
              local.get $var17
              i32.const -4
              i32.add
              local.tee $var11
              local.get $var18
              i32.lt_u
              br_if $label14
              local.get $var3
              i64.extend_i32_u
              local.set $var25
              i64.const 0
              local.set $var24
              loop $label15
                local.get $var11
                local.get $var11
                i64.load32_u
                local.get $var25
                i64.shl
                local.get $var24
                i64.const 4294967295
                i64.and
                i64.add
                local.tee $var24
                local.get $var24
                i64.const 1000000000
                i64.div_u
                local.tee $var24
                i64.const 1000000000
                i64.mul
                i64.sub
                i64.store32
                local.get $var11
                i32.const -4
                i32.add
                local.tee $var11
                local.get $var18
                i32.ge_u
                br_if $label15
              end $label15
              local.get $var24
              i32.wrap_i64
              local.tee $var11
              i32.eqz
              br_if $label14
              local.get $var18
              i32.const -4
              i32.add
              local.tee $var18
              local.get $var11
              i32.store
            end $label14
            block $label16
              loop $label17
                local.get $var17
                local.tee $var11
                local.get $var18
                i32.le_u
                br_if $label16
                local.get $var11
                i32.const -4
                i32.add
                local.tee $var17
                i32.load
                i32.eqz
                br_if $label17
              end $label17
            end $label16
            local.get $var6
            local.get $var6
            i32.load offset=44
            local.get $var3
            i32.sub
            local.tee $var3
            i32.store offset=44
            local.get $var11
            local.set $var17
            local.get $var3
            i32.const 0
            i32.gt_s
            br_if $label18
          end $label18
        end $label13
        local.get $var14
        i32.const 25
        i32.add
        i32.const 9
        i32.div_s
        local.set $var17
        block $label19
          local.get $var3
          i32.const -1
          i32.gt_s
          br_if $label19
          local.get $var17
          i32.const 1
          i32.add
          local.set $var19
          local.get $var13
          i32.const 102
          i32.eq
          local.set $var20
          loop $label23
            i32.const 0
            local.get $var3
            i32.sub
            local.tee $var17
            i32.const 9
            local.get $var17
            i32.const 9
            i32.lt_s
            select
            local.set $var10
            block $label22
              block $label20
                local.get $var18
                local.get $var11
                i32.ge_u
                br_if $label20
                i32.const 1000000000
                local.get $var10
                i32.shr_u
                local.set $var21
                i32.const -1
                local.get $var10
                i32.shl
                i32.const -1
                i32.xor
                local.set $var22
                i32.const 0
                local.set $var3
                local.get $var18
                local.set $var17
                loop $label21
                  local.get $var17
                  local.get $var17
                  i32.load
                  local.tee $var23
                  local.get $var10
                  i32.shr_u
                  local.get $var3
                  i32.add
                  i32.store
                  local.get $var23
                  local.get $var22
                  i32.and
                  local.get $var21
                  i32.mul
                  local.set $var3
                  local.get $var17
                  i32.const 4
                  i32.add
                  local.tee $var17
                  local.get $var11
                  i32.lt_u
                  br_if $label21
                end $label21
                local.get $var18
                i32.load
                local.set $var17
                local.get $var3
                i32.eqz
                br_if $label22
                local.get $var11
                local.get $var3
                i32.store
                local.get $var11
                i32.const 4
                i32.add
                local.set $var11
                br $label22
              end $label20
              local.get $var18
              i32.load
              local.set $var17
            end $label22
            local.get $var6
            local.get $var6
            i32.load offset=44
            local.get $var10
            i32.add
            local.tee $var3
            i32.store offset=44
            local.get $var16
            local.get $var18
            local.get $var17
            i32.eqz
            i32.const 2
            i32.shl
            i32.add
            local.tee $var18
            local.get $var20
            select
            local.tee $var17
            local.get $var19
            i32.const 2
            i32.shl
            i32.add
            local.get $var11
            local.get $var11
            local.get $var17
            i32.sub
            i32.const 2
            i32.shr_s
            local.get $var19
            i32.gt_s
            select
            local.set $var11
            local.get $var3
            i32.const 0
            i32.lt_s
            br_if $label23
          end $label23
        end $label19
        i32.const 0
        local.set $var17
        block $label24
          local.get $var18
          local.get $var11
          i32.ge_u
          br_if $label24
          local.get $var16
          local.get $var18
          i32.sub
          i32.const 2
          i32.shr_s
          i32.const 9
          i32.mul
          local.set $var17
          i32.const 10
          local.set $var3
          local.get $var18
          i32.load
          local.tee $var23
          i32.const 10
          i32.lt_u
          br_if $label24
          loop $label25
            local.get $var17
            i32.const 1
            i32.add
            local.set $var17
            local.get $var23
            local.get $var3
            i32.const 10
            i32.mul
            local.tee $var3
            i32.ge_u
            br_if $label25
          end $label25
        end $label24
        block $label26
          local.get $var14
          i32.const 0
          local.get $var17
          local.get $var13
          i32.const 102
          i32.eq
          select
          i32.sub
          local.get $var13
          i32.const 103
          i32.eq
          local.get $var14
          i32.const 0
          i32.ne
          i32.and
          i32.sub
          local.tee $var3
          local.get $var11
          local.get $var16
          i32.sub
          i32.const 2
          i32.shr_s
          i32.const 9
          i32.mul
          i32.const -9
          i32.add
          i32.ge_s
          br_if $label26
          local.get $var3
          i32.const 9216
          i32.add
          local.tee $var23
          i32.const 9
          i32.div_s
          local.tee $var21
          i32.const 2
          i32.shl
          local.get $var6
          i32.const 48
          i32.add
          i32.const 4
          i32.const 292
          local.get $var15
          i32.const 0
          i32.lt_s
          select
          i32.add
          i32.add
          i32.const -4096
          i32.add
          local.set $var10
          i32.const 10
          local.set $var3
          block $label27
            local.get $var23
            local.get $var21
            i32.const 9
            i32.mul
            i32.sub
            local.tee $var23
            i32.const 7
            i32.gt_s
            br_if $label27
            loop $label28
              local.get $var3
              i32.const 10
              i32.mul
              local.set $var3
              local.get $var23
              i32.const 1
              i32.add
              local.tee $var23
              i32.const 8
              i32.ne
              br_if $label28
            end $label28
          end $label27
          local.get $var10
          i32.const 4
          i32.add
          local.set $var22
          block $label30
            block $label29
              local.get $var10
              i32.load
              local.tee $var23
              local.get $var23
              local.get $var3
              i32.div_u
              local.tee $var19
              local.get $var3
              i32.mul
              i32.sub
              local.tee $var21
              br_if $label29
              local.get $var22
              local.get $var11
              i32.eq
              br_if $label30
            end $label29
            f64.const 0.5
            f64.const 1
            f64.const 1.5
            local.get $var22
            local.get $var11
            i32.eq
            select
            f64.const 1.5
            local.get $var21
            local.get $var3
            i32.const 1
            i32.shr_u
            local.tee $var22
            i32.eq
            select
            local.get $var21
            local.get $var22
            i32.lt_u
            select
            local.set $var26
            f64.const 9007199254740994
            f64.const 9007199254740992
            local.get $var19
            i32.const 1
            i32.and
            select
            local.set $var1
            block $label31
              local.get $var7
              br_if $label31
              local.get $var9
              i32.load8_u
              i32.const 45
              i32.ne
              br_if $label31
              local.get $var26
              f64.neg
              local.set $var26
              local.get $var1
              f64.neg
              local.set $var1
            end $label31
            local.get $var10
            local.get $var23
            local.get $var21
            i32.sub
            local.tee $var23
            i32.store
            local.get $var1
            local.get $var26
            f64.add
            local.get $var1
            f64.eq
            br_if $label30
            local.get $var10
            local.get $var23
            local.get $var3
            i32.add
            local.tee $var17
            i32.store
            block $label32
              local.get $var17
              i32.const 1000000000
              i32.lt_u
              br_if $label32
              loop $label34
                local.get $var10
                i32.const 0
                i32.store
                block $label33
                  local.get $var10
                  i32.const -4
                  i32.add
                  local.tee $var10
                  local.get $var18
                  i32.ge_u
                  br_if $label33
                  local.get $var18
                  i32.const -4
                  i32.add
                  local.tee $var18
                  i32.const 0
                  i32.store
                end $label33
                local.get $var10
                local.get $var10
                i32.load
                i32.const 1
                i32.add
                local.tee $var17
                i32.store
                local.get $var17
                i32.const 999999999
                i32.gt_u
                br_if $label34
              end $label34
            end $label32
            local.get $var16
            local.get $var18
            i32.sub
            i32.const 2
            i32.shr_s
            i32.const 9
            i32.mul
            local.set $var17
            i32.const 10
            local.set $var3
            local.get $var18
            i32.load
            local.tee $var23
            i32.const 10
            i32.lt_u
            br_if $label30
            loop $label35
              local.get $var17
              i32.const 1
              i32.add
              local.set $var17
              local.get $var23
              local.get $var3
              i32.const 10
              i32.mul
              local.tee $var3
              i32.ge_u
              br_if $label35
            end $label35
          end $label30
          local.get $var10
          i32.const 4
          i32.add
          local.tee $var3
          local.get $var11
          local.get $var11
          local.get $var3
          i32.gt_u
          select
          local.set $var11
        end $label26
        block $label36
          loop $label37
            local.get $var11
            local.tee $var23
            local.get $var18
            i32.le_u
            local.tee $var3
            br_if $label36
            local.get $var23
            i32.const -4
            i32.add
            local.tee $var11
            i32.load
            i32.eqz
            br_if $label37
          end $label37
        end $label36
        block $label39
          block $label38
            local.get $var13
            i32.const 103
            i32.eq
            br_if $label38
            local.get $var4
            i32.const 8
            i32.and
            local.set $var22
            br $label39
          end $label38
          local.get $var17
          i32.const -1
          i32.xor
          i32.const -1
          local.get $var14
          i32.const 1
          local.get $var14
          select
          local.tee $var11
          local.get $var17
          i32.gt_s
          local.get $var17
          i32.const -5
          i32.gt_s
          i32.and
          local.tee $var10
          select
          local.get $var11
          i32.add
          local.set $var14
          i32.const -1
          i32.const -2
          local.get $var10
          select
          local.get $var5
          i32.add
          local.set $var5
          local.get $var4
          i32.const 8
          i32.and
          local.tee $var22
          br_if $label39
          i32.const -9
          local.set $var11
          block $label40
            local.get $var3
            br_if $label40
            local.get $var23
            i32.const -4
            i32.add
            i32.load
            local.tee $var10
            i32.eqz
            br_if $label40
            i32.const 10
            local.set $var3
            i32.const 0
            local.set $var11
            local.get $var10
            i32.const 10
            i32.rem_u
            br_if $label40
            loop $label41
              local.get $var11
              local.tee $var21
              i32.const 1
              i32.add
              local.set $var11
              local.get $var10
              local.get $var3
              i32.const 10
              i32.mul
              local.tee $var3
              i32.rem_u
              i32.eqz
              br_if $label41
            end $label41
            local.get $var21
            i32.const -1
            i32.xor
            local.set $var11
          end $label40
          local.get $var23
          local.get $var16
          i32.sub
          i32.const 2
          i32.shr_s
          i32.const 9
          i32.mul
          local.set $var3
          block $label42
            local.get $var5
            i32.const -33
            i32.and
            i32.const 70
            i32.ne
            br_if $label42
            i32.const 0
            local.set $var22
            local.get $var14
            local.get $var3
            local.get $var11
            i32.add
            i32.const -9
            i32.add
            local.tee $var11
            i32.const 0
            local.get $var11
            i32.const 0
            i32.gt_s
            select
            local.tee $var11
            local.get $var14
            local.get $var11
            i32.lt_s
            select
            local.set $var14
            br $label39
          end $label42
          i32.const 0
          local.set $var22
          local.get $var14
          local.get $var17
          local.get $var3
          i32.add
          local.get $var11
          i32.add
          i32.const -9
          i32.add
          local.tee $var11
          i32.const 0
          local.get $var11
          i32.const 0
          i32.gt_s
          select
          local.tee $var11
          local.get $var14
          local.get $var11
          i32.lt_s
          select
          local.set $var14
        end $label39
        local.get $var14
        local.get $var22
        i32.or
        i32.const 0
        i32.ne
        local.set $var19
        block $label44
          block $label43
            local.get $var5
            i32.const -33
            i32.and
            local.tee $var3
            i32.const 70
            i32.ne
            br_if $label43
            local.get $var17
            i32.const 0
            local.get $var17
            i32.const 0
            i32.gt_s
            select
            local.set $var11
            br $label44
          end $label43
          block $label45
            local.get $var12
            local.get $var17
            local.get $var17
            i32.const 31
            i32.shr_s
            local.tee $var11
            i32.add
            local.get $var11
            i32.xor
            i64.extend_i32_u
            local.get $var12
            call $func38
            local.tee $var11
            i32.sub
            i32.const 1
            i32.gt_s
            br_if $label45
            loop $label46
              local.get $var11
              i32.const -1
              i32.add
              local.tee $var11
              i32.const 48
              i32.store8
              local.get $var12
              local.get $var11
              i32.sub
              i32.const 2
              i32.lt_s
              br_if $label46
            end $label46
          end $label45
          local.get $var11
          i32.const -2
          i32.add
          local.tee $var20
          local.get $var5
          i32.store8
          local.get $var11
          i32.const -1
          i32.add
          i32.const 45
          i32.const 43
          local.get $var17
          i32.const 0
          i32.lt_s
          select
          i32.store8
          local.get $var12
          local.get $var20
          i32.sub
          local.set $var11
        end $label44
        local.get $var0
        i32.const 32
        local.get $var2
        local.get $var8
        local.get $var14
        i32.add
        local.get $var19
        i32.add
        local.get $var11
        i32.add
        i32.const 1
        i32.add
        local.tee $var10
        local.get $var4
        call $func39
        local.get $var0
        local.get $var9
        local.get $var8
        call $func33
        local.get $var0
        i32.const 48
        local.get $var2
        local.get $var10
        local.get $var4
        i32.const 65536
        i32.xor
        call $func39
        block $label64
          block $label52
            block $label53
              block $label47
                local.get $var3
                i32.const 70
                i32.ne
                br_if $label47
                local.get $var6
                i32.const 16
                i32.add
                i32.const 8
                i32.or
                local.set $var21
                local.get $var6
                i32.const 16
                i32.add
                i32.const 9
                i32.or
                local.set $var3
                local.get $var16
                local.get $var18
                local.get $var18
                local.get $var16
                i32.gt_u
                select
                local.tee $var18
                local.set $var17
                loop $label51
                  local.get $var17
                  i64.load32_u
                  local.get $var3
                  call $func38
                  local.set $var11
                  block $label49
                    block $label48
                      local.get $var17
                      local.get $var18
                      i32.eq
                      br_if $label48
                      local.get $var11
                      local.get $var6
                      i32.const 16
                      i32.add
                      i32.le_u
                      br_if $label49
                      loop $label50
                        local.get $var11
                        i32.const -1
                        i32.add
                        local.tee $var11
                        i32.const 48
                        i32.store8
                        local.get $var11
                        local.get $var6
                        i32.const 16
                        i32.add
                        i32.gt_u
                        br_if $label50
                        br $label49
                      end $label50
                      unreachable
                    end $label48
                    local.get $var11
                    local.get $var3
                    i32.ne
                    br_if $label49
                    local.get $var6
                    i32.const 48
                    i32.store8 offset=24
                    local.get $var21
                    local.set $var11
                  end $label49
                  local.get $var0
                  local.get $var11
                  local.get $var3
                  local.get $var11
                  i32.sub
                  call $func33
                  local.get $var17
                  i32.const 4
                  i32.add
                  local.tee $var17
                  local.get $var16
                  i32.le_u
                  br_if $label51
                end $label51
                i32.const 0
                local.set $var11
                local.get $var19
                i32.eqz
                br_if $label52
                local.get $var0
                i32.const 1069
                i32.const 1
                call $func33
                local.get $var17
                local.get $var23
                i32.ge_u
                br_if $label53
                local.get $var14
                i32.const 1
                i32.lt_s
                br_if $label53
                loop $label56
                  block $label54
                    local.get $var17
                    i64.load32_u
                    local.get $var3
                    call $func38
                    local.tee $var11
                    local.get $var6
                    i32.const 16
                    i32.add
                    i32.le_u
                    br_if $label54
                    loop $label55
                      local.get $var11
                      i32.const -1
                      i32.add
                      local.tee $var11
                      i32.const 48
                      i32.store8
                      local.get $var11
                      local.get $var6
                      i32.const 16
                      i32.add
                      i32.gt_u
                      br_if $label55
                    end $label55
                  end $label54
                  local.get $var0
                  local.get $var11
                  local.get $var14
                  i32.const 9
                  local.get $var14
                  i32.const 9
                  i32.lt_s
                  select
                  call $func33
                  local.get $var14
                  i32.const -9
                  i32.add
                  local.set $var11
                  local.get $var17
                  i32.const 4
                  i32.add
                  local.tee $var17
                  local.get $var23
                  i32.ge_u
                  br_if $label52
                  local.get $var14
                  i32.const 9
                  i32.gt_s
                  local.set $var18
                  local.get $var11
                  local.set $var14
                  local.get $var18
                  br_if $label56
                  br $label52
                end $label56
                unreachable
              end $label47
              block $label57
                local.get $var14
                i32.const 0
                i32.lt_s
                br_if $label57
                local.get $var23
                local.get $var18
                i32.const 4
                i32.add
                local.get $var23
                local.get $var18
                i32.gt_u
                select
                local.set $var21
                local.get $var6
                i32.const 16
                i32.add
                i32.const 9
                i32.or
                local.set $var3
                local.get $var6
                i32.const 16
                i32.add
                i32.const 8
                i32.or
                local.set $var16
                local.get $var18
                local.set $var17
                loop $label63
                  block $label58
                    local.get $var17
                    i64.load32_u
                    local.get $var3
                    call $func38
                    local.tee $var11
                    local.get $var3
                    i32.ne
                    br_if $label58
                    local.get $var6
                    i32.const 48
                    i32.store8 offset=24
                    local.get $var16
                    local.set $var11
                  end $label58
                  block $label60
                    block $label59
                      local.get $var17
                      local.get $var18
                      i32.eq
                      br_if $label59
                      local.get $var11
                      local.get $var6
                      i32.const 16
                      i32.add
                      i32.le_u
                      br_if $label60
                      loop $label61
                        local.get $var11
                        i32.const -1
                        i32.add
                        local.tee $var11
                        i32.const 48
                        i32.store8
                        local.get $var11
                        local.get $var6
                        i32.const 16
                        i32.add
                        i32.gt_u
                        br_if $label61
                        br $label60
                      end $label61
                      unreachable
                    end $label59
                    local.get $var0
                    local.get $var11
                    i32.const 1
                    call $func33
                    local.get $var11
                    i32.const 1
                    i32.add
                    local.set $var11
                    block $label62
                      local.get $var14
                      i32.const 0
                      i32.gt_s
                      br_if $label62
                      local.get $var22
                      i32.eqz
                      br_if $label60
                    end $label62
                    local.get $var0
                    i32.const 1069
                    i32.const 1
                    call $func33
                  end $label60
                  local.get $var0
                  local.get $var11
                  local.get $var3
                  local.get $var11
                  i32.sub
                  local.tee $var23
                  local.get $var14
                  local.get $var14
                  local.get $var23
                  i32.gt_s
                  select
                  call $func33
                  local.get $var14
                  local.get $var23
                  i32.sub
                  local.set $var14
                  local.get $var17
                  i32.const 4
                  i32.add
                  local.tee $var17
                  local.get $var21
                  i32.ge_u
                  br_if $label57
                  local.get $var14
                  i32.const -1
                  i32.gt_s
                  br_if $label63
                end $label63
              end $label57
              local.get $var0
              i32.const 48
              local.get $var14
              i32.const 18
              i32.add
              i32.const 18
              i32.const 0
              call $func39
              local.get $var0
              local.get $var20
              local.get $var12
              local.get $var20
              i32.sub
              call $func33
              br $label64
            end $label53
            local.get $var14
            local.set $var11
          end $label52
          local.get $var0
          i32.const 48
          local.get $var11
          i32.const 9
          i32.add
          i32.const 9
          i32.const 0
          call $func39
        end $label64
        local.get $var0
        i32.const 32
        local.get $var2
        local.get $var10
        local.get $var4
        i32.const 8192
        i32.xor
        call $func39
        br $label4
      end $label7
      local.get $var9
      local.get $var5
      i32.const 26
      i32.shl
      i32.const 31
      i32.shr_s
      i32.const 9
      i32.and
      i32.add
      local.set $var14
      block $label65
        local.get $var3
        i32.const 11
        i32.gt_u
        br_if $label65
        i32.const 12
        local.get $var3
        i32.sub
        local.set $var11
        f64.const 8
        local.set $var26
        loop $label66
          local.get $var26
          f64.const 16
          f64.mul
          local.set $var26
          local.get $var11
          i32.const -1
          i32.add
          local.tee $var11
          br_if $label66
        end $label66
        block $label67
          local.get $var14
          i32.load8_u
          i32.const 45
          i32.ne
          br_if $label67
          local.get $var26
          local.get $var1
          f64.neg
          local.get $var26
          f64.sub
          f64.add
          f64.neg
          local.set $var1
          br $label65
        end $label67
        local.get $var1
        local.get $var26
        f64.add
        local.get $var26
        f64.sub
        local.set $var1
      end $label65
      block $label68
        local.get $var6
        i32.load offset=44
        local.tee $var11
        local.get $var11
        i32.const 31
        i32.shr_s
        local.tee $var11
        i32.add
        local.get $var11
        i32.xor
        i64.extend_i32_u
        local.get $var12
        call $func38
        local.tee $var11
        local.get $var12
        i32.ne
        br_if $label68
        local.get $var6
        i32.const 48
        i32.store8 offset=15
        local.get $var6
        i32.const 15
        i32.add
        local.set $var11
      end $label68
      local.get $var8
      i32.const 2
      i32.or
      local.set $var22
      local.get $var5
      i32.const 32
      i32.and
      local.set $var18
      local.get $var6
      i32.load offset=44
      local.set $var17
      local.get $var11
      i32.const -2
      i32.add
      local.tee $var21
      local.get $var5
      i32.const 15
      i32.add
      i32.store8
      local.get $var11
      i32.const -1
      i32.add
      i32.const 45
      i32.const 43
      local.get $var17
      i32.const 0
      i32.lt_s
      select
      i32.store8
      local.get $var4
      i32.const 8
      i32.and
      local.set $var23
      local.get $var6
      i32.const 16
      i32.add
      local.set $var17
      loop $label73
        local.get $var17
        local.set $var11
        block $label70
          block $label69
            local.get $var1
            f64.abs
            f64.const 2147483648
            f64.lt
            i32.eqz
            br_if $label69
            local.get $var1
            i32.trunc_f64_s
            local.set $var17
            br $label70
          end $label69
          i32.const -2147483648
          local.set $var17
        end $label70
        local.get $var11
        local.get $var17
        i32.const 1568
        i32.add
        i32.load8_u
        local.get $var18
        i32.or
        i32.store8
        local.get $var1
        local.get $var17
        f64.convert_i32_s
        f64.sub
        f64.const 16
        f64.mul
        local.set $var1
        block $label71
          local.get $var11
          i32.const 1
          i32.add
          local.tee $var17
          local.get $var6
          i32.const 16
          i32.add
          i32.sub
          i32.const 1
          i32.ne
          br_if $label71
          block $label72
            local.get $var1
            f64.const 0.0
            f64.ne
            br_if $label72
            local.get $var3
            i32.const 0
            i32.gt_s
            br_if $label72
            local.get $var23
            i32.eqz
            br_if $label71
          end $label72
          local.get $var11
          i32.const 46
          i32.store8 offset=1
          local.get $var11
          i32.const 2
          i32.add
          local.set $var17
        end $label71
        local.get $var1
        f64.const 0.0
        f64.ne
        br_if $label73
      end $label73
      block $label75
        block $label74
          local.get $var3
          i32.eqz
          br_if $label74
          local.get $var17
          local.get $var6
          i32.const 16
          i32.add
          i32.sub
          i32.const -2
          i32.add
          local.get $var3
          i32.ge_s
          br_if $label74
          local.get $var3
          local.get $var12
          i32.add
          local.get $var21
          i32.sub
          i32.const 2
          i32.add
          local.set $var11
          br $label75
        end $label74
        local.get $var12
        local.get $var6
        i32.const 16
        i32.add
        local.get $var21
        i32.add
        i32.sub
        local.get $var17
        i32.add
        local.set $var11
      end $label75
      local.get $var0
      i32.const 32
      local.get $var2
      local.get $var11
      local.get $var22
      i32.add
      local.tee $var10
      local.get $var4
      call $func39
      local.get $var0
      local.get $var14
      local.get $var22
      call $func33
      local.get $var0
      i32.const 48
      local.get $var2
      local.get $var10
      local.get $var4
      i32.const 65536
      i32.xor
      call $func39
      local.get $var0
      local.get $var6
      i32.const 16
      i32.add
      local.get $var17
      local.get $var6
      i32.const 16
      i32.add
      i32.sub
      local.tee $var17
      call $func33
      local.get $var0
      i32.const 48
      local.get $var11
      local.get $var17
      local.get $var12
      local.get $var21
      i32.sub
      local.tee $var18
      i32.add
      i32.sub
      i32.const 0
      i32.const 0
      call $func39
      local.get $var0
      local.get $var21
      local.get $var18
      call $func33
      local.get $var0
      i32.const 32
      local.get $var2
      local.get $var10
      local.get $var4
      i32.const 8192
      i32.xor
      call $func39
    end $label4
    local.get $var6
    i32.const 560
    i32.add
    global.set $global0
    local.get $var2
    local.get $var10
    local.get $var10
    local.get $var2
    i32.lt_s
    select
  )
  (func $func42 (param $var0 i32) (param $var1 i32)
    (local $var2 i32)
    local.get $var1
    local.get $var1
    i32.load
    i32.const 7
    i32.add
    i32.const -8
    i32.and
    local.tee $var2
    i32.const 16
    i32.add
    i32.store
    local.get $var0
    local.get $var2
    i64.load
    local.get $var2
    i32.const 8
    i32.add
    i64.load
    call $func30
    f64.store
  )
  (func $func43 (param $var0 f64) (result i64)
    local.get $var0
    i64.reinterpret_f64
  )
  (func $func44 (param $var0 i32) (param $var1 i32) (result i32)
    (local $var2 i32)
    global.get $global0
    i32.const 16
    i32.sub
    local.tee $var2
    global.set $global0
    local.get $var2
    local.get $var1
    i32.store offset=12
    i32.const 0
    i32.load offset=1096
    local.get $var0
    local.get $var1
    call $func40
    local.set $var1
    local.get $var2
    i32.const 16
    i32.add
    global.set $global0
    local.get $var1
  )
  (func $func45 (param $var0 i32) (result i32)
    i32.const 1
  )
  (func $func46 (param $var0 i32)
  )
  (func $stackSave (;47;) (export "stackSave") (result i32)
    global.get $global0
  )
  (func $stackRestore (;48;) (export "stackRestore") (param $var0 i32)
    local.get $var0
    global.set $global0
  )
  (func $stackAlloc (;49;) (export "stackAlloc") (param $var0 i32) (result i32)
    (local $var1 i32) (local $var2 i32)
    global.get $global0
    local.get $var0
    i32.sub
    i32.const -16
    i32.and
    local.tee $var1
    global.set $global0
    local.get $var1
  )
  (func $emscripten_stack_init (;50;) (export "emscripten_stack_init")
    i32.const 5245984
    global.set $global2
    i32.const 3092
    i32.const 15
    i32.add
    i32.const -16
    i32.and
    global.set $global1
  )
  (func $emscripten_stack_get_free (;51;) (export "emscripten_stack_get_free") (result i32)
    global.get $global0
    global.get $global1
    i32.sub
  )
  (func $emscripten_stack_get_end (;52;) (export "emscripten_stack_get_end") (result i32)
    global.get $global1
  )
  (func $fflush (;53;) (export "fflush") (param $var0 i32) (result i32)
    (local $var1 i32) (local $var2 i32)
    block $label2
      block $label0
        local.get $var0
        i32.eqz
        br_if $label0
        block $label1
          local.get $var0
          i32.load offset=76
          i32.const -1
          i32.gt_s
          br_if $label1
          local.get $var0
          call $func54
          return
        end $label1
        local.get $var0
        call $func45
        local.set $var1
        local.get $var0
        call $func54
        local.set $var2
        local.get $var1
        i32.eqz
        br_if $label2
        local.get $var0
        call $func46
        local.get $var2
        return
      end $label0
      i32.const 0
      local.set $var2
      block $label3
        i32.const 0
        i32.load offset=1728
        i32.eqz
        br_if $label3
        i32.const 0
        i32.load offset=1728
        call $fflush
        local.set $var2
      end $label3
      block $label4
        call $func16
        i32.load
        local.tee $var0
        i32.eqz
        br_if $label4
        loop $label8
          i32.const 0
          local.set $var1
          block $label5
            local.get $var0
            i32.load offset=76
            i32.const 0
            i32.lt_s
            br_if $label5
            local.get $var0
            call $func45
            local.set $var1
          end $label5
          block $label6
            local.get $var0
            i32.load offset=20
            local.get $var0
            i32.load offset=28
            i32.le_u
            br_if $label6
            local.get $var0
            call $func54
            local.get $var2
            i32.or
            local.set $var2
          end $label6
          block $label7
            local.get $var1
            i32.eqz
            br_if $label7
            local.get $var0
            call $func46
          end $label7
          local.get $var0
          i32.load offset=56
          local.tee $var0
          br_if $label8
        end $label8
      end $label4
      call $func17
    end $label2
    local.get $var2
  )
  (func $func54 (param $var0 i32) (result i32)
    (local $var1 i32) (local $var2 i32)
    block $label0
      local.get $var0
      i32.load offset=20
      local.get $var0
      i32.load offset=28
      i32.le_u
      br_if $label0
      local.get $var0
      i32.const 0
      i32.const 0
      local.get $var0
      i32.load offset=36
      call_indirect (param i32 i32 i32) (result i32)
      drop
      local.get $var0
      i32.load offset=20
      br_if $label0
      i32.const -1
      return
    end $label0
    block $label1
      local.get $var0
      i32.load offset=4
      local.tee $var1
      local.get $var0
      i32.load offset=8
      local.tee $var2
      i32.ge_u
      br_if $label1
      local.get $var0
      local.get $var1
      local.get $var2
      i32.sub
      i64.extend_i32_s
      i32.const 1
      local.get $var0
      i32.load offset=40
      call_indirect (param i32 i64 i32) (result i64)
      drop
    end $label1
    local.get $var0
    i32.const 0
    i32.store offset=28
    local.get $var0
    i64.const 0
    i64.store offset=16
    local.get $var0
    i64.const 0
    i64.store offset=4 align=4
    i32.const 0
  )
  (func $func55 (param $var0 i32) (param $var1 i32) (param $var2 i64) (param $var3 i32) (result i64)
    local.get $var1
    local.get $var2
    local.get $var3
    local.get $var0
    call_indirect (param i32 i64 i32) (result i64)
  )
  (func $dynCall_jiji (;56;) (export "dynCall_jiji") (param $var0 i32) (param $var1 i32) (param $var2 i32) (param $var3 i32) (param $var4 i32) (result i32)
    (local $var5 i64)
    local.get $var0
    local.get $var1
    local.get $var2
    i64.extend_i32_u
    local.get $var3
    i64.extend_i32_u
    i64.const 32
    i64.shl
    i64.or
    local.get $var4
    call $func55
    local.set $var5
    local.get $var5
    i64.const 32
    i64.shr_u
    i32.wrap_i64
    call $env.setTempRet0
    local.get $var5
    i32.wrap_i64
  )
  (data (i32.const 1024) "-+   0X0x\00-0X+0X 0X-0x+0x 0x\00nan\00inf\00NAN\00INF\00.\00(null)\00hello, world!\0a\00\00\00\000\06\00\00\00\00\00\00\11\00\0a\00\11\11\11\00\00\00\00\05\00\00\00\00\00\00\09\00\00\00\00\0b\00\00\00\00\00\00\00\00\11\00\0f\0a\11\11\11\03\0a\07\00\01\00\09\0b\0b\00\00\09\06\0b\00\00\0b\00\06\11\00\00\00\11\11\11\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0b\00\00\00\00\00\00\00\00\11\00\0a\0a\11\11\11\00\0a\00\00\02\00\09\0b\00\00\00\09\00\0b\00\00\0b\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\00\0c\00\00\00\00\09\0c\00\00\00\00\00\0c\00\00\0c\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0e\00\00\00\00\00\00\00\00\00\00\00\0d\00\00\00\04\0d\00\00\00\00\09\0e\00\00\00\00\00\0e\00\00\0e\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\10\00\00\00\00\00\00\00\00\00\00\00\0f\00\00\00\00\0f\00\00\00\00\09\10\00\00\00\00\00\10\00\00\10\00\00\12\00\00\00\12\12\12\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\12\00\00\00\12\12\12\00\00\00\00\00\00\09\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0b\00\00\00\00\00\00\00\00\00\00\00\0a\00\00\00\00\0a\00\00\00\00\09\0b\00\00\00\00\00\0b\00\00\0b\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\00\00\00\00\00\00\00\00\0c\00\00\00\00\0c\00\00\00\00\09\0c\00\00\00\00\00\0c\00\00\0c\00\000123456789ABCDEF")
  (data (i32.const 1584) "\05\00\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\02\00\00\00\03\00\00\00\e8\06\00\00\00\04\00\00\00\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0a\ff\ff\ff\ff\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\000\06\00\00")
)

 

[링크 : https://developer.mozilla.org/ko/docs/WebAssembly/Understanding_the_text_format]

'Programming > wasm' 카테고리의 다른 글

wasm 배열 예제  (0) 2023.01.31
wasm interfacing example  (0) 2021.11.25
wasm text 와 binary 상호변환  (0) 2021.10.26
emcc wasm 빌드  (0) 2021.10.25
wasm from c, cpp  (0) 2021.10.24
Posted by 구차니
Programming/wasm2021. 10. 26. 11:07

나름 컴파일 된거니, 디컴파일이라고 해야하나 애매하긴 하네

 

$ wat2wasm simple.wat -o simple.wasm
$ wasm2wat simple.wasm -o text.wat

[링크 : https://developer.mozilla.org/ko/docs/WebAssembly/Text_format_to_wasm]

 

emcc 와는 다르게 패키지로 존재하나 보다

$ wat2wasm

명령어 'wat2wasm' 을(를) 찾을 수 없습니다. 그러나 다음을 통해 설치할 수 있습니다:

sudo apt install wabt

$ wasm2wat

명령어 'wasm2wat' 을(를) 찾을 수 없습니다. 그러나 다음을 통해 설치할 수 있습니다:

sudo apt install wabt

 

 

$ wat2wasm
usage: wat2wasm [options] filename

  read a file in the wasm text format, check it for errors, and
  convert it to the wasm binary format.

examples:
  # parse and typecheck test.wat
  $ wat2wasm test.wat

  # parse test.wat and write to binary file test.wasm
  $ wat2wasm test.wat -o test.wasm

  # parse spec-test.wast, and write verbose output to stdout (including
  # the meaning of every byte)
  $ wat2wasm spec-test.wast -v

options:
      --help                                  Print this help message
      --version                               Print version information
  -v, --verbose                               Use multiple times for more info
      --debug-parser                          Turn on debugging the parser of wat files
  -d, --dump-module                           Print a hexdump of the module to stdout
      --enable-exceptions                     Enable Experimental exception handling
      --disable-mutable-globals               Disable Import/export mutable globals
      --enable-saturating-float-to-int        Enable Saturating float-to-int operators
      --enable-sign-extension                 Enable Sign-extension operators
      --enable-simd                           Enable SIMD support
      --enable-threads                        Enable Threading support
      --enable-multi-value                    Enable Multi-value
      --enable-tail-call                      Enable Tail-call support
      --enable-bulk-memory                    Enable Bulk-memory operations
      --enable-reference-types                Enable Reference types (anyref)
      --enable-annotations                    Enable Custom annotation syntax
      --enable-all                            Enable all features
  -o, --output=FILE                           output wasm binary file
  -r, --relocatable                           Create a relocatable wasm binary (suitable for linking with e.g. lld)
      --no-canonicalize-leb128s               Write all LEB128 sizes as 5-bytes instead of their minimal size
      --debug-names                           Write debug names to the generated binary file
      --no-check                              Don't check for invalid modules
expected filename argument.

$ wasm2wat
usage: wasm2wat [options] filename

  Read a file in the WebAssembly binary format, and convert it to
  the WebAssembly text format.

examples:
  # parse binary file test.wasm and write text file test.wast
  $ wasm2wat test.wasm -o test.wat

  # parse test.wasm, write test.wat, but ignore the debug names, if any
  $ wasm2wat test.wasm --no-debug-names -o test.wat

options:
      --help                                  Print this help message
      --version                               Print version information
  -v, --verbose                               Use multiple times for more info
  -o, --output=FILENAME                       Output file for the generated wast file, by default use stdout
  -f, --fold-exprs                            Write folded expressions where possible
      --enable-exceptions                     Enable Experimental exception handling
      --disable-mutable-globals               Disable Import/export mutable globals
      --enable-saturating-float-to-int        Enable Saturating float-to-int operators
      --enable-sign-extension                 Enable Sign-extension operators
      --enable-simd                           Enable SIMD support
      --enable-threads                        Enable Threading support
      --enable-multi-value                    Enable Multi-value
      --enable-tail-call                      Enable Tail-call support
      --enable-bulk-memory                    Enable Bulk-memory operations
      --enable-reference-types                Enable Reference types (anyref)
      --enable-annotations                    Enable Custom annotation syntax
      --enable-all                            Enable all features
      --inline-exports                        Write all exports inline
      --inline-imports                        Write all imports inline
      --no-debug-names                        Ignore debug names in the binary file
      --ignore-custom-section-errors          Ignore errors in custom sections
      --generate-names                        Give auto-generated names to non-named functions, types, etc.
      --no-check                              Don't check for invalid modules
expected filename argument.

'Programming > wasm' 카테고리의 다른 글

wasm interfacing example  (0) 2021.11.25
wasm text format  (0) 2021.10.26
emcc wasm 빌드  (0) 2021.10.25
wasm from c, cpp  (0) 2021.10.24
wasm  (0) 2021.10.22
Posted by 구차니
Programming/wasm2021. 10. 25. 17:45

귀찮아서 로컬 파일로 접근하니 안열린다 -_ㅠ

 

node.js http-server 하려다가 안되서 걍 python -m http.server로 구동

별건 없고.. 그냥 hello world!만 나오고 끝!

 

# If Python version returned above is 3.X
# On Windows, try "python -m http.server" or "py -3 -m http.server"
python3 -m http.server
# If Python version returned above is 2.X
python -m SimpleHTTPServer

[링크 : https://developer.mozilla.org/en-US/docs/Learn/Common_questions/set_up_a_local_testing_server]

 

빌드는 아래의 명령어로 수행 가능한데

-o hello.html을 하면 .js .wasm .html 3개를 생성한다.

-s WASM=1은 주던 안 주던 영향을 받지 않는 듯하다.

$ emcc
emcc: error: no input files
$ cat hello.c
#include <stdio.h>

int main() {
  printf("hello, world!\n");
  return 0;
}
$ emcc -o hello.js hello.c
$ ls -al
합계 148
drwxrwxr-x 2 minimonk minimonk   4096 10월 25 15:40 .
drwxrwxr-x 8 minimonk minimonk   4096 10월 25 15:39 ..
-rw-rw-r-- 1 minimonk minimonk     76 10월 25 15:39 hello.c
-rw-rw-r-- 1 minimonk minimonk 126915 10월 25 15:39 hello.js
-rwxrwxr-x 1 minimonk minimonk  11522 10월 25 15:39 hello.wasm
$ file *
hello.c:    C source, ASCII text
hello.js:   ASCII text, with very long lines
hello.wasm: WebAssembly (wasm) binary module version 0x1 (MVP)

 

$ emcc hello.c -s WASM=1 -o hello.html
$ ls -al
합계 252
drwxrwxr-x 2 minimonk minimonk   4096 10월 25 17:47 .
drwxrwxr-x 8 minimonk minimonk   4096 10월 25 15:39 ..
-rw-rw-r-- 1 minimonk minimonk     76 10월 25 15:39 hello.c
-rw-rw-r-- 1 minimonk minimonk 102675 10월 25 17:47 hello.html
-rw-rw-r-- 1 minimonk minimonk 126915 10월 25 17:47 hello.js
-rwxrwxr-x 1 minimonk minimonk  11522 10월 25 17:47 hello.wasm
$ file *
hello.c:    C source, ASCII text
hello.html: HTML document, ASCII text, with very long lines
hello.js:   ASCII text, with very long lines
hello.wasm: WebAssembly (wasm) binary module version 0x1 (MVP)

[링크 : https://developer.mozilla.org/ko/docs/WebAssembly/C_to_wasm]

 

+

$ cat hello.js


// The Module object: Our interface to the outside world. We import
// and export values on it. There are various ways Module can be used:
// 1. Not defined. We create it here
// 2. A function parameter, function(Module) { ..generated code.. }
// 3. pre-run appended it, var Module = {}; ..generated code..
// 4. External script tag defines var Module.
// We need to check if Module already exists (e.g. case 3 above).
// Substitution will be replaced with actual code on later stage of the build,
// this way Closure Compiler will not mangle it (e.g. case 4. above).
// Note that if you want to run closure, and also to use Module
// after the generated code, you will need to define   var Module = {};
// before the code. Then that object will be used in the code, and you
// can continue to use Module afterwards as well.
var Module = typeof Module !== 'undefined' ? Module : {};

// --pre-jses are emitted after the Module integration code, so that they can
// refer to Module (if they choose; they can also define Module)
// {{PRE_JSES}}

// Sometimes an existing Module object exists with properties
// meant to overwrite the default module functionality. Here
// we collect those properties and reapply _after_ we configure
// the current environment's defaults to avoid having to be so
// defensive during initialization.
var moduleOverrides = {};
var key;
for (key in Module) {
  if (Module.hasOwnProperty(key)) {
    moduleOverrides[key] = Module[key];
  }
}

var arguments_ = [];
var thisProgram = './this.program';
var quit_ = function(status, toThrow) {
  throw toThrow;
};

// Determine the runtime environment we are in. You can customize this by
// setting the ENVIRONMENT setting at compile time (see settings.js).

// Attempt to auto-detect the environment
var ENVIRONMENT_IS_WEB = typeof window === 'object';
var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
// N.b. Electron.js environment is simultaneously a NODE-environment, but
// also a web environment.
var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string';
var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;

if (Module['ENVIRONMENT']) {
  throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)');
}

// `/` should be present at the end if `scriptDirectory` is not empty
var scriptDirectory = '';
function locateFile(path) {
  if (Module['locateFile']) {
    return Module['locateFile'](path, scriptDirectory);
  }
  return scriptDirectory + path;
}

// Hooks that are implemented differently in different runtime environments.
var read_,
    readAsync,
    readBinary,
    setWindowTitle;

// Normally we don't log exceptions but instead let them bubble out the top
// level where the embedding environment (e.g. the browser) can handle
// them.
// However under v8 and node we sometimes exit the process direcly in which case
// its up to use us to log the exception before exiting.
// If we fix https://github.com/emscripten-core/emscripten/issues/15080
// this may no longer be needed under node.
function logExceptionOnExit(e) {
  if (e instanceof ExitStatus) return;
  var toLog = e;
  if (e && typeof e === 'object' && e.stack) {
    toLog = [e, e.stack];
  }
  err('exiting due to exception: ' + toLog);
}

var nodeFS;
var nodePath;

if (ENVIRONMENT_IS_NODE) {
  if (!(typeof process === 'object' && typeof require === 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');
  if (ENVIRONMENT_IS_WORKER) {
    scriptDirectory = require('path').dirname(scriptDirectory) + '/';
  } else {
    scriptDirectory = __dirname + '/';
  }

// include: node_shell_read.js


read_ = function shell_read(filename, binary) {
  if (!nodeFS) nodeFS = require('fs');
  if (!nodePath) nodePath = require('path');
  filename = nodePath['normalize'](filename);
  return nodeFS['readFileSync'](filename, binary ? null : 'utf8');
};

readBinary = function readBinary(filename) {
  var ret = read_(filename, true);
  if (!ret.buffer) {
    ret = new Uint8Array(ret);
  }
  assert(ret.buffer);
  return ret;
};

readAsync = function readAsync(filename, onload, onerror) {
  if (!nodeFS) nodeFS = require('fs');
  if (!nodePath) nodePath = require('path');
  filename = nodePath['normalize'](filename);
  nodeFS['readFile'](filename, function(err, data) {
    if (err) onerror(err);
    else onload(data.buffer);
  });
};

// end include: node_shell_read.js
  if (process['argv'].length > 1) {
    thisProgram = process['argv'][1].replace(/\\/g, '/');
  }

  arguments_ = process['argv'].slice(2);

  if (typeof module !== 'undefined') {
    module['exports'] = Module;
  }

  process['on']('uncaughtException', function(ex) {
    // suppress ExitStatus exceptions from showing an error
    if (!(ex instanceof ExitStatus)) {
      throw ex;
    }
  });

  // Without this older versions of node (< v15) will log unhandled rejections
  // but return 0, which is not normally the desired behaviour.  This is
  // not be needed with node v15 and about because it is now the default
  // behaviour:
  // See https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode
  process['on']('unhandledRejection', function(reason) { throw reason; });

  quit_ = function(status, toThrow) {
    if (keepRuntimeAlive()) {
      process['exitCode'] = status;
      throw toThrow;
    }
    logExceptionOnExit(toThrow);
    process['exit'](status);
  };

  Module['inspect'] = function () { return '[Emscripten Module object]'; };

} else
if (ENVIRONMENT_IS_SHELL) {

  if ((typeof process === 'object' && typeof require === 'function') || typeof window === 'object' || typeof importScripts === 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');

  if (typeof read != 'undefined') {
    read_ = function shell_read(f) {
      return read(f);
    };
  }

  readBinary = function readBinary(f) {
    var data;
    if (typeof readbuffer === 'function') {
      return new Uint8Array(readbuffer(f));
    }
    data = read(f, 'binary');
    assert(typeof data === 'object');
    return data;
  };

  readAsync = function readAsync(f, onload, onerror) {
    setTimeout(function() { onload(readBinary(f)); }, 0);
  };

  if (typeof scriptArgs != 'undefined') {
    arguments_ = scriptArgs;
  } else if (typeof arguments != 'undefined') {
    arguments_ = arguments;
  }

  if (typeof quit === 'function') {
    quit_ = function(status, toThrow) {
      logExceptionOnExit(toThrow);
      quit(status);
    };
  }

  if (typeof print !== 'undefined') {
    // Prefer to use print/printErr where they exist, as they usually work better.
    if (typeof console === 'undefined') console = /** @type{!Console} */({});
    console.log = /** @type{!function(this:Console, ...*): undefined} */ (print);
    console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr !== 'undefined' ? printErr : print);
  }

} else

// Note that this includes Node.js workers when relevant (pthreads is enabled).
// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and
// ENVIRONMENT_IS_NODE.
if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
  if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled
    scriptDirectory = self.location.href;
  } else if (typeof document !== 'undefined' && document.currentScript) { // web
    scriptDirectory = document.currentScript.src;
  }
  // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them.
  // otherwise, slice off the final part of the url to find the script directory.
  // if scriptDirectory does not contain a slash, lastIndexOf will return -1,
  // and scriptDirectory will correctly be replaced with an empty string.
  // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #),
  // they are removed because they could contain a slash.
  if (scriptDirectory.indexOf('blob:') !== 0) {
    scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1);
  } else {
    scriptDirectory = '';
  }

  if (!(typeof window === 'object' || typeof importScripts === 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)');

  // Differentiate the Web Worker from the Node Worker case, as reading must
  // be done differently.
  {

// include: web_or_worker_shell_read.js


  read_ = function(url) {
      var xhr = new XMLHttpRequest();
      xhr.open('GET', url, false);
      xhr.send(null);
      return xhr.responseText;
  };

  if (ENVIRONMENT_IS_WORKER) {
    readBinary = function(url) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, false);
        xhr.responseType = 'arraybuffer';
        xhr.send(null);
        return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response));
    };
  }

  readAsync = function(url, onload, onerror) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'arraybuffer';
    xhr.onload = function() {
      if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0
        onload(xhr.response);
        return;
      }
      onerror();
    };
    xhr.onerror = onerror;
    xhr.send(null);
  };

// end include: web_or_worker_shell_read.js
  }

  setWindowTitle = function(title) { document.title = title };
} else
{
  throw new Error('environment detection error');
}

var out = Module['print'] || console.log.bind(console);
var err = Module['printErr'] || console.warn.bind(console);

// Merge back in the overrides
for (key in moduleOverrides) {
  if (moduleOverrides.hasOwnProperty(key)) {
    Module[key] = moduleOverrides[key];
  }
}
// Free the object hierarchy contained in the overrides, this lets the GC
// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array.
moduleOverrides = null;

// Emit code to handle expected values on the Module object. This applies Module.x
// to the proper local x. This has two benefits: first, we only emit it if it is
// expected to arrive, and second, by using a local everywhere else that can be
// minified.

if (Module['arguments']) arguments_ = Module['arguments'];
if (!Object.getOwnPropertyDescriptor(Module, 'arguments')) {
  Object.defineProperty(Module, 'arguments', {
    configurable: true,
    get: function() {
      abort('Module.arguments has been replaced with plain arguments_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

if (Module['thisProgram']) thisProgram = Module['thisProgram'];
if (!Object.getOwnPropertyDescriptor(Module, 'thisProgram')) {
  Object.defineProperty(Module, 'thisProgram', {
    configurable: true,
    get: function() {
      abort('Module.thisProgram has been replaced with plain thisProgram (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

if (Module['quit']) quit_ = Module['quit'];
if (!Object.getOwnPropertyDescriptor(Module, 'quit')) {
  Object.defineProperty(Module, 'quit', {
    configurable: true,
    get: function() {
      abort('Module.quit has been replaced with plain quit_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message
// Assertions on removed incoming Module JS APIs.
assert(typeof Module['memoryInitializerPrefixURL'] === 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['pthreadMainPrefixURL'] === 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['cdInitializerPrefixURL'] === 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['filePackagePrefixURL'] === 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead');
assert(typeof Module['read'] === 'undefined', 'Module.read option was removed (modify read_ in JS)');
assert(typeof Module['readAsync'] === 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)');
assert(typeof Module['readBinary'] === 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)');
assert(typeof Module['setWindowTitle'] === 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)');
assert(typeof Module['TOTAL_MEMORY'] === 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY');

if (!Object.getOwnPropertyDescriptor(Module, 'read')) {
  Object.defineProperty(Module, 'read', {
    configurable: true,
    get: function() {
      abort('Module.read has been replaced with plain read_ (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

if (!Object.getOwnPropertyDescriptor(Module, 'readAsync')) {
  Object.defineProperty(Module, 'readAsync', {
    configurable: true,
    get: function() {
      abort('Module.readAsync has been replaced with plain readAsync (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

if (!Object.getOwnPropertyDescriptor(Module, 'readBinary')) {
  Object.defineProperty(Module, 'readBinary', {
    configurable: true,
    get: function() {
      abort('Module.readBinary has been replaced with plain readBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

if (!Object.getOwnPropertyDescriptor(Module, 'setWindowTitle')) {
  Object.defineProperty(Module, 'setWindowTitle', {
    configurable: true,
    get: function() {
      abort('Module.setWindowTitle has been replaced with plain setWindowTitle (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}
var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js';
var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js';
var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js';
var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js';
function alignMemory() { abort('`alignMemory` is now a library function and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line'); }

assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time.  Add 'shell' to `-s ENVIRONMENT` to enable.");




var STACK_ALIGN = 16;

function getPointerSize() {
  return 4;
}

function getNativeTypeSize(type) {
  switch (type) {
    case 'i1': case 'i8': return 1;
    case 'i16': return 2;
    case 'i32': return 4;
    case 'i64': return 8;
    case 'float': return 4;
    case 'double': return 8;
    default: {
      if (type[type.length-1] === '*') {
        return getPointerSize();
      } else if (type[0] === 'i') {
        var bits = Number(type.substr(1));
        assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type);
        return bits / 8;
      } else {
        return 0;
      }
    }
  }
}

function warnOnce(text) {
  if (!warnOnce.shown) warnOnce.shown = {};
  if (!warnOnce.shown[text]) {
    warnOnce.shown[text] = 1;
    err(text);
  }
}

// include: runtime_functions.js


// Wraps a JS function as a wasm function with a given signature.
function convertJsFunctionToWasm(func, sig) {

  // If the type reflection proposal is available, use the new
  // "WebAssembly.Function" constructor.
  // Otherwise, construct a minimal wasm module importing the JS function and
  // re-exporting it.
  if (typeof WebAssembly.Function === "function") {
    var typeNames = {
      'i': 'i32',
      'j': 'i64',
      'f': 'f32',
      'd': 'f64'
    };
    var type = {
      parameters: [],
      results: sig[0] == 'v' ? [] : [typeNames[sig[0]]]
    };
    for (var i = 1; i < sig.length; ++i) {
      type.parameters.push(typeNames[sig[i]]);
    }
    return new WebAssembly.Function(type, func);
  }

  // The module is static, with the exception of the type section, which is
  // generated based on the signature passed in.
  var typeSection = [
    0x01, // id: section,
    0x00, // length: 0 (placeholder)
    0x01, // count: 1
    0x60, // form: func
  ];
  var sigRet = sig.slice(0, 1);
  var sigParam = sig.slice(1);
  var typeCodes = {
    'i': 0x7f, // i32
    'j': 0x7e, // i64
    'f': 0x7d, // f32
    'd': 0x7c, // f64
  };

  // Parameters, length + signatures
  typeSection.push(sigParam.length);
  for (var i = 0; i < sigParam.length; ++i) {
    typeSection.push(typeCodes[sigParam[i]]);
  }

  // Return values, length + signatures
  // With no multi-return in MVP, either 0 (void) or 1 (anything else)
  if (sigRet == 'v') {
    typeSection.push(0x00);
  } else {
    typeSection = typeSection.concat([0x01, typeCodes[sigRet]]);
  }

  // Write the overall length of the type section back into the section header
  // (excepting the 2 bytes for the section id and length)
  typeSection[1] = typeSection.length - 2;

  // Rest of the module is static
  var bytes = new Uint8Array([
    0x00, 0x61, 0x73, 0x6d, // magic ("\0asm")
    0x01, 0x00, 0x00, 0x00, // version: 1
  ].concat(typeSection, [
    0x02, 0x07, // import section
      // (import "e" "f" (func 0 (type 0)))
      0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00,
    0x07, 0x05, // export section
      // (export "f" (func 0 (type 0)))
      0x01, 0x01, 0x66, 0x00, 0x00,
  ]));

   // We can compile this wasm module synchronously because it is very small.
  // This accepts an import (at "e.f"), that it reroutes to an export (at "f")
  var module = new WebAssembly.Module(bytes);
  var instance = new WebAssembly.Instance(module, {
    'e': {
      'f': func
    }
  });
  var wrappedFunc = instance.exports['f'];
  return wrappedFunc;
}

var freeTableIndexes = [];

// Weak map of functions in the table to their indexes, created on first use.
var functionsInTableMap;

function getEmptyTableSlot() {
  // Reuse a free index if there is one, otherwise grow.
  if (freeTableIndexes.length) {
    return freeTableIndexes.pop();
  }
  // Grow the table
  try {
    wasmTable.grow(1);
  } catch (err) {
    if (!(err instanceof RangeError)) {
      throw err;
    }
    throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.';
  }
  return wasmTable.length - 1;
}

function updateTableMap(offset, count) {
  for (var i = offset; i < offset + count; i++) {
    var item = getWasmTableEntry(i);
    // Ignore null values.
    if (item) {
      functionsInTableMap.set(item, i);
    }
  }
}

// Add a function to the table.
// 'sig' parameter is required if the function being added is a JS function.
function addFunction(func, sig) {
  assert(typeof func !== 'undefined');

  // Check if the function is already in the table, to ensure each function
  // gets a unique index. First, create the map if this is the first use.
  if (!functionsInTableMap) {
    functionsInTableMap = new WeakMap();
    updateTableMap(0, wasmTable.length);
  }
  if (functionsInTableMap.has(func)) {
    return functionsInTableMap.get(func);
  }

  // It's not in the table, add it now.

  var ret = getEmptyTableSlot();

  // Set the new value.
  try {
    // Attempting to call this with JS function will cause of table.set() to fail
    setWasmTableEntry(ret, func);
  } catch (err) {
    if (!(err instanceof TypeError)) {
      throw err;
    }
    assert(typeof sig !== 'undefined', 'Missing signature argument to addFunction: ' + func);
    var wrapped = convertJsFunctionToWasm(func, sig);
    setWasmTableEntry(ret, wrapped);
  }

  functionsInTableMap.set(func, ret);

  return ret;
}

function removeFunction(index) {
  functionsInTableMap.delete(getWasmTableEntry(index));
  freeTableIndexes.push(index);
}

// end include: runtime_functions.js
// include: runtime_debug.js


// end include: runtime_debug.js
var tempRet0 = 0;

var setTempRet0 = function(value) {
  tempRet0 = value;
};

var getTempRet0 = function() {
  return tempRet0;
};



// === Preamble library stuff ===

// Documentation for the public APIs defined in this file must be updated in:
//    site/source/docs/api_reference/preamble.js.rst
// A prebuilt local version of the documentation is available at:
//    site/build/text/docs/api_reference/preamble.js.txt
// You can also build docs locally as HTML or other formats in site/
// An online HTML version (which may be of a different version of Emscripten)
//    is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html

var wasmBinary;
if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];
if (!Object.getOwnPropertyDescriptor(Module, 'wasmBinary')) {
  Object.defineProperty(Module, 'wasmBinary', {
    configurable: true,
    get: function() {
      abort('Module.wasmBinary has been replaced with plain wasmBinary (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}
var noExitRuntime = Module['noExitRuntime'] || true;
if (!Object.getOwnPropertyDescriptor(Module, 'noExitRuntime')) {
  Object.defineProperty(Module, 'noExitRuntime', {
    configurable: true,
    get: function() {
      abort('Module.noExitRuntime has been replaced with plain noExitRuntime (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

if (typeof WebAssembly !== 'object') {
  abort('no native wasm support detected');
}

// include: runtime_safe_heap.js


// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking.
// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties)

/** @param {number} ptr
    @param {number} value
    @param {string} type
    @param {number|boolean=} noSafe */
function setValue(ptr, value, type, noSafe) {
  type = type || 'i8';
  if (type.charAt(type.length-1) === '*') type = 'i32';
    switch (type) {
      case 'i1': HEAP8[((ptr)>>0)] = value; break;
      case 'i8': HEAP8[((ptr)>>0)] = value; break;
      case 'i16': HEAP16[((ptr)>>1)] = value; break;
      case 'i32': HEAP32[((ptr)>>2)] = value; break;
      case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math.min((+(Math.floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)] = tempI64[0],HEAP32[(((ptr)+(4))>>2)] = tempI64[1]); break;
      case 'float': HEAPF32[((ptr)>>2)] = value; break;
      case 'double': HEAPF64[((ptr)>>3)] = value; break;
      default: abort('invalid type for setValue: ' + type);
    }
}

/** @param {number} ptr
    @param {string} type
    @param {number|boolean=} noSafe */
function getValue(ptr, type, noSafe) {
  type = type || 'i8';
  if (type.charAt(type.length-1) === '*') type = 'i32';
    switch (type) {
      case 'i1': return HEAP8[((ptr)>>0)];
      case 'i8': return HEAP8[((ptr)>>0)];
      case 'i16': return HEAP16[((ptr)>>1)];
      case 'i32': return HEAP32[((ptr)>>2)];
      case 'i64': return HEAP32[((ptr)>>2)];
      case 'float': return HEAPF32[((ptr)>>2)];
      case 'double': return Number(HEAPF64[((ptr)>>3)]);
      default: abort('invalid type for getValue: ' + type);
    }
  return null;
}

// end include: runtime_safe_heap.js
// Wasm globals

var wasmMemory;

//========================================
// Runtime essentials
//========================================

// whether we are quitting the application. no code should run after this.
// set in exit() and abort()
var ABORT = false;

// set by exit() and abort().  Passed to 'onExit' handler.
// NOTE: This is also used as the process return code code in shell environments
// but only when noExitRuntime is false.
var EXITSTATUS;

/** @type {function(*, string=)} */
function assert(condition, text) {
  if (!condition) {
    abort('Assertion failed: ' + text);
  }
}

// Returns the C function with a specified identifier (for C++, you need to do manual name mangling)
function getCFunc(ident) {
  var func = Module['_' + ident]; // closure exported function
  assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported');
  return func;
}

// C calling interface.
/** @param {string|null=} returnType
    @param {Array=} argTypes
    @param {Arguments|Array=} args
    @param {Object=} opts */
function ccall(ident, returnType, argTypes, args, opts) {
  // For fast lookup of conversion functions
  var toC = {
    'string': function(str) {
      var ret = 0;
      if (str !== null && str !== undefined && str !== 0) { // null string
        // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0'
        var len = (str.length << 2) + 1;
        ret = stackAlloc(len);
        stringToUTF8(str, ret, len);
      }
      return ret;
    },
    'array': function(arr) {
      var ret = stackAlloc(arr.length);
      writeArrayToMemory(arr, ret);
      return ret;
    }
  };

  function convertReturnValue(ret) {
    if (returnType === 'string') return UTF8ToString(ret);
    if (returnType === 'boolean') return Boolean(ret);
    return ret;
  }

  var func = getCFunc(ident);
  var cArgs = [];
  var stack = 0;
  assert(returnType !== 'array', 'Return type should not be "array".');
  if (args) {
    for (var i = 0; i < args.length; i++) {
      var converter = toC[argTypes[i]];
      if (converter) {
        if (stack === 0) stack = stackSave();
        cArgs[i] = converter(args[i]);
      } else {
        cArgs[i] = args[i];
      }
    }
  }
  var ret = func.apply(null, cArgs);
  function onDone(ret) {
    if (stack !== 0) stackRestore(stack);
    return convertReturnValue(ret);
  }

  ret = onDone(ret);
  return ret;
}

/** @param {string=} returnType
    @param {Array=} argTypes
    @param {Object=} opts */
function cwrap(ident, returnType, argTypes, opts) {
  return function() {
    return ccall(ident, returnType, argTypes, arguments, opts);
  }
}

// We used to include malloc/free by default in the past. Show a helpful error in
// builds with assertions.
function _malloc() {
  abort("malloc() called but not included in the build - add '_malloc' to EXPORTED_FUNCTIONS");
}
function _free() {
  // Show a helpful error since we used to include free by default in the past.
  abort("free() called but not included in the build - add '_free' to EXPORTED_FUNCTIONS");
}

var ALLOC_NORMAL = 0; // Tries to use _malloc()
var ALLOC_STACK = 1; // Lives for the duration of the current function call

// allocate(): This is for internal use. You can use it yourself as well, but the interface
//             is a little tricky (see docs right below). The reason is that it is optimized
//             for multiple syntaxes to save space in generated code. So you should
//             normally not use allocate(), and instead allocate memory using _malloc(),
//             initialize it with setValue(), and so forth.
// @slab: An array of data.
// @allocator: How to allocate memory, see ALLOC_*
/** @type {function((Uint8Array|Array<number>), number)} */
function allocate(slab, allocator) {
  var ret;
  assert(typeof allocator === 'number', 'allocate no longer takes a type argument')
  assert(typeof slab !== 'number', 'allocate no longer takes a number as arg0')

  if (allocator == ALLOC_STACK) {
    ret = stackAlloc(slab.length);
  } else {
    ret = abort('malloc was not included, but is needed in allocate. Adding "_malloc" to EXPORTED_FUNCTIONS should fix that. This may be a bug in the compiler, please file an issue.');;
  }

  if (slab.subarray || slab.slice) {
    HEAPU8.set(/** @type {!Uint8Array} */(slab), ret);
  } else {
    HEAPU8.set(new Uint8Array(slab), ret);
  }
  return ret;
}

// include: runtime_strings.js


// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime.

// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns
// a copy of that string as a Javascript String object.

var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined;

/**
 * @param {number} idx
 * @param {number=} maxBytesToRead
 * @return {string}
 */
function UTF8ArrayToString(heap, idx, maxBytesToRead) {
  var endIdx = idx + maxBytesToRead;
  var endPtr = idx;
  // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself.
  // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage.
  // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity)
  while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr;

  if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {
    return UTF8Decoder.decode(heap.subarray(idx, endPtr));
  } else {
    var str = '';
    // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that
    while (idx < endPtr) {
      // For UTF8 byte structure, see:
      // http://en.wikipedia.org/wiki/UTF-8#Description
      // https://www.ietf.org/rfc/rfc2279.txt
      // https://tools.ietf.org/html/rfc3629
      var u0 = heap[idx++];
      if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; }
      var u1 = heap[idx++] & 63;
      if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; }
      var u2 = heap[idx++] & 63;
      if ((u0 & 0xF0) == 0xE0) {
        u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;
      } else {
        if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!');
        u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63);
      }

      if (u0 < 0x10000) {
        str += String.fromCharCode(u0);
      } else {
        var ch = u0 - 0x10000;
        str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
      }
    }
  }
  return str;
}

// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a
// copy of that string as a Javascript String object.
// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit
//                 this parameter to scan the string until the first \0 byte. If maxBytesToRead is
//                 passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the
//                 middle, then the string will cut short at that byte index (i.e. maxBytesToRead will
//                 not produce a string of exact length [ptr, ptr+maxBytesToRead[)
//                 N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may
//                 throw JS JIT optimizations off, so it is worth to consider consistently using one
//                 style or the other.
/**
 * @param {number} ptr
 * @param {number=} maxBytesToRead
 * @return {string}
 */
function UTF8ToString(ptr, maxBytesToRead) {
  ;
  return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '';
}

// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx',
// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP.
// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write.
// Parameters:
//   str: the Javascript string to copy.
//   heap: the array to copy to. Each index in this array is assumed to be one 8-byte element.
//   outIdx: The starting offset in the array to begin the copying.
//   maxBytesToWrite: The maximum number of bytes this function can write to the array.
//                    This count should include the null terminator,
//                    i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else.
//                    maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator.
// Returns the number of bytes written, EXCLUDING the null terminator.

function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) {
  if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes.
    return 0;

  var startIdx = outIdx;
  var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator.
  for (var i = 0; i < str.length; ++i) {
    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8.
    // See http://unicode.org/faq/utf_bom.html#utf16-3
    // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629
    var u = str.charCodeAt(i); // possibly a lead surrogate
    if (u >= 0xD800 && u <= 0xDFFF) {
      var u1 = str.charCodeAt(++i);
      u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF);
    }
    if (u <= 0x7F) {
      if (outIdx >= endIdx) break;
      heap[outIdx++] = u;
    } else if (u <= 0x7FF) {
      if (outIdx + 1 >= endIdx) break;
      heap[outIdx++] = 0xC0 | (u >> 6);
      heap[outIdx++] = 0x80 | (u & 63);
    } else if (u <= 0xFFFF) {
      if (outIdx + 2 >= endIdx) break;
      heap[outIdx++] = 0xE0 | (u >> 12);
      heap[outIdx++] = 0x80 | ((u >> 6) & 63);
      heap[outIdx++] = 0x80 | (u & 63);
    } else {
      if (outIdx + 3 >= endIdx) break;
      if (u > 0x10FFFF) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).');
      heap[outIdx++] = 0xF0 | (u >> 18);
      heap[outIdx++] = 0x80 | ((u >> 12) & 63);
      heap[outIdx++] = 0x80 | ((u >> 6) & 63);
      heap[outIdx++] = 0x80 | (u & 63);
    }
  }
  // Null-terminate the pointer to the buffer.
  heap[outIdx] = 0;
  return outIdx - startIdx;
}

// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP.
// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write.
// Returns the number of bytes written, EXCLUDING the null terminator.

function stringToUTF8(str, outPtr, maxBytesToWrite) {
  assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
  return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite);
}

// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte.
function lengthBytesUTF8(str) {
  var len = 0;
  for (var i = 0; i < str.length; ++i) {
    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8.
    // See http://unicode.org/faq/utf_bom.html#utf16-3
    var u = str.charCodeAt(i); // possibly a lead surrogate
    if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);
    if (u <= 0x7F) ++len;
    else if (u <= 0x7FF) len += 2;
    else if (u <= 0xFFFF) len += 3;
    else len += 4;
  }
  return len;
}

// end include: runtime_strings.js
// include: runtime_strings_extra.js


// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime.

// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.

function AsciiToString(ptr) {
  var str = '';
  while (1) {
    var ch = HEAPU8[((ptr++)>>0)];
    if (!ch) return str;
    str += String.fromCharCode(ch);
  }
}

// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP.

function stringToAscii(str, outPtr) {
  return writeAsciiToMemory(str, outPtr, false);
}

// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns
// a copy of that string as a Javascript String object.

var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined;

function UTF16ToString(ptr, maxBytesToRead) {
  assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!');
  var endPtr = ptr;
  // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself.
  // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage.
  var idx = endPtr >> 1;
  var maxIdx = idx + maxBytesToRead / 2;
  // If maxBytesToRead is not passed explicitly, it will be undefined, and this
  // will always evaluate to true. This saves on code size.
  while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx;
  endPtr = idx << 1;

  if (endPtr - ptr > 32 && UTF16Decoder) {
    return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr));
  } else {
    var str = '';

    // If maxBytesToRead is not passed explicitly, it will be undefined, and the for-loop's condition
    // will always evaluate to true. The loop is then terminated on the first null char.
    for (var i = 0; !(i >= maxBytesToRead / 2); ++i) {
      var codeUnit = HEAP16[(((ptr)+(i*2))>>1)];
      if (codeUnit == 0) break;
      // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through.
      str += String.fromCharCode(codeUnit);
    }

    return str;
  }
}

// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP.
// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write.
// Parameters:
//   str: the Javascript string to copy.
//   outPtr: Byte address in Emscripten HEAP where to write the string to.
//   maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null
//                    terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else.
//                    maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator.
// Returns the number of bytes written, EXCLUDING the null terminator.

function stringToUTF16(str, outPtr, maxBytesToWrite) {
  assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!');
  assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
  // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed.
  if (maxBytesToWrite === undefined) {
    maxBytesToWrite = 0x7FFFFFFF;
  }
  if (maxBytesToWrite < 2) return 0;
  maxBytesToWrite -= 2; // Null terminator.
  var startPtr = outPtr;
  var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length;
  for (var i = 0; i < numCharsToWrite; ++i) {
    // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP.
    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
    HEAP16[((outPtr)>>1)] = codeUnit;
    outPtr += 2;
  }
  // Null-terminate the pointer to the HEAP.
  HEAP16[((outPtr)>>1)] = 0;
  return outPtr - startPtr;
}

// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte.

function lengthBytesUTF16(str) {
  return str.length*2;
}

function UTF32ToString(ptr, maxBytesToRead) {
  assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!');
  var i = 0;

  var str = '';
  // If maxBytesToRead is not passed explicitly, it will be undefined, and this
  // will always evaluate to true. This saves on code size.
  while (!(i >= maxBytesToRead / 4)) {
    var utf32 = HEAP32[(((ptr)+(i*4))>>2)];
    if (utf32 == 0) break;
    ++i;
    // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing.
    // See http://unicode.org/faq/utf_bom.html#utf16-3
    if (utf32 >= 0x10000) {
      var ch = utf32 - 0x10000;
      str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF));
    } else {
      str += String.fromCharCode(utf32);
    }
  }
  return str;
}

// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr',
// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP.
// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write.
// Parameters:
//   str: the Javascript string to copy.
//   outPtr: Byte address in Emscripten HEAP where to write the string to.
//   maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null
//                    terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else.
//                    maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator.
// Returns the number of bytes written, EXCLUDING the null terminator.

function stringToUTF32(str, outPtr, maxBytesToWrite) {
  assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!');
  assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!');
  // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed.
  if (maxBytesToWrite === undefined) {
    maxBytesToWrite = 0x7FFFFFFF;
  }
  if (maxBytesToWrite < 4) return 0;
  var startPtr = outPtr;
  var endPtr = startPtr + maxBytesToWrite - 4;
  for (var i = 0; i < str.length; ++i) {
    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
    // See http://unicode.org/faq/utf_bom.html#utf16-3
    var codeUnit = str.charCodeAt(i); // possibly a lead surrogate
    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) {
      var trailSurrogate = str.charCodeAt(++i);
      codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF);
    }
    HEAP32[((outPtr)>>2)] = codeUnit;
    outPtr += 4;
    if (outPtr + 4 > endPtr) break;
  }
  // Null-terminate the pointer to the HEAP.
  HEAP32[((outPtr)>>2)] = 0;
  return outPtr - startPtr;
}

// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte.

function lengthBytesUTF32(str) {
  var len = 0;
  for (var i = 0; i < str.length; ++i) {
    // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap.
    // See http://unicode.org/faq/utf_bom.html#utf16-3
    var codeUnit = str.charCodeAt(i);
    if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate.
    len += 4;
  }

  return len;
}

// Allocate heap space for a JS string, and write it there.
// It is the responsibility of the caller to free() that memory.
function allocateUTF8(str) {
  var size = lengthBytesUTF8(str) + 1;
  var ret = abort('malloc was not included, but is needed in allocateUTF8. Adding "_malloc" to EXPORTED_FUNCTIONS should fix that. This may be a bug in the compiler, please file an issue.');;
  if (ret) stringToUTF8Array(str, HEAP8, ret, size);
  return ret;
}

// Allocate stack space for a JS string, and write it there.
function allocateUTF8OnStack(str) {
  var size = lengthBytesUTF8(str) + 1;
  var ret = stackAlloc(size);
  stringToUTF8Array(str, HEAP8, ret, size);
  return ret;
}

// Deprecated: This function should not be called because it is unsafe and does not provide
// a maximum length limit of how many bytes it is allowed to write. Prefer calling the
// function stringToUTF8Array() instead, which takes in a maximum length that can be used
// to be secure from out of bounds writes.
/** @deprecated
    @param {boolean=} dontAddNull */
function writeStringToMemory(string, buffer, dontAddNull) {
  warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!');

  var /** @type {number} */ lastChar, /** @type {number} */ end;
  if (dontAddNull) {
    // stringToUTF8Array always appends null. If we don't want to do that, remember the
    // character that existed at the location where the null will be placed, and restore
    // that after the write (below).
    end = buffer + lengthBytesUTF8(string);
    lastChar = HEAP8[end];
  }
  stringToUTF8(string, buffer, Infinity);
  if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character.
}

function writeArrayToMemory(array, buffer) {
  assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)')
  HEAP8.set(array, buffer);
}

/** @param {boolean=} dontAddNull */
function writeAsciiToMemory(str, buffer, dontAddNull) {
  for (var i = 0; i < str.length; ++i) {
    assert(str.charCodeAt(i) === str.charCodeAt(i)&0xff);
    HEAP8[((buffer++)>>0)] = str.charCodeAt(i);
  }
  // Null-terminate the pointer to the HEAP.
  if (!dontAddNull) HEAP8[((buffer)>>0)] = 0;
}

// end include: runtime_strings_extra.js
// Memory management

function alignUp(x, multiple) {
  if (x % multiple > 0) {
    x += multiple - (x % multiple);
  }
  return x;
}

var HEAP,
/** @type {ArrayBuffer} */
  buffer,
/** @type {Int8Array} */
  HEAP8,
/** @type {Uint8Array} */
  HEAPU8,
/** @type {Int16Array} */
  HEAP16,
/** @type {Uint16Array} */
  HEAPU16,
/** @type {Int32Array} */
  HEAP32,
/** @type {Uint32Array} */
  HEAPU32,
/** @type {Float32Array} */
  HEAPF32,
/** @type {Float64Array} */
  HEAPF64;

function updateGlobalBufferAndViews(buf) {
  buffer = buf;
  Module['HEAP8'] = HEAP8 = new Int8Array(buf);
  Module['HEAP16'] = HEAP16 = new Int16Array(buf);
  Module['HEAP32'] = HEAP32 = new Int32Array(buf);
  Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf);
  Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf);
  Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf);
  Module['HEAPF32'] = HEAPF32 = new Float32Array(buf);
  Module['HEAPF64'] = HEAPF64 = new Float64Array(buf);
}

var TOTAL_STACK = 5242880;
if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime')

var INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;
if (!Object.getOwnPropertyDescriptor(Module, 'INITIAL_MEMORY')) {
  Object.defineProperty(Module, 'INITIAL_MEMORY', {
    configurable: true,
    get: function() {
      abort('Module.INITIAL_MEMORY has been replaced with plain INITIAL_MEMORY (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)')
    }
  });
}

assert(INITIAL_MEMORY >= TOTAL_STACK, 'INITIAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')');

// check for full engine support (use string 'subarray' to avoid closure compiler confusion)
assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray !== undefined && Int32Array.prototype.set !== undefined,
       'JS engine does not provide full typed array support');

// If memory is defined in wasm, the user can't provide it.
assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected.  Use -s IMPORTED_MEMORY to define wasmMemory externally');
assert(INITIAL_MEMORY == 16777216, 'Detected runtime INITIAL_MEMORY setting.  Use -s IMPORTED_MEMORY to define wasmMemory dynamically');

// include: runtime_init_table.js
// In regular non-RELOCATABLE mode the table is exported
// from the wasm module and this will be assigned once
// the exports are available.
var wasmTable;

// end include: runtime_init_table.js
// include: runtime_stack_check.js


// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode.
function writeStackCookie() {
  var max = _emscripten_stack_get_end();
  assert((max & 3) == 0);
  // The stack grows downwards
  HEAPU32[(max >> 2)+1] = 0x2135467;
  HEAPU32[(max >> 2)+2] = 0x89BACDFE;
  // Also test the global address 0 for integrity.
  HEAP32[0] = 0x63736d65; /* 'emsc' */
}

function checkStackCookie() {
  if (ABORT) return;
  var max = _emscripten_stack_get_end();
  var cookie1 = HEAPU32[(max >> 2)+1];
  var cookie2 = HEAPU32[(max >> 2)+2];
  if (cookie1 != 0x2135467 || cookie2 != 0x89BACDFE) {
    abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x' + cookie2.toString(16) + ' ' + cookie1.toString(16));
  }
  // Also test the global address 0 for integrity.
  if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!');
}

// end include: runtime_stack_check.js
// include: runtime_assertions.js


// Endianness check
(function() {
  var h16 = new Int16Array(1);
  var h8 = new Int8Array(h16.buffer);
  h16[0] = 0x6373;
  if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -s SUPPORT_BIG_ENDIAN=1 to bypass)';
})();

// end include: runtime_assertions.js
var __ATPRERUN__  = []; // functions called before the runtime is initialized
var __ATINIT__    = []; // functions called during startup
var __ATMAIN__    = []; // functions called when main() is to be run
var __ATEXIT__    = []; // functions called during shutdown
var __ATPOSTRUN__ = []; // functions called after the main() is called

var runtimeInitialized = false;
var runtimeExited = false;
var runtimeKeepaliveCounter = 0;

function keepRuntimeAlive() {
  return noExitRuntime || runtimeKeepaliveCounter > 0;
}

function preRun() {

  if (Module['preRun']) {
    if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']];
    while (Module['preRun'].length) {
      addOnPreRun(Module['preRun'].shift());
    }
  }

  callRuntimeCallbacks(__ATPRERUN__);
}

function initRuntime() {
  checkStackCookie();
  assert(!runtimeInitialized);
  runtimeInitialized = true;


  callRuntimeCallbacks(__ATINIT__);
}

function preMain() {
  checkStackCookie();

  callRuntimeCallbacks(__ATMAIN__);
}

function exitRuntime() {
  checkStackCookie();
  runtimeExited = true;
}

function postRun() {
  checkStackCookie();

  if (Module['postRun']) {
    if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']];
    while (Module['postRun'].length) {
      addOnPostRun(Module['postRun'].shift());
    }
  }

  callRuntimeCallbacks(__ATPOSTRUN__);
}

function addOnPreRun(cb) {
  __ATPRERUN__.unshift(cb);
}

function addOnInit(cb) {
  __ATINIT__.unshift(cb);
}

function addOnPreMain(cb) {
  __ATMAIN__.unshift(cb);
}

function addOnExit(cb) {
}

function addOnPostRun(cb) {
  __ATPOSTRUN__.unshift(cb);
}

// include: runtime_math.js


// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc

assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');
assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill');

// end include: runtime_math.js
// A counter of dependencies for calling run(). If we need to
// do asynchronous work before running, increment this and
// decrement it. Incrementing must happen in a place like
// Module.preRun (used by emcc to add file preloading).
// Note that you can add dependencies in preRun, even though
// it happens right before run - run will be postponed until
// the dependencies are met.
var runDependencies = 0;
var runDependencyWatcher = null;
var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled
var runDependencyTracking = {};

function getUniqueRunDependency(id) {
  var orig = id;
  while (1) {
    if (!runDependencyTracking[id]) return id;
    id = orig + Math.random();
  }
}

function addRunDependency(id) {
  runDependencies++;

  if (Module['monitorRunDependencies']) {
    Module['monitorRunDependencies'](runDependencies);
  }

  if (id) {
    assert(!runDependencyTracking[id]);
    runDependencyTracking[id] = 1;
    if (runDependencyWatcher === null && typeof setInterval !== 'undefined') {
      // Check for missing dependencies every few seconds
      runDependencyWatcher = setInterval(function() {
        if (ABORT) {
          clearInterval(runDependencyWatcher);
          runDependencyWatcher = null;
          return;
        }
        var shown = false;
        for (var dep in runDependencyTracking) {
          if (!shown) {
            shown = true;
            err('still waiting on run dependencies:');
          }
          err('dependency: ' + dep);
        }
        if (shown) {
          err('(end of list)');
        }
      }, 10000);
    }
  } else {
    err('warning: run dependency added without ID');
  }
}

function removeRunDependency(id) {
  runDependencies--;

  if (Module['monitorRunDependencies']) {
    Module['monitorRunDependencies'](runDependencies);
  }

  if (id) {
    assert(runDependencyTracking[id]);
    delete runDependencyTracking[id];
  } else {
    err('warning: run dependency removed without ID');
  }
  if (runDependencies == 0) {
    if (runDependencyWatcher !== null) {
      clearInterval(runDependencyWatcher);
      runDependencyWatcher = null;
    }
    if (dependenciesFulfilled) {
      var callback = dependenciesFulfilled;
      dependenciesFulfilled = null;
      callback(); // can add another dependenciesFulfilled
    }
  }
}

Module["preloadedImages"] = {}; // maps url to image data
Module["preloadedAudios"] = {}; // maps url to audio data

/** @param {string|number=} what */
function abort(what) {
  {
    if (Module['onAbort']) {
      Module['onAbort'](what);
    }
  }

  what = 'Aborted(' + what + ')';
  // TODO(sbc): Should we remove printing and leave it up to whoever
  // catches the exception?
  err(what);

  ABORT = true;
  EXITSTATUS = 1;

  // Use a wasm runtime error, because a JS error might be seen as a foreign
  // exception, which means we'd run destructors on it. We need the error to
  // simply make the program stop.
  var e = new WebAssembly.RuntimeError(what);

  // Throw the error whether or not MODULARIZE is set because abort is used
  // in code paths apart from instantiation where an exception is expected
  // to be thrown when abort is called.
  throw e;
}

// {{MEM_INITIALIZER}}

// include: memoryprofiler.js


// end include: memoryprofiler.js
// show errors on likely calls to FS when it was not included
var FS = {
  error: function() {
    abort('Filesystem support (FS) was not included. The problem is that you are using files from JS, but files were not used from C/C++, so filesystem support was not auto-included. You can force-include filesystem support with  -s FORCE_FILESYSTEM=1');
  },
  init: function() { FS.error() },
  createDataFile: function() { FS.error() },
  createPreloadedFile: function() { FS.error() },
  createLazyFile: function() { FS.error() },
  open: function() { FS.error() },
  mkdev: function() { FS.error() },
  registerDevice: function() { FS.error() },
  analyzePath: function() { FS.error() },
  loadFilesFromDB: function() { FS.error() },

  ErrnoError: function ErrnoError() { FS.error() },
};
Module['FS_createDataFile'] = FS.createDataFile;
Module['FS_createPreloadedFile'] = FS.createPreloadedFile;

// include: URIUtils.js


// Prefix of data URIs emitted by SINGLE_FILE and related options.
var dataURIPrefix = 'data:application/octet-stream;base64,';

// Indicates whether filename is a base64 data URI.
function isDataURI(filename) {
  // Prefix of data URIs emitted by SINGLE_FILE and related options.
  return filename.startsWith(dataURIPrefix);
}

// Indicates whether filename is delivered via file protocol (as opposed to http/https)
function isFileURI(filename) {
  return filename.startsWith('file://');
}

// end include: URIUtils.js
function createExportWrapper(name, fixedasm) {
  return function() {
    var displayName = name;
    var asm = fixedasm;
    if (!fixedasm) {
      asm = Module['asm'];
    }
    assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization');
    assert(!runtimeExited, 'native function `' + displayName + '` called after runtime exit (use NO_EXIT_RUNTIME to keep it alive after main() exits)');
    if (!asm[name]) {
      assert(asm[name], 'exported native function `' + displayName + '` not found');
    }
    return asm[name].apply(null, arguments);
  };
}

var wasmBinaryFile;
  wasmBinaryFile = 'hello.wasm';
  if (!isDataURI(wasmBinaryFile)) {
    wasmBinaryFile = locateFile(wasmBinaryFile);
  }

function getBinary(file) {
  try {
    if (file == wasmBinaryFile && wasmBinary) {
      return new Uint8Array(wasmBinary);
    }
    if (readBinary) {
      return readBinary(file);
    } else {
      throw "both async and sync fetching of the wasm failed";
    }
  }
  catch (err) {
    abort(err);
  }
}

function getBinaryPromise() {
  // If we don't have the binary yet, try to to load it asynchronously.
  // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url.
  // See https://github.com/github/fetch/pull/92#issuecomment-140665932
  // Cordova or Electron apps are typically loaded from a file:// url.
  // So use fetch if it is available and the url is not a file, otherwise fall back to XHR.
  if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) {
    if (typeof fetch === 'function'
      && !isFileURI(wasmBinaryFile)
    ) {
      return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) {
        if (!response['ok']) {
          throw "failed to load wasm binary file at '" + wasmBinaryFile + "'";
        }
        return response['arrayBuffer']();
      }).catch(function () {
          return getBinary(wasmBinaryFile);
      });
    }
    else {
      if (readAsync) {
        // fetch is not available or url is file => try XHR (readAsync uses XHR internally)
        return new Promise(function(resolve, reject) {
          readAsync(wasmBinaryFile, function(response) { resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))) }, reject)
        });
      }
    }
  }

  // Otherwise, getBinary should be able to get it synchronously
  return Promise.resolve().then(function() { return getBinary(wasmBinaryFile); });
}

// Create the wasm instance.
// Receives the wasm imports, returns the exports.
function createWasm() {
  // prepare imports
  var info = {
    'env': asmLibraryArg,
    'wasi_snapshot_preview1': asmLibraryArg,
  };
  // Load the wasm module and create an instance of using native support in the JS engine.
  // handle a generated wasm instance, receiving its exports and
  // performing other necessary setup
  /** @param {WebAssembly.Module=} module*/
  function receiveInstance(instance, module) {
    var exports = instance.exports;

    Module['asm'] = exports;

    wasmMemory = Module['asm']['memory'];
    assert(wasmMemory, "memory not found in wasm exports");
    // This assertion doesn't hold when emscripten is run in --post-link
    // mode.
    // TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode.
    //assert(wasmMemory.buffer.byteLength === 16777216);
    updateGlobalBufferAndViews(wasmMemory.buffer);

    wasmTable = Module['asm']['__indirect_function_table'];
    assert(wasmTable, "table not found in wasm exports");

    addOnInit(Module['asm']['__wasm_call_ctors']);

    removeRunDependency('wasm-instantiate');
  }
  // we can't run yet (except in a pthread, where we have a custom sync instantiator)
  addRunDependency('wasm-instantiate');

  // Prefer streaming instantiation if available.
  // Async compilation can be confusing when an error on the page overwrites Module
  // (for example, if the order of elements is wrong, and the one defining Module is
  // later), so we save Module and check it later.
  var trueModule = Module;
  function receiveInstantiationResult(result) {
    // 'result' is a ResultObject object which has both the module and instance.
    // receiveInstance() will swap in the exports (to Module.asm) so they can be called
    assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?');
    trueModule = null;
    // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line.
    // When the regression is fixed, can restore the above USE_PTHREADS-enabled path.
    receiveInstance(result['instance']);
  }

  function instantiateArrayBuffer(receiver) {
    return getBinaryPromise().then(function(binary) {
      return WebAssembly.instantiate(binary, info);
    }).then(function (instance) {
      return instance;
    }).then(receiver, function(reason) {
      err('failed to asynchronously prepare wasm: ' + reason);

      // Warn on some common problems.
      if (isFileURI(wasmBinaryFile)) {
        err('warning: Loading from a file URI (' + wasmBinaryFile + ') is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing');
      }
      abort(reason);
    });
  }

  function instantiateAsync() {
    if (!wasmBinary &&
        typeof WebAssembly.instantiateStreaming === 'function' &&
        !isDataURI(wasmBinaryFile) &&
        // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously.
        !isFileURI(wasmBinaryFile) &&
        typeof fetch === 'function') {
      return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) {
        var result = WebAssembly.instantiateStreaming(response, info);

        return result.then(
          receiveInstantiationResult,
          function(reason) {
            // We expect the most common failure cause to be a bad MIME type for the binary,
            // in which case falling back to ArrayBuffer instantiation should work.
            err('wasm streaming compile failed: ' + reason);
            err('falling back to ArrayBuffer instantiation');
            return instantiateArrayBuffer(receiveInstantiationResult);
          });
      });
    } else {
      return instantiateArrayBuffer(receiveInstantiationResult);
    }
  }

  // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback
  // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel
  // to any other async startup actions they are performing.
  if (Module['instantiateWasm']) {
    try {
      var exports = Module['instantiateWasm'](info, receiveInstance);
      return exports;
    } catch(e) {
      err('Module.instantiateWasm callback failed with error: ' + e);
      return false;
    }
  }

  instantiateAsync();
  return {}; // no exports yet; we'll fill them in later
}

// Globals used by JS i64 conversions (see makeSetValue)
var tempDouble;
var tempI64;

// === Body ===

var ASM_CONSTS = {

};






  function callRuntimeCallbacks(callbacks) {
      while (callbacks.length > 0) {
        var callback = callbacks.shift();
        if (typeof callback == 'function') {
          callback(Module); // Pass the module as the first argument.
          continue;
        }
        var func = callback.func;
        if (typeof func === 'number') {
          if (callback.arg === undefined) {
            getWasmTableEntry(func)();
          } else {
            getWasmTableEntry(func)(callback.arg);
          }
        } else {
          func(callback.arg === undefined ? null : callback.arg);
        }
      }
    }

  function withStackSave(f) {
      var stack = stackSave();
      var ret = f();
      stackRestore(stack);
      return ret;
    }
  function demangle(func) {
      warnOnce('warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling');
      return func;
    }

  function demangleAll(text) {
      var regex =
        /\b_Z[\w\d_]+/g;
      return text.replace(regex,
        function(x) {
          var y = demangle(x);
          return x === y ? x : (y + ' [' + x + ']');
        });
    }

  var wasmTableMirror = [];
  function getWasmTableEntry(funcPtr) {
      var func = wasmTableMirror[funcPtr];
      if (!func) {
        if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1;
        wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr);
      }
      assert(wasmTable.get(funcPtr) == func, "JavaScript-side Wasm function table mirror is out of date!");
      return func;
    }

  function handleException(e) {
      // Certain exception types we do not treat as errors since they are used for
      // internal control flow.
      // 1. ExitStatus, which is thrown by exit()
      // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others
      //    that wish to return to JS event loop.
      if (e instanceof ExitStatus || e == 'unwind') {
        return EXITSTATUS;
      }
      quit_(1, e);
    }

  function jsStackTrace() {
      var error = new Error();
      if (!error.stack) {
        // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown,
        // so try that as a special-case.
        try {
          throw new Error();
        } catch(e) {
          error = e;
        }
        if (!error.stack) {
          return '(no stack trace available)';
        }
      }
      return error.stack.toString();
    }

  function setWasmTableEntry(idx, func) {
      wasmTable.set(idx, func);
      wasmTableMirror[idx] = func;
    }

  function stackTrace() {
      var js = jsStackTrace();
      if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace']();
      return demangleAll(js);
    }

  function _emscripten_memcpy_big(dest, src, num) {
      HEAPU8.copyWithin(dest, src, src + num);
    }

  function flush_NO_FILESYSTEM() {
      // flush anything remaining in the buffers during shutdown
      if (typeof _fflush !== 'undefined') _fflush(0);
      var buffers = SYSCALLS.buffers;
      if (buffers[1].length) SYSCALLS.printChar(1, 10);
      if (buffers[2].length) SYSCALLS.printChar(2, 10);
    }

  var SYSCALLS = {mappings:{},buffers:[null,[],[]],printChar:function(stream, curr) {
        var buffer = SYSCALLS.buffers[stream];
        assert(buffer);
        if (curr === 0 || curr === 10) {
          (stream === 1 ? out : err)(UTF8ArrayToString(buffer, 0));
          buffer.length = 0;
        } else {
          buffer.push(curr);
        }
      },varargs:undefined,get:function() {
        assert(SYSCALLS.varargs != undefined);
        SYSCALLS.varargs += 4;
        var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)];
        return ret;
      },getStr:function(ptr) {
        var ret = UTF8ToString(ptr);
        return ret;
      },get64:function(low, high) {
        if (low >= 0) assert(high === 0);
        else assert(high === -1);
        return low;
      }};
  function _fd_write(fd, iov, iovcnt, pnum) {
      ;
      // hack to support printf in SYSCALLS_REQUIRE_FILESYSTEM=0
      var num = 0;
      for (var i = 0; i < iovcnt; i++) {
        var ptr = HEAP32[((iov)>>2)];
        var len = HEAP32[(((iov)+(4))>>2)];
        iov += 8;
        for (var j = 0; j < len; j++) {
          SYSCALLS.printChar(fd, HEAPU8[ptr+j]);
        }
        num += len;
      }
      HEAP32[((pnum)>>2)] = num
      return 0;
    }

  function _setTempRet0(val) {
      setTempRet0(val);
    }
var ASSERTIONS = true;



/** @type {function(string, boolean=, number=)} */
function intArrayFromString(stringy, dontAddNull, length) {
  var len = length > 0 ? length : lengthBytesUTF8(stringy)+1;
  var u8array = new Array(len);
  var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length);
  if (dontAddNull) u8array.length = numBytesWritten;
  return u8array;
}

function intArrayToString(array) {
  var ret = [];
  for (var i = 0; i < array.length; i++) {
    var chr = array[i];
    if (chr > 0xFF) {
      if (ASSERTIONS) {
        assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ')  at offset ' + i + ' not in 0x00-0xFF.');
      }
      chr &= 0xFF;
    }
    ret.push(String.fromCharCode(chr));
  }
  return ret.join('');
}


var asmLibraryArg = {
  "emscripten_memcpy_big": _emscripten_memcpy_big,
  "fd_write": _fd_write,
  "setTempRet0": _setTempRet0
};
var asm = createWasm();
/** @type {function(...*):?} */
var ___wasm_call_ctors = Module["___wasm_call_ctors"] = createExportWrapper("__wasm_call_ctors");

/** @type {function(...*):?} */
var _main = Module["_main"] = createExportWrapper("main");

/** @type {function(...*):?} */
var _fflush = Module["_fflush"] = createExportWrapper("fflush");

/** @type {function(...*):?} */
var ___errno_location = Module["___errno_location"] = createExportWrapper("__errno_location");

/** @type {function(...*):?} */
var stackSave = Module["stackSave"] = createExportWrapper("stackSave");

/** @type {function(...*):?} */
var stackRestore = Module["stackRestore"] = createExportWrapper("stackRestore");

/** @type {function(...*):?} */
var stackAlloc = Module["stackAlloc"] = createExportWrapper("stackAlloc");

/** @type {function(...*):?} */
var _emscripten_stack_init = Module["_emscripten_stack_init"] = function() {
  return (_emscripten_stack_init = Module["_emscripten_stack_init"] = Module["asm"]["emscripten_stack_init"]).apply(null, arguments);
};

/** @type {function(...*):?} */
var _emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = function() {
  return (_emscripten_stack_get_free = Module["_emscripten_stack_get_free"] = Module["asm"]["emscripten_stack_get_free"]).apply(null, arguments);
};

/** @type {function(...*):?} */
var _emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = function() {
  return (_emscripten_stack_get_end = Module["_emscripten_stack_get_end"] = Module["asm"]["emscripten_stack_get_end"]).apply(null, arguments);
};

/** @type {function(...*):?} */
var dynCall_jiji = Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji");





// === Auto-generated postamble setup entry stuff ===

if (!Object.getOwnPropertyDescriptor(Module, "intArrayFromString")) Module["intArrayFromString"] = function() { abort("'intArrayFromString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "intArrayToString")) Module["intArrayToString"] = function() { abort("'intArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ccall")) Module["ccall"] = function() { abort("'ccall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "cwrap")) Module["cwrap"] = function() { abort("'cwrap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setValue")) Module["setValue"] = function() { abort("'setValue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getValue")) Module["getValue"] = function() { abort("'getValue' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "allocate")) Module["allocate"] = function() { abort("'allocate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UTF8ArrayToString")) Module["UTF8ArrayToString"] = function() { abort("'UTF8ArrayToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UTF8ToString")) Module["UTF8ToString"] = function() { abort("'UTF8ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8Array")) Module["stringToUTF8Array"] = function() { abort("'stringToUTF8Array' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8")) Module["stringToUTF8"] = function() { abort("'stringToUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF8")) Module["lengthBytesUTF8"] = function() { abort("'lengthBytesUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnPreRun")) Module["addOnPreRun"] = function() { abort("'addOnPreRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnInit")) Module["addOnInit"] = function() { abort("'addOnInit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnPreMain")) Module["addOnPreMain"] = function() { abort("'addOnPreMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnExit")) Module["addOnExit"] = function() { abort("'addOnExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addOnPostRun")) Module["addOnPostRun"] = function() { abort("'addOnPostRun' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeStringToMemory")) Module["writeStringToMemory"] = function() { abort("'writeStringToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeArrayToMemory")) Module["writeArrayToMemory"] = function() { abort("'writeArrayToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeAsciiToMemory")) Module["writeAsciiToMemory"] = function() { abort("'writeAsciiToMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addRunDependency")) Module["addRunDependency"] = function() { abort("'addRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "removeRunDependency")) Module["removeRunDependency"] = function() { abort("'removeRunDependency' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createFolder")) Module["FS_createFolder"] = function() { abort("'FS_createFolder' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createPath")) Module["FS_createPath"] = function() { abort("'FS_createPath' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createDataFile")) Module["FS_createDataFile"] = function() { abort("'FS_createDataFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createPreloadedFile")) Module["FS_createPreloadedFile"] = function() { abort("'FS_createPreloadedFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createLazyFile")) Module["FS_createLazyFile"] = function() { abort("'FS_createLazyFile' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createLink")) Module["FS_createLink"] = function() { abort("'FS_createLink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_createDevice")) Module["FS_createDevice"] = function() { abort("'FS_createDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "FS_unlink")) Module["FS_unlink"] = function() { abort("'FS_unlink' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") };
if (!Object.getOwnPropertyDescriptor(Module, "getLEB")) Module["getLEB"] = function() { abort("'getLEB' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getFunctionTables")) Module["getFunctionTables"] = function() { abort("'getFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "alignFunctionTables")) Module["alignFunctionTables"] = function() { abort("'alignFunctionTables' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerFunctions")) Module["registerFunctions"] = function() { abort("'registerFunctions' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "addFunction")) Module["addFunction"] = function() { abort("'addFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "removeFunction")) Module["removeFunction"] = function() { abort("'removeFunction' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = function() { abort("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "prettyPrint")) Module["prettyPrint"] = function() { abort("'prettyPrint' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = function() { abort("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getCompilerSetting")) Module["getCompilerSetting"] = function() { abort("'getCompilerSetting' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "print")) Module["print"] = function() { abort("'print' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "printErr")) Module["printErr"] = function() { abort("'printErr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getTempRet0")) Module["getTempRet0"] = function() { abort("'getTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setTempRet0")) Module["setTempRet0"] = function() { abort("'setTempRet0' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "callMain")) Module["callMain"] = function() { abort("'callMain' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "abort")) Module["abort"] = function() { abort("'abort' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "keepRuntimeAlive")) Module["keepRuntimeAlive"] = function() { abort("'keepRuntimeAlive' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "zeroMemory")) Module["zeroMemory"] = function() { abort("'zeroMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToNewUTF8")) Module["stringToNewUTF8"] = function() { abort("'stringToNewUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setFileTime")) Module["setFileTime"] = function() { abort("'setFileTime' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "abortOnCannotGrowMemory")) Module["abortOnCannotGrowMemory"] = function() { abort("'abortOnCannotGrowMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscripten_realloc_buffer")) Module["emscripten_realloc_buffer"] = function() { abort("'emscripten_realloc_buffer' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ENV")) Module["ENV"] = function() { abort("'ENV' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "withStackSave")) Module["withStackSave"] = function() { abort("'withStackSave' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_CODES")) Module["ERRNO_CODES"] = function() { abort("'ERRNO_CODES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_MESSAGES")) Module["ERRNO_MESSAGES"] = function() { abort("'ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setErrNo")) Module["setErrNo"] = function() { abort("'setErrNo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "inetPton4")) Module["inetPton4"] = function() { abort("'inetPton4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "inetNtop4")) Module["inetNtop4"] = function() { abort("'inetNtop4' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "inetPton6")) Module["inetPton6"] = function() { abort("'inetPton6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "inetNtop6")) Module["inetNtop6"] = function() { abort("'inetNtop6' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readSockaddr")) Module["readSockaddr"] = function() { abort("'readSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeSockaddr")) Module["writeSockaddr"] = function() { abort("'writeSockaddr' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "DNS")) Module["DNS"] = function() { abort("'DNS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getHostByName")) Module["getHostByName"] = function() { abort("'getHostByName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GAI_ERRNO_MESSAGES")) Module["GAI_ERRNO_MESSAGES"] = function() { abort("'GAI_ERRNO_MESSAGES' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "Protocols")) Module["Protocols"] = function() { abort("'Protocols' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "Sockets")) Module["Sockets"] = function() { abort("'Sockets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getRandomDevice")) Module["getRandomDevice"] = function() { abort("'getRandomDevice' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "traverseStack")) Module["traverseStack"] = function() { abort("'traverseStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UNWIND_CACHE")) Module["UNWIND_CACHE"] = function() { abort("'UNWIND_CACHE' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgsArray")) Module["readAsmConstArgsArray"] = function() { abort("'readAsmConstArgsArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgs")) Module["readAsmConstArgs"] = function() { abort("'readAsmConstArgs' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "mainThreadEM_ASM")) Module["mainThreadEM_ASM"] = function() { abort("'mainThreadEM_ASM' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "jstoi_q")) Module["jstoi_q"] = function() { abort("'jstoi_q' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "jstoi_s")) Module["jstoi_s"] = function() { abort("'jstoi_s' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getExecutableName")) Module["getExecutableName"] = function() { abort("'getExecutableName' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "listenOnce")) Module["listenOnce"] = function() { abort("'listenOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "autoResumeAudioContext")) Module["autoResumeAudioContext"] = function() { abort("'autoResumeAudioContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "dynCallLegacy")) Module["dynCallLegacy"] = function() { abort("'dynCallLegacy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getDynCaller")) Module["getDynCaller"] = function() { abort("'getDynCaller' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = function() { abort("'dynCall' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "callRuntimeCallbacks")) Module["callRuntimeCallbacks"] = function() { abort("'callRuntimeCallbacks' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "wasmTableMirror")) Module["wasmTableMirror"] = function() { abort("'wasmTableMirror' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setWasmTableEntry")) Module["setWasmTableEntry"] = function() { abort("'setWasmTableEntry' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getWasmTableEntry")) Module["getWasmTableEntry"] = function() { abort("'getWasmTableEntry' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "handleException")) Module["handleException"] = function() { abort("'handleException' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "runtimeKeepalivePush")) Module["runtimeKeepalivePush"] = function() { abort("'runtimeKeepalivePush' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "runtimeKeepalivePop")) Module["runtimeKeepalivePop"] = function() { abort("'runtimeKeepalivePop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "callUserCallback")) Module["callUserCallback"] = function() { abort("'callUserCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "maybeExit")) Module["maybeExit"] = function() { abort("'maybeExit' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "safeSetTimeout")) Module["safeSetTimeout"] = function() { abort("'safeSetTimeout' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "asmjsMangle")) Module["asmjsMangle"] = function() { abort("'asmjsMangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "asyncLoad")) Module["asyncLoad"] = function() { abort("'asyncLoad' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "alignMemory")) Module["alignMemory"] = function() { abort("'alignMemory' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "mmapAlloc")) Module["mmapAlloc"] = function() { abort("'mmapAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "reallyNegative")) Module["reallyNegative"] = function() { abort("'reallyNegative' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "unSign")) Module["unSign"] = function() { abort("'unSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "reSign")) Module["reSign"] = function() { abort("'reSign' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "formatString")) Module["formatString"] = function() { abort("'formatString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "PATH")) Module["PATH"] = function() { abort("'PATH' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "PATH_FS")) Module["PATH_FS"] = function() { abort("'PATH_FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SYSCALLS")) Module["SYSCALLS"] = function() { abort("'SYSCALLS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "syscallMmap2")) Module["syscallMmap2"] = function() { abort("'syscallMmap2' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "syscallMunmap")) Module["syscallMunmap"] = function() { abort("'syscallMunmap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getSocketFromFD")) Module["getSocketFromFD"] = function() { abort("'getSocketFromFD' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getSocketAddress")) Module["getSocketAddress"] = function() { abort("'getSocketAddress' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "JSEvents")) Module["JSEvents"] = function() { abort("'JSEvents' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerKeyEventCallback")) Module["registerKeyEventCallback"] = function() { abort("'registerKeyEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "specialHTMLTargets")) Module["specialHTMLTargets"] = function() { abort("'specialHTMLTargets' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "maybeCStringToJsString")) Module["maybeCStringToJsString"] = function() { abort("'maybeCStringToJsString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "findEventTarget")) Module["findEventTarget"] = function() { abort("'findEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "findCanvasEventTarget")) Module["findCanvasEventTarget"] = function() { abort("'findCanvasEventTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getBoundingClientRect")) Module["getBoundingClientRect"] = function() { abort("'getBoundingClientRect' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillMouseEventData")) Module["fillMouseEventData"] = function() { abort("'fillMouseEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerMouseEventCallback")) Module["registerMouseEventCallback"] = function() { abort("'registerMouseEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerWheelEventCallback")) Module["registerWheelEventCallback"] = function() { abort("'registerWheelEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerUiEventCallback")) Module["registerUiEventCallback"] = function() { abort("'registerUiEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerFocusEventCallback")) Module["registerFocusEventCallback"] = function() { abort("'registerFocusEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillDeviceOrientationEventData")) Module["fillDeviceOrientationEventData"] = function() { abort("'fillDeviceOrientationEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerDeviceOrientationEventCallback")) Module["registerDeviceOrientationEventCallback"] = function() { abort("'registerDeviceOrientationEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillDeviceMotionEventData")) Module["fillDeviceMotionEventData"] = function() { abort("'fillDeviceMotionEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerDeviceMotionEventCallback")) Module["registerDeviceMotionEventCallback"] = function() { abort("'registerDeviceMotionEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "screenOrientation")) Module["screenOrientation"] = function() { abort("'screenOrientation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillOrientationChangeEventData")) Module["fillOrientationChangeEventData"] = function() { abort("'fillOrientationChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerOrientationChangeEventCallback")) Module["registerOrientationChangeEventCallback"] = function() { abort("'registerOrientationChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillFullscreenChangeEventData")) Module["fillFullscreenChangeEventData"] = function() { abort("'fillFullscreenChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerFullscreenChangeEventCallback")) Module["registerFullscreenChangeEventCallback"] = function() { abort("'registerFullscreenChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerRestoreOldStyle")) Module["registerRestoreOldStyle"] = function() { abort("'registerRestoreOldStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "hideEverythingExceptGivenElement")) Module["hideEverythingExceptGivenElement"] = function() { abort("'hideEverythingExceptGivenElement' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "restoreHiddenElements")) Module["restoreHiddenElements"] = function() { abort("'restoreHiddenElements' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setLetterbox")) Module["setLetterbox"] = function() { abort("'setLetterbox' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "currentFullscreenStrategy")) Module["currentFullscreenStrategy"] = function() { abort("'currentFullscreenStrategy' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "restoreOldWindowedStyle")) Module["restoreOldWindowedStyle"] = function() { abort("'restoreOldWindowedStyle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "softFullscreenResizeWebGLRenderTarget")) Module["softFullscreenResizeWebGLRenderTarget"] = function() { abort("'softFullscreenResizeWebGLRenderTarget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "doRequestFullscreen")) Module["doRequestFullscreen"] = function() { abort("'doRequestFullscreen' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillPointerlockChangeEventData")) Module["fillPointerlockChangeEventData"] = function() { abort("'fillPointerlockChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerPointerlockChangeEventCallback")) Module["registerPointerlockChangeEventCallback"] = function() { abort("'registerPointerlockChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerPointerlockErrorEventCallback")) Module["registerPointerlockErrorEventCallback"] = function() { abort("'registerPointerlockErrorEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "requestPointerLock")) Module["requestPointerLock"] = function() { abort("'requestPointerLock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillVisibilityChangeEventData")) Module["fillVisibilityChangeEventData"] = function() { abort("'fillVisibilityChangeEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerVisibilityChangeEventCallback")) Module["registerVisibilityChangeEventCallback"] = function() { abort("'registerVisibilityChangeEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerTouchEventCallback")) Module["registerTouchEventCallback"] = function() { abort("'registerTouchEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillGamepadEventData")) Module["fillGamepadEventData"] = function() { abort("'fillGamepadEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerGamepadEventCallback")) Module["registerGamepadEventCallback"] = function() { abort("'registerGamepadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerBeforeUnloadEventCallback")) Module["registerBeforeUnloadEventCallback"] = function() { abort("'registerBeforeUnloadEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "fillBatteryEventData")) Module["fillBatteryEventData"] = function() { abort("'fillBatteryEventData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "battery")) Module["battery"] = function() { abort("'battery' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "registerBatteryEventCallback")) Module["registerBatteryEventCallback"] = function() { abort("'registerBatteryEventCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setCanvasElementSize")) Module["setCanvasElementSize"] = function() { abort("'setCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getCanvasElementSize")) Module["getCanvasElementSize"] = function() { abort("'getCanvasElementSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "demangle")) Module["demangle"] = function() { abort("'demangle' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "demangleAll")) Module["demangleAll"] = function() { abort("'demangleAll' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "jsStackTrace")) Module["jsStackTrace"] = function() { abort("'jsStackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getEnvStrings")) Module["getEnvStrings"] = function() { abort("'getEnvStrings' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "checkWasiClock")) Module["checkWasiClock"] = function() { abort("'checkWasiClock' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "flush_NO_FILESYSTEM")) Module["flush_NO_FILESYSTEM"] = function() { abort("'flush_NO_FILESYSTEM' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64")) Module["writeI53ToI64"] = function() { abort("'writeI53ToI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Clamped")) Module["writeI53ToI64Clamped"] = function() { abort("'writeI53ToI64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Signaling")) Module["writeI53ToI64Signaling"] = function() { abort("'writeI53ToI64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Clamped")) Module["writeI53ToU64Clamped"] = function() { abort("'writeI53ToU64Clamped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Signaling")) Module["writeI53ToU64Signaling"] = function() { abort("'writeI53ToU64Signaling' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readI53FromI64")) Module["readI53FromI64"] = function() { abort("'readI53FromI64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "readI53FromU64")) Module["readI53FromU64"] = function() { abort("'readI53FromU64' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "convertI32PairToI53")) Module["convertI32PairToI53"] = function() { abort("'convertI32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "convertU32PairToI53")) Module["convertU32PairToI53"] = function() { abort("'convertU32PairToI53' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setImmediateWrapped")) Module["setImmediateWrapped"] = function() { abort("'setImmediateWrapped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "clearImmediateWrapped")) Module["clearImmediateWrapped"] = function() { abort("'clearImmediateWrapped' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "polyfillSetImmediate")) Module["polyfillSetImmediate"] = function() { abort("'polyfillSetImmediate' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "uncaughtExceptionCount")) Module["uncaughtExceptionCount"] = function() { abort("'uncaughtExceptionCount' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "exceptionLast")) Module["exceptionLast"] = function() { abort("'exceptionLast' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "exceptionCaught")) Module["exceptionCaught"] = function() { abort("'exceptionCaught' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "ExceptionInfo")) Module["ExceptionInfo"] = function() { abort("'ExceptionInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "CatchInfo")) Module["CatchInfo"] = function() { abort("'CatchInfo' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "exception_addRef")) Module["exception_addRef"] = function() { abort("'exception_addRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "exception_decRef")) Module["exception_decRef"] = function() { abort("'exception_decRef' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "Browser")) Module["Browser"] = function() { abort("'Browser' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "funcWrappers")) Module["funcWrappers"] = function() { abort("'funcWrappers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = function() { abort("'getFuncWrapper' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "setMainLoop")) Module["setMainLoop"] = function() { abort("'setMainLoop' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "wget")) Module["wget"] = function() { abort("'wget' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "FS")) Module["FS"] = function() { abort("'FS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "MEMFS")) Module["MEMFS"] = function() { abort("'MEMFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "TTY")) Module["TTY"] = function() { abort("'TTY' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "PIPEFS")) Module["PIPEFS"] = function() { abort("'PIPEFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SOCKFS")) Module["SOCKFS"] = function() { abort("'SOCKFS' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "_setNetworkCallback")) Module["_setNetworkCallback"] = function() { abort("'_setNetworkCallback' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "tempFixedLengthArray")) Module["tempFixedLengthArray"] = function() { abort("'tempFixedLengthArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "miniTempWebGLFloatBuffers")) Module["miniTempWebGLFloatBuffers"] = function() { abort("'miniTempWebGLFloatBuffers' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "heapObjectForWebGLType")) Module["heapObjectForWebGLType"] = function() { abort("'heapObjectForWebGLType' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "heapAccessShiftForWebGLHeap")) Module["heapAccessShiftForWebGLHeap"] = function() { abort("'heapAccessShiftForWebGLHeap' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GL")) Module["GL"] = function() { abort("'GL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGet")) Module["emscriptenWebGLGet"] = function() { abort("'emscriptenWebGLGet' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "computeUnpackAlignedImageSize")) Module["computeUnpackAlignedImageSize"] = function() { abort("'computeUnpackAlignedImageSize' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetTexPixelData")) Module["emscriptenWebGLGetTexPixelData"] = function() { abort("'emscriptenWebGLGetTexPixelData' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetUniform")) Module["emscriptenWebGLGetUniform"] = function() { abort("'emscriptenWebGLGetUniform' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "webglGetUniformLocation")) Module["webglGetUniformLocation"] = function() { abort("'webglGetUniformLocation' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "webglPrepareUniformLocationsBeforeFirstUse")) Module["webglPrepareUniformLocationsBeforeFirstUse"] = function() { abort("'webglPrepareUniformLocationsBeforeFirstUse' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "webglGetLeftBracePos")) Module["webglGetLeftBracePos"] = function() { abort("'webglGetLeftBracePos' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetVertexAttrib")) Module["emscriptenWebGLGetVertexAttrib"] = function() { abort("'emscriptenWebGLGetVertexAttrib' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "writeGLArray")) Module["writeGLArray"] = function() { abort("'writeGLArray' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "AL")) Module["AL"] = function() { abort("'AL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL_unicode")) Module["SDL_unicode"] = function() { abort("'SDL_unicode' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL_ttfContext")) Module["SDL_ttfContext"] = function() { abort("'SDL_ttfContext' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL_audio")) Module["SDL_audio"] = function() { abort("'SDL_audio' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL")) Module["SDL"] = function() { abort("'SDL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "SDL_gfx")) Module["SDL_gfx"] = function() { abort("'SDL_gfx' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GLUT")) Module["GLUT"] = function() { abort("'GLUT' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "EGL")) Module["EGL"] = function() { abort("'EGL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GLFW_Window")) Module["GLFW_Window"] = function() { abort("'GLFW_Window' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GLFW")) Module["GLFW"] = function() { abort("'GLFW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "GLEW")) Module["GLEW"] = function() { abort("'GLEW' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "IDBStore")) Module["IDBStore"] = function() { abort("'IDBStore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "runAndAbortIfError")) Module["runAndAbortIfError"] = function() { abort("'runAndAbortIfError' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "warnOnce")) Module["warnOnce"] = function() { abort("'warnOnce' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackSave")) Module["stackSave"] = function() { abort("'stackSave' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackRestore")) Module["stackRestore"] = function() { abort("'stackRestore' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stackAlloc")) Module["stackAlloc"] = function() { abort("'stackAlloc' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "AsciiToString")) Module["AsciiToString"] = function() { abort("'AsciiToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToAscii")) Module["stringToAscii"] = function() { abort("'stringToAscii' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UTF16ToString")) Module["UTF16ToString"] = function() { abort("'UTF16ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF16")) Module["stringToUTF16"] = function() { abort("'stringToUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF16")) Module["lengthBytesUTF16"] = function() { abort("'lengthBytesUTF16' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "UTF32ToString")) Module["UTF32ToString"] = function() { abort("'UTF32ToString' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF32")) Module["stringToUTF32"] = function() { abort("'stringToUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF32")) Module["lengthBytesUTF32"] = function() { abort("'lengthBytesUTF32' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8")) Module["allocateUTF8"] = function() { abort("'allocateUTF8' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8OnStack")) Module["allocateUTF8OnStack"] = function() { abort("'allocateUTF8OnStack' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") };
Module["writeStackCookie"] = writeStackCookie;
Module["checkStackCookie"] = checkStackCookie;
if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_NORMAL")) Object.defineProperty(Module, "ALLOC_NORMAL", { configurable: true, get: function() { abort("'ALLOC_NORMAL' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") } });
if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_STACK")) Object.defineProperty(Module, "ALLOC_STACK", { configurable: true, get: function() { abort("'ALLOC_STACK' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)") } });

var calledRun;

/**
 * @constructor
 * @this {ExitStatus}
 */
function ExitStatus(status) {
  this.name = "ExitStatus";
  this.message = "Program terminated with exit(" + status + ")";
  this.status = status;
}

var calledMain = false;

dependenciesFulfilled = function runCaller() {
  // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false)
  if (!calledRun) run();
  if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled
};

function callMain(args) {
  assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])');
  assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called');

  var entryFunction = Module['_main'];

  args = args || [];

  var argc = args.length+1;
  var argv = stackAlloc((argc + 1) * 4);
  HEAP32[argv >> 2] = allocateUTF8OnStack(thisProgram);
  for (var i = 1; i < argc; i++) {
    HEAP32[(argv >> 2) + i] = allocateUTF8OnStack(args[i - 1]);
  }
  HEAP32[(argv >> 2) + argc] = 0;

  try {

    var ret = entryFunction(argc, argv);

    // In PROXY_TO_PTHREAD builds, we should never exit the runtime below, as
    // execution is asynchronously handed off to a pthread.
    // if we're not running an evented main loop, it's time to exit
    exit(ret, /* implicit = */ true);
    return ret;
  }
  catch (e) {
    return handleException(e);
  } finally {
    calledMain = true;

  }
}

function stackCheckInit() {
  // This is normally called automatically during __wasm_call_ctors but need to
  // get these values before even running any of the ctors so we call it redundantly
  // here.
  // TODO(sbc): Move writeStackCookie to native to to avoid this.
  _emscripten_stack_init();
  writeStackCookie();
}

/** @type {function(Array=)} */
function run(args) {
  args = args || arguments_;

  if (runDependencies > 0) {
    return;
  }

  stackCheckInit();

  preRun();

  // a preRun added a dependency, run will be called later
  if (runDependencies > 0) {
    return;
  }

  function doRun() {
    // run may have just been called through dependencies being fulfilled just in this very frame,
    // or while the async setStatus time below was happening
    if (calledRun) return;
    calledRun = true;
    Module['calledRun'] = true;

    if (ABORT) return;

    initRuntime();

    preMain();

    if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']();

    if (shouldRunNow) callMain(args);

    postRun();
  }

  if (Module['setStatus']) {
    Module['setStatus']('Running...');
    setTimeout(function() {
      setTimeout(function() {
        Module['setStatus']('');
      }, 1);
      doRun();
    }, 1);
  } else
  {
    doRun();
  }
  checkStackCookie();
}
Module['run'] = run;

function checkUnflushedContent() {
  // Compiler settings do not allow exiting the runtime, so flushing
  // the streams is not possible. but in ASSERTIONS mode we check
  // if there was something to flush, and if so tell the user they
  // should request that the runtime be exitable.
  // Normally we would not even include flush() at all, but in ASSERTIONS
  // builds we do so just for this check, and here we see if there is any
  // content to flush, that is, we check if there would have been
  // something a non-ASSERTIONS build would have not seen.
  // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0
  // mode (which has its own special function for this; otherwise, all
  // the code is inside libc)
  var oldOut = out;
  var oldErr = err;
  var has = false;
  out = err = function(x) {
    has = true;
  }
  try { // it doesn't matter if it fails
    var flush = flush_NO_FILESYSTEM;
    if (flush) flush();
  } catch(e) {}
  out = oldOut;
  err = oldErr;
  if (has) {
    warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.');
    warnOnce('(this may also be due to not including full filesystem support - try building with -s FORCE_FILESYSTEM=1)');
  }
}

/** @param {boolean|number=} implicit */
function exit(status, implicit) {
  EXITSTATUS = status;

  checkUnflushedContent();

  if (keepRuntimeAlive()) {
    // if exit() was called, we may warn the user if the runtime isn't actually being shut down
    if (!implicit) {
      var msg = 'program exited (with status: ' + status + '), but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)';
      err(msg);
    }
  } else {
    exitRuntime();
  }

  procExit(status);
}

function procExit(code) {
  EXITSTATUS = code;
  if (!keepRuntimeAlive()) {
    if (Module['onExit']) Module['onExit'](code);
    ABORT = true;
  }
  quit_(code, new ExitStatus(code));
}

if (Module['preInit']) {
  if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']];
  while (Module['preInit'].length > 0) {
    Module['preInit'].pop()();
  }
}

// shouldRunNow refers to calling main(), not run().
var shouldRunNow = true;

if (Module['noInitialRun']) shouldRunNow = false;

run();

 

'Programming > wasm' 카테고리의 다른 글

wasm text format  (0) 2021.10.26
wasm text 와 binary 상호변환  (0) 2021.10.26
wasm from c, cpp  (0) 2021.10.24
wasm  (0) 2021.10.22
web assembly  (0) 2021.10.19
Posted by 구차니
Programming/wasm2021. 10. 24. 22:50

hello world 정도만 출력하는 예제를 해보는데

이걸로는 성능이 오르는지 알기 어렵지 않나?

최소한 외부 입력을 받고 리턴하는 것 정도는 찾아봐야 할 듯..

 

[링크 : https://developer.mozilla.org/ko/docs/WebAssembly/C_to_wasm]

[링크 : https://emscripten.org/docs/getting_started/downloads.html]

[링크 : https://wasmbyexample.dev/examples/hello-world/hello-world.c.en-us.html#]

'Programming > wasm' 카테고리의 다른 글

wasm text 와 binary 상호변환  (0) 2021.10.26
emcc wasm 빌드  (0) 2021.10.25
wasm  (0) 2021.10.22
web assembly  (0) 2021.10.19
wasm emcc  (0) 2018.10.24
Posted by 구차니
Programming/wasm2021. 10. 22. 19:35

웹 어셈. 이전에 볼 때는 도대체 왜 이런 쓸데없는 짓을 하는거야!! 했는데

알고보니 jsmpeg에 이미 쓴적이 있던 건 충격..

 

[링크 : https://d2.naver.com/helloworld/8257914]

 

[링크 : https://nodejs.dev/learn/nodejs-with-webassembly]

[링크 : https://nodejs.org/api/wasi.html]

[링크 : https://developers-kr.googleblog.com/2020/03/introducing-webassembly-backend-for-tensorflow-js.html?m=1]

 

'Programming > wasm' 카테고리의 다른 글

wasm text 와 binary 상호변환  (0) 2021.10.26
emcc wasm 빌드  (0) 2021.10.25
wasm from c, cpp  (0) 2021.10.24
web assembly  (0) 2021.10.19
wasm emcc  (0) 2018.10.24
Posted by 구차니
Programming/c# & winform2021. 10. 20. 14:13

abort는 그냥 죽어라! (보장은 안함) 라는 느낌이라면

join은 죽어줄때 까지 기다려 줄께~! 인데

코드 예제를 보면 abort는 서비스로 구성된 while 루프를 죽이고 있고

join은 일회성 쓰레드를 죽이는 예제로 설명되어 있는걸 보면..

맘편하게 abort로 죽어! 해야하려나?

 

[링크 : https://docs.microsoft.com/ko-kr/dotnet/standard/threading/destroying-threads]

 

쓰레드 보다는 간접적인 방법을 쓰라고 권장 -_ㅠ

.NET Framework 4부터 다중 스레딩을 사용하는 권장 방법은 TPL(작업 병렬 라이브러리)  PLINQ(병렬 LINQ)를 사용하는 것입니다. 자세한 내용은 병렬 프로그래밍을 참조하세요.

[링크 : https://docs.microsoft.com/ko-kr/dotnet/standard/threading/threads-and-threading]

 

 .NET Core는 Thread.Abort 메서드를 지원하지 않습니다. .NET Core에서 강제로 타사 코드 실행을 종료해야 하는 경우 별도의 프로세스에서 실행하고 Process.Kill를 사용합니다.

[링크 : https://docs.microsoft.com/ko-kr/dotnet/standard/threading/using-threads-and-threading]

 

obsolete를 사용되지 않는으로 해석해버렸군.

아무튼 abort는 .net 5.0 이후에서는 컴파일 경고가 뜬다고 하니

반강제적으로 TPL이나 PLINQ로 가게 만들려는 정책인듯?

이 메서드는 사용되지 않습니다. .NET 5.0 이상 버전에서이 메서드를 호출 하면 컴파일 타임 경고가 생성 됩니다. 이 메서드는 PlatformNotSupportedException 런타임에 .net 5.0 이상 및 .Net Core에서을 throw 합니다.

[링크 : https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.thread.abort?view=net-5.0]

 

using System;
using System.Threading;

public class Example
{
   static Thread thread1, thread2;
   
   public static void Main()
   {
      thread1 = new Thread(ThreadProc);
      thread1.Name = "Thread1";
      thread1.Start();
      
      thread2 = new Thread(ThreadProc);
      thread2.Name = "Thread2";
      thread2.Start();   
   }

   private static void ThreadProc()
   {
      Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
      if (Thread.CurrentThread.Name == "Thread1" && 
          thread2.ThreadState != ThreadState.Unstarted)
         if (thread2.Join(TimeSpan.FromSeconds(2)))
            Console.WriteLine("Thread2 has termminated.");
         else
            Console.WriteLine("The timeout has elapsed and Thread1 will resume.");   
      
      Thread.Sleep(4000);
      Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
      Console.WriteLine("Thread1: {0}", thread1.ThreadState);
      Console.WriteLine("Thread2: {0}\n", thread2.ThreadState);
   }
}

[링크 : https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.thread.join?view=net-5.0]

 

using System;
using System.Threading;

class Test
{
    public static void Main()
    {
        Thread newThread  = new Thread(new ThreadStart(TestMethod));
        newThread.Start();
        Thread.Sleep(1000);

        // Abort newThread.
        Console.WriteLine("Main aborting new thread.");
        newThread.Abort("Information from Main.");

        // Wait for the thread to terminate.
        newThread.Join();
        Console.WriteLine("New thread terminated - Main exiting.");
    }

    static void TestMethod()
    {
        try
        {
            while(true)
            {
                Console.WriteLine("New thread running.");
                Thread.Sleep(1000);
            }
        }
        catch(ThreadAbortException abortException)
        {
            Console.WriteLine((string)abortException.ExceptionState);
        }
    }
}

[링크 : https://docs.microsoft.com/ko-kr/dotnet/api/system.threading.thread.abort?view=net-5.0]

'Programming > c# & winform' 카테고리의 다른 글

c# postgresql 패키지  (0) 2022.04.27
winform udp 소켓 여러개  (0) 2021.10.26
Dispatcher / Control BeginInvoke()  (0) 2021.10.20
this.BeginInvoke()가 느려!  (0) 2021.10.20
크로스 스레드 작업이 잘못되었습니다  (0) 2021.10.19
Posted by 구차니
Programming/c# & winform2021. 10. 20. 12:21

'Programming > c# & winform' 카테고리의 다른 글

winform udp 소켓 여러개  (0) 2021.10.26
c# thread  (0) 2021.10.20
this.BeginInvoke()가 느려!  (0) 2021.10.20
크로스 스레드 작업이 잘못되었습니다  (0) 2021.10.19
winform 쓰레드와 소켓  (0) 2021.10.18
Posted by 구차니