From 273f9600d01e5ebf40e19ecc88be47605c96aa33 Mon Sep 17 00:00:00 2001 From: Ryan Hyun Choi Date: Wed, 18 May 2022 17:06:25 +0900 Subject: [PATCH] LWNode_Release_220518_3df4d0e Change-Id: Icaf6029947feecb707f9855ae829f7003c443557 Signed-off-by: Ryan Choi --- docs/spec.md | 138 +- lib/buffer.js | 12 - lib/internal/lwnode/memory.js | 306 + lib/internal/lwnode/setup.js | 8 +- lib/internal/process/per_thread.js | 2 +- lwnode/apps/service/package.json | 16 + lwnode/apps/service/src/index.ts | 33 + lwnode/apps/service/src/service.ts | 209 + lwnode/apps/sqlite3/.eslintrc.js | 13 + lwnode/apps/sqlite3/.gitignore | 15 + lwnode/apps/sqlite3/CMakeLists.txt | 76 + lwnode/apps/sqlite3/LICENSE | 177 + lwnode/apps/sqlite3/LICENSE.BOEHM-GC | 30 + lwnode/apps/sqlite3/LICENSE.BSD-3-Clause | 9 + lwnode/apps/sqlite3/LICENSE.MIT | 20 + lwnode/apps/sqlite3/LICENSE.NodeJS | 1072 + lwnode/apps/sqlite3/MAINTAINERS.md | 9 + lwnode/apps/sqlite3/README.md | 96 + lwnode/apps/sqlite3/build/build.sh | 49 + lwnode/apps/sqlite3/build/install.sh | 19 + lwnode/apps/sqlite3/build/post.sh | 25 + lwnode/apps/sqlite3/build/sqlite3.manifest | 5 + .../apps/sqlite3/deps/include/js_native_api.h | 561 + .../deps/include/js_native_api_types.h | 160 + .../deps/include/napi-inl.deprecated.h | 192 + lwnode/apps/sqlite3/deps/include/napi-inl.h | 5671 +++ lwnode/apps/sqlite3/deps/include/napi.h | 2727 ++ lwnode/apps/sqlite3/deps/include/node_api.h | 268 + .../sqlite3/deps/include/node_api_types.h | 50 + .../sqlite3/deps/include/node_internals.h | 403 + lwnode/apps/sqlite3/deps/include/util-inl.h | 38 + lwnode/apps/sqlite3/deps/include/util.h | 7 + lwnode/apps/sqlite3/deps/include/uv.h | 1824 + lwnode/apps/sqlite3/deps/include/uv/aix.h | 32 + .../sqlite3/deps/include/uv/android-ifaddrs.h | 54 + lwnode/apps/sqlite3/deps/include/uv/bsd.h | 34 + lwnode/apps/sqlite3/deps/include/uv/darwin.h | 61 + lwnode/apps/sqlite3/deps/include/uv/errno.h | 448 + lwnode/apps/sqlite3/deps/include/uv/linux.h | 34 + lwnode/apps/sqlite3/deps/include/uv/os390.h | 33 + lwnode/apps/sqlite3/deps/include/uv/posix.h | 31 + .../sqlite3/deps/include/uv/stdint-msvc2008.h | 247 + lwnode/apps/sqlite3/deps/include/uv/sunos.h | 44 + .../apps/sqlite3/deps/include/uv/threadpool.h | 37 + lwnode/apps/sqlite3/deps/include/uv/tree.h | 768 + lwnode/apps/sqlite3/deps/include/uv/unix.h | 507 + lwnode/apps/sqlite3/deps/include/uv/version.h | 43 + lwnode/apps/sqlite3/deps/include/uv/win.h | 691 + lwnode/apps/sqlite3/deps/lwnode/lwnode | Bin 0 -> 24003480 bytes lwnode/apps/sqlite3/jsconfig.json | 5 + lwnode/apps/sqlite3/jsdoc.json | 25 + lwnode/apps/sqlite3/package-lock.json | 12969 +++++++ lwnode/apps/sqlite3/package.json | 78 + .../packaging/node-sqlite3-ep.manifest | 5 + .../sqlite3/packaging/node-sqlite3-ep.service | 12 + .../sqlite3/packaging/node-sqlite3-ep.spec | 168 + lwnode/apps/sqlite3/sample/config.xml | 12 + lwnode/apps/sqlite3/sample/icon.png | Bin 0 -> 25897 bytes lwnode/apps/sqlite3/sample/index.html | 69 + lwnode/apps/sqlite3/sample/index_node.js | 69 + lwnode/apps/sqlite3/sample/package.json | 15 + .../apps/sqlite3/sample/script/lib/mocha.css | 325 + .../apps/sqlite3/sample/script/lib/mocha.js | 29734 ++++++++++++++++ .../sqlite3/sample/script/lib/mocha.js.map | 1 + lwnode/apps/sqlite3/sample/styles/style.css | 28 + lwnode/apps/sqlite3/sample/test.html | 28 + lwnode/apps/sqlite3/sample/test.js | 154 + lwnode/apps/sqlite3/sample/tizen-manifest.xml | 10 + .../apps/sqlite3/src/backend/api/api.ctrl.js | 57 + .../apps/sqlite3/src/backend/api/auth.ctrl.js | 143 + lwnode/apps/sqlite3/src/backend/api/index.js | 41 + .../sqlite3/src/backend/api/service.ctrl.js | 75 + lwnode/apps/sqlite3/src/backend/config.ts | 55 + .../apps/sqlite3/src/backend/db/Services.ts | 75 + lwnode/apps/sqlite3/src/backend/db/Users.ts | 121 + lwnode/apps/sqlite3/src/backend/db/dao.ts | 32 + lwnode/apps/sqlite3/src/backend/index.ts | 214 + lwnode/apps/sqlite3/src/backend/lib/log.ts | 39 + .../sqlite3/src/backend/lib/middleware/jwt.ts | 48 + .../apps/sqlite3/src/backend/lib/response.ts | 71 + lwnode/apps/sqlite3/src/backend/lib/rpc.ts | 140 + .../apps/sqlite3/src/backend/lib/rpcerror.ts | 25 + .../sqlite3/src/backend/lib/rpcinspector.ts | 85 + .../apps/sqlite3/src/backend/lib/services.ts | 145 + lwnode/apps/sqlite3/src/backend/lib/socket.ts | 77 + .../src/backend/lib/sqlite3/database.ts | 721 + .../sqlite3/src/backend/lib/sqlite3/error.ts | 61 + .../sqlite3/src/backend/lib/sqlite3/index.js | 18 + .../sqlite3/src/backend/lib/sqlite3/packet.ts | 96 + .../src/backend/lib/sqlite3/statement.ts | 341 + lwnode/apps/sqlite3/src/backend/lib/token.ts | 33 + lwnode/apps/sqlite3/src/backend/lib/utils.ts | 272 + .../apps/sqlite3/src/backend/lib/variables.js | 25 + lwnode/apps/sqlite3/src/backend/tsconfig.json | 71 + lwnode/apps/sqlite3/src/frontend/.eslintrc.js | 13 + lwnode/apps/sqlite3/src/frontend/.gitignore | 9 + lwnode/apps/sqlite3/src/frontend/jsdoc.json | 25 + .../apps/sqlite3/src/frontend/lib/database.ts | 561 + .../apps/sqlite3/src/frontend/lib/socket.ts | 306 + .../apps/sqlite3/src/frontend/lib/sqlite3.ts | 210 + .../sqlite3/src/frontend/lib/statement.ts | 378 + .../sqlite3/src/frontend/lib/tsconfig.json | 71 + lwnode/apps/sqlite3/src/frontend/lib/utils.ts | 195 + .../sqlite3/src/frontend/lib/variables.ts | 54 + lwnode/apps/sqlite3/tools/README.md | 9 + lwnode/apps/sqlite3/tools/buildlib.sh | 19 + lwnode/apps/sqlite3/tools/buildtpk.sh | 81 + lwnode/apps/sqlite3/tools/buildwgt.sh | 77 + ...istributor-partner-manufacturer-signer.p12 | Bin 0 -> 2485 bytes .../tools/certificates/tizen_author.p12 | Bin 0 -> 2742 bytes .../apps/sqlite3/tools/install-build-tools.sh | 53 + lwnode/apps/sqlite3/tools/release.sh | 81 + .../tools/removeNPMAbsolutePaths/LICENSE | 21 + .../bin/removeNPMAbsolutePaths | 30 + .../tools/removeNPMAbsolutePaths/src/cli.js | 51 + .../tools/removeNPMAbsolutePaths/src/errno.js | 310 + .../src/removeNPMAbsolutePaths.js | 137 + lwnode/apps/sqlite3/tools/run-verification.sh | 4 + lwnode/apps/sqlite3/tools/sqlite3-filter.txt | 59 + lwnode/build-cctest.sh | 34 +- lwnode/build-modules.sh | 10 + .../deps/escargot/build/escargot.cmake | 4 +- .../deps/escargot/src/api/EscargotPublic.cpp | 291 +- .../deps/escargot/src/api/EscargotPublic.h | 64 +- .../escargot/src/builtins/BuiltinArray.cpp | 2 +- .../src/builtins/BuiltinArrayBuffer.cpp | 2 +- .../builtins/BuiltinAsyncFromSyncIterator.cpp | 2 +- .../src/builtins/BuiltinAsyncFunction.cpp | 4 +- .../BuiltinAsyncGeneratorFunction.cpp | 6 +- .../escargot/src/builtins/BuiltinAtomics.cpp | 2 +- .../escargot/src/builtins/BuiltinBigInt.cpp | 2 +- .../escargot/src/builtins/BuiltinDate.cpp | 2 +- .../escargot/src/builtins/BuiltinError.cpp | 4 +- .../builtins/BuiltinFinalizationRegistry.cpp | 2 +- .../escargot/src/builtins/BuiltinFunction.cpp | 2 +- .../src/builtins/BuiltinGeneratorFunction.cpp | 4 +- .../deps/escargot/src/builtins/BuiltinMap.cpp | 2 +- .../escargot/src/builtins/BuiltinPromise.cpp | 2 +- .../escargot/src/builtins/BuiltinRegExp.cpp | 4 +- .../deps/escargot/src/builtins/BuiltinSet.cpp | 4 +- .../src/builtins/BuiltinSharedArrayBuffer.cpp | 2 +- .../escargot/src/builtins/BuiltinString.cpp | 2 +- .../escargot/src/builtins/BuiltinSymbol.cpp | 2 +- .../escargot/src/builtins/BuiltinWeakMap.cpp | 2 +- .../escargot/src/builtins/BuiltinWeakRef.cpp | 2 +- .../escargot/src/builtins/BuiltinWeakSet.cpp | 2 +- .../src/codecache/CodeCacheReaderWriter.cpp | 16 +- .../deps/escargot/src/debugger/Debugger.cpp | 17 +- .../deps/escargot/src/debugger/Debugger.h | 8 +- .../escargot/src/debugger/DebuggerTcp.cpp | 2 +- .../escargot/src/heap/CustomAllocator.cpp | 27 + .../deps/escargot/src/heap/CustomAllocator.h | 1 + .../escargot/src/interpreter/ByteCode.cpp | 42 +- .../deps/escargot/src/interpreter/ByteCode.h | 106 +- .../src/interpreter/ByteCodeGenerator.cpp | 65 +- .../src/interpreter/ByteCodeGenerator.h | 7 +- .../src/interpreter/ByteCodeInterpreter.cpp | 403 +- .../src/interpreter/ByteCodeInterpreter.h | 4 +- .../deps/escargot/src/parser/CodeBlock.cpp | 7 +- .../deps/escargot/src/parser/CodeBlock.h | 8 +- .../deps/escargot/src/parser/Script.cpp | 16 +- .../deps/escargot/src/parser/Script.h | 10 +- .../deps/escargot/src/parser/ScriptParser.cpp | 31 +- .../deps/escargot/src/parser/ScriptParser.h | 8 +- .../src/parser/ast/ForInOfStatementNode.h | 28 +- .../escargot/src/parser/ast/FunctionNode.h | 30 + .../src/parser/esprima_cpp/esprima.cpp | 9 +- .../deps/escargot/src/runtime/ArrayBuffer.h | 28 +- .../src/runtime/ArrayBufferObject.cpp | 8 +- .../deps/escargot/src/runtime/ArrayObject.cpp | 21 +- .../deps/escargot/src/runtime/ArrayObject.h | 17 +- .../deps/escargot/src/runtime/Context.cpp | 5 + .../deps/escargot/src/runtime/EncodedValue.h | 148 +- .../escargot/src/runtime/EncodedValueData.h | 2 + .../escargot/src/runtime/EnumerateObject.cpp | 46 +- .../escargot/src/runtime/EnumerateObject.h | 2 +- .../escargot/src/runtime/EnvironmentRecord.h | 5 +- .../escargot/src/runtime/FunctionObject.cpp | 29 +- .../escargot/src/runtime/FunctionObject.h | 7 +- .../src/runtime/FunctionObjectInlines.h | 30 +- .../deps/escargot/src/runtime/Global.cpp | 4 +- .../escargot/src/runtime/GlobalObject.cpp | 12 +- .../deps/escargot/src/runtime/GlobalObject.h | 5 +- .../deps/escargot/src/runtime/Object.cpp | 27 +- .../deps/escargot/src/runtime/Object.h | 9 +- .../escargot/src/runtime/PointerValue.cpp | 3 +- .../deps/escargot/src/runtime/PointerValue.h | 22 +- .../escargot/src/runtime/PrototypeObject.cpp | 49 + .../escargot/src/runtime/PrototypeObject.h | 51 + .../escargot/src/runtime/RegExpObject.cpp | 2 - .../deps/escargot/src/runtime/SandBox.cpp | 4 +- .../ScriptAsyncGeneratorFunctionObject.cpp | 2 +- .../src/runtime/ScriptFunctionObject.cpp | 7 +- .../runtime/ScriptGeneratorFunctionObject.cpp | 2 +- .../src/runtime/ScriptSimpleFunctionObject.h | 94 +- .../src/runtime/SharedArrayBufferObject.cpp | 8 +- .../deps/escargot/src/runtime/Template.h | 8 +- .../deps/escargot/src/runtime/VMInstance.cpp | 2 + .../deps/escargot/src/runtime/VMInstance.h | 31 +- .../deps/escargot/src/runtime/Value.h | 2 + .../deps/escargot/src/runtime/ValueInlines.h | 7 + .../deps/escargot/src/shell/Shell.cpp | 1 - .../node-bindings/include/node_bindings.h | 3 + .../src/gmainloop_node_bindings.cc | 11 + lwnode/code/escargotshim/escargotshim.gyp | 2 +- .../code/escargotshim/include/lwnode/lwnode.h | 6 +- lwnode/code/escargotshim/src/api-data.cc | 41 +- .../code/escargotshim/src/api-environment.cc | 23 +- lwnode/code/escargotshim/src/api-handles.cc | 20 +- lwnode/code/escargotshim/src/api-scripts.cc | 59 +- lwnode/code/escargotshim/src/api.cc | 87 +- lwnode/code/escargotshim/src/api.h | 2 +- .../src/api/arraybuffer-allocator.h | 2 +- lwnode/code/escargotshim/src/api/context.cc | 80 +- lwnode/code/escargotshim/src/api/context.h | 7 + lwnode/code/escargotshim/src/api/engine.h | 2 +- lwnode/code/escargotshim/src/api/es-helper.cc | 62 +- lwnode/code/escargotshim/src/api/es-helper.h | 34 +- lwnode/code/escargotshim/src/api/extra-data.h | 41 +- lwnode/code/escargotshim/src/api/function.cc | 3 +- .../escargotshim/src/api/global-handles.cc | 2 +- .../escargotshim/src/api/global-handles.h | 2 +- lwnode/code/escargotshim/src/api/global.cc | 71 + lwnode/code/escargotshim/src/api/global.h | 8 + lwnode/code/escargotshim/src/api/handle.cc | 163 +- lwnode/code/escargotshim/src/api/handle.h | 117 +- .../code/escargotshim/src/api/handlescope.cc | 14 + .../code/escargotshim/src/api/handlescope.h | 24 +- lwnode/code/escargotshim/src/api/isolate.cc | 18 +- lwnode/code/escargotshim/src/api/isolate.h | 13 +- .../code/escargotshim/src/api/stack-trace.cc | 209 +- .../code/escargotshim/src/api/stack-trace.h | 48 +- lwnode/code/escargotshim/src/api/utils.h | 2 +- .../escargotshim/src/api/utils/gc-container.h | 14 +- .../src/api/utils/{gc.cc => gc-util.cc} | 2 +- .../src/api/utils/{gc.h => gc-util.h} | 2 +- .../src/api/utils/logger/flags.cc | 54 +- .../escargotshim/src/api/utils/logger/flags.h | 16 +- lwnode/code/escargotshim/src/api/utils/misc.h | 2 +- .../api/utils/{gc-vector.h => sf-vector.h} | 31 +- lwnode/code/escargotshim/src/base.h | 2 +- .../escargotshim/src/execution/v8threads.h | 2 +- lwnode/code/escargotshim/src/lwnode/lwnode.cc | 31 + lwnode/modules/device-api/CMakeLists.txt | 26 + .../device-api/src/DeviceAPIModule.cpp | 53 + lwnode/modules/device-api/src/Extension.cpp | 317 + lwnode/modules/device-api/src/Extension.h | 253 + .../device-api/src/ExtensionAdapter.cpp | 368 + .../modules/device-api/src/ExtensionAdapter.h | 101 + .../device-api/src/ExtensionManager.cpp | 183 + .../modules/device-api/src/ExtensionManager.h | 54 + .../device-api/src/TizenDeviceAPIBase.h | 70 + .../src/TizenDeviceAPILoaderForEscargot.cpp | 921 + .../src/TizenDeviceAPILoaderForEscargot.h | 187 + lwnode/modules/device-api/src/XW_Extension.h | 223 + .../device-api/src/XW_Extension_Data.h | 48 + .../device-api/src/XW_Extension_EntryPoints.h | 47 + .../device-api/src/XW_Extension_Permissions.h | 39 + .../device-api/src/XW_Extension_Runtime.h | 38 + .../device-api/src/XW_Extension_SyncMessage.h | 51 + .../device-api/src/wrt-common-native-plugin.h | 43 + lwnode/modules/gmain-loop/CMakeLists.txt | 16 + .../modules/gmain-loop/sample/hello-world.js | 2 + lwnode/modules/gmain-loop/src/gmain-loop.cc | 31 + lwnode/pkgs/.clang-format | 6 + lwnode/pkgs/.gitignore | 113 + lwnode/pkgs/README.md | 1 + lwnode/pkgs/apps/beagle/.gitignore | 7 + .../apps/beagle/__tests__/greeter.test.ts | 6 + lwnode/pkgs/apps/beagle/package-lock.json | 6916 ++++ lwnode/pkgs/apps/beagle/package.json | 68 + lwnode/pkgs/apps/beagle/src/core/index.ts | 2 + .../apps/beagle/src/core/service-broker.ts | 67 + lwnode/pkgs/apps/beagle/src/core/service.ts | 68 + lwnode/pkgs/apps/beagle/src/index.ts | 23 + lwnode/pkgs/apps/beagle/src/lib/utils.ts | 50 + lwnode/pkgs/apps/beagle/tsconfig.json | 49 + lwnode/pkgs/apps/beagle/tslint.json | 7 + lwnode/pkgs/examples/README.md | 18 + lwnode/pkgs/examples/async-work/.gitignore | 2 + .../pkgs/examples/async-work/CMakeLists.txt | 11 + lwnode/pkgs/examples/async-work/async-work.cc | 102 + .../examples/async-work/include/node_api.h | 489 + .../async-work/include/node_api_types.h | 105 + lwnode/pkgs/examples/async-work/package.json | 17 + .../async-work/packaging/async-work.manifest | 5 + .../async-work/packaging/async-work.spec | 58 + .../examples/async-work/packaging/gbs.conf | 25 + lwnode/pkgs/examples/async-work/sample.js | 28 + .../examples/hello-world-node/CMakeLists.txt | 17 + .../pkgs/examples/hello-world-node/README.md | 8 + .../pkgs/examples/hello-world-node/hello.cc | 41 + .../pkgs/examples/hello-world-node/hello.js | 21 + .../hello-world-node/include/node_api.h | 489 + .../hello-world-node/include/node_api_types.h | 105 + .../examples/hello-world-node/package.json | 17 + .../hello-world-node/packaging/gbs.tv.conf | 54 + .../packaging/node-escargot-addon.manifest | 5 + .../packaging/node-escargot-addon.spec | 46 + lwnode/pkgs/modules/app/.gitignore | 2 + lwnode/pkgs/modules/app/CMakeLists.txt | 15 + lwnode/pkgs/modules/app/include/common.h | 76 + lwnode/pkgs/modules/app/include/node_api.h | 489 + .../pkgs/modules/app/include/node_api_types.h | 105 + lwnode/pkgs/modules/app/package.json | 17 + .../modules/app/packaging/app-node.manifest | 5 + .../pkgs/modules/app/packaging/app-node.spec | 60 + lwnode/pkgs/modules/app/packaging/gbs.conf | 25 + lwnode/pkgs/modules/app/src/app.cc | 31 + lwnode/pkgs/modules/app/src/common.cc | 94 + .../pkgs/modules/audio-player-node/.gitignore | 2 + .../modules/audio-player-node/CMakeLists.txt | 23 + .../audio-player-node/include/common.h | 76 + .../audio-player-node/include/node_api.h | 489 + .../include/node_api_types.h | 105 + .../pkgs/modules/audio-player-node/index.js | 31 + .../modules/audio-player-node/package.json | 20 + .../packaging/audio-player-node.manifest | 5 + .../packaging/audio-player-node.spec | 61 + .../audio-player-node/packaging/gbs.conf | 25 + .../audio-player-node/src/audio_player.cc | 36 + .../audio-player-node/src/audio_player.h | 74 + .../src/audio_player_module.cc | 114 + .../src/audio_player_sample.cc | 56 + .../src/audio_player_sample.h | 36 + .../audio-player-node/src/bridge/bridge.h | 570 + .../src/bridge/bridge_async.h | 38 + .../audio-player-node/src/bridge/service.cc | 122 + .../audio-player-node/src/bridge/service.h | 13 + .../audio-player-node/src/tizen_audio_io.cc | 93 + .../src/tizen_audio_player.cc | 200 + lwnode/pkgs/template/rpm/CMakeLists.txt | 12 + lwnode/pkgs/template/rpm/README.md | 34 + lwnode/pkgs/template/rpm/include/node_api.h | 489 + .../template/rpm/include/node_api_types.h | 105 + .../pkgs/template/rpm/include/node_escargot.h | 39 + lwnode/pkgs/template/rpm/lib/index.js | 4 + .../rpm/packaging/helloworld.manifest | 5 + .../template/rpm/packaging/helloworld.service | 11 + .../template/rpm/packaging/helloworld.spec | 110 + lwnode/pkgs/template/rpm/src/main.cc | 28 + lwnode/pkgs/template/tpk/.gitignore | 4 + lwnode/pkgs/template/tpk/CMakeLists.txt | 12 + lwnode/pkgs/template/tpk/README.md | 39 + lwnode/pkgs/template/tpk/include/node_api.h | 489 + .../template/tpk/include/node_api_types.h | 105 + .../pkgs/template/tpk/include/node_escargot.h | 39 + lwnode/pkgs/template/tpk/index.js | 1 + lwnode/pkgs/template/tpk/lib/helloworld.js | 4 + lwnode/pkgs/template/tpk/package.json | 14 + .../template/tpk/packaging/helloworld.spec | 96 + ...istributor-partner-manufacturer-signer.p12 | Bin 0 -> 2485 bytes .../template/tpk/packaging/tizen_author.p12 | Bin 0 -> 2742 bytes lwnode/pkgs/template/tpk/packaging/x.manifest | 5 + lwnode/pkgs/template/tpk/src/main.cc | 28 + lwnode/pkgs/template/tpk/tizen-manifest.xml | 11 + node.gyp | 1 + packaging/lwnode.spec | 60 +- src/lwnode_api.h | 19 + src/node.cc | 4 +- src/node_api.cc | 12 + src/node_main_lw_runner-inl.h | 25 +- 362 files changed, 86214 insertions(+), 1000 deletions(-) create mode 100644 lib/internal/lwnode/memory.js create mode 100644 lwnode/apps/service/package.json create mode 100644 lwnode/apps/service/src/index.ts create mode 100644 lwnode/apps/service/src/service.ts create mode 100644 lwnode/apps/sqlite3/.eslintrc.js create mode 100644 lwnode/apps/sqlite3/.gitignore create mode 100644 lwnode/apps/sqlite3/CMakeLists.txt create mode 100644 lwnode/apps/sqlite3/LICENSE create mode 100644 lwnode/apps/sqlite3/LICENSE.BOEHM-GC create mode 100644 lwnode/apps/sqlite3/LICENSE.BSD-3-Clause create mode 100644 lwnode/apps/sqlite3/LICENSE.MIT create mode 100644 lwnode/apps/sqlite3/LICENSE.NodeJS create mode 100644 lwnode/apps/sqlite3/MAINTAINERS.md create mode 100644 lwnode/apps/sqlite3/README.md create mode 100755 lwnode/apps/sqlite3/build/build.sh create mode 100755 lwnode/apps/sqlite3/build/install.sh create mode 100755 lwnode/apps/sqlite3/build/post.sh create mode 100644 lwnode/apps/sqlite3/build/sqlite3.manifest create mode 100644 lwnode/apps/sqlite3/deps/include/js_native_api.h create mode 100644 lwnode/apps/sqlite3/deps/include/js_native_api_types.h create mode 100644 lwnode/apps/sqlite3/deps/include/napi-inl.deprecated.h create mode 100644 lwnode/apps/sqlite3/deps/include/napi-inl.h create mode 100644 lwnode/apps/sqlite3/deps/include/napi.h create mode 100644 lwnode/apps/sqlite3/deps/include/node_api.h create mode 100644 lwnode/apps/sqlite3/deps/include/node_api_types.h create mode 100644 lwnode/apps/sqlite3/deps/include/node_internals.h create mode 100644 lwnode/apps/sqlite3/deps/include/util-inl.h create mode 100644 lwnode/apps/sqlite3/deps/include/util.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/aix.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/android-ifaddrs.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/bsd.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/darwin.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/errno.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/linux.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/os390.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/posix.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/stdint-msvc2008.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/sunos.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/threadpool.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/tree.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/unix.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/version.h create mode 100644 lwnode/apps/sqlite3/deps/include/uv/win.h create mode 100755 lwnode/apps/sqlite3/deps/lwnode/lwnode create mode 100644 lwnode/apps/sqlite3/jsconfig.json create mode 100644 lwnode/apps/sqlite3/jsdoc.json create mode 100644 lwnode/apps/sqlite3/package-lock.json create mode 100644 lwnode/apps/sqlite3/package.json create mode 100644 lwnode/apps/sqlite3/packaging/node-sqlite3-ep.manifest create mode 100644 lwnode/apps/sqlite3/packaging/node-sqlite3-ep.service create mode 100644 lwnode/apps/sqlite3/packaging/node-sqlite3-ep.spec create mode 100644 lwnode/apps/sqlite3/sample/config.xml create mode 100644 lwnode/apps/sqlite3/sample/icon.png create mode 100644 lwnode/apps/sqlite3/sample/index.html create mode 100644 lwnode/apps/sqlite3/sample/index_node.js create mode 100644 lwnode/apps/sqlite3/sample/package.json create mode 100644 lwnode/apps/sqlite3/sample/script/lib/mocha.css create mode 100644 lwnode/apps/sqlite3/sample/script/lib/mocha.js create mode 100644 lwnode/apps/sqlite3/sample/script/lib/mocha.js.map create mode 100644 lwnode/apps/sqlite3/sample/styles/style.css create mode 100644 lwnode/apps/sqlite3/sample/test.html create mode 100644 lwnode/apps/sqlite3/sample/test.js create mode 100644 lwnode/apps/sqlite3/sample/tizen-manifest.xml create mode 100644 lwnode/apps/sqlite3/src/backend/api/api.ctrl.js create mode 100644 lwnode/apps/sqlite3/src/backend/api/auth.ctrl.js create mode 100644 lwnode/apps/sqlite3/src/backend/api/index.js create mode 100644 lwnode/apps/sqlite3/src/backend/api/service.ctrl.js create mode 100644 lwnode/apps/sqlite3/src/backend/config.ts create mode 100644 lwnode/apps/sqlite3/src/backend/db/Services.ts create mode 100644 lwnode/apps/sqlite3/src/backend/db/Users.ts create mode 100644 lwnode/apps/sqlite3/src/backend/db/dao.ts create mode 100644 lwnode/apps/sqlite3/src/backend/index.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/log.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/middleware/jwt.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/response.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/rpc.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/rpcerror.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/rpcinspector.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/services.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/socket.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/sqlite3/database.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/sqlite3/error.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/sqlite3/index.js create mode 100644 lwnode/apps/sqlite3/src/backend/lib/sqlite3/packet.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/sqlite3/statement.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/token.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/utils.ts create mode 100644 lwnode/apps/sqlite3/src/backend/lib/variables.js create mode 100644 lwnode/apps/sqlite3/src/backend/tsconfig.json create mode 100644 lwnode/apps/sqlite3/src/frontend/.eslintrc.js create mode 100644 lwnode/apps/sqlite3/src/frontend/.gitignore create mode 100644 lwnode/apps/sqlite3/src/frontend/jsdoc.json create mode 100644 lwnode/apps/sqlite3/src/frontend/lib/database.ts create mode 100644 lwnode/apps/sqlite3/src/frontend/lib/socket.ts create mode 100644 lwnode/apps/sqlite3/src/frontend/lib/sqlite3.ts create mode 100644 lwnode/apps/sqlite3/src/frontend/lib/statement.ts create mode 100644 lwnode/apps/sqlite3/src/frontend/lib/tsconfig.json create mode 100644 lwnode/apps/sqlite3/src/frontend/lib/utils.ts create mode 100644 lwnode/apps/sqlite3/src/frontend/lib/variables.ts create mode 100644 lwnode/apps/sqlite3/tools/README.md create mode 100755 lwnode/apps/sqlite3/tools/buildlib.sh create mode 100755 lwnode/apps/sqlite3/tools/buildtpk.sh create mode 100755 lwnode/apps/sqlite3/tools/buildwgt.sh create mode 100644 lwnode/apps/sqlite3/tools/certificates/tizen-distributor-partner-manufacturer-signer.p12 create mode 100644 lwnode/apps/sqlite3/tools/certificates/tizen_author.p12 create mode 100755 lwnode/apps/sqlite3/tools/install-build-tools.sh create mode 100755 lwnode/apps/sqlite3/tools/release.sh create mode 100644 lwnode/apps/sqlite3/tools/removeNPMAbsolutePaths/LICENSE create mode 100755 lwnode/apps/sqlite3/tools/removeNPMAbsolutePaths/bin/removeNPMAbsolutePaths create mode 100644 lwnode/apps/sqlite3/tools/removeNPMAbsolutePaths/src/cli.js create mode 100644 lwnode/apps/sqlite3/tools/removeNPMAbsolutePaths/src/errno.js create mode 100644 lwnode/apps/sqlite3/tools/removeNPMAbsolutePaths/src/removeNPMAbsolutePaths.js create mode 100755 lwnode/apps/sqlite3/tools/run-verification.sh create mode 100644 lwnode/apps/sqlite3/tools/sqlite3-filter.txt create mode 100644 lwnode/code/escargotshim/deps/escargot/src/runtime/PrototypeObject.cpp create mode 100644 lwnode/code/escargotshim/deps/escargot/src/runtime/PrototypeObject.h rename lwnode/code/escargotshim/src/api/utils/{gc.cc => gc-util.cc} (99%) rename lwnode/code/escargotshim/src/api/utils/{gc.h => gc-util.h} (99%) rename lwnode/code/escargotshim/src/api/utils/{gc-vector.h => sf-vector.h} (96%) create mode 100644 lwnode/modules/device-api/CMakeLists.txt create mode 100644 lwnode/modules/device-api/src/DeviceAPIModule.cpp create mode 100644 lwnode/modules/device-api/src/Extension.cpp create mode 100644 lwnode/modules/device-api/src/Extension.h create mode 100644 lwnode/modules/device-api/src/ExtensionAdapter.cpp create mode 100644 lwnode/modules/device-api/src/ExtensionAdapter.h create mode 100644 lwnode/modules/device-api/src/ExtensionManager.cpp create mode 100644 lwnode/modules/device-api/src/ExtensionManager.h create mode 100644 lwnode/modules/device-api/src/TizenDeviceAPIBase.h create mode 100644 lwnode/modules/device-api/src/TizenDeviceAPILoaderForEscargot.cpp create mode 100644 lwnode/modules/device-api/src/TizenDeviceAPILoaderForEscargot.h create mode 100644 lwnode/modules/device-api/src/XW_Extension.h create mode 100644 lwnode/modules/device-api/src/XW_Extension_Data.h create mode 100644 lwnode/modules/device-api/src/XW_Extension_EntryPoints.h create mode 100644 lwnode/modules/device-api/src/XW_Extension_Permissions.h create mode 100644 lwnode/modules/device-api/src/XW_Extension_Runtime.h create mode 100644 lwnode/modules/device-api/src/XW_Extension_SyncMessage.h create mode 100644 lwnode/modules/device-api/src/wrt-common-native-plugin.h create mode 100644 lwnode/modules/gmain-loop/CMakeLists.txt create mode 100644 lwnode/modules/gmain-loop/sample/hello-world.js create mode 100644 lwnode/modules/gmain-loop/src/gmain-loop.cc create mode 100644 lwnode/pkgs/.clang-format create mode 100644 lwnode/pkgs/.gitignore create mode 100644 lwnode/pkgs/README.md create mode 100644 lwnode/pkgs/apps/beagle/.gitignore create mode 100644 lwnode/pkgs/apps/beagle/__tests__/greeter.test.ts create mode 100644 lwnode/pkgs/apps/beagle/package-lock.json create mode 100644 lwnode/pkgs/apps/beagle/package.json create mode 100644 lwnode/pkgs/apps/beagle/src/core/index.ts create mode 100644 lwnode/pkgs/apps/beagle/src/core/service-broker.ts create mode 100644 lwnode/pkgs/apps/beagle/src/core/service.ts create mode 100644 lwnode/pkgs/apps/beagle/src/index.ts create mode 100644 lwnode/pkgs/apps/beagle/src/lib/utils.ts create mode 100644 lwnode/pkgs/apps/beagle/tsconfig.json create mode 100644 lwnode/pkgs/apps/beagle/tslint.json create mode 100644 lwnode/pkgs/examples/README.md create mode 100644 lwnode/pkgs/examples/async-work/.gitignore create mode 100644 lwnode/pkgs/examples/async-work/CMakeLists.txt create mode 100644 lwnode/pkgs/examples/async-work/async-work.cc create mode 100644 lwnode/pkgs/examples/async-work/include/node_api.h create mode 100644 lwnode/pkgs/examples/async-work/include/node_api_types.h create mode 100644 lwnode/pkgs/examples/async-work/package.json create mode 100644 lwnode/pkgs/examples/async-work/packaging/async-work.manifest create mode 100644 lwnode/pkgs/examples/async-work/packaging/async-work.spec create mode 100644 lwnode/pkgs/examples/async-work/packaging/gbs.conf create mode 100644 lwnode/pkgs/examples/async-work/sample.js create mode 100644 lwnode/pkgs/examples/hello-world-node/CMakeLists.txt create mode 100644 lwnode/pkgs/examples/hello-world-node/README.md create mode 100644 lwnode/pkgs/examples/hello-world-node/hello.cc create mode 100644 lwnode/pkgs/examples/hello-world-node/hello.js create mode 100644 lwnode/pkgs/examples/hello-world-node/include/node_api.h create mode 100644 lwnode/pkgs/examples/hello-world-node/include/node_api_types.h create mode 100644 lwnode/pkgs/examples/hello-world-node/package.json create mode 100644 lwnode/pkgs/examples/hello-world-node/packaging/gbs.tv.conf create mode 100644 lwnode/pkgs/examples/hello-world-node/packaging/node-escargot-addon.manifest create mode 100644 lwnode/pkgs/examples/hello-world-node/packaging/node-escargot-addon.spec create mode 100644 lwnode/pkgs/modules/app/.gitignore create mode 100644 lwnode/pkgs/modules/app/CMakeLists.txt create mode 100644 lwnode/pkgs/modules/app/include/common.h create mode 100644 lwnode/pkgs/modules/app/include/node_api.h create mode 100644 lwnode/pkgs/modules/app/include/node_api_types.h create mode 100644 lwnode/pkgs/modules/app/package.json create mode 100644 lwnode/pkgs/modules/app/packaging/app-node.manifest create mode 100644 lwnode/pkgs/modules/app/packaging/app-node.spec create mode 100644 lwnode/pkgs/modules/app/packaging/gbs.conf create mode 100644 lwnode/pkgs/modules/app/src/app.cc create mode 100644 lwnode/pkgs/modules/app/src/common.cc create mode 100644 lwnode/pkgs/modules/audio-player-node/.gitignore create mode 100644 lwnode/pkgs/modules/audio-player-node/CMakeLists.txt create mode 100644 lwnode/pkgs/modules/audio-player-node/include/common.h create mode 100644 lwnode/pkgs/modules/audio-player-node/include/node_api.h create mode 100644 lwnode/pkgs/modules/audio-player-node/include/node_api_types.h create mode 100644 lwnode/pkgs/modules/audio-player-node/index.js create mode 100644 lwnode/pkgs/modules/audio-player-node/package.json create mode 100644 lwnode/pkgs/modules/audio-player-node/packaging/audio-player-node.manifest create mode 100644 lwnode/pkgs/modules/audio-player-node/packaging/audio-player-node.spec create mode 100644 lwnode/pkgs/modules/audio-player-node/packaging/gbs.conf create mode 100644 lwnode/pkgs/modules/audio-player-node/src/audio_player.cc create mode 100644 lwnode/pkgs/modules/audio-player-node/src/audio_player.h create mode 100644 lwnode/pkgs/modules/audio-player-node/src/audio_player_module.cc create mode 100644 lwnode/pkgs/modules/audio-player-node/src/audio_player_sample.cc create mode 100644 lwnode/pkgs/modules/audio-player-node/src/audio_player_sample.h create mode 100644 lwnode/pkgs/modules/audio-player-node/src/bridge/bridge.h create mode 100644 lwnode/pkgs/modules/audio-player-node/src/bridge/bridge_async.h create mode 100644 lwnode/pkgs/modules/audio-player-node/src/bridge/service.cc create mode 100644 lwnode/pkgs/modules/audio-player-node/src/bridge/service.h create mode 100644 lwnode/pkgs/modules/audio-player-node/src/tizen_audio_io.cc create mode 100644 lwnode/pkgs/modules/audio-player-node/src/tizen_audio_player.cc create mode 100644 lwnode/pkgs/template/rpm/CMakeLists.txt create mode 100644 lwnode/pkgs/template/rpm/README.md create mode 100644 lwnode/pkgs/template/rpm/include/node_api.h create mode 100644 lwnode/pkgs/template/rpm/include/node_api_types.h create mode 100644 lwnode/pkgs/template/rpm/include/node_escargot.h create mode 100644 lwnode/pkgs/template/rpm/lib/index.js create mode 100644 lwnode/pkgs/template/rpm/packaging/helloworld.manifest create mode 100644 lwnode/pkgs/template/rpm/packaging/helloworld.service create mode 100644 lwnode/pkgs/template/rpm/packaging/helloworld.spec create mode 100644 lwnode/pkgs/template/rpm/src/main.cc create mode 100644 lwnode/pkgs/template/tpk/.gitignore create mode 100644 lwnode/pkgs/template/tpk/CMakeLists.txt create mode 100644 lwnode/pkgs/template/tpk/README.md create mode 100644 lwnode/pkgs/template/tpk/include/node_api.h create mode 100644 lwnode/pkgs/template/tpk/include/node_api_types.h create mode 100644 lwnode/pkgs/template/tpk/include/node_escargot.h create mode 100644 lwnode/pkgs/template/tpk/index.js create mode 100644 lwnode/pkgs/template/tpk/lib/helloworld.js create mode 100644 lwnode/pkgs/template/tpk/package.json create mode 100644 lwnode/pkgs/template/tpk/packaging/helloworld.spec create mode 100644 lwnode/pkgs/template/tpk/packaging/tizen-distributor-partner-manufacturer-signer.p12 create mode 100644 lwnode/pkgs/template/tpk/packaging/tizen_author.p12 create mode 100644 lwnode/pkgs/template/tpk/packaging/x.manifest create mode 100644 lwnode/pkgs/template/tpk/src/main.cc create mode 100644 lwnode/pkgs/template/tpk/tizen-manifest.xml create mode 100644 src/lwnode_api.h diff --git a/docs/spec.md b/docs/spec.md index 3ed5100..efa9405 100644 --- a/docs/spec.md +++ b/docs/spec.md @@ -1,68 +1,80 @@ # Lightweight Node.js Specification -* Forked version: 14.14 +## Node.js + * Forked version: 14.14 +## Supported Features + * [Assertion](https://nodejs.org/dist/latest-v14.x/docs/api/assert.html) + * [Async hooks](https://nodejs.org/dist/latest-v14.x/docs/api/async_hooks.html) + * [Buffer](https://nodejs.org/dist/latest-v14.x/docs/api/buffer.html) + * [C/C++ addons with Node-API](https://nodejs.org/dist/latest-v14.x/docs/api/n-api.html) + * [Child processes](https://nodejs.org/dist/latest-v14.x/docs/api/child_process.html) + * [Cluster](https://nodejs.org/dist/latest-v14.x/docs/api/cluster.html) + * [Command-line options](https://nodejs.org/dist/latest-v14.x/docs/api/cli.html) + * [Console](https://nodejs.org/dist/latest-v14.x/docs/api/console.html) + * [Crypto](https://nodejs.org/dist/latest-v14.x/docs/api/crypto.html) + * [DNS](https://nodejs.org/dist/latest-v14.x/docs/api/dns.html) + * [Domain](https://nodejs.org/dist/latest-v14.x/docs/api/domain.html) + * [Errors](https://nodejs.org/dist/latest-v14.x/docs/api/errors.html) + * [Events](https://nodejs.org/dist/latest-v14.x/docs/api/events.html) + * [File system](https://nodejs.org/dist/latest-v14.x/docs/api/fs.html) + * [Globals](https://nodejs.org/dist/latest-v14.x/docs/api/globals.html) + * [HTTP](https://nodejs.org/dist/latest-v14.x/docs/api/http.html) + * [HTTP/2](https://nodejs.org/dist/latest-v14.x/docs/api/http2.html) + * [HTTPS](https://nodejs.org/dist/latest-v14.x/docs/api/https.html) + * [Modules: CommonJS modules](https://nodejs.org/dist/latest-v14.x/docs/api/modules.html) + * [Net](https://nodejs.org/dist/latest-v14.x/docs/api/net.html) + * [OS](https://nodejs.org/dist/latest-v14.x/docs/api/os.html) + * [Path](https://nodejs.org/dist/latest-v14.x/docs/api/path.html) + * [Process](https://nodejs.org/dist/latest-v14.x/docs/api/process.html) + * [Punycode](https://nodejs.org/dist/latest-v14.x/docs/api/punycode.html) + * [Query strings](https://nodejs.org/dist/latest-v14.x/docs/api/querystring.html) + * [Readline](https://nodejs.org/dist/latest-v14.x/docs/api/readline.html) + * [Stream](https://nodejs.org/dist/latest-v14.x/docs/api/stream.html) + * [String decoder](https://nodejs.org/dist/latest-v14.x/docs/api/string_decoder.html) + * [Timers](https://nodejs.org/dist/latest-v14.x/docs/api/timers.html) + * [TLS/SSL](https://nodejs.org/dist/latest-v14.x/docs/api/tls.html) + * [TTY](https://nodejs.org/dist/latest-v14.x/docs/api/tty.html) + * [UDP/datagram](https://nodejs.org/dist/latest-v14.x/docs/api/dgram.html) + * [URL](https://nodejs.org/dist/latest-v14.x/docs/api/url.html) + * [Utilities](https://nodejs.org/dist/latest-v14.x/docs/api/util.html) + * [Zlib](https://nodejs.org/dist/latest-v14.x/docs/api/zlib.html) -* Node.js APIs - - Supported Features - - [Assertion](https://nodejs.org/dist/latest-v14.x/docs/api/assert.html) - - [Buffer](https://nodejs.org/dist/latest-v14.x/docs/api/buffer.html) - - [C/C++ addons with Node-API](https://nodejs.org/dist/latest-v14.x/docs/api/n-api.html) - - [Console](https://nodejs.org/dist/latest-v14.x/docs/api/console.html) - - [Crypto](https://nodejs.org/dist/latest-v14.x/docs/api/crypto.html) - - [DNS](https://nodejs.org/dist/latest-v14.x/docs/api/dns.html) - - [Errors](https://nodejs.org/dist/latest-v14.x/docs/api/errors.html) - - [Events](https://nodejs.org/dist/latest-v14.x/docs/api/events.html) - - [File system](https://nodejs.org/dist/latest-v14.x/docs/api/fs.html) - - [Globals](https://nodejs.org/dist/latest-v14.x/docs/api/globals.html) - - [HTTP](https://nodejs.org/dist/latest-v14.x/docs/api/http.html) - - [HTTPS](https://nodejs.org/dist/latest-v14.x/docs/api/https.html) - - [Modules: CommonJS modules](https://nodejs.org/dist/latest-v14.x/docs/api/modules.html) - - [Net](https://nodejs.org/dist/latest-v14.x/docs/api/net.html) - - [OS](https://nodejs.org/dist/latest-v14.x/docs/api/os.html) - - [Path](https://nodejs.org/dist/latest-v14.x/docs/api/path.html) - - [Process](https://nodejs.org/dist/latest-v14.x/docs/api/process.html) - - [Query strings](https://nodejs.org/dist/latest-v14.x/docs/api/querystring.html) - - [Stream](https://nodejs.org/dist/latest-v14.x/docs/api/stream.html) - - [String decoder](https://nodejs.org/dist/latest-v14.x/docs/api/string_decoder.html) - - [Timers](https://nodejs.org/dist/latest-v14.x/docs/api/timers.html) - - [TLS/SSL](https://nodejs.org/dist/latest-v14.x/docs/api/tls.html) - - [UDP/datagram](https://nodejs.org/dist/latest-v14.x/docs/api/dgram.html) - - [URL](https://nodejs.org/dist/latest-v14.x/docs/api/url.html) - - [Utilities](https://nodejs.org/dist/latest-v14.x/docs/api/util.html) - - [Zlib](https://nodejs.org/dist/latest-v14.x/docs/api/zlib.html) - - Supported (Possibly) but Not Opened Features - - Experimental - - [Async hooks](https://nodejs.org/dist/latest-v14.x/docs/api/async_hooks.html) - - [Modules: ECMAScript modules](https://nodejs.org/dist/latest-v14.x/docs/api/esm.html) - - [Modules: `module` API](https://nodejs.org/dist/latest-v14.x/docs/api/module.html) - - [Modules: Packages](https://nodejs.org/dist/latest-v14.x/docs/api/packages.html) - - Deprecated - - [Domain](https://nodejs.org/dist/latest-v14.x/docs/api/domain.html) - - [Punycode](https://nodejs.org/dist/latest-v14.x/docs/api/punycode.html) - - [Command-line options](https://nodejs.org/dist/latest-v14.x/docs/api/cli.html) - - [Child processes](https://nodejs.org/dist/latest-v14.x/docs/api/child_process.html) - - [Cluster](https://nodejs.org/dist/latest-v14.x/docs/api/cluster.html) - - [HTTP/2](https://nodejs.org/dist/latest-v14.x/docs/api/http2.html) - - [Internationalization](https://nodejs.org/dist/latest-v14.x/docs/api/intl.html) - - [Readline](https://nodejs.org/dist/latest-v14.x/docs/api/readline.html) - - [REPL](https://nodejs.org/dist/latest-v14.x/docs/api/repl.html) - - [TTY](https://nodejs.org/dist/latest-v14.x/docs/api/tty.html) - - Unsupported Features - - Experimental - - [WASI](https://nodejs.org/dist/latest-v14.x/docs/api/wasi.html) - - [Policies](https://nodejs.org/dist/latest-v14.x/docs/api/policy.html) - - [Trace events](https://nodejs.org/dist/latest-v14.x/docs/api/tracing.html) - - [C++ addons](https://nodejs.org/dist/latest-v14.x/docs/api/addons.html) - - [C++ embedder API](https://nodejs.org/dist/latest-v14.x/docs/api/embedding.html) - - [Debugger](https://nodejs.org/dist/latest-v14.x/docs/api/debugger.html) - - [Deprecated APIs](https://nodejs.org/dist/latest-v14.x/docs/api/deprecations.html) - - [Worker threads](https://nodejs.org/dist/latest-v14.x/docs/api/worker_threads.html) - - [Diagnostics Channel](https://nodejs.org/dist/latest-v14.x/docs/api/diagnostics_channel.html) - - [Inspector](https://nodejs.org/dist/latest-v14.x/docs/api/inspector.html) - - [Report](https://nodejs.org/dist/latest-v14.x/docs/api/report.html) - - [V8](https://nodejs.org/dist/latest-v14.x/docs/api/v8.html) - - [VM](https://nodejs.org/dist/latest-v14.x/docs/api/vm.html) - - [Performance hooks](https://nodejs.org/dist/latest-v14.x/docs/api/perf_hooks.html) +## Experimental (with optional runtime flags) + * [Deprecated APIs](https://nodejs.org/dist/latest-v14.x/docs/api/deprecations.html) + * [REPL](https://nodejs.org/dist/latest-v14.x/docs/api/repl.html) + * [Worker threads](https://nodejs.org/dist/latest-v14.x/docs/api/worker_threads.html) +## Experimental (with compile options) + * [Modules: ECMAScript modules](https://nodejs.org/dist/latest-v14.x/docs/api/esm.html) + * [Modules: `module` API](https://nodejs.org/dist/latest-v14.x/docs/api/module.html) + * [Modules: Packages](https://nodejs.org/dist/latest-v14.x/docs/api/packages.html) + * [Internationalization](https://nodejs.org/dist/latest-v14.x/docs/api/intl.html) -* ECMAScript +## Unsupported Features + * [C++ addons](https://nodejs.org/dist/latest-v14.x/docs/api/addons.html) + * [C++ embedder API](https://nodejs.org/dist/latest-v14.x/docs/api/embedding.html) + * [Debugger](https://nodejs.org/dist/latest-v14.x/docs/api/debugger.html): Specific to V8. Debugging is supported via VS Code. + * [Inspector](https://nodejs.org/dist/latest-v14.x/docs/api/inspector.html): Specific to V8 + * [Performance hooks](https://nodejs.org/dist/latest-v14.x/docs/api/perf_hooks.html): Specific to V8 + * [Policies](https://nodejs.org/dist/latest-v14.x/docs/api/policy.html) + * [Report](https://nodejs.org/dist/latest-v14.x/docs/api/report.html): Specific to V8 + * [Trace events](https://nodejs.org/dist/latest-v14.x/docs/api/tracing.html): Specific to V8 + * [V8](https://nodejs.org/dist/latest-v14.x/docs/api/v8.html): Specific to V8 + * [VM](https://nodejs.org/dist/latest-v14.x/docs/api/vm.html) + * [WASI](https://nodejs.org/dist/latest-v14.x/docs/api/wasi.html) + +## Design Decisions and Known Issues + * V8's implementation-specific internal APIs are not supported, e.g., Modules, etc. + * Due to different GC models, V8's GC-related operations are not supported. Memory management is achieved by lwnode's automatic GC. + * Supported user flags are: `--exposed-gc`, `--disallow-code-generation-from-strings`. User flags specific to V8's internal APIs are not supported, e.g., `--max_old_space_size`, etc. + * `vm` and `repl` are not supported for security reasons. + * All literal strings are encoded in UTF16, when JS source has been encoded in UTF16. + * Known Issues: + - In some cases, an async hook ID is set to null. + - In some cases, an error message format is slightly different from node.js's error message, although it contains the same information. + - In some cases, an event listener cannot receive an event thrown by a child process. + - In some cases, a child process cannot obtain values from `process.env`. + - `Worker` is experimental. It should be used with caution. + - `ValueSerializer` is experimental. It should be used with caution. + +## ECMAScript * [node.green](https://node.green/) provides an overview over supported ECMAScript features in our target version of Node.js, `v14.14`. diff --git a/lib/buffer.js b/lib/buffer.js index d05f0bc..07f7161 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -178,18 +178,6 @@ const bufferWarning = 'Buffer() is deprecated due to security and usability ' + 'Buffer.allocUnsafe(), or Buffer.from() methods instead.'; function showFlaggedDeprecation() { - // @lwnode - // @fixme force depress DeprecationWarning until isInsideNodeModules works - if (bufferWarningAlreadyEmitted || - ++nodeModulesCheckCounter > 10000 || - (!require('internal/options').getOptionValue('--pending-deprecation'))) { - return; - } - - process.emitWarning(bufferWarning, 'DeprecationWarning', 'DEP0005'); - bufferWarningAlreadyEmitted = true; - return; - if (bufferWarningAlreadyEmitted || ++nodeModulesCheckCounter > 10000 || (!require('internal/options').getOptionValue('--pending-deprecation') && diff --git a/lib/internal/lwnode/memory.js b/lib/internal/lwnode/memory.js new file mode 100644 index 0000000..37018cd --- /dev/null +++ b/lib/internal/lwnode/memory.js @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2022-present Samsung Electronics Co., Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const EventEmitter = require('events'); +const rawMethods = internalBinding('process_methods'); + +/** + * @typedef {object} FileSizeOption + * @property {number} [fractionalDigits=2] + * @property {boolean} [signed=false] + */ + +/** + * @typedef {object} LeakRecord + * @property {Date} time + * @property {MemoryStats} stats + */ + +/** @type {number} msec time for idle GC interval time */ +const kGcInterval = 5000; + +/** + * Converts a number into a human-readable string + * @param {number} size number + * @param {FileSizeOption?} options + * @return {string} human-readable string + */ +function getHumanSize(size, { fractionalDigits = 2, signed = false } = {}) { + let isNegative = size < 0; + let abs = Math.abs(size); + let i = abs == 0 ? 0 : Math.floor(Math.log(abs) / Math.log(1024)); + return ( + `${isNegative ? '-' : signed ? '+' : ''}` + + `${(abs / Math.pow(1024, i)).toFixed(fractionalDigits)} ${ + ['B', 'kB', 'MB', 'GB', 'TB'][i] + }` + ); +} + +/** + * @param {number} size number + * @param {FileSizeOption?} options + * @return {[string,number]} [human-readable string, the given size] + */ +function formatMemStats(size, option) { + return [getHumanSize(size, option), size]; +} + +/** + * @typedef {object} MemoryStats + * @property {[string,number]} heap + * @property {[string,number]} unmapped + * @property {[string,number]} sinceLastGc + */ + +/** + * @param {{ + * heapSize: number, + * bytesSinceGC: number, + * unmappedBytes: number, + * }} [stats=] if undefined, gc stats from native bindings is used. + * @return {MemoryStats} + */ +function createMemStats(stats = rawMethods.getGCMemoryStats()) { + return { + heap: formatMemStats(stats.heapSize), + sinceLastGc: formatMemStats(stats.bytesSinceGC), + unmapped: formatMemStats(stats.unmappedBytes), + }; +} + +class MemDiff { + #last; + #cur; + #max; + + /** @type {MemoryStats} */ + static zero = createMemStats({ + heapSize: 0, + unmappedBytes: 0, + bytesSinceGC: 0, + }); + + constructor() { + /** @type {MemoryStats} */ + this.#last = MemDiff.zero; + /** @type {MemoryStats} */ + this.#cur = MemDiff.zero; + /** @type {MemoryStats} */ + this.#max = MemDiff.zero; + } + + /** + * check the current stats and return the result + * @return {CheckedResult} + */ + check() { + this.#last = this.#cur; + this.#cur = createMemStats(); + this.#max = createMemStats({ + heapSize: Math.max(this.#cur.heap[1], this.#max.heap[1]), + unmappedBytes: Math.max(this.#cur.unmapped[1], this.#max.unmapped[1]), + bytesSinceGC: Math.max( + this.#cur.sinceLastGc[1], + this.#max.sinceLastGc[1], + ), + }); + + /** @type {FileSizeOption} */ + const heap = this.#cur.heap[1] - this.#last.heap[1]; + const unmapped = this.#cur.unmapped[1] - this.#last.unmapped[1]; + const sinceLastGc = this.#cur.sinceLastGc[1] - this.#last.sinceLastGc[1]; + const option = { signed: true, fractionalDigits: 2 }; + + /** + * @typedef {object} CheckedResult + * @property {MemoryStats} max + * @property {MemoryStats} last + * @property {MemoryStats} current + * @property {MemoryStats} change + */ + return { + max: Object.assign({}, this.#max), + last: Object.assign({}, this.#last), + current: Object.assign({}, this.#cur), + change: { + heap: formatMemStats(heap, option), + unmapped: formatMemStats(unmapped, option), + sinceLastGc: formatMemStats(sinceLastGc, option), + }, + }; + } +} + +/** + * @typedef {object} TrackRecord + * @property {number} value + * @property {Date} time + */ + +/** + * @callback OnMaxUpdated + * @param {{ + * growth: number, + * current: number, + * count: number, + * elapsed: number, + * }} + */ + +class ValueTracker { + #onMaxUpdated; + #maxIgnoreCount; + #records; + #count; + /** + * @param {number} maxIgnoreCount + * @param {{ onMaxUpdated: OnMaxUpdated }} + */ + constructor(maxIgnoreCount = 2, { onMaxUpdated }) { + if (typeof onMaxUpdated != 'function') { + throw new TypeError('emitter'); + } + /** @type {OnMaxUpdated} */ + this.#onMaxUpdated = onMaxUpdated; + /** @type {number} */ + this.#maxIgnoreCount = Math.max(maxIgnoreCount, 2); + /** @type {TrackRecord[]} */ + this.#records = []; + /** @type {number} */ + this.#count = 0; + } + + /** + * @param {number} current a value to update + */ + update(current) { + if (this.#records.length == 0) { + this.#addRecord(current); + return; + } + + const { value: last } = this.#records.slice(-1)[0]; + + if (current > last) { + if (++this.#count >= this.#maxIgnoreCount) { + const now = new Date(); + const { value: base, time: basetime } = this.#records[0]; + const growth = current - base; + const elapsed = Math.round((now - basetime) / 1000); + + this.#onMaxUpdated({ growth, current, count: this.#count, elapsed }); + + this.reset(); + this.#addRecord(current, now); + } else { + this.#addRecord(current); + } + } + } + + reset() { + this.#records = []; + this.#count = 0; + } + + #addRecord(value, time = new Date()) { + this.#records.push({ value, time }); + } +} + +class MemWatcher extends EventEmitter { + #statsTimerId; + #delay; + #diff; + #tracker; + + /** + * @param {number} delay heap size (bytes) + * @param {EventEmitter} emitter + */ + constructor({ delay = kGcInterval, maxIgnoreCount = 2 } = {}) { + super([arguments]); + + this.#delay = delay; + this.#statsTimerId = null; + this.#diff = new MemDiff(); + this.#tracker = new ValueTracker(maxIgnoreCount, { + onMaxUpdated: ({ growth, current, count, elapsed }) => { + this.emit('max', { + reason: `Max value growth occurred ${count} times over ${elapsed}s`, + change: [getHumanSize(growth, { signed: true }), growth], + currentMax: [getHumanSize(current), current], + }); + }, + }); + + this.setMaxListeners(5); + this.on('newListener', this.#onnewListener); + this.on('removeListener', this.#onremoveListener); + } + + end() { + if (this.#statsTimerId) { + clearInterval(this.#statsTimerId); + this.#statsTimerId = null; + } + } + + #hasListener() { + return ['stats', 'max'].some((event) => this.listeners(event).length > 0); + } + + #onnewListener(event) { + switch (event) { + case 'max': + case 'stats': + if (this.#hasListener() == false) { + this.#statsTimerId = setInterval(() => { + let current = this.#diff.check(); + this.emit('stats', current); + + if (this.listeners('max').length) { + this.#tracker.update(current.max.heap[1]); + } + }, this.#delay); + } + break; + default: + break; + } + } + + #onremoveListener(event) { + switch (event) { + case 'max': + this.#tracker.reset(); + // fall-through + case 'stats': + if (this.#hasListener() == false) { + this.end(); + } + break; + default: + break; + } + } +} + +module.exports = { + MemWatcher, + MemDiff, +}; diff --git a/lib/internal/lwnode/setup.js b/lib/internal/lwnode/setup.js index c9a9caa..e2392e6 100644 --- a/lib/internal/lwnode/setup.js +++ b/lib/internal/lwnode/setup.js @@ -14,6 +14,8 @@ * limitations under the License. */ +const { MemWatcher, MemDiff } = require("internal/lwnode/memory"); + const useEscargot = process.config.variables.javascript_engine == "escargot"; const isDebugBuild = process.config.target_defaults.default_configuration == "Debug"; @@ -22,7 +24,7 @@ const isDebugBuild = const disabledFeatures = new Set(["WASI"]); // @note 'binding' is process module binding -function createProcessEntry(binding) { +function wrapLWNodeMethods(binding) { function _internalLog(...args) { if (binding.print) { binding.print.apply(null, args); @@ -43,6 +45,8 @@ function createProcessEntry(binding) { binding.print.stack.apply(null, args); } }, + MemWatcher, + MemDiff, PssUsage: (...args) => { if (binding.PssUsage) { return binding.PssUsage.apply(null, args); @@ -89,5 +93,5 @@ function createProcessEntry(binding) { } module.exports = { - createProcessEntry, + wrapLWNodeMethods, }; diff --git a/lib/internal/process/per_thread.js b/lib/internal/process/per_thread.js index d02fc48..01bcf86 100644 --- a/lib/internal/process/per_thread.js +++ b/lib/internal/process/per_thread.js @@ -230,7 +230,7 @@ function wrapProcessMethods(binding) { return { // @lwnode - lwnode: lwnodeSetup.createProcessEntry(binding), + lwnode: lwnodeSetup.wrapLWNodeMethods(binding), _rawDebug, hrtime, hrtimeBigInt, diff --git a/lwnode/apps/service/package.json b/lwnode/apps/service/package.json new file mode 100644 index 0000000..9c07f79 --- /dev/null +++ b/lwnode/apps/service/package.json @@ -0,0 +1,16 @@ +{ + "name": "service", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "express": "4.17.1", + "express-asyncify": "^1.0.1", + "knex": "^0.95.15" + } +} diff --git a/lwnode/apps/service/src/index.ts b/lwnode/apps/service/src/index.ts new file mode 100644 index 0000000..6185d56 --- /dev/null +++ b/lwnode/apps/service/src/index.ts @@ -0,0 +1,33 @@ +/* + * Copyright 2022-present Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const express = require('express'); +const asyncify = require('express-asyncify'); +import { Services } from './services'; + +const app = asyncify(express()); +startService(app); + +async function startService(app) { + const router = express.Router(); + const serviceRouter = express.Router(); + app.use(router); + router.use('/service', serviceRouter); + + const services = Services.getInstance(); + app.set('view engine', services.getViewEngine()); + services.start(serviceRouter); +} diff --git a/lwnode/apps/service/src/service.ts b/lwnode/apps/service/src/service.ts new file mode 100644 index 0000000..969f59a --- /dev/null +++ b/lwnode/apps/service/src/service.ts @@ -0,0 +1,209 @@ +/* + * Copyright 2022-present Samsung Electronics Co., Ltd. and other contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import { Router } from 'express'; +import { Knex } from 'knex'; + +const State = { + RUN: 'run', + STOP: 'stop' +} as const; +type State = typeof State[keyof typeof State]; + +class ServiceData { + public readonly name: string; + public path: string; + public version: string; + public summary: string; + + constructor(name: string, path: string, version: string, summary: string) { + this.name = name; + this.path = path; + this.version = version; + this.summary = summary; + } +} + +export class Service { + private serviceData: ServiceData; + public state: State; + + constructor(serviceData: ServiceData, router: Router) { + this.serviceData = serviceData; + this.state = State.STOP; + + router.get(`/${this.serviceData.name}`, (req, res) => { + console.log(`${this.serviceData.name} state is ${this.state}.`); + + if (this.state === State.RUN) { + console.log(`render service: ${this.serviceData.name}: ${this.serviceData.path}`); + res.render(this.serviceData.path, { name: this.serviceData.name }); + } else { + res.status(404).send('not found'); + } + }); + } + + public setPath(path: string) { + this.serviceData.path = path; + } + + public run() { + if (this.state === State.RUN) { + return; + } + + console.log(`run service: ${this.serviceData.name}(${this.serviceData.path})`); + + this.state = State.RUN; + } + + public stop() { + if (this.state === State.STOP) { + return; + } + + console.log(`stop service: ${this.serviceData.name}`); + + this.state = State.STOP; + } +} + +export class ServiceDB { + private knex: Knex; + private dbName: string; + private dbTable: string; + + constructor() { + this.dbName = 'service_app.db'; + this.dbTable = 'service'; + + this.knex = require('knex')({ + client: 'sqlite3', + connection: { + filename: this.dbName, + } + }); + } + + public ensureTable() { + return this.knex.schema.hasTable('service').then((exists) => { + if (!exists) { + return this.knex.schema.createTable('service', (table) => { + table.string('name').primary(); + table.string('path').unique(); + table.string('version'); + table.string('summary') + }) + .then(() => { + console.log(`${'service'} table is created`); + }); + } + }); + } + + async insertDataInDB(data: ServiceData) { + await this.ensureTable(); + return this.knex(this.dbTable).insert({ + name: data.name, path: data.path, version: data.version, summary: data.summary + }); + } + + async getDataByNameFromDB(name: string) { + await this.ensureTable(); + return this.knex(this.dbTable) + .where('name', name) + .then((result) => { + if (result.length) { + return result[0]; + } + }); + } + + async getServiceData() { + await this.ensureTable(); + return this.knex(this.dbTable).select('*'); + } +} + +export class Services { + private static instance: Services; + private router: Router; + private appList: Map; + private viewEngine: string; + private isRunning: boolean; + private serviceDB: ServiceDB; + + constructor() { + this.appList = new Map(); + this.viewEngine = 'ejs'; + this.isRunning = false; + } + + public static getInstance(): Services { + return this.instance || (this.instance = new this()) + } + + public getViewEngine(): string { + return this.viewEngine; + } + + public async start(router: Router) { + this.router = router; + this.isRunning = true; + + try { + const servicesData = this.serviceDB.getServiceData(); + + servicesData.forEach(function (data) { + this.addService(data); + }, this); + } catch(e) { + console.log('cannot start service app.'); + } + } + + public addService(name: string, path: string, version: string, summary: string) { + if (!this.isRunning) { + throw new Error("Service is not start!"); + } + + let service; + if (this.appList.has(name)) { + throw new Error("Cannot add service: exist service name"); + } else { + let data = new ServiceData(name, path, version, summary) + service = new Service(data, this.router); + this.appList.set(name, service); + this.serviceDB.insertDataInDB(data); + } + + service.run(); + } + + public getService(name: string) { + if (this.appList.has(name)) { + let service = this.serviceDB.getDataByNameFromDB(name); + if (!service) { + throw new Error("Cannot get service") + } + } + return this.appList.get(name); + } +} + +export default Services; diff --git a/lwnode/apps/sqlite3/.eslintrc.js b/lwnode/apps/sqlite3/.eslintrc.js new file mode 100644 index 0000000..a058e65 --- /dev/null +++ b/lwnode/apps/sqlite3/.eslintrc.js @@ -0,0 +1,13 @@ +module.exports = { + env: { + browser: false, + commonjs: true, + node: true, + }, + extends: ['airbnb-base', 'plugin:prettier/recommended'], + ignorePatterns: ['node_modules/'], + rules: { + 'global-require': 0, + 'no-console': 0, + }, +}; diff --git a/lwnode/apps/sqlite3/.gitignore b/lwnode/apps/sqlite3/.gitignore new file mode 100644 index 0000000..d4d68a8 --- /dev/null +++ b/lwnode/apps/sqlite3/.gitignore @@ -0,0 +1,15 @@ +.vscode +.buildResult +node_modules + +.cache +*.wgt +dist +out +docs +release +download +.nyc_output + +CMakeCache.txt +CMakeFiles/* diff --git a/lwnode/apps/sqlite3/CMakeLists.txt b/lwnode/apps/sqlite3/CMakeLists.txt new file mode 100644 index 0000000..8a20ada --- /dev/null +++ b/lwnode/apps/sqlite3/CMakeLists.txt @@ -0,0 +1,76 @@ +# +# Copyright 2021-present Samsung Electronics Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +cmake_minimum_required (VERSION 2.8) +project(node_sqlite3) + +set(SQLITE3_ROOT node_modules/sqlite3) +set(BUILD_MODE "release" CACHE STRING "BUILD_MODE") + +# Source Files +file(GLOB_RECURSE SQLITE3_SRC_FILES ${SQLITE3_ROOT}/src/*.cc) + +# Include Paths +set(SQLITE3_INC_PATHS + src + deps/include +) + +# Options +set(SQLITE3_FLAGS + -std=gnu++11 + -g + -fstack-protector + -fdata-sections + -ffunction-sections + -Wno-format +) +if(${BUILD_MODE} STREQUAL debug) + list(APPEND SQLITE3_FLAGS + -O0 + ) +elseif(${BUILD_MODE} STREQUAL release) + list(APPEND SQLITE3_FLAGS + -O3 + ) +endif() + + +# Defines +set(SQLITE3_DEFINES + BUILDING_NODE_EXTENSION=1 +) +if(${BUILD_MODE} STREQUAL debug) + list(APPEND SQLITE3_DEFINES + _GLIBCXX_DEBUG + GC_DEBUG + DEBUG + ) +elseif(${BUILD_MODE} STREQUAL release) + list(APPEND SQLITE3_DEFINES + NDEBUG) +endif() + +# Library +find_library(LIB_SQLITE3 NAMES sqlite3) + +# Target +add_library(${PROJECT_NAME} SHARED ${SQLITE3_SRC_FILES}) +target_include_directories(${PROJECT_NAME} PUBLIC ${SQLITE3_INC_PATHS}) +target_compile_options(${PROJECT_NAME} PUBLIC ${SQLITE3_FLAGS}) +target_compile_definitions(${PROJECT_NAME} PUBLIC ${SQLITE3_DEFINES}) +target_link_libraries(${PROJECT_NAME} PUBLIC ${LIB_SQLITE3}) +set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node") diff --git a/lwnode/apps/sqlite3/LICENSE b/lwnode/apps/sqlite3/LICENSE new file mode 100644 index 0000000..f433b1a --- /dev/null +++ b/lwnode/apps/sqlite3/LICENSE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/lwnode/apps/sqlite3/LICENSE.BOEHM-GC b/lwnode/apps/sqlite3/LICENSE.BOEHM-GC new file mode 100644 index 0000000..0a7cc7a --- /dev/null +++ b/lwnode/apps/sqlite3/LICENSE.BOEHM-GC @@ -0,0 +1,30 @@ +Copyright (c) 1988, 1989 Hans-J. Boehm, Alan J. Demers +Copyright (c) 1991-1996 by Xerox Corporation. All rights reserved. +Copyright (c) 1996-1999 by Silicon Graphics. All rights reserved. +Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P. + +The file linux_threads.c is also +Copyright (c) 1998 by Fergus Henderson. All rights reserved. + +The files Makefile.am, and configure.in are +Copyright (c) 2001 by Red Hat Inc. All rights reserved. + +Several files supporting GNU-style builds are copyrighted by the Free +Software Foundation, and carry a different license from that given +below. + +THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED +OR IMPLIED. ANY USE IS AT YOUR OWN RISK. + +Permission is hereby granted to use or copy this program +for any purpose, provided the above notices are retained on all copies. +Permission to modify the code and to distribute modified code is granted, +provided the above notices are retained, and a notice that the code was +modified is included with the above copyright notice. + +A few of the files needed to use the GNU-style build procedure come with +slightly different licenses, though they are all similar in spirit. A few +are GPL'ed, but with an exception that should cover all uses in the +collector. (If you are concerned about such things, I recommend you look +at the notice in config.guess or ltmain.sh.) + diff --git a/lwnode/apps/sqlite3/LICENSE.BSD-3-Clause b/lwnode/apps/sqlite3/LICENSE.BSD-3-Clause new file mode 100644 index 0000000..7ace4d3 --- /dev/null +++ b/lwnode/apps/sqlite3/LICENSE.BSD-3-Clause @@ -0,0 +1,9 @@ +Copyright (c) . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/lwnode/apps/sqlite3/LICENSE.MIT b/lwnode/apps/sqlite3/LICENSE.MIT new file mode 100644 index 0000000..356e7ec --- /dev/null +++ b/lwnode/apps/sqlite3/LICENSE.MIT @@ -0,0 +1,20 @@ +Copyright (C) 2017-2018 by various contributors (see AUTHORS) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/lwnode/apps/sqlite3/LICENSE.NodeJS b/lwnode/apps/sqlite3/LICENSE.NodeJS new file mode 100644 index 0000000..53ebbc7 --- /dev/null +++ b/lwnode/apps/sqlite3/LICENSE.NodeJS @@ -0,0 +1,1072 @@ +Node.js is licensed for use as follows: + +""" +Copyright Node.js contributors. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. +""" + +The Node.js license applies to all parts of Node.js that are not externally +maintained libraries. + +The externally maintained libraries used by Node.js are: + +- c-ares, located at deps/cares, is licensed as follows: + """ + Copyright 1998 by the Massachusetts Institute of Technology. + Copyright (C) 2007-2013 by Daniel Stenberg + + Permission to use, copy, modify, and distribute this + software and its documentation for any purpose and without + fee is hereby granted, provided that the above copyright + notice appear in all copies and that both that copyright + notice and this permission notice appear in supporting + documentation, and that the name of M.I.T. not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + M.I.T. makes no representations about the suitability of + this software for any purpose. It is provided "as is" + without express or implied warranty. + """ + +- HTTP Parser, located at deps/http_parser, is licensed as follows: + """ + http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright + Igor Sysoev. + + Additional changes are licensed under the same terms as NGINX and + copyright Joyent, Inc. and other Node contributors. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. + """ + +- ICU, located at deps/icu-small, is licensed as follows: + """ + COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later) + + Copyright © 1991-2017 Unicode, Inc. All rights reserved. + Distributed under the Terms of Use in http://www.unicode.org/copyright.html + + Permission is hereby granted, free of charge, to any person obtaining + a copy of the Unicode data files and any associated documentation + (the "Data Files") or Unicode software and any associated documentation + (the "Software") to deal in the Data Files or Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, and/or sell copies of + the Data Files or Software, and to permit persons to whom the Data Files + or Software are furnished to do so, provided that either + (a) this copyright and permission notice appear with all copies + of the Data Files or Software, or + (b) this copyright and permission notice appear in associated + Documentation. + + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF + ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS + NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL + DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THE DATA FILES OR SOFTWARE. + + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in these Data Files or Software without prior + written authorization of the copyright holder. + + --------------------- + + Third-Party Software Licenses + + This section contains third-party software notices and/or additional + terms for licensed third-party software components included within ICU + libraries. + + 1. ICU License - ICU 1.8.1 to ICU 57.1 + + COPYRIGHT AND PERMISSION NOTICE + + Copyright (c) 1995-2016 International Business Machines Corporation and others + All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, and/or sell copies of the Software, and to permit persons + to whom the Software is furnished to do so, provided that the above + copyright notice(s) and this permission notice appear in all copies of + the Software and that both the above copyright notice(s) and this + permission notice appear in supporting documentation. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY + SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER + RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, use + or other dealings in this Software without prior written authorization + of the copyright holder. + + All trademarks and registered trademarks mentioned herein are the + property of their respective owners. + + 2. Chinese/Japanese Word Break Dictionary Data (cjdict.txt) + + # The Google Chrome software developed by Google is licensed under + # the BSD license. Other software included in this distribution is + # provided under other licenses, as set forth below. + # + # The BSD License + # http://opensource.org/licenses/bsd-license.php + # Copyright (C) 2006-2008, Google Inc. + # + # All rights reserved. + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions are met: + # + # Redistributions of source code must retain the above copyright notice, + # this list of conditions and the following disclaimer. + # Redistributions in binary form must reproduce the above + # copyright notice, this list of conditions and the following + # disclaimer in the documentation and/or other materials provided with + # the distribution. + # Neither the name of Google Inc. nor the names of its + # contributors may be used to endorse or promote products derived from + # this software without specific prior written permission. + # + # + # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + # + # + # The word list in cjdict.txt are generated by combining three word lists + # listed below with further processing for compound word breaking. The + # frequency is generated with an iterative training against Google web + # corpora. + # + # * Libtabe (Chinese) + # - https://sourceforge.net/project/?group_id=1519 + # - Its license terms and conditions are shown below. + # + # * IPADIC (Japanese) + # - http://chasen.aist-nara.ac.jp/chasen/distribution.html + # - Its license terms and conditions are shown below. + # + # ---------COPYING.libtabe ---- BEGIN-------------------- + # + # /* + # * Copyrighy (c) 1999 TaBE Project. + # * Copyright (c) 1999 Pai-Hsiang Hsiao. + # * All rights reserved. + # * + # * Redistribution and use in source and binary forms, with or without + # * modification, are permitted provided that the following conditions + # * are met: + # * + # * . Redistributions of source code must retain the above copyright + # * notice, this list of conditions and the following disclaimer. + # * . Redistributions in binary form must reproduce the above copyright + # * notice, this list of conditions and the following disclaimer in + # * the documentation and/or other materials provided with the + # * distribution. + # * . Neither the name of the TaBE Project nor the names of its + # * contributors may be used to endorse or promote products derived + # * from this software without specific prior written permission. + # * + # * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + # * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + # * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + # * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + # * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + # * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + # * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + # * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + # * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + # * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + # * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + # * OF THE POSSIBILITY OF SUCH DAMAGE. + # */ + # + # /* + # * Copyright (c) 1999 Computer Systems and Communication Lab, + # * Institute of Information Science, Academia + # * Sinica. All rights reserved. + # * + # * Redistribution and use in source and binary forms, with or without + # * modification, are permitted provided that the following conditions + # * are met: + # * + # * . Redistributions of source code must retain the above copyright + # * notice, this list of conditions and the following disclaimer. + # * . Redistributions in binary form must reproduce the above copyright + # * notice, this list of conditions and the following disclaimer in + # * the documentation and/or other materials provided with the + # * distribution. + # * . Neither the name of the Computer Systems and Communication Lab + # * nor the names of its contributors may be used to endorse or + # * promote products derived from this software without specific + # * prior written permission. + # * + # * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + # * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + # * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + # * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + # * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + # * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + # * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + # * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + # * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + # * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + # * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + # * OF THE POSSIBILITY OF SUCH DAMAGE. + # */ + # + # Copyright 1996 Chih-Hao Tsai @ Beckman Institute, + # University of Illinois + # c-tsai4@uiuc.edu http://casper.beckman.uiuc.edu/~c-tsai4 + # + # ---------------COPYING.libtabe-----END-------------------------------- + # + # + # ---------------COPYING.ipadic-----BEGIN------------------------------- + # + # Copyright 2000, 2001, 2002, 2003 Nara Institute of Science + # and Technology. All Rights Reserved. + # + # Use, reproduction, and distribution of this software is permitted. + # Any copy of this software, whether in its original form or modified, + # must include both the above copyright notice and the following + # paragraphs. + # + # Nara Institute of Science and Technology (NAIST), + # the copyright holders, disclaims all warranties with regard to this + # software, including all implied warranties of merchantability and + # fitness, in no event shall NAIST be liable for + # any special, indirect or consequential damages or any damages + # whatsoever resulting from loss of use, data or profits, whether in an + # action of contract, negligence or other tortuous action, arising out + # of or in connection with the use or performance of this software. + # + # A large portion of the dictionary entries + # originate from ICOT Free Software. The following conditions for ICOT + # Free Software applies to the current dictionary as well. + # + # Each User may also freely distribute the Program, whether in its + # original form or modified, to any third party or parties, PROVIDED + # that the provisions of Section 3 ("NO WARRANTY") will ALWAYS appear + # on, or be attached to, the Program, which is distributed substantially + # in the same form as set out herein and that such intended + # distribution, if actually made, will neither violate or otherwise + # contravene any of the laws and regulations of the countries having + # jurisdiction over the User or the intended distribution itself. + # + # NO WARRANTY + # + # The program was produced on an experimental basis in the course of the + # research and development conducted during the project and is provided + # to users as so produced on an experimental basis. Accordingly, the + # program is provided without any warranty whatsoever, whether express, + # implied, statutory or otherwise. The term "warranty" used herein + # includes, but is not limited to, any warranty of the quality, + # performance, merchantability and fitness for a particular purpose of + # the program and the nonexistence of any infringement or violation of + # any right of any third party. + # + # Each user of the program will agree and understand, and be deemed to + # have agreed and understood, that there is no warranty whatsoever for + # the program and, accordingly, the entire risk arising from or + # otherwise connected with the program is assumed by the user. + # + # Therefore, neither ICOT, the copyright holder, or any other + # organization that participated in or was otherwise related to the + # development of the program and their respective officials, directors, + # officers and other employees shall be held liable for any and all + # damages, including, without limitation, general, special, incidental + # and consequential damages, arising out of or otherwise in connection + # with the use or inability to use the program or any product, material + # or result produced or otherwise obtained by using the program, + # regardless of whether they have been advised of, or otherwise had + # knowledge of, the possibility of such damages at any time during the + # project or thereafter. Each user will be deemed to have agreed to the + # foregoing by his or her commencement of use of the program. The term + # "use" as used herein includes, but is not limited to, the use, + # modification, copying and distribution of the program and the + # production of secondary products from the program. + # + # In the case where the program, whether in its original form or + # modified, was distributed or delivered to or received by a user from + # any person, organization or entity other than ICOT, unless it makes or + # grants independently of ICOT any specific warranty to the user in + # writing, such person, organization or entity, will also be exempted + # from and not be held liable to the user for any such damages as noted + # above as far as the program is concerned. + # + # ---------------COPYING.ipadic-----END---------------------------------- + + 3. Lao Word Break Dictionary Data (laodict.txt) + + # Copyright (c) 2013 International Business Machines Corporation + # and others. All Rights Reserved. + # + # Project: http://code.google.com/p/lao-dictionary/ + # Dictionary: http://lao-dictionary.googlecode.com/git/Lao-Dictionary.txt + # License: http://lao-dictionary.googlecode.com/git/Lao-Dictionary-LICENSE.txt + # (copied below) + # + # This file is derived from the above dictionary, with slight + # modifications. + # ---------------------------------------------------------------------- + # Copyright (C) 2013 Brian Eugene Wilson, Robert Martin Campbell. + # All rights reserved. + # + # Redistribution and use in source and binary forms, with or without + # modification, + # are permitted provided that the following conditions are met: + # + # + # Redistributions of source code must retain the above copyright notice, this + # list of conditions and the following disclaimer. Redistributions in + # binary form must reproduce the above copyright notice, this list of + # conditions and the following disclaimer in the documentation and/or + # other materials provided with the distribution. + # + # + # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + # OF THE POSSIBILITY OF SUCH DAMAGE. + # -------------------------------------------------------------------------- + + 4. Burmese Word Break Dictionary Data (burmesedict.txt) + + # Copyright (c) 2014 International Business Machines Corporation + # and others. All Rights Reserved. + # + # This list is part of a project hosted at: + # github.com/kanyawtech/myanmar-karen-word-lists + # + # -------------------------------------------------------------------------- + # Copyright (c) 2013, LeRoy Benjamin Sharon + # All rights reserved. + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions + # are met: Redistributions of source code must retain the above + # copyright notice, this list of conditions and the following + # disclaimer. Redistributions in binary form must reproduce the + # above copyright notice, this list of conditions and the following + # disclaimer in the documentation and/or other materials provided + # with the distribution. + # + # Neither the name Myanmar Karen Word Lists, nor the names of its + # contributors may be used to endorse or promote products derived + # from this software without specific prior written permission. + # + # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND + # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS + # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + # TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + # THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + # SUCH DAMAGE. + # -------------------------------------------------------------------------- + + 5. Time Zone Database + + ICU uses the public domain data and code derived from Time Zone + Database for its time zone support. The ownership of the TZ database + is explained in BCP 175: Procedure for Maintaining the Time Zone + Database section 7. + + # 7. Database Ownership + # + # The TZ database itself is not an IETF Contribution or an IETF + # document. Rather it is a pre-existing and regularly updated work + # that is in the public domain, and is intended to remain in the + # public domain. Therefore, BCPs 78 [RFC5378] and 79 [RFC3979] do + # not apply to the TZ Database or contributions that individuals make + # to it. Should any claims be made and substantiated against the TZ + # Database, the organization that is providing the IANA + # Considerations defined in this RFC, under the memorandum of + # understanding with the IETF, currently ICANN, may act in accordance + # with all competent court orders. No ownership claims will be made + # by ICANN or the IETF Trust on the database or the code. Any person + # making a contribution to the database or code waives all rights to + # future claims in that contribution or in the TZ Database. + """ + +- libuv, located at deps/uv, is licensed as follows: + """ + libuv is part of the Node project: http://nodejs.org/ + libuv may be distributed alone under Node's license: + + ==== + + Copyright Joyent, Inc. and other Node contributors. All rights reserved. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. + + ==== + + This license applies to all parts of libuv that are not externally + maintained libraries. + + The externally maintained libraries used by libuv are: + + - tree.h (from FreeBSD), copyright Niels Provos. Two clause BSD license. + + - inet_pton and inet_ntop implementations, contained in src/inet.c, are + copyright the Internet Systems Consortium, Inc., and licensed under the ISC + license. + + - stdint-msvc2008.h (from msinttypes), copyright Alexander Chemeris. Three + clause BSD license. + + - pthread-fixes.h, pthread-fixes.c, copyright Google Inc. and Sony Mobile + Communications AB. Three clause BSD license. + + - android-ifaddrs.h, android-ifaddrs.c, copyright Berkeley Software Design + Inc, Kenneth MacKay and Emergya (Cloud4all, FP7/2007-2013, grant agreement + n° 289016). Three clause BSD license. + """ + +- OpenSSL, located at deps/openssl, is licensed as follows: + """ + Copyright (c) 1998-2016 The OpenSSL Project. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + + 3. All advertising materials mentioning features or use of this + software must display the following acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + + 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + endorse or promote products derived from this software without + prior written permission. For written permission, please contact + openssl-core@openssl.org. + + 5. Products derived from this software may not be called "OpenSSL" + nor may "OpenSSL" appear in their names without prior written + permission of the OpenSSL Project. + + 6. Redistributions of any form whatsoever must retain the following + acknowledgment: + "This product includes software developed by the OpenSSL Project + for use in the OpenSSL Toolkit (http://www.openssl.org/)" + + THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + OF THE POSSIBILITY OF SUCH DAMAGE. + ==================================================================== + + This product includes cryptographic software written by Eric Young + (eay@cryptsoft.com). This product includes software written by Tim + Hudson (tjh@cryptsoft.com). + """ + +- Punycode.js, located at lib/punycode.js, is licensed as follows: + """ + Copyright Mathias Bynens + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + """ + +- V8, located at deps/v8, is licensed as follows: + """ + This license applies to all parts of V8 that are not externally + maintained libraries. The externally maintained libraries used by V8 + are: + + - PCRE test suite, located in + test/mjsunit/third_party/regexp-pcre/regexp-pcre.js. This is based on the + test suite from PCRE-7.3, which is copyrighted by the University + of Cambridge and Google, Inc. The copyright notice and license + are embedded in regexp-pcre.js. + + - Layout tests, located in test/mjsunit/third_party/object-keys. These are + based on layout tests from webkit.org which are copyrighted by + Apple Computer, Inc. and released under a 3-clause BSD license. + + - Strongtalk assembler, the basis of the files assembler-arm-inl.h, + assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h, + assembler-ia32.cc, assembler-ia32.h, assembler-x64-inl.h, + assembler-x64.cc, assembler-x64.h, assembler-mips-inl.h, + assembler-mips.cc, assembler-mips.h, assembler.cc and assembler.h. + This code is copyrighted by Sun Microsystems Inc. and released + under a 3-clause BSD license. + + - Valgrind client API header, located at third_party/valgrind/valgrind.h + This is release under the BSD license. + + These libraries have their own licenses; we recommend you read them, + as their terms may differ from the terms below. + + Further license information can be found in LICENSE files located in + sub-directories. + + Copyright 2014, the V8 project authors. All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + """ + +- zlib, located at deps/zlib, is licensed as follows: + """ + zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.8, April 28th, 2013 + + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + """ + +- npm, located at deps/npm, is licensed as follows: + """ + The npm application + Copyright (c) npm, Inc. and Contributors + Licensed on the terms of The Artistic License 2.0 + + Node package dependencies of the npm application + Copyright (c) their respective copyright owners + Licensed on their respective license terms + + The npm public registry at https://registry.npmjs.org + and the npm website at https://www.npmjs.com + Operated by npm, Inc. + Use governed by terms published on https://www.npmjs.com + + "Node.js" + Trademark Joyent, Inc., https://joyent.com + Neither npm nor npm, Inc. are affiliated with Joyent, Inc. + + The Node.js application + Project of Node Foundation, https://nodejs.org + + The npm Logo + Copyright (c) Mathias Pettersson and Brian Hammond + + "Gubblebum Blocky" typeface + Copyright (c) Tjarda Koster, https://jelloween.deviantart.com + Used with permission + + -------- + + The Artistic License 2.0 + + Copyright (c) 2000-2006, The Perl Foundation. + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + This license establishes the terms under which a given free software + Package may be copied, modified, distributed, and/or redistributed. + The intent is that the Copyright Holder maintains some artistic + control over the development of that Package while still keeping the + Package available as open source and free software. + + You are always permitted to make arrangements wholly outside of this + license directly with the Copyright Holder of a given Package. If the + terms of this license do not permit the full use that you propose to + make of the Package, you should contact the Copyright Holder and seek + a different licensing arrangement. + + Definitions + + "Copyright Holder" means the individual(s) or organization(s) + named in the copyright notice for the entire Package. + + "Contributor" means any party that has contributed code or other + material to the Package, in accordance with the Copyright Holder's + procedures. + + "You" and "your" means any person who would like to copy, + distribute, or modify the Package. + + "Package" means the collection of files distributed by the + Copyright Holder, and derivatives of that collection and/or of + those files. A given Package may consist of either the Standard + Version, or a Modified Version. + + "Distribute" means providing a copy of the Package or making it + accessible to anyone else, or in the case of a company or + organization, to others outside of your company or organization. + + "Distributor Fee" means any fee that you charge for Distributing + this Package or providing support for this Package to another + party. It does not mean licensing fees. + + "Standard Version" refers to the Package if it has not been + modified, or has been modified only in ways explicitly requested + by the Copyright Holder. + + "Modified Version" means the Package, if it has been changed, and + such changes were not explicitly requested by the Copyright + Holder. + + "Original License" means this Artistic License as Distributed with + the Standard Version of the Package, in its current version or as + it may be modified by The Perl Foundation in the future. + + "Source" form means the source code, documentation source, and + configuration files for the Package. + + "Compiled" form means the compiled bytecode, object code, binary, + or any other form resulting from mechanical transformation or + translation of the Source form. + + Permission for Use and Modification Without Distribution + + (1) You are permitted to use the Standard Version and create and use + Modified Versions for any purpose without restriction, provided that + you do not Distribute the Modified Version. + + Permissions for Redistribution of the Standard Version + + (2) You may Distribute verbatim copies of the Source form of the + Standard Version of this Package in any medium without restriction, + either gratis or for a Distributor Fee, provided that you duplicate + all of the original copyright notices and associated disclaimers. At + your discretion, such verbatim copies may or may not include a + Compiled form of the Package. + + (3) You may apply any bug fixes, portability changes, and other + modifications made available from the Copyright Holder. The resulting + Package will still be considered the Standard Version, and as such + will be subject to the Original License. + + Distribution of Modified Versions of the Package as Source + + (4) You may Distribute your Modified Version as Source (either gratis + or for a Distributor Fee, and with or without a Compiled form of the + Modified Version) provided that you clearly document how it differs + from the Standard Version, including, but not limited to, documenting + any non-standard features, executables, or modules, and provided that + you do at least ONE of the following: + + (a) make the Modified Version available to the Copyright Holder + of the Standard Version, under the Original License, so that the + Copyright Holder may include your modifications in the Standard + Version. + + (b) ensure that installation of your Modified Version does not + prevent the user installing or running the Standard Version. In + addition, the Modified Version must bear a name that is different + from the name of the Standard Version. + + (c) allow anyone who receives a copy of the Modified Version to + make the Source form of the Modified Version available to others + under + + (i) the Original License or + + (ii) a license that permits the licensee to freely copy, + modify and redistribute the Modified Version using the same + licensing terms that apply to the copy that the licensee + received, and requires that the Source form of the Modified + Version, and of any works derived from it, be made freely + available in that license fees are prohibited but Distributor + Fees are allowed. + + Distribution of Compiled Forms of the Standard Version + or Modified Versions without the Source + + (5) You may Distribute Compiled forms of the Standard Version without + the Source, provided that you include complete instructions on how to + get the Source of the Standard Version. Such instructions must be + valid at the time of your distribution. If these instructions, at any + time while you are carrying out such distribution, become invalid, you + must provide new instructions on demand or cease further distribution. + If you provide valid instructions or cease distribution within thirty + days after you become aware that the instructions are invalid, then + you do not forfeit any of your rights under this license. + + (6) You may Distribute a Modified Version in Compiled form without + the Source, provided that you comply with Section 4 with respect to + the Source of the Modified Version. + + Aggregating or Linking the Package + + (7) You may aggregate the Package (either the Standard Version or + Modified Version) with other packages and Distribute the resulting + aggregation provided that you do not charge a licensing fee for the + Package. Distributor Fees are permitted, and licensing fees for other + components in the aggregation are permitted. The terms of this license + apply to the use and Distribution of the Standard or Modified Versions + as included in the aggregation. + + (8) You are permitted to link Modified and Standard Versions with + other works, to embed the Package in a larger work of your own, or to + build stand-alone binary or bytecode versions of applications that + include the Package, and Distribute the result without restriction, + provided the result does not expose a direct interface to the Package. + + Items That are Not Considered Part of a Modified Version + + (9) Works (including, but not limited to, modules and scripts) that + merely extend or make use of the Package, do not, by themselves, cause + the Package to be a Modified Version. In addition, such works are not + considered parts of the Package itself, and are not subject to the + terms of this license. + + General Provisions + + (10) Any use, modification, and distribution of the Standard or + Modified Versions is governed by this Artistic License. By using, + modifying or distributing the Package, you accept this license. Do not + use, modify, or distribute the Package, if you do not accept this + license. + + (11) If your Modified Version has been derived from a Modified + Version made by someone other than you, you are nevertheless required + to ensure that your Modified Version complies with the requirements of + this license. + + (12) This license does not grant you the right to use any trademark, + service mark, tradename, or logo of the Copyright Holder. + + (13) This license includes the non-exclusive, worldwide, + free-of-charge patent license to make, have made, use, offer to sell, + sell, import and otherwise transfer the Package with respect to any + patent claims licensable by the Copyright Holder that are necessarily + infringed by the Package. If you institute patent litigation + (including a cross-claim or counterclaim) against any party alleging + that the Package constitutes direct or contributory patent + infringement, then this Artistic License to you shall terminate on the + date that such litigation is filed. + + (14) Disclaimer of Warranty: + THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS + IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR + NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL + LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL + BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL + DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF + ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + -------- + """ + +- GYP, located at tools/gyp, is licensed as follows: + """ + Copyright (c) 2009 Google Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + """ + +- marked, located at tools/doc/node_modules/marked, is licensed as follows: + """ + Copyright (c) 2011-2014, Christopher Jeffrey (https://github.com/chjj/) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + """ + +- cpplint.py, located at tools/cpplint.py, is licensed as follows: + """ + Copyright (c) 2009 Google Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + """ + +- ESLint, located at tools/eslint, is licensed as follows: + """ + ESLint + Copyright jQuery Foundation and other contributors, https://jquery.org/ + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + """ + +- gtest, located at deps/gtest, is licensed as follows: + """ + Copyright 2008, Google Inc. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + """ diff --git a/lwnode/apps/sqlite3/MAINTAINERS.md b/lwnode/apps/sqlite3/MAINTAINERS.md new file mode 100644 index 0000000..bf59075 --- /dev/null +++ b/lwnode/apps/sqlite3/MAINTAINERS.md @@ -0,0 +1,9 @@ +# Maintainers +Maintainers in alphabetical order. + +``` +Ryan Hyun Choi +Daeyeon Jeong +Haesik Jun +Ho Sung Kim +``` diff --git a/lwnode/apps/sqlite3/README.md b/lwnode/apps/sqlite3/README.md new file mode 100644 index 0000000..c4c2940 --- /dev/null +++ b/lwnode/apps/sqlite3/README.md @@ -0,0 +1,96 @@ +# Node-Sqlite3 Service +Node-Sqlite3 is a pure JavaScript interface to libsqlite3, which allows a Web App to connect and +utilize a sqlite3 database. + +## Supported Platforms +* Ubuntu 18.04, 16.04 +* Tizen 4.0 and above + +## Update submodule +```sh +git submodule update --init --recursive +``` + +## How to Run Tests +### Prerequisite +Set up a node environment on a Ubuntu machine. Then run: +```sh +npm install +npm run build:all +``` + +### Run +```sh +npm run test +``` + +### Analyze line coverage +```sh +npm run coverage +``` + +## How to Compile: Ubuntu +### Prerequisite +Set up a node environment on a Ubuntu machine. Then run: +```sh +npm install +npm run build:all +``` + +### Run +The following environment variables can be set: +* DB_STORE: it is a directory where libsqlite3 DBs are to be read and written. +* DEBUG: (optional) it displays packets sent and received from the backend. +```sh +export DB_STORE='/path/to/DB/store' +// export DEBUG="rpc:*,sql:*,api:*" +npm run start +``` + +```sh +export DB_STORE='/path/to/DB/store' +cp sample/script/test/support/*.db $DB_STORE // copy sample dbs used by testcases +google-chrome sample/index.html +``` + +## How to Compile: Tizen +### Prerequisite +Set up a node environment on a Ubuntu machine. Then run: +```sh +npm install +npm run build:all +``` + +### Build a wgt package +```sh +npm run build +./tools/buildwgt.sh +``` +### Build rpms +```sh +gbs -c ./packaging/gbs.conf build -A armv7l --incremental --include-all --define 'build_native true' +``` + +### Install the .wgt and .rpm +Copy ``.wgt`` and ``.rpm`` to a target device. Then, run: +```sh +rpm -Uvh node-sqlite3-ep-1.0.0-1.armv7l.rpm --force --nodeps +pkgcmd -i -t wgt -p sqlite3.wgt +``` + +### Run the Web App +The node service starts automatically when it is installed. +Only the Web app needs to be started manually. +The Web app runs a set of libsqlite3 testcases. + +```sh +app_launcher -s OwOD84MFBg.sqlite3 +``` + +To print node-sqlite3 service log, run: +```sh +dlogutil NODE_CONSOLE +``` + +## Maintainers +A list of maintainers can be found in [MAINTAINERS.md](MAINTAINERS.md). diff --git a/lwnode/apps/sqlite3/build/build.sh b/lwnode/apps/sqlite3/build/build.sh new file mode 100755 index 0000000..ed63a20 --- /dev/null +++ b/lwnode/apps/sqlite3/build/build.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +# Copyright (c) 2022-present Samsung Electronics Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +echo -e "\033[0;33m"build sqlite3"\033[0m" + +rm -rf $BUILD_OUT_PATH +mkdir -p $BUILD_OUT_PATH + +# build native module +echo -e "\033[0;32m"build native module"\033[0m" +cmake $APP_PATH -B$BUILD_OUT_PATH -H$APP_PATH -G Ninja +ninja -C $BUILD_OUT_PATH + +# copy native module +echo -e "\033[0;32m"copy native module"\033[0m" +mkdir -p $APP_PATH/node_modules/sqlite3/lib/binding/napi-v3-linux-arm +cp -f $BUILD_OUT_PATH/node_sqlite3.node $APP_PATH/node_modules/sqlite3/lib/binding/napi-v3-linux-arm/ + +# zip node_modules +echo -e "\033[0;32m"zip node_modules"\033[0m" +SQLITE3_SCRIPT_DIR=$BUILD_OUT_PATH/script +mkdir -p $SQLITE3_SCRIPT_DIR +cd $APP_PATH + +find node_modules | rsync -avmL --delete --delete-excluded --filter="merge tools/sqlite3-filter.txt" --files-from=- ./ $SQLITE3_SCRIPT_DIR + +cp -rf download $SQLITE3_SCRIPT_DIR +cp -rf out/backend/* $SQLITE3_SCRIPT_DIR # *.js files should have been generated +mkdir -p $BUILD_OUT_PATH/script + +cd $BUILD_OUT_PATH +zip -r script.zip ./script/* +cd - + +cd - + diff --git a/lwnode/apps/sqlite3/build/install.sh b/lwnode/apps/sqlite3/build/install.sh new file mode 100755 index 0000000..0ffb6b9 --- /dev/null +++ b/lwnode/apps/sqlite3/build/install.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Copyright (c) 2022-present Samsung Electronics Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +echo -e "\033[0;33m"install"\033[0m" + +cp -f $BUILD_OUT_PATH/script.zip $FILES_PATH diff --git a/lwnode/apps/sqlite3/build/post.sh b/lwnode/apps/sqlite3/build/post.sh new file mode 100755 index 0000000..446d503 --- /dev/null +++ b/lwnode/apps/sqlite3/build/post.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Copyright (c) 2022-present Samsung Electronics Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +rm -rf $APP_PATH/script + +echo -e "\033[0;33m"unzip script"\033[0m" +unzip -q $FILES_PATH/script.zip -d $APP_PATH +if [ $? != 0 ];then + echo -e "\033[0;31m"fail to unzip script"\033[0m" +fi +rm $FILES_PATH/script.zip + diff --git a/lwnode/apps/sqlite3/build/sqlite3.manifest b/lwnode/apps/sqlite3/build/sqlite3.manifest new file mode 100644 index 0000000..f5a44ec --- /dev/null +++ b/lwnode/apps/sqlite3/build/sqlite3.manifest @@ -0,0 +1,5 @@ + + + + + diff --git a/lwnode/apps/sqlite3/deps/include/js_native_api.h b/lwnode/apps/sqlite3/deps/include/js_native_api.h new file mode 100644 index 0000000..5daa20f --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/js_native_api.h @@ -0,0 +1,561 @@ +#ifndef SRC_JS_NATIVE_API_H_ +#define SRC_JS_NATIVE_API_H_ + +// This file needs to be compatible with C compilers. +#include // NOLINT(modernize-deprecated-headers) +#include // NOLINT(modernize-deprecated-headers) + +// Use INT_MAX, this should only be consumed by the pre-processor anyway. +#define NAPI_VERSION_EXPERIMENTAL 2147483647 +#ifndef NAPI_VERSION +#ifdef NAPI_EXPERIMENTAL +#define NAPI_VERSION NAPI_VERSION_EXPERIMENTAL +#else +// The baseline version for N-API. +// The NAPI_VERSION controls which version will be used by default when +// compilling a native addon. If the addon developer specifically wants to use +// functions available in a new version of N-API that is not yet ported in all +// LTS versions, they can set NAPI_VERSION knowing that they have specifically +// depended on that version. +#define NAPI_VERSION 7 +#endif +#endif + +#include "js_native_api_types.h" + +// If you need __declspec(dllimport), either include instead, or +// define NAPI_EXTERN as __declspec(dllimport) on the compiler's command line. +#ifndef NAPI_EXTERN + #ifdef _WIN32 + #define NAPI_EXTERN __declspec(dllexport) + #elif defined(__wasm32__) + #define NAPI_EXTERN __attribute__((visibility("default"))) \ + __attribute__((__import_module__("napi"))) + #else + #define NAPI_EXTERN __attribute__((visibility("default"))) + #endif +#endif + +#define NAPI_AUTO_LENGTH SIZE_MAX + +#ifdef __cplusplus +#define EXTERN_C_START extern "C" { +#define EXTERN_C_END } +#else +#define EXTERN_C_START +#define EXTERN_C_END +#endif + +EXTERN_C_START + +NAPI_EXTERN napi_status +napi_get_last_error_info(napi_env env, + const napi_extended_error_info** result); + +// Getters for defined singletons +NAPI_EXTERN napi_status napi_get_undefined(napi_env env, napi_value* result); +NAPI_EXTERN napi_status napi_get_null(napi_env env, napi_value* result); +NAPI_EXTERN napi_status napi_get_global(napi_env env, napi_value* result); +NAPI_EXTERN napi_status napi_get_boolean(napi_env env, + bool value, + napi_value* result); + +// Methods to create Primitive types/Objects +NAPI_EXTERN napi_status napi_create_object(napi_env env, napi_value* result); +NAPI_EXTERN napi_status napi_create_array(napi_env env, napi_value* result); +NAPI_EXTERN napi_status napi_create_array_with_length(napi_env env, + size_t length, + napi_value* result); +NAPI_EXTERN napi_status napi_create_double(napi_env env, + double value, + napi_value* result); +NAPI_EXTERN napi_status napi_create_int32(napi_env env, + int32_t value, + napi_value* result); +NAPI_EXTERN napi_status napi_create_uint32(napi_env env, + uint32_t value, + napi_value* result); +NAPI_EXTERN napi_status napi_create_int64(napi_env env, + int64_t value, + napi_value* result); +NAPI_EXTERN napi_status napi_create_string_latin1(napi_env env, + const char* str, + size_t length, + napi_value* result); +NAPI_EXTERN napi_status napi_create_string_utf8(napi_env env, + const char* str, + size_t length, + napi_value* result); +NAPI_EXTERN napi_status napi_create_string_utf16(napi_env env, + const char16_t* str, + size_t length, + napi_value* result); +NAPI_EXTERN napi_status napi_create_symbol(napi_env env, + napi_value description, + napi_value* result); +NAPI_EXTERN napi_status napi_create_function(napi_env env, + const char* utf8name, + size_t length, + napi_callback cb, + void* data, + napi_value* result); +NAPI_EXTERN napi_status napi_create_error(napi_env env, + napi_value code, + napi_value msg, + napi_value* result); +NAPI_EXTERN napi_status napi_create_type_error(napi_env env, + napi_value code, + napi_value msg, + napi_value* result); +NAPI_EXTERN napi_status napi_create_range_error(napi_env env, + napi_value code, + napi_value msg, + napi_value* result); + +// Methods to get the native napi_value from Primitive type +NAPI_EXTERN napi_status napi_typeof(napi_env env, + napi_value value, + napi_valuetype* result); +NAPI_EXTERN napi_status napi_get_value_double(napi_env env, + napi_value value, + double* result); +NAPI_EXTERN napi_status napi_get_value_int32(napi_env env, + napi_value value, + int32_t* result); +NAPI_EXTERN napi_status napi_get_value_uint32(napi_env env, + napi_value value, + uint32_t* result); +NAPI_EXTERN napi_status napi_get_value_int64(napi_env env, + napi_value value, + int64_t* result); +NAPI_EXTERN napi_status napi_get_value_bool(napi_env env, + napi_value value, + bool* result); + +// Copies LATIN-1 encoded bytes from a string into a buffer. +NAPI_EXTERN napi_status napi_get_value_string_latin1(napi_env env, + napi_value value, + char* buf, + size_t bufsize, + size_t* result); + +// Copies UTF-8 encoded bytes from a string into a buffer. +NAPI_EXTERN napi_status napi_get_value_string_utf8(napi_env env, + napi_value value, + char* buf, + size_t bufsize, + size_t* result); + +// Copies UTF-16 encoded bytes from a string into a buffer. +NAPI_EXTERN napi_status napi_get_value_string_utf16(napi_env env, + napi_value value, + char16_t* buf, + size_t bufsize, + size_t* result); + +// Methods to coerce values +// These APIs may execute user scripts +NAPI_EXTERN napi_status napi_coerce_to_bool(napi_env env, + napi_value value, + napi_value* result); +NAPI_EXTERN napi_status napi_coerce_to_number(napi_env env, + napi_value value, + napi_value* result); +NAPI_EXTERN napi_status napi_coerce_to_object(napi_env env, + napi_value value, + napi_value* result); +NAPI_EXTERN napi_status napi_coerce_to_string(napi_env env, + napi_value value, + napi_value* result); + +// Methods to work with Objects +NAPI_EXTERN napi_status napi_get_prototype(napi_env env, + napi_value object, + napi_value* result); +NAPI_EXTERN napi_status napi_get_property_names(napi_env env, + napi_value object, + napi_value* result); +NAPI_EXTERN napi_status napi_set_property(napi_env env, + napi_value object, + napi_value key, + napi_value value); +NAPI_EXTERN napi_status napi_has_property(napi_env env, + napi_value object, + napi_value key, + bool* result); +NAPI_EXTERN napi_status napi_get_property(napi_env env, + napi_value object, + napi_value key, + napi_value* result); +NAPI_EXTERN napi_status napi_delete_property(napi_env env, + napi_value object, + napi_value key, + bool* result); +NAPI_EXTERN napi_status napi_has_own_property(napi_env env, + napi_value object, + napi_value key, + bool* result); +NAPI_EXTERN napi_status napi_set_named_property(napi_env env, + napi_value object, + const char* utf8name, + napi_value value); +NAPI_EXTERN napi_status napi_has_named_property(napi_env env, + napi_value object, + const char* utf8name, + bool* result); +NAPI_EXTERN napi_status napi_get_named_property(napi_env env, + napi_value object, + const char* utf8name, + napi_value* result); +NAPI_EXTERN napi_status napi_set_element(napi_env env, + napi_value object, + uint32_t index, + napi_value value); +NAPI_EXTERN napi_status napi_has_element(napi_env env, + napi_value object, + uint32_t index, + bool* result); +NAPI_EXTERN napi_status napi_get_element(napi_env env, + napi_value object, + uint32_t index, + napi_value* result); +NAPI_EXTERN napi_status napi_delete_element(napi_env env, + napi_value object, + uint32_t index, + bool* result); +NAPI_EXTERN napi_status +napi_define_properties(napi_env env, + napi_value object, + size_t property_count, + const napi_property_descriptor* properties); + +// Methods to work with Arrays +NAPI_EXTERN napi_status napi_is_array(napi_env env, + napi_value value, + bool* result); +NAPI_EXTERN napi_status napi_get_array_length(napi_env env, + napi_value value, + uint32_t* result); + +// Methods to compare values +NAPI_EXTERN napi_status napi_strict_equals(napi_env env, + napi_value lhs, + napi_value rhs, + bool* result); + +// Methods to work with Functions +NAPI_EXTERN napi_status napi_call_function(napi_env env, + napi_value recv, + napi_value func, + size_t argc, + const napi_value* argv, + napi_value* result); +NAPI_EXTERN napi_status napi_new_instance(napi_env env, + napi_value constructor, + size_t argc, + const napi_value* argv, + napi_value* result); +NAPI_EXTERN napi_status napi_instanceof(napi_env env, + napi_value object, + napi_value constructor, + bool* result); + +// Methods to work with napi_callbacks + +// Gets all callback info in a single call. (Ugly, but faster.) +NAPI_EXTERN napi_status napi_get_cb_info( + napi_env env, // [in] NAPI environment handle + napi_callback_info cbinfo, // [in] Opaque callback-info handle + size_t* argc, // [in-out] Specifies the size of the provided argv array + // and receives the actual count of args. + napi_value* argv, // [out] Array of values + napi_value* this_arg, // [out] Receives the JS 'this' arg for the call + void** data); // [out] Receives the data pointer for the callback. + +NAPI_EXTERN napi_status napi_get_new_target(napi_env env, + napi_callback_info cbinfo, + napi_value* result); +NAPI_EXTERN napi_status +napi_define_class(napi_env env, + const char* utf8name, + size_t length, + napi_callback constructor, + void* data, + size_t property_count, + const napi_property_descriptor* properties, + napi_value* result); + +// Methods to work with external data objects +NAPI_EXTERN napi_status napi_wrap(napi_env env, + napi_value js_object, + void* native_object, + napi_finalize finalize_cb, + void* finalize_hint, + napi_ref* result); +NAPI_EXTERN napi_status napi_unwrap(napi_env env, + napi_value js_object, + void** result); +NAPI_EXTERN napi_status napi_remove_wrap(napi_env env, + napi_value js_object, + void** result); +NAPI_EXTERN napi_status napi_create_external(napi_env env, + void* data, + napi_finalize finalize_cb, + void* finalize_hint, + napi_value* result); +NAPI_EXTERN napi_status napi_get_value_external(napi_env env, + napi_value value, + void** result); + +// Methods to control object lifespan + +// Set initial_refcount to 0 for a weak reference, >0 for a strong reference. +NAPI_EXTERN napi_status napi_create_reference(napi_env env, + napi_value value, + uint32_t initial_refcount, + napi_ref* result); + +// Deletes a reference. The referenced value is released, and may +// be GC'd unless there are other references to it. +NAPI_EXTERN napi_status napi_delete_reference(napi_env env, napi_ref ref); + +// Increments the reference count, optionally returning the resulting count. +// After this call the reference will be a strong reference because its +// refcount is >0, and the referenced object is effectively "pinned". +// Calling this when the refcount is 0 and the object is unavailable +// results in an error. +NAPI_EXTERN napi_status napi_reference_ref(napi_env env, + napi_ref ref, + uint32_t* result); + +// Decrements the reference count, optionally returning the resulting count. +// If the result is 0 the reference is now weak and the object may be GC'd +// at any time if there are no other references. Calling this when the +// refcount is already 0 results in an error. +NAPI_EXTERN napi_status napi_reference_unref(napi_env env, + napi_ref ref, + uint32_t* result); + +// Attempts to get a referenced value. If the reference is weak, +// the value might no longer be available, in that case the call +// is still successful but the result is NULL. +NAPI_EXTERN napi_status napi_get_reference_value(napi_env env, + napi_ref ref, + napi_value* result); + +NAPI_EXTERN napi_status napi_open_handle_scope(napi_env env, + napi_handle_scope* result); +NAPI_EXTERN napi_status napi_close_handle_scope(napi_env env, + napi_handle_scope scope); +NAPI_EXTERN napi_status +napi_open_escapable_handle_scope(napi_env env, + napi_escapable_handle_scope* result); +NAPI_EXTERN napi_status +napi_close_escapable_handle_scope(napi_env env, + napi_escapable_handle_scope scope); + +NAPI_EXTERN napi_status napi_escape_handle(napi_env env, + napi_escapable_handle_scope scope, + napi_value escapee, + napi_value* result); + +// Methods to support error handling +NAPI_EXTERN napi_status napi_throw(napi_env env, napi_value error); +NAPI_EXTERN napi_status napi_throw_error(napi_env env, + const char* code, + const char* msg); +NAPI_EXTERN napi_status napi_throw_type_error(napi_env env, + const char* code, + const char* msg); +NAPI_EXTERN napi_status napi_throw_range_error(napi_env env, + const char* code, + const char* msg); +NAPI_EXTERN napi_status napi_is_error(napi_env env, + napi_value value, + bool* result); + +// Methods to support catching exceptions +NAPI_EXTERN napi_status napi_is_exception_pending(napi_env env, bool* result); +NAPI_EXTERN napi_status napi_get_and_clear_last_exception(napi_env env, + napi_value* result); + +// Methods to work with array buffers and typed arrays +NAPI_EXTERN napi_status napi_is_arraybuffer(napi_env env, + napi_value value, + bool* result); +NAPI_EXTERN napi_status napi_create_arraybuffer(napi_env env, + size_t byte_length, + void** data, + napi_value* result); +NAPI_EXTERN napi_status +napi_create_external_arraybuffer(napi_env env, + void* external_data, + size_t byte_length, + napi_finalize finalize_cb, + void* finalize_hint, + napi_value* result); +NAPI_EXTERN napi_status napi_get_arraybuffer_info(napi_env env, + napi_value arraybuffer, + void** data, + size_t* byte_length); +NAPI_EXTERN napi_status napi_is_typedarray(napi_env env, + napi_value value, + bool* result); +NAPI_EXTERN napi_status napi_create_typedarray(napi_env env, + napi_typedarray_type type, + size_t length, + napi_value arraybuffer, + size_t byte_offset, + napi_value* result); +NAPI_EXTERN napi_status napi_get_typedarray_info(napi_env env, + napi_value typedarray, + napi_typedarray_type* type, + size_t* length, + void** data, + napi_value* arraybuffer, + size_t* byte_offset); + +NAPI_EXTERN napi_status napi_create_dataview(napi_env env, + size_t length, + napi_value arraybuffer, + size_t byte_offset, + napi_value* result); +NAPI_EXTERN napi_status napi_is_dataview(napi_env env, + napi_value value, + bool* result); +NAPI_EXTERN napi_status napi_get_dataview_info(napi_env env, + napi_value dataview, + size_t* bytelength, + void** data, + napi_value* arraybuffer, + size_t* byte_offset); + +// version management +NAPI_EXTERN napi_status napi_get_version(napi_env env, uint32_t* result); + +// Promises +NAPI_EXTERN napi_status napi_create_promise(napi_env env, + napi_deferred* deferred, + napi_value* promise); +NAPI_EXTERN napi_status napi_resolve_deferred(napi_env env, + napi_deferred deferred, + napi_value resolution); +NAPI_EXTERN napi_status napi_reject_deferred(napi_env env, + napi_deferred deferred, + napi_value rejection); +NAPI_EXTERN napi_status napi_is_promise(napi_env env, + napi_value value, + bool* is_promise); + +// Running a script +NAPI_EXTERN napi_status napi_run_script(napi_env env, + napi_value script, + napi_value* result); + +// Memory management +NAPI_EXTERN napi_status napi_adjust_external_memory(napi_env env, + int64_t change_in_bytes, + int64_t* adjusted_value); + +#if NAPI_VERSION >= 5 + +// Dates +NAPI_EXTERN napi_status napi_create_date(napi_env env, + double time, + napi_value* result); + +NAPI_EXTERN napi_status napi_is_date(napi_env env, + napi_value value, + bool* is_date); + +NAPI_EXTERN napi_status napi_get_date_value(napi_env env, + napi_value value, + double* result); + +// Add finalizer for pointer +NAPI_EXTERN napi_status napi_add_finalizer(napi_env env, + napi_value js_object, + void* native_object, + napi_finalize finalize_cb, + void* finalize_hint, + napi_ref* result); + +#endif // NAPI_VERSION >= 5 + +#if NAPI_VERSION >= 6 + +// BigInt +NAPI_EXTERN napi_status napi_create_bigint_int64(napi_env env, + int64_t value, + napi_value* result); +NAPI_EXTERN napi_status napi_create_bigint_uint64(napi_env env, + uint64_t value, + napi_value* result); +NAPI_EXTERN napi_status napi_create_bigint_words(napi_env env, + int sign_bit, + size_t word_count, + const uint64_t* words, + napi_value* result); +NAPI_EXTERN napi_status napi_get_value_bigint_int64(napi_env env, + napi_value value, + int64_t* result, + bool* lossless); +NAPI_EXTERN napi_status napi_get_value_bigint_uint64(napi_env env, + napi_value value, + uint64_t* result, + bool* lossless); +NAPI_EXTERN napi_status napi_get_value_bigint_words(napi_env env, + napi_value value, + int* sign_bit, + size_t* word_count, + uint64_t* words); + +// Object +NAPI_EXTERN napi_status +napi_get_all_property_names(napi_env env, + napi_value object, + napi_key_collection_mode key_mode, + napi_key_filter key_filter, + napi_key_conversion key_conversion, + napi_value* result); + +// Instance data +NAPI_EXTERN napi_status napi_set_instance_data(napi_env env, + void* data, + napi_finalize finalize_cb, + void* finalize_hint); + +NAPI_EXTERN napi_status napi_get_instance_data(napi_env env, + void** data); +#endif // NAPI_VERSION >= 6 + +#if NAPI_VERSION >= 7 +// ArrayBuffer detaching +NAPI_EXTERN napi_status napi_detach_arraybuffer(napi_env env, + napi_value arraybuffer); + +NAPI_EXTERN napi_status napi_is_detached_arraybuffer(napi_env env, + napi_value value, + bool* result); +#endif // NAPI_VERSION >= 7 + +#ifdef NAPI_EXPERIMENTAL +// Type tagging +NAPI_EXTERN napi_status napi_type_tag_object(napi_env env, + napi_value value, + const napi_type_tag* type_tag); + +NAPI_EXTERN napi_status +napi_check_object_type_tag(napi_env env, + napi_value value, + const napi_type_tag* type_tag, + bool* result); +NAPI_EXTERN napi_status napi_object_freeze(napi_env env, + napi_value object); +NAPI_EXTERN napi_status napi_object_seal(napi_env env, + napi_value object); +#endif // NAPI_EXPERIMENTAL + +EXTERN_C_END + +#endif // SRC_JS_NATIVE_API_H_ diff --git a/lwnode/apps/sqlite3/deps/include/js_native_api_types.h b/lwnode/apps/sqlite3/deps/include/js_native_api_types.h new file mode 100644 index 0000000..7011c80 --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/js_native_api_types.h @@ -0,0 +1,160 @@ +#ifndef SRC_JS_NATIVE_API_TYPES_H_ +#define SRC_JS_NATIVE_API_TYPES_H_ + +// This file needs to be compatible with C compilers. +// This is a public include file, and these includes have essentially +// became part of it's API. +#include // NOLINT(modernize-deprecated-headers) +#include // NOLINT(modernize-deprecated-headers) + +#if !defined __cplusplus || (defined(_MSC_VER) && _MSC_VER < 1900) + typedef uint16_t char16_t; +#endif + +// JSVM API types are all opaque pointers for ABI stability +// typedef undefined structs instead of void* for compile time type safety +typedef struct napi_env__* napi_env; +typedef struct napi_value__* napi_value; +typedef struct napi_ref__* napi_ref; +typedef struct napi_handle_scope__* napi_handle_scope; +typedef struct napi_escapable_handle_scope__* napi_escapable_handle_scope; +typedef struct napi_callback_info__* napi_callback_info; +typedef struct napi_deferred__* napi_deferred; + +typedef enum { + napi_default = 0, + napi_writable = 1 << 0, + napi_enumerable = 1 << 1, + napi_configurable = 1 << 2, + + // Used with napi_define_class to distinguish static properties + // from instance properties. Ignored by napi_define_properties. + napi_static = 1 << 10, + +#ifdef NAPI_EXPERIMENTAL + // Default for class methods. + napi_default_method = napi_writable | napi_configurable, + + // Default for object properties, like in JS obj[prop]. + napi_default_jsproperty = napi_writable | + napi_enumerable | + napi_configurable, +#endif // NAPI_EXPERIMENTAL +} napi_property_attributes; + +typedef enum { + // ES6 types (corresponds to typeof) + napi_undefined, + napi_null, + napi_boolean, + napi_number, + napi_string, + napi_symbol, + napi_object, + napi_function, + napi_external, + napi_bigint, +} napi_valuetype; + +typedef enum { + napi_int8_array, + napi_uint8_array, + napi_uint8_clamped_array, + napi_int16_array, + napi_uint16_array, + napi_int32_array, + napi_uint32_array, + napi_float32_array, + napi_float64_array, + napi_bigint64_array, + napi_biguint64_array, +} napi_typedarray_type; + +typedef enum { + napi_ok, + napi_invalid_arg, + napi_object_expected, + napi_string_expected, + napi_name_expected, + napi_function_expected, + napi_number_expected, + napi_boolean_expected, + napi_array_expected, + napi_generic_failure, + napi_pending_exception, + napi_cancelled, + napi_escape_called_twice, + napi_handle_scope_mismatch, + napi_callback_scope_mismatch, + napi_queue_full, + napi_closing, + napi_bigint_expected, + napi_date_expected, + napi_arraybuffer_expected, + napi_detachable_arraybuffer_expected, + napi_would_deadlock // unused +} napi_status; +// Note: when adding a new enum value to `napi_status`, please also update +// * `const int last_status` in the definition of `napi_get_last_error_info()' +// in file js_native_api_v8.cc. +// * `const char* error_messages[]` in file js_native_api_v8.cc with a brief +// message explaining the error. +// * the definition of `napi_status` in doc/api/n-api.md to reflect the newly +// added value(s). + +typedef napi_value (*napi_callback)(napi_env env, + napi_callback_info info); +typedef void (*napi_finalize)(napi_env env, + void* finalize_data, + void* finalize_hint); + +typedef struct { + // One of utf8name or name should be NULL. + const char* utf8name; + napi_value name; + + napi_callback method; + napi_callback getter; + napi_callback setter; + napi_value value; + + napi_property_attributes attributes; + void* data; +} napi_property_descriptor; + +typedef struct { + const char* error_message; + void* engine_reserved; + uint32_t engine_error_code; + napi_status error_code; +} napi_extended_error_info; + +#if NAPI_VERSION >= 6 +typedef enum { + napi_key_include_prototypes, + napi_key_own_only +} napi_key_collection_mode; + +typedef enum { + napi_key_all_properties = 0, + napi_key_writable = 1, + napi_key_enumerable = 1 << 1, + napi_key_configurable = 1 << 2, + napi_key_skip_strings = 1 << 3, + napi_key_skip_symbols = 1 << 4 +} napi_key_filter; + +typedef enum { + napi_key_keep_numbers, + napi_key_numbers_to_strings +} napi_key_conversion; +#endif // NAPI_VERSION >= 6 + +#ifdef NAPI_EXPERIMENTAL +typedef struct { + uint64_t lower; + uint64_t upper; +} napi_type_tag; +#endif // NAPI_EXPERIMENTAL + +#endif // SRC_JS_NATIVE_API_TYPES_H_ diff --git a/lwnode/apps/sqlite3/deps/include/napi-inl.deprecated.h b/lwnode/apps/sqlite3/deps/include/napi-inl.deprecated.h new file mode 100644 index 0000000..51e954c --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/napi-inl.deprecated.h @@ -0,0 +1,192 @@ +#ifndef SRC_NAPI_INL_DEPRECATED_H_ +#define SRC_NAPI_INL_DEPRECATED_H_ + +//////////////////////////////////////////////////////////////////////////////// +// PropertyDescriptor class +//////////////////////////////////////////////////////////////////////////////// + +template +inline PropertyDescriptor +PropertyDescriptor::Accessor(const char* utf8name, + Getter getter, + napi_property_attributes attributes, + void* /*data*/) { + using CbData = details::CallbackData; + // TODO: Delete when the function is destroyed + auto callbackData = new CbData({ getter, nullptr }); + + return PropertyDescriptor({ + utf8name, + nullptr, + nullptr, + CbData::Wrapper, + nullptr, + nullptr, + attributes, + callbackData + }); +} + +template +inline PropertyDescriptor PropertyDescriptor::Accessor(const std::string& utf8name, + Getter getter, + napi_property_attributes attributes, + void* data) { + return Accessor(utf8name.c_str(), getter, attributes, data); +} + +template +inline PropertyDescriptor PropertyDescriptor::Accessor(napi_value name, + Getter getter, + napi_property_attributes attributes, + void* /*data*/) { + using CbData = details::CallbackData; + // TODO: Delete when the function is destroyed + auto callbackData = new CbData({ getter, nullptr }); + + return PropertyDescriptor({ + nullptr, + name, + nullptr, + CbData::Wrapper, + nullptr, + nullptr, + attributes, + callbackData + }); +} + +template +inline PropertyDescriptor PropertyDescriptor::Accessor(Name name, + Getter getter, + napi_property_attributes attributes, + void* data) { + napi_value nameValue = name; + return PropertyDescriptor::Accessor(nameValue, getter, attributes, data); +} + +template +inline PropertyDescriptor PropertyDescriptor::Accessor(const char* utf8name, + Getter getter, + Setter setter, + napi_property_attributes attributes, + void* /*data*/) { + using CbData = details::AccessorCallbackData; + // TODO: Delete when the function is destroyed + auto callbackData = new CbData({ getter, setter, nullptr }); + + return PropertyDescriptor({ + utf8name, + nullptr, + nullptr, + CbData::GetterWrapper, + CbData::SetterWrapper, + nullptr, + attributes, + callbackData + }); +} + +template +inline PropertyDescriptor PropertyDescriptor::Accessor(const std::string& utf8name, + Getter getter, + Setter setter, + napi_property_attributes attributes, + void* data) { + return Accessor(utf8name.c_str(), getter, setter, attributes, data); +} + +template +inline PropertyDescriptor PropertyDescriptor::Accessor(napi_value name, + Getter getter, + Setter setter, + napi_property_attributes attributes, + void* /*data*/) { + using CbData = details::AccessorCallbackData; + // TODO: Delete when the function is destroyed + auto callbackData = new CbData({ getter, setter, nullptr }); + + return PropertyDescriptor({ + nullptr, + name, + nullptr, + CbData::GetterWrapper, + CbData::SetterWrapper, + nullptr, + attributes, + callbackData + }); +} + +template +inline PropertyDescriptor PropertyDescriptor::Accessor(Name name, + Getter getter, + Setter setter, + napi_property_attributes attributes, + void* data) { + napi_value nameValue = name; + return PropertyDescriptor::Accessor(nameValue, getter, setter, attributes, data); +} + +template +inline PropertyDescriptor PropertyDescriptor::Function(const char* utf8name, + Callable cb, + napi_property_attributes attributes, + void* /*data*/) { + using ReturnType = decltype(cb(CallbackInfo(nullptr, nullptr))); + using CbData = details::CallbackData; + // TODO: Delete when the function is destroyed + auto callbackData = new CbData({ cb, nullptr }); + + return PropertyDescriptor({ + utf8name, + nullptr, + CbData::Wrapper, + nullptr, + nullptr, + nullptr, + attributes, + callbackData + }); +} + +template +inline PropertyDescriptor PropertyDescriptor::Function(const std::string& utf8name, + Callable cb, + napi_property_attributes attributes, + void* data) { + return Function(utf8name.c_str(), cb, attributes, data); +} + +template +inline PropertyDescriptor PropertyDescriptor::Function(napi_value name, + Callable cb, + napi_property_attributes attributes, + void* /*data*/) { + using ReturnType = decltype(cb(CallbackInfo(nullptr, nullptr))); + using CbData = details::CallbackData; + // TODO: Delete when the function is destroyed + auto callbackData = new CbData({ cb, nullptr }); + + return PropertyDescriptor({ + nullptr, + name, + CbData::Wrapper, + nullptr, + nullptr, + nullptr, + attributes, + callbackData + }); +} + +template +inline PropertyDescriptor PropertyDescriptor::Function(Name name, + Callable cb, + napi_property_attributes attributes, + void* data) { + napi_value nameValue = name; + return PropertyDescriptor::Function(nameValue, cb, attributes, data); +} + +#endif // !SRC_NAPI_INL_DEPRECATED_H_ diff --git a/lwnode/apps/sqlite3/deps/include/napi-inl.h b/lwnode/apps/sqlite3/deps/include/napi-inl.h new file mode 100644 index 0000000..7e9dd72 --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/napi-inl.h @@ -0,0 +1,5671 @@ +#ifndef SRC_NAPI_INL_H_ +#define SRC_NAPI_INL_H_ + +//////////////////////////////////////////////////////////////////////////////// +// Node-API C++ Wrapper Classes +// +// Inline header-only implementations for "Node-API" ABI-stable C APIs for +// Node.js. +//////////////////////////////////////////////////////////////////////////////// + +// Note: Do not include this file directly! Include "napi.h" instead. + +#include +#include +#include +#include + +namespace Napi { + +// Helpers to handle functions exposed from C++. +namespace details { + +// Attach a data item to an object and delete it when the object gets +// garbage-collected. +// TODO: Replace this code with `napi_add_finalizer()` whenever it becomes +// available on all supported versions of Node.js. +template +static inline napi_status AttachData(napi_env env, + napi_value obj, + FreeType* data, + napi_finalize finalizer = nullptr, + void* hint = nullptr) { + napi_status status; + if (finalizer == nullptr) { + finalizer = [](napi_env /*env*/, void* data, void* /*hint*/) { + delete static_cast(data); + }; + } +#if (NAPI_VERSION < 5) + napi_value symbol, external; + status = napi_create_symbol(env, nullptr, &symbol); + if (status == napi_ok) { + status = napi_create_external(env, + data, + finalizer, + hint, + &external); + if (status == napi_ok) { + napi_property_descriptor desc = { + nullptr, + symbol, + nullptr, + nullptr, + nullptr, + external, + napi_default, + nullptr + }; + status = napi_define_properties(env, obj, 1, &desc); + } + } +#else // NAPI_VERSION >= 5 + status = napi_add_finalizer(env, obj, data, finalizer, hint, nullptr); +#endif + return status; +} + +// For use in JS to C++ callback wrappers to catch any Napi::Error exceptions +// and rethrow them as JavaScript exceptions before returning from the callback. +template +inline napi_value WrapCallback(Callable callback) { +#ifdef NAPI_CPP_EXCEPTIONS + try { + return callback(); + } catch (const Error& e) { + e.ThrowAsJavaScriptException(); + return nullptr; + } +#else // NAPI_CPP_EXCEPTIONS + // When C++ exceptions are disabled, errors are immediately thrown as JS + // exceptions, so there is no need to catch and rethrow them here. + return callback(); +#endif // NAPI_CPP_EXCEPTIONS +} + +// For use in JS to C++ void callback wrappers to catch any Napi::Error +// exceptions and rethrow them as JavaScript exceptions before returning from the +// callback. +template +inline void WrapVoidCallback(Callable callback) { +#ifdef NAPI_CPP_EXCEPTIONS + try { + callback(); + } catch (const Error& e) { + e.ThrowAsJavaScriptException(); + } +#else // NAPI_CPP_EXCEPTIONS + // When C++ exceptions are disabled, errors are immediately thrown as JS + // exceptions, so there is no need to catch and rethrow them here. + callback(); +#endif // NAPI_CPP_EXCEPTIONS +} + +template +struct CallbackData { + static inline + napi_value Wrapper(napi_env env, napi_callback_info info) { + return details::WrapCallback([&] { + CallbackInfo callbackInfo(env, info); + CallbackData* callbackData = + static_cast(callbackInfo.Data()); + callbackInfo.SetData(callbackData->data); + return callbackData->callback(callbackInfo); + }); + } + + Callable callback; + void* data; +}; + +template +struct CallbackData { + static inline + napi_value Wrapper(napi_env env, napi_callback_info info) { + return details::WrapCallback([&] { + CallbackInfo callbackInfo(env, info); + CallbackData* callbackData = + static_cast(callbackInfo.Data()); + callbackInfo.SetData(callbackData->data); + callbackData->callback(callbackInfo); + return nullptr; + }); + } + + Callable callback; + void* data; +}; + +template +static napi_value +TemplatedVoidCallback(napi_env env, napi_callback_info info) NAPI_NOEXCEPT { + return details::WrapCallback([&] { + CallbackInfo cbInfo(env, info); + Callback(cbInfo); + return nullptr; + }); +} + +template +static napi_value +TemplatedCallback(napi_env env, napi_callback_info info) NAPI_NOEXCEPT { + return details::WrapCallback([&] { + CallbackInfo cbInfo(env, info); + return Callback(cbInfo); + }); +} + +template +static napi_value +TemplatedInstanceCallback(napi_env env, napi_callback_info info) NAPI_NOEXCEPT { + return details::WrapCallback([&] { + CallbackInfo cbInfo(env, info); + T* instance = T::Unwrap(cbInfo.This().As()); + return (instance->*UnwrapCallback)(cbInfo); + }); +} + +template +static napi_value +TemplatedInstanceVoidCallback(napi_env env, + napi_callback_info info) NAPI_NOEXCEPT { + return details::WrapCallback([&] { + CallbackInfo cbInfo(env, info); + T* instance = T::Unwrap(cbInfo.This().As()); + (instance->*UnwrapCallback)(cbInfo); + return nullptr; + }); +} + +template +struct FinalizeData { + static inline void Wrapper(napi_env env, + void* data, + void* finalizeHint) NAPI_NOEXCEPT { + WrapVoidCallback([&] { + FinalizeData* finalizeData = static_cast(finalizeHint); + finalizeData->callback(Env(env), static_cast(data)); + delete finalizeData; + }); + } + + static inline void WrapperWithHint(napi_env env, + void* data, + void* finalizeHint) NAPI_NOEXCEPT { + WrapVoidCallback([&] { + FinalizeData* finalizeData = static_cast(finalizeHint); + finalizeData->callback(Env(env), static_cast(data), finalizeData->hint); + delete finalizeData; + }); + } + + Finalizer callback; + Hint* hint; +}; + +#if (NAPI_VERSION > 3 && !defined(__wasm32__)) +template , + typename FinalizerDataType=void> +struct ThreadSafeFinalize { + static inline + void Wrapper(napi_env env, void* rawFinalizeData, void* /* rawContext */) { + if (rawFinalizeData == nullptr) + return; + + ThreadSafeFinalize* finalizeData = + static_cast(rawFinalizeData); + finalizeData->callback(Env(env)); + delete finalizeData; + } + + static inline + void FinalizeWrapperWithData(napi_env env, + void* rawFinalizeData, + void* /* rawContext */) { + if (rawFinalizeData == nullptr) + return; + + ThreadSafeFinalize* finalizeData = + static_cast(rawFinalizeData); + finalizeData->callback(Env(env), finalizeData->data); + delete finalizeData; + } + + static inline + void FinalizeWrapperWithContext(napi_env env, + void* rawFinalizeData, + void* rawContext) { + if (rawFinalizeData == nullptr) + return; + + ThreadSafeFinalize* finalizeData = + static_cast(rawFinalizeData); + finalizeData->callback(Env(env), static_cast(rawContext)); + delete finalizeData; + } + + static inline + void FinalizeFinalizeWrapperWithDataAndContext(napi_env env, + void* rawFinalizeData, + void* rawContext) { + if (rawFinalizeData == nullptr) + return; + + ThreadSafeFinalize* finalizeData = + static_cast(rawFinalizeData); + finalizeData->callback(Env(env), finalizeData->data, + static_cast(rawContext)); + delete finalizeData; + } + + FinalizerDataType* data; + Finalizer callback; +}; + +template +typename std::enable_if::type static inline CallJsWrapper( + napi_env env, napi_value jsCallback, void* context, void* data) { + call(env, + Function(env, jsCallback), + static_cast(context), + static_cast(data)); +} + +template +typename std::enable_if::type static inline CallJsWrapper( + napi_env env, napi_value jsCallback, void* /*context*/, void* /*data*/) { + if (jsCallback != nullptr) { + Function(env, jsCallback).Call(0, nullptr); + } +} + +#if NAPI_VERSION > 4 + +template +napi_value DefaultCallbackWrapper(napi_env /*env*/, std::nullptr_t /*cb*/) { + return nullptr; +} + +template +napi_value DefaultCallbackWrapper(napi_env /*env*/, Napi::Function cb) { + return cb; +} + +#else +template +napi_value DefaultCallbackWrapper(napi_env env, Napi::Function cb) { + if (cb.IsEmpty()) { + return TSFN::EmptyFunctionFactory(env); + } + return cb; +} +#endif // NAPI_VERSION > 4 +#endif // NAPI_VERSION > 3 && !defined(__wasm32__) + +template +struct AccessorCallbackData { + static inline + napi_value GetterWrapper(napi_env env, napi_callback_info info) { + return details::WrapCallback([&] { + CallbackInfo callbackInfo(env, info); + AccessorCallbackData* callbackData = + static_cast(callbackInfo.Data()); + callbackInfo.SetData(callbackData->data); + return callbackData->getterCallback(callbackInfo); + }); + } + + static inline + napi_value SetterWrapper(napi_env env, napi_callback_info info) { + return details::WrapCallback([&] { + CallbackInfo callbackInfo(env, info); + AccessorCallbackData* callbackData = + static_cast(callbackInfo.Data()); + callbackInfo.SetData(callbackData->data); + callbackData->setterCallback(callbackInfo); + return nullptr; + }); + } + + Getter getterCallback; + Setter setterCallback; + void* data; +}; + +} // namespace details + +#ifndef NODE_ADDON_API_DISABLE_DEPRECATED +# include "napi-inl.deprecated.h" +#endif // !NODE_ADDON_API_DISABLE_DEPRECATED + +//////////////////////////////////////////////////////////////////////////////// +// Module registration +//////////////////////////////////////////////////////////////////////////////// + +// Register an add-on based on an initializer function. +#define NODE_API_MODULE(modname, regfunc) \ + static napi_value __napi_##regfunc(napi_env env, napi_value exports) { \ + return Napi::RegisterModule(env, exports, regfunc); \ + } \ + NAPI_MODULE(modname, __napi_##regfunc) + +// Register an add-on based on a subclass of `Addon` with a custom Node.js +// module name. +#define NODE_API_NAMED_ADDON(modname, classname) \ + static napi_value __napi_ ## classname(napi_env env, \ + napi_value exports) { \ + return Napi::RegisterModule(env, exports, &classname::Init); \ + } \ + NAPI_MODULE(modname, __napi_ ## classname) + +// Register an add-on based on a subclass of `Addon` with the Node.js module +// name given by node-gyp from the `target_name` in binding.gyp. +#define NODE_API_ADDON(classname) \ + NODE_API_NAMED_ADDON(NODE_GYP_MODULE_NAME, classname) + +// Adapt the NAPI_MODULE registration function: +// - Wrap the arguments in NAPI wrappers. +// - Catch any NAPI errors and rethrow as JS exceptions. +inline napi_value RegisterModule(napi_env env, + napi_value exports, + ModuleRegisterCallback registerCallback) { + return details::WrapCallback([&] { + return napi_value(registerCallback(Napi::Env(env), + Napi::Object(env, exports))); + }); +} + +//////////////////////////////////////////////////////////////////////////////// +// Env class +//////////////////////////////////////////////////////////////////////////////// + +inline Env::Env(napi_env env) : _env(env) { +} + +inline Env::operator napi_env() const { + return _env; +} + +inline Object Env::Global() const { + napi_value value; + napi_status status = napi_get_global(*this, &value); + NAPI_THROW_IF_FAILED(*this, status, Object()); + return Object(*this, value); +} + +inline Value Env::Undefined() const { + napi_value value; + napi_status status = napi_get_undefined(*this, &value); + NAPI_THROW_IF_FAILED(*this, status, Value()); + return Value(*this, value); +} + +inline Value Env::Null() const { + napi_value value; + napi_status status = napi_get_null(*this, &value); + NAPI_THROW_IF_FAILED(*this, status, Value()); + return Value(*this, value); +} + +inline bool Env::IsExceptionPending() const { + bool result; + napi_status status = napi_is_exception_pending(_env, &result); + if (status != napi_ok) result = false; // Checking for a pending exception shouldn't throw. + return result; +} + +inline Error Env::GetAndClearPendingException() { + napi_value value; + napi_status status = napi_get_and_clear_last_exception(_env, &value); + if (status != napi_ok) { + // Don't throw another exception when failing to get the exception! + return Error(); + } + return Error(_env, value); +} + +inline Value Env::RunScript(const char* utf8script) { + String script = String::New(_env, utf8script); + return RunScript(script); +} + +inline Value Env::RunScript(const std::string& utf8script) { + return RunScript(utf8script.c_str()); +} + +inline Value Env::RunScript(String script) { + napi_value result; + napi_status status = napi_run_script(_env, script, &result); + NAPI_THROW_IF_FAILED(_env, status, Undefined()); + return Value(_env, result); +} + +#if NAPI_VERSION > 5 +template fini> +inline void Env::SetInstanceData(T* data) { + napi_status status = + napi_set_instance_data(_env, data, [](napi_env env, void* data, void*) { + fini(env, static_cast(data)); + }, nullptr); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +template fini> +inline void Env::SetInstanceData(DataType* data, HintType* hint) { + napi_status status = + napi_set_instance_data(_env, data, + [](napi_env env, void* data, void* hint) { + fini(env, static_cast(data), static_cast(hint)); + }, hint); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +template +inline T* Env::GetInstanceData() { + void* data = nullptr; + + napi_status status = napi_get_instance_data(_env, &data); + NAPI_THROW_IF_FAILED(_env, status, nullptr); + + return static_cast(data); +} + +template void Env::DefaultFini(Env, T* data) { + delete data; +} + +template +void Env::DefaultFiniWithHint(Env, DataType* data, HintType*) { + delete data; +} +#endif // NAPI_VERSION > 5 + +//////////////////////////////////////////////////////////////////////////////// +// Value class +//////////////////////////////////////////////////////////////////////////////// + +inline Value::Value() : _env(nullptr), _value(nullptr) { +} + +inline Value::Value(napi_env env, napi_value value) : _env(env), _value(value) { +} + +inline Value::operator napi_value() const { + return _value; +} + +inline bool Value::operator ==(const Value& other) const { + return StrictEquals(other); +} + +inline bool Value::operator !=(const Value& other) const { + return !this->operator ==(other); +} + +inline bool Value::StrictEquals(const Value& other) const { + bool result; + napi_status status = napi_strict_equals(_env, *this, other, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline Napi::Env Value::Env() const { + return Napi::Env(_env); +} + +inline bool Value::IsEmpty() const { + return _value == nullptr; +} + +inline napi_valuetype Value::Type() const { + if (IsEmpty()) { + return napi_undefined; + } + + napi_valuetype type; + napi_status status = napi_typeof(_env, _value, &type); + NAPI_THROW_IF_FAILED(_env, status, napi_undefined); + return type; +} + +inline bool Value::IsUndefined() const { + return Type() == napi_undefined; +} + +inline bool Value::IsNull() const { + return Type() == napi_null; +} + +inline bool Value::IsBoolean() const { + return Type() == napi_boolean; +} + +inline bool Value::IsNumber() const { + return Type() == napi_number; +} + +#if NAPI_VERSION > 5 +inline bool Value::IsBigInt() const { + return Type() == napi_bigint; +} +#endif // NAPI_VERSION > 5 + +#if (NAPI_VERSION > 4) +inline bool Value::IsDate() const { + if (IsEmpty()) { + return false; + } + + bool result; + napi_status status = napi_is_date(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} +#endif + +inline bool Value::IsString() const { + return Type() == napi_string; +} + +inline bool Value::IsSymbol() const { + return Type() == napi_symbol; +} + +inline bool Value::IsArray() const { + if (IsEmpty()) { + return false; + } + + bool result; + napi_status status = napi_is_array(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline bool Value::IsArrayBuffer() const { + if (IsEmpty()) { + return false; + } + + bool result; + napi_status status = napi_is_arraybuffer(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline bool Value::IsTypedArray() const { + if (IsEmpty()) { + return false; + } + + bool result; + napi_status status = napi_is_typedarray(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline bool Value::IsObject() const { + return Type() == napi_object || IsFunction(); +} + +inline bool Value::IsFunction() const { + return Type() == napi_function; +} + +inline bool Value::IsPromise() const { + if (IsEmpty()) { + return false; + } + + bool result; + napi_status status = napi_is_promise(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline bool Value::IsDataView() const { + if (IsEmpty()) { + return false; + } + + bool result; + napi_status status = napi_is_dataview(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline bool Value::IsBuffer() const { + if (IsEmpty()) { + return false; + } + + bool result; + napi_status status = napi_is_buffer(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline bool Value::IsExternal() const { + return Type() == napi_external; +} + +template +inline T Value::As() const { + return T(_env, _value); +} + +inline Boolean Value::ToBoolean() const { + napi_value result; + napi_status status = napi_coerce_to_bool(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, Boolean()); + return Boolean(_env, result); +} + +inline Number Value::ToNumber() const { + napi_value result; + napi_status status = napi_coerce_to_number(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, Number()); + return Number(_env, result); +} + +inline String Value::ToString() const { + napi_value result; + napi_status status = napi_coerce_to_string(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, String()); + return String(_env, result); +} + +inline Object Value::ToObject() const { + napi_value result; + napi_status status = napi_coerce_to_object(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, Object()); + return Object(_env, result); +} + +//////////////////////////////////////////////////////////////////////////////// +// Boolean class +//////////////////////////////////////////////////////////////////////////////// + +inline Boolean Boolean::New(napi_env env, bool val) { + napi_value value; + napi_status status = napi_get_boolean(env, val, &value); + NAPI_THROW_IF_FAILED(env, status, Boolean()); + return Boolean(env, value); +} + +inline Boolean::Boolean() : Napi::Value() { +} + +inline Boolean::Boolean(napi_env env, napi_value value) : Napi::Value(env, value) { +} + +inline Boolean::operator bool() const { + return Value(); +} + +inline bool Boolean::Value() const { + bool result; + napi_status status = napi_get_value_bool(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +//////////////////////////////////////////////////////////////////////////////// +// Number class +//////////////////////////////////////////////////////////////////////////////// + +inline Number Number::New(napi_env env, double val) { + napi_value value; + napi_status status = napi_create_double(env, val, &value); + NAPI_THROW_IF_FAILED(env, status, Number()); + return Number(env, value); +} + +inline Number::Number() : Value() { +} + +inline Number::Number(napi_env env, napi_value value) : Value(env, value) { +} + +inline Number::operator int32_t() const { + return Int32Value(); +} + +inline Number::operator uint32_t() const { + return Uint32Value(); +} + +inline Number::operator int64_t() const { + return Int64Value(); +} + +inline Number::operator float() const { + return FloatValue(); +} + +inline Number::operator double() const { + return DoubleValue(); +} + +inline int32_t Number::Int32Value() const { + int32_t result; + napi_status status = napi_get_value_int32(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, 0); + return result; +} + +inline uint32_t Number::Uint32Value() const { + uint32_t result; + napi_status status = napi_get_value_uint32(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, 0); + return result; +} + +inline int64_t Number::Int64Value() const { + int64_t result; + napi_status status = napi_get_value_int64(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, 0); + return result; +} + +inline float Number::FloatValue() const { + return static_cast(DoubleValue()); +} + +inline double Number::DoubleValue() const { + double result; + napi_status status = napi_get_value_double(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, 0); + return result; +} + +#if NAPI_VERSION > 5 +//////////////////////////////////////////////////////////////////////////////// +// BigInt Class +//////////////////////////////////////////////////////////////////////////////// + +inline BigInt BigInt::New(napi_env env, int64_t val) { + napi_value value; + napi_status status = napi_create_bigint_int64(env, val, &value); + NAPI_THROW_IF_FAILED(env, status, BigInt()); + return BigInt(env, value); +} + +inline BigInt BigInt::New(napi_env env, uint64_t val) { + napi_value value; + napi_status status = napi_create_bigint_uint64(env, val, &value); + NAPI_THROW_IF_FAILED(env, status, BigInt()); + return BigInt(env, value); +} + +inline BigInt BigInt::New(napi_env env, int sign_bit, size_t word_count, const uint64_t* words) { + napi_value value; + napi_status status = napi_create_bigint_words(env, sign_bit, word_count, words, &value); + NAPI_THROW_IF_FAILED(env, status, BigInt()); + return BigInt(env, value); +} + +inline BigInt::BigInt() : Value() { +} + +inline BigInt::BigInt(napi_env env, napi_value value) : Value(env, value) { +} + +inline int64_t BigInt::Int64Value(bool* lossless) const { + int64_t result; + napi_status status = napi_get_value_bigint_int64( + _env, _value, &result, lossless); + NAPI_THROW_IF_FAILED(_env, status, 0); + return result; +} + +inline uint64_t BigInt::Uint64Value(bool* lossless) const { + uint64_t result; + napi_status status = napi_get_value_bigint_uint64( + _env, _value, &result, lossless); + NAPI_THROW_IF_FAILED(_env, status, 0); + return result; +} + +inline size_t BigInt::WordCount() const { + size_t word_count; + napi_status status = napi_get_value_bigint_words( + _env, _value, nullptr, &word_count, nullptr); + NAPI_THROW_IF_FAILED(_env, status, 0); + return word_count; +} + +inline void BigInt::ToWords(int* sign_bit, size_t* word_count, uint64_t* words) { + napi_status status = napi_get_value_bigint_words( + _env, _value, sign_bit, word_count, words); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} +#endif // NAPI_VERSION > 5 + +#if (NAPI_VERSION > 4) +//////////////////////////////////////////////////////////////////////////////// +// Date Class +//////////////////////////////////////////////////////////////////////////////// + +inline Date Date::New(napi_env env, double val) { + napi_value value; + napi_status status = napi_create_date(env, val, &value); + NAPI_THROW_IF_FAILED(env, status, Date()); + return Date(env, value); +} + +inline Date::Date() : Value() { +} + +inline Date::Date(napi_env env, napi_value value) : Value(env, value) { +} + +inline Date::operator double() const { + return ValueOf(); +} + +inline double Date::ValueOf() const { + double result; + napi_status status = napi_get_date_value( + _env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, 0); + return result; +} +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Name class +//////////////////////////////////////////////////////////////////////////////// + +inline Name::Name() : Value() { +} + +inline Name::Name(napi_env env, napi_value value) : Value(env, value) { +} + +//////////////////////////////////////////////////////////////////////////////// +// String class +//////////////////////////////////////////////////////////////////////////////// + +inline String String::New(napi_env env, const std::string& val) { + return String::New(env, val.c_str(), val.size()); +} + +inline String String::New(napi_env env, const std::u16string& val) { + return String::New(env, val.c_str(), val.size()); +} + +inline String String::New(napi_env env, const char* val) { + napi_value value; + napi_status status = napi_create_string_utf8(env, val, std::strlen(val), &value); + NAPI_THROW_IF_FAILED(env, status, String()); + return String(env, value); +} + +inline String String::New(napi_env env, const char16_t* val) { + napi_value value; + napi_status status = napi_create_string_utf16(env, val, std::u16string(val).size(), &value); + NAPI_THROW_IF_FAILED(env, status, String()); + return String(env, value); +} + +inline String String::New(napi_env env, const char* val, size_t length) { + napi_value value; + napi_status status = napi_create_string_utf8(env, val, length, &value); + NAPI_THROW_IF_FAILED(env, status, String()); + return String(env, value); +} + +inline String String::New(napi_env env, const char16_t* val, size_t length) { + napi_value value; + napi_status status = napi_create_string_utf16(env, val, length, &value); + NAPI_THROW_IF_FAILED(env, status, String()); + return String(env, value); +} + +inline String::String() : Name() { +} + +inline String::String(napi_env env, napi_value value) : Name(env, value) { +} + +inline String::operator std::string() const { + return Utf8Value(); +} + +inline String::operator std::u16string() const { + return Utf16Value(); +} + +inline std::string String::Utf8Value() const { + size_t length; + napi_status status = napi_get_value_string_utf8(_env, _value, nullptr, 0, &length); + NAPI_THROW_IF_FAILED(_env, status, ""); + + std::string value; + value.reserve(length + 1); + value.resize(length); + status = napi_get_value_string_utf8(_env, _value, &value[0], value.capacity(), nullptr); + NAPI_THROW_IF_FAILED(_env, status, ""); + return value; +} + +inline std::u16string String::Utf16Value() const { + size_t length; + napi_status status = napi_get_value_string_utf16(_env, _value, nullptr, 0, &length); + NAPI_THROW_IF_FAILED(_env, status, NAPI_WIDE_TEXT("")); + + std::u16string value; + value.reserve(length + 1); + value.resize(length); + status = napi_get_value_string_utf16(_env, _value, &value[0], value.capacity(), nullptr); + NAPI_THROW_IF_FAILED(_env, status, NAPI_WIDE_TEXT("")); + return value; +} + +//////////////////////////////////////////////////////////////////////////////// +// Symbol class +//////////////////////////////////////////////////////////////////////////////// + +inline Symbol Symbol::New(napi_env env, const char* description) { + napi_value descriptionValue = description != nullptr ? + String::New(env, description) : static_cast(nullptr); + return Symbol::New(env, descriptionValue); +} + +inline Symbol Symbol::New(napi_env env, const std::string& description) { + napi_value descriptionValue = String::New(env, description); + return Symbol::New(env, descriptionValue); +} + +inline Symbol Symbol::New(napi_env env, String description) { + napi_value descriptionValue = description; + return Symbol::New(env, descriptionValue); +} + +inline Symbol Symbol::New(napi_env env, napi_value description) { + napi_value value; + napi_status status = napi_create_symbol(env, description, &value); + NAPI_THROW_IF_FAILED(env, status, Symbol()); + return Symbol(env, value); +} + +inline Symbol Symbol::WellKnown(napi_env env, const std::string& name) { + return Napi::Env(env).Global().Get("Symbol").As().Get(name).As(); +} + +inline Symbol::Symbol() : Name() { +} + +inline Symbol::Symbol(napi_env env, napi_value value) : Name(env, value) { +} + +//////////////////////////////////////////////////////////////////////////////// +// Automagic value creation +//////////////////////////////////////////////////////////////////////////////// + +namespace details { +template +struct vf_number { + static Number From(napi_env env, T value) { + return Number::New(env, static_cast(value)); + } +}; + +template<> +struct vf_number { + static Boolean From(napi_env env, bool value) { + return Boolean::New(env, value); + } +}; + +struct vf_utf8_charp { + static String From(napi_env env, const char* value) { + return String::New(env, value); + } +}; + +struct vf_utf16_charp { + static String From(napi_env env, const char16_t* value) { + return String::New(env, value); + } +}; +struct vf_utf8_string { + static String From(napi_env env, const std::string& value) { + return String::New(env, value); + } +}; + +struct vf_utf16_string { + static String From(napi_env env, const std::u16string& value) { + return String::New(env, value); + } +}; + +template +struct vf_fallback { + static Value From(napi_env env, const T& value) { + return Value(env, value); + } +}; + +template struct disjunction : std::false_type {}; +template struct disjunction : B {}; +template +struct disjunction + : std::conditional>::type {}; + +template +struct can_make_string + : disjunction::type, + typename std::is_convertible::type, + typename std::is_convertible::type, + typename std::is_convertible::type> {}; +} + +template +Value Value::From(napi_env env, const T& value) { + using Helper = typename std::conditional< + std::is_integral::value || std::is_floating_point::value, + details::vf_number, + typename std::conditional< + details::can_make_string::value, + String, + details::vf_fallback + >::type + >::type; + return Helper::From(env, value); +} + +template +String String::From(napi_env env, const T& value) { + struct Dummy {}; + using Helper = typename std::conditional< + std::is_convertible::value, + details::vf_utf8_charp, + typename std::conditional< + std::is_convertible::value, + details::vf_utf16_charp, + typename std::conditional< + std::is_convertible::value, + details::vf_utf8_string, + typename std::conditional< + std::is_convertible::value, + details::vf_utf16_string, + Dummy + >::type + >::type + >::type + >::type; + return Helper::From(env, value); +} + +//////////////////////////////////////////////////////////////////////////////// +// Object class +//////////////////////////////////////////////////////////////////////////////// + +template +inline Object::PropertyLValue::operator Value() const { + return Object(_env, _object).Get(_key); +} + +template template +inline Object::PropertyLValue& Object::PropertyLValue::operator =(ValueType value) { + Object(_env, _object).Set(_key, value); + return *this; +} + +template +inline Object::PropertyLValue::PropertyLValue(Object object, Key key) + : _env(object.Env()), _object(object), _key(key) {} + +inline Object Object::New(napi_env env) { + napi_value value; + napi_status status = napi_create_object(env, &value); + NAPI_THROW_IF_FAILED(env, status, Object()); + return Object(env, value); +} + +inline Object::Object() : Value() { +} + +inline Object::Object(napi_env env, napi_value value) : Value(env, value) { +} + +inline Object::PropertyLValue Object::operator [](const char* utf8name) { + return PropertyLValue(*this, utf8name); +} + +inline Object::PropertyLValue Object::operator [](const std::string& utf8name) { + return PropertyLValue(*this, utf8name); +} + +inline Object::PropertyLValue Object::operator [](uint32_t index) { + return PropertyLValue(*this, index); +} + +inline Value Object::operator [](const char* utf8name) const { + return Get(utf8name); +} + +inline Value Object::operator [](const std::string& utf8name) const { + return Get(utf8name); +} + +inline Value Object::operator [](uint32_t index) const { + return Get(index); +} + +inline bool Object::Has(napi_value key) const { + bool result; + napi_status status = napi_has_property(_env, _value, key, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline bool Object::Has(Value key) const { + bool result; + napi_status status = napi_has_property(_env, _value, key, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline bool Object::Has(const char* utf8name) const { + bool result; + napi_status status = napi_has_named_property(_env, _value, utf8name, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline bool Object::Has(const std::string& utf8name) const { + return Has(utf8name.c_str()); +} + +inline bool Object::HasOwnProperty(napi_value key) const { + bool result; + napi_status status = napi_has_own_property(_env, _value, key, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline bool Object::HasOwnProperty(Value key) const { + bool result; + napi_status status = napi_has_own_property(_env, _value, key, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline bool Object::HasOwnProperty(const char* utf8name) const { + napi_value key; + napi_status status = napi_create_string_utf8(_env, utf8name, std::strlen(utf8name), &key); + NAPI_THROW_IF_FAILED(_env, status, false); + return HasOwnProperty(key); +} + +inline bool Object::HasOwnProperty(const std::string& utf8name) const { + return HasOwnProperty(utf8name.c_str()); +} + +inline Value Object::Get(napi_value key) const { + napi_value result; + napi_status status = napi_get_property(_env, _value, key, &result); + NAPI_THROW_IF_FAILED(_env, status, Value()); + return Value(_env, result); +} + +inline Value Object::Get(Value key) const { + napi_value result; + napi_status status = napi_get_property(_env, _value, key, &result); + NAPI_THROW_IF_FAILED(_env, status, Value()); + return Value(_env, result); +} + +inline Value Object::Get(const char* utf8name) const { + napi_value result; + napi_status status = napi_get_named_property(_env, _value, utf8name, &result); + NAPI_THROW_IF_FAILED(_env, status, Value()); + return Value(_env, result); +} + +inline Value Object::Get(const std::string& utf8name) const { + return Get(utf8name.c_str()); +} + +template +inline bool Object::Set(napi_value key, const ValueType& value) { + napi_status status = + napi_set_property(_env, _value, key, Value::From(_env, value)); + NAPI_THROW_IF_FAILED(_env, status, false); + return true; +} + +template +inline bool Object::Set(Value key, const ValueType& value) { + napi_status status = + napi_set_property(_env, _value, key, Value::From(_env, value)); + NAPI_THROW_IF_FAILED(_env, status, false); + return true; +} + +template +inline bool Object::Set(const char* utf8name, const ValueType& value) { + napi_status status = + napi_set_named_property(_env, _value, utf8name, Value::From(_env, value)); + NAPI_THROW_IF_FAILED(_env, status, false); + return true; +} + +template +inline bool Object::Set(const std::string& utf8name, const ValueType& value) { + return Set(utf8name.c_str(), value); +} + +inline bool Object::Delete(napi_value key) { + bool result; + napi_status status = napi_delete_property(_env, _value, key, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline bool Object::Delete(Value key) { + bool result; + napi_status status = napi_delete_property(_env, _value, key, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline bool Object::Delete(const char* utf8name) { + return Delete(String::New(_env, utf8name)); +} + +inline bool Object::Delete(const std::string& utf8name) { + return Delete(String::New(_env, utf8name)); +} + +inline bool Object::Has(uint32_t index) const { + bool result; + napi_status status = napi_has_element(_env, _value, index, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline Value Object::Get(uint32_t index) const { + napi_value value; + napi_status status = napi_get_element(_env, _value, index, &value); + NAPI_THROW_IF_FAILED(_env, status, Value()); + return Value(_env, value); +} + +template +inline bool Object::Set(uint32_t index, const ValueType& value) { + napi_status status = + napi_set_element(_env, _value, index, Value::From(_env, value)); + NAPI_THROW_IF_FAILED(_env, status, false); + return true; +} + +inline bool Object::Delete(uint32_t index) { + bool result; + napi_status status = napi_delete_element(_env, _value, index, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +inline Array Object::GetPropertyNames() const { + napi_value result; + napi_status status = napi_get_property_names(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, Array()); + return Array(_env, result); +} + +inline bool Object::DefineProperty(const PropertyDescriptor& property) { + napi_status status = napi_define_properties(_env, _value, 1, + reinterpret_cast(&property)); + NAPI_THROW_IF_FAILED(_env, status, false); + return true; +} + +inline bool Object::DefineProperties( + const std::initializer_list& properties) { + napi_status status = napi_define_properties(_env, _value, properties.size(), + reinterpret_cast(properties.begin())); + NAPI_THROW_IF_FAILED(_env, status, false); + return true; +} + +inline bool Object::DefineProperties( + const std::vector& properties) { + napi_status status = napi_define_properties(_env, _value, properties.size(), + reinterpret_cast(properties.data())); + NAPI_THROW_IF_FAILED(_env, status, false); + return true; +} + +inline bool Object::InstanceOf(const Function& constructor) const { + bool result; + napi_status status = napi_instanceof(_env, _value, constructor, &result); + NAPI_THROW_IF_FAILED(_env, status, false); + return result; +} + +template +inline void Object::AddFinalizer(Finalizer finalizeCallback, T* data) { + details::FinalizeData* finalizeData = + new details::FinalizeData( + {std::move(finalizeCallback), nullptr}); + napi_status status = + details::AttachData(_env, + *this, + data, + details::FinalizeData::Wrapper, + finalizeData); + if (status != napi_ok) { + delete finalizeData; + NAPI_THROW_IF_FAILED_VOID(_env, status); + } +} + +template +inline void Object::AddFinalizer(Finalizer finalizeCallback, + T* data, + Hint* finalizeHint) { + details::FinalizeData* finalizeData = + new details::FinalizeData( + {std::move(finalizeCallback), finalizeHint}); + napi_status status = + details::AttachData(_env, + *this, + data, + details::FinalizeData::WrapperWithHint, + finalizeData); + if (status != napi_ok) { + delete finalizeData; + NAPI_THROW_IF_FAILED_VOID(_env, status); + } +} + +#if NAPI_VERSION >= 8 +inline bool Object::Freeze() { + napi_status status = napi_object_freeze(_env, _value); + NAPI_THROW_IF_FAILED(_env, status, false); + return true; +} + +inline bool Object::Seal() { + napi_status status = napi_object_seal(_env, _value); + NAPI_THROW_IF_FAILED(_env, status, false); + return true; +} +#endif // NAPI_VERSION >= 8 + +//////////////////////////////////////////////////////////////////////////////// +// External class +//////////////////////////////////////////////////////////////////////////////// + +template +inline External External::New(napi_env env, T* data) { + napi_value value; + napi_status status = napi_create_external(env, data, nullptr, nullptr, &value); + NAPI_THROW_IF_FAILED(env, status, External()); + return External(env, value); +} + +template +template +inline External External::New(napi_env env, + T* data, + Finalizer finalizeCallback) { + napi_value value; + details::FinalizeData* finalizeData = + new details::FinalizeData( + {std::move(finalizeCallback), nullptr}); + napi_status status = napi_create_external( + env, + data, + details::FinalizeData::Wrapper, + finalizeData, + &value); + if (status != napi_ok) { + delete finalizeData; + NAPI_THROW_IF_FAILED(env, status, External()); + } + return External(env, value); +} + +template +template +inline External External::New(napi_env env, + T* data, + Finalizer finalizeCallback, + Hint* finalizeHint) { + napi_value value; + details::FinalizeData* finalizeData = + new details::FinalizeData( + {std::move(finalizeCallback), finalizeHint}); + napi_status status = napi_create_external( + env, + data, + details::FinalizeData::WrapperWithHint, + finalizeData, + &value); + if (status != napi_ok) { + delete finalizeData; + NAPI_THROW_IF_FAILED(env, status, External()); + } + return External(env, value); +} + +template +inline External::External() : Value() { +} + +template +inline External::External(napi_env env, napi_value value) : Value(env, value) { +} + +template +inline T* External::Data() const { + void* data; + napi_status status = napi_get_value_external(_env, _value, &data); + NAPI_THROW_IF_FAILED(_env, status, nullptr); + return reinterpret_cast(data); +} + +//////////////////////////////////////////////////////////////////////////////// +// Array class +//////////////////////////////////////////////////////////////////////////////// + +inline Array Array::New(napi_env env) { + napi_value value; + napi_status status = napi_create_array(env, &value); + NAPI_THROW_IF_FAILED(env, status, Array()); + return Array(env, value); +} + +inline Array Array::New(napi_env env, size_t length) { + napi_value value; + napi_status status = napi_create_array_with_length(env, length, &value); + NAPI_THROW_IF_FAILED(env, status, Array()); + return Array(env, value); +} + +inline Array::Array() : Object() { +} + +inline Array::Array(napi_env env, napi_value value) : Object(env, value) { +} + +inline uint32_t Array::Length() const { + uint32_t result; + napi_status status = napi_get_array_length(_env, _value, &result); + NAPI_THROW_IF_FAILED(_env, status, 0); + return result; +} + +//////////////////////////////////////////////////////////////////////////////// +// ArrayBuffer class +//////////////////////////////////////////////////////////////////////////////// + +inline ArrayBuffer ArrayBuffer::New(napi_env env, size_t byteLength) { + napi_value value; + void* data; + napi_status status = napi_create_arraybuffer(env, byteLength, &data, &value); + NAPI_THROW_IF_FAILED(env, status, ArrayBuffer()); + + return ArrayBuffer(env, value); +} + +inline ArrayBuffer ArrayBuffer::New(napi_env env, + void* externalData, + size_t byteLength) { + napi_value value; + napi_status status = napi_create_external_arraybuffer( + env, externalData, byteLength, nullptr, nullptr, &value); + NAPI_THROW_IF_FAILED(env, status, ArrayBuffer()); + + return ArrayBuffer(env, value); +} + +template +inline ArrayBuffer ArrayBuffer::New(napi_env env, + void* externalData, + size_t byteLength, + Finalizer finalizeCallback) { + napi_value value; + details::FinalizeData* finalizeData = + new details::FinalizeData( + {std::move(finalizeCallback), nullptr}); + napi_status status = napi_create_external_arraybuffer( + env, + externalData, + byteLength, + details::FinalizeData::Wrapper, + finalizeData, + &value); + if (status != napi_ok) { + delete finalizeData; + NAPI_THROW_IF_FAILED(env, status, ArrayBuffer()); + } + + return ArrayBuffer(env, value); +} + +template +inline ArrayBuffer ArrayBuffer::New(napi_env env, + void* externalData, + size_t byteLength, + Finalizer finalizeCallback, + Hint* finalizeHint) { + napi_value value; + details::FinalizeData* finalizeData = + new details::FinalizeData( + {std::move(finalizeCallback), finalizeHint}); + napi_status status = napi_create_external_arraybuffer( + env, + externalData, + byteLength, + details::FinalizeData::WrapperWithHint, + finalizeData, + &value); + if (status != napi_ok) { + delete finalizeData; + NAPI_THROW_IF_FAILED(env, status, ArrayBuffer()); + } + + return ArrayBuffer(env, value); +} + +inline ArrayBuffer::ArrayBuffer() : Object() { +} + +inline ArrayBuffer::ArrayBuffer(napi_env env, napi_value value) + : Object(env, value) { +} + +inline void* ArrayBuffer::Data() { + void* data; + napi_status status = napi_get_arraybuffer_info(_env, _value, &data, nullptr); + NAPI_THROW_IF_FAILED(_env, status, nullptr); + return data; +} + +inline size_t ArrayBuffer::ByteLength() { + size_t length; + napi_status status = napi_get_arraybuffer_info(_env, _value, nullptr, &length); + NAPI_THROW_IF_FAILED(_env, status, 0); + return length; +} + +#if NAPI_VERSION >= 7 +inline bool ArrayBuffer::IsDetached() const { + bool detached; + napi_status status = napi_is_detached_arraybuffer(_env, _value, &detached); + NAPI_THROW_IF_FAILED(_env, status, false); + return detached; +} + +inline void ArrayBuffer::Detach() { + napi_status status = napi_detach_arraybuffer(_env, _value); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} +#endif // NAPI_VERSION >= 7 + +//////////////////////////////////////////////////////////////////////////////// +// DataView class +//////////////////////////////////////////////////////////////////////////////// +inline DataView DataView::New(napi_env env, + Napi::ArrayBuffer arrayBuffer) { + return New(env, arrayBuffer, 0, arrayBuffer.ByteLength()); +} + +inline DataView DataView::New(napi_env env, + Napi::ArrayBuffer arrayBuffer, + size_t byteOffset) { + if (byteOffset > arrayBuffer.ByteLength()) { + NAPI_THROW(RangeError::New(env, + "Start offset is outside the bounds of the buffer"), + DataView()); + } + return New(env, arrayBuffer, byteOffset, + arrayBuffer.ByteLength() - byteOffset); +} + +inline DataView DataView::New(napi_env env, + Napi::ArrayBuffer arrayBuffer, + size_t byteOffset, + size_t byteLength) { + if (byteOffset + byteLength > arrayBuffer.ByteLength()) { + NAPI_THROW(RangeError::New(env, "Invalid DataView length"), + DataView()); + } + napi_value value; + napi_status status = napi_create_dataview( + env, byteLength, arrayBuffer, byteOffset, &value); + NAPI_THROW_IF_FAILED(env, status, DataView()); + return DataView(env, value); +} + +inline DataView::DataView() : Object() { +} + +inline DataView::DataView(napi_env env, napi_value value) : Object(env, value) { + napi_status status = napi_get_dataview_info( + _env, + _value /* dataView */, + &_length /* byteLength */, + &_data /* data */, + nullptr /* arrayBuffer */, + nullptr /* byteOffset */); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +inline Napi::ArrayBuffer DataView::ArrayBuffer() const { + napi_value arrayBuffer; + napi_status status = napi_get_dataview_info( + _env, + _value /* dataView */, + nullptr /* byteLength */, + nullptr /* data */, + &arrayBuffer /* arrayBuffer */, + nullptr /* byteOffset */); + NAPI_THROW_IF_FAILED(_env, status, Napi::ArrayBuffer()); + return Napi::ArrayBuffer(_env, arrayBuffer); +} + +inline size_t DataView::ByteOffset() const { + size_t byteOffset; + napi_status status = napi_get_dataview_info( + _env, + _value /* dataView */, + nullptr /* byteLength */, + nullptr /* data */, + nullptr /* arrayBuffer */, + &byteOffset /* byteOffset */); + NAPI_THROW_IF_FAILED(_env, status, 0); + return byteOffset; +} + +inline size_t DataView::ByteLength() const { + return _length; +} + +inline void* DataView::Data() const { + return _data; +} + +inline float DataView::GetFloat32(size_t byteOffset) const { + return ReadData(byteOffset); +} + +inline double DataView::GetFloat64(size_t byteOffset) const { + return ReadData(byteOffset); +} + +inline int8_t DataView::GetInt8(size_t byteOffset) const { + return ReadData(byteOffset); +} + +inline int16_t DataView::GetInt16(size_t byteOffset) const { + return ReadData(byteOffset); +} + +inline int32_t DataView::GetInt32(size_t byteOffset) const { + return ReadData(byteOffset); +} + +inline uint8_t DataView::GetUint8(size_t byteOffset) const { + return ReadData(byteOffset); +} + +inline uint16_t DataView::GetUint16(size_t byteOffset) const { + return ReadData(byteOffset); +} + +inline uint32_t DataView::GetUint32(size_t byteOffset) const { + return ReadData(byteOffset); +} + +inline void DataView::SetFloat32(size_t byteOffset, float value) const { + WriteData(byteOffset, value); +} + +inline void DataView::SetFloat64(size_t byteOffset, double value) const { + WriteData(byteOffset, value); +} + +inline void DataView::SetInt8(size_t byteOffset, int8_t value) const { + WriteData(byteOffset, value); +} + +inline void DataView::SetInt16(size_t byteOffset, int16_t value) const { + WriteData(byteOffset, value); +} + +inline void DataView::SetInt32(size_t byteOffset, int32_t value) const { + WriteData(byteOffset, value); +} + +inline void DataView::SetUint8(size_t byteOffset, uint8_t value) const { + WriteData(byteOffset, value); +} + +inline void DataView::SetUint16(size_t byteOffset, uint16_t value) const { + WriteData(byteOffset, value); +} + +inline void DataView::SetUint32(size_t byteOffset, uint32_t value) const { + WriteData(byteOffset, value); +} + +template +inline T DataView::ReadData(size_t byteOffset) const { + if (byteOffset + sizeof(T) > _length || + byteOffset + sizeof(T) < byteOffset) { // overflow + NAPI_THROW(RangeError::New(_env, + "Offset is outside the bounds of the DataView"), 0); + } + + return *reinterpret_cast(static_cast(_data) + byteOffset); +} + +template +inline void DataView::WriteData(size_t byteOffset, T value) const { + if (byteOffset + sizeof(T) > _length || + byteOffset + sizeof(T) < byteOffset) { // overflow + NAPI_THROW_VOID(RangeError::New(_env, + "Offset is outside the bounds of the DataView")); + } + + *reinterpret_cast(static_cast(_data) + byteOffset) = value; +} + +//////////////////////////////////////////////////////////////////////////////// +// TypedArray class +//////////////////////////////////////////////////////////////////////////////// + +inline TypedArray::TypedArray() + : Object(), _type(TypedArray::unknown_array_type), _length(0) { +} + +inline TypedArray::TypedArray(napi_env env, napi_value value) + : Object(env, value), _type(TypedArray::unknown_array_type), _length(0) { +} + +inline TypedArray::TypedArray(napi_env env, + napi_value value, + napi_typedarray_type type, + size_t length) + : Object(env, value), _type(type), _length(length) { +} + +inline napi_typedarray_type TypedArray::TypedArrayType() const { + if (_type == TypedArray::unknown_array_type) { + napi_status status = napi_get_typedarray_info(_env, _value, + &const_cast(this)->_type, &const_cast(this)->_length, + nullptr, nullptr, nullptr); + NAPI_THROW_IF_FAILED(_env, status, napi_int8_array); + } + + return _type; +} + +inline uint8_t TypedArray::ElementSize() const { + switch (TypedArrayType()) { + case napi_int8_array: + case napi_uint8_array: + case napi_uint8_clamped_array: + return 1; + case napi_int16_array: + case napi_uint16_array: + return 2; + case napi_int32_array: + case napi_uint32_array: + case napi_float32_array: + return 4; + case napi_float64_array: +#if (NAPI_VERSION > 5) + case napi_bigint64_array: + case napi_biguint64_array: +#endif // (NAPI_VERSION > 5) + return 8; + default: + return 0; + } +} + +inline size_t TypedArray::ElementLength() const { + if (_type == TypedArray::unknown_array_type) { + napi_status status = napi_get_typedarray_info(_env, _value, + &const_cast(this)->_type, &const_cast(this)->_length, + nullptr, nullptr, nullptr); + NAPI_THROW_IF_FAILED(_env, status, 0); + } + + return _length; +} + +inline size_t TypedArray::ByteOffset() const { + size_t byteOffset; + napi_status status = napi_get_typedarray_info( + _env, _value, nullptr, nullptr, nullptr, nullptr, &byteOffset); + NAPI_THROW_IF_FAILED(_env, status, 0); + return byteOffset; +} + +inline size_t TypedArray::ByteLength() const { + return ElementSize() * ElementLength(); +} + +inline Napi::ArrayBuffer TypedArray::ArrayBuffer() const { + napi_value arrayBuffer; + napi_status status = napi_get_typedarray_info( + _env, _value, nullptr, nullptr, nullptr, &arrayBuffer, nullptr); + NAPI_THROW_IF_FAILED(_env, status, Napi::ArrayBuffer()); + return Napi::ArrayBuffer(_env, arrayBuffer); +} + +//////////////////////////////////////////////////////////////////////////////// +// TypedArrayOf class +//////////////////////////////////////////////////////////////////////////////// + +template +inline TypedArrayOf TypedArrayOf::New(napi_env env, + size_t elementLength, + napi_typedarray_type type) { + Napi::ArrayBuffer arrayBuffer = Napi::ArrayBuffer::New(env, elementLength * sizeof (T)); + return New(env, elementLength, arrayBuffer, 0, type); +} + +template +inline TypedArrayOf TypedArrayOf::New(napi_env env, + size_t elementLength, + Napi::ArrayBuffer arrayBuffer, + size_t bufferOffset, + napi_typedarray_type type) { + napi_value value; + napi_status status = napi_create_typedarray( + env, type, elementLength, arrayBuffer, bufferOffset, &value); + NAPI_THROW_IF_FAILED(env, status, TypedArrayOf()); + + return TypedArrayOf( + env, value, type, elementLength, + reinterpret_cast(reinterpret_cast(arrayBuffer.Data()) + bufferOffset)); +} + +template +inline TypedArrayOf::TypedArrayOf() : TypedArray(), _data(nullptr) { +} + +template +inline TypedArrayOf::TypedArrayOf(napi_env env, napi_value value) + : TypedArray(env, value), _data(nullptr) { + napi_status status = napi_ok; + if (value != nullptr) { + status = napi_get_typedarray_info( + _env, _value, &_type, &_length, reinterpret_cast(&_data), nullptr, nullptr); + } else { + _type = TypedArrayTypeForPrimitiveType(); + _length = 0; + } + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +template +inline TypedArrayOf::TypedArrayOf(napi_env env, + napi_value value, + napi_typedarray_type type, + size_t length, + T* data) + : TypedArray(env, value, type, length), _data(data) { + if (!(type == TypedArrayTypeForPrimitiveType() || + (type == napi_uint8_clamped_array && std::is_same::value))) { + NAPI_THROW_VOID(TypeError::New(env, "Array type must match the template parameter. " + "(Uint8 arrays may optionally have the \"clamped\" array type.)")); + } +} + +template +inline T& TypedArrayOf::operator [](size_t index) { + return _data[index]; +} + +template +inline const T& TypedArrayOf::operator [](size_t index) const { + return _data[index]; +} + +template +inline T* TypedArrayOf::Data() { + return _data; +} + +template +inline const T* TypedArrayOf::Data() const { + return _data; +} + +//////////////////////////////////////////////////////////////////////////////// +// Function class +//////////////////////////////////////////////////////////////////////////////// + +template +static inline napi_status +CreateFunction(napi_env env, + const char* utf8name, + napi_callback cb, + CbData* data, + napi_value* result) { + napi_status status = + napi_create_function(env, utf8name, NAPI_AUTO_LENGTH, cb, data, result); + if (status == napi_ok) { + status = Napi::details::AttachData(env, *result, data); + } + + return status; +} + +template +inline Function Function::New(napi_env env, const char* utf8name, void* data) { + napi_value result = nullptr; + napi_status status = napi_create_function(env, + utf8name, + NAPI_AUTO_LENGTH, + details::TemplatedVoidCallback, + data, + &result); + NAPI_THROW_IF_FAILED(env, status, Function()); + return Function(env, result); +} + +template +inline Function Function::New(napi_env env, const char* utf8name, void* data) { + napi_value result = nullptr; + napi_status status = napi_create_function(env, + utf8name, + NAPI_AUTO_LENGTH, + details::TemplatedCallback, + data, + &result); + NAPI_THROW_IF_FAILED(env, status, Function()); + return Function(env, result); +} + +template +inline Function Function::New(napi_env env, + const std::string& utf8name, + void* data) { + return Function::New(env, utf8name.c_str(), data); +} + +template +inline Function Function::New(napi_env env, + const std::string& utf8name, + void* data) { + return Function::New(env, utf8name.c_str(), data); +} + +template +inline Function Function::New(napi_env env, + Callable cb, + const char* utf8name, + void* data) { + using ReturnType = decltype(cb(CallbackInfo(nullptr, nullptr))); + using CbData = details::CallbackData; + auto callbackData = new CbData({ cb, data }); + + napi_value value; + napi_status status = CreateFunction(env, + utf8name, + CbData::Wrapper, + callbackData, + &value); + if (status != napi_ok) { + delete callbackData; + NAPI_THROW_IF_FAILED(env, status, Function()); + } + + return Function(env, value); +} + +template +inline Function Function::New(napi_env env, + Callable cb, + const std::string& utf8name, + void* data) { + return New(env, cb, utf8name.c_str(), data); +} + +inline Function::Function() : Object() { +} + +inline Function::Function(napi_env env, napi_value value) : Object(env, value) { +} + +inline Value Function::operator ()(const std::initializer_list& args) const { + return Call(Env().Undefined(), args); +} + +inline Value Function::Call(const std::initializer_list& args) const { + return Call(Env().Undefined(), args); +} + +inline Value Function::Call(const std::vector& args) const { + return Call(Env().Undefined(), args); +} + +inline Value Function::Call(size_t argc, const napi_value* args) const { + return Call(Env().Undefined(), argc, args); +} + +inline Value Function::Call(napi_value recv, const std::initializer_list& args) const { + return Call(recv, args.size(), args.begin()); +} + +inline Value Function::Call(napi_value recv, const std::vector& args) const { + return Call(recv, args.size(), args.data()); +} + +inline Value Function::Call(napi_value recv, size_t argc, const napi_value* args) const { + napi_value result; + napi_status status = napi_call_function( + _env, recv, _value, argc, args, &result); + NAPI_THROW_IF_FAILED(_env, status, Value()); + return Value(_env, result); +} + +inline Value Function::MakeCallback( + napi_value recv, + const std::initializer_list& args, + napi_async_context context) const { + return MakeCallback(recv, args.size(), args.begin(), context); +} + +inline Value Function::MakeCallback( + napi_value recv, + const std::vector& args, + napi_async_context context) const { + return MakeCallback(recv, args.size(), args.data(), context); +} + +inline Value Function::MakeCallback( + napi_value recv, + size_t argc, + const napi_value* args, + napi_async_context context) const { + napi_value result; + napi_status status = napi_make_callback( + _env, context, recv, _value, argc, args, &result); + NAPI_THROW_IF_FAILED(_env, status, Value()); + return Value(_env, result); +} + +inline Object Function::New(const std::initializer_list& args) const { + return New(args.size(), args.begin()); +} + +inline Object Function::New(const std::vector& args) const { + return New(args.size(), args.data()); +} + +inline Object Function::New(size_t argc, const napi_value* args) const { + napi_value result; + napi_status status = napi_new_instance( + _env, _value, argc, args, &result); + NAPI_THROW_IF_FAILED(_env, status, Object()); + return Object(_env, result); +} + +//////////////////////////////////////////////////////////////////////////////// +// Promise class +//////////////////////////////////////////////////////////////////////////////// + +inline Promise::Deferred Promise::Deferred::New(napi_env env) { + return Promise::Deferred(env); +} + +inline Promise::Deferred::Deferred(napi_env env) : _env(env) { + napi_status status = napi_create_promise(_env, &_deferred, &_promise); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +inline Promise Promise::Deferred::Promise() const { + return Napi::Promise(_env, _promise); +} + +inline Napi::Env Promise::Deferred::Env() const { + return Napi::Env(_env); +} + +inline void Promise::Deferred::Resolve(napi_value value) const { + napi_status status = napi_resolve_deferred(_env, _deferred, value); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +inline void Promise::Deferred::Reject(napi_value value) const { + napi_status status = napi_reject_deferred(_env, _deferred, value); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +inline Promise::Promise(napi_env env, napi_value value) : Object(env, value) { +} + +//////////////////////////////////////////////////////////////////////////////// +// Buffer class +//////////////////////////////////////////////////////////////////////////////// + +template +inline Buffer Buffer::New(napi_env env, size_t length) { + napi_value value; + void* data; + napi_status status = napi_create_buffer(env, length * sizeof (T), &data, &value); + NAPI_THROW_IF_FAILED(env, status, Buffer()); + return Buffer(env, value, length, static_cast(data)); +} + +template +inline Buffer Buffer::New(napi_env env, T* data, size_t length) { + napi_value value; + napi_status status = napi_create_external_buffer( + env, length * sizeof (T), data, nullptr, nullptr, &value); + NAPI_THROW_IF_FAILED(env, status, Buffer()); + return Buffer(env, value, length, data); +} + +template +template +inline Buffer Buffer::New(napi_env env, + T* data, + size_t length, + Finalizer finalizeCallback) { + napi_value value; + details::FinalizeData* finalizeData = + new details::FinalizeData( + {std::move(finalizeCallback), nullptr}); + napi_status status = napi_create_external_buffer( + env, + length * sizeof (T), + data, + details::FinalizeData::Wrapper, + finalizeData, + &value); + if (status != napi_ok) { + delete finalizeData; + NAPI_THROW_IF_FAILED(env, status, Buffer()); + } + return Buffer(env, value, length, data); +} + +template +template +inline Buffer Buffer::New(napi_env env, + T* data, + size_t length, + Finalizer finalizeCallback, + Hint* finalizeHint) { + napi_value value; + details::FinalizeData* finalizeData = + new details::FinalizeData( + {std::move(finalizeCallback), finalizeHint}); + napi_status status = napi_create_external_buffer( + env, + length * sizeof (T), + data, + details::FinalizeData::WrapperWithHint, + finalizeData, + &value); + if (status != napi_ok) { + delete finalizeData; + NAPI_THROW_IF_FAILED(env, status, Buffer()); + } + return Buffer(env, value, length, data); +} + +template +inline Buffer Buffer::Copy(napi_env env, const T* data, size_t length) { + napi_value value; + napi_status status = napi_create_buffer_copy( + env, length * sizeof (T), data, nullptr, &value); + NAPI_THROW_IF_FAILED(env, status, Buffer()); + return Buffer(env, value); +} + +template +inline Buffer::Buffer() : Uint8Array(), _length(0), _data(nullptr) { +} + +template +inline Buffer::Buffer(napi_env env, napi_value value) + : Uint8Array(env, value), _length(0), _data(nullptr) { +} + +template +inline Buffer::Buffer(napi_env env, napi_value value, size_t length, T* data) + : Uint8Array(env, value), _length(length), _data(data) { +} + +template +inline size_t Buffer::Length() const { + EnsureInfo(); + return _length; +} + +template +inline T* Buffer::Data() const { + EnsureInfo(); + return _data; +} + +template +inline void Buffer::EnsureInfo() const { + // The Buffer instance may have been constructed from a napi_value whose + // length/data are not yet known. Fetch and cache these values just once, + // since they can never change during the lifetime of the Buffer. + if (_data == nullptr) { + size_t byteLength; + void* voidData; + napi_status status = napi_get_buffer_info(_env, _value, &voidData, &byteLength); + NAPI_THROW_IF_FAILED_VOID(_env, status); + _length = byteLength / sizeof (T); + _data = static_cast(voidData); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Error class +//////////////////////////////////////////////////////////////////////////////// + +inline Error Error::New(napi_env env) { + napi_status status; + napi_value error = nullptr; + bool is_exception_pending; + const napi_extended_error_info* info; + + // We must retrieve the last error info before doing anything else, because + // doing anything else will replace the last error info. + status = napi_get_last_error_info(env, &info); + NAPI_FATAL_IF_FAILED(status, "Error::New", "napi_get_last_error_info"); + + status = napi_is_exception_pending(env, &is_exception_pending); + NAPI_FATAL_IF_FAILED(status, "Error::New", "napi_is_exception_pending"); + + // A pending exception takes precedence over any internal error status. + if (is_exception_pending) { + status = napi_get_and_clear_last_exception(env, &error); + NAPI_FATAL_IF_FAILED(status, "Error::New", "napi_get_and_clear_last_exception"); + } + else { + const char* error_message = info->error_message != nullptr ? + info->error_message : "Error in native callback"; + + napi_value message; + status = napi_create_string_utf8( + env, + error_message, + std::strlen(error_message), + &message); + NAPI_FATAL_IF_FAILED(status, "Error::New", "napi_create_string_utf8"); + + switch (info->error_code) { + case napi_object_expected: + case napi_string_expected: + case napi_boolean_expected: + case napi_number_expected: + status = napi_create_type_error(env, nullptr, message, &error); + break; + default: + status = napi_create_error(env, nullptr, message, &error); + break; + } + NAPI_FATAL_IF_FAILED(status, "Error::New", "napi_create_error"); + } + + return Error(env, error); +} + +inline Error Error::New(napi_env env, const char* message) { + return Error::New(env, message, std::strlen(message), napi_create_error); +} + +inline Error Error::New(napi_env env, const std::string& message) { + return Error::New(env, message.c_str(), message.size(), napi_create_error); +} + +inline NAPI_NO_RETURN void Error::Fatal(const char* location, const char* message) { + napi_fatal_error(location, NAPI_AUTO_LENGTH, message, NAPI_AUTO_LENGTH); +} + +inline Error::Error() : ObjectReference() { +} + +inline Error::Error(napi_env env, napi_value value) : ObjectReference(env, nullptr) { + if (value != nullptr) { + napi_status status = napi_create_reference(env, value, 1, &_ref); + + // Avoid infinite recursion in the failure case. + // Don't try to construct & throw another Error instance. + NAPI_FATAL_IF_FAILED(status, "Error::Error", "napi_create_reference"); + } +} + +inline Error::Error(Error&& other) : ObjectReference(std::move(other)) { +} + +inline Error& Error::operator =(Error&& other) { + static_cast*>(this)->operator=(std::move(other)); + return *this; +} + +inline Error::Error(const Error& other) : ObjectReference(other) { +} + +inline Error& Error::operator =(const Error& other) { + Reset(); + + _env = other.Env(); + HandleScope scope(_env); + + napi_value value = other.Value(); + if (value != nullptr) { + napi_status status = napi_create_reference(_env, value, 1, &_ref); + NAPI_THROW_IF_FAILED(_env, status, *this); + } + + return *this; +} + +inline const std::string& Error::Message() const NAPI_NOEXCEPT { + if (_message.size() == 0 && _env != nullptr) { +#ifdef NAPI_CPP_EXCEPTIONS + try { + _message = Get("message").As(); + } + catch (...) { + // Catch all errors here, to include e.g. a std::bad_alloc from + // the std::string::operator=, because this method may not throw. + } +#else // NAPI_CPP_EXCEPTIONS + _message = Get("message").As(); +#endif // NAPI_CPP_EXCEPTIONS + } + return _message; +} + +inline void Error::ThrowAsJavaScriptException() const { + HandleScope scope(_env); + if (!IsEmpty()) { + + // We intentionally don't use `NAPI_THROW_*` macros here to ensure + // that there is no possible recursion as `ThrowAsJavaScriptException` + // is part of `NAPI_THROW_*` macro definition for noexcept. + + napi_status status = napi_throw(_env, Value()); + +#ifdef NAPI_CPP_EXCEPTIONS + if (status != napi_ok) { + throw Error::New(_env); + } +#else // NAPI_CPP_EXCEPTIONS + NAPI_FATAL_IF_FAILED(status, "Error::ThrowAsJavaScriptException", "napi_throw"); +#endif // NAPI_CPP_EXCEPTIONS + } +} + +#ifdef NAPI_CPP_EXCEPTIONS + +inline const char* Error::what() const NAPI_NOEXCEPT { + return Message().c_str(); +} + +#endif // NAPI_CPP_EXCEPTIONS + +template +inline TError Error::New(napi_env env, + const char* message, + size_t length, + create_error_fn create_error) { + napi_value str; + napi_status status = napi_create_string_utf8(env, message, length, &str); + NAPI_THROW_IF_FAILED(env, status, TError()); + + napi_value error; + status = create_error(env, nullptr, str, &error); + NAPI_THROW_IF_FAILED(env, status, TError()); + + return TError(env, error); +} + +inline TypeError TypeError::New(napi_env env, const char* message) { + return Error::New(env, message, std::strlen(message), napi_create_type_error); +} + +inline TypeError TypeError::New(napi_env env, const std::string& message) { + return Error::New(env, message.c_str(), message.size(), napi_create_type_error); +} + +inline TypeError::TypeError() : Error() { +} + +inline TypeError::TypeError(napi_env env, napi_value value) : Error(env, value) { +} + +inline RangeError RangeError::New(napi_env env, const char* message) { + return Error::New(env, message, std::strlen(message), napi_create_range_error); +} + +inline RangeError RangeError::New(napi_env env, const std::string& message) { + return Error::New(env, message.c_str(), message.size(), napi_create_range_error); +} + +inline RangeError::RangeError() : Error() { +} + +inline RangeError::RangeError(napi_env env, napi_value value) : Error(env, value) { +} + +//////////////////////////////////////////////////////////////////////////////// +// Reference class +//////////////////////////////////////////////////////////////////////////////// + +template +inline Reference Reference::New(const T& value, uint32_t initialRefcount) { + napi_env env = value.Env(); + napi_value val = value; + + if (val == nullptr) { + return Reference(env, nullptr); + } + + napi_ref ref; + napi_status status = napi_create_reference(env, value, initialRefcount, &ref); + NAPI_THROW_IF_FAILED(env, status, Reference()); + + return Reference(env, ref); +} + + +template +inline Reference::Reference() : _env(nullptr), _ref(nullptr), _suppressDestruct(false) { +} + +template +inline Reference::Reference(napi_env env, napi_ref ref) + : _env(env), _ref(ref), _suppressDestruct(false) { +} + +template +inline Reference::~Reference() { + if (_ref != nullptr) { + if (!_suppressDestruct) { + napi_delete_reference(_env, _ref); + } + + _ref = nullptr; + } +} + +template +inline Reference::Reference(Reference&& other) + : _env(other._env), _ref(other._ref), _suppressDestruct(other._suppressDestruct) { + other._env = nullptr; + other._ref = nullptr; + other._suppressDestruct = false; +} + +template +inline Reference& Reference::operator =(Reference&& other) { + Reset(); + _env = other._env; + _ref = other._ref; + _suppressDestruct = other._suppressDestruct; + other._env = nullptr; + other._ref = nullptr; + other._suppressDestruct = false; + return *this; +} + +template +inline Reference::Reference(const Reference& other) + : _env(other._env), _ref(nullptr), _suppressDestruct(false) { + HandleScope scope(_env); + + napi_value value = other.Value(); + if (value != nullptr) { + // Copying is a limited scenario (currently only used for Error object) and always creates a + // strong reference to the given value even if the incoming reference is weak. + napi_status status = napi_create_reference(_env, value, 1, &_ref); + NAPI_FATAL_IF_FAILED(status, "Reference::Reference", "napi_create_reference"); + } +} + +template +inline Reference::operator napi_ref() const { + return _ref; +} + +template +inline bool Reference::operator ==(const Reference &other) const { + HandleScope scope(_env); + return this->Value().StrictEquals(other.Value()); +} + +template +inline bool Reference::operator !=(const Reference &other) const { + return !this->operator ==(other); +} + +template +inline Napi::Env Reference::Env() const { + return Napi::Env(_env); +} + +template +inline bool Reference::IsEmpty() const { + return _ref == nullptr; +} + +template +inline T Reference::Value() const { + if (_ref == nullptr) { + return T(_env, nullptr); + } + + napi_value value; + napi_status status = napi_get_reference_value(_env, _ref, &value); + NAPI_THROW_IF_FAILED(_env, status, T()); + return T(_env, value); +} + +template +inline uint32_t Reference::Ref() { + uint32_t result; + napi_status status = napi_reference_ref(_env, _ref, &result); + NAPI_THROW_IF_FAILED(_env, status, 1); + return result; +} + +template +inline uint32_t Reference::Unref() { + uint32_t result; + napi_status status = napi_reference_unref(_env, _ref, &result); + NAPI_THROW_IF_FAILED(_env, status, 1); + return result; +} + +template +inline void Reference::Reset() { + if (_ref != nullptr) { + napi_status status = napi_delete_reference(_env, _ref); + NAPI_THROW_IF_FAILED_VOID(_env, status); + _ref = nullptr; + } +} + +template +inline void Reference::Reset(const T& value, uint32_t refcount) { + Reset(); + _env = value.Env(); + + napi_value val = value; + if (val != nullptr) { + napi_status status = napi_create_reference(_env, value, refcount, &_ref); + NAPI_THROW_IF_FAILED_VOID(_env, status); + } +} + +template +inline void Reference::SuppressDestruct() { + _suppressDestruct = true; +} + +template +inline Reference Weak(T value) { + return Reference::New(value, 0); +} + +inline ObjectReference Weak(Object value) { + return Reference::New(value, 0); +} + +inline FunctionReference Weak(Function value) { + return Reference::New(value, 0); +} + +template +inline Reference Persistent(T value) { + return Reference::New(value, 1); +} + +inline ObjectReference Persistent(Object value) { + return Reference::New(value, 1); +} + +inline FunctionReference Persistent(Function value) { + return Reference::New(value, 1); +} + +//////////////////////////////////////////////////////////////////////////////// +// ObjectReference class +//////////////////////////////////////////////////////////////////////////////// + +inline ObjectReference::ObjectReference(): Reference() { +} + +inline ObjectReference::ObjectReference(napi_env env, napi_ref ref): Reference(env, ref) { +} + +inline ObjectReference::ObjectReference(Reference&& other) + : Reference(std::move(other)) { +} + +inline ObjectReference& ObjectReference::operator =(Reference&& other) { + static_cast*>(this)->operator=(std::move(other)); + return *this; +} + +inline ObjectReference::ObjectReference(ObjectReference&& other) + : Reference(std::move(other)) { +} + +inline ObjectReference& ObjectReference::operator =(ObjectReference&& other) { + static_cast*>(this)->operator=(std::move(other)); + return *this; +} + +inline ObjectReference::ObjectReference(const ObjectReference& other) + : Reference(other) { +} + +inline Napi::Value ObjectReference::Get(const char* utf8name) const { + EscapableHandleScope scope(_env); + return scope.Escape(Value().Get(utf8name)); +} + +inline Napi::Value ObjectReference::Get(const std::string& utf8name) const { + EscapableHandleScope scope(_env); + return scope.Escape(Value().Get(utf8name)); +} + +inline bool ObjectReference::Set(const char* utf8name, napi_value value) { + HandleScope scope(_env); + return Value().Set(utf8name, value); +} + +inline bool ObjectReference::Set(const char* utf8name, Napi::Value value) { + HandleScope scope(_env); + return Value().Set(utf8name, value); +} + +inline bool ObjectReference::Set(const char* utf8name, const char* utf8value) { + HandleScope scope(_env); + return Value().Set(utf8name, utf8value); +} + +inline bool ObjectReference::Set(const char* utf8name, bool boolValue) { + HandleScope scope(_env); + return Value().Set(utf8name, boolValue); +} + +inline bool ObjectReference::Set(const char* utf8name, double numberValue) { + HandleScope scope(_env); + return Value().Set(utf8name, numberValue); +} + +inline bool ObjectReference::Set(const std::string& utf8name, + napi_value value) { + HandleScope scope(_env); + return Value().Set(utf8name, value); +} + +inline bool ObjectReference::Set(const std::string& utf8name, + Napi::Value value) { + HandleScope scope(_env); + return Value().Set(utf8name, value); +} + +inline bool ObjectReference::Set(const std::string& utf8name, + std::string& utf8value) { + HandleScope scope(_env); + return Value().Set(utf8name, utf8value); +} + +inline bool ObjectReference::Set(const std::string& utf8name, bool boolValue) { + HandleScope scope(_env); + return Value().Set(utf8name, boolValue); +} + +inline bool ObjectReference::Set(const std::string& utf8name, + double numberValue) { + HandleScope scope(_env); + return Value().Set(utf8name, numberValue); +} + +inline Napi::Value ObjectReference::Get(uint32_t index) const { + EscapableHandleScope scope(_env); + return scope.Escape(Value().Get(index)); +} + +inline bool ObjectReference::Set(uint32_t index, napi_value value) { + HandleScope scope(_env); + return Value().Set(index, value); +} + +inline bool ObjectReference::Set(uint32_t index, Napi::Value value) { + HandleScope scope(_env); + return Value().Set(index, value); +} + +inline bool ObjectReference::Set(uint32_t index, const char* utf8value) { + HandleScope scope(_env); + return Value().Set(index, utf8value); +} + +inline bool ObjectReference::Set(uint32_t index, const std::string& utf8value) { + HandleScope scope(_env); + return Value().Set(index, utf8value); +} + +inline bool ObjectReference::Set(uint32_t index, bool boolValue) { + HandleScope scope(_env); + return Value().Set(index, boolValue); +} + +inline bool ObjectReference::Set(uint32_t index, double numberValue) { + HandleScope scope(_env); + return Value().Set(index, numberValue); +} + +//////////////////////////////////////////////////////////////////////////////// +// FunctionReference class +//////////////////////////////////////////////////////////////////////////////// + +inline FunctionReference::FunctionReference(): Reference() { +} + +inline FunctionReference::FunctionReference(napi_env env, napi_ref ref) + : Reference(env, ref) { +} + +inline FunctionReference::FunctionReference(Reference&& other) + : Reference(std::move(other)) { +} + +inline FunctionReference& FunctionReference::operator =(Reference&& other) { + static_cast*>(this)->operator=(std::move(other)); + return *this; +} + +inline FunctionReference::FunctionReference(FunctionReference&& other) + : Reference(std::move(other)) { +} + +inline FunctionReference& FunctionReference::operator =(FunctionReference&& other) { + static_cast*>(this)->operator=(std::move(other)); + return *this; +} + +inline Napi::Value FunctionReference::operator ()( + const std::initializer_list& args) const { + EscapableHandleScope scope(_env); + return scope.Escape(Value()(args)); +} + +inline Napi::Value FunctionReference::Call(const std::initializer_list& args) const { + EscapableHandleScope scope(_env); + Napi::Value result = Value().Call(args); + if (scope.Env().IsExceptionPending()) { + return Value(); + } + return scope.Escape(result); +} + +inline Napi::Value FunctionReference::Call(const std::vector& args) const { + EscapableHandleScope scope(_env); + Napi::Value result = Value().Call(args); + if (scope.Env().IsExceptionPending()) { + return Value(); + } + return scope.Escape(result); +} + +inline Napi::Value FunctionReference::Call( + napi_value recv, const std::initializer_list& args) const { + EscapableHandleScope scope(_env); + Napi::Value result = Value().Call(recv, args); + if (scope.Env().IsExceptionPending()) { + return Value(); + } + return scope.Escape(result); +} + +inline Napi::Value FunctionReference::Call( + napi_value recv, const std::vector& args) const { + EscapableHandleScope scope(_env); + Napi::Value result = Value().Call(recv, args); + if (scope.Env().IsExceptionPending()) { + return Value(); + } + return scope.Escape(result); +} + +inline Napi::Value FunctionReference::Call( + napi_value recv, size_t argc, const napi_value* args) const { + EscapableHandleScope scope(_env); + Napi::Value result = Value().Call(recv, argc, args); + if (scope.Env().IsExceptionPending()) { + return Value(); + } + return scope.Escape(result); +} + +inline Napi::Value FunctionReference::MakeCallback( + napi_value recv, + const std::initializer_list& args, + napi_async_context context) const { + EscapableHandleScope scope(_env); + Napi::Value result = Value().MakeCallback(recv, args, context); + if (scope.Env().IsExceptionPending()) { + return Value(); + } + return scope.Escape(result); +} + +inline Napi::Value FunctionReference::MakeCallback( + napi_value recv, + const std::vector& args, + napi_async_context context) const { + EscapableHandleScope scope(_env); + Napi::Value result = Value().MakeCallback(recv, args, context); + if (scope.Env().IsExceptionPending()) { + return Value(); + } + return scope.Escape(result); +} + +inline Napi::Value FunctionReference::MakeCallback( + napi_value recv, + size_t argc, + const napi_value* args, + napi_async_context context) const { + EscapableHandleScope scope(_env); + Napi::Value result = Value().MakeCallback(recv, argc, args, context); + if (scope.Env().IsExceptionPending()) { + return Value(); + } + return scope.Escape(result); +} + +inline Object FunctionReference::New(const std::initializer_list& args) const { + EscapableHandleScope scope(_env); + return scope.Escape(Value().New(args)).As(); +} + +inline Object FunctionReference::New(const std::vector& args) const { + EscapableHandleScope scope(_env); + return scope.Escape(Value().New(args)).As(); +} + +//////////////////////////////////////////////////////////////////////////////// +// CallbackInfo class +//////////////////////////////////////////////////////////////////////////////// + +inline CallbackInfo::CallbackInfo(napi_env env, napi_callback_info info) + : _env(env), _info(info), _this(nullptr), _dynamicArgs(nullptr), _data(nullptr) { + _argc = _staticArgCount; + _argv = _staticArgs; + napi_status status = napi_get_cb_info(env, info, &_argc, _argv, &_this, &_data); + NAPI_THROW_IF_FAILED_VOID(_env, status); + + if (_argc > _staticArgCount) { + // Use either a fixed-size array (on the stack) or a dynamically-allocated + // array (on the heap) depending on the number of args. + _dynamicArgs = new napi_value[_argc]; + _argv = _dynamicArgs; + + status = napi_get_cb_info(env, info, &_argc, _argv, nullptr, nullptr); + NAPI_THROW_IF_FAILED_VOID(_env, status); + } +} + +inline CallbackInfo::~CallbackInfo() { + if (_dynamicArgs != nullptr) { + delete[] _dynamicArgs; + } +} + +inline Value CallbackInfo::NewTarget() const { + napi_value newTarget; + napi_status status = napi_get_new_target(_env, _info, &newTarget); + NAPI_THROW_IF_FAILED(_env, status, Value()); + return Value(_env, newTarget); +} + +inline bool CallbackInfo::IsConstructCall() const { + return !NewTarget().IsEmpty(); +} + +inline Napi::Env CallbackInfo::Env() const { + return Napi::Env(_env); +} + +inline size_t CallbackInfo::Length() const { + return _argc; +} + +inline const Value CallbackInfo::operator [](size_t index) const { + return index < _argc ? Value(_env, _argv[index]) : Env().Undefined(); +} + +inline Value CallbackInfo::This() const { + if (_this == nullptr) { + return Env().Undefined(); + } + return Object(_env, _this); +} + +inline void* CallbackInfo::Data() const { + return _data; +} + +inline void CallbackInfo::SetData(void* data) { + _data = data; +} + +//////////////////////////////////////////////////////////////////////////////// +// PropertyDescriptor class +//////////////////////////////////////////////////////////////////////////////// + +template +PropertyDescriptor +PropertyDescriptor::Accessor(const char* utf8name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + + desc.utf8name = utf8name; + desc.getter = details::TemplatedCallback; + desc.attributes = attributes; + desc.data = data; + + return desc; +} + +template +PropertyDescriptor +PropertyDescriptor::Accessor(const std::string& utf8name, + napi_property_attributes attributes, + void* data) { + return Accessor(utf8name.c_str(), attributes, data); +} + +template +PropertyDescriptor +PropertyDescriptor::Accessor(Name name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + + desc.name = name; + desc.getter = details::TemplatedCallback; + desc.attributes = attributes; + desc.data = data; + + return desc; +} + +template < +typename PropertyDescriptor::GetterCallback Getter, +typename PropertyDescriptor::SetterCallback Setter> +PropertyDescriptor +PropertyDescriptor::Accessor(const char* utf8name, + napi_property_attributes attributes, + void* data) { + + napi_property_descriptor desc = napi_property_descriptor(); + + desc.utf8name = utf8name; + desc.getter = details::TemplatedCallback; + desc.setter = details::TemplatedVoidCallback; + desc.attributes = attributes; + desc.data = data; + + return desc; +} + +template < +typename PropertyDescriptor::GetterCallback Getter, +typename PropertyDescriptor::SetterCallback Setter> +PropertyDescriptor +PropertyDescriptor::Accessor(const std::string& utf8name, + napi_property_attributes attributes, + void* data) { + return Accessor(utf8name.c_str(), attributes, data); +} + +template < +typename PropertyDescriptor::GetterCallback Getter, +typename PropertyDescriptor::SetterCallback Setter> +PropertyDescriptor +PropertyDescriptor::Accessor(Name name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + + desc.name = name; + desc.getter = details::TemplatedCallback; + desc.setter = details::TemplatedVoidCallback; + desc.attributes = attributes; + desc.data = data; + + return desc; +} + +template +inline PropertyDescriptor +PropertyDescriptor::Accessor(Napi::Env env, + Napi::Object object, + const char* utf8name, + Getter getter, + napi_property_attributes attributes, + void* data) { + using CbData = details::CallbackData; + auto callbackData = new CbData({ getter, data }); + + napi_status status = AttachData(env, object, callbackData); + if (status != napi_ok) { + delete callbackData; + NAPI_THROW_IF_FAILED(env, status, napi_property_descriptor()); + } + + return PropertyDescriptor({ + utf8name, + nullptr, + nullptr, + CbData::Wrapper, + nullptr, + nullptr, + attributes, + callbackData + }); +} + +template +inline PropertyDescriptor PropertyDescriptor::Accessor(Napi::Env env, + Napi::Object object, + const std::string& utf8name, + Getter getter, + napi_property_attributes attributes, + void* data) { + return Accessor(env, object, utf8name.c_str(), getter, attributes, data); +} + +template +inline PropertyDescriptor PropertyDescriptor::Accessor(Napi::Env env, + Napi::Object object, + Name name, + Getter getter, + napi_property_attributes attributes, + void* data) { + using CbData = details::CallbackData; + auto callbackData = new CbData({ getter, data }); + + napi_status status = AttachData(env, object, callbackData); + if (status != napi_ok) { + delete callbackData; + NAPI_THROW_IF_FAILED(env, status, napi_property_descriptor()); + } + + return PropertyDescriptor({ + nullptr, + name, + nullptr, + CbData::Wrapper, + nullptr, + nullptr, + attributes, + callbackData + }); +} + +template +inline PropertyDescriptor PropertyDescriptor::Accessor(Napi::Env env, + Napi::Object object, + const char* utf8name, + Getter getter, + Setter setter, + napi_property_attributes attributes, + void* data) { + using CbData = details::AccessorCallbackData; + auto callbackData = new CbData({ getter, setter, data }); + + napi_status status = AttachData(env, object, callbackData); + if (status != napi_ok) { + delete callbackData; + NAPI_THROW_IF_FAILED(env, status, napi_property_descriptor()); + } + + return PropertyDescriptor({ + utf8name, + nullptr, + nullptr, + CbData::GetterWrapper, + CbData::SetterWrapper, + nullptr, + attributes, + callbackData + }); +} + +template +inline PropertyDescriptor PropertyDescriptor::Accessor(Napi::Env env, + Napi::Object object, + const std::string& utf8name, + Getter getter, + Setter setter, + napi_property_attributes attributes, + void* data) { + return Accessor(env, object, utf8name.c_str(), getter, setter, attributes, data); +} + +template +inline PropertyDescriptor PropertyDescriptor::Accessor(Napi::Env env, + Napi::Object object, + Name name, + Getter getter, + Setter setter, + napi_property_attributes attributes, + void* data) { + using CbData = details::AccessorCallbackData; + auto callbackData = new CbData({ getter, setter, data }); + + napi_status status = AttachData(env, object, callbackData); + if (status != napi_ok) { + delete callbackData; + NAPI_THROW_IF_FAILED(env, status, napi_property_descriptor()); + } + + return PropertyDescriptor({ + nullptr, + name, + nullptr, + CbData::GetterWrapper, + CbData::SetterWrapper, + nullptr, + attributes, + callbackData + }); +} + +template +inline PropertyDescriptor PropertyDescriptor::Function(Napi::Env env, + Napi::Object /*object*/, + const char* utf8name, + Callable cb, + napi_property_attributes attributes, + void* data) { + return PropertyDescriptor({ + utf8name, + nullptr, + nullptr, + nullptr, + nullptr, + Napi::Function::New(env, cb, utf8name, data), + attributes, + nullptr + }); +} + +template +inline PropertyDescriptor PropertyDescriptor::Function(Napi::Env env, + Napi::Object object, + const std::string& utf8name, + Callable cb, + napi_property_attributes attributes, + void* data) { + return Function(env, object, utf8name.c_str(), cb, attributes, data); +} + +template +inline PropertyDescriptor PropertyDescriptor::Function(Napi::Env env, + Napi::Object /*object*/, + Name name, + Callable cb, + napi_property_attributes attributes, + void* data) { + return PropertyDescriptor({ + nullptr, + name, + nullptr, + nullptr, + nullptr, + Napi::Function::New(env, cb, nullptr, data), + attributes, + nullptr + }); +} + +inline PropertyDescriptor PropertyDescriptor::Value(const char* utf8name, + napi_value value, + napi_property_attributes attributes) { + return PropertyDescriptor({ + utf8name, nullptr, nullptr, nullptr, nullptr, value, attributes, nullptr + }); +} + +inline PropertyDescriptor PropertyDescriptor::Value(const std::string& utf8name, + napi_value value, + napi_property_attributes attributes) { + return Value(utf8name.c_str(), value, attributes); +} + +inline PropertyDescriptor PropertyDescriptor::Value(napi_value name, + napi_value value, + napi_property_attributes attributes) { + return PropertyDescriptor({ + nullptr, name, nullptr, nullptr, nullptr, value, attributes, nullptr + }); +} + +inline PropertyDescriptor PropertyDescriptor::Value(Name name, + Napi::Value value, + napi_property_attributes attributes) { + napi_value nameValue = name; + napi_value valueValue = value; + return PropertyDescriptor::Value(nameValue, valueValue, attributes); +} + +inline PropertyDescriptor::PropertyDescriptor(napi_property_descriptor desc) + : _desc(desc) { +} + +inline PropertyDescriptor::operator napi_property_descriptor&() { + return _desc; +} + +inline PropertyDescriptor::operator const napi_property_descriptor&() const { + return _desc; +} + +//////////////////////////////////////////////////////////////////////////////// +// InstanceWrap class +//////////////////////////////////////////////////////////////////////////////// + +template +inline void InstanceWrap::AttachPropData(napi_env env, + napi_value value, + const napi_property_descriptor* prop) { + napi_status status; + if (!(prop->attributes & napi_static)) { + if (prop->method == T::InstanceVoidMethodCallbackWrapper) { + status = Napi::details::AttachData(env, + value, + static_cast(prop->data)); + NAPI_THROW_IF_FAILED_VOID(env, status); + } else if (prop->method == T::InstanceMethodCallbackWrapper) { + status = Napi::details::AttachData(env, + value, + static_cast(prop->data)); + NAPI_THROW_IF_FAILED_VOID(env, status); + } else if (prop->getter == T::InstanceGetterCallbackWrapper || + prop->setter == T::InstanceSetterCallbackWrapper) { + status = Napi::details::AttachData(env, + value, + static_cast(prop->data)); + NAPI_THROW_IF_FAILED_VOID(env, status); + } + } +} + +template +inline ClassPropertyDescriptor InstanceWrap::InstanceMethod( + const char* utf8name, + InstanceVoidMethodCallback method, + napi_property_attributes attributes, + void* data) { + InstanceVoidMethodCallbackData* callbackData = + new InstanceVoidMethodCallbackData({ method, data}); + + napi_property_descriptor desc = napi_property_descriptor(); + desc.utf8name = utf8name; + desc.method = T::InstanceVoidMethodCallbackWrapper; + desc.data = callbackData; + desc.attributes = attributes; + return desc; +} + +template +inline ClassPropertyDescriptor InstanceWrap::InstanceMethod( + const char* utf8name, + InstanceMethodCallback method, + napi_property_attributes attributes, + void* data) { + InstanceMethodCallbackData* callbackData = new InstanceMethodCallbackData({ method, data }); + + napi_property_descriptor desc = napi_property_descriptor(); + desc.utf8name = utf8name; + desc.method = T::InstanceMethodCallbackWrapper; + desc.data = callbackData; + desc.attributes = attributes; + return desc; +} + +template +inline ClassPropertyDescriptor InstanceWrap::InstanceMethod( + Symbol name, + InstanceVoidMethodCallback method, + napi_property_attributes attributes, + void* data) { + InstanceVoidMethodCallbackData* callbackData = + new InstanceVoidMethodCallbackData({ method, data}); + + napi_property_descriptor desc = napi_property_descriptor(); + desc.name = name; + desc.method = T::InstanceVoidMethodCallbackWrapper; + desc.data = callbackData; + desc.attributes = attributes; + return desc; +} + +template +inline ClassPropertyDescriptor InstanceWrap::InstanceMethod( + Symbol name, + InstanceMethodCallback method, + napi_property_attributes attributes, + void* data) { + InstanceMethodCallbackData* callbackData = new InstanceMethodCallbackData({ method, data }); + + napi_property_descriptor desc = napi_property_descriptor(); + desc.name = name; + desc.method = T::InstanceMethodCallbackWrapper; + desc.data = callbackData; + desc.attributes = attributes; + return desc; +} + +template +template ::InstanceVoidMethodCallback method> +inline ClassPropertyDescriptor InstanceWrap::InstanceMethod( + const char* utf8name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.utf8name = utf8name; + desc.method = details::TemplatedInstanceVoidCallback; + desc.data = data; + desc.attributes = attributes; + return desc; +} + +template +template ::InstanceMethodCallback method> +inline ClassPropertyDescriptor InstanceWrap::InstanceMethod( + const char* utf8name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.utf8name = utf8name; + desc.method = details::TemplatedInstanceCallback; + desc.data = data; + desc.attributes = attributes; + return desc; +} + +template +template ::InstanceVoidMethodCallback method> +inline ClassPropertyDescriptor InstanceWrap::InstanceMethod( + Symbol name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.name = name; + desc.method = details::TemplatedInstanceVoidCallback; + desc.data = data; + desc.attributes = attributes; + return desc; +} + +template +template ::InstanceMethodCallback method> +inline ClassPropertyDescriptor InstanceWrap::InstanceMethod( + Symbol name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.name = name; + desc.method = details::TemplatedInstanceCallback; + desc.data = data; + desc.attributes = attributes; + return desc; +} + +template +inline ClassPropertyDescriptor InstanceWrap::InstanceAccessor( + const char* utf8name, + InstanceGetterCallback getter, + InstanceSetterCallback setter, + napi_property_attributes attributes, + void* data) { + InstanceAccessorCallbackData* callbackData = + new InstanceAccessorCallbackData({ getter, setter, data }); + + napi_property_descriptor desc = napi_property_descriptor(); + desc.utf8name = utf8name; + desc.getter = getter != nullptr ? T::InstanceGetterCallbackWrapper : nullptr; + desc.setter = setter != nullptr ? T::InstanceSetterCallbackWrapper : nullptr; + desc.data = callbackData; + desc.attributes = attributes; + return desc; +} + +template +inline ClassPropertyDescriptor InstanceWrap::InstanceAccessor( + Symbol name, + InstanceGetterCallback getter, + InstanceSetterCallback setter, + napi_property_attributes attributes, + void* data) { + InstanceAccessorCallbackData* callbackData = + new InstanceAccessorCallbackData({ getter, setter, data }); + + napi_property_descriptor desc = napi_property_descriptor(); + desc.name = name; + desc.getter = getter != nullptr ? T::InstanceGetterCallbackWrapper : nullptr; + desc.setter = setter != nullptr ? T::InstanceSetterCallbackWrapper : nullptr; + desc.data = callbackData; + desc.attributes = attributes; + return desc; +} + +template +template ::InstanceGetterCallback getter, + typename InstanceWrap::InstanceSetterCallback setter> +inline ClassPropertyDescriptor InstanceWrap::InstanceAccessor( + const char* utf8name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.utf8name = utf8name; + desc.getter = details::TemplatedInstanceCallback; + desc.setter = This::WrapSetter(This::SetterTag()); + desc.data = data; + desc.attributes = attributes; + return desc; +} + +template +template ::InstanceGetterCallback getter, + typename InstanceWrap::InstanceSetterCallback setter> +inline ClassPropertyDescriptor InstanceWrap::InstanceAccessor( + Symbol name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.name = name; + desc.getter = details::TemplatedInstanceCallback; + desc.setter = This::WrapSetter(This::SetterTag()); + desc.data = data; + desc.attributes = attributes; + return desc; +} + +template +inline ClassPropertyDescriptor InstanceWrap::InstanceValue( + const char* utf8name, + Napi::Value value, + napi_property_attributes attributes) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.utf8name = utf8name; + desc.value = value; + desc.attributes = attributes; + return desc; +} + +template +inline ClassPropertyDescriptor InstanceWrap::InstanceValue( + Symbol name, + Napi::Value value, + napi_property_attributes attributes) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.name = name; + desc.value = value; + desc.attributes = attributes; + return desc; +} + +template +inline napi_value InstanceWrap::InstanceVoidMethodCallbackWrapper( + napi_env env, + napi_callback_info info) { + return details::WrapCallback([&] { + CallbackInfo callbackInfo(env, info); + InstanceVoidMethodCallbackData* callbackData = + reinterpret_cast(callbackInfo.Data()); + callbackInfo.SetData(callbackData->data); + T* instance = T::Unwrap(callbackInfo.This().As()); + auto cb = callbackData->callback; + (instance->*cb)(callbackInfo); + return nullptr; + }); +} + +template +inline napi_value InstanceWrap::InstanceMethodCallbackWrapper( + napi_env env, + napi_callback_info info) { + return details::WrapCallback([&] { + CallbackInfo callbackInfo(env, info); + InstanceMethodCallbackData* callbackData = + reinterpret_cast(callbackInfo.Data()); + callbackInfo.SetData(callbackData->data); + T* instance = T::Unwrap(callbackInfo.This().As()); + auto cb = callbackData->callback; + return (instance->*cb)(callbackInfo); + }); +} + +template +inline napi_value InstanceWrap::InstanceGetterCallbackWrapper( + napi_env env, + napi_callback_info info) { + return details::WrapCallback([&] { + CallbackInfo callbackInfo(env, info); + InstanceAccessorCallbackData* callbackData = + reinterpret_cast(callbackInfo.Data()); + callbackInfo.SetData(callbackData->data); + T* instance = T::Unwrap(callbackInfo.This().As()); + auto cb = callbackData->getterCallback; + return (instance->*cb)(callbackInfo); + }); +} + +template +inline napi_value InstanceWrap::InstanceSetterCallbackWrapper( + napi_env env, + napi_callback_info info) { + return details::WrapCallback([&] { + CallbackInfo callbackInfo(env, info); + InstanceAccessorCallbackData* callbackData = + reinterpret_cast(callbackInfo.Data()); + callbackInfo.SetData(callbackData->data); + T* instance = T::Unwrap(callbackInfo.This().As()); + auto cb = callbackData->setterCallback; + (instance->*cb)(callbackInfo, callbackInfo[0]); + return nullptr; + }); +} + +template +template ::InstanceSetterCallback method> +inline napi_value InstanceWrap::WrappedMethod( + napi_env env, napi_callback_info info) NAPI_NOEXCEPT { + return details::WrapCallback([&] { + const CallbackInfo cbInfo(env, info); + T* instance = T::Unwrap(cbInfo.This().As()); + (instance->*method)(cbInfo, cbInfo[0]); + return nullptr; + }); +} + +//////////////////////////////////////////////////////////////////////////////// +// ObjectWrap class +//////////////////////////////////////////////////////////////////////////////// + +template +inline ObjectWrap::ObjectWrap(const Napi::CallbackInfo& callbackInfo) { + napi_env env = callbackInfo.Env(); + napi_value wrapper = callbackInfo.This(); + napi_status status; + napi_ref ref; + T* instance = static_cast(this); + status = napi_wrap(env, wrapper, instance, FinalizeCallback, nullptr, &ref); + NAPI_THROW_IF_FAILED_VOID(env, status); + + Reference* instanceRef = instance; + *instanceRef = Reference(env, ref); +} + +template +inline ObjectWrap::~ObjectWrap() { + // If the JS object still exists at this point, remove the finalizer added + // through `napi_wrap()`. + if (!IsEmpty()) { + Object object = Value(); + // It is not valid to call `napi_remove_wrap()` with an empty `object`. + // This happens e.g. during garbage collection. + if (!object.IsEmpty() && _construction_failed) { + napi_remove_wrap(Env(), object, nullptr); + } + } +} + +template +inline T* ObjectWrap::Unwrap(Object wrapper) { + T* unwrapped; + napi_status status = napi_unwrap(wrapper.Env(), wrapper, reinterpret_cast(&unwrapped)); + NAPI_THROW_IF_FAILED(wrapper.Env(), status, nullptr); + return unwrapped; +} + +template +inline Function +ObjectWrap::DefineClass(Napi::Env env, + const char* utf8name, + const size_t props_count, + const napi_property_descriptor* descriptors, + void* data) { + napi_status status; + std::vector props(props_count); + + // We copy the descriptors to a local array because before defining the class + // we must replace static method property descriptors with value property + // descriptors such that the value is a function-valued `napi_value` created + // with `CreateFunction()`. + // + // This replacement could be made for instance methods as well, but V8 aborts + // if we do that, because it expects methods defined on the prototype template + // to have `FunctionTemplate`s. + for (size_t index = 0; index < props_count; index++) { + props[index] = descriptors[index]; + napi_property_descriptor* prop = &props[index]; + if (prop->method == T::StaticMethodCallbackWrapper) { + status = CreateFunction(env, + utf8name, + prop->method, + static_cast(prop->data), + &(prop->value)); + NAPI_THROW_IF_FAILED(env, status, Function()); + prop->method = nullptr; + prop->data = nullptr; + } else if (prop->method == T::StaticVoidMethodCallbackWrapper) { + status = CreateFunction(env, + utf8name, + prop->method, + static_cast(prop->data), + &(prop->value)); + NAPI_THROW_IF_FAILED(env, status, Function()); + prop->method = nullptr; + prop->data = nullptr; + } + } + + napi_value value; + status = napi_define_class(env, + utf8name, + NAPI_AUTO_LENGTH, + T::ConstructorCallbackWrapper, + data, + props_count, + props.data(), + &value); + NAPI_THROW_IF_FAILED(env, status, Function()); + + // After defining the class we iterate once more over the property descriptors + // and attach the data associated with accessors and instance methods to the + // newly created JavaScript class. + for (size_t idx = 0; idx < props_count; idx++) { + const napi_property_descriptor* prop = &props[idx]; + + if (prop->getter == T::StaticGetterCallbackWrapper || + prop->setter == T::StaticSetterCallbackWrapper) { + status = Napi::details::AttachData(env, + value, + static_cast(prop->data)); + NAPI_THROW_IF_FAILED(env, status, Function()); + } else { + // InstanceWrap::AttachPropData is responsible for attaching the data + // of instance methods and accessors. + T::AttachPropData(env, value, prop); + } + } + + return Function(env, value); +} + +template +inline Function ObjectWrap::DefineClass( + Napi::Env env, + const char* utf8name, + const std::initializer_list>& properties, + void* data) { + return DefineClass(env, + utf8name, + properties.size(), + reinterpret_cast(properties.begin()), + data); +} + +template +inline Function ObjectWrap::DefineClass( + Napi::Env env, + const char* utf8name, + const std::vector>& properties, + void* data) { + return DefineClass(env, + utf8name, + properties.size(), + reinterpret_cast(properties.data()), + data); +} + +template +inline ClassPropertyDescriptor ObjectWrap::StaticMethod( + const char* utf8name, + StaticVoidMethodCallback method, + napi_property_attributes attributes, + void* data) { + StaticVoidMethodCallbackData* callbackData = new StaticVoidMethodCallbackData({ method, data }); + + napi_property_descriptor desc = napi_property_descriptor(); + desc.utf8name = utf8name; + desc.method = T::StaticVoidMethodCallbackWrapper; + desc.data = callbackData; + desc.attributes = static_cast(attributes | napi_static); + return desc; +} + +template +inline ClassPropertyDescriptor ObjectWrap::StaticMethod( + const char* utf8name, + StaticMethodCallback method, + napi_property_attributes attributes, + void* data) { + StaticMethodCallbackData* callbackData = new StaticMethodCallbackData({ method, data }); + + napi_property_descriptor desc = napi_property_descriptor(); + desc.utf8name = utf8name; + desc.method = T::StaticMethodCallbackWrapper; + desc.data = callbackData; + desc.attributes = static_cast(attributes | napi_static); + return desc; +} + +template +inline ClassPropertyDescriptor ObjectWrap::StaticMethod( + Symbol name, + StaticVoidMethodCallback method, + napi_property_attributes attributes, + void* data) { + StaticVoidMethodCallbackData* callbackData = new StaticVoidMethodCallbackData({ method, data }); + + napi_property_descriptor desc = napi_property_descriptor(); + desc.name = name; + desc.method = T::StaticVoidMethodCallbackWrapper; + desc.data = callbackData; + desc.attributes = static_cast(attributes | napi_static); + return desc; +} + +template +inline ClassPropertyDescriptor ObjectWrap::StaticMethod( + Symbol name, + StaticMethodCallback method, + napi_property_attributes attributes, + void* data) { + StaticMethodCallbackData* callbackData = new StaticMethodCallbackData({ method, data }); + + napi_property_descriptor desc = napi_property_descriptor(); + desc.name = name; + desc.method = T::StaticMethodCallbackWrapper; + desc.data = callbackData; + desc.attributes = static_cast(attributes | napi_static); + return desc; +} + +template +template ::StaticVoidMethodCallback method> +inline ClassPropertyDescriptor ObjectWrap::StaticMethod( + const char* utf8name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.utf8name = utf8name; + desc.method = details::TemplatedVoidCallback; + desc.data = data; + desc.attributes = static_cast(attributes | napi_static); + return desc; +} + +template +template ::StaticVoidMethodCallback method> +inline ClassPropertyDescriptor ObjectWrap::StaticMethod( + Symbol name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.name = name; + desc.method = details::TemplatedVoidCallback; + desc.data = data; + desc.attributes = static_cast(attributes | napi_static); + return desc; +} + +template +template ::StaticMethodCallback method> +inline ClassPropertyDescriptor ObjectWrap::StaticMethod( + const char* utf8name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.utf8name = utf8name; + desc.method = details::TemplatedCallback; + desc.data = data; + desc.attributes = static_cast(attributes | napi_static); + return desc; +} + +template +template ::StaticMethodCallback method> +inline ClassPropertyDescriptor ObjectWrap::StaticMethod( + Symbol name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.name = name; + desc.method = details::TemplatedCallback; + desc.data = data; + desc.attributes = static_cast(attributes | napi_static); + return desc; +} + +template +inline ClassPropertyDescriptor ObjectWrap::StaticAccessor( + const char* utf8name, + StaticGetterCallback getter, + StaticSetterCallback setter, + napi_property_attributes attributes, + void* data) { + StaticAccessorCallbackData* callbackData = + new StaticAccessorCallbackData({ getter, setter, data }); + + napi_property_descriptor desc = napi_property_descriptor(); + desc.utf8name = utf8name; + desc.getter = getter != nullptr ? T::StaticGetterCallbackWrapper : nullptr; + desc.setter = setter != nullptr ? T::StaticSetterCallbackWrapper : nullptr; + desc.data = callbackData; + desc.attributes = static_cast(attributes | napi_static); + return desc; +} + +template +inline ClassPropertyDescriptor ObjectWrap::StaticAccessor( + Symbol name, + StaticGetterCallback getter, + StaticSetterCallback setter, + napi_property_attributes attributes, + void* data) { + StaticAccessorCallbackData* callbackData = + new StaticAccessorCallbackData({ getter, setter, data }); + + napi_property_descriptor desc = napi_property_descriptor(); + desc.name = name; + desc.getter = getter != nullptr ? T::StaticGetterCallbackWrapper : nullptr; + desc.setter = setter != nullptr ? T::StaticSetterCallbackWrapper : nullptr; + desc.data = callbackData; + desc.attributes = static_cast(attributes | napi_static); + return desc; +} + +template +template ::StaticGetterCallback getter, + typename ObjectWrap::StaticSetterCallback setter> +inline ClassPropertyDescriptor ObjectWrap::StaticAccessor( + const char* utf8name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.utf8name = utf8name; + desc.getter = details::TemplatedCallback; + desc.setter = This::WrapStaticSetter(This::StaticSetterTag()); + desc.data = data; + desc.attributes = static_cast(attributes | napi_static); + return desc; +} + +template +template ::StaticGetterCallback getter, + typename ObjectWrap::StaticSetterCallback setter> +inline ClassPropertyDescriptor ObjectWrap::StaticAccessor( + Symbol name, + napi_property_attributes attributes, + void* data) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.name = name; + desc.getter = details::TemplatedCallback; + desc.setter = This::WrapStaticSetter(This::StaticSetterTag()); + desc.data = data; + desc.attributes = static_cast(attributes | napi_static); + return desc; +} + +template +inline ClassPropertyDescriptor ObjectWrap::StaticValue(const char* utf8name, + Napi::Value value, napi_property_attributes attributes) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.utf8name = utf8name; + desc.value = value; + desc.attributes = static_cast(attributes | napi_static); + return desc; +} + +template +inline ClassPropertyDescriptor ObjectWrap::StaticValue(Symbol name, + Napi::Value value, napi_property_attributes attributes) { + napi_property_descriptor desc = napi_property_descriptor(); + desc.name = name; + desc.value = value; + desc.attributes = static_cast(attributes | napi_static); + return desc; +} + +template +inline void ObjectWrap::Finalize(Napi::Env /*env*/) {} + +template +inline napi_value ObjectWrap::ConstructorCallbackWrapper( + napi_env env, + napi_callback_info info) { + napi_value new_target; + napi_status status = napi_get_new_target(env, info, &new_target); + if (status != napi_ok) return nullptr; + + bool isConstructCall = (new_target != nullptr); + if (!isConstructCall) { + napi_throw_type_error(env, nullptr, "Class constructors cannot be invoked without 'new'"); + return nullptr; + } + + napi_value wrapper = details::WrapCallback([&] { + CallbackInfo callbackInfo(env, info); + T* instance = new T(callbackInfo); +#ifdef NAPI_CPP_EXCEPTIONS + instance->_construction_failed = false; +#else + if (callbackInfo.Env().IsExceptionPending()) { + // We need to clear the exception so that removing the wrap might work. + Error e = callbackInfo.Env().GetAndClearPendingException(); + delete instance; + e.ThrowAsJavaScriptException(); + } else { + instance->_construction_failed = false; + } +# endif // NAPI_CPP_EXCEPTIONS + return callbackInfo.This(); + }); + + return wrapper; +} + +template +inline napi_value ObjectWrap::StaticVoidMethodCallbackWrapper( + napi_env env, + napi_callback_info info) { + return details::WrapCallback([&] { + CallbackInfo callbackInfo(env, info); + StaticVoidMethodCallbackData* callbackData = + reinterpret_cast(callbackInfo.Data()); + callbackInfo.SetData(callbackData->data); + callbackData->callback(callbackInfo); + return nullptr; + }); +} + +template +inline napi_value ObjectWrap::StaticMethodCallbackWrapper( + napi_env env, + napi_callback_info info) { + return details::WrapCallback([&] { + CallbackInfo callbackInfo(env, info); + StaticMethodCallbackData* callbackData = + reinterpret_cast(callbackInfo.Data()); + callbackInfo.SetData(callbackData->data); + return callbackData->callback(callbackInfo); + }); +} + +template +inline napi_value ObjectWrap::StaticGetterCallbackWrapper( + napi_env env, + napi_callback_info info) { + return details::WrapCallback([&] { + CallbackInfo callbackInfo(env, info); + StaticAccessorCallbackData* callbackData = + reinterpret_cast(callbackInfo.Data()); + callbackInfo.SetData(callbackData->data); + return callbackData->getterCallback(callbackInfo); + }); +} + +template +inline napi_value ObjectWrap::StaticSetterCallbackWrapper( + napi_env env, + napi_callback_info info) { + return details::WrapCallback([&] { + CallbackInfo callbackInfo(env, info); + StaticAccessorCallbackData* callbackData = + reinterpret_cast(callbackInfo.Data()); + callbackInfo.SetData(callbackData->data); + callbackData->setterCallback(callbackInfo, callbackInfo[0]); + return nullptr; + }); +} + +template +inline void ObjectWrap::FinalizeCallback(napi_env env, void* data, void* /*hint*/) { + HandleScope scope(env); + T* instance = static_cast(data); + instance->Finalize(Napi::Env(env)); + delete instance; +} + +template +template ::StaticSetterCallback method> +inline napi_value ObjectWrap::WrappedMethod( + napi_env env, napi_callback_info info) NAPI_NOEXCEPT { + return details::WrapCallback([&] { + const CallbackInfo cbInfo(env, info); + method(cbInfo, cbInfo[0]); + return nullptr; + }); +} + +//////////////////////////////////////////////////////////////////////////////// +// HandleScope class +//////////////////////////////////////////////////////////////////////////////// + +inline HandleScope::HandleScope(napi_env env, napi_handle_scope scope) + : _env(env), _scope(scope) { +} + +inline HandleScope::HandleScope(Napi::Env env) : _env(env) { + napi_status status = napi_open_handle_scope(_env, &_scope); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +inline HandleScope::~HandleScope() { + napi_status status = napi_close_handle_scope(_env, _scope); + NAPI_FATAL_IF_FAILED(status, + "HandleScope::~HandleScope", + "napi_close_handle_scope"); +} + +inline HandleScope::operator napi_handle_scope() const { + return _scope; +} + +inline Napi::Env HandleScope::Env() const { + return Napi::Env(_env); +} + +//////////////////////////////////////////////////////////////////////////////// +// EscapableHandleScope class +//////////////////////////////////////////////////////////////////////////////// + +inline EscapableHandleScope::EscapableHandleScope( + napi_env env, napi_escapable_handle_scope scope) : _env(env), _scope(scope) { +} + +inline EscapableHandleScope::EscapableHandleScope(Napi::Env env) : _env(env) { + napi_status status = napi_open_escapable_handle_scope(_env, &_scope); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +inline EscapableHandleScope::~EscapableHandleScope() { + napi_status status = napi_close_escapable_handle_scope(_env, _scope); + NAPI_FATAL_IF_FAILED(status, + "EscapableHandleScope::~EscapableHandleScope", + "napi_close_escapable_handle_scope"); +} + +inline EscapableHandleScope::operator napi_escapable_handle_scope() const { + return _scope; +} + +inline Napi::Env EscapableHandleScope::Env() const { + return Napi::Env(_env); +} + +inline Value EscapableHandleScope::Escape(napi_value escapee) { + napi_value result; + napi_status status = napi_escape_handle(_env, _scope, escapee, &result); + NAPI_THROW_IF_FAILED(_env, status, Value()); + return Value(_env, result); +} + + +#if (NAPI_VERSION > 2) +//////////////////////////////////////////////////////////////////////////////// +// CallbackScope class +//////////////////////////////////////////////////////////////////////////////// + +inline CallbackScope::CallbackScope( + napi_env env, napi_callback_scope scope) : _env(env), _scope(scope) { +} + +inline CallbackScope::CallbackScope(napi_env env, napi_async_context context) + : _env(env) { + napi_status status = napi_open_callback_scope( + _env, Object::New(env), context, &_scope); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +inline CallbackScope::~CallbackScope() { + napi_status status = napi_close_callback_scope(_env, _scope); + NAPI_FATAL_IF_FAILED(status, + "CallbackScope::~CallbackScope", + "napi_close_callback_scope"); +} + +inline CallbackScope::operator napi_callback_scope() const { + return _scope; +} + +inline Napi::Env CallbackScope::Env() const { + return Napi::Env(_env); +} +#endif + +//////////////////////////////////////////////////////////////////////////////// +// AsyncContext class +//////////////////////////////////////////////////////////////////////////////// + +inline AsyncContext::AsyncContext(napi_env env, const char* resource_name) + : AsyncContext(env, resource_name, Object::New(env)) { +} + +inline AsyncContext::AsyncContext(napi_env env, + const char* resource_name, + const Object& resource) + : _env(env), _context(nullptr) { + napi_value resource_id; + napi_status status = napi_create_string_utf8( + _env, resource_name, NAPI_AUTO_LENGTH, &resource_id); + NAPI_THROW_IF_FAILED_VOID(_env, status); + + status = napi_async_init(_env, resource, resource_id, &_context); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +inline AsyncContext::~AsyncContext() { + if (_context != nullptr) { + napi_async_destroy(_env, _context); + _context = nullptr; + } +} + +inline AsyncContext::AsyncContext(AsyncContext&& other) { + _env = other._env; + other._env = nullptr; + _context = other._context; + other._context = nullptr; +} + +inline AsyncContext& AsyncContext::operator =(AsyncContext&& other) { + _env = other._env; + other._env = nullptr; + _context = other._context; + other._context = nullptr; + return *this; +} + +inline AsyncContext::operator napi_async_context() const { + return _context; +} + +inline Napi::Env AsyncContext::Env() const { + return Napi::Env(_env); +} + +//////////////////////////////////////////////////////////////////////////////// +// AsyncWorker class +//////////////////////////////////////////////////////////////////////////////// + +inline AsyncWorker::AsyncWorker(const Function& callback) + : AsyncWorker(callback, "generic") { +} + +inline AsyncWorker::AsyncWorker(const Function& callback, + const char* resource_name) + : AsyncWorker(callback, resource_name, Object::New(callback.Env())) { +} + +inline AsyncWorker::AsyncWorker(const Function& callback, + const char* resource_name, + const Object& resource) + : AsyncWorker(Object::New(callback.Env()), + callback, + resource_name, + resource) { +} + +inline AsyncWorker::AsyncWorker(const Object& receiver, + const Function& callback) + : AsyncWorker(receiver, callback, "generic") { +} + +inline AsyncWorker::AsyncWorker(const Object& receiver, + const Function& callback, + const char* resource_name) + : AsyncWorker(receiver, + callback, + resource_name, + Object::New(callback.Env())) { +} + +inline AsyncWorker::AsyncWorker(const Object& receiver, + const Function& callback, + const char* resource_name, + const Object& resource) + : _env(callback.Env()), + _receiver(Napi::Persistent(receiver)), + _callback(Napi::Persistent(callback)), + _suppress_destruct(false) { + napi_value resource_id; + napi_status status = napi_create_string_latin1( + _env, resource_name, NAPI_AUTO_LENGTH, &resource_id); + NAPI_THROW_IF_FAILED_VOID(_env, status); + + status = napi_create_async_work(_env, resource, resource_id, OnAsyncWorkExecute, + OnAsyncWorkComplete, this, &_work); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +inline AsyncWorker::AsyncWorker(Napi::Env env) + : AsyncWorker(env, "generic") { +} + +inline AsyncWorker::AsyncWorker(Napi::Env env, + const char* resource_name) + : AsyncWorker(env, resource_name, Object::New(env)) { +} + +inline AsyncWorker::AsyncWorker(Napi::Env env, + const char* resource_name, + const Object& resource) + : _env(env), + _receiver(), + _callback(), + _suppress_destruct(false) { + napi_value resource_id; + napi_status status = napi_create_string_latin1( + _env, resource_name, NAPI_AUTO_LENGTH, &resource_id); + NAPI_THROW_IF_FAILED_VOID(_env, status); + + status = napi_create_async_work(_env, resource, resource_id, OnAsyncWorkExecute, + OnAsyncWorkComplete, this, &_work); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +inline AsyncWorker::~AsyncWorker() { + if (_work != nullptr) { + napi_delete_async_work(_env, _work); + _work = nullptr; + } +} + +inline void AsyncWorker::Destroy() { + delete this; +} + +inline AsyncWorker::AsyncWorker(AsyncWorker&& other) { + _env = other._env; + other._env = nullptr; + _work = other._work; + other._work = nullptr; + _receiver = std::move(other._receiver); + _callback = std::move(other._callback); + _error = std::move(other._error); + _suppress_destruct = other._suppress_destruct; +} + +inline AsyncWorker& AsyncWorker::operator =(AsyncWorker&& other) { + _env = other._env; + other._env = nullptr; + _work = other._work; + other._work = nullptr; + _receiver = std::move(other._receiver); + _callback = std::move(other._callback); + _error = std::move(other._error); + _suppress_destruct = other._suppress_destruct; + return *this; +} + +inline AsyncWorker::operator napi_async_work() const { + return _work; +} + +inline Napi::Env AsyncWorker::Env() const { + return Napi::Env(_env); +} + +inline void AsyncWorker::Queue() { + napi_status status = napi_queue_async_work(_env, _work); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +inline void AsyncWorker::Cancel() { + napi_status status = napi_cancel_async_work(_env, _work); + NAPI_THROW_IF_FAILED_VOID(_env, status); +} + +inline ObjectReference& AsyncWorker::Receiver() { + return _receiver; +} + +inline FunctionReference& AsyncWorker::Callback() { + return _callback; +} + +inline void AsyncWorker::SuppressDestruct() { + _suppress_destruct = true; +} + +inline void AsyncWorker::OnOK() { + if (!_callback.IsEmpty()) { + _callback.Call(_receiver.Value(), GetResult(_callback.Env())); + } +} + +inline void AsyncWorker::OnError(const Error& e) { + if (!_callback.IsEmpty()) { + _callback.Call(_receiver.Value(), std::initializer_list{ e.Value() }); + } +} + +inline void AsyncWorker::SetError(const std::string& error) { + _error = error; +} + +inline std::vector AsyncWorker::GetResult(Napi::Env /*env*/) { + return {}; +} +// The OnAsyncWorkExecute method receives an napi_env argument. However, do NOT +// use it within this method, as it does not run on the JavaScript thread and +// must not run any method that would cause JavaScript to run. In practice, +// this means that almost any use of napi_env will be incorrect. +inline void AsyncWorker::OnAsyncWorkExecute(napi_env env, void* asyncworker) { + AsyncWorker* self = static_cast(asyncworker); + self->OnExecute(env); +} +// The OnExecute method receives an napi_env argument. However, do NOT +// use it within this method, as it does not run on the JavaScript thread and +// must not run any method that would cause JavaScript to run. In practice, +// this means that almost any use of napi_env will be incorrect. +inline void AsyncWorker::OnExecute(Napi::Env /*DO_NOT_USE*/) { +#ifdef NAPI_CPP_EXCEPTIONS + try { + Execute(); + } catch (const std::exception& e) { + SetError(e.what()); + } +#else // NAPI_CPP_EXCEPTIONS + Execute(); +#endif // NAPI_CPP_EXCEPTIONS +} + +inline void AsyncWorker::OnAsyncWorkComplete(napi_env env, + napi_status status, + void* asyncworker) { + AsyncWorker* self = static_cast(asyncworker); + self->OnWorkComplete(env, status); +} +inline void AsyncWorker::OnWorkComplete(Napi::Env /*env*/, napi_status status) { + if (status != napi_cancelled) { + HandleScope scope(_env); + details::WrapCallback([&] { + if (_error.size() == 0) { + OnOK(); + } + else { + OnError(Error::New(_env, _error)); + } + return nullptr; + }); + } + if (!_suppress_destruct) { + Destroy(); + } +} + +#if (NAPI_VERSION > 3 && !defined(__wasm32__)) +//////////////////////////////////////////////////////////////////////////////// +// TypedThreadSafeFunction class +//////////////////////////////////////////////////////////////////////////////// + +// Starting with NAPI 5, the JavaScript function `func` parameter of +// `napi_create_threadsafe_function` is optional. +#if NAPI_VERSION > 4 +// static, with Callback [missing] Resource [missing] Finalizer [missing] +template +template +inline TypedThreadSafeFunction +TypedThreadSafeFunction::New( + napi_env env, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context) { + TypedThreadSafeFunction tsfn; + + napi_status status = + napi_create_threadsafe_function(env, + nullptr, + nullptr, + String::From(env, resourceName), + maxQueueSize, + initialThreadCount, + nullptr, + nullptr, + context, + CallJsInternal, + &tsfn._tsfn); + if (status != napi_ok) { + NAPI_THROW_IF_FAILED( + env, status, TypedThreadSafeFunction()); + } + + return tsfn; +} + +// static, with Callback [missing] Resource [passed] Finalizer [missing] +template +template +inline TypedThreadSafeFunction +TypedThreadSafeFunction::New( + napi_env env, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context) { + TypedThreadSafeFunction tsfn; + + napi_status status = + napi_create_threadsafe_function(env, + nullptr, + resource, + String::From(env, resourceName), + maxQueueSize, + initialThreadCount, + nullptr, + nullptr, + context, + CallJsInternal, + &tsfn._tsfn); + if (status != napi_ok) { + NAPI_THROW_IF_FAILED( + env, status, TypedThreadSafeFunction()); + } + + return tsfn; +} + +// static, with Callback [missing] Resource [missing] Finalizer [passed] +template +template +inline TypedThreadSafeFunction +TypedThreadSafeFunction::New( + napi_env env, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data) { + TypedThreadSafeFunction tsfn; + + auto* finalizeData = new details:: + ThreadSafeFinalize( + {data, finalizeCallback}); + napi_status status = napi_create_threadsafe_function( + env, + nullptr, + nullptr, + String::From(env, resourceName), + maxQueueSize, + initialThreadCount, + finalizeData, + details::ThreadSafeFinalize:: + FinalizeFinalizeWrapperWithDataAndContext, + context, + CallJsInternal, + &tsfn._tsfn); + if (status != napi_ok) { + delete finalizeData; + NAPI_THROW_IF_FAILED( + env, status, TypedThreadSafeFunction()); + } + + return tsfn; +} + +// static, with Callback [missing] Resource [passed] Finalizer [passed] +template +template +inline TypedThreadSafeFunction +TypedThreadSafeFunction::New( + napi_env env, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data) { + TypedThreadSafeFunction tsfn; + + auto* finalizeData = new details:: + ThreadSafeFinalize( + {data, finalizeCallback}); + napi_status status = napi_create_threadsafe_function( + env, + nullptr, + resource, + String::From(env, resourceName), + maxQueueSize, + initialThreadCount, + finalizeData, + details::ThreadSafeFinalize:: + FinalizeFinalizeWrapperWithDataAndContext, + context, + CallJsInternal, + &tsfn._tsfn); + if (status != napi_ok) { + delete finalizeData; + NAPI_THROW_IF_FAILED( + env, status, TypedThreadSafeFunction()); + } + + return tsfn; +} +#endif + +// static, with Callback [passed] Resource [missing] Finalizer [missing] +template +template +inline TypedThreadSafeFunction +TypedThreadSafeFunction::New( + napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context) { + TypedThreadSafeFunction tsfn; + + napi_status status = + napi_create_threadsafe_function(env, + callback, + nullptr, + String::From(env, resourceName), + maxQueueSize, + initialThreadCount, + nullptr, + nullptr, + context, + CallJsInternal, + &tsfn._tsfn); + if (status != napi_ok) { + NAPI_THROW_IF_FAILED( + env, status, TypedThreadSafeFunction()); + } + + return tsfn; +} + +// static, with Callback [passed] Resource [passed] Finalizer [missing] +template +template +inline TypedThreadSafeFunction +TypedThreadSafeFunction::New( + napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context) { + TypedThreadSafeFunction tsfn; + + napi_status status = + napi_create_threadsafe_function(env, + callback, + resource, + String::From(env, resourceName), + maxQueueSize, + initialThreadCount, + nullptr, + nullptr, + context, + CallJsInternal, + &tsfn._tsfn); + if (status != napi_ok) { + NAPI_THROW_IF_FAILED( + env, status, TypedThreadSafeFunction()); + } + + return tsfn; +} + +// static, with Callback [passed] Resource [missing] Finalizer [passed] +template +template +inline TypedThreadSafeFunction +TypedThreadSafeFunction::New( + napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data) { + TypedThreadSafeFunction tsfn; + + auto* finalizeData = new details:: + ThreadSafeFinalize( + {data, finalizeCallback}); + napi_status status = napi_create_threadsafe_function( + env, + callback, + nullptr, + String::From(env, resourceName), + maxQueueSize, + initialThreadCount, + finalizeData, + details::ThreadSafeFinalize:: + FinalizeFinalizeWrapperWithDataAndContext, + context, + CallJsInternal, + &tsfn._tsfn); + if (status != napi_ok) { + delete finalizeData; + NAPI_THROW_IF_FAILED( + env, status, TypedThreadSafeFunction()); + } + + return tsfn; +} + +// static, with: Callback [passed] Resource [passed] Finalizer [passed] +template +template +inline TypedThreadSafeFunction +TypedThreadSafeFunction::New( + napi_env env, + CallbackType callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data) { + TypedThreadSafeFunction tsfn; + + auto* finalizeData = new details:: + ThreadSafeFinalize( + {data, finalizeCallback}); + napi_status status = napi_create_threadsafe_function( + env, + details::DefaultCallbackWrapper< + CallbackType, + TypedThreadSafeFunction>(env, + callback), + resource, + String::From(env, resourceName), + maxQueueSize, + initialThreadCount, + finalizeData, + details::ThreadSafeFinalize:: + FinalizeFinalizeWrapperWithDataAndContext, + context, + CallJsInternal, + &tsfn._tsfn); + if (status != napi_ok) { + delete finalizeData; + NAPI_THROW_IF_FAILED( + env, status, TypedThreadSafeFunction()); + } + + return tsfn; +} + +template +inline TypedThreadSafeFunction:: + TypedThreadSafeFunction() + : _tsfn() {} + +template +inline TypedThreadSafeFunction:: + TypedThreadSafeFunction(napi_threadsafe_function tsfn) + : _tsfn(tsfn) {} + +template +inline TypedThreadSafeFunction:: +operator napi_threadsafe_function() const { + return _tsfn; +} + +template +inline napi_status +TypedThreadSafeFunction::BlockingCall( + DataType* data) const { + return napi_call_threadsafe_function(_tsfn, data, napi_tsfn_blocking); +} + +template +inline napi_status +TypedThreadSafeFunction::NonBlockingCall( + DataType* data) const { + return napi_call_threadsafe_function(_tsfn, data, napi_tsfn_nonblocking); +} + +template +inline void TypedThreadSafeFunction::Ref( + napi_env env) const { + if (_tsfn != nullptr) { + napi_status status = napi_ref_threadsafe_function(env, _tsfn); + NAPI_THROW_IF_FAILED_VOID(env, status); + } +} + +template +inline void TypedThreadSafeFunction::Unref( + napi_env env) const { + if (_tsfn != nullptr) { + napi_status status = napi_unref_threadsafe_function(env, _tsfn); + NAPI_THROW_IF_FAILED_VOID(env, status); + } +} + +template +inline napi_status +TypedThreadSafeFunction::Acquire() const { + return napi_acquire_threadsafe_function(_tsfn); +} + +template +inline napi_status +TypedThreadSafeFunction::Release() { + return napi_release_threadsafe_function(_tsfn, napi_tsfn_release); +} + +template +inline napi_status +TypedThreadSafeFunction::Abort() { + return napi_release_threadsafe_function(_tsfn, napi_tsfn_abort); +} + +template +inline ContextType* +TypedThreadSafeFunction::GetContext() const { + void* context; + napi_status status = napi_get_threadsafe_function_context(_tsfn, &context); + NAPI_FATAL_IF_FAILED(status, + "TypedThreadSafeFunction::GetContext", + "napi_get_threadsafe_function_context"); + return static_cast(context); +} + +// static +template +void TypedThreadSafeFunction::CallJsInternal( + napi_env env, napi_value jsCallback, void* context, void* data) { + details::CallJsWrapper( + env, jsCallback, context, data); +} + +#if NAPI_VERSION == 4 +// static +template +Napi::Function +TypedThreadSafeFunction::EmptyFunctionFactory( + Napi::Env env) { + return Napi::Function::New(env, [](const CallbackInfo& cb) {}); +} + +// static +template +Napi::Function +TypedThreadSafeFunction::FunctionOrEmpty( + Napi::Env env, Napi::Function& callback) { + if (callback.IsEmpty()) { + return EmptyFunctionFactory(env); + } + return callback; +} + +#else +// static +template +std::nullptr_t +TypedThreadSafeFunction::EmptyFunctionFactory( + Napi::Env /*env*/) { + return nullptr; +} + +// static +template +Napi::Function +TypedThreadSafeFunction::FunctionOrEmpty( + Napi::Env /*env*/, Napi::Function& callback) { + return callback; +} + +#endif + +//////////////////////////////////////////////////////////////////////////////// +// ThreadSafeFunction class +//////////////////////////////////////////////////////////////////////////////// + +// static +template +inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount) { + return New(env, callback, Object(), resourceName, maxQueueSize, + initialThreadCount); +} + +// static +template +inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context) { + return New(env, callback, Object(), resourceName, maxQueueSize, + initialThreadCount, context); +} + +// static +template +inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + Finalizer finalizeCallback) { + return New(env, callback, Object(), resourceName, maxQueueSize, + initialThreadCount, finalizeCallback); +} + +// static +template +inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + Finalizer finalizeCallback, + FinalizerDataType* data) { + return New(env, callback, Object(), resourceName, maxQueueSize, + initialThreadCount, finalizeCallback, data); +} + +// static +template +inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback) { + return New(env, callback, Object(), resourceName, maxQueueSize, + initialThreadCount, context, finalizeCallback); +} + +// static +template +inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data) { + return New(env, callback, Object(), resourceName, maxQueueSize, + initialThreadCount, context, finalizeCallback, data); +} + +// static +template +inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount) { + return New(env, callback, resource, resourceName, maxQueueSize, + initialThreadCount, static_cast(nullptr) /* context */); +} + +// static +template +inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context) { + return New(env, callback, resource, resourceName, maxQueueSize, + initialThreadCount, context, + [](Env, ContextType*) {} /* empty finalizer */); +} + +// static +template +inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + Finalizer finalizeCallback) { + return New(env, callback, resource, resourceName, maxQueueSize, + initialThreadCount, static_cast(nullptr) /* context */, + finalizeCallback, static_cast(nullptr) /* data */, + details::ThreadSafeFinalize::Wrapper); +} + +// static +template +inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + Finalizer finalizeCallback, + FinalizerDataType* data) { + return New(env, callback, resource, resourceName, maxQueueSize, + initialThreadCount, static_cast(nullptr) /* context */, + finalizeCallback, data, + details::ThreadSafeFinalize< + void, Finalizer, FinalizerDataType>::FinalizeWrapperWithData); +} + +// static +template +inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback) { + return New(env, callback, resource, resourceName, maxQueueSize, + initialThreadCount, context, finalizeCallback, + static_cast(nullptr) /* data */, + details::ThreadSafeFinalize< + ContextType, Finalizer>::FinalizeWrapperWithContext); +} + +// static +template +inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data) { + return New(env, callback, resource, resourceName, maxQueueSize, + initialThreadCount, context, finalizeCallback, data, + details::ThreadSafeFinalize::FinalizeFinalizeWrapperWithDataAndContext); +} + +inline ThreadSafeFunction::ThreadSafeFunction() + : _tsfn() { +} + +inline ThreadSafeFunction::ThreadSafeFunction( + napi_threadsafe_function tsfn) + : _tsfn(tsfn) { +} + +inline ThreadSafeFunction::operator napi_threadsafe_function() const { + return _tsfn; +} + +inline napi_status ThreadSafeFunction::BlockingCall() const { + return CallInternal(nullptr, napi_tsfn_blocking); +} + +template <> +inline napi_status ThreadSafeFunction::BlockingCall( + void* data) const { + return napi_call_threadsafe_function(_tsfn, data, napi_tsfn_blocking); +} + +template +inline napi_status ThreadSafeFunction::BlockingCall( + Callback callback) const { + return CallInternal(new CallbackWrapper(callback), napi_tsfn_blocking); +} + +template +inline napi_status ThreadSafeFunction::BlockingCall( + DataType* data, Callback callback) const { + auto wrapper = [data, callback](Env env, Function jsCallback) { + callback(env, jsCallback, data); + }; + return CallInternal(new CallbackWrapper(wrapper), napi_tsfn_blocking); +} + +inline napi_status ThreadSafeFunction::NonBlockingCall() const { + return CallInternal(nullptr, napi_tsfn_nonblocking); +} + +template <> +inline napi_status ThreadSafeFunction::NonBlockingCall( + void* data) const { + return napi_call_threadsafe_function(_tsfn, data, napi_tsfn_nonblocking); +} + +template +inline napi_status ThreadSafeFunction::NonBlockingCall( + Callback callback) const { + return CallInternal(new CallbackWrapper(callback), napi_tsfn_nonblocking); +} + +template +inline napi_status ThreadSafeFunction::NonBlockingCall( + DataType* data, Callback callback) const { + auto wrapper = [data, callback](Env env, Function jsCallback) { + callback(env, jsCallback, data); + }; + return CallInternal(new CallbackWrapper(wrapper), napi_tsfn_nonblocking); +} + +inline void ThreadSafeFunction::Ref(napi_env env) const { + if (_tsfn != nullptr) { + napi_status status = napi_ref_threadsafe_function(env, _tsfn); + NAPI_THROW_IF_FAILED_VOID(env, status); + } +} + +inline void ThreadSafeFunction::Unref(napi_env env) const { + if (_tsfn != nullptr) { + napi_status status = napi_unref_threadsafe_function(env, _tsfn); + NAPI_THROW_IF_FAILED_VOID(env, status); + } +} + +inline napi_status ThreadSafeFunction::Acquire() const { + return napi_acquire_threadsafe_function(_tsfn); +} + +inline napi_status ThreadSafeFunction::Release() { + return napi_release_threadsafe_function(_tsfn, napi_tsfn_release); +} + +inline napi_status ThreadSafeFunction::Abort() { + return napi_release_threadsafe_function(_tsfn, napi_tsfn_abort); +} + +inline ThreadSafeFunction::ConvertibleContext +ThreadSafeFunction::GetContext() const { + void* context; + napi_status status = napi_get_threadsafe_function_context(_tsfn, &context); + NAPI_FATAL_IF_FAILED(status, "ThreadSafeFunction::GetContext", "napi_get_threadsafe_function_context"); + return ConvertibleContext({ context }); +} + +// static +template +inline ThreadSafeFunction ThreadSafeFunction::New(napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data, + napi_finalize wrapper) { + static_assert(details::can_make_string::value + || std::is_convertible::value, + "Resource name should be convertible to the string type"); + + ThreadSafeFunction tsfn; + auto* finalizeData = new details::ThreadSafeFinalize({ data, finalizeCallback }); + napi_status status = napi_create_threadsafe_function(env, callback, resource, + Value::From(env, resourceName), maxQueueSize, initialThreadCount, + finalizeData, wrapper, context, CallJS, &tsfn._tsfn); + if (status != napi_ok) { + delete finalizeData; + NAPI_THROW_IF_FAILED(env, status, ThreadSafeFunction()); + } + + return tsfn; +} + +inline napi_status ThreadSafeFunction::CallInternal( + CallbackWrapper* callbackWrapper, + napi_threadsafe_function_call_mode mode) const { + napi_status status = napi_call_threadsafe_function( + _tsfn, callbackWrapper, mode); + if (status != napi_ok && callbackWrapper != nullptr) { + delete callbackWrapper; + } + + return status; +} + +// static +inline void ThreadSafeFunction::CallJS(napi_env env, + napi_value jsCallback, + void* /* context */, + void* data) { + if (env == nullptr && jsCallback == nullptr) { + return; + } + + if (data != nullptr) { + auto* callbackWrapper = static_cast(data); + (*callbackWrapper)(env, Function(env, jsCallback)); + delete callbackWrapper; + } else if (jsCallback != nullptr) { + Function(env, jsCallback).Call({}); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Async Progress Worker Base class +//////////////////////////////////////////////////////////////////////////////// +template +inline AsyncProgressWorkerBase::AsyncProgressWorkerBase(const Object& receiver, + const Function& callback, + const char* resource_name, + const Object& resource, + size_t queue_size) + : AsyncWorker(receiver, callback, resource_name, resource) { + // Fill all possible arguments to work around ambiguous ThreadSafeFunction::New signatures. + _tsfn = ThreadSafeFunction::New(callback.Env(), + callback, + resource, + resource_name, + queue_size, + /** initialThreadCount */ 1, + /** context */ this, + OnThreadSafeFunctionFinalize, + /** finalizeData */ this); +} + +#if NAPI_VERSION > 4 +template +inline AsyncProgressWorkerBase::AsyncProgressWorkerBase(Napi::Env env, + const char* resource_name, + const Object& resource, + size_t queue_size) + : AsyncWorker(env, resource_name, resource) { + // TODO: Once the changes to make the callback optional for threadsafe + // functions are available on all versions we can remove the dummy Function here. + Function callback; + // Fill all possible arguments to work around ambiguous ThreadSafeFunction::New signatures. + _tsfn = ThreadSafeFunction::New(env, + callback, + resource, + resource_name, + queue_size, + /** initialThreadCount */ 1, + /** context */ this, + OnThreadSafeFunctionFinalize, + /** finalizeData */ this); +} +#endif + +template +inline AsyncProgressWorkerBase::~AsyncProgressWorkerBase() { + // Abort pending tsfn call. + // Don't send progress events after we've already completed. + // It's ok to call ThreadSafeFunction::Abort and ThreadSafeFunction::Release duplicated. + _tsfn.Abort(); +} + +template +inline void AsyncProgressWorkerBase::OnAsyncWorkProgress(Napi::Env /* env */, + Napi::Function /* jsCallback */, + void* data) { + ThreadSafeData* tsd = static_cast(data); + tsd->asyncprogressworker()->OnWorkProgress(tsd->data()); + delete tsd; +} + +template +inline napi_status AsyncProgressWorkerBase::NonBlockingCall(DataType* data) { + auto tsd = new AsyncProgressWorkerBase::ThreadSafeData(this, data); + return _tsfn.NonBlockingCall(tsd, OnAsyncWorkProgress); +} + +template +inline void AsyncProgressWorkerBase::OnWorkComplete(Napi::Env /* env */, napi_status status) { + _work_completed = true; + _complete_status = status; + _tsfn.Release(); +} + +template +inline void AsyncProgressWorkerBase::OnThreadSafeFunctionFinalize(Napi::Env env, void* /* data */, AsyncProgressWorkerBase* context) { + if (context->_work_completed) { + context->AsyncWorker::OnWorkComplete(env, context->_complete_status); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// Async Progress Worker class +//////////////////////////////////////////////////////////////////////////////// +template +inline AsyncProgressWorker::AsyncProgressWorker(const Function& callback) + : AsyncProgressWorker(callback, "generic") { +} + +template +inline AsyncProgressWorker::AsyncProgressWorker(const Function& callback, + const char* resource_name) + : AsyncProgressWorker(callback, resource_name, Object::New(callback.Env())) { +} + +template +inline AsyncProgressWorker::AsyncProgressWorker(const Function& callback, + const char* resource_name, + const Object& resource) + : AsyncProgressWorker(Object::New(callback.Env()), + callback, + resource_name, + resource) { +} + +template +inline AsyncProgressWorker::AsyncProgressWorker(const Object& receiver, + const Function& callback) + : AsyncProgressWorker(receiver, callback, "generic") { +} + +template +inline AsyncProgressWorker::AsyncProgressWorker(const Object& receiver, + const Function& callback, + const char* resource_name) + : AsyncProgressWorker(receiver, + callback, + resource_name, + Object::New(callback.Env())) { +} + +template +inline AsyncProgressWorker::AsyncProgressWorker(const Object& receiver, + const Function& callback, + const char* resource_name, + const Object& resource) + : AsyncProgressWorkerBase(receiver, callback, resource_name, resource), + _asyncdata(nullptr), + _asyncsize(0) { +} + +#if NAPI_VERSION > 4 +template +inline AsyncProgressWorker::AsyncProgressWorker(Napi::Env env) + : AsyncProgressWorker(env, "generic") { +} + +template +inline AsyncProgressWorker::AsyncProgressWorker(Napi::Env env, + const char* resource_name) + : AsyncProgressWorker(env, resource_name, Object::New(env)) { +} + +template +inline AsyncProgressWorker::AsyncProgressWorker(Napi::Env env, + const char* resource_name, + const Object& resource) + : AsyncProgressWorkerBase(env, resource_name, resource), + _asyncdata(nullptr), + _asyncsize(0) { +} +#endif + +template +inline AsyncProgressWorker::~AsyncProgressWorker() { + { + std::lock_guard lock(this->_mutex); + _asyncdata = nullptr; + _asyncsize = 0; + } +} + +template +inline void AsyncProgressWorker::Execute() { + ExecutionProgress progress(this); + Execute(progress); +} + +template +inline void AsyncProgressWorker::OnWorkProgress(void*) { + T* data; + size_t size; + { + std::lock_guard lock(this->_mutex); + data = this->_asyncdata; + size = this->_asyncsize; + this->_asyncdata = nullptr; + this->_asyncsize = 0; + } + + /** + * The callback of ThreadSafeFunction is not been invoked immediately on the + * callback of uv_async_t (uv io poll), rather the callback of TSFN is + * invoked on the right next uv idle callback. There are chances that during + * the deferring the signal of uv_async_t is been sent again, i.e. potential + * not coalesced two calls of the TSFN callback. + */ + if (data == nullptr) { + return; + } + + this->OnProgress(data, size); + delete[] data; +} + +template +inline void AsyncProgressWorker::SendProgress_(const T* data, size_t count) { + T* new_data = new T[count]; + std::copy(data, data + count, new_data); + + T* old_data; + { + std::lock_guard lock(this->_mutex); + old_data = _asyncdata; + _asyncdata = new_data; + _asyncsize = count; + } + this->NonBlockingCall(nullptr); + + delete[] old_data; +} + +template +inline void AsyncProgressWorker::Signal() const { + this->NonBlockingCall(static_cast(nullptr)); +} + +template +inline void AsyncProgressWorker::ExecutionProgress::Signal() const { + _worker->Signal(); +} + +template +inline void AsyncProgressWorker::ExecutionProgress::Send(const T* data, size_t count) const { + _worker->SendProgress_(data, count); +} + +//////////////////////////////////////////////////////////////////////////////// +// Async Progress Queue Worker class +//////////////////////////////////////////////////////////////////////////////// +template +inline AsyncProgressQueueWorker::AsyncProgressQueueWorker(const Function& callback) + : AsyncProgressQueueWorker(callback, "generic") { +} + +template +inline AsyncProgressQueueWorker::AsyncProgressQueueWorker(const Function& callback, + const char* resource_name) + : AsyncProgressQueueWorker(callback, resource_name, Object::New(callback.Env())) { +} + +template +inline AsyncProgressQueueWorker::AsyncProgressQueueWorker(const Function& callback, + const char* resource_name, + const Object& resource) + : AsyncProgressQueueWorker(Object::New(callback.Env()), + callback, + resource_name, + resource) { +} + +template +inline AsyncProgressQueueWorker::AsyncProgressQueueWorker(const Object& receiver, + const Function& callback) + : AsyncProgressQueueWorker(receiver, callback, "generic") { +} + +template +inline AsyncProgressQueueWorker::AsyncProgressQueueWorker(const Object& receiver, + const Function& callback, + const char* resource_name) + : AsyncProgressQueueWorker(receiver, + callback, + resource_name, + Object::New(callback.Env())) { +} + +template +inline AsyncProgressQueueWorker::AsyncProgressQueueWorker(const Object& receiver, + const Function& callback, + const char* resource_name, + const Object& resource) + : AsyncProgressWorkerBase>(receiver, callback, resource_name, resource, /** unlimited queue size */0) { +} + +#if NAPI_VERSION > 4 +template +inline AsyncProgressQueueWorker::AsyncProgressQueueWorker(Napi::Env env) + : AsyncProgressQueueWorker(env, "generic") { +} + +template +inline AsyncProgressQueueWorker::AsyncProgressQueueWorker(Napi::Env env, + const char* resource_name) + : AsyncProgressQueueWorker(env, resource_name, Object::New(env)) { +} + +template +inline AsyncProgressQueueWorker::AsyncProgressQueueWorker(Napi::Env env, + const char* resource_name, + const Object& resource) + : AsyncProgressWorkerBase>(env, resource_name, resource, /** unlimited queue size */0) { +} +#endif + +template +inline void AsyncProgressQueueWorker::Execute() { + ExecutionProgress progress(this); + Execute(progress); +} + +template +inline void AsyncProgressQueueWorker::OnWorkProgress(std::pair* datapair) { + if (datapair == nullptr) { + return; + } + + T *data = datapair->first; + size_t size = datapair->second; + + this->OnProgress(data, size); + delete datapair; + delete[] data; +} + +template +inline void AsyncProgressQueueWorker::SendProgress_(const T* data, size_t count) { + T* new_data = new T[count]; + std::copy(data, data + count, new_data); + + auto pair = new std::pair(new_data, count); + this->NonBlockingCall(pair); +} + +template +inline void AsyncProgressQueueWorker::Signal() const { + this->NonBlockingCall(nullptr); +} + +template +inline void AsyncProgressQueueWorker::OnWorkComplete(Napi::Env env, napi_status status) { + // Draining queued items in TSFN. + AsyncProgressWorkerBase>::OnWorkComplete(env, status); +} + +template +inline void AsyncProgressQueueWorker::ExecutionProgress::Signal() const { + _worker->Signal(); +} + +template +inline void AsyncProgressQueueWorker::ExecutionProgress::Send(const T* data, size_t count) const { + _worker->SendProgress_(data, count); +} +#endif // NAPI_VERSION > 3 && !defined(__wasm32__) + +//////////////////////////////////////////////////////////////////////////////// +// Memory Management class +//////////////////////////////////////////////////////////////////////////////// + +inline int64_t MemoryManagement::AdjustExternalMemory(Env env, int64_t change_in_bytes) { + int64_t result; + napi_status status = napi_adjust_external_memory(env, change_in_bytes, &result); + NAPI_THROW_IF_FAILED(env, status, 0); + return result; +} + +//////////////////////////////////////////////////////////////////////////////// +// Version Management class +//////////////////////////////////////////////////////////////////////////////// + +inline uint32_t VersionManagement::GetNapiVersion(Env env) { + uint32_t result; + napi_status status = napi_get_version(env, &result); + NAPI_THROW_IF_FAILED(env, status, 0); + return result; +} + +inline const napi_node_version* VersionManagement::GetNodeVersion(Env env) { + const napi_node_version* result; + napi_status status = napi_get_node_version(env, &result); + NAPI_THROW_IF_FAILED(env, status, 0); + return result; +} + +#if NAPI_VERSION > 5 +//////////////////////////////////////////////////////////////////////////////// +// Addon class +//////////////////////////////////////////////////////////////////////////////// + +template +inline Object Addon::Init(Env env, Object exports) { + T* addon = new T(env, exports); + env.SetInstanceData(addon); + return addon->entry_point_; +} + +template +inline T* Addon::Unwrap(Object wrapper) { + return wrapper.Env().GetInstanceData(); +} + +template +inline void +Addon::DefineAddon(Object exports, + const std::initializer_list& props) { + DefineProperties(exports, props); + entry_point_ = exports; +} + +template +inline Napi::Object +Addon::DefineProperties(Object object, + const std::initializer_list& props) { + const napi_property_descriptor* properties = + reinterpret_cast(props.begin()); + size_t size = props.size(); + napi_status status = napi_define_properties(object.Env(), + object, + size, + properties); + NAPI_THROW_IF_FAILED(object.Env(), status, object); + for (size_t idx = 0; idx < size; idx++) + T::AttachPropData(object.Env(), object, &properties[idx]); + return object; +} +#endif // NAPI_VERSION > 5 + +} // namespace Napi + +#endif // SRC_NAPI_INL_H_ diff --git a/lwnode/apps/sqlite3/deps/include/napi.h b/lwnode/apps/sqlite3/deps/include/napi.h new file mode 100644 index 0000000..7dc9b17 --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/napi.h @@ -0,0 +1,2727 @@ +#ifndef SRC_NAPI_H_ +#define SRC_NAPI_H_ + +#include +#include +#include +#include +#include +#include +#include + +// VS2015 RTM has bugs with constexpr, so require min of VS2015 Update 3 (known good version) +#if !defined(_MSC_VER) || _MSC_FULL_VER >= 190024210 +#define NAPI_HAS_CONSTEXPR 1 +#endif + +// VS2013 does not support char16_t literal strings, so we'll work around it using wchar_t strings +// and casting them. This is safe as long as the character sizes are the same. +#if defined(_MSC_VER) && _MSC_VER <= 1800 +static_assert(sizeof(char16_t) == sizeof(wchar_t), "Size mismatch between char16_t and wchar_t"); +#define NAPI_WIDE_TEXT(x) reinterpret_cast(L ## x) +#else +#define NAPI_WIDE_TEXT(x) u ## x +#endif + +// If C++ exceptions are not explicitly enabled or disabled, enable them +// if exceptions were enabled in the compiler settings. +#if !defined(NAPI_CPP_EXCEPTIONS) && !defined(NAPI_DISABLE_CPP_EXCEPTIONS) + #if defined(_CPPUNWIND) || defined (__EXCEPTIONS) + #define NAPI_CPP_EXCEPTIONS + #else + #error Exception support not detected. \ + Define either NAPI_CPP_EXCEPTIONS or NAPI_DISABLE_CPP_EXCEPTIONS. + #endif +#endif + +#ifdef _NOEXCEPT + #define NAPI_NOEXCEPT _NOEXCEPT +#else + #define NAPI_NOEXCEPT noexcept +#endif + +#ifdef NAPI_CPP_EXCEPTIONS + +// When C++ exceptions are enabled, Errors are thrown directly. There is no need +// to return anything after the throw statements. The variadic parameter is an +// optional return value that is ignored. +// We need _VOID versions of the macros to avoid warnings resulting from +// leaving the NAPI_THROW_* `...` argument empty. + +#define NAPI_THROW(e, ...) throw e +#define NAPI_THROW_VOID(e) throw e + +#define NAPI_THROW_IF_FAILED(env, status, ...) \ + if ((status) != napi_ok) throw Napi::Error::New(env); + +#define NAPI_THROW_IF_FAILED_VOID(env, status) \ + if ((status) != napi_ok) throw Napi::Error::New(env); + +#else // NAPI_CPP_EXCEPTIONS + +// When C++ exceptions are disabled, Errors are thrown as JavaScript exceptions, +// which are pending until the callback returns to JS. The variadic parameter +// is an optional return value; usually it is an empty result. +// We need _VOID versions of the macros to avoid warnings resulting from +// leaving the NAPI_THROW_* `...` argument empty. + +#define NAPI_THROW(e, ...) \ + do { \ + (e).ThrowAsJavaScriptException(); \ + return __VA_ARGS__; \ + } while (0) + +#define NAPI_THROW_VOID(e) \ + do { \ + (e).ThrowAsJavaScriptException(); \ + return; \ + } while (0) + +#define NAPI_THROW_IF_FAILED(env, status, ...) \ + if ((status) != napi_ok) { \ + Napi::Error::New(env).ThrowAsJavaScriptException(); \ + return __VA_ARGS__; \ + } + +#define NAPI_THROW_IF_FAILED_VOID(env, status) \ + if ((status) != napi_ok) { \ + Napi::Error::New(env).ThrowAsJavaScriptException(); \ + return; \ + } + +#endif // NAPI_CPP_EXCEPTIONS + +# define NAPI_DISALLOW_ASSIGN(CLASS) void operator=(const CLASS&) = delete; +# define NAPI_DISALLOW_COPY(CLASS) CLASS(const CLASS&) = delete; + +#define NAPI_DISALLOW_ASSIGN_COPY(CLASS) \ + NAPI_DISALLOW_ASSIGN(CLASS) \ + NAPI_DISALLOW_COPY(CLASS) + +#define NAPI_FATAL_IF_FAILED(status, location, message) \ + do { \ + if ((status) != napi_ok) { \ + Napi::Error::Fatal((location), (message)); \ + } \ + } while (0) + +//////////////////////////////////////////////////////////////////////////////// +/// Node-API C++ Wrapper Classes +/// +/// These classes wrap the "Node-API" ABI-stable C APIs for Node.js, providing a +/// C++ object model and C++ exception-handling semantics with low overhead. +/// The wrappers are all header-only so that they do not affect the ABI. +//////////////////////////////////////////////////////////////////////////////// +namespace Napi { + + // Forward declarations + class Env; + class Value; + class Boolean; + class Number; +#if NAPI_VERSION > 5 + class BigInt; +#endif // NAPI_VERSION > 5 +#if (NAPI_VERSION > 4) + class Date; +#endif + class String; + class Object; + class Array; + class ArrayBuffer; + class Function; + class Error; + class PropertyDescriptor; + class CallbackInfo; + class TypedArray; + template class TypedArrayOf; + + using Int8Array = + TypedArrayOf; ///< Typed-array of signed 8-bit integers + using Uint8Array = + TypedArrayOf; ///< Typed-array of unsigned 8-bit integers + using Int16Array = + TypedArrayOf; ///< Typed-array of signed 16-bit integers + using Uint16Array = + TypedArrayOf; ///< Typed-array of unsigned 16-bit integers + using Int32Array = + TypedArrayOf; ///< Typed-array of signed 32-bit integers + using Uint32Array = + TypedArrayOf; ///< Typed-array of unsigned 32-bit integers + using Float32Array = + TypedArrayOf; ///< Typed-array of 32-bit floating-point values + using Float64Array = + TypedArrayOf; ///< Typed-array of 64-bit floating-point values +#if NAPI_VERSION > 5 + using BigInt64Array = + TypedArrayOf; ///< Typed array of signed 64-bit integers + using BigUint64Array = + TypedArrayOf; ///< Typed array of unsigned 64-bit integers +#endif // NAPI_VERSION > 5 + + /// Defines the signature of a Node-API C++ module's registration callback + /// (init) function. + using ModuleRegisterCallback = Object (*)(Env env, Object exports); + + class MemoryManagement; + + /// Environment for Node-API values and operations. + /// + /// All Node-API values and operations must be associated with an environment. + /// An environment instance is always provided to callback functions; that + /// environment must then be used for any creation of Node-API values or other + /// Node-API operations within the callback. (Many methods infer the + /// environment from the `this` instance that the method is called on.) + /// + /// In the future, multiple environments per process may be supported, + /// although current implementations only support one environment per process. + /// + /// In the V8 JavaScript engine, a Node-API environment approximately + /// corresponds to an Isolate. + class Env { +#if NAPI_VERSION > 5 + private: + template static void DefaultFini(Env, T* data); + template + static void DefaultFiniWithHint(Env, DataType* data, HintType* hint); +#endif // NAPI_VERSION > 5 + public: + Env(napi_env env); + + operator napi_env() const; + + Object Global() const; + Value Undefined() const; + Value Null() const; + + bool IsExceptionPending() const; + Error GetAndClearPendingException(); + + Value RunScript(const char* utf8script); + Value RunScript(const std::string& utf8script); + Value RunScript(String script); + +#if NAPI_VERSION > 5 + template T* GetInstanceData(); + + template using Finalizer = void (*)(Env, T*); + template fini = Env::DefaultFini> + void SetInstanceData(T* data); + + template + using FinalizerWithHint = void (*)(Env, DataType*, HintType*); + template fini = + Env::DefaultFiniWithHint> + void SetInstanceData(DataType* data, HintType* hint); +#endif // NAPI_VERSION > 5 + + private: + napi_env _env; + }; + + /// A JavaScript value of unknown type. + /// + /// For type-specific operations, convert to one of the Value subclasses using a `To*` or `As()` + /// method. The `To*` methods do type coercion; the `As()` method does not. + /// + /// Napi::Value value = ... + /// if (!value.IsString()) throw Napi::TypeError::New(env, "Invalid arg..."); + /// Napi::String str = value.As(); // Cast to a string value + /// + /// Napi::Value anotherValue = ... + /// bool isTruthy = anotherValue.ToBoolean(); // Coerce to a boolean value + class Value { + public: + Value(); ///< Creates a new _empty_ Value instance. + Value(napi_env env, + napi_value value); ///< Wraps a Node-API value primitive. + + /// Creates a JS value from a C++ primitive. + /// + /// `value` may be any of: + /// - bool + /// - Any integer type + /// - Any floating point type + /// - const char* (encoded using UTF-8, null-terminated) + /// - const char16_t* (encoded using UTF-16-LE, null-terminated) + /// - std::string (encoded using UTF-8) + /// - std::u16string + /// - napi::Value + /// - napi_value + template + static Value From(napi_env env, const T& value); + + /// Converts to a Node-API value primitive. + /// + /// If the instance is _empty_, this returns `nullptr`. + operator napi_value() const; + + /// Tests if this value strictly equals another value. + bool operator ==(const Value& other) const; + + /// Tests if this value does not strictly equal another value. + bool operator !=(const Value& other) const; + + /// Tests if this value strictly equals another value. + bool StrictEquals(const Value& other) const; + + /// Gets the environment the value is associated with. + Napi::Env Env() const; + + /// Checks if the value is empty (uninitialized). + /// + /// An empty value is invalid, and most attempts to perform an operation on an empty value + /// will result in an exception. Note an empty value is distinct from JavaScript `null` or + /// `undefined`, which are valid values. + /// + /// When C++ exceptions are disabled at compile time, a method with a `Value` return type may + /// return an empty value to indicate a pending exception. So when not using C++ exceptions, + /// callers should check whether the value is empty before attempting to use it. + bool IsEmpty() const; + + napi_valuetype Type() const; ///< Gets the type of the value. + + bool IsUndefined() const; ///< Tests if a value is an undefined JavaScript value. + bool IsNull() const; ///< Tests if a value is a null JavaScript value. + bool IsBoolean() const; ///< Tests if a value is a JavaScript boolean. + bool IsNumber() const; ///< Tests if a value is a JavaScript number. +#if NAPI_VERSION > 5 + bool IsBigInt() const; ///< Tests if a value is a JavaScript bigint. +#endif // NAPI_VERSION > 5 +#if (NAPI_VERSION > 4) + bool IsDate() const; ///< Tests if a value is a JavaScript date. +#endif + bool IsString() const; ///< Tests if a value is a JavaScript string. + bool IsSymbol() const; ///< Tests if a value is a JavaScript symbol. + bool IsArray() const; ///< Tests if a value is a JavaScript array. + bool IsArrayBuffer() const; ///< Tests if a value is a JavaScript array buffer. + bool IsTypedArray() const; ///< Tests if a value is a JavaScript typed array. + bool IsObject() const; ///< Tests if a value is a JavaScript object. + bool IsFunction() const; ///< Tests if a value is a JavaScript function. + bool IsPromise() const; ///< Tests if a value is a JavaScript promise. + bool IsDataView() const; ///< Tests if a value is a JavaScript data view. + bool IsBuffer() const; ///< Tests if a value is a Node buffer. + bool IsExternal() const; ///< Tests if a value is a pointer to external data. + + /// Casts to another type of `Napi::Value`, when the actual type is known or assumed. + /// + /// This conversion does NOT coerce the type. Calling any methods inappropriate for the actual + /// value type will throw `Napi::Error`. + template T As() const; + + Boolean ToBoolean() const; ///< Coerces a value to a JavaScript boolean. + Number ToNumber() const; ///< Coerces a value to a JavaScript number. + String ToString() const; ///< Coerces a value to a JavaScript string. + Object ToObject() const; ///< Coerces a value to a JavaScript object. + + protected: + /// !cond INTERNAL + napi_env _env; + napi_value _value; + /// !endcond + }; + + /// A JavaScript boolean value. + class Boolean : public Value { + public: + static Boolean New(napi_env env, ///< Node-API environment + bool value ///< Boolean value + ); + + Boolean(); ///< Creates a new _empty_ Boolean instance. + Boolean(napi_env env, + napi_value value); ///< Wraps a Node-API value primitive. + + operator bool() const; ///< Converts a Boolean value to a boolean primitive. + bool Value() const; ///< Converts a Boolean value to a boolean primitive. + }; + + /// A JavaScript number value. + class Number : public Value { + public: + static Number New(napi_env env, ///< Node-API environment + double value ///< Number value + ); + + Number(); ///< Creates a new _empty_ Number instance. + Number(napi_env env, + napi_value value); ///< Wraps a Node-API value primitive. + + operator int32_t() + const; ///< Converts a Number value to a 32-bit signed integer value. + operator uint32_t() + const; ///< Converts a Number value to a 32-bit unsigned integer value. + operator int64_t() + const; ///< Converts a Number value to a 64-bit signed integer value. + operator float() + const; ///< Converts a Number value to a 32-bit floating-point value. + operator double() + const; ///< Converts a Number value to a 64-bit floating-point value. + + int32_t Int32Value() + const; ///< Converts a Number value to a 32-bit signed integer value. + uint32_t Uint32Value() + const; ///< Converts a Number value to a 32-bit unsigned integer value. + int64_t Int64Value() + const; ///< Converts a Number value to a 64-bit signed integer value. + float FloatValue() + const; ///< Converts a Number value to a 32-bit floating-point value. + double DoubleValue() + const; ///< Converts a Number value to a 64-bit floating-point value. + }; + +#if NAPI_VERSION > 5 + /// A JavaScript bigint value. + class BigInt : public Value { + public: + static BigInt New(napi_env env, ///< Node-API environment + int64_t value ///< Number value + ); + static BigInt New(napi_env env, ///< Node-API environment + uint64_t value ///< Number value + ); + + /// Creates a new BigInt object using a specified sign bit and a + /// specified list of digits/words. + /// The resulting number is calculated as: + /// (-1)^sign_bit * (words[0] * (2^64)^0 + words[1] * (2^64)^1 + ...) + static BigInt New(napi_env env, ///< Node-API environment + int sign_bit, ///< Sign bit. 1 if negative. + size_t word_count, ///< Number of words in array + const uint64_t* words ///< Array of words + ); + + BigInt(); ///< Creates a new _empty_ BigInt instance. + BigInt(napi_env env, + napi_value value); ///< Wraps a Node-API value primitive. + + int64_t Int64Value(bool* lossless) + const; ///< Converts a BigInt value to a 64-bit signed integer value. + uint64_t Uint64Value(bool* lossless) + const; ///< Converts a BigInt value to a 64-bit unsigned integer value. + + size_t WordCount() const; ///< The number of 64-bit words needed to store + ///< the result of ToWords(). + + /// Writes the contents of this BigInt to a specified memory location. + /// `sign_bit` must be provided and will be set to 1 if this BigInt is + /// negative. + /// `*word_count` has to be initialized to the length of the `words` array. + /// Upon return, it will be set to the actual number of words that would + /// be needed to store this BigInt (i.e. the return value of `WordCount()`). + void ToWords(int* sign_bit, size_t* word_count, uint64_t* words); + }; +#endif // NAPI_VERSION > 5 + +#if (NAPI_VERSION > 4) + /// A JavaScript date value. + class Date : public Value { + public: + /// Creates a new Date value from a double primitive. + static Date New(napi_env env, ///< Node-API environment + double value ///< Number value + ); + + Date(); ///< Creates a new _empty_ Date instance. + Date(napi_env env, napi_value value); ///< Wraps a Node-API value primitive. + operator double() const; ///< Converts a Date value to double primitive + + double ValueOf() const; ///< Converts a Date value to a double primitive. + }; + #endif + + /// A JavaScript string or symbol value (that can be used as a property name). + class Name : public Value { + public: + Name(); ///< Creates a new _empty_ Name instance. + Name(napi_env env, + napi_value value); ///< Wraps a Node-API value primitive. + }; + + /// A JavaScript string value. + class String : public Name { + public: + /// Creates a new String value from a UTF-8 encoded C++ string. + static String New(napi_env env, ///< Node-API environment + const std::string& value ///< UTF-8 encoded C++ string + ); + + /// Creates a new String value from a UTF-16 encoded C++ string. + static String New(napi_env env, ///< Node-API environment + const std::u16string& value ///< UTF-16 encoded C++ string + ); + + /// Creates a new String value from a UTF-8 encoded C string. + static String New( + napi_env env, ///< Node-API environment + const char* value ///< UTF-8 encoded null-terminated C string + ); + + /// Creates a new String value from a UTF-16 encoded C string. + static String New( + napi_env env, ///< Node-API environment + const char16_t* value ///< UTF-16 encoded null-terminated C string + ); + + /// Creates a new String value from a UTF-8 encoded C string with specified + /// length. + static String New(napi_env env, ///< Node-API environment + const char* value, ///< UTF-8 encoded C string (not + ///< necessarily null-terminated) + size_t length ///< length of the string in bytes + ); + + /// Creates a new String value from a UTF-16 encoded C string with specified + /// length. + static String New( + napi_env env, ///< Node-API environment + const char16_t* value, ///< UTF-16 encoded C string (not necessarily + ///< null-terminated) + size_t length ///< Length of the string in 2-byte code units + ); + + /// Creates a new String based on the original object's type. + /// + /// `value` may be any of: + /// - const char* (encoded using UTF-8, null-terminated) + /// - const char16_t* (encoded using UTF-16-LE, null-terminated) + /// - std::string (encoded using UTF-8) + /// - std::u16string + template + static String From(napi_env env, const T& value); + + String(); ///< Creates a new _empty_ String instance. + String(napi_env env, + napi_value value); ///< Wraps a Node-API value primitive. + + operator std::string() + const; ///< Converts a String value to a UTF-8 encoded C++ string. + operator std::u16string() + const; ///< Converts a String value to a UTF-16 encoded C++ string. + std::string Utf8Value() + const; ///< Converts a String value to a UTF-8 encoded C++ string. + std::u16string Utf16Value() + const; ///< Converts a String value to a UTF-16 encoded C++ string. + }; + + /// A JavaScript symbol value. + class Symbol : public Name { + public: + /// Creates a new Symbol value with an optional description. + static Symbol New( + napi_env env, ///< Node-API environment + const char* description = + nullptr ///< Optional UTF-8 encoded null-terminated C string + /// describing the symbol + ); + + /// Creates a new Symbol value with a description. + static Symbol New( + napi_env env, ///< Node-API environment + const std::string& + description ///< UTF-8 encoded C++ string describing the symbol + ); + + /// Creates a new Symbol value with a description. + static Symbol New(napi_env env, ///< Node-API environment + String description ///< String value describing the symbol + ); + + /// Creates a new Symbol value with a description. + static Symbol New( + napi_env env, ///< Node-API environment + napi_value description ///< String value describing the symbol + ); + + /// Get a public Symbol (e.g. Symbol.iterator). + static Symbol WellKnown(napi_env, const std::string& name); + + Symbol(); ///< Creates a new _empty_ Symbol instance. + Symbol(napi_env env, + napi_value value); ///< Wraps a Node-API value primitive. + }; + + /// A JavaScript object value. + class Object : public Value { + public: + /// Enables property and element assignments using indexing syntax. + /// + /// Example: + /// + /// Napi::Value propertyValue = object1['A']; + /// object2['A'] = propertyValue; + /// Napi::Value elementValue = array[0]; + /// array[1] = elementValue; + template + class PropertyLValue { + public: + /// Converts an L-value to a value. + operator Value() const; + + /// Assigns a value to the property. The type of value can be + /// anything supported by `Object::Set`. + template + PropertyLValue& operator =(ValueType value); + + private: + PropertyLValue() = delete; + PropertyLValue(Object object, Key key); + napi_env _env; + napi_value _object; + Key _key; + + friend class Napi::Object; + }; + + /// Creates a new Object value. + static Object New(napi_env env ///< Node-API environment + ); + + Object(); ///< Creates a new _empty_ Object instance. + Object(napi_env env, + napi_value value); ///< Wraps a Node-API value primitive. + + /// Gets or sets a named property. + PropertyLValue operator []( + const char* utf8name ///< UTF-8 encoded null-terminated property name + ); + + /// Gets or sets a named property. + PropertyLValue operator []( + const std::string& utf8name ///< UTF-8 encoded property name + ); + + /// Gets or sets an indexed property or array element. + PropertyLValue operator []( + uint32_t index /// Property / element index + ); + + /// Gets a named property. + Value operator []( + const char* utf8name ///< UTF-8 encoded null-terminated property name + ) const; + + /// Gets a named property. + Value operator []( + const std::string& utf8name ///< UTF-8 encoded property name + ) const; + + /// Gets an indexed property or array element. + Value operator []( + uint32_t index ///< Property / element index + ) const; + + /// Checks whether a property is present. + bool Has( + napi_value key ///< Property key primitive + ) const; + + /// Checks whether a property is present. + bool Has( + Value key ///< Property key + ) const; + + /// Checks whether a named property is present. + bool Has( + const char* utf8name ///< UTF-8 encoded null-terminated property name + ) const; + + /// Checks whether a named property is present. + bool Has( + const std::string& utf8name ///< UTF-8 encoded property name + ) const; + + /// Checks whether a own property is present. + bool HasOwnProperty( + napi_value key ///< Property key primitive + ) const; + + /// Checks whether a own property is present. + bool HasOwnProperty( + Value key ///< Property key + ) const; + + /// Checks whether a own property is present. + bool HasOwnProperty( + const char* utf8name ///< UTF-8 encoded null-terminated property name + ) const; + + /// Checks whether a own property is present. + bool HasOwnProperty( + const std::string& utf8name ///< UTF-8 encoded property name + ) const; + + /// Gets a property. + Value Get( + napi_value key ///< Property key primitive + ) const; + + /// Gets a property. + Value Get( + Value key ///< Property key + ) const; + + /// Gets a named property. + Value Get( + const char* utf8name ///< UTF-8 encoded null-terminated property name + ) const; + + /// Gets a named property. + Value Get( + const std::string& utf8name ///< UTF-8 encoded property name + ) const; + + /// Sets a property. + template + bool Set(napi_value key, ///< Property key primitive + const ValueType& value ///< Property value primitive + ); + + /// Sets a property. + template + bool Set(Value key, ///< Property key + const ValueType& value ///< Property value + ); + + /// Sets a named property. + template + bool Set( + const char* utf8name, ///< UTF-8 encoded null-terminated property name + const ValueType& value); + + /// Sets a named property. + template + bool Set(const std::string& utf8name, ///< UTF-8 encoded property name + const ValueType& value ///< Property value primitive + ); + + /// Delete property. + bool Delete( + napi_value key ///< Property key primitive + ); + + /// Delete property. + bool Delete( + Value key ///< Property key + ); + + /// Delete property. + bool Delete( + const char* utf8name ///< UTF-8 encoded null-terminated property name + ); + + /// Delete property. + bool Delete( + const std::string& utf8name ///< UTF-8 encoded property name + ); + + /// Checks whether an indexed property is present. + bool Has( + uint32_t index ///< Property / element index + ) const; + + /// Gets an indexed property or array element. + Value Get( + uint32_t index ///< Property / element index + ) const; + + /// Sets an indexed property or array element. + template + bool Set(uint32_t index, ///< Property / element index + const ValueType& value ///< Property value primitive + ); + + /// Deletes an indexed property or array element. + bool Delete( + uint32_t index ///< Property / element index + ); + + Array GetPropertyNames() const; ///< Get all property names + + /// Defines a property on the object. + bool DefineProperty( + const PropertyDescriptor& + property ///< Descriptor for the property to be defined + ); + + /// Defines properties on the object. + bool DefineProperties( + const std::initializer_list& properties + ///< List of descriptors for the properties to be defined + ); + + /// Defines properties on the object. + bool DefineProperties( + const std::vector& properties + ///< Vector of descriptors for the properties to be defined + ); + + /// Checks if an object is an instance created by a constructor function. + /// + /// This is equivalent to the JavaScript `instanceof` operator. + bool InstanceOf( + const Function& constructor ///< Constructor function + ) const; + + template + inline void AddFinalizer(Finalizer finalizeCallback, T* data); + + template + inline void AddFinalizer(Finalizer finalizeCallback, + T* data, + Hint* finalizeHint); +#if NAPI_VERSION >= 8 + bool Freeze(); + bool Seal(); +#endif // NAPI_VERSION >= 8 + }; + + template + class External : public Value { + public: + static External New(napi_env env, T* data); + + // Finalizer must implement `void operator()(Env env, T* data)`. + template + static External New(napi_env env, + T* data, + Finalizer finalizeCallback); + // Finalizer must implement `void operator()(Env env, T* data, Hint* hint)`. + template + static External New(napi_env env, + T* data, + Finalizer finalizeCallback, + Hint* finalizeHint); + + External(); + External(napi_env env, napi_value value); + + T* Data() const; + }; + + class Array : public Object { + public: + static Array New(napi_env env); + static Array New(napi_env env, size_t length); + + Array(); + Array(napi_env env, napi_value value); + + uint32_t Length() const; + }; + + /// A JavaScript array buffer value. + class ArrayBuffer : public Object { + public: + /// Creates a new ArrayBuffer instance over a new automatically-allocated buffer. + static ArrayBuffer New( + napi_env env, ///< Node-API environment + size_t byteLength ///< Length of the buffer to be allocated, in bytes + ); + + /// Creates a new ArrayBuffer instance, using an external buffer with + /// specified byte length. + static ArrayBuffer New( + napi_env env, ///< Node-API environment + void* externalData, ///< Pointer to the external buffer to be used by + ///< the array + size_t byteLength ///< Length of the external buffer to be used by the + ///< array, in bytes + ); + + /// Creates a new ArrayBuffer instance, using an external buffer with + /// specified byte length. + template + static ArrayBuffer New( + napi_env env, ///< Node-API environment + void* externalData, ///< Pointer to the external buffer to be used by + ///< the array + size_t byteLength, ///< Length of the external buffer to be used by the + ///< array, + /// in bytes + Finalizer finalizeCallback ///< Function to be called when the array + ///< buffer is destroyed; + /// must implement `void operator()(Env env, + /// void* externalData)` + ); + + /// Creates a new ArrayBuffer instance, using an external buffer with + /// specified byte length. + template + static ArrayBuffer New( + napi_env env, ///< Node-API environment + void* externalData, ///< Pointer to the external buffer to be used by + ///< the array + size_t byteLength, ///< Length of the external buffer to be used by the + ///< array, + /// in bytes + Finalizer finalizeCallback, ///< Function to be called when the array + ///< buffer is destroyed; + /// must implement `void operator()(Env + /// env, void* externalData, Hint* hint)` + Hint* finalizeHint ///< Hint (second parameter) to be passed to the + ///< finalize callback + ); + + ArrayBuffer(); ///< Creates a new _empty_ ArrayBuffer instance. + ArrayBuffer(napi_env env, + napi_value value); ///< Wraps a Node-API value primitive. + + void* Data(); ///< Gets a pointer to the data buffer. + size_t ByteLength(); ///< Gets the length of the array buffer in bytes. + +#if NAPI_VERSION >= 7 + bool IsDetached() const; + void Detach(); +#endif // NAPI_VERSION >= 7 + }; + + /// A JavaScript typed-array value with unknown array type. + /// + /// For type-specific operations, cast to a `TypedArrayOf` instance using the `As()` + /// method: + /// + /// Napi::TypedArray array = ... + /// if (t.TypedArrayType() == napi_int32_array) { + /// Napi::Int32Array int32Array = t.As(); + /// } + class TypedArray : public Object { + public: + TypedArray(); ///< Creates a new _empty_ TypedArray instance. + TypedArray(napi_env env, + napi_value value); ///< Wraps a Node-API value primitive. + + napi_typedarray_type TypedArrayType() const; ///< Gets the type of this typed-array. + Napi::ArrayBuffer ArrayBuffer() const; ///< Gets the backing array buffer. + + uint8_t ElementSize() const; ///< Gets the size in bytes of one element in the array. + size_t ElementLength() const; ///< Gets the number of elements in the array. + size_t ByteOffset() const; ///< Gets the offset into the buffer where the array starts. + size_t ByteLength() const; ///< Gets the length of the array in bytes. + + protected: + /// !cond INTERNAL + napi_typedarray_type _type; + size_t _length; + + TypedArray(napi_env env, napi_value value, napi_typedarray_type type, size_t length); + + static const napi_typedarray_type unknown_array_type = static_cast(-1); + + template + static +#if defined(NAPI_HAS_CONSTEXPR) + constexpr +#endif + napi_typedarray_type TypedArrayTypeForPrimitiveType() { + return std::is_same::value ? napi_int8_array + : std::is_same::value ? napi_uint8_array + : std::is_same::value ? napi_int16_array + : std::is_same::value ? napi_uint16_array + : std::is_same::value ? napi_int32_array + : std::is_same::value ? napi_uint32_array + : std::is_same::value ? napi_float32_array + : std::is_same::value ? napi_float64_array +#if NAPI_VERSION > 5 + : std::is_same::value ? napi_bigint64_array + : std::is_same::value ? napi_biguint64_array +#endif // NAPI_VERSION > 5 + : unknown_array_type; + } + /// !endcond + }; + + /// A JavaScript typed-array value with known array type. + /// + /// Note while it is possible to create and access Uint8 "clamped" arrays using this class, + /// the _clamping_ behavior is only applied in JavaScript. + template + class TypedArrayOf : public TypedArray { + public: + /// Creates a new TypedArray instance over a new automatically-allocated array buffer. + /// + /// The array type parameter can normally be omitted (because it is inferred from the template + /// parameter T), except when creating a "clamped" array: + /// + /// Uint8Array::New(env, length, napi_uint8_clamped_array) + static TypedArrayOf New( + napi_env env, ///< Node-API environment + size_t elementLength, ///< Length of the created array, as a number of + ///< elements +#if defined(NAPI_HAS_CONSTEXPR) + napi_typedarray_type type = + TypedArray::TypedArrayTypeForPrimitiveType() +#else + napi_typedarray_type type +#endif + ///< Type of array, if different from the default array type for the + ///< template parameter T. + ); + + /// Creates a new TypedArray instance over a provided array buffer. + /// + /// The array type parameter can normally be omitted (because it is inferred from the template + /// parameter T), except when creating a "clamped" array: + /// + /// Uint8Array::New(env, length, buffer, 0, napi_uint8_clamped_array) + static TypedArrayOf New( + napi_env env, ///< Node-API environment + size_t elementLength, ///< Length of the created array, as a number of + ///< elements + Napi::ArrayBuffer arrayBuffer, ///< Backing array buffer instance to use + size_t bufferOffset, ///< Offset into the array buffer where the + ///< typed-array starts +#if defined(NAPI_HAS_CONSTEXPR) + napi_typedarray_type type = + TypedArray::TypedArrayTypeForPrimitiveType() +#else + napi_typedarray_type type +#endif + ///< Type of array, if different from the default array type for the + ///< template parameter T. + ); + + TypedArrayOf(); ///< Creates a new _empty_ TypedArrayOf instance. + TypedArrayOf(napi_env env, + napi_value value); ///< Wraps a Node-API value primitive. + + T& operator [](size_t index); ///< Gets or sets an element in the array. + const T& operator [](size_t index) const; ///< Gets an element in the array. + + /// Gets a pointer to the array's backing buffer. + /// + /// This is not necessarily the same as the `ArrayBuffer::Data()` pointer, because the + /// typed-array may have a non-zero `ByteOffset()` into the `ArrayBuffer`. + T* Data(); + + /// Gets a pointer to the array's backing buffer. + /// + /// This is not necessarily the same as the `ArrayBuffer::Data()` pointer, because the + /// typed-array may have a non-zero `ByteOffset()` into the `ArrayBuffer`. + const T* Data() const; + + private: + T* _data; + + TypedArrayOf(napi_env env, + napi_value value, + napi_typedarray_type type, + size_t length, + T* data); + }; + + /// The DataView provides a low-level interface for reading/writing multiple + /// number types in an ArrayBuffer irrespective of the platform's endianness. + class DataView : public Object { + public: + static DataView New(napi_env env, + Napi::ArrayBuffer arrayBuffer); + static DataView New(napi_env env, + Napi::ArrayBuffer arrayBuffer, + size_t byteOffset); + static DataView New(napi_env env, + Napi::ArrayBuffer arrayBuffer, + size_t byteOffset, + size_t byteLength); + + DataView(); ///< Creates a new _empty_ DataView instance. + DataView(napi_env env, + napi_value value); ///< Wraps a Node-API value primitive. + + Napi::ArrayBuffer ArrayBuffer() const; ///< Gets the backing array buffer. + size_t ByteOffset() const; ///< Gets the offset into the buffer where the array starts. + size_t ByteLength() const; ///< Gets the length of the array in bytes. + + void* Data() const; + + float GetFloat32(size_t byteOffset) const; + double GetFloat64(size_t byteOffset) const; + int8_t GetInt8(size_t byteOffset) const; + int16_t GetInt16(size_t byteOffset) const; + int32_t GetInt32(size_t byteOffset) const; + uint8_t GetUint8(size_t byteOffset) const; + uint16_t GetUint16(size_t byteOffset) const; + uint32_t GetUint32(size_t byteOffset) const; + + void SetFloat32(size_t byteOffset, float value) const; + void SetFloat64(size_t byteOffset, double value) const; + void SetInt8(size_t byteOffset, int8_t value) const; + void SetInt16(size_t byteOffset, int16_t value) const; + void SetInt32(size_t byteOffset, int32_t value) const; + void SetUint8(size_t byteOffset, uint8_t value) const; + void SetUint16(size_t byteOffset, uint16_t value) const; + void SetUint32(size_t byteOffset, uint32_t value) const; + + private: + template + T ReadData(size_t byteOffset) const; + + template + void WriteData(size_t byteOffset, T value) const; + + void* _data; + size_t _length; + }; + + class Function : public Object { + public: + using VoidCallback = void (*)(const CallbackInfo& info); + using Callback = Value (*)(const CallbackInfo& info); + + template + static Function New(napi_env env, + const char* utf8name = nullptr, + void* data = nullptr); + + template + static Function New(napi_env env, + const char* utf8name = nullptr, + void* data = nullptr); + + template + static Function New(napi_env env, + const std::string& utf8name, + void* data = nullptr); + + template + static Function New(napi_env env, + const std::string& utf8name, + void* data = nullptr); + + /// Callable must implement operator() accepting a const CallbackInfo& + /// and return either void or Value. + template + static Function New(napi_env env, + Callable cb, + const char* utf8name = nullptr, + void* data = nullptr); + /// Callable must implement operator() accepting a const CallbackInfo& + /// and return either void or Value. + template + static Function New(napi_env env, + Callable cb, + const std::string& utf8name, + void* data = nullptr); + + Function(); + Function(napi_env env, napi_value value); + + Value operator()(const std::initializer_list& args) const; + + Value Call(const std::initializer_list& args) const; + Value Call(const std::vector& args) const; + Value Call(size_t argc, const napi_value* args) const; + Value Call(napi_value recv, + const std::initializer_list& args) const; + Value Call(napi_value recv, const std::vector& args) const; + Value Call(napi_value recv, size_t argc, const napi_value* args) const; + + Value MakeCallback(napi_value recv, + const std::initializer_list& args, + napi_async_context context = nullptr) const; + Value MakeCallback(napi_value recv, + const std::vector& args, + napi_async_context context = nullptr) const; + Value MakeCallback(napi_value recv, + size_t argc, + const napi_value* args, + napi_async_context context = nullptr) const; + + Object New(const std::initializer_list& args) const; + Object New(const std::vector& args) const; + Object New(size_t argc, const napi_value* args) const; + }; + + class Promise : public Object { + public: + class Deferred { + public: + static Deferred New(napi_env env); + Deferred(napi_env env); + + Napi::Promise Promise() const; + Napi::Env Env() const; + + void Resolve(napi_value value) const; + void Reject(napi_value value) const; + + private: + napi_env _env; + napi_deferred _deferred; + napi_value _promise; + }; + + Promise(napi_env env, napi_value value); + }; + + template + class Buffer : public Uint8Array { + public: + static Buffer New(napi_env env, size_t length); + static Buffer New(napi_env env, T* data, size_t length); + + // Finalizer must implement `void operator()(Env env, T* data)`. + template + static Buffer New(napi_env env, T* data, + size_t length, + Finalizer finalizeCallback); + // Finalizer must implement `void operator()(Env env, T* data, Hint* hint)`. + template + static Buffer New(napi_env env, T* data, + size_t length, + Finalizer finalizeCallback, + Hint* finalizeHint); + + static Buffer Copy(napi_env env, const T* data, size_t length); + + Buffer(); + Buffer(napi_env env, napi_value value); + size_t Length() const; + T* Data() const; + + private: + mutable size_t _length; + mutable T* _data; + + Buffer(napi_env env, napi_value value, size_t length, T* data); + void EnsureInfo() const; + }; + + /// Holds a counted reference to a value; initially a weak reference unless otherwise specified, + /// may be changed to/from a strong reference by adjusting the refcount. + /// + /// The referenced value is not immediately destroyed when the reference count is zero; it is + /// merely then eligible for garbage-collection if there are no other references to the value. + template + class Reference { + public: + static Reference New(const T& value, uint32_t initialRefcount = 0); + + Reference(); + Reference(napi_env env, napi_ref ref); + ~Reference(); + + // A reference can be moved but cannot be copied. + Reference(Reference&& other); + Reference& operator =(Reference&& other); + NAPI_DISALLOW_ASSIGN(Reference) + + operator napi_ref() const; + bool operator ==(const Reference &other) const; + bool operator !=(const Reference &other) const; + + Napi::Env Env() const; + bool IsEmpty() const; + + // Note when getting the value of a Reference it is usually correct to do so + // within a HandleScope so that the value handle gets cleaned up efficiently. + T Value() const; + + uint32_t Ref(); + uint32_t Unref(); + void Reset(); + void Reset(const T& value, uint32_t refcount = 0); + + // Call this on a reference that is declared as static data, to prevent its + // destructor from running at program shutdown time, which would attempt to + // reset the reference when the environment is no longer valid. Avoid using + // this if at all possible. If you do need to use static data, MAKE SURE to + // warn your users that your addon is NOT threadsafe. + void SuppressDestruct(); + + protected: + Reference(const Reference&); + + /// !cond INTERNAL + napi_env _env; + napi_ref _ref; + /// !endcond + + private: + bool _suppressDestruct; + }; + + class ObjectReference: public Reference { + public: + ObjectReference(); + ObjectReference(napi_env env, napi_ref ref); + + // A reference can be moved but cannot be copied. + ObjectReference(Reference&& other); + ObjectReference& operator =(Reference&& other); + ObjectReference(ObjectReference&& other); + ObjectReference& operator =(ObjectReference&& other); + NAPI_DISALLOW_ASSIGN(ObjectReference) + + Napi::Value Get(const char* utf8name) const; + Napi::Value Get(const std::string& utf8name) const; + bool Set(const char* utf8name, napi_value value); + bool Set(const char* utf8name, Napi::Value value); + bool Set(const char* utf8name, const char* utf8value); + bool Set(const char* utf8name, bool boolValue); + bool Set(const char* utf8name, double numberValue); + bool Set(const std::string& utf8name, napi_value value); + bool Set(const std::string& utf8name, Napi::Value value); + bool Set(const std::string& utf8name, std::string& utf8value); + bool Set(const std::string& utf8name, bool boolValue); + bool Set(const std::string& utf8name, double numberValue); + + Napi::Value Get(uint32_t index) const; + bool Set(uint32_t index, const napi_value value); + bool Set(uint32_t index, const Napi::Value value); + bool Set(uint32_t index, const char* utf8value); + bool Set(uint32_t index, const std::string& utf8value); + bool Set(uint32_t index, bool boolValue); + bool Set(uint32_t index, double numberValue); + + protected: + ObjectReference(const ObjectReference&); + }; + + class FunctionReference: public Reference { + public: + FunctionReference(); + FunctionReference(napi_env env, napi_ref ref); + + // A reference can be moved but cannot be copied. + FunctionReference(Reference&& other); + FunctionReference& operator =(Reference&& other); + FunctionReference(FunctionReference&& other); + FunctionReference& operator =(FunctionReference&& other); + NAPI_DISALLOW_ASSIGN_COPY(FunctionReference) + + Napi::Value operator ()(const std::initializer_list& args) const; + + Napi::Value Call(const std::initializer_list& args) const; + Napi::Value Call(const std::vector& args) const; + Napi::Value Call(napi_value recv, const std::initializer_list& args) const; + Napi::Value Call(napi_value recv, const std::vector& args) const; + Napi::Value Call(napi_value recv, size_t argc, const napi_value* args) const; + + Napi::Value MakeCallback(napi_value recv, + const std::initializer_list& args, + napi_async_context context = nullptr) const; + Napi::Value MakeCallback(napi_value recv, + const std::vector& args, + napi_async_context context = nullptr) const; + Napi::Value MakeCallback(napi_value recv, + size_t argc, + const napi_value* args, + napi_async_context context = nullptr) const; + + Object New(const std::initializer_list& args) const; + Object New(const std::vector& args) const; + }; + + // Shortcuts to creating a new reference with inferred type and refcount = 0. + template Reference Weak(T value); + ObjectReference Weak(Object value); + FunctionReference Weak(Function value); + + // Shortcuts to creating a new reference with inferred type and refcount = 1. + template Reference Persistent(T value); + ObjectReference Persistent(Object value); + FunctionReference Persistent(Function value); + + /// A persistent reference to a JavaScript error object. Use of this class + /// depends somewhat on whether C++ exceptions are enabled at compile time. + /// + /// ### Handling Errors With C++ Exceptions + /// + /// If C++ exceptions are enabled, then the `Error` class extends + /// `std::exception` and enables integrated error-handling for C++ exceptions + /// and JavaScript exceptions. + /// + /// If a Node-API call fails without executing any JavaScript code (for + /// example due to an invalid argument), then the Node-API wrapper + /// automatically converts and throws the error as a C++ exception of type + /// `Napi::Error`. Or if a JavaScript function called by C++ code via Node-API + /// throws a JavaScript exception, then the Node-API wrapper automatically + /// converts and throws it as a C++ exception of type `Napi::Error`. + /// + /// If a C++ exception of type `Napi::Error` escapes from a Node-API C++ + /// callback, then the Node-API wrapper automatically converts and throws it + /// as a JavaScript exception. Therefore, catching a C++ exception of type + /// `Napi::Error` prevents a JavaScript exception from being thrown. + /// + /// #### Example 1A - Throwing a C++ exception: + /// + /// Napi::Env env = ... + /// throw Napi::Error::New(env, "Example exception"); + /// + /// Following C++ statements will not be executed. The exception will bubble + /// up as a C++ exception of type `Napi::Error`, until it is either caught + /// while still in C++, or else automatically propataged as a JavaScript + /// exception when the callback returns to JavaScript. + /// + /// #### Example 2A - Propagating a Node-API C++ exception: + /// + /// Napi::Function jsFunctionThatThrows = someObj.As(); + /// Napi::Value result = jsFunctionThatThrows({ arg1, arg2 }); + /// + /// Following C++ statements will not be executed. The exception will bubble + /// up as a C++ exception of type `Napi::Error`, until it is either caught + /// while still in C++, or else automatically propagated as a JavaScript + /// exception when the callback returns to JavaScript. + /// + /// #### Example 3A - Handling a Node-API C++ exception: + /// + /// Napi::Function jsFunctionThatThrows = someObj.As(); + /// Napi::Value result; + /// try { + /// result = jsFunctionThatThrows({ arg1, arg2 }); + /// } catch (const Napi::Error& e) { + /// cerr << "Caught JavaScript exception: " + e.what(); + /// } + /// + /// Since the exception was caught here, it will not be propagated as a + /// JavaScript exception. + /// + /// ### Handling Errors Without C++ Exceptions + /// + /// If C++ exceptions are disabled (by defining `NAPI_DISABLE_CPP_EXCEPTIONS`) + /// then this class does not extend `std::exception`, and APIs in the `Napi` + /// namespace do not throw C++ exceptions when they fail. Instead, they raise + /// _pending_ JavaScript exceptions and return _empty_ `Value`s. Calling code + /// should check `Value::IsEmpty()` before attempting to use a returned value, + /// and may use methods on the `Env` class to check for, get, and clear a + /// pending JavaScript exception. If the pending exception is not cleared, it + /// will be thrown when the native callback returns to JavaScript. + /// + /// #### Example 1B - Throwing a JS exception + /// + /// Napi::Env env = ... + /// Napi::Error::New(env, "Example + /// exception").ThrowAsJavaScriptException(); return; + /// + /// After throwing a JS exception, the code should generally return + /// immediately from the native callback, after performing any necessary + /// cleanup. + /// + /// #### Example 2B - Propagating a Node-API JS exception: + /// + /// Napi::Function jsFunctionThatThrows = someObj.As(); + /// Napi::Value result = jsFunctionThatThrows({ arg1, arg2 }); + /// if (result.IsEmpty()) return; + /// + /// An empty value result from a Node-API call indicates an error occurred, + /// and a JavaScript exception is pending. To let the exception propagate, the + /// code should generally return immediately from the native callback, after + /// performing any necessary cleanup. + /// + /// #### Example 3B - Handling a Node-API JS exception: + /// + /// Napi::Function jsFunctionThatThrows = someObj.As(); + /// Napi::Value result = jsFunctionThatThrows({ arg1, arg2 }); + /// if (result.IsEmpty()) { + /// Napi::Error e = env.GetAndClearPendingException(); + /// cerr << "Caught JavaScript exception: " + e.Message(); + /// } + /// + /// Since the exception was cleared here, it will not be propagated as a + /// JavaScript exception after the native callback returns. + class Error : public ObjectReference +#ifdef NAPI_CPP_EXCEPTIONS + , public std::exception +#endif // NAPI_CPP_EXCEPTIONS + { + public: + static Error New(napi_env env); + static Error New(napi_env env, const char* message); + static Error New(napi_env env, const std::string& message); + + static NAPI_NO_RETURN void Fatal(const char* location, const char* message); + + Error(); + Error(napi_env env, napi_value value); + + // An error can be moved or copied. + Error(Error&& other); + Error& operator =(Error&& other); + Error(const Error&); + Error& operator =(const Error&); + + const std::string& Message() const NAPI_NOEXCEPT; + void ThrowAsJavaScriptException() const; + +#ifdef NAPI_CPP_EXCEPTIONS + const char* what() const NAPI_NOEXCEPT override; +#endif // NAPI_CPP_EXCEPTIONS + + protected: + /// !cond INTERNAL + using create_error_fn = napi_status (*)(napi_env envb, + napi_value code, + napi_value msg, + napi_value* result); + + template + static TError New(napi_env env, + const char* message, + size_t length, + create_error_fn create_error); + /// !endcond + + private: + mutable std::string _message; + }; + + class TypeError : public Error { + public: + static TypeError New(napi_env env, const char* message); + static TypeError New(napi_env env, const std::string& message); + + TypeError(); + TypeError(napi_env env, napi_value value); + }; + + class RangeError : public Error { + public: + static RangeError New(napi_env env, const char* message); + static RangeError New(napi_env env, const std::string& message); + + RangeError(); + RangeError(napi_env env, napi_value value); + }; + + class CallbackInfo { + public: + CallbackInfo(napi_env env, napi_callback_info info); + ~CallbackInfo(); + + // Disallow copying to prevent multiple free of _dynamicArgs + NAPI_DISALLOW_ASSIGN_COPY(CallbackInfo) + + Napi::Env Env() const; + Value NewTarget() const; + bool IsConstructCall() const; + size_t Length() const; + const Value operator [](size_t index) const; + Value This() const; + void* Data() const; + void SetData(void* data); + + private: + const size_t _staticArgCount = 6; + napi_env _env; + napi_callback_info _info; + napi_value _this; + size_t _argc; + napi_value* _argv; + napi_value _staticArgs[6]; + napi_value* _dynamicArgs; + void* _data; + }; + + class PropertyDescriptor { + public: + using GetterCallback = Napi::Value (*)(const Napi::CallbackInfo& info); + using SetterCallback = void (*)(const Napi::CallbackInfo& info); + +#ifndef NODE_ADDON_API_DISABLE_DEPRECATED + template + static PropertyDescriptor Accessor(const char* utf8name, + Getter getter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Accessor(const std::string& utf8name, + Getter getter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Accessor(napi_value name, + Getter getter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Accessor(Name name, + Getter getter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Accessor(const char* utf8name, + Getter getter, + Setter setter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Accessor(const std::string& utf8name, + Getter getter, + Setter setter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Accessor(napi_value name, + Getter getter, + Setter setter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Accessor(Name name, + Getter getter, + Setter setter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Function(const char* utf8name, + Callable cb, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Function(const std::string& utf8name, + Callable cb, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Function(napi_value name, + Callable cb, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Function(Name name, + Callable cb, + napi_property_attributes attributes = napi_default, + void* data = nullptr); +#endif // !NODE_ADDON_API_DISABLE_DEPRECATED + + template + static PropertyDescriptor Accessor(const char* utf8name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + + template + static PropertyDescriptor Accessor(const std::string& utf8name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + + template + static PropertyDescriptor Accessor(Name name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + + template + static PropertyDescriptor Accessor(const char* utf8name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + + template + static PropertyDescriptor Accessor(const std::string& utf8name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + + template + static PropertyDescriptor Accessor(Name name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + + template + static PropertyDescriptor Accessor(Napi::Env env, + Napi::Object object, + const char* utf8name, + Getter getter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Accessor(Napi::Env env, + Napi::Object object, + const std::string& utf8name, + Getter getter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Accessor(Napi::Env env, + Napi::Object object, + Name name, + Getter getter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Accessor(Napi::Env env, + Napi::Object object, + const char* utf8name, + Getter getter, + Setter setter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Accessor(Napi::Env env, + Napi::Object object, + const std::string& utf8name, + Getter getter, + Setter setter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Accessor(Napi::Env env, + Napi::Object object, + Name name, + Getter getter, + Setter setter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Function(Napi::Env env, + Napi::Object object, + const char* utf8name, + Callable cb, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Function(Napi::Env env, + Napi::Object object, + const std::string& utf8name, + Callable cb, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor Function(Napi::Env env, + Napi::Object object, + Name name, + Callable cb, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + static PropertyDescriptor Value(const char* utf8name, + napi_value value, + napi_property_attributes attributes = napi_default); + static PropertyDescriptor Value(const std::string& utf8name, + napi_value value, + napi_property_attributes attributes = napi_default); + static PropertyDescriptor Value(napi_value name, + napi_value value, + napi_property_attributes attributes = napi_default); + static PropertyDescriptor Value(Name name, + Napi::Value value, + napi_property_attributes attributes = napi_default); + + PropertyDescriptor(napi_property_descriptor desc); + + operator napi_property_descriptor&(); + operator const napi_property_descriptor&() const; + + private: + napi_property_descriptor _desc; + }; + + /// Property descriptor for use with `ObjectWrap::DefineClass()`. + /// + /// This is different from the standalone `PropertyDescriptor` because it is specific to each + /// `ObjectWrap` subclass. This prevents using descriptors from a different class when + /// defining a new class (preventing the callbacks from having incorrect `this` pointers). + template + class ClassPropertyDescriptor { + public: + ClassPropertyDescriptor(napi_property_descriptor desc) : _desc(desc) {} + + operator napi_property_descriptor&() { return _desc; } + operator const napi_property_descriptor&() const { return _desc; } + + private: + napi_property_descriptor _desc; + }; + + template + struct MethodCallbackData { + TCallback callback; + void* data; + }; + + template + struct AccessorCallbackData { + TGetterCallback getterCallback; + TSetterCallback setterCallback; + void* data; + }; + + template + class InstanceWrap { + public: + using InstanceVoidMethodCallback = void (T::*)(const CallbackInfo& info); + using InstanceMethodCallback = Napi::Value (T::*)(const CallbackInfo& info); + using InstanceGetterCallback = Napi::Value (T::*)(const CallbackInfo& info); + using InstanceSetterCallback = void (T::*)(const CallbackInfo& info, + const Napi::Value& value); + + using PropertyDescriptor = ClassPropertyDescriptor; + + static PropertyDescriptor InstanceMethod(const char* utf8name, + InstanceVoidMethodCallback method, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + static PropertyDescriptor InstanceMethod(const char* utf8name, + InstanceMethodCallback method, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + static PropertyDescriptor InstanceMethod(Symbol name, + InstanceVoidMethodCallback method, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + static PropertyDescriptor InstanceMethod(Symbol name, + InstanceMethodCallback method, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor InstanceMethod(const char* utf8name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor InstanceMethod(const char* utf8name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor InstanceMethod(Symbol name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor InstanceMethod(Symbol name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + static PropertyDescriptor InstanceAccessor(const char* utf8name, + InstanceGetterCallback getter, + InstanceSetterCallback setter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + static PropertyDescriptor InstanceAccessor(Symbol name, + InstanceGetterCallback getter, + InstanceSetterCallback setter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor InstanceAccessor(const char* utf8name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor InstanceAccessor(Symbol name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + static PropertyDescriptor InstanceValue(const char* utf8name, + Napi::Value value, + napi_property_attributes attributes = napi_default); + static PropertyDescriptor InstanceValue(Symbol name, + Napi::Value value, + napi_property_attributes attributes = napi_default); + + protected: + static void AttachPropData(napi_env env, napi_value value, const napi_property_descriptor* prop); + + private: + using This = InstanceWrap; + + using InstanceVoidMethodCallbackData = + MethodCallbackData; + using InstanceMethodCallbackData = + MethodCallbackData; + using InstanceAccessorCallbackData = + AccessorCallbackData; + + static napi_value InstanceVoidMethodCallbackWrapper(napi_env env, napi_callback_info info); + static napi_value InstanceMethodCallbackWrapper(napi_env env, napi_callback_info info); + static napi_value InstanceGetterCallbackWrapper(napi_env env, napi_callback_info info); + static napi_value InstanceSetterCallbackWrapper(napi_env env, napi_callback_info info); + + template + static napi_value WrappedMethod(napi_env env, + napi_callback_info info) NAPI_NOEXCEPT; + + template struct SetterTag {}; + + template + static napi_callback WrapSetter(SetterTag) NAPI_NOEXCEPT { + return &This::WrappedMethod; + } + static napi_callback WrapSetter(SetterTag) NAPI_NOEXCEPT { + return nullptr; + } + }; + + /// Base class to be extended by C++ classes exposed to JavaScript; each C++ class instance gets + /// "wrapped" by a JavaScript object that is managed by this class. + /// + /// At initialization time, the `DefineClass()` method must be used to + /// hook up the accessor and method callbacks. It takes a list of + /// property descriptors, which can be constructed via the various + /// static methods on the base class. + /// + /// #### Example: + /// + /// class Example: public Napi::ObjectWrap { + /// public: + /// static void Initialize(Napi::Env& env, Napi::Object& target) { + /// Napi::Function constructor = DefineClass(env, "Example", { + /// InstanceAccessor<&Example::GetSomething, &Example::SetSomething>("value"), + /// InstanceMethod<&Example::DoSomething>("doSomething"), + /// }); + /// target.Set("Example", constructor); + /// } + /// + /// Example(const Napi::CallbackInfo& info); // Constructor + /// Napi::Value GetSomething(const Napi::CallbackInfo& info); + /// void SetSomething(const Napi::CallbackInfo& info, const Napi::Value& value); + /// Napi::Value DoSomething(const Napi::CallbackInfo& info); + /// } + template + class ObjectWrap : public InstanceWrap, public Reference { + public: + ObjectWrap(const CallbackInfo& callbackInfo); + virtual ~ObjectWrap(); + + static T* Unwrap(Object wrapper); + + // Methods exposed to JavaScript must conform to one of these callback signatures. + using StaticVoidMethodCallback = void (*)(const CallbackInfo& info); + using StaticMethodCallback = Napi::Value (*)(const CallbackInfo& info); + using StaticGetterCallback = Napi::Value (*)(const CallbackInfo& info); + using StaticSetterCallback = void (*)(const CallbackInfo& info, + const Napi::Value& value); + + using PropertyDescriptor = ClassPropertyDescriptor; + + static Function DefineClass(Napi::Env env, + const char* utf8name, + const std::initializer_list& properties, + void* data = nullptr); + static Function DefineClass(Napi::Env env, + const char* utf8name, + const std::vector& properties, + void* data = nullptr); + static PropertyDescriptor StaticMethod(const char* utf8name, + StaticVoidMethodCallback method, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + static PropertyDescriptor StaticMethod(const char* utf8name, + StaticMethodCallback method, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + static PropertyDescriptor StaticMethod(Symbol name, + StaticVoidMethodCallback method, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + static PropertyDescriptor StaticMethod(Symbol name, + StaticMethodCallback method, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor StaticMethod(const char* utf8name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor StaticMethod(Symbol name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor StaticMethod(const char* utf8name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor StaticMethod(Symbol name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + static PropertyDescriptor StaticAccessor(const char* utf8name, + StaticGetterCallback getter, + StaticSetterCallback setter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + static PropertyDescriptor StaticAccessor(Symbol name, + StaticGetterCallback getter, + StaticSetterCallback setter, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor StaticAccessor(const char* utf8name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + template + static PropertyDescriptor StaticAccessor(Symbol name, + napi_property_attributes attributes = napi_default, + void* data = nullptr); + static PropertyDescriptor StaticValue(const char* utf8name, + Napi::Value value, + napi_property_attributes attributes = napi_default); + static PropertyDescriptor StaticValue(Symbol name, + Napi::Value value, + napi_property_attributes attributes = napi_default); + virtual void Finalize(Napi::Env env); + + private: + using This = ObjectWrap; + + static napi_value ConstructorCallbackWrapper(napi_env env, napi_callback_info info); + static napi_value StaticVoidMethodCallbackWrapper(napi_env env, napi_callback_info info); + static napi_value StaticMethodCallbackWrapper(napi_env env, napi_callback_info info); + static napi_value StaticGetterCallbackWrapper(napi_env env, napi_callback_info info); + static napi_value StaticSetterCallbackWrapper(napi_env env, napi_callback_info info); + static void FinalizeCallback(napi_env env, void* data, void* hint); + static Function DefineClass(Napi::Env env, + const char* utf8name, + const size_t props_count, + const napi_property_descriptor* props, + void* data = nullptr); + + using StaticVoidMethodCallbackData = + MethodCallbackData; + using StaticMethodCallbackData = + MethodCallbackData; + + using StaticAccessorCallbackData = + AccessorCallbackData; + + template + static napi_value WrappedMethod(napi_env env, + napi_callback_info info) NAPI_NOEXCEPT; + + template struct StaticSetterTag {}; + + template + static napi_callback WrapStaticSetter(StaticSetterTag) + NAPI_NOEXCEPT { + return &This::WrappedMethod; + } + static napi_callback WrapStaticSetter(StaticSetterTag) + NAPI_NOEXCEPT { + return nullptr; + } + + bool _construction_failed = true; + }; + + class HandleScope { + public: + HandleScope(napi_env env, napi_handle_scope scope); + explicit HandleScope(Napi::Env env); + ~HandleScope(); + + // Disallow copying to prevent double close of napi_handle_scope + NAPI_DISALLOW_ASSIGN_COPY(HandleScope) + + operator napi_handle_scope() const; + + Napi::Env Env() const; + + private: + napi_env _env; + napi_handle_scope _scope; + }; + + class EscapableHandleScope { + public: + EscapableHandleScope(napi_env env, napi_escapable_handle_scope scope); + explicit EscapableHandleScope(Napi::Env env); + ~EscapableHandleScope(); + + // Disallow copying to prevent double close of napi_escapable_handle_scope + NAPI_DISALLOW_ASSIGN_COPY(EscapableHandleScope) + + operator napi_escapable_handle_scope() const; + + Napi::Env Env() const; + Value Escape(napi_value escapee); + + private: + napi_env _env; + napi_escapable_handle_scope _scope; + }; + +#if (NAPI_VERSION > 2) + class CallbackScope { + public: + CallbackScope(napi_env env, napi_callback_scope scope); + CallbackScope(napi_env env, napi_async_context context); + virtual ~CallbackScope(); + + // Disallow copying to prevent double close of napi_callback_scope + NAPI_DISALLOW_ASSIGN_COPY(CallbackScope) + + operator napi_callback_scope() const; + + Napi::Env Env() const; + + private: + napi_env _env; + napi_callback_scope _scope; + }; +#endif + + class AsyncContext { + public: + explicit AsyncContext(napi_env env, const char* resource_name); + explicit AsyncContext(napi_env env, const char* resource_name, const Object& resource); + virtual ~AsyncContext(); + + AsyncContext(AsyncContext&& other); + AsyncContext& operator =(AsyncContext&& other); + NAPI_DISALLOW_ASSIGN_COPY(AsyncContext) + + operator napi_async_context() const; + + Napi::Env Env() const; + + private: + napi_env _env; + napi_async_context _context; + }; + + class AsyncWorker { + public: + virtual ~AsyncWorker(); + + // An async worker can be moved but cannot be copied. + AsyncWorker(AsyncWorker&& other); + AsyncWorker& operator =(AsyncWorker&& other); + NAPI_DISALLOW_ASSIGN_COPY(AsyncWorker) + + operator napi_async_work() const; + + Napi::Env Env() const; + + void Queue(); + void Cancel(); + void SuppressDestruct(); + + ObjectReference& Receiver(); + FunctionReference& Callback(); + + virtual void OnExecute(Napi::Env env); + virtual void OnWorkComplete(Napi::Env env, + napi_status status); + + protected: + explicit AsyncWorker(const Function& callback); + explicit AsyncWorker(const Function& callback, + const char* resource_name); + explicit AsyncWorker(const Function& callback, + const char* resource_name, + const Object& resource); + explicit AsyncWorker(const Object& receiver, + const Function& callback); + explicit AsyncWorker(const Object& receiver, + const Function& callback, + const char* resource_name); + explicit AsyncWorker(const Object& receiver, + const Function& callback, + const char* resource_name, + const Object& resource); + + explicit AsyncWorker(Napi::Env env); + explicit AsyncWorker(Napi::Env env, + const char* resource_name); + explicit AsyncWorker(Napi::Env env, + const char* resource_name, + const Object& resource); + + virtual void Execute() = 0; + virtual void OnOK(); + virtual void OnError(const Error& e); + virtual void Destroy(); + virtual std::vector GetResult(Napi::Env env); + + void SetError(const std::string& error); + + private: + static inline void OnAsyncWorkExecute(napi_env env, void* asyncworker); + static inline void OnAsyncWorkComplete(napi_env env, + napi_status status, + void* asyncworker); + + napi_env _env; + napi_async_work _work; + ObjectReference _receiver; + FunctionReference _callback; + std::string _error; + bool _suppress_destruct; + }; + + #if (NAPI_VERSION > 3 && !defined(__wasm32__)) + class ThreadSafeFunction { + public: + // This API may only be called from the main thread. + template + static ThreadSafeFunction New(napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount); + + // This API may only be called from the main thread. + template + static ThreadSafeFunction New(napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context); + + // This API may only be called from the main thread. + template + static ThreadSafeFunction New(napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + Finalizer finalizeCallback); + + // This API may only be called from the main thread. + template + static ThreadSafeFunction New(napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + Finalizer finalizeCallback, + FinalizerDataType* data); + + // This API may only be called from the main thread. + template + static ThreadSafeFunction New(napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback); + + // This API may only be called from the main thread. + template + static ThreadSafeFunction New(napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data); + + // This API may only be called from the main thread. + template + static ThreadSafeFunction New(napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount); + + // This API may only be called from the main thread. + template + static ThreadSafeFunction New(napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context); + + // This API may only be called from the main thread. + template + static ThreadSafeFunction New(napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + Finalizer finalizeCallback); + + // This API may only be called from the main thread. + template + static ThreadSafeFunction New(napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + Finalizer finalizeCallback, + FinalizerDataType* data); + + // This API may only be called from the main thread. + template + static ThreadSafeFunction New(napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback); + + // This API may only be called from the main thread. + template + static ThreadSafeFunction New(napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data); + + ThreadSafeFunction(); + ThreadSafeFunction(napi_threadsafe_function tsFunctionValue); + + operator napi_threadsafe_function() const; + + // This API may be called from any thread. + napi_status BlockingCall() const; + + // This API may be called from any thread. + template + napi_status BlockingCall(Callback callback) const; + + // This API may be called from any thread. + template + napi_status BlockingCall(DataType* data, Callback callback) const; + + // This API may be called from any thread. + napi_status NonBlockingCall() const; + + // This API may be called from any thread. + template + napi_status NonBlockingCall(Callback callback) const; + + // This API may be called from any thread. + template + napi_status NonBlockingCall(DataType* data, Callback callback) const; + + // This API may only be called from the main thread. + void Ref(napi_env env) const; + + // This API may only be called from the main thread. + void Unref(napi_env env) const; + + // This API may be called from any thread. + napi_status Acquire() const; + + // This API may be called from any thread. + napi_status Release(); + + // This API may be called from any thread. + napi_status Abort(); + + struct ConvertibleContext + { + template + operator T*() { return static_cast(context); } + void* context; + }; + + // This API may be called from any thread. + ConvertibleContext GetContext() const; + + private: + using CallbackWrapper = std::function; + + template + static ThreadSafeFunction New(napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data, + napi_finalize wrapper); + + napi_status CallInternal(CallbackWrapper* callbackWrapper, + napi_threadsafe_function_call_mode mode) const; + + static void CallJS(napi_env env, + napi_value jsCallback, + void* context, + void* data); + + napi_threadsafe_function _tsfn; + }; + + // A TypedThreadSafeFunction by default has no context (nullptr) and can + // accept any type (void) to its CallJs. + template + class TypedThreadSafeFunction { + public: + // This API may only be called from the main thread. + // Helper function that returns nullptr if running Node-API 5+, otherwise a + // non-empty, no-op Function. This provides the ability to specify at + // compile-time a callback parameter to `New` that safely does no action + // when targeting _any_ Node-API version. +#if NAPI_VERSION > 4 + static std::nullptr_t EmptyFunctionFactory(Napi::Env env); +#else + static Napi::Function EmptyFunctionFactory(Napi::Env env); +#endif + static Napi::Function FunctionOrEmpty(Napi::Env env, + Napi::Function& callback); + +#if NAPI_VERSION > 4 + // This API may only be called from the main thread. + // Creates a new threadsafe function with: + // Callback [missing] Resource [missing] Finalizer [missing] + template + static TypedThreadSafeFunction New( + napi_env env, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context = nullptr); + + // This API may only be called from the main thread. + // Creates a new threadsafe function with: + // Callback [missing] Resource [passed] Finalizer [missing] + template + static TypedThreadSafeFunction New( + napi_env env, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context = nullptr); + + // This API may only be called from the main thread. + // Creates a new threadsafe function with: + // Callback [missing] Resource [missing] Finalizer [passed] + template + static TypedThreadSafeFunction New( + napi_env env, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data = nullptr); + + // This API may only be called from the main thread. + // Creates a new threadsafe function with: + // Callback [missing] Resource [passed] Finalizer [passed] + template + static TypedThreadSafeFunction New( + napi_env env, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data = nullptr); +#endif + + // This API may only be called from the main thread. + // Creates a new threadsafe function with: + // Callback [passed] Resource [missing] Finalizer [missing] + template + static TypedThreadSafeFunction New( + napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context = nullptr); + + // This API may only be called from the main thread. + // Creates a new threadsafe function with: + // Callback [passed] Resource [passed] Finalizer [missing] + template + static TypedThreadSafeFunction New( + napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context = nullptr); + + // This API may only be called from the main thread. + // Creates a new threadsafe function with: + // Callback [passed] Resource [missing] Finalizer [passed] + template + static TypedThreadSafeFunction New( + napi_env env, + const Function& callback, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data = nullptr); + + // This API may only be called from the main thread. + // Creates a new threadsafe function with: + // Callback [passed] Resource [passed] Finalizer [passed] + template + static TypedThreadSafeFunction New( + napi_env env, + CallbackType callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data = nullptr); + + TypedThreadSafeFunction(); + TypedThreadSafeFunction( + napi_threadsafe_function tsFunctionValue); + + operator napi_threadsafe_function() const; + + // This API may be called from any thread. + napi_status BlockingCall(DataType* data = nullptr) const; + + // This API may be called from any thread. + napi_status NonBlockingCall(DataType* data = nullptr) const; + + // This API may only be called from the main thread. + void Ref(napi_env env) const; + + // This API may only be called from the main thread. + void Unref(napi_env env) const; + + // This API may be called from any thread. + napi_status Acquire() const; + + // This API may be called from any thread. + napi_status Release(); + + // This API may be called from any thread. + napi_status Abort(); + + // This API may be called from any thread. + ContextType* GetContext() const; + + private: + template + static TypedThreadSafeFunction New( + napi_env env, + const Function& callback, + const Object& resource, + ResourceString resourceName, + size_t maxQueueSize, + size_t initialThreadCount, + ContextType* context, + Finalizer finalizeCallback, + FinalizerDataType* data, + napi_finalize wrapper); + + static void CallJsInternal(napi_env env, + napi_value jsCallback, + void* context, + void* data); + + protected: + napi_threadsafe_function _tsfn; + }; + template + class AsyncProgressWorkerBase : public AsyncWorker { + public: + virtual void OnWorkProgress(DataType* data) = 0; + class ThreadSafeData { + public: + ThreadSafeData(AsyncProgressWorkerBase* asyncprogressworker, DataType* data) + : _asyncprogressworker(asyncprogressworker), _data(data) {} + + AsyncProgressWorkerBase* asyncprogressworker() { return _asyncprogressworker; }; + DataType* data() { return _data; }; + + private: + AsyncProgressWorkerBase* _asyncprogressworker; + DataType* _data; + }; + void OnWorkComplete(Napi::Env env, napi_status status) override; + protected: + explicit AsyncProgressWorkerBase(const Object& receiver, + const Function& callback, + const char* resource_name, + const Object& resource, + size_t queue_size = 1); + virtual ~AsyncProgressWorkerBase(); + +// Optional callback of Napi::ThreadSafeFunction only available after NAPI_VERSION 4. +// Refs: https://github.com/nodejs/node/pull/27791 +#if NAPI_VERSION > 4 + explicit AsyncProgressWorkerBase(Napi::Env env, + const char* resource_name, + const Object& resource, + size_t queue_size = 1); +#endif + + static inline void OnAsyncWorkProgress(Napi::Env env, + Napi::Function jsCallback, + void* data); + + napi_status NonBlockingCall(DataType* data); + + private: + ThreadSafeFunction _tsfn; + bool _work_completed = false; + napi_status _complete_status; + static inline void OnThreadSafeFunctionFinalize(Napi::Env env, void* data, AsyncProgressWorkerBase* context); + }; + + template + class AsyncProgressWorker : public AsyncProgressWorkerBase { + public: + virtual ~AsyncProgressWorker(); + + class ExecutionProgress { + friend class AsyncProgressWorker; + public: + void Signal() const; + void Send(const T* data, size_t count) const; + private: + explicit ExecutionProgress(AsyncProgressWorker* worker) : _worker(worker) {} + AsyncProgressWorker* const _worker; + }; + + void OnWorkProgress(void*) override; + + protected: + explicit AsyncProgressWorker(const Function& callback); + explicit AsyncProgressWorker(const Function& callback, + const char* resource_name); + explicit AsyncProgressWorker(const Function& callback, + const char* resource_name, + const Object& resource); + explicit AsyncProgressWorker(const Object& receiver, + const Function& callback); + explicit AsyncProgressWorker(const Object& receiver, + const Function& callback, + const char* resource_name); + explicit AsyncProgressWorker(const Object& receiver, + const Function& callback, + const char* resource_name, + const Object& resource); + +// Optional callback of Napi::ThreadSafeFunction only available after NAPI_VERSION 4. +// Refs: https://github.com/nodejs/node/pull/27791 +#if NAPI_VERSION > 4 + explicit AsyncProgressWorker(Napi::Env env); + explicit AsyncProgressWorker(Napi::Env env, + const char* resource_name); + explicit AsyncProgressWorker(Napi::Env env, + const char* resource_name, + const Object& resource); +#endif + virtual void Execute(const ExecutionProgress& progress) = 0; + virtual void OnProgress(const T* data, size_t count) = 0; + + private: + void Execute() override; + void Signal() const; + void SendProgress_(const T* data, size_t count); + + std::mutex _mutex; + T* _asyncdata; + size_t _asyncsize; + }; + + template + class AsyncProgressQueueWorker : public AsyncProgressWorkerBase> { + public: + virtual ~AsyncProgressQueueWorker() {}; + + class ExecutionProgress { + friend class AsyncProgressQueueWorker; + public: + void Signal() const; + void Send(const T* data, size_t count) const; + private: + explicit ExecutionProgress(AsyncProgressQueueWorker* worker) : _worker(worker) {} + AsyncProgressQueueWorker* const _worker; + }; + + void OnWorkComplete(Napi::Env env, napi_status status) override; + void OnWorkProgress(std::pair*) override; + + protected: + explicit AsyncProgressQueueWorker(const Function& callback); + explicit AsyncProgressQueueWorker(const Function& callback, + const char* resource_name); + explicit AsyncProgressQueueWorker(const Function& callback, + const char* resource_name, + const Object& resource); + explicit AsyncProgressQueueWorker(const Object& receiver, + const Function& callback); + explicit AsyncProgressQueueWorker(const Object& receiver, + const Function& callback, + const char* resource_name); + explicit AsyncProgressQueueWorker(const Object& receiver, + const Function& callback, + const char* resource_name, + const Object& resource); + +// Optional callback of Napi::ThreadSafeFunction only available after NAPI_VERSION 4. +// Refs: https://github.com/nodejs/node/pull/27791 +#if NAPI_VERSION > 4 + explicit AsyncProgressQueueWorker(Napi::Env env); + explicit AsyncProgressQueueWorker(Napi::Env env, + const char* resource_name); + explicit AsyncProgressQueueWorker(Napi::Env env, + const char* resource_name, + const Object& resource); +#endif + virtual void Execute(const ExecutionProgress& progress) = 0; + virtual void OnProgress(const T* data, size_t count) = 0; + + private: + void Execute() override; + void Signal() const; + void SendProgress_(const T* data, size_t count); + }; + #endif // NAPI_VERSION > 3 && !defined(__wasm32__) + + // Memory management. + class MemoryManagement { + public: + static int64_t AdjustExternalMemory(Env env, int64_t change_in_bytes); + }; + + // Version management + class VersionManagement { + public: + static uint32_t GetNapiVersion(Env env); + static const napi_node_version* GetNodeVersion(Env env); + }; + +#if NAPI_VERSION > 5 + template + class Addon : public InstanceWrap { + public: + static inline Object Init(Env env, Object exports); + static T* Unwrap(Object wrapper); + + protected: + using AddonProp = ClassPropertyDescriptor; + void DefineAddon(Object exports, + const std::initializer_list& props); + Napi::Object DefineProperties(Object object, + const std::initializer_list& props); + + private: + Object entry_point_; + }; +#endif // NAPI_VERSION > 5 + +} // namespace Napi + +// Inline implementations of all the above class methods are included here. +#include "napi-inl.h" + +#endif // SRC_NAPI_H_ diff --git a/lwnode/apps/sqlite3/deps/include/node_api.h b/lwnode/apps/sqlite3/deps/include/node_api.h new file mode 100644 index 0000000..786988e --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/node_api.h @@ -0,0 +1,268 @@ +#ifndef SRC_NODE_API_H_ +#define SRC_NODE_API_H_ + +#ifdef BUILDING_NODE_EXTENSION + #ifdef _WIN32 + // Building native module against node + #define NAPI_EXTERN __declspec(dllimport) + #elif defined(__wasm32__) + #define NAPI_EXTERN __attribute__((__import_module__("napi"))) + #endif +#endif +#include "js_native_api.h" +#include "node_api_types.h" + +struct uv_loop_s; // Forward declaration. + +#ifdef _WIN32 +# define NAPI_MODULE_EXPORT __declspec(dllexport) +#else +# define NAPI_MODULE_EXPORT __attribute__((visibility("default"))) +#endif + +#if defined(__GNUC__) +# define NAPI_NO_RETURN __attribute__((noreturn)) +#elif defined(_WIN32) +# define NAPI_NO_RETURN __declspec(noreturn) +#else +# define NAPI_NO_RETURN +#endif + +typedef napi_value (*napi_addon_register_func)(napi_env env, + napi_value exports); + +typedef struct napi_module { + int nm_version; + unsigned int nm_flags; + const char* nm_filename; + napi_addon_register_func nm_register_func; + const char* nm_modname; + void* nm_priv; + void* reserved[4]; +} napi_module; + +#define NAPI_MODULE_VERSION 1 + +#if defined(_MSC_VER) +#pragma section(".CRT$XCU", read) +#define NAPI_C_CTOR(fn) \ + static void __cdecl fn(void); \ + __declspec(dllexport, allocate(".CRT$XCU")) void(__cdecl * fn##_)(void) = \ + fn; \ + static void __cdecl fn(void) +#else +#define NAPI_C_CTOR(fn) \ + static void fn(void) __attribute__((constructor)); \ + static void fn(void) +#endif + +#define NAPI_MODULE_X(modname, regfunc, priv, flags) \ + EXTERN_C_START \ + static napi_module _module = \ + { \ + NAPI_MODULE_VERSION, \ + flags, \ + __FILE__, \ + regfunc, \ + #modname, \ + priv, \ + {0}, \ + }; \ + NAPI_C_CTOR(_register_ ## modname) { \ + napi_module_register(&_module); \ + } \ + EXTERN_C_END + +#define NAPI_MODULE_INITIALIZER_X(base, version) \ + NAPI_MODULE_INITIALIZER_X_HELPER(base, version) +#define NAPI_MODULE_INITIALIZER_X_HELPER(base, version) base##version + +#ifdef __wasm32__ +#define NAPI_WASM_INITIALIZER \ + NAPI_MODULE_INITIALIZER_X(napi_register_wasm_v, NAPI_MODULE_VERSION) +#define NAPI_MODULE(modname, regfunc) \ + EXTERN_C_START \ + NAPI_MODULE_EXPORT napi_value NAPI_WASM_INITIALIZER(napi_env env, \ + napi_value exports) { \ + return regfunc(env, exports); \ + } \ + EXTERN_C_END +#else +#define NAPI_MODULE(modname, regfunc) \ + NAPI_MODULE_X(modname, regfunc, NULL, 0) // NOLINT (readability/null_usage) +#endif + +#define NAPI_MODULE_INITIALIZER_BASE napi_register_module_v + +#define NAPI_MODULE_INITIALIZER \ + NAPI_MODULE_INITIALIZER_X(NAPI_MODULE_INITIALIZER_BASE, \ + NAPI_MODULE_VERSION) + +#define NAPI_MODULE_INIT() \ + EXTERN_C_START \ + NAPI_MODULE_EXPORT napi_value \ + NAPI_MODULE_INITIALIZER(napi_env env, napi_value exports); \ + EXTERN_C_END \ + NAPI_MODULE(NODE_GYP_MODULE_NAME, NAPI_MODULE_INITIALIZER) \ + napi_value NAPI_MODULE_INITIALIZER(napi_env env, \ + napi_value exports) + +EXTERN_C_START + +NAPI_EXTERN void napi_module_register(napi_module* mod); + +NAPI_EXTERN NAPI_NO_RETURN void napi_fatal_error(const char* location, + size_t location_len, + const char* message, + size_t message_len); + +// Methods for custom handling of async operations +NAPI_EXTERN napi_status napi_async_init(napi_env env, + napi_value async_resource, + napi_value async_resource_name, + napi_async_context* result); + +NAPI_EXTERN napi_status napi_async_destroy(napi_env env, + napi_async_context async_context); + +NAPI_EXTERN napi_status napi_make_callback(napi_env env, + napi_async_context async_context, + napi_value recv, + napi_value func, + size_t argc, + const napi_value* argv, + napi_value* result); + +// Methods to provide node::Buffer functionality with napi types +NAPI_EXTERN napi_status napi_create_buffer(napi_env env, + size_t length, + void** data, + napi_value* result); +NAPI_EXTERN napi_status napi_create_external_buffer(napi_env env, + size_t length, + void* data, + napi_finalize finalize_cb, + void* finalize_hint, + napi_value* result); +NAPI_EXTERN napi_status napi_create_buffer_copy(napi_env env, + size_t length, + const void* data, + void** result_data, + napi_value* result); +NAPI_EXTERN napi_status napi_is_buffer(napi_env env, + napi_value value, + bool* result); +NAPI_EXTERN napi_status napi_get_buffer_info(napi_env env, + napi_value value, + void** data, + size_t* length); + +// Methods to manage simple async operations +NAPI_EXTERN +napi_status napi_create_async_work(napi_env env, + napi_value async_resource, + napi_value async_resource_name, + napi_async_execute_callback execute, + napi_async_complete_callback complete, + void* data, + napi_async_work* result); +NAPI_EXTERN napi_status napi_delete_async_work(napi_env env, + napi_async_work work); +NAPI_EXTERN napi_status napi_queue_async_work(napi_env env, + napi_async_work work); +NAPI_EXTERN napi_status napi_cancel_async_work(napi_env env, + napi_async_work work); + +// version management +NAPI_EXTERN +napi_status napi_get_node_version(napi_env env, + const napi_node_version** version); + +#if NAPI_VERSION >= 2 + +// Return the current libuv event loop for a given environment +NAPI_EXTERN napi_status napi_get_uv_event_loop(napi_env env, + struct uv_loop_s** loop); + +#endif // NAPI_VERSION >= 2 + +#if NAPI_VERSION >= 3 + +NAPI_EXTERN napi_status napi_fatal_exception(napi_env env, napi_value err); + +NAPI_EXTERN napi_status napi_add_env_cleanup_hook(napi_env env, + void (*fun)(void* arg), + void* arg); + +NAPI_EXTERN napi_status napi_remove_env_cleanup_hook(napi_env env, + void (*fun)(void* arg), + void* arg); + +NAPI_EXTERN napi_status napi_open_callback_scope(napi_env env, + napi_value resource_object, + napi_async_context context, + napi_callback_scope* result); + +NAPI_EXTERN napi_status napi_close_callback_scope(napi_env env, + napi_callback_scope scope); + +#endif // NAPI_VERSION >= 3 + +#if NAPI_VERSION >= 4 + +#ifndef __wasm32__ +// Calling into JS from other threads +NAPI_EXTERN napi_status +napi_create_threadsafe_function(napi_env env, + napi_value func, + napi_value async_resource, + napi_value async_resource_name, + size_t max_queue_size, + size_t initial_thread_count, + void* thread_finalize_data, + napi_finalize thread_finalize_cb, + void* context, + napi_threadsafe_function_call_js call_js_cb, + napi_threadsafe_function* result); + +NAPI_EXTERN napi_status +napi_get_threadsafe_function_context(napi_threadsafe_function func, + void** result); + +NAPI_EXTERN napi_status +napi_call_threadsafe_function(napi_threadsafe_function func, + void* data, + napi_threadsafe_function_call_mode is_blocking); + +NAPI_EXTERN napi_status +napi_acquire_threadsafe_function(napi_threadsafe_function func); + +NAPI_EXTERN napi_status +napi_release_threadsafe_function(napi_threadsafe_function func, + napi_threadsafe_function_release_mode mode); + +NAPI_EXTERN napi_status +napi_unref_threadsafe_function(napi_env env, napi_threadsafe_function func); + +NAPI_EXTERN napi_status +napi_ref_threadsafe_function(napi_env env, napi_threadsafe_function func); +#endif // __wasm32__ + +#endif // NAPI_VERSION >= 4 + +#ifdef NAPI_EXPERIMENTAL + +NAPI_EXTERN napi_status napi_add_async_cleanup_hook( + napi_env env, + napi_async_cleanup_hook hook, + void* arg, + napi_async_cleanup_hook_handle* remove_handle); + +NAPI_EXTERN napi_status napi_remove_async_cleanup_hook( + napi_async_cleanup_hook_handle remove_handle); + +#endif // NAPI_EXPERIMENTAL + +EXTERN_C_END + +#endif // SRC_NODE_API_H_ diff --git a/lwnode/apps/sqlite3/deps/include/node_api_types.h b/lwnode/apps/sqlite3/deps/include/node_api_types.h new file mode 100644 index 0000000..0e400e9 --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/node_api_types.h @@ -0,0 +1,50 @@ +#ifndef SRC_NODE_API_TYPES_H_ +#define SRC_NODE_API_TYPES_H_ + +#include "js_native_api_types.h" + +typedef struct napi_callback_scope__* napi_callback_scope; +typedef struct napi_async_context__* napi_async_context; +typedef struct napi_async_work__* napi_async_work; +#if NAPI_VERSION >= 4 +typedef struct napi_threadsafe_function__* napi_threadsafe_function; +#endif // NAPI_VERSION >= 4 + +#if NAPI_VERSION >= 4 +typedef enum { + napi_tsfn_release, + napi_tsfn_abort +} napi_threadsafe_function_release_mode; + +typedef enum { + napi_tsfn_nonblocking, + napi_tsfn_blocking +} napi_threadsafe_function_call_mode; +#endif // NAPI_VERSION >= 4 + +typedef void (*napi_async_execute_callback)(napi_env env, + void* data); +typedef void (*napi_async_complete_callback)(napi_env env, + napi_status status, + void* data); +#if NAPI_VERSION >= 4 +typedef void (*napi_threadsafe_function_call_js)(napi_env env, + napi_value js_callback, + void* context, + void* data); +#endif // NAPI_VERSION >= 4 + +typedef struct { + uint32_t major; + uint32_t minor; + uint32_t patch; + const char* release; +} napi_node_version; + +#ifdef NAPI_EXPERIMENTAL +typedef struct napi_async_cleanup_hook_handle__* napi_async_cleanup_hook_handle; +typedef void (*napi_async_cleanup_hook)(napi_async_cleanup_hook_handle handle, + void* data); +#endif // NAPI_EXPERIMENTAL + +#endif // SRC_NODE_API_TYPES_H_ diff --git a/lwnode/apps/sqlite3/deps/include/node_internals.h b/lwnode/apps/sqlite3/deps/include/node_internals.h new file mode 100644 index 0000000..aa7180e --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/node_internals.h @@ -0,0 +1,403 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef SRC_NODE_INTERNALS_H_ +#define SRC_NODE_INTERNALS_H_ + +#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS + +#include "env.h" +#include "node.h" +#include "node_binding.h" +#include "node_mutex.h" +#include "tracing/trace_event.h" +#include "util.h" +#include "uv.h" +#include "v8.h" + +#include +#include + +#include +#include + +// Custom constants used by both node_constants.cc and node_zlib.cc +#define Z_MIN_WINDOWBITS 8 +#define Z_MAX_WINDOWBITS 15 +#define Z_DEFAULT_WINDOWBITS 15 + +struct sockaddr; + +namespace node { + +namespace native_module { +class NativeModuleLoader; +} + +namespace per_process { +extern Mutex env_var_mutex; +extern uint64_t node_start_time; +} // namespace per_process + +// Forward declaration +class Environment; + +// Convert a struct sockaddr to a { address: '1.2.3.4', port: 1234 } JS object. +// Sets address and port properties on the info object and returns it. +// If |info| is omitted, a new object is returned. +v8::Local AddressToJS( + Environment* env, + const sockaddr* addr, + v8::Local info = v8::Local()); + +template +void GetSockOrPeerName(const v8::FunctionCallbackInfo& args) { + T* wrap; + ASSIGN_OR_RETURN_UNWRAP(&wrap, + args.Holder(), + args.GetReturnValue().Set(UV_EBADF)); + CHECK(args[0]->IsObject()); + sockaddr_storage storage; + int addrlen = sizeof(storage); + sockaddr* const addr = reinterpret_cast(&storage); + const int err = F(&wrap->handle_, addr, &addrlen); + if (err == 0) + AddressToJS(wrap->env(), addr, args[0].As()); + args.GetReturnValue().Set(err); +} + +void PrintStackTrace(v8::Isolate* isolate, v8::Local stack); +void PrintCaughtException(v8::Isolate* isolate, + v8::Local context, + const v8::TryCatch& try_catch); + +void ResetStdio(); // Safe to call more than once and from signal handlers. +#ifdef __POSIX__ +void SignalExit(int signal, siginfo_t* info, void* ucontext); +#endif + +std::string GetProcessTitle(const char* default_title); +std::string GetHumanReadableProcessName(); + +void InitializeContextRuntime(v8::Local); +bool InitializePrimordials(v8::Local context); + +class NodeArrayBufferAllocator : public ArrayBufferAllocator { + public: + inline uint32_t* zero_fill_field() { return &zero_fill_field_; } + + void* Allocate(size_t size) override; // Defined in src/node.cc + void* AllocateUninitialized(size_t size) override; + void Free(void* data, size_t size) override; + void* Reallocate(void* data, size_t old_size, size_t size) override; + virtual void RegisterPointer(void* data, size_t size) { + total_mem_usage_.fetch_add(size, std::memory_order_relaxed); + } + virtual void UnregisterPointer(void* data, size_t size) { + total_mem_usage_.fetch_sub(size, std::memory_order_relaxed); + } + + NodeArrayBufferAllocator* GetImpl() final { return this; } + inline uint64_t total_mem_usage() const { + return total_mem_usage_.load(std::memory_order_relaxed); + } + + private: + uint32_t zero_fill_field_ = 1; // Boolean but exposed as uint32 to JS land. + std::atomic total_mem_usage_ {0}; +}; + +class DebuggingArrayBufferAllocator final : public NodeArrayBufferAllocator { + public: + ~DebuggingArrayBufferAllocator() override; + void* Allocate(size_t size) override; + void* AllocateUninitialized(size_t size) override; + void Free(void* data, size_t size) override; + void* Reallocate(void* data, size_t old_size, size_t size) override; + void RegisterPointer(void* data, size_t size) override; + void UnregisterPointer(void* data, size_t size) override; + + private: + void RegisterPointerInternal(void* data, size_t size); + void UnregisterPointerInternal(void* data, size_t size); + Mutex mutex_; + std::unordered_map allocations_; +}; + +namespace Buffer { +v8::MaybeLocal Copy(Environment* env, const char* data, size_t len); +v8::MaybeLocal New(Environment* env, size_t size); +// Takes ownership of |data|. +v8::MaybeLocal New(Environment* env, + char* data, + size_t length, + void (*callback)(char* data, void* hint), + void* hint); +// Takes ownership of |data|. Must allocate |data| with the current Isolate's +// ArrayBuffer::Allocator(). +v8::MaybeLocal New(Environment* env, + char* data, + size_t length); +// Creates a Buffer instance over an existing ArrayBuffer. +v8::MaybeLocal New(Environment* env, + v8::Local ab, + size_t byte_offset, + size_t length); +// Construct a Buffer from a MaybeStackBuffer (and also its subclasses like +// Utf8Value and TwoByteValue). +// If |buf| is invalidated, an empty MaybeLocal is returned, and nothing is +// changed. +// If |buf| contains actual data, this method takes ownership of |buf|'s +// underlying buffer. However, |buf| itself can be reused even after this call, +// but its capacity, if increased through AllocateSufficientStorage, is not +// guaranteed to stay the same. +template +static v8::MaybeLocal New(Environment* env, + MaybeStackBuffer* buf) { + v8::MaybeLocal ret; + char* src = reinterpret_cast(buf->out()); + const size_t len_in_bytes = buf->length() * sizeof(buf->out()[0]); + + if (buf->IsAllocated()) + ret = New(env, src, len_in_bytes); + else if (!buf->IsInvalidated()) + ret = Copy(env, src, len_in_bytes); + + if (ret.IsEmpty()) + return ret; + + if (buf->IsAllocated()) + buf->Release(); + + return ret; +} +} // namespace Buffer + +v8::MaybeLocal InternalMakeCallback( + Environment* env, + v8::Local resource, + v8::Local recv, + const v8::Local callback, + int argc, + v8::Local argv[], + async_context asyncContext); + +class InternalCallbackScope { + public: + enum Flags { + kNoFlags = 0, + // Indicates whether 'before' and 'after' hooks should be skipped. + kSkipAsyncHooks = 1, + // Indicates whether nextTick and microtask queues should be skipped. + // This should only be used when there is no call into JS in this scope. + // (The HTTP parser also uses it for some weird backwards + // compatibility issues, but it shouldn't.) + kSkipTaskQueues = 2 + }; + InternalCallbackScope(Environment* env, + v8::Local object, + const async_context& asyncContext, + int flags = kNoFlags); + // Utility that can be used by AsyncWrap classes. + explicit InternalCallbackScope(AsyncWrap* async_wrap, int flags = 0); + ~InternalCallbackScope(); + void Close(); + + inline bool Failed() const { return failed_; } + inline void MarkAsFailed() { failed_ = true; } + + private: + Environment* env_; + async_context async_context_; + v8::Local object_; + bool skip_hooks_; + bool skip_task_queues_; + bool failed_ = false; + bool pushed_ids_ = false; + bool closed_ = false; +}; + +class DebugSealHandleScope { + public: + explicit inline DebugSealHandleScope(v8::Isolate* isolate = nullptr) +#ifdef DEBUG + : actual_scope_(isolate != nullptr ? isolate : v8::Isolate::GetCurrent()) +#endif + {} + + private: +#ifdef DEBUG + v8::SealHandleScope actual_scope_; +#endif +}; + +class ThreadPoolWork { + public: + explicit inline ThreadPoolWork(Environment* env) : env_(env) { + CHECK_NOT_NULL(env); + } + inline virtual ~ThreadPoolWork() = default; + + inline void ScheduleWork(); + inline int CancelWork(); + + virtual void DoThreadPoolWork() = 0; + virtual void AfterThreadPoolWork(int status) = 0; + + Environment* env() const { return env_; } + + private: + Environment* env_; + uv_work_t work_req_; +}; + +#define TRACING_CATEGORY_NODE "node" +#define TRACING_CATEGORY_NODE1(one) \ + TRACING_CATEGORY_NODE "," \ + TRACING_CATEGORY_NODE "." #one +#define TRACING_CATEGORY_NODE2(one, two) \ + TRACING_CATEGORY_NODE "," \ + TRACING_CATEGORY_NODE "." #one "," \ + TRACING_CATEGORY_NODE "." #one "." #two + +// Functions defined in node.cc that are exposed via the bootstrapper object + +#if defined(__POSIX__) && !defined(__ANDROID__) && !defined(__CloudABI__) +#define NODE_IMPLEMENTS_POSIX_CREDENTIALS 1 +#endif // __POSIX__ && !defined(__ANDROID__) && !defined(__CloudABI__) + +namespace credentials { +bool SafeGetenv(const char* key, std::string* text, Environment* env = nullptr); +} // namespace credentials + +void DefineZlibConstants(v8::Local target); +v8::Isolate* NewIsolate(v8::Isolate::CreateParams* params, + uv_loop_t* event_loop, + MultiIsolatePlatform* platform); +// This overload automatically picks the right 'main_script_id' if no callback +// was provided by the embedder. +v8::MaybeLocal StartExecution(Environment* env, + StartExecutionCallback cb = nullptr); +v8::MaybeLocal GetPerContextExports(v8::Local context); +v8::MaybeLocal ExecuteBootstrapper( + Environment* env, + const char* id, + std::vector>* parameters, + std::vector>* arguments); +void MarkBootstrapComplete(const v8::FunctionCallbackInfo& args); + +struct InitializationResult { + int exit_code = 0; + std::vector args; + std::vector exec_args; + bool early_return = false; +}; +InitializationResult InitializeOncePerProcess(int argc, char** argv); +void TearDownOncePerProcess(); +void SetIsolateErrorHandlers(v8::Isolate* isolate, const IsolateSettings& s); +void SetIsolateMiscHandlers(v8::Isolate* isolate, const IsolateSettings& s); +void SetIsolateCreateParamsForNode(v8::Isolate::CreateParams* params); + +#if HAVE_INSPECTOR +namespace profiler { +void StartProfilers(Environment* env); +} +#endif // HAVE_INSPECTOR + +#ifdef __POSIX__ +static constexpr unsigned kMaxSignal = 32; +#endif + +bool HasSignalJSHandler(int signum); + +#ifdef _WIN32 +typedef SYSTEMTIME TIME_TYPE; +#else // UNIX, OSX +typedef struct tm TIME_TYPE; +#endif + +double GetCurrentTimeInMicroseconds(); +int WriteFileSync(const char* path, uv_buf_t buf); +int WriteFileSync(v8::Isolate* isolate, + const char* path, + v8::Local string); + +class DiagnosticFilename { + public: + static void LocalTime(TIME_TYPE* tm_struct); + + inline DiagnosticFilename(Environment* env, + const char* prefix, + const char* ext); + + inline DiagnosticFilename(uint64_t thread_id, + const char* prefix, + const char* ext); + + inline const char* operator*() const; + + private: + static std::string MakeFilename( + uint64_t thread_id, + const char* prefix, + const char* ext); + + std::string filename_; +}; + +class TraceEventScope { + public: + TraceEventScope(const char* category, + const char* name, + void* id) : category_(category), name_(name), id_(id) { + TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(category_, name_, id_); + } + ~TraceEventScope() { + TRACE_EVENT_NESTABLE_ASYNC_END0(category_, name_, id_); + } + + private: + const char* category_; + const char* name_; + void* id_; +}; + +namespace heap { + +void DeleteHeapSnapshot(const v8::HeapSnapshot* snapshot); +using HeapSnapshotPointer = + DeleteFnPtr; + +BaseObjectPtr CreateHeapSnapshotStream( + Environment* env, HeapSnapshotPointer&& snapshot); +} // namespace heap + +namespace fs { +std::string Basename(const std::string& str, const std::string& extension); +} // namespace fs + +node_module napi_module_to_node_module(const napi_module* mod); + +} // namespace node + +#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS + +#endif // SRC_NODE_INTERNALS_H_ diff --git a/lwnode/apps/sqlite3/deps/include/util-inl.h b/lwnode/apps/sqlite3/deps/include/util-inl.h new file mode 100644 index 0000000..30aad16 --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/util-inl.h @@ -0,0 +1,38 @@ +#ifndef SRC_UTIL_INL_H_ +#define SRC_UTIL_INL_H_ + +#include "util.h" +#include "v8.h" + +namespace node { + +inline v8::Local OneByteString(v8::Isolate* isolate, + const char* data, + int length) { + return v8::String::NewFromOneByte(isolate, + reinterpret_cast(data), + v8::NewStringType::kNormal, + length).ToLocalChecked(); +} + +inline v8::Local OneByteString(v8::Isolate* isolate, + const signed char* data, + int length) { + return v8::String::NewFromOneByte(isolate, + reinterpret_cast(data), + v8::NewStringType::kNormal, + length).ToLocalChecked(); +} + +inline v8::Local OneByteString(v8::Isolate* isolate, + const unsigned char* data, + int length) { + return v8::String::NewFromOneByte(isolate, + reinterpret_cast(data), + v8::NewStringType::kNormal, + length).ToLocalChecked(); +} + +} // namespace node + +#endif // SRC_UTIL_INL_H_ diff --git a/lwnode/apps/sqlite3/deps/include/util.h b/lwnode/apps/sqlite3/deps/include/util.h new file mode 100644 index 0000000..6765bc1 --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/util.h @@ -0,0 +1,7 @@ +#ifndef SRC_UTIL_H_ +#define SRC_UTIL_H_ + +#define FIXED_ONE_BYTE_STRING(isolate, string) \ + (node::OneByteString((isolate), (string), sizeof(string) - 1)) + +#endif // SRC_UTIL_H_ diff --git a/lwnode/apps/sqlite3/deps/include/uv.h b/lwnode/apps/sqlite3/deps/include/uv.h new file mode 100644 index 0000000..2557961 --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv.h @@ -0,0 +1,1824 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* See https://github.com/libuv/libuv#documentation for documentation. */ + +#ifndef UV_H +#define UV_H +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(BUILDING_UV_SHARED) && defined(USING_UV_SHARED) +#error "Define either BUILDING_UV_SHARED or USING_UV_SHARED, not both." +#endif + +#ifdef _WIN32 + /* Windows - set up dll import/export decorators. */ +# if defined(BUILDING_UV_SHARED) + /* Building shared library. */ +# define UV_EXTERN __declspec(dllexport) +# elif defined(USING_UV_SHARED) + /* Using shared library. */ +# define UV_EXTERN __declspec(dllimport) +# else + /* Building static library. */ +# define UV_EXTERN /* nothing */ +# endif +#elif __GNUC__ >= 4 +# define UV_EXTERN __attribute__((visibility("default"))) +#else +# define UV_EXTERN /* nothing */ +#endif + +#include "uv/errno.h" +#include "uv/version.h" +#include +#include + +#if defined(_MSC_VER) && _MSC_VER < 1600 +# include "uv/stdint-msvc2008.h" +#else +# include +#endif + +#if defined(_WIN32) +# include "uv/win.h" +#else +# include "uv/unix.h" +#endif + +/* Expand this list if necessary. */ +#define UV_ERRNO_MAP(XX) \ + XX(E2BIG, "argument list too long") \ + XX(EACCES, "permission denied") \ + XX(EADDRINUSE, "address already in use") \ + XX(EADDRNOTAVAIL, "address not available") \ + XX(EAFNOSUPPORT, "address family not supported") \ + XX(EAGAIN, "resource temporarily unavailable") \ + XX(EAI_ADDRFAMILY, "address family not supported") \ + XX(EAI_AGAIN, "temporary failure") \ + XX(EAI_BADFLAGS, "bad ai_flags value") \ + XX(EAI_BADHINTS, "invalid value for hints") \ + XX(EAI_CANCELED, "request canceled") \ + XX(EAI_FAIL, "permanent failure") \ + XX(EAI_FAMILY, "ai_family not supported") \ + XX(EAI_MEMORY, "out of memory") \ + XX(EAI_NODATA, "no address") \ + XX(EAI_NONAME, "unknown node or service") \ + XX(EAI_OVERFLOW, "argument buffer overflow") \ + XX(EAI_PROTOCOL, "resolved protocol is unknown") \ + XX(EAI_SERVICE, "service not available for socket type") \ + XX(EAI_SOCKTYPE, "socket type not supported") \ + XX(EALREADY, "connection already in progress") \ + XX(EBADF, "bad file descriptor") \ + XX(EBUSY, "resource busy or locked") \ + XX(ECANCELED, "operation canceled") \ + XX(ECHARSET, "invalid Unicode character") \ + XX(ECONNABORTED, "software caused connection abort") \ + XX(ECONNREFUSED, "connection refused") \ + XX(ECONNRESET, "connection reset by peer") \ + XX(EDESTADDRREQ, "destination address required") \ + XX(EEXIST, "file already exists") \ + XX(EFAULT, "bad address in system call argument") \ + XX(EFBIG, "file too large") \ + XX(EHOSTUNREACH, "host is unreachable") \ + XX(EINTR, "interrupted system call") \ + XX(EINVAL, "invalid argument") \ + XX(EIO, "i/o error") \ + XX(EISCONN, "socket is already connected") \ + XX(EISDIR, "illegal operation on a directory") \ + XX(ELOOP, "too many symbolic links encountered") \ + XX(EMFILE, "too many open files") \ + XX(EMSGSIZE, "message too long") \ + XX(ENAMETOOLONG, "name too long") \ + XX(ENETDOWN, "network is down") \ + XX(ENETUNREACH, "network is unreachable") \ + XX(ENFILE, "file table overflow") \ + XX(ENOBUFS, "no buffer space available") \ + XX(ENODEV, "no such device") \ + XX(ENOENT, "no such file or directory") \ + XX(ENOMEM, "not enough memory") \ + XX(ENONET, "machine is not on the network") \ + XX(ENOPROTOOPT, "protocol not available") \ + XX(ENOSPC, "no space left on device") \ + XX(ENOSYS, "function not implemented") \ + XX(ENOTCONN, "socket is not connected") \ + XX(ENOTDIR, "not a directory") \ + XX(ENOTEMPTY, "directory not empty") \ + XX(ENOTSOCK, "socket operation on non-socket") \ + XX(ENOTSUP, "operation not supported on socket") \ + XX(EPERM, "operation not permitted") \ + XX(EPIPE, "broken pipe") \ + XX(EPROTO, "protocol error") \ + XX(EPROTONOSUPPORT, "protocol not supported") \ + XX(EPROTOTYPE, "protocol wrong type for socket") \ + XX(ERANGE, "result too large") \ + XX(EROFS, "read-only file system") \ + XX(ESHUTDOWN, "cannot send after transport endpoint shutdown") \ + XX(ESPIPE, "invalid seek") \ + XX(ESRCH, "no such process") \ + XX(ETIMEDOUT, "connection timed out") \ + XX(ETXTBSY, "text file is busy") \ + XX(EXDEV, "cross-device link not permitted") \ + XX(UNKNOWN, "unknown error") \ + XX(EOF, "end of file") \ + XX(ENXIO, "no such device or address") \ + XX(EMLINK, "too many links") \ + XX(EHOSTDOWN, "host is down") \ + XX(EREMOTEIO, "remote I/O error") \ + XX(ENOTTY, "inappropriate ioctl for device") \ + XX(EFTYPE, "inappropriate file type or format") \ + XX(EILSEQ, "illegal byte sequence") \ + +#define UV_HANDLE_TYPE_MAP(XX) \ + XX(ASYNC, async) \ + XX(CHECK, check) \ + XX(FS_EVENT, fs_event) \ + XX(FS_POLL, fs_poll) \ + XX(HANDLE, handle) \ + XX(IDLE, idle) \ + XX(NAMED_PIPE, pipe) \ + XX(POLL, poll) \ + XX(PREPARE, prepare) \ + XX(PROCESS, process) \ + XX(STREAM, stream) \ + XX(TCP, tcp) \ + XX(TIMER, timer) \ + XX(TTY, tty) \ + XX(UDP, udp) \ + XX(SIGNAL, signal) \ + +#define UV_REQ_TYPE_MAP(XX) \ + XX(REQ, req) \ + XX(CONNECT, connect) \ + XX(WRITE, write) \ + XX(SHUTDOWN, shutdown) \ + XX(UDP_SEND, udp_send) \ + XX(FS, fs) \ + XX(WORK, work) \ + XX(GETADDRINFO, getaddrinfo) \ + XX(GETNAMEINFO, getnameinfo) \ + XX(RANDOM, random) \ + +typedef enum { +#define XX(code, _) UV_ ## code = UV__ ## code, + UV_ERRNO_MAP(XX) +#undef XX + UV_ERRNO_MAX = UV__EOF - 1 +} uv_errno_t; + +typedef enum { + UV_UNKNOWN_HANDLE = 0, +#define XX(uc, lc) UV_##uc, + UV_HANDLE_TYPE_MAP(XX) +#undef XX + UV_FILE, + UV_HANDLE_TYPE_MAX +} uv_handle_type; + +typedef enum { + UV_UNKNOWN_REQ = 0, +#define XX(uc, lc) UV_##uc, + UV_REQ_TYPE_MAP(XX) +#undef XX + UV_REQ_TYPE_PRIVATE + UV_REQ_TYPE_MAX +} uv_req_type; + + +/* Handle types. */ +typedef struct uv_loop_s uv_loop_t; +typedef struct uv_handle_s uv_handle_t; +typedef struct uv_dir_s uv_dir_t; +typedef struct uv_stream_s uv_stream_t; +typedef struct uv_tcp_s uv_tcp_t; +typedef struct uv_udp_s uv_udp_t; +typedef struct uv_pipe_s uv_pipe_t; +typedef struct uv_tty_s uv_tty_t; +typedef struct uv_poll_s uv_poll_t; +typedef struct uv_timer_s uv_timer_t; +typedef struct uv_prepare_s uv_prepare_t; +typedef struct uv_check_s uv_check_t; +typedef struct uv_idle_s uv_idle_t; +typedef struct uv_async_s uv_async_t; +typedef struct uv_process_s uv_process_t; +typedef struct uv_fs_event_s uv_fs_event_t; +typedef struct uv_fs_poll_s uv_fs_poll_t; +typedef struct uv_signal_s uv_signal_t; + +/* Request types. */ +typedef struct uv_req_s uv_req_t; +typedef struct uv_getaddrinfo_s uv_getaddrinfo_t; +typedef struct uv_getnameinfo_s uv_getnameinfo_t; +typedef struct uv_shutdown_s uv_shutdown_t; +typedef struct uv_write_s uv_write_t; +typedef struct uv_connect_s uv_connect_t; +typedef struct uv_udp_send_s uv_udp_send_t; +typedef struct uv_fs_s uv_fs_t; +typedef struct uv_work_s uv_work_t; +typedef struct uv_random_s uv_random_t; + +/* None of the above. */ +typedef struct uv_env_item_s uv_env_item_t; +typedef struct uv_cpu_info_s uv_cpu_info_t; +typedef struct uv_interface_address_s uv_interface_address_t; +typedef struct uv_dirent_s uv_dirent_t; +typedef struct uv_passwd_s uv_passwd_t; +typedef struct uv_utsname_s uv_utsname_t; +typedef struct uv_statfs_s uv_statfs_t; + +typedef enum { + UV_LOOP_BLOCK_SIGNAL = 0, + UV_METRICS_IDLE_TIME +} uv_loop_option; + +typedef enum { + UV_RUN_DEFAULT = 0, + UV_RUN_ONCE, + UV_RUN_NOWAIT +} uv_run_mode; + + +UV_EXTERN unsigned int uv_version(void); +UV_EXTERN const char* uv_version_string(void); + +typedef void* (*uv_malloc_func)(size_t size); +typedef void* (*uv_realloc_func)(void* ptr, size_t size); +typedef void* (*uv_calloc_func)(size_t count, size_t size); +typedef void (*uv_free_func)(void* ptr); + +UV_EXTERN void uv_library_shutdown(void); + +UV_EXTERN int uv_replace_allocator(uv_malloc_func malloc_func, + uv_realloc_func realloc_func, + uv_calloc_func calloc_func, + uv_free_func free_func); + +UV_EXTERN uv_loop_t* uv_default_loop(void); +UV_EXTERN int uv_loop_init(uv_loop_t* loop); +UV_EXTERN int uv_loop_close(uv_loop_t* loop); +/* + * NOTE: + * This function is DEPRECATED (to be removed after 0.12), users should + * allocate the loop manually and use uv_loop_init instead. + */ +UV_EXTERN uv_loop_t* uv_loop_new(void); +/* + * NOTE: + * This function is DEPRECATED (to be removed after 0.12). Users should use + * uv_loop_close and free the memory manually instead. + */ +UV_EXTERN void uv_loop_delete(uv_loop_t*); +UV_EXTERN size_t uv_loop_size(void); +UV_EXTERN int uv_loop_alive(const uv_loop_t* loop); +UV_EXTERN int uv_loop_configure(uv_loop_t* loop, uv_loop_option option, ...); +UV_EXTERN int uv_loop_fork(uv_loop_t* loop); + +UV_EXTERN int uv_run(uv_loop_t*, uv_run_mode mode); +UV_EXTERN void uv_stop(uv_loop_t*); + +UV_EXTERN void uv_ref(uv_handle_t*); +UV_EXTERN void uv_unref(uv_handle_t*); +UV_EXTERN int uv_has_ref(const uv_handle_t*); + +UV_EXTERN void uv_update_time(uv_loop_t*); +UV_EXTERN uint64_t uv_now(const uv_loop_t*); + +UV_EXTERN int uv_backend_fd(const uv_loop_t*); +UV_EXTERN int uv_backend_timeout(const uv_loop_t*); + +typedef void (*uv_alloc_cb)(uv_handle_t* handle, + size_t suggested_size, + uv_buf_t* buf); +typedef void (*uv_read_cb)(uv_stream_t* stream, + ssize_t nread, + const uv_buf_t* buf); +typedef void (*uv_write_cb)(uv_write_t* req, int status); +typedef void (*uv_connect_cb)(uv_connect_t* req, int status); +typedef void (*uv_shutdown_cb)(uv_shutdown_t* req, int status); +typedef void (*uv_connection_cb)(uv_stream_t* server, int status); +typedef void (*uv_close_cb)(uv_handle_t* handle); +typedef void (*uv_poll_cb)(uv_poll_t* handle, int status, int events); +typedef void (*uv_timer_cb)(uv_timer_t* handle); +typedef void (*uv_async_cb)(uv_async_t* handle); +typedef void (*uv_prepare_cb)(uv_prepare_t* handle); +typedef void (*uv_check_cb)(uv_check_t* handle); +typedef void (*uv_idle_cb)(uv_idle_t* handle); +typedef void (*uv_exit_cb)(uv_process_t*, int64_t exit_status, int term_signal); +typedef void (*uv_walk_cb)(uv_handle_t* handle, void* arg); +typedef void (*uv_fs_cb)(uv_fs_t* req); +typedef void (*uv_work_cb)(uv_work_t* req); +typedef void (*uv_after_work_cb)(uv_work_t* req, int status); +typedef void (*uv_getaddrinfo_cb)(uv_getaddrinfo_t* req, + int status, + struct addrinfo* res); +typedef void (*uv_getnameinfo_cb)(uv_getnameinfo_t* req, + int status, + const char* hostname, + const char* service); +typedef void (*uv_random_cb)(uv_random_t* req, + int status, + void* buf, + size_t buflen); + +typedef struct { + long tv_sec; + long tv_nsec; +} uv_timespec_t; + + +typedef struct { + uint64_t st_dev; + uint64_t st_mode; + uint64_t st_nlink; + uint64_t st_uid; + uint64_t st_gid; + uint64_t st_rdev; + uint64_t st_ino; + uint64_t st_size; + uint64_t st_blksize; + uint64_t st_blocks; + uint64_t st_flags; + uint64_t st_gen; + uv_timespec_t st_atim; + uv_timespec_t st_mtim; + uv_timespec_t st_ctim; + uv_timespec_t st_birthtim; +} uv_stat_t; + + +typedef void (*uv_fs_event_cb)(uv_fs_event_t* handle, + const char* filename, + int events, + int status); + +typedef void (*uv_fs_poll_cb)(uv_fs_poll_t* handle, + int status, + const uv_stat_t* prev, + const uv_stat_t* curr); + +typedef void (*uv_signal_cb)(uv_signal_t* handle, int signum); + + +typedef enum { + UV_LEAVE_GROUP = 0, + UV_JOIN_GROUP +} uv_membership; + + +UV_EXTERN int uv_translate_sys_error(int sys_errno); + +UV_EXTERN const char* uv_strerror(int err); +UV_EXTERN char* uv_strerror_r(int err, char* buf, size_t buflen); + +UV_EXTERN const char* uv_err_name(int err); +UV_EXTERN char* uv_err_name_r(int err, char* buf, size_t buflen); + + +#define UV_REQ_FIELDS \ + /* public */ \ + void* data; \ + /* read-only */ \ + uv_req_type type; \ + /* private */ \ + void* reserved[6]; \ + UV_REQ_PRIVATE_FIELDS \ + +/* Abstract base class of all requests. */ +struct uv_req_s { + UV_REQ_FIELDS +}; + + +/* Platform-specific request types. */ +UV_PRIVATE_REQ_TYPES + + +UV_EXTERN int uv_shutdown(uv_shutdown_t* req, + uv_stream_t* handle, + uv_shutdown_cb cb); + +struct uv_shutdown_s { + UV_REQ_FIELDS + uv_stream_t* handle; + uv_shutdown_cb cb; + UV_SHUTDOWN_PRIVATE_FIELDS +}; + + +#define UV_HANDLE_FIELDS \ + /* public */ \ + void* data; \ + /* read-only */ \ + uv_loop_t* loop; \ + uv_handle_type type; \ + /* private */ \ + uv_close_cb close_cb; \ + void* handle_queue[2]; \ + union { \ + int fd; \ + void* reserved[4]; \ + } u; \ + UV_HANDLE_PRIVATE_FIELDS \ + +/* The abstract base class of all handles. */ +struct uv_handle_s { + UV_HANDLE_FIELDS +}; + +UV_EXTERN size_t uv_handle_size(uv_handle_type type); +UV_EXTERN uv_handle_type uv_handle_get_type(const uv_handle_t* handle); +UV_EXTERN const char* uv_handle_type_name(uv_handle_type type); +UV_EXTERN void* uv_handle_get_data(const uv_handle_t* handle); +UV_EXTERN uv_loop_t* uv_handle_get_loop(const uv_handle_t* handle); +UV_EXTERN void uv_handle_set_data(uv_handle_t* handle, void* data); + +UV_EXTERN size_t uv_req_size(uv_req_type type); +UV_EXTERN void* uv_req_get_data(const uv_req_t* req); +UV_EXTERN void uv_req_set_data(uv_req_t* req, void* data); +UV_EXTERN uv_req_type uv_req_get_type(const uv_req_t* req); +UV_EXTERN const char* uv_req_type_name(uv_req_type type); + +UV_EXTERN int uv_is_active(const uv_handle_t* handle); + +UV_EXTERN void uv_walk(uv_loop_t* loop, uv_walk_cb walk_cb, void* arg); + +/* Helpers for ad hoc debugging, no API/ABI stability guaranteed. */ +UV_EXTERN void uv_print_all_handles(uv_loop_t* loop, FILE* stream); +UV_EXTERN void uv_print_active_handles(uv_loop_t* loop, FILE* stream); + +UV_EXTERN void uv_close(uv_handle_t* handle, uv_close_cb close_cb); + +UV_EXTERN int uv_send_buffer_size(uv_handle_t* handle, int* value); +UV_EXTERN int uv_recv_buffer_size(uv_handle_t* handle, int* value); + +UV_EXTERN int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd); + +UV_EXTERN uv_buf_t uv_buf_init(char* base, unsigned int len); + + +#define UV_STREAM_FIELDS \ + /* number of bytes queued for writing */ \ + size_t write_queue_size; \ + uv_alloc_cb alloc_cb; \ + uv_read_cb read_cb; \ + /* private */ \ + UV_STREAM_PRIVATE_FIELDS + +/* + * uv_stream_t is a subclass of uv_handle_t. + * + * uv_stream is an abstract class. + * + * uv_stream_t is the parent class of uv_tcp_t, uv_pipe_t and uv_tty_t. + */ +struct uv_stream_s { + UV_HANDLE_FIELDS + UV_STREAM_FIELDS +}; + +UV_EXTERN size_t uv_stream_get_write_queue_size(const uv_stream_t* stream); + +UV_EXTERN int uv_listen(uv_stream_t* stream, int backlog, uv_connection_cb cb); +UV_EXTERN int uv_accept(uv_stream_t* server, uv_stream_t* client); + +UV_EXTERN int uv_read_start(uv_stream_t*, + uv_alloc_cb alloc_cb, + uv_read_cb read_cb); +UV_EXTERN int uv_read_stop(uv_stream_t*); + +UV_EXTERN int uv_write(uv_write_t* req, + uv_stream_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_write_cb cb); +UV_EXTERN int uv_write2(uv_write_t* req, + uv_stream_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + uv_stream_t* send_handle, + uv_write_cb cb); +UV_EXTERN int uv_try_write(uv_stream_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs); + +/* uv_write_t is a subclass of uv_req_t. */ +struct uv_write_s { + UV_REQ_FIELDS + uv_write_cb cb; + uv_stream_t* send_handle; /* TODO: make private and unix-only in v2.x. */ + uv_stream_t* handle; + UV_WRITE_PRIVATE_FIELDS +}; + + +UV_EXTERN int uv_is_readable(const uv_stream_t* handle); +UV_EXTERN int uv_is_writable(const uv_stream_t* handle); + +UV_EXTERN int uv_stream_set_blocking(uv_stream_t* handle, int blocking); + +UV_EXTERN int uv_is_closing(const uv_handle_t* handle); + + +/* + * uv_tcp_t is a subclass of uv_stream_t. + * + * Represents a TCP stream or TCP server. + */ +struct uv_tcp_s { + UV_HANDLE_FIELDS + UV_STREAM_FIELDS + UV_TCP_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_tcp_init(uv_loop_t*, uv_tcp_t* handle); +UV_EXTERN int uv_tcp_init_ex(uv_loop_t*, uv_tcp_t* handle, unsigned int flags); +UV_EXTERN int uv_tcp_open(uv_tcp_t* handle, uv_os_sock_t sock); +UV_EXTERN int uv_tcp_nodelay(uv_tcp_t* handle, int enable); +UV_EXTERN int uv_tcp_keepalive(uv_tcp_t* handle, + int enable, + unsigned int delay); +UV_EXTERN int uv_tcp_simultaneous_accepts(uv_tcp_t* handle, int enable); + +enum uv_tcp_flags { + /* Used with uv_tcp_bind, when an IPv6 address is used. */ + UV_TCP_IPV6ONLY = 1 +}; + +UV_EXTERN int uv_tcp_bind(uv_tcp_t* handle, + const struct sockaddr* addr, + unsigned int flags); +UV_EXTERN int uv_tcp_getsockname(const uv_tcp_t* handle, + struct sockaddr* name, + int* namelen); +UV_EXTERN int uv_tcp_getpeername(const uv_tcp_t* handle, + struct sockaddr* name, + int* namelen); +UV_EXTERN int uv_tcp_close_reset(uv_tcp_t* handle, uv_close_cb close_cb); +UV_EXTERN int uv_tcp_connect(uv_connect_t* req, + uv_tcp_t* handle, + const struct sockaddr* addr, + uv_connect_cb cb); + +/* uv_connect_t is a subclass of uv_req_t. */ +struct uv_connect_s { + UV_REQ_FIELDS + uv_connect_cb cb; + uv_stream_t* handle; + UV_CONNECT_PRIVATE_FIELDS +}; + + +/* + * UDP support. + */ + +enum uv_udp_flags { + /* Disables dual stack mode. */ + UV_UDP_IPV6ONLY = 1, + /* + * Indicates message was truncated because read buffer was too small. The + * remainder was discarded by the OS. Used in uv_udp_recv_cb. + */ + UV_UDP_PARTIAL = 2, + /* + * Indicates if SO_REUSEADDR will be set when binding the handle. + * This sets the SO_REUSEPORT socket flag on the BSDs and OS X. On other + * Unix platforms, it sets the SO_REUSEADDR flag. What that means is that + * multiple threads or processes can bind to the same address without error + * (provided they all set the flag) but only the last one to bind will receive + * any traffic, in effect "stealing" the port from the previous listener. + */ + UV_UDP_REUSEADDR = 4, + /* + * Indicates that the message was received by recvmmsg, so the buffer provided + * must not be freed by the recv_cb callback. + */ + UV_UDP_MMSG_CHUNK = 8, + /* + * Indicates that the buffer provided has been fully utilized by recvmmsg and + * that it should now be freed by the recv_cb callback. When this flag is set + * in uv_udp_recv_cb, nread will always be 0 and addr will always be NULL. + */ + UV_UDP_MMSG_FREE = 16, + + /* + * Indicates that recvmmsg should be used, if available. + */ + UV_UDP_RECVMMSG = 256 +}; + +typedef void (*uv_udp_send_cb)(uv_udp_send_t* req, int status); +typedef void (*uv_udp_recv_cb)(uv_udp_t* handle, + ssize_t nread, + const uv_buf_t* buf, + const struct sockaddr* addr, + unsigned flags); + +/* uv_udp_t is a subclass of uv_handle_t. */ +struct uv_udp_s { + UV_HANDLE_FIELDS + /* read-only */ + /* + * Number of bytes queued for sending. This field strictly shows how much + * information is currently queued. + */ + size_t send_queue_size; + /* + * Number of send requests currently in the queue awaiting to be processed. + */ + size_t send_queue_count; + UV_UDP_PRIVATE_FIELDS +}; + +/* uv_udp_send_t is a subclass of uv_req_t. */ +struct uv_udp_send_s { + UV_REQ_FIELDS + uv_udp_t* handle; + uv_udp_send_cb cb; + UV_UDP_SEND_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_udp_init(uv_loop_t*, uv_udp_t* handle); +UV_EXTERN int uv_udp_init_ex(uv_loop_t*, uv_udp_t* handle, unsigned int flags); +UV_EXTERN int uv_udp_open(uv_udp_t* handle, uv_os_sock_t sock); +UV_EXTERN int uv_udp_bind(uv_udp_t* handle, + const struct sockaddr* addr, + unsigned int flags); +UV_EXTERN int uv_udp_connect(uv_udp_t* handle, const struct sockaddr* addr); + +UV_EXTERN int uv_udp_getpeername(const uv_udp_t* handle, + struct sockaddr* name, + int* namelen); +UV_EXTERN int uv_udp_getsockname(const uv_udp_t* handle, + struct sockaddr* name, + int* namelen); +UV_EXTERN int uv_udp_set_membership(uv_udp_t* handle, + const char* multicast_addr, + const char* interface_addr, + uv_membership membership); +UV_EXTERN int uv_udp_set_source_membership(uv_udp_t* handle, + const char* multicast_addr, + const char* interface_addr, + const char* source_addr, + uv_membership membership); +UV_EXTERN int uv_udp_set_multicast_loop(uv_udp_t* handle, int on); +UV_EXTERN int uv_udp_set_multicast_ttl(uv_udp_t* handle, int ttl); +UV_EXTERN int uv_udp_set_multicast_interface(uv_udp_t* handle, + const char* interface_addr); +UV_EXTERN int uv_udp_set_broadcast(uv_udp_t* handle, int on); +UV_EXTERN int uv_udp_set_ttl(uv_udp_t* handle, int ttl); +UV_EXTERN int uv_udp_send(uv_udp_send_t* req, + uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr, + uv_udp_send_cb send_cb); +UV_EXTERN int uv_udp_try_send(uv_udp_t* handle, + const uv_buf_t bufs[], + unsigned int nbufs, + const struct sockaddr* addr); +UV_EXTERN int uv_udp_recv_start(uv_udp_t* handle, + uv_alloc_cb alloc_cb, + uv_udp_recv_cb recv_cb); +UV_EXTERN int uv_udp_using_recvmmsg(const uv_udp_t* handle); +UV_EXTERN int uv_udp_recv_stop(uv_udp_t* handle); +UV_EXTERN size_t uv_udp_get_send_queue_size(const uv_udp_t* handle); +UV_EXTERN size_t uv_udp_get_send_queue_count(const uv_udp_t* handle); + + +/* + * uv_tty_t is a subclass of uv_stream_t. + * + * Representing a stream for the console. + */ +struct uv_tty_s { + UV_HANDLE_FIELDS + UV_STREAM_FIELDS + UV_TTY_PRIVATE_FIELDS +}; + +typedef enum { + /* Initial/normal terminal mode */ + UV_TTY_MODE_NORMAL, + /* Raw input mode (On Windows, ENABLE_WINDOW_INPUT is also enabled) */ + UV_TTY_MODE_RAW, + /* Binary-safe I/O mode for IPC (Unix-only) */ + UV_TTY_MODE_IO +} uv_tty_mode_t; + +typedef enum { + /* + * The console supports handling of virtual terminal sequences + * (Windows10 new console, ConEmu) + */ + UV_TTY_SUPPORTED, + /* The console cannot process the virtual terminal sequence. (Legacy + * console) + */ + UV_TTY_UNSUPPORTED +} uv_tty_vtermstate_t; + + +UV_EXTERN int uv_tty_init(uv_loop_t*, uv_tty_t*, uv_file fd, int readable); +UV_EXTERN int uv_tty_set_mode(uv_tty_t*, uv_tty_mode_t mode); +UV_EXTERN int uv_tty_reset_mode(void); +UV_EXTERN int uv_tty_get_winsize(uv_tty_t*, int* width, int* height); +UV_EXTERN void uv_tty_set_vterm_state(uv_tty_vtermstate_t state); +UV_EXTERN int uv_tty_get_vterm_state(uv_tty_vtermstate_t* state); + +#ifdef __cplusplus +extern "C++" { + +inline int uv_tty_set_mode(uv_tty_t* handle, int mode) { + return uv_tty_set_mode(handle, static_cast(mode)); +} + +} +#endif + +UV_EXTERN uv_handle_type uv_guess_handle(uv_file file); + +/* + * uv_pipe_t is a subclass of uv_stream_t. + * + * Representing a pipe stream or pipe server. On Windows this is a Named + * Pipe. On Unix this is a Unix domain socket. + */ +struct uv_pipe_s { + UV_HANDLE_FIELDS + UV_STREAM_FIELDS + int ipc; /* non-zero if this pipe is used for passing handles */ + UV_PIPE_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_pipe_init(uv_loop_t*, uv_pipe_t* handle, int ipc); +UV_EXTERN int uv_pipe_open(uv_pipe_t*, uv_file file); +UV_EXTERN int uv_pipe_bind(uv_pipe_t* handle, const char* name); +UV_EXTERN void uv_pipe_connect(uv_connect_t* req, + uv_pipe_t* handle, + const char* name, + uv_connect_cb cb); +UV_EXTERN int uv_pipe_getsockname(const uv_pipe_t* handle, + char* buffer, + size_t* size); +UV_EXTERN int uv_pipe_getpeername(const uv_pipe_t* handle, + char* buffer, + size_t* size); +UV_EXTERN void uv_pipe_pending_instances(uv_pipe_t* handle, int count); +UV_EXTERN int uv_pipe_pending_count(uv_pipe_t* handle); +UV_EXTERN uv_handle_type uv_pipe_pending_type(uv_pipe_t* handle); +UV_EXTERN int uv_pipe_chmod(uv_pipe_t* handle, int flags); + + +struct uv_poll_s { + UV_HANDLE_FIELDS + uv_poll_cb poll_cb; + UV_POLL_PRIVATE_FIELDS +}; + +enum uv_poll_event { + UV_READABLE = 1, + UV_WRITABLE = 2, + UV_DISCONNECT = 4, + UV_PRIORITIZED = 8 +}; + +UV_EXTERN int uv_poll_init(uv_loop_t* loop, uv_poll_t* handle, int fd); +UV_EXTERN int uv_poll_init_socket(uv_loop_t* loop, + uv_poll_t* handle, + uv_os_sock_t socket); +UV_EXTERN int uv_poll_start(uv_poll_t* handle, int events, uv_poll_cb cb); +UV_EXTERN int uv_poll_stop(uv_poll_t* handle); + + +struct uv_prepare_s { + UV_HANDLE_FIELDS + UV_PREPARE_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_prepare_init(uv_loop_t*, uv_prepare_t* prepare); +UV_EXTERN int uv_prepare_start(uv_prepare_t* prepare, uv_prepare_cb cb); +UV_EXTERN int uv_prepare_stop(uv_prepare_t* prepare); + + +struct uv_check_s { + UV_HANDLE_FIELDS + UV_CHECK_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_check_init(uv_loop_t*, uv_check_t* check); +UV_EXTERN int uv_check_start(uv_check_t* check, uv_check_cb cb); +UV_EXTERN int uv_check_stop(uv_check_t* check); + + +struct uv_idle_s { + UV_HANDLE_FIELDS + UV_IDLE_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_idle_init(uv_loop_t*, uv_idle_t* idle); +UV_EXTERN int uv_idle_start(uv_idle_t* idle, uv_idle_cb cb); +UV_EXTERN int uv_idle_stop(uv_idle_t* idle); + + +struct uv_async_s { + UV_HANDLE_FIELDS + UV_ASYNC_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_async_init(uv_loop_t*, + uv_async_t* async, + uv_async_cb async_cb); +UV_EXTERN int uv_async_send(uv_async_t* async); + + +/* + * uv_timer_t is a subclass of uv_handle_t. + * + * Used to get woken up at a specified time in the future. + */ +struct uv_timer_s { + UV_HANDLE_FIELDS + UV_TIMER_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_timer_init(uv_loop_t*, uv_timer_t* handle); +UV_EXTERN int uv_timer_start(uv_timer_t* handle, + uv_timer_cb cb, + uint64_t timeout, + uint64_t repeat); +UV_EXTERN int uv_timer_stop(uv_timer_t* handle); +UV_EXTERN int uv_timer_again(uv_timer_t* handle); +UV_EXTERN void uv_timer_set_repeat(uv_timer_t* handle, uint64_t repeat); +UV_EXTERN uint64_t uv_timer_get_repeat(const uv_timer_t* handle); +UV_EXTERN uint64_t uv_timer_get_due_in(const uv_timer_t* handle); + + +/* + * uv_getaddrinfo_t is a subclass of uv_req_t. + * + * Request object for uv_getaddrinfo. + */ +struct uv_getaddrinfo_s { + UV_REQ_FIELDS + /* read-only */ + uv_loop_t* loop; + /* struct addrinfo* addrinfo is marked as private, but it really isn't. */ + UV_GETADDRINFO_PRIVATE_FIELDS +}; + + +UV_EXTERN int uv_getaddrinfo(uv_loop_t* loop, + uv_getaddrinfo_t* req, + uv_getaddrinfo_cb getaddrinfo_cb, + const char* node, + const char* service, + const struct addrinfo* hints); +UV_EXTERN void uv_freeaddrinfo(struct addrinfo* ai); + + +/* +* uv_getnameinfo_t is a subclass of uv_req_t. +* +* Request object for uv_getnameinfo. +*/ +struct uv_getnameinfo_s { + UV_REQ_FIELDS + /* read-only */ + uv_loop_t* loop; + /* host and service are marked as private, but they really aren't. */ + UV_GETNAMEINFO_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_getnameinfo(uv_loop_t* loop, + uv_getnameinfo_t* req, + uv_getnameinfo_cb getnameinfo_cb, + const struct sockaddr* addr, + int flags); + + +/* uv_spawn() options. */ +typedef enum { + UV_IGNORE = 0x00, + UV_CREATE_PIPE = 0x01, + UV_INHERIT_FD = 0x02, + UV_INHERIT_STREAM = 0x04, + + /* + * When UV_CREATE_PIPE is specified, UV_READABLE_PIPE and UV_WRITABLE_PIPE + * determine the direction of flow, from the child process' perspective. Both + * flags may be specified to create a duplex data stream. + */ + UV_READABLE_PIPE = 0x10, + UV_WRITABLE_PIPE = 0x20, + + /* + * Open the child pipe handle in overlapped mode on Windows. + * On Unix it is silently ignored. + */ + UV_OVERLAPPED_PIPE = 0x40 +} uv_stdio_flags; + +typedef struct uv_stdio_container_s { + uv_stdio_flags flags; + + union { + uv_stream_t* stream; + int fd; + } data; +} uv_stdio_container_t; + +typedef struct uv_process_options_s { + uv_exit_cb exit_cb; /* Called after the process exits. */ + const char* file; /* Path to program to execute. */ + /* + * Command line arguments. args[0] should be the path to the program. On + * Windows this uses CreateProcess which concatenates the arguments into a + * string this can cause some strange errors. See the note at + * windows_verbatim_arguments. + */ + char** args; + /* + * This will be set as the environ variable in the subprocess. If this is + * NULL then the parents environ will be used. + */ + char** env; + /* + * If non-null this represents a directory the subprocess should execute + * in. Stands for current working directory. + */ + const char* cwd; + /* + * Various flags that control how uv_spawn() behaves. See the definition of + * `enum uv_process_flags` below. + */ + unsigned int flags; + /* + * The `stdio` field points to an array of uv_stdio_container_t structs that + * describe the file descriptors that will be made available to the child + * process. The convention is that stdio[0] points to stdin, fd 1 is used for + * stdout, and fd 2 is stderr. + * + * Note that on windows file descriptors greater than 2 are available to the + * child process only if the child processes uses the MSVCRT runtime. + */ + int stdio_count; + uv_stdio_container_t* stdio; + /* + * Libuv can change the child process' user/group id. This happens only when + * the appropriate bits are set in the flags fields. This is not supported on + * windows; uv_spawn() will fail and set the error to UV_ENOTSUP. + */ + uv_uid_t uid; + uv_gid_t gid; +} uv_process_options_t; + +/* + * These are the flags that can be used for the uv_process_options.flags field. + */ +enum uv_process_flags { + /* + * Set the child process' user id. The user id is supplied in the `uid` field + * of the options struct. This does not work on windows; setting this flag + * will cause uv_spawn() to fail. + */ + UV_PROCESS_SETUID = (1 << 0), + /* + * Set the child process' group id. The user id is supplied in the `gid` + * field of the options struct. This does not work on windows; setting this + * flag will cause uv_spawn() to fail. + */ + UV_PROCESS_SETGID = (1 << 1), + /* + * Do not wrap any arguments in quotes, or perform any other escaping, when + * converting the argument list into a command line string. This option is + * only meaningful on Windows systems. On Unix it is silently ignored. + */ + UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS = (1 << 2), + /* + * Spawn the child process in a detached state - this will make it a process + * group leader, and will effectively enable the child to keep running after + * the parent exits. Note that the child process will still keep the + * parent's event loop alive unless the parent process calls uv_unref() on + * the child's process handle. + */ + UV_PROCESS_DETACHED = (1 << 3), + /* + * Hide the subprocess window that would normally be created. This option is + * only meaningful on Windows systems. On Unix it is silently ignored. + */ + UV_PROCESS_WINDOWS_HIDE = (1 << 4), + /* + * Hide the subprocess console window that would normally be created. This + * option is only meaningful on Windows systems. On Unix it is silently + * ignored. + */ + UV_PROCESS_WINDOWS_HIDE_CONSOLE = (1 << 5), + /* + * Hide the subprocess GUI window that would normally be created. This + * option is only meaningful on Windows systems. On Unix it is silently + * ignored. + */ + UV_PROCESS_WINDOWS_HIDE_GUI = (1 << 6) +}; + +/* + * uv_process_t is a subclass of uv_handle_t. + */ +struct uv_process_s { + UV_HANDLE_FIELDS + uv_exit_cb exit_cb; + int pid; + UV_PROCESS_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_spawn(uv_loop_t* loop, + uv_process_t* handle, + const uv_process_options_t* options); +UV_EXTERN int uv_process_kill(uv_process_t*, int signum); +UV_EXTERN int uv_kill(int pid, int signum); +UV_EXTERN uv_pid_t uv_process_get_pid(const uv_process_t*); + + +/* + * uv_work_t is a subclass of uv_req_t. + */ +struct uv_work_s { + UV_REQ_FIELDS + uv_loop_t* loop; + uv_work_cb work_cb; + uv_after_work_cb after_work_cb; + UV_WORK_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_queue_work(uv_loop_t* loop, + uv_work_t* req, + uv_work_cb work_cb, + uv_after_work_cb after_work_cb); + +UV_EXTERN int uv_cancel(uv_req_t* req); + + +struct uv_cpu_times_s { + uint64_t user; /* milliseconds */ + uint64_t nice; /* milliseconds */ + uint64_t sys; /* milliseconds */ + uint64_t idle; /* milliseconds */ + uint64_t irq; /* milliseconds */ +}; + +struct uv_cpu_info_s { + char* model; + int speed; + struct uv_cpu_times_s cpu_times; +}; + +struct uv_interface_address_s { + char* name; + char phys_addr[6]; + int is_internal; + union { + struct sockaddr_in address4; + struct sockaddr_in6 address6; + } address; + union { + struct sockaddr_in netmask4; + struct sockaddr_in6 netmask6; + } netmask; +}; + +struct uv_passwd_s { + char* username; + long uid; + long gid; + char* shell; + char* homedir; +}; + +struct uv_utsname_s { + char sysname[256]; + char release[256]; + char version[256]; + char machine[256]; + /* This struct does not contain the nodename and domainname fields present in + the utsname type. domainname is a GNU extension. Both fields are referred + to as meaningless in the docs. */ +}; + +struct uv_statfs_s { + uint64_t f_type; + uint64_t f_bsize; + uint64_t f_blocks; + uint64_t f_bfree; + uint64_t f_bavail; + uint64_t f_files; + uint64_t f_ffree; + uint64_t f_spare[4]; +}; + +typedef enum { + UV_DIRENT_UNKNOWN, + UV_DIRENT_FILE, + UV_DIRENT_DIR, + UV_DIRENT_LINK, + UV_DIRENT_FIFO, + UV_DIRENT_SOCKET, + UV_DIRENT_CHAR, + UV_DIRENT_BLOCK +} uv_dirent_type_t; + +struct uv_dirent_s { + const char* name; + uv_dirent_type_t type; +}; + +UV_EXTERN char** uv_setup_args(int argc, char** argv); +UV_EXTERN int uv_get_process_title(char* buffer, size_t size); +UV_EXTERN int uv_set_process_title(const char* title); +UV_EXTERN int uv_resident_set_memory(size_t* rss); +UV_EXTERN int uv_uptime(double* uptime); +UV_EXTERN uv_os_fd_t uv_get_osfhandle(int fd); +UV_EXTERN int uv_open_osfhandle(uv_os_fd_t os_fd); + +typedef struct { + long tv_sec; + long tv_usec; +} uv_timeval_t; + +typedef struct { + int64_t tv_sec; + int32_t tv_usec; +} uv_timeval64_t; + +typedef struct { + uv_timeval_t ru_utime; /* user CPU time used */ + uv_timeval_t ru_stime; /* system CPU time used */ + uint64_t ru_maxrss; /* maximum resident set size */ + uint64_t ru_ixrss; /* integral shared memory size */ + uint64_t ru_idrss; /* integral unshared data size */ + uint64_t ru_isrss; /* integral unshared stack size */ + uint64_t ru_minflt; /* page reclaims (soft page faults) */ + uint64_t ru_majflt; /* page faults (hard page faults) */ + uint64_t ru_nswap; /* swaps */ + uint64_t ru_inblock; /* block input operations */ + uint64_t ru_oublock; /* block output operations */ + uint64_t ru_msgsnd; /* IPC messages sent */ + uint64_t ru_msgrcv; /* IPC messages received */ + uint64_t ru_nsignals; /* signals received */ + uint64_t ru_nvcsw; /* voluntary context switches */ + uint64_t ru_nivcsw; /* involuntary context switches */ +} uv_rusage_t; + +UV_EXTERN int uv_getrusage(uv_rusage_t* rusage); + +UV_EXTERN int uv_os_homedir(char* buffer, size_t* size); +UV_EXTERN int uv_os_tmpdir(char* buffer, size_t* size); +UV_EXTERN int uv_os_get_passwd(uv_passwd_t* pwd); +UV_EXTERN void uv_os_free_passwd(uv_passwd_t* pwd); +UV_EXTERN uv_pid_t uv_os_getpid(void); +UV_EXTERN uv_pid_t uv_os_getppid(void); + +#if defined(__PASE__) +/* On IBM i PASE, the highest process priority is -10 */ +# define UV_PRIORITY_LOW 39 /* RUNPTY(99) */ +# define UV_PRIORITY_BELOW_NORMAL 15 /* RUNPTY(50) */ +# define UV_PRIORITY_NORMAL 0 /* RUNPTY(20) */ +# define UV_PRIORITY_ABOVE_NORMAL -4 /* RUNTY(12) */ +# define UV_PRIORITY_HIGH -7 /* RUNPTY(6) */ +# define UV_PRIORITY_HIGHEST -10 /* RUNPTY(1) */ +#else +# define UV_PRIORITY_LOW 19 +# define UV_PRIORITY_BELOW_NORMAL 10 +# define UV_PRIORITY_NORMAL 0 +# define UV_PRIORITY_ABOVE_NORMAL -7 +# define UV_PRIORITY_HIGH -14 +# define UV_PRIORITY_HIGHEST -20 +#endif + +UV_EXTERN int uv_os_getpriority(uv_pid_t pid, int* priority); +UV_EXTERN int uv_os_setpriority(uv_pid_t pid, int priority); + +UV_EXTERN int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count); +UV_EXTERN void uv_free_cpu_info(uv_cpu_info_t* cpu_infos, int count); + +UV_EXTERN int uv_interface_addresses(uv_interface_address_t** addresses, + int* count); +UV_EXTERN void uv_free_interface_addresses(uv_interface_address_t* addresses, + int count); + +struct uv_env_item_s { + char* name; + char* value; +}; + +UV_EXTERN int uv_os_environ(uv_env_item_t** envitems, int* count); +UV_EXTERN void uv_os_free_environ(uv_env_item_t* envitems, int count); +UV_EXTERN int uv_os_getenv(const char* name, char* buffer, size_t* size); +UV_EXTERN int uv_os_setenv(const char* name, const char* value); +UV_EXTERN int uv_os_unsetenv(const char* name); + +#ifdef MAXHOSTNAMELEN +# define UV_MAXHOSTNAMESIZE (MAXHOSTNAMELEN + 1) +#else + /* + Fallback for the maximum hostname size, including the null terminator. The + Windows gethostname() documentation states that 256 bytes will always be + large enough to hold the null-terminated hostname. + */ +# define UV_MAXHOSTNAMESIZE 256 +#endif + +UV_EXTERN int uv_os_gethostname(char* buffer, size_t* size); + +UV_EXTERN int uv_os_uname(uv_utsname_t* buffer); + +UV_EXTERN uint64_t uv_metrics_idle_time(uv_loop_t* loop); + +typedef enum { + UV_FS_UNKNOWN = -1, + UV_FS_CUSTOM, + UV_FS_OPEN, + UV_FS_CLOSE, + UV_FS_READ, + UV_FS_WRITE, + UV_FS_SENDFILE, + UV_FS_STAT, + UV_FS_LSTAT, + UV_FS_FSTAT, + UV_FS_FTRUNCATE, + UV_FS_UTIME, + UV_FS_FUTIME, + UV_FS_ACCESS, + UV_FS_CHMOD, + UV_FS_FCHMOD, + UV_FS_FSYNC, + UV_FS_FDATASYNC, + UV_FS_UNLINK, + UV_FS_RMDIR, + UV_FS_MKDIR, + UV_FS_MKDTEMP, + UV_FS_RENAME, + UV_FS_SCANDIR, + UV_FS_LINK, + UV_FS_SYMLINK, + UV_FS_READLINK, + UV_FS_CHOWN, + UV_FS_FCHOWN, + UV_FS_REALPATH, + UV_FS_COPYFILE, + UV_FS_LCHOWN, + UV_FS_OPENDIR, + UV_FS_READDIR, + UV_FS_CLOSEDIR, + UV_FS_STATFS, + UV_FS_MKSTEMP, + UV_FS_LUTIME +} uv_fs_type; + +struct uv_dir_s { + uv_dirent_t* dirents; + size_t nentries; + void* reserved[4]; + UV_DIR_PRIVATE_FIELDS +}; + +/* uv_fs_t is a subclass of uv_req_t. */ +struct uv_fs_s { + UV_REQ_FIELDS + uv_fs_type fs_type; + uv_loop_t* loop; + uv_fs_cb cb; + ssize_t result; + void* ptr; + const char* path; + uv_stat_t statbuf; /* Stores the result of uv_fs_stat() and uv_fs_fstat(). */ + UV_FS_PRIVATE_FIELDS +}; + +UV_EXTERN uv_fs_type uv_fs_get_type(const uv_fs_t*); +UV_EXTERN ssize_t uv_fs_get_result(const uv_fs_t*); +UV_EXTERN int uv_fs_get_system_error(const uv_fs_t*); +UV_EXTERN void* uv_fs_get_ptr(const uv_fs_t*); +UV_EXTERN const char* uv_fs_get_path(const uv_fs_t*); +UV_EXTERN uv_stat_t* uv_fs_get_statbuf(uv_fs_t*); + +UV_EXTERN void uv_fs_req_cleanup(uv_fs_t* req); +UV_EXTERN int uv_fs_close(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_open(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int flags, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_read(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + const uv_buf_t bufs[], + unsigned int nbufs, + int64_t offset, + uv_fs_cb cb); +UV_EXTERN int uv_fs_unlink(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_write(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + const uv_buf_t bufs[], + unsigned int nbufs, + int64_t offset, + uv_fs_cb cb); +/* + * This flag can be used with uv_fs_copyfile() to return an error if the + * destination already exists. + */ +#define UV_FS_COPYFILE_EXCL 0x0001 + +/* + * This flag can be used with uv_fs_copyfile() to attempt to create a reflink. + * If copy-on-write is not supported, a fallback copy mechanism is used. + */ +#define UV_FS_COPYFILE_FICLONE 0x0002 + +/* + * This flag can be used with uv_fs_copyfile() to attempt to create a reflink. + * If copy-on-write is not supported, an error is returned. + */ +#define UV_FS_COPYFILE_FICLONE_FORCE 0x0004 + +UV_EXTERN int uv_fs_copyfile(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + int flags, + uv_fs_cb cb); +UV_EXTERN int uv_fs_mkdir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_mkdtemp(uv_loop_t* loop, + uv_fs_t* req, + const char* tpl, + uv_fs_cb cb); +UV_EXTERN int uv_fs_mkstemp(uv_loop_t* loop, + uv_fs_t* req, + const char* tpl, + uv_fs_cb cb); +UV_EXTERN int uv_fs_rmdir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_scandir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int flags, + uv_fs_cb cb); +UV_EXTERN int uv_fs_scandir_next(uv_fs_t* req, + uv_dirent_t* ent); +UV_EXTERN int uv_fs_opendir(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_readdir(uv_loop_t* loop, + uv_fs_t* req, + uv_dir_t* dir, + uv_fs_cb cb); +UV_EXTERN int uv_fs_closedir(uv_loop_t* loop, + uv_fs_t* req, + uv_dir_t* dir, + uv_fs_cb cb); +UV_EXTERN int uv_fs_stat(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fstat(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_rename(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fsync(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fdatasync(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_fs_cb cb); +UV_EXTERN int uv_fs_ftruncate(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + int64_t offset, + uv_fs_cb cb); +UV_EXTERN int uv_fs_sendfile(uv_loop_t* loop, + uv_fs_t* req, + uv_file out_fd, + uv_file in_fd, + int64_t in_offset, + size_t length, + uv_fs_cb cb); +UV_EXTERN int uv_fs_access(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_chmod(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_utime(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + double atime, + double mtime, + uv_fs_cb cb); +UV_EXTERN int uv_fs_futime(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + double atime, + double mtime, + uv_fs_cb cb); +UV_EXTERN int uv_fs_lutime(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + double atime, + double mtime, + uv_fs_cb cb); +UV_EXTERN int uv_fs_lstat(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_link(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + uv_fs_cb cb); + +/* + * This flag can be used with uv_fs_symlink() on Windows to specify whether + * path argument points to a directory. + */ +#define UV_FS_SYMLINK_DIR 0x0001 + +/* + * This flag can be used with uv_fs_symlink() on Windows to specify whether + * the symlink is to be created using junction points. + */ +#define UV_FS_SYMLINK_JUNCTION 0x0002 + +UV_EXTERN int uv_fs_symlink(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + const char* new_path, + int flags, + uv_fs_cb cb); +UV_EXTERN int uv_fs_readlink(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_realpath(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fchmod(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + int mode, + uv_fs_cb cb); +UV_EXTERN int uv_fs_chown(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_uid_t uid, + uv_gid_t gid, + uv_fs_cb cb); +UV_EXTERN int uv_fs_fchown(uv_loop_t* loop, + uv_fs_t* req, + uv_file file, + uv_uid_t uid, + uv_gid_t gid, + uv_fs_cb cb); +UV_EXTERN int uv_fs_lchown(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_uid_t uid, + uv_gid_t gid, + uv_fs_cb cb); +UV_EXTERN int uv_fs_statfs(uv_loop_t* loop, + uv_fs_t* req, + const char* path, + uv_fs_cb cb); + + +enum uv_fs_event { + UV_RENAME = 1, + UV_CHANGE = 2 +}; + + +struct uv_fs_event_s { + UV_HANDLE_FIELDS + /* private */ + char* path; + UV_FS_EVENT_PRIVATE_FIELDS +}; + + +/* + * uv_fs_stat() based polling file watcher. + */ +struct uv_fs_poll_s { + UV_HANDLE_FIELDS + /* Private, don't touch. */ + void* poll_ctx; +}; + +UV_EXTERN int uv_fs_poll_init(uv_loop_t* loop, uv_fs_poll_t* handle); +UV_EXTERN int uv_fs_poll_start(uv_fs_poll_t* handle, + uv_fs_poll_cb poll_cb, + const char* path, + unsigned int interval); +UV_EXTERN int uv_fs_poll_stop(uv_fs_poll_t* handle); +UV_EXTERN int uv_fs_poll_getpath(uv_fs_poll_t* handle, + char* buffer, + size_t* size); + + +struct uv_signal_s { + UV_HANDLE_FIELDS + uv_signal_cb signal_cb; + int signum; + UV_SIGNAL_PRIVATE_FIELDS +}; + +UV_EXTERN int uv_signal_init(uv_loop_t* loop, uv_signal_t* handle); +UV_EXTERN int uv_signal_start(uv_signal_t* handle, + uv_signal_cb signal_cb, + int signum); +UV_EXTERN int uv_signal_start_oneshot(uv_signal_t* handle, + uv_signal_cb signal_cb, + int signum); +UV_EXTERN int uv_signal_stop(uv_signal_t* handle); + +UV_EXTERN void uv_loadavg(double avg[3]); + + +/* + * Flags to be passed to uv_fs_event_start(). + */ +enum uv_fs_event_flags { + /* + * By default, if the fs event watcher is given a directory name, we will + * watch for all events in that directory. This flags overrides this behavior + * and makes fs_event report only changes to the directory entry itself. This + * flag does not affect individual files watched. + * This flag is currently not implemented yet on any backend. + */ + UV_FS_EVENT_WATCH_ENTRY = 1, + + /* + * By default uv_fs_event will try to use a kernel interface such as inotify + * or kqueue to detect events. This may not work on remote filesystems such + * as NFS mounts. This flag makes fs_event fall back to calling stat() on a + * regular interval. + * This flag is currently not implemented yet on any backend. + */ + UV_FS_EVENT_STAT = 2, + + /* + * By default, event watcher, when watching directory, is not registering + * (is ignoring) changes in it's subdirectories. + * This flag will override this behaviour on platforms that support it. + */ + UV_FS_EVENT_RECURSIVE = 4 +}; + + +UV_EXTERN int uv_fs_event_init(uv_loop_t* loop, uv_fs_event_t* handle); +UV_EXTERN int uv_fs_event_start(uv_fs_event_t* handle, + uv_fs_event_cb cb, + const char* path, + unsigned int flags); +UV_EXTERN int uv_fs_event_stop(uv_fs_event_t* handle); +UV_EXTERN int uv_fs_event_getpath(uv_fs_event_t* handle, + char* buffer, + size_t* size); + +UV_EXTERN int uv_ip4_addr(const char* ip, int port, struct sockaddr_in* addr); +UV_EXTERN int uv_ip6_addr(const char* ip, int port, struct sockaddr_in6* addr); + +UV_EXTERN int uv_ip4_name(const struct sockaddr_in* src, char* dst, size_t size); +UV_EXTERN int uv_ip6_name(const struct sockaddr_in6* src, char* dst, size_t size); + +UV_EXTERN int uv_inet_ntop(int af, const void* src, char* dst, size_t size); +UV_EXTERN int uv_inet_pton(int af, const char* src, void* dst); + + +struct uv_random_s { + UV_REQ_FIELDS + /* read-only */ + uv_loop_t* loop; + /* private */ + int status; + void* buf; + size_t buflen; + uv_random_cb cb; + struct uv__work work_req; +}; + +UV_EXTERN int uv_random(uv_loop_t* loop, + uv_random_t* req, + void *buf, + size_t buflen, + unsigned flags, /* For future extension; must be 0. */ + uv_random_cb cb); + +#if defined(IF_NAMESIZE) +# define UV_IF_NAMESIZE (IF_NAMESIZE + 1) +#elif defined(IFNAMSIZ) +# define UV_IF_NAMESIZE (IFNAMSIZ + 1) +#else +# define UV_IF_NAMESIZE (16 + 1) +#endif + +UV_EXTERN int uv_if_indextoname(unsigned int ifindex, + char* buffer, + size_t* size); +UV_EXTERN int uv_if_indextoiid(unsigned int ifindex, + char* buffer, + size_t* size); + +UV_EXTERN int uv_exepath(char* buffer, size_t* size); + +UV_EXTERN int uv_cwd(char* buffer, size_t* size); + +UV_EXTERN int uv_chdir(const char* dir); + +UV_EXTERN uint64_t uv_get_free_memory(void); +UV_EXTERN uint64_t uv_get_total_memory(void); +UV_EXTERN uint64_t uv_get_constrained_memory(void); + +UV_EXTERN uint64_t uv_hrtime(void); +UV_EXTERN void uv_sleep(unsigned int msec); + +UV_EXTERN void uv_disable_stdio_inheritance(void); + +UV_EXTERN int uv_dlopen(const char* filename, uv_lib_t* lib); +UV_EXTERN void uv_dlclose(uv_lib_t* lib); +UV_EXTERN int uv_dlsym(uv_lib_t* lib, const char* name, void** ptr); +UV_EXTERN const char* uv_dlerror(const uv_lib_t* lib); + +UV_EXTERN int uv_mutex_init(uv_mutex_t* handle); +UV_EXTERN int uv_mutex_init_recursive(uv_mutex_t* handle); +UV_EXTERN void uv_mutex_destroy(uv_mutex_t* handle); +UV_EXTERN void uv_mutex_lock(uv_mutex_t* handle); +UV_EXTERN int uv_mutex_trylock(uv_mutex_t* handle); +UV_EXTERN void uv_mutex_unlock(uv_mutex_t* handle); + +UV_EXTERN int uv_rwlock_init(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_destroy(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_rdlock(uv_rwlock_t* rwlock); +UV_EXTERN int uv_rwlock_tryrdlock(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_rdunlock(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_wrlock(uv_rwlock_t* rwlock); +UV_EXTERN int uv_rwlock_trywrlock(uv_rwlock_t* rwlock); +UV_EXTERN void uv_rwlock_wrunlock(uv_rwlock_t* rwlock); + +UV_EXTERN int uv_sem_init(uv_sem_t* sem, unsigned int value); +UV_EXTERN void uv_sem_destroy(uv_sem_t* sem); +UV_EXTERN void uv_sem_post(uv_sem_t* sem); +UV_EXTERN void uv_sem_wait(uv_sem_t* sem); +UV_EXTERN int uv_sem_trywait(uv_sem_t* sem); + +UV_EXTERN int uv_cond_init(uv_cond_t* cond); +UV_EXTERN void uv_cond_destroy(uv_cond_t* cond); +UV_EXTERN void uv_cond_signal(uv_cond_t* cond); +UV_EXTERN void uv_cond_broadcast(uv_cond_t* cond); + +UV_EXTERN int uv_barrier_init(uv_barrier_t* barrier, unsigned int count); +UV_EXTERN void uv_barrier_destroy(uv_barrier_t* barrier); +UV_EXTERN int uv_barrier_wait(uv_barrier_t* barrier); + +UV_EXTERN void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex); +UV_EXTERN int uv_cond_timedwait(uv_cond_t* cond, + uv_mutex_t* mutex, + uint64_t timeout); + +UV_EXTERN void uv_once(uv_once_t* guard, void (*callback)(void)); + +UV_EXTERN int uv_key_create(uv_key_t* key); +UV_EXTERN void uv_key_delete(uv_key_t* key); +UV_EXTERN void* uv_key_get(uv_key_t* key); +UV_EXTERN void uv_key_set(uv_key_t* key, void* value); + +UV_EXTERN int uv_gettimeofday(uv_timeval64_t* tv); + +typedef void (*uv_thread_cb)(void* arg); + +UV_EXTERN int uv_thread_create(uv_thread_t* tid, uv_thread_cb entry, void* arg); + +typedef enum { + UV_THREAD_NO_FLAGS = 0x00, + UV_THREAD_HAS_STACK_SIZE = 0x01 +} uv_thread_create_flags; + +struct uv_thread_options_s { + unsigned int flags; + size_t stack_size; + /* More fields may be added at any time. */ +}; + +typedef struct uv_thread_options_s uv_thread_options_t; + +UV_EXTERN int uv_thread_create_ex(uv_thread_t* tid, + const uv_thread_options_t* params, + uv_thread_cb entry, + void* arg); +UV_EXTERN uv_thread_t uv_thread_self(void); +UV_EXTERN int uv_thread_join(uv_thread_t *tid); +UV_EXTERN int uv_thread_equal(const uv_thread_t* t1, const uv_thread_t* t2); + +/* The presence of these unions force similar struct layout. */ +#define XX(_, name) uv_ ## name ## _t name; +union uv_any_handle { + UV_HANDLE_TYPE_MAP(XX) +}; + +union uv_any_req { + UV_REQ_TYPE_MAP(XX) +}; +#undef XX + + +struct uv_loop_s { + /* User data - use this for whatever. */ + void* data; + /* Loop reference counting. */ + unsigned int active_handles; + void* handle_queue[2]; + union { + void* unused; + unsigned int count; + } active_reqs; + /* Internal storage for future extensions. */ + void* internal_fields; + /* Internal flag to signal loop stop. */ + unsigned int stop_flag; + UV_LOOP_PRIVATE_FIELDS +}; + +UV_EXTERN void* uv_loop_get_data(const uv_loop_t*); +UV_EXTERN void uv_loop_set_data(uv_loop_t*, void* data); + +/* Don't export the private CPP symbols. */ +#undef UV_HANDLE_TYPE_PRIVATE +#undef UV_REQ_TYPE_PRIVATE +#undef UV_REQ_PRIVATE_FIELDS +#undef UV_STREAM_PRIVATE_FIELDS +#undef UV_TCP_PRIVATE_FIELDS +#undef UV_PREPARE_PRIVATE_FIELDS +#undef UV_CHECK_PRIVATE_FIELDS +#undef UV_IDLE_PRIVATE_FIELDS +#undef UV_ASYNC_PRIVATE_FIELDS +#undef UV_TIMER_PRIVATE_FIELDS +#undef UV_GETADDRINFO_PRIVATE_FIELDS +#undef UV_GETNAMEINFO_PRIVATE_FIELDS +#undef UV_FS_REQ_PRIVATE_FIELDS +#undef UV_WORK_PRIVATE_FIELDS +#undef UV_FS_EVENT_PRIVATE_FIELDS +#undef UV_SIGNAL_PRIVATE_FIELDS +#undef UV_LOOP_PRIVATE_FIELDS +#undef UV_LOOP_PRIVATE_PLATFORM_FIELDS +#undef UV__ERR + +#ifdef __cplusplus +} +#endif +#endif /* UV_H */ diff --git a/lwnode/apps/sqlite3/deps/include/uv/aix.h b/lwnode/apps/sqlite3/deps/include/uv/aix.h new file mode 100644 index 0000000..7dc992f --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/aix.h @@ -0,0 +1,32 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_AIX_H +#define UV_AIX_H + +#define UV_PLATFORM_LOOP_FIELDS \ + int fs_fd; \ + +#define UV_PLATFORM_FS_EVENT_FIELDS \ + uv__io_t event_watcher; \ + char *dir_filename; \ + +#endif /* UV_AIX_H */ diff --git a/lwnode/apps/sqlite3/deps/include/uv/android-ifaddrs.h b/lwnode/apps/sqlite3/deps/include/uv/android-ifaddrs.h new file mode 100644 index 0000000..9cd19fe --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/android-ifaddrs.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 1995, 1999 + * Berkeley Software Design, Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * THIS SOFTWARE IS PROVIDED BY Berkeley Software Design, Inc. ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Berkeley Software Design, Inc. BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * BSDI ifaddrs.h,v 2.5 2000/02/23 14:51:59 dab Exp + */ + +#ifndef _IFADDRS_H_ +#define _IFADDRS_H_ + +struct ifaddrs { + struct ifaddrs *ifa_next; + char *ifa_name; + unsigned int ifa_flags; + struct sockaddr *ifa_addr; + struct sockaddr *ifa_netmask; + struct sockaddr *ifa_dstaddr; + void *ifa_data; +}; + +/* + * This may have been defined in . Note that if is + * to be included it must be included before this header file. + */ +#ifndef ifa_broadaddr +#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ +#endif + +#include + +__BEGIN_DECLS +extern int getifaddrs(struct ifaddrs **ifap); +extern void freeifaddrs(struct ifaddrs *ifa); +__END_DECLS + +#endif diff --git a/lwnode/apps/sqlite3/deps/include/uv/bsd.h b/lwnode/apps/sqlite3/deps/include/uv/bsd.h new file mode 100644 index 0000000..2d72b3d --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/bsd.h @@ -0,0 +1,34 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_BSD_H +#define UV_BSD_H + +#define UV_PLATFORM_FS_EVENT_FIELDS \ + uv__io_t event_watcher; \ + +#define UV_IO_PRIVATE_PLATFORM_FIELDS \ + int rcount; \ + int wcount; \ + +#define UV_HAVE_KQUEUE 1 + +#endif /* UV_BSD_H */ diff --git a/lwnode/apps/sqlite3/deps/include/uv/darwin.h b/lwnode/apps/sqlite3/deps/include/uv/darwin.h new file mode 100644 index 0000000..d226415 --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/darwin.h @@ -0,0 +1,61 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_DARWIN_H +#define UV_DARWIN_H + +#if defined(__APPLE__) && defined(__MACH__) +# include +# include +# include +# include +# define UV_PLATFORM_SEM_T semaphore_t +#endif + +#define UV_IO_PRIVATE_PLATFORM_FIELDS \ + int rcount; \ + int wcount; \ + +#define UV_PLATFORM_LOOP_FIELDS \ + uv_thread_t cf_thread; \ + void* _cf_reserved; \ + void* cf_state; \ + uv_mutex_t cf_mutex; \ + uv_sem_t cf_sem; \ + void* cf_signals[2]; \ + +#define UV_PLATFORM_FS_EVENT_FIELDS \ + uv__io_t event_watcher; \ + char* realpath; \ + int realpath_len; \ + int cf_flags; \ + uv_async_t* cf_cb; \ + void* cf_events[2]; \ + void* cf_member[2]; \ + int cf_error; \ + uv_mutex_t cf_mutex; \ + +#define UV_STREAM_PRIVATE_PLATFORM_FIELDS \ + void* select; \ + +#define UV_HAVE_KQUEUE 1 + +#endif /* UV_DARWIN_H */ diff --git a/lwnode/apps/sqlite3/deps/include/uv/errno.h b/lwnode/apps/sqlite3/deps/include/uv/errno.h new file mode 100644 index 0000000..aadce9c --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/errno.h @@ -0,0 +1,448 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_ERRNO_H_ +#define UV_ERRNO_H_ + +#include +#if EDOM > 0 +# define UV__ERR(x) (-(x)) +#else +# define UV__ERR(x) (x) +#endif + +#define UV__EOF (-4095) +#define UV__UNKNOWN (-4094) + +#define UV__EAI_ADDRFAMILY (-3000) +#define UV__EAI_AGAIN (-3001) +#define UV__EAI_BADFLAGS (-3002) +#define UV__EAI_CANCELED (-3003) +#define UV__EAI_FAIL (-3004) +#define UV__EAI_FAMILY (-3005) +#define UV__EAI_MEMORY (-3006) +#define UV__EAI_NODATA (-3007) +#define UV__EAI_NONAME (-3008) +#define UV__EAI_OVERFLOW (-3009) +#define UV__EAI_SERVICE (-3010) +#define UV__EAI_SOCKTYPE (-3011) +#define UV__EAI_BADHINTS (-3013) +#define UV__EAI_PROTOCOL (-3014) + +/* Only map to the system errno on non-Windows platforms. It's apparently + * a fairly common practice for Windows programmers to redefine errno codes. + */ +#if defined(E2BIG) && !defined(_WIN32) +# define UV__E2BIG UV__ERR(E2BIG) +#else +# define UV__E2BIG (-4093) +#endif + +#if defined(EACCES) && !defined(_WIN32) +# define UV__EACCES UV__ERR(EACCES) +#else +# define UV__EACCES (-4092) +#endif + +#if defined(EADDRINUSE) && !defined(_WIN32) +# define UV__EADDRINUSE UV__ERR(EADDRINUSE) +#else +# define UV__EADDRINUSE (-4091) +#endif + +#if defined(EADDRNOTAVAIL) && !defined(_WIN32) +# define UV__EADDRNOTAVAIL UV__ERR(EADDRNOTAVAIL) +#else +# define UV__EADDRNOTAVAIL (-4090) +#endif + +#if defined(EAFNOSUPPORT) && !defined(_WIN32) +# define UV__EAFNOSUPPORT UV__ERR(EAFNOSUPPORT) +#else +# define UV__EAFNOSUPPORT (-4089) +#endif + +#if defined(EAGAIN) && !defined(_WIN32) +# define UV__EAGAIN UV__ERR(EAGAIN) +#else +# define UV__EAGAIN (-4088) +#endif + +#if defined(EALREADY) && !defined(_WIN32) +# define UV__EALREADY UV__ERR(EALREADY) +#else +# define UV__EALREADY (-4084) +#endif + +#if defined(EBADF) && !defined(_WIN32) +# define UV__EBADF UV__ERR(EBADF) +#else +# define UV__EBADF (-4083) +#endif + +#if defined(EBUSY) && !defined(_WIN32) +# define UV__EBUSY UV__ERR(EBUSY) +#else +# define UV__EBUSY (-4082) +#endif + +#if defined(ECANCELED) && !defined(_WIN32) +# define UV__ECANCELED UV__ERR(ECANCELED) +#else +# define UV__ECANCELED (-4081) +#endif + +#if defined(ECHARSET) && !defined(_WIN32) +# define UV__ECHARSET UV__ERR(ECHARSET) +#else +# define UV__ECHARSET (-4080) +#endif + +#if defined(ECONNABORTED) && !defined(_WIN32) +# define UV__ECONNABORTED UV__ERR(ECONNABORTED) +#else +# define UV__ECONNABORTED (-4079) +#endif + +#if defined(ECONNREFUSED) && !defined(_WIN32) +# define UV__ECONNREFUSED UV__ERR(ECONNREFUSED) +#else +# define UV__ECONNREFUSED (-4078) +#endif + +#if defined(ECONNRESET) && !defined(_WIN32) +# define UV__ECONNRESET UV__ERR(ECONNRESET) +#else +# define UV__ECONNRESET (-4077) +#endif + +#if defined(EDESTADDRREQ) && !defined(_WIN32) +# define UV__EDESTADDRREQ UV__ERR(EDESTADDRREQ) +#else +# define UV__EDESTADDRREQ (-4076) +#endif + +#if defined(EEXIST) && !defined(_WIN32) +# define UV__EEXIST UV__ERR(EEXIST) +#else +# define UV__EEXIST (-4075) +#endif + +#if defined(EFAULT) && !defined(_WIN32) +# define UV__EFAULT UV__ERR(EFAULT) +#else +# define UV__EFAULT (-4074) +#endif + +#if defined(EHOSTUNREACH) && !defined(_WIN32) +# define UV__EHOSTUNREACH UV__ERR(EHOSTUNREACH) +#else +# define UV__EHOSTUNREACH (-4073) +#endif + +#if defined(EINTR) && !defined(_WIN32) +# define UV__EINTR UV__ERR(EINTR) +#else +# define UV__EINTR (-4072) +#endif + +#if defined(EINVAL) && !defined(_WIN32) +# define UV__EINVAL UV__ERR(EINVAL) +#else +# define UV__EINVAL (-4071) +#endif + +#if defined(EIO) && !defined(_WIN32) +# define UV__EIO UV__ERR(EIO) +#else +# define UV__EIO (-4070) +#endif + +#if defined(EISCONN) && !defined(_WIN32) +# define UV__EISCONN UV__ERR(EISCONN) +#else +# define UV__EISCONN (-4069) +#endif + +#if defined(EISDIR) && !defined(_WIN32) +# define UV__EISDIR UV__ERR(EISDIR) +#else +# define UV__EISDIR (-4068) +#endif + +#if defined(ELOOP) && !defined(_WIN32) +# define UV__ELOOP UV__ERR(ELOOP) +#else +# define UV__ELOOP (-4067) +#endif + +#if defined(EMFILE) && !defined(_WIN32) +# define UV__EMFILE UV__ERR(EMFILE) +#else +# define UV__EMFILE (-4066) +#endif + +#if defined(EMSGSIZE) && !defined(_WIN32) +# define UV__EMSGSIZE UV__ERR(EMSGSIZE) +#else +# define UV__EMSGSIZE (-4065) +#endif + +#if defined(ENAMETOOLONG) && !defined(_WIN32) +# define UV__ENAMETOOLONG UV__ERR(ENAMETOOLONG) +#else +# define UV__ENAMETOOLONG (-4064) +#endif + +#if defined(ENETDOWN) && !defined(_WIN32) +# define UV__ENETDOWN UV__ERR(ENETDOWN) +#else +# define UV__ENETDOWN (-4063) +#endif + +#if defined(ENETUNREACH) && !defined(_WIN32) +# define UV__ENETUNREACH UV__ERR(ENETUNREACH) +#else +# define UV__ENETUNREACH (-4062) +#endif + +#if defined(ENFILE) && !defined(_WIN32) +# define UV__ENFILE UV__ERR(ENFILE) +#else +# define UV__ENFILE (-4061) +#endif + +#if defined(ENOBUFS) && !defined(_WIN32) +# define UV__ENOBUFS UV__ERR(ENOBUFS) +#else +# define UV__ENOBUFS (-4060) +#endif + +#if defined(ENODEV) && !defined(_WIN32) +# define UV__ENODEV UV__ERR(ENODEV) +#else +# define UV__ENODEV (-4059) +#endif + +#if defined(ENOENT) && !defined(_WIN32) +# define UV__ENOENT UV__ERR(ENOENT) +#else +# define UV__ENOENT (-4058) +#endif + +#if defined(ENOMEM) && !defined(_WIN32) +# define UV__ENOMEM UV__ERR(ENOMEM) +#else +# define UV__ENOMEM (-4057) +#endif + +#if defined(ENONET) && !defined(_WIN32) +# define UV__ENONET UV__ERR(ENONET) +#else +# define UV__ENONET (-4056) +#endif + +#if defined(ENOSPC) && !defined(_WIN32) +# define UV__ENOSPC UV__ERR(ENOSPC) +#else +# define UV__ENOSPC (-4055) +#endif + +#if defined(ENOSYS) && !defined(_WIN32) +# define UV__ENOSYS UV__ERR(ENOSYS) +#else +# define UV__ENOSYS (-4054) +#endif + +#if defined(ENOTCONN) && !defined(_WIN32) +# define UV__ENOTCONN UV__ERR(ENOTCONN) +#else +# define UV__ENOTCONN (-4053) +#endif + +#if defined(ENOTDIR) && !defined(_WIN32) +# define UV__ENOTDIR UV__ERR(ENOTDIR) +#else +# define UV__ENOTDIR (-4052) +#endif + +#if defined(ENOTEMPTY) && !defined(_WIN32) +# define UV__ENOTEMPTY UV__ERR(ENOTEMPTY) +#else +# define UV__ENOTEMPTY (-4051) +#endif + +#if defined(ENOTSOCK) && !defined(_WIN32) +# define UV__ENOTSOCK UV__ERR(ENOTSOCK) +#else +# define UV__ENOTSOCK (-4050) +#endif + +#if defined(ENOTSUP) && !defined(_WIN32) +# define UV__ENOTSUP UV__ERR(ENOTSUP) +#else +# define UV__ENOTSUP (-4049) +#endif + +#if defined(EPERM) && !defined(_WIN32) +# define UV__EPERM UV__ERR(EPERM) +#else +# define UV__EPERM (-4048) +#endif + +#if defined(EPIPE) && !defined(_WIN32) +# define UV__EPIPE UV__ERR(EPIPE) +#else +# define UV__EPIPE (-4047) +#endif + +#if defined(EPROTO) && !defined(_WIN32) +# define UV__EPROTO UV__ERR(EPROTO) +#else +# define UV__EPROTO (-4046) +#endif + +#if defined(EPROTONOSUPPORT) && !defined(_WIN32) +# define UV__EPROTONOSUPPORT UV__ERR(EPROTONOSUPPORT) +#else +# define UV__EPROTONOSUPPORT (-4045) +#endif + +#if defined(EPROTOTYPE) && !defined(_WIN32) +# define UV__EPROTOTYPE UV__ERR(EPROTOTYPE) +#else +# define UV__EPROTOTYPE (-4044) +#endif + +#if defined(EROFS) && !defined(_WIN32) +# define UV__EROFS UV__ERR(EROFS) +#else +# define UV__EROFS (-4043) +#endif + +#if defined(ESHUTDOWN) && !defined(_WIN32) +# define UV__ESHUTDOWN UV__ERR(ESHUTDOWN) +#else +# define UV__ESHUTDOWN (-4042) +#endif + +#if defined(ESPIPE) && !defined(_WIN32) +# define UV__ESPIPE UV__ERR(ESPIPE) +#else +# define UV__ESPIPE (-4041) +#endif + +#if defined(ESRCH) && !defined(_WIN32) +# define UV__ESRCH UV__ERR(ESRCH) +#else +# define UV__ESRCH (-4040) +#endif + +#if defined(ETIMEDOUT) && !defined(_WIN32) +# define UV__ETIMEDOUT UV__ERR(ETIMEDOUT) +#else +# define UV__ETIMEDOUT (-4039) +#endif + +#if defined(ETXTBSY) && !defined(_WIN32) +# define UV__ETXTBSY UV__ERR(ETXTBSY) +#else +# define UV__ETXTBSY (-4038) +#endif + +#if defined(EXDEV) && !defined(_WIN32) +# define UV__EXDEV UV__ERR(EXDEV) +#else +# define UV__EXDEV (-4037) +#endif + +#if defined(EFBIG) && !defined(_WIN32) +# define UV__EFBIG UV__ERR(EFBIG) +#else +# define UV__EFBIG (-4036) +#endif + +#if defined(ENOPROTOOPT) && !defined(_WIN32) +# define UV__ENOPROTOOPT UV__ERR(ENOPROTOOPT) +#else +# define UV__ENOPROTOOPT (-4035) +#endif + +#if defined(ERANGE) && !defined(_WIN32) +# define UV__ERANGE UV__ERR(ERANGE) +#else +# define UV__ERANGE (-4034) +#endif + +#if defined(ENXIO) && !defined(_WIN32) +# define UV__ENXIO UV__ERR(ENXIO) +#else +# define UV__ENXIO (-4033) +#endif + +#if defined(EMLINK) && !defined(_WIN32) +# define UV__EMLINK UV__ERR(EMLINK) +#else +# define UV__EMLINK (-4032) +#endif + +/* EHOSTDOWN is not visible on BSD-like systems when _POSIX_C_SOURCE is + * defined. Fortunately, its value is always 64 so it's possible albeit + * icky to hard-code it. + */ +#if defined(EHOSTDOWN) && !defined(_WIN32) +# define UV__EHOSTDOWN UV__ERR(EHOSTDOWN) +#elif defined(__APPLE__) || \ + defined(__DragonFly__) || \ + defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) || \ + defined(__NetBSD__) || \ + defined(__OpenBSD__) +# define UV__EHOSTDOWN (-64) +#else +# define UV__EHOSTDOWN (-4031) +#endif + +#if defined(EREMOTEIO) && !defined(_WIN32) +# define UV__EREMOTEIO UV__ERR(EREMOTEIO) +#else +# define UV__EREMOTEIO (-4030) +#endif + +#if defined(ENOTTY) && !defined(_WIN32) +# define UV__ENOTTY UV__ERR(ENOTTY) +#else +# define UV__ENOTTY (-4029) +#endif + +#if defined(EFTYPE) && !defined(_WIN32) +# define UV__EFTYPE UV__ERR(EFTYPE) +#else +# define UV__EFTYPE (-4028) +#endif + +#if defined(EILSEQ) && !defined(_WIN32) +# define UV__EILSEQ UV__ERR(EILSEQ) +#else +# define UV__EILSEQ (-4027) +#endif + +#endif /* UV_ERRNO_H_ */ diff --git a/lwnode/apps/sqlite3/deps/include/uv/linux.h b/lwnode/apps/sqlite3/deps/include/uv/linux.h new file mode 100644 index 0000000..9b38405 --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/linux.h @@ -0,0 +1,34 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_LINUX_H +#define UV_LINUX_H + +#define UV_PLATFORM_LOOP_FIELDS \ + uv__io_t inotify_read_watcher; \ + void* inotify_watchers; \ + int inotify_fd; \ + +#define UV_PLATFORM_FS_EVENT_FIELDS \ + void* watchers[2]; \ + int wd; \ + +#endif /* UV_LINUX_H */ diff --git a/lwnode/apps/sqlite3/deps/include/uv/os390.h b/lwnode/apps/sqlite3/deps/include/uv/os390.h new file mode 100644 index 0000000..0267d74 --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/os390.h @@ -0,0 +1,33 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_MVS_H +#define UV_MVS_H + +#define UV_PLATFORM_SEM_T long + +#define UV_PLATFORM_LOOP_FIELDS \ + void* ep; \ + +#define UV_PLATFORM_FS_EVENT_FIELDS \ + char rfis_rftok[8]; \ + +#endif /* UV_MVS_H */ diff --git a/lwnode/apps/sqlite3/deps/include/uv/posix.h b/lwnode/apps/sqlite3/deps/include/uv/posix.h new file mode 100644 index 0000000..9a96634 --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/posix.h @@ -0,0 +1,31 @@ +/* Copyright libuv project contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_POSIX_H +#define UV_POSIX_H + +#define UV_PLATFORM_LOOP_FIELDS \ + struct pollfd* poll_fds; \ + size_t poll_fds_used; \ + size_t poll_fds_size; \ + unsigned char poll_fds_iterating; \ + +#endif /* UV_POSIX_H */ diff --git a/lwnode/apps/sqlite3/deps/include/uv/stdint-msvc2008.h b/lwnode/apps/sqlite3/deps/include/uv/stdint-msvc2008.h new file mode 100644 index 0000000..d02608a --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/stdint-msvc2008.h @@ -0,0 +1,247 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2008 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. The name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include + +// For Visual Studio 6 in C++ mode and for many Visual Studio versions when +// compiling for ARM we should wrap include with 'extern "C++" {}' +// or compiler give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#ifdef __cplusplus +extern "C" { +#endif +# include +#ifdef __cplusplus +} +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types + +// Visual Studio 6 and Embedded Visual C++ 4 doesn't +// realize that, e.g. char has the same size as __int8 +// so we give up on __intX for them. +#if (_MSC_VER < 1300) + typedef signed char int8_t; + typedef signed short int16_t; + typedef signed int int32_t; + typedef unsigned char uint8_t; + typedef unsigned short uint16_t; + typedef unsigned int uint32_t; +#else + typedef signed __int8 int8_t; + typedef signed __int16 int16_t; + typedef signed __int32 int32_t; + typedef unsigned __int8 uint8_t; + typedef unsigned __int16 uint16_t; + typedef unsigned __int32 uint32_t; +#endif +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; + + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef signed __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 signed int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +#define INTMAX_C INT64_C +#define UINTMAX_C UINT64_C + +#endif // __STDC_CONSTANT_MACROS ] + + +#endif // _MSC_STDINT_H_ ] diff --git a/lwnode/apps/sqlite3/deps/include/uv/sunos.h b/lwnode/apps/sqlite3/deps/include/uv/sunos.h new file mode 100644 index 0000000..0421664 --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/sunos.h @@ -0,0 +1,44 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_SUNOS_H +#define UV_SUNOS_H + +#include +#include + +/* For the sake of convenience and reduced #ifdef-ery in src/unix/sunos.c, + * add the fs_event fields even when this version of SunOS doesn't support + * file watching. + */ +#define UV_PLATFORM_LOOP_FIELDS \ + uv__io_t fs_event_watcher; \ + int fs_fd; \ + +#if defined(PORT_SOURCE_FILE) + +# define UV_PLATFORM_FS_EVENT_FIELDS \ + file_obj_t fo; \ + int fd; \ + +#endif /* defined(PORT_SOURCE_FILE) */ + +#endif /* UV_SUNOS_H */ diff --git a/lwnode/apps/sqlite3/deps/include/uv/threadpool.h b/lwnode/apps/sqlite3/deps/include/uv/threadpool.h new file mode 100644 index 0000000..9708ebd --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/threadpool.h @@ -0,0 +1,37 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +/* + * This file is private to libuv. It provides common functionality to both + * Windows and Unix backends. + */ + +#ifndef UV_THREADPOOL_H_ +#define UV_THREADPOOL_H_ + +struct uv__work { + void (*work)(struct uv__work *w); + void (*done)(struct uv__work *w, int status); + struct uv_loop_s* loop; + void* wq[2]; +}; + +#endif /* UV_THREADPOOL_H_ */ diff --git a/lwnode/apps/sqlite3/deps/include/uv/tree.h b/lwnode/apps/sqlite3/deps/include/uv/tree.h new file mode 100644 index 0000000..f936416 --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/tree.h @@ -0,0 +1,768 @@ +/*- + * Copyright 2002 Niels Provos + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef UV_TREE_H_ +#define UV_TREE_H_ + +#ifndef UV__UNUSED +# if __GNUC__ +# define UV__UNUSED __attribute__((unused)) +# else +# define UV__UNUSED +# endif +#endif + +/* + * This file defines data structures for different types of trees: + * splay trees and red-black trees. + * + * A splay tree is a self-organizing data structure. Every operation + * on the tree causes a splay to happen. The splay moves the requested + * node to the root of the tree and partly rebalances it. + * + * This has the benefit that request locality causes faster lookups as + * the requested nodes move to the top of the tree. On the other hand, + * every lookup causes memory writes. + * + * The Balance Theorem bounds the total access time for m operations + * and n inserts on an initially empty tree as O((m + n)lg n). The + * amortized cost for a sequence of m accesses to a splay tree is O(lg n); + * + * A red-black tree is a binary search tree with the node color as an + * extra attribute. It fulfills a set of conditions: + * - every search path from the root to a leaf consists of the + * same number of black nodes, + * - each red node (except for the root) has a black parent, + * - each leaf node is black. + * + * Every operation on a red-black tree is bounded as O(lg n). + * The maximum height of a red-black tree is 2lg (n+1). + */ + +#define SPLAY_HEAD(name, type) \ +struct name { \ + struct type *sph_root; /* root of the tree */ \ +} + +#define SPLAY_INITIALIZER(root) \ + { NULL } + +#define SPLAY_INIT(root) do { \ + (root)->sph_root = NULL; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ENTRY(type) \ +struct { \ + struct type *spe_left; /* left element */ \ + struct type *spe_right; /* right element */ \ +} + +#define SPLAY_LEFT(elm, field) (elm)->field.spe_left +#define SPLAY_RIGHT(elm, field) (elm)->field.spe_right +#define SPLAY_ROOT(head) (head)->sph_root +#define SPLAY_EMPTY(head) (SPLAY_ROOT(head) == NULL) + +/* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */ +#define SPLAY_ROTATE_RIGHT(head, tmp, field) do { \ + SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field); \ + SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ + (head)->sph_root = tmp; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ROTATE_LEFT(head, tmp, field) do { \ + SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field); \ + SPLAY_LEFT(tmp, field) = (head)->sph_root; \ + (head)->sph_root = tmp; \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_LINKLEFT(head, tmp, field) do { \ + SPLAY_LEFT(tmp, field) = (head)->sph_root; \ + tmp = (head)->sph_root; \ + (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_LINKRIGHT(head, tmp, field) do { \ + SPLAY_RIGHT(tmp, field) = (head)->sph_root; \ + tmp = (head)->sph_root; \ + (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ +} while (/*CONSTCOND*/ 0) + +#define SPLAY_ASSEMBLE(head, node, left, right, field) do { \ + SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field); \ + SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field); \ + SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field); \ + SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field); \ +} while (/*CONSTCOND*/ 0) + +/* Generates prototypes and inline functions */ + +#define SPLAY_PROTOTYPE(name, type, field, cmp) \ +void name##_SPLAY(struct name *, struct type *); \ +void name##_SPLAY_MINMAX(struct name *, int); \ +struct type *name##_SPLAY_INSERT(struct name *, struct type *); \ +struct type *name##_SPLAY_REMOVE(struct name *, struct type *); \ + \ +/* Finds the node with the same key as elm */ \ +static __inline struct type * \ +name##_SPLAY_FIND(struct name *head, struct type *elm) \ +{ \ + if (SPLAY_EMPTY(head)) \ + return(NULL); \ + name##_SPLAY(head, elm); \ + if ((cmp)(elm, (head)->sph_root) == 0) \ + return (head->sph_root); \ + return (NULL); \ +} \ + \ +static __inline struct type * \ +name##_SPLAY_NEXT(struct name *head, struct type *elm) \ +{ \ + name##_SPLAY(head, elm); \ + if (SPLAY_RIGHT(elm, field) != NULL) { \ + elm = SPLAY_RIGHT(elm, field); \ + while (SPLAY_LEFT(elm, field) != NULL) { \ + elm = SPLAY_LEFT(elm, field); \ + } \ + } else \ + elm = NULL; \ + return (elm); \ +} \ + \ +static __inline struct type * \ +name##_SPLAY_MIN_MAX(struct name *head, int val) \ +{ \ + name##_SPLAY_MINMAX(head, val); \ + return (SPLAY_ROOT(head)); \ +} + +/* Main splay operation. + * Moves node close to the key of elm to top + */ +#define SPLAY_GENERATE(name, type, field, cmp) \ +struct type * \ +name##_SPLAY_INSERT(struct name *head, struct type *elm) \ +{ \ + if (SPLAY_EMPTY(head)) { \ + SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = NULL; \ + } else { \ + int __comp; \ + name##_SPLAY(head, elm); \ + __comp = (cmp)(elm, (head)->sph_root); \ + if(__comp < 0) { \ + SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field); \ + SPLAY_RIGHT(elm, field) = (head)->sph_root; \ + SPLAY_LEFT((head)->sph_root, field) = NULL; \ + } else if (__comp > 0) { \ + SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field); \ + SPLAY_LEFT(elm, field) = (head)->sph_root; \ + SPLAY_RIGHT((head)->sph_root, field) = NULL; \ + } else \ + return ((head)->sph_root); \ + } \ + (head)->sph_root = (elm); \ + return (NULL); \ +} \ + \ +struct type * \ +name##_SPLAY_REMOVE(struct name *head, struct type *elm) \ +{ \ + struct type *__tmp; \ + if (SPLAY_EMPTY(head)) \ + return (NULL); \ + name##_SPLAY(head, elm); \ + if ((cmp)(elm, (head)->sph_root) == 0) { \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL) { \ + (head)->sph_root = SPLAY_RIGHT((head)->sph_root, field); \ + } else { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + (head)->sph_root = SPLAY_LEFT((head)->sph_root, field); \ + name##_SPLAY(head, elm); \ + SPLAY_RIGHT((head)->sph_root, field) = __tmp; \ + } \ + return (elm); \ + } \ + return (NULL); \ +} \ + \ +void \ +name##_SPLAY(struct name *head, struct type *elm) \ +{ \ + struct type __node, *__left, *__right, *__tmp; \ + int __comp; \ + \ + SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL; \ + __left = __right = &__node; \ + \ + while ((__comp = (cmp)(elm, (head)->sph_root)) != 0) { \ + if (__comp < 0) { \ + __tmp = SPLAY_LEFT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if ((cmp)(elm, __tmp) < 0){ \ + SPLAY_ROTATE_RIGHT(head, __tmp, field); \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL) \ + break; \ + } \ + SPLAY_LINKLEFT(head, __right, field); \ + } else if (__comp > 0) { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if ((cmp)(elm, __tmp) > 0){ \ + SPLAY_ROTATE_LEFT(head, __tmp, field); \ + if (SPLAY_RIGHT((head)->sph_root, field) == NULL) \ + break; \ + } \ + SPLAY_LINKRIGHT(head, __left, field); \ + } \ + } \ + SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ +} \ + \ +/* Splay with either the minimum or the maximum element \ + * Used to find minimum or maximum element in tree. \ + */ \ +void name##_SPLAY_MINMAX(struct name *head, int __comp) \ +{ \ + struct type __node, *__left, *__right, *__tmp; \ + \ + SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL; \ + __left = __right = &__node; \ + \ + while (1) { \ + if (__comp < 0) { \ + __tmp = SPLAY_LEFT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if (__comp < 0){ \ + SPLAY_ROTATE_RIGHT(head, __tmp, field); \ + if (SPLAY_LEFT((head)->sph_root, field) == NULL) \ + break; \ + } \ + SPLAY_LINKLEFT(head, __right, field); \ + } else if (__comp > 0) { \ + __tmp = SPLAY_RIGHT((head)->sph_root, field); \ + if (__tmp == NULL) \ + break; \ + if (__comp > 0) { \ + SPLAY_ROTATE_LEFT(head, __tmp, field); \ + if (SPLAY_RIGHT((head)->sph_root, field) == NULL) \ + break; \ + } \ + SPLAY_LINKRIGHT(head, __left, field); \ + } \ + } \ + SPLAY_ASSEMBLE(head, &__node, __left, __right, field); \ +} + +#define SPLAY_NEGINF -1 +#define SPLAY_INF 1 + +#define SPLAY_INSERT(name, x, y) name##_SPLAY_INSERT(x, y) +#define SPLAY_REMOVE(name, x, y) name##_SPLAY_REMOVE(x, y) +#define SPLAY_FIND(name, x, y) name##_SPLAY_FIND(x, y) +#define SPLAY_NEXT(name, x, y) name##_SPLAY_NEXT(x, y) +#define SPLAY_MIN(name, x) (SPLAY_EMPTY(x) ? NULL \ + : name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF)) +#define SPLAY_MAX(name, x) (SPLAY_EMPTY(x) ? NULL \ + : name##_SPLAY_MIN_MAX(x, SPLAY_INF)) + +#define SPLAY_FOREACH(x, name, head) \ + for ((x) = SPLAY_MIN(name, head); \ + (x) != NULL; \ + (x) = SPLAY_NEXT(name, head, x)) + +/* Macros that define a red-black tree */ +#define RB_HEAD(name, type) \ +struct name { \ + struct type *rbh_root; /* root of the tree */ \ +} + +#define RB_INITIALIZER(root) \ + { NULL } + +#define RB_INIT(root) do { \ + (root)->rbh_root = NULL; \ +} while (/*CONSTCOND*/ 0) + +#define RB_BLACK 0 +#define RB_RED 1 +#define RB_ENTRY(type) \ +struct { \ + struct type *rbe_left; /* left element */ \ + struct type *rbe_right; /* right element */ \ + struct type *rbe_parent; /* parent element */ \ + int rbe_color; /* node color */ \ +} + +#define RB_LEFT(elm, field) (elm)->field.rbe_left +#define RB_RIGHT(elm, field) (elm)->field.rbe_right +#define RB_PARENT(elm, field) (elm)->field.rbe_parent +#define RB_COLOR(elm, field) (elm)->field.rbe_color +#define RB_ROOT(head) (head)->rbh_root +#define RB_EMPTY(head) (RB_ROOT(head) == NULL) + +#define RB_SET(elm, parent, field) do { \ + RB_PARENT(elm, field) = parent; \ + RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL; \ + RB_COLOR(elm, field) = RB_RED; \ +} while (/*CONSTCOND*/ 0) + +#define RB_SET_BLACKRED(black, red, field) do { \ + RB_COLOR(black, field) = RB_BLACK; \ + RB_COLOR(red, field) = RB_RED; \ +} while (/*CONSTCOND*/ 0) + +#ifndef RB_AUGMENT +#define RB_AUGMENT(x) do {} while (0) +#endif + +#define RB_ROTATE_LEFT(head, elm, tmp, field) do { \ + (tmp) = RB_RIGHT(elm, field); \ + if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) { \ + RB_PARENT(RB_LEFT(tmp, field), field) = (elm); \ + } \ + RB_AUGMENT(elm); \ + if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \ + if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ + RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ + else \ + RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ + } else \ + (head)->rbh_root = (tmp); \ + RB_LEFT(tmp, field) = (elm); \ + RB_PARENT(elm, field) = (tmp); \ + RB_AUGMENT(tmp); \ + if ((RB_PARENT(tmp, field))) \ + RB_AUGMENT(RB_PARENT(tmp, field)); \ +} while (/*CONSTCOND*/ 0) + +#define RB_ROTATE_RIGHT(head, elm, tmp, field) do { \ + (tmp) = RB_LEFT(elm, field); \ + if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) { \ + RB_PARENT(RB_RIGHT(tmp, field), field) = (elm); \ + } \ + RB_AUGMENT(elm); \ + if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) { \ + if ((elm) == RB_LEFT(RB_PARENT(elm, field), field)) \ + RB_LEFT(RB_PARENT(elm, field), field) = (tmp); \ + else \ + RB_RIGHT(RB_PARENT(elm, field), field) = (tmp); \ + } else \ + (head)->rbh_root = (tmp); \ + RB_RIGHT(tmp, field) = (elm); \ + RB_PARENT(elm, field) = (tmp); \ + RB_AUGMENT(tmp); \ + if ((RB_PARENT(tmp, field))) \ + RB_AUGMENT(RB_PARENT(tmp, field)); \ +} while (/*CONSTCOND*/ 0) + +/* Generates prototypes and inline functions */ +#define RB_PROTOTYPE(name, type, field, cmp) \ + RB_PROTOTYPE_INTERNAL(name, type, field, cmp,) +#define RB_PROTOTYPE_STATIC(name, type, field, cmp) \ + RB_PROTOTYPE_INTERNAL(name, type, field, cmp, UV__UNUSED static) +#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr) \ +attr void name##_RB_INSERT_COLOR(struct name *, struct type *); \ +attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *);\ +attr struct type *name##_RB_REMOVE(struct name *, struct type *); \ +attr struct type *name##_RB_INSERT(struct name *, struct type *); \ +attr struct type *name##_RB_FIND(struct name *, struct type *); \ +attr struct type *name##_RB_NFIND(struct name *, struct type *); \ +attr struct type *name##_RB_NEXT(struct type *); \ +attr struct type *name##_RB_PREV(struct type *); \ +attr struct type *name##_RB_MINMAX(struct name *, int); \ + \ + +/* Main rb operation. + * Moves node close to the key of elm to top + */ +#define RB_GENERATE(name, type, field, cmp) \ + RB_GENERATE_INTERNAL(name, type, field, cmp,) +#define RB_GENERATE_STATIC(name, type, field, cmp) \ + RB_GENERATE_INTERNAL(name, type, field, cmp, UV__UNUSED static) +#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr) \ +attr void \ +name##_RB_INSERT_COLOR(struct name *head, struct type *elm) \ +{ \ + struct type *parent, *gparent, *tmp; \ + while ((parent = RB_PARENT(elm, field)) != NULL && \ + RB_COLOR(parent, field) == RB_RED) { \ + gparent = RB_PARENT(parent, field); \ + if (parent == RB_LEFT(gparent, field)) { \ + tmp = RB_RIGHT(gparent, field); \ + if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ + RB_COLOR(tmp, field) = RB_BLACK; \ + RB_SET_BLACKRED(parent, gparent, field); \ + elm = gparent; \ + continue; \ + } \ + if (RB_RIGHT(parent, field) == elm) { \ + RB_ROTATE_LEFT(head, parent, tmp, field); \ + tmp = parent; \ + parent = elm; \ + elm = tmp; \ + } \ + RB_SET_BLACKRED(parent, gparent, field); \ + RB_ROTATE_RIGHT(head, gparent, tmp, field); \ + } else { \ + tmp = RB_LEFT(gparent, field); \ + if (tmp && RB_COLOR(tmp, field) == RB_RED) { \ + RB_COLOR(tmp, field) = RB_BLACK; \ + RB_SET_BLACKRED(parent, gparent, field); \ + elm = gparent; \ + continue; \ + } \ + if (RB_LEFT(parent, field) == elm) { \ + RB_ROTATE_RIGHT(head, parent, tmp, field); \ + tmp = parent; \ + parent = elm; \ + elm = tmp; \ + } \ + RB_SET_BLACKRED(parent, gparent, field); \ + RB_ROTATE_LEFT(head, gparent, tmp, field); \ + } \ + } \ + RB_COLOR(head->rbh_root, field) = RB_BLACK; \ +} \ + \ +attr void \ +name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, \ + struct type *elm) \ +{ \ + struct type *tmp; \ + while ((elm == NULL || RB_COLOR(elm, field) == RB_BLACK) && \ + elm != RB_ROOT(head)) { \ + if (RB_LEFT(parent, field) == elm) { \ + tmp = RB_RIGHT(parent, field); \ + if (RB_COLOR(tmp, field) == RB_RED) { \ + RB_SET_BLACKRED(tmp, parent, field); \ + RB_ROTATE_LEFT(head, parent, tmp, field); \ + tmp = RB_RIGHT(parent, field); \ + } \ + if ((RB_LEFT(tmp, field) == NULL || \ + RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) && \ + (RB_RIGHT(tmp, field) == NULL || \ + RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) { \ + RB_COLOR(tmp, field) = RB_RED; \ + elm = parent; \ + parent = RB_PARENT(elm, field); \ + } else { \ + if (RB_RIGHT(tmp, field) == NULL || \ + RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) { \ + struct type *oleft; \ + if ((oleft = RB_LEFT(tmp, field)) \ + != NULL) \ + RB_COLOR(oleft, field) = RB_BLACK; \ + RB_COLOR(tmp, field) = RB_RED; \ + RB_ROTATE_RIGHT(head, tmp, oleft, field); \ + tmp = RB_RIGHT(parent, field); \ + } \ + RB_COLOR(tmp, field) = RB_COLOR(parent, field); \ + RB_COLOR(parent, field) = RB_BLACK; \ + if (RB_RIGHT(tmp, field)) \ + RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK; \ + RB_ROTATE_LEFT(head, parent, tmp, field); \ + elm = RB_ROOT(head); \ + break; \ + } \ + } else { \ + tmp = RB_LEFT(parent, field); \ + if (RB_COLOR(tmp, field) == RB_RED) { \ + RB_SET_BLACKRED(tmp, parent, field); \ + RB_ROTATE_RIGHT(head, parent, tmp, field); \ + tmp = RB_LEFT(parent, field); \ + } \ + if ((RB_LEFT(tmp, field) == NULL || \ + RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) && \ + (RB_RIGHT(tmp, field) == NULL || \ + RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) { \ + RB_COLOR(tmp, field) = RB_RED; \ + elm = parent; \ + parent = RB_PARENT(elm, field); \ + } else { \ + if (RB_LEFT(tmp, field) == NULL || \ + RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) { \ + struct type *oright; \ + if ((oright = RB_RIGHT(tmp, field)) \ + != NULL) \ + RB_COLOR(oright, field) = RB_BLACK; \ + RB_COLOR(tmp, field) = RB_RED; \ + RB_ROTATE_LEFT(head, tmp, oright, field); \ + tmp = RB_LEFT(parent, field); \ + } \ + RB_COLOR(tmp, field) = RB_COLOR(parent, field); \ + RB_COLOR(parent, field) = RB_BLACK; \ + if (RB_LEFT(tmp, field)) \ + RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK; \ + RB_ROTATE_RIGHT(head, parent, tmp, field); \ + elm = RB_ROOT(head); \ + break; \ + } \ + } \ + } \ + if (elm) \ + RB_COLOR(elm, field) = RB_BLACK; \ +} \ + \ +attr struct type * \ +name##_RB_REMOVE(struct name *head, struct type *elm) \ +{ \ + struct type *child, *parent, *old = elm; \ + int color; \ + if (RB_LEFT(elm, field) == NULL) \ + child = RB_RIGHT(elm, field); \ + else if (RB_RIGHT(elm, field) == NULL) \ + child = RB_LEFT(elm, field); \ + else { \ + struct type *left; \ + elm = RB_RIGHT(elm, field); \ + while ((left = RB_LEFT(elm, field)) != NULL) \ + elm = left; \ + child = RB_RIGHT(elm, field); \ + parent = RB_PARENT(elm, field); \ + color = RB_COLOR(elm, field); \ + if (child) \ + RB_PARENT(child, field) = parent; \ + if (parent) { \ + if (RB_LEFT(parent, field) == elm) \ + RB_LEFT(parent, field) = child; \ + else \ + RB_RIGHT(parent, field) = child; \ + RB_AUGMENT(parent); \ + } else \ + RB_ROOT(head) = child; \ + if (RB_PARENT(elm, field) == old) \ + parent = elm; \ + (elm)->field = (old)->field; \ + if (RB_PARENT(old, field)) { \ + if (RB_LEFT(RB_PARENT(old, field), field) == old) \ + RB_LEFT(RB_PARENT(old, field), field) = elm; \ + else \ + RB_RIGHT(RB_PARENT(old, field), field) = elm; \ + RB_AUGMENT(RB_PARENT(old, field)); \ + } else \ + RB_ROOT(head) = elm; \ + RB_PARENT(RB_LEFT(old, field), field) = elm; \ + if (RB_RIGHT(old, field)) \ + RB_PARENT(RB_RIGHT(old, field), field) = elm; \ + if (parent) { \ + left = parent; \ + do { \ + RB_AUGMENT(left); \ + } while ((left = RB_PARENT(left, field)) != NULL); \ + } \ + goto color; \ + } \ + parent = RB_PARENT(elm, field); \ + color = RB_COLOR(elm, field); \ + if (child) \ + RB_PARENT(child, field) = parent; \ + if (parent) { \ + if (RB_LEFT(parent, field) == elm) \ + RB_LEFT(parent, field) = child; \ + else \ + RB_RIGHT(parent, field) = child; \ + RB_AUGMENT(parent); \ + } else \ + RB_ROOT(head) = child; \ +color: \ + if (color == RB_BLACK) \ + name##_RB_REMOVE_COLOR(head, parent, child); \ + return (old); \ +} \ + \ +/* Inserts a node into the RB tree */ \ +attr struct type * \ +name##_RB_INSERT(struct name *head, struct type *elm) \ +{ \ + struct type *tmp; \ + struct type *parent = NULL; \ + int comp = 0; \ + tmp = RB_ROOT(head); \ + while (tmp) { \ + parent = tmp; \ + comp = (cmp)(elm, parent); \ + if (comp < 0) \ + tmp = RB_LEFT(tmp, field); \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + RB_SET(elm, parent, field); \ + if (parent != NULL) { \ + if (comp < 0) \ + RB_LEFT(parent, field) = elm; \ + else \ + RB_RIGHT(parent, field) = elm; \ + RB_AUGMENT(parent); \ + } else \ + RB_ROOT(head) = elm; \ + name##_RB_INSERT_COLOR(head, elm); \ + return (NULL); \ +} \ + \ +/* Finds the node with the same key as elm */ \ +attr struct type * \ +name##_RB_FIND(struct name *head, struct type *elm) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + int comp; \ + while (tmp) { \ + comp = cmp(elm, tmp); \ + if (comp < 0) \ + tmp = RB_LEFT(tmp, field); \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + return (NULL); \ +} \ + \ +/* Finds the first node greater than or equal to the search key */ \ +attr struct type * \ +name##_RB_NFIND(struct name *head, struct type *elm) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + struct type *res = NULL; \ + int comp; \ + while (tmp) { \ + comp = cmp(elm, tmp); \ + if (comp < 0) { \ + res = tmp; \ + tmp = RB_LEFT(tmp, field); \ + } \ + else if (comp > 0) \ + tmp = RB_RIGHT(tmp, field); \ + else \ + return (tmp); \ + } \ + return (res); \ +} \ + \ +/* ARGSUSED */ \ +attr struct type * \ +name##_RB_NEXT(struct type *elm) \ +{ \ + if (RB_RIGHT(elm, field)) { \ + elm = RB_RIGHT(elm, field); \ + while (RB_LEFT(elm, field)) \ + elm = RB_LEFT(elm, field); \ + } else { \ + if (RB_PARENT(elm, field) && \ + (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + else { \ + while (RB_PARENT(elm, field) && \ + (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + elm = RB_PARENT(elm, field); \ + } \ + } \ + return (elm); \ +} \ + \ +/* ARGSUSED */ \ +attr struct type * \ +name##_RB_PREV(struct type *elm) \ +{ \ + if (RB_LEFT(elm, field)) { \ + elm = RB_LEFT(elm, field); \ + while (RB_RIGHT(elm, field)) \ + elm = RB_RIGHT(elm, field); \ + } else { \ + if (RB_PARENT(elm, field) && \ + (elm == RB_RIGHT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + else { \ + while (RB_PARENT(elm, field) && \ + (elm == RB_LEFT(RB_PARENT(elm, field), field))) \ + elm = RB_PARENT(elm, field); \ + elm = RB_PARENT(elm, field); \ + } \ + } \ + return (elm); \ +} \ + \ +attr struct type * \ +name##_RB_MINMAX(struct name *head, int val) \ +{ \ + struct type *tmp = RB_ROOT(head); \ + struct type *parent = NULL; \ + while (tmp) { \ + parent = tmp; \ + if (val < 0) \ + tmp = RB_LEFT(tmp, field); \ + else \ + tmp = RB_RIGHT(tmp, field); \ + } \ + return (parent); \ +} + +#define RB_NEGINF -1 +#define RB_INF 1 + +#define RB_INSERT(name, x, y) name##_RB_INSERT(x, y) +#define RB_REMOVE(name, x, y) name##_RB_REMOVE(x, y) +#define RB_FIND(name, x, y) name##_RB_FIND(x, y) +#define RB_NFIND(name, x, y) name##_RB_NFIND(x, y) +#define RB_NEXT(name, x, y) name##_RB_NEXT(y) +#define RB_PREV(name, x, y) name##_RB_PREV(y) +#define RB_MIN(name, x) name##_RB_MINMAX(x, RB_NEGINF) +#define RB_MAX(name, x) name##_RB_MINMAX(x, RB_INF) + +#define RB_FOREACH(x, name, head) \ + for ((x) = RB_MIN(name, head); \ + (x) != NULL; \ + (x) = name##_RB_NEXT(x)) + +#define RB_FOREACH_FROM(x, name, y) \ + for ((x) = (y); \ + ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_SAFE(x, name, head, y) \ + for ((x) = RB_MIN(name, head); \ + ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_REVERSE(x, name, head) \ + for ((x) = RB_MAX(name, head); \ + (x) != NULL; \ + (x) = name##_RB_PREV(x)) + +#define RB_FOREACH_REVERSE_FROM(x, name, y) \ + for ((x) = (y); \ + ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ + (x) = (y)) + +#define RB_FOREACH_REVERSE_SAFE(x, name, head, y) \ + for ((x) = RB_MAX(name, head); \ + ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL); \ + (x) = (y)) + +#endif /* UV_TREE_H_ */ diff --git a/lwnode/apps/sqlite3/deps/include/uv/unix.h b/lwnode/apps/sqlite3/deps/include/uv/unix.h new file mode 100644 index 0000000..e3cf7bd --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/unix.h @@ -0,0 +1,507 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_UNIX_H +#define UV_UNIX_H + +#include +#include +#include +#include + +#include +#include +#include +#include +#include /* MAXHOSTNAMELEN on Solaris */ + +#include +#include + +#if !defined(__MVS__) +#include +#include /* MAXHOSTNAMELEN on Linux and the BSDs */ +#endif +#include +#include + +#include "uv/threadpool.h" + +#if defined(__linux__) +# include "uv/linux.h" +#elif defined (__MVS__) +# include "uv/os390.h" +#elif defined(__PASE__) /* __PASE__ and _AIX are both defined on IBM i */ +# include "uv/posix.h" /* IBM i needs uv/posix.h, not uv/aix.h */ +#elif defined(_AIX) +# include "uv/aix.h" +#elif defined(__sun) +# include "uv/sunos.h" +#elif defined(__APPLE__) +# include "uv/darwin.h" +#elif defined(__DragonFly__) || \ + defined(__FreeBSD__) || \ + defined(__FreeBSD_kernel__) || \ + defined(__OpenBSD__) || \ + defined(__NetBSD__) +# include "uv/bsd.h" +#elif defined(__CYGWIN__) || \ + defined(__MSYS__) || \ + defined(__GNU__) +# include "uv/posix.h" +#elif defined(__HAIKU__) +# include "uv/posix.h" +#elif defined(__QNX__) +# include "uv/posix.h" +#endif + +#ifndef NI_MAXHOST +# define NI_MAXHOST 1025 +#endif + +#ifndef NI_MAXSERV +# define NI_MAXSERV 32 +#endif + +#ifndef UV_IO_PRIVATE_PLATFORM_FIELDS +# define UV_IO_PRIVATE_PLATFORM_FIELDS /* empty */ +#endif + +struct uv__io_s; +struct uv_loop_s; + +typedef void (*uv__io_cb)(struct uv_loop_s* loop, + struct uv__io_s* w, + unsigned int events); +typedef struct uv__io_s uv__io_t; + +struct uv__io_s { + uv__io_cb cb; + void* pending_queue[2]; + void* watcher_queue[2]; + unsigned int pevents; /* Pending event mask i.e. mask at next tick. */ + unsigned int events; /* Current event mask. */ + int fd; + UV_IO_PRIVATE_PLATFORM_FIELDS +}; + +#ifndef UV_PLATFORM_SEM_T +# define UV_PLATFORM_SEM_T sem_t +#endif + +#ifndef UV_PLATFORM_LOOP_FIELDS +# define UV_PLATFORM_LOOP_FIELDS /* empty */ +#endif + +#ifndef UV_PLATFORM_FS_EVENT_FIELDS +# define UV_PLATFORM_FS_EVENT_FIELDS /* empty */ +#endif + +#ifndef UV_STREAM_PRIVATE_PLATFORM_FIELDS +# define UV_STREAM_PRIVATE_PLATFORM_FIELDS /* empty */ +#endif + +/* Note: May be cast to struct iovec. See writev(2). */ +typedef struct uv_buf_t { + char* base; + size_t len; +} uv_buf_t; + +typedef int uv_file; +typedef int uv_os_sock_t; +typedef int uv_os_fd_t; +typedef pid_t uv_pid_t; + +#define UV_ONCE_INIT PTHREAD_ONCE_INIT + +typedef pthread_once_t uv_once_t; +typedef pthread_t uv_thread_t; +typedef pthread_mutex_t uv_mutex_t; +typedef pthread_rwlock_t uv_rwlock_t; +typedef UV_PLATFORM_SEM_T uv_sem_t; +typedef pthread_cond_t uv_cond_t; +typedef pthread_key_t uv_key_t; + +/* Note: guard clauses should match uv_barrier_init's in src/unix/thread.c. */ +#if defined(_AIX) || \ + defined(__OpenBSD__) || \ + !defined(PTHREAD_BARRIER_SERIAL_THREAD) +/* TODO(bnoordhuis) Merge into uv_barrier_t in v2. */ +struct _uv_barrier { + uv_mutex_t mutex; + uv_cond_t cond; + unsigned threshold; + unsigned in; + unsigned out; +}; + +typedef struct { + struct _uv_barrier* b; +# if defined(PTHREAD_BARRIER_SERIAL_THREAD) + /* TODO(bnoordhuis) Remove padding in v2. */ + char pad[sizeof(pthread_barrier_t) - sizeof(struct _uv_barrier*)]; +# endif +} uv_barrier_t; +#else +typedef pthread_barrier_t uv_barrier_t; +#endif + +/* Platform-specific definitions for uv_spawn support. */ +typedef gid_t uv_gid_t; +typedef uid_t uv_uid_t; + +typedef struct dirent uv__dirent_t; + +#define UV_DIR_PRIVATE_FIELDS \ + DIR* dir; + +#if defined(DT_UNKNOWN) +# define HAVE_DIRENT_TYPES +# if defined(DT_REG) +# define UV__DT_FILE DT_REG +# else +# define UV__DT_FILE -1 +# endif +# if defined(DT_DIR) +# define UV__DT_DIR DT_DIR +# else +# define UV__DT_DIR -2 +# endif +# if defined(DT_LNK) +# define UV__DT_LINK DT_LNK +# else +# define UV__DT_LINK -3 +# endif +# if defined(DT_FIFO) +# define UV__DT_FIFO DT_FIFO +# else +# define UV__DT_FIFO -4 +# endif +# if defined(DT_SOCK) +# define UV__DT_SOCKET DT_SOCK +# else +# define UV__DT_SOCKET -5 +# endif +# if defined(DT_CHR) +# define UV__DT_CHAR DT_CHR +# else +# define UV__DT_CHAR -6 +# endif +# if defined(DT_BLK) +# define UV__DT_BLOCK DT_BLK +# else +# define UV__DT_BLOCK -7 +# endif +#endif + +/* Platform-specific definitions for uv_dlopen support. */ +#define UV_DYNAMIC /* empty */ + +typedef struct { + void* handle; + char* errmsg; +} uv_lib_t; + +#define UV_LOOP_PRIVATE_FIELDS \ + unsigned long flags; \ + int backend_fd; \ + void* pending_queue[2]; \ + void* watcher_queue[2]; \ + uv__io_t** watchers; \ + unsigned int nwatchers; \ + unsigned int nfds; \ + void* wq[2]; \ + uv_mutex_t wq_mutex; \ + uv_async_t wq_async; \ + uv_rwlock_t cloexec_lock; \ + uv_handle_t* closing_handles; \ + void* process_handles[2]; \ + void* prepare_handles[2]; \ + void* check_handles[2]; \ + void* idle_handles[2]; \ + void* async_handles[2]; \ + void (*async_unused)(void); /* TODO(bnoordhuis) Remove in libuv v2. */ \ + uv__io_t async_io_watcher; \ + int async_wfd; \ + struct { \ + void* min; \ + unsigned int nelts; \ + } timer_heap; \ + uint64_t timer_counter; \ + uint64_t time; \ + int signal_pipefd[2]; \ + uv__io_t signal_io_watcher; \ + uv_signal_t child_watcher; \ + int emfile_fd; \ + UV_PLATFORM_LOOP_FIELDS \ + +#define UV_REQ_TYPE_PRIVATE /* empty */ + +#define UV_REQ_PRIVATE_FIELDS /* empty */ + +#define UV_PRIVATE_REQ_TYPES /* empty */ + +#define UV_WRITE_PRIVATE_FIELDS \ + void* queue[2]; \ + unsigned int write_index; \ + uv_buf_t* bufs; \ + unsigned int nbufs; \ + int error; \ + uv_buf_t bufsml[4]; \ + +#define UV_CONNECT_PRIVATE_FIELDS \ + void* queue[2]; \ + +#define UV_SHUTDOWN_PRIVATE_FIELDS /* empty */ + +#define UV_UDP_SEND_PRIVATE_FIELDS \ + void* queue[2]; \ + struct sockaddr_storage addr; \ + unsigned int nbufs; \ + uv_buf_t* bufs; \ + ssize_t status; \ + uv_udp_send_cb send_cb; \ + uv_buf_t bufsml[4]; \ + +#define UV_HANDLE_PRIVATE_FIELDS \ + uv_handle_t* next_closing; \ + unsigned int flags; \ + +#define UV_STREAM_PRIVATE_FIELDS \ + uv_connect_t *connect_req; \ + uv_shutdown_t *shutdown_req; \ + uv__io_t io_watcher; \ + void* write_queue[2]; \ + void* write_completed_queue[2]; \ + uv_connection_cb connection_cb; \ + int delayed_error; \ + int accepted_fd; \ + void* queued_fds; \ + UV_STREAM_PRIVATE_PLATFORM_FIELDS \ + +#define UV_TCP_PRIVATE_FIELDS /* empty */ + +#define UV_UDP_PRIVATE_FIELDS \ + uv_alloc_cb alloc_cb; \ + uv_udp_recv_cb recv_cb; \ + uv__io_t io_watcher; \ + void* write_queue[2]; \ + void* write_completed_queue[2]; \ + +#define UV_PIPE_PRIVATE_FIELDS \ + const char* pipe_fname; /* strdup'ed */ + +#define UV_POLL_PRIVATE_FIELDS \ + uv__io_t io_watcher; + +#define UV_PREPARE_PRIVATE_FIELDS \ + uv_prepare_cb prepare_cb; \ + void* queue[2]; \ + +#define UV_CHECK_PRIVATE_FIELDS \ + uv_check_cb check_cb; \ + void* queue[2]; \ + +#define UV_IDLE_PRIVATE_FIELDS \ + uv_idle_cb idle_cb; \ + void* queue[2]; \ + +#define UV_ASYNC_PRIVATE_FIELDS \ + uv_async_cb async_cb; \ + void* queue[2]; \ + int pending; \ + +#define UV_TIMER_PRIVATE_FIELDS \ + uv_timer_cb timer_cb; \ + void* heap_node[3]; \ + uint64_t timeout; \ + uint64_t repeat; \ + uint64_t start_id; + +#define UV_GETADDRINFO_PRIVATE_FIELDS \ + struct uv__work work_req; \ + uv_getaddrinfo_cb cb; \ + struct addrinfo* hints; \ + char* hostname; \ + char* service; \ + struct addrinfo* addrinfo; \ + int retcode; + +#define UV_GETNAMEINFO_PRIVATE_FIELDS \ + struct uv__work work_req; \ + uv_getnameinfo_cb getnameinfo_cb; \ + struct sockaddr_storage storage; \ + int flags; \ + char host[NI_MAXHOST]; \ + char service[NI_MAXSERV]; \ + int retcode; + +#define UV_PROCESS_PRIVATE_FIELDS \ + void* queue[2]; \ + int status; \ + +#define UV_FS_PRIVATE_FIELDS \ + const char *new_path; \ + uv_file file; \ + int flags; \ + mode_t mode; \ + unsigned int nbufs; \ + uv_buf_t* bufs; \ + off_t off; \ + uv_uid_t uid; \ + uv_gid_t gid; \ + double atime; \ + double mtime; \ + struct uv__work work_req; \ + uv_buf_t bufsml[4]; \ + +#define UV_WORK_PRIVATE_FIELDS \ + struct uv__work work_req; + +#define UV_TTY_PRIVATE_FIELDS \ + struct termios orig_termios; \ + int mode; + +#define UV_SIGNAL_PRIVATE_FIELDS \ + /* RB_ENTRY(uv_signal_s) tree_entry; */ \ + struct { \ + struct uv_signal_s* rbe_left; \ + struct uv_signal_s* rbe_right; \ + struct uv_signal_s* rbe_parent; \ + int rbe_color; \ + } tree_entry; \ + /* Use two counters here so we don have to fiddle with atomics. */ \ + unsigned int caught_signals; \ + unsigned int dispatched_signals; + +#define UV_FS_EVENT_PRIVATE_FIELDS \ + uv_fs_event_cb cb; \ + UV_PLATFORM_FS_EVENT_FIELDS \ + +/* fs open() flags supported on this platform: */ +#if defined(O_APPEND) +# define UV_FS_O_APPEND O_APPEND +#else +# define UV_FS_O_APPEND 0 +#endif +#if defined(O_CREAT) +# define UV_FS_O_CREAT O_CREAT +#else +# define UV_FS_O_CREAT 0 +#endif + +#if defined(__linux__) && defined(__arm__) +# define UV_FS_O_DIRECT 0x10000 +#elif defined(__linux__) && defined(__m68k__) +# define UV_FS_O_DIRECT 0x10000 +#elif defined(__linux__) && defined(__mips__) +# define UV_FS_O_DIRECT 0x08000 +#elif defined(__linux__) && defined(__powerpc__) +# define UV_FS_O_DIRECT 0x20000 +#elif defined(__linux__) && defined(__s390x__) +# define UV_FS_O_DIRECT 0x04000 +#elif defined(__linux__) && defined(__x86_64__) +# define UV_FS_O_DIRECT 0x04000 +#elif defined(O_DIRECT) +# define UV_FS_O_DIRECT O_DIRECT +#else +# define UV_FS_O_DIRECT 0 +#endif + +#if defined(O_DIRECTORY) +# define UV_FS_O_DIRECTORY O_DIRECTORY +#else +# define UV_FS_O_DIRECTORY 0 +#endif +#if defined(O_DSYNC) +# define UV_FS_O_DSYNC O_DSYNC +#else +# define UV_FS_O_DSYNC 0 +#endif +#if defined(O_EXCL) +# define UV_FS_O_EXCL O_EXCL +#else +# define UV_FS_O_EXCL 0 +#endif +#if defined(O_EXLOCK) +# define UV_FS_O_EXLOCK O_EXLOCK +#else +# define UV_FS_O_EXLOCK 0 +#endif +#if defined(O_NOATIME) +# define UV_FS_O_NOATIME O_NOATIME +#else +# define UV_FS_O_NOATIME 0 +#endif +#if defined(O_NOCTTY) +# define UV_FS_O_NOCTTY O_NOCTTY +#else +# define UV_FS_O_NOCTTY 0 +#endif +#if defined(O_NOFOLLOW) +# define UV_FS_O_NOFOLLOW O_NOFOLLOW +#else +# define UV_FS_O_NOFOLLOW 0 +#endif +#if defined(O_NONBLOCK) +# define UV_FS_O_NONBLOCK O_NONBLOCK +#else +# define UV_FS_O_NONBLOCK 0 +#endif +#if defined(O_RDONLY) +# define UV_FS_O_RDONLY O_RDONLY +#else +# define UV_FS_O_RDONLY 0 +#endif +#if defined(O_RDWR) +# define UV_FS_O_RDWR O_RDWR +#else +# define UV_FS_O_RDWR 0 +#endif +#if defined(O_SYMLINK) +# define UV_FS_O_SYMLINK O_SYMLINK +#else +# define UV_FS_O_SYMLINK 0 +#endif +#if defined(O_SYNC) +# define UV_FS_O_SYNC O_SYNC +#else +# define UV_FS_O_SYNC 0 +#endif +#if defined(O_TRUNC) +# define UV_FS_O_TRUNC O_TRUNC +#else +# define UV_FS_O_TRUNC 0 +#endif +#if defined(O_WRONLY) +# define UV_FS_O_WRONLY O_WRONLY +#else +# define UV_FS_O_WRONLY 0 +#endif + +/* fs open() flags supported on other platforms: */ +#define UV_FS_O_FILEMAP 0 +#define UV_FS_O_RANDOM 0 +#define UV_FS_O_SHORT_LIVED 0 +#define UV_FS_O_SEQUENTIAL 0 +#define UV_FS_O_TEMPORARY 0 + +#endif /* UV_UNIX_H */ diff --git a/lwnode/apps/sqlite3/deps/include/uv/version.h b/lwnode/apps/sqlite3/deps/include/uv/version.h new file mode 100644 index 0000000..5272008 --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/version.h @@ -0,0 +1,43 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef UV_VERSION_H +#define UV_VERSION_H + + /* + * Versions with the same major number are ABI stable. API is allowed to + * evolve between minor releases, but only in a backwards compatible way. + * Make sure you update the -soname directives in configure.ac + * whenever you bump UV_VERSION_MAJOR or UV_VERSION_MINOR (but + * not UV_VERSION_PATCH.) + */ + +#define UV_VERSION_MAJOR 1 +#define UV_VERSION_MINOR 40 +#define UV_VERSION_PATCH 0 +#define UV_VERSION_IS_RELEASE 1 +#define UV_VERSION_SUFFIX "" + +#define UV_VERSION_HEX ((UV_VERSION_MAJOR << 16) | \ + (UV_VERSION_MINOR << 8) | \ + (UV_VERSION_PATCH)) + +#endif /* UV_VERSION_H */ diff --git a/lwnode/apps/sqlite3/deps/include/uv/win.h b/lwnode/apps/sqlite3/deps/include/uv/win.h new file mode 100644 index 0000000..f5f1d3a --- /dev/null +++ b/lwnode/apps/sqlite3/deps/include/uv/win.h @@ -0,0 +1,691 @@ +/* Copyright Joyent, Inc. and other Node contributors. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef _WIN32_WINNT +# define _WIN32_WINNT 0x0600 +#endif + +#if !defined(_SSIZE_T_) && !defined(_SSIZE_T_DEFINED) +typedef intptr_t ssize_t; +# define SSIZE_MAX INTPTR_MAX +# define _SSIZE_T_ +# define _SSIZE_T_DEFINED +#endif + +#include + +#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) +typedef struct pollfd { + SOCKET fd; + short events; + short revents; +} WSAPOLLFD, *PWSAPOLLFD, *LPWSAPOLLFD; +#endif + +#ifndef LOCALE_INVARIANT +# define LOCALE_INVARIANT 0x007f +#endif + +#include +#include +#include + +#include +#include +#include +#include + +#if defined(_MSC_VER) && _MSC_VER < 1600 +# include "uv/stdint-msvc2008.h" +#else +# include +#endif + +#include "uv/tree.h" +#include "uv/threadpool.h" + +#define MAX_PIPENAME_LEN 256 + +#ifndef S_IFLNK +# define S_IFLNK 0xA000 +#endif + +/* Additional signals supported by uv_signal and or uv_kill. The CRT defines + * the following signals already: + * + * #define SIGINT 2 + * #define SIGILL 4 + * #define SIGABRT_COMPAT 6 + * #define SIGFPE 8 + * #define SIGSEGV 11 + * #define SIGTERM 15 + * #define SIGBREAK 21 + * #define SIGABRT 22 + * + * The additional signals have values that are common on other Unix + * variants (Linux and Darwin) + */ +#define SIGHUP 1 +#define SIGKILL 9 +#define SIGWINCH 28 + +/* Redefine NSIG to take SIGWINCH into consideration */ +#if defined(NSIG) && NSIG <= SIGWINCH +# undef NSIG +#endif +#ifndef NSIG +# define NSIG SIGWINCH + 1 +#endif + +/* The CRT defines SIGABRT_COMPAT as 6, which equals SIGABRT on many unix-like + * platforms. However MinGW doesn't define it, so we do. */ +#ifndef SIGABRT_COMPAT +# define SIGABRT_COMPAT 6 +#endif + +/* + * Guids and typedefs for winsock extension functions + * Mingw32 doesn't have these :-( + */ +#ifndef WSAID_ACCEPTEX +# define WSAID_ACCEPTEX \ + {0xb5367df1, 0xcbac, 0x11cf, \ + {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} + +# define WSAID_CONNECTEX \ + {0x25a207b9, 0xddf3, 0x4660, \ + {0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e}} + +# define WSAID_GETACCEPTEXSOCKADDRS \ + {0xb5367df2, 0xcbac, 0x11cf, \ + {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} + +# define WSAID_DISCONNECTEX \ + {0x7fda2e11, 0x8630, 0x436f, \ + {0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}} + +# define WSAID_TRANSMITFILE \ + {0xb5367df0, 0xcbac, 0x11cf, \ + {0x95, 0xca, 0x00, 0x80, 0x5f, 0x48, 0xa1, 0x92}} + + typedef BOOL (PASCAL *LPFN_ACCEPTEX) + (SOCKET sListenSocket, + SOCKET sAcceptSocket, + PVOID lpOutputBuffer, + DWORD dwReceiveDataLength, + DWORD dwLocalAddressLength, + DWORD dwRemoteAddressLength, + LPDWORD lpdwBytesReceived, + LPOVERLAPPED lpOverlapped); + + typedef BOOL (PASCAL *LPFN_CONNECTEX) + (SOCKET s, + const struct sockaddr* name, + int namelen, + PVOID lpSendBuffer, + DWORD dwSendDataLength, + LPDWORD lpdwBytesSent, + LPOVERLAPPED lpOverlapped); + + typedef void (PASCAL *LPFN_GETACCEPTEXSOCKADDRS) + (PVOID lpOutputBuffer, + DWORD dwReceiveDataLength, + DWORD dwLocalAddressLength, + DWORD dwRemoteAddressLength, + LPSOCKADDR* LocalSockaddr, + LPINT LocalSockaddrLength, + LPSOCKADDR* RemoteSockaddr, + LPINT RemoteSockaddrLength); + + typedef BOOL (PASCAL *LPFN_DISCONNECTEX) + (SOCKET hSocket, + LPOVERLAPPED lpOverlapped, + DWORD dwFlags, + DWORD reserved); + + typedef BOOL (PASCAL *LPFN_TRANSMITFILE) + (SOCKET hSocket, + HANDLE hFile, + DWORD nNumberOfBytesToWrite, + DWORD nNumberOfBytesPerSend, + LPOVERLAPPED lpOverlapped, + LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, + DWORD dwFlags); + + typedef PVOID RTL_SRWLOCK; + typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK; +#endif + +typedef int (WSAAPI* LPFN_WSARECV) + (SOCKET socket, + LPWSABUF buffers, + DWORD buffer_count, + LPDWORD bytes, + LPDWORD flags, + LPWSAOVERLAPPED overlapped, + LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); + +typedef int (WSAAPI* LPFN_WSARECVFROM) + (SOCKET socket, + LPWSABUF buffers, + DWORD buffer_count, + LPDWORD bytes, + LPDWORD flags, + struct sockaddr* addr, + LPINT addr_len, + LPWSAOVERLAPPED overlapped, + LPWSAOVERLAPPED_COMPLETION_ROUTINE completion_routine); + +#ifndef _NTDEF_ + typedef LONG NTSTATUS; + typedef NTSTATUS *PNTSTATUS; +#endif + +#ifndef RTL_CONDITION_VARIABLE_INIT + typedef PVOID CONDITION_VARIABLE, *PCONDITION_VARIABLE; +#endif + +typedef struct _AFD_POLL_HANDLE_INFO { + HANDLE Handle; + ULONG Events; + NTSTATUS Status; +} AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO; + +typedef struct _AFD_POLL_INFO { + LARGE_INTEGER Timeout; + ULONG NumberOfHandles; + ULONG Exclusive; + AFD_POLL_HANDLE_INFO Handles[1]; +} AFD_POLL_INFO, *PAFD_POLL_INFO; + +#define UV_MSAFD_PROVIDER_COUNT 3 + + +/** + * It should be possible to cast uv_buf_t[] to WSABUF[] + * see http://msdn.microsoft.com/en-us/library/ms741542(v=vs.85).aspx + */ +typedef struct uv_buf_t { + ULONG len; + char* base; +} uv_buf_t; + +typedef int uv_file; +typedef SOCKET uv_os_sock_t; +typedef HANDLE uv_os_fd_t; +typedef int uv_pid_t; + +typedef HANDLE uv_thread_t; + +typedef HANDLE uv_sem_t; + +typedef CRITICAL_SECTION uv_mutex_t; + +/* This condition variable implementation is based on the SetEvent solution + * (section 3.2) at http://www.cs.wustl.edu/~schmidt/win32-cv-1.html + * We could not use the SignalObjectAndWait solution (section 3.4) because + * it want the 2nd argument (type uv_mutex_t) of uv_cond_wait() and + * uv_cond_timedwait() to be HANDLEs, but we use CRITICAL_SECTIONs. + */ + +typedef union { + CONDITION_VARIABLE cond_var; + struct { + unsigned int waiters_count; + CRITICAL_SECTION waiters_count_lock; + HANDLE signal_event; + HANDLE broadcast_event; + } unused_; /* TODO: retained for ABI compatibility; remove me in v2.x. */ +} uv_cond_t; + +typedef union { + struct { + unsigned int num_readers_; + CRITICAL_SECTION num_readers_lock_; + HANDLE write_semaphore_; + } state_; + /* TODO: remove me in v2.x. */ + struct { + SRWLOCK unused_; + } unused1_; + /* TODO: remove me in v2.x. */ + struct { + uv_mutex_t unused1_; + uv_mutex_t unused2_; + } unused2_; +} uv_rwlock_t; + +typedef struct { + unsigned int n; + unsigned int count; + uv_mutex_t mutex; + uv_sem_t turnstile1; + uv_sem_t turnstile2; +} uv_barrier_t; + +typedef struct { + DWORD tls_index; +} uv_key_t; + +#define UV_ONCE_INIT { 0, NULL } + +typedef struct uv_once_s { + unsigned char ran; + HANDLE event; +} uv_once_t; + +/* Platform-specific definitions for uv_spawn support. */ +typedef unsigned char uv_uid_t; +typedef unsigned char uv_gid_t; + +typedef struct uv__dirent_s { + int d_type; + char d_name[1]; +} uv__dirent_t; + +#define UV_DIR_PRIVATE_FIELDS \ + HANDLE dir_handle; \ + WIN32_FIND_DATAW find_data; \ + BOOL need_find_call; + +#define HAVE_DIRENT_TYPES +#define UV__DT_DIR UV_DIRENT_DIR +#define UV__DT_FILE UV_DIRENT_FILE +#define UV__DT_LINK UV_DIRENT_LINK +#define UV__DT_FIFO UV_DIRENT_FIFO +#define UV__DT_SOCKET UV_DIRENT_SOCKET +#define UV__DT_CHAR UV_DIRENT_CHAR +#define UV__DT_BLOCK UV_DIRENT_BLOCK + +/* Platform-specific definitions for uv_dlopen support. */ +#define UV_DYNAMIC FAR WINAPI +typedef struct { + HMODULE handle; + char* errmsg; +} uv_lib_t; + +#define UV_LOOP_PRIVATE_FIELDS \ + /* The loop's I/O completion port */ \ + HANDLE iocp; \ + /* The current time according to the event loop. in msecs. */ \ + uint64_t time; \ + /* Tail of a single-linked circular queue of pending reqs. If the queue */ \ + /* is empty, tail_ is NULL. If there is only one item, */ \ + /* tail_->next_req == tail_ */ \ + uv_req_t* pending_reqs_tail; \ + /* Head of a single-linked list of closed handles */ \ + uv_handle_t* endgame_handles; \ + /* TODO(bnoordhuis) Stop heap-allocating |timer_heap| in libuv v2.x. */ \ + void* timer_heap; \ + /* Lists of active loop (prepare / check / idle) watchers */ \ + uv_prepare_t* prepare_handles; \ + uv_check_t* check_handles; \ + uv_idle_t* idle_handles; \ + /* This pointer will refer to the prepare/check/idle handle whose */ \ + /* callback is scheduled to be called next. This is needed to allow */ \ + /* safe removal from one of the lists above while that list being */ \ + /* iterated over. */ \ + uv_prepare_t* next_prepare_handle; \ + uv_check_t* next_check_handle; \ + uv_idle_t* next_idle_handle; \ + /* This handle holds the peer sockets for the fast variant of uv_poll_t */ \ + SOCKET poll_peer_sockets[UV_MSAFD_PROVIDER_COUNT]; \ + /* Counter to keep track of active tcp streams */ \ + unsigned int active_tcp_streams; \ + /* Counter to keep track of active udp streams */ \ + unsigned int active_udp_streams; \ + /* Counter to started timer */ \ + uint64_t timer_counter; \ + /* Threadpool */ \ + void* wq[2]; \ + uv_mutex_t wq_mutex; \ + uv_async_t wq_async; + +#define UV_REQ_TYPE_PRIVATE \ + /* TODO: remove the req suffix */ \ + UV_ACCEPT, \ + UV_FS_EVENT_REQ, \ + UV_POLL_REQ, \ + UV_PROCESS_EXIT, \ + UV_READ, \ + UV_UDP_RECV, \ + UV_WAKEUP, \ + UV_SIGNAL_REQ, + +#define UV_REQ_PRIVATE_FIELDS \ + union { \ + /* Used by I/O operations */ \ + struct { \ + OVERLAPPED overlapped; \ + size_t queued_bytes; \ + } io; \ + } u; \ + struct uv_req_s* next_req; + +#define UV_WRITE_PRIVATE_FIELDS \ + int coalesced; \ + uv_buf_t write_buffer; \ + HANDLE event_handle; \ + HANDLE wait_handle; + +#define UV_CONNECT_PRIVATE_FIELDS \ + /* empty */ + +#define UV_SHUTDOWN_PRIVATE_FIELDS \ + /* empty */ + +#define UV_UDP_SEND_PRIVATE_FIELDS \ + /* empty */ + +#define UV_PRIVATE_REQ_TYPES \ + typedef struct uv_pipe_accept_s { \ + UV_REQ_FIELDS \ + HANDLE pipeHandle; \ + struct uv_pipe_accept_s* next_pending; \ + } uv_pipe_accept_t; \ + \ + typedef struct uv_tcp_accept_s { \ + UV_REQ_FIELDS \ + SOCKET accept_socket; \ + char accept_buffer[sizeof(struct sockaddr_storage) * 2 + 32]; \ + HANDLE event_handle; \ + HANDLE wait_handle; \ + struct uv_tcp_accept_s* next_pending; \ + } uv_tcp_accept_t; \ + \ + typedef struct uv_read_s { \ + UV_REQ_FIELDS \ + HANDLE event_handle; \ + HANDLE wait_handle; \ + } uv_read_t; + +#define uv_stream_connection_fields \ + unsigned int write_reqs_pending; \ + uv_shutdown_t* shutdown_req; + +#define uv_stream_server_fields \ + uv_connection_cb connection_cb; + +#define UV_STREAM_PRIVATE_FIELDS \ + unsigned int reqs_pending; \ + int activecnt; \ + uv_read_t read_req; \ + union { \ + struct { uv_stream_connection_fields } conn; \ + struct { uv_stream_server_fields } serv; \ + } stream; + +#define uv_tcp_server_fields \ + uv_tcp_accept_t* accept_reqs; \ + unsigned int processed_accepts; \ + uv_tcp_accept_t* pending_accepts; \ + LPFN_ACCEPTEX func_acceptex; + +#define uv_tcp_connection_fields \ + uv_buf_t read_buffer; \ + LPFN_CONNECTEX func_connectex; + +#define UV_TCP_PRIVATE_FIELDS \ + SOCKET socket; \ + int delayed_error; \ + union { \ + struct { uv_tcp_server_fields } serv; \ + struct { uv_tcp_connection_fields } conn; \ + } tcp; + +#define UV_UDP_PRIVATE_FIELDS \ + SOCKET socket; \ + unsigned int reqs_pending; \ + int activecnt; \ + uv_req_t recv_req; \ + uv_buf_t recv_buffer; \ + struct sockaddr_storage recv_from; \ + int recv_from_len; \ + uv_udp_recv_cb recv_cb; \ + uv_alloc_cb alloc_cb; \ + LPFN_WSARECV func_wsarecv; \ + LPFN_WSARECVFROM func_wsarecvfrom; + +#define uv_pipe_server_fields \ + int pending_instances; \ + uv_pipe_accept_t* accept_reqs; \ + uv_pipe_accept_t* pending_accepts; + +#define uv_pipe_connection_fields \ + uv_timer_t* eof_timer; \ + uv_write_t dummy; /* TODO: retained for ABI compat; remove this in v2.x. */ \ + DWORD ipc_remote_pid; \ + union { \ + uint32_t payload_remaining; \ + uint64_t dummy; /* TODO: retained for ABI compat; remove this in v2.x. */ \ + } ipc_data_frame; \ + void* ipc_xfer_queue[2]; \ + int ipc_xfer_queue_length; \ + uv_write_t* non_overlapped_writes_tail; \ + CRITICAL_SECTION readfile_thread_lock; \ + volatile HANDLE readfile_thread_handle; + +#define UV_PIPE_PRIVATE_FIELDS \ + HANDLE handle; \ + WCHAR* name; \ + union { \ + struct { uv_pipe_server_fields } serv; \ + struct { uv_pipe_connection_fields } conn; \ + } pipe; + +/* TODO: put the parser states in an union - TTY handles are always half-duplex + * so read-state can safely overlap write-state. */ +#define UV_TTY_PRIVATE_FIELDS \ + HANDLE handle; \ + union { \ + struct { \ + /* Used for readable TTY handles */ \ + /* TODO: remove me in v2.x. */ \ + HANDLE unused_; \ + uv_buf_t read_line_buffer; \ + HANDLE read_raw_wait; \ + /* Fields used for translating win keystrokes into vt100 characters */ \ + char last_key[8]; \ + unsigned char last_key_offset; \ + unsigned char last_key_len; \ + WCHAR last_utf16_high_surrogate; \ + INPUT_RECORD last_input_record; \ + } rd; \ + struct { \ + /* Used for writable TTY handles */ \ + /* utf8-to-utf16 conversion state */ \ + unsigned int utf8_codepoint; \ + unsigned char utf8_bytes_left; \ + /* eol conversion state */ \ + unsigned char previous_eol; \ + /* ansi parser state */ \ + unsigned short ansi_parser_state; \ + unsigned char ansi_csi_argc; \ + unsigned short ansi_csi_argv[4]; \ + COORD saved_position; \ + WORD saved_attributes; \ + } wr; \ + } tty; + +#define UV_POLL_PRIVATE_FIELDS \ + SOCKET socket; \ + /* Used in fast mode */ \ + SOCKET peer_socket; \ + AFD_POLL_INFO afd_poll_info_1; \ + AFD_POLL_INFO afd_poll_info_2; \ + /* Used in fast and slow mode. */ \ + uv_req_t poll_req_1; \ + uv_req_t poll_req_2; \ + unsigned char submitted_events_1; \ + unsigned char submitted_events_2; \ + unsigned char mask_events_1; \ + unsigned char mask_events_2; \ + unsigned char events; + +#define UV_TIMER_PRIVATE_FIELDS \ + void* heap_node[3]; \ + int unused; \ + uint64_t timeout; \ + uint64_t repeat; \ + uint64_t start_id; \ + uv_timer_cb timer_cb; + +#define UV_ASYNC_PRIVATE_FIELDS \ + struct uv_req_s async_req; \ + uv_async_cb async_cb; \ + /* char to avoid alignment issues */ \ + char volatile async_sent; + +#define UV_PREPARE_PRIVATE_FIELDS \ + uv_prepare_t* prepare_prev; \ + uv_prepare_t* prepare_next; \ + uv_prepare_cb prepare_cb; + +#define UV_CHECK_PRIVATE_FIELDS \ + uv_check_t* check_prev; \ + uv_check_t* check_next; \ + uv_check_cb check_cb; + +#define UV_IDLE_PRIVATE_FIELDS \ + uv_idle_t* idle_prev; \ + uv_idle_t* idle_next; \ + uv_idle_cb idle_cb; + +#define UV_HANDLE_PRIVATE_FIELDS \ + uv_handle_t* endgame_next; \ + unsigned int flags; + +#define UV_GETADDRINFO_PRIVATE_FIELDS \ + struct uv__work work_req; \ + uv_getaddrinfo_cb getaddrinfo_cb; \ + void* alloc; \ + WCHAR* node; \ + WCHAR* service; \ + /* The addrinfoW field is used to store a pointer to the hints, and */ \ + /* later on to store the result of GetAddrInfoW. The final result will */ \ + /* be converted to struct addrinfo* and stored in the addrinfo field. */ \ + struct addrinfoW* addrinfow; \ + struct addrinfo* addrinfo; \ + int retcode; + +#define UV_GETNAMEINFO_PRIVATE_FIELDS \ + struct uv__work work_req; \ + uv_getnameinfo_cb getnameinfo_cb; \ + struct sockaddr_storage storage; \ + int flags; \ + char host[NI_MAXHOST]; \ + char service[NI_MAXSERV]; \ + int retcode; + +#define UV_PROCESS_PRIVATE_FIELDS \ + struct uv_process_exit_s { \ + UV_REQ_FIELDS \ + } exit_req; \ + BYTE* child_stdio_buffer; \ + int exit_signal; \ + HANDLE wait_handle; \ + HANDLE process_handle; \ + volatile char exit_cb_pending; + +#define UV_FS_PRIVATE_FIELDS \ + struct uv__work work_req; \ + int flags; \ + DWORD sys_errno_; \ + union { \ + /* TODO: remove me in 0.9. */ \ + WCHAR* pathw; \ + int fd; \ + } file; \ + union { \ + struct { \ + int mode; \ + WCHAR* new_pathw; \ + int file_flags; \ + int fd_out; \ + unsigned int nbufs; \ + uv_buf_t* bufs; \ + int64_t offset; \ + uv_buf_t bufsml[4]; \ + } info; \ + struct { \ + double atime; \ + double mtime; \ + } time; \ + } fs; + +#define UV_WORK_PRIVATE_FIELDS \ + struct uv__work work_req; + +#define UV_FS_EVENT_PRIVATE_FIELDS \ + struct uv_fs_event_req_s { \ + UV_REQ_FIELDS \ + } req; \ + HANDLE dir_handle; \ + int req_pending; \ + uv_fs_event_cb cb; \ + WCHAR* filew; \ + WCHAR* short_filew; \ + WCHAR* dirw; \ + char* buffer; + +#define UV_SIGNAL_PRIVATE_FIELDS \ + RB_ENTRY(uv_signal_s) tree_entry; \ + struct uv_req_s signal_req; \ + unsigned long pending_signum; + +#ifndef F_OK +#define F_OK 0 +#endif +#ifndef R_OK +#define R_OK 4 +#endif +#ifndef W_OK +#define W_OK 2 +#endif +#ifndef X_OK +#define X_OK 1 +#endif + +/* fs open() flags supported on this platform: */ +#define UV_FS_O_APPEND _O_APPEND +#define UV_FS_O_CREAT _O_CREAT +#define UV_FS_O_EXCL _O_EXCL +#define UV_FS_O_FILEMAP 0x20000000 +#define UV_FS_O_RANDOM _O_RANDOM +#define UV_FS_O_RDONLY _O_RDONLY +#define UV_FS_O_RDWR _O_RDWR +#define UV_FS_O_SEQUENTIAL _O_SEQUENTIAL +#define UV_FS_O_SHORT_LIVED _O_SHORT_LIVED +#define UV_FS_O_TEMPORARY _O_TEMPORARY +#define UV_FS_O_TRUNC _O_TRUNC +#define UV_FS_O_WRONLY _O_WRONLY + +/* fs open() flags supported on other platforms (or mapped on this platform): */ +#define UV_FS_O_DIRECT 0x02000000 /* FILE_FLAG_NO_BUFFERING */ +#define UV_FS_O_DIRECTORY 0 +#define UV_FS_O_DSYNC 0x04000000 /* FILE_FLAG_WRITE_THROUGH */ +#define UV_FS_O_EXLOCK 0x10000000 /* EXCLUSIVE SHARING MODE */ +#define UV_FS_O_NOATIME 0 +#define UV_FS_O_NOCTTY 0 +#define UV_FS_O_NOFOLLOW 0 +#define UV_FS_O_NONBLOCK 0 +#define UV_FS_O_SYMLINK 0 +#define UV_FS_O_SYNC 0x08000000 /* FILE_FLAG_WRITE_THROUGH */ diff --git a/lwnode/apps/sqlite3/deps/lwnode/lwnode b/lwnode/apps/sqlite3/deps/lwnode/lwnode new file mode 100755 index 0000000000000000000000000000000000000000..4ca68f04f4e09db6d92a65512cde0f460fc1ae89 GIT binary patch literal 24003480 zcma&O4Rl+@wfDVeG?GWMl8j`>oAe#UVQ0_=k93=!Q8$$!7R56Ac2-HwY zq2>0DWZB5ZfMNm-6k6FN5GeE-E^UF^57{v^q|h2lfkJy50<^THEp6}Z2mN~gCn)Ro zdDeQ?diToDd(P3(IrFh+&z_m1{M-7?J)AKY)r8aO#GG`x|Iit8=r7ThwO1ZG?Hn5F zCLjK`QyY13>^^kP`Na9m{2w~O4;|8BE#E&R=YawY*FGQS21m}ZaTGNl`uo57@WUPL zJnw(S)ROP(TaKAMbbMG7=|jiP_nf?DR=xjuW|ca0%fmW6dgwA*{PX+z@b{eTIp52k z`2P2@C%*r^!`jyJe^?(bpHnu6$=c_W+~CMLHjbk7p}+sDoogMb15Wz?l~3myN8;}* zI{dusTh|Oa-%I@Y-b0@x{`|)Op>O!jq2khEefW93_@493|G%PY7xvYj_y5Z0Um>bmZeR-LqF^(Q{Qy6aH6o%=i2ZaC|lLpL~F z{~AY5oTyF>6o`~fIPE|%}yU3`phFL|LmQ|{3 zacr&P+SnD=ba511lME9jdC*XPyQuFV+MO6r@G-q&ta>OPyNDu6p{h3$7b_>?mHvb= z#I#_3E_5aThF8-WdP}N9YLpi>C(oq(N<}Lq#oE@pWLi@M1!T%6ZgKesIx5;$NGmda znZbE-YaNiN3$lT9Qd6tEfOcNh7CtNAmo`KdD;K0CUhyHP3>A)2PV#7TJ!QEuvjwiQ zR*o4P=}WL>f@z}V$Y=l!swpGN)m*))XBCSYDl^8(YLS&<#%A@^Bn9s`bPaOy=(s&0 zy*WuHYD3(zq~hXId%A~sAkFEfh$&o_Pp{!8kW7^Dc%nD&GMr`1&*hAygb{I?a(N## zWZFqlL=ul{MjQ223JoV*SsE?}7!?i04S&jQURfom#LZ^0{=5 zNEtMj47*5XZ)Yi>a8sEmg@LWY4M@-8% z%7Th4vBQPhDa-`4AhCfbJ!lh}3uXtQsNk(oWd%b8Sv-v8qF!%`2ld1U^Qx1n6xkFm zimIr)ZBd5PG-1~-woPp|LOVtf<$f{J>PAg7(h@nfq-GV#G~aUH{Mp;78pc&+xZ)8% zi*b$z%N84{wJqEor&uV}&u|C9NiQ^=wdaYgEPorRXLKYU{(ejB zNMn4dWPgual_jT4g>BQGrpa+jnh(Nf97QnQEPPC^#TDixELnk@WleaaQ9JLM_jsrH z&kw+U{iBt}mOw66u)3aXi8CER)2`Pt93b)78#@N=>;R?RX>@TiFGOD~55~|S<>w!) zmeskLT}p6YbquDZ^a~7b4PGlFwIMR)OY*!R=HTp5fNas+nD7me%}AJ{&^t)7DzQK| zjamvt(Xd{x6+Tggm!T1Lko*DY2nSf{%{mu1}IFn&e3Q_CTEO3$QptBcs?<8sise zWnz`3W8x{_6F5 zQM72#=J7RriR^lGAWvXthiIYw;`RE{s~LnPJnb)INHpXtCFsojgsH%Z-5g_j3Ls81z)6bQ(mT#N{(FVITscLpSBpW+1*W`e5) zW03<}Nd_ueEd>TuCbB8v(te)Wmn0rFobd)+Qj>%=6sabPHaCh6O%e8dd0d>057VSC z^E^zGQjKb>Y(l54zok%)ZJX0Buzlq9MQSo`zkPfoYuGzZb=)@f1>NT4! z1(dmm)}iMWDP#L1p^J>HcV`&w;A zQ-|7tOIS{F(anYovCPI2?I|A_J1r$oHmEbr${QpSN#DDaF}+Gp+v*&{FDoQbCR|Y z%qc`CN^~0^iwGE~$q!NJ00Jb8AdXu^M~MWest^H^N$xTnp^H%Kd@kERl1Oej^I=zJ zBOHj5b)gH!D&?%>#|3d_@g%fMQVBQF(TFO%G>t5ZEHX%b{dhoC)v}P=&MVu7_95e* zq{p~yvhmH^OWKw>OR2O#ZfP~LU{17@?+J)1a#X&lE}|Q(J|B)>JLO?hiY^GwE3cxQ zbL_8P&}H17`WMK`K1RYWDDBb(L$J%FdI6q(`yF>x&&Z+osgtx#CgQ0R8ceiG+Rco@ zO^vKH=bW+B>*m$A2%_JVB)>;d%CN|hiKTYU8G9@IRX$a;?RP7}2&7Twu~9X#|EdX% z19^6EG?dPHPbu+?_9)Jjq=-d77)(o4z+BKaqTfbKzDeGL$9Q<5H}B5J5~w>084v0W z0~BpDBOeb{-Ba|S_ki1Ng+ zB7;>^#TQU_8BT?|OI{Q&MXCe+lntstv4!qSdeNiezKlwv>YeaI?^U5(gHNIPG3X*} zjF)o4<4PCd=9i%OMPl9Z)#7UQ))QcQ`C z5V14WV+gL0{Lq?0fyi{44Dzl1D6i6-zn%<)o z8*uD}Y$!s44zyb1ve|AJOeh=frD$4?706Eu?XtwSPI+L~vQfvBM{e=Ak8jm2Nmj7| z@-V3+m&ocqvzBPqws~Xzcq$}{8O)RrrXuK8y5es~V+zz2jiWEt%~pHm^E6LS8LeEj zA60F8c(0vC6|+s11hMkl(Z>`znHnF(cmOl5z@7q^P}Grq` zOpRvA94z=*N1^Iwo0*SePT0Xx2=+xWt% zMKmjB&1$5?tq5yj!o<8R;W8`kf5v=`yeGNjuYPPJ?Q8!#IK_e}y~C z4)VJc)-uqR@TxT;$b$mj)Mc{qFvda>$Z`@-Uye%!e4|NV#Fs8FhL5I95joMC0>(|@ zyb2Z0b|w5lGP#oUAj-fvNnTc<{tQuOJ=&4ou5d3Dhff$Pxj9P|pV1drQGAPP@hfKx zU1JRu%25*1DdSd?Dlx5cxlteH-{=V3#bF`vRehlen(Z<&jroHn4=k7{mmM0cUt7ko zsd*@$pfTSdPBYtKqBjPDnC}y}PX4yfp)8!~1$EVLqAp!rj$lTp+?dYF z+iA9r*y@lnRZ63J#?`=pu&#U$74!t@80#6N zqY-E5Bdk;3)JdV{kfxhkz6_51DjV@hk$jN#<1}hRoPD^?U$H6z;wcSe4dlctqUK4uPD|RjWEHIj$l6SG0R07vn1b6 zF=tfI=AXPt31vN%B7z7?llJN)As?B3)+beRO2+504DJ1V7P;Nh63)`ITs?Xn70WJH ziDn7y3E$#YHhDZXp*^FK75O0wK24Ou8qAV77S?j)4fbVPB*qsS3Fu&w8tQg_ME03; zs9B7n48yP(RotPuFK5N>I9!4z@0l{=O4HobK$+7mZaKu@(&GE!7%4bm@nG`8x1m;5 zJ?db2LC|8mCV2kY)6#jwx_t0UMA3J$*n`3)=&f4 zYKB+ZwXu~DNf{;lGbSYrJ3yORx}a6TCEjH%QTV-_N)T6x0%sofhMrGpzQnJ!)Dz3~ zn42FI=#?`SVTfIj5Hy$H0k2DW4<)6uEEv~&;9`XsB5&_;lz16o#sFEBVQ|}+B}l&0EQqa5@3|}7M1tL zVw5LiIv7o$A>sF#3mt4Q(eItp<$x|znInVvhK4hGoBJwrZu9xq36mHRLpUk}0mV?a z0e(QO@CYom=wbw)tS5$VpsAExmt3OsBaWFYx;eaDm&C-IM~z?9C&K!?F=`lF!4fJH zGfWy~vntHc=g@Tciq~{evZAYo1u+t%%uOsi7RLhT6#H?We9w(<6+iClCFS8vufyYp z$uo~9$F?EI)Gn6a-MD)VZ4KQa2@w$G==D~g$|UiLKdZd3bvOgq6SC>lCra3|i|7FP z7d{U^+NkqX_E1i{3j4a38a9jY<)IABs5HcaD5o!Ox$|8v6`ke{D6!Y3qn(&VrJ`Dx zRaLI(mHd7i!}N7%SX@ys$-k4|=TglqH=Lb}n#_oT%brs?i`AeDrN(faftw_q%#jbZ zCEd=@A!C#IBm!G`*4B!vLeVmOxlqwh7vt9OX?k;GPhBJ&b+Unpa&_8;Skprr3s#i& z@p5nrRW=CH)kc8=v2t?gE9FRJKB*li1VNBoF(qOqVu&;#JtLE1b()f>KOZ56!n18M zlSv2>6ylN+Ez&l6VSh^gSVa?9H-h1nP<{BS3+_xW@`qTU=SVWPWong&xeBy2{a90Q zhElS)BK-=fmndyqecMyoWLDl1L9U&uUxVD~)Cs5dGlW4gp}iV8QA`LwCAQl*Zf@I* zyhj|hgnIVRkg0lT4bdH=TsF{>v?xb%)qUuW5T{8neayCCuc(@G{Ws59DSPU(3J1j=|FGdtZrh>p* zr<;V$AUoqtPg8l^{p=4(+Q6FP0y1cXi=M&EST%l%(HwGc)S4uP%E{%ZNHSq(=~LRL zx06PvNpQo_Qvy-d;YRd<7WFNmf>~iukwKcAFZhvJoQ{}K_xb(wOeWD5Loh%^t;X>| zMwtvgB_5Qa4aWbjEoGfUI5ST+z^RG`cb0U>s~@Bo$>|}L)sa+cN1!bFjliu%s#6<9 z`=~%_(jc&UF(6em?!UHp7LOF=LItBk2~G{MgQ8u8?syz4trnhzARDbxA}hQ>@>HEp zIxk-9j`}7O-9Pj)HcSs!+&-0!wNkG#d}=j97)+|rwq$K45xg3q5<#+}EYiYGh(aG6 zRY}iq8H{4e96(4&TWNk)A#z4^gi5W73@$eui&<8TSa)0}b+U7c0@|x2V+MC~Ys^%2 z2e(?QXt_8Px1zX_`4$yb>M5OdFIlcEJgiI-SzJze&S)OvoDUC6U^1GyBO#;?XAR@^ z)L!Z>kW8+3liQEo6>ClG492E|dDa*gY9{ZjY*SvPy*#!tf=Gop1_a_M5_|6U8Oled znf1?@TZLj9QdaJkr>+)q%97XVYZ&G#qX@42)sinpg*@}fLZm{y9{YAkrc@i|nbI>< zOiyxSnf?eO@KB`%_Q$+SZ8@jVnW0DsTP>PIx+G{z98HtVIyI6*DG+TE&2Sh#WsXim!KYVgrL-|l z5A}MSPY;RdUz-RvX6*4qruidSxSxFyp-`vxPCXx4rn7scqzO?bUX17@O-vLnYV>k;cM3E`S4IQF2BN!Ht{Il7h32 zl;ongB2dL0ES5{QdCqiGQcI;Jm9|V)416cDfSyL32C>3g`YRPB--V8eX_4%vGIj%* z$&wp&wYfmdg((kJd6{IM#+2JiPb==c_7B=IyY z3Q`sIEGDtuWq4St)?W-5=HF^`)J3@)I*lm7IvH<{IlWbSb5_7mPe`r16=y=t96#sC z=^k3@jbrF&?<`;n&o$XK%7iVRAJ#s^+jL!Y)W_BpvIy(c@JP_p%n3~vGvG{9IEwfJiXRx(wQR@EZto=$ko-GED`J|88ZsMJqZa8^jpC;Q)V2 z*=jI|S~`FRusLIN1+|9tD@w9BEm3q8HAfpvd9=C39Y|An2j4|0;>(f^GDuV2pCp!U z)o3|oP_gm|>%)AKQQtI{aoxRfiFqY635_sS)mxQJMSO-(TXt8WDx}LSh;tKSxZ0iR z8sGP|lDMa6uq7Qq6X>9y;zf$V`)`kRnB-s)S7ZMrX}m@&N>fP|yr*o8 zWlTsU5r^;sLuqKAMid}mx5i>V){|okU45)#VjOjbzR47v89B=dYjI6FK?5y3BH;C; zooewSUfLuq=WQGt|Am-rxnCcR*kU}xf+hN0^llVbMagf3#Upk<5HaYir=>0Sn0LwJ zeizi?kT(v$%}yMuAPbt>$sPIfc_flu=)VR<&Rev0Fkfhg$!#!Olrn{+98StMN(H?> z%p3)YIEoRbHfJPOxLJ?eO}qm$X`@ko6szk7OiadfDSDq=k{OKQ&i?6W1kt{TQKQc$ zDBGPAawBVL#TW7s*vJ&41I%Nj%eKxpdLsjf8wDz(4FP!x^Nnm&n3znORxF%ofk(Pb zOi{iRy&u{nA0_vLQ zxMMA)<;9)-=>D*RF*l;y!YzqWEC^v`GId6^Q8dVLcq19)PK%$X>&h-_l!|)!BX!n4BpW&k-#jd!I$;; zs$}|3djr8J@5Y{g)#lSyk-4C~+Wg(4^Ir-Cp_!7|`Uio8Yb!5XwiSmDDU$(=xz;Zf&d zr=FNQ|J#ma54s%TMl%)6vl0pn(Lwc zgcZ~Kdg81b#y)QCfO>zbhLEl!L}GPE`E5 zK@r@I39q+^odtt3xY1g0E@&Ch-yedH5`*n5>NGk$Ws9 ztW73KmX_}5=w{p<71_-Z-4e>R3{xO?ahT!m@UjQUpamSkgn<>!cYV4Ll6cn)5l?ti zp+bE$Os;`9)f0&#OJO&{5ZkN~Zy|97+30c~X;x&g5GwYRUFQ6JdO}3o!kcKB=PgZy z$#{m&2@j)+_(p@rw86;nXvC{$$7zQvS!R*xFdDRNxHsYFid(GdC#6`^FlWnb4QY)f zY0(eUSM?VoqrtvX`8XXb(oKg9adH^mwwb;{6$HUBbhKH?{mCjuMNP}MVvbSV5h#?k zaVk6IJw9O>qx>3%Maj9QxRN%J^Q)A7d|&gV>I<1f6Qy`ABTMaefTk&liJ+(>H(AS# zV&01P+XoVE?{+dvR03_4{vw4xsiV#WLt@~7kynCi+yd{e_{kLL#FH{^8q=PXnm%p3 zlu~;%MUKU48N-&Vu@)X(RrrFGTe0OwnbkYU&X3FJ?tILXm}>Y?BFO1&jvkMt5T&rt z7k*?#)#^5vWd}4XDN{$>>@s*WMx~m}(N{Y&jRRP64$o_ndvpu=KaiGZQKiw7KwZo2 zSx#4#eICAvwPN@pEG197Ni~OMI~+Y4e63>!LHlHJiGL&}Lzd+%x|(Fh$^z`qZFXW9 zPmq=>-SWU*b$+SDHMgWET#`pLOCVYhJ}D0b{lV5DnV4QCc9NP73Gz%I7#-%v$K1_K zxQi=F+O8qq)16Z}?|gG^DGZlrfXH-k*j!`>yG|o>{*Wb#VX=;9$}EmE#%~O_7WeuGLa~R>&h|VDNrHunynzjqE1H*Un zgw(UPNb@r%&_g;_NpYc;9>a=tRfN3D13}xR%e|7W%Iimpuo+?&aqmWY#qG@u1b<-Z z@h#hgNVl+x#$tctPPbqCcJlMc(AIl3o)1Gng_X5O+!vLh^me(eB>7XWE{2eb_HD}r z-z00j{`|3LNnXM_3}1j-JPp;1rEIE$<4+S^mNM2wovcV59_h-wz?|E5ac=vl5He#o z+vrw*HFbpA@lVsDpHZsdv$KdvCRy zBD>&68&b>q?|0cdi%Cy87~WS*YLCkk)SK4{$F1B%k-E&4=Q+J14HMzI%Gyyy_1wTV z+dT(2;ejofDH&WrhEZ>-NSf%s6lFr;ccO6vtH)B6NtqyCG*J0DqQ7Bc5wfC_Gc? zJvr=D8J^(o%vRcjAu5Foy)RW_c*TQTm((U1&N1>7@PQ!SsTgK{<(*vQP1#?;^paD& zK<%zhO4XAdBaug$eB)6W_M5kMoadVH$m~7%Cdr%&uTBlTU7S$}!xC4$bkj2G&B%Ot z5)K;guF;f^!NpM`ljnTjEDYFi!-{Dv^ou=ZTTexKBi(K~Qk#Qu7X_}K@rQrrENNG1 z#JM}qWh25zj0t8se9EdcgS*ApY6!a+MNe`hOr9c{DmL_wCdlt#RE;WzR~nVCpqbb~ zw4NEr`spPl#PTx$Vy53(|w^rcJ$Yp6S-6Phs&-ssTEW z+s3re78xlX8|+HZQJcBe#;Nye8E>kVVNb>)2-VJPg*iUUR?c7d{B<^0LPejl!gw~T zBtSHVrb6!Vlw1Ds z-7_oM*l?`z7gn^hly_a;9^XUB6HnBapF%&+EV z5Bes|c7Fr8U3?+4bdV|$7kMz~vm;s7yLiIwXDDiUVOc&$c?&1N=_#JKmPn%z$PqU* zs5f_F_A&GG*^4HK$Hp@1-_DG$Ufu^KU>8mS6vKV4))Ra+kx=QV6j50Fl$aGMtECMw2 zz8t9~-S+Jv)OOstEnjXgR8BQch)evSVfexzEb+SbGpd6mr9DfLfuePyBiHnw13EJ;UQiZ3)7Pi2#mOCsKwq|#rs_+7=z`{~9 zrfweRWf&2b)r5?;x~P;X^b&7p$wXlvG3~-Ir6$&2Q9?YUFiBGg<4F(rc-+I67BxYZk&#CdD}c#`W4>Ni%V%A+IqM2SrL2Pb%WlCX)Ft8 zZ0g-S{84=<(1h28K2kbBbB1FeqROoS8cI+Jm8>l$dm$#`K_i#9V+|<6@_7{0_+ebg z4^?S#*n@Z@p~&F<@z%hCS-B3=12R$;am_?J)6%~(i(NpgMIyzSTwmuq<^vCq7w$n* zB8R&Om6zJ$JH#yEW)(P#Xo|2~k4D9h1B702qO~oL2B*y0;)FKK*Cn;UJ|r_`8&O5& zGe)4tOs*a^o~SH8I?~H1TVB^e4gUPOGCXcwGotxgTQEk$wXw^}e6wQr?#8BO1XC6D z9G8dJ#l84 zZ4~G~FjL|NFA2lxXH_&r56HTOks=Hpi-gsTy%1X}=*99*5`|HB$QN#5eZ?|8T_KUL zh9h-x?!3EV185v9esgS1Y+)$U%~Ls-@@cA@E`*W=R`e`H@MaW-K!nBw8;%(=Sd$|` zNm@k3=b21M`_XB;g)vVM-yrn4`4yrdu%nJG91((P6%1LtkR4W|NxeKWo(`2mJ{?X` zA#1h{h@lB1@$yB;j~4C6*9oiL@JNz0!ZU=FEhfq;iy7zrX=n9C@%}VJ4yu+u7YXq5 z=N33O!XzzW7%!E4w%nVeN}`{V);=clMXL7nRuHVfI`Mvk9jV74JR#RS@}7Sq;sHuj znuA-z+QuwmWZa`Kh6q5VgXDD{PX!`c{|k&jb0QBX6boR?h4qzS?yVOe%XRhu+_%kI zVhR;n?a`r~h!Z}Gf$kMe+x@;lub-XM&CU%SK$)IO`;V-$OqdlI@3*MPo34z%f^{i| zhfsWqCbWhf@8Oo59(^#;&(A_o8nsyCcVl}5r^%TfXN}Z3q)Y}m3F}WAD~J|ZvCsjB z2s_E+G{RJQo|9FKQN^9;niI4OOBiviRklXll4)JeEXm6odAjL!L-Pbr)m$9X4tefg0SO<_%25YxdaTHW?XTbk^mw!;@t}0pk*s3UCe2I?p@>5A0iQZPj_6#wFPF%|F7u*dL(?O_cLw zVr)xun9XGHXw=AKj!(o_@yik;s&?i)v89Qdc19^nJ{Q@#Iet5*P$9-cr<{Xd8rcZO zSEAM?66@XgmdhDkrbuqVO_;$awu-fDq3Y0S6oNWe3(Li^jP*ty&rkzT_a!K*LJ2;? zznd-jiU0lfq7Us!iHI^3niAB*LJ_MlhDR}y;arKinGTYFRN(LE#Y~6V)(v7fB>WP@ zqT0RW$CK06lY_BgN?>!g!7X+1I86)MS4Cil2h*;3NqK{qGhukk%wlQZO8nkuc?*hy zJ7HxNHFdBtBK*=+jp2kcx+sCMmN8pO$CD~onMt!-G1lg6G3|C~4{|Xb z_WR&2L-e4o5_ezBlrTChoFzOToRnqJh8ImLN9KqEsZ`qfg7I{|id}E`jG}Ve(TbeBC;>u#OF@&v;wVw;- zDvZq+*I_ZK6~@_tj${&2CDwGdUZT?D{WH2Zbhc`mQU^>r8zE2HEB^ITfiM!wm&t4) zevN_`pGI_Mms`9{D2f&p*(LO{ja#&TXNB4WhU};)p617QVuYttLMMl@_T{ufgw9xU zsl^*KmZl9Vjp8E9&3Fk@Q9flfQCg&r9`6SGO1*mqbH?!QFM7!DIR@@*0v2 zu!*GNeiJ4llQH&g^J?SJ&1wE~p}a8N%t9djC>EOTT2XjVYctSJEN(XY4CUi8;4%%V zte9YyW{l2exZSR+C2OWymUEBKryneC5Hi$&awA+;NrYTvEgK8DY)r?us|SQ)U5sbN zEK#{>Gsh5z71*e5(uhUGrFch5@^aeZoseQLX1Hz=`>;2x~8yGN+R$zIm5UL@ORdpH+9_ ztMEhE=qX0ZuvJdMtpUo+j+YkB^G8bK@y0gf&QmP}uP)jG#`&r>@lae(`4q7`W(|sHMX;{u%9+io9wyIpYIWcvn(*GGr56G&#N51ysFbw@^B(m! zQ$f>5eESPzHkNu*FfLirG&}g>eBYnuMk$xiq%AozPgG=BVZ+=Y%5E8Rp-I_5oC>x* zo{~F$U(5$GCO=WX2VWw&X~*-5cl(klDc$&aL0nAiMFU2yq+Bt(8NtxCIqAFvPj%ym>m>~u5v$KqD)kv?dy*($@!wGU< zpokJ^EDPweZmCcttaPHK<5HR4G*${eFrQ%y7F`wBVEVk_LE%iyyARFJ@E&{`Z`m0l z4EsTyWhr#?B`!9ZuIp~)w9ksig8?3)NK9w)HbK?$0H#VPiMlh0k))&<%)>U|+-AJy z%JQUzpX2UT^37`fPAcBzGW%HnLw`6bK;cS9&Rg*#!?=NW*ser=2rH{J^~}>=-F`Du zY4VsSG)x)QZ>{sGG^S;NbLk&WDv)m>8Th#HOQS;SremC8!(ycr8lw2%gZGS^vlQ#f2L@1JMXe zW(Ai;>l6EkrHQR2 zT!E+^uV;}+V%nC?2R}HaPWAGwRYPyBw=@d>Y3G1ddjypJEfnvr` z5Dlb)jA?6nu)Q|8MO4SR=S9-EVP4B*seSSUj^UP+@yir#*+w%|nU9qY)rWpE#Yh#5 zd2zc{s)^tMyO1q)BEu}o?-zS37B9b9yb^@_3%30PTUcsSzp8ex;cBmI4mQ3>b^7?R z1b$pQ=X39htqoI2#V`%ZZM2zcf#saXh-#LH)C?7oRY;S8O}0eD9T6f!=!C?m+iu4w zT38Y{$wC(I<@qDS1?8(ooJPeOK{==`i=i(FlPhrS;&gHo=Oefn&fdo{xyGIL>GOTK zeLYwL9DzSZh(j3DvF`^Ofg?wNW^fcZ2K=)iR|Ky@$AWgy0ak(IK^Is9961>vki}|0 z(J8=@4}jA_3Z%g%;K&ExSBL)g*3$jZ=YVs;hrkwaKKL;BD9C|}z{TJaFa#XA6kL8N zh2L92UkN@@J9gA3Yw2sDudk)Ct4^N<{|54)07k$Va4ca0OoCfL8BBrO!5v^HxC=P) zd2kP?fEln0+z%cCUk0<_QQ*j9?<;I55j{~$KMDPH@Xgw>qrL^IU=BPDz73uMj(i6^ z3!Vet1B>8!@B{D?cp1C`UIRY@KLM|UgWwJD7WgUn8TdJP2mBg1@-Fxt_&xX^@JH|` z;K+O6ui$Ua0mBdjV148PbpY`W`M?r@7#ls&x$u2~M?xG78v{qy&No9J4UVZDJ6A@L zZUx7Jm9_J$ppOR$&{;co5_C6M3r+Rwa3RQn0Wb(I0gikOdI($wE(ceFtH9O3kx$h0_0XRNp8=l*c~Agj zpadqsByi-`nl9J0bM7{zZwGh$)498lz8ic2e6eW18M`ufmPsm;7BJlMh7|xtOXwc{{oUA4K{#{;7o89 z$bz#$KR6d`0gjvpeLnawxDe#P0JsQz3=DzGz~x{YxB`3}41=q{HQCZ#oT}$5sJp=9qyTSdykq2t}OVAJ1 z(qD$21&@G7!DGOYuR?zfd>woPd<)Ejy}*%$ns(ApA^mOe4A>981D*rl1J8r+gO|W7 zz>(K#+DX5T^g-|jcdm$M4k6{Tli=;J4s+;19r&KSKYxmi|jk{}uZ0;2(gw zU~9kyB=7=ft!fEa3WA^k;HRCm0vrh(IT|_wq99f~cPun^(y(_2`vR+gBdej02MN$s zJ9h%~iQpt~GFS@?a3lqt2J69w+PRH2eFpTIAPaiI*}#!=pw9&#svSG$&O`cq@DXq! z$bkWH5f}s?14H0aa5-?~3g|1r)wN^i+$WK~7JLd^2d)SI3LNaqtBAPw*{J1@pj>z0eEb>DuwP zq4$CP;5qO;;K=jPKd7Z&fqo7A7dTiu_f}0i*ZvIYUx0VOufT7>@4$b9KY_o1zkMDZ#tThvZ1;qrovigD8lBHn0+`0$Ayy6Tpe!Bycit z1S_O;DmV?C4%UG**Z?x%4DdnF2OK#E`aEzxxUhEaqtF+FA#hpk+~v?$fRBT#Yv-=1 z>1&~{1J{Eaz`p?t3Sa~{5$z}#2NU2Xa0@7dDS*u?`W(0u+y(9iUjSbO(_k0458My- z07t$A{V@11T&7rVUU)?1xqWE7cSPA>c?O zbQr7vM*pdcX#d0gh~{ z=?_Am4f?@3;C%2=a9DCkZv_M3VsHs?+Lzg$cI5c;)R z`bW?Qz(Md9_!;;)_$6@USJ3a)((j*vpTY4T!F#py|A1y5j8VW5cTLyTv=16Tw5O#& zfd93@13U=uhKd=T`3v%xvwL*T=} zk&i%M2y(UK0q8++F}S35?qkrGfo+HxB+|?6d@gWG^3pQ~vneJ9di0ABcmg~Lz7D#Xy?B{I;nPiGW6P7`UB9XgLR+> zYycaiNaGF?m0K<@&(!Tn$lcnCN$ z3;hUq6g&=|1m6JP1XVBxo(A6m-vcjz!}0^9Uk0y&AJ@(wfIbM`06zu40KWvk0lx)~ z{5SL;z#nVJ??L|s{0;mA2rp~~cmOtu4~Y*N@2$}iuoNr68d<ubQyX(xDD(8 zcYr&ABX>dH4Zcu2{vvdxmc~yxXcxG@cKkq1e+l{_@bBOe@DjvbayA0XEl;&w|d@(!J3A;2iKF@L_Nv_$b&4 z92tPV2n>Qtzz}fcQs~RTHt=z96>#Kg=ugzr*Fb*~d;H@F`>1Re(e4juvj0UiTi0bc`O2URc!=D}Xz$O81! z;2H28@GSTqSOnh(j=Tu{GI$025WEUr13v~o0SCZA@D}(PaO7?1UxIhR@41Yr&_$_29642I+qVpRJv<&;>9GN?;sJfSbW~ za2wbG?f`d!&jUy9hQ0@U5!?%QgZsh5U>5ub_$qi3IP!JqZ-8&rj_08Ff(7stcp4m* zeMmn8_Ji+$=fHQtB6txv@)Gnb;5G0gZ~!=Ru%_RH{wer5c&B#mH_*SWrGF3oKj4qx z&)_fMui$Us@4%6NKyyFFHh}*Gf$9K$t#jzt`95g;?@_b_;3v4W95@n&ZURSxV*p;+ zqX=jLF>ox1gO&duTlXCmg4_82-%d&;BqK7Tw9Je$veS?qWv_(N5)neSGLup&8ATx) zin22+iR>~`k%-8s@AJCfSHI(Y&hK^3)8J`ln#^Uk<pqphJQCg-p5c&Si?rXjguWuCt#Ai+fjRYcAzsb6Z5eUPFMo5Wz-Fx z^6pL7$g>Y!E6?kwFE+vt+aR`+24FAt;{bvX46#refk+&~Nkro`Vo|d=&gYPTB%~k} zVrld$uF3lidJFfFi7bfa&`0w8gg%q!=k%pK7tlBI{7$xz7UL7j@CD@%`$m7@m%RU$ z{X_qXvkG4`s99ak^`U@REI+~(6G|&=at!W!*p{;ytN43!&ozNLwpaXuU zTP;KMfLJfuTb{+eFX#R+#UKpEFo=zyqcH|!VF_!D#{^8m6ikI3rbEo0&cH0p#XKy4 zn4_#XJ8@nD7x}ha)|Gm|6JGGfYWPBIgY0J6Ep)3qZ>Kx36T1+A-PntL*pCAULNG!Q zjtE5I1Ww{K;&2Y}IFAG*K`fc3$nzzdF3;EKO=RFU?jRFc$i-8Ly`V3VkM}5qSP}h* zQhEPMzsYk2{VC7C=x_WLcYY&DJt&|Nl%Nb1s6idgpaD&^LTj`^J9I!tbV6rzfiCo* z4?`HE7fevI{+tKE6lNHVp)kiVjK)}qSy3B|!vy&@iB6GcJL-TLn1y**fSN7h>joPeC`T)_M+bMyqfx8E!M#o8?X^#Tj+M|#4h<3K=)uT_TeDJf@m-fBNX8f zi=amlh2w~ZSd45eJ%@OlM*3wA3A#x#>N1x*bUZVhS z@eYM3hS(=shH`wDZ$D`ze#`qGS|!eE{Q8D^;Ln-VY5)a@@f+`I@fSSQYKmsyXV2Ga z0Zp`m7CN8{bRhnu7k|W|mLd34M74TCtPkyr0T_ru5WnHd9K#_tf{uYDtY8gWjK?HQ zg&o8k=nTxnEX;-2e7XoruoTPS0(Xdc$%^wD&OY+Kj{0H)Ho^~EA-0|FfK{08sk+Xq^N5|rXI%J2o{sK5{W!e3OO4!>zl{Ki4?2X4g_WR+=Ss6Z9! zXbuhVcTv=81%3x-t+r@~j?jZxcWMA57^4Szp)bVxQ&X79`ye_Jqvc(E&KS;?u!i_y zLN&AHJQ;SF4tvZ%&1Q0*Bk%L+0xW_PmS7p2;R-j1dD0c|!YX)UE!JZLHexfjU@Nv^ z2X-O=`w)nO2u2tp5Q!+9#3`J?Im9CYNk~Qt#8T;Hq~nTwyH0Q5CT`&l?jZ{gk&7n~ z%aeUdU&`}qnvXYli}(0|A{0ZcgqGs7ynmtP_=fMOzz_VyFZ_jAwQOy5zK$SPm)1uE z@H3ZcDM1CQP)9R}HK!VAftKLM%hYO(wrG!z=!DMb0v&XN9`s=VLl~hK`oa{0Fcf0u zvLoqejDdxG6CbydXKQMUiI{?^u!jR?VGhLRQ%5Y8cPF|G&hqX;m%~-w-DN%KDtTT_ z*I+F+ViWwZ89Tur*ZtoD=stNqAR8nbOhXWgBZ$N?oWM!M;tb-EfJ7ugESX+JD$;jC#bZ3f3%tZ@1xdgT63<*Z^uK z&qL@?495uhHkw+(3N{#ziI@Zj)NB^#*_em7gS$zHu&N~r+-Pngf1mO@u5QZa&fY?zQCC|s{3B=$u;&2Y} zxPSzRCCVn#%Sb~yuAyevIp07A?#cHDGz&S%!*jfZ*lU`PH}YO6TTDNq4CSam%_=$n z#$QyUb~C;gK@p9hgvL+-e~nG8<`8Q^HRZV_Z3Qi~MSFw$hS2;DF`h&0C4G&2yu$|+p%^9jgff)l z8^pfT3RL2+e5Y+Xq&BAg4kc#YFb<4zqdNH9u&|B%20ti znxYvr(FR)3MtgLIm=4uNcNoAJJ)9hGR6w!V*@n!8lBW*kn2d zQ(*^th|Qq0u|VDz%ZiUVab5yvxWFA^E2tM%%DXpRgSGI*28eB>e%OL-*p6M;i$Db7 z5Dp_0VK{+3 zYb>iOE8f&NH$gLKKohOd2JN7Y4(N!^=z?xAfFXLI55!F90GMGYMqm`izyg-Af;DV0 z9uqJLQ!x!<4zmB<_!{Fr3v=ZAJh}i2*+Ppp6!R$(n_wx07Q zY{ho$LIC#SAcAlR!3aedjvx|I5IaUs;56cJ7GmdUygVn$iuV-GsknqRT*FP=g4i8; z7n$;&Lm$ht_;?=Yr+9(ac#C&<53xe}0VVi|GJJ*DH~Jkv@f&|p1%5D1tvaX&eta)~ zQwU!(P=P9H#@`rJs|ol?%C(w717a;`OSFMD+M^>nL#&Ieu55Rz4+D8OqCMrg7wsd@ zeQAFTkasgW6vHqaBOo@Cj)5htVFO!C#AMiE8pNhk2h5iDxpba9&!>)93@0psGhE;b zcX(nYR>24Bu@PIa9b!9a0QO)n4j>Q*5rjhs!C{2r2qJJ4V#nx7oI)((aREvAcPZR2 z$+vWR6}NC3ckuw3$VM)nAP>*+0xyw|0*Jk(?@^2rl;I1$;onto|A}AtgDQws(|RrW zK7^VzUuaz*ty9%$knJ1WdwY*kKyP>}ADyhCI)folhO%1Q+=x zKF^)ACsx86Yv6;mSPwBjS#jRVd566F)7{vM{RqM#1miG{pl0EmkKzPQ;xx|UJd%)t zOGrn}uFCUunt|K6i+kXYAJ@u;SPsp_6XfA3YW9NjOL@|hTE%)l&& z&7pJUS=<-=b9UtHB=1Y;QY?cDTp{L8J>>bn7rqX;d;OocRouPdgN@jPE!c*dZI|aA zbf-M~(*W$oUhKy~1miHm5RM2OMHG(X1jJ6t#?aF^gL62K1SBFEDY%3*T*FP=Ld`Nb z-^G1AKo+v`7*8Pfj6TN;ypnIPX#w8K`v+Q#Qk0<_V&CWwdHzX%;V-ICjsLAR-w&Yx zMJPiRY7lEmn?VCDpox}fh1O^TF)i8-9nc9~p$9R2Y5+qR!5BTz8-39aV*Tkrm|+kG zLu?2gjxq9XL9HkN|Cjzhs`)~k(ID`-!hFCa_kmpF*qx3jV%6kkwBhP2)IV2zn zDY%R@q~jW{;|6X*EQ8*W=ex4^=mTUU7kLnSMxWy)@=<`d5G$g^_=r-J;S0)90kNO- zH>$wTU#?Xb^-v#T4XF}T<-G}2M>A-k1zJNJ?a=`p(FHo_3SAgOtOxCh-smge`cYGP z9wa+db_5*-3wa+)tzd)kn1m^qifNbuvH5f%9I;rwEuqWcEbp$=9iCVz-@NHsdH(M| ziT^&yeFHYj_bqgrJlA~AcJ906+g`d42M~xu5DTH92ty=};uuasEQX#!ti1pC%J(bo z2}ndTF5(izF4L>Hjttz!UEIS1WFi|m5X+T)OrPSVyo-;$=3Ia`c#97x!AE?-SA2(9 zh3rrITb}>O{-xF8%n!Jzi+ZS!1`t!Aji3w_s6tGQHkD@$s)^QUi+1RMj_8EW&_P$| z!VpFIZ9By!jCsx1mw1H&yu}9;p%|a=8DeF!<@7r$ z@I$`+l>JTr$a9q_KjOG96d=}+Dx#6Rt58*_%X>4biI!-Mc4!Z=4zwe5&{e+aQ3DvE zmwf9Z+m{Z283tnr%po?6j=(64#u$i=rPdgS@tBAyn2Kqb4tqFY2E=C3IhZT&;%y%1 z`B;EOaD>=m>I7G~!vkJe1t0ig6SiO*wqqxD!5_P^7yBRul%Az0o+=@EH8Dtn9` z$4SH?9v6^^WL!iFF5xoLaSb<+0kPZk9v;Yh7R^Qu9w8Txk%t#}iPy+S0p8#}3h@E| zu84avKFaq`|L5cXe(o1O_Dz1gg8o1ye&G-Pq8eiSCCatxq8=JR5j9idtc)h|O`SGH zGiX2)EzuU*5Nj{nk#>^j&Qu58pbtYBp=QRMd&qlF+Do4MQWNyU0Qn~V8Pk8xgE$X{ zIfh{bMq>=btm!z6$5i=dPiJ8c=3zb-Kx`3REYC}2m&rQIx=>fR!2_P~h7UHt51X+K zJ0a#z_sH`;8i+7?KSGZp3de8)ClP~K#NjOBaRCWPK`PR41=nyBVj1){?&3ZkAQO*} zi^q6|=Xi;H6ygKKie*31FZhabRNyBn@e6-Yg*w`N4WT|7Kmm$Sh8mipW-U0kL@Ts` z7TTdbI-(OgLkHa;rmM}@4Gdt6p6HD}=nJua+WdPv2Er7BFc?E&ju8+Wsr|qFfB$C; zcPm)K7UMAilQ9+3A!e`5_chGGOw57UTy4IFAU0o{uOlqPA}q#IEQ6S{HorE)9iH%l zH+--b>*0$H*aSa_ZPVs^9d^PWdl86Wgy1l0c0~KXQ#g&nahya9PD3nCn}2^t&Eh#< zz(rg_8qy(lRh#c|5X;c!-`jB?naDy89ziTmo3AUp!fWK?9STv55|pA0U-2Ck_<>6N z#$VKK&-WuVfS3YRL?bB6Hx*g&aaGPu&=f7u3R-9jZPctI=g!bUH|W6t#^{M&=mW97 zbRbMI2*WT6mJqY1HW-gd^39G;g9Bz^4(38^K3$9@aE1%qAm&b2U?o<;8)9o@edv05 z-at3Wvmf1zZScn)?1fmM>_HlYV1ytP;fTOd9K&%$BL=5%8fOrX3rIjB#4gfQT*g)T zc3t)c&5-9iviE5wvXO(wc!E6C>;>mnc#SuBhxhn^A{65z${_ZYenSO*;3q0kh1wnX zeuTPEfFi_{s4^Nu1!_=7Gl*$WO|(W^XrlwfI?~SQBJbj@D`#DK*Q192e9VY*PxQqA z`EDv}Mh9aEhG96wM$3+&78nal*kS@EViKl8Y#O!4EX=`th%Jy^NFA{l%ix0LaDx|C z!W*mM17B>!HtfJo_(NYJv=}rvhff(cnYys^bOwPy?p!cBYf>}|AMXq zW0*zUk@$B}@_vGzMy$NY(X%**1SBH` zsSrz}S8xM2aSL~F7x$5khsZ%L9^)Ba;57;$_J+R0dlca#%1{omZ}dBUpc20z_Lo+n zcIW@@b!j~)KnW_SnJQ;BsG}J)Al8Cv%5zKF3T>c;w$MgLbV6rzgP1PWLwD%I2t6Ry zm-d6HyqnQM7>36^3RoZ$*Lc)=U1;e&Np zj}7p{7Hq?I?80vB!$BNEFhXz`M-YkQIDylMMI6rH9K_;f6KEomkSyO)=_RBg9anG- zH*g2{@BmqOh)2l9Q#`{<qBj0g4b)qRLQ# z8r0Dg8W3wm+sJcU+8!O`y_0NbSzW3J0~o>x#^{MYFu?!}geiu?9K$dYV<2WptzZLN zOvDt}!2z=&wty~zqr5Mr%iszRcw!~QR#P9WmG|}37aOq&o3Rz!;g8+;cl)>>L=b{; z7-0~LppiI=DESsmV{jU05RW9JAQhKz71!|Zu5-`8UEITcWaA<7@D$JS5@N4tKHlOT z3h@DAMYI?n<^7XvDgA=4D3@>F=nwqDUsR*E4qrbIt4ABivm$LI&&pH{P0$P)Xo*(P zf;Kv!BRWF|-Jpl=FoH39q8Iw0KL%njhGH0oLu@o10}FW{D{Dnga zyicR{n29;^O?=)0&Wo^EzAce;q3-aIck#I^IIqHLtj7lUVGFimHx587kRC)BB5)MP zaRSjejaZz;c_bhS$+!ryRGN+}^8Vi|Uqjrl;U+S07h(@+CUWpdzCDqBN?+g=Udy+9 zT7Y+WFWEnd@XuX=Gk>#DEk!7!F;q}9RnBTq zhXyp!5^W%+MYZKw+&ggAL09>vOZDa1fEuF@`ok1v7z%TYz$l1~rWUY-m3;f}Bm8?Z zcN>g@Ehb_zreg+XV=m@n5gf4?PH=_`+~5H*Pr4G`^1en^d~7}E4cG`jY{53{L;&{S zAcAlRV!<>7p$J1bA`pcWh(-)fK`f4*Lp&0Yh-9SV64G!L8Muu*xQqLEfNVTO9$w%j zUZVhS@D}g!0YxZA3B*3hex_gK`8%yZrM&;9e^4dwb-MB2v7i7YG=>Vqn#hW?x;!_R z)u5Vajdo}cv5vBxXcy?ndv|Im&*JlpI2)rE`pWkK)D&hIgrOLQ;rPEB!P_W|h9zt; z4z`$t$*_YxW@8TKVIda52}|G%F<0si53GPU*1!ifTgQ1le6azWu?7Eb`#<-coc-l} z58aD>2*g1I;Shomf-oFGI3iH9NX|zQh2uDh7@R^Z;&29Mk$@yzL<&-I3F#2KLa*V5 zyx*i5xPwe&;UQ|4!#NjEhh|Qt%un>#o+fwQRH+W(NR-$IB zIIo5e*1;DW;fHP5iCyqV0K|6FeK?3i2tg>s!sro1APOfS7ENPtO5Vj=9OpCg9#0dH zh$LJ@3NE2$*Ervl_gnO~Jl~;rughk6%L}R!6oTtq%n#q7jtP7%EVMI+~&xG|&PqQL{Fjwb21xp$k29hnOKX zLQnKTU-ZKOm|+lxK+K#D!$^#hZ)0RFsWoineLS6rDX_zI*h6e4or8t)zL+k9GhF1` za#;`R2`_o~raoAU_1J)o*o8{3SwvI1tiOR z3cW1PY4iqeAw$01ruUGIC&*8NQ+%V&CWwRN^=Oq6)RU^Rd>`WOjn!Bu zKjup}U?VnTD|R9PyRip*u^%-%z&Q{>2u27FBMf3kXapj06ekgl7@S5N&fq-6l4vq6 zAr0veyCQp?-oP!~#yvd1Lx|k)17s3<{CWiiC_)KhsUuaz*tzp785WLlQ0=mVFw4ygxGA^`E&smVlkYs6fSVX3V2~P*1!krA-0kFVT-(P zqdTx0`w)a9h`=$3ousD`hqLnS96gTTt)J1(XfC3spOo^(-Lb7(*lVl8D` zQ!TWWcWv51o;%V`=z?zO4l#Xdj9%yi6ZFFXm_lqQ9fpw@g)y+eScq9tD~y9J#$ytu zzz);kfLWLiM~E$^PFN=IF4PrnaF=hM)C;TNgLUx525iJ;Y{7QyffY`e;?ud2KQh1E#K=H@oNq0qahkW3Cd^;6{tcTV$EoCv_MO= zMmuPuJvyN?#B^l4$?8#k7@-&Xzyt$e2C>0(D28D;MnG&N9fdKlz*tzq3f8c}IE=?+ zOvQ9KU>=wEcyRaMk5Qu{ag4iK? z7-8}*-i~k%M+A-{3S!4(kJA%~Mhs5jG-7cEXAzGJ_;-o&o-CUxdx>5~n!JmD<|^mw z@_s}17QK!8$V3)$@B~ls4A1fJUjB1`#W^2u<=Z>@9>wxrLd#H&Z}@>q{6!UN8T0Sh zsE>wFf-+Q~3b7_s9nH}Kt)Yc>5bHoYqLaLLrn)eIA&k)zz0e0H7ywfYg4j?x0;A-8 z3>^zASYsT+_j480gblAfIGa)vc&c%FrUm&}PE`~E);0iamL(G$UVU@gl)7A34 zhOWm(Y=R%QU^{le9|72neK-KIKza~|5R6cSAp(&&hLecKDTu|=GdPEM`F5TrAW7bn zW&isp_`b(I1(%VAbX>y?+=SR2dQYD3(@bO`2aoXt&mi`KzC=C>@CI*DgkpTcXMDj| zl;bn0S?5RK3nYG{s@XazAX+7X@6Rlaqjy3mt%18RgG=!xDC z>q|}09|K?tu|aeQ%rOF^Fb0+w2V0EC1Wbb1RBDImu*Yo7!$K^EGhDD7Zg7W~2VDU# zdH1Gkuok}ZO?=)4&YQ3m+prxwuoJuBk3HCn{Rl!Z4kHv|VKfp)aU3Th79)F##v%@9 za2D~nfCPvo(qyC{9anG_*C2L--b4oO;2tvZ5V?4QJcvD|&ykO}^6fn>L@`S638naq zulR=V_<>*egKE_3$*-AEL?b9c87gQ7F-_W9p0#LubU;URL09NOth=lMHH0yGq8G$^ zQxo*VU<`pdMnG&N9Suv^z!noR8Po9Z?77dx9L&W6h%KUv;e=&y#&Wp917a(vmprec z-tfVCY{38DHuAm+e%OL-*o6S>#Q_B25Dr5ujD{mp-lOPoL?cGNiO)O5`7~nX+gTcq z3rIjBE+Q4_xPq&=j$5c%2Io7ti+gy0EaV^;&+rnjQ2?=bvu*G;x!W2x!G)#v*954&BAvTB3$3iTEBb=}V z&TxSnJg@@ZSOXudg_tkhfQ|6O7Hq>Vi0z^K5Qu{~gkXprrlAOv_edIr$n$7w0ZUlH8a9{+u}O3?reLakbD%RZ3v)0R3$PGkOJtYQWpIWo z+~5u|PwIu0SdBGUhmF__v2AoGc40U6VLt*9ghLPup@-!;l!hT3N9EfwdIBdABi~Nb zSj5SDJUx#KNRV%d^dc@H9anJ;Hz0PC-ohQ+LngBE5RZ_HJUqioyuxb~;4R*x2qpN0 zQk3B<%JCDwAohn=p>`j>C!szXKum!)l4m8_7^-Ljbu>kDv_vbkMjL3MX6@v;6YUIL z=)({_&jo5^3*p8a*vJp#`zFR2!Y3 zgRanp9t>azWAs2T^nnTb!4!iq7-B={Pz=K;jDZElLd=p{$+NYr4IPK^n22c*v!^pL z8*?!ai{ON%aDkXBb%O^yu?pVs!8&ZfCTzt{1YkGzKx{7!l;?x8hh&54VT2(Z$8a1c zaSEq#2It__7YN(wuNlyp14@ME|_^A{f{FDkcpI&yIHIF-n?ya5)fo@I z{mK5U8msf_cd^x|zAJZa*t&nasoq5Uv{RZTgSLuJ!rTwHFX*fpA8B9viN_S~K7(Tq zFSRJyQ?PaYxp6i<&(C(6GSpP@&Be&D~GoB9=+$)jgG2;{#t$dek?cabSTwRO>u5gxW}ay zYg^wh{x#_0!(AWumnDyQ!yn^}SzXbv(c!PIb^YodnYr?bs)=8S-?YN;Qh^4}Q9w_05br z8*SYDNq8GSa|7k=-Y=4N#P~Tk&m3z za1;BR54Wu8aAjDd(+#u(QY{>lZYk0+qubglMYno5_;;5ksZO=( zGhSh;>F}{-GqM72T6w?9Z2rCXn^vy#4l2C;*+0u?pj#7zNjH@u?aHTI{5xAcq^M6@ z)7ZBT;eJ;8dQV%uCCOoT*9J@1-~3(hefj+dT9wt0bwZYJ$~!;S`f{t^4>!Hry2xmp zbDX7dfcoyI+pRArI<0WRzv%xl|2`K z)pl;SXWH{i(IY=u#K+v|zRUml-?pa~-bpyqJ2vF^B#njVszSTDs&wq}Y^Z6=yK6S- z-Q41`V`$GS7G+;=o8I!hrx?9w!`Xq6u4h~3n4L&}zUSy8)jE-x*%y1Z>f#b}=*qD9 zZaa&1Te~#4^Yw*lv1u#wCR^W4AMJP5tNRN(wXXUx5k~eO0y=IitM%jOkL~eEEl%)t zne(jQ!=7pZ3*)9YKJU6}xI)~{TJ`}^OTNC*Y@OD@*R@OD=)|_?pSm=Be*fImv|xoc z5jjWaG}pVar6Tjy=8F~j4dZe&)kI+i!0Vn71-kc~ie# z!;ZObm~}I+^(F`H&HfSoemm`pyo(&V_0fAZ%R3-R^Yg3Lhc_#2-P(GLYq~?+;CUst z9R{>IKxb=Q8~5ZY;XptGNa-}iPUy5+O|Hom>8leF6DSwfn$6R2+OKAiHaD&F z%4ydeHuRl-e6*$39lL#ok4_J?A6|L(=-r~lyQ*^b>>oS1*w}Wlnss>nKLM7xZ|CeO z@Va{bMw7BygWX#u&s^B|>X@fzjvMazJHkl!Pi;?E+XpQxvnOa9c@3Vpbg|RN#g;B@ zy6vyJGJZ(bn#kCNN32W-XjabOIqv(Ol6_+i>@9MddLc?>-*2_{X6g5p-A_9W9MwiO zA#0rSh(Vk0eyHAYFlvWVo9j=9l}>K2T^T$xv5!-kepG3!vSY`+(RFStYqMmC&CNkE zhda;EtsQwXIX0lfftP8Y43ZwYob=r6V6XD$xxtgwshSy%&2qjsdbL`AbC%ZMi2P3* z?F1?kIg-q_lB&`?bm~_k4XBl)i7=7Nu={tlQ+d>>g359KwEl zuA!B4E;rnK?9bV26s`>aebv%r<8IGMEkeF8FOBfrvZK;v;M}l|x?KZ)MyGGwJX*P5 z>FH9hQeVw)3a^IhlsX?w^bDPGx%coN4UE!!2Ro0jvRYT_GIdLcZ@b7A-9o#kbkH;G z-+1G>yMN;^?CBXFwxvg(&(^h{&pWV8&%e*#@iCu$4|_~ayPex~gyx&#j}6@eLrZT) z+jSZgxuVB~rd?L*1~uH)aF$~E06UlUDcy%C9}W7geeBDm{nHCq-Dt6XgW2WySMzs% zt-j?`*0IUvCi9A1^4~PS{q)|b>33bv|9EfG$ny3_+y0I_cU->yE4XOe;9l!)sJu3P z5z!-BXwP{UsuA3FPaUw)9~_Ih1nz36}=8_F)!Rn_eD`OB>9Cev57zOR$Nd8GAs zH=pXFP|ft9>W_b)1aEaTuM=W_vhZN`F5MM9!>+45tdp@r`Oe~9W(V?0^xvo^KibRJ z>fKlMA8&je``r79!%Pbk??4CTCBGl=*0tfH_d};e2fX`M`>Dt8g35`{6MO&AXjGu; zc+2clUdBpIcc*8sb8cyj3Yof^`> zNBMTX|7`uXxyz33-E!Dx)*z)eU(c%yt2nT=k?%1Rmr*Bfe0ZL_#&YG6l>xPn6wUQ- zzU+!&aMZ@>jiQz=Sl%RhW^UonDedk?Ud=vwG*UIjH_)_pazC|JSBFmZtM*Arxm~Zg z>{yuF(q*$x{@CC9fNjLO@H5{Rp76|H=VF^sdTmMj1!A^u)hyS$IiF`btvoBNwjn*H!i_py)bbZXFNRzv-=WlcVv zSIcafs9_Xx(W%mXZgAU*{>#?quUUO>VBV)UT&>H+XFfxD+ucrzRr%>h@gjof^}tFHD4 z&8}@vhR=`j(92eDZIN5=k!9u6JMj;4^$*@{7N486CutMyTp^E#`m)KjCz*<{xBUU2xiTao{fgVT4b zSByKBaIjg{udxQHq1`SFsCT#Sgwnz`g$MS{h-%fhWSQTo(X00l9~A!0<;lk;UTM8d zCK*1~bxl`4-2C2@v6l8fO=3SzEU8@n?ek}wi@srpD-!#z@eLg`UFWM_-tDDNRkk_k zX&IMp*1n&_dzWOz`MtgM!(ZxUhFt8OV)DgkWt>J)(&}TbX?oW`e@hI?QC9J9|L14H zpb0O1b($t`%-j5aw)u+6rjL}@I9+)CaZB@;`-U%G=(sZU&!jh+(Pg`$Q}!PpbEVSI zJhU`*TiK!)Pa`guZRnP@e9CgG2E$GjX(%l0Sh;ZOq^3$K=k`ViO}ah)Ym1P-H!P2J zdb6lx;O*tV%uO0MsO;AAL-(b}pZ%!i(9&q?>96?;Yt;lkw_T+myME7Z`osKI zCO9P6&pqea%c}9Ad?&?aE&dM7n(^>_RQbC73aSkkwLRBa>+u8k##O2QvCWQtbEuPi z_Ufj_4;~)x@*_S#W3E@A^71=H*>C*1`d&SG#`9=*P37NR%+AIZGoR5<(6lWPJ7=CK-Ze7b9celb0VbQL6)1I4uh&7(& zkdYgRiqQuR_vy)nu8Pb~JlaoVA^!1L6Vd49$zc7?}B z#dY%a-nsY0cCEi{$F}ILtNgbA7u(|?>M@Bfli)RSfy3NDG_c9KWCcRE&g_^ zGN`m!@0NKZ-~MS@ojGvMbj=O-&ToCDx>WJuv3_U2pEf-<@L1)Fp$`k{o&A%R+v7~? z>f24v?jGDJG;ZvKvyH1v9*p)5A9;M}v1soGLn`;|OsQ&i{bqAYMSuu zhU(od1Dp1|-#Xp5w^4MDj)CU2|C%OE>yZ7&+NA5q+Br)n8zsLyvw2G4$ES972Vaf1 z^-Gw0(KIvbdQR-B28UN}Q0nE`^e6v=d-sK{{bwtGyLQI^?sNA=F<-lk-ybznSy%N= zgF1(;r6+1|-%p=Y)?d!t>SECONkM}v2k*U$$h#M8{U-bG z>Y|%{d`-R|NbLI8sIkYPs=K=nPHCo5)Uw>Gy7sJ-X(lzI)N{V2ra$Y`IVV^a0`fC(h@e)gO~(dpGFH@1=cPP0?3e-(&6BjY}5s zZnEFwyd&KlsK0OBwVj@sx5BIWVmkY3f0E<4PFcRY#&*qay!5VH#mxTwJ2f~GcgMJw z>hT@}Tf3YI^4_#)z^(32H@8dQHgL%(-4xxpO@+Ur8fYo`zBJo#aLxd0vlqK{dip9G zYq!k(bpNi~nmT7EUVf9e!oO3$9Y}|O_Mt{jtM%nzsk1fDy4A$u!_Cvtxl&c-}2?j@RxyEA!^0( zb+3z;Capg<&i}4=cHQUdemHm3z1JwzAN{y6vPFN6Q^XT#W1)W=Hue-JVQWtZT zC4L1KL9S!^&I>4=H^-yTm&qr6JenA8Z10eD{NX<9Qmy*Se!F}5T6hij3(oUsvv*kE z)i*~@@%;I|gWrU+qn5;*HLx``zi@JYvSL_S%AGi`hw~P!kF(188vk=op@UodUhCdW z|8*)mWOK}_s)q^IDS5?HUaj1Bs?g@@Z~gE~s;cfyt=b+su>aH7N8M(aO#8AdYE0dt z4{pbM*PD7^&>*W0M+2SatkTeqyt_}&UwOT?VbV6^77P37IHcAK)2UK$uTD99V#=GI zYczJ9{XDHKxWaDkA(OEy$Gl%+6TNDw*@xk2L$Cf>TN0VNOiSrltuOZ9N_|^Zm^oVY z{Iab@u}4)MQ-`Xuy)9R7>!Yf7zC&qc!7x?hbz_rmo#;NyDJ_qtYwN3^x(pKH8fN6BC>&%bd?+P+de(B-rF>?>;@+irY!On-yg zGR^AO=GK8eeuq05*t}bIW8}?wwJdje!5$J z%;d=0XK5Rp`sOuxH>8Vd!upA}u10RJ)pKw6HF!8rdEb$*o8$5m%L2w{&8gn(mSEiM zLcfc-C22;D8|@jY)67P}#&=@M)CKC=A4+=`pWn4Krgf2qm7!xw^Nxip_7~{}7zW-c z(B9K)Wfy}pV;fso=6%_Ft*eb%p9R-LT6%VNwo`x6Z0);tkq;-{jXi$v#I`;23Jf1@ zTGP^ezJ*#$SpFcR%Lnr=fAA~{UwZvX&#L*W^)k&=<{RwzYts2~LBz;|<(gZ^FGws< z?)~~?!Sb^GUHV(c7ur2(o!#?Vzmek>75aXty6`;U{pSAe)xTHy&-|g-?#{@7e!uG8 zx;?$jNwwh)JL6#u?=8Dv)xUH{NbSYG|C6uI{xdf zCpkwCw#aeZe`8a1?c{a_H!jc5Uy`FV$R>T(?A}e@+Sa{ixhurh=JU6)vkOO^eYdCi zx!ETM>|Q@@$%lGpD-9p_Y&7qk|9jPa@23p!anXGC@HQdSV;ra0o;z@{*Gnz8p}r+U z%`*&JonA3^dFi;a;%#pF=jM5&Hp*`EuuJmsc5fP6hHA|+-*+j#Wa-8H%Q`0R*J1{@ zoqX_HSK~TM6gAV+{eN!@x*b<=B+a6E+M3mEQcAX#H~i|}?|rvHbw1?u_*tH0U}aj- z+92mh9n*CV-S%rtF@C$H&6GboiaTshym;3o?OKx7(I&p%yN!rhk@)`rlt630xr@^b z-LBVE0U{>mid?3pWi{Aijkqt~=TG+AA)7th>5`Ojd&!Il?OcYI^SRG;&3%-fLe;k) zM_91b({ZwzLKeZ6BW8&`mb!{#pq!3AY2&plO17CqO=zrh4o*il}bSg{GQ z#Nd2)zRZgJ`GS2mCE}R*7h@H`eyBrsGMbGWfV>j4IB0W1(Y@vy3mHiJ9i>Q)__Zr- zc2@8q^hgf%ZPC;K`!mc4x8m^!Ot4BtOW{^*6alhU8Ty0vcmX@o{@``=QCD=Ye?}Cc zopM60o-Hh11BT{Sd&`hxQa52Am*j{XTC>BSEBTK)T?4;n(4`!-PD5TX8JttK;{8aW z;`T&5`G4P9xWyo|=r;)DxP?l?9q-I{hOX&dC=2*X(QNowT;4QzhesnY1-hqxiPlAE zg4LWnrQSNwZJb&>kkVD+p&F_S{q1vP5J12r`oklVg90-0u-oOAYPf0wKgEN(&rnz6oZBDyA)ml_+Di&Hx?^#D>PI4FHVM#cO7M28%n1^b?V`J4M0^{aeSGDjNRfeg2qfT? zU0VqyO_(z_NkDO=T41P~_iP-6_b2WvNy0MnSwK)cL__=iQJ!j`YK}xj@Pzdpzl^l% z?}zY~e2(&Ld##OBLeJRQ`N(8Me7^0H@RvP`i<0BL*O{=)Q$U)w&KmI>%Wt&$4jwyu zl-wlCLA?Ogn;rR*0q~B0t6!|nEqnaTl6T&gsdVv z9iC{bhV7nYT-GTff0#+fDNAylEhg;?yJ|wK@e}kwBMt1d;RaeZh>NaPeDDxRSVIWb zW?lRJQRYvxw7^5x>SKe2H9fMk0{(A^@m|!q2EE8~R3Pi4sOOE-F~B9DwB9#w!cljw zt*J^Gh-j*s($8Q`f5dZwyvHlU{U?HCZM{5)-nnCSGFsW>Dfiib+J?Sj1q?W-^zb97 zSpOYO7i9XU2rx_8V)dH)hbo}FjEdC2_A!HN1-Z2o$edPKD(mfi9%kGV%`13<$v}-+ z_{e{dtoseR0ooeDi~IO;sgLzj(Bv`5@f&nz_`4oAvTC6Hlyi{%>FmtN%Z?yF*E<`X z)J$_t1wuSGEeEd+@m490+x4j8(MAJZ2F~$%?({gGiEG3K&(z1$xjD7(Fzj{nQR?2> zSltB>h~S{wZG1e5Rmu-w->u>f%68a|`i^JRW}~Q-v0qHm-_j8qd8cof%8gnI9oNllp+fH`hW9dj| zu-bP}P(X{RdJGmGqIiv0E&RP-<#@fGv)Q;rs1|7(J>R!Y68S7xzUSGMuf`y>><;^7 zrYCPj1vf?28_kyT_lo;`Ue*0dO%%U1%XZupdKztEL99)oVrd<|(&36w@Q~Pz`fei3 z_gT>L@9sM?oJj`5Kbm#wGW!&gLuKz0oQj=NkAEGs~ZWG7a9Pn6`No1B=Aci_1YfTyd-}g=M`T-Db>$Yhi%ysY-iO~X-8#779W4gizq1>$42lQYQ2)tbdzQNYC9Hyr5QjO@|Clk)c+3O{}2Y0gn9t ziz~|*PPX|TCaZDDOJbH9)L2R+gNCcun2F{F1QNK$_Ja*2Bp+)3A>&~9-}ypyHf>*R ziAV#&snv`#m(LE^#_ATS7$~~C+B?&zK~}n)5j8|b*F9f)+pr?eG*VEbLEgE7#YUuo z5Lr2%iQ&0|#o)Pu#eX6g!Q#1s#R2wbgo6Km9G4_~A?Ny`8I~4}0b$*1s>dnLsr*Ur zb3F+PpgJtU9T7;oDfH)`r{5`$W7nX+tU zy)4^;!4F&Nq3gz{7Ob6okjoc2drCf}E^)KrbFx!v12Aiy^Xg7U2~TpdRq9Sg31`>x zF#n%u4fq62Inii4Lp*aITdAGW7Ou_0zu9$WEfE~|(qX`SPD?FRDOk4PXQtb)G2K>g zb5@hI{**| zj$_^=1s*2)U+Y8n(*|Dl1Lb~BZc>Qq0sX!uukxr4nMQO=j(vC;uh^79UDfsQq%r#= zWROizAsdn7IyISF8~vz z%JuR!hkq5S=fpTj>Its_-8YJEpNMhs(cm(W+;ai}Gi905?U@%l4<7Z!$PQ@oE)Pph zC2T~w&zu?oUK2=CInyn|q8M+P7=_ZsL*dz9g$5_~0K&=U*=%+;wKS;?nX8RXSJfp$ z&(B&6kBjX@w+?gHMjXFU<|>PB)$wr`8P@p98V|Y&;#2}EL~%<;!#)%NJX8vv zhXIFftNIUvd46rWTwsTa!a0~0$hbfS!c{{>PS{=V6wpOBw+!>qk#Uh29rq;i0J7JW zfrtd>3B99v=r{>O!|+@EZmzX&B-8KVNz*>o;amIlSqg%vM%pMS;8)-Q2mR=`+%Y9mdT#(%s+xt12d4q533a4(SSlk8c2y`wo# z61kDb5ke^IlBjiuiiJ^=AtlV$wM3j(h zpmfc$z`kg1P)$w9Tg_#vuQ0s{X8x;A>|#^tpuAPr%W1P^Z#X$ZG~g|B4hhyqNLNDX zGS>KR7_SzvMMQ~aBk+N_gxai&l>ycTBUfF*7b#)VL|_KqD-xZ{o7Fr+Vt!vT04+j2 znGVX&%HGT*MSwa5pjUi^`-N(Bj!*7A8cw9%P^&?d&8GS&sw1I(-#U{~*n1v3+stxC z;dk|T#W5=S{hYt4HXyfa-{0Z+jKtkObHyfd(B9IB69$#K_MhX$tN`u=I4to06E=Z#LIiiZPb)pfk za(f~%o@PAKj%Yukw^xG+!n_j0=}?DJ13jl4gN9sxoa{E0O8_tZWZ&=(N1eng{zt@& z@7Db>Td8A^YPs;h3F?G_^v5kDvA1xS*XS+jw3se|Lk^44AV+eb#t0h?JWe40oEW3u z9>I}`WU)k?M1w^A7&dw&`Jz*$AVOCYj!?lK)qwNWd|85_0qEa<%0Ux#|HdN~^Qcse z?NP5~VjHDu9^!-X%Y&JQ(J3Axb(*=ZIb_joYEIUr!sfte4L@n+OcqZDulDhvb8xO> zMHCr7+FR;(mN=p~k(#TK{~151tUFS2T_GY122 zE{L=0hdmBcd;&Fo?!@<0vx1Fy{?^g4uoG~6r=`{(Q*-)(8@g~F*J+!KNUHy}PQlvY zvb^;a37_aLOeM+fc^N#|)Sa5~dmd2&_KC_G16>VQPJoIryy(#dGbhj%1P+89=I7^; zd)TaCVirMYn$TK4MU73mvv{l~y%c3>j^aoasZwK{pLdGE=u1nL=Ohbj3Vy);e`+*U z+@CWJl2PX=E452cDQ%xDg)#tds@Gq4EdtS`VziOeoil#gL#obF>|g^%{3nieOv{^s z`-wN-fLssCuBLtZEM&0K*E-Dn8FpBiG6^J3d;Y@Yw?xf!ql@!zpyfr_K*q%hE!_NS z1X(;eZ=$eu?kf%%x=uWW8&5-#ZXxsA7#c=;0Ic#33F|`&-yncvT%5qq3Vm2vWGsRQ zQu1+e#SePa@#NY}L~2w=ZD+73UK&i@-ovU?j0$Q;1iRp!0m)+b+fo-AD%ob^r`&FO z;d0razB`jtEvs5prt@IKGZj~pvyY)wI6mz+59;;J*$iOg-Py~Qb5@$&u%Jnj#UNa z%t|9~^<|V~i14K9*mbk*Rnq5vksS2U#|X?yt|qBjf6Fva(D|-@B0BxR7j*33;#_Vg zoZ5Ab384-1JLa&Kx(Mz{;7EpzBsR@ykBK*a=9mrkmNs+h7gDo=;W?@GY?Un!s$V|! z=V?E~FkbCDafys;>Q^=~Jt4zVq%6J@%_Wjp2qzFD9E8J#1Jx<{jnV*8ayG&U94qnE zgsDk7CJ7HqNl=;8x=n^vOo>ua=`67{)Y%!X1qV6fqlHVwR~oz79f&4 zCk(cXc|nC;BR1gU`GCM#f_{KHfKShNhD4N&fsqO@WnS8ErJuYUtNe>N{=HA&X2XNJ zEy0j4hq^gNSwrYAZ7NN-A`u1>=QQQib_lQ=o!RbJp<9Oi6hK)zC<%iCV^QEjt>Dqn zB{ar`h{zEudlFdUzDW^R?1nbe8Nns4WHZ;=C5FJ!NN{z)7DLeCpnJMw0B}J8O22-; zEVe;Mlt-*O9wJwpktLPN@xz&ZZtOQEm0Sh4Avu_?2c-FuTsg53zYZH4b$EahZVa6( zjpi^={p-DG{h=z%Z-|Zv4JuR_!z|v)?x(5$DJ>2V0N>wBhfI-Lx?-$hpt-tD@?vIO zkFaY86_nzyIuYSD%TgV7{MsZ8Z{3>!Bu|`jYyR6G(0;yRw^v~{%b;&vsk{^t2{0i3 z59p&nfPo|B4V*M4p)3k~X!{bQJy!n`tcDe%!q?vymzL0HDgx0NCEY>#kR@gX>}xIN zdiD8dd;?J1&gz0x;x8VgiA2%5{`gX#Z?l7>uQcp{6(x(416GThgA+Jo&u|U=+&0b7 zZ?2(MK&IoKGcR1aEFd0%xf69l4lb7>-t!* zK@V}v1V^A9FKU^=?(j9gFA<({5aq)|_&!G4xaf*{@uKFm;7@=OsQg1(2AYU*1(!qy z*TWm_#etuI!djC!>idUe5{V!Vm=lj%XB>~s_Um(htM0a zj8=;TE*HCuO#QYd)3gNV4ZQ*ry?c;v0xcH=JY^$r+=74jB%PR={r+H;E1N=S&^310 z?2S=f_%@|XT3HQPZvgKnxh!SuGC8=+mVA_X>P@`EW& z3=<09U1q?BpfUEeI8QwoX-N6dw=csRu#QpMRx^ny(ekAy*%VB!Gp3{kx^nW!`TctN zs6ive?=E33h1kyx7$u%v1(>J z{d4qPDe>>#^F~quf~`GSaZ(MEh`=E_wue^@hFEFOn3wu*{B>h8g|L9P-$)dkEyocd zP6}g^<~o|miWFi*a}*qxmTd~3a!8EJ_+0O7$x9)9Z+HB?7cY4(+nTL8#1$}gNTKIs zD>;r0HUo?N1R3QsyB03~!?o)opdvz~eb56hnm0NOm(a~EA0+@v6RFJ{93EVF2Urz! z7flauBZJINDI``gLH7K^c4d550Vn$;rokY{;vRadQf5_Q5SmQwdEI2A)i{TVGIC2-_-$0+}?9ER8Y+viu^9|iFwrT^2 z3rTlfbP_e_^Oocr$r8B#qiX|*3l7~dw!;PaEfkKgOn@W%IS8CCnUjIbAHE-0Ow$`R z81y(H;Abm)ft{V-Q=!c>NOXuR5<8$U0Lmsqwqy;Z0%jS;z-JWJDHI^-l{P}g6X$k^ z;l)n;h2Y*x|I#3Z4@g18y-3AK#ubo9fmRwfS{|ykyAhYx%Z?&?EvUbA^s~(zIqhjS z1yT-s1ui{mTdwwrb$2&T<(T7@dYz9l24~}Cl5T4>ikKJ{>B&YEUhEBU)fkenKsT4v z0G&q!%aKnN2!J?ncj~!J_UrM`4B`mumW2Mqtp07R4uSqGs?YB9BF;7|!q-4$nm(>T z(En|)z_5|E*^4Y_c6FvF*_PZ@H^V*~-EIwnG7EdJkOJ^;>h6ydu4SAMCy)vMo!T3~ z0#Dxd(yg&Mei5c54gjj=im1KLP+MDbbKqgtGjS@fcM27C;yEw@4ak&$bbn3O=Pkqf2ig$kwVg%uV5SV}*dlIE*Pct8(3ZO&4SrVOR&h0RNk->Qey z;);pp8Z|{k6cQv*pq`;k2a~7c31wP>kdnG(+&kXBs`dD%4S(IIZq}#KR$5M5< zn;(QzQM=*U9$-q6u~R$YU$hO^wLw=iduI5-+3SB6v^9=4OnE4fd&dx~$p$186VEs~ z4?o3zE!)G};rr`XS`7H%r42j(Cu0tih_tU^n8m%91#ESn_~5Q}-QbNfn>nmAqbfh` zp)J=Fd0+?Zo=y4!hpOW`&td>j=DCCb&nptBO-Mo2P#Eu6-}qcy?fC;Q)PfqqL{YpU zfoT5`JT<$e)A~|ncUL5&%tms4{>n8MXcuJ#*Q7h|2ZAE(K6@)(y*i}TxTrTHczZ@) z3h)nkr^AM`HUu^$5D6=y&4?hl9RGK?$sUA)9BX4!8>+{HXSG_)9{h?#9h+ae&YkU2 zgj3-dv~396mqA-I-^x&LS@=fSm*bM{>cWGw2wfuf{Kd|4ygCm=)ZMN7Y{da;XnAx6 z_PvFiD>Oh2P45}zHND2@w?>qLaf#`{Wi`vhV|l2y;%rKG1>ft0$pme4IHajn5Bw1 zmItt8)(|zwM=ZV$0(DmdcE`%TAz(gLhKp^`9Cc9%vjobkjZo|HpSQC zjN&IMO#DS0RVjq*9e?@Aj*Yop;7K-95n#RSQh0Y+!|t7)OI{YS7l{`v-?Vl=>IWMq zbZ3@Z1jL9M)?*UDvzTQjhFh9D51tw?p)WYv2OIw6>cfzeiX%542O&*TUfmd#vVM%~Y1tt}Uy|jK(r&3luZ4Ks9y} z?QGo0FJn~x=^qT&pySJRKZd-L9>I)WNrBio6IL7W(xWLq8FHp3FUt1_^6S#lfR<#> z0=I#PYJxELKXGJuLYhio;#@M+q3vAW9kqR(_0;!Lnq`c*yD?Eq+}jgp&cKQA^(|D% zzadN$p~~Ou5dTxih5wI(^@7Co5bx#XebjjM0z+JhxZ*7S1kcsiW8RWJX-(@oeaFw- zNjRVwE32?`4!h1PIC&cIx&G=K3#Z6~5b|Nam?x-`gIT-9pO&o(Q zlINMfCqGxBYe!Z81w=jQg!ELDuCpHLox9vzDt_Y&BuhwrK6pzj3b;Nzkn1(kI_}8s z^?9z({JAQ|+gbx$pXs6}%*cTX(iPW7Gk9P}W)EBpBklu@r0%1Q-r0mD`Uf)@%S8pc z^h~M?wjdkzq$hCm0rU45yKS?ObXteYoWuoH`)OI#-~cH}gcuv3%m31$>tM0Y@C$|4 zf@~uqz)!u{^|@`A2fAlGjeI7QZ9Yo3_flkqZC=An7gq{WGwRe1qY@4=ptoGGhk<%LGI12$HvN z(v*0fe3!yYpopkl$%xdJe8CDC&Ir%276d*%Ug1%)@??szCLm9frO|@Vw8cg{9ehl> zzZUXu=F`VGzxZ73bLoMnY)-nTYgm`7(pz3e7i^8G)$uv3%9`lp0Z2)yj*Cf+%DP-6 zG708`jC6#$POwG;LM}UdO%+R{?uH_M9Grq>?cehImZ~(l5{_-QCR|8da!nbgh*1;X z2j2f*&|1K}DC-H@b~w@9oSlOQ;~4)~RG2D@7>Hr}@2h`6;dHAF$be`>snpD^^tg)ExO1*9U+3U~7w>~& zrhrsDL|uL{DGC|C4!(mZ1tbUF-J~3?-><|?5AyHUluO<6(%CZ(nvJGx?VpZu_JEQF ztA7!)f?kkz7S9A?iptMT%N;4pLHdM(;{x0Fa>VQjODp1Qa-d z^3=boC9&N+K^6yu!ch4{Cs`4m>)K7nDKjb1gW*dn3XsF~rNkM0I9Y^2YmRC#^9Z} zf6H}1@+-TaA#6zE8e+G#9}x_(A``R$fsB;sJaNNKYiX-;nqi^Q2YUkZb}vP zWs#}<^yUm#=f_lrmfU$zJId9c7>8~Qs)P5?;GpjD%%B1*N0~d1tGs(v1za<2!DF6T zb>#=b-yVFOHsSrAPntG&tUU?FsoZ}TWols*b^t(Ui6AVWavGL7kAV`^i0X+W=8tJb znKgT_lu|yJmcrokbG7q=B7u=v_)dy3abO<+kYjV4j071m%2s%ab*)F6mnV_eAP%LB z+N;O`9RRz3$xg=PL%RQY1KDt={}1+h?(U<+4+E_`3EuqJGU>-z8-||f^bC6pe&wu` zvFyV}chsfWyvg~%WdLTEUEJ<$3Z1prEj8#i*w`F(Jxkyx5gpCV<01xB!K`fyI`^n; zl6XVs;7ngj$(3QL9RU^MnCGUxYc-X%?sTGSiQ;LE=QsOZiLb;Z8ZKviU&BtzXLd=| z8)==NHr~2$%6;cRe9ixSUPi&m1|G*t=UUXujaU&Zhmjl_uWz%EAz*$nW8u3Jz?{?& zfz3Bi?O|^tMYJ5u{#k!Qob`Z=u=dxWq0njn6x;E^_3+2Gt{bzoklE2(gbk+*@}DohNvfp<3DHC~3Q zWQajNsljUS*p6v}M&$UPfSIYbQzFVU%+WbFVx?Z5h4im6ml$=uH`=cy){#{mvV0}n z;X7z*$ntrqIShpdQcG1+86_LJi!fs|t4oaXIKj5UI1kCa9x9XA zs*FRBcEKhX!Q-+gUWGG3;Yu?JT%lt>h~2~59w`Z*em|RXv0mN|BQ;9$i3NVo$Sg6! z`HLTHvg4{K?lq`Rv7aKxsL-^nUI3<_!j#!1C9-% zA5MGUDc_U>OxZ%v4tk0V*DQ`4S|O&dQ+A_Iix#h01F^Tq&_(y7Ij&N=$M#0R`D1=+Jy4Y&V@FGI9W5LnWzWD?d11 zvgYRp^gsN%sJf7AAK$C#9(;-$N%VN>D8;MfqZ*s3Z>R-l1xf64>F|vOg)CrCdePlg zt8SPY`A7V^sENnThsilWA8h)9ey}-{*tkQGb}({cUe$C-(CL=Fz$%tBq{^`*B%mqZeVXpx2V*V5_I7ZkCre#th4$Uzhbj(o96GOkOdWvfSd z1kO7&b7Yq!5Jn`Y*rG@a__vkT*XKTNfU>+9%;m@KHhehw^4z3p4N0zAL826ud~yFH zWDs0WP^_R18_>Q;kF_J0ytpb+108F&`OXnW@d>JZ1R%ds_IpNSZDz!O9OYzND={$N z`}!2eOBL~AoW51jcD`RTl_87evY`d&GE+e86v}V)U>-o_vg*_C4tyy%^&P0l zwU++Ctcp*6yS1y2J#3hvPL*M81g>C*|6N+33`Mkt@y;!Cjz&5-)(yIN`;uc}Ix_0pMC~|~Y>RH|r)u0%0lmJ~@wmn|;M&dl zs>-CgHML+|1Ny#t zwW7~4n{i|a%F5{Org7rq{kyfzomWb^5IvscO(fPdX2h9nSpfq57dvY(8 zkouji{NL>SvYp6(fQGd*QTyPL_KJcNA8&PIRtctTp4g*%!ai@PC*AH1KFtyj`Sg-I zY2(1|!Wlvg6M&0fa{GM?SuFM=_{!=Nt<%!^&~;j&fNGBIB+p$a^L%TsxI_MAC(M@K3TNB!SBt4~j5ySuAPngyf?iI{{3ex_Ms1Nd5`}v{G_n(H zG@Orwjgb86=cm<_&+a6>b0!|C*I&X>K#neTJEb~gDO&C&QA|1QFx&2WnywL==S=$x zEBziKWd3ntDE?M1dxuQxub~#~8)6->=i0rcnXNO@N?g^UcUvF=u^>f%jB}czN@p}b z7C;>^q18^W#C#ie56XTcOToE!Q9j}32zn84?m-Cd8Sdb?>+aLnsqOF#85sCd^>8*E zTU(FBm2Q3};CWhCF8*(l7`BYlNliny{0(qdj6^g0VC4|V&!b`Oq5e%V_RTj!Wu%)v z`}uHfT`&_?@T3Q8meb1D9|0>-JzFcOHzV%E)6s|~pR}|O5yXqnMHJ%O4bX@tpREho z0=oX!E?azZcfeL$3~CsAKu$nTdJr||`-2~$;33Zm{UrGS0te+%a>XUF=p{pBePBFp zZ>wRpR?KZQ#7?QgQVFPhw&0)U@Z3_BzRa?10#>~ZM8(XpCXNy00$>{C#vIidco_mR zTlH!5k;1^GI@Pe)C>|~>mrMY$7`bt=X>9OeW@I3!mAPFARV6qQ?XDmbv`*mp+W!LT z&z5iqOWte}Yr9Dz2KoH>kE~1Mz$oN@%6=j^pFUX`wp^?(`hv>EV>a~a|{H6>p}1t-vgCS z-0FU;_!J%8KE(bH?%N5sSAh@6W92OaOHDe;mYzV$4)g#{&28`zB@pUeSugi_3fvX> z{xnDY98C@-`{1Lth#VWp$jUEjBe%67z9HMc4k^DnTH>ewAWy|oRS09P2z(C_e4tkC z0^d_AoID7krxcMi@)jugN)a_9{37JPwPgEtpk$W!-Odfj6t&E~Aqm#i^irla#|tsJ z3HHQonv{U7jwOYGKSQr%yUFDmY|ntfkhWM{2e zf2_Qc?SqR>#^Mq4J4{a|H0|H~IJ-9TVUZ6W;phRF$l>gwM233?u>8LI8%=`^ zFfG|O_b&1O9fVmiK~tsTo~BiMOjbXHtR*MC-?gSHB1%{MtJd`-j7lBU*x^+#gK^`# zv3vJk*V;k9y*~LT6xrf`dlCknijT7zDD^c6z?D~&(k9B+sw^?ZCWC_aUi(=J_Uwek_rde|38uOD)o`9Q#sk`t zqNsVWO*y#JgpI&=D8(}l6c3enuGQQYRo@PPxoi%6XsbWSWjNj~fcNY*A~@bHfGN4p!#mzB zfL0BBO>E|0Z_&J0cW0E6vEncTj-( z7np8)*fI#S%@2aDo^ zFd24oA7Y;@B~SJS{sEHPNd(l?{JnffVKxq_X)_w2O4)rY3{?&##Wg}?OUiaRBNQB) zIxTxx6^~MpE$))V0B!h;o+cLp@+UP<84V!XzikGmfhE^6hr>tM*$s}-D74Sras%N< zsBF2#>GCDVYQKe+Nc@%3W0l!T$of<{n=L!gg>Uq+@-2L`y`+tqhs_-yE(?BpO-#o< zMuADppr%}^=e$CBExoriL(eD3w3l%9H9}z#M z)7!2MU)Mf$l+@lhl+gb0?;v?w6r zO-e;>aAU&nQc{E9GA~1_K7fi}m&8!eIq!oNBPRtDs7^ySx-^~^sdIE(Ej$y8L7e! z8=zO)QoidW&65$5h_%G8e0CZLNETA3S(w`cJOfa=49B*55o;v?>FRICo4 za__1Ds-l7$`sD2$^8x;6@Q_)6ykL(tH@G+z^<#dIt9xSi(s?E?^^}BoG2RwyEOqR` zN>4!BZ2N!Cj`!~(pl?xk$dnf>K~;{ubh&*_`i>KCBfejuI&#*T6iCuZQ|qEyRFIPs z=t213AnPExe@Ga`?MWq3j|7zxQ%>8Re4wiITZ-aiE+P8b5F=6cNAsu+12sts-)eoA zg@S7&dSWQ9*4G#{e>3wz`{be=S{XB zghIy!rDDu8KbLmY^ha&^TLSts5AH>fb|z|%NqhigHW@X=`G(eWuxXu^OWXnsqy+?> zT({^p;NFm$e|n@a0Je-P63t-D-PC0XvDv%u7bwb0t&GtX^g*)848%0fwhc4mazS2h z{Lm!PpK4f{@Zytw1woUXUH}@`Uln$rJzaJzoN^%0J7dFJj)nVly?ZIVXH3Jw`y3!s zZMU{ML=zm^&)Xap=^N_{PW4^Vfxk2lGS(S_qpj~TY0c|uR3ahdLinKeNf1gyx(+)l z!unM*#T^~;hq4xBluXcg33Jg(t|@S7m+NXmnchpye~q))B(+$0>N?-1fPFMImk2m} zEAPqdY+~Y#o4$zIOi^NU+d@6|a!&A~JVBJU;Z(J@Gw8w2P<|A)ibJmEinxV%XVRUw z!QWS$_@@q`uq%=%q_#g1NYma$Swth*CM~oiB(;kSF*dfs@p+5KJ@xxeSR3WRNvOcp zw*WEVALO))$19R2P3m4+@g}fIczI)JrgTX}6y))wte{o(8h2uL zP!&LV3nP@BK|)ybo7@UveooFBn284|l7Id?4@`^Ne!8NH2IE7?%~Ie`yxN!{V;on? z;46d{wCqKqU=BFtEOnALOp!`P6iwutuMnJdz38xx+bO4XTNe2>7a%`*xvNOnyiC}| zx1cr@8PT<-Ff;VDZN>rE)c8XR^AGYfWzQ?koVq(*bW}1~zTH&q4nRN_Q2VFEC`#?>mLx&qcq3*%rKT;g?Nd2Zzx#tZzUCntHz?MBJEQ~? ztblZa4UpZnYGRB3Ql7qKcr*6XgfvduSpZp8{clnxgQvYA{q}n3?+iK@XeYsH?5&g3 zIT3rDeC{*A^#i02sAV|5HyZdz>Di&S&XI}Vj$Lkavl@RJ34d1NNg3VU@EGYf;CER` zuZxxB|S9N~};_rzv zM?+)KGg|R~qC6|{t`GXeZ$^k8B{pi8=%d@bDo7o6C2 zSvSK6xp!*pGE&RmP=M@BW2q{VP{ikH2pX`22i-<52o=25%+M;#$a;p8US<+Y&xs;&m$q)zZe$V zT3cTY?&yohJzv&O{X{`Px!y@IV3V*(cu0)nR7TvWkm?G_wb%vXXt(w@&A<>H2Slu* z_7mYQnO;7ParJLILrRH!fQ`hi(+x0n1zd-x5vzF}A+SjYzJdzdyqM|mK1HVIs$5N4 zYD$zquSa2p<_fiab?;_DQueoSi*OWY_r#!tJZD=2&7?$b%iiZ;iW`tF4iXFg{1&&Q zV)1aQpLPs-)XQ>s9@I<(ktx9*35d8p zE8Yf<|Aty=t(qkCR&5d>2adWFDn6zSEC=+LUS78fbehOOh zBZ8#C_iA4>#y=VqDzxa8T^z(L84>54{$?8i$#am*jB%eTLWL_ItQ9dTAJ{97wO-R2 zh$+~Gma_+q-X;MNVLYF6cb(RMI}c6f<@i`A91#gKg&Y`X&VrlK;BrQK_a*uD|7)!kBQR+(7bML;g@0S7)T6Esi(Cx zBZ!H4?11L646uAT6A5L@dLV#=1_1dxdJi9)rU#+!=Q8Rw+}r89q2W;PB3$teTk9z; z>DV+ZqzO!egil}$BZ$%uK0&__FX%wR20Dbu1|3N4Auj&euG({rU-Qheg*MqX#l=n? zEOhZcw^)>Cq=^8FpKGU{$aV74ASHEz4OKF)7Oy8Fzyy%{uA(9M_vEz1y71HFr=uLu;P_WO>-&)K-d+hhH;10Uo>wpVM>K zB&66{wv(UZN?Jm4POENLMVL(_lcM%QJFF&=Km?ctZ3h$uv-Oi$7{hni7(Z?pUXayy zhJaH18HZ98*Je#bLa~m5&l9wa&)kM(?Q2fLx<-C9S_lYX#Bsd@>ad`HoX|r}5Q9v)oEixiZ-0FwE!1Fn$pVjU(O0tL$bN04IPy+7y3v3rrq#(qt|{$AynQ^-=)=3lM{a8*iS=1xICh{DTb;d&qdVnf`Y5S&5QM|~gwVmL3YJ52|2%g&g1L{;>0D?Bypei6?1=#n8* zQ04J^*tlk;X8L{&df8Voo! zkIu86^W$F^J3Pwou58ga0rf(v(?7pp9p#_EdeN-&S2)%^ZLxJMhex?g0GU8$zqf10 z;x3|6;H-V{0AwBk*)sp^gcNTmUD+hDl(CEN-U_?B<2`IB{Ra)GvkXoNu;dG}jxiFj z5x(`mduq=LS;-8|=+H6oC?B1LZFGR<`zThHOWd=a6wH0?O*wL*nAE7DpEjc?#9~%o zfLxVaBJQ0)|$3_~%_MVYv;MOXjFJP=Hq z&lx}P{IbGnVr_HQ{PE-4TwBQxf<8z&hbAL0S@Zakuli!2v+ zE*asfa!>MB-Y7%z5%3)PCyasm?^%*6M*JE;Ojs$}|e*wQ3$Qsa5|4%qLz4_K)fZTCk7WxIGE94fQQn6wkG`(L_7tgcs_ zSQ(v@qHfO7MBrzd9Lpm-DQmtZX>3#K3LKiO$|%uZfnCTWS{`v7YH#Yz;oa3AmizST5uUArb+(Ye`E?m8gekO!J$2ZbfIUt9fx#g8An4FZ{6JQdP5VzK$LH><4sb;Yc%&9&$xp11q4H>>-xH>>@zH>*f~yUqNu zH>=PQq8||m_&MI`TYmnrH>(*6L%>@9mH>J*4DJ0o5@n0RNvgtStc z?mWgxud3C9x9bI7lh{|}n_%GKKW0_6s_Fs8F$Bgh*>Wh}@ljCj5#znJNiwJjl(7Fi z^mfVFupd)jty((}tpSEf;(a7coPLw}WUXXZVt4C`d}H`7Q3HZ>jkW<2@z5IUu>dw~ zDNuY6?_lCmmFM|iwDXL=qkz_xF?M3tget2-l2pL}^x6l*wIrnC8+B^D)XTY6-9?S1 zo|=rMo|-_^I{}nUijYavd6JH$o|=9toY`;xP{oQiTiib64KX0M?VT3iL+@g4MgW&T^yPcFHwy_^}1d{GwQaj7i zb2oD&Jp;gCw-b6~7D!n=Pq(F#5^5 z>4(I2{hpnaBhq)ym1=%5$7h~>w*qry(vBBfeMqO>qibV8F~Yg3^9;|&HCqrYPC<~( zk7By!4fo_69smx8hNSC0nf>8m$o9UapDN{B8*ttCgJ6G9qwawiZc&mV=DGwmnv^#x z_=uGDKLP%U9z^YtDOt;Pwc)%Qb*S648{g%&Zsv~A6E)tIf9_z5WS8OT!?^)FHMg5-pZVxB!@QL)?B=Fmzb$8DMHcI%V ze(Qa;!ls>Had+e}39gXt(@}x_uoH|S@$Up#`bo30JzIyy)-Z7 zraGj!BHs)3I2N2*G^8=#1gs&y(Mu4K>;=y=k{IUFJhLqYXc>*K@JlpC5(4pdZ+564 zfB&V?yl@Eoms@!oux@sk*EK8G4!!V+3b_d!%r_c>9RIZN}$`kEr-w{0@>=Sh}|`d{2R)UccHK_eg1bhLtMT9=Thw`o-Im;|)wB*) z^{=AS0C~^K^F|~IpB{Zxvx-Wbll>k6v|^>$k(C_ZX7n&Ay>p+&Q9x*Y6zyiDNmbA? zbvuun&^ns(B~i?mpnH(Y9hVIbE5OJrY(xD!(2as8j|O*+?Gd>-^b#0=d;9UT7^NMJ z`4FAip?5@h))*lEcTpwJIoRXy$o#ivpbfTWpbe?OH9fdypbdIxnHB?L(nF{ve+vO- z>@BkDiGQ+S><54U(@(L2Cg73)nH3l4CS2}$tHH~1hsjKiV;cU0h(T?>14kMP%9FV_V#&PdtUX zmVCNiW!E}(Bzr`|D5?_3bPSa?$yfdAG1p9d?Tg=>1)HtQwFo6JIDK#i*ODxQ ztoS@#!r`^g>q8W3HagZ9f+p}U^x!W%x0gj(Q&&A9cD0-ddM)`fy~D&R9tx_I&-`{v z{2b*w3sk_(4^~ixvNa1dY9ogO`-{p95wX&4KB_NjBNii?Z!|Q)jHhD#GAOoio;=TI zjpp7p+C|V`IS*>|YU;VJvZ8)eSB!jo?{e?R{(o%0h1rpMvIc)&@-(yub9|P8La1LQ zE#$`gxDFTWlE^nS*m(@Us< zaaL(G00r)6cGswn+$S9d5hDcGpVa6y?qRxtFkoG-LIPBZ4A~o!OBA z9k+f17Nfdl8&E)iVauKCfTiZR(%0fwZU2Y{T#kX>R%o>sNfA$}#k~&$WR2IO;I0=x zM`b!NgPE0@Z^1A74hcw9iO(flLG}Rwkdi!eYA1uCQ#;DyQTi%eV~AUUb|^4Tm;bO~ zzp(Piamz;!Nc3MAv0+M5Z%}P%G#xG^KMQ^PR8!N+Lp92v4xhYmUW=MpOJwhzpAe`& zgh)-fFu~K)$!A5us#1#MH{;9w(Nik5rde?CoXO|$h}U;DxzH@zVp8|7^Wd$;#<1i@ zO2HPV;cVF{&m(E@ZUH2*eN$-N>o7;2J&!bn@vSoSJqa*@v@8V(U|8zo&Q#qQBf@9u z%Nspu6vah@_i7~WG%DsWcNW)(deaEk`w zz+F@}owZ8);a)rIDRnld-VxyG}cIf&(x=plnWC-0&>%W zAMp>`4DAqGKGpCr&_%KADgL>VU>7C<4oC~bLc#8Np_Gx#=Yfzam6tIY2$FQKsE+nz z>-a5?Q_@*!Q#|6Clzd{}T&hHUs?rPa`zdaD;9}ezI&KpaFlFkM%Ya(4kaKap(ES#I zdV|2yKTE0#lp{}K3U&nSJ`BKOYn>Ir${tMRzZYrA`RCA8=?*{!Dl*l|XO=u~1j`d7 zwa)p<9}c?e(nJo~T^JJ%Z$ryO|H%(+@vf!yY02TYT^!oXJU*o(#(v$f$5I0pCe}3l zw(1dW1PnshR%0nM4(tdc5%N!MXsiB#X@FrKc~zLBtGQ;Ll4w**UWLYXWbbBA(?-X@>{Ko`)r z{DB>ZyIv&A_%-`Yc~@$zK!BZm9CR?1P)3SLw4GmDls;KW-0A2TDq;oACWh)m$YuEZ zczUi9d}zVCbtB#jZo4hN%V4>|ISb4-WuVZZ3P3q^4h#Wg&7aqGm&6)&@*ucD&ytmFM;}tYVy+tDl<%vseIKxP}B8;@WCTqEQ zhVgMOV9}p3>Bs~}o9SsyzA=lQvKJIjco~I!ZY(>Ie&qFpn3j|i^kkS<8uUgK{EfZk zyAO<;-&(oh>y&ZD+}yC&6$k=1H14si&o~6Fpism&gJcslj@!g&if)a7`$T#+S8LVO z|I7A7q*sU6x?G}Oxj;%xGiY9lxcFZIA{k*H)d0I*J|Eh|%V{$c3O>2gUS7kvfymF0i$$AWJ@XATGKH^8mnQL?-FwhxYy_Ka0Q9l zV*@){T!c*|+P_i-bi$<>epG~|CCG<7T@1D_$jYZPSLgbJ$4J+d zlNIT(E?I!XjXik}gJ=E7v~?hzQ#c!lOlwMH|oFVK(6Jw`<57-i9w zYt8+RUtQiv7?&at2eR)j#Hn+Vkgcv+Qdc#2t_m{O7!VulFW7!{o}iAigy`qtWU}1+ zLxv2dLGL2!@h$PK@Z`kfM5un1K9*cmLD=g;l$Pvl-KY8dR*lv<-OhgW5%5|901p(( z;0-Gqn-t8eu2b5aZ-cyWSY|D}#3oLpc0I$DrO6hSLxD&^iNIN(3rwsf(#ZAB0tA#B zac&uH50tG~om%humPT0gHHzVx(z=3l56=YAqh;Rpr5`XvXUiXjYL%!bL<_ofhRb)) z=+N5Kvy$jxD6$1hm$(d!W_6+i>#4P2#cBRDihSFS;o*p~4Gb#_vFMmG`5lMS416A{ z@9>s%z8T`7tHzbCC)o|PpiyaDK4A(T!v1NB6pQK()8a^@DLx;PJiGVBtx8h;V)(qP zDk2?|ZWa#kiN=`aYtNixy~T%-xp1RiWihlQU78Ywq5X!?2@G>R%k|iPYXg)ki0}49 z2A~x#I{=7ZTHqw|9rFQJ2uoT6LcuCLc?#a7@5(Q`)k>ncDrUfZ7i_c4y}}^jzhS|A z7i_|O7i|3Cd{u=&LnH8Hv&t_)M`4U$4fb#7IcI*nzTv!YK+6QE%e0vzZD&>UDqYr| zwjZGmgliXMk^$oOC!l)Z<5InnGvS`84J^02DLvwgmb3u{-vD~OB1Vxz(CJ>x+WMiS zk>SV0rX@cqPHt+Z`DRdxiP~?bTXj(g{JCIPIx|vc&ZCRWC*kqr&8JXqv>kUzp+ob` zxw@K{kYm!i*7&Z=LsDDU<|D@qbcr>9uF}OnKgr_~4$~sNBP|i=(ZJg6*M98Z6$vvH z3vjUK42NJAoqwikkmmQ~5Yfz)_kpPzQ8pL$rRIPWkj4lY{GMmA^fqn|!QX%g_ga@L zCjPHkKpJ7(rnShrjs5c~ShVmhAV3Q*vA_TIc_K2)kb@zkfdZufr7@a8j#z`7EqlFjO^DlM{8i2d_tH0Z_?}=J zD_(n=CwH9B$gz^nBn~l37zPcjF=%p4XUK8{5-aBtb|#5BmGI(_o?YVl6#eY;F==DM zwlIzkKqc!{`Dj{yB`GkbPM6ayX5r5xC|B9Vr?MvS{k}2J$U*qHXQ0L7fEy~IL(OT7 z7~(sSg%p@f7g3B7wVn&!_`J)nakr#fceE$RLhoA;`Cl!-c4{z*_ozT+DVuQ*n^NFpPV% zt^p7^`t3+ZPwHRywph-?ME{lVdm(Lz7PK)3#jK(5>Cm#@oul4+=Z1DA7pGU8XrY;@W$f)KZy z&K=JolebM0YWAdjgmuZL(^%lb$ixfFl?xF>ph-CB~+ zNlp$yxdOjLPV$H!RrQ7pbE@w>dkRzG(`<9;C=EB4?+@6MjC=jqF%;3E z?$$a_*zWdwkmMsVCbW?RAV=n_?_bFoZQ^wqfzV|MV3Ln|X!B9NUw}JD)y#j0vxti$ zkmZgVQv|iy%0A8%M8jh4l^^5g3f^kP9tmlul&4O-0-sVs^ig<9ZynRnwKm?NYKZds z=8OHx0&CbhiZZS4+i4Al;T^%)9&dpj6e_E%x=wACk&LGNP}~IV^boBor=l{NCtha{ z=9ZcjwRx8gaGv9cQ9vTQ`E`qTfe{v=CYikz2v03PG!J#{Vr}s$jmfTdC4=hK3UK}! zJ=u57Pf3WTS5&_ASR|n5S8c?p5vUd2#kX@AS-u91hzodv$ESX_*J9)Dp=~(&7++U# z92Y%?#0GB@S6)7EWPtdWk zBUzVNW-wEn2B!oEDT&lH<`P$Zps8fL-OeFiXy*raA9oo#TWeactG6Rugj|NcVT2fH zoF+#OGl6&#DRme!tbA?{C-_ByxG3}-lG zR32mkWtq?d^cQpTJiqZgkpLqjQE_QeZRIGrho(GOpk`~2%`jr3TB2zOYateJ>SRBJ z^b@+D(Njp1zX(7WqogFRCyE(=!j7qbO$CLVln4q$7XenX*;#^t^m1KkU_U;egHUY* zb|lQ-AX~z^OcfjbLi&C;{ib$oZZdmB&jlZ6uAyI+lN@plDaew$q3daTr`mH1lb5|G z%hhE)*)hsx@RTRaV_0s%{}zKlp3_mDREdLQ*!_f>W}Hvi`F&zet}@mpDH(5HG%URC z8XH1K`-d1~t;%C#FELnE^$~t7w3&%17Yc*{$&%%>OiB$-9kAF*g74*_p<}@B@&q8= z{&_DZ3;!d^yLYx=#5XIH5cEE_u>S7!CjW#PG0B>kQD1!r__=i%4*3wmKB%Q@*u+qF z3#x7pP^9f z2$0{;Im0?s2s$!)4x*pY^8M68^id9yb}rTPC9If(Aiv{JQ}eUU;wFKQi05btc{S3L zC?j=>Ii1iNzL;oaqk13hPDxJhD0X9kjV$Pte{f8MG|7qNqvMr6a`>aRq&Y2Om5K)CJiqMdu{)jassu+x$BJc?Rat zKg(#e1HZsGQ7NM+5_T2t0!H1)zo3fH?Z3TUMsecYo~dn67-oDM4-rRCv&WL>U$;OX zz4j7eV`F2UXj=NK%a1igx4rUx=b$QK_RV#w*Q+cSwUP)6jsj$)g9bgoo}GZ&p<x0#m=`9bq(BjyqevK+?x1e>m*x}lxBLz_0kaY*pFpR5xK5@~=>Toy(c9drWyvcZf0$tdOj#*UD7P*~U-_lk{Leh|aihXEc zIlHJ2hf)jc7X<0Q#s?(|_)h3fSL@xMi=imp` zQg45OGwY6<-9fk~MryT1o{7#?p57U?>{!-dTL9s(kPm*#)!mu~T+riI;H=`)EJ)c8 zg;I(cq1HOso-9D%mvj}#l*BTBk7&yC-U_Ql)9vx%?P6+wntaNZlN@Lop+$kBZ8^6J z9ogE-&`53I(5AnVXM$jtrjr^J;6w+Ps0vOWKt!T?a_2NOpCxXs(L!b^;XXym^$uO06*IqEQg&rn?3S16)}3f51M#r zhyQ(GoO}ZmwVsB%&O%Q>Q0)YbA@*pfHPtOI@EnjfS5{F`WxU%Su^TSALhWZxXv}R8FzNO&OQkg8 zMh;&+2dA&&73Cm1BB}5WCH9DlGLgj&XC9*DIeWF9^X||)PEQuZ+pf|gWel|nAd2U6 z#7cTv`TqLkL3Gqcr z3oM8Fn*$ssjZC=jaM-=&i`mb`UQ6zhgn)g#gwV)rO!Lx$ABjyq+rr_Sdo%sM?KrMH zhJ6VaHZvWo?=75MTi0-ztxhX2?QE=I z5?rWWMmGslHF<)3%jAxv8nY{YQfwWT$JdYb_oimBQGa3Sr&q`844e@bq95Zromvo{ zSa`3_QTLi2j-m?~<94umJ{o*b`xM_Eb#h27qR@ysa3g=6;9hKD31x|%`E5)%8BQ|$ zZ&`n3^Yf}m0CP7r=^7XKMHO#b5;jUQtXyN6fYi23y8JIpkalmx80iq{bofu(e+3mm z!{Iy#?~EDpfRein}V!hR+LKk-P9ohdAc5oN==DJ;lw<8h<= zYcwbKhm|yBWkO*y)%$9{M8Kz&;U`KF)8YUlD!L=@Yz^$Hjdp!eO^~d>)XUtm#HCS` zU{&auw7F&rxFtps3ObI}bk z-!slwc{{(V$RBOGBqaZuYl|dOPax`o)l+XYdWDn9Wu6-V>YxO{U3m6pWK*9q;`##c ztPyy6{GQ~T%N-CBePZLc^Cc^4y^X^n)_L z`7=QB2RV@K4GXnpd7M^R-@&;sMD*60nH)l| z@LMfcZi4Q*kE=l1`|9_*3v-p#fQg?aM6IwnjeT-^)EEkIOmDX!?o2V^` z&DrWCfB)c(Wv?AaYnir)e0w=~h(4O_mq>DggM$8qI6;GGC{IIq_U&wEGlV&P^oArP zf5`y65vE>Yk4K%4?&NL@b`T*w-FKhcJy5;5fblfJcjETMjHkk;R5xSThpxFa#4X&{ zp{NKxeTKQ})cy<>+r{|F&uKq?mVA1P3`zYSpBNtN2VRys*$1E_QCO4C14=kKwpjf| zs@rpo$x+DQ21uC70mk?^$U<#Mew_S3GhzyPjSLY-Wyjj$Q(%oj@i704 zoZflW3Cr5)R~CQ&Jqlcxj@y|a$FsNR^|?{19f|@P^T-?f<&RprDZOe+(oo6%T6}8D zBISb$Qz!6hHVnIx40eT!{qyfJ z)N(B`2=ozPcjj@D(*WObz?q)zBd`LW4fhtOyK=cGo?=%$CPG_Da^);-zDh5M9k znxhBFaJr8FQ1yEO6zxr%yI3YSjiDs0@@rd0TMZhVPB!t=LIm}qiBuuERZcP(c#{0c z6GU(K1{H|mY_a$Gkk@WC;_}2NI<2&&!bF{6vx|^KMtXIya4vyQwa?<=@&cocRg<{R z>BG*?p1@c&qtR|+k%1bDpJY=Q>`>ahW<>xIRU%=3+% zMUq(6?qKgao$KR94=35cG=p!V5UZYhQzdJ*mM9EefLLU{+Z-S*yBskv3_0ayCjGKj z=Y}&%c8DL-%qV%k7sH2Z7qqA+n(;t(G~sQBtoRQBnCNjpx0kyDP99~t0CBcY{2Ys@ zLAh_l1XX@>xpbb(p0iAIxH>oS(N*pX?=2Yf2JG+B!x(_zpKF8EMtqgKGtDr)WqUy$ ziGf93^4VJPdk8C;%PpBtsJDKhid<1t@bzjeOB2&mrG^rG2Cq+)_Bx@TsSgC+5)~)a zR+yk^Cc8q(pcO%fTYa#x;Nj!=$nbG_=CmYm-NXoeF87M|ad8~Tl2m`nt?=Q$fr=L@ zy9;|mm^J_s$_veoPZLUY=^lYzVNzM_u+t=fr+e1-s-J2{3B`a2TR%k%w-_AD+Cy>C zv#RAHd8q0Llc(7o?IRudJ?*=Tc zKSPGA87qU;F#4aX^Ql$%&Wvv~8MS?;iW18Oji>Mw-qHSaUW*qx{-%$;Fu|)z$61&` zWE9Vh9S(-Ys#5#;7@>Z*i!GPEPERpWprh_2|7Ac>Cv7#eM!G8|BZ+vZZ%QXiO2Js( zpy&91Ytkc8n9a4~UkGUAbr0NpZK&Yv$T((U>o7A=H~sAIL>MKbrQeQlMm24>eArCF zn%Genax<`c!O#QL)LY!?_XRgWo)YC+(Hs01dq8 zHR3btIE0tBGp9M-wM@eL9vly_49b^)piSmr6 zNzGG%Un$^m0R-GfQ&3Uf4DB@Dm)CNI?CVPYIkd=V11NPLC8f+?L~Szi!{g6uL+e#c zoLEXWg+h!v7}sw|Rj1M}m6sfy_;ndb?2MEre)k7|l$D5?7WD4cpvlKFF(Pu)LI^dL zNGaI3_0+6byoFhYdV|&(xzMUJ#KP8W18?yA<&UIG#yAMZ?Lo#c%e_PI_oaJ|hSDm& zej0GzCFA&OvAUHAOh6B7xFEwB(&L^?e?1SC1>_NPw^wGTaKf7l5Bm(dzZD|){2`Y~ z=ws<=ma8Zz=k(<##(wf%BWt%_`Ef!QNFilkdbsVXp-X5yeaO%fLzym-2ZVy$R%5+B zYMez9`0(ca2CF`XX@ChKTU)-wPT`@x75(y`tJ=qzl89zDg+ew0!~VI`NAxzLDi|A0 zpq2&r?;>J>(*$ciY!iSVbgW%?O_?X5vQ@7F&xMRT55x5TeJ^_GR*pc>gpm9E4cN*1 z+<%j%qe2=a=K~}hFgP&%80_gs7~vJopwPaK+WsrgW2-V_giNyMC#o5WvizmpsjA*76dIw$Yt=e$_KDfH!?VL zV0w9_KBTjPxUePJlvbM7H_TRO^$$A+y{rHPt?SQN*Abu!YHuCFhp=2tQ z>L!w*^+cVkKt1g7Z9{sq5FDgrvh&{_tHC}7ji(YE=|F2kCJY#1klfBqcGEuHmGsrv zAPac>t9H3MAj*~BBTlTo2<6ur<_1Z1u0KZT`~SP~O(b|AUl1b({6G$riHrjSttfc} zs#e7@b;Ev{sV5INTr8dmcR5>gyFy_iHiNhU6-P+<-~z`<0?uW&)`!9kav>;UP0V@o zsz1y>46o5NErz!9uVm5H%LC2q9v0y{jr zUwICWml8lQFSmWmUwN*%2D?A22V#E9UwPpP+Mc4pbKZW-UwLg1vmxxyq?UZoJSj8$ zS%~>Pp+Wwb*SVQ2SiH@)z}bq+UwL~vWrtGwxX>7hxw)Lz>BPMy5f+f*&fH4e-@Sn4S@rpHttzsm zy#|=#Q4J1)PP20soQrMk*5ResM2%oqB28e4YL(TNz_LYF8w(1TN(`igV(dzRU!6fK zaG4ZPiDJE>v8Wn<{w6o2ETKZE@05MUjHd!Lv}{qPO7gs$daD^0T1iJZi43S z0}-`TGqWgkS)}WnEu`Ki^@k_|wI8$ten8GV<>JT9**lss`c7_Mg?;i0`cu_qJyC9rI#H!m#mU3Dvq!lq1pi5iQi?M4M1L zQAR7kyo%=Te26_IT#2xEra!a2qGNwR)^f; z^_R8M)dml65f2s7&Kpi~?BHilMRTGj;0WJfJY6~p_9#D7eF%cp?qpK1h9n420rcCD zzsBhC5F{8Q2uPd5aetlyz}@!~4^pYXSUy(E9scE*99mVszXdcHjoZ2Bv6S93yX=il zTf8+ZZqKN7;AOo$H=Do;M~CmCprMR*k(6Z6Q1>PVmY#zKjp2q@6ZnkVxFW%5i%3Wk zaS?dE$8aC!H+u!1+8_>V_3O!G+OlYI8;>670!fWW;wdJ>>@f8NueA zA8dDm0zg(l4_sqC@)mGn1}i=wOYKe8gI_3MT6~g+^u0A&W&4sGZLA9y(Y2$eRdsBU zg8Y%@D9=65Hm)*u;ML~)!TI=_R%=8cOYL*8l(1j=1xEk}$lYOTN{{q&oLzn`)D|50 zF4fo%Fxc5tqrA3rUa*{qqajpiM;}ud9YHovrevyjbg#}TG3){d$lbqPdy4)aEz(m4 z+pgn87=73jDe{m-cY`C64_X%QK~i+)SDNcwy(Y9-KG59WDhn#li=+dg?jJ|B5*#*2 zu8eNVx$n2i$R}3Oq_0e{F=%JwaSuS$;1($tb|yPuA@poSU+9nGC-|=WwEhC-ypvqL z?G7-01&+V8fM3R$stz%R(PYk$gH{r@_5k}Y>BHr)0AD;r^2M5-IJ8gAJKH_z8CbSG zE%z>nL2BJpUaa7?xvFg-K}=0J$=i|9*YecATJRg7WRTG*|Ke- z1?0=dAQgzOfskctx9b`1`tHg*zU+9GLula2=mvVt5*glW(L-=0Cr%n@SZupIn za*2FMd)6;;RBm#FZ6F9LC;9bRI2uzDt=RD8EivJ_7{WZhMCqr$<@ZagXW;Zw*hJg` z`Du|eS&O&JmQ){W-==Rg=OP9?t6h-f?l8r_cSItVFHlyL9;h9|2W4z5tj`mrE57H~ zaN&VJ0fL0TWLmg{RJUJ+)TUI=_5Bu?Oxk_qv z)cc=j`pH?|UW|m}%}bO&ZoxevL7yaih>Zs3a~)g2mrP)xXyu(OU_t z(^x^!sud1v4@qwf|5QKl7|Fm&v*WSeDbi_{d!`E?AQWrRRUZaH&sUj{8OZ`30o}dY zVAf97)TAA+%vqESz3(|UIF@Ep9sddT_*=Gg05;eKVtBu;mG+SB3-cf`=SyE%S(NsE zzn0_FFRRr3fR^Rpw@4S6kZ(X7at<9ei*wn@=`l1@s6TC-Uk9GZV*rT{2jlYzdR~GP ziON#eF5QlrPYl5jV57%+MZZM<7IYr@w`7e+It$RKfQvkD))wwS9C*Qz0MBB8slDhQ z`X2adf!e3Kr$D%Hz~}cctTOAx>UKe$}NG}?8_=bf{kQBy(*&>em!^@7DH~|Hx8MDytWCKc^Ff;2O3UjdVKfF)$i;Wh(RZ(LgFK7&q+;T<;BJ^;M7CI;)3i8bfU z5v;-#saP|&CU#L(SA#GsG`g*sk&G-ub82+z8N{T7`0lNvUL|y%Ctk&+XcRIIW0n$G z)J0~SP_~pyzP-#iwSCR|FR)B5c%jiIuLntX%Xhv=bgrKo)A-B55E?8H?N#}FPA?~U|8P2 zhPMzM%R)|xv$3bHhGwz?m*~fI37uJdv>KVcNG@1ikw)+nOmiaEF#)|z&+=}p19#Yj zri{-YvqXq>FssT#ene~mASs7noA|lIQe;X@M4XeB$^);Ef{?mG(;+ySuHl2|7F76` zzgyJ5u<9Ywj7jKr_5Bo21;!0d(Y(E@8KckI;H>fNs|d4!-vdaSfG#@hBSWvklZ{v; zz11UeqavY8xFky*0pTLs%V%l(&oxve)a236>Ew<1;?d+;Cf?V@1m-=6?m;h=;-|7^ zJ{L|MeUb>n`%w0t76ka%(?zwtdyeF71dzO^WeE7LZ#rg2#rA{zh~(7oUBL7`r%@Ip zguu&FbA^j~u~hPAY{D}by&WK17D^@uYJ}M2vozboN#XR@AE4K`wq%vuH7mqJ_|;LI z4H=lA^e<111Fff#Zc7Q$Ewj3e_9Wu1#v5p#734XHfyuMKNMPHp3bk)?o`!(mJiOHP zuw++WI-j3eylmpTJmt?DVk}NM6>B`}PhsacxGq?Ju@2t}HvFnpZRPYdvrp8>rM9d= z^L`!vbSul31ye3(jgA%*ebZ~2D5!>By5%~Rwf)cejoWOR>un%unl4JNeUMQ}K`>$4 zKPF<@Zi3TiCm{;X7YaQWMO#)wvsGFFL;5d5+lZ?{_!cs8^@P36gDkZXDae2xQXvGj z|KA#Uu2i_ObE=Vljg74LrrCE@`0Rw(Ob}mGPX~{jKg@zEMs6S>$-fLaN3QhZk~WD< zN{cDMkg5T%Y{Rf)G%Ot6cZLPbQJc@&lN`V>w3*2*7Yau;&x1`;9k94490`t`x+YKi zVDt0$&wEW36qLFa{I*>kxsp`4z66dXCn-Z~1Vse7WFLr8E}A>iEwek4^R_}m%7KdS zr4bMH{-pps&=|q77Bttm(Cg>pi6UoEMXjzh8K55JbiI>{g&S$7PsEziS(6TzSAS_i zW2vx=rU0AR39c0QC9F?F6e>9msyg!~Xf5>|JQ~`ko^(p8BA)G<-~v;sKJOqOL|a;S13e>hAuC8WLg;#419AM< zqR}SvyJx*Y(g;;+M&8Kv3fF1}@q@X}2wuKcmxoDjCh2b*wUT8@-T<0>m;0(lxBmgI8yIGt;Il-`4m>u1GcezWlh#A!HbAg z<>|$^fXAwtfZ*?_Nwn@1eU*9%c9a$1MtLq7H#_FXj2b|`7ko^$lAup86mF6D6Tzt z(@CtWd3QtNu^&g}w5ZVYG%nWWR6`3Q|6GdCeskiH^=AWKS7-Jlnm)N~F9Z*JPPWGA zY}+grp$_fI>TlUPmUq_mMi89&VBS{8*8SFN2oo`Hd;IPz8^mJbX38E40}ua+q?Ms= z^;TA$8on?eze6TwxBswV8COy1iV{na&_Le2uxTB?RhcS$F$%iD51MzZK6iqa>3RA5 zn92n3Kf;U?vEU1eD|qOc^GC{{fU8Fgh{>Fy>>Fr9MZo23`MD_{*{x-E*U11$`Bg`B zZ3&=|W(o7%5B&@qQ!&wcpWc9^8f-JmkTc@slE1?EWUyH){~zZ8f^l%F$@aQwTepC~ zV5uf$8A~fdQcv#q=Zf#=73Fo}-{;zTy4X&!7|Ey(Ys2dgF~fLb!UcqBG*b7X^X^l= zu0$Aa3f9fT^37J;lN@u@C1nu%f1)*2?S+_88_j(PeKby!T|`4KYi#7BHQFw9$zIQx z25_)hN3I|6qYXF1@_Hje6E03|r#eP(07^y3Cd7&(Xg$h@k7!-|05&k)FAft(g zB8`|2>y?s@-71if7?XXY`-)6yO!9K@6dV6p^qyA-zIvR-0{>C(?@Bzw?Km$tm=}1T zV?jedMYAlb@3Au`+9eD+mkU{*H!GI)MrZW6_^KdQjzK+C%%B$MjgqE7lzbo3;n0o? z1-ba6W{eAYTk`~a)zV3v?!tezho%9>5}9Am?_`DL=Q3isqgzEmMpaS!Q?d^o-4*6^#zrX)8=g z1cxOzN%Y}i3_tAj--<@IRS!vikPKeHtdDz3hUU-A_6tGE3t8RKJA4nFMuq<`(bXUV z_oITi2XtU4@ku>W0V&{gcW|g3Ro5N&%zGH!{fTV&e8aB#joXB*j6}H8jY*9~g%%&r z55bbF^?yY}oGq(s#IVK0gBEjGYiSI%7P+q-2YuC<;Ciaf8x~2X+F!hiRskM*@nARe zxeyR~zyw?j98`#0UVG96Cuhm}*xK`fgv{&huMo&AYIM(|s;_g~~dx`FG($rhD(haJ{wZTJcM63{A}lI6+hpBUCBsOMZbed!1LF zy9u5drD5%d+US7swT zcplU74GZ!X&F^lqq_c|FhNT2nhi@M_IqjHT-@%Q4xyV(zAW4>t-~b^}|9|YBd#fDL zWwV0x+Sv!=OYK}l_elK*VXipcI{ra$6B{rW-Yd}iBon)Huv3Hz6&A^;9iEnk;ppHs+0iF4 zj{o$2^;pIl!w4CnZi@xxUnSN{k{bVuMHi0uvxV6m`6`LzR5Hj*lpe(ct@pCNt?mG% zKwH0XfnVP*w1xw0c!bkKRWHo)x=mwqfnVPb6^lXQ?WK)A>9c>4)wx1KVe?EhRlzlr zWg^cu6!v3=ONHj?oEG#Ha6N0R60ZH084T`#6|j3C8CHV9V62E^a)PT+fej>&CT|uXIk7^5Lyzdb3}-a zmRgG-EozZX(-s$RyYxqa{xJqAE9TeoHlIY}UdLCFt{sZpSI9ZI$ituYDbFJJdJB<3 zWUy`@ES`mA#1ZX4npw54)Ng?^0eJGh$E)X?!gxeiV`EZ1MU#n)CcqLUHTm?a=W$+P zng3%%_JO)eYouHLDxEU0Cn;kU^k-Q5Ke9;2ni-Hl-he7kU}Gc>0SI*$>RRzCj71l* z;W6G~)z=D*qHPl){qzZ#%rt}wUAnhy>;SQ6BshyBOB<5z4_1DRnH`)}EbD6+v&;J? zpX%=41HxFvy0x0nWi)>ali#mG-Lm0m86p=gKpH9R2VFKaidA(0G)^c#04#%I;5jR~ z(RnSl)z_CguOS|a{jAkEJk@(=c;USLo*${+za=)JIyZTt7;< zaG4g0v$0nI*lhk*@~w?CVJCOx%tjZkB(fW>I#L*Ofq#y37hC%sLKbi|L`mgG&2YNE zIK|rn>tRE-a3`#G-xI6ibP5IWR z8c;DwIshs`Isbr)L*QBjmdx|amw5SDYtK8K3=BBEb;BG>Vl>584+6$smUkIBix2Kr zU&BvAM_Dqv^FZ_*)HD?&jH1VH&uTV%fV40C@!={@1E(lZTLYe(+EW~|zRY8=AP(4t zwk`qAjC?4XF^>PiIJDRpqT6#hk&98xN5f4X&ed@6FW z_%~p_UdOJG?(G!tymkI^QB&qi8gp3qa5*Vc^sU^7Q52{kYFhCaTwtIKwf;H7vC257 zz5sE!HeKep_gvz<6JYi~ZxYG$%?H+g+#Je_gdYeyz($&~lztG}IaJCaku;I48tVS& zq}vpct8Fb793r`K|KS%S%swa@K2$A@mc|2n8UJJO6iMS5glPvsU!6e!rotLIT^=Aj zK~KYzAx1xD*X`IhqJ2=Z0}@BR5LWI6NK!v*oy#q-23Yw&V9W?K_}=n(1s?=ky|g=g z+0mTP&PIby-Zs4FouU_M*;bh3VWdUTbr#lWZBY&l!kxyPNZKJOUropCXF9#6qflro z)YoOr`f+hn&7k=wh@zbk(##*i+9BGiwu~fd+H^m)op>I7wibWRv9~c>RNchD==VHU zLepcFGd-EQV}?ISDE6#Ts@G3crpG^WuB70AD$V7hPcwMcxZx5kDM1@*z`e5%A>yDz zJzH8C=&+nV^k7W(^!YK?qMRS_g#&SMcp%sZ5grLe(NvnnFYrHo)CK|B&0=+qe) zM_L(R6LM2&3L+INMvk|SL9w(5;h2c>zw2Qfqh6syjw*?(3x)7Ltzn)?x<|64$BkT=>3D4?m!Sz%=@y0awo;pw#H{F7ESV>A<=ENR%Z{u*3 z!?#GgmfzjzR?RH7`pMq}(OPMrWff$>5sk$V%EFss=ENRRTX1a>xyNrq0;JMx-}YRD z@-b}dJVj5_T2;!p(47USvy9rgBx8sk1HU_dU9$c&3_uSaOZD0luAN6gWjW&V{HdEK zm3$07Z-Oj|#4MDe^VLXqq_Q8*4Orph^i(u!#S0pUpBdMpdR0Aw9@z^Cat0g|GnJQ= zaZz%Ue6;BucgraH(j!o{CAaFjQHY?<$e$%19AFdEA)n{&y1I!SwlgX+5BEWsih6_a z0_x&h>dOIC088BCYRflzseFs$YRflK*E(z}eoa0Qq$!XbHwU)oPZ9qQM?kRSSHu{x z>U;M#S_AoeS3h)UEa&u9K6sA77$!isOm#VfV8Tnlc|P35;8tU4GOBE^qQqnfo|1?i zwGwQaj!w^UC8-?gN7w8GXj)(t6ODudM?^hPYJS>xlQm+K6bVuW<%$Es$+f-IBnSlrr z7$P4AEv>#{Gt3)WQ4RArrp)!6D#4dEl@#+LSwM}rCLRDW1Q1{dnEu;GvtJgNKaGCyUnCd1kIyG3Li^O5L;4Q&1t!4l*@aaObcR2M@G30Dj-{*R0l#dtG zq`&?vck^_LXAX+l{S<)q>?~U;eD5MFpngBewfy`j7gExZ>x2gKDaki7kxZoeFTuU> zo{H$v<~2!qk}xuVk2OX(m3l&YnBBPLBZD4XWx)YSEg_7PA?g8qv~p zZ*4xg=%s7tiV0bu7lrr|66-#=EY*Gc!bxC1ZC!oNZF7frb}3`6#yZWXB=#_)vJO1R6Xq1=pEb`N`xm(t`R`c zA%rGd01vJ zHcD0AB!jIK3uJVvV6q!v$3hEB7U zTGL5VB|TlP@z&wQzWcwCF(Oo8l2=6J+eD2`%2BHoo4~T1OpQ!RO&_zyBWhwa&A%Jz;yFWMEE*M_V0tbs{SlRt&}@ zeMWGFSE(X-ekEom{;~c8Pa|N_MRE5!tx-&HCqU}UHGsa-seBts<~oo0A~so=5UiC8 z-*y^14g@IM6Jj?!LdT|ZL|4ldL&p_h<^Gb`QFTVA)KK>UZHq`4Y8maYd4miyK;z^(`hOlhnLcM$T;4PZ(v{PZ(v*JLeXC)Ub58-R{W0r;jSl$cDi1u0(?p3Chex zp+pHsp+pIC(4W+{yV;B4y)tF^@wfb-C=lVJe5IEd<#42!K+=fX2%~3ZK06*mM`ty} zg(DCl_;7tT44m9eEJgo=@$+x{pXSX(OJ*gD4BHvn)g~4bEDGjH3ER&_uKD+6lD~Uc z^FdOp@}&{d09p74GnaxoK{QX>AZCkvzLCe4}Wel$%c1StsQ-B;b9FL3>BVw(_W)kgqvonq7SmKJa?w9G5 zA?{^Ng0Gi`ow+V#K`QwT!>d*1@f->UgIX8U+3&r-@L1$(@9p~95F6Kr{ z%kI+QS`ZYt55X5;kdP}$n5zkX&==JiQwTkPH60`Qbdbf!2^=ntVS2<#(;5mZo6zrb ze@{Zvu)|Sit^l!Fog#yO6dekg3KEJrUOw&l_R{9vYxeuzY3}pV@DyEl%euv>R~`QW zvX%CqU0IYjgTIyutoe^ymjac3IfU0Agc~KUpkD|5BKjhN>g3;1;I#f(M^V(q1D%W^ zy1gaGDBBEC?+DuG+vH3Le?`9xd^|^fRo!ufKCGYX!$XdWoi&R6VAnkkN2QP_?_y|w zAdd{qgCS1ozNbLQYvuU*bin76i0XfZVkt$AewaZ+GGVWjU$g$}h`X1OHtM1zme!k_ zT%fG(H@VO25A88_>)u~>IcYPNh9#jE2LeD5TeVB`qft|2B#0^#yva51%ZDq98Cbo2 zXm5ME)quiny!>05K5u2*vGn740mT{K0Nd|9;-hB7w7ndXgfP9CU{sxBj$SG@*<-kX zs`os=gZ=Hn#RW{LT-8a_P@Cx)>95xL--L;?`{VX;{Z7|y+4NVdnvUnj)3lve*)OXS z@fEZTwl?5eDzAG@2;{B(fsM;<#$D5okKrAb!8_eS$=+uY?8m_Cyb^@|ofQi0ZUzYuu*q9IbrWSjVxP#wheO7u|> zU9YRL!Q5gv|J+B%j%QciY zFrqT>K8*uz^gQ00^EW9zK2Y14E7tN%fOj?Mq?0tgXiF-jf_Cy)$ia>&)rB5lDl2 zGDr`)f2FK>S^hCZ=WRt~k#tIp7gpYb$K#ZsGR48|Me}}F%s$#^kMB8~QsC%zJ9WSY9LV0>MX5`TnI`^o1xTznQgsM-=fM zzMG&L?LXQM<6m=}Veg|KAjm>&HerTTaI8iR5_uTuw1OZYB)wQEyavYwY9Tr~N88)P z`_Ix;ZF&zPWSor8If7#k!U6s-qo=`ou9*#R4W_oKPFu6`bBLg$Pk^8uzjz|1z|~rt z>31}>c3{~;i44F6t{_Jy-4SO1Y+*W-Uo}h(6ylza12W=v*Sw(|5DaeZc(cPq{47Xc zawC$&xtu^N-ebiZ#+dMM_8J1;nVFAIz3^aW6Snvx*cwsRP3OK;3HN%CrSZ}A%KuD9 z1(zxNsy!F_(gJt;guTFF|<`M*kE zT)^yrnD0|D0^frLg46ub8be!(WM|UoYcp1LNB{z#m+GR<4q2}dJ(5~|{B*N;he7gU zvWo(b`1ZEzM~(5oD#paaQ}b)SAPkASlNHGdLhLIhEP-}qe5o_9&^zN$*!;pboib3e z`*S9>M>=wEdTIKsrQ@7-sn9YP9x_Z37D^r_LkPTzC| zP=y;rxHzV=U5{^Ta|q5+e@?cVxQGL}MFM3oth7nATo^sq-)JA2Bu>9k{b3s%`okD8 zFdM|Q&-iEfNt)NUEGi69QKLyZO5N|HyFXCeoTCe$YM(0^Q@7Y;2^PxxC89aPSz^l z1W7~BtdY!4B{@LzUXxaujLijx=kRv1P|+HC4j3A6j}~dW;4`>0^jCgr+~%j-4m)>d z$(sl<>=orh1MbzZAwgUkf4bOpeecl5Lpht$*yJMJe%UZGE2Fw2+}W&9sDEX`?2M-| zd}XwriH8~|9UDP@gkZ+-$sYg?iN9&T7;@OMqX34rf!-4kod$4dr^mN&j35;$9VyN6 zGzB&1p{U6@lH+i43Xos|BB|zT^(?ndJ$GOr%o=@>ai==;OPCd|U_j72d((%zt~z(D zM}kndL8=CjwJYtD#N=vbukc#zG3pFba~WZs7rXS31)PYGiX@d--&EhO5Hl&2KoSV5 zkR7r7}ign*JCVJ<&}JX z$L%<;Am*1SS{Fq=(zYCQU%xiGFin&0bpe3E<&}Jo$GnCe#!BrNeV6kXqf_jE=#et} zDnlcru?c4E(7@g})9~95W44MU3xe*8pzg#VQ8-Q?X$);3Glgb&f(Pw4p_Ux*!VdZE zl5_B`q5t6IBX5s6)rGYlW?qE(*Y_=o#PO*5oQqp+<$6=kxB{ zBEW$hnl@w(-7eWra}G_clr7jgfGu|a0d}Kw8%l&U2Nh_qtKLS=^U29#yWA&Dvy!+6 zGO{txRj*gT+_y3o{=EP&Z!}KRKX|Xrz_!ewysunY&)ndiZGWgVEl2A4Afmx4o(KIP z1zQls$%4Et)ct=?mO=P1-hsy-tyk?NIMxbG6^y|+=`;^*RZR2v7Ul6CR?}fuEh;6G zi#yt9FC2BeMB%vzQ&K=1E2N>5@pSlp4~0;O+j`g`ll8$nB`W1|gl*po45xJGna2R>dfC zIyl&FBpcJkS=-g~I`M3a?H+;Trjj~)C!YAGmJbX2CTs5lxKP$?e*Hdy*(cd!XiVux z_Gm+u1+C(SGfQgz0%@ct5UYS^3YGbD5LRtX^<+Q9*(JEAlCIM|7GrTpoPm|RCLIX# z`1gR$52w#-WnB~o+(|7ZLWvy`!Fc7T8p1K^W3WWH-&~Wq-7mE*5+Xd*lP&0t; zyfXfnSvC=Q?7JU{rnCy^dxH$B?WJQLNb>4s?x&sHxfXw6jRlL-vXc@I`H*T7+rc)&ui2B*~|~D?H+;nV3343#ZWfwmiVRqp8vA;?#*$%W4WuRA2Sl|Ev)=I zlJ|T1!XzXm@4Pho`-$I28nsg}nf{C+zJ(>aWR0rPv6xtC;?(LzKD|7Eds<48G0#GVi`PRSRCo-#sRR8okrDB8D9N~Wy@F1^NjzQPGOf_)4v>q~6l3f*ORTvRQ47VdWz- zYo&$7Owr0=+XrF-^XJZQpuNTKL)=v%CZ+sSBjj6MdxlXAVAa^ zbi#wHTicf)847FsYi6CW4t+3bkz67HZ%5`Bi3IF1`hmK3RyyoGM6yU|MDJy+{W9SL($}+&50rJ?madJG zmII+>s~c!edz#6j+1CmWRQ8ZfVY;^hG2p7~=|d}p#hX$eX4t|v>6VdZ8YN-&+(7_F z$5Hw8GcJipi^VsujJ+dTjqnd|yK=XMJ6;0!XsNXnoOJQl=uZvr5}0xS zm?D0@46!H|0FgD|48A~PRZP8kD1`w^pm(peIIU>B1}QzJIy8Ly?2dF@Yrsf+FT$6sfmkpo^38bGoUO`x(8aOX;|JAOU_ z>I4e8(M2!;LoEAb_8*^$Ehj!bv-OVtZUzM!BQ>Y zT0@y@PY{0UbaySV(`q)V*pF(nq!GhBIgy94#d{WRcGC_NAH2giY3SB2aDb#yhdwJ0 zz34kioT?rL`)wi-Eek}YQyPM<)iD_uAaB{URa54s3tPish9ej`bvY^0CLAUGFNl{R zKbiBw)_&id4y-lLum+$l3{jGN890eEpBzEYNxQffM~^m@hiiWcmGt~H0M8sG)wXMz z+HB1If5z}9`gl6&KI^Nj1xQ0votYP4?K%&}$cG{icu1`Z0dX&|m+@cCI@QVdwC&SR z?;l4WXih3QTBUJ|T%ggIkX%E6L9vSQ3RwBYZSzf}vbdC{515*bFw(E&qEx!Gw32>r zV`9=;bLh{`=jw~8-By?l5M9*s0#1?WI5E9Pil1#Y@=d_+Y%b6;^um z|4Il7fr-y(pFPyi*bxhmVe?!g=2{Sx?%zT)@*~eQGqa*`JaYiZ=5otrc#YUOqp=S z501d{n)P`0XB=A;mS>vnpDWGoLz;6rci6y!SyoZZNmbmAU&NW?bOx1?hpVqy+ll36fMQWhgJ{9~636ubc`OyF0 zJQ`w53a_9nQ^#40zlng4=K1CCoyVmg394eKA^?tM##>5Ct!ns<`~l#R-Y-lLiJ5#A zIT*q2@qI<$KdEIL;Pu#5yZiKDd7dxPlOmFDZJ}R_n~fx;S(we1ZjSz43K6gWO(#C^ z{5meQX%kk80b+5H?A6MeCdQcYP*Z2a=^sdgLKP9z!rs0(pi?ukrOYjyWI{wzr4 zThmc|#E4JT(wE2t*Sy9e0ekHopgbm& zpAQVc3&$R`JId?JQcM4#f>`|8nP>s*+XsAHPnWleMM+27jND(F=&n)r4>K`nUxYrX zz3{vIt&MTC%9}#3#C)q*4K~ha$}BmwYp2GEj>)I8sYw1o9PMNfVa3nKmyjEX?vLdX z^e%ApLY>kq&PYTHy+=lBQR!!(v~>{6$SjnGVCYP=LB_JuiTxTl$`?yTNq@ZT$l5V_ z-czl%o`B>ix(;*BDP~e^rleva3l}Pmqd?3V`+?VH2nWDa{g~duBH0T^w>Peed`uYL z*)Nu(S^bRCa=Y*7aL6m7btE1)3Ft{E9gG|~3TDFC;KySL;DpQXju*&otziU7#U*!> z5Yi&s(MA_K%yx*Vo^a6}Zn3Lw>^V_#(XmcB5^vA4H3bDa1oN+_* z8)16*8O)$-wPHWoLI*0Cl-<;TnvpQYWWq~s-!Gqq=2{RZ^bd<`a8MFARk<9?K(y%+ z$6!*yp3;A^ulE-)wV*@MT{8iOi?iPH^-?^nF_LYA!KHR+C^a;HExXApx-E6;@Pw?v zHgDirhR~T!%A7{vYXLYAn&07Tk>3E+2|PS$RUT<>XSgp?*rs4>A5c!HSC@VWi3^V1 zsMorbn<56B9&rIgyb(Ev4eny#aKv5aI^3Ve;`U&&3BachJqF9>9x8eZ{1;+_=Rq?- z>+x0jYL7=DxZH7HSh5668zo^P^_%6pfOjG}D}O{Z=$2oO6(ITzVcJa)b{y5q|M`u; z%rlhdkxgA5XmM^rPG!wc_0JxQPqLIJ>^+s{q9wPKw=&B6n2IwW&5P zfUe>Dim{~0GlUa*GKl7cXhMd%ef9v?x2sPaYVA=hoo$ZSH0}`cr{9!ymBqn+Ccj*f zs&`fItGTd~dnnm#1WG^#)o(&GZ`=a?PXcGveUkok0M2 z@08HcGl<3Meu0r4ACPmb22Q`56O~X!7U-&3qp(ajutcca#w5o0>G6|zqWp;q);~4p zk^$$1ENhIw{gUq(+;@p7JT5n|qAA`69Jsc%I!zqVOI_g_heYB2FclHV1PrD_Q-2 zOguD#s!Lc>JvDjX?QlI>L&T~txOeQ}8bHtI*mfbg(KxBYV}zop3qe2!y9_l_IH$Ln zL*@pCG4#?MGNR!4vm_?)_aXMKGA0p&#})nlyQ)8L)59C+jUyddlTw>Q!+4HUF3;^8 zbqr>NcZ{U{3BOQf#ZYwaX(rp0U>iL}N%Vfo!sN|7WHn(w#}eF=^`W==u9jq?K8*Y} z$GK2zVphV4LbGy$W`Q1=^Esq#fPFISv73t(pio*U`dr8 z??rZ#F>UZd9xzbyUIvZ6`6Gfh0W6c*;#`ym5_fZf^zx}~vF#l9d$Qc7D#w;G?!VC- zDOo;gH!y|%?u@6F_FB9GRI9SzQ2`{^5Uv>en9Nb^PRdk)9w2HyBCbr>Q330#DpY8i zVsoRBicYiU*Y=1rV60Fk;6#m%8o7K9S=7lX~Yvw_xF+ zB5#|)u^+P=^I#1Xyd2)6dl4X}!<#`g2sZzDdBPyXpKuz{2i#U_Xg2>QWrZ%?o)a|& zU^2i>5tWiGZO#qSq*f3(83?6Ic~il6F0-6!)edTYxvMTuqk59CJ9z+}xF#Aif!3VX z-G$e`V|?imLY-zPAOwY}9lx0nh0nS#=Xy+S>hK@#AM2}0(y@$M%Hy&4(}%@GOnJq} z(0A*~9Xs`nF!&emaoxkHrZVEZaI>*>C^4W6yX+OjQ;tL{bGp*7|DVbD**(uc)6e=3 zxCKxIM-?CKz6U>@Fx9^7>EmT zQ8Y1Fv<2&75t!}!t<461iIO(;fV5rrRGiuBPhXFa@(0xdilW3f=^?Kv#5#=>OKv;I+&k&(nI8*_!8 z4{b5oE-;9^o)FtG6w?~e3_ADc*iiSjF>JQ=ae`4`9kRO-hBqftzuhA?WT5lSg?Zhs zAS3s!r3@}WtV3an<^=&f zq~^^p6W&jp8_R#chVKs88qA;!1pU7!mC_c94cpHxZv(+I#0X@M#v-XrlqT`GRjZL; zt2EXDns)@~V@mxJ1zGsj@>5KFMLB|$iMZ8b;m?qN)tbn^Clxl@sZ0rXn+Qtf`I&yK ziLxKysuU_&x26$d81hCOcaV0)U2f&Vb(JsjLNnEUdGur0^YX3k6ve3Gx%%H(8Pw5v zKQa2NVc8Ric0(WwPTuhAt7#l$B*asr)m-6Br*+XicXZD%gi~YM?r~Zgr|ANVbJ@3$ zFTPobi4b72my9%WLwA^uUu$*YlXy$n*MVR>qjR&L~0)20MvAMQiA!S+j;SCv5SAt~j&%<*QuIZH7+_G}ON)7+LeL!4 z6d(avR|q}jw_rCe$z{s&=vdDqlt$VRvC{1^^pi7w2x6&BcVXpbNl7C6snH?DO%#$a zB}z{h+gr^Y&D$xcvH-D46IlL6z&p495)oatFW4CX!$^%sS!4bt7Ax4cZq?Q>Dl3EIf;~_y|^b@1-rVy-UJio1^|7 z88tTW%s3ONBI(&Y%O<{KD>g9f{v!W}Xa!K(7L#GXN5r0~{@k?hq+bW|wZn(uLp%Yn ztnuR5_S1&imbDaW+mE1wFyWaF-Y@=6NOwdK=3V1Yz}3C$hnpCZ-uy-*s7}8E8chq6 z?=-D}Rcsw1eU-tJ1^4L|QCeUb$gPhInOU?{cXP5S!>2%!$f-^DT){Dz$&;?<%gu#4 z89-+$gKb2IiW@q9cHY#GHU#6;W3&EAH!Uvq9AaUeF(MKA6wH2IQs9wJ25mT7$z{qK z33v)sVa4#R?`K9*z{xd(!|`=|fdjjjVb_BtshitSZn!vR>}I9CY;Svg>un1jw)Ep2 zMTf&6tAI>nEwb7lDd|xuLkTj9jJ-$`LPHgTQ*%zkv_D!F+QrhjuL}x@_B?CbCI_$2 zsy5y<`na9>mDxWa=9|h3@H@H4H66fKXl)|I^9LA$>``na7zDapTzvQ}}UphDo2ZzAAj9Tb$^o1H6K2$(J0e*Dv9 zY|HV@q`hR=5#0TdT!vEBp<%&~Bsy)W{SpJ3nM+?v?Lo(H|3C_m`H9g}_nNQlMzx@oJ zos9>Kp7M#ibq{XM_*xE9jGD3~gFMXgd-+OpsOG_1hE{<8(lcjF|Hp4pFDGGJKYKQ64ZI>Cz18TyjfR z%y&2@wsN*>nz(?9`lit1bz8(ip@+7J`z_4sTY@nj7>@rhp2KUl9=XRkZG#eDBrM{> zONIVzAh04?Cu6amLc3_}0_K|&vssd!pB5nK9H+=3P{rB190;8}*Nw@>c4ZAA45=hs zzzII(RFFtdP4$z^pciux1V>L5h-#qSDgSxRDFJ@1r|OeXGfQ?9EQQ3Z12}DRmfh58 zK%)v**SFs;O7ngeXvtHrWAGkoDj49w_Cp7fnS6vRZwZ%QOuX_k&kKHDd%gI=Z^MEE zjFAy zi)H*Wm%BZLMrFCc-a8fP^w?m2_jV92JkX0TGz7Km+YZXs=<`ffEKksYG?o6q%eAmC z<)bvZ!M0hXEFjDEb}8xIi~Sox#ICMsTn@zhWK3XYlIq>P@q0FHg z=eQbcs+)wSYIn`BAvZggJhxk4NUCmybg{xFQxz|~enYa+dQ;xk%oFY7umt-O76GYy z3CsNpg@#iIYP~lJ$hfDKO`Uw5`xZ?Pr`K~H6$%sC^67}QOMGEv`&{nB<0^7vF6%}9 zBn*jJ-dzIDHkhaJsGM&$R(RNH$~lwefYb9Y+lF`J09du?HDa2T){c6l@w2sF{=*oSr`C*c zG#kVTSxRD3qB+c@OVqO29TRs})#|#fgm@lzH4!{8HQ9ZBQ|Gz^(;6P_BBGBb$?-_J z!diPzy*l7I4~cC$A{}1Lb8>5+fuJAa(2S?&zXYn~Sh>PV5q?qQ?fbmOB4XZHdmuy^ zke2nVEKkrc1W|y#DaT7fjh!i}LH;G(`gxgr8LSzq70kGIIe+{xPNs~+E0c|con5ehw5I6dUx%UjnGzG^wFzeK&&B$`^@@{5V=T=e z@hL)8fHNLxwfiu>Lko?%h6n9c<>~Sw_eu8$TtkFNnV8vOYF>mVKs;z_t;)Be9gx-) zbDP+II5QohsA+?T_3GEuPfo;Fh!zAiLUeU!k(l+e1gPrERAGTJf_EmEZdYipKvCmm zL7Cc`IH9w!fGN?3E*#ueuHP|k$sl`6b!p_S2*$D$)2EU$;v5INu|J>24gzz2*p;ZU!rL~T7b2LtCTs{ckf=J8m z-3w0r!ay!m(Tn;Zl2=^q3X1U`jF9;{C8EJbhAqWez9~%3Q;~{Q6i05ZfqdLcVOAt` zKyRxzYb*yyhm{m>5T*2l8Tzfmh#+fp!!>QL$*ppMa6qUBFLVzHG4_iEaW;3CKi_4( zTMCTMtUa)QVSM>$waZ9%Dm|NqF%kCB4CO(WehMuMOohnc**KNb-TkFOs(rw)*j1PB zWfVegee#i(Ke;;Ah7lcEw`>5##uSwoFLV#y_VlesbsYX=rjgffzL<|qT&C#{<`iFg zMSgvWEF`)SN=XS#bsYXe6g3oQ6sv%;k{LVW;kkl zzw5W|Twc*`tpo~4a%Onr08`4oQ%0!DT&pUf$yHkx(r^6zDjf(=oN3H8dl2u+(Zb~ z<6&wUu<9hV`7koQ#{@eXkMgJu=!4WD-6%8dh?$76*Yk|XF2KAH#M!<5(?AcRHt|w` z2|h2i{ti<0-j%@(w3;f|8c~NKjMOFc&h>Un*AH&!)BagcuV!cLoz~5j>it~LA8U#L zf#|EEe0;VCP6$W@+hcL`-3IX9_fkOb8~DB*6#xUOGMe=^bi^ZMU9#YurAn%ikt%$+ zL|W%7(?vK0L-X+z0R9kCn*e-I(DhXc6!oO6k)xYKEuzg=>0 zykzS^pm%q7uw;lSSHU^jmhtqF$pxIe*T1Fs` zN)Ob2XwI384en9(dmH9W|8JH#NIatu=xeB-+|B#sA%Nr~03R1l0BXRabGq7;fv%GJ z-a)c%ymE=XSRzy|Oy6@-0m+P}wdV{^=+qd@L`aPl|FA9yeG6|c&&PGIKDTr$03R39 zp(m3kA<9-Yi{`yrYBb_4P8o$SQ<6J_m;zF`ae0HZ-Hz6B+Hc^mC2|rD<{SLg)eetL z^NNCX;T*YyMPPp@|GQsFr2A8Z@rsU7H|w_mc(-TB3`|w9zDm;wP*n7 zA;1VryxgbBA>Rrr8^I*xZz7M zEwUSLJzmlFuQ*^DH>iGesSxmi7%~&1F?OW*7<@ZNCapm8gZ=_DBH|l((NbK&c zQi>A&3MoAV0JCT}s|m<_Z2bYHT%j6q)e!2lD6}uy@Q|}VFXB@FDN+DdL3$O?l!dHg z0PtuymA209z09Byu~4hvt~0f?rM+m8B2tVL<{H9Kz9@!Hbajr>p+qvsZ=yf6)^kDDPtNx{^d zl*UAn%Vo-WD|E>jB9U5h-NVYI#cY>&S&3@!*J?Js7dQ}@t~2i^!N+gnv9LikdN>F} zbMYurnXk`)(a1O0M^evMF6`RT#LeFWzEde0+zTsp23 z^R8Cr4_m|3r3KX6C3A+nw-1Ybmy21Hfo5SPE1TP`a~B#WDvkYMLz(l7INO#i!{0!k zrs8s5x{Oh_3~bWb^-!CNLy(U&J7vgYzD&ww-DSj;%f73laoCOfztvTf zp_vzayL7H5tJsy%|7q8R7he$i1A9G)|=+x9UFI$ON`R14xFr8|(TP%Xyn7KN*7# z?COgK>bb;_8Rp<;D)@0vjXsw@pF0`DOEfex7qChy?q3X@Jn@ys>1m+nf!T5d=-Vi* zLC{55EP~-pAa$PWP~(U+&K{ADY+jx5LZ@XpaSHCfH5c||gd|PLHx3tGZDD7uK->!8 zP!u~Y58R!`U(bW$gSfj@`Lv;2F8@^Abnsd~BTc#*SREGNA?AwnL;C<1o^LAL=*m89 z3f3_J4?5oH_=eg{WNl?#nhj#*DWO3adLjC?Bp?eio5LuNbJ*Np%t7{!@-Gw@jhUGl z04ltJAS!~FUqgH}%|H(OJ%ly91Yh$mZ|;Zvm>XqK*2e196vij=faU)4XywH-T~H66 zV10Bwu9`yRv9xCIVobVxeF<1jUHASeNiroxQpr?F2u0@1WGGECKPAbSC?%u}6_P~e z5*d<^dB{+P%*jlqgd$3&OyRfBzSsU=U(fe^|8rfh-tK3$_S$RRYwdmZ+50>@`@gx_ z_{>}_`&Gt&iXZHWPh|Y<)5*R3Xs1S#OS%r;(E7uOCJmeHpF8W^)>em%bQf;3j1BO( zKg?76_|`=KS55NHx4sycxhgB7&*q4uy{{Qf*m?T%{MpVsS{nY#v2Ntjyy0}+;@CO{ z`u6)D*BaD*%XOQgt=8^!dpD`PU-qF_A52?zxLk2ArQh0DHteT^+3bkY;d=h>dyY>J zlaA<@T)d+5*0cNePCZf;x>8`9hIRM9f9jlFE_MC)G5PS}d0kGgJF?hkY|dw`loefL z7CU`wnlsAfSiQcQ>)tu^xUOZgxY#>q>f^C5n@@g?LQec|txRVQ7a zKE-@ut^MmuN*bMC6xF)r+4BCorp<1okvcgkD$zHlpUZ29$u{Z>q7&ytwP8)1@_r|CDMvej9COvhUok*6N}8!*gbxOzJadk#&d9hrc%{ zd7W`C=jMQyS5_T42%j<2v6n`=OO2W&)p+DRH(Jl3}YIdfv zwoc1{%~QG=Y3^*`QGZkZ!AEwfCQD3bs@bK*zmUQgWn5m-#xZwZo!&==*nNDG(&13G zea)PPjX8B~)uU_4ce=dXK2R-B>!9wHoimOuzuodz=!4?9rc*mDo$hOz_;k@L^JbPI zMekY-x?MCkrv1^W8^8P4Jdy8rrRkp37~|%TJAYjr(B@dgIwSvCO?09(yMzp@`tS4p z-8VuuuY6IIdwS5qz$bNIw$^geT<=lUEHY$!cn^ESCviEmcl36dl3O#sYu@fZ{Vi?! z4xV{wa37tAnd`gl*=%~f*TkaX$6iQr3(q&S9o_rr W?|$Cab@}4L9IvlC7inG| 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%0D3^|H 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