From 3bc376da335487991872599562f9afd2bb4e7ef3 Mon Sep 17 00:00:00 2001 From: NADAL Jean-Baptiste Date: Sat, 27 Feb 2016 00:07:26 +0100 Subject: [PATCH] Import civetweb ans jsoncpp --- 3P/civetweb/.gitattributes | 22 + 3P/civetweb/.gitignore | 239 + 3P/civetweb/.travis.yml | 5 + 3P/civetweb/CMakeLists.txt | 450 + 3P/civetweb/CREDITS.md | 106 + 3P/civetweb/LICENSE.md | 210 + 3P/civetweb/Makefile | 310 + 3P/civetweb/Makefile.deprecated | 208 + 3P/civetweb/Makefile.osx | 39 + 3P/civetweb/Qt/CivetWeb.pro | 22 + 3P/civetweb/Qt/Qt/CivetWeb.pro | 22 + 3P/civetweb/README.md | 128 + 3P/civetweb/RELEASE_NOTES.md | 255 + 3P/civetweb/VS2012/VS2012/buildRelease.pl | 71 + 3P/civetweb/VS2012/VS2012/civetweb.sln | 171 + .../VS2012/civetweb_lua/civetweb_lua.vcxproj | 243 + .../civetweb_lua/civetweb_lua.vcxproj.filters | 69 + .../VS2012/civetweb_yassl/civetweb_yassl.sln | 36 + .../civetweb_yassl/civetweb_yassl.vcxproj | 170 + .../civetweb_yassl.vcxproj.filters | 40 + .../yassl_lib/yassl_lib.vcxproj | 185 + .../yassl_lib/yassl_lib.vcxproj.filters | 124 + .../VS2012/duktape_lib/duktape_lib.vcxproj | 155 + .../duktape_lib/duktape_lib.vcxproj.filters | 30 + .../VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj | 161 + .../ex_embed_cpp/ex_embed_cpp.vcxproj.filters | 36 + .../ex_embedded_c/ex_embedded_c.vcxproj | 159 + .../ex_embedded_c.vcxproj.filters | 30 + .../VS2012/ex_websocket/ex_websocket.vcxproj | 160 + .../ex_websocket/ex_websocket.vcxproj.filters | 36 + .../ex_websocket_client.vcxproj | 158 + .../ex_websocket_client.vcxproj.filters | 30 + .../VS2012/VS2012/lua_lib/lua_lib.vcxproj | 190 + .../VS2012/lua_lib/lua_lib.vcxproj.filters | 135 + .../VS2012/VS2012/unit_test/unit_test.vcxproj | 101 + .../unit_test/unit_test.vcxproj.filters | 60 + .../VS2012/VS2012/upload/upload.vcxproj | 159 + .../VS2012/upload/upload.vcxproj.filters | 30 + 3P/civetweb/VS2012/buildRelease.pl | 71 + 3P/civetweb/VS2012/civetweb.sln | 171 + .../VS2012/civetweb_lua/civetweb_lua.vcxproj | 243 + .../civetweb_lua/civetweb_lua.vcxproj.filters | 69 + .../VS2012/civetweb_yassl/civetweb_yassl.sln | 36 + .../civetweb_yassl/civetweb_yassl.vcxproj | 170 + .../civetweb_yassl.vcxproj.filters | 40 + .../yassl_lib/yassl_lib.vcxproj | 185 + .../yassl_lib/yassl_lib.vcxproj.filters | 124 + .../VS2012/duktape_lib/duktape_lib.vcxproj | 155 + .../duktape_lib/duktape_lib.vcxproj.filters | 30 + .../VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj | 161 + .../ex_embed_cpp/ex_embed_cpp.vcxproj.filters | 36 + .../ex_embedded_c/ex_embedded_c.vcxproj | 159 + .../ex_embedded_c.vcxproj.filters | 30 + .../VS2012/ex_websocket/ex_websocket.vcxproj | 160 + .../ex_websocket/ex_websocket.vcxproj.filters | 36 + .../ex_websocket_client.vcxproj | 158 + .../ex_websocket_client.vcxproj.filters | 30 + 3P/civetweb/VS2012/lua_lib/lua_lib.vcxproj | 190 + .../VS2012/lua_lib/lua_lib.vcxproj.filters | 135 + .../VS2012/unit_test/unit_test.vcxproj | 101 + .../unit_test/unit_test.vcxproj.filters | 60 + 3P/civetweb/VS2012/upload/upload.vcxproj | 159 + .../VS2012/upload/upload.vcxproj.filters | 30 + 3P/civetweb/appveyor.yml | 191 + 3P/civetweb/build | 138 + 3P/civetweb/build.cmd | 866 + 3P/civetweb/builders/cmake/CMakeLists.txt | 33 + 3P/civetweb/ci/test/01_basic/basic_spec.lua | 35 + .../01_basic_test_dir/git_keep_empty_dir | 0 .../test/01_basic/docroot/01_basic_test_file | 0 3P/civetweb/ci/test/README.md | 34 + 3P/civetweb/ci/test/civet.lua | 42 + 3P/civetweb/ci/travis/install_rocks.sh | 14 + 3P/civetweb/ci/travis/lua_env.sh | 5 + 3P/civetweb/ci/travis/platform.sh | 15 + 3P/civetweb/ci/travis/run_ci_tests.sh | 7 + 3P/civetweb/ci/travis/setup_lua.sh | 61 + 3P/civetweb/cmake/AddCCompilerFlag.cmake | 38 + 3P/civetweb/cmake/AddCXXCompilerFlag.cmake | 38 + .../cmake/DetermineTargetArchitecture.cmake | 47 + 3P/civetweb/cmake/FindLibDl.cmake | 46 + 3P/civetweb/cmake/FindLibM.cmake | 46 + 3P/civetweb/cmake/FindLibRt.cmake | 46 + 3P/civetweb/cmake/FindWinSock.cmake | 102 + 3P/civetweb/cmake/check/patch.cmake | 12 + 3P/civetweb/contrib/buildroot/Config.in | 26 + 3P/civetweb/contrib/buildroot/civetweb.mk | 55 + .../distribution/arch/PKGBUILD.git.example | 42 + .../distribution/arch/civetweb.service | 9 + 3P/civetweb/docs/Building.md | 176 + 3P/civetweb/docs/Embedding.md | 168 + 3P/civetweb/docs/Installing.md | 36 + 3P/civetweb/docs/OpenSSL.md | 132 + 3P/civetweb/docs/UserManual.md | 575 + 3P/civetweb/docs/yaSSL.md | 86 + 3P/civetweb/examples/chat/Makefile | 40 + 3P/civetweb/examples/chat/chat.c | 403 + 3P/civetweb/examples/docroot/favicon.ico | Bin 0 -> 1406 bytes 3P/civetweb/examples/docroot/index.html | 73 + 3P/civetweb/examples/docroot/jquery.js | 154 + 3P/civetweb/examples/docroot/login.html | 43 + 3P/civetweb/examples/docroot/logo.png | Bin 0 -> 1601 bytes 3P/civetweb/examples/docroot/main.js | 107 + 3P/civetweb/examples/docroot/prime_numbers.lp | 46 + 3P/civetweb/examples/docroot/style.css | 154 + 3P/civetweb/examples/embedded_c/Makefile | 36 + 3P/civetweb/examples/embedded_c/embedded_c.c | 462 + 3P/civetweb/examples/embedded_cpp/Makefile | 36 + .../examples/embedded_cpp/embedded_cpp.cpp | 290 + 3P/civetweb/examples/hello/Makefile | 36 + 3P/civetweb/examples/hello/hello.c | 53 + 3P/civetweb/examples/lua/lua_dll.c | 21 + 3P/civetweb/examples/post/Makefile | 36 + 3P/civetweb/examples/post/post.c | 58 + 3P/civetweb/examples/upload/Makefile | 36 + 3P/civetweb/examples/upload/upload.c | 104 + 3P/civetweb/examples/websocket/Makefile | 36 + .../examples/websocket/WebSockCallbacks.c | 225 + .../examples/websocket/WebSockCallbacks.h | 44 + 3P/civetweb/examples/websocket/websock.htm | 55 + 3P/civetweb/examples/websocket/websocket.c | 65 + .../examples/websocket_client/Makefile | 37 + .../examples/websocket_client/ssl/server.crt | 13 + .../examples/websocket_client/ssl/server.csr | 11 + .../examples/websocket_client/ssl/server.key | 15 + .../websocket_client/ssl/server.key.orig | 18 + .../examples/websocket_client/ssl/server.pem | 28 + .../websocket_client/websocket_client.c | 416 + 3P/civetweb/examples/ws_server/Makefile | 36 + .../examples/ws_server/docroot/index.html | 316 + 3P/civetweb/examples/ws_server/ws_server.c | 271 + 3P/civetweb/format.bat | 28 + 3P/civetweb/include/CivetServer.h | 498 + 3P/civetweb/include/civetweb.h | 812 + 3P/civetweb/mingw.cmd | 884 + 3P/civetweb/resources/Info.plist | 21 + 3P/civetweb/resources/Makefile.in-duktape | 60 + 3P/civetweb/resources/Makefile.in-lua | 148 + 3P/civetweb/resources/Makefile.in-os | 22 + 3P/civetweb/resources/cert/client.crt | 14 + 3P/civetweb/resources/cert/client.csr | 11 + 3P/civetweb/resources/cert/client.key | 15 + 3P/civetweb/resources/cert/client.key.orig | 18 + 3P/civetweb/resources/cert/client.pem | 29 + 3P/civetweb/resources/cert/make_certs | 31 + 3P/civetweb/resources/cert/server.crt | 14 + 3P/civetweb/resources/cert/server.csr | 11 + 3P/civetweb/resources/cert/server.key | 15 + 3P/civetweb/resources/cert/server.key.orig | 18 + 3P/civetweb/resources/cert/server.pem | 29 + 3P/civetweb/resources/civetweb.conf | 32 + 3P/civetweb/resources/civetweb.icns | Bin 0 -> 13635 bytes 3P/civetweb/resources/civetweb.psd | Bin 0 -> 9365069 bytes 3P/civetweb/resources/civetweb_16x16.png | Bin 0 -> 1691 bytes 3P/civetweb/resources/civetweb_16x16@2.png | Bin 0 -> 1624 bytes 3P/civetweb/resources/civetweb_22x22.png | Bin 0 -> 1857 bytes 3P/civetweb/resources/civetweb_22x22@2.png | Bin 0 -> 2728 bytes 3P/civetweb/resources/civetweb_32x32.png | Bin 0 -> 2193 bytes 3P/civetweb/resources/civetweb_32x32@2.png | Bin 0 -> 3923 bytes 3P/civetweb/resources/civetweb_64x64.png | Bin 0 -> 3923 bytes 3P/civetweb/resources/civetweb_64x64@2.png | Bin 0 -> 10178 bytes 3P/civetweb/resources/cleanup.lua | 92 + 3P/civetweb/resources/coverity_check.sh | 30 + 3P/civetweb/resources/itworks.html | 23 + 3P/civetweb/resources/jni/Android.mk | 6 + 3P/civetweb/resources/lua-logo.jpg | Bin 0 -> 2799 bytes 3P/civetweb/resources/luafilesystem-logo.jpg | Bin 0 -> 8209 bytes 3P/civetweb/resources/luasqlite-logo.jpg | Bin 0 -> 6534 bytes 3P/civetweb/resources/luaxml-logo.jpg | Bin 0 -> 6741 bytes 3P/civetweb/resources/res.rc | 1 + 3P/civetweb/resources/sqlite3-logo.jpg | Bin 0 -> 1673 bytes 3P/civetweb/resources/ssl_cert.pem | 50 + 3P/civetweb/resources/systray.ico | Bin 0 -> 15086 bytes 3P/civetweb/src/CMakeLists.txt | 291 + 3P/civetweb/src/CivetServer.cpp | 507 + 3P/civetweb/src/civetweb.c | 12064 ++ 3P/civetweb/src/civetweb_private_lua.h | 10 + 3P/civetweb/src/main.c | 2539 + 3P/civetweb/src/md5.inl | 468 + 3P/civetweb/src/mod_duktape.inl | 250 + 3P/civetweb/src/mod_lua.inl | 1708 + 3P/civetweb/src/third_party/LuaXML.lua | 116 + 3P/civetweb/src/third_party/LuaXML_lib.c | 476 + 3P/civetweb/src/third_party/civetweb_lua.h | 73 + .../src/third_party/duktape-1.3.0/AUTHORS.rst | 67 + .../src/third_party/duktape-1.3.0/LICENSE.txt | 25 + .../duktape-1.3.0/Makefile.cmdline | 30 + .../duktape-1.3.0/Makefile.codepage | 4 + .../third_party/duktape-1.3.0/Makefile.coffee | 4 + .../duktape-1.3.0/Makefile.dukdebug | 23 + .../third_party/duktape-1.3.0/Makefile.eval | 7 + .../duktape-1.3.0/Makefile.eventloop | 22 + .../third_party/duktape-1.3.0/Makefile.hello | 35 + .../duktape-1.3.0/Makefile.jxpretty | 8 + .../duktape-1.3.0/Makefile.sandbox | 7 + .../src/third_party/duktape-1.3.0/README.rst | 103 + .../duktape-1.3.0/config/README.rst | 39 + .../duktape-1.3.0/config/genconfig.py | 1872 + .../config/genconfig_metadata.tar.gz | Bin 0 -> 87189 bytes .../duktape-1.3.0/debugger/Makefile | 80 + .../duktape-1.3.0/debugger/README.rst | 268 + .../debugger/duk_classnames.yaml | 31 + .../duktape-1.3.0/debugger/duk_debug.js | 2448 + .../debugger/duk_debugcommands.yaml | 36 + .../duktape-1.3.0/debugger/duk_opcodes.yaml | 660 + .../duktape-1.3.0/debugger/package.json | 27 + .../duktape-1.3.0/debugger/static/index.html | 96 + .../duktape-1.3.0/debugger/static/style.css | 512 + .../duktape-1.3.0/debugger/static/webui.js | 745 + .../duktape-1.3.0/duk_build_meta.json | 838 + .../duktape-1.3.0/examples/README.rst | 10 + .../examples/alloc-hybrid/README.rst | 10 + .../examples/alloc-hybrid/duk_alloc_hybrid.c | 293 + .../examples/alloc-hybrid/duk_alloc_hybrid.h | 11 + .../examples/alloc-logging/README.rst | 7 + .../alloc-logging/duk_alloc_logging.c | 138 + .../alloc-logging/duk_alloc_logging.h | 10 + .../examples/alloc-logging/log2gnuplot.py | 41 + .../examples/alloc-torture/README.rst | 10 + .../alloc-torture/duk_alloc_torture.c | 182 + .../alloc-torture/duk_alloc_torture.h | 10 + .../duktape-1.3.0/examples/cmdline/README.rst | 6 + .../examples/cmdline/duk_cmdline.c | 873 + .../examples/cmdline/duk_cmdline_ajduk.c | 892 + .../examples/codepage-conv/README.rst | 8 + .../codepage-conv/duk_codepage_conv.c | 54 + .../codepage-conv/duk_codepage_conv.h | 8 + .../examples/codepage-conv/test.c | 286 + .../duktape-1.3.0/examples/coffee/README.rst | 10 + .../examples/coffee/globals.coffee | 7 + .../examples/coffee/hello.coffee | 2 + .../examples/coffee/mandel.coffee | 28 + .../examples/debug-trans-dvalue/Makefile | 17 + .../examples/debug-trans-dvalue/README.rst | 8 + .../debug-trans-dvalue/duk_trans_dvalue.c | 1239 + .../debug-trans-dvalue/duk_trans_dvalue.h | 113 + .../examples/debug-trans-dvalue/test.c | 236 + .../examples/debug-trans-socket/README.rst | 6 + .../debug-trans-socket/duk_trans_socket.c | 313 + .../debug-trans-socket/duk_trans_socket.h | 14 + .../examples/dummy-date-provider/README.rst | 5 + .../dummy-date-provider/dummy_date_provider.c | 27 + .../duktape-1.3.0/examples/eval/README.rst | 5 + .../duktape-1.3.0/examples/eval/eval.c | 48 + .../examples/eventloop/README.rst | 76 + .../examples/eventloop/basic-test.js | 17 + .../examples/eventloop/c_eventloop.c | 618 + .../examples/eventloop/c_eventloop.js | 179 + .../examples/eventloop/client-socket-test.js | 24 + .../examples/eventloop/curses-timers.js | 79 + .../examples/eventloop/ecma_eventloop.js | 466 + .../duktape-1.3.0/examples/eventloop/fileio.c | 69 + .../duktape-1.3.0/examples/eventloop/main.c | 256 + .../examples/eventloop/ncurses.c | 105 + .../duktape-1.3.0/examples/eventloop/poll.c | 111 + .../examples/eventloop/server-socket-test.js | 34 + .../duktape-1.3.0/examples/eventloop/socket.c | 286 + .../duktape-1.3.0/examples/guide/README.rst | 5 + .../duktape-1.3.0/examples/guide/fib.js | 16 + .../duktape-1.3.0/examples/guide/prime.js | 32 + .../duktape-1.3.0/examples/guide/primecheck.c | 52 + .../duktape-1.3.0/examples/guide/process.js | 12 + .../examples/guide/processlines.c | 59 + .../duktape-1.3.0/examples/guide/uppercase.c | 42 + .../duktape-1.3.0/examples/hello/README.rst | 5 + .../duktape-1.3.0/examples/hello/hello.c | 38 + .../examples/jxpretty/README.rst | 5 + .../examples/jxpretty/jxpretty.c | 63 + .../duktape-1.3.0/examples/sandbox/README.rst | 5 + .../duktape-1.3.0/examples/sandbox/sandbox.c | 252 + .../duktape-1.3.0/extras/README.rst | 13 + .../third_party/duktape-1.3.0/license.spdx | 3629 + .../duktape-1.3.0/licenses/commonjs.txt | 2 + .../duktape-1.3.0/licenses/murmurhash2.txt | 21 + .../src/third_party/duktape-1.3.0/mandel.js | 53 + .../polyfills/console-minimal.js | 20 + .../polyfills/duktape-isfastint.js | 38 + .../duktape-1.3.0/polyfills/object-assign.js | 45 + .../object-prototype-definegetter.js | 11 + .../object-prototype-definesetter.js | 11 + .../polyfills/performance-now.js | 25 + .../src-separate/duk_alloc_default.c | 32 + .../src-separate/duk_api_buffer.c | 73 + .../src-separate/duk_api_bytecode.c | 727 + .../duktape-1.3.0/src-separate/duk_api_call.c | 542 + .../src-separate/duk_api_codec.c | 389 + .../src-separate/duk_api_compile.c | 180 + .../src-separate/duk_api_debug.c | 168 + .../duktape-1.3.0/src-separate/duk_api_heap.c | 128 + .../src-separate/duk_api_internal.h | 175 + .../src-separate/duk_api_logging.c | 52 + .../src-separate/duk_api_memory.c | 103 + .../src-separate/duk_api_object.c | 590 + .../src-separate/duk_api_stack.c | 4459 + .../src-separate/duk_api_string.c | 330 + .../duktape-1.3.0/src-separate/duk_api_var.c | 86 + .../duktape-1.3.0/src-separate/duk_bi_array.c | 1450 + .../src-separate/duk_bi_boolean.c | 68 + .../src-separate/duk_bi_buffer.c | 2842 + .../duktape-1.3.0/src-separate/duk_bi_date.c | 1730 + .../src-separate/duk_bi_date_unix.c | 306 + .../src-separate/duk_bi_date_windows.c | 98 + .../src-separate/duk_bi_duktape.c | 313 + .../duktape-1.3.0/src-separate/duk_bi_error.c | 340 + .../src-separate/duk_bi_function.c | 344 + .../src-separate/duk_bi_global.c | 1207 + .../duktape-1.3.0/src-separate/duk_bi_json.c | 2896 + .../src-separate/duk_bi_logger.c | 300 + .../duktape-1.3.0/src-separate/duk_bi_math.c | 348 + .../src-separate/duk_bi_number.c | 240 + .../src-separate/duk_bi_object.c | 594 + .../src-separate/duk_bi_pointer.c | 74 + .../src-separate/duk_bi_protos.h | 216 + .../duktape-1.3.0/src-separate/duk_bi_proxy.c | 66 + .../src-separate/duk_bi_regexp.c | 209 + .../src-separate/duk_bi_string.c | 1314 + .../src-separate/duk_bi_thread.c | 314 + .../src-separate/duk_bi_thrower.c | 10 + .../duktape-1.3.0/src-separate/duk_builtins.c | 1166 + .../duktape-1.3.0/src-separate/duk_builtins.h | 4046 + .../duktape-1.3.0/src-separate/duk_config.h | 3224 + .../duktape-1.3.0/src-separate/duk_debug.h | 185 + .../src-separate/duk_debug_fixedbuffer.c | 69 + .../src-separate/duk_debug_heap.c | 247 + .../src-separate/duk_debug_macros.c | 170 + .../src-separate/duk_debug_vsnprintf.c | 1041 + .../duktape-1.3.0/src-separate/duk_debugger.c | 1781 + .../duktape-1.3.0/src-separate/duk_debugger.h | 96 + .../duktape-1.3.0/src-separate/duk_error.h | 266 + .../src-separate/duk_error_augment.c | 466 + .../src-separate/duk_error_longjmp.c | 28 + .../src-separate/duk_error_macros.c | 130 + .../src-separate/duk_error_misc.c | 54 + .../src-separate/duk_error_throw.c | 181 + .../duktape-1.3.0/src-separate/duk_forwdecl.h | 114 + .../duktape-1.3.0/src-separate/duk_hbuffer.h | 325 + .../src-separate/duk_hbuffer_alloc.c | 132 + .../src-separate/duk_hbuffer_ops.c | 84 + .../src-separate/duk_hbufferobject.h | 133 + .../src-separate/duk_hbufferobject_misc.c | 20 + .../src-separate/duk_hcompiledfunction.h | 239 + .../duktape-1.3.0/src-separate/duk_heap.h | 573 + .../src-separate/duk_heap_alloc.c | 915 + .../src-separate/duk_heap_hashstring.c | 70 + .../src-separate/duk_heap_markandsweep.c | 1373 + .../src-separate/duk_heap_memory.c | 384 + .../src-separate/duk_heap_misc.c | 74 + .../src-separate/duk_heap_refcount.c | 575 + .../src-separate/duk_heap_stringcache.c | 294 + .../src-separate/duk_heap_stringtable.c | 1117 + .../duktape-1.3.0/src-separate/duk_heaphdr.h | 386 + .../src-separate/duk_hnativefunction.h | 32 + .../duktape-1.3.0/src-separate/duk_hobject.h | 919 + .../src-separate/duk_hobject_alloc.c | 191 + .../src-separate/duk_hobject_class.c | 132 + .../src-separate/duk_hobject_enum.c | 626 + .../src-separate/duk_hobject_finalizer.c | 91 + .../src-separate/duk_hobject_misc.c | 47 + .../src-separate/duk_hobject_pc2line.c | 250 + .../src-separate/duk_hobject_props.c | 5933 + .../duktape-1.3.0/src-separate/duk_hstring.h | 195 + .../src-separate/duk_hstring_misc.c | 33 + .../duktape-1.3.0/src-separate/duk_hthread.h | 350 + .../src-separate/duk_hthread_alloc.c | 92 + .../src-separate/duk_hthread_builtins.c | 676 + .../src-separate/duk_hthread_misc.c | 108 + .../src-separate/duk_hthread_stacks.c | 476 + .../src-separate/duk_initjs_min.js | 1 + .../duktape-1.3.0/src-separate/duk_internal.h | 78 + .../duktape-1.3.0/src-separate/duk_jmpbuf.h | 24 + .../duktape-1.3.0/src-separate/duk_js.h | 98 + .../src-separate/duk_js_bytecode.h | 206 + .../duktape-1.3.0/src-separate/duk_js_call.c | 2489 + .../src-separate/duk_js_compiler.c | 7690 + .../src-separate/duk_js_compiler.h | 227 + .../src-separate/duk_js_executor.c | 4481 + .../duktape-1.3.0/src-separate/duk_js_ops.c | 1362 + .../duktape-1.3.0/src-separate/duk_js_var.c | 1820 + .../duktape-1.3.0/src-separate/duk_json.h | 71 + .../duktape-1.3.0/src-separate/duk_lexer.c | 2065 + .../duktape-1.3.0/src-separate/duk_lexer.h | 432 + .../duktape-1.3.0/src-separate/duk_numconv.c | 2266 + .../duktape-1.3.0/src-separate/duk_numconv.h | 90 + .../duktape-1.3.0/src-separate/duk_regexp.h | 82 + .../src-separate/duk_regexp_compiler.c | 1079 + .../src-separate/duk_regexp_executor.c | 1003 + .../src-separate/duk_replacements.c | 82 + .../src-separate/duk_replacements.h | 24 + .../duktape-1.3.0/src-separate/duk_selftest.c | 372 + .../duktape-1.3.0/src-separate/duk_selftest.h | 12 + .../duktape-1.3.0/src-separate/duk_strings.c | 137 + .../duktape-1.3.0/src-separate/duk_strings.h | 282 + .../duktape-1.3.0/src-separate/duk_tval.c | 138 + .../duktape-1.3.0/src-separate/duk_tval.h | 508 + .../duktape-1.3.0/src-separate/duk_unicode.h | 258 + .../src-separate/duk_unicode_support.c | 1041 + .../src-separate/duk_unicode_tables.c | 282 + .../duktape-1.3.0/src-separate/duk_util.h | 520 + .../src-separate/duk_util_bitdecoder.c | 70 + .../src-separate/duk_util_bitencoder.c | 43 + .../src-separate/duk_util_bufwriter.c | 360 + .../src-separate/duk_util_hashbytes.c | 55 + .../src-separate/duk_util_hashprime.c | 77 + .../src-separate/duk_util_misc.c | 67 + .../src-separate/duk_util_tinyrandom.c | 63 + .../duktape-1.3.0/src-separate/duktape.h | 1524 + .../duktape-1.3.0/src/duk_config.h | 3224 + .../third_party/duktape-1.3.0/src/duktape.c | 80352 ++++++++ .../third_party/duktape-1.3.0/src/duktape.h | 1524 + 3P/civetweb/src/third_party/lfs.c | 900 + 3P/civetweb/src/third_party/lfs.h | 32 + 3P/civetweb/src/third_party/lsqlite3.c | 2214 + .../src/third_party/lua-5.1.5/COPYRIGHT | 34 + 3P/civetweb/src/third_party/lua-5.1.5/HISTORY | 183 + 3P/civetweb/src/third_party/lua-5.1.5/INSTALL | 99 + .../src/third_party/lua-5.1.5/Makefile | 128 + 3P/civetweb/src/third_party/lua-5.1.5/README | 37 + .../third_party/lua-5.1.5/doc/contents.html | 497 + .../src/third_party/lua-5.1.5/doc/cover.png | Bin 0 -> 3305 bytes .../src/third_party/lua-5.1.5/doc/logo.gif | Bin 0 -> 4232 bytes .../src/third_party/lua-5.1.5/doc/lua.1 | 163 + .../src/third_party/lua-5.1.5/doc/lua.css | 83 + .../src/third_party/lua-5.1.5/doc/lua.html | 172 + .../src/third_party/lua-5.1.5/doc/luac.1 | 136 + .../src/third_party/lua-5.1.5/doc/luac.html | 145 + .../src/third_party/lua-5.1.5/doc/manual.css | 24 + .../src/third_party/lua-5.1.5/doc/manual.html | 8804 + .../src/third_party/lua-5.1.5/doc/readme.html | 40 + .../src/third_party/lua-5.1.5/etc/Makefile | 44 + .../src/third_party/lua-5.1.5/etc/README | 37 + .../src/third_party/lua-5.1.5/etc/all.c | 38 + .../src/third_party/lua-5.1.5/etc/lua.hpp | 9 + .../src/third_party/lua-5.1.5/etc/lua.ico | Bin 0 -> 1078 bytes .../src/third_party/lua-5.1.5/etc/lua.pc | 31 + .../src/third_party/lua-5.1.5/etc/luavs.bat | 28 + .../src/third_party/lua-5.1.5/etc/min.c | 39 + .../src/third_party/lua-5.1.5/etc/noparser.c | 50 + .../src/third_party/lua-5.1.5/etc/strict.lua | 41 + .../src/third_party/lua-5.1.5/src/Makefile | 182 + .../src/third_party/lua-5.1.5/src/lapi.c | 1087 + .../src/third_party/lua-5.1.5/src/lapi.h | 16 + .../src/third_party/lua-5.1.5/src/lauxlib.c | 652 + .../src/third_party/lua-5.1.5/src/lauxlib.h | 174 + .../src/third_party/lua-5.1.5/src/lbaselib.c | 653 + .../src/third_party/lua-5.1.5/src/lcode.c | 831 + .../src/third_party/lua-5.1.5/src/lcode.h | 76 + .../src/third_party/lua-5.1.5/src/ldblib.c | 398 + .../src/third_party/lua-5.1.5/src/ldebug.c | 638 + .../src/third_party/lua-5.1.5/src/ldebug.h | 33 + .../src/third_party/lua-5.1.5/src/ldo.c | 519 + .../src/third_party/lua-5.1.5/src/ldo.h | 57 + .../src/third_party/lua-5.1.5/src/ldump.c | 164 + .../src/third_party/lua-5.1.5/src/lfunc.c | 174 + .../src/third_party/lua-5.1.5/src/lfunc.h | 34 + .../src/third_party/lua-5.1.5/src/lgc.c | 710 + .../src/third_party/lua-5.1.5/src/lgc.h | 110 + .../src/third_party/lua-5.1.5/src/linit.c | 38 + .../src/third_party/lua-5.1.5/src/liolib.c | 556 + .../src/third_party/lua-5.1.5/src/llex.c | 463 + .../src/third_party/lua-5.1.5/src/llex.h | 81 + .../src/third_party/lua-5.1.5/src/llimits.h | 128 + .../src/third_party/lua-5.1.5/src/lmathlib.c | 263 + .../src/third_party/lua-5.1.5/src/lmem.c | 86 + .../src/third_party/lua-5.1.5/src/lmem.h | 49 + .../src/third_party/lua-5.1.5/src/loadlib.c | 666 + .../src/third_party/lua-5.1.5/src/lobject.c | 214 + .../src/third_party/lua-5.1.5/src/lobject.h | 381 + .../src/third_party/lua-5.1.5/src/lopcodes.c | 102 + .../src/third_party/lua-5.1.5/src/lopcodes.h | 268 + .../src/third_party/lua-5.1.5/src/loslib.c | 243 + .../src/third_party/lua-5.1.5/src/lparser.c | 1339 + .../src/third_party/lua-5.1.5/src/lparser.h | 82 + .../src/third_party/lua-5.1.5/src/lstate.c | 214 + .../src/third_party/lua-5.1.5/src/lstate.h | 169 + .../src/third_party/lua-5.1.5/src/lstring.c | 111 + .../src/third_party/lua-5.1.5/src/lstring.h | 31 + .../src/third_party/lua-5.1.5/src/lstrlib.c | 871 + .../src/third_party/lua-5.1.5/src/ltable.c | 588 + .../src/third_party/lua-5.1.5/src/ltable.h | 40 + .../src/third_party/lua-5.1.5/src/ltablib.c | 287 + .../src/third_party/lua-5.1.5/src/ltm.c | 75 + .../src/third_party/lua-5.1.5/src/ltm.h | 54 + .../src/third_party/lua-5.1.5/src/lua.c | 392 + .../src/third_party/lua-5.1.5/src/lua.h | 388 + .../src/third_party/lua-5.1.5/src/luac.c | 200 + .../src/third_party/lua-5.1.5/src/luaconf.h | 763 + .../src/third_party/lua-5.1.5/src/lualib.h | 53 + .../src/third_party/lua-5.1.5/src/lundump.c | 227 + .../src/third_party/lua-5.1.5/src/lundump.h | 36 + .../src/third_party/lua-5.1.5/src/lvm.c | 767 + .../src/third_party/lua-5.1.5/src/lvm.h | 36 + .../src/third_party/lua-5.1.5/src/lzio.c | 82 + .../src/third_party/lua-5.1.5/src/lzio.h | 67 + .../src/third_party/lua-5.1.5/src/print.c | 227 + .../src/third_party/lua-5.1.5/test/README | 26 + .../src/third_party/lua-5.1.5/test/bisect.lua | 27 + .../src/third_party/lua-5.1.5/test/cf.lua | 16 + .../src/third_party/lua-5.1.5/test/echo.lua | 5 + .../src/third_party/lua-5.1.5/test/env.lua | 7 + .../third_party/lua-5.1.5/test/factorial.lua | 32 + .../src/third_party/lua-5.1.5/test/fib.lua | 40 + .../src/third_party/lua-5.1.5/test/fibfor.lua | 13 + .../third_party/lua-5.1.5/test/globals.lua | 13 + .../src/third_party/lua-5.1.5/test/hello.lua | 3 + .../src/third_party/lua-5.1.5/test/life.lua | 111 + .../src/third_party/lua-5.1.5/test/luac.lua | 7 + .../src/third_party/lua-5.1.5/test/printf.lua | 7 + .../third_party/lua-5.1.5/test/readonly.lua | 12 + .../src/third_party/lua-5.1.5/test/sieve.lua | 29 + .../src/third_party/lua-5.1.5/test/sort.lua | 66 + .../src/third_party/lua-5.1.5/test/table.lua | 12 + .../lua-5.1.5/test/trace-calls.lua | 32 + .../lua-5.1.5/test/trace-globals.lua | 38 + .../src/third_party/lua-5.1.5/test/xd.lua | 14 + .../src/third_party/lua-5.2.3/Makefile | 114 + 3P/civetweb/src/third_party/lua-5.2.3/README | 6 + .../third_party/lua-5.2.3/doc/contents.html | 533 + .../src/third_party/lua-5.2.3/doc/logo.gif | Bin 0 -> 4232 bytes .../src/third_party/lua-5.2.3/doc/lua.1 | 116 + .../src/third_party/lua-5.2.3/doc/lua.css | 96 + .../src/third_party/lua-5.2.3/doc/luac.1 | 118 + .../src/third_party/lua-5.2.3/doc/manual.css | 27 + .../src/third_party/lua-5.2.3/doc/manual.html | 10507 + .../lua-5.2.3/doc/osi-certified-72x60.png | Bin 0 -> 3774 bytes .../src/third_party/lua-5.2.3/doc/readme.html | 413 + .../src/third_party/lua-5.2.3/src/Makefile | 187 + .../src/third_party/lua-5.2.3/src/lapi.c | 1284 + .../src/third_party/lua-5.2.3/src/lapi.h | 24 + .../src/third_party/lua-5.2.3/src/lauxlib.c | 959 + .../src/third_party/lua-5.2.3/src/lauxlib.h | 212 + .../src/third_party/lua-5.2.3/src/lbaselib.c | 458 + .../src/third_party/lua-5.2.3/src/lbitlib.c | 212 + .../src/third_party/lua-5.2.3/src/lcode.c | 881 + .../src/third_party/lua-5.2.3/src/lcode.h | 83 + .../src/third_party/lua-5.2.3/src/lcorolib.c | 155 + .../src/third_party/lua-5.2.3/src/lctype.c | 52 + .../src/third_party/lua-5.2.3/src/lctype.h | 95 + .../src/third_party/lua-5.2.3/src/ldblib.c | 398 + .../src/third_party/lua-5.2.3/src/ldebug.c | 593 + .../src/third_party/lua-5.2.3/src/ldebug.h | 34 + .../src/third_party/lua-5.2.3/src/ldo.c | 681 + .../src/third_party/lua-5.2.3/src/ldo.h | 46 + .../src/third_party/lua-5.2.3/src/ldump.c | 173 + .../src/third_party/lua-5.2.3/src/lfunc.c | 161 + .../src/third_party/lua-5.2.3/src/lfunc.h | 33 + .../src/third_party/lua-5.2.3/src/lgc.c | 1220 + .../src/third_party/lua-5.2.3/src/lgc.h | 157 + .../src/third_party/lua-5.2.3/src/linit.c | 67 + .../src/third_party/lua-5.2.3/src/liolib.c | 666 + .../src/third_party/lua-5.2.3/src/llex.c | 530 + .../src/third_party/lua-5.2.3/src/llex.h | 78 + .../src/third_party/lua-5.2.3/src/llimits.h | 309 + .../src/third_party/lua-5.2.3/src/lmathlib.c | 279 + .../src/third_party/lua-5.2.3/src/lmem.c | 99 + .../src/third_party/lua-5.2.3/src/lmem.h | 57 + .../src/third_party/lua-5.2.3/src/loadlib.c | 725 + .../src/third_party/lua-5.2.3/src/lobject.c | 287 + .../src/third_party/lua-5.2.3/src/lobject.h | 607 + .../src/third_party/lua-5.2.3/src/lopcodes.c | 107 + .../src/third_party/lua-5.2.3/src/lopcodes.h | 288 + .../src/third_party/lua-5.2.3/src/loslib.c | 323 + .../src/third_party/lua-5.2.3/src/lparser.c | 1638 + .../src/third_party/lua-5.2.3/src/lparser.h | 119 + .../src/third_party/lua-5.2.3/src/lstate.c | 323 + .../src/third_party/lua-5.2.3/src/lstate.h | 228 + .../src/third_party/lua-5.2.3/src/lstring.c | 185 + .../src/third_party/lua-5.2.3/src/lstring.h | 46 + .../src/third_party/lua-5.2.3/src/lstrlib.c | 1019 + .../src/third_party/lua-5.2.3/src/ltable.c | 588 + .../src/third_party/lua-5.2.3/src/ltable.h | 45 + .../src/third_party/lua-5.2.3/src/ltablib.c | 283 + .../src/third_party/lua-5.2.3/src/ltm.c | 77 + .../src/third_party/lua-5.2.3/src/ltm.h | 57 + .../src/third_party/lua-5.2.3/src/lua.c | 497 + .../src/third_party/lua-5.2.3/src/lua.h | 444 + .../src/third_party/lua-5.2.3/src/lua.hpp | 9 + .../src/third_party/lua-5.2.3/src/luac.c | 432 + .../src/third_party/lua-5.2.3/src/luaconf.h | 551 + .../src/third_party/lua-5.2.3/src/lualib.h | 55 + .../src/third_party/lua-5.2.3/src/lundump.c | 258 + .../src/third_party/lua-5.2.3/src/lundump.h | 28 + .../src/third_party/lua-5.2.3/src/lvm.c | 867 + .../src/third_party/lua-5.2.3/src/lvm.h | 44 + .../src/third_party/lua-5.2.3/src/lzio.c | 76 + .../src/third_party/lua-5.2.3/src/lzio.h | 65 + .../src/third_party/lua-5.2.4/Makefile | 114 + 3P/civetweb/src/third_party/lua-5.2.4/README | 6 + .../third_party/lua-5.2.4/doc/contents.html | 608 + .../src/third_party/lua-5.2.4/doc/logo.gif | Bin 0 -> 4232 bytes .../src/third_party/lua-5.2.4/doc/lua.1 | 116 + .../src/third_party/lua-5.2.4/doc/lua.css | 106 + .../src/third_party/lua-5.2.4/doc/luac.1 | 118 + .../src/third_party/lua-5.2.4/doc/manual.css | 27 + .../src/third_party/lua-5.2.4/doc/manual.html | 10508 + .../lua-5.2.4/doc/osi-certified-72x60.png | Bin 0 -> 3774 bytes .../src/third_party/lua-5.2.4/doc/readme.html | 417 + .../src/third_party/lua-5.2.4/src/Makefile | 187 + .../src/third_party/lua-5.2.4/src/lapi.c | 1284 + .../src/third_party/lua-5.2.4/src/lapi.h | 24 + .../src/third_party/lua-5.2.4/src/lauxlib.c | 959 + .../src/third_party/lua-5.2.4/src/lauxlib.h | 212 + .../src/third_party/lua-5.2.4/src/lbaselib.c | 458 + .../src/third_party/lua-5.2.4/src/lbitlib.c | 212 + .../src/third_party/lua-5.2.4/src/lcode.c | 881 + .../src/third_party/lua-5.2.4/src/lcode.h | 83 + .../src/third_party/lua-5.2.4/src/lcorolib.c | 155 + .../src/third_party/lua-5.2.4/src/lctype.c | 52 + .../src/third_party/lua-5.2.4/src/lctype.h | 95 + .../src/third_party/lua-5.2.4/src/ldblib.c | 408 + .../src/third_party/lua-5.2.4/src/ldebug.c | 610 + .../src/third_party/lua-5.2.4/src/ldebug.h | 34 + .../src/third_party/lua-5.2.4/src/ldo.c | 681 + .../src/third_party/lua-5.2.4/src/ldo.h | 46 + .../src/third_party/lua-5.2.4/src/ldump.c | 173 + .../src/third_party/lua-5.2.4/src/lfunc.c | 161 + .../src/third_party/lua-5.2.4/src/lfunc.h | 33 + .../src/third_party/lua-5.2.4/src/lgc.c | 1220 + .../src/third_party/lua-5.2.4/src/lgc.h | 157 + .../src/third_party/lua-5.2.4/src/linit.c | 67 + .../src/third_party/lua-5.2.4/src/liolib.c | 666 + .../src/third_party/lua-5.2.4/src/llex.c | 530 + .../src/third_party/lua-5.2.4/src/llex.h | 78 + .../src/third_party/lua-5.2.4/src/llimits.h | 309 + .../src/third_party/lua-5.2.4/src/lmathlib.c | 279 + .../src/third_party/lua-5.2.4/src/lmem.c | 99 + .../src/third_party/lua-5.2.4/src/lmem.h | 57 + .../src/third_party/lua-5.2.4/src/loadlib.c | 725 + .../src/third_party/lua-5.2.4/src/lobject.c | 287 + .../src/third_party/lua-5.2.4/src/lobject.h | 607 + .../src/third_party/lua-5.2.4/src/lopcodes.c | 107 + .../src/third_party/lua-5.2.4/src/lopcodes.h | 288 + .../src/third_party/lua-5.2.4/src/loslib.c | 323 + .../src/third_party/lua-5.2.4/src/lparser.c | 1638 + .../src/third_party/lua-5.2.4/src/lparser.h | 119 + .../src/third_party/lua-5.2.4/src/lstate.c | 323 + .../src/third_party/lua-5.2.4/src/lstate.h | 228 + .../src/third_party/lua-5.2.4/src/lstring.c | 185 + .../src/third_party/lua-5.2.4/src/lstring.h | 46 + .../src/third_party/lua-5.2.4/src/lstrlib.c | 1019 + .../src/third_party/lua-5.2.4/src/ltable.c | 588 + .../src/third_party/lua-5.2.4/src/ltable.h | 45 + .../src/third_party/lua-5.2.4/src/ltablib.c | 285 + .../src/third_party/lua-5.2.4/src/ltm.c | 77 + .../src/third_party/lua-5.2.4/src/ltm.h | 57 + .../src/third_party/lua-5.2.4/src/lua.c | 497 + .../src/third_party/lua-5.2.4/src/lua.h | 444 + .../src/third_party/lua-5.2.4/src/lua.hpp | 9 + .../src/third_party/lua-5.2.4/src/luac.c | 432 + .../src/third_party/lua-5.2.4/src/luaconf.h | 551 + .../src/third_party/lua-5.2.4/src/lualib.h | 55 + .../src/third_party/lua-5.2.4/src/lundump.c | 258 + .../src/third_party/lua-5.2.4/src/lundump.h | 28 + .../src/third_party/lua-5.2.4/src/lvm.c | 867 + .../src/third_party/lua-5.2.4/src/lvm.h | 44 + .../src/third_party/lua-5.2.4/src/lzio.c | 76 + .../src/third_party/lua-5.2.4/src/lzio.h | 65 + .../src/third_party/lua-5.3.1/Makefile | 114 + 3P/civetweb/src/third_party/lua-5.3.1/README | 6 + .../third_party/lua-5.3.1/doc/contents.html | 618 + .../src/third_party/lua-5.3.1/doc/index.css | 21 + .../src/third_party/lua-5.3.1/doc/logo.gif | Bin 0 -> 4232 bytes .../src/third_party/lua-5.3.1/doc/lua.1 | 111 + .../src/third_party/lua-5.3.1/doc/lua.css | 133 + .../src/third_party/lua-5.3.1/doc/luac.1 | 118 + .../src/third_party/lua-5.3.1/doc/manual.css | 21 + .../src/third_party/lua-5.3.1/doc/manual.html | 10807 + .../lua-5.3.1/doc/osi-certified-72x60.png | Bin 0 -> 3774 bytes .../src/third_party/lua-5.3.1/doc/readme.html | 365 + .../src/third_party/lua-5.3.1/src/Makefile | 197 + .../src/third_party/lua-5.3.1/src/lapi.c | 1275 + .../src/third_party/lua-5.3.1/src/lapi.h | 24 + .../src/third_party/lua-5.3.1/src/lauxlib.c | 972 + .../src/third_party/lua-5.3.1/src/lauxlib.h | 256 + .../src/third_party/lua-5.3.1/src/lbaselib.c | 520 + .../src/third_party/lua-5.3.1/src/lbitlib.c | 230 + .../src/third_party/lua-5.3.1/src/lcode.c | 955 + .../src/third_party/lua-5.3.1/src/lcode.h | 87 + .../src/third_party/lua-5.3.1/src/lcorolib.c | 168 + .../src/third_party/lua-5.3.1/src/lctype.c | 55 + .../src/third_party/lua-5.3.1/src/lctype.h | 95 + .../src/third_party/lua-5.3.1/src/ldblib.c | 456 + .../src/third_party/lua-5.3.1/src/ldebug.c | 671 + .../src/third_party/lua-5.3.1/src/ldebug.h | 39 + .../src/third_party/lua-5.3.1/src/ldo.c | 717 + .../src/third_party/lua-5.3.1/src/ldo.h | 46 + .../src/third_party/lua-5.3.1/src/ldump.c | 215 + .../src/third_party/lua-5.3.1/src/lfunc.c | 151 + .../src/third_party/lua-5.3.1/src/lfunc.h | 61 + .../src/third_party/lua-5.3.1/src/lgc.c | 1175 + .../src/third_party/lua-5.3.1/src/lgc.h | 138 + .../src/third_party/lua-5.3.1/src/linit.c | 68 + .../src/third_party/lua-5.3.1/src/liolib.c | 752 + .../src/third_party/lua-5.3.1/src/llex.c | 598 + .../src/third_party/lua-5.3.1/src/llex.h | 86 + .../src/third_party/lua-5.3.1/src/llimits.h | 313 + .../src/third_party/lua-5.3.1/src/lmathlib.c | 407 + .../src/third_party/lua-5.3.1/src/lmem.c | 100 + .../src/third_party/lua-5.3.1/src/lmem.h | 69 + .../src/third_party/lua-5.3.1/src/loadlib.c | 787 + .../src/third_party/lua-5.3.1/src/lobject.c | 479 + .../src/third_party/lua-5.3.1/src/lobject.h | 553 + .../src/third_party/lua-5.3.1/src/lopcodes.c | 124 + .../src/third_party/lua-5.3.1/src/lopcodes.h | 295 + .../src/third_party/lua-5.3.1/src/loslib.c | 370 + .../src/third_party/lua-5.3.1/src/lparser.c | 1647 + .../src/third_party/lua-5.3.1/src/lparser.h | 120 + .../src/third_party/lua-5.3.1/src/lprefix.h | 45 + .../src/third_party/lua-5.3.1/src/lstate.c | 340 + .../src/third_party/lua-5.3.1/src/lstate.h | 225 + .../src/third_party/lua-5.3.1/src/lstring.c | 226 + .../src/third_party/lua-5.3.1/src/lstring.h | 47 + .../src/third_party/lua-5.3.1/src/lstrlib.c | 1514 + .../src/third_party/lua-5.3.1/src/ltable.c | 655 + .../src/third_party/lua-5.3.1/src/ltable.h | 53 + .../src/third_party/lua-5.3.1/src/ltablib.c | 359 + .../src/third_party/lua-5.3.1/src/ltm.c | 144 + .../src/third_party/lua-5.3.1/src/ltm.h | 75 + .../src/third_party/lua-5.3.1/src/lua.c | 613 + .../src/third_party/lua-5.3.1/src/lua.h | 486 + .../src/third_party/lua-5.3.1/src/lua.hpp | 9 + .../src/third_party/lua-5.3.1/src/luac.c | 449 + .../src/third_party/lua-5.3.1/src/luaconf.h | 750 + .../src/third_party/lua-5.3.1/src/lualib.h | 58 + .../src/third_party/lua-5.3.1/src/lundump.c | 277 + .../src/third_party/lua-5.3.1/src/lundump.h | 33 + .../src/third_party/lua-5.3.1/src/lutf8lib.c | 256 + .../src/third_party/lua-5.3.1/src/lvm.c | 1274 + .../src/third_party/lua-5.3.1/src/lvm.h | 68 + .../src/third_party/lua-5.3.1/src/lzio.c | 78 + .../src/third_party/lua-5.3.1/src/lzio.h | 67 + 3P/civetweb/src/third_party/sqlite3.c | 155866 +++++++++++++++ 3P/civetweb/src/third_party/sqlite3.h | 7831 + 3P/civetweb/src/timer.inl | 143 + 3P/civetweb/test/.leading.dot.txt | 1 + 3P/civetweb/test/1000images.lua | 199 + 3P/civetweb/test/100images.htm | 168 + 3P/civetweb/test/CMakeLists.txt | 196 + 3P/civetweb/test/HugeText.lua | 149 + 3P/civetweb/test/MakefileTest.mk | 88 + 3P/civetweb/test/MethodTest.xhtml | 200 + 3P/civetweb/test/README.md | 25 + 3P/civetweb/test/ajax/echo.cgi | 8 + 3P/civetweb/test/ajax/echo.cgi.old | 73 + 3P/civetweb/test/ajax/echo.lp | 9 + 3P/civetweb/test/ajax/echo.lua | 35 + 3P/civetweb/test/ajax/jquery.js | 4 + 3P/civetweb/test/ajax/test.html | 167 + 3P/civetweb/test/all_build_flags.pl | 28 + 3P/civetweb/test/bad.cgi | 5 + 3P/civetweb/test/bad2.cgi | 3 + 3P/civetweb/test/civetweb_check.h | 53 + 3P/civetweb/test/cors.html | 75 + 3P/civetweb/test/cors.reply.html | 7 + 3P/civetweb/test/cors.reply.lua | 73 + 3P/civetweb/test/cors.reply.shtml | 7 + 3P/civetweb/test/dir with spaces/hello.cgi | 3 + 3P/civetweb/test/embed.c | 182 + 3P/civetweb/test/env.cgi | 46 + 3P/civetweb/test/error.lua | 12 + 3P/civetweb/test/error404.htm | 10 + 3P/civetweb/test/exit.lua | 15 + 3P/civetweb/test/exploit.pl | 69 + 3P/civetweb/test/form.html | 83 + 3P/civetweb/test/handle_form.lua | 123 + 3P/civetweb/test/hello.cgi | 6 + 3P/civetweb/test/hello.txt | 1 + 3P/civetweb/test/hello_gz.txt.gz | Bin 0 -> 66 bytes 3P/civetweb/test/hello_gz_unzipped.txt | 1 + 3P/civetweb/test/html_esc.lua | 60 + 3P/civetweb/test/imagetest/00.png | Bin 0 -> 566 bytes 3P/civetweb/test/imagetest/01.png | Bin 0 -> 587 bytes 3P/civetweb/test/imagetest/02.png | Bin 0 -> 701 bytes 3P/civetweb/test/imagetest/03.png | Bin 0 -> 741 bytes 3P/civetweb/test/imagetest/04.png | Bin 0 -> 622 bytes 3P/civetweb/test/imagetest/05.png | Bin 0 -> 711 bytes 3P/civetweb/test/imagetest/06.png | Bin 0 -> 748 bytes 3P/civetweb/test/imagetest/07.png | Bin 0 -> 645 bytes 3P/civetweb/test/imagetest/08.png | Bin 0 -> 759 bytes 3P/civetweb/test/imagetest/09.png | Bin 0 -> 760 bytes 3P/civetweb/test/imagetest/10.png | Bin 0 -> 584 bytes 3P/civetweb/test/imagetest/11.png | Bin 0 -> 386 bytes 3P/civetweb/test/imagetest/12.png | Bin 0 -> 529 bytes 3P/civetweb/test/imagetest/13.png | Bin 0 -> 575 bytes 3P/civetweb/test/imagetest/14.png | Bin 0 -> 451 bytes 3P/civetweb/test/imagetest/15.png | Bin 0 -> 547 bytes 3P/civetweb/test/imagetest/16.png | Bin 0 -> 600 bytes 3P/civetweb/test/imagetest/17.png | Bin 0 -> 477 bytes 3P/civetweb/test/imagetest/18.png | Bin 0 -> 597 bytes 3P/civetweb/test/imagetest/19.png | Bin 0 -> 600 bytes 3P/civetweb/test/imagetest/20.png | Bin 0 -> 700 bytes 3P/civetweb/test/imagetest/21.png | Bin 0 -> 533 bytes 3P/civetweb/test/imagetest/22.png | Bin 0 -> 514 bytes 3P/civetweb/test/imagetest/23.png | Bin 0 -> 679 bytes 3P/civetweb/test/imagetest/24.png | Bin 0 -> 564 bytes 3P/civetweb/test/imagetest/25.png | Bin 0 -> 656 bytes 3P/civetweb/test/imagetest/26.png | Bin 0 -> 694 bytes 3P/civetweb/test/imagetest/27.png | Bin 0 -> 586 bytes 3P/civetweb/test/imagetest/28.png | Bin 0 -> 695 bytes 3P/civetweb/test/imagetest/29.png | Bin 0 -> 712 bytes 3P/civetweb/test/imagetest/30.png | Bin 0 -> 736 bytes 3P/civetweb/test/imagetest/31.png | Bin 0 -> 572 bytes 3P/civetweb/test/imagetest/32.png | Bin 0 -> 682 bytes 3P/civetweb/test/imagetest/33.png | Bin 0 -> 556 bytes 3P/civetweb/test/imagetest/34.png | Bin 0 -> 612 bytes 3P/civetweb/test/imagetest/35.png | Bin 0 -> 695 bytes 3P/civetweb/test/imagetest/36.png | Bin 0 -> 739 bytes 3P/civetweb/test/imagetest/37.png | Bin 0 -> 636 bytes 3P/civetweb/test/imagetest/38.png | Bin 0 -> 747 bytes 3P/civetweb/test/imagetest/39.png | Bin 0 -> 736 bytes 3P/civetweb/test/imagetest/40.png | Bin 0 -> 623 bytes 3P/civetweb/test/imagetest/41.png | Bin 0 -> 448 bytes 3P/civetweb/test/imagetest/42.png | Bin 0 -> 560 bytes 3P/civetweb/test/imagetest/43.png | Bin 0 -> 610 bytes 3P/civetweb/test/imagetest/44.png | Bin 0 -> 441 bytes 3P/civetweb/test/imagetest/45.png | Bin 0 -> 584 bytes 3P/civetweb/test/imagetest/46.png | Bin 0 -> 632 bytes 3P/civetweb/test/imagetest/47.png | Bin 0 -> 522 bytes 3P/civetweb/test/imagetest/48.png | Bin 0 -> 634 bytes 3P/civetweb/test/imagetest/49.png | Bin 0 -> 637 bytes 3P/civetweb/test/imagetest/50.png | Bin 0 -> 709 bytes 3P/civetweb/test/imagetest/51.png | Bin 0 -> 550 bytes 3P/civetweb/test/imagetest/52.png | Bin 0 -> 661 bytes 3P/civetweb/test/imagetest/53.png | Bin 0 -> 696 bytes 3P/civetweb/test/imagetest/54.png | Bin 0 -> 587 bytes 3P/civetweb/test/imagetest/55.png | Bin 0 -> 544 bytes 3P/civetweb/test/imagetest/56.png | Bin 0 -> 718 bytes 3P/civetweb/test/imagetest/57.png | Bin 0 -> 610 bytes 3P/civetweb/test/imagetest/58.png | Bin 0 -> 721 bytes 3P/civetweb/test/imagetest/59.png | Bin 0 -> 725 bytes 3P/civetweb/test/imagetest/60.png | Bin 0 -> 751 bytes 3P/civetweb/test/imagetest/61.png | Bin 0 -> 600 bytes 3P/civetweb/test/imagetest/62.png | Bin 0 -> 710 bytes 3P/civetweb/test/imagetest/63.png | Bin 0 -> 744 bytes 3P/civetweb/test/imagetest/64.png | Bin 0 -> 631 bytes 3P/civetweb/test/imagetest/65.png | Bin 0 -> 726 bytes 3P/civetweb/test/imagetest/66.png | Bin 0 -> 584 bytes 3P/civetweb/test/imagetest/67.png | Bin 0 -> 659 bytes 3P/civetweb/test/imagetest/68.png | Bin 0 -> 766 bytes 3P/civetweb/test/imagetest/69.png | Bin 0 -> 766 bytes 3P/civetweb/test/imagetest/70.png | Bin 0 -> 640 bytes 3P/civetweb/test/imagetest/71.png | Bin 0 -> 474 bytes 3P/civetweb/test/imagetest/72.png | Bin 0 -> 584 bytes 3P/civetweb/test/imagetest/73.png | Bin 0 -> 631 bytes 3P/civetweb/test/imagetest/74.png | Bin 0 -> 517 bytes 3P/civetweb/test/imagetest/75.png | Bin 0 -> 603 bytes 3P/civetweb/test/imagetest/76.png | Bin 0 -> 650 bytes 3P/civetweb/test/imagetest/77.png | Bin 0 -> 453 bytes 3P/civetweb/test/imagetest/78.png | Bin 0 -> 653 bytes 3P/civetweb/test/imagetest/79.png | Bin 0 -> 655 bytes 3P/civetweb/test/imagetest/80.png | Bin 0 -> 759 bytes 3P/civetweb/test/imagetest/81.png | Bin 0 -> 596 bytes 3P/civetweb/test/imagetest/82.png | Bin 0 -> 714 bytes 3P/civetweb/test/imagetest/83.png | Bin 0 -> 751 bytes 3P/civetweb/test/imagetest/84.png | Bin 0 -> 634 bytes 3P/civetweb/test/imagetest/85.png | Bin 0 -> 724 bytes 3P/civetweb/test/imagetest/86.png | Bin 0 -> 766 bytes 3P/civetweb/test/imagetest/87.png | Bin 0 -> 660 bytes 3P/civetweb/test/imagetest/88.png | Bin 0 -> 579 bytes 3P/civetweb/test/imagetest/89.png | Bin 0 -> 778 bytes 3P/civetweb/test/imagetest/90.png | Bin 0 -> 756 bytes 3P/civetweb/test/imagetest/91.png | Bin 0 -> 604 bytes 3P/civetweb/test/imagetest/92.png | Bin 0 -> 716 bytes 3P/civetweb/test/imagetest/93.png | Bin 0 -> 735 bytes 3P/civetweb/test/imagetest/94.png | Bin 0 -> 634 bytes 3P/civetweb/test/imagetest/95.png | Bin 0 -> 726 bytes 3P/civetweb/test/imagetest/96.png | Bin 0 -> 763 bytes 3P/civetweb/test/imagetest/97.png | Bin 0 -> 660 bytes 3P/civetweb/test/imagetest/98.png | Bin 0 -> 776 bytes 3P/civetweb/test/imagetest/99.png | Bin 0 -> 590 bytes 3P/civetweb/test/linux.cgi | 9 + 3P/civetweb/test/linux_fail.cgi | 4 + 3P/civetweb/test/linux_fail_silent.cgi | 5 + 3P/civetweb/test/lua_preload_file.lua | 7 + 3P/civetweb/test/main.c | 90 + 3P/civetweb/test/page.lp | 71 + 3P/civetweb/test/page.lua | 71 + 3P/civetweb/test/page.ssjs | 19 + 3P/civetweb/test/page2.lp | 72 + 3P/civetweb/test/page2.lua | 87 + 3P/civetweb/test/page2.ssjs | 30 + 3P/civetweb/test/page3.lua | 34 + 3P/civetweb/test/page3.ssjs | 61 + 3P/civetweb/test/page4.lua | 167 + 3P/civetweb/test/page_keep_alive.lua | 31 + 3P/civetweb/test/page_keep_alive_chunked.lua | 65 + 3P/civetweb/test/passfile | 3 + 3P/civetweb/test/prime.ssjs | 36 + 3P/civetweb/test/private.c | 552 + 3P/civetweb/test/private.h | 28 + 3P/civetweb/test/private_exe.c | 77 + 3P/civetweb/test/private_exe.h | 31 + 3P/civetweb/test/public_func.c | 463 + 3P/civetweb/test/public_func.h | 28 + 3P/civetweb/test/public_server.c | 1445 + 3P/civetweb/test/public_server.h | 28 + 3P/civetweb/test/require_test.lua | 2 + 3P/civetweb/test/resource_script_demo.lua | 124 + 3P/civetweb/test/sh.cgi | 6 + 3P/civetweb/test/shared.c | 46 + 3P/civetweb/test/shared.h | 27 + 3P/civetweb/test/ssi1.shtml | 5 + 3P/civetweb/test/ssi2.shtml | 5 + 3P/civetweb/test/ssi3.shtml | 5 + 3P/civetweb/test/ssi4.shtml | 5 + 3P/civetweb/test/ssi5.shtml | 5 + 3P/civetweb/test/ssi6.shtml | 5 + 3P/civetweb/test/ssi7.shtml | 6 + 3P/civetweb/test/ssi8.shtml | 1 + 3P/civetweb/test/ssi9.shtml | 3 + 3P/civetweb/test/syntax_error.ssjs | 7 + 3P/civetweb/test/test.ico | Bin 0 -> 1406 bytes 3P/civetweb/test/test.pl | 461 + 3P/civetweb/test/testclient.c | 151 + 3P/civetweb/test/timeout.cgi | 12 + 3P/civetweb/test/unit_test.c | 1519 + 3P/civetweb/test/websocket.lua | 118 + 3P/civetweb/test/websocket.xhtml | 117 + 3P/civetweb/test/windows.cgi | 2 + 3P/civetweb/test/windows.cgi.cmd | 7 + 3P/civetweb/test/windows_fail.cgi | 2 + 3P/civetweb/test/windows_fail.cgi.cmd | 2 + 3P/civetweb/test/windows_fail_silent.cgi | 2 + 3P/civetweb/test/windows_fail_silent.cgi.cmd | 3 + 3P/civetweb/test/x.php | 9 + 3P/civetweb/testutils/Browser/Browser.cpp | 119 + 3P/civetweb/testutils/Browser/Browser.vcxproj | 90 + 3P/civetweb/testutils/readme.txt | 5 + 3P/civetweb/testutils/testclient/testclient.c | 372 + .../testutils/testclient/testclient.vcxproj | 91 + .../testclient_chunked_linux/testclient.c | 239 + .../testclient2.vcxproj | 91 + 3P/jsoncpp/.clang-format | 47 + 3P/jsoncpp/.gitignore | 36 + 3P/jsoncpp/.travis.yml | 17 + 3P/jsoncpp/AUTHORS | 1 + 3P/jsoncpp/CMakeLists.txt | 126 + 3P/jsoncpp/LICENSE | 55 + 3P/jsoncpp/NEWS.txt | 175 + 3P/jsoncpp/README.md | 210 + 3P/jsoncpp/SConstruct | 248 + 3P/jsoncpp/amalgamate.py | 154 + 3P/jsoncpp/builders/cmake/CMakeLists.txt | 25 + 3P/jsoncpp/dev.makefile | 32 + 3P/jsoncpp/devtools/__init__.py | 1 + 3P/jsoncpp/devtools/agent_vmw7.json | 33 + 3P/jsoncpp/devtools/agent_vmxp.json | 26 + 3P/jsoncpp/devtools/antglob.py | 202 + 3P/jsoncpp/devtools/batchbuild.py | 278 + 3P/jsoncpp/devtools/fixeol.py | 64 + 3P/jsoncpp/devtools/licenseupdater.py | 94 + 3P/jsoncpp/devtools/tarball.py | 47 + 3P/jsoncpp/doc/doxyfile.in | 2301 + 3P/jsoncpp/doc/footer.html | 3 + 3P/jsoncpp/doc/header.html | 24 + 3P/jsoncpp/doc/jsoncpp.dox | 164 + 3P/jsoncpp/doc/readme.txt | 1 + 3P/jsoncpp/doc/roadmap.dox | 3 + 3P/jsoncpp/doc/web_doxyfile.in | 2301 + 3P/jsoncpp/doxybuild.py | 189 + 3P/jsoncpp/include/CMakeLists.txt | 2 + 3P/jsoncpp/include/jsoncpp/assertions.h | 54 + 3P/jsoncpp/include/jsoncpp/autolink.h | 25 + 3P/jsoncpp/include/jsoncpp/config.h | 109 + 3P/jsoncpp/include/jsoncpp/features.h | 57 + 3P/jsoncpp/include/jsoncpp/forwards.h | 37 + 3P/jsoncpp/include/jsoncpp/json.h | 15 + 3P/jsoncpp/include/jsoncpp/reader.h | 401 + 3P/jsoncpp/include/jsoncpp/value.h | 822 + 3P/jsoncpp/include/jsoncpp/version.h | 14 + 3P/jsoncpp/include/jsoncpp/writer.h | 327 + 3P/jsoncpp/makefiles/vs71/jsontest.vcproj | 119 + 3P/jsoncpp/makefiles/vs71/lib_json.vcproj | 205 + .../makefiles/vs71/test_lib_json.vcproj | 130 + 3P/jsoncpp/makerelease.py | 384 + 3P/jsoncpp/pkg-config/jsoncpp.pc.in | 11 + 3P/jsoncpp/scons-tools/globtool.py | 53 + 3P/jsoncpp/scons-tools/srcdist.py | 178 + 3P/jsoncpp/scons-tools/substinfile.py | 80 + 3P/jsoncpp/scons-tools/targz.py | 82 + 3P/jsoncpp/src/CMakeLists.txt | 5 + 3P/jsoncpp/src/jsontestrunner/CMakeLists.txt | 28 + 3P/jsoncpp/src/jsontestrunner/main.cpp | 325 + 3P/jsoncpp/src/jsontestrunner/sconscript | 9 + 3P/jsoncpp/src/lib_json/CMakeLists.txt | 85 + 3P/jsoncpp/src/lib_json/json_reader.cpp | 2001 + 3P/jsoncpp/src/lib_json/json_tool.h | 87 + 3P/jsoncpp/src/lib_json/json_value.cpp | 1544 + .../src/lib_json/json_valueiterator.inl | 162 + 3P/jsoncpp/src/lib_json/json_writer.cpp | 1158 + 3P/jsoncpp/src/lib_json/sconscript | 8 + 3P/jsoncpp/src/lib_json/version.h.in | 14 + 3P/jsoncpp/src/test_lib_json/CMakeLists.txt | 41 + 3P/jsoncpp/src/test_lib_json/jsontest.cpp | 443 + 3P/jsoncpp/src/test_lib_json/jsontest.h | 280 + 3P/jsoncpp/src/test_lib_json/main.cpp | 2389 + 3P/jsoncpp/src/test_lib_json/sconscript | 10 + 3P/jsoncpp/test/cleantests.py | 10 + 3P/jsoncpp/test/data/fail_test_array_01.json | 1 + 3P/jsoncpp/test/data/test_array_01.expected | 1 + 3P/jsoncpp/test/data/test_array_01.json | 1 + 3P/jsoncpp/test/data/test_array_02.expected | 2 + 3P/jsoncpp/test/data/test_array_02.json | 1 + 3P/jsoncpp/test/data/test_array_03.expected | 6 + 3P/jsoncpp/test/data/test_array_03.json | 1 + 3P/jsoncpp/test/data/test_array_04.expected | 5 + 3P/jsoncpp/test/data/test_array_04.json | 1 + 3P/jsoncpp/test/data/test_array_05.expected | 100 + 3P/jsoncpp/test/data/test_array_05.json | 1 + 3P/jsoncpp/test/data/test_array_06.expected | 5 + 3P/jsoncpp/test/data/test_array_06.json | 4 + 3P/jsoncpp/test/data/test_array_07.expected | 2122 + 3P/jsoncpp/test/data/test_array_07.json | 2 + 3P/jsoncpp/test/data/test_basic_01.expected | 1 + 3P/jsoncpp/test/data/test_basic_01.json | 1 + 3P/jsoncpp/test/data/test_basic_02.expected | 1 + 3P/jsoncpp/test/data/test_basic_02.json | 1 + 3P/jsoncpp/test/data/test_basic_03.expected | 3 + 3P/jsoncpp/test/data/test_basic_03.json | 3 + 3P/jsoncpp/test/data/test_basic_04.expected | 2 + 3P/jsoncpp/test/data/test_basic_04.json | 2 + 3P/jsoncpp/test/data/test_basic_05.expected | 2 + 3P/jsoncpp/test/data/test_basic_05.json | 2 + 3P/jsoncpp/test/data/test_basic_06.expected | 2 + 3P/jsoncpp/test/data/test_basic_06.json | 2 + 3P/jsoncpp/test/data/test_basic_07.expected | 2 + 3P/jsoncpp/test/data/test_basic_07.json | 2 + 3P/jsoncpp/test/data/test_basic_08.expected | 3 + 3P/jsoncpp/test/data/test_basic_08.json | 3 + 3P/jsoncpp/test/data/test_basic_09.expected | 4 + 3P/jsoncpp/test/data/test_basic_09.json | 4 + 3P/jsoncpp/test/data/test_comment_00.expected | 4 + 3P/jsoncpp/test/data/test_comment_00.json | 5 + 3P/jsoncpp/test/data/test_comment_01.expected | 10 + 3P/jsoncpp/test/data/test_comment_01.json | 10 + 3P/jsoncpp/test/data/test_comment_02.expected | 23 + 3P/jsoncpp/test/data/test_comment_02.json | 26 + 3P/jsoncpp/test/data/test_complex_01.expected | 20 + 3P/jsoncpp/test/data/test_complex_01.json | 17 + 3P/jsoncpp/test/data/test_integer_01.expected | 2 + 3P/jsoncpp/test/data/test_integer_01.json | 2 + 3P/jsoncpp/test/data/test_integer_02.expected | 2 + 3P/jsoncpp/test/data/test_integer_02.json | 2 + 3P/jsoncpp/test/data/test_integer_03.expected | 2 + 3P/jsoncpp/test/data/test_integer_03.json | 2 + 3P/jsoncpp/test/data/test_integer_04.expected | 3 + 3P/jsoncpp/test/data/test_integer_04.json | 3 + 3P/jsoncpp/test/data/test_integer_05.expected | 2 + 3P/jsoncpp/test/data/test_integer_05.json | 2 + .../test/data/test_integer_06_64bits.expected | 1 + .../test/data/test_integer_06_64bits.json | 2 + .../test/data/test_integer_07_64bits.expected | 1 + .../test/data/test_integer_07_64bits.json | 2 + .../test/data/test_integer_08_64bits.expected | 1 + .../test/data/test_integer_08_64bits.json | 2 + 3P/jsoncpp/test/data/test_large_01.expected | 2122 + 3P/jsoncpp/test/data/test_large_01.json | 2 + 3P/jsoncpp/test/data/test_object_01.expected | 1 + 3P/jsoncpp/test/data/test_object_01.json | 1 + 3P/jsoncpp/test/data/test_object_02.expected | 2 + 3P/jsoncpp/test/data/test_object_02.json | 1 + 3P/jsoncpp/test/data/test_object_03.expected | 4 + 3P/jsoncpp/test/data/test_object_03.json | 5 + 3P/jsoncpp/test/data/test_object_04.expected | 2 + 3P/jsoncpp/test/data/test_object_04.json | 3 + .../data/test_preserve_comment_01.expected | 11 + .../test/data/test_preserve_comment_01.json | 14 + 3P/jsoncpp/test/data/test_real_01.expected | 3 + 3P/jsoncpp/test/data/test_real_01.json | 3 + 3P/jsoncpp/test/data/test_real_02.expected | 3 + 3P/jsoncpp/test/data/test_real_02.json | 3 + 3P/jsoncpp/test/data/test_real_03.expected | 3 + 3P/jsoncpp/test/data/test_real_03.json | 3 + 3P/jsoncpp/test/data/test_real_04.expected | 3 + 3P/jsoncpp/test/data/test_real_04.json | 3 + 3P/jsoncpp/test/data/test_real_05.expected | 4 + 3P/jsoncpp/test/data/test_real_05.json | 3 + 3P/jsoncpp/test/data/test_real_06.expected | 4 + 3P/jsoncpp/test/data/test_real_06.json | 3 + 3P/jsoncpp/test/data/test_real_07.expected | 4 + 3P/jsoncpp/test/data/test_real_07.json | 3 + 3P/jsoncpp/test/data/test_real_08.expected | 4 + 3P/jsoncpp/test/data/test_real_08.json | 4 + 3P/jsoncpp/test/data/test_real_09.expected | 4 + 3P/jsoncpp/test/data/test_real_09.json | 4 + 3P/jsoncpp/test/data/test_real_10.expected | 4 + 3P/jsoncpp/test/data/test_real_10.json | 4 + 3P/jsoncpp/test/data/test_real_11.expected | 4 + 3P/jsoncpp/test/data/test_real_11.json | 4 + 3P/jsoncpp/test/data/test_real_12.expected | 2 + 3P/jsoncpp/test/data/test_real_12.json | 2 + 3P/jsoncpp/test/data/test_string_01.expected | 1 + 3P/jsoncpp/test/data/test_string_01.json | 1 + 3P/jsoncpp/test/data/test_string_02.expected | 1 + 3P/jsoncpp/test/data/test_string_02.json | 1 + 3P/jsoncpp/test/data/test_string_03.expected | 1 + 3P/jsoncpp/test/data/test_string_03.json | 1 + 3P/jsoncpp/test/data/test_string_04.expected | 2 + 3P/jsoncpp/test/data/test_string_04.json | 2 + 3P/jsoncpp/test/data/test_string_05.expected | 2 + 3P/jsoncpp/test/data/test_string_05.json | 2 + .../test/data/test_string_unicode_01.expected | 1 + .../test/data/test_string_unicode_01.json | 1 + .../test/data/test_string_unicode_02.expected | 1 + .../test/data/test_string_unicode_02.json | 1 + .../test/data/test_string_unicode_03.expected | 1 + .../test/data/test_string_unicode_03.json | 1 + .../test/data/test_string_unicode_04.expected | 1 + .../test/data/test_string_unicode_04.json | 1 + .../test/data/test_string_unicode_05.expected | 2 + .../test/data/test_string_unicode_05.json | 1 + 3P/jsoncpp/test/generate_expected.py | 12 + 3P/jsoncpp/test/jsonchecker/fail1.json | 1 + 3P/jsoncpp/test/jsonchecker/fail10.json | 1 + 3P/jsoncpp/test/jsonchecker/fail11.json | 1 + 3P/jsoncpp/test/jsonchecker/fail12.json | 1 + 3P/jsoncpp/test/jsonchecker/fail13.json | 1 + 3P/jsoncpp/test/jsonchecker/fail14.json | 1 + 3P/jsoncpp/test/jsonchecker/fail15.json | 1 + 3P/jsoncpp/test/jsonchecker/fail16.json | 1 + 3P/jsoncpp/test/jsonchecker/fail17.json | 1 + 3P/jsoncpp/test/jsonchecker/fail18.json | 1 + 3P/jsoncpp/test/jsonchecker/fail19.json | 1 + 3P/jsoncpp/test/jsonchecker/fail2.json | 1 + 3P/jsoncpp/test/jsonchecker/fail20.json | 1 + 3P/jsoncpp/test/jsonchecker/fail21.json | 1 + 3P/jsoncpp/test/jsonchecker/fail22.json | 1 + 3P/jsoncpp/test/jsonchecker/fail23.json | 1 + 3P/jsoncpp/test/jsonchecker/fail24.json | 1 + 3P/jsoncpp/test/jsonchecker/fail25.json | 1 + 3P/jsoncpp/test/jsonchecker/fail26.json | 1 + 3P/jsoncpp/test/jsonchecker/fail27.json | 2 + 3P/jsoncpp/test/jsonchecker/fail28.json | 2 + 3P/jsoncpp/test/jsonchecker/fail29.json | 1 + 3P/jsoncpp/test/jsonchecker/fail3.json | 1 + 3P/jsoncpp/test/jsonchecker/fail30.json | 1 + 3P/jsoncpp/test/jsonchecker/fail31.json | 1 + 3P/jsoncpp/test/jsonchecker/fail32.json | 1 + 3P/jsoncpp/test/jsonchecker/fail33.json | 1 + 3P/jsoncpp/test/jsonchecker/fail4.json | 1 + 3P/jsoncpp/test/jsonchecker/fail5.json | 1 + 3P/jsoncpp/test/jsonchecker/fail6.json | 1 + 3P/jsoncpp/test/jsonchecker/fail7.json | 1 + 3P/jsoncpp/test/jsonchecker/fail8.json | 1 + 3P/jsoncpp/test/jsonchecker/fail9.json | 1 + 3P/jsoncpp/test/jsonchecker/pass1.json | 58 + 3P/jsoncpp/test/jsonchecker/pass2.json | 1 + 3P/jsoncpp/test/jsonchecker/pass3.json | 6 + 3P/jsoncpp/test/jsonchecker/readme.txt | 3 + 3P/jsoncpp/test/pyjsontestrunner.py | 64 + 3P/jsoncpp/test/runjsontests.py | 169 + 3P/jsoncpp/test/rununittests.py | 79 + 3P/jsoncpp/version | 1 + 3P/jsoncpp/version.in | 1 + 1153 files changed, 554633 insertions(+) create mode 100644 3P/civetweb/.gitattributes create mode 100644 3P/civetweb/.gitignore create mode 100644 3P/civetweb/.travis.yml create mode 100644 3P/civetweb/CMakeLists.txt create mode 100644 3P/civetweb/CREDITS.md create mode 100644 3P/civetweb/LICENSE.md create mode 100644 3P/civetweb/Makefile create mode 100644 3P/civetweb/Makefile.deprecated create mode 100644 3P/civetweb/Makefile.osx create mode 100644 3P/civetweb/Qt/CivetWeb.pro create mode 100644 3P/civetweb/Qt/Qt/CivetWeb.pro create mode 100644 3P/civetweb/README.md create mode 100644 3P/civetweb/RELEASE_NOTES.md create mode 100644 3P/civetweb/VS2012/VS2012/buildRelease.pl create mode 100644 3P/civetweb/VS2012/VS2012/civetweb.sln create mode 100644 3P/civetweb/VS2012/VS2012/civetweb_lua/civetweb_lua.vcxproj create mode 100644 3P/civetweb/VS2012/VS2012/civetweb_lua/civetweb_lua.vcxproj.filters create mode 100644 3P/civetweb/VS2012/VS2012/civetweb_yassl/civetweb_yassl.sln create mode 100644 3P/civetweb/VS2012/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj create mode 100644 3P/civetweb/VS2012/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj.filters create mode 100644 3P/civetweb/VS2012/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj create mode 100644 3P/civetweb/VS2012/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj.filters create mode 100644 3P/civetweb/VS2012/VS2012/duktape_lib/duktape_lib.vcxproj create mode 100644 3P/civetweb/VS2012/VS2012/duktape_lib/duktape_lib.vcxproj.filters create mode 100644 3P/civetweb/VS2012/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj create mode 100644 3P/civetweb/VS2012/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj.filters create mode 100644 3P/civetweb/VS2012/VS2012/ex_embedded_c/ex_embedded_c.vcxproj create mode 100644 3P/civetweb/VS2012/VS2012/ex_embedded_c/ex_embedded_c.vcxproj.filters create mode 100644 3P/civetweb/VS2012/VS2012/ex_websocket/ex_websocket.vcxproj create mode 100644 3P/civetweb/VS2012/VS2012/ex_websocket/ex_websocket.vcxproj.filters create mode 100644 3P/civetweb/VS2012/VS2012/ex_websocket_client/ex_websocket_client.vcxproj create mode 100644 3P/civetweb/VS2012/VS2012/ex_websocket_client/ex_websocket_client.vcxproj.filters create mode 100644 3P/civetweb/VS2012/VS2012/lua_lib/lua_lib.vcxproj create mode 100644 3P/civetweb/VS2012/VS2012/lua_lib/lua_lib.vcxproj.filters create mode 100644 3P/civetweb/VS2012/VS2012/unit_test/unit_test.vcxproj create mode 100644 3P/civetweb/VS2012/VS2012/unit_test/unit_test.vcxproj.filters create mode 100644 3P/civetweb/VS2012/VS2012/upload/upload.vcxproj create mode 100644 3P/civetweb/VS2012/VS2012/upload/upload.vcxproj.filters create mode 100644 3P/civetweb/VS2012/buildRelease.pl create mode 100644 3P/civetweb/VS2012/civetweb.sln create mode 100644 3P/civetweb/VS2012/civetweb_lua/civetweb_lua.vcxproj create mode 100644 3P/civetweb/VS2012/civetweb_lua/civetweb_lua.vcxproj.filters create mode 100644 3P/civetweb/VS2012/civetweb_yassl/civetweb_yassl.sln create mode 100644 3P/civetweb/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj create mode 100644 3P/civetweb/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj.filters create mode 100644 3P/civetweb/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj create mode 100644 3P/civetweb/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj.filters create mode 100644 3P/civetweb/VS2012/duktape_lib/duktape_lib.vcxproj create mode 100644 3P/civetweb/VS2012/duktape_lib/duktape_lib.vcxproj.filters create mode 100644 3P/civetweb/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj create mode 100644 3P/civetweb/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj.filters create mode 100644 3P/civetweb/VS2012/ex_embedded_c/ex_embedded_c.vcxproj create mode 100644 3P/civetweb/VS2012/ex_embedded_c/ex_embedded_c.vcxproj.filters create mode 100644 3P/civetweb/VS2012/ex_websocket/ex_websocket.vcxproj create mode 100644 3P/civetweb/VS2012/ex_websocket/ex_websocket.vcxproj.filters create mode 100644 3P/civetweb/VS2012/ex_websocket_client/ex_websocket_client.vcxproj create mode 100644 3P/civetweb/VS2012/ex_websocket_client/ex_websocket_client.vcxproj.filters create mode 100644 3P/civetweb/VS2012/lua_lib/lua_lib.vcxproj create mode 100644 3P/civetweb/VS2012/lua_lib/lua_lib.vcxproj.filters create mode 100644 3P/civetweb/VS2012/unit_test/unit_test.vcxproj create mode 100644 3P/civetweb/VS2012/unit_test/unit_test.vcxproj.filters create mode 100644 3P/civetweb/VS2012/upload/upload.vcxproj create mode 100644 3P/civetweb/VS2012/upload/upload.vcxproj.filters create mode 100644 3P/civetweb/appveyor.yml create mode 100755 3P/civetweb/build create mode 100644 3P/civetweb/build.cmd create mode 100644 3P/civetweb/builders/cmake/CMakeLists.txt create mode 100644 3P/civetweb/ci/test/01_basic/basic_spec.lua create mode 100644 3P/civetweb/ci/test/01_basic/docroot/01_basic_test_dir/git_keep_empty_dir create mode 100644 3P/civetweb/ci/test/01_basic/docroot/01_basic_test_file create mode 100644 3P/civetweb/ci/test/README.md create mode 100644 3P/civetweb/ci/test/civet.lua create mode 100755 3P/civetweb/ci/travis/install_rocks.sh create mode 100755 3P/civetweb/ci/travis/lua_env.sh create mode 100755 3P/civetweb/ci/travis/platform.sh create mode 100755 3P/civetweb/ci/travis/run_ci_tests.sh create mode 100755 3P/civetweb/ci/travis/setup_lua.sh create mode 100644 3P/civetweb/cmake/AddCCompilerFlag.cmake create mode 100644 3P/civetweb/cmake/AddCXXCompilerFlag.cmake create mode 100644 3P/civetweb/cmake/DetermineTargetArchitecture.cmake create mode 100644 3P/civetweb/cmake/FindLibDl.cmake create mode 100644 3P/civetweb/cmake/FindLibM.cmake create mode 100644 3P/civetweb/cmake/FindLibRt.cmake create mode 100644 3P/civetweb/cmake/FindWinSock.cmake create mode 100644 3P/civetweb/cmake/check/patch.cmake create mode 100644 3P/civetweb/contrib/buildroot/Config.in create mode 100644 3P/civetweb/contrib/buildroot/civetweb.mk create mode 100644 3P/civetweb/distribution/arch/PKGBUILD.git.example create mode 100644 3P/civetweb/distribution/arch/civetweb.service create mode 100644 3P/civetweb/docs/Building.md create mode 100644 3P/civetweb/docs/Embedding.md create mode 100644 3P/civetweb/docs/Installing.md create mode 100644 3P/civetweb/docs/OpenSSL.md create mode 100644 3P/civetweb/docs/UserManual.md create mode 100644 3P/civetweb/docs/yaSSL.md create mode 100644 3P/civetweb/examples/chat/Makefile create mode 100644 3P/civetweb/examples/chat/chat.c create mode 100644 3P/civetweb/examples/docroot/favicon.ico create mode 100644 3P/civetweb/examples/docroot/index.html create mode 100644 3P/civetweb/examples/docroot/jquery.js create mode 100644 3P/civetweb/examples/docroot/login.html create mode 100644 3P/civetweb/examples/docroot/logo.png create mode 100644 3P/civetweb/examples/docroot/main.js create mode 100644 3P/civetweb/examples/docroot/prime_numbers.lp create mode 100644 3P/civetweb/examples/docroot/style.css create mode 100644 3P/civetweb/examples/embedded_c/Makefile create mode 100644 3P/civetweb/examples/embedded_c/embedded_c.c create mode 100644 3P/civetweb/examples/embedded_cpp/Makefile create mode 100644 3P/civetweb/examples/embedded_cpp/embedded_cpp.cpp create mode 100644 3P/civetweb/examples/hello/Makefile create mode 100644 3P/civetweb/examples/hello/hello.c create mode 100644 3P/civetweb/examples/lua/lua_dll.c create mode 100644 3P/civetweb/examples/post/Makefile create mode 100644 3P/civetweb/examples/post/post.c create mode 100644 3P/civetweb/examples/upload/Makefile create mode 100644 3P/civetweb/examples/upload/upload.c create mode 100644 3P/civetweb/examples/websocket/Makefile create mode 100644 3P/civetweb/examples/websocket/WebSockCallbacks.c create mode 100644 3P/civetweb/examples/websocket/WebSockCallbacks.h create mode 100644 3P/civetweb/examples/websocket/websock.htm create mode 100644 3P/civetweb/examples/websocket/websocket.c create mode 100644 3P/civetweb/examples/websocket_client/Makefile create mode 100644 3P/civetweb/examples/websocket_client/ssl/server.crt create mode 100644 3P/civetweb/examples/websocket_client/ssl/server.csr create mode 100644 3P/civetweb/examples/websocket_client/ssl/server.key create mode 100644 3P/civetweb/examples/websocket_client/ssl/server.key.orig create mode 100644 3P/civetweb/examples/websocket_client/ssl/server.pem create mode 100644 3P/civetweb/examples/websocket_client/websocket_client.c create mode 100644 3P/civetweb/examples/ws_server/Makefile create mode 100644 3P/civetweb/examples/ws_server/docroot/index.html create mode 100644 3P/civetweb/examples/ws_server/ws_server.c create mode 100644 3P/civetweb/format.bat create mode 100644 3P/civetweb/include/CivetServer.h create mode 100644 3P/civetweb/include/civetweb.h create mode 100644 3P/civetweb/mingw.cmd create mode 100644 3P/civetweb/resources/Info.plist create mode 100644 3P/civetweb/resources/Makefile.in-duktape create mode 100644 3P/civetweb/resources/Makefile.in-lua create mode 100644 3P/civetweb/resources/Makefile.in-os create mode 100644 3P/civetweb/resources/cert/client.crt create mode 100644 3P/civetweb/resources/cert/client.csr create mode 100644 3P/civetweb/resources/cert/client.key create mode 100644 3P/civetweb/resources/cert/client.key.orig create mode 100644 3P/civetweb/resources/cert/client.pem create mode 100644 3P/civetweb/resources/cert/make_certs create mode 100644 3P/civetweb/resources/cert/server.crt create mode 100644 3P/civetweb/resources/cert/server.csr create mode 100644 3P/civetweb/resources/cert/server.key create mode 100644 3P/civetweb/resources/cert/server.key.orig create mode 100644 3P/civetweb/resources/cert/server.pem create mode 100644 3P/civetweb/resources/civetweb.conf create mode 100644 3P/civetweb/resources/civetweb.icns create mode 100644 3P/civetweb/resources/civetweb.psd create mode 100644 3P/civetweb/resources/civetweb_16x16.png create mode 100644 3P/civetweb/resources/civetweb_16x16@2.png create mode 100644 3P/civetweb/resources/civetweb_22x22.png create mode 100644 3P/civetweb/resources/civetweb_22x22@2.png create mode 100644 3P/civetweb/resources/civetweb_32x32.png create mode 100644 3P/civetweb/resources/civetweb_32x32@2.png create mode 100644 3P/civetweb/resources/civetweb_64x64.png create mode 100644 3P/civetweb/resources/civetweb_64x64@2.png create mode 100644 3P/civetweb/resources/cleanup.lua create mode 100644 3P/civetweb/resources/coverity_check.sh create mode 100644 3P/civetweb/resources/itworks.html create mode 100644 3P/civetweb/resources/jni/Android.mk create mode 100644 3P/civetweb/resources/lua-logo.jpg create mode 100644 3P/civetweb/resources/luafilesystem-logo.jpg create mode 100644 3P/civetweb/resources/luasqlite-logo.jpg create mode 100644 3P/civetweb/resources/luaxml-logo.jpg create mode 100644 3P/civetweb/resources/res.rc create mode 100644 3P/civetweb/resources/sqlite3-logo.jpg create mode 100644 3P/civetweb/resources/ssl_cert.pem create mode 100644 3P/civetweb/resources/systray.ico create mode 100644 3P/civetweb/src/CMakeLists.txt create mode 100644 3P/civetweb/src/CivetServer.cpp create mode 100755 3P/civetweb/src/civetweb.c create mode 100644 3P/civetweb/src/civetweb_private_lua.h create mode 100644 3P/civetweb/src/main.c create mode 100644 3P/civetweb/src/md5.inl create mode 100644 3P/civetweb/src/mod_duktape.inl create mode 100644 3P/civetweb/src/mod_lua.inl create mode 100644 3P/civetweb/src/third_party/LuaXML.lua create mode 100644 3P/civetweb/src/third_party/LuaXML_lib.c create mode 100644 3P/civetweb/src/third_party/civetweb_lua.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/AUTHORS.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/LICENSE.txt create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/Makefile.cmdline create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/Makefile.codepage create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/Makefile.coffee create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/Makefile.dukdebug create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/Makefile.eval create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/Makefile.eventloop create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/Makefile.hello create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/Makefile.jxpretty create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/Makefile.sandbox create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/config/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/config/genconfig.py create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/config/genconfig_metadata.tar.gz create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/debugger/Makefile create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/debugger/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_classnames.yaml create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_debug.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_debugcommands.yaml create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_opcodes.yaml create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/debugger/package.json create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/debugger/static/index.html create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/debugger/static/style.css create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/debugger/static/webui.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/duk_build_meta.json create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-hybrid/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-hybrid/duk_alloc_hybrid.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-hybrid/duk_alloc_hybrid.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/duk_alloc_logging.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/duk_alloc_logging.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/log2gnuplot.py create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-torture/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-torture/duk_alloc_torture.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-torture/duk_alloc_torture.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/cmdline/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/cmdline/duk_cmdline.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/cmdline/duk_cmdline_ajduk.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/duk_codepage_conv.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/duk_codepage_conv.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/test.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/globals.coffee create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/hello.coffee create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/mandel.coffee create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/Makefile create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/duk_trans_dvalue.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/duk_trans_dvalue.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/test.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-socket/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-socket/duk_trans_socket.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-socket/duk_trans_socket.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/dummy-date-provider/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/dummy-date-provider/dummy_date_provider.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eval/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eval/eval.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/basic-test.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/c_eventloop.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/c_eventloop.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/client-socket-test.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/curses-timers.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/ecma_eventloop.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/fileio.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/main.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/ncurses.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/poll.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/server-socket-test.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/socket.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/fib.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/prime.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/primecheck.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/process.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/processlines.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/uppercase.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/hello/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/hello/hello.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/jxpretty/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/jxpretty/jxpretty.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/sandbox/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/examples/sandbox/sandbox.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/extras/README.rst create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/license.spdx create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/licenses/commonjs.txt create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/licenses/murmurhash2.txt create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/mandel.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/polyfills/console-minimal.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/polyfills/duktape-isfastint.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/polyfills/object-assign.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/polyfills/object-prototype-definegetter.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/polyfills/object-prototype-definesetter.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/polyfills/performance-now.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_alloc_default.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_buffer.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_bytecode.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_call.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_codec.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_compile.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_debug.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_heap.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_internal.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_logging.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_memory.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_object.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_stack.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_string.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_var.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_array.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_boolean.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_buffer.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_date.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_date_unix.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_date_windows.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_duktape.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_error.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_function.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_global.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_json.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_logger.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_math.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_number.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_object.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_pointer.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_protos.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_proxy.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_regexp.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_string.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_thread.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_thrower.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_builtins.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_builtins.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_config.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_debug.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_debug_fixedbuffer.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_debug_heap.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_debug_macros.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_debug_vsnprintf.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_debugger.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_debugger.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_error.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_error_augment.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_error_longjmp.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_error_macros.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_error_misc.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_error_throw.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_forwdecl.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hbuffer.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hbuffer_alloc.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hbuffer_ops.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hbufferobject.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hbufferobject_misc.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hcompiledfunction.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_heap.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_heap_alloc.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_heap_hashstring.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_heap_markandsweep.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_heap_memory.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_heap_misc.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_heap_refcount.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_heap_stringcache.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_heap_stringtable.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_heaphdr.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hnativefunction.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hobject.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hobject_alloc.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hobject_class.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hobject_enum.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hobject_finalizer.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hobject_misc.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hobject_pc2line.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hobject_props.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hstring.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hstring_misc.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hthread.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hthread_alloc.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hthread_builtins.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hthread_misc.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_hthread_stacks.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_initjs_min.js create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_internal.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_jmpbuf.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_js.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_js_bytecode.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_js_call.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_js_compiler.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_js_compiler.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_js_executor.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_js_ops.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_js_var.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_json.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_lexer.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_lexer.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_numconv.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_numconv.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_regexp.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_regexp_compiler.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_regexp_executor.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_replacements.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_replacements.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_selftest.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_selftest.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_strings.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_strings.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_tval.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_tval.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_unicode.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_unicode_support.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_unicode_tables.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_util.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_util_bitdecoder.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_util_bitencoder.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_util_bufwriter.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_util_hashbytes.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_util_hashprime.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_util_misc.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_util_tinyrandom.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duktape.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src/duk_config.h create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src/duktape.c create mode 100644 3P/civetweb/src/third_party/duktape-1.3.0/src/duktape.h create mode 100644 3P/civetweb/src/third_party/lfs.c create mode 100644 3P/civetweb/src/third_party/lfs.h create mode 100644 3P/civetweb/src/third_party/lsqlite3.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/COPYRIGHT create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/HISTORY create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/INSTALL create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/Makefile create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/README create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/doc/contents.html create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/doc/cover.png create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/doc/logo.gif create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/doc/lua.1 create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/doc/lua.css create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/doc/lua.html create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/doc/luac.1 create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/doc/luac.html create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/doc/manual.css create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/doc/manual.html create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/doc/readme.html create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/etc/Makefile create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/etc/README create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/etc/all.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/etc/lua.hpp create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/etc/lua.ico create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/etc/lua.pc create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/etc/luavs.bat create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/etc/min.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/etc/noparser.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/etc/strict.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/Makefile create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lapi.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lapi.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lauxlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lauxlib.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lbaselib.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lcode.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lcode.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/ldblib.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/ldebug.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/ldebug.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/ldo.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/ldo.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/ldump.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lfunc.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lfunc.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lgc.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lgc.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/linit.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/liolib.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/llex.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/llex.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/llimits.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lmathlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lmem.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lmem.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/loadlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lobject.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lobject.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lopcodes.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lopcodes.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/loslib.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lparser.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lparser.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lstate.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lstate.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lstring.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lstring.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lstrlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/ltable.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/ltable.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/ltablib.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/ltm.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/ltm.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lua.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lua.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/luac.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/luaconf.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lualib.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lundump.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lundump.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lvm.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lvm.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lzio.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/lzio.h create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/src/print.c create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/README create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/bisect.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/cf.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/echo.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/env.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/factorial.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/fib.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/fibfor.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/globals.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/hello.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/life.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/luac.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/printf.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/readonly.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/sieve.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/sort.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/table.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/trace-calls.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/trace-globals.lua create mode 100644 3P/civetweb/src/third_party/lua-5.1.5/test/xd.lua create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/Makefile create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/README create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/doc/contents.html create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/doc/logo.gif create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/doc/lua.1 create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/doc/lua.css create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/doc/luac.1 create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/doc/manual.css create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/doc/manual.html create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/doc/osi-certified-72x60.png create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/doc/readme.html create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/Makefile create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lapi.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lapi.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lauxlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lauxlib.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lbaselib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lbitlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lcode.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lcode.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lcorolib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lctype.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lctype.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/ldblib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/ldebug.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/ldebug.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/ldo.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/ldo.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/ldump.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lfunc.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lfunc.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lgc.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lgc.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/linit.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/liolib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/llex.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/llex.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/llimits.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lmathlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lmem.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lmem.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/loadlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lobject.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lobject.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lopcodes.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lopcodes.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/loslib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lparser.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lparser.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lstate.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lstate.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lstring.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lstring.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lstrlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/ltable.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/ltable.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/ltablib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/ltm.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/ltm.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lua.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lua.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lua.hpp create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/luac.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/luaconf.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lualib.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lundump.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lundump.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lvm.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lvm.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lzio.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.3/src/lzio.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/Makefile create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/README create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/doc/contents.html create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/doc/logo.gif create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/doc/lua.1 create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/doc/lua.css create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/doc/luac.1 create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/doc/manual.css create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/doc/manual.html create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/doc/osi-certified-72x60.png create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/doc/readme.html create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/Makefile create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lapi.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lapi.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lauxlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lauxlib.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lbaselib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lbitlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lcode.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lcode.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lcorolib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lctype.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lctype.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/ldblib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/ldebug.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/ldebug.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/ldo.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/ldo.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/ldump.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lfunc.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lfunc.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lgc.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lgc.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/linit.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/liolib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/llex.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/llex.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/llimits.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lmathlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lmem.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lmem.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/loadlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lobject.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lobject.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lopcodes.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lopcodes.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/loslib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lparser.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lparser.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lstate.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lstate.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lstring.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lstring.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lstrlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/ltable.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/ltable.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/ltablib.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/ltm.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/ltm.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lua.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lua.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lua.hpp create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/luac.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/luaconf.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lualib.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lundump.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lundump.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lvm.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lvm.h create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lzio.c create mode 100644 3P/civetweb/src/third_party/lua-5.2.4/src/lzio.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/Makefile create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/README create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/doc/contents.html create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/doc/index.css create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/doc/logo.gif create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/doc/lua.1 create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/doc/lua.css create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/doc/luac.1 create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/doc/manual.css create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/doc/manual.html create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/doc/osi-certified-72x60.png create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/doc/readme.html create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/Makefile create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lapi.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lapi.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lauxlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lauxlib.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lbaselib.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lbitlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lcode.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lcode.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lcorolib.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lctype.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lctype.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/ldblib.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/ldebug.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/ldebug.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/ldo.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/ldo.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/ldump.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lfunc.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lfunc.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lgc.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lgc.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/linit.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/liolib.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/llex.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/llex.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/llimits.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lmathlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lmem.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lmem.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/loadlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lobject.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lobject.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lopcodes.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lopcodes.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/loslib.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lparser.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lparser.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lprefix.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lstate.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lstate.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lstring.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lstring.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lstrlib.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/ltable.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/ltable.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/ltablib.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/ltm.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/ltm.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lua.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lua.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lua.hpp create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/luac.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/luaconf.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lualib.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lundump.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lundump.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lutf8lib.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lvm.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lvm.h create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lzio.c create mode 100644 3P/civetweb/src/third_party/lua-5.3.1/src/lzio.h create mode 100644 3P/civetweb/src/third_party/sqlite3.c create mode 100644 3P/civetweb/src/third_party/sqlite3.h create mode 100644 3P/civetweb/src/timer.inl create mode 100644 3P/civetweb/test/.leading.dot.txt create mode 100644 3P/civetweb/test/1000images.lua create mode 100644 3P/civetweb/test/100images.htm create mode 100644 3P/civetweb/test/CMakeLists.txt create mode 100644 3P/civetweb/test/HugeText.lua create mode 100644 3P/civetweb/test/MakefileTest.mk create mode 100644 3P/civetweb/test/MethodTest.xhtml create mode 100644 3P/civetweb/test/README.md create mode 100644 3P/civetweb/test/ajax/echo.cgi create mode 100644 3P/civetweb/test/ajax/echo.cgi.old create mode 100644 3P/civetweb/test/ajax/echo.lp create mode 100644 3P/civetweb/test/ajax/echo.lua create mode 100644 3P/civetweb/test/ajax/jquery.js create mode 100644 3P/civetweb/test/ajax/test.html create mode 100755 3P/civetweb/test/all_build_flags.pl create mode 100755 3P/civetweb/test/bad.cgi create mode 100755 3P/civetweb/test/bad2.cgi create mode 100644 3P/civetweb/test/civetweb_check.h create mode 100644 3P/civetweb/test/cors.html create mode 100644 3P/civetweb/test/cors.reply.html create mode 100644 3P/civetweb/test/cors.reply.lua create mode 100644 3P/civetweb/test/cors.reply.shtml create mode 100755 3P/civetweb/test/dir with spaces/hello.cgi create mode 100644 3P/civetweb/test/embed.c create mode 100755 3P/civetweb/test/env.cgi create mode 100644 3P/civetweb/test/error.lua create mode 100644 3P/civetweb/test/error404.htm create mode 100644 3P/civetweb/test/exit.lua create mode 100755 3P/civetweb/test/exploit.pl create mode 100644 3P/civetweb/test/form.html create mode 100644 3P/civetweb/test/handle_form.lua create mode 100755 3P/civetweb/test/hello.cgi create mode 100644 3P/civetweb/test/hello.txt create mode 100644 3P/civetweb/test/hello_gz.txt.gz create mode 100644 3P/civetweb/test/hello_gz_unzipped.txt create mode 100644 3P/civetweb/test/html_esc.lua create mode 100644 3P/civetweb/test/imagetest/00.png create mode 100644 3P/civetweb/test/imagetest/01.png create mode 100644 3P/civetweb/test/imagetest/02.png create mode 100644 3P/civetweb/test/imagetest/03.png create mode 100644 3P/civetweb/test/imagetest/04.png create mode 100644 3P/civetweb/test/imagetest/05.png create mode 100644 3P/civetweb/test/imagetest/06.png create mode 100644 3P/civetweb/test/imagetest/07.png create mode 100644 3P/civetweb/test/imagetest/08.png create mode 100644 3P/civetweb/test/imagetest/09.png create mode 100644 3P/civetweb/test/imagetest/10.png create mode 100644 3P/civetweb/test/imagetest/11.png create mode 100644 3P/civetweb/test/imagetest/12.png create mode 100644 3P/civetweb/test/imagetest/13.png create mode 100644 3P/civetweb/test/imagetest/14.png create mode 100644 3P/civetweb/test/imagetest/15.png create mode 100644 3P/civetweb/test/imagetest/16.png create mode 100644 3P/civetweb/test/imagetest/17.png create mode 100644 3P/civetweb/test/imagetest/18.png create mode 100644 3P/civetweb/test/imagetest/19.png create mode 100644 3P/civetweb/test/imagetest/20.png create mode 100644 3P/civetweb/test/imagetest/21.png create mode 100644 3P/civetweb/test/imagetest/22.png create mode 100644 3P/civetweb/test/imagetest/23.png create mode 100644 3P/civetweb/test/imagetest/24.png create mode 100644 3P/civetweb/test/imagetest/25.png create mode 100644 3P/civetweb/test/imagetest/26.png create mode 100644 3P/civetweb/test/imagetest/27.png create mode 100644 3P/civetweb/test/imagetest/28.png create mode 100644 3P/civetweb/test/imagetest/29.png create mode 100644 3P/civetweb/test/imagetest/30.png create mode 100644 3P/civetweb/test/imagetest/31.png create mode 100644 3P/civetweb/test/imagetest/32.png create mode 100644 3P/civetweb/test/imagetest/33.png create mode 100644 3P/civetweb/test/imagetest/34.png create mode 100644 3P/civetweb/test/imagetest/35.png create mode 100644 3P/civetweb/test/imagetest/36.png create mode 100644 3P/civetweb/test/imagetest/37.png create mode 100644 3P/civetweb/test/imagetest/38.png create mode 100644 3P/civetweb/test/imagetest/39.png create mode 100644 3P/civetweb/test/imagetest/40.png create mode 100644 3P/civetweb/test/imagetest/41.png create mode 100644 3P/civetweb/test/imagetest/42.png create mode 100644 3P/civetweb/test/imagetest/43.png create mode 100644 3P/civetweb/test/imagetest/44.png create mode 100644 3P/civetweb/test/imagetest/45.png create mode 100644 3P/civetweb/test/imagetest/46.png create mode 100644 3P/civetweb/test/imagetest/47.png create mode 100644 3P/civetweb/test/imagetest/48.png create mode 100644 3P/civetweb/test/imagetest/49.png create mode 100644 3P/civetweb/test/imagetest/50.png create mode 100644 3P/civetweb/test/imagetest/51.png create mode 100644 3P/civetweb/test/imagetest/52.png create mode 100644 3P/civetweb/test/imagetest/53.png create mode 100644 3P/civetweb/test/imagetest/54.png create mode 100644 3P/civetweb/test/imagetest/55.png create mode 100644 3P/civetweb/test/imagetest/56.png create mode 100644 3P/civetweb/test/imagetest/57.png create mode 100644 3P/civetweb/test/imagetest/58.png create mode 100644 3P/civetweb/test/imagetest/59.png create mode 100644 3P/civetweb/test/imagetest/60.png create mode 100644 3P/civetweb/test/imagetest/61.png create mode 100644 3P/civetweb/test/imagetest/62.png create mode 100644 3P/civetweb/test/imagetest/63.png create mode 100644 3P/civetweb/test/imagetest/64.png create mode 100644 3P/civetweb/test/imagetest/65.png create mode 100644 3P/civetweb/test/imagetest/66.png create mode 100644 3P/civetweb/test/imagetest/67.png create mode 100644 3P/civetweb/test/imagetest/68.png create mode 100644 3P/civetweb/test/imagetest/69.png create mode 100644 3P/civetweb/test/imagetest/70.png create mode 100644 3P/civetweb/test/imagetest/71.png create mode 100644 3P/civetweb/test/imagetest/72.png create mode 100644 3P/civetweb/test/imagetest/73.png create mode 100644 3P/civetweb/test/imagetest/74.png create mode 100644 3P/civetweb/test/imagetest/75.png create mode 100644 3P/civetweb/test/imagetest/76.png create mode 100644 3P/civetweb/test/imagetest/77.png create mode 100644 3P/civetweb/test/imagetest/78.png create mode 100644 3P/civetweb/test/imagetest/79.png create mode 100644 3P/civetweb/test/imagetest/80.png create mode 100644 3P/civetweb/test/imagetest/81.png create mode 100644 3P/civetweb/test/imagetest/82.png create mode 100644 3P/civetweb/test/imagetest/83.png create mode 100644 3P/civetweb/test/imagetest/84.png create mode 100644 3P/civetweb/test/imagetest/85.png create mode 100644 3P/civetweb/test/imagetest/86.png create mode 100644 3P/civetweb/test/imagetest/87.png create mode 100644 3P/civetweb/test/imagetest/88.png create mode 100644 3P/civetweb/test/imagetest/89.png create mode 100644 3P/civetweb/test/imagetest/90.png create mode 100644 3P/civetweb/test/imagetest/91.png create mode 100644 3P/civetweb/test/imagetest/92.png create mode 100644 3P/civetweb/test/imagetest/93.png create mode 100644 3P/civetweb/test/imagetest/94.png create mode 100644 3P/civetweb/test/imagetest/95.png create mode 100644 3P/civetweb/test/imagetest/96.png create mode 100644 3P/civetweb/test/imagetest/97.png create mode 100644 3P/civetweb/test/imagetest/98.png create mode 100644 3P/civetweb/test/imagetest/99.png create mode 100755 3P/civetweb/test/linux.cgi create mode 100644 3P/civetweb/test/linux_fail.cgi create mode 100644 3P/civetweb/test/linux_fail_silent.cgi create mode 100644 3P/civetweb/test/lua_preload_file.lua create mode 100644 3P/civetweb/test/main.c create mode 100644 3P/civetweb/test/page.lp create mode 100644 3P/civetweb/test/page.lua create mode 100644 3P/civetweb/test/page.ssjs create mode 100644 3P/civetweb/test/page2.lp create mode 100644 3P/civetweb/test/page2.lua create mode 100644 3P/civetweb/test/page2.ssjs create mode 100644 3P/civetweb/test/page3.lua create mode 100644 3P/civetweb/test/page3.ssjs create mode 100644 3P/civetweb/test/page4.lua create mode 100644 3P/civetweb/test/page_keep_alive.lua create mode 100644 3P/civetweb/test/page_keep_alive_chunked.lua create mode 100644 3P/civetweb/test/passfile create mode 100644 3P/civetweb/test/prime.ssjs create mode 100644 3P/civetweb/test/private.c create mode 100644 3P/civetweb/test/private.h create mode 100644 3P/civetweb/test/private_exe.c create mode 100644 3P/civetweb/test/private_exe.h create mode 100644 3P/civetweb/test/public_func.c create mode 100644 3P/civetweb/test/public_func.h create mode 100644 3P/civetweb/test/public_server.c create mode 100644 3P/civetweb/test/public_server.h create mode 100644 3P/civetweb/test/require_test.lua create mode 100644 3P/civetweb/test/resource_script_demo.lua create mode 100755 3P/civetweb/test/sh.cgi create mode 100644 3P/civetweb/test/shared.c create mode 100644 3P/civetweb/test/shared.h create mode 100644 3P/civetweb/test/ssi1.shtml create mode 100644 3P/civetweb/test/ssi2.shtml create mode 100644 3P/civetweb/test/ssi3.shtml create mode 100644 3P/civetweb/test/ssi4.shtml create mode 100644 3P/civetweb/test/ssi5.shtml create mode 100644 3P/civetweb/test/ssi6.shtml create mode 100644 3P/civetweb/test/ssi7.shtml create mode 100644 3P/civetweb/test/ssi8.shtml create mode 100644 3P/civetweb/test/ssi9.shtml create mode 100644 3P/civetweb/test/syntax_error.ssjs create mode 100644 3P/civetweb/test/test.ico create mode 100755 3P/civetweb/test/test.pl create mode 100644 3P/civetweb/test/testclient.c create mode 100755 3P/civetweb/test/timeout.cgi create mode 100644 3P/civetweb/test/unit_test.c create mode 100644 3P/civetweb/test/websocket.lua create mode 100644 3P/civetweb/test/websocket.xhtml create mode 100644 3P/civetweb/test/windows.cgi create mode 100644 3P/civetweb/test/windows.cgi.cmd create mode 100644 3P/civetweb/test/windows_fail.cgi create mode 100644 3P/civetweb/test/windows_fail.cgi.cmd create mode 100644 3P/civetweb/test/windows_fail_silent.cgi create mode 100644 3P/civetweb/test/windows_fail_silent.cgi.cmd create mode 100644 3P/civetweb/test/x.php create mode 100644 3P/civetweb/testutils/Browser/Browser.cpp create mode 100644 3P/civetweb/testutils/Browser/Browser.vcxproj create mode 100644 3P/civetweb/testutils/readme.txt create mode 100644 3P/civetweb/testutils/testclient/testclient.c create mode 100644 3P/civetweb/testutils/testclient/testclient.vcxproj create mode 100644 3P/civetweb/testutils/testclient_chunked_linux/testclient.c create mode 100644 3P/civetweb/testutils/testclient_chunked_linux/testclient2.vcxproj create mode 100644 3P/jsoncpp/.clang-format create mode 100644 3P/jsoncpp/.gitignore create mode 100644 3P/jsoncpp/.travis.yml create mode 100644 3P/jsoncpp/AUTHORS create mode 100644 3P/jsoncpp/CMakeLists.txt create mode 100644 3P/jsoncpp/LICENSE create mode 100644 3P/jsoncpp/NEWS.txt create mode 100644 3P/jsoncpp/README.md create mode 100644 3P/jsoncpp/SConstruct create mode 100644 3P/jsoncpp/amalgamate.py create mode 100644 3P/jsoncpp/builders/cmake/CMakeLists.txt create mode 100644 3P/jsoncpp/dev.makefile create mode 100644 3P/jsoncpp/devtools/__init__.py create mode 100644 3P/jsoncpp/devtools/agent_vmw7.json create mode 100644 3P/jsoncpp/devtools/agent_vmxp.json create mode 100644 3P/jsoncpp/devtools/antglob.py create mode 100644 3P/jsoncpp/devtools/batchbuild.py create mode 100644 3P/jsoncpp/devtools/fixeol.py create mode 100644 3P/jsoncpp/devtools/licenseupdater.py create mode 100644 3P/jsoncpp/devtools/tarball.py create mode 100644 3P/jsoncpp/doc/doxyfile.in create mode 100644 3P/jsoncpp/doc/footer.html create mode 100644 3P/jsoncpp/doc/header.html create mode 100644 3P/jsoncpp/doc/jsoncpp.dox create mode 100644 3P/jsoncpp/doc/readme.txt create mode 100644 3P/jsoncpp/doc/roadmap.dox create mode 100644 3P/jsoncpp/doc/web_doxyfile.in create mode 100644 3P/jsoncpp/doxybuild.py create mode 100644 3P/jsoncpp/include/CMakeLists.txt create mode 100644 3P/jsoncpp/include/jsoncpp/assertions.h create mode 100644 3P/jsoncpp/include/jsoncpp/autolink.h create mode 100644 3P/jsoncpp/include/jsoncpp/config.h create mode 100644 3P/jsoncpp/include/jsoncpp/features.h create mode 100644 3P/jsoncpp/include/jsoncpp/forwards.h create mode 100644 3P/jsoncpp/include/jsoncpp/json.h create mode 100644 3P/jsoncpp/include/jsoncpp/reader.h create mode 100644 3P/jsoncpp/include/jsoncpp/value.h create mode 100644 3P/jsoncpp/include/jsoncpp/version.h create mode 100644 3P/jsoncpp/include/jsoncpp/writer.h create mode 100644 3P/jsoncpp/makefiles/vs71/jsontest.vcproj create mode 100644 3P/jsoncpp/makefiles/vs71/lib_json.vcproj create mode 100644 3P/jsoncpp/makefiles/vs71/test_lib_json.vcproj create mode 100644 3P/jsoncpp/makerelease.py create mode 100644 3P/jsoncpp/pkg-config/jsoncpp.pc.in create mode 100644 3P/jsoncpp/scons-tools/globtool.py create mode 100644 3P/jsoncpp/scons-tools/srcdist.py create mode 100644 3P/jsoncpp/scons-tools/substinfile.py create mode 100644 3P/jsoncpp/scons-tools/targz.py create mode 100644 3P/jsoncpp/src/CMakeLists.txt create mode 100644 3P/jsoncpp/src/jsontestrunner/CMakeLists.txt create mode 100644 3P/jsoncpp/src/jsontestrunner/main.cpp create mode 100644 3P/jsoncpp/src/jsontestrunner/sconscript create mode 100644 3P/jsoncpp/src/lib_json/CMakeLists.txt create mode 100644 3P/jsoncpp/src/lib_json/json_reader.cpp create mode 100644 3P/jsoncpp/src/lib_json/json_tool.h create mode 100644 3P/jsoncpp/src/lib_json/json_value.cpp create mode 100644 3P/jsoncpp/src/lib_json/json_valueiterator.inl create mode 100644 3P/jsoncpp/src/lib_json/json_writer.cpp create mode 100644 3P/jsoncpp/src/lib_json/sconscript create mode 100644 3P/jsoncpp/src/lib_json/version.h.in create mode 100644 3P/jsoncpp/src/test_lib_json/CMakeLists.txt create mode 100644 3P/jsoncpp/src/test_lib_json/jsontest.cpp create mode 100644 3P/jsoncpp/src/test_lib_json/jsontest.h create mode 100644 3P/jsoncpp/src/test_lib_json/main.cpp create mode 100644 3P/jsoncpp/src/test_lib_json/sconscript create mode 100644 3P/jsoncpp/test/cleantests.py create mode 100644 3P/jsoncpp/test/data/fail_test_array_01.json create mode 100644 3P/jsoncpp/test/data/test_array_01.expected create mode 100644 3P/jsoncpp/test/data/test_array_01.json create mode 100644 3P/jsoncpp/test/data/test_array_02.expected create mode 100644 3P/jsoncpp/test/data/test_array_02.json create mode 100644 3P/jsoncpp/test/data/test_array_03.expected create mode 100644 3P/jsoncpp/test/data/test_array_03.json create mode 100644 3P/jsoncpp/test/data/test_array_04.expected create mode 100644 3P/jsoncpp/test/data/test_array_04.json create mode 100644 3P/jsoncpp/test/data/test_array_05.expected create mode 100644 3P/jsoncpp/test/data/test_array_05.json create mode 100644 3P/jsoncpp/test/data/test_array_06.expected create mode 100644 3P/jsoncpp/test/data/test_array_06.json create mode 100644 3P/jsoncpp/test/data/test_array_07.expected create mode 100644 3P/jsoncpp/test/data/test_array_07.json create mode 100644 3P/jsoncpp/test/data/test_basic_01.expected create mode 100644 3P/jsoncpp/test/data/test_basic_01.json create mode 100644 3P/jsoncpp/test/data/test_basic_02.expected create mode 100644 3P/jsoncpp/test/data/test_basic_02.json create mode 100644 3P/jsoncpp/test/data/test_basic_03.expected create mode 100644 3P/jsoncpp/test/data/test_basic_03.json create mode 100644 3P/jsoncpp/test/data/test_basic_04.expected create mode 100644 3P/jsoncpp/test/data/test_basic_04.json create mode 100644 3P/jsoncpp/test/data/test_basic_05.expected create mode 100644 3P/jsoncpp/test/data/test_basic_05.json create mode 100644 3P/jsoncpp/test/data/test_basic_06.expected create mode 100644 3P/jsoncpp/test/data/test_basic_06.json create mode 100644 3P/jsoncpp/test/data/test_basic_07.expected create mode 100644 3P/jsoncpp/test/data/test_basic_07.json create mode 100644 3P/jsoncpp/test/data/test_basic_08.expected create mode 100644 3P/jsoncpp/test/data/test_basic_08.json create mode 100644 3P/jsoncpp/test/data/test_basic_09.expected create mode 100644 3P/jsoncpp/test/data/test_basic_09.json create mode 100644 3P/jsoncpp/test/data/test_comment_00.expected create mode 100644 3P/jsoncpp/test/data/test_comment_00.json create mode 100644 3P/jsoncpp/test/data/test_comment_01.expected create mode 100644 3P/jsoncpp/test/data/test_comment_01.json create mode 100644 3P/jsoncpp/test/data/test_comment_02.expected create mode 100644 3P/jsoncpp/test/data/test_comment_02.json create mode 100644 3P/jsoncpp/test/data/test_complex_01.expected create mode 100644 3P/jsoncpp/test/data/test_complex_01.json create mode 100644 3P/jsoncpp/test/data/test_integer_01.expected create mode 100644 3P/jsoncpp/test/data/test_integer_01.json create mode 100644 3P/jsoncpp/test/data/test_integer_02.expected create mode 100644 3P/jsoncpp/test/data/test_integer_02.json create mode 100644 3P/jsoncpp/test/data/test_integer_03.expected create mode 100644 3P/jsoncpp/test/data/test_integer_03.json create mode 100644 3P/jsoncpp/test/data/test_integer_04.expected create mode 100644 3P/jsoncpp/test/data/test_integer_04.json create mode 100644 3P/jsoncpp/test/data/test_integer_05.expected create mode 100644 3P/jsoncpp/test/data/test_integer_05.json create mode 100644 3P/jsoncpp/test/data/test_integer_06_64bits.expected create mode 100644 3P/jsoncpp/test/data/test_integer_06_64bits.json create mode 100644 3P/jsoncpp/test/data/test_integer_07_64bits.expected create mode 100644 3P/jsoncpp/test/data/test_integer_07_64bits.json create mode 100644 3P/jsoncpp/test/data/test_integer_08_64bits.expected create mode 100644 3P/jsoncpp/test/data/test_integer_08_64bits.json create mode 100644 3P/jsoncpp/test/data/test_large_01.expected create mode 100644 3P/jsoncpp/test/data/test_large_01.json create mode 100644 3P/jsoncpp/test/data/test_object_01.expected create mode 100644 3P/jsoncpp/test/data/test_object_01.json create mode 100644 3P/jsoncpp/test/data/test_object_02.expected create mode 100644 3P/jsoncpp/test/data/test_object_02.json create mode 100644 3P/jsoncpp/test/data/test_object_03.expected create mode 100644 3P/jsoncpp/test/data/test_object_03.json create mode 100644 3P/jsoncpp/test/data/test_object_04.expected create mode 100644 3P/jsoncpp/test/data/test_object_04.json create mode 100644 3P/jsoncpp/test/data/test_preserve_comment_01.expected create mode 100644 3P/jsoncpp/test/data/test_preserve_comment_01.json create mode 100644 3P/jsoncpp/test/data/test_real_01.expected create mode 100644 3P/jsoncpp/test/data/test_real_01.json create mode 100644 3P/jsoncpp/test/data/test_real_02.expected create mode 100644 3P/jsoncpp/test/data/test_real_02.json create mode 100644 3P/jsoncpp/test/data/test_real_03.expected create mode 100644 3P/jsoncpp/test/data/test_real_03.json create mode 100644 3P/jsoncpp/test/data/test_real_04.expected create mode 100644 3P/jsoncpp/test/data/test_real_04.json create mode 100644 3P/jsoncpp/test/data/test_real_05.expected create mode 100644 3P/jsoncpp/test/data/test_real_05.json create mode 100644 3P/jsoncpp/test/data/test_real_06.expected create mode 100644 3P/jsoncpp/test/data/test_real_06.json create mode 100644 3P/jsoncpp/test/data/test_real_07.expected create mode 100644 3P/jsoncpp/test/data/test_real_07.json create mode 100644 3P/jsoncpp/test/data/test_real_08.expected create mode 100644 3P/jsoncpp/test/data/test_real_08.json create mode 100644 3P/jsoncpp/test/data/test_real_09.expected create mode 100644 3P/jsoncpp/test/data/test_real_09.json create mode 100644 3P/jsoncpp/test/data/test_real_10.expected create mode 100644 3P/jsoncpp/test/data/test_real_10.json create mode 100644 3P/jsoncpp/test/data/test_real_11.expected create mode 100644 3P/jsoncpp/test/data/test_real_11.json create mode 100644 3P/jsoncpp/test/data/test_real_12.expected create mode 100644 3P/jsoncpp/test/data/test_real_12.json create mode 100644 3P/jsoncpp/test/data/test_string_01.expected create mode 100644 3P/jsoncpp/test/data/test_string_01.json create mode 100644 3P/jsoncpp/test/data/test_string_02.expected create mode 100644 3P/jsoncpp/test/data/test_string_02.json create mode 100644 3P/jsoncpp/test/data/test_string_03.expected create mode 100644 3P/jsoncpp/test/data/test_string_03.json create mode 100644 3P/jsoncpp/test/data/test_string_04.expected create mode 100644 3P/jsoncpp/test/data/test_string_04.json create mode 100644 3P/jsoncpp/test/data/test_string_05.expected create mode 100644 3P/jsoncpp/test/data/test_string_05.json create mode 100644 3P/jsoncpp/test/data/test_string_unicode_01.expected create mode 100644 3P/jsoncpp/test/data/test_string_unicode_01.json create mode 100644 3P/jsoncpp/test/data/test_string_unicode_02.expected create mode 100644 3P/jsoncpp/test/data/test_string_unicode_02.json create mode 100644 3P/jsoncpp/test/data/test_string_unicode_03.expected create mode 100644 3P/jsoncpp/test/data/test_string_unicode_03.json create mode 100644 3P/jsoncpp/test/data/test_string_unicode_04.expected create mode 100644 3P/jsoncpp/test/data/test_string_unicode_04.json create mode 100644 3P/jsoncpp/test/data/test_string_unicode_05.expected create mode 100644 3P/jsoncpp/test/data/test_string_unicode_05.json create mode 100644 3P/jsoncpp/test/generate_expected.py create mode 100644 3P/jsoncpp/test/jsonchecker/fail1.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail10.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail11.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail12.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail13.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail14.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail15.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail16.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail17.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail18.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail19.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail2.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail20.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail21.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail22.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail23.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail24.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail25.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail26.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail27.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail28.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail29.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail3.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail30.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail31.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail32.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail33.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail4.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail5.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail6.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail7.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail8.json create mode 100644 3P/jsoncpp/test/jsonchecker/fail9.json create mode 100644 3P/jsoncpp/test/jsonchecker/pass1.json create mode 100644 3P/jsoncpp/test/jsonchecker/pass2.json create mode 100644 3P/jsoncpp/test/jsonchecker/pass3.json create mode 100644 3P/jsoncpp/test/jsonchecker/readme.txt create mode 100644 3P/jsoncpp/test/pyjsontestrunner.py create mode 100644 3P/jsoncpp/test/runjsontests.py create mode 100644 3P/jsoncpp/test/rununittests.py create mode 100644 3P/jsoncpp/version create mode 100644 3P/jsoncpp/version.in diff --git a/3P/civetweb/.gitattributes b/3P/civetweb/.gitattributes new file mode 100644 index 00000000..5cf500d7 --- /dev/null +++ b/3P/civetweb/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* -text + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/3P/civetweb/.gitignore b/3P/civetweb/.gitignore new file mode 100644 index 00000000..3f4b814d --- /dev/null +++ b/3P/civetweb/.gitignore @@ -0,0 +1,239 @@ + +civetweb +libcivetweb.a +libcivetweb.so +*-cache +out +*.dmg +*.msi +*.exe +*.zip +Output + +*.o + +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +[Bb]in/ +[Oo]bj/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml +*.pubxml + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +#packages/ + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + +############# +## Windows detritus +############# + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac crap +.DS_Store + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist/ +eggs/ +parts/ +var/ +sdist/ +develop-eggs/ +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg + + +########################## +## Files created by tests +########################## +requests.db + +########################## +## Files created by ctags +########################## +tags + diff --git a/3P/civetweb/.travis.yml b/3P/civetweb/.travis.yml new file mode 100644 index 00000000..37ef9a52 --- /dev/null +++ b/3P/civetweb/.travis.yml @@ -0,0 +1,5 @@ +language: c +compiler: + - gcc + - clang +script: make WITH_LUA=1 WITH_DEBUG=1 WITH_IPV6=1 WITH_WEBSOCKET=1 diff --git a/3P/civetweb/CMakeLists.txt b/3P/civetweb/CMakeLists.txt new file mode 100644 index 00000000..d728ac14 --- /dev/null +++ b/3P/civetweb/CMakeLists.txt @@ -0,0 +1,450 @@ +# Determines what CMake APIs we can rely on +cmake_minimum_required (VERSION 2.8.11) +if (${CMAKE_VERSION} VERSION_GREATER 3.2.2) + cmake_policy(VERSION 3.2.2) +endif() +if (${CMAKE_VERSION} VERSION_GREATER 3.1 OR + ${CMAKE_VERSION} VERSION_EQUAL 3.1) + cmake_policy(SET CMP0054 NEW) +endif() + +# Do not allow in source builds +set(CMAKE_DISABLE_SOURCE_CHANGES ON) +set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) + +# Make sure we can import out CMake functions +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +# Load in the needed CMake modules +include(CheckIncludeFiles) +include(CheckCCompilerFlag) +include(CheckCXXCompilerFlag) +include(AddCCompilerFlag) +include(AddCXXCompilerFlag) +include(DetermineTargetArchitecture) +include(CMakeDependentOption) + +# Set up the project +project (civetweb) +set(CIVETWEB_VERSION "1.7.0" CACHE STRING "The version of the civetweb library") +string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" CIVETWEB_VERSION_MATCH "${CIVETWEB_VERSION}") +if ("${CIVETWEB_VERSION_MATCH}" STREQUAL "") + message(FATAL_ERROR "Must specify a semantic version: major.minor.patch") +endif() +set(CIVETWEB_VERSION_MAJOR "${CMAKE_MATCH_1}") +set(CIVETWEB_VERSION_MINOR "${CMAKE_MATCH_2}") +set(CIVETWEB_VERSION_PATCH "${CMAKE_MATCH_3}") +determine_target_architecture(CIVETWEB_ARCHITECTURE) + +# Detect the platform reliably +if(NOT MACOSX AND ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + SET(DARWIN YES) +elseif(NOT BSD AND ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + SET(FREEBSD YES) +elseif(NOT LINUX AND ${CMAKE_SYSTEM_NAME} MATCHES "Linux") + SET(LINUX YES) +endif() + +# C++ wrappers +option(CIVETWEB_ENABLE_THIRD_PARTY_OUTPUT "Shows the output of third party dependency processing" OFF) + +# Max Request Size +set(CIVETWEB_MAX_REQUEST_SIZE 16384 CACHE STRING + "The largest amount of content bytes allowed in a request") +set_property(CACHE CIVETWEB_MAX_REQUEST_SIZE PROPERTY VALUE ${CIVETWEB_MAX_REQUEST_SIZE}) +message(STATUS "Max Request Size - ${CIVETWEB_MAX_REQUEST_SIZE}") + +# Thread Stack Size +set(CIVETWEB_THREAD_STACK_SIZE 102400 CACHE STRING + "The stack size in bytes for each thread created") +set_property(CACHE CIVETWEB_THREAD_STACK_SIZE PROPERTY VALUE ${CIVETWEB_THREAD_STACK_SIZE}) +message(STATUS "Thread Stack Size - ${CIVETWEB_THREAD_STACK_SIZE}") + +# Serve no files from the web server +option(CIVETWEB_SERVE_NO_FILES "Configures the server to serve no static files" OFF) +message(STATUS "Serve no static files - ${CIVETWEB_SERVE_NO_FILES}") + +# Serve no files from the web server +option(CIVETWEB_DISABLE_CGI "Disables CGI, so theserver will not execute CGI scripts" OFF) +message(STATUS "Disable CGI support - ${CIVETWEB_DISABLE_CGI}") + +# C++ wrappers +option(CIVETWEB_ENABLE_CXX "Enables the C++ wrapper library" OFF) +message(STATUS "C++ wrappers - ${CIVETWEB_ENABLE_CXX}") + +# IP Version 6 +option(CIVETWEB_ENABLE_IPV6 "Enables the IP version 6 support" OFF) +message(STATUS "IP Version 6 - ${CIVETWEB_ENABLE_IPV6}") + +# Websocket support +option(CIVETWEB_ENABLE_WEBSOCKETS "Enable websockets connections" OFF) +message(STATUS "Websockets support - ${CIVETWEB_ENABLE_WEBSOCKETS}") + +# Memory debugging +option(CIVETWEB_ENABLE_MEMORY_DEBUGGING "Enable the memory debugging features" OFF) +message(STATUS "Memory Debugging - ${CIVETWEB_ENABLE_MEMORY_DEBUGGING}") + +# LUA CGI support +option(CIVETWEB_ENABLE_LUA "Enable Lua CGIs" OFF) +message(STATUS "Lua CGI support - ${CIVETWEB_ENABLE_LUA}") + +# Allow builds to complete with warnings (do not set -Werror) +option(CIVETWEB_ALLOW_WARNINGS "Do not stop build if there are warnings" OFF) +message(STATUS "Build if there are warnings - ${CIVETWEB_ALLOW_WARNINGS}") + + +# Link to the shared LUA library +cmake_dependent_option( + CIVETWEB_ENABLE_LUA_SHARED "Link to the shared LUA system library" OFF + CIVETWEB_ENABLE_LUA OFF) +if (CIVETWEB_ENABLE_LUA) + message(STATUS "Linking shared Lua library - ${CIVETWEB_ENABLE_LUA_SHARED}") +endif() + +# Lua Third Party Settings +if (CIVETWEB_ENABLE_LUA) + if (NOT CIVETWEB_ENABLE_LUA_SHARED) + # Lua Version + set(CIVETWEB_LUA_VERSION 5.2.4 CACHE STRING + "The version of Lua to build and include statically") + set_property(CACHE CIVETWEB_LUA_VERSION PROPERTY VALUE ${CIVETWEB_LUA_VERSION}) + message(STATUS "Lua Version - ${CIVETWEB_LUA_VERSION}") + mark_as_advanced(CIVETWEB_LUA_VERSION) + + # Lua Verification Hash + set(CIVETWEB_LUA_MD5_HASH 913fdb32207046b273fdb17aad70be13 CACHE STRING + "The hash of Lua archive to be downloaded") + set_property(CACHE CIVETWEB_LUA_MD5_HASH PROPERTY VALUE ${CIVETWEB_LUA_MD5_HASH}) + mark_as_advanced(CIVETWEB_LUA_MD5_HASH) + endif() + + # Lua Filesystem Version + set(CIVETWEB_LUA_FILESYSTEM_VERSION 1.6.3 CACHE STRING + "The version of Lua Filesystem to build and include statically") + set_property(CACHE CIVETWEB_LUA_FILESYSTEM_VERSION PROPERTY VALUE ${CIVETWEB_LUA_FILESYSTEM_VERSION}) + message(STATUS "Lua Filesystem Version - ${CIVETWEB_LUA_FILESYSTEM_VERSION}") + mark_as_advanced(CIVETWEB_LUA_FILESYSTEM_VERSION) + + # Lua Filesystem Verification Hash + set(CIVETWEB_LUA_FILESYSTEM_MD5_HASH d0552c7e5a082f5bb2865af63fb9dc95 CACHE STRING + "The hash of Lua Filesystem archive to be downloaded") + set_property(CACHE CIVETWEB_LUA_FILESYSTEM_MD5_HASH PROPERTY VALUE ${CIVETWEB_LUA_FILESYSTEM_MD5_HASH}) + mark_as_advanced(CIVETWEB_LUA_FILESYSTEM_MD5_HASH) + + # Lua SQLite Version + set(CIVETWEB_LUA_SQLITE_VERSION 0.9.3 CACHE STRING + "The version of Lua SQLite to build and include statically") + set_property(CACHE CIVETWEB_LUA_SQLITE_VERSION PROPERTY VALUE ${CIVETWEB_LUA_SQLITE_VERSION}) + message(STATUS "Lua SQLite Version - ${CIVETWEB_LUA_SQLITE_VERSION}") + mark_as_advanced(CIVETWEB_LUA_SQLITE_VERSION) + + # Lua SQLite Verification Hash + set(CIVETWEB_LUA_SQLITE_MD5_HASH 43234ae08197dfce6da02482ed14ec92 CACHE STRING + "The hash of Lua SQLite archive to be downloaded") + set_property(CACHE CIVETWEB_LUA_SQLITE_MD5_HASH PROPERTY VALUE ${CIVETWEB_LUA_SQLITE_MD5_HASH}) + mark_as_advanced(CIVETWEB_LUA_SQLITE_MD5_HASH) + + # Lua XML Version + set(CIVETWEB_LUA_XML_VERSION 1.8.0 CACHE STRING + "The version of Lua XML to build and include statically") + set_property(CACHE CIVETWEB_LUA_XML_VERSION PROPERTY VALUE ${CIVETWEB_LUA_XML_VERSION}) + message(STATUS "Lua XML Version - ${CIVETWEB_LUA_XML_VERSION}") + mark_as_advanced(CIVETWEB_LUA_XML_VERSION) + + # Lua XML Verification Hash + set(CIVETWEB_LUA_XML_MD5_HASH 25e4c276c5d8716af1de0c7853aec2b4 CACHE STRING + "The hash of Lua XML archive to be downloaded") + set_property(CACHE CIVETWEB_LUA_XML_MD5_HASH PROPERTY VALUE ${CIVETWEB_LUA_XML_MD5_HASH}) + mark_as_advanced(CIVETWEB_LUA_XML_MD5_HASH) + + # SQLite Version + set(CIVETWEB_SQLITE_VERSION 3.8.9 CACHE STRING + "The version of SQLite to build and include statically") + set_property(CACHE CIVETWEB_SQLITE_VERSION PROPERTY VALUE ${CIVETWEB_SQLITE_VERSION}) + message(STATUS "SQLite Version - ${CIVETWEB_SQLITE_VERSION}") + mark_as_advanced(CIVETWEB_SQLITE_VERSION) + + # SQLite Verification Hash + set(CIVETWEB_SQLITE_MD5_HASH 02e9c3a6daa8b8587cf6bef828c2e33f CACHE STRING + "The hash of SQLite archive to be downloaded") + set_property(CACHE CIVETWEB_SQLITE_MD5_HASH PROPERTY VALUE ${CIVETWEB_SQLITE_MD5_HASH}) + mark_as_advanced(CIVETWEB_SQLITE_MD5_HASH) +endif() + +# Duktape CGI support +option(CIVETWEB_ENABLE_DUKTAPE "Enable Duktape CGIs" OFF) +message(STATUS "Duktape CGI support - ${CIVETWEB_ENABLE_DUKTAPE}") + +# SSL support +option(CIVETWEB_ENABLE_SSL "Enables the secure socket layer" ON) +message(STATUS "SSL support - ${CIVETWEB_ENABLE_SSL}") + +# Dynamically load or link the SSL libraries +cmake_dependent_option( + CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING "Dynamically loads the SSL library rather than linking it" ON + CIVETWEB_ENABLE_SSL OFF) +if (CIVETWEB_ENABLE_SSL) + message(STATUS "Dynamically load SSL libraries - ${CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING}") +endif() + +# Third Party Download location +set(CIVETWEB_THIRD_PARTY_DIR "${CMAKE_BINARY_DIR}/third_party" CACHE STRING + "The location that third party code is downloaded, built and installed") +set_property(CACHE CIVETWEB_THIRD_PARTY_DIR PROPERTY VALUE ${CIVETWEB_THIRD_PARTY_DIR}) + +# Unix systems can define the dynamic library names to load +if (CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING AND NOT DARWIN AND UNIX) + # SSL library name + set(CIVETWEB_SSL_SSL_LIB "libssl.so" CACHE STRING + "The name of the SSL library to load") + set_property(CACHE CIVETWEB_SSL_SSL_LIB PROPERTY VALUE ${CIVETWEB_SSL_SSL_LIB}) + message(STATUS "SSL Library Name - ${CIVETWEB_SSL_SSL_LIB}") + + # Crytography library name + set(CIVETWEB_SSL_CRYPTO_LIB "libcrypto.so" CACHE STRING + "The name of the SSL Cryptography library to load") + set_property(CACHE CIVETWEB_SSL_CRYPTO_LIB PROPERTY VALUE ${CIVETWEB_SSL_CRYPTO_LIB}) + message(STATUS "SSL Cryptography Library Name - ${CIVETWEB_SSL_CRYPTO_LIB}") +endif() + +# Allow warnings in 3rd party components +if (CIVETWEB_ENABLE_LUA OR CIVETWEB_ENABLE_DUKTAPE) +SET(CIVETWEB_ALLOW_WARNINGS YES) +endif() + +# The C and C++ standards to use +set(CIVETWEB_C_STANDARD auto CACHE STRING + "The C standard to use; auto determines the latest supported by the compiler") +set_property(CACHE CIVETWEB_C_STANDARD PROPERTY STRINGS auto c11 c99 c89) +set(CIVETWEB_CXX_STANDARD auto CACHE STRING + "The C++ standard to use; auto determines the latest supported by the compiler") +set_property(CACHE CIVETWEB_CXX_STANDARD PROPERTY STRINGS auto c++14 c++11 c++98) + +# Configure the linker +if ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") + find_program(GCC_AR gcc-ar) + if (GCC_AR) + set(CMAKE_AR ${GCC_AR}) + endif() + find_program(GCC_RANLIB gcc-ranlib) + if (GCC_RANLIB) + set(CMAKE_RANLIB ${GCC_RANLIB}) + endif() +endif() + +# Configure the C compiler +message(STATUS "Configuring C Compiler") +if ("${CIVETWEB_C_STANDARD}" STREQUAL "auto") + add_c_compiler_flag(-std=c11) + if (NOT HAVE_C_FLAG_STD_C11) + add_c_compiler_flag(-std=c99) + if (NOT HAVE_C_FLAG_STD_C99) + add_c_compiler_flag(-std=c89) + endif() + endif() +else() + add_c_compiler_flag(-std=${CIVETWEB_C_STANDARD}) +endif() +add_c_compiler_flag(-Wall) +add_c_compiler_flag(-Wextra) +add_c_compiler_flag(-Wshadow) +add_c_compiler_flag(-Wsign-conversion) +add_c_compiler_flag(-Wmissing-prototypes) +add_c_compiler_flag(-Weverything) +add_c_compiler_flag(/W4) +add_c_compiler_flag(-Wno-padded) +add_c_compiler_flag(/Wd4820) # padding +add_c_compiler_flag(-Wno-unused-macros) +add_c_compiler_flag(-Wno-format-nonliteral) +if (MINGW) + add_c_compiler_flag(-Wno-format) +endif() +if (NOT CIVETWEB_ALLOW_WARNINGS) + add_c_compiler_flag(-Werror) +endif() +add_c_compiler_flag(/WX) +add_c_compiler_flag(-pedantic-errors) +add_c_compiler_flag(-fvisibility=hidden) +add_c_compiler_flag(-fstack-protector-strong RELEASE) +add_c_compiler_flag(-flto RELEASE) +add_c_compiler_flag(-fsanitize=undefined DEBUG) +add_c_compiler_flag(-fsanitize=address DEBUG) +if (HAVE_C_FLAG_FSANITIZE_ADDRESS) + add_c_compiler_flag(-static-asan DEBUG) +endif() +add_c_compiler_flag(-fstack-protector-all DEBUG) +add_c_compiler_flag(-mwindows) + +# Coverage build type +set(CMAKE_C_FLAGS_COVERAGE "${CMAKE_C_FLAGS_DEBUG}" CACHE STRING + "Flags used by the C compiler during coverage builds." + FORCE) +set(CMAKE_EXE_LINKER_FLAGS_COVERAGE + "${CMAKE_EXE_LINKER_FLAGS_DEBUG}" CACHE STRING + "Flags used for linking binaries during coverage builds." + FORCE) +set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE + "${CMAKE_SHARED_LINKER_FLAGS_DEBUG}" CACHE STRING + "Flags used by the shared libraries linker during coverage builds." + FORCE) +mark_as_advanced( + CMAKE_CXX_FLAGS_COVERAGE + CMAKE_C_FLAGS_COVERAGE + CMAKE_EXE_LINKER_FLAGS_COVERAGE + CMAKE_SHARED_LINKER_FLAGS_COVERAGE) +set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING + "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage." + FORCE) +add_c_compiler_flag(--coverage COVERAGE) + +# Configure the C++ compiler +if (CIVETWEB_ENABLE_CXX) + message(STATUS "Configuring C++ Compiler") + if ("${CIVETWEB_CXX_STANDARD}" STREQUAL "auto") + add_cxx_compiler_flag(-std=c++14) + if (NOT HAVE_CXX_FLAG_STD_CXX14) + add_cxx_compiler_flag(-std=c++11) + if (NOT HAVE_CXX_FLAG_STD_CXX11) + add_cxx_compiler_flag(-std=c++98) + endif() + endif() + else() + add_cxx_compiler_flag(-std=${CIVETWEB_CXX_STANDARD}) + endif() + add_cxx_compiler_flag(-Wall) + add_cxx_compiler_flag(-Wextra) + add_cxx_compiler_flag(-Wshadow) + add_cxx_compiler_flag(-Wsign-conversion) + add_cxx_compiler_flag(-Wmissing-prototypes) + add_cxx_compiler_flag(-Weverything) + add_cxx_compiler_flag(/W4) + add_cxx_compiler_flag(-Wno-padded) + add_cxx_compiler_flag(/Wd4820) # padding + add_cxx_compiler_flag(-Wno-unused-macros) + add_cxx_compiler_flag(-Wno-format-nonliteral) + if (MINGW) + add_cxx_compiler_flag(-Wno-format) + endif() + if (NOT CIVETWEB_ALLOW_WARNINGS) + add_cxx_compiler_flag(-Werror) + endif() + add_cxx_compiler_flag(/WX) + add_cxx_compiler_flag(-pedantic-errors) + add_cxx_compiler_flag(-Wzero-as-null-pointer-constant) + add_cxx_compiler_flag(-fvisibility=hidden) + add_cxx_compiler_flag(-fstack-protector-strong RELEASE) + add_cxx_compiler_flag(-flto RELEASE) + add_cxx_compiler_flag(-fsanitize=undefined DEBUG) + add_cxx_compiler_flag(-fsanitize=address DEBUG) + if (HAVE_CXX_FLAG_FSANITIZE_ADDRESS) + add_cxx_compiler_flag(-static-asan DEBUG) + endif() + add_cxx_compiler_flag(-fstack-protector-all DEBUG) + add_cxx_compiler_flag(-mwindows) + set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_DEBUG}" CACHE STRING + "Flags used by the C++ compiler during coverage builds." + FORCE) + add_cxx_compiler_flag(--coverage COVERAGE) +endif() + +# Check the headers we need +check_include_files(stdint.h HAVE_STDINT) + +# Set up the definitions +if (${CMAKE_BUILD_TYPE} MATCHES "[Dd]ebug") + add_definitions(-DDEBUG) +endif() +if (HAVE_STDINT) + add_definitions(-DHAVE_STDINT) +endif() +if (CIVETWEB_ENABLE_IPV6) + add_definitions(-DUSE_IPV6) +endif() +if (CIVETWEB_ENABLE_WEBSOCKETS) + add_definitions(-DUSE_WEBSOCKET) +endif() +if (CIVETWEB_SERVE_NO_FILES) + add_definitions(-DNO_FILES) +endif() +if (CIVETWEB_DISABLE_CGI) + add_definitions(-DNO_CGI) +endif() +if (CIVETWEB_ENABLE_LUA) + add_definitions(-DUSE_LUA) +endif() +if (CIVETWEB_ENABLE_DUKTAPE) + add_definitions(-DUSE_DUKTAPE) +endif() +if (CIVETWEB_ENABLE_MEMORY_DEBUGGING) + add_definitions(-DMEMORY_DEBUGGING) +endif() +if (NOT CIVETWEB_ENABLE_SSL) + add_definitions(-DNO_SSL) +elseif (NOT CIVETWEB_ENABLE_SSL_DYNAMIC_LOADING) + add_definitions(-DNO_SSL_DL) +else() + if(CIVETWEB_SSL_SSL_LIB) + add_definitions(-DSSL_LIB="${CIVETWEB_SSL_SSL_LIB}") + endif() + if(CIVETWEB_SSL_CRYPTO_LIB) + add_definitions(-DCRYPTO_LIB="${CIVETWEB_SSL_CRYPTO_LIB}") + endif() +endif() +add_definitions(-DUSE_STACK_SIZE=${CIVETWEB_THREAD_STACK_SIZE}) +add_definitions(-DMAX_REQUEST_SIZE=${CIVETWEB_MAX_REQUEST_SIZE}) + +# Build the targets +add_subdirectory(src) + +# Enable the testing of the library/executable +include(CTest) +if (BUILD_TESTING) + # Check unit testing framework Version + set(CIVETWEB_CHECK_VERSION 0.9.14 CACHE STRING + "The version of Check unit testing framework to build and include statically") + set_property(CACHE CIVETWEB_CHECK_VERSION PROPERTY VALUE ${CIVETWEB_CHECK_VERSION}) + message(STATUS "Check Unit Testing Framework Version - ${CIVETWEB_CHECK_VERSION}") + mark_as_advanced(CIVETWEB_CHECK_VERSION) + + # Check unit testing framework Verification Hash + set(CIVETWEB_CHECK_MD5_HASH 38263d115d784c17aa3b959ce94be8b8 CACHE STRING + "The hash of Check unit testing framework archive to be downloaded") + set_property(CACHE CIVETWEB_CHECK_MD5_HASH PROPERTY VALUE ${CIVETWEB_CHECK_MD5_HASH}) + mark_as_advanced(CIVETWEB_CHECK_MD5_HASH) + + # Build the testing + add_subdirectory(test) +endif() + +# Set up CPack +include(InstallRequiredSystemLibraries) +set(CPACK_PACKAGE_VENDOR "civetweb Contributors") +set(CPACK_PACKAGE_CONTACT "civetweb@github.com") +set(CPACK_PACKAGE_VERSION_MAJOR "${CIVETWEB_VERSION_MAJOR}") +set(CPACK_PACKAGE_VERSION_MINOR "${CIVETWEB_VERSION_MINOR}") +set(CPACK_PACKAGE_VERSION_PATCH "${CIVETWEB_VERSION_PATCH}") +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A HTTP library and server") +set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md") +set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.md") +set(CPACK_STRIP_FILES TRUE) +set(CPACK_PACKAGE_DEPENDS "openssl") +if (CIVETWEB_ENABLE_LUA_SHARED) + set(CPACK_PACKAGE_DEPENDS "lua, ${CPACK_PACKAGE_DEPENDS}") +endif() + +# RPM Packaging +set(CPACK_RPM_PACKAGE_GROUP "Development/Libraries") +set(CPACK_RPM_PACKAGE_LICENSE "MIT") +set(CPACK_RPM_PACKAGE_ARCHITECTURE "${CIVETWEB_ARCHITECTURE}") +set(CPACK_RPM_PACKAGE_REQUIRES "${CPACK_PACKAGE_DEPENDS}") + +# Debian Packaging +set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE "${CIVETWEB_ARCHITECTURE}") +set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://github.com/civetweb/civetweb") +set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_PACKAGE_DEPENDS}") + +# WiX Packaging +# TODO: www.cmake.org/cmake/help/v3.0/module/CPackWIX.html + +# Finalize CPack settings +include(CPack) diff --git a/3P/civetweb/CREDITS.md b/3P/civetweb/CREDITS.md new file mode 100644 index 00000000..5f8d4968 --- /dev/null +++ b/3P/civetweb/CREDITS.md @@ -0,0 +1,106 @@ +# Civetweb Contributors + +* Alex Kozlov +* bel2125 +* Ben M. Ward +* Brian Lambert +* Brian Spratke +* cdbishop +* celeron55 +* cjh +* Daniel Oaks +* Danny Al-Gaaf +* David Arnold +* David Loffredo +* Dialga +* Eric Tsau +* F-Secure Corporation +* Fernando G. Aranda +* Grahack +* grenclave +* hansipie +* HariKamath Kamath +* Jan Willem Janssen +* Jeremy Lin +* Jim Evans +* jmc- +* Jordan +* Jordan Shelley +* kalphamon +* Keith Kyzivat +* Kevin Wojniak +* Kimmo Mustonen +* Lianghui +* Maarten Fremouw +* Mark Lakata +* Matt Clarkson +* Morgan McGuire +* Nick Hildebrant +* Nigel Stewart +* nihildeb +* No Face Press +* Paul Sokolovsky +* Perttu Ahola +* Philipp Friedenberger +* Philipp Hasper +* Richard Screene +* Sage Weil +* Sangwhan Moon +* Scott Nations +* Thomas Davis +* Toni Wilk +* Ulrich Hertlein +* William Greathouse +* Yehuda Sadeh + +# Mongoose Contributors +Civetweb is based on the Mongoose code. The following users contributed to the original Mongoose release between 2010 and 2013. This list was generated from the Mongoose GIT logs. There is no record for contributors prior to 2010. + +* Sergey Lyubka +* Arnout Vandecappelle (Essensium/Mind) +* Benoît Amiaux +* Cody Hanson +* Colin Leitner +* Daniel Oaks +* Eric Bakan +* Erik Oomen +* Filipp Kovalev +* Ger Hobbelt +* Hendrik Polczynski +* Henrique Mendonça +* Igor Okulist +* Jay +* Joe Mucchiello +* John Safranek +* Joseph Mainwaring +* José Miguel Gonçalves +* KIU Shueng Chuan +* Katerina Blinova +* Konstantin Sorokin +* Marin Atanasov Nikolov +* Matt Healy +* Miguel Morales +* Mikhail Nikalyukin +* MikieMorales +* Mitch Hendrickson +* Nigel Stewart +* Pavel +* Pavel Khlebovich +* Rogerz Zhang +* Sebastian Reinhard +* Stefan Doehla +* Thileepan +* abadc0de +* arvidn +* bick +* ff.feng +* jmucchiello +* jwang +* lsm +* migal +* mlamb +* nullable.type +* shantanugadgil +* tayS +* test +* valenok diff --git a/3P/civetweb/LICENSE.md b/3P/civetweb/LICENSE.md new file mode 100644 index 00000000..263690e5 --- /dev/null +++ b/3P/civetweb/LICENSE.md @@ -0,0 +1,210 @@ +ALL LICENSES +===== + +This document includes several copyright licenses for different +aspects of the software. Not all licenses may apply depending +on the features chosen. + + +Civetweb License +----- + +### Included with all features. + +> Copyright (c) 2013-2015 The CivetWeb developers ([CREDITS.md](https://github.com/civetweb/civetweb/blob/master/CREDITS.md)) +> +> Copyright (c) 2004-2013 Sergey Lyubka +> +> Copyright (c) 2013 No Face Press, LLC (Thomas Davis) +> +> Copyright (c) 2013 F-Secure Corporation +> +> 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. + + +Lua License +------ + +### Included only if built with Lua support. + +http://www.lua.org/license.html + +> Copyright (C) 1994-2015 Lua.org, PUC-Rio. +> +> 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. + + +SQLite3 License +------ + +### Included only if built with Lua and SQLite support. + +http://www.sqlite.org/copyright.html + +> 2001 September 15 +> +> The author disclaims copyright to this source code. In place of +> a legal notice, here is a blessing: +> +> May you do good and not evil. +> May you find forgiveness for yourself and forgive others. +> May you share freely, never taking more than you give. + + +lsqlite3 License +------ + +### Included only if built with Lua and SQLite support. + +> Copyright (C) 2002-2013 Tiago Dionizio, Doug Currie +> All rights reserved. +> Author : Tiago Dionizio +> Author : Doug Currie +> Library : lsqlite3 - a SQLite 3 database binding for Lua 5 +> +> 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. + + +Lua File System License +------ + +### Included only if built with Lua support. + +http://keplerproject.github.io/luafilesystem/license.html + +> Copyright © 2003 Kepler Project. +> +> 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. + + +LuaXML License +------ + +### Included only if built with Lua and LuaXML support. + +> LuaXML License +> +> LuaXml is licensed under the terms of the MIT license reproduced below, +> the same as Lua itself. This means that LuaXml is free software and can be +> used for both academic and commercial purposes at absolutely no cost. +> +> Copyright (C) 2007-2013 Gerald Franz, eludi.net +> +> 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. + + +Duktape License +------ + +### Included only if built with Duktape support. + +https://github.com/svaarala/duktape/blob/master/LICENSE.txt + +> =============== +> Duktape license +> =============== +> +> (http://opensource.org/licenses/MIT) +> +> Copyright (c) 2013-2015 by Duktape authors (see AUTHORS.rst) +> +> 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/3P/civetweb/Makefile b/3P/civetweb/Makefile new file mode 100644 index 00000000..d27767fd --- /dev/null +++ b/3P/civetweb/Makefile @@ -0,0 +1,310 @@ +# +# Copyright (c) 2013 No Face Press, LLC +# License http://opensource.org/licenses/mit-license.php MIT License +# + +# +# For help try, "make help" +# + +include resources/Makefile.in-os + +CPROG = civetweb +#CXXPROG = civetweb +UNIT_TEST_PROG = civetweb_test + +BUILD_DIR = out + +# Installation directories by convention +# http://www.gnu.org/prep/standards/html_node/Directory-Variables.html +PREFIX = /usr/local +EXEC_PREFIX = $(PREFIX) +BINDIR = $(EXEC_PREFIX)/bin +DATAROOTDIR = $(PREFIX)/share +DOCDIR = $(DATAROOTDIR)/doc/$(CPROG) +SYSCONFDIR = $(PREFIX)/etc +HTMLDIR = $(DOCDIR) + +# build tools +MKDIR = mkdir -p +RMF = rm -f +RMRF = rm -rf + +# desired configuration of the document root +# never assume that the document_root actually +# exists on the build machine. When building +# a chroot, PREFIX if just a directory which +# later becomes /. +DOCUMENT_ROOT = $(HTMLDIR) +PORTS = 8080 + +BUILD_DIRS = $(BUILD_DIR) $(BUILD_DIR)/src $(BUILD_DIR)/resources + +LIB_SOURCES = src/civetweb.c +LIB_INLINE = src/mod_lua.inl src/md5.inl +APP_SOURCES = src/main.c +WINDOWS_RESOURCES = resources/res.rc +UNIT_TEST_SOURCES = test/unit_test.c +SOURCE_DIRS = + +OBJECTS = $(LIB_SOURCES:.c=.o) $(APP_SOURCES:.c=.o) +BUILD_RESOURCES = + +# The unit tests include the source files directly to get visibility to the +# static functions. So we clear OBJECTS so that we don't try to build or link +# with any external object. Later if we find WITH_LUA=1, we'll add lua objects +# to this variable so we can run lua-specific unit tests. +ifeq ($(MAKECMDGOALS), unit_test) +OBJECTS = +BUILD_DIRS += $(BUILD_DIR)/test +endif + +# only set main compile options if none were chosen +CFLAGS += -Wall -Wextra -Wshadow -Wformat-security -Winit-self -Wmissing-prototypes -O2 -D$(TARGET_OS) -Iinclude $(COPT) -DUSE_STACK_SIZE=102400 + +LIBS = -lpthread -lm + +ifdef WITH_DEBUG + CFLAGS += -g -DDEBUG_ENABLED +else + CFLAGS += -DNDEBUG +endif + +ifdef WITH_CPP + OBJECTS += src/CivetServer.o + LCC = $(CXX) +else + LCC = $(CC) +endif + +ifdef WITH_LUA_SHARED + WITH_LUA = 1 +endif + +ifdef WITH_LUAJIT_SHARED + WITH_LUA_SHARED = 1 + WITH_LUA = 1 + WITH_LUA_VERSION = 501 +endif + +ifdef WITH_LUA + include resources/Makefile.in-lua +endif + +ifdef WITH_SSJS + WITH_DUKTAPE = 1 +endif + +ifdef WITH_DUKTAPE_SHARED + WITH_DUKTAPE = 1 +endif + +ifdef WITH_DUKTAPE + include resources/Makefile.in-duktape +endif + +ifdef WITH_IPV6 + CFLAGS += -DUSE_IPV6 +endif + +ifdef WITH_WEBSOCKET + CFLAGS += -DUSE_WEBSOCKET +endif + +ifdef CONFIG_FILE + CFLAGS += -DCONFIG_FILE=\"$(CONFIG_FILE)\" +endif + +ifdef CONFIG_FILE2 + CFLAGS += -DCONFIG_FILE2=\"$(CONFIG_FILE2)\" +endif + +ifdef SSL_LIB + CFLAGS += -DSSL_LIB=\"$(SSL_LIB)\" +endif + +ifdef CRYPTO_LIB + CFLAGS += -DCRYPTO_LIB=\"$(CRYPTO_LIB)\" +endif + +BUILD_DIRS += $(addprefix $(BUILD_DIR)/, $(SOURCE_DIRS)) +BUILD_OBJECTS = $(addprefix $(BUILD_DIR)/, $(OBJECTS)) +MAIN_OBJECTS = $(addprefix $(BUILD_DIR)/, $(APP_SOURCES:.c=.o)) +LIB_OBJECTS = $(filter-out $(MAIN_OBJECTS), $(BUILD_OBJECTS)) + +ifeq ($(TARGET_OS),LINUX) + LIBS += -lrt -ldl + CAN_INSTALL = 1 +endif + +ifeq ($(TARGET_OS),WIN32) + MKDIR = mkdir + RMF = del /q + RMRF = rmdir /s /q +endif + +ifdef WITH_LUAJIT_SHARED + LIBS += -lluajit-5.1 +else +ifdef WITH_LUA_SHARED + LIBS += $(LUA_SHARED_LIB_FLAG) +endif +endif + +ifneq (, $(findstring mingw32, $(shell $(CC) -dumpmachine))) + BUILD_RESOURCES = $(BUILD_DIR)/$(WINDOWS_RESOURCES:.rc=.o) + LIBS += -lws2_32 -mwindows + SHARED_LIB = dll +else + SHARED_LIB = so +endif + +all: build + +help: + @echo "make help show this message" + @echo "make build compile" + @echo "make install install on the system" + @echo "make clean clean up the mess" + @echo "make lib build a static library" + @echo "make slib build a shared library" + @echo "make unit_test build unit tests executable" + @echo "" + @echo " Make Options" + @echo " WITH_LUA=1 build with Lua support; include Lua as static library" + @echo " WITH_LUA_SHARED=1 build with Lua support; use dynamic linking to liblua5.2.so" + @echo " WITH_LUA_VERSION=502 build with Lua 5.2.x (501 for Lua 5.1.x to 503 for 5.3.x)" + @echo " WITH_DUKTAPE=1 build with Duktape support; include as static library" + @echo " WITH_DUKTAPE_SHARED=1 build with Duktape support; use libduktape1.3.so" +# @echo " WITH_DUKTAPE_VERSION=103 build with Duktape 1.3.x" + @echo " WITH_DEBUG=1 build with GDB debug support" + @echo " WITH_IPV6=1 with IPV6 support" + @echo " WITH_WEBSOCKET=1 build with web socket support" + @echo " WITH_CPP=1 build library with c++ classes" + @echo " CONFIG_FILE=file use 'file' as the config file" + @echo " CONFIG_FILE2=file use 'file' as the backup config file" + @echo " DOCUMENT_ROOT=/path document root override when installing" + @echo " PORTS=8080 listening ports override when installing" + @echo " SSL_LIB=libssl.so.0 use versioned SSL library" + @echo " CRYPTO_LIB=libcrypto.so.0 system versioned CRYPTO library" + @echo " PREFIX=/usr/local sets the install directory" + @echo " COPT='-DNO_SSL' method to insert compile flags" + @echo "" + @echo " Compile Flags" + @echo " NDEBUG strip off all debug code" + @echo " DEBUG build debug version (very noisy)" + @echo " NO_CGI disable CGI support" + @echo " NO_SSL disable SSL functionality" + @echo " NO_SSL_DL link against system libssl library" + @echo " NO_FILES do not serve files from a directory" + @echo " MAX_REQUEST_SIZE maximum header size, default 16384" + @echo "" + @echo " Variables" + @echo " TARGET_OS='$(TARGET_OS)'" + @echo " CFLAGS='$(CFLAGS)'" + @echo " CXXFLAGS='$(CXXFLAGS)'" + @echo " LDFLAGS='$(LDFLAGS)'" + @echo " CC='$(CC)'" + @echo " CXX='$(CXX)'" + +build: $(CPROG) $(CXXPROG) + +unit_test: $(UNIT_TEST_PROG) + +ifeq ($(CAN_INSTALL),1) +install: $(HTMLDIR)/index.html $(SYSCONFDIR)/civetweb.conf + install -d -m 755 "$(DOCDIR)" + install -m 644 *.md "$(DOCDIR)" + install -d -m 755 "$(BINDIR)" + install -m 755 $(CPROG) "$(BINDIR)/" + +# Install target we do not want to overwrite +# as it may be an upgrade +$(HTMLDIR)/index.html: + install -d -m 755 "$(HTMLDIR)" + install -m 644 resources/itworks.html $(HTMLDIR)/index.html + install -m 644 resources/civetweb_64x64.png $(HTMLDIR)/ + +# Install target we do not want to overwrite +# as it may be an upgrade +$(SYSCONFDIR)/civetweb.conf: + install -d -m 755 "$(SYSCONFDIR)" + install -m 644 resources/civetweb.conf "$(SYSCONFDIR)/" + @sed -i 's#^document_root.*$$#document_root $(DOCUMENT_ROOT)#' "$(SYSCONFDIR)/civetweb.conf" + @sed -i 's#^listening_ports.*$$#listening_ports $(PORTS)#' "$(SYSCONFDIR)/civetweb.conf" + +else +install: + @echo "Target not flagged for installation. Use CAN_INSTALL=1 to force" + @echo "As a precaution only LINUX targets are set as installable." + @echo "If the target is linux-like, use CAN_INSTALL=1 option." +endif + +lib: lib$(CPROG).a + +slib: lib$(CPROG).$(SHARED_LIB) + +clean: + $(RMRF) $(BUILD_DIR) + $(eval version=$(shell grep "define CIVETWEB_VERSION" include/civetweb.h | sed 's|.*VERSION "\(.*\)"|\1|g')) + $(eval major=$(shell echo $(version) | cut -d'.' -f1)) + $(RMRF) lib$(CPROG).a + $(RMRF) lib$(CPROG).so + $(RMRF) lib$(CPROG).so.$(major) + $(RMRF) lib$(CPROG).so.$(version).0 + $(RMRF) $(CPROG) + +distclean: clean + @$(RMRF) VS2012/Debug VS2012/*/Debug VS2012/*/*/Debug + @$(RMRF) VS2012/Release VS2012/*/Release VS2012/*/*/Release + $(RMF) $(CPROG) lib$(CPROG).so lib$(CPROG).a *.dmg *.msi *.exe lib$(CPROG).dll lib$(CPROG).dll.a + $(RMF) $(UNIT_TEST_PROG) + +lib$(CPROG).a: CFLAGS += -fPIC +lib$(CPROG).a: $(LIB_OBJECTS) + @$(RMF) $@ + ar cq $@ $(LIB_OBJECTS) + +lib$(CPROG).so: CFLAGS += -fPIC +lib$(CPROG).so: $(LIB_OBJECTS) + $(eval version=$(shell grep "define CIVETWEB_VERSION" include/civetweb.h | sed 's|.*VERSION "\(.*\)"|\1|g')) + $(eval major=$(shell echo $(version) | cut -d'.' -f1)) + $(LCC) -shared -Wl,-soname,$@.$(major) -o $@.$(version).0 $(CFLAGS) $(LDFLAGS) $(LIB_OBJECTS) + ln -s -f $@.$(major) $@ + ln -s -f $@.$(version).0 $@.$(major) + +lib$(CPROG).dll: CFLAGS += -fPIC +lib$(CPROG).dll: $(LIB_OBJECTS) + $(LCC) -shared -o $@ $(CFLAGS) $(LDFLAGS) $(LIB_OBJECTS) $(LIBS) -Wl,--out-implib,lib$(CPROG).dll.a + +$(UNIT_TEST_PROG): CFLAGS += -Isrc +$(UNIT_TEST_PROG): $(LIB_SOURCES) $(LIB_INLINE) $(UNIT_TEST_SOURCES) $(BUILD_OBJECTS) + $(LCC) -o $@ $(CFLAGS) $(LDFLAGS) $(UNIT_TEST_SOURCES) $(BUILD_OBJECTS) $(LIBS) + +$(CPROG): $(BUILD_OBJECTS) $(BUILD_RESOURCES) + $(LCC) -o $@ $(CFLAGS) $(LDFLAGS) $(BUILD_OBJECTS) $(BUILD_RESOURCES) $(LIBS) + +$(CXXPROG): $(BUILD_OBJECTS) + $(CXX) -o $@ $(CFLAGS) $(LDFLAGS) $(BUILD_OBJECTS) $(LIBS) + +$(BUILD_OBJECTS): $(BUILD_DIRS) + +$(BUILD_DIRS): + -@$(MKDIR) "$@" + +$(BUILD_DIR)/%.o : %.cpp + $(CXX) -c $(CFLAGS) $(CXXFLAGS) $< -o $@ + +$(BUILD_DIR)/%.o : %.c + $(CC) -c $(CFLAGS) $< -o $@ + +$(BUILD_RESOURCES) : $(WINDOWS_RESOURCES) + windres $(WINDRES_FLAGS) $< $@ + +# This rules is used to keep the code formatted in a reasonable manor +# For this to work astyle must be installed and in the path +# http://sourceforge.net/projects/astyle +indent: + astyle --suffix=none --style=linux --indent=spaces=4 --lineend=linux include/*.h src/*.c src/*.cpp src/*.inl examples/*/*.c examples/*/*.cpp + +.PHONY: all help build install clean lib so diff --git a/3P/civetweb/Makefile.deprecated b/3P/civetweb/Makefile.deprecated new file mode 100644 index 00000000..288c15ba --- /dev/null +++ b/3P/civetweb/Makefile.deprecated @@ -0,0 +1,208 @@ +# This Makefile is part of Civetweb web server project, +# https://github.com/valenok/civetweb +# +# Example custom build: +# COPT="-g -O0 -DNO_SSL_DL -DUSE_LUA -llua -lcrypto -lssl" make linux +# +# Flags are: +# -DHAVE_MD5 - use system md5 library (-2kb) +# -DNDEBUG - strip off all debug code (-5kb) +# -DDEBUG - build debug version (very noisy) (+7kb) +# -DNO_CGI - disable CGI support (-5kb) +# -DNO_SSL - disable SSL functionality (-2kb) +# -DNO_SSL_DL - link against system libssl library (-1kb) +# -DCONFIG_FILE=\"file\" - use `file' as the default config file +# -DSSL_LIB=\"libssl.so.\" - use system versioned SSL shared object +# -DCRYPTO_LIB=\"libcrypto.so.\" - use system versioned CRYPTO so +# -DUSE_LUA - embed Lua in Civetweb (+100kb) + +PROG = civetweb +CFLAGS = -std=c99 -O2 -W -Wall -pedantic -pthread -pipe -Iinclude $(COPT) + +# To build with Lua, download and unzip Lua 5.2.3 source code into the +# civetweb directory, and then add $(LUA_SOURCES) to CFLAGS +LUA = src/third_party/lua-5.2.3/src +LUA_FLAGS = -I$(LUA) -DLUA_COMPAT_ALL +LUA_SOURCES = $(LUA)/lapi.c $(LUA)/lcode.c $(LUA)/lctype.c \ + $(LUA)/ldebug.c $(LUA)/ldo.c $(LUA)/ldump.c \ + $(LUA)/lfunc.c $(LUA)/lgc.c $(LUA)/llex.c \ + $(LUA)/lmem.c $(LUA)/lobject.c $(LUA)/lopcodes.c \ + $(LUA)/lparser.c $(LUA)/lstate.c $(LUA)/lstring.c \ + $(LUA)/ltable.c $(LUA)/ltm.c $(LUA)/lundump.c \ + $(LUA)/lvm.c $(LUA)/lzio.c $(LUA)/lauxlib.c \ + $(LUA)/lbaselib.c $(LUA)/lbitlib.c $(LUA)/lcorolib.c \ + $(LUA)/ldblib.c $(LUA)/liolib.c $(LUA)/lmathlib.c \ + $(LUA)/loslib.c $(LUA)/lstrlib.c $(LUA)/ltablib.c \ + $(LUA)/loadlib.c $(LUA)/linit.c +LUA_WINOBJS = $(LUA_SOURCES:%.c=%.obj) + +ifneq ($(OS), Windows_NT) + LUA_FLAGS += -DLUA_USE_DLOPEN +endif + +LIB_SOURCES = src/civetweb.c + +ALL_SOURCES = src/main.c $(LIB_SOURCES) src/third_party/sqlite3.c src/third_party/lsqlite3.c src/third_party/lfs.c \ + $(LUA_SOURCES) $(YASSL_SOURCES) + +SQLITE_FLAGS = -DTHREADSAFE=1 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS +CIVETWEB_FLAGS = -DUSE_LUA -DUSE_LUA_SQLITE3 -DUSE_LUA_FILE_SYSTEM $(COPT) +FLAGS = $(CIVETWEB_FLAGS) $(SQLITE_FLAGS) $(LUA_FLAGS) + + +# Stock windows binary builds with Lua. +# Yassl has a GPL license, so we will leave it out by default. + +ifeq ($(WITH_YASSL), 1) +YASSL = ../cyassl-2.4.6 +YASSL_FLAGS = -I $(YASSL) -I $(YASSL)/cyassl \ + -D _LIB -D OPENSSL_EXTRA -D HAVE_ERRNO_H \ + -D HAVE_GETHOSTBYNAME -D HAVE_INET_NTOA -D HAVE_LIMITS_H \ + -D HAVE_MEMSET -D HAVE_SOCKET -D HAVE_STDDEF_H -D HAVE_STDLIB_H \ + -D HAVE_STRING_H -D HAVE_SYS_STAT_H -D HAVE_SYS_TYPES_H +YASSL_SOURCES = \ + $(YASSL)/src/internal.c $(YASSL)/src/io.c $(YASSL)/src/keys.c \ + $(YASSL)/src/ssl.c $(YASSL)/src/tls.c $(YASSL)/ctaocrypt/src/hmac.c \ + $(YASSL)/ctaocrypt/src/random.c $(YASSL)/ctaocrypt/src/sha.c \ + $(YASSL)/ctaocrypt/src/sha256.c $(YASSL)/ctaocrypt/src/logging.c \ + $(YASSL)/ctaocrypt/src/error.c $(YASSL)/ctaocrypt/src/rsa.c \ + $(YASSL)/ctaocrypt/src/des3.c $(YASSL)/ctaocrypt/src/asn.c \ + $(YASSL)/ctaocrypt/src/coding.c $(YASSL)/ctaocrypt/src/arc4.c \ + $(YASSL)/ctaocrypt/src/md4.c $(YASSL)/ctaocrypt/src/md5.c \ + $(YASSL)/ctaocrypt/src/dh.c $(YASSL)/ctaocrypt/src/dsa.c \ + $(YASSL)/ctaocrypt/src/pwdbased.c $(YASSL)/ctaocrypt/src/aes.c \ + $(YASSL)/ctaocrypt/src/md2.c $(YASSL)/ctaocrypt/src/ripemd.c \ + $(YASSL)/ctaocrypt/src/sha512.c $(YASSL)/src/sniffer.c \ + $(YASSL)/ctaocrypt/src/rabbit.c $(YASSL)/ctaocrypt/src/misc.c \ + $(YASSL)/ctaocrypt/src/tfm.c $(YASSL)/ctaocrypt/src/integer.c \ + $(YASSL)/ctaocrypt/src/ecc.c $(YASSL)/src/ocsp.c $(YASSL)/src/crl.c \ + $(YASSL)/ctaocrypt/src/hc128.c $(YASSL)/ctaocrypt/src/memory.c + + ALL_SOURCES += $(YASSL_SOURCES) + FLAGS += $(YASSL_FLAGS) -DNO_SSL_DL + CIVETWEB_FLAGS += -DNO_SSL_DL + +else +# FLAGS += -DNO_SSL +# CIVETWEB_FLAGS += -DNO_SSL +endif + +ALL_OBJECTS = $(ALL_SOURCES:%.c=%.o) +ALL_WINOBJS = $(ALL_SOURCES:%.c=%.obj) + + +# Using Visual Studio 6.0. To build Civetweb: +# Set MSVC variable below to where VS 6.0 is installed on your system +# Run "PATH_TO_VC6\bin\nmake windows" +MSVC = ../vc6 +#DBG = /Zi /Od +DBG = /DNDEBUG /O1 +CL = $(MSVC)/bin/cl /MD /TC /nologo $(DBG) /W3 /GA /I$(MSVC)/include +LINK = $(MSVC)/bin/link /incremental:no /libpath:$(MSVC)/lib /machine:IX86 \ + user32.lib shell32.lib comdlg32.lib ws2_32.lib advapi32.lib + +all: + @echo "make (linux|bsd|solaris|mac|windows|mingw|cygwin)" + +%.obj: %.c + $(CL) /c $(FLAGS) /Fo$@ $< + +%.o: %.c + $(CC) -o $@ $< -c $(FLAGS) $(CFLAGS) + +# Lua library for Windows +lua.lib: $(LUA_WINOBJS) + $(MSVC)/bin/lib /out:$@ $(LUA_WINOBJS) + +# To build with Lua, make sure you have Lua unpacked into src/third_party/lua-5.2.3 directory +linux_lua: $(ALL_OBJECTS) + $(CC) $(ALL_OBJECTS) -o $(PROG) -ldl + +civetweb.o: src/mod_lua.inl + +# Make sure that the compiler flags come last in the compilation string. +# If not so, this can break some on some Linux distros which use +# "-Wl,--as-needed" turned on by default in cc command. +# Also, this is turned in many other distros in static linkage builds. +linux: + $(CC) $(LIB_SOURCES) src/main.c -o $(PROG) -ldl $(CFLAGS) + +mac: bsd +bsd: + $(CC) $(LIB_SOURCES) src/main.c -o $(PROG) $(CFLAGS) + +bsd_lua: $(ALL_OBJECTS) + $(CC) $(ALL_OBJECTS) -o $@ + +solaris: + $(CC) $(LIB_SOURCES) src/main.c -lnsl -lsocket -o $(PROG) $(CFLAGS) + +lib$(PROG).a: $(ALL_OBJECTS) + ar cr $@ $(ALL_OBJECTS) + +$(PROG).lib: $(ALL_WINOBJS) + $(MSVC)/bin/lib /out:$@ $(ALL_WINOBJS) + +# For codesign to work in non-interactive mode, unlock login keychain: +# security unlock ~/Library/Keychains/login.keychain +# See e.g. http://lists.apple.com/archives/apple-cdsa/2008/Jan/msg00027.html +Civetweb: $(LIB_SOURCES) src/main.c + $(CC) $(LIB_SOURCES) src/main.c src/third_party/lsqlite3.c src/third_party/sqlite3.c src/third_party/lfs.c \ + -DUSE_COCOA $(CFLAGS) $(FLAGS) -mmacosx-version-min=10.4 \ + $(YASSL_SOURCES) $(LUA_SOURCES) \ + -framework Cocoa -ObjC -arch i386 -arch x86_64 -o Civetweb + +cocoa: Civetweb + V=`perl -lne '/define\s+CIVETWEB_VERSION\s+"(\S+)"/ and print $$1' include/civetweb.h`; DIR=dmg/Civetweb.app && rm -rf $$DIR && mkdir -p $$DIR/Contents/{MacOS,Resources} && install -m 644 resources/civetweb_*.png resources/civetweb.icns $$DIR/Contents/Resources/ && install -m 644 resources/Info.plist $$DIR/Contents/ && install -m 755 Civetweb $$DIR/Contents/MacOS/ && ln -fs /Applications dmg/ ; hdiutil create Civetweb_$$V.dmg -volname "Civetweb $$V" -srcfolder dmg -ov #; rm -rf dmg + +un: + $(CC) test/unit_test.c -o unit_test -I. -I$(LUA) $(LUA_SOURCES) \ + $(CFLAGS) -g -O0 + ./unit_test + +wi: + $(CL) test/unit_test.c $(LUA_SOURCES) $(LUA_FLAGS) \ + $(YASSL_SOURCES) $(YASSL_FLAGS) /I. /DNO_SSL_DL \ + /link /libpath:$(MSVC)/lib advapi32.lib /out:unit_test.exe + ./unit_test.exe + +windows: $(ALL_WINOBJS) + $(MSVC)/bin/rc resources/res.rc + $(LINK) /nologo $(ALL_WINOBJS) resources/res.res /out:$(PROG).exe + +# Build for Windows under MinGW +#MINGWDBG= -DDEBUG -O0 -ggdb +MINGWDBG= -DNDEBUG -Os +MINGWOPT= -W -Wall -mthreads -Wl,--subsystem,console $(MINGWDBG) -DHAVE_STDINT $(GCC_WARNINGS) $(COPT) +mingw: + windres resources\res.rc resources\res.o + $(CC) $(MINGWOPT) $(LIB_SOURCES) -lws2_32 \ + -shared -Wl,--out-implib=$(PROG).lib -o $(PROG).dll + $(CC) $(MINGWOPT) $(LIB_SOURCES) src/main.c resources\res.o \ + -lws2_32 -ladvapi32 -lcomdlg32 -o $(PROG).exe + +# Build for Windows under Cygwin +#CYGWINDBG= -DDEBUG -O0 -ggdb +CYGWINDBG= -DNDEBUG -Os +CYGWINOPT= -W -Wall -mthreads -Wl,--subsystem,console $(CYGWINDBG) -DHAVE_STDINT $(GCC_WARNINGS) $(COPT) +cygwin: + windres ./resources/res.rc ./resources/res.o + $(CC) $(CYGWINOPT) $(LIB_SOURCES) -lws2_32 \ + -shared -Wl,--out-implib=$(PROG).lib -o $(PROG).dll + $(CC) $(CYGWINOPT) -Iinclude $(LIB_SOURCES) src/main.c ./resources/res.o \ + -lws2_32 -ladvapi32 -o $(PROG).exe + +tests: + perl test/test.pl $(TEST) + +tarball: clean + F=civetweb-`perl -lne '/define\s+CIVETWEB_VERSION\s+"(\S+)"/ and print $$1' include/civetweb.h`.tgz ; cd .. && tar -czf x civetweb/{LICENSE.md,Makefile,examples,test,resources,*.[ch],*.md} && mv x civetweb/$$F + +release: tarball cocoa + wine make windows + V=`perl -lne '/define\s+CIVETWEB_VERSION\s+"(\S+)"/ and print $$1' include/civetweb.h`; upx civetweb.exe; cp civetweb.exe civetweb-$$V.exe; cp civetweb.exe civetweb_php_bundle/; zip -r civetweb_php_bundle_$$V.zip civetweb_php_bundle/ + +clean: + rm -rf *.o *.core $(PROG) *.obj *.so $(PROG).txt *.dSYM *.tgz \ + $(PROG).exe *.dll *.lib resources/res.o resources/res.RES *.dSYM *.zip *.pdb \ + *.exe *.dmg $(ALL_OBJECTS) $(ALL_WINOBJS) diff --git a/3P/civetweb/Makefile.osx b/3P/civetweb/Makefile.osx new file mode 100644 index 00000000..ff77f14d --- /dev/null +++ b/3P/civetweb/Makefile.osx @@ -0,0 +1,39 @@ +# +# Copyright (c) 2013 No Face Press, LLC +# License http://opensource.org/licenses/mit-license.php MIT License +# + +# For codesign to work in non-interactive mode, unlock login keychain: +# security unlock ~/Library/Keychains/login.keychain +# See e.g. http://lists.apple.com/archives/apple-cdsa/2008/Jan/msg00027.html + +PACKAGE = Civetweb +BUILD_DIR = out + +CFLAGS += -DUSE_COCOA -mmacosx-version-min=10.4 -ObjC -arch i386 -arch x86_64 +LDFLAGS += -framework Cocoa + +DMG_DIR = $(BUILD_DIR)/dmg +CONTENTS_DIR = $(DMG_DIR)/$(PACKAGE).app/Contents +RESOURCES_DIR = $(CONTENTS_DIR)/Resources +OSXBIN_DIR = $(CONTENTS_DIR)/MacOS + +CIVETWEB_VERSION = $(shell perl -lne '/define\s+CIVETWEB_VERSION\s+"(\S+)"/ and print $$1' include/civetweb.h) + +include Makefile + +package: build + @rm -rf $(DMG_DIR) + install -d -m 755 $(CONTENTS_DIR) $(RESOURCES_DIR) $(OSXBIN_DIR) + install -m 644 resources/Info.plist $(CONTENTS_DIR)/ + install -m 644 resources/civetweb_*.png resources/civetweb.icns $(RESOURCES_DIR)/ + install -m 644 resources/itworks.html $(OSXBIN_DIR)/index.html + install -m 644 resources/civetweb_64x64.png $(OSXBIN_DIR)/ + install -m 755 $(CPROG) $(OSXBIN_DIR)/$(PACKAGE) + install -m 644 docs/Installing.md $(DMG_DIR)/Installing.txt + install -m 644 LICENSE.md $(DMG_DIR)/License.txt + ln -fs /Applications $(DMG_DIR)/ + hdiutil create $(PACKAGE)-$(CIVETWEB_VERSION).dmg -volname "$(PACKAGE) $(CIVETWEB_VERSION)" -srcfolder $(DMG_DIR) -ov +# @rm -rf $(DMG_DIR) + +.PHONY: package diff --git a/3P/civetweb/Qt/CivetWeb.pro b/3P/civetweb/Qt/CivetWeb.pro new file mode 100644 index 00000000..456147db --- /dev/null +++ b/3P/civetweb/Qt/CivetWeb.pro @@ -0,0 +1,22 @@ +TEMPLATE = app +CONFIG += console +CONFIG -= app_bundle +CONFIG -= qt + +SOURCES += \ + ../src/md5.inl \ + ../src/mod_lua.inl \ + ../src/timer.inl \ + ../src/civetweb.c \ + ../src/main.c + +include(deployment.pri) +qtcAddDeployment() + +HEADERS += \ + ../include/civetweb.h + +INCLUDEPATH += \ + ../include/ + +LIBS += -lws2_32 -lComdlg32 diff --git a/3P/civetweb/Qt/Qt/CivetWeb.pro b/3P/civetweb/Qt/Qt/CivetWeb.pro new file mode 100644 index 00000000..456147db --- /dev/null +++ b/3P/civetweb/Qt/Qt/CivetWeb.pro @@ -0,0 +1,22 @@ +TEMPLATE = app +CONFIG += console +CONFIG -= app_bundle +CONFIG -= qt + +SOURCES += \ + ../src/md5.inl \ + ../src/mod_lua.inl \ + ../src/timer.inl \ + ../src/civetweb.c \ + ../src/main.c + +include(deployment.pri) +qtcAddDeployment() + +HEADERS += \ + ../include/civetweb.h + +INCLUDEPATH += \ + ../include/ + +LIBS += -lws2_32 -lComdlg32 diff --git a/3P/civetweb/README.md b/3P/civetweb/README.md new file mode 100644 index 00000000..c485953f --- /dev/null +++ b/3P/civetweb/README.md @@ -0,0 +1,128 @@ +![CivetWeb](https://raw.github.com/civetweb/civetweb/master/resources/civetweb_64x64.png "CivetWeb") CivetWeb +======= + +**Continuous integration (Travis, Appveyor), coverage check (coveralls) and source code analysis (coverity) are currently in a setup phase** + +[![Travis Build Status](https://travis-ci.org/civetweb/civetweb.svg?branch=master)](https://travis-ci.org/civetweb/civetweb) +[![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/github/civetweb/civetweb?svg=true)](https://ci.appveyor.com/project/civetweb/civetweb/branch/master) +[![Coverage Status](https://coveralls.io/repos/civetweb/civetweb/badge.svg?branch=master&service=github)](https://coveralls.io/github/civetweb/civetweb?branch=master) +[![Coverity Scan Build Status](https://scan.coverity.com/projects/5784/badge.svg)](https://scan.coverity.com/projects/5784) + +**The official home of CivetWeb is https://github.com/civetweb/civetweb** + + +Project Mission +----------------- + +Project mission is to provide easy to use, powerful, C/C++ embeddable web +server with optional CGI, SSL and Lua support. +CivetWeb has a MIT license so you can innovate without restrictions. + + +Where to find the official version? +----------------------------------- + +End users can download CivetWeb at SourceForge +https://sourceforge.net/projects/civetweb/ + +Developers can contribute to CivetWeb via GitHub +https://github.com/civetweb/civetweb + +Trouble tickets should be filed on GitHub +https://github.com/civetweb/civetweb/issues + +Discussion/support group and announcements are at Google Groups +https://groups.google.com/d/forum/civetweb + + +Quick start documentation +-------------------------- + +- [docs/Installing.md](https://github.com/civetweb/civetweb/blob/master/docs/Installing.md) - Install Guide +- [docs/UserManual.md](https://github.com/civetweb/civetweb/blob/master/docs/UserManual.md) - End User Guide +- [docs/Building.md](https://github.com/civetweb/civetweb/blob/master/docs/Building.md) - Buildiing the Server Quick Start +- [docs/Embedding.md](https://github.com/civetweb/civetweb/blob/master/docs/Embedding.md) - Embedding Quick Start +- [RELEASE_NOTES.md](https://github.com/civetweb/civetweb/blob/master/RELEASE_NOTES.md) - Release Notes +- [LICENSE.md](https://github.com/civetweb/civetweb/blob/master/LICENSE.md) - Copyright License + + +Overview +-------- + +CivetWeb keeps the balance between functionality and +simplicity by a carefully selected list of features: + +- Liberal, commercial-friendly, permissive, + [MIT license](http://en.wikipedia.org/wiki/MIT_License) +- Free from copy-left licenses, like GPL, because you should innovate without + restrictions. +- Forked from [Mongoose](https://code.google.com/p/mongoose/) in 2013, before + it changed the licence from MIT to commercial + GPL. A lot of enchancements + have been added since that time, see + [RELEASE_NOTES.md](https://github.com/civetweb/civetweb/blob/master/RELEASE_NOTES.md). +- Works on Windows, Mac, Linux, UNIX, iPhone, Android, Buildroot, and many + other platforms. +- Scripting and database support (Lua scipts, Lua Server Pages, CGI + SQLite + database). + This provides a ready to go, powerful web development platform in a one + single-click executable with **no dependencies**. +- Support for CGI, HTTPS/SSL, SSI, HTTP digest (MD5) authorization, Websocket, + WEbDAV. +- Resumed download, URL rewrite, file blacklist, IP-based ACL, Windows service. +- Download speed limit based on client subnet or URI pattern. +- Simple and clean embedding API. +- The source is in single file to make things easy. +- Embedding examples included. +- HTTP client capable of sending arbitrary HTTP/HTTPS requests. + + +### Optionally included software + + +![Lua](https://raw.github.com/civetweb/civetweb/master/resources/lua-logo.jpg "Lua Logo") + + +![Sqlite3](https://raw.github.com/civetweb/civetweb/master/resources/sqlite3-logo.jpg "Sqlite3 Logo") + + +![LuaFileSystem](https://raw.github.com/civetweb/civetweb/master/resources/luafilesystem-logo.jpg "LuaFileSystem Logo") + + +![LuaSQLite3](https://raw.github.com/civetweb/civetweb/master/resources/luasqlite-logo.jpg "LuaSQLite3 Logo") + + +![LuaXML](https://raw.github.com/civetweb/civetweb/master/resources/luaxml-logo.jpg "LuaXML Logo") + + +![Duktape](https://raw.github.com/civetweb/civetweb/master/resources/duktape-logo.png "Duktape Logo") + + + +Support +------- + +This project is very easy to install and use. Please read the [documentation](https://github.com/civetweb/civetweb/blob/master/docs/) +and have a look at the [examples] (https://github.com/civetweb/civetweb/blob/master/examples/). +More information may be found on the [mailing list](https://groups.google.com/d/forum/civetweb). + + +Contributions +--------------- + +Contributions are welcome provided all contributions carry the MIT license. + +DO NOT APPLY fixes copied from Mongoose to this project to prevent GPL tainting. + + +### Author + +CivetWeb is based on the Mongoose project. The original author of Mongoose was +Sergey Lyubka, however, the license of Mongoose has been changed after writing +and distributing the original code this project is based on. + +Using the CivetWeb project ensures the MIT licenses terms are applied and +GPL cannot be imposed on any of this code as long as it is sourced from +here. This code will remain free with the MIT license protection. + +A list of authors can be found in [CREDITS.md](https://github.com/civetweb/civetweb/blob/master/CREDITS.md) + diff --git a/3P/civetweb/RELEASE_NOTES.md b/3P/civetweb/RELEASE_NOTES.md new file mode 100644 index 00000000..7d73c89b --- /dev/null +++ b/3P/civetweb/RELEASE_NOTES.md @@ -0,0 +1,255 @@ +Release Notes v1.8 (work in progress) +=== +### Objectives: *to be defined - CMake integration, bug fixes* + +Changes +------- + +- Created a "civetweb" organization at GitHub. +- Repository moved from https://github.com/bel2125/civetweb to https://github.com/civetweb/civetweb +- Improved continuous integration +- CMake support +- Updated version number + +Release Notes v1.7 +=== +### Objectives: *Examples, documentation, additional API functions, some functions rewritten, bug fixes and updates* + +Changes +------- + +- Format source with clang_format +- Use function 'sendfile' for Linux +- Fix for CRAMFS in Linux +- Fix for file modification times in Windows +- Use SO_EXCLUSIVEADDRUSE instead of SO_REUSEADDR for Windows +- Rewrite push/pull functions +- Allow to use Lua as shared objects (WITH_LUA_SHARED) +- Fixes for many warnings +- URI specific callbacks and different timeouts for websockets +- Add chunked transfer support +- Update LuaFileSystem +- Update Lua to 5.2.4 +- Fix build for MinGW-x64, TDM-GCC and clang +- Update SQLite to 3.8.10.2 +- Fix CGI variables SCRIPT_NAME and PATH_TRANSLATED +- Set TCP_USER_TIMEOUT to deal faster with broken connections +- Add a Lua form handling example +- Return more differentiated HTTP error codes +- Add log_access callback +- Rewrite and comment request handling function +- Specify in detail and document return values of callback functions +- Set names for all threads (unless NO_THREAD_NAME is defined) +- New API functions for TCP/HTTP clients +- Fix upload of huge files +- Allow multiple SSL instances within one application +- Improve API and user documentation +- Allow to choose between static and dynamic Lua library +- Improve unit test +- Use temporary file name for partially uploaded files +- Additional API functions exported to C++ +- Add a websocket client example +- Add a websocket client API +- Update websocket example +- Make content length available in request_info +- New API functions: access context, callback for create/delete, access user data +- Upgraded Lua from 5.2.2 to 5.2.3 and finally 5.2.4 +- Integrate LuaXML (for testing purposes) +- Fix compiler warnings +- Updated version number + +Release Notes v1.6 +=== +### Objectives: *Enhance Lua support, configuration dialog for windows, new examples, bug fixes and updates* + +Changes +------- + +- Add examples of Lua pages, scripts and websockets to the test directory (bel) +- Add dialog to change htpasswd files for the Windows standalone server (bel) +- Fix compiler warnings and warnings from static code analysis (Danny Al-Gaaf, jmc-, Thomas, bel, ...) +- Add new unit tests (bel) +- Support includes in htpasswd files (bel) +- Add a basic option check for the standalone executable (bel) +- Support user defined error pages (bel) +- Method to get POST request parameters via C++ interface (bel) +- Re-Add unit tests for Linux and Windows (jmc-, bel) +- Allow to specify title and tray icon for the Windows standalone server (bel) +- Fix minor memory leaks (bel) +- Redirect all memory allocation/deallocation through mg functions which may be overwritten (bel) +- Support Cross-Origin Resource Sharing (CORS) for static files and scripts (bel) +- Win32: Replace dll.def file by export macros in civetweb.h (CSTAJ) +- Base64 encode and decode functions for Lua (bel) +- Support pre-loaded files for the Lua environment (bel) +- Server should check the nonce for http digest access authentication (bel) +- Hide read-only flag in file dialogs opened by the Edit Settings dialog for the Windows executable (bel) +- Add all functions to dll.def, that are in the header (bel) +- Added Lua extensions: send_file, get_var, get_mime_type, get_cookie, url_decode, url_encode (bel) +- mg_set_request_handler() mod to use pattern (bel, Patch from Toni Wilk) +- Solved, tested and documented SSL support for Windows (bel) +- Fixed: select for Linux needs the nfds parameter set correctly (bel) +- Add methods for returning the ports civetweb is listening on (keithel) +- Fixes for Lua Server Pages, as described within the google groups thread. (bel) +- Added support for plain Lua Scripts, and an example script. (bel) +- A completely new, and more illustrative websocket example for C. (bel) +- Websocket for Lua (bel) +- An optional websocket_root directory, including URL rewriting (bel) +- Update of SQLite3 to 3.8.1. (bel) +- Add "date" header field to replies, according to the requirements of RFC 2616 (the HTTP standard), Section 14.18 (bel) +- Fix websocket long pull (celeron55) +- Updated API documentation (Alex Kozlov) +- Fixed Posix locking functions for Windows (bel2125) +- Updated version number + +Release Notes v1.5 +=== +### Objectives: *Bug fixes and updates, repository restoration* + +Changes +------- + +- Corrected bad mask flag/opcode passing to websocket callback (William Greathouse) +- Moved CEVITWEB_VERSION define into civetweb.h +- Added new simple zip deployment build for Windows. +- Removed windows install package build. +- Fixes page violation in mod_lua.inl (apkbox) +- Use C style comments to enable compiling most of civetweb with -ansi. (F-Secure Corporation) +- Allow directories with non ASCII characters in Windows in UTF-8 encoded (bel2125) +- Added Lua File System support (bel2125) +- Added mongoose history back in repository thanks to (Paul Sokolovsky) +- Fixed keep alive (bel2125) +- Updated of MIME types (bel2125) +- Updated lsqlite (bel2125) +- Fixed master thread priority (bel2125) +- Fixed IPV6 defines under Windowe (grenclave) +- Fixed potential dead lock in connection_close() (Morgan McGuire) +- Added WebSocket example using asynchronous server messages (William Greathouse) +- Fixed the getcwd() warning (William Greathouse) +- Implemented the connection_close() callback (William Greathouse) +- Fixed support URL's in civetweb.c (Daniel Oaks) +- Allow port number to be zero to use a random free port (F-Secure Corporation) +- Wait for threads to finish when stopping for a clean shutdown (F-Secure Corporation) +- More static analysis fixes against Coverity tool (F-Secure Corporation) +- Travis automated build testing support added (Daniel Oaks) +- Updated version numbers. +- Added contributor credits file. + +Release Notes v1.4 +=== +### Objectives: *New URI handler interface, feature enhancements, C++ extensions* +The main idea behind this release is to bring about API consistency. All changes +are backward compatible and have been kept to a minimum. + +Changes +------- + +- Added mg_set_request_handler() which provides a URI mapping for callbacks. + This is a new alternative to overriding callbacks.begin_request. +- Externalized mg_url_encode() +- Externalized mg_strncasecmp() for utiliy +- Added CivetServer::getParam methods +- Added CivetServer::urlDecode methods +- Added CivetServer::urlEncode methods +- Dealt with compiler warnings and some static analysis hits. +- Added mg_get_var2() to parse repeated query variables +- Externalized logging function cry() as mg_cry() +- Added CivetServer::getCookie method (Hariprasad Kamath) +- Added CivetServer::getHeader method (Hariprasad Kamath) +- Added new basic C embedding example +- Conformed source files to UNIX line endings for consistency. +- Unified the coding style to improve reability. + +Release Notes v1.3 +=== +### Objectives: *Buildroot Integration* + +Changes +------- + +- Made option to put initial HTMLDIR in a different place +- Validated build without SQLITE3 large file support +- Updated documentation +- Updated Buildroot config example + +Release Notes v1.2 +=== +### Objectives: *Installation Improvements, buildroot, cross compile support* +The objective of this release is to make installation seamless. + +Changes +------- + +- Create an installation guide +- Created both 32 and 64 bit windows installations +- Added install for windows distribution +- Added 64 bit build profiles for VS 2012. +- Created a buildroot patch +- Updated makefile to better support buildroot +- Made doc root and ports configurable during the make install. +- Updated Linux Install +- Updated OS X Package +- Improved install scheme with welcome web page + +Known Issues +----- + +- The prebuilt Window's version requires [Visual C++ Redistributable for Visual Studio 2012](http://www.microsoft.com/en-us/download/details.aspx?id=30679) + +Release Notes v1.1 +=== +### Objectives: *Build, Documentation, License Improvements* +The objective of this release is to establish a maintable code base, ensure MIT license rights and improve usability and documentation. + +Changes +------- + +- Reorangized build directories to make them more intuitive +- Added new build rules for lib and slib with option to include C++ class +- Upgraded Lua from 5.2.1 to 5.2.2 +- Added fallback configuration file path for Linux systems. + + Good for having a system wide default configuration /usr/local/etc/civetweb.conf +- Added new C++ abstraction class CivetServer +- Added thread safety for and fixed websocket defects (Morgan McGuire) +- Created PKGBUILD to use Arch distribution (Daniel Oaks) +- Created new documentation on Embeddeding, Building and yaSSL (see docs/). +- Updated License file to include all licenses. +- Replaced MD5 implementation due to questionable license. + + This requires new source file md5.inl +- Changed UNIX/OSX build to conform to common practices. + + Supports build, install and clean rules. + + Supports cross compiling + + Features can be chosen in make options +- Moved Cocoa/OSX build and packaging to a separate file. + + This actually a second build variant for OSX. + + Removed yaSSL from the OSX build, not needed. +- Added new Visual Studio projects for Windows builds. + + Removed Windows support from Makefiles + + Provided additional, examples with Lua, and another with yaSSL. +- Changed Zombie Reaping policy to not ignore SIGCHLD. + + The previous method caused trouble in applciations that spawn children. + +Known Issues +----- + +- Build support for VS6 and some other has been deprecated. + + This does not impact embedded programs, just the stand-alone build. + + The old Makefile was renamed to Makefile.deprecated. + + This is partcially do to lack fo testing. + + Need to find out what is actually in demand. +- Build changes may impact current users. + + As with any change of this type, changes may impact some users. + +Release Notes v1.0 +=== + +### Objectives: *MIT License Preservation, Rebranding* +The objective of this release is to establish a version of the Mongoose software distribution that still retains the MIT license. + +Changes +------- + +- Renamed Mongoose to Civetweb in the code and documentation. +- Replaced copyrighted images with new images +- Created a new code respository at https://github.com/bel2125/civetweb +- Created a distribution site at https://sourceforge.net/projects/civetweb/ +- Basic build testing diff --git a/3P/civetweb/VS2012/VS2012/buildRelease.pl b/3P/civetweb/VS2012/VS2012/buildRelease.pl new file mode 100644 index 00000000..df8db092 --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/buildRelease.pl @@ -0,0 +1,71 @@ +#!/usr/bin/perl +# +# Copyright (c) 2013 No Face Press, LLC +# License http://opensource.org/licenses/mit-license.php MIT License +# + +# This script builds and packages a Windows release. +# It requires ActiveState Perl to use and is intended +# to be run from the its directory under the +# VS Developer Command Prompt. + +# Create a Zip file +use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); +my $zip = Archive::Zip->new(); + +my $src = ".."; + +sub getCivetwebVersion { + print "Fetching CivetWeb version...\n"; + open HEADER, "${src}/include/civetweb.h"; + while (
) { + if (m/define\s+CIVETWEB_VERSION\s+"(.+)"/) { + close HEADER; + return $1; + } + } + close HEADER; + return "UNKNOWN_VERSION"; +} + +my $CIVETWEB_VERSION = getCivetwebVersion(); +my $basename = "civetweb-$CIVETWEB_VERSION"; +my $dir = "${basename}"; + +sub build32() { + print "\nBuilding Win32 Release version...\n"; + system("msbuild /p:Configuration=Release /p:Platform=Win32 civetweb.sln"); +} + +sub build64() { + print "\nBuilding x64 Release version...\n"; + system("msbuild /p:Configuration=Release /p:Platform=x64 civetweb.sln"); +} + +sub writeArchive() { + my $archive = "${basename}-win.zip"; + print "Creating archive $archive ...\n"; + + $zip->addDirectory("${dir}/"); + + $zip->addFile( "${src}/LICENSE.md", "${dir}/LICENSE.md" ); + $zip->addFile( "${src}/README.md", "${dir}/README.md" ); + $zip->addFile( "${src}/resources/systray.ico", "${dir}/systray.ico" ); + $zip->addFile( "${src}/resources/civetweb_64x64.png", + "${dir}/civetweb_64x64.png" ); + $zip->addFile( "${src}/resources/itworks.html", "${dir}/index.html" ); + $zip->addFile( "${src}/VS2012/Release/Win32/civetweb_lua.exe", + "${dir}/civetweb32.exe" ); + $zip->addFile( "${src}/VS2012/Release/x64/civetweb_lua.exe", + "${dir}/civetweb64.exe" ); + + unless ( $zip->writeToFileNamed($archive) == AZ_OK ) { + die 'write error'; + } + +} + +build32(); +build64(); +writeArchive(); +exit 0; diff --git a/3P/civetweb/VS2012/VS2012/civetweb.sln b/3P/civetweb/VS2012/VS2012/civetweb.sln new file mode 100644 index 00000000..05e5651e --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/civetweb.sln @@ -0,0 +1,171 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual C++ Express 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "civetweb_lua", "civetweb_lua\civetweb_lua.vcxproj", "{9BE9C008-E851-42B1-A034-BD4630AE4CD6}" + ProjectSection(ProjectDependencies) = postProject + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD} = {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lua_lib", "lua_lib\lua_lib.vcxproj", "{8F5E5D77-D269-4665-9E27-1045DA6CF0D8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_embedded_c", "ex_embedded_c\ex_embedded_c.vcxproj", "{882EC43C-2EEE-434B-A711-C844108D29C6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit_test", "unit_test\unit_test.vcxproj", "{1AC4A7A6-0100-4287-97F4-B95807BE5607}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_websocket_client", "ex_websocket_client\ex_websocket_client.vcxproj", "{58B93E94-7766-435E-93AE-42A2FB5D99B2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "upload", "upload\upload.vcxproj", "{882EC43C-2EEE-434B-A711-C845678D29C6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testclient", "..\testutils\testclient\testclient.vcxproj", "{15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Browser", "..\testutils\Browser\Browser.vcxproj", "{277772B0-D4B3-451E-86B6-261FBC645793}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testclient2", "..\testutils\testclient_chunked_linux\testclient2.vcxproj", "{150140C5-2989-4D0D-8714-5A47B78EAD4D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "duktape_lib", "duktape_lib\duktape_lib.vcxproj", "{0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_websocket", "ex_websocket\ex_websocket.vcxproj", "{58B93E94-7766-435E-93AE-42A2FB5D99B1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_embed_cpp", "ex_embed_cpp\ex_embed_cpp.vcxproj", "{4308C5EE-45E4-45D8-9D73-6C4E2587AD78}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|Mixed Platforms.ActiveCfg = Debug CONSOLE|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|Mixed Platforms.Build.0 = Debug CONSOLE|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|Win32.ActiveCfg = Debug|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|Win32.Build.0 = Debug|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|x64.ActiveCfg = Debug|x64 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|x64.Build.0 = Debug|x64 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|Mixed Platforms.Build.0 = Release|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|Win32.ActiveCfg = Release|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|Win32.Build.0 = Release|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|x64.ActiveCfg = Release|x64 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|x64.Build.0 = Release|x64 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|Win32.ActiveCfg = Debug|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|Win32.Build.0 = Debug|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|x64.ActiveCfg = Debug|x64 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|x64.Build.0 = Debug|x64 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|Mixed Platforms.Build.0 = Release|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|Win32.ActiveCfg = Release|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|Win32.Build.0 = Release|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|x64.ActiveCfg = Release|x64 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|x64.Build.0 = Release|x64 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|Win32.ActiveCfg = Debug|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|Win32.Build.0 = Debug|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|x64.ActiveCfg = Debug|x64 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|x64.Build.0 = Debug|x64 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|Mixed Platforms.Build.0 = Release|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|Win32.ActiveCfg = Release|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|Win32.Build.0 = Release|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|x64.ActiveCfg = Release|x64 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|x64.Build.0 = Release|x64 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Debug|Win32.ActiveCfg = Debug|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Debug|Win32.Build.0 = Debug|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Debug|x64.ActiveCfg = Debug|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Release|Mixed Platforms.Build.0 = Release|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Release|Win32.ActiveCfg = Release|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Release|Win32.Build.0 = Release|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Release|x64.ActiveCfg = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Debug|Win32.ActiveCfg = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Debug|Win32.Build.0 = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Debug|x64.ActiveCfg = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Release|Mixed Platforms.Build.0 = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Release|Win32.ActiveCfg = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Release|Win32.Build.0 = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Release|x64.ActiveCfg = Release|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Debug|Win32.ActiveCfg = Debug|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Debug|Win32.Build.0 = Debug|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Debug|x64.ActiveCfg = Debug|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Release|Mixed Platforms.Build.0 = Release|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Release|Win32.ActiveCfg = Release|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Release|Win32.Build.0 = Release|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Release|x64.ActiveCfg = Release|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Debug|Win32.ActiveCfg = Debug|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Debug|Win32.Build.0 = Debug|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Debug|x64.ActiveCfg = Debug|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Release|Mixed Platforms.Build.0 = Release|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Release|Win32.ActiveCfg = Release|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Release|Win32.Build.0 = Release|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Release|x64.ActiveCfg = Release|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Debug|Win32.ActiveCfg = Debug|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Debug|Win32.Build.0 = Debug|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Debug|x64.ActiveCfg = Debug|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Release|Mixed Platforms.Build.0 = Release|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Release|Win32.ActiveCfg = Release|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Release|Win32.Build.0 = Release|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Release|x64.ActiveCfg = Release|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Debug|Win32.ActiveCfg = Debug|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Debug|Win32.Build.0 = Debug|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Debug|x64.ActiveCfg = Debug|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Release|Mixed Platforms.Build.0 = Release|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Release|Win32.ActiveCfg = Release|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Release|Win32.Build.0 = Release|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Release|x64.ActiveCfg = Release|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Debug|Win32.ActiveCfg = Debug|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Debug|Win32.Build.0 = Debug|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Debug|x64.ActiveCfg = Debug|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Release|Mixed Platforms.Build.0 = Release|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Release|Win32.ActiveCfg = Release|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Release|Win32.Build.0 = Release|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Release|x64.ActiveCfg = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|Win32.ActiveCfg = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|Win32.Build.0 = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|x64.ActiveCfg = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|Mixed Platforms.Build.0 = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|Win32.ActiveCfg = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|Win32.Build.0 = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|x64.ActiveCfg = Release|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|Win32.ActiveCfg = Debug|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|Win32.Build.0 = Debug|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|x64.ActiveCfg = Debug|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|Mixed Platforms.Build.0 = Release|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|Win32.ActiveCfg = Release|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|Win32.Build.0 = Release|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|x64.ActiveCfg = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/3P/civetweb/VS2012/VS2012/civetweb_lua/civetweb_lua.vcxproj b/3P/civetweb/VS2012/VS2012/civetweb_lua/civetweb_lua.vcxproj new file mode 100644 index 00000000..e4d46382 --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/civetweb_lua/civetweb_lua.vcxproj @@ -0,0 +1,243 @@ + + + + + Debug CONSOLE + Win32 + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {9BE9C008-E851-42B1-A034-BD4630AE4CD6} + Win32Proj + civetweb_lua + + + + Application + true + MultiByte + v100 + + + Application + true + MultiByte + v100 + + + Application + true + v110 + MultiByte + + + Application + true + v110 + MultiByte + + + Application + false + true + MultiByte + v100 + + + Application + false + v110 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + Level3 + Disabled + USE_DUKTAPE;USE_IPV6;LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;$(ProjectDir)..\..\src\third_party\duktape-1.3.0\src;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + + + Level3 + Disabled + USE_DUKTAPE;USE_IPV6;LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;CONSOLE;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;$(ProjectDir)..\..\src\third_party\duktape-1.3.0\src;%(AdditionalIncludeDirectories) + + + Console + true + + + + + + + Level3 + Disabled + LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + + + Level3 + Disabled + LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + USE_DUKTAPE;USE_IPV6;LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;$(ProjectDir)..\..\src\third_party\duktape-1.3.0\src;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + {8f5e5d77-d269-4665-9e27-1045da6cf0d8} + + + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD} + + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/civetweb_lua/civetweb_lua.vcxproj.filters b/3P/civetweb/VS2012/VS2012/civetweb_lua/civetweb_lua.vcxproj.filters new file mode 100644 index 00000000..84bc20eb --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/civetweb_lua/civetweb_lua.vcxproj.filters @@ -0,0 +1,69 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {1ef3413b-2315-48f2-ad22-57af6b4f7aca} + + + + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + + + Resource Files + + + + + Resource Files + + + + + inl files + + + inl files + + + inl files + + + inl files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/civetweb_yassl/civetweb_yassl.sln b/3P/civetweb/VS2012/VS2012/civetweb_yassl/civetweb_yassl.sln new file mode 100644 index 00000000..49e36ce5 --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/civetweb_yassl/civetweb_yassl.sln @@ -0,0 +1,36 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "civetweb_yassl", "civetweb_yassl\civetweb_yassl.vcxproj", "{F02517CC-F896-41A2-86E4-509E55C70059}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "yassl_lib", "yassl_lib\yassl_lib.vcxproj", "{8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F02517CC-F896-41A2-86E4-509E55C70059}.Debug|Win32.ActiveCfg = Debug|Win32 + {F02517CC-F896-41A2-86E4-509E55C70059}.Debug|Win32.Build.0 = Debug|Win32 + {F02517CC-F896-41A2-86E4-509E55C70059}.Debug|x64.ActiveCfg = Debug|x64 + {F02517CC-F896-41A2-86E4-509E55C70059}.Debug|x64.Build.0 = Debug|x64 + {F02517CC-F896-41A2-86E4-509E55C70059}.Release|Win32.ActiveCfg = Release|Win32 + {F02517CC-F896-41A2-86E4-509E55C70059}.Release|Win32.Build.0 = Release|Win32 + {F02517CC-F896-41A2-86E4-509E55C70059}.Release|x64.ActiveCfg = Release|x64 + {F02517CC-F896-41A2-86E4-509E55C70059}.Release|x64.Build.0 = Release|x64 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Debug|Win32.ActiveCfg = Debug|Win32 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Debug|Win32.Build.0 = Debug|Win32 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Debug|x64.ActiveCfg = Debug|x64 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Debug|x64.Build.0 = Debug|x64 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Release|Win32.ActiveCfg = Release|Win32 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Release|Win32.Build.0 = Release|Win32 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Release|x64.ActiveCfg = Release|x64 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/3P/civetweb/VS2012/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj b/3P/civetweb/VS2012/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj new file mode 100644 index 00000000..b9a048ef --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj @@ -0,0 +1,170 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {F02517CC-F896-41A2-86E4-509E55C70059} + Win32Proj + civetweb_yassl + + + + Application + true + v110 + MultiByte + + + Application + true + v110 + MultiByte + + + Application + false + v110 + true + MultiByte + + + Application + false + v110 + true + MultiByte + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform) + + + true + $(SolutionDir)\$(Configuration)\$(Platform) + + + false + $(SolutionDir)\$(Configuration)\$(Platform) + + + false + $(SolutionDir)\$(Configuration)\$(Platform) + + + + + + Level3 + Disabled + USE_YASSL;NO_SSL_DL;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + + + + + + + Level3 + Disabled + USE_YASSL;NO_SSL_DL;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + USE_YASSL;NO_SSL_DL;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + USE_YASSL;NO_SSL_DL;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + {8c0c878b-bbd6-4241-bca6-61753ffcc7f1} + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj.filters b/3P/civetweb/VS2012/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj.filters new file mode 100644 index 00000000..1c5ee409 --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj.filters @@ -0,0 +1,40 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + + + Source Files + + + Source Files + + + + + Resource Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj b/3P/civetweb/VS2012/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj new file mode 100644 index 00000000..033b82df --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj @@ -0,0 +1,185 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1} + Win32Proj + yassl_lib + + + + StaticLibrary + true + v110 + MultiByte + + + StaticLibrary + true + v110 + MultiByte + + + StaticLibrary + false + v110 + true + MultiByte + + + StaticLibrary + false + v110 + true + MultiByte + + + + + + + + + + + + + + + + + + + $(SolutionDir)\$(Configuration)\$(Platform) + + + $(SolutionDir)\$(Configuration)\$(Platform) + + + $(SolutionDir)\$(Configuration)\$(Platform) + + + $(SolutionDir)\$(Configuration)\$(Platform) + + + + + + Level3 + Disabled + OPENSSL_EXTRA;HAVE_ERRNO_H;HAVE_GETHOSTBYNAME;HAVE_INET_NTOA;HAVE_LIMITS_H;HAVE_MEMSET;HAVE_SOCKET;HAVE_STDDEF_H;HAVE_STDLIB_H;HAVE_STRING_H;HAVE_SYS_STAT_H;HAVE_SYS_TYPES_H;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + + + + + + + Level3 + Disabled + OPENSSL_EXTRA;HAVE_ERRNO_H;HAVE_GETHOSTBYNAME;HAVE_INET_NTOA;HAVE_LIMITS_H;HAVE_MEMSET;HAVE_SOCKET;HAVE_STDDEF_H;HAVE_STDLIB_H;HAVE_STRING_H;HAVE_SYS_STAT_H;HAVE_SYS_TYPES_H;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + OPENSSL_EXTRA;HAVE_ERRNO_H;HAVE_GETHOSTBYNAME;HAVE_INET_NTOA;HAVE_LIMITS_H;HAVE_MEMSET;HAVE_SOCKET;HAVE_STDDEF_H;HAVE_STDLIB_H;HAVE_STRING_H;HAVE_SYS_STAT_H;HAVE_SYS_TYPES_H;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + OPENSSL_EXTRA;HAVE_ERRNO_H;HAVE_GETHOSTBYNAME;HAVE_INET_NTOA;HAVE_LIMITS_H;HAVE_MEMSET;HAVE_SOCKET;HAVE_STDDEF_H;HAVE_STDLIB_H;HAVE_STRING_H;HAVE_SYS_STAT_H;HAVE_SYS_TYPES_H;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj.filters b/3P/civetweb/VS2012/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj.filters new file mode 100644 index 00000000..566b892b --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj.filters @@ -0,0 +1,124 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/duktape_lib/duktape_lib.vcxproj b/3P/civetweb/VS2012/VS2012/duktape_lib/duktape_lib.vcxproj new file mode 100644 index 00000000..81a4a7dc --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/duktape_lib/duktape_lib.vcxproj @@ -0,0 +1,155 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD} + Win32Proj + duktape_lib + + + + StaticLibrary + true + MultiByte + v100 + + + StaticLibrary + true + v110 + Unicode + + + StaticLibrary + false + true + MultiByte + v100 + + + StaticLibrary + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + TurnOffAllWarnings + Disabled + duktape_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + + + Level3 + Disabled + duktape_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + duktape_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + duktape_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/duktape_lib/duktape_lib.vcxproj.filters b/3P/civetweb/VS2012/VS2012/duktape_lib/duktape_lib.vcxproj.filters new file mode 100644 index 00000000..a5722d68 --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/duktape_lib/duktape_lib.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + + + Source Files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj b/3P/civetweb/VS2012/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj new file mode 100644 index 00000000..f819b723 --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj @@ -0,0 +1,161 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78} + Win32Proj + ex_embed_cpp + + + + Application + true + v100 + MultiByte + + + Application + true + v110 + Unicode + + + Application + false + v100 + true + MultiByte + + + Application + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj.filters b/3P/civetweb/VS2012/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj.filters new file mode 100644 index 00000000..68671e67 --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + diff --git a/3P/civetweb/VS2012/VS2012/ex_embedded_c/ex_embedded_c.vcxproj b/3P/civetweb/VS2012/VS2012/ex_embedded_c/ex_embedded_c.vcxproj new file mode 100644 index 00000000..6aea4cf9 --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/ex_embedded_c/ex_embedded_c.vcxproj @@ -0,0 +1,159 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + {882EC43C-2EEE-434B-A711-C844108D29C6} + Win32Proj + ex_embedded_c + + + + Application + true + v100 + MultiByte + + + Application + true + v110 + Unicode + + + Application + false + v100 + true + MultiByte + + + Application + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + Level3 + Disabled + USE_IPV6;USE_WEBSOCKET;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + USE_WEBSOCKET;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/ex_embedded_c/ex_embedded_c.vcxproj.filters b/3P/civetweb/VS2012/VS2012/ex_embedded_c/ex_embedded_c.vcxproj.filters new file mode 100644 index 00000000..cf2e4d05 --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/ex_embedded_c/ex_embedded_c.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/ex_websocket/ex_websocket.vcxproj b/3P/civetweb/VS2012/VS2012/ex_websocket/ex_websocket.vcxproj new file mode 100644 index 00000000..3ec32e5b --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/ex_websocket/ex_websocket.vcxproj @@ -0,0 +1,160 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {58B93E94-7766-435E-93AE-42A2FB5D99B1} + Win32Proj + ex_websocket + + + + Application + true + MultiByte + + + Application + true + v110 + Unicode + + + Application + false + true + MultiByte + v100 + + + Application + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + Level3 + Disabled + USE_WEBSOCKET;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + + + Level3 + Disabled + USE_WEBSOCKET;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + USE_WEBSOCKET;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + USE_WEBSOCKET;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/ex_websocket/ex_websocket.vcxproj.filters b/3P/civetweb/VS2012/VS2012/ex_websocket/ex_websocket.vcxproj.filters new file mode 100644 index 00000000..9adb8fb6 --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/ex_websocket/ex_websocket.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/ex_websocket_client/ex_websocket_client.vcxproj b/3P/civetweb/VS2012/VS2012/ex_websocket_client/ex_websocket_client.vcxproj new file mode 100644 index 00000000..4705ead3 --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/ex_websocket_client/ex_websocket_client.vcxproj @@ -0,0 +1,158 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {58B93E94-7766-435E-93AE-42A2FB5D99B2} + Win32Proj + ex_websocket_client + + + + Application + true + MultiByte + + + Application + true + v110 + Unicode + + + Application + false + true + MultiByte + v100 + + + Application + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + Level3 + Disabled + USE_WEBSOCKET;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + + + Level3 + Disabled + USE_WEBSOCKET;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + USE_WEBSOCKET;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + USE_WEBSOCKET;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/ex_websocket_client/ex_websocket_client.vcxproj.filters b/3P/civetweb/VS2012/VS2012/ex_websocket_client/ex_websocket_client.vcxproj.filters new file mode 100644 index 00000000..c91ce3eb --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/ex_websocket_client/ex_websocket_client.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/lua_lib/lua_lib.vcxproj b/3P/civetweb/VS2012/VS2012/lua_lib/lua_lib.vcxproj new file mode 100644 index 00000000..d787583c --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/lua_lib/lua_lib.vcxproj @@ -0,0 +1,190 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8} + Win32Proj + lua_lib + + + + StaticLibrary + true + MultiByte + v100 + + + StaticLibrary + true + v110 + Unicode + + + StaticLibrary + false + true + MultiByte + v100 + + + StaticLibrary + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + TurnOffAllWarnings + Disabled + LUA_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + + + Level3 + Disabled + LUA_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + LUA_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + LUA_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/lua_lib/lua_lib.vcxproj.filters b/3P/civetweb/VS2012/VS2012/lua_lib/lua_lib.vcxproj.filters new file mode 100644 index 00000000..657c5f25 --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/lua_lib/lua_lib.vcxproj.filters @@ -0,0 +1,135 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + diff --git a/3P/civetweb/VS2012/VS2012/unit_test/unit_test.vcxproj b/3P/civetweb/VS2012/VS2012/unit_test/unit_test.vcxproj new file mode 100644 index 00000000..14b4437e --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/unit_test/unit_test.vcxproj @@ -0,0 +1,101 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + {1AC4A7A6-0100-4287-97F4-B95807BE5607} + Win32Proj + unit_test + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + v100 + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + Level3 + Disabled + LOCAL_TEST;REPLACE_CHECK_FOR_LOCAL_DEBUGGING;USE_IPV6;USE_WEBSOCKET;MEMORY_DEBUGGING;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src;$(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src;$(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/unit_test/unit_test.vcxproj.filters b/3P/civetweb/VS2012/VS2012/unit_test/unit_test.vcxproj.filters new file mode 100644 index 00000000..1e74b8bd --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/unit_test/unit_test.vcxproj.filters @@ -0,0 +1,60 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + + + Quelldateien + + + Quelldateien + + + Quelldateien + + + Quelldateien + + + Quelldateien + + + Quelldateien + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/upload/upload.vcxproj b/3P/civetweb/VS2012/VS2012/upload/upload.vcxproj new file mode 100644 index 00000000..09292e51 --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/upload/upload.vcxproj @@ -0,0 +1,159 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + {882EC43C-2EEE-434B-A711-C845678D29C6} + Win32Proj + upload + + + + Application + true + v100 + MultiByte + + + Application + true + v110 + Unicode + + + Application + false + v100 + true + MultiByte + + + Application + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + Level3 + Disabled + NO_FILES;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + NO_FILES;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/VS2012/upload/upload.vcxproj.filters b/3P/civetweb/VS2012/VS2012/upload/upload.vcxproj.filters new file mode 100644 index 00000000..fb2d2476 --- /dev/null +++ b/3P/civetweb/VS2012/VS2012/upload/upload.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A322342A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52E765} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AA145} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/buildRelease.pl b/3P/civetweb/VS2012/buildRelease.pl new file mode 100644 index 00000000..df8db092 --- /dev/null +++ b/3P/civetweb/VS2012/buildRelease.pl @@ -0,0 +1,71 @@ +#!/usr/bin/perl +# +# Copyright (c) 2013 No Face Press, LLC +# License http://opensource.org/licenses/mit-license.php MIT License +# + +# This script builds and packages a Windows release. +# It requires ActiveState Perl to use and is intended +# to be run from the its directory under the +# VS Developer Command Prompt. + +# Create a Zip file +use Archive::Zip qw( :ERROR_CODES :CONSTANTS ); +my $zip = Archive::Zip->new(); + +my $src = ".."; + +sub getCivetwebVersion { + print "Fetching CivetWeb version...\n"; + open HEADER, "${src}/include/civetweb.h"; + while (
) { + if (m/define\s+CIVETWEB_VERSION\s+"(.+)"/) { + close HEADER; + return $1; + } + } + close HEADER; + return "UNKNOWN_VERSION"; +} + +my $CIVETWEB_VERSION = getCivetwebVersion(); +my $basename = "civetweb-$CIVETWEB_VERSION"; +my $dir = "${basename}"; + +sub build32() { + print "\nBuilding Win32 Release version...\n"; + system("msbuild /p:Configuration=Release /p:Platform=Win32 civetweb.sln"); +} + +sub build64() { + print "\nBuilding x64 Release version...\n"; + system("msbuild /p:Configuration=Release /p:Platform=x64 civetweb.sln"); +} + +sub writeArchive() { + my $archive = "${basename}-win.zip"; + print "Creating archive $archive ...\n"; + + $zip->addDirectory("${dir}/"); + + $zip->addFile( "${src}/LICENSE.md", "${dir}/LICENSE.md" ); + $zip->addFile( "${src}/README.md", "${dir}/README.md" ); + $zip->addFile( "${src}/resources/systray.ico", "${dir}/systray.ico" ); + $zip->addFile( "${src}/resources/civetweb_64x64.png", + "${dir}/civetweb_64x64.png" ); + $zip->addFile( "${src}/resources/itworks.html", "${dir}/index.html" ); + $zip->addFile( "${src}/VS2012/Release/Win32/civetweb_lua.exe", + "${dir}/civetweb32.exe" ); + $zip->addFile( "${src}/VS2012/Release/x64/civetweb_lua.exe", + "${dir}/civetweb64.exe" ); + + unless ( $zip->writeToFileNamed($archive) == AZ_OK ) { + die 'write error'; + } + +} + +build32(); +build64(); +writeArchive(); +exit 0; diff --git a/3P/civetweb/VS2012/civetweb.sln b/3P/civetweb/VS2012/civetweb.sln new file mode 100644 index 00000000..05e5651e --- /dev/null +++ b/3P/civetweb/VS2012/civetweb.sln @@ -0,0 +1,171 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual C++ Express 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "civetweb_lua", "civetweb_lua\civetweb_lua.vcxproj", "{9BE9C008-E851-42B1-A034-BD4630AE4CD6}" + ProjectSection(ProjectDependencies) = postProject + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD} = {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lua_lib", "lua_lib\lua_lib.vcxproj", "{8F5E5D77-D269-4665-9E27-1045DA6CF0D8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_embedded_c", "ex_embedded_c\ex_embedded_c.vcxproj", "{882EC43C-2EEE-434B-A711-C844108D29C6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit_test", "unit_test\unit_test.vcxproj", "{1AC4A7A6-0100-4287-97F4-B95807BE5607}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_websocket_client", "ex_websocket_client\ex_websocket_client.vcxproj", "{58B93E94-7766-435E-93AE-42A2FB5D99B2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "upload", "upload\upload.vcxproj", "{882EC43C-2EEE-434B-A711-C845678D29C6}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testclient", "..\testutils\testclient\testclient.vcxproj", "{15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Browser", "..\testutils\Browser\Browser.vcxproj", "{277772B0-D4B3-451E-86B6-261FBC645793}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testclient2", "..\testutils\testclient_chunked_linux\testclient2.vcxproj", "{150140C5-2989-4D0D-8714-5A47B78EAD4D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "duktape_lib", "duktape_lib\duktape_lib.vcxproj", "{0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_websocket", "ex_websocket\ex_websocket.vcxproj", "{58B93E94-7766-435E-93AE-42A2FB5D99B1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ex_embed_cpp", "ex_embed_cpp\ex_embed_cpp.vcxproj", "{4308C5EE-45E4-45D8-9D73-6C4E2587AD78}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|Mixed Platforms.ActiveCfg = Debug CONSOLE|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|Mixed Platforms.Build.0 = Debug CONSOLE|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|Win32.ActiveCfg = Debug|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|Win32.Build.0 = Debug|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|x64.ActiveCfg = Debug|x64 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Debug|x64.Build.0 = Debug|x64 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|Mixed Platforms.Build.0 = Release|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|Win32.ActiveCfg = Release|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|Win32.Build.0 = Release|Win32 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|x64.ActiveCfg = Release|x64 + {9BE9C008-E851-42B1-A034-BD4630AE4CD6}.Release|x64.Build.0 = Release|x64 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|Win32.ActiveCfg = Debug|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|Win32.Build.0 = Debug|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|x64.ActiveCfg = Debug|x64 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Debug|x64.Build.0 = Debug|x64 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|Mixed Platforms.Build.0 = Release|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|Win32.ActiveCfg = Release|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|Win32.Build.0 = Release|Win32 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|x64.ActiveCfg = Release|x64 + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8}.Release|x64.Build.0 = Release|x64 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|Win32.ActiveCfg = Debug|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|Win32.Build.0 = Debug|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|x64.ActiveCfg = Debug|x64 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Debug|x64.Build.0 = Debug|x64 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|Mixed Platforms.Build.0 = Release|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|Win32.ActiveCfg = Release|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|Win32.Build.0 = Release|Win32 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|x64.ActiveCfg = Release|x64 + {882EC43C-2EEE-434B-A711-C844108D29C6}.Release|x64.Build.0 = Release|x64 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Debug|Win32.ActiveCfg = Debug|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Debug|Win32.Build.0 = Debug|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Debug|x64.ActiveCfg = Debug|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Release|Mixed Platforms.Build.0 = Release|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Release|Win32.ActiveCfg = Release|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Release|Win32.Build.0 = Release|Win32 + {1AC4A7A6-0100-4287-97F4-B95807BE5607}.Release|x64.ActiveCfg = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Debug|Win32.ActiveCfg = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Debug|Win32.Build.0 = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Debug|x64.ActiveCfg = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Release|Mixed Platforms.Build.0 = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Release|Win32.ActiveCfg = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Release|Win32.Build.0 = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B2}.Release|x64.ActiveCfg = Release|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Debug|Win32.ActiveCfg = Debug|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Debug|Win32.Build.0 = Debug|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Debug|x64.ActiveCfg = Debug|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Release|Mixed Platforms.Build.0 = Release|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Release|Win32.ActiveCfg = Release|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Release|Win32.Build.0 = Release|Win32 + {882EC43C-2EEE-434B-A711-C845678D29C6}.Release|x64.ActiveCfg = Release|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Debug|Win32.ActiveCfg = Debug|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Debug|Win32.Build.0 = Debug|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Debug|x64.ActiveCfg = Debug|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Release|Mixed Platforms.Build.0 = Release|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Release|Win32.ActiveCfg = Release|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Release|Win32.Build.0 = Release|Win32 + {15D6AAA6-36CE-453B-ABBF-3C52BD247EBE}.Release|x64.ActiveCfg = Release|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Debug|Win32.ActiveCfg = Debug|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Debug|Win32.Build.0 = Debug|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Debug|x64.ActiveCfg = Debug|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Release|Mixed Platforms.Build.0 = Release|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Release|Win32.ActiveCfg = Release|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Release|Win32.Build.0 = Release|Win32 + {277772B0-D4B3-451E-86B6-261FBC645793}.Release|x64.ActiveCfg = Release|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Debug|Win32.ActiveCfg = Debug|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Debug|Win32.Build.0 = Debug|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Debug|x64.ActiveCfg = Debug|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Release|Mixed Platforms.Build.0 = Release|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Release|Win32.ActiveCfg = Release|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Release|Win32.Build.0 = Release|Win32 + {150140C5-2989-4D0D-8714-5A47B78EAD4D}.Release|x64.ActiveCfg = Release|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Debug|Win32.ActiveCfg = Debug|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Debug|Win32.Build.0 = Debug|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Debug|x64.ActiveCfg = Debug|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Release|Mixed Platforms.Build.0 = Release|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Release|Win32.ActiveCfg = Release|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Release|Win32.Build.0 = Release|Win32 + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD}.Release|x64.ActiveCfg = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|Win32.ActiveCfg = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|Win32.Build.0 = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Debug|x64.ActiveCfg = Debug|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|Mixed Platforms.Build.0 = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|Win32.ActiveCfg = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|Win32.Build.0 = Release|Win32 + {58B93E94-7766-435E-93AE-42A2FB5D99B1}.Release|x64.ActiveCfg = Release|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|Win32.ActiveCfg = Debug|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|Win32.Build.0 = Debug|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Debug|x64.ActiveCfg = Debug|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|Mixed Platforms.Build.0 = Release|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|Win32.ActiveCfg = Release|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|Win32.Build.0 = Release|Win32 + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78}.Release|x64.ActiveCfg = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/3P/civetweb/VS2012/civetweb_lua/civetweb_lua.vcxproj b/3P/civetweb/VS2012/civetweb_lua/civetweb_lua.vcxproj new file mode 100644 index 00000000..e4d46382 --- /dev/null +++ b/3P/civetweb/VS2012/civetweb_lua/civetweb_lua.vcxproj @@ -0,0 +1,243 @@ + + + + + Debug CONSOLE + Win32 + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {9BE9C008-E851-42B1-A034-BD4630AE4CD6} + Win32Proj + civetweb_lua + + + + Application + true + MultiByte + v100 + + + Application + true + MultiByte + v100 + + + Application + true + v110 + MultiByte + + + Application + true + v110 + MultiByte + + + Application + false + true + MultiByte + v100 + + + Application + false + v110 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + Level3 + Disabled + USE_DUKTAPE;USE_IPV6;LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;$(ProjectDir)..\..\src\third_party\duktape-1.3.0\src;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + + + Level3 + Disabled + USE_DUKTAPE;USE_IPV6;LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;CONSOLE;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;$(ProjectDir)..\..\src\third_party\duktape-1.3.0\src;%(AdditionalIncludeDirectories) + + + Console + true + + + + + + + Level3 + Disabled + LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + + + Level3 + Disabled + LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + USE_DUKTAPE;USE_IPV6;LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;$(ProjectDir)..\..\src\third_party\duktape-1.3.0\src;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + LUA_COMPAT_ALL;USE_LUA;USE_LUA_SQLITE3;USE_LUA_FILE_SYSTEM;USE_WEBSOCKET;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + {8f5e5d77-d269-4665-9e27-1045da6cf0d8} + + + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD} + + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/civetweb_lua/civetweb_lua.vcxproj.filters b/3P/civetweb/VS2012/civetweb_lua/civetweb_lua.vcxproj.filters new file mode 100644 index 00000000..84bc20eb --- /dev/null +++ b/3P/civetweb/VS2012/civetweb_lua/civetweb_lua.vcxproj.filters @@ -0,0 +1,69 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {1ef3413b-2315-48f2-ad22-57af6b4f7aca} + + + + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + + + Resource Files + + + + + Resource Files + + + + + inl files + + + inl files + + + inl files + + + inl files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/civetweb_yassl/civetweb_yassl.sln b/3P/civetweb/VS2012/civetweb_yassl/civetweb_yassl.sln new file mode 100644 index 00000000..49e36ce5 --- /dev/null +++ b/3P/civetweb/VS2012/civetweb_yassl/civetweb_yassl.sln @@ -0,0 +1,36 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "civetweb_yassl", "civetweb_yassl\civetweb_yassl.vcxproj", "{F02517CC-F896-41A2-86E4-509E55C70059}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "yassl_lib", "yassl_lib\yassl_lib.vcxproj", "{8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F02517CC-F896-41A2-86E4-509E55C70059}.Debug|Win32.ActiveCfg = Debug|Win32 + {F02517CC-F896-41A2-86E4-509E55C70059}.Debug|Win32.Build.0 = Debug|Win32 + {F02517CC-F896-41A2-86E4-509E55C70059}.Debug|x64.ActiveCfg = Debug|x64 + {F02517CC-F896-41A2-86E4-509E55C70059}.Debug|x64.Build.0 = Debug|x64 + {F02517CC-F896-41A2-86E4-509E55C70059}.Release|Win32.ActiveCfg = Release|Win32 + {F02517CC-F896-41A2-86E4-509E55C70059}.Release|Win32.Build.0 = Release|Win32 + {F02517CC-F896-41A2-86E4-509E55C70059}.Release|x64.ActiveCfg = Release|x64 + {F02517CC-F896-41A2-86E4-509E55C70059}.Release|x64.Build.0 = Release|x64 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Debug|Win32.ActiveCfg = Debug|Win32 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Debug|Win32.Build.0 = Debug|Win32 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Debug|x64.ActiveCfg = Debug|x64 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Debug|x64.Build.0 = Debug|x64 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Release|Win32.ActiveCfg = Release|Win32 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Release|Win32.Build.0 = Release|Win32 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Release|x64.ActiveCfg = Release|x64 + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/3P/civetweb/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj b/3P/civetweb/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj new file mode 100644 index 00000000..b9a048ef --- /dev/null +++ b/3P/civetweb/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj @@ -0,0 +1,170 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {F02517CC-F896-41A2-86E4-509E55C70059} + Win32Proj + civetweb_yassl + + + + Application + true + v110 + MultiByte + + + Application + true + v110 + MultiByte + + + Application + false + v110 + true + MultiByte + + + Application + false + v110 + true + MultiByte + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform) + + + true + $(SolutionDir)\$(Configuration)\$(Platform) + + + false + $(SolutionDir)\$(Configuration)\$(Platform) + + + false + $(SolutionDir)\$(Configuration)\$(Platform) + + + + + + Level3 + Disabled + USE_YASSL;NO_SSL_DL;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + + + + + + + Level3 + Disabled + USE_YASSL;NO_SSL_DL;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + USE_YASSL;NO_SSL_DL;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + USE_YASSL;NO_SSL_DL;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\include;$(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + {8c0c878b-bbd6-4241-bca6-61753ffcc7f1} + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj.filters b/3P/civetweb/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj.filters new file mode 100644 index 00000000..1c5ee409 --- /dev/null +++ b/3P/civetweb/VS2012/civetweb_yassl/civetweb_yassl/civetweb_yassl.vcxproj.filters @@ -0,0 +1,40 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + + + Source Files + + + Source Files + + + + + Resource Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj b/3P/civetweb/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj new file mode 100644 index 00000000..033b82df --- /dev/null +++ b/3P/civetweb/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj @@ -0,0 +1,185 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {8C0C878B-BBD6-4241-BCA6-61753FFCC7F1} + Win32Proj + yassl_lib + + + + StaticLibrary + true + v110 + MultiByte + + + StaticLibrary + true + v110 + MultiByte + + + StaticLibrary + false + v110 + true + MultiByte + + + StaticLibrary + false + v110 + true + MultiByte + + + + + + + + + + + + + + + + + + + $(SolutionDir)\$(Configuration)\$(Platform) + + + $(SolutionDir)\$(Configuration)\$(Platform) + + + $(SolutionDir)\$(Configuration)\$(Platform) + + + $(SolutionDir)\$(Configuration)\$(Platform) + + + + + + Level3 + Disabled + OPENSSL_EXTRA;HAVE_ERRNO_H;HAVE_GETHOSTBYNAME;HAVE_INET_NTOA;HAVE_LIMITS_H;HAVE_MEMSET;HAVE_SOCKET;HAVE_STDDEF_H;HAVE_STDLIB_H;HAVE_STRING_H;HAVE_SYS_STAT_H;HAVE_SYS_TYPES_H;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + + + + + + + Level3 + Disabled + OPENSSL_EXTRA;HAVE_ERRNO_H;HAVE_GETHOSTBYNAME;HAVE_INET_NTOA;HAVE_LIMITS_H;HAVE_MEMSET;HAVE_SOCKET;HAVE_STDDEF_H;HAVE_STDLIB_H;HAVE_STRING_H;HAVE_SYS_STAT_H;HAVE_SYS_TYPES_H;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + OPENSSL_EXTRA;HAVE_ERRNO_H;HAVE_GETHOSTBYNAME;HAVE_INET_NTOA;HAVE_LIMITS_H;HAVE_MEMSET;HAVE_SOCKET;HAVE_STDDEF_H;HAVE_STDLIB_H;HAVE_STRING_H;HAVE_SYS_STAT_H;HAVE_SYS_TYPES_H;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + OPENSSL_EXTRA;HAVE_ERRNO_H;HAVE_GETHOSTBYNAME;HAVE_INET_NTOA;HAVE_LIMITS_H;HAVE_MEMSET;HAVE_SOCKET;HAVE_STDDEF_H;HAVE_STDLIB_H;HAVE_STRING_H;HAVE_SYS_STAT_H;HAVE_SYS_TYPES_H;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + $(ProjectDir)..\..\..\..\cyassl-2.7.0\;$(ProjectDir)..\..\..\..\cyassl-2.7.0\cyassl\ + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj.filters b/3P/civetweb/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj.filters new file mode 100644 index 00000000..566b892b --- /dev/null +++ b/3P/civetweb/VS2012/civetweb_yassl/yassl_lib/yassl_lib.vcxproj.filters @@ -0,0 +1,124 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/duktape_lib/duktape_lib.vcxproj b/3P/civetweb/VS2012/duktape_lib/duktape_lib.vcxproj new file mode 100644 index 00000000..81a4a7dc --- /dev/null +++ b/3P/civetweb/VS2012/duktape_lib/duktape_lib.vcxproj @@ -0,0 +1,155 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {0A11689C-DB6A-4BF6-97B2-AD32DB863FBD} + Win32Proj + duktape_lib + + + + StaticLibrary + true + MultiByte + v100 + + + StaticLibrary + true + v110 + Unicode + + + StaticLibrary + false + true + MultiByte + v100 + + + StaticLibrary + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + TurnOffAllWarnings + Disabled + duktape_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + + + Level3 + Disabled + duktape_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + duktape_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + duktape_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/duktape_lib/duktape_lib.vcxproj.filters b/3P/civetweb/VS2012/duktape_lib/duktape_lib.vcxproj.filters new file mode 100644 index 00000000..a5722d68 --- /dev/null +++ b/3P/civetweb/VS2012/duktape_lib/duktape_lib.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + + + Source Files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj b/3P/civetweb/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj new file mode 100644 index 00000000..f819b723 --- /dev/null +++ b/3P/civetweb/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj @@ -0,0 +1,161 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {4308C5EE-45E4-45D8-9D73-6C4E2587AD78} + Win32Proj + ex_embed_cpp + + + + Application + true + v100 + MultiByte + + + Application + true + v110 + Unicode + + + Application + false + v100 + true + MultiByte + + + Application + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj.filters b/3P/civetweb/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj.filters new file mode 100644 index 00000000..68671e67 --- /dev/null +++ b/3P/civetweb/VS2012/ex_embed_cpp/ex_embed_cpp.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + diff --git a/3P/civetweb/VS2012/ex_embedded_c/ex_embedded_c.vcxproj b/3P/civetweb/VS2012/ex_embedded_c/ex_embedded_c.vcxproj new file mode 100644 index 00000000..6aea4cf9 --- /dev/null +++ b/3P/civetweb/VS2012/ex_embedded_c/ex_embedded_c.vcxproj @@ -0,0 +1,159 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + {882EC43C-2EEE-434B-A711-C844108D29C6} + Win32Proj + ex_embedded_c + + + + Application + true + v100 + MultiByte + + + Application + true + v110 + Unicode + + + Application + false + v100 + true + MultiByte + + + Application + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + Level3 + Disabled + USE_IPV6;USE_WEBSOCKET;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + USE_WEBSOCKET;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/ex_embedded_c/ex_embedded_c.vcxproj.filters b/3P/civetweb/VS2012/ex_embedded_c/ex_embedded_c.vcxproj.filters new file mode 100644 index 00000000..cf2e4d05 --- /dev/null +++ b/3P/civetweb/VS2012/ex_embedded_c/ex_embedded_c.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/ex_websocket/ex_websocket.vcxproj b/3P/civetweb/VS2012/ex_websocket/ex_websocket.vcxproj new file mode 100644 index 00000000..3ec32e5b --- /dev/null +++ b/3P/civetweb/VS2012/ex_websocket/ex_websocket.vcxproj @@ -0,0 +1,160 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {58B93E94-7766-435E-93AE-42A2FB5D99B1} + Win32Proj + ex_websocket + + + + Application + true + MultiByte + + + Application + true + v110 + Unicode + + + Application + false + true + MultiByte + v100 + + + Application + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + Level3 + Disabled + USE_WEBSOCKET;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + + + Level3 + Disabled + USE_WEBSOCKET;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + USE_WEBSOCKET;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + USE_WEBSOCKET;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/ex_websocket/ex_websocket.vcxproj.filters b/3P/civetweb/VS2012/ex_websocket/ex_websocket.vcxproj.filters new file mode 100644 index 00000000..9adb8fb6 --- /dev/null +++ b/3P/civetweb/VS2012/ex_websocket/ex_websocket.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/ex_websocket_client/ex_websocket_client.vcxproj b/3P/civetweb/VS2012/ex_websocket_client/ex_websocket_client.vcxproj new file mode 100644 index 00000000..4705ead3 --- /dev/null +++ b/3P/civetweb/VS2012/ex_websocket_client/ex_websocket_client.vcxproj @@ -0,0 +1,158 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {58B93E94-7766-435E-93AE-42A2FB5D99B2} + Win32Proj + ex_websocket_client + + + + Application + true + MultiByte + + + Application + true + v110 + Unicode + + + Application + false + true + MultiByte + v100 + + + Application + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + Level3 + Disabled + USE_WEBSOCKET;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + + + Level3 + Disabled + USE_WEBSOCKET;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + USE_WEBSOCKET;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + USE_WEBSOCKET;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/ex_websocket_client/ex_websocket_client.vcxproj.filters b/3P/civetweb/VS2012/ex_websocket_client/ex_websocket_client.vcxproj.filters new file mode 100644 index 00000000..c91ce3eb --- /dev/null +++ b/3P/civetweb/VS2012/ex_websocket_client/ex_websocket_client.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/lua_lib/lua_lib.vcxproj b/3P/civetweb/VS2012/lua_lib/lua_lib.vcxproj new file mode 100644 index 00000000..d787583c --- /dev/null +++ b/3P/civetweb/VS2012/lua_lib/lua_lib.vcxproj @@ -0,0 +1,190 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {8F5E5D77-D269-4665-9E27-1045DA6CF0D8} + Win32Proj + lua_lib + + + + StaticLibrary + true + MultiByte + v100 + + + StaticLibrary + true + v110 + Unicode + + + StaticLibrary + false + true + MultiByte + v100 + + + StaticLibrary + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + TurnOffAllWarnings + Disabled + LUA_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + + + Level3 + Disabled + LUA_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + true + LUA_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + LUA_COMPAT_ALL;THREADSAFE=1;SQLITE_ENABLE_FTS3;SQLITE_ENABLE_FTS3_PARENTHESIS;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Windows + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/lua_lib/lua_lib.vcxproj.filters b/3P/civetweb/VS2012/lua_lib/lua_lib.vcxproj.filters new file mode 100644 index 00000000..657c5f25 --- /dev/null +++ b/3P/civetweb/VS2012/lua_lib/lua_lib.vcxproj.filters @@ -0,0 +1,135 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + diff --git a/3P/civetweb/VS2012/unit_test/unit_test.vcxproj b/3P/civetweb/VS2012/unit_test/unit_test.vcxproj new file mode 100644 index 00000000..14b4437e --- /dev/null +++ b/3P/civetweb/VS2012/unit_test/unit_test.vcxproj @@ -0,0 +1,101 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + {1AC4A7A6-0100-4287-97F4-B95807BE5607} + Win32Proj + unit_test + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + v100 + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + Level3 + Disabled + LOCAL_TEST;REPLACE_CHECK_FOR_LOCAL_DEBUGGING;USE_IPV6;USE_WEBSOCKET;MEMORY_DEBUGGING;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src;$(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\src;$(ProjectDir)..\..\include;$(ProjectDir)..\..\src\third_party\lua-5.2.4\src;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/unit_test/unit_test.vcxproj.filters b/3P/civetweb/VS2012/unit_test/unit_test.vcxproj.filters new file mode 100644 index 00000000..1e74b8bd --- /dev/null +++ b/3P/civetweb/VS2012/unit_test/unit_test.vcxproj.filters @@ -0,0 +1,60 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + Headerdateien + + + + + Quelldateien + + + Quelldateien + + + Quelldateien + + + Quelldateien + + + Quelldateien + + + Quelldateien + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/upload/upload.vcxproj b/3P/civetweb/VS2012/upload/upload.vcxproj new file mode 100644 index 00000000..09292e51 --- /dev/null +++ b/3P/civetweb/VS2012/upload/upload.vcxproj @@ -0,0 +1,159 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + {882EC43C-2EEE-434B-A711-C845678D29C6} + Win32Proj + upload + + + + Application + true + v100 + MultiByte + + + Application + true + v110 + Unicode + + + Application + false + v100 + true + MultiByte + + + Application + false + v110 + true + Unicode + + + + + + + + + + + + + + + + + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + true + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + false + $(SolutionDir)\$(Configuration)\$(Platform)\ + + + + + + Level3 + Disabled + NO_FILES;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + NO_FILES;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + $(ProjectDir)..\..\include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + \ No newline at end of file diff --git a/3P/civetweb/VS2012/upload/upload.vcxproj.filters b/3P/civetweb/VS2012/upload/upload.vcxproj.filters new file mode 100644 index 00000000..fb2d2476 --- /dev/null +++ b/3P/civetweb/VS2012/upload/upload.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A322342A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52E765} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AA145} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/3P/civetweb/appveyor.yml b/3P/civetweb/appveyor.yml new file mode 100644 index 00000000..2c1ff30b --- /dev/null +++ b/3P/civetweb/appveyor.yml @@ -0,0 +1,191 @@ +version: '{build}' + +configuration: + - Release + +platform: + - x86 + - x64 + +environment: + enable_cxx: NO + enable_ssl_dynamic_loading: YES + enable_lua: NO + enable_lua_shared: NO + c_standard: auto + cxx_standard: auto + matrix: + - compiler: msvc-18-seh + build_shared: NO + no_files: NO + enable_ipv6: NO + enable_ssl: YES + enable_websockets: YES + no_cgi: NO + - compiler: msvc-18-seh + build_shared: YES + no_files: NO + enable_ipv6: NO + enable_ssl: YES + enable_websockets: YES + no_cgi: NO + - compiler: msvc-18-seh + build_shared: YES + no_files: YES + enable_ipv6: NO + enable_ssl: YES + enable_websockets: YES + no_cgi: NO + - compiler: gcc-5.1.0-posix + build_shared: NO + no_files: YES + enable_ipv6: NO + enable_ssl: NO + enable_websockets: NO + no_cgi: YES + - compiler: gcc-5.1.0-posix + build_shared: NO + no_files: NO + enable_ipv6: YES + enable_ssl: YES + enable_websockets: YES + no_cgi: NO + - compiler: gcc-5.1.0-posix + build_shared: NO + no_files: NO + enable_ipv6: NO + enable_ssl: YES + enable_websockets: YES + no_cgi: NO + - compiler: gcc-5.1.0-posix + build_shared: YES + no_files: NO + enable_ipv6: NO + enable_ssl: YES + enable_websockets: YES + no_cgi: NO + - compiler: gcc-5.1.0-posix + build_shared: YES + no_files: YES + enable_ipv6: NO + enable_ssl: YES + enable_websockets: YES + no_cgi: NO + + +install: + # Derive some extra information + - set build_type=%configuration% + - for /f "tokens=1-3 delims=-" %%a in ("%compiler%") do (@set "compiler_name=%%a") + - for /f "tokens=1-3 delims=-" %%a in ("%compiler%") do (@set "compiler_version=%%b") + - for /f "tokens=1-3 delims=-" %%a in ("%compiler%") do (@set "compiler_threading=%%c") + - if "%platform%"=="x64" (set arch=x86_64) + - if "%platform%"=="x86" (set arch=i686) + # Download the specific version of MinGW + - if "%compiler_name%"=="gcc" (@set "mingw_output_folder=C:\mingw-builds") + - if "%compiler_name%"=="gcc" ( + @for /f %%a in ( + 'call mingw.cmd + /version "%compiler_version%" + /arch "%arch%" + /threading "%compiler_threading%" + "%mingw_output_folder%"' + ) do @set "compiler_path=%%a" + ) + - if "%compiler_name%"=="gcc" (@set "mingw_log_folder=%mingw_output_folder%\logs") + - if exist "%mingw_log_folder%" @for /f %%f in ('dir /b /oD /tc "%mingw_log_folder%"') do @set "mingw_log_file=%mingw_log_folder%\%%f" + - if exist "%mingw_log_file%" powershell Push-AppveyorArtifact "%mingw_log_file%" -FileName mingw-download.log + # Get OpenSSL + - if not exist C:\ssl\ (md C:\ssl\) + - if not exist C:\ssl\Win32OpenSSL.exe (curl http://slproweb.com/download/Win32OpenSSL-1_0_2d.exe -o C:\ssl\Win32OpenSSL.exe) + - if not exist C:\ssl\Win64OpenSSL.exe (curl http://slproweb.com/download/Win64OpenSSL-1_0_2d.exe -o C:\ssl\Win64OpenSSL.exe) + - C:\ssl\Win32OpenSSL.exe /SILENT /LOG="C:\ssl\install32.log" + - C:\ssl\Win64OpenSSL.exe /SILENT /LOG="C:\ssl\install64.log" + + +before_build: + # Set up mingw commands + - if "%compiler_name%"=="gcc" (set "generator=MinGW Makefiles") + - if "%compiler_name%"=="gcc" (set "build=mingw32-make -j4") + - if "%compiler_name%"=="gcc" (set "test=mingw32-make CTEST_OUTPUT_ON_FAILURE=1 test") + # MSVC specific commands + # Note: The minimum version officially supported for CivetWeb is VS2010. Older ones might work or not. + - if "%compiler_version%"=="14" (set "vs_version=8" & set "vs_year=2005") + - if "%compiler_version%"=="15" (set "vs_version=9" & set "vs_year=2008") + - if "%compiler_version%"=="16" (set "vs_version=10" & set "vs_year=2010") + - if "%compiler_version%"=="17" (set "vs_version=11" & set "vs_year=2012") + - if "%compiler_version%"=="18" (set "vs_version=12" & set "vs_year=2013") + - if "%compiler_version%"=="19" (set "vs_version=14" & set "vs_year=2015") + - if "%compiler_name%"=="msvc" (set "generator=Visual Studio %vs_version% %vs_year%") + - if "%compiler_name%"=="msvc" ( + if "%platform%"=="x64" ( + set "generator=%generator% Win64" + ) + ) + - if %compiler_version% gtr 9 (set platform=%platform:x86=Win32%) + - if "%compiler_name%"=="msvc" (set "msbuild_opts=/clp:OnlyErrors;OnlyWarnings /nologo /m /v:m") + - if "%compiler_name%"=="msvc" (set "build=msbuild %msbuild_opts% /p:Configuration=%configuration% /p:Platform=%platform% civetweb.sln") + - if "%compiler_name%"=="msvc" (set "test=msbuild %msbuild_opts% RUN_TESTS.vcxproj") + # Add the compiler path if needed + - if not "%compiler_path%"=="" (set "PATH=%PATH%;%compiler_path%") + # git bash conflicts with MinGW makefiles + - if "%generator%"=="MinGW Makefiles" (set "PATH=%PATH:C:\Program Files (x86)\Git\bin=%") + # Useful locations + - set "source_path=%cd%" + - set "output_path=%source_path%\output" + - set "build_path=%output_path%\build" + - set "install_path=%output_path%\install" + - set "third_party_dir=C:\third-party" + # Check some settings of the build server + - ver + - cd + - dir + - ipconfig /all + # Generate the build scripts with CMake + - mkdir "%build_path%" + - cd "%build_path%" + - cmake --version + - appveyor AddMessage -Category Information "Generating '%generator%'" + - cmake + -G "%generator%" + -DCMAKE_BUILD_TYPE=%build_type% + -DBUILD_SHARED_LIBS=%build_shared% + -DCIVETWEB_SERVE_NO_FILES=%no_files% + "-DCIVETWEB_THIRD_PARTY_DIR=%third_party_dir:\=\\%" + -DCIVETWEB_ENABLE_THIRD_PARTY_OUTPUT=YES + -DCIVETWEB_ENABLE_SSL=%enable_ssl% + -DCIVETWEB_DISABLE_CGI=%no_cgi% + -DCIVETWEB_ENABLE_SSL_DYNAMIC_LOADING=%enable_ssl_dynamic_loading% + -DCIVETWEB_ENABLE_WEBSOCKETS=%enable_websockets% + -DCIVETWEB_ENABLE_CXX=%enable_cxx% + -DCIVETWEB_ENABLE_LUA=%enable_lua% + -DCIVETWEB_ENABLE_LUA_SHARED=%enable_lua_shared% + -DCIVETWEB_C_STANDARD=%c_standard% + -DCIVETWEB_CXX_STANDARD=%cxx_standard% + "%source_path%" + - powershell Push-AppveyorArtifact CMakeCache.txt + - cd "%source_path%" + +build_script: + - cd + - cd "%build_path%" + - appveyor AddMessage -Category Information "Build command '%build%'" + - cmd /c "%build%" + - cd "%source_path%" + +test_script: + - cd "%build_path%" + - appveyor AddMessage -Category Information "Test command '%build%'" + - cmd /c "%test%" + - cd "%source_path%" + +after_test: + - cmake "-DCMAKE_INSTALL_PREFIX=%install_path%" -P "%build_path%/cmake_install.cmake" + +matrix: + fast_finish: true + +cache: + - C:\mingw-builds -> mingw.cmd + - C:\third-party -> **\CMakeLists.txt + - C:\ssl diff --git a/3P/civetweb/build b/3P/civetweb/build new file mode 100755 index 00000000..2b423108 --- /dev/null +++ b/3P/civetweb/build @@ -0,0 +1,138 @@ +#!/bin/sh +set -euo pipefail +IFS=$'\n\t' + +stdout() { + cat <<< "$@" +} + +stderr() { + cat <<< "$@" 1>&2 +} + +prereqs () { + local E_BADARGS=65 + if [ $# -eq 0 ]; then + stderr "Usage: $(basename $0) [prerequisite_program] [another_program...]" + return $E_BADARGS + fi + for prog in $@; do + hash $prog 2>&- + if [ $? -ne 0 ]; then + return 1 + fi + done +} + +usage() { + if [ $# -ne 0 ]; then + stdout $@ + fi + stdout "Usage: $(basename $0) [options]" + stdout + stdout "A convenience script to quickly build the library with CMake." + stdout + stdout "Options:" + stdout " [--shared|(--static)] Builds either a static or a shared library" + stdout " [--debug|(--release)] Builds a certain variant of the library" + stdout " -g,--generator name The CMake generator to use ('Unix Makefiles')" + stdout " -o,--output folder The place to output the build files (./output)" + stdout + stdout "Examples:" + stdout " ./build" + stdout " ./build --shared --debug" + stdout " ./build --static --release -o ~/my-output-folder" +} + +check() { + local E_BADARGS=65 + if [ $# -ne 1 ]; then + stderr "Usage: check prerequisite_program" + return $E_BADARGS + fi + prereqs $1 + if [ $? -ne 0 ]; then + stderr "Failed to find `$1` on the command line:" + stderr "Please install it with your package manager" + return 1 + fi +} + +sanitize() { + local E_BADARGS=65 + if [ $# -ne 1 ]; then + stderr "Usage: sanitize string_to_clean" + return $E_BADARGS + fi + echo $(echo "$1" | sed "s|[^A-Za-z]\+|-|g" | tr '[:upper:]' '[:lower:]') + return 0 +} + +build () { + # Get the build locations + local src_dir=$(cd $(dirname $0); pwd -P) + + # Arguments + local E_BADARGS=65 + local generator="Unix Makefiles" + local shared=NO + local build_type=Release + local output_dir="${src_dir}/output" + while (( "$#" )); do + case "$1" in + --debug) build_type=Release;; + --release) build_type=Debug;; + --shared) shared=YES;; + --static) shared=NO;; + --output) shift; out="$1";; + -o) shift; output_dir="$1";; + --generator) shift; generator="$1";; + -g) shift; generator="$1";; + --help) usage; return 0;; + --) shift; break;; + -*) usage "Bad argument $1"; return ${E_BADARGS};; + *) break;; + esac + shift + done + + # Update the build folder + local build_dir=${output_dir}/build + local install_dir=${output_dir}/install + + # Create the build folder + mkdir -p ${build_dir} + + # Enter the build folder + cd ${build_dir} + trap 'cd ${src_dir}' INT TERM EXIT + + # Do the CMake configuration + check cmake + cmake -G ${generator} -DCMAKE_BUILD_TYPE=${build_type} -DBUILD_SHARED_LIBS:BOOL=${shared} ${src_dir} + + # Do the build + if [ "${generator}" = "Unix Makefiles" ]; then + check make + make all test + else + stderr "Unknown build system for ${generator}, go to ${build_dir} and run the correct build program" + fi + + # Do the install + cmake -DCMAKE_INSTALL_PREFIX="${install_dir}" -P "${build_dir}/cmake_install.cmake" + + # Return to the correct folder + trap - INT TERM EXIT + cd ${src_dir} + + # Notify the user + stdout "Built files are available at ${install_dir}" +} + +# If the script was not sourced we need to run the function +case "$0" in + *"build") + build "$@" + ;; +esac diff --git a/3P/civetweb/build.cmd b/3P/civetweb/build.cmd new file mode 100644 index 00000000..6c1df160 --- /dev/null +++ b/3P/civetweb/build.cmd @@ -0,0 +1,866 @@ +:: Make sure the extensions are enabled +@verify other 2>nul +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + call :print_usage "Failed to enable extensions" + exit /b 1 +) + +::Change the code page to unicode +@chcp 65001 1>nul 2>nul +@if errorlevel 1 ( + call :print_usage "Failed to change the code page to unicode" + exit /b 1 +) + +:: Set up some global variables +@set project=civetweb +@set "script_name=%~nx0" +@set "script_folder=%~dp0" +@set "script_folder=%script_folder:~0,-1%" +@set "output_path=%script_folder%\output" +@set "build_path=%output_path%\build" +@set "install_path=%output_path%\install" +@set build_shared=OFF +@set build_type=Release +@set dependency_path=%TEMP%\%project%-build-dependencies + +:: Check the command line parameters +@set logging_level=1 +@set "options=%* " +@if not "!options!"=="!options:/? =!" set usage="Convenience script to build %project% with CMake" +@for %%a in (%options%) do @( + @set arg=%%~a + @set arg=!arg: =! + @set one=!arg:~0,1! + @set two=!arg:~0,2! + @if /i [!arg!] == [/q] set quiet=true + @if /i [!two!] == [/v] call :verbosity "!arg!" + @if /i [!arg!] == [/s] set build_shared=ON + @if /i [!arg!] == [/d] set build_type=Debug + @if /i not [!one!] == [/] ( + if not defined generator ( + set generator=!arg! + ) else ( + set usage="Too many generators: !method! !arg!" ^ + "There should only be one generator parameter" + ) + ) +) +@if defined quiet ( + set logging_level=0 +) +@if not defined generator ( + set generator=MSVC +) +@if /i not [%generator%] == [MinGW] ( + if /i not [%generator%] == [MSVC] ( + call :print_usage "Invalid argument: %generator%" + exit /b 1 + ) +) + +:: Set up the logging +@set log_folder=%output_path%\logs +@call :iso8601 timestamp +@set log_path=%log_folder%\%timestamp%.log +@set log_keep=10 + +:: Only keep a certain amount of logs +@set /a "log_keep=log_keep-1" +@if not exist %log_folder% @mkdir %log_folder% +@for /f "skip=%log_keep%" %%f in ('dir /b /o-D /tc %log_folder%') do @( + call :log 4 "Removing old log file %log_folder%\%%f" + del %log_folder%\%%f +) + +:: Set up some more global variables +@call :architecture arch +@call :windows_version win_ver win_ver_major win_ver_minor win_ver_rev +@call :script_source script_source +@if [%script_source%] == [explorer] ( + set /a "logging_level=logging_level+1" +) + +:: Print the usage or start the script +@set exit_code=0 +@if defined usage ( + call :print_usage %usage% +) else ( + call :main + @if errorlevel 1 ( + @call :log 0 "Failed to build the %project% project" + @set exit_code=1 + ) +) + +:: Tell the user where the built files are +@call :log 5 +@call :log 0 "The built files are available in %install_path%" + +:: Stop the script if the user double clicked +@if [%script_source%] == [explorer] ( + pause +) + +@exit /b %exit_code% +@endlocal +@goto :eof + +:: -------------------------- Functions start here ---------------------------- + +:main - Main function that performs the build +@setlocal +@call :log 6 +@call :log 2 "Welcome to the %project% build script" +@call :log 6 "------------------------------------" +@call :log 6 +@call :log 2 "This script builds the project using CMake" +@call :log 6 +@call :log 2 "Generating %generator%..." +@call :log 6 +@set methods=dependencies ^ + generate ^ + build ^ + install +@for %%m in (%methods%) do @( + call :log 3 "Excuting the '%%m' method" + call :log 8 + call :%%~m + if errorlevel 1 ( + call :log 0 "Failed to complete the '%%~m' dependency routine" + call :log 0 "View the log at %log_path%" + exit /b 1 + ) +) +@call :log 6 "------------------------------------" +@call :log 2 "Build complete" +@call :log 6 +@endlocal +@goto :eof + +:print_usage - Prints the usage of the script +:: %* - message to print, each argument on it's own line +@setlocal +@for %%a in (%*) do @echo.%%~a +@echo. +@echo.build [/?][/v[v...]^|/q][MinGW^|MSVC] +@echo. +@echo. [MinGW^|(MSVC)] +@echo. Builds the library with one of the compilers +@echo. /s Builds shared libraries +@echo. /d Builds a debug variant of the project +@echo. /v Sets the output to be more verbose +@echo. /v[v...] Extra verbosity, /vv, /vvv, etc +@echo. /q Quiets the output +@echo. /? Shows this usage message +@echo. +@endlocal +@goto :eof + +:dependencies - Installs any prerequisites for the build +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + call :log 0 "Failed to enable extensions" + exit /b 1 +) +@call :log 5 +@call :log 0 "Installing dependencies for %generator%" +@if /i [%generator%] == [MinGW] ( + call :mingw compiler_path + @if errorlevel 1 ( + @call :log 5 + @call :log 0 "Failed to find MinGW" + @exit /b 1 + ) + set "PATH=!compiler_path!;%PATH%" + @call :find_in_path gcc_executable gcc.exe + @if errorlevel 1 ( + @call :log 5 + @call :log 0 "Failed to find gcc.exe" + @exit /b 1 + ) +) +@if [%reboot_required%] equ [1] call :reboot +@endlocal & set "PATH=%PATH%" +@goto :eof + +:generate - Uses CMake to generate the build files +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + call :log 0 "Failed to enable extensions" + exit /b 1 +) +@call :log 5 +@call :log 0 "Generating CMake files for %generator%" +@call :cmake cmake_executable +@if errorlevel 1 ( + @call :log 5 + @call :log 0 "Need CMake to create the build files" + @exit /b 1 +) +@if /i [%generator%] == [MinGW] @( + @set "generator_var=-G "MinGW Makefiles^"" +) +@if /i [%generator%] == [MSVC] @( + rem We could figure out the correct MSVS generator here +) +@call :iso8601 iso8601 +@set output=%temp%\cmake-%iso8601%.log +@if not exist %build_path% mkdir %build_path% +@cd %build_path% +@"%cmake_executable%" ^ + !generator_var! ^ + -DCMAKE_BUILD_TYPE=!build_type! ^ + -DBUILD_SHARED_LIBS=!build_shared! ^ + "%script_folder%" > "%output%" +@if errorlevel 1 ( + @call :log 5 + @call :log 0 "Failed to generate build files with CMake" + @call :log_append "%output%" + @cd %script_folder% + @exit /b 1 +) +@cd %script_folder% +@endlocal +@goto :eof + +:build - Builds the library +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + call :log 0 "Failed to enable extensions" + exit /b 1 +) +@call :log 5 +@call :log 0 "Building %project% with %generator%" +@if /i [%generator%] == [MinGW] @( + @call :find_in_path mingw32_make_executable mingw32-make.exe + @if errorlevel 1 ( + @call :log 5 + @call :log 0 "Failed to find mingw32-make" + @exit /b 1 + ) + @set "build_command=^"!mingw32_make_executable!^" all test" +) +@if /i [%generator%] == [MSVC] @( + @call :msbuild msbuild_executable + @if errorlevel 1 ( + @call :log 5 + @call :log 0 "Failed to find MSBuild" + @exit /b 1 + ) + @set "build_command=^"!msbuild_executable!^" /m:4 /p:Configuration=%build_type% %project%.sln" +) +@if not defined build_command ( + @call :log 5 + @call :log 0 "No build command for %generator%" + @exit /b 1 +) +@cd %build_path% +@call :iso8601 iso8601 +@set output=%temp%\build-%iso8601%.log +@call :log 7 +@call :log 2 "Build command: %build_command:"=%" +@%build_command% > "%output%" +@if errorlevel 1 ( + @call :log_append "%output%" + @call :log 5 + @call :log 0 "Failed to complete the build" + @exit /b 1 +) +@call :log_append "%output%" +@cd %script_folder% +@endlocal +@goto :eof + +:install - Installs the built files +@setlocal +@call :log 5 +@call :log 0 "Installing built files" +@call :cmake cmake_executable +@if errorlevel 1 ( + @call :log 5 + @call :log 0 "Need CMake to install the built files" + @exit /b 1 +) +@call :iso8601 iso8601 +@set output=%temp%\install-%iso8601%.log +@"%cmake_executable%" ^ + "-DCMAKE_INSTALL_PREFIX=%install_path%" ^ + -P "%build_path%/cmake_install.cmake" ^ + > "%output%" +@if errorlevel 1 ( + @call :log_append "%output%" + @call :log 5 + @call :log 0 "Failed to install the files" + @exit /b 1 +) +@call :log_append "%output%" +@endlocal +@goto :eof + +:script_source - Determines if the script was ran from the cli or explorer +:: %1 - The return variable [cli|explorer] +@verify other 2>nul +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + call :log 0 "Failed to enable extensions" + exit /b 1 +) +@call :log 3 "Attempting to detect the script source" +@echo "The invocation command was: '%cmdcmdline%'" >> %log_path% +@for /f "tokens=1-3,*" %%a in ("%cmdcmdline%") do @( + set cmd=%%~a + set arg1=%%~b + set arg2=%%~c + set rest=%%~d +) +@set quote=" +@if "!arg2:~0,1!" equ "!quote!" ( + if "!arg2:~-1!" neq "!quote!" ( + set "arg2=!arg2:~1!" + ) +) +@call :log 4 "cmd = %cmd%" +@call :log 4 "arg1 = %arg1%" +@call :log 4 "arg2 = %arg2%" +@call :log 4 "rest = %rest%" +@call :log 4 "src = %~f0" +@if /i "%arg2%" == "call" ( + set script_source=cli +) else ( + @if /i "%arg1%" == "/c" ( + set script_source=explorer + ) else ( + set script_source=cli + ) +) +@call :log 3 "The script was invoked from %script_source%" +@endlocal & set "%~1=%script_source%" +@goto :eof + +:architecture - Finds the system architecture +:: %1 - The return variable [x86|x86_64] +@setlocal +@call :log 3 "Determining the processor architecture" +@set "key=HKLM\System\CurrentControlSet\Control\Session Manager\Environment" +@set "var=PROCESSOR_ARCHITECTURE" +@for /f "skip=2 tokens=2,*" %%a in ('reg query "%key%" /v "%var%"') do @set "arch=%%b" +@if "%arch%" == "AMD64" set arch=x86_64 +@call :log 4 "arch = %arch%" +@endlocal & set "%~1=%arch%" +@goto :eof + +:md5 - Gets the MD5 checksum for a file +:: %1 - The hash +:: %2 - The file path +@setlocal +@set var=%~1 +@set file_path=%~2 +@if [%var%] == [] exit /b 1 +@if "%file_path%" == "" exit /b 1 +@if not exist "%file_path%" exit /b 1 +@for /f "skip=3 tokens=1,*" %%a in ('powershell Get-FileHash -Algorithm MD5 "'%file_path%'"') do @set hash=%%b +@if not defined hash ( + call :log 6 + call :log 0 "Failed to get MD5 hash for %file_path%" + exit /b 1 +) +@endlocal & set "%var%=%hash: =%" +@goto :eof + +:windows_version - Checks the windows version +:: %1 - The windows version +:: %2 - The major version number return variable +:: %3 - The minor version number return variable +:: %4 - The revision version number return variable +@setlocal +@call :log 3 "Retrieving the Windows version" +@for /f "tokens=2 delims=[]" %%x in ('ver') do @set win_ver=%%x +@set win_ver=%win_ver:Version =% +@set win_ver_major=%win_ver:~0,1% +@set win_ver_minor=%win_ver:~2,1% +@set win_ver_rev=%win_ver:~4% +@call :log 4 "win_ver = %win_ver%" +@endlocal & set "%~1=%win_ver%" ^ + & set "%~2=%win_ver_major%" ^ + & set "%~3=%win_ver_minor%" ^ + & set "%~4=%win_ver_rev%" +@goto :eof + +:find_in_path - Finds a program of file in the PATH +@setlocal +@set var=%~1 +@set file=%~2 +@if [%var%] == [] exit /b 1 +@if [%file%] == [] exit /b 1 +@call :log 3 "Searching PATH for %file%" +@for %%x in ("%file%") do @set "file_path=%%~f$PATH:x" +@if not defined file_path exit /b 1 +@endlocal & set "%var%=%file_path%" +@goto :eof + +:administrator_check - Checks for administrator priviledges +@setlocal +@call :log 2 "Checking for administrator priviledges" +@set "key=HKLM\Software\VCA\Tool Chain\Admin Check" +@reg add "%key%" /v Elevated /t REG_DWORD /d 1 /f > nul 2>&1 +@if errorlevel 1 exit /b 1 +@reg delete "%key%" /va /f > nul 2>&1 +@endlocal +@goto :eof + +:log_append - Appends another file into the current logging file +:: %1 - the file_path to the file to concatenate +@setlocal +@set "file_path=%~1" +@if [%file_path%] == [] exit /b 1 +@call :log 3 "Appending to log: %file_path%" +@call :iso8601 iso8601 +@set "temp_log=%temp%\append-%iso8601%.log" +@call :log 4 "Using temp file %temp_log%" +@type "%log_path%" "%file_path%" > "%temp_log%" 2>nul +@move /y "%temp_log%" "%log_path%" 1>nul +@del "%file_path%" 2>nul +@del "%temp_log%" 2>nul +@endlocal +@goto :eof + +:iso8601 - Returns the current time in ISO8601 format +:: %1 - the return variable +:: %2 - format [extended|basic*] +:: iso8601 - contains the resulting timestamp +@setlocal +@wmic Alias /? >NUL 2>&1 || @exit /b 1 +@set "var=%~1" +@if "%var%" == "" @exit /b 1 +@set "format=%~2" +@if "%format%" == "" set format=basic +@for /F "skip=1 tokens=1-6" %%g IN ('wmic Path Win32_UTCTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') do @( + @if "%%~l"=="" goto :iso8601_done + @set "yyyy=%%l" + @set "mm=00%%j" + @set "dd=00%%g" + @set "hour=00%%h" + @set "minute=00%%i" + @set "seconds=00%%k" +) +:iso8601_done +@set mm=%mm:~-2% +@set dd=%dd:~-2% +@set hour=%hour:~-2% +@set minute=%minute:~-2% +@set seconds=%seconds:~-2% +@if /i [%format%] == [extended] ( + set iso8601=%yyyy%-%mm%-%dd%T%hour%:%minute%:%seconds%Z +) else ( + if /i [%format%] == [basic] ( + set iso8601=%yyyy%%mm%%dd%T%hour%%minute%%seconds%Z + ) else ( + @exit /b 1 + ) +) +@set iso8601=%iso8601: =0% +@endlocal & set %var%=%iso8601% +@goto :eof + +:verbosity - Processes the verbosity parameter '/v[v...] +:: %1 - verbosity given on the command line +:: logging_level - set to the number of v's +@setlocal +@set logging_level=0 +@set verbosity=%~1 +:verbosity_loop +@set verbosity=%verbosity:~1% +@if not [%verbosity%] == [] @( + set /a "logging_level=logging_level+1" + goto verbosity_loop +) +@endlocal & set logging_level=%logging_level% +@goto :eof + +:log - Logs a message, depending on verbosity +:: %1 - level +:: [0-4] for CLI logging +:: [5-9] for GUI logging +:: %2 - message to print +@setlocal +@set "level=%~1" +@set "msg=%~2" +@if "%log_folder%" == "" ( + echo Logging was used to early in the script, log_folder isn't set yet + goto :eof +) +@if "%log_path%" == "" ( + echo Logging was used to early in the script, log_path isn't set yet + goto :eof +) +@if not exist "%log_folder%" mkdir "%log_folder%" +@if not exist "%log_path%" echo. 1>nul 2>"%log_path%" +@echo.%msg% >> "%log_path%" +@if %level% geq 5 ( + @if [%script_source%] == [explorer] ( + set /a "level=level-5" + ) else ( + @goto :eof + ) +) +@if "%logging_level%" == "" ( + echo Logging was used to early in the script, logging_level isn't set yet + goto :eof +) +@if %logging_level% geq %level% echo.%msg% 1>&2 +@endlocal +@goto :eof + + +:start_browser - Opens the default browser to a URL +:: %1 - the url to open +@setlocal +@set url=%~1 +@call :log 4 "Opening default browser: %url%" +@start %url% +@endlocal +@goto :eof + +:find_cmake - Finds cmake on the command line or in the registry +:: %1 - the cmake file path +@setlocal +@set var=%~1 +@if [%var%] == [] exit /b 1 +@call :log 6 +@call :log 6 "Finding CMake" +@call :log 6 "--------------" +@call :find_in_path cmake_executable cmake.exe +@if not errorlevel 1 goto found_cmake +@for /l %%i in (5,-1,0) do @( +@for /l %%j in (9,-1,0) do @( +@for /l %%k in (9,-1,0) do @( +@for %%l in (HKCU HKLM) do @( +@for %%m in (SOFTWARE SOFTWARE\Wow6432Node) do @( + @reg query "%%l\%%m\Kitware\CMake %%i.%%j.%%k" /ve > nul 2>nul + @if not errorlevel 1 ( + @for /f "skip=2 tokens=2,*" %%a in ('reg query "%%l\%%m\Kitware\CMake %%i.%%j.%%k" /ve') do @( + @if exist "%%b\bin\cmake.exe" ( + @set "cmake_executable=%%b\bin\cmake.exe" + goto found_cmake + ) + ) + ) +))))) +@call :log 5 +@call :log 0 "Failed to find cmake" +@exit /b 1 +:found_cmake +@endlocal & set "%var%=%cmake_executable%" +@goto :eof + +:cmake - Finds cmake and installs it if necessary +:: %1 - the cmake file path +@setlocal +@set var=%~1 +@if [%var%] == [] exit /b 1 +@call :log 6 +@call :log 6 "Checking for CMake" +@call :log 6 "------------------" +@call :find_cmake cmake_executable cmake.exe +@if not errorlevel 1 goto got_cmake +@set checksum=C00267A3D3D9619A7A2E8FA4F46D7698 +@set version=3.2.2 +@call :install_nsis cmake http://www.cmake.org/files/v%version:~0,3%/cmake-%version%-win32-x86.exe %checksum% +@if errorlevel 1 ( + call :log 5 + call :log 0 "Failed to install cmake" + @exit /b 1 +) +@call :find_cmake cmake_executable cmake.exe +@if not errorlevel 1 goto got_cmake +@call :log 5 +@call :log 0 "Failed to check for cmake" +@exit /b 1 +:got_cmake +@endlocal & set "%var%=%cmake_executable%" +@goto :eof + +:mingw - Finds MinGW, installing it if needed +:: %1 - the compiler path that should be added to PATH +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + @call :log 5 + @call :log 0 "Failed to enable extensions" + @exit /b 1 +) +@set var=%~1 +@if [%var%] == [] exit /b 1 +@call :log 6 +@call :log 6 "Checking for MinGW" +@call :log 6 "------------------" +@call :find_in_path gcc_executable gcc.exe +@if not errorlevel 1 ( + @for %%a in ("%gcc_executable%") do @set "compiler_path=%%~dpa" + goto got_mingw +) +@call :log 7 +@call :log 2 "Downloading MinGW" +@if %logging_level% leq 1 set "logging=/q" +@if %logging_level% gtr 1 set "logging=/v" +@set output_path= +@for /f %%a in ('call + "%script_folder%\mingw.cmd" + %logging% + /arch "%arch%" + "%dependency_path%"' +) do @set "compiler_path=%%a\" +@if not defined compiler_path ( + @call :log_append "%output%" + @call :log 5 + @call :log 0 "Failed to download MinGW" + @exit /b 1 +) +:got_mingw +@call :log 5 +@call :log 0 "Found MinGW: %compiler_path%gcc.exe" +@endlocal & set "%var%=%compiler_path%" +@goto :eof + +:msbuild - Finds MSBuild +:: %1 - the path to MSBuild executable +@setlocal +@set var=%~1 +@if [%var%] == [] exit /b 1 +@call :find_in_path msbuild_executable msbuild.exe +@if not errorlevel 1 goto got_msbuild +@for /l %%i in (20,-1,4) do @( +@for /l %%j in (9,-1,0) do @( +@for %%k in (HKCU HKLM) do @( +@for %%l in (SOFTWARE SOFTWARE\Wow6432Node) do @( + @reg query "%%k\%%l\Microsoft\MSBuild\%%i.%%j" /v MSBuildOverrideTasksPath > nul 2>nul + @if not errorlevel 1 ( + @for /f "skip=2 tokens=2,*" %%a in ('reg query "%%k\%%l\Microsoft\MSBuild\%%i.%%j" /v MSBuildOverrideTasksPath') do @( + @if exist "%%bmsbuild.exe" ( + @set "msbuild_executable=%%bmsbuild.exe" + goto got_msbuild + ) + ) + ) +)))) +@call :log 5 +@call :log 0 "Failed to check for MSBuild" +@exit /b 1 +:got_msbuild +@endlocal & set "%var%=%msbuild_executable%" +@goto :eof + +:download - Downloads a file from the internet +:: %1 - the url of the file to download +:: %2 - the file to download to +:: %3 - the MD5 checksum of the file (optional) +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + call :print_usage "Failed to enable extensions" + exit /b 1 +) +@set url=%~1 +@set file_path=%~2 +@set checksum=%~3 +@for %%a in (%file_path%) do @set dir_path=%%~dpa +@for %%a in (%file_path%) do @set file_name=%%~nxa +@if [%url%] == [] exit /b 1 +@if [%file_path%] == [] exit /b 1 +@if [%dir_path%] == [] exit /b 1 +@if [%file_name%] == [] exit /b 1 +@if not exist "%dir_path%" mkdir "%dir_path%" +@call :log 1 "Downloading %url%" +@call :iso8601 iso8601 +@set temp_path=%temp%\download-%iso8601%-%file_name% +@call :log 3 "Using temp file %temp_path%" +@powershell Invoke-WebRequest "%url%" -OutFile %temp_path% +@if errorlevel 1 ( + call :log 0 "Failed to download %url%" + exit /b 1 +) +@if [%checksum%] neq [] ( + @call :log 4 "Checking %checksum% against %temp_path%" + @call :md5 hash "%temp_path%" + if "!hash!" neq "%checksum%" ( + call :log 0 "Failed to match checksum: %temp_path%" + call :log 0 "Hash : !hash!" + call :log 0 "Checksum: %checksum%" + exit /b 1 + ) else ( + call :log 3 "Checksum matched: %temp_path%" + call :log 3 "Hash : !hash!" + call :log 3 "Checksum: %checksum%" + ) +) +@call :log 4 "Renaming %temp_path% to %file_path%" +@move /y "%temp_path%" "%file_path%" 1>nul +@endlocal +@goto :eof + +:install_msi - Installs a dependency from an Microsoft Installer package (.msi) +:: %1 - [string] name of the project to install +:: %2 - The location of the .msi, a url must start with 'http://' or file_path +:: %3 - The checksum of the msi (optional) +@setlocal +@set name=%~1 +@set file_path=%~2 +@set checksum=%~3 +@set msi=%~nx2 +@set msi_path=%dependency_path%\%msi% +@if [%name%] == [] exit /b 1 +@if [%file_path%] == [] exit /b 1 +@if [%msi%] == [] exit /b 1 +@if [%msi_path%] == [] exit /b 1 +@for %%x in (msiexec.exe) do @set "msiexec_path=%%~f$PATH:x" +@if "msiexec_path" == "" ( + call :log 0 "Failed to find the Microsoft package installer (msiexec.exe)" + call :log 6 + call :log 0 "Please install it from the Microsoft Download center" + call :log 6 + choice /C YN /T 60 /D N /M "Would you like to go there now?" + if !errorlevel! equ 1 call :start_browser ^ + "http://search.microsoft.com/DownloadResults.aspx?q=Windows+Installer" + exit /b 1 +) +@call :log 6 +@call :log 1 "Installing the '%name%' dependency" +@call :log 6 "-------------------------------------" +@call :administrator_check +@if errorlevel 1 ( + call :log 0 "You must run %~nx0 in elevated mode to install '%name%'" + call :log 5 "Right-Click and select 'Run as Administrator' + call :log 0 "Install the dependency manually by running %file_path%" + @exit /b 740 +) +@if [%file_path:~0,4%] == [http] ( + if not exist "%msi_path%" ( + call :download "%file_path%" "%msi_path%" %checksum% + if errorlevel 1 ( + call :log 0 "Failed to download the %name% dependency" + exit /b 1 + ) + ) +) else ( + call :log 2 "Copying MSI %file_path% to %msi_path%" + call :log 7 + if not exist "%msi_path%" ( + xcopy /q /y /z "%file_path%" "%msi_path%" 1>nul + if errorlevel 1 ( + call :log 0 "Failed to copy the Microsoft Installer" + exit /b 1 + ) + ) +) +@call :log 1 "Running the %msi%" +@call :log 6 +@set msi_log=%temp%\msiexec-%timestamp%.log +@call :log 3 "Logging to: %msi_log%" +@msiexec /i "%msi_path%" /passive /log "%msi_log%" ALLUSERS=1 +@set msi_errorlevel=%errorlevel% +@call :log_append "%msi_log%" +@if %msi_errorlevel% equ 0 goto install_msi_success +@if %msi_errorlevel% equ 3010 goto install_msi_success_reboot +@if %msi_errorlevel% equ 1641 goto install_msi_success_reboot +@if %msi_errorlevel% equ 3015 goto install_msi_in_progress_reboot +@if %msi_errorlevel% equ 1615 goto install_msi_in_progress_reboot +@call :log 0 "Microsoft Installer failed: %msi_errorlevel%" +@call :log 0 "Install the dependency manually by running %msi_path%" +@exit /b 1 +:install_msi_in_progress_reboot +@call :log 0 "The installation requires a reboot to continue" +@call :log 5 +@call :reboot +@exit /b 1 +:install_msi_success_reboot +@call :log 3 "The installation requires a reboot to be fully functional" +@set reboot_required=1 +:install_msi_success +@call :log 2 "Successfully installed %name%" +@call :log 7 +@endlocal & set reboot_required=%reboot_required% +@goto :eof + +:install_nsis - Installs a dependency from an Nullsoft Installer package (.exe) +:: %1 - [string] name of the project to install +:: %2 - The location of the .exe, a url must start with 'http://' or file_path +:: %3 - The checksum of the exe (optional) +@setlocal +@set name=%~1 +@set file_path=%~2 +@set checksum=%~3 +@set exe=%~nx2 +@set exe_path=%dependency_path%\%exe% +@if [%name%] == [] exit /b 1 +@if [%file_path%] == [] exit /b 1 +@if [%exe%] == [] exit /b 1 +@if [%exe_path%] == [] exit /b 1 +@call :log 6 +@call :log 1 "Installing the '%name%' dependency" +@call :log 6 "-------------------------------------" +@call :administrator_check +@if errorlevel 1 ( + call :log 0 "You must run %~nx0 in elevated mode to install '%name%'" + call :log 5 "Right-Click and select 'Run as Administrator' + call :log 0 "Install the dependency manually by running %file_path%" + @exit /b 740 +) +@if [%file_path:~0,4%] == [http] ( + if not exist "%exe_path%" ( + call :download "%file_path%" "%exe_path%" %checksum% + if errorlevel 1 ( + call :log 0 "Failed to download the %name% dependency" + exit /b 1 + ) + ) +) else ( + call :log 2 "Copying installer %file_path% to %exe_path%" + call :log 7 + if not exist "%exe_path%" ( + xcopy /q /y /z "%file_path%" "%exe_path%" 1>nul + if errorlevel 1 ( + call :log 0 "Failed to copy the Nullsoft Installer" + exit /b 1 + ) + ) +) +@call :log 1 "Running the %exe%" +@call :log 6 +@"%exe_path%" /S +@set nsis_errorlevel=%errorlevel% +@if %nsis_errorlevel% equ 0 goto install_nsis_success +@if %nsis_errorlevel% equ 3010 goto install_nsis_success_reboot +@if %nsis_errorlevel% equ 1641 goto install_nsis_success_reboot +@if %nsis_errorlevel% equ 3015 goto install_nsis_in_progress_reboot +@if %nsis_errorlevel% equ 1615 goto install_nsis_in_progress_reboot +@call :log 0 "Nullsoft Installer failed: %nsis_errorlevel%" +@call :log 0 "Install the dependency manually by running %exe_path%" +@exit /b 1 +:install_nsis_in_progress_reboot +@call :log 0 "The installation requires a reboot to continue" +@call :log 5 +@call :reboot +@exit /b 1 +:install_nsis_success_reboot +@call :log 3 "The installation requires a reboot to be fully functional" +@set reboot_required=1 +:install_nsis_success +@call :log 2 "Successfully installed %name%" +@call :log 7 +@endlocal & set reboot_required=%reboot_required% +@goto :eof + +:reboot - Asks the user if they would like to reboot then stops the script +@setlocal +@call :log 6 "-------------------------------------------" +@choice /C YN /T 60 /D N /M "The %method% requires a reboot, reboot now?" +@set ret=%errorlevel% +@call :log 6 +@if %ret% equ 1 ( + @shutdown /r +) else ( + @call :log 0 "You will need to reboot to complete the %method%" + @call :log 5 +) +@endlocal +@goto :eof diff --git a/3P/civetweb/builders/cmake/CMakeLists.txt b/3P/civetweb/builders/cmake/CMakeLists.txt new file mode 100644 index 00000000..00b39255 --- /dev/null +++ b/3P/civetweb/builders/cmake/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 2.8.11) + +include (libwolfssl) +include (libcivetweb) + +project(libcivetweb) + +ADD_DEFINITIONS(-DUSE_YASSL -DNO_SSL_DL) + +file( + GLOB + source_files + ../../src/civetweb.c + ../../src/CivetServer.cpp +) + + +set(CMAKE_C_FLAGS "-W -Wall -O2 -Iinclude") + +add_library( + civetweb + SHARED + ${source_files} +) + +target_link_libraries (civetweb + LINK_PUBLIC + wolfssl + pthread + m + ) + +target_include_directories (civetweb PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/3P/civetweb/ci/test/01_basic/basic_spec.lua b/3P/civetweb/ci/test/01_basic/basic_spec.lua new file mode 100644 index 00000000..cf3b3007 --- /dev/null +++ b/3P/civetweb/ci/test/01_basic/basic_spec.lua @@ -0,0 +1,35 @@ +civet = require "ci/test/civet" +local curl = require "cURL" + +describe("civetweb basic", function() + + setup(function() + civet.start() + end) + + teardown(function() + civet.stop() + end) + + + it("should serve a simple get request", function() + + local out = "" + function capture(str) + out = out .. str + end + + local c = curl.easy() + :setopt_url('http://localhost:' .. civet.port .. "/") + :setopt_writefunction(capture) + :perform() + :close() + + --print('rescode:' .. c.getinfo(curl.INFO_RESPONSE_CODE)) + + assert.are.equal('Index of', string.match(out, 'Index of')) + assert.are.equal('01_basic_test_dir', string.match(out, '01_basic_test_dir')) + assert.are.equal('01_basic_test_file', string.match(out, '01_basic_test_file')) + end) + +end) diff --git a/3P/civetweb/ci/test/01_basic/docroot/01_basic_test_dir/git_keep_empty_dir b/3P/civetweb/ci/test/01_basic/docroot/01_basic_test_dir/git_keep_empty_dir new file mode 100644 index 00000000..e69de29b diff --git a/3P/civetweb/ci/test/01_basic/docroot/01_basic_test_file b/3P/civetweb/ci/test/01_basic/docroot/01_basic_test_file new file mode 100644 index 00000000..e69de29b diff --git a/3P/civetweb/ci/test/README.md b/3P/civetweb/ci/test/README.md new file mode 100644 index 00000000..fdbecbe0 --- /dev/null +++ b/3P/civetweb/ci/test/README.md @@ -0,0 +1,34 @@ +== Travis CI Tests + +Travis is a service which will build your project when you commit or get pull requests on Github. + +I have fixed and extended the travis configuration to build on the new sudo-less docker infrastructure. + +=== CI Process + +* On Check-in or Pull Requests clone the repo +* Run make WITH_LUA=1 WITH_DEBUG=1 WITH_IPV6=1 WITH_WEBSOCKET=1 +* Build a standalone lua installation (seperate from civetweb or the OS) +* Build LuaRocks in standalone installation +* Install a few rocks into the standalone installation +* Start the test script + +=== test/ci_tests/01_basic/basic_spec.lua + +On the initial checkin, there is only one test which demonstrates: + +* reliably starting civetweb server on travis infrastructure +* waiting (polling) with lua.socket to establish the server is up and running +* using libcurl via lua to test that files in the specified docroot are available +* kill the civetweb server process +* waiting (polling) the server port to see that the server has freed it + +=== Adding Tests + +* Create a directory under ci_tests +* Add a spec file, so now we have ci_tests/02_my_awesome_test/awesome_spec.lua +* Any file under ci_tests which ends in _spec.lua will be automatically run +* Check out the 'busted' and lua-curl3 docs for more info +* https://github.com/Lua-cURL/Lua-cURLv3 +* http://olivinelabs.com/busted/ + diff --git a/3P/civetweb/ci/test/civet.lua b/3P/civetweb/ci/test/civet.lua new file mode 100644 index 00000000..19a6848f --- /dev/null +++ b/3P/civetweb/ci/test/civet.lua @@ -0,0 +1,42 @@ +socket = require "socket" + +local civet = {} + +-- default params +civet.port=12345 +civet.max_retry=100 +civet.start_delay=0.1 + +function civet.start(docroot) + -- TODO: use a property + docroot = docroot or 'ci/test/01_basic/docroot' + assert(io.popen('./civetweb' + .. " -listening_ports " .. civet.port + .. " -document_root " .. docroot + .. " > /dev/null 2>&1 &" + )) + -- wait until the server answers + for i=1,civet.max_retry do + local s = socket.connect('127.0.0.1', civet.port) + if s then + s:close() + break + end + socket.select(nil, nil, civet.start_delay) -- sleep + end +end + +function civet.stop() + os.execute('killall civetweb') + -- wait until the server port closes + for i=1,civet.max_retry do + local s = socket.connect('127.0.0.1', civet.port) + if not s then + break + end + s:close() + socket.select(nil, nil, civet.start_delay) -- sleep + end +end + +return civet diff --git a/3P/civetweb/ci/travis/install_rocks.sh b/3P/civetweb/ci/travis/install_rocks.sh new file mode 100755 index 00000000..26e6f360 --- /dev/null +++ b/3P/civetweb/ci/travis/install_rocks.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -ev + +source ci/travis/lua_env.sh + +# add any rocks required for ci_tests to this list +# lua-curl depends on a libcurl development package (i.e. libcurl4-openssl-dev) +ROCKS=(lua-curl busted) + +for ROCK in ${ROCKS[*]} +do + $LUAROCKS install $ROCK +done + diff --git a/3P/civetweb/ci/travis/lua_env.sh b/3P/civetweb/ci/travis/lua_env.sh new file mode 100755 index 00000000..3bb18938 --- /dev/null +++ b/3P/civetweb/ci/travis/lua_env.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +LUAROCKS=ci/lua/bin/luarocks +eval $($LUAROCKS path --bin) + diff --git a/3P/civetweb/ci/travis/platform.sh b/3P/civetweb/ci/travis/platform.sh new file mode 100755 index 00000000..4a3af0d4 --- /dev/null +++ b/3P/civetweb/ci/travis/platform.sh @@ -0,0 +1,15 @@ +if [ -z "$PLATFORM" ]; then + PLATFORM=$TRAVIS_OS_NAME; +fi + +if [ "$PLATFORM" == "osx" ]; then + PLATFORM="macosx"; +fi + +if [ -z "$PLATFORM" ]; then + if [ "$(uname)" == "Linux" ]; then + PLATFORM="linux"; + else + PLATFORM="macosx"; + fi; +fi diff --git a/3P/civetweb/ci/travis/run_ci_tests.sh b/3P/civetweb/ci/travis/run_ci_tests.sh new file mode 100755 index 00000000..33c55dde --- /dev/null +++ b/3P/civetweb/ci/travis/run_ci_tests.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -ev + +source ci/travis/lua_env.sh +busted -o TAP ci/test/ + + diff --git a/3P/civetweb/ci/travis/setup_lua.sh b/3P/civetweb/ci/travis/setup_lua.sh new file mode 100755 index 00000000..0992a89b --- /dev/null +++ b/3P/civetweb/ci/travis/setup_lua.sh @@ -0,0 +1,61 @@ +#! /bin/bash +set -ev + +# this script installs a lua / luarocks environment in .travis/lua +# this is necessary because travis docker architecture (the fast way) +# does not permit sudo, and does not contain a useful lua installation + +# After this script is finished, you can configure your environment to +# use it by sourcing lua_env.sh + +source ci/travis/platform.sh + +# The current versions when this script was written +LUA_VERSION=5.2.4 +LUAROCKS_VERSION=2.2.2 + +# directory where this script is located +SCRIPT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) + +# civetweb base dir +PROJECT_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )"/../.. && pwd ) + +# fetch and unpack lua src +cd $SCRIPT_DIR +LUA_BASE=lua-$LUA_VERSION +rm -rf $LUA_BASE +curl http://www.lua.org/ftp/$LUA_BASE.tar.gz | tar zx + +# build lua +cd $LUA_BASE +make $PLATFORM +make local + +# mv built lua install to target Lua dir +LUA_DIR=$PROJECT_DIR/ci/lua +rm -rf $LUA_DIR +mv $SCRIPT_DIR/$LUA_BASE/install $LUA_DIR + +# add to path required by luarocks installer +export PATH=$LUA_DIR/bin:$PATH + + +# fetch and unpack luarocks +cd $SCRIPT_DIR +LUAROCKS_BASE=luarocks-$LUAROCKS_VERSION +rm -rf ${LUAROCKS_BASE} +LUAROCKS_URL=http://luarocks.org/releases/${LUAROCKS_BASE}.tar.gz +# -L because it's a 302 redirect +curl -L $LUAROCKS_URL | tar xzp +cd $LUAROCKS_BASE + +# build luarocks +./configure --prefix=$LUA_DIR +make build +make install + +# cleanup source dirs +cd $SCRIPT_DIR +rm -rf $LUAROCKS_BASE +rm -rf $LUA_BASE + diff --git a/3P/civetweb/cmake/AddCCompilerFlag.cmake b/3P/civetweb/cmake/AddCCompilerFlag.cmake new file mode 100644 index 00000000..f5550fa7 --- /dev/null +++ b/3P/civetweb/cmake/AddCCompilerFlag.cmake @@ -0,0 +1,38 @@ +# - Adds a compiler flag if it is supported by the compiler +# +# This function checks that the supplied compiler flag is supported and then +# adds it to the corresponding compiler flags +# +# add_c_compiler_flag( []) +# +# - Example +# +# include(AddCCompilerFlag) +# add_c_compiler_flag(-Wall) +# add_c_compiler_flag(-no-strict-aliasing RELEASE) +# Requires CMake 2.6+ + +if(__add_c_compiler_flag) + return() +endif() +set(__add_c_compiler_flag INCLUDED) + +include(CheckCCompilerFlag) + +function(add_c_compiler_flag FLAG) + string(TOUPPER "HAVE_C_FLAG_${FLAG}" SANITIZED_FLAG) + string(REPLACE "+" "X" SANITIZED_FLAG ${SANITIZED_FLAG}) + string(REGEX REPLACE "[^A-Za-z_0-9]" "_" SANITIZED_FLAG ${SANITIZED_FLAG}) + string(REGEX REPLACE "_+" "_" SANITIZED_FLAG ${SANITIZED_FLAG}) + set(CMAKE_REQUIRED_FLAGS "${FLAG}") + check_c_compiler_flag("" ${SANITIZED_FLAG}) + if(${SANITIZED_FLAG}) + set(VARIANT ${ARGV1}) + if(ARGV1) + string(REGEX REPLACE "[^A-Za-z_0-9]" "_" VARIANT "${VARIANT}") + string(TOUPPER "_${VARIANT}" VARIANT) + endif() + set(CMAKE_C_FLAGS${VARIANT} "${CMAKE_C_FLAGS${VARIANT}} ${FLAG}" PARENT_SCOPE) + endif() +endfunction() + diff --git a/3P/civetweb/cmake/AddCXXCompilerFlag.cmake b/3P/civetweb/cmake/AddCXXCompilerFlag.cmake new file mode 100644 index 00000000..5e58c6de --- /dev/null +++ b/3P/civetweb/cmake/AddCXXCompilerFlag.cmake @@ -0,0 +1,38 @@ +# - Adds a compiler flag if it is supported by the compiler +# +# This function checks that the supplied compiler flag is supported and then +# adds it to the corresponding compiler flags +# +# add_cxx_compiler_flag( []) +# +# - Example +# +# include(AddCXXCompilerFlag) +# add_cxx_compiler_flag(-Wall) +# add_cxx_compiler_flag(-no-strict-aliasing RELEASE) +# Requires CMake 2.6+ + +if(__add_cxx_compiler_flag) + return() +endif() +set(__add_cxx_compiler_flag INCLUDED) + +include(CheckCXXCompilerFlag) + +function(add_cxx_compiler_flag FLAG) + string(TOUPPER "HAVE_CXX_FLAG_${FLAG}" SANITIZED_FLAG) + string(REPLACE "+" "X" SANITIZED_FLAG ${SANITIZED_FLAG}) + string(REGEX REPLACE "[^A-Za-z_0-9]" "_" SANITIZED_FLAG ${SANITIZED_FLAG}) + string(REGEX REPLACE "_+" "_" SANITIZED_FLAG ${SANITIZED_FLAG}) + set(CMAKE_REQUIRED_FLAGS "${FLAG}") + check_cxx_compiler_flag("" ${SANITIZED_FLAG}) + if(${SANITIZED_FLAG}) + set(VARIANT ${ARGV1}) + if(ARGV1) + string(REGEX REPLACE "[^A-Za-z_0-9]" "_" VARIANT "${VARIANT}") + string(TOUPPER "_${VARIANT}" VARIANT) + endif() + set(CMAKE_CXX_FLAGS${VARIANT} "${CMAKE_CXX_FLAGS${VARIANT}} ${FLAG}" PARENT_SCOPE) + endif() +endfunction() + diff --git a/3P/civetweb/cmake/DetermineTargetArchitecture.cmake b/3P/civetweb/cmake/DetermineTargetArchitecture.cmake new file mode 100644 index 00000000..7d18213f --- /dev/null +++ b/3P/civetweb/cmake/DetermineTargetArchitecture.cmake @@ -0,0 +1,47 @@ +# - Determines the target architecture of the compilation +# +# This function checks the architecture that will be built by the compiler +# and sets a variable to the architecture +# +# determine_target_architecture() +# +# - Example +# +# include(DetermineTargetArchitecture) +# determine_target_architecture(PROJECT_NAME_ARCHITECTURE) + +if(__determine_target_architecture) + return() +endif() +set(__determine_target_architecture INCLUDED) + +function(determine_target_architecture FLAG) + if (MSVC) + if("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "X86") + set(ARCH "i686") + elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "x64") + set(ARCH "x86_64") + elseif("${MSVC_C_ARCHITECTURE_ID}" STREQUAL "ARM") + set(ARCH "arm") + else() + message(FATAL_ERROR "Failed to determine the MSVC target architecture: ${MSVC_C_ARCHITECTURE_ID}") + endif() + else() + execute_process( + COMMAND ${CMAKE_C_COMPILER} -dumpmachine + RESULT_VARIABLE RESULT + OUTPUT_VARIABLE ARCH + ERROR_QUIET + ) + if (RESULT) + message(FATAL_ERROR "Failed to determine target architecture triplet: ${RESULT}") + endif() + string(REGEX MATCH "([^-]+).*" ARCH_MATCH ${ARCH}) + if (NOT CMAKE_MATCH_1 OR NOT ARCH_MATCH) + message(FATAL_ERROR "Failed to match the target architecture triplet: ${ARCH}") + endif() + set(ARCH ${CMAKE_MATCH_1}) + endif() + message(STATUS "Target architecture - ${ARCH}") + set(FLAG ${ARCH} PARENT_SCOPE) +endfunction() diff --git a/3P/civetweb/cmake/FindLibDl.cmake b/3P/civetweb/cmake/FindLibDl.cmake new file mode 100644 index 00000000..c018d923 --- /dev/null +++ b/3P/civetweb/cmake/FindLibDl.cmake @@ -0,0 +1,46 @@ +#.rst: +# FindLibDl +# -------- +# +# Find the native realtime includes and library. +# +# IMPORTED Targets +# ^^^^^^^^^^^^^^^^ +# +# This module defines :prop_tgt:`IMPORTED` target ``LIBDL::LIBDL``, if +# LIBDL has been found. +# +# Result Variables +# ^^^^^^^^^^^^^^^^ +# +# This module defines the following variables: +# +# :: +# +# LIBDL_INCLUDE_DIRS - where to find dlfcn.h, etc. +# LIBDL_LIBRARIES - List of libraries when using libdl. +# LIBDL_FOUND - True if dynamic linking library found. +# +# Hints +# ^^^^^ +# +# A user may set ``LIBDL_ROOT`` to a library installation root to tell this +# module where to look. + +find_path(LIBDL_INCLUDE_DIRS + NAMES dlfcn.h + PATHS ${LIBDL_ROOT}/include/ +) +find_library(LIBDL_LIBRARIES dl) +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LibDl DEFAULT_MSG LIBDL_LIBRARIES LIBDL_INCLUDE_DIRS) +mark_as_advanced(LIBDL_INCLUDE_DIRS LIBDL_LIBRARIES) + +if(LIBDL_FOUND) + if(NOT TARGET LIBDL::LIBDL) + add_library(LIBDL::LIBDL UNKNOWN IMPORTED) + set_target_properties(LIBDL::LIBDL PROPERTIES + IMPORTED_LOCATION "${LIBDL_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${LIBDL_INCLUDE_DIRS}") + endif() +endif() diff --git a/3P/civetweb/cmake/FindLibM.cmake b/3P/civetweb/cmake/FindLibM.cmake new file mode 100644 index 00000000..0b2053d9 --- /dev/null +++ b/3P/civetweb/cmake/FindLibM.cmake @@ -0,0 +1,46 @@ +#.rst: +# FindLibM +# -------- +# +# Find the native realtime includes and library. +# +# IMPORTED Targets +# ^^^^^^^^^^^^^^^^ +# +# This module defines :prop_tgt:`IMPORTED` target ``LIBM::LIBM``, if +# LIBM has been found. +# +# Result Variables +# ^^^^^^^^^^^^^^^^ +# +# This module defines the following variables: +# +# :: +# +# LIBM_INCLUDE_DIRS - where to find math.h, etc. +# LIBM_LIBRARIES - List of libraries when using libm. +# LIBM_FOUND - True if math library found. +# +# Hints +# ^^^^^ +# +# A user may set ``LIBM_ROOT`` to a math library installation root to tell this +# module where to look. + +find_path(LIBM_INCLUDE_DIRS + NAMES math.h + PATHS ${LIBM_ROOT}/include/ +) +find_library(LIBM_LIBRARIES m) +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LibM DEFAULT_MSG LIBM_LIBRARIES LIBM_INCLUDE_DIRS) +mark_as_advanced(LIBM_INCLUDE_DIRS LIBM_LIBRARIES) + +if(LIBM_FOUND) + if(NOT TARGET LIBM::LIBM) + add_library(LIBM::LIBM UNKNOWN IMPORTED) + set_target_properties(LIBM::LIBM PROPERTIES + IMPORTED_LOCATION "${LIBM_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${LIBM_INCLUDE_DIRS}") + endif() +endif() diff --git a/3P/civetweb/cmake/FindLibRt.cmake b/3P/civetweb/cmake/FindLibRt.cmake new file mode 100644 index 00000000..c496edf8 --- /dev/null +++ b/3P/civetweb/cmake/FindLibRt.cmake @@ -0,0 +1,46 @@ +#.rst: +# FindLibRt +# -------- +# +# Find the native realtime includes and library. +# +# IMPORTED Targets +# ^^^^^^^^^^^^^^^^ +# +# This module defines :prop_tgt:`IMPORTED` target ``LIBRT::LIBRT``, if +# LIBRT has been found. +# +# Result Variables +# ^^^^^^^^^^^^^^^^ +# +# This module defines the following variables: +# +# :: +# +# LIBRT_INCLUDE_DIRS - where to find time.h, etc. +# LIBRT_LIBRARIES - List of libraries when using librt. +# LIBRT_FOUND - True if realtime library found. +# +# Hints +# ^^^^^ +# +# A user may set ``LIBRT_ROOT`` to a realtime installation root to tell this +# module where to look. + +find_path(LIBRT_INCLUDE_DIRS + NAMES time.h + PATHS ${LIBRT_ROOT}/include/ +) +find_library(LIBRT_LIBRARIES rt) +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LibRt DEFAULT_MSG LIBRT_LIBRARIES LIBRT_INCLUDE_DIRS) +mark_as_advanced(LIBRT_INCLUDE_DIRS LIBRT_LIBRARIES) + +if(LIBRT_FOUND) + if(NOT TARGET LIBRT::LIBRT) + add_library(LIBRT::LIBRT UNKNOWN IMPORTED) + set_target_properties(LIBRT::LIBRT PROPERTIES + IMPORTED_LOCATION "${LIBRT_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${LIBRT_INCLUDE_DIRS}") + endif() +endif() diff --git a/3P/civetweb/cmake/FindWinSock.cmake b/3P/civetweb/cmake/FindWinSock.cmake new file mode 100644 index 00000000..0bf355de --- /dev/null +++ b/3P/civetweb/cmake/FindWinSock.cmake @@ -0,0 +1,102 @@ +#.rst: +# FindWinSock +# -------- +# +# Find the native realtime includes and library. +# +# IMPORTED Targets +# ^^^^^^^^^^^^^^^^ +# +# This module defines :prop_tgt:`IMPORTED` target ``WINSOCK::WINSOCK``, if +# WINSOCK has been found. +# +# Result Variables +# ^^^^^^^^^^^^^^^^ +# +# This module defines the following variables: +# +# :: +# +# WINSOCK_INCLUDE_DIRS - where to find winsock.h, etc. +# WINSOCK_LIBRARIES - List of libraries when using librt. +# WINSOCK_FOUND - True if realtime library found. +# +# Hints +# ^^^^^ +# +# A user may set ``WINSOCK_ROOT`` to a realtime installation root to tell this +# module where to look. + +macro(REMOVE_DUPLICATE_PATHS LIST_VAR) + set(WINSOCK_LIST "") + foreach(PATH IN LISTS ${LIST_VAR}) + get_filename_component(PATH "${PATH}" REALPATH) + list(APPEND WINSOCK_LIST "${PATH}") + endforeach(PATH) + set(${LIST_VAR} ${WINSOCK_LIST}) + list(REMOVE_DUPLICATES ${LIST_VAR}) +endmacro(REMOVE_DUPLICATE_PATHS) + +set(WINSOCK_INCLUDE_PATHS "${WINSOCK_ROOT}/include/") +if(MINGW) + execute_process( + COMMAND ${CMAKE_C_COMPILER} -xc -E -v - + RESULT_VARIABLE RESULT + INPUT_FILE nul + ERROR_VARIABLE ERR + OUTPUT_QUIET + ) + if (NOT RESULT) + string(FIND "${ERR}" "#include <...> search starts here:" START) + string(FIND "${ERR}" "End of search list." END) + if (NOT ${START} EQUAL -1 AND NOT ${END} EQUAL -1) + math(EXPR START "${START} + 36") + math(EXPR END "${END} - 1") + math(EXPR LENGTH "${END} - ${START}") + string(SUBSTRING "${ERR}" ${START} ${LENGTH} WINSOCK_INCLUDE_PATHS) + string(REPLACE "\n " ";" WINSOCK_INCLUDE_PATHS "${WINSOCK_INCLUDE_PATHS}") + list(REVERSE WINSOCK_INCLUDE_PATHS) + endif() + endif() +endif() +remove_duplicate_paths(WINSOCK_INCLUDE_PATHS) + +set(WINSOCK_LIBRARY_PATHS "${WINSOCK_ROOT}/lib/") +if(MINGW) + execute_process( + COMMAND ${CMAKE_C_COMPILER} -print-search-dirs + RESULT_VARIABLE RESULT + OUTPUT_VARIABLE OUT + ERROR_QUIET + ) + if (NOT RESULT) + string(REGEX MATCH "libraries: =([^\r\n]*)" OUT "${OUT}") + list(APPEND WINSOCK_LIBRARY_PATHS "${CMAKE_MATCH_1}") + endif() +endif() +if (${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "AMD64" AND ${CMAKE_SIZEOF_VOID_P} EQUAL 4) + list(APPEND WINSOCK_LIBRARY_PATHS "C:/Windows/SysWOW64") +endif() +list(APPEND WINSOCK_LIBRARY_PATHS "C:/Windows/System32") +remove_duplicate_paths(WINSOCK_LIBRARY_PATHS) + +find_path(WINSOCK_INCLUDE_DIRS + NAMES winsock2.h + PATHS ${WINSOCK_INCLUDE_PATHS} +) +find_library(WINSOCK_LIBRARIES ws2_32 + PATHS ${WINSOCK_LIBRARY_PATHS} + NO_DEFAULT_PATH +) +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(WinSock DEFAULT_MSG WINSOCK_LIBRARIES WINSOCK_INCLUDE_DIRS) +mark_as_advanced(WINSOCK_INCLUDE_DIRS WINSOCK_LIBRARIES) + +if(WINSOCK_FOUND) + if(NOT TARGET WINSOCK::WINSOCK) + add_library(WINSOCK::WINSOCK UNKNOWN IMPORTED) + set_target_properties(WINSOCK::WINSOCK PROPERTIES + IMPORTED_LOCATION "${WINSOCK_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${WINSOCK_INCLUDE_DIRS}") + endif() +endif() diff --git a/3P/civetweb/cmake/check/patch.cmake b/3P/civetweb/cmake/check/patch.cmake new file mode 100644 index 00000000..472d392b --- /dev/null +++ b/3P/civetweb/cmake/check/patch.cmake @@ -0,0 +1,12 @@ +message(STATUS "Patching check ${VERSION} ${SOURCE_DIR}") + +# Patch checks for MinGW +# https://sourceforge.net/p/check/patches/53/ +set(CMAKE_LISTS_LOCATION "${SOURCE_DIR}/CMakeLists.txt") +file(READ ${CMAKE_LISTS_LOCATION} CMAKE_LISTS) +string(REGEX REPLACE + "(check_type_size\\((clock|clockid|timer)_t [A-Z_]+\\)[\r\n]+[^\r\n]+[\r\n]+[^\r\n]+[\r\n]+endif\\(NOT HAVE[A-Z_]+\\))" + "set(CMAKE_EXTRA_INCLUDE_FILES time.h)\n\\1\nunset(CMAKE_EXTRA_INCLUDE_FILES)" + CMAKE_LISTS "${CMAKE_LISTS}") +file(WRITE ${CMAKE_LISTS_LOCATION} "${CMAKE_LISTS}") +message(STATUS "Patched ${CMAKE_LISTS_LOCATION}") diff --git a/3P/civetweb/contrib/buildroot/Config.in b/3P/civetweb/contrib/buildroot/Config.in new file mode 100644 index 00000000..2334fdfe --- /dev/null +++ b/3P/civetweb/contrib/buildroot/Config.in @@ -0,0 +1,26 @@ +config BR2_PACKAGE_CIVETWEB + bool "civetweb" + depends on BR2_TOOLCHAIN_HAS_THREADS + help + Full featured embedded web server with Lua support. + + https://sourceforge.net/projects/civetweb + +if BR2_PACKAGE_CIVETWEB + +config BR2_CIVETWEB_WITH_LUA + bool "enable Lua support" + # required by the bundled Sqlite3 and Lua code + depends on BR2_LARGEFILE + help + Enable Lua support in Civetweb. Note that this will use a + version of Lua and Sqlite bundled within the Civetweb + sources, and not the packages from Buildroot. + +comment "Lua support requires largefile support in toolchain" + depends on !BR2_LARGEFILE + +endif + +comment "civetweb requires a toolchain with PTHREAD support" + depends on !BR2_TOOLCHAIN_HAS_THREADS diff --git a/3P/civetweb/contrib/buildroot/civetweb.mk b/3P/civetweb/contrib/buildroot/civetweb.mk new file mode 100644 index 00000000..e37f9ee8 --- /dev/null +++ b/3P/civetweb/contrib/buildroot/civetweb.mk @@ -0,0 +1,55 @@ +################################################################################ +# +# civetweb +# +################################################################################ + +CIVETWEB_VERSION = 1.8 +CIVETWEB_SITE = http://github.com/civetweb/civetweb/tarball/v$(CIVETWEB_VERSION) +CIVETWEB_LICENSE = MIT +CIVETWEB_LICENSE_FILES = LICENSE.md + +CIVETWEB_CONF_OPT = TARGET_OS=LINUX +CIVETWEB_COPT = $(TARGET_CFLAGS) -DHAVE_POSIX_FALLOCATE=0 +CIVETWEB_LDFLAGS = $(TARGET_LDFLAGS) +CIVETWEB_SYSCONFDIR = /etc +CIVETWEB_HTMLDIR = /var/www + +ifneq ($(BR2_LARGEFILE),y) + CIVETWEB_COPT += -DSQLITE_DISABLE_LFS +endif + +ifeq ($(BR2_INET_IPV6),y) + CIVETWEB_CONF_OPT += WITH_IPV6=1 +endif + +ifeq ($(BR2_CIVETWEB_WITH_LUA),y) + CIVETWEB_CONF_OPT += WITH_LUA=1 +endif + +ifeq ($(BR2_PACKAGE_OPENSSL),y) + CIVETWEB_COPT += -DNO_SSL_DL -lcrypt -lssl + CIVETWEB_DEPENDENCIES += openssl +else + CIVETWEB_COPT += -DNO_SSL +endif + +define CIVETWEB_BUILD_CMDS + $(MAKE) CC="$(TARGET_CC)" -C $(@D) build \ + $(CIVETWEB_CONF_OPT) \ + COPT="$(CIVETWEB_COPT)" +endef + +define CIVETWEB_INSTALL_TARGET_CMDS + $(MAKE) CC="$(TARGET_CC)" -C $(@D) install \ + DOCUMENT_ROOT="$(CIVETWEB_HTMLDIR)" \ + CONFIG_FILE2="$(CIVETWEB_SYSCONFDIR)/civetweb.conf" \ + HTMLDIR="$(TARGET_DIR)$(CIVETWEB_HTMLDIR)" \ + SYSCONFDIR="$(TARGET_DIR)$(CIVETWEB_SYSCONFDIR)" \ + PREFIX="$(TARGET_DIR)/usr" \ + $(CIVETWEB_CONF_OPT) \ + COPT='$(CIVETWEB_COPT)' +endef + +$(eval $(generic-package)) + diff --git a/3P/civetweb/distribution/arch/PKGBUILD.git.example b/3P/civetweb/distribution/arch/PKGBUILD.git.example new file mode 100644 index 00000000..7102bcb3 --- /dev/null +++ b/3P/civetweb/distribution/arch/PKGBUILD.git.example @@ -0,0 +1,42 @@ +# An example PKGBUILD script for Civetweb upstream, git version +# Rename to PKGBUILD to build via makepkg +_pkgname=civetweb +pkgname=$_pkgname-git +pkgver=v1.4.24.g73c40b6 +pkgrel=1 +pkgdesc="Small and quick-to-use web server; https/php/cgi support; MIT license - git development version" +arch=('i686' 'x86_64') +url="http://sourceforge.net/p/civetweb/" +license=('MIT') +groups=() +depends=() +makedepends=('git sed') +optdepends=('php-cgi: for php support') +provides=("$_pkgname") +conflicts=("$_pkgname") +backup=("etc/$_pkgname/$_pkgname.conf") +source=("$_pkgname::git+https://github.com/civetweb/civetweb.git") +md5sums=('SKIP') + +pkgver() { + cd "$srcdir/$_pkgname" + git describe --tags | sed 's|-|.|g' +} + +build() { + cd "$srcdir/$_pkgname" + make build WITH_IPV6=1 +} + +package() { + cd "$srcdir/$_pkgname" + make install PREFIX="$pkgdir/usr" SYSCONFDIR="$pkgdir/etc/local/$_pkgname" + + install -Dm644 "$srcdir/$_pkgname/distribution/arch/$_pkgname.service" "$pkgdir/usr/lib/systemd/system/$_pkgname.service" + + sed -i "s/^document_root [^\n]*/document_root \/srv\/http/g" "$pkgdir/etc/local/$_pkgname/$_pkgname.conf" + sed -i "s/^# access_log_file/access_log_file \/var\/log\/$_pkgname\/access.log/g" "$pkgdir/etc/local/$_pkgname/$_pkgname.conf" + sed -i "s/^# error_log_file/access_log_file \/var\/log\/$_pkgname\/error.log/g" "$pkgdir/etc/local/$_pkgname/$_pkgname.conf" +} + +# vim:set ts=2 sw=2 et: diff --git a/3P/civetweb/distribution/arch/civetweb.service b/3P/civetweb/distribution/arch/civetweb.service new file mode 100644 index 00000000..5327b6ca --- /dev/null +++ b/3P/civetweb/distribution/arch/civetweb.service @@ -0,0 +1,9 @@ +[Unit] +Description=Civetweb httpd +After=syslog.target network.target remote-fs.target nss-lookup.target + +[Service] +ExecStart=/usr/local/bin/civetweb /usr/local/etc/civetweb/civetweb.conf + +[Install] +WantedBy=multi-user.target diff --git a/3P/civetweb/docs/Building.md b/3P/civetweb/docs/Building.md new file mode 100644 index 00000000..a14a71a7 --- /dev/null +++ b/3P/civetweb/docs/Building.md @@ -0,0 +1,176 @@ +Building Civetweb +========= + +This guide covers the build instructions for stand-alone web server. +See [Embedding.md](https://github.com/civetweb/civetweb/blob/master/docs/Embedding.md) for information on extending an application. + +#### Where to get the source code? +https://github.com/civetweb/civetweb + + +Building for Windows +--------- + +#### Using Visual Studio +Open the *VS2012/civetweb.sln* in Visual Studio. +To include SSL support, you may have to use yaSSL. However, it is GPL licensed. +See [yaSSL.md](https://github.com/civetweb/civetweb/blob/master/docs/yaSSL.md) for more information. + +#### Using MinGW-w64 or TDM-GCC +In the start menu locate and run the "Run terminal" batch file. For TDM-GCC this is named "MinGW Command Prompt". +Navigate to the civetweb sources directory and run: +``` +mingw32-make CC=gcc +``` + +Building for Linux, BSD, and OSX +--------- + +## Using Make + +``` +make help +``` +Get help + +``` +make build +``` +compile the code + +``` +make install +``` +Install on the system, Linux only. + +``` +make lib WITH_CPP=1 WITH_IPV6=1 +make clean slib WITH_CPP=1 WITH_LUA=1 WITH_WEBSOCKET=1 +``` +Build the static and shared libraries. +The *WITH_CPP* make option is to include the CivetServer class. +The additional make options configure the library just as it would the application. + +The *slib* option should be done on a separate clean build as position +independent code (PIC) is required for it. Trying to run it after +building the static library or the server will result in a link error. + +``` +make clean +``` +Clean up the mess + +## Setting build options + +Make options can be set on the command line with the make command like so. +``` +make build WITH_LUA=1 +``` + + +| Make Options | Description | +| ------------------------- | ---------------------------------------- | +| WITH_LUA=1 | build with Lua support | +| WITH_DEBUG=1 | build with GDB debug support | +| WITH_IPV6=1 | with IPV6 support | +| WITH_WEBSOCKET=1 | build with web socket support | +| WITH_CPP=1 | build libraries with c++ classes | +| CONFIG_FILE=file | use 'file' as the config file | +| CONFIG_FILE2=file | use 'file' as the backup config file | +| HTMLDIR=/path | place to install initial web pages | +| DOCUMENT_ROOT=/path | HTMLDIR override, config option, install | +| | nothing is installed here. | +| PORTS=8080 | listening ports override when installing | +| SSL_LIB=libssl.so.0 | use versioned SSL library | +| CRYPTO_LIB=libcrypto.so.0 | system versioned CRYPTO library | +| PREFIX=/usr/local | sets the install directory | +| COPT='-DNO_SSL' | method to insert compile flags | + +Note that the WITH_* options used for *make* are not identical to the +preprocessor defines in the source code - usually USE_* is used there. + +## Setting compile flags + +Compile flags can be set using the *COPT* make option like so. +``` +make build COPT="-DNDEBUG -DNO_CGI" +``` + +| Compile Flags | Description | +| ------------------------- | ------------------------------------ | +| NDEBUG | strip off all debug code | +| DEBUG | build debug version (very noisy) | +| NO_CGI | disable CGI support | +| NO_SSL | disable SSL functionality | +| NO_SSL_DL | link against system libssl library | +| NO_FILES | do not serve files from a directory | +| SQLITE_DISABLE_LFS | disables large files (Lua only) | +| SSL_ALREADY_INITIALIZED | do not initialize libcrypto | + +## Cross Compiling + +Take total control with *CC*, *COPT* and *TARGET_OS* as make options. +TARGET_OS is used to determine some compile details as will as code function. +TARGET_OS values should be be one found in *resources/Makefile.in-os*. + +``` +make CC=arm-none-linux-gnueabi-gcc COPT="-march=armv7-a -mfpu=vfp -mfloat-abi=softfp" TARGET_OS=FROG +``` + +## Cocoa DMG Packaging (OSX Only) + +Use the alternate *Makefile.osx* to do the build. The entire build has +to be done using *Makefile.osx* because additional compile and link options +are required. This Makefile has all the same options as the other one plus +one additional *package* rule. + +``` +make -f Makefile.osx package +``` + +Building with Buildroot +--------- + +[Buildroot](http://buildroot.uclibc.org/) is a tool for creating cross compiled file systems. Including Civetweb in buildroot is fairly easy. There is even support for various build options. + +1. First, check if it already there. + - In buildroot, make menuconfig + - Package Selection for the target ---> + - Networking applications ---> + - civetweb +2. If not there, just add it + - copy *Config.in* and *civetweb.mk* from Civetweb's *contrib/buildroot/* to Buildroot's *package/civetweb/* directory. + - In Buildroot's *package/Config.in, insert the following line in were you will know how to find it in the menu. + > ``` source "package/civetweb/Config.in" ``` + + +Building on Android +--------- + +This is a small guide to help you run civetweb on Android. Currently it is +tested on the HTC Wildfire. If you have managed to run it on other devices +as well, please comment or drop an email in the mailing list. +Note : You dont need root access to run civetweb on Android. + +- Download the source from the Downloads page. +- Download the Android NDK from [http://developer.android.com/tools/sdk/ndk/index.html](http://developer.android.com/tools/sdk/ndk/index.html) +- Run `/path-to-ndk/ndk-build -C /path-to-civetweb/resources` + That should generate civetweb/lib/armeabi/civetweb +- Using the adb tool (you need to have Android SDK installed for that), + push the generated civetweb binary to `/data/local` folder on device. +- From adb shell, navigate to `/data/local` and execute `./civetweb`. +- To test if the server is running fine, visit your web-browser and + navigate to `http://127.0.0.1:8080` You should see the `Index of /` page. + +![screenshot](https://a248.e.akamai.net/camo.github.com/b88428bf009a2b6141000937ab684e04cc8586af/687474703a2f2f692e696d6775722e636f6d2f62676f6b702e706e67) + + +Notes: + +- `jni` stands for Java Native Interface. Read up on Android NDK if you want + to know how to interact with the native C functions of civetweb in Android + Java applications. +- TODO: A Java application that interacts with the native binary or a + shared library. + + diff --git a/3P/civetweb/docs/Embedding.md b/3P/civetweb/docs/Embedding.md new file mode 100644 index 00000000..662be25b --- /dev/null +++ b/3P/civetweb/docs/Embedding.md @@ -0,0 +1,168 @@ +Embedding Civetweb +========= + +Civetweb is primarily designed so applications can easily add HTTP server functionality. For example, an application server could use Civetweb to enable a web service interface for automation or remote control. + +Files +------ + +There is just a small set of files to compile in to the application, +but if a library is desired, see [Building.md](https://github.com/civetweb/civetweb/blob/master/docs/Building.md) + +#### Regarding the INL file extension +The *INL* file extension represents code that is statically included inline in a source file. Slightly different from C++ where it means "inline" code which is technically not the same as static code. Civetweb overloads this extension for the sake of clarity as opposed to having .c extensions on files that should not be directly compiled. + +#### Required Files + + 1. HTTP Server API + - src/civetweb.c + - include/civetweb.h + 2. MD5 API + - src/md5.inl + 3. C++ Wrapper (Optional) + - src/CivetServer.cpp + - include/CivetServer.h + +#### Other Files + + 1. Reference C Server + - src/main.c + 2. Reference C++ Server + - examples/embedded_cpp/embedded_cpp.cpp + +Quick Start +------ + +By default, the server will automatically serve up files like a normal HTTP server. An embedded server is most likely going to overload this functionality. + +### C + - Use ```mg_start()``` to start the server. + - Use *options* to select the port and document root among other things. + - Use *callbacks* to add your own hooks. + - Use ```mg_set_request_handler()``` to easily add your own request handlers. + - Use ```mg_stop()``` to stop the server. + +### C++ + - Create CivetHandlers for each URI. + - Register the handlers with ```CivetServer::addHandler()``` + - ```CivetServer``` starts on contruction and stops on destruction. + - Use contructor *options* to select the port and document root among other things. + - Use constructor *callbacks* to add your own hooks. + +Lua Support +------ + +Lua is a server side include functionality. Files ending in .lua will be processed with Lua. + +##### Add the following CFLAGS + + - -DLUA_COMPAT_ALL + - -DUSE_LUA + - -DUSE_LUA_SQLITE3 + - -DUSE_LUA_FILE_SYSTEM + +##### Add the following sources + + - src/mod_lua.inl + - src/third_party/lua-5.2.4/src + + lapi.c + + lauxlib.c + + lbaselib.c + + lbitlib.c + + lcode.c + + lcorolib.c + + lctype.c + + ldblib.c + + ldebug.c + + ldo.c + + ldump.c + + lfunc.c + + lgc.c + + linit.c + + liolib.c + + llex.c + + lmathlib.c + + lmem.c + + loadlib.c + + lobject.c + + lopcodes.c + + loslib.c + + lparser.c + + lstate.c + + lstring.c + + lstrlib.c + + ltable.c + + ltablib.c + + ltm.c + + lundump.c + + lvm.c + + lzio.c + - src/third_party/sqlite3.c + - src/third_party/sqlite3.h + - src/third_party/lsqlite3.c + - src/third_party/lfs.c + - src/third_party/lfs.h + + +Civetweb internals +------ + +Civetweb is multithreaded web server. `mg_start()` function allocates +web server context (`struct mg_context`), which holds all information +about web server instance: + +- configuration options. Note that civetweb makes internal copies of + passed options. +- SSL context, if any +- user-defined callbacks +- opened listening sockets +- a queue for accepted sockets +- mutexes and condition variables for inter-thread synchronization + +When `mg_start()` returns, all initialization is quaranteed to be complete +(e.g. listening ports are opened, SSL is initialized, etc). `mg_start()` starts +two threads: a master thread, that accepts new connections, and several +worker threads, that process accepted connections. The number of worker threads +is configurable via `num_threads` configuration option. That number puts a +limit on number of simultaneous requests that can be handled by civetweb. +If you embed civetweb into a program that uses SSL outside civetweb as well, +you may need to initialize SSL before calling `mg_start()`, and set the pre- +processor define SSL_ALREADY_INITIALIZED. This is not required if SSL is used +only within civetweb. + +When master thread accepts new connection, a new accepted socket (described by +`struct socket`) it placed into the accepted sockets queue, +which has size of 20 (see [code](https://github.com/civetweb/civetweb/blob/3892e0199e6ca9613b160535d9d107ede09daa43/civetweb.c#L486)). Any idle worker thread +can grab accepted sockets from that queue. If all worker threads are busy, +master thread can accept and queue up to 20 more TCP connections, +filling up the queue. +In the attempt to queue next accepted connection, master thread blocks +until there is space in a queue. When master thread is blocked on a +full queue, TCP layer in OS can also queue incoming connection. +The number is limited by the `listen()` call parameter on listening socket, +which is `SOMAXCONN` in case of Civetweb, and depends on a platform. + +Worker threads are running in an infinite loop, which in simplified form +looks something like this: + + static void *worker_thread() { + while (consume_socket()) { + process_new_connection(); + } + } + +Function `consume_socket()` gets new accepted socket from the civetweb socket +queue, atomically removing it from the queue. If the queue is empty, +`consume_socket()` blocks and waits until new sockets are placed in a queue +by the master thread. `process_new_connection()` actually processes the +connection, i.e. reads the request, parses it, and performs appropriate action +depending on a parsed request. + +Master thread uses `poll()` and `accept()` to accept new connections on +listening sockets. `poll()` is used to avoid `FD_SETSIZE` limitation of +`select()`. Since there are only a few listening sockets, there is no reason +to use hi-performance alternatives like `epoll()` or `kqueue()`. Worker +threads use blocking IO on accepted sockets for reading and writing data. +All accepted sockets have `SO_RCVTIMEO` and `SO_SNDTIMEO` socket options set +(controlled by `request_timeout_ms` civetweb option, 30 seconds default) which +specify read/write timeout on client connection. diff --git a/3P/civetweb/docs/Installing.md b/3P/civetweb/docs/Installing.md new file mode 100644 index 00000000..d5e87cc9 --- /dev/null +++ b/3P/civetweb/docs/Installing.md @@ -0,0 +1,36 @@ +Civetweb Install Guide +==== + +This guide covers the distributions for CivetWeb. The latest source code is available at [https://github.com/civetweb/civetweb](https://github.com/civetweb/civetweb). + +Windows +--- + +This pre-built version comes pre-built wit Lua support. Libraries for SSL support are not included due to licensing restrictions; +however, users may add an SSL library themselves. +Instructions for adding SSL support can be found in [https://github.com/civetweb/civetweb/tree/master/docs](https://github.com/civetweb/civetweb/tree/master/docs) + +1a. 32 Bit: Install the [Visual C++ Redistributable for Visual Studio 2010](http://www.microsoft.com/en-us/download/details.aspx?id=8328) +1b. 64 Bit: Install the [Visual C++ Redistributable for Visual Studio 2013](http://www.microsoft.com/en-us/download/details.aspx?id=40784) +2. Download latest *civetweb-win.zip* from [SourceForge](https://sourceforge.net/projects/civetweb/files/) +3. When started, Civetweb puts itself into the tray. + +OS X +--- + +This pre-built version comes with Lua, IPV6 and SSL support. + +1. Download the latest *Civetweb.dmg* from [SourceForge](https://sourceforge.net/projects/civetweb/files/) +2. Click on the it and look for the attachment in the finder. +4. Drag Civetweb to the Applications folder. +5. When started, Civetweb puts itself into top menu. + +Linux +--- + +1. Download the latest *civetweb.tar.gz* from [SourceForge](https://sourceforge.net/projects/civetweb/files/) +2. Open archive and change to the new directory. +3. make help +4. make +5. make install +6. Run the program ```/usr/local/bin/civetweb```, it will use the configuration file */usr/local/etc/civetweb.conf*. diff --git a/3P/civetweb/docs/OpenSSL.md b/3P/civetweb/docs/OpenSSL.md new file mode 100644 index 00000000..a97b2f57 --- /dev/null +++ b/3P/civetweb/docs/OpenSSL.md @@ -0,0 +1,132 @@ +Adding OpenSSL Support +===== + +Civetweb supports *HTTPS* connections using the OpenSSL transport layer +security (TLS) library. OpenSSL is a free, open source library (see +http://www.openssl.org/). + + +Getting Started +---- + +- Install OpenSSL on your system. There are OpenSSL install packages for all + major Linux distributions as well as a setup for Windows. +- The default build configuration of the civetweb web server will load the + required OpenSSL libraries, if a HTTPS certificate has been configured. + + +Civetweb Configuration +---- + +The configuration file must contain an https port, identified by a letter 's' +attached to the port number. +To serve http and https from their standard ports use the following line in +the configuration file 'civetweb.conf': +
+  listening_ports 80, 443s
+
+To serve only https use: +
+  listening_ports 443s
+
+ +Furthermore the SSL certificate file must be set: +
+  ssl_certificate d:\civetweb\certificate\server.pem
+
+ + +Creating a self signed certificate +---- + +OpenSSL provides a command line interface, that can be used to create the +certificate file required by civetweb (server.pem). + +One can use the following steps in Windows (in Linux replace "copy" by "cp" +and "type" by "cat"): + +
+  openssl genrsa -des3 -out server.key 1024
+
+  openssl req -new -key server.key -out server.csr
+
+  copy server.key server.key.orig
+
+  openssl rsa -in server.key.orig -out server.key
+
+  openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
+
+  copy server.crt server.pem
+
+  type server.key >> server.pem
+
+ +The server.pem file created must contain a 'certificate' section as well as a +'rsa private key' section. It should look like this (x represents BASE64 +encoded data): + +
+-----BEGIN CERTIFICATE-----
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxx
+-----END CERTIFICATE-----
+-----BEGIN RSA PRIVATE KEY-----
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+-----END RSA PRIVATE KEY-----
+
+ + +Common Problems +---- + +In case the OpenSSL configuration is not set up correctly, the server will not +start. Configure an error log file in 'civetweb.conf' to get more information: +
+  error_log_file error.log
+
+ +Check the content of 'error.log': + +
+load_dll: cannot load libeay32.*/libcrypto.*/ssleay32.*/libssl.*
+
+This error message means, the SSL library has not been installed (correctly). +For Windows you might use the pre-built binaries. A link is available at the +OpenSSL project home page (http://www.openssl.org/related/binaries.html). +Choose the windows system folder as installation directory - this is the +default location. + +
+set_ssl_option: cannot open server.pem: error:PEM routines:*:PEM_read_bio:no start line
+set_ssl_option: cannot open server.pem: error:PEM routines:*:PEM_read_bio:bad end line
+
+These error messages indicate, that the format of the ssl_certificate file does +not match the expectations of the SSL library. The PEM file must contain both, +a 'CERTIFICATE' and a 'RSA PRIVATE KEY' section. It should be a strict ASCII +file without byte-order marks. +The instructions above may be used to create a valid ssl_certificate file. + + diff --git a/3P/civetweb/docs/UserManual.md b/3P/civetweb/docs/UserManual.md new file mode 100644 index 00000000..ec5f64ce --- /dev/null +++ b/3P/civetweb/docs/UserManual.md @@ -0,0 +1,575 @@ + +Overview +===== + +Civetweb is small and easy to use web server. +It may be embedded into C/C++ host applications or used as a stand-alone +server. See `Embedding.md` for information on embedding civetweb into +host applications. + +The stand-alone server is self-contained, and does not require any external +software to run. Some Windows users may need to install the +[Visual C++ Redistributable](http://www.microsoft.com/en-us/download/details.aspx?id=30679). + +Installation +---- + +On Windows, UNIX and Mac, the civetweb stand-alone executable may be started +from the command line. +Running `civetweb` in a terminal, optionally followed by configuration parameters +(`civetweb [OPTIONS]`) or a configuration file name (`civetweb [config_file_name]`), +starts the web server. + +For UNIX and Mac, civetweb does not detach from the terminal. +Pressing `Ctrl-C` keys will stop the server. + +On Windows, civetweb iconifies itself to the system tray icon when started. +Right-click on the icon pops up a menu, where it is possible to stop +civetweb, or configure it, or install it as Windows service. + +When started without options, the server exposes the local directory at +[http](http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol) port 8080. +Thus, the easiest way to share a folder on Windows is to copy `civetweb.exe` +to this folder, double-click the exe, and launch a browser at +[http://localhost:8080](http://localhost:8080). Note that 'localhost' should +be changed to a machine's name if a folder is accessed from other computer. + +When started, civetweb first searches for the configuration file. +If configuration file is specified explicitly in the command line, i.e. +`civetweb path_to_config_file`, then specified configuration file is used. +Otherwise, civetweb would search for file `civetweb.conf` in the same directory +the executable is located, and use it. This configuration file is optional. + +The configuration file is a sequence of lines, each line containing one +command line argument name and the corresponding value. +Empty lines, and lines beginning with `#`, are ignored. +Here is the example of `civetweb.conf` file: + + document_root c:\www + listening_ports 80,443s + ssl_certificate c:\civetweb\ssl_cert.pem + +When a configuration file is used, additional command line arguments may +override the configuration file settings. +All command line arguments must start with `-`. + +For example: The above `civetweb.conf` file is used, and civetweb started as +`civetweb -document_root D:\web`. Then the `D:\web` directory will be served +as document root, because command line options take priority over the +configuration file. The configuration options section below provides a good +overview of the Civetweb features. + +Note that configuration options on the command line must start with `-`, +but their names are the same as in the config file. All option names are +listed in the next section. Thus, the following two setups are equivalent: + + # Using command line arguments + $ civetweb -listening_ports 1234 -document_root /var/www + + # Using config file + $ cat civetweb.conf + listening_ports 1234 + document_root /var/www + $ civetweb + +Civetweb can also be used to modify `.htpasswd` passwords files: + + civetweb -A + +Unlike other web servers, civetweb does not require CGI scripts to be located +in a special directory. CGI scripts can be anywhere. CGI (and SSI) files are +recognized by the file name pattern. Civetweb uses shell-like glob +patterns. Pattern match starts at the beginning of the string, so essentially +patterns are prefix patterns. Syntax is as follows: + + ** Matches everything + * Matches everything but slash character, '/' + ? Matches any character + $ Matches the end of the string + | Matches if pattern on the left side or the right side matches. + +All other characters in the pattern match themselves. Examples: + + **.cgi$ Any string that ends with .cgi + /foo Any string that begins with /foo + **a$|**b$ Any string that ends with a or b + +# Configuration Options + +Below is a list of configuration options understood by Civetweb. +Every option is followed by it's default value. If a default value is not +present, then the default is empty. + +### cgi\_pattern `**.cgi$|**.pl$|**.php$` +All files that match `cgi_pattern` are treated as CGI files. Default pattern +allows CGI files be anywhere. To restrict CGIs to a certain directory, +use `/path/to/cgi-bin/**.cgi` as pattern. Note that the full file path is +matched against the pattern, not the URI. + +### cgi\_environment +Extra environment variables to be passed to the CGI script in +addition to standard ones. The list must be comma-separated list +of name=value pairs, like this: `VARIABLE1=VALUE1,VARIABLE2=VALUE2`. + +### put\_delete\_auth\_file +Passwords file for PUT and DELETE requests. Without password file, it will not +be possible to, PUT new files to the server or DELETE existing ones. PUT and +DELETE requests might still be handled by Lua scripts and CGI paged. + +### cgi\_interpreter +Path to an executable to use as CGI interpreter for __all__ CGI scripts +regardless of the script file extension. If this option is not set (which is +the default), Civetweb looks at first line of a CGI script, +[shebang line](http://en.wikipedia.org/wiki/Shebang_(Unix\)), for an +interpreter (not only on Linux and Mac but also for Windows). + +For example, if both PHP and Perl CGIs are used, then +`#!/path/to/php-cgi.exe` and `#!/path/to/perl.exe` must be first lines of the +respective CGI scripts. Note that paths should be either full file paths, +or file paths relative to the current working directory of the civetweb +server. If civetweb is started by mouse double-click on Windows, the current +working directory is the directory where the civetweb executable is located. + +If all CGIs use the same interpreter, for example they are all PHP, it is +more efficient to set `cgi_interpreter` to the path to `php-cgi.exe`. +The shebang line in the CGI scripts can be omitted in this case. +Note that PHP scripts must use `php-cgi.exe` as executable, not `php.exe`. + +### protect\_uri +Comma separated list of URI=PATH pairs, specifying that given +URIs must be protected with password files specified by PATH. +All Paths must be full file paths. + +### authentication_domain `mydomain.com` +Authorization realm used for HTTP digest authentication. This domain is +used in the encoding of the `.htpasswd` authorization files as well. +Changing the domain retroactively will render the existing passwords useless. + +### ssi\_pattern `**.shtml$|**.shtm$` +All files that match `ssi_pattern` are treated as Server Side Includes (SSI). + +SSI is a simple interpreted server-side scripting language which is most +commonly used to include the contents of another file into a web page. +It can be useful when it is desirable to include a common piece +of code throughout a website, for example, headers and footers. + +In order for a webpage to recognize an SSI-enabled HTML file, the filename +should end with a special extension, by default the extension should be +either `.shtml` or `.shtm`. These extentions may be changed using the +`ssi_pattern` option. + +Unknown SSI directives are silently ignored by civetweb. Currently, two SSI +directives are supported, ` + +For more information on Server Side Includes, take a look at the Wikipedia: +[Server Side Includes](http://en.wikipedia.org/wiki/Server_Side_Includes) + +### throttle +Limit download speed for clients. `throttle` is a comma-separated +list of key=value pairs, where key could be: + + * limit speed for all connections + x.x.x.x/mask limit speed for specified subnet + uri_prefix_pattern limit speed for given URIs + +The value is a floating-point number of bytes per second, optionally +followed by a `k` or `m` character, meaning kilobytes and +megabytes respectively. A limit of 0 means unlimited rate. The +last matching rule wins. Examples: + + *=1k,10.0.0.0/8=0 limit all accesses to 1 kilobyte per second, + but give connections the from 10.0.0.0/8 subnet + unlimited speed + + /downloads/=5k limit accesses to all URIs in `/downloads/` to + 5 kilobytes per second. All other accesses are unlimited + +### access\_log\_file +Path to a file for access logs. Either full path, or relative to the current +working directory. If absent (default), then accesses are not logged. + +### enable\_directory\_listing `yes` +Enable directory listing, either `yes` or `no`. + +### error\_log\_file +Path to a file for error logs. Either full path, or relative to the current +working directory. If absent (default), then errors are not logged. + +### global\_auth\_file +Path to a global passwords file, either full path or relative to the current +working directory. If set, per-directory `.htpasswd` files are ignored, +and all requests are authorized against that file. + +The file has to include the realm set through `authentication_domain` and the +password in digest format: + + user:realm:digest + test:test.com:ce0220efc2dd2fad6185e1f1af5a4327 + +Password files may be generated using `civetweb -A` as explained above, or +online tools e.g. [this generator](http://www.askapache.com/online-tools/htpasswd-generator). + +### index\_files `index.xhtml,index.html,index.htm,index.cgi,index.shtml,index.php` +Comma-separated list of files to be treated as directory index files. +If more than one matching file is present in a directory, the one listed to the left +is used as a directory index. + +In case built-in Lua support has been enabled, `index.lp,index.lsp,index.lua` +are additional default index files, ordered before `index.cgi`. + +### enable\_keep\_alive `no` +Enable connection keep alive, either `yes` or `no`. + +Experimental feature. Allows clients to reuse TCP connection for subsequent +HTTP requests, which improves performance. +For this to work when using request handlers it is important to add the +correct Content-Length HTTP header for each request. If this is forgotten the +client will time out. + +### access\_control\_list +An Access Control List (ACL) allows restrictions to be put on the list of IP +addresses which have access to the web server. In the case of the Civetweb +web server, the ACL is a comma separated list of IP subnets, where each +subnet is pre-pended by either a `-` or a `+` sign. A plus sign means allow, +where a minus sign means deny. If a subnet mask is omitted, such as `-1.2.3.4`, +this means to deny only that single IP address. + +Subnet masks may vary from 0 to 32, inclusive. The default setting is to allow +all accesses. On each request the full list is traversed, and +the last match wins. Examples: + + -0.0.0.0/0,+192.168/16 deny all accesses, only allow 192.168/16 subnet + +To learn more about subnet masks, see the +[Wikipedia page on Subnetwork](http://en.wikipedia.org/wiki/Subnetwork). + +### extra\_mime\_types +Extra mime types, in tha form `extension1=type1,exten-sion2=type2,...`. +See the [Wikipedia page on Internet media types](http://en.wikipedia.org/wiki/Internet_media_type). +Extension must include a leading dot. Example: +`.cpp=plain/text,.java=plain/text` + +### listening\_ports `8080` +Comma-separated list of ports to listen on. If the port is SSL, a +letter `s` must be appended, for example, `80,443s` will open +port 80 and port 443, and connections on port 443 will be SSL-ed. +For non-SSL ports, it is allowed to append letter `r`, meaning 'redirect'. +Redirect ports will redirect all their traffic to the first configured +SSL port. For example, if `listening_ports` is `80r,443s`, then all +HTTP traffic coming at port 80 will be redirected to HTTPS port 443. + +It is possible to specify an IP address to bind to. In this case, +an IP address and a colon must be pre-pended to the port number. +For example, to bind to a loopback interface on port 80 and to +all interfaces on HTTPS port 443, use `127.0.0.1:80,443s`. + +If the server is built with IPv6 support, `[::]:8080` can be used to +listen to connections to port 8080 from both, IPv4 and IPv6. +IPv6 addresses of network interfaces can be specified as well, +e.g. `[::1]:8080` for the IPv6 loopback interface. + +### document\_root `.` +A directory to serve. By default, the current working directory is served. +The current directory is commonly referenced as dot (`.`). + +### ssl\_certificate +Path to the SSL certificate file. This option is only required when at least +one of the `listening\_ports` is SSL. The file must be in PEM format, +and it must have both, private key and certificate, see for example +[ssl_cert.pem](https://github.com/civetweb/civetweb/blob/master/resources/ssl_cert.pem) +A description how to create a certificate can be found in doc/OpenSSL.md + +### num\_threads `50` +Number of worker threads. Civetweb handles each incoming connection in a +separate thread. Therefore, the value of this option is effectively the number +of concurrent HTTP connections Civetweb can handle. + +### run\_as\_user +Switch to given user credentials after startup. Usually, this option is +required when civetweb needs to bind on privileged ports on UNIX. To do +that, civetweb needs to be started as root. From a security point of view, +running as root is not advisable, therefore this option can be used to drop +privileges. Example: + + civetweb -listening_ports 80 -run_as_user webserver + +### url\_rewrite\_patterns +Comma-separated list of URL rewrites in the form of +`uri_pattern=file_or_directory_path`. When Civetweb receives any request, +it constructs the file name to show by combining `document_root` and the URI. +However, if the rewrite option is used and `uri_pattern` matches the +requested URI, then `document_root` is ignored. Instead, +`file_or_directory_path` is used, which should be a full path name or +a path relative to the web server's current working directory. Note that +`uri_pattern`, as all civetweb patterns, is a prefix pattern. + +This makes it possible to serve many directories outside from `document_root`, +redirect all requests to scripts, and do other tricky things. For example, +to redirect all accesses to `.doc` files to a special script, do: + + civetweb -url_rewrite_patterns **.doc$=/path/to/cgi-bin/handle_doc.cgi + +Or, to imitate support for user home directories, do: + + civetweb -url_rewrite_patterns /~joe/=/home/joe/,/~bill=/home/bill/ + +### hide\_files\_patterns +A pattern for the files to hide. Files that match the pattern will not +show up in directory listing and return `404 Not Found` if requested. Pattern +must be for a file name only, not including directory names. Example: + + civetweb -hide_files_patterns secret.txt|*.hide + +### request\_timeout\_ms `30000` +Timeout for network read and network write operations, in milliseconds. +If a client intends to keep long-running connection, either increase this +value or (better) use keep-alive messages. + +### lua\_preload\_file +This configuration option can be used to specify a Lua script file, which +is executed before the actual web page script (Lua script, Lua server page +or Lua websocket). It can be used to modify the Lua environment of all web +page scripts, e.g., by loading additional libraries or defining functions +required by all scripts. +It may be used to achieve backward compatibility by defining obsolete +functions as well. + +### lua\_script\_pattern `"**.lua$` +A pattern for files that are interpreted as Lua scripts by the server. +In contrast to Lua server pages, Lua scripts use plain Lua syntax. +An example can be found in the test directory. + +### lua\_server\_page\_pattern `**.lp$|**.lsp$` +Files matching this pattern are treated as Lua server pages. +In contrast to Lua scripts, the content of a Lua server pages is delivered +directly to the client. Lua script parts are delimited from the standard +content by including them between tags. +An example can be found in the test directory. + +### websocket\_root +In case civetweb is built with Lua and websocket support, Lua scripts may +be used for websockets as well. Since websockets use a different URL scheme +(ws, wss) than other http pages (http, https), the Lua scripts used for +websockets may also be served from a different directory. By default, +the document_root is used as websocket_root as well. + +### access\_control\_allow\_origin +Access-Control-Allow-Origin header field, used for cross-origin resource +sharing (CORS). +See the [Wikipedia page on CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing). + +### error\_pages +This option may be used to specify a directory for user defined error pages. +The error pages may be specified for an individual http status code (e.g., +404 - page requested by the client not found), a group of http status codes +(e.g., 4xx - all client errors) or all errors. The corresponding error pages +must be called error404.ext, error4xx.ext or error.ext, whereas the file +extention may be one of the extentions specified for the index_files option. +See the [Wikipedia page on HTTP status codes](http://en.wikipedia.org/wiki/HTTP_status_code). + +### decode\_url `yes` +URL encoded request strings are decoded in the server, unless it is disabled +by setting this option to `no`. + +### ssl_verify_peer `no` +Enable client's certificate verification by the server. + +### ssl_ca_path +Name of a directory containing trusted CA certificates. Each file in the +directory must contain only a single CA certificate. The files must be named +by the subject name’s hash and an extension of “.0”. If there is more than one +certificate with the same subject name they should have extensions ".0", ".1", +".2" and so on respectively. + +### ssl_ca_file +Path to a .pem file containing trusted certificates. The file may contain +more than one certificate. + +### ssl_verify_depth `9` +Sets maximum depth of certificate chain. If client's certificate chain is longer +than the depth set here connection is refused. + +### ssl_default_verify_paths `yes` +Loads default trusted certificates locations set at openssl compile time. + +### ssl_forward_secrecy `yes` +Enable [forward secrecy](https://en.wikipedia.org/wiki/Forward_secrecy). + +# Lua Scripts and Lua Server Pages +Pre-built Windows and Mac civetweb binaries have built-in Lua scripting +support as well as support for Lua Server Pages. + +Lua scripts (default extension: *.lua) use plain Lua syntax. +The body of the script file is not sent directly to the client, +the Lua script must send header and content of the web page by calling +the function mg.write(text). + +Lua Server Pages (default extensions: *.lsp, *.lp) are html pages containing +script elements similar to PHP, using the Lua programming language instead of +PHP. Lua script elements must be enclosed in `` blocks, and can appear +anywhere on the page. Furthermore, Lua Server Pages offer the opportunity to +insert the content of a variable by enclosing the Lua variable name in +`` blocks, similar to PHP. +For example, to print the current weekday name and the URI of the current +page, one can write: + +

+ Today is: + +

+

+ URI is +

+ +Lua is known for it's speed and small size. Civetweb currently uses Lua +version 5.2.4. The documentation for it can be found in the +[Lua 5.2 reference manual](http://www.lua.org/manual/5.2/). + + +Note that this example uses function `mg.write()`, which sends data to the +web client. Using `mg.write()` is the way to generate web content from inside +Lua code. In addition to `mg.write()`, all standard Lua library functions +are accessible from the Lua code (please check the reference manual for +details). Lua functions working on files (e.g., `io.open`) use a path +relative to the working path of the civetweb process. The web server content +is located in the path `mg.document_root`. +Information on the request is available in the `mg.request_info` +object, like the request method, all HTTP headers, etcetera. + +[page2.lua](https://github.com/civetweb/civetweb/blob/master/test/page2.lua) +is an example for a plain Lua script. + +[page2.lp](https://github.com/civetweb/civetweb/blob/master/test/page2.lp) +is an example for a Lua Server Page. + +Both examples show the content of the `mg.request_info` object as the page +content. Please refer to `struct mg_request_info` definition in +[civetweb.h](https://github.com/civetweb/civetweb/blob/master/include/civetweb.h) +to see additional information on the elements of the `mg.request_info` object. + +Civetweb also provides access to the [SQlite3 database](http://www.sqlite.org/) +through the [LuaSQLite3 interface](http://lua.sqlite.org/index.cgi/doc/tip/doc/lsqlite3.wiki) +in Lua. Examples are given in +[page.lua](https://github.com/civetweb/civetweb/blob/master/test/page.lua) and +[page.lp](https://github.com/civetweb/civetweb/blob/master/test/page.lp). + + +Civetweb exports the following functions to Lua: + +mg (table): + + mg.read() -- reads a chunk from POST data, returns it as a string + mg.write(str) -- writes string to the client + mg.include(path) -- sources another Lua file + mg.redirect(uri) -- internal redirect to a given URI + mg.onerror(msg) -- error handler, can be overridden + mg.version -- a string that holds Civetweb version + mg.document_root -- a string that holds the document root directory + mg.auth_domain -- a string that holds the HTTP authentication domain + mg.get_var(str, varname) -- extract variable from (query) string + mg.get_cookie(str, cookie) -- extract cookie from a string + mg.get_mime_type(filename) -- get MIME type of a file + mg.send_file(filename) -- send a file, including MIME type + mg.url_encode(str) -- URL encode a string + mg.url_decode(str, [form]) -- URL decode a string. If form=true, replace + by space. + mg.base64_encode(str) -- BASE64 encode a string + mg.base64_decode(str) -- BASE64 decode a string + mg.md5(str) -- return the MD5 hash of a string + mg.keep_alive(bool) -- allow/forbid to use http keep-alive for this request + mg.request_info -- a table with the following request information + .remote_addr -- IP address of the client as string + .remote_port -- remote port number + .server_port -- server port number + .request_method -- HTTP method (e.g.: GET, POST) + .http_version -- HTTP protocol version (e.g.: 1.1) + .uri -- resource name + .query_string -- query string if present, nil otherwise + .script_name -- name of the Lua script + .https -- true if accessed by https://, false otherwise + .remote_user -- user name if authenticated, nil otherwise + +connect (function): + + -- Connect to the remote TCP server. This function is an implementation + -- of simple socket interface. It returns a socket object with three + -- methods: send, recv, close, which are synchronous (blocking). + -- connect() throws an exception on connection error. + connect(host, port, use_ssl) + + -- Example of using connect() interface: + local host = 'code.google.com' -- IP address or domain name + local ok, sock = pcall(connect, host, 80, 1) + if ok then + sock:send('GET /p/civetweb/ HTTP/1.0\r\n' .. + 'Host: ' .. host .. '\r\n\r\n') + local reply = sock:recv() + sock:close() + -- reply now contains the web page https://code.google.com/p/civetweb + end + + +**IMPORTANT: Civetweb does not send HTTP headers for Lua pages. Therefore, +every Lua Page must begin with a HTTP reply line and headers**, like this: + + + + ... the rest of the web page ... + +To serve a Lua Page, civetweb creates a Lua context. That context is used for +all Lua blocks within the page. That means, all Lua blocks on the same page +share the same context. If one block defines a variable, for example, that +variable is visible in all block that follow. + +## Websockets for Lua +Civetweb offers support for websockets in Lua as well. In contrast to plain +Lua scripts and Lua server pages, Lua websocket scripts are shared by all clients. + +Lua websocket scripts must define a few functions: + open(arg) -- callback to accept or reject a connection + ready(arg) -- called after a connection has been established + data(arg) -- called when the server receives data from the client + close(arg) -- called when a websocket connection is closed +All function are called with one argument of type table with at least one field +"client" to identify the client. When "open" is called, the argument table additionally +contains the "request_info" table as defined above. For the "data" handler, an +additional field "data" is available. The functions "open", "ready" and "data" +must return true in order to keep the connetion open. + +Lua websocket pages do support single shot (timeout) and interval timers. + +An example is shown in +[websocket.lua](https://github.com/civetweb/civetweb/blob/master/test/websocket.lua). + + +# Common Problems +- PHP doesn't work - getting empty page, or 'File not found' error. The + reason for that is wrong paths to the interpreter. Remember that with PHP, + the correct interpreter is `php-cgi.exe` (`php-cgi` on UNIX). + Solution: specify the full path to the PHP interpreter, e.g.: + `civetweb -cgi_interpreter /full/path/to/php-cgi` + +- Civetweb fails to start. If Civetweb exits immediately when started, this + usually indicates a syntax error in the configuration file + (named `civetweb.conf` by default) or the command-line arguments. + Syntax checking is omitted from Civetweb to keep its size low. However, + the Manual should be of help. Note: the syntax changes from time to time, + so updating the config file might be necessary after executable update. + +- Embedding with OpenSSL on Windows might fail because of calling convention. + To force Civetweb to use `__stdcall` convention, add `/Gz` compilation + flag in Visual Studio compiler. diff --git a/3P/civetweb/docs/yaSSL.md b/3P/civetweb/docs/yaSSL.md new file mode 100644 index 00000000..6ff5ebe5 --- /dev/null +++ b/3P/civetweb/docs/yaSSL.md @@ -0,0 +1,86 @@ +Adding CyaSSL Support +===== + +### Only required for Windows! + +In order to support SSL *HTTPS* connections in Civetweb on Windows, +you may wish to use the GPLv2 licensed CyaSSL library. By using this +library, the resulting binary may have to have the GPL license unless +you buy a commercial license from [wolfSSL](http://www.yassl.com/). + +Getting Started +---- + +- Download Cayssl at http://www.yassl.com/ +- Extract the zip file + - To make this seemless, extract to a directory parallel to with Civetweb is + +### Example Project + +If you download to cyaSSL to cyassl-2.7.0 in a directory parallel to with Civetweb, you can open the *VS2012/civetweb_yassl* solution in Visual Studio. + +Build Configuration +---- + +#### Required include paths for both civetweb and cyassl + - *cyassl_directory*\ + - *cyassl_directory*\cyassl\ + +#### Required civetweb preprocessor defines + - USE_YASSL + - NO_SSL_DL + +#### Required cySSL preprocessor defines + - OPENSSL_EXTRA + - HAVE_ERRNO_H + - HAVE_GETHOSTBYNAME + - HAVE_INET_NTOA + - HAVE_LIMITS_H + - HAVE_MEMSET + - HAVE_SOCKET + - HAVE_STDDEF_H + - HAVE_STDLIB_H + - HAVE_STRING_H + - HAVE_SYS_STAT_H + - HAVE_SYS_TYPES_H + +#### Required CyaSSL source files + + - ctaocrypt/src/aes.c + - ctaocrypt/src/arc4.c + - ctaocrypt/src/asn.c + - ctaocrypt/src/coding.c + - ctaocrypt/src/des3.c + - ctaocrypt/src/dh.c + - ctaocrypt/src/dsa.c + - ctaocrypt/src/ecc.c + - ctaocrypt/src/error.c + - ctaocrypt/src/hc128.c + - ctaocrypt/src/hmac.c + - ctaocrypt/src/integer.c + - ctaocrypt/src/logging.c + - ctaocrypt/src/md2.c + - ctaocrypt/src/md4.c + - ctaocrypt/src/md5.c + - ctaocrypt/src/memory.c + - ctaocrypt/src/misc.c + - ctaocrypt/src/pwdbased.c + - ctaocrypt/src/rabbit.c + - ctaocrypt/src/random.c + - ctaocrypt/src/ripemd.c + - ctaocrypt/src/rsa.c + - ctaocrypt/src/sha.c + - ctaocrypt/src/sha256.c + - ctaocrypt/src/sha512.c + - ctaocrypt/src/tfm.c + - src/crl.c + - src/internal.c + - src/io.c + - src/keys.c + - src/ocsp.c + - src/sniffer.c + - src/ssl.c + - src/tls.c + + + diff --git a/3P/civetweb/examples/chat/Makefile b/3P/civetweb/examples/chat/Makefile new file mode 100644 index 00000000..e8d12be6 --- /dev/null +++ b/3P/civetweb/examples/chat/Makefile @@ -0,0 +1,40 @@ +# +# Copyright (c) 2013 No Face Press, LLC +# License http://opensource.org/licenses/mit-license.php MIT License +# + +#This makefile is used to test the other Makefiles + + +PROG = chat +SRC = chat.c + +TOP = ../.. +CIVETWEB_LIB = libcivetweb.a +SSL_CERT = ssl_cert.pem + +CFLAGS = -I$(TOP)/include $(COPT) +LIBS = -lpthread + +include $(TOP)/resources/Makefile.in-os + +ifeq ($(TARGET_OS),LINUX) + LIBS += -ldl +endif + +all: $(PROG) $(SSL_CERT) + +$(PROG): $(CIVETWEB_LIB) $(SRC) + $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(SRC) $(CIVETWEB_LIB) $(LIBS) + +$(CIVETWEB_LIB): + $(MAKE) -C $(TOP) clean lib + cp $(TOP)/$(CIVETWEB_LIB) . + +$(SSL_CERT): + cp $(TOP)/resources/$(SSL_CERT) . + +clean: + rm -f $(CIVETWEB_LIB) $(PROG) $(SSL_CERT) + +.PHONY: all clean diff --git a/3P/civetweb/examples/chat/chat.c b/3P/civetweb/examples/chat/chat.c new file mode 100644 index 00000000..ad146183 --- /dev/null +++ b/3P/civetweb/examples/chat/chat.c @@ -0,0 +1,403 @@ +// This file is part of the Civetweb project, http://code.google.com/p/civetweb +// It implements an online chat server. For more details, +// see the documentation on the project web site. +// To test the application, +// 1. type "make" in the directory where this file lives +// 2. point your browser to http://127.0.0.1:8081 + +#include +#include +#include +#include +#include +#include +#include + +#include "civetweb.h" + +#define MAX_USER_LEN 20 +#define MAX_MESSAGE_LEN 100 +#define MAX_MESSAGES 5 +#define MAX_SESSIONS 2 +#define SESSION_TTL 120 + +static const char *authorize_url = "/authorize"; +static const char *login_url = "/login.html"; +static const char *ajax_reply_start = + "HTTP/1.1 200 OK\r\n" + "Cache: no-cache\r\n" + "Content-Type: application/x-javascript\r\n" + "\r\n"; + +// Describes single message sent to a chat. If user is empty (0 length), +// the message is then originated from the server itself. +struct message { + long id; // Message ID + char user[MAX_USER_LEN]; // User that have sent the message + char text[MAX_MESSAGE_LEN]; // Message text + time_t timestamp; // Message timestamp, UTC +}; + +// Describes web session. +struct session { + char session_id[33]; // Session ID, must be unique + char random[20]; // Random data used for extra user validation + char user[MAX_USER_LEN]; // Authenticated user + time_t expire; // Expiration timestamp, UTC +}; + +static struct message messages[MAX_MESSAGES]; // Ringbuffer for messages +static struct session sessions[MAX_SESSIONS]; // Current sessions +static long last_message_id; + +// Protects messages, sessions, last_message_id +static pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER; + +// Get session object for the connection. Caller must hold the lock. +static struct session *get_session(const struct mg_connection *conn) +{ + int i; + const char *cookie = mg_get_header(conn, "Cookie"); + char session_id[33]; + time_t now = time(NULL); + mg_get_cookie(cookie, "session", session_id, sizeof(session_id)); + for (i = 0; i < MAX_SESSIONS; i++) { + if (sessions[i].expire != 0 && + sessions[i].expire > now && + strcmp(sessions[i].session_id, session_id) == 0) { + break; + } + } + return i == MAX_SESSIONS ? NULL : &sessions[i]; +} + +static void get_qsvar(const struct mg_request_info *request_info, + const char *name, char *dst, size_t dst_len) +{ + const char *qs = request_info->query_string; + mg_get_var(qs, strlen(qs == NULL ? "" : qs), name, dst, dst_len); +} + +// Get a get of messages with IDs greater than last_id and transform them +// into a JSON string. Return that string to the caller. The string is +// dynamically allocated, caller must free it. If there are no messages, +// NULL is returned. +static char *messages_to_json(long last_id) +{ + const struct message *message; + int max_msgs, len; + char buf[sizeof(messages)]; // Large enough to hold all messages + + // Read-lock the ringbuffer. Loop over all messages, making a JSON string. + pthread_rwlock_rdlock(&rwlock); + len = 0; + max_msgs = sizeof(messages) / sizeof(messages[0]); + // If client is too far behind, return all messages. + if (last_message_id - last_id > max_msgs) { + last_id = last_message_id - max_msgs; + } + for (; last_id < last_message_id; last_id++) { + message = &messages[last_id % max_msgs]; + if (message->timestamp == 0) { + break; + } + // buf is allocated on stack and hopefully is large enough to hold all + // messages (it may be too small if the ringbuffer is full and all + // messages are large. in this case asserts will trigger). + len += snprintf(buf + len, sizeof(buf) - len, + "{user: '%s', text: '%s', timestamp: %lu, id: %ld},", + message->user, message->text, message->timestamp, message->id); + assert(len > 0); + assert((size_t) len < sizeof(buf)); + } + pthread_rwlock_unlock(&rwlock); + + return len == 0 ? NULL : strdup(buf); +} + +// If "callback" param is present in query string, this is JSONP call. +// Return 1 in this case, or 0 if "callback" is not specified. +// Wrap an output in Javascript function call. +static int handle_jsonp(struct mg_connection *conn, + const struct mg_request_info *request_info) +{ + char cb[64]; + + get_qsvar(request_info, "callback", cb, sizeof(cb)); + if (cb[0] != '\0') { + mg_printf(conn, "%s(", cb); + } + + return cb[0] == '\0' ? 0 : 1; +} + +// A handler for the /ajax/get_messages endpoint. +// Return a list of messages with ID greater than requested. +static void ajax_get_messages(struct mg_connection *conn, + const struct mg_request_info *request_info) +{ + char last_id[32], *json; + int is_jsonp; + + mg_printf(conn, "%s", ajax_reply_start); + is_jsonp = handle_jsonp(conn, request_info); + + get_qsvar(request_info, "last_id", last_id, sizeof(last_id)); + if ((json = messages_to_json(strtoul(last_id, NULL, 10))) != NULL) { + mg_printf(conn, "[%s]", json); + free(json); + } + + if (is_jsonp) { + mg_printf(conn, "%s", ")"); + } +} + +// Allocate new message. Caller must hold the lock. +static struct message *new_message(void) +{ + static int size = sizeof(messages) / sizeof(messages[0]); + struct message *message = &messages[last_message_id % size]; + message->id = last_message_id++; + message->timestamp = time(0); + return message; +} + +static void my_strlcpy(char *dst, const char *src, size_t len) +{ + strncpy(dst, src, len); + dst[len - 1] = '\0'; +} + +// A handler for the /ajax/send_message endpoint. +static void ajax_send_message(struct mg_connection *conn, + const struct mg_request_info *request_info) +{ + struct message *message; + struct session *session; + char text[sizeof(message->text) - 1]; + int is_jsonp; + + mg_printf(conn, "%s", ajax_reply_start); + is_jsonp = handle_jsonp(conn, request_info); + + get_qsvar(request_info, "text", text, sizeof(text)); + if (text[0] != '\0') { + // We have a message to store. Write-lock the ringbuffer, + // grab the next message and copy data into it. + pthread_rwlock_wrlock(&rwlock); + message = new_message(); + // TODO(lsm): JSON-encode all text strings + session = get_session(conn); + assert(session != NULL); + my_strlcpy(message->text, text, sizeof(text)); + my_strlcpy(message->user, session->user, sizeof(message->user)); + pthread_rwlock_unlock(&rwlock); + } + + mg_printf(conn, "%s", text[0] == '\0' ? "false" : "true"); + + if (is_jsonp) { + mg_printf(conn, "%s", ")"); + } +} + +// Redirect user to the login form. In the cookie, store the original URL +// we came from, so that after the authorization we could redirect back. +static void redirect_to_login(struct mg_connection *conn, + const struct mg_request_info *request_info) +{ + mg_printf(conn, "HTTP/1.1 302 Found\r\n" + "Set-Cookie: original_url=%s\r\n" + "Location: %s\r\n\r\n", + request_info->uri, login_url); +} + +// Return 1 if username/password is allowed, 0 otherwise. +static int check_password(const char *user, const char *password) +{ + // In production environment we should ask an authentication system + // to authenticate the user. + // Here however we do trivial check that user and password are not empty + return (user[0] && password[0]); +} + +// Allocate new session object +static struct session *new_session(void) +{ + int i; + time_t now = time(NULL); + pthread_rwlock_wrlock(&rwlock); + for (i = 0; i < MAX_SESSIONS; i++) { + if (sessions[i].expire == 0 || sessions[i].expire < now) { + sessions[i].expire = time(0) + SESSION_TTL; + break; + } + } + pthread_rwlock_unlock(&rwlock); + return i == MAX_SESSIONS ? NULL : &sessions[i]; +} + +// Generate session ID. buf must be 33 bytes in size. +// Note that it is easy to steal session cookies by sniffing traffic. +// This is why all communication must be SSL-ed. +static void generate_session_id(char *buf, const char *random, + const char *user) +{ + mg_md5(buf, random, user, NULL); +} + +static void send_server_message(const char *fmt, ...) +{ + va_list ap; + struct message *message; + + pthread_rwlock_wrlock(&rwlock); + message = new_message(); + message->user[0] = '\0'; // Empty user indicates server message + va_start(ap, fmt); + vsnprintf(message->text, sizeof(message->text), fmt, ap); + va_end(ap); + + pthread_rwlock_unlock(&rwlock); +} + +// A handler for the /authorize endpoint. +// Login page form sends user name and password to this endpoint. +static void authorize(struct mg_connection *conn, + const struct mg_request_info *request_info) +{ + char user[MAX_USER_LEN], password[MAX_USER_LEN]; + struct session *session; + + // Fetch user name and password. + get_qsvar(request_info, "user", user, sizeof(user)); + get_qsvar(request_info, "password", password, sizeof(password)); + + if (check_password(user, password) && (session = new_session()) != NULL) { + // Authentication success: + // 1. create new session + // 2. set session ID token in the cookie + // 3. remove original_url from the cookie - not needed anymore + // 4. redirect client back to the original URL + // + // The most secure way is to stay HTTPS all the time. However, just to + // show the technique, we redirect to HTTP after the successful + // authentication. The danger of doing this is that session cookie can + // be stolen and an attacker may impersonate the user. + // Secure application must use HTTPS all the time. + my_strlcpy(session->user, user, sizeof(session->user)); + snprintf(session->random, sizeof(session->random), "%d", rand()); + generate_session_id(session->session_id, session->random, session->user); + send_server_message("<%s> joined", session->user); + mg_printf(conn, "HTTP/1.1 302 Found\r\n" + "Set-Cookie: session=%s; max-age=3600; http-only\r\n" // Session ID + "Set-Cookie: user=%s\r\n" // Set user, needed by Javascript code + "Set-Cookie: original_url=/; max-age=0\r\n" // Delete original_url + "Location: /\r\n\r\n", + session->session_id, session->user); + } else { + // Authentication failure, redirect to login. + redirect_to_login(conn, request_info); + } +} + +// Return 1 if request is authorized, 0 otherwise. +static int is_authorized(const struct mg_connection *conn, + const struct mg_request_info *request_info) +{ + struct session *session; + char valid_id[33]; + int authorized = 0; + + // Always authorize accesses to login page and to authorize URI + if (!strcmp(request_info->uri, login_url) || + !strcmp(request_info->uri, authorize_url)) { + return 1; + } + + pthread_rwlock_rdlock(&rwlock); + if ((session = get_session(conn)) != NULL) { + generate_session_id(valid_id, session->random, session->user); + if (strcmp(valid_id, session->session_id) == 0) { + session->expire = time(0) + SESSION_TTL; + authorized = 1; + } + } + pthread_rwlock_unlock(&rwlock); + + return authorized; +} + +static void redirect_to_ssl(struct mg_connection *conn, + const struct mg_request_info *request_info) +{ + const char *p, *host = mg_get_header(conn, "Host"); + if (host != NULL && (p = strchr(host, ':')) != NULL) { + mg_printf(conn, "HTTP/1.1 302 Found\r\n" + "Location: https://%.*s:8082/%s:8082\r\n\r\n", + (int) (p - host), host, request_info->uri); + } else { + mg_printf(conn, "%s", "HTTP/1.1 500 Error\r\n\r\nHost: header is not set"); + } +} + +static int begin_request_handler(struct mg_connection *conn) +{ + const struct mg_request_info *request_info = mg_get_request_info(conn); + int processed = 1; + + if (!request_info->is_ssl) { + redirect_to_ssl(conn, request_info); + } else if (!is_authorized(conn, request_info)) { + redirect_to_login(conn, request_info); + } else if (strcmp(request_info->uri, authorize_url) == 0) { + authorize(conn, request_info); + } else if (strcmp(request_info->uri, "/ajax/get_messages") == 0) { + ajax_get_messages(conn, request_info); + } else if (strcmp(request_info->uri, "/ajax/send_message") == 0) { + ajax_send_message(conn, request_info); + } else { + // No suitable handler found, mark as not processed. Civetweb will + // try to serve the request. + processed = 0; + } + return processed; +} + +static const char *options[] = { + "document_root", "html", + "listening_ports", "8081,8082s", + "ssl_certificate", "ssl_cert.pem", + "num_threads", "5", + NULL +}; + +int main(void) +{ + struct mg_callbacks callbacks; + struct mg_context *ctx; + + // Initialize random number generator. It will be used later on for + // the session identifier creation. + srand((unsigned) time(0)); + + // Setup and start Civetweb + memset(&callbacks, 0, sizeof(callbacks)); + callbacks.begin_request = begin_request_handler; + if ((ctx = mg_start(&callbacks, NULL, options)) == NULL) { + printf("%s\n", "Cannot start chat server, fatal exit"); + exit(EXIT_FAILURE); + } + + // Wait until enter is pressed, then exit + printf("Chat server started on ports %s, press enter to quit.\n", + mg_get_option(ctx, "listening_ports")); + getchar(); + mg_stop(ctx); + printf("%s\n", "Chat server stopped."); + + return EXIT_SUCCESS; +} + +// vim:ts=2:sw=2:et diff --git a/3P/civetweb/examples/docroot/favicon.ico b/3P/civetweb/examples/docroot/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2179aba8945385fd87569117f96adc484fd8d736 GIT binary patch literal 1406 zcmZQzU<5(|0R}M0U}azs1F|%L7$l?s#Ec9aKoZP=&}i&A6@duxQPyY(jE2C-4FN_J z04zLE0EmwW8xR{CAEE^!2T=nOLFN-;qpL^d!(0F}6O|8A3j-i~kO533oc{lxfuRBD bG!UNu6M|<*GBAMf%$X1jOpz|mE;t5 literal 0 HcmV?d00001 diff --git a/3P/civetweb/examples/docroot/index.html b/3P/civetweb/examples/docroot/index.html new file mode 100644 index 00000000..c85bec99 --- /dev/null +++ b/3P/civetweb/examples/docroot/index.html @@ -0,0 +1,73 @@ + + + + + Civetweb chat server + + + + + + + + +
+ +
+
+ + + +
+ +
+
+ Main room +
+
+
+ + + Type your message here and press enter +
+
+
+ + + +
+
+ + + + + diff --git a/3P/civetweb/examples/docroot/jquery.js b/3P/civetweb/examples/docroot/jquery.js new file mode 100644 index 00000000..7c243080 --- /dev/null +++ b/3P/civetweb/examples/docroot/jquery.js @@ -0,0 +1,154 @@ +/*! + * jQuery JavaScript Library v1.4.2 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Sat Feb 13 22:33:48 2010 -0500 + */ +(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, +Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& +(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, +a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== +"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, +function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
a"; +var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, +parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= +false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= +s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, +applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; +else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, +a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== +w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, +cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= +c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); +a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, +function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); +k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), +C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= +e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& +f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; +if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", +e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, +"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, +d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); +t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| +g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, +CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, +g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, +text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, +setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= +h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== +"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, +h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& +q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; +if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); +(function(){var g=s.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: +function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= +{},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== +"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", +d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? +a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== +1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= +c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, +wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, +prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, +this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); +return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, +""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); +return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", +""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= +c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? +c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= +function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= +Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, +"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= +a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= +a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== +"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, +serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), +function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, +global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& +e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? +"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== +false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= +false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", +c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| +d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); +g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== +1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== +"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; +if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== +"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| +c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; +this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= +this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, +e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
"; +a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); +c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, +d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- +f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": +"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in +e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); diff --git a/3P/civetweb/examples/docroot/login.html b/3P/civetweb/examples/docroot/login.html new file mode 100644 index 00000000..2b09f01c --- /dev/null +++ b/3P/civetweb/examples/docroot/login.html @@ -0,0 +1,43 @@ + + + + + Civetweb chat: login + + + + + + + +
+

Civetweb chat server login

+
+ Username and password can be any non-empty strings. +
+
+
+
+
+ +
+
+ + diff --git a/3P/civetweb/examples/docroot/logo.png b/3P/civetweb/examples/docroot/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8a47c0ab8d8ba81346474cec5f93f95a82781366 GIT binary patch literal 1601 zcmV-H2EO@;P)001Zm1^@s6c`Wgm000IENklgwb_dd%uzj`W)#_JkU+n^a`>5f62YA3gxno-2Uym6P@b&}G7|}Bp%gqD2*>4VH zoFMa?ki+IkZiXk|_rwAhY=;6Mgh_+9%%q54>LO2M9P@ZmtD#H3k_B z=e19g&)+!j>h#Gm#J~lteNL=b{Q;7X-$lRyWO@Suk6?m*nF#__>e)x{S_Lk2BM@zY z{wMf-Pwc?#4V_}-GlM7iCwB(j7wET*Al}{6trz6*dad4}Q0QI2`ko;6@0j>*VR)lX zKtcq(DhYT)fhZSK;>lSEl8=Ev*S~iq%Y_)9MW-0~iXbXSh`TV4mcV@>?pjJ~dsua{%9n!N#o%ey zc2JP7XV%FYyW_T1j0wk)twMIE$sDz= zNx7(+u|B~iZ0&<1unu*0~A!a-i$qq-riRt4i#AjBWV#a{y?FjNC5Mv|6u$%?l8Y>nJ zQ;KRB@0CXusP`yA8->FRbE)TstjJvmtZ}wOP0T|vVNU}AkA(TJ0_NVTQ_L7Bk3gM+ zhO){<>9T6U1sAX$Ej-T=>*e>qCBU_G{kRT~)s z7R)B;iQRn&l$Sy}#f+h2$b?CBP!LZ;Kxa4zpe)lDgoWk^*f9O%Oy#3C5^(np0iQyVH)jaqn8llgIAcZxESZ?o1>Dz>i5smt#f)Jk z&)}6ExUvf8!Y(MevJ$W+u5tC#n=uhvi`re_rG~d-K&pc~Gx3}&nh6Cd3z`ubWEY45 zZ-FB(?l{h>lSRH_-0fLeOz#LnXyLK9 zSHkt20!K2BKr-XJ2|FQ6(@u~B2B$ToXK_Kn6ai+{U^Jxa-icyCtt`R1LP zP+)-{K(ZTiWLSNZPFDH7R~Y}~M^UTmEYZnP2rcN_F`K0fSbxWOps0_NwqVf?C=jmU znnMHD`1UgUp6?Gdul%e#v-oD6zH1DB9S0zEiNX)}R|Z%xvCav0arzAN_h3Eg`jcx? zfJLga^yy_nLPA19LPA19LPA19LPA19f`tD7^cB7*C@iPE00000NkvXXu0mjf$KluH literal 0 HcmV?d00001 diff --git a/3P/civetweb/examples/docroot/main.js b/3P/civetweb/examples/docroot/main.js new file mode 100644 index 00000000..d4af86dd --- /dev/null +++ b/3P/civetweb/examples/docroot/main.js @@ -0,0 +1,107 @@ +// This file is part of Civetweb project, +// http://sourceforge.net/projects/civetweb/ + +var chat = { + // Backend URL, string. + // 'http://backend.address.com' or '' if backend is the same as frontend + backendUrl: '', + maxVisibleMessages: 10, + errorMessageFadeOutTimeoutMs: 2000, + errorMessageFadeOutTimer: null, + lastMessageId: 0, + getMessagesIntervalMs: 1000, +}; + +chat.normalizeText = function(text) { + return text.replace('<', '<').replace('>', '>'); +}; + +chat.refresh = function(data) { + + if (data === undefined) { + return; + } + + $.each(data, function(index, entry) { + var row = $('
').addClass('message-row').appendTo('#mml'); + var timestamp = (new Date(entry.timestamp * 1000)).toLocaleTimeString(); + $('') + .addClass('message-timestamp') + .html('[' + timestamp + ']') + .prependTo(row); + $('') + .addClass('message-user') + .addClass(entry.user ? '' : 'message-user-server') + .html(chat.normalizeText((entry.user || '[server]') + ':')) + .appendTo(row); + $('') + .addClass('message-text') + .addClass(entry.user ? '' : 'message-text-server') + .html(chat.normalizeText(entry.text)) + .appendTo(row); + chat.lastMessageId = Math.max(chat.lastMessageId, entry.id) + 1; + }); + + // Keep only chat.maxVisibleMessages, delete older ones. + while ($('#mml').children().length > chat.maxVisibleMessages) { + $('#mml div:first-child').remove(); + } +}; + +chat.getMessages = function(enter_loop) { + $.ajax({ + dataType: 'jsonp', + url: chat.backendUrl + '/ajax/get_messages', + data: {last_id: chat.lastMessageId}, + success: chat.refresh, + error: function() { + }, + }); + if (enter_loop) { + window.setTimeout('chat.getMessages(true)', chat.getMessagesIntervalMs); + } +}; + +chat.handleMenuItemClick = function(ev) { + $('.menu-item').removeClass('menu-item-selected'); // Deselect menu buttons + $(this).addClass('menu-item-selected'); // Select clicked button + $('.main').addClass('hidden'); // Hide all main windows + $('#' + $(this).attr('name')).removeClass('hidden'); // Show main window +}; + +chat.showError = function(message) { + $('#error').html(message).fadeIn('fast'); + window.clearTimeout(chat.errorMessageFadeOutTimer); + chat.errorMessageFadeOutTimer = window.setTimeout(function() { + $('#error').fadeOut('slow'); + }, chat.errorMessageFadeOutTimeoutMs); +}; + +chat.handleMessageInput = function(ev) { + var input = ev.target; + if (ev.keyCode != 13 || !input.value) + return; + //input.disabled = true; + $.ajax({ + dataType: 'jsonp', + url: chat.backendUrl + '/ajax/send_message', + data: {text: input.value}, + success: function(ev) { + input.value = ''; + input.disabled = false; + chat.getMessages(false); + }, + error: function(ev) { + chat.showError('Error sending message'); + input.disabled = false; + }, + }); +}; + +$(document).ready(function() { + $('.menu-item').click(chat.handleMenuItemClick); + $('.message-input').keypress(chat.handleMessageInput); + chat.getMessages(true); +}); + +// vim:ts=2:sw=2:et diff --git a/3P/civetweb/examples/docroot/prime_numbers.lp b/3P/civetweb/examples/docroot/prime_numbers.lp new file mode 100644 index 00000000..0c71bb82 --- /dev/null +++ b/3P/civetweb/examples/docroot/prime_numbers.lp @@ -0,0 +1,46 @@ +HTTP/1.0 200 OK +Content-Type: text/html + + +

Prime numbers from 0 to 100, calculated by Lua:

+ ' .. i .. '
 ') end + end + + ?> + +

Reading POST data from Lua (click submit):

+
+ +
+   POST data: []
+   request method: []
+   IP/port: []
+   URI: []
+   HTTP version []
+   HEADERS:
+   
+
+ diff --git a/3P/civetweb/examples/docroot/style.css b/3P/civetweb/examples/docroot/style.css new file mode 100644 index 00000000..716351d2 --- /dev/null +++ b/3P/civetweb/examples/docroot/style.css @@ -0,0 +1,154 @@ +/* + * vim:ts=2:sw=2:et:ai + */ + +body { + font: 13px Arial; margin: 0.5em 1em; +} + +#logo { + background: url('logo.png') no-repeat ; + width: 160px; + height: 40px; + float: left; +} + +td { + text-align: left; +} + +#motd { + margin-left: 170px; +} + +.infobox { + background: #eed; + padding: 1px 1em; +} + +.help-message { + color: #aaa; +} + +#middle { + margin: 0.5em 0; +} + +#error { + background: #c44; + color: white; + font-weight: bold; +} + +#content, .menu-item-selected, .chat-title, .chat-content { + background: #c3d9ff; +} + +#content { + overflow: hidden; + min-height: 7em; + padding: 1em; +} + +.chat-title { + padding: 1px 1ex; +} + +.chat-content { + padding: 1ex; +} + +.chat-window { +} + +.message-row { + margin: 2px; + border-bottom: 1px solid #bbb; +} + +.message-timestamp { + color: #484; +} + +.message-user { + margin-left: 0.5em; + font-weight: bold; +} + +.message-text { + margin-left: 0.5em; +} + +.message-user-server { + color: purple; +} + +.message-text-server { + font-style: italic; +} + +.main { + padding: 0.5em; + background: #f0fcff; +} + +#menu { + margin-top: 1em; + min-width: 7em; + float: left; +} + +#footer { + position: fixed; + bottom: 0; + right: 0; + color: #ccc; + padding: 0.5em; +} + +.section { + clear: both; +} + +.hidden { + display: none; +} + +.menu-item { + cursor: pointer; + padding: 0.1em 0.5em; +} + +.menu-item-selected { + font-weight: bold; +} + +.message-list { + min-height: 1em; + background: white; + margin: 0.5em 0; +} + +.rounded { + border-radius: 6px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; +} + +.left-rounded { + border-radius: 6px 0 0 6px; + -moz-border-radius: 6px 0 0 6px; + -webkit-border-radius: 6px 0 0 6px; +} + +.bottom-rounded { + border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + -webkit-border-radius: 0 0 6px 6px; +} + +.top-rounded { + border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + -webkit-border-radius: 6px 6px 0 0; +} diff --git a/3P/civetweb/examples/embedded_c/Makefile b/3P/civetweb/examples/embedded_c/Makefile new file mode 100644 index 00000000..665bdc8b --- /dev/null +++ b/3P/civetweb/examples/embedded_c/Makefile @@ -0,0 +1,36 @@ +# +# Copyright (c) 2013 No Face Press, LLC +# License http://opensource.org/licenses/mit-license.php MIT License +# + +#This makefile is used to test the other Makefiles + + +PROG = embedded_c +SRC = embedded_c.c + +TOP = ../.. +CIVETWEB_LIB = libcivetweb.a + +CFLAGS = -I$(TOP)/include $(COPT) -DUSE_WEBSOCKET -DUSE_IPV6 +LIBS = -lpthread + +include $(TOP)/resources/Makefile.in-os + +ifeq ($(TARGET_OS),LINUX) + LIBS += -ldl +endif + +all: $(PROG) + +$(PROG): $(CIVETWEB_LIB) $(SRC) + $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(SRC) $(CIVETWEB_LIB) $(LIBS) + +$(CIVETWEB_LIB): + $(MAKE) -C $(TOP) clean lib + cp $(TOP)/$(CIVETWEB_LIB) . + +clean: + rm -f $(CIVETWEB_LIB) $(PROG) + +.PHONY: all clean diff --git a/3P/civetweb/examples/embedded_c/embedded_c.c b/3P/civetweb/examples/embedded_c/embedded_c.c new file mode 100644 index 00000000..31c4eecd --- /dev/null +++ b/3P/civetweb/examples/embedded_c/embedded_c.c @@ -0,0 +1,462 @@ +/* +* Copyright (c) 2013-2015 the CivetWeb developers +* Copyright (c) 2013 No Face Press, LLC +* License http://opensource.org/licenses/mit-license.php MIT License +*/ + +/* Simple example program on how to use CivetWeb embedded into a C program. */ +#ifdef _WIN32 +#include +#else +#include +#endif + +#include +#include + +#include "civetweb.h" + + +#define DOCUMENT_ROOT "." +#ifdef NO_SSL +#ifdef USE_IPV6 +#define PORT "[::]:8888" +#else +#define PORT "8888" +#endif +#else +#ifdef USE_IPV6 +#define PORT "[::]:8888r,[::]:8843s" +#else +#define PORT "8888r,8843s" +#endif +#endif +#define EXAMPLE_URI "/example" +#define EXIT_URI "/exit" +int exitNow = 0; + + +int +ExampleHandler(struct mg_connection *conn, void *cbdata) +{ + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); + mg_printf(conn, ""); + mg_printf(conn, "

This is an example text from a C handler

"); + mg_printf( + conn, + "

To see a page from the A handler click A

"); + mg_printf(conn, + "

To see a page from the A handler click " + "A/A

"); + mg_printf(conn, + "

To see a page from the A/B handler click A/B

"); + mg_printf(conn, + "

To see a page from the B handler (0) click B

"); + mg_printf(conn, + "

To see a page from the B handler (1) click B/A

"); + mg_printf(conn, + "

To see a page from the B handler (2) click B/B

"); + mg_printf(conn, + "

To see a page from the *.foo handler click xy.foo

"); +#ifdef USE_WEBSOCKET + mg_printf(conn, + "

To test websocket handler click " + "websocket

"); +#endif + mg_printf(conn, "

To exit click exit

", EXIT_URI); + mg_printf(conn, "\n"); + return 1; +} + + +int +ExitHandler(struct mg_connection *conn, void *cbdata) +{ + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\n"); + mg_printf(conn, "Server will shut down.\n"); + mg_printf(conn, "Bye!\n"); + exitNow = 1; + return 1; +} + + +int +AHandler(struct mg_connection *conn, void *cbdata) +{ + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); + mg_printf(conn, ""); + mg_printf(conn, "

This is the A handler!!!

"); + mg_printf(conn, "\n"); + return 1; +} + + +int +ABHandler(struct mg_connection *conn, void *cbdata) +{ + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); + mg_printf(conn, ""); + mg_printf(conn, "

This is the AB handler!!!

"); + mg_printf(conn, "\n"); + return 1; +} + + +int +BXHandler(struct mg_connection *conn, void *cbdata) +{ + /* Handler may access the request info using mg_get_request_info */ + const struct mg_request_info *req_info = mg_get_request_info(conn); + + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); + mg_printf(conn, ""); + mg_printf(conn, "

This is the BX handler %p!!!

", cbdata); + mg_printf(conn, "

The actual uri is %s

", req_info->uri); + mg_printf(conn, "\n"); + return 1; +} + + +int +FooHandler(struct mg_connection *conn, void *cbdata) +{ + /* Handler may access the request info using mg_get_request_info */ + const struct mg_request_info *req_info = mg_get_request_info(conn); + + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); + mg_printf(conn, ""); + mg_printf(conn, "

This is the Foo handler!!!

"); + mg_printf(conn, + "

The request was:

%s %s HTTP/%s

", + req_info->request_method, + req_info->uri, + req_info->http_version); + mg_printf(conn, "\n"); + return 1; +} + + +int +WebSocketStartHandler(struct mg_connection *conn, void *cbdata) +{ + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"); + + mg_printf(conn, "\n"); + mg_printf(conn, "\n\n"); + mg_printf(conn, "\n"); + mg_printf(conn, "Embedded websocket example\n"); + +#ifdef USE_WEBSOCKET + /* mg_printf(conn, "\n"); ... xhtml style */ + mg_printf(conn, "\n"); + mg_printf(conn, "\n\n"); + mg_printf( + conn, + "
No websocket connection yet
\n"); +#else + mg_printf(conn, "\n\n"); + mg_printf(conn, "Example not compiled with USE_WEBSOCKET\n"); +#endif + mg_printf(conn, "\n\n"); + + return 1; +} + + +#ifdef USE_WEBSOCKET + +/* MAX_WS_CLIENTS defines how many clients can connect to a websocket at the + * same time. The value 5 is very small and used here only for demonstration; + * it can be easily tested to connect more than MAX_WS_CLIENTS clients. + * A real server should use a much higher number, or better use a dynamic list + * of currently connected websocket clients. */ +#define MAX_WS_CLIENTS (5) + +struct t_ws_client { + struct mg_connection *conn; + int state; +} static ws_clients[MAX_WS_CLIENTS]; + + +#define ASSERT(x) \ + { \ + if (!(x)) { \ + fprintf(stderr, \ + "Assertion failed in line %u\n", \ + (unsigned)__LINE__); \ + } \ + } + + +int +WebSocketConnectHandler(const struct mg_connection *conn, void *cbdata) +{ + struct mg_context *ctx = mg_get_context(conn); + int reject = 1; + int i; + + mg_lock_context(ctx); + for (i = 0; i < MAX_WS_CLIENTS; i++) { + if (ws_clients[i].conn == NULL) { + ws_clients[i].conn = (struct mg_connection *)conn; + ws_clients[i].state = 1; + mg_set_user_connection_data(conn, (void *)(ws_clients + i)); + reject = 0; + break; + } + } + mg_unlock_context(ctx); + + fprintf(stdout, + "Websocket client %s\r\n\r\n", + (reject ? "rejected" : "accepted")); + return reject; +} + + +void +WebSocketReadyHandler(struct mg_connection *conn, void *cbdata) +{ + const char *text = "Hello from the websocket ready handler"; + struct t_ws_client *client = mg_get_user_connection_data(conn); + + mg_websocket_write(conn, WEBSOCKET_OPCODE_TEXT, text, strlen(text)); + fprintf(stdout, "Greeting message sent to websocket client\r\n\r\n"); + ASSERT(client->conn == conn); + ASSERT(client->state == 1); + + client->state = 2; +} + + +int +WebsocketDataHandler(struct mg_connection *conn, + int bits, + char *data, + size_t len, + void *cbdata) +{ + struct t_ws_client *client = mg_get_user_connection_data(conn); + ASSERT(client->conn == conn); + ASSERT(client->state >= 1); + + fprintf(stdout, "Websocket got data:\r\n"); + fwrite(data, len, 1, stdout); + fprintf(stdout, "\r\n\r\n"); + + return 1; +} + + +void +WebSocketCloseHandler(const struct mg_connection *conn, void *cbdata) +{ + struct mg_context *ctx = mg_get_context(conn); + struct t_ws_client *client = mg_get_user_connection_data(conn); + ASSERT(client->conn == conn); + ASSERT(client->state >= 1); + + mg_lock_context(ctx); + client->state = 0; + client->conn = NULL; + mg_unlock_context(ctx); + + fprintf(stdout, + "Client droped from the set of webserver connections\r\n\r\n"); +} + + +void +InformWebsockets(struct mg_context *ctx) +{ + static unsigned long cnt = 0; + char text[32]; + int i; + + sprintf(text, "%lu", ++cnt); + + mg_lock_context(ctx); + for (i = 0; i < MAX_WS_CLIENTS; i++) { + if (ws_clients[i].state == 2) { + mg_websocket_write(ws_clients[i].conn, + WEBSOCKET_OPCODE_TEXT, + text, + strlen(text)); + } + } + mg_unlock_context(ctx); +} +#endif + + +int +main(int argc, char *argv[]) +{ + const char *options[] = {"document_root", + DOCUMENT_ROOT, + "listening_ports", + PORT, + "request_timeout_ms", + "10000", + "error_log_file", + "error.log", +#ifdef USE_WEBSOCKET + "websocket_timeout_ms", + "3600000", +#endif +#ifndef NO_SSL + "ssl_certificate", + "../../resources/cert/server.pem", +#endif + 0}; + struct mg_callbacks callbacks; + struct mg_context *ctx; + struct mg_server_ports ports[32]; + int port_cnt, n; + int err = 0; + +/* Check if libcivetweb has been built with all required features. */ +#ifdef USE_IPV6 + if (!mg_check_feature(8)) { + fprintf(stderr, + "Error: Embedded example built with websocket support, " + "but civetweb library build without.\n"); + err = 1; + } +#endif +#ifdef USE_WEBSOCKET + if (!mg_check_feature(16)) { + fprintf(stderr, + "Error: Embedded example built with websocket support, " + "but civetweb library build without.\n"); + err = 1; + } +#endif +#ifndef NO_SSL + if (!mg_check_feature(2)) { + fprintf(stderr, + "Error: Embedded example built with SSL support, " + "but civetweb library build without.\n"); + err = 1; + } +#endif + if (err) { + fprintf(stderr, "Cannot start CivetWeb - inconsistent build.\n"); + return EXIT_FAILURE; + } + + /* Start CivetWeb web server */ + memset(&callbacks, 0, sizeof(callbacks)); + ctx = mg_start(&callbacks, 0, options); + + /* Add handler EXAMPLE_URI, to explain the example */ + mg_set_request_handler(ctx, EXAMPLE_URI, ExampleHandler, 0); + mg_set_request_handler(ctx, EXIT_URI, ExitHandler, 0); + + /* Add handler for /A* and special handler for /A/B */ + mg_set_request_handler(ctx, "/A", AHandler, 0); + mg_set_request_handler(ctx, "/A/B", ABHandler, 0); + + /* Add handler for /B, /B/A, /B/B but not for /B* */ + mg_set_request_handler(ctx, "/B$", BXHandler, (void *)0); + mg_set_request_handler(ctx, "/B/A$", BXHandler, (void *)1); + mg_set_request_handler(ctx, "/B/B$", BXHandler, (void *)2); + + /* Add handler for all files with .foo extention */ + mg_set_request_handler(ctx, "**.foo$", FooHandler, 0); + + /* Add HTTP site to open a websocket connection */ + mg_set_request_handler(ctx, "/websocket", WebSocketStartHandler, 0); + +#ifdef USE_WEBSOCKET + /* WS site for the websocket connection */ + mg_set_websocket_handler(ctx, + "/websocket", + WebSocketConnectHandler, + WebSocketReadyHandler, + WebsocketDataHandler, + WebSocketCloseHandler, + 0); +#endif + + /* List all listening ports */ + memset(ports, 0, sizeof(ports)); + port_cnt = mg_get_server_ports(ctx, 32, ports); + printf("\n%i listening ports:\n\n", port_cnt); + + for (n = 0; n < port_cnt && n < 32; n++) { + const char *proto = ports[n].is_ssl ? "https" : "http"; + const char *host; + + if ((ports[n].protocol & 1) == 1) { + /* IPv4 */ + host = "127.0.0.1"; + printf("Browse files at %s://%s:%i/\n", proto, host, ports[n].port); + printf("Run example at %s://%s:%i%s\n", + proto, + host, + ports[n].port, + EXAMPLE_URI); + printf( + "Exit at %s://%s:%i%s\n", proto, host, ports[n].port, EXIT_URI); + printf("\n"); + } + + if ((ports[n].protocol & 2) == 2) { + /* IPv6 */ + host = "[::1]"; + printf("Browse files at %s://%s:%i/\n", proto, host, ports[n].port); + printf("Run example at %s://%s:%i%s\n", + proto, + host, + ports[n].port, + EXAMPLE_URI); + printf( + "Exit at %s://%s:%i%s\n", proto, host, ports[n].port, EXIT_URI); + printf("\n"); + } + } + + /* Wait until the server should be closed */ + while (!exitNow) { +#ifdef _WIN32 + Sleep(1000); +#else + sleep(1); +#endif +#ifdef USE_WEBSOCKET + InformWebsockets(ctx); +#endif + } + + /* Stop the server */ + mg_stop(ctx); + printf("Server stopped.\n"); + printf("Bye!\n"); + + return EXIT_SUCCESS; +} diff --git a/3P/civetweb/examples/embedded_cpp/Makefile b/3P/civetweb/examples/embedded_cpp/Makefile new file mode 100644 index 00000000..65adf98b --- /dev/null +++ b/3P/civetweb/examples/embedded_cpp/Makefile @@ -0,0 +1,36 @@ +# +# Copyright (c) 2013 No Face Press, LLC +# License http://opensource.org/licenses/mit-license.php MIT License +# + +#This makefile is used to test the other Makefiles + + +PROG = embedded_cpp +SRC = embedded_cpp.cpp + +TOP = ../.. +CIVETWEB_LIB = libcivetweb.a + +CFLAGS = -I$(TOP)/include $(COPT) +LIBS = -lpthread + +include $(TOP)/resources/Makefile.in-os + +ifeq ($(TARGET_OS),LINUX) + LIBS += -ldl +endif + +all: $(PROG) + +$(PROG): $(CIVETWEB_LIB) $(SRC) + $(CXX) -o $@ $(CFLAGS) $(LDFLAGS) $(SRC) $(CIVETWEB_LIB) $(LIBS) + +$(CIVETWEB_LIB): + $(MAKE) -C $(TOP) clean lib WITH_CPP=1 + cp $(TOP)/$(CIVETWEB_LIB) . + +clean: + rm -f $(CIVETWEB_LIB) $(PROG) + +.PHONY: all clean diff --git a/3P/civetweb/examples/embedded_cpp/embedded_cpp.cpp b/3P/civetweb/examples/embedded_cpp/embedded_cpp.cpp new file mode 100644 index 00000000..2ed0437c --- /dev/null +++ b/3P/civetweb/examples/embedded_cpp/embedded_cpp.cpp @@ -0,0 +1,290 @@ +/* Copyright (c) 2013-2014 the Civetweb developers + * Copyright (c) 2013 No Face Press, LLC + * License http://opensource.org/licenses/mit-license.php MIT License + */ + +// Simple example program on how to use Embedded C++ interface. + +#include "CivetServer.h" + +#ifdef _WIN32 +#include +#else +#include +#endif + +#define DOCUMENT_ROOT "." +#define PORT "8081" +#define EXAMPLE_URI "/example" +#define EXIT_URI "/exit" +bool exitNow = false; + +class ExampleHandler : public CivetHandler +{ + public: + bool + handleGet(CivetServer *server, struct mg_connection *conn) + { + mg_printf(conn, + "HTTP/1.1 200 OK\r\nContent-Type: " + "text/html\r\nConnection: close\r\n\r\n"); + mg_printf(conn, "\r\n"); + mg_printf(conn, + "

This is an example text from a C++ handler

\r\n"); + mg_printf(conn, + "

To see a page from the A handler click here

\r\n"); + mg_printf(conn, + "

To see a page from the A handler with a parameter " + "click here

\r\n"); + mg_printf(conn, + "

To see a page from the A/B handler click here

\r\n"); + mg_printf(conn, + "

To see a page from the *.foo handler click here

\r\n"); + mg_printf(conn, + "

To exit click here

\r\n", + EXIT_URI); + mg_printf(conn, "\r\n"); + return true; + } +}; + +class ExitHandler : public CivetHandler +{ + public: + bool + handleGet(CivetServer *server, struct mg_connection *conn) + { + mg_printf(conn, + "HTTP/1.1 200 OK\r\nContent-Type: " + "text/plain\r\nConnection: close\r\n\r\n"); + mg_printf(conn, "Bye!\n"); + exitNow = true; + return true; + } +}; + +class AHandler : public CivetHandler +{ + private: + bool + handleAll(const char *method, + CivetServer *server, + struct mg_connection *conn) + { + std::string s = ""; + mg_printf(conn, + "HTTP/1.1 200 OK\r\nContent-Type: " + "text/html\r\nConnection: close\r\n\r\n"); + mg_printf(conn, ""); + mg_printf(conn, "

This is the A handler for \"%s\" !

", method); + if (CivetServer::getParam(conn, "param", s)) { + mg_printf(conn, "

param set to %s

", s.c_str()); + } else { + mg_printf(conn, "

param not set

"); + } + mg_printf(conn, "\n"); + return true; + } + + public: + bool + handleGet(CivetServer *server, struct mg_connection *conn) + { + return handleAll("GET", server, conn); + } + bool + handlePost(CivetServer *server, struct mg_connection *conn) + { + return handleAll("POST", server, conn); + } +}; + +class ABHandler : public CivetHandler +{ + public: + bool + handleGet(CivetServer *server, struct mg_connection *conn) + { + mg_printf(conn, + "HTTP/1.1 200 OK\r\nContent-Type: " + "text/html\r\nConnection: close\r\n\r\n"); + mg_printf(conn, ""); + mg_printf(conn, "

This is the AB handler!!!

"); + mg_printf(conn, "\n"); + return true; + } +}; + +class FooHandler : public CivetHandler +{ + public: + bool + handleGet(CivetServer *server, struct mg_connection *conn) + { + /* Handler may access the request info using mg_get_request_info */ + const struct mg_request_info *req_info = mg_get_request_info(conn); + + mg_printf(conn, + "HTTP/1.1 200 OK\r\nContent-Type: " + "text/html\r\nConnection: close\r\n\r\n"); + + mg_printf(conn, "\n"); + mg_printf(conn, "

This is the Foo GET handler!!!

\n"); + mg_printf(conn, + "

The request was:

%s %s HTTP/%s

\n", + req_info->request_method, + req_info->uri, + req_info->http_version); + mg_printf(conn, "\n"); + + return true; + } + bool + handlePost(CivetServer *server, struct mg_connection *conn) + { + /* Handler may access the request info using mg_get_request_info */ + const struct mg_request_info *req_info = mg_get_request_info(conn); + long long rlen, wlen; + long long nlen = 0; + long long tlen = req_info->content_length; + char buf[1024]; + + mg_printf(conn, + "HTTP/1.1 200 OK\r\nContent-Type: " + "text/html\r\nConnection: close\r\n\r\n"); + + mg_printf(conn, "\n"); + mg_printf(conn, "

This is the Foo POST handler!!!

\n"); + mg_printf(conn, + "

The request was:

%s %s HTTP/%s

\n", + req_info->request_method, + req_info->uri, + req_info->http_version); + mg_printf(conn, "

Content Length: %li

\n", (long)tlen); + mg_printf(conn, "
\n");
+
+		while (nlen < tlen) {
+			rlen = tlen - nlen;
+			if (rlen > sizeof(buf)) {
+				rlen = sizeof(buf);
+			}
+			rlen = mg_read(conn, buf, rlen);
+			if (rlen <= 0) {
+				break;
+			}
+			wlen = mg_write(conn, buf, rlen);
+			if (rlen != rlen) {
+				break;
+			}
+			nlen += wlen;
+		}
+
+		mg_printf(conn, "\n
\n"); + mg_printf(conn, "\n"); + + return true; + } + + #define fopen_recursive fopen + + bool + handlePut(CivetServer *server, struct mg_connection *conn) + { + /* Handler may access the request info using mg_get_request_info */ + const struct mg_request_info *req_info = mg_get_request_info(conn); + long long rlen, wlen; + long long nlen = 0; + long long tlen = req_info->content_length; + FILE * f; + char buf[1024]; + int fail = 0; + + _snprintf(buf, sizeof(buf), "D:\\somewhere\\%s\\%s", req_info->remote_user, req_info->local_uri); + buf[sizeof(buf)-1] = 0; /* TODO: check overflow */ + f = fopen_recursive(buf, "wb"); + + if (!f) { + fail = 1; + } else { + while (nlen < tlen) { + rlen = tlen - nlen; + if (rlen > sizeof(buf)) { + rlen = sizeof(buf); + } + rlen = mg_read(conn, buf, (size_t)rlen); + if (rlen <= 0) { + fail = 1; + break; + } + wlen = fwrite(buf, 1, (size_t)rlen, f); + if (rlen != rlen) { + fail = 1; + break; + } + nlen += wlen; + } + fclose(f); + } + + if (fail) { + mg_printf(conn, + "HTTP/1.1 409 Conflict\r\n" + "Content-Type: text/plain\r\n" + "Connection: close\r\n\r\n"); + MessageBeep(MB_ICONERROR); + } else { + mg_printf(conn, + "HTTP/1.1 201 Created\r\n" + "Content-Type: text/plain\r\n" + "Connection: close\r\n\r\n"); + MessageBeep(MB_OK); + } + + return true; + } +}; + + +int +main(int argc, char *argv[]) +{ + + const char *options[] = { + "document_root", DOCUMENT_ROOT, "listening_ports", PORT, 0}; + + CivetServer server(options); + + ExampleHandler h_ex; + server.addHandler(EXAMPLE_URI, h_ex); + + ExitHandler h_exit; + server.addHandler(EXIT_URI, h_exit); + + AHandler h_a; + server.addHandler("/a", h_a); + + ABHandler h_ab; + server.addHandler("/a/b", h_ab); + + FooHandler h_foo; + server.addHandler("", h_foo); + + printf("Browse files at http://localhost:%s/\n", PORT); + printf("Run example at http://localhost:%s%s\n", PORT, EXAMPLE_URI); + printf("Exit at http://localhost:%s%s\n", PORT, EXIT_URI); + + while (!exitNow) { +#ifdef _WIN32 + Sleep(1000); +#else + sleep(1); +#endif + } + + printf("Bye!\n"); + + return 0; +} diff --git a/3P/civetweb/examples/hello/Makefile b/3P/civetweb/examples/hello/Makefile new file mode 100644 index 00000000..4424e3b5 --- /dev/null +++ b/3P/civetweb/examples/hello/Makefile @@ -0,0 +1,36 @@ +# +# Copyright (c) 2013 No Face Press, LLC +# License http://opensource.org/licenses/mit-license.php MIT License +# + +#This makefile is used to test the other Makefiles + + +PROG = hello +SRC = hello.c + +TOP = ../.. +CIVETWEB_LIB = libcivetweb.a + +CFLAGS = -I$(TOP)/include $(COPT) +LIBS = -lpthread + +include $(TOP)/resources/Makefile.in-os + +ifeq ($(TARGET_OS),LINUX) + LIBS += -ldl +endif + +all: $(PROG) + +$(PROG): $(CIVETWEB_LIB) $(SRC) + $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(SRC) $(CIVETWEB_LIB) $(LIBS) + +$(CIVETWEB_LIB): + $(MAKE) -C $(TOP) clean lib + cp $(TOP)/$(CIVETWEB_LIB) . + +clean: + rm -f $(CIVETWEB_LIB) $(PROG) + +.PHONY: all clean diff --git a/3P/civetweb/examples/hello/hello.c b/3P/civetweb/examples/hello/hello.c new file mode 100644 index 00000000..39253c1a --- /dev/null +++ b/3P/civetweb/examples/hello/hello.c @@ -0,0 +1,53 @@ +#include +#include +#include "civetweb.h" + +// This function will be called by civetweb on every new request. +static int begin_request_handler(struct mg_connection *conn) +{ + const struct mg_request_info *request_info = mg_get_request_info(conn); + char content[100]; + + // Prepare the message we're going to send + int content_length = snprintf(content, sizeof(content), + "Hello from civetweb! Remote port: %d", + request_info->remote_port); + + // Send HTTP reply to the client + mg_printf(conn, + "HTTP/1.1 200 OK\r\n" + "Content-Type: text/plain\r\n" + "Content-Length: %d\r\n" // Always set Content-Length + "\r\n" + "%s", + content_length, content); + + // Returning non-zero tells civetweb that our function has replied to + // the client, and civetweb should not send client any more data. + return 1; +} + +int main(void) +{ + struct mg_context *ctx; + struct mg_callbacks callbacks; + + // List of options. Last element must be NULL. + const char *options[] = {"listening_ports", "8080", NULL}; + + // Prepare callbacks structure. We have only one callback, the rest are NULL. + memset(&callbacks, 0, sizeof(callbacks)); + callbacks.begin_request = begin_request_handler; + + // Start the web server. + ctx = mg_start(&callbacks, NULL, options); + + // Wait until user hits "enter". Server is running in separate thread. + // Navigating to http://localhost:8080 will invoke begin_request_handler(). + getchar(); + + // Stop the server. + mg_stop(ctx); + + return 0; +} diff --git a/3P/civetweb/examples/lua/lua_dll.c b/3P/civetweb/examples/lua/lua_dll.c new file mode 100644 index 00000000..79e6b97c --- /dev/null +++ b/3P/civetweb/examples/lua/lua_dll.c @@ -0,0 +1,21 @@ +#include + +#include "lua.h" +#include "lauxlib.h" + +static int smile(lua_State *L) +{ + (void) L; // Unused + printf("%s\n", ":-)"); + return 0; +} + +int LUA_API luaopen_lua_dll(lua_State *L) +{ + static const struct luaL_Reg api[] = { + {"smile", smile}, + {NULL, NULL}, + }; + luaL_openlib(L, "lua_dll", api, 0); + return 1; +} diff --git a/3P/civetweb/examples/post/Makefile b/3P/civetweb/examples/post/Makefile new file mode 100644 index 00000000..6e504f43 --- /dev/null +++ b/3P/civetweb/examples/post/Makefile @@ -0,0 +1,36 @@ +# +# Copyright (c) 2013 No Face Press, LLC +# License http://opensource.org/licenses/mit-license.php MIT License +# + +#This makefile is used to test the other Makefiles + + +PROG = post +SRC = post.c + +TOP = ../.. +CIVETWEB_LIB = libcivetweb.a + +CFLAGS = -I$(TOP)/include $(COPT) +LIBS = -lpthread + +include $(TOP)/resources/Makefile.in-os + +ifeq ($(TARGET_OS),LINUX) + LIBS += -ldl +endif + +all: $(PROG) + +$(PROG): $(CIVETWEB_LIB) $(SRC) + $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(SRC) $(CIVETWEB_LIB) $(LIBS) + +$(CIVETWEB_LIB): + $(MAKE) -C $(TOP) clean lib + cp $(TOP)/$(CIVETWEB_LIB) . + +clean: + rm -f $(CIVETWEB_LIB) $(PROG) + +.PHONY: all clean diff --git a/3P/civetweb/examples/post/post.c b/3P/civetweb/examples/post/post.c new file mode 100644 index 00000000..3c5c68c8 --- /dev/null +++ b/3P/civetweb/examples/post/post.c @@ -0,0 +1,58 @@ +#include +#include +#include "civetweb.h" + +static const char *html_form = + "POST example." + "
" + "Input 1:
" + "Input 2:
" + "" + "
"; + +static int begin_request_handler(struct mg_connection *conn) +{ + const struct mg_request_info *ri = mg_get_request_info(conn); + char post_data[1024], input1[sizeof(post_data)], input2[sizeof(post_data)]; + int post_data_len; + + if (!strcmp(ri->uri, "/handle_post_request")) { + // User has submitted a form, show submitted data and a variable value + post_data_len = mg_read(conn, post_data, sizeof(post_data)); + + // Parse form data. input1 and input2 are guaranteed to be NUL-terminated + mg_get_var(post_data, post_data_len, "input_1", input1, sizeof(input1)); + mg_get_var(post_data, post_data_len, "input_2", input2, sizeof(input2)); + + // Send reply to the client, showing submitted form values. + mg_printf(conn, "HTTP/1.0 200 OK\r\n" + "Content-Type: text/plain\r\n\r\n" + "Submitted data: [%.*s]\n" + "Submitted data length: %d bytes\n" + "input_1: [%s]\n" + "input_2: [%s]\n", + post_data_len, post_data, post_data_len, input1, input2); + } else { + // Show HTML form. + mg_printf(conn, "HTTP/1.0 200 OK\r\n" + "Content-Length: %d\r\n" + "Content-Type: text/html\r\n\r\n%s", + (int) strlen(html_form), html_form); + } + return 1; // Mark request as processed +} + +int main(void) +{ + struct mg_context *ctx; + const char *options[] = {"listening_ports", "8080", NULL}; + struct mg_callbacks callbacks; + + memset(&callbacks, 0, sizeof(callbacks)); + callbacks.begin_request = begin_request_handler; + ctx = mg_start(&callbacks, NULL, options); + getchar(); // Wait until user hits "enter" + mg_stop(ctx); + + return 0; +} diff --git a/3P/civetweb/examples/upload/Makefile b/3P/civetweb/examples/upload/Makefile new file mode 100644 index 00000000..9c6270fb --- /dev/null +++ b/3P/civetweb/examples/upload/Makefile @@ -0,0 +1,36 @@ +# +# Copyright (c) 2013 No Face Press, LLC +# License http://opensource.org/licenses/mit-license.php MIT License +# + +#This makefile is used to test the other Makefiles + + +PROG = upload +SRC = upload.c + +TOP = ../.. +CIVETWEB_LIB = libcivetweb.a + +CFLAGS = -I$(TOP)/include $(COPT) +LIBS = -lpthread + +include $(TOP)/resources/Makefile.in-os + +ifeq ($(TARGET_OS),LINUX) + LIBS += -ldl +endif + +all: $(PROG) + +$(PROG): $(CIVETWEB_LIB) $(SRC) + $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(SRC) $(CIVETWEB_LIB) $(LIBS) + +$(CIVETWEB_LIB): + $(MAKE) -C $(TOP) clean lib + cp $(TOP)/$(CIVETWEB_LIB) . + +clean: + rm -f $(CIVETWEB_LIB) $(PROG) + +.PHONY: all clean diff --git a/3P/civetweb/examples/upload/upload.c b/3P/civetweb/examples/upload/upload.c new file mode 100644 index 00000000..29428846 --- /dev/null +++ b/3P/civetweb/examples/upload/upload.c @@ -0,0 +1,104 @@ +/* Copyright (c) 2014 the Civetweb developers + * Copyright (c) 2004-2012 Sergey Lyubka + * This file is a part of civetweb project, http://github.com/bel2125/civetweb + */ + +#ifdef _WIN32 +#define _CRT_SECURE_NO_WARNINGS +#include +#include +#define strtoll strtol +typedef __int64 int64_t; +#else +#include +#include +#endif /* !_WIN32 */ + +#include +#include +#include +#include + +#include "civetweb.h" + + +/* callback: used to generate all content */ +static int begin_request_handler(struct mg_connection *conn) +{ + const char * tempPath = "."; +#ifdef _WIN32 + const char * env = getenv("TEMP"); + if (!env) env = getenv("TMP"); + if (env) tempPath = env; +#else + tempPath = "/tmp"; +#endif + + if (!strcmp(mg_get_request_info(conn)->uri, "/handle_post_request")) { + + mg_printf(conn, "%s", "HTTP/1.0 200 OK\r\n\r\n"); + mg_upload(conn, tempPath); + } else { + /* Show HTML form. */ + /* See http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1 */ + static const char *html_form = + "Upload example." + "" + /* enctype="multipart/form-data" */ + "
" + "
" + "
" + "" + "
" + "" + ""; + + mg_printf(conn, "HTTP/1.0 200 OK\r\n" + "Content-Length: %d\r\n" + "Content-Type: text/html\r\n\r\n%s", + (int) strlen(html_form), html_form); + } + + /* Mark request as processed */ + return 1; +} + + +/* callback: called after uploading a file is completed */ +static void upload_handler(struct mg_connection *conn, const char *path) +{ + mg_printf(conn, "Saved [%s]", path); +} + + +/* Main program: Set callbacks and start the server. */ +int main(void) +{ + /* Test server will use this port */ + const char * PORT = "8080"; + + /* Startup options for the server */ + struct mg_context *ctx; + const char *options[] = { + "listening_ports", PORT, + NULL}; + struct mg_callbacks callbacks; + + memset(&callbacks, 0, sizeof(callbacks)); + callbacks.begin_request = begin_request_handler; + callbacks.upload = upload_handler; + + /* Display a welcome message */ + printf("File upload demo.\n"); + printf("Open http://localhost:%s/ im your browser.\n\n", PORT); + + /* Start the server */ + ctx = mg_start(&callbacks, NULL, options); + + /* Wait until thr user hits "enter", then stop the server */ + getchar(); + mg_stop(ctx); + + return 0; +} diff --git a/3P/civetweb/examples/websocket/Makefile b/3P/civetweb/examples/websocket/Makefile new file mode 100644 index 00000000..3d654929 --- /dev/null +++ b/3P/civetweb/examples/websocket/Makefile @@ -0,0 +1,36 @@ +# +# Copyright (c) 2013 No Face Press, LLC +# License http://opensource.org/licenses/mit-license.php MIT License +# + +#This makefile is used to test the other Makefiles + + +PROG = websocket +SRC = WebSockCallbacks.c websocket.c + +TOP = ../.. +CIVETWEB_LIB = libcivetweb.a + +CFLAGS = -I$(TOP)/include $(COPT) +LIBS = -lpthread + +include $(TOP)/resources/Makefile.in-os + +ifeq ($(TARGET_OS),LINUX) + LIBS += -ldl +endif + +all: $(PROG) + +$(PROG): $(CIVETWEB_LIB) $(SRC) + $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(SRC) $(CIVETWEB_LIB) $(LIBS) + +$(CIVETWEB_LIB): + $(MAKE) -C $(TOP) clean lib WITH_WEBSOCKET=1 + cp $(TOP)/$(CIVETWEB_LIB) . + +clean: + rm -f $(CIVETWEB_LIB) $(PROG) + +.PHONY: all clean diff --git a/3P/civetweb/examples/websocket/WebSockCallbacks.c b/3P/civetweb/examples/websocket/WebSockCallbacks.c new file mode 100644 index 00000000..b31bc956 --- /dev/null +++ b/3P/civetweb/examples/websocket/WebSockCallbacks.c @@ -0,0 +1,225 @@ +/* This example uses deprecated interfaces: global websocket callbacks. + They have been superseeded by URI specific callbacks. + See examples/embedded_c for an up to date example. + */ + +#include +#include +#include +#include +#include "WebSockCallbacks.h" + +#ifdef _WIN32 +#include +#define mg_sleep(x) Sleep(x) +#else +#include +#include +#define mg_sleep(x) usleep((x)*1000) +#endif + + +static void +send_to_all_websockets(struct mg_context *ctx, const char *data, int data_len) +{ + + int i; + tWebSockContext *ws_ctx = (tWebSockContext *)mg_get_user_data(ctx); + + mg_lock_context(ctx); + for (i = 0; i < MAX_NUM_OF_WEBSOCKS; i++) { + if (ws_ctx->socketList[i] + && (ws_ctx->socketList[i]->webSockState == 2)) { + mg_websocket_write(ws_ctx->socketList[i]->conn, + WEBSOCKET_OPCODE_TEXT, + data, + data_len); + } + } + mg_unlock_context(ctx); +} + + +void +websocket_ready_handler(struct mg_connection *conn, void *_ignored) +{ + + int i; + const struct mg_request_info *rq = mg_get_request_info(conn); + struct mg_context *ctx = mg_get_context(conn); + tWebSockContext *ws_ctx = (tWebSockContext *)mg_get_user_data(ctx); + tWebSockInfo *wsock = malloc(sizeof(tWebSockInfo)); + assert(wsock); + wsock->webSockState = 0; + mg_set_user_connection_data(conn, wsock); + + mg_lock_context(ctx); + for (i = 0; i < MAX_NUM_OF_WEBSOCKS; i++) { + if (0 == ws_ctx->socketList[i]) { + ws_ctx->socketList[i] = wsock; + wsock->conn = conn; + wsock->webSockState = 1; + break; + } + } + printf("\nNew websocket attached: %s:%u\n", + rq->remote_addr, + rq->remote_port); + mg_unlock_context(ctx); +} + + +static void +websocket_done(tWebSockContext *ws_ctx, tWebSockInfo *wsock) +{ + + int i; + + if (wsock) { + wsock->webSockState = 99; + for (i = 0; i < MAX_NUM_OF_WEBSOCKS; i++) { + if (wsock == ws_ctx->socketList[i]) { + ws_ctx->socketList[i] = 0; + break; + } + } + printf("\nClose websocket attached: %s:%u\n", + mg_get_request_info(wsock->conn)->remote_addr, + mg_get_request_info(wsock->conn)->remote_port); + free(wsock); + } +} + + +int +websocket_data_handler(struct mg_connection *conn, + int flags, + char *data, + size_t data_len, + void *_ignored) +{ + + const struct mg_request_info *rq = mg_get_request_info(conn); + tWebSockInfo *wsock = (tWebSockInfo *)rq->conn_data; + struct mg_context *ctx = mg_get_context(conn); + tWebSockContext *ws_ctx = (tWebSockContext *)mg_get_user_data(ctx); + char msg[128]; + + mg_lock_context(ctx); + if (flags == 136) { + // close websock + websocket_done(ws_ctx, wsock); + mg_set_user_connection_data(conn, NULL); + mg_unlock_context(ctx); + return 1; + } + if (((data_len >= 5) && (data_len < 100) && (flags == 129)) + || (flags == 130)) { + + // init command + if ((wsock->webSockState == 1) && (!memcmp(data, "init ", 5))) { + char *chk; + unsigned long gid; + memcpy(msg, data + 5, data_len - 5); + msg[data_len - 5] = 0; + gid = strtoul(msg, &chk, 10); + wsock->initId = gid; + if (gid > 0 && chk != NULL && *chk == 0) { + wsock->webSockState = 2; + } + mg_unlock_context(ctx); + return 1; + } + + // chat message + if ((wsock->webSockState == 2) && (!memcmp(data, "msg ", 4))) { + send_to_all_websockets(ctx, data, data_len); + mg_unlock_context(ctx); + return 1; + } + } + + // keep alive + if ((data_len == 4) && !memcmp(data, "ping", 4)) { + mg_unlock_context(ctx); + return 1; + } + + mg_unlock_context(ctx); + return 0; +} + + +void +connection_close_handler(const struct mg_connection *conn, void *_ignored) +{ + + const struct mg_request_info *rq = mg_get_request_info(conn); + tWebSockInfo *wsock = (tWebSockInfo *)rq->conn_data; + struct mg_context *ctx = mg_get_context(conn); + tWebSockContext *ws_ctx = (tWebSockContext *)mg_get_user_data(ctx); + + mg_lock_context(ctx); + websocket_done(ws_ctx, wsock); + mg_set_user_connection_data(conn, NULL); + mg_unlock_context(ctx); +} + + +static void * +eventMain(void *arg) +{ + + char msg[256]; + struct mg_context *ctx = (struct mg_context *)arg; + tWebSockContext *ws_ctx = (tWebSockContext *)mg_get_user_data(ctx); + + ws_ctx->runLoop = 1; + while (ws_ctx->runLoop) { + time_t t = time(0); + struct tm *timestr = localtime(&t); + strftime(msg, sizeof(msg), "title %c", timestr); + send_to_all_websockets(ctx, msg, strlen(msg)); + + mg_sleep(1000); + } + + return NULL; +} + + +void +websock_send_broadcast(struct mg_context *ctx, const char *data, int data_len) +{ + + char buffer[260]; + + if (data_len <= 256) { + strcpy(buffer, "msg "); + memcpy(buffer + 4, data, data_len); + + send_to_all_websockets(ctx, buffer, data_len + 4); + } +} + + +void +websock_init_lib(const struct mg_context *ctx) +{ + + tWebSockContext *ws_ctx = (tWebSockContext *)mg_get_user_data(ctx); + memset(ws_ctx, 0, sizeof(*ws_ctx)); + /* todo: use mg_start_thread_id instead of mg_start_thread */ + mg_start_thread(eventMain, (void *)ctx); +} + + +void +websock_exit_lib(const struct mg_context *ctx) +{ + + tWebSockContext *ws_ctx = (tWebSockContext *)mg_get_user_data(ctx); + ws_ctx->runLoop = 0; + /* todo: wait for the thread instead of a timeout */ + mg_sleep(2000); +} diff --git a/3P/civetweb/examples/websocket/WebSockCallbacks.h b/3P/civetweb/examples/websocket/WebSockCallbacks.h new file mode 100644 index 00000000..f44821da --- /dev/null +++ b/3P/civetweb/examples/websocket/WebSockCallbacks.h @@ -0,0 +1,44 @@ + +#ifndef WEBSOCKCALLBACKS_H_INCLUDED +#define WEBSOCKCALLBACKS_H_INCLUDED + +#include "civetweb.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct tWebSockInfo { + int webSockState; + unsigned long initId; + struct mg_connection *conn; +} tWebSockInfo; + +#define MAX_NUM_OF_WEBSOCKS (256) +typedef struct tWebSockContext { + int runLoop; + void *thread_id; + tWebSockInfo *socketList[MAX_NUM_OF_WEBSOCKS]; +} tWebSockContext; + + +void websock_init_lib(const struct mg_context *ctx); +void websock_exit_lib(const struct mg_context *ctx); + +void +websock_send_broadcast(struct mg_context *ctx, const char *data, int data_len); + +void websocket_ready_handler(struct mg_connection *conn, void *_ignored); +int websocket_data_handler(struct mg_connection *conn, + int flags, + char *data, + size_t data_len, + void *_ignored); +void connection_close_handler(const struct mg_connection *conn, void *_ignored); + + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/3P/civetweb/examples/websocket/websock.htm b/3P/civetweb/examples/websocket/websock.htm new file mode 100644 index 00000000..4ff3a5fa --- /dev/null +++ b/3P/civetweb/examples/websocket/websock.htm @@ -0,0 +1,55 @@ + + + + Test + + + + + + + + + + + \ No newline at end of file diff --git a/3P/civetweb/examples/websocket/websocket.c b/3P/civetweb/examples/websocket/websocket.c new file mode 100644 index 00000000..3aadf98b --- /dev/null +++ b/3P/civetweb/examples/websocket/websocket.c @@ -0,0 +1,65 @@ +/* This example uses deprecated interfaces: global websocket callbacks. + They have been superseeded by URI specific callbacks. + See examples/embedded_c for an up to date example. + */ + +#include +#include +#include + +#include "civetweb.h" +#include "WebSockCallbacks.h" + +int +main(void) +{ + struct mg_context *ctx = 0; + struct mg_callbacks callback_funcs = {0}; + tWebSockContext ws_ctx; + char inbuf[4]; + + const char *server_options[] = { + /* document_root: The path to the test function websock.htm */ + "document_root", + "../../examples/websocket", + + /* port: use http standard to match websocket url in websock.htm: + ws://127.0.0.1/MyWebSock */ + /* if the port is changed here, it needs to be changed in + websock.htm as well */ + "listening_ports", + "80", + + NULL}; + + callback_funcs.init_context = websock_init_lib; + callback_funcs.exit_context = websock_exit_lib; + + ctx = mg_start(&callback_funcs, &ws_ctx, server_options); + + mg_set_websocket_handler(ctx, + "/MyWebSock", + NULL, + websocket_ready_handler, + websocket_data_handler, + connection_close_handler, + NULL); + + printf("Connect to localhost:%s/websock.htm\n", + mg_get_option(ctx, "listening_ports")); + + puts("Enter an (ASCII) character or * to exit:"); + for (;;) { + fgets(inbuf, sizeof(inbuf), stdin); + + if (inbuf[0] == '*') { + break; + } + inbuf[0] = toupper(inbuf[0]); + websock_send_broadcast(ctx, inbuf, 1); + } + + mg_stop(ctx); + + return 0; +} diff --git a/3P/civetweb/examples/websocket_client/Makefile b/3P/civetweb/examples/websocket_client/Makefile new file mode 100644 index 00000000..e3ef1346 --- /dev/null +++ b/3P/civetweb/examples/websocket_client/Makefile @@ -0,0 +1,37 @@ +# +# Copyright (c) 2014 Jordan Shelley +# https://github.com/jshelley +# License http://opensource.org/licenses/mit-license.php MIT License +# + +#This makefile is used to test the other Makefiles + + +PROG = websocket_client +SRC = websocket_client.c + +TOP = ../.. +CIVETWEB_LIB = libcivetweb.a + +CFLAGS = -I$(TOP)/include $(COPT) +LIBS = -lpthread + +include $(TOP)/resources/Makefile.in-os + +ifeq ($(TARGET_OS),LINUX) + LIBS += -ldl +endif + +all: $(PROG) + +$(PROG): $(CIVETWEB_LIB) $(SRC) + $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(SRC) $(CIVETWEB_LIB) $(LIBS) + +$(CIVETWEB_LIB): + $(MAKE) -C $(TOP) clean lib WITH_WEBSOCKET=1 + cp $(TOP)/$(CIVETWEB_LIB) . + +clean: + rm -f $(CIVETWEB_LIB) $(PROG) + +.PHONY: all clean diff --git a/3P/civetweb/examples/websocket_client/ssl/server.crt b/3P/civetweb/examples/websocket_client/ssl/server.crt new file mode 100644 index 00000000..a26359ab --- /dev/null +++ b/3P/civetweb/examples/websocket_client/ssl/server.crt @@ -0,0 +1,13 @@ +-----BEGIN CERTIFICATE----- +MIICATCCAWoCCQC2BCIqIvgSUTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJB +VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 +cyBQdHkgTHRkMB4XDTE0MDgyMTEyMzAwMVoXDTI0MDgxODEyMzAwMVowRTELMAkG +A1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0 +IFdpZGdpdHMgUHR5IEx0ZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA9k9s +gH22BCo9neTeB/YnilK7n0sMe0+pjS9KSWhU59Q4w8hqPrW0tuYikIDd0wVggkJF +BZNg4WPoulTdwXsgNBeG88q2wnNtUosXTS+KQTQBSiQof9Ay9GHQtgxnogI1zIXb +HOppyyG5zre8a/X6fzDOnFc4iJMBwxTAnjCqObkCAwEAATANBgkqhkiG9w0BAQUF +AAOBgQBX9V46VUVsB9P9fb8sFuMx2ezFE42ynEeJPrKRrof+dFYbjvR1OUZFSLCy +aZKwVH7iCnVBJiU12JxO7PR3L6ob3FYPyNHQWYq1/IFUvqBRagehldj5H8iFeEDz +Wtz2+p1rUyVxcSUqTjobaji0aC8lzPZio0nd1KKM6A92/adHyQ== +-----END CERTIFICATE----- diff --git a/3P/civetweb/examples/websocket_client/ssl/server.csr b/3P/civetweb/examples/websocket_client/ssl/server.csr new file mode 100644 index 00000000..4d4723b2 --- /dev/null +++ b/3P/civetweb/examples/websocket_client/ssl/server.csr @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBhDCB7gIBADBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEh +MB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQD2T2yAfbYEKj2d5N4H9ieKUrufSwx7T6mNL0pJaFTn1DjD +yGo+tbS25iKQgN3TBWCCQkUFk2DhY+i6VN3BeyA0F4bzyrbCc21SixdNL4pBNAFK +JCh/0DL0YdC2DGeiAjXMhdsc6mnLIbnOt7xr9fp/MM6cVziIkwHDFMCeMKo5uQID +AQABoAAwDQYJKoZIhvcNAQEFBQADgYEA1EOFwyFJ2NAnRNktZCy5yVcLx9C78HoC +oHPPCOElu0VDIqe6ZecYdaqWbYlhGE0+isbOQn2CwHOeBGN8mIDsNUYzVEpsEfgg +9OK873LpE5pf4mdjSiRBXkk/h8BxuqkcKi+Qx+qEE7+dH2nK5aKeIHVvbLyfGOch +9I85q+msBNE= +-----END CERTIFICATE REQUEST----- diff --git a/3P/civetweb/examples/websocket_client/ssl/server.key b/3P/civetweb/examples/websocket_client/ssl/server.key new file mode 100644 index 00000000..f09cc38c --- /dev/null +++ b/3P/civetweb/examples/websocket_client/ssl/server.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQD2T2yAfbYEKj2d5N4H9ieKUrufSwx7T6mNL0pJaFTn1DjDyGo+ +tbS25iKQgN3TBWCCQkUFk2DhY+i6VN3BeyA0F4bzyrbCc21SixdNL4pBNAFKJCh/ +0DL0YdC2DGeiAjXMhdsc6mnLIbnOt7xr9fp/MM6cVziIkwHDFMCeMKo5uQIDAQAB +AoGAYwospr3lomcZv5N3c9wWqhf6OWMD8dFma87IIBxDh7Rd3tuHXQ/TSnffDhvD +FkbjN31OI5/PJNH3knTtdg78MywPloE4jYsbt4+fEaW7Fzww2nU61N1p+mYk5d/b +SCTAHhGzF9g9ZMw25CCUFGjDU2z+Ty6my22Euxhk2Qq8tMECQQD9ZYIxWkPhywDW +pX3v70dqIv7411hEYpuL/ZJl26UCmQsj4HPtXQCraQksVPs74WY5aTtd6MAV9V3M +UnErHO5/AkEA+NdG2MmfBOBPusDB/WwQaUPiCWGITS9llGTR2JXbvDqmKgL1+UTG +o27sLNIFCrF1wejpyRGqwjcObFYR0yKrxwJBAOB2uPuK4DL1psp9Uq/mIDbOxVod +OF1rlCpP9w0vol5Iv+uJ+mc7SUqOAsg4h0yl/+2/YA1yDiXlcq96IDF2sXUCQGAv +Nh9Nr72+xpK1N0axopZNuu1NWdYb3/PAFKzXIBxdvyS2CEXVo8JAeeHJPFGpzo6p +bNRfk9WGWnjdu/4UhLkCQQCekR9zpIpzdJiPYCd6XMya+TPCDYlOQL1jlnJIRa2V +BEOz0rSpzXAGh0PyCB/kMneyVk87LWn8joE6179RoUfv +-----END RSA PRIVATE KEY----- diff --git a/3P/civetweb/examples/websocket_client/ssl/server.key.orig b/3P/civetweb/examples/websocket_client/ssl/server.key.orig new file mode 100644 index 00000000..58e5653c --- /dev/null +++ b/3P/civetweb/examples/websocket_client/ssl/server.key.orig @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,89778A6427F05D4A + +4aXqO/8oCHVfMLB+a1DfjbXyEddjbd7nB+YVFLPKy68Tam9PRTvC1zRHBet59ll0 +1w7R8tXR6/xH7HRhBeqDHCcuvBhtw3xGxtXWv54WBFhzuq7TvKOAaCFl++cw/JHq +PCS0rAaYnqF2MAgMi7QBjZKmHFHL43Gy60VfOrB0mmOdxqqXA0NBFC2uEd7Z/MAx +S2A85bNJJKQaWEeDThP1u0OOlNCq99lkLJ31jiOH7ntdL0/vqcbZ+PUtdPLwAG4L +1GUHuiC2v5FvDlPiejMk2dvrxCNpcu2e3tQKHpg2KcsTVrpB7EVzRSazln4HywUZ +EJfBvxqqrS7plImZgj4LXSnln0JPuBb+aHnhKIFvisjYSwqDGJnnp/OaD7YdRhYh +UCcL011Ge+yUbRipeAmHdtJlSUSdB14KWq+WdIX/KgCRGx06QZm9s1PBLH+fww+I +EL3A/LFX0a5KUHkCp29akYYv9bUYaQ79Nt7BlaEON+/SW3pJMbGr+nx8aqogr0Yo +SJ/Zz5TSDBhecRjbCDGkT6DizVZ8cbm2xl8QLBd0H+ZA6uYMgfpAOJGrJx3Nm4Lv +prEApgFtjSrsQDGYHAcmDMW1UWOVHuNp7BSvwUze9Ftnzr/jlpdzES2rhgMyGhg1 +0Szbsfs3vgw4iM83LFJXza07GQJzF8gRF79dY5JiQX/sOKUprA6Lofk631jE0G8r +3z59cxblaq9y7EgFsE944Gk7/HIEimBRiqIZzGVJVukD0itynQ+XmYTdbyH1lpvi +c0ZheZPUoGwUW9RYy+nle5gEDFyZWXcCAuJasQvDBXt//r/bso3ZpA== +-----END RSA PRIVATE KEY----- diff --git a/3P/civetweb/examples/websocket_client/ssl/server.pem b/3P/civetweb/examples/websocket_client/ssl/server.pem new file mode 100644 index 00000000..300834e3 --- /dev/null +++ b/3P/civetweb/examples/websocket_client/ssl/server.pem @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE----- +MIICATCCAWoCCQC2BCIqIvgSUTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJB +VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 +cyBQdHkgTHRkMB4XDTE0MDgyMTEyMzAwMVoXDTI0MDgxODEyMzAwMVowRTELMAkG +A1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0 +IFdpZGdpdHMgUHR5IEx0ZDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA9k9s +gH22BCo9neTeB/YnilK7n0sMe0+pjS9KSWhU59Q4w8hqPrW0tuYikIDd0wVggkJF +BZNg4WPoulTdwXsgNBeG88q2wnNtUosXTS+KQTQBSiQof9Ay9GHQtgxnogI1zIXb +HOppyyG5zre8a/X6fzDOnFc4iJMBwxTAnjCqObkCAwEAATANBgkqhkiG9w0BAQUF +AAOBgQBX9V46VUVsB9P9fb8sFuMx2ezFE42ynEeJPrKRrof+dFYbjvR1OUZFSLCy +aZKwVH7iCnVBJiU12JxO7PR3L6ob3FYPyNHQWYq1/IFUvqBRagehldj5H8iFeEDz +Wtz2+p1rUyVxcSUqTjobaji0aC8lzPZio0nd1KKM6A92/adHyQ== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQD2T2yAfbYEKj2d5N4H9ieKUrufSwx7T6mNL0pJaFTn1DjDyGo+ +tbS25iKQgN3TBWCCQkUFk2DhY+i6VN3BeyA0F4bzyrbCc21SixdNL4pBNAFKJCh/ +0DL0YdC2DGeiAjXMhdsc6mnLIbnOt7xr9fp/MM6cVziIkwHDFMCeMKo5uQIDAQAB +AoGAYwospr3lomcZv5N3c9wWqhf6OWMD8dFma87IIBxDh7Rd3tuHXQ/TSnffDhvD +FkbjN31OI5/PJNH3knTtdg78MywPloE4jYsbt4+fEaW7Fzww2nU61N1p+mYk5d/b +SCTAHhGzF9g9ZMw25CCUFGjDU2z+Ty6my22Euxhk2Qq8tMECQQD9ZYIxWkPhywDW +pX3v70dqIv7411hEYpuL/ZJl26UCmQsj4HPtXQCraQksVPs74WY5aTtd6MAV9V3M +UnErHO5/AkEA+NdG2MmfBOBPusDB/WwQaUPiCWGITS9llGTR2JXbvDqmKgL1+UTG +o27sLNIFCrF1wejpyRGqwjcObFYR0yKrxwJBAOB2uPuK4DL1psp9Uq/mIDbOxVod +OF1rlCpP9w0vol5Iv+uJ+mc7SUqOAsg4h0yl/+2/YA1yDiXlcq96IDF2sXUCQGAv +Nh9Nr72+xpK1N0axopZNuu1NWdYb3/PAFKzXIBxdvyS2CEXVo8JAeeHJPFGpzo6p +bNRfk9WGWnjdu/4UhLkCQQCekR9zpIpzdJiPYCd6XMya+TPCDYlOQL1jlnJIRa2V +BEOz0rSpzXAGh0PyCB/kMneyVk87LWn8joE6179RoUfv +-----END RSA PRIVATE KEY----- diff --git a/3P/civetweb/examples/websocket_client/websocket_client.c b/3P/civetweb/examples/websocket_client/websocket_client.c new file mode 100644 index 00000000..f9756a84 --- /dev/null +++ b/3P/civetweb/examples/websocket_client/websocket_client.c @@ -0,0 +1,416 @@ +/* +* Copyright (c) 2014-2015 the Civetweb developers +* Copyright (c) 2014 Jordan Shelley +* https://github.com/jshelley +* License http://opensource.org/licenses/mit-license.php MIT License +*/ + +// Simple example program on how to use websocket client embedded C interface. +#ifdef _WIN32 +#include +#define sleep(x) Sleep(1000 * (x)) +#else +#include +#endif + +#include +#include +#include "civetweb.h" + +#define DOCUMENT_ROOT "." +#define PORT "8888" +#define SSL_CERT "./ssl/server.pem" + +const char *websocket_welcome_msg = "websocket welcome\n"; +const size_t websocket_welcome_msg_len = 18 /* strlen(websocket_welcome_msg) */; +const char *websocket_acknowledge_msg = "websocket msg ok\n"; +const size_t websocket_acknowledge_msg_len = + 17 /* strlen(websocket_acknowledge_msg) */; +const char *websocket_goodbye_msg = "websocket bye\n"; +const size_t websocket_goodbye_msg_len = 14 /* strlen(websocket_goodbye_msg) */; + + +/*************************************************************************************/ +/* WEBSOCKET SERVER */ +/*************************************************************************************/ +#if defined(MG_LEGACY_INTERFACE) +int +websock_server_connect(const struct mg_connection *conn) +#else +int +websocket_server_connect(const struct mg_connection *conn, void *_ignored) +#endif +{ + printf("Server: Websocket connected\n"); + return 0; /* return 0 to accept every connection */ +} + + +#if defined(MG_LEGACY_INTERFACE) +void +websocket_server_ready(struct mg_connection *conn) +#else +void +websocket_server_ready(struct mg_connection *conn, void *_ignored) +#endif +{ + printf("Server: Websocket ready\n"); + + /* Send websocket welcome message */ + mg_lock_connection(conn); + mg_websocket_write(conn, + WEBSOCKET_OPCODE_TEXT, + websocket_welcome_msg, + websocket_welcome_msg_len); + mg_unlock_connection(conn); +} + + +#if defined(MG_LEGACY_INTERFACE) +int +websocket_server_data(struct mg_connection *conn, + int bits, + char *data, + size_t data_len) +#else +int +websocket_server_data(struct mg_connection *conn, + int bits, + char *data, + size_t data_len, + void *_ignored) +#endif +{ + printf("Server: Got %u bytes from the client\n", data_len); + printf("Server received data from client: "); + fwrite(data, 1, data_len, stdout); + printf("\n"); + + if (data_len < 3 || 0 != memcmp(data, "bye", 3)) { + /* Send websocket acknowledge message */ + mg_lock_connection(conn); + mg_websocket_write(conn, + WEBSOCKET_OPCODE_TEXT, + websocket_acknowledge_msg, + websocket_acknowledge_msg_len); + mg_unlock_connection(conn); + } else { + /* Send websocket acknowledge message */ + mg_lock_connection(conn); + mg_websocket_write(conn, + WEBSOCKET_OPCODE_TEXT, + websocket_goodbye_msg, + websocket_goodbye_msg_len); + mg_unlock_connection(conn); + } + + return 1; /* return 1 to keep the connetion open */ +} + + +#if defined(MG_LEGACY_INTERFACE) +void +websocket_server_connection_close(const struct mg_connection *conn) +#else +void +websocket_server_connection_close(const struct mg_connection *conn, + void *_ignored) +#endif +{ + printf("Server: Close connection\n"); + + /* Can not send a websocket goodbye message here - the connection is already + * closed */ +} + + +struct mg_context * +start_websocket_server() +{ + const char *options[] = {"document_root", + DOCUMENT_ROOT, + "ssl_certificate", + SSL_CERT, + "listening_ports", + PORT, + "request_timeout_ms", + "5000", + 0}; + struct mg_callbacks callbacks; + struct mg_context *ctx; + + memset(&callbacks, 0, sizeof(callbacks)); + +#if defined(MG_LEGACY_INTERFACE) + /* Obsolete: */ + callbacks.websocket_connect = websock_server_connect; + callbacks.websocket_ready = websocket_server_ready; + callbacks.websocket_data = websocket_server_data; + callbacks.connection_close = websocket_server_connection_close; + + ctx = mg_start(&callbacks, 0, options); +#else + /* New interface: */ + ctx = mg_start(&callbacks, 0, options); + + mg_set_websocket_handler(ctx, + "/websocket", + websocket_server_connect, + websocket_server_ready, + websocket_server_data, + websocket_server_connection_close, + NULL); +#endif + + return ctx; +} + + +/*************************************************************************************/ +/* WEBSOCKET CLIENT */ +/*************************************************************************************/ +struct tclient_data { + void *data; + size_t len; + int closed; +}; + +static int +websocket_client_data_handler(struct mg_connection *conn, + int flags, + char *data, + size_t data_len, + void *user_data) +{ + struct mg_context *ctx = mg_get_context(conn); + struct tclient_data *pclient_data = + (struct tclient_data *)mg_get_user_data(ctx); + + printf("Client received data from server: "); + fwrite(data, 1, data_len, stdout); + printf("\n"); + + pclient_data->data = malloc(data_len); + assert(pclient_data->data != NULL); + memcpy(pclient_data->data, data, data_len); + pclient_data->len = data_len; + + return 1; +} + +static void +websocket_client_close_handler(const struct mg_connection *conn, + void *user_data) +{ + struct mg_context *ctx = mg_get_context(conn); + struct tclient_data *pclient_data = + (struct tclient_data *)mg_get_user_data(ctx); + + printf("Client: Close handler\n"); + pclient_data->closed++; +} + + +int +main(int argc, char *argv[]) +{ + struct mg_context *ctx = NULL; + struct tclient_data client1_data = {NULL, 0, 0}; + struct tclient_data client2_data = {NULL, 0, 0}; + struct tclient_data client3_data = {NULL, 0, 0}; + struct mg_connection *newconn1 = NULL; + struct mg_connection *newconn2 = NULL; + struct mg_connection *newconn3 = NULL; + char ebuf[100] = {0}; + + assert(websocket_welcome_msg_len == strlen(websocket_welcome_msg)); + + /* First set up a websocket server */ + ctx = start_websocket_server(); + assert(ctx != NULL); + printf("Server init\n\n"); + + /* Then connect a first client */ + newconn1 = mg_connect_websocket_client("localhost", + atoi(PORT), + 0, + ebuf, + sizeof(ebuf), + "/websocket", + NULL, + websocket_client_data_handler, + websocket_client_close_handler, + &client1_data); + + if (newconn1 == NULL) { + printf("Error: %s", ebuf); + return 1; + } + + sleep(1); /* Should get the websocket welcome message */ + assert(client1_data.closed == 0); + assert(client2_data.closed == 0); + assert(client2_data.data == NULL); + assert(client2_data.len == 0); + assert(client1_data.data != NULL); + assert(client1_data.len == websocket_welcome_msg_len); + assert(!memcmp(client1_data.data, + websocket_welcome_msg, + websocket_welcome_msg_len)); + free(client1_data.data); + client1_data.data = NULL; + client1_data.len = 0; + + mg_websocket_client_write(newconn1, WEBSOCKET_OPCODE_TEXT, "data1", 5); + + sleep(1); /* Should get the acknowledge message */ + assert(client1_data.closed == 0); + assert(client2_data.closed == 0); + assert(client2_data.data == NULL); + assert(client2_data.len == 0); + assert(client1_data.data != NULL); + assert(client1_data.len == websocket_acknowledge_msg_len); + assert(!memcmp(client1_data.data, + websocket_acknowledge_msg, + websocket_acknowledge_msg_len)); + free(client1_data.data); + client1_data.data = NULL; + client1_data.len = 0; + + /* Now connect a second client */ + newconn2 = mg_connect_websocket_client("localhost", + atoi(PORT), + 0, + ebuf, + sizeof(ebuf), + "/websocket", + NULL, + websocket_client_data_handler, + websocket_client_close_handler, + &client2_data); + + if (newconn2 == NULL) { + printf("Error: %s", ebuf); + return 1; + } + + sleep(1); /* Client 2 should get the websocket welcome message */ + assert(client1_data.closed == 0); + assert(client2_data.closed == 0); + assert(client1_data.data == NULL); + assert(client1_data.len == 0); + assert(client2_data.data != NULL); + assert(client2_data.len == websocket_welcome_msg_len); + assert(!memcmp(client2_data.data, + websocket_welcome_msg, + websocket_welcome_msg_len)); + free(client2_data.data); + client2_data.data = NULL; + client2_data.len = 0; + + mg_websocket_client_write(newconn1, WEBSOCKET_OPCODE_TEXT, "data2", 5); + + sleep(1); /* Should get the acknowledge message */ + assert(client1_data.closed == 0); + assert(client2_data.closed == 0); + assert(client2_data.data == NULL); + assert(client2_data.len == 0); + assert(client1_data.data != NULL); + assert(client1_data.len == websocket_acknowledge_msg_len); + assert(!memcmp(client1_data.data, + websocket_acknowledge_msg, + websocket_acknowledge_msg_len)); + free(client1_data.data); + client1_data.data = NULL; + client1_data.len = 0; + + mg_websocket_client_write(newconn1, WEBSOCKET_OPCODE_TEXT, "bye", 3); + + sleep(1); /* Should get the goodbye message */ + assert(client1_data.closed == 0); + assert(client2_data.closed == 0); + assert(client2_data.data == NULL); + assert(client2_data.len == 0); + assert(client1_data.data != NULL); + assert(client1_data.len == websocket_goodbye_msg_len); + assert(!memcmp(client1_data.data, + websocket_goodbye_msg, + websocket_goodbye_msg_len)); + free(client1_data.data); + client1_data.data = NULL; + client1_data.len = 0; + + mg_close_connection(newconn1); + + sleep(1); /* Won't get any message */ + assert(client1_data.closed == 1); + assert(client2_data.closed == 0); + assert(client1_data.data == NULL); + assert(client1_data.len == 0); + assert(client2_data.data == NULL); + assert(client2_data.len == 0); + + mg_websocket_client_write(newconn2, WEBSOCKET_OPCODE_TEXT, "bye", 3); + + sleep(1); /* Should get the goodbye message */ + assert(client1_data.closed == 1); + assert(client2_data.closed == 0); + assert(client1_data.data == NULL); + assert(client1_data.len == 0); + assert(client2_data.data != NULL); + assert(client2_data.len == websocket_goodbye_msg_len); + assert(!memcmp(client2_data.data, + websocket_goodbye_msg, + websocket_goodbye_msg_len)); + free(client2_data.data); + client2_data.data = NULL; + client2_data.len = 0; + + mg_close_connection(newconn2); + + sleep(1); /* Won't get any message */ + assert(client1_data.closed == 1); + assert(client2_data.closed == 1); + assert(client1_data.data == NULL); + assert(client1_data.len == 0); + assert(client2_data.data == NULL); + assert(client2_data.len == 0); + + /* Connect client 3 */ + newconn3 = mg_connect_websocket_client("localhost", + atoi(PORT), + 0, + ebuf, + sizeof(ebuf), + "/websocket", + NULL, + websocket_client_data_handler, + websocket_client_close_handler, + &client3_data); + + sleep(1); /* Client 3 should get the websocket welcome message */ + assert(client1_data.closed == 1); + assert(client2_data.closed == 1); + assert(client3_data.closed == 0); + assert(client1_data.data == NULL); + assert(client1_data.len == 0); + assert(client2_data.data == NULL); + assert(client2_data.len == 0); + assert(client3_data.data != NULL); + assert(client3_data.len == websocket_welcome_msg_len); + assert(!memcmp(client3_data.data, + websocket_welcome_msg, + websocket_welcome_msg_len)); + free(client3_data.data); + client3_data.data = NULL; + client3_data.len = 0; + + mg_stop(ctx); + printf("Server shutdown\n"); + + sleep(10); + + assert(client3_data.closed == 1); + + return 0; +} diff --git a/3P/civetweb/examples/ws_server/Makefile b/3P/civetweb/examples/ws_server/Makefile new file mode 100644 index 00000000..399c918d --- /dev/null +++ b/3P/civetweb/examples/ws_server/Makefile @@ -0,0 +1,36 @@ +# +# Copyright (c) 2013 No Face Press, LLC +# License http://opensource.org/licenses/mit-license.php MIT License +# + +#This makefile is used to test the other Makefiles + + +PROG = ws_server +SRC = ws_server.c + +TOP = ../.. +CIVETWEB_LIB = libcivetweb.a + +CFLAGS = -I$(TOP)/include $(COPT) +LIBS = -lpthread + +include $(TOP)/resources/Makefile.in-os + +ifeq ($(TARGET_OS),LINUX) + LIBS += -ldl +endif + +all: $(PROG) + +$(PROG): $(CIVETWEB_LIB) $(SRC) + $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(SRC) $(CIVETWEB_LIB) $(LIBS) + +$(CIVETWEB_LIB): + $(MAKE) -C $(TOP) clean lib WITH_WEBSOCKET=1 + cp $(TOP)/$(CIVETWEB_LIB) . + +clean: + rm -f $(CIVETWEB_LIB) $(PROG) + +.PHONY: all clean diff --git a/3P/civetweb/examples/ws_server/docroot/index.html b/3P/civetweb/examples/ws_server/docroot/index.html new file mode 100644 index 00000000..f1d1af3e --- /dev/null +++ b/3P/civetweb/examples/ws_server/docroot/index.html @@ -0,0 +1,316 @@ + + + + + + + Websocket Meters + + + + + +
+ +

Meter Updates via WebSocket

+ +

+ +

+ +
+ +

+ +

+ +
+ +

+ +

+ +
+ +

+ +

+
+
+ + +
+
+

+

+ + + + + + diff --git a/3P/civetweb/examples/ws_server/ws_server.c b/3P/civetweb/examples/ws_server/ws_server.c new file mode 100644 index 00000000..575a26a6 --- /dev/null +++ b/3P/civetweb/examples/ws_server/ws_server.c @@ -0,0 +1,271 @@ +// Copyright (c) 2004-2012 Sergey Lyubka +// This file is a part of civetweb project, http://github.com/bel2125/civetweb +// +// v 0.1 Contributed by William Greathouse 9-Sep-2013 + +#include +#include +#include +#include + +#include "civetweb.h" + +// simple structure for keeping track of websocket connection +struct ws_connection { + struct mg_connection *conn; + int update; + int closing; +}; + +// time base and structure periodic updates to client for demo +#define BASETIME 100000 /* 0.1 seconds */ +struct progress { + int limit; + int increment; + int period; + int value; +}; + +// up to 16 independent client connections +#define CONNECTIONS 16 +static struct ws_connection ws_conn[CONNECTIONS]; + + +// ws_server_thread() +// Simple demo server thread. Sends periodic updates to connected clients +static void *ws_server_thread(void *parm) +{ + int wsd = (long)parm; + struct mg_connection *conn = ws_conn[wsd].conn; + int timer = 0; + char tstr[32]; + int i; + struct progress meter[] = { + /* first meter 0 to 1000, by 5 every 0.1 second */ + { 1000, 5, 1, 0 }, + /* second meter 0 to 500, by 10 every 0.5 second */ + { 500, 10, 5, 0 }, + /* third meter 0 to 100, by 10 every 1.0 second */ + { 100, 10, 10, 0}, + /* end of list */ + { 0, 0, 0, 0} + }; + + fprintf(stderr, "ws_server_thread %d\n", wsd); + + /* Send initial meter updates */ + for (i=0; meter[i].period != 0; i++) { + if (meter[i].value >= meter[i].limit) + meter[i].value = 0; + if (meter[i].value >= meter[i].limit) + meter[i].value = meter[i].limit; + sprintf(tstr, "meter%d:%d,%d", i+1, + meter[i].value, meter[i].limit); + mg_websocket_write(conn, WEBSOCKET_OPCODE_TEXT, tstr, strlen(tstr)); + } + + /* While the connection is open, send periodic updates */ + while(!ws_conn[wsd].closing) { + usleep(100000); /* 0.1 second */ + timer++; + + /* Send meter updates */ + if (ws_conn[wsd].update) { + for (i=0; meter[i].period != 0; i++) { + if (timer%meter[i].period == 0) { + if (meter[i].value >= meter[i].limit) + meter[i].value = 0; + else + meter[i].value += meter[i].increment; + if (meter[i].value >= meter[i].limit) + meter[i].value = meter[i].limit; + // if we are closing, server should not send new data + if (!ws_conn[wsd].closing) { + sprintf(tstr, "meter%d:%d,%d", i+1, + meter[i].value, meter[i].limit); + mg_websocket_write(conn, WEBSOCKET_OPCODE_TEXT, tstr, strlen(tstr)); + } + } + } + } + + /* Send periodic PING to assure websocket remains connected, except if we are closing */ + if (timer%100 == 0 && !ws_conn[wsd].closing) + mg_websocket_write(conn, WEBSOCKET_OPCODE_PING, NULL, 0); + } + + fprintf(stderr, "ws_server_thread %d exiting\n", wsd); + + // reset connection information to allow reuse by new client + ws_conn[wsd].conn = NULL; + ws_conn[wsd].update = 0; + ws_conn[wsd].closing = 2; + + return NULL; +} + +// websocket_connect_handler() +// On new client connection, find next available server connection and store +// new connection information. If no more server connections are available +// tell civetweb to not accept the client request. +static int websocket_connect_handler(const struct mg_connection *conn) +{ + int i; + + fprintf(stderr, "connect handler\n"); + + for(i=0; i < CONNECTIONS; ++i) { + if (ws_conn[i].conn == NULL) { + fprintf(stderr, "...prep for server %d\n", i); + ws_conn[i].conn = (struct mg_connection *)conn; + ws_conn[i].closing = 0; + ws_conn[i].update = 0; + break; + } + } + if (i >= CONNECTIONS) { + fprintf(stderr, "Refused connection: Max connections exceeded\n"); + return 1; + } + + return 0; +} + +// websocket_ready_handler() +// Once websocket negotiation is complete, start a server for the connection +static void websocket_ready_handler(struct mg_connection *conn) +{ + int i; + + fprintf(stderr, "ready handler\n"); + + for(i=0; i < CONNECTIONS; ++i) { + if (ws_conn[i].conn == conn) { + fprintf(stderr, "...start server %d\n", i); + mg_start_thread(ws_server_thread, (void *)(long)i); + break; + } + } +} + +// websocket_close_handler() +// When websocket is closed, tell the associated server to shut down +static void websocket_close_handler(struct mg_connection *conn) +{ + int i; + + //fprintf(stderr, "close handler\n"); /* called for every close, not just websockets */ + + for(i=0; i < CONNECTIONS; ++i) { + if (ws_conn[i].conn == conn) { + fprintf(stderr, "...close server %d\n", i); + ws_conn[i].closing = 1; + } + } +} + +// Arguments: +// flags: first byte of websocket frame, see websocket RFC, +// http://tools.ietf.org/html/rfc6455, section 5.2 +// data, data_len: payload data. Mask, if any, is already applied. +static int websocket_data_handler(struct mg_connection *conn, int flags, + char *data, size_t data_len) +{ + int i; + int wsd; + + for(i=0; i < CONNECTIONS; ++i) { + if (ws_conn[i].conn == conn) { + wsd = i; + break; + } + } + if (i >= CONNECTIONS) { + fprintf(stderr, "Received websocket data from unknown connection\n"); + return 1; + } + + if (flags & 0x80) { + flags &= 0x7f; + switch (flags) { + case WEBSOCKET_OPCODE_CONTINUATION: + fprintf(stderr, "CONTINUATION...\n"); + break; + case WEBSOCKET_OPCODE_TEXT: + fprintf(stderr, "TEXT: %-.*s\n", (int)data_len, data); + /*** interpret data as commands here ***/ + if (strncmp("update on", data, data_len)== 0) { + /* turn on updates */ + ws_conn[wsd].update = 1; + /* echo back */ + mg_websocket_write(conn, WEBSOCKET_OPCODE_TEXT, data, data_len); + } else if (strncmp("update off", data, data_len)== 0) { + /* turn off updates */ + ws_conn[wsd].update = 0; + /* echo back */ + mg_websocket_write(conn, WEBSOCKET_OPCODE_TEXT, data, data_len); + } + break; + case WEBSOCKET_OPCODE_BINARY: + fprintf(stderr, "BINARY...\n"); + break; + case WEBSOCKET_OPCODE_CONNECTION_CLOSE: + fprintf(stderr, "CLOSE...\n"); + /* If client initiated close, respond with close message in acknowlegement */ + if (!ws_conn[wsd].closing) { + mg_websocket_write(conn, WEBSOCKET_OPCODE_CONNECTION_CLOSE, data, data_len); + ws_conn[wsd].closing = 1; /* we should not send addional messages when close requested/acknowledged */ + } + return 0; /* time to close the connection */ + break; + case WEBSOCKET_OPCODE_PING: + /* client sent PING, respond with PONG */ + mg_websocket_write(conn, WEBSOCKET_OPCODE_PONG, data, data_len); + break; + case WEBSOCKET_OPCODE_PONG: + /* received PONG to our PING, no action */ + break; + default: + fprintf(stderr, "Unknown flags: %02x\n", flags); + break; + } + } + + return 1; /* keep connection open */ +} + + +int main(void) +{ + char server_name[40]; + struct mg_context *ctx; + struct mg_callbacks callbacks; + const char *options[] = { + "listening_ports", "8080", + "document_root", "docroot", + NULL + }; + + /* get simple greeting for the web server */ + snprintf(server_name, sizeof(server_name), + "Civetweb websocket server v. %s", + mg_version()); + + memset(&callbacks, 0, sizeof(callbacks)); + callbacks.websocket_connect = websocket_connect_handler; + callbacks.websocket_ready = websocket_ready_handler; + callbacks.websocket_data = websocket_data_handler; + callbacks.connection_close = websocket_close_handler; + + ctx = mg_start(&callbacks, NULL, options); + + /* show the greeting and some basic information */ + printf("%s started on port(s) %s with web root [%s]\n", + server_name, mg_get_option(ctx, "listening_ports"), + mg_get_option(ctx, "document_root")); + + getchar(); // Wait until user hits "enter" + mg_stop(ctx); + + return 0; +} diff --git a/3P/civetweb/format.bat b/3P/civetweb/format.bat new file mode 100644 index 00000000..6e9e8c6f --- /dev/null +++ b/3P/civetweb/format.bat @@ -0,0 +1,28 @@ +#!/bin/sh +clang-format -i src/civetweb.c +clang-format -i src/main.c +clang-format -i src/CivetServer.cpp +clang-format -i src/civetweb_private_lua.h +clang-format -i src/md5.inl +clang-format -i src/mod_lua.inl +clang-format -i src/mod_duktape.inl +clang-format -i src/timer.inl + +clang-format -i src/third_party/civetweb_lua.h + +clang-format -i include/civetweb.h +clang-format -i include/CivetServer.h + +clang-format -i test/public_func.h +clang-format -i test/public_func.c +clang-format -i test/public_server.h +clang-format -i test/public_server.c +clang-format -i test/private.h +clang-format -i test/private.c +clang-format -i test/private_exe.h +clang-format -i test/private_exe.c +clang-format -i test/shared.h +clang-format -i test/shared.c +clang-format -i test/civetweb_check.h +clang-format -i test/main.c + diff --git a/3P/civetweb/include/CivetServer.h b/3P/civetweb/include/CivetServer.h new file mode 100644 index 00000000..cc5105b3 --- /dev/null +++ b/3P/civetweb/include/CivetServer.h @@ -0,0 +1,498 @@ +/* Copyright (c) 2013-2014 the Civetweb developers + * Copyright (c) 2013 No Face Press, LLC + * + * License http://opensource.org/licenses/mit-license.php MIT License + */ + +#ifndef _CIVETWEB_SERVER_H_ +#define _CIVETWEB_SERVER_H_ +#ifdef __cplusplus + +#include "civetweb.h" +#include +#include +#include +#include + +// forward declaration +class CivetServer; + +/** + * Exception class for thrown exceptions within the CivetHandler object. + */ +class CIVETWEB_API CivetException : public std::runtime_error +{ + public: + CivetException(const std::string &msg) : std::runtime_error(msg) + { + } +}; + +/** + * Basic interface for a URI request handler. Handlers implementations + * must be reentrant. + */ +class CIVETWEB_API CivetHandler +{ + public: + /** + * Destructor + */ + virtual ~CivetHandler() + { + } + + /** + * Callback method for GET request. + * + * @param server - the calling server + * @param conn - the connection information + * @returns true if implemented, false otherwise + */ + virtual bool handleGet(CivetServer *server, struct mg_connection *conn); + + /** + * Callback method for POST request. + * + * @param server - the calling server + * @param conn - the connection information + * @returns true if implemented, false otherwise + */ + virtual bool handlePost(CivetServer *server, struct mg_connection *conn); + + /** + * Callback method for PUT request. + * + * @param server - the calling server + * @param conn - the connection information + * @returns true if implemented, false otherwise + */ + virtual bool handlePut(CivetServer *server, struct mg_connection *conn); + + /** + * Callback method for DELETE request. + * + * @param server - the calling server + * @param conn - the connection information + * @returns true if implemented, false otherwise + */ + virtual bool handleDelete(CivetServer *server, struct mg_connection *conn); + + /** + * Callback method for OPTIONS request. + * + * @param server - the calling server + * @param conn - the connection information + * @returns true if implemented, false otherwise + */ + virtual bool handleOptions(CivetServer *server, struct mg_connection *conn); +}; + +/** + * Basic interface for a websocket handler. Handlers implementations + * must be reentrant. + */ +class CIVETWEB_API CivetWebSocketHandler +{ + public: + /** + * Destructor + */ + virtual ~CivetWebSocketHandler() + { + } + + /** + * Callback method for when the client intends to establish a websocket + *connection, before websocket handshake. + * + * @param server - the calling server + * @param conn - the connection information + * @returns true to keep socket open, false to close it + */ + virtual bool handleConnection(CivetServer *server, + const struct mg_connection *conn); + + /** + * Callback method for when websocket handshake is successfully completed, + *and connection is ready for data exchange. + * + * @param server - the calling server + * @param conn - the connection information + */ + virtual void handleReadyState(CivetServer *server, + struct mg_connection *conn); + + /** + * Callback method for when a data frame has been received from the client. + * + * @param server - the calling server + * @param conn - the connection information + * @bits: first byte of the websocket frame, see websocket RFC at + *http://tools.ietf.org/html/rfc6455, section 5.2 + * @data, data_len: payload, with mask (if any) already applied. + * @returns true to keep socket open, false to close it + */ + virtual bool handleData(CivetServer *server, + struct mg_connection *conn, + int bits, + char *data, + size_t data_len); + + /** + * Callback method for when the connection is closed. + * + * @param server - the calling server + * @param conn - the connection information + */ + virtual void handleClose(CivetServer *server, + const struct mg_connection *conn); +}; + +/** + * CivetServer + * + * Basic class for embedded web server. This has an URL mapping built-in. + */ +class CIVETWEB_API CivetServer +{ + public: + /** + * Constructor + * + * This automatically starts the sever. + * It is good practice to call getContext() after this in case there + * were errors starting the server. + * + * @param options - the web server options. + * @param callbacks - optional web server callback methods. + * + * @throws CivetException + */ + CivetServer(const char **options, const struct mg_callbacks *callbacks = 0); + + /** + * Destructor + */ + virtual ~CivetServer(); + + /** + * close() + * + * Stops server and frees resources. + */ + void close(); + + /** + * getContext() + * + * @return the context or 0 if not running. + */ + const struct mg_context * + getContext() const + { + return context; + } + + /** + * addHandler(const std::string &, CivetHandler *) + * + * Adds a URI handler. If there is existing URI handler, it will + * be replaced with this one. + * + * URI's are ordered and prefix (REST) URI's are supported. + * + * @param uri - URI to match. + * @param handler - handler instance to use. + */ + void addHandler(const std::string &uri, CivetHandler *handler); + + void + addHandler(const std::string &uri, CivetHandler &handler) + { + addHandler(uri, &handler); + } + + /** + * addWebSocketHandler + * + * Adds a WebSocket handler for a specific URI. If there is existing URI + *handler, it will + * be replaced with this one. + * + * URI's are ordered and prefix (REST) URI's are supported. + * + * @param uri - URI to match. + * @param handler - handler instance to use. + */ + void addWebSocketHandler(const std::string &uri, + CivetWebSocketHandler *handler); + + void + addWebSocketHandler(const std::string &uri, CivetWebSocketHandler &handler) + { + addWebSocketHandler(uri, &handler); + } + + /** + * removeHandler(const std::string &) + * + * Removes a handler. + * + * @param uri - the exact URL used in addHandler(). + */ + void removeHandler(const std::string &uri); + + /** + * removeWebSocketHandler(const std::string &) + * + * Removes a web socket handler. + * + * @param uri - the exact URL used in addWebSocketHandler(). + */ + void removeWebSocketHandler(const std::string &uri); + + /** + * getListeningPorts() + * + * Returns a list of ports that are listening + * + * @return A vector of ports + */ + + std::vector getListeningPorts(); + + /** + * getCookie(struct mg_connection *conn, const std::string &cookieName, + *std::string &cookieValue) + * + * Puts the cookie value string that matches the cookie name in the + *cookieValue destinaton string. + * + * @param conn - the connection information + * @param cookieName - cookie name to get the value from + * @param cookieValue - cookie value is returned using thiis reference + * @returns the size of the cookie value string read. + */ + static int getCookie(struct mg_connection *conn, + const std::string &cookieName, + std::string &cookieValue); + + /** + * getHeader(struct mg_connection *conn, const std::string &headerName) + * @param conn - the connection information + * @param headerName - header name to get the value from + * @returns a char array whcih contains the header value as string + */ + static const char *getHeader(struct mg_connection *conn, + const std::string &headerName); + + /** + * getParam(struct mg_connection *conn, const char *, std::string &, size_t) + * + * Returns a query paramter contained in the supplied buffer. The + * occurance value is a zero-based index of a particular key name. This + * should not be confused with the index over all of the keys. Note that + *this + * function assumes that parameters are sent as text in http query string + * format, which is the default for web forms. This function will work for + * html forms with method="GET" and method="POST" attributes. In other + *cases, + * you may use a getParam version that directly takes the data instead of + *the + * connection as a first argument. + * + * @param conn - parameters are read from the data sent through this + *connection + * @param name - the key to search for + * @param dst - the destination string + * @param occurrence - the occurrence of the selected name in the query (0 + *based). + * @return true if key was found + */ + static bool getParam(struct mg_connection *conn, + const char *name, + std::string &dst, + size_t occurrence = 0); + + /** + * getParam(const std::string &, const char *, std::string &, size_t) + * + * Returns a query paramter contained in the supplied buffer. The + * occurance value is a zero-based index of a particular key name. This + * should not be confused with the index over all of the keys. + * + * @param data - the query string (text) + * @param name - the key to search for + * @param dst - the destination string + * @param occurrence - the occurrence of the selected name in the query (0 + *based). + * @return true if key was found + */ + static bool + getParam(const std::string &data, + const char *name, + std::string &dst, + size_t occurrence = 0) + { + return getParam(data.c_str(), data.length(), name, dst, occurrence); + } + + /** + * getParam(const char *, size_t, const char *, std::string &, size_t) + * + * Returns a query paramter contained in the supplied buffer. The + * occurance value is a zero-based index of a particular key name. This + * should not be confused with the index over all of the keys. + * + * @param data the - query string (text) + * @param data_len - length of the query string + * @param name - the key to search for + * @param dst - the destination string + * @param occurrence - the occurrence of the selected name in the query (0 + *based). + * @return true if key was found + */ + static bool getParam(const char *data, + size_t data_len, + const char *name, + std::string &dst, + size_t occurrence = 0); + + /** + * urlDecode(const std::string &, std::string &, bool) + * + * @param src - string to be decoded + * @param dst - destination string + * @param is_form_url_encoded - true if form url encoded + * form-url-encoded data differs from URI encoding in a way that it + * uses '+' as character for space, see RFC 1866 section 8.2.1 + * http://ftp.ics.uci.edu/pub/ietf/html/rfc1866.txt + */ + static void + urlDecode(const std::string &src, + std::string &dst, + bool is_form_url_encoded = true) + { + urlDecode(src.c_str(), src.length(), dst, is_form_url_encoded); + } + + /** + * urlDecode(const char *, size_t, std::string &, bool) + * + * @param src - buffer to be decoded + * @param src_len - length of buffer to be decoded + * @param dst - destination string + * @param is_form_url_encoded - true if form url encoded + * form-url-encoded data differs from URI encoding in a way that it + * uses '+' as character for space, see RFC 1866 section 8.2.1 + * http://ftp.ics.uci.edu/pub/ietf/html/rfc1866.txt + */ + static void urlDecode(const char *src, + size_t src_len, + std::string &dst, + bool is_form_url_encoded = true); + + /** + * urlDecode(const char *, std::string &, bool) + * + * @param src - buffer to be decoded (0 terminated) + * @param dst - destination string + * @param is_form_url_encoded true - if form url encoded + * form-url-encoded data differs from URI encoding in a way that it + * uses '+' as character for space, see RFC 1866 section 8.2.1 + * http://ftp.ics.uci.edu/pub/ietf/html/rfc1866.txt + */ + static void urlDecode(const char *src, + std::string &dst, + bool is_form_url_encoded = true); + + /** + * urlEncode(const std::string &, std::string &, bool) + * + * @param src - buffer to be encoded + * @param dst - destination string + * @param append - true if string should not be cleared before encoding. + */ + static void + urlEncode(const std::string &src, std::string &dst, bool append = false) + { + urlEncode(src.c_str(), src.length(), dst, append); + } + + /** + * urlEncode(const char *, size_t, std::string &, bool) + * + * @param src - buffer to be encoded (0 terminated) + * @param dst - destination string + * @param append - true if string should not be cleared before encoding. + */ + static void + urlEncode(const char *src, std::string &dst, bool append = false); + + /** + * urlEncode(const char *, size_t, std::string &, bool) + * + * @param src - buffer to be encoded + * @param src_len - length of buffer to be decoded + * @param dst - destination string + * @param append - true if string should not be cleared before encoding. + */ + static void urlEncode(const char *src, + size_t src_len, + std::string &dst, + bool append = false); + + protected: + class CivetConnection + { + public: + char *postData; + unsigned long postDataLen; + + CivetConnection(); + ~CivetConnection(); + }; + + struct mg_context *context; + std::map connections; + + private: + /** + * requestHandler(struct mg_connection *, void *cbdata) + * + * Handles the incomming request. + * + * @param conn - the connection information + * @param cbdata - pointer to the CivetHandler instance. + * @returns 0 if implemented, false otherwise + */ + static int requestHandler(struct mg_connection *conn, void *cbdata); + + static int webSocketConnectionHandler(const struct mg_connection *conn, + void *cbdata); + static void webSocketReadyHandler(struct mg_connection *conn, void *cbdata); + static int webSocketDataHandler(struct mg_connection *conn, + int bits, + char *data, + size_t data_len, + void *cbdata); + static void webSocketCloseHandler(const struct mg_connection *conn, + void *cbdata); + /** + * closeHandler(struct mg_connection *) + * + * Handles closing a request (internal handler) + * + * @param conn - the connection information + */ + static void closeHandler(const struct mg_connection *conn); + + /** + * Stores the user provided close handler + */ + void (*userCloseHandler)(const struct mg_connection *conn); +}; + +#endif /* __cplusplus */ +#endif /* _CIVETWEB_SERVER_H_ */ diff --git a/3P/civetweb/include/civetweb.h b/3P/civetweb/include/civetweb.h new file mode 100644 index 00000000..cb9092d6 --- /dev/null +++ b/3P/civetweb/include/civetweb.h @@ -0,0 +1,812 @@ +/* Copyright (c) 2013-2015 the Civetweb developers + * Copyright (c) 2004-2013 Sergey Lyubka + * + * 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 CIVETWEB_HEADER_INCLUDED +#define CIVETWEB_HEADER_INCLUDED + +#define CIVETWEB_VERSION "1.8" + +#ifndef CIVETWEB_API +#if defined(_WIN32) +#if defined(CIVETWEB_DLL_EXPORTS) +#define CIVETWEB_API __declspec(dllexport) +#elif defined(CIVETWEB_DLL_IMPORTS) +#define CIVETWEB_API __declspec(dllimport) +#else +#define CIVETWEB_API +#endif +#elif __GNUC__ >= 4 +#define CIVETWEB_API __attribute__((visibility("default"))) +#else +#define CIVETWEB_API +#endif +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +struct mg_context; /* Handle for the HTTP service itself */ +struct mg_connection; /* Handle for the individual connection */ + +/* This structure contains information about the HTTP request. */ +struct mg_request_info { + const char *request_method; /* "GET", "POST", etc */ + const char *request_uri; /* URL-decoded URI (absolute or relative, + * as in the request) */ + const char *local_uri; /* URL-decoded URI (relative). Can be NULL + * if the request_uri does not address a + * resource at the server host. */ + const char *uri; /* Deprecated: use local_uri instead */ + const char *http_version; /* E.g. "1.0", "1.1" */ + const char *query_string; /* URL part after '?', not including '?', or + NULL */ + const char *remote_user; /* Authenticated user, or NULL if no auth + used */ + char remote_addr[48]; /* Client's IP address as a string. */ + +#if defined(MG_LEGACY_INTERFACE) + long remote_ip; /* Client's IP address. Deprecated: use remote_addr instead + */ +#endif + + long long content_length; /* Length (in bytes) of the request body, + can be -1 if no length was given. */ + int remote_port; /* Client's port */ + int is_ssl; /* 1 if SSL-ed, 0 if not */ + void *user_data; /* User data pointer passed to mg_start() */ + void *conn_data; /* Connection-specific user data */ + + int num_headers; /* Number of HTTP headers */ + struct mg_header { + const char *name; /* HTTP header name */ + const char *value; /* HTTP header value */ + } http_headers[64]; /* Maximum 64 headers */ +}; + +/* This structure needs to be passed to mg_start(), to let civetweb know + which callbacks to invoke. For a detailed description, see + https://github.com/civetweb/civetweb/blob/master/docs/UserManual.md */ +struct mg_callbacks { + /* Called when civetweb has received new HTTP request. + If the callback returns one, it must process the request + by sending valid HTTP headers and a body. Civetweb will not do + any further processing. Otherwise it must return zero. + Note that since V1.7 the "begin_request" function is called + before an authorization check. If an authorization check is + required, use a request_handler instead. + Return value: + 0: civetweb will process the request itself. In this case, + the callback must not send any data to the client. + 1-999: callback already processed the request. Civetweb will + not send any data after the callback returned. The + return code is stored as a HTTP status code for the + access log. */ + int (*begin_request)(struct mg_connection *); + + /* Called when civetweb has finished processing request. */ + void (*end_request)(const struct mg_connection *, int reply_status_code); + + /* Called when civetweb is about to log a message. If callback returns + non-zero, civetweb does not log anything. */ + int (*log_message)(const struct mg_connection *, const char *message); + + /* Called when civetweb is about to log access. If callback returns + non-zero, civetweb does not log anything. */ + int (*log_access)(const struct mg_connection *, const char *message); + + /* Called when civetweb initializes SSL library. + Parameters: + user_data: parameter user_data passed when starting the server. + Return value: + 0: civetweb will set up the SSL certificate. + 1: civetweb assumes the callback already set up the certificate. + -1: initializing ssl fails. */ + int (*init_ssl)(void *ssl_context, void *user_data); + +#if defined(MG_LEGACY_INTERFACE) + /* Called when websocket request is received, before websocket handshake. + Return value: + 0: civetweb proceeds with websocket handshake. + 1: connection is closed immediately. + This callback is deprecated, use mg_set_websocket_handler instead. */ + int (*websocket_connect)(const struct mg_connection *); + + /* Called when websocket handshake is successfully completed, and + connection is ready for data exchange. + This callback is deprecated, use mg_set_websocket_handler instead. */ + void (*websocket_ready)(struct mg_connection *); + + /* Called when data frame has been received from the client. + Parameters: + bits: first byte of the websocket frame, see websocket RFC at + http://tools.ietf.org/html/rfc6455, section 5.2 + data, data_len: payload, with mask (if any) already applied. + Return value: + 1: keep this websocket connection open. + 0: close this websocket connection. + This callback is deprecated, use mg_set_websocket_handler instead. */ + int (*websocket_data)(struct mg_connection *, + int bits, + char *data, + size_t data_len); +#endif /* MG_LEGACY_INTERFACE */ + + /* Called when civetweb is closing a connection. The per-context mutex is + locked when this is invoked. This is primarily useful for noting when + a websocket is closing and removing it from any application-maintained + list of clients. + Using this callback for websocket connections is deprecated, use + mg_set_websocket_handler instead. */ + void (*connection_close)(const struct mg_connection *); + + /* Called when civetweb tries to open a file. Used to intercept file open + calls, and serve file data from memory instead. + Parameters: + path: Full path to the file to open. + data_len: Placeholder for the file size, if file is served from + memory. + Return value: + NULL: do not serve file from memory, proceed with normal file open. + non-NULL: pointer to the file contents in memory. data_len must be + initilized with the size of the memory block. */ + const char *(*open_file)(const struct mg_connection *, + const char *path, + size_t *data_len); + + /* Called when civetweb is about to serve Lua server page, if + Lua support is enabled. + Parameters: + lua_context: "lua_State *" pointer. */ + void (*init_lua)(const struct mg_connection *, void *lua_context); + + /* Called when civetweb has uploaded a file to a temporary directory as a + result of mg_upload() call. + Parameters: + file_name: full path name to the uploaded file. */ + void (*upload)(struct mg_connection *, const char *file_name); + + /* Called when civetweb is about to send HTTP error to the client. + Implementing this callback allows to create custom error pages. + Parameters: + status: HTTP error status code. + Return value: + 1: run civetweb error handler. + 0: callback already handled the error. */ + int (*http_error)(struct mg_connection *, int status); + + /* Called after civetweb context has been created, before requests + are processed. + Parameters: + ctx: context handle */ + void (*init_context)(const struct mg_context *ctx); + + /* Called when civetweb context is deleted. + Parameters: + ctx: context handle */ + void (*exit_context)(const struct mg_context *ctx); +}; + +/* Start web server. + + Parameters: + callbacks: mg_callbacks structure with user-defined callbacks. + options: NULL terminated list of option_name, option_value pairs that + specify Civetweb configuration parameters. + + Side-effects: on UNIX, ignores SIGCHLD and SIGPIPE signals. If custom + processing is required for these, signal handlers must be set up + after calling mg_start(). + + + Example: + const char *options[] = { + "document_root", "/var/www", + "listening_ports", "80,443s", + NULL + }; + struct mg_context *ctx = mg_start(&my_func, NULL, options); + + Refer to https://github.com/civetweb/civetweb/blob/master/docs/UserManual.md + for the list of valid option and their possible values. + + Return: + web server context, or NULL on error. */ +CIVETWEB_API struct mg_context *mg_start(const struct mg_callbacks *callbacks, + void *user_data, + const char **configuration_options); + +/* Stop the web server. + + Must be called last, when an application wants to stop the web server and + release all associated resources. This function blocks until all Civetweb + threads are stopped. Context pointer becomes invalid. */ +CIVETWEB_API void mg_stop(struct mg_context *); + +/* mg_request_handler + + Called when a new request comes in. This callback is URI based + and configured with mg_set_request_handler(). + + Parameters: + conn: current connection information. + cbdata: the callback data configured with mg_set_request_handler(). + Returns: + 0: the handler could not handle the request, so fall through. + 1 - 999: the handler processed the request. The return code is + stored as a HTTP status code for the access log. */ +typedef int (*mg_request_handler)(struct mg_connection *conn, void *cbdata); + +/* mg_set_request_handler + + Sets or removes a URI mapping for a request handler. + This function uses mg_lock_context internally. + + URI's are ordered and prefixed URI's are supported. For example, + consider two URIs: /a/b and /a + /a matches /a + /a/b matches /a/b + /a/c matches /a + + Parameters: + ctx: server context + uri: the URI (exact or pattern) for the handler + handler: the callback handler to use when the URI is requested. + If NULL, an already registered handler for this URI will be + removed. + The URI used to remove a handler must match exactly the one used + to + register it (not only a pattern match). + cbdata: the callback data to give to the handler when it is called. */ +CIVETWEB_API void mg_set_request_handler(struct mg_context *ctx, + const char *uri, + mg_request_handler handler, + void *cbdata); + +/* Callback types for websocket handlers in C/C++. + + mg_websocket_connect_handler + Is called when the client intends to establish a websocket connection, + before websocket handshake. + Return value: + 0: civetweb proceeds with websocket handshake. + 1: connection is closed immediately. + + mg_websocket_ready_handler + Is called when websocket handshake is successfully completed, and + connection is ready for data exchange. + + mg_websocket_data_handler + Is called when a data frame has been received from the client. + Parameters: + bits: first byte of the websocket frame, see websocket RFC at + http://tools.ietf.org/html/rfc6455, section 5.2 + data, data_len: payload, with mask (if any) already applied. + Return value: + 1: keep this websocket connection open. + 0: close this websocket connection. + + mg_connection_close_handler + Is called, when the connection is closed.*/ +typedef int (*mg_websocket_connect_handler)(const struct mg_connection *, + void *); +typedef void (*mg_websocket_ready_handler)(struct mg_connection *, void *); +typedef int (*mg_websocket_data_handler)(struct mg_connection *, + int, + char *, + size_t, + void *); +typedef void (*mg_websocket_close_handler)(const struct mg_connection *, + void *); + +/* mg_set_websocket_handler + + Set or remove handler functions for websocket connections. + This function works similar to mg_set_request_handler - see there. */ +CIVETWEB_API void +mg_set_websocket_handler(struct mg_context *ctx, + const char *uri, + mg_websocket_connect_handler connect_handler, + mg_websocket_ready_handler ready_handler, + mg_websocket_data_handler data_handler, + mg_websocket_close_handler close_handler, + void *cbdata); + +/* Get the value of particular configuration parameter. + The value returned is read-only. Civetweb does not allow changing + configuration at run time. + If given parameter name is not valid, NULL is returned. For valid + names, return value is guaranteed to be non-NULL. If parameter is not + set, zero-length string is returned. */ +CIVETWEB_API const char *mg_get_option(const struct mg_context *ctx, + const char *name); + +CIVETWEB_API const char *mg_get_response_code_text (int response_code, struct mg_connection *conn); + + +/* Get context from connection. */ +CIVETWEB_API struct mg_context * +mg_get_context(const struct mg_connection *conn); + +/* Get user data passed to mg_start from context. */ +CIVETWEB_API void *mg_get_user_data(const struct mg_context *ctx); + +/* Set user data for the current connection. */ +CIVETWEB_API void mg_set_user_connection_data(const struct mg_connection *conn, + void *data); + +/* Get user data set for the current connection. */ +CIVETWEB_API void * +mg_get_user_connection_data(const struct mg_connection *conn); + +#if defined(MG_LEGACY_INTERFACE) +/* Return array of strings that represent valid configuration options. + For each option, option name and default value is returned, i.e. the + number of entries in the array equals to number_of_options x 2. + Array is NULL terminated. */ +/* Deprecated: Use mg_get_valid_options instead. */ +CIVETWEB_API const char **mg_get_valid_option_names(void); +#endif + +struct mg_option { + const char *name; + int type; + const char *default_value; +}; + +enum { + CONFIG_TYPE_UNKNOWN = 0x0, + CONFIG_TYPE_NUMBER = 0x1, + CONFIG_TYPE_STRING = 0x2, + CONFIG_TYPE_FILE = 0x3, + CONFIG_TYPE_DIRECTORY = 0x4, + CONFIG_TYPE_BOOLEAN = 0x5, + CONFIG_TYPE_EXT_PATTERN = 0x6 +}; + +/* Return array of struct mg_option, representing all valid configuration + options of civetweb.c. + The array is terminated by a NULL name option. */ +CIVETWEB_API const struct mg_option *mg_get_valid_options(void); + +struct mg_server_ports { + int protocol; /* 1 = IPv4, 2 = IPv6, 3 = both */ + int port; /* port number */ + int is_ssl; /* https port: 0 = no, 1 = yes */ + int is_redirect; /* redirect all requests: 0 = no, 1 = yes */ + int _reserved1; + int _reserved2; + int _reserved3; + int _reserved4; +}; + +/* Get the list of ports that civetweb is listening on. + The parameter size is the size of the ports array in elements. + The caller is responsibility to allocate the required memory. + This function returns the number of struct mg_server_ports elements + filled in, or <0 in case of an error. */ +CIVETWEB_API int mg_get_server_ports(const struct mg_context *ctx, + int size, + struct mg_server_ports *ports); + +/* Deprecated. Use mg_get_server_ports instead. */ +CIVETWEB_API size_t +mg_get_ports(const struct mg_context *ctx, size_t size, int *ports, int *ssl); + +/* Add, edit or delete the entry in the passwords file. + + This function allows an application to manipulate .htpasswd files on the + fly by adding, deleting and changing user records. This is one of the + several ways of implementing authentication on the server side. For another, + cookie-based way please refer to the examples/chat in the source tree. + + If password is not NULL, entry is added (or modified if already exists). + If password is NULL, entry is deleted. + + Return: + 1 on success, 0 on error. */ +CIVETWEB_API int mg_modify_passwords_file(const char *passwords_file_name, + const char *domain, + const char *user, + const char *password); + +/* Return information associated with the request. */ +CIVETWEB_API const struct mg_request_info * +mg_get_request_info(const struct mg_connection *); + +/* Send data to the client. + Return: + 0 when the connection has been closed + -1 on error + >0 number of bytes written on success */ +CIVETWEB_API int mg_write(struct mg_connection *, const void *buf, size_t len); + +/* Send data to a websocket client wrapped in a websocket frame. Uses + mg_lock_connection to ensure that the transmission is not interrupted, + i.e., when the application is proactively communicating and responding to + a request simultaneously. + + Send data to a websocket client wrapped in a websocket frame. + This function is available when civetweb is compiled with -DUSE_WEBSOCKET + + Return: + 0 when the connection has been closed + -1 on error + >0 number of bytes written on success */ +CIVETWEB_API int mg_websocket_write(struct mg_connection *conn, + int opcode, + const char *data, + size_t data_len); + +/* Send data to a websocket server wrapped in a masked websocket frame. Uses + mg_lock_connection to ensure that the transmission is not interrupted, + i.e., when the application is proactively communicating and responding to + a request simultaneously. + + Send data to a websocket server wrapped in a masked websocket frame. + This function is available when civetweb is compiled with -DUSE_WEBSOCKET + + Return: + 0 when the connection has been closed + -1 on error + >0 number of bytes written on success */ +CIVETWEB_API int mg_websocket_client_write(struct mg_connection *conn, + int opcode, + const char *data, + size_t data_len); + +/* Blocks until unique access is obtained to this connection. Intended for use + with websockets only. + Invoke this before mg_write or mg_printf when communicating with a + websocket if your code has server-initiated communication as well as + communication in direct response to a message. */ +CIVETWEB_API void mg_lock_connection(struct mg_connection *conn); +CIVETWEB_API void mg_unlock_connection(struct mg_connection *conn); + +#if defined(MG_LEGACY_INTERFACE) +#define mg_lock mg_lock_connection +#define mg_unlock mg_unlock_connection +#endif + +/* Lock server context. This lock may be used to protect resources + that are shared between different connection/worker threads. */ +CIVETWEB_API void mg_lock_context(struct mg_context *ctx); +CIVETWEB_API void mg_unlock_context(struct mg_context *ctx); + +/* Opcodes, from http://tools.ietf.org/html/rfc6455 */ +enum { + WEBSOCKET_OPCODE_CONTINUATION = 0x0, + WEBSOCKET_OPCODE_TEXT = 0x1, + WEBSOCKET_OPCODE_BINARY = 0x2, + WEBSOCKET_OPCODE_CONNECTION_CLOSE = 0x8, + WEBSOCKET_OPCODE_PING = 0x9, + WEBSOCKET_OPCODE_PONG = 0xa +}; + +/* Macros for enabling compiler-specific checks for printf-like arguments. */ +#undef PRINTF_FORMAT_STRING +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#include +#if defined(_MSC_VER) && _MSC_VER > 1400 +#define PRINTF_FORMAT_STRING(s) _Printf_format_string_ s +#else +#define PRINTF_FORMAT_STRING(s) __format_string s +#endif +#else +#define PRINTF_FORMAT_STRING(s) s +#endif + +#ifdef __GNUC__ +#define PRINTF_ARGS(x, y) __attribute__((format(printf, x, y))) +#else +#define PRINTF_ARGS(x, y) +#endif + +/* Send data to the client using printf() semantics. + Works exactly like mg_write(), but allows to do message formatting. */ +CIVETWEB_API int mg_printf(struct mg_connection *, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(2, 3); + +/* Send contents of the entire file together with HTTP headers. */ +CIVETWEB_API void mg_send_file(struct mg_connection *conn, const char *path); + +/* Read data from the remote end, return number of bytes read. + Return: + 0 connection has been closed by peer. No more data could be read. + < 0 read error. No more data could be read from the connection. + > 0 number of bytes read into the buffer. */ +CIVETWEB_API int mg_read(struct mg_connection *, void *buf, size_t len); + +/* Get the value of particular HTTP header. + + This is a helper function. It traverses request_info->http_headers array, + and if the header is present in the array, returns its value. If it is + not present, NULL is returned. */ +CIVETWEB_API const char *mg_get_header(const struct mg_connection *, + const char *name); + +/* Get a value of particular form variable. + + Parameters: + data: pointer to form-uri-encoded buffer. This could be either POST data, + or request_info.query_string. + data_len: length of the encoded data. + var_name: variable name to decode from the buffer + dst: destination buffer for the decoded variable + dst_len: length of the destination buffer + + Return: + On success, length of the decoded variable. + On error: + -1 (variable not found). + -2 (destination buffer is NULL, zero length or too small to hold the + decoded variable). + + Destination buffer is guaranteed to be '\0' - terminated if it is not + NULL or zero length. */ +CIVETWEB_API int mg_get_var(const char *data, + size_t data_len, + const char *var_name, + char *dst, + size_t dst_len); + +/* Get a value of particular form variable. + + Parameters: + data: pointer to form-uri-encoded buffer. This could be either POST data, + or request_info.query_string. + data_len: length of the encoded data. + var_name: variable name to decode from the buffer + dst: destination buffer for the decoded variable + dst_len: length of the destination buffer + occurrence: which occurrence of the variable, 0 is the first, 1 the + second... + this makes it possible to parse a query like + b=x&a=y&a=z which will have occurrence values b:0, a:0 and a:1 + + Return: + On success, length of the decoded variable. + On error: + -1 (variable not found). + -2 (destination buffer is NULL, zero length or too small to hold the + decoded variable). + + Destination buffer is guaranteed to be '\0' - terminated if it is not + NULL or zero length. */ +CIVETWEB_API int mg_get_var2(const char *data, + size_t data_len, + const char *var_name, + char *dst, + size_t dst_len, + size_t occurrence); + +/* Fetch value of certain cookie variable into the destination buffer. + + Destination buffer is guaranteed to be '\0' - terminated. In case of + failure, dst[0] == '\0'. Note that RFC allows many occurrences of the same + parameter. This function returns only first occurrence. + + Return: + On success, value length. + On error: + -1 (either "Cookie:" header is not present at all or the requested + parameter is not found). + -2 (destination buffer is NULL, zero length or too small to hold the + value). */ +CIVETWEB_API int mg_get_cookie(const char *cookie, + const char *var_name, + char *buf, + size_t buf_len); + +/* Download data from the remote web server. + host: host name to connect to, e.g. "foo.com", or "10.12.40.1". + port: port number, e.g. 80. + use_ssl: wether to use SSL connection. + error_buffer, error_buffer_size: error message placeholder. + request_fmt,...: HTTP request. + Return: + On success, valid pointer to the new connection, suitable for mg_read(). + On error, NULL. error_buffer contains error message. + Example: + char ebuf[100]; + struct mg_connection *conn; + conn = mg_download("google.com", 80, 0, ebuf, sizeof(ebuf), + "%s", "GET / HTTP/1.0\r\nHost: google.com\r\n\r\n"); + */ +CIVETWEB_API struct mg_connection * +mg_download(const char *host, + int port, + int use_ssl, + char *error_buffer, + size_t error_buffer_size, + PRINTF_FORMAT_STRING(const char *request_fmt), + ...) PRINTF_ARGS(6, 7); + +/* Close the connection opened by mg_download(). */ +CIVETWEB_API void mg_close_connection(struct mg_connection *conn); + +/* File upload functionality. Each uploaded file gets saved into a temporary + file and MG_UPLOAD event is sent. + Return number of uploaded files. */ +CIVETWEB_API int mg_upload(struct mg_connection *conn, + const char *destination_dir); + +/* Convenience function -- create detached thread. + Return: 0 on success, non-0 on error. */ +typedef void *(*mg_thread_func_t)(void *); +CIVETWEB_API int mg_start_thread(mg_thread_func_t f, void *p); + +/* Return builtin mime type for the given file name. + For unrecognized extensions, "text/plain" is returned. */ +CIVETWEB_API const char *mg_get_builtin_mime_type(const char *file_name); + +/* Return Civetweb version. */ +CIVETWEB_API const char *mg_version(void); + +/* URL-decode input buffer into destination buffer. + 0-terminate the destination buffer. + form-url-encoded data differs from URI encoding in a way that it + uses '+' as character for space, see RFC 1866 section 8.2.1 + http://ftp.ics.uci.edu/pub/ietf/html/rfc1866.txt + Return: length of the decoded data, or -1 if dst buffer is too small. */ +CIVETWEB_API int mg_url_decode(const char *src, + int src_len, + char *dst, + int dst_len, + int is_form_url_encoded); + +/* URL-encode input buffer into destination buffer. + returns the length of the resulting buffer or -1 + is the buffer is too small. */ +CIVETWEB_API int mg_url_encode(const char *src, char *dst, size_t dst_len); + +/* MD5 hash given strings. + Buffer 'buf' must be 33 bytes long. Varargs is a NULL terminated list of + ASCIIz strings. When function returns, buf will contain human-readable + MD5 hash. Example: + char buf[33]; + mg_md5(buf, "aa", "bb", NULL); */ +CIVETWEB_API char *mg_md5(char buf[33], ...); + +/* Print error message to the opened error log stream. + This utilizes the provided logging configuration. + conn: connection + fmt: format string without the line return + ...: variable argument list + Example: + mg_cry(conn,"i like %s", "logging"); */ +CIVETWEB_API void mg_cry(const struct mg_connection *conn, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(2, 3); + +/* utility method to compare two buffers, case incensitive. */ +CIVETWEB_API int mg_strncasecmp(const char *s1, const char *s2, size_t len); + +/* Connect to a websocket as a client + Parameters: + host: host to connect to, i.e. "echo.websocket.org" or "192.168.1.1" or + "localhost" + port: server port + use_ssl: make a secure connection to server + error_buffer, error_buffer_size: buffer for an error message + path: server path you are trying to connect to, i.e. if connection to + localhost/app, path should be "/app" + origin: value of the Origin HTTP header + data_func: callback that should be used when data is received from the + server + user_data: user supplied argument + + Return: + On success, valid mg_connection object. + On error, NULL. Se error_buffer for details. +*/ + +CIVETWEB_API struct mg_connection * +mg_connect_websocket_client(const char *host, + int port, + int use_ssl, + char *error_buffer, + size_t error_buffer_size, + const char *path, + const char *origin, + mg_websocket_data_handler data_func, + mg_websocket_close_handler close_func, + void *user_data); + +/* Connect to a TCP server as a client (can be used to connect to a HTTP server) + Parameters: + host: host to connect to, i.e. "www.wikipedia.org" or "192.168.1.1" or + "localhost" + port: server port + use_ssl: make a secure connection to server + error_buffer, error_buffer_size: buffer for an error message + + Return: + On success, valid mg_connection object. + On error, NULL. Se error_buffer for details. +*/ +CIVETWEB_API struct mg_connection *mg_connect_client(const char *host, + int port, + int use_ssl, + char *error_buffer, + size_t error_buffer_size); + + +struct mg_client_options { + const char *host; + int port; + const char *client_cert; + const char *server_cert; + /* TODO: add more data */ +}; + +CIVETWEB_API struct mg_connection * +mg_connect_client_secure(const struct mg_client_options *client_options, + char *error_buffer, + size_t error_buffer_size); + + +enum { TIMEOUT_INFINITE = -1 }; + +/* Wait for a response from the server + Parameters: + conn: connection + ebuf, ebuf_len: error message placeholder. + timeout: time to wait for a response in milliseconds (if < 0 then wait + forever) + + Return: + On success, >= 0 + On error/timeout, < 0 +*/ +CIVETWEB_API int mg_get_response(struct mg_connection *conn, + char *ebuf, + size_t ebuf_len, + int timeout); + +/* Check which features where set when civetweb has been compiled. + Parameters: + feature: specifies which feature should be checked + 1 serve files (NO_FILES not set) + 2 support HTTPS (NO_SSL not set) + 4 support CGI (NO_CGI not set) + 8 support IPv6 (USE_IPV6 set) + 16 support WebSocket (USE_WEBSOCKET set) + 32 support Lua scripts and Lua server pages (USE_LUA is set) + 64 support server side JavaScript (USE_DUKTAPE is set) + The result is undefined for all other feature values. + + Return: + If feature is available > 0 + If feature is not available = 0 +*/ +CIVETWEB_API unsigned mg_check_feature(unsigned feature); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* CIVETWEB_HEADER_INCLUDED */ diff --git a/3P/civetweb/mingw.cmd b/3P/civetweb/mingw.cmd new file mode 100644 index 00000000..57437334 --- /dev/null +++ b/3P/civetweb/mingw.cmd @@ -0,0 +1,884 @@ +:: Make sure the extensions are enabled +@verify other 2>nul +@setlocal EnableExtensions EnableDelayedExpansion +@if errorlevel 1 ( + @call :print_usage "Failed to enable extensions" + @exit /b 1 +) + +::Change the code page to unicode +@chcp 65001 1>nul 2>nul +@if errorlevel 1 ( + @call :print_usage "Failed to change the code page to unicode" + @exit /b 1 +) + +:: Set up some global variables +@set "script_name=%~nx0" +@set "script_folder=%~dp0" +@set "script_folder=%script_folder:~0,-1%" +@set "dependency_path=%TEMP%\mingw-build-dependencies" + +:: Check the command line parameters +@set logging_level=1 +:options_loop +@if [%1] == [] goto :options_parsed +@set "arg=%~1" +@set one=%arg:~0,1% +@set two=%arg:~0,2% +@set three=%arg:~0,3% +@if /i [%arg%] == [/?] ( + @call :print_usage "Downloads a specific version of MinGW" + @exit /b 0 +) +@if /i [%arg%] == [/q] set quiet=true +@if /i [%two%] == [/v] @if /i not [%three%] == [/ve] @call :verbosity "!arg!" +@if /i [%arg%] == [/version] set "version=%~2" & shift +@if /i [%arg%] == [/arch] set "arch=%~2" & shift +@if /i [%arg%] == [/exceptions] set "exceptions=%~2" & shift +@if /i [%arg%] == [/threading] set "threading=%~2" & shift +@if /i [%arg%] == [/revision] set "revision=%~2" & shift +@if /i not [!one!] == [/] ( + if not defined output_path ( + set output_path=!arg! + ) else ( + @call :print_usage "Too many output locations: !output_path! !arg!" ^ + "There should only be one output location" + @exit /b 1 + ) +) +@shift +@goto :options_loop +:options_parsed +@if defined quiet set logging_level=0 +@if not defined output_path set "output_path=%script_folder%\mingw-builds" +@set "output_path=%output_path:/=\%" + +:: Set up the logging +@set "log_folder=%output_path%\logs" +@call :iso8601 timestamp +@set "log_path=%log_folder%\%timestamp%.log" +@set log_keep=10 + +:: Get default architecture +@if not defined arch @call :architecture arch + +:: Only keep a certain amount of logs +@set /a "log_keep=log_keep-1" +@if not exist %log_folder% @mkdir %log_folder% +@for /f "skip=%log_keep%" %%f in ('dir /b /o-D /tc %log_folder%') do @( + @call :log 4 "Removing old log file %log_folder%\%%f" + del %log_folder%\%%f +) + +:: Set up some more global variables +@call :windows_version win_ver win_ver_major win_ver_minor win_ver_rev +@call :script_source script_source +@if [%script_source%] == [explorer] ( + set /a "logging_level=logging_level+1" +) + +:: Execute the main function +@call :main "%arch%" "%version%" "%threading%" "%exceptions%" "%revision%" +@if errorlevel 1 ( + @call :log 0 "Failed to download MinGW" + @call :log 0 "View the log at %log_path%" + @exit /b 1 +) + +:: Stop the script if the user double clicked +@if [%script_source%] == [explorer] ( + pause +) + +@endlocal +@goto :eof + +:: -------------------------- Functions start here ---------------------------- + +:main - Main function that performs the download +:: %1 - Target architecture +:: %2 - Version of MinGW to get [optional] +:: %3 - Threading model [optional] +:: %4 - Exception model [optional] +:: %5 - Package revision [optional] +@setlocal +@call :log 6 +@call :log 2 "Welcome to the MinGW download script" +@call :log 6 "------------------------------------" +@call :log 6 +@call :log 2 "This script downloads a specific version of MinGW" +@set "arch=%~1" +@if "%arch%" == "" @exit /b 1 +@set "version=%~2" +@set "threading=%~3" +@set "exceptions=%~4" +@set "revision=%~5" +@call :log 3 "arch = %arch%" +@call :log 3 "version = %version%" +@call :log 3 "exceptions = %exceptions%" +@call :log 3 "threading = %threading%" +@call :log 3 "revision = %revision%" +@call :repository repo +@if errorlevel 1 ( + @call :log 0 "Failed to get the MinGW-builds repository information" + @exit /b 1 +) +@call :resolve slug url "%repo%" "%arch%" "%version%" "%threading%" "%exceptions%" "%revision%" +@if errorlevel 1 ( + @call :log 0 "Failed to resolve the correct URL of MinGW" + @exit /b 1 +) +@call :unpack compiler_path "%url%" "%output_path%\mingw\%slug%" +@if errorlevel 1 ( + @call :log 0 "Failed to unpack the MinGW archive" + @exit /b 1 +) +@rmdir /s /q "%dependency_path%" +@echo.%compiler_path% +@endlocal +@goto :eof + +:repository - Gets the MinGW-builds repository +:: %1 - The return variable for the repository file path +@verify other 2>nul +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + @call :log 0 "Failed to enable extensions" + @exit /b 1 +) +@set "var=%~1" +@if "%var%" == "" @exit /b 1 +@call :log 7 +@call :log 2 "Getting MinGW repository information" +@set "url=http://downloads.sourceforge.net/project/mingw-w64/Toolchains targetting Win32/Personal Builds/mingw-builds/installer/repository.txt" +@call :log 6 +@call :log 1 "Downloading MinGW repository" +@set "file_path=%dependency_path%\mingw-repository.txt" +@call :download "%url%" "%file_path%" +@if errorlevel 1 ( + @call :log 0 "Failed to download the MinGW repository information" + @exit /b 1 +) +@set "repository_path=%dependency_path%\repository.txt" +@del "%repository_path%" 2>nul +@for /f "delims=| tokens=1-6,*" %%a in (%file_path%) do @( + @set "version=%%~a" + @set "version=!version: =!" + @set "arch=%%~b" + @set "arch=!arch: =!" + @set "threading=%%~c" + @set "threading=!threading: =!" + @set "exceptions=%%~d" + @set "exceptions=!exceptions: =!" + @set "revision=%%~e" + @set "revision=!revision: =!" + @set "revision=!revision:rev=!" + @set "url=%%~f" + @set "url=!url:%%20= !" + @for /l %%a in (1,1,32) do @if "!url:~-1!" == " " set url=!url:~0,-1! + @echo !arch!^|!version!^|!threading!^|!exceptions!^|!revision!^|!url!>> "%repository_path%" +) +@del "%file_path%" 2>nul +@endlocal & set "%var%=%repository_path%" +@goto :eof + +:resolve - Gets the MinGW-builds repository +:: %1 - The return variable for the MinGW slug +:: %2 - The return variable for the MinGW URL +:: %3 - The repository information to use +:: %4 - Target architecture +:: %5 - Version of MinGW to get [optional] +:: %6 - Threading model [optional] +:: %7 - Exception model [optional] +:: %8 - Package revision [optional] +@setlocal +@set "slug_var=%~1" +@if "%slug_var%" == "" @exit /b 1 +@set "url_var=%~2" +@if "%url_var%" == "" @exit /b 1 +@set "repository=%~3" +@if "%repository%" == "" @exit /b 1 +@set "arch=%~4" +@if "%arch%" == "" @exit /b 1 +@call :resolve_version version "%repository%" "%arch%" "%~5" +@if errorlevel 1 @exit /b 1 +@call :resolve_threading threading "%repository%" "%arch%" "%version%" "%~6" +@if errorlevel 1 @exit /b 1 +@call :resolve_exceptions exceptions "%repository%" "%arch%" "%version%" "%threading%" "%~7" +@if errorlevel 1 @exit /b 1 +@call :resolve_revision revision "%repository%" "%arch%" "%version%" "%threading%" "%exceptions%" "%~8" +@if errorlevel 1 @exit /b 1 +@call :log 3 "Finding URL" +@for /f "delims=| tokens=1-6" %%a in (%repository%) do @( + @if "%arch%" == "%%a" ( + @if "%version%" == "%%b" ( + @if "%threading%" == "%%c" ( + @if "%exceptions%" == "%%d" ( + @if "%revision%" == "%%e" ( + @set "url=%%f" +) ) ) ) ) ) +@if "%url%" == "" ( + @call :log 0 "Failed to resolve URL" + @exit /b 1 +) +@set slug=gcc-%version%-%arch%-%threading%-%exceptions%-rev%revision% +@call :log 2 "Resolved slug: %slug%" +@call :log 2 "Resolved url: %url%" +@endlocal & set "%slug_var%=%slug%" & set "%url_var%=%url%" +@goto :eof + +:unpack - Unpacks the MinGW archive +:: %1 - The return variable name for the compiler path +:: %2 - The filepath or URL of the archive +:: %3 - The folder to unpack to +@verify other 2>nul +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + @call :log 0 "Failed to enable extensions" + @exit /b 1 +) +@set "var=%~1" +@if "%var%" == "" @exit /b 1 +@set "archive_path=%~2" +@if "%archive_path%" == "" @exit /b 1 +@set "folder_path=%~3" +@if "%folder_path%" == "" @exit /b 1 +@set "compiler_path=%folder_path%\bin" +@if exist "%compiler_path%" goto :unpack_done +@call :log 7 +@call :log 2 "Unpacking MinGW archive" +@set "http=%archive_path:~0,4%" +@if "%http%" == "http" ( + @set "url=%archive_path%" + @for /f %%a in ("!url: =-!") do @set "file_name=%%~na" + @for /f %%a in ("!url: =-!") do @set "file_ext=%%~xa" + @set "archive_path=%dependency_path%\!file_name!!file_ext!" + @if not exist "!archive_path!" ( + @call :log 6 + @call :log 1 "Downloading MinGW archive" + @call :download "!url!" "!archive_path!" + @if errorlevel 1 ( + @del "!archive_path!" 2>nul + @call :log 0 "Failed to download: !file_name!!file_ext!" + @exit /b 1 + ) + ) +) +@if not exist "%archive_path%" ( + @call :log 0 "The archive did not exist to unpack: %archive_path%" + @exit /b 1 +) +@for /f %%a in ("%archive_path: =-%") do @set "file_name=%%~na" +@for /f %%a in ("%archive_path: =-%") do @set "file_ext=%%~xa" +@call :log 6 +@call :log 1 "Unpacking MinGW %file_name%%file_ext%" +@call :find_sevenzip sevenzip_executable +@if errorlevel 1 ( + @call :log 0 "Need 7zip to unpack the MinGW archive" + @exit /b 1 +) +@call :iso8601 iso8601 +@for /f %%a in ("%folder_path%") do @set "tmp_path=%%~dpatmp-%iso8601%" +@"%sevenzip_executable%" x -y "-o%tmp_path%" "%archive_path%" > nul +@if errorlevel 1 ( + @rmdir /s /q "%folder_path%" + @call :log 0 "Failed to unpack the MinGW archive" + @exit /b 1 +) +@set "expected_path=%tmp_path%\mingw64" +@if not exist "%expected_path%" ( + @set "expected_path=%tmp_path%\mingw32" +) +@move /y "%expected_path%" "%folder_path%" > nul +@if errorlevel 1 ( + @rmdir /s /q "%tmp_path%" 2>nul + @call :log 0 "Failed to move MinGW folder" + @call :log 0 "%expected_path%" + @call :log 0 "%folder_path%" + @exit /b 1 +) +@rmdir /s /q %tmp_path% +@set "compiler_path=%folder_path%\bin" +:unpack_done +@if not exist "%compiler_path%\gcc.exe" ( + @call :log 0 "Failed to find gcc: %compiler_path%" + @exit /b 1 +) +@endlocal & set "%var%=%compiler_path%" +@goto :eof + +:find_sevenzip - Finds (or downloads) the 7zip executable +:: %1 - The return variable for the 7zip executable path +@setlocal +@set "var=%~1" +@if "%var%" == "" @exit /b 1 +@call :log 2 "Finding 7zip" +@call :find_in_path sevenzip_executable 7z.exe +@if not errorlevel 1 goto :find_sevenzip_done +@call :find_in_path sevenzip_executable 7za.exe +@if not errorlevel 1 goto :find_sevenzip_done +@set checksum=2FAC454A90AE96021F4FFC607D4C00F8 +@set "url=http://7-zip.org/a/7za920.zip" +@for /f %%a in ("%url: =-%") do @set "file_name=%%~na" +@for /f %%a in ("%url: =-%") do @set "file_ext=%%~xa" +@set "archive_path=%dependency_path%\%file_name%%file_ext%" +@if not exist "%archive_path%" ( + @call :log 6 + @call :log 1 "Downloading 7zip archive" + @call :download "%url%" "%archive_path%" %checksum% + @if errorlevel 1 ( + @del "%archive_path%" 2>nul + @call :log 0 "Failed to download: %file_name%%file_ext%" + @exit /b 1 + ) +) +@set "sevenzip_path=%dependency_path%\sevenzip" +@if not exist "%sevenzip_path%" ( + @call :unzip "%archive_path%" "%sevenzip_path%" + @if errorlevel 1 ( + @call :log 0 "Failed to unzip the7zip archive" + @exit /b 1 + ) +) +@set "sevenzip_executable=%sevenzip_path%\7za.exe" +@if not exist "%sevenzip_executable%" ( + @call :log 0 "Failed to find unpacked 7zip: %sevenzip_executable%" + @exit /b 1 +) +:find_sevenzip_done +@call :log 2 "Found 7zip: %sevenzip_executable%" +@endlocal & set "%var%=%sevenzip_executable%" +@goto :eof + +:unzip - Unzips a .zip archive +:: %1 - The archive to unzip +:: %2 - The location to unzip to +@setlocal +@set "archive_path=%~1" +@if "%archive_path%" == "" @exit /b 1 +@set "folder_path=%~2" +@if "%folder_path%" == "" @exit /b 1 +@for /f %%a in ("%archive_path: =-%") do @set "file_name=%%~na" +@for /f %%a in ("%archive_path: =-%") do @set "file_ext=%%~xa" +@call :log 2 "Unzipping: %file_name%%file_ext%" +@call :iso8601 iso8601 +@set "log_path=%temp%\unzip-%iso8601%-%file_name%.log" +@powershell ^ + Add-Type -assembly "system.io.compression.filesystem"; ^ + [io.compression.zipfile]::ExtractToDirectory(^ + '%archive_path%', '%folder_path%') 2>"%log_path%" +@if errorlevel 1 ( + @call :log 0 "Failed to unzip: %file_name%%file_ext%" + @call :log_append "%log_path%" + @exit /b 1 +) +@endlocal +@goto :eof + +:resolve_version - Gets the version of the MinGW compiler +:: %1 - The return variable for the version +:: %2 - The repository information to use +:: %3 - The architecture of the compiler +:: %4 - Version of MinGW to get [optional] +@verify other 2>nul +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + @call :log 0 "Failed to enable extensions" + @exit /b 1 +) +@set "var=%~1" +@if "%var%" == "" @exit /b 1 +@set "repository=%~2" +@if "%repository%" == "" @exit /b 1 +@set "arch=%~3" +@if "%arch%" == "" @exit /b 1 +@set "version=%~4" +@if not "%version%" == "" goto :resolve_version_done +:: Find the latest version +@call :log 3 "Finding latest version" +@set version=0.0.0 +@for /f "delims=| tokens=1-6" %%a in (%repository%) do @( + @if "%arch%" == "%%a" ( + @call :version_compare result "%version%" "%%b" + @if errorlevel 1 ( + @call :log 0 "Failed to compare versions: %version% %%a" + @exit /b 1 + ) + @if !result! lss 0 set version=%%b + ) +) +:resolve_version_done +@if "%version%" == "" ( + @call :log 0 "Failed to resolve latest version number" + @exit /b 1 +) +@call :log 2 "Resolved version: %version%" +@endlocal & set "%var%=%version%" +@goto :eof + +:resolve_threading - Gets the threading model of the MinGW compiler +:: %1 - The return variable for the threading model +:: %2 - The repository information to use +:: %3 - The architecture of the compiler +:: %4 - The version of the compiler +:: %5 - threading model of MinGW to use [optional] +@verify other 2>nul +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + @call :log 0 "Failed to enable extensions" + @exit /b 1 +) +@set "var=%~1" +@if "%var%" == "" @exit /b 1 +@set "repository=%~2" +@if "%repository%" == "" @exit /b 1 +@set "arch=%~3" +@if "%arch%" == "" @exit /b 1 +@set "version=%~4" +@if "%version%" == "" @exit /b 1 +@set "threading=%~5" +@if not "%threading%" == "" goto :resolve_threading_done +@call :log 3 "Finding best threading model" +@for /f "delims=| tokens=1-6" %%a in (%repository%) do @( + @if "%arch%" == "%%a" ( + @if "%version%" == "%%b" ( + @if not defined threading ( + @set "threading=%%c" + ) + @if "%%c" == "posix" ( + @set "threading=%%c" +) ) ) ) +:resolve_threading_done +@if "%threading%" == "" ( + @call :log 0 "Failed to resolve the best threading model" + @exit /b 1 +) +@call :log 2 "Resolved threading model: %threading%" +@endlocal & set "%var%=%threading%" +@goto :eof + +:resolve_exceptions - Gets the exception model of the MinGW compiler +:: %1 - The return variable for the exception model +:: %2 - The repository information to use +:: %3 - The architecture of the compiler +:: %4 - The version of the compiler +:: %4 - The threading model of the compiler +:: %5 - exception model of MinGW to use [optional] +@verify other 2>nul +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + @call :log 0 "Failed to enable extensions" + @exit /b 1 +) +@set "var=%~1" +@if "%var%" == "" @exit /b 1 +@set "repository=%~2" +@if "%repository%" == "" @exit /b 1 +@set "arch=%~3" +@if "%arch%" == "" @exit /b 1 +@set "version=%~4" +@if "%version%" == "" @exit /b 1 +@set "threading=%~5" +@if "%threading%" == "" @exit /b 1 +@set "exceptions=%~6" +@if not "%exceptions%" == "" goto :resolve_exceptions_done +@call :log 3 "Finding best exception model" +@for /f "delims=| tokens=1-6" %%a in (%repository%) do @( + @if "%arch%" == "%%a" ( + @if "%version%" == "%%b" ( + @if "%threading%" == "%%c" ( + @if not defined exceptions ( + @set "exceptions=%%d" + ) + @if "%%d" == "dwarf" ( + @set "exceptions=%%d" + ) + @if "%%d" == "seh" ( + @set "exceptions=%%d" +) ) ) ) ) +:resolve_exceptions_done +@if "%exceptions%" == "" ( + @call :log 0 "Failed to resolve the best exception model" + @exit /b 1 +) +@call :log 2 "Resolved exception model: %exceptions%" +@endlocal & set "%var%=%exceptions%" +@goto :eof + +:resolve_revision - Gets the revision of the MinGW compiler +:: %1 - The return variable for the revision +:: %2 - The repository information to use +:: %3 - The architecture of the compiler +:: %4 - The version of the compiler +:: %4 - The threading model of the compiler +:: %4 - The exception model of the compiler +:: %5 - revision of the MinGW package to use [optional] +@verify other 2>nul +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + @call :log 0 "Failed to enable extensions" + @exit /b 1 +) +@set "var=%~1" +@if "%var%" == "" @exit /b 1 +@set "repository=%~2" +@if "%repository%" == "" @exit /b 1 +@set "arch=%~3" +@if "%arch%" == "" @exit /b 1 +@set "version=%~4" +@if "%version%" == "" @exit /b 1 +@set "threading=%~5" +@if "%threading%" == "" @exit /b 1 +@set "exceptions=%~6" +@if "%exceptions%" == "" @exit /b 1 +@set "revision=%~7" +@if not "%revision%" == "" goto :resolve_revision_done +@call :log 3 "Finding latest revision" +@for /f "delims=| tokens=1-6" %%a in (%repository%) do @( + @if "%arch%" == "%%a" ( + @if "%version%" == "%%b" ( + @if "%threading%" == "%%c" ( + @if "%exceptions%" == "%%d" ( + @if "%%e" gtr "%revision%" ( + @set "revision=%%e" +) ) ) ) ) ) +:resolve_revision_done +@if "%revision%" == "" ( + @call :log 0 "Failed to resolve latest revision" + @exit /b 1 +) +@call :log 2 "Resolved revision: %revision%" +@endlocal & set "%var%=%revision%" +@goto :eof + +:version_compare - Compares two semantic version numbers +:: %1 - The return variable: +:: - < 0 : if %2 < %3 +:: - 0 : if %2 == %3 +:: - > 0 : if %2 > %3 +:: %2 - The first version to compare +:: %3 - The second version to compare +@setlocal +@set "var=%~1" +@if "%var%" == "" @exit /b 1 +@set "lhs=%~2" +@if "%lhs%" == "" @exit /b 1 +@set "rhs=%~3" +@if "%lhs%" == "" @exit /b 1 +@set result=0 +@for /f "delims=. tokens=1-6" %%a in ("%lhs%.%rhs%") do @( + @if %%a lss %%d ( + set result=-1 + goto :version_compare_done + ) else ( + @if %%a gtr %%d ( + set result=1 + goto :version_compare_done + ) else ( + @if %%b lss %%e ( + set result=-1 + goto :version_compare_done + ) else ( + @if %%b gtr %%e ( + set result=1 + goto :version_compare_done + ) else ( + @if %%c lss %%f ( + set result=-1 + goto :version_compare_done + ) else ( + @if %%c gtr %%f ( + set result=1 + goto :version_compare_done + ) + ) + ) + ) + ) + ) +) +:version_compare_done +@endlocal & set "%var%=%result%" +@goto :eof + +:print_usage - Prints the usage of the script +:: %* - message to print, each argument on it's own line +@setlocal +@for %%a in (%*) do @echo.%%~a +@echo. +@echo.build [/?][/v[v...]^|/q][/version][/arch a][/threading t] +@echo. [/exceptions e][/revision r] location +@echo. +@echo. /version v The version of MinGW to download +@echo. /arch a The target architecture [i686^|x86_64] +@echo. /threading t +@echo. Threading model to use [posix^|win32] +@echo. /exceptions e +@echo. Exception model to use [sjlj^|seh^|dwarf] +@echo. /revision e Revision of the release to use +@echo. /v Sets the output to be more verbose +@echo. /v[v...] Extra verbosity, /vv, /vvv, etc +@echo. /q Quiets the output +@echo. /? Shows this usage message +@echo. +@endlocal +@goto :eof + +:script_source - Determines if the script was ran from the cli or explorer +:: %1 - The return variable [cli|explorer] +@verify other 2>nul +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + @call :log 0 "Failed to enable extensions" + @exit /b 1 +) +@call :log 3 "Attempting to detect the script source" +@echo "The invocation command was: '%cmdcmdline%'" >> %log_path% +@for /f "tokens=1-3,*" %%a in ("%cmdcmdline%") do @( + set cmd=%%~a + set arg1=%%~b + set arg2=%%~c + set rest=%%~d +) +@set quote=" +@if "!arg2:~0,1!" equ "!quote!" ( + if "!arg2:~-1!" neq "!quote!" ( + set "arg2=!arg2:~1!" + ) +) +@call :log 4 "cmd = %cmd%" +@call :log 4 "arg1 = %arg1%" +@call :log 4 "arg2 = %arg2%" +@call :log 4 "rest = %rest%" +@call :log 4 "src = %~f0" +@if /i "%arg2%" == "call" ( + set script_source=cli +) else ( + @if /i "%arg1%" == "/c" ( + set script_source=explorer + ) else ( + set script_source=cli + ) +) +@call :log 3 "The script was invoked from %script_source%" +@endlocal & set "%~1=%script_source%" +@goto :eof + +:architecture - Finds the system architecture +:: %1 - The return variable [i686|x86_64] +@setlocal +@call :log 3 "Determining the processor architecture" +@set "key=HKLM\System\CurrentControlSet\Control\Session Manager\Environment" +@set "var=PROCESSOR_ARCHITECTURE" +@for /f "skip=2 tokens=2,*" %%a in ('reg query "%key%" /v "%var%"') do @set "arch=%%b" +@if "%arch%" == "AMD64" set arch=x86_64 +@if "%arch%" == "x64" set arch=i686 +@call :log 4 "arch = %arch%" +@endlocal & set "%~1=%arch%" +@goto :eof + +:md5 - Gets the MD5 checksum for a file +:: %1 - The hash +:: %2 - The file path +@setlocal +@set "var=%~1" +@set "file_path=%~2" +@if "%var%" == "" @exit /b 1 +@if "%file_path%" == "" @exit /b 1 +@if not exist "%file_path%" @exit /b 1 +@for /f "skip=3 tokens=1,*" %%a in ('powershell Get-FileHash -Algorithm MD5 "'%file_path%'"') do @set hash=%%b +@if not defined hash ( + @call :log 6 + @call :log 0 "Failed to get MD5 hash for %file_path%" + @exit /b 1 +) +@endlocal & set "%var%=%hash: =%" +@goto :eof + +:windows_version - Checks the windows version +:: %1 - The windows version +:: %2 - The major version number return variable +:: %3 - The minor version number return variable +:: %4 - The revision version number return variable +@setlocal +@call :log 3 "Retrieving the Windows version" +@for /f "tokens=2 delims=[]" %%x in ('ver') do @set win_ver=%%x +@set win_ver=%win_ver:Version =% +@set win_ver_major=%win_ver:~0,1% +@set win_ver_minor=%win_ver:~2,1% +@set win_ver_rev=%win_ver:~4% +@call :log 4 "win_ver = %win_ver%" +@endlocal & set "%~1=%win_ver%" ^ + & set "%~2=%win_ver_major%" ^ + & set "%~3=%win_ver_minor%" ^ + & set "%~4=%win_ver_rev%" +@goto :eof + +:find_in_path - Finds a program of file in the PATH +:: %1 - return variable of the file path +@setlocal +@set "var=%~1" +@if "%var%" == "" @exit /b 1 +@set "file=%~2" +@if "%file%" == "" @exit /b 1 +@call :log 3 "Searching PATH for %file%" +@for %%x in ("%file%") do @set "file_path=%%~f$PATH:x" +@if not defined file_path @exit /b 1 +@endlocal & set "%var%=%file_path%" +@goto :eof + +:log_append - Appends another file into the current logging file +:: %1 - the file_path to the file to concatenate +@setlocal +@set "file_path=%~1" +@if "%file_path%" == "" @exit /b 1 +@call :log 3 "Appending to log: %file_path%" +@call :iso8601 iso8601 +@set temp_log=%temp%\append-%iso8601%.log +@call :log 4 "Using temp file %temp_log%" +@type "%log_path%" "%file_path%" > "%temp_log%" 2>nul +@move /y "%temp_log%" "%log_path%" 1>nul +@del "%file_path% 2>nul +@del "%temp_log% 2>nul +@endlocal +@goto :eof + +:iso8601 - Returns the current time in ISO8601 format +:: %1 - the return variable +:: %2 - format [extended|basic*] +:: iso8601 - contains the resulting timestamp +@setlocal +@wmic Alias /? >NUL 2>&1 || @exit /b 1 +@set "var=%~1" +@if "%var%" == "" @exit /b 1 +@set "format=%~2" +@if "%format%" == "" set format=basic +@for /F "skip=1 tokens=1-6" %%g IN ('wmic Path Win32_UTCTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') do @( + @if "%%~l"=="" goto :iso8601_done + @set "yyyy=%%l" + @set "mm=00%%j" + @set "dd=00%%g" + @set "hour=00%%h" + @set "minute=00%%i" + @set "seconds=00%%k" +) +:iso8601_done +@set mm=%mm:~-2% +@set dd=%dd:~-2% +@set hour=%hour:~-2% +@set minute=%minute:~-2% +@set seconds=%seconds:~-2% +@if /i [%format%] == [extended] ( + set iso8601=%yyyy%-%mm%-%dd%T%hour%:%minute%:%seconds%Z +) else ( + if /i [%format%] == [basic] ( + set iso8601=%yyyy%%mm%%dd%T%hour%%minute%%seconds%Z + ) else ( + @exit /b 1 + ) +) +@set iso8601=%iso8601: =0% +@endlocal & set %var%=%iso8601% +@goto :eof + +:verbosity - Processes the verbosity parameter '/v[v...] +:: %1 - verbosity given on the command line +:: logging_level - set to the number of v's +@setlocal +@set logging_level=0 +@set verbosity=%~1 +:verbosity_loop +@set verbosity=%verbosity:~1% +@if not [%verbosity%] == [] @( + set /a "logging_level=logging_level+1" + goto verbosity_loop +) +@endlocal & set logging_level=%logging_level% +@goto :eof + +:log - Logs a message, depending on verbosity +:: %1 - level +:: [0-4] for CLI logging +:: [5-9] for GUI logging +:: %2 - message to print +@setlocal +@set "level=%~1" +@set "msg=%~2" +@if "%log_folder%" == "" ( + echo Logging was used to early in the script, log_folder isn't set yet + goto :eof +) +@if "%log_path%" == "" ( + echo Logging was used to early in the script, log_path isn't set yet + goto :eof +) +@if not exist "%log_folder%" mkdir "%log_folder%" +@if not exist "%log_path%" echo. 1>nul 2>"%log_path%" +@echo.%msg% >> "%log_path%" +@if %level% geq 5 ( + @if [%script_source%] == [explorer] ( + set /a "level=level-5" + ) else ( + @goto :eof + ) +) +@if "%logging_level%" == "" ( + echo Logging was used to early in the script, logging_level isn't set yet + goto :eof +) +@if %logging_level% geq %level% echo.%msg% 1>&2 +@endlocal +@goto :eof + +:download - Downloads a file from the internet +:: %1 - the url of the file to download +:: %2 - the file to download to +:: %3 - the MD5 checksum of the file (optional) +@setlocal EnableDelayedExpansion +@if errorlevel 1 ( + @call :print_usage "Failed to enable extensions" + @exit /b 1 +) +@set "url=%~1" +@set "file_path=%~2" +@set "checksum=%~3" +@for %%a in (%file_path%) do @set dir_path=%%~dpa +@for %%a in (%file_path%) do @set file_name=%%~nxa +@if "%url%" == "" @exit /b 1 +@if "%file_path%" == "" @exit /b 1 +@if "%dir_path%" == "" @exit /b 1 +@if "%file_name%" == "" @exit /b 1 +@if not exist "%dir_path%" mkdir "%dir_path%" +@call :log 2 "Downloading %url%" +@call :iso8601 iso8601 +@set "temp_path=%temp%\download-%iso8601%-%file_name%" +@set "log_path=%temp%\download-%iso8601%-log-%file_name%" +@call :log 4 "Using temp file %temp_path%" +@powershell Invoke-WebRequest "'%url%'" ^ + -OutFile "'%temp_path%'" ^ + -UserAgent [Microsoft.PowerShell.Commands.PSUserAgent]::IE ^ + 1>nul 2>"%log_path%" +@if errorlevel 1 ( + @call :log 0 "Failed to download %url%" + @call :log_append "%log_path%" + @exit /b 1 +) +@if [%checksum%] neq [] ( + @call :log 4 "Checking %checksum% against %temp_path%" + @call :md5 hash "%temp_path%" + if "!hash!" neq "%checksum%" ( + @call :log 0 "Failed to match checksum: %temp_path%" + @call :log 0 "Hash : !hash!" + @call :log 0 "Checksum: %checksum%" + @exit /b 1 + ) else ( + @call :log 3 "Checksum matched: %temp_path%" + @call :log 3 "Hash : !hash!" + @call :log 3 "Checksum: %checksum%" + ) +) +@call :log 4 "Renaming %temp_path% to %file_path%" +@move /y "%temp_path%" "%file_path%" 1>nul +@endlocal +@goto :eof diff --git a/3P/civetweb/resources/Info.plist b/3P/civetweb/resources/Info.plist new file mode 100644 index 00000000..f02e19a6 --- /dev/null +++ b/3P/civetweb/resources/Info.plist @@ -0,0 +1,21 @@ + + + + + CFBundleExecutable Civetweb + CFBundlePackageType APPL + CFBundleTypeRole None + CFBundleIconFile civetweb + CFBundleIconFiles + civetweb_16x16.png + civetweb_22x22.png + civetweb_32x32.png + civetweb_64x64.png + + LSUIElement + RunAtLoad + Label com.nofacepress.civetweb + ProgramArguments + KeepAlive + + diff --git a/3P/civetweb/resources/Makefile.in-duktape b/3P/civetweb/resources/Makefile.in-duktape new file mode 100644 index 00000000..d7ad5cd1 --- /dev/null +++ b/3P/civetweb/resources/Makefile.in-duktape @@ -0,0 +1,60 @@ +# +# Copyright (c) 2015 the Civetweb developers +# +# License http://opensource.org/licenses/mit-license.php MIT License +# + +ifndef WITH_DUKTAPE + $(error WITH_DUKTAPE is not defined) +endif + +# Duktape default version is 1.3.0 (103) +WITH_DUKTAPE_VERSION ?= 103 +DUKTAPE_VERSION_KNOWN = 0 + +# Select src and header according to the Duktape version +ifeq ($(WITH_DUKTAPE_VERSION), 103) + $(info Duktape: Using version 1.3.0) + DUKTAPE_DIR = src/third_party/duktape-1.3.0/src + DUKTAPE_SHARED_LIB_FLAG = -lduktape1.3 + DUKTAPE_CFLAGS = -DDUKTAPE_VERSION_MAKEFILE=501 + DUKTAPE_VERSION_KNOWN = 1 +endif + +ifneq ($(DUKTAPE_VERSION_KNOWN), 1) + $(error Duktape: Unknwon version - $(WITH_DUKTAPE_VERSION)) +endif + + +# Add flags for all Duktape versions +DUKTAPE_CFLAGS += -I$(DUKTAPE_DIR) -DUSE_DUKTAPE + +ifneq ($(TARGET_OS),WIN32) +# DUKTAPE_CFLAGS += +endif + +ifdef WITH_DUKTAPE_SHARED + + DUKTAPE_SOURCE_FILES = + + $(info Duktape: using dynamic linking) + +else + + DUKTAPE_SOURCE_FILES = duktape.c + +ifeq ($(WITH_DUKTAPE_VERSION), 104) +# DUKTAPE_SOURCE_FILES += +endif + + $(info Duktape: using static library) + +endif + +DUKTAPE_SOURCES = $(addprefix $(DUKTAPE_DIR)/, $(DUKTAPE_SOURCE_FILES)) +DUKTAPE_OBJECTS = $(DUKTAPE_SOURCES:.c=.o) + +OBJECTS += $(DUKTAPE_OBJECTS) +CFLAGS += $(DUKTAPE_CFLAGS) +SOURCE_DIRS = $(DUKTAPE_DIR) + diff --git a/3P/civetweb/resources/Makefile.in-lua b/3P/civetweb/resources/Makefile.in-lua new file mode 100644 index 00000000..52474781 --- /dev/null +++ b/3P/civetweb/resources/Makefile.in-lua @@ -0,0 +1,148 @@ +# +# Copyright (c) 2013 No Face Press, LLC +# Copyright (c) 2014-2015 the Civetweb developers +# +# License http://opensource.org/licenses/mit-license.php MIT License +# + +ifndef WITH_LUA + $(error WITH_LUA is not defined) +endif + +# Lua Default version is 502 +WITH_LUA_VERSION ?= 502 +LUA_VERSION_KNOWN = 0 + +# Select src and header according to the Lua version +ifeq ($(WITH_LUA_VERSION), 501) + $(info Lua: Using version 5.1.5) + LUA_DIR = src/third_party/lua-5.1.5/src + LUA_SHARED_LIB_FLAG = -llua5.1 + LUA_CFLAGS = -DLUA_VERSION_MAKEFILE=501 + LUA_VERSION_KNOWN = 1 +endif +ifeq ($(WITH_LUA_VERSION), 502) + $(info Lua: Using version 5.2.4) + LUA_DIR = src/third_party/lua-5.2.4/src + LUA_SHARED_LIB_FLAG = -llua5.2 + LUA_CFLAGS = -DLUA_VERSION_MAKEFILE=502 + LUA_VERSION_KNOWN = 1 +endif +ifeq ($(WITH_LUA_VERSION), 503) + $(info Lua: Using version 5.3.1) + LUA_DIR = src/third_party/lua-5.3.1/src + LUA_SHARED_LIB_FLAG = -llua5.3 + LUA_CFLAGS = -DLUA_COMPAT_5_2 -DLUA_VERSION_MAKEFILE=503 + LUA_VERSION_KNOWN = 1 +endif + +ifneq ($(LUA_VERSION_KNOWN), 1) + $(error Lua: Unknwon version - $(WITH_LUA_VERSION)) +endif + + +# Add flags for all Lua versions +LUA_CFLAGS += -I$(LUA_DIR) -DLUA_COMPAT_ALL -DUSE_LUA + +ifneq ($(TARGET_OS),WIN32) + LUA_CFLAGS += -DLUA_USE_POSIX -DLUA_USE_DLOPEN +endif + +ifdef WITH_LUA_SHARED + + LUA_SOURCE_FILES = + + $(info Lua: using dynamic linking) + +else + + LUA_SOURCE_FILES = lapi.c \ + lauxlib.c \ + lbaselib.c \ + lcode.c \ + ldblib.c \ + ldebug.c \ + ldo.c \ + ldump.c \ + lfunc.c \ + lgc.c \ + linit.c \ + liolib.c \ + llex.c \ + lmathlib.c \ + lmem.c \ + loadlib.c \ + lobject.c \ + lopcodes.c \ + loslib.c \ + lparser.c \ + lstate.c \ + lstring.c \ + lstrlib.c \ + ltable.c \ + ltablib.c \ + ltm.c \ + lundump.c \ + lvm.c \ + lzio.c + +ifeq ($(WITH_LUA_VERSION), 502) + LUA_SOURCE_FILES += lbitlib.c \ + lcorolib.c \ + lctype.c +endif +ifeq ($(WITH_LUA_VERSION), 503) + LUA_SOURCE_FILES += lbitlib.c \ + lcorolib.c \ + lctype.c \ + lutf8lib.c +endif + + $(info Lua: using static library) + +endif + +LUA_SOURCES = $(addprefix $(LUA_DIR)/, $(LUA_SOURCE_FILES)) +LUA_OBJECTS = $(LUA_SOURCES:.c=.o) + +OBJECTS += $(LUA_OBJECTS) +CFLAGS += $(LUA_CFLAGS) +SOURCE_DIRS = $(LUA_DIR) + + +ifneq ($(WITH_LUA_VERSION), 501) + SQLITE_DIR = src/third_party + SQLITE_SOURCE_FILES = sqlite3.c lsqlite3.c + SQLITE_SOURCES = $(addprefix $(SQLITE_DIR)/, $(SQLITE_SOURCE_FILES)) + SQLITE_OBJECTS = $(SQLITE_SOURCES:.c=.o) + SQLITE_CFLAGS = -I$(SQLITE_DIR) -DTHREADSAFE=1 -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS + OBJECTS += $(SQLITE_OBJECTS) + CFLAGS += $(SQLITE_CFLAGS) + CFLAGS += -DUSE_LUA_SQLITE3 + #SOURCE_DIRS = $(SQLITE_DIR) +endif + + +LFS_DIR = src/third_party +LFS_SOURCE_FILES = lfs.c +LFS_SOURCES = $(addprefix $(LFS_DIR)/, $(LFS_SOURCE_FILES)) +LFS_OBJECTS = $(LFS_SOURCES:.c=.o) +LFS_CFLAGS = -I$(LFS_DIR) +OBJECTS += $(LFS_OBJECTS) +CFLAGS += $(LFS_CFLAGS) +CFLAGS += -DUSE_LUA_FILE_SYSTEM +#SOURCE_DIRS = $(LFS_DIR) + + +ifneq ($(WITH_LUA_VERSION), 501) + LXML_DIR = src/third_party + LXML_SOURCE_FILES = LuaXML_lib.c + LXML_SOURCES = $(addprefix $(LXML_DIR)/, $(LXML_SOURCE_FILES)) + LXML_OBJECTS = $(LXML_SOURCES:.c=.o) + LXML_CFLAGS = -I$(LXML_DIR) + OBJECTS += $(LXML_OBJECTS) + CFLAGS += $(LXML_CFLAGS) + CFLAGS += -DUSE_LUA_LUAXML + #SOURCE_DIRS = $(LXML_DIR) +endif + diff --git a/3P/civetweb/resources/Makefile.in-os b/3P/civetweb/resources/Makefile.in-os new file mode 100644 index 00000000..9ad11327 --- /dev/null +++ b/3P/civetweb/resources/Makefile.in-os @@ -0,0 +1,22 @@ +# +# Copyright (c) 2013 No Face Press, LLC +# License http://opensource.org/licenses/mit-license.php MIT License +# + +# Override this using TARGET_OS=LINUX on the command line +ifeq ($(TARGET_OS),) + ifeq ($(OS),Windows_NT) + TARGET_OS = WIN32 + else + UNAME_S := $(shell uname -s) + ifeq ($(UNAME_S),Linux) + TARGET_OS = LINUX + else + ifeq ($(UNAME_S),Darwin) + TARGET_OS = OSX + else + TARGET_OS = BSD + endif + endif + endif +endif diff --git a/3P/civetweb/resources/cert/client.crt b/3P/civetweb/resources/cert/client.crt new file mode 100644 index 00000000..d6cd7ef8 --- /dev/null +++ b/3P/civetweb/resources/cert/client.crt @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICOTCCAaICCQCXNPrLNIw8IDANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJ4 +eDELMAkGA1UECAwCeHgxCzAJBgNVBAcMAnh4MQswCQYDVQQKDAJ4eDELMAkGA1UE +CwwCeHgxCzAJBgNVBAMMAnh4MREwDwYJKoZIhvcNAQkBFgJ4eDAeFw0xNTEwMjUy +MzMxNDJaFw0yNTEwMjIyMzMxNDJaMGExCzAJBgNVBAYTAnh4MQswCQYDVQQIDAJ4 +eDELMAkGA1UEBwwCeHgxCzAJBgNVBAoMAnh4MQswCQYDVQQLDAJ4eDELMAkGA1UE +AwwCeHgxETAPBgkqhkiG9w0BCQEWAnh4MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQDGwWIIU2KUEufa0Ga5lnm7I8cX4LPRIFX4zL3g1Kuw27eRaJWJLz3Y97oi +m0fUmhhKJoEFDxj9U4UbXZWMxzH5F8RfupUu+9yDqTWjTRaUQiM/C7dSPEevfqNP +zBoERPrMzm9W5d8Ke04vpUzk0duoE6vyNQVECroNlHY7R4zQjwIDAQABMA0GCSqG +SIb3DQEBCwUAA4GBAKZiZ2+sYJWFnQcfqcDJBwrbTo98SSxfryPmeVQSuM8AXC4I +baX+fqkatdFidDBl96Aq8pDfqeAz+gqRoJ+Dx7opn5/b0WcB0lD+v25x+nO8g4z7 +HBzpVtvRTkC7dGase72csnqvyWm1xTSiHNRIghl0kZy8wb6V9GmJsHxBoKWN +-----END CERTIFICATE----- diff --git a/3P/civetweb/resources/cert/client.csr b/3P/civetweb/resources/cert/client.csr new file mode 100644 index 00000000..8c5dbdce --- /dev/null +++ b/3P/civetweb/resources/cert/client.csr @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBoTCCAQoCAQAwYTELMAkGA1UEBhMCeHgxCzAJBgNVBAgMAnh4MQswCQYDVQQH +DAJ4eDELMAkGA1UECgwCeHgxCzAJBgNVBAsMAnh4MQswCQYDVQQDDAJ4eDERMA8G +CSqGSIb3DQEJARYCeHgwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMbBYghT +YpQS59rQZrmWebsjxxfgs9EgVfjMveDUq7Dbt5FolYkvPdj3uiKbR9SaGEomgQUP +GP1ThRtdlYzHMfkXxF+6lS773IOpNaNNFpRCIz8Lt1I8R69+o0/MGgRE+szOb1bl +3wp7Ti+lTOTR26gTq/I1BUQKug2UdjtHjNCPAgMBAAGgADANBgkqhkiG9w0BAQsF +AAOBgQCVJKEisDii5qFbV75rOGF+tTChv3c051pWerl8U42s/MQ3jhzNb8+i7f2n +Kn4yZU3u91xtAruAoKFPSnFpgQKyBRv57g5eM03nrUUImZcRT5Kkf4YsqRMsZ2yH +MYk6QbTrJwibUoqEUUFgv0n5ONUBoEvhzZr0K9KZ3DLyIg1rpQ== +-----END CERTIFICATE REQUEST----- diff --git a/3P/civetweb/resources/cert/client.key b/3P/civetweb/resources/cert/client.key new file mode 100644 index 00000000..ea9e739b --- /dev/null +++ b/3P/civetweb/resources/cert/client.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQDGwWIIU2KUEufa0Ga5lnm7I8cX4LPRIFX4zL3g1Kuw27eRaJWJ +Lz3Y97oim0fUmhhKJoEFDxj9U4UbXZWMxzH5F8RfupUu+9yDqTWjTRaUQiM/C7dS +PEevfqNPzBoERPrMzm9W5d8Ke04vpUzk0duoE6vyNQVECroNlHY7R4zQjwIDAQAB +AoGAUPrNxHKlAYvKZ77te8QxiOwE3FezLAuuu5Y/7vD3mzGKU3Z3JtPWsSYN8ret +xpOaPev+OV9zYRO8ce/pVNh8JTcvywU9SaaxzrMVIq+8rOfM8oCXwpKr7FqV6fO3 +a9JzofV6A2x3mzWqyixRVSGBWTC3Oc5+uaTX5pmJvMFgKLECQQDxFopXbhgPUVtQ +Wa5onj3qDtYsuJALBDaHDV7nSoQySZpHn1DS/w1n+INOuwkXXfMzqdRDKGDh5VVe +5rF1k1nVAkEA0wyI7aXYIJuYli5fCN6bwGQTwmwoWbyDDE+VkZlMUm8KhIzdnFjP +j9+ntNshNYyKf6H9XqxuizNyiLyiWl+u0wJAXLWgSXLKycktZj62dQC1Kna+IcBv +k+zw0wpvPl5Ha9cl/vji6eCu1RaZ2ALQwi2cwndCavjyGKxKIg5wm5goaQJAc4dC +EW0ecUMbdOJvbWiGM/vUgTI5qF20EvIhuvECwYE9ba+6xBItlOFmaW8mr6x+SD3B +d6jGXnbMNKOl7/i+twJBANIFBVZBal85Wn0V5MJFDWLB1vPSxXwb4OBwVD+j52H7 +YwpRbUn3/4CkiagDPdzio80WkWdkqpGZoVyDUpZi5Fg= +-----END RSA PRIVATE KEY----- diff --git a/3P/civetweb/resources/cert/client.key.orig b/3P/civetweb/resources/cert/client.key.orig new file mode 100644 index 00000000..31489cdc --- /dev/null +++ b/3P/civetweb/resources/cert/client.key.orig @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,74B669EA97409DB5 + +U8mySuY/I28r8dygZbyHF9K5VFPekhar4zgN2p6wUyrIT9UvA0Y75VE6Pu55+FZS +JEiR+5btbONt2Lf7z52zi8bv8cb+IJryjSoGkk9Klesmwc9qkUxtuZosdIoZKGFl +SgSNecK7QYOu66PK4GOi47CFsKuKT4pR8A8Kt11PYTpXDNGomcsdS3DNEbpxvj7F +/D/1V24IMu+cknL3r6wwL0stB3idwS+4Oq/JLosKHC5mB6+Pu285K6/NWUo5FqLy +WgzCWzFzzQy3vBce30HOf2gCUJ++2JKoBa8wdj06ei0OTz6oFWAvftv1fTen6cyW +LG5uAmNPpv4PmtTpOtNJtd8VFpShxiCbYm772MXiDRNiLL9iMsS9OtgTkxHyqRqr +i8RRKzZCFzf4+xTGxO6GkkFV0/W/PM+TnvFWoWOviCjJJOFGwrQAUzRFce3UAU8V +sSmvnE0mGvREQAUiw15onGaHKT/ivzFFutgghrcrjpGH55j/zp5gxD+WDeDqAgNA +RPk0l63D9CrjyTuyTX1H35V1+EZ9YYP5tZ3wGn6i3WCC3WjHqDg5EZHRprjvPw7p +rfurs33qHUon42aM1G/dJ+jtn4993RdCvCztxW6aBp+nLEEROMA/0HCZJeM9lE7L +nWAy+jkn/6wRoATa01fEPHozju0HQhCrPcxjrJ8tIVgI1iEL2xw7STlvo6BZcnP2 +oGLMiEk5gmHCOonh+taLkFhKP+F0cSZJlJcmEr6YYzhh7FoR+sKEb2Cx2n2ySuhv +LYh1Wn4T0Xmau7OFX2Pc+d5zBaW6lYn/ZUw8GbaDqNd3sT/UICC0Ww== +-----END RSA PRIVATE KEY----- diff --git a/3P/civetweb/resources/cert/client.pem b/3P/civetweb/resources/cert/client.pem new file mode 100644 index 00000000..331fd708 --- /dev/null +++ b/3P/civetweb/resources/cert/client.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIICOTCCAaICCQCXNPrLNIw8IDANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJ4 +eDELMAkGA1UECAwCeHgxCzAJBgNVBAcMAnh4MQswCQYDVQQKDAJ4eDELMAkGA1UE +CwwCeHgxCzAJBgNVBAMMAnh4MREwDwYJKoZIhvcNAQkBFgJ4eDAeFw0xNTEwMjUy +MzMxNDJaFw0yNTEwMjIyMzMxNDJaMGExCzAJBgNVBAYTAnh4MQswCQYDVQQIDAJ4 +eDELMAkGA1UEBwwCeHgxCzAJBgNVBAoMAnh4MQswCQYDVQQLDAJ4eDELMAkGA1UE +AwwCeHgxETAPBgkqhkiG9w0BCQEWAnh4MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQDGwWIIU2KUEufa0Ga5lnm7I8cX4LPRIFX4zL3g1Kuw27eRaJWJLz3Y97oi +m0fUmhhKJoEFDxj9U4UbXZWMxzH5F8RfupUu+9yDqTWjTRaUQiM/C7dSPEevfqNP +zBoERPrMzm9W5d8Ke04vpUzk0duoE6vyNQVECroNlHY7R4zQjwIDAQABMA0GCSqG +SIb3DQEBCwUAA4GBAKZiZ2+sYJWFnQcfqcDJBwrbTo98SSxfryPmeVQSuM8AXC4I +baX+fqkatdFidDBl96Aq8pDfqeAz+gqRoJ+Dx7opn5/b0WcB0lD+v25x+nO8g4z7 +HBzpVtvRTkC7dGase72csnqvyWm1xTSiHNRIghl0kZy8wb6V9GmJsHxBoKWN +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXAIBAAKBgQDGwWIIU2KUEufa0Ga5lnm7I8cX4LPRIFX4zL3g1Kuw27eRaJWJ +Lz3Y97oim0fUmhhKJoEFDxj9U4UbXZWMxzH5F8RfupUu+9yDqTWjTRaUQiM/C7dS +PEevfqNPzBoERPrMzm9W5d8Ke04vpUzk0duoE6vyNQVECroNlHY7R4zQjwIDAQAB +AoGAUPrNxHKlAYvKZ77te8QxiOwE3FezLAuuu5Y/7vD3mzGKU3Z3JtPWsSYN8ret +xpOaPev+OV9zYRO8ce/pVNh8JTcvywU9SaaxzrMVIq+8rOfM8oCXwpKr7FqV6fO3 +a9JzofV6A2x3mzWqyixRVSGBWTC3Oc5+uaTX5pmJvMFgKLECQQDxFopXbhgPUVtQ +Wa5onj3qDtYsuJALBDaHDV7nSoQySZpHn1DS/w1n+INOuwkXXfMzqdRDKGDh5VVe +5rF1k1nVAkEA0wyI7aXYIJuYli5fCN6bwGQTwmwoWbyDDE+VkZlMUm8KhIzdnFjP +j9+ntNshNYyKf6H9XqxuizNyiLyiWl+u0wJAXLWgSXLKycktZj62dQC1Kna+IcBv +k+zw0wpvPl5Ha9cl/vji6eCu1RaZ2ALQwi2cwndCavjyGKxKIg5wm5goaQJAc4dC +EW0ecUMbdOJvbWiGM/vUgTI5qF20EvIhuvECwYE9ba+6xBItlOFmaW8mr6x+SD3B +d6jGXnbMNKOl7/i+twJBANIFBVZBal85Wn0V5MJFDWLB1vPSxXwb4OBwVD+j52H7 +YwpRbUn3/4CkiagDPdzio80WkWdkqpGZoVyDUpZi5Fg= +-----END RSA PRIVATE KEY----- diff --git a/3P/civetweb/resources/cert/make_certs b/3P/civetweb/resources/cert/make_certs new file mode 100644 index 00000000..1dcf32b0 --- /dev/null +++ b/3P/civetweb/resources/cert/make_certs @@ -0,0 +1,31 @@ +#using "pass" for every password + +openssl genrsa -des3 -out client.key 1024 +openssl req -new -key client.key -out client.csr + +cp client.key client.key.orig + +openssl rsa -in client.key.orig -out client.key + +openssl x509 -req -days 3650 -in client.csr -signkey client.key -out client.crt + +cp client.crt client.pem +cat client.key >> client.pem + +openssl pkcs12 -export -inkey client.key -in client.pem -name ClientName -out client.pfx + + + +openssl genrsa -des3 -out server.key 1024 +openssl req -new -key server.key -out server.csr + +cp server.key server.key.orig + +openssl rsa -in server.key.orig -out server.key + +openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt + +cp server.crt server.pem +cat server.key >> server.pem + +openssl pkcs12 -export -inkey server.key -in server.pem -name ServerName -out server.pfx diff --git a/3P/civetweb/resources/cert/server.crt b/3P/civetweb/resources/cert/server.crt new file mode 100644 index 00000000..e74e1830 --- /dev/null +++ b/3P/civetweb/resources/cert/server.crt @@ -0,0 +1,14 @@ +-----BEGIN CERTIFICATE----- +MIICOTCCAaICCQCWJSBNug1UmTANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJ4 +eDELMAkGA1UECAwCeHgxCzAJBgNVBAcMAnh4MQswCQYDVQQKDAJ4eDELMAkGA1UE +CwwCeHgxCzAJBgNVBAMMAnh4MREwDwYJKoZIhvcNAQkBFgJ4eDAeFw0xNTEwMjUy +MzMyMTVaFw0yNTEwMjIyMzMyMTVaMGExCzAJBgNVBAYTAnh4MQswCQYDVQQIDAJ4 +eDELMAkGA1UEBwwCeHgxCzAJBgNVBAoMAnh4MQswCQYDVQQLDAJ4eDELMAkGA1UE +AwwCeHgxETAPBgkqhkiG9w0BCQEWAnh4MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQC+v2d4ye8BgDGncvuCNnJoyt0lcdEiwriGkW7+6eU8CTwgdJGmVZreI9Xo +lDufzcPGtcu5El1XdwlzcaNB+iQuJfXqodvkbw43A80sWtDZuaLVbS9xAr+2mEqC +g4/JYKRDy80y3RZ60S2qvB5jhKb1gjobLe69VXU+aifZtI6LGwIDAQABMA0GCSqG +SIb3DQEBCwUAA4GBAHGVbKEyEIHUYZGGTzmKdQjdeomycKqh0/lgN4LUOFZLpUIb +Ic26ZAWL3x571i05qz90AFUXEx30o0aVRYjvtSDyIlID4Niz9Cy8s8vNIDSocEAG +bzBQ9xgFYjMEcgm2ROkzE6xdyxNOHkPA4jXjqgQknyvtkHcPE7mpv7faZXFz +-----END CERTIFICATE----- diff --git a/3P/civetweb/resources/cert/server.csr b/3P/civetweb/resources/cert/server.csr new file mode 100644 index 00000000..7b74b867 --- /dev/null +++ b/3P/civetweb/resources/cert/server.csr @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIBoTCCAQoCAQAwYTELMAkGA1UEBhMCeHgxCzAJBgNVBAgMAnh4MQswCQYDVQQH +DAJ4eDELMAkGA1UECgwCeHgxCzAJBgNVBAsMAnh4MQswCQYDVQQDDAJ4eDERMA8G +CSqGSIb3DQEJARYCeHgwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAL6/Z3jJ +7wGAMady+4I2cmjK3SVx0SLCuIaRbv7p5TwJPCB0kaZVmt4j1eiUO5/Nw8a1y7kS +XVd3CXNxo0H6JC4l9eqh2+RvDjcDzSxa0Nm5otVtL3ECv7aYSoKDj8lgpEPLzTLd +FnrRLaq8HmOEpvWCOhst7r1VdT5qJ9m0josbAgMBAAGgADANBgkqhkiG9w0BAQsF +AAOBgQC3a+xFpygFx3Guq9XRZSbkNX2BlktaKD45qU51E0Ayt75T8iXnpeJV2Y1z +2zjJBPWePdsa6vvHl/gx5oCyHfr8Vzs7AIojtcbKltWesdoJMuhbhPC7434vnYYm +fFXzVcrfuCx6V9YGlbgtGYmItUxyvkmML00XRO7+MJy64aQiCg== +-----END CERTIFICATE REQUEST----- diff --git a/3P/civetweb/resources/cert/server.key b/3P/civetweb/resources/cert/server.key new file mode 100644 index 00000000..596659fb --- /dev/null +++ b/3P/civetweb/resources/cert/server.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXgIBAAKBgQC+v2d4ye8BgDGncvuCNnJoyt0lcdEiwriGkW7+6eU8CTwgdJGm +VZreI9XolDufzcPGtcu5El1XdwlzcaNB+iQuJfXqodvkbw43A80sWtDZuaLVbS9x +Ar+2mEqCg4/JYKRDy80y3RZ60S2qvB5jhKb1gjobLe69VXU+aifZtI6LGwIDAQAB +AoGBAJkeyzASYhNBVhrGWZGopWTr3GSPnkOaLkiP/JsTJVpxS1v+V2E//Obvu2pN +fCOHKO6dxyEU1es9ek+63EQ9ScaCaaZtqyi8NcttRTXYFcXwl7OZx6DnKSIa7mZA +Z1HFzpZAlCqbh3gf1gGeMlJWEK+qxiDkBXq+pGWeOS2BzPDhAkEA6yHbw/YUmFCa +ng1+EPBCkUTCJudiexnPQF+xlhgW68i11V4W5pLpXYt1PfN1qzw57+VgS+lowGIr +Y4BuRWGciwJBAM+tI88SnygdGZUFCp3FQK4/+QUH7tkJvqmhiW0gaIo8yxRzbK7e +wqV3csy4ov9LYH7kVvFE82VvUIpA4f3izbECQH4EY3gfBuKrMHLM4GfLnKGmrDeV +gx5essjZgJ/kwUQVCf8UsklZK2FLQMa3GLVxTcvYr0eADPgupPpq9q6QpgkCQQCt +ksFGFgNN7JxwD4mi+bUorjE8Qjgf0GQ5tNh+i8K0H0GAs0QYF/jJgT9C2eLpyx84 +jzIXbxCbK+E93CLGJuTRAkEA4LdI5JSUMX4IxVHSsfsHYT4kP3XmONlDW/TzWfK2 +jyDiFOS7lfIe08zeSxdxdpF4y9Y1eGKOjls5y5u7KtV2ug== +-----END RSA PRIVATE KEY----- diff --git a/3P/civetweb/resources/cert/server.key.orig b/3P/civetweb/resources/cert/server.key.orig new file mode 100644 index 00000000..7260533e --- /dev/null +++ b/3P/civetweb/resources/cert/server.key.orig @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,6BB8D380C900AA8B + ++p0gAY1fa9vtz8lmaTgJClsSVhD9Aw/SL0raL8w90e3yYFnT948s5xLPxoz+c3V1 +CkdWcatZO72G1VVOlg1NyjYmujBntkvMF4DiAGAg9l/u19wrvYNINurb86uPsZ2P +9S6SlEzIkuRDdnJXXwT/bpgEYoTVIpOQYMjzIcdYbseaYhy7n9uZCXQLgXChjiuf +LNbArHcB5tJC8QK9DCv4iEV6U8udSd85gs2xs4dBs4dz2jpgD3GLpSMd6+LNSNOV +AqWZM6Xa0PtM9Mlz2JkX+misfY5wR2lqs2z6f6JFIZsLjr3buqUJVNXRTcSLZ7A2 +e/RgE8wC3VVX9ij+7yh3dBKNorJF1nLcSkfTt22OXyppbwIwHKI1RYPc6a6GNZEW +ecZlnuHueUc62e8L8lm6dPtJ5Z4SR6hBBqPOBxNxgEGvt7Gc3jPO7SkqmXatVJ2k +S3HI2umA0f3grolkeJGXlaabRb0z+C13nvBSEDog2Sg2uFu3gwEOXsCfI+EaOghp +earIkirAlasVtFGKwUn0eMVLBrsxvr1yz6y7PnY63kTVkh2JPoOQ/hCO+9bfdIvS +7Sa+pbL29OXSNnt/WDsErKcMTPPAstuz0an1Q7dA7G+3FW7UsLWbYh5sMklHiG8L +u5NC4M4/+oqq0Bv/rYROOSmIc7XRbZ38hep2ML9WHC/zdMssSph4lY/TnMNGqSQ/ +wyRmuT0VmLBQFlFvO41YD97yJD5uEsu+dMH0fsfIJ36U2T1YmJEJU5YOfpE/iGdf +2LuFKRU0TMfwiosxi1Geef6RC/9ADaIuda6aIvfMheAZ7b8Xy3vuvQ== +-----END RSA PRIVATE KEY----- diff --git a/3P/civetweb/resources/cert/server.pem b/3P/civetweb/resources/cert/server.pem new file mode 100644 index 00000000..f48a239d --- /dev/null +++ b/3P/civetweb/resources/cert/server.pem @@ -0,0 +1,29 @@ +-----BEGIN CERTIFICATE----- +MIICOTCCAaICCQCWJSBNug1UmTANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJ4 +eDELMAkGA1UECAwCeHgxCzAJBgNVBAcMAnh4MQswCQYDVQQKDAJ4eDELMAkGA1UE +CwwCeHgxCzAJBgNVBAMMAnh4MREwDwYJKoZIhvcNAQkBFgJ4eDAeFw0xNTEwMjUy +MzMyMTVaFw0yNTEwMjIyMzMyMTVaMGExCzAJBgNVBAYTAnh4MQswCQYDVQQIDAJ4 +eDELMAkGA1UEBwwCeHgxCzAJBgNVBAoMAnh4MQswCQYDVQQLDAJ4eDELMAkGA1UE +AwwCeHgxETAPBgkqhkiG9w0BCQEWAnh4MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQC+v2d4ye8BgDGncvuCNnJoyt0lcdEiwriGkW7+6eU8CTwgdJGmVZreI9Xo +lDufzcPGtcu5El1XdwlzcaNB+iQuJfXqodvkbw43A80sWtDZuaLVbS9xAr+2mEqC +g4/JYKRDy80y3RZ60S2qvB5jhKb1gjobLe69VXU+aifZtI6LGwIDAQABMA0GCSqG +SIb3DQEBCwUAA4GBAHGVbKEyEIHUYZGGTzmKdQjdeomycKqh0/lgN4LUOFZLpUIb +Ic26ZAWL3x571i05qz90AFUXEx30o0aVRYjvtSDyIlID4Niz9Cy8s8vNIDSocEAG +bzBQ9xgFYjMEcgm2ROkzE6xdyxNOHkPA4jXjqgQknyvtkHcPE7mpv7faZXFz +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIICXgIBAAKBgQC+v2d4ye8BgDGncvuCNnJoyt0lcdEiwriGkW7+6eU8CTwgdJGm +VZreI9XolDufzcPGtcu5El1XdwlzcaNB+iQuJfXqodvkbw43A80sWtDZuaLVbS9x +Ar+2mEqCg4/JYKRDy80y3RZ60S2qvB5jhKb1gjobLe69VXU+aifZtI6LGwIDAQAB +AoGBAJkeyzASYhNBVhrGWZGopWTr3GSPnkOaLkiP/JsTJVpxS1v+V2E//Obvu2pN +fCOHKO6dxyEU1es9ek+63EQ9ScaCaaZtqyi8NcttRTXYFcXwl7OZx6DnKSIa7mZA +Z1HFzpZAlCqbh3gf1gGeMlJWEK+qxiDkBXq+pGWeOS2BzPDhAkEA6yHbw/YUmFCa +ng1+EPBCkUTCJudiexnPQF+xlhgW68i11V4W5pLpXYt1PfN1qzw57+VgS+lowGIr +Y4BuRWGciwJBAM+tI88SnygdGZUFCp3FQK4/+QUH7tkJvqmhiW0gaIo8yxRzbK7e +wqV3csy4ov9LYH7kVvFE82VvUIpA4f3izbECQH4EY3gfBuKrMHLM4GfLnKGmrDeV +gx5essjZgJ/kwUQVCf8UsklZK2FLQMa3GLVxTcvYr0eADPgupPpq9q6QpgkCQQCt +ksFGFgNN7JxwD4mi+bUorjE8Qjgf0GQ5tNh+i8K0H0GAs0QYF/jJgT9C2eLpyx84 +jzIXbxCbK+E93CLGJuTRAkEA4LdI5JSUMX4IxVHSsfsHYT4kP3XmONlDW/TzWfK2 +jyDiFOS7lfIe08zeSxdxdpF4y9Y1eGKOjls5y5u7KtV2ug== +-----END RSA PRIVATE KEY----- diff --git a/3P/civetweb/resources/civetweb.conf b/3P/civetweb/resources/civetweb.conf new file mode 100644 index 00000000..00aacdee --- /dev/null +++ b/3P/civetweb/resources/civetweb.conf @@ -0,0 +1,32 @@ +# Civetweb web server configuration file. +# For detailed description of every option, visit +# https://github.com/civetweb/civetweb/blob/master/docs/UserManual.md +# Lines starting with '#' and empty lines are ignored. +# To make a change, remove leading '#', modify option's value, +# save this file and then restart Civetweb. + +document_root . +listening_ports 8080 + +# cgi_pattern **.cgi$|**.pl$|**.php$ +# cgi_environment +# put_delete_auth_file +# cgi_interpreter +# protect_uri +# authentication_domain mydomain.com +# ssi_pattern **.shtml$|**.shtm$ +# throttle +# access_log_file +# enable_directory_listing yes +# error_log_file +# global_auth_file +# index_files index.html,index.htm,index.cgi,index.shtml,index.php,index.lp +# enable_keep_alive no +# access_control_list +# extra_mime_types +# ssl_certificate +# num_threads 50 +# run_as_user +# url_rewrite_patterns +# hide_files_patterns +# request_timeout_ms 30000 diff --git a/3P/civetweb/resources/civetweb.icns b/3P/civetweb/resources/civetweb.icns new file mode 100644 index 0000000000000000000000000000000000000000..af1f1211209ec7c59c3c9a6c64596d31fb6d04c8 GIT binary patch literal 13635 zcmb7r2Y4OVb>@haY{{0a*wV&pJ74l`67RYsj@O&Sj^pgcabm@h6iQ+d36N++uPguv zk|6NVJ3yimy^-j>TvvV4Ewv^L>>QMKf|z{-$)lcSDiN}riT?12;DvD#%2s-3`t>V?qbs`2k*{e zwSzsg^HL`>SW;s(j+$4i+dHdD6B1L4J4>_!ljf(zJ&jDu2j%0Fo<8M3ZQH}95o*~s z?e=mmmtio-@5-o5u(^FMJ1uzVp|M_Fz1l^y0`GD;J*M&AnwE4l#2abL`$;yZn;95t zZAI-AO&XKR7~V5eGd)DC7W5BHXavXnB||`3N6#r$UV43buB^SaB(*m3 z@x+RzUgAz$*C6`-Kt*$Phi-9sdC56FI5wX8n-+`Rwczr(D%<{CPr`FQ&LD|rVty4Bo+xoD6$n2rUcss#ys{W5ZyfQn@lAM#H&795L zFCEsk$vLx?BUz5IX@+{Mo6=D~p)%{pi8+JyTPbJ=xq?c&aOBbUN=^K~7r2(c@?9JB?SGF7%`SF;HG#-l`Nl zUNadUQ&tMh3EmH3U&vs>>HK_Uxt7n^<$_k?sPUJM^$i`)+rv;sry6Sfe zditogiJr>Fht+*ryLphJjRYa`Ibnq?8w= z4cDE|Nor3Y7?)hjPD_c7jVr2dRWH^yb)i4+E2%1}pW*Bdn|1JFpX})0)+;OoOR(hF z#B|;C;NijSPCG$Zd$T)bC(lc}j{hPq2E$%@75n3qKf`u@1uI^B9eW9b68NCuk1=cq zgKDrH;(aRW9{B!`{^<@v`>~yHe+GSW@9x8gtE=eJAB#QG(4$o-2t7t&VuKR6fIEbq zAQ?z_&5fRlcL*L{{}%Srx2~?&!hj|M`Gp@V> zf$Z|SPUmbwa7@q{Z&r?bVg6jh^^viQbzGa*h`SPLIb% zc23ogJ(tuBjT3^K)H1ls>A(f2V7G&K z_nc;|0VYV4KRM-@w@wL+&3op(B$W>|aSHQ_YE3mlmPgod{a88UB@`6lo&MQxJ_yr0 z9Uh0%Wo=cBAjCbu{`Xv;>KyIibXL8u?;qd!m!k|%3j*h*E80i&UFQ3r!9+GQE}x#j zd1mh7jKI1$r^{e14Vad8BBYj}^v#02`aHFgB_ zFyZ5PX~}|KKTA3s!o0gB_)tiWS^_HGaIT~$HpM3s!_k?%d3sc8(@o+{yCN?Z1d{R| zgzl)QtcnxyX?-a5pa=(mNU#X`5?hS8hZtSs$OAef+nvsqvBV zLD`McCGWgGyo+s7_Dmr(9vdS$9)I}YnYP4)a+953Sy^-mE?;W4t9T5dD+qPQrgm56 zHx89nvnxKYS0cRXa(PyoGOrf5O3+{3LHC5Q*0GW5qKTz>!R2vgWa+qbG z?GlE1W=uNs%Cg|faQ|Eoe9MhBE9z9<(K=6HAipEQv*hy$f(xcjm|wm`m(_c&^aq)! zvrEiPSiB{YPB_jo-9Pm$vcsthd_u7mq|1n%LQ6 zvB4+Y^R*Vy%hS-6oBzDc%P-*l8(uCqy1>g9?e4qa{5U^2*uUM&RjlI9?M*Kq(Ux_h zLsup@yxdq*<1$}fR98E}%MFeAX$iUR-OuP8UXe7LsjaM6IJYs<@3iVV@q zl#mdD6Pwt0C`Uqy67gr9$K=zdA6 zU#qI`r|lV8yx=IUT^ty%-}LgCBaA@#s`mILnVfAZ z@I#=UeQYjpb|}f#+`R2*qDQ3X^Q7b%Er-J3;c%ru4i7}skbq3K(ah*w(*pSV{I&tkE@!NJ#*mY z{aqcnmE&-ZEG$RZEoIFE`fl?**dj;kt(-$?G!T}lwh7kC;S8tJ7X^%scdUDP z$MK5AmS(GBh_)Kc90LbAPZ#_9cg!UiMK5n^Kh$9jA2Jjb3QFaak)~M(*AN^Kk|j^8 zLg>14CGA*!T%w^bNs8HalR? zfwTB>>memwzew}o$KSc1b!(e@$XL*;wTc5Ky-40&PFJY)_LZi@lJuD~Te<8~D)K$&To+hX!-@2Q}@ouM+ zWjT&#S%=qSDLHRj=nB*r%a+(1uzCy6v_s!a{-+L?rT^54nM(|NCWPcF*WJ8!?7)l@ zx{8ahH6bEjgHIie2~Or6)m9m}`3ZFS=09w?In`|GR$07om~*pw;TBIU@B+9wh4Ve# zz0cfSsWHpx+1sD+;$hy^JlroYxPU&sGQQ#FhVn|m2K z-5g+D?|==rkaH(nj2yw3^=6!&omHM)vHPGqp<(N2f+7gY&XNRWmXj8oqD-3R$=YG@ zFdrUZ2;5>ONRyc&EOMO%n&OtWw#~!*f|9aojW|wPwG?UA5IBXChCx}~vPTAP-rLb? z(Bq_$Fp)TTn4UC~R+2FEXd0x=<7;j{q#{U-RIeng78P#A%`g%{j7@jff{%cG&}bjY zDhCLinM!^qVUo32NGnc{l}?od@_K{~)QuKtY4w;^O%46ee||S;#$ur?IH|0i>_dnF zH<$J(3bmwOs+eKge)+Gzj@27=IANr9g|*$fPNV4NLsfc$m8sQ6-B{xgt|tsuLZ-|; zFfa&fTmgr9dwi+8zD_UgvFKG=5;y5^(vtV_zLx1|J?Pic*mR&(AKatL&EaNbqiTy4 zXULj^2M(o8pF9Vz;8;EtTNRn0?hHL;ln-_fnWTNHs&_-`GyFB9u#enU5NU-+B2ToJ zWknnrnz~p}k?yx^PoZ(Xe*cW6dVyqx<)2A{&nnMF9!ZV+O?Xm7NTgp{)u4@LWWh~_ zT6xzvLL*_JDRGg9_9xfGMHS9jOb!PxA-=;UoguSfuLC!~5Ruqam|l4yyTst+C|ZKQ z3bXC3KJCtKlAt%>Fn12rbaxbI_uFV(LVS-T36fViswM8x7KG;6MGRdWl1t?d8%|`9 z-@ysiQCa4kN;X<*=W+2cZ;vGHEQ{k3^1B4VIPALoa>~`_C)X4$G1tK{a#I@ZIFU*I zl;QQAiO0t0t@w#UCZdejtvp2~l>>XmSpo*7Eb{v3kgPewNKE*_qa<_AER9_YVP1Y! zj8fkI=2~zfUSik`dLIIdt+EsQclYu~5L<|4Cxj5_(Qmdjhqh%x{%5##n zn%TJ){D==A$a(!TTFHL68zexa^yU?``WTI_M@#GV-?;M>wg2jFE)4n-_Kn*RS3Ct3 z#As=w9v(do>tEV~y`T0=e=$0OVCbz)32R-RBKyrx9^L#5J$SSh-aLU3Hp;rl)hD9V zCy$=OzhYTM?`({)IV3z^|GQTI80Bmj;U(;k?ua#?FAyAUXaM!1%D-P8qm%0<+ljsN z`*q^|W0bpT<>_r9*0ZKCz(z>5axo?8zCq^}PEtMLC-Pkh;p0bbu0 zBR(5mtiSyYae!B_Y_x9FZIy7jslXT2uPGodn%8eUcYJtwW6gwLpr07wj)-&k)~CA)=dO)$@9u8y81c<>AzBK z3yQb50~7txnge7$U%)E5^9H=&S9g4&3D9rF{x45`!2pj?8oa=-w}Srdqr>$hbQAibJAo(@Y(CU_IAGRi3k-&NSH8{0wQxk&ycq}bJ*o`9W4WKK! z&gYb%3EgeqBFeKJSAFZPL*|+1-y?Iz$T;lng?V%yni`7QeBr3rE(%`h6nYuX}+JY|0m5KH3XOrV= z@)|1qJKU44$!9K0tI?;GPxG@T^? zE7_&`Q<-LaSL5CT;b9RGM+quAY--W9;LVTGFDz8s)XseD&o4dvv=Qh)+TmJ}AC8O* z35=V&HWzx)M!N;CtG>u~s(haRn%5l5l#Q4iIXw zgFGiFY=_1!H?QyG=4$VQKV@P+Y^>AQXuM{J%PX++E*4lAcs&=-fm$Aq1C*vrLvrf$ zl4S`*0~D5yxN(ooYlTRR6Rl@s1)TS=tjh^+D!A!E-9kk(SS}O$5v*EG+hsejJ3}U$ zj&yivCr9`MPH?(xppnaM6J{?gcANo}46R{hk~NDCu+xOv2LYOQzW<{=Nqvj+4hL{N z(8pz$pR^cG8q71$8eD5JyO(sky#q6L(m}iR|M}xx?;mL4+&l;d%H8Err|MNTckVA{ zVLygIyt;z4d+kaSZDF{j&Y%DD`+MR8M!gj01;Pm0)74{CJ29t2k20_y%_G#5$2c8M zy~?IBIebNb^LOw3;wNDipOv?{J*?BkQF9X6;3T|e26hlsxn9&_fJw7z0h2QBsid%o z_)-(?VC@#qJWF`y`@+%&PU$w)fMVM$g(vN@sQ09UdD@0T9_2;sSzWX7Q@H#SC;1 z8xT-a-G|3LmomZ>b9nzTy+^0RXMkIBTN#-BMS~>NKQL$vFWp@ad_RT_=bvr9@P6|r z13}fKR+p6Iu#swf)M)0sjE@o)`ttn4LLy?aW$MBx3J4wSlS`jwL;{|)u zECN2Im>tm@U4+W!!;kMdaQIwRP>4zBEBOpCF}A?3#GLBS+kY^A*wkB-bvQ|9kd5`U z4qH`~85Q|)0U>49rQWbe<$|@^;errKFbJp4Wt}>n8CQO>PLf}+D`7}so~g?#F3OAh zw+{})%P#qrbkTvm*NHN50?<{*^_1M;a$MgZ8<%n{uVmi`N6zFG91e_l|Gm8@a_bIJ zmmt;R$cpT7ST1xSf?mrfDHvFw+Y;>8*RR~|J3GP) zgvF-JK9FX*X(r(5FM z3F{r`vp1a!4wJ{5bHwIzwhW?cvl8sh#l_nQ)sB%egOa~`$t6hK--Z3l4f}`7?OYa4 zRxK_npig?-V!{OIXLQ3uf$ZntmAr>#2T zx37HuvX|~^ZQUO*bjhtxU&I$Mz&zTCQ@-X8k6L^%z?${u71El}z>^s&n`&B-{_dXO z(4eVH9&3_E=iY`6ZiwihVhbHSf+Kee9Za`up##W*Z9@mJyLGo&&uyUtl}d5dF?{`3 znss!b)_2JIM^7rY&;g}y@=R+VwrxWPqr)6^>~rX#Dzg|(YHoQJHqk-tIj%80y=DnT zKSKw3%0v?5RF+R6VE=3l9cZe{wMXK!dRy-}Hqk+wuVxJ$n9w~&LcLkD^XpE|lcb+}bT2gmE%OOxZP zbL%Sn+qsdZq|@``)#&!Q4Rj#s;G2$Si0B}6|G^*;9RvjjR7p?gg~b_`inq|giCR@m zV0mlQsUScHF<}9zb0-4whi%hYheO7_%JjSBGjvd-JSox87i;(J4-X5EIBGOUhK;&_ zyUdMN3eHNKMnnfo5AHS`Db$&1&O03f=pZO&Y6;XOEIeyxYYHe|>o#;SxnO54yfc6A zp#upc0J2uA^>h|0or9l42lWdi&vS%l@IYeYES%1~gSVI%lDE@i3M+N|89FeM zR3XXHJSWnMT2`Jy9klsaf;Sl$kx%70ttgt&a6AySK%o)JE<#!jD@#NNbv4RL zxm`{4E*nqxe zfF5RfORvItb{jfqoCmI!>(h`56KyjyxY5B7EW-g!45CS9s@c_=x`htP1sce~p*bh; zIyQUvN4pcd1Sic{;UU9uv@}JpN?Ah(--T0lA*<8K^Y-p>3bO0G3edrSe%wItq=bJR zCXutxo>tCmpabCVs?VAzJ1NszbQauw0nowj*nk1MiLe9F%(JAqV#w4=$k)+<7tler z1*SzIBj+@iK`X=I=IOM_?k#k1t*}7_v!a)4v_=a*dOS2Nwn%NE zaZ1lSaD&a!8J5~RU2fk(2g!3g~E>R^FY-Pnm% zH_<^_<{8QPh0RPG zyN)XD3WZ_94AZH%@Ej|s(!=}%g9r7+9|5Zd=wPUzqM_ye`sME6N|RiXc$}t8a>IaH zi`y*@6DM?K`-dG4kItH$%a0^C&_Q~5VC_g$SQ9>!yZ4NaGmgzn_bb(`VU~0nj_uhW zT2>wuqG3CW*U*8FTaG>1nX~_3Y@fEXBI9tPQZ+f$(bT7#J(qqqCpI9sSnuixi;y{W zl{TjZ(1B4nS(=e@EF-q8ttLG;cUMB+jCP_rr?4O=_O~DU#Z5v6P!Sc>xnw8?IJ}Ck z*smpLg_P>#-7#?|j${|@`|!x=oZK~ZurE2g`jFWTpCQnhkrx?#3#8-#9XvtjLQW($ z4L6@mi9c~7T0{qj_Qh8AR#Y2%&z+F=%8%CN*lG-nal%eS`Xw-#HQk3xUf4pchO<3d*aL%I(T%yG5OrNhSZoc zna{=W5^krsVPx=cGEQ1!w`C?!PP$*nA9rB-}S`^YXY{hI0)Cp0iOMIro<~(LqF{ z)&aDB4mA2UY-kX-bVOei?2IGNzlfu|H_^epv6Hoay$dW4ny!mXcDdNe?4V>hK(a+T zYWI1!ed6>LZVenb_eME$qDEb!3hUN@*i2C#@Aq+;W8QAQ(Ac;?u+L*tq%9I_;6OKi z($Vn25uF3%uNluSou~{AN=cVdvN37udwYXJ14rF9eWFJ%f`cpAjf~qs9jt+avLP%4 zJzk>@w!p!aNB25M>X$Ho)q+SJxTif6$a$ULpbh{WbT;UV#f^WBI*=THQTChE+^raSgaKpk8~D5F6r&%fnd z88e{!G=PIC{gAY@+MEy>JkT|+$yq4NR)yAgw zr~KQ2fZZSa2L$ci@8`e2Y%Do5C_?4QRRib(>Hv~($17#we#P~niGBw{BEo|XBu^bX zkl9O)oe4NJ=$JWmm$)iY2h7THdX6md^qi%+^26Q1fx#g$YVF~`0gmLDjIbGwE9I1S z00)Z??$*TQD6|&BF?#55sXaeHgd4BMS{=TqnE26fO_xj~ zOBM*he*{d%R41vTOteyK(i&l8lUa`|jkI1*SP2TULb{F_wy*jM-eTJ?DWqG_UY z&MehfAmG)j8LJVRnnkTilXbM-){p|px^?P+DCR6Mc<&Tz(i>>Heb=spHjcGe;Y`M@ zpxNj#r7TfrnqH?4d}*yJlB6#VS=1ICDSP*a@BVI2wUIQ57B@r1RPxM3`Rz{uFa6jK zdG|t%nKnzoN8NzSG;7p>2fj#1*I6vMbizC} zXJImb`nUi3_df|zuu3Bc)>{dqcJ$4srscTBW*9fA6k4^_svD9!aRmVhGm25oOmv3s%hu1< zKx!Qa>fjQ5y>s$RiiMr1yPz{p%M2!sMyiBGLz;DfTMdT#i2VmcM^z;e^BL$*us$!U zKl^?xZ9f$>F{W;dmC;hEYDi01Nu^#w{EC;I4BY2;uv?Y)e)SqS=*umysry~ke7j$% zMmiH8Z!v49Ro%0523p5z39c=DUr<1BSlY-`R)}>C94y^E9qd=pe>mv8p*Q1$6AD5- zFfr0KGfSu^O{^;JgWUlICH{xx*0#Jga4^qYib!fs-}7-qr@XE7bU^%!Y`CYbwo^G- ze5z0qao|v%%GMGXGQlazSQ}*0?K($d!RcdhsSyQD=T1r_{}J6WE*~nFZia9S$c8`Lj1+Arp);BFvz#i30}#^5AW^WlJF|R#*$VE{uU&?M9;=4_Drajul5I)@0JAnFIO+$=_%~gThw#9@zlL3 zayu+a5)x=XAYgx@Se(xdklTk+0Q|ee7+H7av-@>Nii@j~BMK)39ulkse4RpNl5gUi zRZi1qqRou8x)e}4CY4m%}HS+M%n zID?Tyrsmxk1taPUe@JG0xGd2B*vU!Dp2RtH{r;q;b_XiM7@frM)V5R8O*ER;+M0+j63%qqI>YO`q`r=>*~Po$0+>s8f~;kPglVr@OSme zlU4EZS-HQdgYw19+b_2bAg+f$q>pIQUv0JDf&Jk5Io+){dW^Q^;CEn=Uu4Ox9=F#0aBTu! zySMfHi>|g$*{eYDeOY<%%`GR`T#A37&lC8*`Po+nFVOyTtNPUq*Z2eS!QK*B2kYep zd^wBaR?*|1thHCaSo;lq zUdH4v)*kZn|6lSqym$u|fq)o(fg(;+9R~)l{>J%x7=L)g1z(eV(zSa z{SGYr^UuHN?!njB6ng39ul}$NUgt~8vt8nAU%JJu$$GMWmc8@}_Lk`dCShx1|C$-5 u`%B9cq=4lEpXB_+_$3?ex~O&eqCdj%`vPUX{Y%(4e@cG&4gvDk+W%jVIdfqE literal 0 HcmV?d00001 diff --git a/3P/civetweb/resources/civetweb.psd b/3P/civetweb/resources/civetweb.psd new file mode 100644 index 0000000000000000000000000000000000000000..accbe31129cf84fd63b120f3d6d41015cb3bcb06 GIT binary patch literal 9365069 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⁣7k=e$9oG95ZtI|>I+Xi54SCad>?v#ytig?P5 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⋙ol!Vj#os&_&a~&7qE+L-XiL-B2*~%Ns|sT zQk`Wk^itXAt{Sg40ayv1`&~}(g+WE}Rg@3o@1+>yx z0l@z}n1dD6!zB`ogf{1hgZ~|VMksq6i=e6~=!zl|NVVQ{+2HL;hG_R1Ke(>Bi^%0sJ ztK3}$2}G3gvZ>%A2nTCaDqGiApvAt&8GrcrqesVl-{Eu6Vh9DD+y7&4d+E~3$e>o*3*)r z`H~iDHGWd1P@dl+DE*E|PtX4V1@SL>BDWDKZ`4q9-|phaD@y!kK#deP{3bDYDxVuo zzU`$88Exd{dbHnjH;9jy9ph2Qgq&ch=oW;6;^fB9c*$L@_ci==+u?;2eZu0$=idOg z{^5FsFX-m9WhiHlbbAMS_?wYoV_E7^C@~%n2m($B!bJ%7dy6PYijnWs;WRGlZ!BX? zEQ#86vp4eB`Kgyl6)_II)DbGsr?lcQYS6>88j27D6tc;y(8Tml!8~2fDdU=I%o-4> zIs^H{wZ6wU`PIrWFe|kCw`%p)Jcj#s#X4V0J72(1eA|rT6-y|B848@!n7~O``KjLDGX?69lsrlW*#Kb+0i-nBPwl`(W(FWMozM z>|a8PI^R5TV>R*>$UOapT+Z|!ru}`bv+7M0)Huy`at0nXpO=m7$Xa6Hf#dNWK&<|# zkz+Gnw=An|&Hh(PjXeP}7gI1tQ!&RH(b21PR-2&ihCP!mM+#khSAjAmVJtH^tmzZJ zl4xZ#h}%+6j3HjxGMfzYH1fIV#Dzg1osB3}_O1VCV=}`2hr-LvvDq!(L4ciFv3@XF3VsOw?nwBZ>W8-6-n|*||E9mNhG;X5@Wrfo{q*hS9zV}Iy6HG<`#EXFGhq=-dq4M##9VSf=HkUsPYdHq)-!N0w}VgzK5 zkH|CJhx09qfr78$>L)eQzW!5rFj!=bCTX;0exgDeq z@X<$5O;3Pl+H#!nGn%%!(Q;y4pslm_Tfz&wTNOQb#$nzpkwhR6=Xo`mkhZJzA`Aqw zZ)J#;R0;qZZSM`P_5tz(ODYmo%^6#sT|X!@y;T&`WWt}R0?FQ97kDSO&YP6mlFm3* zuDbse=f}5ss=tE@=vispvLu!I@ueu#eS$oM3Cgl(5cl^q#2w6{*)OvQu>K99}^qB)HwqK)MNH)KNwKpBrYP9DWe2hV%;Z$m-+pak4Nz@U8m*Ui-6^i z=dp%^WqclDF|8k-e@pujCNZo*ES&h4mhiq~FD0?jqL>cySkammmpdDN8S#kSfhrd|!?5PKzh>tTg^OaAB~ zs2(ACpdgxo?7EG%1m$+4(Y3`jAJA(p_FrTgy0cu0p{3^BpT}E9qmxHMY2k>$jo4=cZRuwA>DVL#t`ZsKX^yqzjm_4 z(>O=E^<$P}Lf*Pf$zaj_rX`HxMYc)Z77Z5$AX;F$QTfJ%GhFAgsC{79_m7@FaJGCB@( zBj)@P1?{_W05m2d6gS92bv6lvyF4m{julSPOFm{(o)@wdK|Cthw@__@^%Q0I%%>kW6gtj>J8jsX%n7SJr}G&9pCk-AWk0OYmFo|pPUE6 zUYTX0jx|>hFryySY=7Id0sVjzG)0>l^4*<0B3eTHig(D&9te)^Q%RKjIe| zuiIg&H;2ZrZ0Kt-tE^Yjh z38!rOlUdSQ2_SIGSNS9@g#xP1dMO6$NPGpk-)|?L5^Ob!zp(r;@YAGZnW&x^=nk{ z{Pc^)4-I>Z0c^^l{&4ydwTG}Yo%ahzu6)-;f0Q>ET|F1I^y;jpf`8SX)a1Ax2;1m4 z#IC|bSj)59|CatPXj&;AgYXW->p`(2T$A>!$*vDs$uDhA;IXjLc;IWb^FaK3l zwVHD$vmz_P)GtS}&n+znE)!2C+h^e^xKeJc0V4>j+wz-b(1fIrS&I^KHF^XwAfz?^ zcD=bx7>Qa0A#eO{rC_n@{J!$$8OaNxr(3NC?$L_!mcj2&6Sopg_Ef!^0X6q zJM{FZ*GHDFLw!i4pG;p#$<=Kp91_c?*VbFDq?@bz_!gC_9NE?LtpC77>;`A%8R3Pd z9Y#++9A3v^^OUg^vc+;%Jq^~xFSDao1i6;SUoCUo6dLQ<5EcDRRb7eJe7;P*f_*U! zU|1Fx=qKN)80DPfx;0~IPSs9+INs;SiiGP0zpZqU1K9=CdSQSIYylc_UFKD)ahJrY z;WOL=WJtxj^0GpMF-yldWYWvP_r*Nr5>o@!=Z`;lB!Dr9{1$zlIXu?MLSp_*Xbmhk zmZC$wlEV0Bh!eIDfElmDY{{YAgUo#)lvYajeTi$igkU6{h7P4TL{iA1K+Qz?^V2V9 zrpYnPKh$pS8@iO47m|ebM?8SNh9>7zpN7vq`(i9(13J#EI3gt(L=SC z)1Ih;5l0JH|t$Kj4%fB>z&B?*-In_W0m zYU1+a)#B*F3!b^;%l!0yH;HPJRYI6p*LE&NObHR`jAF*YJuiknE9z@+S+F}eg`cxE#}<=0oh~8_9z72nLe0vrm$$nTuY6cp zxdMLW-lwghaJILAGOqFk1r(Or>EqL&oLK_YJpb$!D}*}75N@c(?Hq}c@pC1kKb1w_J2U|j@ZylJ-q3oY1HVermO1uoTavvYQh*EThFSqd{i>k4qXqci1CmY#%hG7w|EyG?*z4zc+a8AZ?AO@g9XQAXbotX!Wt)Bab%se? zIl(SFSu+Sr4|$8o*?@TVf2~oa2RK5wx3yX#_?wZTop-_d$Ot%XOs*+{>@s~G+g`+! zf~tP6JhlF(_9vIr0q$X(0d`y5O}z^GYmw{jC(LJP&Pd9NUskkRp4eomB%!)Dtd_P6 z8b}X@zIrH2VROR32UpVaQN2h-j%eJQe|W(T@i4Ef<51>JMOiTwC)C2W=0>JZ#Kh-0 zuc^%LL&mVi0f=joA+W9+pq)0R3`Dl`Wd6ruh7XJj&OSAdprZ0N3uE!VcGYX z8Z{b@Bme6d)ndwXPtvCnL_vx=PubDhp$^d`&Lk0C%5@{yO*qdUKt%3{VPegu?nAz} z3&#{Lp|7w6+E4vk`zjKDTMb>BdRg6{NCZTLtWtZ* z!(>-z;0)9~?PtMJOLL}tV-Zfh{oUi+%Dn!cbw~2|vH)z7*rX^Sbj8*_tI!SUMY99bGbktI(Z3yb^PZgp61QaWBLQj4ArjQ9+^2q zq@9l04K>Cn+Y!sQL0EnMAfCIH_^r7oB#ocY`k-Y&ElJ*|6EgA#!>mX%8m*SM5dqD(~IlToelTh5ptl=h!zW*RU&14x6d+$$z3B? zA@eLltDHCZd^UuH9SZ`2#HiI>^i8A+3Rw<%AKA1FDy7UE0Y{rY66k%;T`MK~H?6WF zY}!#Te>%$es6XFs1BO3&wrp9}3{5b}=FsesWRp#iJ>GlIx%ZqZuV<~jA|l_a z+Z3|i%FM`!J?|YmA|o@)$+@?6<}%F-K4?GCl9tDtZ*$qe0lNaJs)%8hVafdSr`9Sc z$t8Em+oGlpSf+KPNUvWSKfe9GBG~`5#*t6lXF8jzxr7tD#o2AQGf>JrCZkwY*yHQy z?j-CyM%GU^UhxsC^k39WsQ7`$uy_PA*Of%K2~lCqfNmbk>*JGzlK|!@qJJRIwq5u% zMP0jCx6p+C*&%KpiT{>$7hu2U^;CbZ(5Cg)Ccj60cV8O=Z>BJb4LUGm)Hi?JF`lc3P=np z*X$EU88m+Xg{~8v6MA^bhy`ZwpipDjiAVs)*%-HkQx5};At&K_T@f@2AJN$g>-Cyz z;nRgryzV8c>M=+%2>sLbAuB|LMC;1LmP9(i_3pz6eI7#)gdu$090)ZPQ)OQQCMTh9 z3z<~^te+?u`r5pET0pa`_#%Q*jP^K2s4It|k&v>oT5I<#1Ib~%w7s}mO>b$OnJy<{ zfLrvG;_}deU3lT)N#E~x8@2oR_QhL+)faCwKEW{8jR|5DbjaS;S~*(fZ2+ANOjW{C}zjNH0Y zZ5GU+ieKxM2y6q5>B^E2A#&llHE%0!ZJwnSAbS9cpUjJ*UBwX~BH{wccHpm1b*BIp zA*&foAOKb`9GJ~q^o*)u*Ok&BzwyF}0`HKbgj;D8!?s z>$(+MHwiq_qm zWw7qLTPU@saIb!N<}N`FRF?C+X=$2g0w75ml4c# z4`JTW3q{X#x(4TZR&UnNN8D;Hb9N`J!@5BXEA8h~KPqx0s}45lt&BlDoAlbDgCm5` zec%iN?qfbRvOvI^eksAgp^C3M^RwOX!3BQMy~UkiF*hsMD>1@b;*ZJ37|K4dVh50v zyz_(C-_N94I0`ozm#glPID?P$iwUmkMG_vjAj6BH1WxF9iiqQPsC&IMKE( z6-))xy>9&kXaAd+UZn*uqKNMC$`H%-_{xSJLfs{;DGR?dPmob)@=|J{*2%!uOvozf z(;cH?QQ#~Cj535!d3U_}m~afyR`9T{JGv^8@orkTRZ_L8Z#+poD-D6Y=lwX1D@h3@ zhg7N%G~P){t^GCb>T3$_zYRTiXI#wBip+(3*Q~ z_!&JqN{~TmHMd|@pzKwo8~6U^z^1bmM8mY)51qL+{+b69|K&F6g$bnr`SJ9o&s*bI!N^pD* zodoikKOa!In5h$6+nAgrna2j0v9ssT09VyVOk3MQDg8}Ft|%iWEV|>hgu2>f@iKCw zadJOEv#mfHxGFmOP3FAZi;#q|OeLnD{{#rrz(SzI)u-DT@(7yX5P*%L+z<=%48c|a z^~QN1hF`05>6qRf>7l}aZaq5qh+~)(5O4L}R?I$`#&XO(HMW+zLPWx0;MCm|!_FzY z^VT7tU$PU*FEe0^yGZp)+H)9?LQW1v^LKEMCrmH($QQcEKId|c7X&n&jxA$`4tX27 z)1zcqgOByTTfWo1r41lzIh;7)&9vUBw9h_XH0->#{J)zw#`GLa!3O!EH)ThfBb$?7 zVARAWqLwZ8lZ%Bwp#<}&kdpz!6$RPdD}h0}YpS0FFy@xxG`Yqtty*2W6dt z&1TbsaPuAkIAFlS?x?VkL}H`{K=%EeX2JZ_fC*L%m=i;gXs%_&Nkvm6(uL`MO1mRv@a7NE_xCkw?LYlDvts&fl zOdOUC3VQ$GeV#3%XwyA$LuewGQ&oPJ;ACQ&wWlmUw8X^iHCt&hR!FLRsfLH>3Qw*M zC0n)B)4jWszB#5akSjXqnoK~4;ns^aNHUr}OxzWa5CKW&kymwZVfbhs!O}5E=l?mn zZSFvALoP`U6}-`l1I39`mRkgsTKC`a6Q~9ie6ob;+dxqHb$^-J+Wz8fVZF-ol>h+o z{nH!0e+n+jx1PeXwYi{#7xuO4^-Q9&kPSD~YHsUyZcVX1c>NWl;?m0I>EH7qS7xZS z&3*1Q=5~*+QHxA9ZbgNOzNh1gQj0ncOm?+|RO0XVWe$RSjpGxn%-(OAHEmoxJj3|f zkQ4zI&eq+mwb3 zhu41N2mPmA?SA?W(R$?PAA^OQapY7%>f*fQ$x#FAjS;# zHwWVmxlp<4O=4;-_(+9I*^s6lKnmI!PU})An-SWekd>-U2Z&rNptT@qfgPsT%L5Pt zjXfc`YC$;k+5QFYkWUUv{46v9BWPPpJ7~D}x4nAqXKGzF?FX}}l(z9-X_-t^VJ%(X z1eiWW95lk#;J?+|7i60~Mo2-Mc)^_tI)!siHr}#djWgpUI^k1q^RPS&gT32hWBl*;q<=r8ewg{y1+1=coVG*Ljn;09tcqWcE7u3mM^#tV$#*VKuO2J*jX39 zpunY6lW1+Q(WN{?cN>34iQE6?vEtXBzP$SB?_RtIA6k#4>Nvv_HGd^|V2p6L2cMee zIKvE)fJz-rAZMEt6jG1|IAB5?Om^J+A^A0 zvpk{=B^%j@7^1oUl#*i> zBYc9z(iTu?RRV!Ryspb7Zr)|b z<661S{+fKHOyM-qX%fG@k2BY{0W^=N{F+7uSNf*^bcC}x{j8(3s=ZgJJ93>Ka30^c z_;AZ?W}(Lv_l zx4$lzGA$JkxYDdme$c+4<>@=d(V!RZj}_)uw6r(#m5JbczQ`o}0ODSK7ksIvtRh*< z=&WXX{N*WoG^4LvK?KL5ga}r7|Oi`0)G^9Geh(2$4z9UCi(?_hVF&HxyGL)Hq ztYmKcLnzz2_2hB6OAQZvj`$OKw-mR0M;VY)SLuEwC@;06!KsB)1nycQ$8;@JjswZn z8rDs^XI#yf>eTM2&ar5Z%7Z8YF9KcPl!CTK!tU>l{cWVsN4gyL@9R`M*^kleTW=y3 zOzyiJWbWpLpb)a5*M97?c`uR5Ww&@pznfy-RbNGK=&UVDxtoP%gVR3{W?@C4*Mn@f zZ#;`hhJXWa9TB^dY2^*j4o1;wGpEa1Xsa2jZ7MS|j0Y?9L)^-{O6jI2Xenp1O(u`s z5ABy3E(`Ds8ugd%Pnahj%KK|M`?k}a58+$Mi1En9BFaO~lyt)M3b9bZG64Y#9*{G; zk9Fe3?ge!*ARywFGCBJe#tD++xRPWHj$~fYqZuKK*hEL6y!3&*Znl4hyX0{kZH({f0`-+*J=pG$)sHDa*-j9Kt8Jwd|V^EPOgI! z>aV$bzeq3)RD^;@{krrJZ9KJsUX$pjd_ra>ye$KwdVO*i9u)D*B}8kAhSsd5o& zD!y_&vp|hViD%L6VXY^OEmmNxS9_ZjmegZUV|Y~fIOD~(iu=rHIy^1gY&t$%!Pn18 z4%rM=pe-G|>*L!Ol!5&plYxCz)asgzwhOuekfC!R?pYy5DzN;)>e8l{i>hr^Mq5#W zHXD<2i?&dI zc9Mm(&~b3Gm)QY>ox4E`>2RiC1O_1!6_YM(o`F~XiY#Q*4Q2SY=X5Px`<|tCQXvGL z7zdl=!jJx79$F^Lwje5H&kR9%&@c1gdo6Aj0>G#DP6!wrUbby7e&+-= z`Q_Cll{GzO?_;|)d~SMHwgxB9=ePnT@!sH97;ta7$mxC9HNjOS19m3opiWzKqa*u5 z5b!_p-|sU*$ngAJf2Tfo*qT0pu(^i1zN&(BK}kO5y^DHO0b$LSD)*|I{Bd_RwV?a` z=Og<<+k5dm9gK}3567IXYYmhk6Mj3AyGP(LLm5Q$A8EW+(k1h_Nc5F!@Or6QHZYOw zF(2@8=L%}VNzaK@9V>qAn4-@l4I*WQr{S140gh-Vw(r@Y9Hpxyg6%K946zpYB3!TG zgKYg>&EgbMk6(C)H*oZutmi&5(C}VLvA3t!`UH-)0;Yp`6U?^n5Y|O z{mvRVgFRzVqa_(1)4<^;#z%xs>OSQUR=gf8q#=4gia7V5% z0WoJ8D$DO7V5eec|2F61&*CorWR4~uF;wdeAm zXJPkrg>A-!U4))qLx9wdXfp}4K#l;1hRNLV4k&AjzM z7T~$I*{9^ZTVUIgF&$>}@$I*iT>YQ3bc>J1CUG;dYvOzI&Zq*r+FHgwq83LDTkyQ= zb}Ju3&R-rZAR41~sMeM$?6**_$0vv$!*P$hr>y0r)XPvQ9EI46B@jzmZY(LJFw!VCI$Bl&EmcE=T#j>Yin$uzU3dYAV9q} zrzYBjhUlVJ`AE3Z-O_@rKuj_Z;cPpn*>~r2h5v^pA8#IUTY(W!8UqJ49up&!fNOa- z1@V_eSR!7D-Ui$f7BKZ#uU8sfOpdyyw2CCGBFstlISj&$WIVqjuV{DMvr%hp$_mb4 zV0PlK-oYsy!#~?b+jTO&)DC4bEqXJB_5p4{PUATM5LX%cc_>4tSt`r22r?8h7=z`jD z>5VHj(`LydS7>-IQ4+EY$W7san*axN(-y*30vJ#46%hTRrC`&V_`|7=)&i-mMCcw2}Gz1 z=ZFTdqRI|FU0?{NaMqfr(Ew)=@D5<9$jmpQNfo0IJ|nrWdgRO)BR&-vP!SzuEM<#G zO0p*ZsUr#xqv}Ewvp{cP?mly+jts;7pr~6;ewUO?eknMx@7*zmw4e|nN#%MZ%rxcJ zpXES>dUb4N@)Aj7wlk}18p920);HS3WWi0r$r>|*_KiExy8i(iUF?3#A(VijUbU$myozQnaHy-bxpdm1lI_-Uv z9&Ra<-wrPDl##$Y=>ztOM>w?UVL1ZLK*PdR+3ss3A{r@7y*6omtM(@_dMZ8h?TbCf|Bd885PF&*d6n}fedb#F)W zsuHVn{_q#Ch8GB`#xB3R{6h(ywFocU7O4#B62T&tuo(-uz4GMU>h1;ft(qUaj6sRP zH6jNjzs@vie!6iA03lbUw!(jQk_clNNrTV$rWxJ`^_Bjq8SKRe1<*r(dS zG+Z6mG}a9Hmid`e#db9w9k-Irz=#zF`dWI3fn}F~$K+L>I$H{B+4u#GW@V5YL1d&< z!|9%yXV@WiJia0xy+hiL{#AmCN{*(cb2*X%mI_SN?hHo zbJ&GfZl8EUabru4OUkoBlk*|!n7ki?4d!iQkd$)V^Yi$cjJcN)_ldC)vesS=hhv$4 zStBWiX=k@>ks9|#!pnLgM1OO)^rPFG+Yde59v=Qcv}Km+tIDPt5JzdN1Nw_5tHv)Y zex6~o0Q4U@u!ZSNs;h`%muuh5E>$A&h;OryYn2!K8s1rEeIDqz_VTCkd{SZyCQIG{N_FQ#uSQ#Ijr1s(Y?L;O zhhuhX!Yoi65e`D{$8Qjd@i4oU>?-jd!ZL3=11Jjga=0;O^NmlJ(HdYhxRQr(9WQaF zbv$%+Hfg<=_UX%(_CF>x#%#=cMVNgCHlZqg3CFCsKvLb#yMV8zw29y`qFD9QF2vRP zce}_+x}W5ABzC$)8->Wa9s4{IDqtR0U`8iHZPz`_>`saHuh5AIO;36^eTCJ(S0qDt z<{#TtemOQ(abPGD*ya@~?$!}lC+PI~i;r)Q4}Ykjl@$!hutb+&tsH0sHa(xNw0nGu z(uM{dOfZES2OZebaiLjqU{_hCaoo&Z)JMUs(Y^ZCU@|pp4sd8Y3~=QEs*Vhc&htky zbZor_Z(4X_(|=Ez@^(rS8n-2vgVN$;atML|VcH)oF#O=S@?R*(=O?L<4P-$G_*M$4 z^)81v04)h1{8kRsJCBnvqz?7s@>qaxqims<4TA{%kDAHW3=9M#ud5eOe++5O_XfS| zU!RlQa}Y1-c3*`)0E2FOmw-ociEtzgLD@wJ3{mQHpSm?eX<5uQS<;qn3mX6aK00&Mre`SH`3r)$|7! zvbGs?SvhY7ZQGtD$SOTUBES*j`Y>%V`ahTTdQWL(-9v)Ly)@+6+T+Ng6wF&Duj8P%oCLPq7CW?M`a5 zSlfLERV087V%HP#gEsMd98;k(eolB&mB({T5-HMACjRe5NFJPs@$(D{+ zd8HVOb+7)zYI~+#n(71MvXpm@XVG>tNlN1Ira8EPd(V7Fk@G1 z0)rH{)eqijSriV=KtP5Y(0Bg5Z70Ul1F5+fH!f@o(X8piIid8&SVdw2T}nCZGXdgZ;#U)6=L zCkLYe!ux0mhIY;du5Y@C@{7BwYH3&oSg-6pYuh@Yd%gQ|M%y00w6{%0a^aCzh&hCq z&&Q{~i4;}A@g+e<;e#qFUqMGFp>_4qL$pO$#A0hdFH8k~E58d0VG`5;qurz%kf<|- z2YVriCsitN_T_&2Bc&5U0Kq9py==iSbpj{Z(t+%CQ7ewXvI)@t4Ak6UlPSysmkBaL zrLhQ^`z5eC)TorTeUsuJ)o8$P@l4;fTkcQ8(VU{ah_=y2KJeHn=W)x81saJIC$bj~nw@*5g0LV>spU;q|( z5osenuVAxw2jevhn*_o257C%Dw_?I!4W&Q;iQSjQ=%-R#AL*ihm2pNi_w5d_OQsQ; z&AZzI}T8OApGp{#Y4T-o5-4 zjT(1^xMr_d#E4-=)pP3 ztK{+NS0sJ^0dKa%Db(Wa{p(+JME42Tgd5CM_n$?n^DWY*qZqp{6s4lqKn1n~C#nEU ztKedsbH6+U=uBH`jX)OAwj7DNUhF&nfyzZSc$wT5B2c1X$rS30pS?aa-mg}G6SqviY^Wpi%W*9nn_h=?$#7-a|Kd3+PZAn6@&FOty_bAMccB+*XEMb z!`NPT)=#C!>UK27yieH9M7lprs1i1TOZ5QbyP8nw;DWKof8y-(C)w(Fa> zd>`>EPhZyxE{j#^P;QpC~>lt>S8==e0RDtQ@1La^DvByw^m!m$c1L^O<>maSDG>fmAWd=}fk$O%=v8^JolXMOALNsYJG0BtZi{RMqZ)bjlZq!~NXLHbt4W0;M7h9BR`a zI8{dZ{SUxF(wEz8wYn3f0hO?b*lZiDccX!0kg<=UW;uRCql}~ff^Xb)uBao4qR2}&bHa>N_ zmx{yJMcx+Cg}r+#(iDO@HAvXm!-5?y;9-Km$aBkZhWO_E^0M*TiK5JjAu=*2v0X4n zp&WsVv&bUl`ATe zQZGjCWyy+Fspq8j+y3yvr};#5!bM4{*xGS)q`J$ud!)^zSdR}s>?y5pUWSJyGGHRr znc7u=iehk~9pl4*RY7$GSlTNt@Osp7@hlW1n?3I!0?tnp^3{E>$tv2J7A-t|L^K0va8-QlPfnutL_I{Sv`X;z!}hp~ zUy)>K>iQ0lfQnV#oE|q?z@(R$ zD{%_WE(7EV=ov;1ie(n64qh1Y63w}uvT{(4DlmZZlfJ$;k4CN_u|+e>v3+I#Q<6gP zazR;MHxqM|OqoId- z*vP~ss*H3;MCMt<`cERVqi!AV2&ml1VVeZZ;yWYe;EaJF|fQatLRxpdgQ#{NKQ3l0(P~S9K+)V-D`Uo zKz*Xs`v--pKR!a$*F7mlQ|C>{n7ZQ^JN7(({k!T_-$T}Q{e>V2(5ZB}h4ohT_u6z6 zC;gDo%ao5<*jzd1dOH@$$zQSn;lv1h)~D0p{nIbGh=1CgvJfJ&QS%*Zk(P~_&V_8G zQ;3l+h1@1AkT{+iUOO`P*MbB+H_e|i8xt`ID~D_;5~L^HE(7p*mjn~HjiB?tBRMyP zmQ(@E-*Or7*s?e+Q#~gpU7||pv`&1s@SYDwe#@6Y9Kxu??{w3YCBML*a~r)>n3iDV z&;zp(yP}Yn2Dxfz)_*7iq!xHlFDFp&<^`*5W51NHGDBs*Z z$s;?8dQ{F!lfSIHg7fY$OFR_Me_Y1htJFRT5{zWchhy~h1rC@8$oG$`?uP(grc=Q_ zB1D9_qsnf(U7j*2dod_UAh?ZeO>`3ws0WJqJQe0X^3@^tyeQEIK@$>Aq#W<*IKxqR zS=PgWPWQBxLc%rMh%X>7A?6KcS|gU`ckT`*Ja-a3>cI2#sJfC(JE4Txb>C=YIgD~4cAY?swjvn`7$OP&F@i5weyCe{L}S4K={_z@q5 zN6iskc#I15KW(TND6(OiVEu#+E;G0Db`2c4r@ z;|f{L07bZZeE5nIsl2R#K(%I&A`_$s&F$R-=Tu8M>YQ-STe_`j(^y)%>V1)SRw>!t zm-H>Nnc#;N-fwl?D4iJOd7j{8=IrwxJ?v|o)<38F$Ozjuepc=@;S`G_`l zOyN|QoMX*dOr%U;^-`Jvco>zQoZ-GqE&2$RodN=3CawXk7|X1EaA-ID~P?g-ch^2H#-@41OhPKxwS4RYgfWBVQ^hAw+QWqmBZ%1T zs1J#(N130-;Lw5mk)%wh#-w`{O}hU{U-N%6kPz zAPlCW=2B_R<93h&9#O5Wlba|e>k1)br6YD47+ge!_K_*AFHe|7za^8sAPiY1#DW~X z` zs1v|;V4vAdkZtfp8dQwsqJx@WCEER!RwSvA2orW_U>G&PtGv%Tej#U8V-E&_!REg! z%8w#{CU|pY0_X-lKKr2w2#E?5_7Lls!JFqc5@&tjK zNbVZ}h$*Wz08EwYFNW;2%X|sUh5wUi$x(HoID##8A&27rI9wq0_ciniei#Z0xXKHir-<+#k z9hw5{r13PlVovW+^E@(;?ZGFAG|So!XujmgHMmn+{sVWR!3%GC188L}$LDXs4PAo+ob(Z3K?W-p7BfDZGL$-|SYfbw>>MZq$}H~U4Pn0<`Drj?#6gGW1s{weh!vBE{Pg(Zl-e6nS8 zFukHz!bnQ~oQJU((@9|C#Pnc5UkLhGV6B_=4#5urB52Hk>s4tSJ6AqLY^qqsc81AF z1xP|hRhX-^&ST0}3Ky5$&QaL*na{Wt7|cw(ulEQfz*(nvv$oP{`k@F$I*6sfEtkp3@r2CtGRsryk z=P>WGV|cl+c%B}tNTp0wb~92oL(zxA*@WR^-K%hf1Bo@qf+gJjMn}gL)%pFt%V7kh z+cJY4MzQ}RjlBoLdBmKL*Jy$H>znQdzSnC-n6|>_Lz+j9#zU zy8W=97JTnG)w!$v9>3LH%`E~Nd%LWM%N<~m3T;iSLQJ^niUrvz!6#HlS*2)nEa01` zif6C0i*cc9xIiF|YIjd<`kF4sTOSp5iA6LD{#ey7J1!7C6rC8oc`Djb%ismP)R)LL z`!tiX9X!PSz>y_PiFyJ$i>WL!=yj2%AdE9-V;nmW(wpgzD*8)g&AgS#N|4_x*A^*! zMYWp_ES(Y#C9lHjk*`pzGVXC_VH_LzC8&Gw)U(%CIsLCEeus=Q`lk%VQML#R3o4Z?Tlw3$k^ z?cSUVNu9E$B3ta2$ku>3c3Ha;8v+Ub?(y%(xPW$5#u0^F~E zN~cyBP|SBV27O*d1v#b&sYE)-IjJ$;<@c>~gMRwD2n#a;Xk0rHCC9x%RH3l9L7AB@ zc3GjTPS<_iBou@7)sR+z&u2BLTf@t-nn)5Wd-B`aqJiUo(}%hO%f}aR5tuv>?74XW zP#t>O(#O71!Xa-hbLr#lHg~}_n|+ux*~jyF!ut-Lcs0A_lU2EIGE#453f;K@SE^TA@>NT`awUm z+8^U3fIRu92jM*Bd>dyRsEZXLf#0VZ_$dg)LU*KwS=veoChLUVyAc z!|o*qni=elzcrD(@l|-vY#^M>jptVr%%0u;XBY+;K?NtxwZ4E#tIfwSus?C z@Jazlqtvwy>8lKaW2AD0wNkzG**&rX{Ztm00l7x}oL<%#TrWDB7Hm)ExkgTi{wkK!W6xvY z%utpgUx$90BA%rrc8YK4^Qhx?SJUWP4M+eK9Gu{D3|sY|x3b>9lDEb1_Jyy{mnOdC z7rAHs+Hy;T(V-pst0k@I9~p~kQMFU(s`@IUnp+6DE~JqeY&_eJMEx=l30}wh+6;k$ z!}8d-wFy@n2O*Z5{YJ3fp!D;E|;9ipQ?$NP0QmW_121jj_9Y`(mN7B7p3m3lqwpZb1>i4tW~4`G%J_RJp7mFx~}rRHg3w1D_i`6skqw*@S#uw`rE z8wj-F`u^uV$0bU^!nJb2m@IXihPzc`hQ2**P=GVor`N|IWAJd19yBCxTQXfmnei4t zKnlm1JWgZy$#{oz>D&=wTz0&l?m*2~U;DySV~HxfjYGA-70E)oCST2MM;5&zcRi-D z@C;}{@%Rld0NNALBv$dIQ_EuyAVdaRO&P&L#G0y-NLo)Xyw#!pC2Kriwwg!}2h|uLfwL}t;y;g}CFzGqH_Wbur@e<$g9>5Ae%k(AtyG>6X#6bsV0|vvOOwsh z1|i`4ejo5TziLor$j`lgZ)kL%$vd^{<68j8rlPVGeg7bzImUl00dBtlyM9$`IyO@r zMj{Bz`BFHD<~HDa%}l+QI*|)M0`ea^is@9x5T_RA!D{spS}BrV<@`LBmSv>8dg0Np zU*I8||I6PX{L<4`2BW36Mj8U@Xfg!*cw`>(oDn?f9jKQSW#0y!o;riA>h_ws0LZcN zwA`9ZLII2f-v&XMh*hZKj=KX*R_!DJLGO7_=Y@k($5j8sG|Z@HpX7 zO+kv4a2#i;Z(V5~rCKTZ$|fyBtv?)UoLQtLlA3?i3zCA^&Q056| zQ+AtSM)BNZzPvp7-M*V^WJWnL+k#N(wugILg!}mzUT7WEesE1+oK#^XK4PhU??RSE zi)I5KP!VHUI8w-=o`4mo~(TbU1|U}Sobo|>6&SDgs}3^ z{Y5eR#-({!ck^LMVCXf%S@40^-j0;?i=@T149o++wRX`Bb-|VXK+nQRwwapT5&&lN zx!@aQZC8>d4oy5>0dY=pu>f{EcJ zYLb*ZA{Mpv611JiviP@p#~xqq^1S*den04$MA2f5ZHcVHhFhnyJRDipDVQ+@J(x$_ zTpI?X^)5jQ(`VmzQb)7ik1~jXkujq{0`?GINa*dPV3Lzb(g^$gEl>J625rmoRNnw8 z@}pA>%vKM*l3EU&=S8JHjIe2v*dfMDH_ZEZ@VNi>vFL9<5I8d=w|UI_IK$`kx&d4i zHUIC)(i~fKVLaVdK+693n&pBcC?8oIy9_n0UU+80?9)`aDOnfJ%UH1PIC>aHR9kF9 z-%1dg#mi@vn`Z{7YPmP6{eGsfNIeK(e_wZk)bO-T`t<(l(vj(P;}|!8m)3R&D^W$r zzGQro;I{kLRvy!gz(ply(J2Dz1b|AxLr7D``c}K9wIESB)i9h-*L2g|0gN>f?N@YF z)}vNz`QylI19U*y8j9#VCJG_c-M2>PC5#5JKAYt;d4}wTmYkl#1WEB zIu^mBvK+l*Z_nQXEy6fqQaW%&{MA8Z%{P7J@Zp`_s^=-GKe{z2<+XZlQS)-AZVpU5 zsOX_)5XA*(*Pz50(S+XptYa1GAOF42n+E1ec9h3Isd7?ZX~02$)H%z~W5S}8z))0w z+UACdXku-;vJrbF|8kug67{GxD8{kse`*E4CyH#X(wEJi;#xZ3;oGuxq=(CryX8Kj7P2w-;vIpH|B_6bf&QOim%_$O* z#)Y7+Ur#}1Gj-Ss;n5Y{-hDhb6Rt5yEG~j8tSuyWQ~fk))DN*#OpEMnnJ=>2jZ7ly#f2T5H`O*JN?NsTL1nANa(>UYBjeL`>pU^m#ea+LV)R;hWtWv0Gp<{tBIR%#QNKs`z0}H76i^n7e z8N-aJRN*SD#FixE0ET}@0La>6sN_Ne!$q`&L{u-;Dvl5YEJa4ufBi3HZUMal-%L?8 z9&oi7;O0q5(L1fSW1!ZS8+>ZUfhh$GqTY3%56WXhq5i}bCEH#E2^f#b84lrTFUwG`U<8bjuF7hdFSnfUaRfQ9qbZRtRkzTF ztqI7%C<>O6kH>96ugM9-kxjd(c@6s>=x8BWa(sxULix)ALcM&OY({+Lk1#%$XOrr9uqX=k*miaXia z5oDLqwZjVl8n(`}BY^EHYY3MXVhi=>btj9s$mk4>Q!h^o2VbMw5PoH7%Yqvr7kzWd zAqcf=(=Pb9&|htwwuhY8nC!=BIT95CNcxMqh=cu@`P6H|cidr3 z_?m}5WYa`Gfd|^Lh=dLuVq9kHN8&&#!meUl;0r&qR$~!-aA_$}v(h+^TXw&vj=O4- zlCf6mq^+eWsuY753AjI8##8YAjte5BkvYLgItdejjQ~wH`L$_0oTDhWLH0-wiY|d5 zr5Rd*&V8yEr*H=P-d&spMWHGFwBbdl^Jd&!OqUs|Dxo!o11r#fO*m{m`Ug4?W`CU3 zzu(>dsrogVw(~s(JE|YO+E)zb)68Ht-*7M);7xJEV7f424g{!uJ`qG|8NQ!G*jyfW z(u68QKY7PWdMXJx<(NIcI!rMTPtMO$n(iywHaX1|PyrDHFm&;}R&XZ7i2yUF*Uwzr z;>ymO!(t zPNy6**%6dmIuo-$cO?Y6DB*wV7Q<&*3FT*B(0c2Qx`5i?7NH5&B9oiCwmVwJA@Dzh zjyz*7M~3#2jokO3~St#)b|0Lxbn9b3>f`E zTLhsR)EjS`*^v|~5rF%lZb>Gifwfl_O-s@HXg}6`7b5_*2iAhR2D3gyuJ?X%Wv51$Pq$pJ^{tB@ zB89@290)EoJc{#VIAwA6^^U_LTK=6GeJfes%-Ig2)hqt13O-eC^PYKTZi4;k8dj0s z#298sGw7P$Akoj21dCVy*kZrTCE~$La#+w(9~7LK>h>sSO#_xDE7=XvAcC1wUgxoM zj$c*#CAaG_aYY-QALcv+sbdAOuR-?=(IytGxneU^QPM!zP!dInmhcpb*Q+3#Tn@C2 zs0A^}b{YT=|C(gULv^SMC%K&v*RBQvW_r@((Zya2FYTFZ)nCH|cu!(sMaKU2_K$f$ zz>*dbY%yu~x{Z4&ZF9);?TcKdV~v`-r%nB=dm0T9 zHXC94aYGkZ=BznB74L4AT7v+MWuv^_J~0WwUa1vh_i+T+(4T-0SA8vjr06S6$rL|) zuK(wKu2{^6v$_jeP2}u7!1<)y2lF-Ivuit#q4MgQm+5K)j!DzU-rF9O-SY`$%*wq_ zj;fV_aR%zyEWe<~#efU2NN^>+=~;>e=*8ebO`G@0Z8DB(ph;>|(Y;kQks6O!mNsil zEKD%pYADMyMb&!TFa#dz3^DXCuTJOjviT=}rC4b*V1mV)F+ITHJDE+;i-Fq0?6 z@kC!jpA*Rq87!3<`+F+8YTmq3xk96vCf5aB_OIiR7Eo{GQb*K9eQc>>4Aj%PiOH?1 z_fP-XRO6Db&$-X8#|!*Rf}<@S2x-~`Ey$Skcaf>=a zMoQMY5}9{i3w<3q<-?MZ*6MPP*{?DJz9^5QdD}=v-JpPW{x*7>X6%g?{7zWZ&Yh+$ zj(aajoh^99JcM0vz05hsCC?FBGF;9P>{OxC_9z`V+5mW37j+7ry&S(cgH$gGOzRZg zILF}tg;3SLHF;g(!PShw%uTYIbdx)5VGV1F6^Gyj5vP2v$!z4T=OggLYGHLhtAB&! zH@9!y{z$2;mlHNvaN+&&ZbgenWzJkg@F~kX--&BR7!K(cX=xZn0VTF!eT$8=i3Gy8 zEr)V`Lw|z31I%5<)r!?f&l#Iov*4UpUa9C14K+_|xd`q@&ti z(L@w{W_>C__LU;f#_7+~GSCN?6tGSB)R8{c_0jDM58v_~JZi&Q z_@_SGr*^_j$LMT2FQJ=T@|=8WRZPh!rDM`JJTqnDU4*Q&_I34~>%04Dik8 zJ&>FyIE25{k7;4FQF;)qbFX$_>@YF*DVs6<>LAC9ij#x2ixrK2dvc|aXn zcIkRd+}|Vv*pN~iiufq!C!=wdx7uZjLDgqGr3>OtEUpz77jThlCckV{%;n$K0}^Tt z>`$M5bFHVsLMcOY8OV!g*K+02ECs-JIMf8VpP+cBZ@%S5Hv=WaHG*09x7WmIpW+sZ zQx%2@Y-o)t;tI8o?x|CA?7r7<^|P$Bs?2hu-u-oVEJNLSZ5UARqtWEqnHQM^K>U8M zZ}SMx=sYyPOgRmw8%vJ_xvQf#fu7ifSOS!no7JI88cJg8$RztK+Lg3t5(8KaD?!Tq z3kz%#0L#i%PH&%hcQN6^m|~G5jtOQT>N^kr#;J>KaIYd=Ph5Cxo>eotd4XZAjZ?N` zQiGzsFb}e>>58h~r7LzUitqE4Q`hP|Wb#6_z3aT3Zfk>><+rLWc}k<)Ad!Db5-Q3R z4G6t0yeAO5tI?^Bq>LSRND!N*Of9&qdLL%KA_}Q8P|(B*p5SF=)vKxh{B}?9Je!_c zd1innLcj+b${3ND){XdX9#n%^vw;N=6#Br^Z}8DI{{!Uw1I}}h7(-*zZYEvl>YazgrFb1Rd~?|Urn#D5zuLn27*6MCg2JfOAHd$V$GjJYV-Sd=JwhPjifr~9 z!IGgsB)~*57u&yQ8ss~Kuld{}5xUW!N*eUTTgir~x>?J*7wYvn$Jz(iR>gp0USL=dIfKGQbdq&gIY7CFka0=7oKw|}hnIL&I=HRWizjd=lz z-wJ6FZ$Ju2dD<$Z_GNZ51T4((z9Z4~n6?wlH3tq7YbFY$Ar&gT`@N%Q$Wt}8_l}VQ zamfgDCDJ&lD6r*n2#B6FQjaR|G3UVhxjbTKc_+zqAc-%$N#{YY%N*$@yiBlfXe|C` zZ?~#~`$8ne$Mz)xdNnb1Yf8XW!=e*4IwC2vveoSWlPHG3>1tG=TM;eUxH+;~7Wnk^ z(Y&9c({o8X zL=IeoRS#DcF$}OLa%hyGf4#> ziWF0ETyNI9rnu-fp(?TF5zcvho=^0#3ThSi5sCWzBC4KoU!VTPe^Uc2g;Ff%`G(?* zHwg&9(}k^`c~%+`OwU*S1$E^DbM5-hi2`S)>r<CKL1nElE$V zmNRk__pocoKPE@DJkVzC{nkvm13$AH(+i2V;QTC!hhb??0N>s|(kMCOoG(6onU^+S z;`S-$ttk(+_9UAT*@*BLe(5w249uTEg1izA>%G2%g<2lUFTvdd*TPIFt?B}-uBRnh zlB8FBpV>ll*U41qzxdgd(dzPrd+FVuucTz;9g_RJkl=t`9!YtbDZM)wgYkM6`t!en zk-3D)6qg4HdcEpQ$9tjrkQ9M{f?uT<7+L^G_*4Leyb{RXlKoiW<$soCFzG1l8QBG% zudmzKB|a%i&r*}l)3uMz$T8t0=R6j_zFtz#Ym?%Qeju5;?04rHA+`0Z2_ui4V}z=# zhY7zPsV*>-0o3bj4)Bt!-=j^%K{jaZzPkK5E#A(*Mu zMqEQ#nW~vblQj*r=|u!UH;nXy*j^2A2WsJDG`jCG(dailRT|_mj!KX{H5w9goHCBn z+r6gITR*ADlG+Eo{_2C*|G>{olcTKM916XurS}0;o8bXd-wQ&mr2x=`%$V1G>3p~z zQeq0;TMBJBlUB5p2T!#vXqpx(dkZLuNN6-{+6`$EpI>G;FlNrAVJ zsR3Vy)47pvQ;D4N)OtDBC%Yg1$A@owEmI?t0Fj^?BUllYw{{E1%6D0Uu|%HW&$Hm` z16*y%rI&uY2LzS186hNi1ODZPr)k(P!~Tp?=|=p5t!aJMhK!f`t>CpeQH9fv*P`ts zEm>ob*utJHp_@Fvo%LP|MPf*q5C z-iz&=p#6e6IPjGYKd?oU*@9IID|CJjXQk4B_*hRH>f3(bxa9`U7gh9?S-2v)=819B zI8TN7IB2%r5=%hSq@3>9{2aW|CS*lmtqU6fJ;m5E_V-$+j9*#Loo-YZdVtl~XG!MY zOM>vEiK9g#2XrjDx8jPi{Z6hV8xXS251fR)0;#%!?NX5CPI=yqDom9}Bk|&EU8zhQ zuXeRx9x?&(;?`L>1FE39FBP^k6coJWlJ%o+^ahUq;o&<(lnQmnxW+el^Fr{FAPyHf zC(Nu5@{S~dh}Cr5GGdllSF4ru3L6@@Uq zBNy&7M#x~#mv6p)n-R!1R?9$Dk4{25a%wX=M+U&^k8=#;<4l+Qfl?7j|Hn>8eot?z zLf$hBpHJi2VV~k``W6P)Q=68!EI=t$1R&hYyOP49{HQ$X`1eg__MGALnjWWkH zl8V@UaPz3H-Zenu{s}9pv_oZxN}G`f7t=ZIi)RCJ=fCPfgW%PKTD9hy29Z)<%87Es zPaQUQZfJnsmYB1oWc3OGoUSf8trawiP8TN-+9H7v6#9eyW0nTIefaMcKwgP=>dtDA z1*BAOt@pM?iM?2C@{wf}yH2HkMv#^XFBWHXPMb`lSTiW==9!K>SApdTFkt%6H4)xqi^%=krT`{U>RVl$8zW}m172ReeE=vC z`<0o??9+}eSlUDq=M2N%rWtsD!%0Y34wd@v4M6X%PelHn*Vk|9ZRNBVPE*0f9SBQe zx+KTiultNvE|U>HmwMjUi;a9Qv;X5hk2Ts78#Il5XT;uS8}~W;MNp-*Eqk7&sg}%{ zd1%}gmH3KUx81RDGxTnon!6cQDopD(e8@I*V^j1S%cgpMQ?dm&zNup3bt66 z6}S7di_M-cXgxOXz3(!khNY(Sb zRw!Sas}+pD6X~w7!|GnyT-1HOctb^(<*G5oGkV%kSq<$zq(oFWegc{_;OSr9l5PB+ zIQoh+kdLoBSrJ12cc%|^Wpe>C)?>&9;u80F%ThTlf6QMA zd5a+$MtlDcyPf1~O{uB^hPL|eIYfUZ3;F|oeZR&hMw1am`eck{gF%K;gycc3^?HJx%OggW#uQyQ_YfT zv$!eCxn51i==&_dn5-4(Iu4-oj^Cy$;cgAbQ#pm#4%0S)PeqJVFi>>7L-g1ga&nWR#d5)vY5rMXo&ASzHcLkbNHDNe%uKL4ekR4rNtYQ$1 ztH}DySoDaf+W0(f8T%ta^m>2vmLX{dLw+kKP!$gB5}I*;<+!0QAPoF0y>ul+^l5~u z|FkON?m;R>KOXDGbCyGgu*g8)>~MrwmRf#?Vuk8E#l1o^keDq zEXH9}o21U7MPG__c)-V&S^IGz;T^#t7g@&|I_S!kCD`G2?`16q_%B9g!vA~|rb)qZ zZ9<0YY$UZh0LH3bKmEQ8^J23}FV{<0Ot38ld)cw)goQNt{i`*J@w>VsOHZBKPa-2u zOth7(BH``V@y;fwzAqZ7g;}^b(<2OIH-?!BzZL-J5L2mfTw?DnE=yf_#BAGz#KE07 zr2yhrLcCjVXvul{A|%ukx0C@^gjJwvZit}BHm@uNZo4*CL^ zV=QbNABML~0 zo21?7M%Ye)ZB00hup~N$3Hhf^PLZ}eY!Y&}(;xRpMa9T24af}qwQAFkhF64IPJ7j1 z5wQUmt1QD;IOd+Mo#P1zfvmoQkva_hJcnFn7KDX|3=Kdr`$;H4NL0P|P z{;zKT)KeC}tGgs-L8$XF8DyJ3jxNWL>nKIB3_Gl>>Au=t2|QPl&>~a-F;r33x^)-M z&*SqvGE3Vd$w*JC5AP#BMcR&v&uatSQ0()iqnKB0L%(f zH!R37q13^#U_qo99{(nlp(&&g&ipfBz5*f8s}p*$d^>zuGp*naypr`NLzWeZBK76F^Kp8y1MjC5A9?rGB)umA}#2-%mta}fA;XRC=$Ro*!9E6U8 zqH6GLCvPJF&C^O#$931THxZ{!J5rPcH{=t*i9qE7)TjXs1VrZr>1)CO|5v`Bd5Lw( z_oHGXWBQ+D#VwHe(`K+?KPavlRf%X&N~2A@$)Wiq9OoLpm~;dT{_}-p6?^ye>9Qa6 z$trOYLLOy+P$oH2RjlfR~A@}>902WvRKak@KH z5P-d{9%kGnWL%^5r0M~u9036QLhAdcUpFWs1i?E~8Bvjn^oJqx=~e3QS&H79h)7Kk z7%rba7$Vo?$5l9W#1WE)xp6VTX#4ijp`3eNVFke#UoTJt-`GplZd-&d!Zn2a+sWij=xk76A8%PWE9 zFNjz4QP~n8SY6A&Yt@ghe?^tuM41gN&$-SV;ir7ZISFPrX4s@=A>!hQk=hvQ*W zg_UQ0i?o-kiB`-iOcjm8ap1uz0>}hp*-=HSCVkQ@BkGr^9X67GMoxtUQ#m$$|N8b% zoMrsZ)7P|uefX^)S2jUBx^y+i^sPUE=9UP{!*C1kMEj0c$(dY8_Rq4ISw6~)A#KW7 zN&c+8B=juF=vvxfV-g9;YO{nR<*^+48a)K=Yfi^RMx27iRYQ>rSzLKI9Ev|zeuh02 zrvyui&lf@={w=f(N&Zg~0CA?$|Hd4XspJMsL4kyRM8ewZ+v2VnO6)fWdQNkT+;oXu zhCv#z!LNZj?fBZm&p33jUO2yrB>(#1ji~8oxuh+4^EM&wSP67>OPC(*PJK#L$1qOY z*nI;vPEWB1(4dmzm|rE@{aMyKo{0}=`0@6$lB?<%^=2V8uF0$kR89BwNk<~sb`|X3 z3dT$Yv^YBO1BS>}n*`h`k>Oild-F_r`SWD<jR2?J{$N^#kHuTN(V3qs$^z%D@h#DN$ zGBnXfrBRHB3@*nvg5~J_7N+S%7rRl*#uX}e9DVn6_nI9h^n2!Tc$EMj1WlbGKl%ZhriKOq~V0j#DV2sK74X}C!&Bh z{iAoCad&z~Uo%NcYC5!tnt0i?+a^@fkV=p5_imKJN zTY;p(X@{_(0fI@Q`x6F$c;gr|0qJ7Z4`N2UskUR8-r^=9OSc1Khm<3=`{4DxZ9$w6 znuP9g!==DdpN3Gy!0W?{81I3)abKnxlhU-V+VU~vDk)aIl&n}btP_;z`fR8wyoQm| zll{NZxMrs(pjdO}K+BZBV63>RENR{7L6GHtf~{$|2K@UOkkZY(p#W$T%u?3JKtReEst%$eVi3=|@7(0=ZiyJDeUd&qM}v#-K5gO>og_ng{VB=NN-&{k9^= zpFDit0b|0*nU*My{4>5wD{09ioX0@k*pc>o1vPk9FY6lVYrvXlmFrNjOK7FDJCTNZ zCnO;|P0ogAqgoNbs?vyo_s`GwT4=y;`(CgdH@mqU%_RLCy6+-bZ6iZg>VGHsHf%+S zK1eQk_s)yl_lu2#?j*gMqNmVStJ3i)qfeebpX<;53!G|JqP%Mv47JHZFGh`xV-8=- z0=Y0wt+~>Mx$xvi&uux*M<6i>k2Q}j0_nfGWzG5Th@7wLUEi@;=5NxeSm+Z_%wMTP zM|`0cpR|dqGa5X=<#(?@=%f0~H2|qR7V24cpCp`h11hZ;Sck&RW(N^4Uni!vayF7s zM_Rjw$Z-|ur9x>B=;wpjk%wqe!^Y?s8Z_19PCJ0*zXu`OukbOhtrA;V944YOp za;GY}*oSIf86dW|?+w(bN_+WXk1m82eE3BoNvB8FAZKMI|LoyWZ)~o6 z6~LB2LGK%!Wre(JJZ zgUA($GxkY@Cc2$VR9==P&>fOFh&txx%#&s_Xp@K-Bpk2w($6r)JrtEDA>AF4#dPSf z(c`xTcg@F-5WDVO)!%32VbeK-f{26$MGgxbrCb-T5RJ&CQ^AN&qoCXgY+vSUIIZS= z1$pjiX8HUV)%WxLpj1sug8`n46g>=A+LC4DZssHa32r;CgK}p+;%#2xEjZfx0LMvK z^4|5tmrw}ASpgfNgy3KgQ%d5czAE*?69(AQn+!5$(gui@M&F6N`c2k6i!X*?ir;o& zxf7gc#76S*XAi%$@{V=Tfs9j;f24Q(|C!vNo#mV9qf5jNiq8{{UFYQYa~73}%h4iK zJq#6V4Iouef{WQ2nLw<&V?4-vapAtd-5jh5Bv@r$Qeat znj}>CCJ|BC8j_-N*J^MYKLaDnPbjatzh`%%(HbR z4oHB$ZY$UtqDGcE$wY7vc>O7NE|`o9f%yUh0^(_q*Lw)_+ZrE953x|Lcl9hpJZh8? z9fu{#)b$PYYX8F9=4+F1^2G67uKFUW)N8x$L7(F~3j6hHCO;K0{Ve@~;7TBE^7!=m zbQF##=!F^($?xpeJUqNUvoeFrF1WS9E$N5^u;6PA76j?K<{n$ zdkq=C*;ir!W|smvCpf5BV{ymg16S-evx&_k18l~6E)f_;BI zr-$GM%;lBF_YG5tBr6zt9UwE!TRL|b83sini$K#8fq#33))a|)IC8HeUf`z*$fj_& z_~5mB{(pP>N4`(<+XDObXE{hZK}AM^!tCjym8Wpv4b=mjUu1QL>s;xwGBt3$ljGF5 z3_Dxxet$NLtw{pwRh%UVhguOGL1{5t14>3N2xcB5S0g$Tafh&oyNyb_V}wFTkqxZJ zSD4#LJP7^aA0W!BVXM@i+73^?{43Cc&}(t=Xoo*_MvLEN_d`stjQl$5$cGf z;t6%TOz>k1MzqV%diTdceV7XA*s&BETqUn~@6Uag9NE-XL45~uUU{?=l=Ha>aQ=tV zkPJp@(g^@MOj$Q!*6bv7oP3~T0iOI{{C6Z7x2*K;wR(~WpRISw#$JN}-df|l@5&t=3_U*morCWYz|ci@ z=HM_9m7uByVPZ?BqCbeIin9%DCJvgt9V)s&4sAM=3-1!w=|*NCcQf9<{s|FP6$y5i zxd`3;at!(34N+up3evaVr(rkyGJbk$RnUakk zVmzZSpsCWk+n+vs$~!%tZl8|jBuVYQE<)$a1&^tUlw(JH`Cx-?_nWU+=g_y zitdRE{Jdza6jylH{U7V;`+qmd#}~9(ofog~4I*{s5kLONAEYm-$XE+6Lg#2-geSm8CXf z$jh-B^LWjPRnNAp$;p)eTEG%2;uE$YdNUOy`6vjREs{Nc$lyZ-4t{^G1SDe@5)de` zI6v)OBWsAZAQD<*-V?X425^TbkFR$GDo!=o>_m0>zjp`B$=@_cJVgCKO;>dUSj=SEu{uksR-%$wp5pobJ zKYZ#55GFys_wW$`M(m85VMLoLV7GZoFt#cAkz3btWsBf+a4wzFM+)clnI!|suo`nv zo7oy;?@PAXj7Ux@1Zz#g4&CMe^w))30TZPV*4dh*%ouuNS`~P*lXf;KSviwO^8tfN z^l1ZK{q6H4RU^ZOzEd(W{@w4L*8mrCKIsEIdpSHbeQ74u*8mXl`erT>q;nn$OM0=O z9fwZ5P!DP($I6*_qAy11_m;lsTett$lOkUbA$mRGNKOJ^yy?IBCKr9U2J4X&L`zzs z-9EZ1x9r@PBKGCKWymM@Z3cG<-TPg2Gbii}IuzQxU5#P&F^{i*mdg$}$ZJB6#i8M? zgh;7>qz`LgciP5uqsa*-6F@TBHi>W>(YV8j4;)fY&D2m!;y0b_plp@p=rf(xwt~Hr0LA^=FzI`RL(C94!1mo7 z=`d%avCoGO-+TD}4Ksb4v5t;vBEl|~&bxciT*;J1_NRbLE9KB{)t(j3hOHb%BUX;% zy) zTA!L%+bN5O1I{aIpq#q7Sv_|1!i%w?sZiKEn8iJ`&PNxM6>#wTbF+5rjM|<%q$`$- ztl_r51*Rg8kGI@TEV8fMr1?;(-ZkRl zQZ9q@Ioy|Mf^5^JXJovt54D71F3n$TZ|drL*o{E=e|7zB!V9`u$PD~y5Cg9#RtLd& ze|9nRQh(_@@v=Wts`A&@97&=E|JAjqcwOMYzsG!oO!w?b_l3BK3N@n*jg%8A%>wDn`WxG7e+vi8mgi5m3ZPc?geKEc~*jPLm zHg{>k`ttJCD08bW=Vt^}^Mwj=9P_|!)~TNDWFS;ZhE4TnFlxd1dY?)d-X6luenMKK zUarru(=BtwAv&`3f{iapaXFne@lYL+IW-}Oz=ng;tf!_5W%1RitX<&P8~r8BNAlqZ zy{}G#<=078eoNnV*lU^Se~2(yK;gL3>DYP2c{Ct&?xWGlmBD*0KthFbWnQIX%vZfH z)9mL378X;Oqps}h2|Y+;JbT-;R3O(;q|ZglL~(^@dZ59I76 zUHF2(6ujp-6`)6t)qcYO_Oq{+72oO{qC~Bu!KtHd9n11F*$3W<9oM(8GnoVsE2bRL?`&eQD2&y5}V!twewp^$g8R z4}qK{5|*uS(ed`WT0NlW*$__5IqGw)?d*!Wz^mRPpEI=DpO1)S?juc17kXZpLBwje z#LD13uC*SDCu?k1kjgJ2m`M{mi==H!_Ap9S4)D-W6c{`e&E|(na@7@m`}Pk#0Q#-D zd34_O4N%Xv@Da2X3PxgbvhlsFd#qpec00(9Ezl&@%gwyf7Tra}E!$}uV6NBH123a{ z(xL}J^(>qE&zqjLaU}7-QlJxLrI0gsYp&*AoT}axJ0Tv#KjRqWpai1+Fqy;aw@v|4 zv;2b3Atgbnv6 z;7C61mXt^ioLhQv^Dsga9r?%c{_WQtrSz)WKXc7;0fa&-1PAC;_~c2GW3RuV1f+Tj zb*=geXOVpe(ZOXa6u!VMW(8kCJ zrk1LLJI^`g8ko$iMOuYY9VY>lvS0(7=3d)08JjXUm_q7r23J|YT;Xt$Z{ zpmBYI6e14QS|O2o)aRJ*QsDAi2@(nqRS5($dWG$0`JrfBIgP=a%G!JLlc)42WgXi1 zQMY9;yl0Bb*g)j%1O|)u5^3!(F9uHCfOJ}{w(hVh<}HhxE`5XdJW)fM!ejK8w(<{r zUcQm*#a@!TFTS2<|Dof{JKaKVaQQ89@cWuN@W4Wij0RLc>5)TdRB>nlN)3VB@Rf*3 zqZ3bAqE&voyQbcGz3r&iWA^8Hj}yz@WG$WXdZCHZDLoKj3f0WfB$Ftn4USm(VWDMK zpz{I;Q$_8_xPmPeA9>&xp*z$DtN-f?icg9h6DVWa+wQ>46`bE`r;L@W$9=5xyQJlLVVx=znqlx|j`O{lIclVo5Uv%O`GTk+!F%KoeLb9iv6x+jo!bd70qgin$N^2H-27@w(;9TM~ z4fFrh;@QmF3@cWS@a}Ep{>? zAH4pq*1sx0d7S$@4+<+kHeqFDF_}Sm>si|OUg7pO=`Dez0p+b^_)S%D7Z0;hVH8&d zrNftC_jtiIPiqg0C(VI026Y8USoXx`D6R|_q1`)a8v~Aeqq)ptkLh8r!8qONo?6KT zujw02<}M(1!7|X;gtaTS$SISzd+Gw2q%gU~HlQ{v(WlZc-Pn=+H%`n@tO+^+4F)3L zNaN1TiiQ1U@=;?V%Jc+1uagK7vkFbpwN#+A(mAO<-j7|dwdOY6?X1;x#oyX z^=+?w*RZvC5XIZ0KKeL^-E%6+)I|tNbB+6M3{JRw?nj5*86Z{hEA$I=o&zMJMDXnf z0MK8k3(xpR?l>NubtYu1R2%wy$Hww8#e#P+wggN_n$OlCn~f7DE>CT6QDN{qw?AG} zE8k>lg>4cPPqVyL$nag|q$h9J1TA4`GLv_$!O-eYw3@}!Eb=HgzK;M1GeZWM9%LO< zo?^Z~=3Hhp781_Jl=4P@x`NpKZpvB^XABf!>Kk9QaNdN=apS?39g*IoYA<->){OI3 z>Col5#-omKs8S$JM;URf$I>hS{gVr*LhTl6%LFy}^;)GC85Tn_oshwdv8^d4R$%M{ zBoTHxK`_DjCr^JQ>1k3*|G`If)66X(IA5IfYAGy&Q#%Xzca^dJ$$UifHxx~v=^Zax z8{r``xy$+hg0MO_d0ozwbQ!%mtmRc@|%xm*F8j^1eXc+CVq8(j4wy$ z51~c&Em{)XR#bsLCnm_s^{_`3JxU#?kw*tzR4#FRxI9_ah3jV8KW796HWFCJJ0{r} zTpbK~Zok5*0n@RWe$-CXsz>hFbS%n_v}$C*bW$HV9b=2{$>Z_+uRZ+4|4-PPHv6(< z<$cEz97#xEkU}ybA!Ip1MvAb)5hwh@@BC@@cRC-$^B~)jMFUL(4H9%WJwXpN(8Im= z+;h*o{rsM1J(*emy>BaO|94eoWv*Ovt{f`M-ebFuEKzzjT^O9j8-0-1!z)i`IEB5C za2VT7fbF4g<7|ij@HN$hvQA_~=VOS>bUE^bw_=lIEn%HEt) znTNUayjaW~5kz@eYwS5R_ipV=>XI=^m0Wl4Iu+w2SHsY;FOF=RdIH%&IA|Z9@Z=oV zznUDE|0y1|+8&|GYq=DR-NaJp?=#)==CZV&NLX*s8zGR=FNi`xp`6#PW}?VHQRtB# z4K5@P85RzZyrGP#nE+n*&R4Pi4k>1Wa^l5pkt97F2Ll+ni$yUY{k(3apLZ?{&XxS$ z>aw%J=pE>M(2I;hs@)hV4r&l{Cn~vSEi|NfGV2h}9uhFCv*JDc66|77p^0D*YpA*;``%qD>)B-_sL-V+H|G~{6 zZj^WfE5ZQS*J-$R+Edeg|NN`+6ZwYsAKiadvCZqfo&PV|%SBX@b=V3;arzyL`O^0CN zxlk6g#bC-)E<#TC!pn=k`|MlK{;qsNq7GfWkyBu08m@sRg0*UIwC3c#eH0Ig+`YQ{ zYx*hU!>TKrPY-9Uf_5c+oR^_o`d32U*p~`-Zml%pvi`hod3aP+u`5^OSr`3q_NLWN z*AKB|1RLaLIz>E7U8^S4~ENRN%;FOF5~damdSgU3Y&hAIz9iK|3HKhil@OROh?J zvTE_zSzLjy;cYr_+q3=?)jbVV$adElguqJudHvS|ua${gQGT#o9i5`wGbnJKP>U-I zRi8f_pa2%z$)=a`*ML;my~fQ`N||UXR&cY%<s&c2)a&SYVMLissqQ`UBr*nCAlgxz{Nx z)Uo%~zW^R(WZ|F&D!@{UqQM&7kSOH*eL6!|{+}bCT@4+F&u5|PI^V`saY6c7!W1YG z;lP>j)lP5}uQbk3F*FV3;_2MknrkbKo;$MPYyy_xfv4Hn*TKeW38_ZLV&GID!(Q+7 zzRfXaH0I@uHcP&8m?XXM7qFA9LLF}H8yqQ&76I6qSSFtbR%VFcudU=rn>^t zWBDq1XJTWZZ72H>a;$5yKf#%xf8*}|bbRrL_rG_i&D3BQ{It<=-I0APPPRd%(IK+^ zq7s!ig)D~0#xnLRWNW0^2nYNG8mt^4SdKCE*^pc4fF=gv zt-Ic5hR8{>@L7AdXC(~jd_w9xxpZD!Mcr(KzW-c}11$}(bTi>$(KY#Y8iYS;ni6{7g6Gg-- zOI-0v>*R?j^z}g2zqKBrbp7kr^NKkL#~r4*X4xL^h9?k zltmaukT>$_r>?0tDww{)A*=wV;M#mh?5`WH-rnk4wAs`d38G3WnPWwvCBy5xl%bMg zM4p+QtfaVY8QmfpRtSoA!?ooZ%9BA%wKEU@vNj*8HtT{1edUk4l>Lboh$cf}g{a%g z3u@O?@p;S(1${42PoCE$e9@~j#SDo=f3x+1Y}EJtyww=u z=p*ob?3y$;I1fXygk9DkWdZm3B%z$3h4IVp#{059rtjaT@1CRbm`2ZWAT5_F8qQiW1{)f2Xq zy2x6x0r@$uejOMV;8jCYfd-+)%QP#%2)L2Ct9zHXya7!WtDC!OyeV=_;dD@CiwxBw@e3XCCM;s2O{h$qi~OWCwV777mr z>rl$`yL?jEizay-%W#muO-CLmbaG{TBI+%XT%UM8c1@ZC1JFPRk3JaBQjfKiTO!>! zg#4!zWo9%%x@Y~P>79m^Qbh=h3{{V@b&P=mj?B$d0nA zr;RbR)=|-v%743(EC6|$j4JrZTiw(qKjGuOoArqH<=waRKK~P~y|`D9fa#|@@w0Le zauOMP_)Mdg8jg@FkQdR#hr7SiNP$;y6=l3u55qy%NmJR@RTh|yfcghM{he%887rL) zX#=QIYNC-0`VV>t7a%Rfn4%eS%o%Of!onrzLIBD(^ElYkl?5wurIPTwJVZmZNcud2 zPjN9G(27{7^H7fn`<6N=A#d4|>ra$6633#c{HC~j&i2yRZ6&R zDwG4uAQwM?nU=76b%Nr%7mnr3?fK;7Z4Bm?=IDA1f&O}`Y6ekI_3z!?FAe(8nMWe^ z=X7Pypsb-`<9!twLRZO95yEQFN%ImdJSWHDWk$5-coYrpX;2d&2uc6B2$ZMerqcW; zKgMM!HzLuxdjA;){4IqFPZTP!OuUw^;WKyu^|E`9ImrB7g6VaFrrPwdYcEQG?4JJfyxO#gmTr{G_ zcjBm1b8=n8Kxo;;1Ba0A5KO;y|8V8X&IP5e=KlUCvPI#h@PB8G=*kDqCo0^h_a%$@ zV2@%pfx!&r3EKZUjzOP}k``&ZgE8y z$J|*Vl`bUEYtBalL0v(?-){`Ic3d(Gos}>FMa)qt7NsdUVV-{5kwM5G;0dRPFpBjf zR4~>NLUiYZh`$6m_<)0{sqZ~=Ku-^)4R}~KSO0HZMKSzOo>MUNyXkt%Y&bBqto81j z&pvzhvvd}o-F;8i-qqY5T0qF2vhXYPawiNVWQbDBc@<;eAFS_DG0$@&`%g#1c7F?+ zRiPzxaujvT;tgm z`2~fdoF~FTPis!%vHN!}V4ruYY)d{=ZE(vRI*fQo^o%jLISNk;js{@}V8&LHQ4k?G z-y~|V)L~wRRlyhRG%mI{oD^lyTRAzTf7Qwv!TgpYh3yc&a3`yBcsphzh&qTJ^o>&; zI9Kl{q#OPDaZs6R%NIR)WI_|UJ#drNfa@6mFzq%}I4Dm6GX93qoYy|U6XfzIuHY2t zLO=)>6hn=Yj!vn(Jvp>obk=~&vk&*b=6kck;H@QLy#Naa*c5e-;714}isYe!@=1?8pD5m z1PzKH$gLO1v|`=pfD+>l4lz9a`CfN*H?HxV$%nM#7=k0B5_>xUv0?{ES@G|XPnrNO zad3TUB`cK~y7?)3)%pR+ul_f#Zu^=%&+Jeqtb)Spk-%0t@}~SFa}?A4g&$WA6a&s_ zsg-9sA*pGGD?;4#fXmpUx6;f#7nN$@CvoNsI|PHHMw|f4ChjaVNowbSQ@k;PuE8aN zov%9MDE=2m4qv|iP4?$OJ*a(3vsp4h2PLvMB@a;|Wz(gOR1+_lf@Gnp<=`XkQ(osa zG*BePuIje`)97f8!d)1fj~VVj*33+N#g91PCT4|F}O1?5p%*L+HPT z4M8Yrpqz$400dN^M3P=)u_3}oQe0&x09=!^ez?C`0P4&XkT7PZB2b;irQQ0oHu=CMMs9CBq3qDf;0ayjrTCz8{o!`Yc(xU zA*Uy{_`9=8RX7BS{1cj7fh{?MMQaBDKkoUBKNB(wezR&6mU_$!!R3y7RebZ7pBUzh zvwh>_qjnc+`=MOk2n-~H#OW0}x)%gr3rW;rs|e}A@>SN&Yku+@+Pa)KHh3-l2ZRwU zrOqIvG#iwerpQ94^f5kYD3WcBl}mBN8kI<8AGAYDR$RVSmjfPYpB*>^v!~Gp4X*+- z#U*efx49ca92UxbnHwJ2O&Q&%57unwIl+T6tS%}t84zUL5eVs#X7!1zFAg=LLH9%&iXZ)Y(6Cl3DThyUR$+97 zJG0T9KJEFcl&{54FPA)3S_4(Y#X>#BXY5)=p>{%8*c;MO0rhX+{g2}do;?3z*22k! zwpwy1qVySH`IiU7++KZKot?!g5&DBo@b`hHZe4x`N4aP^(?-@ zC{i-v6BB=U{!e5ANfCGK6JTfXzro5i7Zc9${%1w!wR|ps&1Rv6>4w}>`}Zqtd+K-S z0+!uwVMN#3SS?nry$o+P>YSq(ow0^=O|3qRe)p#uW6+$W2O0j-)0YGZ!~~kP#53sk zLF1V1ba-SE=P_R4wQ?zw{$K~IDV5`mPL={Ya6x(6tTJb_ttp)QtE@QpdbjxGn~$+U zl0|ZKLzak6rJ%ly-BE`T+Y1we%tk3!tvGj&uPhRKeAIL6E?;Z!Ucg3XqmDCqDuz&q z#SCtt!0hNRP%pnKigYLiI1lbC=rQ~fDr_jI>1*&x_OO%}>k(0eMB3E+f<6U1MwIoi zmTNmym$2#y>T3hn;v|`Q-m+FDadLd(Aim)b?!V|gbyRu7Y_-$I9~;X{TCY9y#=S7w zQfCBxvuZnmOVGHbwy?AWM7ZmzTi#$vA77z7*Yr|7-FnkIzCfpOl9rd8MQsoe{zg=I z?CQIK%cN>@X0YM*Ax6|HlTi&A7JS%2f2VZ>L6sJtiRgB3{PkFF{2CWtJCe(R}8*wwPA%>6$*=|7&9?>WwJn>Irl$T!XEy7iPfPktgZYzsCuR zEBTHd&HGtnLdKnWBQ{fC0yjZs)KTzFi3E&<^%H(1>VJn7Vq|zy(tZ3VzQuq_(sonF zOKkh=3KQ=0!X`GIm%MFD^6JV*!0`U=Z;i{4Yfv|XG%a|P@dw4Ak&cHzzSY+(FpKf0 zL76Hy|AMgj7pHir(vtDX&p1X$z(KxZt_pn4v|&(#*%aGMr&#*uBQ4{nOx&i>ZR?WM zt*E)5?$NQgKr3tOgY+OiM@B2>vnCf?Fx|H_JEqwK31E56LJyHvz#kr?4p_^7sWmp& zs=>;@e(wkih*5YjV*nDkJU%l?N~9H0ak1P>{xviIMBjpKJn*HCTBbE!^}2r5t05)* zpI!B>zq%b3By$AEH5l-_685-WD3AGcmgD*?EA1VrOkd=&@B>?nX@QuLGhVS$_jZ)1 z%JlaT)uPN}y2Hi_%vSCpNJ$E6fiuKUUrhIbI_}QTNlE*@`~AjIatV_0)YZ^vU;=Sk zrBC$pX3w@t3zVCoycJcM@!Z;Qjr z1}mlV&rN@sxb={Vz|oa01?X@^Uvr4~Vtll#Y{M1-+I!kn4R>_CN9D?qo?F{$X^**s zuiWMsd+Gw=&3>V}b?X@l4tH z%MpQo`>yf86MrARacP;e1R((TbSSMvZ|`~g$d@%PD6NiAO(@?U`h1>eyNceo9OqFK zQ;CGP)ba#M0^$DoKSpb6VWEALUCGRlz?OxtGq1A6wAgI5eXQ?#8AiLR*V#a2Va(`3 zdY;8K^?73*z39E#!|6I4;Nc0~-a1D#^RJ#1<0%#~q0SUbbYx(agly5~tV3WBmmu$cro*+4wB zI3wbLYicp|I4;OXQqqh*(cM|;gUZg?0hQh8k+U5Ds+yq~<#E-{>v>9DNkftuo@7Vt z6vwdZjR2x-WgB?$L(x%%?TX1ru1`f3hWaN9pXOiPL|cCq4LtM9meD z>3u?g!~-m9G`^CibW)G)0A4HPr?+`JtBbQM`j4H#&w}D1H_ZgnG`o+4ab$_WJG%(= zH%;f5)sp-2A5gGZH&yQyh`U3E5Y})WUKyq?e^E4phdLnEa4AYxNUb*^C-e?=x5i$* zb$#zxBH*F|24&!U{;fab9mLc z#B}FpP0U_scdBtBZ#4l)d?7Z0lL(z2#cO{ws&i~>nA^k- z3zt+%2It#fS$Rsnd8BL+)L6E7MxVrRVR-_8K-kk#Jc&n7z44llY`Hc*h~YMX&fyww z$E>I$_4uAaAOy2?ZdB;-S(_=`a2(9rs0ygM5!r4t1K*p&nzrcfT-D^-6w=9Lop*Vj{EEB`_)hlud9U z*0=~l_%vJ0nr&tVIqdtH5dwYP+c0Gi+uapIHz=o-Uy+J$Xm_&y;9-8iJr!cmN7MG2 zo%-P#4{|cTxff@|yF@tQUsbyr0TyY$0DxC{Darlh?yC+6zV9&srUUn;^=$8nsPKS9 z1=%`<9Dbn*<7a~5mohk*_6p20{o^GDuN3-&SEVR|plGCh>poA{g@{IWtYIs~;iWS| z#sK2-^tmyqb{~%z0;rSOSft$n5J!*$sM`ioBbQ325F2cP4c9kc_NscN*i$hCt*PFE zPP${&=&ORXH0NWb@~|NI^Xz1TbS|;iFNTuie>R&AakS$MAC#eTbaUg2yXRjycDaD8 z*@_}ofMjDVD)qtPfUOznNVVG7Y?ggzf`i{v7ol%^l-Bfrq*|Ko5?q)rZ8M`9r-K`W z-a1HJK%d<(NQkt8eQw?|w)f*~ZnY4d2*LXA3-~2%*Y7`fN<$^rhK-VdD@c#aMzgD@ zT33axM8#oxGMtrH%MdY^nuZB%i*a&r_rX5l=*_P#7!4t8HA|%z?vbvi9w`vs&ahS- zCj0u|mg&j!@7;Yx`zmP!FdNYG6)sjD?>80RU%sd_FF5fTrnk>N^^1}$MOW=|nTix% z>D6dxKz?pfZ?z)YEkqu)g7zYn;O5#6|E~3R4ff-O7n+IcNYQEyJ%K)=4=`^96XqR&0ig_jSfbwS5@r=#u?;#x*Q^*;VwOM4w1(1U@`UCODxKY8fP!3qXd7> zaf|SoyFMa%KOgwq?yydSu39u0oYtFn~+vRPBPs`MDLxpq(AY9 znlfZOfU$v(z1iBE87q7zxutgq83<9UiX9d>^cM@4!8PCk2Qu?J3B0|ww9ZW8B&3yd zzSeW6)OM^TZ(#al?SrGA=mPTf2Y_A|M}bj8?TmX19o-H;aU>a9i3Kbt+uAb5Chnoz zV0=o}xv#G)l_#7F!+!5(*MmNzAsqMB_Wx;EA&&1WR%k~zJ+NokA}iKFT`1LiEh=1M zA|Va50I^fi=(Wz!JR!NL;eqp-;|u|b=T^KA_upC0;7e-%ho)68tc(AU4*Y$C1rmxT zL&IgkEpz|ioQqei_;wU%bSuoI%%<$*o zu|VxaFEn#_D%WD0NnNLz>7*_TR7TLn`<-`1^ zsr^_rWv*pLYZ$syL}mm;{rwsiK^e!r{ES8UXUgR+K~xedLC&9m6T+ZMiu?cX^fH3o z3AyBlhKA>g0TKax>Hc@`x)aNkbHB1>U_qBCNn8470T_W&G4%g8;`WE9g z(SW&wj2Jr@(C4CXAe`r|XKDWNCE1X%TYRO?vD;blgvkk5yk#8_PS1+}(wM1ZA}N6R zorVOy^6cx0`3VTl<$`bcm?~6)RfYoy27aQqlC%%Py%vm(F{wGo03s2;r0HX$zvVXi zt>;OD=rc`#uE81)>HKhRX0H32Hmn)0AD^PYtrp!lP5M5r6pkUZjF|*{yDRW=%0ieulU=rrFw;#^d zwj4V?S1Y|eBHA<`WTN<(yab-XC82{aXCs2BIP4tRUIJWN{{PJj1%FptBUUm!Z*?#W zXRtL5Kl)cnbFR30E|kiiv**&lCCHeQ&G*yJ5$~<)QQ{v#zIot(-1%Uy28={^Vhbft zyz;e6?3(B1jJEX7jJn>R@y9RSsz6qX)e0t5wk zAK1_M^Nt5wXVJ0vNbcYpZrJC|0KEc0W6y{nuL-GR3I2ET2Qypnv6}y`Al8K%0V+)U zktqRfC+B$K&9fJK?l_X#evo_0og6NGtJxz{6I0-Jg#2s?@O~}|3j!TZby$y-X`_%E z^0*lvs9UK&Uv|1IAtqey}k5EEJW$y)`rCRItW>eU~1N&XoD)53&Y*8xY*% z1G137+do<8;6a%0NMGxMK2~_}GH)4cC?cWgOTBsgNmrwRE7V=oE{yuT@m)zO3p!5o zHst^t{#Pk(=JR3|fiF16L?KLWq1!XhtoP7x8)6@sN>X5uA3%f0`s)}Tc^woGAXN!C`YsH5P`0vo1x_f%r!%Il~jXH z%r1@h&%bl`8v|`L4$%BbhjipxCytp2Q1me$C|KWsC)@Nc-z)NHjKIqTCA4P?#(S^T zpuK2NMxp99A3&j!YSHDjRhzPs{4mP~!E?a0_~%`ZrWxjcZSq6A|Iej)VfSjrV7@b; za5yisMLEww0z1cA;jEiBXA>&)5-6c%Yg%c`8Tb9OxQ~w1S|GOG^?5TT&0)Ezpfh>* zNnv$=|1VdDX1qO9M76Bl!9RAVA?tex5usRLV?*Fcw8&etihb zE0!f~phli!s^dVLxad8ACr% za*4nHG}XOZE7>PH9hgRc1H?;3Sh&$YSD2e;k;WWSIn{Z%jW){R!q)mzZWh}4dHl|koGf5P~12(W~EUY zm52h6BaQmbHKW;{Whb}(v`!ejDKuYnTJO%Mg%LnOUph=5AyEOnezqaVN&>b*&M;t% zS$ml=u)vE641vi>sY1Btp+fIfAcKG5&x*QsRU!h-fGcr4<+sVmb4PF_o)7IY3{U^` z%nonzkQ}wR*xMLw;G8Pa3af6E2gN|1umq0)Zm$;_X-pFwpr1#Rm`!*Fgt-B0lp|HF zRfH6J43jf$dcp%NI2Gfb-LgIn#uDNA4eRBjWUofuoEN8tuI=+)FYm{oA=H9~PWtb0 zC)9uLsJJWC(Jsv#(n(k>poBD^;{5;4T{;L~R0o0A6_Tzzz)38_6;HIUm7dyP0k>pN ziQv+_NFbh?lB8CIJqH@4d>l|V4))Br7=WCdS4TVLMD~Zf-w;x92|CYpF38lZT+b)8 zCL6>AO#X-H-TvJ_|NA(L17cw4zm=+?ZSGT=Yqp6LV$!ZPturG_)`p#N1&v`*KH)pF z$6$7Tx}3XnU7;QuGhxT{besYqL0&V`*Qa@7VDCEO?gP(=2)q&U3-uJ{`MWiE9ENC- z;w!=k5dhOB^RlCIFY=AkIRWBE^|{UGnr>7t{ia_uAmbB%cNqZf^L`p9wRU~Fc5Q^Y_t5IPZ3h6v0rqF{TLVDp}@66&bR<0isbjQWX@t3bCe zU^zh;Uvq`q=>sAL984@ufKOa$?T=B^L*G-$lAxqB-N#*4{l`w?5^74v@ zj}SR!|sZ~jt_8;vA<&RFoOdG z1B3-{Js3z&LZ2@%7!MsN&%9gkY1fo)nkt9s3m^*p);jPd8p+9V%^(hJA)v z;f~w?^n>xIesu!P{~OkNsvsX7f_ypQcX-JN{NeeE72wwshPd-YC8$}hoz+gw9dzt} z%CB}2datv~o}^Liyg#o?3xcZ>^!dLEHZ-^Vai_xu>LeSB9+142I0#qA>fpQ_z;-OD z4{^Z9clMtFh6U;XsA2Gw+#dD^nrk5i+aV_dv)vo7Pszxd*e8Oj$wJ_Ca%1A>-B}?N~I(a|&}tb&e(k7)p(y z>pB^xX5H_uD9@@Zv4Ndyq6L>nP8_4jD->u;hkV}?xHwycpAskZjz@;_AilJ%^;pP{ zEL}Ez1V}O(1~Aun1n)TC4y#|8Q$}TeI=U!u>LZwcK|Wt~fJz#w@j$xMUzA1-xau() z8p^U4T#;MSVrbs+%I&U+^(ZYFhLwO^7JEc2#53Xa}7`||QU z7YEJ|daHTO`zu2p3e3UTicOb+MH-m+5vx#6VVJlwoYCX0s^X7Udjp97KH(sQfY&I9 zY|2qWI^~Qb$gm<~4SoXWXy~5`366-VCNYEF`%&JTaLp>FbR^_L9a@Osh5C4b*e&(O z5o9#LZfedJC zmCaNO=jK{KC{{E#MSB*FvbXl#{3lD#>kTJC*S_DnfDorm4-!RGpN;{o{1SMj9Q%aU2=1Q>V+gon`x3uINI{Gy(`zuP(E+u>Ps3 zAyiOTIEY!Jg%2|aVn!Q*@7$#m@kLSbyKJTndU|@&sa6-2Q=?ehXz6kR+-fBmGX)Sb zXl=xX`}!Jgo$kPPX&k^Z0|`bKuHE)%<@rRYX+=<)p_ZA2 zV-99J2)l&M5o@kciirTS^=O%iaT%6VS$rCq!qAP-MlY`ipex{YryUC12PNy9^yj26 zQW$+-bv)hu^B-v_;j8o+=o@69fW?L%^63qET|3SdQ*26WhFl7eqjTLy8{>vK) z9xNoE4oOkWCZz7-->Em0f_i5*ws8a1loh=DRWw-TkGz7ek1#MO&^n%uVOGFz};3XcT0N_uV<+^jSdaOL>^OE+{&Xx6< zN1o%t!T3(oOHdGmGEA+6C{Pw^+O)RBN#)~dLwAR3Df?%-bz zRahmk)X3FiO*Ozv4;CPrs8M!Mp}flu1A{!x z%1*^RZ$67X)e-3a19L^BOCkdV?`3V`(c{yQr|yC|+tA#v*~Q>E@xmH%pB7V+R1&Pd z+F^uHnjs{k4|{uzZ%vOcZiWBb=rSrKOhmwHMyNi3F`d(OS4On$pF;Q>z*r^(pu z0UocYrs%B<5b%jQ*YOBMmR5m7aky0W?UER!QI&eVM~oDPKGNS5`^9bBk5~X5J33m8 zKhHAp z#!i97E=I+;!Os}8+1}rIcu?9ZtyQ+R@hY2fPXPnpbK|U-i>GQ|kQbeQESK7X$-ATm@-+-((* z0wfpLZcCbpgls1gw+AiXq!H(qvGKm(DDWYV=0v6RW17i{BU4Gm6@=mZ|MT$?zjOaP z=i)>?dBdEXFw#*=#F^?g2w(9d+vlafyZ=`P19^iY_qW&F>*wH*>!*`p^9RS{T`Pn~ zD1x9?jL$dc@O`_`1nugC+hoaI)N|H<)udn$GP&Mmqc{I#a0O|q#V<^7pn{+IT`hP- zvM^Ix#(SX=OpXbV>BPFbTAn1(8r)fBlnE-rc|(-;m|H*cUZmerc;KA~6de3SUO_{M z>`(so?uQ;3nBC5wso{TXuaF&+*{JN5to$RI3@9*U)nH}_iVF`#!CKoyhK#g4%t-}iYc%pL8Z6yAnoTzU8^oi084?DByF zJ=(o!ULsoaxYGx2{BYE~7yxGcwokTauv%qtpNNK}8womB3O>b0J^)y<(kazrOF(CU z<>9x`9osYHVck_D%~6cN5Sz6uStq8`P3BTPQjHF?Ye^%1MhLe`FPTzt)?bZAr;1<` zjJBo7EgILvReOh+NxWpV03!DK&CQPjhF2Tt2UZ3TEal)j+6A$G5&}kKtA-jfHlxm# zz6_$wR9!_BC)4tKC?Vf}3n(f{n8ZDCCbJUa0X3_F-&W&KXz$I(exl3I{JpcgAIbPxSkR%w zI)!QWXIS8a_c9YbaL4~ehqk%Nu)t^P9k_E`y@EpI0R0|M@U;mqOQ6v{b;PIa(V4tN zJHu3fu$VTtqt!DOkV=#z@ojPu&D+!-+(uf|lSjZBH1<1Iu5lWF*A1(&fHFJ}xvR}5i7`AM`Ukp_HoBWOKkB3{t0hhQqGb;0F8$fvb`4*2?{MRjfXMC) zR|SBj8)g1eYScpz2_2^;Z&;gX=xh3UO_6yOv0mZ9YT~s zSh}ejEL+>^hdG=a9&Ld{w}9s1F(iTAn-N79ln4-=sE3Xq6L-}093z!&amoTQ&1>xMqSedvqN>#a zg<*fi*YXjCYtCi(wHNF}1+9<*!rkjMYGH8yw;_eu?=FtbIf~!bfg(_0UK^e<>a`X} z*w5U^2o|UTCg&mv`ZmPoT8uH>`tQ$eSdXGi+dq7ZZ6<7Kv$qYI{U_i^ECu`m|CHsq z-geVsLCl5BmYv}E`1V--Z+o4QQw9Gd+e4_-A|I=2baw7IX9S<^&9arVF*994IrXA3gy`zx20IIo`H~AAr!& zDs~J0ck@{PbJdEArwi`Y8IYSGYT(Dpg1m@Cr+|3jGXa?W)C!xS00#wh5=5`)Fvs{;dMmW7 zErXdtV#_>8MgC-!x7L^h98=cKY94L6H+v|KmB(1C`W3?Tir;6#EUco$)F1b7npnXd z8%uz2O0G5^N6sq;x1EFr2X#Ay5z4bGEHAJ_gEfWO!!R!cs4AY(aF~_&Ci{8Z6yiI+ z4f%k@Z}Z#+Hl z+k6!%|#1U)w&U{Iuu4D(=_l% z01lK}(JOnlGG^S|WwB(ne}xtc=md8H%UeXR)lJ|Vhb#|Z+Tc6sBm8&<2G2#v@d|JB z0j2rU`a}tuEtImz?r~sRw5}BeFBK@TsBEOpNd$1fFohr_B{ z_giW8Twb7>mt9VI;E;U9@~7-T>6ieR`B*_fCBwV)@!WAY31Eq|RPOQun6jVk;+u&U zl$k%sdAl4sg|GG>XE>@$_H$n+?UiKH8A|rn5XK&07u!3XSq+6u>}6uBj@rZY_p)IS zj8;*-|Eg@ZoC;Bcf@GCsD36PPDw1|b=3Y|~=_3#+9DYiGClaK9*3HE7bV6}9JCv_M z+D1Lb*!#z9ei&+OPF10@hbj_vyD(csbYUf!CC4cu`gFyB+Vnz`;~Y3(euxTXF`Mzx zPwqQ;uXJTNpQ2LiYzB5PoE&EA*uF5Ebg4nc_Wz;nfQs~JAG;BZfGbHyzJN!tX%{oZ zqqGmt*C#Yn5BZD+EtOG){Ll2x!P~oUX%K;i|E=zxXy|}nmm_xo!ON2MIb^@+talf~ zgr^2e4|5hSzto3O+%<#>E0qb^B+y;fpD`Gml(5$o=>{94sK2{F?n8A{6ufzLN~QfQ zbj_-&r0%wcD&SgwI3+i;8NV0^l)AR*wsIwRb|50M_swS=s&Lbhqx|^hJXwnjPyGUm z7UUYiy@*F~UFvd%aA^|N9IGC@%}vlf$QdB_zXmg)b&895Nr8FTtK_w3OU1i^#8cw1 zUqv9vt0(5Yv=xB)GnGL4rbYz*?-dOsGE#{!n9N{AKx}{pq-!tRq)J?ZDqS-tqNxEjaEvL)D_HG$jGE2n(|0fL7nFgK$@6 z9Lg3vM7X6Y7Ff_thbdxN+8=Ic_@{7AN~5}pdK45Cd^FIxzV{2HmY_8EXS=~YRz1?n zSYjIWCdP7uzD!82;&Kgwcf^?(!U`K*d z1qglx-TTE%yx7R0f&eAHWM0oTiete9-M89CpbDwNhR(ep_y(4DuVR7u#$CgI77iw6 z+B9N=zZ6>N6+)L%R16F>4-)yJ=1B@^`*kf;;d(seXvyZhYre9DYI(jlml$6dQa2wT ziK4*RFSA&qbz`{ztx$`BCy7Ino_d7P$MKj`eICgX~ zBdr>2NS((uicEPFDcotAi<@kj5T!_J>jLzT}2}b~sG%kELrM zKm&?I1iv5*CB!A!!~>r)NT{eqUrH8u9i_62@&-I&B!8)WC?do56Z&3{LI*iz4ci*V zt>!y^gR77k!py&T1RmIDHj1CtgzUric>k~?tQn`V3x>9v80Ugo{DUAwgw{0L?OH4?f zoqxB1q=_G|HNwwljNjdTQ*A%H5xlwkgX!us4%nTF{N8}p2JD_bF?^Wrjn=J{gaq$2 zYWT6=)$9)Ow(7_c3ix407P1M>GhrhWF{vN2_ek=PPn_Y{9vvW%5De0v!FsC(JU=C^ zmSbQC60i=>qNf74BL^3C0dPBB9DuFqO%zUhQ=MZE2J7|0pm|E5*Cm1b>wK;%6ckne zUK?(Q_#5P1xzfTpFElfQn$FqsRkXkZV2OuMF@N2p7@sVsa?F=3DYVgRx0`p|IQ*v* z4bjo|FJt_MpzUxUc8-mT(XJqLnjra)g~zn&;1;DAr=U8;{5|ytW~Y34&hL<|kt}`9 zYb<&b#>S1DgR6L>RDZ_sQ>DPBL{PFPP3Cek=T;&U&p0RZjB*rv~-j?&9FvKHR@yhVc{43b6Fb4Aeh}rpnDq zzqY4DJyg1}30~FBF-agO8o3q@htt^cMC@Oq?OPE~NRffC00Y0lF_kJQF2Q_shSR42 z143Mj&Mie;N#yo)l7Mk6^H2eDW|1iGCrEmeUDIAf|k!uSi0icvP+;1lUaIJO( zVf5+KK8T*0kw>W=^M5bfe}DIlXP?eE-j`+SvpEUhIr*T0fV?Z9FP_K|SbC0P-rf`W zzn7_h0vp=3i-(QkorVo4AZ8b~u*WZY~PttaYG^ zms_gKe}=`h?aRGjP&F#fKV_|8;^^sn$Q$DiVC`8|*nAy?aMm>~u?HsGEd!GJ&*uTf zSG_J^7~f|iM@8@Nw1<>=Y~>uvcMzcLh8=k2S>ZJdaP63cMLoErrGE1K>r(0e$3uR< z#lirq6WmCI2K%uLw$r#8=>7A5XxZvh&X;Dq>7U<(n1l}oiI%}r)+ z)`lv|5Nge&e*j+APw2XU1eANIl*r*L3VaUhVfSje?dn~yC^}44?c8_K+DVwzpey>S z#JBGU=ymvT%pNni*6;mEUrU_FARfaZ&|}QqZ7&~JTr_k{jFBpm(X3o zCxb$$(|;eSHk7^665+RZ_xiQL?=s;3*cCwCQ-ldT??}q(z}P!BYGdO|zKZ={dlVpB zcHr+F%$wNMX{L!p&gUvjkQcvpAf{#0qvzPVm6U`l6h^jzgh9ZL0W9wNNM=Caj3ZSH zl--$Kf12y-q<=U|+m9nrWc)JYe^hcnzGk!TBR59&caxq>8#C@fL%Mq$i8r?PkVEKw zc>Z6VxqLlbTGzuQD}_oKct>QMX}TbK#ynla#&pJ&IQCBnr0nf?cBO%M43~|IHYF8H zXyLcbYbOz4=_5a(Sl)F9W zRSwtK9XsfGj3+9z=0@Ja01r%@X)U~Zq3Lew;i6y*Z6g(N!j`DeWs^Z_yGnnwj8nf( z0h{sxCagX(0__}6=aT&b$ak}UB^6(p9G$bM^z4|uZU zg$mfR85bQ%v0`y$8Tp5es_o&ks!?FfOm3>Os=<@pAFnV9l~Uv3JK{qD(B-(YN=|X! zl@w0=@!Ntm&z5wG57MxY38}u^%fo{GTW@GJK;?(bGFXT~UAb$=Y?-2U1GsgSy54Up zU(5RW;Q?NFwr{=Q^CxxzxP!Qa%nlIO;{q~I;OTA{LX{dBeB%*-L`sT~()yDW8OsYGC|L(`?r4+Q;QaN{f%K{A6i+3+b=b!3MQg zd-#F2c?t56X>oMqjn3>yKnPGd$3-h{rx{9c8WET_p65X;60A0fsoaZE#MgEa__ZUi|Tvp4z1ivOQH|1#YR5f|oZ^8?{9eFEzAzEcc=|J+Co z4|Vo-mT4~r$u$hquC`ZQit8ZLg$*u$NZg9%zOQm}0L{#CBX#RafnH{Y)Op29Wm3BJ zpJ!Og5o|VQG&uNw5BTIE2~`!Ye`ShNoO}P}d}uW*@X>fM=V6@z+4*@bu~Lr_93|^8 zqyX0A;%o<{XW1Z#F@UwamssGB?EvW3PX|F=0Gz=)zbM?{0?#D~DMB~VHOLG7zh{^H=R~9Z9o5EaOaT_eC3npmH9?xQ?;qyqrZ7-L8)Hu+MehA(2BC> zTa~xZL0hag>E*CQ<4@%SIwG~b9~f*?_-oach>9H4OY8stdeH9+_g|I?Q)>p!RWb(} zFs)GDfrMGAoF)u!q!MhfqCLCT@MmZ&XMmY&f~doJZ1!xHk@-xwH!m+ZTPup2)qqx_ z5x`le=*aV&*Ec-|f3uJrc0+ zvP_#m1sQ`2LMKUEltttF8tHqfhM)Pme0%h(E2!@mi)iV2=_i8#3ia0;urYbB5O|>h z|E+5XHcqa{_e{v;=w-9&fsBfB&ndtLt)`;iz> z*90=V@L5?qJxUWS4WFoW<8q^P&0WTzb*1+!Dh#b*&Pfno`Cov3`Vg=hRSlf^UMb9XxfZ_eYBcuCGZ3c zr>dOS)CgMVPfYQVG2lF__Hu`iUs|ppbuz5bb`9>}!(v7+Y4X3O34gcD>!ksc7RMrF zY<;mn>dcjR0`s+YPGkFm^_NEk@P~d;6Ukp^`pF*Li8-X2}u7SFW@)pazFAzK3>HVMN8pDp+h^ZX9KPwamD3E z`4r%Z@a||5wmVWakk0>bL*)#%<>N!1D%(qnrtURD)xIi)B2|Gn5Lx`WfBt<<`2SoC z+5bQ2E#M9Vc!Ti|cm7Vvv7s=YfRKQ_0J5vF7MjWOQLx~xKwn!C+d({2^#6%$KXzi{ zj4^`Gt={V8Q)Dpc!M?EUah3RR|F6wz*P5$+iBNq=Si#F20Kd%@og8Rijb>y`SQMLSwYPfQ;y}rX?It*gJA;OS1_AJ#wuynvLsQ8G zgj1PG8(m2^QJafJWE35|pFIE5&fcA62b=1oShM4o6}tor-GW#e!&j22TC^X?UHseW zFg$tw72Umbf1jo}fs324mITw;kCTo9l^aZ2?$U-N#$3#WE481eH2@R;%DFIL%tVP5 zNMb*wM~_x|o}a3VJC6JX>#Eh%b^cl``qeuI&sFm+ajPbS1&s9&&ga7u@FD1%n#x9V z07hE+?+m82R)?tgf}kJig&0r{;O8_Za566lN8H%x^p z6xIU($?UKpa?1aLA0f!U4`atj7iGzQHBn_gOf>HZ?gn=mx?se4@A(9({XA6;wJ(p6 z;2GyYE1v(z+#t`awB+`voy0K)v92eV00-m2SE`#kK&hKA<3rG3Q?Q znLT?Iy@`qFygym3p1>eTo)CJC0LjU>M99a`AkWHT0CV5`4%2fNftH88RR$c&#th!V8P@y`}|c&#;fZJTODjk@Wlf?vNOC{eL*f z^;QwkJW)P%p`?*#LR&5st_jpKck^|tui^|U;)v+4ItBpXhU;RG>_V;~$w&K+>}~r& z4k^44z@ul--t1>ecFyq_ED_B3dl7k@+7+)|{IvuOF2kYS8pnJ$q@Z=)&p4{P^RNR+ zoh~TrO`!X`iZ~xkr(o>VygXcZ2y$(r^mIjW_j={TQOEuBzfimX|2Ycy&HJw~T%hmI zhzENFvpff9KAJ8a333s(-#dY3{~+m*Lnw?>6&yh*h)h)2?oxbC7@GZwSF3UbM)jq3L?oqVpJ z4%^};KyU`OsEs2G;{n)h>``9{O6HxNg#AW1_$!{cE$nRZNO*XB3Lo_ zUZKNlhYBCqCpeY)+Hyyy@b*}}7*urzX;%L%3$mA6r<$#{ZTY)}a8XMAt+_mS zYV?C$hm)N)gis1|M#mCo1EJL9`YP{TIz01KCrGH2!FtO2Ta8P`n#elulY@~BpSe4|>ZM17Q!;{sxJ<2>H2b~va{B|u@Kgmb*uEKGDO zIB9yA8srg@Yf1dD(2(;Kle< zSuVgStE0--qw^GxGOlA}GXblfVE#B^L^oR&thtMPoyau^4WNX6n@9*5gQAv-kn^vY z9VcGk#vvdv<-H31=nzb%Z36%+@EO(!+x2PTJ8}nVn|gbh zdBCqoZ7q*0q1i`NZli!=(BuX( zk4jf-B5jlmKPd&LNZR-2!5tC7gr|EJL1pJ~NqZ&g1}1+He_0w9ds+^XsBJrglUXNC z#bTc|>?5OBN8;0VG(5EUOyiCpP1hp*4Z0HF?YGU+$4E$#&?4&(2rS5~mmr4#0qbzU7HNveS?5q54(dw@J4@ZG3*G0EUEd9YJ=CPe8u?tUP zDCk7_hnn!~eMwyMmk*HkdD7PzUAEBxPz&q(w%~Snm#&M3wP}r@c+lHJSJcX~+xAn? z`C#(hyZDEHukHo2tKtG~M&~s~DGh!qx|J%bY(0F4&bCJ4Ji2%_C{!_6Q6ft;XH0CD z47*4tt-mt4wVU$=!ai@j&u_ceKP-0p;1*5pM(-?mL-#oCDhsjIZZuX4qpkWVsT?Y| z+5zE{PEI$2ShL^=zH!B^io&j~9#=GuEe~I>Y{hTs$P}M;gIMsH_a|Tl62l6aW|S+C zHBUE#AmaOcl5CAS5JI@u;jV<Yu1eLJO;Ksd%xIE9jan^ePE&z ziSIeD!H73iOrwcEh@zr1L3+GKmn~dOS%r2J9?GJU*J!GS*Ygn-tR;iPp6D7i^WzBH zq~GYH`T}TjJP(Tv_8xVV$N?gEnzS;{>$UVAFQ}OYv4N6uso6~I{3v1I!BWQ zN=M3GMyhIlkedu^(k!{lC%0zc(J_;ZSGHpU^HKo1_`!%X_{g&US9d>HI~2TESA;#z zaSenGL=$}fpiZL!1#dMc-slPu)>O1T-3FK0k@wfxD)@kq^!23g-E1 zF3#Y_xD@Ki_w{aCL2!<6-YH0&Z|5Zh0T(hd`*AKZnx`^GNCTMP!S5V{w};0Ha{f21;iCOpAF=p607X0fm@C49Z~>ZY{Ux zcOXZr;LIs;%`-#g)cue77vl6ETyWpx!xJrfv$RP;an~qX+9^Q4HK8RJ^sV=Tn2NU* z#R-k$ZQZVS&uWzK=XpY81p2yPM3e*YCyzdU#^%Pez5&C3;n*UBm48RBV*c<99pB9K z=BMg#ymPmry8+9ok~@!o!VAym(0|&+O--n)xO%RLIX7?5Cr#y_7F$G0usuOCq| zv_Q3X(L;M2-ZxJcqO39<7g)@YO9LN#+#WLmp_?&klD2n) z9Y<($a>v}bspXO9<`8*#W-alyvDGx4g{PhwQgHs~`+ht@G{7DKE}1fMeM*L{gOAF3 z6B(Mj;sn8Q>k#DPM7Dc`> zQvO8IN(L*eqecUI#?A((D?XLfa8r4<(uE76-l==Av=+LjwZo3%B_Njw%~7tg4OxEk z#tVciG3?8iuHd2$RlY`ClWS~?$UajN0_}q?Q(B)Xk#@mjqo>K9id5oyPUF401T)5N z4u}hBDj;j;-^y6R7(l}w{o0z&h8w)Cx~Mu{%Siwr4+3 z|6?{!^47{9Kl@Rmj;xgE_nC=6j$njaEwoZtk(E{~q*^a!PWR+h-mfE&P0kP6l%1`Y z7LLL^xE06qd|H)T{Bz|h8Al%=|3a+Nl_X}5xN1%TA~sj|CzS2jf|uTB(@tsN@iP-m>uc=;=Vt>*>-i#faGJ@p`^+#q2Hh zW$mdRFd(~u%FBB@CyZ1aY5$qp$mEmKxdzbp*oq~G71P(#{%C|mTe5~sgCpM>bGbxs z8z3w^!w@@3f0~2Z1q^fI6nwhfl+)^#z458JDttReSpC{j$jMY_DTAsNWz^@LL7~q^ z0k{Q0-hxV8A#%WU6W9`?4ZmQ{B%;uzGDa?GYn$0{UELcNFLQ+0XxY5}A~g?Zy5^Fa zEs;nFG(y}CRq;z_EnH7;M5X5uwWOx%YPlJ@;KVK0a{pSRpZR*DHqo&0f1>UTLmf<< z^6P-cr*r*@&RwC!C@3MwjAv;77tP};aQU%%E+|U+(onhafPkBqH8&Hkls*!pHu}$q zwM1!=P^|P(@1zJuadp;{k1Ytrljyl*&&j!| zZc3diH20Fv#qpDXBEYpC6yH=zTJ>j15%_<}0-N6*2?(ltS0*OgZCPW(xp)Q#Cf_&DHe38|g2!%m}V z8bfuPHku?L=z~BBb|asKsD~w~N2F%s0lQ8myp^MY6C54RYMV6!mQbX>6&X*@rL(d*1I|w$aTvdajKt+$=ra3Eq9wjji zf=Pwdc1U^}PN}ql{|?AP*SUnlG`os;!|zMUE0f5DIX^L+DOtV1n9Zw%Ty{$*OY7{J z(U6Xr{;|5b!7RX@qWOa6p`rWx-|#~iqBI@B_zvb#N&in&q4i<#(<8 zN|{?KWzZ4eV3>X>UeR3&)2)B2_Tf|u#8}_h)fa03S`Cb~?!e7Fl~+w|bS5B|>U0Ky zc9!HcwKKdpkt*;FxSjlsumGaxYoWk&(yd_U@W?I(Y5d%ozZs(6oQ#NqFJ<|qRkZPVsDP%Kb&t?rEJ0 zQldEzd-XB^e2>>ZfhR6lUL%mlW~)Tk{B;>(sa(kj$N@z=KC~W^N#`SpHT-%xL6IzW5XQ_AS__b6Bj{6E6!fqnl@PrIo9r*Z!SjD4^ zf4Fe=iAm{62-5+!o0sp2$A=p>RAv9r4>S_^owGqDLV&GvWx7463T~J3CxWbA-${*8 z#GXj3m|!Y&$=^Uj$0=J8XRR+SOXB^uX3Yx0KEBqcq9+)tp^<*Fs&5{7(5kO}S zKa4ysud}*FEq2`_WPu|l+dpRG*ee1nsOF38?>sL7WgqVUTTVKxRtQ*=^UZ`HJRb0+Vh?Xn(XNaiI;A`tfA6=m?Nru9skDL;B-A}+4}Y%U3D`Dy?M zbznPgjD|~T&krUdku{(VL(UbGNO^TL#xeyJwcU*0R|ya7IEM2o|EeP64PqrvgF5JS zY!^rL&syjZU1*>jN42*vr}A`Hzl9vZl7IGwKoz(>4dLmqNm$>#2DOQd$am_LKj}!M#J0Q-w&huNz6)j*XTq)0kz^pWwxWwgtedVn(4HpWH)(+dsF4_KePGq{31@NsRnUe$DcP<;s z<8yWA;voUj)&t*p_IJnHJ;3o|trfG+AR@t6>~W2Hi^e6#b{J&LD9Vdxdi7Oz+8W7F zf9&sUsY?XQ)(B3U_f12!wrA*?#yD~&;TSE1@n)`w_cd{+SD7Z6?8BRRe5)u?^PT(X zT~IL2!P?Y*7|zB6Ulu>FeWM|!Y$g(gLtoUfnrEWJ$`ms|hC0@Fvaa2TB7L51QGIQ` ze9KvomilvzUa-Dv8gK1{6?n|F-x9AJazwDw&|<({;V_@U8#f7 zq*v>Dt^mepgbTS84|>?69ze;m*FqD>rrLzoQQBmu@RKHC<~o)o%*{i)15Y%D630I17Mg zOupNbrP;H=|B^zmz3-E|+%lS0^&chCed%xFvCyM9^QPboO;4O_=x*HA@L z*SJz{4?aKFr;dvzZQz~W3Y$(maVpL|Rh-I9ffHq}`I%v#ieVjcTcyu+Qh9%RYKaa9 zxIhSSyVh;xGm2!;56!2j+kK|TQtJmr?QJVd;D_ewZBnWjtuw}K5is`~IB8Fg)#!vA zJD3N)g2u54L-9ZS-y;*l0IQ;aZH+vgN7Zd6gM*|j@mSqTR?h{{!cCXNw3EZ4DJ1aF z8&wfu@EI?h!47a+ma`Or;$*GWDM(GoZl1*Ac zk3~kK;X|VZ7_=BzNosQec}U`;3I5^j)z(ztJ(yaf)U0Rl_*E%Kdq;(mJ#xS@f! zA7ZJTRXpZQj&r@?xQSG!$!KR)ZvCm4JdZCgn6If0rgPwTAuEW+HB8tseuCbe*2D;4 zpCaxhAsCwS(DKNHBK221up|ycH8TKkM2TfZbdp&0lzMD%{$O6S<#QkZfLIG1{d^1JUy;JJnaK!(}faxF1!q(0<+j10+2P zMlJrk4%$3y4Z?=Cpi{CMzPaE+A%3?DZ-ERybm;2jm1hi$MIl|g-6z*U5EfKFSSgmB zl!S!f+5z10(RFS=CuAX{zrKW^KnA}FvK98VQdj*a!%Oc+R=H19t9O2m=5_>whJL?Bn_;Du;As7->DKMQDOO5h8&W0 zv7){6VW{u#f1L_A>eh0n|0Ayt_n#=#$h)&%drCLsC-Y+ctF=xejv^oOtJ6q?k+iH@ z$C+pw4*84B(8_h_Ra&_YHf|RsW`&rtyX3I?RzSBZv70)Zm&pOzUKa^DxL6D$9I6Nf zTgP7CLC&dD>5&}wXC2(bJ>%OBV8%62V|!q?_U0lm(kH)!8aG25z+^?7RSrcGe11Nj z8W0tpihW*F+_OF@a16gtG{|l;l%)Kir6m&Zg`);FV0Ej2LkfI%Z|6j7ymu|<>0`(^ zz197Nbc#xk5EArg)thBASfVHK_(Y{)QGSnZe3@PpEP?fEMW2dAxg{UJ4!f4BI59H$ zakJ%oSt3Z1f(rm*x^P98ff_B@$fl+Zl2T`$Xsq9Y6GV8d!@l5LL;$w<80vCW|0t56 z<`}-NHWDWdHWcvjJe-kExCUl+kq8cIbnnb8mMmPElrbV?^M_MPXO#F#XGA3!A(z`M zmNIGcMV z;>Ws3gGzgxt!@oh&#?`2bLPY|ni1esVhhBJanJ;$#?n=~&vQH%bVxf2kf{E8Z|yW#IsbiN&c=T=}Qe3%`Ss08ljUfwXChR#)Kt{h%MX z{y%gmFGEQxEFmICb4zCpu7pzM<}v!k=haA6rioe72!tyJ)%N8wzN=CpWM=+UQ4j{% zc?84k&!69a>=;9X6+YgpYx0r%9k1E{@(n6E7m$ zHUoUjAGN`C+_X_?ZG=}JK&$3LzPT|blBn?viP)pjPGcP`dhhzzht!PwE(N1Stdcy zMN54TZIAy>o+l5UUOf2l+}k|EH8W|!fnZc)jmu<>1=)BMMn>pm>U{YpZYNI`$m$Wc5Oo-0YIDdRMmvgyU+s3xu;rExxYk;LFS6)oV9J zdg{oFqG0S5R$+_&qt`jgsa8qmR?)QH8$V3M@BLo6OS$Inx#h-RT?_Cq6Ez6Rp}JTg zJ3C7Q)nr)4%15cCl)Pl43|O$PHu$5y+2l=dM!XbOiDp(*=G~F}c_v`YEQcd5Dw79; zQOH;2Qp^qJ9{v}?hA7ZN!{J%-sX6hHyGWc7Uk{xePYynP`}O-mcBRbo;Gmf1Sb5zk2o;-Zgdx>049JMZIUzg)>n)>bOJ5cx()f4S{qb zo(*lc63S=HwrhvGyoeKX#bn3;OiV8Qk(5D9+Z%7}$qS}A$B*)=OWc)GVesiBPzUVp z>76UmGYv87kfR2QKdHN`EF%CPjgYE?3ygqx zZSgiyPlLTyZNUc1E0hfv{P?*xUt;n#WCY}s`=8h$%us^g7kjBLfM+H$agoW3S%{@k zgm>};Uw`&j8IidA>u3685si&3EgD%|%Zb}FbTlp3d)=hF5l}6%#o};yXKyh!Xhesg z1jZ1mQ#lOT+Cy%OK(bS2ju{^K=eg^Dz{~+mZfS%%Ugw0*Y6aYRXp|C>4%imBUH3#Q z^-enwt;A61*Q&-bJP8&_p90_=eqM+@?VMCOe$TNVM zeOJRR7fUcsO}SMX0F*oF*|eU>$ z{>x|xJ~x`;QmLk#`?2OZGhxy74lkemup9sS>!cn{SRP{yDcE`Z!L#pb>BAfSUOxMt zUso1Z@!!SiJcIaoFZpj%IPIpXbmhzo{kz5mJNKTCsP2qfQ4=*bxwS`5%Cr|U=aWDc zV0hyiD5GT$fEvZYSFEvvfXwW1j?^`hP&+&8EiRmeL$Z(FJbC^@x_@n2R&4Ol%cvOBQP}e8wMlkH z?7iZGbR>T3{tJ69Vtn-4#90KmdXojH%K2f(xcu`$oWDPc*QHEAA9z=}!MkN>+~JHo?B(8%FKD+}<9E=chuHK7F1SBebB)Si#~FG?zN|0Bf-e3`Jv zr|JPP)9~7BDnD{3ftSI4|JnCs{I9j<;e$d0Y6G{+s~VNstt1!}1le}rM;w8$-pMqc z=7~^+c@_c1d~D$*5~%VeM!2n#`>T=X?#8069}Arp$*^J8xsGY1&Wc+Y#nS$E^hV@m zSKM0%M8;dxl7?RFeh%Rq2aMWUlbKr5^du@e&$re^!)7U|wG~&egQe7V<`0$U3bG%r z_s$6uZgJVs1+g;bP&T-OZS2&t0%?*5 z&X(p6zp5N~Cf{iy1lD}^NC*G?hQBVr2L$HzdOZ<)Qu?aVeNRy(q#SxV(A;S8l=u~@ zCWHPNa;ObLLFR{=8`y&cpFaCbj|!{}Dzxo?CK@u~@LG=G>v973TAsiR<}{FL#!mi9 zc}F;|atUg2s6wgD!V3v{3FMbO40-opgc%HE)xpD;kmBl?f2IITN7#apFICV z4+#9${lC+7#{xj0L6k0k-h@Dm;R9iJ4av(~12|0O>qSdi{4$%OLl`;dSUCC_&zq0y z{qwuuJQ6&+Qm_H^o zx7(S+V&5;si);aqG=w3v1w#9*Lz&SJRe3IrF+D%rbBSu}U&zcg7N8|Y8287W6!`sT zUwQUJ1nKvGRStyNewse(^nPVsbDUE#o7ph0sNY_D#0$1B>)z#BhBNHg{M>`{D9DZ$ zZ462Zj2P6|RI!HFbWgxmz$Uk%HMa&(OO}dCXF=FT4!+Z70$HH0 zhVb~mA2DJm1IoDQ5ggC};*T@q* zHJF$Kz*jYE0Xw<<-Cj`zQr5X(AS~bC|CjdSd1fTX)tCT*vST>g5z`9ZGy)BgpmGQJ zRSa?&i!3fOVM+?)rCdP3dXqrzTNUxRf}0r?R%K#hdh($b%T8{RSu*gpR6%9(t6_Y_oy2@b~kaUEj|K7t!{ z-PPXmfqP3=pzuB?PPchabF>*XL(f6`HK9k?^ub?tNNY1G?Ny4O7?_t6i@RYj|BV9J z1J#h=c&ivf?LIAo@W7PrCPC}-1WDs&=^h}F?2d|4rg@QMwvd6HNdx7hG9Mr!w4Q>J zjyUyD=xe;Ny%det7T90P?0+_$`44L46WaR)Yj^OoMI{4(e<+hzQ?HgVUouU#=!`HM zNvL8|-ZPk<*W9aWWsig{A#&(`;{SRvXwj30whO#@ufQdN#_#OH?g$(Fmh9s|&v*oc zl3JGmEULAO4ULBXQNYA|)2NV9Dghxo!nlQfWx&UW3*XMX3@T$760&+VmLH&tYZTR| z9BShdIMLw-NTuhG3V0gNY<1#N8=LEauukgvU8SrI+3jIe)_srW-1IoC=j0<7B=cBCMq^PVrbDpNA zc5&?Kkp_azX1l^A{L(l5J_hxY*eLLg&mul*X>N|hl ztpQ|p<>lkfYl^39lsr_c*pV{CP#c$Mxtd(j9$}p=C?%Cv zBqY(wV)yY?_LrsUlXcKJZ7=8_f7ZQ`{lpNoC0lr#nEldZ{KP9g?R`g|U&#Omnjib| zlp#o};jx{bL^06kSQerj+2;8Zzr)TQa z^%Ov0^%s_m+3S&1^04Is3*~#uAZRsNbiFXuP|-G@7i7psyt7ddmw)D$g0!xegTMDQ zAFquer;)Gex~%)t<9r(Z_c}dy)k(a}HdN_r@p!R{QO-6z6cI7P7C-jigCDu5X0`Ys zS-gR}?P_xO?l^_>g@fIeF7865mf7w`tF)BrBNGGb)CdAZzIG{#fEk^yn5hcF%w}QD zNCT-v4f8~QO(rU1+OH6XGHoHDzP5cl!0bDLKHL)wYKb{M-D71eWQ0Rx z7pC5mk1*zJ0?jN5XN*VuT&z9QwFf6BYYa$;CS7~1j^gUfeMD@dlN3fzgy|xrc8Y0M zY+}*EQsF#tnqCjs-@dUBhpzp}H2C+PzB}!mQT=}Ncs7`Sb^GkoFDam}_65{j1zDyn zA`wb7_w>}|{T&r6lxlY8g-tbWM^uMFP^4f_E?adPVIfusWJ`orl?TyY6%C*Vx%-_% ztIZDw5sl^hEhB$b;mE!tlNO4+_-K~`<5nM-N+RddH;oP_t>%M|9{+q6;u-)MY}gK^ z@`&gJ8e_(ww9>|QC35af2ktU*wXLT99tY6;5dk~DLcSis4B^voZ}To21Pu*bR?w3F zS8omNKc)FTm(%|b{F9z+@aerUD)$Y$#I{~;h zD}hv+QljiMr-GyrB~Ly6e5KPV(ZW5(RiJMSXFq_l z?lE8T!lU&kQE*I>NQ@-&pNwvxle#MViRwL(r{$aq z0Y3Zm%UZ`TsreYgG8Km#jXJ3IrBoCUJ>#AGt!9b>f6XAm z{E~ysbm47T%HuBF5pE6!f9RaN4ZgXn$ zJxBLPc+qTF<-2MaiC|h9ue~=~uAPQUSlugYo}ITF$FxF$+F-Gegn_V|=#Z^Sl+JgX zDGC%qPI{(9yg=R{(o1nqzyDc3p=0X)Gi%RLNYM941V_MT&bM>fZ8Ko0n(i%v^z-L| zO&&y^$!9gd^?t?`PnJcUAt;$<2T9O#xq<6nSqFm@N;6M4^!ni!1f6OwN=ao8iQpZ4 zRq>wSNr0kfZCYKoIn}k>X+i_Jy%Y;{xxy@?R?qc z8EtnN?dwZ6UcNH%N!>{E6M_(%)#=n}Pl+A@$}#zhv7&!lmoGcGGLu53 zdsh|^@%8bJd^ccF-#6kRW2BLtNWtL)-5}oi)|gpAY$c3tpWlZ(yIHkb`|kXPagx7A z0H?84eagQ+{HN#7q-*d7B*j{Vuok$nxky@miX!~Yn2V9(!{3oce2fQh#T0^T#qtX( z*w#KV>3?56e!~Uy^0%Ns2$OZU+dpy(FgpGPga7NFlmBFT{51Yk^_mD4r1i`wPk5t) z@&^|vJSZP%Gn(_mU6(hjcV*(W999*<2^=xhL^U0(%92}Kvq5d}_NtPoH)bKe_-Umv>Zi%YH;M7K`MFGNW@{J z6oXsdr0{b9ft~jRf+>9Bf`OA2sozjDen)Te|MU#+75Qrr|Gt_&!+`G1?qR-4Xkst@ z{0bcQ8B;-gK>~u?$eY*J}w*$di8p z)F3IJ=;Ya<*ARAsG36lypCVZY-gTg%#3$H~95MK{2*##59ITB=l&G=%>eeZ`t3cH#j7}0UT(Q~zbJp-fgCi2(`&D`fyp5A{M^&SI?8#=$AT01cAviz>o)6#ppKDp?QKkou?fbEjibV4<|-LsF&A z`E0n>!kKyBBFJ-^5SX{&e#%YST8vjhswS#a&91k4s8E%dS0Rxxlge$g6a1WpLgE-A(zDl z!{8Skt069{}Y@8v$RbC>`i zx$FT#H1Ii%2EHPaFMWwWdL)k^ndwhF+16_gr?McjKhpV~&VsyszbB@4ElN}gi0ABT zMkp%r#M;oVGsZxjG@X=iFw^FUvxSVvTDm)qwdl@iJCLd$(eucoxFEi`cSAwFz2k}) zQ3=nwkNMbfgA4y=x(ox2-?*HRuBMD3sYB0)irjof*P5bvRAcPDx&D8$6Gvdlid6%( z39{#RU~1zoPPx)Qok;(8Ma1XrT=L++r5)5h7a>`Wa~QlmvtNj`xJ1GgI?^u|&fK3) zK-^#I+)JbP!n0itfbM{Z(HGfRIn5bal+(`X$AYT@C^@MurJ;!BHoVEZzUU=Uy2ekK zq6zeI9O^H@6dRl1bsAC9sJE{ojhFt6h9Qa|e;}0%6bAVA_Qwn37rGy{d)qU``!6rM z71OHU*Hm6NFwgS6eB^+}{Z;8N&gWMbG=w5Xq+8fAlasd<37H`~3gr4!+|JKO!~|fo z5-__+nyc;Rup_TR25|x?lThCcx@$}Bpyw)8uc|bNXg;sh^pQKBx}QuQ4pmm5Pi{=s zJ4(X2yv3|fHm>d@a!tj9FM!`wiiY9T9j2dMMgxk(SBH;2pp8js?FSjrD8&ZGTKN!e zhe}VQB37W>VsTCr5uTK#YyaHL<$YFeV?Ashrz5kw=_7yiS}bgHb%?zS?N51?jIzl2 z;s%46Vte=v=lrgcq3S)w$6^ucFs?D1;`CKEWEoAux(Dy17$w<}SN)Dg6T*eu(03 zkE<+kWkSku5vTaFD`C+}^F|t!qW872DsMVdL zYS6G>5UR6z#?L8ApMkrtbp658FL>hqBVMl|FR$5sPAhlV33~gP*L;~&g0X$rO7zb( zSGeh4O}0qq;CiB!&C*q%-r)>#S17xA+xEH}BXAIf%Kw`F^M|2ZnZ7q-L^pRB#E!g4 zj1?{6n?QDd&txloxVD;@BMkv;A%^<=5U}4kye-+c)hQm%@f04! z(q@@V({lhgjxL~VxcQJ3?@(iMerGm&1HnjDHJ+#@BBLe1%(abM8t+a6Cs6YdviTQ$*`od4ed4E%K^AT$1wSpE`X;~f zrv*4?=EN-=c~yjwkir+QI1uGz9Ef~hx(m+;wbDg^;F7<)a%znPI?tV}_X99$6h&DV zb}cY@R@UjKFv-SrJ#o|uB}1w+9Q^SS9uQ6WC~tfS>iLA|dJmu8+Q-bkeem=%MDA>h z!I=C7kLEuA^lRD&Vj9JX3S zGTgU1XR%1Ku51h3z0M1nE^a=7V3%!|Gq`BJlos~1xp{;(AeH!BKf3oUd9;ha@4>m} z_qPWY=yGYq@nFU=SWnV>eZHHcva93{&?G0P1BqHQ7(Fn3xS9!$)1S171&eP+;>(?< zV}1SjJ6f3u(2OzsE&#W7&VSp&vh9nTV%dbn{;2saHTBPXOiq9P2YKU5Rf-SzkLt{~ z#m0&e(pBZKMa2r`dcLpK+%YWCxV@uT%_G%ME(6LvR~G;r48V zvw1eACZII9qjpvP^WyRU#e#OzTYO)*+Mz&9%M7|vL7FXwp0hy zo?8~LKB9nk)swSm{;58%F<&-bYiu2`|32+JVfu9Ov~zvo7Q#;~uO9gVk{FuSiLi>P z%Hb@UEOV^V9*7Yy;z(is2P`o<0v}OSwkNE``VlFn^3Q?ZhyDp>Q3^J90Kt9h^5`(O zXx8}Pji-|$nSuCs8{-bSFX>6Dt&_w(OJpL19RkzF-0hKIdqJG(fhf7@EWL#~kpWy8 zRv31_(hpZ*a!7xAR=yjlu@Qp!5AM$0bE&<>nz?xAAq)2;kvqVkg#>;HKfZNKU;ev~ zzc=A}(ka=i4;$@Kt#Y|j+L_UL+E7>eFn)J$bH_ud znB-f)8D0u`#T!y!@usebBT&!!Lt=6 zCp_An4X?W~Z+Xnr>&Iy#OP2+AIur?pNzi+Rff?zUWiDsz;HX}=jsijovUGdityi_G zZI;Ka+DPVn1edOS#Xfj6*^iHO;&kNOk{~KAM=R$PUBw_MzOAc**v)WW?wDWq16%$d*SvJ=w5KG0X z3SnD@hl(QtGf=~;y-b^O5wwb>yMxZmK_6cUIDfW4U0D+H6CidKM>(RgV3A>Z^mN6W z`e~

eQPtYx(pQ26gq9Nfv$zpfsfN8~RRi9f1^=Q~>71YfBiKK-4({r=LeJDXJH zr4Un&1VlQ}X_F!!4rPN5cY38m8(vg?dW99HZs59mWiOtkQZtq=Dfjv zM&zH*RyBGV);lrmT^l59t4<5*^?`z6cvw9}RM2ZX0|b)_KBsJrg1l;+>xem;ZyC~> z*Rp51^V*>gcA*-Zl32wtyVNQH>&{hVHoAgbB60mmj{3ViI0P8={fymmR=GJ`+>oN} zJj`T5$dU>l_8?1gfZFb7b=_164F3CR(gITIw=mYE`ZKk0Eo{;MpC)AI@5876cb=iK z;Dzp+bB0&ZkD?Skjg^6;WF&=!2)@FLbKGSWf5Q zo`rBS&QQVBG8U&l+zY~mI3R9$EW`*VD}m`V-N|JVnT+#`Hrfo~a-{3_(4xd1UHp~h z7T|nxdU4}i#OSZa zK;BHaZraRRn7)TQ!c*BT_9w6{mbV@5cGLRs+-uHs@~7J1bUVn`Gu=PavM@>qf&b7! zvr}*jNZpRoxSb;|9oUx?8X`?e4+ccX^wi>L>m#_Xayn(kwflSXfdGK2 zReqLA1+ko^u|(GU;mNUsF+Rn9Wy#RAB-nwL7~?U@-icemDP;G!I`h1VG-2YJimSRU zUAR_)Y1}-CokJes9eTQkU1%-9Ewhn{Apz}_CwUVUO6257Cn&M3*}0&O*7~3GkXld9 z)Y|;Wkr;B1B}#E9d-3@0trKQ^D0_@LYp^K#pglAC4GQ5Bb+*^z(M|#O3}6*=Q{nu! zYs#2%GLhGH#6sd#J_3G`>j^ZRY^0hs!9r=yDrP`D^L*1NLotT6L&SF;K4J039^GL9 zC28QuESEl8;8qZe6%J3|(yn)pJ0B=e7Q$Ag(i(Exw8~js6 z-hSfkuTANbS8CbMp8mFH)6^mBGjlVq%8rBKlJ_3nTmsIc45703n$V>DngTc2O`!5% zrV8S^3h^PRYAbOxA(7OwSb!=fcQ&n;iF6X4)6GnxNs+ zHD(hj~zq zB?PStEU=W(5Ru<%bz*DgPu#@|ZASGKV-dd%d5aC#Zs(g|kUQT6U{Ae)>#q$xYe z&zkdB6A%Mv|6ZzF=5r43x&i-|hSDrC{c~&O#Z4P%3T8T9x31Kb_NG@BjVfwxDmY0% zN7BfG`Ab|%B84kHu4lJr+nDQvD5`Jqa+lN<7%Cf~S+0pYN(dF~70tw&qPs-7buxnD zWA}R8BR(Etzkf$-yw*v7ao(Q=MfIPHo5w6CleGA=d_eJ^H*dhn!whNM0mv?ClGhGT z(?9<&44S=umw``Pp4yvLKfwx^+@3|=V`LDzdAj`R90!`B#vda6!Qhv_@h z6}t7Hs!hl14G}Jwmti9k(Y9@JLUVZ0FQ1gDXog}2##e@@r#EYOOOGX0H)80DxYyjH2PL(JZaJL?V~`Vnugg%+Scv=-**}eiajeJJDTKx|4p1Hi-~v0N z`NtfB*V1rKN&vb1VS*VOPJ~z>`xSH82rHaZk=crOZ=Y7f{jT<9`zX`7v>|Yd;85ha z-eOXEIXjGgOs`UcS+3n6Ale*l-H@M$NFv(Sut&U=qven6%vW)4FX3-ui#pt4An&}w z=t8~u{2`PiDmis3be_SHT!^oCJK4{g#1Er|;w`tOk$bxh@S(<#r}`Eq1~5rv zMGadv$gNd4ufU=NqJ}&I(^+res|VTQw?BWMMa6=@`%Cn_i#yl)LAC(k`+kje2JbE{?aIpFpjSWffGO zyV6mZsXx;jxV4U%#aFtsD1cAfSyN8A&5O(_VO^oK?vfQ) z*Pix`Fq3{(^2paJhA$<(*#P%jLZ&YTvah5R56PXLBR?iuxp3}pl*O$|Eypl{#ojT^ z(s}&f*60>GB_6gxyGaaHPg`8;KYr!b)~j{frfO!w>1ES?Ihme&AZf@mX^i+rZK1WL z&vVg}M)~G(ecwPyJIhe^UgGy<6xh)PLU4|uh;nc1Mo2GBGpJxJpZ1dX%q<0|wFL@l zzmrW}1f&A(7Gh<+Yi|!J4OM(LDO3kf+h_@i%lB)65KS@u_|?kVvcBcU`{&vvEo(g@ z%{&``Y*R*UqG@~hKnQ!Myw7U~rA#QiAu-abxyOfJqC=wf4t`@ZgQ46TW&( zWHtklv&!!6vPvQVQ=$%QyRM3Pzj1+?Bb#aUiDx#!n3EPVvr~8=*Qacfl|D9E87GhC zB9d!DHJP3x_zi}8KbMV6itSqL!|r1Xs(-6)^hLi}NL&QINHie~+C8r+__VU+EhIJ2~n?i4d?!8HEY}Y2g~2CwpnAJ6~{JyyYpI zGNf-9tkpAZp|@?Wjie~1s*2VM(v)a`K}AQ1nQ>5xpT0*BUi?2@wDQR^KqEe{W02m+ zzXCOV)PR%#&QpOz>LUiM6=eHcsxBMXI-&?9HKOmh8UKLgTS|L&`$x`6_Co7MV|J7Q z_C3wW9r5;ChJ~VIn2K*lO{a=0PtJ6`MNkIAWK~-y7UuI15$B>{TC$F4E131lt=4f3 z3CB7v1e+EXE6hCKKOdeCC7me|DI5g}jIbXaCm5?8olKR1ds~yX6ynhWH$2K7V>(kE zxP|@7yZ%zchbyn810U#-k%!?AkN=09qBNw*VhdaI#oqB}TxG>~o{5KFX}^Ou<4^fr zK$g%bW6W4*{mmS6R6g`alr?<#2)|d};N@O6XE|LD&zmv_fy)T*ran(#wW^-;9T<^Y zZ5_`910HhNnUJ$E^x&G|{Pb6iqecj+8YHtjCOrZY>Z4T}5%!hF%bcMQXf$d(CdVPN zt~dg4dylui3GFZtZr2`m+Z{WS5+F5W#=-g?xzzk2FUS~IYDMrge|(bujNEJ+>ZT%B zr(}C=2UBqO_S{08^(qSjc>{gR$SE9F51pAkQdOR6`M6uzH~V!1q5Mj$<8TDeoV?jJ zTlmNDnFUu-OV3~*UaSlrl4d)cxb4zBO zs|a!BxT}r0GC!5<$L0V})#`Uf93z)jOm6xJKafP05qI&}o(0aceHnJ8_MX66KEi?+ zX-AhxRMNeC^f-K97#W65oxa>*t<#uDztXyyFK0c=a$PSW{4R%J`)gV5xi-Pq1|<7X z@p)?cV{cOeS-;t}I&|G~bV`%eL22B;4uImLD1aoO1NqXxzcLN{lWG-Uml2v`j6sKn zmo82wE9=gFV&|mlsqy=~^ZvA=GyVRWr!#L%^H8Xg5+KB&pN9o8lEX&Ov$BFO#fpQe z4G!0zmS)fvg7-2`fm$t~XldT2*n)`$M_aVuG{gb66FSWXcp0vbdEzBjj1Pw517cW# zloawxHRq)2bs+cO@95o$)_(ccUK~~PGQE8@;y6avt+`|*;;zQc^nwRDD#~G5pX4kZ z$W&%3mF(@ZsaBZxpFn`NpSBvLyZNLe8qu+xP8gm>yWH1&uFPdknbEW-N=lb(LI6a) z%@9au6^Hf}!65Y4;WoU6UqRD_yOYI#)0iGmMd%pHgX@$LdA)Zt4cMUGSt+9L1k$to z`?PXZ^#}BHHZ{<3`&pp`T@J3`O_gMobPZE__p88hW0VD{fvs<|}Ao;NW8Q zpj7w;41}o2#~YRoN17h*fq?#=Z9|e0slCqY`dzX6oybf* z#6k_{S)YUn{B@c&;-Q&rOFqqoTFaYF8MRhw=aYn~_BJC2+1*abkww@?Ty|Vy^?PcI z|CWARtyN~@3n1pxaz&i8i##Id&kXVZSOENuTU+#}dGAeWgba0ZU0J4xR6J)3@EwY6t zQv@XzKnu;h#C!v@Rva2V7@E4sOgf<7{?j#4zQHk9Pi4^<6GwdzEc2MB7{y$|IKPd1 z(y4it<68Aa%a+pH$^>38pCUPNpY_nNqC_n^J=#(bpA9DlMe{b3=5w_)imST=EDhg9 zB!r=KhkxX6>N73q;`SXiGW6n4O$%7C1#oMwO||1(1Qh%=Qna*YG*_?$gi2s^>K8!1 zefzpTA@J<>AM`r(SM>YN4CA0v1M`apD*Y!Tfsa|=wj&3~+Rhs0Up~IbY%GT1W`MnD zoVc3Hp#*4-BEor_;EXu8uateucqJ;O8MPZ?fy= zIMzHJwYP}{2iEiO`17`U%O)OP@F#pTq|2KHM%{cUuk``HO!vBiC!MsJp%|zw%~>pH z-aMZZk|4Al&BLSij1{}!vc1#_NVH`}ZXzMTSAex^u#H8=SG^!Vv+LOgHe#-#~_ zjLv>+pFCR(W?9G3s&VvMV8_@{rASnlf@B zL!D8MbN6_Ga6z+YErk!IstPq9^PI_bCGZGBS%C#$iMb*VSFb!_pOP}0fC2z*Snr(b zuv7t7>T0ZggxAL0@AazY8A+YulCca5fEkd$e@7n;{owYa+b6ZJ=-0Hb=(lhCr7Ueq zXu?&zfH*sDwGgI_TFx%nW-wj;DfB{M$lhHAAcS-b#H_;f)hGbls+@-lgrn9fLv97m zOeDlrDi)=*=LRSf)=9c9NeMD^?ou;5as;48gzh#GdDY`2EZ1IW%1GT#JOV;<#w|F( zRXDYU-mAr`_pv@j%(d)^tK~CC)_pQkp8kDU(L=KW@zjSP|K#|h--J1^?L*xb1W!{K zX$U~5^s1q+-P-nltW7h%X2!tb=#8q1iI9H!y9{o0&#-`bZ1b|3$? z$R8oJTm=G*{!ZbZu&?!I=1HWfA`-lAN~btRTty^0owU=9=noxuTD%%(pS`<*W=zoK zQ4Q|THmd)ioJT{i#v!dZl?pY2S+w;;C;RArDMb;$DQEhT`vyN{MD)u?uQd}9xb2avWnk~& z=C?^cT)Rq>J~Ei)WflY(9c{VI;VzNTDIRGGuG@YasAvA+MdT=6v*d?fQxD*QF-N?W zdz0E(&g;D!nLE!9Vgcd|U8HSp6TLT8KR1YX7am*16?!B=9zXKl?CMuXMK+ZGx+Y=V zv%hxqLU)fBwB#~~jTH2fi!D$sva+RQm7*A#)hj# z5&3K40%DZ}*dV|cOEmCM%|L8Qnux;F=+9jD<14bD9QjG6JexSFhzoRh!2l{Z}cWL`7hk)#~84gf^ zgi3X6&1jY*q+Pw)k5tf{fjjQdqIytkJo;ai$g6F#85Q+00CQ(vOG5#>kA80nNBc=* zhLPIY9fsW}76F7#(^ze}G1fvwp<`Und) zSRQlQMaUZG>7r$pbO$+15JyR5(f?RM?>zjwE_{2Do|t0q-Spg8XAx?7k`^|ptB%Ky z;%DO0g(BpaT7drbY54Eut1>V3boLOL9(YaDRs-^jel{AX5$eyYik68nu5jOI;_E}# z$sz=D&-uJ=nV!i@8&WZtqWrj##bB4*Qdk9aaG}o0ii&a1;HGOFJs+HMDFg$qubK!^ z5lrB7Ba@D~;oq_-jZD?w3Jt|F6M+FSU@)6nv$-HuKmF~dmR%82e2li-r@_5>m-Iru z<_pkt`$>OS-x>IUqWtgcQz6fuen%mI=kr>r=jnhKTbbT7RX`NImb#@w>gj$cP&oVi z^0BXScr_;?v8W{gs<&Xcm$1TCL1v=O;g$KvlbN74I8N`A~o zI1U>t&UyTIJT`NI5e?l5T{p$?Rqw2>VrkO!(hr(7h^~+Miu(U=EH~hn`EPOqS&Jen z6ys9aja(PRNRUjM@+~tkIta&f7WS>)d$wSt%tS)F?0J807H@MTEq@Fc5ZR?!$|RH| zs$S`$L@VX>p6F2>3iY9qSrI4H(=k5Eb@d!1hiV9<*(GHwxg_Js$=bpo7G*&&x~cqAFVGLJZyh-tAp=|6h_n`1b9)>#^$= zKXpp?K6^e=JOZ#s>QH`rsM_?YxCGPM2RO$-F}sIGHm(i#Op~RLg3ft&!VF7I;6_QQ zgkc9zh&wF@P#kVZb4C1qA8a4%_x2JVz%tdn4hZ-eYzrmo&_y1hW=S*U2f0b)zR`l8 zsc&}AVgiq-%|!;)Ae4hyQ@Q{;0)pRAi-XnoyAbicJLS$>YycIRSgwxP>}f!+9=|L< z@J;)H-xqrAnCflyUa8lZDZ#$1B5XjCnZmZ3h$;TNh3#{0s=AXa=r4y{^Bc$%=SVfB zOEQyoy>30qS{7WKw$}oj$>W@PcM&GCY#RNa~CZzQ`^r=boSe>+|?_zJ51!UUS>{)8lzU^U zg>7S9;W3nk>h*CdX(_7&Ot1(@&N)|__u>6%1Lt)F1L;@mJYjKt{)&UNEm#Lk3Tv34 zxA_3{JOYH41pRp*p(P!&7p{jHL>C^#5p_%)NrB4iBxt^6j6@C*P{NNDRV#uM-X%20 zI}pNwUr^~Zj{K*#aOrq6{lty6AETU2-Y0K=qB)@7kWXl{aBBu6)?&a{K*w|N`Wu8A zxoxTdaIKgT&%^OB#qd>5ioi|7K3KPX6iDe!;7uWp>ALr0zE_X>f&|75=_vyQ_}I1) z67MZ4smsl*@Xv@0%8&pvXs=D3+`ypk7Aslfr3RoUpR8R~{yc#|DilAZnFOdHvJeB|P@ph=)+VRBW~9YW-vEh&RIdI` zf;J6nRP~qLg`^PW%M~p{dm-j=!g}Xw+R8`~QZA3qwsqOa5y{}cfEJoHK0GD*$=knT zk(i*$SPqv~nmEtPUodU(I?vINob?N3I`f&-qkMm|Q6E}^Abt-^gs*AEfgtL16x#Ki z^=g6C{}9!+L54NnV7tn3h36Z0$2cH#(njXRDVTcx_|Jj+vBx0?D5MH=5VzZ3!?V#S zWHE3$&u~>foCu;)xsFHK_dB07D-#m#B(ddK4S6=y-P7a4pL;qmpDvi^EGrbUXIKr` zwd%wG1;W@^9fn{+iM~{68u&!{cN{5vQqz+9D2^W{{D9Ann_H`aqVw|FK;vZJ;GRJI z;CZMr|0F9qz&AOaCMvSFWB~6t@vLx~^Lb6-xK2aQ%1A1bQ7h}2w8)&owh6U~*NXW= zz3N?#Wi^klSVxT?d7=}ALT;SyGCcx^pBK+KSReWqOkh5L{(Mq}bE;qU7^YTDNWI8_ zJcNprh%|i4UZ^J=Hj&IGWt6=btz1k2&ac#y~6S9~}N{Fd^l_)TP{1 zF87?vwa&`kHh}PB*)36-^z2D|fmmRh!TIzHCxD`!#}px*L=!puV+E_X;k9Kk8Ql(GQ|s}jfX0dza!6U0 zv(0-C`>$JkXOac(`0JB)1O&QAec6A$D}_>q%DeuFgtpA_BtI2fO=Lll*ZRKFT{!WYxrZMp z^#wKxJOk$H)kB`k1j2Q0wvT!!o3T@B6iZ;}@^)9Tb&&=JXK#6Tz z(z|l5NFe53vfTfQ$sDppuCG+M$2>y!Ef8P10pTGKIau5s1o%H`t(?v8f&{5h9J-)K z{nH?hXkaI~<)l*-2rfAp2qVV`H2-0^+%2m=hPS6#Z<&q9Z3H9?P!$z?=Jp?1kRgiU zb$jr-^G)%xW%+dB<$a44)ia%ogWfE&oXw3UzqSD{cMdyh3EUN#-e}Z zoQ&IbA{y3+#NZKyCz0HM$H`$#{J~63&WrRc&GznLvJCG9caR?PZNZ_a5it@u`Yu1F~~3KUR=dULayeFV&HV~tYE1pMsf`jy-7 zvEw;91#~-Lt{=afWm8xa*{?Mg#-fRQCBe->1ibG(`|T>Km~$k!Y{}|zR%*3nmh9`< zP3}4$LR~@?iHDwU=#xZD=jML{BF%x>p2YS>wUV+0-C=N;nZblv7n(6p*a^fCY)ddx zxo2?0#1r6*_v4uQx=XZ4Jv?qoR=`n6ZnA;tZA z3k9JTItY*!wVOP#xm$|U$HjLY)5#yz(gI>aTTa^-Q-&Y)dd62@M}>y7?1r*~$8tX2 zDMvN@rTa?z#ACek@PndA;Km%@vXB7G`!s)Ts;bhUNp2z^rYd8My5Mh>g7}QgY^#Y8 z90iZH$U)elQE-0-H8j9+4f*ZSMasFC$a2Bw5v`^tFov%S`d<{gKWj@dVaE5MMf6%& zY0XLiFR%b%*HpV^4$&!x1-l}UnGZs*E{Z%W3JO>H_vdK3)So_2oEb~B)_S#!aCYvP zL*W_ZSeCG}TiLdv4X?P}+Vg;`;TYRPN)%C*Ae$Qq!eOLncmBG(uszWSmP&*`1o6_- zDZrS+T_V?;65Y9Ex#V2xk~UuphY$`6|1ABs>of9bzS4#nIC=Bo7k&eSyYXmD{~!OL z@yLn?nEAnaUJz`W8U&3(wCj`Y+XU*mmY%H_h#9pRo*DSk8m@d=sq>P?4`z|3s^|IM_p{31&NP=2&mC8&*G_YplN|#Ej@(WM&e2X`H&5irYjD1jm z$dM{Vb;de%x$R+>=$@(e^8mTBq>l!AEK|3#JC0Mof}>*PjB8u5Wmh&{I$)bdr+n&r z>)5Tn#o93eyu?8S1}FM!i+*z^*AKV?(7@(RK1WAuXbPp_^6D5m6u58f(VO`2(NgD> zhu^b8>ii3_c-I)5~$!2@Rk~%5arc=wfAB8r5ypc$ZXz`dKJXF29=`CIv ziQ2+X7$ZrHpO)uXUe@e{5=_AzT}Ebl4NlE00S&y&&|fPbGBEtWz1x>=nKSu}B=F;m zj{f}i4-pxno@P3Nw;=6dVyTh}?_lBbaCFlQ?Sr^i#$xIkh*T(4<_E)Y^f8aVwkg(l zUEHSFl*+UBfbBJBU_hqajCOXvS=(FdE%}J7k@jnMTyCn#>l}onhy+m9u}Es-i*5sM zVNeW_2(gN9J@*|FzdoL9ip*h|+3w4M&6;weSzH*N*YUaNh8y1&P&D_o(wRW!m1bD| zqKM;|2ajd}If&ah-cf+FTPbSE3;2d(n8Vdvjt@DQfw*ootj))T_}ss$ z#%SBv=IbZqFbRPPe9)q*Rui*q+X$94Rsd3t#4EJQa005NWW#{C@sk;@+k7ULY3l-H zuTL`}y&&G~o?a^cA-rQQhDB~W{BfUGF~S$$f1KSR;EKN|G#*Kw*8Ep=MXK&3L2STZ^uWCc}&X_RxnT5 zlVPs=bIYDUsArFhBfC6M0njJHMR4QTpRy-tOH|KaG{BGYequwnDD$K;Luc+`uR~*}I6bxtE zjHeM2E~=m@??;_^6+t_SikXm;&!V9^Qrv=A-2|Opd9lTyG>SYIfLH5rsm!e(Pw$w!oG~jK5|IH^{ZQqLs)lfuMF2?=*NKl^hIHiJ6iI;woj`09} zv1i04A+3ixTM)2xwyN{G?4IZ9qG=Y~tUmzl!$-H5GF|Wd$s;3qlut_%vvE?Q5bEL$ zo^}8FNX<*~M1JHYM7sEZDc=tpB)#+S7f0M&LZ3yJnv=BpTIyGW#-4970_Fx)3xZ(T2bSep-<{7c z+H-YiKv82?y^j&Q;QABa5=U&#Bgt+j>OgMsVf&3PID9 zfIfRYZ)9Lql8zq23)^&YH;rShC3yjb=+!cB5WFsfL%>+P;KNpG-D4KsRCr6;c zP`zhAZ-Lg3#=JjqQ#-%psRL{3@lB)25OCHnovI9?Fc4fz3Q?6QC3#VL!p5$V50qLa!Id5BPkr*Oq0PuS^!C& z4M~Haq$y2fiNdcJ0TYXaf z@eQM;IYX@nixu6xE`#@^bMpZuTd=3a&?%3k;|sV4 zEcPL3@T)-t1afDUh-1Z2p#M37&VB+IKD;V0FjqOoSU+5Zm$bYEh()R9Zx5frWQf#2YwXiS>6XtictkjB zgA~uDOJmD3+_jM+#656%n?O%2n6gRaAKoS&XI|2WvA8sBora|c z*fZIafPp4DeOV2fRxvAWLUySB1to*Zeh6-0Dl%L>7O85(f;0>h{-=zmrAaOI@g(ts zrSY`1mTSv_iiBB>VgljsyXi==9#O>h!Gpwa4~mn6(%dCi;&oLl?uUwgvIros9W(hE z8D(E)l{Z{P2zwl4350@EpXYTsIM2!#WrrPTZRkW2A9*(ygsh_o3$N!>8iBH*qsikT z&?(eb|3ox1azI`1=3`nmV*^Pvje)>=MLIzjmL=5KX;%%GFE?=9T*~EtNQAueYuAmG zE}wP&UhtoIB<@k}=r{pG= z(>o*#XD<}tIF@-Lh#Xq&Z0#jTl2g*N+0ic2!^Hkrp6Yv^F8aJ4z~hnZb`F)7s~Nsv z%AN40F{2#)#h;#1-ke-HEXSNRh<4j3y){K>uS6(!UUTnI@DwMBZz~9(=t0vUl6 zyzr5GD|ji<^sN?5sc`$22gAW`p;1l<^5}F+*Nx>tYcZzP#72yeuAk4YYlBNYvVY@g z8RJ>=V>?)88S_uvE{v;dSr*4Nmv8>YQD{EdP0K zRMP{xV7MYyGVi1jkc5ym*S(2Nn~O1|uJt(nSPUZ$%k*f2OGGn+H)UK_*FW|XGbj4B zCIv}w)Mu#SE+}ya*ozF6=N$5sZg>jQm59&K@t$ilgWaegT>bF`N?%aLKfL`aJ|rMyPPXwlY3)+GY+MvAh6B5b8MA-4Rw%jx@RZ_ePUg=5AY)4F((s%ap+rFC-J{0DA*%Ht zZO@1Fq_s$)C3^-q*HTh-dS+R7%ab?fJQo0ITpwOVUw-$Yf7ZSKuQ4}S?LdSEGSW)B zJ2v-pKfwn1B4p{KZgy}4lR=g`f&oxV9S*nI4#!|E7D}IeQm#d?(p#T% zCD$`U&$Aw7gnQND`k#pw5_R;ft4M|fU+LdRJ1`0H4A}DBPIF_}YaRjdeQ4~D(g zvCz73Nr-qnj|}7D*QD4>cVFqmCfr(di32U5rZJcYM@69zTu}0HKd3HWTvM*+dy}yX zld4<+){u%ll+y}E7BPfvv<{6n^kPW6Ju95orMaaiOw1}(VnS#M)4D0Yp+9kH{GjOJ_^6=hpa&!`8v4cn@{ zWd@F;-sJs2Lo_?22RWnzkww1NyJ=v?qkD6Zg`0li=JoAw;FSC)qGf7v@~|LmcvA-NC%d1`SF>jSWauJwyU$P&r=W} zoo)%h{30U(Uq-&AyQw_7n_^nq1`DW~&amN`Ii(1)`z0`%LFZ%q%1IZiLV21^5g#~x zmD{wN8U&Y5tXKUa~8YKJI;=L3$y3Re3rc@N+>n8 z9xp_f{CQ^f5yo?Q1|oa@P}7i1H1<)20ns?LcN|j%k}p=IWE(%&*Svw{#rn2Ew6zv% zua%c%&i5?>*nECACWW+t;tiZh4DVHZA2*pjBVD#p9GR4#0s^-%`uaYcqgGsoH%$Qj zag1e%|Bg+HWxANRZGE3`h!7guU+^8g6Xx}Ldj-=iV>M1O9{XoG+&h}Kq@m5DodDPs zb)P7e3lqN^2jr5>xiU;z+V1z|bY^nxx7E4qBH@>wSkqYo8ZZ;Bf#>JkAkdpT3aCcX zYHt1syuvEGsRoBOmOp0R=+8Y*^hHtihr-V64KS!`4s`0u4BD<6*1!rGUTq0JSjp>2 zw42TT<|AbgLB&8FN6g2RB5D1}LO9HI`IfeQKXZ26T+OPLmw+fh;y(cCs;EnsypcK0 z6wu2d>DGz7O(r*DHsSi`5E5iUDYc5X>Umqwvjx^@v^IBLjSZIzQ<__!6@U>i13ol( z25GkeHGR=6s(|jr3-I70`0Njf873f7p2~8soDezN)fm2gp8?*4DU70uJsy|NgB}>w zwQbAt2_2PCcLoQxX&96Vl9UpYABn~#RjNI=DI_;tFo6m>r~R(j1*CFvK=pfOlFTbR zlier8s&GN?DXg|qhp_iW+2zX*pikTjKwE??(Z@Aonm9Rv7^zcPmNscUHwHvMm5`j0 zZBa=PYefnOKt>GYoz##T!Mv@7Uh9UWz+DTP`Y6kp#LqJ9Yb;dX7Xb-B7Lol;Iv6nX&VSGEjM|02a1_;QnDnCW19s}KP9TK5oTS|K1Q&9)0R zOS~2IUqK)fKv@a(Q@f#ixJ$k&zge-BIrkTu=q~M7JUrqJZF_`spd2j%I}+KO3z+hI zRUT8kv20MZ3q9c;`$W5)+P&!Q>G z{48{Ae@wjjoX_&M)ByXA#%k}#A<6B0#Jgk0w5F@OvWdRdprJ4o2_RI1zJAel;=5Nq zD`y||K1kfq7d3g!;sQZUTxckTl+luy(3HAKn$F+vSEkQVdDX4|JQ0^s&gajKCvigM z-l9~uPl5gE(kC*uIWczS*uS7H3w$PrUrOYK#d<}B^;)$ zyC5v5K$-^uQk0L5FStt!589oddpDV>gUh;#Do!%OFZr{!iB?8zBq4|<-Pt<{SIeCY za1Fi}kAE|*TIIt;gdi%HvM9@aDgCxaZPfiOIinA=Hu0Yh!C}?^`6p744wM;!xDjny z5M?SYvw)5*1@*}ykHu7j4BifTZw7BnWwUP=Z06@8sSms389wq}CDX?`*>%BO=JP@=^*&)1z2eVoZ6_xhEs7 zm%WHi*@=sgtYEr_FF93o3<;-b;q$-G8xkGW#=sShkB2>_l%XS#C(z<@%|<4u6EQ^{ zl-E1ii@AAIrn|HyNU`Y!-ETvIz0W0z;vsMRa7cNgT8K5^0jUkOlLl8dBi-Us&BBk= z0Vdl*>loDiabQS(3m!Gg&fCuabzntUB0u`z1UJn@N$rG#qp+f@#3aRQfvIX;1)z4V zmOA#S+K4vN#F&g@gdq3W}E7Z)R>zTb8q&#lRO# zZ|P#-O0+IiVrEY%rvpBLw0o!QG(KtvWFoqGQZmG1T#pa`5W%CAuxWrJg@9jkheOk* znP&dBm-KDN5T+xjiFvhvRS-JM3k~GP`*3qgK)RXyY6&XDeUkP6nIL+^Z%smi)l(&uW4AW1Nd#%r`jDMxwlw8T-0F+6EX#K z>EsMZH^UvwRzxJPG4|F+v(NLEUsAim^)K`bk`iLtMe_HIPc-8eh!qA+5?9o2lNd5P znTc+|ikNpe4fJrw5@s5_ZXX^Ak*4J(QN^-AOu1LiA`|IS%L(npNN6F&(}3$S*HH0I z1xSq3AmCX7q%g511E5Uti7rS}z1Mo%f!1dC7g_-h;QVU3?Fk~jaU5Fn$a44pR#x{# zy%pjw|HkbGsKD2Xa;E8iTpR%;umQYt;Rcx>IhWpJ@%1q!&-J~Fn4tYcX+v_`;cyu!9T1x zG%`73N-Kx^^X0wP2qi&=chl#CMc*%4sc196Opzh%8Hu;=Jp7z_d6=HcR==w2NxcM; zCp_SBD{^bylbtG*sUdgo-xnRxHL9dG@zakSyodX7Xb`WZDMC9^sD;I!ppzS4?#-7!deoYt z1VZ*Wk3VaFBlX*OcP#)wER#@~BWjyL<}lC5Jsp!f*mA}>1+J!cG5C80?fc+d5P@VH zub_+O{(iBI39${XkAy66rPTETSUBN-w9JE`7`uc(MR8!}Q_$_TJ4QP|k+k}1aEerI zeRtU)1XWbpETNi`XBZ?z%8WEs-&Qw1D4L#dD+C3PXJIMn(&SXjo=$VBl9+;KWt`W- zQgg>B<2@=qheb24U_btVbp~*HBRXhZ-Vxap5XMPd#S}jkt4W{&k5$ruH6D4UHgjkatR<}&wbiIE`S(=Qa_K8F^bv_LC&587uzOZ3On4g1RFB6SD; zkV~o`DcOf%*}=T=ly^}d5Z}1{#th1oa?gXCp&n-nT-=56c$ZV#s|YMHkPO5HxP2P9 z)8^iJ_=1e=*~C6y@=EJ*YUzr~6hy{aU+JMr_JJsIeSy?|C~zaYH+dwzMsKoq@yQbL z=U{a=8Tz2ayX6a-cCGbDf`V#tT3CfUZNOZtRJe~SXBRbWr2SC%W{B@dts2`XS~dC%-V*9TRUfh-H-uFzI30{!q zo~bJr(_^cNPUuNb8CIbNzg_f)o3ZKm-`yK)aN=O!J(@Nx+jP zDso#3uq-cZ>=V#rUq*G~11HCP(AAye+IKlw(yG;ad+^vRRLjOlrv#Ac{QrvY0J~KV zwQ=HzL?3SjJ^ZM)>@-xYuKAeyspLkmGn4@E`p)L}9gx59mJ|mw3{F&>XZtL4^HWpS zi$bc4JA;A(GCIdn+uLO(OYl__}LO zWk8Ah5X=UUS1Occ{nY7>-UX(5h|AH-AxPj(@j~Wfp_o!jDHD-rNCheUAd#2cI2$0Q zz@E=zy*FNm82cDQaR9p>bewGxCspRk;wGoL_dgUjbl)p?Zp4D zKD-LPcS+%LjCSO^&7z{q%tLh?@wU6E>~>k|qr;a=Z^KDFf4ZTUkN*&MR}FOacvktVWUjlU%LoNRu8i`0y943Rjv$oS}O!1Hl_;@TlxY0Zj zG~m6h5#-I#n1GCl+D{UUQCyahv_J&P$;y(r?dq_NQ{?Bh{O;q!yLseMBF!h z&0;A=D(vzXBF61!>!K>Rqc;0H4{&B#ruaF%GnZ-SKi<30td**119gvMy)W1r;^840 zLe5!=YyzSkx1746t4#0R(B0&HWp|2WoGn@W+`W}OSn2gyC;N1%I0rgaykWbo^(06C zN3|}OZO>XRh7euGUgVX0@KIft8Uz9oX`KH-oVoZ{{@w|qp}hWhq)Ypq_F#SMwZ-T# za?CDRLvw~yc?a1tATGdHZJmM*Q%=(bPub8pbv~L79)WO-5ip0C!~S$yPE0wX)qcVm zb~YYf`&+6W&~zdc>e$$tpBziZ_(50|jTNX&I1mBjDFL^+YI)Qgqa3f?LedEKe^hz% zp)0^wgFNSc=TXH*2b%t<#kFhedWM)ENNqnKMUl0RZHDnY0hB=C2swcmBdIN=hg)5M zn&e(5LFsA0OH_fNr*T#a1mEU`3TRO=jaBXtMvIkxLS?nt7zlQPiI|g?3H58H7H`Co zdIsdbsY$1Bj)td}A3t%6Hx$K!sH_`;8gm{ysopr-?1Kr)EfBM*f#qj}?Zt9Ti=2U` z%5NLvJ@c#(0vgHz>rtBN5Y+)hiT)_UkNfSL(#bZRyvi{3_T)^}3#QyPn4u_?JlD0$2^9f?i z!gT2%DgbQ)zI|u(lWvTCE6sv01C6HP;DG}=OYS1ect8LzX4v;p9g{m4@ zj|)%NX%~OW!5AMOwTq`{b^v7!TOL9arD$^*(bl``S@PRHpps0r2(8zgCALLp0shN~ zsG^9>}uIDl~6YCEsF$JQs23dlXz@hMkt=83tqGXN}e;gcYf67qtm6e+CPPc#q($r zq3Ot<(>9w3sg(i$^&5NLi_PEglkI1FETvqLs}P7>!P40<)1rV;SX*>Zlk`3}XU~}j z)&_kvPUkBQu#uWx=(MF{`kO#XLYTi(L`%B(Gkx$&gL^K&|OS1ZMk0&a2&%R{f0RB-MSsZC5t_+%)dPw}BjvZzjnt#usQSD< zRrGP!W3)gwjP!eES9Fl*C3#Sf*&mqhA=(I@P)EnMJ7nQ0T&FkZK7B53VkLTK6>^cN$Z@s8UnZo`D@x6BA8~zv}NBn zJ!(6rz$VPW8BmHm=dhptFA@Fi1m2{lgu zr9ZYV)t{3^|1l7@oRqX<>yfU^&b!Gz>I*{+h5iJ)^Q5hC1+=A6hH72U{PtU>`d2LE z(1J>5vtKKiBL?Un=?13vDGXnfh#ow&#dKROn7u?t7Z3_U3?=p$PcO8Y!GMC-J0J=)i56&@ zLe`Nalfu8phra_@Wt4QEp%=F_#v_-de3B{_>DNan;cY-OE{-TQ(b9aDm$ro{Yys)1 z*^W6GZ!FBGVk%CD+Q*=kOAn~ls{ceF{wUk&#o^e?IN{hI=43XL~ zhY19sAis)>3daLn6hV}~=2%1JeQ>BDZ^mJdd0XN2gI?&s0-)Uh_(I>dhRjPin}4&c z2cw`pv}${=tLUvUJP*%C69=uJqoR^ZY=RPlE<^`=MGA5xKC_-zgX)6t2$G1VDkC0x zIq}d}mFm#L{;p5-BIl4f28Ea>D8jRgjMopDV&De#ywZxHvtlJ1yWBj((|zaAvgi3e za-yDydB9#mfvsT!rt$(j4_Ixu{rF6L>$d} zb0qA;Vw||2S_HkdehdeEZ&yro{9Ld;@Ee=vf(1kVw#9H5gdpXUd3lN_u&R{i&9y9s z$7K}aw==5bd&AJZieB{@UqmBPp8ot10xoC+N7*7TYz#%kxIMvQ#n+)yDQ?B{OzH6* zvn`Jkgmmwq66=4X{x=b>8oi!^TuyQG%P@xj1MMag6u z!~_X?fdjsjL;t zU?l**nDJ`O32FN>ih+#--l$aN$f5brzX^dnj<$5D6!0xwRI0Pk_IgNKBC=QAAX@c2 zpHA^u7~F?UpTo&IO^LWVwV9 zP~V=&qQEL&ZP2>6 z3pg{*YsltDg;Scj23mB@vJ{j5e8xce+MIGf&N}RF+x!CrM5M&8s-kE`Bt37ls!dY5 zTcl8o@wTFFDy1X8jQF@wJZWZVMk!c%k33XyJzfZTXTY)cf=T5i%n+3MzA+Rb;L2|< zWLV>=2KygnRB~m7^XqvboK_!evlYRPIid{W=vnkV{^{*~LZaVf5avQ5x?m~J_+HxK zQczjxE$|dB4dn2{v`FLHpZshQULA{v`jQHLSqZQZ24!6R-9wd1KB53)~y9}C9!b?;`yT^FWNGhPfN6Vw=YFv3CgM2jrPg zqqstMC1$2iuS#PYI#e=l#Z;0eGL;n0_Lgn{oMbfk`r#LqvJYLV-c8XirL3|2*wHQY zoPMUBv50>@@ChK=)C!w7exm6NJ*;B$Q2N+nwnSCU@+X%v0e;mWyz!GKr!2y;Rhteo z1v{2>VD0J^3vO~ysaEo%#lvZ?9BR$xvBhD;;G(f+R)Z}6!LWy)yR$y0wC#wkO;w(N zGc?dVvINqybl7T$0NzYgR%IrHD=0J1vI#7MP(-z2yc@d#hq5M8P?=(#Yy*_c^2xLbO$V^f}HhBf~L$2uG<6NtRu zr}YWj@U{*mg7hW%U{}=z5$sOQ{p$FyaFwIV(;sbs)Ocdb9})tcANdFCGc;evsOO^P6fk`L`K#t)9@~&jP7vh2#APfhgtb{JtAk1v zu@uE~yi4ax2uOL4fs#C4<43o@^z`=h=?4mip!na*7u%q{6l-czH<3t2ZZb5jL6GxQ z?+@gePzFi0^3ozAW(`qrk652&M2X0R6ZXXgR!tw zOFAtf)jUC@a(lL+>74g<@&jiFA1OhpD|;CYw|7HTZqX=4e<7V(nha4Esfa(vi`kuy!kgW5$Gd{G+|+c|13fIx0t&k{ z%0d}GI|DR5Z%ZKZJyu$Vjay{&z~fYvP$^W_CyfgTD=P20eH9cZ?~N0O)vQFQW+6ha zlZ`a2@KedE`vinKR;c9bT0})$hVJ3REM|^W0drYbGy7+PT;Kswu+dmFvq4kl=(JBk zo^&)l=TT(^Z0gk!LlE%p*9*m^P&GnULv7P2dL?1boyLwirtQU@Q9B%jE4wj^QNc6z zs%xDR487n9q!S>CD^<_2u0sJ&`yEM>y(YmC$tfbK?1#74ayB2x5B$2Pe<&YHymIkC zqT~c9`Y2G4nuHVv>awlrb)QV-k8XVf8Y20A-d8=#9JljDp{4f8cxjwoTta*34G@O$J=A-KsZtro}{B;8zoGonMVI_^&^=L@5eI*jG$V%{co= zAylaXVDkGI${IC=P5v{(`43V_fT+}qB_*hq5Py6q^{LW!TYRA+=M(m(Xuh6rANsaWbklqD@u#6&_{GQ>yl zcWryBzG!IKp55m&6#rYXAy}n2dIa4XjV%b#)oGs6mJj!rxdw=8Ppis$5mT`#Ihlf* z7#|M{WW=_-8?XLQ!GGXDDx?YYNdSc2ku^>IGPW6NYDTZMOVsP9e^DXOhqr&d#uI_F zRr)MLEEMs?YznzU8EEE5Q9-Ul4qLAtUn+(<1h4gv60n-mS4A1_=#NxUn+!h{u&3X1 z00s(#UJuUwhmM65D1$(Mv4_xjPigW>(&iwptB>TGeu|$ophe|@z&6y9@reE&b_|R` z8VyYfv(s@yWZebbA(HvX&&n`l>1-cu_G*nQ!lH)k){>khBM3}Ka7QlS{Xn$pGhnJP zt@ZLyMm1FC_2YVkzVXJ!pe^56peV+bvnUiBwWQ~GpxD)xK@#$ggLFw6OE*Ht#>a+ULbs6?JaIur>I z!Xd`J{w(1x57|w+SdnD@#(qiL&#;R0(i7Yh|Hk!2oINbM2bKhzL69=DBZ;UOVRV}R}O-zWd^4|fy3JR>`p?52V%Xc7p0=d2u0a`cx zO(wnLd+p9cT>()6QLq}N%)*zP}qJbGmg-Bi)TNQL&Ew~ zC8^zBpaz7hZF@XAH~cLy{0?y?t4^rLaWy1rPp2_9jv-R2G7v37IQ1>)#uK{1?qW~2 zMge<~RSZxI|42Z-SmwQYYRESoQV6Kt({Ee0SyvAfw&Wxz3k9hYspkp6b9>Ixd4H}9 zn_eWG`9(^AM$cNPlFJ~V2vZL9GSj$FlsVewau3>V>DU$@h^8B{+~X{w$akCZcoF(x zVl@$=nxZk9s%Fp{5P=d=9TT=YaVvdZhZU>G+lD|Wl+wf5%2ZB59^}BarWI4XL^SkO zNm#vF*1VL)CY7I%6<`VT^C?wC&R!5m(ob$bg@?E~J{o&A6UwYjVsPzCWZj{R?<1R+ zmP>GSndlMyenR%T5=Ftf^iF)DbR*VC*m@Lk&c7X4_0O znfC3K72|v}-6Jgei+|ZfNvJuua@*gV3tvJKCWZ_RSLOYBKW*EF?ew5j9!2wlmir4D%Nn31 zuYJ`s-ZGdYG@LF6;z{+pl8Zv?B6T1r*1O_SXKZ%L7U!teR$H#;qcJd#RH|Sv@9s0EOod-I?UZPC#pVHUFXZzWS_rO z)wen##QgV2Kn+oMDZN4xyg0JB>nZ9x-|eF-K2kUF^Lw|CCR8HHlNqrc5j{;d+tosf z9|6mXIL08wvNhEG@x~!Y;IA0)E$tCYahtyv_D$cCld1nrsmjY%R_#lDbeux9m_zT8np5%lhe3m8@unszNWu4>r3?=N-Jm6Jv zV;f!SZm|M8+?UM;-6^vl$F~lYt+8b*C$ZAuj4GyswUHKl&yoi;T!SPa$F*<{0YvW|XA>`*d#nw^s@49cpM>qvO3ds`1GL^WFKmc9b~t0b&Csh#?T zqdUvB=sAbsxDCzhEm9z@Bva0hiU#Poi>!t@R!dXPMc}fXQv;>b_yL|K;~+zIdY?FH ztzT9pDAF&28>&>{WrqFe5Hp){N9Uyvb9ko04$1&7lYC!i3=Xm9CyT;>c4o`-viCJv zl9(Ii%@yDWKH@I=t2c!UyliZkTX``&a>tsrf zMs#$a6`>&xDPh_TKq>ni-eyvK%2q^sdL+`wBX5jQV*od-|IAF$L0UZ!XZANE#?4SN zaHC|dBMBVRS*Nt0dZF~G&}mlX%?b~1dt_N`D(k)+8uFIv)yTKe#a(PUYzq7lIoLpB z#=7%%{ZKFwyNbSfP!>JouDVnUDe=pp4v1S)&Rr4XuY(i-JXg4eT@epZW*p`#+N!+> z0FH-IS+(Mv;Jq^vRP!|{osk3N^0SikIq;WyG{%(BlOc4s){e>sq`b9RoZ z|zN~4f8SVX60d8)LXIvq zP>Fbu&FXpvuRQuXcj@yPFmNl`?q_@$M65AlSo5o$Q5se*!V4Bax0S6~+YnH)T}+o#^@UQ0Qqe_?qQNb`#fEX;ZgeN5wLfpD~os9bY;_u2KWq zk^qMt8(ty`k8dTww{aBVQ{Sc!93B5JVejFz+mfC29T56ZG(u_60Fprj7iAZe&;RuP zBerq2%XT?@N)({rfG|cy*+3agr~)IDVS*+Hjb`q>bLZZfo6bGq^YeS2^>p|9o-_FD z^L{&Zue?^T?%lih^nN++h&~zsQ5oR)yYaHnIJGI_IHquu>3=|2V?0BFvDt~8(5R@5 z5;S7n^gH$i31Th%o-Yk}H*rph&bu~w-zVzOB!UrC7x2(aqLKJ_uI zKEK*DRhZP&i#qJA%N2RKBG$Y~jM6nxx#}s?ejNAkMO>P>)}hAMt#;$#v6i)(BnWV! zpEo8Q-v+o*U?sMD>`9o|!E>HF&*HBxX{Bw#;z^DEa7Bv4{wo)TdOo9LEvm;*&+ED| zEg8l2AGah@!wb|B; z5nO zOSDk6q0bkd(qCs2QY=Pf1;!HwMYmCxeM<5JqpfyJxJE{toTm0K4eadn7czv3bjvog zZs@v?-O~g-a|~*}8~GED`<>5nxwi)11YAZz0u*p&euFL?_F-b{I4T6dzJ{(%ss8l3 z8AnJTBA{uX*C>q2uc07S2{@ZbxH&D4D}?EM2OaT4b||Z#bPvV0b)HVtak;pA%;U{m zyq4U;ya=MqPjEIu?-3W)wnn#3nyH!J2VQn^l~&ccA-j;+^?txzvbt3xb4sWIo-bd1 z(6)9!(4Ek(^$^yqpmF1sdb?0a7z>mPNl95K;v*P4kxzfd#4v&6^H82uuPW6Q(fN`~ zF78a|tz<%Pc=-|w_t}+8RuC-S5RJr11xFk{Ricj=Kpuu06}a6O3_0HS=j*Sr11=Xu zt@SpMORu|kuUk~KJ|-$ffJMuTR7dRtB!^6hM^GlFd?y2cO z%HYp-V$y|=m|6W1J?JYxizBg&JY-Fm=J<@OuX0ezK%I?bjRxN7Dy-1NZ4vU&&;J`) zbF(42@ib4z1lU%(1|8H+&7*;^4(2HlB07+uks+68(la&_WQm=X7}v_dN$EZ&gG5l& zproI_7(D2`O>*QSF}-U$09cxaSM>XuvSj&7Pz7qFR&eq?%aeN(hKPKfQ>d#Hn3UCY zZ4#Cdd8k?tQh2)esfYJ?5ZJd>Vm)QKi&hTY@)IzCHrwHv}I*)IFd$rvYgux{Fu?oLd$s+tfS1v}Z5vq*STh30= z>P1IYj!!ELUD6?YD`Vbo@IW7N(IYz+Uz+$2OnsA)r)oQWrFhUZ%}@_0{8zQe;ykYD zjWhqSr3W)6daNKYr>YR|b62x7BGzl`&g>ntU;$t;z{ux-%$v^6#)`6j%iLm=D6c!2 z0>1|Bjf-?B)A-w!v37!0wv557h`v>`TB zVEMl&@^bW|pa1l{b$!dAxSs3#h8}IOK&}QVb%j?Uo~=yCcMV>EN`%QD(4GhOpwydG zNJFg7=k>?4rCGI=iNVg6&9O-(0WDb(lY?3O-Px_?EMD&a16d+{Gu|M1UCZZLQ;;H11YPL0uo~nqHa8CBDY|f#|fXB4(dBK6-1aB@s5-9FGs;E09OUb6=Aw;6%@SMgm!wNZ1P5x79-%iaWo} z%DT6ayJRXqk;BEN0zHFumK6leXyX%Av2t+1mHlwrQ6TtBdg~bT2Qv|0tl2>LaZ#+#5dkn8CU$2TG8O1Yb9D8W zg1b+cv+@>^$+x(y`pt?SE{Q~M>Ya_R$ZK^Sj?5`_cf#mw=$YQ(1&IKe#Rw7~&Zk*< z>CPxl9Rug~M^wxBwB+hK*JU=|TnF7a9Se3?yeA2@YZE4jAI>|dqbkVtHXZz2)^Mmb zs6}tb`3zDS8+lpOlTDdwMcs_LNegSCc(qnYXvZdR9e_yYp9#t^2B09LbUa}&^4O^z#- z(wFziinyL-mBiURS|Q+@AIaSOM54PziR{0s4C3f-lHTX#QbfRm28|Ox@ziKHPo=Pw z0L0;wmJUZlhRJa}T$HpZBS$INC9Qz2$^c?N18=Dsl`Hm$xc^Wbedgh}b<|wExD&5< z{q>od;Ch4{b9#nfiX2M;9DmkAhB0uzYU6sJU`c2tFSY{3;A}kMF3sz87IZj(@TB>z z35U9qe$s-{16eU};^6X+WjC!CXzxv8Lv^I~eBK3vTcG&wG<}l<8NrN78mZ-A@u-Ff z2{A(6L8282%0XmsJ^+0wgK0bxc; zPjo!i5k7wm!e$$)p_Jb>U9rckY9-;;{`E?${B^~eUid3eirO2Gt30r__kAPUMavCf1e7X7?&0V?J>2GzMf!HXwj z$$CC3etvbL$&JSOvVtC@Wl1D~e!<6U0yV&FCQxI#4uu<0&%1{l)=>^+S4FsWcAwYe zO|Ur(=MlN_P`EJJ*L^bP>a#^pLO7NxBF@EVo=cux51BkN!^ zz?EzBjmba@P$O4eQvkqr>8OeYE)z;S{)2~$0me7M_1_ek28!s}4;K)$ zZc=#sH=}wGFC$Lwb&}tao&67>+xqNpz$*mWj~k|B4M2_;*Y<%B`eyclxwe!}TfIIODgkn1Kn1$W zuWsow*A5i(Bm+-u?Mf70_&JC_ttVN|#u5r={jM}~iAaz-%TTSk&Mk~NAX3i-9M)mK zjPQxD5%~dLU2@^VZ{@)k)_O`)Qmq)?S7O;RV}N{2jzh{W>VP{Oo}U@AtAN{1=V)B zH9{_c;*oK`u4|(+WBH?_cgb4!t@;qmDAe#xHuE0Mo+;;c+cM~UFXG#RDEZx=qdF$n zRHr!tK=L}wPTMw#WKokpte3hn8BT=hB~4<=H#OVYqxx_j3d@B%Jbkk;lKD>trN0O`Ga0$o=9y!}yTp=~z>v`s1gOY*ay9;5uRn&A z4AdjZLp-%an*IiX`YzHtaSy0+_1)`GsbfgbXBB4mhigRSm75BgsnLbOjJZtQ7UHj5cr5XkMgM0dWx~#T{sfd!csgZB2R*B!J=21WMr_qV9zG4m z-Ae(dUOLzc&2hNbJ#`#ksp05#xi_a1$DYpP8vuD5*w_?3rqL@NeN{vdY;c26_tP?2 zm;j=!zne-$?~%BKXNL%5EZBq&M(y1wcR}aMN4(gH83}dU(cYW1{ z`=Hl}0hF>n3hQaLy!b1jlUT!s47zT2>4c6Rv&ZeyQSDW~PG#r6*bvPJ7iE-vQD*BYS$_b>>g3}yoROO66$Q;lz5RyH%aKNQidj=$W9 z`_Vxh}R#h#bYeMt%K?air`yQt^3m3r0()4E43{{-~RVpf~92eIpmZDXl1lG(#ArF8}^=l)fE zE#YyXFd{OAUJCbzD3io2tuaV|OoMGENLxE*y32OMYKm+kN+7TBA>ZP*oo0}5ULctK zX&D$Lt*)x2ReS#JavL`YZlVd8h<8$du6MPn~K4GG)))fI+5suNb1)GYS!;i^dS{1XrqaPaq<=$>^zH zzZeq(nrba~^YJO;gJI*6uphl7On?BKy<%Gm3iQ%yzjL>d@q!pm5ceg%&}eswzkYr) z4LN^b`EGgIoWw`Jr%K;0b?gt$8^ADwwkc^5ij9@C)a0==N=xdwBy|qOd7cm@pW=b* z{&?QdE{T)XkqGyJ1gMm*5|VdwU6iSav84!y?hR0flh?1v#ps!Kai?3<8@6eZ{A~fQ z>7rRJeTNUL(x&@_LRs?iaiRtse5qh86a$E)xeg8NPtkx|m&+@+PuoZ(t@|jNH!Url zCn2G(y1cC?ro>44^q;>RDa*7hU(&$q!{c9W=VXgD00@Lh5U&A->mLhK7jW=j z29PMz0Rq`gh4DPg2Qm*UAb(%6=F$Cs>}d0e-0axyiXEW-#^p{3v`M_Q`ZjN!#q1bu zl`=H@ZKBGk?NrOFkE?DNgZwg>y+ZHJl?^2|pJpT(%D9zwD^C28X?$!Zz&8Eb9pca# z4g|SiwDr2+OK+4HavGAzVvP?)IaOPh>Vb%lNG3)*@)#1Z=^4c}>P1;eFs0Ydboj2t zjwg+tr^CBNQ$liOGnI$?Fq#ru_*hu3zKIc_*Vrr|cz_x0$Odd(WNE#xIIDm9v!Mkq z*P=#*nU4htG$O%PkW31Wp@~i~8(Co$2Kye%mMJzQ9R}xX+Xez03R?5_n6mQLY^#?W zW$LO3)Z`T3wnV5-aq!zPX)5B>p|>`&=OW~8@lvhF?EBMONidYnqLFwgT7W4U0a0p4 zrWv@Q`sXx*E?o?R{-U}W#1uMYw4T)$NN<g56p=*S` zH+T}oZrLVz)@d4QN~t#JSH6WPF)Wl|qHv=fC z%=HtbTR0U0d&_*wu(zlZ3ExVN61M<3PfnZHq53+=@+WGj-VSbs5*!oeR0ci7FZ=Ct zt^l7Pu(t@H)Rso~4N`hm}ZOGZWBaz`s6m0b_LxR<0c-gNw}?yp{$|L~v4G3hP=`9t-K ztoPw1_}&zCEMaACKAgu~IZFo*Iq!HYLYCK5hU_OijJsVkvLQ@VE|92DRYw-r)c~v3 zd~LJ*o`^}5(H+Uub4Mt&U&tL(SWQysjNf0+^9=#zV>=1_(%j7((pF5)DT~e7KJ^D7 z!cN;89mfwNvSpr>QPD0M2AG;&(RWW#$wZ*hG)h>bysvtC&lot(3DvLpi9_cVyKex_ zl%68Z+5&VbEM?icN)1PW6>Z;=Ixt)^{ErX=*$U?Qv^n*5iXZEcmEvo?@Li|g?Y_T?BP03d>rbU#)g09fno zJ+OGb2{Nn(!-1Vn+#k+^E-XkNE?(+h==(3UTYyI^UyzWWD}#wlwr`q}a@2+;qC)7`XO?SLwCpw}Ldy;?n7~M9bAIfo%-1PN$&SUa7!~`>eVWF}uqw z4QcOJdCX($><2u7tJWVZle2W8XbG(1(wF5y32qcqF1`Y=B&buO?GR|Mk|R0JldJAg^6`X#Jl$==|#}qBNbhPLoq7 zl=S%PDu^uJi}eAiL2(bxoms|tT)m&fmx*(5kNc}}I4kuy`>S!6)kF|lZ4lZkTIkgF zN4yYB25X}MQSL3UGGOPJat`vI>%CHNryefKpn|o>$_ctn%*fghF$rlT2DIxP4~$k+ zeLA0vu+Lp$aRP~MTV%#0ejA?lofrs5ewhN*K5SK4P8fQN_8nwvkzbpuT^

Td$~wGFGZ+!0c&o)X@Aj`b5;R>aw$B;hTWvVT2NWzWCjV{?98 zGC1k;^A5z-HikfUI3I8>5D(ZuLquI4h-|C_na7NSB(vA_XkV`w3aNXC9?-{dB$j)* zH2`Nv#c9*8WGzm;J%9Mj@>tpV=iL$dWw%sy(D{tm<}pt+U!`y9SR{z^iw3);CrIJU zAtrRGr6dM)kv%a?5TO(FxrdM0jN}de&~elyjx@lmVqaH!BMQGI8v?GKGKM>cw;`iu z@$F;>l$Pn9Ym|3v>_sk|g>`eTbJ0o_|19Q;)Gw93H+$g3oCcwhET+8^7r5>J}T zFxSdMMc``kTq9MtO3oH9IY{7>%_FATMU0;b0 zXN9#-GdEH|D4x9Km$k}pDKcGicSKHi@KIJ28dZga;h~`gr*e~O0g67tM%OU%)VdEZ zvk04l5d^<}mAgFG`)p4&O*cc%jx`VZKttu(SZKc;0=FV7o?DS^R%-&=a-t=ZT;Wmu zI*2_H^V5>aWh|xXs^TExgY1la<<8NDFNB;1M4~JIpdN@}m^IC13Tw2;alLPuZ#(9 zXnx7G;7BUmvWV<@9{PHA?kx}j-PZ_={f>h5r6TrbmAYBM?Cgx!%#qJb)rQ;{ZLKD) z5r)#1?ZjMm$GoYn?3y8RXM`zQFGxQQ6p;!HxV;d{=MSHr$tIG?=bWqj4G)~wDku!+ zJYASAaGj-vZtmBLd4rox7EGY&cLhZk{|(`RrGo)7A8~*E@sYuIPee zouFn-7?cmtKB32IHhCwb91otQVPwm1WE3sEc=)J*>NaNRt9YQ*A%{t63IQ ze%2Sr1`q&J6reL8A%I-}kY!WY{68h>8Q;=deyT_-c$B_!fazCIcCZAnjd&6wKQ;to z)JTEC=Gbr}n)5Qp9y%VDwndd7N{HxnpAa-_5;hvxf~_Sb3^r@0)?|^#=1r63LnvpI46=&hhGGf^H|5HM6?TiZk|Jjto+?_ z47Wxghz=2j**(*Du+_0x$_`fgG<>%tlh41ortoW)3#HyrkYQNm^AG=uNGUMl?V0kE z=eqS;zY}%+WPCHT<1N>gg&0bhE`htwv8E73m~RUq$AAJP4E?uH!@Lv=%=kY${WN%M ze=hs*07%Kcq6`^nJf7_5b(D*AQ;=dSpQRc5Fd;$&q3IwsX;Qn-u6)-PlmYKO$^k^) zE%krsZj*3|<~%-aKG%0LciK}Q>Db)G`yH@_V0#iz6Z3fD`svw*7x-5LF=is++h$%p zYMj7kT=#^Zi7ApIr5O3U0!5K>w!Uyvkc|GeKM@|4uBvyHOhef2-? z2Im?mmdQ$kq_*5CtBns51$Gg$iQ_^B1-YIK4EuRiShDaaZeuoVEUIz9G;!(x5X`S~ zpp1b$RX!5>K0C?CnsiVBU8ho94Xx0-v&qg>m8B$DY@P|!8WFjZ6{&`jkwDIn+oSt8 zv{pirk$>$V0%sNV`}3IRjmuYA=$GoDw#{S;mnil%qf>9^{U8r@*Jd`_Y{l+dq35<^ z1&nrr6mh!7xEnH@B$-ndw*o06Xl zNXy1+P9df0`r8H@513}y=2mjMukyOL=%zxioot@R zh2gQp=Z_1U;Z|q zM_$jw!+Ox)hB18@0PD6a-Qcnq1aB-DQ{)Bl2mN@g1xl#y%znjZ^SHFk&3exaZTRI;raxXGPw>l zwYTkNssEG6$M86KjZGKt}>wTTXh5+9G8eL~{3sH(woT#CwO&)J(Qz)1|bURSO; z_Mu)4F}NuEa%5B)WTtzaf4o9ZXFI*r89AxxF{3?zV$0)#Bhfy|CX!2Ny_8@Gh?Q=jI`@N*Y~K&NZzIaqKEm^fGyEtQDQO+?BWv-`ljR~eY*RRk`iXI z{TEWy7ao4caRg}+G~ZKz5pi!QyhMEYn+9%+_TLmfYNZtx+T&*u*KyS7Saz+^&DDey zg%IcR@8j$uPtG|#o=Ha%Q|wSEcV4sy<-G@T@Maxq%ljFt(?bN>$ZZNLq)UEoBY`o6 z*>L$_6RPf5iEgF2nF$g)_lDU&V{Idw83Ygm34c({#a66zx{uUCjWms6%-pw>IA@sd zh>()^s~rJFwS+o%tC_24^XRw)^aiJ?5sumrJ6qVC26Lw)y1f(%l$_6VqXdT9I=64c zM3hb~4@@EzwrgJraknjb_(01J4I|M_!mD6B*ZQx)aQ(M<*VSlEbYKg<3!Ml|P0thU zCP|NAA?@ws1;tdMnjow!-+Zma2RfMe=#^6`d4=0GPre4@r-%$mN79LTq;T2#>Z zEVW}u^Vr95DidL_up`f?%Gtt?%EXeDxUP!Dhq4?urt)i(jC@f5K5ZkTae?Hh!EKcK zFwpVF<@e;AGlonVyBX4`b)?SGw!Fk{N$ma%C3Vl0kzkXi=8(q-Se;s#93_~g8A=oU~(m{4B%7v09`e>33Qe(X0uM>%}bTs@2?bf&-E3l*T_su@BPe& zpFByd1msCq3+tN5PClf=UOx9j8c@biElkc&!l=SImT}<)Py+W3RY$WHoVi7fw5K-A z>5KpiwfNeacC4b2I4?o;DlP}@{e(qpn&|0>v@AhBHp1%0-DIM)u zBEI2HHgyUL@T250tLi~i)v)v zh$IY3W<#nc@Gxnker>)>?Fy~FOlL`aA;(^>dfQi#Ym?WD7Ly-UMBn|C`u2dRMe zqf1z+fnFsLSA%y|p6p1KZ90PNc~DSey;*o#dlBgS!s(;w+z^YTNK4}>-Zo@T{0G&M zfvMoNmG{{-u>-zv$?H@W2-p6CE?ji72NAf#%`$8c-9o%>t|upmbZM?)IQQ<;I!604zxRC)b3IBZ__}KM#_gD~p#J1FHn0v?Mo`l%!uEz@ zLZX5x>qS?JTA2N$r0A9HDly{zaKCQ5yHWl-vf&o*gnnY+`VQK?L&S2x#){IIyevWr zr>fK{*M0cAiW|=#KV1IMW4=@N@(0J$m=Af? zowFB;I$jFzchd4(gfNX(47u}SXbHF`?rPSsly*`#H3L(%^nZIu)pUx;Ervm}XlFU4 zViCHVK9+c+Vk}B)%SbqmO+z0v1y$PGSXSc1u*B_&K$arsO-~TD{v%uwXUB_{iO2@L z5#)v?X5_GeSPiap^{trzF+J}-BJiLU5Yz; z*T5~2#S!?!G!FM(OvBDcXC)&|6f4_#ST*Whf-S%dgKUq%O3k7SrCr-s5rW-4-2ZLO z&7xP4ugU)k&qr&Jq_w5q^i}|WmNKwxEt+|*NVmOaO+Rl(gB0T33q6W2>4EPWs~J>5 zK>`5}?@wnOiowTECCv3{;Jv@4uq9BUdk<$8XvF!O7v7YWfqT!a~V|+HmgEN|^|2Q4p3b=bX5_QQMc6nfrze9M(9ERB?28w~@RR*hR zFxvQIwl@9N(aFepT&5qU@wx0UD zENe>gVpEfnQObq3kM)FMF` zSARL80$21@FNd6|F{0B^YZ&3`M#MDw{1pX=BR=f?C4t;bIa-v%f@1$C1!}fZZOfdCwf9h6ehXl8vl2TRL6KKs zwIuu2j(w+0uW`T7uJ^k~)9brzCcO5X`)3&$FhL(F>2GuVJ~|%nJ|o$gQqD6=v=Hr1 zYi_w<2$^3oU03YuRM<%dF?s0#&a13VZwj-#|sOid4 zy6-z6vej&%q8-3dcT3lPv{!K@2keB$Us7CpFZW!~FWD@G#ywv(X%r0Bi$s{FV!sT4 ze(q=RW8?^mP+HPXrB>0A)s`#ybg#|WN31k9(_7sGnsI(B&j?Q>wwjecU4=OSlm^EF zOP2usEg5IxN|2nB&~VAn`szjAJ&>@3-1vCN1=*O)zz(dcjBEU2EiKV2Os~NJ{D+H8 z0gypiNykKMd_DXjs(oj~DAN!_?sCkM8-^L}*JmM+cG$rA%YQSnNq@Ni zW4@6_Mg9hxi@_rsk8)#1n1yP^tsN9Lz&%Cj1jTWP%f#$Nx+98g02Lg2JBO6049~9) zuHi$bagD>Taze2N#1;qJyb|5ujyF4rWE6rh|J9C!?Zlo8#%!omqyn7?!DDKtpc_25 zMF;imQcEBxQQPC6X$qVX4dMHEqWlh6rBDMOcobTVnV(M$^X`i|i)5#JL1kD8!nXxWyMF$r)8dwti|@rmj;YbXK(Q!> z)q1qEh`y%y@V-L82amt(fUuQStYS`r_x0`t;@W&$;Rq_!Q{8$>Q zaNEiHOAHu%Lypcwhu^=veMwCC_`LQd&hnLpr<#+!QUPTqj~^a?kMWZoTps`4Jd+c( zMS1J*WsSYS+6YfkA^wC+MuGJI`NMDIaqEnZywf?rf6bD+=90}M3i08hI4w$pLYevjq&k>*4Qwtj43lv^S~!?xa6x+yGO1a7)-@h z4Mq4>F6XfrfC9~uDoLp~K`I0lt%`t8DENv)UM6GJPP5Ix&+(Vkcm0 z>%dVSZRlz^QoFiZP#cDYIwSGG?DGNVVNl?T*egvzF$eof6DqB`unJDK%>!lNPY;3E zth?hKkzhh;Dl^1tT7swr=l`wl`qRfR)I$HfhN>w6iX(Na9udefdg}=3;=u8kVJG@s zB?(NG{%-~DE5h}OzN?u|AU%Ej&Po)jtJ+xiy?*lFKqB+i2WV`?7BH1iwvyI0jFrfrzkezs97(#$)EYqpRo+}3j83pmrNU?v{{n1hT+6&ZslCefOE4?1L^NwRQgG_F-TcF`@>rl|8FAE&}e{I}lI0eYOXs zi?aJilHdekH_!$6642n;bpt19zhP|Vf#Eq}@PgPA#Vt}2MO#+CnpEdMAKC8kGhhtI z(3Tc=@`FSXrpxYWLD?i>>y zD}ubESkSzwXkUs45Vc6V7DMW+*&j&p>E$;vp~5d>Ta5~5{yG`lbQ2FeIyS@XFEo0i@pNg*w|s8}SxynGh2+R=~9O3HLk zYIBH=C;Mo%+_Pdsasr`~kkBu~=W2d#Kr2zFY z9K`BEVRT3^A;Rv@n^||NGHbwG$0%r`DnE{=(c>^t;6Ou}X{J`+B8Aq~ej?QB3HQ`0 zN5!_PbHQ;&GPPc4)EZq%(=j#y>D7ZO9bMMCu*RXYy2%61Ttb{nIrg|6^Syol=mjEbO3Fyc` z*;90IoL4AK7!4iE|yriczFfKnNNHxCkK^a0j*p@ZxM$7u~<)lf6t zLNWv3%tO>MLiDvwe0iPPE-s49k5|R>k^dN#XF-_@T}#r!8(4niz#`~6zUKTT*AMQ~ zwnGDsO&g@9EYCqvf?E<@{2pvu&}jpY8KHL~f^D}3*Iol;r!D4t4Kc0fGf_)s7JzCk z(tC>IBvrUn>}p6hpQmOC#>8k*Xem;3^#bzBYZ#4jf%+e6YT$VP3qJ<<#q!i`TB(r@cXL&@eA*9Rd>(x5`h%=TGNIP zAHOT#KV~0XYqHdrvYwy&=>vfTokVmWUVf7VTUTI%MK=?~X^6y6xKIz-m8~gNeRQuE zpx{>gVrL4o6L#OrxON$F*_qM*tM4vCzf*G`tsu-z9ew)DfG)k=gfUA}V`6F=% z2v`+R{mH-9aA#`zh9NxsLuCOk9)E|LUp30VaJd7gZwr=X0)nu_+U`t4(?%@NW4Z4@ z4~-Y+TU_bG zXGEJ@BfKFGF}`9U0!Nc9ifL@%bX~Y$z8VqX(J1(X9T_0^BL-aw6dj0`u83fm-e%z{b`@wYJhz2+;jW)JDiEe?>VIoukM-u{HJpSM=v&2Ri0cQb9j~}E<@WJD!?muYpHvzGDZq>5}SCQnxSrTvelN}=Ir^*EC z1$;6w?`WWbje=$$ZdfSt1f_v=7LvqM5vR8FiKN1rhf=@V(6m&bm>c0(rGfaAK?iMf zrx~Rbt@pnlP<|#|+!;?s<3iz9SI$-7ips{i(vb2%tPxRzt0cMFi`BMbGfv*&4C98? z(Z2Cr}jIiWRI`1}E>rrE&?i>wCc?Cyl6BAPekS@s@;B z0ru{Hq-@~f@y|?~4ll(8mlzmCF#Snj3jmxa|?F2G3D(DilX5RY%NPfXAnTLmw=TA zq@h*R(~XCRAJebCeW)33Vt$s6k^paE^Med+P0t_?hImRtC4SmsJD5!>`g#Cn77@4} zlva80j4FMFj#z+61%FIw++)U{H*G3qCMu2YkHH@x4P`+e2= zVCUNs7YyltGC@PvsV?~yYu!HZX^xUEga@;&yW(0`evoqA=6Jnc?du)xOKst84fZ(> z0QAWG3UA@|I&f@hdfco+nhZyvD4wuiw;;u34#|uqEz+Pc zH=I91^sdf}+{z$am^+ng2d1iw3WI&Ese4;OAPChKAaMpb@_*k2xB|{tJIL~_?%K(V zhd*NqpduR*h~D`N6gxjzb3mr52$3@MsA<;sN^QxP`mVKPjlgfNxe814q@G*aP%0i6I$IFdw=Cf5*}TpcHz#GNE7M^npf~OW&~cZ4Df1Mfalcj%f}i2loE za9)0>9GGj*hfW<9q>N-}fz8XAGe)2Su$6Jf)lZ1To%&bZi5e249u(OhbXb*muN(fB z9yhTsReYu;E15EobsJ*!HxKQEI~3O&LeGXhe6Dhp5Buou>dDp2Ml%U7R$97y~M~Bv%miZNYd$Lk)pnyaGZOUc*M*0lQXPF?P>V`V})Q_4>J2ivV)` z6R6sP=vD-rJC<*h1;Z_#hRCC|O{*tAqU#6qo_LAhAw_9gz# z7NQ#sFp&=LbDS70ysp+o)i$G{>{_otI3s55iMZ6#8z+Z{-Nyu@#_8l?wz|23`d{^GQ=ve8%sD5f)bC#}RUrX~dKRZIkM!L*v* z*2mV@^I?@01-{NFLa7=L=SB#DUuk}wI}%uC6y9YhhxOUIRUFmn8b6iePQn)F{LIck z%>p!*kA>g_NgRD|BBWepp@Kwt*S-KOI#U-=LZ+b?%d7TBL@HxIZPD|%aujH9VSy6- zTDvvf(7$~7woPR&8~_O??x8@m{*x&wKn9mCyt^W}r1$VlH$09=$%;MnxZ&5;fdZrm z*veeP_E*CKS0)f}s%9Z{4_h4Dx}WIq(OBZjRCk6M2)e;GDJ+fA{v?WN(UM=C+LImv z&F?$YWmm)f*T!5TUywKGuzId^AmQ-W?IueP(4hEScS{Yn_IrZ)HLbIp!0_??JQAjC z?_Y+LcOF9kqYC4~chE2J;it%{G%XM zP_J$Q<-!2ZGeQHp$i9LxbG{mc_~|sMv=21-6W7BFm-dR)tRy)fFj`E&CqFSVaAzvm zI$y(fq$1H*$r>b53D*;sIP$BrACsfuW{?*tkw^DGE26(9Za#L=CpD3(sWl^CR_m{KocEUXo%L4^-_fzHz_4(AKKby5 zDj6#gJkEPOy*c})-1Q${n3tcDumuC=0)ai3SXebmdBFG7m{nvo24>;v19;?H1(vxh zfhKqIL~6&tkPbG+4vmdK31D~=Ro~G3ZLJfFeu0+0%3&tdtr*VZm;?i#M_(})X9dk! zC&x%>`sL&Tux%l26i8y5->>0tBM#)Xjupxp-bDi;)iteZB?`aL1^N8tr<|jre(TPc5=*=#tI~WDO z{eF`(y$Avts>zN4z@X!7g{pnnj&mA=Ei&inK{9TKB)X7MY(W*Fc5;cimffs;ci2W6 zdJ{{KYJAkl*NwxNAWJ~YhIuxRr|>gb7iVOEaGvk~Lb~7@-3-!*EktQri0#-`!Z9N8 zpF}+f59ea`S1(^ySokXw7LKNWI?Ql?x&K-oD7^bPj}*d%6V-5CPmbkpsUWguO-d`np3$% zS0s$QG(7xh5eLHx#Pv5o zETBXtv3QE0&((%yheT7f`7o}2vGiQ;7&0rLP4df00PsjyYTmr$@xk~Nnl$v{X0zI2JVGtk%i(5t0Y6&WRX_3G&BzN=;5EFzfow;>CMBL8O?YJEex9{ zurD=>l7ZGS!l5;{3Gh!+d!!qRcq+8*2F0|vn3nAg7Yol_Lm-6tdzu;CSq`2&+=kW{r zneFex;Up{cgCyk_`j*l3n5CAz`S9V>8d-lvYyZ9$Dt^~P?9cTkaYnI=CYFe0>OC3c z1Tpb+8+B}@dUU*0iC?{ZQ8xTnMfunCnEi1mCG|uab5bnhTp(0yqC2~va zuKnWSCvE)`{l(KYP@glS=FXlHF@9Yk7n2ofN!@gRoL`&|fXI4tnRCHg4s+h)dgO0k z$eV3$)1*ty{*tu!hhZRUnp9zX8L(cx_9mEOi1c_GdmXm?>54(Dz7w0Ag)*mtUd77Q zXQ!b)iaM)B(gdIr*{dW(eYwQkvS7KCYV+7G#Mz{EOL5eW>$0E*%~HnkAQGpRH$)Cd zLfaWTg!cSkB1WUMBjwmJqH8y$8iIQ3u-q*eN=BbFg)8&i%&v7+o!sTkl%`E*kr z?msIx@9V&tbxS{6X7)S-?rPsXgbh8SBQ^CUKeMB2Xbm=X*TJqQ!-ra!_|w0*eBlyz z?_<29!=uU%n(?DZ^NbdLdiuOe{H?sc%PVp6P$9j3<8gCoRbP=q|V` z|5Lw;026GayJ*cDrx}Ow`2B+>2cuMT4AWHbA6M`zDi%gSaoCX*{1}+~-HTYiSaDQR>(aoI+-wUX{>jig=!4v-LsK3=d3l2kp{y)0^XP)CTDDry#j%F@p`Hc=q z5SUXHYk}h}DNIp^svwGQ(De^hwz5t2?v7-8%2gb77 zf&ekcJSbE1;J-3a;}7^Pq6t5~*YUG`x2%MX{7qDz$DNQdTNA?2Nli~_;xzJO&u?2) zT12@U%GIA2BaIKeN>Bl-l2A-sIhtBf(3lA%u7JDg$~DPu>_KWJ?WgPLzU^E}i`T$vm+Wzsl=7 zOTlb{Z}Bj^c#er01Ed52{DG=6ON&FLe{uP|jOwooz-v1DI0m*r*#whpYqAb61kDUz z4ikek-PnLsG}G_~>;`fIp9lLtHY4JGN6(8&JGCzn8p6$Op;rR-lerzu zj-lF!@Ey-<=UaUM(btr5Gxh6vV*a6mz|)N9YnF#%0JDen-(o9XE^+*0xkXP-TRQt9 zgL60kkY#2)%J8Ak{k8%D?f+})Z z5qqxn`gwd^CSF@Fb`;j1|JN-nTKiE|^%l)n|7za0GvXkU%P?GH$i5$IG+#3kzNw09 zaV|?hH1Zq$A0afd_-QPK?)A;-_bxwRf+*dsAB*Swxc+k7%VcK?U6+eRu17Lzy%|NB z?)~M?B%#Ey9dOY51Ps5`&>&lyBlq+O0@CJ1;Sgg~L26~cj`i@9Ti6J~*eW|iK~)BT zeSACWATJJ(NrWNI+YD;GERGG!oqSGj(SmZ)1K7wgKAmJuncJ^3Q8O}}(6TUd2N<+0 zVsyF>T-kMGa1Ar(2MhBUA0v1<$`=4Y_zA=d-Z!nF2Yzl(M<`>t?_k=zW+M>p*?R!* z$>ZmmF7{m+!`ELWY+B?;(-bLHA7hV#dM=?M0tQp!*JarxN`c&-l-zOM;;nLl2}EIW4} zPL%$jQ3NKuBeoDp#f_T-Jk7Bqa-!`GVMM1|%W z;Ky2nxo1hj1W)A%(R!%)#LFInf?oCUkZaRL!SK`MmV2pExp2Sbq=>_GLIItcV=k{_ zj?;9&NL{U+P8^WDhQ&sthCdqTugY7BSf2_;4n?0XEdbZcXzBG=S*pHkRW!@B_VcCi z-1G2}2yoNTp3E2CX>&Q=@A{N0aijz|6Zs?`o#OcwX;A$I3mPeT8^Kn<*H<&K&d||V zf`hx2dt{z=Kaj)T`+JoC6|Y+JfnccO|2Q0U@PBo4I2$|rl>J9p{xc2ff1p-h(=^@c zKi8CfG_nS1pl%08g)TFeqzl&utJB2kTk7_FK}&ad_XhudbpP|Rlh;_#O8{1Xc7S=^ zpXZOin}I#HeqG=>@AjnecX#>WeNQtx&1i>`t&UU4r-e&hB5s$v%3^|x>c7-APtt5De4V=QKSD1YtDLv`#`UOy=vN&+L^q=! z@(yDzW!-}=LY+Rvo~&Qr>HY}U3wM+YH31K}mIuY^e2L_joA?_ifveJW3pmfy01r!o ztEr{-a;$qYlv+NdTr~y&opB69*p$@SLMwstcTdzvgAMEC+-RuvcVenb91)5)kw9e+Xk( z8}+a%#?0(EzdddI>q7qtn>s~cs``9eV+@Zj-_)-U6yM&DCV00dYm!~WuWA@B6^ zH6fSJ12kvQBM*;gFJ&%Uf-GQmUvgiyZ&Y#Lnn?k_=JmW$8VberXE}psWFuC1T^$UO zZc^{Og@w?c&vh{VX#uiq2y{9yEL`!AIjS#UL^_&L{?JM+j%hmY4scP(9Qx;dzN)EgSBLv^BCXdp*smz{ws9a@Z zModnBytMVP92F9@A8#7(TBI*MrfiCZd6^u@q)`3!o&Ud!A<sibQz0yzcj&IR=rzfHrhbHRx)NnJ+ zavr5Su#h}v8;OVd2zwuclxub0^FH@5qbvJg!v~^pg7_qOj$q*YfJ_vu0I&$a@!a3; zwHzd}FfQ(?kS#=QLOK~sD%LJ>;f~+JUX@b|f2=PxC+Nv9WCdoDAo9rbQVW zl!b|w!5RyLaujPG0KKxXzBCAxW=gZUf%(Kgk8>L~) z(Tf0O$^zbufkS=>d>%DnB)76=CA)c^_?s6Z$1mECv&?o1i?ZQ`cXj?`yX3Flzj*wX zS~I((D#<1>DiOGWYzk^!ae8Ah`xRQqPkBuL?aRMB-y588I!cRlNziE6^q<tLOMF9(x8K#$t@kFyD{O%AWFElwHH67_K%NN-(! zHKh0)UYXPK)bAalLR%|HwGrDqYu}3|*?e~b3W67Dwr$z`f%B>9k6Ft99h)ItD*`bs zh+YS8!Dhi78|{RWHL(K7WrKYz4{?T-qvu;uTS$~eh8WoKk#+wQ=XTS6(xQt^H5}96K_JKGtTP= zkp5(v;b%-HJ!+=GP-VBvZ|Lk}*zNEO0U_dBm+x0|bZki();n(`58vRa*pub9>52j% zoMbS=T%ZeWp|>*WJ_xtKapyn43QOEbIxVf)tzKyPmiQyGvo%1R1ksW^$BoI)UOV%$&CKsIyyA^ zpc+8b<9_X$;}EvPPGO(>mgkydWWwStdIK@XW8BRpB%#{sYT~jG^EdMhqGEyVm3_sKaR(}&Z_)9@BcH5auCX0B&y5uIv+_du>a zC^R~0<3M#B5nF5mz1_z!^(%SwPJSNzaYtunc7)T%Fi>2btDO zfNhBw2Z zp5cydd!eNYD&$;Mj{)YeuAOk?7A!kRfc*BI^g`LoB+?%ek&_-jEQ6sW0OV>A_&@0@ z^Ut&hJtSUd5F`6%S|oip|13~W8e(nINYkyuAmy;Q>Mz<+wWytOfNS&l_GPUt$Kz@q zTX|uN=a1jOtGf2^?X<6Lu@Jn)Se9X?$F*e69k1TL{IknP;gjFqe5OR zgx+JXJW<&6fAuTviICwGuj4YBcw^EcgduE6V~ca8>=bbTf^Tdk{Q$D&UD^$)0b4w( zQ`$D&yEOMsuc}SBM}MuGgEAmt`Y-c;;&52n7I5C`@ucLVl?H=)RotPmi`4Q78Z<)@ zz}fI#jUSP#t1OMpw6kz(bO#?nWIA85dWhsQWs%n&L!0tAl6>=Uqw`q0PJiteHK}&f!Krhw|%}Psw!uXJP-ksM4BrNTS|lS&4N`D3=#!nVPO? zooT3V%*6N?PFh@fY+&(PU|iqg-ijQuRX%nkq~5+Mk52iuDr3Ww&FR_!U57uO;fufc zw|R+yZD(p+)N0>$aC|2L@C(kMiFI*^J!Uhv1V zCcvkOYjvhqy{2&uFx9VJv8c~IB^Gka1;OcJ0C3VwLWjFkyi5;ZL9^mzs@jLqU`)>$ z=yU@uA1XZ&D*A8Kc&FoY)X^2iO_k%g8y6@U{rKUNZc)ephZ1R39av2jpOtQOvoAP> zakPPDi@-qkBuVL0XS~grQW3ac=E7%_DCfPfdRX_5^sd@7&l2~0YD^ld*S@Y;55Z%c zBVcnBDFxZ}F-&p2@U_?0NDtKz_pQr6z5GNN=-)Ery{+4i1b}B6UTS>r2lvH`Q6T8Lq z(%bm>$g?iLx|LVMBE{Z)U1~Zq79kFiOfsb)Y8D03yJ@m7WzKHn-2TVB?68nGRCFqO zSU|x~q&7#Uv)R?x5+8o;^1FifzX%7t-Ib45Q81_1xb4HN%+9jW&-KvjwLKFmBt!~S zgW&Et9{q}zFm&p^<=CgEp$eCWcjdvVh%NhnN8Br2k1dEY--hpWLOcqTOyjw30hFIP z&k(3zL)To3R9&XeOMfY?Md9ziu9&4qX6qH&qS^Dgsjltp+vdC|gLV%KatyK*_zzf-Bx!>|qI`_OqSMTAoi~`F9*NuWiBpW5D2z?r(PI~#kdh&n{ z$lXZ@$`zITL|JljbG4Y(fPj;Ux9FHWm+SJvN?ZjaI=@hw{p0iShJ!8OtJr;Ec32=MvEVAuJOK=1V^o-E$^w>uQW^-UAb2a3i1llez*t z_p9yM{RLM<-;}d`T6&2Yh#h1r+dYACe9pcQ#kcrTT&mE@jw?!4R%rf!ADNW|^ulwV z^WC__oIJFkmLu1IW+1?sV!ot0>};q#>J<6l%3m;V5%nPm!FgS zS&eN^Dh9W?Ca!~S;lXNviA)AtB)K`FQ}+(dEoT3D`8F+ZI=;8mBCEIO#Sfa`_nl$B z(AQK>MWVjeyfy78XUjnKMuNFkP6ETt&Qqp!++Y3)JI&ux`RX`kndt06N2^u$5rO=e zfn`;J-9Se^@s(&Pt_Hv##+g(W%g#Nn^8N_5-wCA&QttwlNK%?Qvi}!&HGq6HsRO8rV&J}v+ZGN(*~xK)|+G`UcLK42sR@h z_%p;yBEDTL@cK)Q#dJ?zu+sSLrm5Iz zW8Ka|ey}0X3_gq$xM8x!*m;EN7p$x^V|A-;ZGB6<47JR98_W;!#$aEeQZrDTNMq}H z)6(m)toRF|%nzz@LI9*qGch{zlOu>SwdMNAUy)9*6{>Ss99egCOP2}3^c22V*VwFD zjs8%m+ce7cvhEvYE5stH!oyO>mQZM-^UPv2CgTiNQxqdfS;`B?l-oH@)CRVRTktWA zQfJJ*A#+e11>#6$BV@M4lO=Zw3M-qOHz#7pGKC~j{d({?;@+km$|e_q~KJ0rQ9Yzx8_1>rRZyF}85Yd-^#b}ML+p8H2 zkV&o#S``IeLL5`ztin%}7$GuV#E)gXAjex{Dpx?2sA7)tK5==7VAU{3=KTGZp0cI6 zrdF_8^Vi&EIO8R3+hlJ=Qdnu1htt}ygAuIijfS?Wl1r$%TU-Gn*KQaff$>9QIS($Z z=93_j&994j*mQdbUD4LG;TMB!U-3Gx`oGe+*P|% zL?S1#bYZH(JMh%v5RuWXZbuJNKtd*&u4kiTtLuB?2*Q z*L*|^bP~_>%JHNMD#VWD{`7^<5dI6V_%ClxKGEk=_xH9@_xhj-uHIRx&e7?7xc`Pm zZh2h&`OC-DaR0JBo`!o9sUxcwDShBi9(i?A@^D_^`0(;|_rk&#ZQ?m5vH2_*_60x3 zRw9gY&abw~=Ynx?Qr>xJr`y^vJPICiY@IX|2an3GuiK;v6s-{VB!=jJnnobYZerX< z_+bYjj8*r)H3JGS+=?Il>+J*iCcg&MPwQSf29bo*Z&B(eSR3(OvE`j_xN3S{5R=*o)n6Z zdh#_uScBW{WxK0=DzZ~jYUxD%bH989cA#}1$a0o(#5G06C0x$Zj`An2n6k>-?ZIL3 z%NWymE7Aj{@rnHtUCC3b&@!?*x+=g<#>qSc#Y8q!h)iZgn=3ypFMRR%SI7UZ#}{xc zH|E3Ii@fGJuuK&iF7IzAv+g65FDPC-y8oNgqA&SESu$9m|KRey)5&(T{$4*~^i(eX zezS&iqOwJKs*dB+fDcwzSypqn-7KGfC40PfB#L4Av&9B=cBPZ7MBd?2`@=p=H^6}KsTOONbm$K#8!$C$z~#IM3^0ZPcP-A40WAs)a5 z-b2?k)sR;gO*xg7mlK%ek)i9zQGvY~;LK6~8B0^L2?q82*H?75hUsE>+;ky5338Dw z;!@uIOM|e}Yq@RVDNn+Oxn6fTUxp2lve$2e8N0M54^M*M`d&?K2RnRBwKl->Rs+m5 z>l^O@9)cp$Wu>-?fw_BVBBQ|!IhQp;d&t|6q?9|(TqSm~I$A%i`5*K7AbGvp@kzB^ zgIY+FAtfTmnzIIt>3(iD;>NDQw2`zj6vXw@uz&LEiRq$S6wsK1ehya4o@eMpBVT2e9vV zSJth9>&j~48K^>E;f$k_a{-ehR#)eLWc+gR5VahE zZ^;QJDkJow7HnKQltEo2;0{-tVy=#XLG5%k{ECikQ-3h?1p0qp5aRO^hunwgss9`% zlKPZFmJ}EDubP6wn?B0brFO_;?)Ln}cVrspxouYq|GX}vJA|}s5qfQ45HH54YRl$E zl4)|p2|htLa4e{bisC0RIvpYQq4)mW$T40=9(^>9=^NyQsvE)7s#l+SNNND+{qjB? zc@z0Fnls`#n2&#><`w!vF;y@RxW@<5E6e($;{&6o`OdZ)6+RW9L_%!4h53TAW*Yl9 zRs9p03R*&<1d8gZZ$2cHx!upY`1nOh{hMy^o>oUow#c=RYybfA-55phwH*5%bI);A z7i^6(f0^ckXk8jrGc)jPv3&@#>?0CtDDkUbf`-t&JQGHPQ`vfqV-2ecgl#^PLkS|I zG02Oy&^{TlUTU~khX28I;GgKSj3Sdr{`?S#=ZsX2{m{;pEe{abOmfi;kRodzUb$?| zMQ)+KJAP^Bg`!taL|YhA^V!3{J=CafWPluWtr976o-kSxlt(4R4k9LoLHUL@$o~K9 z&2(UhvQ$pk9v`yFk3?2y$Av_*t_$_DB?zeuuz1;Ws01d^%VrHMAjV(ulJMA&9sZ)&iDhO3C%Jl{_kU7$x>#Py;L7_l@IT~C zpPu{&ZuIqSdMqH&kY8k2R?dCNRoO#x+v;1ENcOf!I(1Dq1@%5?^kG?vh{KD&TZ)HH z!JT=bI{M?GT-3>&sp|iR!P9krsE?a^l4h?yyH0B|&{sWV!BaFX6?LU|D|!WRp6Qte z>jEK58;C`++5EwGc|=YTa^JIuN-S7=IMIfwu7=&fxN7SIRF8ZOxLm}rX!Jbe&J<7) z*f^~0!DrWor1j`1q+0r?zjqcGlWP8;j_hR;=I%Od4F_X5JdbMy;V}M`QkILk+i+#i zD61?0sKBPdpnxb0Vt^tVy^flSm2t3HGfhRe@SPHXct!EM)D~l^5|lt#@0@KxXWoof z+iR|)s;+zmJ_ff&M|Sn*{ZvVfosK@-|E&C5v#6M7^5XGt>5bsPq44!^|Fee~8-LLB zwC(M&qYkG~?cFxtNryi#SNh+@->Mz!n4d(xmg=qA6fDpt=-78i`r_5TLDzl#WkBxi)5-p=(j*6@7v0s>mgt zc1nth&f*%c!012$-6ITF6&Dp*ee%>Q!EYPp?#e3|s-~pZO~+}vxvVYS1e@DANS5L* zT=b#)J*rvTE36Rmwo_&W!=KeEBW=35@30}DJAkIA9&_U=%lMO)@HA#fmi82uw0v0l zYlZRo%Wtdf|6#w*(xInFEhT|?Ka*mZLC%*0p7mwS4=!IJNTi!yk#%1{<+11NtrpAW zn4}1?-%ym94v*%F+Z~rt#)$w&O#A+^Rd%|zdso7*E6;V2H!b~NWqg#fe#*K)$1b-l zolixd_h0oG+-;+M6H&yAfT@N;Ln<4Md}2SVgC-DVA4d92xkLs?%DF9L4gjE_UEmF1 z()onswvUA>!C{dIIHAl{xr9l9r&C7!>kIbXYN5M z-Vr49sj)sugpmD%rF4MVGZWb|Sb^!R2_v^@9M_Uw=hhEGkGJ7+7{IgDV!W>gn<_Kr zb%e~kQSDYsLuJP>bzCly0v6w!m3A?S&n%z*hWPko*ZBg&W)XJZbGnfCyq-LMPtMGD zX2-l6A=cuGkUqc2>Quxv;B{X$-gN7X7S%#yVaFDsY{^G8VspyP{MB@hKbo4hO>9{Q zE(Vaev>Rys;rtBN(9K2z&1-DQ#M^?P?06(h$QlQ993UbFwHNhW)|U=yA%_Owe4nTa zp|rtkvZ5?xeP6fqnx;?|5v-hYQdw&vuKp7Q83CT(C}Q}B3f8gx!&niULyPvR;Mg<- zSuil^7j#^-A!*!hIgg+rpEdG{@ObdH#!CPr3^x{~YgbofM7DV3Iz(uXeyAT8G30Fn z0L2b6k!7RUVP;>$HyNJ>7zzhlH;zd%VPjsan%k7yJ-q9d`Y`Y()9=-#c3PyxzHbD< zITo=GI5KZok$NAmeNUHg9ts0nWAZ~M@_avS-Mo(g`Mj+O!1pG3oD}ynm*2Xik^U5O z%94|8?+<n}=B~FipFwa&1?T z^hsJVzXYLFX+U7lk5r!DwOMn1JZR%IWB|YIILF*k@DC4W;pfz)&br>ucHWNJVNzaEFe(s6Acl#2{#r2~tFF6$=P7v^Vi?51Mg;!HUVATcW+nu#qx z8w&ndOha6AUHEie|8(f-frFAP(s&foC&uZrkKLkT-FYwibyYaK@ zlyTymDEW|fQ1tK!XrpRedv8oRb6>sZL>>%^75N< z>tC^3f68;+LUEM`8T!QTy!5HX1@j2}|0C?(do)R|^UeYcmSx%2+N3OMsLO~n<(1(D z)g;+mGcw}Dxu1y0h{&_so4?EfLaZK5Ks#z8HUAn`CL0Zm zf|rW+^Z3VvZoRDn@u7aDiylNW+w+8t#=Xg_1S^ zb84kND)~CQn9G~#tH_&L4a-rLBTNrKb8oM0!%TLdyo;(BzM9K;uet!k{W` z(NxLS@I4ZghBsf8QNrgRq?^qc+V$CA+p1C_^CD1*+Up_Y>SH*GB!XZ$K&Un@L(|pD zb#T`s@#DL)aRN8p?C*EbSD{9-&$m4qen+@ zic^K}d9qS~)fp*$@3230o={Fpw%XP!dG9wMFwx@^n%D&HEH z?5eD`NL2=~^!hzm?qjtmpjK;FV%=KEe?SpO%p`xbxubYf={G z7~2#k6B))`Hj<|It+EmjVN5!b9!4fy-opo&1VR6fzGHQA{z->&b{O4rL%H%cK@i^E z-m8#SbGSG=tlv^dkCHLWFKkh*LXXnbthA)L$I@2I=xd(sYll&@M~;&A5ewRl*IcFD zVibgfpy{Z$ma!xhxdt3UV?uot$J(*I&uSzcHlpCFKZxV+Qmbt5DxR|q0x2U#G}bM{ z4;zXF2S0+WFWePgz}5@H3JVR#<5!4Im3X)~N`{SAKV0OE`gfbZRr~bv@S9DE`4DbM zI#DKJ5Yj|L=7IS^0y$hqfHm=n^7@Fk=Mz}C5<+n?PNK1TDQ?sq)cDjR@P0vEY2~;hBk$IFO?)CZ$7=7lwp&v0cU&)nu9As& zq7PX8hKA!}D~SCy#KT1Xq69?o?3Q8vM7o#>>b+`Cie^HlC?F#S4=jco$PZ=Fm{u?~ z?*zsg$m2FW6S^n0SNy!LUWzwgWpkyxFM@9|`VSYA!Nu4WBF4sE0<;L>^JUmda^Bj+ z)(oNsVWJu;8_syQ-x@%-R1zX2;*!w3svZNtsM?4H2&%zgADjuPdHqiZ0*A;?00IpF zDF>|%UYY!>OpM31=`>?oh@9ODrglLELts^lwOKc%P5}W?uCnc+4?JP#9B44Kc2BU> zQbvix3i6OYaf`e2cXxm?PHB~IvW}T}th+!@XcV#IRlv_$+CrWEhbwR!Z&5xCojJioQpU!MQ&5C28PHbW%3eAU_=+T*X2jOqv5yqy+?pT$LnFGfT^$*7b5D>ubm7x(@TGD>$UnTdGn%h_WKMbuFlg2M4Mn=(^cdt}Ry zuU;zXDz&HvLuR8@d8b3oDqG&&mNg5Pw(iwcR4}i`uRwwG<>CFR0KBP3s)jIq2+e9S z!mxdJcXW|dB zJ4$WT9Lu!Hs@T-Wu*Qv%#v*6ssgWI|Mv;0&oyXNFpaSV#^r!&@`tT<7wAoeG-$8FB zBQHSt`kzq&+NcVPLDapeW_$xdbhV$0O&@VjF#%GDMYB-{xrO;o245fbpte0xUZb5EbhdXw z2XOc57&Tyf)OX#2m)l;BW0;8T7paj-{i_7zdAL;lD-Jjva2Ih+XrqU_QgH&AaTjfx z1YQxHSSc>~$P3%%BhbLkWh|G3u1hW75g@0hoPYh$AzJm*IRuf3Od~~_R8R*&U)fmE zV7#bz%_V?}LPD?2!F1n<>9fc%l%_o}|r=_7Tcuh7Zmv zlHW;lKSp<k}I3 zqmosn44_7PlJQL3CzC;Hfd==AS#XH&^?d1H^6}~eEl|4-&&&D#{T2L`Y8eq?a zoabkD$I%|zQ|1&C5t5G}b86aJod`WvC9)jPVKzBG)mu!~%`qAm71=eH!8*w` zC?M`Br+!)mr@kL^=4cy(JPvWK-b2rS0Xk(}QI()SVuL;H5SzLn)Gy0u%0UvBK^ibb z>3FB9JUsDukuKbmJdW!3-Jw&_9+LN1vF@Q%+R~(AgwQUvj6#Gnac`iWjMGWxUWFL) zYc-tb;NiXJR2R4lcr10k-tNld>dYX-9lPwv+UA`QHBgShQU7prz2kXMw+ckUPy|A^ zjOePr6I%#HyaSv$6cC2B}rd*E{g|Ao-G zg0J5rq@RDcG))-k$QK7(4x=Zm^TIq|eU>V#)vgGCOR9|DBt(%nf6Ym{>8Hv?Q=m6W zzoS@xD)yr+nL&VCr=$E<1m#-sHqTZ7N+)B%eAh#!|la;+ncc1-z{;k%oY{W8P~ZMI>**Ny14BT```Z}MG} zLh?9vc&P4`@4>4TLp@|YFN*uZ;}c3GYvNnI!yFaFu)IwG_Pt&7K3Zmsj2n=Gd^JD% z=_I>@0G6u$J7YX}V~%n+@F8a*h%M@7QpO~B*RAvc$C=02bQ9Ua=zC??Kkm5dRKIKs z(C}k$pp0s5G{so+OOJi^Fr+5r+iMv;V|c0u9E9RA-cI#_vp&vSNoS8=vHg`87LNH# zbplBx_N4a|ohP84>C5B#`&)!(k3c2!AgUAcRWwdV+VH>?8$g)`vWN} zc2zZ3?(w7na_(!f@^C2!HA))CgXWulYYC8H_-{$VR#eANXc=5;Qy_!>CVcAoH9mTy)j(Bh@A_WVo5nZgXDwH^0n5Wu6>YZB(y@9-W7bt2!9NgPvk<3X)UFu} z9{cDX#HHS+&@C2ME0(g$e3*czc)g!88@g!&*}RDYf`90}RvRS&StZkL#O3#k#_%u= zXDI|yroGsaTNt^P4#73P<{DHBfZI^oo>!v-Sp?Y6D!h}l+HI=OydI-Z29$8Vg(!`) zy-;W3tMb`sL;QH1LRrWM3@C(is(h|N9k0t%cgDS-GA$NLF*oj5c}Q4fY?m7{fQW&JOq(S0Zfpnw%(Rn%;EGSLe%_tgR~ z!hE73y~&fA7I3cru9rGUh&m$@za_iU1(OfSql$sU4={w-y$pNPXsmbn5OI$11P&}3 zZLa@kl7RpKT^gvHj7sV)pl1?iVHJv^ZVUIKA(w4WFwayXIRZ3S@6FbZDSJCX8*% z=5@95sPmoe2|0|50f6E=pK)QA5Kqf>(B-9`=DY8y;CrO;&Mut}{m)N)c>8o(5qR!2_tY|3cnP zM5dhfACFK^O8eh**XCVE{C{bHMXLdGo&QBU_y**3?MSwjx~l_`IP6e)=sg;NSICPh zR2>7&tIyeyokbIxS}nC%weuS%?R04XHuG4lk?yHIqox|7cN|#}1zG;C9G0R~NjWVP z>E4A<)hIl9;a-Kp>c};P8eE^dDmlHr{t8Brp)`{%$-%X@?=a_ zfR-LM@PnWOK2-+O_Vr+lp1awBnaWPlwtv%Yq50Ufsu<|#wT2&p>YxPIn z>>-Qb8d^ls;_*Hb56=EE@80r%JJVb`q^vjlV+xPUV&HDSwtFdf4QtPfX6#)CDX2Wv z|3rZuR`uhc!@W0W^jKE%$_sHJ>AlZ(E~daWQb~@(Qi|INT{ma4sIZUq4Fe@JJJpb# zK`$!taqM$}g*5jNG5sYg78<|J;GT=}1vSbIvK z=spg-0R=@-AQ03r8d6kX+Un7VLxmZfB6<)ooVe0|mSG`NM)2H~1XrSbWU@Csw_6NC z%+4dSd$>gJLG3KOL{5zcJ?M#^(6yUU2de$IMiYX^)*LY@dgGH*+t2Oly zasf+n4Q;LlX-BC}<3AJs^uIYW=!~S?yhE|lKr`4i(vRoAKy}M8#2_;$WWvMIV7#k1 zk8k`7vBe7e{p|(!sV`(!+ET4#Bf)5UXDuQ1U>zfQG*bnW|Hbqk2pIK;@@u&VzV@d| zGD80L_SNmP;^-R!cOXQ+Nk7f37u)NYB9^0|0l=;?w}g`htd-}&qPAkWe)t4mFN$;Y zZrv#q)l;el<@X1dhZnV9wN;~fxQnc0Afo%KcE*N8LDzUGiMx#t?2_yCk{Ok}O?QL` zZO7I$#2W6UiKD)WE&IxEAsG}A{0ariM^hB|`Oo#BYz?xjc7<}4ODWF&>xN#Q^LB8^ zS>5)^JY)F1ih2{Y=&=A=ZrUFqF3*tc_ayLT1ZwmPU=tP8q9D-Ob$^)_%SuR$A?SI8 z73gS>_mpGfQ9U=F)G}9u3~84ljeGKnn~iVD#E)AxqQH$1Wv%0;+yE2VSv2D#i-n9Z zu01=g4Z<;GxO)%pyRP8TBTezD3FB5tEah|%$ldCXIzobsYUG3h5wriCc`d5@`-;@G znX_K)Z4YuI8a~1GUGe`!gW;Frw4yF=N2+a70Ar_X7=dKotIbx6WrHD~od2avnO3?Q z4g_QkIAvTZ*g(WFb zI9JPSVVmb%+ARvff1ffzyMIdtkuxoo;QN6GS5WTty} zI00yON+~Ef*=7TY3M?aesDj!qXx{bV16(9a<1x;YkT`?)gnWu&U;mqSVR@IZ9^Eq4cGw$dH6>{;{ERed~+kVbb3Prw~ zS@3#wF6l9&?p!9k3@W#&!k`;(OwdH&0>9MTY`L9Y{tJrFVQl$6Jq%L5w+Nar@}U?} zjz(C>f_<&;A~li^l)&!1O<67rlq!6uA12FO!ijI-PH1P$ip7pwC+ zZk?6e8A`op!Db3M_)}{?Kr*P6jEZr#S!s{atO-1roBsQSk@?lsEBk^QRRFrHlI%LE znyRTq1{Si~A(JaSh(H^F+;&x0mUk-fsq>L~M1rw1jyAQxYE)3CUdh^XaH3+=h3m^5 zBILz!Fq5!opW0oig^ST+|j`w+vc>VB^s@xQ#Lgbpnw)9V;aAQVx&c0PRW}(lJBG-6c4m3O?s|6?D~r_E-gH zMh{=_z6zFgq*}7=C~I`HHr*m@f+@0a-uqWjT& z#0^^v$U|hMtyw*h!}(JRudAj}S^n4v0ks&K0i8f)K&FbgE;+G&v>zOcrl^w!HTpk5 zx3cK_5V%0Eo4K-~Y82o(4>wdHqEZ?X$HiSWU{_zjJ-9RttsULNa>ahW8ZGaeByM5i zJ*J?#RV|3?w;^ThrW$;cSv>w9tI(pP;!_{7F=dJRf~kY}3M1n;u1jrkEOHW(`5ly| zs01O`#FZ3a#-a|YRGOmk2P55F6rr8mUT^j6d!N@i!q&b6>!hrVY+Aqzn}e^Rm-&=k zLe)?5j872->#7i+9!wybYD01lO?ejStu0@W1yQ8y3`Y3CfvY75$X_G9{wvi&NFL{&lH;oN!2W=5xx=A_@uw&y3CTVdf@ch?24*Wea=Ov89uhR zjYxzaLoqgTl;5Nf`6+2+s)d|JPLdl-0Is&SA9v;{%o42w*m`H)7f$3${^2rgU9pX@ zTnqor0=X96O0e7(uWEan{2ZU5X$F97hgMZ#s$x=NdNvFXE4Vf&RNzOY>|M2wNfr_IVe=ox7BJM{%3m_WWVOopcT`j|BH3y!bP<+<3EamqHHcJ`wB)?$dQqn)Kj zPeF%2!prK7_SHb5HP4l{ErqgX#KfE2Wd-Hb#1ZfDU$MdAQpmXGZjXBp6mh`V3&P5` z_q!Jyw)L;`Md<{{8EC4U%oqz7z-7T#(D!)q+;fNZMEpVr$4s>~$gbE>reSm4_u_5e zMs>p2t}-k|HnhgMo6lEpbFPNvsJu-8&^-if9!N`BGeKhSv9eAJo0A>@?z*ZAm-{w3 zsLaXr;KBRf z$F{VB9};G}oqeI1o4o7H%1oKNzp)|c7PdmH1m+p4t{;r7-FCm>iZ4Y0A;H(=v?A;L zExqnyJPl(vtSMEp0pUYBn{(F7+~^n8l@N36^{L0D8Uj$#0$5X;Bg9~^Qv-%f8vmln z&*zD+&t6K$4s}LU8IT;l_L|Rb0Mf;Mp{wP-(t}-jvaZauQKs>ridDn)YG4htp|pb5 z0PJN~)NgSF5fDg~AzBSG*4|dE^|xzS>NfiR5*WI&Vv_6jMVVTVJe`j%O+iToReSTl z{MSg^wL!Y*YDuI8Fu2Cp{YK9eLJ6Ka3tze!7ph=e*p*TkLbI}-35~3D3-1gFfL)-q zqUmfpQh`*|N9USj1WM1Iuj}V~p3#(~+h?EKo{`$9JJoGtVrzx;FiC|=8NqUdx2mcs zDErWO?kv^MnBUo!`@CG{B!@X~(dC@*B&w*hDNv3^_*6i@bySAD zi0ao-a{%!C+iFLgVu3P6UTn1v+(bBE$3a!t&Q5j4XjKw?*Zh+d;PIHV8$`M74f6f; zKK)qYt6Tq?egfm)*)(b^x6B_W9Zgg@A@q$(Y1Xz5HS!LGD$_z=(Flo@+KsQIXx9f*LKN^eJ*ek5ak`|OK0R;D$I87x?STOHZ)QdyMw zfb{4kfI}ck5Vw_kD$W*WuCBQt1Tob#hTl>in!_W87Z*VMQtx$$v;Hp6CJR-VrFJ1^ zH+vsFj|H?`vUW5$79`_)G)o0ktc~B1xq`I5Prw_fFj40wDQ9wAwT{uVDg<x_JaM)bB4O4dG@crLbN6kMZEYU5n1(cggcZL_xd$@+ai1F{6p;u!jB zYN!UZCOzbBuF2o>xQ=2C(n|w>7jsRUh(2!80535L=16r4BCAFUGN_^WJa?uj(B9j( zw%#=1gFeu%iUpb@^r%vI#++`(>RA)kp)t*rI5yCfRSo30mvnO9b3IxZcFad zfh!9TT$9SeR+{+U&eQjLqgr+N-0ciVAGrhC5w!DmBQ4Tv&HxLt+;uhe9cgRE3TZ#m zYmPV1zNG07>gFB(mIkEGZ|R-jYh%m5w*J5o{@&SM zbvu=BWS*RVQMUiq;rV(&+KQc=c5qecJ!`p|ljpSnDgO6-4Ej9c3wSs>N3uMo;yhtzA`q)a*QwMYr0By}NX*g}fj zVDwWpBp#%xqe)?^r_@Uo=%%4HGnBNjo2;E93|`}YuJ_M((Tx#@noZoKk`(fGb6B^Z(fV6}`mAYU81;Sca~6l@2FFy+5{>ER~!`!Q)~}Y zl62jw(LC>>(7KX^0Q`PS=Rjy7uDQ@m2)P;S$t_wz+&{XlCNfVb6?pg@`x2L&3B?c4?iB-fccD$mH`!WMkI>w}3ts-`U5_={tXz8G7cVlX9Jdz#@$sY8r z@yvh$G>==Ub4|B__rV4oLZdQnD%6AY!B!DxJY9ygPoxFmWr@=L!5IPZQSBXpSDhzm zo-{JZCL8{N3PtfA1J}|&xh_9q)TkC!k_RyYD2PAA)*z#$&$YZ_-(H`8(AfE>5KYZh z6AvDyRjI6H2Gj=0wfhT#gQw{km`WC`p(6J;;gF2lr}pDD|acm9O23g9@o2B;+eX>H1o|=M&92*3g@J;Z4@f-j4)I zR9#$7?RgbNno8YWPq&DdF zDrHms8jaWVT+>THw?T=m97os}uTq{S2zBUGPwg9^Ppao^5|dfU*Tc9B_5MZ2G493F zC?aY0Q){5m<8XOfpE%c5KjL&hPaf*jQ)3cb+a`sf(;xmei$_g+Gry-XK&8Kq0NT(* zYmfuB)Vv^rR#Nhox;MaP8pb6hasMG>E>lS4Sy+JQZtgCf)9lA!N{m79FjRLXt`1L^ ziT;jv!Q5n|s!jyl8Z4Qjs;*c;N_F4?R_$-J=5uhn>2aIk-R%|G#g$sWUlhaMI{Y}Z zDW=~ari{on7b8=P)%KN%ddZJ0lu6J6uRS@HWoe^~H*{rZX83+5;!?N9NvHrsOMhPS zI#IN0W2Lhg>B&YgEhJ8T@3&c52#s`g2%pM`P}O_jgxD9ogK&ef0P<0gc1AK(H|<|Z zn?P6)Z1P67`Xc5CMPp1jUMksp^5KLm4W2_Q=UiVMKB#N6fwPak)m_p;ak$GbDr-%- z%&gXwBQK!cmf5?u6lE801T`b7s6v-zrSGbs8XS2w2Xf5_dsiV+d=0WH)(S@J(ZPwN zbWWU5T~{htV6~vj9rzh(cDN?i{IMIZA#?!{Iz9a1@8ltj0vyU#a7kG__+&XX<#F%* zF}wgss#fyGXfhiwA@D-giARWG*~cSWcD1Q~8(;8P-ow7Z8rgY_{?93R51MJ?*vB}i z`N1qC+p(8&rLADm1EKluMj)Z7dvg9IA)RI~4CPQ4-TZ<(!8qGIi+LK&tw9%N0V*^ zoD3RQ%<}5UM2L5z{?#7w@*XChL3pYX6e^}4A#v0-$sl7tCO#~I=88)2yFaXfGuVCy<2{@|UZc2gZ1Za-_;x9SkM3U_ z0UgzWyvP0p%Xt)wreJwG|L(|MF4ZvpqL@hVHOtdFrKm%ROghf5+Qk0oGxHBv>cS|L zUX%cT(+G6AOf(WwcFJCgIULwS{3J~q2&eZ*qnia%<$U;3!-tdT)w zjfH*=zrv3(%Cm@)G?lNG@P!*VcET@Y(D)~IPns5`d@~wNF(lCH1Fwb-w9Yl#_po}n zub`k5%Q;T9HHnO%)6u&}nFUWl8wlQoI%Y;iAg&CWEwCSjXpvk9H#>=SDyu2cVRP84nloh>SU8S;WrP3|fLjivlm;_uAzOcX z`_A^dy0PCY1^J56+w|Fk-KPB2zM0sz0?{SP);-PHF|H_=lekW(9`x}Q0KOCH)Cpaq9`|(LSqf>V$jzr$en4x$h2-TLgZ) zEmZW(29`(wLw?;DM6vXn|E?O$+5|}+mSr#t1tV8j-wY^S7+UHHvT~_Wn0L|4G z)d?pZXsHxF(k<3BT0JNmRgO_-)~%4?w9t=*uAD`gG>gRygChRc=U^1S%*K4FEG^YpT|?!(I6iLUbtqlmJLWRMmXIALmxm&MxO&{- zOsZ_TT6B*FrHB3+*B_MSYMp!0_7!g#@w%qTvY%~!vVy)XN{>d#5N$7W2dC0|Dz(4J#B z(ZA_jhE@w^FaaaIO8&84J!L_CY>*nMIGhJ%5jgI>&;&{IAc1=Hd85;mlpt!oyYiHp z>BMWrIE=`#o93UD5W14VL36C#V?PDw^oN4pdJRV5@|ZyYE-fA@nl+TP2vgiUx6=}8 zOHV+YGI5h=^A1X6D=W9r1(~h9v}tV1qaepS=(@M`(FvgAg)q0C8Iy9Zuzr*&gZ2Xn zW!5rTT!K`EhTPZ+-nCFJz+1&QH^U@}@NC3k7Xla3Z85Yh1UYPBGpanB3`?tH-sd@` z0-KMUNngRkM=3y>)yrTD(t`Eu09fR?YF)c+>l=W_IyK^S_SE+MigcuFDuuM@wN3BO zRau)zR|+!IOj#a83P6KqHRwq&-wWmD1?d*pUG0mJ5-$uhea<_cfc5l&UQ;R9{W^#5 zBe0vsPuZ#hW61t?a25xq!lQxijlh&foy|2spK`DN?k(bARFGWHIl#&_G3G+wn^B-f zys0Cp<=$FPTDYLNV(rndN>*}$Y$kD7u^~U$*p3^_FF1k7;v>*bGaVw%FmQA41f}ZHhtrL z&Kui_4c4RhCQEZDDDs+SENar4-w-Li26=qdZ*vQB&m2$fUFSd^YCtlSBCNZbnh$d@ z*}rm3eNG=HBab0+hI^OQqt4`s`@QigpJvj8dSSw5&%B?ZeRNTU5Zi++qcA{0qx@m%qP6LS#=D?aFl=MRhOfoguXnYx&~FzF%TrtP2X;3Atg$l1|_-opwpUVza-U$ z%i*jOdi+3NsWRP3)Ai_Q+${w?pAAL5c!oigKAiuGPO3Gag#i4?xX{`<;==D9TQOL z0r}weY`+OU1;x4w31Er=@XE6LtlTpg{H9Ft;8myJ=VM7>3=f~Q8EogTZTgnVx!x-l z?L~QHNyT|{dlPY04#L-)_AoW>LMhn0*~F#(?rKpG)xG5S$yaEe75l}?U;+CWIS91)H=GG#C;T~QBH}(O4SC&EWx*k+_ReCBWz9XMf1+jKI}Z|nkA1*h8|1od!WtwWLi_kxuw0P zO+S@^twn9X(9%9>|f|vQ8uD+6=vL6>8ghjyfW&s zk8XkPG9}v>AYhKtTeeVk9r=O2ep0(20PhJmaeu0Bj`Rou!~;GAHcM8j$nj_l6U;3* zghw7@m7?Jyw)x=jlJxVxRJiOnW~!nY$ll-#8?hr93*h^phopkhH$biaWn`?ZuxLcGt#BK z#8Fs#4^*qXuv~XL>QZ{=Vt%R|a#Svh6Nc%3;>ia}zF=Ccuw*F8S{q)WQoBCWU`B)f zBvKo73zA^F_-ZHJJ8NRqx=FpNrd$#w%NaKDoqIMGU(YiClU+=Kw9?M_u9A_Bq;X8kY$6U>w1MTXn}u@cp=!#Xu3N%8aQj1Pn_ z8v1eV?Q$w6ggz*k3c+2Y#&zGPeI>@hJ-!|6{i&CbRnYEgwtO&rc}q+7+3l_&st!%R z$fvS-tB73KcuZk3&DN~Kp++5$!%BHw%qS@cVn{_EW%}->F=}ttLYPEldT|_I008y= zYhgBN@%LR3j@&AWW|)g9so_?t%zvImk4NeYxE1mDTdIxkKUhJPyC-0k@({m8NtmTP zJ|Zvhc{uaS_b)FL&@=tf^o)#{D}BXA_d!j_wHi|d}ECmRCsnu4Z6@%7gd95Dvg235S2tHnvXI4@bhby0iQAnvfMRZ!V zG;k12THJNyn_v?@lm7#ILP~`a%)x`H5|l zCM~n{ExUd-Y25VzVcN1fK=mgQ6PhMHmL~h-Wo$wNAYL0_E4{ayX+Bo;Z*OmC*#WW! ziOo?#m-TXa#YI;9!)e@Kgk-8f~9Q>o~)Y(!62g=AgU=b2E zr*y$F-VAc5|H^*t{Q<~{+4e?4Y{#J;Se@ucpy{?XGq6INB4&{9N~yT7y=@sFse_+X zpd80G(5SnKFvn=uY|3Imig!LzZ8^6Ui=|P!gsNs@pJR1D2Sx>Mbcf+yzggZjW<~?X zaBG2h+(y9Vb){*|g15J{r2K&zjh8adXNYwrXwC_qD=|Db$!M)m@a{w=8`7OqXETu> zHn7v#ZO>*YxdD!SVpPl}OvCnByh9ACH?GS6Ih-P^|a?pa0o`86fAKkIf-U!o;ktz$o{mYYPjofeM?^H>t_avU}yMG zU|qnHnv+RmVF1{3Aq@|9uft*F)5)n2P1K(ij%yvtU<`J1@qjmH?7>+`UKocUrZG1Q z`@D2=R1|_urX+3Sqj01Z3W5fy<-(0vih$svvr|k3eR_n^VOVZv>TCwsSq@g zAKx@}09H20Sz%^8nJeKTV1tR-XNgLQxv{$h1kaoJds?6ZzhA9(?sGkw*)(w0#xL14 z?Y@vas6np1pYF>&vy(zJijC8{NgovW<{(a>i3rQSr68Kcx7fBFsLZ@vG6e1!)YPoj z8S21FBv~c(%WcV|9gHfJ+ART;O~zTS_ux!ZyC}f7j*|OBrdB_okOPjze^f&F+I-7h zN{0orXXhb6m6{Tnt1JUNhITmrkcFfld=z!N{z9QrTGzBQknAX)$>O8}?8`hbwxX6U zfUQ_(ECBmCVH`ux)LV6ZWHHOAO{_z`muYOFH?HWgE!cU%lcxV zCpG9Z4(A$;$#K{Al0e?Y``mKizOOmY3W;9A9Ol$6eL+RAu{9wE{M`KWl_ip|FjDCuzTxJW6?6%lPr;;#8Diw9)}{*0L{TSHn~u9SE)Qf38%7jgH7wq zWJxhGf#*Q4eqCkxPg4RgK75x<;g*^TS&2TfIAh2~lL0n1w;o-LR8nX`l{82V!2(jO zPJjfR<_c$%NO>LbeI1gxaLHjc2^V0HVt^X$QRK@pAGO`aISH3oWX5**^twM;d++R7H9ezW(KA}QcNB@r(x><)w#|#2!*E@1zgCip zrwoyZK}R@2cM{uVV2Cf`Fi`Z4_6No>^nCM64Hng;A-c-1d9MhuBj4`PdetbCcO?o+ zpkY5tC7S=kDUHam_?zll%gNizp+$o;yhX}OgJcZ2=GLm<^LoArk*qZilNg#%e$e;- zPKDkbqCe$G~P(ANl4OYwwEX1xfp zlWHFVGnxq{$$gRlp+zuDKz!Z#W1ww5%_q4{F6XNORovf&1Pc6R+=DA0Vgy_-G@5%J z`%H#@L?Irxl5p=XcUXcp*-GcE-0@NC0v{HIU3bUpc@u|_A&hO#?n?7folKp3Rw~Ti zqT(#$l#L+z@UiXgjn6cI)lFUb^$={LRZ!v(Fq4Oz7`>cjCPyzEOPP)IPQ4Fh)?s;v z*A;QzlL4bETdig!=#ve8YpEqNrso%}Kdy(`is!N7dk(HV3sE5O4Sl+rcb^aVRC5l+ zvxyqS&!J)9rR+p`wkz{QFRIQzAZ)0-FhE>Z&(tl2(KduN?1jC44|NdD8Z%03rNtKU z6C+h#M^7ODt38g6ql4NOSv*Nl;vfHGB8wsdi`0oYk4i8;_4@MZl4byQ)r!7fQbj)LX~k8y*^Xd{dMJq z(lLFv*~tMyjgqR;mM70_w^Zo1t@PI6?_81Q%p0%EwoaxXGS(n%xFeU6S@%FX9?V44 znr{>jMRolB*9xT~&BsLn0Us&Lf_r!cg*X4`J&=CEM=e!#g00=kDAJ^P711(Y_e zJD*v_>Q2O*zt#LDu1VRV+KHA^(48p~W$r+jY#xHURD)A@XqvC+ztu;4$l6ac4p(9m zX>>gyV8E1sMMbURaTNl?A?cyWHdUWw{FVW|ez0}Z<)9g0yKFU`GMudGwFME>ZO z#Mi4T2n{rycoNEQiUsZW^VsrY8>I3#ncgBr#rZ-H_pu&bED!6h+23b!XvsL(aRjH9 z8RoGY#!aZ4TOM7wh9H$?=g?%jp4~nrb4<{@KKqf3%^YQuYKbH*V;E+)5_%Os@6b{~ zE+)T{L&veV4jZI`qv>Dq7=^8MfUO6dF-qpiV`?;ZZymJCm3@Ldc}O_v`=;3sNex8V zYQ22Ux>E0%1Ul<*d9zvs-&?1;e_c@%C$8)|q^4%=rny5l7_nYQxA&UYAyQAwQb5ym zbA6bK+Q-5>-clWcNUIv^iMlV>030C`YSR0>P`em~zH|%BH5b`;62h9#+%jk9KwC#Y*O{OyY zEf1T9N@cwc{Py85tWi^*mEnuJ1u0^>j3qnHS-`c6lj)yAvd^#aA*@~U7G_aL6ko^neU4b ztBUX`GqTPk0EL%)DyE`FaoaErHmJbesgIo|Ksakf0_E3*#}DJrCF5Ay_8V5NDA>4^ z{u8}(w65N`)wh#zNPJ2`dP&Ko4_i3 zfQySD>?={|_yIYF?3KP3m3Z5FW;QQxQsf2-cDWmnv4+XT!g+cHv8FKOppDz5d~Q}R zSfxT@SvW+mnsF~5`0x2ujBfF!v7FX5f~gK@5NeS|m7iBEMg6^Qi`f8AD^L!41$|Gi zDizir-SVMh?x-v0)jro3QA1T`hwWk+{0v((0Q=1LTAD_mm#?8G`q}NDy07LR<|eC+(mSbWo4`L?9#|q0Hd3sVGnpBTzau}UtLJ@C8{FR9bBr5;2Hcm=D zL=eWWffVaSC-v3uV5i@N(S*=6c-?dGl_B)VzLPP$Lz^a?v z4<+H{LfpJjwW9X-wJ}$YM{?5dxS&RE*0HbzJz1ytSDv<3MXACLMHGT3)z&12`;s); z%jF_c6N%H?(?l-E67E7sOQFyG31*%dT>FU|os+grN=`Xlh*!fHmSFk7N|H%gWS&d#1 zJF|5Ar}Xk38BZvnqO7aZsN37n_{~w9L9|+5aR?y`(Ok{i-!D4sR5>e=)>Cku?nMs zvc_0J{9l?;f({@=n1dTRl5$tApsoI`!GoI>GA%RlqC-~24p*yMTUEh(V$f6!r*T@C zTx*H+U!;$R4LCaefZix5mPjT?%(X5`1WgkJ8X=7m$9Bvf(>x1)&H^$FqLoL;?X~9g z{Al}q0im1lI4E8CV}vzms|j&TlTYVUV!FtSAHcfjLU(64#PE{OF9O_?bib;0Iqh2S z&1Th7tF&6SljZV=B_J*Wrt#~uC@h+2)|RLDc5^C<9u9g5mj56@pDw3x|BfuwJd@9O zK(Da*Vng%|<6JSIphcoB*@DMTB39BHrP)riTVj|W$T}dwyW$3~woJ_y=mWK^8=ZuG zD`E!b-7^*>t0`)2sYUKHeyF~RD>lwCGIr%zGX_8Fuo*Yc#~w9J%QU>J+TtDqF;@km zd2%G`S;z>Adh^D(*2JEagm)+_Zl)N@70AIX>$V<5acCoyyfT_O3k6!Hiiv@Gpwdl3 z1T>pKRCPRmh%{1HCmjgWf^hqRf2OA4+Kg`>FoTV9it?%3 znOjJj{=x!_Go})fgPGt?BmJ^^Z2vGXRQMLEtdp>wP4H>s9~u|SGQ)wB=}mZYJxVvlZ2aQJW5H3vo_x_d2rbv6F7b2 z`+CZAT@I}<%o35{>63OHmGp#MS>cgj1{OHka90`pRaM||P!}hIOa;)i427ip)RH{b zlt7nf?xWUx7658*=`?FNHw=ldFQGCk#Z~Ax z!7}w)FbDCXajcd+0}05anwU4fDgX&c7%{%MeL@DPF=P!K)>!S*BOqr34+Aj65{Q){ z%xEqo&nj3j&3*Y-b-l#ti;fW%qvyp$V=ru`sB=oII~+rl31%_ZByY*dP#RoajCy0 z)Dr1?5SbjN9bZitBb6;eObNKtjsj0YJ@V2UqA~sq#{lL>%C`hz#9NE3m8DdQyf>HF zPLa(B89JL=x!bqJdMxuLMMG)$wPMXd9iB{DYwNNVnq^c{nj#;sZS#QHsuAusdpPTv zbTX=R*&A7qs)HXiVmoSLlHcy^N(*F8&i_C>W~J=^FWh*^;E!jeCe2AR6?iA!~$X^Wleiu}l{bk8zYjxn)}*ijUX^wRvBH*G@%ylo^fEW5(8)A@5^pNRzgyLwX zXZ@-y2pX*Q7rF>RHC9aBpPqpX?(wJnoXwt&WGy_MjYA{5XAiA*-h1o4KclZb6pWJS zKX~guW`_Gnl&%OsWEJC+#Wiq=3@3B_vd1>ytDA=mU(YCyC) z*aov|W{n0%&}JU-PF|UoTK4tzJ!PUSP^`aA+XkJS|Di+K7e@fQ@G1|!v;9-qRKn*l z=e1t0KV5-qG}*E^D~3!RO+`}{U$PpQ)X&GYHoUvsJY0ydEf%}RYViG@#ygpwUeBb> zu`OSeJM+U-HBc6OCBs_@KB{WiB(}6FYDpKA4It1a*Mx>x5f~P-LgbEYk+7Jb#tzV6 z>v;0vk-~%e4>;gh>$?6~rQH=dw(NwL%0+Z7zbf;f0j+@@RVM^-M?tuS6OCg46KwrM zmF5Aud7Qt?^|>W7C+I|8{ibg;oM{F|AR3GwUqf=Gp_gVX5scT(5ewTQ2q!%@tEdum zMk{fMjVEJKS2(p~>W`clZs-L*w0Qu50RlK z#pd;-tr7oAy_aM)vQ$&B31Uob)AXPSMk_-Eb#i(+hKm0lBWb4w=ON6%v@tG zo`I>>cqr8sB?uC8@iHs_#`xou?TTw4jPU`sQ9PXe@3NH9Bn2BNbe^;j4D%y0xj^Ez zDU{E?9{IZ*=XzmNVV%u$?$P$qfjv*IRe=40GW<~)kq2WGrDQ;_YUe5HI5qi{1GaDw zI|GC3?feT0Sqz~ea@eXM*(AFkV=LK7QC7pTg9FS$n6Q-yu3XgW_2s&Pd%vqqF`=S* zW3Iu>i_rqLNj%jR_c4huU8ME~v}+sQoS-9<-C9+UV(D3y{y!@6&>7f>?;nQ~_0toQ z8SAA>xRdpVjaV!R09`y#%nM^`hr)A0b81tKLe*&=!IOjffQk*TV2YhkXh$8OdXC{0 zc5__-nfPl_^?m!dqggL`TW?11A`0~~Uq8FKpaY^lkgK0%31wplhOhBJpcd7Zh-{pr zsuZ;RFGe`Wtg0kz#xiVK$C6#4GBf!J;%4U&NJP_XSC z*B{M9uwMNVG3kZ}Rj6KTlY`+uF<2kkOxZqBCuCqi`n7-$wA_46N!$bimiHU;_+7oy zkFc|1m6hP21k++-HDE@=A@TwHkONmWy4H{jtaWOea#Um^mjFr0t!Tp<9x-;xW}jn- z;er9$)*hx!EhY4A#thx*eN9}JRznIya0lp|L+Pm^dQv{ljX7?B)Ulzr%B+48<5fKt znabcP(&U_;G*aHQVN<>RJ^O9hhZN0~kEM-}sSz>#s_Y*tepM@L^xe{QENie+1B5cW zv*>Gs)DI>!BGgdE>6zp}Bqw@Se_TO|==7ADcl4zgO{q9Gbu)|xeh5@oD zz;#e7f2#}0n1$#18;bBLExXby2_TBAdP2EEvq6}%0PNLDvM6O08sv?Fwq2}Mj{Ztx zvQ9Kk#vTs>5b*o^kO3`i`PZtJhg8W`GFH`4o!v877ac*)P}wBt5D{P3c#sPD;CTkDNiE zpf^|W7`TB4Q94{z_m{CH9tRPB22QO^kD5uvJuF>;Qgzsi88#6a%l1u^PIWXD(OHlP zPvfpmgO)>(Ghj!S4=v6|E0*{P=%cb$eG>yHJ0heK>royF&@<>Km6IFA*R56#p^t@Z zVLY~Z?FBVFpXJH#Hv*6oMC1ZwNj3t*0AdP|xsm8=c~*DvsyZbvM>}B5as7sxwU@~~ z8CX?~-e61>A+GU_zNwRK9;tOT*>-D*R#Gjp2(DWnck;Q5U<6>Q!Fio1W2-?A<=^1xzEwzWam_qn-Z2sB-r=_ui_*Vh*|s|( zL3qKgN~SUNP6jL335{=lSzFW+$@D5D2EOU1glmZk(PWW{(%zgH%cg4{fma!3FVy$3 zbr!VWRf|&!r(+uN9BWq=Q!7+Nb8C#kF4E_<&P>J$7aZ1$f;~SW1VzPuL6Kkj_mV_DXZJ89%G^i_Y*UQomB2m*fTIxgsmHQ*9)%#t- z9Mn~j$<@SaWex7ZU?`CmUhe^54qy4@9ANa{v~nR+6oYv)^(Vuyyo6SbHTJJd#UZ1S z1p)*72tr>QXAn?d)euJ&;!q0}?O_!9O=iRDoTPhJAZl*|0k#E5jTZ_@sSIP7`-{Kh z_9vUx#7r)PhM?D{FI2G!ZDfZ}POAI_7y{SMB-xZC1gk|5WYQXPo|qeYY`Rj!-6bl+ zf+c2}+&Zz)lAI8*#3dHHIH#T(fwtO4CPN->EN&SSRCYkvtLYMeaFoWKQQ=|BqR%mk zU-k2_p>d&jj+BxlIBe5hS}NO@t7k5D$;5n6p1?69KOcyXsOev-;T7_UC!=NBfH?UISdgE3-jvvd9%T2o>SG^<^S^0rc{eeSL9D*Qp1F36Vv*$Xz zF18RA1cV;HwmLzm`vM+@aIa4dxsFG-%VlfcLVYy~o?&VF3j*Oh32$qD6DBjgJRXX- zA%(3r+pVHX=vJH%$>B8kS?w7yh#tWGEsH`_F>pA-a;8##O#3-h=WukO?WuYpNdqrt z4vq*hFJQxFU9sL4o3g4RaYCg?R4K9zIy@D1*dHj9%exT|@#X>3Fj z+62rFqFZ>~Zf*>dZh;%0J;vfY^2UoE4x*DfV>wFD(YD`r%{Oeu)sleU05u=o1i&|q zL}iLqg$KP=EQKLXn}K>1Ly#=QcSux4)pF(9Qw!9MvHlrna|-I&e*6bp2c&oD>*$X+8r8Y%?6J#o4PFw@ zuA836r1`u0=BY`^phY=-am0ENF4Q0ch^mI{QL>knoS*R`Ciz;okung3sCapcp*33= zo{wQ352{6b5v_8Pd%Q;iriEU*F2FvPrtBybL`P84mU|R+fHAL6f$Os$#Lf#4zDp|$?xb+Rw=wI>R?$Thv zMLg@3CE|gXPjmNG88Ql|P4`6guoetX0Ms}ZL4Q!~n;8%~z*Ov8Sk$zRu&r5)!drjd zpnZ)`oi!|g6})Hqh$u^kiBEl=+mJ67GJ3SbZ5iV$3<*$b*6}G6_8AI`13v@dspHDM zVKm0#)i2lL>O=)D5t^1!nX*?a6JZl2V^jRJH_^aqJJY4gPILhuCuwuEf}@bqG#;u5 z?$nBs&TVi8PgZ)T!)NR$#n(r+%mmj%0g$XnCp*K7O-{l%LD}?8{(=uJb zKJTJhk^-fg@lb2SUUiLnC3vQTxqV}9sBs6t#-}Ir3XGjuh&9zFd|G|+XQ)4Xn@_8u z4+o8k#E1LEjXa~#hJ!vK@=SKIdIDWH$Fx@@ZB5YOuXN}_lBKzat*z7YQyZAIOv9qc zx3;ClBDpg!06wgR97({_ie#QxRKim)hs>Hu-(v0KMs54bJ0_2(j#E*gN!*K zR3u#=KFE0_n*-*8e_}wYNl;2%Hq9+oe*FiN)=73*^YBJn+@quP#hz zK;dI(<66eRsivj{n2}5tJ!XBZaB~gHN$x}wrPZPzx1xtHqJri}Uzg~uRHKKa-Vx?iyVuhDxt^4Q?EM{L5tiZQsHG@ys5Zw;=cjK9)s2|RG2`a zsb&XGiB7f4%eOvEUghehB%t%B2Vmym1XbrcD~{rgnU+MFfd;g$HP`X{y++abB^I!3 zjwUu-Ru@IZ@lc`k!XU_~hKVUVzK)+p%TVJQ;8JPb#J9kr3|Li_h@6d*Af!bI`TrtS z8uO~2lvUB9z!VMa<1x9U_RxJJY>0m&=PWPd1{}k3&oktGdG>_-3Z>Kul;ljfv_xN( zqd5a@3*~am()8b#cZSn3S|ix@70H6$vA1!7qd+7+%REOgqKu#h20S_(zULrB8{)Sm zlT(Wg!@|5Y2N3S`QA1JSTj8Bcws^g#9YmhqE;OB(;74k>q}Tse_xzA9SSk?&Lcsmd z8c>tEWV*{pzK#SVBR?9^Pc&#D8F1Y-qGRnG9PyJ1V z?4AW%qMN*@$Bp;ED)lUND^ba9OhOEV@1xy*SrEH}yKAf1^+09xYM)HMOsqu!*AyI@iq8#yKw+bg2SM$5ym zIE49PG#VdS?4~JUccYPqt(W-zt9Bm0CsWEo+OK6ry)$M)Y?vS-4O)TBA3KB_(E|{o zqwycL0v66%)V&5O#x4^F3Ww;lZYnR;14P|k*Nk&eTMJ;KiYRv z88H-NS-eDmGz|b+-3(7{(ilv(*b>sQ1CqR;c`aamot%GXqltH+nSJ!k5TK?rDW6S< z;qFtw=%@yXAS+SM*s&GAwIMakOaR42w~w8 zlIPX3jpL(g;2Gugb~=}=%7vx5KosI8x>*ZX<^Zps8UwEvXhSdn`=bt3VKoeGb|>Zf zJd;VOB^6;x)_H3KSS1=IUB6@;s~3mC%Bl>&UR0YR%HYJ{5%9fGS_zDdn|h$=ar4F6 zLVo!|BcR9Yv;$$i%ir7rZ3(b%mlsAPP3=ID2pbk-v!F}SujAU9P*d63D0xBvz#C6= zs~70SzhWH^rcmSo%*`oRc>N^1leuB{y!uC9*W^cX&7%cOQL5_a2IXuxdO&;a@V;k882B>3U8}dDpotlL6PsJ@gM;kcsEB|4NWNWP55VykB7}-v(5Z& z#-%A|47FKv>givqw--o7z`NASt(Jj4g;4=W4=fr{+3dRX>|AV3)+YKhBvuG>D*a!I zbWwG%VV914+_VV;_4XMoDp4cSQw7P%!KkAKRCM7EyOKc5{XEmBgd4LH;%R`~OP(p! zMC|Bi3AkU#ha(C&fQ~Tg|EAAt_BvBr?c70%K!U?bu*&S z%fgfG)bd>tNEz8FlIamivwIu@!fNivxP(Y@cy_NrfLq)Q`tgr zWa?(KhuEauN=ml2Cm{3Z2Og7lU9f{XRUkv4%3$!3udVF1^i~)cIZ$lSV4=tqyo4q_ zZ39*PYa9{*h4C14Hcw4j;*h{ENz_z8FK#)vJHp~y0J09el`6qBf?6;+g9~D`NHX272y=XW?9ein2(3Mm+yq#-1QT9}# z&Q0GUyVk-#50>av(bL-#jA_d&8wILSHi5&v0-oyN*QLfr9ci)|rRktLrVX9Ca^)9V z+J6Fco|K`qy9j`x4a(GXC+6*zh zhWVGsBYXGZrQn#3>N6h&t1E*mc}?ob(`}g1UDnhL!B8fxbr!;c(T%4;thuK*1%__y zRgEh?Y9~?asuZ@t70l@6gq__ywR4ehDGvwOTe+{tDg-J#YVbwM(OmM6_JNU8ijE_X zZl-@#ktSC1f)uH?dHhED>#Ju4%f(Fyr`|hu+Ks;KwlOsz|EtO=7(nnh+orj1HdTz2 z1cGiuLTEG00KsCqkc?0)$@;~OVT1cxdP{e!2i_#4b2TVV@n!;`iI9l(paxuzQ60`- zkeiU%Xz1Au)Tg(vyGhu5JSD%5dXG^3CWe~*pJzPGJh`Ek7945!Wl^;D^xhRHD2+as zrt{$mmb=?1!vm;NtJG~p1l2qV&rn0R-wy;76dQ0Zf>Vz&c32oaV&!a;RqirLu2S)M z73?8$I0PX52QGciuo7+SF29j!I0x;&PJeG!v?5y zzU|Dh4w8L5uAyooja2FW*^d=&bnz5D=eXO(y%FO+fJ&F+@kmY~}KjJoXO(4)^ z57U}+kM1NG>;J;Mz*J&Z-lFC&mF+O#rbZqw(9DNLyX3mTCndchs28K17_@Hal^yTWf56qBt0GM|c?updhqg0kk>QEj4_M|OP=-O|SzSP1D@%RyFm&ja9$UQ~ zb)_b%s%ce;rsub+9XUKNjH+)fU2E3il*=K1c0X6jI`Y>jk>(iK>oS{E>mt?9`8$zAm$I^EDtyWZ^0;PcTsN`e@puHAGjR^IhtYF6 zjYZkWN^97N1@iPTyFq&+zOcW=rfPuUC;F6Kx8FYE04U)YsI*NupvPqan$n^NJpEp* zh*w>jg&@*(p)URyd;6xHCmh3S#y6@JY@kf2F9+nQ6Ri|Yb(L2c&ef+(Q{OR8UrdNavl5y+{SX8kG5T2;|aj5 zs)CfMTY*`hf(59vg>R`Cx6L0)_*%e0f_Bb}TY5sDPRB#j8?~RtKb1eiawHdiBTghl z{Z7)1AbAu%Uq?&M)8@3&+Yzcd?lnOGATR*4s=e)&N%Hs6oGV3Nm^@yWY7o3EnU(9O zD3AVRKw=fq$xmrt3O!g$;rnu@P_$T91V`;g+X{BYAZ2V!g$1}ZO^L*P2FHj@-Kqoi z$O~u#JU4S>wE3Innz3!rDw4e^sYw691_M%hNkd7Yz)N7T*aytrvq|W8RUZmdiqY+U zPhkR-U5o5nA;{KQ`&?|1njyYz4l+lPU$0TqvQ1-ny**0hprRsuIH~W#nc|faS6+5YMDVOt-9R zx}8!Y2mRbN$uxi7A*7IIu&7h)$HU7D;;rzL~s$IU<7++ zLtYv5ky^&i!AE&tK*4HZ2=YGYX`e&j))7kL}X0WD+jGBAL4-f?SiahY02qv zNj_z9kU(mPh=l`;hcHXnOL8|R4IhpF)q#R}3nd%@RB`wrS54FdEwBbIxLkM#Is~y=` zkTCh;NRyb-pNxf3=ITM8hB}=2dmGw`&XC57PM|bu>zQ=^8vU8?>hL?VoG7I2M@XRB z#h^xS1%|trrb$=sZr_h`cIo$PxEXjd6oL$9@*4>sq#`^RCzf!jKbRvoe_E-W!JPTA z9&kI+o2{SA0KI;-zDHBFpELKBP1`gGUUx5+;TmLAi@l@kW`rgi`Gwwf1)mlk+Im~# z_tFI6B)iZA1!E^kMdnOb)S?w!YKN)(sa8;yinDK0={X53rbyP=j=G&U&y1oxf^d|d zU*iVQ&|#M#iKHEk|5xd1KC-pgSTmB;($smPze@7bwcv7malabUe zl6*MH@W?Ey>*QHSS9S#(huH)IF#Vgvl}~PbC(E)N^buBIO}TY1Q&S<;EhhF*+qrCp zmf2nX-8p+lP6JaxN%?s5)Svp03JyGbKLV&+4Y1@&pFs?;@ZlJ1S) z#?x{mh(@^EIWYzY#7pIpX0_9Spd;~N#+bDVx?a|Q+jh@er6*ax4N5~>N$`^A@O^U_SQEy@yc`jN|rX=-WsWU>J zQ&^$%iyNvBWKnSbTTUwzkc^;g{BkGWlIEc_Kk}VEf1`+TTgrdy>?_-|9@mo6(6DNv z>Jw9u8FkaukL#sQF_%c>`qZ$p<`V9D-Xe2&*nJcfbX>|%g+`zuc|GtqP*Hz|etG69 z#^{!kMt4+KrEn^%(qS3c{A0992h1^_(`>*D^c2PoV-U8kCDLe}A~6cRHtGHe80wJ- zFz@tCc3aCyas5i~@gA#{fcwBl)5`K}St~geq)Gs`GW?3M7Hd*JwFoG1Eqk(cc8AR+ z9qs-T!n!gj+l{7ql3j{RSBX^dJee}!_@Wy1aMKLJKX=~{9LMO})PrevA;LT2n`Z`Y zj&hY4up8q_OS^JRu0vbeAA{5~FR-OU%ek3GZc#jX!6F!GPeb^G7C4&{7vss{vO>VA z$b)e0?#SnY0NXPpO#P2F%0(1(FXJMo>$Ark3DQ#P%^p!TDN;9|Y$S5n*gJ&rSZ}l) z4EB-Py&66Q&O1_ti`qqT1Of2a^rge+tv3XLUH_!H7Ehu&6QY1vhSJ& z@r4+s%9Q%mm&L>4TJSMsK`P!K-SBS{$ZTAalnA|U_<@I64(Kb-aAjr?E2V-e&}PNK zkC}DAk-pP4%^`YbJUMw4W-YM7u>im2JgQiMx&3|s+jz%{CZIpWdz=UMyYA+&IdGf``{cDrI_ z;o+w7Tx!(h>~nXcKW?A@@$Fyxxj5zjcIaZG^`BqyH4yX|hs7#|B)zC$hqph`tOLCb zdR#h=V5sEIcIryGi?xGIc>pOS!me1X77Z$FZ=cy1U<(j$41zmTeOKB+-4KP6q^vam z38=k&p;+F&-R){0_+nlK?$ zb6FwIil^FSIMkX2f4al!VtJ=QT3_j4t_9eLuIL1a*OGwB1dJfBM`UO64rn%xiR`m@ zs|iCWf5>i(Mu?L7(=nG8H3Z&C{XhCbb1b@~rkugH;c+gj(X&|}*Tb5euBH@v@_TB? zkBKpB^aTNEXgTxXTLBfeD23Z+Xtv&L@V*vnD%r2vCxmOqz zG>zKm;qt%4SK)~Vr|?aTiM-wC)h$ZtBe2cuvHLpeDy+mwJxzz@L?S^fFKZtTaI!l$ z)Kz=CmB@2rJtqzeutkV#SRiDdYwv3<>dT7 zD=+N)O9>n(dS{^Wl9N^@YNYWVo(Db8Gzb;aV}!zEAka`jx$o%jTFR|%s%QJQFnGHy zitMbddMke_mSJx}Iz!BA?$_uR9LgK3F!@?|>qUU-N4L=%6%^he1eR({p;0tjSip_} zRo@lyj2AN{LKVF7h={@Tpxx>`#-dXx-wAuR$fi_k2>Vo59NpyB3m6ayhS3P#Nl;1$ zC<<4voO95qO%4 zic6HbkXC=%?M2b1dx+rF8uYL;&+U`?VIiqHsV_??<-i30qfoD2ml|URxmrdX5->Wo z&(RrGV|bxKs$2{5N!PWt3sf2l&O&QD|GSN5%GKdB(h!hf%;Uol%aOBwky@p}Ki!^h z{n2?pQlh6v(mlO6`)ln1adOa(Vm;QCsR@E0Fu=jd(DQ_U=_=%PSbq^eVbIIVC1_qR~{@LRY7>TXgay@!)3^B@R2Q7wIEKY4fz10B$x{ zD4DVG)WGXos8FjTTnnEaWSoAz{U;k5J1$C-ecYCAf7Z>*Y9goTs$I(vm$?ugdH5D<)kb~b@=z%^r0%rh~ zAEodbu|R@S>>pmhHavNFZ7jWXM_F`)Z-vEf$#+BF^_rWM@D;rE889_Nm=*LQOs5b0 zw)Fh-b08*)SA)a(>PTv(@{kU=RN&A?cw8BPSOQz(c=^Q^(rD>x^ZM--ZK8JgyRt#msRFvy&ZtWsYPQWV^1D_NH#X1B%A z2X%D$R7JK4j~Q6Y1&sq7gQfOS69}6@aORP&EQ*y$U~QV@HzFA$QePXn&L)RlQS^+vlC06RMJ}8l~x9L zV2$~h49x!NTD~3;m$NBT(X&}WBmA?@siWTM%+VT>RS9?pN!xdHhL=KruGFi;mt*#7 zM0;2Tq_6}^FWsMIw4D|xx#o29)bd5mNFzX~*mn{KrvLA%+9FDW zYk*~nxkHUWO`SPFpK4$ZfR3(I?~@9}Bn#XBPATX#xzT;gRd!ENlCHN8LR6mWxBpwm z0}M9VPVr<~tZxngGiKa`aHc@!bLuLGEDWbW1+7$FV&4iO6nswcn;9uD3Tyeb*JTJ_ zkS@3(5SE-4-1>Bf?;s#go0*ME*92Z%n~aL$>>%tHf1 zRf8J1nC`AMFQ~@swIRgp4Yd5a@hmW-hmv`2RkHv!=jo|v{K~qgMA?G6-)UMhXev}X z;6GZ#Ln;y%PW;W(>+^pT4v}V%eki=jo_s1n%^c8}VW#wEe%v!}Re0fQv(U3CTo#LB zR&0S3Ysi1x!l0b3pSm`+i98+U$D-&p*~J%WR;DX7^)xSlM(q_ggz=QIY-t~ds3y)w zXLrX8Ji&K%VM^M zUzmah*5|)$1dN03kc35}%PTiQ)ISiaMv`9-`8tR4!R^EUt2G8v*i_~?Je2F+~RzTZuhpj{^E za;oNg8%7{9kusAh!J*a*L5{A~{wTG=`46@A1%YDwHKDK|q6z^MLZIBOh|Qp22>{2I@2N5zHt>N%BPu2Ze&miVjlZ z*EA99Noa5x+`1|u#7!VxwGJHki;O9DwF%}5$Cqw7eTd*7yeF5S~T)6@6vb55N) zReqlL&9(Rb>h#F5>#MzY?#z`dSH8J&<^7zm-Cwb*KS$l}-Tq42q~_Pn*7bAL{%e{P zF({M2nUwjQYsulM=lOm|*WxeSsUGw)|Cvn?i|Gc7=_20*-k(Vh@*0%;qWP54O6(GQ`9JiKaO5$}?5PCbzA(XfZe#*b72(oUXFrwODyi zYjdk+OrDyDzqi`h@2NqlDH>^z#tz-YZwlb(8Cw&)DC)TvD0`m^pENc%^?cR{CFhhD zGAOsSB)F&%IJ7k}jlN|Gf4J<=sVL%B2~5cDVz_6$ ziRsva`tmC$+ZC1)G^g{RAD=o$Ze^me2x?T}4~cKZ*+1OYH~p|v-`NL(Fs_kmf(|?l zem&rY*#r9byARU*;Cx56CuZg zwy-NFmuy*=C050OgD(Zq&c}#S3|u=?pd?KOu#$*jHNryuLT9cg?V#YP4si{6!I+RW zsBUimMrqdH`tPlT<{{D|F4c!-9H&DBW_AhM*jN@*(tEc+3{;GWZ`8q=AGgVaIAH%= zN5uS>(64T`)K-stQsd1_SuBMyBW+v1-yl(MJ|j}RFKx3NBD?WuD&`rmqYyLX)`&iC z@qkSS6uvJp$Gt3snY#shw82xIgNJcox$g{`t;1$0dT2mEp2(c^|8prUpCZpGE*`O? z&BWJ2Sv)}PM+%7r4E)7Q7)(*xDwKYpH}-V-)0xHN=Cn*4qWdQ{q#r2YK0~AfUSybE zs3W9lgUPbM*!97Hw)1umec2O*2Q^u=(%!++=6SkOM;wj5TKa4>VK9N*$ip5 zYt)KEWT6-JtqV>EQ~6@Kl`nT8GO^}oJ`h|Ar^~;EQ@_l;g`{pnxCO{Uq#7wr%L4D~ zXqo!I@c@TjxgFPS$|L@hpxeu@9rpphTlO!K8U;KM7OBjW?=?yB4Wg#ROU6X;y~~ex z_0?ynU~cdKgVVG#^?9sVGCQXs8+wne&_2Eo1jzCg;SPTzXDklcrfG-=P7Q6_>zXra zW=@>$@R-!`TroE6@%elN>E7kr2l(laW(a}lO~=lBepM)REg=m#b95_Gq1EwYIO&}K z{Nvd_-tmFE{u85`PR7zp~5%so&`CHxd^?g%mL#{r}DFhQrO9Y z3v+Zc$Ff{RG;w@*Xj!f#C0#Z?upl@*ZQrS`t{K6*IB*bw6R>?)YVo<#=cAq{!@Mu^ zp(J@%h#DEvm!Q8@^o2Cv*223r)fD<%-K*<*>(?TfT74Mdp2RgTHM^8*JmjC!ic^Ti zGtq8;IGmiHaKl91U7~V7Fg!vpGTBE@(y!H6_fLieQ^x>?$$3a{HTby{ zhUnanKDUyb(4=AOG9H$_>)h=SZzwo>_0p2cUJ>|kG7Qaio_-_+XO$6L$)D{quZ%Ov z>IaB}z@KS11VPyX)(QpMWJnixkS$VRr;klKO`_;t3uBTC5%hG6G`&x<102E2gS&xH zfapKAX+$K@)gF+2xgm4nq{*>>#M zzxZ`)oPeLVVO%?9z&$07-{en(7tn4i(j^L}p=RX((jjH;_iKzn#`T=+2=ZnR4P}>sx8%(BqOzkq3doyVr^*G7oo^rh2 zcYQIDM>}4a1g@Fpy7^w?0jITvK$eeY!P?K0)r$7h(OL-64G3Aiw%9B^>zlOa7kNG= zHxp-;y5&Q%n-u>nNpakOMJLuTj5`z`v4}z#6R>JJ$x==ueU*5`b}$^$u1pLl*TkuH znXH{YN?fgFOv&u|O)+Zg@I9eCAmk1^Jw&aESirG{K}tq%HJlilp%cgIz&Wl28R4(S ziy-vRTrXK9;6SFA1&H&*)|+>{WwR(`$=Ci8))`Z)^I3iq7)oHqVtUa+L?K_o5>vQk ziU~2_vY#=WJ1$&9aYwOVn<(ARTID~Iw5NE=S_Q__l-SW^29Hku&1Iow&cr>oN6Tie z*Y{}^Q>xe^+M0f4lgSw|wnR$i$j#m7dG|ipFwF6JXoQ``mA(3(bm+yg>)9uDUkhqMdX%4?wO$-1@g+OeLfAi08hH`-ama50V2!hqB%|&Ud*rl zc*egj--C<&ZQ5wj%E^#_E#P}zBeRC%TMv%Hm`m#j)}8Ixy$Wr~`;f=oe;4zT%`Nnh zbjXSs;bqMOLbvyjaW4-v1cf=x$II_uWxqj8Uax1Vc2=RO;0%2faB?Y|?lgqaly8iU z;!e2fhyi8#w3&K(wAJmOUQn!8y&1!H>ZwS@8ye!TLqqArVFkkPa;-nZ?hH8Kd3kbi zbW;C%6o<#b%2~bYeX)CJsl`n~qT~k>D~xYt$LHkqu|-XORxF>g5ABM>J8tfybkon= z8tF3@-A&&o{vG)H_{^T^J7%ADTiho7rhxbL-1M&o?@HfNe7}JpJi_S%a$p^3u=MeT zoI#-xHR*dvKIXSfxe_6i&;M_sZC|^8rpMf?7o3v*3!u%NNmbsKBcXS5`J;>JGQXiN zejtu7u9-p5&-~Y!3}nYc_IGmPb!stOd0e@DJ}#qltDr=EyGo#Zta>Ytntb^*(r>ub zM4dK6;%x9la?TUbu;R?hHeVJKYX&;pq>Xbow@Uj^h?lv)MZ8Kf@0OUPivKahSc_G%^AFZCu zT~4a*O@QhKX!^g`hdt}YFDBYvUxMv8PIkA4K{C?^xDNIFB(3y^)IG{#2J2gYOwhSs zEG{aHy1v`mbzeE2GG#}ao5I{M1#(Qb->Q7+mVmGKvM^$=Xqp5OK#rd&Jh=#g@@ za2`45U8w6}`}hMX8%s2cN#3Msx*HQ2S8~5aUE+eA-)1u8n><@cTBm&0&KYUpD7p?jvBioaf_x{86!N*A66DrF@|9Mc1lr488f@QhuaKD7DL>S3=U~ zlZP)7onoO_$s98GK$@su=S%*(R4jksIv(U#m^}i4uEc2n+I4g_PE3K%d=?%*Ql;nw zDdHp?(V`rsuggCb#nvpZ+?mz2cC%O9UUTPp7X|{Se`M9HX6CeX@J)%#P6i3St&IM_ zLK?BLt%ZeZ8x9S7tK1OAqWIO*XKRv8mLNYb|M@@pn@O2r636DalDDHm{QD0LN`*c`NtI*A+6ryt26nWJs~N(RdTGhS+Vb=tOOii-Z;>R| za;r9iJiqKH*^B>QO`M5;v0?dNWn9i=$!kw;$@~t*#v((n8M`$xrNaFtsb0QHk@}p& zTW1kgCoSmuDHL0Xjy^x^S+~`m+|zLMIO(cek7@4nZ=O{zb(Y}uy zzpCecwm(@`G{>GWt+Hm=mq;@mq~=jG!BjdIA+OX(w;wf|aO`(p%*EryhZyhV$NI*T zjQ(R5d+&)~Ca;;Y^E>&xEyRO8OZDEesCi|>cw6hY6d1nVw^M`I=(}^m*@O;COu)dgpv0&XK-%9 z{_Bw0{4Jse%hj+xOYC~KgEILRRlDOgoAT8n)ai^FYC54m5{Z-G-TXs)-sz+U9^iY* zB5|yYU2NVkhzU)(^)^?c8K31IO;lP!{@ZGrY~PZj+0&YNn|+KZJ#=?_ILGIhRKbAy z5=TiLGJ913y5lOF%5m-=_T1hYygZGUrvsnY6)C#6zf2`$3WR=>M7~DV%=nSa_KOSz zFs7hcGaYF`gO2#Uh`H7Np4q9s=kD-zztnWRdh_%uw)wX*QCz3b8+Cy-{(w{X(nF+%N<^emM4+IR z^(y<7>YOibb8^C0JZ{cva!t>Vm~fsYycEGO$9;O`cC_iY^f)R>x!!&?J=DKt6_gFr z-#&ehg@}si>#2;sv<%3`U5xI1KYf>zoy*GkY3(}h-czLa9s(2bVF6}zN>yyN`!Na< z#s6x~Q!qJ|KnTE>c*wIuTYHQPZ*StX_0g>(m1cwLubeC~&g`Y$rx1{<7!v4vMqLt5 z=HQb~TQ2Td9Eb*$I5-AnW)kc&#)cno%kB2^e`S*?7_Yd@;39su74Hh7G#^!ydh;+} z;*d(xvnugf&@2r^p0=80`UBD9jE4;TtWaRr{w8{Pq1s}El_`GTNJ&9wzHVx#D`MnD zjBw!q@v0A@T-Mvzv7iKS;Vof$r6!hyPOv&H=!U75ec+b_k*D2+Na7$%d9@M z(Wd5UcBY!#A`x^P?H%%OPx&!6MPs+=QhedwR2tWxBTrVuTRP%l8NUP#Oe&3z#?^+p zz5G`gY}f3U*S$8r(NgpI(=*6-gy(&+z*CDwEd|-!4XARx^^=Jkt|P;H;o2+>zMq49 z4evxE5vox`>h|(iIP|>Jr1~!PLhC#ZngT0s^2~g{x&3SL+5q4E|B6UacbLa%YX5$f zA%c05nI)hJ1EH(d!R0|W*caXLFs5eg&ZL*egHhL*{`S2(Iqkq_@wQ$G0L z4OIoOodL9#jr%Ufn;Mjk0v9p3qGDA!0l6%i3Zc^~2QL=(TyLJf ziQate?kLj^hU+xi+I*IeS|%YX4qaouQscB{^~K}{DU(cQ=6O%jbTh;gHwi6k&{(S9 zQu+h&w!Z9Df(&Ql#e613t07-}+T&BxqPx@UY0%eg=aX7E>r5uX->_c*LL+jC&i|NwJ?EvxQ6TA z4>e49UzX%vSa+eOB|4(FF(dP(XU+2~S)ab^>ANvahBtw}ZC0c0AV~ZjY= z=U26ZnMPXZvQ4T*0=5}O2o5|u}N^9_{&|H+WQOL4K^bkbzr zDSSEX9wc-aLB5$|E%;=L*Q#r*0%`4-R1+g9TE!RA$B`Px8z*Zo2Ymwza0J+{?LS}z zXdL0xhEDgeewFdWOz>IRD92nJIAUUta!qBE8Un&b(u*6(yTE0Pb#>^3;}g z!>m#wWGTw+pwwA|pfK*fwZ^s9^iHmtfy%AB8;Y%W(&*Vbf6+AKcObPYn{Zz8Flo;J$C$>w%U@h|Pp3}n#U?maqsx958LFPxZozP}BZ@4D);|yuMV3Vn zrpx93bb2vSOl97rjJm0vllqskv{YO&a;EWF#7K}E#4h^?vb@^CL=ERuPIo}!qp|*J z?p_13s(6rR7Etg7a z@@4My8~9=IBON6KBNAL6;4M)Q0TW{5M;{F(S3+#7x8L8hf^LGEfkWxh>b53yQ_d7Meh#&i?l&x9n?Nt0KH~8& zb|bJ)2}IUOe@5772)i1pzOO53tQn$960&Y?zfBt$Y+ zP1Z%Uc63QUoSN04Ugur56-1@1 z?Tw2S>%-HJMrdXd!V?zCFqtRaIA5mcOZWc)!@ykN)0Qh$kEvSQqvuBog+^u`Q)~60 zoZ->YolKK~X2|*B$W@9~XHU?8D@)#eVqQl!$!%JQt#kaAu9RSFakMQ3TDjD-689VnJ=5pJxZ4I=B$#l1d;WhxR%pTURO*X{PpceCmvZYC=*uLyR z3BjacebfN3UeXm(+G4D8XjZDw#ybytz$WOwKYe9dN|Qo~hQbFGHGK(2>weZv)k^F= zd!-I_R}-Cvo{>8F8@;OXSw?Ia$#{T9i$}yP-mD$oAdeqsAn{d#vE>$C^w!@KhNWiL zQPWtg5N;EF2F8g&g^VQ9DQ-%X5pR=i-Z#|MSzD?&#=B>++i)@INb4s1C&;+3@dd9t zxsjQI$r-<*yYr?dR+;egNN+f?Dl%T$Hle%z5ly8%y%>hQ&Nf)GAX7wC2|5y^z%OV zk=92yVq0?RGKu4UefvwNZ<85qmX^~49egwwg48`jG8v%6o}NdS1ScG#LZd$c+V@!X z+miJ~X4Bw9%&m)?2AQiqxkVdVen35$g(Ibm1E+O~hkhf_z1yFlSQ#t{QH}U$J|3D_ zz|3*uHs9CxEJBD8+f8TFp)H-2Nfs&Ta@n)@5x5{$J3QR3U?J2j54!Lc%jQjUJ0l@a z?t4^|KOqL>bIP3vPq8zh1m zhr8r=_wr1lLNL(zB?squJ-0mfAac78G8tFDO();<7KY>Wx4Jz}bU;?#I0^NaQbBzQ zRg?K3@N5(7~ITb+}@-{sb+owf$K>w_cB>{Q&`(tVLJb zLWaVOc(y4GD^sLOr8H#&O9NWONu9}bt}>{fhii~ZW=^+nny(pC(g3F;1+4DJDA0uig2&*}e$liNs(<$zBXeh3QylZuyePbDy+lZk!bO zTX9RCMJxP=@6+WMQd$ljC|8-mmN59)`IW|Ki@BH8V~Xbau7Ne~Qt^52ANG9cFdm+u~*bcU;mYi~^w+bnkRNyWHo%2jyNErBnpWxl%Q#4qDXR=;>yre@v-J$6p7 zT?wstQeB`3RQk7TqPWfiM=V>C?p^+EW(n=atF_L`@fvm)MDO($C;=5rBOu4gCNuT2 zRn6n{TFlt)O}1>a0i}5dA6jfQ&eL=4J8c~}NGCq7PCI*>BZ-*7aLY`}4N#ffDLC+w z#ohqgI*0ukgf`~Tx#SNy8%!AtDMo$p$kdS}S!WsFs>Yjio#&PhWE%vRJ@j9rq;bDR_^^x!1~V6stAx z?;R9@y4tRj^*0F_sBKPVo@;5k}XISw?VL`-w(b8ZYTtb8Jim*t0BC z>5NR)hj&*Bn|by`u%C4>u?>bm_SX(x_3nv)baWztX`i88D7(GTRDX*EJ{w(ezDk#3O%- zg+|B)!cg&9yu^l-3J9CKXOksq zC3DTOpm(bmWuyNiohZ3gZJgPbhfSCP%9_k3fo1%V#bzNRmNqy;(t>mQ>MA*3=y5)< zq{z$^IWylM#QceC!0LI2U{(Vu-&L>9`J(WAElryxot6Mw-`As&_#)NxLu}g;rjAiQ zer)F2eXt}JVlJHW7sdm3muSSyfH?{-{eMALR5Kq5!(tjzr)yPS=5XSWKl|$DN{N=3 z0f@g?1$A+2bMXi8&39AImEwtC9+kxH>+?%APD)uPDEabC=TL9DgRHTh~)ZHk>q6<~3<@Gt~Duvb8`V)fMWAUi@- zqo1(MPmwrJi6lAStv{MdYcsgEf{RFOI?d#whDble1;k{PWo7K@`k+g{_&-+I=ZT*s z4|*~;)HJ5e=4#Fa;0@$?U1s>l&v~mH7YYfm%bo^cWb1Yzs+n9CF<#XLDuE~6q+1`# z(Jv|r|GNMi7anwXoXj_$XH|ld@^`V^JITOl3tpkp0E>o2q?ui&$w|y|J?H<`h#dzj zW}=7Hs_FfpodjJ&dvh2o?6#8GDmGXO%`vh+Og`PAUXL4>2kA}X?%wwjwo7{am=d2I zW=^`+J!GHU{#(qj*)-rRT0D>C)~qi}jo`=1-iQ1zbz{OmKwdp#X~P)yYbVXJdzaQU zWG)meI+$cWk;AL6-#mwa*$)I2p%b&~n7i{bEi^UjBIC#x5;xd@DUj(*mXU|r3vZ{o zukxvI=q)ndCM@!JBYnM8N2=8KvU{9-h&_0r#lnN{2BF=2pAl`U(N$pHyZ@zDE$k{6 zk*iQL<`Zsi-F9;!UaUXKZnHiKe*U02MaB2Yz|CmotKQJEtMZc#w1V{={MiO-n1{|A zfKehlW!`u{nDnuE5Evtzjqr%W*)OI$q_RjtPW*>>d^Cchzcka~<(D;5La#_voYtT0 z?!9>J9WGa>z_dqQ+ujPL1=%pAdyzQj%~bdQ?wVU96?P4%PE=^Xfe${%m(G9#!O$){6W7LzM zxP$|Q1-e{dX2Mr-aW zhnyrPQc1TZVI;MefTH@n9aBA;i4X)xKm!L_M&Q+jh&<$ThdhV$+Lp^#M8bIFp}jB# zm&W~}3ZXq_rj)aCQ{$fq&MWQIx^D#CNHp_5%uKx5esZHlNcqb{YKTmjY=u8~&1qi* zB1VJyYpilG)yJUKuND_>_#fBZ{}A1|clucUdnZ_aPlsJK|IgY|$4d*%5Y}a$z2A*E zfz604;!H%xnbIp#5=S1`2uV9gZ!+U4XCLF+XVYIx&sea*$M-uFY;Jgomj|`5ke~{- z&VHgQv3IK#M5nr4gJ+7dW0q^&y;gH@NovIW)&RMr?XW7%MkZtS-rK&nc1Xz#YrH1n z%n22gyut!C4n^bfeG2>>VV?u-ucxAL!a}p zOL)C1al128BTAiFV-kW=XoV>6E;qV>X@gu@UvLlctPa@P8E@~Eip6?yE8PW-Rwzxz zd+uNYL31U9B|flAqjvT@{ATnIY#y2mS|PHUbcD^4vVvHJ6dyauq;WToN0NAe?#5pW zbXgz0u2;Ps-;cpTQ%)2RXQJ@L!QlSK_Aa2vw5K|(@NS3I?fnZY1lrx#87H}a;^ivS!swLi zxtGU07!|U%#1N0ffnP)f;B2eA&8aOYt0ow>IWS)y{pyHwvH!av-3%gyliEV3BhKldyG48CwZL3 zQ9kytog4szHJoq3fzK@hX+N9k4*Qi$t+A~#7;`phbJ|6E1yDaLFNU#969!VuZP!4m zE;Tc$jSlPcsV&$5f~7B2|4-2SwKxv43uW2@#i}$4dId)Ay1PIWc)lp~qi{#S3(7N8 z8_=!YY%_OK3KBr=FZP;!YrmZc@3f})BUMqR=1)|#;F=>BVX44-W0we)al5wA=EP9g zDz_JHm>6cI*4%tdn+kF|Ti8zQ&~rl*>hEXs*Qe9gwAR)d+0T8KgT?Buc{0BIGSA05 z`LL&FJhfLM$(O;9<;L}|(ed(M9iMrWarc}4qquok_1VhQdzWv7M)0r4)XF`YGCoZi zZeKl#ZyUuOkBGsee4H;b{jR*_$a(kSmpMSU1`v^^HNh43j{9pocCb#NKSae(kLnG5 zp=-Vc->%W?+GY8}C(>{WGAB{F>7m=fo0Xf*ASYfA*cHmzQ0}ay(a&@${$o$&?IZ1E z1?09a&-DnRB|01>3-Lbb7FId=b-&^X|D)k12U~0YP1y#`D}YpaPH6aDu0x_#txC}d zWl5qQrKS{kWL%DzaJ98l)B4*A*wj9^Bl{U7Q=>r;F}n>$-J^Guk<=-QUiu=COTp)!oe{o7-PjPG53YK>N(R~Pyk z(rNI9rG2@!4BolU%r?XG-D0ohVIgVCtGpMqUCoAjn&3_FgC1sw_rO&nX9FFiw#z@3FEsBNJV0J$3c~#;4t%yKY z*0l;vX+pL5AGmWju}i!Lu}qU5>5lfHJ)%`0MK!=h?gX3m(`)U)WQpBp0{m%jyN`tt zd>z|OoI437U2Bb}U6wxQ;@>e*ODOp!w*8HbvY^MeCi)1!qd;PhOLsEy_)+&%+eVQ# z0a(8k>pKklWGH>_(W)Nj+asR)lby)Sg4u47Z2@{%lnOeVwfAamda$%0qAxou>7jie zafq<-%tz)i}d)C@5! z)7STFlmPJ0tTH6#6aAhORueQ)jmN7QLz%3JBp$o7snG1ll~a+~k4APAn0x-Bp(7Qz zlR!?B5TdfKpdMFmHAZ3^JjV*5`MfMdWPFWYxTOvULkQ#f({GvpQT&kRg({ilSCUE8 zTLN}<`m_Npi^k`dHt2Xb>g8QHJ4|0U{E!L8Je0ghPr8}D4NPlN5#tOe4$(Jw)6 zOz&i>oJ)FX4ZZhQXV)GYbG0>cu6bTT`d@SSS1DgkibCd~d zWv&qB@{hCM<>ZNadFll6(y7zIHQAEHVRBm#ASP!)P+Eco>LZMJQIs-dgOj~fi{C@% z$)j|P8$gceAGpAiEV1wv9H-~-v5NWkBfQwC;%e#BqxC@)k<`{6sr3!vV6RFxjKXO% zXYOq={5K>bUIj4x^3wMb@KY1&f3CK`Chzt#{}vrhsdU5&LPUlVCPst9zx9Q)hj5ko1<$JFnD-97Gsbekmmd?a`T`0?8kF#t9PPq&{& zCvO^T=d{*56omk!lk&)?iWRi7!tCy4cn7jvr-)dZbHkzBnRxdj9Vl-)IT>S~s*?dW znS_7#Se64ne&_VJ3HAAzb@qM_6_o=ur2AVF^(J;z@uM1j_M}|k&y051Cwh#86AJ!5 zq|<}WTO*VO|A!NwAA?=@zNEJOp7aF%uBPR+-5mtbZ>3d%x%7Osy*3TAWZyHYmhzO7 zUF^^ZB-Zi|N#1zAgUoAQ@L+;{-S=~AdI4|&jr&h_J z*Lz_1pTGv%nHdYnaco9N%mAs3H6yE+j*#-%j9oLKBZ|Sf-@e;VnnP!yWdmA3Hy?+< zj_J2;wJMHel}fnS+MAp^!^40_d9Q5J$#nQzGwZialADVLkF1(pvmwRv#Zz_gJvumd z4UCvldz(w@m+5^*q*7lj@AQP|D$~!#vPF;7*Rqvo*tu-vh^3(Wv&lvEt_8>*txgM1a+`ya*ZsQ zxwX5?`lVzmk!E0nzkmB<#9os?kBJ-x^lzYs!;8c2*`s&mhQ%gv`iad#!ZeQ_l;XEf zoc<4Np6k=w;Pf8~Pe9s;?;;YJEd9EtD1+sS#lN$1b*Qs9xIuAyHh^^IKHnPaz^eBh znpWy>xBg2`kn~TpCBxVzN&k`RJRdde#Iy;2H^`d~q{4EN6jj4l(Ex=qQ!V=>aS~$;5nGNY!YfMoS#eM)^It{ZD1hkO`bpuupoRjBbkYHpgvA z^_^9ef9>=y;TMzU2{`3;1yn=Trn3B+Dd#%{C|#}&Ic=zu(es`L>(uC?ZDiSCQY&Wq zJg6M(G{J}Vhz|47@Do6Hn8Ql%IwAAwQ)pC+=;04vCE2@Q!c^_v{gVRAnM5R8PmyL* zdieu5j4JS>SN}Mv{NCj!g4Qnxn1cwMB@$B?ce@@$6D@{+8C{6N14)cq(4CbvO*i>w&?16S*)@>M@ z^rQmbRxHWE-uvu)Hf*ArvRcH*m&odAS_WS^Rmo}*EV#*#m*`?7%Jo5MExdI4Sxv^r z95!jn_;qG9(B+j~-cJ~~HkC03%4Z8#Wa@H$H%?XSr{Rdsozw9^Yjn-GQwFqiGmdp3 zn)q=L7}PC^y}{Zv9IojCjZvF%y%YO-R|kXQugkfKHJ4lDdsJLVTJ_OA|d z_i)=BhUhi~SzgxW3Zmw=qj^f$g^w$ZfnI7JsynolgKYO`&t8xi}~=(VGT_b6)1Mw@O^3Xb!rn=6AX!}K{?s)EtM4+A&f2hWhi ze>SBwRz2$peIaiG^1R{F8pCp`_K;soHoKSPZc_h@EJS#2yCq;c6!1 zVtQUD()Q&NG5U6$eCp93TANNdu!y9rbQ*@Vox2J9L|H>Ia1p?i3}$;o*}hJmy9dJ8 z0(#>LquiB?LVmb9QDi<_sDvlH1%7y1wd%-mn|&l9H4huPnbz&nbrmDr0IFx6n9k$X z_(Qtg8!3ywfu?;AjB>W3oz#zF%WAt%jI$PvArCK!~$=0_I0N^*lSBXtf#IV`2Y3On^y0aziDsm2xl8t z!$IH*dootbfn0*mbw(EzWJ}8p`c+Q))J#EU>zubZxbCzXq(Fl%U`C!q+bJLQSRy7B?ozvsZw1b!>$X$Ushiy><>RHW$9c@5X@7_VnbP7|Gl0~vDJWJo>4$IxqH~pa*f-cSE@#J+ zwEUhhfkh4bgoBl@?z8+KZX(#pjM&f)cPIcQXsL8PulO86Hwc8>*aC0)Btm zY!x|RNP*g@?JOBnVu?t8O(O4IzHrhQxW*VzP3E#C{O!}jMU9(z zAzp3VJ*2TkK4>$j|9V8dbyNEbFwyM^ZR&2*P0$P&h5BZiapL|;D>Z}xg3;zMPqtDa z7C!X$fMn2n7X8`dz35s2tQqE|8-8W-h&{?1J7C$c2xhe}Ivcvs(=mCy2BQ_NiCZhJ zEO0WDi+=&NK3t`~!nP~1n3+6$a#D+a3>|t6gIDO$$M-3pu=`WUWH;!}D{&)lBbDqu zu5(r*O;%tagKMm!5e6vojjszo@|4DA%C2Pn0ba5+pGQUqq6c^BOZaEdrZH8edp5EC zY2p)!B_}YSa<}!dN)_g~JOWExrXUru$ks?!@iX%0@$wrBq%$Gjz?qK@^xU+aiHXdi zwDu=sAo18{)U(jlDmJ}O+QLsTb)6Vl16ue;P@GO1qElbf6Jq3Rr)-|0R@)hiNA|Gt zKmhl7X#Xp~H9hJ1El@D0LlO_|$#sxSv~b-(O+Z{@2Nc0p9($9*7%Ip|z{e)Q8nvpO z2EV}|{}vRL+0qipY6*<8`OoG4a0M2E{ZBz#gy47ULK82@>l($X4WMehp>N=duGcFj z8Hn6}wmMK8P9~@ngwNH?IN%*uvwhVz#QwQfZ>{)Hq6Ms0`FFio%5< z{8p~UulJut)h>&U&#Pxhl%=(1i17{3pdjTVZ@#aF!Nk!3YR#o-W8vQu*~ye1b3Oee zPi~(-X&b0%)7!-VpyAT}uvN0oBVFP&6;$QCi-_j|P&%IQAN5KedRPkktf`IJ3lRW?{de&= zR_NA0Mt3vDEAB0l5P3phfxQVmYN7VLkwz1XFquJ36C-D-;n5*7SL_gBWE80M{1nT| zKBEbrc*HwB_vv)|B}i*qYd2* zs9SIbw*pySr#+&!3)+AV;+lX(zzVY(r< zV`Z~_4U2os+E_qsFby^hCzV(oDI`0Mp}vwCIzCUB`M!5#-Kvhw*{jokX;vAxeD!&~ z*CpJpiY=6fqpd4v1&v2bqZUPUFZ5JYMYf3!17V97_3Bs^RCJ(2ygDff8E8;M6u0au zIobx=Ld?q@)ClpBzRxb7c!X}6FZ*s&g**nb0kD!k$sBenjnc{4J)UQbFZL(X(N9dh zQD~$F?MxjCq-j8=_2;Qks=%1rVd%l>2g4U=3Zjeu6#+f zpru_j7X&i{!3Hzc2n#1T{H940Z+>1|7Q`nrblq#Fwl29&RBM^n?Ujd98x)u5u4E@K zkHDp0PN(09o)2}VnBgL0*utxQspzA`d#*~7%G5wP>j9i{rz*>NTPZVWb+iwU9ROcZ z6F}l1{7TH+03FwG^Z4AU!;gasr${hA*#Ml~9*)~qRj6z))FK*pQ^h66dmdO0I}y4{ zQ2eB*;LFm#di0IBTVUWIA9 zmW{)o*D$t~u3agw$v4Z})H$nndZn!-Qh5*1WZ~fX;Bk+yde&odr2Ei4jnBnY=1qOtwuyRrV7mCfGKq%8nIFGYoS8S1su= zlH{Rlik9YrhP4igj;E|9HM^->U7w_MDGE)>su%r=yT$2BSaad@3F6vR&_%N`{cJoo zIOS(k;Te;*nztz_1>$+D=NtA_T=M-<^tgq}3tx#Vg_9SKPE2=4nqm|bUcSr>V*PP7 z$NK10ja3#kyV}aDaDjU&kv+Rih*Q^0)}oUnyS11Gpr5)yuNe;6_-uHK#X|-&6=_xY zmnn+xVqVi(z)^!Y_dkwMmo47%64Yt2ujai`%0j`_Le%F*;dhI{KBG(DtBI~tWkZ#wWHq+1U1pCzX%ZJTBoxXJEE`R}}9GMoSRst#gGu;X|x{z19)x2_M~ccVbr zUg(4P3Wps^8-!M>Y&rZJ(hS8fMsYtImF;#1PbhM(hr4Fn?&kiluS{D=cI3`@ijlor zbytLU73BDqm$9c!$8iXv-C?@+Dpq-3aqZO6Q;OispD~>KwUpdGYkMD|y?D^x5f7fv z3&WJaxeqb)cw|nDdjJGMcr{{vK6|=q0JVH)6?uX_f2wuzMXFsff*D%m@zr59h4LKu zrU}Rs%vO5#gfzz0gbbw8VPx>=NTL*fWhbO?({@vCEbYA1)Me(3BM9KmPS!@j*HCppuCpnbh{12xi$kDg}DRW!2yO-|o|WovO2NBoFX9`BDpt5`A8) z9OvDib)rmyqtSgCaLxyLm}l>sxv36&o*JLJ(Af-G6*UZ3fXwx7B9aGuTkj)A$>}yA zJX-Os(y3kxe=A(^Z-#Bu7PHaqzX=)bmu5}d8OdM&+2w4v^;@U!o6rzi7f+8eQoUCD z)XM3{cY%r>E*=9L^xEOw{^@s5zZ~s(tcYD;23h+9r+r4*BV7cNkvF+Ppi z3^~~+DrxEY!SJy!Y3FpvZQVeJ==?S*@HsW!-noKYJ3B+Xl|>94T~p>?h^99tbv+%o zYSm)M6!F*b6}5dv{B+HQKQkXhknu*W*+O^}k|1+wWR$)dmzc+5S8_g+e@L5(C84}& zJpVfbXYRj|IBMg~#^Yq98$dv}3$g9yvnaCinm))?#w{1l6meb#ZAPy!EJYK?KP@GD znIF*9^fCX~>eCe7p;p?az@K9^%F)Zazttp)l_r0K zYG>v(N)hv*1rh|gX3UD__nvXVtJy;zgJB;{ffwnwjP z>2AgR7~TH4LBOTJRPhI!-pDH)`D^;I4HEfHbpL-i)BUN~O`}lcE+mni1tNwPr1`M+ z#K^O6>iM;7Vuf=+hK0?1dE_ur$q_Q2CC&Bj>E~2z6sX8)+d9%w9LqIDwo~-PqkWak zZK9~vAZCsgsE6ED4nzt?Uu*ghPnmlSh0j6D_nAWc9A8!23lr8Ew%Qy8ttMAO3emcG z8zbcFGTNM!UAwaDpqmK4ht7tu&5CdC3-^np`*i!I7&KR>Z&MjP0OrmNb%Q^ajR=2| z2g)Dc|6N!^%M-yG-^(*G5m&GPN)qqhEn^qWhig-9nxb?yZ=1l;_z)tN53|^h;2mIl zAM~9ItyQDn)1Y%vC^9q~zJh7r-ilp2?7okbSI7eSNWNVPNpz)dE@!S2|GQ6T z|9eR{ez^2&6l;#T&rV`#_k<%!E^!rWjHI`329&=J%0(xqhtNnB{M~a8r?N{qu=egg zaLXx?ot#K?`Md+p2H%}O~f3nVU`Mnmay`B1Svz*G@!4L>q zgA>)m&eaa6ZOuvxNAqYe1jisI^_b*&_U`YlU)~eH;g0ZpM9zF$xG8Ah=B8%ThMV}0 zf<0PM_Tm+_b3alZ4#;ke9DCOh7KZ#D%zjjhL;e{tmCD%j8IFpZQ1lNA9Eh;jNZy`j zcYgis7)svdjB7m9*-&Wn>^@*9={*2Q4=%rVkv7s?R0FD0G@u+^oqjrohPn*P+6jP4 zMWiqFN~be$Wobe&Y9OZuSko+*mH^-tK8-|Ae3Y27{ZFxytVz&1(0IL%H6I#W`3lmGwCw*~6^@vr=;oR?{L21Gl*k72n~r zXyMuSRC@!Q6yYd(2bW^oI9=D)sWT5R;h9LWyp(08kv!MsxV7A-zb z;6a%$p(=*V-z9lW1XuoH;-Juzbf-VdbkoPCD(eB&k?v3%x4wJi0(r*XF6u`Xec7KNerOc7ekK_v>!|yNg^6bFlD_l2 zvAeoFfftBfr%alQWutW~3;0!xb2XZmPSxm+ezo6F;APZcwkzr~FN0xqeK6~6#8j)= z0A@|_5U=XDRY7HT|B`KZUG5%7i?b}`ktbrMMo>D4MAboglA8W5{{^XfM0_?(mp*4Z zrx;5K0c#F>p}*Tt!@PCViKHzHLM0gdHfGEl=+sX^JB>d)P!6Lbo!n)VG7t`^czv|X zXBGVvm+sS3FmA2U3z^2d#T>_X*`f;upx(ns+3+Ko9@(1*FM|CWs+HeCl|SiLWlOQ& z-v5=TrJ^vXlMN^nM_B8Zyv3a|ro@}ma~D%JuY0flaYFej^M}Uw5m)-QFdcCgK}b!H z^|0TMZa(kjY5INWES4FN<4IoKf?0=9d!FWdXikCK_oEdzvaIJFoN<&8l+#G6LS zU0z;TSonJ@3-_hCdjXT*ZtsU}R%cs^C?-uvoP$3tXmTWVN5UWMTct^e%az8V*ZQ&q zwt5`v>Gw{5O^F#T5$6~FWJ&F^c#0?9_^*sZj-kr^`%`i2omXb4v0&eTV>FYU>?+$&VuV1Gpti~7RmgFnJ z*GLl6lcvi%j^Via|5()j|2m5Hn6|+-N6U#EqgUbIUWBsUtxSqdc8C=(c(MG6{!a(} zUnXw~^p}KGf86v((76Oq>plLeeXm*^^=sI)t{kp4eQ*B{*+$ z=3q1G3A+YN)6=q_jnq~$WZFIuIPDb90H(lC66s3)T}NDugk`R>!7mAm)O<6QI=9lQ2bXQ-F``m;r(B8=90W~0RcG+c z!n3wi^<#5t_Cvz6S#%tKEy&RggXpR1C+yTS&2ek>GW7`RQ$pBROe@bFJ9cnvDq~4` zz%qqwTjV0iUJ*lCKGrW`0ofM!neekJ=pSw#SP}yM=Eg|ntEW#btL1dpBL;eLda}+6$GfyH zCD!J%Tk8BfswNpU`A?Sm??EE<Jak*(!^!&*OVQA{Q0_fq!VKTA?v2*7#+^LXhkB`O}LS_*bV-qU0~y zf(7sDcy;}+C$egGV#zfcV%3!kfqab=jv!UbQsj4jciW>KuL%Ru`Z$!_&EhslY1?t34T%$)JK273`< zgn&+<7e~9<3;+o{q=HK;Y*+W5>xCE1k-h5%3LFAqD53BYx}Kd6wzTs!r37Asm3Gua z$M+N>aoeL;a1#-WS@;8L1Ugn#NimkcUM)MCM)%x($#+vKWskP`IsE8=`a3#cou9sf87~k-^5JETK_6K{WiO=Fk%vYetVxeVnIgXYgQU#%WUBlWvf+JkNf8{ zLwx!K&s%Q;r5?!{NM740qjE;Y*$?&09be9r_IW z5ZdXyGu1}RapuGY-n}aIiE8df>5oJ~xIFqzK{=ry7bj*JtGSWvbeNMbNE^B}%naUb z+13NJ=F zETp4{*7;TBgm7@XQVY0Uww;{cz`Ve!h!tvti1p|h4lvN{iDP;p3m+?rD`zQ&ji>{G9&Dp80TN5PkvPTZ*8T<`4+OCza^-4 z1#Mk2Wcm6~&40|>RdE;b((tE;W#E=F??>GEJzzTY(eyjP`F4z8p1mJI_Vn}YlMIa^ z@f~yGOKk6K$yy3=RCx)^@WS3RI)qnW%}V=F^e(YE=xvhx5pn^+*P9@^O^) zw-L}|`XxI{#_r<)bna`XPIHtKd%D|ui5L&v9gsu)OL_}<$Qstttv9^n8N$)0{ZD98 z$5l2v=ovTIUG1_AI=PlgZ7wX0F8_Wzn0bZ9s+$vCtg7bgDNr&D*Xfc$zw6)WVh=I? zuTHO=UcUc}r_Y)f&uLcj={u-r3-9Y`;3_V!F9Z80sNx5p^;Ha!uYp)fDK59n>arOV zMvB5w`^(S_m(#{Pg66}Oap0GMQ05B4kM8>2y-pTTng|a#Dz&F zk=0i>}rFR_kQ%ZtgXEZ*Y6A}+u9~P zcd#xOi>z{&o^8i(G8cuaU$DA`>Ss#l)zm+b`4R`LJqDZF39n%@f0aQe%wz^!&Db3a zcs(?dbdSoAkzRZ++}5y72Tm?b7(QlZ%H76N$$-JprV=Y2kNJJXfzS9#Y*E#BKOO@f zpJjUZP~#==uaR2&+HG%%L$`!%I(9X>>-jzA;ec-|6VuIrGt&1L`K=wBt(_yL^MY+W zse4tUzjLlemBS7KwTnc&$aH3Jr}VZDV^MbEN$NNG5t>cL=*70$9$j{tqo7HOdwz~D zfnB3DyjF!8Z>^~FNe6^TJneG$j0OM49M!W>g4HM0rTAzk-SQ$~tgA#1 zJ8UWK;}#yLFSsz>OK#~ev(L>Pi$rZEd%c_oS4J?xt$_|w-MoTG?N56-5d80K58Y!Q zVW;VR0PE`Ez~ytFa@+T3Tt3DB8QmF8Zqm_mZ&3II#{@W%4+x zfu|EQgmO*J8O4ewss!yd*xf!(pRT9g230&j%igM;kQe^sjd8-qW#-z%xz)HC$pE5+HAhEg$8s>d;mJ$}Rbt5!Q$2}AHm{P^7O*Va?!|1G<= z(*4(>q#nH56xY!n*cml36S;TakI?i0)#GJ88VxMkF2`6RGb#gRIMT3}_@z^E7%hTK zRe7v5j7GtF#YlwDZ=7=c3GHn&UfNZ8?LiPQX|e}H0!Us|J^t@<0Yfcd-CVj3ci0V^ z+nY(Vw^cM5mfrA&$~{q=1z*IB!-x9ag^;GwmWo3OC-h;@v%pbqa}+kUvyJ;zHVOO9 zr3!z7KB4SN@&@A$4?*JxbV|KWlcqwBtu%RJ^u}KC5q}WSw-jQVL6cD`&AZ5Ps@Xm; z06)9hS$#@NFpXu0ZwVdW6O*y=gUPJiF>r{AYd?&h9H^|7wE3hDz4-Slj0`j})!xjc z3Eb3c1Gl*wV$p}f4$&h#$1v$^uXd6mdi75cBas%g+Ef~XzZ-SvTuFP%g<#tl*2GK! zF>6K8%R*6G%tq}74j-Fi?!a6Cnm+%$W_PI|;;~$)?zjTR`tg4q*R6`v?x>7HPnh^I zII55owz=Wy0qlZWh)D;Ph~+ASMnV~SCAK2HnWB}QWy4D2JDpyp(_Z87?_d%->4y6G zn}Or|;Pmy=AI>^~LNS@PmEti=H_#BHX&FQQ!)j!{FDV&UqUUWt^mS zB6oe@P^*rD^dYb30aUF*B|0^g)s+*OAM1m})AQg7Tdt`8bK9-M(K{kEfI`?Fp zJhNXX?G@gSV*&b=zE!k}@evht%Gb3!lrGTNuD@97>;^=BJMCq2I#~@AwuZGDsO@Z! zVAP_4uFSjyCzHC{%a5j3)e|53ES4(`gAh0!_F~;;Pecp7n4*%rz5KP+O9>Ab27rv3 zJ^c74BEOk7hN)+MYYPjzKgM&s(96@NifGKHy;ms3ho^U#&<-$PwZ?uu?ds`wezNyG znn)R0@I21a?U%*E!s-_Bp>4C=tpB(3CNX|uP@6en zx9CtB+hjGPp_DoA{r7^<=uD`kA%aYLIB?Y_*&SN10Mb<7qzEWQBMBg(w(7S;sf9>q zMTHi>^5LRZfoO_*SxN$`Itp^|7B9}0_o?g3jctYDeqskGXI^L-&}A^ z^h+me@<((sYP^YgnpK%gb8=XaTtzA7Lw3SLIYr6h z&xz;T(b}A#f|xx0q`l;=&7Dp7GFIjLbbxGR&RS9;upro&zYx!TP`2L+tPh! zYS08#=BwT`wMlRlqAzjT^l27`k|?R}$F(nq!!Ra{R90JWkF++bW2(u(U^9{7Y4DS} zsNXmG<2R<7oX&4}iOa{ZJ~u;{#gR>-|Hp>jY6l}T;)(S5TsNkAkq5yV!66dAD(=2Q zK##*2r3e~0EQR{}fv%l%skqD;`h@7@b9`fM5H3Kz$$;Fg?UQO+MQq z5TTiiFbi_Q^Q3jFK6RV%A*95YExrc{Caynps=si^`PzWM@J&TL(7hSXmg@ zdcdbFwUcw#4udW4hpiEJwg%}7M~V0tXs{J^Yz6VF%yyt)DeFeVdiEq}d@f4c_an7= zRscSGSF5$3$=6<%{0?F@`O8GXb@f;Hpv@q}AKtRX5&1vuF)`-?V;A8QP)^A#)iXLk zboseE9{X&J)bipKqE2r%1Q+k?bKX?c_8*0pd>x^;j2nW}v?r*EOPh}ve73Dj=^L<=x;kbFn~i468z z0XOR28=Bp(#-v`nz>27p5V8r-E@Y2KCm)J)a>NU`{dv7brRyWleVEyYm`gN%MQx2QN(nOf?mEaTn=bk2+rC)LscSDmYvjGjZA0KSnTUphhvz#Zd(V$N@uL< z6XV5W{X`~^>^V(P+?hK_rLiAB9SdCQtyJ4pQd#rcnK&AW zPPvmjYODY-m4Rnb`Mp2$pa_*t!U*=)P`m1h=xf$+qIZ$w3%GW|jpfSYEo{&kC6Lax zRX8ltaPFpiuh{AE3JMzoLNnx_p8k0@uoLeNUE##Jo8Fj{J1SaM{Hb%xl`4JIdYf$m zh>9YvAEv#{9BBv|mt}h2^mfVX<*2u-xr+J0-C%B;oFzX*y-J%b9^Q|&O<^_RkM!<7 z51We?^tvz#$}I#J5yCAeMY@>Q;DNg9&uf~X&x>Cxp<}yYx2_DOJS$Ol9w2`Lf~EPJ z_$49BW-K7pSQEncSRj9Z>>e(FFP7VwO7{LQT@akU$Nq%`*bP)K%2i03cC6g#s^npxvGh{>?3fnBtIS@z|I5tL1ld9EPhpEZ=>A+c_pgBU8(CxQ7%+uq8T_Lk zaj8f%<)q2+n^le6Tht0c^+`j^p*}WMqsMw`wr3BcBqW$IuO{EtE;y1H(Jae5)N~!M zJ_EH}t@movEQ|kaI>DF=JIYBILlli<5lMtR5Ar0PXY(h|qjkG08*Xlws*wT^_0&p& z3ekS1z+P8nwMxJ_z#+%?@+2#)DK-PSc;s?W!1PAz$;;~1^rQXyhm)%5LRND>U|W+Y z_SMLR&Q%?p67T~1RljA+cAKF8;t zU8#RVKQS^cZuvH?DLp4mspry=R02Wqi6xbEyDE(oJU+}gNvGpRCA@WdF)05|P=3W} zYCnahb^@RiuH4-1UDi`l`-VnSSfs36>z+o1(4*$mbSaD4QQPLzZgB5U&A&r831L2D z3%LrV!OYNs;&)%4yk+}Vl%8H(rntAyCAp<)vZQ*{gr6h(&_^zCcU4@a9gWJA0rxLp zMpLi~-?z+Bp<9hiRES40Y#3h{SlE8z5_+;ONNTz-N^FIejtaRf02}R)KMb1hv8_X3 zLd2GbS|QGIdIS`l+4?fw2u;XB@6F}+71Pb>?KzOgt?09>#4T6aAdF~!DCI*ccsYOe z^i{*^4*??o4HRENuo=aY$w@>)Rt0MFQQ#m0osqx47XMCiwWbLA#HL{Je%9O3{k35oQ_Q-%O1H_`P=O{dNWerCANLnQzA>ghw5v2DEjgwE1hcYc9y+ zUd0L3O<5kN^XxWtbfCl{sKq+1c3#aqzev$vpPfIk3rK-QJO&tSB_>Jor9tm#;?#f# z4RapDF}CmatZLMd*-WX`zI!GHEkmTWJZ1SsHFXQ?zA9m2ynDChwpNrSkDF=@l}Vg) zU1lajlCDzzqoDZX79zR~NZys$6{o7<_M-V-(`5|{6ME@hG3<3fsD2+_{?KyIjem2` zQx|F;Dl5ZV14*|g$nVAmeI?NSQU}Q45O1lxKB`xKUJ0hzFxUF>Ht2l|JNVxHhcxfL}e0fPFoSc1=x0SToQ_Nt>fc=J@$R_ zZqJ!E568W}_OHhRbnf#Q;vDl6)3%>&K)r`HF^1lB@sRrC?sq#pE|9gds}$V*r0cxh z*kFxHf5mo~-YR777SfFT-w7v&1qY}{$>53T-OLYkMU z9JjGXyP-4R$90M)N|zOdWA7Rr!Ln9G<6&?GGJ)ijJ4y$I@`f(zZ)BSVRq|uBv-tj# zYUlika}V}rK4i}7p;zNGRU!pbv%k;njPCOSSTd@;J0^oF5l+2GRkBSp&Fp)!MpKra z9U@A{j6#iul))@vTdPJ_e3V3V;L)r&Q;Vh594MCie~+s*&RvbXf1j9&H{6N+kADWv zO9aNHrk49Hp69H~)iNKP7(_5<)SAy@Zs;+_b^F$n%!n)nWC^cvuO<>gWsW%_j_4Ds zA`X#v%(BOwQ%w9X1>f)AemrV0nc+tE-x5@=D`(}P;+_k%u4!ku9KP5w{k=zr z($i|r6Ff|_uB24vk*Vf2zcdszxzL}^#|SVXn%zotbarIt=+8V$1%|1hN|(q2Uj>Y`+92eZX;T4|Gp=-e@R zBQ_+@sRUk|w35**!yfr1L$*?}k=qOia#7NFUwO7qbu3H+%VllEb10vyXenH*7?-hA z56iUS)6@ET)br}FkkQ7t$8rv-qx%$&WYg3}heqBD=~6&4K>V6jc*EV2M0lOv-;o_s zP!h?6Th|;|M9fl)$Yl>!Hl@DUBwEAyp`|NpDQbp@@GM_Q#<+90mC4JjC)@UtGEn;q zE{a!THP2v}OZrwSzBT(57HNi5-@o6oqBno#k8g#{$fg4Jj23D7HD2UuL*PSc)Z&E*-z)6 z&}zJ<=i^{%7uK%SXz| zY)T#irI#_42_$pa*|lxtbFR!+=7kf3ie-ta>eE?aRp1gThXcU6>3qaX2iWm1{?m?a z*u?fGw#<`Y{xQ?%KY_}BeE%OuNy z1Yf_`w|^^%Sa=T?{IhuS2RZ+3X&kp^S-;=yKQYAU3ZL&9JZHUkyJs^oQyy_joW<2p zGM6((Uv_q=58%Y7G*+E5&gI}~jDDE=#C6`vO-&VXV#!#IlTjRq_aWL}wj0ydTRsl5 z19|Y2)5X;)k!mgG0-dfA;&RfPS)=yb((=;DcIbPzpGdEpp*`%A_2tZ2IvkbFvz2>l zX;Hzmg)X`ym@juS(}f^??~ZeLNRCfgF#PTx@!E;f2qfT)=IJy4{G8}%d?DjBXu*Dw zGIhyLV47jz|0bg+765ETML8`DW{}CUbGaN0avK z60nB%m093u(u0P*DJ1Qco~^sM%CpGH*&pCu@LTNjv=cj+F`{hWwn`E0X3MV05Z^GtmzDOqhT?g_Fv5xLyFItNWm=C4BU~|-Yz|=$ zd_V_RV);@w3~P+LYCopPIMxG5^T?hER0hv22JCVUkr z=fJAk>1@q_J86jy$G0;}U7dpe{CBxjHYiGIV85ZScO>$A(g@A4kC#E7A#xSa?kOL#r$p=sIx#vwAQj^FDzHEm;qzhEN%tI zX4HqwPGo>%4jl`^ZaC~vK3gJpfF<}36GQ8Gm#$^WifhcCaoaTCv7@{xCT$~;T?9wE zKCd(_PPQsX^{}*iO3(AD&FPs={HXLpOB~iWE+nvhia549qP7fb-R9p6`X<%tGi}?Y z-M7AWV;-C4z1v?(*PF?de{lMH_;|$B?FW4RlIA)rHknKCpknww@=E+pCn%`rWJmn)3&mPpuPJOhx zBCe>N=By6PPkc=~hVRNDyNzSYf(Vu?ff@t)VRZVvOUCywR^C)=a%rUpzT1CYiN*hX z?MBFboBvJ-+?9DjeRpuvqk`;xAPz_{Auv zEdc`-+w37NH)*nBm}Rh2YV^T;1EZTEAG;LY5zt|Gj(rZuS?Z820e|xJzu>~C=>7Mj z$3Z;eA$;IVuE^b9`DYbi606X+Srh}@!B})xn9xFD)^j|!Kx`^6Hk_G|;#w#`Aeyk$ z6;KiGzRClqx-4~FPDfXk-3FGu`3dL3wz%ocpe|c1Z}4DjceOD^;UWyl=Z?Pf=RKCx zAX7fd=PnXxJx{)|hZyo$l6`((&^f`Rwzi2GRB>-ws>=)Vo*ZHNN#+#Y+v;#iSL4v^ z>V9lVV4?o5svJl?3)Ic)RsFRPkg_>AZt_(9ll0O89Bay@q-$$Py=+08W^Ko@XmvUm=v0d*U{lBY&CTD zOs3Q@5fF8rw`WlBKY99}`A-SD|AEs3*?5*B@f>kg0aUhwk7&PSWHmXlRl<`A21`b) zlnSXe4_t%Xjkb0e=ZT~mhq@|+&qE{S02O#epnA4Q5b>OaHB_FqF{XH=nt`FQss|7u zYDO$&UVtYaqL{L{zni%4_B$eU_jA>*?i@hW1d!06O-hV>UNX?rU4EhcZ1!zy9QyXh zYJ)w%wI}uswrRZTVUKvTDXFiQc3^)0syxP2dH41gQRL5o?jKW(`*no%?y3=;qacn> zc?NS=9M(C(cE#>jatDZ7k!0t4z}-sR>E^$~mkj@A!xa%NQeT9S>Khf%$*&0;$S4Tr zQVDh|FwZRfDsWxO+k=`t3COMfp262W5dC-g&+abw-{UkjL)X@5wHl+O6Zw*}eqD&# zB~QLI6Ze(hBj=PlO76Tbt+?bfg{IKEtK|k56L#WQW@u>al>NG^)v45XCjBnwBwz?5 z-t@JbvU)sznP>0%oco78&o}R|o6_^cE0OsBkSnt=KSK_5;s9Qr6W@FFvNN>gz0F#e zfh-p=cg^BOzq-W{bUDb?2^4b06uDG@Upd*W_%5mWWvx%(^8$mRKcr$dME@^cT^a|gQg=A3s7HwfIDPYd5^AC9L zF86Y1Cn$|hA66p2ae4{M#KT?D#;;XX|3?@p&#)Hf7f{Q8#FzKz7jMVk;7vXTRToVq zN^LhRWq(HyyoszO)uoZNIXOB=jw5L(7QZUz{?s_T)zRD;aOk%N=Vn_LVb$%&sU1#H zIft?AH?sbpq*!?$3fLz0YHmfgXTfB}9`-zrbN5YIHezM-2zr(3AJASh54oO2%}&y) zkz2AJZo;t>DQXG$R7`sY$P+5NyP%o}U?KwZQ0L3fLGT^y4ZAym)>qiI6;;9e^~`0B{qW?z8w}f6{4$XJdCZ#60@?TJ;ZFTdFsGb(Yr*Oo zscqWQ)$E0{(5bjlBLlm%;Foaxlyz=Lqe8+PWQ+n&flFd6B(^?*s8@Nx)5T(HM@_L9 z9k!aX(kPDh!eky({1cUwS}iY^#Xt&T;?bWmj16Mw;~-}~uX4LcmZ5>SEG+nk?WK8E zL@Q-iw|~HXDBVW}Ut4*T$Y#0q>?Q*?BC;GCP4B&0zB3R9o*unROo?}4NXPb($r4khIU(*1>3m-tJ?*^ zyw)_%^@d(4T#B+Ct3{`)J-igDKdxnI$R^KwOdl4r-Dq3YZ9Kd8-L6>fkl)LbZblme zc$cGv!QGHny`jkeNI2=EM!kWoU1rauhH&5!of~S6M7aWQ6XCAC&dv720F_f;-g`Hczi54Ym(M+#!Ese;Y3_x)QzCC~{|H^N zlDqm@Moxb0nxg+7V{iJUTauOcT?vsGFJurB7PMr8(Xx?b zEk5}AZ+ia^JX^Ncvg}XEvX=)e1QNoAUNV*t0@O@~?uH(#tE;-Yt7{&*=DKzB-kX_z ze$TUa>^N`UlC@60dCrLwv8UL3$ByB|sT9f6)l|Y(Z|qiEO|jfji}{qt+`eR*te0}0 zSE6!lN*qd1T@Zg;O@DpsR|5)Y?f*@8fbi8DB|M*Zj}TIisaZK7Srnv|l9cRQ%V)HX zJYi$Au$`(`I4^$Nsdjyc3gv2Fh{n3!YRP7;$s>nKUKGG+1Er#HTy;RZhP#GfP-!Ju zXd$nGk;=_ZNGn&L@nPiY`-)kLt5M2xSPiqwaqofBrXnMEc_rOrD*mEE(e`Dz)`%)i zK?Fq4IH7Csde3!HM>Xq*BJc;Q6s{QJ^@D?bUm3K~zDj(;Crw?N|9U^*t<%5Vjk(+M z;!;_?eW8_D2sqH4>&yR$t0b)dzV9}CG7Cit^38(V%l}ayJ5z-zpZ+xZl~E-V%zU-h zdh2J}qz`&MC|XN_Z_B?vy#IA;Dr{=5L!|TBBenj|uMXEp;dsSer}UsO{>chl4uj`z zpa^J1r3lwwJlUwrgm=eAzNH_{Y<$vOA7G!Ta@zc+sf}mOD|8eQM}_M$Ksj!1H%TGDEl ztlW+^^%SjBdxEZzS^uP5*Oz~5vXZW}_5XOs@bo_?JYwYJVb)JLv-aU;bOn>}?4vPg z5`(edhfUe@^1zR^LjkdZ`<==yYw(gkoij11os$(%u&zZxKw3M_`L(=2ZZ%Y5r=qLDQ4sEC5>%9E$N zJaW0#4K}q7z^?7RQ7uFi*}6M5ba(~@Ke$;`$^<;u`~XLVqyMnLk<^{+&Ud$y*l-3` z;A*s}WaM*Qli2vz#2bhnSV~_!dDnr2!jF3t&t>u7^`TQ!$cz;;Fs+*%J|8)<-v@(O*9O zu5x&zHnw;)1=a?EU5legeN__~tV-N#3es0S3r{O6c`oz}El+)I?@v&udY@K!ms5~O z+rIwRkS?Ike?ch(J{l>hcfYPc>GrbNtPr(XEXo&^pl?HKq@?xrvY3PNQFT3@-9$~i zPI-PpJb=naFT{VL#iWTJRwGT`^D2&teAOr4)I)B9d-{RF4#YI_nbuj#9NQ5;kcMSbAbsa0>3 zx>cQea$E`q03-i>X&mX)5Y9Z;4?0rWAo0zpB=|AS-So8N(0@F^z{6ly1%+S;)X;91VA%Il2QY>>9n z1zHV~fS|Y#c3*EUN>56Nrem`-ptt5W;KulA=bhE$=~Yz`Z&B(o)7vk|t5a1Yd5Spb zfKL6z5!uD)R?&EWVVcKej$m5$Z+f~~98yo;E&bM)Nu`0b;4J6F<4T=lE7Gx7wZ05M zVo*;~m1;i_*i3s#Q$Ay}koJ=;M^3tCcBKUcDR~J%7X0X>HEEhJXSW6(+|&D*4>ewn zonma#a&NlP9o#r`)ctb|m_`Xg`O-|=Alj#0KMRN%^Qs5T5bgyy4H2o z^8`>B<*5LVY=S!4k!mElMSS$@&8;jU&P7Fi1aE47?1Cy5sv;ktM&SEY{-CBTs@yeu zzTUY}H;yPdz?*_y2gh*Y!<)|BMGS`^C`m^)o|YyuM1EK-n@KmOD1o=kx*_Q==z|W` zS-!dasSpa(*yXw}7F4h@|FCpKibppzKA5U&cYdus`fJO@0Ak)SQOx(;1)Z@pp8N9> zmkMaVBU51IeI7F^Q||)d=S@P>AwtBVvj6l+N&XeBxwp;OAf(=p^pPn3Ytf`KX~iDR z{kQZP2Dp)?+xzRkmIQ^J{QpPN_TSgKPR+Y~T`|3z;8wcS9yPt(QanPGBo!|BtagHk9lK|=>G31WdAf(xKog0x)wS;32B7OYpkKB6 zM0t2m&uN^LEW&mBSWe$=?6GIA^n$H2zaXcd4Jgwc&@0`g`8wTR{zH3wRyTbE6Gg|? zOW(l}X(9NEqxVSzBMt!&zs$eYhO;%%ihHa*OBbdO8xBf!B8UYGWg@X4wT60x9l7YZ z^5aGtH2lB2H)IpsK%>c+b=sOTFzVlNo@oIEk{R`cpr9+OT#^ zsdBADWs~d~Jq`+OF%r%HBkys5#@S@hJ(&T1@ih;Ph|(TZk}uYx74w0v#t2kU#=zX_ zkJ3`i&v>q-`L!{RElj3B1;fw_n%DQMy6(sdoKXuZahF?(U$*1lmrR)%KA8=O6(5V% zJuENBQhB0tRi&bSngNL5=Vl;EX&qN0E-#MuDzg@GI|x4T<|?$XSexGkgt_oxXe7mj zXv(cvE%j<;IFRf;t({Ubuj?oafJ%}PgwaBE^ANZshh$s(C{gG>&W7#1k7YiFC)^Z0 zblA6Bus{*N{kqdW?R?%mEtgO9eyy(WGpC3FnI4a|#;em;7%J^$l}H~h7V`8#P^d$N z)!oz&ir1F+bPEWI-d5rtxG7LhO>eSAnpFHGgZLe3IPYYMO&i)tkl6VHICNgCLjn>6 zMvFmjoKJ7~BVd=BBvnB@7d#3*(yf4qB8{!G&V^;IbULoBN&<-~oG$-?O~LX1GXe)Y zuU1oL{)Ei3G$c}@sI{;UO86Cd)W*5w_ZrGq9s<|GvWQ#tR~=1t2YRZ0>?4t0qm9}w z_q6+AVJaPs6>`7Rb2R8Id9GJ^5GC>yN0b=kTpdvMq(NGgcmaxH>`QfaD;)P+?HedE z@Y?>T35|Dwj*&?-(0RDuulMJabC@_0XyNRhz}GX>*~AZ>Rl}c{eQzo$%|cm=dm0){ z>7JG#B9kk&*q%y#a{JvAI{%j5S-?-DZnbm0h(#@5KmCEU_dyLO;`If|Z*g7Whn1_A zc#}V6q_o8ORN{xNq$Y{CzL2@HJ`i_Rw(MPE@8DwASc4IuhD8>Jr*SCCGqx=fe zSh%y47f_O&e6P1!&)LePCH+WBx&H93u?TY$#6 zpWy*9L{#Bu|DU{GN4p3h&28xpXur0)Eb68UR4r5BgVWXg1qHsflZ`0W(ZUSl-q*vcZ z|3)u2vijgw-H{ejYjy5N3%IA!qGE1qpdvCmQvmA5qOJ=hkuDBKT3u)uDhtyU*UW+I zDE4yIM$3%)Gqolk#d9P}RH}FLjFG)B6QLK9I|RjHO}Tuhc6@YrteOOBg)G zD{Z`yC%>m4J)>Jdb$(<=keVaG11XFUQvYYMb`P~{?fbiJHm_pzh9(tNiE z!UHz+pM^P&nbyDmWs8JZx^t_|ej>TNJx+C-E{TMvQ*qc;%X{}hdxiCNj}ruv{#TpP z>LtiN#``p`q_l$c2z20BBzecV%6Gujb)Rxr6eR{abnP_nN)2WS-6({i3muvmJx;o- z0_jF+fNP#o+*CDyZfvTd3kK%^*l{W7f?slKIW}K?51PK-&*%AgW+EMlUT28kDX>{Y z++NZY1R$9aUWP0Jnnl&L0as#?&Vc_^99Nng<)gH>NLC@B!iKMtirteH5DdMkRTc#C zwPRu~q?sR`{=U+A^`gHr%u-B^=j&6$qB8q79{b+DuoZ z+?I$sR|om?r)PTzu>`vYGZ2n}8b~~9N3_~ZlNds}Vrx)7&RN3{6-BE0NLdM>qA}&u zQ^;$BNM!V(UGGVz;k^Q7M?dcw3mi=C{HiJeq~^_)24Q-TZ&oVcxv+}UuvGga3loLz z7)beb{%cZyUAbUR>yocX5RU!#HV1vRPq`kt%cJiwuM$)t+c1NffBHX)Ljo$yZ~P_s zy1M(^6~nVuf%Ani_+HDrm}v!2exr^Gw6g30x~oT2jEi4GR*g8t>_whVDH&0Bknx*o z5JYe=v>}13fO89ii1Kh~ZUS=d28%nGn)9bG-QQ(GnO&xJFOpL$M{G%JJUla9COR{W zdX^PDJ6NKnS;;b1+1%pU-7#QP(mNg7DB?oV1b3BiupZ+@7^NzPyWFytwTM;3(5s>a1m6iH}eg={ry)apFygxK z$hs5VJGG9Zl#2S*6z&$m0HH;}c@%d^Y63A!-GE@Qi&BiA*gJd($Qk!cJ0%eTWO0o5 zNAil+@%@Kw!Ih<`1|q*@%{>=`+m)czi69D6e^^B6ck8!4EHjE}T)t(7QzR)2#O=SK z-DB{wbcm(%jAJrT|KaJ^1nO<6suBc0fs6XCEiqg_&op#|hfynS;yWGQV#JjQVBnov^D%mNtpd#=yZb~ro-15#z0 zpL%dzko5V}H&2Im+{ii3y@kMp@Dq(W6WHKK{huqnZX(qJw3X$Zc|UP^4x_}kKP!p7 zu01In)_B-b`u<*b!9PBIHjy|l23!ef2U*pbDrpJYB~C?uSA6VJhw}QMqajm4P3ctV zjvZ&zbLd6-$Vp_rCI?Tj@5yHuWdVlv`ox~~oZh-mQ3{xI@Ue70=uE?|QG1n_b0tsL zZWIjLv;*gM%>Z{Dc3!}Ci$fP&|R+La`IY-EzZ3aaEpoFEl( zb3*yBbfiRj;Eem;GJs01xLE+DY`R1Zxb?Qrl&QI4Xi=Gle%HhA4!mUq-o9>X&-I-= zo#tvCBWtmKULR6Ll$~w$YD|)+S9G-!f|m%b*^deqBVl_8oL9^cDpy*<1~2^@^qFDCO8_3 z7e?K>u)mhC7kS~&`y=A%p(EIX}Ta_3{e9`VEi zyZrJt6S-GdgX@3JkwYpHo6HK)>S%36NoUZp_5jP5R^|Pf)n)V_Y;Tp`uBa*Gwa&AZ zCQ6RoFh@l|uehEl15Q6?{~}#Ut0huzshb&DI?YOwm3X)3h)YoHc{CSx`4hV4Ad}%c z*w+n{xl#b(`hL*zifp@mNQ=*L*yU?-v}z%Vr3~R?Tk$W8X>S6WJl}WRjNYn(>%BLT zLai)_sAYsr*axN>D&T#q=z0EeU=-A z``*wkWD1LkYx4Wt1J;!bS$V)knLT)@o6O-d6IL)3((t*EcX9tHVHuttcL?;F8UR@i zFk}jRkNKph3i!Jb_=rddoN~r`#3CS3q=dx>mvTeac|EvytGLS+;PfKD11s>hn{FGh z-^VR}+>1XDHCl#n4hoT?B2~GokEv|-zTpt!tCm_blw!L$?{+3I5GI${tEfwIj+RLW zDj(3oQyXaXV)^;wYwx3~$9ST^n0VGh8a&#NU`h#v(O0_js&CUEnSk1#TxHUY z+qc(vfBeGghBwjeE_!NCqb(xZW3lQFXjQW`I6=>Aa_C^F#w`@_LcllW3t!cT&6$Lv z0np~8qLJ3)q>Ul9?STrdI$`&H=DABG%8E<~;~CbG`+du=PMumJ8Cv?$0 zMrh<6hB?+yMjeB*tY}L`-X=pz(z(yAt7|jL*Yi)EKN!v}uO*Rm(~YKw-JR~`4op-F zv2(U?0JCk-Szcj zWsStRi>#}8yr85Gzp9kHk0@0<_UF7ukqCtiJ%wVg;Uu@#TH@ znTlOmV|hZ+od?)~xY!+I3hNyUC~hU&`s$T?J>tHhaQ@f%b(xTshH+p>SLATtJW230x^igLtU=mbCbuOqUq`k5;JkB@N<`V|tm;qp?`=RPk%a3^2(L z#*iiF!;3)HC1Dy}B1`mrweI#s4Ab)jy3)5SkDsD|NUe{Dt0mn3X+6?CKRM0K)S0z7u=CY!|XG~h&R%vxC)?S>ot_PMMKo1Js>54GBm|iw}n>Y zZ6PS{Hf-aTE5$DKKyV6lg9L0}H~0vkgVzw%CEE!gma?u^C%~A@l-#wqriw=C2Q2{I z$c81TN$YP>rG&J4@dg$u8%E4sm)ph6^`1^4X9jd8jp^bvJ=$bd3iF!YVXf&`Bk8Ao z?p5elD%p$zkGDrDC{K@C-pczTNfzR?T^}npUjMtdf1+sIiY$K6dwqnKf&7yOm`sNw z^R}~XOz{E*mKI}^D#vHy^g1G6%*LDQFXQxICbZ z>PYSu^J>S%1T09?vR8txgh-({ZxV~9Hosq!9ZQ@S%37I69Jk)=ahZtI<=Vz%}VJdA`-jXlseLg6Z zD(+aTtrSE7+|5ID*??vXP8nR!u$6`vp;dwANN_|DL^#G|3FF}%FK24EuuXGVZXn2U zu8kqcD#N%LLJgj9v}@m89ZZUC#n6*G_khX$4hiTL=eBswRp$wp6`brtU+D#~D8^rZ zyM0-o4^lKET^hrE+IrO)zxbrL9vI3{Y(k=wRIT2*vIVhpGj&+Xm7xsw_+b#}MYP`P zuW}lgNAF+BOswcZZ}m~L+G^99Ea8;&s{xP#oU{?`XO)e(=%x(fp*!_j+oNe?nbKpu z+(|Rx1G^C(A8t4h<@VBy4Z?W3cc~1cFI2^9-y`iOw_Au>mJ`{yAIN1IgsvPLP&D<* z4{14)DWTi0ucL|`y{vYHA=rQ+ zG6(?)FP@&YsjzL4=16H7l;17HD++r&#+fGNR_3B5P=Mu7E=(xTPHHqhOJ)xWb+eJG z|3KX%Wd<^&{AF&i5dK>lvb`@?>v345Pz_|3ovo1>Badf?etzh-<%yT{$_c~OgE}AE zcdG0dj%_`QZ4?hoJ;EY~YgmB@UnJ7S2_S+ z6Hh#=9Ai(hkS@ur2@saDT@>@=t`%BI?Ye+Ll&^kS_qTqMv{jD zDgq)4kdVgjh_JdjWtkr+hrXjn7JV;)0hxWLX70*4HL#U5`>#*E2#m**M3)bZ#@ogo zRR6kE%GlZvzO6R}6t3BQ$BE1Tv&~Px@O4iMMv)gQC1?{cs&7d5gO)Ak7&S5qq0^V^ zwFB5m`2~U#|9mgqPkSNl*QayL>ejD?D1M&_=|-sg96Zn!vW({^A)d-Pda-x}9$9sL zx8x`yhq*d=s3f)A>w~!;p;BsBTIvh*PL+{Ry{;-N?NfFS0stt>&vUIq2}3XIAdi9D0oHaE@@9mY5Feo8(DKU zaEI$o>+_v@%p?*^neS%8xBtkn1hn#_@TyHX zutG(e+cRMKnY*hExkSAQ7=Y(}WYC1x>0pd=wfF_S8gp<~|H9P7_co;hBRY1Lusm-9 z(EP$cw_A&WJQP4ocbi<636^k5M=B`CHg$C^|E@eX*(zuvF+ep_v|n+O|pAkn4YJMQPc;6s{cQt3gwVnpghm#_Y5Ht^0K?5k@kR&bAuCBs-t3 zBKF8GgDI*;Nb@r{8{PB-Tt=oSzDpMXYl`5)^jNlBAx&s!4aoW)LKC5sZR93&6q98n zchw4jyTf1hjxPfQ)Qu{W5|gZ$sA!5mI1EX3;bgxPUy6y?2r?y}*)1ltw>eQFLFMX4U8ta&-=1Ql_JEcu({rRc~xPQr)X3Dz}P0^bSDmbB?LumMUnljloj5f zYPlzo{JmOC*EGjIp1=J?O%~Xu#1u`$7ukBnm7s`69|j7y-_qLXpYun7@*X`B_`tmm zy@n~+nyIeA;hWRnltsi41kcuCW8uo_f|v}RDCswMp-acL^h{oQy_RKl)Pvd&mOOd? z*wa!Fw;dmgDtm6Fw;Y$tMP)FRwz@iPd zz_m4fB(!!@SVUB99GThk1W2d|HDzg-Bfcpfz;6-r+_mcsfY6-RG#9W4I5dOB1)rd& zvB_4ll%_r<_R}T%MCc@j_zQ&+qFaro5TSMu^}Im+19cC|NI$P{WU!}-bUl{vsyh+@ ze4hCU=(jk8gWXsnO%`y_X8a88gBZ}C_<#^t!`Lto%#L&=`1MS_Nn2J2orna=>SZ}w zN1Py=Jb6GCecDTKO5<$JYK z2U2;CT$<29CsY8&^cUl9@(MPxm85;zTB@FmbSKY?X>`oq_GIC(3)#+z3U>yQz zQ_4RPrVGr+=ER*2{;|e2{v=}6OAyvQm`MdvExgu{5Y0wxIzpoLRNx~zgDSrXgiURz znspB@;Bwx?Uh8~Pa#YMsPFd0@!Hfij65vIUYjlkyVTjUlJuMTDQjY)Ow5j3Tc$z;Z z`jOM7xZ=qBm=ED?gLP5=lk@sv6xbp8;Aw&7`s14G;I4>CAjSt@F16Q$ zl}`Vod4dRq4^R3gni5gl@Zs_T(W6-3y!|D;cmp==4#Oy|mv7T3d^auK11&DWc%+u> zPWq;ndQjSMe8yLu^iG@SPlmSTM%lZO-0-8u>;02nJk4JBCfT64g2Fm;u{E@CGEUs> zVcONMQR|V2!G&9uqrQ7h0pZyGjA9224XD@AL(x?4hQmCQ%_fS{xH8DwxfCYF0UYZmhWoFJ%2MDc(kk6SNnEOC5y-tN4 zB=xBtH$<2brLd{Xuj_K!AoNa8j=E8=oS6bC>uxrY?s)_-Lq>_p-AG4B;B5d^%oy>I zJZn(86e-iO4x%%U9Blx{)))s*a8#FPTOEM7q~beE5@RfL?6oQEb89iML6@eipF%hO zqm|R|_mWuJ21;ky1HN%sUF;xB3mXAUt5Po$%fIp_jLprA)F;GGxLAa8} zOQ51|j5A6h*xxyQQ%qt=-}Xur<&ps^grmFjF^eWGVg*$1Xs3EMivJ$g>cu6PSg%fk zP2IqgHqNFw6L7c=onD}>XPC8$3BYnG9||J$vzT39euZ)xO+}(wEO~j!x7XI#Z^`)P zmc~^G`8zwdm$KLMl4Giz)acqlwNo3dcx2dYtJ$z8ZL3a+l{3*s=j7ZOzzYdzldF>l zv$XfvxoZGItS>D>mX|=j=m4RwEHTyyA8ll z1hAG=Y;4CQesp3PXi@o6?W{ZD3c+~lm{O!e9lI7PX_a?T7D)~evvlh z;~wcFc6&wNvgD((hJTB7y|=Y`qI;W)Lw+_my#uHr_3Ai?P>JCp4|TO~ZzKzX&*VK7Nbtw8NuT4N*w3jPaGzu6K2ZvHkc~RsqDp4ImzT*rPfFb5E8hf%)M~I-J5rnYrNW785nv56a&2V?!Rn<}yA+4s`L{4l7;4#`aY2V^(Wymxa0(3q zBu~30tqJLKg^tDE;e9qEMF36UtQc0b^|kWI;V*gtb;-PYe0BE&B{WgX4hZeuvqMj} zT9}!3?-Nmi9-0)0cr+W>FR0=AmaXibtmir9CIZuENxdzn3Md8nzpjBl4f*M|4{VKf za!^N0aaB>O^aQtSeZS69zrqW4Z)#gY*S)g3y?RoURge_Jd7x(Tn&1%o!fkjw{_Er; zlm531({NR>@nBGfBp*&JuW}SiRAjU0Ot5%W1`GWDrHf=bh1h6;K(SHz)YoSqtPZmF z!FB6&M_ZKdZe3;yl{*D?Pk%+4e$(!&Ts6*Z6w}fJwD~EqW5aae<$P$_GVWb{=;-$!S724MB_vsaK<_6N`@-pYRo64O|44JY?8P9Z zb^Q0?HoUERe~T{@DVD4d?sWN&WlC3kiDsGT(jFm0T_XxO4xeQO>%PUE^KfyOLG9m1>)fw>;W^lY{Cx(j2LUn-Y5{=^AYU+XNBrl0iJ$x+U)z z{SI1uO?@=zKBw5w&;|P(I~3iEN6&=8x>7n9@LyG1=9g>yj1tyHvi)R4NYZxbl5`H_ zcY$W=@P;NHER?ZbpsmWsp154dh{&z>OSbre4ey?Z4!)_$F?x6}G61OT;h6pZaf>p_ zceLb9V}Y_Zu=pRSF~e)#vyU0Z!-A?=>$eTqUduz9rrD%tbfkS+1)c!)A3Qa{Xo~p_Xjcni|h9`Sq05l_+ ze{4H_EF0A7RZ%Z23^;H7H{JD^0Cn_tMvsa}6?y6b{oClH$Ms{~R{AT&w(il%4q;lv zX^a%j;^n$%7$RD-j*xkP#;j4z7AA=+LND7Pt-PhKqAW(fGH%d$d<w^NML;(6cKaqUUsnHR0K_jnG=P`me0HP5iMyBSq^8jKs~i!FGG^DQxC&v z@V=_$`4cVS*TsP_QCBSPenVdy$IzrfF9|<;UVNb880optD}nY0wEFu{%^8qaBTvwc}usW8o=^8F;>KIo#5-V9BL>ox4 zMjqF9Z;WMv9^nzWh;gX?O5c)aiZn7LulfFHn1-Wawtx*@rZ8@Az90R2lH%#!q zhxLvMy~AlkTJFg>DztZ90yTVdwRIB(2HuLCM$Wlfmg;pt+D;zVT`heM$&|HEto|<;rX1BwW4iZU_LCPP+Na-Ys z5FI|hm?>#BllLyaBVl|ko8)MDeib5VFuo%>>{+S?#F5 z60I~DVT_aS0jU^vajD(Jb)ixsM4sa3v@Q%MU!YZ0C=p|>=Ej_j=}0E2wB4(w%4gvnkpb5ginXCY7 zM{nH)37AfLKSU~;R;&qEmm8^9uBMR(E6`~iyOVGz<$yp5JGRCm2={IFx1$R=7nX~(yI0q zyPo*U(5M+i5b_`8MOrf&;a6LuTpzijrFnh|DbC##0YucSn~K%>R)PQxZIX?T1Qb+RxSt#WWEm=FTY8pW!4edc zy7%1H+hiaM!eg)ypgZjVnkX}6b~E1z@9RFp?_L?He+X-~BGfR|*Nd^Lh@^YI>kS3J z4dhOc?uwWJ*v{v817R8qt(pSR;@VPpQwj`+vR=$dzu4(lM5jLFgbnG5L*F+}YKV19 z=azvXnXAP}eC(M=fV`&>88R>M>g^eT0{4=pwJM%U*PmP&b9d0} z|4yOdUERboS7jNm-$M7g+A1D!09<46%wBU`KU$u(5Z(8Mu>6$4i9#{{YPXm^W*vq)@4b~9|{#tCIOFOv-tgpTRA z0klz*!-2&JVXf_SdYTlP6XkS=sKK>-&lP&c$Sey}nnpHK2~RtR5bR*AJ^Q`OX1Bh& z>k5O1K}Ml~>b$)ww1nTlQbV1o&u61emUV>^DeyG*2755iu+&!P5q9IL_R};q!A;Sd z-PA@gEUt~G=Eo8Q!00y6MT`#`J9fd)u|&dhY*p5mWl2QGU$W)WH&Y&_S>BZ0N{cW# zZ0=>Lc=g=$i70=%`@!jl1(=6vwRG_bon)cFBk%&K=@LL?IQ=IAibe9%R+KG{P^kai zRC-w>&-q>Z6Mg`sK+ay1mJI#h56F{d--H6uW+*@Oao)X?$->|Bj5dRS;9X-|K-b^c zEQ-AKy132qsp?~O%~4CMd$VozocT*VjA@XqEw7O@h^itHF`8;DTTe9vDnr{_mDK5JPkQ^|uHAXpeJ*U6g#2|*io|65n&wEMm)+}C+0$Z6)2B3$hmcb_0 z?vQ#_UYla08D=1g)IQ^xYz>7499a6(Ls=8ia_ckT`nu1JnDZF%$R?v8(XSzn+>sdM z!LaVM73SAgD;M%gagu4hbxCQGj!NKpFuf;);Ta@Zs!2Xw{-y)sKNZs~8(<#}Sus0I zy>a@khp1?mWPRGMM#cR6BvaHN@coaJq^W(ujL}|Y)&(OLl#_fxMdUVU8*JB6O>m@H zY-_l^{EtPN4}kKkze??=eI{A?BBZQVzs46hx&FB*W5cZ0Q)bcoyc$`HT=!4t%L>A# zXAM!Q2-Ge*di><}uNz!p$aNz#7=iVHdG-%5bZ8S7mJ<d-5L~a=rIwRT{or>Q+8YT0U?Bx;Bo74)6(aD&bd0Pa0^Ragh$=B zKx#9OG7Fs}XkCVLPnvP3Bbj;9pvDe@H)QtHj;fQ(7G_Avg$b99P`DBH`Dtl9>*s5j z0jf-1cVm=erFDOH7dVLNbbhV$3RzHqqe;Roa7`HW8Y>~_S5Ayy z1J72C+1_42fDT+h1YR=^NsoX_sj33~`8wrwndY!G!y-xhe9eOJKnaTcx74o`#peq( zB1OAKOHkMey+*mRNI%r%zo7H9RLSIkID-sr$VwP@oEoV(1TJh5fp(a*a-+6~{9R9@ zj#Il3!SgZ5wg?!7pmqi6O^D(Y#y-v`SJyYw%o+f~co1i>OU~Q^tGclZACJ<)Z?Z7g zs41!%F9oRp;Rz|_AdQW?)mvz7P5V3+K;UA2&CCixO;{J#&DMbm%e(v_ubGP_8?z>k*|p#q}DkDWo##yexO8ZviAG z{=5YHoSH^z-&3?|V_$ZJi?IonW?td(k=xftYG3JgVTWpiuUKLbcOa`3CQS`_Iqikp z=hNvwE05FNjABivNP^EvdPScW>=VEBxq(zalao z>4$pDNtr_KQUMSFg4{JaiHU@si~&Kk0wwG^>*lDN(|L06$&0+!AQ}izRxo7PZd4n| zY7eWa0Kp!gMI=KpRF8^t$FnU=$EfDzG-Pa|tPa#UoLV!&zM4S6a^1(}4T>8B&?V zgbF+VNT({@Qfr8b7xoF)c@y5mL&dPy43kyKYPWSR}mA z<3esyZ`5slU)HPWQFfR}_$BxK+`1}_&E;WL>Xxz^iU zk$7R-Yqu3(rpT<4SvU&N68X2tu`(5tKn`xc`eebj$HOdnXDpV+3U^eQ4Cj*$ta7x zy=Ha?@%xr^u-|G?qL>jJz482?%O|87bt@^X9u;C-5u0&QvI2sP`E*Inzxi8HRNqQ(g*#ypa=r?4gJDmh=%rjMf0F=sHIf7xrGAGooi$AX~czm zH%QKz_TRSR;woL^!@iwGUU^f`+7SQ>0M`|Od4wy zlOqzkTxWC5>xz?m2_jkkhJlt`a=mUK6bK^S&LY@TOgF= z+O+8jg>fqr7dMC|Dge(`w70!bbYE$;e;^Z7{R6@IxK$d)wl&c0&a~05UV2l`1G^N< z79or|?Rn;!M$el~SQ2oaQV9eul#%;aw2*i6ds95%BZj7`&*!=9rqi5}#ZtpSgCcG7 z@44;$eYL&riMr+eAa6;3A_^E#)+%7^`cm_>e~zK2@55TJ??2WO{l^NMuhjI`fCad(JUaQqw9oJt_2>g)D?Ft zT&Og^QBKxS?*H5c>R8Zm<OQye_KP8;u$kk=t`q!X{NfQwZC5` zdQY>IewmGR5_$_jnIFiy_zKQ5`n_^`@4jYjPTzN51H@N^#7w=?BvU(#S)J61N*OU7 zMWK4&wL~&b$4z2D4=i^{vO9lqNZ49bsTW2gL}V!H^`uk7cbA=hzS6H`o3yjS^}Y=C zC=Q86ixv@3ixES_WOrS}48;MN z`0ZTPJvoGJ4M4D1bbsL&vGhUC@bIdd(>Mo;2hDQe;EI3M19S2;EjWI|MMml-vE7Jk z{r6>sES&f~78t8?Usn{Ynw6pH15w0^_b&g1n#>=h{mkFv`wzQ0wY};c^_aiP$X4~A z<9WB9n674IKRo?cHAK}rslYGML#W3XZf<`@iAxTLON3KTxGH-ufg_!+eS8a|c~9%2 z?P*gdB$7=Z$qFd`JB9zcPJ4%vk#&@S6!&40y=Z8l)W+%xZ?WhO1zXv_^b>siA1FmB zIQT(=+k;AvjIgWLEpBN!fRZ1eK~%nHHFZ?bR2O+1#(-jp*s=r& zK+nyy5w#h)dHZ5n%b>Ex_4c-QB`oRNkuZ2c8AiTeUCxWmZ2F z{zwSC5eHQ}g5fGwR*iw~Qx_^PO=9;}@*H|_JaT|SdbDq~q;UXNT_MlJfgG$YFo-D4 z?_6#7%5!;>5>l;9&4DS^Lnv(^DgaESa2o#deBbDW=MDZzxIxFfwDm{-mB26r4t@o;@%QRElA%4*@;lbFI?q+^Id**IDm_$u&#H(0*Cu4 zAI=(A=LHMZ6~1Qtoaa-yeTAqpLH5RKYr96C(kB<}yA(8K)S%WT!jY1A>x`YG@~2|= zF56=7X$1visQuBL zQ!52ktnc+d8kn5>v(#a~g43!YtPON#U>hA(U9G|n@8*NKWCo1@P-;sXa{ zHCE+mKIkG=xi>U9p?HN`!-0_sP#U4V@M@dM%9B2Cxq1?vzAS&TpPPL!^>Z>+V&&hx z{erF@oLKmTDa(f_E3xNqoi6CfDo}n$4ekSvG~LrE@q6BHRv;nL&Fn{dk^QI2W=TKg zmjNjKw-L)p5IFO^H}$F;B~<&_HbC&cx;!=MiNtISQz}8B8|N4e*!Mm3CD|H{&=L~BhB4?#NqY&VGDP@`<&0Hf7yhT5^zYHJ5|ODV>E zr{P^w*~@X4^pB=ww0cr<(=Fu2JS->Q_8?gvotX_eAja_z7yLT0ueZLmS?qlHWEY$_ za)!me>S*ru`AkPYTD=t0yf?&CdEi>QmhpWVB3n;TC+_EJ4##BQyUbke@9OT0Qt^js zei=x5OqWzBPD%mwzc_u;jW8z5+KTHWaKrEV{yXe@qyuwR)0(&HWyLp_|E`I}pm7_t zygG0sxzHM=zsuHw+|$rnar7v6Kjte+AmjBfqgTBnrJnQ>I!pI@Mmb#&;XHqOMP6t` z2Dq-Sh_?beS&K;<-Ety1iSGwMMi`IYh0|5T`oyDXP-t3|~$`t2SZ6_t$HVjC7?^c6MHm72&+tLf? zjwLLoi9zs78(n+)4Y>dmiWYjS25AA*&$#c1J)&Hu)>+04xs5bvmeCdt;04c|8;9_& ze4S^78zpS3jRgeeHTnU2udzzNj8Fl&veVoerPh^U>}dq4l!~M5S;(*9WjB=Lmt6bw)l5$|5WCvVPe_bW3|X3)Ru{zYUL4o%lwXP*OByxHe-!jX;$bXT{9VUb6;P( zf_3r>so%c+TPIx$tqS|F$tweYhvQO9n*Q!|{qri5#SJu6%T|Qh7)hxnHF@hXXl07r z#j(d!b>6&hTEypM*mtGZ)da9njofvt)QS@6fh)aRFRq3_dug3pBbM3Zt@M;%ja8ZE zCx&w{!Xaj=*T%Bw{%(`|b;GN) z&KseMJg6a0&S?+Cxbj6&j#bj443n<2S7??gKw3GnL?r=xwVYX_3E3$ET2HyzENw-7 zWdh#SP_wpvaxned`t&aCDDA3Vi+Q59RQpxy{{?m?YtuJ(c$Z$szjQ=BedMeAH!|NR z(@0<4f2)R_>45Xn(0^c?7Ci=F9GJQ7npCF?@zv?S%~w(I?Q$*|+Jc)pa%!VWg_Aex z#eku6)R|IR6H@cn1w%>Co?aF9%ndH%IchvzJ4$ceAhg981!z<|Zc@4JWp@YdY%1V` z%JaiiUsTvHCz@nsY9^YwR<8ZLE1K}3U5T!0H8X^5BMT3#eE?`p16k{m`+o2k64w>a zx83;3;2d@kpetU}qFCu$`#76pr@BL^qCrvKA=(YH*x5+53qC@WKC9PFfJ{aMwPB?gg~CZ4OIve20!u0g}E9ax{wqO+Lmg>nYmMXX4R z{I>z>NT4B*6AZTe<>~cw;ofPHj1qaPRo1)kwpyCZ#QdzvzrFm5+veXE)GyntPH355 zpI7kxqoPQ8{Lf~|(=6rqoo%(o2X3l~y6>GnXdC}tmU%oneWpqh8pNVuIEj8e5QkwD zpPc?1xthq;s=L390FMYg0Qe50&Fh1ds!KGm8rc5z?$A^Z0Bl3l$@d3-4LM1 z)5VOSo32u+wg4|lwk+n+d4M0d^So*5N}2l|7S~9GUtjNzl{6ru1?1qo_G={R9PRVo zIx#|;S~#M7!ltQxM8twrx|@4XjK*FPX;%+g+1??t{gUkGMUnkm{v!B=EFPQVT?0M^ zi=AP3pVSoZ=~izDvF7UiQ=)AmY|NOY&yV(*^ zEecuGm{3?VM>jIuH65GkO-tM3dgLn3S(5dQ(`%k!uSp`F9_!5(Wzp>;J?$*Iw)T7K z?$hUsx3&!q44G;>zTmeOb-UxAd_$M@#buKQASjV%BNlz!ledNrLs6$`kSQ>F6fq6> z**M0sYZ+Bb8Ay&*pmYF@5~i`VYY>E%7Hy3fCz~F*R)(SW3BAUFT$>Rm zI9tS2AZuvA>_p;Vn-LPMYz4Xk7 z-mkBwm)`MJUDFJIlxCR8t*bWu06 ztocc`yqalN9u9I~*Z_K>HDhlaz>mu8m9#H60!Cb8R8?X((yo$P;oQTKXX@bSFY70^ z-drH%KhU^Bm7~tkOKR~5J{?nuUENS@YW#E;THA;{NtGWcvPCXa<1c#^2Od9Zkan(8x7$!aWJ0>xE~#)zu(x!5Hb_kV4$Z zsbLy*1DwZG80t%C(Hz}(2+>?Mhe$*){9HmK*#vskg2}3fqDIRso>{{$p$}116yK#o zN5kjb*NwXhFh(S^$seY}_sp=N80>GV0sV`*i*31qrT>f7@+ButAItu3w1PP^#2K4@ zq_j^wXPlvHk9J|Z=^}If3!Ykj&eLV!r-eOf-scN6*N^Z2F%KfPoLqP6##thQzS`c*jciR6MZ+9d zgr3J`T211pl*o?-S0^q01-03I3(%I?*0T{}<2*vo^N4ZYgy_^|bA{LULwd-MnY-O{ zZ4TLu>NuxUuc}3{icB#$-U6`vswuU0bsFcY$!33VaXYOV_1x0vE=~^fq&3@TBJRo( zT!OIhi%4_i1O>mCuvchl+{pne`%n=o|E9>-hIJy8?f$)$BRf~w?r(qFM)^qZ4q>1* zentC=t@3*}X7a}UZ>3u-(%(M)+35#sZdudIH}}8Dlrj>8YD>KZWX{{5tc&=-(#{^Z z?DMq%Q1FR#KLa@O34EvOLHUdK^#Rls6&h6=!$d%mi7A+r#FepHBu0kZW$ZxN!MdwV zl*-~&frm2*RFvoWs2*2YMQ!p-0BF*PwHlBNrap7MhB#=(OuEh_cZa|HGBlxY z7`N)k%oNYgz?*|1=QhKfb1)&OPaMu^nngWyMq z7Y21SnMXl1gDtE+r}hf$RO)VK6s@Yv0&^0euzzRmaPd`rY@`L{d%VIO7*Zj$xB(Vo z_ShjMK`4SPieWT0W)n!o$G~NK?xxY`L9mgoE@WZRDI}Z zL{z$zoy2+Zj=PS^VmhOWdw9^su^N7$CBu`p#-b%^gjtC|w;T~NRJT*GycWAKwVGb1 z9^G4Tm1jZwr`8fFkpYu7MKhbJMWe-U2@M+&OCgInxzDRU`W(L%?r)-LSy7 z88e{6=1DSi{pkN{IS4B&X;T?{(hCi|vHQA)pmp&{wY4t^$fIt`> zMBxuDB!t8wkm9mTl8wBytkV6=M}$HLP{Y3ro74oCB*aI027=gd=%k?IJr#h?5`PT=N$ zDZR)jyNWkT<{eS8pEvv#lQ@HbG5nNn^zaCzR72#zJ?Z_7`^{7(uDkXgpFoAD?HKB6 z2hht~eehnN+~HkbKtsm3kEZ<0^{2OY2*~f~U z$^DjW@vEo5;0EkU-CUd9>-u(q-x91vTJ(3TH_7Fr``^TP9@@~;(bZ}YHG4|D-p8EN zC6-lxjn|ySA0j+Dp1(t~5B}xq{C`xD=dG+WMf;`@XJyG_+y~!K#z-nG?|n8v;@|Ed zEl@!PY(&f+!=}fnAmkasCPCUlwl!qD`Z#3p_QWpWyuM028Jl(UQXS*$h!ad3RYkMv zR8$15T(T*$2KjldknV65J&nSs`isY*dkhE?Z3!@9;y`fC!hzg6z3ESX0i}AH(zQHz ze(q?NhusHk%qjS?)B`%J$E37!_O!l{r-f=54~O*OMg|HE^hHOL(C7-3a(cp zv`1D4wTf%6??1V(Z*g(4Ji%*S;+fNr$eqA@u_kgW9>u3gC3rT{R#jO9D=zchVJk+J zzbJ6UOSREHWqIg_VsmNPUcJb0|3w`-hg3)SFymGta;I6Pl%v9Z4-OJ3VP%Amp`Qo# z0>rgJWAKtg5AMVSo17-1@Aq>xR7*WNZ{TiEC75Bbj2ezqGU;8i8Qjfy=;>U6pP|DQ zC@&mv4wY4*Yv<+&ftuS5n4ErME<(*}ue(NP44dphFt1IfP@_%Fl#G`q9Yg}-CfAmR z#$^rqN*6&o$TVVW%o2jja^I~r(7XD^g~)d^e#`5w8J?!(>IV$dYuS3E2OTvi&loM6wH^6b9&VITYa+N*ieI z+_>^o#};gR?zNJ6q|(9>{D}+Nv|GFT9Pn`g&2)0tw}4Hc7_PFiR+BpUXUV1GTA!!XCA?xB1`?rs)^Kl zx9@7##Chv;S}VZUfPnK35j@$60I48nU{}UX%dNR2HH}pD2ZGMBn^S&YJu!0qPb3Y@czZ zmR##KmHuSC{`kuMYr%hk2*L&?z8pB4Ukeg({y38IbKR^%7p`r!Ln%vw0B}M;t!A&A zxsVR|F!+Jo)vi1(%r4vaQ8VnZua1K6)F@}SHzFVaSU%k!VuFFxpj+;qHe2q5hP>Rx zRRXcL3c+&OCaTqLKR2^&8J+j8oivMi!W}=o0%|P!pToCY$5|9>Z7w_oJ!%DU`pX&| z5-VUJ*>po2msk3^JxwjuC4kZ{HxChJ57T$)@?VE>aj5H3k!|x0Ow$Z%M5}BjwaGJW zN+P~ktvflIHK_+>b#$%uPzve0BY<nhx*|Q zlFrFW3aLl(NO3C|9^8OM`$eFk?9c*bMLa>d|EJIpV&A=lwiaeXGshZ&Zf2@mUPG6a zNAxZ+A&rbm43efVK=QO{uO4qQpPPJRZ2+9tL{0S!YBpz@oi!j_46v+Gd1>S|rgUs0d&Wx~$jp3bC=L{%MX5M%LcK0faR#cp%#KNS(F%9c;2FIq%488w2y}j($R-)ax5r>h!tmEitc-gn+uD3npR4abpH0f>2P{Vk;h$pOM(2G zawD^GD#(Q5{F*qry5w^6pcCL+WQqpf){--Ay5c*RxI1c1<%4gxU)wgglwP(+>A-(# z01vI7ZjU?cw$VvTya;6-2tZLZsg_?riuMwi=%BS`TZCTX=$2!o3F-Zl%IQ^yNDrSt zNFcF>vwMpEHAsk?kX7mYb;k(5rp@A+pH_T+T_O4SgiM*a2VXB_TxkukZ9YWp0F#Y9<%(KfVzJHu?_AEk_goQX=~1!d@=yo%{B4149$fIIFZ8R>LLP4`N+E( zdw~w;#Q5c?T8l_pEfl5n98$O}-)n$2GCykBbG|!PKTZn>rg9Mk!Cj;K!te-rGhK>~ z*mi`u9w5sHTjG}Cc$n_>Pxg^7wD1E}c+LHu*Igj{Q`cLt$uIcUSSOfZsUDd!k39N;(|Dc zd#5*gs^A-I;dhvZhYa(zY=t$_&@f616?%GoO@CPx5$dPXd67_gU#>Sx;p`2~M6^!T z3XB+J@V0;jz`Wgg!GH&Dy<+v;Jz+j(h^irNXY7{IViF}i(kNznB%rf|m$eB!Ng z59|XDxrLwsz*St*ah-W;e@9-+&5j&3cTM~9bOM{4{e+zS9J;3lgJUeevz(uI5W{fh z6ugQ0LbjKzc!qDP$$ZxMK-2UX<$^A}dW3!6b$~s0Yl@rLVDJ{uKduJ6=Zi ze^vAUj_eh~y9K9h_RiV%12wddq0EmgaS`=cz5rz6L4Uo(RH#K+OUb+gyWXnxd{2;G?Zw^TUg+;Wcn{;R+E*nwY9=LdYX zsNqQe+i?s@`*3Bas)kyf0|u&NM0154x}-0|s}6!`HY5p4*5diQ9cG+~@S14a9vDNN<nYg9yM z2qFoqqag`gY8HZyncc+gGwvk(s#HPC@96%gqmP;PP@tQ3#uIB1TNd2JlrtcJ!B@k$IH5P-#__6}FCqqQ-yEQz~nq;U| zvnPB6W&Sj6DlC5LD4{(9h@=sfNfs=HTGWK6LLYhl!$S$LY0c6a29k`cmb;F;Lx#1& zgg}%3c01Y)w(GKuz3i$-JEAgOrA^xUuJdXNLq2L{d=^FNLsdbV32VtV_8j^uryU;K zR`oHk#AZ7lkD!wy!mNh2n1s?1WrQ+*ji*VQd2iAd$fN1COpidP)6{Zo8BXnDb7Gi+ zt|F9gITVw+dI|3QFrg8$%bLvIz&(#9Qd?E^U|E>r=n&3|fW(Hy-uZU6poR3VSpc^$ z+JylxpODMPjdmvfl&?4kNyH2AM$R?AMHLwj%F0uqt5flgm-NxSxYa^FCJ=u`OYFUF z_C597HL{rap?lRC6Uf*C?f}>Ep#~Vqg|Tw~_`bfIm6-wQsE&(ZE8(?pI8zhvY3AM$ z12M$AhC$@Q3YT(46A{|H6(le=gIh*!+*~cy6FC;Zytj(~a9yd(d;$3P!p*B^|njfHsFH&@^VDcyEP~i^`zRz}%O%Co^Wz z`ayrU<|71yVk(mIwte4+0@Ax!Q}bwPO+{D;$^&@@1+i;+pamj$wIu~P>sXwwLfcve zD6Gig>5Bsa5(BRG^K5E;^yNtw7Z%p=8X7<{>nchODk!Y%UMbl&a&G0Rm6+=i>9Mh= zidwu~MJ-N?QO~2$&YXaE_{COXLe(laP?l}wxoxo9k(P>kwmxlaooJw@dO;U zgeEjA2^Zv+Mq}=KQ2?$)$gBR9s-?xZS`vu2c(&#teg!>!&pizm7GVGJ82EuF`e7#- zAxwG)0XK>WMk0_`>Wk~5$$EV6cAp+=U8w#znNAuB{UOCNLQ{V%V3;n(T8!U> zJz>7&y5=nKWOhE^k<(Hrp%)UmQtj7;KnGo*G#7|;4UJ&-1t5C_98d(9*H{i z<`8y{1%2eV@Ng~NQ@GYrMFw+`W($6J z(AmV2z-V3II<<(Y8kz*P-b@I^M!Ht?7Z=^0EkmVQh!R*=%Wf+=1_vsJ0Vj&`5<_5Z zW3|zl-6%lK4|+KZbmK`AL~`jYu)#5^Oo?4b$pMb)FtH1!$>e?woi;k5Y81O0>&GoY z@Et>jVBER|6xrK@anI);CF_++qQ_#cj>{Td8Kg^8%7+ZRiM>nlWI7GD=D77PjFnN< z7HS(~Kjd5yX!Jq%Gsj^g1 zej{kpD~R&pN#$RKx|<$#85@5d_Y`bg~t+unXF(ZfedCZdqi}Cz#bsD&m<92oZo57K6WW zXVuo#ke9q&qMP=aI0-HJ5_OthZ%C~NvAE_}xYEjiyhN+31qK#%Uk3h( zvLt)Mh-JWaikBzBEi0 zy2?bPO?IC_7nJjyXZam`@2%!IT2B%MRvQa75l|lcV=wv)#8>qlViOuk4Os4pB5w$q zO9DP~J@?gsL;8hGnB&*&3VuOfTul4;STXzU{?_6e@0VFVQ2YKpdw}oapR%Q;C|%OG zF4Ukcb=Prm*ta`^GdE-+K%Y-029XIeJIa}`;pOaNA61MnB?ebZpW!rC!~!im1iuna zkYcd=%afTLRyPCvFzf#Jz7S`2U z7+Bbp`wn3UgS*otMUjU;NHWm9DnY_;e8?`M;j{d@A&`F;bhE}e>AUsLbvVpDY+8{F zas0}_I69G`Wc!3XWh2>L!p&Zv0m<{!`a}l3QlP#kP^=-M9P^P1F?GwA+B8jnb>hnt z&F2Qvnqw*U;Bo2FP)<31Rsk;T6j)h(ef#UxsrUuucyRiD0%gYNw@&|KS*n8tx*UIu z4^h^h`T1CKn6`mud0wrf8M=`rU86O>eR^FWwgmRZKlaSy;m7UC zW!wG?<+gjES+#$n7*_m#c{=7--8FGw^PSq{39}1N0^nmdA!*7uhXCcUFcbQ_rLtyO z%gKV`FS8_fRI?m$54^>>7@_NnOxx^X_kCx*G!*dL7dah6?^cSg?xB>%`4D_})(lev zG{=#}5I#Zya7s2}cAktg5Cq~q=;Yd;4A|B1d6MxD2~M=HR$g_-A-aU9fGt}c9u z_OcD2OpsA>O{U#VKx)XLAR-qyNk-pYXOEZ+xl?L_P+i$M5MqM3y5ZP&M#{UhV2Zk<4ZT@gnwmZ$ILEoMsQ7!$hK#V0i>RxmLZ z<$|c~wP@6KT5O8)bGy zT9yG*W=V>e3FAD;2wjU|YGRrBLKfRu{57-t8Q}anZHTDAM%wD*OeTda&n(2ek7C7o zq=?@yM?X0<`B5LZ3DL)HcwsiHP?OwYoqK=sksZu#R*V0?itO4d@T#T{@CMiSfBE!N zp{$6v(f4(o)o|2RPFp27VWw4Z6E-{<;2-3rQMJ4NR8=ac;4EQG(H}iND!^+Bah}Fi zq!yl_X?~=CZJ@fyfGLBKtk1~eix=w^*0_a^0(#tTu{iP+kxRC|Zbh0#Zmy0wTSpwY z*92k4&7(hF|6r0$wG?&rZfL%vXm*w#sp8U9ZZ&OcmJ(Z-HId_M=%x#nZhtttOJ7__ zdyOq>7@Oa-w5ev~EJAD-gJ4#=iG$dnPsMq-1BX&BHKGisyF;a1uX3QQQ%_(L}=xh8JgS_Du5fR0NI1u~29KkEaKj`DlHAmj8j|G(n4 z5(rjG5z_~p@O!#tYT(DROr27-U2lGuN&NiD=~=;6cLw22?CfIYGFixqrs`yYw^~Ku zy(p@ma^^=9lywA%PASI&Ub>z=h1yHHd0R|UxKeyza%xP`FfLc@Az-6l;psRie$?yc z8j{cTC|cfbBW#Lz5U7*VJlwcgd6^JZZkXBSBBnk@9 zsGc4Q|t~}9n!XhOp%NfZKpXix)TxM+aLq!V2MC>YqiBpar zRg`EUmE|_Qowt#-;dk!wXBi+UD-t-&IPrOO3?u34saSz(22c;Wj5;RRaH~*E#bn5> zBfSY+S1~Rc z$rxZkU5ti#Q>sTqpAJWfvBieUcHn?(xCmSqMhhR=JLH4hH<~ofRL0mZa_ympalckr zL2A88eIFH%$5CX;k(b>2wMZ@)j{41La+R9K0)@YwrNq$orc0YdnGigER3#;u>5^3gOfEl@3`S_dW4N`n zL2!BO7;;J3ExpR?Q8?Q<;u_$4S{q%Tqi^A&VH9^EUo(-UyN!8AUxEEWtjS>IL1e7H zuB?cH%n%>-ZsTasB?lF2a{0J4*2iE5ExV`KHR0bQWZH_AFyrS1_>B|2^3Ss4(?Tdb zVDsLAkWx$3_KAF}FoS@eD3h-KEGR?yf&)ikrI^D-7C{;n=lV^rypYqYfyp0$3Vsj# zpzTKp{$>L!@f76a2|SX*MM$s-wUnwqWhgwhsoK(WiR>O98V~lM@K#cJ>#Sxk7_?>X zlocDVcnZ@y#Am+o{E5A72P1W89MPY2xk zWMfFtf$dS865;>H+MD-Uwq@B}4?CTv++x7CvTO_((@21jc>nMRpXYp!L>34kB#eaQ z_yS0{DVKynb{S)1%a$qRzNxIttgP(&%*yxjH4!i3#%27*m}9NA&%H0J3LGcS-FvTQ z_H(Ye)?Rxb+oI2FTqi&2Q?7DltDZn8p~n!%0M5SfK8vtRiL$)y)mZxu=(O1gq^i>m zN&zq}F=0I(vDkv&;sjo={I-oS%wJ_If>U`^fE8=YH_&LY?Z*2BBXT`yn;FTV+7hiD zKos9z_joPKU5$i;;7Gqrl*N=TG4MUg|LFD&ulzk~<)PFfT&q81G*25#+gxlaM_lA5 zZ%C2)B1xhbZ+(Ue+smWg6Q>s?iI+bs5ARNc|4olJ^H@`e&4@3oZ(ekvWW)mX4J(i8 zA#_~=;BMyQqt{4j1vdYg6CWU=+Ka9pUg!r(y9ry+KCW(6`iBx8fn$gQ5t~~Ju^Y=Y z@j;DAFRrhQCY9QE$Qro;%@@IM&N5~4&<~aQv8W$=jg%1cZP7Jj;8p;x<&6?nmgN$_ zbMMV8Tr*%>gSySEi01p;<=Da9ZBwENOR?ru$9(Ks7V(6iaq_Idq%9*c;KJ>`g<2RO zZ*7gc$K#C~lRewTgpod%7ufMO+?jII+lJ|OVP=+J!K6>*H^wVd>e-g7#JN-FvHaDs z&LnX+WQgSRoA%@}kENyMeIGVo} z>=*?0Ed=VNbSs$i_|`E3@21yehVsoCp$5tbOb_{)2SKwm8wr8V9i<)W1NxbF=Q$Tc z`7$yuqLMWH#_h8PNjZb`KfN&@`m?a92g$Rv`d8W0XdfD=iz73wH`mXH@?lmz#C2G) zhpor9aCYbIgr5m?0nkVLv$*ze4y+2%IGox%NYcZMO-&8osOWQQL8AaO9le_8!iCwE zo~VSvW`NDIUL;4KP`{N#S>D+&oKheki(cVqt?{WwH)&XQ$=fjUNXbiH)j7Wj1BLxU z14E?O{3ZqrO?#p_XwG01>phJib^=|oWd|!^3KPUvta*X~s}tk%cretQ>koEYV{P!K zZ?GXdW)c}J>mjk?a zi&UKFTt^#LxI&C?-w5=3j&1C`BLp#3`4>>=V@o!} zE)c3pebUtTWdp%rz|gMAmdDmt4}kN{(15YnjhhsYPfN@a)`xxp4)=u#KRnI$pwNQ? zn)iAA*-V&&=&CcE-RR`5=h5S*{cTK0ecTv*y=CILT_a_&P=fbv=df>2yK;Dnx1y}er6pw5;>3^XX(Acp94?BYOm9Tdo^QysGPr;ZwQX=lodiWS zxDI4;EQsJUcX)Pc2RKC{@uZ)p)7xN~puF+4N{UR6@Oz|50=GBm-Dh9`92*GBz6a)X z$5gzhH`M`GKp4eHM3htLR_<43mi0fX^u60(@si0y-yE494_-J+ckm>cj?W?!bR(?b5t!_GbvB!_su|kCaMwua2*AYex3qhXK z?O{IQ1JbW{NZ0coy!i>lyNTFkED)fY2`@}uU@KocOyPFoHrI{xe$ermSAq`Ng zm`lj5t2i4ON!I;a7rCtYPk5XTz!|R7?DV<&uo{5*!FT%cDYEp2QofV6j}p|Bw%7^H zx~A(jB;Xi~fa`2W30g0Ur+an)RQ#6TMhet>H9|n~)){3`B`joEmz{RxI zk;L?4-*`LaA~B#G0$)7xdqCfoDg6(k`KPyE8Xub5IBNW`RVifB6e#iZ2sW_R?px~c zFgdpoLBQJ=Ot$)Qg|FVe_;-9v74_H4z*;%gglsva4GeZ3U+l-;N?H;$sCYEq1LmAY z(x97UDR|A=mNNC*6*`tt`sllK1{S9Hp$G17z0q>>%k{X<_w?Yv#E#QSbMMS7L~)EZ ze4kH_(v`n)jC~EMXIV@lgmSy*vb~0H` zgW-g}-`Xp|M!Vh854%T%4R0vUqofH2O$cx8K4!kOsXyab*raW?(Rp|o=?G$26Pi-O1tF=f2Vu3k|T8-6&V4@hhyg@QQ!7X zf`Te%G*v&*;V#klk8b?#UadQ#X*>zmS887MZ|o;UCb|1bfzFI7%>MLtF0$@%EZx6y zW8wL~7ds#6*OJ)&#{0UosmIf}0b-WlY6&KpP;WjT4A0aGoXO+i&kt+DyVD_F;_2IZRp_!He6%xf02ZP!2g^q@UCs2&`rRW^jadHgRHNwncJq@{ey zRKA4JbBtm|xXUS2-bJ5T3o9*W+^Uxz5B5Cdam~ZH z4l9s(ESg>%5ylR?3Wk;W$N4K(+5cP3GEO(y@#b{*J@D8G#R+if>0D;}AtFxjJXhsH zL?;+)7(|xq{?HjUp7Z9AP&4fjT$|+J!9`oY!y7#B`bL5K`p{3iM3zZ{lh4u#(vZx$ zoflQp<44;4>e(+qSmW)od88i)*d)-ZWa_xA0W8ZmXdbuzK!Y+>6TWTU0R~A4NdKK$ zyu5u;0m*kDSjSdS`nj7L9E1ASa0)ySjABNB_a*kGwixNp>iTWO!!TW46(|?WS6Eu{8TSg^QGU;VVZ#>fz-7{+qM*v zxBnNKd^UuvbrrDB=jsg7p*|fVlh=f#8CwzO5s|BN>=tzCpB^*1bI}(l6f`MIQ>HW) z+9j>@i0?H=0{HgY<0WLv35+g$4y~bcH5mGI?e5r+KcBY$2ld!$4IztET$}P8-iWJ; z3DcMcjk7wrq&)Bl5z(%=p+NnrJtt3b*~m4@3`jcKfOTmo6ae59`FVcU&0Kus;s8uF zAZGCm21qx8crqsy{z$PQq2(ZSzyShY?$&mq&>bd4rSMoi6VG9JDN`>lQr*R>&ifg{ z;RPk8ZU3z({zOTfh*W?YzmBz(b2LGh{3oEUG)Z)JETeiG>l$T7IfAShL>o1d&kRIC zp3^*=rDmOxZJb!cGcz@nR$rNN=QY%TG{K=+r)fu9B8>je?=k9Zf3T5mvWdNTj8%i3 z8Gmj!_gO9t1RqYSnnM4uHSe7MM9)6FRTi~$BQh#jo2$Fad5zycvprZ$D(925ZFXTL ztjFQQegiI&67f8@8iF_XwAiq&OCsP5-fD%`!OvN* z(xzrD%&DaKOwrER+U^DMHtPjN3p)B zHydg+$E3S=f> zS6Hcn1h+@*ZPs;w7`I^X-)%WX1{0`^AigFxV(HBb>Gag;0dTQ^Q*v*(xl{57V;aXP zUOxWYM?I(hgwLGQaILcfYrFkbq~Uf8vTh22*JziPls970R_BJ^emzdeu(aC#GB^xh z4YD$IPk7AsCW;9jAVXmO4(J1I;`K=mWacgl^!d|0FS)SFRP~`ZIMT>B=C<<7$U8I9 z`>!RA2R%A!%kfirfF0Pw%zlvuFlU;a5?-KB9)~hnaXgcik+V{?qr}D zT9BT;xcJ;vISGVXau*iIGQ-WJgJp%T5SkNW)?MT^T)=PY(8fG$=3ay9k{bz|e0tXP z+{(!kt4=?9_p4q_1Y#8H5U|Y*u2mE}tS_F!QtfK1s$z@5?73VFa@kmp0UO z^ec73EEtjG>I+yEN4DXR>kH!m00&>rM-T&S%f0ny+aTS$EGIK=NPFLUU2@PCMCVE~ z)(PXz1h=@0=U~k2kCkbC#^cbW;V*Q%jTsOt*or>P$=sUW)iZkmn7aMx$G5kCq7{*~ z?a^(ggEc4VcVYqEz<#e4z5H~S$CzeHu^oOuJrB)gc9UJS-* zE19LAvGmam&Gf%!k|n0RdhU?`2qt~_lOGzIt0~V_w7RF=qT=78#-GACE?+!q9mC~% zvW}hDq(=E=q0{1XzDE*Bw#V3v4R6w+S0d1f%C2!HVD3Wu_$4q7Cs*CX5iACh;Drz$ zr*QlmAFKXXsAyh%Clgivre4D!NJ`Q$5=>=0$A zna4#NNaCN9&O)zX&5{JMYaV0`bTFKBR{A||Eg-mQ+Yqpvw3Zmh41OYP`T)y$6}0eQ z9|$>bHt#He)|q9A*~>~wY2xT-1q8?Jy((7>h~T9Zno3uUFQLTTQV?Rn!4M!3pArX$ zIS{ZdDSCyw`#kZ0{fx$ecE$tXoZO6*ttqG&Ytc0!um0zes6?ha(+BR;t-=0LKL={Kb3mf^``(!SBc(*2_;-(9 z39wBlyJDh=XlNyk6q+6>7oPvWZAhxLPQ$>IDDUD)gcc$auPB*)*pmg}%M~mwcV;M7 zMum|BVsUp*V05O>s#$R{nwu1_!Ls`e)I2(Og#gre&rluNq}}Ec+U(Qr6`tswaqU_I zVYKM6x!!ISxF;sspV$b?Xjo#}3wTJRoqF6rOH_}bZ!1VxLEUDxSKIQgkKW9QP%YfW zgrF?Z0sS11xNe{qMvG@((=meB(*|!C6nlHqg>s``;RT=W>@33P0SD^I-J=vR!dv<5 zkunc<2@i~^`v2j)NB`~Zb9(fQ&um&!ojb8mvdJw8?q@np_glc(Y zwO)JyB{OsODE8v~X@$tLK?`grBjoR<5=SCj%V)IN7WyBfd zV&R*(Dik77sH5-_E&}w2L4D%IRrQck6TeF+?rqS~c0u%;GFAvW#_t0W#P%jp2+v=T zngt6Y-f2Ntmq@rI-Jf^C8LsN?*RoSII)`3;cQjx5VNeh~k9hBy0OS73@}Pi?=YTP} zK63R`kPf|RI=?XHW|!XyFq{F$Vf4BNm#PDGla}>HEB$f z;}qp7-YFN%+R~M=B7u2Gu!zF_q(t$aw1ezyeZdxO7Dq}%ZKjdu3jaMbJ6i*1;PUz$ z=+pC@f~qX&fyeG|6BkM&=EWZE?}*gT>-)}&f1p6LpNh2#qs9E?Cgwr%OmJ2U%&5DHU5Eb-|hJjP8iEYt1h)H$iQZt3qMFRbs%RT`x(pU`x ziHjpXBL7&`>&Kr@WB15u?KpgnF1;q*->09aL_SdLk+>b8VA1;shM{si;T`V6QeqT_ zYt2X1RZfpP5~TUQjwRDBW$E!-ONmAx5V}=0);i)k!H%O}CqA&J2}^ZG%o^b1Uv=|8Bm_T`bXwB{~9I#nsVl6d~Gn8$i>~!T=Er??5!x5ce=xWb#5iKS^ zeT+H`);_^-)neknjKj!q%L05^``@`02##@pCcqql#tB+TMZafRS?}?4W3_6-2eM7N z&O3!U7l~9$BD6*q^|`Jb1gGEVTgV5@&=k{vl_IG_ess&86?I{eh?OD{BovTVcHU70 z`u4=1zpuTJM3ZD@$2RHl*FQQ$aM1tt5y+X_P{w~j&}TLl>C`WoNe3$E{`RrpQojGH z3hIu5GLVdO*O><48lA<2CdT&;kgRWzVd;Ai4-`yd#MdRRp`v%)#z3Ifk8@ES-gP2* z-hPr79e81g7s&oZ-`DT{PtyNQv-*ZH8}Z3T>=qnZCS6a>joQ<3G!UrU+VD6{rQ z&3V3ZB6lefd7%FkhTAQevxFd_698h7p(hX;?K*JQ5%&?^Kv^C+KWH)CQE%a%%SyD) zcQ0lTMrd0cU0*+^o(<=r(hhMA)@$N2tlr-T2+4pkST0R!*ny>SgvywTBNYm}9RSh` zR(MjKUzMc|;M|$KpfZ!2kTdK>2iVp=EZ+_xrUnEWN@e8VfhjuWHYx{`MrwQ6Mh_xyes?r z*)T?ug$ME33Z*k&zdbE;x$Deytdxn z9e4xD0$Bz)8pya__+&3r0b3K@;jw&g_oQU+AfS0=bWM>aBU;%I*J}a40>su-?#!wF z3P`@Sj6p#cm5v`RNO%u5`FoN;hglOxVACIHoFagGjJEu6d1I3c^M{M^s5E1TY_1`Me?13hI_pI!l$G>;`eH!Z3g?{=bmL~@NiI%1= zJiBQ+ykP}6bs(7=5kdd!F$9oVnq&^vD{~c%F`ZezY{psFyzinjM0Zgxf0$H%lO8>E57(pns2nwjyl#H z)}6iW@|Sf~pv0+7Fkx(`X!RM6X~f?yhY>PTIx8WIqP=lVMf=l{CHahmV8*QvH9`aH zX{KSo4fX)x2m9AC7@gL;5if zv!ZWo>Ifu+PI?Y;AS+^yz3wrCD+?d*=*R8#;#qaQ>A!Xj{Z39UffBhlF?#34-_abc zx?rVlaDoC7=EDIuM$oahXm8yiTkVGJ^bMs^eB%K0ACu~tT$-t8o?^{9m7qh*l7WUc zBcu!mh~yx)Yv9k{R9n*}_(%p-1PyT<;gMI+=@&!1DE*)y^w1x=b27v$jV2+2yQVia z@9=v5xX298Fz;Bi=Q_E8zj>>k*K#zp9)W6X7&4=SI>DY&s%}2vC3+hefEyT~avT|+ zAv-l*+%RlX$_S8AP?J#Dwj;v;As4}y1R8~iy>i**+JL&{TkOe;sUh|_0;iT7wFe^94 zEy@ssUv;EOnih@TXd1Yub;zQj=x=Fi!LzfVq@1oWwwA9c@<)F<7vhYhgs&0-Z^ohX zd{g09itNrl+mT|u-B9JOdNp^dLPT)(F4uwhlyEKK6b1%nn-MwfF7vLwW+u_Qm_kFd zS%?Seo?(5cH-SBddj+gq4a;{d{8W&D&mYI~r ztj~H}B&BhdGq95gn8h|qLz}&-F1tZ2?wVmijmIP^k8Ro*M>*H@?vyv@#Z#yyJJ3&! zRSi#vG-}fC5_l0|i<{=cZ0HICp0JxYE>N*$56p5nDHOncmqmxwG8VsXfvB9i6~Z)D zf>P4AWUfmY;K)>hu`-ZCa94#qqJ*%EKm;|UR$PGM3x&^}w@mF<-;}W&?xBu_nq%gS z8IYdjU8V5ghVSTYIR9J`Vcj8E;|t)HbxLu=`3&`z!jVRB%f(U7DD3_EWetritWgto z)FCVZ7v?)5W82W*5Cv6jAGHS`z4ABxH@k~WIhE%hpEE`6P;%Y_S|JNV^tw!{O4|oXa&=0JDNjx=3Vch z{ujNk4)Ij*spekkdO+@Ya1Bc$SxYTLAUzR=7=3)-YZnuf__1&*_BWZ3BGT>uy#0QH z*5EdKqCuDsKX>I?^9hmtn|OhNPBzvG&>`f#S*v8885M~EvjrhOf0>B_05HfQjwW6i zBHWq2Us7YUYZPYWe1I?NNCG19;Vah=-AFx}2rtG9R;uP%Qy`?HalK61_Wm zBw^Zf2DOP9<{|LGe5R8%nk}NxSj!)`GlVDmSk2L>%jZD5ci!!oJ6z=XHv~POL#8Sb zjgiorx>jHXe~n5-v9=0CuEuAR5f^~9A0)XM!>JRivQ7xF^Je^h@gxv7AuCM?U@X$% z+>P!CuQd0B1!4lLc-!V)o{`5a0jL`ZeHjMAq!5mWX0oz@uAlfvN)vT=3_jy{Mg8f= zJ@#Tk?<*bpgKSnf6l8Ok={%3ZO6Ybefxiz$g;q z_M!rXd^pBrBe-7Uvd^vE^!~R;2O9Hi$#b9ml>cB+t3$2Hr;0&!0iw2V=67oV>O$C* z*!&}8d0QH9P5YLT9$IX#K$lTNhqD?~RN(cEl1jsvOt)l%t=kJu1KB|*r9b;Ga8IY- z3nTZ2Ny}Y!y`y&8TH^IF8gJs@pP{@y5bjIxD>1}SKNdcdl~?@03wn=yE00{cf?oBe zpG9Q+Pm!%JJx(+-WA2=K@n8noCEL$G{*vcfL4+zqwe3TM^=U6K29kfTN^SVOux`aXa}_zC zOA$uUzvVS8Kl_6djyED`jBBu+F3)CAJ6OeNMv? z$-`yic2;XVnQ-xBm}5~EetyVfHfqK|v2G~EAlQ|*4gQ)+&^+4&<73B=f?9Tj zz7JyPDndFmxrdQ6{)LL*J@%RgcJxzLn`qP=111433uogrK_3sHbH;J;Agu(j2J4j! znbzFu+3Xi~ng?J=E$3_gLl{{D1Z~DR#$h%1U<|wSog=4W%W}(3($C#aqKPnUnofF3 zGYXEYo&oX<<6w$mLDH$e(g0krWEeQHG~Vr4**@UqYmtVC%?ynycj*H`7;(uOg^m5F ziZmILu67Q zp4a%R-Z?Z%XLZH4I9xo83MVyG?cDStUkg}dV%~-#uRUyw3W3vjsDL}k8-i?J#4av2 z_mjfVMwT~D@{^AOx!g6eSOTjh(kYm_eYv_b?TJY z@`#2b_?;7(5{6*Hh*lP?L|krVFp1xQJ%_+@K7)X2@r9DT1`(RA5Ez@L$jW1t-OM;< z&69obs82_5pZ>A7qvklbME0*jsPyai;=7ikgII0Vqo2UH;#b4nD7K zrtiG?Yx1sHQGu>}k(SQbAH;Db7u5Q96KDKEjD5XxgyG~Zy;Zk12^k>0E3$b%tXl>f zf3qQ)cNeX}Fk$7nRcnHvLZUt)x*;N$TLJ3ux5WCQyt$R&ZeGxg-4y+~@7!BOzSxf-n_O;*b7( zSJB2&Qpx?$hj=q%ifCe5=ehj=TCMqH4!{{()!V4Kf>^#kr?}$ZtB=CJbjzFzDgSi^ zrzqBNB8G4$K%z_B1}6MN48w?eAPMPwy)+CU2?P@| zS46NH-7zR>^`UyNA-^W>yb4sCG>3yLqgMyb)iII__&I$6_IZyG@O;)LXXuE}Wupom z_;z@?Td6g8>UT8BBLs;6w%)RU_wNVU(I>RoiCLnE-&2J3&+P)pVG}snOUMd2lxL!P zB)?RFWPon5U58%y-E~0Po^>sUv0%;Cg9bd`Ra?4$wQ>Se3yAOP{a}s&>FsyfTF&6+ zv+-2G&mTM5tQFLcZl42y<>i~>x|8M2J-Ac@3y|DL@Jp+ z)cnUBXl_3I*Cn}Lm1?1w``+z+o}HMzJG@lmr_7-2m|Fw)rrW#&jhGAY@~r{d3%705 zD%JwVs2h@otRSl%#z?Wc5PV`>iAUmwX~jF&Fc3q*&ezJ*+RBVz2mwu@X@%rh=fnp< z(6rf%C|QKcAFIUb34h!(3B};tJw7@$D2C4>SpwM`clt~BHlMxxDPrz#V?keNEUf^C zp)O7F>X?x2zfl8a#ZQN3HRpp(sjoJ5RR3z%YujUB;Raz5elDh9n^CuYuf4QJJ?ToB z*+DPF>$B}@J2xIu zf7mvOLGAtxX0wJ9uiVpt#>#GCu4f0_2Fls1Be5+($4%%bgo^Cm$2AM|sp;J>%7neR zZi8K;=w=u>dNRPtvACHyvW-Yj!B}MD;z|80@E##A%{&xEG7;&D*~pi6^ucUq(5lth zcSqWpBhFL>xX`#}4fjDQh%1d`r&~HjnOGpahx(~2w6el6ZPj$z2F8wO=R>@Kmq}+} zKMFE|l;BN4x_6`?CDcKmJ%4|1M9D zisXF8*Cq1Lt+HLG&iXvAdrPfR+48v3J9}_zN-}r4N<_0Y?g@B>}G7WBV1dFQ5utlAD`6hYYO zE%dSjbLX;1TGlpkl@#$7JcvY{|i80lr__@eT;_dyqmxPtP_ zFEYTLzuUL#>l+=(2(RI>eOMUfi?%hbm&@xtU$g?+4y=hKJ6u85SjlQj`(X^QP*z9T zGrkzv8DhlQ7AtToZ_cHU1)uB2G$ok*BwS)y!M5g}V*BDT-{WoYm*1mN{YHj(^MlDi z9<0W4p6hY(BHoQy?G+mz-;U)KKd|oU7W+^Xkg{<616lvy;bn)0f@-c4B2e!PNR3|P z6+I>iYV+~s{y}b%lK)^;w$c63okmI{OcizI*o#pb<>+Nl5$tp8$LpDSw;MExSK99C z{sRN0=m$l;OibL#&p7i;1XsLLK2~iz6rhGu$osT;_~q6N^y-W1Wu3-N-=}+%hafk% z?S@ldCsf5z>CG8*t%;C<3j&o6b)Ov}ttZoCdvuJ22SjFN>O@=#1$G7F{&*C<hRo=KKmn=)?~W3(j4?>u)s!rn$0j^g4x^!2dn=(!e(+6H(y#+^$Wd}nT^JT z7gC$|-~9%npeDke7l*;dd;m+GU*wZQiq^G@EHsEA7IO6HI1~kPLW7@07*VyHUc?D~ z1a<2#T9o=#0}boiO}CRB@ej!Q&c-zW(s@4M>qHGKTpfLnR;6t2rw9EErND%e*=2;m zjanG>L%&T{4Fjjv7>vQZ7ID@|ah?XBwpn-;@MG;Wtr1MyaNM$5bEhEZZ(M_Bt1^Cx ze1PZN#^>pD+#wu?R%M2vno9`?{1co-V5|W)v7-`dN64{_H=3V5PGzp60j}GwM~^b| z;usjYe1?O1gKkP|a<%-yZ4FVXx~|KgQJn{37---8X4M&>ngQ?u*jk{Yy0PU&>=LCLw z5k#db;ZZ$T+BuI*2>SUUJA;^i|12~OQ*fT6$f5YAeSMlPvAy`!F^gh%@uSK}V*Ik5 zuUSM#t}yhx?!dV4##Dz%m&V>BZt@p=_cWC;gW3yxZ5L5DN$&a%6ogZsh=r!)h}-HF zgqM5GNT?mwYs*oTQQp}H4H0St8w|&Q8t@_XH10DhMd*#Fy&5A1tK*D4-xSoG?ss?W zyYuQhhQtYCs1uYkoR_*yS)p>|TlapMnTOiaI*vw*W5bSWqR-goJJOys8w5I>FEZ)6 z7Z^_2z@?3Q7en|ceJ$@i*Nrj{nw&U5i5_U(QpokTrc2bHmjb#A+T>-)iGf^^v`p?w zrZcKFsf#Lz2RYxT=j+xc*-AipIar{05wjlE6dFHS#W4MaTNZ1+CTM?C*Pl_S!Re3r z`TjAOk(qB!g~#jj-C4$_#-B9^3top~KRYx*rAZ3QynN@0Y@LZ!ZiqavFpg&X;dzUJ zq*m>}@+g|tF=}~MmBR_kyre0w-~FkQ6oE0=bBr5}4!Vnzu7ypJ0yQzf+yGDkUFban zVO=BUx5r63uN5lw8Qumaa7#8t2@3feeJ9y?bNsLx5d2-n>l+Jz3XvcW0f2mdbLrf~ zr4JNvxV#vG0!H(a!ct4ToTDYY{iu!Nv`a!jWi@0EziVIQ4i>U=lnUkJJ>qVIju6)1 zMniz^yC;k59aCt;74(h=?U6aOo~RBbRuFNvg#4(7fq4ymg_k2=XN5oAXg} zszi%#|8P38T80Qv%CQ`?g7TBHxMQbIh_`BpkY=U>E%V+$zzj6Pr{f6I9a57I^<}p& z>nU8nRa99q8adW7Vo12*8bS>g0@5ab9pz)Wbf4Hw-6t8WcIY!6x5rg?pQtkaejpPQ z4Ot^{0o}bk?9sKh(vVRuw(Aq(R>D=2S~pz@zB}O1+vv>gMn^dmaa=Zqf@~id@>w`p zf=>+v=@@YdyITZsNbh5@hF^Gl8e&G%+k;F5b)UbNYXI*Ep47}F9{fNi00YSy;Z7x5 ziDsw@M!+JTE##|6ju^F@OpbYA1WfDiQ;wjx2fL+BJ%mlj=5$5y%o_q>-CkLFl?Y%J zm$bnD_v(;k+NB|>d$hKF3y?<0jAAYAMPM#}m5hh^joPxdqClc|0TNeOPswEGOCt4` zZ@)vgO8;&|Kc#||OPZ(i~P=;CVY86?|?M&c{ct2HF~ z+2ha%{>71{hI!T+qUfuZ;(Et)A~+9^r&kJvR3y$TJD@Lu3W%8g&>2?Ny&qh_uB$Fy zYucTW;R-GkhsZ;E;E8!pWbc~^;Tn^=zR}ndzA;D!Z6MADzdbWxP0#6WfYS;;R`X^d z8!H5jPnh4hQy=XxCSsbya~ar*gT!3%cMrr%qGMxWJZgPD0MKK-R|}#hj>23foX`@B zJ@iS-l68O1_4%b;Eo-tkvwY89%^qYiioziaDTI;9MtbGzj2p8k3bL7S92{gk32V~Q zOQkt)Z@LeC_j#dhF1hXV1u^vx2^$)pKjMuxfHiDO?VZP@1C+jslkbXNp;5P&$v~LRe3)k)U%$)B>sv*Q znK`ah$RnGr5-=FY+&~(rrV+&vKM&uF9Wa{L2bYC8mgA_D%=E0RR`EDu?r>7moEe~G z47)7t9VQaExA!{bgyeV%Y7dsiAE3p!K03ll2*0KsH9?OxH1H^G7frNs*cSA~lcf`c zLwz}WihXVGj}zO@2}<`pQr&W4xU{J`z+*wH{VOp|K?H%j7~~jim&+2#KNs=;SZ=0GVtW6< z3;$Zoa=4!t1f)2BfM=od_xNee6z?EBV+q9~dTU@kK?lSRFTfHonJ=2ACZE1U=2~{F z;2`wQ!Zv||=Jz--kLiZ~kNggE6}*1;yEooM3e1Jb=ps4$C#21c2WwgB4oxW7yByMq z8SGXJ;iaoJWNcAu4Xw)Go*#o;MsC_t7TD_IYOKk+f z`T6qjYVxgrXbfQUp&}o{-wMcDU9Ydc*3ulKhDu~w8ZI^Sn4xfl)k|FR=4BgMhzE$+ z^Fr08YzgTX}i!}!Ue_fo1eD=t75yOq$#dyHlD_E>b<6 zI$YuMDg|I_4$D~{Qo`gH9N>RAbp=Yanz_h$fijh;(BqU1gH6>lgu0{D7~3yR-u!{LOc zr|;0B8f1r)Aqh;!aIb)BSrIpl7FNM9#bB2Z%of$^V*bu_a&uQ}JZ=-vK2yDDAk0H& zuY2^(Mg-V`=NjF;L=cjK9;Ls`oz1brp_!|ERWQy$kdZtvCX(>Hqi%Jh{U$TuizekM z%K#}ODkeb?NQEz+By@-&yzEcF^75F>h5iw$|AHLwcYFJ(mQsF$DFb2VqOCVfK~&h! z^+Z@ts=P++7W(sMzl#X39lM!Slt`wVb+a_1tQ+_$JMNIW#T!;%3(;+83A|aka@z9h z-A|mh=$`QG-hcJ(cN9=GTGJTN1_G^}`^RgYwCvxvKr5GIc^L)F0lSmNMlo22DC$E-NKR=- zthmWc!!4^y=^_k(9pTTkR{~A~Pnx=5g5+btlPC7pzFG2asAym9@`*)-qlM0O+i}%$ z@l^{<`XKTp8Po`Ae3{Els;Rn^Iqt1+cgh6Fk=B-3Xvtq2!N7?ZIz|nBmgouYJTK9d z@oli_@mxM>n@>M}?{+>7T^KoTRo^pSc%zK#&7Em1Ubf^M^(Jj`IPq$%raWeW*Kg*@ z=)bS)FWr8>U%`|=`uhV_D=5AA<4#}Xinq~mG@ZXfX2dpwfQ8D(7k|_;&Knubh4#$TPOE$G_!k2{_;v8MTd{GyyC4U-e!>B?m+=(Z5k zH}kgP|@`%(yA+NmcZ-;QuNSMt#u*^8SinvibSPUlz^3h973b`VVeD zRbVNo+zS6ske1CH(Mn}qX8=J)B z9Yv9k-~HH|U?2SJ1M?ob2W2Jpg6TrHc!CPh`*==Ar{vFYx-AE@BXKPEGv%a_O=PXS zu*8*HbC5njj5wCe-`KGIKs9Dje*+q;jF6j|%#2f+Tx3D*3Uagf2^TZ21~@=>{LqyN zEohFPP#^S=pn8v@bd<0-n9ec3LGVhYd$Wgo2PRHivO}Bz8i64JZ4!mWDb0lv$a6c- zRa^zqrnUsFDO1KSphBer(PE^X@}3&E$h!NmWgKx)D%0F5O!9SluhAL<4ee4Ld**`j z7)fFr#Fv4Ul$;<>&Q5==rP&5M)dspcNAW}I*=Ym&9`B?Rr66AZ}-#Z1uiFh-YLlh*h3!-$ zRgh(W!QmAHq=E%PadX_-z{tFwVK_m7I@e+)T?r!Bxdx?9UpA~5pnJYjk2O%7p)lS% zzAnJQ*9Ux38+vw|pnZ;V z;N7=7(isy3z6=7MOe4|FdI=gpODqDqIztZm$+ib70|Ve&p(0VeRHoYVyd+l89ZxdG z0qKDk@dJ!?Q-9_NFklAZ7jHij{hxpQztrW|Z@-i2&BMD)ALOWyxT#Tx_`a=x{uy4& z)JYnQuhcnBx3=2>o$fcZghdlYCa|{K(p#UY*mC)Svy|7`z?(b7-@m<|9rMs-LtX|C zHCvnjtH{oBy);-@9Slg=$vWd=o`Hpi&eqnCmW>4C1$1a9a9);xT!R`h@2ELcY|3)Y z-|M{(U|rju^M(n2L&@5g;&&t>w;B~tNM$y@lz8k{JZ;W3$uic&_uQ^ehuvLga681s z>h{XB0M3G;_+6@)!Mn5^>(M3VSW_M7d&`n}*$xxlA{n~VzE07ktzgq?0$dB*_zGg; zA{JLg9DIT%6FN9|_?TJ_B}0gI@G81bJ5C&lQPexm#`k5{>+h{!FbW^0X`Gvq%M*k5 zUV0KeF-~2g*8fOn<}JtmWwq6l9zsfTmINCy-B9v3v&Qr_Ip=$cC~x1@dy2Gz^8RhT zlnLkq6si8c!IeX#ffU4pOlS|vd(2ev-K#*y(6*I#(YjzXh#94%VoTPn=DQO~K2d7& zz1xQ>X@Ed_pZLeo5C~t>2C?->3KYo37TkbbYX;neweS%?x`PlkGPLyBt(NYqw#*X8@y5u${nTy4Rlkz z14TfM?>QN!@!NT!3FmwQK!-rz_{Tl0Ni|F&5eZ&*VPg1UIq|qMi$j25hp+rdqIpoS zYO`!@VZ*#7!f6EbLgNI+35RGDQ4CMAs$ zlDqO8^te>SmC0`=JJ#|^7mcp-rnTZnbg8FJj$-{#HhE>j74S#_OE%Y6n3QPh7fZ7( zn|Vppx(sj0B6mP%j$0iUw9}C2=qgt*oF;UC?S+?+4;7ZfqzCId_7%9_RSuHpD`qJP zSzsEWm2>3qTtou3>GS|`Kgl%m<1Qf!oa7(eg_-o-B4jC0BC5J`&N`t?!%dR1P8?->u#iElb*v-+9As+cqY8oLmL>KWE?sh%uPU0e%<9$q9 zemmaofi;nLLhL(7TrJKGyNgrswE3c4neJNPOlql`xLqnMCa%|n9d;?;D;7s4*Yg5s zyYqMg9T5pe;L*_CUwn@}i6`bDS?1Pr~4r@rUNB$-!I6c2m4sA1L zq_Kr}=b0{ZQra`tH!o}uc;>xB4o}GDUAUOi1orb ziiV-4X1oKUL)jX&&QHZ zfd*$}^xS#d1y|Zt_Ox&Pr=5GSa9sM%?N|LKRcVrCZ@TWegq-^5?RsJ($mLL& z-0$#uhNmgaPyE~+HNxW-Y%EL4@fWqo;pGhN%gRGEUfF22F`7fGv~bngyHq%Ec$eFWFEyf-q{jqvF-_1F9Cv2&Wb`vy1Q*kD*=V9oMGFwovTX0 z!u)RCFwJw2bTbqkmo{j(cK`xgNJ^0cK|0V+;FXHYJzX2JU06%kl#P z@b`ieoyoxh^tnz;Y7QBt5p>V9{eTa_^b{92&ponug<#`|DxpcrTO9V-<@R+?%v9c^&{}= z{qU$?+6DLBXD+Y1JY>*HN!`?4OmQ4Il6c{)r5l-BK|a!or)D`r ztO%`_Cx%sSDfMU>Btp8pJB@_Vw5(VAbrQ8imv$8(T=K<%{eFKgPPW&;9qRyk#91BD z(^lbr@#Ww+|DM6aZdD!b&Gr-a?Bo-2P6#VWFn@l|2SPLDC^2QLN6HO%ENOn@laA$+ zICw5~FS}Ng9jikL-~xJw!qlYn*nk%>sl*IGmog+=dV92R&Dd^J9yV%XIlX~2v8lUq z;K)`(|K3%m9mQ(fWQMaHZ;QUDdbAa}WlP#}?c@azIDM>CuDMtH-p34J(T}6ILI%#j z0_GWC515bNzI_ot@n>cOXBy&cWu;~%xyPd1=$G$QI`9;iqp{rd?d=b&jqXWGwtn7u z@ik>7nZf+I$FF$VR7)V*U#5tn1VL*dH{Hk8lYA^mggd~JVMsJW^&T&R*kW{>wA5d< z8Xb!*WuiBg36PgTnICy?*eAF5bm}*v{6M#0X#|uIc_#kbFYhh)^vu)LW=Y!9IG#H5 zkJ-g*;3Bsaf(VJ)%Q*4$-eiQ1@rgYg(c3>-U?{K;$@zOITcBtel9nIQP&NLwT9ZNF z^D}E0vVwCsqz}#4>dgIKrz|*Dxn9;Ansi9>`@!t1`a3$ zdLHjlo#>XUogFym8*ebTPeUUO&IsacCQMp2P*F+>@V?J@0?h>NTQ^N1gt$u}!(_RB z;9>qKpX2!nxqz`TEET)avR#u^Z81SqGD0X3Rr)??!+_rpf*{^~B)|7}Ry?EHk0(VYj#XPUd|wd1$I?pPm-@=9Eu-G&hgo5A4av+W~JbT@mq>v(qgYHPol+gqk#7begnlEAZF$*i^8ZLd3 zYA97;q7oDlUh@O$o?APDeD>b zp=ha$z(+xsKpwRfNx0WS2UJ8&NWS?nugT`G-A`A$rV5cX8b% zl6rXjh5||+mPzn8l(;%-)!v%nAoO#V#p-(0)*FHUGX2 z1cx`uGg#%&{t>;8EXlU44zerTF~SuBc0y6NpxfM$++5SWX7`hIM$?@t(1vA&$ti4I zarSPooQ;oATYCz64^;{|BEh~>1>o0u)nHQ(v^O5|HFcAqn+rf~e zh0hWQz5UsMLLd0}2KRBBv-fcKYZz&Um^LMpct9KIdwpoigL8p5Yq&k6UTzC*9S#=g zQNMeQA}Bg%+aR>45nVhkn+&e2?$kxP>mIUNsY5;73Jp^#-McnYgv*#UnuU8^Th#N&vnc1`z*11Q~t%P2N4oME>uliS%NudY7Gqq-J=ZdwCm9G zIe{3tKr1--kNY=)nD@Lpg|Tf|K3|`ujX$T?3w>GM{+XM4>*!k>garMrgy1A)(9GuJ z+sj*acrZ<2zVbsaN8s*W33<@VO}{&@K$CE)xskM%6$Jm2_2{0c#5=?jnRJzuF<`A% zg)#9HuioiFw=BUh{Q4MWagAy5cV5D7|5^iS39DH5F~ieV%}fXce!J8*BOCo^jXvfb z;wgAL`?-(TAgkD1Y+L`}h$mHfX$un;qOse3!>pjxQ_PodEsX>~QfbV&g-2;RU8duz z%O{d6^3ySGwCT#pszKnucAdD*N@3*>?DKrC#d+z^@#LE}j%ya?wH@eFX%*m0qE zyANdH1_>;s?IRaSDg@R@Yj8EaV|o=D*5DWD$ND5;c!0Toz@#+{QGdz-Dp;^tPnaOswgIHxZY)3GWCya_M?TQ4}kdTYmbSP@-6j~ zJQfef9o9RWq=P@B-*ygd^wDbDd{*1`P$tbiM*2Yib9ZI2P3S$T=ygp}diMs7LDL)4 zGE=0nDf(A#O11U#3j7|FUZufD_Y7&VHUd1p_~tRB{~7IC!kN31TmJh)-FTe+R=?M4 zjx0NBBe-od3^BKI@w&QqYs+lCOG9ALa>axp0B7HYO8bWS>JJc~n5#7r8HYn22m9K*Xx zFpXB6ByCYFPQth`*K3Y=RNDybGl0QIMsAShle7EOsW5_R>!y;^aasE$UUU)s*fCr! z)lx()UqHoCC%$Rd#v>KgzEZ6^5-VaY_es-^&@qevFSUCC zUf4t;#u=krDv4F38>;{WtgLAWJQIYteDLwkKOuP(2%^Q)inQt}^hrF-)1KY0 zUw8osC_+uF3+J+YG7HS!Y?X_u)C5lRjl`5waIxvjPNgs>kP#15>|6+Ve9uH8 z;rmR)FCOf8wS3j~T_{=9O#datR_3_OkFXYML&3FK%08_g9=3U0J(s$BSR(oB8lMqB z;(Nxf>;g0gRE6&7rb&UIMeuGVILzjjAAl!x(5QU)mNdx#2{M}q^l2^7!1c}9y7=cs z>lbc+@AgBlkbPZF?Cpzr-0BDRXnrTeUah|xwsHS4ehk8pfhyX(fNFZNm5>Huu+|tH z_D+w2iLl>MPmL!4P-oLvs3-x2y^IsORtlhc?x}`TkMyatPVf=%5M)^z)eLt_s);nZ zRLI!3{7d@Ya~NvQzqR#*woq~|cwemtheb*aoBLj-VGGfs;#lvdLfzIU-9{q)XFm5k<&Ag+iWw#>R{=ROe) zAd-{Jkhsm|xS=IN(){#O+z#=Gz`U;-Skqv2IOSN{X&1b8vVClMkMy_tzOK<*`QwP& z9Kc@lj%i2z^))?exuI`r(wFNK(^a!fj55Ra=uJ|7*Zv*3e)l5&`Nv>E`_(r|m?)H7UC4Il(q+OTX+|@!hCKak61fJ-a~i%~ zI=+E6cfJ6SV>%Iq=58k#qF#_W+Ow1bF*_NG?Mr;G)OzxpI!x^*Zq&YA<)x>yhVaqG zVCTk0*yH@K=mlwc{z+yV{nBL3ytiRRu@D&6j_m7Y=C;Q>8}>s5>M+Ya6*-=A+3|%aPqR7NN2WF7 zc!<X2H!q5oi`Cq2?v5{XuGB>BCE=t&W zl&A-y;7yw{+~e84G~bsIIT_CPKpoNzaz6&TBjcw5FW}U#$%toHG0$kDghvX}`8l zsoG19Y#mf(9{Wx8AlS z;Q3fyDyPl8zk(SfOPluK7>gffO=ZZ4*8!)j-4Ekv9C$UqBq-yz){)#ZHyhie>jV+R zzEgg0JVn``vjNS1g)eIsD>14RoiT*mFyQnC3Wv!}1F{~57nr-yI{S*jyAYFg)P|9N z(NN}*OMg0QW6?ERr=h}Kqf8dunEtYv0Eqs|_W0sF#L+mt+xJAiH&t*3qaNN`_U z3+T%$&!`#NOlG3~J(xS4uNyBK_mCi;O2299GN!pdu5~gN($B_7=o|BbgFmlLy8cPy zx3{ksJ-SA7)k{O!<@~13 zCdD}{z3j#lGdcCH%XpHYIaa80b+VymX?AC@BcqeH^E`R)W1jG=P*H2XHj62)s0l-m zjub!Y@A?=Gw9j)aBDfNdJs#PX+A7}!#EM?qkPdgLG4wb#I+~wB{qVDO3i5P{yDuNI zn96=b!+nZ#WZeJ>`M722;8>-WNg3+U70&3@a2#?Pc>*z4(pYEgo8G<5PA~&-KyMk* z7N8llb&_XKXolETTONaYMS__*^}QXf<=7r4lRa0Rp`MQ4I*zSB%YgYc4eocpYzw3s zQqfltPXV1o(b|!sKjIdJQ0%M?sD5H_EK7S`ZW8b9Uz>Gu%Ms*iSLbJF{|XNesQ9Lx z`?-8w}^)T^d3+k&E*vAf3u#^oy8xvfIpc z?iDUKz35#%8WZ*if^zpF{LE3s(UTSU4Jrvh{6nQy?UF`)&oZk^gG7RlJP+rmJOpgl z53|bz_Hv8y#Hs)IVC7)^KIo4>JL_T~bQ>MFEmzuf3Q61V!48fFmQZ7_1lK^JmmOse zuXW>>vJ+w@jqx@A@XBN*JN}%JNM>)hz3Ba3-;;*zlwj+J!@+1LY)l)_Dmidon z8GnSD^czEYl7+w|Dw>wj&y1l+U{Q>{qWj3DmKgo!IoY(%UpLG1Ep+0;v0uQX>(9Hc z^=avbD&LAk40R0%;EPiV;`tCwP~~sxG~R%6e+#nPb7wx~=qr~FUto5e2;KbM6(tRB z_@)h^iYV>mfO3$Ti5)#@nK;oYw;*f~bT2T7KSI~(6yQ&@WP=mp=?$#Ol&mb+#T~2h zH~h9FA3azPeg5QBEp=s?gP`XedtNBGT ztp7k8S~#W=W$?nWx~e}yR1zL)8`(K;80&0*_nZy8rGAb_D&iTU850~Gg`tuMa-_KU zTss?>U5ujiZf`kpJKY}v(z55yOL`UcTw939a{Z*JUB_O#L(Krvu`k!IcANof79S(> z%ZmL;mcxM7*&c7YIetSV5sQAbZoSd)umBU*wLCey8cWS!z>@hyFZtma{PVJ z4jXpa{F;&g)qVUfd*#_{g52{JyVkC~Asc=ngIglmjo@{TVYvw#I0@JQv2m)t{J*~Y zb>DP_!r|`eT^0L=I1oJY{M;7Zzgsi?Hj1nDI&2^Uk$^Qr)Uo`PqEN?_KUWaCJdbg?l+el`Bk4H>T0#V^XrHSYnY6I4BFMfXnW%n%x_7!AB}dGL zl4x5;-J~|1(2FsxkuXVp8Se2cyFcf8k_yE7L{Xs;<+8i(ZvQ(BvMa~`qo^h1Cy+e& zjOrqv>&}o;t2H}W3(lP7yBOBbsZ^`^TJaOXSHXRKewyJg=v_hC{)Z^GAAVPp{Mo3( zyEnAb_odq}=BXYOIckfKNyRAh^#w&A-oz@+>R4MX7bvGGB2&J59DtmOja!i*suJ79 z#Bgyo>qL1VP+ehhzA|yt@#JlOF~XCS#;m0(n`>mc{b+kW%ruD9tdHB1TMFU&B(3Kh za~_wB(`+8o^C@F18G#F5ur1S{f|IObW%%Lu29s47e z(4Lxr$4XKf4&%Y}@3-oRt!V`n)5<6DVP;)6I2yh4_>#3f#0ZQ^uE(>iIC|WEx9MtK zk0%_hh`;!~ax?a}>iekQS>;weOuUqwH}ZDo81~PS3rMwq_B8>HCxsq0)TI&x<8!W$ zP0Nr$&j*p5;6Qdw^FgffTJSAM3o69_FxztE^dC>6&x*fez+d*uf1oV%zo#>Ycso>x zgX-=JSuBPyX-!B`{HiJHNa{qTwRBX z>LjH$IScx3!5*Aqn=nhR5d)*|t5zf%87WoQw4~L?32e(jW90Xaa9T!<|2iTU?$tx< zGU1^(XR2voUMJwQM*Fhy*bEz_4P!-N=&9&?jJ!l0XjGp8{E_V>D&fx{RN$QR%m|2W zS=&_$bqmpeI~P(M>g_ z^wsr_9knKoprHZBM0H&RAmgL0*8l)_$w?S|0pgloUT z46F$SaX6qg`%y=Dy4Q9aUS@a_u$kYt3Yb|W#2^6iIxUhVafz@nCd5J@B9)`hrW!9< zFC8ohsVgm^G*g)Y-WK-g5zd*E-H&D0dxvLoD1&I8vcF z(6id_Y1OJN?D$Jmg^614-Tt(xsC`)@iZlP7VE9~;oU(W_!v9DK{`-SD+%!nkVlPv} zD`}wgxJ7_4vJ#PvujphxZ+Xiv*Q{ck3TY3H2!I!E{f2_;=O1~4-T=UAJ6eRT zKXqbK0}AjbkHgWr12`;s_0aa94t&hqRf_wHdUw2Az7L|g0UG?qw`eC^Y!*+F<3|9F zRS;m#&BI2%dY7XRlDT9cvR5i1<;{1b1rW*{ z1L9uM5q!7VZUyZft9mCQ)D|45A>(=s;L+X@i<(x9?nT0+!t^&{-@bM^ zgu-xZ&ZK!;$SmyBistTcdR`<7#XW=m@6G+Flk(rn`RFy64ncvp{d+!<7iF3U-PXCi zc%`BJGro)d@enl4=uNsc4q0G50<z|xms;I=s2_L? zpv)jcY*(}OOv2-fzoPNqVeEGM>)DX7z;2&ebNCFV=wEOx6xN$kc!QbXhT==OIt?pgxB~ z)};!lAnRgVLQ#apo9MQ4^sS@nTt^|><i0tv<5M()ut{qP;$x4f%Ba1BAvSUZV^__t$R}L z_hi2J6ra@ptn;da{-5?un>}$_w?^gOdPP)kA~D>D`%k*V(~=eXJ8>4#iTq~~N&7^3 z1sdVI&SE30lD{+iUl2oIT+8lZ~qlm9FYm%eoSW13zo{^z%;??zKMPnXQ_inzM$=~&U|?S!aLy(Is?t%sfumQ@a1MRC~nPc^DBERM+K*1)PRp}!U4Jh-Dy-afRKa zJ>adB0&I)*1O~F*7TLBPjL)_lNN~*&7S9=Xy)Uv_p5h2A^g{khAUsH;mhrHoBoxLZ zw9Pc9uWur(vg7YPI;1Wr9 zYPBqBXHSKF!X2%j%0pcF3Mt~zhhoMQ;`A zf7}gMW8!do@prwnkU3y!NMuk;1)py)K~X#ZhL~ZUlV)%OYyC*gniB&{DyK6c!WLZv zqSu}nnZbsu#So-n?L!vxiTfvlF79sXp z`VQty@l6)8?xx5SLXvYcO;8fOvhj`5Il|@^=r5rvy1qo0QIw0p4|5WcO(aJ%*?2uNm)0<$;oE?byY3 zkq9j?w>4P0qrWcif8%z2JQ%#_C=~zZ=f7FoPpcpJiWaBl_DDzl(%8iRD>bFCTJEvs z=W*RHmm)m{k>h5_L5Q?G>3nB}jr=U>7!^WUv-;?D#@%FjL-6gz|1-J9<_75L(ba1a z@I7`l_#=4<2yu&4OKZf2Q);$H;r?ST#(P}%Me%+g08(*09&q}n&sA2eo&&Q z$m=L?k1$(mF8eG|5m1QGsYbz4o*w4VNb zo2|K()o*^R!}bWb=XtqrneB0uceXVx?A<3o6W(WBGml8->L_$QBc&OTc#ctFj}RND z)}XX|NPCSfP6V7f5QJCRfl+={nZr*6@AHqps5kK=S*;_hu6#_;fb7_`ZHjh*^M@20 zjulPLm4@7X{aYO$=!HW#g@9LBao%H7yi%3-&S#<`jM4&Kn-A(PFKNHbD?su}RIapn z8^QIA6|IYrrr&1~l|E|<6?U7(Qdgmhs>f}TrV9(^Fg%j8~fOiCZfbmi>zq$+}bb(|-%3x%NF5hJk5O|B-)NzBmPUJY*T#Sq%Nf~C)Ozrt=&jwXly+1}!Uc^!$o#DTh_lW-)5IVjGk*Lwe=Az8jumWi9*7s6Il9i!y=7pGOEDwNQ^aEZxBDHel)o^*xvq6R&_+kcy%@N;+~)uV zEjij?EQmNr3<$u{`jzJhi?TQD=j_M*)2CtLbZ}VUOK&oZOPmdYjrQs58zl+oeWjkz zI6EmJe%}AQg?;7{G^qVS+eE``${Z4a5k7&t6rk2AU8Z7AoArUOd=g$~a4CytGl;Mz zftRIPdSAzn(jU!Pay9|V0l+ab=Wmj`d$E00ktY4^D5H^2KL=(V<^J4pVmPL5>MfPx zIO%$;L?%P@Q@+yfoR9_{FbjjDmE3}}vII;_g*I}U*bMQBq7N)PFLs=n;t3F?O6*Rd-s$yIfFz z85mbiwSwFP+IH%Z&bAEL5g7rKSg?RJM66|EPg`I35%b6#ib$5%pd1qKUbqlS;Q_5r zXgw|ZJhxHNW3li#A*uY;|GesqIcz=W?b#v>kFcrUGv@l@qQl^fR@Q1+NPjvPsHeo7 z9FvRyG>B%!)Zk4ZUt>bz2jWFui5_6WsvN~cX9QgQu{`@nRhW(erF~exuHW^bb*q2Y zd7=JRjz|u=IMTky>B~AThB^-ix>_7fXrPf95}Wr7RR}3R!G7Ag2!{NvKee}LU)%)O z1nVii?|Z+{8sjVM$kEDJarBfwW`-(VIbng4Ex~H)r|a!3zmBf4p@L{&D$I>Q> z*&~@)GCKmZTJO8T2Cs69!u>`WRsicYCU@jKd_`7UPb;d#%@9c5FInorolo3*Q&(!? z#EYP5hi!J7Y1S$_f2j_yngUUrJ~q%7aGdf#Z^+LbMUW-2t>~Z1c|d?cG>#xvh(1k? zmZvcwmL)N$(-xjC$6sg$;wsn0+8u%b~LE0Q_tGUO|1FZV0J$_nMQ4v(v1g=Jwgs8@s}AlZOXqN$zl*4HT0ynp*N%He-g`pB5qSi! z>#=r7V;HyKF45Do+B8Q`8Sr4`xbtf#iEeBkk$!-6JmYH2fzy-q&9_RawCLQzS93$k zr7~DEi*>{ zLcJwXfvLN%i)R}Z0u6|=mn)Vt0cx@E7SMs9qkGtbUg>lON+H&Al?gvBbW=yaQn}T` z;2103WhJt$fx5OEhpmFThL;*e6?CEmnD)t=djA!_=twnH6h$?(?fHeo-D8`q~Dga_EXFcc6b84YROKC+lKECebc*Jd@ zKzy?Cmb@e64%WkN;M8)*Bnux9%MrwnKjrcmQ#n2FqE2K(S{@sCe}w&fC@P3e+14R~ z2Hw4VQdT|3PvpbI1+@iyQ$3wG-smylDnO zj1S1q_Hh6a3O?IAl2tZ|Y9U{u}C^HU5VX5Q1ii>jh?awbMAF3pO^CSpJMfaPXZ!_({2x~h~+>{XQ zRqh`WMubAh~2RWXeE+!h%12{ zS73+;u2R1bWbL@xuBcHBDWEKfv<~XMD~Gc5&R?$i4yJ*ZvbLc2inGrvmZsr(g{!hk z&uk&67&Z;X-Xq$W{E>L24k9Sg=~oqXGD1^$jSv4NI(B_V8H$`S5tX+T&qWDoTpIHl~$)c|UH z^N)VP-aD(qN)m$X4^fj&I~NYggy^={FgjKPy;NGK85%_r^2xG~iXiVdOLpQ15r8#o zLbi@)fdt8?(bea7`R+1SHWMol;8l^lgXUT^xojd1`23yhR`jn_r^Ei1Qc|7Q_wVkR zfGa+(VROa&21OQAO^+#s6XZ&X$aUH2!qo8<|ESZSSY$0M<&%A;YUSRw-E7wc1ez_( zFkOvOx~+fR9x_8`k4Uy96Vkt+pNKc@C$#gt?SH$+p~zI6=g1BCq&xM_wVVQ@UKN7> zSNf(!kI?YjJD{ zgT8&|c7{5MNn1+mcdn;9t4M^;y&;{v)RjV7uRbu)r=}vZAPRfxXt`hg(Xw!q&KuSK z)iIIOS40S(rFR{*=mclRM*J;VZy*1Z8KQFhqDPD3>MPq46BFz^Zcq1=bx<}&+49N& zK~aYKF8VG?*j0z_lD3)7i%tJu&fa|4vg|nTE0QwgP{<0~nrzA;*$V$*|L2H)r~4jw zjCu(x95Q8b0B3>#2(m$fAcdJA2@;?P5J00FeY>mbIDg-l-^$$Q-hzfYb?)AK?OZu$ zu3T#mXR)|gTQ4dFc{)dzzP}vquHBstMp@CS`WGX~(EU29ptAy!f}&L$hQz7tz5T~@ zA~r`K`Ehl#v)2a1Ofl*%YsQgR|2(BM$$l~tNv%)Y1nl>*?6KEp3>*FA2t}vH+IZrXEhn$<^Z%lvT~R|5 zaXbV*Ww?|emTgIC&qG)+)3=?33IMb+rYEtrfW8NvK)L(HH~kF^Ce1Lox3xi)W7>M$X7+IiUoy_I6d1v^fS3 z4VrWlC9tUIxrt@s!Me+Du&7q*k3 zvP9jhH1XJNB*e0XLbiWarO*#&*_#X%t)b`3%Cdk((V6atT z@VU{*nbQ$zF4-Rgs)*}xv2#$NH2l*L&}A*UAIELF5&>o6=@~b1rbfNVM5akF42B)z zCC(vI04PZOkZ1QZ?Z_fF(H9|jCPbi*r0k!dbr3?8zIH3OWyz(^D7V@|_o*HpcU$ZL zk=Q1(o#l_B10`ENXE%FK_aBS94m8aufvA~mkv7lv5M!K_0+jjY?^!*hi{1`i=j#Iw zJRvxc4Ycy3!N9+b}kI5_+DY{mT;VMC*e z6gHkh(N8xhm%zn#^;3ME>@5Ew`mPA$q#B9Uk(5L|BAkQHdf))C86 z{Nck#72%Q0IKs%bL)whRaQ`LyFdTSuKrzFD!YAq!pAUFqJPt(5RUkT7>p}9Lv;XGh zzXZ|c(|*84G)k~mPZG}mebcM&eHw!8n6ET10lYr`-#l#>to?&q`+`rvS*DmEp;29` zNuq%lQSqb!!+nKTteR!p57@Cyth+7Og}KBnEREMQq*w%>opYgVyrx41G-3|zt`7F1 zG@z7!up9ycvs_&sDW>42v)knEt-)*Df?&i!Bk__6IxEe8o4J)N+#YdPwFc7@bWSqQ zB+`U0l&@*iIYKsbZ5I_l(!YK*uC_E>7M)CqfWV*3AP?cVMR77g>KZb#<~#O(E<|jr zQ=Q2b$!f8|ShB)RKg{Aw_Xrh3jn}zv49!-0l!A13f9=udFi-f_1~B?QUr7(tVbz9he?$6ar<7tN7aw9Kf`=$MGPIll1#9e5Cx0 z@9-PFdAuwe+izsG%L7-PF6g5yD2Rl;eS<0nJ*gtRyVFx`DiY+zO{QI%;V_CIOkQy- z!+gL#M|IGd_JiZ6%7_B9M7f@0=|*FqiKb)aSgjMsDOK*$U$aert!C6;6`{T4X8uw~ z!iv4%pNjL-xi}VN=03RKS#a@OGW@XRmW38x(uMo-x;kM=q&UenwnT-y#vr2ootyxE zStS=l>`I;FLa7o3Ekrs-1pM7HQW9>EwvxZeW8#%HW{`Kvf>)O-ZnoJf!_RAN7_HZei-YaY? zZ|`%7S*{oc+kGV}+A?~ykDHAZjAROlc58dDJUni79vv!d{h{++g>m9Xo+ff-15LwFe4+7^;hLn6x-n*^?J9tZQ}|Nv=0aiza7rPE(uTUfeQ;b6 z>8|X?F{ zZn5dN{(weWliT+GS)VRw3ioG$l9W+2j!XpDI^iJFK>Zt4y8NiHaU0DySO5nr|2KLi z#2Ey7VW42Ikrcd9bB;ksY<4uKCa+ep2AFN=zjMrX8J}FI8IfB8W_L-hHDVQ=?r9MN_+@3k z(@lo}4A=v^fmB1E;Tm2ht~Wn6ZHFESB^nRZ>obNU$ML-`4H;DgX+?;QtrXbe z8*xpu3Xx-=B9&h??Z#%H)Q4z%j(?whsNbiJr_(^7s=s8(ekB8YiE0~+bty*^So$p@mrLv-i~$~2|l(b##AG#&(W`rTfA8v^Nyx zE61CKf@Z#UroO;=d-?lS$BauENDmwqHxM^hcB+d+7o=Gl+cu;;m$VwdW$_4d^XphNRY>AbZ7ADTvVhh z+xlsiF_%4eGxMjkyDkNvqTrO5)wi%;Jti7@tW)QPrfcAm%6fDJ+JnZq*TGWKnUg#H zUzY4b8+#QAK8dL?biJGsr%I=_NE-FoEBu$}srLFPU$r`&hu}NsfOC&7rf^aRFTI~(&QhOv zZi(z4#(G?DRqJ9T%IkXY+~8FV6s04P%e`1oz$i|&{$nYSuU+=uS+)lDzQP#I%K(J& zsR&0+jZB;Zhr^3zS+h%dLKo>A!T?+=IF075>rOC`)aOk4IC9+CMbQe(S|s+2-U3A3 zr`B!D9x8yLG0OOA)PtQEZtSjVMgG&woI3s>DaLC*DnGQ$!mtF1VGH>qaWvv!H%vQE z+|$l6E*Qx`D&0$fH@DB`?Vv{!C|xB4!_6p-{UB$b{wHBqXT&+kCE(MX;EY%&Up@S( zes!pJ>qUA$sF1cu_XPKG8{aZpJX6^F(HH1kg@R&@vQqrl>$jO%XZe2$NPpwcLW%Mz;T zaGPimyBlO(|GYXQpz<==69)7m4`DU#1Pt_woX(6EFeJiLBkZcA3zdF0Vc@~xC>KO~ zW+AoAY{QNPK6eQ^8eqZLjLE_6H(B-aN^=-AQ}N8YOcca6hA&o*bP9+6^lNEOIgvpH z&c?Bi7dGCNxgnhFx9bDv4mi2YWH-O;M>f+!BRwkSgjF>DWUr=c9$B)-8UmjgSSWkh zW{YKvRu&%iStdIVaN61XZn418TLi01$v>!^L#*uBGV;Zy9DB9Ks-Qh3OR4QuRVd{? zu<`wR3R0el)ep?JWz`z3|Jpuh><#>6g56RTGeL3)apn0vrImkMjPQK8Z#74=P8o=i za;3Vh>c5d$sgd5yUA+{fUG>d)Dc|8tdfIp~{&?WP9N)|6gg`VZ4C$E$im}|z?;^W8!P(wgu;cQb+#W;U8R6U#Y=`zr@Y1g+eHf1tW7 zd*Aw%qk$ZJp$+E!fTBW_P)!-FQl)GWY~O<1iHgH0tYOm0jTK6A@l|53a&XHVrr79-euIHglY zdMGR9f@QB|Sri#Xv#3g0ltqyyW2#aVx4c*e1P7~a?LZBcY!!Y>IFESP{e;MMQc?im zmC7=d+F8=JUCU4P_+lj_C7iV&W@j`DL)k`EA3COs;s}x`ACXqcEGw{(7Yyf#ji4^d zWQd#}yawo3e%xMuP79Bzv{QhaXwO&Vv9Ly0^b#7`-nZHD2L5ffDJed#OUcsL-&7V` zH#kPmA;I=-Xf{mt?{21+CCAu>OeRK0^_^1W7fQA-Kky8R4$vPCq{3}EJF zsdmj7%;PhvxYwmp;D48?olx|vXK3&gUeM!vpRGvADvoB5rK>-t=Bdg+z{nj0U9UL z62T@?1jFp@yYaYv{SgS1K2@vRcf z534%(uCMZZ*Yh65K{P1p2ceOZPW(xL#j{Mj8D z=^h)!Hj{KlxVL_FZrS_XCy1_g@{5K0_v1L-pN@R9>%SetM;)EvI7zuMMN{`Z*D|i! zv&qKWlkwDExD0KQYY~O9s^}~a0%Yfqn5X$XsN9~_imUkPQ`;k#NMNgp3v*M?67rE^ zuWF)|uZ?X9QZ~suUincSI`f~8?;T?~&+wcv9qI4s$a7_>kLXnhv|!18sNy|4@V&t5 zbznx7#TLnXj+b6GS@ZxE`)@^a??-UYS-5|R+L&vv6A}7rZ zY2|kNPEyOc7y+8i?)`Djy{+AQOgWnoXhUF95g2i^A=Y#}D z^pE{#DupUK-=PU3>08@MFXeCd!-n}8UcrspWKbc?LMh(LS-z2i{fT);iq2se%s*`%rDzrc*9s+O=RC-8!hE5VbCtE^Zi*E#1&4VAx5u3s7DhUxvVAOX zw9~H|0Z9fZSs|j1tqgKqd$QPD=@lWc5G7k5i!-m$MNe+l|!bG2-2hm`dwDMOVnwicMvcH!t6Ppcp>g z#9?>@PU)zU<~gw@Ik9e?!$dzBI$Tx<6v0BbzjJ8@E|tn<>P4I>$olekOF7;IoGu!|86 z9R3FB)v=BfB}H(@wWN-sVjN4q5<`G>&ZxxACE(U;=>DlY=(Kg9zq#LJ^k7P0Oemt8 zm?gAKkzQx)oLqix0+SOw7MEpaYN3;Wo}`EdGI7KQb<}6U;MeDS0GC9*Tu>eQ=;zrk z=Tp0Fe-w39Y6oRC>f?ms369VTp9#a1CFk!XB|xG<_M@FsHh^@37GyJG0gOk?i`oi9 zqod!xvjNvQN~}96L4mH{i$wrcMG)m&eBW7Hr*ai%F#9QAEhCa`Lxy3YjogjK>HaUUh#g8 zglg~9*<8l)l8F+xeNek#IGRel4qH}I3sBh2PL!4?mQ#CtYlR8)YG$JnEr_Z(>`B(g zStoE9ahkqGMjA0rX5qAM3dxFuA;4x28m00cXf8LROuWVbMt2RgYpMu@1%SCQxc56# zui%w_k)-RlN5AX_Pc(`%G*n9@_xkw3GBo@3?otVA0nLr5maKM+sKC8qC1iuslRk+o z3ng_Ff*eP%>55gSa&h9nTQ?8zQ$4{QD1SHQNJ$*lPa?z_pA;0)Y#7?dyG zi1F(`ndL>j1mVTY&sSLzPHQWnv!zpYphx|yKf#jyY^}<3k0^{+45*(H#EaWxkv}b> zc&w~n-ccqJOIY8GU>4$7;ct>3amBmAim3JjKE6OZF{v1;-i(qj#-!>Gw37s*5{QD= zcx)|Nfm3B&2lWY8_6ZhHe&WY6bk;CJ)%UUVZ~4{PFuK#CC+7Xckzf$iWU0uKoia@< zR^yD%|IBN35R=E76Ve%eB?h_0%_@Rv(5?g{LbRsGhp|132YzOzXFL^d^v+dzNng{gZqfP z=m6RS-<22nU~xR!HLYO2wsS6SRzim7lCs`Csig?s2KRe@)odkO0F1$WKE;;yktN># z=2q3TblHEc;ir|=8PI2r^QqFuAD>^@?a*yq!NamGCkd>5gXvwuwnjW*@V>P}*Ln5y zb!|`nEAF9ZFW9ms#;g&0d+9)|U|D5BlvlUk&|Vx;kl-5qd;}WfM8TYqyH(yvGB^1c z(0pu4V1OsNw%_hEIUlAg;13n(q<&E^6P4>(rB;mv3TivNBi_8m{eZS%_Fq~jyg90z zZGdZ$VFFWl&7PS#RfOH?aNf?cO9?3;`3I7GTcs!{iH;!a8wjEn=dAd6uGgS7zLV&( zPL-?qcSFdyJR?-~l=Y*jNl9icELtrY)1u9GJdp>|P@NjiF%zEZ**_yFKP`^EfT|<7 zAJie4ZP0x>g-T9HZRpbWA!a0tY+8sX-NZA}lkGU?_M#75Yrv6JQjb29VLnuqf_zWs zi19zLvR~lWjJC-dD`w7-Z;Z2LpMF4B|x?2jCUoG%2)p@^EC(9_F(E-lq#34-1 z%yhEBX0tsrP1X;YsTBBF2(R-^z?6yENg|elw`5|+r^5k9a%pn`XFq5su^zVSy)t!N zsJ)u|{X~>4Htkx{aL{M3*9ys8J()Je%a|Se5M?ulf{~eR2lu zzQNlU-wCuQwX`Ya!bFNQ3pXMTKlZ*kbFwi4jl)YxyPyw~!DI~gF<@D(y3s~K$&mK3 z)~{XN=+5Q1XxP}nU}ao&=&q<|l;|0JXUZanFhCRz>CukD;L#^?w^W_4;NUcDTRrMj zpuU~6F|aAPPR_TNp7%&mgCXh}k*|p&=N)=rG}b$K+9d*<9hYoWEl(FQ$}GS4ka2fa z1HeV0MOWN!Meepue=RhKi^5Z{oO`IZLP;g-`ox=h?VGP2|Jv=3`Zc?86c@7SG~-Fm z$Y^cYy}x;*mz^Nvl%y^O&IMF^Sp+n&|2oRXnXfP$#SHA*prs#X&J_+2nyCwQOkd6O z_(>POxKf=XY%C<+%Ezb8$7P}(87*I*6Tr|xtZo7A9GNvY0O4eBXRsZ3HoZNwiqnEdedqVKCdzfrAU z^n$TttIUaCCE$*2F}-Lbe<5Sj;!EuRMdGWc`(KW2$r#!(p|H-J*4#Or9GVe6wC)|< zT*Lr~7YeAI^@ZeW(_huz4oj6%v#8P2Bgu)RrfTzob6%z;t?JPVsUC^>n3$QTd@+K~ zV*XiDFI>lj>z;c8^Bf%X`&Z$W?nr@6n z>2jt0?2^l5%@i!AwH6A3DJNdMWcFj}ESdktO`+N~eVW{LyN#Ix^tp4imC>vT8Et0A zud7OVQvqM{e)?gJ=xwsKENUyZ9%Me~g{N#ceG78DuP9fVsCD7jCGf;_?WR`wtz!QR z59t8MxD7%%FM^!-@fjIJ5VY?^SIiVp6f}K-8>R`4_CM4g&dUp+P@v|<Ld7Woxv8 zI!7aYkJF98akbZkO3#RX9V_0v^{&7{ubihl>MQs?*d^E=mj%FfJRNr>(ONF1Cw|jdzyIja_zB zcYBgsX^=F9*8bHOE{nf6=gww&@X=OsSdZf+K*xK3Tff3C*gaWXv(#MjibvD?ZC^Od zIrjM`0zAfafmK(NU96OHUUR?f=N}HqbPS^Vt&Et)P~2M_jEA-Uv1U9q>ETlV`gjzm z-EZ{7=eKTuc=C+(Tm(S>hO76|OhI?%brDl1(Z;q#d^LQncnE7ak-^TLDx8XS*eCEz zadf=Ra+bpZmN@)%$W1lhlX2g%5kP0O5)B$MO!c#v9fY&CoEVNU<9^(e>$Ra7h|79L z&h)DY9AA!))mg9E@QcT~wLeVJvo!@%q310Qo3M`)b^b<6Vjn|yIik$vDb3D+71X#Y8Y`iL4(P=#)n3$+RtiKT<8RS!@Dr>nX}JgbwV(GW)`t5#<| zj@a?6YXr-Vg40z=_MT8H{Q9`3N16L9>2tj(f}fweKk533#tGEr)yD+#85iwIjpO$6 zcl=917Q<$h7q?t{($XF??j9wvRe(u==g-f)uDs~Xae<{+kxhQC7Cmmi_mGhjbzE_w zHonk1Wnk&N4zo z-3ffDJXM&+#9b-^6sa0^V>LCi9_C07if;;$SsuU}uab+{2&oK<4yrw)J!cVSMo;1ug@<>7Xz>{MB^sMoYy!AU!75_J0H|($ADTC zoSw0I>iIFj#p^6c=*xA?T$A|C-1mh}>OW|(2s)89*m23+cU877s<~0r3nS7-OVHOA zUZY^|gPJ-ecVARQ|9-zg4a!H^>KuMb#Z5q|Z7)Pv8(pI}WwcdMqwuE``ui$YDw}vX za6(brDOf&TjDDe#Os5PLnDC>aH!BmkNWaVAh-t@(O=i2t>=LTk$BHq9HBgA^th8=t z?IBA9+-;Dit0Nf@)Z6|_qn-Ff-Z=-~8I2~&Itp?@w7InTcTEmvXNF^*rgeGykbHY0 zP`n5caHr(kSLzNE9`lvS-u; zUCtu5%}z@gj~!^^dsNH8Nn*wpSRxPN`9!RtbvP7E93}OwInM0^;U+#~TKv7vZo@I~ zhH&8F7z@GSfZxx`7>b>ui5G;v1pj~p>V4aB@!%zPdW9ZaYK()1_K#)$`>_*%fyK#bxto`H}J|G4U10-X^taXxs~evnt*zb1XUv-}G7C=9{?n2KR^8h?1Yd64E9tZX;BcYpfOR*A3By0;vk=2n8z)lB@ z?Nn(6yl1NMlk&UgEa?6LI^I}V)_kGkw8+^N?k%Z-LX@e(EGVdG8YUqk@0W6b%eP)# z@>~7u7&KMCgy+tJJpx|+1o+66ZQ3Fg$41DFjoC-?x;?J$+^00EcglG!FG#|{MzYRH z^*gR}&N&LhxAC=5%P$U*u_~XCOZYwdO2&nRp8@jR=XZ;rFVvClbf|NuZh5-S;vAhq z@~V*Vlx_IWHsRa%R+i``{83@X727#SS0~Asnh6Ie_NZ~{;#0C1&qQ+94x_4Ei~ul$ zp?t!YSW3h-L;yJkFQB*6cq>1ETQN|#3;q&qD~({ z!0?j+3uiMhjFWhX<(}^?y%l|^SqAGu7ed4t{PFENv1xny2)a+uS(xc> za%9p-j{A+?oXB7Pc0J)=F=ow|rUY%MllK`&oD)E#o()oKe6 zDOP^BiWTPMXByx24nj}<@Y)LF(p&_gW~iZD+{hdujV*Ra%cly$jCJMASe;Ci)u=*c zO`tF=%{N+4TMrfOQx>xz8^3>b(Z~5445p7Rt5@sKT!C9-k6eKxVEdjv@5baa;(1iK zarxQkpqE^5F)w{JzWKriqW3ZjyTcayNgGZ;Drw^5=grYYD6+9VH7f25^O?#9Gi}&d zBKCajEG)O=;H0)d?qV!$_EpIIwkfkFmI6q(^aGgx}nLttUWTyMP^C zLSa{1K8`T=+qJYIgK|FU5^T)pT$)GRx=i!%iHc?%;Is9rwO}-Kq`6GpCyxb~Z7*6& ziFLRs*L|y%vwB@cTgnqpdZ3#e@|o(zx(d1@4W9xldIL1Sa9Xa%y1JUs<51H^9TX zjc+-76zE%wx|0#Lhg6&Gec$?gVG)M?ctp>pVTX)w6bV_&X>O7ykkL@=*>=es_9nN% z5_Wg*l2Y$M7XP5qAW5Uo8`g2*k;k|~2~6Bw)YjbHR?%=4h7w>XU+LhuLNRb|-h}k8 z>mBrkxl9KB^z3Wi=B|fDh@a)Ao$mHNlH4DIn07_sazA7LdnyH9G0))*k@Xs;dSQt? zx%#boAXvau7CNdx8PadRNthG$0YX5v51|;zL^&t1YW+lWollTmShOwDWV1c*`ONJL z4|z}@)cF*Yr%11QDc&clnfq1qgpk!{vhY6NDQjq}&Yi5Kr?OkJllz>@N*uPes!Pzt zRUC$X!B?Hmf9s>j=ou;6FQ0Nr=}?|oXBx5mrU4xtQRDsAJemnu%DCy7!s4Al6|Ta! z5&#E1oVnc>i#A-~O=5Yy8zR2r&PUG6U5SC~h@1i&D=C++JIm~Pox|izYsr=1L^P0D zs;~6~MR_&YCppBu2?IUuDP^PAfjOc6R-MB~Fdg~i z1xzOjwVx4~w|~F{-_5!`MHy-@z8EkakUBSc+5-wpKO$1sim6K~ef%RQ5{{VW)z6yx z?)=Xd(Rb$-86_XiTPtB^TM*||m=&?>Iy)TExAgRkUXD}ysb!nXLRe8_(h*Rjve3n` zBR1PnvPnX=v+hUdGUPEIJt$PFVNc{$Mi?lbjQm9Y^V-50Y4&LkRWkL-iyotB)`hlPzLVd@OjyD&SL2oCx2E!&MT1 zNXz!#n1^NsIjl+*wd+;^KyVN@@>I$M=cmHp9~4uV~>ms7j~r=FMp$!C_9U?p-YOe#$PzE z;k`x*n0VVa0hsf5SD6>X=B@5ZaVh?pns()Zg0fBCu8Mfo9@(=E`fRn>Bt57@!NX$m z*|4j6k(~0nE?+bGsjJLNF@opEd)}`&|K#nnRjSNo4Iw_Wa2rr_!MKc~UD5rfLYNtD0`)v}R00*W%^}E=*i?(PJ-|;oKuuQ1 zbw37oFvnFYs7Y4t5FN&&Myx5sAY*$(&};do_$!PSV?zdO4}gr7BTHwr54}v=Qd@ds zDl5ZtVb%s@)#sv@%lj|ftFu~Ijm!AhAZfE+t|OG&+KG#zdrXRvfy5MNFl#GA0!UCy z0=YK*+~@jhHB4JQrc#y&D|)GBq_uGvEgV*~gOKfW`|+Z2o*p|2+JV!oczLd@SvjUu z`TYv-uW(7Zlxo|UacBi+=&~(-%|N)OG2c>As~~KK)w(X>Yd=XXRln5BEA4~dcN7)(%y)f+%N=#%O-23GWdJUuLk=u4?aUouaQ{%!sTI$psH@?^Rv0_?RHx?` zt)xeb5`n}0b6c3)?PWkdDM?vee0BRyRdI zI`F|~_>p3ahW4OTHgS6F(K04?SDv39h1*sk@2wU;Ov&Qy$lM*?y!`LQQT=JvwWa!A z{WqEHRBq87{Jhbro*k)~(C2RNvhreumO?g(<5h)qS12$udWpQKak+27L>j*kvRP|J zTkq~XCC1h3uHzP(un$&nvO9}Ibm8Z)e?#I$->s;td8JN%8|l{}_2Q!G2%s5{u$czEUcI8@P__YcUwC5Kjp2)AaO@?F*4HXBMAdru*Vlqm^Fc+&9dny zDyVo#08g~w6VeH?T@jGhte)q?gr3oj{A9_n&jHh`bHWJL_UQPh28?3q@3aW=m71ny zF>IDy)F<@7&o@TfNgyz@MMn;eix<3tT4h<;<@U!9UTOKgDp;Oblpw+&TBwM;xFR_k z?(0;Exm7mgai7cR3+J4MG^d&?aEwX;u-T;@iLV)$iPhO^XTSDB%k&G&ahd6RV(paR zXB8yfdnR4ojnuw1D1^RAZc)cOdrW*UQwvygu7n2S@ja~2XcKbxrWW0yEgob0bC0fQDl*q-&2ASk{di=vcaXsBjnTPEye3qn&;#!y-xtJ>bcY)9K` z__KaX$(HB?JH1Fd6bWaIIAbutMKD~rpQ&kF>jgxRRA;0$I=joDpXk`6jW*RTiz($` zUgCg(hlfx5f)!PRV+HJCW^Z?U_QMHq8fMA;vtB`SEgrF?!bdNPD=Gf?)GMDaO7&*$ zasr8p<{)3%^Wohn%qR{WEl(ep{EF`(F?Kt1w8j2UhL4Rxx#re zLJ!t1^bqR^ZA#!pIw~S5x9sEaracpxoHBK#G)jZfN{5Mp=4jJax-( zuRhRP)3a;g5)E0-9G$`76J}I)PSGb0fLHANcHK$h^oPSma{Gm}(T&nZuNlMytI$74 zquISJII#3*jC)2+mz>fCzv%@VuOB{7DN)h zUB#6*ws8mKw2k5_-YPr_`yNN)FuQk#y0Hno4^Lq0*yyp^@$A&W*&+c8QMDrQ__78< zbwq?7MWhg;aT=?>Vig^W*p@Z&&GvcQ9v`wgYy$sv#Xi#+bIiHt3K!DV^0BVlBx*Dm zAG&u4lN;`5wZ=S;ubBm8G8>$kJ!Mv@Bnd5cjIEztd4Wd|oy8Lll)o#3l~iLTPVik; zD{UkLiM)<1kX3ufkBLPiA-xKbQ+UTo9A^rY-}IXa3ZB9nS^Psr-7A_gXjVy0W-T z_K8cJ0#B9245ao`XxkMKo}(xMjBaD%W~k@ZZ_X5LM99y$NCSoB!&sAs`WW$$ zPX;&W+HqEPJ)Pare0#8$f zVa(Y)78qN&s#DIPa~UQ~9tNW&SOuBttz^RSOXLG9QPh>wsbue!nQ!wWtB|0Du z4;~InP~-!1O|AL}d*kWTbZHPPDCo!G0ihGy{iUt?AZ2}1Mw_bDQ5B4}_UhsHHILIh zDPFcTgNr**8~TcBlV(3Kz_)sCFW+m^w(iAssaE`9XAbrBsuf7|XUEMZ8BLndDlgV)JmgkcvvsHvp5S^_?8-L6js710Y7 zjDSuL&me(XRt7VtQeH_A@LuIEa6VbFpu15VmvMIx*N}(=aR0Uux-?w~>@zV}B%%+e z{YfjbS>pLS65s0rW~d#0y}~(#95CzZB^(Cn(n5ya@n-<@r9<|EAZ=_1p<8QmhcGYe z{kQd#%#~cKw+0migu#8$kG2U_t7zT*68y$&=F205zy8*W?te=*;TD%d^AAe$zNJnt zQLskJH2gRqbbHyqrd{ogoNfKj_@hG!J4@}GsTH}?+}A!I z3s0tIQKgDJ;b->V#Gvkv1hi`L;GJ^Hb(*sdJYm7~XPir3gcH?;NIx#8F-&h*uJc`w zffU|IWu0D_AxYQG(@Mu6w)=(DF-q}YcuLE9pd#|Hy<4@2nu5WRdTxBSFPcbLAOGYk zSC~MRU22XqewZbqJb`6Qdug|W`7-Q}D_Z4N3;3JH%UiFuEXiaL$!#KItyqxlW}c9k zi^no2N;b$SguJM^pV?4ik!M`l3VYdh0uozTV@YTR0VEW+(Of2LSU|ZBH8`6tbd&cL ztG`hZHHAHwM!GWcz#?_oc@PXPYSl)(`*^$A*3xx1f4 zk;R=A3iV!8-7b3G7G<`D66#k?TpzXIJV^H=q80WLhV3W}p_1>nvh906FTtDNEBA#3 zOey3K40^IM9f<7n^@Zs6m}=Rp5BFD64^z_m4)-o(q~a$Ru~LD*TK(Y!-D?4u?m(EidU49wRaalxHK_>sIV|#$MQPX2zg=-V@+Uv&$ zt`8fa2G{!NU~CJ+qZk9GP1ftU>y9C1=TYhVy~H%GQiQrs&hf-x}&?rh6(Gr}Uei-KP&a)5d=;G9cvd~hg?YWJ)e$b;bZ)M-JJOCZ&ARdH58 z&~*-%0p_MSrL|@gWem$B<4JwC--03SZ8sSAn9JBh-${1VV{u!vBK=fBIElGEMTzJe zGPs@L@O;q3BcgQcVRSVno}zkSfQ#(BPGQf4GK`u|`mFe%bI51A+k$+bqmA#m3TFi` zqi7_${rKVCdfh>>rq7us_VHD9g?UG+B8rU4x&#mkC{7g;X$Io?zZ z%ml@)nR7}26Q8^+bE*^cVkG&<$CpRikeDwx$yLAFx2zsE&#+fOfWc_y${;M`)Jc+M{@5=^kQ`a^`4xNA;|4}wV?8IEVI~q z8?f^0S59Jimp4A>g=>aNFJcbX5q4i<|DS4->RH ztWnWP$$O1e#LgLONR~rT&@0!xS&IsCSY#Y^2G+C^o}nE(gk>B0q=UZa#uc#W1+|m} z?jp6NUL(HP2;#Zfby(X<2i1;~Q>7X~Pe7$Sh}LIiN;1Z_=W=v40qWWuI%CKT)N=649znE+#yEWMQ>nLpIJf5_TV2)$o&|9yGH^!y&$xiN+&5Z69g|Kj5uuYDLl3-ORM~}1-<}4v zrorPX^fP}|8O?_`Pw9d%ZRVPauTxz$buyv5#UQQmy{AJG~f#Do7JXSa6X!2*3C=CKnPA%LT$vdzi z(jr}WF<%<$Lh*hJcYF)zhe}eEAG%-Vq25+W;_%ex53Bjz+)#rD^zy4}e~>OwiW>}I zb;B(rCN+d4y}~>DwD$!Sc75~kV{Kn}QE`dilMjF_z2>*?OH8hS`qDsf! zU3oU_hw({*9zKgZ#l0C=qf5~!8*GW7H?#7b%T{)mHi5C@4l%bF+e$`LgGfd%VNDAA zl;#tRn6^v)N|;g$9G(l4!Vqn&?a?0aY2TJl8(3>!@Y0FAgyitv!yma40t9A$=AkxF z|46g2>ViqeP-g9#Xq)6=CyMj-@!_A;stH$-jVgbAL+!_qPY(H`qRSorA9458`V@WQ zcv3q~eCF0Y6Nz(PbHp@D!~M$1N}k{XgzD?Wn2Gk=dtIXB@u5O_ zR+*~Xjv#tftXfrP;-Ki2HpP1j3R&Q7Zbu|+paRFgp@%{owdYTs(H^~kZ+iHLTS}ty z(iWkXsiZQ{{)Achj+E(dL&W;<3H~vPIn8-)ZUWQ!G>KXI={+&gQfvQtiami0J`>}w zOO*RgNv^Ok*Y;*cWtBpfZ-+hdq(rIRF~hL>sr*Lnb*wo^1#OA#9g}19jy9>fwM+kCn8p zhJJ-4L6yFonh zQd5YmM+BI$iReo|<7l(harog}_B&)LO81OHu}cLJIB;blwTP}ad`btRs2l-uH6iJY zwv!Q9K_9Fhf`G#y)(-Bf1`Wde){ZqmYxHuJ5#E@9*QaQ5jvo1IK2D-b3XQr?adEu1 z%a2k*hEywY*bZvv$+jdGg7IkoT7SX4GNtZ9C?I2-G5F*)_}{PplQIgonb0B;>Z#A& zug0N92B0GZP^J2_yR5!&`IJNaphn|rF&GcG-jt|YCrJh7x)fKvk}5bDX~F?p*yCJd;t=ZZJ^XP^ zOWZ}L-rRn`JmuhF-)X3J3UHe}v^O30+o|gA+;~B=?)v(%RFDbJmrB+3qaFwG1g&*b z2D9Ur%4WqKrb=-JX=?2e;mI<{%Q{reKcrM3WB*QveXT2|xB1Sa8d&QtJ%Kz10y=&R zLy05^aqN{%EwssDY~zH*qm(-Ra>wvwerv=K5w(YRvU0n(p_n6X1Ff~95iTK)KKz+Z zyE8%}TCu{eL?g<~O2lhxOAOkauRLXeDKi$vT~XDLfqX%VCfT>XKCruqWVAF4Lc)yM zXV)V)pb(S)vi=4;d;4QLuoY2tUxj)$Ty4CUyk^K)1`bAelyOaMIS-onNH2d2b9}{c zF7*OuWu+{sAf!ihNQYm_`?9-|JDh3;BK-UjgU^Eh!g0>8tzhc-0-HtS zqSR;Jd-x*1cq~oJK$YEobn?nf5CBgqQvR7aBTQ_@u0%i5!s}Um#_^R<3n9<-JeJ6x zynX5Rd8(7wmnYA}6Cs?NdG2nC?M!?^+&q}kD8^eCpCxdo>skX8r}G`-Uh}3giDTLB6044(=G6}7d_yXKE*1cO9hBz>(}2aHu;>o;9}6a;TOO1l#1VW|W^t6nY;&+VunOcaC^ zZFdO^t@g)~!()gc2593w&Ab!aC5)$WUzpW^B$sPs2EcQU1smV(07Sr-D8XV5Gx zSif#dDso%-fGHHr_K#wNcDO5-TuOfL;Y;-ljypr1+NTmrcXp3WaQ4ZalWLrTM5M5| zz3^3q5(Y8$2RPgpdUErp)$nKsAEi5^#uWlEnmT|nc z5?QB~aEKP-l5s)sbvkav4ko*;Im#Hq(GS`?R?0$}j~E?j z6GP|vg7_VY-qep-+7d%PTG;HsYN{z@w#GcmNMUvyT{K1@EP4E}_e_I$)u?R{H}-Wn zYn+~l3dhX8*BJlQ8783OJ_)FZ2s+(TA=M*Df9!eIOUL>zuYlnM%$9Pq23$KFM3qr6 ziaC>>SaLqM z{>vcxfbVjVD*lV$Bz3--X4F9!Zr3MpM@id^_DcRbvSu|DrNdu5cg>p&e&$(b7U(d1 zcYhQN3Kx7*rKAK2?h!t#j`H=B^OTDtH00VCz1%G>X_U&%PQ1YRWVFg<8dSj?vGB9I zei&M9)%5&|2wkE)w!=}6r6=3@=Qd)R6;LzNVc7Pv1!$vzU*Q)jkQ>FzdBo?8pf*@3 zB#fYQgS#a|ZEW#0YXEmIN{-puQ&D4Q*!Ld(q<+Zj0bi{DJc`%5{D@)rsIV|2g?;b) zJQpm_XV`7PIwMz5?O|2m^B4yeeX*bK`||B`teyzbiObyDxPK__q+WW@Xbmf(C=@B? z)@qeF9RD%vIBZ#PzaJ&mGBX%QdlI9#E24wM26M}`{D}7lVwOGo<}viiN0Vl@g_cdp z(4Te91`0g*!8RD-;<38?3jUd4{ znZ-Q$2L7B8J6=6`bPY(0`FDJbB;MP9BdITJmj(2(5W~|sE~4H~um(P`#y!e4bV139 zY{BUE)M)W8r%$QN7uK%u;GWpun7wb>p=Gx}BaTr`bwml*xx>|5B~&B81WJOwmBhH| zZW+TYp3)Cty}A8gSc8xMd(SOz**^hZ=ZA!uf0|l$H7GhYTlpdt0oQzc)cT-GsABP$ zXjnFW8@JXyjbMmI%iW<7P?|WaM>b2+dBJa6a((jEGVW*kz*3z{`BgKN}2gMYpDe z0kw=h*NTkw9q#>jyi8dkB~A^*gFe<7BvEYxTooe z_A52T0RHHY!_twj9hByd>p^^+DF_*?JYaD?wr0OffN=d89dYh*V+p5v_3}q`*{1aV zJ~w~dKB(PZAMJGC_^!E2b^@uB6jVi6+GC${HL9K&o>u8WRbNHJA9ro?)!S$4)sgC6 ze@b?xVLQH*4W^8t1#!mEqqC3$@czrW)5E82+hlYC2nWcDu3_kA({fhha;u@vG#ML1 zK3Z*4$?V!%!2+_XCdzl+InG7+2FIKuh{yh#O&{PJ?IX z-sq#y)^}$BsRLy>hK< z1KJlg3VD6V36n@I!swN~=qg*~u%k>2(Ab=gu{o33#v}0_c3>PZi-iuMkmryvV>WrRLDZG4y zm$bcK3E;j5R3iAMn6_+l&Jw(?IS!*1t;vX%iX)iH>)F0uFrVq$^v@5iw?bpM3^HIi z7u2M^G2+%twCL^i2^2WGD6@ddyUYBH#ibDF+(rR^SQ)cpoG2cpay%_D z-%cbpeZLG0o#)wD^+iirDdD8?og7>Zh~&!@?o17md+v@&OoX{IKl%a^f7!RT9Hfc> zod?XsN28-TdUF=y&Vlv}d^T6QIYaAsa9S$JUo+Bh3M z#=#hzO*Ug+J!jg2zUWj-u*Z6|+0)?qyzmY@#V|-qtgE@9qjPm~R1084v}wG8e<~h; z`H~F0v6^X>cf`UyDc?@7c{65{9Ecb|uboFs(q`%$% z4+-sd{T0={2f&4-Ai$CQ=%70upM~W@lAcP4DIB=4h_6{|Qjc$iBN@z{L5o$qCCd}X z=7l@9pDkGP9qV+GZ;Y+)lankQ+#*tXkB8bYd6yB;s4&zp!f zTqJC4{_pn#T$J&vv&@(xL(Z!cUPjnK}|Nx=8(h z+Vh%kR4%dIaH^R^3)-g5qra3OZn3JoKZM7*M%iQZFiWq?(#UucAVwOWnR6qv{TkTh zg$XeC=J>w+FlJ=z+VVJetqoZ1be;lan7IZ;&zcCG!F^FPBvn zn&@8|uk+wJ^%MNU7+Vc>Od^XV+6D>=S6>*e+f?d6CqMnmUfe+*D~gEX0BQSW0zBrJ z_z7FdR=L6`=JsY)PDCLv;8uhrIYja1n$GmWU6$Tt8oUm>gqZKR->(~zf4a{Y%+ zB;PD7zf**d=VR`9602xJMb3vWcFB)crf@|ylZK9c=xF-_FzjMiyFoW*ePmR%S2<2? z0KRRyV1zWhRd5hGX9fM#2aZs`6bV+OfO9VsF|gkWtI3ua=mewS2XBfPuRWRu8*~PoHINq4O+$+>b8kp%bRE1+PY!7vM<3 zJR{JfrN|_3A%(km_{Lr#+BT3x5rDQZCu(P|erB%rJ$X^Hl};cB(d3oRwUX^V^O_Bp zO7s#rBX6_qkPK67ol1{yB)4q2l1Pi6mfz!8)*y;rxowfH_ewuo#zAM~fUQh+#EF!& zmARAOW(4RhN1YQ(wC5Xmy`Mn3f-!%}{6BoCHJm!4p;k83tzG0eRM2KCCacRPZF1Bm zr~DlW!Jnho>&?>Nypd6C77$FqE+oW$^~83nA&Fm|V2p@d?MR0zc$%>%x@eD)VEY{u zoxChVauFIqADzkTXmZokExqCb7+gup!k@%djhFj0uVbX|q{xH|FOcUSS?!d41m$6iz@s|URdbQ$Q=4-z(uowLM}(h~PNt|m-2F1g0F7g@|S&WgbOhp2rqASwR*rCWSbbI6Ms14xy*OgRI1TKoSa(- zr3DvS7(PPSsY^cMgt0eqi6lF*T_sa;Du_VS&nYOg2>Y9R#W+ZlZ;?db=K%pOSDmtJ zuED`4-zd~*gK$(1+OQZ`?}X(E*G6Jw$Uy6^yZj&o@oi)>O2Khsi8YF(5DN=&q#m(r z=@p#Sg%7*%Uc#P-Cadi%llUwslS;+_?1jjv`=kTm&+M@%Z5M&}>+sOX1Q)r_(qY{8 zs6WgUdk!M`MRMxv+iyJ7;)WPN0Da!*MHJqrTkWL~8ErayqR9vbUzuw)rp7qJ1H;!& zk8*vS_TcLC)nC@Dr1AydTk_+o3;_PHixT)t=jXPCsKpyX^bsK~nYexFYh12OJ#UZx zGk&GD%&pYw`Nuf9j=|em6|Fy+Fv#)}`Cfc_`kSTrElZSg#(b#-h;EUDar5omz_|B$ zOYYJ}d}U%Si*LmXUXCVCc85Rk$^Vr}X`yf5O4pMvF=qkme4VTZtedFN@?h_*DS?Ah zq*ntY_Nh+nsLT(~eTx$fQA{E`!aAy#uNK>QQlcfQ>MBh?wT{G#(c_{LCptv8A|`Yk zO-+N0;21xPF!$TiAgYX?o$=aDG+&F$*vFWCRF)UJP&~nJxts&9tNK7m|YQe1}L~B(fA67hvrD!4D*~(670KhmmZ>@3e5h*}@`j*Gq zUp?kA;BOU2zg>mQDj2EOVe&;UYgFWs4laeJ`5Y^R-}~*BXIM{?rVLd;qqynnnn%MC zDs8Ps+KDdr$a;xOtoSiJ6V`<3(^c3~r8zt4L>WTV{KhqKuSAftT#nRF-J~2*1_s_9 z)FEiLu|tXYqPh8B+bFc!JOJp^@VlC&DwqU}vaN8_@n7hoSY@cV^ol^v_h|5O9$;&d zChfmQ0!o-ABVvS%0+-3*Q~$oJIrKz}jMkzdU=(<@9whFbsuMr%Xg?@hv6|T~&FP(Z zVEG!6NStpc4pvyKz8%z7=KYAA+h-@DHd*jbry2kzeW@HxHqosC&DUbbYt7gpLr<7?+}*z z8>x2lK9X-$-G&Z`Mb>HfbY7(Gx@#+Loaf}@TY>_$x3?l5Arjm$70TdDb zWlL5E*+Vexv!kUTjxYXv{KiVUPJ36`YA^WBo*iK46+)0Vx74=YO_jc+T$#1_n0NcKf@!`|R)4Ro{o(w-1YNZuR>;TNzQyC_TCh@m=@7SC@TX zJj})P=~bfLzFMWmV{!V)+n*O3zji7fgmP{mHo@yWTwPk#5h7dD_T3}Zb`jWRqMB5g zwgkz<{dTcQyu~AWDI==CsgTd`&azw^M|dHP=<8U~)Z zJueAFaRYGH>CXH8uS5C09`9o)V!_tkGD@>%0Z**C5cy;0lb3%vPXU90Z!l)NI4F#U z>Gaj=dtC{to>Z)(N-A*|GYYk@^$P?3{PwGrR$e=AmFV+n^)fXuezMHGBTiZk^hGN8 zMTvar)BGPi7@J|bCq;0xE#Hn@K#-k`ZFIB|?d?m^2Y_7{RY&tiHp(j`&JaZJa=?2R zL++5v02tCa&Uv;Sz13@>TUjW54GTP9Jb%gBH~!(;2g^ulC5|>6(sK+-C|>54=mGtb zc`hgZxpab<`ani|g#yn0XAbl~a6Vmssp>KV0TieRl&uOYUmH3P8FfAt9n>)wo#}Pr zzcgZH;S@dFnx)~pceX;if;c}DZ62>I4SPnL2^L;abO{`ZDCxsTWtl!tzG1&EXYoUp zT)lMA$a>U{T}1YkfdX%{_a?<|u^Hz?*4(Oz+fdJTwTs@S75Ts0ugAAaBly=&;qez`$6x8Y&3Ys+PH-Wufk2`c z44U0UmGYG|TYnV&ninJ1NUHSwWWJ1E741(-5AfO9A&kFSO~IM-rT`?kNKC!#Fw1L+ z*UYiD(uyrSK3>|7pA|OK>v`!B_=IxHEI>%_pT_D&;|%9uJcF|El^uHW&bbOhRW{O- z_BNZ!48j|)Mk|4cl?qG8Ui`?~VWz~bAs^;up5`!@GV0KaJDbexBM4s;%Gwt8QVcm*it6+1=}8;K|3Q=@wD4pKaPF zmndexR}bZpM*f0#p&@&sr<7TTW6YB9oC~gO1MB1OR=)6W;(|gSBmR1ws6<#Zn7_FF zQcarHWDn=|wMHa>QXc8DX5+^`0{^N?E9aPiw;iegMR>ZMYnoEw{aFxRMoa*nQUzgJ zfml;5On~w3Y7W9;Rwa&u6+^aJuw`oruTn$FEpiy^v;(fI8O0)65LyVXSr~zU8ZSF+*eGKI%;S$uOHty0f0a-cG?+RNz22u65_#j9-gXst@0=Q}z!QwgF^6*!KCr0OwU@_FjJX;TQbc zX)AVPx$m9hz!a6z(DXwa-{BTB+b-ZG#Md7lJ9qq|F8fr!F3JEs1xVOdEeU48E(ZX& zii%kL8%pUL=1hHMU@NWI2w&wt05`V>t3;|J1*B;hr|ZBDR`sJDp)tfq@CCR&RNWeW zTv_YRR3SW9iax!7}4i}8(z#}et2x4*poyN8jr5`XL^M&!-1q14hX*O+RD|O9ke~DLcw}t zkNjt|DEz;hmrStf>_EHJB7pAh)x_yIqD2}yWY$x zlSY(1h^zQ;1UZtdwcLzX{gz7>2b^~5>9l073U!^xbs{je9ZGwb^;z_3R+EmvI6`0N zz06+y8;v=(b_)wr=6C!a%rU-ZghmU23|ZG`E|Wk%V*3)3PrCx)1Lm z&HWplV>mI(uad4>qPc8mq&wG7)+Elz!+Uziy&V^4=Jw1mE%ybAq@FuR}a zmL8+P&I=CUeZuHu%M$-!9vyB`(AY`5?^*XCss^6%!tNqPlqFEyB#G`?+1F#T;^HtA6J%KHF+v+Ij**KMRP z-uXLbK1}hta_ZU@rq{hhd#R(^$66K%AG75~9pu!;8QRazBRQE~wl)4-6cC`XHcW{> z0fjx8`Aa9cyQYry!3*x@4fe&b!ghvoaG9qC5xUT&Bd5q0l=sYo; zhWL{REFkL$cGc}YQb94&At=T|B0(|5!vs!Ipc;@UQbs9iekF|744rFefwkz8?zw}^r~pA@yal>FVPpcxgKy7*J<=_o(>OJ3AdiW=+cL{F%8WUM zjr3i9Vs+f>4<~BY%2Lq{uN{5!@aCNt_5IVjgd!XbW>;mr&FYVtLO&U0Cp?n8rIY9- zDjc>!R-i>+x=uLMwitg7Jc^is5Z+(B{2Nsv=?}qZBl~Pi9$y!Ar>8))OXzaczfsji zhA>>4@Rl_4*F}Ov^0$?5y<$ZEbNGYao@e??>&v?GvH(Yqh#Njh-(r(I- z(sGxr7AS(X#!(vf+OTG*KTVi{5wQA5B_2@JsKKqVQU8UCTKH=SruNdtn9b z#DCY&-Ue!PWjG_lwIz`r>wp9RC96gkjKh`hAs2m#}$ew?8 zW-@*3KV$r%uzdx|l^coG72@loxZ zk@4x@Ix|AVXHw@b+)39nTzFs&MWGR*XNWL zKyYkM)1Ix*IfB0X@c&UN$cmi5E*=bz;N<+jvKL75YU8u_sW@KUzE>z8>eO^^)qLyW zu`KY(+jk3B-6r?WLw)%Fy?O&lM??!8{=+M@_kL>c$dv81pBW%%c3)Z5;=sOh^jTs# z0TPr6c_am)*PU{^p1lo}71_0kX;yvFj@LS{?Qu_lJC3Bo9?*GT`#6_+;WhVlneF#B zXNL-+JzsuAOBO#`0=|EJOPs--!_rjz7nnV>EQ1=|b#ejlC3S6yjp_IrY!tAxM{3c+ z2Gnbxzh|q9DQ?3$Kkt({eE~ko>^z&aHr11v0J-^x@>ylr&1C|ZkOLNtWLfM~LN(Rv z;6fVV6skpqR-;yC)y}!ecX@rzmn`NgUU>_vNPaiL!r*7goBtj**k0DRJf!w~+*=W6)0PQ{R) zxN;6Gtz0K|%9QA&vhrnyg$_}zlUb;`ZDl^YIMtciBg#Ry!-E#i_N^E_XDA3sI;=vH zSDmf}G9yE=&XRRjhE0tLsZJ{FZr?3|d^N69w$r+EYQ~lkXERl7pz$+lbcTi9>+N&Yg-)0WxiYUl?oxa*!+1PRO_lqqUkAM zY!jEJs(LI9d_d`OP=oHp%Ws_-%iq?~Z&sH5hblWagP$M zL>Qjwwkkc-)nz{zl`-ZGqUQ~$vZHfaES>Z-5=TN>G6hn{V>zfrQ+UcV?+yT@42zsD zstwQI+89HO$R+zZmzQAZxaX}!5t+K~Z>pX$GqHOJ!v6A)5jq4`dg8`c>lqkz3nn|!0t z5GofES3v!IMcJ%?KK4bG_evW*ysG)n`>B<`z5V*bk88m+Yt-3dpApzcw%Ji2^%Z*A zQ_X8C-EJ}a?h^@()PFOOa&8NBE{MW5TX%sh!B|umE2Iv&V3|^R4B3KR+C|~tdH5yYXkM*F@VWT1Y-fzL z2Z5}JsT2FVEGi4cmamnK-mCjVc}-dUj>FGUfc$wC9gn57Pu{*?EY$7k?|h|_?LT0} zqd%`}x+i+@1*+B(p4MFNoA_M8$+CbPlnZ&!>T9Gb() zwj5mL3vH!K$`3QqqTjC$O`k|)>~jXUh5bP2<-FCA zQ=A?3zyo2^#l@|%$(wgRc;~y^TTO?L^(Nv8`F{qI`%lyBqNDJ&3J}dgFtbAe<6$tO zOHN`)C<}%y4Wq0mCELms4L2|yN`GBh1=rjlW#9{1$RaJMAe%uWZMlAP=`b#^6pEaL8xmkpOB9 zGd@RN5_F4X(;-eok{CLx`!bMFxNB2T)}eD5r=nBrVy?#Z6pbEKHKJfg1Tn1|Fb)rK zp}vzqCa#ki(t%8yJrb6f^YpLf7*YKlFGCzf6+4?t-^yOf#MiK(PFLSIzF*P8Mora< zLf`<%5{^!_*W;a_&kYbA#)M#Q0G zvA1-4AGkt#d#Plh;08s>D4~MxUgmq4d-yzGT)b_?mx#CDJ?Y{*4?kNe;wxV5I7P=h zm2kgb1xp27QxS@AkZtQT46;R*dqzrDJ`!fmCGGANk2xEER#douVGo6*1h-(c#NG)* zDbx{LFXKdLSHoS3YAA7?e{Km8pSW!K{qZ+Q!MjQAW{Je`Own-y4OpOIN-tfhEuzz^ z4~H3gCLY1ltVO$9^Hy;(Vk@-p!PTyYOcm&}GLWlU8avblpdJEi@1xvRUHkr6+@LZf zWH#9_x!VYgSr1Uu?4)*gBW?j(r@O$_sWb<=E6tkZ=744=?lk*#Vj^crV5 z_iBJj=uVtv%-Xz6NpR}^uoHjDtiR0JYaAfjAqbP9Z@pP8N6dzF3owUIRH@H-rIZQV zSu*HABEF{ADj5?NnV}3NMNzRD^*@TBo&P<}ZOu3m?v`#|=|W(4%7Yy)ZZC?~Sb#@c zA5g3duO`$og|;c1r&+fNkEMESf*_zeg(|xzq!sv$)=GA0AyUUJHZUdSD9O0B4?W9K zGc#z#9Pk`w*k<3BkY^~j`PhGD@FHPjii7WI3FPsepLux4_gTVQ&n}Kaiq?_>d0le# zu-8mOmwNnxTB~Ei2A-b?Ws$;WyEi%#$qc2|m)x%%cQfJLEzMS%D z_)U1PHFE%({6ZW;4@v8{HR`Bma^o(qbSK@$UAi%>-)ZsZQ+uZ&=66A zv60V0>|0eVJp9nt1DD&vuemq3kA;J&#x*~5sEgt#IEve0?>W9L2QPd%`eE(KeOB>g zo}iezq3`Z!gPptvqvO|I-Fh&*`*|%;ZgGZLL?APqIfA$ux8BCOjybp|5v~p);F+6A z33U;M%{+d`nYryW%r_dpxWk=Yo^|$VKb~A-6#Y z7dv#UJ#bv^SK;b~qtIP9X%E~%KNsAe8CyXQ?#V%fs+AT5wJnZN*_&Hc8SgxNSQ&#( z`Jy0|Ut$(^_1f=ZNE+U^5~E;6;=W+|PUOIKZ?pIIho!%XEa@CC+9Y=AKJwyhBS z)kD3or;^9R?JFh8tas4~WcSF= zGJ4g+{7+^&Q-}C-uMH?r!_Iwlq+RZd(Y*jNHO9F$7s!0Y3p{)-c;k0pPxr{6S(- zI6{lzEz7#YoH4gKBWbTeo0g=RGw}~l50QIAc4{f&=}C!StAKUe^>_J!rDcgGpe|Uv zyA)4kX>BZp`7u#fNhLcr2l6PH^C>-IGFPBzBKoOWO*5fw?c?WpW{#5`X%)PGqYET; zY2<75vzlBX;gj6!{jHUdxY(_wQ^x?Xy}sX}MTe0R<2Dl)uJ-?B6>n9zeOWc!n|D6Z zD%I>sUH2_|`yAU3;n@?qDK*^WM28L0yjmXzAxMZE6PsH( z=O#_4J2u`AxKrUhRPji?f5 zoA^3Axjf=;1Sf=>R74!T&R!?KP8%ns$6XwLaG~gRKlQl|R;^L-dghKF%l2_E_XX7m z^PPHHPNCpu)-#eP=#z20eR_EbWF8($+1YJ>?i&oS6vo949Tr3W?coxOB*Zv&329H+ zwcEF=8Y%5O-2SWzSujVYYtP#ZO({egF37 zwHERxuI~ODr<3njS@J^TO%E$m4x@}?>hTts+W2*~!i>UfopYSh{Z!I(18VtL~zhjy*VpdS(~l zN&ecVRPGU5W700OE=$(no#}+)e+nRkl;<>3P=S*!h?C3BUiTCmchiWH4vY1#sCwi- z`rC15?Ia@+hgEg(5y?ngvHVagf;SiFl~~T8vg{^v++{_ZYsFdoxOIqBMJ#Eo*ro@q zFh;2_6S2c6zlhX^srhN49j`$)dQLQfvd& z?DSYDoUu)iO4w@n^uuH2icjA7Wx;Q0dE`$jqx^lRl6UIX-v3y?hzDDRT-|#R5EGmz z1x0beJ@Q!>=}Nm3sCkQ+`&!Ki=SZ~WOnT!TnlP6It_~pQgrJ9s+~}~;mF{|Y!-iSd zD8%h3S2sU3`VJ}GKLvC8oS77i+Ix$}Oh244e%iA!Jt}WQ!Ve#$*tw+dwv#4(-V|$J z(kOND?r%=kpGURA**1s!(CSf6S?-Js@*oJWhiPomnBssQ9(}&e+^wc^dHcfM-4(}I z2mP?t1wdpeZdSOR>ugb)`%UjQc~KbLV<6UlmEy>HiFHm}{Qu64?t zC@5QU(_`J0l$ngV*j#RdWPdwqE4k6SKgx&^Y^&uz1~}9zL|M=e$O+WIp^Bvyd~Vqo%^h{ z=bCfe$CzVY)>@P5AtMKxVR>m$f$W!7VEKx}%I7q0)Y#`+Y~6$O$a-GmVR@}R2-`$Y zE_2>gaqDtB>?yO8tH^qps_p11MMo2>oQu^#iS&@bYQ4MrY}^$w*oHRHtJj8rf~{#j zWe||vwrGoVDlStGAUG{LE`P|S3Yhnh0NG)5 znQFI;FMB^D%#nGduP|kjMd(IbrhTkC!Yn-zA}zLsM07MZAObun zr?GLvtbeb;qZ%Fq3tFVr8a*G~1y@S&ww0x7i3#{iII02*a>Q?X@AujS>WVOP>TBYQ zO0ORv(BB@DC%vgWF6>wWCVgVZrSTZf>7p4cgQ_Ab!YtP&O&|x(vJn*}>2GKeSO=w6 zo{U{PazV5;RjB`4kEN!b!tZS*ycBTDiXIMEwCCx;M;7<#>>e6{DuoV(PXnT4geMkCq#| zRCq}Dbh6lOGXoRkn#-{Fq-ZVK_WqM)xbgbyP2-LgFc{0ZcrrA{o#6hoo6Ykc03wsn zK2KZ=_X4fKGXMf^F>n#$_NfgTE>?&F0Q8>{>3C=uzo*vJ$V_OMEhS|LsQb6;hUsl)xd|Y4@r~Q3xrK&Wuvrv>MW&D+14*jbEp&(TC_MP!gnv;TX$!# z#)w9kwWg480 z#qaWrjywPSHLZUT+?>mhbY`F$kzB{=on*h@LtZEI6OcL3frS`O{_Hf_$O46%V@ZuG|;awD(l1vzcjx!+qo{w(7Ol59p z_q;8%_O@llbQ8Az$@!rWQeq_tOSm}mPqaPXJXexEMqVBA;R8>R)7mGA(VfLU-TMwv zvQ<-d8uQtfi`6|0?~DOc+^r~oB~XrOE5<~lx^xV!0}bDn6r6}y*c2}_*~N&;_9a5- z31)Yzsg_0#*0$bKh#6hxRr->5D~LZ>9K2R$)6R;X*bI{drZvq_d8H+35;v4GQFHn^ zkm9Ny;P@&GY=S2vqGD`%$CYhYC9DboPQMnBL1NIY85WXSh_1W5D_3{RYlM@TABtP~ zN1_*KA!EoiVtyaxBiBj>QZaDE7aKwwmg|>p-@RqzhuHW;STQem0=5Ydn5s*s6lv@n zeTc3IOw}>6I?H=*E{u3tz(N@CTcj7~9;=Zcm5IF6)>0lL_BpnKiG>NvHrD~}gx2R` zRNNH!dGt`yb&y8C$Rzsu*VA5qImuARVyo~TbURP-k+-~oTT`k86OVE*p!)0~Ye%QxDN<5j{@ZyN>(fW|(pW1sJ-klEU7M%8c)I{B^dO{N8234Ma2#Hh9wr;k9R2&{W1 zxg~Lsxoa?m)k-on8U_Fa<4u2Z7v&7#4KCX+?l!&}%-Y)?h<#|vR;pByz&Xaeg7TQR zA1q1Zp=paUb3ZZJhL|WK#G&?;$zF%ZTbqoedDn5 z1!WCu9Joh8VqoMSlG}QM{_fgKY%BC=Z?o7S%%c1F;h$5YLTnN2BTzikJwHuW-aY)c z%1pkSfewq*(6JXMb#9r(LZtHmORc&8s}B<>!g6F*Vxt`MCCVvzzNxMXsI zkvgmQ-ulYj#iM;;RZYRranGCpE4Ec9s6f_Kw%dzB1WoO2Mio6JwSEW-h&`1}E70h% z->QkCkF8YYs?t-$3?2$LhN}qn(^ih9@@ZgPl}V17vD)Z0zbz*UCRW&Mfz{uc=k>?qfz7z0Cx}MvS(x&0!3OrGYZ$QNORpufEW;GhP*OQE>%}W1RH%u5}f9cniu<*W%m%0--$Uy#6WFkc)1u>I0x9tqQWDV^p@PpSg62%_ym4#I+Ud4gf!IIyAtLP$S zq61kKQ#^He;Jt?eL2LqQi)oXfyX^Jt!@oFHTYWgA_8I}1kI;7CPbKu6GYVTSn0;q0 zH;0ZcXM+$H@I8l(3O$k4<_~N`5=FsG1142?LAn0xbIcr39dw##@_{wkd6T)D#azJ^ zu~dk_x)(gZDetv=;lyM^gn<*8n1)zJ5I(|Z)DFyvZ2+GEEv5Elv7FAfIJeaDYz37A zKOkjU%Ey0ja}L6l*AHL3{rL9E$;|a0V21@TPSza&;JsJx)=CVwI;kU!r$k%;__L7o zdwe#~5h5beH|0x30z)`UK74!;o{yH z?3tosckN&(wv{1t0yDRdm}-1^oBCwY#}k1Nll>ajGW|I=e2S0rIM&g%q<|0_5yb{l z8u`y-N-ee#;S%4T7%C$(gDpBTe-RUq=_xM#E>9;~(*``W<0rSv^y#}7f4pJ|clp)6aihYS ztd`A9C{!Wq*8ISr9Lf;^8WAfgUkV-iR=SE}Du?qJzH6P1b4oXO$%Ss+XUB#%di|5* zmJZ!eb9t{}QW#k^P^lzhUp5QT4noX#PcN$&VR-ym zR3h$Ihz{g|I-7I#TWu?JJ7}l`cC(MPdq)<>Cl&a+OovihAdd9zX+!-r%Ak_z3KL|J!*g7!@%+9>|>>Z*B}$Azho02#AK5LjWZ6ka?2T#GdhB0C%$0yF(S7~)zMlv3mItFA;cL4|ah1a&>hB^t zf42-M^EBJAC33>}A501o8oBjYaYUO~okJ=G`TI^r><;hgsquPbgCrXt0p{z=rW@bA zq0+~n;3_qx@Z?~u;?lL-9;jR^#NZ%&6l6rzZ9)OHx1jFVDQcOUz;p^bC0H7Akg&xG zBb~`4&7pa=q+H7OA_7Eypzj14OlZ7142Z@)duV&W%qqvSP9}CX7GlrvS?j1f9RVvU zzf6E$Xcut}*3GYQ-8$Lk24OuGIf1kzMxE+h9c}xxa16K*$lpuILQSYT>g3n-I>r?R z9-(?aF=7iw==va-t?<{K-+IsusH*Wfb<>#gM5*W>q0G zB|PN^uuT*=?#D_M4K>fNvk`8XrTTB*-qR9`pX$*Jv+V?Vwd*;@3F2_GXXrt2j7Y4W zlSD|^{xaFb3pu|f`tVWaKEKRU-5>s)hiA9{vCp-p(fdk#{^&ey#Ce5QUOYVjhRaYi zR%vIou*YH`TXM3P7ilz(3ZfQ%=X<|z71wc?n6^~|wOwx5{HmN*534IGY&<5HKK{=T z9u^~;gnQ~7-JGr5O2a<8)`M~EP1rS{(^H{`T4!RkdX024d(>UlIidrsLx^`j2qOYm z*oD{^>`_n_HD^>%8xwqaD z%Eg|SXm>8aL_E;4f*3#68h*^k%1|xqM)mnbS^*2A|ALD_l?oZ$-!Cf_V*;6_J8OY| zQ)`{Hj=GTLCb`bNg44D{Ss60vXOtB#pWK`}3)l7Q)ydcq2Gq>Z3}t7gT=9uE)r|~} z$$helu^6HX@49%ahXpz6!;(!nt>CrLIGzw&-m)!;w9R!$?~^ZvoIl18h1|kg$lo_S zISINFS^m6i`u2;wLkkXKTY6hBPleZm0z?Q3hto7y|v*?m(GGg8t$$HkR<}A<;x6-m7@!W zeul%iFBRJi`tl9N{Mz~~<@QVPHGE*eWo~Ax&$yBE%}c88-@#z150$}GDLl2c9~n-CfKTZb0ft3}x}joLPFheD@TMip>I~v0xBX(`bxHpf;(O*SCe% z+CGht3#G&g`rX~Ik~lb8)=~)J3KE!OntQ_{+6fzub|y5Y5qB=@P=I4NEKDeR)!*0f zQIu&44$>OX{ z&PbVGo*At55i96F>H8Q$`=X2n zI;+29L9GnG+%yKmWeW*HlYFa|#wG2P?EWD0x}b zASvd5V7`-q<_*yvJ|%xqACVgA%Rf32jcRoq=d`z8a_rl;nh)nyvae1D+ZG8=A!y6g zHCLdfZa9RrqxW{#npVT<Y~HAKu-KQ z<2It-nyQzSc%X#QGQXMHarD@!qG}{t)3?}|CudT7+C6b+?!Bke%edtXcO)2~USlIBe^HTY__rwt z$FP#K5$A~sdSStSY5N-wr7&M4dVe?Wh8zGL-9%4g=@W5Ka%HtL67kY?+_bqu6c7G1 zy~x$zO7N3-(~v^Z+{J6-jyp!5f8+LcUPu5L1zh{Afgq$E{w(R5z&<{?0-s3&EQ8N- z0+Dp8>WD;7pGGpp<&}N|#Nzb*q3##{fPD{|-1xl0p2H!R^obnW6nSvY@zKnNRR5?^ z8?1roDU(2AhEoB8KGa%s-2Jk0j)#YT7wz7D>27l_Z|e3Q^*`KnLqjLMVMBCDFdRI~ z0X2NmuT83uo_b85s^=GCW52ZB77(XjUC=B)SleP4Y48mmPpyv_z#b^OE_M=w<1cM? z^1w9HT4rwiR1LH7u=?0zy)@1@8D>zOe(0tRRLA-U0GCF<$-va|s^L?JIBfjze?fYk zAP-(CRxolNpQIx$SidFrQh;N#T*P8ztOAjVSvU;9u)ETncoZM+d=1qvu& zh=U8Olw1E?biNgE>n}PBm8!P7iOt>)H|1r#dk4Bh=>pL?iHR*~6%m@>h40ymzadYE z@OI`nUO$Ie89_d~0)xtfU#LAkTNPl84*J*X9ozq>PCmvUtsbj<VuDXWM$|2G6~I{@!%FDTt{1Nlf_*YW-Tb z5&et@E8IR;LB%9L@LbFX%<}3Tyt;@PO;{xjeE0Bg26WJlFigVTdEq`ju6|^V08IMy zodQz}+!nUaAQ;{%1kU&VZgUOU4LM_#$6_Z2y!wgd3a&5CpcY9STb62br=?KkU4}-8 zV~Yg;Rj|;<^2aH&H5$sG-PXd7Xr7qQcYDd!2#&?{lRojf^%D{BovRfw*dnQGN*^Oy z>&DI`uYD^J!sk=%FA;tywE>*i7g(AoGu0 z!?18>b#nH^WEEc7s0Q(W-Ii^WGJ<1I5137qV`D%a%Mre`JM;C>#cg=AdNFXIW_lgR zW6)KHPxMAZl9_OFyZAS}VU6>R@WWX|cA~;C;jJEoJRNduLO^N+Ic^3b))OG-e+D5~ zIX?E>C0ttj7z&P;?&iX?7s{4&&WwnFKm2>5^yO`Cocns7mv4Hi?2jB%E;A&GiJO0fFIbOFEG2!84Vm@Ucuu@-=|ze%GjesHmC#yXcqSy2*3hhVA*)CKajM zHaSM>*anBgiC~$w$>#* z(Pb?r!Z4oE1sV=#rNW}Mo+yttYbQkXHC)a3sQ?1H)yK&-H72wEuWo->y=3H3h>`8K zmCmfkqMOd8*1cl4UWyLnS6?VsvlnW(Z7vr}?B9D@uD>%XkQ|eSM&b;HUMs$Y>$7JP zN#b>rSmA!s@p1jwEjj91^b|x%5b5ic=ZYyhd-(UIw-1%1JUD^UQ_5-!6BcH&WCXoF{V&xdu)X$X33k4u zPO>`YWq-)&nh`9cPwc7HPNHM(%U+`sv>b0_!i)q3dNONCfB$hdzT1XkGcUFa%_K<{ z0ZwK194>*#CuR|8Of>f;u2e?Ud3u}a_ROB``GhDB80K0iR}9!ISc?L z5gaFbJtn0zJR*B_dlb>?*lOy0OGx-Yp&aA7tP3#(gOI^fLMx-y2_b6SkZ_n+eyIo)jas$FeL4eiwnl5aeiKJoJaQgMwBbC!pmHw#6{P?8ixrzA}O2 zgEiLS^_^iV`MI%_=Ii1O@0Hj~TA6}`Mm{+vA}5?3!--<(@lY2^Y~H78^dnwLkw$4wcgnB3xfFh0#u!irG22`XQY|A3 z;OqbrO7I<8k=OefVQn(UHM+2)2oxf)Sqb}u0nt1TsImr>ib^e1N~+UQRS|C^Hc`}2 z>#Wi=3d8oP8h%G;Cfu;YbS(`q6IhYub$?ZfYvsp1{C0zmEKl@l*Z7_qDGO0L7t$Gm zkd(_-d2BF)9=2zFS04DQ?!2Rs$+YG+TT9^Z@;SXe7-G$1sPs*cvV{;s}v zp9@@fBR}$l>{n*2^ZyXB@99kz@1B1nsmHPd*vsU}hoxLb*#D!u|a zC8fub*c1RLEvt`SrUlN6ds5G$nQ&DpWGFJ(x`)4bPSeY^AQQSFf2BScQ|p0mqV456 z@n>c{L-S0&z-B|`Hg(<-ws$?zc0Hjta-qNxAAB}B)O0*s^_l=r$_3S`AFn?DIw^_2 z+JSPdvXd|WqxW&5v#fldh1rOvaLaqoY@<+Wpy3KkJ#pWbB z+h(%ClmgH+Q#}IsY|0~52_d3WAk{N6wZ{zKKUVC3K_}6HyE*-7+oexa%{i*s-UF<5 zk*yo}V!1NOg&0N}#7t7sX4F25hSha?Y99G!GmL}N|mRHjZjQxozG!^Uo$dpw!9>0{(y%bZuL38mx>n^%{&0YT01s^TRrsG$ntATwOr_w?JETGY#=J+Jqx z+yaB8se(t_LRqeL8Zn&lyyrb`rhYWcMTE^ffY6vERIR>Q4RiZ0nAYfVJ4FWwM&M-Q zxI0+XVOlhLflG5AxV|0{>P?&wv|uX?#zf(5LojJ)l(qY z*x9kF!J=EJ4&%kfP86Y;`kbY|mEluhQuB9>Q$YF_0aKp8v6a2G!+NVhM}r$l9*}T$ zGm6Aezk1$y9iU5s_%;KFNBTD;T$K-F`-^OAwuzpRcBzRi0KyuN&7 zcGS4X+TZ)xr4<0j2fgCyWnb|0OgRY22a=gVFExU$aEhZ&uIZMjXY-`r+uG2;F=PN~ zW#<-g3O!bAwu}5fh5UQG5X;f-dpBmYK*1-}05J*3ds@=PeFZ}o*US=uEQ+s;Al|AQ z5d4M_zIVKqPitiFFhVB1M61)l9XCuyVFvFGSsQoVEcD@QkEiQAD*`Ap?US*c$&xn0 zI$s$M*aM_n$37>S8bj~hd8?Bry1-#&W|X^NJ>6$*WSwi)Hs_{FB-0pu&F`9G}kGmP)ZPtaSFJl#$V8Z_5w^Kl?^4v6`z>AFRwa}RdFREVj9;9fOco1}1L zf-2pJrWssSxg?k_^q*D8c&RsAzI@JJaF!=DIcoIlZh#siRBnM+@LT5lS|k=dGS;p6 zgtAgnv&+>BEVHfBZDBWC%QRO@&3-Yd^BF{7cim_psY_e3_LG0rDsBc>qP!uYyK*up?Q zVtSbs*zScu9n8G^_`ard=wFHEl|nq# z-^?U(CQ1V)G`+s&`9eS{RcfwWL^P9xd(p|&*YJ6dyTn?MNXl~#P?+=3Qx}i^w-cU} zPAu<}0}#p8u8ClB>Z`BRm(99S2R%+vnZwg8*@5L8wSt&0Rrd0$DgA^HWV;ZU36N?X z>)&L#;hMSjpb@nCWWo0XS@!$Sxy`(8_iOH@fiSC8IysppBlneXb9Kdg} zvFt&=Y_ZUQg!wFB4hP{p`kCHnD{cm?Qyv=#vu7Pd*PxWE5G7_bQEUg+whZrK#iWn9 zffF7uPHjPWh(9~_?XI)cebp%}yJk${J;}7U%)EH`j$Y{XPO;(GoNpb17`ea9OzSf} z8x5s=pG|1~M1WCEDeRHbaNH8W@%1=i0O)7f$)#exHMOt8EvsG^i&~4w zv5kgA<{w{;g8}6-^#ZE9Eacc5Nt9^E zN6k~DGPn6uE)(gdbbC#`GmOLP@fnSGYKJQuPw}aALQK?aiW{d4Z40nHFKsGFiGuWi z@jfj1)*`OU^l`IRYfi@%{a4)pVY(D283i`263bMeg^uQh{e%20p>?!+A+ z`A}^BteR6zPsD0lo$6nnVKVV=;+LVZLbbOwfC3pUpXNlN^OX*R@Qf34K1#qkV)oNP zX@OLZ_lvhPUb+)fgK%;JbCNckE}25mz3K4#GD90%LOP)Dx^<$3h#Cocx?QZeJuYSL%dSk;nLj>j0@h=27I$M9V&`*DL#T^=Z4AKZ zj9%c?o?@kebe{38h-ZtC)!RkUJhuBhME$v9zNtX-Dk5Kg`mf7u|zKK{nk1E z8~US_pT5&S?N@Kh&kB|1=QBahYghY^ipn2HI`AAZ&1HuL?PS1mn%(qfRS5Jk6FSZt z=P3h{o9IW307FQQk?NGvF--4~9yID}!&)NM4xQkRsR)*iAwp;bS?-pQ${5Eqs=e~- zYJcbaN9u12&ahz#2cqr53cQP#w6EL(fs4B@9)X1vbky8p2(g$QY?J$LuY$4b3Ir-| z7+fSw!0I*+5Y2-*hz^WJJ|eq#sfmuy^2`izCY-DXGw!G# z#n(!p((T2e3}T$-l0S~#KGend3R3Jj$DY?}_#KIVUF>lq-N(=W;lAl*F}B-X;Q@aH z9u_GOKx^XBn9JbK^>W>xuT2{I>LHH$+o8yRqVsRucm^^&x4(=<6ixS(ie^OzA_QOO zA}Cfw4Jp?1NU%t z7WTOia2kU>UCx3B8rqca+afSHO8lh9DT9VfK9EK);~3g<5VAc= z`{vAmh2?oHJOz=megXGX9c1gr12v)f6FfY~4;C{YYQsm{{vTfa zmXnPCL=R{F{G(g?1HGQ2m?I@*UKeF3u>Wv12~pwioP~I^9y*UU`Ecy{oJ#z)=^YJu z(C`ehFzHH^V=A`^;U!8PQ;JflC|kLdWyj8<;_cA^g}CT=a%qa9h%p_f5E$q=Hvpci zkyv0toVGJb2qo*GRVAG+oIul6cAX+4K*nwc zNuaq33lMRgw%D>=n`$Q6-z;s?&-n|}9ndv-fSq4Rp02O+7)h{z$nAQ&dT~_KCzv&Y zoX(wK_w2>@Z(qTk-YC_Gk^VZ{I6R!yQw+{d;5@g_BTIeGuzfuj@BUnUv$AU3+R_j8 z)1gwW63GSrqSnXYX1Y0gQ#-$OEXWa_O+!Bk9_hc|Jb#N9{-foEJD+OxE!30o(ZeRK z5(ZDtN76PFiSm#7CjMJ&>XmB!vLnaOS^9r~*^1Y3+570#X5;lA*AAG=aD7F~37(pJ93wr7kEeuuG=V7kIJfL> zac}B|TiXJ>myZBFus}ozao>KhPHCDE6=zs@s`-1`Q7S8aC4+v2e|?UA^0k$qrlLL{ z&Sx($YIZ3QM@*cWOh5j8;a9ygaJnUouIh;bCqM#sgw4r3O@5IfaMf?hglgvhj^CAT zB$>o0=ii0b>>GRY{Fgk2m^2;ss3Tz+W?^JU7-jnQq8x8{+?E&w7&v1zg${k*X*Kxv z@K$(ERld}lak#GAg}Qg_=N`BpAUnt2-u?;iW|&V#{NUTPp?@v*(gh?oPJTk_AOgm} ztdaD2G$#(YcXfO)I1oH3Bk!HMF6~qT+a^c*QG`Li=R| zNvrqN`09_(e!~G8bF!JGb-SZ;av{c^IJ0_)QC1?L9|0~phm1%CVzwxp0&OL)tsci} zOE7Gu$7ZcJV++7jI+mr;r1UDi$H@uTS3Y$gb{>x+uL2S>Ya%>(a3j?Dq-^SEgB$~h z3@D?0&M#{jFuGO&HYeyIAy_9OcBA-bZZE#8;S9a^$IoA_{nMYzJy|F+?~0Es&MdQL zT1|qw=RH>L&tCjf?>k)`Ppqr6)Ax`OA6Pi@&AJUnq8{jXXEGS?`=umbkM_A+7-M+b zvH-afl5#Oy#zs9tM_W~tY=l=Yb>iLGZfEi6+{bMsU#5754{=pfcj zQ2CCsllSy~)t7!OU|KfnN3X$o?Dcp$FvFKTB}z$^CATLYVgd&nPx%6WcHG0svUcRv zDw)f^%$m8Cs+8}2d?k9^rGAIbob{!*8svOhZ&i@&fNCte{_al;lS+L1`>Z?iw<%Np z&)go~5hiYbRG9})UUxJx^Fj66o5TqHxpn_9>5M0U{J|{HzPo+d4;?!4&K(pt;-6d- z6TJb8sgog55Ibju_#oavtl|TV;X~18SC_>`TIM_|L`}z21(C$bb?h*Iw_zViOfSXd zt|Md;ZVVjMjbMjfHfJk;)w$~@LnDP3k<_L>X!N)ugs^at=<0%?v?LOTS8>N zj@02eVsoZ~IV9SrSF1>bd&r?ZrNNNDk1;2i@3a>iA`pp3bcg&&YEzh51modb8P>g1SjkA68i+|afDo?o`yMja@40!Z&clm8u2?crWrY@#+|Eqzp}S0% z^ltvYq>W{$<7*PXB0=olf%;WnP-C9Bx7TY>D`nw+1f?wI7eXiX2)%)m^ZMR(J0mS^ z--PGG1zP$Ss@)J3O)R`VA92#0!y$GdxgU|?3HVIy}0xkA(ySYrqf!S}qB)r^q0 z{#uNgFV5eDk+hB2fDxROt|}9xDk-$9c z2+y`?5`!~OOwrRzq~)iE9?+pKe;u|Yu(gBsRGCHl*yd~4Ko4YuIhm`77sYxA*mG@w zc~B(zms|k*T+n~D;#k_wV>^fa(m`6OK`Wi80m3`xJY{nG6OAP*p$&+Tqiowh4dlyO z9e#ND%L4bE+aK{xvZO1&efu-5mdba3Apwxw-pe}Ib@XdNF|a< zt8-+QtJE)yG6N%FrnJvm=#X4oJ3#Ji)#EBa>$|`N+zc%W9eGrY_s>tLc^m^4%l>N$ zAI#?E$u&w%c=WGAh(KjWT_{9MO9#ivquB?G-zEnwI{>VkohnKyjshbKSmXohW06KB zl_C*J`p!^VRcUYpjmn81EW9S2N-52) z^O?M7@6+<(V+O}!A?rLkvB|S8FQr9TdlLr0F@gQ;8(Hj%MKO+$TTkEIB4Esk2OW^x z@tGNa!15{hI#P}ROi)QZN?|Ek5oK|EP?2W{i5$Qu*NaW4(oL$iAd3Xp9%&t`IWQBO zC?-HYvd2grJh}!2?_T(xS4zTAni0cN#_t1=8*UZvvvDq)=L@}*_3O7Ec}&C2=RC!N zny+w8f#ZBf#3sY-%K~%%?e!3Rw+Z{C&OA)MJYFee5Wmxb5%n~y+O3Df+>lJKZIcKA z$aw{2-Tbdi$bjECYr@#QLEJw6S&r`pwk zh)3r1T&1(XucWkNK8FzFa&f2y=omqqT^2Fx9`&OcK3f<9idoTNrPHd4p{(Z|Z3ecf z2!`LPqQ6KWW$#{Ol3=d*F}hTtmOhb6svq+~bD4=37(}>^)w`ja7g>#%=)0C}OQ{4L zHHtrc+6PoTL!q5|wna<@TyPQKku#FHY4i0lDe_HjVSRXS?Xx&Rzr zX9I_220K{ihUpj;q(zbK>Y9WJe%hp$*P>A%*{V}@Y*jp zsY-e5qSl>barTI`rR!bkK323MMCkRE1PibG>hGrr8wwn2MElAcgQ=-#A);`p*= zXmIvt&%d2Jk}R~Vq1JG<(cJ+;In=iWz&QqoGLj?K)#tqk0lfNgM~jU$=uhy0o|;N* z(_WXHLsaf-xIo+>Ce@!_!PAn7)%pN}NNcDX25JyPz-x9G8dTza4T*`c@tL?%9k9lbgB2(OpE$SR`Cnz(et=Q+J5!Y2AcCageI@MG2nb(zS7X6i*|3)!N? zVQSqCq>2JIia3F9C4af{5M+rFY~PKd~x$|n;7juzindZFl{ zhq}0mC_U6tDVEgjZo|3SY~sV@?%1#P#?{~*_3wrxJgc{ggI0op83Tuf(I-|JVoK8D zc4Znc%qM*-fUX1qj@IpGilmt(?Ng?9>q8vw`a!#qqffqQym|n)Eht1sLb_>=?w;`Dq<0FC;^fp_+<;FmSQ?$T}Ki? znmUtrbj>~5jdm)Blg`g+aPniBooYPj9y-f+sP0IwDhADF;shBaX}mkVkRIFpD3kg% z)9CyDuUR^cqc+^hzRWB~C|fvJ>|pf}fqUZ>D7-uM)$JD;lwgTgHkBj=YqB(z+#W4n z8jQGB!|GrIz*m&H-~PppNM@o#Sdgoph%nJj`^u!Vzo}T^Ia|+a5-El@Ngrm=Cf^_G z%kN)NY9wm-Q5labn4hL;TsKXy>4uR^8G2$O!@_oT=8YVBwy}qZGy9Ig18=ls0k-ta z`*HR)q5~wtPHKy#UX2GX#9s=FHNTDx_zi+(r%=bIXDHYFLct9h=CQ+I-$JRC6YU;& z)!W!XsBFzXMD=JG)KO2VO<2pXmQf?Jw@95hfo0xJ9X!($*0$AFzP~0jHg};m1FM3C z?wDo3p5>gkV+lbu8e*9V+M7Q^imVNY!f8oBdUf?VB^E3MzM*%T+~OmpxRXD8*w_bF zhe79&na3j@1B>J6BT@mG6do$uQ5ZGCUn#;wTWE7J&9;aQAn<%zIIg@KR5U%_do$(V z_C8zoj5%A~M7Gh)(G7`@V@D<2`aPcIlPr2LlC*-5p&Eh;MxI(Y84jzk4-bD!g<3_) zJ`Vz!-c4ubkmr6@tcrl)Pb8YG3TVIV!APZcFHgFfe|_36>CZTfIm!570IPD`VFa(=aGSD`E5r-t4sX%29|c#|s577Fr!uxh^J7eV&t2e}Gfy#2 zZaf78Aru^KZKW8udyrBJHKCX4D@Ui@Rdo&j673e zsQTkid0%;!v$&7}jR1BL)B)1IvGQ#B+%e~SWvslY1wtVLh7Fgde{5x~#YY%P)ER==sM={Mpli8e&;RbskSXCRf>& z&xViBOOy8TzSYhR1riTZAQ>NLq{kl&eD_)yP6}Kz z+C=VNv4^Duwh$u%_a^IxNRUr=m0A=e4c&A_E62l2jSlh>P*St@k=m1#N*^-5ZZ*lY zkxKHSEcb(2P@!4_5N4MMg8gjw%pI1d#N-&8$4t!db%{+MW*4-^=y5{Ml^XSW_A={S3c6@&N{@bG65+=q&AuNyidF zyvB#=F`0I^tp+ag9%BOJ#MBvC)l;vF<^M+{Fx?_&{Y>H6Q}}%87BR>ae^*P)Z`IlR z!D64z7IH3K%>bzve;7G`pXXQU?l!O`W@V_{1Eaan|6Qg=Rch*a=0_m&@Dbs28uFFf zALQn`o9-CUtvUd>zLnhU?iIL76QG#rXC@7?dMS9D7sNs^F3EvU+$UZTO_UgFqKb6G zlv3jN47jC#a)xE9VxzTz#w;*xUAO}QsB;u_D(W;NWP%;6_n1I$fL$Iz3p@+R-B($H zqUmd(o9`%sA8cO@Z6U^xDGJi~t_t~?pf={4qUkXK;uIu1a$g!t<#&HP)-;X0Nk~K$ zG#1R#O@#60k%w>L3XnxKDOYm=hZM2Lr0kX+{F=Z|U?( zOG8(G@$M!>dU+Z}b=Bpf0ON0`FsX5jA0o_1UH$`bRk*CosPRr*mnl{kw2)5WaLfE$ zBsqgDm8YW?R4^fn%7I_W>S+Td)Hr*7RUX=*I8p?rad4vgVRlLkA@I$eey=C#1XcMs z=BxnJVvcI*Ph~aE7_dhkVsoScH0u9Hq!HQ#sto!wiVWP|@kXIx2tRJ|Y_2?}x&|rc z=j3glcj1I%+!@45dyHB1=4k*)*rMJT=QeWa$D|fI{chGAQO?b`1qskKZG@0^&@$S^ zKQLtzgo!trP2fh`)o$T4sn@iFYkci9;uXXOTGF`~FG@v-a344+)$QSpZZA|&hLb?k zvmW_@4*9P=y1J@VzkL=2 zK(iE7zidS|kN@s^kyKNzQv^kJs%-6S0%RKn#N$Co(Do{xxy2tIL-u7y9bHR=HrxgZ zHC^yuYvJT)oD{#*?1lkqTO-{2em;=}-Ios(oFX_aFy$v*Js)=tJOd=M@UW6SV>^0S z>cHxazCf-b;1_jaKKB+@I8PlxS+HwWR4HP7MG^evjc15y-lI?bp$*KC9Fu79wZh_;mp~*7MH%q8ta`#yWlXQ@7E=pEHA{M@nWG4`o1kI>B%Uu*FQfe8)(~ zO~+1SkE=UUSOB`(a3I(vA2~u#z?F*uT6XVxL~1SPj!=(@{-IPBJ6vweJ3L*b5VXf_ zD{d-UWwC!pD<)dqdta+15Kre%rmXXJ`?T)%PsRt}>nFJPh=OvM8__J`mGOvSO{{># zJ!@p$L0f9a0A}X67P_84HOzzX=w6T6Vl`KtAXF`g_7_wJtrsnQpnb0FlO#wuy$C;4 zp?av=AZn5=KS7@Ldp_e{xXb_wk^Z6CNUqaL<)uV#F{Gc=={FoM{!3Bt)y`#nbo-(A zoE;NC$rgmIy9uk8`{$deoJkEhii` z<+xdS0_cpgh78C*RvIA(4A=aKlIm;{RV-yq`|9jS(8ANl9a074-`4YXf1<=_^o#hA+qN*S^dHY0P;{Q35CXns>H{V zZG%dr+W4Uue5S=^9zD2X)=BUvbJX*+2c7kMei{+kY`!%ENAj?twi!|6??Kk9S09*7BlO0j;kKWEsw#+-kEeqb+I#AYj(%IQk} z*smHp>Jo2W+cSVeIHU#8iZpc|tO;!SeGF^eG;XjAhiYO>Xd<8ZvjwEG zy51JmW?*$HGiqHA=GdZ#^4S$tYL6KPkyDcEcP09aM=hI9=KhYq2w@qSfx7!}e1G%s zH}$eH;HorN~gn)~vbM4N}qD_6_tYAh}AZjTtJ^OqIf37`!cgc>Rqpw448>V_N zeGdI}eQvX(T-YSj(@zsYDeRPAlxc;`H#4qJhI4WFKU6D#@wn3G*T7>j4U{5RY z%Ak=1rL=r~>zzSc<2>FR#MQ_PMGVCY1&rTPsQ5sk;u*6XCRwI(Bofm-XLD?>>+ic4 z|H3*aZG3p~YqxibL0X{=?IaYM%@y5zDceaQ%!JpRmXsre z1-2;TM2;y-d@&!ACKq*eb>UeP2@~mzEYz;F2qWSfYY&litQt$|T-n67m!Y>oCM=Su zilmvSg3;wn!`N!tdAe;d66COBmo;~ZrKOId_-Ou?PFVy6=g4g(R|XTw?35zSH@K`$ zrgUhvQRsOC(ARr+mS_e{GBdD$;^ts)r2dFxU+O-S7*z;<_TpR4CmtUDj;{WuvJ7ph`%nw2 z+*UdLSnk6<#;Q!u01Obnej_0Kp<66cjgq|Z+(O~u6T2vJr-Vi`TvElQu+@uEsB7qk zu%J2eTTG)Sno>1+{u;Pu&T465(Tev-vaf`4rMgYHQo8`zsX*d;c3vQv zy-liSDQ56G#l(gZyLu*FasIj#tM6+nJjxd`xY+`gk7kL0*4(M6Sh1N!i9 zrq%hfbijqNz=-2qWeF-Q#)flg_F8?!}+f zVbe*OdtdnUi&9YMnnk-QF2L`9Bjn$dP81bh`L!<}NKH^Z?_+%T;!hnwiy+56A2MF_ z>w5jAgnF}yec(Le*ytQ`+_d=+rZ}kzyln;XYb}vOe_7{z#Sim0cl({X@%a{WZP%d* zX$W|XGpR;rby(GrMMPkUe$mhUtOW6iS}S;j!uGac-no&3m2h@xF0U>0z7?8v3BC+6 zd1TifK?PL7-3css&sdO(;qLr9;vI>Zp;#x28jtvJ;2u%TNB~q7WNF=s&{YX_QlEqJ zkZ`sWXtbHZoVz_*;)j9C@vm#spdUc|mE;XT7n!D{$;C>ejZN3*0o)cTOby-dUi@)4 zr`lm7Yw?<5zG!rMld2wqV4w-ZbeK-F0hMNF9T=&eiB5czK1u{?5}Q2FpD8^2Kx+w~ zK6imvzUQ$r?2&6D%WdgxP|En7^9<1V9hKB7Y0JbVLKp$$zMO}L|5lg2t~Fa-)>z|r z)}pH5t4;pT=#-`R3qsmvF~* zcq)Quk&;~J?~mrZFe8K5CheD7tOP!Co-XM`dQJJyWkdm$kd8=kV#~R52TL*=&oNU3 zkRyLbq7GgzJy~xm9hv!6?$g|GRNpqZDW8eEKIs-l5k|eLYZ=?K1KHdfayr?FQL`f_ zr8e-BPIsiH`Ehgzgb4tD?e;xAO-g;xS0--`O;G0=cuptyOocP~Lz!1DYInf_6u#Rv z^ZQ;;b(JTVc?0T!W%95*j0e=u+{C3!{?T}QIydIjA)(smT=r`iKhlh(IREJO4{yhC za%x+ozn7S)d)Dvo^XQ0=G0hW%j2w<_2@fA?4l#Dcg|9m``0pNm+k2><>Fv6Dr^Gc~j)j}I?Cr)5%ti^9VDejOzU_*C3gPQ1XQ3aael*h1Z%kXptn!tn?R zE4_%oTOia+O1lI!h$(lVGFVIbvYd5pa%eygj4bYOJ~w#}J6(l%oCKV`;$*Hg-!te0 z2obYscMl^<&1e}9`m&BtYUY$3d6urIsmYp2R+mKP)Qv6YZ$#utND3h3IveG-M8iy? zB3c(w6N*cO)owS@)05kMD*+1#3=rP)_< z9oYCV95XNjPWlf>k75Y}@85n&z7lX}96iN`=+56GMjIJ4n}R!Q7+ye>`&G>6)Xqh+ z^`ZQ??frjO+oC?!lgD&(I51H&T=3<5MwiGX3GL^!unBFvdOmuw;KCdX=i-imXDkHn z>LfdDt~N+%$UKMG*w&U@fuAB+^EgqL8c<8*xjSLw=U9fVVvpt-%_UVrKW-)d7HOFZ zC@07E{q;C)WOaTp!K&1_rbhsVRVOATny0rjj5&@3!a$J6^H!33ksl(DS5jA6=xW`5 zuOU*2HgmT7R$Vyri`XLcUDXw}K2-+JGveh}Bnj-i4eu|jSI`XmOLh2_PR9fj{2;J; z?t=n>9h^@;Nn)OBhRFR1m7lbvaPi;O>7%X~t1ZO07|J((a+^7T0X-;CO{c_y&Cw{8 zewbHGzjymbe!zklIt6x~N2vjDo}YEj^8^p^DS<%nlS>F)QqnE&nYt7%Rk7Arbjka(j^+Bd%i1yn#!l;%R$Pe zyAM^lP6MB^>3L0bV|Da9*a>Un3f&B=4tE(q``dUVJS!7xtH3W^#YWrZ%G=w- z{}v1JNBfXf2I=-oPTXG}kAQ6Wi-%rq0xj)4#V(wX6tZ@hbN&tw{tS{O0cSqo2Hx1x z6S7W_*_ybzbtUnb!fFQSQfaraqRdEwSZ?|Mv+}I}j2$uV-ff?%6v!jW{6yY zxGB!P*7K?VktYAP%+5+b?cDO)q(<0hgME!WwJ7cwmL>R|hcy4HyZ67RJ&dpQOu4VK zUSM12TGE`n0XO4&z>DgK&uPhkhf1WUfB*|oA|ETW_}6*)U)#oAUzZs^@=&IRSdQmr zm$MUh*D)XyKB#?k$1%{FC8WH+v!}(@i16H{h%w!TV^p)UhEpc9xpF#t*dBUyhGS{+ z49wL`H1PV|5U+}nmMEEhkJaCOMb_m?0`*GGmcuoJNZKJuz)k`u zXY+h9uHGrQf(-!>aqW_F-G&I6Bgz%q-9KH3*OM2lh~xSG;%-g%1YVg}&F|)MEAkY_(rego8rpf&@33*($G*Eo4caqX@!?d0e*shBc2l00pt*9#Ki^(7bTh&Cw&hwDfr3y;`qySnhR7N%A#58}HARD?I%{WX$uVFimBlwYH(l7!V7 z?4?+;&_DgD^+nG%rvH!Tc%8Uw%Ia%38|?tWmxAKu<1g_vBM-17VSp3_plp#>8j z=Hg%%GQoWR4asntYtiu;)sc?%yrXRdwj=dpu#r<(zMox5>uQd+Kx%h)ipf^jL0~|} zHR={{L-}3bit1D*Q@niI$}SMwJW~{fs^o2ZV(65^Q<5r!NUel(4owjc^fvfJOoSxp zHase;rcB*5L+>T;_nqaG@}W}oR17it$Yw!xZQp#=R%uLy`jDXs8D!sH{KwijMyK&w zy>&uuT4dtGjysRZNDjD(U-Ktj#Ed>bC2GgsUY{?k0CL@NMF(p0b*!Ay@>so1dh&Jl zndFn(PgtZ~1FzjfY0+BuMSbt~KhNWehzS4oG(6-DmDtOCuIK-U7C%{OyUdXa)}T4! z(Vwy7{(YT&$#a$@{_iB{^Fhw<-~RMQ#Mw#3xs0DHQ{izp&E-uLIv^~@a^Wx6MvjR4 zQ{h^6ph|-@rpZqlY~uxMKt{DOy0hIX8CXH**FId>6FP^b1UsJsxE*e7p?$nAg>*DH zinhm?L@r%93|MiwS&mVb1KCe_1*;hJXI@CYbLeeJRI7W3$Mf%XV7>RTh5H@Z9)}~Y z6@3>88V6yE@9%F{9&|<=@Qz3{y#9Zw!~Tc`Ce8S$B=MKz3`dH|%&HZa5l-E83upQS z@~+6@@Z_WGyEtaL=vuYq zPi_F?0Y%OYu{EgdhrPtmG&B>R&WZh|uA;ZQtAL^RO=*9jkQmKT1*T#;*ELt0)p&h=7W5ouN z$WQ1PUwOylQ}&0de5M;sHnKhCR1~H6T^GwBKf9p~EMqrhEY#xxqp*VXK%gL{hz8j2 zn%rIV>_PSR>B%nL?2K~Tn*n)59Av7Z#DO*TL5d)Uq0X*)xN1r_^E=K=)3GTvjuir= zF~&FLn15){mx~ZQKW+X0kp|aHmK#x(7w6i6v=DKht;-Mtu!BE-gx)i@)=p-`~Bzd`2p@g7%H!`5b0a1-^TgR>-F7# zCVDJxq}Y$ox6n@-B_Zjjl)AgDI5=MWzz%8ycw1kjO#N*d4dJJ?KJKhqKeZfT{?$_5 zqp-n%k&>HPo1k1%r-=ho!QjC-&qe1AR22^n5J8o_QQ*v@iJ8GqD zhe}V7nHjU9)-XkTYLl35Tu}blxd)U;F zo*)mTfgBsfugb+k!Kt}&_S)1RkrHkLI2a&94{b?mL6Vw$h|VWg(2hXUl66= zRLA|6@pWd=nx{YWR^{CG#G81P#hW$eOOcP0O0<7c^?CK>GpK0*$mL4E$CHUO{?1f0 zVYTaTvO(FF+45l!p8o%|FRWOKkt9iwV62WRq2vI4gzQ%z==XdYICkb5W4Q0lF_+z4 zIBP$AXWf|s)aXJY#K&bUTTG&74?U%)8Nov+U=y~8NxuM`_v<5 zpTyJ~t;uBjr#YSH$5Qk$7fX#ump+UC>C7d^2xy)n#kDVyo5Ic+WngZj`ONKCczjW~ z5anF)?_u_n&M(8VPpWj5pPdx=B8VX5*GFtn<)H^!+qPvq`~o-F;@NL}U(Q=S=P-Ht zhtGfDWiN=Xqlw8!dGp06Nk6R}rX>6KS0>WV|0oUKVNB3R4$danybJfi$ zc`DzPM+2^o)bXQ==uxC`P#P5E@*`#$p1FzykTTcivxc6ZG&{c74d)I~opPvFD^GWv zrXiRsLVKu?ng9ybUH{+JUCYKk_QKZ?FS4!!?5b`C+9kSc@9=S-!fluH_VvZ8$)fs9 zTmy>;<#4dIjj&=S7{_8>QND7YVW;D;dPYR4uPowM)LGMfMWk)8r#pVqxlqUt&Eh8q z0)z(>ruyt$pn{9GAoiu}=JglK%9*bHMP2cGXW#IOq}w<2w2x=nH1|WrRV5y^F886p zuGR_?p1!b0+bs?$!CF00*7KNMe_?viHe?0|DPj0Y<$~^Uk1|zaWgJPReGoXbt-ZaS znILql;<7WHbZfOIsh{-sCLhJ0X<+E3l-ZvK^%eQ=CN>+35Pp_ryJQ-w@YgMvE%8dF zerhHV22sZOjyU4yW`x1vM4Tbwc9xW10I9sr-YjTz#iXRh zxa_+1PuE1efFh3H>^I zC(Ft!bcPoommki%9u+996Z`f!BUIQB+b+rM3KC(;eWg$a#1S}3^K|7_;FgwSC6R>n&Bb ztHtpbl~g;SzTBp;>O7fi?_|L_Pqq=2d{n*Wp&XqeZ1LA_2btF;_PCB7Jef9R|5(5N z*j7{Zyz~(%g~7|ag07*qUCs`SnF4LM8!(Vr4B?}`8C&uo4yvJhTXDm{)?I}F*y%ke zy2#|1_}tx}JSsYdj6gw*Kz2DlbUs;(&O^&Fq@)Jo;O2sDLI60))VXy_?am^-_zPOG zr2tG^2b0}lzeJkCVXsadA@{kYp5`nD_vUWqSv)u9vO(VIZz%aWSKtL z+b-N;sCJ|iue$awry*@;qI89bW$j! zpn#VF%;$JgkAPc^P{-9l7SK{TGrj+}?utz5aRb$Y2V-k)!ImN~;iK}Ig9sIhx&G+S z95Hk{{2fTPIyQ$<)#`TniNIh?Q#u1o1w6G;2fn{5qooeL(@^)IHy?Wd@G9MH=LMj2h0NBq{=YN)qPhB|5C&UH$a%B*~-irrr8GH7?TY<&H!>2Wk^+gYMNsw{dx0=7= zngb;(SQ%-kv07IyVeq?g)A!WX!f&l_SK6*>><56_K2y8A+vPCou(*57^r)1=1YeL< zYu9m5ucZceq(#RQKGr15y{FHZ`H}@q_TZ{U2s6F;cF2mZ8;D?_0}IH{-p>(d7_`bUs}0{fkel}I=Ib9ylK5|gpg zM8lkcVj_XBP|nxp;y?cv^}3UksRo(?T|}@N1Fb5|1BcFFL=f5XjEXZ!Ks5CKssfVt z+^W&ljdPsGz_i_~+h=b{u~h;rWr;F;f0f?*J(jQZSc3nh!{E?$g}Fp9?3I%!uXPdC zC!Hr|UB!KNR+*I0Q&Zg4;tb4Dd4?)Z8fX2s9G1TKLuJN4Yle=H#BcwP4otL5u!`?% zT2UK!K5!R1U7d)%=rkgqXRjkIUsn~L?{w+PW}vGYPW?=TkRXBc3xMeLG;p*{KAS5L zx1=+6i4JN7foOv?I$Do^jmHM#_~_v=l-oO8Z|%~pZIjIHeXo$}%Ev@Ot|xYTGu%k? zo+KDK%{h#vXDpi)i$X;%Une|bH@{a0o0dlwazcj#^kJvOT|y?sc?#wKS+3wo(9Dj9 zYA!GTFny8_LlY1~TfYt2RN*m9?r!Ybkz35a7L&4KrTf zY(|J7kw~Hns}tPVuj(V%_&*iY9sT*+7iC?4L|+Q{kM52k0U>%ET+*HZ=KuV<5Jr%$9)r^qkJs>`QEoMG3$TM9I4 z+E&+*>GF)ouC&z?DP1kOxTiCZ;<3H$j?}yk1h9Q8@ybS+!`F_Ljm@FjOh|x7`sV&V z)$LBx7DyfDKu=lF1~#^5^b9;ux>8`O{husyHPS~d`**ae0&FwlX`b-sWD7en38jEK zhBL8=d6~EISs-hLtW-Q!WlBskb~G~~o#C?)h&EW+@6s04PFqYXriKK5tW{U|<;CmX zu1((=(FDioH9fBv)YK?o0FSHdGG!?8UcdvX@Dt zZ{PGfB^JKruZ%_!ak9x$RVq2cGe>y&zUIpO68aC-Yfc=D+Rhf7pM33WO?GCt)Uq!N zI>O4|t1%bY7H5e9v~7|C+uT~89pAxTj#xHBRjD0dFB@A%W}P?y8rSzUb6w}!1PPo^EkurEQA~Rf!uTJxl65kAih` zmT~IO@o}MkAMWYCd8!1FJ(tFLT5GY}4kF1uZf=a5zJrw$|3g4bAp zKzeh$9F&c{Hp>7~z0rC|j!0HU6Dm7HAb88&p)`I4!gJ&t5DvmmI`Hm6?zWOuw<3s* z2J|k!B5zgN_{(%pFXgbmtf?*}9~^a{)8)eW)@JL-z4k^mK=i`>d7rCAyh7Alo*?}| z?x?xt7xGj3&^KjrK3K^ZZlDCr*W+`%zKg0qciw^_F3$yqyk|!co~3Gc?AM zDd$rLm*ID2m#V5T5<)YS&>Oj_3E=ty$pwD^MdCAl)TR&xkdSJPe}b=lIl0!!9%3##y={CZo@@6J3iy!_jGH#pm7*FoqWvx9w6Z@xS{$492`Z^#aI)|>xBs8-dj00@E4Mu50}|(BgjW;=7iCn! zT|2@Gr_-RKOkJM_1D#$)Q&=6bz%*Z}b*0S=f+MzAoVN0PTa&iWUi?q$t&}#>mmX8u z8$oafU;%H0*YaNfX~%OT$;gH38{}IJL@{Fx=f9$p|Nh|@w1woYT$Ak@RP%x36?x;q z8i+sic|Y`|7st3}KpS-c^1BL|?J4TMv6u4I;jbztQ$NNDOfO$1tn(pfQAfTO<3`>UquL*4x5wSu*9el>AUCcOaDJJ_WeJ9<|%iCW{ zsQ#wj_nUsz>C@H~u?Iz%QWLomm(PG@*u01Ky9Zqw7L09Qqji_nY6S0*6a1t@ng{Ke z{|_~iV}@wm)))&Y9X;NAX3HJT`vc{C(s?x>bDXrPZbc(5=uTU$sgQO2_fp(HurKN< zvX(()w!7l#$5p%~3jr23dF>zc46Xahl?;PuM7A1kX9*zcsQ=`Eiu9QsN9hM+kr+md z!=oUG>&Jk@rplJdN@V`VxJQ@hW;0?GxRNu#@vUhU8Z+e6hm{cUG19+K1LWFU)KbjwFQnfC7mw-e-e#MG7E7UE5!1f@^vWm}ata%D? zA1VNriuC%R(9^z;`4^L>R*~C1G42?Exst;jvbSZFA&%3*cDl@4`J4NgN4~Xe7U8KfbT-?yYA3eupieN3M7{ z2fpN#HzQ52bVgDt&G=v?-Vm~fxO>{S0zhfmkiN~6GOn*7HQl6$hP5xr(H@@v`0VG- z#G>pJ{QYs##4J(8+yT86dX{bc)S*^Xk#M)^eWoo6ObGlpqVFGFdb#P*MmyICAc*D? zn0YMy#~R0ep*xW_Nt=hv|DSdgJ#Uwh4T|c)SE^A{{IJFj?%+q48H5}}E(M2Q2$-Ns zoIkedbTCMbJ!KNSTV9*Iu+lCWLX+B2F4En@zBl{k%!a2S&y)|UO$$x7BrxPx0%x-f z)tkpycuM&jt0zGfu)Z3b>h9gPHDGT=5uF=6n6K$P@`|e)O5zmNg7fT;ue~UF;`eU< znMO?C(95za0qo@Zg!K*ath0yrmzy{x$4Y__(iU&*PjJbH;}+m)_0T<&OXfz4nKx}{ z{d3xrlS`8!pSIKsJ<{<0Ty)gv;s~wOBMown;IZ|wv=3svqFN*f#^2H9|9K`X&4bw4 zycF-_<6CVt_Z^?|voDGnW(3_gAP#-5=Os%PpzAAFlc=c6)x}~Wb0NgP^3Ca4J7uOhlA~ zQXJWJxcWtT)MwU169rG)R+7W{MY_EPX3l&3Y3FTo4L~a>5X`l~K&an7#ItyR_^+^X z2R%Y@(DX_8q*;Ub{_SUwvvP-zZlCWm?1Esg0p$We_4|c-_YZq&t<@LVbl$=A)McpP-#RdP92YUl+};4K{^w0OrhtULr1Cc zagvBLj_(Ide8F89dwH^O5{aIMc{e6o5(oVR;Y~4x{ici9zf)fIh_m;SvwYTR;@?uc z&#L>nN&&eP-g(|K$YvWiYx8ez&-AFFFSrZa*Mom)RPfrZwa%7d>N=4+(bDl^LThe^ zmOGYDragj*8ArE{0&18<(aXKBFY^$W?L?6bu%q9t<>h47=N|f1wy%U^zlE{NH{t+E zbU#!l=hbEV_wsl9f^)e@1W^@3kBGrlN*qLo@Rm?zJPJt)NnN-Kq-JEAGriSZmqs&l zuHTgd!p|4yQby@2nqK&w+kdXiCDR}>fqfI2P9z`Nv zntT`{AL4|6Jx=(WdSZ@kiyA@vl#0q$h)~7vY4Vp&@3lL<&#y_~@N)97N!r(tKtRqW z&#+r8ZUQ?(6j7f5xp0oh8V+MT3GHczrF>+o86qTzNgC{Xj0oz^7+GdU!8?c}z?F5{ zKp^FAy@%>6ST}-%{Ay2;AR9c7hmZ@LKd6U~(b8ZLx*VZRM?sBP3k8E`Rf=@&E8A>4 z_F0wP(1G3v1MnDpfgVBTJ%TGjd|kfw(erQdusf-)z2P-4Xfh#k5qGKGNeHm(>l5a< zIn@0**W%tyZMFetP9VCV9^awtg{=9tx&o%^-q#nC{9Bq6`4o)lb3oTGx1{w`=ail0 z#dLpcory}h%fdW(xs6x21arfTM3EHpuf*lPqAc?s=uabxYp8^`SG>u%`R(m3s7rYacc^YT0W2x2ikGb(TW%jSVEa+u-ZmdoDUP zXt8U7Y^4K5FDtVT)1VPRO-xu!WYy;M#L-%-O3N7~VcMZkkWV3awug z$Zx!&OFdP8L~QX!jF{hw5vDd~3(hu*SI6wr>g9D0Fq0o6^cANwA+nqSGEw1a4NZl? z#b?=s-Leu7Q;rTU4;{NJ3Z^U+s&Q z-+4pvyXPOv4SB^fo#W#H2_llX{bEg@8xUYzE;`qF6uw=vzt1|8P}2Qc;ctPgr^Ly# z{1kRPEL^*lfY%}azvBL5mbQO_D3qJ7KpO$xjgdM3+U)I z;2~4WC(N;VkKBa(+Ji*}wY_~UdIsR0M&GJiv)~pcD!wk^8qMLnK7}SDnnoa-WuxFl z_onjBw3>fLbup;k>O-3YQAxCmfUsOgz33>WnhrJQiYer}f7>uZQKXZ-fJA7P&DUxIyq+*)VOc{vV(We{io1eACJXB($%+)WJ;xVaB0 z0!-D@8X_`Tnvth_rRkdJXnfunY6-==`(zB&F%k+^C&-T>F!r5Vm;6v<=<_%s2#)-% zeBV=aY*Dmu6Ou1`a1WdRET^0g4OE{UH&U;2j!XqpR zuClqr^AN3PKl$zhz0!k4MjPcyotdruTjxHN;HrRoM1VcNKSq}bFGNI;B`C+tlZd-d zQBTrm;Yi+x^VtLCb*ZU)nO^8c+hn8vF40!`XXC*=;v(Aay*=bR>hk`OdprHX0aKZT zHk@p^77XAieZ7-6NIfr`)#YJZRJ-0@U>mWh_Oi*dd6PTK!#a+(^4C^6AsT^MIN&4T zyMGi}0zIh|=WibTK0VhSpe*SG9t|N99(&|`^>h`FQx%$DZsI$e& z4k3t&smEFWChvQ7nJ5kA3ebqNk^3}m`bKA+CMjLrNy@p2GJ%Z%zD$x7$li<(!63 z+qR<()=T2CyQ$tCB^uJFdL$;~B4>n<^qAlGpG;~381kKGAl@ctj@@W{=_*{VXlyh! ziW$6=U0Z8!*b?I4-u@BS!@g}uqG4^hEXRO?-;si<91DP*5ZyOZ40jfMc;YYi+K4e@ z_4J#MhHc1is2=Tymy<$~rjK`=nxyCid zdr*z6QCc;&SxSO$0H(<)q3OgDQqPz^oBZO7X)#e-7)r>;yjIeT!Q6a`zV&>B;6iC9 zaZHeID?Ev-s5!>`9V|BEoFz(K%OYc&={#N`H=;$GHt9$KSE=}jQ{3fYFIHlhVOSB77(agkK%lgoF!rQL= z>snj%gTefYj{Ta5zpZ}v&GRpI^Zj)Vehm4My1WV(Gu4gE;^%**>`mY;yQ%{3``*1g zCLz#>2ue5FPHne#Ys7(3!Pcgg!C6so!mEA?IJ9kR``OLpfCvUe@)D9TWP(i0^AzSV zB#?QmIh9nZDpjdUrRr6^SNHq>*V^lxb6*v&`}^H@-#Pc3z1LpzUVH6*_E{g&rC8?Y z(W~by4RNLb>*7P-V`rb{^-9iGh!&gkFWpFOTL%}mrm&>bd$Q;*0*m{mmlM0o>8AWu zu?j^_ms-Q^ObSS*(Ff7FH|k~rN~QC>sfm7m$SrS$lBLvJz$(k~nUChi2sxXTrxN$O zx+maLqY{h7>ssHHd8O+lyYP~ty%N+M!Q3v|y$%l)XP%+OuV(*p0m@oMXvvBLb4@;} zu4Osv*)redcB&*JQpinY;Rm@|pKIyO2*q*(XU1oDkb76&T|n6Q-Q{X)kXAIvret34 zQ$lgOMq(4)uEF8c1f4Wd%hlPVDU-4chIBQ!Ht-;kN1U;CF`whxiv=ELuI?bOZaH@9 zd)c24Y9gc*q$nkGMK`%PFN)zc%Y=U}CVK%!H)YC-UIT1g>(s-G<|KV76v1BUh0CBR z`bzft+!`B7BsNjFM`t|>*{9ott*p&hRmx-c%G`9B{LNwo5RGOkj zT=IoRvwG73YwFI|)$E1et~3Oc_x9McY#WOwhV zO!&pt-c(l!cHTzz96Q^IomH1()5?L%}#rEO( z$?kc7y)yTGo+O@3TZRT%wS$y==HOK{f7np68)8wY(;U$lOmD-;xn@GGchS`yrmKtK zGL1E-jpRzk?4?YLc)si)Vn_b@VTz@jGoaY^V(T7WF1&pbQ@%$@=_;d>4FH6=q zYdwRqW+FX!gsiR1vfTzCRX}#M;nShEQZw#Ts!2xk&pzL>(HUeVT(;qb`r}u2Br;v3 z9c_6vk@{Ny1()|ynx&%Y2F15TG#s*paP*EbKA~|7<^P%r`wC0HQge4qAIhM^`#}xI z(t^0w>a}Ht+$*(GB12nOy+fR>TEY`-e)=Z?9ICaDHE9bOKgx26XjIKwT zm(H=VfJ>b`#38zhJ!HT4V_3%>)nH;rIMY?EMYontqiq43nax5p8C~`xyuQN{y#_yt z?Fz?@=Fd9mS*BM_e~Em$o8*0V;#Wot`Hv8NUu@X4zQJnC+9#eT<7JWE8m?ny`U%6x zIi6Hi-8*+W?MSUFpdPbJYmrH6a8>rUa5F)k6mTy-WydKtYjh!UH(@Qb6R_&MFNn3r z^kkEG#&JIKmEnn$$b`#n1Kvt|cf%NQ7!sDmWmYmO_Heu<;+^~BcU2Wk5|t&YY!O`e zWEtH1>HRY*BDzhT9;qb!IbRWsBBJ98sD>Xk1bpLxrxeN4!Pib{gRTB~*axDAE4yBCz^kl-4i$_mt-Mz0X$^(&T zn-Ngd>r}Rb-sOVC1T+WYOo!2webDz=vhyl^rHEaZ1VNL!Mc;D8qmQ7Q2o>wIgfJw= zl2`CF+Dh{Qc_o#lsZU1don~nBJ!zKgeMuY7HY_riQ~|Ge7bdC2(RhXW9_u_TFRf;+ z>&OnU-Fc*P*3#3zmsMq}%vet%Avn~G5g&bfdHsIOPzjuCjalu^iJ!>-TAU^4cU68ukQ@3n=Ygr$%(i|*Q$P?pDoiUqv>C!0|Vx_pQs*p(+XU+_xb6| za>_Sn&%CQN)-8UlOry6;46!y($VsU4j}1qs7n$3ZL_U<$!7dPT95zUl}$keFo-UN**hh;R8g zf8?Nyvx1*4uL+#$^DMPg4TOL;d@MU7l8X9-T`x2jtL9Y$Wq8*5?|iH>6$r{XBpWW0K8n z(O)Wz?Fzx;`t!OrJPwpOaPVF)vxGG-cA-b;+8C1=yzHRBRf*n=Z>{YXcLBBK@VWfUl)NlPE^g0h*{LyNfO~_n-yv3{0B@P{}joQ{} z#GNqujzT?0)8ka`rlPsN#ck+Q1$%*q;>vA=Jzf43wu0kWuKUtwT5f=h2<7h;4ueG* zK**69g}Z@~z*1M+Tj;FYKDm9#{8OdTOIu_oNs^Leff%uM8zEd6#eR&&{DfVNL%fv? z?lhXCr*0lpE+BIHWaq2iHe_#xQ>^wVLdx%?gZfHC2UZlC-zF=qFFDg2YO2nVU(w4X zMZ-8KEqM@{!JfW>az97ftPS+EkI1Nq+FzdgOM0^nIqCUHR=A$bhxb)eKBd%Yj!8}a zmsxY2UF8?uFmC;zWat%_FQ0xCXLi3S7*ChmdeM4mW|M%pV`XK=%>{LxX=2dz-*Nx~ ztyKKCME5}TaPE4xy-h|p@DM2D*sXs=cjBbA9m`e>;{Cj}!o1yaes%c~89R&_TAQI{ zDLmo%No%lt3L<~^IQGB0F@4l3rB4q>_2!*SWD!wb6S=$7X7@~Y<_eZxVhyho+AfH; zU2%f^xi#~4{XB~WdV%*$SBDA+L)x+VS)Gh53 zm5`7p)wdMnnvPk26pOy)hJPx5lXhSj_$TJ=a&l%cLJh1l!zV~l?g0;Fn#9yXOEogD z6rW|MXlHZ%^&OWMXa4S1F<;~Xc4{8%lfa=5(!;=PEZL3dd!`ybb ziM}W?KmlY}9z#wCDE2!gb9=&m^!kB~JZrMcQO#wb?QT7z!B2ziyPBxTLTZAM1 z<5pH0^h#!#+|%#>=FzR3Pfk$Mrih25qvVwaUJq%DWqlH-laEZ2-~M;O#G|W99&O4` zHd!KS9OQSs*uWpPioh&@#oN;?5S12~>MazJ3H>_5kg~Qe2hGIsn3MSJ3d* zuUNz;PL0t)a%+z|6-RdNy(`(I8^0l!?Ou}fZ1@mx{GH)oynZ(z=UpkVz3VWJW2`w0 zqu9ic4@~z*$0Bg6_fE8!H9P{WQI*Jt+ZyU_6_!JFUdP_L>u%RO)3ASG=`eGN0y2w7 zQo>gDvBz@JQP9?-GQ3~#eRM#gv=S979txC%_yi^1UiYw-wF|;v@G^AiB9REBHzrXS z6m*cQ4WL&7r`^l8`Cmf}F=$;-S++$}b!;@oFI~u?h~i2&QIgu(4Pn}Ho1tEZM+uZ7 zFVLeJHv%L3n7(Ie^aUCfZ5IBe>8Szhg`d>q{}k0~n{$Ol(`7R^DXDDigGeT0>>ico z=^d#}rl5f7JSdJLDr16FiO{epHR#PVxy-dLAy7Um_rfdEgBX{7X4a!IS-tb)>dQFs zAG=b}rdLYkr0&`>Rr5Qsn(`YC|P7xzq!syklhD#614XR0eP1X z>VOPQ#p-j@iM@Q2m#MYs34B1*$ousO_-?jN7I}?aoD#njQ;$cHJG|c8?g(r8Sgrn@ z*99vykqFsV@`0*?lq!~zPZbf5YOfTHOUPEU^p53*p4s27KzB?Mf-l1#urRw3Yim)$ z@>2%q^`Q>-v?Wg7AI2ZUpsJ~R$jx$Xpe_-HuPtby#ZChYy`g?vGx?KNO3g67biT!z zlw}O6#b0*BBwb5b3F3<}d_EA1mj{Wxcv!z9Jhh=5R?0l>1Q8`F9mwG6AsNQE%d}Ko z`=-^|?fvU2Bd%#8LVa%AvA{I_z+X=tQ9zfvhJT|<<U*%u9fj-Ps9`ssXcWg)KNcRg)&h`n5s{bH5ape_7Gm2xi4|8;pA{Xz^S zl4mv$4+@CvHePjS$JTvP*fX9Fv5j>3L0A;YE{A7~nfN?*>J6+85Az8@RZ=%wNzQU! z3Z96g{q24pLz87&@p=6*@2ya}a|P`=2q0UyM8L|9_E=$B&*|LV%|7C?usJYk8^Wh* zhipvMCmX!heXMaSBhiw;5ZB~Y<8wvjz>G#h9RQPbr?9%NAox@E`-sFt*#9ixnED+?veEV;%-hdW=T*YTDq&7%SU3S{e4Tgj|D{NF|4oq4vj z5-gxn^iok7H25Vl$()|RA-IM@&`>Cpq8gIaZavzNze@$1+6sPXKY~7*-ql*_i>lFbu>O`>u;%7MvsmkF^7i2LGmK>DU3xwi(Ivs;x(ybY1-cvZ z6y4R|^v))UXhz(Sj_}kTD*F8!GxuP&4KH!^G^3%QUOuS0wtQWLYgd6fOS-O~>t<{{ zix!gWk3;TzkA@26dFqfz!lK=zw$hySJC9xbdn61z-o1VXHFib!;wYdS>h&TlEX1Ig zTr92WG{N6C{Ybfu;_gO~aa@1%1$xYS*@C3{B}stQ2Nyb#&~u z6TEbTlxz?P;k_F{oLhd~vqxcDMuZ7VFsab0H`+ zUN#|8PTT8wU0CJSY^?;@(syw4&^9tK8%;RzUk^hLg>J1 zom`YYWM$1|B*?<6X~TdQvB_~X+Wt*>ZR?C-7pii`>`vY)G1Q;nNAUPW zRJ>Oj@3~y-)!{Z`F0Y=bQuC@NTZeR{p!0wE$b?=ro#^|rTo+$j(6D_FI>42{aIp4r zULCSQnbAE23B(AjjPJcaRwNNtgEG_6c(z=o`zAojIq;>Y`Pum?*+_y92&G6jP zRZ8w;4uC-GMn=ZS{tEOiwwPVvA>}VkADJTtc@i|*V(_Qr;8kHZCzIu(#Bk>#xiM%q z5$d?tK!)kSb%*G78s_7iD!r0Xd)Ba_IlIO!QDhSV*U{-Y5psPwXTU|P@I-lgS3Tsh z;EE2<^?*@$U?2g+n|_7bGq1;~2O>)kxG3``4CO3-?4;i~R!FB}&5Mn?(dMuX&zrZ; z%ePHG+*mMR8r76u?TOz4t`vuu2B#9Z4bP$5HQ5hH((`5Zsm}~~b?{*3+=vx^wcU$? zGqO1wDSp&ZBD_;gv>u1PE9C?>N-IA97h@5y1FNGa*${eOp7ShSZ96_hE4Ii<<|YTD zXX(qpM10R6o)2U2F~+MS&YD_DZRnE@Y4=TDr5>p;^B8z7yC``|0}%nG0vJff^CAs1 znKApw^oyub0kLup(i;h=zB7+Ur)PsF-Pv9S93nSlyOkf8oE>s`-T6GWeS`DY3vN%N zNLFdjW!ipbQE(<`|LxN~;4|lIPeiVO3Z}q$wC4&&hw3m0`$*7MttHn=tqP;`_g1ef zrIN+@VRK$9cscH)$%=F(Me;R;lfKv{mAUHo?Wt3A7$OmTPg}CBQ0-KLfgGbyx2m|s zKBXop0AbmXJPE)_MYoP|g^SUpbS$eH-EcN39eO`74rsDHxkNGy9#79`FAO^xxzoeb zYkV*<6eh8078?7f1oD7spSg5e;UMOoCr5D_5jEf=i`DVFvJoOvo+}KXI4lT_GYrk( zeOm-d=P+W}oAV$+5Sa9eRCP~wEDb6&*B`A@W%Bqny56-JDo_6j8E4OY*H&g^o0BUL zg0l&J2Z}?KO4pLV{@OJC(8-qecNxZVA5K{IkW{sZ-)ty>u5ZpzMn3sX4IY-rI{u%d zbxvDD$DkFvrW{~wwGDaWQm2*?X~d;$NgJ_(WX9(5a$^27ObHDUD;jB6f``tx8!dzy zorLRU<~hO;0b1|1KWVN8+R$iidOAMUMNx-&&w^Q;q%*)*=FK`-RNRy*>GP9fEQtNF zt@3G8NljRX=O2`veRz6B1jAV^cDNkyh}NddJ3{f#Zli;}ghv*Zj^3Y%RNr!s(faE{ zCVOw_A%^vP+J-f%-Ou9h&!N2?)4fhXbSZ$|f`U&$Na7L?n% zazE>cAFd%jh_E#jjzmPNXa^>gt;ErR?HVfbdcDd1)fR0^^{(|s*{J{X?#UOAC7LOS zWK)gS>WQd=YTLF^Y;}q;l8^yE79$4=Vo-Diy*(MtLUYMM3cdx0i6k}4*u^_>qk6{` z8%SPNOwG<=r=wNJG8c2$*Q${2;NR`6OXnbztPy6?jZB2(H))nKb-ZgaIO*>&x_|=D zi*$Wj>)I+9EwvKDho@hd=IE@EBE*O9?mZJ-xe zR$JkUxuT9$GGsoJ860)WFWc%TOtypRKxZ?}u zTh}9i7U(3z9&TYaKieH0R@OSjcH+~unamE9Y@!R*!)T+bDm|n$Sy_ro*TwA~rc~rN z@d|(9DDyB+CN8zTE!sr8ulEz0W|c7fKlJ|9mdECflHDcO-ds~CbL)LAnw@8<1vt$< zNC!~A^M1dbEOg{F&Mnh7srE-u`<&8_H}e#wqM3Z;eve$d>p^M;u-pBc8Mjsu0a`gGp=SE){-NgA&3svv-a@F?uhM-oe>BIDUZ7N4fF=eqGMz!_@gSH9dZGbPZ=$ zkFFYR8GUwi`)Jc>7vC*h*+d)HQQDU77;TR0w{vCN=(f?V{NKVIOWrZMYjn@(=;+ST zKFX|)Rz^n`?!R!qg|Az9=)yzzK6>GC{D17i!oq|2KAdYyoJ|%cqhq5ze64rS=r9mg zM{Cr2;KIYW|BVX|rsg*<{M&`^Tlm3+r!D;G!cQ;!$ih!9{QHF`EIg5GKelix*PpWR z!wb*k`j7MbhZnw;mL9S2?bLlVpNCNDI~Sg`@N<;-m4#>U`MHIk;q!upKVA5>h2LHH z`GsFt_|=79TzK}vi~0N!S6G_ZNY!s`|;T6pWihZfFU z_~gQQ3)>dXU)a2G*~0#X_bnV=xMtz#!c~ipT71yr4=jH3;^P;;Yw^1mpS<{ei_cm7 zuZusu_|(N8TKskX|J>p;7N52F{Ka47*9#Y4wD@8^FI@cD#b+))k2}-F-&y>d#g{I= zYVmLR{@&s%7JqB;HH$A#8{@)y5Hh%T^b>lx6|K0d6$Nw~b$@m=3&f(e_<2R1a8h>Q`zVXH5caPsbzGQsG z_@eRUe^36JUw=1w#pGWmZ=C%71!lk+F%O+GMr=j6SU z_wc!p^EXdE!SxF#7fs&H=TnpSPd+-iU~&o9FQ>(esBs05-#d8|U*TUc`5~z6$2ofWh^Y zyNcE?<=2O}b2Vi?!o3TDatY8s234Qq`%$i52vz5C?LA=mad7JcL*Pc50 zdG0?ebmG^MiI(cK`8_$phlr z-IE88SH>%o$Bg#@XEOQT@t(=QGU{{b}q0hqjC@_oqU;Yjcsq4*TIdw+QSa4>x2vwA{sP>&XM7`d_5kMw?q4^)krKC1ek*l1!KYn(ZyN8T+@|pwJl!$=BBd@KzZYNl zao~Ln-+1fzQqJExelvdYtK)Z!KMMS_#{Yo7ykLALSKlSd#|M>Wa#{Zt) zVDESVuYV1{{}z*SfKpd@lz=IRQirn$KQ^Z|Nil_xbw{M zf2EzD!uvmQ`~&0f7Z;DvtK78s1>kL>Kl1}2QTiX@7l6>bnyHcKnCP>Gk6eBe4%5xlhFZkJH0lj?=w($(DEip6aUjk^~M{yHpm0gr(tjd!D|OK9p3VAsEb zw!Z?;fBxiU*vW_R;_t==PQ$;wCT!v~j&GpE-_t+*6}`kuu#vyO{$Iqe-=XJtDQ8ck z7yG5jsq|34fN%SC?DJW8i=W4L{R*F_;vN3;<_o3s5$2X7n z<2fFTr+C0*5_-JG)m1S4w#g4qo=7kHVtnXdg?;`l|6dBWe+q8DG5LS7!v9Xs_&+#* zAs9^YPtT=aoMNxf2b*8Uwtoi<{s<5H-}v=H`pw@0$KS=z{t5qoi~4^^$rl0t&uQh4 zfbm>t`4f8TUk3YM0ERvDGdTaH=zpIIq-W#DpF{0mg370J|A)Bqf}{~BVf zmyQ2q{5RwOLG1Mx1{OIxH#t%X7wYvMi zWcHHTX?*kl2N=Uom%lu?GVAVDiQ^2nO%-3iL8;GX7Ac1D47tfvP>IyQ^o9*8eV&(d zMqyiUB)(~b!dGyA7n4|Pu}EWWx_QI0TPeA^VVN(mh-kFDWdkUd*r=5+f{`z1+qwaa zt6_oZf*bh1ZG&>x0E>s=DYp@{YoOkQ!FAJ(U|mZIlg~RgXz$wDm!{h{xPRU33qZJi zgA&)zK2M3A|A!JALAZeg#YXjSgpSY9#+@6qapUaM(>pe}e={&X35;DEl(}X0@##kQ zZv%#lD(~6=#%)ZBvD$fq5}SeY;ps*&wo>92=c~2=YR?9swleR!N~w*S+Xk>LJi5^G z!-Cwq0myBDV?hDhHPw1CpXIwZEWVu;z`&+-WS+o!>vW?Awu8_1DVyEU1dB*0y%GHF z%-A`L1NcUOS+Z?lwQmEgwllZA2myy7Br8&7qY69R2MEO288(`svC7OjkvUqvXM@&u zu;JZ;JArE7tnCaq_e&0Lo$lYD=IyM~vJy)#vsrk^NkYJ%aPz>1)pt$5DQbu=5`&?h z2+MEi&%q4=+=>2}b96IC$*-@O&aKmp8s7=amK1uAFr@Q1t74tad|%hS8#KLBrYV10 zWaBna;Jp2|^)1tlFt65Iy@q*FvWdnIZP54~w0b*b2CZ|h9?LaUMgaG12p}GNO63~h z-ym+9Zq)jnwBGGm)hH%^+lh~fg^k+2levp7DepX8Q*q8DfJZKP&b9B@*LUN)Xg&An z4;4wlr{0=!zm2z@Zd92~CuU1c!IFLPD{SAUS2n197b?}}Pu5Eva}j?ZPCU8+gxw&o zIjXe1==ugF45v&^Kglgwb%whIJuHQz8v2G&^~b4(XGPExs1-3fYKzD$^vy7*w>cwKAf)a z!c?>T27YLHTmd+I3-*JYi>5aMwLcK+gdWbO!v`z?<@52;1m|kd*T!o%Jy>2Qd|=pHm5PZCsxBx|(<~14k3cbT-`xT<$Lu^V}AXN^@G#7*|e_ zcbvk%*Uurig-JBtXm$QTb)4%JQ+6|u&Y&J?CTa;QY{WK8o$#(})Af+orbDpK%x-mZ z)mr=oFTV_aq4lmC|ukax$5t=S9d`fNnlfqn#rn!;xw%M3Ex3Dn^+#30la=z1!gSpzr36zL&8kF|2M& z_v9|FwilOY^$nV7u&40B&5H(ZyV${WeWUvrYr8b$maah=dTXR4rtaW3kR2osWS4BV zyJl&o?%$3Ch2a@K75I@sCZYxZkZ|atGb-}1Px@2&pO}cCYx+H|FE|}wr|1Gwg z-HqlO+~-nGTin7%GxXFQdBM+!0<4Jy9|DB~5#}R#jq1Vy>K+s8%huBz4A1PBUHxXI_U2p{biiShnDGnv=1a<%;K9We?kdOxdpR#I}5*`PQIto<9BA z14J+|?&*uRLxj>7t2Vn*(s_!%?<*odg8v9cWK5 zSK=}p@n$IOA^3G7ZTscf^+8;p`m&X+xr<(qMnfF&D*2yZ@+&Mat}KCwOzmyaZIfj~ zvPK{$HqQDVXmbUb)L#>n_Q|lsfyHcA#yZOyv^;6c$Ta2V?+6&zDQ+OAF`mfY>+`tM*pqA%i+LuDXh|vEGyMWM*hdeUaD)vP zBeKy3u>fc>=hfui29Zq~VeX!1EDLV_U`GlnG&~Lj6IMWKw0zN=YaPvepM6Rp5$VzR z2kzYw8=Vy~k+BPgq*bPeC~?HNCPbyT2;&Tdo2P)1=Kdl3z*ObaldVnHVMGq+W_-^w z**PO**bd#(L5eqDkroVUJv0_Ti_tzJlV8aj@S7cT1m{o9#66%$0=SGaSi^I$k$#=JZ{!VXZpCC(g)uTaBqy3g_Y0;xM=FQ^c<^mQFXlL{iH@fse0003%m3|X8f z4_)mT@(S)AXaDp4As5RJ`SW)matt%QEeCCT_<3lM-4-L>)1mb?+2@Y?5}P8kdCX$f z?G;2=1XIBr>~ZP^*$RYvq3-PiuKWY79f`)92KqoqEVl*AV*@mN*GTL_6||?Hz$}7G zwvy6$NKp)Sw8pyUrn8L)U;=`9sw#O9gOpes3aDus z;1Q=1gd_4wKD8_KF?P#bMLIjDL-Tu8$ZJXVgN4DLAg25R1`l_3A@6GdcW*rWlPcAA zj|>(Br-B8Lhj)-3u&|(mzT@WSldmFHss^S}TmC2O>=8!GmkyZb9_vdM1gTxqo1$lM zt+LGR8Rbh1?n>tq2soBN6U{dSR^4+0aUoGUt|(MKO)@(F#-<~@b!3P_?p+-k1zGHI zH(I_~Hv^N7GpZd<@B9{Om`79} z%v7K&pk@Z9Pd>O|uy=6c3?-adR_M-q^b;=fa5t1Ih|(aVLlo-k#HtBFFx+NmG@~=h z^S%oC?I|9;94l8E7q^qGna6}#ul($u8uU0-*3UsCANNcjoytK;8cT}#?56*JoJT!+hyr#F36 zvEVVf!HBKc(p@Hm(X|Ru5ej1m@D+v?Lk=i&UR1}!)9R~84Ch2dVIQ4yb>7XP)L?*y zmXg=aGU@2UQR2&a9)sJeQdUNh#a~*)VYK|NfgHp_4zhFj7wH|sTlvUAKfNL*`}>D) zB9*Pw0M~}8>HzJL_zn(jn?4M&HswJvZ9J?OwN>BVJ!oFHum-0A=wQzX^cXrux3+sQ zNt1gA8=8dMkhnaRPFNC~iUA_TBrKb8aODOHLAxE-mg$i2be2XGd!|=F`AVo^Keh8Z z#w!?Z1;0}4x2HRMS<)JAldvasmMx`!F=c9kHhuR^7{rfE9l+OY-E35P`x_W zv{b{ymh*)I6)GKnG7%CX)1G0KL~B@v2x1`W)ca3pN&y@D8Hny4%<#Q|-+N$k^m}dO zLc?AErzG_hkpyGJi2;rFxkh8(;%P(wL0B5+dqLxbjx2F$T$^GAU|&s$T0?k3k!Umk1NP1Q9X zw6jI`5f4pht;>>>NQ8`-4fbW1=K78gufxJr^9P|K6IZU%>*pj>+ns0%+XYNy%!M5h z360uT%7ZgrwUp{N#Kr@#FPYr;Dj(hivtXDQ%7{*LGk*T)fFCOAJp|n@Rp{q9 z&%|C1%l~MK6+|AB+Te;LW>*po>DwwTVo6vZ?C-HcJxXE@Dpk~voq&bIkR5Y#q2e*% z$IvmRdbHMTv1vvQrqh@ckLa7DM0OPPtuvS2HDwZ)j}LHpEuiip^Lq)$+vg@U-^dVg z#g`05U2uovN^hjX2YO1GPq z(8F(r7g^sDoY@PxUEXnCVPk-zcv0$+p<1FUd3v?W=U9_j>5E`QKMiUJLez*(W(2Eb za`rhu0WO~n2FE#lP1y~Ru^Y!zvZYkVReszG7N1&&g%f#iM?iPX&5tG~ks8ns0mT0U z`IK6ud^C=bPkFh}+NQbSWqlaqoVMBK)TW5;Zlycz{hI@hL(>b;)#2>v*`Ytj@M|Jr z516i@18hU}1^8Y);0f3cufdC>8Gap{;;4f#063(TN1qv>lmiemSQpSR-92X}(JG7W zrYpJr0(AJKEXs!zn>;S1LJ*4us~(n`t-ipXROwP@I~hfIFel$NjMV5`X!)~q*zH4Z z=NX1@=e{nto>;jj0{B2#$0{I&*=3_po(=D5K^}~ZwvvkBxuHqYX{L!&Tvov^cDt25ogLir*7WbaC;M2Z>QInScp{XN{XGl z0;)CLg;6#^ z&?X<=$k^$mrJHx_Imfl!+W{UK8Qupz?m*B=%y?E|h)}-hLBH}Q0w?3d^9CZ6Nl2uv zPf=wM|W?UL;zR@F90NALv|aqcky`eJ0k0fhvN;-e_AqD| zEuX(meytmKIG*hedz|DJktTT2)(S1ThygD2L=<<)pPq32P;~wY*Dygre(?n4T%fWi z##0vzxHco3Aw(%xx8@}#w&C=FdJNX)v{{pVM@iKO1IiSp*6leejzEfbWZ=!Dq57`i zU%>3>^o=laHyuJ=SIdq^PzP!)={W>RQ)&6^I1TD6I5j9CoUca1ARCfB+Z+2tlzXuI zUMw)XGa12_qdaJ`4z**`Gf*3cGjD5m(k@AChKPb`)J~YR4?~j?U{-ii`#34e>}IPY z0O718*9P{H0Jzut@8b`QcBUcV^%+!RD`x#)gkNFgXkzUx2LDB$+Zf+ju z?!CYiRiUJ=SlIC$)Pmx69GY69Z6%fc2na`D(#CIE^;L5i@5UpYj+1s2UejDEW^q;d z8l$ANJu*!IMhV{pkJDZm!I0{c!bWA3vSi{ z&{2Co5hsRi<_9=(Gh9iWLwnO%$M-SAQ6YpxR=fb=+my*AXM_a!N2359?vU)0q`qRtC zbd*8P8VJ)>gFEj%T95Cs>Ft?@GK~EkBfjC3*g5ciM{rr{kI#5`MUrf|6EipBH^|m| z3!;}`?SQ$NkT6xTClS_FnR7nCytPYV)5weyc^A9F zN)_$V?RlKu^PqBWdRyjyvQRRxKZ#DHFZn2qUq8Up436FR!Nk(crq3H5oSUsUn=7tH zDaH(sm4^lK|?IY6@aXc7tz@7RfT|ovcrCG8f+6H>IycrEXY< zql1(EyrAML8a~8=#eR0+EUuVQ%xI{Q-$yhlnPkU7egsn~)emb!f(r|XlbFuh-ZVh?4NeE~Jl)k?{|aHAGYE&ec?I(Y?DQW!42Z0^*~W;25wsRh zL95dW&PB8Ntm-M&mB8AS179p0E59vAw2}C~`2X9>uQM`j0vgcavojQ%|I9Rl&GPkjeX{fR_cwqJ_ zm){+xY|R#(Nd}V$Y$?6b0E09q_rJ4cbX-*8Bc~|X^9)jvOcsnxiaHxOHmEhX98>B} zpSq;gFxe^6TL#FcD)=zXmGE~K!wDGd_-to44`Q;>C$>{dv++7_?FPzI%p=4OAeTP` z8^bJvb%QF>)iI#14>Gr@|7$oRBXQ~9%(9xE$D*yt-8=hoW3l5;I|GM<{oK(Rks|`R z(#|yPhAk1ce(P{NES0QovJa#~huRFeD2On)h)(KS0kzX;(Uhk=u1?AqcyzFvLFTp- z5I@L6+fE3t(lZF^j&2ghD6tkx6kj}+t(!Iv)y(O^k$WHph+ZmHlp~)L4YRHbHX^KG zGsHn2)AY9vuyu%H_WjW8i$vaHTMVvwE9bJ&=7%<6HXb$p1OX}@fK3snLZ@1En61OG z=V|h|EhY>2vD6Tv-~nP-wFhOtKBsleX>D4ExS_-0*%kc%G7iQ;h}o^0?J|7eb@c#h z?4^ZlF;qk`H~t;Tl^k$d85g>(aG_gF?aZO+K3$NXtO%o4S*{UYV+!WCPKP+>P{FCx zD`0loU}|$sR-MjR(L_#D=R&3A&qR#9M$VJF2LZv0>JloG$8}Bw2nO@r!-~m(WQZJa z_MhW1IISJ>(tsFeZy9h}OI&3+!wTi>Ph9J9JSGJ0n3j^9jv8gpR=Q~uUHVw7T4Tfz z+oXyoAp|rHS3yeynk-I1b^aELB})i6NIvRU&=t&f8|9FsTR`*<#JIxHd#B_Hz)A=u8-?J*3mVLoOlkuJ(ZEpip z=y>qXr?q-jo+B&|HW!?Mn+$e)SCOruIxGX4t_AYj=8)eNigPUY{kO|Y{gD!FSD%V% z+||tw>Kohs$0Y&qjD|eM!|Tf55q&(%8T{v`sCYm48*-68W#FAYo7ZdSeKBIQdE8 zq-DUUXM9xy@z6H}6V!+90apK{X#9=3__#&%jqz-6X#eeV^w`}VfF`}`2=U|-M=EVF z!nYaCmam%~#>!@lg8F&VvqH`C<#>_7rF_#LxbpBoSwv)F{5fFY4!MLtPZT@Ctl1=@ zh(phFlDC7ZgQ5l$#puAs?DO%7(*I5{+c`&=Mj=_eti01|g-`lSa&*i)rZwq%Hbr(> zkgJNODFx?g5H2yH`OM-W;}A|TyJP-P5DKBA4X|I|a8H`!KlMOe9^1k@rbFaUM-C%~ zlWLlshms*eXjmorF^;|-Le#rYG|JCLJyRmNn(8r8B_*jG; z)Qo69knRQ5MWjm&wiI#t4p6#dAdJ&v&g*ba!%agfyieY&R^uYP21~kca7%nwtRW zu684CkUyX-snRwGHag459|dE1ptjLUw1IM<fcPtA;odxK%#XiAR!(Huna`d`6)%!}CVTO)qw0?Ozs z-UZ0r1FFuBF2by1$O+0^E6NH1+CyB)ooZj6uGzIHtQ%*$`QNV?=tM=SGUlqzvn0)O zKxrS*L?@}92SHnxZSxU`E>DpBl><2ds9wbxq!GQydV+kgkCG50|7yj){eJMR9Tf{8 zBN*5o?I((wvbkZc2Juu96 zTqh(kz}z#S>Kv$c%KZRr zh9<`3p>Wi(pAV(8nV_xMy?H84+q-oGZ^1!CxC8;g-K=QqRneyv4jP5)Z*xT3l??L5 zoG((QPM+6w*NXz_YmS?W$xa)KGj-im%`@JjShkc#U9*@E*Me+k$i-L4xX1< z(9*4H;PUls_161wX;MP@z~;S7Hi%q6=eQKCw=20BLN?9rjAU&s2zV<2Xl^4@(Q>(y zPGE8<9vq-gbt$az;)6K^;r{FdR7?p`i31OwNR@ixH$F}>LW2~AnSvEknwJqAP$Box z(!E3>Bm<0{JF23^3@mOW7js8YRCDy_!ijR=!02;`rGs2tjn(y_1JHwEO5!Gly@GW% z$2IgD78HPzV;oCPuDO5}6uVi}uZ7q92QoT~Fw*ksoEdGT(n(txaVex`u3$41x!+b# zk*iZ8TCS!`xN*_Ij{+KDPDLE;9@7j{YLj6~Kxy#5QOU8NhKxJ>V>z3r!En9ZO)*P) z9rF&o#yL>&DS-RzD4~goUomKp`*(yz_;3Rf+8GJ#TB>j!wRdL9T0~+{0{w8O=Wtu+ z&Ywv4Ja4}qEN^uSP=?Q6iZHv zew5FYai@{x$tYQ+J!GRFh-VsTIrN~E2ZXLCt9CntIWh5Suw=y~)y(fd}BI8vOE7tQj=BQDCLpY}+!8YzMHAZgj;k{xk2v7Jc+bkjLCNij%_#P1b=-E^g-O7FI zuuprA9ACVU{;r5*20mYUuz9E0cFneg6t3%}V4q%7rxA`uWFDL|z2^hg=^-0Mfq79W zrqwOjL^A|0=a5FJf%XC3F+~zUIu$1;5^{JQA-dO{BEx;kq(rI*|I+kMaCad=Ez~%d zHPB1yMz6L-=0W zaL)-tg@$b3I~BV(2g5LuSBBLy&j#|v;K=`)Ei`J5fbMbu5s_F<#M(rvI+dy*yC2b0zs2b`>Y%Y@g zgH_aZ!iDJ<_!b}Q%rRF&Wle6ZxP^eepvq34wS*Qi0OKKtD5c2BmGw}JwK-u`cB1Jcu zi6>CCx5D3}qA4cBXq<*uOANzv8Qp(u(EVX(+tHKB(`%zgPW?=NFUMGXh&PiAuy#u5 z6_5P_ukj@@`4nJw&#rIi*KFo_!5s=VDtW0m%|ZxmnJm~bjaPJgp%BcQiGF|1=&kjN zJ`cT&ort?1jccN7sTn`@+SZps5!z_U z3;FFF$9ykc>Nmu@g(b2c3x++|HA!=?b&>Y@y}1@qr@1iTfrw#jm^?^qt1 znhZ_-zI*o7u!aU4O1$l4?4E6u%sv8+=yj)Qk&q#=cg({^vt;(s(g|(=vNt7I~pBQ&>sD5siE9w zUNzuvyOGf{UASOQ_BETttsMTZkrFv(P9CJEkt{jThN!J}xD5tty7|BBcz-^S4edal zihJut&G1291g*zsx^&rZZbMY0v1YW+*RiJ<&?Mm(VB$VV0QmhumQ z0D(K5X>cB9!BKR|L_{%j9<&>Pcy0ak0pKBT4ROlgTxlnA@&P<=$9m?eVLftkFk8^j zJzFEvxqEgM2?ZJM1AaBDqZnd0ya8{Qq78R$anBPQYm-Jpoabl|s&Z>G5a}2u?;kR# z#D>C&_-Of+bAq@lB_Lt>JyuJOBDUN&yAt$;v8S6oJfDuk&Y*mg6$b$xYLt5_z|@q1 z8kL+WwHWGE25rCq;uKHs{0dP$)bQnD545=3D7fLMw1BuXR$2eU96h_>UXfg`Il}YL zkv4Z}r9)W9H#Kb|HFJ3gYqum6TjPgH${hasd57xWx)*0y!iL=@o%ML)sYRq!H`=*b z^}@Be2gW?|yU8EQhOh-yz^D8j;c&&_$-dbaNg%lUPLKbEv}(v|na+m~{leA^Jri!g zjyA$#Xba>@IGjUJex$$+GtA1USolxIWoj6HSLU}FXz-#M&4X6%5Act3@|eqwQBqL? zB+7G)H)rjKtVlT;gOyy~uCI-OEs!g$D9Lim1+^iTpdg-7lygZ@pk%$KDIrh$Z+$M0 zLk2}a%`I)h?*_Y7{yEya}UHh2jD1U$&36|R`g;#i+(5pI9$VQ z{IN#hkn!$)z1vOf0&@0=G!q7>R`IT@*eDGI`1sFp$dt&Ufvk!2n9y>M`FV2oI-MAd zOfJy8f;GSc8-reBl-qbG)#tc!BjKThRGRBjuHBwF{8ll5b#$@U({dZ{Dm< zr3}2yOSBS*MPa$BDG2i)Jaf)luH|HhAR}=?1Dv}4Vke3eGh`7=>vESCJ0I4xZ9fbe3GPZIWfK z?J*U35A=W+wQk~9rE@N$yBs>Z9#w;(&CzoNW&HBfZP=*vniRRubu7se7FJq^&~nw! z$9?V3H)Cq8yy8hu*=o1}l3|L2*&NWG588B*YVg6_D>8fYRG9Wig9z9cF){%17AD?4 z#g(<$ja*Id(TPif+e+XW5sF|yl#xBncW?VZvjJ($6~n{A7R)EVZx<;2~TM%DQ!tuO{^R1AwAGB)M9^G^q$PQAJj zc2=Uu9f%s9?MM|viO9z_@d>wmDAa5vMAk)h9TveFRKnTg7z{6y=~jIEV<0GbYGv>U zpoM%Aa2(&@+?P9-r5Mj6HZWq?r^^c?8H50V7T5z#l<&!|GBH(Q56(Uc!8anO6y~K6 zo3;~iXDX9|jgUKp8I14emcrr^SsG|Yf@qBUw!wQeOeFGg73`#)86nU`>+WLfO`KoE z8~4OsT(3KUI)x~Gd^n3nNt{NAuZ_F186(h3Dn>jx4e7AFy?PIgiQ>uf7EJ2J^! z1FZAlc6sZAaKUn%LA|*itD6C$Gbm+X_27 zL?7K#buR38fx86VjTI>xzlDXNi8`gHjcaaPiv8GaADVp_Gppp?B@B3C?_6b+>d(=b z=EiBa>Nh|K@BrGA%`i(V^GjW)Ck;N*J1VG0glqz`XTnKG>6s+u)_G}K=Mv~f)Aal) zDLfmM^1Z2nU;4FTV%b3$hihVPgw;VP7cqF|2!cyj83Sa3|zc(}698Skg&5qUceH7+RM2wCsIgp0c`?sBW~J znX*e5|8zYP*lP&1!1OamMXV3>)3}=)R^;3pEdH`l>amNV+b;CwJul9LLvz)PBiZH7 zf}FT?v>u&0)3jkg!8MpL5C!mi#ZaO7sUA7ue|YvTplprYROX!&Oo*U_7_^(j0nXrt zF?L9W8$Echh1U#zxSS#~km_}lX3R1LuhmZ9Kd=j2st-Qb{6j3szOTiM+~i|RGPqA1 zlTXgBP!(}T{wC%;-$68>j%LEm)kIst3_s9GT_Tk~*7AEJ$y5z(lWBOaR)F*@_+0uLGO7%pK?9g;`?mm6?FUpaV8+ zWltN%OjJ>;+w5R~ZW3>C=Hb};=FE<~x9SBQKBBXX(Fzq>ix<;~n0!gaSwr0RLe6=i zHQeN}ro%IPD@PcaV7QcD^V)_8njqoQj(*o>8fg=QjeVt@^?Wb-A51mA2}y3luH3>g zIL;t3^uVaA=>ZKl-2mewklM@ftr0Rd8M0H3H1(7flk{!8oLRl{83JYCsAgq$F#?lQ zIjU8BPUQp;u&L(D2gYM>*f+MFu8}uGrktfGnH-%X=Vp@AJcwptw;!GQ-PF%_L{mQT zYds$P^rbeV{rb^3SsucI;VdMXliP=V1RbZKIAcs z7k3}HOzv?lvm^4d@i30cBsNXqS8ngR--+qe^C|HlnMj$(W5-ra5w@OCR)xUT%RAyd zgV{H{HAblR)=N=aw%Gdzk{y#o)T=s_TdJ?DQAbgsr^#qXixQ+;?9@&FJsL63rz&2P6T`YMeZI?B4TF^BzJdsfl_vi9Eu~lfn-J#>8vdy`C zlxk*rd|o~E5CL#1ZBA;mj+0PJ+SBh?BQlPGWVF1pjzV`sRO3QyVnHe2MB|?g2U>}} zNTPkIo2#=6uvya#IW&3)==m^}<$GNtAW!LG9Cprb1eK}3NCg15ksQL|S7aJZWCvMT z5?zBd-VGql!@alc9l%BDaWyV#$Kiu~mC8_j_T^K^V+>?gIJ)z>o#Yz2E0G<(nIh(k z_E5ga!rO=V0?}YZMEhtJRULCh+Fr5h+>)T7Vre}-0gqpB4_eeaCe?6bseF4wa#W1| z%ZMTwXxiH*8kxkLroPVZRMV&>l~dudPC}k2Hk5;k?miGZGAEA{dxdHTdJEsRSwe80 zE5}Oj1Y+yxlNzNE6st#mH{1V_xy|l4@KhQ$=b+>`6drTKa)rl5LwI(f4z@THeQXev zK%3n8LFHg2-ItTg=L{&kEu!tT_a&(E4@~^hSY+LkJagWum&a#s#nSJd{&RqNCkmC$ ztktm|l8COhQiLVM1#9%p)y&w-=gg`5^H`D*@jn_P%Mohh3tQ(@VOv%DR zQZ{$OYso<`CJ*{yh&%AoBE;qMx$J;KV@!l_4MJ(UCCPinNmoSQi03Hu^*Z@>z&Kh^ zA!00Ti#E#DD6ph)IV6p(W) z=b-IInz~8<8R86}G@N3=x5^tP@7OX{9!c`)0r}k_N4e@3St<3X$OWxsOL$SPY_Mae zDRG!X`0X1*U^M$F%wmbi{RE{Bb+1t5EWPVdV*O^gLo!uT9sqy}NnHXV|Da6O1eCL> zRI?52!7HKofnXP2xuJ$LtuAe^QSy5LJajo4N+Vn2u|M2|6V=E9Xx*&P0GSHbZr)|e zq!HbAVo4#xvfX$ZkAVjXK#s}AyauhYGX3^xFVG9n5g%Vp&*ac2#qTO2Yy=vE%ucBk zyFI16$$1vd`)sIi*bIMyQ)v+I0kz)2w5d(#;%RxDpMzF|U2z+*ptM)YQ$|h#nD|n# z=09WKy(zF`oaxH=bg0pTC&N}~1q`F>q0`CzrPKeI58EF%&1;6|BB}k&paUk|N0IV@ z8oy!fOx%dH4|3iU=4&iHBARemY%cz-q07D@VtYJ61c;PG32{kUxypP{h9yOzA(ib| zyxMfFayaPQ2!K&!=Krm3Po|cmH%O{8V9vY6u1Y=WlJdmL^?>Km#VR&4*2Y`G)LeBE zlW5TE9~d^J3r0^GusX4q z_&Kt$oMvuiOcNoY3KWhb4oP(N?{SQIV&mRKLORcZZi@VXIQ1=~R` z=FQ=`Z1<20$9V`;=ID|bfgYWjv_3Z|d>_s;#~Q^UKtwmLW&mId@9#;W3oW_G5X)=P zoQn=TM`2W1C2P72BHe~j@7U@n=T@iI4g_4+_37aXqaxRL?Z$Eis9c*pQYohP792^8 z`3Om+&kf5m2NW$jKkR@M@8TwLCNbXLQJhTgv(l1=NGZFmPu!!3q86HKNN8ay#MXh-z18CWj&4eEz6vS#3p+v* zw=mfZbq+Xd83Ud8VaxcC?#60@$KsEq|e6~+}U2t*d-P3QPdVT~1Rs55)!M+xW$9Y`K zJxqe}E0F?s>NrzO;nql>!4vwa2G|-gPS}?P#xStc=0qP%XMH&IN7g z0Sg0TC(NUE#eqx!8ma;cfu{=Q(rWCss(w1mi5j60ZlhnrVtKJPd-wnx1+9W+BxjPn zoTpcS3O-Iu%PUGANg>z??_z8uH(XR;M`8EyzG%!Yf!7`kY@v6vmfQjYZ5~1{RES=L z42?t0G>qLr8rnf1_&SJ)P8BF}hOZjgcnRvM8CpxPd1x99Z;$sf^xQCv4Z?%SlFXc+ z2!_~7kN^`{X%sO?Y+?g;p_}r;&T%cL2MxO2D>K!j=mCeo4)x#&Ov72MxajY!p;3^# zeI|wa2YVyKGj${4Cf8a#6uPpAp@B}b<(QAn{*^M5Z0>s$L`$vb3mMluK;#T_qoG98oozCrI=fy*93D z;1J__u-wxK*XN2R8mfj4!#RrZY@r+BF(Qt!3f~*jZHJ=KL?6u^Y0a*FKsE9CyrUJ8#G|e~HyRSn2Z2W0!oW958udC_Ilhda4EYE4>Z;?eL|972ZsFCnP4TbCh`%dNC!V8fFo;O zII<4b(+~xBn|^a8o-RZxSZ!S2HqD4%#WDMFGi&d96{N^KTTpyI9qX3jzOKqZjaz~Z zoSlw~1dQ?hUQjk$aFmUkKi2Gsv1I5(ly2gP^AQlXHZ!aRs?4PpCm}}OwDA>Xot)lc z;Gt-GT?tgwm91t+66G2*=$B(ML1LUaid>L!SdI#k8#gs=fqUR8eJN0zFK-{HBol() z<&Se6ivDgTXPp9t2&{cItodw5I%M2qH1_deinbI_3N{+c<=O~J6ULNEqv|FfNUvn` zUT9_%m`J0ecKxjr#cgg0y#b515vl%4;MGvj2~S$j!(E)Dgv-9|ZO9~Z-i}*5;37`d zBR|QLQg$%mL)C_+b4MT=6|CcV5@57SUc|7~w?ZByt9pdB6UmYHF~Tph#AA345fP-) zrzQUGK~yj;Xa(Ad9{6^joaLNeIIpr0mEWOfTo^=@Ef5jcFocQ+wb)C#E=LArhcnn@ zw3?@$tlBk$lfsy!!U(#T_SH zl&>;8Dl{dkN3{;2l9|XQln?^H`hjXe*LS%b%#ynS`X)AEk`P6?6p0gR+qw z4fR|~Ei?o$bp=LtX`NxH4A8$*JmG%CsP>ldvu)pn=9R&Xw}Z#vogPxpOek;3Mvb_^+ ze!8iJsfEl26;6GJqGY2z$V(&eSRM}7FFR99TBeo7Y_MPl6RS(Xw^-=R*=Ab7=~VWD zE`(xHqUgb5RGe)s&!DHgnDG8!BG7a*Pz+?cxU|P>s2KqZ&2S}C>BW8$p1ywMtFf)8 zVTSAEM8c?4-pOx|*=3*FXa{NqF29_I0uN-a-3}%+fO$@wtC;)|tQF8*6c9Oc}SkC5dhZp7(oZY2{ z4~5u(ow&!0K2sk`9-$rr+s<2xhn#Rn60PaTx?Ca?KuKky-iC=b*6V1~xoIx$^|_XP z_`bly35?bOl-G&`{UTQ=S-2@N7jNr& z(FIp5oHyIUrLS;y#XuW+U{>!YqzL_5r!iO_*lhBso&Pb{5+rMEA|CQEW*|pP)P}<* zl`lt|7R2H^enF2P5D%0Mg(T4o*E|mn;$WgMgtTxaG>@k9d4r@^u4Jf{$Us9I^#q@o z0~j${P4e$*D3LZgj~)1na&_I5L&H-lJTydl55}3Pj>PUw z+}3iWGw@ebFpyrYsk!3MyrVAhBGL>Ye!wSpJ7J4ib7R5_tm%n5&5Gn9cT|m-i?E;E z#lisg-(aH}-}jMui(IhM_B^r?LDbjrf`M;6m~E)+`V|$bbsT{aIYXTOB@tJop+`j6 zjWb;lm7*2dBqdb+-JPmSt7D%S-HAba+`D{Shyp%)9BTbH2rcoZQjh&9Fdf8%?C*ws$hkYWA|hl?$jALJ4lPg{Q~#3qAt+mG1yMrfpKN(nb34(8B$_!vS)h!Y&)IVRh{)l9=`!9oynMS#tiIiIUj*& zJeDG?XCU5KRgu57=5Q=GPA{S{2~(U6nC2bGM`Rb}2z650&V*(@P;wpl#J-=@Uz`2w zpd-a}G7U>M#3<5|Mp{Fet7bRGijWH-+^{C!u4!Pi({(C{RIrVkkRbQ$z_JHT&PGQ7 zWGRTD7w2+6gh#&W;^-pKRvFZpaAKZ%7|z5MZdlaS8J&v!e|>!R$dGoEc+effmjtp~@*>N$b9dvbJ-I`}`y)m%motxy_JE^in{10MoO8XAf13;V|nZ?siaV~31(c-bK z%*kopZ)553s-H@D9Lh=>;K@KiOeDuHO;QX}mr52-E_u z>nvbNnmXO@T_u{zq_vsgd^kltbZFo9U_{L@SkuGtrx(3x`gSg@OA80W%^x`IP2A0E z+|&}1MZ6pH3e(}_U?)Z75IC40$kRYJy1xXbkAqW6e$BW}x^tbF%-+d!4R4>_!oJ47 zG*@J~hYl=tS7ELU5(<=!_@U|4 zKukEAt9gCj4wECcUJ>jDhH=`^E2oD|>_oldW$NyfC_#Ce?PUNNT+9uIV{fk-5k+5^~x>oDB_q)KHT-r%cZ(e3vK!FR%M7tIE+>)1Ms2 zSPb7UiJcg)jm=L}GeTn`71kr?V~Nt0Xa3p6kH-U$o8q$ zs(n=BNHt8vMVDKr^Cq%_H|hhL-n9fL=s6w&m15kmzHjzeK*88XF6?OZD+O-c5zF~6 zo!t=1;U22#D_ox6^RiU1&AMwAB$Jh^->?)yggEaR9tk#EZ=cR@yGSak?wh`?i`P5d zi(U{Y&X`yesEsjjyk&akl|pQUaXgmu zHC3_ooiX;j3?`-TxVf{T%0eZpBBG^ygjJy-2vR)>U1{vhhs+)PW$rgj*;2WHMe(Gb zq;i|}YaC1sC%+Maa`FX{Z<+SSV(hqr?uDRaNCvDK;Yj{T2L3ADV}b`X9p=&52EV2M z4%VJuHoFe$uZvgxrge1D#5{Sjar5*)C0U7jQ^q8tiKSf&5zGE26gA(p@KWo^@0t1p z+E*jz7#6}^QWq*Xf2<=e9~$-hhf#&NrDd|!5g8Lty(ALV!%z$$X*^Aa0-uxD@!5AK z8T=2c>AZ-t!pHhai@SrDC7O7;hV&zoZB0#l63gg1SQ6+r$34`PK0C0~h|{-Z_X4l9 z3b8mE^J>b)HRHGBWXiROIb)<=TU_&CldIWZ1d0NPOOCKImtDMZ4MslyEiL%9;z?>@ zzz;NKOG|SpWPUSa?%h@jY7bCgurrDNUC-8nozrn52wfi6&uc=#Z@gWy#GDXv(#!_lT`WENR(7l^_dcvVL3||FWm`i0*5qh-JaQqpkb+T zsqe>vmjuEQe-J<+#pChLGms6Q1#4}WP+^t6)s-3VW}7~_wW)FIu5cGB4gn!3r;bF6 zoo+SMlP$Wx`T*KW@$tOL7hw3^HKY_1+fnAA&r=63Y&~d&(EV$MPe(}fk(|ED0W~~> z_HLsQHGRmn8(2RnryH3JG6Rt?0#HZ|k0b3iUn0P`m*{2<)r?0vDOH^N{}_AoZ*8;V zEbmLehhQKk7_cD_vj~JFzzS=f{K(1=`D5PyLxjPACk3#5u)&fo30r8EEm>1*Xj`^5 zv|8#xJ-4KuyVb28zW&BDX4Do&RcA7g2I%95%Luwq+QE*92J&h)52cS3 zh*7;an^?WquYlro@v<))m+KS7#p^2drSWbr?HTiXoznSLob}Q=TM`#_Xfw={T-4QE z&Qc+&*hdXXWaM1MD130mR1vAABwi`B96mz7+Uxj=9#-*>{JCR}HS=er}D zQJ@>q%ElrYs)n^rL&m|uP5P-ERO+M1TSatO-0qnacNyNQ)Z!R<{+OAyfMi91w_8}CjX8Hwn<1-m3))l}t7_Q}s4bLGpnvUCvt z@x@~~CYNqG+Cql)Up_H3H!J}GSiQDu3p)lm9eSesq9EfNk? zW-cSCJemQFxLDFa$VwyA@4fFdRhU&3Jbu_K;e!X(8-^egFtcc3o(##Q$R@wBG0%(@ zk0Jz^KREq()Q|`~EQ*32*JW0-p%cjg=kEb#?S}W=y(T(3qI~Ga#4IP6Bk$O z6Bl3R`U#FHr;=g(D z7zRurs7aD^wtczXZOBk_ zH)e&1LecI?S$9E5fw$*O&7&Qe5LCc*Fvy{&R~!}E1WHrW=u#n29D=T_>!W?~3+TKnlijVoY{CzZ+e@Qof)WTNfq^SklUJlzPZrdeA?~4t>vX z&eT*Cj#w*$a2bm(teB==1_}ATBznyhufX%HHf!=(VvRswUEUrWrl!t!@cZ!^rjW#t zDeh3^f>RvMJo7nnWe=Ik)}S60vxn~eI1jKQR^{V_7~&ii9{?eA1J~B=GlliM+wI9Q zT4@SWKyGLq;w(B!)5xnFauSUOlK+*HPi3b=JHWoTN-bqJEN#WXgjG2`q?T`qRasXb zWxwblGV3K)?y59?u5!N86)cA=;sxd)obUq$|fH(+zOj|rRl!y0Wtk79fD7>H=X73si5=;+`Xl7 z5|CAb+TvTZb~8C|q*@ZuQV3!s!Y|fzcOQxs+skP@7z}+=U6?;ePxKC5Af}7ytCOCDuCBI_HKi5VOOU+rZIzP{p9JQt2TKA8 zNoalE7+MWq1bvgA7=sGurV*uZ&m2nKK0!}(TP&Txb2eS6mI4)pORtG9s?#&-sX<+% z*6~4$I(EiMTOyiPK1joo3N%!!VqwS%x>@0Y_$}<1fpO)ern3}ewNFXfcL|$zb=~}Frl{5cUE$CPV!Z+L7!lGrWn@*Dk-$RAxm73=qShWtkR07->OF4IZB95Jv%H#|Z z`|e>=wBMG8VEoq;hj;~xWaqO}sL0q5v2}qCw3BZXkLQ`1S22wqI#YEPmvNs`hMP4_ zL}2_3Fg|&hGRqLC3aaJsB3T;pG@FN57cDD95cG!R{fh!tt=9h18Rh(fS?*dX0J2Sc z<>d2ejzPG_ji(Y5y$Of0>v9ze(#JvosS&#?Ctq8|)D<@~_Ic!l}D5tL@RlWx!sb+iXN;rX~^v0P!=*XQuy} zc2EdC`<^;wwVA=XlN@5(dsEXotQ@F*IKL*|agpR=BSTK7i8*wYVP0v<#Bx8C<9*AE zt2Lb6cr~{fQ_f{AXl}8Ph$OdNZ9u6J_?%z-&m}rV*jI+tydgfbmtm)A3SHMz`k<*# zKNpSL%4|+8B)o>(s!AhA$>zb?(z=@wuql^1Xzii^rE_gWAdgHKq!@LeSKy4{w&$aT zyt=za_+xBz<-+S*yHBd&9$QsGVA)cjrTO|&LRUnmCZt$EmW`RB#wHs#Re;5S!c;b) z9$C7UmcGFtU!WtLnE|K{e3}JtV~jdb`>sm`)ykDT<`Y!x(hZ>Mc`(7_i!+%9>9I z>{DIpnes`J{QB`8A$E(bdO^PcVdfG=z+Kp;Fc^iG$fXN3iA5htlIPz$Y^Aq=n+_D> zb<3Ws0%#nPQMWdB5Jb))@!VlMQwcZu9a1w3}rGity#z$=Mcl!ph=@^bKKhH z*5Xrtl7%l{Aa)(iJyRuqDiSwNAtJN#iKEvCIFT*=#w8sw%a!3HH*nZH^}Y9~VJ3#Z zfsthE{Kdn`7wkwO;TV-FS>32ey2K^$C4Fisiv4$bdZqyGOd&)k%hW%)602#shABeK z=BNRD*deoX_RT7$>i<$g$}MKxgT+bHvJK8vZq!7_XYa}=n5VZ_j}$&eGS2h>61D=- zLrU%{P86t}CWN0y=w!VzF0OAdOUBQUFJq9UceEG#77D01_(Sz*aQ{hbgXd>C9Snevx^9fmQAyHTAHKO<3Ac;Af2T6RwcC;8 zU-X$n*My7asVS+*ca-kwR}Scn)IrO$*dRCYLVX+${3Evdeu%SFG(ZkHZ_8(@pI^OU z>;X1#hWH=W4=#eMh8u9|>;#-LLPaY6nEPXKV$TJ|$wGzR_)H+6nG0l6hNFV4ntDg>16Kd0k**9PMoc7%bM8JbX2TZCvds5EDgDaD zr(>9_7&)el@d?Q=h>-v^o7~-Z(H0a^r@KtH{3@`u@e%ihNsY9I+#>n;!@EJi0#{hf zMC?i+?XbU)79{$ z`3#x^0AHgG`)O{iz+P{?ao%jpvgR_ZHspvn727aimEd*mO9fN|zhv-yrV`y{lHHt< z4xM#A`(9R4=*4-YG?mq3J)3ucaT`6UP~xP6;~@LPZ>ygakvqDyy&-57uC89u8+;B^ zVW}=9>g0s}I+~=PLS;6E87T-cuGH+=b5!Jq7M-F!$}N>VlP>nrHy0Dw{T3{rBXEjO zrxe^x+yvJyYRSy#UH9@vC$8r97BJ|~-rQ6TB|;{XVK-sQwa>gM3H3V?uX{FsDLNC^ zkVFzpRVs$ghR{!Chr_mb%}?hP$qWXv>~b zav6~J_)8lcBxF$?3%WQ;jtlgsS$OSKbq^hIg^_N}7tkhc&*Q1mvMJ+NEXKrO?EU&7dAbL`25?e6_tAnTyLsYXQ%HEsQe5pcUF`!6&ik>w?mEfr(6kQoiOp)Q9VqY25-}b~e*uKJwwr0QD z&wK$~)iwJDV7b2IMU1yNl{F>6S>{toyS$gYi>T;bKk@AuyGh(f2EKMtB@8YrAR+7RbL@X>rYc1D0#vZ=jm? z-kY8iN|H*&CBEUG&JLv56P4_ncyJdPz>4rBgtQNoU(3NYuzaq{tb-k215g(Zq`D#j zZGO54e@DVh$#!_C8R(wu#awJu~oexO+~7M zSM!yH^g|@f1bk9I0nyvFk63^gj_la6sEAeuJOZRhY(=@KG@@EuCXx)hZe%b9m2$gt zSI_Ca!86x%${nR^2Ik@qs+xj*9XMa$T37EL_L27VTUiY!8o*M{)rvEzeK!^%FLi#G zIt17Dl^bJqNwdfHhwrjG&^)Rf_PAJQ3kYJKb`n9R^VprZ9)i|)@)bdwx8JBQPR@Wl$d)0 z`%S2H-Ss0Vt>@i%(5O0xg1&)ateq|MOzn@l@V0Baec>G~gH9<6Nu?dr(tn)--+c>1 zdps17v)xdtILEx^!MIsg4$kF(%mwTRF&zMB$p_fmysNI#Bwf~bNW$1}?*CECy_>U8 zdNUIOlt3s)thMU*4HvDl`JWgbk&hpzwb!QL(a~?DTjmx-xv|3o5OMFtM{!KkV_8yl zT4fCH|GJ5NK@>%h;!xecpj|a_AwD%@yD4g2DQ4m*tteN`2ojPK;9BWS&5%CjjQ{D^ zBHG6eTXFv&8rqeF3R)B8LaWpLa>4(U_>o6f$`X+0RnpY*U5fjf(Tm6_=PL1S@O^`X-5cOr;A{0{GU42mo+PJBhSC#cGM1i# zdvoDASSGf0im5Oz9M`b-frw1t6b^Rl1K45TM|+MfaF6sPev7(5q9<_av3blBgMn(m zggXeTIvNYr>1Y>9^@kl@j;JkK>9bULAu=;Lq#%kKsNXo;#geof=Ewbfus05&e;v)W zOuXa5-acC(_t7qPzweT%jF)ag#MrRHG_8(kmspVBcHN{*$!bM_QNu*FUQ4wuSKCVS zs;SzHZl;0TWNZ0irFSx zu`gmuYYAr2f%5qUEDRL?rh*Pdjb$kD^SQlNB{Q{;Ho zN|qT;(|MV=JG$;@(ri6GRc?^In3+YW-R{l$>fy782XQo=nPExpPyKxD;y%K>BU=*Q z9h^UmW;*{ik`v`?nOwPYkSx9o5-7>}nE(1zh%r%-J~1L~eqq|p#jjl0FxFGhKokr| zm4syxR_<5`*?QFZ+W}-3WvwMBK(SCtj!*fJp^0SHnk}j1+w_SS*MF~t!@EXs@#?*C z_^pPziF+rmt(~8Rh;O5MsoOz@+xSh?>=z6?+K9Yz^0PXD#^sN;5G`4I4__piGAm~^ zH&s%iRHt2KyXILg&8^wBX1~FaO0`txb$ntAwV!Zvms5W!3hBrr_32vYWlAB*C<2XR znK{!z+k;fL(_$!LvjS30x7&$x6$1qS+KGkm&48BdZ&O4Ts3X$}RDH-L3hl9d-bD?) zz0%~Xt8CP9e*E7YjvoZFo2A0dUYO(`BjqCe^Mt-0O@DA<{T=qRITF*r<$jxLjKd3i zve0CM`1Nz?dTH{~8ttw1PXJVtyD_IZW%)a(sJhv=CEGbxqCtzZ-N<(yBn_D)!4jSZ z)@#RZYWlruttbZQ5H(LG`!rl)-@8nn8qWV8t4TkI7xBe$xqved{{)u^f% z;>ljxAhy5DZa3!%RmoIcxwE!qyUG#Bbq8KS=9OwA-AqN)F5af)1Tp-*se&9IPE}%S z)ce_(Flb(!+{Nlt&BZSh?=^sYIGAa?x4#!@QL59F2aU00jE7@No3B&$A{tC8lC+6Ws_m!n*-WAJcCiJibO$UqymN{O&FI3^U9%USm;Lf$}iSJc9#AbCyj=NE*ch`iA(e{{r9d0ZhHOY9q z9l=`IjE&t4Lr*67F@uze4Y2g>?BH!qNXoQR zE7WyxMHi#ENvf{3h^42|8KPWA^ZtyM_BOWRn}Cds0p-uo*1Dw_KA3K4qWSkcSie#l z`%3n&dLuJ;e?UI>XHu=ztwF_7BZ{i_fPb5-f{J|0$v1FOrsILGzM91b0DFG%sV=PP zbu_^$fo)g`fRZJbBu%r91eTeBcWZOnwl$G`pjBVh^K`!ROXdyJrQdlbakaWCGa)>#~Sy`6C&Xe+KI4Hz0g1LZ&ZpB^aiP!a~s+Wv_)KAraH3=t650NL6 z{tOY^4^UK~XJ9&0+P4bKj@C+w{}3_B3Lf97xH6b2p`;yQ5pZ3PO74G4Vf~LbW*n~a zxrN$Z9Mh^lc8Ka;nzh3FDL{OPZEsxh;dGGC(BJ=TwyL?okV=88wJP(Z(?4CU>MH($ z`cnp8Fy%?9@4g=HmYNA&%@V&s!u zs9A?$%R3+3ix9LGPcboC6d8hGeuGEtj#|m$d?`3F!>hmD8e_v|=EF7NuiMm-Y>bB0 zdOCjXXX}oJin)5MfT?ndxDME|rh*Ux7y6xY|IF&bsg?v?`A|_s4hqfPd;xdNmw^B2 z*TZS73gN0adp@@MooX4hVZ*u9Kfs4z-Fm3`1IGSf3!m&^?6c;Vo`9!p*A%h&|Fx+3 z4JJ;ycIVW=G9rD8{W4~czA)ZXXJnI4bTnF<`{)gO9}0wj5rb1+!k3MfSGaQL2|Gv9 zBV3l@86Nks%+3fp>f}|ZQtwJ5N&3#Dleq*GqK_VGRfFp7+?P{OVVeJh%&)Q9D)TFz zgXP;^x18$?u_fB;67FTeZ<{&xZUwXxkNkpQHHv;tR;{e>!|Bn)}`CkaL#V z(GkQqQR9f#>>#O>H?_NYte%Jn9ESQg#22s>6{*uhlcv+?v3=hnmBU78yzE9D#G;f} z72FN?;t+E?O{}J8Pn(oJyVUw4kmtmRG&HGzC4;{W)u7wS{At%oeq%-`_|}9fPm3f` z+jI*00MO@XwP$xYKx>Wn04QTwlKIK6g0UK7Gsvyhzn95Z_Z%KR{4WM5nB;zG1MqOo z|Nb=X!vnumzg=4*>Z|zQG&d>%N|`&bbDNVb(rP2jQ+6)CR`Z_H8&RVY<}>=-39MW@ z_Y@yP9TlZnaq`@P`$M!^oqVwffV!UPqYW-|Flwzvy!E=K4Tfd#%zFTPgM?hk2Zbsw zN5P@E>HM)-_SuW?X)mlEAAq8F9DbkRc1Y*g6fo81gqi=V zJpJUCj5P@MgQyNMWoN3Dh-U>XArg`acC^^tuQ!oR!gLRKH)*KwxZ85jNO>!Yv~(jh zm*a0L{2?-YASz5bbt{YHV^#r_2V;-x*>W>^PO7~3dA%E{L0@gmuX*q!;b`Zdvv za#Lq;@pPQBUeo182Fczp`t^AHm5Tt0T3O)Sz>9E=FED!2&G0*juV`L|tnu+I^ z-hPngKgDK|?MT-iUj#^`;M`#@Uz@DovLM!X7+@v|S?Ng-=D`#Y!$a)<`7~kOR{h)j zJ`TR0B;aG9>)vOk^9P4-XNrtDMl(HjL!VfDl1Yfm;x`gSZT#>X%glcc!R#g)1o6hU zl?l1po}l9cGkqR1`!t#SI6h-^&) z4j+O5B6XeL>ZB`bvU60B9M;IpT3SuSz(hA)7M(NOOeBBz*o|WoNQ}-e{;`?#CtDN{z}n}vc#xj3=Kv|;E5;p)$t zcwqP9;5KT=ebOlG>Uy3neJ>0nu^QS&Cj{`2y$o~;K9jjGjwHO6@yM(6%c+@kKOX;E zoOoLvwq`M9b!q;({(ee37)*i^uk(c+2YARjQ$(^?m+ylS7kthr?uc}%1C43Smk%`= zmiK1w>sWfOwU`#AJ4YdETfCKfCBOc!3=;Rz!v^v1Ss^-A%~pQYI)5&BK-Bf0I4{S95@h)~-7aKm)vD zKY4T|E*G?fu{Bq*6}-HhHyxrN1y#ehO)GScCM4Rc|_KAhw#78 zd-V2Nu&g;nwX5e%a4Bs?o$Ml~@8Rds+4fwiuEi!TXLuJk@0)>0JL90@QeU#}I>YvG z_bgEMaD$8noabE%bnNIyN?oZ-qK82ZTiEdbYhz(!&S-vJ9(B$j^%aS2++h^AL^52L6+yflp1gz8p`2S3oRonECoGkk6a!@497H$0-q#=A zk8La{9dNL+ekP0Mn0#xg?^4Kn#HjCfYr znsqu>r`7N%Jb!I)ve%zf2k2ajRyaGT!%Dpl$W}zj)sQdR@&zn;T!|PbkY5WLEMKBtBR+;Hh)m7KxCQ}3^yjG$@xY@mult04wupnb^fCXL5AU3087@OxMgqtUlrbatWt`YPwG&G2Ocr0A5pnt( zL{^{b0XkEH6gd@ZHeyC*C!C?BL5bS>luTM}A13k-mPufnTl|UDaI5}HZC_YW@gQ`# zj3*yP>UpI*3N59mMT4#YbuQ|BX!{oLV=D=rvwxFLus@p_PXCdX8*Knbi;ro*X_jj; zt2CSZWL}AzRZOCpM0X0&K|*3vO_SY4b{h;Ird9B3icM3U9lDjClULYni&xZ)v7F${ z%1tkkAA_96H=DQ&XBR*7Hkxb76=*5pDDlILz>XFEI62=7=&68BvYT*FwgD}1F||SA z@^jzCattwY5K))WvhP1Sh0=TrX@3!So=K2&ksmqu2Gl3Oetx)i{EOulC*Lv1HAP04 zrb!nAM2#K=5&#f9wA{U-a zZ!K>vjj9l1P*lA{B#8wq^3&_Db=WhSc{9N!MJR3L6K#Ff$Q_Vg^Iax*u8A3sDdcS7 z%ldlmLPU(Ve2Zfg)bM`^u(!1dDl;#S|2vgAf9mtTPHwN8EVipv#lyYeUS888`O(h| zz!eN?Z*dY31%FMxXuTntSULCJ{om}HF9&&>`7r1Z`~OJRX77i%`G(JaMq0TglIcF& zyG;oEM>*?@s_*2e!XtvMtfq*;Qvq#&y3X@rp^72T%ZO!y8v#4NlnG>QSGoSt!Naw_ zM6Op({yF0lHJFUy5c>1O^_b;V7Rp~HiA}Xjp{m!zf?XPsiCU;+nSV!g+y=QkhUB$V z6MYI~qOpL=EZbUYENoQ=SL^ObB)b?fZjaN^Ji@J|FY9% zoT<|CNq35j{hk7dmeYfHpef< zNmd<-(oL?G&U!{gp^9|Qm0#b7^@@8#V;3;e(x~-p>g_6hWYOjhRy5uWl3aWx%?RF@ zya|{oQu>ExSs7Qdx%b)jA+%~#HdTOY>HPq##?I*;q}mKMQ>=PyI7wk$2lh^|m@g4V zFE@Gm(7q+dSJad%eXuLa`wmq0&zEVi_Io7y%f%l9Jb+_G5Oyj-jDpmsukXW0rjP5caV`%sR}_}Wbbwk&HdV3wWb#1<@tjdauSEA*A8g6_5pUw8!IB%C@x98T zmA;Saf4i5b52Ctzlqi*?%F(_ZY^?dVL4=Kd22i61)$%h9C0$=A1y9DS^exo{0R2PY zc?XJ1=Z=&2E{<_00P;`T0>_=Wo$9TJ&|uK0E#PcFl%!CTdeiFF-baVl^g1*e#{g&p zETm1jlO-G;l?4~Vb({`J;r6PzWok`7X;<$5d+tNa_Pm~LbQnI0rv7j+_i`O-4#~|! zZJ(4->PbTTTYwIj0+{Q!d0xWM?=#z_)i#&(d|=sBFPI|a?y`gq+-Kqp(hsAiRCwww zJr8N#{Zcw8$_qgOy81V5a*rFODWiHPziZQLgfUV}JqkJ0BkFd5Bl|M7_BvUw>H#0v z9RckWpz;??w91}JW^k}DZ7etUMhjC4 z+lmctFNCct_||_6+3&#NMNw}ZKbq;L$6ttQ zJlR)i|2Ez4m;KwD?Z^|MRCEub(#?H|eSqITn<`Gbb)onUi4hy!!hb-uZRnm3jG&fZ0&24 zxI0Egb#odz(U`~=tusn>%eXB=t<+lx+B;e)xg@oW(%q(o)L;^PM98Vy4CvVxT~F(Q@RnHm_UH z?yUwq!X{@Ipz}t8mFH_YCO|Fqu^ZRLRmvpKq}q%`^^#&x78E|kXyu;g3E{ndk?m3U zW*AI0N-jFxcT!cQRpqm^iy%NdWn(0LC#+?B3_IRcToSh$NB-G!?RkxOj$`N8t|J6e%KBSD{>F2Ob2bjT&`rO>%t;L4G&rGp)|&J zPngzCpPf-L24P^oGYZ z+-7O`{+bwuWvracs}VscK@qq*Z@YjXMR??8eUn=cwCcrE~LpS~g}#S-?+^ zk75E$k~5fU~_))sQBN~M+|5xcOOzM4|!oAZm`NZ$tJ$p$en zq5(xlSxvU8^lo%}YC<6aahwml!^t^f*NIllsY4m+k*dHmP(-PhDd|Ehox~W}WWDE# z*fg^_7Qf?7DqGzyW`w1q_oUZtU5(yl6;k?@S!*gTR>qv-rV4`LFR+xWviaL;Kp2*n zzLqbZk=1=FU6GAlo6>;g{m)jgZji8xMw0)yASv8-2?wZpxBE{7G)-s8K4dpcDO2|z z#@d}?RLQ)h|K|>b?lf&vwl{P=_{_BYveYE%WZ(ELFmz+9lWeE2v9RWSiQiYFY-h)R zzLd@X-=q+WqB@9R!O#VT1xYEIGh4JritN4+soBdk$v6stX75?-h~T#0*mi|`_3&yH zK4bb_WziN-)PfWkDcXwVZ$bQZa)oU;)Rd8QzMDerA>z8RC=HmhAk~h=7>f`#k3%GV zehB`y1rtrsI=gFxovtpid^tcx-L9)=_uDWzPtOmPh;5V<%Ew8tO9LeS)g%lf5+d38 zoR_xcDbJ#9A%$7)wj7OrRAIT2(0`iv6}wYv*79tBUGYklL0Sv@2+X>{%;=m`6K+hO zK#gP?uJPbENOjhQQ@!ur9TPXp$^=z9@`jAv1zW*`E?zRrZg@u6$GN>hH@;I(G;P&c zgV>M1wV5@m4j=t|mIO*e*~~=?r9T}8q<^0pgNe&} zwsb?QyQTIv|gu%w9N^&7(-;GH77M$L@xcr~61&2!i5C1h6oeiEioP1%@<8Tf3_NPkUi; zJH3R?HS3VlyD^{xRN1q)!=ln^)d^VFgeJwZx}xcUGBNGw@B${QMY#L(+Esy8ao8n z5v0%Qk`2TSJnBP2F`B&a0LFCjo>Jp!H*^Ue%G%d&Vu7g5K8gOU0cP&+<&Ifnr>8u)*M**)lS`gq zq%E$2s#Ftrz7BAg_b>zQ`tP-*3KpqJlTxgcs zf1)`}X-Y+hp~?)a^3xt6#2y#QKTH&UrBzj4ilk!jhg_4IqwtZE6CT_1FDc+Mr4yW@ zq+z19=oSmg<|^xd?=5&ryQ<&pSMl&g=2?u?ZyX*bU0G8;?FmKLizqUWLZ#JC5C=Kl zt(DTKI}t|}Y%!i+{GVQvz#SSDHRb80=fpE)6moRS+D_xUNAFFaP)uugyXM+0nIL_A zlho*0hbf-gAdmoS-^{O&hJ(_n+p+OPeULupm~bi52{TTI@fYH+WlDjO=h(W;b?p>{b`9q!U3c(VY-8YGH8!@Z1H zd^ounBH*Rw${kpxQjN#Qs1(n^@aGArKl)6$r!{8y+ti2ApFU=@iHcQOgb{!~QZ@lP zR71!6Oe-vfQ^i8J^ii%Y!IqBt>WQ}&T6b10nprfY!fgg2G`#<;Exuhh*8s~tzI{rK zNRT2PMk(>VUuG}Q6-AjtIZG$?ISC05!pZ`1o=5Rih3t}(sr$6-zfq;|_g&F*{IgLs zDuNrw|Ak^Xq^Fh}GW_i+Z|8U+G@xq~FRdG*yc->(40+&KsfqHx)VB{UcYZe2%T;kj zsB}I88y94QmL2w>z1hx+bf)qq-Zqs@-diU8wo_jsCY)>>DUe7oE{2t&+i*s+p%CX< zJ*yp0eqg1*n~zab_NE4(#FKa@OJaY#-1YeEzk_-au+*ZmP;6W+k#Vi0S+5>bBO!L6 zqsjaiKSJ_RrLrJ1FphF@iJB@_>*fSP!~&9pil0Cu?-4v#uJaJt>Sco&7+Qz)5*F)f-Uh%yIK zRUH2q;PFTI4sfKihQ1WrRME4ui=FiXWrOmnKH;pd=h^yAsN~X>Mrnk?ungfdAO4>O zny2|tp>_57lM^?2nIGSZKBz^ek$ZE(`ogp(t;}&qaCi4V0P0_H= z@7+v1TXp5{N8`Rj`+Ce6=q>}Ya z5HB-fG0@tKv|!7!NpuT_YhOP~ALf;lf3aY@#oes{xA7jMu<(+`t-w~AYHmFnd?nQe zYZoe%?m({%_TVO&-gX>BDKh{U#_$GOP(oMBDN5tmcbt-%#`W*eh^*NVQVtb`Vpmed z4@QeRpv-m3RAxQbtjG6ZiB2#6DcR;zN)S*AT@$U3SZ{ap)ZY?O3Tj`Mn4k>c{^btF zTUfr{J7e?j$`Wv2XtwzF8aP^jMH?C-vK>9{9>EM22Q?i|A~82_(atd~1ga>{hl{)E z$Vmr}gLL}7XI+FhMYKJ5RE1bxnix~)?g|Ll)R5O?DVGr~x&9aHaz4DN63?5|Wl_Hx zPHIC}lb2JtY%CIazCbN@n*z!MFyX|Pw+}7RTul_&2ullrUyuuun+^zVywS=*@p6SG z8uFAi^!86XsvXrMvIE3j>E4Zk6TdQrT5A9@qRmfhH;U|B@J|bmu=-bmin9% zJnYELgnRutx8Ab@fZ;1(LvQ&7`h3KdTl>i_D`4(@Yex^TNi(gl*}+GnreMLn%he7U#)_RKS3t$bF?OAPP|3rzPt`<5Mr9bfNEj2 z(>Ah>?tNvRq4PsqaiFvoa2DWI_gY?UEQr``I*0U9p5Vz&iyBUI9Hiv-Nnh>!zuD!OVl)tB{Wh0RFT5<4N zH6MIhdS`2bKx3a`T+yictwR8Qwzck)KsuOViXgLF2I`AtBuZvz4?=UWJj{#nwW zyrg(v%RZ&s(0~!QI8&>QxW~qj$@LmD;mVigU2>rkx<|<^c5LdI$QIfvzE01>a-UMw zKGMU$=^Oc2kbI52gU7p2%{k|#WpqR?ye5N9u-DTe17tU16PN{)<`Jgb&?1HE1)+U2 z_RZ2eHeZv~Og+8?Q=j2xy!tY-sg3^E%ietrQCa=*R}G46s1me;I?)Z{(|6kwv*Fv>1dhdc)MFa2T9!U=G`Z?}e+!uvf6YHhf7;`DGB)LXdQt(!1pG&A(y>|`qF zob618+A7;rOkI;LPmsm7fSoj7ee_IvDQa@7enRpiI)LS<-#DyU9D=;VZ_{1j&vv~Om0iU8;~ ziuWc+D4sokCx2)I%wEZx(XU-0yrg1}mMLtiOWA>_?jgaImm#r!>`X3_x$mVUFGSZ; zF4VQzdP%S$m^A*0X%K7s$R^)@<{h8bFSy%5Fk0g;cHp~*n};c;1tF|%o@Z}UY~Y_# z7xE>W-34E?AKQRnU@+I~% zUNaxf0#rkjnn&5Zq+XWn7;w!Dbd`MDO=7>yV$CV^JXTRlsXIUZNX+>g?FOf}}S#4 z=_PnGp-3;oaa4ka(I%&{HJZYWS#j?D;mW&GVDr-t-2YVTq2aQy6t?m(8NE zXzvE0D!SwnFMVNC64guaE4!*h6-e(X=z>$zh~7;((-=710(f0`QrIfKarL=o+uVXr zvhS?#eP;TCaan($C@GfHId_+OxrrB(9SZKEvl>)OSK$A*T1RTjA@@0ppfJr3622&^ zw56fUWppK4p^m_tamrAvI39puVSN{!G=FJqNI`IVF*|&&Xh|S!akJs<_N?75GXuV0I1!aRbGZyAF&$(nac|h-b#Syyx&S9(9)R+su9*J?HUZ>X`FjA=@Z0{3`EEmNo`IY?-q_0xa>Oq&C4hTsq727sp5V}|7RQ&>t54z6jO~qUAFZ-hmV5q zw;;PZHN=y$17l|wzj5sy_1)FZZ zbM~)+eN==EIGxzWNeIjW{C$*!mUtB9TD*mjM_E$jWcO}hG7;i7&7oU`vi$R=2BAmD znV0&~;kSw8#6)%^Rh4gO@dBkTjl8m@{P3PM3Xi3kC`dFT;A-zqxaomD2QQo=+eLkp(3 zT{-#1*0|qASI#ld)k?Gq%*OCVrec~TuAF@Q@Gx~p-XPMR8yY}QGB_sP^FfVR?Z8Sx?MlM2dz}1B$-qnJp6|w5KK;N+&sF$eqVxZW5nj9#08a#2y;Upc&&oSiIdSJRmlTL_ls0BbaTuq*<( zG?+uYlHb_C`86x9>pgiqOCi2;^3G)xE!^i6Z9A3Pz01Z4Ev==DAH!ATMYKYCL$ga) za2LRUDjk4y4t$0uciH;NjofCI-4P;PLULelspsxEDP|mPpWT zCH$QgrFb=Z?@Sg$p)d^X|0?lD;exBk#X#Xx&&>G>js8pN*QXm!jzth5kOf7+9Z-Ns%vO1`yd==N4+G__^ z`njUPzUbCj5>jXHJJ3?WGb}A*hd@PE|9S2;cGWzstSV#CXe&d?1^73MrCRKD&#;5~BY4Tih(fL^85#*>bhDTswTB`wOd~c@G8` z1IvVVmn8iba%8+F=^Tk&VwG`p+$P;^s;mKPDSYQiz%xcmFv2*KwDnhp>D%CKe>%~* zZ}Ynly`b`XuZIaJa)G}?oh?j%V`G0(tzShrq8!6k+6w2<;zGn{mplg!^L6UpzgzI@ zC_kFkIpJE#m^~Xq^1C8#JK_X$MRU<9@G2g`*o?1~&N)b5V!8sk+C+V#JgaM9tyB(7 zP5Vu97-c?chL&cKXHkp||1E1k^=j4s)(hXys;Fd|GS%U8K$EHIE)?sfk_|9TkA^By zU&D6Tt(v+SX|wJ`W#c<11Cmzd%g=O{s7Bj&053qR9GSwUd&0w{vZrS5FKd$^-> zTY}};TADz9Rhg)bk$x8!%nn3VuHM!Esy*~eOBsn!eugzB_f3S3p%IX{x;0Q~Bq@YX*9N)vF zOgfRtv28gggz@M#^`6(=@uw(KZWFGYk7;y=TAueuSWS~}i3NKTx)j4+R3(<7qN5_qlbSfhWi)t1Z>Sl$`Vi+-l2!c|o@FulSGJ?2pyK_27chH9^* zvRI8I6D$!*NksQaCXHP zB#2f@uYZ(oP%>=27qw>73!#u0e%=Q(*`TN3S@T8pSM{DR8&jvi&B>{yfKvdHoRs?w zC-^HdtFI#q#~{r1O+*p>DiNQuzN~_C@70Ptyx44KArHdhm#DNo`nG`rDHVRted;{0< z7LNGs9wx5E*2w8ITK9XpYiG;hBsCdmbDYEkEAeh zd&Aq3BfSu&XFAmcCAX#BuGsu*MDkB&3+!GHdsH*D=1? zQ*808RR@uriHl$uG;ELM<~h?=UO9|0vZQF7PA~peLAhv>x=;u?8s1Oi{9B6<%Og#ZZRNwFSqh&LrC&?%vwrK#mB!hfNR8b zik%Fon;=Me(5_0xqgA?62%D!Y^BdeqOYxOz;xw!aH^>`l`!eckB zNDpFG;n@($Rb{aet`z&38Q$@YICt++H3hYmo-%5^4M1Y2=#=kaE)lZYtlU3mtBmsE zSrVL43BH?iVJ$j-X1XkT>b)y{@1pj8%=SUej-r95bM+bM_&N$Ij)IE}Z2$ z1p>`E1%7`Bc{H*3wL$4@)v_U!myVess( z!J|9s?5h&0Z6I4siu00IY9FZ(rt-8DDT+vIw zM`N$AVYz-IopQMNA4xAIA+FL_pS52k4HO4HXa9Fq+lWS*fH$TE2n_)QW_O=&ww;$)O( zD82|~%9Yv5BKJPAj%$goT7x1q8Qjn@G(vyOz&j7wivLoRWbTeN(E)NX1A)|z!ey$Z z99Pn~C;w%%p{1Uqy-nNPi|R@ksp+$g6IGFMRhR_A)VkLU^{{3W3b0G6dzuEfo3K()p0GZ{#gv6u<(W*+?$#9 z@GM+;L#$@_H=#Xt@({2*+9VviVstEA8MBDVrF%_n{T57RTzRtM&`6qa0+^%_vI22a zkeaFK;5Qp%K_r~NNy$1g7PmOY1K_06zZNB81%SRL^scxOuV~tblfLoB+_u^CwSJ|| z;=XW2aiT752&_9CoW8{tN#i4`7(zi$57h{w z`ZBeX84@l_>Ws{u2gc(rjy$Q+{z9z?EjHG50cP5K%MpgWz8|5d7)TJ$VH25nZrHDO zF?5G9=UIpTM2RzGa0_5Lfq-_4d1*a~9>1jfSv=fgE4%W{S`@M%H*9sVRqmPw#Qv_Hc=OM-9{r)zkfahF0osHMENY-b-b2CLz zDHTTqTL8>_7vj)i!FvNGgCu3<`f3Of6aa2)K;oe-}%g+KdHt5id6l2CBrXt2@EDc8neWbLt>Wu zXI|zG>!gV?*uOz-OjlCEsB`$LCDu~D)f5@YwG-aJ)=rXtTnmPJse$>9g;JCwat{pe)1Xjkh~h_lSf5~Pa`)ZX~FK4v@mS;!-J~~cl}|F zfY?iOoxlj*ElA5cMgrcV=l9RBJLc}*z~MqCOLkSe>h*#rATIDHNpqQ#io*pw0 zJ#(=B4N~u(mAgSF>7}zbJccL-pD08{VdyV75a+L<4eej60h#sQ;#1BM*V)BS3Rk|6 z>2GDT70m&=Y?7HO=c*e0?IB<(5D2~w_SxycME#`3(?8VVv0_HadZxT|o*Fx}6Q(}0 zgB5@l>@KUk1|=Rxq>?QKxi17)y~#7p5G}3Py(>hoeLgInmdo*v(g1sF!E z!UTZgs2ZK!d2x2}>nOrFUIB@ANvdVp1egUvU*B>hXD5a`tKfD4m#&2T#*t{GJ$ZtG=>> zmn22hxH1xJ+jS#)98bD8ui(>G3-SeQnd|zi(BjbQT$p_i(G;QP=b&4ZWN~A+vZ_U? zjm=I^7y>`?DSxZrCb_kVBFS$=i4oyDOYf%4Rw(srQ$F8!oAtQtNE^hrZAGHgw)a83hQ_As-*~D+Y+1D)>f8UQu2%G zU}AB=DXqZo{_!Y4JvGR8EXp!ci2?Qa`mQEJCwbCT<4J3;N zb%Mo+`GxAByPH(v8Yn31MBG`E#KkLI03XAk2y~jYu1ps!VUfNyQqQFd1f|o zV!DBSxg>v>$=g;%qOPG5Ot|W6xt%g=7nW;og#FExG29gTt}=$GwOJ{{u^f33uWtHc2idPSe!9 zmNb41f7rf(F4Xuq7$ruwtwquYLRsVj^up?(*oA}8Q?9E73sz|r-Fr<+1H^MG+v$s< z#;PK0x(0l_*m^W2dA!iB0+LWAGaEM&hfiYi_Kp%vR)d(TT>}%coS;Yih_Q|TD<{9! zHvGdZh{?faHtbemc5Hn07*~0AK4Tgx-nRK|Ig6}2w>!*SeW=VdO>QGb`^OHvb&UNC`+%->3<(JS!HKbnU1nHH;%41v*vohk5=zvonGMEeZV1vS@|*rE7^Y zDYVvXb_KcSj-61HU$mCjqgGa{R_+K=F!aS>3C}39o2k7z8XrZR{LJ%NY&IRn$MjcR z_*0T+37TVHoUld7c2pz@CYMygK`AubY1E$(6L@jUmhO><#>sw>z-4$5;d#D&-IZ$I z4t?1L(@Y~aOS$OywoYiw};_*otG-AClk%%P?wb_{& zFAOEjs*MLa*vWo*wY=Nw#!p3GBq13^fXV{(xLnFV)TJDPZY@ukV^bZ_BfNc3;iPEF z>4p1=Qe-;@9V=lVk6h)KDI~P#<(cNN{EEb>00l!t?s2WRR_v z4DUC*Rz+00=3;+Tfif-R4fOt6&ii@!ONOx~GC__^qN{%F{fBt-)ZwVr`BtiFGOYog z9U{@kls9#;@*Ep+lSIom;YA&yuK%8Ku$wBs(E3TtxPh(S(UWRYN|@iU{47?Yhtc+h zw>0WmAamDBcCiP#ntWyF<_m{^QQfMHi)lPC8ok@@mumn?>UMmP*ToFEL7BI!zQ6b# zgkW#!3{FT`DMZk3xu@{;bz2R2M|OW5M>=UKwzw;fn&J(& zkMKdfLoKNt1kBD%?oiR5dbiG#StG%9nYqyAXwk!I-|6YcNR~@$aeH%DS7_WMTgI%t zpT~q4a>)02$a@-0)QB6?(|zUm`NO~BEjn~^;Mfz~hWHLxkzS1Z0Q@k+sgX-hL8F%B z>F7w#(Oj?met$MZLlRE)!+4oYn{127StNmwlj3|Y`-MOm5v-0aU*%FVynmEar{9yY- zt^<&A81H6pPd*B1X7jY83#zZ9voCf2KO;+f*388R{Q5`kN1*~T$wi1*7!!AcR802# z;;&hP>(e3#EJgR|#(-RY#|!AqavPG%R!>)De3})u8WU|X1q=O&F|kA8O$MDam-ha$ z2@nx^%Lv~xiW1SyYv^k>n=<_U_v;Ow)0om9ULB>a6k3!5pzT1bN-qi{HF5H5eq70Z za*jpGGw+c{%16}|+AgdLl8?Z8Bw_`wf&^*LhwIuRxwkNanCYXeyrRj;aqn&vibctv zcC93)&rsS4t=JsezjE@Q+Msxr8~w}t>DcQ7%j_UsQl>-93W zP|%mz-s(Z};25&ja3q9BsDV^ntK@l&_?xyX7#W*i{OMn#Q>n2M-p&uj5wn=^Q(OVR zQ<$`elUlJ^*1g`*1+hY_N~^$=VizKw3FcZlvPNt!=#<|Zmxq>Rsp=n5RWFP>vGk&g z>19{-4m~nVN@mQW;u~~cM^mQa`55C?fbtBs#k!F^Hrv8X$l|O14>Y6vQ^Cntw&+nL z_owMQmIaI7sHUhXgaM~$i`W2Zd@4wJk=~KH^|d&poIICORjYgG*v$;_CpVjt6DJto z%((zIrH!1P36bzqsJXmyVJR z7eap2Ys38&&03{p>~N!=>@CU@-!Ji?Ge9g z<$euDNv4PoGfM?X{zWX;EVh?#a>L?4ZS7Kgx*g?(_%S2j9W!#G60B_)(H{u0UEt^b z@ut&kf^gE46DiJQBbzxzz7Kl?p&;Ya4`)?wghteyCxIB1v~t$%g@b5-HHy*5AY#dw zP~e7-%k80Hq@Ix>#frA0SG7825|*eg>Y+GT^UUxy(}A4Q`!mHi?n{-Ihv)<|la+w% zCR!6${QI!K1pZ;y1qInBSwswUU|E%Q@*Klm~0i&+_c_%&ZJo|S)kWr=6)W>t72 zruN(~2|e(eX`XgX(HdCZ9v$9)Ims#_014nz8c*#ot`B6^Y8=8nx2tR&E`pY(XJIuw z@qFkr%#U(iSmYQDD2nhT&?(N(9L9h7DC1Q$2%_}2FgC(b&AYvIYc-De0S%%u@n9*$ z{q76keo>C8RS~JF(Gd!~hwBv2W@s2Vs&`C-rh3rReI+ZP1E6jOWu`ZQP)Y2BbO_Af z<-=qxmyfXD88@l-_rt8TrmYFz8D5>LIW+3gl*%wyP2oyq84SXII4ghy45-kAwjsF)lrWh^>^t5BAM({c`$yv>C;E(UbBwp?`9gxmayvG z41hATR6w@lLPkAg*$J6GqwL88OJJt&+cd^6MR5g4RMOo<+LLt^RCdd9bld=pw17U)gPyr3gB*j86_xj#12#DnF%e-C_WyUyd(tH9GNi$a z)UIBt%Buh0epg5G$}$E zwFj(2-Xv+*mk-@t>d8;0ZZfwS@Ty)sf~4X7xbsbHME!e$II)B7mfW*|!pHn^E|lcs z*L7J`jW*kW(A{L86^bQ+6m(GC=)*=)^g0n$Zv(>`nF4W zFAK@^N-Su_PgU}Xmqd+eE=5$-k?U;;Q4h-XTtU9_amyt8B3LC3QM{{F;_k5;@sL~y z-)(e)7VVR=1yB#dgc0N-wxT*^KfjwwAPI5&WyiQcFiA zRQvL4~?_GgiKNnEp}5-`w@+ImgeB z->F3>6W3AQD7V|)k;;gk9{&3h4F8qZsLrK+0@aD{<>puXqGmP@5FwxzSP)m9+rzUG z48$fBrjlpGG|(S4ni&}%&ElCcbgrw}5-rs4BH=2;W-SyY^mHtQ+%vX}aombOJw7av zbN8lf8gACUFEaKb{86qM{p)g3$f+C<5?N7gyomyhSN&h9TWh<8F+?^Us?~U>$Ooa) zFed-P8{1+y9bbvpBzH%h-V!m4r^Kq9(xNnq#+T!a_l|rM(~~nCi#t1hqv|l`_-kY| z+qW@7`Ye2$0MFnJZ^i(T`fZFr^g23T8dBCLGAl{n*%tetbA(7zHM6@Q0IL6+N7 zRF53dj>ME8+sPV=Y*F$fUbmRdD*R4C*sIM)7z?xFWsnetu2Y9m2Ghcot3=%jKdwWI zJiojaK%3uH)W4+$FpdDE&8-O#DJs(F$XOVu-yv%IjUF+I)(ofR^Kh9PoE)}fj%%&o zQ&WA}96slus5^dsC58(U@a=4w{Y*$uPI{e15SUA~v=!+RcSlENOb(Q$jYf@^a*`D; z6z#tqHXQ#@p9-nq;d4<*0obn1ox9QqdCiRX&;St>v_j-7wjEu-5*knGX%S@)ILH7zxlAl zJ-J%5xoUz5&ddHaAwy)9N=@%=wqJKY8jtp{1HpvWN`<#nTa%1*5VU)8gdDY&OgwmG)JAt}Ve*5dG2V`J> zZJbML$9>?50!^j%QK)8VgM%m-$QJ{(gF^#Ua{@~;f`6ZRx@f9cc1_YTgN z?{@*0Jk!^^&}e7w2jh|K5`-psEu61 z`Ce0glieoysO>pk75;l^}@19*=x#TsSBvZ4G9bMa2@6C@)iYn zh_I)t|9b5+uy&u3mP!cvmBgl0p$mO_6USId%Q&ADr6}yfct)@D1?U=QzJ*sEwX!Xj znHRr8fjDCWuIez7l|&z+-Sf?wi64?r7D@>7#Pw8o6eI~-{C=Q1!DF5hu?i&Op`{*` zOj1FotrM)I(DIuOG!h@SLyDpYs1%s^_A_we!pq9JxG#82t9^sX#cpp>pT@l z)GI_v%F6{LvQjMHjl_~j;s4g_MPM7 zG}&Y$5JaSx8X7B2pi7CkeeqyB?3$)F1x;*Zv^Qyc0keE4!YusA@}+d-7uQp&s9PZ9 z;>3Nb?1`jr3ElB~W9Ba0M5pQ@eiT9eLu~yQAT-lwjqQAZ@MDI&h)P*cl^pg|ZE79` zGQtO@o0PaVL|7aXs#GSF(r=~&@nVi3;c^;HKsdP=Ypl{do%V5S5!KPKF2Ekt)g4OF zyM3i`YA;taba7YwUX>{$JndD$Dn>~p@~Qk)nB}y*-8D4sI*SUWh`QtTwdq9M?pV5M z)01R}I;%*Qu0E930#q;<4QUMFAx^>|kz?9YQGSm>IUfap=r?f?44;jKq_<1caAb%< zLLuVJ3-(&p#&wL+Bg+GKx}c*XrA~G33S(*YUYqsHq;qDBs>NmI?@yjh% z45vcc`duwMk76uuqoZ7*V~J>fpviWlycWUQD3z1H%E2J}E;w^;7x97d08+W|8QiChSVym1oCm2qQ^H_`IP!{(jJlt$x{&9iwRJ)xmE9N4A)t4Z*cKXHVHxZ)5S4Uqpjd@oj6D> z+NQngquRAsHkF@=d++oF_H$$}DLwt>Xm}{>&dS#bZk3a2nd)PS1A^0{A~BNrfL)-G zToZ@gn&CWkOARY7BmZzw9FsHLc%9{p!(V>;D6;P3iv|c*A&@KL5qFw)Wr(1x43PD4 zF_eBSlC+3Z{kKwO)4*MZsDRXm8lqCI^vj{t`^(pR{n^c2+J&nEIA!A&ju2;VEKl7v zYh6=nw$|o@>;ei!ojl^RIZow z3xW~tmd;*9_s~HMDLJp}dxvQjx&+>0e7!cX3Or@e$k@#H35*Rwy}sd$xzt#&&Sjk# zK6Boz9@~a=8f0yoJ7~g8p)$ym2dQv?0e*ukycFcPIz<9e&STP8%85yfMYEx(M|R50 zg3Qf7L)D^~tj3LD10d3+f7$d8jO^4L=gK~ndXpkKjU&IqCW>DTtvrCPnQ6jvXnlV+ zjE+)}yc)2z?$B@YmfPWGGxzP2E7ESVl~$55YI{UN#5>$vCq%84@YF8C5Z(@dNitY zFoJ_N4GtkC$Ze|GaR!Y^&1`HRi$PM5_LIBEski359;k-McNEHb819QlA2vL)kAfUHKXrL_d~B{6~S;2S`Bwd$Be zP6At&owX!1p__4+oqGS43Urw2_hwa27RlSCu+^kaQ+N^{Z)6iO@u)J=L@(~urvo0p za+FY=p|DY$IbHCKj+Zh^PPJdXWjnDpwoP~wY0oM1TZ9zk-Oq%p%D!Y?S)a2BU1qh| zjQn%ymB4SiybuHd+NS>)xDY9eQ5{pdWuGNa{5^d_mJ*OFLCNvsy-NPA5BTT(N3lK1C zGXn*cWEJPJzh-=jVT*yOIjCy?QkkCd%!9x_)a~ohJuqC8;1r4?L(21oggu~DNZQtr z;n~i*eJC@(?W-7`g5937wiNDPkBKg=a2g!@0mwnT|;7Yk#Dxf|}?s)(vtLRX$#ibsH;wg0j&RaXaGzfoz7L8O_?i*+F9rzO8#9dGt-F z?reT8z1-y#_r)^*U5NP2HErgBcG6w600gy1HoF!OC|1w^@~{t_fjb_3rriY(q!KrSUHo*oGM0bkmzBuN zc$LV*GuiEW^piu0-%pW&amrHC|1yP&1>OwjX~ zg96(eq<8HmpbzC|GzHRjJ&$4bF$q9Z(b_ECni@c!qBHeN|1Ub;JJ3Rk8-Oi!Fs%k4 zIeZM)|5lxMQ~OzeEu9%8cq=P&%WT!idB^J(F(gfqlz<(m+-7VgnL@Q~qmT0IS+;Nh zt-4sZ9pf%BItRk|JkG0>Hp=6r?)*`O5`UpsnO4VQfF?x~xv^ionRa49V0l}^mcdLo zB)(F&>Yid;`Q$xurclq@J3RG(G5q?ws10L9=RDhK){1weq5#KUnLfaAdUg$=O8nfc zB|S@g+V*>E{{mQu+D8cVaVFK+B}+h^EMhv6QC>is%x1kHShF6)gAyn?nS0KhLYhBn z=Z$?KOKvoicrF2aKVI{*ZaBDT3$rRhdMN4ov(7;Fuhs<5r0qYx1V<_VAH>8LBbVrs$P&b7B&e7AAT3* zh%_l@a;OO99x!G{{q#l{JaYStHleVR_>iE8dJGu8*JD!7>%CdpEJR^83bm+*&WX3% zq*Agh1efZ*4_wd#h3mx{jZ&=SHYtHrNO|bsG(x?X<~kUMG?c+Qk}RuKxh3c9BGDbh z4b_BDFQ?&WxU=0Q`&*>t-TB4)(5_l3p_i2b0=K(~d)0egkmjlf z_rfKGvY`8}Cms^p!%5FkrlS@?oB?Y;!7DO1>1e+E@*Ml0vIL2S+e@gOny@k&Q=yEd zkursevBn&IxVrMCp8L%W^$v3J4Y;`UMdkKQDg;(!k4Wct6eN)s&a&AGSCS9rm%?_2 zh3t0@<3#<}tcZw1(3a{lW26D5-zFzCQ2)1)LrAO%Qh7`myU!JMRgC#)8&6q}BDTS| zf4vTSSzw>L6g^uK$S)6iAt`3xL7!Hv4Y6hGP8h}Qj#xT*?4>}tR4lDl^y(Gx;6xIV zpa@hxE=`#v7m>^7@MpObXhn1O*rg-K&Ba5;Mhdi*M_XxM;EVcOg}t!Ru`YH4OmTh?q6 zCY`We(kG5Y8Ql3UAW!1A=1eJ>?+h>R=v~n;boD;OUEU-`#O=B25xkxMPl5|H^0q+% zBih#!PK&s5lKtb8Zq$?D87d`MMJwgpkQ|maL?>JU)aE!~O_)1>Ck^PmV8@irls)Ub zDiwh2qaO&Tq)}~TfQTS3PMpMLORnKekw~5zwJe1)5t&f!)~0&|Ukvf?j=BRFiWyu) zaWZ|lGN-iXk!qc5CET?c0X9!=hQn~y$VC}GkD|T8fm}6;d3O9KaKwufO4CKnUpJHB zFMeh@awt+(>P^~^-^G5}HO;I;RG3yd_q&Zvr@%z3+t!hZ!BgVQmf(F26-`3mJW}uZ zYhtK1wL#eg$t<={LYLc0_>pjD41`@dM!86@hPteeW~c6fE;&NcjFB$&8fcQ!gpLFw zrJ-+741|DLG9=8Y%mM?E;8gM8Dbs z$1fi!>@4K4VZdrbPo&Uis8vf!mkbv+xvz{1-_i;5D?iBq!eAZ{_A$P}vAbi!|5(v& z%&Ahb>=-pR&~!HMTTnv$P-34#K6%<_sQ5$}L`icU8bVDbwW54HN+WM%!pqhwu6o<) zq(LfD;PFDTmPCpzodm%i&4(iH7^TQFh1^x_C2gF-X>ykhVewA0wd2cYJp(N2d)KpV z8u+w+7y-~hJ_p2QidFIk_>^QKJ^=W1Eoq^MQP_^YyZuF#^D2nZc;?D0YNA{&@-UP< zeeTMdB5v`tyU5E{MCUxiyr;8A$6)D64fAI8HJB$`DbVUM=5MHd|oP6+x5xq>BW~3*;boL)(CngFpTP{AMP?4 zWX#&H2=#X-EpsHS-&Vm!(m3@T(_PQ>PM+TB;!}0Nbyz{gsJ`TN#82cTUbe8TmUBll zf7#L%Td*&t%I0RW&5Dd7Tl|`&H98=*L7EeZk~{Z%?b3pY<)xh*qct(Ged-$ikQTig|l>~bmwwkN{O94jF$$DhRrV=kau&{zv%m0o*Dk~bNew) zP{J!G@9Fl(`?+(MUXlz4hzofJCQ|IgTOjvGgyKPUXG&VZQu~ZK3kY9()ryH7@Iz)G zyDWqhUnw9A*QUbV#H~ikoazudFLO1ue@t-pa?QQ~k6;L2=2X^NXqlY=GOrG+*cL-A zC!1ZbZ19TBGUdQywV!9a#1p>J23PBDU3?UX!7 zxC#uD_3D2j;#6#01x-6*f5sezlaKiJi*>CKg*jn(&wbYs+XSHfnoF#0D*bRmnu)h% zsEsQ}RZJWr=6v3%0!TX@H7Z_m+MMBDvY=`aYRt%6EFSOgL~9ooS}J}z6Ji*&dGB2| z?|X!Bc?Ce|0}`xk@}$WxFTa@vWr!E=)RhdA%4s!mZVs7br`4QNCvif&3=NFVbul~{ zN%T<* z3t}jGrkZX>5WDAf}@znQ8h&C-5W77i+gJPx%_`NV1t zoY@YiiK(h^HF|fuCzDYmYg$|*_n@8ZSLBkljV=7rAZ2Sb4aZGUYurL$D=CG!CAjz1 z6wB)rmnTrQRy5+IHA0Ml;V<1iHZ4b30U45ZA-JyMQO`Esch7eqt?q-T4x5HCQ=CK- z>REtJ@3)zEk`lmVBkPkNIMU>JRoZ$QxpNm@sb+|T2upm(qU`$LS=2{#g4^TI2R zmBNtPWldWsD9XwWbFIxJQxq1Mvk7~zw$jo$XXNJbw_Rlc@&6xRZ{BR%cb(1B6tiu;CCAAQU|qOqa;U7!nA^9kMOkvgHO@vfN6t zq+fUM@7{azJnuWkT5Dg)seSg@tC@2&?-+B;cFo1&aUF?F6KoDU@$$)-9GnC79mJ^S zv*}7*cGP!|PyZq@vj$d1aPhT&xwr9d6i!q(4XH^I?+J%-7w+GwTW37pJ^kL(w*``l z5YQGts0^52X+onFMZ;zW(v`bZQjf9wt8l3CCvn5-;{SPd^XYXHGKTHA#RU=V*Y>gH z)O@7jno1XIulKwLJ&$E*t^0ST*8PX%Vnl+}X$0lftt2VILi6g$J+j>~W@BDJ(E~&$M-|3V_&u7Vu-2D zpv68dTELG-QO7gXDyWNyzuK>s8;>*PKNrY_fkd3;!|UQh!hhpMp)dkVkFe3Kqg2jw zam&p-(BiZLONh_`+Mqv2v>@h^fPvNLp zlrxocOjnx9ZnzvF!q{tvqsoyl`iwDq?zOkCZ%NFoj-C*nBK_&x87}j>Q2Qmn-rZmi z!io^Eehrvy7otS>sq#%cE({0+RN-IcaN(3f&*Ft0jY>Q03*QhyA{i z25{8CMq~Zv%nrF^A96@SXTgC${PE|hw||@I5|<#bv#To-+JQ+$jx3*ZK4`|~l|dqR zHE4RI@9ysIt3^z5wosJ!`!u6#hO2AhByx@Q?q_6#L7SM2E|D~F&FB^q3Ia%D#vgg?w4T+r6uKC zedab9I@uB?(L<>^*#ey>8y{gd@tZ3Hv_MeQzD`w0xe|m%WupUEF%z_YD8+UEO8wL2Hcw!R`0QJHV}-=OYqyy)*u{k(bN?i zxQxkFA??~=^{)}S>l}ALa{A+EJChEo`Te##&%ulwVdit}>}W*(H$r*3KoAz#<0@C? z1NVacmA4XLA!uAkm*vP0M+tq>(82O~KkZj;X#c*te?(o{otzDXD3wm zR0;YhdSjOERM{`_Kv4)do;NV$fgWkr64&6?&eTkA2E4#Edd1^ori(5s5H6xlijgXU zHPx{2bEGJITeefT(OK}}ke{QA?+Tv=3t9~J`ZKrlGwc>dO5^bR2Y^$(rPvs`Iyzm; zYCErqP#RrkJ|1>Z7_I8O0T0PLq~KIOmqy3V^xFuvpiAs1+7aM zM+slukHCDkamcp~2|@CcpmH3mfspFQYb>wq_!l&fwROp^4t=hP5}I{}Chri=Z?S({ zI|jA!`smRFQPNdKc8BB@0>~{q3U|P}mRxOxqyFs(boZ!5w_0eJNsW7Qo3Ewyru z=a9a^C|jZ9JEnLJuR`Tk!=`0{_JrvQt;+#?(x#iaiO70CTx(ILS zbOu1%plnjH9D#li?l_%`{Hh+}wWKiBDYa?m>1{plRcRn`e*zV8V2t zm`bIMF?_#5hJGT+Gy>OZTdCU2I4T#^BkZ}dihS`0)wCbW`5Cgwn)Yby;H?&C zrACujLof13o_Q651QxY8>|$qx6cs+M)+?h#LdXgDf^jMR5c-evEc};l|ABsi4oy6L z$%c-fg;-{1pP0v>7I^veouN70%i$<8@{6MIFS{*PG{n0tMjo$<@ciq3b3fe3rl&Jy zU6LY|7>SKoRO)3eM0!>eRDA((VnaY7FXMz;^XB*%N-UJ*vQwsD7Kc~%sF#wtb9^8A zgBVn6h+}sVk}BuRd3ZX)MZgk~kYn(UFXc)LE7koQd}ZELiQk(}Vfj7!M_4^QCpLM@dHmWMdv z?-$m-OvK}_s*ZCJ?`l1lWZXVCQ27zU-wRzn#S#jGcKupL_;Sev4S5*9`8B?JH^Rkl zK4h=997M#!QI3#G>SPO6vLsy)<2mvjR0Pk=n0>8@`XxySjvTgX%$92q**G5HAz5i{ zP3>&j+qK&7;`UGW;_DO5@G$OQa-F0aj*Ilh@|<(;?Jnbi5HgS!=|`EDc~Ikw=buQ+ z(6&n7mSY_7a- zxY*EMVJ6Jy`dR$BM>_LO&C|XZHqi|RLX%YgCheM`*z1RHUu19SywaA`?CH;b6TH?` zgTClq1zk_;Yc`Z)`?hbMz6nX@v#x=O!*pf$dK>^J?gk;a-tqCF6UPdkel(FoC=&!9 zObn|wWDOa{_=NCr9MoxJB%u$qpAxd1ObTW(m`dA_D#Vpu^&NU919xrpe_J6^C~_f< zpOJe2T%#D?cHCN`FWu{rYny3wwM=I#?7dUWD|%VKW*&J0{ayb+PMA4V*R1tv@krG7 z-T|xWFOj`UMKP5t-{}*jnlv*z@jU*+X~_7xW?oGOMVP*!osM{XSTj|)l_7l=IVu11sFMO3hIVXo)?(9( zG431m5ww_Ni}8v`-`J%kMH-5J0?6Q9E@}4EiUA5Lv|gV&iV#z7=IRWKkSW0zoi3;; zH7Al<$5KS1fjq}Zwe_>dcX&(c)AlOH16oX9q%IgCE6ipp?-PTb*RLi`EWABqq6k`i zh})mh{!>|OEeKSlu7zmW?|6*chM`i58z4pc2+!sM(O8btC2tsxh7i-)R@+0YTt|Z0 z%r6jxadHH+KR&G)a~t>(N_hF6QBaQxCDx06 zDU*xuQ37mAbM+kx#7Egt&?IJlg|ib;55)yHwZN0Zdvo6wg_)#2ci!S`ZD3qE z2uiriZDTvPnNZ%T52h5jxt}`N<4;bQcz(8K%+)b3OG-Y`{A#zOcc|E5azsih9|KH_ z-udi&wT2n8MHID@v0v*1U%{;1AZXqXyS+dGX{sz&O#-eiT+4kZmEvpS>*q72Qi^Lh z@A6ptUlZN%1Zmyufd}=gBxeSlIb2P6nt2`h;s#bDfPwn7JyMpob^yBuu)x%+f z9TPZac1VYG@%d`q`X7fhHD4^IaCx_d%_JK?+T!d9O1){*_f+&?Xn}+8+?^U?iiv|R z4)i=eiI4Ub>={7mSNE!M5lw%^KLh$WVh7od9f7Ul=5XsFCX@ zRj&~_;aLQQpfn?Gl$o)D3SL+CZC~3uau$h)Ye#TW1rG;&@TgaG0<4RLNU6fvHvx?r zkyD3={dVr_lzg@5=>1$zpaQ}6+GI%nM3tC)wA*8T592ArT+ia2$fRr+MCN!yKnw;0 zQf#Ut#TXl{tP!HZk1}LWaCC6T-hO=p}!97l6E9Xw$4VRZ@@If$v zGU!>@BHN1_Z)lCKqwjcGAXTJNuLmjv!s}tM2qUiA-Pd)Ju z$ocEM%7?pEiBx^#EShlj^EV$dDGqAPA6wub>{@jMOs;Z9p=yy;%t<$%^Px{yYNq)} zUKP(UZZj#xEgbH;RgLZt9AYW8k=X2IW_W}ERK#s4%OgqhdwF6eX>;)>&e5X}QZOvT z?)~^?I?|AP^Z18iiipQ;cf5^_<)|DgOY0_m+N!Rk7pQU!Jk}3g0Ya#%lGEo;^XadoN-JV=JjXV08A9p{l<6cD3sGQZ+Qm~8t5BwjJ8GJP@;Smjzf zoJ|Pt)uf?Dy7OMtMUBmS{yJDP!2ayT`M;MOuXsJXFSUs~K-vRmlHKE4e?Ao~XNYnQ z#5*7uc6U9sVZRQmFG+`Ah>>U5kPmk*s4Tb#TPtVv6F>oxn11pDLPpDnmG+ znESWK4Mw@MoUB(uHsbI3Ggh0w-}Q>Gd9&D$rn7WQIiSY)DfR}3ri{te&*yDKs?f`8 zZ_i>}K##|C5BIGZP77z+;2StUET9eIzu}WbmK2PK=mZ!*iLa5qJ~BZfFGx|_Q~^i1 zdywy>M1Nx!6xMSBEA-N|&F?Y&e2!dc?;{dr8?8{3Y9-h_$h3rItB7@V&PeSBwrP`@ z@dCRmM`$acem*9ge%+C%-jQ|!4aeWcLDsqE89LdSdqBK*iUEHt$01oc^#Tfz6YcKw*DiKAa~#7^ArS@{>rxwHv2Kt`Be@w!`t z%Lk48P3Q2U8X|;^WLrM}co9W=*#`!WUpduuT;lR*x~#crtQNOzWt#dT>u8}SEh(?@ zLl>HLSLqMvYd>R|&J&dc8;3nUC@|mO!9F8oXg`ebN6SH}3RC@K5~FP^2iKA*Za2Z}CQ8j%J$)~!@|-&{aS z>6AwlO26fHc7!PW436Y^YjltfA(@ZI{CW*~z!0#{rz(%o-9Q*=3%?wW;KXqUqFj#1 z;;6T*v~4(L?x00D!nr!09R{_y*DXNDu2_rE#uq40_Wvq%W%Z;FKZ|M~T#+H`spXVj5u(LYwg_B0Z^1{Qe|q;<eyCCOc~Zr!jfSC z?SO>o91Jt3v^b>|Z{^T}mGaJAMQ#V%94#DY@4?_x#l8*>2l5ebGN)<)1MV*Vt#dN& zK^BH9xjD<#2A1#CC}vSKO@!t+N-Vbz7d2Q%r-v(L>+|Uk6SR05tVw~rD z{rY>_%lt=LnkVQ?!l&EEC?)^oC?(lqeP-ThZ7D4oku!@cXitru9=sNEV=0bTuon5) zbtHvRG9bYW*Jcj!PeVjpv}%4~HmDStpnRw^bt^) znt@J){8Algz)!cJ`NVfteh!{So8BB>q1=qO6~ZNOv6zG8{xpju?wj-> zZ^Q`@dBmr!vbwEFfP^L_! zAs|1=op>r2ytX&y}504}$KK|3GFMM^8>q@852s5h(-jMgiXzih) zr1&EL#Z2fR{-l!4L|^bN+ePd?-yff9Lbdp4jpRs|YPe)zNtcsZ0-&SfCM@MtJl94N zZq^o7tA}K(z`>T)BfPgVqgc0vT6mr-Tjies@0*h z9k8bU@Wb`+s^irrADtB$@$=8Q{)(Crb``KZsn0u|Ur4>J6%qDM?g!!CyE zt#7P|W$J%Huj!KcOP%99oeMafr;c%DWuAjk*iRI^_C`G8^>aG+3U!c zRe@x)8q4+=QvjzPqLR0RA1tq)bQlrQmx@L{jsuk57_mXl2GUR8wt4hVS*rAhxm64l zI}HJ90Up7=Hi-{{IAD&0RZ3TgUOh_zTLr{09VBS4O=L7xKJpzh`cj%SUO=hP++S&5 z6{tm}BRFgD9%snU(4li^$(#dNu{;f@;ks81~=DC3egO`RnNj5mCr( zniH0dBd7T;zL8jRh40nVj98RxNXx`dNlYn|&N@W=+_Doj9>1PE1F^jwY1-aP<*yFV zFW(lQb)IvuQL|cGQUm-!Vf2eQ@q;l%j*sh<&r7-jyS{N%URL5*dIoC{d%XP=4*z{e z74TmiHmaEDJuemcv9@9x-6b;+AnCyXOHl_8aS@wgQ+V9Y*!b${Pb-1xYD81+w`xjX zY_=O#4(~Y#TjL%p4J1=6xpyrw3#z|U83jSoaHzDcQAi&jbDk|}Z-nv~LC4o~&E&rgX zEYV&-D%aX~e@%Bp;~SoSHg$X@=&_MW$^kXqJS+Rlmt#iZu9gbxq~nI!KB4m}m44c*ZwIHsk@es~$mD9*;jj zspmJ93q&FHX@-x!*Y(2AG`jahdL9wUg5OBT>08q1NJ%8sF$LFVyof6_*8c>~>w#>N z2K+(^q&~{E`umJAOo&Q~ml=8vWlMyg45lVC3H!;}wVW3|SqQ-KR)&Dla8iS6gsy$6 z(+<72j9;Ta2t5?LC@FR@3_yW>zE-akfR@MXe5u|5mSId4iq}vgSnK|HiTG@CRk6w{ z1xw+zBUt9^G2g1GC_TR~{INATm(v-aS3VR*xVH{C^*{%#h%20Rb=TaJDRLg4Nd;`~)>3cm@|BSMW2;Uuw znMQdpU0OIHd_XoZ37upB{pnv@$eq+BWhBE3f2|La{gVWKccD@)MVST1Ifce*D76U+ zByx^9T@m{M4(1Z5eIVJ-y8YpCyn$0d(qIVtqTc%e0b5PWbCV@N;ebYJQ@KuqC<<}4 zexr+vXu;Tf{+?~m-nAI{mDKcj6QBXshX{7hezTtC|InMO56N!o%Kc`FXjDxgLB#EY zX?i+P5Bdwjx!e3%L{t;-wkqYc%6OTtBJy1>Ip6E^yMAZ-#CiEV-G1`6?U{eXQ@}jF z2N@(%0wnQ=_j0{vQNe^mWIK7D#nOclN#0+N$$3Z>5Gf;$rXEAwUyd+(TX+uE1q3#fU03@wI+dHCicqIy zD`~8^G0KQ=4Up6A%BxIG?iZOO-^*!c=W_QM@NLdhkR%)OZ&(jy0p`LmKaNL}P+O_i_&TtEwxBNz#R!HIwPd}fDFoaOD}UcUreFIA13xhS zl&zcWa{JHnXh`2c(^rKg1^+U5JL1N5%n8#!6WXPN&HZ>s`}@h?jpv!o!S>+^9je&$vq`EVKi2FmEIJ=XbBK%j~3AYyyW8HMnehS^NH zMP_IsRB5S0kEhUjc4^slu(>PZ(qfBA%55OE--#WpkHT&$n>(p zc1Q~f-$uQPQP$HgXMnrf?gGK2_7e0im6n>S40onRSU_VMYkuw<1TQ6TEW%(RWu$DN zn%AQQxbc8*$W8Je;2y_@`Ak^2SBATXzk05>KjXmyH`v2mMn9^v{m6yyjBDCA*KJ0S z>4~J-czg7*IzN+F|4F^~>sSJ`TXb;Mkvle&3pnaM|h@l+Q(jk@$!f1RD*nyag zp@*>KO7ea(m&wKG#oZ##D}-G`B7cQUgFfst${>||_O2p#7-%W1-Idlj7OkP+w4eIF zA;$jdU}W1Sw#>~iY^f^wg)+ZnS)ad46DA|P?vcjfKc7D8--B7lrK1n+7isZi+0!H2 z`1o`o=X|rl&AwLaMDvV9VHpgo-_^&C&N&#KQDJ=(w>SppsW|5H|KC2oMOa+pFLI3q zs&P6ZiQ6W+W;j}To%h){EJ+|-r`IHj3MLx;gOn8)dbOT_rJ=^CrBX`p*T5+4ZW zgr<{@bdNEtfmG8}>UFKtfg?A@JMtVR@XicLsx`FWVxY>`xECm?>by74Y5?*Msi6=D0MPNo~?B}?&u7u zK1Cp(@tELsW3EFH5GC2CyRSLOcFJDgDM0I4$2EY9F$tygMV~$1g>vMmC{I53E#Z8A zTeohF-MvlUZP($Vc-wR9&vk)HwZW$Q|49%9_L-!Lw}pJCMw;bZMA$-|Y%!UyIj&^+ zKLB_f5CXd;(kTD^vqj4De~zEGbK<)Bf{rFG zE&yx3*A9btw<$9ql680@W>#>SX-dJ|e8xjYKCo#Pn#l=ky02kCFykdT;>m$xV3ee> z!ku|;*JLXkGOdZ$3N!3qV&YLZ=`YgkIpW*O>BAS29I_IJS=TbB3Hnyfpy9)*5unk?=#%|5@;I0_w^3yzyePLA?l1QY?6$@DX~Oj2V$c#h zT>Nq^5uNl2u5wHd|9Hx}To~_K5fBt<8 z1Aq0Z<+FQTW~s}pMltO+nR5d>A2-{n(A#HMs}SQff#>n*#?3RhMTxhqu z<(9|tf#F$qu&*gGP165wmAs^GH;u8qU!{3wN^LU_&|`(9a;TMvP&@bo-lIUq=k?^nBDON5z6ia?>%s^xjW9{Q~qI zJWxDppggM>ZyA6fvz<++rs_s4SWvfz4B*MBBZqSG4C;lS<5^zFb#*P;>+iPGryY1& zw0vpbgjJODcALSZ*OFTmnVG~vW(Oa~8eZp9!W4`S$XIDdrl`xs)K{|eZzu(NbZ9(}BuX%y z)v?;5RY@b^AgIZ||MrWw_Xy*>8W0^FNG2O0(UxvpC{*8)rRu()VGzaVo1I7DZS}c& zYAh}x-7j!NCQ@2^zjmu>+S_fQt6&S?v0bH%D>k)&1U<=WR_@dXj+e;11^%eknyV^L zdq}zRff%Vs(GSO!I7*{o(|H~tuvj&8>8AWZeLpxOZ zEDe?4XGqI1i|^GsnRuM_(&nj71K4Uaji}HZ(^}3WA5tGdjpyMaV7RN-OsFSeGGu|? zndUIXM0(GYZWT<7%LoLLO`RKL!QsHI#~H(`0w1~kQXi;#*&P|4J^wd(GaPXg>Qg`G zNb5&P1c-U#9YgtBNKznsmHz{e963vvSSZhc^oxBaCyU=$fd7D2R@>G>dUPujk22*_ zlA?)lTx367RZBP@0h((X+NNJollQt9_l)7SZ%bH@|738F=Sufd&bNM6HlOH@y5e0c zCz?}l6g(4MeRYrd<(26gEbSv(nQIlKewt7$#4(((TBUGzlVYm9wWdS>2)d6xxI>mvv;b}M27lGN{{Gy>wSa%fK${a_G{BX!eO)fz`n$eo+67(R1 zuak5go3zNWc^`tRn4k38@;aW3irmT`Gie0=UNH{CTiRkzGE-1tB~eoA@OSDWenj41 z1)jmWCA;?nkulz}#cPcJj4OO2xO`XxsZ#8m;YfrZ$69Xxi&k3wJ-$>C>1sn ztW@nyMURfCiwMk2%GcU)DRCOr)Ah809#l+@P{ASk6ll*+1I3Kwzt-EWewC$6Qi5QH zWWmEb6RkOyN9w_k+&+=L8&UC%55_dUh9#k_X<6S)JU~GVz+BR{kso{a4_xfsi{$e3M_>im^bZ6Ih zPk9-kSc#aE!j_211Hla_SL>?8os!aw0>{v`#o=EaO&$l`W&j7UXfpC9%CzJ;d;XfH z&+m}nO7U!!%S%7Y_+rh-6`i0^UXQo2JMyV*a-99Eo*%J(I<~Yj>0+5!s$Y&Dpng}N zGkffGu~p75*DKJW3@!P*AM$0Jckko%pPe1u%$X_*{+BtAia{qWAS6vyJ<9XM`y0y^ zfW4p$AbB@eDq=DM>Pu#<5j|CUY+vN+*$C;q(Obc{WNCbiaq;h;5)eX3FXnc?vr^9ZP1saQ=zWuxn4it-H z=kd@;mR84JtdpSpB-+v&g+}4M*5*qjva$Zr+u54Wa?3o#fom`~4pUybZjkTGwL93( zyP2~N?6c>3_!gKm#K>2J)Wd{oVagy~^nrS#FMOtI;toamk_vz{8VHKTokvZ{~vpd#6wTEie3h#%Q5EpTlEU4eIrX zXwhqP>sw=$I}sH>KCwO`zfiz!aik^I%O*{|^GoSLS6WiNWLq!%0Ls()(F4ZIDi^Ry z!tbR$n{h{lx`>eD5i3on#guF3#Gr((-6Te1GojC9;?kPmGQ}}sTl9fjA$7#2aWEnN zMJt1;;mD@UBR2yQA$OofpzlMLpQP|zJef8(NLXLg70Z29UvewO{(3*h{6;gGISF+} z`)4j3*xn#xYQDF|SCm4M@2lrCplR-TL^>FjUirKgcf#vB3VB3&?zE{K%fx`eZ=~Bs zX*Tu`7m?J>PQN~(L)HTd(A*JW{SAMKF@)vIpn%x--#$JofFK=Be~4E$+BP*TZJu^W z_PNrKjj_P6)~%iU97DF$!Dx=Iy(Yyw!FKY~?FlAySPN+1ZJm=k4&+q16(PjQvNkI{q?3X=+or4+0ZNuHJRLkZx4nvmuaR-#I?irGMb!w zjdFtk5lR*|Z~o6|-uxY&t71)*f@h|eAmiIl>+P-|dG&nSx$8sHzpHBFACc=DDyb^_ z9VK)8_16=wL>zu_5=HVGcbMQZ!yTa-gGBn)F`-BLu1^t}0A>A(*ZR2wB1*1R4oP4H z>^AScl<{(2QRc`FnbAhS;HW6+A0FwLU#+OBc(!4B zJ;>))zEujPa{l%x=$Q+hg05gq7_hO#9om6pwyg-4ku2%MZ6dmNmI%#lr{|14Ss*;E zI?SjWQwZ$$f`H$04keEXrpkG6IXiM*YkEnu69$0)|Ak`pS9!!mGf>rH`}A166naka(iev7^%3{z8xxK5FRmB2_)uwd5rXcS%DzKQhKa6 z%@v%G)av<=a_NhITCH=*O5l|H{>fKqHARqHdR=O-5L`(-QL!EA!PhgQdQd$!7YV0Y zp?O=@29=?gG2+Mx)W62&T!{i4^VlCX!C|h$<60AtY(1y$CJ-xObU>FA>U9{?;xuH1 zgN>iFF0kvy{UpZu!JXKQK;fMZRlrZY2D_Vi$c@zGv4TyJ82_am$ z3!(&+&%T)YjgL&rCjZJWWV8d0^YrJrhN{ultRqdR%vFP`hur(U9O^QQYlMH%Sq*nU zH|u`XDBTXPY{U!6kk&=wuUOm?6isXX=2Yf+vY6gi zat(M}?9Pf}v^+$#hJZk2IdEyJb&s#Sdft5n&^vjArkyhfInd=Oet{4MmU%7q=IPG{ zw6U9(mw$da_D`UG;Vo}bGXY%u8&r%F_q+jiwBkv4>j@3D9HzMU(f zZ>>?l=Jn^uv3aZ_vJu@3B01WL$aF=t`1yemz8Pwhcf){{BnhqDUC;kDqNcy_t97j% z9#Rfk27q83Vnt&&XT7?(^*H|(v2d%nsnZBR(Ak%tROiZ$G~JU=bI4pJ8`jO6s23h5 zpoip*WcDi$SRBnrD8n_bWXv6>f<9NH``a3?j8jLfQ>Gmm zu9wyJt4Dt2G!`+?1J<8H`s6Hsiyf$41*LSNdX$W^+t_U@2w7P5Gb0{ks1`>XgM#BN-w9rA&k zv#ww=m)<@9xIPOO#&U9AL8IW;ku=32Hji)Grs}HBTZG`h9znusW3}rB``CAPIpOZn z7DWBDgpyO_>yleZKvo4FLcwa~m{^d8O}JWR)&5G@J*W}%KXVI;il}Q6yB#|gzNnl= z2KThB`rE!X0aNEM&w%qg^HT4^I>FV?A=u^$ez+$6VAAL#0j-5zH)?jjqe%k)Og3?xa z9Wv-*F9B;f<^P-8pG*(5RtqjFErYTv$ehIxN;ges^$(}R@I#;3VeF&*!6B*YLmt=6EAlA9p$_y_TRE5qk6 z=ra8vu5Y_;skNXX*jVB+M+PxT#SOL~d%mB06HzKI^9AG43Jfy8%&E%CbA0tJS`FXz+4p(YZ1O4J9xK_n z#2}?A5^5LzJd0_=z-toS(zJzR+$3p!{njD7+E5sNi$lttF)o}sp51sdIngH3D8F){ zFhVUf=AN>i0Ys?!2=hm8+erF9*q6;=-54ROggU04Ii)^m>#li;Y7crvC`KnJPh$`< z?_GKC9|3?A#Xt$Wd}{p!Y@xI%(d`H@$V-&;B}ZODC7Z-r$@22vOr|T4-x!%98fuKT zk~~Tk6F5*q>=o}JN4_5Oee?A1TN>U_EMBpjf)SwDD?4nl8#&G`bR?kQ`=z#i7_zF< ziowP|3Ab+c%9zE z_wsfY^rlnoIxFBO$3y7*2p>oJ9CNN``%VOEg@&jmT+6hvG!x5b(u+S>QEbtk#YeId z{BKZWi$Ass9vlYQP$xl`;Wo+Bw<5DP-6ZOeFIh{6*JHTxjWrKN`)-skUPHTo%Jh46 z#ON%4GV!^t;D^fvNa8~+Dp?A#IKiiEj?f)tidAblBu|<*cqFZ3MOWy4KAS$(gE}0^ zw(V(oRL}c5VqIUs>RM%1don)Iv>_W=9bx=Pfhj$mG$}3-K{8)NV*@NWS^Pgjn&3}A*!J>-~DIa64#bIpD zRcBsLH|ax0BVmiCuVF{f{K<-&G_};1|1Q_Ktm6*|Oh+rIEJ4~@aUgGCLd_1n-e{hL zQgA2+k_szp8LPxQgl}NSl88sYi zs;&q!Fr_RVSD}1qb(5%i)Nc}neSMICdIz)|=X|KUaD}4~Rvzfb%3c7-`;ze1e0AcmUa>`5mN}<{%=_+x0{1wzAA|UfI)UnMUodsg8 zJf@WQWI0=P{OIl7=l>&>22NDKcJjKzt$o}#U1#OduiN={8W>*&YH zDIC)lY#_QOkcPS|0(?*KRv~}g zVoG3Qzrv|D`l#8v9W_^Wy-cFY2I5B7E&mUb+W>ko-Vgc)UO-#cCD6^ z_WuhQeSyNFCUnI&p0ARPyOyzeM_1S^Ajf0Qsxt)<^nI2|MTJs@3aajRKAps^UvVsE z9jS4ozCu>?y~{gk+p8psQicT5)We(epM~#Y7nae0t<9osC+N z*^IK-siU|3VhOk0MBgz(si2v{gjTe`+K&{Ld9{wu-F@~|m8hy#^q2rOV58DgPNUS?;|M2cm%4#;$kW%~>TY7UP1dPKxFW;7x-|z(ATkQe zq^2Y_%7)Uxlxq!##{#=^m8P%0{^|v6hsDwh3}inZ3|Q#;{JWv)TZ4U-IKJ08@**nw ziK}WJQQ|>3?PWE_Ul{%)~c=jgSncfG%PW)|97=3I61Ns7Y{OjqTvL;llDb7aOV#pV?o zROE$?YF@hwXysVG0HA6E(_J-wvgZB-*+B5}>6;}P;G*>z@ph=t@Rbson@zcFwNv@2H`P%nUh}>PV2;%dA=4Rw67P;6ZU6GTa(k-D}{rq2sEB*{Il$>>w15Sk+_^y zh$3PW-kET#V9E*WMOpg1B{LL$$$FSL~z zOM@OMA)N^2aoE4qVLgjTx4OM9et#H+&fXBSb30A2?XOoCD@oDNrjaA`^6y>VDCC zy=hy7ch>pF0smlpDO_T0DXD;-4GE%V2EC4V7@$x0blK8fAJ%m$7QPJ?c3-J!W(- z{T2ceFD)uY^TOC9sC9sZN(k4s&sB=E=r?1#0FvUp#%A?4p@J(2bYxf9TQzajvCfMB5n2 zGZ5xV0`eJTBC37#GdLN)b|wa}8GJC)8}`MWA%tk?)qJaGLVWb)T)*HLgd*tF64Bo) z+GEDf&jLr=Qa;I;GHk~djw7(S=6kJpjHM{6*i&91g{+VSp+!kg8#&TgepV*#^^Z(I3uF=#Y&+J{Ex~u_jUCkhD!%QcvO#S_yt@g|yQ_VNnA z>!<&k1cDUOp%IEXT4Bx11#KH&AK1C*xKRx|YCvh?b4EbSmrD-=Xc0-K2_CzQOz|t_ zHC~F4Uqd#Glpqv0GGvxU3HpMCBp(x#PzjSA6PPUp$uyT{%TbRwN_@IU7+lT=wFq#! z?TWX*GYbLdDMgUXz-$0~fy$KTUjnorJnE@W(LwH85#CUsTntMi$9=O?l#pA_`k`D! zceZQbxJ+U>&e~u)%ZB;#sK^s@%5fDDNVY1Y%Pc@|d*PCC`_kI*u(mFcRnf>ewfA9W zw2LE-3697F6`_SoKc|Tfh+TFrr(nmguFk%CPdhUI-Jq7L@EzuGW}hZ5ASfB{X56P* zziiujSk2cdNSp8U4JnCCJ+-mrgZ{k#PLRU?Iv8BYbVKTd5Li{r%-vDRfTCEE;FpCF z2q*(;pfnk5;EwB4KdI!k%G$VLBiw9C8YM|t5x~@|e!^*NyVpoH-RE4XwshOlWow5} zcgnheuN}KpTX9?_EeSE7SCekr%T3p-M}tOYrsDenV+pUQuI#jD(kUvWgrLfMQ>Boy zL4BKqt&b#df;msbg*^<0i8$2RyEb5ed9j0Yzj!-afuFJ`#}M|b%M$a?AA{Iit|DP= z+whWrGZt0y@pA>>TSH`1jll+GYf2MiyMh)S(>@t*5Y~pviDab9{_tp+j|})sot|R} zmm!g=NVKW3MKq&6Sh(jq;_gD1$fTn~V7gZvQAU4(MRd=Y5dCf;dwlYRBvOfw?1Zje zc`hwSigHyuJ0_FK z)3i2p%8-@JS90PG2glM{8wj;$g z23uQ&B!to`1O&ubgUnOzt7rh8m&_|eR4NShv_^*JZy{~zQQiRx8m(K7RKW2-f}R^q zbrp#tl8zK#PdgEeNR@92N4#+e9}zIVbuc*?xAxi92SY`v(yEZ=&u4!5jicciXQP#Y zO|W6yCiX_Sv@T;P)KF;n<@K;JiY6Sd=IB_vbG%LM!|X^om6+VMA&%wx75<&&HU28e z5Y*N)Za4iiihy?xD>!DBBG&(3gsc<7Nno-#Xs}mgKQXwk-#dJm+lfrvn(99WMif|0 zHjc*AWuI>&@Rzo{T~{Pvy{*N`Mi>e2*fKJNFn2WG>MDa4o6}=vbw_tm{9WoS*G<_P zhy;;R1$DU(@;0!G#2k7y#Q2@+>+aeSp^tQ!0z9k+G*UVrFS1<$X#T?O+9-UoyY3v) z8=esBv=SR;8BQWzYmopdTrfD9ZIpb=Ffo>raNXl<_&vtXh1OfAVl5;i`$@jJ3ua?Z z-_K+}LcAkQYKA#J7!UKW8Sn&96n%yw#ev^67`Wb{hc+*2;8^*9_Y-Hs@Y(Gzp%F9F z0%MmjqbRAelJj&Ct_3X1(EV#F4!M=}Tar#5?_lR{LhF1GP#|xPpxp6O<0?^muH&u5ZR|A+*P2 zNEpe(vH8Djd4mOd9@2~er0r5U>#=t?ntJPSl#?|~6InYK*vPjA&KQjYpC2@uoZ2DS z#giNIMHmT(^!_f(sVK-;E#eW|zoQaMefIOWt-u_};JI+OCVG`cayO=Gzb>|i&*1}M zS**`S)Phh(SG|wg>cC=O(i8<#@4U{Q9&w(4KD@%I^AvlJcHR9bX!rC8l@E3fwQd-L zv)*A=;Ys+*h!Zg8`tkgh=VaZ=`9Xg``J#-!JbuDa!y8RS{p4Nl(SUqN4pSxlkz0$L z&Ply=!Eub@q8O@>mAP%9Osa~aZ}nR69cp3fhhlWx{`&D%B*`b_B}GvqcUd2+_8k3~ zqNVp*7!|Nnv}B5==6h=jHp-=6GBR)RG40zUS6;gZVPl_#k>*bsUnaJd0SwzDwW2n= z(iHPPb%ut5#5HZOmD_oBeO~r{r*qJ8(>F}JzeHPP4V5KrLda3pQWQ`-JSJ64a&>6^ zqHw`iVJf2>Qv%Q3y0Hca4ZsdlBGE z4PI$F5z32c9(MuEG`h5`=%#%aG~-H7zc{-ieK$tROQeFQt%J;Fd6p}+zJ^>=8E@;x zvjvwNgnhO1IM*s;!jboo7l6dD$x|&(LYyfHj*^oO_DC=e4~MvOnXCS{lSgX8m6DdT zvfuv-k;?0g7{}=TwcLF9(_n429&Sz_sijZ=YT7m-my-(4Itk_So!w$GOkx9tR-85x zxKu}Y=iVI_$Yf5n9UErTE~ZX`9yJqQ7lR%Z7;B5AAJp=kI#Sd|K5j!e-m+p}q<~ia|?zy&YYJisg$-3p2aBPtlrMl6&tFHZGCY-YMw=ASqpLcO@FirOcY{eI{Tt^>1u~-DP z0b8RBE%ld+`=I`_aQ=5wef@8M{263<&5o>=bN=Kc86++|W!(Q4DM|R1jI`zJVitHx zu3hh_lc^3au7!_ZSf;%87GpPl6f3fUl`qLd=ir*^QhHJvak#C+@ozl!!UV4_qsuSZ zVorFpnAA{E^nDDr3e%8qc~`ZaK4V57-AJiNCctNP6^x+jYqOx|vMULYVSJaI5kzqqjx<=ZBL74%0jeM2Nd-~=V zZ!cJ}5;jFvZX+6Ud~oNkyCWkviikcop29C3k}Xc$=ygbi?w+UWqR7ayJ-eT|l&k+0 znSa9pm**6%&pPf>DeGg%3)OfUv8M{>dBQsHfvudU3@hD8lI8^_(ISCHa=w;QVYE8B z20;gFH79H6cAJx$n%swUiI;eHQT(WQy%$5j=ST8K7cXn^l%?Y zAlbH7l<*Ubr*^a4?-|7ih&}~eA>V!~p$(4mYU|o%B$1#xg_{*h1%7sWM~Uz38fT04 zQ&YQF+y$q!a-oxAcJU>#ua#6|K;gdqL7s6UxRq|BdlZR@zOl5UZe^+)Dd$Nr&@G%+ z3~cx3Qvz`Is-rXfted~M{SO0_22lEls&gXksGeKiR=o~itBZ|XdHdyZ_b|+%A^pSj z!ld~#x2?n;d6vT-7+635-CG;l5G`r`AB7Hm&VJEi-Yb{t>a+^7ETHTB06R<5qtp&- zw?;`~An{>wmGaA{Pmon3bbqag+=_xnl8G;ftGB)3#Z(X8<9sGoV#la8N6 z{>2WAbqWIv!c_E*Kxr?-s&@vl+&>zT*~o`n)^MU?lxCdlLV0~EO|CdnP$L{f zA?R|np}WTl`E9*lMe8}HT!;7g6IT8&*z4;r&w~e*-1T3R@@XqDv+>D_oTwCcH!xk6 zCX!&nQCbX_$Yb5ay=w$X2ryo57vQbo^N09)G&}Tcm31G7rva)QD~>2Fo;io_-qi|DP#~e}(77Ueb>G(*1&uiZLy(1m8$= z4KxjF3phrIj&Ik3dmZNO|B!)%>!{O@LPcRI$pAO(!aBOWnpfRc&jEsbE5Ld~N4a5l zJc7ZoAUC*i(iCeFIKxYmB~tcfk#8t;eHp_Ws=lnBYZH;S&7 z!A(8zNQZl0HmYvUrODkiEw}Q6Ikz5?bv=_NZommOn5v^DrvnlIWn+qkyP_i?jC>IO z>509ohhmh=F-Nuk(~WjWKcpgy!7n~Qx`vF4z2QTwh(rSs=L^dO)R%5H0n7L-L{v&; zY_#WC`VWPgS%C@bvTCnz$W7qb&^xvXr7MBhmZdv0Y%%SOu&mZjsV&Syb2U~-V8~K& zkHsXV&A_qv&%BeUp?wjB+r79NPE2 za>`))0h%VraM~TjDZ>NW37FaT`Dij1Q>Av#S?aytby4Gumv2AgRr6|{g3fOy#)<{i zpRx`x($isLiMWKs^jW^C?vpsq=F!n2y^M9=!3r~K!Q0dO)0n-^PjN2~C8Kp@t{hyY zks)c9HOd}gA|H3As6dcBsRE}^IQx~Mdu}{PkPojt;XmBZ2zRVIfkO&m6a})RQu3Ls zD$fJdGZbiXb!th*mMuV8I5KPJt^8mNP3S#Te)42HdasAJ#=3sgw6?#xVEw6)U5{pB zl&62=KdE@3qBsO%YQ8fZ`znWFaFn`-WZ^x5r;p?j_AEO@W7OvHkR zYT-h9!HhyHs)DzVTdB?}rdvG(@v%V=-305ROO7UCcDNTbG97&_D>?xSXmtV(|NB9E z)mJfmC;s5S`q6>=A;pqnn6a@xz^5{G3P!5a^(w=r7 zx7`ydk_%K4Wiw%NZUxy|>YZ!nP6PnHJ0IGjagQrhf@F*+t3%b}I6en$GjKO4#!KQY<2#V{?%vt1i-pAnc8RN1LL(( zaq)!WPu{kr*@~~T+&*N6vmQ&-&cjul-xKOJ{?RN}p9KNtXH&bTsE`Di(QkZD#|eBL zpPlkV8gmI*>pP9kX~H!b@&}W*MkL}8g3i|(wVL~XH+c#QN?P>uo9JpGik^+d?yBB( zY<=^^zW zs%Gr_L`A4K_tCAe;qB))-a#AACkADrKeoN-z8e978wHHA;>Uyv839~t#94Sgkkh(HVUPJ1Is!$}07C*K0o!b7X8kxt3iIgu}~ z*;UwR76=F4nP19vNw0zm@b*_Pjcr(n{Qf+cTfUic(qd+MajBa!mTk7zwwsL~B6)!6 zCU5d2$b(inHsT!*eZ7j&+VA_RyRx{8{#~xL&YV)M6Gf7E`faLJFuJh0u%8CF4ilkyf%EaH1NYq9Byw~$ z&XvB89qG78vZ&Wut-poiXoEM#G+7nuGtzGV7m*dB-cX$@(&A|2Yv%%u&Lt#|#pgXX zLp|)Gebz>iUOXSTrhzSSS*PM1J~Pm2dWxbcxRf2>>kVp8obcI?_40iTprR}P0R}`7 zDWpTVVq{P|`Ylg)_5b%X@Y3dJt3&pyl|u1KLu{0NFgtV|p3=OsiIz>YIG8oFsEPpd zAw{<7jTBOvdL!eXQsW%w{{^;_L5;gc)&N$Mm)gPtE?WC-doA)_;{h5VkY2nn%#gk3 z$}mpUSQkUk_WMkx9y$gy+d90WJ(^uhf1nYvibkRkA(xR%#G(cCFCD^kUAZJSzCm}S zsrZ8em>}tZ7`aG#)Q*F;6!=0cD4I?Wwt;zETI3jpwmDr2S1}r~rh2JombEkE*goQ{M;>h<1sc|^lPZRy;0z;frZU*H+-I~CW6N~%W!WF;XGunk$0_k6 z#1W(t1OT0wuWH2nQLLqfii|V;^wrbsAZgOK8mFxg?HoR393kSzG7db$cf)wAt_Gqb z1j6*bN?T7<;Vrajs46?xaM$*^6PJ{oKQTIMz!bT`;z(6gxq9EMik-BCf?mFhqyY)N`iwql#XMC;e2ZHaIpl&)oCaDk;Ift`s<_H&<>Ip5>gTiZK_ z3tE{m50!*9xd z$+dauwbSnAbF3R*seif)x{2)`ymSe{PP&p(@Ckfdio+5_G!(6K~ zTqautLPyq{%ezS+%K0RRc#Ipey>{wj3;78B@3e^v%_f@wiwu=Rtnxr-1$)8UwpE1N zQNTz?ea05g84n4WRt0X2gnUXG-K2PMd3tPX;Bx7Tu1s-~M_14E0|^9_@<)|kx<58m z-uFEHPNpb)Qwa&Uox$_2*)^Zv2|tnfXl<;txmxv0;OvYKD%ZlOptk?2X2o7Oz7mF0 zy*;Q8AXwvdu?Iq3o_t)Vz?R@<7_YS%b)Fv~g?i5h*F$pK z%A`ApDIsKhZV9NF!8dFN<*-S6JARbWq%M7sSEFc#u)u8MynbiVZWP{{eTBOCc@-hu z)FSC-svcm%H-<|Z;}*&A4&Az8(B?ZcR_&DNJ?*6ipD>3}74w(eZWb!xy{c(*b`&{G z>|M_5PKitpH7(09-Szi~_ayVR1I~PwOign1vVj#^m0Q)1ng#_7g?++$`N6Y2j5cFX zC6cZ%{~69aoOb)sOUd)myD#SYR#F)(Q-QEO#_q|94pHs2V-<|+bAKtUjkZYabsY3) z!Un%YB7`m+cvYO^=%Y=bg7R5bS$3;Vf?k-{?+W+$SzL*Vza|iqozCuPgL1D&)#(18 zhOxEb=byiz3jF=NVapE%E?X5J<6K+ui*ss2!^zq^rba*GQ~{GTCe=)Fpr{!QM&&t9 z@|2|sd-VozYuJ$5OlOIoCuswj-D2o{-)thM_(W4BmnFRcr(*nB^Kd7u^Pe-X_(}fU z{8}j^FCTw$E&Wjvq0Ap6!)hZDzFV&98woJeWfS{>!OiFtINZW_T}c^wO!J^}!C{Iq ztY&;Z*E%*~3#Kjhb-YHkQu!*WD5^JeV$bfKY@Hki-o@n}QwLgW!E7VRF)d#}rVK0K z`n-k_o3u-EU72MUvdvwlW zdj*;kCYrbJddMYxq3Wktr21vBr^=tpYLCv@*z?q3DQY`%L91d7)uKI*!Euf0R_*5Z z^5Pe%=Hssj7CEoEL@8e6{cx|ieV(AXMgQc&>fOo7x2H5LZOV-U;IWjp>Sa4RH5 z!CF6M&wORXfl4(9l!-aKcGps_<|#!;bRDuIxt^^X#$HSvH zEahkJcz9aW@yl|yylnx9$rXRtdQ?IwUAZ%j5HD}eGO3MNG>S0)#Do*3rr3osqVU82bQ*|M+R~p57k98s7@i@JXU-E*&|HV86^1H#3vw7zY}aSGHm@p*$3z-I0ti0X;LX>4Rp^ zH}TOjAeQ*!|>{GkKi5kg_0`8HhgR3;(X~1 z*Q-)TvRr0_ZizgmLkxLYpudlc2Y`4|s#^s>th5wTI6OWW+i#p!9|qQAj!!Ny(`ySuENaf^dBp8#Zcgq-oc3CXp?K2vZ1mm)mT*p5j`aN^ zh;4`RiKsHBx>M(V;lfJTZ3B?|pNH%A&I={)c8sj*7mif2GgHTEv-XHn-hq)^IB zXgo21@~X!?!Sq#aqJBUFwcE6PEb4vX#x~z%>leOzl0GF#GF*_MicXgekHUvEraM+Q zN8_TI(WYn=tz!A3(Z}^`_}4Cp0MTIJnYJ>!c3DKRon@xIIh<8aq253~u@x%0ci?GR zzC)Lcr{yUpU4;SVlt+tXbb$7o8xAv9HBYnQ<=4vjp@3~2>QEJ-$N|6P;I~iLSrfC8wkKJkz8kX|icy+0!-F zg9G4zaxH>2U|=3$hk}!tbh#E7o7K%Vb-N!z?Z`6~<9-)KM z@l)+`=r1BuQ;wc9Qemn)EY>V}_Ci@7AfsXhHFcOp{j38-t|i&u3Uv-)T5pW7q`RPB zl3XJQM(x`}B&ktm%Ms#r21V=km)XFHvNJSd9^aSuX(k-$6wz?~?b}y%#P!YdpP@>9 z?_4iTQYAh&V%BriC;nVm)pk3YlfD|=cPC%EKiLJrIPai&9v8Uv6ggoshpg6u>$ZqN z(Vw;BkoCcJ+b6Hw<1oOQ1JVBMWG=KdvX@qrlp%GvXKMH~Nsxyy;EF^#^IZP$@an_5 z+}(1KU#hrN?TEo!yA%qEVqdh18c;u~x$xPLWIbU+JKF0&UC5BQESY!f)bW*Z@F*sF zzL+aM6zMs7efvDiQIWa0oVBC^BfujqXtiu5U0 z3ArbKzXVXWX{30*PVt=DGQ+D7VHxq0?Y(LlvZ`cO$6%}2{TM8XGSC%Fw&?}{Zg&tg zAj`caGo#9n?{tzq_XbDUwC|HxGoBrFtKLSnqmfPqjeCwQ3a}5H+R|OW3D8M%cG&Bf zh&25UaPn14cOQ|D!k_}9EyF9shFUR&Ve~lKhM^RDHz(paWF{Pi35JR6M~m!%ED{MZ z(pfN4#<^}#_5b0%k|*Vw^zN7I5%IX6zU&+7O!}8dkPW;5Y2~j^u2yHYyIusFk~{>T zPGI`qD@OFVIR$Z#)_=V1q5#Y0@3svKleH?pub#fiGr#&@@z~Ut!D0dEo;lGrAuMJ0cySgFgAO@THif;z8PRrPUJrp&BPvQNb* zUv$fMnp>v`!Eme^R%h&@7mToCEVI{c;-X^8G2dO~^=-Yw|KqdelccK!9a2Y=vMND%eSR8+2vKI&bFO7S*g)OeM8CX*N_Z+Szn0xy z^YhnOLOm60{Xo6U>+nUjng-?c6b`i?ro@hHWV(zi3sOM|00Aig66I~BO>jEb%}lB1 z1}TmqCQcha*OJ&{EaP?MBW&h~|G9%v0}fN1Pe<+QC4I1?gU3XHio#+F-RJ{O#jYz% z5w|VgH?(*^H?Q*h#HA-1Vd>1YMka2UJFi1t#G`n1d^=8u&*P z-Dwq*(2QT2ZFJa3P0SaD`d^U%Ge1z=LKvsPKC@!4=rHIP_9liiYD`8r#5JVL@f1Hv z=KSjRxEr*S@WvpMyMOrCns(N67jxSYZQo1=GHsMNy}hxckII!SJOgkXgFNT2wbFD) zYrjl;nA)%xPooi=+I0ImUe5rv_s{PzP_bijiu{*1Yr4&P^|xYv(WffK;|K&wlYZ-h zDYZ4y5iy1nwFVi{42MRiJO_#QaSf&0<&oZx+X||ls>zNE(lYWB z91&qa!4uP^HR(gGkR(b5x{DphBFWHfXpYp?m{3z?^N6IXl=cE0OpSyy`Hw8$G1^Aw zP~=GN`-vnSeo+Q^Pn3wOcakjaTM}MtRZgc!uVNGp zKLg%4m$G^l0lN5K6g{7>{PjUSLf-0O=k%<~7jAaxBbOQZUshrio0dydwJZC6>R9Gr ze$_V7*|d#J5O7F0au_OoDIx4;4nw(&CFtgc&gAt9G%`x=vHJNXQ3r;}K&#mF5Z;<= z!@xI2tC2U^Bv&#)nGAB|VlvNhtJ$r*g9@tpo8wo`c$SXYuXL|6aGb&+KR;JG+)G6} z-pfN`dD)M#bYZRMo*{uO8;HAaV zA5f=#wy^g%esH%hMsNr`cqzWAUXhm@zV_tnf_g-V7}DWJ?d6pSJ5r6JqlCiK6%|5S zA$kl)<9YCK?9VL{k@rU~jbe-J7mv+;Vb>LFv4!i@Bv>0-*IsG_NZx~JAwS=3bcpD{ zd3&FAK4&^haBxS)HV#Mikr|b_;I%0kSfq5$jq)@}zfnBNvsyj1tk^}5Kyo?e{Bo}) zTc53k8QSsg@%`0V!(fy6tJ9aIJNx|ke<4|en854siT5yUUy|Y)Dl%7$lp8hTYyuZ< z8WY(Z1?4E)q}wNX;iJb z{8rOfys~37o3zb)r|aH{d}_3%B2falV!yZL!)xOZb02j1n6|G*bSKBnm-st$YoX{G zs7yoMeUYKhz&qlS?@`oKZxOy%OaUO{S-JXZww>B(mD23!9Gz6cccvV$QwfI)Q zb#yxAz4m?xy!X4=t#TT0deBIl(P5=t$#Yzut<5`Q5Z70yw?0j2wXDlXWyT4QMTPZ2 z(;ZR%c)AW5W0q187t5<})_RXQ)tApdndK?Ed#qrxjPlkZ)Fx~=1>2!4DU`EZU-md? zb<)e_^Dw3LoWehs8L(b`HT0;A=8AHZ!qRLvaugqv0m4xlZDAOfbhmDwd62KH8u{we z!kEU=(2Ot$aoQM`puKXzN|pauJFZ~CUrSM>k=u!XE+ywK;(l7|V4XzsxSJ{sgYJh+Cp6-WItkjtD*vDjt{HXf|y!6*SuK2-=xD zuE6}D#`u7)?2u4(-7Dlc9w;iMji-`^Y&g^zkh+f{y*E9dwZ80)o-gwt5oG)E$9QEa z4YCEXw)NIg^2mFJllqZ6_eC7VJUs-#GUKYt*v8Ux{`_h|dQLq{hMZN;5lE8j3PV1E znX+t)vEa*GD6@ zT3HhJZmcNuG0|s_KQ+Toe}nquoervOvBN~sIUe^gA|F#fzSOZ70dwh|2 z3Iwz)e5rQDPdtMU(q0CxXb`R1{3g@Gm^S03HEphU$oSARsb%6=6yrUlj4B%o4$8}6 zM=slImY2D^4_J^>&7WqS@0;hpjKtXkIg-a~#*Ts18LZ?dn>kHoFw|vd_|iUgYNjOE zIQ38yf#SqLUnr?dbkS&ZLn^6ujo_gzTasDL(cSFO3V4fbtBpNlYg&$xb~68S{% zkV6_i8-=NwJezbJ59OFg#UfUut=BkcFhP(>;y1THLhj&VMzGW^V(Bo8<2#a19a zMm?s(no=T$y%RH~=|-Z(Z*q`g%NFIkv6^cuX=gsjHuXfWXCd{Z%7|VaAv&+`B_%f8 zPV`pq$DVyKVdu)!4Lls8W^a2q7T74MZU;WOo{V)3uwR84S?}Ct#qcz z_^-%kEi4|*=X7fE5TzL>j(21@QW0wI3_AsG4XC*?c8nM^Y-u{aY5OSLjw39JmlipR zj_&1XKk-g^2}{mF!pimL6sX4Iscy|)6Q=NRrjMS4EUXu)%quhx{zlVpe~X98`Z>8O6T`KS zLAsPD1Q_rm+P==WVL4T<*ZHiSswmaiPxC0MFOGgj(2ZZ>sEJpO7pZGahtTOUP|Z@= zWW@ut)biqaJTt zyXt3f9Tu0C2SWXYc)*aRRK}*}S7$#Jkb?t+*2UvUB!~TARU!IrJI~I$Jb9_9sj672> z`O@*K9DhFQ;d}Ez8i{BCqbqb0DFWvkZBC~j_L zp5i`<>*xM&S{yL+wfofTY#|+SccHDDeRv_C9!Ih%;3H+yNYioKkmR3CVN^G?CU)(x z-4Oory0leHU1G;k)y)>!ThVlIJft<*%+*5!YJCEngCvq|D8h4EFkJW9{R%W1RP)S@ z-9Li8rLPI%bWr;L_fFPkw7V_P60uq>ezsu0kc8-BQN{z3acomUEDWP=N^ zu#LgI`@xk`N@XDgYAzZGfs~my@4Y9_*?eE`W6X%P@0HIwYp;k|jG~V*$1Gw-L`U+5 zE$3`>NDD?}Eaw6em?+V8678J^Ah}k>_Nio~X|76-&;yq7>KD(nP2Izy#rTU7He5^d zomJDIL{=cj-pOzHD20h>LDG0eZ3OjIL-i7Ggt1K}ajvDwsW7J+!soL?nYRO+_+#oX z@#7j{*f8jF`j(tKJ@tq5iv;wF@aNQ7o%%%`R6aWkM)i7CVF<-Ze|_P#83oP1ODZ>l z_cS2Jlca9}U!LL%+rKg0@m~WPJLI{(4dpb};4u&QN!4=Cl}FD@41%U>)%nl^i-%^$9E9v&$*mri#8k(R(?A-vX+ zF4MK29d}+NQgu~IKm08wE71Nd*M?>0qa1S`Z2g9dDbXEa=z}BjPOr=T0!gJ#bP^oS z6P;kO@E5{%k1b)}RuBp&J|BrywKlop06bM>9q9wen;d*_kZFOj!6~3=AqW<^L#7`T-+96{3 z#Iw7s^4bDDzN370dTmT|LE!8gjFKN-|JRotMgO(e-{IlD-kKNlx6+Z!1(*7pUL&Ao z-83Hhw1!BY`F@{Tpzi;ef^n3WU72yL)1mFXwXfLxjzp3?i!D+k!89-k4hWM@Bkd8} zM5bmY;A%|2RJgC_Sb6(>ZEUAii+8MJ9bx|Um+#ENya5l9QO1^8imJCQNcA)OO6YZu zv|=uuw$+&|D&xaH(J^ht!oxC)f}F@AxHfo6#(9deG#q8ou$rrMxZ|6uL~;R{kUxD^;d(Lst$>F zyi0IqPytJo__D3UzV&4Wv&C_=9j%wi?Ru*SM0|M>FqkjLlg3`-%z98taVzba7`I6q zYH(?4j~WnAAhw54DW1vkOzg%{FV6w4_}|DW5Yh4iWM%GJUjT%q1taMIk$@;EGC~t2 zPC!xm_&>l#wvXO%dZ}r?T*Envj|?nZ_2v~VGD7cq&DqI%M(5WAQ+i@xOs>SF{9iBM zW%qd~zi_MNpOBFb*+J|q!0b$js$NWvmuuHHYM(Q46ZPP}t+S6t(o&Z`6q=2M!7buwh4z~gpE3J-cVJK zPrQhok#?T!1Wk0TfsfVDd0~2}uL@5m)MI6}e_gy5rHpQ7P&`YuRCt{$^+@ERGhw=~ z92@c7Cs?ntw@_F63;;fN8!vW7Qj z*PEf?kh?YA%NxdC7MqFsdQ*PIL}j?#@7&PC2)N5Rkw{~P!`{xl0xw*F$E(qb|iN)NJIkpt5bge&zJvW zX3T&6^`G(z#_QcqQldioPmb$X5BX5}egTS{pk1_Rp)EqUN{y2Uk)fQwDlw8t-9pEe=)oYTM&HOm>LrAPZhFdHwa5 zf94fG70j4~WwDWm6v=#e{R`GgP3lIbC6mV9=1!8z@&#kdgRy9pM0ybdT=k-;LcDE_ z>U&#@wTTvj8Nipd5Tt5J$b%k4huGcYM_7xBP(tL@KgBY(nvg1!j13}o$xmm10DVDC z1gY{dii$*quf4OVLCc9&&OqC2=m*#M9_>qNQjY|zCwwIOSbntAvW{Rd16avpUw0SS@6{*1LCZc53CiB{kF*7+bMZw5pRv^_sOh|do=@%* zyTYd?%K)eYO^Bo;4-L%4=W<<5?7AF{dD`$61HZGv=RykR9^k%wynvXKRd%KJGt%!Z znMu(wdO826ouA#=21uW&VZCw5`8724g{n804|R69l-C$;YiD#DPD>5}i+Cm`#>9~_ z?y@?b4Im=~wVqbIAH(h5kC2wnw6zQnqyJ5tX$s+WEIRqrPx>sfBQX0m&jY^$5vi2>H@q=h@N;9v}FiM+F#vDgNj~g@e=k0;VqwFnyJpMv_X2WsvRM0KQRO;I}nKzQSt54 z;EYf$sZ<)VX3sATp%>B=B45!;q3(}N@=QjpYOpy=Q_|G$W=c>V1cpB#fE?M3nnf%6EQNI&-|-P+96+vGaM zil7+9#YFbL=vYs4B4l zJPl)x6((vc)Q$uOJHn2`Np_g93HJYXfjrX0VPNt7X!00S3wLLQacoHZd2(ppQRCuY zDMKYJR|H8|esiy$C4vSMYRw--Of`ABlwglxyQN5nd);z%Z9C9m(A0!CblgIdC!spVKpY_caY*s5Yf!x2%XDXaZPg1AD@;~uFgjDGDYnB@#7>E#27 zT)BR$!bEJt{KuDHP!)>%T>@{8%XTg_AF&jTuH1*+jXMQKAqb_`%2@ulkP^q;DY>ot zy-g*S9VMWa*=vZQ^e8xCD!K85i+|v`8oct1jI{#!%i-+JK)PT?MhK-s)CT(}wd3XF zgh(w!oeJBPl(Z0-JYVD(C`os$8)nypLvJ@=DEj^Il2n7{!9rt13yY|I`;cY_{yXkF z`+sObdowNBS;MAC_1dtJ8^f*Gy6&R~#eMjF1oa)-&=kV7cYOt?=|e%NizJZa z=nUG^d}Ph%%*s-LDuX-k=_yScZ5q$z*Z*)=@M7p}ww7dZ_Ep(m-!BhNwtsWUdS zq7=gm{@p*W#vQs$KY3P_cl%*$q~)JRbGZ@(a(CH! zuk@&_gHFW1b!0GZT*w+o%5;roq3!QI?Y9LH#vlf(}A91mf7N0q;l+l0dv;?@jM-es}db`Js*7i#nByB>C*Z&a?RaT`39%kzSJd5Ocn|t!B?CpmkOF6S~mNF`iQM(a2b{v z(nb&Wc-N0;ufMSWSTyCs@O1~`HC{q><$_w+9zzS30f(4&Pn|J>n|)9 zIf=PP83ou(`@>Nw2~9#lln@R?@xYA-Q+WW&l15R+3pa)rYT+ODRHbe?#h! zAIlZ4Gpj6!3D{IrooXFliT+80{53s%FmYl1}BZ`VrN8?+D&};jE%3C1k$f<)@5_OjuEiI7frCvK<6Ib0 zzW9bY#uLR#>KtDS&L=|Xyp-N0h~?JQZ7sAC$StXeBv}eseFlwfY`92lhxR*%o}v^V zm#--lI6_PBh^;WwnUgN{pCE6Hs|Z%vhSuZ7#i}yDH^Qep^3mj@w-!h<-J`Wi9m9^{xz49sR3$y2enh%8o2E1Z!$jk-)BS4-=ZXO%16cj zOCbDH0iZ1TONETpcBpPtGinrB)#}-F7G7aV=(lQ3ef+tGv}#p%fB=DLLDzRKNgy-= zw>q(Vjv*L0s@PR21slg`H=2u8Fxx2)IrB$;S=-ep`Wza)Z79f-^e%vRds&vU;sXUU zl(Gefp}`-#{6|U?lKDF}lK5F5`_iL`s`hpnndS3;9PS3~bu2{1tq>Hp<*xW{)$Xqfp4~6eR-%1zF5O6wEkpH&tUF zPisC@_8P&6jc8S2t`T$)Y1z{M%(Su|=#%t{`=qb%J@qu*WepS?jyETW3bgPuBJq2P4P z`(#`3l4sPYi6WgUNGt?r$na*7&mjZGfl5kIa=;4e18(drR{MM%gZK|+` zpf5gOY3}g183@ViyWe2Iu$K$}mX|L+$!nkTShDXkmpDu0wAh&VF(O|ZPdZLWOOGqAQ`v$)U;J@hR{ld?y5HW_c^H@+tX@eG^w8xEGHOy?2L*T}&Wh1NXSmcKP4=+E98t7AX^t1@L)HU6;ovs39 zWrZqjFg4(PMsDW`nSdm(Y#kd|V!C}NWlm6|W{ABx)`R+Tkdlzp#7hoiybv$rwNL;o zH^J23mHo|2wn$q8%mSsdM&lpuEXs=YV)}g*d3#aM@}U#KrZ^kv0Wa{ib$W=1_mUiU znIVdYN|heD$(I^q#7>mbhElBZ)Qq?5X?>_^hxKWY@I>T8`SO@}iLi~fIiHd@caBE) z0q$i*HxMu?lfH@#?h5urW~0cgGSed#8qObeDIWgEK2i)xeX45FpAWHxVg=7HEUcEt z1-5T~_u_-HOcbQUhx6fU+BaTy0`Xr^h7F27P;_25^*xxTPlJIV+~#9x{~>){;c5i^ z`1)55Vq#}i=)^7+ro@WovoI6-sg>Da?}}_FT7RFm9*y4IwZ2|?0Hn|_DM2luR9}7k zXwwT#1HiNwaJpJfmeO?wjhRpUEx1VbT%JGq|1Yaaob2tlU~UJa9tM?$Ozv6>Ktr=< zTv@ zQY1kpV!9#Aw(H=5`ZmkjtXJ$7xzU1(2`W=2nyrTZ-aM3uqBL!>55?ki#td>^?@pbm zHygsOw_ia>8`}4d)FXWYV}eKe`SeAtGtzA6Tk4G}sya7BUCyFvdEFE|^Z$C9#Ol{* zWWg`oQn7{^rOnQ@71>{UFGXeea0QD$wlL@dgh=RbQj;l&*cf*CD~aBRgn%NWff z|GhB{qJispzQcq`N$ld7==UFsu%$(2>h!F3?zFe|V`0`(()H_mD|(X1l&t&Z*0Iu{ zu?{i6Xnfo$x{Cfs-)0NxB3S_%!snP!0Dds-8dydvt0q*CCsJex9A!fZUW_5G&yDxn z@lFF}WlJy=&9;m0Wz^-{fmOOiPD`l@FlW7l{I;%WbgkA69;tjMf?3qb$Pne(w2_dN9hN3+iRhF-OrvPUzh6w(rMD{NNqBwZe*8a zEph2<+Rq+8w|aF^pM1%0?-UmagFkQ-!I4)IDp>M@l4$mV_qpzsI#Sjb&eJ3%aDD0~ zZQ*xkk--j8dOhIQp@*Q}T+u`ls^D;~tk1$5Y2|R@n7ma{)RH@0`gyWevn&R3il9km z=|NiQRmqkH#9w{kN45=EP;Lu0$M?Q5d8B3C$&-gf68C*j|0U90JdaEA9%lj+=?hpM zjA4+Pr{#rcrrK)Brx?V==U4%d?zp&8t6NE)y@>`_EGzaF*zZLU`7WQz(n%O*^bqTe z1i}0D^Yd7>K)-PD8XUWO%j7?8t7C_Vex4&F6zC902H70D=+fbX72m~4E!+KJgYjYp z>WcJw4IlnCYY+dqZ;J@iqe;v!{O(>HODGL7yEi6_ z*?^pdAVjxf={i*H?FA$ZlgmG1DD@aA(4`XP+!2I%(xMIr=T0~}MCWK z!%8Kn@WUgDXqU@bxZmJN*}6TiPkcIaioO*0|On3#1Ca z_A8Npr#F%|GcmD@LMIPl7SOZraL`?c7UdaR-ENB7w&nGm89`rbF7Qy&V-U&2=;8@>}Zut8fu8 z<_o3vDy8VHu!@l8HP%`F*JX?-9A)p%@MyRK59mL+TR_+@vSZTP{pf*&+iF+3yY4nX?7r5qtdZOZCvw>ihJa{pvsQcr+n(xLnriOCoOa~WJPBcP75DCvr4?%TPFz``j5 zJSAF|_wj@J+?IAIqdC)|oQ;v?6+DjbP^8E0pYDG47}-`b%8{~Ti;>+jlb*4Ka@a4X z5)sCyTqz7uCJ+DfINF#tb(5b-5weNq1prAd zpTc8R`P@>Xyes7uu=k$OO3*=|5Lq;jGmP4_mG?$N2};AvhARaD6tRB-chkY+Qa-8DY9T0>KuI`*3|w1PY51GSFc+8 z?#0vH#OA0_e{fPlx`FBA>#rfbNQm68cl;_3uH<^h2Uaco{^*lGd|{$l*2}QJ@T)V1JEGp>ua1fz zsf2yxb0$%ly55GHE z?AqziQD(4=unJtU>%3XD+#G*r=Aw9ADr)%(bl&nE=*{_&ceraiQSf&j3IQoYmG*Ic z$^!F=q0`|g@8@oaNc|L|+F5*gUW%KRo7zwkeJF+wHw;9Bw4}&%wU~@WNb7p&B}Y^> zVm&yLRtH?CDX!51>I}d*o|_NCPVU>&!?0jX{Ibg;byq*GYpy z^;{>JgbZrFqFZK^CmN$kX|H6GaKCl@G@{`0apw`@Q7}j06(ymoC)dM)rIIfM3}n$G z#-sO=yEe8=|8jI8R8>yBv7;`)yeALUG$|n)4f7&q&k4KjE>@rC;fTEA!a*$RSx1x+ zL|NKlqOfx1+=k*YL8hj8c?Y{N+hu{ar8ePGc=wxUA0 zdW+ej!A=cpAD-oQ(17p#qZo zjODi2ntb?o?24t?Vk#pOTXu0R#-LiY&2a0cVe0NDp{5w zW)c#K(v`;quBIX(F3ir9cmIJ1kP;a1s7N@=k2OIqQpJF7>fSwC|0Q>!^)l-pbCHyH z7jYj0mM`V=4Aj6*nsf{A15TDIxW?lmwrH;R)B}q!g768(3gQZW!?9zXnZpLo`nq=b&% zJm&{3Dc$v9X+MFf1k00ST)v(Cpi7qXg%JZ8o{Mi&J0zCW`DLwoq&Ny}rMx=iC?=CA zxy?3XD7U6eQ+EyUm`q43O=A8?rF49^$5}>7H=Ung`l*r~i*uR|pPIQLC1s|em!Jen zbY81uObW7ObYoYjmU`#~`DpI@b2Ko>^5J?*^aw$y1Yhf=9dzLFfxAO?x5j^kd4BNn z?-D^iA)Ig*DJFtoE|#YXgu-?WGuJoJX`(Z^X)J<+EA}b-RK2`%A+y9DQ%9{I6>MnD z{+n1qg-^f{4qa}07}PB-d!D`nz)Ep}dpBz|*sG9qPo3%p`o4`@CUFZ@ExHj%^h{UC z?quZf-eg@o4Ww4``%Hk-&cuf7^+5V^Vf;AUT0q$|jajW2fZrr4i{(9+aoUJ=V(YvP>TE7CRG@2uDeG#DXWCPh+}Ipc}~lDE^778yxL_{=EWA`=lTYvQc# zgJ#ZB+tfMvu7SXs7}AQyh!~kOKD6Ks*!6rY`VlI~D5W?KTCR=O~6$bt}Q^0?aIW3~beHWY| zSw!O5U|cDw{{2Xzij73|fJUUgmC7ih5fp@Kx0{SNTHnJ*npIIan`Co3^ZCPAjV_mc zyNClxOQy`i1(=*GhS%$ExUAoiejmGSB+#ba@SDXZeMz(CF^wECUUJTfF?4{+lwbL_ zVI0Fz{0unWz5e7f)<2aMnXJRtEnl|xAsJG4(n>%pMa}y6RNMB4D172Q$vZJ0qDbp3OUzt2oE<-NaN7-u zQoa{U#1!n8`P+}@mi5fz9ObNy)Q+y>o5w(KNz?Ax+NANVnMR_s4)V?iYNSk~N&n7j zR{7;`E=Db>pPEYB(Wc&D<_dOdf z5;JOnMkaS^IT$(dLi_14B|yw{O%g8GfaLGI{y{F^ek63HztpE*&Ui%MsiCT)l{IX9 zG$yoD$|!ln*)hQg6hJO7bb;zTZJP28mvuDq z+7V+1i3w#Bp4XXqh2J+7?Kt{{lZ zdDJ7Nn652q{Hm@c@;ASu^a#Rw)`<^D{7?u!>c=ujpOi3BX_TI4wM!aH_~pM4CH9y4 zHvD7%>KE`JT6ftI_+S{m@>Vf1ein4&$5XR~Y{tk|8RZ@WO=~{_s^GnC`qHU=wPqSU zl3@l2xwkwPh)a#$s<&$Jo2;A*?rk`hkxB4Y&(Y*a&w1GVWROET)Kz1d4%KjO>*)Ac zeAoUPK7WY{sdEgV5lW9FVeHUE>o%t{XXQbjr1L?ZE3W)q;tIP%-g`64T%vpVc~yxz z{Tq0OGcpGgE$Li`GfHM`V$SG3NE3b<<pEVRi*!;{hG}UXORqV%$cnSEKI4&fn*F^(Z(|UIy~8C8 z_&cT`0F2KEaPV|=q$vAErJ~=BjUW}@R`Pj;WBiQMM9Hfnz(0>stb()GQTZD+E>Tvb zVRuLREFq886=~9c<9hdOK@8VNpsVM{OQ_Q{ z^~@Fc%coMdQWe){>1YL!fcn;PQna$Z`EB&_u?$4u+Tj!pfF-1g4qyBzRs_VDUng4* z`e1Xfzohs$XSZ`Ovk;o8e&U!tB>3W9-(=jemumj*>%V^a5c&fyK ze_*F}q^T4?A8MxLD=ClXQ|bPF6GaH#y9PT3hPoo)B^{r*mRSZ>rvxxcY|+B&i?B#F9;`8DNx?bGY6%7LNk3v1fF z^`>sS{&)$l%lJgw3POjTouzE~sS`0Na9h!w&PQf>D*CEt!Z~K0y2BCDPI6t-7VGxJ z%fqKVM*QN#EeV_jdLvPu=|jR^U?ZdGJ}kqhO4Ae+;CysUW68dg$5`?smq$K>7BNnO zwCRo-eeaqATHT6%13m5%s!uZ<7^kfMGXZ1~o8K$0T>+*>e+m&$+3AY8xPcPDaNSsi zmO{f?8by#sh|DX#*8zz)Mq8Ell?E0odZo8YsaPhP{Q6Nr33J5nK7zj@rcL4&$(Rvw z$po|$|8%Wuc?3UMTvn&KR8v$VTs+T)c6xXK4(+X@C})W=H8(UbF7uRd^YZe_(I$Ew z_|>fAKeU}IE zqv}PKFf@W|aW;bp%f>Qe%&t0G>Gd5?wKk5YVN69UIFN95uR;7-nuf#)i|<%!-OmhOHWb~xh&y&E z^_frm4Fhe z;!(<4QgO*S4(c!@XLQVvuR{=0hs+OhRlR~mgAD~+|MnDyT*0=@Vv0J**ecGFx+Y8M>b&EqOf$_Ub>(jzs8#DsZlOrx zeJA!>Yey}4Fz;{@VuK;wz~12);M)gnoa|DNtVdt(mED#?#_2Wq9T@zuX&x`Cv$`pd+lNRrtu#3TY2nRr-pZpvc*^CV=`2unYR3HFTwBIv>i$ zN20kZu*Q<~)Ad26&A2eU*9a(;;~ST zI1X~?D&oMQZsmzAtr&yNWfyq+sy|9Re^#2;xu+Sa`R~3%cu6Lk{4ZZ+8AA%YmA z;xu7uDuRk8C%Jf+sgqY%k8hEB)yIfF-^cwS#hNn=>))KK#4r-? zG2Up+Y$5qarU@$GP&q@8Ggm-`(=k_#5(C~eX&mrrVz%pN$U}a0P}bqAY7CNW($Da$ z9vj*%!U$Pe`ckKb0!WY^bhIMI-++T7pfo*NwjOedULSH)X+AG4gWR*h zVx7_7w=vJ9Fkr`uP68=V2;Ou_770u{9#G`jcMqo-x}-H%t<{T9t*{IbL!lNm)KuTX}ds z0(8}bOnPN6(K4G@-QPU_L_SOPw>{{eEb%GNZ@gSl zgj?yj4D+wOI%Ij8G(zscZ4|onwUew(RTVMEI4zODt+7aN3aE3o$2HGe!_jQTWUqf( z|4jZMzn6n=m(Eox5n_Iq;wN&R$S!^(ohs+Ezdci7vbY05tb&(q<%}KYxlvc6ns{1L z3CM#kV$6(8R>2XG_|*?NSidh0k4iZK@ZMkj)Jm*m{e++kgYY;HczeoJ2?_If0jrG! z0DGK9_?miF-`hH0$O2++RFY z4IXC&Bw)nf^{zwy5hDwvPcN_#-}VQ1ZO)}XYp^>|DCKdOsWdSfj_rNI<<{wroO9c3 zkry`7-|9lh;~rf^(E?c}@t}C5ImTO1Mv=32>J!mLA?phpjop`v%WOmBG}cVp@c|_v8f28yfpxssCBi-hK@igP2NP;=-j=Y(&<|d> z7=WgP66=U()Ezf$ZE~zdjnH*ebo{~^8~S)WV#$m@l#z^8N;p6Fg57eO!qQBft4oO5 zNRw(3S!rSe&geiN5v8F_f)%Q5X9dmOg;6$=P)b6Uylzj7h{Fm3DEX;SYeBERF5mfewq_4fGW zLvM$j3r0Pzgm*qh*DG_Z9rkJbHB3~oDlR$JtO>mQk}6TLh^}Gy9YyBJ2$Htk{02+B z8lERSke20xppotKFw9Q%1?Xf`)P~eKv6$X0KCY9l#j7>pYiIMPr<{c&$-_MC@{tQT zH^GUPI+KOsS=V61*zro_;KmtQ4*HVg`1B+<6GTR55)Yk%V*0$YPh33M9uUZlnfN_s zTSmk5HvF%#F4wOf9f7Y28o3LdFa^3{<3f;W8pp+uf@R9}iQ%}p&_v);K9^v#lbmY1 zW3%>Xj}XrYk+C|*hb@ebbB-9!3(it(A|aftB5WQt)-LNd&ocbU%PEzQGZboXt`x&R z>a5AMfg_Fr=OT*|RBbc)MBj;G%dnSG}_i#o|-cqsN|K6D4x*>%Bo5N^?C#kAj>CSK>2Yh zYTfU2^eJZFn8C>3!xtEc?qZfBHZL$J>V%cNB|zn1{_+@8JuQWa4c~IF0V{!`rW=5! z0W=#BrO$U{)rI_eeme#d%Skz9@##6XW_g@lskdz)WTvWxqfkj3rl)hrQNe#ZK2eDE zk-HiT)MJF0A>B?!%i`W4=ayTCZ!jAL+6-ItVFt$j@QyyrR&cEz<(ZC2(=&T7yBdcz zB|GXO=T8JhSk%$#6nRgu)iPpWQDo;Ze=p+@048Gm$vduEIf$f(qn?Cl9}B*sB)&zNh3K=#i>2lhMYN)vn%U<{~3xvsCXlD zkE01XT;`kw#XN*zAL?7KxA8fQwnmHf``twt|ETrFNn5<8Nvh2GY=H%>gkuy;egUztX&(dgu5ZK{v$4!UT!iNa4QHbzcsV z_oco1%!D_ikIf3@n_p_$OuSkH z<&Ae=p&DiTRL^F{`la99OSp6^nG({=vuLOAt8*0oQ(eoL^G? z-x;J8Ev;A4#$J8h1|JhCWyzuLASC{x+ucLSzv$Rv^U>P2vZ~ zcERV;Ih;q&VWu?qJtD?WMTUT1$LDtgKTb6~&tok)E#wTZB~Up+BFT zkn+SyhxByq_Tra=Y(3m*K8hIElTVH{A%SC#d8#Pqt(R9^DAOoLI(fTH5iJm)QtG%2 z3_h@iKQLCA06MVBk_ws#ZjB6Vpa^6!C*2RH=Xt6Om4KvN}+9^FRJnz1lQZ_x{E}GdcP2e6dGiuJ)2ZLyBp?l3$ObS!J(7aqN(h z{{b#A5Bn}Eiq9&&qRg_*Z3PqE0A};gI5lZ^r(5%{dHY<#n|-L!_@ADG>5khY)_rz& z2uUciooKNhDM{6}C^4Tu`a)3=Qa|J#<6}aufQ=#*;ZjN^y~*Coy^Uh@cK2%*CK_Iufe>(4M81am( z^*se%bxx>@^0*6PHHgK{ zB9=E~nf}P9iYvJ>J#k(0jWaBd*7x&%+O;ckQ?7lyy`fU6xYge-7T8| zRYj5rY8b_qa*0xLB+C!v{!ZtY%MaEwiz2t#YIHnR$-A$v;d>Qn>Q$txA?fYQZm;!5 zKUGf6rO-k7)TAlnyj^YUa#+LDy+JKme;?z5SF_`eiNFAx#{qy#b{@kwnK=e1K3;R) z3jUsaLCi;FU}Fv#^!_D}#cV!IihMY8U^F8)+TpjPropxLP)MsKeTD%a6JUO0mP-CU za~^K#{W#AqT2(We-KCP}bydjK#*h>xncl7_j@6X*#HPi1V`bZ_mBTNDCU$PpbpdBp zZ_W%;N5PB_0U$tU171vFTXZ?ecI*J<>;a_#MKB?T(i{VI&jWAGrl?Klsc_etoL*M1 zl<5ddW#Z0SDB4_YHbWGKySe}c*F?vZ;f=Y~g8cOVr8__)q@B%ln+bTs0$S9FdHEH} zG+pOTQ7!Jc^!Z(Z+jQ=$=l4z^vQYMOdalw*y_rJ84S_Dj+XYoC4a(C6&PR>%iS9X~ z1jE+zu>?uk6(5M~Ui}0MHQG*X><;hZWL_g3RmK$KLUa9IkZuI-$4hiQFc05YUHcn0 zvQohg936dUE-;3f(1oxgQ$ksEHEnt{eeCwB^tAv2BIF8lw}HauZXx}`le_dit{JFI z=-vEh(^$@VmUtS}8nQH%N2YX1$RUsIolgmIBHy`Ic3(WnkWr2Njz@ouyYhCp^4~-F z_a~Tqf3D}ObksQ`@g0stl^`S*JHmcQoBwGoRG)4yDd{fP2iC-qsIteT_jKxa6C;Tk z9Y}fHYoCIY@_7P@Iz=AsCsZF^{}R$|5)w%O~A2^Q1#D7>ppGr_3mW@v^8A^qMq0|VL6@Hpn-SRR|$kH_Vo zV4{=U)b1q^A?7wNByoufyvS6?on{L z1RickB{cMzzT3Xp2rz?~tklyH zf~)i1o_7V4-@ng%ganPkA5M3FlA>aT)y%>uO>m5?+C(P#J1QqmkfIZBpH_Q4@3?E) z28yY0F43!l0tK=-lrp50q^Ie0TALh7J1^{fX`2=oUOf~omE6wZ&9*Q3jGnc1!=n7V zrndFu8wP7?3R*cr{!~b4m=|8%R3o2Qf1Fq9<$aSSBsVH(g_=cnT}SNG^SZVNw=Aa1oWy&P$JJB zDolTiUTLQ`zjiL?xCoo!Nc96j%J0GqdS52M=K~AS@Y@Mt`t@nE>68S@k0o=gS!iS) zlh(fOc6`zm*RuHj{mpm?lWOTuqlWl79#O64N_Ja`*L0vW%+7|03Ppy(4I3hg+AYy^ zo&(qE*JGlIMHJ*R$50AyQXZq`1=A9poOVl*C&rv-hKWzGb(|@U&vqygF9nv*W3Mmkll!DwMPU{Yr|_?LhOnkQ0}wGNwR*(33RJ~l%p~h~f7!aXU7S-*%M2>v z!SU3({nnf_C7trSLI?5Fa9|ObV(yZOgOQqtv$twqI1`x!8$C(hE~;18aq7r%yBwi< z4%CX>%p7t0Khum-p5rBk1WOnRx~L*7^5)xhtPDREgpoObWN1*j^spSbD{b-i021kO zGN{c{w*z`O)G7+xC6!eC=F1gFc1rWTGZ*U^OEeI+f2TX9^2F%t4%Wu97HcnxTPin& z9Ya@>$H;%SSse2UdX^!tw-s8c1ZRXwVI5DB8!1ZGA(smwc@16M8)`<7K6J@(WFvwh z7Yy1|Z9^lnM5dJ04JXdIV5IS`GVcxBKw6%yL2 zI~-YgtWq`%lOoU55QcQX+Vjj@uEz+dQA}?wky1xXLS}sAHt-2}Sf0?SYdv$tq-z zIfYj{`2@vudQ`Pq$n}!@&DPY64D(yz6H!t=6d_QG6K8{_Dc3j$XBCs33|~Pw69*8N z{X;`U_B!&cbXI^6)ub1z^`~px8%)C}Vk?i|E!g8BGKB8Bm_PUEmx#N*ZEKRC8VdDy z-ry+eg10-R0`Ihc+ zsak=a*+K41!IPk!Yz}NcFbD3laDagY!^k{3dl6_u; zsHu(ts_8FlR6hcBT5(cZKDpD>)>MEMof?g1dNe^2It`MUcBOXI4z*0A3xsm;t@5Yq zfpXM2!Jy7I46#$e|LnSpCQ=hT42D%VO%R^Y&IPo{P>sqhF&6Gd(55uvW=@xpVE~=I zA1x7Fkv9v3qjq&Yq+22x2kp4~cDyNc0ap;n%BU?N+ES6m(qS)8Nnp{1b zFKnH@7-AHqq}M?+#SK2#uMx=tZhP$PB4^-DRkqq&5&&*vm7=>8RT` zWvB#Sk?}K&qhuo?Sv7K8U_$!s$w7O`FxfKNX8x?>dbqzCGOY5KR9oTFg27J!9@z{X zS$&B)U{t3Y3NcTeS-7bv`25_BQp1v_>B;~k{xKamk^$Jia zdZyLu`!H;!>w<>`Nj?KZxelZ`++e%WepSoTIF;j&XMPlolq|rD!i-~>jzq4zjb|&Y zAl~j-vyL)2Vg(a#(aAvQi&-^UH|aZqM2!@`i2-8o*@Q==&iL3X2c+UXu9-9p zFMS-@mBJYlmW;K>04tlwUejZnS0X_v7ngUh-+CIMe48q$b5wPj06+C@qxX<6HcoN^ zPOepsBO}FJrBhHoE&n{e9{5tC`4#yfQQ9D&FheN80l}t1WRg%D^Kb`?B!&s8&`r0Od6 zV^p7LD<|F{wz)Kqp}%bFB0Cm39c~%%c65h<{1GcFf%_K3Ic);&fj)+WudV_-;3=*6C>1MSy$-+H;`Ki_&;Q5maK_wvDz zhThSjty%}J``4AvZ6lHnt_i0(zH2fUZ*J>TRkNe}bD2G_T1E+VjE9T?vkGf!G!x_* zIV7!flMI{wphJ_{FSg2wf3M_-kYxIISNhq??Hhmg`fwMWhmU=gz#J%-d^FkWr#;t(@*Ql)0ohe`le2?qRq zs1_d=up4+RYf4i?id@?+DMv_6u$s@)UCirL3Mj%tSvF!EdmzX;t^l@rj;5=Dk+CTf zN11fTy;S9FF+oEHJS>gIulRASaI^>EzaLU{$Hxd-l;UFyP&R=41Im2ogpgI%S-Xz> zqu$p!N(X>~U~rOty4Zzs#(!Hna#exDdmSae<}oz0ydQtN)YXR2mgFGeg6nA)K-Ox; zSj|v4U}<2>)6+pFtOyB%MsOX+p>}nPo~bV? zGfT7RjOG9=2CleM(BXoO_Il;00#a02xR3`+#Y-TcTLaZ3X#*I?XJ;+2aa#3Fgi>aC zP(!O3Q7R}tAD8pdt%Hn%v-R3Umq1nBZa9zNSWO|;(ygFm(pKWC@OeR|94T}CVwot1 z9XkHZ3&c3crIvbbz-qxUKDhwNUA<+>h~y*pG7*ld@ib1^gwp!4Om35dmAN(?T@qO$ zqM)epyks%3mtw7sM5Rut;ix$LA0Oa%CfTN>1^Ii8@~L?Fax1Nx;1)PbLUr-cdSO~O zvR_={ZJysa_qhFoI;^xBq%wBO>oIzS-cK7W{6@`<9OhAqp-hfCCtAyBDh%P2iZY>0 zxo1N+F4GIr}$hk->d2hhk=olt*_bwcUY5f!lu8wc=c7#izQj+uTdZ_EftFF~fDDfP0 zM}L&e(ns_djXSfSMh788hf~`T`!X|}A(AAxoZZc5zd#(kg-?T{tUh^_sf1T&vfYD| z`!g5G*vpo^%Ox2PB?d=sB!Q+n49cG8PLAkhnSQ`P393qJZ3|gdn`dberhFcBT5q^9 zi1!b(xLk0x@)|6|rNTOlrb8A#zm(-EdKG!2NEd6eh=Q(^u$2901|&vn4osc+lo)CM z^zk+(`L$O^B$ujDgJ3ALVY~v|omIqrB3E?12a`M*Zso;IM-@bWrsH-cgH0- zT?ngFk=}K!3%g6~nE~)qtw!SfJfsBe^K{p9)wL@c4azCno9aL)i<#89WZ2_!ho(et z!?%JFDx$ZYYQ3~lsL)POIzFO`@ z#mpUKXHbZvxB7{Ko*&=PUYBe{04jo$h2n zYbYQ;ot&PTo|3;an1zy9wxzWdoB*AQDm1yASH14|(d#2fePOLQRd6ImK3afbXBa?u9o>ys%;JR1<2*szTSqOR* zvbyW8da5aApd+c=ew@FiXCMQmjNjTFl745J?OfOVp^^Xr=@TL5Y$O>y@>L*FXB3@ zt~mmD*K3g#hGm7h&0B&2D-z+ zY2WJjsFf(fQBtdQQQyCe=@r%h~Z3m{5U= z=W;EQ2GxBCLBm4-?vx;{IVwc~D&!iE()d*tr4ONOddfp3!?}dQ(;{L5#2UNCKaqZW z19Tg@ID3w0=gTR1lCh_$hw2Sa;}dxteK~d-SKtZjdF7f*H{&>h$^T9Cz}av zmKQk%g^|Q{jg?bcEuANm*8HW|ZZ`O#eWhLk*>sWs6IIZ?9}`ngU50efSiMy6Lc6vr(qD8Bsi^W^0skkR$yL ze_K%Vt3NbsSk%&6Z zg5Ld&kYq__94$nvoq`mDiWF<7td@0%VT)Ajxy?$|3x?SmwfWNwmKINCdZL`MX!uqI zDN4YWKepjq4=6YDbKyNJ(c@Mn>1xd*NW3rv`>EJW%7w511&Q2jm4f7MiRd<0Q|>n+ zND<~x%y7dR(`Raw@rA|6h-C?9SW~Lf$NTld2~uquXOz?V8aw!2{@jRE@dAvB3@r0| z8XF?ato2r=8yjP=F+5v6p=5JG-mwzDd>pYKpt?GOm)2dLmPH~uni16QdcQgD5KH^j zb~LhXP#Z@K$aSDJAWbt8S*cpqv8rQ6LXmSF2)(R<MB%yQXM1i!TPb)giEiG}Wc9Th^W zs6P9}&s4=ATajlRO?qv#jU)i8$k^_-3yCy77GzL<;@BlFX&sZ zLH4E^Wo8aAuslX7Ja}9Q-5Nhl^5Tt>Rd)u5T2PCq^>W+3)3{^N8P6vE(_R7Nw_bKM z;yOuPbUi82Hdh()UT)-yykl?I>Y^nL_Pkr=tS+rRQsmwh0TzU`;W&-IXtN?`#Tq1n zg2*?UXnhG05Xm@C+Jj4J_6mj`@bUE*PMWzfqHaGb0PDZlVaBnl-6qIij_XJYp<)?;iPGiTSBOH7if2mSqKyo#@Kf@%Z z7)hBec7|T-XmcdEedL;Db?rBwv?>i4TRLpc&5diI%1+tQijq}2v6)H~*o9-A!Ge#G zc@!qmGDmripT=PH{^9aw$R34T6==Pp?s!gq7C)WK3L4IBwc8m`4(!qi-V~@J(|n{D zn_H79MyXSe`1#kJ{!iwV=-+V4l0drFiHXEzPtDsUew(ZDKB&J?CE~e(K2YTGLgCw!K zW9xMykKfP!hcQ`5+Yf!!$mA}U$I*?lyW%Rz zQ9Q#tiAi(>jxw-OfU(Iae~XC8N6-MV%CF#Q0V1Jau3^Pb{cB2(Z`Ff0o$!79lHC|< zx-phc(QgJL*+CN#y2;hqko0-rBa%ltB%Ds-Y->mR8dG8FCaXcvkn!kkHaq(6*Hoby2k|JOFSQcRe`e^Yx>hN zi(ximjZs8S<=~1K1{B>i?{vNDX00wD012h4=HBG5JntNweCKI!k}zZ?4H4mTaomLQ zD5|ZUuIM(?q-Aa&@q`d$WeAM|(3aa{ygTTb-`@UM9|3Z;W9p{;sBT1?05x^9%4q1d zkRzPnCahn3`By2w#&~npGx|U)71!A%Q(4cV-+g3hUmXJ+ub22-nYL=p(_l=F`@Pc> z1oaInb1A^`D#5qvcb~HYY$`rnHNSTlw%>`Ipi~DXI#JAEnZ4K6$uJ~z26$3ju5ERX z=5lK3$4tG0pl}gbT4qh)Z%p7Km${`EGf4yVBP&Pcc-n#`6DO?C+D@8i{PNhFDr40l zQxbtY1Pde_l5egL_MJ8~P8R9zK`t^vI@=Z^{W@cQQ@+}M;0;9;UoG2qP#-+=%%WmM zrP`*#{mLSzNTa*HasS+W1vw5PIkucPLr)Vch1ctr7BUY$$I{Pf6~2)z29JP=Vh+!X zg|?dIq>7invDZf)A{}e^cNa*MOPSiW5D#26%F;)@^qVi&wB|bqW;`5Om4|j0cRpcY z+E27K>oN3mgbfmJBluT4!F_ykM^I*NGnWD~w*^R?Ph2jzV8ul#GoU@$z`DaGV=$j? z4^{opA!W$>%lEV~i_{ox3Ec?-XSQHPXO2J;8^Wyr1(#u}Q^#bqo7lj)CI+w*p z@?^}SRM@T%0~#XA_qMM@a66QwXwhBc0nk@iKE4y*i=(qUO652vWQ^HUdqR=7=%D7ks)?iG7RPO$XZl>uymOJw-_(G0GXV9XW%HBqi+X7VRa@4c7 z5}9!jNgmVfM2Lo{xx-%R{hCR&#LdU3SjcvXCz#_U znHYYq#Pb<*WF+T;x0KX-%!T-OPv&O42=*vXax*j;T9sn`BJl#5`kMx5f0?TYFKwab zN|0ZHx*N0mN=8am5~VGWaC4qg^W;;K;(M8-=j(I)2BkV}p zGHSzZyffB=KIx+t5=XuL9ocHM%4vBDE$1)C!OA#>Shz;dy2B$}?8bUwBrNkNJP5}> zW)Ron#9|E)BY2e6p-M0LREYbhF(i9O&)FQLa?f$(JM?h7+nf44)pwRkith6cj+(oT zU2gUB##eAk{jMBppPv##r7t+f#q7&`2u^}NlT*e7& zSN_(%!wW|nz^02)n^~qca#uNltg|$bOi+lbcUQfRrAGDQm*xIETxt@eY?e;*yjj&$ zL*E@#+tyBd20Ux#Ya~5lE^v2mw6aW`Ce${M{Hod>onfejZ>B@*tkB?O1yNSzoCZkl z%^{jo|+fz^S(_<=g3jAtK& zYiv(%>W3XC{7vx?5RY%Z?7-xIdi~A|+9dxH5O^EEGKo?MVdU2$h32+;7a=Pf#_wvV zr-hO_w8^D0kUfv(?wd`X{C`zh;1uT)MrYAv;HP*IEGh%RjOVyRkRyGpRZP734DmA-eDo z`bjS3~*d}E5ds{=xOvQ~l@Q#RKQ;?*%VHJrVSiIt`*f4=KH+dS{n zleKDjZB*1!6?_#42LXf2)&W=FvsAH1^b!B`Z?>+-r5V|2oGT^gZ7a8HJMo^0&V%V- z5#H+8b1|#7Px%PWIp2;5E7+yS7(SfqE{UE{)m!}DV(~(j?jdSWPAgD7V;GF!Y;NR; zF@8c00$6)d0IJBU&K!T_wH9A{_uDhKF@)$B<-1Wl7u=*W@uDjS)-T~jZH9!gb?g%C zVxudKqYJP4#D&+$l`_X@?F$lF5&F6Wkxm>HBpADoyS=$N7!~Jcum~~!q4KGFCWFD5 z@FiYaY+n#Fv$Ne)q1qMrG5prFQ<2;PH|s97YCC1BgsEO=@eJek;`aq(%u4IMEd{#ov!a+f4Z_K%iEI~!5qv{42&$|4ONP?FVUw#a)iBDVDe5aDB)O&4jLrjwEK}eGiC52yg{2dt+ zO*p^*&ZgD!cz!+YhJ=EWheD3rVREg5KHz4dwwAT%_2{%@G`!l3mp$~C9>43)?TT^w zYsk12wy(OkjwM(fkwE=m$az}bweVufppsvt7B>XSUNo_$z{eLS{kWoYmBFvE5WO-= zIeRMXdqUI5@lPjm{6i%8?u&0V=W{t{9K;@Jox8mi3}TO5j+1>#1i@BLq$BYxB;4=U zUM%N#!&G7NjuQQ)XKtucnkVSS6(|w5Lbo(_R;xgQs;Z*FIv1U4?wF|LV@^bfyHp4C zsB1@p99voaEdPVd_Qv*OvSi%($8D)_I{V1aXdtTy6t8772$AxjS01wmXjA9cW?7>u z#av2>dXp3RcHl8BJWin8y5z{5;$K3oU8;&kX7fj3+3l+s%;y}7K23S+x6Lrq<)@kV z4Q??La@C%d~00PS_N!`jssS1VPyN35>&)a)$m_A~uSAv93lM;;rPc*>*WBF*cSZCDi=iwK644fYk`s)sY|H3%?P0+%@0GhJ{M~B%t}|;%&e2y@Xo@C z@nPSaK0axA{?B}RYyC_j<7iTSYW%P^Ouavo^C+5yR4?EVRZST6Mq#9BYC~wSnKpSY zkB5w+%&=s*7J{0%xtI;3>1upVOonCVUmc8DK40OULUPpvzWO2_9XTa3XXc0h#(=Ju zlk_O|IQw3(4f8<0ocP^(>x4(@TbV4r=mqyeUZsJzI>lMzBqsaP&qE2 z%M?GJC=s}iA7>j0>n2oy0;dEuc0yRd_IM9k9G1LA9cRKbYva z)^HF=ge#C;Q2@!O#Y|@K7+lkfcI=m8KZe8urdp0OQutJQI{t#^ea3;tqazLy^Fgba zUAcy42L)7s1~DxDTrOF&`N6iFFh)0iM@*VT=&AgDso?^H1(}q|l0k+{0l%QG@agaN z68C@Gn#B<)caKf-tfAqlH;S-G`HqXokjkUi7ryI?#R18A@9xzq3bH zoM1>CB{hvy8O0^RcE%ir!e&b*R-#DZM7DV0u8L8;(o%!GB{yLh&k6JnMpON+)R?0I06n=(u)R>KGN7bOB+@_>D^6*i%x%^u(6@8oM zl~RE>tXi?kIs!oj#b3!g0?AY;S`AP1RJ&GVGkQ!Aud$S79Tb0XR)3Ks(Llpg)PS?s zD%wkG4U(e`zb6_^y3)XtobD1h9LaY%OU?no#ie#6w|j6E?d8?(Nq_wC`kzQOpJZ?} zzoxhF+LKfD?NHx~104EtK1y+xk1BK2V#S@5$b)WPO^9?=&tps0fh@hgyA$EzPoXH} zZx!n5g9!VTeIFF|$I9zbkul9ZLXv0pDH7^CQd(^@eIG=gRkS%DbPxH4jNDB? zv;E7}ey8&7_`{-@u=w4h%shp}e91-(g<(!r^5V!*h9HxoSP^VQOH;di&ZnckQGq8^pDUo2uZ+3QQuA%3F;;y3+4mXF=I>gh%dZLdUmCY|GqEdyV z@MDCX(N&k3&Wdwnwbra1Qf=kXQVk%1v&Tu;u_n}+@Xx~(9#-X3zs4`mN8`kgDIX#E z&8&U|-n9K?x{VOG%&d{n9m7016)~dEidUb*g$O}vS9kT(3rhvlx(d_Z%?)GtQGdK+ zj}jeA^>t_M7KwN?g8Xjv{k_N*3woEBR7BR1@;H$q6qe=?yw0)fm8qsei0tU~jOqX+(H;@8Wx0Ov6NM-%rz!F>?T6f3z^(ID{_R2oiia({H ziDu43wa1EG9@{Cbd)zt~5IOdN!d!B_7DlpY9g|V6h-Rn6;U<@iv+A*Sf$K4io)HgTcx0uDS6Ixk$Pg5f z!w9O=B`3)&wNw)f8ttd`XH145WGW4kRA%Bzy6LPdk$P=oMUY1dO70O=t#ktKV##kw zJxjKbDE&E3+4KM{ys}bY3i;dZC&BkP0rG3?;{e_JR@%3!wu!lVP^J@vVXWE-)>$KS zJnvfprD+a2q*JSp$cn-R)iCnUXI}G2JX^7+i5Lh-w;4ZHUAE8qq)(w|gs!7e`E8`cComHY-xXP)a>$YW* zwEHKn*)V*$pc_Ye)l;9#jV3GVh+RwUSfXdDKR!U|?j7M^GLa#OZdaOv2`gh4v%FjcPgQlczU44|ulGl;*U^RkZ znfoApjwybl*~5`?8^^gYRNZik4DNuLcHLd0IGt1g z4=T7S9LR^`)vsB`c7(n2H?VLd5Zl*WCPne&p{SJjV!R%BeFixNPzx{GHF)WD@uj3M!&06LpE8EUZ6FI_E$s6{s0bfeeBo~WC z&va_4*Wh;fox0r{0O#ukC3l?{>azts#qc^ipj?&Ucw1fis4NVVMf?aNa=Kbhy)eF2 z(cm1vQ_M*9eT7C~1=ml;*yO!g8v{qj_Lu2E(n0Lho-S-Cm9Iu*r9>$GUrY3F%59%S z9-h6o7AiwwpJA4o^L3h~J9x~u!9ltvp1srA3097B=G5|P>t7poj-otRK1TfO!MK#E z4T@y%@2BMbicKhON3mmrZ2++YjC~kegoUl+X^%<%l^rY?P>y8cQG}G!qt7!su+Ht> znS@~Tw+!U2=61K8eFlxkf=W^M!jrv&%^^~4ugmwF&aQ&YTt%^!i+zJamj6!n4EH#v%&}Y>_z4~4 zUf>-72dEe*5JZmvo8{~a-I)o@a=;=y`AGSUZpLhOkn79slD(8OAEoz`-wafKyt+0? z0I5F9kh|H{b>Y?sEF7;P161-x%gIr*$n2b9$~#@LXk{w0qWi-%X#|S#0@ty6Tf@&I z@mRK|_dHx96$;c!a(y&CDR-HUQZeG{OtJJ1f#mbEN5kxXE=`B-G``rC7AcOF#v)VY zngyIUZ{7ym-Y+&){PnXQk|}Afo8)#g{n!7UTd%8J^Vi5NjS=xS{*`KS?!s;dwc%}B z?JrjW>JATJRIMH6r%^||pM#I1_k%xGR?T>D)K<#xm~0b4zYFKYuN?Fy;p zI+kYu(INE8Im=G!H8r1oe~gdfMda-Z!*|&VJ6Zopr)gf^PifQ$eAj4S%FYm)8);Kp z7vBCddrNlu^G{IZySyuH1ue5xo!A_2iG|WR9UEpcQlD>Fo`H7@6yY7$<+$rA?Fi3Dc+kS2V3ms|k z3D_wF<=gx#>VGRA%EuGIPdB+?wFccg|^js+sR*g3;<9Y---Z=oyovVKO5U3kg&RsDcE#$<1y3pM`5NaM=7c~S<6O@O8D9Ea zmYgN3$7$o%ZuYl!n*BWC+ubhXf zX`W=F27Doexs~6)*LU2o%3^KTZrg{9%Uyg?o#j_2!Le zg+M7+hWKigiS9}C5dKq^JYl8k$Zd4lI9K9PNQsw~d0V^nAoM|9*}jZR9A9PBPNy7* z3RV3e>j)8JTNKJF*Rn~L%}~?5nvp7>%Gc840pTR)7a($6Ps=&xoyRh+AgG zeHha)Au=Ou@|5iW1BgoXDuFF(-mx4teA=^7MfGx5togqVMI|=RHiX}a7QUiIIRB$h zo4NcwG@PZ|J4addn4Czlt?~?%!YE|@-JxxmO4|KB$-b-36Yq;!Zp5qe&;4+ax$v@0 z+9h!)C1pm0)|x9P!(-L8hUfd<2A7a=X=@<@E?7xH3LTG5$vGx-Ju_pr1asj30cSf9FPtG3E5Y$9zGv1VRTPh)=XB?5aQ16>EAukKgG zQH>T}8v2)WY3T30|MUJ_cz<|ueF|+Nh4VkCPQQdborq(M#%EVG-0zqd_eF(z(lz4( z%rW%RnB%)sp7lp$j8|N}0T%IqWHO<~q3fgdXQ_s7eWB-`DE||u zA*CXmVorg!UB4`#P+PuyuU{c@m$NN;x*CI7wO`USX^x^oQx6d*!L$~i6YfvzGTIIy zQ--444r7zD@SDA##5H!HBa#g+M|v7B{t)raU*CM<7CQ)GH%-U)Gg8?s?~kFQp;4QgKBJ8d0SpCj*L_JzkTZ2f)sIn3bPC-Cv8`#;^M8 zX_N10$UF)mK=uFiCVecH-EXAxnEBSAneU(#A9Zg;3_yt|8eh_UJjXXwq=*cz;u}zm zDHO*mQrk*%&1jOA4S^oa}Kbx1C44~t%8FXb{|8Ky+J|Xoyr~^MM z%+#%Q-=-t47s>cP8daotsd9YRa&&38I-ZKuC8^?JE(m-kNGr}zvp3{^IpiOpFlJ&w zbJS1Yc~Rr92gy2&|3^%}*-B^`zsZchx$4O-6;|2GbtJbb9|KTG(kv6cG3E2*ak!u) zr>|ULlxQF)eJPn~oTquE>jq?Z^a`NXw=SPVGiWoUCl-g%n(-KQD~`hRiY7_KlBLFdO==+S|lH! zS5r#Ru8;NPXzkSW683j6`7l09zB222XZv_GB>N!wra-U;98mUKu;CxspkfIM2%{9vhw#?XPJz|_FwHwF{_h<5coB15)_yq z4kw!w@IU(q9NTXw$e?&MlW*Iu$?h~~%Sg43uZc>SC2^fl^^!G+X3Qevp^jwX1Te_h z>#I@tm)1(DV5Q)@N73~FSRlQTWd?6JB{A|Dj& z*S#rE{5~A2RGyw_t&pdbmg^F9aXV8t(3-~cQk2#$ywCo1bsLFAgJdP|LNUUi9iY#+ z@*33l*5s3HA&A1HPer(T2412Zd^j(uNY%Q>MwBNsgyv(@ux}M+E*| zCq&Xb<{8G-2KDNawtrC$1UiG0vCU&`2)Uod4eAF`kEh2zh@MQa{b;Lx>;BuTKPp&g zX&FT>FHlngxEb-9#55JEkuwNQ_A>qK*amWW3~l=EfqY17&ly#MP@_OXuhy!!sa>j# z@AcTS+!a(~aRgJg#FN+OlMC?GIa1A-A$(0=RK3!%00LtUwLcOxh*&d$uCN^Fy$P3= zlu|dt=|N7bujdp0vUZ>R#9syqKWSBO#C|$P7ghwls$RdgX>9Mp7FpIbuhxwP!x8b; z?53CnC!9ERTEu)DvDeOJwfL>^z(1;q==FS1h{cY)m+C}MbG2;tf+ge zGpF14#N6Y8G%)RFY+lWC1B7SJR)ahYZsx0K-oHzK~?Ex&bvKr;i!0B zFw$?-UMx9XH#<`#-6F5GmQy~u0d&V|N*{UiJs@*#28@u4^9%?L@B=b{Cl%JnT?Ub71FzC>SP`20zgdj6W1d9jx3iBib z+@o)ewBS78CL`SaDG-ff)gg_e0A4a}z;`Tf(BM+t<0+*-BTQ zlN50Enx~fQ+YuOt%fc|?Rp3~KvUO-Vbie?qlq+Q(KfTqBk+4&R^|guK32iv#$F; zWiY0Ybmpys((v)P2SgU#>W*==WkN&QJwKzk%ZZDNgKWJ^9XsTrbyUeBN$#~6utwG= zfE4Ii?~bJ|>!Ma7U0i;f$}5viOHq2lwtw~2=BV`B@I>}>d+f*FlJ6urtX%Hr7`QVUG zAHi{S+q!E@n*P^qQ-T*|Tv`xD3M9E^TjCzs#vWmsk|~wcov$pj6S+8FryCoNqeCbS z1IcRjG#1=KV_D~J*0Sr}H?Lc#y8fYJgj!}o!0yW<5w$T@ndhw~`0!{27t4L;N7{0r zg=G2UFW=7+Xo`P_`VF~V2e#sJZIFt2PKJ5w8abg~^0}l|aD`NX!n#W{5zF$F!9i^z z7Uyl{xwKO$;+c<3@;^m2G2=e(IeTi$_*^Q^g_iW3@XhL6@W~>^5ROnU`|-|s0xf!+ z8_Ca=qdRycjj3)Uy?DJ*qM+61Nn_QSGU#TuBV($yX2W$S6~;g7Imr<7G`ooAWHFeh zbMu}*`=Ki`QK-D%2D183%Wk*b#Z3HzjG>ZT3F8E3$j*hcaGq`(B}=j}SWN{3&?wrl z+jp?UB~?Z-O{_cDdQxI+sqDq2l!f#CvzL#4mh#QjT0<5y`Ycy+q~0vK*~}_6*GX*X z7N@&i*ZLJp_QQL$WnIQLwmppVs7&1JvD7~eez#03nW=dqg}~!>Dj2X%Ww1ymotrwMm3(Fy#+zVR zfwVaM;c=GwWH6-eF}(MR=8TH#H;iRO4eMLNj_g@V5xz@firT5o8yJ znC|QRo)?vH%ZQ&&h2GxupKUxOk;_qBe_ZeR(Wjjn8BbbjQrPrg^|#X6gk_mpV?fYDCf>3n!hLs=aNeymaiRH(`SJI@;2gM#JGOtwWEPR8fnsD zA?9m?soHRMtV)$yvk44mNBY!=F4h3mx`7oCNisC`RWuX%pH5LJ)$j5-8u-KJv|_6e z!hlla_LNOjq&&PRSyxLU?Qyr9Ii7<&xtkqkp2`Ew;RkZQA2#xTg zepDFYNyc;r$!F_#TTk}QX@U24Nr!64+uiG(&KUxBdspsLvH;|w@oV1l1K$59C*^?N zJ!-Go<1cAVm4uBEwV6vq#X-_1G&fZv!BWt4@$HFt2acy3)VkH>hHJXSc_eV1U7m$x zec^5Vpjad_2}F?8A1lmUQrg7&!-F0+n5~Q!`*=%G(wY;5@bQr${uP64$x$6$k<5*~ z1nC^58?K^awiYmnDOVe9j683DNMp{wFk>>@xdh)83YKHhyF1k*`adJ_+LCXoKl&h$ zrhwTOM4IrdG((p@b9pW`ue1i4Ay@NgXeHu&Z%K_*N*3bjuImhZcg=qJMa4H%Qn}uA zmj;9R^|sL^=r?4N9?pa$PCrI(2&=Bl!}2(yYlc7+arewBso=fuY&^Q`U*6e1tTLrRr>V(9|qMXU4FzKpX zbv%<4yf%K)i2QceQ7KZYGaP7SA?O$%g+wd_R z%GIpsptNzq3YSSt46E+_Y{$FJG_%994fO343Q&5iqS3%Drzb^~SstTy2UwCWj095X zApX_+FRGD>Wf_JYzl&?|eS+chju)BrcGTXT0XZ}-h2!NBsgY2Yrs(!Bdfc@O%y z&HY9=RjE?fC=&QaD$Y-ixBg2HoM}M}RRcJ1tO+!qt#j!==yPs#?aCG>?KE~jd!ty4 z6mQv=f*KUzya^TJp)b;XEU8{1=@C$#b`9;=&hm0uk+axjf6vfpXFjOuDsGxv$;4(; zPsHlH3bt%ba+J8 z6TCVj!BBcyuhg?7^uRPx5EzvW9#`58NX#H+Rg0ah;zoE8w0{W7TLe?-_KX)BQ|lUU zUqDRS5S9;I^r$}l|H$)-x@^xl49nH4?)4UOiqcNuuP%d`@LJWo3b@_bF|Lc(oYdNz za*bWGo)@L?>FTIvWV;8X#F_u?#F_8=YeFNK4Qco7*S~O8$8&-HNr~G7^{=Aqo2tplF{W>Izfj-% zVo8$L#V}EfdBy17I_-;g@eyH`L;&$J$Gdxz^ z)KcXs!9L;7WfV)(z#Rw^Te62BI7il7`1Y4JDw`+g^J6Dp9Po#3uJv*YJK>;Q0ZFk2 zU%xSXm5jG=^z%h6{Nx^}R7g2}rHOP?S}JsJQT9WdmmwyyuUc{`tZ}f^wHHQoPx_f# z8>3~43~p+yYY~4U{|DdQwu^MeJ{l)X2n74|@#l4Q*GkMtE)GWG#Nag~MYO^e z>q!ko^}r{a=xru*=P~W7jdBwOg6=A>f+^_# za;QoN7YN&hYVg*xxnA2&dDmRRrwrNe{dyA3v2P$|7*GkNPgU*uSlZyzAlzUx)45dO zl>C+J-+VhK54cpRCnh4CeT7`gD6}_-2Ii`Hi)`&Do_ytfkm=Y1e<2p!7OyL-l$&Ul z=q{nQ6c#zl(8}Iyg5eKR9mAHlRVX@9EDeG3d4}_iA~sbBe9AIlb-6`vNwZie^=iF+ zVfb@%qix|f>wx{u!?uoTLa9Eo*7p0wn>kk7)$1#6#$rDzEb!|9b6-f#@_M>P>#iMm zS@7%LmkrZqCrEbCd4xFjiqheuOf7C)KhLhDvzX^+7y|Y+#wo=gdYez zli3^^vwPhndZv<&`C~cd$YtCoJNe&=N`l-qrnHYSlmH)lLzZ=9JWe-@fTo1rB(bW2bU%(WwmYyiBnmZ6K(o z97X$4Jk5vz`asfcaMTIPL z5NhqmIg__5a%y%tDU7Wj=#TY^=J-BMuAmXg3`qN2VKiH?zR0ydg-2MIUq1P3sa+F6 z9bZ;c+zXq5$*rfgG~$? z1u=tF_~{NenaKqEi667S zA`;IeH*@BZBEV)p&0qJZt6Pi2SFTM);E36~lPU-TMR-X+1HFxONUdzWm%HmzG5|w< zfvTh~VUCZa-HKr7=<8n2e0A>DRq9}kgo{s(ja*|r&&1a^kKc$U)3YiH!x4+`No8r7 z`)<^qEg|hBhDcvfw;yk%N`2jC6M=$8h&Y~7lt{y}!SgDTlG`8xS@{YuwZl7EOAcD8 z*9;P7VtWkrJM`j+3lsjK=6 zQv|TdCqpT}R0MsWzo#S{-&twe#KEWTyw8ag-YJu(N|Yi{G2k*clYf2pqxE8#|%Bl$>w z`(&aK<$Lp)@{IfNZHVx72J1tL*+q7_e`%)DQyj`1&&Z}H824Q2=*DSlG`f4i-DOcu zxu*NC&sximyeMt4Cua?o6}sS4oxDv089dlQsJO>fV~yFH@S6;`ARk!dP;&7s_NQM( zzdhGi)~H|1^L}Ui5ukDF>KIq3uQyaw`&#my2>wePg`j|Cv)0*H{YiTxqX~>|=5y3% z2zB>AJ8fv;{s_O~qtcdew)U78Vh4JuqQ=|km-)AM_1lcUW-=MU8Y|xBMDr^17z-RP z2rNMfWor0Pl?*oW3W3u3iAf>eS-ildQv3~B>-#=VGSz2x!-)w{1#G~du{LF|))XEx z!n|d!O%{n~=Amov$RQppM4p%%1d_U`w-|l%>CaN^wg}HcRlC{q6ij}}*%o>`boff8H%hL%{e$uP~hWh`FxL%-L`**qfZhTk!?bes!p>oAE#ktK20>hmvDfcX<+Vf;M zh<9q*C$eL=aH8FBoiyf$==NJob|or{_{lI#6ZT2_YKH3iA&TgMGpqCb^dw1uKw+Md zBreoPWeN^WcjPD_(+Q(k9VRguGQD)6?r}~Ona3jP94aPDKJAlJ3&H5rL2O<&`Q7O% zR6BZ)BXOMfQO0#uB-A}(|9NdCLTK@Uk46=n{_=5r8p@=E7WOj} zFy!6WQ53Fr=RmZ-=t zSW;x>EXS7ddDPrUqpu7cSDW)QTOVkx0=mr5f+pAFwrx3iG)6?XOifXa#oN!M`Y~na zKHk**p549GRj=(T<)JwYGl|kAae%Dr_-8x zXtqR@69bptbPciJDvu6jLUl25gb#ha^KNFJm4yvpt^Ol>kUxH@ND|SP> zoLq}h#dC%<)Wav zalE+LzE@?W(sjW6@LkFs&1xG?CTfLv2nKiwyZo~AqaTvP@be=xvAG|K)*za=5TIY3 zJid_NrzF+15O`kbPIsZ{EKjH=<Ntry@u&ShK2sha9y+2{G|3$GIQx>d zV`U6UttZ~?s5>3E(w2UkI%iv)N8&l|`79;XMh561prXMlh((to_bMH=srf8p=PLZI~&U#d@=hj&mZv)Hw$_Vqn?#tYd9fH%ODSh8;lNJU%&g( z+*A^5+kg!p6}hS>CNwR3>8J2Bn8=%$%v!nBMge7xV=r00E23f=Q&KZ$=LFY!ZBOvv zyD$YAOU4nsouwS8V&+nx#d&8;)>BEK(1vP+sHpY$-oljciT$r-0Uj}`8VD*vRkSbm z(VU}8o*-GB3m=ub+*ICbeZtG=aZR=kr8{pIq0XFug)l&(fwQBcx#E?XKrgdxjS zx!#`&uAg+?k(?p#0-_zzIZOmp4kZ;)Gz=#7Tp-9;*0)RjkbLETKl#dUds!neg?EtK zZdkLe_~Vdrsk01Va0m=W-Qga?wRJ7b46u@tH!Sa9mzYF}t1)3!p~fR4l>0*W7otI>aST5(`zMF~`dzNv1@5-J)rMoBIUWJ` z8C253y4cxT#i0;@H#7x zavI|W?~8^z{+Bx16ry8|XR2>kn-?)rLPllyVGj zufb7Kj$h#`EJwMLGSzrXlENE#q$w9E=QY5}r*11J<$)~=5T-HJYi+8%CREZQ`{Nm5 z2Jw97-1^>n*B;lP3B+*AFoFbU0jz_~t|%;Hg<2C7?BuCYWb1Tg8Jgkb_v|C_G=9of z8UuY3Z;+d$J7%K=0b7qlr+uO>;FTJ*g_Wo*DF@Xu)?hz<|797*9)Y%~2jmzbr+)b9 zo*fmIEM%tbV-_e-QtIc5Qmd0rN_0+lm83m*Jx8mL_Ag)^j3E5r(}c)#kFRo_Bx+mw z^wAx=_=T2-L;DE)N`UV!joNJ!af66P$UrS(4p#G>?tb%*?9~t+M^5M$45V=jxPSa% zMf!4>h{JK}rG=UZvL(>Zq@rV>rBE-rL*sb3vgIb;i;{A^g^H8mf@1AgY6PWzwZ^m&B!_?e|PEqMKMqs4iNtquy}3>kg*X znOakC-TK#3LR^8Eo6I<}pk;%}pxG?T(JNc1dRcGXGy4_7l=+sLrwt==mP*L+fKR<1Bi7kh zBL%K#J^z%cnUbU>)G~T28};+c-J(Qex6#oT_?VjZB`+=Z{@n^(%=?sPwLO|jbB4q7 z#;GjD+^NlofKY%1Q^lL~2`xtxDtW4I-Nv3 z%0IM2A^ov;6L#>}F=3vlmWygsiywzH?q!KB_$g; zjx?3^Cu;*syNEq?s&d}&IP<^>1%d5ElM&+> zQUOK?{7-&EEO*S00x>F<_f#Z^=8@jg+OT|MLRGQHjLPwPgbaQD4~gabGv%AHDFTcS zxS#c|C&ikUFpbZ#bWf#1n3W)BI-e-wJHLWF@rEkxe5N+&@GJbQFjO_Fj1n!3+>vtL zCn*(2^|e&2&M_W6bV8q_Tm{g_r<}dB?@hc@{t)tX)q`HtidECMj+rs>&mbZ+KgbZ{ zIW-Pl{|!QDTX@7;AQtJ^hr>Rud2|JFnMOhuV{s8+Y^AykUQZ>}iY7b18n zWc*Vu8_l;jOFv{rB_BxoKh9k0cRrn=npPW=&${3EtCFK?19sd?r4e#n`a527$9XY4 zJ)|^TgboZMn7LpJEX?N=F6-g(^x&OfS^afr+BJ3jQY06+j8(G~>OC|2c9`LiyBpNz zY*z-Z4+`bcgzEIyy!nP|pM z{hdF-)J6O(5>a7Q$@gCW9GQf!{EQXfeBu?{Q1H+7;ASOZmP*ntqVLW3oos2Wa|i$a z4zJ`P@HOZDe5#x-+gPRRJ(HG=Id#bsGCTxCIv>=I&H1g0)f65f-v23|=}GqIEc=hA zujiCi-#M;Uhtlp_;f{f6fbvUVWnO(Iy-o9ueof|0|=}BvT$Jtun1sxFi_i2Bu(#G>}yAT>49iTpg&6MNy5t|7}7Bq$@w-nf$!Z8?w7!4-!5IRN@f zgV&_vPkmub@35+Z&0yRIj>i;H_8gudfR;rinxCVC6=&D{mQBDUKxB=f(ILhG1mjEN zP{zNcP3RJY_5odJ)cE3j_G@o=E&fl(k%cOiw=Ayve<{^Fl&XKU7Y_ni4v;>Im515gRoWRCa@J5IWdU z&rQjjQRX4m7)-r%N&-bR^SBB9BCJWi&Lh=#21B|ILwt)?@i6}59jcrX6_^LfOS09E zb8|X@{cYscKb5{AQjhjlm8z9YKMKk#*IW6nEjo0myjH3EEa4F)Pec}?p5K;RA35WD zzWjqW&mA*DNfW@C9_wzGf0o9F8!v<2GcCOwFS2!6;z5Yeu+BN(>j2Ce*kEUY9i$Z* z1&er6nPTGqYiob6rsIU#9x_9-$sZu?!_H&x3*i{YIdIy=Tk*z_$$uOo-UAA>%Flm^ zm2c^Nbpg2azLVM(D_bvpV9{TVP4lQ;jeCFIDE0`ZHO9!KF;!e->i9-Q3%MPyqEhao z)~w3M{W*9ZlA={G4Jt_VRYC_Gos`AgU()o=XaccyoR6YA!bho4(^vd-++Rs83xsnE zjQY!(&*Qy`?Nj!x%eRz2ieF(N6za70zM%`%4DJi;i7lhWM*_E;?W>l!cW#6aek(#d z=e%rJV5!}kM`Dq5arKiOa-VsP(I-#>sur6b8;_vi`=6fp^1aXhG}ozpSPx1XTGZ+t z*PUG%W%0#HbfCEXa#2YJ6P(<8D=j3eqt=|(T@$N107d?AZCxb@l?0QXZ$~V{1|K?D zDN5z9rIyE`Rvp++4)cu<=K{`-JH@>(iV?ckZTttBM~>dsFqis-`KvCm&uP{9z&1@^ z$Gi==N%0W)fvVEvJW8wESwc&<2gcB=Cr}&ychA4~sVkUq;Om_^vT%9`KIt#`+KnfY zPAg~)g{={%nlhd27tTI4M>2WV6uFT&nTrG?$ShPCn%YNpSj3hfShwBVs&ie)rkqKZ z5+0MhQ3OR=q>q7;&a60p*MH&H`0)vM_t5I85Gw9F_9ShIz|+s~F1s$W->18Vtt9)p zj3F)IcNZ8ApU$4OZfDZ<)o4zn8fPER(F^)HB8*6_Kc2V;S8w@K3D80J{&55wx6ikr zeD(e}01Ns3xFNdIbBK1r9`_kRbeJZ8vkCMlnhzOkkQL#{6m{IEqC%o67FrnnyD= z_3yXt1Y=G?WQM#tO1P6q)$=ue1*GpDRT~rY3r*`vk!GWU6M*xGg2>#O+tGBypS=HK z1?E32CLUDWitW3&QZ8#5sfu3g8ltAm23jUrf=>h*IqXk1itj3cpD%lb_Fq%T3&lSl z$GH1zC2h$2^1N|GTEX!dLK*4?FmH_shrYDdy6eR3Cy7Be%g!CWQCaycx4!j4WL+-b z)`*+QJNp^ZSD&%l|1W{9=XV{+JxJtDV@H1d=u{oIWvqp#+lr_q&g;V>%cKmEY)46+ zK+z0TeQ3)1Nnd{O-sEL()6&3Ht}(E!_fOR~`G%v{rGoTX{U{_O*D{Wdfw7uqV2l#! z!+}3aj$l16uj%7co^eEZXln-_nzi8Yc-CO-ytiN`H-#Y7XH5DOG|3; zeCB*^M=054<8KyH=PdsdAEBPLmoyUM=RUYPQro_WN9yqMXsGfxo&Xg46KXoK*r?U8 zvQu(mcvmBpymlRU&vC|2SfwjbMb=m3I z19~%+esbxF#UZR_&*PiN(MJ)*vIZYYCQ(OthKVkgL`9;reU&W$AdD@-Pae6)HvPqQ z7^;2q=~tnQWd5%!li6E9t2jy`eLY2LxLhbfzuO#I&NLFUJnelEkhdT@nr z?k*mYM6or_GKJUXTD)dZ^;k}Hx-tljM}GG9a^1+JZ2r{-53iJS4_3=ULks+lUVnxkxL$*F+^5Gl>&aGNY|k~ zZ;^q*I!#TLv@w)zC9h_T)?+&`M(FVWu5@MPRG}lZ5()B&F&>w}C{u;r%APYmP8~Hl z(Q~%9zqBPabEZeqA{CxZVfonp@=c27rYrUUgjun((T)ob7bwAn-yYbx)A#u`>z@k( zQz?YqpGynysdkPyxzU3mBXuhrN{`qL;N>uSRHM8}_xMzp1>iN{hOT?Gxc4WwDO3)B z#{9^&6hvTjd%-UIwhye56fG;(Mh z%SuCyA+WN=OFYiJ5{x%Dm|8(xQgLA1oa>1I z2PPC>uDuUaNnEpGEC2lVi^mt?^q?x_%RPgGZ;J5dWyYTHmXOOyp1Ru0DU$)&e>Vq znk;hCXoA|{JUURGdKhxjrOXQvI?)bMO>-XO1RkN144??I&Yc*jN-0t_TtZ-sH`x$K`4o6}G;Ne)`IAG!V9#R@45v;w^!} z|C7Dl$1cC~N$m1ne(ej%!J-^;!RaT2P-Mr~=Y9kwqI{7yr5Woj0f+HK6*Z?_P3`Sb zwe!>8>p{izWgpjA^F=&4@Oh@hAAZw%N1Kvr$9by>VPCM57SwS3ufshq+v9QL*kc5` z_m8Tco1ibnLvPxjdK2OzgO4)B-*b=dY4qGB8Y(QD@LlY+y`lQbXjJg4_rJ9US`RT4 zX%o(B9>2rjH<(5J-!qFcy8L-bZX+kkvoBGf>xripij&xcaAczkN z?H~UgY|-U0VEi2^du~F_>igG6`~hO*Qob^ePb|5JR5IHyMI#VU-^AvDGZcfKNVtWn z%iH4TGuiekFE(k*oypN*qxI|JIQp(=5oS@ZFdg#q8{LE3(tDF}QRKhaou{+aY@_QR zWxjwkjS8)@+1DbZ^Lsyfd6(sOQU@v65% z-j>8e8=YlBZa7VaaONP0aJm{b8YvpUB=%QEJWWtnj-6=zSG0+L$`Ml`Q$*4MefOin zb3U)&)NPK`E4|3QwMVFXOooLJL)II##8_<5ez-|jiw<6VUs(io9vZ~Jds^C6v~x9a z?_G4fJ0Q@yy-9JTv;ogazXRDUM_(+XwIUy}RbkY~cgA+h82kdtir((Y^QHkywT28H zAmZMd#3}urCMe!CA+8uEy~XZp%6}Hk+a%~v0x4|q{u`fmx#s&w_`6sBhZ1jH}gGtwous7oHvOJ)$8Sl76W(s&5UBMl&Oim}fg)W%!#r2IW6{(oFk`f+SwOb;-JqR8 z7|Q9DgCc~kC7Q$`YK)hT*~BEu5SRXI8Yr^fqSVzjT_Q(wO!=G(w#_Y7(*?yYYwq)c zHL&7Lx-57-lD{90+A*u2bt}HeR5Gb_kh%j+GIT)4XxUO*NyQH9Z=DyxD9<;-OTiRtQhGEl}o-qWXps`WaE4 zD6}1J?TNKUo3d;IHzGtJZK9eD3oFbh6aKYTri3)DPz_hs@^gC1 zsPb`admBxbcCOe)@$p$0%Xyv;sp5GFhXU|n%Uj_!?XE6RKPg(CgD40!#biFA?=Ws2 z^Xs2>!t|T(W-*)GL8P-enYcCVA}yHLj{OV{B#JS?kvWdMogM3!cEF zW&yAO=mqgSPDw@E_?dnDXJ-JH+mALY_V{50eXj7RDkN>jXq=RkT_a9qPUO@K@*OGa zeVOV+0-@LlEgWy-TR-t`y6G=V4@y(w^@5>$Uftp;wm4%16`UF~zx_Ju7xfK~vTWG8 z)&*zWLE@TalkLbB(peV1w36|p4Pn!ETsj*aD>tbK$mn&P=vzmr?O%|O|DD&3#Y^>l zt*OxUiL5JMlN5U#?PK+Ftq00+=9TJr49NJlno2cwt{L>sL3NOIf7H%aq|OX$lv~;w zSTX0r{&u9fUMP(NY3gl#zgr)n(=PQU7-m126nh2onWMEY!6~)W>>^;Aobo;YtyP+t z@!E!pKDI%i(0TJybb%Ji@Bfgb=Kq-$8k3rzk)7A--UNYty}B=5iR)J%YoU-A9kaNq z8Slg+cA;@`u_JR0#^aQgaGYwGJjhI5Id#ulElaEIn;R#BD8=;o3YO4=&TFg~D!5s7 zZqLsSLa_O;Hs9z{(JW(IcAQT#{{ER&$U1kzQtlr#R~xg;kR$ik{y&$P8MwCSKMHdX^2M6=;Si8?Z&D8BW)yzDt^sZbtqUZI;ue z!{4YGFV)j!T!r`rnw7`8e^K#gU~DB`*j0J>Pt|M@O;~*M7@Pls!XY~W6pD|}2FC%x z&bEL&50PR^JQ0bjMQ^T&Vs93Q`sjJR5?H$1Oxpy;of}h~5w(8Aeme!+!(^kv^WBQi z@Eu2$bwJ8!66I$IgjwO!fX`VxOW6CLNK(M<-_0L*^h0`6LGZ%BnNl{V0{`$zaK88X zUzqk#DOU|c+verHI2!CE8HdfNz>(JZI-t+2*?5_b6qc3SLEvqqoh6&l(nWSn^^V1M zMpc*FCmM#-UM=}BR|?RYC5CIip@|!XAkS7;e2bU6n)If9_-o*xn(gN{90t0_p9?{5 z=_<)lLZW~J@2-&SfEOUJX(dmEbWjnc?Bx5hrMeV|GGFX1Wn>C37rKOU{aZ00 zl(vp|bFEvkmn*fO%%NhR`}P8uA`tTfSReECbsB?yN&}^%&z-_eqUiQ zLr>{Y!RVE6Wz|c1_w`&1A;_xDXZ^K(dM-dE^q^o~rboS@^kS&6^Gt629r0fmp20!g1`VfB+Xow+UgnFq!vs;R8OQTc~b{suh?djxx%#M5$RRbgx?S|vw>o+ z`PfYIXg~n#h}MPGKnH^mp4C~so4PXM3c%-DB67eLC1>EAKm^TtT1DcdGuo~sAoz>e z#)zup;;bb3#BgW7D66uD_3SZSdTC5{-{q4?YSnldiYQ0nlh(pB8DsAlppFgl;G}ja ztLENM6ILms^`524FFRsz%s>7pI0j*#&8m-SGIUx$T7LAUJcK3wWip7jHN8D5t!pPg zRh$LG-n`F_y^V35)zyFOssWf55eS86g<*w8@Z7c0V?7hW&t<5v8NBO|$hF5GzB^pC z#mtf+72PY?)L$_dpI&)2lna6{!}`W&OM*s_HD(7rz!)^}P%Hn>pLPoMkKTXJTWA{I zuE3yO#1LxBFP`({G@6c$oF-GSnG}S3GxcY|=J=DEj5ag-g2*!qhSdYyQ%s9327~xa zWlAZHo{Xq|+h1SQF~+M%WF9ClKiAx2a%fmzeSHc{KG9yY{(O)4FU8iHeHbF%$vq!7 zAIIwSCD8%vyI*Cx)}f&zO!sFf9mZ9+XT~uCv}saAMG1ezs0MduP?l5eK<}aI*b*7+ z5o$|3Wo8<|I7s1Rq~n^@xGu~O8A8?liUa-e>HN^whXAW4=M?q7djHRbF#Lv_JgI19 zKAAwbq2-)RA)^c5&;Ztk4mAF`C|ZkzWJzmN!9S0Uhe zVr~S{UUkONyUtiwdz(fs_@XKcWtCZ}s^C!uV|k7mT)-dAR;-q9Uz-6onrp%2LGir> z?(%=AStmpMrNKtakKZ+E{34pBKVsZEALH}lsj|}M^A=q+4yvO;BEd6XO_P}+c*z^M ze6fu;BeJ@yYS#FM?B|JF&GX5_BR)Uvx|4XiDI+4XYpt|S?=}zyqPYr?tU;HX7k!44U~bn_hM7UJH@$OAu8N{{ ztNc=um>u>(@R>Ae2BngsAS%J!)>+eAK_ENaTgEG{Xn<0&K*K?b8m@z7n)D6k(w+?) z14XwQ=fk{(Q^I)e>b9!jQ952!uj2TcK|#K))|{N9tHWII!olW$xUX<_j}g)Vbg23k--&LM8`%u0Ih75 z1JCI#m%Vh-g#tOv)j_q)7LcKXvWlm?su;Qb_TJ$Cch-hYYms##hCyFVs`*yJRZ!~!zFkK96hUW!>Nt3ri+ z%w?nN-XtsYsX5*xl_NW(8QDGfYADNx7T;cjiHHiFGx*CCS`b~D#~Q0xMdN4u@;-mK z$Vg2S#eV%Imr)KW?kdp+hUc0VHE8bb<%q$2LRw0&PELseK;94xdmnB7Qi#f!Ejks*_3;INErn1>T2Q}w|5c@KOaJFcv0JMUc%0F=_Ypa^ zS4TBFOV!ztzzin=w^_{+d#sjjJc8d&WqT&fiXm>$%5cDbt*&QVj(5)pM{h=)VP@Zb zk^@)N0twP;deYm-4RxK@9x`t}%CUVWQ|bHa_1mCQVKj#V*vW$xLYxKQ=^9pvZD$Ua zHXUW{RP*EtaR_6 zli@V<4A9?N+ELMU9xMWOU*+YNmmHbZNSLx+L6Ovk3 zApRs14hl+DjWfO$uT>N;2o{tcpjLBFd>5F1XGkDEQVlxyo}$mW!oL!pbR}%L-^}KG zye%@J#P@-uvDoM;oMpEmoHLFA(C)UXw$Qeleo*Z;+DgbO?c(b^$H>eHrCrhbpp)&XRO^72cmX zM(#GIwpUEgK)Bq7tMtPJYS|a%_9<&8)*_|?&4@E?E{xKy?Gw_}>l=QG*>4(}^-71m zz_m)TSY#0oXQif<-6E}0%>6b2e}n@K1mQt>0!r#V6tm!9w$i*DaU$|<*6!!l8~d9) zM#CVdhG>PExamCqI0k9> zGT=47Oe1o;GA$b_kIXmH$gcpL;lf_iPbQMJFehe)PxI_W{$zD3I@(lzi7unIKj@Zu z&xcidrqc9!(SV>F2cXCp`7`ElPWdNka6q@VdWGQ7QK;&38~|9E)ljHbs2Yb9)|UmE z6b*|Dme`A z^~T=zM1AC^sS0+A4t0pcNSRQW=gh^P#_h$>cJBpa;6@`*xRGDXss}h zMsd|X(vJi+feau%uK-f#WKR)xX|DHm?$8_!B{PpiGD$p(IzKn2P4S401`afid;x;* z?~3M?R|(q5V)4ZA=gepm3UQ0kY;O6HgWIt_{(%rrd#x*?x#|-u2Y4oGRl?xy>&9ZP zLq(bDX&HSfzaHk^sJ=#PWerxgM&JY@#0U{xDFKD4sk{uO_Pl?4X}UWbJ(AM`wBUKU{Xq5udj0IS%8d~Qe01v{tU|N z3Wym2jcc?9&hzT0b%wVf-=RIa96%(pybD_Mp(VaZKY*So=0M888@6L<_GhM@nF+eM zRs+9`L*tu{xaqZ>Y?{^3y@XAq)F%SZSl{C)j+=Ro{Z3xSzBFrhsZGb$18L>pg^;0d zdp7r1$6OA!0F9;}4_-4eg>_SdG^XAXRe)WpNyn!?=^0Xz+ROu};SFV^ zO8>wn=>ig{f9{Cf4x@f~?LpK)c?#$$1*0C~KE3JFdpZYn$W@~OymT@1&*f>b{LCVh#8P8uSlZnz!1 zG9}#5MByuMZmOAeNpw9!Y6U_#%ih#8d%uwH>TikVqV2ic&Em^$B95LGlqRu4dV!*Zeqv;ENXT`?TT-$ax^q+2s8HofV0&K#2%rdwpC*cxy6=$ zk=n{sbyPj8I;kY!6cn(2=Vy5%CjTT+AB`48L)Px`eHvO8ij=Xx^Je{dd`J{9?PHGf zV)%I%2NiZO9Ktj{Ud}#u638}LZiF_XwT^e4VfWsps#BF>Vj)01_v_)^p9|G>n2K^P zLv7VjZ#{J4!rU|KNo~3_{*FB7q6Re5LG)beWW0|k@s|3Y^AQM8(i zwo*@^43l=C4O_I*A(ZF!H@XLf@$KYMH7j)c2roK4JxJjUxxWmd2pE-UaW-}=ORMQ8 zheD6_n_LezetGUwekqVfbzy&>eKgL4j8sI3yO9Y8MB zg@($F{OXmuDG&WKm|GKQGh=_5Pta(RAjtHdgbEnsBC4q(D>MKWhz~~Ed;1hCJwTd& z`_O|@eVO}m$c3JD96X{-{gm1KuH0;V(WJ* zoKz?FpAKQ)iJ^xk9N9B&O&vIkimi~f58e_O!WVLntTO}Mn$bxapIJyI5V6A0lJ0z} z1!;sj?#CCDaioN7{_|K-W`tGqd?;8aYp*MsR~A9|$z%yCwF-o$F+{5NNpe(GR(1&- zXx_45@TbuBcgwOubfoi=NQTppWS5GOO*==%d@J)MuXICnqQKNugxYd1(P@_sUUQ<; z_~~gdnvioC-%E^GLcS-|tgt~AExHM9U?a!ncaTZ06A+<>MlD2u|AFbX*k-t%v z@2`_{XDIhZp`bbJ=5oH2X#2^#puiy;|M>f+k=H5|$gGf{DV6y&yjbmif$= zH^85+1T|lHPjj=w2~Oj`dbSn|Rn8Z?z#Dbfu5d6dqGmp$OIJZTXCd0=4&s4mYz*VJ zS-G1lU<|foxqPRgO1$&bYI^SQp>559l< z%9>cQ;T7+a*La-B8cgdYE$gd6uC@>w6C-2@-@vQ{dkp<~IIt}jFqN``46 z@?4<8@b!5OF|aAtd2NmKJQst`D$n;mdsE_gC1=)rxxGT?PQb~(%7a8!`_SZJ9ARiz zQe#n^cn8uzI17!{ZYu9%WM(`zulXyhw||Io8OKc7-Y*BtTS z>@QH3&U?aIi>C8LRU3##-RjN05xHEwAL~kNNL%yc94W`CQ!sQ*s6@Wi=M}g*n6&VT z(MO9Nt3?TG+0~S67kFb<(7xD_Yg5|oEYfMoO?qmi9o(`+M|(BW>ioecsnzHAFS4xs zIg3Bflg-&o~g-G%6 zoAO{`dHRYC=*S8iEytHQJ^9q&JuIk=4`I|)S13Fs&Epa@`)fl#M$LY)rh)onjIp(Q zQrT4F`Of2Gr)hyaF&XBko4xEmd2YjPL28^a*8Iuo@~R|jyjoJTYD6mz>eoQi3(iMc zz#cESW>TwpEtm!P26Bn#@zA2zmeS&vD`#=;f~gwiSz+A<(FP&~I-k$V$ys`Vp2(lR z7{gJvPINnkWmk_<7C!r|*Y#h73W#D$n0{r`n5csh zW}h5JeJ)*gA2g3tmc0&vT^F4yd3;RrG3bB=*^L6}MjF>=7^*kp0qegeh$)Ei!Y-*} z>=1a)@A_iwaC@JnACsRa4!QKx$3m-JRb!opHly1UoBvEi$cg?|3=W3S3g0OKEfAfi zMW+4a#Bu=l0inw|TCMKauC@8>TOG&9ktPB;v&`+Y15)`Qc7}_V>hB>7ockCS`(J!|Lr?3w{`~LG8+5++Iggop z0=umP+gAgPJbN2}g8AW5i50|nN{B$1lMbOqCUVhg!dgJzUZ4Wb93(X0!@Ei?-9@&_ zT30`(x9kc|GoRlF zvD7VR9|_K{o~4}gm%4q*+!pixoX6fx{;Nj&Q5Ff!gh$ZrqD;3#6~Y3Pn@*OAJY#|x zcCSlfwrXhFG1V3M9c-gUm2hFmcP}k4z8JmzEqzl4d|LOdN84=*h6?i;+o>YY%u~c! zT^+}XC^KzGytPO)MXp#zJok;k&@{5FNpsC3Fc({IEIU{orNtcQ`pT7^zH~%Zr?Yc*Iy+4> zISU-K4yS@$6T&&J)aW<4yE&;5!rU?BRih>j3h*oOoHe>S26lw>uR`ygKv=1cQ+1Cb zHQZ--EZXEB`)5Ut)D2mI!1+DMCUL?e5+O%DjF6Fh(g?eXgewo zH!h8>=uBj<88*~fWuD@=-}4+2t^|kau%r6*@)w1ufT}l4BU&6hc&JJQZ2cM} z*^y^dl9tVu3hk}PwU$B632-so?n_}M;rrT$=5pY>=f*A5=FyKnun$*~p+GOsmW+bW z1&qB@;GqQ_xBoO>wF&yvuc%ernqeo_BRQv=-2N2$?T%(le>54>4^ZLvc)N}jp{%1l zv(#_vnbb|Ze}>v|h>|3`a{R*@Cst14B;}+~5oKa&?6_8tjw&3)V!cJM9gKF@?5hEIwlI{As zrO*Di-pW(gK%>|)aAmI@Hq`T?sYt?|q^aLMwau01;> z*q7u(#Ur~;vtL@IMmlo1NG1F&=aZI$bW4uPP>Rtu&t%x3soj2D$eNMl*eVu!p~m^q z=}1kam*s`_L)uKO2!|MsAhbBZFJ7tFv=Xm{O6Jko>LjB2($dVVmQ#bOAc6{V2#AF8!v_{I<|mCVO0 zX|SYJbUDx_3Ln|m!+CB=va3^(~`U3sOSYbX+%IzKSG-6dtD6x2iLD}WDf z;yq)OgpVVt7lVBnQ1_Q?zwAc+fN;v@xg+6AMQ=%1CVuZe40r!k$L%HhGTXDRVXzo`>U%QJ&u(u*;K%#)#ma4>kJ*?X;nVfsMP zK>R@t3^ne3(XFVJ*}3yF23%NJKZrnz-n^FMEH2du%c(ThaTV*{|9D)ToLxjkvHjR3I zny)zRLC~238a3;(k)Nmhdh9R~1cHe9ae|arMnn;>XF?{Fc)%@C|=aL$9}*l0CyaU>6dRPl$+H191YyQeE-`rP^@7-Vsmu% zqJzA0&sL?&I7<{FFkinOoF0gRLO&5BgvSub00LpQJ@~o>NZr!5hU;J$nZtV!kREp~ zv>z2k{(CP2=6@TXl6vKQ#$$F_s&1Sgy=L^IpUAwp5N3QG zTqR4Z$WH}9>$L?uJr+SasVb6E^@p3M?c>lTeJz2g=;or8eup-w@kq=X(r*Qc2A?t! zw!k|a7Z}BCwe!7#8pNVSGY1`Gm#7lLb9F{FykSrlpFh2!iER`ry;(Ln#=b+V0w32S zG9-&eh@LqCbLdd&nQB(C;WhZ?TMy*4Z;1-3FDFwmfDCy_Af+T`5E;`vjGh%I$o49) zjnwN}&&zR=r9_M3htN-&wF5o~T}xZAYrb%v&lkM?k-R7Hw$hX2Wu-h!_l)1$-4>*L z%K~Bh@dAn*dV>V^(L3{ma)Amso_70y z{ZPIzo&d|a-LD#qpXFYyX_J!l02in^imVU)w{cH@@}Li9<4uuF8L#IrVug`35})op zOK=hJOD1o-r1X#9|H-HScu`Pkd8@@ZWA>}nI?VMV{7R}2#VT@J+o3d8N~DL#j4!DG z6UCm!)C&;z^m|!7zL+N(O~AOq8br0r2ICUAE6e3zY z5Q|r7^G^!s@YWLqGs4&`0cF^2<_Y1w?>9t_dCNxe*42Gm6m_6Vqq(-;lB$%5>sbSo zMSsXA;Wb3m$HB7$sNQEzCJMFQeN=+h@sdfIhOO&KzTmjM>t5t|3t+;V_=Fr(DVn} z@|yzCxHp;Vo!1s;d@(w;*N1w|6m+$<- ztU82{pvoo+q57#_6$*wIOsUYVy>WSfJ#>Pi^rCyPqbzT4D3{WIei4m|KVUTPYSKT& zRR0*a^d(4AsHE+?lktX%i?Hd2J{mwtE^Dn=^Gu?xd@EgRSWEnx09Cz-3AC=9_hk#U z=d%hhi};lHd(Mq9800kDg+>jwpD;$C1!4vu*r)ef9)O=nqKV!=;~IHpTl`{~;K`A& z&whxGk6Dj~KIAd;-?zwM<>R=ikj_EVMlzbIAxE9*2BaoLS@jE#2f5{cQk(>tFqa~n zB1U*Gj}bqvM;%9O(Rny0`lMagj>2<@;o@g%V7+hvEV^&Dby|P_DKk9HweNg#zsjvo zzKP}_zKGUuw#N35HTcJJeKJNwt*`Tw;Lp7i55Mr$rsbD=Jnby}DbVIJOZ+9^fRREx z7%p-+x;K(uTy`In#_B6}`UA`XtR9c%Y?~#w6aS5P6XlvH_2z#pVEu|B&%S~R3RLw> zy*A^?w(X1Zt-MmKp#Dw8iFPqda8Y$&0 z>b+Gk3br%n)(Qo#*g?m&!G`qhoRf~_(#z>^_4_3xX*HHKMnS5q5=4SLYaIsE*aR9D zLt(^eo6w=Pbe=m4lLrL9>i5*z?vZa=c_+;$o|T!(6We5NNyPaWAu#K=%CEa8Ig32l z#w}DPX{bw7>AtQA#vZcNSfFi!c4H07D*ZwN0AciZ^xHs~6L`{c?t-JRk^*1=?UZk;+K&B16-f9K*#57v3CBvhlmg@WG zUr^CpAA*7{r;kXla*vcj>qhgD?5P)YXvaHtD~}wzN%$)-Z=~Dg?E1}3X?`V>a6U%J zuM>Dnd=NgpiN7Bkze!VlX9YAx$P6uLZYKI}6UQV4dh!m@K@QL)L zWTdSfCmEo2wTjmA;uBk*eeD&gPL;4&)5ctC5^XNTRpKhQ-gC1mIy%JorwFL>^P}tV z9i2xW0xj=3DH0A$Tj@x04HAI$NOOUTEFUhWNk#r?ab+WvMURxPd#|4D01o2|@;s80 zFotOB9sf4!|EzFR3QdElyHCr-jDf<;;9)AWSZY++{RU8xP{j^YNzJ+B5b7>hZ%N;5?)_jO>-mrnRi`H*`dv=`FxqVF$Pg#X(PbM0 zBz@V(bDF4+RzrFv9wew+qZa;*tm|F1!wH}j@8blfbn4wU%pF&68XwXCdC%sDmDN}v ziHh3K(Nhb?evdjagA}~MxW4q(F6&RpXz`$w>x9`8h$o{sh+8in*HvW4fu1A9K!(6K z;4Flr6fM2nIK*{c`pYD_T~6!&Yf4UCae8^VZQLS0*s~~B6QED)OttR~9$P4XSOnOy{qRMVMCGjF-X46 zx2@sl<~@VHY@+hV!Hq8LqbwN#Vgk@hK+1hd5<3l>JyeYK1HxU-@3%{VKRDB}-(~5D zYiLIzsuqSBGCw5DQRJ;~jXfUEUx-w_3lsJ)s%08iUqmWeXWdp-6;*e5#H(k1S2TSm z1m{s12!s&r=2F7i?)I#P4h9or3t`K^ZzOeTHbNvvjmE40VmZ2fkG7aoIddl6#=J^Q z`TN2iEP)&;!*$79rPA`lRIBypjD7Q51(?OW!WF1Hbj23&bniRJHGvVzXzJRH!W6f+ zITJ66Zl_!+w=*G}2I;`K9vtwXgL(@D^=9G9GC!=<|7n`qmv+WE#R)88Ux7G7{gs>qpRbHD!D3`4$ z8jV|aC*h09GY4F>pXYN!^27z%LqWQyZ0^ka6ip?Gdn*8cmDdqQU)Uinm!SRS0BZcy zU-VkdRTh`Vj&Fqk8#eLWi^M8A*cDfmE5=b~_P2S@=nP4X0?Mfu>F&`ji`+^hWPwu7l6`U(_-K>*FT7MT_@Iy5BUme0ixIn(XYId43uM6~_lof&j^%6C5! z5ua~z3sUfEI+Q8>$aIpawGT|Rgz7>or9oeB$?;?iq38MdQAGaIP>Ad_tR-GBL!6c# z{R9dz#@9ofiFPld#eGvD30U^1K17lWMLtPX&dMQd(K153i3Wdl1oT3LMAL&(e{a5G zKlhr-?jbvD5MXoUh&W$+Cn(&dRvFl*V#ImG(ukiw(=Q|t zL1tAp`#O{PNOOw#Dyf4MrJQXfM}tO#?P|w6R_NB4|0Vbqv}KX23nKVO-bGptqb&WQ zSze;Qe4!E5`F^7=V!)%`hlst-)+%exBGripO-554cWYSc_C-SOLZN*5lpK{l@E;NZ zEB6)sccaokU%2&vh5X-VUu)1p)^-H`BHMIx;C}$H)0TK9zFZEFlP#=-f{FX;!|}Il zLK&WZ?0FW`Pl>JU&7qo_3#?@$Mkp)9b4=RXpL(}Q4{~ywVfv4o0GSr`&A+37ER6P* z@jRKvED-YF6@utUhzb2=>o=dcfQ?G&S@mm~jp}_lPrck+UHgceaKF1^nl z++Fx&_((L9W;38KW|{i;-+wbAb{=(dnIU#;0|xP=?RDyOpY+(SHnX|*y2L!Mah=O+ z8)t6lUPuWYpSkY|RM32G^vl{5h+Mxgr~_SsaCgCYChhdVsNh170hrYNp8?;ymbIOVm=Z482ah}3A!hr;fCFO$jXC{@{24yo*@XwxYt zyh2Db;nlt>EZmu+u8N*|{pj1Xy7H}aAM3szHxi%=ju6XbI5xjh4rNA3Khq!C4OU~C zHyg4^^mTdX2y4x;)!U2ZR3VNUnveL%1S$$6MYHk#VF`X_oprU_czZ8adup*DqCMioOz6r+sE zC?Pj^d>K-?|Jah?oo{42o-xhOosXW7`tqw&Y{|U$R$@!AsoT|=5axK;zvsR$Bw=FxYXzD~I{sw_9(E>1l<=2=mG+jri`8u=kvlG3 zKTC9c;}~~>mJp3K2Kh6l~6tBs6ZugA*M^A{URzJG+VDT>j1ztHtrBo8+JzA{Woh=l2y^~-Ir0+ZJjHu#y|SVg6HrdpvMRB+H;)F6L{HesH`9ktj{KadZvM(+-$tPK868M?(wY1iU}NZ z6zSNf#`N77$78IUTZW_4N#q{4$|~1@l72E$RV8G_tsYzx(c~I5ro(36ni?IG$yEdg zALM-9SDEcg`%R*zbybPxT{JbY+E#)me$25n5`dfU(Yf)C2KC0W$ZX~B_`KEB*O{Z? zX8xO&Iv<#xROj9&_M^0(=QJBJwbn!TEeNT~^$_A9+u9=N*7y6?ucv6VkK6z~`}w9`YFXw!(zWAdStbrp z&pI+w<732Myw{oNKWedW0C9g3sO)WZ@+QHoI9jpLq2QZVi7ZXh-+$E5kRW)PMTYVF)>pW;ZE%y*uZvM2aQP1BtD;#T-nx8NMhx*wx#=z#9y67%Z_}hE%i%2W6q8z^4tA;9D3xi(N`ZPa+NA;E)K`gm>v;oiWWc0B75#0 zj^f8{*0_?5q;-Q-kwT|5dokR8|Su{wc&j;w-m$p(7!w6 zDq2%xc=#r6tdAG_{-3la!qwmtHAsR-W{aU2Dn2zAC{XnM^Unndb}I3Dt4KA{1*FN7 zLMFo8Q}`X{(RgNcBX79C+02IkWT{3M;K=h``(wEfN@aPDmqOrmzhoqQ-lnZx)A98# zy&;nuSU%qRP^(XzS9WJWv3VqHas%a~2K#H6b1!;Tveu}zW6*j3=qOCEE&u_7{0%Ad zwmF0plD9Ed2F+8ZU5phx3>=U0I6zMAJz7XTzJECy=C-H@KDQC98aIGZ^C(e;5DFMK zST$K1g184$@l{Eroqs$yfH%Z^BPwUIVTrHiXB?xSa&fkzXMrsA9*~u2-p3@L`N;o= zFB7^y7fLXZN4XKsK6`ChV*pm!wL_LB}82U+GPbJU|V23UJ; z%-*E}I_G%vfjBwSz`X|AczYr$(}CpoLNL$0Oed@988^f9$KwP*jK;wD$J~mXy_UEi z{rOgDvVqBtI`HlTUmfqrIk{27xFN4Nj9p?5(sH{boovNSd6FX~y3^eq z5hnE8fKPf(z9UAVxCNuc!LP#lzdBm`BU{Us%l}8%o9$Y&EZ2D(5V$PZ5^41!DS|XR z_`(nb=+2i0>?^;3U*LZazk>T8hT-msEE$s6A9fOCkyJ;Xv(MSh^7oAqk(G1pLkV-u zRase?(Ts?UY$~hfhBocGuU_d8;4CkE@%c{@=IbT9U~vhwa3bjGy2C>>=HfQh?c}0G zu6cvQa{Ljq$#SwFj8&j3l9REHx(x$dcCJQC@a!*Wlk7+e#c9e97Hf(c_F)rwGBA3b zsQtqXwUA7JrtdBH)`0S8=n;c<ytA)&<7M&L}7{~B30D-p!2 zV*Gs`p9mmaOIsbmELmaGx91F&KPhy6hDd&fHF%mqZg{xu;SDuYR=}_fc7-EK;soYE)xojq6Qtf(*xzY9g^BdJE6ZL%q z(~x}dSX{g_5{=LACWp5(+stK8wxDsTBd@lAbZbI3fnjc2P_EPyvLu(!SvDH$T-M~e z)LRSMoF_V)A3fuIf`4?j-Ei%KO)R$U)FiF@mU>&VL!mXjKi+OB&Vh?hbUf0>DZI9! zh_>5?IC7lb0U%ul;H>Ta3KYbwb`!S?7IzeC)dOC204oS{Rkp5ruVctzSFd4nSJ` z1o0GaAP;Lrp~XXPM`9*F^IEEH*qr~gD#9sPplnX`C_9$i^QMq6)2cE&$|-Lxs^LJ# zDlKBM)0dEIgzLURwV4m~pP?>!8a`;^N+(UUW1XH087Ij3Fv?D_s+!<(kiZ-sY1MJ062wP;~qC+&|zFl6S%M>2cr=jYyz&6f(VE znj4EldSjoB{e5n*d8^PZBlQw%Kgfs9ppiY>=lO>*h@{&iC{-It<=Zu^A0y4_^DfEC zNvs}e%~KYwVBpntv&ct&z2$nc?OG|<^pvE6pCmgjGjka%WO77=qe$|s3~AeV=%RrY`(O#P zFrx+I2dI>mg-_&@I;8NPY?Fyrgik*~SmAP629m%eiN&Eeitmn!@nzkh!Tj-=S`tTa zP%=X%X(iCsYhIQ&+u20mdM<@+*Xm+KapC1_9}@V+Xs@u6j)vn9RERyf&|fFz9i>{e z1#72mnf0LcB##ojm&eX+qpk7?sF0#k72hIMhr``Xpaj|GzlzhNK+~6+~bYK(JjBqq0?_^6NB3rhdm( z)IM|&390#~K##Mo6>}W1XFwJ4q760fm(Pu+_0_y@+oDxJDb?139=%ebmQ|*2&lO6} zZ62_)Ue1z!YGy|cy}9N||5iRYX?f{i_AR5|4BkC&%uosyUx4Hh`JwaV*46tIj=3A$ z*9bP`da}LP!#X6G2x6xqd%a;wV3_EA#_x11B$7g=GU^aLo*C73V|r{4ZDMEqWEvIp z+KsMH;G=$`O28emPh5yI#vFP9Qx*nKQ;3QOYX|fve<`ln7P=mDr-ASiJLYZzH6zFE zT}T+IIPw9~80p;+RXGj#08dG;-^OU&S>+Qb1$}C8nx>V!!(pzE4|DBNZ*GNjmiRUo z>^CCi20xAA*MR9z#baH|-AFW_xf|4%%oW9M#TJ=~7f2e}qWzV>Xyp2~Lb-gM7a4F_ z71gzI$hj9+A7r>+nL=DPxPP1XF&CDC?I_OYy$W88HPsPK!eM=Y=Gs3z;pY!f`yWJE z_e4;9R)uiDr6;XG?6YV%QYHr@<8~_Immw*vbagA#o6o(32!W6lhU<5nz4KSlTOlVA zS;XD05iSox6|alUa~5FgVN`oXrT6C|r=g)luguVz7v zI{T6m+$FA%toqu|g{E|ue$og)1JJ*G%8g`$k!6Z8p>X6;^?5OrQuar?s1OVks)0Vw zEw$3ASfwgRP$_w8KC2VgJ+dHlD*(pirLpuqM*3UY6Ov@nU%g2Er%L8W*6~2|lkPG3 zo*&jp?e~V#{T<37lEns;tV2Sjvr0bKTb$i&zIX~JEFrO>ZB{IXDk7aOsU+7;3ySX zP;y=U32nvk#&iZpkVFJ7r_wg6oRd!*@*~Mn=#_-aV*HpOu&T8BsAD9E)s$;ARELaq zB^A+UNZ|D;b0)4~Sys_~^fR4bAd$l*l+67kT8zL`8_KKPa;e`v*Oj9l_FCd)$deeJ%AsT22mA)N;Dea2N^OHWEAvW_4)s^WD3#F%0qZ>Rp`$rxDV^uXzUmsKpnTGZEUj;!5=(_It29#drdwrw{Pc`g;JpoADek&g+W2vdsZl35bgZ@B zdV6ZqdC7$ni`H?ohKNAwt!7S2YnbO|?5GxLTh=RnT7nKh)%hq~k8LAQ`u46Dp#$@+ zltT4eV|bRkYLQWjU*S4&7Nb5Ak2#-;2*HKEDZ>)^y&{L$i$yxVND3X>YBVf?YyGE& z-g?M^MEqXJt|d8{`+q+DOzHR^Nfd_vO^+Umb7S*%@V-%bSb(E)da$nreV80VkVX}Z-4`@*3SM}t9 zLJ3?H*0G8Q7fh2?fd~oP*SL5w1E(@y*sA{Qx6<{*cVh{3?ntHR_(VRB%I5AjG4L>m zmN5EoRE4L?`axbVsA@v953{MO#Z@qhi`2!>%4c3`-^yPK+>?n%0t-~bLu4dDEjdW~ zDsd0^0xH+yzmzL5P#kf{Z+*_+YL6LSq(J(p*|8Rh-!ov^t=i=aa&Txwz0<(@gxP8L zG5=b6LA-{DTz|aDr66DHE|wzNMnz(TpEgaMOz$Z$kJ5UZZ8fZ$66DqvX$23SAmWt} zS$x5syuPRZnZW%6`kS)@u#IonpgzmAfZ7HYSLANT?U5m^k$`t^L{AGYk#kezfym;i zVzuY{^TP&qBYBQbI9SS;L^ zRM$e!SZR^qcnmS4Fi?^xSe8bcbf&?v!D7Fh+71f$tbwTMJ|B484uF^s%a4$;vuLz{X^5CNKEipo=0%Av*B~^I$H|m;WVXVO=61WFs@hF0 ztdq44h+aBqnALQNuGSm&323GvWH=}u)_*Hsa;DKiC5>bQg~c(W!mS~brm9E28)wc^ zK+ER;iY2R`4+Rafls=@_z3z}}ULeS^8m*3%e_1$UYFe@CoZn_=g}wyWsvjn#UF`Xa zp?AG%wqqQ?-YTPY_}br1@*p|qcc`M0cDTk%zt2K=JiU-G@M7};;?-Q?w#rpekr`x@ z8Yn8)u?fByI1Pn72E0lrfe;B(yS})EtJR>zU$l^mO~|5qyKmavqQ(*8 z6gmsY%DS#K#*&F2s6Nf~f_2U`v6xLd*8tm~7Ru3$DRq-Z zOVoSy#mNf9Y%zJbX8`l8iGIEBKCcFqcqAWk3uBHC7B{;)eT4vLAZCs($kAW)Mm5q6eVN@M zLwoa@8ovFB5(q6>X$c7xvFZTABWn?&?255uugM*S-SQ@#0(+<5%!h7PVVn|AQ13Qs zSzmZbVwQ8VST=S-7cPJS#700d{fX4Y8@fG_OY6EpTTOOwU$0P()j;!<^+*`F47Qf) z7~fTM*%t3m$;-qioSIs_G<$fej2cO#Ek@D< zw}lZTtzjxEAl}Ge>AoTNJu1{YzwW@PIAM1?%$X}arag@+7vK2rr_7$_7F3!a*PG-_ zYU>bGTIjB0tazXt!k(*5zNGO%G5k9LGXRJ|1rNRjAp!CNj5t$t74D zuWZlqSn8eu)BN_&_*rq>ag&0ToFtQ*a%;%dT5CM7e1?8!#xXbm$H$GMb{#G@l_rC$ zs7lMlRk}{KI^9tx|yQz>hQF(x>YVn;~E=6De+noEBh$ihmx&CmA=V8H)B)O z;?SmOm5*T{a1T8+8u`yC#X{HEV|Zeu!yAOCf-0l)BBn9Wh?1>uGf{+{gwzr11m0PQ zI4b(~Vt}!9$Se!&{{O|P2I{vNBc*_^u=`|;>K1t{ixfr$+o!-nN9x>FO zuoP^8B|Tq38*#G}MbAS(=|@~~i0Gbo*sYoTn*XeO|K9uW@v=s8!Jnf1nu%VAoA0XV zEqcid8y%!OLtr=~82P;1pK1$wY0eSow9k0ldLAR=HGlH!8dYJ-$l`6v*?1XSwA~q$ zx>>qk+k*o!3t~Ob%QsK5Y}^(nXK3A6x83A8Yt+ce7_J=#CKsIl`*L zOM2$LuC|kZg19=Qt!LU(Ux-1aA&!osj0Y)KJ?Cr!Voc@NjRH#9 zyntYO7L%t`ZV}3F<*XcONr)wn)KQ1{71(E*#c1cNPpp1mA0Khje5IjeYE)Zs@ovx` zh4K8Ym0wnyzWDrmhNfv)P6Xc`$$fLBD!3sROr*{YI4C?xcxb?7mGHQOTb50<8QxpDJzvhZ%EJCV2mRRa_&YykJ3Sz){fB#3<9M7Q?)_MxedSF_RbQjVg=g?nQ;)O(m5M(O)CX{x)VXDng`r(h zv!WxZ)0_eiz&v(s&1<;MHMIscT{dN3M*&4r2htDDcuGI&fxTq%HkC#RSa=LV) z8i_HFJ}sWts0>aJ)Sd+my6AM)pxaG^vDpHSWQRG7r99C#`Hv`SN9>}4RrQ;=6r#EF ztsPv{6o5hzXP<}><(|n$JV<1NoVLK*BGK9>vrU)3!VlJQ_&?9SUJj{51jVCeChME` zUyZy&XAoH(#4n}e)ze~BC)xZTXE{!@Tb`=V8luAvF{!~%6rK7=Wd*n{y|##_M;&Ru zegB0imhiN6$=Q!t^uJMaTNEu`b(dlkz zi^CqTCNdh28WDz+m=CgnY9w6l2mRr_`5tov z=bi%oKCY$z?fvD!OX9P4N%b?ZdVyg@%^C@X$FNXZ_LNACHU|Eu%y{bS$cm}r*kExO zU$TlMbA7H&IzRgM{@2$)iQWm|WkfCY9Sa`Vq-NBu`178Oi53&g5T$i3o6gJodfvN$ z7b*cbU;Yc+vn(`~)RxKp_@h<)Toe;tBv6@ z(+DS5xR8H5$-~d$EPi4dwIX50V49Arrg@q0+2lgz5>@@z_}8t?fgH=P(r;lF>t8U` z5Hlj^F!421#_GegjPb0Lt&rRq>L?*=}Ur2ewb zff>ahs!h&dpd0%=gjNA+=8(mKc+0SzF9`wz-BI-_|5Hbbs9Kl?Id` zY%j)#3~sKN41;M#QN+vNe*Q7bGuO00dVHVR;6GyO(C2=C_x<-@2U=ai+a2n&<`lQN z%@X`*KA+!te`l2|eD$U0)i-E3Y*8>%5NK6bPS*n;3{k$IME$*f$E!CK774~xG&7YV zA&xexdSsBC=kTg{2q6g$ScxbvqiNU2H6XG+YLy1rEK{y4*Hyt{DC}x*=mq54F*MN( zTXU_oX_(eNX1UhOB41^OPH-n=?(L4s^R(_F9~Wvn3JgZX{oq0oRHw2LjO%2%{!QNj z%=zhC()^{#A>Q&nF-c^aS^mMPjS5%xy@fIgGi@QO7O`{i>g-0Whuq#``o7`%(k9W~ z<*^6^agS#-FBd0FC6@gc2%s9M6%Dppgr_?1mIAYiIX0}#DCp#C-q=(w6}!aO6FXjp zV~1$!du~|XzB7*1%F&@-6uIX9B!cvM$I&~aspJf>juD0Z{#ZhR&5OOf8a>d7PsLx6 zJ-+BVWzY3kN@_TK{?iFS4NBo4Z7u~3j==pn?gPz?)2qcyboRZvI<0qEul<}e!qQs} zdAuwwn#v=xuN{wEkvnC$e$Nhn_x%sZo*4ej<14N%yp8ou()<->JTK~Xjh_5B1Zfss ziyAA-$U{nHam=<^Q%aca75dgye!Z(~lpkAqeagJDce$L;o16g2C?g)3u#7m8xX%~+ zIFdntHl>_$3Ki4U1lz3!B!aOOI`&K*TTG*p$6DM)t@GY(Q3>s}#3JzMw@^Ctll+90 zF-g2Ix?97hfKa}rpd-QxYST@??qn2-6xxu>>NLS!oK`cjv{{G5=uQ`)4@FEafKF%r zR-$;tZR47~31M>0$qTeRE8(@)qe9JN$yD5j;=Yhws`q`jW#HYmsW$Un_y z8)_?Wct1DFLt=~$HH03wIBo|6-6De)pzyDt8PRc=1l*=iKWv)Z;Pm zb?X^?Kq*h4qlC=jN2{0mwh59-%=*iaTGru$_oPz6vVz|i*jLUudL37J23o&Il|SU? zi|QQl+aT}l(rGVYRU6&1Z5ncpvcJnadE~3aSOL=CAoBYsz*P2D>bS%6I^b4Zh5pv@ zbFT}iNC5@YFWMeCq?46*G;-Z?U%mUf#B>SHhT(-{`$43*2qn1M6$%DxAsqA|univN z42YErlqMZI6uN_9p6go?&UJuD{aiq*X8BtiUpL+ew{7{&mo(sFuk;d3|G`Vm1o_h*?_Be#OT9u9bkfuS~?FnBl|vPIBIls6*-Vs3Ze32cB3!Z zbX%6H0|v#|{$qfOcc4LW$Qw{h-%<{*k9mQ!Dm}L!N-~MZrT>9 znm=t7{$ifC`Z&WO&xqlq7e3rdZeB=tYx;XwekX^2pl0!${yu#$QM$<0SoN0rYqZsO zH$phOR7(i$C3QU=4EgD|^H`rHzjgtb^8S&a+AVjgUV25oT4y2LqxVl4X7Nu*dLzzs zg|XBx1yj!{2t&0uMGh>&#UX_=cFL$>;*i%#;|-K9_)+2Bt}ejB(}9*QcV12MygnS3 z`ILqdO}8agH5=+p6WWIJwU%^#qmJTtys%p-u{vFculII!?$HEiML>{mpv^PD;lMxD z2MVwBL{+MwW4>8hd$TSDDysZ;1+bM~)iA(9k5aiQpo#Oj6y-|1gkxItuTF(j+zOR3 z=!Zb9AYK<{cQg-eIwW_+13zSBmtv>+Uu=$v27||l)KuVT z>&UR_6}b6#nKtln6BTZ)P31Q$bN+Pg0(J(m+vCleA#bLPc#f*~eNj}!hbvFFsxQdx zBrA-f-|BkaCflwXAAgzEz6SHJd?aLo&#+3f`93}crBA;QM^O*7Ah??`X*mhgy8srT^!#I{L8oZq8_tId+zmHm(i7#kJ_d?IccD4 zd-^L;OGZ&cYOVAUyCt^AjTdy)I)>j6`C^8qF8mGEZ=C!Kl!1o?DY0G1Mpavz&cVkJ zy$(W!3KXbFS9;o0mz~K;xZ;;gS~omG#q&79@!T|YiBm~M>o_`Jgm^9dxbyRKFrf(V z4mbwLWU^?QPbrB9uOf@5H(xMnQx!sFZ<1#NdvK^zV!pT#@TfGibzn>I$m_;6t6xY> zJ4vx?c5?mJW_d#|KjoQWtk}c6PS@i$oj$rF@Z%&cq{CnqnL?>mCbnqCdCP;cx?w~O zk6mNmURj@!_AGCI{=|@F^`VyJBOYX*rqdDC_|334Sj2czeVdBePuBY6K9;+-vR_TZ zwURQNHZ->BrWZjPn?l#Wq^4)=} zzZ{l&tH(j^v;yimNr%E)!%~AA=23>aQMnW#o+;9s3Muo|v|JKneju)Q-QDL2D^A&do$!o`tWpa+^^tu+ikcX-RsPCTu zK3lKO6rlC!jPed=^t+^0ixKb~N3&{_J$c1M)LU5tyn^ij0mSB$tB}P#4O)oZNB>N? z_KmUp)&}GmM#&}f5vS~5xkUdJdBx`Zd$9QC1gL-di64uSe2swOZbY1YSX1i_`&0|~ zL@O!ieVkHSj89X`bsey|wZ=;39dL=cT93xletdq^E@bEo_;B)f5RpX zZM!>*4muf&J+Cki86esXFLDtDj$hhOhoX|yk>RCGd}CXV4RmY8b)f`y+hzuSIfHRT zi%xlMZJ{W~#h)(VY`L3ZLd~p8AdUJ2!KqdN=4CveUnEn?aOMtv$w!Ght=M^HAQ~>* zRc%+si{`3(I*Zrr1m>3Ms9r-9sQ>(eFxFRczpwet8?C@U*E4R=cAHO~QeD8Wp%i5* zl-E|?P7y_{W2dI>c6;N&5^}(mxy`TtkjB3K-g^a$#Imxo(R};qFKL=HhpZ?!aqZFD zee&Sz--w*SYSsK6v84m7F1pVxVk)=GTkLYPNI@k=zzW3&fJ~XCxcAfL_FSHEW$TlF zt>wlx_(hvjgp#*>Uxn5ewmIxEVxSa?Tb}>?{FYj>2^bg>*VY(G{wrBGgl zVjcFmKRA{3vmK{u5z`+3=?HeOMy3;rSs5}s{!$&l?_h8=zVvg5QONOituk(c96uZA z6g;`{0%#eQq{O63n{mQ7|Gm}KPs#8C{ck_iKQMB)e4BFm7ie}TpAw9vf+MFa?me#(k@#|>i8`V|}+2tDh7m#-Zdw$oqj)0AVdRt%=^pZReS7?0OPni4Zw z+UW;p|J(kMQbBj{^!2A7Cah@LZwcSLIjSE8U6Vyz?Sr^9$R3~bl-vFQESUoC1khJ` z{(%n*{*Xb&z@@YSD)77s85Czd@#2aDro?G1M;>kMcPBLsbVHr!M6!>6C39zbhCvX@%f%`=v?= zX*yqb0VCNK%T{V_h~ASwuqrJ#k|`+~;vZDD*qIJl&RJGK2@i;7a|?CDh%3D#r4W2? zRZ#L4k*me9CF#jUc%5S*z0RpTCK;$V))nC}(?l=Q5yA{s6v@IbdIiZ550PS44bPy{ zbhs?Vb!N|(+kewKlnWB6BVts26ui@1JBr`=ce-T;pT*?`;W@5| z>uNK%yfmVEv*<2`aiJ46Lp-A1fT6# zK+Jw4h5c8WSoqKv=W&_j-43F^aSra^5UO@a^#^PUeQiClT{^JoAWwN@uCDOEVqt_haR7%|kI`(ucsx;!A@B^cz$sa% z61`^=RoDd{%Fnzq!U7QlbH{kfQ~@ggU|RhT^KM43R!}XfnjZNQWO|`s%bM2C?O(x4#VInjuxe;Wd z$V=XHJu#&0&iWKZ-?T>T^TvPe`K=a-2!Y6S@;yH342`b*+=3GqKOXxu56;z-BURjq zOeDK>Yr1{#o7h37JzbGe6m|KU8#AQU--8K-;G2Ya>nZ6a9N57kZ@RS9)bS8v!+v4i zUg4Moh94uE4)!~6m|5T-A`zo2y=$JSfA;m79my)=-iUgJI=Ij77bmZXz*inAaqm;GBb%y?9uV(>hMpY@B(Nvsh zU;HVBtXDlZ@dbsicZZ|T2Y1b=LdY2tu)L{{iMp~;D>DZKBRTgEQZ!*&X7YcR~eri zfR#U6A?J>(pT)-Bm|@bBx%A_8{Nk6@{DWLbblOIf-XGaYWK)wVQ#D5@YW5sEsWAY= z#6i(>bH9E6m0m3eDET*^IFKh4{3da#hGmeI)|Dm!3Eur%%hW=tq4RL5vsXkR?YXiw zuiV${%p@4jOF-x(n?UnA!+Ew?!%I9I9Q9o82q^-)Iur{l4L%!GdS`H8D$UJhAc%im#b|Wt$@qC zyb!8DLi^=L(wlW*c@`}qBeL@;RmJhasGNn(=d%W0ZQn-vo~`pAJE}KI{A3x)EJhQ* z!9NlxKYh%k!=G~GZG|J#>N!JKaSN`r0#f4flz_u$IM*k0O`1F1faDg<9n})*TCGy% zA%gHNhq12HnMm)QW(jD!xfV%G+b0;U$9%h#{B&M-#XdICtt~S;jQPQXkBbf449aY` zvICbFuzN&ryXbhWapP60UiYVb<20fEh#r+zMUJad@>k{O`pbhp-S-jqh(v}yEn$w> zwY~K{t;wyO2irw2{tG)mIyE=%Rh)`3T|{HRL4JVcJdL;wWP^;inoxNPZ`#dK#kzP0 zbjrN*+%h@pg211?{q%F`PpTD~O(jw>6gB8^EbOJq_>2NJh82-Ds7Lzj&xEiqJ~xE@ zGa&rkL7fmIZ-tm+x&kV_$%MSI2*-IiA`;y91g|3FEf5=NLNv3FAG)^@HI8z@>6L>! zT7C7qh#%DTrWFsh*`po(l@4lQpa%V{QB=q4{4rO=!D+jeK(2jKHy~=MI?roBJwq;9 zt4cZ5>+hUH`D}fnr8?nZX!HL0uS9^AG-3f=U>*oRq&s`;@aIlDOlWQvG_G349~DL< zI9uk!Hq)6`qvu&m76xlEKrvnikC4bfZoPydI0K}XO?$UO_t6Pt!L|3K7>kIH0eWfu z{Y`{nHi|={gO`dx+4JO}GHHMu!;y+s0tC^VZ# z4Yos)%#Xo~_Bm{iq@2?Rln`-pH^+=^(Cxvzs2)%L`u_qly>QB8EF4Czp=1wHJi89& z`RVv3sL$|gr_g(>9(T9kl&!wD%8mBQ^Xk}$C*I){MOV8C%|GLgU3UGg?ji+0PvhLpv1FfqHD7Bt3;=(L50xngQM~!8f zBWh^Ypt2brGq6_0^8_-Pksyd=@lfuz_ViKd?e!Jc@*+)^3{Wx>D5LNBd=s16;IU{G zP$eo>P{&+B(dsa#>X!Z>3!$ww0SyzAV>{kzw zeNb)Nymnz5s8IU-^WT8Nr-U%-iF$1^JF!rpI2j#Fu2D3(=J1WLM5JMuSo+LwI{zIl zk61|1rwBth#P8<_iN#X`p~?rIt*fO%X! zAJf$ndnSz#d?+6?O!_Hva5-@;IG4utXpl-Zj@T@9h&oGM{&GjVFj3Lok>8&x{iOKq`~suC#Q{CpMHHkRHE@wzYj{^>tL z{9@1lC&2nHWyMrdX{=WIW@1q^@?|V75(i7`E67Kzs=DksrexMbNaIU#%}QgD48O(8 z1_^{AwqDd6s*a&x+ z%VtfO9%7VGm<)uFRHzLpsyISir84}sIByx=LY6lmWdM6L&0E~3<__#qg*@Nvv(%3~ zDck#zL3Zbh4`N>>O#OH7|1BQ#&)&;NTlPzsxU1t5S>vb%i)< z+AZt=8$=c;ACu+tK@^z0_|%AI-Yj}Fj-TD3DR7qFZjbqH+I3&}Ni4eBQ|A+u8dt|< zAj?j<1NORC%Qru*g_`i+s%3|GR6Ryv0lHyW2^;22_H}$&SgO#nQKcQTtfLmrY<_}cSA?fTd|MU{Q!`lIl zi*2lTZd7$PlV%)zv`g$?X=R2AuF-%0~)T`gE%uCs9ocQdd}6m{ z@KT*RQzPQi6#<3@D|m$8=6L%X{9Fr|XWOc#SQW40*tFB3s3|dnZ8s=JYpOBLa{J_2=%%+E7$0&T~QFBa26^YXJ2k?y>Z!c3Wa5G2Ma^ouVHM^Ymk}ph5_Cw460s zn1{DVQ?~DV1>BBmZ%xA&JG?0?r6*d zAqIM$|IC19h13;>sQ3tAj^HFe zzUwvQN)sZTX5pQ}P6z)5X80|ZF#l>xwf4|p$`q+=;TsCn=k8(NWW{I1ypA-v!Kn)# z>ezTz8bK|BeZ*+7dd8*JRe{>v@^b^e7uaPP>__f0R;=i5czSNE*u5Z-qD8r?7&Rgc z1I$58lIvpj3BC6aPPwwXzvCxgz0aEk!5%t(RloAh3WeZUI2AU{oNda^f^#2G>}4yK z^|OpIJ$Nb^ebb4+tmUv1pVkIH(u$xcyHJu*wkk?F-y7LXAxG@DLP22J9j)2ypKe_C z^Qn#xf*-phMgx|9X>&;P%dNg(haggUK6xdqwa>PW)~Pn6(Ub2m^cppr_w+{jfn46< zZOM;;NmC$KYprQG{?~0_9Xvo*;YO%`XL{P*hca^Z>wpk4-C=wh5yRv9VBLG}2+qNZ zA10v=uM~N1b{_F%a;q~;zpJ)y%F;pkH&sHfGTv=W|Dj;Y+7O&5i-mumo&Vj9(v5Ot zQ<{<0n>8u-<2s)mCYIl0r?n2x5PsU&^qZf2$ffwNKC_LmhtLw(FCfy-Ot26vzfo)PvD{ocuJpK?jr9A^t#|t>e0Va#9yHytR<)Q|{PDS77@iMMJt7l|KDe{9m~v1o`XJAm7SM~hCxnbrvHYl z%yuww2HKX0G9%9E#k%QgQEfj}af_$eXNgTEV5~)+p38cV*Iw;3rg5Q5TBY|I>Xnv# zSE}OY+z3>UBgN>n(%r}G_*Lx!FeV%fKZ^Kzo>5fZ299jNG`clEOCMfj zG%F;2{oHA;W)uS7Y-8y*vag6MEvIgjdE>v@I$T;Tmc4$Z{N~%p^MZ6y*iNr zB3;nYwPsBu8?HKPE;x0Y>T4(^73!{KPTz>J@PK?AyU;EVmzC^szO%5>2HF8$j06Fm zHc}wr+hc(qg1Jw4h!0E3Za0!v3YB~PQ6G6mDqXLDejMSnVCoPmq`Y7GPdX}L#Ady! zlwL&+D=+C+j!*f9O?X=Xl&&hN9>uKgyT%8C87l19xx;XvgF;8v&(J&MrI~$%A%DiX zAzh8u6d(}|IY;~KU(|8)A;Zicx7L-YEAkZdx07)RLz+V-X5>nP~$R#e9pF2Nz1IJ0DtoQzAK=nsPsdMj-+G62Ld(#{XN;0`5%ra0uLk-ItN5&Qlu4~ZC0s_v>Yu$ zC5H>~O3Rb(kDo-s6pLz)Tyt+@R;p)4T=lg_+04sC{t=YnYq_gllMewxBwSuz|YxfYz|*=DA2dqjCEe?O)q|}3Q=hu+>IXU;zyECE5ZL1<$2Ko*VB9zg7mChDNaPHKwG7Ti&)?9d!#yAv`z`OHDmBr=RH!r)nq#3aIfVvO-5A0DBCPo?u&5+w@d}>y^NiYd$l~) zIBS?aM|C|9+iYW;<{ar~&VH0UUJunRpAJzVtoV$oj@4`v7}_~-rM%vI^~^sTodK{5 zU)!iFjOHEM0i#ccTqxkz1R4iSYTV+Yy4p_A3-T1<&*FV4x+&xM^V}j1Q_y~vEBPz! zRI+fmjO{-E>1+qPcH$H-im{98Q|Eqv{QhgX2MBLI+gQGz#)`FI*kNBaSak7V^||-W ztl<_q8--0mqBv2{BA`weLb(=17m^$+$RZ6L6-%A80_uLO^D>h9_@>M7&V0_4A|+@1 z;F(n|ZawNf+RFv*)G+&coJAF;-9yxiU-2tEDOv`m$v&D**B{O2nwoGu03WRK1XXo5 z09aHAjj&A%59#6h&HLY~X_}o&ip^)DoM7QO_db3#@pXdcDnTP(L;BpCDA%_Ts(x#- zjQZi;r_Z&GUzkuhXV(gqv?D%^GDn4ZJVi`sVE7RY@%bm3cd=^&pVQ!3^BX{6A(3UU zLa0)9;+1^(XKD7@wKBQx=dz!J67d@Xjn_cr6$Uz+3nT{85zjJ!$LUA#GeUVR*GW zr3c*O%yVw7CrltvG2UvZQuWp_9y5BX25OojR-1cj+CC$a8l8wWWz}&sh01sC6y&jx zyJ_1LXYqzL{jpOyitp?;U6GaSb-U7$SzYHFe3S=#mSLdibW1gC;q6ARL1U_KndU<( zgvKZc76Fh>*xH!kA~Jsv)>>l>cePV9+O(nuDkUEd6rjpEOMpp0`M8^lJ z!P%`HvgW;IWStA3;}iSlGN++ivCF?N-0Wm+_rs! z*6HwSujXP0WN?U+~*-4$xTz{>JH+!m99&5Oog7e z*A;^JsCi8buD7$ceTA{yM`qgVgAfY zEd4fid33mSEv;GjyOnzjwl+>u2xJpaJ4xV(Rjb+;p9t3SKqS~{-m3*7P=y}BL$6}a z<_btt!wJj4^la{W)b+<7V?7nz#~LJgPj3jpdS5(nv>oPa(O4|Q-peheTe+1r?m5-4 zgv6$7oM<3!9Rr`SJW|Ea#VS*Hr?o8`jI5m zS{}Ju{tWV#4o6MixpF%9>|F+XhWh4C&-+-}W_LnlYE*%AsH4kLzok5RK2lL>x))<( z(`2?KuH`HUM}0eHdAzr85<>ug0DA30ad`HnzDB!G-+cb78e}YO?YFm8qRZ0=b>-_76;{b@XIQFDbehl+ zac|mdkQgck6eW4v9ut@XNb}lkG$oNj;zd_&N5-3qbi;&qD zK`J?qO)0ZMZA0XaO6pF7RLrr|R)a_%32*Iw@$d~BI5I^GXH#+F=r0ESMrN*b)42^` zE@Yg+NuNXB;vU;?MOCl!SU$w3)+&#|m!#Zxg9@zV~aqJcH7^O0)#3 z|LJO|{xZswd{`(54&oX4%^w1~;1dZrO~4x{s+&cwz)>!#IyXWiNw`wZ*8cGw zu&ZjuVPZ=>X{3w`LD93;LYu*~pwzjN%M~4Vbk^8wwacmkPV?@K6Z{%ci_efcn6dUl7CZlFzjLi0tKn~ zk%Q@Yvl478eTmpZJre4R;XTx$k$G+5_3gbMOy4#&Hyo~=%jpH2FPC|}L4h97RLf@A zaX&*?#6&_NG*}&B7s9|0ICMS=O@ALlv}sVQKN%SJD^|PF-XQ@zEV$M~fKAh9DH#o1 z(6sJe%+Z{CIQ1_viVIVeU074!yM5LS6=@3S?fX!)?~_XuC=FQ z6lhU7eK$B+{i8XROMooTn!a_b)k$AYMVT)?|52Q5V(pago%E?&iW*CkS>Vk1qeneImt9kS=eaV=a#_<21)ky%;zrirZ{9=V#Im{c!6=ILb0(w5i% z+kLdyBloOrrE&lyCH7riSG#8j;u!{v0ylld%Jgd+H%H_FnD~NZH5{yg?Pn($j?ywa zf>Q*UNmu$=ab1r&EvSkO{5v~^u)d=6cK05rjWH;#Etf8kz-P^dj$?#W~2h0$npLKyski50GyVM8Q zEj`D}5SNl_GLJ$CVAjGQ`=BzzlNjdj*25n5C9Q~wRD`W0)^AH?oAFy~mpKK$dU{Mf zJ%5UGt%9lwC9T*JiBF-RBRx{iB0|8@^(dmzyKqqCe(RHOPyU}~9{6jdEz<>~wvRH? zbrChf&hFA-ln!)NJ`HOP6ohU+-Pg~KO0>$S=$G zVx9C_-uyJWGTJ+4tT%P_Ru@T39E%)6P)-mdBh3*q^NKckT3J-5m*D+YD?sf;3A+`k zRaT$rkY~uO5?kOX2*qa*o1j7UghNiXVb0j5k<0`K^Y*KiSATP&`Fhv)XCQv zG(THa46_JMpcKb^h&dc`=XqoID_w9%Izui(-|q; z9l8|yRNh~f?H&Eq&v(mD`%ig9IU8$?7`%1DT2~L|v|ows1H9x_xEweL zSpp)+eb-u>frTE76!SL;T)TYrjJ7NVM)W1Pu0u}9700^5ZKYtD9+Dfs{(6>-k09IR zHclgOCC-0J!s$?(^b53sIy8?Ap-KMnu#pWDT)Z74xQtc$6NF)2p7AXO<-GdM3dpS3 zyrB6uP8d*jjZu$^mx&INUyTczKfG^My+Hm6YU9jRv_@G$ZAsdE{3%KU@vLTrQwK8B zP@|9hAIszwFOy$=Yn4nP2JV3cZWNpWWWd?J-kWDg#^1S*v!d;|DI%tlPbLktvKrG6 zu+s;|tTSXYJ-pZK@1L1@0*a_mWd>P>NPR`c^V$Ycn|QU3y|?s3P$h(tIv)o?II{Pk z1Xf%Jnj-Phi6Yepbj*8JFIx|rFo=TK#`XdBQt&2C@$Rn58wo~&AY5hO_@;P453-Q? z<(wt2SB~VW_-Fx})KbbBs(AgKpkd_`s>pl={}+ST8m=BMSvv(uav8DK+LB+5-ikCi zBJgJsUGwDkZeV*@<(Eh*z4T&a_oR<^!z^th<=-qvjuwwcDoO$tS19q$+Y_E(^=tDI z#q*x+yW^7VJo5X!Am`m$uLASN?#P3DIkpOyZp}L`dPptF z93g)kLcagL`}lh=#UW5dbpKiy#=?yVb(^YZsW9Q6Qm>PowIPtUakY{4X3N<>6`Ipf zVj_j+mn8)NT1S;hzttOP33`J_?jwOcg$*)XFRr2t)C=CHA5MJ9?>EHET5oP?P^y}Y zRv|cgLUspk3PO~qGTx9#IrOPhLnXbx2HS1<<)IXO%A@NFYoK{5dW~$GfPP%y8eavT z&U7WB=q>?@l+%jlC_D-!A9g7f(30}1U&2>KA-#>RX8ZE}?0k3#D(AMxK_@mh4e_w) zWbh%TV8wn#Ykw@&2L~w_{)5Yq6UfAKTqdyY>?K=QsZU|7E(S*ZCdTRb98`DJz)(7xa6fRMIBEgg4EB=GSaZL!yG>hc%ew)v>SvEE{1}g&9tx+ z>?p={Y=zn@w=MX~_8YdO8Psc+p|B;>sDWJRuCCtGquoc@Zg}Xkr(Bi8{MJPyT5s+I z9WuKd2kRNjr5FT)eCBu7rS@11U)WLkh{*Zh5mig&v#A`Z{q6hD_lj&Sx0-l{`g}Vn zU9rt9nyV&`xGHgFn~j4L0~Z82uCXjh8iBi(l$zw|jC9Gs&|st{#FcF``@W9qz(qP& zpKvazEtMmrcfTWsWSJ6$D0eq;Ti(!EAEN2a z)N@KK(-|~S3N4OyVsj5Ccz+Xe4Eb%hp4OAw!C0k51nF+HIx^&BADgWa=IM3_#^{A|xg{D$LKn<3H~XRrm!w zOXVJOLPQ)fP_2Eu-n-thUo>#F6m9(Si5Oq`6P_EA(RLV+auxzOzWibACh5}@NS}e8 zuN8tQu_|of+=$QlZxX1w%Kk6e0P1cl%I3on5_Z4!*zFd#AzZuyrnF-ds@=`)P8T}k zYXf&#DOT;dfokc@1Cjt)iz}I;K5LytI|L~*Ptq4GMtfv1=i`5Fc&S}Jx|lhX4AemBUi%Zyc92CAH{h(= zPbKoee*VuGH}6cPs{S3yT<-m~6P2*c4J;W}=jj(5Qm|K}vk-#Ud6RpCu%0R~jIZXO^O=$?gt_&RW?pt)U^e`n+J8 zd%Tq79--6oiY)9i#+OKhYLESlwDjkB_0+9h#iRa$QTCvVc;j{-J~hxYTzNWPbP9ET5CF77yr>|%mFr~F|ZMc;XO)jc8nCqB1>X!%;zt_$4G z`MKYZ1W>P|;$RukeD+~qgk9Lk9d|gY{;gIU!O=CJUZ(i%4eK#8SXD)_NfSA?AM{15 z&%uO#mEN6L5ash-;^caZPKhPMS1(CiMxbC2!8$y^`fuc!U0_g6Z9|%n)e2!_sm|(^ zGu@MkH!DbSg(k1Du0&T(b|%C*BrU*k&=j3)0)a*L6XDO|O=)!=ng|>&l{}&|;EB^U zzZcRbVy$qrTsGj&0A#pLD}E}Xb#_{=_G8B%B$`=iHI0b1N(Y+mtP1w{&OIpU-mYq9 zeUQX)HB#`E#QmJn@R%Nh!WXTJw{wwvX5cjPR-hMOx+*P5HUApN(z#-rh3stQAQcDu zkh7)JllEkvLp|VhL6Qz9A|}2fMSe-s9P;aBru^Qz{mwh9cP zCoCoC%Z*PM*EhzfukGhJ{PaxU=AM!F1@GWi+R`#Cjv0?3<8P{mFLXx4VSd!6agCaX zJG2;A?QKEVu54m6mmO#V6^5~CT2ue~iKL<2$PD2C`RRIdj{6?M=MF!oj@!#)(7e}_WBI6^ZT$VaL7dmWfm{dmgP7bjOTW8m{+d4#RLQM z2gxv`M!H=nXoVRiGY9z$ZaVIlGwt~>9H5@B{7~EKSrEtw^+%;MA56)*W!ENzV7RCM zun+ND$8B?38Cd~f7Hf#yoZUdiwQuvP+`=Xtc@M0W@)_wW zPdrB+AAKf)EoB@c%k>Ah2Xduy22N!jxjja+*pRMA8qwF16*($|!Y>u6DYN;OA2qGJ zqUlW?jn=A;o;t@4Z#x&iz6^GJMz1g~OYBU8X$3nhTu;9vhcq#TB9Yn>nFYdM!D`gY zOktme1^GHu|2nTPvv4Tc@cmKh=gn0ytJe@LuLCtW(A>XEb!L7k%jGUhI^P-ttfTzK z%YDILpI`G*4L*`R6Y&fmv?$rk0lHAZIR$cNljQ~frYVuf;Yr6+))Z%Ty$vY;EkpS& z6337+La&Tmiz`HeAd^TuC{=gsWoEL3dYopwLx>QC;S%R)MIS%#Pbm2pe2t0Oj#|j3 zWcxn!#6jgBNfWi*^@_C?Ni=hB!^@a2 z>W^8bT}7f2f2>L-48+42%bigEM~6OV(BdM}X(g9Pzx(_4+9}G8qp8zA>Y>>{C}@A@ z=`NYEm=!+qdWHp+x63Ou%5TO?k z5pUWkhdPm|9x4Uw;O0`_#pGQgTJHuIkAdB6vv+)!AFsdsdbHxCYK4dImn z>gh#-VKI&5T;H`09Kj3QB%WVPS4x!RGhyw)wL;}VD#DhRaY;9Gew8#S zLBGF3p|}QoDV3sirZUv<`sglILH{kKGYcwlf6Qh8Xyc*I z$dXBz#2*8tRfI%V0FiXo7e?BV6cWAL^QLww^^78CFjMx_&scHvyIM0``&8V~-5QF@ zSL!2`IV12|{b@s|wWQt|%hWC6CearEE9q60;td~KtSqUMvWr%GhpXL49V*>hp2j5# zx$_`}KYNC-Az_!S+&Dyl*2-DNN*fxRFZyDzUi~~H;=MyHTo<4UB%X4`WyV1i!mrx# zTEU-u$X0Q?&?}6>^CR?NqSl&*MAB--_pRA1Slx3#-%mT0 z=6dkW4S6onyKp{X_@tu5(qBVh<*-%bJ1uWE(99z!Dp|wbk*Z5nKzGrw-o0*CD^-`$ zuQdun)AavybLofQ`OSnO&OEjT8o0$0XpnuimGKp7xX$=08)GeogvS}tB=6aeMzuN@ zUGU4js@X-};Y!1Z7O_OtkkiYCtI2?#;t-A7Oi{PMP~MGK*C&wwX!mYZGkD|^=UZOd z@boE)5WkH!a=lrg?)&v(Jh?q%pV%JC03pFMT8Lt8$m28!Q$GC4tm;Iil~DCe`|G@) zeP|zQg7PEx9a)@bl`-bJv@WYc1<>)6nnDogk2nQH3M2sOM>&FR6yKbI&M%1rzJ>6)#071udv| z7Nh3ndbp(Asq-_X<&|x79;dd`gBE~1tHO?W9w4gN0^}ePr-l-yD5`n}lSCb2-yLdg zzs?TEIjv-oGd5^nHhM8kPrsDnwfhir zfBNk*<9U(@g`^ z0wc0WE7z=dDi@*q+L{uD&6QC`cy+I}?;h!Pyh*k1e+Z5d<}CvExw3s4YDXZD>`wRM zD+`K?=NKo5MyOXyw!#0oJKdi#;cK-n73^?0qQAhnt{-S)Qm00IB2rPv`Li3S;0fdD zFDdQK<|;9k{q!e0&P@i_u6sm!0tD!DfVgR8dv)D5!-ad>Kx4l90wG!dC#h$(d}xr? z0TaSHk8eZrSt@Q2CcM4xdpWJ^z|45}%_rU*Fhi)NSjj{rKNeBWp3W!Lw=iP947OOz z3V!1gnWgCd{C1*x>xcVfDyK9Gpl4vno?`ff0Z3D50@b?7jnsM8Sr}fdmmVG}^<_YL8p$r++kYzRs5#P4TJDocvKdeN~YB*eOtO#&DdjyeYC3? zcSV=;E}c@4%D;ugc@WMgZ(L`!H+pm-mOka7^E9w%9p8hEqBThM|LH=ka1?t6`}QT6 zOSgmV^gBoU#dl&$@d=)TRXqMD2i$-Rml?#s?OMqCp;ma2+go@>&9_)XKbR8GDaI>D zhN14A2m}t81ZIWfNU$sE9$PNjTI0{U25nNs*Jd+QI-rzfc2A3R9!C$o1^zKc_>T;a z@$-g;8;dv@cCZy7J%Zn!m~=#4!fv>I|BF%x6(cEWDz-o^nmhztJAd4J6=}yk?%r(O zr1FYaLyD~-CyVx@P!ZXD=U5fY@}h`dtaW@dE9tjxZDHSV^Mk>Yu;;BSXyRY`L1R<5 zup>veMR6s5$bUv&j?gJxo|Qz&7--ah*0Dn18l#r&x9`9H=_|6w$J@NuFEk0O=$x2VlXZ^Jrp!^{JU7#ai^JEXIio?B;L&bM2uPS@a~ZSzlHj? z0&}v~EDx?EY#deM%#=_a>LowBYLp@TIs-E9jk>Un(7de3%(S^ka0@~G_V z200FQjq$}ajhQ=Fo|U;gq21bFz5le30A%1)q@3md+HFR4mO}fgw-#)7^X2OR#KoM8 ztZBaK0wFRu1*O+^a7Pa8H6>maVxxz$pN{irp03q9%o{uOI^Rq*fly5QqN3a-j2sWf z^8iEdU!;eT%hN`&@sa&*O=AnFy{RSMxa$l?oP?dJd2U({*ltw!S8EQaS|Jsz24Lxd zpc`)nzfbOP%9W03o-u`@uGR`Sx0}Uz6 zIzJfxqy8*Yt)sw7{MXz1;042c3RXjG40)WOvcgBht??!u9pJy=Yn&i5-3GYR(g0dz zKVK=^}lz1uDWR8Is%`VTRgmzV+3&O4yWK_4|zmqGO3Hr*wqng5re*Qr;~v;H+YuuPWN0ZjA@QA1U~ z?yzcc7noEifgQaazY&B}!lszn(W&h{k?ho$#x*L1UkR?GrA0$*5FXQa%!jei;xU?* z1*T4C*JJNqaA+%J;5;j|8uQX73u3Yw1`Rg9Y?+j5e$HA(y;5HB5uMKgcCUSM5%4+r zPCAWc^b=i4<#v&IF~huIVF9AZa1kUP6=v*}(UqspzLa8?tiE`bBSlg_^keLDh#L-T z$>+GOK@5HRUw7GH6~iDR_XG)8|J%I!>NkCM@JH`Ir}*&qEAjoPhEfp+t5UAmPPziy zvY&pY;Yx;brI3HnA^AwR5*#Umy__k-w?me2Y(4XT+?c2&mrN#Wp*_5IaXNa8MiYsB zllNoDN{FcN%;I7spLGM;zz5miiUGN{k4ADy+#-JY{&yi#)D}sLnBy@hn(}mI{Fw(q&icHG=YS`Wsc`UN^Md_$@6Sv2{SymcLn;TWkw1Z2>z0UG^X>C-5RKg@bHPQS zU;p%{1gHOfg41t(`YUoy;mBZW2HeP*xGng_M~9Xy0yuSZTKM_%e~di&Q!xJ4SPEmk z7%hgWfOlVzG9#nu2h*t+Zsv>a)_>Aja+b*!=<&~D|K=-hE8fgp+bsp^(owG;sr&o=lbJ*B{59s)jMRzyCOYNOni+Qj~pmU)ziP#3DQ(tYnrC_?fWn3 z37*$Lb+Add6jx+OOIFO>W(+q>0k@qyO^~x(U{)~dy_GJx4m?74?F*!lzQkw3Ar}hf z7&rcuK#5y3JrpA%q8uW z{nNj3B=>)vLDj5E>k}?-4uwFa6}7gvD<;i3KRR3yHMX)HK#N;0oInVtL z1+*d|z#ke*va)V^{nT^ixtGh1&v0ea9Zn6rLe}9F#7jO(9E(Jzmmo?Fflo|{l%44{ zf}JQwDQtR{*dT46OFgt!$x6xYwc6lf{b>2kS#nv~E^|d8&WqUFl$hZZXF}0|mCj

aJ?F;ake04EhILwJj+A5^YS_d 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

8l8^8t^ z**dqicx2D{y0H86?z)B6?YJ;AxV$T>D)66=7$BgEBj~%Qf6`OVkhuVHKm} zHZb(b!*z`Q#ERN#XTlv|65w|MERNx_Z$*mjEF2FDK-Z4Z^*AAp@`=Kb9wcK-z|7*G4z)>!e^i3Ob3uQOewW(pJ}$D zj-P*GJRyH&&A=&x=S$+&hjqK%*E+A-ml;Mh6wFyG`9X8Bx!VsvG*DJFkV)qWX^lzt zLOQ_~!{M~n|Kd~_y|seE^E`!At;w{`a`MUTn6Eu-xB3eYH%$QDESa>|Cl`i-b{z3k zC&xk0d4?8BAVJ}nKb>LmXn64@ur&{HFv^(|j~(vHn{vk@Yt4U+ zZ@KD=f-EmUjGQT?F`AJK{idM_>x!#0<8<$E{oc!e%sZdIn~)tk?KT-F5d|~|KJ7 zzdXa_&qLOTEZ{aPE{w@06j9X!ip~uhTIs)4E%megS#||FEwi$(eUGXXP|kdteg%7- zY#uCyevIROew_fT-f~|(H$bb}K1==mHg9lzt<$49 zMbc$W5U2S)d%9S4wUg(4tGh_aHuryZ07O^yqcX1XGLykY)K>Ev{Q~R^4B{o{^Id8q zP20ug@`THl%UnhjX zC2u2D&T5uo*Qz7~I>>)Sjs40|W37t4VZ>E>o-qu498E+6jIeCm6@0GoioE+?SG1W> zi34*Eg>{re{R@)oUW37v2ig8c&(I}mq~LzehrAKIIS&{w(xnCo;{`AGpOjxG zY1WRNOI)>$R635%S98C5`X#khC`3@}k!9pBkcLg`&M_gC_BVF|YEnp8ML*h=-k}p} zYYlSixYB!;~dt#I0S$dHQ{DsTN|X*Z(o!hH^B zbN6^uxe$qCw4Zplf>%|!R!NuTb$?V&_$*FdpBd9BUs11kERAubs34q29%z^+WA>j@ za&+@2#cmum&(d<=^5%#ZPQa+6`dxdDrq$h=9Ry~yb>-kF%T}SAAgy9&gXgW|QC}wH zxDA}C5Tuw^O=fUs395Ws-+9kU=fhPZ1OJeuX3Ue%;oQK21c;nknoLSmn1cYbG~*Xo;G>A(7F1a(a)qz5l`7rRE|)!S1iz7$GTA5OoZZmj#UyO+uM-RI_MFqzmG*h8Uw&1N;QNY7jCth6V|e@Vt6Kt*0U~ zX>%O*p3|bTic<#J6u7c+@t9~cHJ|5AiDQ))(59Q5*y@S*7T!Glsw7J2`hQakhmcfk zMdi(PfTR(WWYh_>IVSCso*(dCn0iQPUh-c?cY&^Sm-gFzkz>U)#}f^OmsxW{RdgDQ zB9Bl1oW$3tWZ>X3*Zp{vIr&4h3rkVfp!m~Uo~GQ|{CgtArS>K;d|cWlC$`c%eY*+t zCE2{KYSsLCH9U;@45cF_$VJ!-i;f4y*I4yH7 z;vrKpEnaFxzFE08Vwu$9aD@xoyhSqR21$Hx7=Uu&nm~I~7%sYY|Hl6cj7F-o#^B&Syp^Xsdj9 <%9nV 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

Ghb8uLWch;By= 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 z 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

lc;GJ+JG#w%-6a$~(|87IXwah)?-_q!=2 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

Q4LN`$n`yR6RNBtgZzJ^0p@0F~MZ|rE9lB!rW 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

`n5=J$E@R_7YFKqe1 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𝔰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�JbJ|F=SFuO{mkfL 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∓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�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

#D`wA#&E7GTU z6~cHev2Kx?a{wJ{@TQ#NX6dcdp$ZM-7McA%WR`Yaz~4@u_qmqJBovwGLMK5vJIC4Y zj7hZo(ZeW)2B+EI{Okay(tm4G_5X+lX%L!5@rF$P3PuRi*w2A^zD^oUWV5qIp-)DU z>1*uCnbZ-IU&N+-85QvjuIF8Qz6OR%75EDQyY}W0RRZwm^yPzFslZ=JIwmB6gKW)F zV4n&SlN&Nr5q<`tFN;owwnv&Jm1(Qt93(C$MT3grFa<^i6Hnlgis7BV<N7pAE6Zu#yO@P2irM=C|Y;BbS++q!2UjK`;_kiQ_a;^4jIEN1MSaw>GcqiJr z3)F9et6cqcEJLHyf;6Kwy`3PI2by1Mjb$0T@ZlK)I9DaPOt6{g*wFw)2~I5D8@>b- z&aGsvu?WZT&+9c1cSV_7lGg^VgU?mZG2hVpOa+Tq;GuyS6#(k}T**O*qZ|bK*Bm#K<FlhByV#6@<%9v$(`&=6x~1lH-eY%;BKMu%Bls8nW| z-Y5gG2v3E{vo)$K&D;UQ44IykTzD=I*p~;~IZk~#t!(rGXNjT69{VwRi`F80ygRZp}C%_J9`S!lf^d6ktMHt2};kFYTU_$Y;>8F?_qBv{}<4)2Zfl(+4 z*KJfGRDZzW$cy<~BOc?zkJ2z6t%9uoGV5S`bfcJ1=y=_ZeH@sKi+udfSl^V(5~P@% zym{~AFxB5sh_*K{-zwt>a>oY%N_l#%5~Z)K6BmB;Sind%Q?T(HEq=|71kAMK2-fQ3~FfdU2+-O zBl8&xVmjM0UXSrgCI#>3vYJN2OhP3g1@;P7*#@sb?i?D?lL@fiQ0iE)qxgMy21S>Z zc1P*|J`oWMHgMw*4B!k~(;or>WzDBafM6~|;G9yl*X@f2fYklLk+uM*? z7-L0RCt_Hee4=g{7g#Eh<6~f$5o(R6L@dY5cJV6>U2Ub+*(*u(>^PlMlGe6G>pf#M zFpcLH%>3{_-=RsgYqi_f{QQv)&agsGOw)qGWf7EnzO%%BbBU8&r)b@VTD=)Crhyaf z%e+y-{c9RV2$YD3!t@?8czz1;0$Ve|tRDCFn&gXg90Nl+|?W!Jom zth(;<8T?YdXV>n0Mjo1l2G&ynd5;Ny9Z2;vbW>Eh$-%O_!>ZkrKxjgf*Y{m`Mm&*M zU#sva6gI$zoEVcs3RzQ593p-|xT5CB36m6Q0#0C;m=!CAR)&yY6%+mJ{(p#7sjHNd zc`NHsv3zS|5+93R4h=w-Bvq$*Xx)xSy;PS_Ggv?Zlb@N33k@ zquh|^T9^=*5TGT)k1SP6#ZiOB34X*b_50oI(6C4t@f}9+r~(N(;X_aCp0hmgey4?z z#RejLl`|Q3_=TAdg)*E#kyEa=^+nX*aLcb_9nWg^JQpBIm&`SpJDO}`XLk_5?(!G< z+?ee#g)z>+$IZ$Ca^fta611B@%u>7wq8!q-yOhv0fnVqxtkTt+no1I%$6}4TB&U?S zIi>!$HbU#+`S~5eYQSSbCMTR@8I8%dtaLVtvJSGf{pdZuumV2_EV8<`^j3&g=rya= zktLeq{qp|rS%8E8oLKJ@!OoaEVSc=?bMou!5m8=~l05|4fUK8aXQ&bjE=Al-3rJtg z;QWT3?=lqmV1kYy{V#K2YL3Xz=v&<8Ucbu3_b{wX=kS!|xM>Z2r1jyc*!?B5EERrG z4vM=n<2W_C1dB6hhc>6|Ww5hmMse#=ptmc}w-mnG)JbY24#0j4oSzXbWTAyBeT za`nSG=>*qyROg$+{-Dv(vvexIg)FlWV}DNQusR;8vzpg$UR`B

&3J_#FyK3b<0n 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


S=0Svwa9-lhtpp%Z>VTc9{aWSVxO;5Q~9KR}uc5 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%0D5>((iQP_j<9n^pMh_J} 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%0AH-rJ-?vv2x?!w>AS*~Wq^FcWX@crF4r@^k#d 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≫t9q#M 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 z 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

oo=IA(KN#ZKe9?V!2INOoLv)P$%w2eIk~ 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�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

d5u#y;~9ENmAkry|2NOHN%YG7ztEPQC|CKg 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�XTqCI-|Xqz%( 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

x8I`9(7GB$Cy{ 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 literal 0 HcmV?d00001 diff --git a/3P/civetweb/resources/civetweb_16x16@2.png b/3P/civetweb/resources/civetweb_16x16@2.png new file mode 100644 index 0000000000000000000000000000000000000000..7621fb10b99e34412fbf8a2a6a472a841777cbe2 GIT binary patch literal 1624 zcmah}du&rx7(b&R4w(Z3K}d`@cR@{Hz4!LC>snW_?QLBn9b*re#0YooJ!@g@Ew^{H zLm;^M2>c;p9N7uP$e00)f+P|H8j*m8#|fxl%m@sS_#m1P6BT4jj^Et__`~3rwD)}X z`+kq_oRhn$zV5lQDRZVEgvw&IY6Cn4`}d#&{?-1?U&CXz6=|^=4Pq5EQ%Aw1(W(ov zjMk<%=vuOK^+~-3AqPq~wOB3jh5m$*acXvtvzW;N8ljp6#hjK{rCUO)-j>b=#2cR- z5ruRzATIU9<#;Zvr_!}+O}%k#T~lK1s)R2oE_g<$Df)pRqg$F#%(Q3o{$fBJ;q}AX zel3Z@NQ<>9AdZ@9iPsBZ!_)S^> zjD-klW|H_D)aaNNWC1Z{SvkKX6$%As0Xq$|O;UV5pCr2^m#Y#wD)XILODk4p^A+O^ zs-91n>711|vVzU1wHh5(Km@0wBV=;%_#NVGer%&)%cP=~lN6^cWis|$Bi(tcLBDI` zKfCiyojF}<(DO!znSk>k72{yoyZZ~-jo`+w8i|gKp0#3XK!i8WWIE~hL_?mi;tR^2 zXjD-mxY`wVMcq-i+Z|QaP<3z|8_VV`Et}BCvFW>5-+i(Eu&Ha7VKx~?dq9kNu(vtf z9E?Y?y^&+SbThq1Pex56BaG~XKYfo{wa*ufs2-0TRHHswsq!cxpS#NI4JlrXRoN?! zVUqVu_rDkk#3lRK?m5QsS8zA%<(*3j$(?JhXW=fJaA{K~AKQaa$;SGHO%V>kMuRds z8ibP3zz|U8oN`V$hc&V@MmZy#Va||Up^Q_?Dd7}zitI+hIH8;nPB16P#$m=W<(P0F z#0Y3OVjNM92uGMBNPw6D5g?%zYLGBS7{iPqTaYqF38R=%WQ#+EP(}zNm=R=qfksRj zCJbYS5m*BpLzE%H5M~I(z$`Fz$=)8R*(lhASOW6`Rl@Sa2BmG zHP}?Vu&y!qcDFpWV$F;fZ#{o@ed#Y7l0$#@geL4{?sKudmB|5f_w^0!x7SZCygD$g z``QDjZer=Q%M&L(Ik}|d;s@JKuH#ovOwV54=(T=Wq?I1?Zv61uEj?e(43=%3UjD?U zT|1sV{O2jOt8YcumQC+0o%z~<CriZC5w9Y%>Ux%ALp-C&x=f|Jy6s4sdD(ukD6Py&HcQfv@Clm z?&uy&io>Z-_Bqz|2EV&_{fZVj(KWocVdX66@}~~P-g;x1`{(67wKvXcha8(H97=87 z)8~A>dHCqGGoGRC6@!r%R<`auajE>D;l-gFw-u}TV0f-P>%HF}`Hj6l^ypW&Lxae@ zzxSs}{bk24oa#P5d&w)OKVEY6Ql@LknbPAsGO6oBeW`)oA7@QI${QWECT`yzPPBy| e&)hr$U;e`v%R9cg^6*3Uw>}oBQ}=~dbo~qYg_;ro literal 0 HcmV?d00001 diff --git a/3P/civetweb/resources/civetweb_22x22.png b/3P/civetweb/resources/civetweb_22x22.png new file mode 100644 index 0000000000000000000000000000000000000000..f0b9094eb3b7cfe8728e47fb09852342cf7429dd GIT binary patch literal 1857 zcmc&#X;4#F7>#4KZgfhuwm7wYhQhS9WM@fAut1=q1SlY2#i1d2gb2wCFE1uUP(;KL z7u2G%1p$G91`rWY3=kr+L)b!yKv7XtR76C?DuuovV1JbU?VWjdn{&?hefOTZ@2H2{ zPe!XYtioV0MlM?!p6IyV@U2*i_Tzg}SE7Rn;^c>TK|zRw1%nuS4ipFiE_@aj^aNR) z@UTYE7K2%e<$3!deoR*y8{*?w1`JNh7ouzo#&(NT$YO_p2oMNzc>+3iRH?!OJPsY} zYsn-qg^pk_Z>tOjy<~3QY*`4K%E4~218k)ZqGN**L`cKqB@zivLdHQb7f+;8sdxejPa;{M2n$iT0AWcj1R~RU z1qLW$!#p9vg9Ly(aRD? z1ble{4kQuH;+agEi$H|11Z>cSLC2yBI3ABfBTyJb2eLJlU{A6l5}n9Yl8uccl}dId z+Bn!Sh?IFQ17eH$pa7ZYa^7?87v&nPz!##C86eEt3v!%ch!4z`Oyez{i}j*T0RG->-Y| zVyyg1;p;zNC!9H6q{va06%7sOZ&Z|BDa@^_t$94yUsHLtt+7U{X=tgdZf$9bJ96-j zzUyLIVn*t@s`8Sw#50GZBa_a?7Z(-y?ezLX*WRzyG~HBnHrEahKdQV|yoblpwKwHl zl*^M6%CD6))>KYTPVU(8bK&n<2lwwC9K1W&*RAW;3I)7-{kq!&{a1?%4n#_Cb+*LD z9JpFqoS&O{;#e#k78)HTi$8uuRi#wqq)YY+QxbnW6CbxfQZmrf(Wli+Pfz!DwchR3 z>e?E6wVIbN$45qpNQdv~3d;6C+QbWM!pm>eX>^hqE%%(o)Yi z*Q)e-U2@8KxjZ>G_FyoV#SRRJiIO#_m3DS?4-fa^B1P$C#XwJIdb&J2BQ-bc!u0fC zmo6zrM@M(>_8Yo?|Ixz-;Zl)IhD6Fl5i&$mf8*J+5q(d0%K6i+^=hTETvb&eMxgxM ztUI^5ZtFW|W*b?@-Gn|*QHZCT*Snqnt;g6b+s;LOA$MWedrNy6?K^k%{(2efU06w zfiK^nK`-5wN23!b>Rf5 zIFD@ZWBQ%Cfx6{Rmaon=DM2hYG5*5%6Q2vJO2;ohHr;UQbllVr8vpFJeGzqidh_j9 zQk3TQiTBLk`g=_|FO}LIpl$5JX|>@I8Eq$TClig!60fcx#Aayn;Uz~RBPM{4*U-7*hAe`cdUKkpG-=@Z+8b6kZ^pCYLgMSx8Lec6 z*!s{)wFy~fcKuL@v2T1q5u7=Z@VWn{&6Kj7=obNRfND%m{Yf?K_pQ6(r{?11#wc|7 GHTrL1UURJg literal 0 HcmV?d00001 diff --git a/3P/civetweb/resources/civetweb_22x22@2.png b/3P/civetweb/resources/civetweb_22x22@2.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb3614c85b20143a8786d21c23d0241dc3e6976 GIT binary patch literal 2728 zcmc&$c{r47A0D6KOX^hTsI=*AQYx9vGMP*zGqxJZ5)o$1yv#70nOBC0B-u(TL?|ti zvL#EhWE=ZF)**F>ltRr>ImH>B>U@8EegA&Xb-nNN{GRK+@85d8*BfqWVX}1b+Ql#! zY^j+k(Mq=OTzD4A%ih}^GPGse8i-^MS##YWA1WV&8Pd6~AYjI(x`S3AmG0|R4;sK= z@(8AlJ!DTlh^KMcNa_LxDP;3xY#7X7uaHNjd4dq&3c52n1jOXyas7$M0^4(DweSLit8jHeWwPXk_fiDN53bi zpn%3_@*pOc11u;~UAf*60U?X@?-ba)AF>?5w=&5Jh7wYFC=3$4kkWS`nf$+@Z1xYd z0I~xAiTA$>3v7IOAj%39aJ~67S>xO`FSz32jrbrH;__{{T-Nt0S~9p0SHR%%03&N% zBnGf!a_C$i!B;$)j5p&5AS#Cjnh^;InF5l@q~kIBjSNXdJsjE)tB1jmwDt9HBz>H* z9-5@9t)pv*`_3hDY2Iv*1AXVx|KaZXDR*HM*gTnMBFJYR2kFLqE*tooGM@SKSag4? z_l-;cc`SNA<)UQ4pcWeYAC3NgC7YgwUCIxweMt!2wC^#i$3F=_V#b2M61vgv-@sMX4zX_wU}4h+D+s zj+vR6p0am9Evf_tXj|+10b22JR3Z4|_ z*HxCJr6x^JPo>{Xi3kn4cPI7t{;uTYgvQ4D&!0a#IoY3!IPgat>Q31onjq27-E&gOxx*53BU=l$aT z&X(bU?%wt$adTZ)YkhZXLt9(RUE*YZw#%m#0BZ| zwu#XG<#Qw0)LfF-Nr;kue1^K&IhR@fEO)v-Fz{;H2Dw9wkI`4=bcoSQ|2PyanXuuF zj~)`bHLgq>vX~(c!J8`|V6V)` r@G{y@90zHrA)qf(?BEGC$rqPnDKRY(nd*GJu z)y_K;PT8t1G@7Xfx3zPx$=Hb)ziSGmpZM91HILfugsIzA&HeoR8LZhEiL2X5*7H)U zsP06is_GMd%cK2a<5r`NZ+EEW8mr&-w|#3qN=a4!1Z^D#)Ea#fUo_tpITIVUs%&=| zK&|e`prKp^>!ec32=V&$Lxo9M_Ue*m5h0WKbfZEr&ROu7Y;?M-*CmmGG2IsT+r5qq z>+8px4I(WGIWa143l(u^Lc%-@jBlSdMGP3Po~u&1gE?H~ooIH%O;L{&xL7xYR4CYd zP%daWrFT`Nmkx*<0Hex>Nv+#YFQ@Y!I@iLe>Ti>PMY*Al11;h^LsN`XAtZZ}DlOI| z%s($OehMCQ&zmuC8?C06@Gpexb>UgvkYDP7{Rv~LL4Yx9NB-`y#Hl;TZhr-a%K?=uupH`_##yp!h` z@bOYST+VqfWwQGCtFv1;M(k}5!r&r}xu%+itzVSq9nBs94$^l?!f>e|&b|q>B!%Q_ zTQ!D9u~H_p1y2LhJm0&@AY8c!4R z8gcEac>IWOjuF#+Ow~CoXk5kVqIl#@sw5uIUA1#h@}t~~Iw2dHj&|&eYoy3$Bh(dR zHMghu$EUX#Oj0(fP^sgmlWxT=wv@gv3;(4`)l$;~T^q}}g?ZufdXJP)f$Pd%+Gndb z{dBYo8!C6AU(@={f%EMOnMYpFc)cS(jmy7+gP+V_ch{$_xiD8e)aq4|hHYe`WaDOzC+ z_`(Z^V7cx0t8yYwis-SD4{7}@)r;xym}BimHWlmc5AT;dy}PGLIgNeNsT5gsLKBg5 zwjKs|ztOv@@@QbPL^Yt|{l)d9=$9Bre&7y9R>0#ROJmGqdCAbVp(DzFx{&d%ey0wj z>@weUcbth(Qu1~(-|^?*fM{xS+J;rFHf8p;%M<_=vE-e@7R09zyz~k?x8!+q-}IZ` z%KD^RvfuHghOSHNCc9N`zrtD`FV{TY6?+~CdsRRF(IrR@wngGIm+TY~wD9j}MzSDg I?WY9)1%68z82|tP literal 0 HcmV?d00001 diff --git a/3P/civetweb/resources/civetweb_32x32.png b/3P/civetweb/resources/civetweb_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..62471e3c276b212935dee855465dace8ddccfbd0 GIT binary patch literal 2193 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%0D_j=&a=?@b$G}Ia! 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 Sv1IQz*93VHQEK3P`+orUI&-)H literal 0 HcmV?d00001 diff --git a/3P/civetweb/resources/civetweb_64x64.png b/3P/civetweb/resources/civetweb_64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..bc8b995b8ccfcee8bc55158d342b965c83245bc4 GIT binary patch literal 3923 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 U(q*A|_czzr-~ysV-}%-*0iZv00RR91 literal 0 HcmV?d00001 diff --git a/3P/civetweb/resources/civetweb_64x64@2.png b/3P/civetweb/resources/civetweb_64x64@2.png new file mode 100644 index 0000000000000000000000000000000000000000..d6ad7b429283945213bd0b7d1bf2c59d934f42fc GIT binary patch literal 10178 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 literal 0 HcmV?d00001 diff --git a/3P/civetweb/resources/cleanup.lua b/3P/civetweb/resources/cleanup.lua new file mode 100644 index 00000000..ab9557db --- /dev/null +++ b/3P/civetweb/resources/cleanup.lua @@ -0,0 +1,92 @@ +-- Lua script used to clean up tabs and spaces in C, CPP and H files. +-- Copyright (c) 2014, bel +-- MIT License (http://opensource.org/licenses/mit-license.php) +-- +-- It can be used from the command line: +-- Call Lua5.1 or Lua5.2 + this script file + the C/CPP/H file to clean +-- +-- It can be used in Visual Studio as an external tool: +-- command: Lua5.1.exe or Lua5.2.exe +-- argument: "X:\civetweb\resources\cleanup.lua" $(ItemPath) +-- + +clean = arg[1] +print("Cleaning " .. clean) + +lines = io.lines(clean) +if not lines then + print("Can not open file " .. clean) + return +end + +function trimright(s) + return s:match "^(.-)%s*$" +end + +local lineend = false +local tabspace = false +local changed = false +local invalid = false +local newfile = {} + +lineno = 0 +incmt = false + +for l in lines do + lineno = lineno + 1 + local lt = trimright(l) + if (lt ~= l) then + lineend = true + changed = true + end + local mcmt = l:find("%/%*"); + if mcmt then + if incmt then + print("line " .. lineno .. " nested comment") + end + if not (l:sub(mcmt):find("%*%/")) then + -- multiline comment begins here + incmt = true + end + elseif incmt then + if not l:find("^%s*%*") then + print("line " .. lineno .. " multiline comment without leading *") + end + if l:find("%*%/") then + incmt = false + end + else + local cmt = l:find("//") + if (cmt) and (l:sub(cmt-5, cmt+1) ~= "http://") and (l:sub(cmt-6, cmt+1) ~= "https://") then + print("line " .. lineno .. " has C++ comment //") + end + end + local lts = lt:gsub('\t', ' ') + if (lts ~= lt) then + tabspace = true + changed = true + end + for i=1,#lts do + local b = string.byte(lts,i) + if b<32 or b>=127 then + print("Letter " .. string.byte(l,i) .. " (" .. b .. ") found in line " .. lts) + invalid = true + end + end + + newfile[#newfile + 1] = lts +end + +print("Line endings trimmed: " .. tostring(lineend)) +print("Tabs converted to spaces: " .. tostring(tabspace)) +print("Invalid characters: " .. tostring(invalid)) + +if changed then + local f = io.open(clean, "wb") + for i=1,#newfile do + f:write(newfile[i]) + f:write("\n") + end + f:close() + print("File cleaned") +end diff --git a/3P/civetweb/resources/coverity_check.sh b/3P/civetweb/resources/coverity_check.sh new file mode 100644 index 00000000..6f99d6a0 --- /dev/null +++ b/3P/civetweb/resources/coverity_check.sh @@ -0,0 +1,30 @@ +#! /bin/sh + +ls src/civetweb.c +if [ "$?" = "0" ]; then + echo "Building files for coverity check ..." +else + echo "Run this script from the root directory of project!" 1>&2 + echo "username@hostname:/somewhere/civetweb$ resources/coverity_check.sh" 1>&2 + exit 1 +fi + +rm -rf cov_int/ +make clean + +../cov-analysis-linux64-7.6.0/bin/cov-build --dir cov-int make WITH_IPV6=1 WITH_WEBSOCKET=1 WITH_LUA_SHARED=1 + +rm coverity_check.tgz +tar czvf coverity_check.tgz cov-int + +ls coverity_check.tgz + +if [ "$?" = "0" ]; then + echo "... done" +else + echo "No coverity_check.tgz file" 1>&2 + exit 1 +fi + +exit 0 + diff --git a/3P/civetweb/resources/itworks.html b/3P/civetweb/resources/itworks.html new file mode 100644 index 00000000..cba3bad0 --- /dev/null +++ b/3P/civetweb/resources/itworks.html @@ -0,0 +1,23 @@ + + +Civetweb: It Works! + + +

+
+
+ + diff --git a/3P/civetweb/resources/jni/Android.mk b/3P/civetweb/resources/jni/Android.mk new file mode 100644 index 00000000..f24981a6 --- /dev/null +++ b/3P/civetweb/resources/jni/Android.mk @@ -0,0 +1,6 @@ +LOCAL_PATH := $(call my-dir)/../.. +include $(CLEAR_VARS) +LOCAL_CFLAGS := -std=c99 -O2 -W -Wall -pthread -pipe $(COPT) +LOCAL_MODULE := civetweb +LOCAL_SRC_FILES := src\main.c src\civetweb.c +include $(BUILD_EXECUTABLE) diff --git a/3P/civetweb/resources/lua-logo.jpg b/3P/civetweb/resources/lua-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67de66686cc0fad97a1f266132d324f21baa9fe6 GIT binary patch literal 2799 zcmb7GdpOf=AOFoZ+mJJnbnHYRfRgoiQ>u_)5$K+ZOrP-Nw_P|hJr zIY)&p)JBC0sT}6a-np*#daw82_w&83`}$tr&*8qm|K0pi{wF~4ge}e%0D(XNR!{){ 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 IBbYz-Z(OJY&Hw-a literal 0 HcmV?d00001 diff --git a/3P/civetweb/resources/luafilesystem-logo.jpg b/3P/civetweb/resources/luafilesystem-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a2e855b5f5aa9e81eb70cd68f05968b851c6f0b GIT binary patch literal 8209 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 literal 0 HcmV?d00001 diff --git a/3P/civetweb/resources/luasqlite-logo.jpg b/3P/civetweb/resources/luasqlite-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9388126f40e33690f49de112c139fde88c1d0235 GIT binary patch literal 6534 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 R7|eJ99?w+ZuqT@~_FrJO-{1fM literal 0 HcmV?d00001 diff --git a/3P/civetweb/resources/luaxml-logo.jpg b/3P/civetweb/resources/luaxml-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9916f6ed8c83474957cccf36dce83dc34d3c19ee GIT binary patch literal 6741 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" + LOG_DOWNLOAD ${THIRD_PARTY_LOGGING} + LOG_UPDATE ${THIRD_PARTY_LOGGING} + LOG_CONFIGURE ${THIRD_PARTY_LOGGING} + LOG_BUILD ${THIRD_PARTY_LOGGING} + LOG_TEST ${THIRD_PARTY_LOGGING} + LOG_INSTALL ${THIRD_PARTY_LOGGING}) + ExternalProject_Get_Property(lua INSTALL_DIR) + set(LUA_INSTALL_DIR ${INSTALL_DIR}) + unset(INSTALL_DIR) + link_directories("${LUA_INSTALL_DIR}/lib") + include_directories("${LUA_INSTALL_DIR}/include") + set(LUA_LIBRARIES "${LUA_INSTALL_DIR}/lib/liblua.a") + add_dependencies(c-library lua) + else() + find_package(Lua) + endif() + + # Lua Filesystem Support + string(REPLACE "." "_" LUA_FILESYSTEM_VERSION_UNDERSCORE ${CIVETWEB_LUA_FILESYSTEM_VERSION}) + ExternalProject_Add(luafilesystem + URL "https://github.com/keplerproject/luafilesystem/archive/v_${LUA_FILESYSTEM_VERSION_UNDERSCORE}.tar.gz" + URL_MD5 ${CIVETWEB_LUA_FILESYSTEM_MD5_HASH} + PREFIX "${CIVETWEB_THIRD_PARTY_DIR}" + PATCH_COMMAND ${CMAKE_COMMAND} -E copy + "${CMAKE_SOURCE_DIR}/cmake/luafilesystem/CMakeLists.txt" /CMakeLists.txt + CMAKE_ARGS + "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}" + "-DCMAKE_INSTALL_PREFIX=" + LOG_DOWNLOAD ${THIRD_PARTY_LOGGING} + LOG_UPDATE ${THIRD_PARTY_LOGGING} + LOG_CONFIGURE ${THIRD_PARTY_LOGGING} + LOG_BUILD ${THIRD_PARTY_LOGGING} + LOG_TEST ${THIRD_PARTY_LOGGING} + LOG_INSTALL ${THIRD_PARTY_LOGGING}) + ExternalProject_Get_Property(luafilesystem INSTALL_DIR) + set(LUA_FILESYSTEM_INSTALL_DIR ${INSTALL_DIR}) + unset(INSTALL_DIR) + link_directories("${LUA_FILESYSTEM_INSTALL_DIR}/lib") + include_directories("${LUA_FILESYSTEM_INSTALL_DIR}/include") + set(LUA_LIBRARIES "${LUA_LIBRARIES};${LUA_FILESYSTEM_INSTALL_DIR}/lib/libluafilesystem.a") + add_dependencies(c-library luafilesystem) + + # Lua SQLite Support + if (${CIVETWEB_LUA_SQLITE_VERSION} VERSION_EQUAL "0.9.3") + set(LUA_SQLITE_FILENAME lsqlite3_fsl09w.zip) + elseif (${CIVETWEB_LUA_SQLITE_VERSION} VERSION_EQUAL "0.9.2") + set(LUA_SQLITE_FILENAME lsqlite3_fsl09v.zip) + elseif (${CIVETWEB_LUA_SQLITE_VERSION} VERSION_EQUAL "0.9.1") + set(LUA_SQLITE_FILENAME lsqlite3_fsl09t.zip) + else() + message(FATAL_ERROR "The Lua SQLite archive filename is unknown for version ${CIVETWEB_LUA_SQLITE_VERSION}") + endif() + ExternalProject_Add(luasqlite + URL "http://lua.sqlite.org/index.cgi/zip/${LUA_SQLITE_FILENAME}" + URL_MD5 ${CIVETWEB_LUA_SQLITE_MD5_HASH} + PREFIX "${CIVETWEB_THIRD_PARTY_DIR}" + PATCH_COMMAND ${CMAKE_COMMAND} -E copy + "${CMAKE_SOURCE_DIR}/cmake/luasqlite/CMakeLists.txt" /CMakeLists.txt + CMAKE_ARGS + "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}" + "-DCMAKE_INSTALL_PREFIX=" + LOG_DOWNLOAD ${THIRD_PARTY_LOGGING} + LOG_UPDATE ${THIRD_PARTY_LOGGING} + LOG_CONFIGURE ${THIRD_PARTY_LOGGING} + LOG_BUILD ${THIRD_PARTY_LOGGING} + LOG_TEST ${THIRD_PARTY_LOGGING} + LOG_INSTALL ${THIRD_PARTY_LOGGING}) + ExternalProject_Get_Property(luasqlite INSTALL_DIR) + set(LUA_SQLITE_INSTALL_DIR ${INSTALL_DIR}) + unset(INSTALL_DIR) + link_directories("${LUA_SQLITE_INSTALL_DIR}/lib") + set(LUA_LIBRARIES "${LUA_LIBRARIES};${LUA_SQLITE_INSTALL_DIR}/lib/libluasqlite.a") + add_dependencies(c-library luasqlite) + + # Lua XML Support + if (${CIVETWEB_LUA_XML_VERSION} VERSION_EQUAL "1.8.0") + set(LUA_XML_FILENAME LuaXML_130610.zip) + elseif (${CIVETWEB_LUA_XML_VERSION} VERSION_EQUAL "1.7.4") + set(LUA_XML_FILENAME LuaXML_101012.zip) + else() + message(FATAL_ERROR "The Lua XML archive filename is unknown for version ${CIVETWEB_LUA_XML_VERSION}") + endif() + ExternalProject_Add(luaxml + URL "http://viremo.eludi.net/LuaXML/${LUA_XML_FILENAME}" + URL_MD5 ${CIVETWEB_LUA_XML_MD5_HASH} + PREFIX "${CIVETWEB_THIRD_PARTY_DIR}" + PATCH_COMMAND ${CMAKE_COMMAND} -E copy + "${CMAKE_SOURCE_DIR}/cmake/luaxml/CMakeLists.txt" /CMakeLists.txt + CMAKE_ARGS + "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}" + "-DCMAKE_INSTALL_PREFIX=" + LOG_DOWNLOAD ${THIRD_PARTY_LOGGING} + LOG_UPDATE ${THIRD_PARTY_LOGGING} + LOG_CONFIGURE ${THIRD_PARTY_LOGGING} + LOG_BUILD ${THIRD_PARTY_LOGGING} + LOG_TEST ${THIRD_PARTY_LOGGING} + LOG_INSTALL ${THIRD_PARTY_LOGGING}) + ExternalProject_Get_Property(luaxml INSTALL_DIR) + set(LUA_XML_INSTALL_DIR ${INSTALL_DIR}) + unset(INSTALL_DIR) + link_directories("${LUA_XML_INSTALL_DIR}/lib") + set(LUA_LIBRARIES "${LUA_LIBRARIES};${LUA_XML_INSTALL_DIR}/lib/libluaxml.a") + add_dependencies(c-library luaxml) + + # SQLite Support + string (REGEX MATCHALL "[0-9]+" SQLITE_VERSION_MATCHES ${CIVETWEB_SQLITE_VERSION}) + list(GET SQLITE_VERSION_MATCHES 0 SQLITE_VERSION_MAJOR) + list(GET SQLITE_VERSION_MATCHES 1 SQLITE_VERSION_MINOR) + list(GET SQLITE_VERSION_MATCHES 2 SQLITE_VERSION_PATCH) + set(SQLITE_FILE_VERSION ${SQLITE_VERSION_MAJOR}0${SQLITE_VERSION_MINOR}0${SQLITE_VERSION_PATCH}00) + ExternalProject_Add(sqlite + URL "http://www.sqlite.org/2015/sqlite-amalgamation-${SQLITE_FILE_VERSION}.zip" + URL_MD5 ${CIVETWEB_SQLITE_MD5_HASH} + PREFIX "${CIVETWEB_THIRD_PARTY_DIR}" + PATCH_COMMAND ${CMAKE_COMMAND} -E copy + "${CMAKE_SOURCE_DIR}/cmake/sqlite/CMakeLists.txt" /CMakeLists.txt + CMAKE_ARGS + "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}" + "-DCMAKE_INSTALL_PREFIX=" + LOG_DOWNLOAD ${THIRD_PARTY_LOGGING} + LOG_UPDATE ${THIRD_PARTY_LOGGING} + LOG_CONFIGURE ${THIRD_PARTY_LOGGING} + LOG_BUILD ${THIRD_PARTY_LOGGING} + LOG_TEST ${THIRD_PARTY_LOGGING} + LOG_INSTALL ${THIRD_PARTY_LOGGING}) + ExternalProject_Get_Property(sqlite INSTALL_DIR) + set(SQLITE_INSTALL_DIR ${INSTALL_DIR}) + unset(INSTALL_DIR) + link_directories("${SQLITE_INSTALL_DIR}/lib") + include_directories("${SQLITE_INSTALL_DIR}/include") + set(LUA_LIBRARIES "${LUA_LIBRARIES};${SQLITE_INSTALL_DIR}/lib/libsqlite.a") + add_dependencies(c-library sqlite) + + # Link all the Lua libraries + target_link_libraries(c-library ${LUA_LIBRARIES}) +endif() + +# The web server executable +add_executable(c-executable main.c) +set_target_properties(c-executable PROPERTIES + OUTPUT_NAME "civetweb" +) +install( + TARGETS c-executable + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + COMPONENT server) +if (BUILD_SHARED_LIBS) + target_compile_definitions(c-executable PRIVATE CIVETWEB_DLL_IMPORTS) +endif() +target_include_directories( + c-executable PUBLIC + ${PROJECT_SOURCE_DIR}/include) +target_link_libraries(c-executable c-library) +if (LIBRT_FOUND) + target_link_libraries(c-executable LIBRT::LIBRT) +endif() + +if (CIVETWEB_ENABLE_LUA) + add_library(lua-library third_party/lfs.c third_party/lsqlite3.c third_party/LuaXML_lib.c third_party/sqlite3.c) + set_target_properties(lua-library PROPERTIES + OUTPUT_NAME "lua-library" + VERSION ${CIVETWEB_VERSION} + SOVERSION ${CIVETWEB_VERSION} + ) + target_include_directories( + lua-library PUBLIC + ${PROJECT_SOURCE_DIR}/src/third_party/lua-5.2.4) + install( + TARGETS lua-library + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + COMPONENT lua-library) +endif() + +# The C++ API library +if (CIVETWEB_ENABLE_CXX) + add_library(cxx-library CivetServer.cpp) + set_target_properties(cxx-library PROPERTIES + OUTPUT_NAME "cxx-library" + VERSION ${CIVETWEB_VERSION} + SOVERSION ${CIVETWEB_VERSION} + ) + if (BUILD_SHARED_LIBS) + target_compile_definitions(cxx-library PRIVATE CIVETWEB_DLL_EXPORTS) + endif() + target_include_directories( + cxx-library PUBLIC + ${PROJECT_SOURCE_DIR}/include) + install( + TARGETS cxx-library + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin + COMPONENT cxx-library) + install(FILES + ${PROJECT_SOURCE_DIR}/include/CivetServer.h + DESTINATION include + COMPONENT cxx-library) +endif() diff --git a/3P/civetweb/src/CivetServer.cpp b/3P/civetweb/src/CivetServer.cpp new file mode 100644 index 00000000..7b04ac35 --- /dev/null +++ b/3P/civetweb/src/CivetServer.cpp @@ -0,0 +1,507 @@ +/* Copyright (c) 2013-2014 the Civetweb developers + * Copyright (c) 2013 No Face Press, LLC + * + * License http://opensource.org/licenses/mit-license.php MIT License + */ + +#include "CivetServer.h" + +#include +#include +#include +#include + +#ifndef UNUSED_PARAMETER +#define UNUSED_PARAMETER(x) (void)(x) +#endif + +bool +CivetHandler::handleGet(CivetServer *server, struct mg_connection *conn) +{ + UNUSED_PARAMETER(server); + UNUSED_PARAMETER(conn); + return false; +} + +bool +CivetHandler::handlePost(CivetServer *server, struct mg_connection *conn) +{ + UNUSED_PARAMETER(server); + UNUSED_PARAMETER(conn); + return false; +} + +bool +CivetHandler::handlePut(CivetServer *server, struct mg_connection *conn) +{ + UNUSED_PARAMETER(server); + UNUSED_PARAMETER(conn); + return false; +} + +bool +CivetHandler::handleDelete(CivetServer *server, struct mg_connection *conn) +{ + UNUSED_PARAMETER(server); + UNUSED_PARAMETER(conn); + return false; +} + +bool +CivetHandler::handleOptions(CivetServer *server, struct mg_connection *conn) +{ + UNUSED_PARAMETER(server); + UNUSED_PARAMETER(conn); + return false; +} + +bool +CivetWebSocketHandler::handleConnection(CivetServer *server, + const struct mg_connection *conn) +{ + UNUSED_PARAMETER(server); + UNUSED_PARAMETER(conn); + return true; +} + +void +CivetWebSocketHandler::handleReadyState(CivetServer *server, + struct mg_connection *conn) +{ + UNUSED_PARAMETER(server); + UNUSED_PARAMETER(conn); + return; +} + +bool +CivetWebSocketHandler::handleData(CivetServer *server, + struct mg_connection *conn, + int bits, + char *data, + size_t data_len) +{ + UNUSED_PARAMETER(server); + UNUSED_PARAMETER(conn); + UNUSED_PARAMETER(bits); + UNUSED_PARAMETER(data); + UNUSED_PARAMETER(data_len); + return true; +} + +void +CivetWebSocketHandler::handleClose(CivetServer *server, + const struct mg_connection *conn) +{ + UNUSED_PARAMETER(server); + UNUSED_PARAMETER(conn); + return; +} + +int +CivetServer::requestHandler(struct mg_connection *conn, void *cbdata) +{ + const struct mg_request_info *request_info = mg_get_request_info(conn); + assert(request_info != NULL); + CivetServer *me = (CivetServer *)(request_info->user_data); + assert(me != NULL); + + // Happens when a request hits the server before the context is saved + if (me->context == NULL) + return 0; + + mg_lock_context(me->context); + me->connections[conn] = CivetConnection(); + mg_unlock_context(me->context); + + CivetHandler *handler = (CivetHandler *)cbdata; + + if (handler) { + if (strcmp(request_info->request_method, "GET") == 0) { + return handler->handleGet(me, conn) ? 1 : 0; + } else if (strcmp(request_info->request_method, "POST") == 0) { + return handler->handlePost(me, conn) ? 1 : 0; + } else if (strcmp(request_info->request_method, "PUT") == 0) { + return handler->handlePut(me, conn) ? 1 : 0; + } else if (strcmp(request_info->request_method, "DELETE") == 0) { + return handler->handleDelete(me, conn) ? 1 : 0; + } else if (strcmp(request_info->request_method, "OPTIONS") == 0) { + return handler->handleOptions(me, conn) ? 1 : 0; + } + } + + return 0; // No handler found +} + +int +CivetServer::webSocketConnectionHandler(const struct mg_connection *conn, + void *cbdata) +{ + const struct mg_request_info *request_info = mg_get_request_info(conn); + assert(request_info != NULL); + CivetServer *me = (CivetServer *)(request_info->user_data); + assert(me != NULL); + + // Happens when a request hits the server before the context is saved + if (me->context == NULL) + return 0; + + CivetWebSocketHandler *handler = (CivetWebSocketHandler *)cbdata; + + if (handler) { + return handler->handleConnection(me, conn) ? 0 : 1; + } + + return 1; // No handler found, close connection +} + +void +CivetServer::webSocketReadyHandler(struct mg_connection *conn, void *cbdata) +{ + const struct mg_request_info *request_info = mg_get_request_info(conn); + assert(request_info != NULL); + CivetServer *me = (CivetServer *)(request_info->user_data); + assert(me != NULL); + + // Happens when a request hits the server before the context is saved + if (me->context == NULL) + return; + + CivetWebSocketHandler *handler = (CivetWebSocketHandler *)cbdata; + + if (handler) { + handler->handleReadyState(me, conn); + } +} + +int +CivetServer::webSocketDataHandler(struct mg_connection *conn, + int bits, + char *data, + size_t data_len, + void *cbdata) +{ + const struct mg_request_info *request_info = mg_get_request_info(conn); + assert(request_info != NULL); + CivetServer *me = (CivetServer *)(request_info->user_data); + assert(me != NULL); + + // Happens when a request hits the server before the context is saved + if (me->context == NULL) + return 0; + + CivetWebSocketHandler *handler = (CivetWebSocketHandler *)cbdata; + + if (handler) { + return handler->handleData(me, conn, bits, data, data_len) ? 1 : 0; + } + + return 1; // No handler found +} + +void +CivetServer::webSocketCloseHandler(const struct mg_connection *conn, + void *cbdata) +{ + const struct mg_request_info *request_info = mg_get_request_info(conn); + assert(request_info != NULL); + CivetServer *me = (CivetServer *)(request_info->user_data); + assert(me != NULL); + + // Happens when a request hits the server before the context is saved + if (me->context == NULL) + return; + + CivetWebSocketHandler *handler = (CivetWebSocketHandler *)cbdata; + + if (handler) { + handler->handleClose(me, conn); + } +} + +CivetServer::CivetServer(const char **options, + const struct mg_callbacks *_callbacks) + : context(0) +{ + struct mg_callbacks callbacks; + memset(&callbacks, 0, sizeof(callbacks)); + + if (_callbacks) { + callbacks = *_callbacks; + userCloseHandler = _callbacks->connection_close; + } else { + userCloseHandler = NULL; + } + callbacks.connection_close = closeHandler; + context = mg_start(&callbacks, this, options); + if (context == NULL) + throw CivetException("null context when constructing CivetServer. " + "Possible problem binding to port."); +} + +CivetServer::~CivetServer() +{ + close(); +} + +void +CivetServer::closeHandler(const struct mg_connection *conn) +{ + const struct mg_request_info *request_info = mg_get_request_info(conn); + assert(request_info != NULL); + CivetServer *me = (CivetServer *)(request_info->user_data); + assert(me != NULL); + + // Happens when a request hits the server before the context is saved + if (me->context == NULL) + return; + + if (me->userCloseHandler) + me->userCloseHandler(conn); + mg_lock_context(me->context); + me->connections.erase(const_cast(conn)); + mg_unlock_context(me->context); +} + +void +CivetServer::addHandler(const std::string &uri, CivetHandler *handler) +{ + mg_set_request_handler(context, uri.c_str(), requestHandler, handler); +} + +void +CivetServer::addWebSocketHandler(const std::string &uri, + CivetWebSocketHandler *handler) +{ + mg_set_websocket_handler(context, + uri.c_str(), + webSocketConnectionHandler, + webSocketReadyHandler, + webSocketDataHandler, + webSocketCloseHandler, + handler); +} + +void +CivetServer::removeHandler(const std::string &uri) +{ + mg_set_request_handler(context, uri.c_str(), NULL, NULL); +} + +void +CivetServer::removeWebSocketHandler(const std::string &uri) +{ + mg_set_websocket_handler( + context, uri.c_str(), NULL, NULL, NULL, NULL, NULL); +} + +void +CivetServer::close() +{ + if (context) { + mg_stop(context); + context = 0; + } +} + +int +CivetServer::getCookie(struct mg_connection *conn, + const std::string &cookieName, + std::string &cookieValue) +{ + // Maximum cookie length as per microsoft is 4096. + // http://msdn.microsoft.com/en-us/library/ms178194.aspx + char _cookieValue[4096]; + const char *cookie = mg_get_header(conn, "Cookie"); + int lRead = mg_get_cookie(cookie, + cookieName.c_str(), + _cookieValue, + sizeof(_cookieValue)); + cookieValue.clear(); + cookieValue.append(_cookieValue); + return lRead; +} + +const char * +CivetServer::getHeader(struct mg_connection *conn, + const std::string &headerName) +{ + return mg_get_header(conn, headerName.c_str()); +} + +void +CivetServer::urlDecode(const char *src, + std::string &dst, + bool is_form_url_encoded) +{ + urlDecode(src, strlen(src), dst, is_form_url_encoded); +} + +void +CivetServer::urlDecode(const char *src, + size_t src_len, + std::string &dst, + bool is_form_url_encoded) +{ + int i, j, a, b; +#define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W') + + dst.clear(); + for (i = j = 0; i < (int)src_len; i++, j++) { + if (i < (int)src_len - 2 && src[i] == '%' + && isxdigit(*(const unsigned char *)(src + i + 1)) + && isxdigit(*(const unsigned char *)(src + i + 2))) { + a = tolower(*(const unsigned char *)(src + i + 1)); + b = tolower(*(const unsigned char *)(src + i + 2)); + dst.push_back((char)((HEXTOI(a) << 4) | HEXTOI(b))); + i += 2; + } else if (is_form_url_encoded && src[i] == '+') { + dst.push_back(' '); + } else { + dst.push_back(src[i]); + } + } +} + +bool +CivetServer::getParam(struct mg_connection *conn, + const char *name, + std::string &dst, + size_t occurrence) +{ + const char *formParams = NULL; + const struct mg_request_info *ri = mg_get_request_info(conn); + assert(ri != NULL); + CivetServer *me = (CivetServer *)(ri->user_data); + assert(me != NULL); + mg_lock_context(me->context); + CivetConnection &conobj = me->connections[conn]; + mg_lock_connection(conn); + mg_unlock_context(me->context); + + if (conobj.postData != NULL) { + formParams = conobj.postData; + } else { + const char *con_len_str = mg_get_header(conn, "Content-Length"); + if (con_len_str) { + unsigned long con_len = atoi(con_len_str); + if (con_len > 0) { + // Add one extra character: in case the post-data is a text, it + // is required as 0-termination. + // Do not increment con_len, since the 0 terminating is not part + // of the content (text or binary). + conobj.postData = (char *)malloc(con_len + 1); + if (conobj.postData != NULL) { + // malloc may fail for huge requests + mg_read(conn, conobj.postData, con_len); + conobj.postData[con_len] = 0; + formParams = conobj.postData; + conobj.postDataLen = con_len; + } + } + } + } + if (formParams == NULL) { + // get requests do store html
field values in the http + // query_string + formParams = ri->query_string; + } + mg_unlock_connection(conn); + + if (formParams != NULL) { + return getParam(formParams, strlen(formParams), name, dst, occurrence); + } + + return false; +} + +bool +CivetServer::getParam(const char *data, + size_t data_len, + const char *name, + std::string &dst, + size_t occurrence) +{ + const char *p, *e, *s; + size_t name_len; + + dst.clear(); + if (data == NULL || name == NULL || data_len == 0) { + return false; + } + name_len = strlen(name); + e = data + data_len; + + // data is "var1=val1&var2=val2...". Find variable first + for (p = data; p + name_len < e; p++) { + if ((p == data || p[-1] == '&') && p[name_len] == '=' + && !mg_strncasecmp(name, p, name_len) && 0 == occurrence--) { + + // Point p to variable value + p += name_len + 1; + + // Point s to the end of the value + s = (const char *)memchr(p, '&', (size_t)(e - p)); + if (s == NULL) { + s = e; + } + assert(s >= p); + + // Decode variable into destination buffer + urlDecode(p, (int)(s - p), dst, true); + return true; + } + } + return false; +} + +void +CivetServer::urlEncode(const char *src, std::string &dst, bool append) +{ + urlEncode(src, strlen(src), dst, append); +} + +void +CivetServer::urlEncode(const char *src, + size_t src_len, + std::string &dst, + bool append) +{ + static const char *dont_escape = "._-$,;~()"; + static const char *hex = "0123456789abcdef"; + + if (!append) + dst.clear(); + + for (; src_len > 0; src++, src_len--) { + if (isalnum(*(const unsigned char *)src) + || strchr(dont_escape, *(const unsigned char *)src) != NULL) { + dst.push_back(*src); + } else { + dst.push_back('%'); + dst.push_back(hex[(*(const unsigned char *)src) >> 4]); + dst.push_back(hex[(*(const unsigned char *)src) & 0xf]); + } + } +} + +std::vector +CivetServer::getListeningPorts() +{ + std::vector ports(10); + std::vector ssl(10); + size_t size = mg_get_ports(context, ports.size(), &ports[0], &ssl[0]); + ports.resize(size); + ssl.resize(size); + return ports; +} + +CivetServer::CivetConnection::CivetConnection() +{ + postData = NULL; + postDataLen = 0; +} + +CivetServer::CivetConnection::~CivetConnection() +{ + free(postData); +} diff --git a/3P/civetweb/src/civetweb.c b/3P/civetweb/src/civetweb.c new file mode 100755 index 00000000..509cd686 --- /dev/null +++ b/3P/civetweb/src/civetweb.c @@ -0,0 +1,12064 @@ +/* Copyright (c) 2013-2015 the Civetweb developers + * Copyright (c) 2004-2013 Sergey Lyubka + * + * 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. + */ + +#if defined(_WIN32) +#if !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS /* Disable deprecation warning in VS2005 */ +#endif +#ifndef _WIN32_WINNT /* defined for tdm-gcc so we can use getnameinfo */ +#define _WIN32_WINNT 0x0501 +#endif +#else +#if defined(__GNUC__) && !defined(_GNU_SOURCE) +#define _GNU_SOURCE /* for setgroups() */ +#endif +#ifdef __linux__ +#define _XOPEN_SOURCE 600 /* For flockfile() on Linux */ +#endif +#ifndef _LARGEFILE_SOURCE +#define _LARGEFILE_SOURCE /* For fseeko(), ftello() */ +#endif +#ifndef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 64 /* Use 64-bit file offsets by default */ +#endif +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS /* wants this for C++ */ +#endif +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS /* C++ wants that for INT64_MAX */ +#endif +#ifdef __sun +#define __EXTENSIONS__ /* to expose flockfile and friends in stdio.h */ +#define __inline inline /* not recognized on older compiler versions */ +#endif +#endif + +#if defined(USE_LUA) && defined(USE_WEBSOCKET) +#define USE_TIMERS +#endif + +#if defined(_MSC_VER) +/* 'type cast' : conversion from 'int' to 'HANDLE' of greater size */ +#pragma warning(disable : 4306) +/* conditional expression is constant: introduced by FD_SET(..) */ +#pragma warning(disable : 4127) +/* non-constant aggregate initializer: issued due to missing C99 support */ +#pragma warning(disable : 4204) +/* padding added after data member */ +#pragma warning(disable : 4820) +/* not defined as a preprocessor macro, replacing with '0' for '#if/#elif' */ +#pragma warning(disable : 4668) +/* no function prototype given: converting '()' to '(void)' */ +#pragma warning(disable : 4255) +/* function has been selected for automatic inline expansion */ +#pragma warning(disable : 4711) +#endif + +/* This code uses static_assert to check some conditions. + * Unfortunately some compilers still do not support it, so we have a + * replacement function here. */ +#if defined(_MSC_VER) && (_MSC_VER >= 1600) +#define mg_static_assert static_assert +#elif defined(__cplusplus) && (__cplusplus >= 201103L) +#define mg_static_assert static_assert +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +#define mg_static_assert _Static_assert +#else +char static_assert_replacement[1]; +#define mg_static_assert(cond, txt) \ + extern char static_assert_replacement[(cond) ? 1 : -1] +#endif + +mg_static_assert(sizeof(int) == 4 || sizeof(int) == 8, + "int data type size check"); +mg_static_assert(sizeof(void *) == 4 || sizeof(void *) == 8, + "pointer data type size check"); +mg_static_assert(sizeof(void *) >= sizeof(int), "data type size check"); +/* mg_static_assert(sizeof(size_t) == 4 || sizeof(size_t) == 8, "size_t data + * type size check"); */ + +/* DTL -- including winsock2.h works better if lean and mean */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#if defined(__SYMBIAN32__) +#define NO_SSL /* SSL is not supported */ +#define NO_CGI /* CGI is not supported */ +#define PATH_MAX FILENAME_MAX +#endif /* __SYMBIAN32__ */ + +#ifndef IGNORE_UNUSED_RESULT +#define IGNORE_UNUSED_RESULT(a) ((void)((a) && 1)) +#endif + +#ifndef _WIN32_WCE /* Some ANSI #includes are not available on Windows CE */ +#include +#include +#include +#include +#include +#endif /* !_WIN32_WCE */ + +#ifdef __MACH__ + +#define CLOCK_MONOTONIC (1) +#define CLOCK_REALTIME (2) + +#include +#include +#include +#include +#include + + +/* clock_gettime is not implemented on OSX */ +int clock_gettime(int clk_id, struct timespec *t); + +int +clock_gettime(int clk_id, struct timespec *t) +{ + memset(t, 0, sizeof(*t)); + if (clk_id == CLOCK_REALTIME) { + struct timeval now; + int rv = gettimeofday(&now, NULL); + if (rv) { + return rv; + } + t->tv_sec = now.tv_sec; + t->tv_nsec = now.tv_usec * 1000; + return 0; + + } else if (clk_id == CLOCK_MONOTONIC) { + static uint64_t start_time = 0; + static mach_timebase_info_data_t timebase_ifo = {0, 0}; + + uint64_t now = mach_absolute_time(); + + if (start_time == 0) { + kern_return_t mach_status = mach_timebase_info(&timebase_ifo); +#if defined(DEBUG) + assert(mach_status == KERN_SUCCESS); +#else + /* appease "unused variable" warning for release builds */ + (void)mach_status; +#endif + start_time = now; + } + + now = (uint64_t)((double)(now - start_time) * (double)timebase_ifo.numer + / (double)timebase_ifo.denom); + + t->tv_sec = now / 1000000000; + t->tv_nsec = now % 1000000000; + return 0; + } + return -1; /* EINVAL - Clock ID is unknown */ +} +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef MAX_WORKER_THREADS +#define MAX_WORKER_THREADS (1024 * 64) +#endif +#ifndef SOCKET_TIMEOUT_QUANTUM +#define SOCKET_TIMEOUT_QUANTUM (10000) +#endif + +mg_static_assert(MAX_WORKER_THREADS >= 1, + "worker threads must be a positive number"); + +#if defined(_WIN32) \ + && !defined(__SYMBIAN32__) /* WINDOWS / UNIX include block */ +#include +#include /* DTL add for SO_EXCLUSIVE */ +#include + +typedef const char *SOCK_OPT_TYPE; + +#if !defined(PATH_MAX) +#define PATH_MAX (MAX_PATH) +#endif + +#if !defined(PATH_MAX) +#define PATH_MAX (4096) +#endif + +mg_static_assert(PATH_MAX >= 1, "path length must be a positive number"); + +#ifndef _IN_PORT_T +#ifndef in_port_t +#define in_port_t u_short +#endif +#endif + +#ifndef _WIN32_WCE +#include +#include +#include +#else /* _WIN32_WCE */ +#define NO_CGI /* WinCE has no pipes */ + +typedef long off_t; + +#define errno ((int)(GetLastError())) +#define strerror(x) (_ultoa(x, (char *)_alloca(sizeof(x) * 3), 10)) +#endif /* _WIN32_WCE */ + +#define MAKEUQUAD(lo, hi) \ + ((uint64_t)(((uint32_t)(lo)) | ((uint64_t)((uint32_t)(hi))) << 32)) +#define RATE_DIFF (10000000) /* 100 nsecs */ +#define EPOCH_DIFF (MAKEUQUAD(0xd53e8000, 0x019db1de)) +#define SYS2UNIX_TIME(lo, hi) \ + ((time_t)((MAKEUQUAD((lo), (hi)) - EPOCH_DIFF) / RATE_DIFF)) + +/* Visual Studio 6 does not know __func__ or __FUNCTION__ + * The rest of MS compilers use __FUNCTION__, not C99 __func__ + * Also use _strtoui64 on modern M$ compilers */ +#if defined(_MSC_VER) +#if (_MSC_VER < 1300) +#define STRX(x) #x +#define STR(x) STRX(x) +#define __func__ __FILE__ ":" STR(__LINE__) +#define strtoull(x, y, z) ((unsigned __int64)_atoi64(x)) +#define strtoll(x, y, z) (_atoi64(x)) +#else +#define __func__ __FUNCTION__ +#define strtoull(x, y, z) (_strtoui64(x, y, z)) +#define strtoll(x, y, z) (_strtoi64(x, y, z)) +#endif +#endif /* _MSC_VER */ + +#define ERRNO ((int)(GetLastError())) +#define NO_SOCKLEN_T +#define SSL_LIB "ssleay32.dll" +#define CRYPTO_LIB "libeay32.dll" +#define O_NONBLOCK (0) +#ifndef W_OK +#define W_OK (2) /* http://msdn.microsoft.com/en-us/library/1w06ktdy.aspx */ +#endif +#if !defined(EWOULDBLOCK) +#define EWOULDBLOCK WSAEWOULDBLOCK +#endif /* !EWOULDBLOCK */ +#define _POSIX_ +#define INT64_FMT "I64d" + +#define WINCDECL __cdecl +#define SHUT_RD (0) +#define SHUT_WR (1) +#define SHUT_BOTH (2) +#define vsnprintf_impl _vsnprintf +#define access _access +#define mg_sleep(x) (Sleep(x)) + +#define pipe(x) _pipe(x, MG_BUF_LEN, _O_BINARY) +#ifndef popen +#define popen(x, y) (_popen(x, y)) +#endif +#ifndef pclose +#define pclose(x) (_pclose(x)) +#endif +#define close(x) (_close(x)) +#define dlsym(x, y) (GetProcAddress((HINSTANCE)(x), (y))) +#define RTLD_LAZY (0) +#define fseeko(x, y, z) (_lseeki64(_fileno(x), (y), (z)) == -1 ? -1 : 0) +#define fdopen(x, y) (_fdopen((x), (y))) +#define write(x, y, z) (_write((x), (y), (unsigned)z)) +#define read(x, y, z) (_read((x), (y), (unsigned)z)) +#define flockfile(x) (EnterCriticalSection(&global_log_file_lock)) +#define funlockfile(x) (LeaveCriticalSection(&global_log_file_lock)) +#define sleep(x) (Sleep((x)*1000)) +#define rmdir(x) (_rmdir(x)) + +#if !defined(fileno) +#define fileno(x) (_fileno(x)) +#endif /* !fileno MINGW #defines fileno */ + +typedef HANDLE pthread_mutex_t; +typedef DWORD pthread_key_t; +typedef HANDLE pthread_t; +typedef struct { + CRITICAL_SECTION threadIdSec; + int waitingthreadcount; /* The number of threads queued. */ + pthread_t *waitingthreadhdls; /* The thread handles. */ +} pthread_cond_t; + +#ifndef __clockid_t_defined +typedef DWORD clockid_t; +#endif +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC (1) +#endif +#ifndef CLOCK_REALTIME +#define CLOCK_REALTIME (2) +#endif + +#if defined(_MSC_VER) && (_MSC_VER >= 1900) +#define _TIMESPEC_DEFINED +#endif +#ifndef _TIMESPEC_DEFINED +struct timespec { + time_t tv_sec; /* seconds */ + long tv_nsec; /* nanoseconds */ +}; +#endif + +#define pid_t HANDLE /* MINGW typedefs pid_t to int. Using #define here. */ + +static int pthread_mutex_lock(pthread_mutex_t *); +static int pthread_mutex_unlock(pthread_mutex_t *); +static void to_unicode(const char *path, wchar_t *wbuf, size_t wbuf_len); +struct file; +static char *mg_fgets(char *buf, size_t size, struct file *filep, char **p); + +#if defined(HAVE_STDINT) +#include +#else +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned __int64 uint64_t; +typedef __int64 int64_t; +#define INT64_MAX (9223372036854775807) +#endif /* HAVE_STDINT */ + +/* POSIX dirent interface */ +struct dirent { + char d_name[PATH_MAX]; +}; + +typedef struct DIR { + HANDLE handle; + WIN32_FIND_DATAW info; + struct dirent result; +} DIR; + +#if defined(_WIN32) && !defined(POLLIN) +#ifndef HAVE_POLL +struct pollfd { + SOCKET fd; + short events; + short revents; +}; +#define POLLIN (0x0300) +#endif +#endif + +/* Mark required libraries */ +#if defined(_MSC_VER) +#pragma comment(lib, "Ws2_32.lib") +#endif + +#else /* defined(_WIN32) && !defined(__SYMBIAN32__) - WINDOWS / UNIX include \ + block */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +typedef const void *SOCK_OPT_TYPE; + +#if defined(ANDROID) +typedef unsigned short int in_port_t; +#endif + +#include +#include +#include +#include +#define vsnprintf_impl vsnprintf + +#if !defined(NO_SSL_DL) && !defined(NO_SSL) +#include +#endif +#include +#if defined(__MACH__) +#define SSL_LIB "libssl.dylib" +#define CRYPTO_LIB "libcrypto.dylib" +#else +#if !defined(SSL_LIB) +#define SSL_LIB "libssl.so" +#endif +#if !defined(CRYPTO_LIB) +#define CRYPTO_LIB "libcrypto.so" +#endif +#endif +#ifndef O_BINARY +#define O_BINARY (0) +#endif /* O_BINARY */ +#define closesocket(a) (close(a)) +#define mg_mkdir(x, y) (mkdir(x, y)) +#define mg_remove(x) (remove(x)) +#define mg_sleep(x) (usleep((x)*1000)) +#define ERRNO (errno) +#define INVALID_SOCKET (-1) +#define INT64_FMT PRId64 +typedef int SOCKET; +#define WINCDECL + +#if defined(__hpux) +/* HPUX 11 does not have monotonic, fall back to realtime */ +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC CLOCK_REALTIME +#endif + +/* HPUX defines socklen_t incorrectly as size_t which is 64bit on + * Itanium. Without defining _XOPEN_SOURCE or _XOPEN_SOURCE_EXTENDED + * the prototypes use int* rather than socklen_t* which matches the + * actual library expectation. When called with the wrong size arg + * accept() returns a zero client inet addr and check_acl() always + * fails. Since socklen_t is widely used below, just force replace + * their typedef with int. - DTL + */ +#define socklen_t int +#endif /* hpux */ + +#endif /* defined(_WIN32) && !defined(__SYMBIAN32__) - WINDOWS / UNIX include \ + block */ + +/* va_copy should always be a macro, C99 and C++11 - DTL */ +#ifndef va_copy +#define va_copy(x, y) ((x) = (y)) +#endif + +#ifdef _WIN32 +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + +static CRITICAL_SECTION global_log_file_lock; +static DWORD +pthread_self(void) +{ + return GetCurrentThreadId(); +} + +static int +pthread_key_create( + pthread_key_t *key, + void (*_ignored)(void *) /* destructor not supported for Windows */ + ) +{ + (void)_ignored; + + if ((key != 0)) { + *key = TlsAlloc(); + return (*key != TLS_OUT_OF_INDEXES) ? 0 : -1; + } + return -2; +} + +static int +pthread_key_delete(pthread_key_t key) +{ + return TlsFree(key) ? 0 : 1; +} + +static int +pthread_setspecific(pthread_key_t key, void *value) +{ + return TlsSetValue(key, value) ? 0 : 1; +} + +static void * +pthread_getspecific(pthread_key_t key) +{ + return TlsGetValue(key); +} + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + +static struct pthread_mutex_undefined_struct *pthread_mutex_attr = NULL; +#else +static pthread_mutexattr_t pthread_mutex_attr; +#endif /* _WIN32 */ + +#include "civetweb.h" + +#define PASSWORDS_FILE_NAME ".htpasswd" +#define CGI_ENVIRONMENT_SIZE (4096) +#define MAX_CGI_ENVIR_VARS (256) +#define MG_BUF_LEN (8192) + +#ifndef MAX_REQUEST_SIZE +#define MAX_REQUEST_SIZE (16384) +#endif + +mg_static_assert(MAX_REQUEST_SIZE >= 256, + "request size length must be a positive number"); + +#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) + +#if !defined(DEBUG_TRACE) +#if defined(DEBUG) + +static void DEBUG_TRACE_FUNC(const char *func, + unsigned line, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(3, 4); + +static void +DEBUG_TRACE_FUNC(const char *func, unsigned line, const char *fmt, ...) +{ + va_list args; + flockfile(stdout); + printf("*** %lu.%p.%s.%u: ", + (unsigned long)time(NULL), + (void *)pthread_self(), + func, + line); + va_start(args, fmt); + vprintf(fmt, args); + va_end(args); + putchar('\n'); + fflush(stdout); + funlockfile(stdout); +} + +#define DEBUG_TRACE(fmt, ...) \ + DEBUG_TRACE_FUNC(__func__, __LINE__, fmt, __VA_ARGS__) + +#else +#define DEBUG_TRACE(fmt, ...) \ + do { \ + } while (0) +#endif /* DEBUG */ +#endif /* DEBUG_TRACE */ + +#if defined(MEMORY_DEBUGGING) +unsigned long mg_memory_debug_blockCount = 0; +unsigned long mg_memory_debug_totalMemUsed = 0; + +static void * +mg_malloc_ex(size_t size, const char *file, unsigned line) +{ + void *data = malloc(size + sizeof(size_t)); + void *memory = 0; + char mallocStr[256]; + + if (data) { + *(size_t *)data = size; + mg_memory_debug_totalMemUsed += size; + mg_memory_debug_blockCount++; + memory = (void *)(((char *)data) + sizeof(size_t)); + } + + sprintf(mallocStr, + "MEM: %p %5lu alloc %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)size, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + + return memory; +} + +static void * +mg_calloc_ex(size_t count, size_t size, const char *file, unsigned line) +{ + void *data = mg_malloc_ex(size * count, file, line); + if (data) { + memset(data, 0, size); + } + return data; +} + +static void +mg_free_ex(void *memory, const char *file, unsigned line) +{ + char mallocStr[256]; + void *data = (void *)(((char *)memory) - sizeof(size_t)); + size_t size; + + if (memory) { + size = *(size_t *)data; + mg_memory_debug_totalMemUsed -= size; + mg_memory_debug_blockCount--; + sprintf(mallocStr, + "MEM: %p %5lu free %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)size, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + + free(data); + } +} + +static void * +mg_realloc_ex(void *memory, size_t newsize, const char *file, unsigned line) +{ + char mallocStr[256]; + void *data; + void *_realloc; + size_t oldsize; + + if (newsize) { + if (memory) { + data = (void *)(((char *)memory) - sizeof(size_t)); + oldsize = *(size_t *)data; + _realloc = realloc(data, newsize + sizeof(size_t)); + if (_realloc) { + data = _realloc; + mg_memory_debug_totalMemUsed -= oldsize; + sprintf(mallocStr, + "MEM: %p %5lu r-free %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)oldsize, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + mg_memory_debug_totalMemUsed += newsize; + sprintf(mallocStr, + "MEM: %p %5lu r-alloc %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)newsize, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + *(size_t *)data = newsize; + data = (void *)(((char *)data) + sizeof(size_t)); + } else { +#if defined(_WIN32) + OutputDebugStringA("MEM: realloc failed\n"); +#else + DEBUG_TRACE("%s", "MEM: realloc failed\n"); +#endif + return _realloc; + } + } else { + data = mg_malloc_ex(newsize, file, line); + } + } else { + data = 0; + mg_free_ex(memory, file, line); + } + + return data; +} + +#define mg_malloc(a) mg_malloc_ex(a, __FILE__, __LINE__) +#define mg_calloc(a, b) mg_calloc_ex(a, b, __FILE__, __LINE__) +#define mg_realloc(a, b) mg_realloc_ex(a, b, __FILE__, __LINE__) +#define mg_free(a) mg_free_ex(a, __FILE__, __LINE__) + +#else + +static __inline void * +mg_malloc(size_t a) +{ + return malloc(a); +} +static __inline void * +mg_calloc(size_t a, size_t b) +{ + return calloc(a, b); +} +static __inline void * +mg_realloc(void *a, size_t b) +{ + return realloc(a, b); +} +static __inline void +mg_free(void *a) +{ + free(a); +} + +#endif + +static void mg_vsnprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + const char *fmt, + va_list ap); + +static void mg_snprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(5, 6); + +/* This following lines are just meant as a reminder to use the mg-functions + * for memory management */ +#ifdef malloc +#undef malloc +#endif +#ifdef calloc +#undef calloc +#endif +#ifdef realloc +#undef realloc +#endif +#ifdef free +#undef free +#endif +#ifdef snprintf +#undef snprintf +#endif +#ifdef vsnprintf +#undef vsnprintf +#endif +#define malloc DO_NOT_USE_THIS_FUNCTION__USE_mg_malloc +#define calloc DO_NOT_USE_THIS_FUNCTION__USE_mg_calloc +#define realloc DO_NOT_USE_THIS_FUNCTION__USE_mg_realloc +#define free DO_NOT_USE_THIS_FUNCTION__USE_mg_free +#define snprintf DO_NOT_USE_THIS_FUNCTION__USE_mg_snprintf +#ifdef _WIN32 /* vsnprintf must not be used in any system, * \ + * but this define only works well for Windows. */ +#define vsnprintf DO_NOT_USE_THIS_FUNCTION__USE_mg_vsnprintf +#endif + +#define MD5_STATIC static +#include "md5.inl" + +/* Darwin prior to 7.0 and Win32 do not have socklen_t */ +#ifdef NO_SOCKLEN_T +typedef int socklen_t; +#endif /* NO_SOCKLEN_T */ +#define _DARWIN_UNLIMITED_SELECT + +#define IP_ADDR_STR_LEN (50) /* IPv6 hex string is 46 chars */ + +#if !defined(MSG_NOSIGNAL) +#define MSG_NOSIGNAL (0) +#endif + +#if !defined(SOMAXCONN) +#define SOMAXCONN (100) +#endif + +/* Size of the accepted socket queue */ +#if !defined(MGSQLEN) +#define MGSQLEN (20) +#endif + +#if defined(NO_SSL_DL) +#include +#include +#include +#include +#include +#else +/* SSL loaded dynamically from DLL. + * I put the prototypes here to be independent from OpenSSL source + * installation. */ + +typedef struct ssl_st SSL; +typedef struct ssl_method_st SSL_METHOD; +typedef struct ssl_ctx_st SSL_CTX; +typedef struct x509_store_ctx_st X509_STORE_CTX; + +#define SSL_VERIFY_NONE (0) +#define SSL_VERIFY_PEER (1) +#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT (2) +#define SSL_VERIFY_CLIENT_ONCE (4) + +struct ssl_func { + const char *name; /* SSL function name */ + void (*ptr)(void); /* Function pointer */ +}; + +#define SSL_free (*(void (*)(SSL *))ssl_sw[0].ptr) +#define SSL_accept (*(int (*)(SSL *))ssl_sw[1].ptr) +#define SSL_connect (*(int (*)(SSL *))ssl_sw[2].ptr) +#define SSL_read (*(int (*)(SSL *, void *, int))ssl_sw[3].ptr) +#define SSL_write (*(int (*)(SSL *, const void *, int))ssl_sw[4].ptr) +#define SSL_get_error (*(int (*)(SSL *, int))ssl_sw[5].ptr) +#define SSL_set_fd (*(int (*)(SSL *, SOCKET))ssl_sw[6].ptr) +#define SSL_new (*(SSL * (*)(SSL_CTX *))ssl_sw[7].ptr) +#define SSL_CTX_new (*(SSL_CTX * (*)(SSL_METHOD *))ssl_sw[8].ptr) +#define SSLv23_server_method (*(SSL_METHOD * (*)(void))ssl_sw[9].ptr) +#define SSL_library_init (*(int (*)(void))ssl_sw[10].ptr) +#define SSL_CTX_use_PrivateKey_file \ + (*(int (*)(SSL_CTX *, const char *, int))ssl_sw[11].ptr) +#define SSL_CTX_use_certificate_file \ + (*(int (*)(SSL_CTX *, const char *, int))ssl_sw[12].ptr) +#define SSL_CTX_set_default_passwd_cb \ + (*(void (*)(SSL_CTX *, mg_callback_t))ssl_sw[13].ptr) +#define SSL_CTX_free (*(void (*)(SSL_CTX *))ssl_sw[14].ptr) +#define SSL_load_error_strings (*(void (*)(void))ssl_sw[15].ptr) +#define SSL_CTX_use_certificate_chain_file \ + (*(int (*)(SSL_CTX *, const char *))ssl_sw[16].ptr) +#define SSLv23_client_method (*(SSL_METHOD * (*)(void))ssl_sw[17].ptr) +#define SSL_pending (*(int (*)(SSL *))ssl_sw[18].ptr) +#define SSL_CTX_set_verify \ + (*(void (*)(SSL_CTX *, \ + int, \ + int (*verify_callback)(int, X509_STORE_CTX *)))ssl_sw[19].ptr) +#define SSL_shutdown (*(int (*)(SSL *))ssl_sw[20].ptr) +#define SSL_CTX_load_verify_locations \ + (*(int (*)(SSL_CTX *, const char *, const char *))ssl_sw[21].ptr) +#define SSL_CTX_set_default_verify_paths (*(int (*)(SSL_CTX *))ssl_sw[22].ptr) +#define SSL_CTX_set_verify_depth (*(void (*)(SSL_CTX *, int))ssl_sw[23].ptr) +#define SSL_get_peer_certificate (*(X509 * (*)(SSL *))ssl_sw[24].ptr) +#define SSL_get_version (*(const char *(*)(SSL *))ssl_sw[25].ptr) +#define SSL_get_current_cipher (*(SSL_CIPHER * (*)(SSL *))ssl_sw[26].ptr) +#define SSL_CIPHER_get_name \ + (*(const char *(*)(const SSL_CIPHER *))ssl_sw[27].ptr) +#define SSL_CTX_check_private_key (*(int (*)(SSL_CTX *))ssl_sw[28].ptr) +#define SSL_CTX_set_session_id_context \ + (*(int (*)(SSL_CTX *, const unsigned char *, unsigned int))ssl_sw[29].ptr) + +#define CRYPTO_num_locks (*(int (*)(void))crypto_sw[0].ptr) +#define CRYPTO_set_locking_callback \ + (*(void (*)(void (*)(int, int, const char *, int)))crypto_sw[1].ptr) +#define CRYPTO_set_id_callback \ + (*(void (*)(unsigned long (*)(void)))crypto_sw[2].ptr) +#define ERR_get_error (*(unsigned long (*)(void))crypto_sw[3].ptr) +#define ERR_error_string (*(char *(*)(unsigned long, char *))crypto_sw[4].ptr) + +/* set_ssl_option() function updates this array. + * It loads SSL library dynamically and changes NULLs to the actual addresses + * of respective functions. The macros above (like SSL_connect()) are really + * just calling these functions indirectly via the pointer. */ +static struct ssl_func ssl_sw[] = {{"SSL_free", NULL}, + {"SSL_accept", NULL}, + {"SSL_connect", NULL}, + {"SSL_read", NULL}, + {"SSL_write", NULL}, + {"SSL_get_error", NULL}, + {"SSL_set_fd", NULL}, + {"SSL_new", NULL}, + {"SSL_CTX_new", NULL}, + {"SSLv23_server_method", NULL}, + {"SSL_library_init", NULL}, + {"SSL_CTX_use_PrivateKey_file", NULL}, + {"SSL_CTX_use_certificate_file", NULL}, + {"SSL_CTX_set_default_passwd_cb", NULL}, + {"SSL_CTX_free", NULL}, + {"SSL_load_error_strings", NULL}, + {"SSL_CTX_use_certificate_chain_file", NULL}, + {"SSLv23_client_method", NULL}, + {"SSL_pending", NULL}, + {"SSL_CTX_set_verify", NULL}, + {"SSL_shutdown", NULL}, + {"SSL_CTX_load_verify_locations", NULL}, + {"SSL_CTX_set_default_verify_paths", NULL}, + {"SSL_CTX_set_verify_depth", NULL}, + {"SSL_get_peer_certificate", NULL}, + {"SSL_get_version", NULL}, + {"SSL_get_current_cipher", NULL}, + {"SSL_CIPHER_get_name", NULL}, + {"SSL_CTX_check_private_key", NULL}, + {"SSL_CTX_set_session_id_context", NULL}, + {NULL, NULL}}; + +/* Similar array as ssl_sw. These functions could be located in different + * lib. */ +#if !defined(NO_SSL) +static struct ssl_func crypto_sw[] = {{"CRYPTO_num_locks", NULL}, + {"CRYPTO_set_locking_callback", NULL}, + {"CRYPTO_set_id_callback", NULL}, + {"ERR_get_error", NULL}, + {"ERR_error_string", NULL}, + {NULL, NULL}}; +#endif /* NO_SSL */ +#endif /* NO_SSL_DL */ + +static const char *month_names[] = {"Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec"}; + +/* Unified socket address. For IPv6 support, add IPv6 address structure in the + * union u. */ +union usa { + struct sockaddr sa; + struct sockaddr_in sin; +#if defined(USE_IPV6) + struct sockaddr_in6 sin6; +#endif +}; + +/* Describes a string (chunk of memory). */ +struct vec { + const char *ptr; + size_t len; +}; + +struct file { + uint64_t size; + time_t last_modified; + FILE *fp; + const char *membuf; /* Non-NULL if file data is in memory */ + int is_directory; + int gzipped; /* set to 1 if the content is gzipped + * in which case we need a content-encoding: gzip header */ +}; + +#define STRUCT_FILE_INITIALIZER \ + { \ + (uint64_t)0, (time_t)0, (FILE *)NULL, (const char *)NULL, 0, 0 \ + } + +/* Describes listening socket, or socket which was accept()-ed by the master + * thread and queued for future handling by the worker thread. */ +struct socket { + SOCKET sock; /* Listening socket */ + union usa lsa; /* Local socket address */ + union usa rsa; /* Remote socket address */ + unsigned char is_ssl; /* Is port SSL-ed */ + unsigned char ssl_redir; /* Is port supposed to redirect everything to SSL + * port */ +}; + +/* NOTE(lsm): this enum shoulds be in sync with the config_options below. */ +enum { + CGI_EXTENSIONS, + CGI_ENVIRONMENT, + PUT_DELETE_PASSWORDS_FILE, + CGI_INTERPRETER, + PROTECT_URI, + AUTHENTICATION_DOMAIN, + SSI_EXTENSIONS, + THROTTLE, + ACCESS_LOG_FILE, + ENABLE_DIRECTORY_LISTING, + ERROR_LOG_FILE, + GLOBAL_PASSWORDS_FILE, + INDEX_FILES, + ENABLE_KEEP_ALIVE, + ACCESS_CONTROL_LIST, + EXTRA_MIME_TYPES, + LISTENING_PORTS, + DOCUMENT_ROOT, + SSL_CERTIFICATE, + NUM_THREADS, + RUN_AS_USER, + REWRITE, + HIDE_FILES, + REQUEST_TIMEOUT, + SSL_DO_VERIFY_PEER, + SSL_CA_PATH, + SSL_CA_FILE, + SSL_VERIFY_DEPTH, + SSL_DEFAULT_VERIFY_PATHS, + SSL_FORWARD_SECRECY, +#if defined(USE_WEBSOCKET) + WEBSOCKET_TIMEOUT, +#endif + DECODE_URL, + +#if defined(USE_LUA) + LUA_PRELOAD_FILE, + LUA_SCRIPT_EXTENSIONS, + LUA_SERVER_PAGE_EXTENSIONS, +#endif +#if defined(USE_DUKTAPE) + DUKTAPE_SCRIPT_EXTENSIONS, +#endif + +#if defined(USE_WEBSOCKET) + WEBSOCKET_ROOT, +#endif +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + LUA_WEBSOCKET_EXTENSIONS, +#endif + ACCESS_CONTROL_ALLOW_ORIGIN, + ERROR_PAGES, + + NUM_OPTIONS +}; + +/* Config option name, config types, default value */ +static struct mg_option config_options[] = { + {"cgi_pattern", CONFIG_TYPE_EXT_PATTERN, "**.cgi$|**.pl$|**.php$"}, + {"cgi_environment", CONFIG_TYPE_STRING, NULL}, + {"put_delete_auth_file", CONFIG_TYPE_FILE, NULL}, + {"cgi_interpreter", CONFIG_TYPE_FILE, NULL}, + {"protect_uri", CONFIG_TYPE_STRING, NULL}, + {"authentication_domain", CONFIG_TYPE_STRING, "mydomain.com"}, + {"ssi_pattern", CONFIG_TYPE_EXT_PATTERN, "**.shtml$|**.shtm$"}, + {"throttle", CONFIG_TYPE_STRING, NULL}, + {"access_log_file", CONFIG_TYPE_FILE, NULL}, + {"enable_directory_listing", CONFIG_TYPE_BOOLEAN, "yes"}, + {"error_log_file", CONFIG_TYPE_FILE, NULL}, + {"global_auth_file", CONFIG_TYPE_FILE, NULL}, + {"index_files", + CONFIG_TYPE_STRING, +#ifdef USE_LUA + "index.xhtml,index.html,index.htm,index.lp,index.lsp,index.lua,index.cgi," + "index.shtml,index.php"}, +#else + "index.xhtml,index.html,index.htm,index.cgi,index.shtml,index.php"}, +#endif + {"enable_keep_alive", CONFIG_TYPE_BOOLEAN, "no"}, + {"access_control_list", CONFIG_TYPE_STRING, NULL}, + {"extra_mime_types", CONFIG_TYPE_STRING, NULL}, + {"listening_ports", CONFIG_TYPE_STRING, "8080"}, + {"document_root", CONFIG_TYPE_DIRECTORY, NULL}, + {"ssl_certificate", CONFIG_TYPE_FILE, NULL}, + {"num_threads", CONFIG_TYPE_NUMBER, "50"}, + {"run_as_user", CONFIG_TYPE_STRING, NULL}, + {"url_rewrite_patterns", CONFIG_TYPE_STRING, NULL}, + {"hide_files_patterns", CONFIG_TYPE_EXT_PATTERN, NULL}, + {"request_timeout_ms", CONFIG_TYPE_NUMBER, "30000"}, + {"ssl_verify_peer", CONFIG_TYPE_BOOLEAN, "no"}, + {"ssl_ca_path", CONFIG_TYPE_DIRECTORY, NULL}, + {"ssl_ca_file", CONFIG_TYPE_FILE, NULL}, + {"ssl_verify_depth", CONFIG_TYPE_NUMBER, "9"}, + {"ssl_default_verify_paths", CONFIG_TYPE_BOOLEAN, "yes"}, + {"ssl_forward_secrecy", CONFIG_TYPE_BOOLEAN, "yes"}, +#if defined(USE_WEBSOCKET) + {"websocket_timeout_ms", CONFIG_TYPE_NUMBER, "30000"}, +#endif + {"decode_url", CONFIG_TYPE_BOOLEAN, "yes"}, + +#if defined(USE_LUA) + {"lua_preload_file", CONFIG_TYPE_FILE, NULL}, + {"lua_script_pattern", CONFIG_TYPE_EXT_PATTERN, "**.lua$"}, + {"lua_server_page_pattern", CONFIG_TYPE_EXT_PATTERN, "**.lp$|**.lsp$"}, +#endif +#if defined(USE_DUKTAPE) + {"_experimental_duktape_script_pattern", + CONFIG_TYPE_EXT_PATTERN, + "**.ssjs$"}, /* TODO: redefine parameter */ +#endif + +#if defined(USE_WEBSOCKET) + {"websocket_root", CONFIG_TYPE_DIRECTORY, NULL}, +#endif +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + {"lua_websocket_pattern", CONFIG_TYPE_EXT_PATTERN, "**.lua$"}, +#endif + {"access_control_allow_origin", CONFIG_TYPE_STRING, "*"}, + {"error_pages", CONFIG_TYPE_DIRECTORY, NULL}, + + {NULL, CONFIG_TYPE_UNKNOWN, NULL}}; + +/* Check if the config_options and the corresponding enum have compatible + * sizes. */ +mg_static_assert((sizeof(config_options) / sizeof(config_options[0])) + == (NUM_OPTIONS + 1), + "config_options and enum not sync"); + +struct mg_request_handler_info { + /* Name/Pattern of the URI. */ + char *uri; + size_t uri_len; + + /* URI type: ws/wss (websocket) or http/https (web page). */ + int is_websocket_handler; + + /* Handler for http/https requests. */ + mg_request_handler handler; + + /* Handler for ws/wss (websocket) requests. */ + mg_websocket_connect_handler connect_handler; + mg_websocket_ready_handler ready_handler; + mg_websocket_data_handler data_handler; + mg_websocket_close_handler close_handler; + + /* User supplied argument for the handler function. */ + void *cbdata; + + /* next request handler in a linked list */ + struct mg_request_handler_info *next; +}; + +struct mg_context { + volatile int stop_flag; /* Should we stop event loop */ + SSL_CTX *ssl_ctx; /* SSL context */ + char *config[NUM_OPTIONS]; /* Civetweb configuration parameters */ + struct mg_callbacks callbacks; /* User-defined callback function */ + void *user_data; /* User-defined data */ + int context_type; /* 1 = server context, 2 = client context */ + + struct socket *listening_sockets; + in_port_t *listening_ports; + unsigned int num_listening_sockets; + + volatile int + running_worker_threads; /* Number of currently running worker threads */ + pthread_mutex_t thread_mutex; /* Protects (max|num)_threads */ + pthread_cond_t thread_cond; /* Condvar for tracking workers terminations */ + + struct socket queue[MGSQLEN]; /* Accepted sockets */ + volatile int sq_head; /* Head of the socket queue */ + volatile int sq_tail; /* Tail of the socket queue */ + pthread_cond_t sq_full; /* Signaled when socket is produced */ + pthread_cond_t sq_empty; /* Signaled when socket is consumed */ + pthread_t masterthreadid; /* The master thread ID */ + unsigned int + cfg_worker_threads; /* The number of configured worker threads. */ + pthread_t *workerthreadids; /* The worker thread IDs */ + + unsigned long start_time; /* Server start time, used for authentication */ + pthread_mutex_t nonce_mutex; /* Protects nonce_count */ + unsigned long nonce_count; /* Used nonces, used for authentication */ + + char *systemName; /* What operating system is running */ + + /* linked list of uri handlers */ + struct mg_request_handler_info *request_handlers; + +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + /* linked list of shared lua websockets */ + struct mg_shared_lua_websocket_list *shared_lua_websockets; +#endif + +#ifdef USE_TIMERS + struct ttimers *timers; +#endif +}; + +struct mg_connection { + struct mg_request_info request_info; + struct mg_context *ctx; + SSL *ssl; /* SSL descriptor */ + SSL_CTX *client_ssl_ctx; /* SSL context for client connections */ + struct socket client; /* Connected client */ + time_t conn_birth_time; /* Time (wall clock) when connection was + * established */ + struct timespec req_time; /* Time (since system start) when the request + * was received */ + int64_t num_bytes_sent; /* Total bytes sent to client */ + int64_t content_len; /* Content-Length header value */ + int64_t consumed_content; /* How many bytes of content have been read */ + int is_chunked; /* Transfer-Encoding is chunked: 0=no, 1=yes: + * data available, 2: all data read */ + size_t chunk_remainder; /* Unread data from the last chunk */ + char *buf; /* Buffer for received data */ + char *path_info; /* PATH_INFO part of the URL */ + + int must_close; /* 1 if connection must be closed */ + int in_error_handler; /* 1 if in handler for user defined error + * pages */ + int internal_error; /* 1 if an error occured while processing the + * request */ + + int buf_size; /* Buffer size */ + int request_len; /* Size of the request + headers in a buffer */ + int data_len; /* Total size of data in a buffer */ + int status_code; /* HTTP reply status code, e.g. 200 */ + int throttle; /* Throttling, bytes/sec. <= 0 means no + * throttle */ + time_t last_throttle_time; /* Last time throttled data was sent */ + int64_t last_throttle_bytes; /* Bytes sent this second */ + pthread_mutex_t mutex; /* Used by mg_(un)lock_connection to ensure + * atomic transmissions for websockets */ +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + void *lua_websocket_state; /* Lua_State for a websocket connection */ +#endif +}; + +static pthread_key_t sTlsKey; /* Thread local storage index */ +static int sTlsInit = 0; +static int thread_idx_max = 0; + +struct mg_workerTLS { + int is_master; + unsigned long thread_idx; +#if defined(_WIN32) && !defined(__SYMBIAN32__) + HANDLE pthread_cond_helper_mutex; +#endif +}; + +/* Directory entry */ +struct de { + struct mg_connection *conn; + char *file_name; + struct file file; +}; + +#if defined(USE_WEBSOCKET) +static int is_websocket_protocol(const struct mg_connection *conn); +#else +#define is_websocket_protocol(conn) (0) +#endif + +static int +mg_atomic_inc(volatile int *addr) +{ + int ret; +#if defined(_WIN32) && !defined(__SYMBIAN32__) + /* Depending on the SDK, this function uses either + * (volatile unsigned int *) or (volatile LONG *), + * so whatever you use, the other SDK is likely to raise a warning. */ + ret = InterlockedIncrement((volatile long *)addr); +#elif defined(__GNUC__) \ + && (__GNUC__ > 5 || (__GNUC__ == 4 && __GNUC_MINOR__ > 0)) + ret = __sync_add_and_fetch(addr, 1); +#else + ret = (++(*addr)); +#endif + return ret; +} + +static int +mg_atomic_dec(volatile int *addr) +{ + int ret; +#if defined(_WIN32) && !defined(__SYMBIAN32__) + /* Depending on the SDK, this function uses either + * (volatile unsigned int *) or (volatile LONG *), + * so whatever you use, the other SDK is likely to raise a warning. */ + ret = InterlockedDecrement((volatile long *)addr); +#elif defined(__GNUC__) \ + && (__GNUC__ > 5 || (__GNUC__ == 4 && __GNUC_MINOR__ > 0)) + ret = __sync_sub_and_fetch(addr, 1); +#else + ret = (--(*addr)); +#endif + return ret; +} + +#if !defined(NO_THREAD_NAME) +#if defined(_WIN32) && defined(_MSC_VER) +/* Set the thread name for debugging purposes in Visual Studio + * http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx + */ +#pragma pack(push, 8) +typedef struct tagTHREADNAME_INFO { + DWORD dwType; /* Must be 0x1000. */ + LPCSTR szName; /* Pointer to name (in user addr space). */ + DWORD dwThreadID; /* Thread ID (-1=caller thread). */ + DWORD dwFlags; /* Reserved for future use, must be zero. */ +} THREADNAME_INFO; +#pragma pack(pop) +#elif defined(__linux__) +#include +#include +#endif + +static void +mg_set_thread_name(const char *name) +{ + char threadName[16 + 1]; /* 16 = Max. thread length in Linux/OSX/.. */ + + mg_snprintf( + NULL, NULL, threadName, sizeof(threadName), "civetweb-%s", name); + +#if defined(_WIN32) +#if defined(_MSC_VER) + /* Windows and Visual Studio Compiler */ + __try + { + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = threadName; + info.dwThreadID = ~0U; + info.dwFlags = 0; + + RaiseException(0x406D1388, + 0, + sizeof(info) / sizeof(ULONG_PTR), + (ULONG_PTR *)&info); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + } +#elif defined(__MINGW32__) +/* No option known to set thread name for MinGW */ +#endif +#elif defined(__GLIBC__) \ + && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 12))) + /* pthread_setname_np first appeared in glibc in version 2.12*/ + (void)pthread_setname_np(pthread_self(), threadName); +#elif defined(__linux__) + /* on linux we can use the old prctl function */ + (void)prctl(PR_SET_NAME, threadName, 0, 0, 0); +#endif +} +#else /* !defined(NO_THREAD_NAME) */ +void +mg_set_thread_name(const char *threadName) +{ +} +#endif + +#if defined(MG_LEGACY_INTERFACE) +const char ** +mg_get_valid_option_names(void) +{ + /* This function is deprecated. Use mg_get_valid_options instead. */ + static const char * + data[2 * sizeof(config_options) / sizeof(config_options[0])] = {0}; + int i; + + for (i = 0; config_options[i].name != NULL; i++) { + data[i * 2] = config_options[i].name; + data[i * 2 + 1] = config_options[i].default_value; + } + + return data; +} +#endif + +const struct mg_option * +mg_get_valid_options(void) +{ + return config_options; +} + +static int +is_file_in_memory(struct mg_connection *conn, + const char *path, + struct file *filep) +{ + size_t size = 0; + if (!conn || !filep) { + return 0; + } + + if (conn->ctx->callbacks.open_file) { + filep->membuf = conn->ctx->callbacks.open_file(conn, path, &size); + if (filep->membuf != NULL) { + /* NOTE: override filep->size only on success. Otherwise, it might + * break constructs like if (!mg_stat() || !mg_fopen()) ... */ + filep->size = size; + } + } + + return filep->membuf != NULL; +} + +static int +is_file_opened(const struct file *filep) +{ + if (!filep) { + return 0; + } + + return filep->membuf != NULL || filep->fp != NULL; +} + +static int +mg_fopen(struct mg_connection *conn, + const char *path, + const char *mode, + struct file *filep) +{ + if (!filep) { + return 0; + } + + memset(filep, 0, sizeof(*filep)); + + if (!is_file_in_memory(conn, path, filep)) { +#ifdef _WIN32 + wchar_t wbuf[PATH_MAX], wmode[20]; + to_unicode(path, wbuf, ARRAY_SIZE(wbuf)); + MultiByteToWideChar(CP_UTF8, 0, mode, -1, wmode, ARRAY_SIZE(wmode)); + filep->fp = _wfopen(wbuf, wmode); +#else + filep->fp = fopen(path, mode); +#endif + } + + return is_file_opened(filep); +} + +static void +mg_fclose(struct file *filep) +{ + if (filep != NULL && filep->fp != NULL) { + fclose(filep->fp); + } +} + +static void +mg_strlcpy(register char *dst, register const char *src, size_t n) +{ + for (; *src != '\0' && n > 1; n--) { + *dst++ = *src++; + } + *dst = '\0'; +} + +static int +lowercase(const char *s) +{ + return tolower(*(const unsigned char *)s); +} + +int +mg_strncasecmp(const char *s1, const char *s2, size_t len) +{ + int diff = 0; + + if (len > 0) { + do { + diff = lowercase(s1++) - lowercase(s2++); + } while (diff == 0 && s1[-1] != '\0' && --len > 0); + } + + return diff; +} + +static int +mg_strcasecmp(const char *s1, const char *s2) +{ + int diff; + + do { + diff = lowercase(s1++) - lowercase(s2++); + } while (diff == 0 && s1[-1] != '\0'); + + return diff; +} + +static char * +mg_strndup(const char *ptr, size_t len) +{ + char *p; + + if ((p = (char *)mg_malloc(len + 1)) != NULL) { + mg_strlcpy(p, ptr, len + 1); + } + + return p; +} + +static char * +mg_strdup(const char *str) +{ + return mg_strndup(str, strlen(str)); +} + +static const char * +mg_strcasestr(const char *big_str, const char *small_str) +{ + size_t i, big_len = strlen(big_str), small_len = strlen(small_str); + + if (big_len >= small_len) { + for (i = 0; i <= (big_len - small_len); i++) { + if (mg_strncasecmp(big_str + i, small_str, small_len) == 0) { + return big_str + i; + } + } + } + + return NULL; +} + +/* Return null terminated string of given maximum length. + * Report errors if length is exceeded. */ +static void +mg_vsnprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + const char *fmt, + va_list ap) +{ + int n, ok; + + if (buflen == 0) { + return; + } + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wformat-nonliteral" +/* Using fmt as a non-literal is intended here, since it is mostly called + * indirectly by mg_snprintf */ +#endif + + n = (int)vsnprintf_impl(buf, buflen, fmt, ap); + ok = (n >= 0) && ((size_t)n < buflen); + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + + if (ok) { + if (truncated) { + *truncated = 0; + } + } else { + if (truncated) { + *truncated = 1; + } + mg_cry(conn, + "truncating vsnprintf buffer: [%.*s]", + (int)((buflen > 200) ? 200 : (buflen - 1)), + buf); + n = (int)buflen - 1; + } + buf[n] = '\0'; +} + +static void +mg_snprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + const char *fmt, + ...) +{ + va_list ap; + + va_start(ap, fmt); + mg_vsnprintf(conn, truncated, buf, buflen, fmt, ap); + va_end(ap); +} + +static int +get_option_index(const char *name) +{ + int i; + + for (i = 0; config_options[i].name != NULL; i++) { + if (strcmp(config_options[i].name, name) == 0) { + return i; + } + } + return -1; +} + +const char * +mg_get_option(const struct mg_context *ctx, const char *name) +{ + int i; + if ((i = get_option_index(name)) == -1) { + return NULL; + } else if (!ctx || ctx->config[i] == NULL) { + return ""; + } else { + return ctx->config[i]; + } +} + +struct mg_context * +mg_get_context(const struct mg_connection *conn) +{ + return (conn == NULL) ? (struct mg_context *)NULL : (conn->ctx); +} + +void * +mg_get_user_data(const struct mg_context *ctx) +{ + return (ctx == NULL) ? NULL : ctx->user_data; +} + +void +mg_set_user_connection_data(const struct mg_connection *conn, void *data) +{ + if (conn != NULL) { + ((struct mg_connection *)conn)->request_info.conn_data = data; + } +} + +void * +mg_get_user_connection_data(const struct mg_connection *conn) +{ + if (conn != NULL) { + return conn->request_info.conn_data; + } + return NULL; +} + +size_t +mg_get_ports(const struct mg_context *ctx, size_t size, int *ports, int *ssl) +{ + size_t i; + if (!ctx) { + return 0; + } + for (i = 0; i < size && i < ctx->num_listening_sockets; i++) { + ssl[i] = ctx->listening_sockets[i].is_ssl; + ports[i] = ctx->listening_ports[i]; + } + return i; +} + +int +mg_get_server_ports(const struct mg_context *ctx, + int size, + struct mg_server_ports *ports) +{ + int i, cnt = 0; + + if (size <= 0) { + return -1; + } + memset(ports, 0, sizeof(*ports) * (size_t)size); + if (!ctx) { + return -1; + } + if (!ctx->listening_sockets || !ctx->listening_ports) { + return -1; + } + + for (i = 0; (i < size) && (i < (int)ctx->num_listening_sockets); i++) { + + ports[cnt].port = ctx->listening_ports[i]; + ports[cnt].is_ssl = ctx->listening_sockets[i].is_ssl; + ports[cnt].is_redirect = ctx->listening_sockets[i].ssl_redir; + + if (ctx->listening_sockets[i].lsa.sa.sa_family == AF_INET) { + /* IPv4 */ + ports[cnt].protocol = 1; + cnt++; + } else if (ctx->listening_sockets[i].lsa.sa.sa_family == AF_INET6) { + /* IPv6 */ + ports[cnt].protocol = 3; + cnt++; + } + } + + return cnt; +} + +static void +sockaddr_to_string(char *buf, size_t len, const union usa *usa) +{ + buf[0] = '\0'; + + if (!usa) { + return; + } + + if (usa->sa.sa_family == AF_INET) { + getnameinfo(&usa->sa, + sizeof(usa->sin), + buf, + (unsigned)len, + NULL, + 0, + NI_NUMERICHOST); + } +#if defined(USE_IPV6) + else if (usa->sa.sa_family == AF_INET6) { + getnameinfo(&usa->sa, + sizeof(usa->sin6), + buf, + (unsigned)len, + NULL, + 0, + NI_NUMERICHOST); + } +#endif +} + +/* Convert time_t to a string. According to RFC2616, Sec 14.18, this must be + * included in all responses other than 100, 101, 5xx. */ +static void +gmt_time_string(char *buf, size_t buf_len, time_t *t) +{ + struct tm *tm; + + tm = gmtime(t); + if (tm != NULL) { + strftime(buf, buf_len, "%a, %d %b %Y %H:%M:%S GMT", tm); + } else { + mg_strlcpy(buf, "Thu, 01 Jan 1970 00:00:00 GMT", buf_len); + buf[buf_len - 1] = '\0'; + } +} + +/* difftime for struct timespec. Return value is in seconds. */ +static double +mg_difftimespec(const struct timespec *ts_now, const struct timespec *ts_before) +{ + return (double)(ts_now->tv_nsec - ts_before->tv_nsec) * 1.0E-9 + + (double)(ts_now->tv_sec - ts_before->tv_sec); +} + +/* Print error message to the opened error log stream. */ +void +mg_cry(const struct mg_connection *conn, const char *fmt, ...) +{ + char buf[MG_BUF_LEN], src_addr[IP_ADDR_STR_LEN]; + va_list ap; + FILE *fp; + time_t timestamp; + + va_start(ap, fmt); + IGNORE_UNUSED_RESULT(vsnprintf_impl(buf, sizeof(buf), fmt, ap)); + va_end(ap); + buf[sizeof(buf) - 1] = 0; + + /* Do not lock when getting the callback value, here and below. + * I suppose this is fine, since function cannot disappear in the + * same way string option can. */ + if (conn && (conn->ctx->callbacks.log_message == NULL + || conn->ctx->callbacks.log_message(conn, buf) == 0)) { + fp = conn->ctx->config[ERROR_LOG_FILE] == NULL + ? NULL + : fopen(conn->ctx->config[ERROR_LOG_FILE], "a+"); + + if (fp != NULL) { + flockfile(fp); + timestamp = time(NULL); + + sockaddr_to_string(src_addr, sizeof(src_addr), &conn->client.rsa); + fprintf(fp, + "[%010lu] [error] [client %s] ", + (unsigned long)timestamp, + src_addr); + + if (conn->request_info.request_method != NULL) { + fprintf(fp, + "%s %s: ", + conn->request_info.request_method, + conn->request_info.request_uri); + } + + fprintf(fp, "%s", buf); + fputc('\n', fp); + funlockfile(fp); + fclose(fp); + } + } +} + +/* Return fake connection structure. Used for logging, if connection + * is not applicable at the moment of logging. */ +static struct mg_connection * +fc(struct mg_context *ctx) +{ + static struct mg_connection fake_connection; + fake_connection.ctx = ctx; + return &fake_connection; +} + +const char * +mg_version(void) +{ + return CIVETWEB_VERSION; +} + +const struct mg_request_info * +mg_get_request_info(const struct mg_connection *conn) +{ + if (!conn) { + return NULL; + } + return &conn->request_info; +} + +/* Skip the characters until one of the delimiters characters found. + * 0-terminate resulting word. Skip the delimiter and following whitespaces. + * Advance pointer to buffer to the next word. Return found 0-terminated word. + * Delimiters can be quoted with quotechar. */ +static char * +skip_quoted(char **buf, + const char *delimiters, + const char *whitespace, + char quotechar) +{ + char *p, *begin_word, *end_word, *end_whitespace; + + begin_word = *buf; + end_word = begin_word + strcspn(begin_word, delimiters); + + /* Check for quotechar */ + if (end_word > begin_word) { + p = end_word - 1; + while (*p == quotechar) { + /* TODO (bel, low): it seems this code is never reached, so + * quotechar is actually not needed - check if this code may be + * droped */ + + /* If there is anything beyond end_word, copy it */ + if (*end_word == '\0') { + *p = '\0'; + break; + } else { + size_t end_off = strcspn(end_word + 1, delimiters); + memmove(p, end_word, end_off + 1); + p += end_off; /* p must correspond to end_word - 1 */ + end_word += end_off + 1; + } + } + for (p++; p < end_word; p++) { + *p = '\0'; + } + } + + if (*end_word == '\0') { + *buf = end_word; + } else { + end_whitespace = end_word + 1 + strspn(end_word + 1, whitespace); + + for (p = end_word; p < end_whitespace; p++) { + *p = '\0'; + } + + *buf = end_whitespace; + } + + return begin_word; +} + +/* Simplified version of skip_quoted without quote char + * and whitespace == delimiters */ +static char * +skip(char **buf, const char *delimiters) +{ + return skip_quoted(buf, delimiters, delimiters, 0); +} + +/* Return HTTP header value, or NULL if not found. */ +static const char * +get_header(const struct mg_request_info *ri, const char *name) +{ + int i; + if (ri) { + for (i = 0; i < ri->num_headers; i++) { + if (!mg_strcasecmp(name, ri->http_headers[i].name)) { + return ri->http_headers[i].value; + } + } + } + + return NULL; +} + +const char * +mg_get_header(const struct mg_connection *conn, const char *name) +{ + if (!conn) { + return NULL; + } + + return get_header(&conn->request_info, name); +} + +/* A helper function for traversing a comma separated list of values. + * It returns a list pointer shifted to the next value, or NULL if the end + * of the list found. + * Value is stored in val vector. If value has form "x=y", then eq_val + * vector is initialized to point to the "y" part, and val vector length + * is adjusted to point only to "x". */ +static const char * +next_option(const char *list, struct vec *val, struct vec *eq_val) +{ + if (val == NULL || list == NULL || *list == '\0') { + /* End of the list */ + list = NULL; + } else { + val->ptr = list; + if ((list = strchr(val->ptr, ',')) != NULL) { + /* Comma found. Store length and shift the list ptr */ + val->len = ((size_t)(list - val->ptr)); + list++; + } else { + /* This value is the last one */ + list = val->ptr + strlen(val->ptr); + val->len = ((size_t)(list - val->ptr)); + } + + if (eq_val != NULL) { + /* Value has form "x=y", adjust pointers and lengths + * so that val points to "x", and eq_val points to "y". */ + eq_val->len = 0; + eq_val->ptr = (const char *)memchr(val->ptr, '=', val->len); + if (eq_val->ptr != NULL) { + eq_val->ptr++; /* Skip over '=' character */ + eq_val->len = ((size_t)(val->ptr - eq_val->ptr)) + val->len; + val->len = ((size_t)(eq_val->ptr - val->ptr)) - 1; + } + } + } + + return list; +} + +/* Perform case-insensitive match of string against pattern */ +static int +match_prefix(const char *pattern, size_t pattern_len, const char *str) +{ + const char *or_str; + size_t i; + int j, len, res; + + if ((or_str = (const char *)memchr(pattern, '|', pattern_len)) != NULL) { + res = match_prefix(pattern, (size_t)(or_str - pattern), str); + return res > 0 ? res : match_prefix(or_str + 1, + (size_t)((pattern + pattern_len) + - (or_str + 1)), + str); + } + + for (i = 0, j = 0; i < pattern_len; i++, j++) { + if (pattern[i] == '?' && str[j] != '\0') { + continue; + } else if (pattern[i] == '$') { + return str[j] == '\0' ? j : -1; + } else if (pattern[i] == '*') { + i++; + if (pattern[i] == '*') { + i++; + len = (int)strlen(str + j); + } else { + len = (int)strcspn(str + j, "/"); + } + if (i == pattern_len) { + return j + len; + } + do { + res = match_prefix(pattern + i, pattern_len - i, str + j + len); + } while (res == -1 && len-- > 0); + return res == -1 ? -1 : j + res + len; + } else if (lowercase(&pattern[i]) != lowercase(&str[j])) { + return -1; + } + } + return j; +} + +/* HTTP 1.1 assumes keep alive if "Connection:" header is not set + * This function must tolerate situations when connection info is not + * set up, for example if request parsing failed. */ +static int +should_keep_alive(const struct mg_connection *conn) +{ + if (conn != NULL) { + const char *http_version = conn->request_info.http_version; + const char *header = mg_get_header(conn, "Connection"); + if (conn->must_close || conn->internal_error || conn->status_code == 401 + || mg_strcasecmp(conn->ctx->config[ENABLE_KEEP_ALIVE], "yes") != 0 + || (header != NULL && mg_strcasecmp(header, "keep-alive") != 0) + || (header == NULL && http_version + && 0 != strcmp(http_version, "1.1"))) { + return 0; + } + return 1; + } + return 0; +} + +static int +should_decode_url(const struct mg_connection *conn) +{ + if (!conn || !conn->ctx) { + return 0; + } + + return (mg_strcasecmp(conn->ctx->config[DECODE_URL], "yes") == 0); +} + +static const char * +suggest_connection_header(const struct mg_connection *conn) +{ + return should_keep_alive(conn) ? "keep-alive" : "close"; +} + +static void handle_file_based_request(struct mg_connection *conn, + const char *path, + struct file *filep); +static int +mg_stat(struct mg_connection *conn, const char *path, struct file *filep); + +const char *mg_get_response_code_text (int response_code, struct mg_connection *conn) +{ + switch (response_code) { + /* RFC2616 Section 10.1 - Informational 1xx */ + case 100: + return "Continue"; /* RFC2616 Section 10.1.1 */ + case 101: + return "Switching Protocols"; /* RFC2616 Section 10.1.2 */ + case 102: + return "Processing"; /* RFC2518 Section 10.1 */ + + /* RFC2616 Section 10.2 - Successful 2xx */ + case 200: + return "OK"; /* RFC2616 Section 10.2.1 */ + case 201: + return "Created"; /* RFC2616 Section 10.2.2 */ + case 202: + return "Accepted"; /* RFC2616 Section 10.2.3 */ + case 203: + return "Non-Authoritative Information"; /* RFC2616 Section 10.2.4 */ + case 204: + return "No Content"; /* RFC2616 Section 10.2.5 */ + case 205: + return "Reset Content"; /* RFC2616 Section 10.2.6 */ + case 206: + return "Partial Content"; /* RFC2616 Section 10.2.7 */ + case 207: + return "Multi-Status"; /* RFC2518 Section 10.2, RFC4918 Section 11.1 */ + + /* RFC2616 Section 10.3 - Redirection 3xx */ + case 300: + return "Multiple Choices"; /* RFC2616 Section 10.3.1 */ + case 301: + return "Moved Permanently"; /* RFC2616 Section 10.3.2 */ + case 302: + return "Found"; /* RFC2616 Section 10.3.3 */ + case 303: + return "See Other"; /* RFC2616 Section 10.3.4 */ + case 304: + return "Not Modified"; /* RFC2616 Section 10.3.5 */ + case 305: + return "Use Proxy"; /* RFC2616 Section 10.3.6 */ + case 307: + return "Temporary Redirect"; /* RFC2616 Section 10.3.8 */ + + /* RFC2616 Section 10.4 - Client Error 4xx */ + case 400: + return "Bad Request"; /* RFC2616 Section 10.4.1 */ + case 401: + return "Unauthorized"; /* RFC2616 Section 10.4.2 */ + case 402: + return "Payment Required"; /* RFC2616 Section 10.4.3 */ + case 403: + return "Forbidden"; /* RFC2616 Section 10.4.4 */ + case 404: + return "Not Found"; /* RFC2616 Section 10.4.5 */ + case 405: + return "Method Not Allowed"; /* RFC2616 Section 10.4.6 */ + case 406: + return "Not Acceptable"; /* RFC2616 Section 10.4.7 */ + case 407: + return "Proxy Authentication Required"; /* RFC2616 Section 10.4.8 */ + case 408: + return "Request Time-out"; /* RFC2616 Section 10.4.9 */ + case 409: + return "Conflict"; /* RFC2616 Section 10.4.10 */ + case 410: + return "Gone"; /* RFC2616 Section 10.4.11 */ + case 411: + return "Length Required"; /* RFC2616 Section 10.4.12 */ + case 412: + return "Precondition Failed"; /* RFC2616 Section 10.4.13 */ + case 413: + return "Request Entity Too Large"; /* RFC2616 Section 10.4.14 */ + case 414: + return "Request-URI Too Large"; /* RFC2616 Section 10.4.15 */ + case 415: + return "Unsupported Media Type"; /* RFC2616 Section 10.4.16 */ + case 416: + return "Requested range not satisfiable"; /* RFC2616 Section 10.4.17 */ + case 417: + return "Expectation Failed"; /* RFC2616 Section 10.4.18 */ + case 422: + return "Unproccessable entity"; /* RFC2518 Section 10.3, RFC4918 + * Section 11.2 */ + case 423: + return "Locked"; /* RFC2518 Section 10.4, RFC4918 Section 11.3 */ + case 424: + return "Failed Dependency"; /* RFC2518 Section 10.5, RFC4918 + * Section 11.4 */ + case 428: + return "Precondition Required"; /* RFC 6585, Section 3 */ + case 429: + return "Too Many Requests"; /* RFC 6585, Section 4 */ + case 431: + return "Request Header Fields Too Large"; /* RFC 6585, Section 5 */ + + /* RFC2616 Section 10.5 - Server Error 5xx */ + case 500: + return "Internal Server Error"; /* RFC2616 Section 10.5.1 */ + case 501: + return "Not Implemented"; /* RFC2616 Section 10.5.2 */ + case 502: + return "Bad Gateway"; /* RFC2616 Section 10.5.3 */ + case 503: + return "Service Unavailable"; /* RFC2616 Section 10.5.4 */ + case 504: + return "Gateway Time-out"; /* RFC2616 Section 10.5.5 */ + case 505: + return "HTTP Version not supported"; /* RFC2616 Section 10.5.6 */ + case 507: + return "Insufficient Storage"; /* RFC2518 Section 10.6, RFC4918 + * Section 11.5 */ + case 511: + return "Network Authentication Required"; /* RFC 6585, Section 6 */ + + /* Other RFCs */ + case 426: + return "Upgrade Required"; /* RFC 2817 */ + + /* Return codes from non normative RFCs: */ + /* Informative and experimental RFCs, "de facto" standards due to common + * use, ... */ + case 208: + return "Already Reported"; /* RFC5842 Section 7.1 */ + case 226: + return "IM used"; /* RFC3229 Section 10.4.1 */ + case 308: + return "Permanent Redirect"; /* RFC7238 Section 3 */ + case 418: + return "I am a teapot"; /* RFC2324 Section 2.3.2 */ + case 419: + return "Authentication Timeout"; /* common use */ + case 451: + return "Unavailable For Legal Reasons"; /* draft-tbray-http-legally-restricted-status-05, + * Section 3 */ + case 506: + return "Variant Also Negotiates"; /* RFC 2295, Section 8.1 */ + case 508: + return "Loop Detected"; /* RFC5842 Section 7.1 */ + case 510: + return "Not Extended"; /* RFC 2774, Section 7 */ + + default: + /* This error code is unknown. This should not happen. */ + if (conn) { + mg_cry(conn, "Unknown HTTP response code: %u", response_code); + } + + /* Return at least a category according to RFC 2616 Section 10. */ + if (response_code >= 100 && response_code < 200) { + /* Unknown informational status code */ + return "Information"; + } + if (response_code >= 200 && response_code < 300) { + /* Unknown success code */ + return "Success"; + } + if (response_code >= 300 && response_code < 400) { + /* Unknown redirection code */ + return "Redirection"; + } + if (response_code >= 400 && response_code < 500) { + /* Unknown request error code */ + return "Client Error"; + } + if (response_code >= 500 && response_code < 600) { + /* Unknown server error code */ + return "Server Error"; + } + + /* Response code not even within reasonable range */ + return ""; + } +} + +static void send_http_error(struct mg_connection *, + int, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(3, 4); + +static void +send_http_error(struct mg_connection *conn, int status, const char *fmt, ...) +{ + char buf[MG_BUF_LEN]; + va_list ap; + int len, i, page_handler_found, scope, truncated; + char date[64]; + time_t curtime = time(NULL); + const char *error_handler = NULL; + struct file error_page_file = STRUCT_FILE_INITIALIZER; + const char *error_page_file_ext, *tstr; + + const char *status_text = mg_get_response_code_text(status, conn); + + if (conn == NULL) { + return; + } + + conn->status_code = status; + if (conn->in_error_handler || conn->ctx->callbacks.http_error == NULL + || conn->ctx->callbacks.http_error(conn, status)) { + if (!conn->in_error_handler) { + /* Send user defined error pages, if defined */ + error_handler = conn->ctx->config[ERROR_PAGES]; + error_page_file_ext = conn->ctx->config[INDEX_FILES]; + page_handler_found = 0; + if (error_handler != NULL) { + for (scope = 1; (scope <= 3) && !page_handler_found; scope++) { + switch (scope) { + case 1: /* Handler for specific error, e.g. 404 error */ + mg_snprintf(conn, + &truncated, + buf, + sizeof(buf) - 32, + "%serror%03u.", + error_handler, + status); + break; + case 2: /* Handler for error group, e.g., 5xx error handler + * for all server errors (500-599) */ + mg_snprintf(conn, + &truncated, + buf, + sizeof(buf) - 32, + "%serror%01uxx.", + error_handler, + status / 100); + break; + default: /* Handler for all errors */ + mg_snprintf(conn, + &truncated, + buf, + sizeof(buf) - 32, + "%serror.", + error_handler); + break; + } + + /* String truncation in buf may only occur if error_handler + * is too long. This string is from the config, not from a + * client. */ + (void)truncated; + + len = (int)strlen(buf); + + tstr = strchr(error_page_file_ext, '.'); + + while (tstr) { + for (i = 1; i < 32 && tstr[i] != 0 && tstr[i] != ','; + i++) + buf[len + i - 1] = tstr[i]; + buf[len + i - 1] = 0; + if (mg_stat(conn, buf, &error_page_file)) { + page_handler_found = 1; + break; + } + tstr = strchr(tstr + i, '.'); + } + } + } + + if (page_handler_found) { + conn->in_error_handler = 1; + handle_file_based_request(conn, buf, &error_page_file); + conn->in_error_handler = 0; + return; + } + } + + /* No custom error page. Send default error page. */ + gmt_time_string(date, sizeof(date), &curtime); + + conn->must_close = 1; + mg_printf(conn, "HTTP/1.1 %d %s\r\n", status, status_text); + mg_printf(conn, + "Date: %s\r\n" + "Connection: close\r\n\r\n", + date); + + /* Errors 1xx, 204 and 304 MUST NOT send a body */ + if (status > 199 && status != 204 && status != 304) { + + mg_printf(conn, "Error %d: %s\n", status, status_text); + + if (fmt != NULL) { + va_start(ap, fmt); + mg_vsnprintf(conn, NULL, buf, sizeof(buf), fmt, ap); + va_end(ap); + mg_write(conn, buf, strlen(buf)); + DEBUG_TRACE("Error %i - [%s]", status, buf); + } + + } else { + /* No body allowed. Close the connection. */ + DEBUG_TRACE("Error %i", status); + } + } +} + +#if defined(_WIN32) && !defined(__SYMBIAN32__) +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + +static int +pthread_mutex_init(pthread_mutex_t *mutex, void *unused) +{ + (void)unused; + *mutex = CreateMutex(NULL, FALSE, NULL); + return *mutex == NULL ? -1 : 0; +} + +static int +pthread_mutex_destroy(pthread_mutex_t *mutex) +{ + return CloseHandle(*mutex) == 0 ? -1 : 0; +} + +static int +pthread_mutex_lock(pthread_mutex_t *mutex) +{ + return WaitForSingleObject(*mutex, INFINITE) == WAIT_OBJECT_0 ? 0 : -1; +} + +#ifdef ENABLE_UNUSED_PTHREAD_FUNCTIONS +static int +pthread_mutex_trylock(pthread_mutex_t *mutex) +{ + switch (WaitForSingleObject(*mutex, 0)) { + case WAIT_OBJECT_0: + return 0; + case WAIT_TIMEOUT: + return -2; /* EBUSY */ + } + return -1; +} +#endif + +static int +pthread_mutex_unlock(pthread_mutex_t *mutex) +{ + return ReleaseMutex(*mutex) == 0 ? -1 : 0; +} + +#ifndef WIN_PTHREADS_TIME_H +static int +clock_gettime(clockid_t clk_id, struct timespec *tp) +{ + FILETIME ft; + ULARGE_INTEGER li; + BOOL ok = FALSE; + double d; + static double perfcnt_per_sec = 0.0; + + if (tp) { + memset(tp, 0, sizeof(*tp)); + if (clk_id == CLOCK_REALTIME) { + GetSystemTimeAsFileTime(&ft); + li.LowPart = ft.dwLowDateTime; + li.HighPart = ft.dwHighDateTime; + li.QuadPart -= 116444736000000000; /* 1.1.1970 in filedate */ + tp->tv_sec = (time_t)(li.QuadPart / 10000000); + tp->tv_nsec = (long)(li.QuadPart % 10000000) * 100; + ok = TRUE; + } else if (clk_id == CLOCK_MONOTONIC) { + if (perfcnt_per_sec == 0.0) { + QueryPerformanceFrequency((LARGE_INTEGER *)&li); + perfcnt_per_sec = 1.0 / li.QuadPart; + } + if (perfcnt_per_sec != 0.0) { + QueryPerformanceCounter((LARGE_INTEGER *)&li); + d = li.QuadPart * perfcnt_per_sec; + tp->tv_sec = (time_t)d; + d -= tp->tv_sec; + tp->tv_nsec = (long)(d * 1.0E9); + ok = TRUE; + } + } + } + + return ok ? 0 : -1; +} +#endif + +static int +pthread_cond_init(pthread_cond_t *cv, const void *unused) +{ + (void)unused; + InitializeCriticalSection(&cv->threadIdSec); + cv->waitingthreadcount = 0; + cv->waitingthreadhdls = + (pthread_t *)mg_calloc(MAX_WORKER_THREADS, sizeof(pthread_t)); + return (cv->waitingthreadhdls != NULL) ? 0 : -1; +} + +static int +pthread_cond_timedwait(pthread_cond_t *cv, + pthread_mutex_t *mutex, + const struct timespec *abstime) +{ + struct mg_workerTLS *tls = + (struct mg_workerTLS *)pthread_getspecific(sTlsKey); + int ok; + struct timespec tsnow; + int64_t nsnow, nswaitabs, nswaitrel; + DWORD mswaitrel; + + EnterCriticalSection(&cv->threadIdSec); + assert(cv->waitingthreadcount < MAX_WORKER_THREADS); + cv->waitingthreadhdls[cv->waitingthreadcount] = + tls->pthread_cond_helper_mutex; + cv->waitingthreadcount++; + LeaveCriticalSection(&cv->threadIdSec); + + if (abstime) { + clock_gettime(CLOCK_REALTIME, &tsnow); + nsnow = (((int64_t)tsnow.tv_sec) * 1000000000) + tsnow.tv_nsec; + nswaitabs = + (((int64_t)abstime->tv_sec) * 1000000000) + abstime->tv_nsec; + nswaitrel = nswaitabs - nsnow; + if (nswaitrel < 0) { + nswaitrel = 0; + } + mswaitrel = (DWORD)(nswaitrel / 1000000); + } else { + mswaitrel = INFINITE; + } + + pthread_mutex_unlock(mutex); + ok = (WAIT_OBJECT_0 + == WaitForSingleObject(tls->pthread_cond_helper_mutex, mswaitrel)); + pthread_mutex_lock(mutex); + + return ok ? 0 : -1; +} + +static int +pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mutex) +{ + return pthread_cond_timedwait(cv, mutex, NULL); +} + +static int +pthread_cond_signal(pthread_cond_t *cv) +{ + int i; + HANDLE wkup = NULL; + BOOL ok = FALSE; + + EnterCriticalSection(&cv->threadIdSec); + if (cv->waitingthreadcount) { + wkup = cv->waitingthreadhdls[0]; + ok = SetEvent(wkup); + + for (i = 1; i < cv->waitingthreadcount; i++) { + cv->waitingthreadhdls[i - 1] = cv->waitingthreadhdls[i]; + } + cv->waitingthreadcount--; + + assert(ok); + } + LeaveCriticalSection(&cv->threadIdSec); + + return ok ? 0 : 1; +} + +static int +pthread_cond_broadcast(pthread_cond_t *cv) +{ + EnterCriticalSection(&cv->threadIdSec); + while (cv->waitingthreadcount) { + pthread_cond_signal(cv); + } + LeaveCriticalSection(&cv->threadIdSec); + + return 0; +} + +static int +pthread_cond_destroy(pthread_cond_t *cv) +{ + EnterCriticalSection(&cv->threadIdSec); + assert(cv->waitingthreadcount == 0); + mg_free(cv->waitingthreadhdls); + cv->waitingthreadhdls = 0; + LeaveCriticalSection(&cv->threadIdSec); + DeleteCriticalSection(&cv->threadIdSec); + + return 0; +} + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + +/* For Windows, change all slashes to backslashes in path names. */ +static void +change_slashes_to_backslashes(char *path) +{ + int i; + + for (i = 0; path[i] != '\0'; i++) { + if (path[i] == '/') { + path[i] = '\\'; + } + + /* remove double backslash (check i > 0 to preserve UNC paths, + * like \\server\file.txt) */ + if ((path[i] == '\\') && (i > 0)) { + while (path[i + 1] == '\\' || path[i + 1] == '/') { + (void)memmove(path + i + 1, path + i + 2, strlen(path + i + 1)); + } + } + } +} + +/* Encode 'path' which is assumed UTF-8 string, into UNICODE string. + * wbuf and wbuf_len is a target buffer and its length. */ +static void +to_unicode(const char *path, wchar_t *wbuf, size_t wbuf_len) +{ + char buf[PATH_MAX], buf2[PATH_MAX]; + + mg_strlcpy(buf, path, sizeof(buf)); + change_slashes_to_backslashes(buf); + + /* Convert to Unicode and back. If doubly-converted string does not + * match the original, something is fishy, reject. */ + memset(wbuf, 0, wbuf_len * sizeof(wchar_t)); + MultiByteToWideChar(CP_UTF8, 0, buf, -1, wbuf, (int)wbuf_len); + WideCharToMultiByte( + CP_UTF8, 0, wbuf, (int)wbuf_len, buf2, sizeof(buf2), NULL, NULL); + if (strcmp(buf, buf2) != 0) { + wbuf[0] = L'\0'; + } +} + +#if defined(_WIN32_WCE) +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + +static time_t +time(time_t *ptime) +{ + time_t t; + SYSTEMTIME st; + FILETIME ft; + + GetSystemTime(&st); + SystemTimeToFileTime(&st, &ft); + t = SYS2UNIX_TIME(ft.dwLowDateTime, ft.dwHighDateTime); + + if (ptime != NULL) { + *ptime = t; + } + + return t; +} + +static struct tm * +localtime(const time_t *ptime, struct tm *ptm) +{ + int64_t t = ((int64_t)*ptime) * RATE_DIFF + EPOCH_DIFF; + FILETIME ft, lft; + SYSTEMTIME st; + TIME_ZONE_INFORMATION tzinfo; + + if (ptm == NULL) { + return NULL; + } + + *(int64_t *)&ft = t; + FileTimeToLocalFileTime(&ft, &lft); + FileTimeToSystemTime(&lft, &st); + ptm->tm_year = st.wYear - 1900; + ptm->tm_mon = st.wMonth - 1; + ptm->tm_wday = st.wDayOfWeek; + ptm->tm_mday = st.wDay; + ptm->tm_hour = st.wHour; + ptm->tm_min = st.wMinute; + ptm->tm_sec = st.wSecond; + ptm->tm_yday = 0; /* hope nobody uses this */ + ptm->tm_isdst = + GetTimeZoneInformation(&tzinfo) == TIME_ZONE_ID_DAYLIGHT ? 1 : 0; + + return ptm; +} + +static struct tm * +gmtime(const time_t *ptime, struct tm *ptm) +{ + /* FIXME(lsm): fix this. */ + return localtime(ptime, ptm); +} + +static size_t +strftime(char *dst, size_t dst_size, const char *fmt, const struct tm *tm) +{ + (void)mg_snprintf(NULL, dst, dst_size, "implement strftime() for WinCE"); + return 0; +} + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + +#endif + +/* Windows happily opens files with some garbage at the end of file name. + * For example, fopen("a.cgi ", "r") on Windows successfully opens + * "a.cgi", despite one would expect an error back. + * This function returns non-0 if path ends with some garbage. */ +static int +path_cannot_disclose_cgi(const char *path) +{ + static const char *allowed_last_characters = "_-"; + int last = path[strlen(path) - 1]; + return isalnum(last) || strchr(allowed_last_characters, last) != NULL; +} + +static int +mg_stat(struct mg_connection *conn, const char *path, struct file *filep) +{ + wchar_t wbuf[PATH_MAX]; + WIN32_FILE_ATTRIBUTE_DATA info; + time_t creation_time; + + if (!filep) { + return 0; + } + memset(filep, 0, sizeof(*filep)); + + if (conn && is_file_in_memory(conn, path, filep)) { + return 1; + } + + to_unicode(path, wbuf, ARRAY_SIZE(wbuf)); + if (GetFileAttributesExW(wbuf, GetFileExInfoStandard, &info) != 0) { + filep->size = MAKEUQUAD(info.nFileSizeLow, info.nFileSizeHigh); + filep->last_modified = + SYS2UNIX_TIME(info.ftLastWriteTime.dwLowDateTime, + info.ftLastWriteTime.dwHighDateTime); + + /* On Windows, the file creation time can be higher than the + * modification time, e.g. when a file is copied. + * Since the Last-Modified timestamp is used for caching + * it should be based on the most recent timestamp. */ + creation_time = SYS2UNIX_TIME(info.ftCreationTime.dwLowDateTime, + info.ftCreationTime.dwHighDateTime); + if (creation_time > filep->last_modified) { + filep->last_modified = creation_time; + } + + filep->is_directory = info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; + /* If file name is fishy, reset the file structure and return + * error. + * Note it is important to reset, not just return the error, cause + * functions like is_file_opened() check the struct. */ + if (!filep->is_directory && !path_cannot_disclose_cgi(path)) { + memset(filep, 0, sizeof(*filep)); + return 0; + } + + return 1; + } + + return 0; +} + +#if !defined(NO_FILES) +static int +mg_remove(const char *path) +{ + wchar_t wbuf[PATH_MAX]; + to_unicode(path, wbuf, ARRAY_SIZE(wbuf)); + return DeleteFileW(wbuf) ? 0 : -1; +} + +static int +mg_mkdir(const char *path, int mode) +{ + char buf[PATH_MAX]; + wchar_t wbuf[PATH_MAX]; + + (void)mode; + mg_strlcpy(buf, path, sizeof(buf)); + change_slashes_to_backslashes(buf); + + (void)MultiByteToWideChar(CP_UTF8, 0, buf, -1, wbuf, ARRAY_SIZE(wbuf)); + + return CreateDirectoryW(wbuf, NULL) ? 0 : -1; +} +#endif + +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + +/* Implementation of POSIX opendir/closedir/readdir for Windows. */ +static DIR * +opendir(const char *name) +{ + DIR *dir = NULL; + wchar_t wpath[PATH_MAX]; + DWORD attrs; + + if (name == NULL) { + SetLastError(ERROR_BAD_ARGUMENTS); + } else if ((dir = (DIR *)mg_malloc(sizeof(*dir))) == NULL) { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + } else { + to_unicode(name, wpath, ARRAY_SIZE(wpath)); + attrs = GetFileAttributesW(wpath); + if (attrs != 0xFFFFFFFF && ((attrs & FILE_ATTRIBUTE_DIRECTORY) + == FILE_ATTRIBUTE_DIRECTORY)) { + (void)wcscat(wpath, L"\\*"); + dir->handle = FindFirstFileW(wpath, &dir->info); + dir->result.d_name[0] = '\0'; + } else { + mg_free(dir); + dir = NULL; + } + } + + return dir; +} + +static int +closedir(DIR *dir) +{ + int result = 0; + + if (dir != NULL) { + if (dir->handle != INVALID_HANDLE_VALUE) + result = FindClose(dir->handle) ? 0 : -1; + + mg_free(dir); + } else { + result = -1; + SetLastError(ERROR_BAD_ARGUMENTS); + } + + return result; +} + +static struct dirent * +readdir(DIR *dir) +{ + struct dirent *result = 0; + + if (dir) { + if (dir->handle != INVALID_HANDLE_VALUE) { + result = &dir->result; + (void)WideCharToMultiByte(CP_UTF8, + 0, + dir->info.cFileName, + -1, + result->d_name, + sizeof(result->d_name), + NULL, + NULL); + + if (!FindNextFileW(dir->handle, &dir->info)) { + (void)FindClose(dir->handle); + dir->handle = INVALID_HANDLE_VALUE; + } + + } else { + SetLastError(ERROR_FILE_NOT_FOUND); + } + } else { + SetLastError(ERROR_BAD_ARGUMENTS); + } + + return result; +} + +#ifndef HAVE_POLL +static int +poll(struct pollfd *pfd, unsigned int n, int milliseconds) +{ + struct timeval tv; + fd_set set; + unsigned int i; + int result; + SOCKET maxfd = 0; + + memset(&tv, 0, sizeof(tv)); + tv.tv_sec = milliseconds / 1000; + tv.tv_usec = (milliseconds % 1000) * 1000; + FD_ZERO(&set); + + for (i = 0; i < n; i++) { + FD_SET((SOCKET)pfd[i].fd, &set); + pfd[i].revents = 0; + + if (pfd[i].fd > maxfd) { + maxfd = pfd[i].fd; + } + } + + if ((result = select((int)maxfd + 1, &set, NULL, NULL, &tv)) > 0) { + for (i = 0; i < n; i++) { + if (FD_ISSET(pfd[i].fd, &set)) { + pfd[i].revents = POLLIN; + } + } + } + + return result; +} +#endif /* HAVE_POLL */ + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + +static void +set_close_on_exec(SOCKET sock, struct mg_connection *conn /* may be null */) +{ + (void)conn; /* Unused. */ + (void)SetHandleInformation((HANDLE)(intptr_t)sock, HANDLE_FLAG_INHERIT, 0); +} + +int +mg_start_thread(mg_thread_func_t f, void *p) +{ +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, e.g. -DUSE_STACK_SIZE=16384 + */ + return ((_beginthread((void(__cdecl *)(void *))f, USE_STACK_SIZE, p) + == ((uintptr_t)(-1L))) + ? -1 + : 0); +#else + return ( + (_beginthread((void(__cdecl *)(void *))f, 0, p) == ((uintptr_t)(-1L))) + ? -1 + : 0); +#endif /* defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) */ +} + +/* Start a thread storing the thread context. */ + +static int +mg_start_thread_with_id(unsigned(__stdcall *f)(void *), + void *p, + pthread_t *threadidptr) +{ + uintptr_t uip; + HANDLE threadhandle; + int result = -1; + + uip = _beginthreadex(NULL, 0, (unsigned(__stdcall *)(void *))f, p, 0, NULL); + threadhandle = (HANDLE)uip; + if ((uip != (uintptr_t)(-1L)) && (threadidptr != NULL)) { + *threadidptr = threadhandle; + result = 0; + } + + return result; +} + +/* Wait for a thread to finish. */ + +static int +mg_join_thread(pthread_t threadid) +{ + int result; + DWORD dwevent; + + result = -1; + dwevent = WaitForSingleObject(threadid, INFINITE); + if (dwevent == WAIT_FAILED) { + DEBUG_TRACE("WaitForSingleObject() failed, error %d", ERRNO); + } else { + if (dwevent == WAIT_OBJECT_0) { + CloseHandle(threadid); + result = 0; + } + } + + return result; +} + +#if !defined(NO_SSL_DL) +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + +static HANDLE +dlopen(const char *dll_name, int flags) +{ + wchar_t wbuf[PATH_MAX]; + (void)flags; + to_unicode(dll_name, wbuf, ARRAY_SIZE(wbuf)); + return LoadLibraryW(wbuf); +} + +static int +dlclose(void *handle) +{ + int result; + + if (FreeLibrary((HMODULE)handle) != 0) { + result = 0; + } else { + result = -1; + } + + return result; +} + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + +#endif + +#if !defined(NO_CGI) +#define SIGKILL (0) +static int +kill(pid_t pid, int sig_num) +{ + (void)TerminateProcess((HANDLE)pid, (UINT)sig_num); + (void)CloseHandle((HANDLE)pid); + return 0; +} + +static void +trim_trailing_whitespaces(char *s) +{ + char *e = s + strlen(s) - 1; + while (e > s && isspace(*(unsigned char *)e)) { + *e-- = '\0'; + } +} + +static pid_t +spawn_process(struct mg_connection *conn, + const char *prog, + char *envblk, + char *envp[], + int fdin, + int fdout, + int fderr, + const char *dir) +{ + HANDLE me; + char *p, *interp, full_interp[PATH_MAX], full_dir[PATH_MAX], + cmdline[PATH_MAX], buf[PATH_MAX]; + int truncated; + struct file file = STRUCT_FILE_INITIALIZER; + STARTUPINFOA si; + PROCESS_INFORMATION pi = {0}; + + (void)envp; + + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + + si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; + si.wShowWindow = SW_HIDE; + + me = GetCurrentProcess(); + DuplicateHandle(me, + (HANDLE)_get_osfhandle(fdin), + me, + &si.hStdInput, + 0, + TRUE, + DUPLICATE_SAME_ACCESS); + DuplicateHandle(me, + (HANDLE)_get_osfhandle(fdout), + me, + &si.hStdOutput, + 0, + TRUE, + DUPLICATE_SAME_ACCESS); + DuplicateHandle(me, + (HANDLE)_get_osfhandle(fderr), + me, + &si.hStdError, + 0, + TRUE, + DUPLICATE_SAME_ACCESS); + + /* If CGI file is a script, try to read the interpreter line */ + interp = conn->ctx->config[CGI_INTERPRETER]; + if (interp == NULL) { + buf[0] = buf[1] = '\0'; + + /* Read the first line of the script into the buffer */ + mg_snprintf( + conn, &truncated, cmdline, sizeof(cmdline), "%s/%s", dir, prog); + + if (truncated) { + pi.hProcess = (pid_t)-1; + goto spawn_cleanup; + } + + if (mg_fopen(conn, cmdline, "r", &file)) { + p = (char *)file.membuf; + mg_fgets(buf, sizeof(buf), &file, &p); + mg_fclose(&file); + buf[sizeof(buf) - 1] = '\0'; + } + + if (buf[0] == '#' && buf[1] == '!') { + trim_trailing_whitespaces(buf + 2); + } else { + buf[2] = '\0'; + } + interp = buf + 2; + } + + if (interp[0] != '\0') { + GetFullPathNameA(interp, sizeof(full_interp), full_interp, NULL); + interp = full_interp; + } + GetFullPathNameA(dir, sizeof(full_dir), full_dir, NULL); + + if (interp[0] != '\0') { + mg_snprintf(conn, + &truncated, + cmdline, + sizeof(cmdline), + "\"%s\" \"%s\\%s\"", + interp, + full_dir, + prog); + } else { + mg_snprintf(conn, + &truncated, + cmdline, + sizeof(cmdline), + "\"%s\\%s\"", + full_dir, + prog); + } + + if (truncated) { + pi.hProcess = (pid_t)-1; + goto spawn_cleanup; + } + + DEBUG_TRACE("Running [%s]", cmdline); + if (CreateProcessA(NULL, + cmdline, + NULL, + NULL, + TRUE, + CREATE_NEW_PROCESS_GROUP, + envblk, + NULL, + &si, + &pi) == 0) { + mg_cry( + conn, "%s: CreateProcess(%s): %ld", __func__, cmdline, (long)ERRNO); + pi.hProcess = (pid_t)-1; + /* goto spawn_cleanup; */ + } + +spawn_cleanup: + (void)CloseHandle(si.hStdOutput); + (void)CloseHandle(si.hStdError); + (void)CloseHandle(si.hStdInput); + if (pi.hThread != NULL) { + (void)CloseHandle(pi.hThread); + } + + return (pid_t)pi.hProcess; +} +#endif /* !NO_CGI */ + +static int +set_non_blocking_mode(SOCKET sock) +{ + unsigned long on = 1; + return ioctlsocket(sock, (long)FIONBIO, &on); +} + +#else +static int +mg_stat(struct mg_connection *conn, const char *path, struct file *filep) +{ + struct stat st; + if (!filep) { + return 0; + } + memset(filep, 0, sizeof(*filep)); + + if (conn && is_file_in_memory(conn, path, filep)) { + return 1; + } + + if (0 == stat(path, &st)) { + filep->size = (uint64_t)(st.st_size); + filep->last_modified = st.st_mtime; + filep->is_directory = S_ISDIR(st.st_mode); + return 1; + } + + return 0; +} + +static void +set_close_on_exec(SOCKET fd, struct mg_connection *conn /* may be null */) +{ + if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) { + if (conn) { + mg_cry(conn, + "%s: fcntl(F_SETFD FD_CLOEXEC) failed: %s", + __func__, + strerror(ERRNO)); + } + } +} + +int +mg_start_thread(mg_thread_func_t func, void *param) +{ + pthread_t thread_id; + pthread_attr_t attr; + int result; + + (void)pthread_attr_init(&attr); + (void)pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, + * e.g. -DUSE_STACK_SIZE=16384 */ + (void)pthread_attr_setstacksize(&attr, USE_STACK_SIZE); +#endif /* defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) */ + + result = pthread_create(&thread_id, &attr, func, param); + pthread_attr_destroy(&attr); + + return result; +} + +/* Start a thread storing the thread context. */ + +static int +mg_start_thread_with_id(mg_thread_func_t func, + void *param, + pthread_t *threadidptr) +{ + pthread_t thread_id; + pthread_attr_t attr; + int result; + + (void)pthread_attr_init(&attr); + +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, + * e.g. -DUSE_STACK_SIZE=16384 */ + (void)pthread_attr_setstacksize(&attr, USE_STACK_SIZE); +#endif /* defined(USE_STACK_SIZE) && USE_STACK_SIZE > 1 */ + + result = pthread_create(&thread_id, &attr, func, param); + pthread_attr_destroy(&attr); + if ((result == 0) && (threadidptr != NULL)) { + *threadidptr = thread_id; + } + return result; +} + +/* Wait for a thread to finish. */ + +static int +mg_join_thread(pthread_t threadid) +{ + int result; + + result = pthread_join(threadid, NULL); + return result; +} + +#ifndef NO_CGI +static pid_t +spawn_process(struct mg_connection *conn, + const char *prog, + char *envblk, + char *envp[], + int fdin, + int fdout, + int fderr, + const char *dir) +{ + pid_t pid; + const char *interp; + + (void)envblk; + + if (conn == NULL) { + return 0; + } + + if ((pid = fork()) == -1) { + /* Parent */ + send_http_error(conn, + 500, + "Error: Creating CGI process\nfork(): %s", + strerror(ERRNO)); + } else if (pid == 0) { + /* Child */ + if (chdir(dir) != 0) { + mg_cry(conn, "%s: chdir(%s): %s", __func__, dir, strerror(ERRNO)); + } else if (dup2(fdin, 0) == -1) { + mg_cry( + conn, "%s: dup2(%d, 0): %s", __func__, fdin, strerror(ERRNO)); + } else if (dup2(fdout, 1) == -1) { + mg_cry( + conn, "%s: dup2(%d, 1): %s", __func__, fdout, strerror(ERRNO)); + } else if (dup2(fderr, 2) == -1) { + mg_cry( + conn, "%s: dup2(%d, 2): %s", __func__, fderr, strerror(ERRNO)); + } else { + /* Keep stderr and stdout in two different pipes. + * Stdout will be sent back to the client, + * stderr should go into a server error log. */ + (void)close(fdin); + (void)close(fdout); + (void)close(fderr); + + /* After exec, all signal handlers are restored to their default + * values, with one exception of SIGCHLD. According to + * POSIX.1-2001 and Linux's implementation, SIGCHLD's handler will + * leave unchanged after exec if it was set to be ignored. Restore + * it to default action. */ + signal(SIGCHLD, SIG_DFL); + + interp = conn->ctx->config[CGI_INTERPRETER]; + if (interp == NULL) { + (void)execle(prog, prog, NULL, envp); + mg_cry(conn, + "%s: execle(%s): %s", + __func__, + prog, + strerror(ERRNO)); + } else { + (void)execle(interp, interp, prog, NULL, envp); + mg_cry(conn, + "%s: execle(%s %s): %s", + __func__, + interp, + prog, + strerror(ERRNO)); + } + } + exit(EXIT_FAILURE); + } + + return pid; +} +#endif /* !NO_CGI */ + +static int +set_non_blocking_mode(SOCKET sock) +{ + int flags; + + flags = fcntl(sock, F_GETFL, 0); + (void)fcntl(sock, F_SETFL, flags | O_NONBLOCK); + + return 0; +} +#endif /* _WIN32 */ + +/* Write data to the IO channel - opened file descriptor, socket or SSL + * descriptor. Return number of bytes written. */ +static int +push(struct mg_context *ctx, + FILE *fp, + SOCKET sock, + SSL *ssl, + const char *buf, + int len, + double timeout) +{ + struct timespec start, now; + int n, err; + +#ifdef _WIN32 + typedef int len_t; +#else + typedef size_t len_t; +#endif + + if (timeout > 0) { + memset(&start, 0, sizeof(start)); + memset(&now, 0, sizeof(now)); + clock_gettime(CLOCK_MONOTONIC, &start); + } + + if (ctx == NULL) { + return -1; + } + +#ifdef NO_SSL + if (ssl) { + return -1; + } +#endif + + do { + +#ifndef NO_SSL + if (ssl != NULL) { + n = SSL_write(ssl, buf, len); + if (n <= 0) { + err = SSL_get_error(ssl, n); + if ((err == 5 /* SSL_ERROR_SYSCALL */) && (n == -1)) { + err = ERRNO; + } else { + DEBUG_TRACE("SSL_write() failed, error %d", err); + return -1; + } + } else { + err = 0; + } + } else +#endif + if (fp != NULL) { + n = (int)fwrite(buf, 1, (size_t)len, fp); + if (ferror(fp)) { + n = -1; + err = ERRNO; + } else { + err = 0; + } + } else { + n = (int)send(sock, buf, (len_t)len, MSG_NOSIGNAL); + err = (n < 0) ? ERRNO : 0; + } + + if (ctx->stop_flag) { + return -1; + } + + if ((n > 0) || (n == 0 && len == 0)) { + /* some data has been read, or no data was requested */ + return n; + } + if (n == 0) { + /* shutdown of the socket at client side */ + return -1; + } + if (n < 0) { + /* socket error - check errno */ + DEBUG_TRACE("send() failed, error %d", err); + + /* TODO: error handling depending on the error code. + * These codes are different between Windows and Linux. + */ + return -1; + } + if (timeout > 0) { + clock_gettime(CLOCK_MONOTONIC, &now); + } + } while ((timeout <= 0) || (mg_difftimespec(&now, &start) <= timeout)); + + (void)err; /* Avoid unused warning if NO_SSL is set and DEBUG_TRACE is not + used */ + + return -1; +} + +static int64_t +push_all(struct mg_context *ctx, + FILE *fp, + SOCKET sock, + SSL *ssl, + const char *buf, + int64_t len) +{ + double timeout = -1.0; + int64_t n, nwritten = 0; + + if (ctx == NULL) { + return -1; + } + + if (ctx->config[REQUEST_TIMEOUT]) { + timeout = atoi(ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } + + while (len > 0 && ctx->stop_flag == 0) { + n = push(ctx, fp, sock, ssl, buf + nwritten, (int)len, timeout); + if (n < 0) { + if (nwritten == 0) { + nwritten = n; /* Propagate the error */ + } + break; + } else if (n == 0) { + break; /* No more data to write */ + } else { + nwritten += n; + len -= n; + } + } + + return nwritten; +} + +/* Read from IO channel - opened file descriptor, socket, or SSL descriptor. + * Return negative value on error, or number of bytes read on success. */ +static int +pull(FILE *fp, struct mg_connection *conn, char *buf, int len, double timeout) +{ + int nread, err; + struct timespec start, now; + +#ifdef _WIN32 + typedef int len_t; +#else + typedef size_t len_t; +#endif + + if (timeout > 0) { + memset(&start, 0, sizeof(start)); + memset(&now, 0, sizeof(now)); + clock_gettime(CLOCK_MONOTONIC, &start); + } + + do { + if (fp != NULL) { + /* Use read() instead of fread(), because if we're reading from the + * CGI pipe, fread() may block until IO buffer is filled up. We + * cannot afford to block and must pass all read bytes immediately + * to the client. */ + nread = (int)read(fileno(fp), buf, (size_t)len); + err = (nread < 0) ? ERRNO : 0; + +#ifndef NO_SSL + } else if (conn->ssl != NULL) { + nread = SSL_read(conn->ssl, buf, len); + if (nread <= 0) { + err = SSL_get_error(conn->ssl, nread); + if ((err == 5 /* SSL_ERROR_SYSCALL */) && (nread == -1)) { + err = ERRNO; + } else { + DEBUG_TRACE("SSL_read() failed, error %d", err); + return -1; + } + } else { + err = 0; + } +#endif + + } else { + nread = (int)recv(conn->client.sock, buf, (len_t)len, 0); + err = (nread < 0) ? ERRNO : 0; + } + + if (conn->ctx->stop_flag) { + return -1; + } + + if ((nread > 0) || (nread == 0 && len == 0)) { + /* some data has been read, or no data was requested */ + return nread; + } + if (nread == 0) { + /* shutdown of the socket at client side */ + return -1; + } + if (nread < 0) { +/* socket error - check errno */ +#ifdef _WIN32 + if (err == WSAEWOULDBLOCK) { + /* standard case if called from close_socket_gracefully */ + return -1; + } else if (err == WSAETIMEDOUT) { + /* timeout is handled by the while loop */ + } else { + DEBUG_TRACE("recv() failed, error %d", err); + return -1; + } +#else + /* TODO: POSIX returns either EAGAIN or EWOULDBLOCK in both cases, + * if the timeout is reached and if the socket was set to non- + * blocking in close_socket_gracefully, so we can not distinguish + * here. We have to wait for the timeout in both cases for now. + */ + if (err == EAGAIN || err == EWOULDBLOCK) { + /* standard case if called from close_socket_gracefully + * => should return -1 */ + /* or timeout occured + * => the code must stay in the while loop */ + } else { + DEBUG_TRACE("recv() failed, error %d", err); + return -1; + } +#endif + } + if (timeout > 0) { + clock_gettime(CLOCK_MONOTONIC, &now); + } + } while ((timeout <= 0) || (mg_difftimespec(&now, &start) <= timeout)); + + /* Timeout occured, but no data available. */ + return -1; +} + +static int +pull_all(FILE *fp, struct mg_connection *conn, char *buf, int len) +{ + int n, nread = 0; + double timeout = -1.0; + + if (conn->ctx->config[REQUEST_TIMEOUT]) { + timeout = atoi(conn->ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } + + while (len > 0 && conn->ctx->stop_flag == 0) { + n = pull(fp, conn, buf + nread, len, timeout); + if (n < 0) { + if (nread == 0) { + nread = n; /* Propagate the error */ + } + break; + } else if (n == 0) { + break; /* No more data to read */ + } else { + conn->consumed_content += n; + nread += n; + len -= n; + } + } + + return nread; +} + +static void +discard_unread_request_data(struct mg_connection *conn) +{ + char buf[MG_BUF_LEN]; + size_t to_read; + int nread; + + if (conn == NULL) { + return; + } + + to_read = sizeof(buf); + + if (conn->is_chunked) { + /* Chunked encoding: 1=chunk not read completely, 2=chunk read + * completely */ + while (conn->is_chunked == 1) { + nread = mg_read(conn, buf, to_read); + if (nread <= 0) { + break; + } + } + + } else { + /* Not chunked: content length is known */ + while (conn->consumed_content < conn->content_len) { + if (to_read + > (size_t)(conn->content_len - conn->consumed_content)) { + to_read = (size_t)(conn->content_len - conn->consumed_content); + } + + nread = mg_read(conn, buf, to_read); + if (nread <= 0) { + break; + } + } + } +} + +static int +mg_read_inner(struct mg_connection *conn, void *buf, size_t len) +{ + int64_t n, buffered_len, nread; + int64_t len64 = + (int64_t)(len > INT_MAX ? INT_MAX : len); /* since the return value is + * int, we may not read more + * bytes */ + const char *body; + + if (conn == NULL) { + return 0; + } + + /* If Content-Length is not set for a PUT or POST request, read until + * socket is closed */ + if (conn->consumed_content == 0 && conn->content_len == -1) { + conn->content_len = INT64_MAX; + conn->must_close = 1; + } + + nread = 0; + if (conn->consumed_content < conn->content_len) { + /* Adjust number of bytes to read. */ + int64_t left_to_read = conn->content_len - conn->consumed_content; + if (left_to_read < len64) { + /* Do not read more than the total content length of the request. + */ + len64 = left_to_read; + } + + /* Return buffered data */ + buffered_len = (int64_t)(conn->data_len) - (int64_t)conn->request_len + - conn->consumed_content; + if (buffered_len > 0) { + if (len64 < buffered_len) { + buffered_len = len64; + } + body = conn->buf + conn->request_len + conn->consumed_content; + memcpy(buf, body, (size_t)buffered_len); + len64 -= buffered_len; + conn->consumed_content += buffered_len; + nread += buffered_len; + buf = (char *)buf + buffered_len; + } + + /* We have returned all buffered data. Read new data from the remote + * socket. + */ + if ((n = pull_all(NULL, conn, (char *)buf, (int)len64)) >= 0) { + nread += n; + } else { + nread = (nread > 0 ? nread : n); + } + } + return (int)nread; +} + +static char +mg_getc(struct mg_connection *conn) +{ + char c; + if (conn == NULL) { + return 0; + } + conn->content_len++; + if (mg_read_inner(conn, &c, 1) <= 0) { + return (char)0; + } + return c; +} + +int +mg_read(struct mg_connection *conn, void *buf, size_t len) +{ + if (len > INT_MAX) { + len = INT_MAX; + } + + if (conn == NULL) { + return 0; + } + + if (conn->is_chunked) { + size_t all_read = 0; + while (len > 0) { + if (conn->chunk_remainder) { + /* copy from the remainder of the last received chunk */ + long read_ret; + size_t read_now = + ((conn->chunk_remainder > len) ? (len) + : (conn->chunk_remainder)); + + conn->content_len += (int)read_now; + read_ret = + mg_read_inner(conn, (char *)buf + all_read, read_now); + all_read += (size_t)read_ret; + + conn->chunk_remainder -= read_now; + len -= read_now; + + if (conn->chunk_remainder == 0) { + /* the rest of the data in the current chunk has been read + */ + if ((mg_getc(conn) != '\r') || (mg_getc(conn) != '\n')) { + /* Protocol violation */ + return -1; + } + } + + } else { + /* fetch a new chunk */ + int i = 0; + char lenbuf[64]; + char *end = 0; + unsigned long chunkSize = 0; + + for (i = 0; i < ((int)sizeof(lenbuf) - 1); i++) { + lenbuf[i] = mg_getc(conn); + if (i > 0 && lenbuf[i] == '\r' && lenbuf[i - 1] != '\r') { + continue; + } + if (i > 1 && lenbuf[i] == '\n' && lenbuf[i - 1] == '\r') { + lenbuf[i + 1] = 0; + chunkSize = strtoul(lenbuf, &end, 16); + break; + } + if (!isalnum(lenbuf[i])) { + /* illegal character for chunk length */ + return -1; + } + } + if ((end == NULL) || (*end != '\r')) { + /* chunksize not set correctly */ + return -1; + } + + conn->chunk_remainder = chunkSize; + if (chunkSize == 0) { + /* regular end of content */ + conn->is_chunked = 2; + break; + } + } + } + + return (int)all_read; + } + return mg_read_inner(conn, buf, len); +} + +int +mg_write(struct mg_connection *conn, const void *buf, size_t len) +{ + time_t now; + int64_t n, total, allowed; + + if (conn == NULL) { + return 0; + } + + if (conn->throttle > 0) { + if ((now = time(NULL)) != conn->last_throttle_time) { + conn->last_throttle_time = now; + conn->last_throttle_bytes = 0; + } + allowed = conn->throttle - conn->last_throttle_bytes; + if (allowed > (int64_t)len) { + allowed = (int64_t)len; + } + if ((total = push_all(conn->ctx, + NULL, + conn->client.sock, + conn->ssl, + (const char *)buf, + (int64_t)allowed)) == allowed) { + buf = (char *)buf + total; + conn->last_throttle_bytes += total; + while (total < (int64_t)len && conn->ctx->stop_flag == 0) { + allowed = conn->throttle > (int64_t)len - total + ? (int64_t)len - total + : conn->throttle; + if ((n = push_all(conn->ctx, + NULL, + conn->client.sock, + conn->ssl, + (const char *)buf, + (int64_t)allowed)) != allowed) { + break; + } + sleep(1); + conn->last_throttle_bytes = allowed; + conn->last_throttle_time = time(NULL); + buf = (char *)buf + n; + total += n; + } + } + } else { + total = push_all(conn->ctx, + NULL, + conn->client.sock, + conn->ssl, + (const char *)buf, + (int64_t)len); + } + return (int)total; +} + +/* Alternative alloc_vprintf() for non-compliant C runtimes */ +static int +alloc_vprintf2(char **buf, const char *fmt, va_list ap) +{ + va_list ap_copy; + size_t size = MG_BUF_LEN; + int len = -1; + + *buf = NULL; + while (len < 0) { + if (*buf) { + mg_free(*buf); + } + *buf = (char *)mg_malloc(size *= 4); + if (!*buf) { + break; + } + va_copy(ap_copy, ap); + len = vsnprintf_impl(*buf, size - 1, fmt, ap_copy); + va_end(ap_copy); + *buf[size - 1] = 0; + } + + return len; +} + +/* Print message to buffer. If buffer is large enough to hold the message, + * return buffer. If buffer is to small, allocate large enough buffer on heap, + * and return allocated buffer. */ +static int +alloc_vprintf(char **buf, size_t size, const char *fmt, va_list ap) +{ + va_list ap_copy; + int len; + + /* Windows is not standard-compliant, and vsnprintf() returns -1 if + * buffer is too small. Also, older versions of msvcrt.dll do not have + * _vscprintf(). However, if size is 0, vsnprintf() behaves correctly. + * Therefore, we make two passes: on first pass, get required message + * length. + * On second pass, actually print the message. */ + va_copy(ap_copy, ap); + len = vsnprintf_impl(NULL, 0, fmt, ap_copy); + va_end(ap_copy); + + if (len < 0) { + /* C runtime is not standard compliant, vsnprintf() returned -1. + * Switch to alternative code path that uses incremental allocations. + */ + va_copy(ap_copy, ap); + len = alloc_vprintf2(buf, fmt, ap); + va_end(ap_copy); + } else if ((size_t)(len) > size && (size = (size_t)(len) + 1) > 0 + && (*buf = (char *)mg_malloc(size)) == NULL) { + len = -1; /* Allocation failed, mark failure */ + } else { + va_copy(ap_copy, ap); + IGNORE_UNUSED_RESULT(vsnprintf_impl(*buf, size, fmt, ap_copy)); + va_end(ap_copy); + } + + return len; +} + +static int +mg_vprintf(struct mg_connection *conn, const char *fmt, va_list ap) +{ + char mem[MG_BUF_LEN], *buf = mem; + int len; + + if ((len = alloc_vprintf(&buf, sizeof(mem), fmt, ap)) > 0) { + len = mg_write(conn, buf, (size_t)len); + } + if (buf != mem && buf != NULL) { + mg_free(buf); + } + + return len; +} + +int +mg_printf(struct mg_connection *conn, const char *fmt, ...) +{ + va_list ap; + int result; + + va_start(ap, fmt); + result = mg_vprintf(conn, fmt, ap); + va_end(ap); + + return result; +} + +int +mg_url_decode(const char *src, + int src_len, + char *dst, + int dst_len, + int is_form_url_encoded) +{ + int i, j, a, b; +#define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W') + + for (i = j = 0; i < src_len && j < dst_len - 1; i++, j++) { + if (i < src_len - 2 && src[i] == '%' + && isxdigit(*(const unsigned char *)(src + i + 1)) + && isxdigit(*(const unsigned char *)(src + i + 2))) { + a = tolower(*(const unsigned char *)(src + i + 1)); + b = tolower(*(const unsigned char *)(src + i + 2)); + dst[j] = (char)((HEXTOI(a) << 4) | HEXTOI(b)); + i += 2; + } else if (is_form_url_encoded && src[i] == '+') { + dst[j] = ' '; + } else { + dst[j] = src[i]; + } + } + + dst[j] = '\0'; /* Null-terminate the destination */ + + return i >= src_len ? j : -1; +} + +int +mg_get_var(const char *data, + size_t data_len, + const char *name, + char *dst, + size_t dst_len) +{ + return mg_get_var2(data, data_len, name, dst, dst_len, 0); +} + +int +mg_get_var2(const char *data, + size_t data_len, + const char *name, + char *dst, + size_t dst_len, + size_t occurrence) +{ + const char *p, *e, *s; + size_t name_len; + int len; + + if (dst == NULL || dst_len == 0) { + len = -2; + } else if (data == NULL || name == NULL || data_len == 0) { + len = -1; + dst[0] = '\0'; + } else { + name_len = strlen(name); + e = data + data_len; + len = -1; + dst[0] = '\0'; + + /* data is "var1=val1&var2=val2...". Find variable first */ + for (p = data; p + name_len < e; p++) { + if ((p == data || p[-1] == '&') && p[name_len] == '=' + && !mg_strncasecmp(name, p, name_len) && 0 == occurrence--) { + /* Point p to variable value */ + p += name_len + 1; + + /* Point s to the end of the value */ + s = (const char *)memchr(p, '&', (size_t)(e - p)); + if (s == NULL) { + s = e; + } + /* assert(s >= p); */ + if (s < p) { + return -3; + } + + /* Decode variable into destination buffer */ + len = mg_url_decode(p, (int)(s - p), dst, (int)dst_len, 1); + + /* Redirect error code from -1 to -2 (destination buffer too + * small). */ + if (len == -1) { + len = -2; + } + break; + } + } + } + + return len; +} + +int +mg_get_cookie(const char *cookie_header, + const char *var_name, + char *dst, + size_t dst_size) +{ + const char *s, *p, *end; + int name_len, len = -1; + + if (dst == NULL || dst_size == 0) { + len = -2; + } else if (var_name == NULL || (s = cookie_header) == NULL) { + len = -1; + dst[0] = '\0'; + } else { + name_len = (int)strlen(var_name); + end = s + strlen(s); + dst[0] = '\0'; + + for (; (s = mg_strcasestr(s, var_name)) != NULL; s += name_len) { + if (s[name_len] == '=') { + s += name_len + 1; + if ((p = strchr(s, ' ')) == NULL) { + p = end; + } + if (p[-1] == ';') { + p--; + } + if (*s == '"' && p[-1] == '"' && p > s + 1) { + s++; + p--; + } + if ((size_t)(p - s) < dst_size) { + len = (int)(p - s); + mg_strlcpy(dst, s, (size_t)len + 1); + } else { + len = -3; + } + break; + } + } + } + return len; +} + +#if defined(USE_WEBSOCKET) || defined(USE_LUA) +static void +base64_encode(const unsigned char *src, int src_len, char *dst) +{ + static const char *b64 = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + int i, j, a, b, c; + + for (i = j = 0; i < src_len; i += 3) { + a = src[i]; + b = i + 1 >= src_len ? 0 : src[i + 1]; + c = i + 2 >= src_len ? 0 : src[i + 2]; + + dst[j++] = b64[a >> 2]; + dst[j++] = b64[((a & 3) << 4) | (b >> 4)]; + if (i + 1 < src_len) { + dst[j++] = b64[(b & 15) << 2 | (c >> 6)]; + } + if (i + 2 < src_len) { + dst[j++] = b64[c & 63]; + } + } + while (j % 4 != 0) { + dst[j++] = '='; + } + dst[j++] = '\0'; +} +#endif + +#if defined(USE_LUA) +static unsigned char +b64reverse(char letter) +{ + if (letter >= 'A' && letter <= 'Z') { + return letter - 'A'; + } + if (letter >= 'a' && letter <= 'z') { + return letter - 'a' + 26; + } + if (letter >= '0' && letter <= '9') { + return letter - '0' + 52; + } + if (letter == '+') { + return 62; + } + if (letter == '/') { + return 63; + } + if (letter == '=') { + return 255; /* normal end */ + } + return 254; /* error */ +} + +static int +base64_decode(const unsigned char *src, int src_len, char *dst, size_t *dst_len) +{ + int i; + unsigned char a, b, c, d; + + *dst_len = 0; + + for (i = 0; i < src_len; i += 4) { + a = b64reverse(src[i]); + if (a >= 254) { + return i; + } + + b = b64reverse(i + 1 >= src_len ? 0 : src[i + 1]); + if (b >= 254) { + return i + 1; + } + + c = b64reverse(i + 2 >= src_len ? 0 : src[i + 2]); + if (c == 254) { + return i + 2; + } + + d = b64reverse(i + 3 >= src_len ? 0 : src[i + 3]); + if (d == 254) { + return i + 3; + } + + dst[(*dst_len)++] = (a << 2) + (b >> 4); + if (c != 255) { + dst[(*dst_len)++] = (b << 4) + (c >> 2); + if (d != 255) { + dst[(*dst_len)++] = (c << 6) + d; + } + } + } + return -1; +} +#endif + +static int +is_put_or_delete_method(const struct mg_connection *conn) +{ + if (conn) { + const char *s = conn->request_info.request_method; + return s != NULL && (!strcmp(s, "PUT") || !strcmp(s, "DELETE") + || !strcmp(s, "MKCOL") || !strcmp(s, "PATCH")); + } + return 0; +} + +static void +interpret_uri(struct mg_connection *conn, /* in: request */ + char *filename, /* out: filename */ + size_t filename_buf_len, /* in: size of filename buffer */ + struct file *filep, /* out: file structure */ + int *is_found, /* out: file is found (directly) */ + int *is_script_resource, /* out: handled by a script? */ + int *is_websocket_request, /* out: websocket connetion? */ + int *is_put_or_delete_request /* out: put/delete a file? */ + ) +{ + /* TODO (high): Restructure this function */ + if (conn && conn->ctx) { + +#if !defined(NO_FILES) + const char *uri = conn->request_info.local_uri; + const char *root = conn->ctx->config[DOCUMENT_ROOT]; + const char *rewrite; + struct vec a, b; + int match_len; + char gz_path[PATH_MAX]; + char const *accept_encoding; + int truncated; +#if !defined(NO_CGI) || defined(USE_LUA) + char *p; +#endif +#else + (void)filename_buf_len; /* unused if NO_FILES is defined */ +#endif + + memset(filep, 0, sizeof(*filep)); + *filename = 0; + *is_found = 0; + *is_script_resource = 0; + *is_put_or_delete_request = is_put_or_delete_method(conn); + +#if defined(USE_WEBSOCKET) + *is_websocket_request = is_websocket_protocol(conn); +#if !defined(NO_FILES) + if (*is_websocket_request && conn->ctx->config[WEBSOCKET_ROOT]) { + root = conn->ctx->config[WEBSOCKET_ROOT]; + } +#endif /* !NO_FILES */ +#else /* USE_WEBSOCKET */ + *is_websocket_request = 0; +#endif /* USE_WEBSOCKET */ + +#if !defined(NO_FILES) + /* Note that root == NULL is a regular use case here. This occurs, + * if all requests are handled by callbacks, so the WEBSOCKET_ROOT + * config is not required. */ + if (root == NULL) { + /* all file related outputs have already been set to 0, just return + */ + return; + } + + /* Using buf_len - 1 because memmove() for PATH_INFO may shift part + * of the path one byte on the right. + * If document_root is NULL, leave the file empty. */ + mg_snprintf(conn, + &truncated, + filename, + filename_buf_len - 1, + "%s%s", + root, + uri); + + if (truncated) { + goto interpret_cleanup; + } + + rewrite = conn->ctx->config[REWRITE]; + while ((rewrite = next_option(rewrite, &a, &b)) != NULL) { + if ((match_len = match_prefix(a.ptr, a.len, uri)) > 0) { + mg_snprintf(conn, + &truncated, + filename, + filename_buf_len - 1, + "%.*s%s", + (int)b.len, + b.ptr, + uri + match_len); + break; + } + } + + if (truncated) { + goto interpret_cleanup; + } + + /* Local file path and name, corresponding to requested URI + * is now stored in "filename" variable. */ + if (mg_stat(conn, filename, filep)) { +#if !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) + /* File exists. Check if it is a script type. */ + if (0 +#if !defined(NO_CGI) + || match_prefix(conn->ctx->config[CGI_EXTENSIONS], + strlen(conn->ctx->config[CGI_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_LUA) + || match_prefix(conn->ctx->config[LUA_SCRIPT_EXTENSIONS], + strlen( + conn->ctx->config[LUA_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_DUKTAPE) + || match_prefix( + conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS], + strlen(conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif + ) { + /* The request addresses a CGI script or a Lua script. The URI + * corresponds to the script itself (like /path/script.cgi), + * and there is no additional resource path + * (like /path/script.cgi/something). + * Requests that modify (replace or delete) a resource, like + * PUT and DELETE requests, should replace/delete the script + * file. + * Requests that read or write from/to a resource, like GET and + * POST requests, should call the script and return the + * generated response. */ + *is_script_resource = !*is_put_or_delete_request; + } +#endif /* !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) */ + *is_found = 1; + return; + } + + /* If we can't find the actual file, look for the file + * with the same name but a .gz extension. If we find it, + * use that and set the gzipped flag in the file struct + * to indicate that the response need to have the content- + * encoding: gzip header. + * We can only do this if the browser declares support. */ + if ((accept_encoding = mg_get_header(conn, "Accept-Encoding")) + != NULL) { + if (strstr(accept_encoding, "gzip") != NULL) { + mg_snprintf(conn, + &truncated, + gz_path, + sizeof(gz_path), + "%s.gz", + filename); + + if (truncated) { + goto interpret_cleanup; + } + + if (mg_stat(conn, gz_path, filep)) { + if (filep) { + filep->gzipped = 1; + *is_found = 1; + } + /* Currently gz files can not be scripts. */ + return; + } + } + } + +#if !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) + /* Support PATH_INFO for CGI scripts. */ + for (p = filename + strlen(filename); p > filename + 1; p--) { + if (*p == '/') { + *p = '\0'; + if ((0 +#if !defined(NO_CGI) + || match_prefix(conn->ctx->config[CGI_EXTENSIONS], + strlen(conn->ctx->config[CGI_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_LUA) + || match_prefix( + conn->ctx->config[LUA_SCRIPT_EXTENSIONS], + strlen(conn->ctx->config[LUA_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_DUKTAPE) + || match_prefix( + conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS], + strlen( + conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif + ) && mg_stat(conn, filename, filep)) { + /* Shift PATH_INFO block one character right, e.g. + * "/x.cgi/foo/bar\x00" => "/x.cgi\x00/foo/bar\x00" + * conn->path_info is pointing to the local variable "path" + * declared in handle_request(), so PATH_INFO is not valid + * after handle_request returns. */ + conn->path_info = p + 1; + memmove(p + 2, p + 1, strlen(p + 1) + 1); /* +1 is for + * trailing \0 */ + p[1] = '/'; + *is_script_resource = 1; + break; + } else { + *p = '/'; + } + } + } +#endif /* !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) */ +#endif /* !defined(NO_FILES) */ + } + return; + +#if !defined(NO_FILES) +/* Reset all outputs */ +interpret_cleanup: + memset(filep, 0, sizeof(*filep)); + *filename = 0; + *is_found = 0; + *is_script_resource = 0; +#endif +} + +/* Check whether full request is buffered. Return: + * -1 if request is malformed + * 0 if request is not yet fully buffered + * >0 actual request length, including last \r\n\r\n */ +static int +get_request_len(const char *buf, int buflen) +{ + const char *s, *e; + int len = 0; + + for (s = buf, e = s + buflen - 1; len <= 0 && s < e; s++) + /* Control characters are not allowed but >=128 is. */ + if (!isprint(*(const unsigned char *)s) && *s != '\r' && *s != '\n' + && *(const unsigned char *)s < 128) { + len = -1; + break; /* [i_a] abort scan as soon as one malformed character is + * found; */ + /* don't let subsequent \r\n\r\n win us over anyhow */ + } else if (s[0] == '\n' && s[1] == '\n') { + len = (int)(s - buf) + 2; + } else if (s[0] == '\n' && &s[1] < e && s[1] == '\r' && s[2] == '\n') { + len = (int)(s - buf) + 3; + } + + return len; +} + +/* Convert month to the month number. Return -1 on error, or month number */ +static int +get_month_index(const char *s) +{ + size_t i; + + for (i = 0; i < ARRAY_SIZE(month_names); i++) { + if (!strcmp(s, month_names[i])) { + return (int)i; + } + } + + return -1; +} + +static int +num_leap_years(int year) +{ + return year / 4 - year / 100 + year / 400; +} + +/* Parse UTC date-time string, and return the corresponding time_t value. */ +static time_t +parse_date_string(const char *datetime) +{ + static const unsigned short days_before_month[] = { + 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; + char month_str[32] = {0}; + int second, minute, hour, day, month, year, leap_days, days; + time_t result = (time_t)0; + + if ((sscanf(datetime, + "%d/%3s/%d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6) || (sscanf(datetime, + "%d %3s %d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6) + || (sscanf(datetime, + "%*3s, %d %3s %d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6) || (sscanf(datetime, + "%d-%3s-%d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6)) { + month = get_month_index(month_str); + if ((month >= 0) && (year > 1970)) { + leap_days = num_leap_years(year) - num_leap_years(1970); + year -= 1970; + days = + year * 365 + days_before_month[month] + (day - 1) + leap_days; + result = (time_t)days * 24 * 3600 + (time_t)hour * 3600 + + minute * 60 + second; + } + } + + return result; +} + +/* Protect against directory disclosure attack by removing '..', + * excessive '/' and '\' characters */ +static void +remove_double_dots_and_double_slashes(char *s) +{ + char *p = s; + + while (*s != '\0') { + *p++ = *s++; + if (s[-1] == '/' || s[-1] == '\\') { + /* Skip all following slashes, backslashes and double-dots */ + while (s[0] != '\0') { + if (s[0] == '/' || s[0] == '\\') { + s++; + } else if (s[0] == '.' && s[1] == '.') { + s += 2; + } else { + break; + } + } + } + } + *p = '\0'; +} + +static const struct { + const char *extension; + size_t ext_len; + const char *mime_type; +} builtin_mime_types[] = { + /* IANA registered MIME types (http://www.iana.org/assignments/media-types) + * application types */ + {".doc", 4, "application/msword"}, + {".eps", 4, "application/postscript"}, + {".exe", 4, "application/octet-stream"}, + {".js", 3, "application/javascript"}, + {".json", 5, "application/json"}, + {".pdf", 4, "application/pdf"}, + {".ps", 3, "application/postscript"}, + {".rtf", 4, "application/rtf"}, + {".xhtml", 6, "application/xhtml+xml"}, + {".xsl", 4, "application/xml"}, + {".xslt", 5, "application/xml"}, + + /* audio */ + {".mp3", 4, "audio/mpeg"}, + {".oga", 4, "audio/ogg"}, + {".ogg", 4, "audio/ogg"}, + + /* image */ + {".gif", 4, "image/gif"}, + {".ief", 4, "image/ief"}, + {".jpeg", 5, "image/jpeg"}, + {".jpg", 4, "image/jpeg"}, + {".jpm", 4, "image/jpm"}, + {".jpx", 4, "image/jpx"}, + {".png", 4, "image/png"}, + {".svg", 4, "image/svg+xml"}, + {".tif", 4, "image/tiff"}, + {".tiff", 5, "image/tiff"}, + + /* model */ + {".wrl", 4, "model/vrml"}, + + /* text */ + {".css", 4, "text/css"}, + {".csv", 4, "text/csv"}, + {".htm", 4, "text/html"}, + {".html", 5, "text/html"}, + {".sgm", 4, "text/sgml"}, + {".shtm", 5, "text/html"}, + {".shtml", 6, "text/html"}, + {".txt", 4, "text/plain"}, + {".xml", 4, "text/xml"}, + + /* video */ + {".mov", 4, "video/quicktime"}, + {".mp4", 4, "video/mp4"}, + {".mpeg", 5, "video/mpeg"}, + {".mpg", 4, "video/mpeg"}, + {".ogv", 4, "video/ogg"}, + {".qt", 3, "video/quicktime"}, + + /* not registered types + * (http://reference.sitepoint.com/html/mime-types-full, + * http://www.hansenb.pdx.edu/DMKB/dict/tutorials/mime_typ.php, ..) */ + {".arj", 4, "application/x-arj-compressed"}, + {".gz", 3, "application/x-gunzip"}, + {".rar", 4, "application/x-arj-compressed"}, + {".swf", 4, "application/x-shockwave-flash"}, + {".tar", 4, "application/x-tar"}, + {".tgz", 4, "application/x-tar-gz"}, + {".torrent", 8, "application/x-bittorrent"}, + {".ppt", 4, "application/x-mspowerpoint"}, + {".xls", 4, "application/x-msexcel"}, + {".zip", 4, "application/x-zip-compressed"}, + {".aac", + 4, + "audio/aac"}, /* http://en.wikipedia.org/wiki/Advanced_Audio_Coding */ + {".aif", 4, "audio/x-aif"}, + {".m3u", 4, "audio/x-mpegurl"}, + {".mid", 4, "audio/x-midi"}, + {".ra", 3, "audio/x-pn-realaudio"}, + {".ram", 4, "audio/x-pn-realaudio"}, + {".wav", 4, "audio/x-wav"}, + {".bmp", 4, "image/bmp"}, + {".ico", 4, "image/x-icon"}, + {".pct", 4, "image/x-pct"}, + {".pict", 5, "image/pict"}, + {".rgb", 4, "image/x-rgb"}, + {".webm", 5, "video/webm"}, /* http://en.wikipedia.org/wiki/WebM */ + {".asf", 4, "video/x-ms-asf"}, + {".avi", 4, "video/x-msvideo"}, + {".m4v", 4, "video/x-m4v"}, + {NULL, 0, NULL}}; + +const char * +mg_get_builtin_mime_type(const char *path) +{ + const char *ext; + size_t i, path_len; + + path_len = strlen(path); + + for (i = 0; builtin_mime_types[i].extension != NULL; i++) { + ext = path + (path_len - builtin_mime_types[i].ext_len); + if (path_len > builtin_mime_types[i].ext_len + && mg_strcasecmp(ext, builtin_mime_types[i].extension) == 0) { + return builtin_mime_types[i].mime_type; + } + } + + return "text/plain"; +} + +/* Look at the "path" extension and figure what mime type it has. + * Store mime type in the vector. */ +static void +get_mime_type(struct mg_context *ctx, const char *path, struct vec *vec) +{ + struct vec ext_vec, mime_vec; + const char *list, *ext; + size_t path_len; + + path_len = strlen(path); + + if (ctx == NULL || vec == NULL) { + return; + } + + /* Scan user-defined mime types first, in case user wants to + * override default mime types. */ + list = ctx->config[EXTRA_MIME_TYPES]; + while ((list = next_option(list, &ext_vec, &mime_vec)) != NULL) { + /* ext now points to the path suffix */ + ext = path + path_len - ext_vec.len; + if (mg_strncasecmp(ext, ext_vec.ptr, ext_vec.len) == 0) { + *vec = mime_vec; + return; + } + } + + vec->ptr = mg_get_builtin_mime_type(path); + vec->len = strlen(vec->ptr); +} + +/* Stringify binary data. Output buffer must be twice as big as input, + * because each byte takes 2 bytes in string representation */ +static void +bin2str(char *to, const unsigned char *p, size_t len) +{ + static const char *hex = "0123456789abcdef"; + + for (; len--; p++) { + *to++ = hex[p[0] >> 4]; + *to++ = hex[p[0] & 0x0f]; + } + *to = '\0'; +} + + +/* Return stringified MD5 hash for list of strings. Buffer must be 33 bytes. */ +char * +mg_md5(char buf[33], ...) +{ + md5_byte_t hash[16]; + const char *p; + va_list ap; + md5_state_t ctx; + + md5_init(&ctx); + + va_start(ap, buf); + while ((p = va_arg(ap, const char *)) != NULL) { + md5_append(&ctx, (const md5_byte_t *)p, strlen(p)); + } + va_end(ap); + + md5_finish(&ctx, hash); + bin2str(buf, hash, sizeof(hash)); + return buf; +} + + +/* Check the user's password, return 1 if OK */ +static int +check_password(const char *method, + const char *ha1, + const char *uri, + const char *nonce, + const char *nc, + const char *cnonce, + const char *qop, + const char *response) +{ + char ha2[32 + 1], expected_response[32 + 1]; + + /* Some of the parameters may be NULL */ + if (method == NULL || nonce == NULL || nc == NULL || cnonce == NULL + || qop == NULL + || response == NULL) { + return 0; + } + + /* NOTE(lsm): due to a bug in MSIE, we do not compare the URI */ + /* TODO(lsm): check for authentication timeout */ + if (/* strcmp(dig->uri, c->ouri) != 0 || */ + strlen(response) != 32 + /* || now - strtoul(dig->nonce, NULL, 10) > 3600 */ + ) { + return 0; + } + + mg_md5(ha2, method, ":", uri, NULL); + mg_md5(expected_response, + ha1, + ":", + nonce, + ":", + nc, + ":", + cnonce, + ":", + qop, + ":", + ha2, + NULL); + + return mg_strcasecmp(response, expected_response) == 0; +} + + +/* Use the global passwords file, if specified by auth_gpass option, + * or search for .htpasswd in the requested directory. */ +static void +open_auth_file(struct mg_connection *conn, const char *path, struct file *filep) +{ + if (conn != NULL && conn->ctx != NULL) { + char name[PATH_MAX]; + const char *p, *e, *gpass = conn->ctx->config[GLOBAL_PASSWORDS_FILE]; + struct file file = STRUCT_FILE_INITIALIZER; + int truncated; + + if (gpass != NULL) { + /* Use global passwords file */ + if (!mg_fopen(conn, gpass, "r", filep)) { +#ifdef DEBUG + mg_cry(conn, "fopen(%s): %s", gpass, strerror(ERRNO)); +#endif + } + /* Important: using local struct file to test path for is_directory + * flag. If filep is used, mg_stat() makes it appear as if auth file + * was opened. */ + } else if (mg_stat(conn, path, &file) && file.is_directory) { + mg_snprintf(conn, + &truncated, + name, + sizeof(name), + "%s/%s", + path, + PASSWORDS_FILE_NAME); + + if (truncated || !mg_fopen(conn, name, "r", filep)) { +#ifdef DEBUG + mg_cry(conn, "fopen(%s): %s", name, strerror(ERRNO)); +#endif + } + } else { + /* Try to find .htpasswd in requested directory. */ + for (p = path, e = p + strlen(p) - 1; e > p; e--) { + if (e[0] == '/') { + break; + } + } + mg_snprintf(conn, + &truncated, + name, + sizeof(name), + "%.*s%s", + (int)(e - p), + p, + PASSWORDS_FILE_NAME); + + if (truncated || !mg_fopen(conn, name, "r", filep)) { +#ifdef DEBUG + mg_cry(conn, "fopen(%s): %s", name, strerror(ERRNO)); +#endif + } + } + } +} + +/* Parsed Authorization header */ +struct ah { + char *user, *uri, *cnonce, *response, *qop, *nc, *nonce; +}; + +/* Return 1 on success. Always initializes the ah structure. */ +static int +parse_auth_header(struct mg_connection *conn, + char *buf, + size_t buf_size, + struct ah *ah) +{ + char *name, *value, *s; + const char *auth_header; + unsigned long nonce; + + if (!ah || !conn) { + return 0; + } + + (void)memset(ah, 0, sizeof(*ah)); + if ((auth_header = mg_get_header(conn, "Authorization")) == NULL + || mg_strncasecmp(auth_header, "Digest ", 7) != 0) { + return 0; + } + + /* Make modifiable copy of the auth header */ + (void)mg_strlcpy(buf, auth_header + 7, buf_size); + s = buf; + + /* Parse authorization header */ + for (;;) { + /* Gobble initial spaces */ + while (isspace(*(unsigned char *)s)) { + s++; + } + name = skip_quoted(&s, "=", " ", 0); + /* Value is either quote-delimited, or ends at first comma or space. */ + if (s[0] == '\"') { + s++; + value = skip_quoted(&s, "\"", " ", '\\'); + if (s[0] == ',') { + s++; + } + } else { + value = skip_quoted(&s, ", ", " ", 0); /* IE uses commas, FF uses + * spaces */ + } + if (*name == '\0') { + break; + } + + if (!strcmp(name, "username")) { + ah->user = value; + } else if (!strcmp(name, "cnonce")) { + ah->cnonce = value; + } else if (!strcmp(name, "response")) { + ah->response = value; + } else if (!strcmp(name, "uri")) { + ah->uri = value; + } else if (!strcmp(name, "qop")) { + ah->qop = value; + } else if (!strcmp(name, "nc")) { + ah->nc = value; + } else if (!strcmp(name, "nonce")) { + ah->nonce = value; + } + } + +#ifndef NO_NONCE_CHECK + /* Convert the nonce from the client to a number and check it. */ + /* Server side nonce check is valuable in all situations but one: if the + * server restarts frequently, + * but the client should not see that, so the server should accept nonces + * from + * previous starts. */ + if (ah->nonce == NULL) { + return 0; + } + s = NULL; + nonce = strtoul(ah->nonce, &s, 10); + if ((s == NULL) || (*s != 0)) { + return 0; + } + nonce ^= (uintptr_t)(conn->ctx); + if (nonce < conn->ctx->start_time) { + /* nonce is from a previous start of the server and no longer valid + * (replay attack?) */ + return 0; + } + if (nonce >= conn->ctx->start_time + conn->ctx->nonce_count) { + return 0; + } +#endif + + /* CGI needs it as REMOTE_USER */ + if (ah->user != NULL) { + conn->request_info.remote_user = mg_strdup(ah->user); + } else { + return 0; + } + + return 1; +} + +static char * +mg_fgets(char *buf, size_t size, struct file *filep, char **p) +{ + char *eof; + size_t len; + char *memend; + + if (!filep) { + return NULL; + } + + if (filep->membuf != NULL && *p != NULL) { + memend = (char *)&filep->membuf[filep->size]; + /* Search for \n from p till the end of stream */ + eof = (char *)memchr(*p, '\n', (size_t)(memend - *p)); + if (eof != NULL) { + eof += 1; /* Include \n */ + } else { + eof = memend; /* Copy remaining data */ + } + len = (size_t)(eof - *p) > size - 1 ? size - 1 : (size_t)(eof - *p); + memcpy(buf, *p, len); + buf[len] = '\0'; + *p += len; + return len ? eof : NULL; + } else if (filep->fp != NULL) { + return fgets(buf, (int)size, filep->fp); + } else { + return NULL; + } +} + +struct read_auth_file_struct { + struct mg_connection *conn; + struct ah ah; + char *domain; + char buf[256 + 256 + 40]; + char *f_user; + char *f_domain; + char *f_ha1; +}; + +static int +read_auth_file(struct file *filep, struct read_auth_file_struct *workdata) +{ + char *p; + int is_authorized = 0; + struct file fp; + size_t l; + + if (!filep || !workdata) { + return 0; + } + + /* Loop over passwords file */ + p = (char *)filep->membuf; + while (mg_fgets(workdata->buf, sizeof(workdata->buf), filep, &p) != NULL) { + l = strlen(workdata->buf); + while (l > 0) { + if (isspace(workdata->buf[l - 1]) + || iscntrl(workdata->buf[l - 1])) { + l--; + workdata->buf[l] = 0; + } else + break; + } + if (l < 1) { + continue; + } + + workdata->f_user = workdata->buf; + + if (workdata->f_user[0] == ':') { + /* user names may not contain a ':' and may not be empty, + * so lines starting with ':' may be used for a special purpose */ + if (workdata->f_user[1] == '#') { + /* :# is a comment */ + continue; + } else if (!strncmp(workdata->f_user + 1, "include=", 8)) { + if (mg_fopen(workdata->conn, workdata->f_user + 9, "r", &fp)) { + is_authorized = read_auth_file(&fp, workdata); + mg_fclose(&fp); + } else { + mg_cry(workdata->conn, + "%s: cannot open authorization file: %s", + __func__, + workdata->buf); + } + continue; + } + /* everything is invalid for the moment (might change in the + * future) */ + mg_cry(workdata->conn, + "%s: syntax error in authorization file: %s", + __func__, + workdata->buf); + continue; + } + + workdata->f_domain = strchr(workdata->f_user, ':'); + if (workdata->f_domain == NULL) { + mg_cry(workdata->conn, + "%s: syntax error in authorization file: %s", + __func__, + workdata->buf); + continue; + } + *(workdata->f_domain) = 0; + (workdata->f_domain)++; + + workdata->f_ha1 = strchr(workdata->f_domain, ':'); + if (workdata->f_ha1 == NULL) { + mg_cry(workdata->conn, + "%s: syntax error in authorization file: %s", + __func__, + workdata->buf); + continue; + } + *(workdata->f_ha1) = 0; + (workdata->f_ha1)++; + + if (!strcmp(workdata->ah.user, workdata->f_user) + && !strcmp(workdata->domain, workdata->f_domain)) { + return check_password(workdata->conn->request_info.request_method, + workdata->f_ha1, + workdata->ah.uri, + workdata->ah.nonce, + workdata->ah.nc, + workdata->ah.cnonce, + workdata->ah.qop, + workdata->ah.response); + } + } + + return is_authorized; +} + +/* Authorize against the opened passwords file. Return 1 if authorized. */ +static int +authorize(struct mg_connection *conn, struct file *filep) +{ + struct read_auth_file_struct workdata; + char buf[MG_BUF_LEN]; + + if (!conn || !conn->ctx) { + return 0; + } + + memset(&workdata, 0, sizeof(workdata)); + workdata.conn = conn; + + if (!parse_auth_header(conn, buf, sizeof(buf), &workdata.ah)) { + return 0; + } + workdata.domain = conn->ctx->config[AUTHENTICATION_DOMAIN]; + + return read_auth_file(filep, &workdata); +} + +/* Return 1 if request is authorised, 0 otherwise. */ +static int +check_authorization(struct mg_connection *conn, const char *path) +{ + char fname[PATH_MAX]; + struct vec uri_vec, filename_vec; + const char *list; + struct file file = STRUCT_FILE_INITIALIZER; + int authorized = 1, truncated; + + if (!conn || !conn->ctx) { + return 0; + } + + list = conn->ctx->config[PROTECT_URI]; + while ((list = next_option(list, &uri_vec, &filename_vec)) != NULL) { + if (!memcmp(conn->request_info.local_uri, uri_vec.ptr, uri_vec.len)) { + mg_snprintf(conn, + &truncated, + fname, + sizeof(fname), + "%.*s", + (int)filename_vec.len, + filename_vec.ptr); + + if (truncated || !mg_fopen(conn, fname, "r", &file)) { + mg_cry(conn, + "%s: cannot open %s: %s", + __func__, + fname, + strerror(errno)); + } + break; + } + } + + if (!is_file_opened(&file)) { + open_auth_file(conn, path, &file); + } + + if (is_file_opened(&file)) { + authorized = authorize(conn, &file); + mg_fclose(&file); + } + + return authorized; +} + +static void +send_authorization_request(struct mg_connection *conn) +{ + char date[64]; + time_t curtime = time(NULL); + + if (conn && conn->ctx) { + unsigned long nonce = (unsigned long)(conn->ctx->start_time); + + (void)pthread_mutex_lock(&conn->ctx->nonce_mutex); + nonce += conn->ctx->nonce_count; + ++conn->ctx->nonce_count; + (void)pthread_mutex_unlock(&conn->ctx->nonce_mutex); + + nonce ^= (uintptr_t)(conn->ctx); + conn->status_code = 401; + conn->must_close = 1; + + gmt_time_string(date, sizeof(date), &curtime); + + mg_printf(conn, + "HTTP/1.1 401 Unauthorized\r\n" + "Date: %s\r\n" + "Connection: %s\r\n" + "Content-Length: 0\r\n" + "WWW-Authenticate: Digest qop=\"auth\", realm=\"%s\", " + "nonce=\"%lu\"\r\n\r\n", + date, + suggest_connection_header(conn), + conn->ctx->config[AUTHENTICATION_DOMAIN], + nonce); + } +} + +#if !defined(NO_FILES) +static int +is_authorized_for_put(struct mg_connection *conn) +{ + if (conn) { + struct file file = STRUCT_FILE_INITIALIZER; + const char *passfile = conn->ctx->config[PUT_DELETE_PASSWORDS_FILE]; + int ret = 0; + + if (passfile != NULL && mg_fopen(conn, passfile, "r", &file)) { + ret = authorize(conn, &file); + mg_fclose(&file); + } + + return ret; + } + return 0; +} +#endif + +int +mg_modify_passwords_file(const char *fname, + const char *domain, + const char *user, + const char *pass) +{ + int found, i; + char line[512], u[512] = "", d[512] = "", ha1[33], tmp[PATH_MAX + 8]; + FILE *fp, *fp2; + + found = 0; + fp = fp2 = NULL; + + /* Regard empty password as no password - remove user record. */ + if (pass != NULL && pass[0] == '\0') { + pass = NULL; + } + + /* Other arguments must not be empty */ + if (fname == NULL || domain == NULL || user == NULL) { + return 0; + } + + /* Using the given file format, user name and domain must not contain ':' + */ + if (strchr(user, ':') != NULL) { + return 0; + } + if (strchr(domain, ':') != NULL) { + return 0; + } + + /* Do not allow control characters like newline in user name and domain. + * Do not allow excessively long names either. */ + for (i = 0; i < 255 && user[i] != 0; i++) { + if (iscntrl(user[i])) { + return 0; + } + } + if (user[i]) { + return 0; + } + for (i = 0; i < 255 && domain[i] != 0; i++) { + if (iscntrl(domain[i])) { + return 0; + } + } + if (domain[i]) { + return 0; + } + + /* The maximum length of the path to the password file is limited */ + if ((strlen(fname) + 4) >= PATH_MAX) { + return 0; + } + + /* Create a temporary file name. Length has been checked before. */ + strcpy(tmp, fname); + strcat(tmp, ".tmp"); + + /* Create the file if does not exist */ + if ((fp = fopen(fname, "a+")) != NULL) { + (void)fclose(fp); + } + + /* Open the given file and temporary file */ + if ((fp = fopen(fname, "r")) == NULL) { + return 0; + } else if ((fp2 = fopen(tmp, "w+")) == NULL) { + fclose(fp); + return 0; + } + + /* Copy the stuff to temporary file */ + while (fgets(line, sizeof(line), fp) != NULL) { + if (sscanf(line, "%255[^:]:%255[^:]:%*s", u, d) != 2) { + continue; + } + u[255] = 0; + d[255] = 0; + + if (!strcmp(u, user) && !strcmp(d, domain)) { + found++; + if (pass != NULL) { + mg_md5(ha1, user, ":", domain, ":", pass, NULL); + fprintf(fp2, "%s:%s:%s\n", user, domain, ha1); + } + } else { + fprintf(fp2, "%s", line); + } + } + + /* If new user, just add it */ + if (!found && pass != NULL) { + mg_md5(ha1, user, ":", domain, ":", pass, NULL); + fprintf(fp2, "%s:%s:%s\n", user, domain, ha1); + } + + /* Close files */ + fclose(fp); + fclose(fp2); + + /* Put the temp file in place of real file */ + IGNORE_UNUSED_RESULT(remove(fname)); + IGNORE_UNUSED_RESULT(rename(tmp, fname)); + + return 1; +} + +static int +is_valid_port(unsigned long port) +{ + return port < 0xffff; +} + +static int +mg_inet_pton(int af, const char *src, void *dst, size_t dstlen) +{ + struct addrinfo hints, *res, *ressave; + int ret = 0; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = af; + + if (getaddrinfo(src, NULL, &hints, &res) != 0) { + /* bad src string or bad address family */ + return 0; + } + + ressave = res; + + while (res) { + if (dstlen >= res->ai_addrlen) { + memcpy(dst, res->ai_addr, res->ai_addrlen); + ret = 1; + } + res = res->ai_next; + } + + freeaddrinfo(ressave); + return ret; +} + +static int +connect_socket(struct mg_context *ctx /* may be NULL */, + const char *host, + int port, + int use_ssl, + char *ebuf, + size_t ebuf_len, + SOCKET *sock /* output: socket, must not be NULL */, + union usa *sa /* output: socket address, must not be NULL */ + ) +{ + int ip_ver = 0; + *sock = INVALID_SOCKET; + memset(sa, 0, sizeof(*sa)); + + if (ebuf_len > 0) { + *ebuf = 0; + } + + if (host == NULL) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "NULL host"); + return 0; + } + + if (port < 0 || !is_valid_port((unsigned)port)) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "invalid port"); + return 0; + } + + if (use_ssl && (SSLv23_client_method == NULL)) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "SSL is not initialized"); + return 0; + } + + if (mg_inet_pton(AF_INET, host, &sa->sin, sizeof(sa->sin))) { + sa->sin.sin_port = htons((uint16_t)port); + ip_ver = 4; +#ifdef USE_IPV6 + } else if (mg_inet_pton(AF_INET6, host, &sa->sin6, sizeof(sa->sin6))) { + sa->sin6.sin6_port = htons((uint16_t)port); + ip_ver = 6; + } else if (host[0] == '[') { + /* While getaddrinfo on Windows will work with [::1], + * getaddrinfo on Linux only works with ::1 (without []). */ + size_t l = strlen(host + 1); + char *h = l > 1 ? mg_strdup(host + 1) : NULL; + if (h) { + h[l - 1] = 0; + if (mg_inet_pton(AF_INET6, h, &sa->sin6, sizeof(sa->sin6))) { + sa->sin6.sin6_port = htons((uint16_t)port); + ip_ver = 6; + } + mg_free(h); + } +#endif + } + + if (ip_ver == 0) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "host not found"); + return 0; + } + + if (ip_ver == 4) { + *sock = socket(PF_INET, SOCK_STREAM, 0); + } +#ifdef USE_IPV6 + else if (ip_ver == 6) { + *sock = socket(PF_INET6, SOCK_STREAM, 0); + } +#endif + + if (*sock == INVALID_SOCKET) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "socket(): %s", + strerror(ERRNO)); + return 0; + } + + set_close_on_exec(*sock, fc(ctx)); + + if ((ip_ver == 4) + && (connect(*sock, (struct sockaddr *)&sa->sin, sizeof(sa->sin)) + == 0)) { + /* connected with IPv4 */ + return 1; + } + +#ifdef USE_IPV6 + if ((ip_ver == 6) + && (connect(*sock, (struct sockaddr *)&sa->sin6, sizeof(sa->sin6)) + == 0)) { + /* connected with IPv6 */ + return 1; + } +#endif + + /* Not connected */ + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "connect(%s:%d): %s", + host, + port, + strerror(ERRNO)); + closesocket(*sock); + *sock = INVALID_SOCKET; + return 0; +} + +int +mg_url_encode(const char *src, char *dst, size_t dst_len) +{ + static const char *dont_escape = "._-$,;~()"; + static const char *hex = "0123456789abcdef"; + char *pos = dst; + const char *end = dst + dst_len - 1; + + for (; *src != '\0' && pos < end; src++, pos++) { + if (isalnum(*(const unsigned char *)src) + || strchr(dont_escape, *(const unsigned char *)src) != NULL) { + *pos = *src; + } else if (pos + 2 < end) { + pos[0] = '%'; + pos[1] = hex[(*(const unsigned char *)src) >> 4]; + pos[2] = hex[(*(const unsigned char *)src) & 0xf]; + pos += 2; + } else { + break; + } + } + + *pos = '\0'; + return (*src == '\0') ? (int)(pos - dst) : -1; +} + +static void +print_dir_entry(struct de *de) +{ + char size[64], mod[64], href[PATH_MAX]; + struct tm *tm; + + if (de->file.is_directory) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%s", + "[DIRECTORY]"); + } else { + /* We use (signed) cast below because MSVC 6 compiler cannot + * convert unsigned __int64 to double. Sigh. */ + if (de->file.size < 1024) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%d", + (int)de->file.size); + } else if (de->file.size < 0x100000) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%.1fk", + (double)de->file.size / 1024.0); + } else if (de->file.size < 0x40000000) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%.1fM", + (double)de->file.size / 1048576); + } else { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%.1fG", + (double)de->file.size / 1073741824); + } + } + + /* Note: mg_snprintf will not cause a buffer overflow above. + * So, string truncation checks are not required here. */ + + tm = localtime(&de->file.last_modified); + if (tm != NULL) { + strftime(mod, sizeof(mod), "%d-%b-%Y %H:%M", tm); + } else { + mg_strlcpy(mod, "01-Jan-1970 00:00", sizeof(mod)); + mod[sizeof(mod) - 1] = '\0'; + } + mg_url_encode(de->file_name, href, sizeof(href)); + de->conn->num_bytes_sent += + mg_printf(de->conn, + "%s%s" + " %s  %s\n", + de->conn->request_info.local_uri, + href, + de->file.is_directory ? "/" : "", + de->file_name, + de->file.is_directory ? "/" : "", + mod, + size); +} + +/* This function is called from send_directory() and used for + * sorting directory entries by size, or name, or modification time. + * On windows, __cdecl specification is needed in case if project is built + * with __stdcall convention. qsort always requires __cdels callback. */ +static int WINCDECL +compare_dir_entries(const void *p1, const void *p2) +{ + if (p1 && p2) { + const struct de *a = (const struct de *)p1, *b = (const struct de *)p2; + const char *query_string = a->conn->request_info.query_string; + int cmp_result = 0; + + if (query_string == NULL) { + query_string = "na"; + } + + if (a->file.is_directory && !b->file.is_directory) { + return -1; /* Always put directories on top */ + } else if (!a->file.is_directory && b->file.is_directory) { + return 1; /* Always put directories on top */ + } else if (*query_string == 'n') { + cmp_result = strcmp(a->file_name, b->file_name); + } else if (*query_string == 's') { + cmp_result = a->file.size == b->file.size + ? 0 + : a->file.size > b->file.size ? 1 : -1; + } else if (*query_string == 'd') { + cmp_result = + (a->file.last_modified == b->file.last_modified) + ? 0 + : ((a->file.last_modified > b->file.last_modified) ? 1 + : -1); + } + + return query_string[1] == 'd' ? -cmp_result : cmp_result; + } + return 0; +} + +static int +must_hide_file(struct mg_connection *conn, const char *path) +{ + if (conn && conn->ctx) { + const char *pw_pattern = "**" PASSWORDS_FILE_NAME "$"; + const char *pattern = conn->ctx->config[HIDE_FILES]; + return match_prefix(pw_pattern, strlen(pw_pattern), path) > 0 + || (pattern != NULL + && match_prefix(pattern, strlen(pattern), path) > 0); + } + return 0; +} + +static int +scan_directory(struct mg_connection *conn, + const char *dir, + void *data, + void (*cb)(struct de *, void *)) +{ + char path[PATH_MAX]; + struct dirent *dp; + DIR *dirp; + struct de de; + int truncated; + + if ((dirp = opendir(dir)) == NULL) { + return 0; + } else { + de.conn = conn; + + while ((dp = readdir(dirp)) != NULL) { + /* Do not show current dir and hidden files */ + if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") + || must_hide_file(conn, dp->d_name)) { + continue; + } + + mg_snprintf( + conn, &truncated, path, sizeof(path), "%s/%s", dir, dp->d_name); + + /* If we don't memset stat structure to zero, mtime will have + * garbage and strftime() will segfault later on in + * print_dir_entry(). memset is required only if mg_stat() + * fails. For more details, see + * http://code.google.com/p/mongoose/issues/detail?id=79 */ + memset(&de.file, 0, sizeof(de.file)); + + if (truncated) { + /* If the path is not complete, skip processing. */ + continue; + } + + if (!mg_stat(conn, path, &de.file)) { + mg_cry(conn, + "%s: mg_stat(%s) failed: %s", + __func__, + path, + strerror(ERRNO)); + } + de.file_name = dp->d_name; + cb(&de, data); + } + (void)closedir(dirp); + } + return 1; +} + +#if !defined(NO_FILES) +static int +remove_directory(struct mg_connection *conn, const char *dir) +{ + char path[PATH_MAX]; + struct dirent *dp; + DIR *dirp; + struct de de; + int truncated; + int ok = 1; + + if ((dirp = opendir(dir)) == NULL) { + return 0; + } else { + de.conn = conn; + + while ((dp = readdir(dirp)) != NULL) { + /* Do not show current dir (but show hidden files as they will + * also be removed) */ + if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) { + continue; + } + + mg_snprintf( + conn, &truncated, path, sizeof(path), "%s/%s", dir, dp->d_name); + + /* If we don't memset stat structure to zero, mtime will have + * garbage and strftime() will segfault later on in + * print_dir_entry(). memset is required only if mg_stat() + * fails. For more details, see + * http://code.google.com/p/mongoose/issues/detail?id=79 */ + memset(&de.file, 0, sizeof(de.file)); + + if (truncated) { + /* Do not delete anything shorter */ + continue; + } + + if (!mg_stat(conn, path, &de.file)) { + mg_cry(conn, + "%s: mg_stat(%s) failed: %s", + __func__, + path, + strerror(ERRNO)); + } + if (de.file.membuf == NULL) { + /* file is not in memory */ + if (de.file.is_directory) { + if (remove_directory(conn, path) == 0) { + ok = 0; + } + } else { + if (mg_remove(path) == 0) { + ok = 0; + } + } + } + } + (void)closedir(dirp); + + IGNORE_UNUSED_RESULT(rmdir(dir)); + } + + return ok; +} +#endif + +struct dir_scan_data { + struct de *entries; + unsigned int num_entries; + unsigned int arr_size; +}; + +/* Behaves like realloc(), but frees original pointer on failure */ +static void * +realloc2(void *ptr, size_t size) +{ + void *new_ptr = mg_realloc(ptr, size); + if (new_ptr == NULL) { + mg_free(ptr); + } + return new_ptr; +} + +static void +dir_scan_callback(struct de *de, void *data) +{ + struct dir_scan_data *dsd = (struct dir_scan_data *)data; + + if (dsd->entries == NULL || dsd->num_entries >= dsd->arr_size) { + dsd->arr_size *= 2; + dsd->entries = + (struct de *)realloc2(dsd->entries, + dsd->arr_size * sizeof(dsd->entries[0])); + } + if (dsd->entries == NULL) { + /* TODO(lsm, low): propagate an error to the caller */ + dsd->num_entries = 0; + } else { + dsd->entries[dsd->num_entries].file_name = mg_strdup(de->file_name); + dsd->entries[dsd->num_entries].file = de->file; + dsd->entries[dsd->num_entries].conn = de->conn; + dsd->num_entries++; + } +} + +static void +handle_directory_request(struct mg_connection *conn, const char *dir) +{ + unsigned int i; + int sort_direction; + struct dir_scan_data data = {NULL, 0, 128}; + char date[64]; + time_t curtime = time(NULL); + + if (!scan_directory(conn, dir, &data, dir_scan_callback)) { + send_http_error(conn, + 500, + "Error: Cannot open directory\nopendir(%s): %s", + dir, + strerror(ERRNO)); + return; + } + + gmt_time_string(date, sizeof(date), &curtime); + + if (!conn) { + return; + } + + sort_direction = conn->request_info.query_string != NULL + && conn->request_info.query_string[1] == 'd' + ? 'a' + : 'd'; + + conn->must_close = 1; + mg_printf(conn, + "HTTP/1.1 200 OK\r\n" + "Date: %s\r\n" + "Connection: close\r\n" + "Content-Type: text/html; charset=utf-8\r\n\r\n", + date); + + conn->num_bytes_sent += + mg_printf(conn, + "Index of %s" + "" + "

Index of %s

"
+	              ""
+	              ""
+	              ""
+	              "",
+	              conn->request_info.local_uri,
+	              conn->request_info.local_uri,
+	              sort_direction,
+	              sort_direction,
+	              sort_direction);
+
+	/* Print first entry - link to a parent directory */
+	conn->num_bytes_sent +=
+	    mg_printf(conn,
+	              ""
+	              "\n",
+	              conn->request_info.local_uri,
+	              "..",
+	              "Parent directory",
+	              "-",
+	              "-");
+
+	/* Sort and print directory entries */
+	if (data.entries != NULL) {
+		qsort(data.entries,
+		      (size_t)data.num_entries,
+		      sizeof(data.entries[0]),
+		      compare_dir_entries);
+		for (i = 0; i < data.num_entries; i++) {
+			print_dir_entry(&data.entries[i]);
+			mg_free(data.entries[i].file_name);
+		}
+		mg_free(data.entries);
+	}
+
+	conn->num_bytes_sent += mg_printf(conn, "%s", "
NameModifiedSize

%s %s  %s
"); + conn->status_code = 200; +} + +/* Send len bytes from the opened file to the client. */ +static void +send_file_data(struct mg_connection *conn, + struct file *filep, + int64_t offset, + int64_t len) +{ + char buf[MG_BUF_LEN]; + int to_read, num_read, num_written; + int64_t size; + + if (!filep || !conn) { + return; + } + + /* Sanity check the offset */ + size = filep->size > INT64_MAX ? INT64_MAX : (int64_t)(filep->size); + offset = offset < 0 ? 0 : offset > size ? size : offset; + + if (len > 0 && filep->membuf != NULL && size > 0) { + /* file stored in memory */ + if (len > size - offset) { + len = size - offset; + } + mg_write(conn, filep->membuf + offset, (size_t)len); + } else if (len > 0 && filep->fp != NULL) { +/* file stored on disk */ +#if defined(__linux__) + /* sendfile is only available for Linux */ + if (conn->throttle == 0 && conn->ssl == 0) { + off_t sf_offs = (off_t)offset; + ssize_t sf_sent; + int sf_file = fileno(filep->fp); + int loop_cnt = 0; + + do { + /* 2147479552 (0x7FFFF000) is a limit found by experiment on + * 64 bit Linux (2^31 minus one memory page of 4k?). */ + size_t sf_tosend = + (size_t)((len < 0x7FFFF000) ? len : 0x7FFFF000); + sf_sent = + sendfile(conn->client.sock, sf_file, &sf_offs, sf_tosend); + if (sf_sent > 0) { + conn->num_bytes_sent += sf_sent; + len -= sf_sent; + offset += sf_sent; + } else if (loop_cnt == 0) { + /* This file can not be sent using sendfile. + * This might be the case for pseudo-files in the + * /sys/ and /proc/ file system. + * Use the regular user mode copy code instead. */ + break; + } else if (sf_sent == 0) { + /* No error, but 0 bytes sent. May be EOF? */ + return; + } + loop_cnt++; + + } while ((len > 0) && (sf_sent >= 0)); + + if (sf_sent > 0) { + return; /* OK */ + } + + /* sf_sent<0 means error, thus fall back to the classic way */ + /* This is always the case, if sf_file is not a "normal" file, + * e.g., for sending data from the output of a CGI process. */ + offset = (int64_t)sf_offs; + } +#endif + if ((offset > 0) && (fseeko(filep->fp, offset, SEEK_SET) != 0)) { + mg_cry(conn, "%s: fseeko() failed: %s", __func__, strerror(ERRNO)); + send_http_error( + conn, + 500, + "%s", + "Error: Unable to access file at requested position."); + } else { + while (len > 0) { + /* Calculate how much to read from the file in the buffer */ + to_read = sizeof(buf); + if ((int64_t)to_read > len) { + to_read = (int)len; + } + + /* Read from file, exit the loop on error */ + if ((num_read = (int)fread(buf, 1, (size_t)to_read, filep->fp)) + <= 0) { + break; + } + + /* Send read bytes to the client, exit the loop on error */ + if ((num_written = mg_write(conn, buf, (size_t)num_read)) + != num_read) { + break; + } + + /* Both read and were successful, adjust counters */ + conn->num_bytes_sent += num_written; + len -= num_written; + } + } + } +} + +static int +parse_range_header(const char *header, int64_t *a, int64_t *b) +{ + return sscanf(header, "bytes=%" INT64_FMT "-%" INT64_FMT, a, b); +} + +static void +construct_etag(char *buf, size_t buf_len, const struct file *filep) +{ + if (filep != NULL && buf != NULL) { + mg_snprintf(NULL, + NULL, /* All calls to construct_etag use 64 byte buffer */ + buf, + buf_len, + "\"%lx.%" INT64_FMT "\"", + (unsigned long)filep->last_modified, + filep->size); + } +} + +static void +fclose_on_exec(struct file *filep, struct mg_connection *conn) +{ + if (filep != NULL && filep->fp != NULL) { +#ifdef _WIN32 + (void)conn; /* Unused. */ +#else + if (fcntl(fileno(filep->fp), F_SETFD, FD_CLOEXEC) != 0) { + mg_cry(conn, + "%s: fcntl(F_SETFD FD_CLOEXEC) failed: %s", + __func__, + strerror(ERRNO)); + } +#endif + } +} + +static void +handle_static_file_request(struct mg_connection *conn, + const char *path, + struct file *filep) +{ + char date[64], lm[64], etag[64]; + char range[128]; /* large enough, so there will be no overflow */ + const char *msg = "OK", *hdr; + time_t curtime = time(NULL); + int64_t cl, r1, r2; + struct vec mime_vec; + int n, truncated; + char gz_path[PATH_MAX]; + const char *encoding = ""; + const char *cors1, *cors2, *cors3; + + if (conn == NULL || conn->ctx == NULL || filep == NULL) { + return; + } + + get_mime_type(conn->ctx, path, &mime_vec); + if (filep->size > INT64_MAX) { + send_http_error(conn, + 500, + "Error: File size is too large to send\n%" INT64_FMT, + filep->size); + } + cl = (int64_t)filep->size; + conn->status_code = 200; + range[0] = '\0'; + + /* if this file is in fact a pre-gzipped file, rewrite its filename + * it's important to rewrite the filename after resolving + * the mime type from it, to preserve the actual file's type */ + if (filep->gzipped) { + mg_snprintf(conn, &truncated, gz_path, sizeof(gz_path), "%s.gz", path); + + if (truncated) { + send_http_error(conn, + 500, + "Error: Path of zipped file too long (%s)", + path); + return; + } + + path = gz_path; + encoding = "Content-Encoding: gzip\r\n"; + } + + if (!mg_fopen(conn, path, "rb", filep)) { + send_http_error(conn, + 500, + "Error: Cannot open file\nfopen(%s): %s", + path, + strerror(ERRNO)); + return; + } + + fclose_on_exec(filep, conn); + + /* If Range: header specified, act accordingly */ + r1 = r2 = 0; + hdr = mg_get_header(conn, "Range"); + if (hdr != NULL && (n = parse_range_header(hdr, &r1, &r2)) > 0 && r1 >= 0 + && r2 >= 0) { + /* actually, range requests don't play well with a pre-gzipped + * file (since the range is specified in the uncompressed space) */ + if (filep->gzipped) { + send_http_error( + conn, + 501, + "%s", + "Error: Range requests in gzipped files are not supported"); + mg_fclose(filep); + return; + } + conn->status_code = 206; + cl = n == 2 ? (r2 > cl ? cl : r2) - r1 + 1 : cl - r1; + mg_snprintf(conn, + NULL, /* range buffer is big enough */ + range, + sizeof(range), + "Content-Range: bytes " + "%" INT64_FMT "-%" INT64_FMT "/%" INT64_FMT "\r\n", + r1, + r1 + cl - 1, + filep->size); + msg = "Partial Content"; + } + + hdr = mg_get_header(conn, "Origin"); + if (hdr) { + /* Cross-origin resource sharing (CORS), see + * http://www.html5rocks.com/en/tutorials/cors/, + * http://www.html5rocks.com/static/images/cors_server_flowchart.png - + * preflight is not supported for files. */ + cors1 = "Access-Control-Allow-Origin: "; + cors2 = conn->ctx->config[ACCESS_CONTROL_ALLOW_ORIGIN]; + cors3 = "\r\n"; + } else { + cors1 = cors2 = cors3 = ""; + } + + /* Prepare Etag, Date, Last-Modified headers. Must be in UTC, according to + * http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3 */ + gmt_time_string(date, sizeof(date), &curtime); + gmt_time_string(lm, sizeof(lm), &filep->last_modified); + construct_etag(etag, sizeof(etag), filep); + + (void)mg_printf(conn, + "HTTP/1.1 %d %s\r\n" + "%s%s%s" + "Date: %s\r\n" + "Last-Modified: %s\r\n" + "Etag: %s\r\n" + "Content-Type: %.*s\r\n" + "Content-Length: %" INT64_FMT "\r\n" + "Connection: %s\r\n" + "Accept-Ranges: bytes\r\n" + "%s%s\r\n", + conn->status_code, + msg, + cors1, + cors2, + cors3, + date, + lm, + etag, + (int)mime_vec.len, + mime_vec.ptr, + cl, + suggest_connection_header(conn), + range, + encoding); + + if (strcmp(conn->request_info.request_method, "HEAD") != 0) { + send_file_data(conn, filep, r1, cl); + } + mg_fclose(filep); +} + +void +mg_send_file(struct mg_connection *conn, const char *path) +{ + struct file file = STRUCT_FILE_INITIALIZER; + if (mg_stat(conn, path, &file)) { + if (file.is_directory) { + if (!conn) { + return; + } + if (!mg_strcasecmp(conn->ctx->config[ENABLE_DIRECTORY_LISTING], + "yes")) { + handle_directory_request(conn, path); + } else { + send_http_error(conn, + 403, + "%s", + "Error: Directory listing denied"); + } + } else { + handle_static_file_request(conn, path, &file); + } + } else { + send_http_error(conn, 404, "%s", "Error: File not found"); + } +} + +/* Parse HTTP headers from the given buffer, advance buffer to the point + * where parsing stopped. */ +static void +parse_http_headers(char **buf, struct mg_request_info *ri) +{ + int i; + + if (!ri) { + return; + } + + ri->num_headers = 0; + + for (i = 0; i < (int)ARRAY_SIZE(ri->http_headers); i++) { + ri->http_headers[i].name = skip_quoted(buf, ":", " ", 0); + ri->http_headers[i].value = skip(buf, "\r\n"); + if (ri->http_headers[i].name[0] == '\0') { + break; + } + ri->num_headers = i + 1; + } +} + +static int +is_valid_http_method(const char *method) +{ + return !strcmp(method, "GET") || !strcmp(method, "POST") + || !strcmp(method, "HEAD") || !strcmp(method, "CONNECT") + || !strcmp(method, "PUT") || !strcmp(method, "DELETE") + || !strcmp(method, "OPTIONS") || !strcmp(method, "PROPFIND") + || !strcmp(method, "MKCOL") || !strcmp(method, "PATCH"); + + /* TRACE method is not supported for security reasons */ + /* PATCH method (RFC 5789) only allowed for CGI/Lua/LSP and callbacks. */ +} + +/* Parse HTTP request, fill in mg_request_info structure. + * This function modifies the buffer by NUL-terminating + * HTTP request components, header names and header values. */ +static int +parse_http_message(char *buf, int len, struct mg_request_info *ri) +{ + int is_request, request_length; + + if (!ri) { + return 0; + } + + request_length = get_request_len(buf, len); + + if (request_length > 0) { + /* Reset attributes. DO NOT TOUCH is_ssl, remote_ip, remote_addr, + * remote_port */ + ri->remote_user = ri->request_method = ri->request_uri = + ri->http_version = NULL; + ri->num_headers = 0; + + buf[request_length - 1] = '\0'; + + /* RFC says that all initial whitespaces should be ingored */ + while (*buf != '\0' && isspace(*(unsigned char *)buf)) { + buf++; + } + ri->request_method = skip(&buf, " "); + ri->request_uri = skip(&buf, " "); + ri->http_version = skip(&buf, "\r\n"); + + /* HTTP message could be either HTTP request or HTTP response, e.g. + * "GET / HTTP/1.0 ...." or "HTTP/1.0 200 OK ..." */ + is_request = is_valid_http_method(ri->request_method); + if ((is_request && memcmp(ri->http_version, "HTTP/", 5) != 0) + || (!is_request && memcmp(ri->request_method, "HTTP/", 5) != 0)) { + request_length = -1; + } else { + if (is_request) { + ri->http_version += 5; + } + parse_http_headers(&buf, ri); + } + } + return request_length; +} + +/* Keep reading the input (either opened file descriptor fd, or socket sock, + * or SSL descriptor ssl) into buffer buf, until \r\n\r\n appears in the + * buffer (which marks the end of HTTP request). Buffer buf may already + * have some data. The length of the data is stored in nread. + * Upon every read operation, increase nread by the number of bytes read. */ +static int +read_request(FILE *fp, + struct mg_connection *conn, + char *buf, + int bufsiz, + int *nread) +{ + int request_len, n = 0; + struct timespec last_action_time; + double request_timeout; + + if (!conn) { + return 0; + } + + memset(&last_action_time, 0, sizeof(last_action_time)); + + if (conn->ctx->config[REQUEST_TIMEOUT]) { + /* value of request_timeout is in seconds, config in milliseconds */ + request_timeout = atof(conn->ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } else { + request_timeout = -1.0; + } + + request_len = get_request_len(buf, *nread); + while ( + (conn->ctx->stop_flag == 0) && (*nread < bufsiz) && (request_len == 0) + && ((mg_difftimespec(&last_action_time, &(conn->req_time)) + <= request_timeout) || (request_timeout < 0)) + && ((n = pull(fp, conn, buf + *nread, bufsiz - *nread, request_timeout)) + > 0)) { + *nread += n; + /* assert(*nread <= bufsiz); */ + if (*nread > bufsiz) { + return -2; + } + request_len = get_request_len(buf, *nread); + if (request_timeout > 0.0) { + clock_gettime(CLOCK_MONOTONIC, &last_action_time); + } + } + + return (request_len <= 0 && n <= 0) ? -1 : request_len; +} + +#if !defined(NO_FILES) +/* For given directory path, substitute it to valid index file. + * Return 1 if index file has been found, 0 if not found. + * If the file is found, it's stats is returned in stp. */ +static int +substitute_index_file(struct mg_connection *conn, + char *path, + size_t path_len, + struct file *filep) +{ + if (conn && conn->ctx) { + const char *list = conn->ctx->config[INDEX_FILES]; + struct file file = STRUCT_FILE_INITIALIZER; + struct vec filename_vec; + size_t n = strlen(path); + int found = 0; + + /* The 'path' given to us points to the directory. Remove all trailing + * directory separator characters from the end of the path, and + * then append single directory separator character. */ + while (n > 0 && path[n - 1] == '/') { + n--; + } + path[n] = '/'; + + /* Traverse index files list. For each entry, append it to the given + * path and see if the file exists. If it exists, break the loop */ + while ((list = next_option(list, &filename_vec, NULL)) != NULL) { + /* Ignore too long entries that may overflow path buffer */ + if (filename_vec.len > path_len - (n + 2)) { + continue; + } + + /* Prepare full path to the index file */ + mg_strlcpy(path + n + 1, filename_vec.ptr, filename_vec.len + 1); + + /* Does it exist? */ + if (mg_stat(conn, path, &file)) { + /* Yes it does, break the loop */ + *filep = file; + found = 1; + break; + } + } + + /* If no index file exists, restore directory path */ + if (!found) { + path[n] = '\0'; + } + + return found; + } + return 0; +} +#endif + +/* Return True if we should reply 304 Not Modified. */ +static int +is_not_modified(const struct mg_connection *conn, const struct file *filep) +{ + char etag[64]; + const char *ims = mg_get_header(conn, "If-Modified-Since"); + const char *inm = mg_get_header(conn, "If-None-Match"); + construct_etag(etag, sizeof(etag), filep); + if (!filep) { + return 0; + } + return (inm != NULL && !mg_strcasecmp(etag, inm)) + || (ims != NULL && (filep->last_modified <= parse_date_string(ims))); +} + +#if !defined(NO_CGI) || !defined(NO_FILES) +static int +forward_body_data(struct mg_connection *conn, FILE *fp, SOCKET sock, SSL *ssl) +{ + const char *expect, *body; + char buf[MG_BUF_LEN]; + int to_read, nread, success = 0; + int64_t buffered_len; + double timeout = -1.0; + + if (!conn) { + return 0; + } + if (conn->ctx->config[REQUEST_TIMEOUT]) { + timeout = atoi(conn->ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } + + expect = mg_get_header(conn, "Expect"); + /* assert(fp != NULL); */ + if (!fp) { + send_http_error(conn, 500, "%s", "Error: NULL File"); + return 0; + } + + if (conn->content_len == -1 && !conn->is_chunked) { + /* Content length is not specified by the client. */ + send_http_error(conn, + 411, + "%s", + "Error: Client did not specify content length"); + } else if ((expect != NULL) + && (mg_strcasecmp(expect, "100-continue") != 0)) { + /* Client sent an "Expect: xyz" header and xyz is not 100-continue. */ + send_http_error(conn, + 417, + "Error: Can not fulfill expectation %s", + expect); + } else { + if (expect != NULL) { + (void)mg_printf(conn, "%s", "HTTP/1.1 100 Continue\r\n\r\n"); + conn->status_code = 100; + } else { + conn->status_code = 200; + } + + buffered_len = (int64_t)(conn->data_len) - (int64_t)conn->request_len + - conn->consumed_content; + + /* assert(buffered_len >= 0); */ + /* assert(conn->consumed_content == 0); */ + + if ((buffered_len < 0) || (conn->consumed_content != 0)) { + send_http_error(conn, 500, "%s", "Error: Size mismatch"); + return 0; + } + + if (buffered_len > 0) { + if ((int64_t)buffered_len > conn->content_len) { + buffered_len = (int)conn->content_len; + } + body = conn->buf + conn->request_len + conn->consumed_content; + push_all(conn->ctx, fp, sock, ssl, body, (int64_t)buffered_len); + conn->consumed_content += buffered_len; + } + + nread = 0; + while (conn->consumed_content < conn->content_len) { + to_read = sizeof(buf); + if ((int64_t)to_read > conn->content_len - conn->consumed_content) { + to_read = (int)(conn->content_len - conn->consumed_content); + } + nread = pull(NULL, conn, buf, to_read, timeout); + if (nread <= 0 + || push_all(conn->ctx, fp, sock, ssl, buf, nread) != nread) { + break; + } + conn->consumed_content += nread; + } + + if (conn->consumed_content == conn->content_len) { + success = nread >= 0; + } + + /* Each error code path in this function must send an error */ + if (!success) { + /* NOTE: Maybe some data has already been sent. */ + /* TODO (low): If some data has been sent, a correct error + * reply can no longer be sent, so just close the connection */ + send_http_error(conn, 500, "%s", ""); + } + } + + return success; +} +#endif + +#if !defined(NO_CGI) +/* This structure helps to create an environment for the spawned CGI program. + * Environment is an array of "VARIABLE=VALUE\0" ASCIIZ strings, + * last element must be NULL. + * However, on Windows there is a requirement that all these VARIABLE=VALUE\0 + * strings must reside in a contiguous buffer. The end of the buffer is + * marked by two '\0' characters. + * We satisfy both worlds: we create an envp array (which is vars), all + * entries are actually pointers inside buf. */ +struct cgi_environment { + struct mg_connection *conn; + /* Data block */ + char *buf; /* Environment buffer */ + size_t buflen; /* Space available in buf */ + size_t bufused; /* Space taken in buf */ + /* Index block */ + char **var; /* char **envp */ + size_t varlen; /* Number of variables available in var */ + size_t varused; /* Number of variables stored in var */ +}; + +static void addenv(struct cgi_environment *env, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(2, 3); + +/* Append VARIABLE=VALUE\0 string to the buffer, and add a respective + * pointer into the vars array. Assumes env != NULL and fmt != NULL. */ +static void +addenv(struct cgi_environment *env, const char *fmt, ...) +{ + size_t n, space; + int truncated; + char *added; + va_list ap; + + /* Calculate how much space is left in the buffer */ + space = (env->buflen - env->bufused); + + /* Calculate an estimate for the required space */ + n = strlen(fmt) + 2 + 128; + + do { + if (space <= n) { + /* Allocate new buffer */ + n = env->buflen + CGI_ENVIRONMENT_SIZE; + added = (char *)mg_realloc(env->buf, n); + if (!added) { + /* Out of memory */ + mg_cry(env->conn, + "%s: Cannot allocate memory for CGI variable [%s]", + __func__, + fmt); + return; + } + env->buf = added; + env->buflen = n; + space = (env->buflen - env->bufused); + } + + /* Make a pointer to the free space int the buffer */ + added = env->buf + env->bufused; + + /* Copy VARIABLE=VALUE\0 string into the free space */ + va_start(ap, fmt); + mg_vsnprintf(env->conn, &truncated, added, (size_t)space, fmt, ap); + va_end(ap); + + /* Do not add truncated strings to the environment */ + if (truncated) { + /* Reallocate the buffer */ + space = 0; + n = 1; + } + } while (truncated); + + /* Calculate number of bytes added to the environment */ + n = strlen(added) + 1; + env->bufused += n; + + /* Now update the variable index */ + space = (env->varlen - env->varused); + if (space < 2) { + mg_cry(env->conn, + "%s: Cannot register CGI variable [%s]", + __func__, + fmt); + return; + } + + /* Append a pointer to the added string into the envp array */ + env->var[env->varused] = added; + env->varused++; +} + +static void +prepare_cgi_environment(struct mg_connection *conn, + const char *prog, + struct cgi_environment *env) +{ + const char *s; + struct vec var_vec; + char *p, src_addr[IP_ADDR_STR_LEN], http_var_name[128]; + int i, truncated; + + if (conn == NULL || prog == NULL || env == NULL) { + return; + } + + env->conn = conn; + env->buflen = CGI_ENVIRONMENT_SIZE; + env->bufused = 0; + env->buf = (char *)mg_malloc(env->buflen); + env->varlen = MAX_CGI_ENVIR_VARS; + env->varused = 0; + env->var = (char **)mg_malloc(env->buflen * sizeof(char *)); + + addenv(env, "SERVER_NAME=%s", conn->ctx->config[AUTHENTICATION_DOMAIN]); + addenv(env, "SERVER_ROOT=%s", conn->ctx->config[DOCUMENT_ROOT]); + addenv(env, "DOCUMENT_ROOT=%s", conn->ctx->config[DOCUMENT_ROOT]); + addenv(env, "SERVER_SOFTWARE=%s/%s", "Civetweb", mg_version()); + + /* Prepare the environment block */ + addenv(env, "%s", "GATEWAY_INTERFACE=CGI/1.1"); + addenv(env, "%s", "SERVER_PROTOCOL=HTTP/1.1"); + addenv(env, "%s", "REDIRECT_STATUS=200"); /* For PHP */ + +#if defined(USE_IPV6) + if (conn->client.lsa.sa.sa_family == AF_INET6) { + addenv(env, "SERVER_PORT=%d", ntohs(conn->client.lsa.sin6.sin6_port)); + } else +#endif + { + addenv(env, "SERVER_PORT=%d", ntohs(conn->client.lsa.sin.sin_port)); + } + + sockaddr_to_string(src_addr, sizeof(src_addr), &conn->client.rsa); + addenv(env, "REMOTE_ADDR=%s", src_addr); + + addenv(env, "REQUEST_METHOD=%s", conn->request_info.request_method); + addenv(env, "REMOTE_PORT=%d", conn->request_info.remote_port); + + addenv(env, "REQUEST_URI=%s", conn->request_info.request_uri); + addenv(env, "LOCAL_URI=%s", conn->request_info.local_uri); + + /* SCRIPT_NAME */ + addenv(env, + "SCRIPT_NAME=%.*s", + (int)strlen(conn->request_info.local_uri) + - ((conn->path_info == NULL) ? 0 : (int)strlen(conn->path_info)), + conn->request_info.local_uri); + + addenv(env, "SCRIPT_FILENAME=%s", prog); + if (conn->path_info == NULL) { + addenv(env, "PATH_TRANSLATED=%s", conn->ctx->config[DOCUMENT_ROOT]); + } else { + addenv(env, + "PATH_TRANSLATED=%s%s", + conn->ctx->config[DOCUMENT_ROOT], + conn->path_info); + } + + addenv(env, "HTTPS=%s", conn->ssl == NULL ? "off" : "on"); + + if ((s = mg_get_header(conn, "Content-Type")) != NULL) { + addenv(env, "CONTENT_TYPE=%s", s); + } + if (conn->request_info.query_string != NULL) { + addenv(env, "QUERY_STRING=%s", conn->request_info.query_string); + } + if ((s = mg_get_header(conn, "Content-Length")) != NULL) { + addenv(env, "CONTENT_LENGTH=%s", s); + } + if ((s = getenv("PATH")) != NULL) { + addenv(env, "PATH=%s", s); + } + if (conn->path_info != NULL) { + addenv(env, "PATH_INFO=%s", conn->path_info); + } + + if (conn->status_code > 0) { + /* CGI error handler should show the status code */ + addenv(env, "STATUS=%d", conn->status_code); + } + +#if defined(_WIN32) + if ((s = getenv("COMSPEC")) != NULL) { + addenv(env, "COMSPEC=%s", s); + } + if ((s = getenv("SYSTEMROOT")) != NULL) { + addenv(env, "SYSTEMROOT=%s", s); + } + if ((s = getenv("SystemDrive")) != NULL) { + addenv(env, "SystemDrive=%s", s); + } + if ((s = getenv("ProgramFiles")) != NULL) { + addenv(env, "ProgramFiles=%s", s); + } + if ((s = getenv("ProgramFiles(x86)")) != NULL) { + addenv(env, "ProgramFiles(x86)=%s", s); + } +#else + if ((s = getenv("LD_LIBRARY_PATH")) != NULL) { + addenv(env, "LD_LIBRARY_PATH=%s", s); + } +#endif /* _WIN32 */ + + if ((s = getenv("PERLLIB")) != NULL) { + addenv(env, "PERLLIB=%s", s); + } + + if (conn->request_info.remote_user != NULL) { + addenv(env, "REMOTE_USER=%s", conn->request_info.remote_user); + addenv(env, "%s", "AUTH_TYPE=Digest"); + } + + /* Add all headers as HTTP_* variables */ + for (i = 0; i < conn->request_info.num_headers; i++) { + + (void)mg_snprintf(conn, + &truncated, + http_var_name, + sizeof(http_var_name), + "HTTP_%s", + conn->request_info.http_headers[i].name); + + if (truncated) { + mg_cry(conn, + "%s: HTTP header variable too long [%s]", + __func__, + conn->request_info.http_headers[i].name); + continue; + } + + /* Convert variable name into uppercase, and change - to _ */ + for (p = http_var_name; *p != '\0'; p++) { + if (*p == '-') { + *p = '_'; + } + *p = (char)toupper(*(unsigned char *)p); + } + + addenv(env, + "%s=%s", + http_var_name, + conn->request_info.http_headers[i].value); + } + + /* Add user-specified variables */ + s = conn->ctx->config[CGI_ENVIRONMENT]; + while ((s = next_option(s, &var_vec, NULL)) != NULL) { + addenv(env, "%.*s", (int)var_vec.len, var_vec.ptr); + } + + env->var[env->varused] = NULL; + env->buf[env->bufused] = '\0'; +} + +static void +handle_cgi_request(struct mg_connection *conn, const char *prog) +{ + char *buf; + size_t buflen; + int headers_len, data_len, i, truncated; + int fdin[2] = {-1, -1}, fdout[2] = {-1, -1}, fderr[2] = {-1, -1}; + const char *status, *status_text, *connection_state; + char *pbuf, dir[PATH_MAX], *p; + struct mg_request_info ri; + struct cgi_environment blk; + FILE *in = NULL, *out = NULL, *err = NULL; + struct file fout = STRUCT_FILE_INITIALIZER; + pid_t pid = (pid_t)-1; + + if (conn == NULL) { + return; + } + + buf = NULL; + buflen = 16384; + prepare_cgi_environment(conn, prog, &blk); + + /* CGI must be executed in its own directory. 'dir' must point to the + * directory containing executable program, 'p' must point to the + * executable program name relative to 'dir'. */ + (void)mg_snprintf(conn, &truncated, dir, sizeof(dir), "%s", prog); + + if (truncated) { + mg_cry(conn, "Error: CGI program \"%s\": Path too long", prog); + send_http_error(conn, 500, "Error: %s", "CGI path too long"); + goto done; + } + + if ((p = strrchr(dir, '/')) != NULL) { + *p++ = '\0'; + } else { + dir[0] = '.', dir[1] = '\0'; + p = (char *)prog; + } + + if (pipe(fdin) != 0 || pipe(fdout) != 0 || pipe(fderr) != 0) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not create CGI pipes: %s", + prog, + status); + send_http_error(conn, 500, "Error: Cannot create CGI pipe: %s", status); + goto done; + } + + pid = spawn_process( + conn, p, blk.buf, blk.var, fdin[0], fdout[1], fderr[1], dir); + + if (pid == (pid_t)-1) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not spawn CGI process: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: Cannot spawn CGI process [%s]: %s", + prog, + status); + goto done; + } + + /* Make sure child closes all pipe descriptors. It must dup them to 0,1 */ + set_close_on_exec((SOCKET)fdin[0], conn); + set_close_on_exec((SOCKET)fdin[1], conn); + set_close_on_exec((SOCKET)fdout[0], conn); + set_close_on_exec((SOCKET)fdout[1], conn); + set_close_on_exec((SOCKET)fderr[0], conn); + set_close_on_exec((SOCKET)fderr[1], conn); + + /* Parent closes only one side of the pipes. + * If we don't mark them as closed, close() attempt before + * return from this function throws an exception on Windows. + * Windows does not like when closed descriptor is closed again. */ + (void)close(fdin[0]); + (void)close(fdout[1]); + (void)close(fderr[1]); + fdin[0] = fdout[1] = fderr[1] = -1; + + if ((in = fdopen(fdin[1], "wb")) == NULL) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not open stdin: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: CGI can not open fdin\nfopen: %s", + status); + goto done; + } + + if ((out = fdopen(fdout[0], "rb")) == NULL) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not open stdout: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: CGI can not open fdout\nfopen: %s", + status); + goto done; + } + + if ((err = fdopen(fderr[0], "rb")) == NULL) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not open stderr: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: CGI can not open fdout\nfopen: %s", + status); + goto done; + } + + setbuf(in, NULL); + setbuf(out, NULL); + setbuf(err, NULL); + fout.fp = out; + + /* Send POST or PUT data to the CGI process if needed */ + /* TODO(high): Methods like PATCH, MKCOL, ... also have body data. */ + if (!mg_strcasecmp(conn->request_info.request_method, "POST") + || !mg_strcasecmp(conn->request_info.request_method, "PUT")) { + /* This is a POST/PUT request */ + if (!forward_body_data(conn, in, INVALID_SOCKET, NULL)) { + /* Error sending the body data */ + mg_cry(conn, + "Error: CGI program \"%s\": Forward body data failed", + prog); + goto done; + } + } + + /* Close so child gets an EOF. */ + fclose(in); + in = NULL; + fdin[1] = -1; + + /* Now read CGI reply into a buffer. We need to set correct + * status code, thus we need to see all HTTP headers first. + * Do not send anything back to client, until we buffer in all + * HTTP headers. */ + data_len = 0; + buf = (char *)mg_malloc(buflen); + if (buf == NULL) { + send_http_error(conn, + 500, + "Error: Not enough memory for CGI buffer (%u bytes)", + (unsigned int)buflen); + mg_cry(conn, + "Error: CGI program \"%s\": Not enough memory for buffer (%u " + "bytes)", + prog, + (unsigned int)buflen); + goto done; + } + headers_len = read_request(out, conn, buf, (int)buflen, &data_len); + if (headers_len <= 0) { + + /* Could not parse the CGI response. Check if some error message on + * stderr. */ + i = pull_all(err, conn, buf, (int)buflen); + if (i > 0) { + mg_cry(conn, + "Error: CGI program \"%s\" sent error " + "message: [%.*s]", + prog, + i, + buf); + send_http_error(conn, + 500, + "Error: CGI program \"%s\" sent error " + "message: [%.*s]", + prog, + i, + buf); + } else { + mg_cry(conn, + "Error: CGI program sent malformed or too big " + "(>%u bytes) HTTP headers: [%.*s]", + (unsigned)buflen, + data_len, + buf); + + send_http_error(conn, + 500, + "Error: CGI program sent malformed or too big " + "(>%u bytes) HTTP headers: [%.*s]", + (unsigned)buflen, + data_len, + buf); + } + + goto done; + } + pbuf = buf; + buf[headers_len - 1] = '\0'; + parse_http_headers(&pbuf, &ri); + + /* Make up and send the status line */ + status_text = "OK"; + if ((status = get_header(&ri, "Status")) != NULL) { + conn->status_code = atoi(status); + status_text = status; + while (isdigit(*(unsigned char *)status_text) || *status_text == ' ') { + status_text++; + } + } else if (get_header(&ri, "Location") != NULL) { + conn->status_code = 302; + } else { + conn->status_code = 200; + } + connection_state = get_header(&ri, "Connection"); + if (connection_state == NULL + || mg_strcasecmp(connection_state, "keep-alive")) { + conn->must_close = 1; + } + (void)mg_printf(conn, "HTTP/1.1 %d %s\r\n", conn->status_code, status_text); + + /* Send headers */ + for (i = 0; i < ri.num_headers; i++) { + mg_printf(conn, + "%s: %s\r\n", + ri.http_headers[i].name, + ri.http_headers[i].value); + } + mg_write(conn, "\r\n", 2); + + /* Send chunk of data that may have been read after the headers */ + conn->num_bytes_sent += + mg_write(conn, buf + headers_len, (size_t)(data_len - headers_len)); + + /* Read the rest of CGI output and send to the client */ + send_file_data(conn, &fout, 0, INT64_MAX); + +done: + mg_free(blk.var); + mg_free(blk.buf); + + if (pid != (pid_t)-1) { + kill(pid, SIGKILL); +#if !defined(_WIN32) + { + int st; + while (waitpid(pid, &st, 0) != -1) + ; /* clean zombies */ + } +#endif + } + if (fdin[0] != -1) { + close(fdin[0]); + } + if (fdout[1] != -1) { + close(fdout[1]); + } + + if (in != NULL) { + fclose(in); + } else if (fdin[1] != -1) { + close(fdin[1]); + } + + if (out != NULL) { + fclose(out); + } else if (fdout[0] != -1) { + close(fdout[0]); + } + + if (err != NULL) { + fclose(err); + } else if (fderr[0] != -1) { + close(fderr[0]); + } + + if (buf != NULL) { + mg_free(buf); + } +} +#endif /* !NO_CGI */ + +#if !defined(NO_FILES) +/* For a given PUT path, create all intermediate subdirectories. + * Return 0 if the path itself is a directory. + * Return 1 if the path leads to a file. + * Return -1 for if the path is too long. + * Return -2 if path can not be created. +*/ +static int +put_dir(struct mg_connection *conn, const char *path) +{ + char buf[PATH_MAX]; + const char *s, *p; + struct file file = STRUCT_FILE_INITIALIZER; + size_t len; + int res = 1; + + for (s = p = path + 2; (p = strchr(s, '/')) != NULL; s = ++p) { + len = (size_t)(p - path); + if (len >= sizeof(buf)) { + /* path too long */ + res = -1; + break; + } + memcpy(buf, path, len); + buf[len] = '\0'; + + /* Try to create intermediate directory */ + DEBUG_TRACE("mkdir(%s)", buf); + if (!mg_stat(conn, buf, &file) && mg_mkdir(buf, 0755) != 0) { + /* path does not exixt and can not be created */ + res = -2; + break; + } + + /* Is path itself a directory? */ + if (p[1] == '\0') { + res = 0; + } + } + + return res; +} + +static void +mkcol(struct mg_connection *conn, const char *path) +{ + int rc, body_len; + struct de de; + char date[64]; + time_t curtime = time(NULL); + + if (conn == NULL) { + return; + } + + /* TODO (mid): Check the send_http_error situations in this function */ + + memset(&de.file, 0, sizeof(de.file)); + if (!mg_stat(conn, path, &de.file)) { + mg_cry(conn, + "%s: mg_stat(%s) failed: %s", + __func__, + path, + strerror(ERRNO)); + } + + if (de.file.last_modified) { + /* TODO (high): This check does not seem to make any sense ! */ + send_http_error( + conn, 405, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + return; + } + + body_len = conn->data_len - conn->request_len; + if (body_len > 0) { + send_http_error( + conn, 415, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + return; + } + + rc = mg_mkdir(path, 0755); + + if (rc == 0) { + conn->status_code = 201; + gmt_time_string(date, sizeof(date), &curtime); + mg_printf(conn, + "HTTP/1.1 %d Created\r\nDate: %s\r\nContent-Length: " + "0\r\nConnection: %s\r\n\r\n", + conn->status_code, + date, + suggest_connection_header(conn)); + } else if (rc == -1) { + if (errno == EEXIST) { + send_http_error( + conn, 405, "Error:mkcol(%s): %s", path, strerror(ERRNO)); + } else if (errno == EACCES) { + send_http_error( + conn, 403, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + } else if (errno == ENOENT) { + send_http_error( + conn, 409, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + } else { + send_http_error(conn, 500, "fopen(%s): %s", path, strerror(ERRNO)); + } + } +} + +static void +put_file(struct mg_connection *conn, const char *path) +{ + struct file file = STRUCT_FILE_INITIALIZER; + const char *range; + int64_t r1, r2; + int rc; + char date[64]; + time_t curtime = time(NULL); + + if (conn == NULL) { + return; + } + + if (mg_stat(conn, path, &file)) { + /* File already exists */ + conn->status_code = 200; + + if (file.is_directory) { + /* This is an already existing directory, + * so there is nothing to do for the server. */ + rc = 0; + + } else { + /* File exists and is not a directory. */ + /* Can it be replaced? */ + + if (file.membuf != NULL) { + /* This is an "in-memory" file, that can not be replaced */ + send_http_error( + conn, + 405, + "Error: Put not possible\nReplacing %s is not supported", + path); + return; + } + + /* Check if the server may write this file */ + if (access(path, W_OK) == 0) { + /* Access granted */ + conn->status_code = 200; + rc = 1; + } else { + send_http_error( + conn, + 403, + "Error: Put not possible\nReplacing %s is not allowed", + path); + return; + } + } + } else { + /* File should be created */ + conn->status_code = 201; + rc = put_dir(conn, path); + } + + if (rc == 0) { + /* put_dir returns 0 if path is a directory */ + gmt_time_string(date, sizeof(date), &curtime); + mg_printf(conn, + "HTTP/1.1 %d %s\r\n" + "Date: %s\r\n" + "Content-Length: 0\r\n" + "Connection: %s\r\n\r\n", + conn->status_code, + mg_get_response_code_text(conn->status_code, NULL), + date, + suggest_connection_header(conn)); + + /* Request to create a directory has been fulfilled successfully. + * No need to put a file. */ + return; + } + + if (rc == -1) { + /* put_dir returns -1 if the path is too long */ + send_http_error(conn, + 414, + "Error: Path too long\nput_dir(%s): %s", + path, + strerror(ERRNO)); + return; + } + + if (rc == -2) { + /* put_dir returns -2 if the directory can not be created */ + send_http_error(conn, + 500, + "Error: Can not create directory\nput_dir(%s): %s", + path, + strerror(ERRNO)); + return; + } + + /* A file should be created or overwritten. */ + if (!mg_fopen(conn, path, "wb+", &file) || file.fp == NULL) { + mg_fclose(&file); + send_http_error(conn, + 500, + "Error: Can not create file\nfopen(%s): %s", + path, + strerror(ERRNO)); + return; + } + + fclose_on_exec(&file, conn); + range = mg_get_header(conn, "Content-Range"); + r1 = r2 = 0; + if (range != NULL && parse_range_header(range, &r1, &r2) > 0) { + conn->status_code = 206; /* Partial content */ + fseeko(file.fp, r1, SEEK_SET); + } + + if (!forward_body_data(conn, file.fp, INVALID_SOCKET, NULL)) { + /* forward_body_data failed. + * The error code has already been sent to the client, + * and conn->status_code is already set. */ + return; + } + + gmt_time_string(date, sizeof(date), &curtime); + mg_printf(conn, + "HTTP/1.1 %d %s\r\n" + "Date: %s\r\n" + "Content-Length: 0\r\n" + "Connection: %s\r\n\r\n", + conn->status_code, + mg_get_response_code_text(conn->status_code, NULL), + date, + suggest_connection_header(conn)); + + mg_fclose(&file); +} + +static void +delete_file(struct mg_connection *conn, const char *path) +{ + struct de de; + memset(&de.file, 0, sizeof(de.file)); + if (!mg_stat(conn, path, &de.file)) { + /* mg_stat returns 0 if the file does not exist */ + send_http_error(conn, + 404, + "Error: Cannot delete file\nFile %s not found", + path); + return; + } + + if (de.file.membuf != NULL) { + /* the file is cached in memory */ + send_http_error( + conn, + 405, + "Error: Delete not possible\nDeleting %s is not supported", + path); + return; + } + + if (de.file.is_directory) { + remove_directory(conn, path); + /* TODO (mid): remove_dir does not return success of the operation */ + /* Assume delete is successful: Return 204 without content. */ + send_http_error(conn, 204, "%s", ""); + return; + } + + /* This is an existing file (not a directory). + * Check if write permission is granted. */ + if (access(path, W_OK) != 0) { + /* File is read only */ + send_http_error( + conn, + 403, + "Error: Delete not possible\nDeleting %s is not allowed", + path); + return; + } + + /* Try to delete it. */ + if (mg_remove(path) == 0) { + /* Delete was successful: Return 204 without content. */ + send_http_error(conn, 204, "%s", ""); + } else { + /* Delete not successful (file locked). */ + send_http_error(conn, + 423, + "Error: Cannot delete file\nremove(%s): %s", + path, + strerror(ERRNO)); + } +} +#endif /* !NO_FILES */ + +static void +send_ssi_file(struct mg_connection *, const char *, struct file *, int); + +static void +do_ssi_include(struct mg_connection *conn, + const char *ssi, + char *tag, + int include_level) +{ + char file_name[MG_BUF_LEN], path[512], *p; + struct file file = STRUCT_FILE_INITIALIZER; + size_t len; + int truncated = 0; + + if (conn == NULL) { + return; + } + + /* sscanf() is safe here, since send_ssi_file() also uses buffer + * of size MG_BUF_LEN to get the tag. So strlen(tag) is + * always < MG_BUF_LEN. */ + if (sscanf(tag, " virtual=\"%511[^\"]\"", file_name) == 1) { + /* File name is relative to the webserver root */ + file_name[511] = 0; + (void)mg_snprintf(conn, + &truncated, + path, + sizeof(path), + "%s/%s", + conn->ctx->config[DOCUMENT_ROOT], + file_name); + + } else if (sscanf(tag, " abspath=\"%511[^\"]\"", file_name) == 1) { + /* File name is relative to the webserver working directory + * or it is absolute system path */ + file_name[511] = 0; + (void) + mg_snprintf(conn, &truncated, path, sizeof(path), "%s", file_name); + + } else if (sscanf(tag, " file=\"%511[^\"]\"", file_name) == 1 + || sscanf(tag, " \"%511[^\"]\"", file_name) == 1) { + /* File name is relative to the currect document */ + file_name[511] = 0; + (void)mg_snprintf(conn, &truncated, path, sizeof(path), "%s", ssi); + + if (!truncated) { + if ((p = strrchr(path, '/')) != NULL) { + p[1] = '\0'; + } + len = strlen(path); + (void)mg_snprintf(conn, + &truncated, + path + len, + sizeof(path) - len, + "%s", + file_name); + } + + } else { + mg_cry(conn, "Bad SSI #include: [%s]", tag); + return; + } + + if (truncated) { + mg_cry(conn, "SSI #include path length overflow: [%s]", tag); + return; + } + + if (!mg_fopen(conn, path, "rb", &file)) { + mg_cry(conn, + "Cannot open SSI #include: [%s]: fopen(%s): %s", + tag, + path, + strerror(ERRNO)); + } else { + fclose_on_exec(&file, conn); + if (match_prefix(conn->ctx->config[SSI_EXTENSIONS], + strlen(conn->ctx->config[SSI_EXTENSIONS]), + path) > 0) { + send_ssi_file(conn, path, &file, include_level + 1); + } else { + send_file_data(conn, &file, 0, INT64_MAX); + } + mg_fclose(&file); + } +} + +#if !defined(NO_POPEN) +static void +do_ssi_exec(struct mg_connection *conn, char *tag) +{ + char cmd[1024] = ""; + struct file file = STRUCT_FILE_INITIALIZER; + + if (sscanf(tag, " \"%1023[^\"]\"", cmd) != 1) { + mg_cry(conn, "Bad SSI #exec: [%s]", tag); + } else { + cmd[1023] = 0; + if ((file.fp = popen(cmd, "r")) == NULL) { + mg_cry(conn, "Cannot SSI #exec: [%s]: %s", cmd, strerror(ERRNO)); + } else { + send_file_data(conn, &file, 0, INT64_MAX); + pclose(file.fp); + } + } +} +#endif /* !NO_POPEN */ + +static int +mg_fgetc(struct file *filep, int offset) +{ + if (filep == NULL) { + return EOF; + } + if (filep->membuf != NULL && offset >= 0 + && ((unsigned int)(offset)) < filep->size) { + return ((unsigned char *)filep->membuf)[offset]; + } else if (filep->fp != NULL) { + return fgetc(filep->fp); + } else { + return EOF; + } +} + +static void +send_ssi_file(struct mg_connection *conn, + const char *path, + struct file *filep, + int include_level) +{ + char buf[MG_BUF_LEN]; + int ch, offset, len, in_ssi_tag; + + if (include_level > 10) { + mg_cry(conn, "SSI #include level is too deep (%s)", path); + return; + } + + in_ssi_tag = len = offset = 0; + while ((ch = mg_fgetc(filep, offset)) != EOF) { + if (in_ssi_tag && ch == '>') { + in_ssi_tag = 0; + buf[len++] = (char)ch; + buf[len] = '\0'; + /* assert(len <= (int) sizeof(buf)); */ + if (len > (int)sizeof(buf)) { + break; + } + if (len < 6 || memcmp(buf, "\n\n") + file:write(xml.str(var)) + base.io.close(file) +end + + +-- recursively parses a Lua table for a substatement fitting to the provided tag and attribute +function xml.find(var, tag, attributeKey,attributeValue) + -- check input: + if base.type(var)~="table" then return end + if base.type(tag)=="string" and #tag==0 then tag=nil end + if base.type(attributeKey)~="string" or #attributeKey==0 then attributeKey=nil end + if base.type(attributeValue)=="string" and #attributeValue==0 then attributeValue=nil end + -- compare this table: + if tag~=nil then + if var[0]==tag and ( attributeValue == nil or var[attributeKey]==attributeValue ) then + base.setmetatable(var,{__index=xml, __tostring=xml.str}) + return var + end + else + if attributeValue == nil or var[attributeKey]==attributeValue then + base.setmetatable(var,{__index=xml, __tostring=xml.str}) + return var + end + end + -- recursively parse subtags: + for k,v in base.ipairs(var) do + if base.type(v)=="table" then + local ret = xml.find(v, tag, attributeKey,attributeValue) + if ret ~= nil then return ret end + end + end +end + diff --git a/3P/civetweb/src/third_party/LuaXML_lib.c b/3P/civetweb/src/third_party/LuaXML_lib.c new file mode 100644 index 00000000..64ebcb91 --- /dev/null +++ b/3P/civetweb/src/third_party/LuaXML_lib.c @@ -0,0 +1,476 @@ +/** +LuaXML License + +LuaXml is licensed under the terms of the MIT license reproduced below, +the same as Lua itself. This means that LuaXml is free software and can be +used for both academic and commercial purposes at absolutely no cost. + +Copyright (C) 2007-2013 Gerald Franz, eludi.net + +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. +*/ + +#if defined __WIN32__ || defined WIN32 +# include +# define _EXPORT __declspec(dllexport) +#else +# define _EXPORT +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include "civetweb_lua.h" + +#ifdef __cplusplus +} // extern "C" +#endif + +#include +#include +#include +#include + +static const char ESC=27; +static const char OPN=28; +static const char CLS=29; + +//--- auxliary functions ------------------------------------------- + +static const char* char2code(unsigned char ch, char buf[8]) { + unsigned char i=0; + buf[i++]='&'; + buf[i++]='#'; + if(ch>99) buf[i++]=ch/100+48; + if(ch>9) buf[i++]=(ch%100)/10+48; + buf[i++]=ch%10+48; + buf[i++]=';'; + buf[i]=0; + return buf; +} + +static size_t find(const char* s, const char* pattern, size_t start) { + const char* found =strstr(s+start, pattern); + return found ? found-s : strlen(s); +} + +//--- internal tokenizer ------------------------------------------- + +typedef struct Tokenizer_s { + /// stores string to be tokenized + const char* s; + /// stores size of string to be tokenized + size_t s_size; + /// stores current read position + size_t i; + /// stores current read context + int tagMode; + /// stores next token, if already determined + const char* m_next; + /// size of next token + size_t m_next_size; + /// pointer to current token + char* m_token; + /// size of current token + size_t m_token_size; + /// capacity of current token + size_t m_token_capacity; +} Tokenizer; + +Tokenizer* Tokenizer_new(const char* str, size_t str_size) { + Tokenizer *tok = (Tokenizer*)malloc(sizeof(Tokenizer)); + memset(tok, 0, sizeof(Tokenizer)); + tok->s_size = str_size; + tok->s = str; + return tok; +} + +void Tokenizer_delete(Tokenizer* tok) { + free(tok->m_token); + free(tok); +} + +//void Tokenizer_print(Tokenizer* tok) { printf(" @%u %s\n", tok->i, !tok->m_token ? "(null)" : (tok->m_token[0]==ESC)?"(esc)" : (tok->m_token[0]==OPN)?"(open)": (tok->m_token[0]==CLS)?"(close)" : tok->m_token); fflush(stdout); } + +static const char* Tokenizer_set(Tokenizer* tok, const char* s, size_t size) { + if(!size||!s) return 0; + free(tok->m_token); + tok->m_token = (char*)malloc(size+1); + strncpy(tok->m_token,s, size); + tok->m_token[size] = 0; + tok->m_token_size = tok->m_token_capacity = size; + //Tokenizer_print(tok); + return tok->m_token; +} + +static void Tokenizer_append(Tokenizer* tok, char ch) { + if(tok->m_token_size+1>=tok->m_token_capacity) { + tok->m_token_capacity = (tok->m_token_capacity==0) ? 16 : tok->m_token_capacity*2; + tok->m_token = (char*)realloc(tok->m_token, tok->m_token_capacity); + } + tok->m_token[tok->m_token_size]=ch; + tok->m_token[++tok->m_token_size]=0; +} + +const char* Tokenizer_next(Tokenizer* tok) { + const char* ESC_str = "\033"; + const char* OPEN_str = "\034"; + const char* CLOSE_str = "\035"; + int quotMode=0; + int tokenComplete = 0; + + if(tok->m_token) { + free(tok->m_token); + tok->m_token = 0; + tok->m_token_size=tok->m_token_capacity = 0; + } + + while(tok->m_next_size || (tok->i < tok->s_size)) { + + if(tok->m_next_size) { + Tokenizer_set(tok, tok->m_next, tok->m_next_size); + tok->m_next=0; + tok->m_next_size=0; + return tok->m_token; + } + + switch(tok->s[tok->i]) { + case '"': + case '\'': + if(tok->tagMode) { + if(!quotMode) quotMode=tok->s[tok->i]; + else if(quotMode==tok->s[tok->i]) quotMode=0; + } + Tokenizer_append(tok, tok->s[tok->i]); + break; + case '<': + if(!quotMode&&(tok->i+4s_size)&&(strncmp(tok->s+tok->i,"", tok->i+4)+2; + else if(!quotMode&&(tok->i+9s_size)&&(strncmp(tok->s+tok->i,"i+9; + tok->i=find(tok->s, "]]>",b)+3; + if(!tok->m_token_size) return Tokenizer_set(tok, tok->s+b, tok->i-b-3); + tokenComplete = 1; + tok->m_next = tok->s+b; + tok->m_next_size = tok->i-b-3; + --tok->i; + } + else if(!quotMode&&(tok->i+1s_size)&&((tok->s[tok->i+1]=='?')||(tok->s[tok->i+1]=='!'))) // strip meta information + tok->i=find(tok->s, ">", tok->i+2); + else if(!quotMode&&!tok->tagMode) { + if((tok->i+1s_size)&&(tok->s[tok->i+1]=='/')) { + tok->m_next=ESC_str; + tok->m_next_size = 1; + tok->i=find(tok->s, ">", tok->i+2); + } + else { + tok->m_next = OPEN_str; + tok->m_next_size = 1; + tok->tagMode=1; + } + tokenComplete = 1; + } + else Tokenizer_append(tok, tok->s[tok->i]); + break; + case '/': + if(tok->tagMode&&!quotMode) { + tokenComplete = 1; + if((tok->i+1 < tok->s_size) && (tok->s[tok->i+1]=='>')) { + tok->tagMode=0; + tok->m_next=ESC_str; + tok->m_next_size = 1; + ++tok->i; + } + else Tokenizer_append(tok, tok->s[tok->i]); + } + else Tokenizer_append(tok, tok->s[tok->i]); + break; + case '>': + if(!quotMode&&tok->tagMode) { + tok->tagMode=0; + tokenComplete = 1; + tok->m_next = CLOSE_str; + tok->m_next_size = 1; + } + else Tokenizer_append(tok, tok->s[tok->i]); + break; + case ' ': + case '\r': + case '\n': + case '\t': + if(tok->tagMode&&!quotMode) { + if(tok->m_token_size) tokenComplete=1; + } + else if(tok->m_token_size) Tokenizer_append(tok, tok->s[tok->i]); + break; + default: Tokenizer_append(tok, tok->s[tok->i]); + } + ++tok->i; + if((tok->i>=tok->s_size)||(tokenComplete&&tok->m_token_size)) { + tokenComplete=0; + while(tok->m_token_size&&isspace(tok->m_token[tok->m_token_size-1])) // trim whitespace + tok->m_token[--tok->m_token_size]=0; + if(tok->m_token_size) break; + } + } + //Tokenizer_print(tok); + return tok->m_token; +} + +//--- local variables ---------------------------------------------- + +/// stores number of special character codes +static size_t sv_code_size=0; +/// stores currently allocated capacity for special character codes +static size_t sv_code_capacity=16; +/// stores code table for special characters +static char** sv_code=0; + +//--- public methods ----------------------------------------------- + +static void Xml_pushDecode(lua_State* L, const char* s, size_t s_size) { + + luaL_Buffer b; + const char* found = strstr(s, "&#"); + size_t start=0, pos, i; + + if(!s_size) + s_size=strlen(s); + + luaL_buffinit(L, &b); + found = strstr(s, "&#"); + pos = found ? found-s : s_size; + + while(found) { + char ch = 0; + size_t i=0; + for(found += 2; i<3; ++i, ++found) + if(isdigit(*found)) + ch = ch * 10 + (*found - 48); + else break; + if(*found == ';') { + if(pos>start) + luaL_addlstring(&b, s+start, pos-start); + luaL_addchar(&b, ch); + start = pos + 3 + i; + } + found = strstr(found+1, "&#"); + pos = found ? found-s : s_size; + } + if(pos>start) + luaL_addlstring(&b,s+start, pos-start); + luaL_pushresult(&b); + + for(i=sv_code_size-1; i1) lua_settop(L,-2); // this tag has no content, only attributes + else break; + } + } + else if(token[0]==ESC) { // previous tag is over + if(lua_gettop(L)>1) lua_settop(L,-2); // pop current table + else break; + } + else { // read elements + lua_pushnumber(L,lua_rawlen(L,-1)+1); + Xml_pushDecode(L, token, 0); + lua_settable(L, -3); + } + Tokenizer_delete(tok); + free(str); + return lua_gettop(L); +} + +int Xml_load (lua_State *L) { + const char * filename = luaL_checkstring(L,1); + FILE * file=fopen(filename,"r"); + char* buffer; + size_t sz; + + if(!file) + return luaL_error(L,"LuaXml ERROR: \"%s\" file error or file not found!",filename); + + fseek (file , 0 , SEEK_END); + sz = ftell (file); + rewind (file); + buffer = (char*)malloc(sz+1); + sz = fread (buffer,1,sz,file); + fclose(file); + buffer[sz]=0; + lua_pushlightuserdata(L,buffer); + lua_replace(L,1); + return Xml_eval(L); +}; + +int Xml_registerCode(lua_State *L) { + const char * decoded = luaL_checkstring(L,1); + const char * encoded = luaL_checkstring(L,2); + + size_t i; + for(i=0; isv_code_capacity) { + sv_code_capacity*=2; + sv_code = (char**)realloc(sv_code, sv_code_capacity*sizeof(char*)); + } + sv_code[sv_code_size]=(char*)malloc(strlen(decoded)+1); + strcpy(sv_code[sv_code_size++], decoded); + sv_code[sv_code_size]=(char*)malloc(strlen(encoded)+1); + strcpy(sv_code[sv_code_size++],encoded); + return 0; +} + +int Xml_encode(lua_State *L) { + + char buf[8]; + size_t start, pos; + luaL_Buffer b; + const char* s; + size_t i; + + if(lua_gettop(L)!=1) + return 0; + luaL_checkstring(L,-1); + + for(i=0; istart) luaL_addlstring(&b,s+start, pos-start); + luaL_addstring(&b,char2code((unsigned char)(s[pos]),buf)); + start=pos+1; + } + if(pos>start) + luaL_addlstring(&b,s+start, pos-start); + luaL_pushresult(&b); + lua_remove(L,-2); + return 1; +} + +#ifdef __cplusplus +extern "C" { +#endif +int _EXPORT luaopen_LuaXML_lib (lua_State* L) { + static const struct luaL_Reg funcs[] = { + {"load", Xml_load}, + {"eval", Xml_eval}, + {"encode", Xml_encode}, + {"registerCode", Xml_registerCode}, + {NULL, NULL} + }; + + luaL_newlibtable(L, funcs); + luaL_setfuncs(L, funcs, 0); + lua_setglobal(L, "xml"); + + // register default codes: + if(!sv_code) { + sv_code=(char**)malloc(sv_code_capacity*sizeof(char*)); + sv_code[sv_code_size++]="&"; + sv_code[sv_code_size++]="&"; + sv_code[sv_code_size++]="<"; + sv_code[sv_code_size++]="<"; + sv_code[sv_code_size++]=">"; + sv_code[sv_code_size++]=">"; + sv_code[sv_code_size++]="\""; + sv_code[sv_code_size++]="""; + sv_code[sv_code_size++]="'"; + sv_code[sv_code_size++]="'"; + } + return 1; +} +#ifdef __cplusplus +} // extern "C" +#endif diff --git a/3P/civetweb/src/third_party/civetweb_lua.h b/3P/civetweb/src/third_party/civetweb_lua.h new file mode 100644 index 00000000..232d8da8 --- /dev/null +++ b/3P/civetweb/src/third_party/civetweb_lua.h @@ -0,0 +1,73 @@ +/* Copyright (c) 2015 the Civetweb developers + * + * 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 header is intended to support Lua 5.1, Lua 5.2 and Lua 5.3 in the same + * C source code. + */ + +#ifndef CIVETWEB_LUA_H +#define CIVETWEB_LUA_H + +#define LUA_LIB +#include "lua.h" +#include "lauxlib.h" +#include "lualib.h" + +#ifndef LUA_VERSION_NUM +#error "Unknown Lua version" + +#elif LUA_VERSION_NUM == 501 +/* Lua 5.1 detected */ +#define LUA_OK 0 +#define LUA_ERRGCMM 999 /* not supported */ +#define mg_lua_load(a, b, c, d, e) lua_load(a, b, c, d) +#define lua_rawlen lua_objlen +#define lua_newstate(a, b) \ + luaL_newstate() /* Must use luaL_newstate() for 64 bit target */ +#define lua_pushinteger lua_pushnumber +#define luaL_newlib(L, t) \ + { \ + luaL_Reg const *r = t; \ + while (r->name) { \ + lua_register(L, r->name, r->func); \ + r++; \ + } \ + } +#define luaL_setfuncs(L, r, u) lua_register(L, r->name, r->func) + +#elif LUA_VERSION_NUM == 502 +/* Lua 5.2 detected */ +#define mg_lua_load lua_load + +#elif LUA_VERSION_NUM == 503 +/* Lua 5.3 detected */ +#define mg_lua_load lua_load + +#endif + +#ifdef LUA_VERSION_MAKEFILE +#if LUA_VERSION_MAKEFILE != LUA_VERSION_NUM +#error \ + "Mismatch between Lua version specified in Makefile and Lua version in lua.h" +#endif +#endif + +#endif /* #ifndef CIVETWEB_LUA_H */ diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/AUTHORS.rst b/3P/civetweb/src/third_party/duktape-1.3.0/AUTHORS.rst new file mode 100644 index 00000000..47b6de90 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/AUTHORS.rst @@ -0,0 +1,67 @@ +=============== +Duktape authors +=============== + +Copyright +========= + +Duktape copyrights are held by its authors. Each author has a copyright +to their contribution, and agrees to irrevocably license the contribution +under the Duktape ``LICENSE.txt``. + +Authors +======= + +Please include an e-mail address, a link to your GitHub profile, or something +similar to allow your contribution to be identified accurately. + +The following people have contributed code, website contents, or Wiki contents, +and agreed to irrevocably license their contributions under the Duktape +``LICENSE.txt`` (in order of appearance): + +* Sami Vaarala +* Niki Dobrev +* Andreas Öman +* László Langó +* Legimet +* Karl Skomski +* Bruce Pascoe + +Other contributions +=================== + +The following people have contributed something other than code (e.g. reported +bugs, provided ideas, etc; roughly in order of appearance): + +* Greg Burns +* Anthony Rabine +* Carlos Costa +* Aurélien Bouilland +* Preet Desai (Pris Matic) +* judofyr (http://www.reddit.com/user/judofyr) +* Jason Woofenden +* Michał Przybyś +* Anthony Howe +* Conrad Pankoff +* Jim Schimpf +* Rajaran Gaunker (https://github.com/zimbabao) +* Andreas Öman +* Doug Sanden +* Josh Engebretson (https://github.com/JoshEngebretson) +* Remo Eichenberger (https://github.com/remoe) +* Mamod Mehyar (https://github.com/mamod) +* David Demelier (https://github.com/markand) +* Tim Caswell (https://github.com/creationix) +* Mitchell Blank Jr (https://github.com/mitchblank) +* https://github.com/yushli +* Seo Sanghyeon (https://github.com/sanxiyn) +* Han ChoongWoo (https://github.com/tunz) +* Joshua Peek (https://github.com/josh) +* Bruce E. Pascoe (https://github.com/fatcerberus) +* https://github.com/Kelledin +* https://github.com/sstruchtrup +* Michael Drake (https://github.com/tlsa) +* https://github.com/chris-y + +If you are accidentally missing from this list, send me an e-mail +(``sami.vaarala@iki.fi``) and I'll fix the omission. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/LICENSE.txt b/3P/civetweb/src/third_party/duktape-1.3.0/LICENSE.txt new file mode 100644 index 00000000..8358da37 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/LICENSE.txt @@ -0,0 +1,25 @@ +=============== +Duktape license +=============== + +(http://opensource.org/licenses/MIT) + +Copyright (c) 2013-2015 by Duktape authors (see AUTHORS.rst) + +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/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.cmdline b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.cmdline new file mode 100644 index 00000000..798c7631 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.cmdline @@ -0,0 +1,30 @@ +# +# Example Makefile for building a program with embedded Duktape. +# The example program here is the Duktape command line tool. +# + +DUKTAPE_SOURCES = src/duktape.c + +DUKTAPE_CMDLINE_SOURCES = \ + examples/cmdline/duk_cmdline.c + +CC = gcc +CCOPTS = -Os -pedantic -std=c99 -Wall -fstrict-aliasing -fomit-frame-pointer +CCOPTS += -I./src # duktape.h and duk_config.h must be in include path +CCLIBS = -lm + +# If you have readline, you may want to enable these. On some platforms +# -lreadline also requires -lncurses (e.g. RHEL), so it is added by default +# (you may be able to remove it) +#CCOPTS += -DDUK_CMDLINE_FANCY +#CCLIBS += -lreadline +#CCLIBS += -lncurses + +# Optional feature defines, see: http://duktape.org/guide.html#compiling +CCOPTS += -DDUK_OPT_SELF_TESTS +#CCOPTS += -DDUK_OPT_DEBUG +#CCOPTS += -DDUK_OPT_DPRINT +# ... + +duk: $(DUKTAPE_SOURCES) $(DUKTAPE_CMDLINE_SOURCES) + $(CC) -o $@ $(DEFINES) $(CCOPTS) $(DUKTAPE_SOURCES) $(DUKTAPE_CMDLINE_SOURCES) $(CCLIBS) diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.codepage b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.codepage new file mode 100644 index 00000000..cdce9ab5 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.codepage @@ -0,0 +1,4 @@ +codepage: + gcc -o $@ -std=c99 -O2 -Wall -Wextra -Isrc/ \ + src/duktape.c examples/codepage-conv/duk_codepage_conv.c \ + examples/codepage-conv/test.c -lm diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.coffee b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.coffee new file mode 100644 index 00000000..b99eea23 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.coffee @@ -0,0 +1,4 @@ +dummy: + coffee -c examples/coffee/globals.coffee + coffee -c examples/coffee/hello.coffee + coffee -c examples/coffee/mandel.coffee diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.dukdebug b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.dukdebug new file mode 100644 index 00000000..bc7b9d5b --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.dukdebug @@ -0,0 +1,23 @@ +# +# Duktape command line tool with debugger support. +# + +DUKTAPE_SOURCES = src/duktape.c + +DUKTAPE_CMDLINE_SOURCES = \ + examples/cmdline/duk_cmdline.c \ + examples/debug-trans-socket/duk_trans_socket.c + +CC = gcc +CCOPTS = -Os -pedantic -std=c99 -Wall -fstrict-aliasing -fomit-frame-pointer +CCOPTS += -I./src -I./examples/debug-trans-socket +CCOPTS += -DDUK_CMDLINE_DEBUGGER_SUPPORT # enable --debugger in ./duk +CCOPTS += -DDUK_OPT_DEBUGGER_SUPPORT # enable debugger support in Duktape +CCOPTS += -DDUK_OPT_INTERRUPT_COUNTER # prerequisite for debugging +CCOPTS += -DDUK_OPT_DEBUGGER_FWD_PRINTALERT # optional debugger features +CCOPTS += -DDUK_OPT_DEBUGGER_FWD_LOGGING +CCOPTS += -DDUK_OPT_DEBUGGER_DUMPHEAP +CCLIBS = -lm + +duk: $(DUKTAPE_SOURCES) $(DUKTAPE_CMDLINE_SOURCES) + $(CC) -o $@ $(DEFINES) $(CCOPTS) $(DUKTAPE_SOURCES) $(DUKTAPE_CMDLINE_SOURCES) $(CCLIBS) diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.eval b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.eval new file mode 100644 index 00000000..73c52250 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.eval @@ -0,0 +1,7 @@ +# +# Example Makefile for building the eval example +# + +eval: + gcc -o $@ -std=c99 -O2 -Wall -Wextra -Isrc/ \ + src/duktape.c examples/eval/eval.c -lm diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.eventloop b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.eventloop new file mode 100644 index 00000000..14806ac8 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.eventloop @@ -0,0 +1,22 @@ +# +# Example Makefile for building the eventloop example +# + +evloop: + @echo "NOTE: The eventloop is example is intended to be used on Linux" + @echo " or other common UNIX variants. It is not fully portable." + @echo "" + + gcc -o $@ -std=c99 -Wall -Wextra -O2 -Isrc \ + examples/eventloop/main.c \ + examples/eventloop/c_eventloop.c \ + examples/eventloop/poll.c \ + examples/eventloop/socket.c \ + examples/eventloop/fileio.c \ + examples/eventloop/ncurses.c \ + src/duktape.c \ + -lm -lncurses + + @echo "" + @echo "NOTE: You must 'cd examples/eventloop' before you execute the" + @echo " eventloop binary: it relies on finding .js files in CWD" diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.hello b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.hello new file mode 100644 index 00000000..82e9ab6b --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.hello @@ -0,0 +1,35 @@ +# +# Example Makefile for building a program with embedded Duktape. +# +# There are two source sets in the distribution: (1) combined sources where +# you only need duktape.c, duktape.h, and duk_config.h, and (2) separate +# sources where you have a bunch of source and header files. Whichever +# you use, simply include the relevant sources into your C project. This +# Makefile uses the combined source file. +# + +DUKTAPE_SOURCES = src/duktape.c + +# Compiler options are quite flexible. GCC versions have a significant impact +# on the size of -Os code, e.g. gcc-4.6 is much worse than gcc-4.5. + +CC = gcc +CCOPTS = -Os -pedantic -std=c99 -Wall -fstrict-aliasing -fomit-frame-pointer +CCOPTS += -I./src # for combined sources +CCLIBS = -lm +DEFINES = + +# If you want a 32-bit build on a 64-bit host +#CCOPTS += -m32 + +# Optional feature defines, see: http://duktape.org/guide.html#compiling +DEFINES += -DDUK_OPT_SELF_TESTS +#DEFINES += -DDUK_OPT_DEBUG +#DEFINES += -DDUK_OPT_DPRINT +#DEFINES += -DDUK_OPT_NO_TRACEBACKS +# ... + +# For debugging, use -O0 -g -ggdb, and don't add -fomit-frame-pointer + +hello: $(DUKTAPE_SOURCES) examples/hello/hello.c + $(CC) -o $@ $(DEFINES) $(CCOPTS) $(DUKTAPE_SOURCES) examples/hello/hello.c $(CCLIBS) diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.jxpretty b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.jxpretty new file mode 100644 index 00000000..199247ee --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.jxpretty @@ -0,0 +1,8 @@ +# +# Example Makefile for building the jxpretty example +# + +jxpretty: + gcc -o $@ -std=c99 -Wall -Wextra -O2 -Isrc \ + src/duktape.c examples/jxpretty/jxpretty.c \ + -lm diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.sandbox b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.sandbox new file mode 100644 index 00000000..acd922ae --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/Makefile.sandbox @@ -0,0 +1,7 @@ +# +# Example Makefile for building the sandbox example +# + +sandbox: + gcc -o $@ -std=c99 -O2 -Wall -Wextra -Isrc/ \ + src/duktape.c examples/sandbox/sandbox.c -lm diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/README.rst new file mode 100644 index 00000000..78e72b95 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/README.rst @@ -0,0 +1,103 @@ +======= +Duktape +======= + +Duktape is a small and portable Ecmascript E5/E5.1 implementation. It is +intended to be easily embeddable into C programs, with a C API similar in +spirit to Lua's. + +Duktape supports the full E5/E5.1 feature set including errors, Unicode +strings, and regular expressions, a subset of E6 features (e.g. Proxy +objects), Khronos/ES6 ArrayBuffer/TypedView, and Node.js Buffer bindings. + +Duktape also provides a number of custom features such as error tracebacks, +additional data types for better C integration, combined reference counting +and mark-and sweep garbage collector, object finalizers, co-operative +threads a.k.a. coroutines, tail calls, built-in logging and module frameworks, +a built-in debugger protocol, function bytecode dump/load, and so on. + +You can browse Duktape programmer's API and other documentation at: + +* http://duktape.org/ + +In particular, you should read the getting started section: + +* http://duktape.org/guide.html#gettingstarted + +More examples and how-to articles are in the Duktape Wiki: + +* http://wiki.duktape.org/ + +Building and integrating Duktape into your project is very straightforward: + +* http://duktape.org/guide.html#compiling + +See Makefile.hello for a concrete example:: + + $ cd + $ make -f Makefile.hello + [...] + $ ./hello + Hello world! + 2+3=5 + +To build an example command line tool, use the following:: + + $ cd + $ make -f Makefile.cmdline + [...] + + $ ./duk + ((o) Duktape + duk> print('Hello world!'); + Hello world! + = undefined + + $ ./duk mandel.js + [...] + +This distributable contains: + +* ``src/``: main Duktape library in a "single source file" format (duktape.c, + duktape.h, and duk_config.h). + +* ``src-separate/``: main Duktape library in multiple files format. + +* ``config/``: genconfig utility for creating duk_config.h configuration + files, see: http://wiki.duktape.org/Configuring.html. + +* ``examples/``: further examples for using Duktape. Although Duktape + itself is widely portable, some of the examples are Linux only. + For instance the ``eventloop`` example illustrates how ``setTimeout()`` + and other standard timer functions could be implemented on Unix/Linux. + +* ``extras/``: utilities and modules which don't comfortably fit into the + main Duktape library because of footprint or portability concerns. + Extras are maintained and bug fixed code, but don't have the same version + guarantees as the main Duktape library. + +* ``polyfills/``: a few replacement suggestions for non-standard Javascript + functions provided by other implementations. + +* ``debugger/``: a debugger with a web UI, see ``debugger/README.rst`` and + https://github.com/svaarala/duktape/blob/master/doc/debugger.rst for + details on Duktape debugger support. + +* ``licenses/``: licensing information. + +You can find release notes at: + +* https://github.com/svaarala/duktape/blob/master/RELEASES.rst + +This distributable contains Duktape version 1.3.0, created from git +commit 675165f35ea3a5bac34ff4d0a58b007cc2f442dc (v1.3.0). + +Duktape is copyrighted by its authors (see ``AUTHORS.rst``) and licensed +under the MIT license (see ``LICENSE.txt``). MurmurHash2 is used internally, +it is also under the MIT license. Duktape module loader is based on the +CommonJS module loading specification (without sharing any code), CommonJS +is under the MIT license. + +Have fun! + +Sami Vaarala (sami.vaarala@iki.fi) diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/config/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/config/README.rst new file mode 100644 index 00000000..1d172261 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/config/README.rst @@ -0,0 +1,39 @@ +================= +Duktape genconfig +================= + +Overview +======== + +``genconfig`` is a helper script for coming up with a ``duk_config.h`` for +compiling Duktape for your platform. + +To support this: + +* It creates a Duktape 1.2.x compatible ``duk_config.h`` with automatic + platform detection and ``DUK_OPT_xxx`` feature options. + +* It helps to create a ``duk_config.h`` for your platform/compiler + combination. You can give a base configuration and then force certain + values manually based on a YAML configuration file. + +* It autogenerates documentation for config options (and Duktape 1.2.x + feature options) based on option metadata files written in YAML. + +Usage +===== + +To create an autodetect duk_config.h header (compatible with Duktape 1.2.x):: + + $ python config/genconfig.py --metadata config --output /tmp/duk_config.h \ + autodetect-header + +To create a barebones duk_config.h header for a specific platform (easier to +edit manually):: + + $ python config/genconfig.py --metadata config --output /tmp/duk_config.h \ + --platform linux --compiler gcc --architecture x64 \ + barebones-header + +There are further commands to e.g. autogenerate config option documentation; +see ``genconfig.py`` for details. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/config/genconfig.py b/3P/civetweb/src/third_party/duktape-1.3.0/config/genconfig.py new file mode 100644 index 00000000..778705e6 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/config/genconfig.py @@ -0,0 +1,1872 @@ +#!/usr/bin/python +# +# Process Duktape option metadata and produce various useful outputs: +# +# - duk_config.h matching Duktape 1.x feature option model (DUK_OPT_xxx) +# - duk_config.h for a selected platform, compiler, forced options, etc. +# - option documentation for Duktape 1.x feature options (DUK_OPT_xxx) +# - option documentation for Duktape 1.x/2.x config options (DUK_USE_xxx) +# +# Genconfig tries to build all outputs based on modular metadata, so that +# managing a large number of config options (which is hard to avoid given +# the wide range of targets Duktape supports) remains maintainable. +# +# Genconfig does *not* try to support all exotic platforms out there. +# Instead, the goal is to allow the metadata to be extended, or to provide +# a reasonable starting point for manual duk_config.h tweaking. +# +# NOTE: For Duktape 1.3 release the main goal is to autogenerate a Duktape +# 1.2 compatible "autodetect" header from snippets. Other outputs are still +# experimental. +# + +import os +import sys +import re +import json +import yaml +import optparse +import tarfile +import tempfile +import atexit +import shutil +import StringIO + +# +# Globals holding scanned metadata, helper snippets, etc +# + +# Metadata to scan from config files. +use_defs = None +use_defs_list = None +opt_defs = None +opt_defs_list = None +use_tags = None +use_tags_list = None +tags_meta = None +required_use_meta_keys = [ + 'define', + 'introduced', + 'default', + 'tags', + 'description' +] +allowed_use_meta_keys = [ + 'define', + 'feature_enables', + 'feature_disables', + 'feature_snippet', + 'related_feature_defines', + 'introduced', + 'deprecated', + 'removed', + 'unused', + 'requires', + 'conflicts', + 'related', + 'default', + 'tags', + 'description', +] +required_opt_meta_keys = [ + 'define', + 'introduced', + 'tags', + 'description' +] +allowed_opt_meta_keys = [ + 'define', + 'introduced', + 'deprecated', + 'removed', + 'unused', + 'requires', + 'conflicts', + 'related', + 'tags', + 'description' +] + +# Preferred tag order for option documentation. +doc_tag_order = [ + 'portability', + 'memory', + 'lowmemory', + 'ecmascript', + 'execution', + 'debugger', + 'debug', + 'development' +] + +# Preferred tag order for generated C header files. +header_tag_order = doc_tag_order + +# Helper headers snippets. +helper_snippets = None + +# Assume these provides come from outside. +assumed_provides = { + 'DUK_SINGLE_FILE': True, # compiling Duktape from a single source file (duktape.c) version + 'DUK_COMPILING_DUKTAPE': True, # compiling Duktape (not user application) + 'DUK_CONFIG_H_INCLUDED': True, # artifact, include guard +} + +# Platform files must provide at least these (additional checks +# in validate_platform_file()). +platform_required_provides = [ + 'DUK_USE_OS_STRING', + 'DUK_SETJMP', 'DUK_LONGJMP', +] + +# Architecture files must provide at least these (additional checks +# in validate_architecture_file()). +architecture_required_provides = [ + 'DUK_USE_ARCH_STRING', + 'DUK_USE_ALIGN_BY', 'DUK_USE_UNALIGNED_ACCESSES_POSSIBLE', 'DUK_USE_HASHBYTES_UNALIGNED_U32_ACCESS', + 'DUK_USE_PACKED_TVAL', 'DUK_USE_PACKED_TVAL_POSSIBLE' +] + +# Compiler files must provide at least these (additional checks +# in validate_compiler_file()). +compiler_required_provides = [ + # XXX: incomplete, maybe a generic fill-in for missing stuff because + # there's quite a lot of required compiler defines. + + 'DUK_USE_COMPILER_STRING', + + 'DUK_EXTERNAL_DECL', 'DUK_EXTERNAL', + 'DUK_INTERNAL_DECL', 'DUK_INTERNAL', + 'DUK_LOCAL_DECL', 'DUK_LOCAL', + + 'DUK_FILE_MACRO', 'DUK_LINE_MACRO', 'DUK_FUNC_MACRO' +] + +# +# Miscellaneous helpers +# + +def get_auto_delete_tempdir(): + tmpdir = tempfile.mkdtemp(suffix='-genconfig') + def _f(dirname): + print 'Deleting temporary directory: %r' % dirname + if os.path.isdir(dirname) and '-genconfig' in dirname: + shutil.rmtree(dirname) + atexit.register(_f, tmpdir) + return tmpdir + +def strip_comments_from_lines(lines): + # Not exact but close enough. Doesn't handle string literals etc, + # but these are not a concrete issue for scanning preprocessor + # #define references. + # + # Comment contents are stripped of any DUK_ prefixed text to avoid + # incorrect requires/provides detection. Other comment text is kept; + # in particular a "/* redefine */" comment must remain intact here. + # + # Avoid Python 2.6 vs. Python 2.7 argument differences. + + def censor(x): + return re.sub(re.compile('DUK_\w+', re.MULTILINE), 'xxx', x.group(0)) + + tmp = '\n'.join(lines) + tmp = re.sub(re.compile('/\*.*?\*/', re.MULTILINE | re.DOTALL), censor, tmp) + tmp = re.sub(re.compile('//.*?$', re.MULTILINE), censor, tmp) + return tmp.split('\n') + +# Header snippet representation: lines, provides defines, requires defines. +re_line_provides = re.compile(r'^#(?:define|undef)\s+(\w+).*$') +re_line_requires = re.compile(r'(DUK_[A-Z0-9_]+)') # uppercase only, don't match DUK_USE_xxx for example +class Snippet: + lines = None # lines of text and/or snippets + provides = None # map from define to 'True' for now + requires = None # map from define to 'True' for now + + def __init__(self, lines, provides=None, requires=None, autoscan_requires=True, autoscan_provides=True): + self.lines = [] + if not isinstance(lines, list): + raise Exception('Snippet constructor must be a list (not e.g. a string): %s' % repr(lines)) + for line in lines: + if isinstance(line, str): + self.lines.append(line) + elif isinstance(line, unicode): + self.lines.append(line.encode('utf-8')) + else: + raise Exception('invalid line: %r' % line) + self.provides = {} + if provides is not None: + for k in provides.keys(): + self.provides[k] = True + self.requires = {} + if requires is not None: + for k in requires.keys(): + self.requires[k] = True + + stripped_lines = strip_comments_from_lines(lines) + # for line in stripped_lines: print(line) + + for line in stripped_lines: + # Careful with order, snippet may self-reference its own + # defines in which case there's no outward dependency. + # (This is not 100% because the order of require/provide + # matters and this is not handled now.) + # + # Also, some snippets may #undef/#define another define but + # they don't "provide" the define as such. For example, + # DUK_F_CLANG.h.in undefines DUK_F_GCC defines if clang is + # detected: DUK_F_CLANG.h.in is considered to require + # DUK_F_GCC but doesn't provide it. Such redefinitions are + # marked "/* redefine */" in the snippets. They're best + # avoided, of course. + + if autoscan_provides: + m = re_line_provides.match(line) + if m is not None and '/* redefine */' not in line and \ + len(m.group(1)) > 0 and m.group(1)[-1] != '_': + # Don't allow e.g. DUK_USE_ which results from matching DUK_USE_xxx + #print('PROVIDES: %r' % m.group(1)) + self.provides[m.group(1)] = True + if autoscan_requires: + matches = re.findall(re_line_requires, line) + for m in matches: + if len(m) > 0 and m[-1] == '_': + # Don't allow e.g. DUK_USE_ which results from matching DUK_USE_xxx + pass + elif m[:7] == 'DUK_OPT': + # DUK_OPT_xxx always come from outside + pass + elif m[:7] == 'DUK_USE': + # DUK_USE_xxx are internal and they should not be 'requirements' + pass + elif self.provides.has_key(m): + # Snippet provides it's own require; omit + pass + else: + #print('REQUIRES: %r' % m) + self.requires[m] = True + + def fromFile(cls, filename): + lines = [] + with open(filename, 'rb') as f: + for line in f: + if line[-1] == '\n': + line = line[:-1] + lines.append(line) + return Snippet(lines, autoscan_requires=True, autoscan_provides=True) + fromFile = classmethod(fromFile) + + def merge(cls, snippets): + ret = Snippet([], [], []) + for s in snippets: + ret.lines += s.lines + for k in s.provides.keys(): + ret.provides[k] = True + for k in s.requires.keys(): + ret.requires[k] = True + return ret + merge = classmethod(merge) + +# Helper for building a text file from individual lines, injected files, etc. +# Inserted values are converted to Snippets so that their provides/requires +# information can be tracked. When non-C outputs are created, these will be +# bogus but ignored. +class FileBuilder: + vals = None # snippet list + base_dir = None + use_cpp_warning = False + + def __init__(self, base_dir=None, use_cpp_warning=False): + self.vals = [] + self.base_dir = base_dir + self.use_cpp_warning = use_cpp_warning + + def line(self, line): + self.vals.append(Snippet([ line ])) + + def lines(self, lines): + if len(lines) > 0 and lines[-1] == '\n': + lines = lines[:-1] # strip last newline to avoid empty line + self.vals.append(Snippet(lines.split('\n'))) + + def empty(self): + self.vals.append(Snippet([ '' ])) + + def rst_heading(self, title, char, doubled=False): + tmp = [] + if doubled: + tmp.append(char * len(title)) + tmp.append(title) + tmp.append(char * len(title)) + self.vals.append(Snippet(tmp)) + + def snippet_relative(self, fn): + sn = Snippet.fromFile(os.path.join(self.base_dir, fn)) + self.vals.append(sn) + + def snippet_absolute(fn): + sn = Snippet.fromFile(fn) + self.vals.append(sn) + + def cpp_error(self, msg): + # XXX: assume no newlines etc + self.vals.append(Snippet([ '#error %s' % msg ])) + + def cpp_warning(self, msg): + # XXX: assume no newlines etc + # XXX: support compiler specific warning mechanisms + if self.use_cpp_warning: + # C preprocessor '#warning' is often supported + self.vals.append(Snippet([ '#warning %s' % msg ])) + else: + self.vals.append(Snippet([ '/* WARNING: %s */' % msg ])) + + def cpp_warning_or_error(self, msg, is_error=True): + if is_error: + self.cpp_error(msg) + else: + self.cpp_warning(msg) + + def chdr_block_heading(self, msg): + lines = [] + lines.append('') + lines.append('/*') + lines.append(' * ' + msg) + lines.append(' */') + lines.append('') + self.vals.append(Snippet(lines)) + + def join(self): + tmp = [] + for line in self.vals: + if not isinstance(line, object): + raise Exception('self.vals must be all snippets') + for x in line.lines: # x is a Snippet + tmp.append(x) + return '\n'.join(tmp) + + def fill_dependencies_for_snippets(self, idx_deps): + fill_dependencies_for_snippets(self.vals, idx_deps) + +# Insert missing define dependencies into index 'idx_deps' repeatedly +# until no unsatisfied dependencies exist. This is used to pull in +# the required DUK_F_xxx helper defines without pulling them all in. +# The resolution mechanism also ensures dependencies are pulled in the +# correct order, i.e. DUK_F_xxx helpers may depend on each other (as +# long as there are no circular dependencies). +# +# XXX: this can be simplified a lot +def fill_dependencies_for_snippets(snippets, idx_deps): + # graph[A] = [ B, ... ] <-> B, ... provide something A requires. + graph = {} + snlist = [] + resolved = [] # for printing only + + def add(sn): + if sn in snlist: + return # already present + snlist.append(sn) + + to_add = [] + + for k in sn.requires.keys(): + if assumed_provides.has_key(k): + continue + + found = False + for sn2 in snlist: + if sn2.provides.has_key(k): + if not graph.has_key(sn): + graph[sn] = [] + graph[sn].append(sn2) + found = True # at least one other node provides 'k' + + if not found: + #print 'Resolving %r' % k + resolved.append(k) + + # Find a header snippet which provides the missing define. + # Some DUK_F_xxx files provide multiple defines, so we don't + # necessarily know the snippet filename here. + + sn_req = None + for sn2 in helper_snippets: + if sn2.provides.has_key(k): + sn_req = sn2 + break + if sn_req is None: + print(repr(sn.lines)) + raise Exception('cannot resolve missing require: %r' % k) + + # Snippet may have further unresolved provides; add recursively + to_add.append(sn_req) + + if not graph.has_key(sn): + graph[sn] = [] + graph[sn].append(sn_req) + + for sn in to_add: + add(sn) + + # Add original snippets. This fills in the required nodes + # recursively. + for sn in snippets: + add(sn) + + # Figure out fill-ins by looking for snippets not in original + # list and without any unserialized dependent nodes. + handled = {} + for sn in snippets: + handled[sn] = True + keepgoing = True + while keepgoing: + keepgoing = False + for sn in snlist: + if handled.has_key(sn): + continue + + success = True + for dep in graph.get(sn, []): + if not handled.has_key(dep): + success = False + if success: + snippets.insert(idx_deps, sn) + idx_deps += 1 + snippets.insert(idx_deps, Snippet([ '' ])) + idx_deps += 1 + handled[sn] = True + keepgoing = True + break + + # XXX: detect and handle loops cleanly + for sn in snlist: + if handled.has_key(sn): + continue + print('UNHANDLED KEY') + print('PROVIDES: %r' % sn.provides) + print('REQUIRES: %r' % sn.requires) + print('\n'.join(sn.lines)) + +# print(repr(graph)) +# print(repr(snlist)) + print 'Resolved helper defines: %r' % resolved + +def serialize_snippet_list(snippets): + ret = [] + + emitted_provides = {} + for k in assumed_provides.keys(): + emitted_provides[k] = True + + for sn in snippets: + ret += sn.lines + for k in sn.provides.keys(): + emitted_provides[k] = True + for k in sn.requires.keys(): + if not emitted_provides.has_key(k): + # XXX: conditional warning, happens in some normal cases + #print('WARNING: define %r required, not provided so far' % k) + pass + + return '\n'.join(ret) + +def remove_duplicate_newlines(x): + ret = [] + empty = False + for line in x.split('\n'): + if line == '': + if empty: + pass + else: + ret.append(line) + empty = True + else: + empty = False + ret.append(line) + return '\n'.join(ret) + +def scan_use_defs(dirname): + global use_defs, use_defs_list + use_defs = {} + use_defs_list = [] + + for fn in os.listdir(dirname): + root, ext = os.path.splitext(fn) + if not root.startswith('DUK_USE_') or ext != '.yaml': + continue + with open(os.path.join(dirname, fn), 'rb') as f: + doc = yaml.load(f) + if doc.get('example', False): + continue + if doc.get('unimplemented', False): + print('WARNING: unimplemented: %s' % fn) + continue + dockeys = doc.keys() + for k in dockeys: + if not k in allowed_use_meta_keys: + print('WARNING: unknown key %s in metadata file %s' % (k, fn)) + for k in required_use_meta_keys: + if not k in dockeys: + print('WARNING: missing key %s in metadata file %s' % (k, fn)) + + use_defs[doc['define']] = doc + + keys = use_defs.keys() + keys.sort() + for k in keys: + use_defs_list.append(use_defs[k]) + +def scan_opt_defs(dirname): + global opt_defs, opt_defs_list + opt_defs = {} + opt_defs_list = [] + + for fn in os.listdir(dirname): + root, ext = os.path.splitext(fn) + if not root.startswith('DUK_OPT_') or ext != '.yaml': + continue + with open(os.path.join(dirname, fn), 'rb') as f: + doc = yaml.load(f) + if doc.get('example', False): + continue + if doc.get('unimplemented', False): + print('WARNING: unimplemented: %s' % fn) + continue + dockeys = doc.keys() + for k in dockeys: + if not k in allowed_opt_meta_keys: + print('WARNING: unknown key %s in metadata file %s' % (k, fn)) + for k in required_opt_meta_keys: + if not k in dockeys: + print('WARNING: missing key %s in metadata file %s' % (k, fn)) + + opt_defs[doc['define']] = doc + + keys = opt_defs.keys() + keys.sort() + for k in keys: + opt_defs_list.append(opt_defs[k]) + +def scan_use_tags(): + global use_tags, use_tags_list + use_tags = {} + + for doc in use_defs_list: + for tag in doc.get('tags', []): + use_tags[tag] = True + + use_tags_list = use_tags.keys() + use_tags_list.sort() + +def scan_tags_meta(filename): + global tags_meta + + with open(filename, 'rb') as f: + tags_meta = yaml.load(f) + +def scan_snippets(dirname): + global helper_snippets + helper_snippets = [] + + for fn in os.listdir(dirname): + if (fn[0:6] != 'DUK_F_'): + continue + #print('Autoscanning snippet: %s' % fn) + helper_snippets.append(Snippet.fromFile(os.path.join(dirname, fn))) + +def validate_platform_file(filename): + sn = Snippet.fromFile(filename) + + # XXX: move required provides/defines into metadata only + for req in platform_required_provides: + if req not in sn.provides: + raise Exception('Platform %s is missing %s' % (filename, req)) + + if not ('DUK_USE_SETJMP' in sn.provides or 'DUK_USE_UNDERSCORE_SETJMP' in sn.provides or + 'DUK_USE_SIGSETJMP' in sn.provides): + raise Exception('Platform %s is missing a setjmp provider' % filename) + +def validate_architecture_file(filename): + sn = Snippet.fromFile(filename) + + # XXX: move required provides/defines into metadata only + for req in architecture_required_provides: + if req not in sn.provides: + raise Exception('Architecture %s is missing %s' % (filename, req)) + +def validate_compiler_file(filename): + sn = Snippet.fromFile(filename) + + # XXX: move required provides/defines into metadata only + for req in compiler_required_provides: + if req not in sn.provides: + raise Exception('Architecture %s is missing %s' % (filename, req)) + +def get_tag_title(tag): + meta = tags_meta.get(tag, None) + if meta is None: + return tag + else: + return meta.get('title', tag) + +def get_tag_description(tag): + meta = tags_meta.get(tag, None) + if meta is None: + return None + else: + return meta.get('description', None) + +def get_tag_list_with_preferred_order(preferred): + tags = [] + + # Preferred tags first + for tag in preferred: + if tag not in tags: + tags.append(tag) + + # Remaining tags in alphabetic order + for tag in use_tags_list: + if tag not in tags: + tags.append(tag) + + #print('Effective tag order: %r' % tags) + return tags + +def rst_format(text): + # XXX: placeholder, need to decide on markup conventions for YAML files + ret = [] + for para in text.split('\n'): + if para == '': + continue + ret.append(para) + return '\n\n'.join(ret) + +def cint_encode(x): + if not isinstance(x, (int, long)): + raise Exception('invalid input: %r' % x) + + # XXX: unsigned constants? + if x > 0x7fffffff or x < -0x80000000: + return '%dLL' % x + elif x > 0x7fff or x < -0x8000: + return '%dL' % x + else: + return '%d' % x + +def cstr_encode(x): + if isinstance(x, unicode): + x = x.encode('utf-8') + if not isinstance(x, str): + raise Exception('invalid input: %r' % x) + + res = '"' + term = False + has_terms = False + for c in x: + if term: + # Avoid ambiguous hex escapes + res += '" "' + term = False + has_terms = True + o = ord(c) + if o < 0x20 or o > 0x7e or c in '"\\': + res += '\\x%02x' % o + term = True + else: + res += c + res += '"' + + if has_terms: + res = '(' + res + ')' + + return res + +# +# Autogeneration of option documentation +# + +# Shared helper to generate DUK_OPT_xxx and DUK_USE_xxx documentation. +# XXX: unfinished placeholder +def generate_option_documentation(opts, opt_list=None, rst_title=None, include_default=False): + ret = FileBuilder(use_cpp_warning=opts.use_cpp_warning) + + tags = get_tag_list_with_preferred_order(doc_tag_order) + + title = rst_title + ret.rst_heading(title, '=', doubled=True) + + handled = {} + + for tag in tags: + first = True + + for doc in opt_list: + if tag != doc['tags'][0]: # sort under primary tag + continue + dname = doc['define'] + desc = doc.get('description', None) + + if handled.has_key(dname): + raise Exception('define handled twice, should not happen: %r' % dname) + handled[dname] = True + + if first: # emit tag heading only if there are subsections + ret.empty() + ret.rst_heading(get_tag_title(tag), '=') + + tag_desc = get_tag_description(tag) + if tag_desc is not None: + ret.empty() + ret.line(rst_format(tag_desc)) + first = False + + ret.empty() + ret.rst_heading(dname, '-') + + if desc is not None: + ret.empty() + ret.line(rst_format(desc)) + + if include_default: + ret.empty() + ret.line('Default: ``' + str(doc['default']) + '``') # XXX: rst or other format + + for doc in opt_list: + dname = doc['define'] + if not handled.has_key(dname): + raise Exception('unhandled define (maybe missing from tags list?): %r' % dname) + + ret.empty() + return ret.join() + +def generate_feature_option_documentation(opts): + return generate_option_documentation(opts, opt_list=opt_defs_list, rst_title='Duktape feature options', include_default=False) + +def generate_config_option_documentation(opts): + return generate_option_documentation(opts, opt_list=use_defs_list, rst_title='Duktape config options', include_default=True) + +# +# Helpers for duk_config.h generation +# + +def get_forced_options(opts): + # Forced options, last occurrence wins (allows a base config file to be + # overridden by a more specific one). + forced_opts = {} + for val in opts.force_options_yaml: + doc = yaml.load(StringIO.StringIO(val)) + for k in doc.keys(): + if use_defs.has_key(k): + pass # key is known + else: + print 'WARNING: option override key %s not defined in metadata, ignoring' % k + forced_opts[k] = doc[k] # shallow copy + + print 'Overrides: %s' % json.dumps(forced_opts) + + return forced_opts + +# Emit a default #define / #undef for an option based on +# a config option metadata node (parsed YAML doc). +def emit_default_from_config_meta(ret, doc, forced_opts, undef_done): + defname = doc['define'] + defval = forced_opts.get(defname, doc['default']) + + if defval == True: + ret.line('#define ' + defname) + elif defval == False: + if not undef_done: + ret.line('#undef ' + defname) + else: + # Default value is false, and caller has emitted + # an unconditional #undef, so don't emit a duplicate + pass + elif isinstance(defval, (int, long)): + # integer value + ret.line('#define ' + defname + ' ' + cint_encode(defval)) + elif isinstance(defval, (str, unicode)): + # verbatim value + ret.line('#define ' + defname + ' ' + defval) + elif isinstance(defval, dict): + if defval.has_key('verbatim'): + # verbatim text for the entire line + ret.line(defval['verbatim']) + elif defval.has_key('string'): + # C string value + ret.line('#define ' + defname + ' ' + cstr_encode(defval['string'])) + else: + raise Exception('unsupported value for option %s: %r' % (defname, defval)) + else: + raise Exception('unsupported value for option %s: %r' % (defname, defval)) + +# Add a header snippet for detecting presence of DUK_OPT_xxx feature +# options which will be removed in Duktape 2.x. +def add_legacy_feature_option_checks(opts, ret): + ret.chdr_block_heading('Checks for legacy feature options (DUK_OPT_xxx)') + + defs = [] + for doc in opt_defs_list: + if doc['define'] not in defs: + defs.append(doc['define']) + for doc in use_defs_list: + for dname in doc.get('related_feature_defines', []): + if dname not in defs: + defs.append(dname) + defs.sort() + + for optname in defs: + suggested = [] + for doc in use_defs_list: + if optname in doc.get('related_feature_defines', []): + suggested.append(doc['define']) + ret.empty() + ret.line('#if defined(%s)' % optname) + if len(suggested) > 0: + ret.cpp_warning_or_error('unsupported legacy feature option %s used, consider options: %s' % (optname, ', '.join(suggested)), opts.sanity_strict) + else: + ret.cpp_warning_or_error('unsupported legacy feature option %s used' % optname, opts.sanity_strict) + ret.line('#endif') + + ret.empty() + +# Add a header snippet for checking consistency of DUK_USE_xxx config +# options, e.g. inconsistent options, invalid option values. +def add_config_option_checks(opts, ret): + ret.chdr_block_heading('Checks for config option consistency (DUK_USE_xxx)') + + defs = [] + for doc in use_defs_list: + if doc['define'] not in defs: + defs.append(doc['define']) + defs.sort() + + for optname in defs: + doc = use_defs[optname] + dname = doc['define'] + + # XXX: more checks + + if doc.get('removed', None) is not None: + ret.empty() + ret.line('#if defined(%s)' % dname) + ret.cpp_warning_or_error('unsupported config option used (option has been removed): %s' % dname, opts.sanity_strict) + ret.line('#endif') + elif doc.get('deprecated', None) is not None: + ret.empty() + ret.line('#if defined(%s)' % dname) + ret.cpp_warning_or_error('unsupported config option used (option has been deprecated): %s' % dname, opts.sanity_strict) + ret.line('#endif') + + for req in doc.get('requires', []): + ret.empty() + ret.line('#if defined(%s) && !defined(%s)' % (dname, req)) + ret.cpp_warning_or_error('config option %s requires option %s (which is missing)' % (dname, req), opts.sanity_strict) + ret.line('#endif') + + for req in doc.get('conflicts', []): + ret.empty() + ret.line('#if defined(%s) && defined(%s)' % (dname, req)) + ret.cpp_warning_or_error('config option %s conflicts with option %s (which is also defined)' % (dname, req), opts.sanity_strict) + ret.line('#endif') + + ret.empty() + +# Add a header snippet for providing a __OVERRIDE_DEFINES__ section. +def add_override_defines_section(opts, ret): + ret.empty() + ret.line('/*') + ret.line(' * You may add overriding #define/#undef directives below for') + ret.line(' * customization. You of course cannot un-#include or un-typedef') + ret.line(' * anything; these require direct changes above.') + ret.line(' */') + ret.empty() + ret.line('/* __OVERRIDE_DEFINES__ */') + ret.empty() + +# Add automatic DUK_OPT_XXX and DUK_OPT_NO_XXX handling for backwards +# compatibility with Duktape 1.2 and before. +def add_feature_option_handling(opts, ret, forced_opts): + ret.chdr_block_heading('Feature option handling') + + for doc in use_defs_list: + # If a related feature option exists, it can be used to force + # enable/disable the target feature. If neither feature option + # (DUK_OPT_xxx or DUK_OPT_NO_xxx) is given, revert to default. + + config_define = doc['define'] + + feature_define = None + feature_no_define = None + inverted = False + if doc.has_key('feature_enables'): + feature_define = doc['feature_enables'] + elif doc.has_key('feature_disables'): + feature_define = doc['feature_disables'] + inverted = True + else: + pass + + if feature_define is not None: + feature_no_define = 'DUK_OPT_NO_' + feature_define[8:] + ret.line('#if defined(%s)' % feature_define) + if inverted: + ret.line('#undef %s' % config_define) + else: + ret.line('#define %s' % config_define) + ret.line('#elif defined(%s)' % feature_no_define) + if inverted: + ret.line('#define %s' % config_define) + else: + ret.line('#undef %s' % config_define) + ret.line('#else') + undef_done = False + emit_default_from_config_meta(ret, doc, forced_opts, undef_done) + ret.line('#endif') + elif doc.has_key('feature_snippet'): + ret.lines(doc['feature_snippet']) + else: + pass + + ret.empty() + + ret.empty() + +# Development time helper: add DUK_ACTIVE which provides a runtime C string +# indicating what DUK_USE_xxx config options are active at run time. This +# is useful in genconfig development so that one can e.g. diff the active +# run time options of two headers. This is intended just for genconfig +# development and is not available in normal headers. +def add_duk_active_defines_macro(ret): + ret.chdr_block_heading('DUK_ACTIVE_DEFINES macro (development only)') + + idx = 0 + for doc in use_defs_list: + defname = doc['define'] + + ret.line('#if defined(%s)' % defname) + ret.line('#define DUK_ACTIVE_DEF%d " %s"' % (idx, defname)) + ret.line('#else') + ret.line('#define DUK_ACTIVE_DEF%d ""' % idx) + ret.line('#endif') + + idx += 1 + + tmp = [] + for i in xrange(idx): + tmp.append('DUK_ACTIVE_DEF%d' % i) + + ret.line('#define DUK_ACTIVE_DEFINES ("Active: ["' + ' '.join(tmp) + ' " ]")') + +# +# duk_config.h generation +# + +# Generate the default duk_config.h which provides automatic detection of +# platform, compiler, architecture, and features for major platforms. +# Use manually written monolithic header snippets from Duktape 1.2 for +# generating the header. This header is Duktape 1.2 compatible and supports +# DUK_OPT_xxx feature options. Later on the DUK_OPT_xxx options will be +# removed and users can override DUK_USE_xxx flags directly by modifying +# duk_config.h or by generating a new header using genconfig. +def generate_autodetect_duk_config_header(opts, meta_dir): + ret = FileBuilder(base_dir=os.path.join(meta_dir, 'header-snippets'), \ + use_cpp_warning=opts.use_cpp_warning) + + forced_opts = get_forced_options(opts) + + ret.snippet_relative('comment_prologue.h.in') + ret.empty() + + ret.line('#ifndef DUK_CONFIG_H_INCLUDED') + ret.line('#define DUK_CONFIG_H_INCLUDED') + ret.empty() + + # Compiler features, processor/architecture, OS, compiler + ret.snippet_relative('compiler_features.h.in') + ret.empty() + ret.snippet_relative('rdtsc.h.in') # XXX: move downwards + ret.empty() + ret.snippet_relative('platform1.h.in') + ret.empty() + + # Feature selection, system include, Date provider + # Most #include statements are here + ret.snippet_relative('platform2.h.in') + ret.empty() + ret.snippet_relative('ullconsts.h.in') + ret.empty() + ret.snippet_relative('libc.h.in') + ret.empty() + + # Number types + ret.snippet_relative('types1.h.in') + ret.line('#if defined(DUK_F_HAVE_INTTYPES)') + ret.line('/* C99 or compatible */') + ret.empty() + ret.snippet_relative('types_c99.h.in') + ret.empty() + ret.line('#else /* C99 types */') + ret.empty() + ret.snippet_relative('types_legacy.h.in') + ret.empty() + ret.line('#endif /* C99 types */') + ret.empty() + ret.snippet_relative('types2.h.in') + ret.empty() + ret.snippet_relative('64bitops.h.in') + ret.empty() + + # Alignment + ret.snippet_relative('alignment.h.in') + ret.empty() + + # Object layout + ret.snippet_relative('object_layout.h.in') + ret.empty() + + # Byte order + ret.snippet_relative('byteorder.h.in') + ret.empty() + + # Packed duk_tval + ret.snippet_relative('packed_tval.h.in') + ret.empty() + + # Detect 'fast math' + ret.snippet_relative('reject_fast_math.h.in') + ret.empty() + + # IEEE double constants + ret.snippet_relative('double_const.h.in') + ret.empty() + + # Math and other ANSI replacements, NetBSD workaround, paranoid math, paranoid Date + ret.snippet_relative('repl_math.h.in') + ret.empty() + ret.snippet_relative('paranoid_date.h.in') + ret.empty() + ret.snippet_relative('repl_ansi.h.in') + ret.empty() + + # Platform function pointers + ret.snippet_relative('platform_funcptr.h.in') + ret.empty() + + # General compiler stuff + ret.snippet_relative('stringify.h.in') + ret.empty() + ret.snippet_relative('segfault.h.in') + ret.empty() + ret.snippet_relative('unreferenced.h.in') + ret.empty() + ret.snippet_relative('noreturn.h.in') + ret.empty() + ret.snippet_relative('unreachable.h.in') + ret.empty() + ret.snippet_relative('likely.h.in') + ret.empty() + ret.snippet_relative('inline.h.in') + ret.empty() + ret.snippet_relative('visibility.h.in') + ret.empty() + ret.snippet_relative('file_line_func.h.in') + ret.empty() + ret.snippet_relative('byteswap.h.in') + ret.empty() + + # Arhitecture, OS, and compiler strings + ret.snippet_relative('arch_string.h.in') + ret.empty() + ret.snippet_relative('os_string.h.in') + ret.empty() + ret.snippet_relative('compiler_string.h.in') + ret.empty() + + # Target info + ret.snippet_relative('target_info.h.in') + ret.empty() + + # Longjmp handling + ret.snippet_relative('longjmp.h.in') + ret.empty() + + # Unsorted flags, contains almost all actual Duktape-specific + # but platform independent features + ret.snippet_relative('unsorted_flags.h.in') + ret.empty() + + # User declarations + ret.snippet_relative('user_declare.h.in') + ret.empty() + + # Emit forced options. If a corresponding option is already defined + # by a snippet above, #undef it first. + + tmp = Snippet(ret.join().split('\n')) + first_forced = True + for doc in use_defs_list: + defname = doc['define'] + + if doc.get('removed', None) is not None and opts.omit_removed_config_options: + continue + if doc.get('deprecated', None) is not None and opts.omit_deprecated_config_options: + continue + if doc.get('unused', False) == True and opts.omit_unused_config_options: + continue + if not forced_opts.has_key(defname): + continue + + if not doc.has_key('default'): + raise Exception('config option %s is missing default value' % defname) + + if first_forced: + ret.chdr_block_heading('Forced options') + first_forced = False + + undef_done = False + if tmp.provides.has_key(defname): + ret.line('#undef ' + defname) + undef_done = True + + emit_default_from_config_meta(ret, doc, forced_opts, undef_done) + + ret.empty() + + # If manually-edited snippets don't #define or #undef a certain + # config option, emit a default value here. This is useful to + # fill-in for new config options not covered by manual snippets + # (which is intentional). + + tmp = Snippet(ret.join().split('\n')) + need = {} + for doc in use_defs_list: + if doc.get('removed', None) is not None: # XXX: check version + continue + need[doc['define']] = True + for k in tmp.provides.keys(): + if need.has_key(k): + del need[k] + need_keys = sorted(need.keys()) + + if len(need_keys) > 0: + ret.chdr_block_heading('Autogenerated defaults') + + for k in need_keys: + #print('config option %s not covered by manual snippets, emitting default automatically' % k) + emit_default_from_config_meta(ret, use_defs[k], {}, False) + + ret.empty() + + ret.snippet_relative('custom_header.h.in') + ret.empty() + + if len(opts.fixup_header_lines) > 0: + ret.chdr_block_heading('Fixups') + for line in opts.fixup_header_lines: + ret.line(line) + ret.empty() + + add_override_defines_section(opts, ret) + + # Date provider snippet is after custom header and overrides, so that + # the user may define e.g. DUK_USE_DATE_NOW_GETTIMEOFDAY in their + # custom header. + ret.snippet_relative('date_provider.h.in') + ret.empty() + + # Sanity checks + # XXX: use autogenerated sanity checks instead + ret.snippet_relative('sanity.h.in') + ret.empty() + + if opts.emit_legacy_feature_check: + # XXX: this doesn't really make sense for the autodetect + # header yet, because sanity.h.in already covers these. + add_legacy_feature_option_checks(opts, ret) + if opts.emit_config_sanity_check: + add_config_option_checks(opts, ret) + if opts.add_active_defines_macro: + add_duk_active_defines_macro(ret) + + ret.line('#endif /* DUK_CONFIG_H_INCLUDED */') + ret.empty() # for trailing newline + return remove_duplicate_newlines(ret.join()) + +# Generate a duk_config.h where platform, architecture, and compiler are +# all either autodetected or specified by user. When autodetection is +# used, the generated header is based on modular snippets and metadata to +# be more easily maintainable than manually edited monolithic snippets. +# +# This approach will replace the legacy autodetect header in Duktape 1.4, +# and most likely the separate barebones header also. +# +# The generated header is Duktape 1.2 compatible for now, and supports +# DUK_OPT_xxx feature options. Later on the DUK_OPT_xxx options will be +# removed and user code overrides DUK_USE_xxx flags directly by modifying +# duk_config.h manually or by generating a new header using genconfig. +def generate_autodetect_duk_config_header_modular(opts, meta_dir): + ret = FileBuilder(base_dir=os.path.join(meta_dir, 'header-snippets'), \ + use_cpp_warning=opts.use_cpp_warning) + + forced_opts = get_forced_options(opts) + + platforms = None + with open(os.path.join(meta_dir, 'platforms.yaml'), 'rb') as f: + platforms = yaml.load(f) + architectures = None + with open(os.path.join(meta_dir, 'architectures.yaml'), 'rb') as f: + architectures = yaml.load(f) + compilers = None + with open(os.path.join(meta_dir, 'compilers.yaml'), 'rb') as f: + compilers = yaml.load(f) + + ret.line('/*') + ret.line(' * duk_config.h autodetect header generated by genconfig.py.') + ret.line(' *') + ret.line(' * Git commit: %s' % opts.git_commit or 'n/a') + ret.line(' * Git describe: %s' % opts.git_describe or 'n/a') + ret.line(' *') + if opts.platform is not None: + ret.line(' * Platform: ' + opts.platform) + else: + ret.line(' * Supported platforms:') + for platf in platforms['autodetect']: + ret.line(' * - %s' % platf.get('name', platf.get('check'))) + ret.line(' *') + if opts.architecture is not None: + ret.line(' * Architecture: ' + opts.architecture) + else: + ret.line(' * Supported architectures:') + for arch in architectures['autodetect']: + ret.line(' * - %s' % arch.get('name', arch.get('check'))) + ret.line(' *') + if opts.compiler is not None: + ret.line(' * Compiler: ' + opts.compiler) + else: + ret.line(' * Supported compilers:') + for comp in compilers['autodetect']: + ret.line(' * - %s' % comp.get('name', comp.get('check'))) + ret.line(' *') + ret.line(' */') + ret.empty() + ret.line('#ifndef DUK_CONFIG_H_INCLUDED') + ret.line('#define DUK_CONFIG_H_INCLUDED') + ret.empty() + + ret.chdr_block_heading('Intermediate helper defines') + + idx_deps = len(ret.vals) # position where to emit dependencies + + # Feature selection, system include, Date provider + # Most #include statements are here + + if opts.platform is not None: + ret.chdr_block_heading('Platform: ' + opts.platform) + + ret.snippet_relative('platform_cppextras.h.in') + ret.empty() + + # XXX: better to lookup platforms metadata + include = 'platform_%s.h.in' % opts.platform + validate_platform_file(os.path.join(meta_dir, 'header-snippets', include)) + ret.snippet_relative(include) + else: + ret.chdr_block_heading('Platform autodetection') + + ret.snippet_relative('platform_cppextras.h.in') + ret.empty() + + for idx, platf in enumerate(platforms['autodetect']): + check = platf.get('check', None) + include = platf['include'] + validate_platform_file(os.path.join(meta_dir, 'header-snippets', include)) + + if idx == 0: + ret.line('#if defined(%s)' % check) + else: + if check is None: + ret.line('#else') + else: + ret.line('#elif defined(%s)' % check) + ret.snippet_relative(include) + ret.line('#endif /* autodetect platform */') + + ret.snippet_relative('platform_sharedincludes.h.in') + ret.empty() + + if opts.architecture is not None: + ret.chdr_block_heading('Architecture: ' + opts.architecture) + + # XXX: better to lookup architectures metadata + include = 'architecture_%s.h.in' % opts.architecture + validate_architecture_file(os.path.join(meta_dir, 'header-snippets', include)) + ret.snippet_relative(include) + else: + ret.chdr_block_heading('Architecture autodetection') + + for idx, arch in enumerate(architectures['autodetect']): + check = arch.get('check', None) + include = arch['include'] + validate_architecture_file(os.path.join(meta_dir, 'header-snippets', include)) + + if idx == 0: + ret.line('#if defined(%s)' % check) + else: + if check is None: + ret.line('#else') + else: + ret.line('#elif defined(%s)' % check) + ret.snippet_relative(include) + ret.line('#endif /* autodetect architecture */') + + if opts.compiler is not None: + ret.chdr_block_heading('Compiler: ' + opts.compiler) + + # XXX: better to lookup compilers metadata + include = 'compiler_%s.h.in' % opts.compiler + validate_compiler_file(os.path.join(meta_dir, 'header-snippets', include)) + ret.snippet_relative(include) + else: + ret.chdr_block_heading('Compiler autodetection') + + for idx, comp in enumerate(compilers['autodetect']): + check = comp.get('check', None) + include = comp['include'] + validate_compiler_file(os.path.join(meta_dir, 'header-snippets', include)) + + if idx == 0: + ret.line('#if defined(%s)' % check) + else: + if check is None: + ret.line('#else') + else: + ret.line('#elif defined(%s)' % check) + ret.snippet_relative(include) + ret.line('#endif /* autodetect compiler */') + + # FIXME: The snippets below have some conflicts with the platform, + # architecture, and compiler snippets files included above. These + # need to be resolved so that (a) each define is only provided from + # one place or (b) the latter definition is a "fill-in" which is + # only used when a certain define is missing from e.g. a compiler + # snippet (useful for e.g. compiler defines which have sane, standard + # defaults). + + # FIXME: __uclibc__ needs stdlib.h, but it really is the only exception + ret.snippet_relative('libc.h.in') + ret.empty() + + # Number types + ret.snippet_relative('types1.h.in') + ret.line('#if defined(DUK_F_HAVE_INTTYPES)') + ret.line('/* C99 or compatible */') + ret.empty() + ret.snippet_relative('types_c99.h.in') + ret.empty() + ret.line('#else /* C99 types */') + ret.empty() + ret.snippet_relative('types_legacy.h.in') + ret.empty() + ret.line('#endif /* C99 types */') + ret.empty() + ret.snippet_relative('types2.h.in') + ret.empty() + ret.snippet_relative('64bitops.h.in') + ret.empty() + + # Alignment + ret.snippet_relative('alignment.h.in') + ret.empty() + + # Object layout + ret.snippet_relative('object_layout.h.in') + ret.empty() + + # Byte order + # FIXME: from the architecture snippet + ret.snippet_relative('byteorder.h.in') + ret.empty() + + # Packed duk_tval + # FIXME: from the architecture snippet + ret.snippet_relative('packed_tval.h.in') + ret.empty() + + # Detect 'fast math' + ret.snippet_relative('reject_fast_math.h.in') + ret.empty() + + # IEEE double constants + # FIXME: these should maybe be 'fill-ins' if previous headers + # didn't provide something + ret.snippet_relative('double_const.h.in') + ret.empty() + + # Math and other ANSI replacements, NetBSD workaround, paranoid math, paranoid Date + ret.snippet_relative('repl_math.h.in') + ret.empty() + ret.snippet_relative('paranoid_date.h.in') + ret.empty() + ret.snippet_relative('repl_ansi.h.in') + ret.empty() + + # Platform function pointers + ret.snippet_relative('platform_funcptr.h.in') + ret.empty() + + # General compiler stuff + ret.snippet_relative('stringify.h.in') + ret.empty() + ret.snippet_relative('segfault.h.in') + ret.empty() + ret.snippet_relative('unreferenced.h.in') + ret.empty() + ret.snippet_relative('noreturn.h.in') + ret.empty() + ret.snippet_relative('unreachable.h.in') + ret.empty() + ret.snippet_relative('likely.h.in') + ret.empty() + ret.snippet_relative('inline.h.in') + ret.empty() + ret.snippet_relative('visibility.h.in') + ret.empty() + ret.snippet_relative('file_line_func.h.in') + ret.empty() + ret.snippet_relative('byteswap.h.in') + ret.empty() + + # These come directly from platform, architecture, and compiler + # snippets. + #ret.snippet_relative('arch_string.h.in') + #ret.empty() + #ret.snippet_relative('os_string.h.in') + #ret.empty() + #ret.snippet_relative('compiler_string.h.in') + #ret.empty() + #ret.snippet_relative('longjmp.h.in') + #ret.empty() + + # Target info + ret.snippet_relative('target_info.h.in') + ret.empty() + + # Automatic DUK_OPT_xxx feature option handling + # FIXME: platform setjmp/longjmp defines now conflict with this + if True: + # Unsorted flags, contains almost all actual Duktape-specific + # but platform independent features + #ret.snippet_relative('unsorted_flags.h.in') + #ret.empty() + + add_feature_option_handling(opts, ret, forced_opts) + + ret.snippet_relative('user_declare.h.in') + ret.empty() + + # Emit forced options. If a corresponding option is already defined + # by a snippet above, #undef it first. + + tmp = Snippet(ret.join().split('\n')) + first_forced = True + for doc in use_defs_list: + defname = doc['define'] + + if doc.get('removed', None) is not None and opts.omit_removed_config_options: + continue + if doc.get('deprecated', None) is not None and opts.omit_deprecated_config_options: + continue + if doc.get('unused', False) == True and opts.omit_unused_config_options: + continue + if not forced_opts.has_key(defname): + continue + + if not doc.has_key('default'): + raise Exception('config option %s is missing default value' % defname) + + if first_forced: + ret.chdr_block_heading('Forced options') + first_forced = False + + undef_done = False + if tmp.provides.has_key(defname): + ret.line('#undef ' + defname) + undef_done = True + + emit_default_from_config_meta(ret, doc, forced_opts, undef_done) + + ret.empty() + + # If manually-edited snippets don't #define or #undef a certain + # config option, emit a default value here. This is useful to + # fill-in for new config options not covered by manual snippets + # (which is intentional). + + tmp = Snippet(ret.join().split('\n')) + need = {} + for doc in use_defs_list: + if doc.get('removed', None) is not None: # XXX: check version + continue + need[doc['define']] = True + for k in tmp.provides.keys(): + if need.has_key(k): + del need[k] + need_keys = sorted(need.keys()) + + if len(need_keys) > 0: + ret.chdr_block_heading('Autogenerated defaults') + + for k in need_keys: + #print('config option %s not covered by manual snippets, emitting default automatically' % k) + emit_default_from_config_meta(ret, use_defs[k], {}, False) + + ret.empty() + + ret.snippet_relative('custom_header.h.in') + ret.empty() + + if len(opts.fixup_header_lines) > 0: + ret.chdr_block_heading('Fixups') + for line in opts.fixup_header_lines: + ret.line(line) + ret.empty() + + add_override_defines_section(opts, ret) + + # Date provider snippet is after custom header and overrides, so that + # the user may define e.g. DUK_USE_DATE_NOW_GETTIMEOFDAY in their + # custom header. + ret.snippet_relative('date_provider.h.in') + ret.empty() + + ret.fill_dependencies_for_snippets(idx_deps) + + # FIXME: use autogenerated sanity instead of sanity.h.in + + ret.snippet_relative('sanity.h.in') + ret.empty() + + if opts.emit_legacy_feature_check: + # FIXME: this doesn't really make sense for the autodetect header yet + add_legacy_feature_option_checks(opts, ret) + if opts.emit_config_sanity_check: + add_config_option_checks(opts, ret) + if opts.add_active_defines_macro: + add_duk_active_defines_macro(ret) + + ret.line('#endif /* DUK_CONFIG_H_INCLUDED */') + ret.empty() # for trailing newline + return remove_duplicate_newlines(ret.join()) + +# Generate a barebones duk_config.h header for a specific platform, architecture, +# and compiler. The header won't do automatic feature detection and does not +# support DUK_OPT_xxx feature options (which will be removed in Duktape 2.x). +# Users can then modify this barebones header for very exotic platforms and manage +# the needed changes either as a YAML file or by appending a fixup header snippet. +# +# XXX: to be replaced by generate_modular_duk_config_header(). +def generate_barebones_duk_config_header(opts, meta_dir): + ret = FileBuilder(base_dir=os.path.join(meta_dir, 'header-snippets'), \ + use_cpp_warning=opts.use_cpp_warning) + + # XXX: Provide more defines from YAML config files so that such + # defines can be overridden more conveniently (e.g. DUK_COS). + + forced_opts = get_forced_options(opts) + + ret.line('/*') + ret.line(' * duk_config.h generated by genconfig.py for:') + ret.line(' * platform: %s' % opts.platform) + ret.line(' * compiler: %s' % opts.compiler) + ret.line(' * architecture: %s' % opts.architecture) + ret.line(' *') + ret.line(' * Git commit: %s' % opts.git_commit or 'n/a') + ret.line(' * Git describe: %s' % opts.git_describe or 'n/a') + ret.line(' */') + ret.empty() + ret.line('#ifndef DUK_CONFIG_H_INCLUDED') + ret.line('#define DUK_CONFIG_H_INCLUDED') + + ret.chdr_block_heading('Intermediate helper defines') + + idx_deps = len(ret.vals) # position where to emit dependencies + + ret.chdr_block_heading('Platform headers and typedefs') + + if opts.platform is None: + raise Exception('no platform specified') + + fn = 'platform_%s.h.in' % opts.platform + ret.snippet_relative(fn) + ret.empty() + ret.snippet_relative('types_c99.h.in') # XXX: C99 typedefs forced for now + ret.snippet_relative('types2.h.in') # XXX: boilerplate type stuff + + ret.chdr_block_heading('Platform features') + + # XXX: double constants + # XXX: replacement functions + # XXX: inherit definitions (like '#define DUK_FFLUSH fflush') from a + # generic set of defaults, allow platform configs to override + + ret.snippet_relative('platform_generic.h.in') + + ret.chdr_block_heading('Compiler features') + + if opts.compiler is None: + raise Exception('no compiler specified') + + fn = 'compiler_%s.h.in' % opts.compiler + ret.snippet_relative(fn) + + # noreturn, vacopy, etc + # visibility attributes + + ret.chdr_block_heading('Architecture features') + + if opts.architecture is None: + raise Exception('no architecture specified') + + fn = 'architecture_%s.h.in' % opts.architecture + ret.snippet_relative(fn) + + ret.chdr_block_heading('Config options') + + tags = get_tag_list_with_preferred_order(header_tag_order) + + handled = {} + + # Mark all defines 'provided' by the snippets so far as handled. + # For example, if the system header provides a DUK_USE_OS_STRING, + # we won't emit it again below with its default value (but will + # emit an override value if specified). + + for sn in ret.vals: + for k in sn.provides.keys(): + handled[k] = True + + for tag in tags: + ret.line('/* ' + get_tag_title(tag) + ' */') + + for doc in use_defs_list: + defname = doc['define'] + + if doc.get('removed', None) is not None and opts.omit_removed_config_options: + continue + if doc.get('deprecated', None) is not None and opts.omit_deprecated_config_options: + continue + if doc.get('unused', False) == True and opts.omit_unused_config_options: + continue + + if tag != doc['tags'][0]: # sort under primary tag + continue + + if not doc.has_key('default'): + raise Exception('config option %s is missing default value' % defname) + + undef_done = False + + if handled.has_key(defname): + defval = forced_opts.get(defname, None) + if defval is None: + ret.line('/* %s already emitted above */' % defname) + continue + + # Define already emitted by snippets above but + # an explicit override wants to redefine it. + # Undef first and then use shared handler to + # setup the forced value. + ret.line('#undef ' + defname) + undef_done = True + + # FIXME: macro args; DUK_USE_USER_DECLARE vs. DUK_USE_USER_DECLARE() + # vs. DUK_USE_USER_DECLARE(x,y) + + handled[defname] = True + emit_default_from_config_meta(ret, doc, forced_opts, undef_done) + + ret.empty() + + if len(opts.fixup_header_lines) > 0: + ret.chdr_block_heading('Fixups') + for line in opts.fixup_header_lines: + ret.line(line) + + add_override_defines_section(opts, ret) + + # Date provider snippet is after custom header and overrides, so that + # the user may define e.g. DUK_USE_DATE_NOW_GETTIMEOFDAY in their + # custom header. + ret.empty() + ret.snippet_relative('date_provider.h.in') + ret.empty() + + ret.fill_dependencies_for_snippets(idx_deps) + + # XXX: ensure no define is unhandled at the end + + # Check for presence of legacy feature options (DUK_OPT_xxx), + # and consistency of final DUK_USE_xxx options. + # + # These could also be emitted into Duktape source code, but it's + # probably better that the checks can be easily disabled from + # duk_config.h. + + if opts.emit_legacy_feature_check: + add_legacy_feature_option_checks(opts, ret) + if opts.emit_config_sanity_check: + add_config_option_checks(opts, ret) + if opts.add_active_defines_macro: + add_duk_active_defines_macro(ret) + + ret.line('#endif /* DUK_CONFIG_H_INCLUDED */') + ret.empty() # for trailing newline + + return remove_duplicate_newlines(serialize_snippet_list(ret.vals)) # XXX: refactor into FileBuilder + +# +# Main +# + +def main(): + # Forced options from multiple sources are gathered into a shared list + # so that the override order remains the same as on the command line. + force_options_yaml = [] + def add_force_option_yaml(option, opt, value, parser): + # XXX: check that YAML parses + force_options_yaml.append(value) + def add_force_option_file(option, opt, value, parser): + # XXX: check that YAML parses + with open(value, 'rb') as f: + force_options_yaml.append(f.read()) + def add_force_option_define(option, opt, value, parser): + tmp = value.split('=') + if len(tmp) == 1: + doc = { tmp[0]: True } + elif len(tmp) == 2: + doc = { tmp[0]: tmp[1] } + else: + raise Exception('invalid option value: %r' % value) + force_options_yaml.append(yaml.safe_dump(doc)) + def add_force_option_undefine(option, opt, value, parser): + tmp = value.split('=') + if len(tmp) == 1: + doc = { tmp[0]: False } + else: + raise Exception('invalid option value: %r' % value) + force_options_yaml.append(yaml.safe_dump(doc)) + + fixup_header_lines = [] + def add_fixup_header_line(option, opt, value, parser): + fixup_header_lines.append(value) + def add_fixup_header_file(option, opt, value, parser): + with open(value, 'rb') as f: + for line in f: + if line[-1] == '\n': + line = line[:-1] + fixup_header_lines.append(line) + + commands = [ + 'autodetect-header', + 'barebones-header', + 'feature-documentation', + 'config-documentation' + ] + parser = optparse.OptionParser( + usage='Usage: %prog [options] COMMAND', + description='Generate a duk_config.h or config option documentation based on config metadata.', + epilog='COMMAND can be one of: ' + ', '.join(commands) + '.' + ) + parser.add_option('--metadata', dest='metadata', default=None, help='metadata directory or metadata tar.gz file') + parser.add_option('--output', dest='output', default=None, help='output filename for C header or RST documentation file') + parser.add_option('--platform', dest='platform', default=None, help='platform (for "barebones-header" command)') + parser.add_option('--compiler', dest='compiler', default=None, help='compiler (for "barebones-header" command)') + parser.add_option('--architecture', dest='architecture', default=None, help='architecture (for "barebones-header" command)') + parser.add_option('--dll', dest='dll', action='store_true', default=False, help='dll build of Duktape, affects symbol visibility macros especially on Windows') # FIXME: unimplemented + parser.add_option('--emit-legacy-feature-check', dest='emit_legacy_feature_check', action='store_true', default=False, help='emit preprocessor checks to reject legacy feature options (DUK_OPT_xxx)') + parser.add_option('--emit-config-sanity-check', dest='emit_config_sanity_check', action='store_true', default=False, help='emit preprocessor checks for config option consistency (DUK_OPT_xxx)') + parser.add_option('--omit-removed-config-options', dest='omit_removed_config_options', action='store_true', default=False, help='omit removed config options from generated headers') + parser.add_option('--omit-deprecated-config-options', dest='omit_deprecated_config_options', action='store_true', default=False, help='omit deprecated config options from generated headers') + parser.add_option('--omit-unused-config-options', dest='omit_unused_config_options', action='store_true', default=False, help='omit unused config options from generated headers') + parser.add_option('--add-active-defines-macro', dest='add_active_defines_macro', action='store_true', default=False, help='add DUK_ACTIVE_DEFINES macro, for development only') + parser.add_option('--define', type='string', dest='force_options_yaml', action='callback', callback=add_force_option_define, default=force_options_yaml, help='force #define option using a C compiler like syntax, e.g. "--define DUK_USE_DEEP_C_STACK" or "--define DUK_USE_TRACEBACK_DEPTH=10"') + parser.add_option('-D', type='string', dest='force_options_yaml', action='callback', callback=add_force_option_define, default=force_options_yaml, help='synonym for --define, e.g. "-DDUK_USE_DEEP_C_STACK" or "-DDUK_USE_TRACEBACK_DEPTH=10"') + parser.add_option('--undefine', type='string', dest='force_options_yaml', action='callback', callback=add_force_option_undefine, default=force_options_yaml, help='force #undef option using a C compiler like syntax, e.g. "--undefine DUK_USE_DEEP_C_STACK"') + parser.add_option('-U', type='string', dest='force_options_yaml', action='callback', callback=add_force_option_undefine, default=force_options_yaml, help='synonym for --undefine, e.g. "-UDUK_USE_DEEP_C_STACK"') + parser.add_option('--option-yaml', type='string', dest='force_options_yaml', action='callback', callback=add_force_option_yaml, default=force_options_yaml, help='force option(s) using inline YAML (e.g. --option-yaml "DUK_USE_DEEP_C_STACK: true")') + parser.add_option('--option-file', type='string', dest='force_options_yaml', action='callback', callback=add_force_option_file, default=force_options_yaml, help='YAML file(s) providing config option overrides') + parser.add_option('--fixup-file', type='string', dest='fixup_header_lines', action='callback', callback=add_fixup_header_file, default=fixup_header_lines, help='C header snippet file(s) to be appended to generated header, useful for manual option fixups') + parser.add_option('--fixup-line', type='string', dest='fixup_header_lines', action='callback', callback=add_fixup_header_line, default=fixup_header_lines, help='C header fixup line to be appended to generated header (e.g. --fixup-line "#define DUK_USE_FASTINT")') + parser.add_option('--sanity-warning', dest='sanity_strict', action='store_false', default=True, help='emit a warning instead of #error for option sanity check issues') + parser.add_option('--use-cpp-warning', dest='use_cpp_warning', action='store_true', default=False, help='emit a (non-portable) #warning when appropriate') + parser.add_option('--git-commit', dest='git_commit', default=None, help='git commit hash to be included in header comments') + parser.add_option('--git-describe', dest='git_describe', default=None, help='git describe string to be included in header comments') + (opts, args) = parser.parse_args() + + meta_dir = opts.metadata + if opts.metadata is None: + if os.path.isfile(os.path.join('.', 'genconfig_metadata.tar.gz')): + opts.metadata = 'genconfig_metadata.tar.gz' + elif os.path.isdir(os.path.join('.', 'config-options')): + opts.metadata = '.' + + if opts.metadata is not None and os.path.isdir(opts.metadata): + meta_dir = opts.metadata + print 'Using metadata directory: %r' % meta_dir + elif opts.metadata is not None and os.path.isfile(opts.metadata) and tarfile.is_tarfile(opts.metadata): + meta_dir = get_auto_delete_tempdir() + tar = tarfile.open(name=opts.metadata, mode='r:*') + tar.extractall(path=meta_dir) + print 'Using metadata tar file %r, unpacked to directory: %r' % (opts.metadata, meta_dir) + else: + raise Exception('metadata source must be a directory or a tar.gz file') + + scan_snippets(os.path.join(meta_dir, 'header-snippets')) + scan_use_defs(os.path.join(meta_dir, 'config-options')) + scan_opt_defs(os.path.join(meta_dir, 'feature-options')) + scan_use_tags() + scan_tags_meta(os.path.join(meta_dir, 'tags.yaml')) + print('Scanned %d DUK_OPT_xxx, %d DUK_USE_XXX, %d helper snippets' % \ + (len(opt_defs.keys()), len(use_defs.keys()), len(helper_snippets))) + #print('Tags: %r' % use_tags_list) + + if len(args) == 0: + raise Exception('missing command') + cmd = args[0] + + if cmd == 'autodetect-header': + cmd = 'autodetect-header-legacy' + + if cmd == 'autodetect-header-legacy': + # Generate a duk_config.h similar to Duktape 1.2 feature detection, + # based on manually written monolithic snippets. + # To be replaced by modular header. + result = generate_autodetect_duk_config_header(opts, meta_dir) + with open(opts.output, 'wb') as f: + f.write(result) + elif cmd == 'autodetect-header-modular': + # Generate a duk_config.h similar to Duktape 1.2 feature detection. + # Platform, architecture, and compiler can each be either autodetected + # or specified by user. Generated header is based on modular snippets + # rather than a monolithic platform detection header. + result = generate_autodetect_duk_config_header_modular(opts, meta_dir) + with open(opts.output, 'wb') as f: + f.write(result) + elif cmd == 'barebones-header': + # Generate a duk_config.h with default options for a specific platform, + # compiler, and architecture. + result = generate_barebones_duk_config_header(opts, meta_dir) + with open(opts.output, 'wb') as f: + f.write(result) + elif cmd == 'feature-documentation': + result = generate_feature_option_documentation(opts) + with open(opts.output, 'wb') as f: + f.write(result) + elif cmd == 'config-documentation': + result = generate_config_option_documentation(opts) + with open(opts.output, 'wb') as f: + f.write(result) + else: + raise Exception('invalid command: %r' % cmd) + +if __name__ == '__main__': + main() diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/config/genconfig_metadata.tar.gz b/3P/civetweb/src/third_party/duktape-1.3.0/config/genconfig_metadata.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..042de8f29a5c2359535e30dd8e14e7e4dafdf766 GIT binary patch literal 87189 zcmXV%1zQ#G*M;epmM#fN>8?YAbf~{>P8C&{#3-?bNN@pTefk*kAT0Uzr4k9=jJ=^4WqH?Ez@AqhHZTz z^`W17=vxM_XhLsJE+*u7hj?dlkk`&+D3_@e%=PAC_G=R2Ly`qNb3C1Ort&qJ2p_>m z#|_y~N`k4_&oB&3P{p>c^zrvU2-M z|LH<+B~4>1q6Ouz+_R#KTc3m|wCy3_LPW@_fLw69=s7+tNjk`+W%y&TL7z3v3Jz@3 zDqiV0{CsQK*02bHCufp8FRpNmU+*q=Qwd?QkYW z1F7K;+Z4w{lEGwlnpYu_@HVGemd#wA6qO1YLoIV(Micf}_7K(w#YDR$qlMB;dC;!p z%Fll9Ulsk54&yNV3OstZZeh%C?rFZ2CNR12Va%N_vwspBzubgpb7-~O@bPNAJ8uIa z$W5fg(M;^=xtvk0-BJXg4R7TpsMXt8j%#K;+cI|%#P=m?knPPysn%S^mmIK!52n*C zDEIs}1>oO1%ci1Ge`Jujbig!F$gQ@+R^vZ_Bq|bXDY9S_9(Vv-Ef-)1$v`9 zCW}Zg!$edG#I<4lfScJ8%Z^bonSMF)_w<6}VjfymR5{_{qqJIWg-hr29Fr7kbPA)K zpUVq0&w0L{ZMl5wCu8X8C`iAQHF&;sijFv1^MD5}A&AcCEk|vmejFXj*q@sFW2DJO za#N9Gr{TCr7%wA?Vv3!-aAQzzraN3JEwqB*V<)O>_G_VHs612cZ9O-4{*^VKoU9L} zalZQ-h{b1c1r9|E`5-scmt7*puR;y}rterd z8bolYa=Wct@9G|qUOgt9p7W63YB_B9D!W#+4+3V+JdP)Y@@dr=KHNbeG; z@VvOdNzKUe_U)NQhWapI;~=8bZZ-r6z$OKPG4m*T@%CkV++faRZfVR&Z5`eC1(8;z>6kcoBn#ltxnLid)=(SP_%a30RZ;SVFm9UkqW#WV`_|QH=N#T5OCFui>%itSCh4${^`^DsRzLnLcFD=( z1kt#&e5yZttcNvJFDoA1_2>N==AQsW?qtClQZq=qums!J>^ml9PKGR3_(!R{ zJsct5SxvWb3BvOWr5!u#znz40*syS6|CV{H6=;LDXf8RcH@k9`|FM&4wRcatCCHv=Zg1^B3}=-76|`^5&Pl<+hlhTK+b)r zdE1=XU0XJ!5a^DDcq(f?UZcL;`o89wTZG%#nt6DO#o4evE_clIODwSp#EpjDk)r$GX(Rni$2#oEV z{+)RZzmR{lCsmxWp<(R+m_ZL(hoE(O{Rt`g6WHx_x)x-nQng09+5}tV8@Ls#UG~z~ zXo~j+s!K^*g!pN93vSE;j`-4B?|)C!yyTvRbvIFK=u+w(?Vj#Bu9;o#Ka_%$^+}Eb@MRbRwX>tgqqe z`|WVq;|abmhGsnMJ-@JNHJ_fYOgg#EjWShd59XO{gLZhIr(?X3Drq=-_GX&eDnwl` z49KelLT|b@&YI7W^VSJ~@q@q{;#Ux8Wed=jCjip^bin|hIPStmCAHkTrEt^F&4P~5#j zwTXB>*_E{M(Qns6KyR#FRI(NE^LVZUisxGfTX`9qSda95>RdXv_lazwToGyRVY=(& zZDE13I*_|+_-fs$g5QM~zPt4)UUs(W+%;XOWQ?~*hdA(H*&rfmObopln8kA=1s}+k zX)z=URYhh8l~iDx@%~-UJR?*hU1H_u_V*+%{@#4NPOj|Bgi>TH#2!?NzxB{kHkVHh zuT4Fe65QajGOJw}WeOY*QW7xnn1_ryt8dYA9g_{0WXabPms>*$Nr?Ud5F-7G!RF>eT>W zBEtluz`AC^FBN7}Tb!G&p`(9qGu5`f=>s|))*dEDuV<*50<7$3IGkeRW~&RbH=OUq zdcYqk>%Rk#wziRMfC}b(3aCjreKKx4x8Do=`59oWYj|x3nVM3 zC1rFAl3zs~F#;+suOfxDq`wGC#LF-(jx0VK>?wpX0_>Bcc^)?$csjcNqRby-h>~s~ z{hl%e)@|;g_;i0GfxQ@LnV-?}6W~;azX|;EFjhb%VC_P*fFY*lmHCJ%?Yfm0cLXwV zAls#lM5dD66*w{r68L~?3g?8(;fs;|p*6*T-7_wb@;=V=PB{8Sd(MC(ct*Dh@Ag;X zM^iG`?L0+^MQ=(zaFc(JuPhfagtwOP$B$>w&Mz=u+xf<~6TrIjC$vue*Vqy8?LO}; zB^%1tb&mMAR!Nf4Gq8BkYAye3w`>OXw0}ZvLWwMJVv5lB6H9JNj!Du}3|BNv=!fXT zXWi}ixfUXdH3pPKcJfWVoIk8~wr0dkWVe_P!*JvQTW;RFq579nrU}z(nA;4g2smN9 zv~!>Y@-5h)1PVbSnoDPSTuI#0L0%t86F?T5g^l_tdjV}rVmByv2+ybIlAmXC2|KvaeJ=g}u|D92W zaRxZ@F!sHzsw1ijw>3Qdy7$6OI_$zfsx5YDl9MM?3&6=6(~V93 z1LNqkohSq!>g6K0KlGi=nqdHb{=*v$HVVZEtE12shk!S3PEZRz>NyG}a8G;sET$(M zVk0R16YlJ+o7`@gj)>%8gnS{)n&`cv>mWfVVuT!)%HJf{`J`a7MBK;G1z`4`U}9d6?pMyV%hFQuwnItKkxW@$e+a`d{lT@)-4ezxX4e#B z*9yLLv|TE-+mW4D)x)2yucJlPN$;Wk8&uWBI}+b3b4SWZ#ZV>5`LV~^go$jWxu53D zHUE`YW_P%7L{ix5PMN}h+P3FsnxYfGO$b%2RiKd&Kg^+=Pwehm1qK=@vglt2T6|jx zpJmZ%=>v>+AAy^jwI|4rq(Q)I4SgmcXy&sOaqN0@F|~K`IkMM48q=_(P|V$4+~v>~ z0zcfA?kSAY+Y~jMlKx&m+s@5KTXhTYo8sV})ffrk2MY48)lv{;zsVS35nogs(gdD^@@r=vU2t&*2}Ww`;v8__vpM zkSqc3HE^H@0M~niQ_$8Q4a-28&D!Eu#FGiw#qUQVS1Zzw^x~1?68AQk*ZfbkC;9nM z@Rq{&hf)xbNOa0LH7q0(^VQ)zEPB;OAG`GjpPHFxLh-wiF3hg`A{Uad(?p?`A&o7} zurOVF-=3z40qjF~ximmn2Y;s7D$3GGv?t z3i-gaVxAlDy@g-BvcP0rfldGeI8>8}e{_oY3jVg1cX3m97HET(+&%VNFS(Yv z3-oIOF|vn_ZNg`{D}N-vwFt&pTYC#+bz5R7?V!(G_g4hU1n*C?D@9a#D<= zs1Kn!TqxJ{s-9EuKm~~tLfQ%^vkR0_M;KT!LTF&Nk{YOwHlo=Q4Yu}?`@<1RPZ}?rr*cg&h{N*ON56{5xRzh_aC%rw`+=)bS zC^#^KuwAlKWK#_JM#9-G7z?Is8cG`nqVmKU)eZ@wL|o z^^)X;`58$E+8>C9!5Z%ps z5uv7JDOx+SZWIP;+ync8tEmXFUUN6@91FC3K4dFP#ujPOAy3X!tp)~OGj-IE@Dvzi_a zreP>V`Enf2q~jC0WM~CHL-0rtvX|BepTnKzxZ9z}u)j1jBXwd-fylJB!e1%tM9HIE zJ_fSWUCBfU78OUy7HiTl)=9+Tfk0LD>Htsy_FZ8&qC*{#d1c$X1*aVdLBY&)Wq`5K zL$hGdq7qz^#l|2}$7gPm3Kvr_rshYKLlRAaL35ltuhF|)*Kt~`wnB{ZF65X8>u-Uz zgEX7)ODq?ZtPy?g+& zItVzF{F8>}^RPs)G$TxY{H(1u=`%^XQ~%>dZ+7qRX@_iU_G*TPNw_=kYX!iZAms8)Z&0 z)XrOF-El(7$Z@Ma_dMw;B$MxXj)J^!;dlh#etx)@78UcgYTU3Pv%`VQlq`=4&Qw6%9vG!!HQ?tkbC}(r>Y$+2JYzj_#A3 zbXp}kb<`Xo{O;I_yu=B#!JOH(*>o;Jw2w=SXiy=YBDs21LDQTIoP(SJ3eD5%jPwvm zdD3WK6Zfcbl|STr(Ae2Lb8Z@qL8&q1lAqEB*fQXOhmiTLBsrJ#47gIXVOEwvq%4Fo zBI~rH@dA-&F@&p)pP4?nv||)=4eD0Q30JBm=R41cP^jM?A>@=1$_aj-NR`v$%?=0xzHH6<>wfKVcMvq{|P}t4R^uD z?q_)aG0AAx1Z9G}3dfKaS0RP-ug!K@iMW_VF@{G!dpaFW)cDLO9YG-l705R0GZqFB z8A|MB5LsAsQ_|7ytXQ_pl}X|u)$ao$Dv2Ef+JaI)JV6*?5l4&wSUQXYZgK8xEJW1YwG`~In zqh2^*nr{NgFDWsEMnDw*@l@>dS{X&sY_A7o9VYb>(P}gHdE@jgZ*Okt>HL4}4h~o| zj>Tp0RdqN}n!4sU4-O#-%b@C#xMtx+Ju)z2z%$s-B}|xaXQSaSR3JRv(*M3*u8b+M zXNB2$r#`?xcJDgzxRKjg9S;QLDD?7efsZPa#({<#U|pFp4hSeZty{{j1N)x7Tv^5f z5B|+J-l~r47{81$cHX^#U4hm2YKq7Kv(B^o$G_azFkC#?*`g=n1S1aK_)T7 zTr;ZT?%@@7t{qARwA`aecb;Yr|2TS!!ES)p5#wAUBypG;3*oCKJrNR?nQ)gk8#79i z8CTxB&%})@0t)_VbG||PDna&+R1jA zy?~T0k;4>EN12E4XUFnsVZ$uOV7TOn^_6|NN=qUlvSpGa)XGyW)|KUD)v{2bz#rsw zygnge1q4EIhVIR}9w^>@zFB(Sud;RzKkK?()OQFJ_#NGvT zOj~hnrJ64nZXp5imT9k^*ayJK9VAA60{TKN4oO5={qzCC36&XR`u>|XR?ziHdO3A2 z@tl*N3eA+c>CJ`j-Q>aM%K+zS=y%x=N9u_7&uf|@t(V>LzdtMQ!Q@kgeNzqpD%>dm z2O3EXf7?2U3TSUqbfkQ)V?3agmz9-Hyd^^WnV1hB{IA?(#saWmNlqz{MyllEL)j>Z zvEs}Nvf$!Jpbny+3W&9LO0$;vUv!(j= zxEN))l3}_aEoF+?ZbDHDls1)Z!B=SjqE|jUX(ZV3wqGf~a|UuexIrQ+Vg`yqqX^hXCODEG$Qq72 z^}$r&w&vjX!ssx+^f?8&^U=rcpe?lcsyK%u2D#NzR8tB#Mkqq~(thYhx*MUY`MPR0 zmD+D$m*iVjs+k4V*I4)S@8-m$glfhn@ge31H8JcphIu2GIT!S#e$mi}hx`0^KN#yr z9&Xu5oqn)Tq zFwnsJ;qb|nr?#P+a53oMZyp*~+KZltn86_J_on4!<=~E|-c9F;0lN?1>~C3^XOscJ zbOPAmpE?6FQbOZEd9^mn+zIuJa;K6}+iKTt z1W^u&O24SKrpSV|jYN^wjY01w2?gsKBj1!omRkV(HoC!;7xx}fGxWQY{MU#!&{t!t zEH^e3S2&Ww^uiZLeSC}~hk^4K8Km{10r=0b;*+R1Dzm!G)%=liI5(P1Zlw1t@=4Ne zcu+Q>g+KNy!SAr7=-PMM3tI6)J)!ppl3E$sb0L2}M48(xajgyL1ykO4ou!gWm48}o zGrX;3#de;aRSQGQ)Fd06spIh)k{_oL>dtCl28!0ksR5dBKuu`s3gBe4eWK*P*zkuU zcZH1rx)&2b0xAV+J7w=e0`eYMj)K~TIi>iehAz+{5eNYDUd1yAoq?L|762U)(UCf2YKL~pPln$7slf=|%MhX%tu2_4ra#6^_+XIupM+6Po&ge@a> z2kej&xByerOsW->7rP9Co)V%iL=*xpZp(y~Mc?p9qTUU~ViFtE>{-pM@_GAJ#obuY zFy>EqfH_q9Rvx+mkKh}51>U>gP?Sf5>bR_P4Z_|OgrK&f4u&47XBlbO4P|!?l9loO zHu(ob0z(*_1Prd>MR(khh#zD65ETXSww!x~--TcNXx2U^5m9%O^hh0Sh|DgUqH4nL zm!0IjRs7BoUWzim;;pMBu4&ftqgHeNcNsf&VGWE$dLXDJWnC)`PM+Npk&cSUV7-u* zia7HFyPxIs%!G(U*;k$ejzg30e@)1^3B`~l`9F0N8mGS_$GopS$x3pN$j1gUDY_690!L_E8A#|@{yt3h4}G4|_CeGu5!vc- z|N0eo0UMRs{cxUU0OEXASlKQd(#(kg92FH=--3BiTaAne`M_a_+)EUU1r6V@ld!0d z)$ne;VU+G&grb*X?k}E73SNfk#M_=+ZfBJ@NxV zGgo?iF_*>I)9H(xrn95UzDN6J1>USlB2CDwPq`wmG1dbx+h7ygyUl~XB{h^RdeJuO zPv*|*+nwDRRocID{rR}D z*$L9U#`Ek728Qi3N<@7NLmH5T*d1$yI>ib+N7Z_8$9bWxRwwcIM_#u-pT_Pt`a^V~ z;5gui+UITX&B0qi0mR@;Yyz3yQQY1mDsu8dp4Pwd5p}y@Kzhg{CJW*758UL%kgvo4 zNEL}KHQR>uD@~LxZTW~raa05=eH7BCn}Y=HmK#WpA93?b$o&1L z))Qr1)z8QHeqkt0R?-BpKlyUQziH9g?N(E#w}SLezR_QlS5U*8(LX@RPdRp8)?-mx z0>!PgYQI~(j4~?(-O{;a!?sbxRhkh+)s+70a25&*`x+f9!NU)DW#JjZ?J~|%mVp=a zn!lL^T#=XIVnS9-3}Jv6P2gX<*M|h352r#?qC(9GR{XsYC~8q|6tC=-%DDrM@eeHP zv-_1!s_7ID(^9dEWzD|N%FTPP&RC@8IEVoPhw;yk8{_vTw|hUcdX)iZkzddgS#PK@ zFWuIwO3p(>c$hFhJ&eki`?YI9b+pUV!a3^{63QbJ;Zn%3`R!UDMepm$oD03~&g>~Q znG$Gl^o^5F1ZedaaEgs6+UFtz6`n=`b-ZR*K(l@T^q(9(L7<)Vg)p_%S;b`e5lrx? z-vgh~EPTEW3s$1?F-C6fZKIBN@9-QR68O^TqfPv|6*SqkOnPsB9$YH+;3^f_l4;XO zoO3Cf>B2%7NQ*@uSesujKXA zhcLr35Sl0;$7hz2d|?>q;Kc?Xdv(H2-*Ef|D-alkOgfwjHXr>!GjUua)&v>715MnXNKUp_U}Oq-5y=ppv*yN@OXwyB=x7<3ZI z8S%11sK@SwB^xpoYPm1$fv-fz7N*X&M{ym)4^+!aCfHF9HPFXesaS7U#Oamf)$yY0>J3D7 z$FWz8IMXHlh#*ZtD}6M`j3YsXDD1+{E{rfB6^yQFLK)=2u{g`NyOxN~%1Gz`_7Wjh zwRF~ktilVNE&#`~uX#Ri^{FdhPR6UdJi!Z;V^> zHwlS)hRK`$UYh*{qxv5yW0rHyv4d|?G+-DOlqr&`#ngLJ9;8;KBGrU#2BiyNJ~i=q zDJ#ecO@8U25`a8qQd6)0ER?Ypb6L;5lmiRQ}MW~6*@ z_uc~caH)xb-FNK><7P0Q;48RH&B%$4{CuJMmIly+gSs?8uj=5@I3uO_b$XgD4|o!o z23~o`onBPj*lhxcvDiAuRne4J*0h1+!~wC6U5I`P(26M}@!u;uy3ZT%247FP+`B9} z8rxEn=ptz4U@xa3AX6sMieyD!KzDS#IL~ZQ5OyPW-dklBwCkfM`bS};h2T;lZg(9B z9jc+pD^?4Y6!UL7k?G9i-bVLyyR?F9vpy5AH*T+%=LeJ6N&AWZKt*x+ z@jekx=k-?C?FBHq&m#kPig5dZgd3;>8kPSC2CGfB zQO^D$b5-ff%Ij7L<8LB9?BxJjp#=3!i))x@4C2#*AU(v??r4EiY2G@#d3gAXjG#3! zzk!WQ)K`!3xEo-}8k9`MiN}xcHB!}s{kd6@2uDu&{ zmK8&p^Fv(Fv4=!yC|pT0C8vagG`W*o)uUSLCgFcXQZ!;7Q|JN(T#rR?*b7G-aK5L*c2-jQ#bH6a$AjvQ4iR^) zN>}=6o9M(j=sjhmytED28s!)_`4+kQvL9lF*Np-MH^4$=J3yb6v z!6d<^3`KDsjB{b*9J+Vn0^4Oi0mr-OPn?%8kv1Of^tcV!o}vyZaU`p;KP!r1AD!^y z++QL4gO;st)HqZ^e*kfwDZp2CatF-C2+m zVLCgB|EMVVw%)ebxj9`NqohV>h=$)y=U+N~P@lxpf0=(;8jeIQ#;$46%<(0MHrN>d z1F4(|s|^{rbLPwMei#f%B>{QyfKE?OjGOIhtrb|}(CsOrtvD2KaIar*m|)if{Ca>l zJftPX*b7w5cU!0<47Y`zQv3Z|)=&`B&%d&)W-U@Oo(s^?i~gyN6-iaMO`NYO;$9_1 z8^t2%Vekg%?O&ZuL-z#>ot{Wt1jHFbC_>1@)eCkHUg?rbkmJu3;FQ*~KTq%`-O)7l zbDx~fNQ%6@9i8CB&DQfQ(X|f>+^^t9pOjh@cuk()FtvG_dZ?!l(Iq>LDd;~5 z>f5(0G3_YsQ_UTgx)H>aBEp*ws$+DVg@leUJilFH(NFfC4Dvz~AGJI8QK`>yJGVlAL=t)sJ@S zA^|j$6#pxp-qF(<6?v;C#KFb);T_v_uls~8&3arTRL29(I={I5nFFcQ820VLC3}3t z1q&mNF5BSXa4H|U&+kPGZ!?xZ)p`pXcC?|r9!Y(y%qREjo@i&G@4(lr z*lDDNEo_S}Pb}Tc(lGIL`TP*l6>^r)8bEE&?$*SBh;s2=ih?Jk)l))<=s5S4u@&X|j;@t;|>(%18)MaBf5-Qn9F-*Qfrex~lQ@yq7ecyx;6 z6{J7lLRuow^9XzwvXc(b9{`i3w1dEQr}OmNMkyi``V_RBH}d5`>P{6Nck#Akwy=96 z=@=k?Co`GsdLr34Pg?Z)9Ce@fti}zk^2r_sTWFX;HxB=`1SDE7>q2%SKA^sKkR*5f zJ3LB6Ot7YU)zi1jYdUh^VE6d7Q-mnbUywYxqI1a+f(v+(0abtaC*B|#Dg02C?M~Tm zK|X@G^_|AJ5idfpcuj%lsrVdUqtyz^wFEfF0vcxDwMuoJ#PuWez1Z7U^@-M+?BmlVH%mus%d-Db~?V{<i4`{fr zQ~KTFSubp&K?^l|@2T3_zSksvh?kGN;mgwX#6r2+#z04VuWu_?RV2jR^x6V4Zb2q@ z*Wl}*NSIf2L!~1$*GdnL2!tcFkPoucnLAJkjmoeg19ZQN9 z*^5HVS>Y23bH#rdOp1YZ(Bn)yDqcybWEju*Xuyom;TRW4&)|dJA2CCt^pi)|(@byZ z@15SKlI-0(=@PZ|`GanB7SVVzG-DPfpd@A7au0kjTuJFPVBOkKs`2|n1QJPV#)OQh zAg3U^5q^<^S9N4cuelX#;cCvH|6rFfdPnc&3^~E8I z=GTQIg!Pm}?wKr!m_18Mz|5vKTlOU$eSuj%NQ3(cL%(gWjrLHP7Z2{UI&=qw^w^7A z_!s<&JfvM96=VE&$Q>tFGM}e#$GvZ(ktz=tx8Cvuo!nnFol~Ag1>@+ax;4MOb9y*a z&r;|*xt-vuth`IuLuwtFpMi`4^`V`Q<3-6D`Hsw#E+LoN=iF8TqNiP1*k^^TZFEC= z?AyIiky)uVi}B{EpX(!^ZFmf4) zyS@QsB~by$2X9MqRCp`D!r&7)&_jNX6CU$8oudBgQV7x!ZIY$cCYoj(&vvWlCKuct zzb_~3lAP18sn?65cHKf*(?Jn|IeA>HeIh9vJ*oP^E9uzr=JnjK?d#<_abwM6Y*eJF%BqKU9IV*xDEpN#5(h)Kz{fAV zrPCND(GDNu?A=HN&V-#)@=&!IegFrRi(?Ex)irwzh-=HKJ+WlO0i?|t%AhvW|ZTlRe_tjr+lTrCXCEJ=-b@2ngU zV>qtr)j$W9cmw^|elzL}9fOg8*gg6?Ek8J7UQ%umhtT<7+RtW3>d$QMlkjmCZb30U z8s1ceXN-uC;`L#Tyl26ew%68h2hvyce-Gxzc;7C@%h!(cT87JX2-D{B9#VEpJYQus z|6P_Fbl5>Y37YoLGTxz5gcjD`xqqnlUb-UhXq>b&CKrn+#+MIj zz2T~xU1YI6p$vgRRPs7F9e=DAAT#8Zr8J_4?y!#m`a-pPC!l0pLxAz7+v6z&Mz+4% zWn>O=P`Oj9<=M^*RY397C2zq_=$&~BCTDPyOBaP8cTK=vsq)-{<%)PDZOy@T;b%=y zb&WpClnXKg`Q>M4%!o7COxWDyN9M7qJ7bZ^V{q(_FqG@Rr$9TMo1rKOzWCE`e`^=s zpIe?(Y`D^F<$vB5+U1;b%SN%pvMH>1q=hQFwdAlH0nCud&|ap)#f3@^?0^8l4O zL<4rQnQI3lZw;q$K+G^$=jH~KoP-a&&wfa2gf-A0gfd?nmJAu8=!UGw{;CPr*v@VoWf=E~VTaBn)b?cr{%QPTZ$~WOJIft)n-Xi9ZLKyG zpwYwj=b`HzB1TT?kKxLb%6U4OpwIvrybnNi`@ET6cxFW-G45~EUAr0||841azAK6Y zlElM}yC38!bDS+(z2%?}%){W{SY`*{X6^AO5GUixHH4A`4tJUutor;QWtie6Fbgwx6 zNJAWpVjiIjv;UmK%dA$}ZeN4g%)fo-vNNN!35_L09BfdG0K;}val8GgH@s~3=u8tfjFlMsI8xOwTYo( z9vR%;1+|M0*=cZKbvX0_4ab3zeM8}dhs zM}L0F5z|v+86G_2NZT+7(j!3yW*!e|L_y^M>9sVXH~Ob6PPKuwkzhiHu#MybkXVK1hnxm-)-FTOb(rdxdqeKE)sLoO)?t`DVv{Cf%zHru_i+AG4TH2c#$^4NE)De zi*28BNe0Jpz!9DH>(#ORi6kaCgy`rywLzU1un`-_|HMy~vo3F!KaSz&; z9f1Q#7vB2+mBgn9z*61p9+dkq&?x%;!uDZ^>eP?gV`XQep7&hk-_DKpKeYk13kum| z(WXw__`wKG12Px@-7qj+{x9g7>vVnxU5lDeFOB~-S{6j}?t z1T(vdn)(hLpSSKS9bZ8q;y2@7UQ1_zPIL=3^WW0Qh~k&gz8wRyYQTp0r+8qzl=cd6 z$apA|?D-xp5$jtcipB0@FyH>k#CPckpnR9v^&uB-2j}&`?h=6^JqHT(r@vj~XTJRN z!z-Y`-%bbvf&+I16)fp;$H)}6!k28kj(Ug4_TbNLE?b~Wx}p!goMkOC46Jg-S4bIH z&OaC>CFNd1>=}7a(SH~ic$)Vjg)Sn^iN}sodN{AWDghkryFE(vuWj<%Jk{V=+7 z_<&ZD?CgE9^c8B1A#L`%+{7?Z`Fq<)OgO* z%=Sz~6I1Z~*p);!&X%3r*TwiHiTQUoYp)=aKx<};HbJF`8sUVQJ<+lzEgYvi8D2@> zT&^=l3&%2v+(o9qAW_e|o3Djf8}kS#h)mZg5Yvc){EvOQ9K#}*d>^Kt6hJg~VMl)N zho;g#8B7C&KcOOG(7M4>;CIOD>pxh?1ynfR(6vB4!&O-vzl>sHAB#H_3NbN5V-q%v zhb})cScrXn79fIDJtw+5D%QJxGC5WYa=2!v|a)BFV4+)D;4%EPAm<)-fuzWt8R(t^JiyvBd#5T__0*VI2M z?Y?%lcIxq`L|4!GMS8(`&c?9Fb$+4Fm5}fLJ-??i9)I_cc}>+Z#Oo$CJ5 z7>xtFA|3zX>G0RVdIB`Yow&%xcZoeczY%3WS2Dj_G>Lo~-0{E4ETWrA z|3lp{7ZLu+^OHQ)r8pG_N4e?%8BC%u`|Q4A#`o5xW553S3-RA%&|D{9KRP7Yo@`iu3V3_Wli`L!zO9bD0ZS>L9Dc7TLx)ZH1JD&a zZ(%TV!AN*@n_JR1y>97VA{0g#9%$@W0kKai1_0&qqypvXwYNdf`5k34VE@0&;TKf$ z25NFH>$;e1YBay4+m&jomdv!-oAR7qzZb|(?gRf(WC_Cjbsx)3FA@PRuMY8sg?Dl1 zU6X-*jNw?6DH@^jGfF}y%0Bvc8X+{?POnZj!Q@60=foaKqp~c7cNpqUo8zjFG+n)m z89>t=c86SxM|`Vr*lYAotR2J9x}&;e|Ts$%i-jC=pa+ zd^)882bMg7FC$yqEH$wlH;g<2k+vVnkjzv&`M}MwPUBB`@}+OvuNQYVP?a}^R=`>V zcM5QCxJQeuPn0Am?a3~{s)w0oW%6%mNh6=^N}>1#CA)?9w4D?d!(K%& zTk32VyZqZ={?>mA4iMgyEj~>F%%8xAu>T9;E#Kxlt((_Pe{8HNIFrjRMriXPBJH2N zXpN=bQOZ~SvN1A~mpfow5Bz7IYS&0VfsZ5ZzCizpL^aUl4d%qX%!r>4=M<59s}@9Q z>J(Zlpz_BcS=Y%V!oo(G)T=mwlX>|{qGED!>9P%HLcw6)(SlYZ>8qPXBAb>y6dH=@ zyN24UY-qj=yV_F6KfoC306+C2Zwb4$tT;Ba80A(}*AV3^J-dO9cc3V$SGlbly~4nu#55513^0q{%JLh z9~y~jB7PEoy?DlE+fe&4%hoql7J^dCVWV|YTxWcD8H=3<9gN8@ZR37!Z>S2DZ)E~@ zKHTMXCqRuBmf5xO8Px$WRXlJC`WN%KyhgO0yx#_OrV5mg7rm7PMv*5{6?oz#Qk~=^ zQgJTOd_bcmqP+1_8$gNO5I0)YoYzMQTJxJPnXs3FT#*YxLV2w z&pywPVRM~|zZKuOv~He10u0cHUQ?R?+Vk8Vu;8sChwPP3;j)c>JVyj7_6p>bIc!a> zTni>gDK`3%ko_Y>a1dj&MXKY+4l!~lYv4b6T-PKK7)j#j)6#+)H;CW-|of3!CS^Eh*yr1H^@|xN6|a6 zo`lL&YRR(`aC9j7{H7h)cEpfzF;3f{lkw*r^r=%v> za|pkxJgx`pa`*8tsC^n~q+iQqt{!(1m{Oy6rr@?(AwlzBNUrJbL-s){$cT7EOBM+` zj6eMs#0c<$%;06K$?8H#@o+fhb_co)*!unCPM$yMV@S_{;^<>7yqstzl8t@$UWpLz zko>nCfx2sq)!q2`c=bIHL*g5-N%RDcH!9&vyiUFV5}$_2FYNvXs69rk-RCht&CiJB z|K-nW!3SW6?TyGazti+*pPKfIA3*r0=d@T<&yrQxw7Yg%MONBEdHkPABkvR(ip7Ta z#`N%$O&QTN3)+l(m=;K`C#LWg@Jw-h>L#@MXN^!g;o^=5(EXnKU|X&q<2k}dF!q|v zb4fW^Rm6i}ufpn&_Fblk`^KgIkEyfZs_KikHr?F~(nxoAhctpTC?y@zaOmzv=|-d* zg+mEQBMs6G(hY~R@A3bR@!tCp_8xn!^;>g3b8e#14DX75wgYKQWaLXKi72xVT5lK8 zXl+hZKGkY6iB#AJSj>#ZHyuRCyNG+l$TA=)3pa8|X`4lKc;F{l6b9e>F8KMGsxAXI zSSkSmA9063E#QPN;ny|scj;vCKKsDJ`%Bu=u*AUYE2B zR1P7xwv6nv(Fa9uN=?*3wgn(nlE`TE>AX#vA;GcTGmh7?P^^0vTFDY0`h5pf@<7}A z&t!w?EOkIxtkx!=ZZgp0%z}(M!t2$)-(9W|lw~=0l$M?O@hfI5#L?bomxHL$Z@TGI z_q+J#qE0!Pxqg+RNeP+DEn%5F=?9||61JCwNSl*04<>qaHVHh6aC6Qq`x3XeF@MLV zm@t18`CZC4!&iO-CBVyiF8WTpd=e*3M!S2%D!v0s!YR1~DWi722>;U}8e=!w9vpf6 z*wl!j0T}Y)-BHMYxpr3jBK<4th1f+J*;bOimNYdrQj-_N2U#^Uiv0rpXuapm$hZZq zP!;P+g-DCyKm->-2>>e0v-?M4m7GWmU9K*G=DzajnK`%nm4ivFMGq{u)b2a3tI%5gZM%>{ zGZ60%wqAAsoE1*Nt^N${zz5xuXAs|`u17oGAA~WQr^|Scg~z~|;QH}zY-0gm2{APEU&jf$S2Q3)pK+Os zoLT{_sGaLOG$43^ror)rmUi%=5XTd8@1)lBGFoh?C++jul;SRqKa90lrQ}$K$wlj@ zrO9iW^bLjg!>dv|QW8-lz?B54)9If@Z@V>+68|MqzMJIn$VBjCsZxHE_~yfyjvaqs zQinq48QP~B-M{R!yM65ZM3EY9&x&(VZ*9ef5Ke@tI^z2}*{L&jm*wxPGj2C%3R*Tf z9wg4Z{ZH5DfBy0;f%91b)#yMMk1zjYLS}9Yc`joeq;-gR&doh2uwUMk`1?o{PSsdx z%?P>6ibdfa%JQNgg_4w_qMrY>(Ks`UdpDJcqQ$*>3Lfm3`RM)qv@g9G@LmPsmO$!1 zar_&O%a%at%)yn9!j~1wNP8};#3}l6*peUan`4l8fENrwJI+O!~Rd4P_`RZHU6v$WN>{b$OExAY8PiTu+s)I8Rb1U`;Whw+kKnKWG0$B2DJE^MKVs+4GGv3`kAh2j(5; zmHyj~4?sUzpg-F}^~{@h`QFvcI+_ljt5prnbbWHwS9lqKShRGh9o(#VP*IZvjeL|F zOQ8?P?{KBf?h!cA&XM|_`^&!hx2;p|R%I#O<(K|mV(DIlU|ZF9fZfDa)pgm2!iXky zKs;d|m`ifJl>q)zf33IE`K8%GI#C>Jv#CK3NuojI4zhBXzU;YWfs1e7*wxY_gw(5M zW`gy%W6Q2)ezBEpf7CIB9&Fw=Uqi;++NuXl%^f>mV)Bv$ zq;9zrkZL@Xls{m}BIsjJue*m-i7$#hV(yP>*=hc90mOlikAzSuXtYm zmPo9p7CZl?+pQs~i5I$pt=G&MyRTT>?|ItkfR>H9|=xm(sWX zF2Jt}r)xlw8EORuAHJzS1U$bbO3wE~!5y>Qfup6E)6$E%!AeN4Qh&p(CgE{jDBPV~ zHAkpxOQjIXet59P3o}j|PRaW96w6SO7k;!$Hmz7zno?3{?&zw13*@y+ zTO>srW@o?jd6tKm-4z-O9s?|DG5=JJZD`@OD(jsdr8)D(CR%xC{mX28 zt+n20Z&6B?@8QG}iZM5<<}$+qGqfPOy5{P(^LbRCeCJxdkY4F_x{$`feGjQuj_!P6 zNl%Lb@bez(69HMvfe0W}I9BGkyvGOwlV8;_j{xP0q9^JeV=Wj+(@iTs!KF@i&A9mP z@nn4P7c+OC8+O!XbdFh}NJH1#IH3oBo93NyqIra-2;qEcfl}iH044)ogKTsOc0iEW zDLw@Io&t*3XrHd1wXsrw>pNCD@NBV2(e!C@91?~Qt92*>;&r$JV)-{fr+N0L%DTp1 z@UU_;@3ZSa-y*gSBznmNJLunG+mb>-z5MXEEqYDh`8oUM%4px2%hP>8ldvap( zNh=AXG}A%$^}y%eSi|huJii)wsen;d1Dnb2%|2o@!5`bX3muS`s)6AP@JCTVPl+iB zND;YQ{RVeiIy9RI_ev$>Z7-aR51NtXGX+Ecg8KYS@W8<20&JFaH@GNS!dl7^|7g(* zTa~HfNnB(Y3#_%Ws29es(L^?Xp|mrEm0KT=ZELj`JBb2>u{Q-xh<_yjN?wR-8RqCB z2!-hgqGkK>&ud)9jVps)#7Rdi5x$}KPXQ8l&19f9g93BiTcFP`K;Z0V@@Z-j4yO1< zqv||@Qx8CPdfQK6;Y(a$cqA7!dLInaw*)TBA2BY@|E%ULR(x_iD_=$qlfCi%mM(uC zwArH~K|w%UQO;T&(_ev4GU3szJ7ZKmxkNo7BM^h4e6QIe5}T$gbIfG#T<ZEaAltFVgzfnRG`=W=|QtivIK5gy@w}k50r)TEOJlVYN+4-VVnM^^bSz z^se;_26n^d?byK4H|Y-hqyk*H9&sqYE#N8uyVSr!QcyknZGL#T%3Z9*3EtjjE{8{O zICOZDEli|Pu)eF*y?OPteWVUHnFS0CJEJ690JlT3|6pJ1NAM~O6rcVj{7)#KIYBso zW!~k9qG9U0ZgP!bO!#_?5WH;$sA}GAy|(TGFnqUJmVCT<;C=FOjy7R6To!aO@`-y) z^Vxzk3jk#t0JeIt5!zdFuur@B|tY0SZPQ0476TZyH2gNY1Ow+#FY7oj!_6>J}43_f;{a+|*p2gn}tzC5yf zLc8&Iscq3OH?YhE&1fIihNE!z^Fr&ua$S3eJ9wE+J9WZbLq;e3LxSjVLtzM>HE(3< zEqW&h7?m%?5hwbnBL}J9^sIhnVpMjro~b)y_kYJe5O8sV!H46k_P4eD+}Ys{=qnPm zmnMC9myv%3$YKFIFd)8}jrSRx_i!`6{zGhd{46^Y%b3iJq34BveE#)w&v6H!7PN+d=3yo*_rHrz zajez`V*k83@3VS-SZ~r@FS{Pg8eI-fRHcZ7MJ|_tNq!evYu%Xs8~8l}Nz3%Jz6hRB z#N-$P$5gV4(r%r?lZe=3L)2GW85Hj;wnJp)x?j~<$@`cciYlRCD&)H6$ckVCHLFmG zv-<+Y=iN-R6EOZf;5b}GuzMmM4#OrfG$8TF0Oql)lHrWVL@xQoQnC_PJLUYs@<3FC zW}bg+Os`cxGuESQVnJavWrS?CbdJJ}`D3)L2~$_0v5!Qctr~Qn$eBn0DeFh#(IzX~ z6!xiR^S$g2WEhtT}u}LW;J_PAZ8|*XiZoc42`bo zPQakk3{>|=t!3lmMn^&8zL27Wv?sqlE%m_eMyjY@V`DjITK|1|>P${+KoA@Hhn}Hq zXX;j|8^PyouzQQcQCUpglWYuH(hQ}X+r?;v4AsTGX=PqSfoHV@oi zQ$V@(@Db#dvI;YTW^T{50-v^V=lmif@GAUwS*c2R@MOL)r64;6TIy;i8KyoI4ANW{ z#J3Dg35u&eIQ5AK? zycN{+jElB5OXV0nEdomP)ILL{DH1-j9AZoP1w8^)1$4l{6YLdKz~*r&CODqFY0@rP z%WIMn_^=Y)f9MqZYv78z5v|`clJ}VAXPHd@VRKpuT)Q7xTMnhR;?{^Lj!MG{ywNnaSYZdDeHnBqfb{kUYhy77a z*Et%jx}xQ`00yv*psU)b+F*2Ofn!fac%o@~iC((%OtmAC#^hQ4Ci`o(IQty2WxF%3 z*rB$wH}a0S+N+$?bG#y{1ty#TbX{vllr7b?rtO`t9GoYgtE{sroIVeFk|tHs6Qe!Z zIh%&Q|8=>DIl&}etMDGms%qV}SR3;9fn5n67mYtUxnCz<(FBS_=5NU9JaU(taW zB6#$^9qE5U(xhGqzLdS1L7%ZD(}m}Br$S98AMu5UH6(DKF<3=Nl?xrTwf29&Kh26- zkS&4#IfF-cp4flh9g%7Mo=A1~NlJ&=_t0P@CzRRE;}xfy$QFADt}1@x`4VAH?<$k2 zOc%mbJCf^|i|ZM0Bj$j;<>UyKKl(uZ=Syx&X`VxYcWo%~e~8Fx?3L}-+BvB0xukrn z`*AGAf-^8&3b^!eU6~m%*nvx0M2IE2=A|?gk>LX#)$prL8B%uv4$};jmPqQ#bMnG* zccCRVymC@83OL@MieE~ElgdIfyQXlebG^xd6aEm+fA&&rKa}^e;Dh-k*1wCz8?+<2Q{Lzct zce8Ozx_DO{;bl?!(0cPqL6?FbA-4ehB^Z?#QdkPxLt*040dU0(l|=#fzAp~5X4eJygYk=fa`xyTcE@V$eBS$P86)V4>6}_9Z_k z?eJd^>O2*|l1?BFq%%W*B80;9XioM-4};EtMQseax>Bwa5>-k|Net}Ms5SzQEyoiQ z9OqHjlj0ujV{q-9?$^ycYAPgHvXh*&rxc`#$3YiU1B{nJmgubsO%UBx2@k0 zwUI!(K`~4GoC6QVc(7Y`AHPb-5JRk-j@&yV``_ILzu*$fGA=UOg|pysg<9HwAF_pN$aVKu zq`*zdHdr=6P^zj;O_XD3akPj6IfyRCqilkyC$(f|>5WB9z|gNE_et@;GvAX7(|=Fd zOtl>L6k5_F<0Tr3nJ@y&URb40hvd#l9B0M<#iWVmcAo8fP|f`kI)yp+w6fuEzHP$} zokd38&nv#(6MVFwm?wkI&gd{~0L`qw9<)MZK|~V=;hTlp;-01fNvqU)=e$qp9&z9K z2-8Y^A{b=vg78?ivUi?#3Gz!Zk)LFjjR>(wWzV$B`Tw$?Q_LHSzLx&#h!ooLDUis! zJ*+zMjDm=9k|E&}mB+enDvxhl(=;p&B{=938J0mN$W2Od^eU zSt^ZlPANz^i%3sk>8v&zW6g3&ry^XMSpmh*q-dOy$smEeiNl2O6KxU) z^vgr^(Hp;hXv64C#!OYY4Eh;Qg!?ll0KGQtclORZF%@$q+lS4WGiq zt+?|L?2Wa)#Tt*6<#hg)SStDK9b06q&y-R%YHWGTN_3A*m5A|~Q=NzA_qPp+VbX3x zjE_1;W}m)4t6Aw1;hU*nra8u!!gb_2gZ%S#+!h+a9SWh{(>tb=(mhX$UVYxGHI6g(Vt%a#G92 zrHG59;&kImEuF4veZ{Jfi&4+DJ+S$Sqjb=d<97XIlmpX~%k2bO%q3Z}Kv7t#{p8~#}_01j&HN?gJhmAL) z;MT>9QE1r4h<&IM7Q`a3K*N8qI%wh`d2>4Q`fUcfx3o~utf*~OM_l3om zwXLelNu#a+Q2LW6{u`Rb7 z=jOLc6Mfm2ekZL{fUzV6fP4U&1Tx;l)&jkQm8&mutu!>{)KMWS%@1ovLnwDxDO>J9 zgYA<5#u*RtPgRDL2Sy|V!S1fY?pHr55h{s4nLF-eee+X23@%VNU~32<+KrdQGyIGE z3-_S5yCGLw%%t&Eu~C=nd!D94@|cKb0zxdmEJa~_seU}1)uWd=x;GxhD}xFj?m1t^c2uP0ZsgI^u~5z*%?KI@0Z zYMZFynp_ven{;BYWU7gCL0Y)YO60Yo7^EuD5u;bvJQ*lMYA97gs;sWcP3J}>ksx{`!-ckZR1w8slCDlOCz)H z@-&~j@OTO)B}1&0nOWEA>|$HraWF9ypAAs?w=hpzu<&(=?p{V2D%La&Gi&}zxKRovEmPro9RL1Z+{UFU zzW#V_ax7eZ6uR-(dop0hhdUGs4T02`=DgJV=k0)PVb284c|a;IxYUp=3@-VScrNvL zg_XDD!z3^qE>gp-F(t;@FEKL;PNBKi{Jxg8_1R`aRGF-P2D;m1ZLAs(e5dmAkBOQI z;yX#V@IC-3JQjYPHwC6D2DgDQ!a^4~G{XRm7&^Z6im%Wj0ps0md12lKeO4aj-7vv` zfus*Uvh$>wr(rUI^W#^w!L{Ls)in{i0eGHI}IRXOD89M|{*6FABP1F&b^_ z(L(!YV$!cr7X;g{rO^c%W`o;Tspwj@uCLI0Le?%pI?#Ln+SLCp_YZ}z%RLLAxBZ4Y z4x5?@bWye8oPv3_K!-zyGG4L70PCCq?CPl!?|cdSZElMS@+Z95j4z4xh?od?id3hr zyvq9AcHMcfIpTSV70kA=TD|Yu?*aET_?*5yhR((zlk{+S&wB*SLOXf=hTDZuYAxu$GB& z2yz8-h|W2yaxm-_|Kym5Y0l`OXt1v&Or1v*_+f-A39C&T(mxdFFGIon=Y+5V?jhj= z64fcd**pn_66RzBPQ$h0iCWWGBqNj z@BOgo6~j7A5Z4^RtyfsT}^NxgWa4^R%!)@xR@q*()bS|kQxe*;kd$I znuLg>LAGa-8foU9hd34oDjG`RO2a~?wpV8U;q@;L2Yc`~l+b~Hs@|Q+#F_8SJ#=}w z;YA_HtrBRbNd)Ssg{~m~iDmME+wIGsf+z&{&@7Yeqjopkfgtz3Gm=#QNcZINJHbM6 z3d$g+yB`r_slFjs8}DRn0d3gu<@0=v`2i$32qhc<#{L!m@Ii$&A@MdKd`O#j<-y_V zhNbE-=%_7#I}G}gaxL8kb?k&@zftW46~}JGJ@yMW^+Ii9h<{FxBl|~q?4D@pKD7e_x?`_EUfUL^h)HEHnYI&l$C5j}#Xk+mjDuo> zF~cb3gjBHF3rYG;{cMyW!)^kHHgx8fOhZSjh_?Bz;|iE4wc{R^R=S$dl<&d z&bUp!KD+$UdoP2eSw95e?*UQQU>IZb@0(}Qga{GE41a^3hJhY(>|zv6zVIL6lA}|@ zPle=D2RXs~FLTT%UTnnrbJ9=`WZ|*TYlv zFX$O-mmBU-umm9dkJWT_P>;;fkb4oN+{b3v+yyq8rsUt?;hahx_|n?TAthWh;RAnocDu zpPt>#vnQd9PXREj^Fk{S@&}r&8oLUF69RI}CibV-DYW>dX2PGC_3WbQhOzLQ*!v&3 zupCSHbUM5b)THt+f{+tj`$5p7-pCS(B5J9b%dn)Dps&50B>{LrJDho=Px{S~2$nnu zOkQJleg}AL8ESaC=sxsAJS54RES8$2m!D@Jag(>OwQ>)U=-4eS+0r%i@&jCCBVw$# zA;R#`C#|C=Q2UEtf}A=t6l@Q*JMA!^_y?KiK)IQrU{nxz23L0+hjwlg$ZBBBOF1L9PVH3US(Qn2`9FUUzF6%`-Z%9*q$N>)Na#)&OZdEdef->5h#`d-+&;%R8e*X?YH zefOvHHPA@EB>H^S1qB;(P6GKb)$VmH6#Ot)>5A+iEJ1JipePx&OY?y}ObX0$=C*2x zY>gv7M5Bmq5ykAEKoMZAx)Q)@b{Io-4pj;yX%qW&%eIyM(H0Vm#21<}t3nZ1O&$@( zI?MDySMdis^RaA921RlC=b|Ue(mwpp)tSjDKQJ19uqv~3flGqFt{htMJ?tqO!>lrFK9$jF%x^)yRk2+Qv`ECedT>Pcoh|1e|GgFu{DQyMr;8%K1>$?qly?WDi)JZk13UvSxs0@#^+Jc<5meY(#_h z(+48o%;|COyPqGlHQt(vlhByZnC3cweKqJFfqI8cF0GN`J4YU4CB*7{Q&WbUML{%b z=1CMk=sCbThPIGgvW!H&Q1N-kQjH67%hQpMKidi+2npfsY}FS9nxSug@I?C-8Rnq5 z;QAH`iqMoH!{IW)X$4njOmf7??&awT$9;688oejX_5IBIvbl%kKH44Ib1w-9(pTuo z6X+wV4x~`bHsrrgG#NnC41AiQuD<_GMTd`)jHDYY2lul+M*&feT|CrD-aatTjlywp z2eVBuFh7SYO5H%7X;j~Rt+L4s@0{+88{v`q^3qD)xVaEhC_K@D;e@%{xhVTykIYs( z$4xoU_cSdm?nPLoHJuWj>5twxrc>pDB>mAq1#3YouYSNrw!0T$A3-G%4W;XPxK!x= z`Nm2NI51v6P9=%pl;)&Gp*jZsfiD$T^0G|wie28Y4xyfP7@pG?s&^}jFQ-|wE(p)B zG-Or&nKG`BO~qDgroJ=rN2+yA61MyqtXpk46WBNb`G0x_y|7LKFk{6|Pxl(I+HTf* z%Kjytu~Nu#XQ%!9fmZ5HymDvE#nWqn)-++N&cAkSMlW^KXBA}qD6Kp%0l>m%J0O*U zhinW~%LQd2iRL2_5>gI%Ps0y0+0rDBH>jC9iXH;z_hdc%#m$ZOsnY^cH&6P)hYOwx zAN#brI$=kK)%O4)n%3x2yL4&DEaEnBeE9%`o5Cs-6c)kKmq%R|MU&S$mfXval}nV( z3VuJ5Y{!YGYg2AR_nxb|(oDnVr?fs5>x4OCK?0k_9GG(h1S)h*B!Y$85Nx453qDfmHcRq+OU zoQlb? z{HlO0$+z?`618W#!zv%11Kl87G?hnHS&EE2QfE$opljE$*=if7c&I70YkHT`Nc-OP zw=tF`m_vcD@q`?%T8bat1v$8!H7Tr8NP# zE7@!Ac1wSL5&@S>Z!ujPohQiO)ES1^VE8Rm<{t*IlSgn zv)nx<8{v`Y(-_*^?w*NjyGO|h0^f%c=kiMS7Q5$*S|7%K51k2OVB>X3(QAKg&p3E2 zbqRx+)hvbwBMTmPM_w8cS`#kM)%d;Qiy%o7AU>lP#xoVcY-<9RV3XHISJ>_&RYVv# zeqbzM%|%9ODS8RV({{N->4nU~^nTq|{_Qe?9eY)j?al^#r?L})ecs!Q>SD)@FX;F0 zV3WDUZH!oVkeEx`KU7na%Hl41U{dv-_yL5AOQ8eZICiH2QvVT>oP>ZiLSIa?pg};_ z+zeu~Y?qmy;0-c@FuK0or#N_6FH5EMw!=3}HJ+Y0j0ERe9_qQuIT#zpIKvjT2d9wb zlOc^ynFVK=x=q>HZ+3*WKAh*Cs)1t?lC(7<-6zz*33Y^xwGR*kosi-1gDUv%FW}ay zmr9+9McBm03uPC%tdDs4AxC<$bmv~U6UZI0A{Kc~5lZ)qfpQiF!Dw2P;3j>v?iQ$? z6+Z>}7ZBRtKWQ}p`wy^2))seD?Z)#& zA9zPlm)7wbFGbgZt*%zH6}?y|cYUJXIZoppPz(KOQ@Ki$fO<-zh}c~LwMgCuhe9mI zu3>Zb%q{Jg2WM5w+tQDMHm6(Q%7|p4*@ZK{SCa$r@RvI>$gGsdNC+mJ2qAZbT-vDfftgDf>FK(O9Om$L&e zc-6ahUId#Ao(vl(hFPZCUM!b80mJvtK%Z<6%-OKMqlNJ&UoFBu`Yh14kcreui#X%P zl^Cyl+H(czef-%$aU@NCEA?I(^VY82Eu}0}>9d=_lLgkY;+~e^O>Wxnvie$-vp);q zXllI#$Bdyz290O!Fo3t=`0JAW_qV8|mJsR91SULMjNITJQuGyQa7jpg1F{VPunSCVwWp zr%EPN+|d_79hW~RlY1hbOSvcK7$f+vMUq$%$IWMYxo`j4TF@IQjZ8)ocUjvh zR5m(_-1aoFvETae%mg5>#w9)AEv2~-=pw}OvSYluZB zBnv|#(S zTGj=-M=K4iEmASePb=-QYin!7ie5zhR6A05U&H0YKaHHio#w2By)<8EpacZD=vne8 zQ~Z4K)toqNLB`~t?IDQC4NF!3B<37cy{p_bu!}Olo-(L}Ex_%%wARD!mS1k+2rqAm z0=JKth@w$`0nb9A{!&TQsW}KoeyG?IJ7odoI%*tA{MCaXzCl%6!?1D>&X^2a~G_C4=)8&+W)xXPU$KLF{B zm5#VKHW^87+7yntm?~!eIxCxul>*b+nKS=Mgmh>2Zm($VW710H=pSuTAjw5>89%rA zVb_O%$d`?K7cBQM?;r zgngdA9yZd{Ft^b83GPisMttXpct_Pd!e$6-v)OlfV2Rd}bA8aX!d6>R`N=$Vs@uXO z>-pfD_b`biNApMh<;RRg*w9&Xury>q)wAKbvCj{qp2SzTcZtT~@%+1qQlPFMjoVv_ zp7;r|8bPK>ZtqrT7zv-(?Y4^=w~CJ<%@er3PHI++c*cI5Mu~twe%`HikWU1m{MRcE zg*+U&GPv|(@Kr<)ZcYFBxAZ^9`-+{mt?vs|8le2X0W6FN zCF!w+$n^Ba2}k%mqSuLUtP!vIR9xqWbVyfR!`hPH7O6?_p}dYs^MZR%IWDsyCmDWL zzc2{DgHN}#VzN@A={P{AJpB9j!ds%3E|=}5U_lT$1HLW=36=!yha-G8Hu`~0 zu=@IH25*?OX##0v0MY;|BV=)J-5NB=Gez@s=-C>O?x!F`|0i65*CU-cQ=;o)huP;DXtiI@@t1@kmm!uJY_VzOi@jE z7aX$xZfFBPa3T@~co~gd!m7F&UqB~=;2hx&ha$1FaH&|Y$i$-y@PLRGt6;HcNatIF z_g2dd_j~S@+}giy!FNS#j#hG;2Cg?hcpCCAEfTAshR$=IfGabTED)~|=ucrJw-!zC zljYA7E5@?I414Hb!NlELN8D#&z2C4b9HInzLH)DUGBrRx0F!GDo-CM|h5#m(V9b|n zL#8_0?i`9eKbnYS^kk4to#PP4u|v!Q`BnK#RZ~7tDoQ2*?j>1s6ja`sDT*C|<4yvM zYvxNKg}25G$-sD7*#(I44Mg*G%HS9CDB@kLEQo?w|6Xm@5@C-*7|BXfanI{RzMcqQdGT7o zAVEd9?z{K8;cLvpIa>rRBZE9jgH{9i+L-f7KHhJt$mT@m<#HU+#6b5E>e8*+t{JC} zg*v2+;AYs}j%gWuRruHM?|3OAJ$;iyTfMKVZw)01xMC>b4E~9LQ14UDiyKY=hhLg3 zYV+SEI$!yn#Hh)m5DB!n;#^Fu(ub8oFLN3l-COWAObBs*_Wb@y@K~A<#as zz>waA2s{hUfSZS)Z!?OMhF+Z?AzTbCsF5vJlzh=3K;Aq*BS!_N& zHtbctBu?_3fL3sr3{iQW!`#^iM6xsvPrZK8%*r`r@;&rK^vqPmkJPkSq1MQ6j|Cw^ zQ)yOeVffCPqbEK6bLmJGA+-~-@QjAkR?;bWq}18x+>%$(+zwZ?ynczOm8DiE%PhT` zuwm4S1A4-G|8HGiSy*njr}Q8@N-8NZer`pIQu*UuC1~R>Ef|4_d#dh*s@EZ!BfC{h zh@!}cq5qpVJG==)MCAJ9eGLfLCIDgw6FZ;W1^a;P6PVVS@i65Kl?JQ*0kTmHqZyNb zU2gMDHm>cUO+FAOod)7hmB{3*U=Es|74OpPiHC>g;*5D09sB91_A~v`Nym-7-)+Ad zvDrzTXQeYAJ@{o_Or*?KP7>#f@^RQ)*Q%j1M{MGXO4*f<9tXi-eAhXHfw_Z=IyZd& z`>}WTg`RGP;B0tTj>7|s0P+>%$FDh?3Db{!ibRBR4mEpJqLV>oB%S!Wjy4Z(4P+Ls z{(ooVbY%h3-UYq2=tjnB>G+S=w^l@MUMkgsIj9vHXT+$8PX_Xx3)u1fKaEP1e!#n< zQ+$5c&aAYDnUKQvic%Mc%$OLge(W{m-=BmLG4x*(H@!aQJ>AZ_?G)CcT-JLDB^V#3q2z72Ui3% zTMvJzzdpu(x1mO2^xPM7SvS0=*Hmhch9dx?`buPyF{NvR;juA-#2-&{!JS4C`m~&Z z^hWvh0ZTk>rtYC+mR#dATt)S2-iL9@&Plef`6SO^tB*Ed^Z+X91&k}5|WJp1Nyh!gs zqDh?@*v{kO;LclsIqOGS74*VFfIQ>y5yo`x!}W$LOB2ICq`qO4gHvAheTTKFax#Sg zpXIEm9kMr-90E@={0RphGMgy?0P$qOFr)!UUItMl!j|?Im;}y}yJbvSSr+^9-YluK>X$>l1(#*1A#wYh7{Lo;~fo{F*$1y4-1)Kt1u|*;Xdd4W=4S3&Uy?bRY0hIciipTANsP-Reb2EIQ z%Ez$Nk+nCK^)n-lF18tybW|z1=Xi)VMhjVDryM%LZyIAphI5Bq=5MfI|1L0%9qn9k zN-V9zuP&v@L~cFf*~q)`AS1YSo~3<3Dg6LltCz$3snF1l`W}2>0{%p}P%+R+8vIEiZD9XfEPv!g9l@24 zq!qON8vIFIlJTuV;XM03h?aWr0YusQ2l%22llCw*Af;De3+A~bLK(jRR`M>kMcS^3 zEPj(J^yx~zs6BLL#@aw`?Hh{x5NChHReHDhB?%N7PFEJU=lD>+w#0F*F@TxaX2i0I4r^vslNZt6%cT}F5m z5!lh3{q=m7VCJB{sJd6EIg3;*dG(7$+HP~m3z-rMW|-dzR2YB87~(Am`ltoF%%SgN zk*fbnJ?1pMkzB(uz@T>;TR(~blBc5AG~~TF@xsq)Cn&eEg5e;~?Ga~f7 z;a4N*lBA?H@_>`Qb_e#qfz;FN{=>Ovpe(SjJrNY|;PU)@r$zx)KY%=XOTU9XVJjIh zCCeZU@U!tkNJTGAU@fh$xgE|uZz3DOeHOowhNlngqr+>+8g&wL;V*MCqhQ_Mrj)Yp z^X;B$=!A2av|qpsh->WG&Ih2H)xY`R5Tpwvz~Ue4Gy1Q$24-VcA@K<6d!~-TZRo4+ z0NDGUNhaamo;Not(`F|?1Bn@|MV<3s6Brrb+CNwskFeFULD~cr6vhlId^^!HXsjWb z88gelp#7GUY0g+E^n94W{+_r@Bi*#WZLR-V&_nP68d)z%xePOFK?_H1!}-C?kiz-W z@NhD~PI3x1LBT}voQE4GZgvTxBZCFd!+Mbky0?_V@}d3{->V9$o6R-q=d9LR^nOirEKj& z#)GFfEh!+J{Ya$MH1t=${227v+3@Ap>lo)Y!r->o?zr-jQd2(SV>kuhlNnTyj$ATW zAx{t_%B$fLFDGTlS9-0Swq1N60DqafR}}@}*!VBpWy()x1ZKD5!Hiq!HdL0N4|rH_Vyw*;sS79O;`QNNe2$zj z+12>_KF_Ch!Uw_-UjjGRKp9F6jLMr?)(ULqR6wOli0uRnizbryDS(k6i!PAt9T;i@ z&?N&?|K7InWwOz4ajmh7zA8G_%-8tnPt27m0q`wNLQf0SsS8O>-;sig1A}#jUC}3v zG)9>ZdJ0!G`@t@wEQb400evVEZJggek7ih5VNQ_0KCXE=4EgKf1$p z+v4MkFtr__(RwiBcwqT@Bj$v~itix5qz75h2eS27zO{sK;r8XdRg7tdR9S&1ix%;7 z1wSdV!b*LyiR|AO1=;Zn-ux2KpqK5E>Nhlscy%25)lwTL@)q{1%Q1|aR+k1M0{gI2 z0`@YvNHesqtBEr~hdXeMIXgdeDm**~06J3tB^7v|E!?(g;o{D22SA=CXYHNhWMbSHR87!X>o%{{-T1hieg?$y?=Za)SjaULqqjy5^cdGI9 zEKWqB>>CTZ&A)2OylM~cPvVE7 zV=i+XV&5H4hBZ!T zEr5FSg>qIbz*d4zN05HBSJR-;k0qiooxmR28Yw_J4phPj9@roF^<|h@!f%jy!H-d4 zn>PyQ@kZFsEIWx8%dhUMGe5)`?ZSJY2yXvKUWg>D<&LsD$tS+C3OjqWN%r8G;S`Pu zUZUN$bBYII2ixpepwJ)&b_Jq(mH>hVmz3t#FtP$$It3N!H%v;n%1>eTD3$LwaIA4j#cgB zBN@5HgBIVA&l;#|5)aPYBS&!T<)i}VsXIOyS2WZA`nzouQ6!hJ8D?qZyc9L=Z&{S| zRcC}%C0uk2?*j(7?J=Gbtj-A!07MWVxL>~;+Q4E9R@dtV6b%QUg}E58FZ^p9_m*qJ zbD+u@Oye}hC&TD;Qj~LdMjr^g9N&Gt4rpEEZ=?W#@VBgg1AJCU9@YJwTNKdTUHf-7%LkMWLm*H70yZayy4>{X;9#+ zJZAY{>a4#l6~AyY%IOBgVr{6L{gP_%&r5s_z&EVIt8FtRfw#P)0Z?ATIP6gN2@;+S zW}l@tPDvYm#?Pb<2rAEyKuuC%#%sgBna!gg;cF5-*zc;`Onc^2|p%o#m^9IXc{12}T-7B;FuA+z0%^8#JC} z=lHRvW$LD_hJg3J*56lNQ^$E(c=P49N)xtceNEajCm12meVwGhBi8aex20ZZZQAKb zg$?!zR0Ozs@!RFb`b=&%#0BPndcwJ%uD~?^3{Eh<)n(UY0zQJt+c&UQU3xyzTUs9O zwf43lhAku5JzO}5IE)|O7SBt^MsYZYnEfx4L6x_i`abnGiWGNe?VpPnJ(+iH^&_Nv zkhcy=Uxvh}MAn1`k|Mw9U4T%+y-bw4wtvO%%A&EBmun~6CAc11zYYf@uW?x+=`jz! zgMZUhgX9qS{ZW_lU4OhEb(S51YY1QmZl;AgZ!iX7o!8~JB`4CF;OOUnUPqPwQ2YcK zGk~;`jm~=fNd^OKDJb?Ia{n#JABBys|Gsc5=i|^6|>gZiij~E<3-qQi? z#o*E?VMcZD)77U#C^?f^aKklqrX#D0&=Z!B%VUBEZL+#x^^<7}(qxdE z5!;oO`TH*f0tpxG+e`bDD!^2{?Hisx6$fi1+uC@5Sv6tf(c0Tb>tVR_MnK^y_iRz0 ze>h;QXyB#?26h$T2fpDnj9K)OZ*okTGY;`RAAO32;!aw7y2*h4mR?N@rY{Y}5!!HJ zk@lH_%*t|AU)Qe3n|~L;!4yO-h{$K5#r#Qes_8XB zMyhP|HpNWmV8=|-M^1a=h}=pO6KdICU~DEwT{2OAj524%xW-^;kYl^#JH=X0u*gUP zR&=N=iaoP2><#%efv91`hkNP6!8n%Rf2rKbDsL3b(-r2_x)xUzc)lAz_{Xqj4A`_8 z*a!My%^F#WV*r!#s{5Co(M;R}zryo{zE^zGzEKx_S`k|Ws%Ue3Lq$&e6*>B0A6)o~ zGIMl3TUf5Ul9EMntF?CHk{L<$XIF}ab;;y#%;Hl#dlir7N&_sZmO<4bS$zRauhAHr zPVdo0evTj#B4#8@L@HU;q$OsHeB$h+{Pi~g^p?b2{=T@v=?Bn{om}f z4

u9zKTS72=>S#tQW9Q4saZk2sP|wKof?z`VlJ(0j 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

t~k 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 N{}0B^;otxe2>|qf?1caT literal 0 HcmV?d00001 diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/debugger/Makefile b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/Makefile new file mode 100644 index 00000000..a85bc012 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/Makefile @@ -0,0 +1,80 @@ +NODE:=$(shell which nodejs node | head -1) + +# Try to get a useful default --source-dirs which works both in the Duktape +# repo and in the distributable. We don't want to add '..' because it would +# scan a lot of undesired files in the Duktape repo (e.g. test262 testcases). +ifeq ($(wildcard ../tests/ecmascript/*.js),) +SOURCEDIRS:=../ +else +SOURCEDIRS:=../tests/ecmascript +endif + +.PHONY: all +all: run + +.PHONY: run +run: node_modules static/socket.io-1.2.0.js static/jquery-1.11.1.min.js static/reset.css static/jquery-ui.min.js static/jquery-ui.min.css static/images + $(NODE) duk_debug.js --source-dirs=$(SOURCEDIRS) + +.PHONY: runproxy +runproxy: node_modules static/socket.io-1.2.0.js static/jquery-1.11.1.min.js static/reset.css static/jquery-ui.min.js static/jquery-ui.min.css static/images + $(NODE) duk_debug.js --json-proxy + +.PHONY: clean +clean: + @rm -f static/socket.io-1.2.0.js + @rm -f static/jquery-1.11.1.min.js + @rm -f static/jquery.syntaxhighlighter.min.js + @rm -f static/jquery.snippet.min.js + @rm -f static/jquery.snippet.min.css + @rm -f static/prefixfree.min.js + @rm -f static/reset.css + @rm -f static/jquery-ui.min.js + @rm -f static/jquery-ui.min.css + @rm -rf static/images + @rm -f jquery-ui-1.11.2.zip + @rm -rf jquery-ui-1.11.2 + @rm -rf node_modules + +node_modules: + npm install + +static/socket.io-1.2.0.js: + wget -O $@ https://cdn.socket.io/socket.io-1.2.0.js + +static/jquery-1.11.1.min.js: + wget -O $@ http://code.jquery.com/jquery-1.11.1.min.js + +# http://balupton.github.io/jquery-syntaxhighlighter/demo/ +static/jquery.syntaxhighlighter.min.js: + wget -O $@ http://balupton.github.com/jquery-syntaxhighlighter/scripts/jquery.syntaxhighlighter.min.js + +# http://steamdev.com/snippet/ +static/jquery.snippet.min.js: + wget -O $@ http://steamdev.com/snippet/js/jquery.snippet.min.js +static/jquery.snippet.min.css: + wget -O $@ http://steamdev.com/snippet/css/jquery.snippet.min.css + +# http://prismjs.com/ +# http://prismjs.com/plugins/line-highlight/ +# +# XXX: prism download manually? + +# https://raw.github.com/LeaVerou/prefixfree/gh-pages/prefixfree.min.js +static/prefixfree.min.js: + wget -O $@ https://raw.github.com/LeaVerou/prefixfree/gh-pages/prefixfree.min.js + +# http://meyerweb.com/eric/tools/css/reset/ +static/reset.css: + wget -O $@ http://meyerweb.com/eric/tools/css/reset/reset.css + +jquery-ui-1.11.2.zip: + wget -O $@ http://jqueryui.com/resources/download/jquery-ui-1.11.2.zip +jquery-ui-1.11.2: jquery-ui-1.11.2.zip + unzip $< +static/jquery-ui.min.js: jquery-ui-1.11.2 + cp jquery-ui-1.11.2/jquery-ui.min.js $@ +static/jquery-ui.min.css: jquery-ui-1.11.2 + cp jquery-ui-1.11.2/jquery-ui.min.css $@ +static/images: jquery-ui-1.11.2 + cp -r jquery-ui-1.11.2/images static/ diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/debugger/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/README.rst new file mode 100644 index 00000000..8a82d65d --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/README.rst @@ -0,0 +1,268 @@ +========================================= +Duktape debug client and JSON debug proxy +========================================= + +Overview +======== + +Debugger web UI which connects to the Duktape command line tool or any other +target supporting the example TCP transport (``examples/debug-trans-socket``). + +Also provides a JSON debug proxy with a JSON mapping for the Duktape debug +protocol. + +For detailed documentation of the debugger internals, see `debugger.rst`__. + +__ https://github.com/svaarala/duktape/blob/master/doc/debugger.rst + +Using the debugger web UI +========================= + +Some prerequisites: + +* You'll need Node.js v0.10.x or newer. Older Node.js versions don't support + the required packages. + +Compile Duktape command line tool with debugger support (for further options +see ``doc/feature-options.rst``): + +* ``DUK_OPT_DEBUGGER_SUPPORT`` + +* ``DUK_OPT_INTERRUPT_COUNTER`` + +* ``DUK_CMDLINE_DEBUGGER_SUPPORT`` + +The source distributable contains a Makefile to build a "duk" command with +debugger support:: + + $ cd + $ make -f Makefile.dukdebug + +The Duktape Git repo "duk" target has debugger support enabled by default:: + + $ make clean duk + +Start Duktape command line tool so that it waits for a debugger connection:: + + # For now we need to be in the directory containing the source files + # executed so that the 'fileName' properties of functions will match + # that on the debug client. + + # Using source distributable + $ cd + $ ./duk --debugger mandel.js + + # Using Duktape Git repo + $ cd /tests/ecmascript/ + $ ../../duk --debugger test-dev-mandel2-func.js + +Start the web UI:: + + # Must be in 'debugger' directory. + + $ cd debugger/ + $ make # runs 'node duk_debug.js' + +Once the required packages are installed, the NodeJS debug client will be +up and running. Open the following in your browser and start debugging: + +* http://localhost:9092/ + +The debug client automatically attaches to the debug target on startup. +If you start the debug target later, you'll need to click "Attach" in the +web UI. + +Using the JSON debug proxy +========================== + +A JSON debug proxy is also provided by ``duk_debug.js``:: + + # Same prerequisites as above + $ make runproxy + +Start Duktape command line (or whatever your target is):: + + $ cd /tests/ecmascript/ + $ ../../duk --debugger test-dev-mandel2-func.js + +You can then connect to localhost:9093 and interact with the proxy. +Here's an example session using telnet and manually typed in commands +The ``-->`` (send) and ``<--`` (receiver) markers have been added for +readability and are not part of the stream:: + + $ telnet localhost 9093 + Trying 127.0.0.1... + Connected to localhost. + Escape character is '^]'. + <-- {"notify":"_Connected","args":["1 10199 v1.1.0-275-gbd4d610-dirty duk command built from Duktape repo"]} + <-- {"notify":"Status","command":1,"args":[1,"test-dev-mandel2-func.js","global",58,0]} + --> {"request":"BasicInfo"} + <-- {"reply":true,"args":[10199,"v1.1.0-275-gbd4d610-dirty","duk command built from Duktape repo",1]} + --> {"request":"Eval", "args":[ "print(Math.PI)" ]} + <-- {"notify":"Print","command":2,"args":["3.141592653589793\n"]} + <-- {"reply":true,"args":[0,{"type":"undefined"}]} + --> {"request":"Resume"} + <-- {"reply":true,"args":[]} + <-- {"notify":"Status","command":1,"args":[0,"test-dev-mandel2-func.js","global",58,0]} + <-- {"notify":"Status","command":1,"args":[0,"test-dev-mandel2-func.js","global",58,0]} + <-- {"notify":"Print","command":2,"args":["................................................................................\n"]} + <-- {"notify":"Print","command":2,"args":["................................................................................\n"]} + <-- {"notify":"Print","command":2,"args":["................................................................................\n"]} + [...] + <-- {"notify":"_Disconnecting"} + +A telnet connection allows you to experiment with debug commands by simply +copy-pasting debug commands to the telnet session. This is useful even if +you decide to implement the binary protocol directly. + +The debug target used by the proxy can be configured with ``duk_debug.js`` +command line options. + +Source search path +================== + +The NodeJS debug client needs to be able to find source code files matching +code running on the target ("duk" command line). **The filenames used on the +target and on the debug client must match exactly**, because e.g. breakpoints +are targeted based on the 'fileName' property of Function objects. + +The search path can be set using the ``--source-dirs`` option given to +``duk_debug.js``, with the default search paths including only +``../tests/ecmascript/``. + +The default search path means that if a function on the target has fileName +``foo/bar.js`` it would be loaded from (relative to the duk_debug.js working +directory, ``debugger/``):: + + ../tests/ecmascript/foo/bar.js + +Similarly, if the filesystem contained:: + + ../tests/ecmascript/baz/quux.js + +the web UI dropdown would show ``baz/quux.js``. If you selected that file +and added a breakpoint, the breakpoint fileName sent to the debug target +would be ``baz/quux.js``. + +.. note:: There's much to improve in the search path. For instance, it'd + be nice to add a certain path to search but exclude files based + on paths and patterns, etc. + +Architecture +============ + +:: + + +-------------------+ + | Web browser | [debug UI] + +-------------------+ + | + | http (port 9092) + | socket.io + v + +-------------------+ + | duk_debug.js | [debug client] + +-------------------+ + | /\ + | || + +----------||---- [example tcp transport] (port 9091) + | || (application provides concrete transport) + | || + | ||---- [debug protocol stream] + | || (between debug client and Duktape) + | || + + - - | - - - - -|| - - + + : v || : +  : +-------------||-+ : [target] + : | application || | : + : +-------------||-+ : + : ^ || : + : | || : [debug API] + : +----------||-------- debug transport callbacks + : | || : (read, write, peek, read/write flush) + : | || : implemented by application + : | \/ : + : +----------------+ : + : | Duktape | : + : +----------------+ : + + - - - - - - - - - - - + + +The debug transport is application specific: + +* Duktape command line ("duk") and this debug client use an **example** TCP + transport as a concrete example. + +* It is entirely up to the application to come up with the most suitable + transport for its environment. Different mechanisms will be needed for + Wi-Fi, serial, etc. + +The debug protocol running inside the transport is transport independent: + +* The debug protocol is documented in ``doc/debugger.rst``. + +* This debug client provides further concrete examples and clarifications + on how the protocol can be used. + +Using a custom transport +======================== + +Quite possibly your target device cannot use the example TCP transport and +you need to implement your own transport. You'll need to implement your +custom transport both for the target device and for the debug client. + +Target device +------------- + +Implement the debug transport callbacks needed by ``duk_debugger_attach()``. + +See ``doc/debugger.rst`` for details and ``examples/debug-trans-socket`` +for example running code for a TCP transport. + +Debug client alternative 1: duk_debug.js + custom TCP proxy +----------------------------------------------------------- + +If you don't want to change ``duk_debug.js`` you can implement a TCP proxy +which accepts a TCP connection from ``duk_debug.js`` and then uses your +custom transport to talk to the target:: + + +--------------+ TCP +-------+ custom +--------+ + | duk_debug.js | ------> | proxy | ---------> | target | + +--------------+ +-------+ +--------+ + +This is a straightforward option and a proxy can be used with other debug +clients too (perhaps custom scripts talking to the target etc). + +You could also use netcat and implement your proxy so that it talks to +``duk_debug.js`` using stdin/stdout. + +Debug client alternative 2: duk_debug.js + custom NodeJS stream +--------------------------------------------------------------- + +To make ``duk_debug.js`` use a custom transport you need to: + +* Implement your own transport as NodeJS stream. You can add it directly to + ``duk_debug.js`` but it's probably easiest to use a separate module so that + the diff to ``duk_debug.js`` stays minimal. + +* Change ``duk_debug.js`` to use the custom transport instead of a TCP + stream. Search for "CUSTOMTRANSPORT" in ``duk_debug.js``. + +See: + +* http://nodejs.org/api/stream.html + +* https://github.com/substack/stream-handbook + +Debug client alternative 3: custom debug client +----------------------------------------------- + +You can also implement your own debug client and debug UI with support for +your custom transport. + +You'll also need to implement the client part of the Duktape debugger +protocol. See ``doc/debugger.rst`` for the specification and ``duk_debug.js`` +for example running code which should illustrate the protocol in more detail. + +The JSON debug proxy allows you to implement a debug client without needing +to implement the Duktape binary debug protocol. The JSON protocol provides +a roughly 1:1 mapping to the binary protocol but with an easier syntax. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_classnames.yaml b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_classnames.yaml new file mode 100644 index 00000000..b4a5cea4 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_classnames.yaml @@ -0,0 +1,31 @@ +# Must match C header +- unused +- Arguments +- Array +- Boolean +- Date +- Error +- Function +- JSON +- Math +- Number +- Object +- RegExp +- String +- global +- ObjEnv +- DecEnv +- Buffer +- Pointer +- Thread +- ArrayBuffer +- DataView +- Int8Array +- Uint8Array +- Uint8ClampedArray +- Int16Array +- Uint16Array +- Int32Array +- Uint32Array +- Float32Array +- Float64Array diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_debug.js b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_debug.js new file mode 100644 index 00000000..5a294095 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_debug.js @@ -0,0 +1,2448 @@ +/* + * Minimal debug web console for Duktape command line tool + * + * See debugger/README.rst. + * + * The web UI socket.io communication can easily become a bottleneck and + * it's important to ensure that the web UI remains responsive. Basic rate + * limiting mechanisms (token buckets, suppressing identical messages, etc) + * are used here now. Ideally the web UI would pull data on its own terms + * which would provide natural rate limiting. + * + * Promises are used to structure callback chains. + * + * https://github.com/petkaantonov/bluebird + * https://github.com/petkaantonov/bluebird/blob/master/API.md + * https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns + */ + +var Promise = require('bluebird'); +var events = require('events'); +var stream = require('stream'); +var path = require('path'); +var fs = require('fs'); +var net = require('net'); +var byline = require('byline'); +var util = require('util'); +var readline = require('readline'); +var sprintf = require('sprintf').sprintf; +var utf8 = require('utf8'); +var wrench = require('wrench'); // https://github.com/ryanmcgrath/wrench-js +var yaml = require('yamljs'); + +// Command line options (defaults here, overwritten if necessary) +var optTargetHost = '127.0.0.1'; +var optTargetPort = 9091; +var optHttpPort = 9092; +var optJsonProxyPort = 9093; +var optJsonProxy = false; +var optSourceSearchDirs = [ '../tests/ecmascript' ]; +var optDumpDebugRead = null; +var optDumpDebugWrite = null; +var optDumpDebugPretty = null; +var optLogMessages = false; + +// Constants +var UI_MESSAGE_CLIPLEN = 128; +var LOCALS_CLIPLEN = 64; +var EVAL_CLIPLEN = 4096; +var GETVAR_CLIPLEN = 4096; + +// Commands initiated by Duktape +var CMD_STATUS = 0x01; +var CMD_PRINT = 0x02; +var CMD_ALERT = 0x03; +var CMD_LOG = 0x04; + +// Commands initiated by the debug client (= us) +var CMD_BASICINFO = 0x10; +var CMD_TRIGGERSTATUS = 0x11; +var CMD_PAUSE = 0x12; +var CMD_RESUME = 0x13; +var CMD_STEPINTO = 0x14; +var CMD_STEPOVER = 0x15; +var CMD_STEPOUT = 0x16; +var CMD_LISTBREAK = 0x17; +var CMD_ADDBREAK = 0x18; +var CMD_DELBREAK = 0x19; +var CMD_GETVAR = 0x1a; +var CMD_PUTVAR = 0x1b; +var CMD_GETCALLSTACK = 0x1c; +var CMD_GETLOCALS = 0x1d; +var CMD_EVAL = 0x1e; +var CMD_DETACH = 0x1f; +var CMD_DUMPHEAP = 0x20; +var CMD_GETBYTECODE = 0x21; + +// Errors +var ERR_UNKNOWN = 0x00; +var ERR_UNSUPPORTED = 0x01; +var ERR_TOOMANY = 0x02; +var ERR_NOTFOUND = 0x03; + +// Marker objects for special protocol values +var DVAL_EOM = { type: 'eom' }; +var DVAL_REQ = { type: 'req' }; +var DVAL_REP = { type: 'rep' }; +var DVAL_ERR = { type: 'err' }; +var DVAL_NFY = { type: 'nfy' }; + +// String map for commands (debug dumping). A single map works (instead of +// separate maps for each direction) because command numbers don't currently +// overlap. +var debugCommandNames = yaml.load('duk_debugcommands.yaml'); + +// Map debug command names to numbers. +var debugCommandNumbers = {}; +debugCommandNames.forEach(function (k, i) { + debugCommandNumbers[k] = i; +}); + +// Duktape heaphdr type constants, must match C headers +var DUK_HTYPE_STRING = 1; +var DUK_HTYPE_OBJECT = 2; +var DUK_HTYPE_BUFFER = 3; + +// Duktape internal class numbers, must match C headers +var dukClassNames = yaml.load('duk_classnames.yaml'); + +// Bytecode opcode/extraop metadata +var dukOpcodes = yaml.load('duk_opcodes.yaml') +if (dukOpcodes.opcodes.length != 64) { + throw new Error('opcode metadata length incorrect'); +} +if (dukOpcodes.extra.length != 256) { + throw new Error('extraop metadata length incorrect'); +} + +/* + * Miscellaneous helpers + */ + +var nybbles = '0123456789abcdef'; + +/* Convert a buffer into a string using Unicode codepoints U+0000...U+00FF. + * This is the NodeJS 'binary' encoding, but since it's being deprecated, + * reimplement it here. We need to avoid parsing strings as e.g. UTF-8: + * although Duktape strings are usually UTF-8/CESU-8 that's not always the + * case, e.g. for internal strings. Buffer values are also represented as + * strings in the debug protocol, so we must deal accurately with arbitrary + * byte arrays. + */ +function bufferToDebugString(buf) { + var cp = []; + var i, n; + +/* + // This fails with "RangeError: Maximum call stack size exceeded" for some + // reason, so use a much slower variant. + + for (i = 0, n = buf.length; i < n; i++) { + cp[i] = buf[i]; + } + + return String.fromCharCode.apply(String, cp); +*/ + + for (i = 0, n = buf.length; i < n; i++) { + cp[i] = String.fromCharCode(buf[i]); + } + + return cp.join(''); +} + +/* Write a string into a buffer interpreting codepoints U+0000...U+00FF + * as bytes. Drop higher bits. + */ +function writeDebugStringToBuffer(str, buf, off) { + var i, n; + + for (i = 0, n = str.length; i < n; i++) { + buf[off + i] = str.charCodeAt(i) & 0xff; + } +} + +/* Encode an ordinary Unicode string into a dvalue compatible format, i.e. + * into a byte array represented as codepoints U+0000...U+00FF. Concretely, + * encode with UTF-8 and then represent the bytes with U+0000...U+00FF. + */ +function stringToDebugString(str) { + return utf8.encode(str); +} + +/* Pretty print a dvalue. Useful for dumping etc. */ +function prettyDebugValue(x) { + if (typeof x === 'object' && x !== null) { + if (x.type === 'eom') { + return 'EOM'; + } else if (x.type === 'req') { + return 'REQ'; + } else if (x.type === 'rep') { + return 'REP'; + } else if (x.type === 'err') { + return 'ERR'; + } else if (x.type === 'nfy') { + return 'NFY'; + } + } + return JSON.stringify(x); +} + +/* Pretty print a number for UI usage. Types and values should be easy to + * read and typing should be obvious. For numbers, support Infinity, NaN, + * and signed zeroes properly. + */ +function prettyUiNumber(x) { + if (x === 1/0) { return 'Infinity'; } + if (x === -1/0) { return '-Infinity'; } + if (Number.isNaN(x)) { return 'NaN'; } + if (x === 0 && 1/x > 0) { return '0'; } + if (x === 0 && 1/x < 0) { return '-0'; } + return x.toString(); +} + +/* Pretty print a dvalue string (bytes represented as U+0000...U+00FF) + * for UI usage. Try UTF-8 decoding to get a nice Unicode string (JSON + * encoded) but if that fails, ensure that bytes are encoded transparently. + * The result is a quoted string with a special quote marker for a "raw" + * string when UTF-8 decoding fails. Very long strings are optionally + * clipped. + */ +function prettyUiString(x, cliplen) { + var ret; + + if (typeof x !== 'string') { + throw new Error('invalid input to prettyUiString: ' + typeof x); + } + try { + // Here utf8.decode() is better than decoding using NodeJS buffer + // operations because we want strict UTF-8 interpretation. + ret = JSON.stringify(utf8.decode(x)); + } catch (e) { + // When we fall back to representing bytes, indicate that the string + // is "raw" with a 'r"' prefix (a somewhat arbitrary convention). + // U+0022 = ", U+0027 = ' + ret = 'r"' + x.replace(/[\u0022\u0027\u0000-\u001f\u0080-\uffff]/g, function (match) { + var cp = match.charCodeAt(0); + return '\\x' + nybbles[(cp >> 4) & 0x0f] + nybbles[cp & 0x0f]; + }) + '"'; + } + + if (cliplen && ret.length > cliplen) { + ret = ret.substring(0, cliplen) + '...'; // trailing '"' intentionally missing + } + return ret; +} + +/* Pretty print a dvalue string (bytes represented as U+0000...U+00FF) + * for UI usage without quotes. + */ +function prettyUiStringUnquoted(x, cliplen) { + var ret; + + if (typeof x !== 'string') { + throw new Error('invalid input to prettyUiStringUnquoted: ' + typeof x); + } + + try { + // Here utf8.decode() is better than decoding using NodeJS buffer + // operations because we want strict UTF-8 interpretation. + + // XXX: unprintable characters etc? In some UI cases we'd want to + // e.g. escape newlines and in others not. + ret = utf8.decode(x); + } catch (e) { + // For the unquoted version we don't need to escape single or double + // quotes. + ret = x.replace(/[\u0000-\u001f\u0080-\uffff]/g, function (match) { + var cp = match.charCodeAt(0); + return '\\x' + nybbles[(cp >> 4) & 0x0f] + nybbles[cp & 0x0f]; + }); + } + + if (cliplen && ret.length > cliplen) { + ret = ret.substring(0, cliplen) + '...'; + } + return ret; +} + +/* Pretty print a dvalue for UI usage. Everything comes out as a ready-to-use + * string. + * + * XXX: Currently the debug client formats all values for UI use. A better + * solution would be to pass values in typed form and let the UI format them, + * so that styling etc. could take typing into account. + */ +function prettyUiDebugValue(x, cliplen) { + if (typeof x === 'object' && x !== null) { + // Note: typeof null === 'object', so null special case explicitly + if (x.type === 'eom') { + return 'EOM'; + } else if (x.type === 'req') { + return 'REQ'; + } else if (x.type === 'rep') { + return 'REP'; + } else if (x.type === 'err') { + return 'ERR'; + } else if (x.type === 'nfy') { + return 'NFY'; + } else if (x.type === 'unused') { + return 'unused'; + } else if (x.type === 'undefined') { + return 'undefined'; + } else if (x.type === 'buffer') { + return '|' + x.data + '|'; + } else if (x.type === 'object') { + return '[object ' + (dukClassNames[x.class] || ('class ' + x.class)) + ' ' + x.pointer + ']'; + } else if (x.type === 'pointer') { + return ''; + } else if (x.type === 'lightfunc') { + return ''; + } else if (x.type === 'number') { + // duk_tval number, any IEEE double + var tmp = new Buffer(x.data, 'hex'); // decode into hex + var val = tmp.readDoubleBE(0); // big endian ieee double + return prettyUiNumber(val); + } + } else if (x === null) { + return 'null'; + } else if (typeof x === 'boolean') { + return x ? 'true' : 'false'; + } else if (typeof x === 'string') { + return prettyUiString(x, cliplen); + } else if (typeof x === 'number') { + // Debug protocol integer + return prettyUiNumber(x); + } + + // We shouldn't come here, but if we do, JSON is a reasonable default. + return JSON.stringify(x); +} + +/* Pretty print a debugger message given as an array of parsed dvalues. + * Result should be a pure ASCII one-liner. + */ +function prettyDebugMessage(msg) { + return msg.map(prettyDebugValue).join(' '); +} + +/* Pretty print a debugger command. */ +function prettyDebugCommand(cmd) { + return debugCommandNames[cmd] || String(cmd); +} + +/* Decode and normalize source file contents: UTF-8, tabs to 8, + * CR LF to LF. + */ +function decodeAndNormalizeSource(data) { + var tmp; + var lines, line, repl; + var i, n; + var j, m; + + try { + tmp = data.toString('utf8'); + } catch (e) { + console.log('Failed to UTF-8 decode source file, ignoring: ' + e); + tmp = String(data); + } + + lines = tmp.split(/\r?\n/); + for (i = 0, n = lines.length; i < n; i++) { + line = lines[i]; + if (/\t/.test(line)) { + repl = ''; + for (j = 0, m = line.length; j < m; j++) { + if (line.charAt(j) === '\t') { + repl += ' '; + while ((repl.length % 8) != 0) { + repl += ' '; + } + } else { + repl += line.charAt(j); + } + } + lines[i] = repl; + } + } + + // XXX: normalize last newline (i.e. force a newline if contents don't + // end with a newline)? + + return lines.join('\n'); +} + +/* Token bucket rate limiter for a given callback. Calling code calls + * trigger() to request 'cb' to be called, and the rate limiter ensures + * that 'cb' is not called too often. + */ +function RateLimited(tokens, rate, cb) { + var _this = this; + this.maxTokens = tokens; + this.tokens = this.maxTokens; + this.rate = rate; + this.cb = cb; + this.delayedCb = false; + + // Right now the implementation is setInterval-based, but could also be + // made timerless. There are so few rate limited resources that this + // doesn't matter in practice. + + this.tokenAdder = setInterval(function () { + if (_this.tokens < _this.maxTokens) { + _this.tokens++; + } + if (_this.delayedCb) { + _this.delayedCb = false; + _this.tokens--; + _this.cb(); + } + }, this.rate); +} +RateLimited.prototype.trigger = function () { + if (this.tokens > 0) { + this.tokens--; + this.cb(); + } else { + this.delayedCb = true; + } +}; + +/* + * Source file manager + * + * Scan the list of search directories for Ecmascript source files and + * build an index of them. Provides a mechanism to find a source file + * based on a raw 'fileName' property provided by the debug target, and + * to provide a file list for the web UI. + * + * NOTE: it's tempting to do loose matching for filenames, but this does + * not work in practice. Filenames must match 1:1 with the debug target + * so that e.g. breakpoints assigned based on filenames found from the + * search paths will match 1:1 on the debug target. If this is not the + * case, breakpoints won't work as expected. + */ + +function SourceFileManager(directories) { + this.directories = directories; + this.extensions = { '.js': true, '.jsm': true }; + this.files; +} + +SourceFileManager.prototype.scan = function () { + var _this = this; + var fileMap = {}; // absFn -> true + var files; + + this.directories.forEach(function (dir) { + console.log('Scanning source files: ' + dir); + try { + wrench.readdirSyncRecursive(dir).forEach(function (fn) { + var absFn = path.normalize(path.join(dir, fn)); // './foo/bar.js' -> 'foo/bar.js' + var ent; + + if (fs.existsSync(absFn) && + fs.lstatSync(absFn).isFile() && + _this.extensions[path.extname(fn)]) { + // We want the fileMap to contain the filename relative to + // the search dir root. + fileMap[fn] = true; + } + }); + } catch (e) { + console.log('Failed to scan ' + dir + ': ' + e); + } + }); + + files = Object.keys(fileMap); + files.sort(); + this.files = files; + + console.log('Found ' + files.length + ' source files in ' + this.directories.length + ' search directories'); +}; + +SourceFileManager.prototype.getFiles = function () { + return this.files; +}; + +SourceFileManager.prototype.search = function (fileName) { + var _this = this; + + // Loose matching is tempting but counterproductive: filenames must + // match 1:1 between the debug client and the debug target for e.g. + // breakpoints to work as expected. Note that a breakpoint may be + // assigned by selecting a file from a dropdown populated by scanning + // the filesystem for available sources and there's no way of knowing + // if the debug target uses the exact same name. + + function tryLookup() { + var i, fn, data; + + for (i = 0; i < _this.directories.length; i++) { + fn = path.join(_this.directories[i], fileName); + if (fs.existsSync(fn) && fs.lstatSync(fn).isFile()) { + data = fs.readFileSync(fn); // Raw bytes + return decodeAndNormalizeSource(data); // Unicode string + } + } + return null; + } + + return tryLookup(fileName); +}; + +/* + * Debug protocol parser + * + * The debug protocol parser is an EventEmitter which parses debug messages + * from an input stream and emits 'debug-message' events for completed + * messages ending in an EOM. The parser also provides debug dumping, stream + * logging functionality, and statistics gathering functionality. + * + * This parser is used to parse both incoming and outgoing messages. For + * outgoing messages the only function is to validate and debug dump the + * messages we're about to send. The downside of dumping at this low level + * is that we can't match request and reply/error messages here. + * + * http://www.sitepoint.com/nodejs-events-and-eventemitter/ + */ + +function DebugProtocolParser(inputStream, + protocolVersion, + rawDumpFileName, + textDumpFileName, + textDumpFilePrefix, + hexDumpConsolePrefix, + textDumpConsolePrefix) { + var _this = this; + this.inputStream = inputStream; + this.closed = false; // stream is closed/broken, don't parse anymore + this.bytes = 0; + this.dvalues = 0; + this.messages = 0; + this.requests = 0; + this.prevBytes = 0; + this.bytesPerSec = 0; + this.statsTimer = null; + this.readableNumberValue = true; + + events.EventEmitter.call(this); + + var buf = new Buffer(0); // accumulate data + var msg = []; // accumulated message until EOM + var versionIdentification; + + var statsInterval = 2000; + var statsIntervalSec = statsInterval / 1000; + this.statsTimer = setInterval(function () { + _this.bytesPerSec = (_this.bytes - _this.prevBytes) / statsIntervalSec; + _this.prevBytes = _this.bytes; + _this.emit('stats-update'); + }, statsInterval); + + function consume(n) { + var tmp = new Buffer(buf.length - n); + buf.copy(tmp, 0, n); + buf = tmp; + } + + inputStream.on('data', function (data) { + var i, n, x, v, gotValue, len, t, tmpbuf, verstr; + var prettyMsg; + + if (_this.closed || !_this.inputStream) { + console.log('Ignoring incoming data from closed input stream, len ' + data.length); + return; + } + + _this.bytes += data.length; + if (rawDumpFileName) { + fs.appendFileSync(rawDumpFileName, data); + } + if (hexDumpConsolePrefix) { + console.log(hexDumpConsolePrefix + data.toString('hex')); + } + + buf = Buffer.concat([ buf, data ]); + + // Protocol version handling. When dumping an output stream, the + // caller gives a non-null protocolVersion so we don't read one here. + if (protocolVersion == null) { + if (buf.length > 1024) { + _this.emit('transport-error', 'Parse error (version identification too long), dropping connection'); + _this.close(); + return; + } + + for (i = 0, n = buf.length; i < n; i++) { + if (buf[i] == 0x0a) { + tmpbuf = new Buffer(i); + buf.copy(tmpbuf, 0, 0, i); + consume(i + 1); + verstr = tmpbuf.toString('utf-8'); + t = verstr.split(' '); + protocolVersion = Number(t[0]); + versionIdentification = verstr; + + _this.emit('protocol-version', { + protocolVersion: protocolVersion, + versionIdentification: versionIdentification + }); + break; + } + } + + if (protocolVersion == null) { + // Still waiting for version identification to complete. + return; + } + } + + // Parse complete dvalues (quite inefficient now) by trial parsing. + // Consume a value only when it's fully present in 'buf'. + // See doc/debugger.rst for format description. + + while (buf.length > 0) { + x = buf[0]; + v = undefined; + gotValue = false; // used to flag special values like undefined + + if (x >= 0xc0) { + // 0xc0...0xff: integers 0-16383 + if (buf.length >= 2) { + v = ((x - 0xc0) << 8) + buf[1]; + consume(2); + } + } else if (x >= 0x80) { + // 0x80...0xbf: integers 0-63 + v = x - 0x80; + consume(1); + } else if (x >= 0x60) { + // 0x60...0x7f: strings with length 0-31 + len = x - 0x60; + if (buf.length >= 1 + len) { + v = new Buffer(len); + buf.copy(v, 0, 1, 1 + len); + v = bufferToDebugString(v); + consume(1 + len); + } + } else { + switch (x) { + case 0x00: v = DVAL_EOM; consume(1); break; + case 0x01: v = DVAL_REQ; consume(1); break; + case 0x02: v = DVAL_REP; consume(1); break; + case 0x03: v = DVAL_ERR; consume(1); break; + case 0x04: v = DVAL_NFY; consume(1); break; + case 0x10: // 4-byte signed integer + if (buf.length >= 5) { + v = buf.readInt32BE(1); + consume(5); + } + break; + case 0x11: // 4-byte string + if (buf.length >= 5) { + len = buf.readUInt32BE(1); + if (buf.length >= 5 + len) { + v = new Buffer(len); + buf.copy(v, 0, 5, 5 + len); + v = bufferToDebugString(v); + consume(5 + len); + } + } + break; + case 0x12: // 2-byte string + if (buf.length >= 3) { + len = buf.readUInt16BE(1); + if (buf.length >= 3 + len) { + v = new Buffer(len); + buf.copy(v, 0, 3, 3 + len); + v = bufferToDebugString(v); + consume(3 + len); + } + } + break; + case 0x13: // 4-byte buffer + if (buf.length >= 5) { + len = buf.readUInt32BE(1); + if (buf.length >= 5 + len) { + v = new Buffer(len); + buf.copy(v, 0, 5, 5 + len); + v = { type: 'buffer', data: v.toString('hex') }; + consume(5 + len); + // Value could be a Node.js buffer directly, but + // we prefer all dvalues to be JSON compatible + } + } + break; + case 0x14: // 2-byte buffer + if (buf.length >= 3) { + len = buf.readUInt16BE(1); + if (buf.length >= 3 + len) { + v = new Buffer(len); + buf.copy(v, 0, 3, 3 + len); + v = { type: 'buffer', data: v.toString('hex') }; + consume(3 + len); + // Value could be a Node.js buffer directly, but + // we prefer all dvalues to be JSON compatible + } + } + break; + case 0x15: // unused/none + v = { type: 'unused' }; + consume(1); + break; + case 0x16: // undefined + v = { type: 'undefined' }; + gotValue = true; // indicate 'v' is actually set + consume(1); + break; + case 0x17: // null + v = null; + gotValue = true; // indicate 'v' is actually set + consume(1); + break; + case 0x18: // true + v = true; + consume(1); + break; + case 0x19: // false + v = false; + consume(1); + break; + case 0x1a: // number (IEEE double), big endian + if (buf.length >= 9) { + v = new Buffer(8); + buf.copy(v, 0, 1, 9); + v = { type: 'number', data: v.toString('hex') } + + if (_this.readableNumberValue) { + // The _value key should not be used programmatically, + // it is just there to make the dumps more readable. + v._value = buf.readDoubleBE(1); + } + consume(9); + } + break; + case 0x1b: // object + if (buf.length >= 3) { + len = buf[2]; + if (buf.length >= 3 + len) { + v = new Buffer(len); + buf.copy(v, 0, 3, 3 + len); + v = { type: 'object', 'class': buf[1], pointer: v.toString('hex') }; + consume(3 + len); + } + } + break; + case 0x1c: // pointer + if (buf.length >= 2) { + len = buf[1]; + if (buf.length >= 2 + len) { + v = new Buffer(len); + buf.copy(v, 0, 2, 2 + len); + v = { type: 'pointer', pointer: v.toString('hex') }; + consume(2 + len); + } + } + break; + case 0x1d: // lightfunc + if (buf.length >= 4) { + len = buf[3]; + if (buf.length >= 4 + len) { + v = new Buffer(len); + buf.copy(v, 0, 4, 4 + len); + v = { type: 'lightfunc', flags: buf.readUInt16BE(1), pointer: v.toString('hex') }; + consume(4 + len); + } + } + break; + case 0x1e: // heapptr + if (buf.length >= 2) { + len = buf[1]; + if (buf.length >= 2 + len) { + v = new Buffer(len); + buf.copy(v, 0, 2, 2 + len); + v = { type: 'heapptr', pointer: v.toString('hex') }; + consume(2 + len); + } + } + break; + default: + _this.emit('transport-error', 'Parse error, dropping connection'); + _this.close(); + } + } + + if (typeof v === 'undefined' && !gotValue) { + break; + } + msg.push(v); + _this.dvalues++; + + // Could emit a 'debug-value' event here, but that's not necessary + // because the receiver will just collect statistics which can also + // be done using the finished message. + + if (v === DVAL_EOM) { + _this.messages++; + + if (textDumpFileName || textDumpConsolePrefix) { + prettyMsg = prettyDebugMessage(msg); + if (textDumpFileName) { + fs.appendFileSync(textDumpFileName, (textDumpFilePrefix || '') + prettyMsg + '\n'); + } + if (textDumpConsolePrefix) { + console.log(textDumpConsolePrefix + prettyMsg); + } + } + + _this.emit('debug-message', msg); + msg = []; // new object, old may be in circulation for a while + } + } + }); + + // Not all streams will emit this. + inputStream.on('error', function (err) { + _this.emit('transport-error', err); + _this.close(); + }); + + // Not all streams will emit this. + inputStream.on('close', function () { + _this.close(); + }); +} +DebugProtocolParser.prototype = Object.create(events.EventEmitter.prototype); + +DebugProtocolParser.prototype.close = function () { + // Although the underlying transport may not have a close() or destroy() + // method or even a 'close' event, this method is always available and + // will generate a 'transport-close'. + // + // The caller is responsible for closing the underlying stream if that + // is necessary. + + if (this.closed) { return; } + + this.closed = true; + if (this.statsTimer) { + clearInterval(this.statsTimer); + this.statsTimer = null; + } + this.emit('transport-close'); +}; + +/* + * Debugger output formatting + */ + +function formatDebugValue(v) { + var buf, dec, len; + + // See doc/debugger.rst for format description. + + if (typeof v === 'object' && v !== null) { + // Note: typeof null === 'object', so null special case explicitly + if (v.type === 'eom') { + return new Buffer([ 0x00 ]); + } else if (v.type === 'req') { + return new Buffer([ 0x01 ]); + } else if (v.type === 'rep') { + return new Buffer([ 0x02 ]); + } else if (v.type === 'err') { + return new Buffer([ 0x03 ]); + } else if (v.type === 'nfy') { + return new Buffer([ 0x04 ]); + } else if (v.type === 'unused') { + return new Buffer([ 0x15 ]); + } else if (v.type === 'undefined') { + return new Buffer([ 0x16 ]); + } else if (v.type === 'number') { + dec = new Buffer(v.data, 'hex'); + len = dec.length; + if (len !== 8) { + throw new TypeError('value cannot be converted to dvalue: ' + JSON.stringify(v)); + } + buf = new Buffer(1 + len); + buf[0] = 0x1a; + dec.copy(buf, 1); + return buf; + } else if (v.type === 'buffer') { + dec = new Buffer(v.data, 'hex'); + len = dec.length; + if (len <= 0xffff) { + buf = new Buffer(3 + len); + buf[0] = 0x14; + buf[1] = (len >> 8) & 0xff; + buf[2] = (len >> 0) & 0xff; + dec.copy(buf, 3); + return buf; + } else { + buf = new Buffer(5 + len); + buf[0] = 0x13; + buf[1] = (len >> 24) & 0xff; + buf[2] = (len >> 16) & 0xff; + buf[3] = (len >> 8) & 0xff; + buf[4] = (len >> 0) & 0xff; + dec.copy(buf, 5); + return buf; + } + } else if (v.type === 'object') { + dec = new Buffer(v.pointer, 'hex'); + len = dec.length; + buf = new Buffer(3 + len); + buf[0] = 0x1b; + buf[1] = v.class; + buf[2] = len; + dec.copy(buf, 3); + return buf; + } else if (v.type === 'pointer') { + dec = new Buffer(v.pointer, 'hex'); + len = dec.length; + buf = new Buffer(2 + len); + buf[0] = 0x1c; + buf[1] = len; + dec.copy(buf, 2); + return buf; + } else if (v.type === 'lightfunc') { + dec = new Buffer(v.pointer, 'hex'); + len = dec.length; + buf = new Buffer(4 + len); + buf[0] = 0x1d; + buf[1] = (v.flags >> 8) & 0xff; + buf[2] = v.flags & 0xff; + buf[3] = len; + dec.copy(buf, 4); + return buf; + } else if (v.type === 'heapptr') { + dec = new Buffer(v.pointer, 'hex'); + len = dec.length; + buf = new Buffer(2 + len); + buf[0] = 0x1e; + buf[1] = len; + dec.copy(buf, 2); + return buf; + } + } else if (v === null) { + return new Buffer([ 0x17 ]); + } else if (typeof v === 'boolean') { + return new Buffer([ v ? 0x18 : 0x19 ]); + } else if (typeof v === 'number') { + if (Math.floor(v) === v && /* whole */ + (v !== 0 || 1 / v > 0) && /* not negative zero */ + v >= -0x80000000 && v <= 0x7fffffff) { + // Represented signed 32-bit integers as plain integers. + // Debugger code expects this for all fields that are not + // duk_tval representations (e.g. command numbers and such). + if (v >= 0x00 && v <= 0x3f) { + return new Buffer([ 0x80 + v ]); + } else if (v >= 0x0000 && v <= 0x3fff) { + return new Buffer([ 0xc0 + (v >> 8), v & 0xff ]); + } else if (v >= -0x80000000 && v <= 0x7fffffff) { + return new Buffer([ 0x10, + (v >> 24) & 0xff, + (v >> 16) & 0xff, + (v >> 8) & 0xff, + (v >> 0) & 0xff ]); + } else { + throw new Error('internal error when encoding integer to dvalue: ' + v); + } + } else { + // Represent non-integers as IEEE double dvalues + buf = new Buffer(1 + 8); + buf[0] = 0x1a; + buf.writeDoubleBE(v, 1); + return buf; + } + } else if (typeof v === 'string') { + if (v.length < 0 || v.length > 0xffffffff) { + // Not possible in practice. + throw new TypeError('cannot convert to dvalue, invalid string length: ' + v.length); + } + if (v.length <= 0x1f) { + buf = new Buffer(1 + v.length); + buf[0] = 0x60 + v.length; + writeDebugStringToBuffer(v, buf, 1); + return buf; + } else if (v.length <= 0xffff) { + buf = new Buffer(3 + v.length); + buf[0] = 0x12; + buf[1] = (v.length >> 8) & 0xff; + buf[2] = (v.length >> 0) & 0xff; + writeDebugStringToBuffer(v, buf, 3); + return buf; + } else { + buf = new Buffer(5 + v.length); + buf[0] = 0x11; + buf[1] = (v.length >> 24) & 0xff; + buf[2] = (v.length >> 16) & 0xff; + buf[3] = (v.length >> 8) & 0xff; + buf[4] = (v.length >> 0) & 0xff; + writeDebugStringToBuffer(v, buf, 5); + return buf; + } + } + + // Shouldn't come here. + throw new TypeError('value cannot be converted to dvalue: ' + JSON.stringify(v)); +} + +/* + * Debugger implementation + * + * A debugger instance communicates with the debug target and maintains + * persistent debug state so that the current state can be resent to the + * socket.io client (web UI) if it reconnects. Whenever the debugger state + * is changed an event is generated. The socket.io handler will listen to + * state change events and push the necessary updates to the web UI, often + * in a rate limited fashion or using a client pull to ensure the web UI + * is not overloaded. + * + * The debugger instance assumes that if the debug protocol connection is + * re-established, it is always to the same target. There is no separate + * abstraction for a debugger session. + */ + +function Debugger() { + events.EventEmitter.call(this); + + this.web = null; // web UI singleton + this.targetStream = null; // transport connection to target + this.outputPassThroughStream = null; // dummy passthrough for message dumping + this.inputParser = null; // parser for incoming debug messages + this.outputParser = null; // parser for outgoing debug messages (stats, dumping) + this.protocolVersion = null; + this.dukVersion = null; + this.dukGitDescribe = null; + this.targetInfo = null; + this.attached = false; + this.handshook = false; + this.reqQueue = null; + this.stats = { // stats for current debug connection + rxBytes: 0, rxDvalues: 0, rxMessages: 0, rxBytesPerSec: 0, + txBytes: 0, txDvalues: 0, txMessages: 0, txBytesPerSec: 0 + }; + this.execStatus = { + attached: false, + state: 'detached', + fileName: '', + funcName: '', + line: 0, + pc: 0 + }; + this.breakpoints = []; + this.callstack = []; + this.locals = []; + this.messageLines = []; + this.messageScrollBack = 100; +} +Debugger.prototype = events.EventEmitter.prototype; + +Debugger.prototype.decodeBytecodeFromBuffer = function (buf, consts, funcs) { + var i, j, n, m, ins, pc; + var res = []; + var op, str, args, comments; + + // XXX: add constants inline to preformatted output (e.g. for strings, + // add a short escaped snippet as a comment on the line after the + // compact argument list). + + for (i = 0, n = buf.length; i < n; i += 4) { + pc = i / 4; + + // shift forces unsigned + if (this.endianness === 'little') { + ins = buf.readInt32LE(i) >>> 0; + } else { + ins = buf.readInt32BE(i) >>> 0; + } + + op = dukOpcodes.opcodes[ins & 0x3f]; + if (op.extra) { + op = dukOpcodes.extra[(ins >> 6) & 0xff]; + } + + args = []; + comments = []; + if (op.args) { + for (j = 0, m = op.args.length; j < m; j++) { + switch(op.args[j]) { + case 'A_R': args.push('r' + ((ins >>> 6) & 0xff)); break; + case 'A_RI': args.push('r' + ((ins >>> 6) & 0xff) + '(indirect)'); break; + case 'A_C': args.push('c' + ((ins >>> 6) & 0xff)); break; + case 'A_H': args.push('0x' + ((ins >>> 6) & 0xff).toString(16)); break; + case 'A_I': args.push(((ins >>> 6) & 0xff).toString(10)); break; + case 'A_B': args.push(((ins >>> 6) & 0xff) ? 'true' : 'false'); break; + case 'B_RC': args.push((ins & (1 << 22) ? 'c' : 'r') + ((ins >>> 14) & 0x0ff)); break; + case 'B_R': args.push('r' + ((ins >>> 14) & 0x1ff)); break; + case 'B_RI': args.push('r' + ((ins >>> 14) & 0x1ff) + '(indirect)'); break; + case 'B_C': args.push('c' + ((ins >>> 14) & 0x1ff)); break; + case 'B_H': args.push('0x' + ((ins >>> 14) & 0x1ff).toString(16)); break; + case 'B_I': args.push(((ins >>> 14) & 0x1ff).toString(10)); break; + case 'C_RC': args.push((ins & (1 << 31) ? 'c' : 'r') + ((ins >>> 23) & 0x0ff)); break; + case 'C_R': args.push('r' + ((ins >>> 23) & 0x1ff)); break; + case 'C_RI': args.push('r' + ((ins >>> 23) & 0x1ff) + '(indirect)'); break; + case 'C_C': args.push('c' + ((ins >>> 23) & 0x1ff)); break; + case 'C_H': args.push('0x' + ((ins >>> 23) & 0x1ff).toString(16)); break; + case 'C_I': args.push(((ins >>> 23) & 0x1ff).toString(10)); break; + case 'BC_R': args.push('r' + ((ins >>> 14) & 0x3ffff)); break; + case 'BC_C': args.push('c' + ((ins >>> 14) & 0x3ffff)); break; + case 'BC_H': args.push('0x' + ((ins >>> 14) & 0x3ffff).toString(16)); break; + case 'BC_I': args.push(((ins >>> 14) & 0x3ffff).toString(10)); break; + case 'ABC_H': args.push(((ins >>> 6) & 0x03ffffff).toString(16)); break; + case 'ABC_I': args.push(((ins >>> 6) & 0x03ffffff).toString(10)); break; + case 'BC_LDINT': args.push(((ins >>> 14) & 0x3ffff) - (1 << 17)); break; + case 'BC_LDINTX': args.push(((ins >>> 14) & 0x3ffff) - 0); break; // no bias in LDINTX + case 'ABC_JUMP': { + var pc_add = ((ins >>> 6) & 0x03ffffff) - (1 << 25) + 1; // pc is preincremented before adding + var pc_dst = pc + pc_add; + args.push(pc_dst + ' (' + (pc_add >= 0 ? '+' : '') + pc_add + ')'); + break; + } + default: args.push('?'); break; + } + } + } + if (op.flags) { + for (j = 0, m = op.flags.length; j < m; j++) { + if (ins & op.flags[j].mask) { + comments.push(op.flags[j].name); + } + } + } + + if (args.length > 0) { + str = sprintf('%05d %08x %-10s %s', pc, ins, op.name, args.join(', ')); + } else { + str = sprintf('%05d %08x %-10s', pc, ins, op.name); + } + if (comments.length > 0) { + str = sprintf('%-44s ; %s', str, comments.join(', ')); + } + + res.push({ + str: str, + ins: ins + }); + } + + return res; +}; + +Debugger.prototype.uiMessage = function (type, val) { + var msg; + if (typeof type === 'object') { + msg = type; + } else if (typeof type === 'string') { + msg = { type: type, message: val }; + } else { + throw new TypeError('invalid ui message: ' + type); + } + this.messageLines.push(msg); + while (this.messageLines.length > this.messageScrollBack) { + this.messageLines.shift(); + } + this.emit('ui-message-update'); // just trigger a sync, gets rate limited +}; + +Debugger.prototype.sendRequest = function (msg) { + var _this = this; + return new Promise(function (resolve, reject) { + var dvals = []; + var dval; + var data; + var i; + + if (!_this.attached || !_this.handshook || !_this.reqQueue || !_this.targetStream) { + throw new Error('invalid state for sendRequest'); + } + + for (i = 0; i < msg.length; i++) { + try { + dval = formatDebugValue(msg[i]); + } catch (e) { + console.log('Failed to format dvalue, dropping connection: ' + e); + console.log(e.stack || e); + _this.targetStream.destroy(); + throw new Error('failed to format dvalue'); + } + dvals.push(dval); + } + + data = Buffer.concat(dvals); + + _this.targetStream.write(data); + _this.outputPassThroughStream.write(data); // stats and dumping + + if (optLogMessages) { + console.log('Request ' + prettyDebugCommand(msg[1]) + ': ' + prettyDebugMessage(msg)); + } + + if (!_this.reqQueue) { + throw new Error('no reqQueue'); + } + + _this.reqQueue.push({ + reqMsg: msg, + reqCmd: msg[1], + resolveCb: resolve, + rejectCb: reject + }); + }); +}; + +Debugger.prototype.sendBasicInfoRequest = function () { + var _this = this; + return this.sendRequest([ DVAL_REQ, CMD_BASICINFO, DVAL_EOM ]).then(function (msg) { + _this.dukVersion = msg[1]; + _this.dukGitDescribe = msg[2]; + _this.targetInfo = msg[3]; + _this.endianness = { 1: 'little', 2: 'mixed', 3: 'big' }[msg[4]] || 'unknown'; + _this.emit('basic-info-update'); + return msg; + }); +}; + +Debugger.prototype.sendGetVarRequest = function (varname) { + var _this = this; + return this.sendRequest([ DVAL_REQ, CMD_GETVAR, varname, DVAL_EOM ]).then(function (msg) { + return { found: msg[1] === 1, value: msg[2] }; + }); +}; + +Debugger.prototype.sendPutVarRequest = function (varname, varvalue) { + var _this = this; + return this.sendRequest([ DVAL_REQ, CMD_PUTVAR, varname, varvalue, DVAL_EOM ]); +}; + +Debugger.prototype.sendInvalidCommandTestRequest = function () { + // Intentional invalid command + var _this = this; + return this.sendRequest([ DVAL_REQ, 0xdeadbeef, DVAL_EOM ]); +} + +Debugger.prototype.sendStatusRequest = function () { + // Send a status request to trigger a status notify, result is ignored: + // target sends a status notify instead of a meaningful reply + var _this = this; + return this.sendRequest([ DVAL_REQ, CMD_TRIGGERSTATUS, DVAL_EOM ]); +} + +Debugger.prototype.sendBreakpointListRequest = function () { + var _this = this; + return this.sendRequest([ DVAL_REQ, CMD_LISTBREAK, DVAL_EOM ]).then(function (msg) { + var i, n; + var breakpts = []; + + for (i = 1, n = msg.length - 1; i < n; i += 2) { + breakpts.push({ fileName: msg[i], lineNumber: msg[i + 1] }); + } + + _this.breakpoints = breakpts; + _this.emit('breakpoints-update'); + return msg; + }); +}; + +Debugger.prototype.sendGetLocalsRequest = function () { + var _this = this; + return this.sendRequest([ DVAL_REQ, CMD_GETLOCALS, DVAL_EOM ]).then(function (msg) { + var i; + var locals = []; + + for (i = 1; i <= msg.length - 2; i += 2) { + // XXX: do pretty printing in debug client for now + locals.push({ key: msg[i], value: prettyUiDebugValue(msg[i + 1], LOCALS_CLIPLEN) }); + } + + _this.locals = locals; + _this.emit('locals-update'); + return msg; + }); +}; + +Debugger.prototype.sendGetCallStackRequest = function () { + var _this = this; + return this.sendRequest([ DVAL_REQ, CMD_GETCALLSTACK, DVAL_EOM ]).then(function (msg) { + var i; + var stack = []; + + for (i = 1; i + 3 <= msg.length - 1; i += 4) { + stack.push({ + fileName: msg[i], + funcName: msg[i + 1], + lineNumber: msg[i + 2], + pc: msg[i + 3] + }); + } + + _this.callstack = stack; + _this.emit('callstack-update'); + return msg; + }); +}; + +Debugger.prototype.sendStepIntoRequest = function () { + var _this = this; + return this.sendRequest([ DVAL_REQ, CMD_STEPINTO, DVAL_EOM ]); +}; + +Debugger.prototype.sendStepOverRequest = function () { + var _this = this; + return this.sendRequest([ DVAL_REQ, CMD_STEPOVER, DVAL_EOM ]); +}; + +Debugger.prototype.sendStepOutRequest = function () { + var _this = this; + return this.sendRequest([ DVAL_REQ, CMD_STEPOUT, DVAL_EOM ]); +}; + +Debugger.prototype.sendPauseRequest = function () { + var _this = this; + return this.sendRequest([ DVAL_REQ, CMD_PAUSE, DVAL_EOM ]); +}; + +Debugger.prototype.sendResumeRequest = function () { + var _this = this; + return this.sendRequest([ DVAL_REQ, CMD_RESUME, DVAL_EOM ]); +}; + +Debugger.prototype.sendEvalRequest = function (evalInput) { + var _this = this; + return this.sendRequest([ DVAL_REQ, CMD_EVAL, evalInput, DVAL_EOM ]).then(function (msg) { + return { error: msg[1] === 1 /*error*/, value: msg[2] }; + }); +}; + +Debugger.prototype.sendDetachRequest = function () { + var _this = this; + return this.sendRequest([ DVAL_REQ, CMD_DETACH, DVAL_EOM ]); +}; + +Debugger.prototype.sendDumpHeapRequest = function () { + var _this = this; + + return this.sendRequest([ DVAL_REQ, CMD_DUMPHEAP, DVAL_EOM ]).then(function (msg) { + var res = {}; + var objs = []; + var i, j, n, m, o, prop; + + res.type = 'heapDump'; + res.heapObjects = objs; + + for (i = 1, n = msg.length - 1; i < n; /*nop*/) { + o = {}; + o.ptr = msg[i++]; + o.type = msg[i++]; + o.flags = msg[i++] >>> 0; /* unsigned */ + o.refc = msg[i++]; + + if (o.type === DUK_HTYPE_STRING) { + o.blen = msg[i++]; + o.clen = msg[i++]; + o.hash = msg[i++] >>> 0; /* unsigned */ + o.data = msg[i++]; + } else if (o.type === DUK_HTYPE_BUFFER) { + o.len = msg[i++]; + o.data = msg[i++]; + } else if (o.type === DUK_HTYPE_OBJECT) { + o['class'] = msg[i++]; + o.proto = msg[i++]; + o.esize = msg[i++]; + o.enext = msg[i++]; + o.asize = msg[i++]; + o.hsize = msg[i++]; + o.props = []; + for (j = 0, m = o.enext; j < m; j++) { + prop = {}; + prop.flags = msg[i++]; + prop.key = msg[i++]; + prop.accessor = (msg[i++] == 1); + if (prop.accessor) { + prop.getter = msg[i++]; + prop.setter = msg[i++]; + } else { + prop.value = msg[i++]; + } + o.props.push(prop); + } + o.array = []; + for (j = 0, m = o.asize; j < m; j++) { + prop = {}; + prop.value = msg[i++]; + o.array.push(prop); + } + } else { + console.log('invalid htype: ' + o.type + ', disconnect'); + _this.disconnectDebugger(); + throw new Error('invalid htype'); + return; + } + + objs.push(o); + } + + return res; + }); +}; + +Debugger.prototype.sendGetBytecodeRequest = function () { + var _this = this; + + return this.sendRequest([ DVAL_REQ, CMD_GETBYTECODE, DVAL_EOM ]).then(function (msg) { + var idx = 1; + var nconst; + var nfunc; + var val; + var buf; + var i, n; + var consts = []; + var funcs = []; + var bcode; + var preformatted; + var ret; + + //console.log(JSON.stringify(msg)); + + nconst = msg[idx++]; + for (i = 0; i < nconst; i++) { + val = msg[idx++]; + consts.push(val); + } + + nfunc = msg[idx++]; + for (i = 0; i < nfunc; i++) { + val = msg[idx++]; + funcs.push(val); + } + val = msg[idx++]; + + // Right now bytecode is a string containing a direct dump of the + // bytecode in target endianness. Decode here so that the web UI + // doesn't need to. + + buf = new Buffer(val.length); + writeDebugStringToBuffer(val, buf, 0); + bcode = _this.decodeBytecodeFromBuffer(buf, consts, funcs); + + preformatted = []; + consts.forEach(function (v, i) { + preformatted.push('; c' + i + ' ' + JSON.stringify(v)); + }); + preformatted.push(''); + bcode.forEach(function (v) { + preformatted.push(v.str); + }); + preformatted = preformatted.join('\n') + '\n'; + + ret = { + constants: consts, + functions: funcs, + bytecode: bcode, + preformatted: preformatted + }; + + return ret; + }); +}; + +Debugger.prototype.changeBreakpoint = function (fileName, lineNumber, mode) { + var _this = this; + + return this.sendRequest([ DVAL_REQ, CMD_LISTBREAK, DVAL_EOM ]).then(function (msg) { + var i, n; + var breakpts = []; + var deleted = false; + + // Up-to-date list of breakpoints on target + for (i = 1, n = msg.length - 1; i < n; i += 2) { + breakpts.push({ fileName: msg[i], lineNumber: msg[i + 1] }); + } + + // Delete matching breakpoints in reverse order so that indices + // remain valid. We do this for all operations so that duplicates + // are eliminated if present. + for (i = breakpts.length - 1; i >= 0; i--) { + var bp = breakpts[i]; + if (mode === 'deleteall' || (bp.fileName === fileName && bp.lineNumber === lineNumber)) { + deleted = true; + _this.sendRequest([ DVAL_REQ, CMD_DELBREAK, i, DVAL_EOM ], function (msg) { + // nop + }, function (err) { + // nop + }); + } + } + + // Technically we should wait for each delbreak reply but because + // target processes the requests in order, it doesn't matter. + if ((mode === 'add') || (mode === 'toggle' && !deleted)) { + _this.sendRequest([ DVAL_REQ, CMD_ADDBREAK, fileName, lineNumber, DVAL_EOM ], function (msg) { + // nop + }, function (err) { + _this.uiMessage('debugger-info', 'Failed to add breakpoint: ' + err); + }); + } + + // Read final, effective breakpoints from the target + _this.sendBreakpointListRequest(); + }); +}; + +Debugger.prototype.disconnectDebugger = function () { + if (this.targetStream) { + // We require a destroy() method from the actual target stream + this.targetStream.destroy(); + this.targetStream = null; + } + if (this.inputParser) { + this.inputParser.close(); + this.inputParser = null; + } + if (this.outputPassThroughStream) { + // There is no close() or destroy() for a passthrough stream, so just + // close the outputParser which will cancel timers etc. + } + if (this.outputParser) { + this.outputParser.close(); + this.outputParser = null; + } + + this.attached = false; + this.handshook = false; + this.reqQueue = null; + this.execStatus = { + attached: false, + state: 'detached', + fileName: '', + funcName: '', + line: 0, + pc: 0 + }; +}; + +Debugger.prototype.connectDebugger = function () { + var _this = this; + + this.disconnectDebugger(); // close previous target connection + + // CUSTOMTRANSPORT: to use a custom transport, change this.targetStream to + // use your custom transport. + + console.log('Connecting to ' + optTargetHost + ':' + optTargetPort + '...'); + this.targetStream = new net.Socket(); + this.targetStream.connect(optTargetPort, optTargetHost, function () { + console.log('Debug transport connected'); + _this.attached = true; + _this.reqQueue = []; + _this.uiMessage('debugger-info', 'Debug transport connected'); + }); + + this.inputParser = new DebugProtocolParser( + this.targetStream, + null, + optDumpDebugRead, + optDumpDebugPretty, + optDumpDebugPretty ? 'Recv: ' : null, + null, + null // console logging is done at a higher level to match request/response + ); + + // Use a PassThrough stream to debug dump and get stats for output messages. + // Simply write outgoing data to both the targetStream and this passthrough + // separately. + this.outputPassThroughStream = stream.PassThrough(); + this.outputParser = new DebugProtocolParser( + this.outputPassThroughStream, + 1, + optDumpDebugWrite, + optDumpDebugPretty, + optDumpDebugPretty ? 'Send: ' : null, + null, + null // console logging is done at a higher level to match request/response + ); + + this.inputParser.on('transport-close', function () { + _this.uiMessage('debugger-info', 'Debug transport closed'); + _this.disconnectDebugger(); + _this.emit('exec-status-update'); + _this.emit('detached'); + }); + + this.inputParser.on('transport-error', function (err) { + _this.uiMessage('debugger-info', 'Debug transport error: ' + err); + _this.disconnectDebugger(); + }); + + this.inputParser.on('protocol-version', function (msg) { + var ver = msg.protocolVersion; + console.log('Debug version identification:', msg.versionIdentification); + _this.protocolVersion = ver; + _this.uiMessage('debugger-info', 'Debug version identification: ' + msg.versionIdentification); + if (ver !== 1) { + _this.uiMessage('debugger-info', 'Protocol version ' + ver + ' unsupported, dropping connection'); + _this.targetStream.destroy(); + } else { + _this.uiMessage('debugger-info', 'Debug protocol version: ' + ver); + _this.handshook = true; + _this.execStatus = { + attached: true, + state: 'attached', + fileName: '', + funcName: '', + line: 0, + pc: 0 + }; + _this.emit('exec-status-update'); + _this.emit('attached'); // inform web UI + + // Fetch basic info right away + _this.sendBasicInfoRequest(); + } + }); + + this.inputParser.on('debug-message', function (msg) { + _this.processDebugMessage(msg); + }); + + this.inputParser.on('stats-update', function () { + _this.stats.rxBytes = this.bytes; + _this.stats.rxDvalues = this.dvalues; + _this.stats.rxMessages = this.messages; + _this.stats.rxBytesPerSec = this.bytesPerSec; + _this.emit('debug-stats-update'); + }); + + this.outputParser.on('stats-update', function () { + _this.stats.txBytes = this.bytes; + _this.stats.txDvalues = this.dvalues; + _this.stats.txMessages = this.messages; + _this.stats.txBytesPerSec = this.bytesPerSec; + _this.emit('debug-stats-update'); + }); +}; + +Debugger.prototype.processDebugMessage = function (msg) { + var req; + var prevState, newState; + var err; + + if (msg[0] === DVAL_REQ) { + // No actual requests sent by the target right now (just notifys). + console.log('Unsolicited reply message, dropping connection: ' + prettyDebugMessage(msg)); + } else if (msg[0] === DVAL_REP) { + if (this.reqQueue.length <= 0) { + console.log('Unsolicited reply message, dropping connection: ' + prettyDebugMessage(msg)); + this.targetStream.destroy(); + } + req = this.reqQueue.shift(); + + if (optLogMessages) { + console.log('Reply for ' + prettyDebugCommand(req.reqCmd) + ': ' + prettyDebugMessage(msg)); + } + + if (req.resolveCb) { + req.resolveCb(msg); + } else { + // nop: no callback + } + } else if (msg[0] === DVAL_ERR) { + if (this.reqQueue.length <= 0) { + console.log('Unsolicited error message, dropping connection: ' + prettyDebugMessage(msg)); + this.targetStream.destroy(); + } + err = new Error(String(msg[2]) + ' (code ' + String(msg[1]) + ')'); + err.errorCode = msg[1] || 0; + req = this.reqQueue.shift(); + + if (optLogMessages) { + console.log('Error for ' + prettyDebugCommand(req.reqCmd) + ': ' + prettyDebugMessage(msg)); + } + + if (req.rejectCb) { + req.rejectCb(err); + } else { + // nop: no callback + } + } else if (msg[0] === DVAL_NFY) { + if (optLogMessages) { + console.log('Notify ' + prettyDebugCommand(msg[1]) + ': ' + prettyDebugMessage(msg)); + } + + if (msg[1] === CMD_STATUS) { + prevState = this.execStatus.state; + newState = msg[2] === 0 ? 'running' : 'paused'; + this.execStatus = { + attached: true, + state: newState, + fileName: msg[3], + funcName: msg[4], + line: msg[5], + pc: msg[6] + }; + + if (prevState !== newState && newState === 'paused') { + // update run state now that we're paused + this.sendBreakpointListRequest(); + this.sendGetLocalsRequest(); + this.sendGetCallStackRequest(); + } + + this.emit('exec-status-update'); + } else if (msg[1] === CMD_PRINT) { + this.uiMessage('print', prettyUiStringUnquoted(msg[2], UI_MESSAGE_CLIPLEN)); + } else if (msg[1] === CMD_ALERT) { + this.uiMessage('alert', prettyUiStringUnquoted(msg[2], UI_MESSAGE_CLIPLEN)); + } else if (msg[1] === CMD_LOG) { + this.uiMessage({ type: 'log', level: msg[2], message: prettyUiStringUnquoted(msg[3], UI_MESSAGE_CLIPLEN) }); + } else { + console.log('Unknown notify, dropping connection: ' + prettyDebugMessage(msg)); + this.targetStream.destroy(); + } + } else { + console.log('Invalid initial dvalue, dropping connection: ' + prettyDebugMessage(msg)); + this.targetStream.destroy(); + } +}; + +Debugger.prototype.run = function () { + var _this = this; + + // Initial debugger connection + + this.connectDebugger(); + + // Poll various state items when running + + var sendRound = 0; + var statusPending = false; + var bplistPending = false; + var localsPending = false; + var callStackPending = false; + + setInterval(function () { + if (_this.execStatus.state !== 'running') { + return; + } + + // Could also check for an empty request queue, but that's probably + // too strict? + + // Pending flags are used to avoid requesting the same thing twice + // while a previous request is pending. The flag-based approach is + // quite awkward. Rework to use promises. + + switch(sendRound) { + case 0: + if (!statusPending) { + statusPending = true; + _this.sendStatusRequest().finally(function () { statusPending = false; }); + } + break; + case 1: + if (!bplistPending) { + bplistPending = true; + _this.sendBreakpointListRequest().finally(function () { bplistPending = false; }); + } + break; + case 2: + if (!localsPending) { + localsPending = true; + _this.sendGetLocalsRequest().finally(function () { localsPending = false; }); + } + break; + case 3: + if (!callStackPending) { + callStackPending = true; + _this.sendGetCallStackRequest().finally(function () { callStackPending = false; }); + } + break; + } + sendRound = (sendRound + 1) % 4; + }, 500); +}; + +/* + * Express setup and socket.io + */ + +function DebugWebServer() { + this.dbg = null; // debugger singleton + this.socket = null; // current socket (or null) + this.keepaliveTimer = null; + this.uiMessageLimiter = null; + this.cachedJson = {}; // cache to avoid resending identical data + this.sourceFileManager = new SourceFileManager(optSourceSearchDirs); + this.sourceFileManager.scan(); +} + +DebugWebServer.prototype.handleSourcePost = function (req, res) { + var fileName = req.body && req.body.fileName; + var fileData; + + console.log('Source request: ' + fileName); + + if (typeof fileName !== 'string') { + res.status(500).send('invalid request'); + return; + } + fileData = this.sourceFileManager.search(fileName, optSourceSearchDirs); + if (typeof fileData !== 'string') { + res.status(404).send('not found'); + return; + } + res.status(200).send(fileData); // UTF-8 +}; + +DebugWebServer.prototype.handleSourceListPost = function (req, res) { + console.log('Source list request'); + + var files = this.sourceFileManager.getFiles(); + res.header('Content-Type', 'application/json'); + res.status(200).json(files); +}; + +DebugWebServer.prototype.handleHeapDumpGet = function (req, res) { + console.log('Heap dump get'); + + this.dbg.sendDumpHeapRequest().then(function (val) { + res.header('Content-Type', 'application/json'); + //res.status(200).json(val); + res.status(200).send(JSON.stringify(val, null, 4)); + }).catch(function (err) { + res.status(500).send('Failed to get heap dump: ' + (err.stack || err)); + }); +}; + +DebugWebServer.prototype.run = function () { + var _this = this; + + var express = require('express'); + var bodyParser = require('body-parser'); + var app = express(); + var http = require('http').Server(app); + var io = require('socket.io')(http); + + app.use(bodyParser.json()); + app.post('/source', this.handleSourcePost.bind(this)); + app.post('/sourceList', this.handleSourceListPost.bind(this)); + app.get('/heapDump.json', this.handleHeapDumpGet.bind(this)); + app.use('/', express.static(__dirname + '/static')); + + http.listen(optHttpPort, function () { + console.log('Listening on *:' + optHttpPort); + }); + + io.on('connection', this.handleNewSocketIoConnection.bind(this)); + + this.dbg.on('attached', function () { + console.log('Debugger attached'); + }); + + this.dbg.on('detached', function () { + console.log('Debugger detached'); + }); + + this.dbg.on('debug-stats-update', function () { + _this.debugStatsLimiter.trigger(); + }); + + this.dbg.on('ui-message-update', function () { + // Explicit rate limiter because this is a source of a lot of traffic. + _this.uiMessageLimiter.trigger(); + }); + + this.dbg.on('basic-info-update', function () { + _this.emitBasicInfo(); + }); + + this.dbg.on('breakpoints-update', function () { + _this.emitBreakpoints(); + }); + + this.dbg.on('exec-status-update', function () { + // Explicit rate limiter because this is a source of a lot of traffic. + _this.execStatusLimiter.trigger(); + }); + + this.dbg.on('locals-update', function () { + _this.emitLocals(); + }); + + this.dbg.on('callstack-update', function () { + _this.emitCallStack(); + }); + + this.uiMessageLimiter = new RateLimited(10, 1000, this.uiMessageLimiterCallback.bind(this)); + this.execStatusLimiter = new RateLimited(50, 500, this.execStatusLimiterCallback.bind(this)); + this.debugStatsLimiter = new RateLimited(1, 2000, this.debugStatsLimiterCallback.bind(this)); + + this.keepaliveTimer = setInterval(this.emitKeepalive.bind(this), 30000); +}; + +DebugWebServer.prototype.handleNewSocketIoConnection = function (socket) { + var _this = this; + + console.log('Socket.io connected'); + if (this.socket) { + console.log('Closing previous socket.io socket'); + this.socket.emit('replaced'); + } + this.socket = socket; + + this.emitKeepalive(); + + socket.on('disconnect', function () { + console.log('Socket.io disconnected'); + if (_this.socket === socket) { + _this.socket = null; + } + }); + + socket.on('keepalive', function (msg) { + // nop + }); + + socket.on('attach', function (msg) { + if (_this.dbg.targetStream) { + console.log('Attach request when debugger already has a connection, ignoring'); + } else { + _this.dbg.connectDebugger(); + } + }); + + socket.on('detach', function (msg) { + // Try to detach cleanly, timeout if no response + Promise.any([ + _this.dbg.sendDetachRequest(), + Promise.delay(3000) + ]).finally(function () { + _this.dbg.disconnectDebugger(); + }); + }); + + socket.on('stepinto', function (msg) { + _this.dbg.sendStepIntoRequest(); + }); + + socket.on('stepover', function (msg) { + _this.dbg.sendStepOverRequest(); + }); + + socket.on('stepout', function (msg) { + _this.dbg.sendStepOutRequest(); + }); + + socket.on('pause', function (msg) { + _this.dbg.sendPauseRequest(); + }); + + socket.on('resume', function (msg) { + _this.dbg.sendResumeRequest(); + }); + + socket.on('eval', function (msg) { + // msg.input is a proper Unicode strings here, and needs to be + // converted into a protocol string (U+0000...U+00FF). + var input = stringToDebugString(msg.input); + _this.dbg.sendEvalRequest(input).then(function (v) { + socket.emit('eval-result', { error: v.error, result: prettyUiDebugValue(v.value, EVAL_CLIPLEN) }); + }); + + // An eval call quite possibly changes the local variables so always + // re-read locals afterwards. We don't need to wait for eval() to + // complete here; the requests will pipeline automatically and be + // executed in order. + _this.dbg.sendGetLocalsRequest(); + }); + + socket.on('getvar', function (msg) { + // msg.varname is a proper Unicode strings here, and needs to be + // converted into a protocol string (U+0000...U+00FF). + var varname = stringToDebugString(msg.varname); + _this.dbg.sendGetVarRequest(varname) + .then(function (v) { + socket.emit('getvar-result', { found: v.found, result: prettyUiDebugValue(v.value, GETVAR_CLIPLEN) }); + }); + }); + + socket.on('putvar', function (msg) { + // msg.varname and msg.varvalue are proper Unicode strings here, they + // need to be converted into protocol strings (U+0000...U+00FF). + var varname = stringToDebugString(msg.varname); + var varvalue = msg.varvalue; + + // varvalue is JSON parsed by the web UI for now, need special string + // encoding here. + if (typeof varvalue === 'string') { + varvalue = stringToDebugString(msg.varvalue); + } + + _this.dbg.sendPutVarRequest(varname, varvalue) + .then(function (v) { + console.log('putvar done'); // XXX: signal success to UI? + }); + + // A PutVar call quite possibly changes the local variables so always + // re-read locals afterwards. We don't need to wait for eval() to + // complete here; the requests will pipeline automatically and be + // executed in order. + _this.dbg.sendGetLocalsRequest(); + }); + + socket.on('add-breakpoint', function (msg) { + _this.dbg.changeBreakpoint(msg.fileName, msg.lineNumber, 'add'); + }); + + socket.on('delete-breakpoint', function (msg) { + _this.dbg.changeBreakpoint(msg.fileName, msg.lineNumber, 'delete'); + }); + + socket.on('toggle-breakpoint', function (msg) { + _this.dbg.changeBreakpoint(msg.fileName, msg.lineNumber, 'toggle'); + }); + + socket.on('delete-all-breakpoints', function (msg) { + _this.dbg.changeBreakpoint(null, null, 'deleteall'); + }); + + socket.on('get-bytecode', function (msg) { + _this.dbg.sendGetBytecodeRequest().then(function (res) { + socket.emit('bytecode', res); + }); + }); + + // Resend all debugger state for new client + this.cachedJson = {}; // clear client state cache + this.emitBasicInfo(); + this.emitStats(); + this.emitExecStatus(); + this.emitUiMessages(); + this.emitBreakpoints(); + this.emitCallStack(); + this.emitLocals(); +}; + +// Check if 'msg' would encode to the same JSON which was previously sent +// to the web client. The caller then avoid resending unnecessary stuff. +DebugWebServer.prototype.cachedJsonCheck = function (cacheKey, msg) { + var newJson = JSON.stringify(msg); + if (this.cachedJson[cacheKey] === newJson) { + return true; // cached + } + this.cachedJson[cacheKey] = newJson; + return false; // not cached, send (cache already updated) +}; + +DebugWebServer.prototype.uiMessageLimiterCallback = function () { + this.emitUiMessages(); +}; + +DebugWebServer.prototype.execStatusLimiterCallback = function () { + this.emitExecStatus(); +}; + +DebugWebServer.prototype.debugStatsLimiterCallback = function () { + this.emitStats(); +}; + +DebugWebServer.prototype.emitKeepalive = function () { + if (!this.socket) { return; } + + this.socket.emit('keepalive', { nodeVersion: process.version }); +}; + +DebugWebServer.prototype.emitBasicInfo = function () { + if (!this.socket) { return; } + + var newMsg = { + duk_version: this.dbg.dukVersion, + duk_git_describe: this.dbg.dukGitDescribe, + target_info: this.dbg.targetInfo, + endianness: this.dbg.endianness + }; + if (this.cachedJsonCheck('basic-info', newMsg)) { + return; + } + this.socket.emit('basic-info', newMsg); +}; + +DebugWebServer.prototype.emitStats = function () { + if (!this.socket) { return; } + + this.socket.emit('debug-stats', this.dbg.stats); +}; + +DebugWebServer.prototype.emitExecStatus = function () { + if (!this.socket) { return; } + + var newMsg = this.dbg.execStatus; + if (this.cachedJsonCheck('exec-status', newMsg)) { + return; + } + this.socket.emit('exec-status', newMsg); +}; + +DebugWebServer.prototype.emitUiMessages = function () { + if (!this.socket) { return; } + + var newMsg = this.dbg.messageLines; + if (this.cachedJsonCheck('output-lines', newMsg)) { + return; + } + this.socket.emit('output-lines', newMsg); +}; + +DebugWebServer.prototype.emitBreakpoints = function () { + if (!this.socket) { return; } + + var newMsg = { breakpoints: this.dbg.breakpoints }; + if (this.cachedJsonCheck('breakpoints', newMsg)) { + return; + } + this.socket.emit('breakpoints', newMsg); +}; + +DebugWebServer.prototype.emitCallStack = function () { + if (!this.socket) { return; } + + var newMsg = { callstack: this.dbg.callstack }; + if (this.cachedJsonCheck('callstack', newMsg)) { + return; + } + this.socket.emit('callstack', newMsg); +}; + +DebugWebServer.prototype.emitLocals = function () { + if (!this.socket) { return; } + + var newMsg = { locals: this.dbg.locals }; + if (this.cachedJsonCheck('locals', newMsg)) { + return; + } + this.socket.emit('locals', newMsg); +}; + +/* + * JSON debug proxy + */ + +function DebugProxy(serverPort) { + this.serverPort = serverPort; + this.server = null; + this.socket = null; + this.targetStream = null; + this.inputParser = null; + + // preformatted dvalues + this.dval_eom = formatDebugValue(DVAL_EOM); + this.dval_req = formatDebugValue(DVAL_REQ); + this.dval_rep = formatDebugValue(DVAL_REP); + this.dval_nfy = formatDebugValue(DVAL_NFY); + this.dval_err = formatDebugValue(DVAL_ERR); +} + +DebugProxy.prototype.determineCommandNumber = function (cmdString, cmdNumber) { + var ret; + if (typeof cmdString === 'string') { + ret = debugCommandNumbers[cmdString]; + } + ret = ret || cmdNumber; + if (typeof ret !== 'number') { + throw Error('cannot figure out command number for "' + cmdString + '" (' + cmdNumber + ')'); + } + return ret; +}; + +DebugProxy.prototype.commandNumberToString = function (id) { + return debugCommandNames[id] || String(id); +}; + +DebugProxy.prototype.formatDvalues = function (args) { + if (!args) { + return []; + } + return args.map(function (v) { + return formatDebugValue(v); + }); +}; + +DebugProxy.prototype.writeJson = function (val) { + this.socket.write(JSON.stringify(val) + '\n'); +}; + +DebugProxy.prototype.writeJsonSafe = function (val) { + try { + this.writeJson(val); + } catch (e) { + console.log('Failed to write JSON in writeJsonSafe, ignoring: ' + e); + } +}; + +DebugProxy.prototype.disconnectJsonClient = function () { + if (this.socket) { + this.socket.destroy(); + this.socket = null; + } +}; + +DebugProxy.prototype.disconnectTarget = function () { + if (this.inputParser) { + this.inputParser.close(); + this.inputParser = null; + } + if (this.targetStream) { + this.targetStream.destroy(); + this.targetStream = null; + } +}; + +DebugProxy.prototype.run = function () { + var _this = this; + + console.log('Waiting for client connections on port ' + this.serverPort); + this.server = net.createServer(function (socket) { + console.log('JSON proxy client connected'); + + _this.disconnectJsonClient(); + _this.disconnectTarget(); + + // A byline-parser is simple and good enough for now (assume + // compact JSON with no newlines). + var socketByline = byline(socket); + _this.socket = socket; + + socketByline.on('data', function (line) { + try { + // console.log('Received json proxy input line: ' + line.toString('utf8')); + var msg = JSON.parse(line.toString('utf8')); + var first_dval; + var args_dvalues = _this.formatDvalues(msg.args); + var last_dval = _this.dval_eom; + var cmd; + + if (msg.request) { + // "request" can be a string or "true" + first_dval = _this.dval_req; + cmd = _this.determineCommandNumber(msg.request, msg.command); + } else if (msg.reply) { + first_dval = _this.dval_rep; + } else if (msg.notify) { + // "notify" can be a string or "true" + first_dval = _this.dval_nfy; + cmd = _this.determineCommandNumber(msg.notify, msg.command); + } else if (msg.error) { + first_dval = _this.dval_err; + } else { + throw new Error('Invalid input JSON message: ' + JSON.stringify(msg)); + } + + _this.targetStream.write(first_dval); + if (cmd) { + _this.targetStream.write(formatDebugValue(cmd)); + } + args_dvalues.forEach(function (v) { + _this.targetStream.write(v); + }); + _this.targetStream.write(last_dval); + } catch (e) { + console.log(e); + + _this.writeJsonSafe({ + notify: '_Error', + args: [ 'Failed to handle input json message: ' + e ] + }); + + _this.disconnectJsonClient(); + _this.disconnectTarget(); + } + }); + + _this.connectToTarget(); + }).listen(this.serverPort); +}; + +DebugProxy.prototype.connectToTarget = function () { + var _this = this; + + console.log('Connecting to ' + optTargetHost + ':' + optTargetPort + '...'); + this.targetStream = new net.Socket(); + this.targetStream.connect(optTargetPort, optTargetHost, function () { + console.log('Debug transport connected'); + }); + + this.inputParser = new DebugProtocolParser( + this.targetStream, + null, + optDumpDebugRead, + optDumpDebugPretty, + optDumpDebugPretty ? 'Recv: ' : null, + null, + null // console logging is done at a higher level to match request/response + ); + + // Don't add a '_value' key to numbers. + this.inputParser.readableNumberValue = false; + + this.inputParser.on('transport-close', function () { + console.log('Debug transport closed'); + + _this.writeJsonSafe({ + notify: '_Disconnecting' + }); + + _this.disconnectJsonClient(); + _this.disconnectTarget(); + }); + + this.inputParser.on('transport-error', function (err) { + console.log('Debug transport error', err); + + _this.writeJsonSafe({ + notify: '_Error', + args: [ String(err) ] + }); + }); + + this.inputParser.on('protocol-version', function (msg) { + var ver = msg.protocolVersion; + console.log('Debug version identification:', msg.versionIdentification); + + _this.writeJson({ + notify: '_Connected', + args: [ msg.versionIdentification ] // raw identification string + }); + + if (ver !== 1) { + console.log('Protocol version ' + ver + ' unsupported, dropping connection'); + } + }); + + this.inputParser.on('debug-message', function (msg) { + var t; + + //console.log(msg); + + if (typeof msg[0] !== 'object' || msg[0] === null) { + throw new Error('unexpected initial dvalue: ' + msg[0]); + } else if (msg.type === 'eom') { + throw new Error('unexpected initial dvalue: ' + msg[0]); + } else if (msg.type === 'req') { + if (typeof msg[1] !== 'number') { + throw new Error('unexpected request command number: ' + msg[1]); + } + t = { + request: _this.commandNumberToString(msg[1]), + command: msg[1], + args: msg.slice(2, msg.length - 1) + } + _this.writeJson(t); + } else if (msg[0].type === 'rep') { + t = { + reply: true, + args: msg.slice(1, msg.length - 1) + } + _this.writeJson(t); + } else if (msg[0].type === 'err') { + t = { + error: true, + args: msg.slice(1, msg.length - 1) + } + _this.writeJson(t); + } else if (msg[0].type === 'nfy') { + if (typeof msg[1] !== 'number') { + throw new Error('unexpected notify command number: ' + msg[1]); + } + t = { + notify: _this.commandNumberToString(msg[1]), + command: msg[1], + args: msg.slice(2, msg.length - 1) + } + _this.writeJson(t); + } else { + throw new Error('unexpected initial dvalue: ' + msg[0]); + } + }); + + this.inputParser.on('stats-update', function () { + }); +}; + +/* + * Command line parsing and initialization + */ + +function main() { + console.log('((o) Duktape debugger'); + + // Parse arguments. + + var argv = require('minimist')(process.argv.slice(2)); + //console.dir(argv); + if (argv['target-host']) { + optTargetHost = argv['target-host']; + } + if (argv['target-port']) { + optTargetPort = argv['target-port']; + } + if (argv['http-port']) { + optHttpPort = argv['http-port']; + } + if (argv['json-proxy-port']) { + optJsonProxyPort = argv['json-proxy-port']; + } + if (argv['json-proxy']) { + optJsonProxy = argv['json-proxy']; + } + if (argv['source-dirs']) { + optSourceSearchDirs = argv['source-dirs'].split(path.delimiter); + } + if (argv['dump-debug-read']) { + optDumpDebugRead = argv['dump-debug-read']; + } + if (argv['dump-debug-write']) { + optDumpDebugWrite = argv['dump-debug-write']; + } + if (argv['dump-debug-pretty']) { + optDumpDebugPretty = argv['dump-debug-pretty']; + } + if (argv['log-messages']) { + optLogMessages = true; + } + + // Dump effective options. Also provides a list of option names. + + console.log(''); + console.log('Effective options:'); + console.log(' --target-host: ' + optTargetHost); + console.log(' --target-port: ' + optTargetPort); + console.log(' --http-port: ' + optHttpPort); + console.log(' --json-proxy-port: ' + optJsonProxyPort); + console.log(' --json-proxy: ' + optJsonProxy); + console.log(' --source-dirs: ' + optSourceSearchDirs.join(' ')); + console.log(' --dump-debug-read: ' + optDumpDebugRead); + console.log(' --dump-debug-write: ' + optDumpDebugWrite); + console.log(' --dump-debug-pretty: ' + optDumpDebugPretty); + console.log(' --log-messages: ' + optLogMessages); + console.log(''); + + // Create debugger and web UI singletons, tie them together and + // start them. + + if (optJsonProxy) { + console.log('Starting in JSON proxy mode, JSON port: ' + optJsonProxyPort); + + var prx = new DebugProxy(optJsonProxyPort); + prx.run(); + } else { + var dbg = new Debugger(); + var web = new DebugWebServer(); + dbg.web = web; + web.dbg = dbg; + dbg.run(); + web.run(); + } +} + +main(); diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_debugcommands.yaml b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_debugcommands.yaml new file mode 100644 index 00000000..0d4501c9 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_debugcommands.yaml @@ -0,0 +1,36 @@ +# Debug command names. A single map works for now because command names +# provided by client/target don't overlap. +- Reserved_0 +- Status +- Print +- Alert +- Log +- Gc +- Reserved_6 +- Reserved_7 +- Reserved_8 +- Reserved_9 +- Reserved_10 +- Reserved_11 +- Reserved_12 +- Reserved_13 +- Reserved_14 +- Reserved_15 +- BasicInfo +- TriggerStatus +- Pause +- Resume +- StepInto +- StepOver +- StepOut +- ListBreak +- AddBreak +- DelBreak +- GetVar +- PutVar +- GetCallStack +- GetLocals +- Eval +- Detach +- DumpHeap +- GetBytecode diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_opcodes.yaml b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_opcodes.yaml new file mode 100644 index 00000000..a82ac8ca --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/duk_opcodes.yaml @@ -0,0 +1,660 @@ +# Duktape opcode metadata for debugger. +# - See duk_debug.js for the argument formats (A_R etc). +# - Flag bits are for the whole instruction as a 32-bit integer, +# they are not field shifted +# +# NOTE: Use YAML comments only on comment-only lines (not trailing content): +# Node.js 'yamljs' seems to refuse parsing trailing comments in some cases. + +opcodes: + - name: LDREG + args: + - A_R + - BC_R + - name: STREG + args: + - A_R + - BC_R + - name: LDCONST + args: + - A_R + - BC_C + - name: LDINT + args: + - A_R + - BC_LDINT + - name: LDINTX + args: + - A_R + - BC_LDINTX + - name: MPUTOBJ + args: + - A_R + - B_R + - C_I + - name: MPUTOBJI + args: + - A_R + - B_RI + - C_I + - name: MPUTARR + args: + - A_R + - B_R + - C_I + - name: MPUTARRI + args: + - A_R + - B_RI + - C_I + - name: NEW + args: + - B_R + - C_I + - name: NEWI + args: + - B_RI + - C_I + - name: REGEXP + args: + - A_R + - B_RC + - C_RC + - name: CSREG + args: + - A_R + - B_R + - name: CSREGI + args: + - A_RI + - B_R + - name: GETVAR + args: + - A_R + - BC_C + - name: PUTVAR + args: + - A_R + - BC_C + - name: DECLVAR + args: + - A_H + - B_RC + - C_RC + flags: + - mask: 0x40 + name: writable + - mask: 0x80 + name: enumerable + - mask: 0x100 + name: configurable + - mask: 0x200 + name: accessor + - mask: 0x400 + name: undef_value + - mask: 0x800 + name: func_decl + - name: DELVAR + args: + - A_R + - B_RC + - name: CSVAR + args: + - A_R + - B_RC + - name: CSVARI + args: + - A_RI + - B_RC + - name: CLOSURE + args: + - A_R + - BC_I + - name: GETPROP + args: + - A_R + - B_RC + - C_RC + - name: PUTPROP + args: + - A_R + - B_RC + - C_RC + - name: DELPROP + args: + - A_R + - B_R + - C_RC + - name: CSPROP + args: + - A_R + - B_R + - C_RC + - name: CSPROPI + args: + - A_RI + - B_R + - C_RC + - name: ADD + args: + - A_R + - B_RC + - C_RC + - name: SUB + args: + - A_R + - B_RC + - C_RC + - name: MUL + args: + - A_R + - B_RC + - C_RC + - name: DIV + args: + - A_R + - B_RC + - C_RC + - name: MOD + args: + - A_R + - B_RC + - C_RC + - name: BAND + args: + - A_R + - B_RC + - C_RC + - name: BOR + args: + - A_R + - B_RC + - C_RC + - name: BXOR + args: + - A_R + - B_RC + - C_RC + - name: BASL + args: + - A_R + - B_RC + - C_RC + - name: BLSR + args: + - A_R + - B_RC + - C_RC + - name: BASR + args: + - A_R + - B_RC + - C_RC + - name: EQ + args: + - A_R + - B_RC + - C_RC + - name: NEQ + args: + - A_R + - B_RC + - C_RC + - name: SEQ + args: + - A_R + - B_RC + - C_RC + - name: SNEQ + args: + - A_R + - B_RC + - C_RC + - name: GT + args: + - A_R + - B_RC + - C_RC + - name: GE + args: + - A_R + - B_RC + - C_RC + - name: LT + args: + - A_R + - B_RC + - C_RC + - name: LE + args: + - A_R + - B_RC + - C_RC + - name: IF + args: + - A_B + - B_RC + - name: JUMP + args: + - ABC_JUMP + - name: RETURN + args: + - A_H + - B_RC + flags: + - mask: 0x40 + name: fast_return + - mask: 0x80 + name: have_retval + - name: CALL + args: + - A_H + - B_R + - C_I + flags: + - mask: 0x40 + name: tailcall + - mask: 0x80 + name: evalcall + - name: CALLI + args: + - A_H + - B_RI + - C_I + - name: TRYCATCH + args: + - A_H + # base register for two consecutive regs (base_reg + 0, base_reg + 1) used for two things: + # - input: either 'with' target register or catch varname constant (base_reg + 0), depending on flags + # - output: when caught, catch value (base_reg + 0) and type (base_reg + 1) + - BC_R + flags: + - mask: 0x40 + name: have_catch + - mask: 0x80 + name: have_finally + - mask: 0x100 + name: catch_binding + - mask: 0x200 + name: with_binding + - name: EXTRA + extra: true + - name: PREINCR + args: + - A_R + - BC_R + - name: PREDECR + args: + - A_R + - BC_R + - name: POSTINCR + args: + - A_R + - BC_R + - name: POSTDECR + args: + - A_R + - BC_R + - name: PREINCV + args: + - A_R + - BC_C + - name: PREDECV + args: + - A_R + - BC_C + - name: POSTINCV + args: + - A_R + - BC_C + - name: POSTDECV + args: + - A_R + - BC_C + - name: PREINCP + args: + - A_R + - B_RC + - C_RC + - name: PREDECP + args: + - A_R + - B_RC + - C_RC + - name: POSTINCP + args: + - A_R + - B_RC + - C_RC + - name: POSTDECP + args: + - A_R + - B_RC + - C_RC + +extra: + - name: NOP + - name: INVALID + args: + - BC_I + - name: LDTHIS + args: + - BC_R + - name: LDUNDEF + args: + - BC_R + - name: LDNULL + args: + - BC_R + - name: LDTRUE + args: + - BC_R + - name: LDFALSE + args: + - BC_R + - name: NEWOBJ + args: + # XXX: extend to BC? + - B_R + - name: NEWARR + args: + # XXX: extend to BC? + - B_R + - name: SETALEN + args: + - B_R + - C_R + - name: TYPEOF + args: + - BC_R + - name: TYPEOFID + args: + - B_R + # maybe changed to C_C later + - C_RC + - name: INITENUM + args: + - B_R + - C_R + - name: NEXTENUM + args: + - B_R + - C_R + - name: INITSET + args: + - B_R + - C_R + - name: INITSETI + args: + - B_R + - C_RI + - name: INITGET + args: + - B_R + - C_RI + - name: INITGETI + args: + - B_R + - C_RI + - name: ENDTRY + - name: ENDCATCH + - name: ENDFIN + - name: THROW + args: + - BC_R + - name: INVLHS + - name: UNM + args: + - BC_R + - name: UNP + args: + - BC_R + - name: DEBUGGER + - name: BREAK + args: + - BC_I + - name: CONTINUE + args: + - BC_I + - name: BNOT + args: + - BC_R + - name: LNOT + args: + - BC_R + - name: INSTOF + args: + - B_R + - C_RC + - name: IN + args: + - B_R + - C_RC + - name: LABEL + args: + - BC_I + - name: ENDLABEL + args: + - BC_I + - name: EXTRA34 + - name: EXTRA35 + - name: EXTRA36 + - name: EXTRA37 + - name: EXTRA38 + - name: EXTRA39 + - name: EXTRA40 + - name: EXTRA41 + - name: EXTRA42 + - name: EXTRA43 + - name: EXTRA44 + - name: EXTRA45 + - name: EXTRA46 + - name: EXTRA47 + - name: EXTRA48 + - name: EXTRA49 + - name: EXTRA50 + - name: EXTRA51 + - name: EXTRA52 + - name: EXTRA53 + - name: EXTRA54 + - name: EXTRA55 + - name: EXTRA56 + - name: EXTRA57 + - name: EXTRA58 + - name: EXTRA59 + - name: EXTRA60 + - name: EXTRA61 + - name: EXTRA62 + - name: EXTRA63 + - name: EXTRA64 + - name: EXTRA65 + - name: EXTRA66 + - name: EXTRA67 + - name: EXTRA68 + - name: EXTRA69 + - name: EXTRA70 + - name: EXTRA71 + - name: EXTRA72 + - name: EXTRA73 + - name: EXTRA74 + - name: EXTRA75 + - name: EXTRA76 + - name: EXTRA77 + - name: EXTRA78 + - name: EXTRA79 + - name: EXTRA80 + - name: EXTRA81 + - name: EXTRA82 + - name: EXTRA83 + - name: EXTRA84 + - name: EXTRA85 + - name: EXTRA86 + - name: EXTRA87 + - name: EXTRA88 + - name: EXTRA89 + - name: EXTRA90 + - name: EXTRA91 + - name: EXTRA92 + - name: EXTRA93 + - name: EXTRA94 + - name: EXTRA95 + - name: EXTRA96 + - name: EXTRA97 + - name: EXTRA98 + - name: EXTRA99 + - name: EXTRA100 + - name: EXTRA101 + - name: EXTRA102 + - name: EXTRA103 + - name: EXTRA104 + - name: EXTRA105 + - name: EXTRA106 + - name: EXTRA107 + - name: EXTRA108 + - name: EXTRA109 + - name: EXTRA110 + - name: EXTRA111 + - name: EXTRA112 + - name: EXTRA113 + - name: EXTRA114 + - name: EXTRA115 + - name: EXTRA116 + - name: EXTRA117 + - name: EXTRA118 + - name: EXTRA119 + - name: EXTRA120 + - name: EXTRA121 + - name: EXTRA122 + - name: EXTRA123 + - name: EXTRA124 + - name: EXTRA125 + - name: EXTRA126 + - name: EXTRA127 + - name: EXTRA128 + - name: EXTRA129 + - name: EXTRA130 + - name: EXTRA131 + - name: EXTRA132 + - name: EXTRA133 + - name: EXTRA134 + - name: EXTRA135 + - name: EXTRA136 + - name: EXTRA137 + - name: EXTRA138 + - name: EXTRA139 + - name: EXTRA140 + - name: EXTRA141 + - name: EXTRA142 + - name: EXTRA143 + - name: EXTRA144 + - name: EXTRA145 + - name: EXTRA146 + - name: EXTRA147 + - name: EXTRA148 + - name: EXTRA149 + - name: EXTRA150 + - name: EXTRA151 + - name: EXTRA152 + - name: EXTRA153 + - name: EXTRA154 + - name: EXTRA155 + - name: EXTRA156 + - name: EXTRA157 + - name: EXTRA158 + - name: EXTRA159 + - name: EXTRA160 + - name: EXTRA161 + - name: EXTRA162 + - name: EXTRA163 + - name: EXTRA164 + - name: EXTRA165 + - name: EXTRA166 + - name: EXTRA167 + - name: EXTRA168 + - name: EXTRA169 + - name: EXTRA170 + - name: EXTRA171 + - name: EXTRA172 + - name: EXTRA173 + - name: EXTRA174 + - name: EXTRA175 + - name: EXTRA176 + - name: EXTRA177 + - name: EXTRA178 + - name: EXTRA179 + - name: EXTRA180 + - name: EXTRA181 + - name: EXTRA182 + - name: EXTRA183 + - name: EXTRA184 + - name: EXTRA185 + - name: EXTRA186 + - name: EXTRA187 + - name: EXTRA188 + - name: EXTRA189 + - name: EXTRA190 + - name: EXTRA191 + - name: EXTRA192 + - name: EXTRA193 + - name: EXTRA194 + - name: EXTRA195 + - name: EXTRA196 + - name: EXTRA197 + - name: EXTRA198 + - name: EXTRA199 + - name: EXTRA200 + - name: EXTRA201 + - name: EXTRA202 + - name: EXTRA203 + - name: EXTRA204 + - name: EXTRA205 + - name: EXTRA206 + - name: EXTRA207 + - name: EXTRA208 + - name: EXTRA209 + - name: EXTRA210 + - name: EXTRA211 + - name: EXTRA212 + - name: EXTRA213 + - name: EXTRA214 + - name: EXTRA215 + - name: EXTRA216 + - name: EXTRA217 + - name: EXTRA218 + - name: EXTRA219 + - name: EXTRA220 + - name: EXTRA221 + - name: EXTRA222 + - name: EXTRA223 + - name: EXTRA224 + - name: EXTRA225 + - name: EXTRA226 + - name: EXTRA227 + - name: EXTRA228 + - name: EXTRA229 + - name: EXTRA230 + - name: EXTRA231 + - name: EXTRA232 + - name: EXTRA233 + - name: EXTRA234 + - name: EXTRA235 + - name: EXTRA236 + - name: EXTRA237 + - name: EXTRA238 + - name: EXTRA239 + - name: EXTRA240 + - name: EXTRA241 + - name: EXTRA242 + - name: EXTRA243 + - name: EXTRA244 + - name: EXTRA245 + - name: EXTRA246 + - name: EXTRA247 + - name: EXTRA248 + - name: EXTRA249 + - name: EXTRA250 + - name: EXTRA251 + - name: EXTRA252 + - name: EXTRA253 + - name: EXTRA254 + - name: EXTRA255 diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/debugger/package.json b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/package.json new file mode 100644 index 00000000..96165744 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/package.json @@ -0,0 +1,27 @@ +{ + "name": "duk-debug", + "version": "0.1.0", + "description": "Duktape debugger", + "author": { + "name": "Sami Vaarala", + "email": "sami.vaarala@iki.fi" + }, + "dependencies": { + "bluebird": "~2.6.4", + "minimist": "~1.1.0", + "express": "~4.10.1", + "body-parser": "~1.9.3", + "socket.io": "~1.2.1", + "utf8": "~2.0.0", + "wrench": "~1.5.8", + "sprintf": "~0.1.5", + "events": "~1.0.2", + "stream": "0.0.2", + "readline": "0.0.5", + "util": "~0.10.3", + "http": "0.0.0", + "yamljs": "~0.2.1", + "byline": "~4.2.1" + }, + "main": "duk_debug.js" +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/debugger/static/index.html b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/static/index.html new file mode 100644 index 00000000..5e5e2e05 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/static/index.html @@ -0,0 +1,96 @@ + + + + + + + +Duktape debugger + + + +

+((o) Duktape debugger +
+ +
+ +
+ + + + + +
+
+
+
+ + + + + +
+ +
+

+// No source loaded
+
+
+
+ +
+
+
?
+
?
?
+
+
+
(output from script, print() and alert() calls)
+
+
+ +
+
+
(callstack)
+
+
+
(locals)
+
+
+
(breakpoints)
+
+
+ watch (eval on pause) +
+ +
+
+
+ +
+ + + +
+

Duktape debugger is a web UI for debugging Ecmascript on a target device.

+

This web UI talks to a NodeJS debug server using socket.io. +The debug server talks to the target device using the Duktape debug protocol +(see debugger.rst).

+
+ +
+

+
+ + + + + + + diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/debugger/static/style.css b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/static/style.css new file mode 100644 index 00000000..ce8d34f6 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/static/style.css @@ -0,0 +1,512 @@ +// http://stackoverflow.com/questions/71074/how-to-remove-firefoxs-dotted-outline-on-buttons-as-well-as-links/3844452#3844452 +:focus { + outline: none; +} +::-moz-focus-inner { + border: 0; +} + +@keyframes pulsate { + from { opacity: 1; } + to { opacity: 0.25; } +} + +#part-header { + background: #444444; + color: #ffffff; + font: 24pt monospace; + border-bottom: 2px solid #cccccc; + padding: 20px 0px 20px 10px; +} + +/* http://css-tricks.com/snippets/css/a-guide-to-flexbox/ */ +#part-middle { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: space-between; + align-items: stretch; + align-content: stretch; + + min-height: 800px; + + border-top: 1px solid #ffffff; + padding: 8px; + margin-top: 2px; +} +#left-area { + flex: 0 0 11em; + margin-right: 20px; + margin-bottom: 10px; +} +#center-area { + flex: 1 1 0; + margin-bottom: 10px; +} +#right-area { + flex: 0 0 40em; + margin-left: 20px; + margin-bottom: 10px; +} + +#part-footer { + clear: both; + border-top: 2px solid #bbbbbb; + background: #eeeeee; + color: #555555; + text-align: center; + padding-top: 12px; + padding-bottom: 12px; + line-height: 1.5; +} + +#exec-status { + margin-top: 25px; + margin-bottom: 25px; +} +#exec-state { + display: inline-block; + vertical-align: middle; +} +#exec-other { + display: inline-block; + vertical-align: middle; + font-size: 125%; +} +#current-state { + background: #228822; + color: #ffffff; + font: 16pt; + padding: 6pt; + border: 5px solid #228822; + border-radius: 10px; + font-size: 200%; + font-weight: bold; + margin-right: 10px; +} +#current-state.notrunning { + background: #882222; + border: 5px solid #882222; + border-radius: 10px; + animation: pulsate 0.7s cubic-bezier(0.75, 0, 0.75, 1) infinite alternate; +} +#exec-other:hover { + text-decoration: underline; + color: #9999ff; +} + +#left-area button { + display: inline-block; + width: 100%; + min-width: 8em; + background: #226622; + color: #ffffff; + font: 16pt sans-serif; + font-weight: bold; + text-decoration: none; + margin: 10px 0 0 0; + padding: 0.4em; + border: 2px solid #000000; + border-radius: 4px; +} +#left-area button a { + color: #ffffff; + text-decoration: none; +} +#left-area button:hover { + background: #55aa55; +} +#left-area button:disabled { + background: #555555; + color: #888888; +} +#left-area button:disabled a { + background: #555555; + color: #888888; +} + +#pause-button.pending { + background: #5555ff; + animation: pulsate 0.2s cubic-bezier(0.75, 0, 0.75, 1) infinite alternate; +} + +#attach-button { +} +#attach-button.enabled { + animation: pulsate 0.7s cubic-bezier(0.75, 0, 0.75, 1) infinite alternate; +} + +.duktape-exec-line { + outline: 2px solid red; + background: #550000; +} +.duktape-break-line { + outline: 2px solid white; +} + +#output { + font: 9pt monospace; + color: #000000; + border: 2px solid #cccccc; + border-radius: 5px; + padding: 3px; + height: 30ex; + overflow: scroll; + overflow-x: auto; + overflow-y: scroll; + white-space: pre; +} +#output .alert { + color: #ff0000; +} +/* Default color (should be overridden by level) */ +#output .log { + color: #00ff00; +} +/* Trace */ +#output .loglevel0 { + color: #cccccc; +} +/* Debug */ +#output .loglevel1 { + color: #cccccc; +} +/* Info */ +#output .loglevel2 { + color: #888888; + font-weight: bold; +} +/* Warn */ +#output .loglevel3 { + color: #ff4444; + font-weight: bold; +} +/* Error */ +#output .loglevel4 { + color: #ff0000; + font-weight: bold; +} +/* Fatal */ +#output .loglevel5 { + background: #000000; + color: #ff0000; + font-weight: bold; +} +#output .debugger-info { + color: #880000; + font-weight: bold; + font-style: italic; +} +#output .debugger-debug { + color: #888888; + font-weight: bold; + font-style: italic; +} + +#callstack { + font: 9pt monospace; + color: #000000; + margin-top: 10px; + border: 2px solid #cccccc; + border-radius: 5px; + padding: 3px; + height: 14ex; + overflow: scroll; + overflow-x: auto; + overflow-y: scroll; + white-space: pre; +} +#callstack div:nth-child(2n) { + background: #eeeeee; +} +#callstack .func { +} +#callstack .rest { + float: right; + color: #6666ff; +} +#callstack .rest:hover { + text-decoration: underline; + color: #9999ff; +} + +#locals { + font: 9pt monospace; + color: #000000; + margin-top: 10px; + border: 2px solid #cccccc; + border-radius: 5px; + padding: 10px; + height: 30ex; + overflow: scroll; + overflow-x: auto; + overflow-y: scroll; + white-space: pre; +} +#locals div:nth-child(2n) { + background: #eeeeee; +} +#locals .key { +} +#locals .value { + float: right; + color: #888888; +} + +#breakpoints { + color: #000000; + margin-top: 10px; + border: 2px solid #cccccc; + border-radius: 5px; + padding: 3px; + height: 15ex; + overflow: scroll; + overflow-x: auto; + overflow-y: scroll; + white-space: pre; +} +#breakpoints div { + margin: 2px 0 2px 0; +} +#breakpoints div:nth-child(2n) { + background: #eeeeee; +} +#breakpoints a { + font: 9pt monospace; + color: #6666ff; +} +#breakpoints a:hover { + text-decoration: underline; + color: #9999ff; +} +.breakpoint-line { + clear: both; + padding-top: 2px; + padding-bottom: 2px; +} +#add-breakpoint-file { + font: 10pt monospace; + width: 10em; + padding: 5px; +} +#add-breakpoint-line { + font: 10pt monospace; + width: 3em; + margin-left: 3px; + padding: 5px; +} +#delete-all-breakpoints-button { + float: right; + font: 10pt sans-serif; + padding: 5px; + border: 1px solid #888888; + background: #ddffdd; + color: #000000; +} +#delete-all-breakpoints-button:hover { + background: #f8fff8; +} +#delete-all-breakpoints-button:disabled { + background: #dddddd; + color: #444444; +} +#add-breakpoint-button { + font: 10pt sans-serif; + margin-left: 10px; + padding: 5px; + border: 1px solid #888888; + background: #ddffdd; + color: #000000; +} +#add-breakpoint-button:hover { + background: #f8fff8; +} +#add-breakpoint-button:disabled { + background: #dddddd; + color: #444444; +} +#breakpoint-hint { + color: #aaaaaa; + font-style: italic; + margin-left: 10px; +} +.delete-breakpoint-button { + float: right; + display: inline; + font: 9pt sans-serif; + padding: 3px; + border: none; + background: none; + color: #6666ff; +} +.delete-breakpoint-button { + font: 9pt sans-serif; +} +.delete-breakpoint-button:hover { + text-decoration: underline; + color: #9999ff; +} +.delete-breakpoint-button:disabled { + color: #888888; +} + +#about-dialog p { + margin: 10px 0 10px 0; +} + +#bytecode-dialog p { + margin: 10px 0 10px 0; +} +#bytecode-dialog pre { + font: 14pt monospace; + color: #000000; +} + +#eval { + color: #000000; + margin-top: 10px; + border: 2px solid #cccccc; + border-radius: 5px; + padding: 3px; + height: 30ex; + overflow: scroll; + overflow-x: auto; + overflow-y: scroll; + white-space: pre; +} +#eval-input { + display: inline; + font: 10pt monospace; + width: 20em; + padding: 5px; +} +#eval-button { + display: inline; + margin-left: 10px; + padding: 5px; + border: 1px solid #888888; + font: 10pt sans-serif; + background: #ddffdd; + color: #000000; +} +#eval-button { +} +#eval-button:hover { + background: #f8fff8; +} +#eval-button:disabled { + background: #dddddd; + color: #444444; +} +#eval-button.pending { + background: #5555ff; + animation: pulsate 0.2s cubic-bezier(0.75, 0, 0.75, 1) infinite alternate; +} +#eval-watch { + margin-left: 20px; + vertical-align: middle; +} +#eval-output { + font: 10pt monospace; + white-space: pre; + padding: 5px; + border: 1px solid #888888; + min-height: 4ex; + margin-top: 5px; +} + +#varname-input { + font: 10pt monospace; + width: 10em; + padding: 5px; +} +#varvalue-input { + margin-left: 10px; + font: 10pt monospace; + width: 20em; + padding: 5px; +} +#getvar-button, +#putvar-button { + display: inline; + float: right; + margin-left: 10px; + padding: 5px; + border: 1px solid #888888; + font: 10pt sans-serif; + background: #ddffdd; + color: #000000; +} +#getvar-button:hover, +#putvar-button:hover { + background: #f8fff8; +} +#getvar-button:disabled, +#putvar-button:disabled { + background: #dddddd; + color: #444444; +} +#var-output { + font: 10pt monospace; + white-space: pre; + padding: 5px; + border: 1px solid #888888; + min-height: 4ex; + margin-top: 5px; +} + +#source-pre { + margin-top: 10px; + border: 2px solid #cccccc; + border-radius: 5px; + height: 400px; + overflow: scroll; + overflow-x: auto; + overflow-y: scroll; +} +#source-pre.running { + background: #eeeeee; + color: #888888; +} +#source-pre.running #source-code { + background: #eeeeee; + color: #888888; +} +#source-filename { + font-size: 125%; + color: #888888; +} +code.sourcecode { + counter-reset: source-line; +} +code.sourcecode div { + font: 10pt monospace; + padding: 2px 5px 2px 5px; + white-space: pre; + border-bottom: 1px solid #eeeeee; +} +code.sourcecode div:before { + display: inline-block; + content: counter(source-line); + counter-increment: source-line; + width: 4em; + color: #888888; + text-align: right; + margin-right: 20px; +} +code.sourcecode div.breakpoint:before { + margin-right: 0px; + border-right: 20px solid #ff0000; +} +code.sourcecode div.highlight { + background: #aaaaaa; + color: #000000; +} +code.sourcecode div.execution { + background: #000000; + color: #ffffff; +} + +#source-select { + margin-top: 5px; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/debugger/static/webui.js b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/static/webui.js new file mode 100644 index 00000000..e3e1cc11 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/debugger/static/webui.js @@ -0,0 +1,745 @@ +/* + * Duktape debugger web client + * + * Talks to the NodeJS server using socket.io. + * + * http://unixpapa.com/js/key.html + */ + +// Update interval for custom source highlighting. +var SOURCE_UPDATE_INTERVAL = 350; + +// Source view +var activeFileName = null; // file that we want to be loaded in source view +var activeLine = null; // scroll to line once file has been loaded +var activeHighlight = null; // line that we want to highlight (if any) +var loadedFileName = null; // currently loaded (shown) file +var loadedLineCount = 0; // currently loaded file line count +var loadedFileExecuting = false; // true if currFileName (loosely) matches loadedFileName +var loadedLinePending = null; // if set, scroll loaded file to requested line +var highlightLine = null; // highlight line +var sourceEditedLines = []; // line numbers which have been modified + // (added classes etc, tracked for removing) +var sourceUpdateInterval = null; // timer for updating source view +var sourceFetchXhr = null; // current AJAX request for fetching a source file (if any) +var forceButtonUpdate = false; // hack to reset button states + +// Execution state +var prevState = null; // previous execution state ('paused', 'running', etc) +var prevAttached = null; // previous debugger attached state (true, false, null) +var currFileName = null; // current filename being executed +var currFuncName = null; // current function name being executed +var currLine = 0; // current line being executed +var currPc = 0; // current bytecode PC being executed +var currState = 0; // current execution state ('paused', 'running', 'detached', etc) +var currAttached = false; // current debugger attached state (true or false) +var currLocals = []; // current local variables +var currCallstack = []; // current callstack (from top to bottom) +var currBreakpoints = []; // current breakpoints +var startedRunning = 0; // timestamp when last started running (if running) + // (used to grey out the source file if running for long enough) + +/* + * Helpers + */ + +function formatBytes(x) { + if (x < 1024) { + return String(x) + ' bytes'; + } else if (x < 1024 * 1024) { + return (x / 1024).toPrecision(3) + ' kB'; + } else { + return (x / (1024 * 1024)).toPrecision(3) + ' MB'; + } +} + +/* + * Source view periodic update handling + */ + +function doSourceUpdate() { + var elem; + + // Remove previously added custom classes + sourceEditedLines.forEach(function (linenum) { + elem = $('#source-code div')[linenum - 1]; + if (elem) { + elem.classList.remove('breakpoint'); + elem.classList.remove('execution'); + elem.classList.remove('highlight'); + } + }); + sourceEditedLines.length = 0; + + // If we're executing the file shown, highlight current line + if (loadedFileExecuting) { + elem = $('#source-code div')[currLine - 1]; + if (elem) { + sourceEditedLines.push(currLine); + elem.classList.add('execution'); + } + } + + // Add breakpoints + currBreakpoints.forEach(function (bp) { + if (bp.fileName === loadedFileName) { + elem = $('#source-code div')[bp.lineNumber - 1]; + if (elem) { + sourceEditedLines.push(bp.lineNumber); + elem.classList.add('breakpoint'); + } + } + }); + + if (highlightLine !== null) { + elem = $('#source-code div')[highlightLine - 1]; + if (elem) { + sourceEditedLines.push(highlightLine); + elem.classList.add('highlight'); + } + } + + // If no-one requested us to scroll to a specific line, finish. + if (loadedLinePending == null) { + return; + } + + var reqLine = loadedLinePending; + loadedLinePending = null; + + // Scroll to requested line. This is not very clean, so a better solution + // should be found: + // https://developer.mozilla.org/en-US/docs/Web/API/Element.scrollIntoView + // http://erraticdev.blogspot.fi/2011/02/jquery-scroll-into-view-plugin-with.html + // http://flesler.blogspot.fi/2007/10/jqueryscrollto.html + var tmpLine = Math.max(reqLine - 5, 0); + elem = $('#source-code div')[tmpLine]; + if (elem) { + elem.scrollIntoView(); + } +} + +// Source is updated periodically. Other code can also call doSourceUpdate() +// directly if an immediate update is needed. +sourceUpdateInterval = setInterval(doSourceUpdate, SOURCE_UPDATE_INTERVAL); + +/* + * UI update handling when exec-status update arrives + */ + +function doUiUpdate() { + var now = Date.now(); + + // Note: loadedFileName can be either from target or from server, but they + // must match exactly. We could do a loose match here, but exact matches + // are needed for proper breakpoint handling anyway. + loadedFileExecuting = (loadedFileName === currFileName); + + // If we just started running, store a timestamp so we can grey out the + // source view only if we execute long enough (i.e. we're not just + // stepping). + if (currState !== prevState && currState === 'running') { + startedRunning = now; + } + + // If we just became paused, check for eval watch + if (currState !== prevState && currState === 'paused') { + if ($('#eval-watch').is(':checked')) { + submitEval(); // don't clear eval input + } + } + + // Update current execution state + if (currFileName === '' && currLine === 0) { + $('#current-fileline').text(''); + } else { + $('#current-fileline').text(String(currFileName) + ':' + String(currLine)); + } + if (currFuncName === '' && currPc === 0) { + $('#current-funcpc').text(''); + } else { + $('#current-funcpc').text(String(currFuncName) + '() pc ' + String(currPc)); + } + $('#current-state').text(String(currState)); + + // Update buttons + if (currState !== prevState || currAttached !== prevAttached || forceButtonUpdate) { + $('#stepinto-button').prop('disabled', !currAttached || currState !== 'paused'); + $('#stepover-button').prop('disabled', !currAttached || currState !== 'paused'); + $('#stepout-button').prop('disabled', !currAttached || currState !== 'paused'); + $('#resume-button').prop('disabled', !currAttached || currState !== 'paused'); + $('#pause-button').prop('disabled', !currAttached || currState !== 'running'); + $('#attach-button').prop('disabled', currAttached); + if (currAttached) { + $('#attach-button').removeClass('enabled'); + } else { + $('#attach-button').addClass('enabled'); + } + $('#detach-button').prop('disabled', !currAttached); + $('#eval-button').prop('disabled', !currAttached); + $('#add-breakpoint-button').prop('disabled', !currAttached); + $('#delete-all-breakpoints-button').prop('disabled', !currAttached); + $('.delete-breakpoint-button').prop('disabled', !currAttached); + $('#putvar-button').prop('disabled', !currAttached); + $('#getvar-button').prop('disabled', !currAttached); + $('#heap-dump-download-button').prop('disabled', !currAttached); + } + if (currState !== 'running' || forceButtonUpdate) { + // Remove pending highlight once we're no longer running. + $('#pause-button').removeClass('pending'); + $('#eval-button').removeClass('pending'); + } + forceButtonUpdate = false; + + // Make source window grey when running for a longer time, use a small + // delay to avoid flashing grey when stepping. + if (currState === 'running' && now - startedRunning >= 500) { + $('#source-pre').removeClass('notrunning'); + $('#current-state').removeClass('notrunning'); + } else { + $('#source-pre').addClass('notrunning'); + $('#current-state').addClass('notrunning'); + } + + // Force source view to match currFileName only when running or when + // just became paused (from running or detached). + var fetchSource = false; + if (typeof currFileName === 'string') { + if (currState === 'running' || + (prevState !== 'paused' && currState === 'paused') || + (currAttached !== prevAttached)) { + if (activeFileName !== currFileName) { + fetchSource = true; + activeFileName = currFileName; + activeLine = currLine; + activeHighlight = null; + requestSourceRefetch(); + } + } + } + + // Force line update (scrollTop) only when running or just became paused. + // Otherwise let user browse and scroll source files freely. + if (!fetchSource) { + if ((prevState !== 'paused' && currState === 'paused') || + currState === 'running') { + loadedLinePending = currLine || 0; + } + } +} + +/* + * Init socket.io and add handlers + */ + +var socket = io(); // returns a Manager + +setInterval(function () { + socket.emit('keepalive', { + userAgent: (navigator || {}).userAgent + }); +}, 30000); + +socket.on('connect', function () { + $('#socketio-info').text('connected'); + currState = 'connected'; + + fetchSourceList(); +}); +socket.on('disconnect', function () { + $('#socketio-info').text('not connected'); + currState = 'disconnected'; +}); +socket.on('reconnecting', function () { + $('#socketio-info').text('reconnecting'); + currState = 'reconnecting'; +}); +socket.on('error', function (err) { + $('#socketio-info').text(err); +}); + +socket.on('replaced', function () { + // XXX: how to minimize the chance we'll further communciate with the + // server or reconnect to it? socket.reconnection()? + + // We'd like to window.close() here but can't (not allowed from scripts). + // Alert is the next best thing. + alert('Debugger connection replaced by a new one, do you have multiple tabs open? If so, please close this tab.'); +}); + +socket.on('keepalive', function (msg) { + // Not really interesting in the UI + // $('#server-info').text(new Date() + ': ' + JSON.stringify(msg)); +}); + +socket.on('basic-info', function (msg) { + $('#duk-version').text(String(msg.duk_version)); + $('#duk-git-describe').text(String(msg.duk_git_describe)); + $('#target-info').text(String(msg.target_info)); + $('#endianness').text(String(msg.endianness)); +}); + +socket.on('exec-status', function (msg) { + currFileName = msg.fileName; + currFuncName = msg.funcName; + currLine = msg.line; + currPc = msg.pc; + currState = msg.state; + currAttached = msg.attached; + + // Duktape now restricts execution status updates quite effectively so + // there's no need to rate limit UI updates now. + + doUiUpdate(); + + prevState = currState; + prevAttached = currAttached; +}); + +// Update the "console" output based on lines sent by the server. The server +// rate limits these updates to keep the browser load under control. Even +// better would be for the client to pull this (and other stuff) on its own. +socket.on('output-lines', function (msg) { + var elem = $('#output'); + var i, n, ent; + + elem.empty(); + for (i = 0, n = msg.length; i < n; i++) { + ent = msg[i]; + if (ent.type === 'print') { + elem.append($('
').text(ent.message)); + } else if (ent.type === 'alert') { + elem.append($('
').text(ent.message)); + } else if (ent.type === 'log') { + elem.append($('
').text(ent.message)); + } else if (ent.type === 'debugger-info') { + elem.append($('
').text(ent.message)); + } else if (ent.type === 'debugger-debug') { + elem.append($('
').text(ent.message)); + } else { + elem.append($('
').text(ent.message)); + } + } + + // http://stackoverflow.com/questions/14918787/jquery-scroll-to-bottom-of-div-even-after-it-updates + // Stop queued animations so that we always scroll quickly to bottom + $('#output').stop(true); + $('#output').animate({ scrollTop: $('#output')[0].scrollHeight}, 1000); +}); + +socket.on('callstack', function (msg) { + var elem = $('#callstack'); + var s1, s2, div; + + currCallstack = msg.callstack; + + elem.empty(); + msg.callstack.forEach(function (e) { + s1 = $('').text(e.fileName + ':' + e.lineNumber + ' (pc ' + e.pc + ')'); // float + s1.on('click', function () { + activeFileName = e.fileName; + activeLine = e.lineNumber || 1; + activeHighlight = activeLine; + requestSourceRefetch(); + }); + s2 = $('').text(e.funcName + '()'); + div = $('
'); + div.append(s1); + div.append(s2); + elem.append(div); + }); +}); + +socket.on('locals', function (msg) { + var elem = $('#locals'); + var s1, s2, div; + var i, n, e; + + currLocals = msg.locals; + + elem.empty(); + for (i = 0, n = msg.locals.length; i < n; i++) { + e = msg.locals[i]; + s1 = $('').text(e.value); // float + s2 = $('').text(e.key); + div = $('
'); + div.append(s1); + div.append(s2); + elem.append(div); + } +}); + +socket.on('debug-stats', function (msg) { + $('#debug-rx-bytes').text(formatBytes(msg.rxBytes)); + $('#debug-rx-dvalues').text(msg.rxDvalues); + $('#debug-rx-messages').text(msg.rxMessages); + $('#debug-rx-kbrate').text((msg.rxBytesPerSec / 1024).toFixed(2)); + $('#debug-tx-bytes').text(formatBytes(msg.txBytes)); + $('#debug-tx-dvalues').text(msg.txDvalues); + $('#debug-tx-messages').text(msg.txMessages); + $('#debug-tx-kbrate').text((msg.txBytesPerSec / 1024).toFixed(2)); +}); + +socket.on('breakpoints', function (msg) { + var elem = $('#breakpoints'); + var div; + var sub; + + currBreakpoints = msg.breakpoints; + + elem.empty(); + + // First line is special + div = $('
'); + sub = $('').text('Delete all breakpoints'); + sub.on('click', function () { + socket.emit('delete-all-breakpoints'); + }); + div.append(sub); + sub = $('').val('file.js'); + div.append(sub); + sub = $('').text(':'); + div.append(sub); + sub = $('').val('123'); + div.append(sub); + sub = $('').text('Add breakpoint'); + sub.on('click', function () { + socket.emit('add-breakpoint', { + fileName: $('#add-breakpoint-file').val(), + lineNumber: Number($('#add-breakpoint-line').val()) + }); + }); + div.append(sub); + sub = $('').text('or dblclick source'); + div.append(sub); + elem.append(div); + + // Active breakpoints follow + msg.breakpoints.forEach(function (bp) { + var div; + var sub; + + div = $('
'); + sub = $('').text('Delete'); + sub.on('click', function () { + socket.emit('delete-breakpoint', { + fileName: bp.fileName, + lineNumber: bp.lineNumber + }); + }); + div.append(sub); + sub = $('').text((bp.fileName || '?') + ':' + (bp.lineNumber || 0)); + sub.on('click', function () { + activeFileName = bp.fileName || ''; + activeLine = bp.lineNumber || 1; + activeHighlight = activeLine; + requestSourceRefetch(); + }); + div.append(sub); + elem.append(div); + }); + + forceButtonUpdate = true; + doUiUpdate(); +}); + +socket.on('eval-result', function (msg) { + $('#eval-output').text((msg.error ? 'ERROR: ' : '') + msg.result); + + // Remove eval button "pulsating" glow when we get a result + $('#eval-button').removeClass('pending'); +}); + +socket.on('getvar-result', function (msg) { + $('#var-output').text(msg.found ? msg.result : 'NOTFOUND'); +}); + +socket.on('bytecode', function (msg) { + $('#bytecode-preformatted').text(msg.preformatted); + $('#bytecode-dialog').dialog('open'); +}); + +$('#stepinto-button').click(function () { + socket.emit('stepinto', {}); +}); + +$('#stepover-button').click(function () { + socket.emit('stepover', {}); +}); + +$('#stepout-button').click(function () { + socket.emit('stepout', {}); +}); + +$('#pause-button').click(function () { + socket.emit('pause', {}); + + // Pause may take seconds to complete so indicate it is pending. + $('#pause-button').addClass('pending'); +}); + +$('#resume-button').click(function () { + socket.emit('resume', {}); +}); + +$('#attach-button').click(function () { + socket.emit('attach', {}); +}); + +$('#detach-button').click(function () { + socket.emit('detach', {}); +}); + +$('#about-button').click(function () { + $('#about-dialog').dialog('open'); +}); + +$('#show-bytecode-button').click(function () { + socket.emit('get-bytecode', {}); +}); + +function submitEval() { + socket.emit('eval', { input: $('#eval-input').val() }); + + // Eval may take seconds to complete so indicate it is pending. + $('#eval-button').addClass('pending'); +} + +$('#eval-button').click(function () { + submitEval(); + $('#eval-input').val(''); +}); + +$('#getvar-button').click(function () { + socket.emit('getvar', { varname: $('#varname-input').val() }); +}); + +$('#putvar-button').click(function () { + // The variable value is parsed as JSON right now, but it'd be better to + // also be able to parse buffer values etc. + var val = JSON.parse($('#varvalue-input').val()); + socket.emit('putvar', { varname: $('#varname-input').val(), varvalue: val }); +}); + +$('#source-code').dblclick(function (event) { + var target = event.target; + var elems = $('#source-code div'); + var i, n; + var line = 0; + + // XXX: any faster way; elems doesn't have e.g. indexOf() + for (i = 0, n = elems.length; i < n; i++) { + if (target === elems[i]) { + line = i + 1; + } + } + + socket.emit('toggle-breakpoint', { + fileName: loadedFileName, + lineNumber: line + }); +}); + +function setSourceText(data) { + var elem, div; + + elem = $('#source-code'); + elem.empty(); + data.split('\n').forEach(function (line) { + div = $('
'); + div.text(line); + elem.append(div); + }); + + sourceEditedLines = []; +} + +function setSourceSelect(fileName) { + var elem; + var i, n, t; + + if (fileName == null) { + $('#source-select').val('__none__'); + return; + } + + elem = $('#source-select option'); + for (i = 0, n = elem.length; i < n; i++) { + // Exact match is required. + t = $(elem[i]).val(); + if (t === fileName) { + $('#source-select').val(t); + return; + } + } +} + +/* + * AJAX request handling to fetch source files + */ + +function requestSourceRefetch() { + // If previous update is pending, abort and start a new one. + if (sourceFetchXhr) { + sourceFetchXhr.abort(); + sourceFetchXhr = null; + } + + // Make copies of the requested file/line so that we have the proper + // values in case they've changed. + var fileName = activeFileName; + var lineNumber = activeLine; + + // AJAX request for the source. + sourceFetchXhr = $.ajax({ + type: 'POST', + url: '/source', + data: JSON.stringify({ fileName: fileName }), + contentType: 'application/json', + success: function (data, status, jqxhr) { + var elem; + + sourceFetchXhr = null; + + loadedFileName = fileName; + loadedLineCount = data.split('\n').length; // XXX: ignore issue with last empty line for now + loadedFileExecuting = (loadedFileName === currFileName); + setSourceText(data); + setSourceSelect(fileName); + loadedLinePending = activeLine || 1; + highlightLine = activeHighlight; // may be null + activeLine = null; + activeHighlight = null; + doSourceUpdate(); + + // XXX: hacky transition, make source change visible + $('#source-pre').fadeTo('fast', 0.25, function () { + $('#source-pre').fadeTo('fast', 1.0); + }); + }, + error: function (jqxhr, status, err) { + // Not worth alerting about because source fetch errors happen + // all the time, e.g. for dynamically evaluated code. + + sourceFetchXhr = null; + + // XXX: prevent retry of no-such-file by negative caching? + loadedFileName = fileName; + loadedLineCount = 1; + loadedFileExecuting = false; + setSourceText('// Cannot load source file: ' + fileName); + setSourceSelect(null); + loadedLinePending = 1; + activeLine = null; + activeHighlight = null; + doSourceUpdate(); + + // XXX: error transition here + $('#source-pre').fadeTo('fast', 0.25, function () { + $('#source-pre').fadeTo('fast', 1.0); + }); + }, + dataType: 'text' + }); +} + +/* + * AJAX request for fetching the source list + */ + +function fetchSourceList() { + $.ajax({ + type: 'POST', + url: '/sourceList', + data: JSON.stringify({}), + contentType: 'application/json', + success: function (data, status, jqxhr) { + var elem = $('#source-select'); + + data = JSON.parse(data); + + elem.empty(); + var opt = $('').attr({ 'value': '__none__' }).text('No source file selected'); + elem.append(opt); + data.forEach(function (ent) { + var opt = $('').attr({ 'value': ent }).text(ent); + elem.append(opt); + }); + elem.change(function () { + activeFileName = elem.val(); + activeLine = 1; + requestSourceRefetch(); + }); + }, + error: function (jqxhr, status, err) { + // This is worth alerting about as the UI is somewhat unusable + // if we don't get a source list. + + alert('Failed to load source list: ' + err); + }, + dataType: 'text' + }); +} + +/* + * Initialization + */ + +$(document).ready(function () { + var showAbout = true; + + // About dialog, shown automatically on first startup. + $('#about-dialog').dialog({ + autoOpen: false, + hide: 'fade', // puff + show: 'fade', // slide, puff + width: 500, + height: 300 + }); + + // Bytecode dialog + $('#bytecode-dialog').dialog({ + autoOpen: false, + hide: 'fade', // puff + show: 'fade', // slide, puff + width: 1000, + height: 800 + }); + + // http://diveintohtml5.info/storage.html + if (typeof localStorage !== 'undefined') { + if (localStorage.getItem('about-shown')) { + showAbout = false; + } else { + localStorage.setItem('about-shown', 'yes'); + } + } + if (showAbout) { + $('#about-dialog').dialog('open'); + } + + // onclick handler for exec status text + function loadCurrFunc() { + activeFileName = currFileName; + activeLine = currLine; + requestSourceRefetch(); + } + $('#exec-other').on('click', loadCurrFunc); + + // Enter handling for eval input + // https://forum.jquery.com/topic/bind-html-input-to-enter-key-keypress + $('#eval-input').keypress(function (event) { + if (event.keyCode == 13) { + submitEval(); + $('#eval-input').val(''); + } + }); + + // Eval watch handling + $('#eval-watch').change(function () { + // nop + }); + + forceButtonUpdate = true; + doUiUpdate(); +}); diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/duk_build_meta.json b/3P/civetweb/src/third_party/duktape-1.3.0/duk_build_meta.json new file mode 100644 index 00000000..faf177a5 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/duk_build_meta.json @@ -0,0 +1,838 @@ +{ + "builtin_strings": [ + "Logger", + "Thread", + "Pointer", + "DecEnv", + "ObjEnv", + "Float64Array", + "Float32Array", + "Uint32Array", + "Int32Array", + "Uint16Array", + "Int16Array", + "Uint8ClampedArray", + "Uint8Array", + "Int8Array", + "DataView", + "ArrayBuffer", + "Buffer", + "", + "global", + "Arguments", + "JSON", + "Math", + "Error", + "RegExp", + "Date", + "Number", + "Boolean", + "String", + "Array", + "Function", + "Object", + "Null", + "Undefined", + "{_func:true}", + "{\"_func\":true}", + "{\"_ninf\":true}", + "{\"_inf\":true}", + "{\"_nan\":true}", + "{\"_undef\":true}", + "toLogString", + "clog", + "l", + "n", + "fatal", + "error", + "warn", + "debug", + "trace", + "raw", + "fmt", + "current", + "resume", + "compact", + "jc", + "jx", + "base64", + "hex", + "dec", + "enc", + "fin", + "gc", + "act", + "info", + "version", + "env", + "modLoaded", + "modSearch", + "errThrow", + "errCreate", + "compile", + "\u0000Regbase", + "\u0000Thread", + "\u0000Handler", + "\u0000Finalizer", + "\u0000Callee", + "\u0000Map", + "\u0000Args", + "\u0000This", + "\u0000Pc2line", + "\u0000Source", + "\u0000Varenv", + "\u0000Lexenv", + "\u0000Varmap", + "\u0000Formals", + "\u0000Bytecode", + "\u0000Next", + "\u0000Target", + "\u0000Value", + "pointer", + "\u0000Tracedata", + "lineNumber", + "fileName", + "pc", + "stack", + "ThrowTypeError", + "Duktape", + "setFloat64", + "setFloat32", + "setUint32", + "setInt32", + "setUint16", + "setInt16", + "setUint8", + "setInt8", + "getFloat64", + "getFloat32", + "getUint32", + "getInt32", + "getUint16", + "getInt16", + "getUint8", + "getInt8", + "subarray", + "BYTES_PER_ELEMENT", + "byteOffset", + "buffer", + "isView", + "data", + "type", + "writeIntBE", + "writeIntLE", + "writeUIntBE", + "writeUIntLE", + "writeDoubleBE", + "writeDoubleLE", + "writeFloatBE", + "writeFloatLE", + "writeInt32BE", + "writeInt32LE", + "writeUInt32BE", + "writeUInt32LE", + "writeInt16BE", + "writeInt16LE", + "writeUInt16BE", + "writeUInt16LE", + "writeInt8", + "writeUInt8", + "readIntBE", + "readIntLE", + "readUIntBE", + "readUIntLE", + "readDoubleBE", + "readDoubleLE", + "readFloatBE", + "readFloatLE", + "readInt32BE", + "readInt32LE", + "readUInt32BE", + "readUInt32LE", + "readInt16BE", + "readInt16LE", + "readUInt16BE", + "readUInt16LE", + "readInt8", + "readUInt8", + "copy", + "equals", + "fill", + "write", + "compare", + "byteLength", + "isBuffer", + "isEncoding", + "exports", + "id", + "require", + "__proto__", + "setPrototypeOf", + "ownKeys", + "enumerate", + "deleteProperty", + "has", + "Proxy", + "callee", + "Invalid Date", + "[...]", + "\n\t", + " ", + ",", + "-0", + "+0", + "0", + "-Infinity", + "+Infinity", + "Infinity", + "object", + "string", + "number", + "boolean", + "undefined", + "stringify", + "tan", + "sqrt", + "sin", + "round", + "random", + "pow", + "min", + "max", + "log", + "floor", + "exp", + "cos", + "ceil", + "atan2", + "atan", + "asin", + "acos", + "abs", + "SQRT2", + "SQRT1_2", + "PI", + "LOG10E", + "LOG2E", + "LN2", + "LN10", + "E", + "message", + "name", + "input", + "index", + "(?:)", + "lastIndex", + "multiline", + "ignoreCase", + "source", + "test", + "exec", + "toGMTString", + "setYear", + "getYear", + "toJSON", + "toISOString", + "toUTCString", + "setUTCFullYear", + "setFullYear", + "setUTCMonth", + "setMonth", + "setUTCDate", + "setDate", + "setUTCHours", + "setHours", + "setUTCMinutes", + "setMinutes", + "setUTCSeconds", + "setSeconds", + "setUTCMilliseconds", + "setMilliseconds", + "setTime", + "getTimezoneOffset", + "getUTCMilliseconds", + "getMilliseconds", + "getUTCSeconds", + "getSeconds", + "getUTCMinutes", + "getMinutes", + "getUTCHours", + "getHours", + "getUTCDay", + "getDay", + "getUTCDate", + "getDate", + "getUTCMonth", + "getMonth", + "getUTCFullYear", + "getFullYear", + "getTime", + "toLocaleTimeString", + "toLocaleDateString", + "toTimeString", + "toDateString", + "now", + "UTC", + "parse", + "toPrecision", + "toExponential", + "toFixed", + "POSITIVE_INFINITY", + "NEGATIVE_INFINITY", + "NaN", + "MIN_VALUE", + "MAX_VALUE", + "substr", + "trim", + "toLocaleUpperCase", + "toUpperCase", + "toLocaleLowerCase", + "toLowerCase", + "substring", + "split", + "search", + "replace", + "match", + "localeCompare", + "charCodeAt", + "charAt", + "fromCharCode", + "reduceRight", + "reduce", + "filter", + "map", + "forEach", + "some", + "every", + "lastIndexOf", + "indexOf", + "unshift", + "splice", + "sort", + "slice", + "shift", + "reverse", + "push", + "pop", + "join", + "concat", + "isArray", + "arguments", + "caller", + "bind", + "call", + "apply", + "propertyIsEnumerable", + "isPrototypeOf", + "hasOwnProperty", + "valueOf", + "toLocaleString", + "toString", + "constructor", + "set", + "get", + "enumerable", + "configurable", + "writable", + "value", + "keys", + "isExtensible", + "isFrozen", + "isSealed", + "preventExtensions", + "freeze", + "seal", + "defineProperties", + "defineProperty", + "create", + "getOwnPropertyNames", + "getOwnPropertyDescriptor", + "getPrototypeOf", + "prototype", + "length", + "alert", + "print", + "unescape", + "escape", + "encodeURIComponent", + "encodeURI", + "decodeURIComponent", + "decodeURI", + "isFinite", + "isNaN", + "parseFloat", + "parseInt", + "eval", + "URIError", + "TypeError", + "SyntaxError", + "ReferenceError", + "RangeError", + "EvalError", + "break", + "case", + "catch", + "continue", + "debugger", + "default", + "delete", + "do", + "else", + "finally", + "for", + "function", + "if", + "in", + "instanceof", + "new", + "return", + "switch", + "this", + "throw", + "try", + "typeof", + "var", + "void", + "while", + "with", + "class", + "const", + "enum", + "export", + "extends", + "import", + "super", + "null", + "true", + "false", + "implements", + "interface", + "let", + "package", + "private", + "protected", + "public", + "static", + "yield" + ], + "builtin_strings_base64": [ + "TG9nZ2Vy", + "VGhyZWFk", + "UG9pbnRlcg==", + "RGVjRW52", + "T2JqRW52", + "RmxvYXQ2NEFycmF5", + "RmxvYXQzMkFycmF5", + "VWludDMyQXJyYXk=", + "SW50MzJBcnJheQ==", + "VWludDE2QXJyYXk=", + "SW50MTZBcnJheQ==", + "VWludDhDbGFtcGVkQXJyYXk=", + "VWludDhBcnJheQ==", + "SW50OEFycmF5", + "RGF0YVZpZXc=", + "QXJyYXlCdWZmZXI=", + "QnVmZmVy", + "", + "Z2xvYmFs", + "QXJndW1lbnRz", + "SlNPTg==", + "TWF0aA==", + "RXJyb3I=", + "UmVnRXhw", + "RGF0ZQ==", + "TnVtYmVy", + "Qm9vbGVhbg==", + "U3RyaW5n", + "QXJyYXk=", + "RnVuY3Rpb24=", + "T2JqZWN0", + "TnVsbA==", + "VW5kZWZpbmVk", + "e19mdW5jOnRydWV9", + "eyJfZnVuYyI6dHJ1ZX0=", + "eyJfbmluZiI6dHJ1ZX0=", + "eyJfaW5mIjp0cnVlfQ==", + "eyJfbmFuIjp0cnVlfQ==", + "eyJfdW5kZWYiOnRydWV9", + "dG9Mb2dTdHJpbmc=", + "Y2xvZw==", + "bA==", + "bg==", + "ZmF0YWw=", + "ZXJyb3I=", + "d2Fybg==", + "ZGVidWc=", + "dHJhY2U=", + "cmF3", + "Zm10", + "Y3VycmVudA==", + "cmVzdW1l", + "Y29tcGFjdA==", + "amM=", + "ang=", + "YmFzZTY0", + "aGV4", + "ZGVj", + "ZW5j", + "Zmlu", + "Z2M=", + "YWN0", + "aW5mbw==", + "dmVyc2lvbg==", + "ZW52", + "bW9kTG9hZGVk", + "bW9kU2VhcmNo", + "ZXJyVGhyb3c=", + "ZXJyQ3JlYXRl", + "Y29tcGlsZQ==", + "/1JlZ2Jhc2U=", + "/1RocmVhZA==", + "/0hhbmRsZXI=", + "/0ZpbmFsaXplcg==", + "/0NhbGxlZQ==", + "/01hcA==", + "/0FyZ3M=", + "/1RoaXM=", + "/1BjMmxpbmU=", + "/1NvdXJjZQ==", + "/1ZhcmVudg==", + "/0xleGVudg==", + "/1Zhcm1hcA==", + "/0Zvcm1hbHM=", + "/0J5dGVjb2Rl", + "/05leHQ=", + "/1RhcmdldA==", + "/1ZhbHVl", + "cG9pbnRlcg==", + "/1RyYWNlZGF0YQ==", + "bGluZU51bWJlcg==", + "ZmlsZU5hbWU=", + "cGM=", + "c3RhY2s=", + "VGhyb3dUeXBlRXJyb3I=", + "RHVrdGFwZQ==", + "c2V0RmxvYXQ2NA==", + "c2V0RmxvYXQzMg==", + "c2V0VWludDMy", + "c2V0SW50MzI=", + "c2V0VWludDE2", + "c2V0SW50MTY=", + "c2V0VWludDg=", + "c2V0SW50OA==", + "Z2V0RmxvYXQ2NA==", + "Z2V0RmxvYXQzMg==", + "Z2V0VWludDMy", + "Z2V0SW50MzI=", + "Z2V0VWludDE2", + "Z2V0SW50MTY=", + "Z2V0VWludDg=", + "Z2V0SW50OA==", + "c3ViYXJyYXk=", + "QllURVNfUEVSX0VMRU1FTlQ=", + "Ynl0ZU9mZnNldA==", + "YnVmZmVy", + "aXNWaWV3", + "ZGF0YQ==", + "dHlwZQ==", + "d3JpdGVJbnRCRQ==", + "d3JpdGVJbnRMRQ==", + "d3JpdGVVSW50QkU=", + "d3JpdGVVSW50TEU=", + "d3JpdGVEb3VibGVCRQ==", + "d3JpdGVEb3VibGVMRQ==", + "d3JpdGVGbG9hdEJF", + "d3JpdGVGbG9hdExF", + "d3JpdGVJbnQzMkJF", + "d3JpdGVJbnQzMkxF", + "d3JpdGVVSW50MzJCRQ==", + "d3JpdGVVSW50MzJMRQ==", + "d3JpdGVJbnQxNkJF", + "d3JpdGVJbnQxNkxF", + "d3JpdGVVSW50MTZCRQ==", + "d3JpdGVVSW50MTZMRQ==", + "d3JpdGVJbnQ4", + "d3JpdGVVSW50OA==", + "cmVhZEludEJF", + "cmVhZEludExF", + "cmVhZFVJbnRCRQ==", + "cmVhZFVJbnRMRQ==", + "cmVhZERvdWJsZUJF", + "cmVhZERvdWJsZUxF", + "cmVhZEZsb2F0QkU=", + "cmVhZEZsb2F0TEU=", + "cmVhZEludDMyQkU=", + "cmVhZEludDMyTEU=", + "cmVhZFVJbnQzMkJF", + "cmVhZFVJbnQzMkxF", + "cmVhZEludDE2QkU=", + "cmVhZEludDE2TEU=", + "cmVhZFVJbnQxNkJF", + "cmVhZFVJbnQxNkxF", + "cmVhZEludDg=", + "cmVhZFVJbnQ4", + "Y29weQ==", + "ZXF1YWxz", + "ZmlsbA==", + "d3JpdGU=", + "Y29tcGFyZQ==", + "Ynl0ZUxlbmd0aA==", + "aXNCdWZmZXI=", + "aXNFbmNvZGluZw==", + "ZXhwb3J0cw==", + "aWQ=", + "cmVxdWlyZQ==", + "X19wcm90b19f", + "c2V0UHJvdG90eXBlT2Y=", + "b3duS2V5cw==", + "ZW51bWVyYXRl", + "ZGVsZXRlUHJvcGVydHk=", + "aGFz", + "UHJveHk=", + "Y2FsbGVl", + "SW52YWxpZCBEYXRl", + "Wy4uLl0=", + "Cgk=", + "IA==", + "LA==", + "LTA=", + "KzA=", + "MA==", + "LUluZmluaXR5", + "K0luZmluaXR5", + "SW5maW5pdHk=", + "b2JqZWN0", + "c3RyaW5n", + "bnVtYmVy", + "Ym9vbGVhbg==", + "dW5kZWZpbmVk", + "c3RyaW5naWZ5", + "dGFu", + "c3FydA==", + "c2lu", + "cm91bmQ=", + "cmFuZG9t", + "cG93", + "bWlu", + "bWF4", + "bG9n", + "Zmxvb3I=", + "ZXhw", + "Y29z", + "Y2VpbA==", + "YXRhbjI=", + "YXRhbg==", + "YXNpbg==", + "YWNvcw==", + "YWJz", + "U1FSVDI=", + "U1FSVDFfMg==", + "UEk=", + "TE9HMTBF", + "TE9HMkU=", + "TE4y", + "TE4xMA==", + "RQ==", + "bWVzc2FnZQ==", + "bmFtZQ==", + "aW5wdXQ=", + "aW5kZXg=", + "KD86KQ==", + "bGFzdEluZGV4", + "bXVsdGlsaW5l", + "aWdub3JlQ2FzZQ==", + "c291cmNl", + "dGVzdA==", + "ZXhlYw==", + "dG9HTVRTdHJpbmc=", + "c2V0WWVhcg==", + "Z2V0WWVhcg==", + "dG9KU09O", + "dG9JU09TdHJpbmc=", + "dG9VVENTdHJpbmc=", + "c2V0VVRDRnVsbFllYXI=", + "c2V0RnVsbFllYXI=", + "c2V0VVRDTW9udGg=", + "c2V0TW9udGg=", + "c2V0VVRDRGF0ZQ==", + "c2V0RGF0ZQ==", + "c2V0VVRDSG91cnM=", + "c2V0SG91cnM=", + "c2V0VVRDTWludXRlcw==", + "c2V0TWludXRlcw==", + "c2V0VVRDU2Vjb25kcw==", + "c2V0U2Vjb25kcw==", + "c2V0VVRDTWlsbGlzZWNvbmRz", + "c2V0TWlsbGlzZWNvbmRz", + "c2V0VGltZQ==", + "Z2V0VGltZXpvbmVPZmZzZXQ=", + "Z2V0VVRDTWlsbGlzZWNvbmRz", + "Z2V0TWlsbGlzZWNvbmRz", + "Z2V0VVRDU2Vjb25kcw==", + "Z2V0U2Vjb25kcw==", + "Z2V0VVRDTWludXRlcw==", + "Z2V0TWludXRlcw==", + "Z2V0VVRDSG91cnM=", + "Z2V0SG91cnM=", + "Z2V0VVRDRGF5", + "Z2V0RGF5", + "Z2V0VVRDRGF0ZQ==", + "Z2V0RGF0ZQ==", + "Z2V0VVRDTW9udGg=", + "Z2V0TW9udGg=", + "Z2V0VVRDRnVsbFllYXI=", + "Z2V0RnVsbFllYXI=", + "Z2V0VGltZQ==", + "dG9Mb2NhbGVUaW1lU3RyaW5n", + "dG9Mb2NhbGVEYXRlU3RyaW5n", + "dG9UaW1lU3RyaW5n", + "dG9EYXRlU3RyaW5n", + "bm93", + "VVRD", + "cGFyc2U=", + "dG9QcmVjaXNpb24=", + "dG9FeHBvbmVudGlhbA==", + "dG9GaXhlZA==", + "UE9TSVRJVkVfSU5GSU5JVFk=", + "TkVHQVRJVkVfSU5GSU5JVFk=", + "TmFO", + "TUlOX1ZBTFVF", + "TUFYX1ZBTFVF", + "c3Vic3Ry", + "dHJpbQ==", + "dG9Mb2NhbGVVcHBlckNhc2U=", + "dG9VcHBlckNhc2U=", + "dG9Mb2NhbGVMb3dlckNhc2U=", + "dG9Mb3dlckNhc2U=", + "c3Vic3RyaW5n", + "c3BsaXQ=", + "c2VhcmNo", + "cmVwbGFjZQ==", + "bWF0Y2g=", + "bG9jYWxlQ29tcGFyZQ==", + "Y2hhckNvZGVBdA==", + "Y2hhckF0", + "ZnJvbUNoYXJDb2Rl", + "cmVkdWNlUmlnaHQ=", + "cmVkdWNl", + "ZmlsdGVy", + "bWFw", + "Zm9yRWFjaA==", + "c29tZQ==", + "ZXZlcnk=", + "bGFzdEluZGV4T2Y=", + "aW5kZXhPZg==", + "dW5zaGlmdA==", + "c3BsaWNl", + "c29ydA==", + "c2xpY2U=", + "c2hpZnQ=", + "cmV2ZXJzZQ==", + "cHVzaA==", + "cG9w", + "am9pbg==", + "Y29uY2F0", + "aXNBcnJheQ==", + "YXJndW1lbnRz", + "Y2FsbGVy", + "YmluZA==", + "Y2FsbA==", + "YXBwbHk=", + "cHJvcGVydHlJc0VudW1lcmFibGU=", + "aXNQcm90b3R5cGVPZg==", + "aGFzT3duUHJvcGVydHk=", + "dmFsdWVPZg==", + "dG9Mb2NhbGVTdHJpbmc=", + "dG9TdHJpbmc=", + "Y29uc3RydWN0b3I=", + "c2V0", + "Z2V0", + "ZW51bWVyYWJsZQ==", + "Y29uZmlndXJhYmxl", + "d3JpdGFibGU=", + "dmFsdWU=", + "a2V5cw==", + "aXNFeHRlbnNpYmxl", + "aXNGcm96ZW4=", + "aXNTZWFsZWQ=", + "cHJldmVudEV4dGVuc2lvbnM=", + "ZnJlZXpl", + "c2VhbA==", + "ZGVmaW5lUHJvcGVydGllcw==", + "ZGVmaW5lUHJvcGVydHk=", + "Y3JlYXRl", + "Z2V0T3duUHJvcGVydHlOYW1lcw==", + "Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9y", + "Z2V0UHJvdG90eXBlT2Y=", + "cHJvdG90eXBl", + "bGVuZ3Ro", + "YWxlcnQ=", + "cHJpbnQ=", + "dW5lc2NhcGU=", + "ZXNjYXBl", + "ZW5jb2RlVVJJQ29tcG9uZW50", + "ZW5jb2RlVVJJ", + "ZGVjb2RlVVJJQ29tcG9uZW50", + "ZGVjb2RlVVJJ", + "aXNGaW5pdGU=", + "aXNOYU4=", + "cGFyc2VGbG9hdA==", + "cGFyc2VJbnQ=", + "ZXZhbA==", + "VVJJRXJyb3I=", + "VHlwZUVycm9y", + "U3ludGF4RXJyb3I=", + "UmVmZXJlbmNlRXJyb3I=", + "UmFuZ2VFcnJvcg==", + "RXZhbEVycm9y", + "YnJlYWs=", + "Y2FzZQ==", + "Y2F0Y2g=", + "Y29udGludWU=", + "ZGVidWdnZXI=", + "ZGVmYXVsdA==", + "ZGVsZXRl", + "ZG8=", + "ZWxzZQ==", + "ZmluYWxseQ==", + "Zm9y", + "ZnVuY3Rpb24=", + "aWY=", + "aW4=", + "aW5zdGFuY2VvZg==", + "bmV3", + "cmV0dXJu", + "c3dpdGNo", + "dGhpcw==", + "dGhyb3c=", + "dHJ5", + "dHlwZW9m", + "dmFy", + "dm9pZA==", + "d2hpbGU=", + "d2l0aA==", + "Y2xhc3M=", + "Y29uc3Q=", + "ZW51bQ==", + "ZXhwb3J0", + "ZXh0ZW5kcw==", + "aW1wb3J0", + "c3VwZXI=", + "bnVsbA==", + "dHJ1ZQ==", + "ZmFsc2U=", + "aW1wbGVtZW50cw==", + "aW50ZXJmYWNl", + "bGV0", + "cGFja2FnZQ==", + "cHJpdmF0ZQ==", + "cHJvdGVjdGVk", + "cHVibGlj", + "c3RhdGlj", + "eWllbGQ=" + ], + "comment": "Metadata for Duktape build", + "duk_version": 10300, + "duk_version_string": "1.3.0", + "git_describe": "v1.3.0" +} \ No newline at end of file diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/README.rst new file mode 100644 index 00000000..f2544328 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/README.rst @@ -0,0 +1,10 @@ +================ +Duktape examples +================ + +Examples for using Duktape. These support user documentation and are +intended as informative illustrations only. + +Examples are unmaintained and are not production quality code. Bugs are +not not necessarily fixed, unless the bug makes the example misleading +as documentation. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-hybrid/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-hybrid/README.rst new file mode 100644 index 00000000..ed63a13c --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-hybrid/README.rst @@ -0,0 +1,10 @@ +===================== +Hybrid pool allocator +===================== + +Example allocator that tries to satisfy memory allocations for small sizes +from a set of fixed pools, but always falls back to malloc/realloc/free if +a larger size is requested or the pools have been exhausted. + +This may be useful to reduce memory churn when the platform allocator does +not handle allocations for a lot of small memory areas efficiently. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-hybrid/duk_alloc_hybrid.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-hybrid/duk_alloc_hybrid.c new file mode 100644 index 00000000..9235b857 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-hybrid/duk_alloc_hybrid.c @@ -0,0 +1,293 @@ +/* + * Example memory allocator with pool allocation for small sizes and + * fallback into malloc/realloc/free for larger sizes or when the pools + * are exhausted. + * + * Useful to reduce memory churn or work around a platform allocator + * that doesn't handle a lot of small allocations efficiently. + */ + +#include "duktape.h" +#include +#include +#include +#include + +/* Define to enable some debug printfs. */ +/* #define DUK_ALLOC_HYBRID_DEBUG */ + +typedef struct { + size_t size; + int count; +} pool_size_spec; + +static pool_size_spec pool_sizes[] = { + { 32, 1024 }, + { 48, 2048 }, + { 64, 2048 }, + { 128, 2048 }, + { 256, 512 }, + { 1024, 64 }, + { 2048, 32 } +}; + +#define NUM_POOLS (sizeof(pool_sizes) / sizeof(pool_size_spec)) + +/* This must fit into the smallest pool entry. */ +struct pool_free_entry; +typedef struct pool_free_entry pool_free_entry; +struct pool_free_entry { + pool_free_entry *next; +}; + +typedef struct { + pool_free_entry *free; + char *alloc_start; + char *alloc_end; + size_t size; + int count; +} pool_header; + +typedef struct { + pool_header headers[NUM_POOLS]; + size_t pool_max_size; + char *alloc_start; + char *alloc_end; +} pool_state; + +#define ADDR_IN_STATE_ALLOC(st,p) \ + ((char *) (p) >= (st)->alloc_start && (char *) (p) < (st)->alloc_end) +#define ADDR_IN_HEADER_ALLOC(hdr,p) \ + ((char *) (p) >= (hdr)->alloc_start && (char *) (p) < (hdr)->alloc_end) + +#ifdef DUK_ALLOC_HYBRID_DEBUG +static void dump_pool_state(pool_state *st) { + pool_free_entry *free; + int free_len; + int i; + + printf("=== Pool state: st=%p\n", (void *) st); + for (i = 0; i < (int) NUM_POOLS; i++) { + pool_header *hdr = st->headers + i; + + for (free = hdr->free, free_len = 0; free != NULL; free = free->next) { + free_len++; + } + + printf("[%d]: size %ld, count %ld, used %ld, free list len %ld\n", + i, (long) hdr->size, (long) hdr->count, + (long) (hdr->count - free_len), + (long) free_len); + } +} +#else +static void dump_pool_state(pool_state *st) { + (void) st; +} +#endif + +void *duk_alloc_hybrid_init(void) { + pool_state *st; + size_t total_size, max_size; + int i, j; + char *p; + + st = (pool_state *) malloc(sizeof(pool_state)); + if (!st) { + return NULL; + } + memset((void *) st, 0, sizeof(pool_state)); + st->alloc_start = NULL; + st->alloc_end = NULL; + + for (i = 0, total_size = 0, max_size = 0; i < (int) NUM_POOLS; i++) { +#ifdef DUK_ALLOC_HYBRID_DEBUG + printf("Pool %d: size %ld, count %ld\n", i, (long) pool_sizes[i].size, (long) pool_sizes[i].count); +#endif + total_size += pool_sizes[i].size * pool_sizes[i].count; + if (pool_sizes[i].size > max_size) { + max_size = pool_sizes[i].size; + } + } +#ifdef DUK_ALLOC_HYBRID_DEBUG + printf("Total size %ld, max pool size %ld\n", (long) total_size, (long) max_size); +#endif + + st->alloc_start = (char *) malloc(total_size); + if (!st->alloc_start) { + free(st); + return NULL; + } + st->alloc_end = st->alloc_start + total_size; + st->pool_max_size = max_size; + memset((void *) st->alloc_start, 0, total_size); + + for (i = 0, p = st->alloc_start; i < (int) NUM_POOLS; i++) { + pool_header *hdr = st->headers + i; + + hdr->alloc_start = p; + hdr->alloc_end = p + pool_sizes[i].size * pool_sizes[i].count; + hdr->free = (pool_free_entry *) (void *) p; + hdr->size = pool_sizes[i].size; + hdr->count = pool_sizes[i].count; + + for (j = 0; j < pool_sizes[i].count; j++) { + pool_free_entry *ent = (pool_free_entry *) (void *) p; + if (j == pool_sizes[i].count - 1) { + ent->next = (pool_free_entry *) NULL; + } else { + ent->next = (pool_free_entry *) (void *) (p + pool_sizes[i].size); + } + p += pool_sizes[i].size; + } + } + + dump_pool_state(st); + + /* Use 'st' as udata. */ + return (void *) st; +} + +void *duk_alloc_hybrid(void *udata, duk_size_t size) { + pool_state *st = (pool_state *) udata; + int i; + void *new_ptr; + +#if 0 + dump_pool_state(st); +#endif + + if (size == 0) { + return NULL; + } + if (size > st->pool_max_size) { +#ifdef DUK_ALLOC_HYBRID_DEBUG + printf("alloc fallback: %ld\n", (long) size); +#endif + return malloc(size); + } + + for (i = 0; i < (int) NUM_POOLS; i++) { + pool_header *hdr = st->headers + i; + if (hdr->size < size) { + continue; + } + + if (hdr->free) { +#if 0 + printf("alloc from pool: %ld -> pool size %ld\n", (long) size, (long) hdr->size); +#endif + new_ptr = (void *) hdr->free; + hdr->free = hdr->free->next; + return new_ptr; + } else { +#ifdef DUK_ALLOC_HYBRID_DEBUG + printf("alloc out of pool entries: %ld -> pool size %ld\n", (long) size, (long) hdr->size); +#endif + break; + } + } + +#ifdef DUK_ALLOC_HYBRID_DEBUG + printf("alloc fallback (out of pool): %ld\n", (long) size); +#endif + return malloc(size); +} + +void *duk_realloc_hybrid(void *udata, void *ptr, duk_size_t size) { + pool_state *st = (pool_state *) udata; + void *new_ptr; + int i; + +#if 0 + dump_pool_state(st); +#endif + + if (ADDR_IN_STATE_ALLOC(st, ptr)) { + /* 'ptr' cannot be NULL. */ + for (i = 0; i < (int) NUM_POOLS; i++) { + pool_header *hdr = st->headers + i; + if (ADDR_IN_HEADER_ALLOC(hdr, ptr)) { + if (size <= hdr->size) { + /* Still fits, no shrink support. */ +#if 0 + printf("realloc original from pool: still fits, size %ld, pool size %ld\n", + (long) size, (long) hdr->size); +#endif + return ptr; + } + + new_ptr = duk_alloc_hybrid(udata, size); + if (!new_ptr) { +#ifdef DUK_ALLOC_HYBRID_DEBUG + printf("realloc original from pool: needed larger size, failed to alloc\n"); +#endif + return NULL; + } + memcpy(new_ptr, ptr, hdr->size); + + ((pool_free_entry *) ptr)->next = hdr->free; + hdr->free = (pool_free_entry *) ptr; +#if 0 + printf("realloc original from pool: size %ld, pool size %ld\n", (long) size, (long) hdr->size); +#endif + return new_ptr; + } + } +#ifdef DUK_ALLOC_HYBRID_DEBUG + printf("NEVER HERE\n"); +#endif + return NULL; + } else if (ptr != NULL) { + if (size == 0) { + free(ptr); + return NULL; + } else { +#ifdef DUK_ALLOC_HYBRID_DEBUG + printf("realloc fallback: size %ld\n", (long) size); +#endif + return realloc(ptr, size); + } + } else { +#if 0 + printf("realloc NULL ptr, call alloc: %ld\n", (long) size); +#endif + return duk_alloc_hybrid(udata, size); + } +} + +void duk_free_hybrid(void *udata, void *ptr) { + pool_state *st = (pool_state *) udata; + int i; + +#if 0 + dump_pool_state(st); +#endif + + if (!ADDR_IN_STATE_ALLOC(st, ptr)) { + if (ptr == NULL) { + return; + } +#if 0 + printf("free out of pool: %p\n", (void *) ptr); +#endif + free(ptr); + return; + } + + for (i = 0; i < (int) NUM_POOLS; i++) { + pool_header *hdr = st->headers + i; + if (ADDR_IN_HEADER_ALLOC(hdr, ptr)) { + ((pool_free_entry *) ptr)->next = hdr->free; + hdr->free = (pool_free_entry *) ptr; +#if 0 + printf("free from pool: %p\n", ptr); +#endif + return; + } + } + +#ifdef DUK_ALLOC_HYBRID_DEBUG + printf("NEVER HERE\n"); +#endif +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-hybrid/duk_alloc_hybrid.h b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-hybrid/duk_alloc_hybrid.h new file mode 100644 index 00000000..0d631d1d --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-hybrid/duk_alloc_hybrid.h @@ -0,0 +1,11 @@ +#ifndef DUK_ALLOC_HYBRID_H_INCLUDED +#define DUK_ALLOC_HYBRID_H_INCLUDED + +#include "duktape.h" + +void *duk_alloc_hybrid_init(void); +void *duk_alloc_hybrid(void *udata, duk_size_t size); +void *duk_realloc_hybrid(void *udata, void *ptr, duk_size_t size); +void duk_free_hybrid(void *udata, void *ptr); + +#endif /* DUK_ALLOC_HYBRID_H_INCLUDED */ diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/README.rst new file mode 100644 index 00000000..97c1a32a --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/README.rst @@ -0,0 +1,7 @@ +====================== +Allocator with logging +====================== + +Example allocator that writes all memory alloc/realloc/free calls into a +log file so that memory usage can replayed later. This is useful to e.g. +optimize pool sizes. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/duk_alloc_logging.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/duk_alloc_logging.c new file mode 100644 index 00000000..86fecc56 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/duk_alloc_logging.c @@ -0,0 +1,138 @@ +/* + * Example memory allocator with machine parseable logging. + * + * Also sizes for reallocs and frees are logged so that the memory + * behavior can be essentially replayed to accurately determine e.g. + * optimal pool sizes for a pooled allocator. + * + * Allocation structure: + * + * [ alloc_hdr | user area ] + * + * ^ ^ + * | `--- pointer returned to Duktape + * `--- underlying malloc ptr + */ + +#include "duktape.h" +#include +#include +#include +#include + +#define ALLOC_LOG_FILE "/tmp/duk-alloc-log.txt" + +typedef struct { + /* The double value in the union is there to ensure alignment is + * good for IEEE doubles too. In many 32-bit environments 4 bytes + * would be sufficiently aligned and the double value is unnecessary. + */ + union { + size_t sz; + double d; + } u; +} alloc_hdr; + +static FILE *log_file = NULL; + +static void write_log(const char *fmt, ...) { + va_list ap; + + if (!log_file) { + log_file = fopen(ALLOC_LOG_FILE, "wb"); + if (!log_file) { + return; + } + } + + va_start(ap, fmt); + vfprintf(log_file, fmt, ap); + va_end(ap); +} + +void *duk_alloc_logging(void *udata, duk_size_t size) { + alloc_hdr *hdr; + void *ret; + + (void) udata; /* Suppress warning. */ + + if (size == 0) { + write_log("A NULL %ld\n", (long) size); + return NULL; + } + + hdr = (alloc_hdr *) malloc(size + sizeof(alloc_hdr)); + if (!hdr) { + write_log("A FAIL %ld\n", (long) size); + return NULL; + } + hdr->u.sz = size; + ret = (void *) (hdr + 1); + write_log("A %p %ld\n", ret, (long) size); + return ret; +} + +void *duk_realloc_logging(void *udata, void *ptr, duk_size_t size) { + alloc_hdr *hdr; + size_t old_size; + void *t; + void *ret; + + (void) udata; /* Suppress warning. */ + + /* Handle the ptr-NULL vs. size-zero cases explicitly to minimize + * platform assumptions. You can get away with much less in specific + * well-behaving environments. + */ + + if (ptr) { + hdr = (alloc_hdr *) (void *) ((unsigned char *) ptr - sizeof(alloc_hdr)); + old_size = hdr->u.sz; + + if (size == 0) { + free((void *) hdr); + write_log("R %p %ld NULL 0\n", ptr, (long) old_size); + return NULL; + } else { + t = realloc((void *) hdr, size + sizeof(alloc_hdr)); + if (!t) { + write_log("R %p %ld FAIL %ld\n", ptr, (long) old_size, (long) size); + return NULL; + } + hdr = (alloc_hdr *) t; + hdr->u.sz = size; + ret = (void *) (hdr + 1); + write_log("R %p %ld %p %ld\n", ptr, (long) old_size, ret, (long) size); + return ret; + } + } else { + if (size == 0) { + write_log("R NULL 0 NULL 0\n"); + return NULL; + } else { + hdr = (alloc_hdr *) malloc(size + sizeof(alloc_hdr)); + if (!hdr) { + write_log("R NULL 0 FAIL %ld\n", (long) size); + return NULL; + } + hdr->u.sz = size; + ret = (void *) (hdr + 1); + write_log("R NULL 0 %p %ld\n", ret, (long) size); + return ret; + } + } +} + +void duk_free_logging(void *udata, void *ptr) { + alloc_hdr *hdr; + + (void) udata; /* Suppress warning. */ + + if (!ptr) { + write_log("F NULL 0\n"); + return; + } + hdr = (alloc_hdr *) (void *) ((unsigned char *) ptr - sizeof(alloc_hdr)); + write_log("F %p %ld\n", ptr, (long) hdr->u.sz); + free((void *) hdr); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/duk_alloc_logging.h b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/duk_alloc_logging.h new file mode 100644 index 00000000..67003531 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/duk_alloc_logging.h @@ -0,0 +1,10 @@ +#ifndef DUK_ALLOC_LOGGING_H_INCLUDED +#define DUK_ALLOC_LOGGING_H_INCLUDED + +#include "duktape.h" + +void *duk_alloc_logging(void *udata, duk_size_t size); +void *duk_realloc_logging(void *udata, void *ptr, duk_size_t size); +void duk_free_logging(void *udata, void *ptr); + +#endif /* DUK_ALLOC_LOGGING_H_INCLUDED */ diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/log2gnuplot.py b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/log2gnuplot.py new file mode 100644 index 00000000..7562814d --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-logging/log2gnuplot.py @@ -0,0 +1,41 @@ +#!/usr/bin/python +# +# Analyze allocator logs and write total-bytes-in-use after every +# operation to stdout. The output can be gnuplotted as: +# +# $ python log2gnuplot.py /tmp/output.txt +# $ gnuplot +# > plot "output.txt" with lines +# + +import os +import sys + +def main(): + allocated = 0 + + for line in sys.stdin: + line = line.strip() + parts = line.split(' ') + + # A ptr/NULL/FAIL size + # F ptr/NULL size + # R ptr/NULL oldsize ptr/NULL/FAIL newsize + + # Note: ajduk doesn't log oldsize (uses -1 instead) + + if parts[0] == 'A': + if parts[1] != 'NULL' and parts[1] != 'FAIL': + allocated += long(parts[2]) + elif parts[0] == 'F': + allocated -= long(parts[2]) + elif parts[0] == 'R': + allocated -= long(parts[2]) + if parts[3] != 'NULL' and parts[3] != 'FAIL': + allocated += long(parts[4]) + print(allocated) + + print(allocated) + +if __name__ == '__main__': + main() diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-torture/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-torture/README.rst new file mode 100644 index 00000000..f3278bbf --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-torture/README.rst @@ -0,0 +1,10 @@ +========================================== +Allocator with memory wiping and red zones +========================================== + +Example allocator that wipes memory on free and checks that no out-of-bounds +writes have been made to bytes just before and after the allocated area. + +Valgrind is a better tool for detecting these memory issues, but it's not +available for all targets so you can use something like this to detect +memory lifecycle or out-of-bounds issues. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-torture/duk_alloc_torture.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-torture/duk_alloc_torture.c new file mode 100644 index 00000000..abca2f75 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-torture/duk_alloc_torture.c @@ -0,0 +1,182 @@ +/* + * Example torture memory allocator with memory wiping and check for + * out-of-bounds writes. + * + * Allocation structure: + * + * [ alloc_hdr | red zone before | user area | red zone after ] + * + * ^ ^ + * | `--- pointer returned to Duktape + * `--- underlying malloc ptr + */ + +#include "duktape.h" +#include +#include +#include +#include + +#define RED_ZONE_SIZE 16 +#define RED_ZONE_BYTE 0x5a +#define INIT_BYTE 0xa5 +#define WIPE_BYTE 0x27 + +typedef struct { + /* The double value in the union is there to ensure alignment is + * good for IEEE doubles too. In many 32-bit environments 4 bytes + * would be sufficiently aligned and the double value is unnecessary. + */ + union { + size_t sz; + double d; + } u; +} alloc_hdr; + +static void check_red_zone(alloc_hdr *hdr) { + size_t size; + int i; + int err; + unsigned char *p; + unsigned char *userptr; + + size = hdr->u.sz; + userptr = (unsigned char *) hdr + sizeof(alloc_hdr) + RED_ZONE_SIZE; + + err = 0; + p = (unsigned char *) hdr + sizeof(alloc_hdr); + for (i = 0; i < RED_ZONE_SIZE; i++) { + if (p[i] != RED_ZONE_BYTE) { + err = 1; + } + } + if (err) { + fprintf(stderr, "RED ZONE CORRUPTED BEFORE ALLOC: hdr=%p ptr=%p size=%ld\n", + (void *) hdr, (void *) userptr, (long) size); + fflush(stderr); + } + + err = 0; + p = (unsigned char *) hdr + sizeof(alloc_hdr) + RED_ZONE_SIZE + size; + for (i = 0; i < RED_ZONE_SIZE; i++) { + if (p[i] != RED_ZONE_BYTE) { + err = 1; + } + } + if (err) { + fprintf(stderr, "RED ZONE CORRUPTED AFTER ALLOC: hdr=%p ptr=%p size=%ld\n", + (void *) hdr, (void *) userptr, (long) size); + fflush(stderr); + } +} + +void *duk_alloc_torture(void *udata, duk_size_t size) { + unsigned char *p; + + (void) udata; /* Suppress warning. */ + + if (size == 0) { + return NULL; + } + + p = (unsigned char *) malloc(size + sizeof(alloc_hdr) + 2 * RED_ZONE_SIZE); + if (!p) { + return NULL; + } + + ((alloc_hdr *) (void *) p)->u.sz = size; + p += sizeof(alloc_hdr); + memset((void *) p, RED_ZONE_BYTE, RED_ZONE_SIZE); + p += RED_ZONE_SIZE; + memset((void *) p, INIT_BYTE, size); + p += size; + memset((void *) p, RED_ZONE_BYTE, RED_ZONE_SIZE); + p -= size; + return (void *) p; +} + +void *duk_realloc_torture(void *udata, void *ptr, duk_size_t size) { + unsigned char *p, *old_p; + size_t old_size; + + (void) udata; /* Suppress warning. */ + + /* Handle the ptr-NULL vs. size-zero cases explicitly to minimize + * platform assumptions. You can get away with much less in specific + * well-behaving environments. + */ + + if (ptr) { + old_p = (unsigned char *) ptr - sizeof(alloc_hdr) - RED_ZONE_SIZE; + old_size = ((alloc_hdr *) (void *) old_p)->u.sz; + check_red_zone((alloc_hdr *) (void *) old_p); + + if (size == 0) { + memset((void *) old_p, WIPE_BYTE, old_size + sizeof(alloc_hdr) + 2 * RED_ZONE_SIZE); + free((void *) old_p); + return NULL; + } else { + /* Force address change on every realloc. */ + p = (unsigned char *) malloc(size + sizeof(alloc_hdr) + 2 * RED_ZONE_SIZE); + if (!p) { + return NULL; + } + + ((alloc_hdr *) (void *) p)->u.sz = size; + p += sizeof(alloc_hdr); + memset((void *) p, RED_ZONE_BYTE, RED_ZONE_SIZE); + p += RED_ZONE_SIZE; + if (size > old_size) { + memcpy((void *) p, (void *) (old_p + sizeof(alloc_hdr) + RED_ZONE_SIZE), old_size); + memset((void *) (p + old_size), INIT_BYTE, size - old_size); + } else { + memcpy((void *) p, (void *) (old_p + sizeof(alloc_hdr) + RED_ZONE_SIZE), size); + } + p += size; + memset((void *) p, RED_ZONE_BYTE, RED_ZONE_SIZE); + p -= size; + + memset((void *) old_p, WIPE_BYTE, old_size + sizeof(alloc_hdr) + 2 * RED_ZONE_SIZE); + free((void *) old_p); + + return (void *) p; + } + } else { + if (size == 0) { + return NULL; + } else { + p = (unsigned char *) malloc(size + sizeof(alloc_hdr) + 2 * RED_ZONE_SIZE); + if (!p) { + return NULL; + } + + ((alloc_hdr *) (void *) p)->u.sz = size; + p += sizeof(alloc_hdr); + memset((void *) p, RED_ZONE_BYTE, RED_ZONE_SIZE); + p += RED_ZONE_SIZE; + memset((void *) p, INIT_BYTE, size); + p += size; + memset((void *) p, RED_ZONE_BYTE, RED_ZONE_SIZE); + p -= size; + return (void *) p; + } + } +} + +void duk_free_torture(void *udata, void *ptr) { + unsigned char *p; + size_t old_size; + + (void) udata; /* Suppress warning. */ + + if (!ptr) { + return; + } + + p = (unsigned char *) ptr - sizeof(alloc_hdr) - RED_ZONE_SIZE; + old_size = ((alloc_hdr *) (void *) p)->u.sz; + + check_red_zone((alloc_hdr *) (void *) p); + memset((void *) p, WIPE_BYTE, old_size + sizeof(alloc_hdr) + 2 * RED_ZONE_SIZE); + free((void *) p); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-torture/duk_alloc_torture.h b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-torture/duk_alloc_torture.h new file mode 100644 index 00000000..a12153a2 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/alloc-torture/duk_alloc_torture.h @@ -0,0 +1,10 @@ +#ifndef DUK_ALLOC_TORTURE_H_INCLUDED +#define DUK_ALLOC_TORTURE_H_INCLUDED + +#include "duktape.h" + +void *duk_alloc_torture(void *udata, duk_size_t size); +void *duk_realloc_torture(void *udata, void *ptr, duk_size_t size); +void duk_free_torture(void *udata, void *ptr); + +#endif /* DUK_ALLOC_TORTURE_H_INCLUDED */ diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/cmdline/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/cmdline/README.rst new file mode 100644 index 00000000..e0c6bceb --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/cmdline/README.rst @@ -0,0 +1,6 @@ +==================== +Duktape command line +==================== + +Ecmascript command line execution tool, useful for running Ecmascript code +from a file, stdin, or interactively. Also used by automatic testing. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/cmdline/duk_cmdline.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/cmdline/duk_cmdline.c new file mode 100644 index 00000000..df61cdf9 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/cmdline/duk_cmdline.c @@ -0,0 +1,873 @@ +/* + * Command line execution tool. Useful for test cases and manual testing. + * + * To enable readline and other fancy stuff, compile with -DDUK_CMDLINE_FANCY. + * It is not the default to maximize portability. You can also compile in + * support for example allocators, grep for DUK_CMDLINE_*. + */ + +#ifndef DUK_CMDLINE_FANCY +#define NO_READLINE +#define NO_RLIMIT +#define NO_SIGNAL +#endif + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || \ + defined(WIN64) || defined(_WIN64) || defined(__WIN64__) +/* Suppress warnings about plain fopen() etc. */ +#define _CRT_SECURE_NO_WARNINGS +#endif + +#define GREET_CODE(variant) \ + "print('((o) Duktape" variant " ' + " \ + "Math.floor(Duktape.version / 10000) + '.' + " \ + "Math.floor(Duktape.version / 100) % 100 + '.' + " \ + "Duktape.version % 100" \ + ", '(" DUK_GIT_DESCRIBE ")');" + +#include +#include +#include +#ifndef NO_SIGNAL +#include +#endif +#ifndef NO_RLIMIT +#include +#endif +#ifndef NO_READLINE +#include +#include +#endif +#ifdef DUK_CMDLINE_ALLOC_LOGGING +#include "duk_alloc_logging.h" +#endif +#ifdef DUK_CMDLINE_ALLOC_TORTURE +#include "duk_alloc_torture.h" +#endif +#ifdef DUK_CMDLINE_ALLOC_HYBRID +#include "duk_alloc_hybrid.h" +#endif +#include "duktape.h" + +#ifdef DUK_CMDLINE_AJSHEAP +/* Defined in duk_cmdline_ajduk.c or alljoyn.js headers. */ +void ajsheap_init(void); +void ajsheap_dump(void); +void ajsheap_register(duk_context *ctx); +void ajsheap_start_exec_timeout(void); +void ajsheap_clear_exec_timeout(void); +void *ajsheap_alloc_wrapped(void *udata, duk_size_t size); +void *ajsheap_realloc_wrapped(void *udata, void *ptr, duk_size_t size); +void ajsheap_free_wrapped(void *udata, void *ptr); +void *AJS_Alloc(void *udata, duk_size_t size); +void *AJS_Realloc(void *udata, void *ptr, duk_size_t size); +void AJS_Free(void *udata, void *ptr); +#endif + +#ifdef DUK_CMDLINE_DEBUGGER_SUPPORT +#include "duk_trans_socket.h" +#endif + +#define MEM_LIMIT_NORMAL (128*1024*1024) /* 128 MB */ +#define MEM_LIMIT_HIGH (2047*1024*1024) /* ~2 GB */ +#define LINEBUF_SIZE 65536 + +static int interactive_mode = 0; + +#ifndef NO_RLIMIT +static void set_resource_limits(rlim_t mem_limit_value) { + int rc; + struct rlimit lim; + + rc = getrlimit(RLIMIT_AS, &lim); + if (rc != 0) { + fprintf(stderr, "Warning: cannot read RLIMIT_AS\n"); + return; + } + + if (lim.rlim_max < mem_limit_value) { + fprintf(stderr, "Warning: rlim_max < mem_limit_value (%d < %d)\n", (int) lim.rlim_max, (int) mem_limit_value); + return; + } + + lim.rlim_cur = mem_limit_value; + lim.rlim_max = mem_limit_value; + + rc = setrlimit(RLIMIT_AS, &lim); + if (rc != 0) { + fprintf(stderr, "Warning: setrlimit failed\n"); + return; + } + +#if 0 + fprintf(stderr, "Set RLIMIT_AS to %d\n", (int) mem_limit_value); +#endif +} +#endif /* NO_RLIMIT */ + +#ifndef NO_SIGNAL +static void my_sighandler(int x) { + fprintf(stderr, "Got signal %d\n", x); + fflush(stderr); +} +static void set_sigint_handler(void) { + (void) signal(SIGINT, my_sighandler); +} +#endif /* NO_SIGNAL */ + +static int get_stack_raw(duk_context *ctx) { + if (!duk_is_object(ctx, -1)) { + return 1; + } + if (!duk_has_prop_string(ctx, -1, "stack")) { + return 1; + } + if (!duk_is_error(ctx, -1)) { + /* Not an Error instance, don't read "stack". */ + return 1; + } + + duk_get_prop_string(ctx, -1, "stack"); /* caller coerces */ + duk_remove(ctx, -2); + return 1; +} + +/* Print error to stderr and pop error. */ +static void print_pop_error(duk_context *ctx, FILE *f) { + /* Print error objects with a stack trace specially. + * Note that getting the stack trace may throw an error + * so this also needs to be safe call wrapped. + */ + (void) duk_safe_call(ctx, get_stack_raw, 1 /*nargs*/, 1 /*nrets*/); + fprintf(f, "%s\n", duk_safe_to_string(ctx, -1)); + fflush(f); + duk_pop(ctx); +} + +static int wrapped_compile_execute(duk_context *ctx) { + const char *src_data; + duk_size_t src_len; + int comp_flags; + + /* XXX: Here it'd be nice to get some stats for the compilation result + * when a suitable command line is given (e.g. code size, constant + * count, function count. These are available internally but not through + * the public API. + */ + + /* Use duk_compile_lstring_filename() variant which avoids interning + * the source code. This only really matters for low memory environments. + */ + + /* [ ... bytecode_filename src_data src_len filename ] */ + + src_data = (const char *) duk_require_pointer(ctx, -3); + src_len = (duk_size_t) duk_require_uint(ctx, -2); + + if (src_data != NULL && src_len >= 2 && src_data[0] == (char) 0xff) { + /* Bytecode. */ + duk_push_lstring(ctx, src_data, src_len); + duk_to_buffer(ctx, -1, NULL); + duk_load_function(ctx); + } else { + /* Source code. */ + comp_flags = 0; + duk_compile_lstring_filename(ctx, comp_flags, src_data, src_len); + } + + /* [ ... bytecode_filename src_data src_len function ] */ + + /* Optional bytecode dump. */ + if (duk_is_string(ctx, -4)) { + FILE *f; + void *bc_ptr; + duk_size_t bc_len; + size_t wrote; + + duk_dup_top(ctx); + duk_dump_function(ctx); + bc_ptr = duk_require_buffer(ctx, -1, &bc_len); + f = fopen(duk_require_string(ctx, -5), "wb"); + if (!f) { + duk_error(ctx, DUK_ERR_ERROR, "failed to open bytecode output file"); + } + wrote = fwrite(bc_ptr, 1, (size_t) bc_len, f); /* XXX: handle partial writes */ + (void) fclose(f); + if (wrote != bc_len) { + duk_error(ctx, DUK_ERR_ERROR, "failed to write all bytecode"); + } + + return 0; /* duk_safe_call() cleans up */ + } + +#if 0 + /* Manual test for bytecode dump/load cycle: dump and load before + * execution. Enable manually, then run "make qecmatest" for a + * reasonably good coverage of different functions and programs. + */ + duk_dump_function(ctx); + duk_load_function(ctx); +#endif + +#if defined(DUK_CMDLINE_AJSHEAP) + ajsheap_start_exec_timeout(); +#endif + + duk_push_global_object(ctx); /* 'this' binding */ + duk_call_method(ctx, 0); + +#if defined(DUK_CMDLINE_AJSHEAP) + ajsheap_clear_exec_timeout(); +#endif + + if (interactive_mode) { + /* + * In interactive mode, write to stdout so output won't + * interleave as easily. + * + * NOTE: the ToString() coercion may fail in some cases; + * for instance, if you evaluate: + * + * ( {valueOf: function() {return {}}, + * toString: function() {return {}}}); + * + * The error is: + * + * TypeError: failed to coerce with [[DefaultValue]] + * duk_api.c:1420 + * + * These are handled now by the caller which also has stack + * trace printing support. User code can print out errors + * safely using duk_safe_to_string(). + */ + + fprintf(stdout, "= %s\n", duk_to_string(ctx, -1)); + fflush(stdout); + } else { + /* In non-interactive mode, success results are not written at all. + * It is important that the result value is not string coerced, + * as the string coercion may cause an error in some cases. + */ + } + + return 0; /* duk_safe_call() cleans up */ +} + +static int handle_fh(duk_context *ctx, FILE *f, const char *filename, const char *bytecode_filename) { + char *buf = NULL; + int len; + size_t got; + int rc; + int retval = -1; + + if (fseek(f, 0, SEEK_END) < 0) { + goto error; + } + len = (int) ftell(f); + if (fseek(f, 0, SEEK_SET) < 0) { + goto error; + } + buf = (char *) malloc(len); + if (!buf) { + goto error; + } + + got = fread((void *) buf, (size_t) 1, (size_t) len, f); + + duk_push_string(ctx, bytecode_filename); + duk_push_pointer(ctx, (void *) buf); + duk_push_uint(ctx, (duk_uint_t) got); + duk_push_string(ctx, filename); + + interactive_mode = 0; /* global */ + + rc = duk_safe_call(ctx, wrapped_compile_execute, 4 /*nargs*/, 1 /*nret*/); + +#if defined(DUK_CMDLINE_AJSHEAP) + ajsheap_clear_exec_timeout(); +#endif + + free(buf); + buf = NULL; + + if (rc != DUK_EXEC_SUCCESS) { + print_pop_error(ctx, stderr); + goto error; + } else { + duk_pop(ctx); + retval = 0; + } + /* fall thru */ + + cleanup: + if (buf) { + free(buf); + } + return retval; + + error: + fprintf(stderr, "error in executing file %s\n", filename); + fflush(stderr); + goto cleanup; +} + +static int handle_file(duk_context *ctx, const char *filename, const char *bytecode_filename) { + FILE *f = NULL; + int retval; + + f = fopen(filename, "rb"); + if (!f) { + fprintf(stderr, "failed to open source file: %s\n", filename); + fflush(stderr); + goto error; + } + + retval = handle_fh(ctx, f, filename, bytecode_filename); + + fclose(f); + return retval; + + error: + return -1; +} + +static int handle_eval(duk_context *ctx, const char *code) { + int rc; + int retval = -1; + + duk_push_pointer(ctx, (void *) code); + duk_push_uint(ctx, (duk_uint_t) strlen(code)); + duk_push_string(ctx, "eval"); + + interactive_mode = 0; /* global */ + + rc = duk_safe_call(ctx, wrapped_compile_execute, 3 /*nargs*/, 1 /*nret*/); + +#if defined(DUK_CMDLINE_AJSHEAP) + ajsheap_clear_exec_timeout(); +#endif + + if (rc != DUK_EXEC_SUCCESS) { + print_pop_error(ctx, stderr); + } else { + duk_pop(ctx); + retval = 0; + } + + return retval; +} + +#ifdef NO_READLINE +static int handle_interactive(duk_context *ctx) { + const char *prompt = "duk> "; + char *buffer = NULL; + int retval = 0; + int rc; + int got_eof = 0; + + duk_eval_string(ctx, GREET_CODE(" [no readline]")); + duk_pop(ctx); + + buffer = (char *) malloc(LINEBUF_SIZE); + if (!buffer) { + fprintf(stderr, "failed to allocated a line buffer\n"); + fflush(stderr); + retval = -1; + goto done; + } + + while (!got_eof) { + size_t idx = 0; + + fwrite(prompt, 1, strlen(prompt), stdout); + fflush(stdout); + + for (;;) { + int c = fgetc(stdin); + if (c == EOF) { + got_eof = 1; + break; + } else if (c == '\n') { + break; + } else if (idx >= LINEBUF_SIZE) { + fprintf(stderr, "line too long\n"); + fflush(stderr); + retval = -1; + goto done; + } else { + buffer[idx++] = (char) c; + } + } + + duk_push_pointer(ctx, (void *) buffer); + duk_push_uint(ctx, (duk_uint_t) idx); + duk_push_string(ctx, "input"); + + interactive_mode = 1; /* global */ + + rc = duk_safe_call(ctx, wrapped_compile_execute, 3 /*nargs*/, 1 /*nret*/); + +#if defined(DUK_CMDLINE_AJSHEAP) + ajsheap_clear_exec_timeout(); +#endif + + if (rc != DUK_EXEC_SUCCESS) { + /* in interactive mode, write to stdout */ + print_pop_error(ctx, stdout); + retval = -1; /* an error 'taints' the execution */ + } else { + duk_pop(ctx); + } + } + + done: + if (buffer) { + free(buffer); + buffer = NULL; + } + + return retval; +} +#else /* NO_READLINE */ +static int handle_interactive(duk_context *ctx) { + const char *prompt = "duk> "; + char *buffer = NULL; + int retval = 0; + int rc; + + duk_eval_string(ctx, GREET_CODE("")); + duk_pop(ctx); + + /* + * Note: using readline leads to valgrind-reported leaks inside + * readline itself. Execute code from an input file (and not + * through stdin) for clean valgrind runs. + */ + + rl_initialize(); + + for (;;) { + if (buffer) { + free(buffer); + buffer = NULL; + } + + buffer = readline(prompt); + if (!buffer) { + break; + } + + if (buffer && buffer[0] != (char) 0) { + add_history(buffer); + } + + duk_push_pointer(ctx, (void *) buffer); + duk_push_uint(ctx, (duk_uint_t) strlen(buffer)); + duk_push_string(ctx, "input"); + + interactive_mode = 1; /* global */ + + rc = duk_safe_call(ctx, wrapped_compile_execute, 3 /*nargs*/, 1 /*nret*/); + +#if defined(DUK_CMDLINE_AJSHEAP) + ajsheap_clear_exec_timeout(); +#endif + + if (buffer) { + free(buffer); + buffer = NULL; + } + + if (rc != DUK_EXEC_SUCCESS) { + /* in interactive mode, write to stdout */ + print_pop_error(ctx, stdout); + retval = -1; /* an error 'taints' the execution */ + } else { + duk_pop(ctx); + } + } + + if (buffer) { + free(buffer); + buffer = NULL; + } + + return retval; +} +#endif /* NO_READLINE */ + +#ifdef DUK_CMDLINE_DEBUGGER_SUPPORT +static void debugger_detached(void *udata) { + fprintf(stderr, "Debugger detached, udata: %p\n", (void *) udata); + fflush(stderr); +} +#endif + +#define ALLOC_DEFAULT 0 +#define ALLOC_LOGGING 1 +#define ALLOC_TORTURE 2 +#define ALLOC_HYBRID 3 +#define ALLOC_AJSHEAP 4 + +static duk_context *create_duktape_heap(int alloc_provider, int debugger) { + duk_context *ctx; + + ctx = NULL; + if (!ctx && alloc_provider == ALLOC_LOGGING) { +#ifdef DUK_CMDLINE_ALLOC_LOGGING + ctx = duk_create_heap(duk_alloc_logging, + duk_realloc_logging, + duk_free_logging, + (void *) 0xdeadbeef, + NULL); +#else + fprintf(stderr, "Warning: option --alloc-logging ignored, no logging allocator support\n"); + fflush(stderr); +#endif + } + if (!ctx && alloc_provider == ALLOC_TORTURE) { +#ifdef DUK_CMDLINE_ALLOC_TORTURE + ctx = duk_create_heap(duk_alloc_torture, + duk_realloc_torture, + duk_free_torture, + (void *) 0xdeadbeef, + NULL); +#else + fprintf(stderr, "Warning: option --alloc-torture ignored, no torture allocator support\n"); + fflush(stderr); +#endif + } + if (!ctx && alloc_provider == ALLOC_HYBRID) { +#ifdef DUK_CMDLINE_ALLOC_HYBRID + void *udata = duk_alloc_hybrid_init(); + if (!udata) { + fprintf(stderr, "Failed to init hybrid allocator\n"); + fflush(stderr); + } else { + ctx = duk_create_heap(duk_alloc_hybrid, + duk_realloc_hybrid, + duk_free_hybrid, + udata, + NULL); + } +#else + fprintf(stderr, "Warning: option --alloc-hybrid ignored, no hybrid allocator support\n"); + fflush(stderr); +#endif + } + if (!ctx && alloc_provider == ALLOC_AJSHEAP) { +#ifdef DUK_CMDLINE_AJSHEAP + ajsheap_init(); + + ctx = duk_create_heap( + ajsheap_log ? ajsheap_alloc_wrapped : AJS_Alloc, + ajsheap_log ? ajsheap_realloc_wrapped : AJS_Realloc, + ajsheap_log ? ajsheap_free_wrapped : AJS_Free, + (void *) 0xdeadbeef, /* heap_udata: ignored by AjsHeap, use as marker */ + NULL + ); /* fatal_handler */ +#else + fprintf(stderr, "Warning: option --alloc-ajsheap ignored, no ajsheap allocator support\n"); + fflush(stderr); +#endif + } + if (!ctx && alloc_provider == ALLOC_DEFAULT) { + ctx = duk_create_heap_default(); + } + + if (!ctx) { + fprintf(stderr, "Failed to create Duktape heap\n"); + fflush(stderr); + exit(-1); + } + +#ifdef DUK_CMDLINE_AJSHEAP + if (alloc_provider == ALLOC_AJSHEAP) { + fprintf(stdout, "Pool dump after heap creation\n"); + ajsheap_dump(); + } +#endif + +#ifdef DUK_CMDLINE_AJSHEAP + if (alloc_provider == ALLOC_AJSHEAP) { + ajsheap_register(ctx); + } +#endif + + if (debugger) { +#ifdef DUK_CMDLINE_DEBUGGER_SUPPORT + fprintf(stderr, "Debugger enabled, create socket and wait for connection\n"); + fflush(stderr); + duk_trans_socket_init(); + duk_trans_socket_waitconn(); + fprintf(stderr, "Debugger connected, call duk_debugger_attach() and then execute requested file(s)/eval\n"); + fflush(stderr); + duk_debugger_attach(ctx, + duk_trans_socket_read_cb, + duk_trans_socket_write_cb, + duk_trans_socket_peek_cb, + duk_trans_socket_read_flush_cb, + duk_trans_socket_write_flush_cb, + debugger_detached, + (void *) 0xbeef1234); +#else + fprintf(stderr, "Warning: option --debugger ignored, no debugger support\n"); + fflush(stderr); +#endif + } + +#if 0 + /* Manual test for duk_debugger_cooperate() */ + { + for (i = 0; i < 60; i++) { + printf("cooperate: %d\n", i); + usleep(1000000); + duk_debugger_cooperate(ctx); + } + } +#endif + + return ctx; +} + +static void destroy_duktape_heap(duk_context *ctx, int alloc_provider) { + (void) alloc_provider; + +#ifdef DUK_CMDLINE_AJSHEAP + if (alloc_provider == ALLOC_AJSHEAP) { + fprintf(stdout, "Pool dump before duk_destroy_heap(), before forced gc\n"); + ajsheap_dump(); + + duk_gc(ctx, 0); + + fprintf(stdout, "Pool dump before duk_destroy_heap(), after forced gc\n"); + ajsheap_dump(); + } +#endif + + if (ctx) { + duk_destroy_heap(ctx); + } + +#ifdef DUK_CMDLINE_AJSHEAP + if (alloc_provider == ALLOC_AJSHEAP) { + fprintf(stdout, "Pool dump after duk_destroy_heap() (should have zero allocs)\n"); + ajsheap_dump(); + } +#endif +} + +int main(int argc, char *argv[]) { + duk_context *ctx = NULL; + int retval = 0; + int have_files = 0; + int have_eval = 0; + int interactive = 0; + int memlimit_high = 1; + int alloc_provider = ALLOC_DEFAULT; + int ajsheap_log = 0; + int debugger = 0; + int recreate_heap = 0; + int verbose = 0; + const char *compile_filename = NULL; + int i; + +#ifdef DUK_CMDLINE_AJSHEAP + alloc_provider = ALLOC_AJSHEAP; +#endif + (void) ajsheap_log; + + /* + * Signal handling setup + */ + +#ifndef NO_SIGNAL + set_sigint_handler(); + + /* This is useful at the global level; libraries should avoid SIGPIPE though */ + /*signal(SIGPIPE, SIG_IGN);*/ +#endif + + /* + * Parse options + */ + + for (i = 1; i < argc; i++) { + char *arg = argv[i]; + if (!arg) { + goto usage; + } + if (strcmp(arg, "--restrict-memory") == 0) { + memlimit_high = 0; + } else if (strcmp(arg, "-i") == 0) { + interactive = 1; + } else if (strcmp(arg, "-c") == 0) { + if (i == argc - 1) { + goto usage; + } + i++; + compile_filename = argv[i]; + } else if (strcmp(arg, "-e") == 0) { + have_eval = 1; + if (i == argc - 1) { + goto usage; + } + i++; /* skip code */ + } else if (strcmp(arg, "--alloc-default") == 0) { + alloc_provider = ALLOC_DEFAULT; + } else if (strcmp(arg, "--alloc-logging") == 0) { + alloc_provider = ALLOC_LOGGING; + } else if (strcmp(arg, "--alloc-torture") == 0) { + alloc_provider = ALLOC_TORTURE; + } else if (strcmp(arg, "--alloc-hybrid") == 0) { + alloc_provider = ALLOC_HYBRID; + } else if (strcmp(arg, "--alloc-ajsheap") == 0) { + alloc_provider = ALLOC_AJSHEAP; + } else if (strcmp(arg, "--ajsheap-log") == 0) { + ajsheap_log = 1; + } else if (strcmp(arg, "--debugger") == 0) { + debugger = 1; + } else if (strcmp(arg, "--recreate-heap") == 0) { + recreate_heap = 1; + } else if (strcmp(arg, "--verbose") == 0) { + verbose = 1; + } else if (strlen(arg) >= 1 && arg[0] == '-') { + goto usage; + } else { + have_files = 1; + } + } + if (!have_files && !have_eval) { + interactive = 1; + } + + /* + * Memory limit + */ + +#ifndef NO_RLIMIT + set_resource_limits(memlimit_high ? MEM_LIMIT_HIGH : MEM_LIMIT_NORMAL); +#else + if (memlimit_high == 0) { + fprintf(stderr, "Warning: option --restrict-memory ignored, no rlimit support\n"); + fflush(stderr); + } +#endif + + /* + * Create heap + */ + + ctx = create_duktape_heap(alloc_provider, debugger); + + /* + * Execute any argument file(s) + */ + + for (i = 1; i < argc; i++) { + char *arg = argv[i]; + if (!arg) { + continue; + } else if (strlen(arg) == 2 && strcmp(arg, "-e") == 0) { + /* Here we know the eval arg exists but check anyway */ + if (i == argc - 1) { + retval = 1; + goto cleanup; + } + if (handle_eval(ctx, argv[i + 1]) != 0) { + retval = 1; + goto cleanup; + } + i++; /* skip code */ + continue; + } else if (strlen(arg) == 2 && strcmp(arg, "-c") == 0) { + i++; /* skip filename */ + continue; + } else if (strlen(arg) >= 1 && arg[0] == '-') { + continue; + } + + if (verbose) { + fprintf(stderr, "*** Executing file: %s\n", arg); + fflush(stderr); + } + + if (handle_file(ctx, arg, compile_filename) != 0) { + retval = 1; + goto cleanup; + } + + if (recreate_heap) { + if (verbose) { + fprintf(stderr, "*** Recreating heap...\n"); + fflush(stderr); + } + + destroy_duktape_heap(ctx, alloc_provider); + ctx = create_duktape_heap(alloc_provider, debugger); + } + } + + /* + * Enter interactive mode if options indicate it + */ + + if (interactive) { + if (handle_interactive(ctx) != 0) { + retval = 1; + goto cleanup; + } + } + + /* + * Cleanup and exit + */ + + cleanup: + if (interactive) { + fprintf(stderr, "Cleaning up...\n"); + fflush(stderr); + } + + if (ctx) { + destroy_duktape_heap(ctx, alloc_provider); + } + ctx = NULL; + + return retval; + + /* + * Usage + */ + + usage: + fprintf(stderr, "Usage: duk [options] []\n" + "\n" + " -i enter interactive mode after executing argument file(s) / eval code\n" + " -e CODE evaluate code\n" + " -c FILE compile into bytecode (use with only one file argument)\n" + " --verbose verbose messages to stderr\n" + " --restrict-memory use lower memory limit (used by test runner)\n" + " --alloc-default use Duktape default allocator\n" +#ifdef DUK_CMDLINE_ALLOC_LOGGING + " --alloc-logging use logging allocator (writes to /tmp)\n" +#endif +#ifdef DUK_CMDLINE_ALLOC_TORTURE + " --alloc-torture use torture allocator\n" +#endif +#ifdef DUK_CMDLINE_ALLOC_HYBRID + " --alloc-hybrid use hybrid allocator\n" +#endif +#ifdef DUK_CMDLINE_AJSHEAP + " --alloc-ajsheap use ajsheap allocator (enabled by default with 'ajduk')\n" + " --ajsheap-log write alloc log to /tmp/ajduk-alloc-log.txt\n" +#endif +#ifdef DUK_CMDLINE_DEBUGGER_SUPPORT + " --debugger start example debugger\n" +#endif + " --recreate-heap recreate heap after every file\n" + "\n" + "If is omitted, interactive mode is started automatically.\n"); + fflush(stderr); + exit(1); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/cmdline/duk_cmdline_ajduk.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/cmdline/duk_cmdline_ajduk.c new file mode 100644 index 00000000..c445fd44 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/cmdline/duk_cmdline_ajduk.c @@ -0,0 +1,892 @@ +/* + * 'ajduk' specific functionality, examples for low memory techniques + */ + +#ifdef DUK_CMDLINE_AJSHEAP + +#include +#include +#include +#include +#include "ajs.h" +#include "ajs_heap.h" + +extern uint8_t dbgHEAPDUMP; + +/* + * Helpers + */ + +static void safe_print_chars(const char *p, duk_size_t len, int until_nul) { + duk_size_t i; + + printf("\""); + for (i = 0; i < len; i++) { + unsigned char x = (unsigned char) p[i]; + if (until_nul && x == 0U) { + break; + } + if (x < 0x20 || x >= 0x7e || x == '"' || x == '\'' || x == '\\') { + printf("\\x%02x", (int) x); + } else { + printf("%c", (char) x); + } + } + printf("\""); +} + +/* + * Heap initialization when using AllJoyn.js pool allocator (without any + * other AllJoyn.js integration). This serves as an example of how to + * integrate Duktape with a pool allocator and is useful for low memory + * testing. + * + * The pool sizes are not optimized here. The sizes are chosen so that + * you can look at the high water mark (hwm) and use counts (use) and see + * how much allocations are needed for each pool size. To optimize pool + * sizes more accurately, you can use --alloc-logging and inspect the memory + * allocation log which provides exact byte counts etc. + * + * https://git.allseenalliance.org/cgit/core/alljoyn-js.git + * https://git.allseenalliance.org/cgit/core/alljoyn-js.git/tree/ajs.c + */ + +static const AJS_HeapConfig ajsheap_config[] = { + { 8, 10, AJS_POOL_BORROW, 0 }, + { 12, 10, AJS_POOL_BORROW, 0 }, + { 16, 200, AJS_POOL_BORROW, 0 }, + { 20, 400, AJS_POOL_BORROW, 0 }, + { 24, 400, AJS_POOL_BORROW, 0 }, + { 28, 200, AJS_POOL_BORROW, 0 }, + { 32, 200, AJS_POOL_BORROW, 0 }, + { 40, 200, AJS_POOL_BORROW, 0 }, + { 48, 50, AJS_POOL_BORROW, 0 }, + { 52, 50, AJS_POOL_BORROW, 0 }, + { 56, 50, AJS_POOL_BORROW, 0 }, + { 60, 50, AJS_POOL_BORROW, 0 }, + { 64, 50, AJS_POOL_BORROW, 0 }, + { 128, 80, AJS_POOL_BORROW, 0 }, + { 256, 16, AJS_POOL_BORROW, 0 }, + { 512, 16, AJS_POOL_BORROW, 0 }, + { 1024, 6, AJS_POOL_BORROW, 0 }, + { 1360, 1, AJS_POOL_BORROW, 0 }, /* duk_heap, with heap ptr compression */ + { 2048, 5, AJS_POOL_BORROW, 0 }, + { 4096, 3, 0, 0 }, + { 8192, 3, 0, 0 }, + { 16384, 1, 0, 0 }, + { 32768, 1, 0, 0 } +}; + +uint8_t *ajsheap_ram = NULL; + +void ajsheap_init(void) { + size_t heap_sz[1]; + uint8_t *heap_array[1]; + uint8_t num_pools, i; + AJ_Status ret; + + num_pools = (uint8_t) (sizeof(ajsheap_config) / sizeof(AJS_HeapConfig)); + heap_sz[0] = AJS_HeapRequired(ajsheap_config, /* heapConfig */ + num_pools, /* numPools */ + 0); /* heapNum */ + ajsheap_ram = (uint8_t *) malloc(heap_sz[0]); + if (ajsheap_ram == NULL) { + fprintf(stderr, "Failed to allocate AJS heap\n"); + fflush(stderr); + exit(1); + } + heap_array[0] = ajsheap_ram; + + fprintf(stderr, "Allocated AJS heap of %ld bytes, pools:", (long) heap_sz[0]); + for (i = 0; i < num_pools; i++) { + fprintf(stderr, " (sz:%ld,num:%ld,brw:%ld,idx:%ld)", + (long) ajsheap_config[i].size, (long) ajsheap_config[i].entries, + (long) ajsheap_config[i].borrow, (long) ajsheap_config[i].heapIndex); + } + fprintf(stderr, "\n"); + fflush(stderr); + + ret = AJS_HeapInit((void **) heap_array, /* heap */ + (size_t *) heap_sz, /* heapSz */ + ajsheap_config, /* heapConfig */ + num_pools, /* numPools */ + 1); /* numHeaps */ + fprintf(stderr, "AJS_HeapInit() -> %ld\n", (long) ret); + fflush(stderr); + + /* Enable heap dumps */ + dbgHEAPDUMP = 1; +} + +/* AjsHeap.dump(), allows Ecmascript code to dump heap status at suitable + * points. + */ +duk_ret_t ajsheap_dump_binding(duk_context *ctx) { + AJS_HeapDump(); + fflush(stdout); + return 0; +} + +void ajsheap_dump(void) { + AJS_HeapDump(); + fflush(stdout); +} + +void ajsheap_register(duk_context *ctx) { + duk_push_object(ctx); + duk_push_c_function(ctx, ajsheap_dump_binding, 0); + duk_put_prop_string(ctx, -2, "dump"); + duk_put_global_string(ctx, "AjsHeap"); +} + +/* + * Wrapped ajs_heap.c alloc functions + * + * Used to write an alloc log. + */ + +static FILE *ajsheap_alloc_log = NULL; + +static void ajsheap_write_alloc_log(const char *fmt, ...) { + va_list ap; + char buf[256]; + + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + buf[sizeof(buf) - 1] = (char) 0; + va_end(ap); + + if (ajsheap_alloc_log == NULL) { + ajsheap_alloc_log = fopen("/tmp/ajduk-alloc-log.txt", "wb"); + if (ajsheap_alloc_log == NULL) { + fprintf(stderr, "WARNING: failed to write alloc log, ignoring\n"); + fflush(stderr); + return; + } + } + + (void) fwrite((const void *) buf, 1, strlen(buf), ajsheap_alloc_log); + (void) fflush(ajsheap_alloc_log); +} + +void *ajsheap_alloc_wrapped(void *udata, duk_size_t size) { + void *ret = AJS_Alloc(udata, size); + if (size > 0 && ret == NULL) { + ajsheap_write_alloc_log("A FAIL %ld\n", (long) size); + } else if (ret == NULL) { + ajsheap_write_alloc_log("A NULL %ld\n", (long) size); + } else { + ajsheap_write_alloc_log("A %p %ld\n", ret, (long) size); + } + return ret; +} + +void *ajsheap_realloc_wrapped(void *udata, void *ptr, duk_size_t size) { + void *ret = AJS_Realloc(udata, ptr, size); + if (size > 0 && ret == NULL) { + if (ptr == NULL) { + ajsheap_write_alloc_log("R NULL -1 FAIL %ld\n", (long) size); + } else { + ajsheap_write_alloc_log("R %p -1 FAIL %ld\n", ptr, (long) size); + } + } else if (ret == NULL) { + if (ptr == NULL) { + ajsheap_write_alloc_log("R NULL -1 NULL %ld\n", (long) size); + } else { + ajsheap_write_alloc_log("R %p -1 NULL %ld\n", ptr, (long) size); + } + } else { + if (ptr == NULL) { + ajsheap_write_alloc_log("R NULL -1 %p %ld\n", ret, (long) size); + } else { + ajsheap_write_alloc_log("R %p -1 %p %ld\n", ptr, ret, (long) size); + } + } + return ret; +} + +void ajsheap_free_wrapped(void *udata, void *ptr) { + AJS_Free(udata, ptr); + if (ptr == NULL) { + } else { + ajsheap_write_alloc_log("F %p -1\n", ptr); + } +} + +/* + * Example pointer compression functions. + * + * 'base' is chosen so that no non-NULL pointer results in a zero result + * which is reserved for NULL pointers. + */ + +duk_uint16_t ajsheap_enc16(void *ud, void *p) { + duk_uint32_t ret; + char *base = (char *) ajsheap_ram - 4; + + /* Userdata is not needed in this case but would be useful if heap + * pointer compression were used for multiple heaps. The userdata + * allows the callback to distinguish between heaps and their base + * pointers. + * + * If not needed, the userdata can be left out during compilation + * by simply ignoring the userdata argument of the pointer encode + * and decode macros. It is kept here so that any bugs in actually + * providing the value inside Duktape are revealed during compilation. + */ + (void) ud; +#if 1 + /* Ensure that we always get the heap_udata given in heap creation. + * (Useful for Duktape development, not needed for user programs.) + */ + if (ud != (void *) 0xdeadbeef) { + fprintf(stderr, "invalid udata for ajsheap_enc16: %p\n", ud); + fflush(stderr); + } +#endif + + if (p == NULL) { + ret = 0; + } else { + ret = (duk_uint32_t) (((char *) p - base) >> 2); + } +#if 0 + printf("ajsheap_enc16: %p -> %u\n", p, (unsigned int) ret); +#endif + if (ret > 0xffffUL) { + fprintf(stderr, "Failed to compress pointer\n"); + fflush(stderr); + abort(); + } + return (duk_uint16_t) ret; +} +void *ajsheap_dec16(void *ud, duk_uint16_t x) { + void *ret; + char *base = (char *) ajsheap_ram - 4; + + /* See userdata discussion in ajsheap_enc16(). */ + (void) ud; +#if 1 + /* Ensure that we always get the heap_udata given in heap creation. */ + if (ud != (void *) 0xdeadbeef) { + fprintf(stderr, "invalid udata for ajsheap_dec16: %p\n", ud); + fflush(stderr); + } +#endif + + if (x == 0) { + ret = NULL; + } else { + ret = (void *) (base + (((duk_uint32_t) x) << 2)); + } +#if 0 + printf("ajsheap_dec16: %u -> %p\n", (unsigned int) x, ret); +#endif + return ret; +} + +/* + * Simplified example of an external strings strategy where incoming strings + * are written sequentially into a fixed, memory mapped flash area. + * + * The example first scans if the string is already in the flash (which may + * happen if the same string is interned multiple times), then adds it to + * flash if there is space. + * + * This example is too slow to be used in a real world application: there + * should be e.g. a hash table to quickly check for strings that are already + * present in the string data (similarly to how string interning works in + * Duktape itself). + */ + +static uint8_t ajsheap_strdata[65536]; +static size_t ajsheap_strdata_used = 0; + +const void *ajsheap_extstr_check_1(const void *ptr, duk_size_t len) { + uint8_t *p, *p_end; + uint8_t initial; + uint8_t *ret; + size_t left; + + (void) safe_print_chars; /* potentially unused */ + + if (len <= 3) { + /* It's not worth it to make very small strings external, as + * they would take the same space anyway. Also avoids zero + * length degenerate case. + */ + return NULL; + } + + /* + * Check if we already have the string. Be careful to compare for + * NUL terminator too, it is NOT present in 'ptr'. This algorithm + * is too simplistic and way too slow for actual use. + */ + + initial = ((const uint8_t *) ptr)[0]; + for (p = ajsheap_strdata, p_end = p + ajsheap_strdata_used; p != p_end; p++) { + if (*p != initial) { + continue; + } + left = (size_t) (p_end - p); + if (left >= len + 1 && + memcmp(p, ptr, len) == 0 && + p[len] == 0) { + ret = p; +#if 0 + printf("ajsheap_extstr_check_1: ptr=%p, len=%ld ", + (void *) ptr, (long) len); + safe_print_chars((const char *) ptr, len, 0 /*until_nul*/); + printf(" -> existing %p (used=%ld)\n", + (void *) ret, (long) ajsheap_strdata_used); +#endif + return ret; + } + } + + /* + * Not present yet, check if we have space. Again, be careful to + * ensure there is space for a NUL following the input data. + */ + + if (ajsheap_strdata_used + len + 1 > sizeof(ajsheap_strdata)) { +#if 0 + printf("ajsheap_extstr_check_1: ptr=%p, len=%ld ", (void *) ptr, (long) len); + safe_print_chars((const char *) ptr, len, 0 /*until_nul*/); + printf(" -> no space (used=%ld)\n", (long) ajsheap_strdata_used); +#endif + return NULL; + } + + /* + * There is space, add the string to our collection, being careful + * to append the NUL. + */ + + ret = ajsheap_strdata + ajsheap_strdata_used; + memcpy(ret, ptr, len); + ret[len] = (uint8_t) 0; + ajsheap_strdata_used += len + 1; + +#if 0 + printf("ajsheap_extstr_check_1: ptr=%p, len=%ld -> ", (void *) ptr, (long) len); + safe_print_chars((const char *) ptr, len, 0 /*until_nul*/); + printf(" -> %p (used=%ld)\n", (void *) ret, (long) ajsheap_strdata_used); +#endif + return (const void *) ret; +} + +void ajsheap_extstr_free_1(const void *ptr) { + (void) ptr; +#if 0 + printf("ajsheap_extstr_free_1: freeing extstr %p -> ", ptr); + safe_print_chars((const char *) ptr, DUK_SIZE_MAX, 1 /*until_nul*/); + printf("\n"); +#endif +} + +/* + * Simplified example of an external strings strategy where a set of strings + * is gathered during application compile time and baked into the application + * binary. + * + * Duktape built-in strings are available from duk_build_meta.json, see + * util/duk_meta_to_strarray.py. There may also be a lot of application + * specific strings, e.g. those used by application specific APIs. These + * must be gathered through some other means, see e.g. util/scan_strings.py. + */ + +static const char *strdata_duk_builtin_strings[] = { + /* + * These strings are from util/duk_meta_to_strarray.py + */ + + "Logger", + "Thread", + "Pointer", + "Buffer", + "DecEnv", + "ObjEnv", + "", + "global", + "Arguments", + "JSON", + "Math", + "Error", + "RegExp", + "Date", + "Number", + "Boolean", + "String", + "Array", + "Function", + "Object", + "Null", + "Undefined", + "{_func:true}", + "{\x22" "_func\x22" ":true}", + "{\x22" "_ninf\x22" ":true}", + "{\x22" "_inf\x22" ":true}", + "{\x22" "_nan\x22" ":true}", + "{\x22" "_undef\x22" ":true}", + "toLogString", + "clog", + "l", + "n", + "fatal", + "error", + "warn", + "debug", + "trace", + "raw", + "fmt", + "current", + "resume", + "compact", + "jc", + "jx", + "base64", + "hex", + "dec", + "enc", + "fin", + "gc", + "act", + "info", + "version", + "env", + "modLoaded", + "modSearch", + "errThrow", + "errCreate", + "compile", + "\xff" "Regbase", + "\xff" "Thread", + "\xff" "Handler", + "\xff" "Finalizer", + "\xff" "Callee", + "\xff" "Map", + "\xff" "Args", + "\xff" "This", + "\xff" "Pc2line", + "\xff" "Source", + "\xff" "Varenv", + "\xff" "Lexenv", + "\xff" "Varmap", + "\xff" "Formals", + "\xff" "Bytecode", + "\xff" "Next", + "\xff" "Target", + "\xff" "Value", + "pointer", + "buffer", + "\xff" "Tracedata", + "lineNumber", + "fileName", + "pc", + "stack", + "ThrowTypeError", + "Duktape", + "id", + "require", + "__proto__", + "setPrototypeOf", + "ownKeys", + "enumerate", + "deleteProperty", + "has", + "Proxy", + "callee", + "Invalid Date", + "[...]", + "\x0a" "\x09", + " ", + ",", + "-0", + "+0", + "0", + "-Infinity", + "+Infinity", + "Infinity", + "object", + "string", + "number", + "boolean", + "undefined", + "stringify", + "tan", + "sqrt", + "sin", + "round", + "random", + "pow", + "min", + "max", + "log", + "floor", + "exp", + "cos", + "ceil", + "atan2", + "atan", + "asin", + "acos", + "abs", + "SQRT2", + "SQRT1_2", + "PI", + "LOG10E", + "LOG2E", + "LN2", + "LN10", + "E", + "message", + "name", + "input", + "index", + "(?:)", + "lastIndex", + "multiline", + "ignoreCase", + "source", + "test", + "exec", + "toGMTString", + "setYear", + "getYear", + "toJSON", + "toISOString", + "toUTCString", + "setUTCFullYear", + "setFullYear", + "setUTCMonth", + "setMonth", + "setUTCDate", + "setDate", + "setUTCHours", + "setHours", + "setUTCMinutes", + "setMinutes", + "setUTCSeconds", + "setSeconds", + "setUTCMilliseconds", + "setMilliseconds", + "setTime", + "getTimezoneOffset", + "getUTCMilliseconds", + "getMilliseconds", + "getUTCSeconds", + "getSeconds", + "getUTCMinutes", + "getMinutes", + "getUTCHours", + "getHours", + "getUTCDay", + "getDay", + "getUTCDate", + "getDate", + "getUTCMonth", + "getMonth", + "getUTCFullYear", + "getFullYear", + "getTime", + "toLocaleTimeString", + "toLocaleDateString", + "toTimeString", + "toDateString", + "now", + "UTC", + "parse", + "toPrecision", + "toExponential", + "toFixed", + "POSITIVE_INFINITY", + "NEGATIVE_INFINITY", + "NaN", + "MIN_VALUE", + "MAX_VALUE", + "substr", + "trim", + "toLocaleUpperCase", + "toUpperCase", + "toLocaleLowerCase", + "toLowerCase", + "substring", + "split", + "search", + "replace", + "match", + "localeCompare", + "charCodeAt", + "charAt", + "fromCharCode", + "reduceRight", + "reduce", + "filter", + "map", + "forEach", + "some", + "every", + "lastIndexOf", + "indexOf", + "unshift", + "splice", + "sort", + "slice", + "shift", + "reverse", + "push", + "pop", + "join", + "concat", + "isArray", + "arguments", + "caller", + "bind", + "call", + "apply", + "propertyIsEnumerable", + "isPrototypeOf", + "hasOwnProperty", + "valueOf", + "toLocaleString", + "toString", + "constructor", + "set", + "get", + "enumerable", + "configurable", + "writable", + "value", + "keys", + "isExtensible", + "isFrozen", + "isSealed", + "preventExtensions", + "freeze", + "seal", + "defineProperties", + "defineProperty", + "create", + "getOwnPropertyNames", + "getOwnPropertyDescriptor", + "getPrototypeOf", + "prototype", + "length", + "alert", + "print", + "unescape", + "escape", + "encodeURIComponent", + "encodeURI", + "decodeURIComponent", + "decodeURI", + "isFinite", + "isNaN", + "parseFloat", + "parseInt", + "eval", + "URIError", + "TypeError", + "SyntaxError", + "ReferenceError", + "RangeError", + "EvalError", + "break", + "case", + "catch", + "continue", + "debugger", + "default", + "delete", + "do", + "else", + "finally", + "for", + "function", + "if", + "in", + "instanceof", + "new", + "return", + "switch", + "this", + "throw", + "try", + "typeof", + "var", + "void", + "while", + "with", + "class", + "const", + "enum", + "export", + "extends", + "import", + "super", + "null", + "true", + "false", + "implements", + "interface", + "let", + "package", + "private", + "protected", + "public", + "static", + "yield", + + /* + * These strings are manually added, and would be gathered in some + * application specific manner. + */ + + "foo", + "bar", + "quux", + "enableFrob", + "disableFrob" + /* ... */ +}; + +const void *ajsheap_extstr_check_2(const void *ptr, duk_size_t len) { + int i, n; + + (void) safe_print_chars; /* potentially unused */ + + /* Linear scan. An actual implementation would need some acceleration + * structure, e.g. select a sublist based on first character. + * + * NOTE: input string (behind 'ptr' with 'len' bytes) DOES NOT have a + * trailing NUL character. Any strings returned from this function + * MUST have a trailing NUL character. + */ + + n = (int) (sizeof(strdata_duk_builtin_strings) / sizeof(const char *)); + for (i = 0; i < n; i++) { + const char *str; + + str = strdata_duk_builtin_strings[i]; + if (strlen(str) == len && memcmp(ptr, (const void *) str, len) == 0) { +#if 0 + printf("ajsheap_extstr_check_2: ptr=%p, len=%ld ", + (void *) ptr, (long) len); + safe_print_chars((const char *) ptr, len, 0 /*until_nul*/); + printf(" -> constant string index %ld\n", (long) i); +#endif + return (void *) strdata_duk_builtin_strings[i]; + } + } + +#if 0 + printf("ajsheap_extstr_check_2: ptr=%p, len=%ld ", + (void *) ptr, (long) len); + safe_print_chars((const char *) ptr, len, 0 /*until_nul*/); + printf(" -> not found\n"); +#endif + return NULL; +} + +void ajsheap_extstr_free_2(const void *ptr) { + (void) ptr; +#if 0 + printf("ajsheap_extstr_free_2: freeing extstr %p -> ", ptr); + safe_print_chars((const char *) ptr, DUK_SIZE_MAX, 1 /*until_nul*/); + printf("\n"); +#endif +} + +/* + * External strings strategy intended for valgrind testing: external strings + * are allocated using malloc()/free() so that valgrind can be used to ensure + * that strings are e.g. freed exactly once. + */ + +const void *ajsheap_extstr_check_3(const void *ptr, duk_size_t len) { + duk_uint8_t *ret; + + (void) safe_print_chars; /* potentially unused */ + + ret = malloc((size_t) len + 1); + if (ret == NULL) { +#if 0 + printf("ajsheap_extstr_check_3: ptr=%p, len=%ld ", + (void *) ptr, (long) len); + safe_print_chars((const char *) ptr, len, 0 /*until_nul*/); + printf(" -> malloc failed, return NULL\n"); +#endif + return (const void *) NULL; + } + + if (len > 0) { + memcpy((void *) ret, ptr, (size_t) len); + } + ret[len] = (duk_uint8_t) 0; + +#if 0 + printf("ajsheap_extstr_check_3: ptr=%p, len=%ld ", + (void *) ptr, (long) len); + safe_print_chars((const char *) ptr, len, 0 /*until_nul*/); + printf(" -> %p\n", (void *) ret); +#endif + return (const void *) ret; +} + +void ajsheap_extstr_free_3(const void *ptr) { + (void) ptr; +#if 0 + printf("ajsheap_extstr_free_3: freeing extstr %p -> ", ptr); + safe_print_chars((const char *) ptr, DUK_SIZE_MAX, 1 /*until_nul*/); + printf("\n"); +#endif + free((void *) ptr); +} + +/* + * Execution timeout example + */ + +#define AJSHEAP_EXEC_TIMEOUT 5 /* seconds */ + +static time_t curr_pcall_start = 0; +static long exec_timeout_check_counter = 0; + +void ajsheap_start_exec_timeout(void) { + curr_pcall_start = time(NULL); +} + +void ajsheap_clear_exec_timeout(void) { + curr_pcall_start = 0; +} + +duk_bool_t ajsheap_exec_timeout_check(void *udata) { + time_t now = time(NULL); + time_t diff = now - curr_pcall_start; + + (void) udata; /* not needed */ + + exec_timeout_check_counter++; +#if 0 + printf("exec timeout check %ld: now=%ld, start=%ld, diff=%ld\n", + (long) exec_timeout_check_counter, (long) now, (long) curr_pcall_start, (long) diff); + fflush(stdout); +#endif + + if (curr_pcall_start == 0) { + /* protected call not yet running */ + return 0; + } + if (diff > AJSHEAP_EXEC_TIMEOUT) { + return 1; + } + return 0; +} + +#else /* DUK_CMDLINE_AJSHEAP */ + +int ajs_dummy = 0; /* to avoid empty source file */ + +#endif /* DUK_CMDLINE_AJSHEAP */ diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/README.rst new file mode 100644 index 00000000..98b53d26 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/README.rst @@ -0,0 +1,8 @@ +Codepage conversion example +=========================== + +Example of how to convert an 8-bit input string (e.g. ISO-8859-1 or Windows +codepage 1252) into CESU-8 without using an external library like iconv. + +This is useful e.g. when compiling non-UTF-8 source code which cannot be +converted to UTF-8 (CESU-8) at build time. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/duk_codepage_conv.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/duk_codepage_conv.c new file mode 100644 index 00000000..932e9a60 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/duk_codepage_conv.c @@ -0,0 +1,54 @@ +/* + * Convert an 8-bit input string (e.g. ISO-8859-1) into CESU-8. + * Calling code supplies the "code page" as a 256-entry array of + * codepoints for the conversion. + * + * This is useful when input data is in non-UTF-8 format and must + * be converted at runtime, e.g. when compiling non-UTF-8 source + * code. Another alternative is to use e.g. iconv. + */ + +#include "duktape.h" + +/* Decode an 8-bit string using 'codepage' into Unicode codepoints and + * re-encode into CESU-8. Codepage argument must point to a 256-entry + * table. Only supports BMP (codepoints U+0000 to U+FFFF). + */ +void duk_decode_string_codepage(duk_context *ctx, const char *str, size_t len, unsigned int *codepage) { + unsigned char *tmp; + size_t tmplen, i; + unsigned char *p; + unsigned int cp; + + tmplen = 3 * len; /* max expansion is 1 input byte -> 3 output bytes */ + if (tmplen / 3 != len) { + /* Temporary buffer length wraps. */ + duk_error(ctx, DUK_ERR_RANGE_ERROR, "input string too long"); + return; + } + + tmp = (unsigned char *) duk_push_fixed_buffer(ctx, tmplen); + + for (i = 0, p = tmp; i < len; i++) { + cp = codepage[((unsigned char *) str)[i]] & 0xffffUL; + if (cp < 0x80UL) { + *p++ = (unsigned char) cp; + } else if (cp < 0x800UL) { + *p++ = (unsigned char) (0xc0 + ((cp >> 6) & 0x1f)); + *p++ = (unsigned char) (0x80 + (cp & 0x3f)); + } else { + /* In CESU-8 all codepoints in [0x0000,0xFFFF] are + * allowed, including surrogates. + */ + *p++ = (unsigned char) (0xe0 + ((cp >> 12) & 0x0f)); + *p++ = (unsigned char) (0x80 + ((cp >> 6) & 0x3f)); + *p++ = (unsigned char) (0x80 + (cp & 0x3f)); + } + } + + duk_push_lstring(ctx, (const char *) tmp, (duk_size_t) (p - tmp)); + + /* [ ... tmp res ] */ + + duk_remove(ctx, -2); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/duk_codepage_conv.h b/3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/duk_codepage_conv.h new file mode 100644 index 00000000..d2705a0d --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/duk_codepage_conv.h @@ -0,0 +1,8 @@ +#ifndef DUK_CODEPAGE_CONV_H_INCLUDED +#define DUK_CODEPAGE_CONV_H_INCLUDED + +#include "duktape.h" + +void duk_decode_string_codepage(duk_context *ctx, const char *str, size_t len, unsigned int *codepage); + +#endif /* DUK_CODEPAGE_CONV_H_INCLUDED */ diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/test.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/test.c new file mode 100644 index 00000000..c34299a8 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/codepage-conv/test.c @@ -0,0 +1,286 @@ +#include "duktape.h" +#include "duk_codepage_conv.h" + +/* http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT */ +unsigned int cp1252[256] = { + (unsigned int) 0x0000, + (unsigned int) 0x0001, + (unsigned int) 0x0002, + (unsigned int) 0x0003, + (unsigned int) 0x0004, + (unsigned int) 0x0005, + (unsigned int) 0x0006, + (unsigned int) 0x0007, + (unsigned int) 0x0008, + (unsigned int) 0x0009, + (unsigned int) 0x000A, + (unsigned int) 0x000B, + (unsigned int) 0x000C, + (unsigned int) 0x000D, + (unsigned int) 0x000E, + (unsigned int) 0x000F, + (unsigned int) 0x0010, + (unsigned int) 0x0011, + (unsigned int) 0x0012, + (unsigned int) 0x0013, + (unsigned int) 0x0014, + (unsigned int) 0x0015, + (unsigned int) 0x0016, + (unsigned int) 0x0017, + (unsigned int) 0x0018, + (unsigned int) 0x0019, + (unsigned int) 0x001A, + (unsigned int) 0x001B, + (unsigned int) 0x001C, + (unsigned int) 0x001D, + (unsigned int) 0x001E, + (unsigned int) 0x001F, + (unsigned int) 0x0020, + (unsigned int) 0x0021, + (unsigned int) 0x0022, + (unsigned int) 0x0023, + (unsigned int) 0x0024, + (unsigned int) 0x0025, + (unsigned int) 0x0026, + (unsigned int) 0x0027, + (unsigned int) 0x0028, + (unsigned int) 0x0029, + (unsigned int) 0x002A, + (unsigned int) 0x002B, + (unsigned int) 0x002C, + (unsigned int) 0x002D, + (unsigned int) 0x002E, + (unsigned int) 0x002F, + (unsigned int) 0x0030, + (unsigned int) 0x0031, + (unsigned int) 0x0032, + (unsigned int) 0x0033, + (unsigned int) 0x0034, + (unsigned int) 0x0035, + (unsigned int) 0x0036, + (unsigned int) 0x0037, + (unsigned int) 0x0038, + (unsigned int) 0x0039, + (unsigned int) 0x003A, + (unsigned int) 0x003B, + (unsigned int) 0x003C, + (unsigned int) 0x003D, + (unsigned int) 0x003E, + (unsigned int) 0x003F, + (unsigned int) 0x0040, + (unsigned int) 0x0041, + (unsigned int) 0x0042, + (unsigned int) 0x0043, + (unsigned int) 0x0044, + (unsigned int) 0x0045, + (unsigned int) 0x0046, + (unsigned int) 0x0047, + (unsigned int) 0x0048, + (unsigned int) 0x0049, + (unsigned int) 0x004A, + (unsigned int) 0x004B, + (unsigned int) 0x004C, + (unsigned int) 0x004D, + (unsigned int) 0x004E, + (unsigned int) 0x004F, + (unsigned int) 0x0050, + (unsigned int) 0x0051, + (unsigned int) 0x0052, + (unsigned int) 0x0053, + (unsigned int) 0x0054, + (unsigned int) 0x0055, + (unsigned int) 0x0056, + (unsigned int) 0x0057, + (unsigned int) 0x0058, + (unsigned int) 0x0059, + (unsigned int) 0x005A, + (unsigned int) 0x005B, + (unsigned int) 0x005C, + (unsigned int) 0x005D, + (unsigned int) 0x005E, + (unsigned int) 0x005F, + (unsigned int) 0x0060, + (unsigned int) 0x0061, + (unsigned int) 0x0062, + (unsigned int) 0x0063, + (unsigned int) 0x0064, + (unsigned int) 0x0065, + (unsigned int) 0x0066, + (unsigned int) 0x0067, + (unsigned int) 0x0068, + (unsigned int) 0x0069, + (unsigned int) 0x006A, + (unsigned int) 0x006B, + (unsigned int) 0x006C, + (unsigned int) 0x006D, + (unsigned int) 0x006E, + (unsigned int) 0x006F, + (unsigned int) 0x0070, + (unsigned int) 0x0071, + (unsigned int) 0x0072, + (unsigned int) 0x0073, + (unsigned int) 0x0074, + (unsigned int) 0x0075, + (unsigned int) 0x0076, + (unsigned int) 0x0077, + (unsigned int) 0x0078, + (unsigned int) 0x0079, + (unsigned int) 0x007A, + (unsigned int) 0x007B, + (unsigned int) 0x007C, + (unsigned int) 0x007D, + (unsigned int) 0x007E, + (unsigned int) 0x007F, + (unsigned int) 0x20AC, + (unsigned int) 0xFFFD, /* undefined */ + (unsigned int) 0x201A, + (unsigned int) 0x0192, + (unsigned int) 0x201E, + (unsigned int) 0x2026, + (unsigned int) 0x2020, + (unsigned int) 0x2021, + (unsigned int) 0x02C6, + (unsigned int) 0x2030, + (unsigned int) 0x0160, + (unsigned int) 0x2039, + (unsigned int) 0x0152, + (unsigned int) 0xFFFD, /* undefined */ + (unsigned int) 0x017D, + (unsigned int) 0xFFFD, /* undefined */ + (unsigned int) 0xFFFD, /* undefined */ + (unsigned int) 0x2018, + (unsigned int) 0x2019, + (unsigned int) 0x201C, + (unsigned int) 0x201D, + (unsigned int) 0x2022, + (unsigned int) 0x2013, + (unsigned int) 0x2014, + (unsigned int) 0x02DC, + (unsigned int) 0x2122, + (unsigned int) 0x0161, + (unsigned int) 0x203A, + (unsigned int) 0x0153, + (unsigned int) 0xFFFD, /* undefined */ + (unsigned int) 0x017E, + (unsigned int) 0x0178, + (unsigned int) 0x00A0, + (unsigned int) 0x00A1, + (unsigned int) 0x00A2, + (unsigned int) 0x00A3, + (unsigned int) 0x00A4, + (unsigned int) 0x00A5, + (unsigned int) 0x00A6, + (unsigned int) 0x00A7, + (unsigned int) 0x00A8, + (unsigned int) 0x00A9, + (unsigned int) 0x00AA, + (unsigned int) 0x00AB, + (unsigned int) 0x00AC, + (unsigned int) 0x00AD, + (unsigned int) 0x00AE, + (unsigned int) 0x00AF, + (unsigned int) 0x00B0, + (unsigned int) 0x00B1, + (unsigned int) 0x00B2, + (unsigned int) 0x00B3, + (unsigned int) 0x00B4, + (unsigned int) 0x00B5, + (unsigned int) 0x00B6, + (unsigned int) 0x00B7, + (unsigned int) 0x00B8, + (unsigned int) 0x00B9, + (unsigned int) 0x00BA, + (unsigned int) 0x00BB, + (unsigned int) 0x00BC, + (unsigned int) 0x00BD, + (unsigned int) 0x00BE, + (unsigned int) 0x00BF, + (unsigned int) 0x00C0, + (unsigned int) 0x00C1, + (unsigned int) 0x00C2, + (unsigned int) 0x00C3, + (unsigned int) 0x00C4, + (unsigned int) 0x00C5, + (unsigned int) 0x00C6, + (unsigned int) 0x00C7, + (unsigned int) 0x00C8, + (unsigned int) 0x00C9, + (unsigned int) 0x00CA, + (unsigned int) 0x00CB, + (unsigned int) 0x00CC, + (unsigned int) 0x00CD, + (unsigned int) 0x00CE, + (unsigned int) 0x00CF, + (unsigned int) 0x00D0, + (unsigned int) 0x00D1, + (unsigned int) 0x00D2, + (unsigned int) 0x00D3, + (unsigned int) 0x00D4, + (unsigned int) 0x00D5, + (unsigned int) 0x00D6, + (unsigned int) 0x00D7, + (unsigned int) 0x00D8, + (unsigned int) 0x00D9, + (unsigned int) 0x00DA, + (unsigned int) 0x00DB, + (unsigned int) 0x00DC, + (unsigned int) 0x00DD, + (unsigned int) 0x00DE, + (unsigned int) 0x00DF, + (unsigned int) 0x00E0, + (unsigned int) 0x00E1, + (unsigned int) 0x00E2, + (unsigned int) 0x00E3, + (unsigned int) 0x00E4, + (unsigned int) 0x00E5, + (unsigned int) 0x00E6, + (unsigned int) 0x00E7, + (unsigned int) 0x00E8, + (unsigned int) 0x00E9, + (unsigned int) 0x00EA, + (unsigned int) 0x00EB, + (unsigned int) 0x00EC, + (unsigned int) 0x00ED, + (unsigned int) 0x00EE, + (unsigned int) 0x00EF, + (unsigned int) 0x00F0, + (unsigned int) 0x00F1, + (unsigned int) 0x00F2, + (unsigned int) 0x00F3, + (unsigned int) 0x00F4, + (unsigned int) 0x00F5, + (unsigned int) 0x00F6, + (unsigned int) 0x00F7, + (unsigned int) 0x00F8, + (unsigned int) 0x00F9, + (unsigned int) 0x00FA, + (unsigned int) 0x00FB, + (unsigned int) 0x00FC, + (unsigned int) 0x00FD, + (unsigned int) 0x00FE, + (unsigned int) 0x00FF +}; + +/* Exercise all 3 byte lengths: any ASCII character is 1 byte, 0xFC maps to + * U+00FC which is 2 bytes, and 0x80 maps to U+20AC which is 3 bytes. + */ +static const char *example_source = "print('Hello w\xfcrld - \x80');"; + +/* Example: compile and run test source encoded in Windows codepage 1252. */ +int main(int argc, char *argv[]) { + duk_context *ctx; + + (void) argc; (void) argv; + + ctx = duk_create_heap_default(); + if (!ctx) { + printf("Failed to create Duktape heap.\n"); + return 1; + } + + duk_decode_string_codepage(ctx, example_source, strlen(example_source), cp1252); + duk_eval_noresult(ctx); + + duk_destroy_heap(ctx); + return 0; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/README.rst new file mode 100644 index 00000000..f1475226 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/README.rst @@ -0,0 +1,10 @@ +===================== +Coffeescript examples +===================== + +A few tests to see how CoffeeScript works with Duktape. Just convert the +Coffeescript files to Javascript with the ``Makefile.coffee`` in the +distributable, or manually:: + + $ coffee -c hello.coffee + $ cat hello.js diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/globals.coffee b/3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/globals.coffee new file mode 100644 index 00000000..25773cd8 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/globals.coffee @@ -0,0 +1,7 @@ + +print '*** All globals' +print(name) for name in Object.getOwnPropertyNames(this) + +print '*** Globals with a short name (<= 8 chars)' +print(name) for name in Object.getOwnPropertyNames(this) when name.length <= 8 + diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/hello.coffee b/3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/hello.coffee new file mode 100644 index 00000000..088ed8d7 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/hello.coffee @@ -0,0 +1,2 @@ +print 'Hello world!' +print 'version: ' + Duktape.version diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/mandel.coffee b/3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/mandel.coffee new file mode 100644 index 00000000..8e3e170f --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/coffee/mandel.coffee @@ -0,0 +1,28 @@ +mandel = (x0, y0, x1, y1, w, h, maxiter) -> + [dx, dy] = [(x1 - x0) / w, (y1 - y0) / h] + res = [] + + y = y0 + for yc in [0..h-1] + x = x0 + for xc in [0..w-1] + [xx, yy] = [x, y] + c = '*' + for i in [0..maxiter-1] + # (xx+i*yy)^2 + (x+i*y) = xx^2 + i*2*xx*yy - yy^2 + x + i*y + # = (xx^2 - yy^2 + x) + i*(2*xx*yy + y) + [xx2, yy2] = [xx*xx, yy*yy] + if xx2 + yy2 >= 4.0 + c = '.' + break + [xx, yy] = [xx2 - yy2 + x, 2*xx*yy + y] + res.push(c) + x += dx + res.push('\n') + y += dy + + print(res.join('')) + return + +mandel(-2, 2, 2, -2, 200, 100, 1000) + diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/Makefile b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/Makefile new file mode 100644 index 00000000..9d9d0b58 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/Makefile @@ -0,0 +1,17 @@ +# Set DUKTAPE_SRC to 'src' dir of Duktape distributable. +# The default is for the dist environment. +DUKTAPE_SRC=../../src +DUKTAPE_OPTS= +DUKTAPE_OPTS+=-DDUK_OPT_ASSERTIONS +DUKTAPE_OPTS+=-DDUK_OPT_DEBUGGER_SUPPORT -DDUK_OPT_INTERRUPT_COUNTER +DUKTAPE_OPTS+=-DDUK_OPT_DEBUGGER_FWD_PRINTALERT +DUKTAPE_OPTS+=-DDUK_OPT_DEBUGGER_DUMPHEAP +#DUKTAPE_OPTS+=-DDUK_OPT_DEBUGGER_TRANSPORT_TORTURE +TRANS_OPTS= +#TRANS_OPTS+=-DDEBUG_PRINTS + +test: test.c duk_trans_dvalue.c duk_trans_dvalue.h + echo $(DUKTAPE_SRC) + gcc -O0 -g -ggdb -Wall -Wextra -std=c99 -o test -I$(DUKTAPE_SRC) -I. \ + $(DUKTAPE_OPTS) $(TRANS_OPTS) \ + $(DUKTAPE_SRC)/duktape.c duk_trans_dvalue.c test.c -lm diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/README.rst new file mode 100644 index 00000000..86b2bb59 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/README.rst @@ -0,0 +1,8 @@ +=========================================================== +Debug transport with local debug protocol encoding/decoding +=========================================================== + +This example implements a debug transport which decodes/encodes the Duktape +debug protocol locally into a more easy to use C interface, which is useful +for debug clients implemented locally on the target. The example also +demonstrates how to trial parse dvalues in C. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/duk_trans_dvalue.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/duk_trans_dvalue.c new file mode 100644 index 00000000..8470a5f4 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/duk_trans_dvalue.c @@ -0,0 +1,1239 @@ +/* + * Example debug transport with a local debug message encoder/decoder. + * + * Provides a "received dvalue" callback for a fully parsed dvalue (user + * code frees dvalue) and a "cooperate" callback for e.g. UI integration. + * There are a few other callbacks. See test.c for usage examples. + * + * This transport implementation is not multithreaded which means that: + * + * - Callbacks to "received dvalue" callback come from the Duktape thread, + * either during normal execution or from duk_debugger_cooperate(). + * + * - Calls into duk_trans_dvalue_send() must be made from the callbacks + * provided (e.g. "received dvalue" or "cooperate") which use the active + * Duktape thread. + * + * - The only exception to this is when Duktape is idle: you can then call + * duk_trans_dvalue_send() from any thread (only one thread at a time). + * When you next call into Duktape or call duk_debugger_cooperate(), the + * queued data will be read and processed by Duktape. + * + * There are functions for creating and freeing values; internally they use + * malloc() and free() for memory management. Duktape heap alloc functions + * are not used to minimize disturbances to the Duktape heap under debugging. + * + * Doesn't depend on C99 types; assumes "int" is at least 32 bits, and makes + * a few assumptions about format specifiers. + */ + +#include +#include +#include + +#include "duktape.h" +#include "duk_trans_dvalue.h" + +/* Define to enable debug prints to stderr. */ +#if 0 +#define DEBUG_PRINTS +#endif + +/* Define to enable error prints to stderr. */ +#if 1 +#define ERROR_PRINTS +#endif + +/* + * Dvalue handling + */ + +duk_dvalue *duk_dvalue_alloc(void) { + duk_dvalue *dv = (duk_dvalue *) malloc(sizeof(duk_dvalue)); + if (dv) { + memset((void *) dv, 0, sizeof(duk_dvalue)); + dv->buf = NULL; + } + return dv; +} + +void duk_dvalue_free(duk_dvalue *dv) { + if (dv) { + free(dv->buf); /* tolerates NULL */ + dv->buf = NULL; + free(dv); + } +} + +static void duk__dvalue_bufesc(duk_dvalue *dv, char *buf, size_t maxbytes, int stresc) { + size_t i, limit; + + *buf = (char) 0; + limit = dv->len > maxbytes ? maxbytes : dv->len; + for (i = 0; i < limit; i++) { + unsigned char c = dv->buf[i]; + if (stresc) { + if (c >= 0x20 && c <= 0x7e && c != (char) '"' && c != (char) '\'') { + sprintf(buf, "%c", c); + buf++; + } else { + sprintf(buf, "\\x%02x", (unsigned int) c); + buf += 4; + } + } else { + sprintf(buf, "%02x", (unsigned int) c); + buf += 2; + } + } + if (dv->len > maxbytes) { + sprintf(buf, "..."); + buf += 3; + } +} + +/* Caller must provide a buffer at least DUK_DVALUE_TOSTRING_BUFLEN in size. */ +void duk_dvalue_to_string(duk_dvalue *dv, char *buf) { + char hexbuf[32 * 4 + 4]; /* 32 hex encoded or \xXX escaped bytes, possible "...", NUL */ + + if (!dv) { + sprintf(buf, "NULL"); + return; + } + + switch (dv->tag) { + case DUK_DVALUE_EOM: + sprintf(buf, "EOM"); + break; + case DUK_DVALUE_REQ: + sprintf(buf, "REQ"); + break; + case DUK_DVALUE_REP: + sprintf(buf, "REP"); + break; + case DUK_DVALUE_ERR: + sprintf(buf, "ERR"); + break; + case DUK_DVALUE_NFY: + sprintf(buf, "NFY"); + break; + case DUK_DVALUE_INTEGER: + sprintf(buf, "%d", dv->i); + break; + case DUK_DVALUE_STRING: + duk__dvalue_bufesc(dv, hexbuf, 32, 1); + sprintf(buf, "str:%ld:\"%s\"", (long) dv->len, hexbuf); + break; + case DUK_DVALUE_BUFFER: + duk__dvalue_bufesc(dv, hexbuf, 32, 0); + sprintf(buf, "buf:%ld:%s", (long) dv->len, hexbuf); + break; + case DUK_DVALUE_UNUSED: + sprintf(buf, "undefined"); + break; + case DUK_DVALUE_UNDEFINED: + sprintf(buf, "undefined"); + break; + case DUK_DVALUE_NULL: + sprintf(buf, "null"); + break; + case DUK_DVALUE_TRUE: + sprintf(buf, "true"); + break; + case DUK_DVALUE_FALSE: + sprintf(buf, "false"); + break; + case DUK_DVALUE_NUMBER: + if (fpclassify(dv->d) == FP_ZERO) { + if (signbit(dv->d)) { + sprintf(buf, "-0"); + } else { + sprintf(buf, "0"); + } + } else { + sprintf(buf, "%lg", dv->d); + } + break; + case DUK_DVALUE_OBJECT: + duk__dvalue_bufesc(dv, hexbuf, 32, 0); + sprintf(buf, "obj:%d:%s", (int) dv->i, hexbuf); + break; + case DUK_DVALUE_POINTER: + duk__dvalue_bufesc(dv, hexbuf, 32, 0); + sprintf(buf, "ptr:%s", hexbuf); + break; + case DUK_DVALUE_LIGHTFUNC: + duk__dvalue_bufesc(dv, hexbuf, 32, 0); + sprintf(buf, "lfunc:%04x:%s", (unsigned int) dv->i, hexbuf); + break; + case DUK_DVALUE_HEAPPTR: + duk__dvalue_bufesc(dv, hexbuf, 32, 0); + sprintf(buf, "heapptr:%s", hexbuf); + break; + default: + sprintf(buf, "unknown:%d", (int) dv->tag); + } +} + +duk_dvalue *duk_dvalue_make_tag(int tag) { + duk_dvalue *dv = duk_dvalue_alloc(); + if (!dv) { return NULL; } + dv->tag = tag; + return dv; +} + +duk_dvalue *duk_dvalue_make_tag_int(int tag, int intval) { + duk_dvalue *dv = duk_dvalue_alloc(); + if (!dv) { return NULL; } + dv->tag = tag; + dv->i = intval; + return dv; +} + +duk_dvalue *duk_dvalue_make_tag_double(int tag, double dblval) { + duk_dvalue *dv = duk_dvalue_alloc(); + if (!dv) { return NULL; } + dv->tag = tag; + dv->d = dblval; + return dv; +} + +duk_dvalue *duk_dvalue_make_tag_data(int tag, const char *buf, size_t len) { + unsigned char *p; + duk_dvalue *dv = duk_dvalue_alloc(); + if (!dv) { return NULL; } + /* Alloc size is len + 1 so that a NUL terminator is always + * guaranteed which is convenient, e.g. you can printf() the + * value safely. + */ + p = (unsigned char *) malloc(len + 1); + if (!p) { + free(dv); + return NULL; + } + memcpy((void *) p, (const void *) buf, len); + p[len] = (unsigned char) 0; + dv->tag = tag; + dv->buf = p; + dv->len = len; + return dv; +} + +duk_dvalue *duk_dvalue_make_tag_int_data(int tag, int intval, const char *buf, size_t len) { + duk_dvalue *dv = duk_dvalue_make_tag_data(tag, buf, len); + if (!dv) { return NULL; } + dv->i = intval; + return dv; +} + +/* + * Dvalue transport handling + */ + +static void duk__trans_dvalue_double_byteswap(duk_trans_dvalue_ctx *ctx, volatile unsigned char *p) { + unsigned char t; + + /* Portable IEEE double byteswap. Relies on runtime detection of + * host endianness. + */ + + if (ctx->double_byteorder == 0) { + /* little endian */ + t = p[0]; p[0] = p[7]; p[7] = t; + t = p[1]; p[1] = p[6]; p[6] = t; + t = p[2]; p[2] = p[5]; p[5] = t; + t = p[3]; p[3] = p[4]; p[4] = t; + } else if (ctx->double_byteorder == 1) { + /* big endian: ok as is */ + ; + } else { + /* mixed endian */ + t = p[0]; p[0] = p[3]; p[3] = t; + t = p[1]; p[1] = p[2]; p[2] = t; + t = p[4]; p[4] = p[7]; p[7] = t; + t = p[5]; p[5] = p[6]; p[6] = t; + } +} + +static unsigned int duk__trans_dvalue_parse_u32(duk_trans_dvalue_ctx *ctx, unsigned char *p) { + /* Integers are network endian, read back into host format in + * a portable manner. + */ + (void) ctx; + return (((unsigned int) p[0]) << 24) + + (((unsigned int) p[1]) << 16) + + (((unsigned int) p[2]) << 8) + + (((unsigned int) p[3]) << 0); +} + +static int duk__trans_dvalue_parse_i32(duk_trans_dvalue_ctx *ctx, unsigned char *p) { + /* Portable sign handling, doesn't assume 'int' is exactly 32 bits + * like a direct cast would. + */ + unsigned int tmp = duk__trans_dvalue_parse_u32(ctx, p); + if (tmp & 0x80000000UL) { + return -((int) ((tmp ^ 0xffffffffUL) + 1UL)); + } else { + return tmp; + } +} + +static unsigned int duk__trans_dvalue_parse_u16(duk_trans_dvalue_ctx *ctx, unsigned char *p) { + /* Integers are network endian, read back into host format. */ + (void) ctx; + return (((unsigned int) p[0]) << 8) + + (((unsigned int) p[1]) << 0); +} + +static double duk__trans_dvalue_parse_double(duk_trans_dvalue_ctx *ctx, unsigned char *p) { + /* IEEE doubles are network endian, read back into host format. */ + volatile union { + double d; + unsigned char b[8]; + } u; + memcpy((void *) u.b, (const void *) p, 8); + duk__trans_dvalue_double_byteswap(ctx, u.b); + return u.d; +} + +static unsigned char *duk__trans_dvalue_encode_u32(duk_trans_dvalue_ctx *ctx, unsigned char *p, unsigned int val) { + /* Integers are written in network endian format. */ + (void) ctx; + *p++ = (unsigned char) ((val >> 24) & 0xff); + *p++ = (unsigned char) ((val >> 16) & 0xff); + *p++ = (unsigned char) ((val >> 8) & 0xff); + *p++ = (unsigned char) (val & 0xff); + return p; +} + +static unsigned char *duk__trans_dvalue_encode_i32(duk_trans_dvalue_ctx *ctx, unsigned char *p, int val) { + return duk__trans_dvalue_encode_u32(ctx, p, (unsigned int) val & 0xffffffffUL); +} + +static unsigned char *duk__trans_dvalue_encode_u16(duk_trans_dvalue_ctx *ctx, unsigned char *p, unsigned int val) { + /* Integers are written in network endian format. */ + (void) ctx; + *p++ = (unsigned char) ((val >> 8) & 0xff); + *p++ = (unsigned char) (val & 0xff); + return p; +} + +static unsigned char *duk__trans_dvalue_encode_double(duk_trans_dvalue_ctx *ctx, unsigned char *p, double val) { + /* IEEE doubles are written in network endian format. */ + volatile union { + double d; + unsigned char b[8]; + } u; + u.d = val; + duk__trans_dvalue_double_byteswap(ctx, u.b); + memcpy((void *) p, (const void *) u.b, 8); + p += 8; + return p; +} + +static unsigned char *duk__trans_buffer_ensure(duk_trans_buffer *dbuf, size_t space) { + size_t avail; + size_t used; + size_t new_size; + void *new_alloc; + + used = dbuf->write_offset; + avail = dbuf->alloc_size - dbuf->write_offset; + + if (avail >= space) { + if (avail - space > 256) { + /* Too big, resize so that we reclaim memory if we have just + * received a large string/buffer value. + */ + goto do_realloc; + } + } else { + /* Too small, resize. */ + goto do_realloc; + } + + return dbuf->base + dbuf->write_offset; + + do_realloc: + new_size = used + space + 256; /* some extra to reduce resizes */ + new_alloc = realloc(dbuf->base, new_size); + if (new_alloc) { + dbuf->base = (unsigned char *) new_alloc; + dbuf->alloc_size = new_size; +#if defined(DEBUG_PRINTS) + fprintf(stderr, "%s: resized buffer %p to %ld bytes, read_offset=%ld, write_offset=%ld\n", + __func__, (void *) dbuf, (long) new_size, (long) dbuf->read_offset, (long) dbuf->write_offset); + fflush(stderr); +#endif + return dbuf->base + dbuf->write_offset; + } else { + return NULL; + } +} + +/* When read_offset is large enough, "rebase" buffer by deleting already + * read data and updating offsets. + */ +static void duk__trans_buffer_rebase(duk_trans_buffer *dbuf) { + if (dbuf->read_offset > 64) { +#if defined(DEBUG_PRINTS) + fprintf(stderr, "%s: rebasing buffer %p, read_offset=%ld, write_offset=%ld\n", + __func__, (void *) dbuf, (long) dbuf->read_offset, (long) dbuf->write_offset); + fflush(stderr); +#endif + if (dbuf->write_offset > dbuf->read_offset) { + memmove((void *) dbuf->base, (const void *) (dbuf->base + dbuf->read_offset), dbuf->write_offset - dbuf->read_offset); + } + dbuf->write_offset -= dbuf->read_offset; + dbuf->read_offset = 0; + } +} + +duk_trans_dvalue_ctx *duk_trans_dvalue_init(void) { + volatile union { + double d; + unsigned char b[8]; + } u; + duk_trans_dvalue_ctx *ctx = NULL; + + ctx = (duk_trans_dvalue_ctx *) malloc(sizeof(duk_trans_dvalue_ctx)); + if (!ctx) { goto fail; } + memset((void *) ctx, 0, sizeof(duk_trans_dvalue_ctx)); + ctx->received = NULL; + ctx->cooperate = NULL; + ctx->handshake = NULL; + ctx->detached = NULL; + ctx->send_buf.base = NULL; + ctx->recv_buf.base = NULL; + + ctx->send_buf.base = malloc(256); + if (!ctx->send_buf.base) { goto fail; } + ctx->send_buf.alloc_size = 256; + + ctx->recv_buf.base = malloc(256); + if (!ctx->recv_buf.base) { goto fail; } + ctx->recv_buf.alloc_size = 256; + + /* IEEE double byte order, detect at run time (could also use + * preprocessor defines but that's verbose to make portable). + * + * >>> struct.unpack('>d', '1122334455667788'.decode('hex')) + * (3.841412024471731e-226,) + * >>> struct.unpack('>d', '8877665544332211'.decode('hex')) + * (-7.086876636573014e-268,) + * >>> struct.unpack('>d', '4433221188776655'.decode('hex')) + * (3.5294303071877444e+20,) + */ + u.b[0] = 0x11; u.b[1] = 0x22; u.b[2] = 0x33; u.b[3] = 0x44; + u.b[4] = 0x55; u.b[5] = 0x66; u.b[6] = 0x77; u.b[7] = 0x88; + if (u.d < 0.0) { + ctx->double_byteorder = 0; /* little endian */ + } else if (u.d < 1.0) { + ctx->double_byteorder = 1; /* big endian */ + } else { + ctx->double_byteorder = 2; /* mixed endian (arm) */ + } +#if defined(DEBUG_PRINTS) + fprintf(stderr, "double endianness test value is %lg -> byteorder %d\n", + u.d, ctx->double_byteorder); + fflush(stderr); +#endif + + return ctx; + + fail: + if (ctx) { + free(ctx->recv_buf.base); /* tolerates NULL */ + free(ctx->send_buf.base); /* tolerates NULL */ + free(ctx); + } + return NULL; +} + +void duk_trans_dvalue_free(duk_trans_dvalue_ctx *ctx) { + if (ctx) { + free(ctx->send_buf.base); /* tolerates NULL */ + free(ctx->recv_buf.base); /* tolerates NULL */ + free(ctx); + } +} + +void duk_trans_dvalue_send(duk_trans_dvalue_ctx *ctx, duk_dvalue *dv) { + unsigned char *p; + + /* Convert argument dvalue into Duktape debug protocol format. + * Literal constants are used here for the debug protocol, + * e.g. initial byte 0x02 is REP, see doc/debugger.rst. + */ + +#if defined(DEBUG_PRINTS) + { + char buf[DUK_DVALUE_TOSTRING_BUFLEN]; + duk_dvalue_to_string(dv, buf); + fprintf(stderr, "%s: sending dvalue: %s\n", __func__, buf); + fflush(stderr); + } +#endif + + switch (dv->tag) { + case DUK_DVALUE_EOM: { + p = duk__trans_buffer_ensure(&ctx->send_buf, 1); + if (!p) { goto alloc_error; } + *p++ = 0x00; + ctx->send_buf.write_offset += 1; + break; + } + case DUK_DVALUE_REQ: { + p = duk__trans_buffer_ensure(&ctx->send_buf, 1); + if (!p) { goto alloc_error; } + *p++ = 0x01; + ctx->send_buf.write_offset += 1; + break; + } + case DUK_DVALUE_REP: { + p = duk__trans_buffer_ensure(&ctx->send_buf, 1); + if (!p) { goto alloc_error; } + *p++ = 0x02; + ctx->send_buf.write_offset += 1; + break; + } + case DUK_DVALUE_ERR: { + p = duk__trans_buffer_ensure(&ctx->send_buf, 1); + if (!p) { goto alloc_error; } + *p++ = 0x03; + ctx->send_buf.write_offset += 1; + break; + } + case DUK_DVALUE_NFY: { + p = duk__trans_buffer_ensure(&ctx->send_buf, 1); + if (!p) { goto alloc_error; } + *p++ = 0x04; + ctx->send_buf.write_offset += 1; + break; + } + case DUK_DVALUE_INTEGER: { + int i = dv->i; + if (i >= 0 && i <= 63) { + p = duk__trans_buffer_ensure(&ctx->send_buf, 1); + if (!p) { goto alloc_error; } + *p++ = (unsigned char) (0x80 + i); + ctx->send_buf.write_offset += 1; + } else if (i >= 0 && i <= 16383L) { + p = duk__trans_buffer_ensure(&ctx->send_buf, 2); + if (!p) { goto alloc_error; } + *p++ = (unsigned char) (0xc0 + (i >> 8)); + *p++ = (unsigned char) (i & 0xff); + ctx->send_buf.write_offset += 2; + } else if (i >= -0x80000000L && i <= 0x7fffffffL) { /* Harmless warning on some platforms (re: range) */ + p = duk__trans_buffer_ensure(&ctx->send_buf, 5); + if (!p) { goto alloc_error; } + *p++ = 0x10; + p = duk__trans_dvalue_encode_i32(ctx, p, i); + ctx->send_buf.write_offset += 5; + } else { + goto dvalue_error; + } + break; + } + case DUK_DVALUE_STRING: { + size_t i = dv->len; + if (i <= 0x1fUL) { + p = duk__trans_buffer_ensure(&ctx->send_buf, 1 + i); + if (!p) { goto alloc_error; } + *p++ = (unsigned char) (0x60 + i); + memcpy((void *) p, (const void *) dv->buf, i); + p += i; + ctx->send_buf.write_offset += 1 + i; + } else if (i <= 0xffffUL) { + p = duk__trans_buffer_ensure(&ctx->send_buf, 3 + i); + if (!p) { goto alloc_error; } + *p++ = 0x12; + p = duk__trans_dvalue_encode_u16(ctx, p, (unsigned int) i); + memcpy((void *) p, (const void *) dv->buf, i); + p += i; + ctx->send_buf.write_offset += 3 + i; + } else if (i <= 0xffffffffUL) { + p = duk__trans_buffer_ensure(&ctx->send_buf, 5 + i); + if (!p) { goto alloc_error; } + *p++ = 0x11; + p = duk__trans_dvalue_encode_u32(ctx, p, (unsigned int) i); + memcpy((void *) p, (const void *) dv->buf, i); + p += i; + ctx->send_buf.write_offset += 5 + i; + } else { + goto dvalue_error; + } + break; + } + case DUK_DVALUE_BUFFER: { + size_t i = dv->len; + if (i <= 0xffffUL) { + p = duk__trans_buffer_ensure(&ctx->send_buf, 3 + i); + if (!p) { goto alloc_error; } + *p++ = 0x14; + p = duk__trans_dvalue_encode_u16(ctx, p, (unsigned int) i); + memcpy((void *) p, (const void *) dv->buf, i); + p += i; + ctx->send_buf.write_offset += 3 + i; + } else if (i <= 0xffffffffUL) { + p = duk__trans_buffer_ensure(&ctx->send_buf, 5 + i); + if (!p) { goto alloc_error; } + *p++ = 0x13; + p = duk__trans_dvalue_encode_u32(ctx, p, (unsigned int) i); + memcpy((void *) p, (const void *) dv->buf, i); + p += i; + ctx->send_buf.write_offset += 5 + i; + } else { + goto dvalue_error; + } + break; + } + case DUK_DVALUE_UNUSED: { + p = duk__trans_buffer_ensure(&ctx->send_buf, 1); + if (!p) { goto alloc_error; } + *p++ = 0x15; + ctx->send_buf.write_offset += 1; + break; + } + case DUK_DVALUE_UNDEFINED: { + p = duk__trans_buffer_ensure(&ctx->send_buf, 1); + if (!p) { goto alloc_error; } + *p++ = 0x16; + ctx->send_buf.write_offset += 1; + break; + } + case DUK_DVALUE_NULL: { + p = duk__trans_buffer_ensure(&ctx->send_buf, 1); + if (!p) { goto alloc_error; } + *p++ = 0x17; + ctx->send_buf.write_offset += 1; + break; + } + case DUK_DVALUE_TRUE: { + p = duk__trans_buffer_ensure(&ctx->send_buf, 1); + if (!p) { goto alloc_error; } + *p++ = 0x18; + ctx->send_buf.write_offset += 1; + break; + } + case DUK_DVALUE_FALSE: { + p = duk__trans_buffer_ensure(&ctx->send_buf, 1); + if (!p) { goto alloc_error; } + *p++ = 0x19; + ctx->send_buf.write_offset += 1; + break; + } + case DUK_DVALUE_NUMBER: { + p = duk__trans_buffer_ensure(&ctx->send_buf, 9); + if (!p) { goto alloc_error; } + *p++ = 0x1a; + p = duk__trans_dvalue_encode_double(ctx, p, dv->d); + ctx->send_buf.write_offset += 9; + break; + } + case DUK_DVALUE_OBJECT: { + size_t i = dv->len; + if (i <= 0xffUL && dv->i >= 0 && dv->i <= 0xffL) { + p = duk__trans_buffer_ensure(&ctx->send_buf, 3 + i); + if (!p) { goto alloc_error; } + *p++ = 0x1b; + *p++ = (unsigned char) dv->i; + *p++ = (unsigned char) i; + memcpy((void *) p, (const void *) dv->buf, i); + ctx->send_buf.write_offset += 3 + i; + } else { + goto dvalue_error; + } + break; + } + case DUK_DVALUE_POINTER: { + size_t i = dv->len; + if (i <= 0xffUL) { + p = duk__trans_buffer_ensure(&ctx->send_buf, 2 + i); + if (!p) { goto alloc_error; } + *p++ = 0x1c; + *p++ = (unsigned char) i; + memcpy((void *) p, (const void *) dv->buf, i); + ctx->send_buf.write_offset += 2 + i; + } else { + goto dvalue_error; + } + break; + } + case DUK_DVALUE_LIGHTFUNC: { + size_t i = dv->len; + if (i <= 0xffUL && dv->i >= 0 && dv->i <= 0xffffL) { + p = duk__trans_buffer_ensure(&ctx->send_buf, 4 + i); + if (!p) { goto alloc_error; } + *p++ = 0x1d; + p = duk__trans_dvalue_encode_u16(ctx, p, (unsigned int) dv->i); + *p++ = (unsigned char) i; + memcpy((void *) p, (const void *) dv->buf, i); + ctx->send_buf.write_offset += 4 + i; + } else { + goto dvalue_error; + } + break; + } + case DUK_DVALUE_HEAPPTR: { + size_t i = dv->len; + if (i <= 0xffUL) { + p = duk__trans_buffer_ensure(&ctx->send_buf, 2 + i); + if (!p) { goto alloc_error; } + *p++ = 0x1e; + *p++ = (unsigned char) i; + memcpy((void *) p, (const void *) dv->buf, i); + ctx->send_buf.write_offset += 2 + i; + } else { + goto dvalue_error; + } + break; + } + default: { + goto dvalue_error; + } + } /* end switch */ + + return; + + dvalue_error: +#if defined(ERROR_PRINTS) + fprintf(stderr, "%s: internal error, argument dvalue is invalid\n", __func__); + fflush(stdout); +#endif + return; + + alloc_error: +#if defined(ERROR_PRINTS) + fprintf(stderr, "%s: internal error, failed to allocate space for write\n", __func__); + fflush(stdout); +#endif + return; +} + +static void duk__trans_dvalue_send_and_free(duk_trans_dvalue_ctx *ctx, duk_dvalue *dv) { + if (!dv) { return; } + duk_trans_dvalue_send(ctx, dv); + duk_dvalue_free(dv); +} + +void duk_trans_dvalue_send_eom(duk_trans_dvalue_ctx *ctx) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag(DUK_DVALUE_EOM)); +} + +void duk_trans_dvalue_send_req(duk_trans_dvalue_ctx *ctx) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag(DUK_DVALUE_REQ)); +} + +void duk_trans_dvalue_send_rep(duk_trans_dvalue_ctx *ctx) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag(DUK_DVALUE_REP)); +} + +void duk_trans_dvalue_send_err(duk_trans_dvalue_ctx *ctx) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag(DUK_DVALUE_ERR)); +} + +void duk_trans_dvalue_send_nfy(duk_trans_dvalue_ctx *ctx) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag(DUK_DVALUE_NFY)); +} + +void duk_trans_dvalue_send_integer(duk_trans_dvalue_ctx *ctx, int val) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag_int(DUK_DVALUE_INTEGER, val)); +} + +void duk_trans_dvalue_send_string(duk_trans_dvalue_ctx *ctx, const char *str) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag_data(DUK_DVALUE_STRING, str, strlen(str))); +} + +void duk_trans_dvalue_send_lstring(duk_trans_dvalue_ctx *ctx, const char *str, size_t len) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag_data(DUK_DVALUE_STRING, str, len)); +} + +void duk_trans_dvalue_send_buffer(duk_trans_dvalue_ctx *ctx, const char *buf, size_t len) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag_data(DUK_DVALUE_BUFFER, buf, len)); +} + +void duk_trans_dvalue_send_unused(duk_trans_dvalue_ctx *ctx) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag(DUK_DVALUE_UNUSED)); +} + +void duk_trans_dvalue_send_undefined(duk_trans_dvalue_ctx *ctx) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag(DUK_DVALUE_UNDEFINED)); +} + +void duk_trans_dvalue_send_null(duk_trans_dvalue_ctx *ctx) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag(DUK_DVALUE_NULL)); +} + +void duk_trans_dvalue_send_true(duk_trans_dvalue_ctx *ctx) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag(DUK_DVALUE_TRUE)); +} + +void duk_trans_dvalue_send_false(duk_trans_dvalue_ctx *ctx) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag(DUK_DVALUE_FALSE)); +} + +void duk_trans_dvalue_send_number(duk_trans_dvalue_ctx *ctx, double val) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag_double(DUK_DVALUE_NUMBER, val)); +} + +void duk_trans_dvalue_send_object(duk_trans_dvalue_ctx *ctx, int classnum, const char *ptr_data, size_t ptr_len) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag_int_data(DUK_DVALUE_OBJECT, classnum, ptr_data, ptr_len)); +} + +void duk_trans_dvalue_send_pointer(duk_trans_dvalue_ctx *ctx, const char *ptr_data, size_t ptr_len) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag_data(DUK_DVALUE_POINTER, ptr_data, ptr_len)); +} + +void duk_trans_dvalue_send_lightfunc(duk_trans_dvalue_ctx *ctx, int lf_flags, const char *ptr_data, size_t ptr_len) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag_int_data(DUK_DVALUE_LIGHTFUNC, lf_flags, ptr_data, ptr_len)); +} + +void duk_trans_dvalue_send_heapptr(duk_trans_dvalue_ctx *ctx, const char *ptr_data, size_t ptr_len) { + duk__trans_dvalue_send_and_free(ctx, duk_dvalue_make_tag_data(DUK_DVALUE_HEAPPTR, ptr_data, ptr_len)); +} + +void duk_trans_dvalue_send_req_cmd(duk_trans_dvalue_ctx *ctx, int cmd) { + duk_trans_dvalue_send_req(ctx); + duk_trans_dvalue_send_integer(ctx, cmd); +} + +static duk_dvalue *duk__trans_trial_parse_dvalue(duk_trans_dvalue_ctx *ctx) { + unsigned char *p; + size_t len; + unsigned char ib; + duk_dvalue *dv; + size_t datalen; + + p = ctx->recv_buf.base + ctx->recv_buf.read_offset; + len = ctx->recv_buf.write_offset - ctx->recv_buf.read_offset; + + if (len == 0) { + return NULL; + } + ib = p[0]; + +#if defined(DEBUG_PRINTS) + { + size_t i; + fprintf(stderr, "%s: parsing dvalue, window:", __func__); + for (i = 0; i < 16; i++) { + if (i < len) { + fprintf(stderr, " %02x", (unsigned int) p[i]); + } else { + fprintf(stderr, " ??"); + } + } + fprintf(stderr, " (length %ld, read_offset %ld, write_offset %ld, alloc_size %ld)\n", + (long) len, (long) ctx->recv_buf.read_offset, (long) ctx->recv_buf.write_offset, + (long) ctx->recv_buf.alloc_size); + fflush(stderr); + } +#endif + + if (ib <= 0x1fU) { + /* 0x00 ... 0x1f */ + switch (ib) { + case 0x00: { + ctx->recv_buf.read_offset += 1; + dv = duk_dvalue_make_tag(DUK_DVALUE_EOM); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x01: { + ctx->recv_buf.read_offset += 1; + dv = duk_dvalue_make_tag(DUK_DVALUE_REQ); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x02: { + ctx->recv_buf.read_offset += 1; + dv = duk_dvalue_make_tag(DUK_DVALUE_REP); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x03: { + ctx->recv_buf.read_offset += 1; + dv = duk_dvalue_make_tag(DUK_DVALUE_ERR); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x04: { + ctx->recv_buf.read_offset += 1; + dv = duk_dvalue_make_tag(DUK_DVALUE_NFY); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x10: { + int intval; + if (len < 5) { goto partial; } + intval = duk__trans_dvalue_parse_i32(ctx, p + 1); + ctx->recv_buf.read_offset += 5; + dv = duk_dvalue_make_tag_int(DUK_DVALUE_INTEGER, intval); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x11: { + if (len < 5) { goto partial; } + datalen = (size_t) duk__trans_dvalue_parse_u32(ctx, p + 1); + if (len < 5 + datalen) { goto partial; } + ctx->recv_buf.read_offset += 5 + datalen; + dv = duk_dvalue_make_tag_data(DUK_DVALUE_STRING, (const char *) (p + 5), datalen); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x12: { + if (len < 3) { goto partial; } + datalen = (size_t) duk__trans_dvalue_parse_u16(ctx, p + 1); + if (len < 3 + datalen) { goto partial; } + ctx->recv_buf.read_offset += 3 + datalen; + dv = duk_dvalue_make_tag_data(DUK_DVALUE_STRING, (const char *) (p + 3), datalen); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x13: { + if (len < 5) { goto partial; } + datalen = (size_t) duk__trans_dvalue_parse_u32(ctx, p + 1); + if (len < 5 + datalen) { goto partial; } + ctx->recv_buf.read_offset += 5 + datalen; + dv = duk_dvalue_make_tag_data(DUK_DVALUE_BUFFER, (const char *) (p + 5), datalen); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x14: { + if (len < 3) { goto partial; } + datalen = (size_t) duk__trans_dvalue_parse_u16(ctx, p + 1); + if (len < 3 + datalen) { goto partial; } + ctx->recv_buf.read_offset += 3 + datalen; + dv = duk_dvalue_make_tag_data(DUK_DVALUE_BUFFER, (const char *) (p + 3), datalen); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x15: { + ctx->recv_buf.read_offset += 1; + dv = duk_dvalue_make_tag(DUK_DVALUE_UNUSED); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x16: { + ctx->recv_buf.read_offset += 1; + dv = duk_dvalue_make_tag(DUK_DVALUE_UNDEFINED); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x17: { + ctx->recv_buf.read_offset += 1; + dv = duk_dvalue_make_tag(DUK_DVALUE_NULL); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x18: { + ctx->recv_buf.read_offset += 1; + dv = duk_dvalue_make_tag(DUK_DVALUE_TRUE); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x19: { + ctx->recv_buf.read_offset += 1; + dv = duk_dvalue_make_tag(DUK_DVALUE_FALSE); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x1a: { + double dblval; + if (len < 9) { goto partial; } + dblval = duk__trans_dvalue_parse_double(ctx, p + 1); + ctx->recv_buf.read_offset += 9; + dv = duk_dvalue_make_tag_double(DUK_DVALUE_NUMBER, dblval); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x1b: { + int classnum; + if (len < 3) { goto partial; } + datalen = (size_t) p[2]; + if (len < 3 + datalen) { goto partial; } + classnum = (int) p[1]; + ctx->recv_buf.read_offset += 3 + datalen; + dv = duk_dvalue_make_tag_int_data(DUK_DVALUE_OBJECT, classnum, (const char *) (p + 3), datalen); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x1c: { + if (len < 2) { goto partial; } + datalen = (size_t) p[1]; + if (len < 2 + datalen) { goto partial; } + ctx->recv_buf.read_offset += 2 + datalen; + dv = duk_dvalue_make_tag_data(DUK_DVALUE_POINTER, (const char *) (p + 2), datalen); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x1d: { + int lf_flags; + if (len < 4) { goto partial; } + datalen = (size_t) p[3]; + if (len < 4 + datalen) { goto partial; } + lf_flags = (int) duk__trans_dvalue_parse_u16(ctx, p + 1); + ctx->recv_buf.read_offset += 4 + datalen; + dv = duk_dvalue_make_tag_int_data(DUK_DVALUE_LIGHTFUNC, lf_flags, (const char *) (p + 4), datalen); + if (!dv) { goto alloc_error; } + return dv; + } + case 0x1e: { + if (len < 2) { goto partial; } + datalen = (size_t) p[1]; + if (len < 2 + datalen) { goto partial; } + ctx->recv_buf.read_offset += 2 + datalen; + dv = duk_dvalue_make_tag_data(DUK_DVALUE_HEAPPTR, (const char *) (p + 2), datalen); + if (!dv) { goto alloc_error; } + return dv; + } + default: { + goto format_error; + } + } /* end switch */ + } else if (ib <= 0x5fU) { + /* 0x20 ... 0x5f */ + goto format_error; + } else if (ib <= 0x7fU) { + /* 0x60 ... 0x7f */ + datalen = (size_t) (ib - 0x60U); + if (len < 1 + datalen) { goto partial; } + ctx->recv_buf.read_offset += 1 + datalen; + dv = duk_dvalue_make_tag_data(DUK_DVALUE_STRING, (const char *) (p + 1), datalen); + if (!dv) { goto alloc_error; } + return dv; + } else if (ib <= 0xbfU) { + /* 0x80 ... 0xbf */ + int intval; + intval = (int) (ib - 0x80U); + ctx->recv_buf.read_offset += 1; + dv = duk_dvalue_make_tag_int(DUK_DVALUE_INTEGER, intval); + if (!dv) { goto alloc_error; } + return dv; + } else { + /* 0xc0 ... 0xff */ + int intval; + if (len < 2) { goto partial; } + intval = (((int) (ib - 0xc0U)) << 8) + (int) p[1]; + ctx->recv_buf.read_offset += 2; + dv = duk_dvalue_make_tag_int(DUK_DVALUE_INTEGER, intval); + if (!dv) { goto alloc_error; } + return dv; + } + + /* never here */ + + partial: + return NULL; + + alloc_error: +#if defined(ERROR_PRINTS) + fprintf(stderr, "%s: internal error, cannot allocate space for dvalue\n", __func__); + fflush(stdout); +#endif + return NULL; + + format_error: +#if defined(ERROR_PRINTS) + fprintf(stderr, "%s: internal error, dvalue format error\n", __func__); + fflush(stdout); +#endif + return NULL; +} + +static duk_dvalue *duk__trans_trial_parse_handshake(duk_trans_dvalue_ctx *ctx) { + unsigned char *p; + size_t len; + duk_dvalue *dv; + size_t i; + + p = ctx->recv_buf.base + ctx->recv_buf.read_offset; + len = ctx->recv_buf.write_offset - ctx->recv_buf.read_offset; + + for (i = 0; i < len; i++) { + if (p[i] == 0x0a) { + /* Handshake line is returned as a dvalue for convenience; it's + * not actually a part of the dvalue phase of the protocol. + */ + ctx->recv_buf.read_offset += i + 1; + dv = duk_dvalue_make_tag_data(DUK_DVALUE_STRING, (const char *) p, i); + if (!dv) { goto alloc_error; } + return dv; + } + } + + return NULL; + + alloc_error: +#if defined(ERROR_PRINTS) + fprintf(stderr, "%s: internal error, cannot allocate space for handshake line\n", __func__); + fflush(stdout); +#endif + return NULL; +} + +static void duk__trans_call_cooperate(duk_trans_dvalue_ctx *ctx, int block) { + if (ctx->cooperate) { + ctx->cooperate(ctx, block); + } +} + +static void duk__trans_call_received(duk_trans_dvalue_ctx *ctx, duk_dvalue *dv) { + if (ctx->received) { + ctx->received(ctx, dv); + } +} + +static void duk__trans_call_handshake(duk_trans_dvalue_ctx *ctx, const char *line) { + if (ctx->handshake) { + ctx->handshake(ctx, line); + } +} + +static void duk__trans_call_detached(duk_trans_dvalue_ctx *ctx) { + if (ctx->detached) { + ctx->detached(ctx); + } +} + +/* + * Duktape callbacks + */ + +duk_size_t duk_trans_dvalue_read_cb(void *udata, char *buffer, duk_size_t length) { + duk_trans_dvalue_ctx *ctx = (duk_trans_dvalue_ctx *) udata; + +#if defined(DEBUG_PRINTS) + fprintf(stderr, "%s: %p %p %ld\n", __func__, udata, (void *) buffer, (long) length); + fflush(stderr); +#endif + + duk__trans_call_cooperate(ctx, 0); + + for (;;) { + size_t avail, now; + + avail = (size_t) (ctx->send_buf.write_offset - ctx->send_buf.read_offset); + if (avail == 0) { + /* Must cooperate until user callback provides data. From + * Duktape's perspective we MUST block until data is received. + */ + duk__trans_call_cooperate(ctx, 1); + } else { + now = avail; + if (now > length) { + now = length; + } + memcpy((void *) buffer, (const void *) (ctx->send_buf.base + ctx->send_buf.read_offset), now); + duk__trans_buffer_rebase(&ctx->send_buf); + ctx->send_buf.read_offset += now; + return now; + } + } +} + +duk_size_t duk_trans_dvalue_write_cb(void *udata, const char *buffer, duk_size_t length) { + duk_trans_dvalue_ctx *ctx = (duk_trans_dvalue_ctx *) udata; + unsigned char *p; + +#if defined(DEBUG_PRINTS) + fprintf(stderr, "%s: %p %p %ld\n", __func__, udata, (void *) buffer, (long) length); + fflush(stderr); +#endif + + duk__trans_call_cooperate(ctx, 0); + + /* Append data. */ + duk__trans_buffer_rebase(&ctx->recv_buf); + p = duk__trans_buffer_ensure(&ctx->recv_buf, length); + memcpy((void *) p, (const void *) buffer, (size_t) length); + ctx->recv_buf.write_offset += length; + + /* Trial parse handshake line or dvalue(s). */ + if (!ctx->handshake_done) { + duk_dvalue *dv = duk__trans_trial_parse_handshake(ctx); + if (dv) { + /* Handshake line is available for caller for the + * duration of the callback, and must not be freed + * by the caller. + */ + duk__trans_call_handshake(ctx, (const char *) dv->buf); +#if defined(DEBUG_PRINTS) + fprintf(stderr, "%s: handshake ok\n", __func__); + fflush(stderr); +#endif + duk_dvalue_free(dv); + ctx->handshake_done = 1; + } + } + if (ctx->handshake_done) { + for (;;) { + duk_dvalue *dv = duk__trans_trial_parse_dvalue(ctx); + if (dv) { +#if defined(DEBUG_PRINTS) + { + char buf[DUK_DVALUE_TOSTRING_BUFLEN]; + duk_dvalue_to_string(dv, buf); + fprintf(stderr, "%s: received dvalue: %s\n", __func__, buf); + fflush(stderr); + } +#endif + + duk__trans_call_received(ctx, dv); + } else { + break; + } + } + } + + duk__trans_call_cooperate(ctx, 0); /* just in case, if dvalues changed something */ + + return length; +} + +duk_size_t duk_trans_dvalue_peek_cb(void *udata) { + duk_trans_dvalue_ctx *ctx = (duk_trans_dvalue_ctx *) udata; + size_t avail; + +#if defined(DEBUG_PRINTS) + fprintf(stderr, "%s: %p\n", __func__, udata); + fflush(stderr); +#endif + + duk__trans_call_cooperate(ctx, 0); + avail = (size_t) (ctx->send_buf.write_offset - ctx->send_buf.read_offset); + return (duk_size_t) avail; +} + +void duk_trans_dvalue_read_flush_cb(void *udata) { + duk_trans_dvalue_ctx *ctx = (duk_trans_dvalue_ctx *) udata; + +#if defined(DEBUG_PRINTS) + fprintf(stderr, "%s: %p\n", __func__, udata); + fflush(stderr); +#endif + + duk__trans_call_cooperate(ctx, 0); +} + +void duk_trans_dvalue_write_flush_cb(void *udata) { + duk_trans_dvalue_ctx *ctx = (duk_trans_dvalue_ctx *) udata; + +#if defined(DEBUG_PRINTS) + fprintf(stderr, "%s: %p\n", __func__, udata); + fflush(stderr); +#endif + + duk__trans_call_cooperate(ctx, 0); +} + +void duk_trans_dvalue_detached_cb(void *udata) { + duk_trans_dvalue_ctx *ctx = (duk_trans_dvalue_ctx *) udata; + +#if defined(DEBUG_PRINTS) + fprintf(stderr, "%s: %p\n", __func__, udata); + fflush(stderr); +#endif + + duk__trans_call_detached(ctx); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/duk_trans_dvalue.h b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/duk_trans_dvalue.h new file mode 100644 index 00000000..e0ba731b --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/duk_trans_dvalue.h @@ -0,0 +1,113 @@ +#ifndef DUK_TRANS_DVALUE_H_INCLUDED +#define DUK_TRANS_DVALUE_H_INCLUDED + +#include "duktape.h" + +typedef struct duk_dvalue duk_dvalue; +typedef struct duk_trans_buffer duk_trans_buffer; +typedef struct duk_trans_dvalue_ctx duk_trans_dvalue_ctx; + +typedef void (*duk_trans_dvalue_received_function)(duk_trans_dvalue_ctx *ctx, duk_dvalue *dv); +typedef void (*duk_trans_dvalue_cooperate_function)(duk_trans_dvalue_ctx *ctx, int block); +typedef void (*duk_trans_dvalue_handshake_function)(duk_trans_dvalue_ctx *ctx, const char *handshake_line); +typedef void (*duk_trans_dvalue_detached_function)(duk_trans_dvalue_ctx *ctx); + +/* struct duk_dvalue 'tag' values, note that these have nothing to do with + * Duktape debug protocol inital byte. Struct fields used with the type + * are noted next to the define. + */ +#define DUK_DVALUE_EOM 1 /* no fields */ +#define DUK_DVALUE_REQ 2 /* no fields */ +#define DUK_DVALUE_REP 3 /* no fields */ +#define DUK_DVALUE_ERR 4 /* no fields */ +#define DUK_DVALUE_NFY 5 /* no fields */ +#define DUK_DVALUE_INTEGER 6 /* i: 32-bit signed integer */ +#define DUK_DVALUE_STRING 7 /* buf: string data, len: string length */ +#define DUK_DVALUE_BUFFER 8 /* buf: buffer data, len: buffer length */ +#define DUK_DVALUE_UNUSED 9 /* no fields */ +#define DUK_DVALUE_UNDEFINED 10 /* no fields */ +#define DUK_DVALUE_NULL 11 /* no fields */ +#define DUK_DVALUE_TRUE 12 /* no fields */ +#define DUK_DVALUE_FALSE 13 /* no fields */ +#define DUK_DVALUE_NUMBER 14 /* d: ieee double */ +#define DUK_DVALUE_OBJECT 15 /* i: class number, buf: pointer data, len: pointer length */ +#define DUK_DVALUE_POINTER 16 /* buf: pointer data, len: pointer length */ +#define DUK_DVALUE_LIGHTFUNC 17 /* i: lightfunc flags, buf: pointer data, len: pointer length */ +#define DUK_DVALUE_HEAPPTR 18 /* buf: pointer data, len: pointer length */ + +struct duk_dvalue { + /* Could use a union for the value but the gain would be relatively small. */ + int tag; + int i; + double d; + size_t len; + unsigned char *buf; +}; + +struct duk_trans_buffer { + unsigned char *base; + size_t write_offset; + size_t read_offset; + size_t alloc_size; +}; + +struct duk_trans_dvalue_ctx { + duk_trans_dvalue_received_function received; + duk_trans_dvalue_cooperate_function cooperate; + duk_trans_dvalue_handshake_function handshake; + duk_trans_dvalue_detached_function detached; + duk_trans_buffer send_buf; /* sending towards Duktape (duktape read callback) */ + duk_trans_buffer recv_buf; /* receiving from Duktape (duktape write callback) */ + int handshake_done; + int double_byteorder; /* 0=little endian, 1=big endian, 2=mixed endian */ +}; + +/* Buffer size needed by duk_dvalue_to_string(). */ +#define DUK_DVALUE_TOSTRING_BUFLEN 256 + +/* Dvalue handling. */ +duk_dvalue *duk_dvalue_alloc(void); +void duk_dvalue_free(duk_dvalue *dv); +void duk_dvalue_to_string(duk_dvalue *dv, char *buf); +duk_dvalue *duk_dvalue_make_tag(int tag); +duk_dvalue *duk_dvalue_make_tag_int(int tag, int intval); +duk_dvalue *duk_dvalue_make_tag_double(int tag, double dblval); +duk_dvalue *duk_dvalue_make_tag_data(int tag, const char *buf, size_t len); +duk_dvalue *duk_dvalue_make_tag_int_data(int tag, int intval, const char *buf, size_t len); + +/* Initializing and freeing the transport context. */ +duk_trans_dvalue_ctx *duk_trans_dvalue_init(void); +void duk_trans_dvalue_free(duk_trans_dvalue_ctx *ctx); + +/* Sending dvalues towards Duktape. */ +void duk_trans_dvalue_send(duk_trans_dvalue_ctx *ctx, duk_dvalue *dv); +void duk_trans_dvalue_send_eom(duk_trans_dvalue_ctx *ctx); +void duk_trans_dvalue_send_req(duk_trans_dvalue_ctx *ctx); +void duk_trans_dvalue_send_rep(duk_trans_dvalue_ctx *ctx); +void duk_trans_dvalue_send_err(duk_trans_dvalue_ctx *ctx); +void duk_trans_dvalue_send_nfy(duk_trans_dvalue_ctx *ctx); +void duk_trans_dvalue_send_integer(duk_trans_dvalue_ctx *ctx, int val); +void duk_trans_dvalue_send_string(duk_trans_dvalue_ctx *ctx, const char *str); +void duk_trans_dvalue_send_lstring(duk_trans_dvalue_ctx *ctx, const char *str, size_t len); +void duk_trans_dvalue_send_buffer(duk_trans_dvalue_ctx *ctx, const char *buf, size_t len); +void duk_trans_dvalue_send_unused(duk_trans_dvalue_ctx *ctx); +void duk_trans_dvalue_send_undefined(duk_trans_dvalue_ctx *ctx); +void duk_trans_dvalue_send_null(duk_trans_dvalue_ctx *ctx); +void duk_trans_dvalue_send_true(duk_trans_dvalue_ctx *ctx); +void duk_trans_dvalue_send_false(duk_trans_dvalue_ctx *ctx); +void duk_trans_dvalue_send_number(duk_trans_dvalue_ctx *ctx, double val); +void duk_trans_dvalue_send_object(duk_trans_dvalue_ctx *ctx, int classnum, const char *ptr_data, size_t ptr_len); +void duk_trans_dvalue_send_pointer(duk_trans_dvalue_ctx *ctx, const char *ptr_data, size_t ptr_len); +void duk_trans_dvalue_send_lightfunc(duk_trans_dvalue_ctx *ctx, int lf_flags, const char *ptr_data, size_t ptr_len); +void duk_trans_dvalue_send_heapptr(duk_trans_dvalue_ctx *ctx, const char *ptr_data, size_t ptr_len); +void duk_trans_dvalue_send_req_cmd(duk_trans_dvalue_ctx *ctx, int cmd); + +/* Duktape debug callbacks provided by the transport. */ +duk_size_t duk_trans_dvalue_read_cb(void *udata, char *buffer, duk_size_t length); +duk_size_t duk_trans_dvalue_write_cb(void *udata, const char *buffer, duk_size_t length); +duk_size_t duk_trans_dvalue_peek_cb(void *udata); +void duk_trans_dvalue_read_flush_cb(void *udata); +void duk_trans_dvalue_write_flush_cb(void *udata); +void duk_trans_dvalue_detached_cb(void *udata); + +#endif /* DUK_TRANS_DVALUE_H_INCLUDED */ diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/test.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/test.c new file mode 100644 index 00000000..7830ec20 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-dvalue/test.c @@ -0,0 +1,236 @@ +/* + * Example program using the dvalue debug transport. + */ + +#include +#include + +#include "duktape.h" +#include "duk_trans_dvalue.h" + +void my_cooperate(duk_trans_dvalue_ctx *ctx, int block) { + static int first_blocked = 1; + + if (!block) { + /* Duktape is not blocked; you can cooperate with e.g. a user + * interface here and send dvalues to Duktape, but don't block. + */ + return; + } + + /* Duktape is blocked on a read and won't continue until debug + * command(s) are sent. + * + * Normally you'd enter your own event loop here, and process + * events until something needs to be sent to Duktape. For + * example, the user might press a "Step over" button in the + * UI which would cause dvalues to be sent. You can then + * return from this callback. + * + * The code below sends some example messages for testing the + * dvalue handling of the transport. + * + * If you create dvalues manually and send them using + * duk_trans_dvalue_send(), you must free the dvalues after + * the send call returns using duk_dvalue_free(). + */ + + if (first_blocked) { + char *tmp; + int i; + + /* First time Duktape becomes blocked, send DumpHeap which + * exercises a lot of parsing code. + * + * NOTE: Valgrind may complain about reading uninitialized + * bytes. This is caused by the DumpHeap command writing out + * verbatim duk_tval values which are intentionally not + * always fully initialized for performance reasons. + */ + first_blocked = 0; + + fprintf(stderr, "Duktape is blocked, send DumpHeap\n"); + fflush(stderr); + + duk_trans_dvalue_send_req(ctx); + duk_trans_dvalue_send_integer(ctx, 0x20); /* DumpHeap */ + duk_trans_dvalue_send_eom(ctx); + + /* Also send a dummy TriggerStatus request with trailing dvalues + * ignored by Duktape; Duktape will parse the dvalues to be able to + * skip them, so that the dvalue encoding is exercised. + */ + + tmp = malloc(100000); /* long buffer, >= 65536 chars */ + for (i = 0; i < 100000; i++) { + tmp[i] = (char) i; + } + duk_trans_dvalue_send_req(ctx); + duk_trans_dvalue_send_integer(ctx, 0x11); /* TriggerStatus */ + duk_trans_dvalue_send_string(ctx, "dummy"); /* short, <= 31 chars */ + duk_trans_dvalue_send_string(ctx, "123456789012345678901234567890foobar"); /* medium, >= 32 chars */ + duk_trans_dvalue_send_lstring(ctx, (const char *) tmp, 65535UL); + duk_trans_dvalue_send_lstring(ctx, (const char *) tmp, 65536UL); + duk_trans_dvalue_send_lstring(ctx, (const char *) tmp, 100000UL); + duk_trans_dvalue_send_buffer(ctx, (const char *) tmp, 255U); + duk_trans_dvalue_send_buffer(ctx, (const char *) tmp, 65535UL); + duk_trans_dvalue_send_buffer(ctx, (const char *) tmp, 65536UL); + duk_trans_dvalue_send_buffer(ctx, (const char *) tmp, 100000UL); + duk_trans_dvalue_send_unused(ctx); + duk_trans_dvalue_send_undefined(ctx); + duk_trans_dvalue_send_null(ctx); + duk_trans_dvalue_send_true(ctx); + duk_trans_dvalue_send_false(ctx); + duk_trans_dvalue_send_number(ctx, 123.456); + duk_trans_dvalue_send_object(ctx, 12 /*classnum*/, (const char *) tmp, 8); /* fake ptr len */ + duk_trans_dvalue_send_pointer(ctx, (const char *) tmp, 8); /* fake ptr len */ + duk_trans_dvalue_send_lightfunc(ctx, 0xdabc /*lf_flags*/, (const char *) tmp, 8); /* fake ptr len */ + duk_trans_dvalue_send_heapptr(ctx, (const char *) tmp, 8); /* fake ptr len */ + + duk_trans_dvalue_send_eom(ctx); + } + + fprintf(stderr, "Duktape is blocked, send Eval and StepInto to resume execution\n"); + fflush(stderr); + + /* duk_trans_dvalue_send_req_cmd() sends a REQ dvalue followed by + * an integer dvalue (command) for convenience. + */ + + duk_trans_dvalue_send_req_cmd(ctx, 0x1e); /* 0x1e = Eval */ + duk_trans_dvalue_send_string(ctx, "evalMe"); + duk_trans_dvalue_send_eom(ctx); + + duk_trans_dvalue_send_req_cmd(ctx, 0x14); /* 0x14 = StepOver */ + duk_trans_dvalue_send_eom(ctx); +} + +void my_received(duk_trans_dvalue_ctx *ctx, duk_dvalue *dv) { + char buf[DUK_DVALUE_TOSTRING_BUFLEN]; + (void) ctx; + + duk_dvalue_to_string(dv, buf); + fprintf(stderr, "Received dvalue: %s\n", buf); + fflush(stderr); + + /* Here a normal debug client would wait for dvalues until an EOM + * dvalue was received (which completes a debug message). The + * debug message would then be handled, possibly causing UI changes + * and/or causing debug commands to be sent to Duktape. + * + * The callback is responsible for eventually freeing the dvalue. + * Here we free it immediately, but an actual client would probably + * gather dvalues into an array or linked list to handle when the + * debug message was complete. + */ + + duk_dvalue_free(dv); +} + +void my_handshake(duk_trans_dvalue_ctx *ctx, const char *line) { + (void) ctx; + + /* The Duktape handshake line is given in 'line' (without LF). + * The 'line' argument can be accessed for the duration of the + * callback (read only). Don't free 'line' here, the transport + * handles that. + */ + + fprintf(stderr, "Received handshake line: '%s'\n", line); + fflush(stderr); +} + +void my_detached(duk_trans_dvalue_ctx *ctx) { + (void) ctx; + + /* Detached call forwarded as is. */ + + fprintf(stderr, "Debug transport detached\n"); + fflush(stderr); +} + +int main(int argc, char *argv[]) { + duk_context *ctx; + duk_trans_dvalue_ctx *trans_ctx; + int exitval = 0; + + (void) argc; (void) argv; /* suppress warning */ + + ctx = duk_create_heap_default(); + if (!ctx) { + fprintf(stderr, "Failed to create Duktape heap\n"); + fflush(stderr); + exitval = 1; + goto cleanup; + } + + trans_ctx = duk_trans_dvalue_init(); + if (!trans_ctx) { + fprintf(stderr, "Failed to create debug transport context\n"); + fflush(stderr); + exitval = 1; + goto cleanup; + } + trans_ctx->cooperate = my_cooperate; + trans_ctx->received = my_received; + trans_ctx->handshake = my_handshake; + trans_ctx->detached = my_detached; + + /* Attach debugger; this will fail with a fatal error here unless + * debugger support is compiled in. To fail more gracefully, call + * this under a duk_safe_call() to catch the error. + */ + duk_debugger_attach(ctx, + duk_trans_dvalue_read_cb, + duk_trans_dvalue_write_cb, + duk_trans_dvalue_peek_cb, + duk_trans_dvalue_read_flush_cb, + duk_trans_dvalue_write_flush_cb, + duk_trans_dvalue_detached_cb, + (void *) trans_ctx); + + fprintf(stderr, "Debugger attached, running eval\n"); + fflush(stderr); + + /* Evaluate simple test code, callbacks will "step over" until end. + * + * The test code here is just for exercising the debug transport. + * The 'evalMe' variable is evaluated (using debugger command Eval) + * before every step to force different dvalues to be carried over + * the transport. + */ + + duk_eval_string(ctx, + "var evalMe;\n" + "\n" + "print('Hello world!');\n" + "[ undefined, null, true, false, 123, -123, 123.1, 0, -0, 1/0, 0/0, -1/0, \n" + " 'foo', Duktape.Buffer('bar'), Duktape.Pointer('dummy'), Math.cos, \n" + "].forEach(function (val) {\n" + " print(val);\n" + " evalMe = val;\n" + "});\n" + "\n" + "var str = 'xxx'\n" + "for (i = 0; i < 10; i++) {\n" + " print(i, str);\n" + " evalMe = str;\n" + " evalMe = Duktape.Buffer(str);\n" + " str = str + str;\n" + "}\n" + ); + duk_pop(ctx); + + duk_debugger_detach(ctx); + + cleanup: + if (trans_ctx) { + duk_trans_dvalue_free(trans_ctx); + trans_ctx = NULL; + } + if (ctx) { + duk_destroy_heap(ctx); + } + + return exitval; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-socket/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-socket/README.rst new file mode 100644 index 00000000..787d5e40 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-socket/README.rst @@ -0,0 +1,6 @@ +================================================ +Debug transport using a simple socket connection +================================================ + +This example implements an example debug transport which uses a Linux server +socket on the debug target. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-socket/duk_trans_socket.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-socket/duk_trans_socket.c new file mode 100644 index 00000000..c25fa3ea --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-socket/duk_trans_socket.c @@ -0,0 +1,313 @@ +/* + * Example debug transport using a TCP socket + * + * The application has a server socket which can be connected to. + * After that data is just passed through. + * + * NOTE: This is Linux specific on purpose, as it's just an example how + * a debug transport can be concretely implemented. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "duktape.h" + +#ifndef DUK_DEBUG_PORT +#define DUK_DEBUG_PORT 9091 +#endif + +#if 0 +#define DEBUG_PRINTS +#endif + +static int server_sock = -1; +static int client_sock = -1; + +/* + * Transport init + */ + +void duk_trans_socket_init(void) { + struct sockaddr_in addr; + int on; + + server_sock = socket(AF_INET, SOCK_STREAM, 0); + if (server_sock < 0) { + fprintf(stderr, "%s: failed to create server socket: %s\n", __FILE__, strerror(errno)); + fflush(stderr); + goto fail; + } + + on = 1; + if (setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, (const char *) &on, sizeof(on)) < 0) { + fprintf(stderr, "%s: failed to set SO_REUSEADDR for server socket: %s\n", __FILE__, strerror(errno)); + fflush(stderr); + goto fail; + } + + memset((void *) &addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = INADDR_ANY; + addr.sin_port = htons(DUK_DEBUG_PORT); + + if (bind(server_sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { + fprintf(stderr, "%s: failed to bind server socket: %s\n", __FILE__, strerror(errno)); + fflush(stderr); + goto fail; + } + + listen(server_sock, 1 /*backlog*/); + return; + + fail: + if (server_sock >= 0) { + (void) close(server_sock); + server_sock = -1; + } +} + +void duk_trans_socket_waitconn(void) { + struct sockaddr_in addr; + socklen_t sz; + + if (server_sock < 0) { + fprintf(stderr, "%s: no server socket, skip waiting for connection\n", __FILE__); + fflush(stderr); + return; + } + if (client_sock >= 0) { + (void) close(client_sock); + client_sock = -1; + } + + fprintf(stderr, "Waiting for debug connection on port %d\n", (int) DUK_DEBUG_PORT); + fflush(stderr); + + sz = (socklen_t) sizeof(addr); + client_sock = accept(server_sock, (struct sockaddr *) &addr, &sz); + if (client_sock < 0) { + fprintf(stderr, "%s: accept() failed, skip waiting for connection: %s\n", __FILE__, strerror(errno)); + fflush(stderr); + goto fail; + } + + fprintf(stderr, "Debug connection established\n"); + fflush(stderr); + + /* XXX: For now, close the listen socket because we won't accept new + * connections anyway. A better implementation would allow multiple + * debug attaches. + */ + + if (server_sock >= 0) { + (void) close(server_sock); + server_sock = -1; + } + return; + + fail: + if (client_sock >= 0) { + (void) close(client_sock); + client_sock = -1; + } +} + +/* + * Duktape callbacks + */ + +/* Duktape debug transport callback: partial read */ +duk_size_t duk_trans_socket_read_cb(void *udata, char *buffer, duk_size_t length) { + ssize_t ret; + + (void) udata; /* not needed by the example */ + +#if defined(DEBUG_PRINTS) + fprintf(stderr, "%s: udata=%p, buffer=%p, length=%ld\n", + __func__, (void *) udata, (void *) buffer, (long) length); + fflush(stderr); +#endif + + if (client_sock < 0) { + return 0; + } + + if (length == 0) { + /* This shouldn't happen. */ + fprintf(stderr, "%s: read request length == 0, closing connection\n", __FILE__); + fflush(stderr); + goto fail; + } + + if (buffer == NULL) { + /* This shouldn't happen. */ + fprintf(stderr, "%s: read request buffer == NULL, closing connection\n", __FILE__); + fflush(stderr); + goto fail; + } + + /* In a production quality implementation there would be a sanity + * timeout here to recover from "black hole" disconnects. + */ + + ret = read(client_sock, (void *) buffer, (size_t) length); + if (ret < 0) { + fprintf(stderr, "%s: debug read failed, errno %d, closing connection: %s\n", __FILE__, errno, strerror(errno)); + fflush(stderr); + goto fail; + } else if (ret == 0) { + fprintf(stderr, "%s: debug read failed, ret == 0 (EOF), closing connection\n", __FILE__); + fflush(stderr); + goto fail; + } else if (ret > (ssize_t) length) { + fprintf(stderr, "%s: debug read failed, ret too large (%ld > %ld), closing connection\n", __FILE__, (long) ret, (long) length); + fflush(stderr); + goto fail; + } + + return (duk_size_t) ret; + + fail: + if (client_sock >= 0) { + (void) close(client_sock); + client_sock = -1; + } + return 0; +} + +/* Duktape debug transport callback: partial write */ +duk_size_t duk_trans_socket_write_cb(void *udata, const char *buffer, duk_size_t length) { + ssize_t ret; + + (void) udata; /* not needed by the example */ + +#if defined(DEBUG_PRINTS) + fprintf(stderr, "%s: udata=%p, buffer=%p, length=%ld\n", + __func__, (void *) udata, (void *) buffer, (long) length); + fflush(stderr); +#endif + + if (client_sock < 0) { + return 0; + } + + if (length == 0) { + /* This shouldn't happen. */ + fprintf(stderr, "%s: write request length == 0, closing connection\n", __FILE__); + fflush(stderr); + goto fail; + } + + if (buffer == NULL) { + /* This shouldn't happen. */ + fprintf(stderr, "%s: write request buffer == NULL, closing connection\n", __FILE__); + fflush(stderr); + goto fail; + } + + /* In a production quality implementation there would be a sanity + * timeout here to recover from "black hole" disconnects. + */ + + ret = write(client_sock, (const void *) buffer, (size_t) length); + if (ret <= 0 || ret > (ssize_t) length) { + fprintf(stderr, "%s: debug write failed, closing connection: %s\n", __FILE__, strerror(errno)); + fflush(stderr); + goto fail; + } + + return (duk_size_t) ret; + + fail: + if (client_sock >= 0) { + (void) close(client_sock); + client_sock = -1; + } + return 0; +} + +duk_size_t duk_trans_socket_peek_cb(void *udata) { + struct pollfd fds[1]; + int poll_rc; + + (void) udata; /* not needed by the example */ + +#if defined(DEBUG_PRINTS) + fprintf(stderr, "%s: udata=%p\n", __func__, (void *) udata); + fflush(stderr); +#endif + + fds[0].fd = client_sock; + fds[0].events = POLLIN; + fds[0].revents = 0; + + poll_rc = poll(fds, 1, 0); + if (poll_rc < 0) { + fprintf(stderr, "%s: poll returned < 0, closing connection: %s\n", __FILE__, strerror(errno)); + fflush(stderr); + goto fail; /* also returns 0, which is correct */ + } else if (poll_rc > 1) { + fprintf(stderr, "%s: poll returned > 1, treating like 1\n", __FILE__); + fflush(stderr); + return 1; /* should never happen */ + } else if (poll_rc == 0) { + return 0; /* nothing to read */ + } else { + return 1; /* something to read */ + } + + fail: + if (client_sock >= 0) { + (void) close(client_sock); + client_sock = -1; + } + return 0; +} + +void duk_trans_socket_read_flush_cb(void *udata) { +#if defined(DEBUG_PRINTS) + fprintf(stderr, "%s: udata=%p\n", __func__, (void *) udata); + fflush(stderr); +#endif + + (void) udata; /* not needed by the example */ + + /* Read flush: Duktape may not be making any more read calls at this + * time. If the transport maintains a receive window, it can use a + * read flush as a signal to update the window status to the remote + * peer. A read flush is guaranteed to occur before Duktape stops + * reading for a while; it may occur in other situations as well so + * it's not a 100% reliable indication. + */ + + /* This TCP transport requires no read flush handling so ignore. + * You can also pass a NULL to duk_debugger_attach() and not + * implement this callback at all. + */ +} + +void duk_trans_socket_write_flush_cb(void *udata) { +#if defined(DEBUG_PRINTS) + fprintf(stderr, "%s: udata=%p\n", __func__, (void *) udata); + fflush(stderr); +#endif + + (void) udata; /* not needed by the example */ + + /* Write flush. If the transport combines multiple writes + * before actually sending, a write flush is an indication + * to write out any pending bytes: Duktape may not be doing + * any more writes on this occasion. + */ + + /* This TCP transport requires no write flush handling so ignore. + * You can also pass a NULL to duk_debugger_attach() and not + * implement this callback at all. + */ + return; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-socket/duk_trans_socket.h b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-socket/duk_trans_socket.h new file mode 100644 index 00000000..60712a2e --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/debug-trans-socket/duk_trans_socket.h @@ -0,0 +1,14 @@ +#ifndef DUK_TRANS_SOCKET_H_INCLUDED +#define DUK_TRANS_SOCKET_H_INCLUDED + +#include "duktape.h" + +void duk_trans_socket_init(void); +void duk_trans_socket_waitconn(void); +duk_size_t duk_trans_socket_read_cb(void *udata, char *buffer, duk_size_t length); +duk_size_t duk_trans_socket_write_cb(void *udata, const char *buffer, duk_size_t length); +duk_size_t duk_trans_socket_peek_cb(void *udata); +void duk_trans_socket_read_flush_cb(void *udata); +void duk_trans_socket_write_flush_cb(void *udata); + +#endif /* DUK_TRANS_SOCKET_H_INCLUDED */ diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/dummy-date-provider/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/dummy-date-provider/README.rst new file mode 100644 index 00000000..bc62779f --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/dummy-date-provider/README.rst @@ -0,0 +1,5 @@ +==================================== +Dummy external Date provider example +==================================== + +This example implements a dummy, minimal external Date provider. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/dummy-date-provider/dummy_date_provider.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/dummy-date-provider/dummy_date_provider.c new file mode 100644 index 00000000..9c9e7163 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/dummy-date-provider/dummy_date_provider.c @@ -0,0 +1,27 @@ +/* + * Dummy Date provider + * + * There are two minimally required macros which you must provide in + * duk_config.h: + * + * extern duk_double_t dummy_get_now(void); + * + * #define DUK_USE_DATE_GET_NOW(ctx) dummy_get_now() + * #define DUK_USE_DATE_GET_LOCAL_TZOFFSET(d) 0 + * + * Note that since the providers are macros, you don't need to use + * all arguments. Similarly, you can "return" fixed values as + * constants. Above, local timezone offset is always zero i.e. + * we're always in UTC. + * + * You can also provide optional macros to parse and format timestamps + * in a platform specific format. If not provided, Duktape will use + * ISO 8601 only (which is often good enough). + */ + +#include "duktape.h" + +duk_double_t dummy_get_now(void) { + /* Return a fixed time here as a dummy example. */ + return -11504520000.0; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eval/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eval/README.rst new file mode 100644 index 00000000..eed18064 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eval/README.rst @@ -0,0 +1,5 @@ +============ +Eval example +============ + +Evaluate expressions from command line. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eval/eval.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eval/eval.c new file mode 100644 index 00000000..44099260 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eval/eval.c @@ -0,0 +1,48 @@ +/* + * Very simple example program for evaluating expressions from + * command line + */ + +#include "duktape.h" +#include + +static int eval_raw(duk_context *ctx) { + duk_eval(ctx); + return 1; +} + +static int tostring_raw(duk_context *ctx) { + duk_to_string(ctx, -1); + return 1; +} + +static void usage_exit(void) { + fprintf(stderr, "Usage: eval [] ...\n"); + fflush(stderr); + exit(1); +} + +int main(int argc, char *argv[]) { + duk_context *ctx; + int i; + const char *res; + + if (argc < 2) { + usage_exit(); + } + + ctx = duk_create_heap_default(); + for (i = 1; i < argc; i++) { + printf("=== eval: '%s' ===\n", argv[i]); + duk_push_string(ctx, argv[i]); + duk_safe_call(ctx, eval_raw, 1 /*nargs*/, 1 /*nrets*/); + duk_safe_call(ctx, tostring_raw, 1 /*nargs*/, 1 /*nrets*/); + res = duk_get_string(ctx, -1); + printf("%s\n", res ? res : "null"); + duk_pop(ctx); + } + + duk_destroy_heap(ctx); + + return 0; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/README.rst new file mode 100644 index 00000000..5b1b1477 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/README.rst @@ -0,0 +1,76 @@ +================== +Eventloop examples +================== + +Overview and usage +================== + +A few examples on how an event loop can be implemented with Duktape, mainly +illlustrating how the Duktape interface works (not how event loops should be +built otherwise). + +To test (Linux only, perhaps other Unix):: + + $ make + $ ./evloop curses-timers.js # run with Ecmascript eventloop + $ ./evloop -c curses-timers.js # run with C eventloop + +Implementation approaches +========================= + +There are several approaches to implementation timers. Here we demonstrate +two main approaches: + +1. Using a C eventloop which calls into Javascript. All the event loop state + like timers, sockets, etc, is held in C structures. + (See ``c_eventloop.c`` and ``c_eventloop.js``.) + +2. Using an Ecmascript eventloop which never returns. All the event loop state + can be managed with Ecmascript code instead of C structures. The Ecmascript + eventloop calls a Duktape/C helper to do the lowest level poll() call. + (See ``ecma_eventloop.js``.) + +Services provided +================= + +The event loop API provided by both examples is the same, and includes: + +* Timers: setTimeout, clearTimeout, setInterval, clearInterval + +* Sockets: simple network sockets + +In addition there are a few synchronous API bindings which are not event loop +related: + +* File I/O + +* Curses, for doing beautiful character graphics + +Limitations +=========== + +This is **not** a production quality event loop. This is on purpose, to +keep the example somewhat simple. Some shortcomings include: + +* A production quality event loop would track its internal state (active + timers and sockets) much more efficiently. In general memory usage and + code footprint can be reduced. + +* Buffer churn caused by allocating a new buffer for every socket read + should be eliminated by reusing buffers where appropriate. Although + churn doesn't increase memory footprint with reference counting, it + is slower than reusing buffers and might increase memory fragmentation. + +* There is no way to suspend reading or writing in the example. Adding + them is straightforward: the poll set needs to be managed dynamically. + +* The example uses poll() while one should use epoll() on Linux, kqueue() + on BSD systems, etc. + +* Timers are not very accurate, e.g. setInterval() does not try to guarantee + a steady schedule. Instead, the next interval is scheduled after the + current callback has finished. This is not the best behavior for some + environments, but avoids bunching callbacks. + +* Error handling is mostly missing. Debug prints don't interact well + with curses. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/basic-test.js b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/basic-test.js new file mode 100644 index 00000000..04b33927 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/basic-test.js @@ -0,0 +1,17 @@ +/* + * A few basic tests + */ + +var count = 0; +var intervalId; + +setTimeout(function (x) { print('timer 1', x); }, 1234, 'foo'); +setTimeout('print("timer 2");', 4321); +setTimeout(function () { print('timer 3'); }, 2345); +intervalId = setInterval(function (x, y) { + print('interval', ++count, x, y); + if (count >= 10) { + clearInterval(intervalId); + } +}, 400, 'foo', 'bar'); + diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/c_eventloop.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/c_eventloop.c new file mode 100644 index 00000000..75d768b3 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/c_eventloop.c @@ -0,0 +1,618 @@ +/* + * C eventloop example. + * + * Timer management is similar to eventloop.js but implemented in C. + * In particular, timer insertion is an O(n) operation; in a real world + * eventloop based on a heap insertion would be O(log N). + */ + +#include +#include +#include +#include +#include +#include + +#include "duktape.h" + +#define MAX_TIMERS 4096 /* this is quite excessive for embedded use, but good for testing */ +#define MIN_DELAY 1.0 +#define MIN_WAIT 1.0 +#define MAX_WAIT 60000.0 +#define MAX_EXPIRYS 10 + +#define MAX_FDS 256 + +typedef struct { + int64_t id; /* numeric ID (returned from e.g. setTimeout); zero if unused */ + double target; /* next target time */ + double delay; /* delay/interval */ + int oneshot; /* oneshot=1 (setTimeout), repeated=0 (setInterval) */ + int removed; /* timer has been requested for removal */ + + /* The callback associated with the timer is held in the "global stash", + * in .eventTimers[String(id)]. The references must be deleted + * when a timer struct is deleted. + */ +} ev_timer; + +/* Active timers. Dense list, terminates to end of list or first unused timer. + * The list is sorted by 'target', with lowest 'target' (earliest expiry) last + * in the list. When a timer's callback is being called, the timer is moved + * to 'timer_expiring' as it needs special handling should the user callback + * delete that particular timer. + */ +static ev_timer timer_list[MAX_TIMERS]; +static ev_timer timer_expiring; +static int timer_count; /* last timer at timer_count - 1 */ +static int64_t timer_next_id = 1; + +/* Socket poll state. */ +static struct pollfd poll_list[MAX_FDS]; +static int poll_count = 0; + +/* Misc */ +static int exit_requested = 0; + +/* Get Javascript compatible 'now' timestamp (millisecs since 1970). */ +static double get_now(void) { + struct timeval tv; + int rc; + + rc = gettimeofday(&tv, NULL); + if (rc != 0) { + /* Should never happen, so return whatever. */ + return 0.0; + } + return ((double) tv.tv_sec) * 1000.0 + ((double) tv.tv_usec) / 1000.0; +} + +static ev_timer *find_nearest_timer(void) { + /* Last timer expires first (list is always kept sorted). */ + if (timer_count <= 0) { + return NULL; + } + return timer_list + timer_count - 1; +} + +/* Bubble last timer on timer list backwards until it has been moved to + * its proper sorted position (based on 'target' time). + */ +static void bubble_last_timer(void) { + int i; + int n = timer_count; + ev_timer *t; + ev_timer tmp; + + for (i = n - 1; i > 0; i--) { + /* Timer to bubble is at index i, timer to compare to is + * at i-1 (both guaranteed to exist). + */ + t = timer_list + i; + if (t->target <= (t-1)->target) { + /* 't' expires earlier than (or same time as) 't-1', so we're done. */ + break; + } else { + /* 't' expires later than 't-1', so swap them and repeat. */ + memcpy((void *) &tmp, (void *) (t - 1), sizeof(ev_timer)); + memcpy((void *) (t - 1), (void *) t, sizeof(ev_timer)); + memcpy((void *) t, (void *) &tmp, sizeof(ev_timer)); + } + } +} + +static void expire_timers(duk_context *ctx) { + ev_timer *t; + int sanity = MAX_EXPIRYS; + double now; + int rc; + + /* Because a user callback can mutate the timer list (by adding or deleting + * a timer), we expire one timer and then rescan from the end again. There + * is a sanity limit on how many times we do this per expiry round. + */ + + duk_push_global_stash(ctx); + duk_get_prop_string(ctx, -1, "eventTimers"); + + /* [ ... stash eventTimers ] */ + + now = get_now(); + while (sanity-- > 0) { + /* + * If exit has been requested, exit without running further + * callbacks. + */ + + if (exit_requested) { +#if 0 + fprintf(stderr, "exit requested, exiting timer expiry loop\n"); + fflush(stderr); +#endif + break; + } + + /* + * Expired timer(s) still exist? + */ + + if (timer_count <= 0) { + break; + } + t = timer_list + timer_count - 1; + if (t->target > now) { + break; + } + + /* + * Move the timer to 'expiring' for the duration of the callback. + * Mark a one-shot timer deleted, compute a new target for an interval. + */ + + memcpy((void *) &timer_expiring, (void *) t, sizeof(ev_timer)); + memset((void *) t, 0, sizeof(ev_timer)); + timer_count--; + t = &timer_expiring; + + if (t->oneshot) { + t->removed = 1; + } else { + t->target = now + t->delay; /* XXX: or t->target + t->delay? */ + } + + /* + * Call timer callback. The callback can operate on the timer list: + * add new timers, remove timers. The callback can even remove the + * expired timer whose callback we're calling. However, because the + * timer being expired has been moved to 'timer_expiring', we don't + * need to worry about the timer's offset changing on the timer list. + */ + +#if 0 + fprintf(stderr, "calling user callback for timer id %d\n", (int) t->id); + fflush(stderr); +#endif + + duk_push_number(ctx, (double) t->id); + duk_get_prop(ctx, -2); /* -> [ ... stash eventTimers func ] */ + rc = duk_pcall(ctx, 0 /*nargs*/); /* -> [ ... stash eventTimers retval ] */ + if (rc != 0) { +#if 0 + fprintf(stderr, "timer callback failed for timer %d: %s\n", (int) t->id, duk_to_string(ctx, -1)); + fflush(stderr); +#endif + } + duk_pop(ctx); /* ignore errors for now -> [ ... stash eventTimers ] */ + + if (t->removed) { + /* One-shot timer (always removed) or removed by user callback. */ +#if 0 + fprintf(stderr, "deleting callback state for timer %d\n", (int) t->id); + fflush(stderr); +#endif + duk_push_number(ctx, (double) t->id); + duk_del_prop(ctx, -2); + } else { + /* Interval timer, not removed by user callback. Queue back to + * timer list and bubble to its final sorted position. + */ +#if 0 + fprintf(stderr, "queueing timer %d back into active list\n", (int) t->id); + fflush(stderr); +#endif + if (timer_count >= MAX_TIMERS) { + duk_error(ctx, DUK_ERR_RANGE_ERROR, "out of timer slots"); + } + memcpy((void *) (timer_list + timer_count), (void *) t, sizeof(ev_timer)); + timer_count++; + bubble_last_timer(); + } + } + + memset((void *) &timer_expiring, 0, sizeof(ev_timer)); + + duk_pop_2(ctx); /* -> [ ... ] */ +} + +static void compact_poll_list(void) { + int i, j, n; + + /* i = input index + * j = output index (initially same as i) + */ + + n = poll_count; + for (i = 0, j = 0; i < n; i++) { + struct pollfd *pfd = poll_list + i; + if (pfd->fd == 0) { + /* keep output index the same */ +#if 0 + fprintf(stderr, "remove pollfd (index %d): fd=%d, events=%d, revents=%d\n", + i, pfd->fd, pfd->events, pfd->revents), + fflush(stderr); +#endif + + continue; + } +#if 0 + fprintf(stderr, "keep pollfd (index %d -> %d): fd=%d, events=%d, revents=%d\n", + i, j, pfd->fd, pfd->events, pfd->revents), + fflush(stderr); +#endif + if (i != j) { + /* copy only if indices have diverged */ + memcpy((void *) (poll_list + j), (void *) (poll_list + i), sizeof(struct pollfd)); + } + j++; + } + + if (j < poll_count) { + /* zeroize unused entries for sanity */ + memset((void *) (poll_list + j), 0, (poll_count - j) * sizeof(struct pollfd)); + } + + poll_count = j; +} + +int eventloop_run(duk_context *ctx) { + ev_timer *t; + double now; + double diff; + int timeout; + int rc; + int i, n; + int idx_eventloop; + int idx_fd_handler; + + /* The Ecmascript poll handler is passed through EventLoop.fdPollHandler + * which c_eventloop.js sets before we come here. + */ + duk_push_global_object(ctx); + duk_get_prop_string(ctx, -1, "EventLoop"); + duk_get_prop_string(ctx, -1, "fdPollHandler"); /* -> [ global EventLoop fdPollHandler ] */ + idx_fd_handler = duk_get_top_index(ctx); + idx_eventloop = idx_fd_handler - 1; + + for (;;) { + /* + * Expire timers. + */ + + expire_timers(ctx); + + /* + * If exit requested, bail out as fast as possible. + */ + + if (exit_requested) { +#if 0 + fprintf(stderr, "exit requested, exiting event loop\n"); + fflush(stderr); +#endif + break; + } + + /* + * Compact poll list by removing pollfds with fd == 0. + */ + + compact_poll_list(); + + /* + * Determine poll() timeout (as close to poll() as possible as + * the wait is relative). + */ + + now = get_now(); + t = find_nearest_timer(); + if (t) { + diff = t->target - now; + if (diff < MIN_WAIT) { + diff = MIN_WAIT; + } else if (diff > MAX_WAIT) { + diff = MAX_WAIT; + } + timeout = (int) diff; /* clamping ensures that fits */ + } else { + if (poll_count == 0) { +#if 0 + fprintf(stderr, "no timers and no sockets to poll, exiting\n"); + fflush(stderr); +#endif + break; + } + timeout = (int) MAX_WAIT; + } + + /* + * Poll for activity or timeout. + */ + +#if 0 + fprintf(stderr, "going to poll, timeout %d ms, pollfd count %d\n", timeout, poll_count); + fflush(stderr); +#endif + + rc = poll(poll_list, poll_count, timeout); +#if 0 + fprintf(stderr, "poll rc: %d\n", rc); + fflush(stderr); +#endif + if (rc < 0) { + /* error */ + } else if (rc == 0) { + /* timeout */ + } else { + /* 'rc' fds active */ + } + + /* + * Check socket activity, handle all sockets. Handling is offloaded to + * Ecmascript code (fd + revents). + * + * If FDs are removed from the poll list while we're processing callbacks, + * the entries are simply marked unused (fd set to 0) without actually + * removing them from the poll list. This ensures indices are not + * disturbed. The poll list is compacted before next poll(). + */ + + n = (rc == 0 ? 0 : poll_count); /* if timeout, no need to check pollfd */ + for (i = 0; i < n; i++) { + struct pollfd *pfd = poll_list + i; + + if (pfd->fd == 0) { + /* deleted, perhaps by previous callback */ + continue; + } + + if (pfd->revents) { +#if 0 + fprintf(stderr, "fd %d has revents: %d\n", (int) pfd->fd, (int) pfd->revents); + fflush(stderr); +#endif + duk_dup(ctx, idx_fd_handler); + duk_dup(ctx, idx_eventloop); + duk_push_int(ctx, pfd->fd); + duk_push_int(ctx, pfd->revents); + rc = duk_pcall_method(ctx, 2 /*nargs*/); + if (rc) { +#if 0 + fprintf(stderr, "fd callback failed for fd %d: %s\n", (int) pfd->fd, duk_to_string(ctx, -1)); + fflush(stderr); +#endif + } + duk_pop(ctx); + + pfd->revents = 0; + } + + } + } + + duk_pop_n(ctx, 3); + + return 0; +} + +static int create_timer(duk_context *ctx) { + double delay; + int oneshot; + int idx; + int64_t timer_id; + double now; + ev_timer *t; + + now = get_now(); + + /* indexes: + * 0 = function (callback) + * 1 = delay + * 2 = boolean: oneshot + */ + + delay = duk_require_number(ctx, 1); + if (delay < MIN_DELAY) { + delay = MIN_DELAY; + } + oneshot = duk_require_boolean(ctx, 2); + + if (timer_count >= MAX_TIMERS) { + duk_error(ctx, DUK_ERR_RANGE_ERROR, "out of timer slots"); + } + idx = timer_count++; + timer_id = timer_next_id++; + t = timer_list + idx; + + memset((void *) t, 0, sizeof(ev_timer)); + t->id = timer_id; + t->target = now + delay; + t->delay = delay; + t->oneshot = oneshot; + t->removed = 0; + + /* Timer is now at the last position; use swaps to "bubble" it to its + * correct sorted position. + */ + + bubble_last_timer(); + + /* Finally, register the callback to the global stash 'eventTimers' object. */ + + duk_push_global_stash(ctx); + duk_get_prop_string(ctx, -1, "eventTimers"); /* -> [ func delay oneshot stash eventTimers ] */ + duk_push_number(ctx, (double) timer_id); + duk_dup(ctx, 0); + duk_put_prop(ctx, -3); /* eventTimers[timer_id] = callback */ + + /* Return timer id. */ + + duk_push_number(ctx, (double) timer_id); +#if 0 + fprintf(stderr, "created timer id: %d\n", (int) timer_id); + fflush(stderr); +#endif + return 1; +} + +static int delete_timer(duk_context *ctx) { + int i, n; + int64_t timer_id; + ev_timer *t; + int found = 0; + + /* indexes: + * 0 = timer id + */ + + timer_id = (int64_t) duk_require_number(ctx, 0); + + /* + * Unlike insertion, deletion needs a full scan of the timer list + * and an expensive remove. If no match is found, nothing is deleted. + * Caller gets a boolean return code indicating match. + * + * When a timer is being expired and its user callback is running, + * the timer has been moved to 'timer_expiring' and its deletion + * needs special handling: just mark it to-be-deleted and let the + * expiry code remove it. + */ + + t = &timer_expiring; + if (t->id == timer_id) { + t->removed = 1; + duk_push_true(ctx); +#if 0 + fprintf(stderr, "deleted expiring timer id: %d\n", (int) timer_id); + fflush(stderr); +#endif + return 1; + } + + n = timer_count; + for (i = 0; i < n; i++) { + t = timer_list + i; + if (t->id == timer_id) { + found = 1; + + /* Shift elements downwards to keep the timer list dense + * (no need if last element). + */ + if (i < timer_count - 1) { + memmove((void *) t, (void *) (t + 1), (timer_count - i - 1) * sizeof(ev_timer)); + } + + /* Zero last element for clarity. */ + memset((void *) (timer_list + n - 1), 0, sizeof(ev_timer)); + + /* Update timer_count. */ + timer_count--; + + /* The C state is now up-to-date, but we still need to delete + * the timer callback state from the global 'stash'. + */ + + duk_push_global_stash(ctx); + duk_get_prop_string(ctx, -1, "eventTimers"); /* -> [ timer_id stash eventTimers ] */ + duk_push_number(ctx, (double) timer_id); + duk_del_prop(ctx, -2); /* delete eventTimers[timer_id] */ + +#if 0 + fprintf(stderr, "deleted timer id: %d\n", (int) timer_id); + fflush(stderr); +#endif + break; + } + } + +#if 0 + if (!found) { + fprintf(stderr, "trying to delete timer id %d, but not found; ignoring\n", (int) timer_id); + fflush(stderr); + } +#endif + + duk_push_boolean(ctx, found); + return 1; +} + +static int listen_fd(duk_context *ctx) { + int fd = duk_require_int(ctx, 0); + int events = duk_require_int(ctx, 1); + int i, n; + struct pollfd *pfd; + +#if 0 + fprintf(stderr, "listen_fd: fd=%d, events=%d\n", fd, events); + fflush(stderr); +#endif + /* events == 0 means stop listening to the FD */ + + n = poll_count; + for (i = 0; i < n; i++) { + pfd = poll_list + i; + if (pfd->fd == fd) { +#if 0 + fprintf(stderr, "listen_fd: fd found at index %d\n", i); + fflush(stderr); +#endif + if (events == 0) { + /* mark to-be-deleted, cleaned up by next poll */ + pfd->fd = 0; + } else { + pfd->events = events; + } + return 0; + } + } + + /* not found, append to list */ +#if 0 + fprintf(stderr, "listen_fd: fd not found on list, add new entry\n"); + fflush(stderr); +#endif + + if (poll_count >= MAX_FDS) { + duk_error(ctx, DUK_ERR_ERROR, "out of fd slots"); + } + + pfd = poll_list + poll_count; + pfd->fd = fd; + pfd->events = events; + pfd->revents = 0; + poll_count++; + + return 0; +} + +static int request_exit(duk_context *ctx) { + (void) ctx; + exit_requested = 1; + return 0; +} + +static duk_function_list_entry eventloop_funcs[] = { + { "createTimer", create_timer, 3 }, + { "deleteTimer", delete_timer, 1 }, + { "listenFd", listen_fd, 2 }, + { "requestExit", request_exit, 0 }, + { NULL, NULL, 0 } +}; + +void eventloop_register(duk_context *ctx) { + memset((void *) timer_list, 0, MAX_TIMERS * sizeof(ev_timer)); + memset((void *) &timer_expiring, 0, sizeof(ev_timer)); + memset((void *) poll_list, 0, MAX_FDS * sizeof(struct pollfd)); + + /* Set global 'EventLoop'. */ + duk_push_global_object(ctx); + duk_push_object(ctx); + duk_put_function_list(ctx, -1, eventloop_funcs); + duk_put_prop_string(ctx, -2, "EventLoop"); + duk_pop(ctx); + + /* Initialize global stash 'eventTimers'. */ + duk_push_global_stash(ctx); + duk_push_object(ctx); + duk_put_prop_string(ctx, -2, "eventTimers"); + duk_pop(ctx); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/c_eventloop.js b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/c_eventloop.js new file mode 100644 index 00000000..b9e2d633 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/c_eventloop.js @@ -0,0 +1,179 @@ +/* + * C eventloop example (c_eventloop.c). + * + * Ecmascript code to initialize the exposed API (setTimeout() etc) when + * using the C eventloop. + * + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Timers + */ + +/* + * Timer API + */ + +function setTimeout(func, delay) { + var cb_func; + var bind_args; + var timer_id; + + if (typeof delay !== 'number') { + throw new TypeError('delay is not a number'); + } + + if (typeof func === 'string') { + // Legacy case: callback is a string. + cb_func = eval.bind(this, func); + } else if (typeof func !== 'function') { + throw new TypeError('callback is not a function/string'); + } else if (arguments.length > 2) { + // Special case: callback arguments are provided. + bind_args = Array.prototype.slice.call(arguments, 2); // [ arg1, arg2, ... ] + bind_args.unshift(this); // [ global(this), arg1, arg2, ... ] + cb_func = func.bind.apply(func, bind_args); + } else { + // Normal case: callback given as a function without arguments. + cb_func = func; + } + + timer_id = EventLoop.createTimer(cb_func, delay, true /*oneshot*/); + + return timer_id; +} + +function clearTimeout(timer_id) { + if (typeof timer_id !== 'number') { + throw new TypeError('timer ID is not a number'); + } + var success = EventLoop.deleteTimer(timer_id); /* retval ignored */ +} + +function setInterval(func, delay) { + var cb_func; + var bind_args; + var timer_id; + + if (typeof delay !== 'number') { + throw new TypeError('delay is not a number'); + } + + if (typeof func === 'string') { + // Legacy case: callback is a string. + cb_func = eval.bind(this, func); + } else if (typeof func !== 'function') { + throw new TypeError('callback is not a function/string'); + } else if (arguments.length > 2) { + // Special case: callback arguments are provided. + bind_args = Array.prototype.slice.call(arguments, 2); // [ arg1, arg2, ... ] + bind_args.unshift(this); // [ global(this), arg1, arg2, ... ] + cb_func = func.bind.apply(func, bind_args); + } else { + // Normal case: callback given as a function without arguments. + cb_func = func; + } + + timer_id = EventLoop.createTimer(cb_func, delay, false /*oneshot*/); + + return timer_id; +} + +function clearInterval(timer_id) { + if (typeof timer_id !== 'number') { + throw new TypeError('timer ID is not a number'); + } + EventLoop.deleteTimer(timer_id); +} + +function requestEventLoopExit() { + EventLoop.requestExit(); +} + +/* + * Socket handling + * + * Ideally this would be implemented more in C than here for more speed + * and smaller footprint: C code would directly maintain the callback state + * and such. + * + * Also for more optimal I/O, the buffer churn caused by allocating and + * freeing a lot of buffer values could be eliminated by reusing buffers. + * Socket reads would then go into a pre-allocated buffer, for instance. + */ + +EventLoop.socketListening = {}; +EventLoop.socketReading = {}; +EventLoop.socketConnecting = {}; + +EventLoop.fdPollHandler = function(fd, revents) { + var data; + var cb; + var rc; + var acc_res; + + //print('activity on fd', fd, 'revents', revents); + + if (revents & Poll.POLLIN) { + cb = this.socketReading[fd]; + if (cb) { + data = Socket.read(fd); // no size control now + //print('READ', Duktape.enc('jx', data)); + if (data.length === 0) { + this.close(fd); + return; + } + cb(fd, data); + } else { + cb = this.socketListening[fd]; + if (cb) { + acc_res = Socket.accept(fd); + //print('ACCEPT:', Duktape.enc('jx', acc_res)); + cb(acc_res.fd, acc_res.addr, acc_res.port); + } else { + //print('UNKNOWN'); + } + } + } + + if (revents & Poll.POLLOUT) { + // Connected + cb = this.socketConnecting[fd]; + if (cb) { + delete this.socketConnecting[fd]; + cb(fd); + } + } + + if ((revents & ~(Poll.POLLIN | Poll.POLLOUT)) !== 0) { + //print('unexpected revents, close fd'); + this.close(fd); + } +} + +EventLoop.server = function(address, port, cb_accepted) { + var fd = Socket.createServerSocket(address, port); + this.socketListening[fd] = cb_accepted; + this.listenFd(fd, Poll.POLLIN); +} + +EventLoop.connect = function(address, port, cb_connected) { + var fd = Socket.connect(address, port); + this.socketConnecting[fd] = cb_connected; + this.listenFd(fd, Poll.POLLOUT); +} + +EventLoop.close = function(fd) { + EventLoop.listenFd(fd, 0); + delete this.socketListening[fd]; + delete this.socketReading[fd]; + delete this.socketConnecting[fd]; + Socket.close(fd); +} + +EventLoop.setReader = function(fd, cb_read) { + this.socketReading[fd] = cb_read; + this.listenFd(fd, Poll.POLLIN); +} + +EventLoop.write = function(fd, data) { + // This simple example doesn't have support for write blocking / draining + var rc = Socket.write(fd, Duktape.Buffer(data)); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/client-socket-test.js b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/client-socket-test.js new file mode 100644 index 00000000..ff877848 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/client-socket-test.js @@ -0,0 +1,24 @@ + +var HOST = 'localhost'; +var PORT = 80; +var EXIT_TIMEOUT = 300e3; + +print('automatic exit after ' + (EXIT_TIMEOUT / 1e3) + ' seconds'); +setTimeout(function () { + print('exit timer'); + EventLoop.requestExit(); +}, EXIT_TIMEOUT); + +EventLoop.connect(HOST, PORT, function (fd) { + print('connected to ' + HOST + ':' + PORT + ', fd', fd); + EventLoop.setReader(fd, function (fd, data) { + print('read from fd', fd); + print(data); + EventLoop.close(fd); + }); + EventLoop.write(fd, "GET / HTTP/1.1\r\n" + + "Host: " + HOST + "\r\n" + + "User-Agent: client-socket-test.js\r\n" + + "\r\n"); +}); + diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/curses-timers.js b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/curses-timers.js new file mode 100644 index 00000000..45086653 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/curses-timers.js @@ -0,0 +1,79 @@ +/* + * Test using timers and intervals with curses. + */ + +if (typeof Ncurses !== 'object') { + throw new Error('Ncurses required'); +} + +function fillScreen(ch) { + var size, w, h; + var i, j; + + size = Ncurses.getmaxyx(); + h = size[0]; + w = size[1]; + + for (i = 0; i < h; i++) { + for (j = 0; j < w; j++) { + Ncurses.mvprintw(i, j, ch); + } + } + Ncurses.refresh(); +} + +function main() { + var i, j; + var counters = []; + var size, w, h; + + Ncurses.initscr(); + size = Ncurses.getmaxyx(); + h = size[0]; + w = size[1]; + + fillScreen('.'); + + setInterval(function () { + Ncurses.mvprintw(1, 4, new Date().toISOString()); + Ncurses.refresh(); + }, 1000); + + function addCounter(row, index, interval) { + counters[index] = 0; + setInterval(function () { + counters[index]++; + Ncurses.mvprintw(row, 4, '' + Date.now() + ' ' + counters[index]); + Ncurses.refresh(); + }, interval); + } + + function addRandomChar(row, col, interval) { + setTimeout(function () { + Ncurses.mvprintw(row, col, String.fromCharCode(Math.random() * 64 + 0x20)); + Ncurses.refresh(); + }, interval); + } + + for (i = 0; i < h - 5; i++) { + addCounter(3 + i, i, 363 * i + 400); + } + + /* Here the inserts take a lot of time because the underlying timer manager + * data structure has O(n) insertion performance. + */ + for (i = 0; i < h - 5; i++) { + for (j = 0; j < w - 50; j++) { + // Math.exp(0)...Math.exp(8) is an uneven distribution between 1...~2980. + addRandomChar(3 + i, 28 + j, 58000 - Math.exp(Math.random() * 8) * 20); + } + } + + setTimeout(function () { + Ncurses.endwin(); + Ncurses.delscreen(); + requestEventLoopExit(); + }, 120e3); +} + +main(); diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/ecma_eventloop.js b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/ecma_eventloop.js new file mode 100644 index 00000000..bad4e4d9 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/ecma_eventloop.js @@ -0,0 +1,466 @@ +/* + * Pure Ecmascript eventloop example. + * + * Timer state handling is inefficient in this trivial example. Timers are + * kept in an array sorted by their expiry time which works well for expiring + * timers, but has O(n) insertion performance. A better implementation would + * use a heap or some other efficient structure for managing timers so that + * all operations (insert, remove, get nearest timer) have good performance. + * + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Timers + */ + +/* + * Event loop + * + * Timers are sorted by 'target' property which indicates expiry time of + * the timer. The timer expiring next is last in the array, so that + * removals happen at the end, and inserts for timers expiring in the + * near future displace as few elements in the array as possible. + */ + +EventLoop = { + // timers + timers: [], // active timers, sorted (nearest expiry last) + expiring: null, // set to timer being expired (needs special handling in clearTimeout/clearInterval) + nextTimerId: 1, + minimumDelay: 1, + minimumWait: 1, + maximumWait: 60000, + maxExpirys: 10, + + // sockets + socketListening: {}, // fd -> callback + socketReading: {}, // fd -> callback + socketConnecting: {}, // fd -> callback + + // misc + exitRequested: false +}; + +EventLoop.dumpState = function() { + print('TIMER STATE:'); + this.timers.forEach(function(t) { + print(' ' + Duktape.enc('jx', t)); + }); + if (this.expiring) { + print(' EXPIRING: ' + Duktape.enc('jx', this.expiring)); + } +} + +// Get timer with lowest expiry time. Since the active timers list is +// sorted, it's always the last timer. +EventLoop.getEarliestTimer = function() { + var timers = this.timers; + n = timers.length; + return (n > 0 ? timers[n - 1] : null); +} + +EventLoop.getEarliestWait = function() { + var t = this.getEarliestTimer(); + return (t ? t.target - Date.now() : null); +} + +EventLoop.insertTimer = function(timer) { + var timers = this.timers; + var i, n, t; + + /* + * Find 'i' such that we want to insert *after* timers[i] at index i+1. + * If no such timer, for-loop terminates with i-1, and we insert at -1+1=0. + */ + + n = timers.length; + for (i = n - 1; i >= 0; i--) { + t = timers[i]; + if (timer.target <= t.target) { + // insert after 't', to index i+1 + break; + } + } + + timers.splice(i + 1 /*start*/, 0 /*deleteCount*/, timer); +} + +// Remove timer/interval with a timer ID. The timer/interval can reside +// either on the active list or it may be an expired timer (this.expiring) +// whose user callback we're running when this function gets called. +EventLoop.removeTimerById = function(timer_id) { + var timers = this.timers; + var i, n, t; + + t = this.expiring; + if (t) { + if (t.id === timer_id) { + // Timer has expired and we're processing its callback. User + // callback has requested timer deletion. Mark removed, so + // that the timer is not reinserted back into the active list. + // This is actually a common case because an interval may very + // well cancel itself. + t.removed = true; + return; + } + } + + n = timers.length; + for (i = 0; i < n; i++) { + t = timers[i]; + if (t.id === timer_id) { + // Timer on active list: mark removed (not really necessary, but + // nice for dumping), and remove from active list. + t.removed = true; + this.timers.splice(i /*start*/, 1 /*deleteCount*/); + return; + } + } + + // no such ID, ignore +} + +EventLoop.processTimers = function() { + var now = Date.now(); + var timers = this.timers; + var sanity = this.maxExpirys; + var n, t; + + /* + * Here we must be careful with mutations: user callback may add and + * delete an arbitrary number of timers. + * + * Current solution is simple: check whether the timer at the end of + * the list has expired. If not, we're done. If it has expired, + * remove it from the active list, record it in this.expiring, and call + * the user callback. If user code deletes the this.expiring timer, + * there is special handling which just marks the timer deleted so + * it won't get inserted back into the active list. + * + * This process is repeated at most maxExpirys times to ensure we don't + * get stuck forever; user code could in principle add more and more + * already expired timers. + */ + + while (sanity-- > 0) { + // If exit requested, don't call any more callbacks. This allows + // a callback to do cleanups and request exit, and can be sure that + // no more callbacks are processed. + + if (this.exitRequested) { + //print('exit requested, exit'); + break; + } + + // Timers to expire? + + n = timers.length; + if (n <= 0) { + break; + } + t = timers[n - 1]; + if (now <= t.target) { + // Timer has not expired, and no other timer could have expired + // either because the list is sorted. + break; + } + timers.pop(); + + // Remove the timer from the active list and process it. The user + // callback may add new timers which is not a problem. The callback + // may also delete timers which is not a problem unless the timer + // being deleted is the timer whose callback we're running; this is + // why the timer is recorded in this.expiring so that clearTimeout() + // and clearInterval() can detect this situation. + + if (t.oneshot) { + t.removed = true; // flag for removal + } else { + t.target = now + t.delay; + } + this.expiring = t; + try { + t.cb(); + } catch (e) { + print('timer callback failed, ignored: ' + e); + } + this.expiring = null; + + // If the timer was one-shot, it's marked 'removed'. If the user callback + // requested deletion for the timer, it's also marked 'removed'. If the + // timer is an interval (and is not marked removed), insert it back into + // the timer list. + + if (!t.removed) { + // Reinsert interval timer to correct sorted position. The timer + // must be an interval timer because one-shot timers are marked + // 'removed' above. + this.insertTimer(t); + } + } +} + +EventLoop.run = function() { + var wait; + var POLLIN = Poll.POLLIN; + var POLLOUT = Poll.POLLOUT; + var poll_set; + var poll_count; + var fd; + var t, rev; + var rc; + var acc_res; + + for (;;) { + /* + * Process expired timers. + */ + + this.processTimers(); + //this.dumpState(); + + /* + * Exit check (may be requested by a user callback) + */ + + if (this.exitRequested) { + //print('exit requested, exit'); + break; + } + + /* + * Create poll socket list. This is a very naive approach. + * On Linux, one could use e.g. epoll() and manage socket lists + * incrementally. + */ + + poll_set = {}; + poll_count = 0; + for (fd in this.socketListening) { + poll_set[fd] = { events: POLLIN, revents: 0 }; + poll_count++; + } + for (fd in this.socketReading) { + poll_set[fd] = { events: POLLIN, revents: 0 }; + poll_count++; + } + for (fd in this.socketConnecting) { + poll_set[fd] = { events: POLLOUT, revents: 0 }; + poll_count++; + } + //print(new Date(), 'poll_set IN:', Duktape.enc('jx', poll_set)); + + /* + * Wait timeout for timer closest to expiry. Since the poll + * timeout is relative, get this as close to poll() as possible. + */ + + wait = this.getEarliestWait(); + if (wait === null) { + if (poll_count === 0) { + print('no active timers and no sockets to poll, exit'); + break; + } else { + wait = this.maximumWait; + } + } else { + wait = Math.min(this.maximumWait, Math.max(this.minimumWait, wait)); + } + + /* + * Do the actual poll. + */ + + try { + Poll.poll(poll_set, wait); + } catch (e) { + // Eat errors silently. When resizing curses window an EINTR + // happens now. + } + + /* + * Process all sockets so that nothing is left unhandled for the + * next round. + */ + + //print(new Date(), 'poll_set OUT:', Duktape.enc('jx', poll_set)); + for (fd in poll_set) { + t = poll_set[fd]; + rev = t.revents; + + if (rev & POLLIN) { + cb = this.socketReading[fd]; + if (cb) { + data = Socket.read(fd); // no size control now + //print('READ', Duktape.enc('jx', data)); + if (data.length === 0) { + //print('zero read for fd ' + fd + ', closing forcibly'); + rc = Socket.close(fd); // ignore result + delete this.socketListening[fd]; + delete this.socketReading[fd]; + } else { + cb(fd, data); + } + } else { + cb = this.socketListening[fd]; + if (cb) { + acc_res = Socket.accept(fd); + //print('ACCEPT:', Duktape.enc('jx', acc_res)); + cb(acc_res.fd, acc_res.addr, acc_res.port); + } else { + //print('UNKNOWN'); + } + } + } + + if (rev & POLLOUT) { + cb = this.socketConnecting[fd]; + if (cb) { + delete this.socketConnecting[fd]; + cb(fd); + } else { + //print('UNKNOWN POLLOUT'); + } + } + + if ((rev & ~(POLLIN | POLLOUT)) !== 0) { + //print('revents ' + t.revents + ' for fd ' + fd + ', closing forcibly'); + rc = Socket.close(fd); // ignore result + delete this.socketListening[fd]; + delete this.socketReading[fd]; + } + } + } +} + +EventLoop.requestExit = function() { + this.exitRequested = true; +} + +EventLoop.server = function(address, port, cb_accepted) { + var fd = Socket.createServerSocket(address, port); + this.socketListening[fd] = cb_accepted; +} + +EventLoop.connect = function(address, port, cb_connected) { + var fd = Socket.connect(address, port); + this.socketConnecting[fd] = cb_connected; +} + +EventLoop.close = function(fd) { + delete this.socketReading[fd]; + delete this.socketListening[fd]; +} + +EventLoop.setReader = function(fd, cb_read) { + this.socketReading[fd] = cb_read; +} + +EventLoop.write = function(fd, data) { + // This simple example doesn't have support for write blocking / draining + var rc = Socket.write(fd, Duktape.Buffer(data)); +} + +/* + * Timer API + * + * These interface with the singleton EventLoop. + */ + +function setTimeout(func, delay) { + var cb_func; + var bind_args; + var timer_id; + var evloop = EventLoop; + + if (typeof delay !== 'number') { + throw new TypeError('delay is not a number'); + } + delay = Math.max(evloop.minimumDelay, delay); + + if (typeof func === 'string') { + // Legacy case: callback is a string. + cb_func = eval.bind(this, func); + } else if (typeof func !== 'function') { + throw new TypeError('callback is not a function/string'); + } else if (arguments.length > 2) { + // Special case: callback arguments are provided. + bind_args = Array.prototype.slice.call(arguments, 2); // [ arg1, arg2, ... ] + bind_args.unshift(this); // [ global(this), arg1, arg2, ... ] + cb_func = func.bind.apply(func, bind_args); + } else { + // Normal case: callback given as a function without arguments. + cb_func = func; + } + + timer_id = evloop.nextTimerId++; + + evloop.insertTimer({ + id: timer_id, + oneshot: true, + cb: cb_func, + delay: delay, + target: Date.now() + delay + }); + + return timer_id; +} + +function clearTimeout(timer_id) { + var evloop = EventLoop; + + if (typeof timer_id !== 'number') { + throw new TypeError('timer ID is not a number'); + } + evloop.removeTimerById(timer_id); +} + +function setInterval(func, delay) { + var cb_func; + var bind_args; + var timer_id; + var evloop = EventLoop; + + if (typeof delay !== 'number') { + throw new TypeError('delay is not a number'); + } + delay = Math.max(evloop.minimumDelay, delay); + + if (typeof func === 'string') { + // Legacy case: callback is a string. + cb_func = eval.bind(this, func); + } else if (typeof func !== 'function') { + throw new TypeError('callback is not a function/string'); + } else if (arguments.length > 2) { + // Special case: callback arguments are provided. + bind_args = Array.prototype.slice.call(arguments, 2); // [ arg1, arg2, ... ] + bind_args.unshift(this); // [ global(this), arg1, arg2, ... ] + cb_func = func.bind.apply(func, bind_args); + } else { + // Normal case: callback given as a function without arguments. + cb_func = func; + } + + timer_id = evloop.nextTimerId++; + + evloop.insertTimer({ + id: timer_id, + oneshot: false, + cb: cb_func, + delay: delay, + target: Date.now() + delay + }); + + return timer_id; +} + +function clearInterval(timer_id) { + var evloop = EventLoop; + + if (typeof timer_id !== 'number') { + throw new TypeError('timer ID is not a number'); + } + evloop.removeTimerById(timer_id); +} + +/* custom call */ +function requestEventLoopExit() { + EventLoop.requestExit(); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/fileio.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/fileio.c new file mode 100644 index 00000000..df94cd43 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/fileio.c @@ -0,0 +1,69 @@ +/* + * File I/O binding example. + */ + +#include +#include +#include + +#include "duktape.h" + +static int fileio_readfile(duk_context *ctx) { + const char *filename = duk_to_string(ctx, 0); + FILE *f = NULL; + long len; + void *buf; + size_t got; + + if (!filename) { + goto error; + } + + f = fopen(filename, "rb"); + if (!f) { + goto error; + } + + if (fseek(f, 0, SEEK_END) != 0) { + goto error; + } + + len = ftell(f); + + if (fseek(f, 0, SEEK_SET) != 0) { + goto error; + } + + buf = duk_push_fixed_buffer(ctx, (size_t) len); + + got = fread(buf, 1, len, f); + if (got != (size_t) len) { + goto error; + } + + fclose(f); + f = NULL; + + return 1; + + error: + if (f) { + fclose(f); + } + + return DUK_RET_ERROR; +} + +static duk_function_list_entry fileio_funcs[] = { + { "readfile", fileio_readfile, 1 }, + { NULL, NULL, 0 } +}; + +void fileio_register(duk_context *ctx) { + /* Set global 'FileIo'. */ + duk_push_global_object(ctx); + duk_push_object(ctx); + duk_put_function_list(ctx, -1, fileio_funcs); + duk_put_prop_string(ctx, -2, "FileIo"); + duk_pop(ctx); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/main.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/main.c new file mode 100644 index 00000000..76279218 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/main.c @@ -0,0 +1,256 @@ +/* + * Main for evloop command line tool. + * + * Runs a given script from file or stdin inside an eventloop. The + * script can then access setTimeout() etc. + */ + +#include +#include +#include +#ifndef NO_SIGNAL +#include +#endif + +#include "duktape.h" + +extern void poll_register(duk_context *ctx); +extern void ncurses_register(duk_context *ctx); +extern void socket_register(duk_context *ctx); +extern void fileio_register(duk_context *ctx); +extern void eventloop_register(duk_context *ctx); +extern int eventloop_run(duk_context *ctx); /* Duktape/C function, safe called */ + +static int c_evloop = 0; + +#ifndef NO_SIGNAL +static void my_sighandler(int x) { + fprintf(stderr, "Got signal %d\n", x); + fflush(stderr); +} +static void set_sigint_handler(void) { + (void) signal(SIGINT, my_sighandler); +} +#endif /* NO_SIGNAL */ + +/* Print error to stderr and pop error. */ +static void print_error(duk_context *ctx, FILE *f) { + if (duk_is_object(ctx, -1) && duk_has_prop_string(ctx, -1, "stack")) { + /* XXX: print error objects specially */ + /* XXX: pcall the string coercion */ + duk_get_prop_string(ctx, -1, "stack"); + if (duk_is_string(ctx, -1)) { + fprintf(f, "%s\n", duk_get_string(ctx, -1)); + fflush(f); + duk_pop_2(ctx); + return; + } else { + duk_pop(ctx); + } + } + duk_to_string(ctx, -1); + fprintf(f, "%s\n", duk_get_string(ctx, -1)); + fflush(f); + duk_pop(ctx); +} + +int wrapped_compile_execute(duk_context *ctx) { + int comp_flags = 0; + int rc; + + /* Compile input and place it into global _USERCODE */ + duk_compile(ctx, comp_flags); + duk_push_global_object(ctx); + duk_insert(ctx, -2); /* [ ... global func ] */ + duk_put_prop_string(ctx, -2, "_USERCODE"); + duk_pop(ctx); +#if 0 + printf("compiled usercode\n"); +#endif + + /* Start a zero timer which will call _USERCODE from within + * the event loop. + */ + fprintf(stderr, "set _USERCODE timer\n"); + fflush(stderr); + duk_eval_string(ctx, "setTimeout(function() { _USERCODE(); }, 0);"); + duk_pop(ctx); + + /* Finally, launch eventloop. This call only returns after the + * eventloop terminates. + */ + if (c_evloop) { + fprintf(stderr, "calling eventloop_run()\n"); + fflush(stderr); + rc = duk_safe_call(ctx, eventloop_run, 0 /*nargs*/, 1 /*nrets*/); + if (rc != 0) { + fprintf(stderr, "eventloop_run() failed: %s\n", duk_to_string(ctx, -1)); + fflush(stderr); + } + duk_pop(ctx); + } else { + fprintf(stderr, "calling EventLoop.run()\n"); + fflush(stderr); + duk_eval_string(ctx, "EventLoop.run();"); + duk_pop(ctx); + } + + return 0; +} + +int handle_fh(duk_context *ctx, FILE *f, const char *filename) { + char *buf = NULL; + int len; + int got; + int rc; + int retval = -1; + + if (fseek(f, 0, SEEK_END) < 0) { + goto error; + } + len = (int) ftell(f); + if (fseek(f, 0, SEEK_SET) < 0) { + goto error; + } + buf = (char *) malloc(len); + if (!buf) { + goto error; + } + + got = fread((void *) buf, (size_t) 1, (size_t) len, f); + + duk_push_lstring(ctx, buf, got); + duk_push_string(ctx, filename); + + free(buf); + buf = NULL; + + rc = duk_safe_call(ctx, wrapped_compile_execute, 2 /*nargs*/, 1 /*nret*/); + if (rc != DUK_EXEC_SUCCESS) { + print_error(ctx, stderr); + goto error; + } else { + duk_pop(ctx); + retval = 0; + } + /* fall thru */ + + error: + if (buf) { + free(buf); + } + return retval; +} + +int handle_file(duk_context *ctx, const char *filename) { + FILE *f = NULL; + int retval; + + f = fopen(filename, "rb"); + if (!f) { + fprintf(stderr, "failed to open source file: %s\n", filename); + fflush(stderr); + goto error; + } + + retval = handle_fh(ctx, f, filename); + + fclose(f); + return retval; + + error: + return -1; +} + +int handle_stdin(duk_context *ctx) { + int retval; + + retval = handle_fh(ctx, stdin, "stdin"); + + return retval; +} + +int main(int argc, char *argv[]) { + duk_context *ctx = NULL; + int retval = 0; + const char *filename = NULL; + int i; + +#ifndef NO_SIGNAL + set_sigint_handler(); + + /* This is useful at the global level; libraries should avoid SIGPIPE though */ + /*signal(SIGPIPE, SIG_IGN);*/ +#endif + + for (i = 1; i < argc; i++) { + char *arg = argv[i]; + if (!arg) { + goto usage; + } + if (strcmp(arg, "-c") == 0) { + c_evloop = 1; + } else if (strlen(arg) > 1 && arg[0] == '-') { + goto usage; + } else { + if (filename) { + goto usage; + } + filename = arg; + } + } + if (!filename) { + goto usage; + } + + ctx = duk_create_heap_default(); + + poll_register(ctx); + ncurses_register(ctx); + socket_register(ctx); + fileio_register(ctx); + + if (c_evloop) { + fprintf(stderr, "Using C based eventloop (omit -c to use Ecmascript based eventloop)\n"); + fflush(stderr); + + eventloop_register(ctx); + duk_eval_file(ctx, "c_eventloop.js"); + } else { + fprintf(stderr, "Using Ecmascript based eventloop (give -c to use C based eventloop)\n"); + fflush(stderr); + + duk_eval_file(ctx, "ecma_eventloop.js"); + } + + fprintf(stderr, "Executing code from: '%s'\n", filename); + fflush(stderr); + + if (strcmp(filename, "-") == 0) { + if (handle_stdin(ctx) != 0) { + retval = 1; + goto cleanup; + } + } else { + if (handle_file(ctx, filename) != 0) { + retval = 1; + goto cleanup; + } + } + + cleanup: + if (ctx) { + duk_destroy_heap(ctx); + } + + return retval; + + usage: + fprintf(stderr, "Usage: evloop [-c] \n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Uses an Ecmascript based eventloop (ecma_eventloop.js) by default.\n"); + fprintf(stderr, "If -c option given, uses a C based eventloop (c_eventloop.{c,js}).\n"); + fprintf(stderr, "If is '-', the entire STDIN executed.\n"); + fflush(stderr); + exit(1); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/ncurses.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/ncurses.c new file mode 100644 index 00000000..7734fcc9 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/ncurses.c @@ -0,0 +1,105 @@ +/* + * Ncurses bindings example. + * + * VALGRIND NOTE: when you use ncurses, there seems to be no way to get a + * clean valgrind run. Even if ncurses state is properly shut down, there + * will still be some residual leaks. + * + * Debian: install libncurses5-dev + */ + +#include +#include "duktape.h" + +static int ncurses_initscr(duk_context *ctx) { + WINDOW *win; + + win = initscr(); + duk_push_pointer(ctx, (void *) win); + return 1; +} + +static int ncurses_endwin(duk_context *ctx) { + int rc; + + rc = endwin(); + duk_push_int(ctx, rc); + return 1; +} + +static int ncurses_delscreen(duk_context *ctx) { + /* XXX: no screen management now */ + (void) ctx; + return 0; +} + +static int ncurses_getmaxyx(duk_context *ctx) { + int row, col; + + getmaxyx(stdscr, row, col); + + duk_push_array(ctx); + duk_push_int(ctx, row); + duk_put_prop_index(ctx, -2, 0); + duk_push_int(ctx, col); + duk_put_prop_index(ctx, -2, 1); + return 1; +} + +static int ncurses_printw(duk_context *ctx) { + int rc; + const char *str; + + str = duk_to_string(ctx, 0); + rc = printw("%s", str); + duk_push_int(ctx, rc); + return 1; +} + +static int ncurses_mvprintw(duk_context *ctx) { + int y = duk_to_int(ctx, 0); + int x = duk_to_int(ctx, 1); + const char *str = duk_to_string(ctx, 2); + int rc; + + rc = mvprintw(y, x, "%s", str); + duk_push_int(ctx, rc); + return 1; +} + +static int ncurses_refresh(duk_context *ctx) { + int rc; + + rc = refresh(); + duk_push_int(ctx, rc); + return 1; +} + +static int ncurses_getch(duk_context *ctx) { + int rc; + + rc = getch(); + duk_push_int(ctx, rc); + return 1; +} + +static duk_function_list_entry ncurses_funcs[] = { + { "initscr", ncurses_initscr, 0 }, + { "endwin", ncurses_endwin, 0 }, + { "delscreen", ncurses_delscreen, 0 }, + { "getmaxyx", ncurses_getmaxyx, 0 }, + { "printw", ncurses_printw, 1 }, + { "mvprintw", ncurses_mvprintw, 3 }, + { "refresh", ncurses_refresh, 0 }, + { "getch", ncurses_getch, 0 }, + { NULL, NULL, 0 } +}; + +void ncurses_register(duk_context *ctx) { + /* Set global 'Ncurses'. */ + duk_push_global_object(ctx); + duk_push_object(ctx); + duk_put_function_list(ctx, -1, ncurses_funcs); + duk_put_prop_string(ctx, -2, "Ncurses"); + duk_pop(ctx); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/poll.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/poll.c new file mode 100644 index 00000000..c78745d2 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/poll.c @@ -0,0 +1,111 @@ +/* + * C wrapper for poll(). + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include + +#include "duktape.h" + +static int poll_poll(duk_context *ctx) { + int timeout = duk_to_int(ctx, 1); + int i, n, nchanged; + int fd, rc; + struct pollfd fds[20]; + struct timespec ts; + + memset(fds, 0, sizeof(fds)); + + n = 0; + duk_enum(ctx, 0, 0 /*enum_flags*/); + while (duk_next(ctx, -1, 0)) { + if ((size_t) n >= sizeof(fds) / sizeof(struct pollfd)) { + return -1; + } + + /* [... enum key] */ + duk_dup_top(ctx); /* -> [... enum key key] */ + duk_get_prop(ctx, 0); /* -> [... enum key val] */ + fd = duk_to_int(ctx, -2); + + duk_push_string(ctx, "events"); + duk_get_prop(ctx, -2); /* -> [... enum key val events] */ + + fds[n].fd = fd; + fds[n].events = duk_to_int(ctx, -1); + fds[n].revents = 0; + + duk_pop_n(ctx, 3); /* -> [... enum] */ + + n++; + } + /* leave enum on stack */ + + memset(&ts, 0, sizeof(ts)); + ts.tv_nsec = (timeout % 1000) * 1000000; + ts.tv_sec = timeout / 1000; + + /*rc = ppoll(fds, n, &ts, NULL);*/ + rc = poll(fds, n, timeout); + if (rc < 0) { + duk_error(ctx, DUK_ERR_ERROR, "%s (errno=%d)", strerror(errno), errno); + } + + duk_push_array(ctx); + nchanged = 0; + for (i = 0; i < n; i++) { + /* update revents */ + + if (fds[i].revents) { + duk_push_int(ctx, fds[i].fd); /* -> [... retarr fd] */ + duk_put_prop_index(ctx, -2, nchanged); + nchanged++; + } + + duk_push_int(ctx, fds[i].fd); /* -> [... retarr key] */ + duk_get_prop(ctx, 0); /* -> [... retarr val] */ + duk_push_string(ctx, "revents"); + duk_push_int(ctx, fds[i].revents); /* -> [... retarr val "revents" fds[i].revents] */ + duk_put_prop(ctx, -3); /* -> [... retarr val] */ + duk_pop(ctx); + } + + /* [retarr] */ + + return 1; +} + +static duk_function_list_entry poll_funcs[] = { + { "poll", poll_poll, 2 }, + { NULL, NULL, 0 } +}; + +static duk_number_list_entry poll_consts[] = { + { "POLLIN", (double) POLLIN }, + { "POLLPRI", (double) POLLPRI }, + { "POLLOUT", (double) POLLOUT }, +#if 0 + /* Linux 2.6.17 and upwards, requires _GNU_SOURCE etc, not added + * now because we don't use it. + */ + { "POLLRDHUP", (double) POLLRDHUP }, +#endif + { "POLLERR", (double) POLLERR }, + { "POLLHUP", (double) POLLHUP }, + { "POLLNVAL", (double) POLLNVAL }, + { NULL, 0.0 } +}; + +void poll_register(duk_context *ctx) { + /* Set global 'Poll' with functions and constants. */ + duk_push_global_object(ctx); + duk_push_object(ctx); + duk_put_function_list(ctx, -1, poll_funcs); + duk_put_number_list(ctx, -1, poll_consts); + duk_put_prop_string(ctx, -2, "Poll"); + duk_pop(ctx); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/server-socket-test.js b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/server-socket-test.js new file mode 100644 index 00000000..68510af0 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/server-socket-test.js @@ -0,0 +1,34 @@ + +var HOST = 'localhost' +var PORT = 12345; +var EXIT_TIMEOUT = 300e3; + +print('automatic exit after ' + (EXIT_TIMEOUT / 1e3) + ' seconds'); +setTimeout(function () { + print('exit timer'); + EventLoop.requestExit(); +}, EXIT_TIMEOUT); + +print('listen on ' + HOST + ':' + PORT); +EventLoop.server(HOST, PORT, function (fd, addr, port) { + print('new connection on fd ' + fd + ' from ' + addr + ':' + port); + EventLoop.setReader(fd, function (fd, data) { + var b, i, n, x; + + // Handle socket data carefully: if you convert it to a string, + // it may not be valid UTF-8 etc. Here we operate on the data + // directly in the buffer. + + b = data.valueOf(); // ensure we get a plain buffer + n = b.length; + for (i = 0; i < n; i++) { + x = b[i]; + if (x >= 0x61 && x <= 0x7a) { + b[i] = x - 0x20; // uppercase + } + } + + print('read data on fd ' + fd + ', length ' + data.length); + EventLoop.write(fd, data); + }); +}); diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/socket.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/socket.c new file mode 100644 index 00000000..a1587fa3 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/eventloop/socket.c @@ -0,0 +1,286 @@ +/* + * TCP sockets binding example. + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "duktape.h" + +#define ERROR_FROM_ERRNO(ctx) do { \ + duk_error(ctx, DUK_ERR_ERROR, "%s (errno=%d)", strerror(errno), errno); \ + } while (0) + +static void set_nonblocking(duk_context *ctx, int fd) { + int rc; + int flags; + + rc = fcntl(fd, F_GETFL); + if (rc < 0) { + ERROR_FROM_ERRNO(ctx); + } + flags = rc; + + flags |= O_NONBLOCK; + + rc = fcntl(fd, F_SETFL, flags); + if (rc < 0) { + ERROR_FROM_ERRNO(ctx); + } +} + +static void set_reuseaddr(duk_context *ctx, int fd) { + int val; + int rc; + + val = 1; + rc = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void *) &val, sizeof(val)); + if (rc != 0) { + ERROR_FROM_ERRNO(ctx); + } +} + +#ifdef __APPLE__ +static void set_nosigpipe(duk_context *ctx, int fd) { + int val; + int rc; + + val = 1; + rc = setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, (const void *) &val, sizeof(val)); + if (rc != 0) { + ERROR_FROM_ERRNO(ctx); + } +} +#endif + +static int socket_create_server_socket(duk_context *ctx) { + const char *addr = duk_to_string(ctx, 0); + int port = duk_to_int(ctx, 1); + int sock; + struct sockaddr_in sockaddr; + struct hostent *ent; + struct in_addr **addr_list; + struct in_addr *addr_inet; + int i; + int rc; + + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { + ERROR_FROM_ERRNO(ctx); + } + + set_nonblocking(ctx, sock); + set_reuseaddr(ctx, sock); +#ifdef __APPLE__ + set_nosigpipe(ctx, sock); +#endif + + ent = gethostbyname(addr); + if (!ent) { + ERROR_FROM_ERRNO(ctx); + } + + addr_list = (struct in_addr **) ent->h_addr_list; + addr_inet = NULL; + for (i = 0; addr_list[i]; i++) { + addr_inet = addr_list[i]; + break; + } + if (!addr_inet) { + duk_error(ctx, DUK_ERR_ERROR, "cannot resolve %s", addr); + } + + memset(&sockaddr, 0, sizeof(sockaddr)); + sockaddr.sin_family = AF_INET; + sockaddr.sin_port = htons(port); + sockaddr.sin_addr = *addr_inet; + + rc = bind(sock, (const struct sockaddr *) &sockaddr, sizeof(sockaddr)); + if (rc < 0) { + ERROR_FROM_ERRNO(ctx); + } + + rc = listen(sock, 10 /*backlog*/); + if (rc < 0) { + (void) close(sock); + ERROR_FROM_ERRNO(ctx); + } + + duk_push_int(ctx, sock); + return 1; +} + +static int socket_close(duk_context *ctx) { + int sock = duk_to_int(ctx, 0); + int rc; + + rc = close(sock); + if (rc < 0) { + ERROR_FROM_ERRNO(ctx); + } + return 0; +} + +static int socket_accept(duk_context *ctx) { + int sock = duk_to_int(ctx, 0); + int rc; + struct sockaddr_in addr; + socklen_t addrlen; + + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + addrlen = sizeof(addr); + + rc = accept(sock, (struct sockaddr *) &addr, &addrlen); + if (rc < 0) { + ERROR_FROM_ERRNO(ctx); + } + + set_nonblocking(ctx, sock); +#ifdef __APPLE__ + set_nosigpipe(ctx, sock); +#endif + + if (addrlen == sizeof(addr)) { + uint32_t tmp = ntohl(addr.sin_addr.s_addr); + + duk_push_object(ctx); + + duk_push_string(ctx, "fd"); + duk_push_int(ctx, rc); + duk_put_prop(ctx, -3); + duk_push_string(ctx, "addr"); + duk_push_sprintf(ctx, "%d.%d.%d.%d", ((tmp >> 24) & 0xff), ((tmp >> 16) & 0xff), ((tmp >> 8) & 0xff), (tmp & 0xff)); + duk_put_prop(ctx, -3); + duk_push_string(ctx, "port"); + duk_push_int(ctx, ntohs(addr.sin_port)); + duk_put_prop(ctx, -3); + + return 1; + } + + return 0; +} + +static int socket_connect(duk_context *ctx) { + const char *addr = duk_to_string(ctx, 0); + int port = duk_to_int(ctx, 1); + int sock; + struct sockaddr_in sockaddr; + struct hostent *ent; + struct in_addr **addr_list; + struct in_addr *addr_inet; + int i; + int rc; + + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) { + ERROR_FROM_ERRNO(ctx); + } + + set_nonblocking(ctx, sock); +#ifdef __APPLE__ + set_nosigpipe(ctx, sock); +#endif + + ent = gethostbyname(addr); + if (!ent) { + ERROR_FROM_ERRNO(ctx); + } + + addr_list = (struct in_addr **) ent->h_addr_list; + addr_inet = NULL; + for (i = 0; addr_list[i]; i++) { + addr_inet = addr_list[i]; + break; + } + if (!addr_inet) { + duk_error(ctx, DUK_ERR_ERROR, "cannot resolve %s", addr); + } + + memset(&sockaddr, 0, sizeof(sockaddr)); + sockaddr.sin_family = AF_INET; + sockaddr.sin_port = htons(port); + sockaddr.sin_addr = *addr_inet; + + rc = connect(sock, (const struct sockaddr *) &sockaddr, (socklen_t) sizeof(sockaddr)); + if (rc < 0) { + if (errno == EINPROGRESS) { +#if 0 + fprintf(stderr, "connect() returned EINPROGRESS as expected, need to poll writability\n"); + fflush(stderr); +#endif + } else { + ERROR_FROM_ERRNO(ctx); + } + } + + duk_push_int(ctx, sock); + return 1; +} + +static int socket_read(duk_context *ctx) { + int sock = duk_to_int(ctx, 0); + char readbuf[1024]; + int rc; + void *data; + + rc = recvfrom(sock, (void *) readbuf, sizeof(readbuf), 0, NULL, NULL); + if (rc < 0) { + ERROR_FROM_ERRNO(ctx); + } + + data = duk_push_fixed_buffer(ctx, rc); + memcpy(data, readbuf, rc); + return 1; +} + +static int socket_write(duk_context *ctx) { + int sock = duk_to_int(ctx, 0); + const char *data; + size_t len; + ssize_t rc; + + data = duk_to_buffer(ctx, 1, &len); + + /* MSG_NOSIGNAL: avoid SIGPIPE */ +#ifdef __APPLE__ + rc = sendto(sock, (void *) data, len, 0, NULL, 0); +#else + rc = sendto(sock, (void *) data, len, MSG_NOSIGNAL, NULL, 0); +#endif + if (rc < 0) { + ERROR_FROM_ERRNO(ctx); + } + + duk_push_int(ctx, rc); + return 1; +} + +static duk_function_list_entry socket_funcs[] = { + { "createServerSocket", socket_create_server_socket, 2 }, + { "close", socket_close, 1 }, + { "accept", socket_accept, 1 }, + { "connect", socket_connect, 2 }, + { "read", socket_read, 1 }, + { "write", socket_write, 2 }, + { NULL, NULL, 0 } +}; + +void socket_register(duk_context *ctx) { + /* Set global 'Socket'. */ + duk_push_global_object(ctx); + duk_push_object(ctx); + duk_put_function_list(ctx, -1, socket_funcs); + duk_put_prop_string(ctx, -2, "Socket"); + duk_pop(ctx); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/README.rst new file mode 100644 index 00000000..1933094f --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/README.rst @@ -0,0 +1,5 @@ +=========================== +Duktape guide example files +=========================== + +Examples used in the Duktape guide. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/fib.js b/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/fib.js new file mode 100644 index 00000000..2b2982f7 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/fib.js @@ -0,0 +1,16 @@ +// fib.js +function fib(n) { + if (n == 0) { return 0; } + if (n == 1) { return 1; } + return fib(n-1) + fib(n-2); +} + +function test() { + var res = []; + for (i = 0; i < 20; i++) { + res.push(fib(i)); + } + print(res.join(' ')); +} + +test(); diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/prime.js b/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/prime.js new file mode 100644 index 00000000..8959754f --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/prime.js @@ -0,0 +1,32 @@ +// prime.js + +// Pure Ecmascript version of low level helper +function primeCheckEcmascript(val, limit) { + for (var i = 2; i <= limit; i++) { + if ((val % i) == 0) { return false; } + } + return true; +} + +// Select available helper at load time +var primeCheckHelper = (this.primeCheckNative || primeCheckEcmascript); + +// Check 'val' for primality +function primeCheck(val) { + if (val == 1 || val == 2) { return true; } + var limit = Math.ceil(Math.sqrt(val)); + while (limit * limit < val) { limit += 1; } + return primeCheckHelper(val, limit); +} + +// Find primes below one million ending in '9999'. +function primeTest() { + var res = []; + + print('Have native helper: ' + (primeCheckHelper !== primeCheckEcmascript)); + for (var i = 1; i < 1000000; i++) { + if (primeCheck(i) && (i % 10000) == 9999) { res.push(i); } + } + print(res.join(' ')); +} + diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/primecheck.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/primecheck.c new file mode 100644 index 00000000..36fa5d65 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/primecheck.c @@ -0,0 +1,52 @@ +/* primecheck.c */ +#include +#include +#include +#include "duktape.h" + +static duk_ret_t native_prime_check(duk_context *ctx) { + int val = duk_require_int(ctx, 0); + int lim = duk_require_int(ctx, 1); + int i; + + for (i = 2; i <= lim; i++) { + if (val % i == 0) { + duk_push_false(ctx); + return 1; + } + } + + duk_push_true(ctx); + return 1; +} + +int main(int argc, const char *argv[]) { + duk_context *ctx = NULL; + + ctx = duk_create_heap_default(); + if (!ctx) { + printf("Failed to create a Duktape heap.\n"); + exit(1); + } + + duk_push_global_object(ctx); + duk_push_c_function(ctx, native_prime_check, 2 /*nargs*/); + duk_put_prop_string(ctx, -2, "primeCheckNative"); + + if (duk_peval_file(ctx, "prime.js") != 0) { + printf("Error: %s\n", duk_safe_to_string(ctx, -1)); + goto finished; + } + duk_pop(ctx); /* ignore result */ + + duk_get_prop_string(ctx, -1, "primeTest"); + if (duk_pcall(ctx, 0) != 0) { + printf("Error: %s\n", duk_safe_to_string(ctx, -1)); + } + duk_pop(ctx); /* ignore result */ + + finished: + duk_destroy_heap(ctx); + + exit(0); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/process.js b/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/process.js new file mode 100644 index 00000000..62b50117 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/process.js @@ -0,0 +1,12 @@ +// process.js +function processLine(line) { + return line.trim() + .replace(/[<>&"'\u0000-\u001F\u007E-\uFFFF]/g, function(x) { + // escape HTML characters + return '&#' + x.charCodeAt(0) + ';' + }) + .replace(/\*(.*?)\*/g, function(x, m) { + // automatically bold text between stars + return '' + m + ''; + }); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/processlines.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/processlines.c new file mode 100644 index 00000000..f91bdffc --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/processlines.c @@ -0,0 +1,59 @@ +/* processlines.c */ +#include +#include +#include +#include "duktape.h" + +int main(int argc, const char *argv[]) { + duk_context *ctx = NULL; + char line[4096]; + char idx; + int ch; + + ctx = duk_create_heap_default(); + if (!ctx) { + printf("Failed to create a Duktape heap.\n"); + exit(1); + } + + if (duk_peval_file(ctx, "process.js") != 0) { + printf("Error: %s\n", duk_safe_to_string(ctx, -1)); + goto finished; + } + duk_pop(ctx); /* ignore result */ + + memset(line, 0, sizeof(line)); + idx = 0; + for (;;) { + if (idx >= sizeof(line)) { + printf("Line too long\n"); + exit(1); + } + + ch = fgetc(stdin); + if (ch == 0x0a) { + line[idx++] = '\0'; + + duk_push_global_object(ctx); + duk_get_prop_string(ctx, -1 /*index*/, "processLine"); + duk_push_string(ctx, line); + if (duk_pcall(ctx, 1 /*nargs*/) != 0) { + printf("Error: %s\n", duk_safe_to_string(ctx, -1)); + } else { + printf("%s\n", duk_safe_to_string(ctx, -1)); + } + duk_pop(ctx); /* pop result/error */ + + idx = 0; + } else if (ch == EOF) { + break; + } else { + line[idx++] = (char) ch; + } + } + + finished: + duk_destroy_heap(ctx); + + exit(0); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/uppercase.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/uppercase.c new file mode 100644 index 00000000..03d08698 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/guide/uppercase.c @@ -0,0 +1,42 @@ +/* uppercase.c */ +#include +#include +#include "duktape.h" + +static int dummy_upper_case(duk_context *ctx) { + size_t sz; + const char *val = duk_require_lstring(ctx, 0, &sz); + size_t i; + + /* We're going to need 'sz' additional entries on the stack. */ + duk_require_stack(ctx, sz); + + for (i = 0; i < sz; i++) { + char ch = val[i]; + if (ch >= 'a' && ch <= 'z') { + ch = ch - 'a' + 'A'; + } + duk_push_lstring(ctx, (const char *) &ch, 1); + } + + duk_concat(ctx, sz); + return 1; +} + +int main(int argc, char *argv[]) { + duk_context *ctx; + + if (argc < 2) { exit(1); } + + ctx = duk_create_heap_default(); + if (!ctx) { exit(1); } + + duk_push_c_function(ctx, dummy_upper_case, 1); + duk_push_string(ctx, argv[1]); + duk_call(ctx, 1); + printf("%s -> %s\n", argv[1], duk_to_string(ctx, -1)); + duk_pop(ctx); + + duk_destroy_heap(ctx); + return 0; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/hello/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/hello/README.rst new file mode 100644 index 00000000..7afef53e --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/hello/README.rst @@ -0,0 +1,5 @@ +=================== +Hello world example +=================== + +Very simple example, most useful for compilation tests. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/hello/hello.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/hello/hello.c new file mode 100644 index 00000000..9113d2fb --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/hello/hello.c @@ -0,0 +1,38 @@ +/* + * Very simple example program + */ + +#include "duktape.h" + +int adder(duk_context *ctx) { + int i; + int n = duk_get_top(ctx); /* #args */ + double res = 0.0; + + for (i = 0; i < n; i++) { + res += duk_to_number(ctx, i); + } + + duk_push_number(ctx, res); + return 1; /* one return value */ +} + +int main(int argc, char *argv[]) { + duk_context *ctx = duk_create_heap_default(); + + (void) argc; (void) argv; /* suppress warning */ + + duk_eval_string(ctx, "print('Hello world!');"); + + duk_push_global_object(ctx); + duk_push_c_function(ctx, adder, DUK_VARARGS); + duk_put_prop_string(ctx, -2, "adder"); + duk_pop(ctx); /* pop global */ + + duk_eval_string(ctx, "print('2+3=' + adder(2, 3));"); + duk_pop(ctx); /* pop eval result */ + + duk_destroy_heap(ctx); + + return 0; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/jxpretty/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/jxpretty/README.rst new file mode 100644 index 00000000..5ab43a84 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/jxpretty/README.rst @@ -0,0 +1,5 @@ +================ +Jxpretty example +================ + +Simple command line utility to pretty print JSON in the JX format. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/jxpretty/jxpretty.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/jxpretty/jxpretty.c new file mode 100644 index 00000000..1e483efb --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/jxpretty/jxpretty.c @@ -0,0 +1,63 @@ +/* + * Pretty print JSON from stdin into indented JX. + */ + +#include +#include +#include "duktape.h" + +static duk_ret_t do_jxpretty(duk_context *ctx) { + FILE *f = stdin; + char buf[4096]; + size_t ret; + + for (;;) { + if (ferror(f)) { + duk_error(ctx, DUK_ERR_ERROR, "ferror() on stdin"); + } + if (feof(f)) { + break; + } + + ret = fread(buf, 1, sizeof(buf), f); +#if 0 + fprintf(stderr, "Read: %ld\n", (long) ret); + fflush(stderr); +#endif + if (ret == 0) { + break; + } + + duk_require_stack(ctx, 1); + duk_push_lstring(ctx, (const char *) buf, ret); + } + + duk_concat(ctx, duk_get_top(ctx)); + + duk_eval_string(ctx, "(function (v) { print(Duktape.enc('jx', JSON.parse(v), null, 4)); })"); + duk_insert(ctx, -2); + duk_call(ctx, 1); + + return 0; +} + +int main(int argc, char *argv[]) { + duk_context *ctx; + duk_int_t rc; + + /* suppress warnings */ + (void) argc; + (void) argv; + + ctx = duk_create_heap_default(); + + rc = duk_safe_call(ctx, do_jxpretty, 0 /*nargs*/, 1 /*nrets*/); + if (rc) { + fprintf(stderr, "ERROR: %s\n", duk_safe_to_string(ctx, -1)); + fflush(stderr); + } + + duk_destroy_heap(ctx); + + return 0; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/sandbox/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/examples/sandbox/README.rst new file mode 100644 index 00000000..24df0a25 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/sandbox/README.rst @@ -0,0 +1,5 @@ +=============== +Sandbox example +=============== + +Very simple, minimal sandboxing example. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/examples/sandbox/sandbox.c b/3P/civetweb/src/third_party/duktape-1.3.0/examples/sandbox/sandbox.c new file mode 100644 index 00000000..915faa9a --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/examples/sandbox/sandbox.c @@ -0,0 +1,252 @@ +/* + * Sandboxing example + * + * Uses custom memory allocation functions which keep track of total amount + * of memory allocated, imposing a maximum total allocation size. + */ + +#include +#include +#include "duktape.h" + +/* + * Memory allocator which backs to standard library memory functions but + * keeps a small header to track current allocation size. + * + * Many other sandbox allocation models are useful, e.g. preallocated pools. + */ + +typedef struct { + /* The double value in the union is there to ensure alignment is + * good for IEEE doubles too. In many 32-bit environments 4 bytes + * would be sufficiently aligned and the double value is unnecessary. + */ + union { + size_t sz; + double d; + } u; +} alloc_hdr; + +static size_t total_allocated = 0; +static size_t max_allocated = 256 * 1024; /* 256kB sandbox */ + +static void sandbox_dump_memstate(void) { +#if 0 + fprintf(stderr, "Total allocated: %ld\n", (long) total_allocated); + fflush(stderr); +#endif +} + +static void *sandbox_alloc(void *udata, duk_size_t size) { + alloc_hdr *hdr; + + (void) udata; /* Suppress warning. */ + + if (size == 0) { + return NULL; + } + + if (total_allocated + size > max_allocated) { + fprintf(stderr, "Sandbox maximum allocation size reached, %ld requested in sandbox_alloc\n", + (long) size); + fflush(stderr); + return NULL; + } + + hdr = (alloc_hdr *) malloc(size + sizeof(alloc_hdr)); + if (!hdr) { + return NULL; + } + hdr->u.sz = size; + total_allocated += size; + sandbox_dump_memstate(); + return (void *) (hdr + 1); +} + +static void *sandbox_realloc(void *udata, void *ptr, duk_size_t size) { + alloc_hdr *hdr; + size_t old_size; + void *t; + + (void) udata; /* Suppress warning. */ + + /* Handle the ptr-NULL vs. size-zero cases explicitly to minimize + * platform assumptions. You can get away with much less in specific + * well-behaving environments. + */ + + if (ptr) { + hdr = (alloc_hdr *) (((char *) ptr) - sizeof(alloc_hdr)); + old_size = hdr->u.sz; + + if (size == 0) { + total_allocated -= old_size; + free((void *) hdr); + sandbox_dump_memstate(); + return NULL; + } else { + if (total_allocated - old_size + size > max_allocated) { + fprintf(stderr, "Sandbox maximum allocation size reached, %ld requested in sandbox_realloc\n", + (long) size); + fflush(stderr); + return NULL; + } + + t = realloc((void *) hdr, size + sizeof(alloc_hdr)); + if (!t) { + return NULL; + } + hdr = (alloc_hdr *) t; + total_allocated -= old_size; + total_allocated += size; + hdr->u.sz = size; + sandbox_dump_memstate(); + return (void *) (hdr + 1); + } + } else { + if (size == 0) { + return NULL; + } else { + if (total_allocated + size > max_allocated) { + fprintf(stderr, "Sandbox maximum allocation size reached, %ld requested in sandbox_realloc\n", + (long) size); + fflush(stderr); + return NULL; + } + + hdr = (alloc_hdr *) malloc(size + sizeof(alloc_hdr)); + if (!hdr) { + return NULL; + } + hdr->u.sz = size; + total_allocated += size; + sandbox_dump_memstate(); + return (void *) (hdr + 1); + } + } +} + +static void sandbox_free(void *udata, void *ptr) { + alloc_hdr *hdr; + + (void) udata; /* Suppress warning. */ + + if (!ptr) { + return; + } + hdr = (alloc_hdr *) (((char *) ptr) - sizeof(alloc_hdr)); + total_allocated -= hdr->u.sz; + free((void *) hdr); + sandbox_dump_memstate(); +} + +/* + * Sandbox setup and test + */ + +static duk_ret_t do_sandbox_test(duk_context *ctx) { + FILE *f; + char buf[4096]; + size_t ret; + const char *globobj; + + /* + * Setup sandbox + */ + + globobj = + "({\n" + " print: print,\n" + " Math: {\n" + " max: Math.max\n" + " }\n" + "})\n"; +#if 1 + fprintf(stderr, "Sandbox global object:\n----------------\n%s----------------\n", globobj); + fflush(stderr); +#endif + duk_eval_string(ctx, globobj); + duk_set_global_object(ctx); + + /* + * Execute code from specified file + */ + + f = fopen(duk_require_string(ctx, -1), "rb"); + if (!f) { + duk_error(ctx, DUK_ERR_ERROR, "failed to open file"); + } + + for (;;) { + if (ferror(f)) { + fclose(f); + duk_error(ctx, DUK_ERR_ERROR, "ferror when reading file"); + } + if (feof(f)) { + break; + } + + ret = fread(buf, 1, sizeof(buf), f); + if (ret == 0) { + break; + } + + duk_push_lstring(ctx, (const char *) buf, ret); + } + + duk_concat(ctx, duk_get_top(ctx) - 1); /* -1 for filename */ + + /* -> [ ... filename source ] */ + + duk_insert(ctx, -2); + + /* -> [ ... source filename ] */ + + duk_compile(ctx, 0 /*flags*/); /* Compile as program */ + duk_call(ctx, 0 /*nargs*/); + + return 0; +} + +/* + * Main + */ + +static void sandbox_fatal(duk_context *ctx, duk_errcode_t code, const char *msg) { + (void) ctx; /* Suppress warning. */ + fprintf(stderr, "FATAL %ld: %s\n", (long) code, (msg ? msg : "no message")); + fflush(stderr); + exit(1); /* must not return */ +} + +int main(int argc, char *argv[]) { + duk_context *ctx; + duk_int_t rc; + + if (argc < 2) { + fprintf(stderr, "Usage: sandbox \n"); + fflush(stderr); + exit(1); + } + + ctx = duk_create_heap(sandbox_alloc, + sandbox_realloc, + sandbox_free, + NULL, + sandbox_fatal); + + duk_push_string(ctx, argv[1]); + rc = duk_safe_call(ctx, do_sandbox_test, 1 /*nargs*/, 1 /*nrets*/); + if (rc) { + fprintf(stderr, "ERROR: %s\n", duk_safe_to_string(ctx, -1)); + fflush(stderr); + } + + duk_destroy_heap(ctx); + + /* Should be zero. */ + fprintf(stderr, "Final allocation: %ld\n", (long) total_allocated); + fflush(stderr); + + return 1; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/extras/README.rst b/3P/civetweb/src/third_party/duktape-1.3.0/extras/README.rst new file mode 100644 index 00000000..1b701601 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/extras/README.rst @@ -0,0 +1,13 @@ +============== +Duktape extras +============== + +Extra modules and utilities. Extras provide functionality that doesn't +comfortably fit into the main Duktape library, perhaps for footprint or +portability reasons, but are still useful for most users. + +Extras are maintained and will be bug fixed. However, they don't have the +same semantic versioning guarantees like the main Duktape library. Extras +may be dropped without warning as Duktape is versioned. For instance, if +an extra breaks due to Duktape changes and there is no time to fix it, the +missing extra won't block a release and will be dropped. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/license.spdx b/3P/civetweb/src/third_party/duktape-1.3.0/license.spdx new file mode 100644 index 00000000..535d95f9 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/license.spdx @@ -0,0 +1,3629 @@ + + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/eventloop/c_eventloop.js + <_3:checksum rdf:nodeID="NukVOfZA86"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/debug-trans-dvalue/duk_trans_dvalue.c + <_3:checksum rdf:nodeID="NukVOfZA160"/> + + + + <_3:checksumValue>215f6fec820889330048f7f2c1b5a220eb963657 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hobject_misc.c + <_3:checksum rdf:nodeID="NukVOfZA192"/> + + + + <_3:checksumValue>50a3349a079123b6bddf3db507df0dd9e877e246 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./debugger/static/webui.js + <_3:checksum rdf:nodeID="NukVOfZA52"/> + + + + <_3:checksumValue>5ebff36a2dd7cb495eed358c59670541c6c8be19 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + <_3:created rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2015-09-12T02:15:22Z + + <_3:licenseListVersion>1.20 + <_3:creator>Organization: duktape.org + + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_proxy.c + <_3:checksum rdf:nodeID="NukVOfZA388"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./polyfills/duktape-isfastint.js + <_3:checksum rdf:nodeID="NukVOfZA432"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_replacements.c + <_3:checksum rdf:nodeID="NukVOfZA410"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_selftest.h + <_3:checksum rdf:nodeID="NukVOfZA286"/> + + + + <_3:checksumValue>92ce3decf72b10b0023116ac727a752e8749aa90 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>a8c0b54002a3a7d8c69d385e7fbcf4b70d1efc70 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>3b8236810650f4e28bd84984b3c7e55029f241b0 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/guide/uppercase.c + <_3:checksum rdf:nodeID="NukVOfZA122"/> + + + <_3:packageVerificationCodeValue>39d0d436fe36ae0901ab8ed9cbdaf379037760fb + <_3:packageVerificationCodeExcludedFile>./license.spdx + + + + <_3:checksumValue>089c395fca3cedceec09fd38d32d0c77dc8658f4 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_util_misc.c + <_3:checksum rdf:nodeID="NukVOfZA218"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/eventloop/README.rst + <_3:checksum rdf:nodeID="NukVOfZA94"/> + + + + <_3:checksumValue>6b98824e13a3d9536542b8da51d012a3d66ceec1 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>6d5f56a1b76f9dcc9bb68d62ad0df958bd4d38ec + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>ddbc206357dd4b97f3630b87bfdac148a5e8b190 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>03cad085177f1e776be90afceef1f2160e6c8bf4 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>c2d899e7f2343579f29ad3079fde44eec5d6a544 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hbuffer_alloc.c + <_3:checksum rdf:nodeID="NukVOfZA234"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./debugger/duk_debug.js + <_3:checksum rdf:nodeID="NukVOfZA36"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/codepage-conv/duk_codepage_conv.h + <_3:checksum rdf:nodeID="NukVOfZA78"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/guide/fib.js + <_3:checksum rdf:nodeID="NukVOfZA124"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_js_executor.c + <_3:checksum rdf:nodeID="NukVOfZA374"/> + + + + <_3:checksumValue>78e85afbf3394e8f79b30bdcbd479faf8781e25d + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>afd3e5c9becf5feecaf57e4c5586b83da1ca61c3 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hobject_pc2line.c + <_3:checksum rdf:nodeID="NukVOfZA250"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_function.c + <_3:checksum rdf:nodeID="NukVOfZA202"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_heap_refcount.c + <_3:checksum rdf:nodeID="NukVOfZA310"/> + + + + <_3:checksumValue>7b1e7e495bd7199d2e50c20e672c7fc01fcd3a42 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_duktape.c + <_3:checksum rdf:nodeID="NukVOfZA366"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_js_compiler.c + <_3:checksum rdf:nodeID="NukVOfZA214"/> + + + + <_3:checksumValue>3d8403c0150e1633ddb87362bc3d85518e26cd6a + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>6da918cc81769eeeb7c2fe20b549aebf744f175a + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_util.h + <_3:checksum rdf:nodeID="NukVOfZA206"/> + + + + <_3:checksumValue>64566ae0bdc1c3e1017604b6b45d515c30d976eb + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>881f1b114c9fbba139044ddcbbc5398243185d10 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:describesPackage rdf:nodeID="NukVOfZA4"/> + <_3:specVersion>SPDX-1.2 + <_3:dataLicense rdf:resource="http://spdx.org/licenses/CC0-1.0"/> + <_3:referencesFile rdf:nodeID="NukVOfZA85"/> + <_3:referencesFile rdf:nodeID="NukVOfZA159"/> + <_3:referencesFile rdf:nodeID="NukVOfZA189"/> + <_3:referencesFile rdf:nodeID="NukVOfZA269"/> + <_3:referencesFile rdf:nodeID="NukVOfZA447"/> + <_3:referencesFile rdf:nodeID="NukVOfZA403"/> + <_3:referencesFile rdf:nodeID="NukVOfZA191"/> + <_3:referencesFile rdf:nodeID="NukVOfZA255"/> + <_3:referencesFile rdf:nodeID="NukVOfZA61"/> + <_3:referencesFile rdf:nodeID="NukVOfZA267"/> + <_3:referencesFile rdf:nodeID="NukVOfZA23"/> + <_3:referencesFile rdf:nodeID="NukVOfZA179"/> + <_3:referencesFile rdf:nodeID="NukVOfZA271"/> + <_3:referencesFile rdf:nodeID="NukVOfZA197"/> + <_3:referencesFile rdf:nodeID="NukVOfZA367"/> + <_3:referencesFile rdf:nodeID="NukVOfZA365"/> + <_3:referencesFile rdf:nodeID="NukVOfZA425"/> + <_3:referencesFile rdf:nodeID="NukVOfZA351"/> + <_3:referencesFile rdf:nodeID="NukVOfZA317"/> + <_3:referencesFile rdf:nodeID="NukVOfZA211"/> + <_3:referencesFile rdf:nodeID="NukVOfZA207"/> + <_3:referencesFile rdf:nodeID="NukVOfZA431"/> + <_3:referencesFile rdf:nodeID="NukVOfZA331"/> + <_3:referencesFile rdf:nodeID="NukVOfZA33"/> + <_3:referencesFile rdf:nodeID="NukVOfZA285"/> + <_3:referencesFile rdf:nodeID="NukVOfZA371"/> + <_3:referencesFile rdf:nodeID="NukVOfZA423"/> + <_3:referencesFile rdf:nodeID="NukVOfZA199"/> + <_3:referencesFile rdf:nodeID="NukVOfZA163"/> + <_3:referencesFile rdf:nodeID="NukVOfZA81"/> + <_3:referencesFile rdf:nodeID="NukVOfZA291"/> + <_3:referencesFile rdf:nodeID="NukVOfZA25"/> + <_3:referencesFile rdf:nodeID="NukVOfZA97"/> + <_3:referencesFile rdf:nodeID="NukVOfZA341"/> + <_3:referencesFile rdf:nodeID="NukVOfZA339"/> + <_3:referencesFile rdf:nodeID="NukVOfZA217"/> + <_3:referencesFile rdf:nodeID="NukVOfZA93"/> + <_3:referencesFile rdf:nodeID="NukVOfZA175"/> + <_3:referencesFile rdf:nodeID="NukVOfZA193"/> + <_3:referencesFile rdf:nodeID="NukVOfZA117"/> + <_3:referencesFile rdf:nodeID="NukVOfZA377"/> + <_3:referencesFile rdf:nodeID="NukVOfZA69"/> + <_3:referencesFile rdf:nodeID="NukVOfZA75"/> + <_3:referencesFile rdf:nodeID="NukVOfZA21"/> + <_3:referencesFile rdf:nodeID="NukVOfZA111"/> + <_3:referencesFile rdf:nodeID="NukVOfZA63"/> + <_3:referencesFile rdf:nodeID="NukVOfZA287"/> + <_3:referencesFile rdf:nodeID="NukVOfZA239"/> + <_3:referencesFile rdf:nodeID="NukVOfZA147"/> + <_3:referencesFile rdf:nodeID="NukVOfZA233"/> + <_3:referencesFile rdf:nodeID="NukVOfZA89"/> + <_3:referencesFile rdf:nodeID="NukVOfZA181"/> + <_3:referencesFile rdf:nodeID="NukVOfZA77"/> + <_3:referencesFile rdf:nodeID="NukVOfZA79"/> + <_3:referencesFile rdf:nodeID="NukVOfZA123"/> + <_3:referencesFile rdf:nodeID="NukVOfZA373"/> + <_3:referencesFile rdf:nodeID="NukVOfZA319"/> + <_3:referencesFile rdf:nodeID="NukVOfZA131"/> + <_3:referencesFile rdf:nodeID="NukVOfZA137"/> + <_3:referencesFile rdf:nodeID="NukVOfZA249"/> + <_3:referencesFile rdf:nodeID="NukVOfZA201"/> + <_3:referencesFile rdf:nodeID="NukVOfZA437"/> + <_3:referencesFile rdf:nodeID="NukVOfZA417"/> + <_3:referencesFile rdf:nodeID="NukVOfZA309"/> + <_3:referencesFile rdf:nodeID="NukVOfZA393"/> + <_3:referencesFile rdf:nodeID="NukVOfZA157"/> + <_3:referencesFile rdf:nodeID="NukVOfZA241"/> + <_3:referencesFile rdf:nodeID="NukVOfZA213"/> + <_3:referencesFile rdf:nodeID="NukVOfZA419"/> + <_3:referencesFile rdf:nodeID="NukVOfZA101"/> + <_3:referencesFile rdf:nodeID="NukVOfZA235"/> + <_3:referencesFile rdf:nodeID="NukVOfZA205"/> + <_3:referencesFile rdf:nodeID="NukVOfZA143"/> + <_3:referencesFile rdf:nodeID="NukVOfZA363"/> + <_3:referencesFile rdf:nodeID="NukVOfZA221"/> + <_3:referencesFile rdf:nodeID="NukVOfZA289"/> + <_3:referencesFile rdf:nodeID="NukVOfZA135"/> + <_3:referencesFile rdf:nodeID="NukVOfZA109"/> + <_3:referencesFile rdf:nodeID="NukVOfZA35"/> + <_3:referencesFile rdf:nodeID="NukVOfZA439"/> + <_3:referencesFile rdf:nodeID="NukVOfZA399"/> + <_3:referencesFile rdf:nodeID="NukVOfZA411"/> + <_3:referencesFile rdf:nodeID="NukVOfZA307"/> + <_3:referencesFile rdf:nodeID="NukVOfZA169"/> + <_3:referencesFile rdf:nodeID="NukVOfZA203"/> + <_3:referencesFile rdf:nodeID="NukVOfZA39"/> + <_3:referencesFile rdf:nodeID="NukVOfZA187"/> + <_3:referencesFile rdf:nodeID="NukVOfZA103"/> + <_3:referencesFile rdf:nodeID="NukVOfZA409"/> + <_3:referencesFile rdf:nodeID="NukVOfZA343"/> + <_3:referencesFile rdf:nodeID="NukVOfZA231"/> + <_3:referencesFile rdf:nodeID="NukVOfZA389"/> + <_3:referencesFile rdf:nodeID="NukVOfZA379"/> + <_3:referencesFile rdf:nodeID="NukVOfZA253"/> + <_3:referencesFile rdf:nodeID="NukVOfZA321"/> + <_3:referencesFile rdf:nodeID="NukVOfZA243"/> + <_3:referencesFile rdf:nodeID="NukVOfZA167"/> + <_3:referencesFile rdf:nodeID="NukVOfZA311"/> + <_3:referencesFile rdf:nodeID="NukVOfZA275"/> + <_3:referencesFile rdf:nodeID="NukVOfZA127"/> + <_3:referencesFile rdf:nodeID="NukVOfZA29"/> + <_3:referencesFile rdf:nodeID="NukVOfZA429"/> + <_3:referencesFile rdf:nodeID="NukVOfZA257"/> + <_3:referencesFile rdf:nodeID="NukVOfZA325"/> + <_3:referencesFile rdf:nodeID="NukVOfZA435"/> + <_3:referencesFile rdf:nodeID="NukVOfZA337"/> + <_3:referencesFile rdf:nodeID="NukVOfZA259"/> + <_3:referencesFile rdf:nodeID="NukVOfZA381"/> + <_3:referencesFile rdf:nodeID="NukVOfZA407"/> + <_3:referencesFile rdf:nodeID="NukVOfZA177"/> + <_3:referencesFile rdf:nodeID="NukVOfZA449"/> + <_3:referencesFile rdf:nodeID="NukVOfZA53"/> + <_3:referencesFile rdf:nodeID="NukVOfZA395"/> + <_3:referencesFile rdf:nodeID="NukVOfZA209"/> + <_3:referencesFile rdf:nodeID="NukVOfZA27"/> + <_3:referencesFile rdf:nodeID="NukVOfZA397"/> + <_3:referencesFile rdf:nodeID="NukVOfZA237"/> + <_3:referencesFile rdf:nodeID="NukVOfZA335"/> + <_3:referencesFile rdf:nodeID="NukVOfZA139"/> + <_3:referencesFile rdf:nodeID="NukVOfZA41"/> + <_3:referencesFile rdf:nodeID="NukVOfZA171"/> + <_3:referencesFile rdf:nodeID="NukVOfZA7"/> + <_3:referencesFile rdf:nodeID="NukVOfZA387"/> + <_3:referencesFile rdf:nodeID="NukVOfZA83"/> + <_3:referencesFile rdf:nodeID="NukVOfZA421"/> + <_3:referencesFile rdf:nodeID="NukVOfZA327"/> + <_3:referencesFile rdf:nodeID="NukVOfZA347"/> + <_3:referencesFile rdf:nodeID="NukVOfZA277"/> + <_3:referencesFile rdf:nodeID="NukVOfZA279"/> + <_3:referencesFile rdf:nodeID="NukVOfZA59"/> + <_3:referencesFile rdf:nodeID="NukVOfZA185"/> + <_3:referencesFile rdf:nodeID="NukVOfZA329"/> + <_3:referencesFile rdf:nodeID="NukVOfZA427"/> + <_3:referencesFile rdf:nodeID="NukVOfZA273"/> + <_3:referencesFile rdf:nodeID="NukVOfZA361"/> + <_3:referencesFile rdf:nodeID="NukVOfZA345"/> + <_3:referencesFile rdf:nodeID="NukVOfZA223"/> + <_3:referencesFile rdf:nodeID="NukVOfZA375"/> + <_3:referencesFile rdf:nodeID="NukVOfZA445"/> + <_3:referencesFile rdf:nodeID="NukVOfZA15"/> + <_3:referencesFile rdf:nodeID="NukVOfZA359"/> + <_3:referencesFile rdf:nodeID="NukVOfZA45"/> + <_3:referencesFile rdf:nodeID="NukVOfZA215"/> + <_3:referencesFile rdf:nodeID="NukVOfZA183"/> + <_3:referencesFile rdf:nodeID="NukVOfZA369"/> + <_3:referencesFile rdf:nodeID="NukVOfZA265"/> + <_3:referencesFile rdf:nodeID="NukVOfZA305"/> + <_3:referencesFile rdf:nodeID="NukVOfZA51"/> + <_3:referencesFile rdf:nodeID="NukVOfZA113"/> + <_3:referencesFile rdf:nodeID="NukVOfZA13"/> + <_3:referencesFile rdf:nodeID="NukVOfZA43"/> + <_3:referencesFile rdf:nodeID="NukVOfZA133"/> + <_3:referencesFile rdf:nodeID="NukVOfZA383"/> + <_3:referencesFile rdf:nodeID="NukVOfZA251"/> + <_3:referencesFile rdf:nodeID="NukVOfZA55"/> + <_3:referencesFile rdf:nodeID="NukVOfZA295"/> + <_3:referencesFile rdf:nodeID="NukVOfZA401"/> + <_3:referencesFile rdf:nodeID="NukVOfZA433"/> + <_3:referencesFile rdf:nodeID="NukVOfZA161"/> + <_3:referencesFile rdf:nodeID="NukVOfZA299"/> + <_3:referencesFile rdf:nodeID="NukVOfZA95"/> + <_3:referencesFile rdf:nodeID="NukVOfZA107"/> + <_3:referencesFile rdf:nodeID="NukVOfZA227"/> + <_3:referencesFile rdf:nodeID="NukVOfZA323"/> + <_3:referencesFile rdf:nodeID="NukVOfZA333"/> + <_3:referencesFile rdf:nodeID="NukVOfZA105"/> + <_3:referencesFile rdf:nodeID="NukVOfZA443"/> + <_3:referencesFile rdf:nodeID="NukVOfZA153"/> + <_3:referencesFile rdf:nodeID="NukVOfZA141"/> + <_3:referencesFile rdf:nodeID="NukVOfZA353"/> + <_3:referencesFile rdf:nodeID="NukVOfZA9"/> + <_3:referencesFile rdf:nodeID="NukVOfZA281"/> + <_3:referencesFile rdf:nodeID="NukVOfZA11"/> + <_3:referencesFile rdf:nodeID="NukVOfZA385"/> + <_3:referencesFile rdf:nodeID="NukVOfZA229"/> + <_3:referencesFile rdf:nodeID="NukVOfZA297"/> + <_3:referencesFile rdf:nodeID="NukVOfZA405"/> + <_3:referencesFile rdf:nodeID="NukVOfZA151"/> + <_3:referencesFile rdf:nodeID="NukVOfZA165"/> + <_3:referencesFile rdf:nodeID="NukVOfZA67"/> + <_3:referencesFile rdf:nodeID="NukVOfZA115"/> + <_3:referencesFile rdf:nodeID="NukVOfZA65"/> + <_3:referencesFile rdf:nodeID="NukVOfZA49"/> + <_3:referencesFile rdf:nodeID="NukVOfZA263"/> + <_3:referencesFile rdf:nodeID="NukVOfZA125"/> + <_3:referencesFile rdf:nodeID="NukVOfZA91"/> + <_3:referencesFile rdf:nodeID="NukVOfZA19"/> + <_3:referencesFile rdf:nodeID="NukVOfZA283"/> + <_3:referencesFile rdf:nodeID="NukVOfZA349"/> + <_3:referencesFile rdf:nodeID="NukVOfZA173"/> + <_3:referencesFile rdf:nodeID="NukVOfZA355"/> + <_3:referencesFile rdf:nodeID="NukVOfZA303"/> + <_3:referencesFile rdf:nodeID="NukVOfZA441"/> + <_3:referencesFile rdf:nodeID="NukVOfZA357"/> + <_3:referencesFile rdf:nodeID="NukVOfZA195"/> + <_3:referencesFile rdf:nodeID="NukVOfZA225"/> + <_3:referencesFile rdf:nodeID="NukVOfZA57"/> + <_3:referencesFile rdf:nodeID="NukVOfZA121"/> + <_3:referencesFile rdf:nodeID="NukVOfZA453"/> + <_3:referencesFile rdf:nodeID="NukVOfZA415"/> + <_3:referencesFile rdf:nodeID="NukVOfZA261"/> + <_3:referencesFile rdf:nodeID="NukVOfZA301"/> + <_3:referencesFile rdf:nodeID="NukVOfZA391"/> + <_3:referencesFile rdf:nodeID="NukVOfZA17"/> + <_3:referencesFile rdf:nodeID="NukVOfZA245"/> + <_3:referencesFile rdf:nodeID="NukVOfZA71"/> + <_3:referencesFile rdf:nodeID="NukVOfZA129"/> + <_3:referencesFile rdf:nodeID="NukVOfZA293"/> + <_3:referencesFile rdf:nodeID="NukVOfZA31"/> + <_3:referencesFile rdf:nodeID="NukVOfZA119"/> + <_3:referencesFile rdf:nodeID="NukVOfZA219"/> + <_3:referencesFile rdf:nodeID="NukVOfZA451"/> + <_3:referencesFile rdf:nodeID="NukVOfZA145"/> + <_3:referencesFile rdf:nodeID="NukVOfZA73"/> + <_3:referencesFile rdf:nodeID="NukVOfZA37"/> + <_3:referencesFile rdf:nodeID="NukVOfZA87"/> + <_3:referencesFile rdf:nodeID="NukVOfZA247"/> + <_3:referencesFile rdf:nodeID="NukVOfZA99"/> + <_3:referencesFile rdf:nodeID="NukVOfZA47"/> + <_3:referencesFile rdf:nodeID="NukVOfZA413"/> + <_3:referencesFile rdf:nodeID="NukVOfZA155"/> + <_3:referencesFile rdf:nodeID="NukVOfZA313"/> + <_3:referencesFile rdf:nodeID="NukVOfZA315"/> + <_3:referencesFile rdf:nodeID="NukVOfZA149"/> + SPDX license for Duktape 1.3.0 + <_3:creationInfo rdf:nodeID="NukVOfZA3"/> + + + + <_3:checksumValue>c14747594add785dd952855071e51077f5152bad + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>cd025a84635e6a1353f756cf9c74c27bfd36862d + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_number.c + <_3:checksum rdf:nodeID="NukVOfZA412"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_numconv.h + <_3:checksum rdf:nodeID="NukVOfZA188"/> + + + + <_3:checksumValue>f88d68880f451267e7e2eca4b6c4191e8c3fe011 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>93573df8348a41adb790f59e39bf99d9a7bf3a3d + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>75c61dd080cd643b7449f673105b7b7e4bdda0f5 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_json.h + <_3:checksum rdf:nodeID="NukVOfZA322"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_js_call.c + <_3:checksum rdf:nodeID="NukVOfZA244"/> + + + + <_3:checksumValue>de9650befceae510999c0e852a79f994d74fc531 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_heap_markandsweep.c + <_3:checksum rdf:nodeID="NukVOfZA312"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_util_bitdecoder.c + <_3:checksum rdf:nodeID="NukVOfZA258"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hbuffer.h + <_3:checksum rdf:nodeID="NukVOfZA326"/> + + + + <_3:checksumValue>ce19fb1254e02c8ff3ed8e0737522d6af7b977c5 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>82314b509ee3b15b393fefe747c8e0169ab39aaa + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_js_ops.c + <_3:checksum rdf:nodeID="NukVOfZA396"/> + + + + <_3:checksumValue>a3d2ce3d28d6bb5afd29e35ade770a8ae5f45c3f + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>a8f8cf615ef79337a83eb791477dc9ed2c22822c + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>7e2674dd72227576375a80f6ddbb11320f5b987a + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>37a995b627b3a85cecc2a5851537589d4da3bf63 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>44c9219558aba26dc69982a9f432028290707c36 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_initjs_min.js + <_3:checksum rdf:nodeID="NukVOfZA390"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_selftest.c + <_3:checksum rdf:nodeID="NukVOfZA330"/> + + + + <_3:checksumValue>59d3c2d44ed8707fa6c907a7387ffce611d89e44 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_regexp_compiler.c + <_3:checksum rdf:nodeID="NukVOfZA346"/> + + + + <_3:checksumValue>79f806448cbd4724bf60e0723414b391686be098 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_api_string.c + <_3:checksum rdf:nodeID="NukVOfZA392"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_heap_misc.c + <_3:checksum rdf:nodeID="NukVOfZA266"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_lexer.h + <_3:checksum rdf:nodeID="NukVOfZA306"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/eval/README.rst + <_3:checksum rdf:nodeID="NukVOfZA114"/> + + + + <_3:checksumValue>11ecfff4142b35382d0aaf80ee6c04ae3dfd0b4c + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./debugger/package.json + <_3:checksum rdf:nodeID="NukVOfZA44"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_internal.h + <_3:checksum rdf:nodeID="NukVOfZA296"/> + + + + <_3:checksumValue>47e1001460004f53dfc350355e02bf56f18b0398 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/eventloop/server-socket-test.js + <_3:checksum rdf:nodeID="NukVOfZA108"/> + + + + <_3:checksumValue>43a0dfbf1cb06dbfe3a37959ad1b93bc036f78cb + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/eventloop/client-socket-test.js + <_3:checksum rdf:nodeID="NukVOfZA106"/> + + + + <_3:checksumValue>b5f54e8a18d5dc9a791cb36976a7d2345d26b549 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./duk_build_meta.json + <_3:checksum rdf:nodeID="NukVOfZA10"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./README.rst + <_3:checksum rdf:nodeID="NukVOfZA12"/> + + + + <_3:checksumValue>a9c998dbedde09cc435eec0ac1a3a428090b37a9 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hbufferobject_misc.c + <_3:checksum rdf:nodeID="NukVOfZA298"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_api_debug.c + <_3:checksum rdf:nodeID="NukVOfZA196"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/alloc-hybrid/README.rst + <_3:checksum rdf:nodeID="NukVOfZA68"/> + + + + <_3:checksumValue>8d307ae071694f3d2242578c7d88bcae5c2ef7de + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_heap_hashstring.c + <_3:checksum rdf:nodeID="NukVOfZA350"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/alloc-logging/README.rst + <_3:checksum rdf:nodeID="NukVOfZA174"/> + + + + <_3:checksumValue>e5a5f0db067ec56c6d2f7356f412222a8884dc92 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./config/genconfig_metadata.tar.gz + <_3:checksum rdf:nodeID="NukVOfZA442"/> + + + + <_3:checksumValue>d68dbb37b698f98f51a9136d4026b2ac0a2911c4 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>6a1500fea27ea278c4f0c64d908e16cc60df684b + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:name>Duktape + <_3:originator>Organization: duktape.org + <_3:versionInfo>1.3.0 + <_3:packageVerificationCode rdf:nodeID="NukVOfZA5"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:summary>Duktape Ecmascript interpreter + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:downloadLocation rdf:datatype="http://www.w3.org/2001/XMLSchema#anyURI">http://duktape.org/duktape-1.3.0.tar.xz + <_3:homePage rdf:datatype="http://www.w3.org/2001/XMLSchema#anyURI">http://duktape.org/ + <_3:licenseDeclared rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:licenseComments>Duktape is copyrighted by its authors and licensed under the MIT license. MurmurHash2 is used internally, it is also under the MIT license. Duktape module loader is based on the CommonJS module loading specification (without sharing any code), CommonJS is under the MIT license. + <_3:supplier>Organization: duktape.org + <_3:sourceInfo>Official duktape.org release built from GitHub repo https://github.com/svaarala/duktape. + <_3:licenseInfoFromFiles rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:packageFileName>duktape-1.3.0.tar.xz + <_3:hasFile rdf:nodeID="NukVOfZA85"/> + <_3:hasFile rdf:nodeID="NukVOfZA159"/> + <_3:hasFile rdf:nodeID="NukVOfZA189"/> + <_3:hasFile rdf:nodeID="NukVOfZA269"/> + <_3:hasFile rdf:nodeID="NukVOfZA447"/> + <_3:hasFile rdf:nodeID="NukVOfZA403"/> + <_3:hasFile rdf:nodeID="NukVOfZA191"/> + <_3:hasFile rdf:nodeID="NukVOfZA255"/> + <_3:hasFile rdf:nodeID="NukVOfZA61"/> + <_3:hasFile rdf:nodeID="NukVOfZA267"/> + <_3:hasFile rdf:nodeID="NukVOfZA23"/> + <_3:hasFile rdf:nodeID="NukVOfZA179"/> + <_3:hasFile rdf:nodeID="NukVOfZA271"/> + <_3:hasFile rdf:nodeID="NukVOfZA197"/> + <_3:hasFile rdf:nodeID="NukVOfZA367"/> + <_3:hasFile rdf:nodeID="NukVOfZA365"/> + <_3:hasFile rdf:nodeID="NukVOfZA425"/> + <_3:hasFile rdf:nodeID="NukVOfZA351"/> + <_3:hasFile rdf:nodeID="NukVOfZA317"/> + <_3:hasFile rdf:nodeID="NukVOfZA211"/> + <_3:hasFile rdf:nodeID="NukVOfZA207"/> + <_3:hasFile rdf:nodeID="NukVOfZA431"/> + <_3:hasFile rdf:nodeID="NukVOfZA331"/> + <_3:hasFile rdf:nodeID="NukVOfZA33"/> + <_3:hasFile rdf:nodeID="NukVOfZA285"/> + <_3:hasFile rdf:nodeID="NukVOfZA371"/> + <_3:hasFile rdf:nodeID="NukVOfZA423"/> + <_3:hasFile rdf:nodeID="NukVOfZA199"/> + <_3:hasFile rdf:nodeID="NukVOfZA163"/> + <_3:hasFile rdf:nodeID="NukVOfZA81"/> + <_3:hasFile rdf:nodeID="NukVOfZA291"/> + <_3:hasFile rdf:nodeID="NukVOfZA25"/> + <_3:hasFile rdf:nodeID="NukVOfZA97"/> + <_3:hasFile rdf:nodeID="NukVOfZA341"/> + <_3:hasFile rdf:nodeID="NukVOfZA339"/> + <_3:hasFile rdf:nodeID="NukVOfZA217"/> + <_3:hasFile rdf:nodeID="NukVOfZA93"/> + <_3:hasFile rdf:nodeID="NukVOfZA175"/> + <_3:hasFile rdf:nodeID="NukVOfZA193"/> + <_3:hasFile rdf:nodeID="NukVOfZA117"/> + <_3:hasFile rdf:nodeID="NukVOfZA377"/> + <_3:hasFile rdf:nodeID="NukVOfZA69"/> + <_3:hasFile rdf:nodeID="NukVOfZA75"/> + <_3:hasFile rdf:nodeID="NukVOfZA21"/> + <_3:hasFile rdf:nodeID="NukVOfZA111"/> + <_3:hasFile rdf:nodeID="NukVOfZA63"/> + <_3:hasFile rdf:nodeID="NukVOfZA287"/> + <_3:hasFile rdf:nodeID="NukVOfZA239"/> + <_3:hasFile rdf:nodeID="NukVOfZA147"/> + <_3:hasFile rdf:nodeID="NukVOfZA233"/> + <_3:hasFile rdf:nodeID="NukVOfZA89"/> + <_3:hasFile rdf:nodeID="NukVOfZA181"/> + <_3:hasFile rdf:nodeID="NukVOfZA77"/> + <_3:hasFile rdf:nodeID="NukVOfZA79"/> + <_3:hasFile rdf:nodeID="NukVOfZA123"/> + <_3:hasFile rdf:nodeID="NukVOfZA373"/> + <_3:hasFile rdf:nodeID="NukVOfZA319"/> + <_3:hasFile rdf:nodeID="NukVOfZA131"/> + <_3:hasFile rdf:nodeID="NukVOfZA137"/> + <_3:hasFile rdf:nodeID="NukVOfZA249"/> + <_3:hasFile rdf:nodeID="NukVOfZA201"/> + <_3:hasFile rdf:nodeID="NukVOfZA437"/> + <_3:hasFile rdf:nodeID="NukVOfZA417"/> + <_3:hasFile rdf:nodeID="NukVOfZA309"/> + <_3:hasFile rdf:nodeID="NukVOfZA393"/> + <_3:hasFile rdf:nodeID="NukVOfZA157"/> + <_3:hasFile rdf:nodeID="NukVOfZA241"/> + <_3:hasFile rdf:nodeID="NukVOfZA213"/> + <_3:hasFile rdf:nodeID="NukVOfZA419"/> + <_3:hasFile rdf:nodeID="NukVOfZA101"/> + <_3:hasFile rdf:nodeID="NukVOfZA235"/> + <_3:hasFile rdf:nodeID="NukVOfZA205"/> + <_3:hasFile rdf:nodeID="NukVOfZA143"/> + <_3:hasFile rdf:nodeID="NukVOfZA363"/> + <_3:hasFile rdf:nodeID="NukVOfZA221"/> + <_3:hasFile rdf:nodeID="NukVOfZA289"/> + <_3:hasFile rdf:nodeID="NukVOfZA135"/> + <_3:hasFile rdf:nodeID="NukVOfZA109"/> + <_3:hasFile rdf:nodeID="NukVOfZA35"/> + <_3:hasFile rdf:nodeID="NukVOfZA439"/> + <_3:hasFile rdf:nodeID="NukVOfZA399"/> + <_3:hasFile rdf:nodeID="NukVOfZA411"/> + <_3:hasFile rdf:nodeID="NukVOfZA307"/> + <_3:hasFile rdf:nodeID="NukVOfZA169"/> + <_3:hasFile rdf:nodeID="NukVOfZA203"/> + <_3:hasFile rdf:nodeID="NukVOfZA39"/> + <_3:hasFile rdf:nodeID="NukVOfZA187"/> + <_3:hasFile rdf:nodeID="NukVOfZA103"/> + <_3:hasFile rdf:nodeID="NukVOfZA409"/> + <_3:hasFile rdf:nodeID="NukVOfZA343"/> + <_3:hasFile rdf:nodeID="NukVOfZA231"/> + <_3:hasFile rdf:nodeID="NukVOfZA389"/> + <_3:hasFile rdf:nodeID="NukVOfZA379"/> + <_3:hasFile rdf:nodeID="NukVOfZA253"/> + <_3:hasFile rdf:nodeID="NukVOfZA321"/> + <_3:hasFile rdf:nodeID="NukVOfZA243"/> + <_3:hasFile rdf:nodeID="NukVOfZA167"/> + <_3:hasFile rdf:nodeID="NukVOfZA311"/> + <_3:hasFile rdf:nodeID="NukVOfZA275"/> + <_3:hasFile rdf:nodeID="NukVOfZA127"/> + <_3:hasFile rdf:nodeID="NukVOfZA29"/> + <_3:hasFile rdf:nodeID="NukVOfZA429"/> + <_3:hasFile rdf:nodeID="NukVOfZA257"/> + <_3:hasFile rdf:nodeID="NukVOfZA325"/> + <_3:hasFile rdf:nodeID="NukVOfZA435"/> + <_3:hasFile rdf:nodeID="NukVOfZA337"/> + <_3:hasFile rdf:nodeID="NukVOfZA259"/> + <_3:hasFile rdf:nodeID="NukVOfZA381"/> + <_3:hasFile rdf:nodeID="NukVOfZA407"/> + <_3:hasFile rdf:nodeID="NukVOfZA177"/> + <_3:hasFile rdf:nodeID="NukVOfZA449"/> + <_3:hasFile rdf:nodeID="NukVOfZA53"/> + <_3:hasFile rdf:nodeID="NukVOfZA395"/> + <_3:hasFile rdf:nodeID="NukVOfZA209"/> + <_3:hasFile rdf:nodeID="NukVOfZA27"/> + <_3:hasFile rdf:nodeID="NukVOfZA397"/> + <_3:hasFile rdf:nodeID="NukVOfZA237"/> + <_3:hasFile rdf:nodeID="NukVOfZA335"/> + <_3:hasFile rdf:nodeID="NukVOfZA139"/> + <_3:hasFile rdf:nodeID="NukVOfZA41"/> + <_3:hasFile rdf:nodeID="NukVOfZA171"/> + <_3:hasFile rdf:nodeID="NukVOfZA7"/> + <_3:hasFile rdf:nodeID="NukVOfZA387"/> + <_3:hasFile rdf:nodeID="NukVOfZA83"/> + <_3:hasFile rdf:nodeID="NukVOfZA421"/> + <_3:hasFile rdf:nodeID="NukVOfZA327"/> + <_3:hasFile rdf:nodeID="NukVOfZA347"/> + <_3:hasFile rdf:nodeID="NukVOfZA277"/> + <_3:hasFile rdf:nodeID="NukVOfZA279"/> + <_3:hasFile rdf:nodeID="NukVOfZA59"/> + <_3:hasFile rdf:nodeID="NukVOfZA185"/> + <_3:hasFile rdf:nodeID="NukVOfZA329"/> + <_3:hasFile rdf:nodeID="NukVOfZA427"/> + <_3:hasFile rdf:nodeID="NukVOfZA273"/> + <_3:hasFile rdf:nodeID="NukVOfZA361"/> + <_3:hasFile rdf:nodeID="NukVOfZA345"/> + <_3:hasFile rdf:nodeID="NukVOfZA223"/> + <_3:hasFile rdf:nodeID="NukVOfZA375"/> + <_3:hasFile rdf:nodeID="NukVOfZA445"/> + <_3:hasFile rdf:nodeID="NukVOfZA15"/> + <_3:hasFile rdf:nodeID="NukVOfZA359"/> + <_3:hasFile rdf:nodeID="NukVOfZA45"/> + <_3:hasFile rdf:nodeID="NukVOfZA215"/> + <_3:hasFile rdf:nodeID="NukVOfZA183"/> + <_3:hasFile rdf:nodeID="NukVOfZA369"/> + <_3:hasFile rdf:nodeID="NukVOfZA265"/> + <_3:hasFile rdf:nodeID="NukVOfZA305"/> + <_3:hasFile rdf:nodeID="NukVOfZA51"/> + <_3:hasFile rdf:nodeID="NukVOfZA113"/> + <_3:hasFile rdf:nodeID="NukVOfZA13"/> + <_3:hasFile rdf:nodeID="NukVOfZA43"/> + <_3:hasFile rdf:nodeID="NukVOfZA133"/> + <_3:hasFile rdf:nodeID="NukVOfZA383"/> + <_3:hasFile rdf:nodeID="NukVOfZA251"/> + <_3:hasFile rdf:nodeID="NukVOfZA55"/> + <_3:hasFile rdf:nodeID="NukVOfZA295"/> + <_3:hasFile rdf:nodeID="NukVOfZA401"/> + <_3:hasFile rdf:nodeID="NukVOfZA433"/> + <_3:hasFile rdf:nodeID="NukVOfZA161"/> + <_3:hasFile rdf:nodeID="NukVOfZA299"/> + <_3:hasFile rdf:nodeID="NukVOfZA95"/> + <_3:hasFile rdf:nodeID="NukVOfZA107"/> + <_3:hasFile rdf:nodeID="NukVOfZA227"/> + <_3:hasFile rdf:nodeID="NukVOfZA323"/> + <_3:hasFile rdf:nodeID="NukVOfZA333"/> + <_3:hasFile rdf:nodeID="NukVOfZA105"/> + <_3:hasFile rdf:nodeID="NukVOfZA443"/> + <_3:hasFile rdf:nodeID="NukVOfZA153"/> + <_3:hasFile rdf:nodeID="NukVOfZA141"/> + <_3:hasFile rdf:nodeID="NukVOfZA353"/> + <_3:hasFile rdf:nodeID="NukVOfZA9"/> + <_3:hasFile rdf:nodeID="NukVOfZA281"/> + <_3:hasFile rdf:nodeID="NukVOfZA11"/> + <_3:hasFile rdf:nodeID="NukVOfZA385"/> + <_3:hasFile rdf:nodeID="NukVOfZA229"/> + <_3:hasFile rdf:nodeID="NukVOfZA297"/> + <_3:hasFile rdf:nodeID="NukVOfZA405"/> + <_3:hasFile rdf:nodeID="NukVOfZA151"/> + <_3:hasFile rdf:nodeID="NukVOfZA165"/> + <_3:hasFile rdf:nodeID="NukVOfZA67"/> + <_3:hasFile rdf:nodeID="NukVOfZA115"/> + <_3:hasFile rdf:nodeID="NukVOfZA65"/> + <_3:hasFile rdf:nodeID="NukVOfZA49"/> + <_3:hasFile rdf:nodeID="NukVOfZA263"/> + <_3:hasFile rdf:nodeID="NukVOfZA125"/> + <_3:hasFile rdf:nodeID="NukVOfZA91"/> + <_3:hasFile rdf:nodeID="NukVOfZA19"/> + <_3:hasFile rdf:nodeID="NukVOfZA283"/> + <_3:hasFile rdf:nodeID="NukVOfZA349"/> + <_3:hasFile rdf:nodeID="NukVOfZA173"/> + <_3:hasFile rdf:nodeID="NukVOfZA355"/> + <_3:hasFile rdf:nodeID="NukVOfZA303"/> + <_3:hasFile rdf:nodeID="NukVOfZA441"/> + <_3:hasFile rdf:nodeID="NukVOfZA357"/> + <_3:hasFile rdf:nodeID="NukVOfZA195"/> + <_3:hasFile rdf:nodeID="NukVOfZA225"/> + <_3:hasFile rdf:nodeID="NukVOfZA57"/> + <_3:hasFile rdf:nodeID="NukVOfZA121"/> + <_3:hasFile rdf:nodeID="NukVOfZA453"/> + <_3:hasFile rdf:nodeID="NukVOfZA415"/> + <_3:hasFile rdf:nodeID="NukVOfZA261"/> + <_3:hasFile rdf:nodeID="NukVOfZA301"/> + <_3:hasFile rdf:nodeID="NukVOfZA391"/> + <_3:hasFile rdf:nodeID="NukVOfZA17"/> + <_3:hasFile rdf:nodeID="NukVOfZA245"/> + <_3:hasFile rdf:nodeID="NukVOfZA71"/> + <_3:hasFile rdf:nodeID="NukVOfZA129"/> + <_3:hasFile rdf:nodeID="NukVOfZA293"/> + <_3:hasFile rdf:nodeID="NukVOfZA31"/> + <_3:hasFile rdf:nodeID="NukVOfZA119"/> + <_3:hasFile rdf:nodeID="NukVOfZA219"/> + <_3:hasFile rdf:nodeID="NukVOfZA451"/> + <_3:hasFile rdf:nodeID="NukVOfZA145"/> + <_3:hasFile rdf:nodeID="NukVOfZA73"/> + <_3:hasFile rdf:nodeID="NukVOfZA37"/> + <_3:hasFile rdf:nodeID="NukVOfZA87"/> + <_3:hasFile rdf:nodeID="NukVOfZA247"/> + <_3:hasFile rdf:nodeID="NukVOfZA99"/> + <_3:hasFile rdf:nodeID="NukVOfZA47"/> + <_3:hasFile rdf:nodeID="NukVOfZA413"/> + <_3:hasFile rdf:nodeID="NukVOfZA155"/> + <_3:hasFile rdf:nodeID="NukVOfZA313"/> + <_3:hasFile rdf:nodeID="NukVOfZA315"/> + <_3:hasFile rdf:nodeID="NukVOfZA149"/> + <_3:description>Duktape is an embeddable Javascript engine, with a focus on portability and compact footprint + + + + <_3:checksumValue>2cdc31948853f9f0bf0d5f726b6034c508ee9d67 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_forwdecl.h + <_3:checksum rdf:nodeID="NukVOfZA240"/> + + + + <_3:checksumValue>e2a167fd8048cbd7c85fd62da70749b2a0109b2a + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src/duktape.h + <_3:checksum rdf:nodeID="NukVOfZA454"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/eval/eval.c + <_3:checksum rdf:nodeID="NukVOfZA116"/> + + + + <_3:checksumValue>a8e7b9b9bed773ecc7e08f4b73716dad741fd50b + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>4ee4843558692861cb91a6c6906539795b639091 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/eventloop/main.c + <_3:checksum rdf:nodeID="NukVOfZA84"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./Makefile.eventloop + <_3:checksum rdf:nodeID="NukVOfZA32"/> + + + + <_3:checksumValue>d84a903a426cf3a158072565161c35240a1c68e5 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>206ffd13c06208e85baba2b257fe3ddebb56a6c2 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>6b150b9183cc8453536713de0d1e79adc21a3fee + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/eventloop/curses-timers.js + <_3:checksum rdf:nodeID="NukVOfZA100"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./debugger/duk_opcodes.yaml + <_3:checksum rdf:nodeID="NukVOfZA48"/> + + + + <_3:checksumValue>bd2f85dccd23b76b9cf9900b8b2b86f0bf97421b + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>e4d3286030d5ef1e74dd07a5b2efa37cd907697e + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>d48fe743ca18b8b3205d6443a08463d6b0334153 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>61043b4a6f3cf86375ea6e34ebf83b550a1935b2 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./polyfills/object-prototype-definegetter.js + <_3:checksum rdf:nodeID="NukVOfZA426"/> + + + + <_3:checksumValue>063133679b6d072efc1c27f3a510101744ffde0c + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>ca663612967cb12b33d666180d7bb3008314ca7a + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./Makefile.sandbox + <_3:checksum rdf:nodeID="NukVOfZA24"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_tval.c + <_3:checksum rdf:nodeID="NukVOfZA398"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hobject.h + <_3:checksum rdf:nodeID="NukVOfZA352"/> + + + + <_3:checksumValue>786369a33cccbadc3d2efba613a43fdd638971fc + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>f5251445a782e4bfac8af043f24ecbac740f67eb + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>1bce4dadb408a2a6a77b366f0ecfc18398cbb722 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>f65888efe272f584113d4df273cc6e7a5c5a43dd + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>df7b9fe732c2bc300d096c06d90bbdc71fada213 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_global.c + <_3:checksum rdf:nodeID="NukVOfZA200"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./AUTHORS.rst + <_3:checksum rdf:nodeID="NukVOfZA26"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/eventloop/ecma_eventloop.js + <_3:checksum rdf:nodeID="NukVOfZA98"/> + + + + <_3:checksumValue>b54cd58e7947b2899eb8662d2cdaf022dd680ea6 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>ea1ee74bace7e1958d0049c1035b3832ef951e82 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>6d0092ec677f2d4aa5c91cf9f71d8aca5171c8e2 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/alloc-hybrid/duk_alloc_hybrid.c + <_3:checksum rdf:nodeID="NukVOfZA70"/> + + + + <_3:checksumValue>41f24f22ab9039c1f9a548fb75c9639453380065 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>ea413ed7d47cf27c6f3ffe25956b1370b653c200 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>d869c0f8797a659124b3ba31c75f494b15bea5e6 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_api_call.c + <_3:checksum rdf:nodeID="NukVOfZA226"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/debug-trans-socket/duk_trans_socket.h + <_3:checksum rdf:nodeID="NukVOfZA148"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_builtins.h + <_3:checksum rdf:nodeID="NukVOfZA182"/> + + + + <_3:checksumValue>2c811905f5b8781c8b70d099687773a8d20ce082 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_config.h + <_3:checksum rdf:nodeID="NukVOfZA336"/> + + + + <_3:checksumValue>9bb6ca1fa3ad4c593b000b2de5aca013b95adda0 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>b298f68a888cec4efea00f221053645a59748c18 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>4e5a54de08355669dc98b5d4ad379384b33da4e5 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>2878666c896a9a9a4dddefd943c0ddf3a09310a4 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>07a167411a356aebfbe987353846a9c711998f20 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_thread.c + <_3:checksum rdf:nodeID="NukVOfZA394"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/debug-trans-dvalue/Makefile + <_3:checksum rdf:nodeID="NukVOfZA158"/> + + + + <_3:checksumValue>27813a75f3f27a0dcdf51e269582a97679585827 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>9a31edd2028d39d24aa9bfdbd2b70ce2a64b8493 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_api_stack.c + <_3:checksum rdf:nodeID="NukVOfZA404"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_jmpbuf.h + <_3:checksum rdf:nodeID="NukVOfZA190"/> + + + + <_3:checksumValue>5a72a639353c2f9e3bfb1c369246775ecd6f005e + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_unicode.h + <_3:checksum rdf:nodeID="NukVOfZA222"/> + + + + <_3:checksumValue>a2c79a55a60f73e1a1567b96d584399571180ef5 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>09ee87b3ae8afe8b7c2295127835b05b00603b25 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/alloc-torture/duk_alloc_torture.h + <_3:checksum rdf:nodeID="NukVOfZA136"/> + + + + <_3:checksumValue>6b097ba4583a27d31c21b60cb15770804dd1ba9d + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>29be453689679c9bab977c0b333a4a224d9f02e6 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./config/README.rst + <_3:checksum rdf:nodeID="NukVOfZA440"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_debug_vsnprintf.c + <_3:checksum rdf:nodeID="NukVOfZA308"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/alloc-logging/log2gnuplot.py + <_3:checksum rdf:nodeID="NukVOfZA170"/> + + + + <_3:checksumValue>5d56f0bab3e87abdca8da4d6e8580cb9132fd697 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>5f3b6cd81be97aa687fe8b47751e68b5561d7c1b + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>b6cf7cd6cdf526aa3cf60144c6a9569e6d112f36 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/alloc-logging/duk_alloc_logging.c + <_3:checksum rdf:nodeID="NukVOfZA168"/> + + + + <_3:checksumValue>7edf7600e1a6f09d1e4a0e2f9be418b59fff7c52 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>16a4c10bea273a74018fa0a7a8889b7b43a3119b + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>0053a77d6c3562af6d2238f096f3a9bd4b5a834f + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/coffee/hello.coffee + <_3:checksum rdf:nodeID="NukVOfZA60"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./Makefile.eval + <_3:checksum rdf:nodeID="NukVOfZA30"/> + + + + <_3:checksumValue>b2872f0cbb3cbe10184bbc3a95b1d7c365b8ed32 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>a5afcd26ab65a29d95a6e33bf0f33645ee4fd91b + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./polyfills/performance-now.js + <_3:checksum rdf:nodeID="NukVOfZA436"/> + + + + <_3:checksumValue>32a98d7fe78d83f08173234229f862698fce2090 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duktape.h + <_3:checksum rdf:nodeID="NukVOfZA408"/> + + + + <_3:checksumValue>02b01faf5220448b3d678abba34a0a9be96d71ca + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>ff17cbc9cb84b86f83bb104a247e5c265a9fe5b5 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./Makefile.dukdebug + <_3:checksum rdf:nodeID="NukVOfZA28"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/guide/prime.js + <_3:checksum rdf:nodeID="NukVOfZA130"/> + + + + <_3:checksumValue>14ec83aeef66a38c6a4c48a175a544f66d319413 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_pointer.c + <_3:checksum rdf:nodeID="NukVOfZA422"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_unicode_tables.c + <_3:checksum rdf:nodeID="NukVOfZA278"/> + + + + <_3:checksumValue>29b1960bc40607c2cf496465068611b2ffc4de87 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>b398df12e0b18a0e3edca6c4d55f7575cea9a76a + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>f437b6a49e9ad85f1bed504b9d7724358eb37ad8 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_api_var.c + <_3:checksum rdf:nodeID="NukVOfZA402"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_date_windows.c + <_3:checksum rdf:nodeID="NukVOfZA376"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./mandel.js + <_3:checksum rdf:nodeID="NukVOfZA16"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_heap_alloc.c + <_3:checksum rdf:nodeID="NukVOfZA360"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_regexp_executor.c + <_3:checksum rdf:nodeID="NukVOfZA184"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_debugger.c + <_3:checksum rdf:nodeID="NukVOfZA384"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_heap_stringtable.c + <_3:checksum rdf:nodeID="NukVOfZA252"/> + + + + <_3:checksumValue>11f16b15a8e52598a078b88a8d0440ff61dd5ba2 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>1eb3bb219637be52abe8a154551ec76bfc5ecf31 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hthread_alloc.c + <_3:checksum rdf:nodeID="NukVOfZA334"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./extras/README.rst + <_3:checksum rdf:nodeID="NukVOfZA444"/> + + + + <_3:checksumValue>58c701ade28ee5a475dede84a6e771893e3fc40f + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_array.c + <_3:checksum rdf:nodeID="NukVOfZA354"/> + + + + <_3:checksumValue>6961515d6681b7dfb59d2d080b87cdeb2a673025 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_replacements.h + <_3:checksum rdf:nodeID="NukVOfZA282"/> + + + + <_3:checksumValue>89ce4d46fcef5a35b3b6652d79ebe556b121d2a8 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_js_bytecode.h + <_3:checksum rdf:nodeID="NukVOfZA230"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_util_hashbytes.c + <_3:checksum rdf:nodeID="NukVOfZA406"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./debugger/static/style.css + <_3:checksum rdf:nodeID="NukVOfZA50"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./Makefile.coffee + <_3:checksum rdf:nodeID="NukVOfZA20"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src/duk_config.h + <_3:checksum rdf:nodeID="NukVOfZA450"/> + + + + <_3:checksumValue>3948c3f17d6863157361cb817b6bc7bf7799122f + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_api_compile.c + <_3:checksum rdf:nodeID="NukVOfZA358"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/coffee/mandel.coffee + <_3:checksum rdf:nodeID="NukVOfZA58"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_debug_fixedbuffer.c + <_3:checksum rdf:nodeID="NukVOfZA416"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_date.c + <_3:checksum rdf:nodeID="NukVOfZA246"/> + + + + <_3:checksumValue>4d3ab8c2d41261b0cae627db9d536d26f72b5f8e + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_util_bufwriter.c + <_3:checksum rdf:nodeID="NukVOfZA186"/> + + + + <_3:checksumValue>4588ca1842f93e72254f9b428d6d07ad22b57163 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/cmdline/README.rst + <_3:checksum rdf:nodeID="NukVOfZA146"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/eventloop/ncurses.c + <_3:checksum rdf:nodeID="NukVOfZA88"/> + + + + <_3:checksumValue>d90697f65158589fb137e9a48cbf288bde2ef230 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/debug-trans-dvalue/README.rst + <_3:checksum rdf:nodeID="NukVOfZA156"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hcompiledfunction.h + <_3:checksum rdf:nodeID="NukVOfZA304"/> + + + + <_3:checksumValue>a9db75839022e7dcf7e691ada7480a9b7c2715d0 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>3d700df1f765c39fc63bfd4e31a9d7da8d15c543 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hthread_builtins.c + <_3:checksum rdf:nodeID="NukVOfZA270"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/coffee/README.rst + <_3:checksum rdf:nodeID="NukVOfZA62"/> + + + + <_3:checksumValue>5f89525f75f61dd8c89e010cb62bc071d6d13170 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>7b236da6f48b6f6aef43e6c959b43edaa8120ff4 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>ad475950dc26e62ba57f5bfa266687681b09e10f + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>fa85ee3394206d18c611b837e700257ba8336250 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_debug_macros.c + <_3:checksum rdf:nodeID="NukVOfZA424"/> + + + + <_3:checksumValue>8521b45dcbc72d66c2b4e3f0db9e1dbfb75b45f5 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_api_memory.c + <_3:checksum rdf:nodeID="NukVOfZA318"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hstring_misc.c + <_3:checksum rdf:nodeID="NukVOfZA208"/> + + + + <_3:checksumValue>2c2b647e4cf2c94e91f5193987a01a029bf01690 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./Makefile.jxpretty + <_3:checksum rdf:nodeID="NukVOfZA34"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_regexp.c + <_3:checksum rdf:nodeID="NukVOfZA372"/> + + + + <_3:checksumValue>484fb41d516abcbe8c97af5aa80b76c67dbfb0cb + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>7108fbe42728e2fe1c2448b119a6a1f52568ce53 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/jxpretty/jxpretty.c + <_3:checksum rdf:nodeID="NukVOfZA82"/> + + + + <_3:checksumValue>3c10dd228daad9be3ea381c2f8b1e07e524fae6f + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_boolean.c + <_3:checksum rdf:nodeID="NukVOfZA342"/> + + + + <_3:checksumValue>fb4f806e7282dd3cb2df04e228672d8b0b1b8eb4 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_error_misc.c + <_3:checksum rdf:nodeID="NukVOfZA316"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_error.c + <_3:checksum rdf:nodeID="NukVOfZA176"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hobject_enum.c + <_3:checksum rdf:nodeID="NukVOfZA194"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/guide/README.rst + <_3:checksum rdf:nodeID="NukVOfZA118"/> + + + + <_3:checksumValue>2e9dca0919a92c68ed30593292b3fe7140480062 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_strings.h + <_3:checksum rdf:nodeID="NukVOfZA378"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/codepage-conv/test.c + <_3:checksum rdf:nodeID="NukVOfZA76"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./Makefile.codepage + <_3:checksum rdf:nodeID="NukVOfZA22"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/dummy-date-provider/dummy_date_provider.c + <_3:checksum rdf:nodeID="NukVOfZA112"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./config/genconfig.py + <_3:checksum rdf:nodeID="NukVOfZA438"/> + + + + <_3:checksumValue>dfaa38c7372de482fd12634e4a3507f46e467e0f + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>982e40839854be361e3b57b5c07ef4f710ab749b + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>0811e545a133c3a62672e239624a0c1f11478b8d + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>0fd79121cfa729c2dd3e47632ec46204609013ef + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/jxpretty/README.rst + <_3:checksum rdf:nodeID="NukVOfZA80"/> + + + + <_3:checksumValue>f9072f5c361c86887b57ce662b3cd7211b4ce346 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/alloc-torture/README.rst + <_3:checksum rdf:nodeID="NukVOfZA132"/> + + + + <_3:checksumValue>d49c1cdb51b3a4fdd823c13831617a1f0a93edd1 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_heap_stringcache.c + <_3:checksum rdf:nodeID="NukVOfZA420"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_alloc_default.c + <_3:checksum rdf:nodeID="NukVOfZA418"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/cmdline/duk_cmdline.c + <_3:checksum rdf:nodeID="NukVOfZA144"/> + + + + <_3:checksumValue>506914e460ff9d7536f10efef54b24b83c390410 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_debugger.h + <_3:checksum rdf:nodeID="NukVOfZA364"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_api_heap.c + <_3:checksum rdf:nodeID="NukVOfZA290"/> + + + + <_3:checksumValue>1c45360bd50cff6c2c25087d52136b390179e8fc + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>bf522799f089bf27e5ef2196b73c7e3d294ee5ba + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_object.c + <_3:checksum rdf:nodeID="NukVOfZA400"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/eventloop/poll.c + <_3:checksum rdf:nodeID="NukVOfZA104"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_api_buffer.c + <_3:checksum rdf:nodeID="NukVOfZA380"/> + + + + <_3:checksumValue>11a7a5b6b1557adeca8a9def51cb44282f24c853 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_error_longjmp.c + <_3:checksum rdf:nodeID="NukVOfZA254"/> + + + + <_3:checksumValue>8aa63b553757fe1229638e978b540d7116b70274 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>23b6b54a8a35fbec735ffb332f4100a7f00557be + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_lexer.c + <_3:checksum rdf:nodeID="NukVOfZA228"/> + + + + <_3:checksumValue>61c7f89aa56094410418e766c89c1975db021daa + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>bf5a69136d03c3a573822dc1fe6e595a92c5d9b5 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>4d3413b7b28775afc4a5be95e91208fab25b02f3 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_thrower.c + <_3:checksum rdf:nodeID="NukVOfZA338"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_api_internal.h + <_3:checksum rdf:nodeID="NukVOfZA260"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_numconv.c + <_3:checksum rdf:nodeID="NukVOfZA382"/> + + + + <_3:checksumValue>76fafefbb89d1d3561a44bf6c253415ab86633f7 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_error_throw.c + <_3:checksum rdf:nodeID="NukVOfZA178"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./debugger/static/index.html + <_3:checksum rdf:nodeID="NukVOfZA54"/> + + + + <_3:checksumValue>d8fe87c8e0d17bd6977bbc34d562e4b79c06f1a3 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>3a4934f863facf317ffcc1a6ce1d8f17ac658f38 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./LICENSE.txt + <_3:checksum rdf:nodeID="NukVOfZA8"/> + + + + <_3:checksumValue>24a2346fa389c2294cc0e96427e0bd206dac10b9 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_util_tinyrandom.c + <_3:checksum rdf:nodeID="NukVOfZA280"/> + + + + <_3:checksumValue>4239a907720cf3620bd0b03eb43981e7182e305a + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>578b63fa72c87e894a47a9f82102ecee895f932f + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>628eded8d5c2a48cb32a615bb7f11f164c949540 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_heaphdr.h + <_3:checksum rdf:nodeID="NukVOfZA386"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_api_bytecode.c + <_3:checksum rdf:nodeID="NukVOfZA328"/> + + + + <_3:checksumValue>742635fda10ef9775864077e647b59442768a69c + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src/duktape.c + <_3:checksum rdf:nodeID="NukVOfZA452"/> + + + + <_3:checksumValue>533dd2148cf54628be701ce5bbbda88c443244fd + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/alloc-torture/duk_alloc_torture.c + <_3:checksum rdf:nodeID="NukVOfZA134"/> + + + + <_3:checksumValue>439430cb950965d418b5bcb4ca36047f77a26a7c + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>925915ad11fea8da4582dbd9bc9e8b5ffbb8994d + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_js_compiler.h + <_3:checksum rdf:nodeID="NukVOfZA300"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/eventloop/fileio.c + <_3:checksum rdf:nodeID="NukVOfZA96"/> + + + + <_3:checksumValue>c2a8bb08084e49f0e12d31562a90f72046761028 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>bce447cad4609861c4db6edbfe38bf2fa150e651 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>2321e0a68bf940f8346d00adda9e4a58fa51f608 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>839ade6f7b93fd0fc604e3e0934568331eedd648 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>a9206a7b46f8d8319b798475650217f494fa76ab + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/alloc-hybrid/duk_alloc_hybrid.h + <_3:checksum rdf:nodeID="NukVOfZA66"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_strings.c + <_3:checksum rdf:nodeID="NukVOfZA220"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_math.c + <_3:checksum rdf:nodeID="NukVOfZA264"/> + + + + <_3:checksumValue>0125ebcabe62cef4923e75527d3128e8c48cdf1f + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>bfbf3b8ea996451740a7ad2d8d1376feca4ca382 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_api_codec.c + <_3:checksum rdf:nodeID="NukVOfZA356"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./polyfills/object-prototype-definesetter.js + <_3:checksum rdf:nodeID="NukVOfZA430"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/sandbox/sandbox.c + <_3:checksum rdf:nodeID="NukVOfZA164"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/eventloop/socket.c + <_3:checksum rdf:nodeID="NukVOfZA90"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_buffer.c + <_3:checksum rdf:nodeID="NukVOfZA302"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hthread_stacks.c + <_3:checksum rdf:nodeID="NukVOfZA292"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./Makefile.cmdline + <_3:checksum rdf:nodeID="NukVOfZA18"/> + + + + <_3:checksumValue>4db4ca2d7ce3f076fd195372d53e8bc5714d2597 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>813eed354904f72d97568c814fbcf5fffbb62d12 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/alloc-logging/duk_alloc_logging.h + <_3:checksum rdf:nodeID="NukVOfZA172"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hnativefunction.h + <_3:checksum rdf:nodeID="NukVOfZA294"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/guide/processlines.c + <_3:checksum rdf:nodeID="NukVOfZA120"/> + + + + <_3:checksumValue>c000aebe8b6794338529fdf6e02c0cfdcf4d2dfc + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>2c508fbc7eb127f6793cfe62bf947879668983a4 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./debugger/README.rst + <_3:checksum rdf:nodeID="NukVOfZA38"/> + + + + <_3:checksumValue>b4c9666ce152c9a98bf965aae4ef4fe0b36b2130 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>b4d00dadc78f1ac25d87d8d7a48fd67161235d4f + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_debug_heap.c + <_3:checksum rdf:nodeID="NukVOfZA414"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_js_var.c + <_3:checksum rdf:nodeID="NukVOfZA314"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/debug-trans-socket/README.rst + <_3:checksum rdf:nodeID="NukVOfZA150"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_debug.h + <_3:checksum rdf:nodeID="NukVOfZA340"/> + + + + <_3:checksumValue>6988aac432dcc185c2967732e21947ea0696377f + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./licenses/commonjs.txt + <_3:checksum rdf:nodeID="NukVOfZA448"/> + + + + <_3:checksumValue>878e91bed3a8756c70aaa43bb1566040fe6e42f0 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hstring.h + <_3:checksum rdf:nodeID="NukVOfZA256"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_json.c + <_3:checksum rdf:nodeID="NukVOfZA268"/> + + + + <_3:checksumValue>e023af5c2fb4b1efab74a230c552f1eb1b37fc10 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>e44b8b092afcfa97e693eb3e0be97d41f8aff301 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>2eadae5af69aec5e3336b6a869fe64771d4db080 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>935644ce5c2bcd1f9b725c742a91dd34ec7c7fc3 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>13d0e469fd05cef5066b33ad1310658e4cf5c7c8 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>f1dee4b05f535519fbf3662469c2ce810b6e2545 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_tval.h + <_3:checksum rdf:nodeID="NukVOfZA332"/> + + + + <_3:checksumValue>635d4642c9ecd5fd9a5346bf9f0e38db102b09b6 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>7502f77b459c82f4e9a45ecdde05125d79153bdf + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>042bfc66d9b0f01ce8075818959c9a72c35b4bb4 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./polyfills/object-assign.js + <_3:checksum rdf:nodeID="NukVOfZA428"/> + + + + <_3:checksumValue>5e8812e8226d2ec0387af6e2ce9565755e274164 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>56a4e5fbd50d1b9917625a0dfcf6e2619b034786 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>8015d14ffbc7a4a4b93d654f093aa48ec17fce4e + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>73ff75213f392b6125c68ab6b430176dfad71269 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>a20231719c1f9b97ea38fbc42dd8af1e21d74879 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_heap_memory.c + <_3:checksum rdf:nodeID="NukVOfZA368"/> + + + + <_3:checksumValue>949e147e9b5e284590449d0e8f74427c8c12f00f + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hthread_misc.c + <_3:checksum rdf:nodeID="NukVOfZA210"/> + + + + <_3:checksumValue>c1036bb5992816ffb09e8b2ee24f082a881326e9 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_js.h + <_3:checksum rdf:nodeID="NukVOfZA212"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/coffee/globals.coffee + <_3:checksum rdf:nodeID="NukVOfZA64"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_error_augment.c + <_3:checksum rdf:nodeID="NukVOfZA288"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hthread.h + <_3:checksum rdf:nodeID="NukVOfZA320"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/hello/hello.c + <_3:checksum rdf:nodeID="NukVOfZA138"/> + + + + <_3:checksumValue>af6b0cd61c02efa575b9106682606297d26f013b + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>57f519aabc8730f19d197bd00fe7e4f592063ddf + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./polyfills/console-minimal.js + <_3:checksum rdf:nodeID="NukVOfZA434"/> + + + + <_3:checksumValue>1e6c5c99fdcef26a561724faa703bf9c53c73bca + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_string.c + <_3:checksum rdf:nodeID="NukVOfZA242"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_api_logging.c + <_3:checksum rdf:nodeID="NukVOfZA262"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/eventloop/basic-test.js + <_3:checksum rdf:nodeID="NukVOfZA102"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_regexp.h + <_3:checksum rdf:nodeID="NukVOfZA236"/> + + + + <_3:checksumValue>12da70c807ea25465e5e0191784203ff6a1c7d0c + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>10c24a17c2f5f82d8c1a8fab8673c0c9075c1817 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/dummy-date-provider/README.rst + <_3:checksum rdf:nodeID="NukVOfZA110"/> + + + + <_3:checksumValue>b2f66f393c178e011c068b230f17ef8a48b4ee29 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_heap.h + <_3:checksum rdf:nodeID="NukVOfZA232"/> + + + + <_3:checksumValue>0aee8a99ab7468ae7254d0b19f898a7c67f24c4d + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>22046b9dfc552ed692193d1bf5e3d0e182111ae5 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_date_unix.c + <_3:checksum rdf:nodeID="NukVOfZA204"/> + + + + <_3:checksumValue>149fd21526c90d52b22e77b297f76e6da3e656ff + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./debugger/Makefile + <_3:checksum rdf:nodeID="NukVOfZA40"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_error_macros.c + <_3:checksum rdf:nodeID="NukVOfZA344"/> + + + + <_3:checksumValue>c8ae046bda2c920b5d807dfa68c8159b655b0873 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>3e4c09bd49dbe5d8509da6f2387eadfca945126c + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>b381ea15009eb8140c0789203345cdcc2c6c1cd6 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/guide/primecheck.c + <_3:checksum rdf:nodeID="NukVOfZA128"/> + + + + <_3:checksumValue>f79f6933571dcdd7108447f6e8e86f4735b30caf + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>5583c0190c2038be60ba2de07d155d5077defb03 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/codepage-conv/README.rst + <_3:checksum rdf:nodeID="NukVOfZA72"/> + + + + <_3:checksumValue>a1b146201fb105044a9922781e22d14bcbd5584c + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>5d593ae6316ed7a3ea6e7ed0a47267745d79d12d + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>136f423bdc27f3effc1e45c44327c1d3ef82f0d9 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>bf80565339b6d9eb92f7e8b35420317cf00392f1 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hobject_alloc.c + <_3:checksum rdf:nodeID="NukVOfZA238"/> + + + + <_3:checksumValue>36b07bc32cf613c091d5e4261cbe44b0556704fd + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>01138dd2786346a159c06e43f094d07f002df881 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/hello/README.rst + <_3:checksum rdf:nodeID="NukVOfZA140"/> + + + + <_3:checksumValue>edc510f4b2921d24eb9bc37ee0dd4a3d42743083 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./debugger/duk_debugcommands.yaml + <_3:checksum rdf:nodeID="NukVOfZA42"/> + + + + <_3:checksumValue>88ab1d060886393d94b6fb7c6054a0189117340b + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hbuffer_ops.c + <_3:checksum rdf:nodeID="NukVOfZA348"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_protos.h + <_3:checksum rdf:nodeID="NukVOfZA274"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_util_bitencoder.c + <_3:checksum rdf:nodeID="NukVOfZA362"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hobject_props.c + <_3:checksum rdf:nodeID="NukVOfZA224"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./licenses/murmurhash2.txt + <_3:checksum rdf:nodeID="NukVOfZA446"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./debugger/duk_classnames.yaml + <_3:checksum rdf:nodeID="NukVOfZA46"/> + + + + <_3:checksumValue>f396c6aec456b183ef77e33da1dfffc89c417056 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>23575db7cd88e42c0c3fc1630f44bf608fcec76d + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>b0916311103fdea3fd5bbf76a99748a3d21a5486 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>1c40a52fd54baf7ac334fce4829892d5d951401a + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>83b27494e6b257ab09828b0a4a1cf907686778a5 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./Makefile.hello + <_3:checksum rdf:nodeID="NukVOfZA14"/> + + + + <_3:checksumValue>71d2f9df7bf793f80f3cd6080c986a437f9b2991 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/README.rst + <_3:checksum rdf:nodeID="NukVOfZA56"/> + + + + <_3:checksumValue>c8d7674f8215d515779d2cfaf61105c4d2fd5eb5 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>8c5ee5b508a23ac5089a7e6c76593b6678965869 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/debug-trans-dvalue/test.c + <_3:checksum rdf:nodeID="NukVOfZA162"/> + + + + <_3:checksumValue>d45e3fc443887261ce432a807aaebd2a1812264e + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>57f519aabc8730f19d197bd00fe7e4f592063ddf + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_bi_logger.c + <_3:checksum rdf:nodeID="NukVOfZA276"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/debug-trans-dvalue/duk_trans_dvalue.h + <_3:checksum rdf:nodeID="NukVOfZA154"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/cmdline/duk_cmdline_ajduk.c + <_3:checksum rdf:nodeID="NukVOfZA142"/> + + + + <_3:checksumValue>ba20a4d987de1eef311c99f21db6621cb4b1a5d1 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hbufferobject.h + <_3:checksum rdf:nodeID="NukVOfZA370"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_api_object.c + <_3:checksum rdf:nodeID="NukVOfZA324"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/debug-trans-socket/duk_trans_socket.c + <_3:checksum rdf:nodeID="NukVOfZA152"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_other"/> + <_3:fileName>./examples/sandbox/README.rst + <_3:checksum rdf:nodeID="NukVOfZA166"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hobject_finalizer.c + <_3:checksum rdf:nodeID="NukVOfZA216"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/guide/process.js + <_3:checksum rdf:nodeID="NukVOfZA126"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/eventloop/c_eventloop.c + <_3:checksum rdf:nodeID="NukVOfZA92"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_unicode_support.c + <_3:checksum rdf:nodeID="NukVOfZA180"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_util_hashprime.c + <_3:checksum rdf:nodeID="NukVOfZA284"/> + + + + <_3:checksumValue>37e22b43351b7f0518b7fbb9e5c109d7a53a31e7 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>fb9c2ff459fd84b4587f846fbd36219cf8f06931 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>d529a6faac560def1e5b2cdb991713a6d70b0e26 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>f3ed5c785b60b0f39a74cc3f5b73b0c6e24287c3 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>34b0dc439c1aeb920a1db0ac0ed20ee189069ea1 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>111a7b97b46f038bd7f0f260ef5c9ff66c057217 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_hobject_class.c + <_3:checksum rdf:nodeID="NukVOfZA272"/> + + + + <_3:checksumValue>ed3bd07dbd103d285277ab38c4b4a7dd4a4b654b + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_builtins.c + <_3:checksum rdf:nodeID="NukVOfZA248"/> + + + + <_3:checksumValue>6fec920096ab278342b4832aac85e480f47c3b69 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>767b33200578243befc9b2b6b4a579dc3784f748 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>84b3f74e55ed4d76634e144d668601480573b369 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./examples/codepage-conv/duk_codepage_conv.c + <_3:checksum rdf:nodeID="NukVOfZA74"/> + + + + <_3:checksumValue>6f12665affb325d53ab11c0e40418b2326c1ac17 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>2b7443b734ad4f6e53e2f35e5aff74464410a680 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:licenseInfoInFile rdf:resource="http://spdx.org/rdf/terms#none"/> + <_3:licenseConcluded rdf:resource="http://spdx.org/licenses/MIT"/> + <_3:copyrightText>Copyright 2013-2014 Duktape authors (see AUTHORS.rst in the Duktape distributable) + <_3:fileType rdf:resource="http://spdx.org/rdf/terms#fileType_source"/> + <_3:fileName>./src-separate/duk_error.h + <_3:checksum rdf:nodeID="NukVOfZA198"/> + + + + <_3:checksumValue>a2896c39c83a21a2f79d0c4babd5012d85873116 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>3c8a488f2b4195d33379874172ae6d8b74beaa58 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>d535c4e27319a5db6026553a801e8a5ef0e6fe88 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>4baffeb2aa785bdc1065eb9ddb8c64c8a028655d + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + + + <_3:checksumValue>0783cf4f48c9baf2b3820a36ab276b01e2102600 + <_3:algorithm rdf:resource="http://spdx.org/rdf/terms#checksumAlgorithm_sha1"/> + + diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/licenses/commonjs.txt b/3P/civetweb/src/third_party/duktape-1.3.0/licenses/commonjs.txt new file mode 100644 index 00000000..54a1cd7b --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/licenses/commonjs.txt @@ -0,0 +1,2 @@ +CommonJS specification snapshots are included in the references/ +directory. CommonJS is under the MIT license: http://www.commonjs.org/. diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/licenses/murmurhash2.txt b/3P/civetweb/src/third_party/duktape-1.3.0/licenses/murmurhash2.txt new file mode 100644 index 00000000..70299256 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/licenses/murmurhash2.txt @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) + +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/3P/civetweb/src/third_party/duktape-1.3.0/mandel.js b/3P/civetweb/src/third_party/duktape-1.3.0/mandel.js new file mode 100644 index 00000000..79b5195b --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/mandel.js @@ -0,0 +1,53 @@ +/* + * Mandelbrot example: + * + * $ ./duk mandel.js + * [...] + */ + +function mandel() { + var w = 76, h = 28, iter = 100; + var i, j, k, c; + var x0, y0, xx, yy, xx2, yy2; + var line; + + for (i = 0; i < h; i++) { + y0 = (i / h) * 2.5 - 1.25; + + for (j = 0, line = []; j < w; j++) { + x0 = (j / w) * 3.0 - 2.0; + + for (k = 0, xx = 0, yy = 0, c = '#'; k < iter; k++) { + /* z -> z^2 + c + * -> (xx+i*yy)^2 + (x0+i*y0) + * -> xx*xx+i*2*xx*yy-yy*yy + x0 + i*y0 + * -> (xx*xx - yy*yy + x0) + i*(2*xx*yy + y0) + */ + + xx2 = xx*xx; yy2 = yy*yy; + + if (xx2 + yy2 < 4.0) { + yy = 2*xx*yy + y0; + xx = xx2 - yy2 + x0; + } else { + /* xx^2 + yy^2 >= 4.0 */ + if (k < 3) { c = '.'; } + else if (k < 5) { c = ','; } + else if (k < 10) { c = '-'; } + else { c = '='; } + break; + } + } + + line.push(c); + } + + print(line.join('')); + } +} + +try { + mandel(); +} catch (e) { + print(e.stack || e); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/console-minimal.js b/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/console-minimal.js new file mode 100644 index 00000000..1876c5fd --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/console-minimal.js @@ -0,0 +1,20 @@ +/* + * Minimal console.log() polyfill + */ + +if (typeof console === 'undefined') { + Object.defineProperty(this, 'console', { + value: {}, writable: true, enumerable: false, configurable: true + }); +} +if (typeof console.log === 'undefined') { + (function () { + var origPrint = print; // capture in closure in case changed later + Object.defineProperty(this.console, 'log', { + value: function () { + var strArgs = Array.prototype.map.call(arguments, function (v) { return String(v); }); + origPrint(Array.prototype.join.call(strArgs, ' ')); + }, writable: true, enumerable: false, configurable: true + }); + })(); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/duktape-isfastint.js b/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/duktape-isfastint.js new file mode 100644 index 00000000..dce2d9ed --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/duktape-isfastint.js @@ -0,0 +1,38 @@ +/* + * Helper to check if a number is internally represented as a fastint: + * + * if (Duktape.isFastint(x)) { + * print('fastint'); + * } else { + * print('not a fastint (or not a number)'); + * } + * + * NOTE: This helper depends on the internal tag numbering (defined in + * duk_tval.h) which is both version specific and depends on whether + * duk_tval is packed or not. + */ + +if (typeof Duktape === 'object') { + if (typeof Duktape.fastintTag === 'undefined') { + Object.defineProperty(Duktape, 'fastintTag', { + /* Tag number depends on duk_tval packing. */ + value: (Duktape.info(true)[1] === 0xfff4) ? + 0xfff1 /* tag for packed duk_tval */ : + 1 /* tag for unpacked duk_tval */, + writable: false, + enumerable: false, + configurable: true + }); + } + if (typeof Duktape.isFastint === 'undefined') { + Object.defineProperty(Duktape, 'isFastint', { + value: function (v) { + return Duktape.info(v)[0] === 4 && /* public type is DUK_TYPE_NUMBER */ + Duktape.info(v)[1] === Duktape.fastintTag; /* internal tag is fastint */ + }, + writable: false, + enumerable: false, + configurable: true + }); + } +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/object-assign.js b/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/object-assign.js new file mode 100644 index 00000000..dfa5a44d --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/object-assign.js @@ -0,0 +1,45 @@ +/* + * Object.assign(), described in E6 Section 19.1.2.1 + * + * http://www.ecma-international.org/ecma-262/6.0/index.html#sec-object.assign + */ + +if (typeof Object.assign === 'undefined') { + Object.defineProperty(Object, 'assign', { + value: function (target) { + var i, n, j, m, k; + var source, keys; + var gotError; + var pendingError; + + if (target == null) { + throw new Exception('target null or undefined'); + } + + for (i = 1, n = arguments.length; i < n; i++) { + source = arguments[i]; + if (source == null) { + continue; // null or undefined + } + source = Object(source); + keys = Object.keys(source); // enumerable own keys + + for (j = 0, m = keys.length; j < m; j++) { + k = keys[j]; + try { + target[k] = source[k]; + } catch (e) { + if (!gotError) { + gotError = true; + pendingError = e; + } + } + } + } + + if (gotError) { + throw pendingError; + } + }, writable: true, enumerable: false, configurable: true + }); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/object-prototype-definegetter.js b/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/object-prototype-definegetter.js new file mode 100644 index 00000000..8d8cabb3 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/object-prototype-definegetter.js @@ -0,0 +1,11 @@ +/* + * Object.prototype.__defineGetter__ polyfill + */ + +if (typeof Object.prototype.__defineGetter__ === 'undefined') { + Object.defineProperty(Object.prototype, '__defineGetter__', { + value: function (n, f) { + Object.defineProperty(this, n, { enumerable: true, configurable: true, get: f }); + }, writable: true, enumerable: false, configurable: true + }); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/object-prototype-definesetter.js b/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/object-prototype-definesetter.js new file mode 100644 index 00000000..6bd1722f --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/object-prototype-definesetter.js @@ -0,0 +1,11 @@ +/* + * Object.prototype.__defineSetter__ polyfill + */ + +if (typeof Object.prototype.__defineSetter__ === 'undefined') { + Object.defineProperty(Object.prototype, '__defineSetter__', { + value: function (n, f) { + Object.defineProperty(this, n, { enumerable: true, configurable: true, set: f }); + }, writable: true, enumerable: false, configurable: true + }); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/performance-now.js b/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/performance-now.js new file mode 100644 index 00000000..dfb0a1d6 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/polyfills/performance-now.js @@ -0,0 +1,25 @@ +/* + * Performance.now() polyfill + * + * http://www.w3.org/TR/hr-time/#sec-high-resolution-time + * + * Dummy implementation which uses the Date built-in and has no higher + * resolution. If/when Duktape has a built-in high resolution timer + * interface, reimplement this. + */ + +var _perfNowZeroTime = Date.now(); + +if (typeof Performance === 'undefined') { + Object.defineProperty(this, 'Performance', { + value: {}, + writable: true, enumerable: false, configurable: true + }); +} +if (typeof Performance.now === 'undefined') { + Object.defineProperty(Performance, 'now', { + value: function () { + return Date.now() - _perfNowZeroTime; + }, writable: true, enumerable: false, configurable: true + }); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_alloc_default.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_alloc_default.c new file mode 100644 index 00000000..970d828e --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_alloc_default.c @@ -0,0 +1,32 @@ +/* + * Default allocation functions. + * + * Assumes behavior such as malloc allowing zero size, yielding + * a NULL or a unique pointer which is a no-op for free. + */ + +#include "duk_internal.h" + +DUK_INTERNAL void *duk_default_alloc_function(void *udata, duk_size_t size) { + void *res; + DUK_UNREF(udata); + res = DUK_ANSI_MALLOC(size); + DUK_DDD(DUK_DDDPRINT("default alloc function: %lu -> %p", + (unsigned long) size, (void *) res)); + return res; +} + +DUK_INTERNAL void *duk_default_realloc_function(void *udata, void *ptr, duk_size_t newsize) { + void *res; + DUK_UNREF(udata); + res = DUK_ANSI_REALLOC(ptr, newsize); + DUK_DDD(DUK_DDDPRINT("default realloc function: %p %lu -> %p", + (void *) ptr, (unsigned long) newsize, (void *) res)); + return res; +} + +DUK_INTERNAL void duk_default_free_function(void *udata, void *ptr) { + DUK_DDD(DUK_DDDPRINT("default free function: %p", (void *) ptr)); + DUK_UNREF(udata); + DUK_ANSI_FREE(ptr); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_buffer.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_buffer.c new file mode 100644 index 00000000..98838d2d --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_buffer.c @@ -0,0 +1,73 @@ +/* + * Buffer + */ + +#include "duk_internal.h" + +DUK_EXTERNAL void *duk_resize_buffer(duk_context *ctx, duk_idx_t index, duk_size_t new_size) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hbuffer_dynamic *h; + + DUK_ASSERT_CTX_VALID(ctx); + + h = (duk_hbuffer_dynamic *) duk_require_hbuffer(ctx, index); + DUK_ASSERT(h != NULL); + + if (!(DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h))) { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_WRONG_BUFFER_TYPE); + } + + /* maximum size check is handled by callee */ + duk_hbuffer_resize(thr, h, new_size); + + return DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h); +} + +DUK_EXTERNAL void *duk_steal_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hbuffer_dynamic *h; + void *ptr; + duk_size_t sz; + + DUK_ASSERT(ctx != NULL); + + h = (duk_hbuffer_dynamic *) duk_require_hbuffer(ctx, index); + DUK_ASSERT(h != NULL); + + if (!(DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h))) { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_WRONG_BUFFER_TYPE); + } + + /* Forget the previous allocation, setting size to 0 and alloc to + * NULL. Caller is responsible for freeing the previous allocation. + * Getting the allocation and clearing it is done in the same API + * call to avoid any chance of a realloc. + */ + ptr = DUK_HBUFFER_DYNAMIC_GET_DATA_PTR(thr->heap, h); + sz = DUK_HBUFFER_DYNAMIC_GET_SIZE(h); + if (out_size) { + *out_size = sz; + } + DUK_HBUFFER_DYNAMIC_SET_DATA_PTR_NULL(thr->heap, h); + DUK_HBUFFER_DYNAMIC_SET_SIZE(h, 0); + + return ptr; +} + +DUK_EXTERNAL void duk_config_buffer(duk_context *ctx, duk_idx_t index, void *ptr, duk_size_t len) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hbuffer_external *h; + + DUK_ASSERT(ctx != NULL); + + h = (duk_hbuffer_external *) duk_require_hbuffer(ctx, index); + DUK_ASSERT(h != NULL); + + if (!DUK_HBUFFER_HAS_EXTERNAL(h)) { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_WRONG_BUFFER_TYPE); + } + DUK_ASSERT(DUK_HBUFFER_HAS_DYNAMIC(h)); + + DUK_HBUFFER_EXTERNAL_SET_DATA_PTR(thr->heap, h, ptr); + DUK_HBUFFER_EXTERNAL_SET_SIZE(h, len); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_bytecode.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_bytecode.c new file mode 100644 index 00000000..f1bf13d2 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_bytecode.c @@ -0,0 +1,727 @@ +/* + * Bytecode dump/load + * + * The bytecode load primitive is more important performance-wise than the + * dump primitive. + * + * Unlike most Duktape API calls, bytecode dump/load is not guaranteed to be + * memory safe for invalid arguments - caller beware! There's little point + * in trying to achieve memory safety unless bytecode instructions are also + * validated which is not easy to do with indirect register references etc. + */ + +#include "duk_internal.h" + +#if defined(DUK_USE_BYTECODE_DUMP_SUPPORT) + +#define DUK__SER_MARKER 0xff +#define DUK__SER_VERSION 0x00 +#define DUK__SER_STRING 0x00 +#define DUK__SER_NUMBER 0x01 +#define DUK__BYTECODE_INITIAL_ALLOC 256 + +/* + * Dump/load helpers, xxx_raw() helpers do no buffer checks + */ + +DUK_LOCAL duk_uint8_t *duk__load_string_raw(duk_context *ctx, duk_uint8_t *p) { + duk_uint32_t len; + + len = DUK_RAW_READ_U32_BE(p); + duk_push_lstring(ctx, (const char *) p, len); + p += len; + return p; +} + +DUK_LOCAL duk_uint8_t *duk__load_buffer_raw(duk_context *ctx, duk_uint8_t *p) { + duk_uint32_t len; + duk_uint8_t *buf; + + len = DUK_RAW_READ_U32_BE(p); + buf = (duk_uint8_t *) duk_push_fixed_buffer(ctx, (duk_size_t) len); + DUK_ASSERT(buf != NULL); + DUK_MEMCPY((void *) buf, (const void *) p, (size_t) len); + p += len; + return p; +} + +DUK_LOCAL duk_uint8_t *duk__dump_hstring_raw(duk_uint8_t *p, duk_hstring *h) { + duk_size_t len; + duk_uint32_t tmp32; + + DUK_ASSERT(h != NULL); + + len = DUK_HSTRING_GET_BYTELEN(h); + DUK_ASSERT(len <= 0xffffffffUL); /* string limits */ + tmp32 = (duk_uint32_t) len; + DUK_RAW_WRITE_U32_BE(p, tmp32); + DUK_MEMCPY((void *) p, + (const void *) DUK_HSTRING_GET_DATA(h), + len); + p += len; + return p; +} + +DUK_LOCAL duk_uint8_t *duk__dump_hbuffer_raw(duk_hthread *thr, duk_uint8_t *p, duk_hbuffer *h) { + duk_size_t len; + duk_uint32_t tmp32; + + DUK_ASSERT(thr != NULL); + DUK_ASSERT(h != NULL); + DUK_UNREF(thr); + + len = DUK_HBUFFER_GET_SIZE(h); + DUK_ASSERT(len <= 0xffffffffUL); /* buffer limits */ + tmp32 = (duk_uint32_t) len; + DUK_RAW_WRITE_U32_BE(p, tmp32); + DUK_MEMCPY((void *) p, + (const void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h), + len); + p += len; + return p; +} + +DUK_LOCAL duk_uint8_t *duk__dump_string_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx) { + duk_hstring *h_str; + duk_tval *tv; + + tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx)); + if (tv != NULL && DUK_TVAL_IS_STRING(tv)) { + h_str = DUK_TVAL_GET_STRING(tv); + DUK_ASSERT(h_str != NULL); + } else { + h_str = DUK_HTHREAD_STRING_EMPTY_STRING(thr); + DUK_ASSERT(h_str != NULL); + } + DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ + p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4 + DUK_HSTRING_GET_BYTELEN(h_str), p); + p = duk__dump_hstring_raw(p, h_str); + return p; +} + +DUK_LOCAL duk_uint8_t *duk__dump_buffer_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx) { + duk_tval *tv; + + tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx)); + if (tv != NULL && DUK_TVAL_IS_BUFFER(tv)) { + duk_hbuffer *h_buf; + h_buf = DUK_TVAL_GET_BUFFER(tv); + DUK_ASSERT(h_buf != NULL); + DUK_ASSERT(DUK_HBUFFER_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ + p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4 + DUK_HBUFFER_GET_SIZE(h_buf), p); + p = duk__dump_hbuffer_raw(thr, p, h_buf); + } else { + p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4, p); + DUK_RAW_WRITE_U32_BE(p, 0); + } + return p; +} + +DUK_LOCAL duk_uint8_t *duk__dump_uint32_prop(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func, duk_small_uint_t stridx, duk_uint32_t def_value) { + duk_tval *tv; + duk_uint32_t val; + + tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_GET_STRING(thr, stridx)); + if (tv != NULL && DUK_TVAL_IS_NUMBER(tv)) { + val = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv); + } else { + val = def_value; + } + p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4, p); + DUK_RAW_WRITE_U32_BE(p, val); + return p; +} + +DUK_LOCAL duk_uint8_t *duk__dump_varmap(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func) { + duk_tval *tv; + + tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_STRING_INT_VARMAP(thr)); + if (tv != NULL && DUK_TVAL_IS_OBJECT(tv)) { + duk_hobject *h; + duk_uint_fast32_t i; + + h = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h != NULL); + + /* We know _Varmap only has own properties so walk property + * table directly. We also know _Varmap is dense and all + * values are numbers; assert for these. GC and finalizers + * shouldn't affect _Varmap so side effects should be fine. + */ + for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(h); i++) { + duk_hstring *key; + duk_tval *tv_val; + duk_uint32_t val; + + key = DUK_HOBJECT_E_GET_KEY(thr->heap, h, i); + DUK_ASSERT(key != NULL); /* _Varmap is dense */ + DUK_ASSERT(!DUK_HOBJECT_E_SLOT_IS_ACCESSOR(thr->heap, h, i)); + tv_val = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(thr->heap, h, i); + DUK_ASSERT(tv_val != NULL); + DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv_val)); /* known to be number; in fact an integer */ +#if defined(DUK_USE_FASTINT) + DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv_val)); + DUK_ASSERT(DUK_TVAL_GET_FASTINT(tv_val) == (duk_int64_t) DUK_TVAL_GET_FASTINT_U32(tv_val)); /* known to be 32-bit */ + val = DUK_TVAL_GET_FASTINT_U32(tv_val); +#else + val = (duk_uint32_t) DUK_TVAL_GET_NUMBER(tv_val); +#endif + + DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ + p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4 + DUK_HSTRING_GET_BYTELEN(key) + 4, p); + p = duk__dump_hstring_raw(p, key); + DUK_RAW_WRITE_U32_BE(p, val); + } + } + p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4, p); + DUK_RAW_WRITE_U32_BE(p, 0); /* end of _Varmap */ + return p; +} + +DUK_LOCAL duk_uint8_t *duk__dump_formals(duk_hthread *thr, duk_uint8_t *p, duk_bufwriter_ctx *bw_ctx, duk_hobject *func) { + duk_tval *tv; + + tv = duk_hobject_find_existing_entry_tval_ptr(thr->heap, (duk_hobject *) func, DUK_HTHREAD_STRING_INT_FORMALS(thr)); + if (tv != NULL && DUK_TVAL_IS_OBJECT(tv)) { + duk_hobject *h; + duk_uint_fast32_t i; + + h = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h != NULL); + + /* We know _Formals is dense and all entries will be in the + * array part. GC and finalizers shouldn't affect _Formals + * so side effects should be fine. + */ + for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(h); i++) { + duk_tval *tv_val; + duk_hstring *varname; + + tv_val = DUK_HOBJECT_A_GET_VALUE_PTR(thr->heap, h, i); + DUK_ASSERT(tv_val != NULL); + if (DUK_TVAL_IS_STRING(tv_val)) { + /* Array is dense and contains only strings, but ASIZE may + * be larger than used part and there are UNUSED entries. + */ + varname = DUK_TVAL_GET_STRING(tv_val); + DUK_ASSERT(varname != NULL); + + DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ + p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4 + DUK_HSTRING_GET_BYTELEN(varname), p); + p = duk__dump_hstring_raw(p, varname); + } + } + } + p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 4, p); + DUK_RAW_WRITE_U32_BE(p, 0); /* end of _Formals */ + return p; +} + +static duk_uint8_t *duk__dump_func(duk_context *ctx, duk_hcompiledfunction *func, duk_bufwriter_ctx *bw_ctx, duk_uint8_t *p) { + duk_hthread *thr; + duk_tval *tv, *tv_end; + duk_instr_t *ins, *ins_end; + duk_hobject **fn, **fn_end; + duk_hstring *h_str; + duk_uint32_t count_instr; + duk_uint32_t tmp32; + duk_uint16_t tmp16; + duk_double_t d; + + thr = (duk_hthread *) ctx; + DUK_UNREF(ctx); + DUK_UNREF(thr); + + DUK_DD(DUK_DDPRINT("dumping function %p to %p: " + "consts=[%p,%p[ (%ld bytes, %ld items), " + "funcs=[%p,%p[ (%ld bytes, %ld items), " + "code=[%p,%p[ (%ld bytes, %ld items)", + (void *) func, + (void *) p, + (void *) DUK_HCOMPILEDFUNCTION_GET_CONSTS_BASE(thr->heap, func), + (void *) DUK_HCOMPILEDFUNCTION_GET_CONSTS_END(thr->heap, func), + (long) DUK_HCOMPILEDFUNCTION_GET_CONSTS_SIZE(thr->heap, func), + (long) DUK_HCOMPILEDFUNCTION_GET_CONSTS_COUNT(thr->heap, func), + (void *) DUK_HCOMPILEDFUNCTION_GET_FUNCS_BASE(thr->heap, func), + (void *) DUK_HCOMPILEDFUNCTION_GET_FUNCS_END(thr->heap, func), + (long) DUK_HCOMPILEDFUNCTION_GET_FUNCS_SIZE(thr->heap, func), + (long) DUK_HCOMPILEDFUNCTION_GET_FUNCS_COUNT(thr->heap, func), + (void *) DUK_HCOMPILEDFUNCTION_GET_CODE_BASE(thr->heap, func), + (void *) DUK_HCOMPILEDFUNCTION_GET_CODE_END(thr->heap, func), + (long) DUK_HCOMPILEDFUNCTION_GET_CODE_SIZE(thr->heap, func), + (long) DUK_HCOMPILEDFUNCTION_GET_CODE_COUNT(thr->heap, func))); + + DUK_ASSERT(DUK_USE_ESBC_MAX_BYTES <= 0x7fffffffUL); /* ensures no overflow */ + count_instr = (duk_uint32_t) DUK_HCOMPILEDFUNCTION_GET_CODE_COUNT(thr->heap, func); + p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 3 * 4 + 2 * 2 + 3 * 4 + count_instr * 4, p); + + /* Fixed header info. */ + tmp32 = count_instr; + DUK_RAW_WRITE_U32_BE(p, tmp32); + tmp32 = (duk_uint32_t) DUK_HCOMPILEDFUNCTION_GET_CONSTS_COUNT(thr->heap, func); + DUK_RAW_WRITE_U32_BE(p, tmp32); + tmp32 = (duk_uint32_t) DUK_HCOMPILEDFUNCTION_GET_FUNCS_COUNT(thr->heap, func); + DUK_RAW_WRITE_U32_BE(p, tmp32); + tmp16 = func->nregs; + DUK_RAW_WRITE_U16_BE(p, tmp16); + tmp16 = func->nargs; + DUK_RAW_WRITE_U16_BE(p, tmp16); +#if defined(DUK_USE_DEBUGGER_SUPPORT) + tmp32 = func->start_line; + DUK_RAW_WRITE_U32_BE(p, tmp32); + tmp32 = func->end_line; + DUK_RAW_WRITE_U32_BE(p, tmp32); +#else + DUK_RAW_WRITE_U32_BE(p, 0); + DUK_RAW_WRITE_U32_BE(p, 0); +#endif + tmp32 = ((duk_heaphdr *) func)->h_flags & DUK_HEAPHDR_FLAGS_FLAG_MASK; + DUK_RAW_WRITE_U32_BE(p, tmp32); + + /* Bytecode instructions: endian conversion needed unless + * platform is big endian. + */ + ins = DUK_HCOMPILEDFUNCTION_GET_CODE_BASE(thr->heap, func); + ins_end = DUK_HCOMPILEDFUNCTION_GET_CODE_END(thr->heap, func); + DUK_ASSERT((duk_size_t) (ins_end - ins) == (duk_size_t) count_instr); +#if defined(DUK_USE_INTEGER_BE) + DUK_MEMCPY((void *) p, (const void *) ins, (size_t) (ins_end - ins)); + p += (size_t) (ins_end - ins); +#else + while (ins != ins_end) { + tmp32 = (duk_uint32_t) (*ins); + DUK_RAW_WRITE_U32_BE(p, tmp32); + ins++; + } +#endif + + /* Constants: variable size encoding. */ + tv = DUK_HCOMPILEDFUNCTION_GET_CONSTS_BASE(thr->heap, func); + tv_end = DUK_HCOMPILEDFUNCTION_GET_CONSTS_END(thr->heap, func); + while (tv != tv_end) { + /* constants are strings or numbers now */ + DUK_ASSERT(DUK_TVAL_IS_STRING(tv) || + DUK_TVAL_IS_NUMBER(tv)); + + if (DUK_TVAL_IS_STRING(tv)) { + h_str = DUK_TVAL_GET_STRING(tv); + DUK_ASSERT(h_str != NULL); + DUK_ASSERT(DUK_HSTRING_MAX_BYTELEN <= 0x7fffffffUL); /* ensures no overflow */ + p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 1 + 4 + DUK_HSTRING_GET_BYTELEN(h_str), p), + *p++ = DUK__SER_STRING; + p = duk__dump_hstring_raw(p, h_str); + } else { + DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); + p = DUK_BW_ENSURE_RAW(thr, bw_ctx, 1 + 8, p); + *p++ = DUK__SER_NUMBER; + d = DUK_TVAL_GET_NUMBER(tv); + DUK_RAW_WRITE_DOUBLE_BE(p, d); + } + tv++; + } + + /* Inner functions recursively. */ + fn = (duk_hobject **) DUK_HCOMPILEDFUNCTION_GET_FUNCS_BASE(thr->heap, func); + fn_end = (duk_hobject **) DUK_HCOMPILEDFUNCTION_GET_FUNCS_END(thr->heap, func); + while (fn != fn_end) { + /* XXX: This causes recursion up to inner function depth + * which is normally not an issue, e.g. mark-and-sweep uses + * a recursion limiter to avoid C stack issues. Avoiding + * this would mean some sort of a work list or just refusing + * to serialize deep functions. + */ + DUK_ASSERT(DUK_HOBJECT_IS_COMPILEDFUNCTION(*fn)); + p = duk__dump_func(ctx, (duk_hcompiledfunction *) *fn, bw_ctx, p); + fn++; + } + + /* Object extra properties. + * + * There are some difference between function templates and functions. + * For example, function templates don't have .length and nargs is + * normally used to instantiate the functions. + */ + + p = duk__dump_uint32_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_LENGTH, (duk_uint32_t) func->nargs); + p = duk__dump_string_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_NAME); + p = duk__dump_string_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_FILE_NAME); + p = duk__dump_buffer_prop(thr, p, bw_ctx, (duk_hobject *) func, DUK_STRIDX_INT_PC2LINE); + p = duk__dump_varmap(thr, p, bw_ctx, (duk_hobject *) func); + p = duk__dump_formals(thr, p, bw_ctx, (duk_hobject *) func); + + DUK_DD(DUK_DDPRINT("serialized function %p -> final pointer %p", (void *) func, (void *) p)); + + return p; +} + +/* Load a function from bytecode. The function object returned here must + * match what is created by duk_js_push_closure() with respect to its flags, + * properties, etc. + * + * NOTE: there are intentionally no input buffer length / bound checks. + * Adding them would be easy but wouldn't ensure memory safety as untrusted + * or broken bytecode is unsafe during execution unless the opcodes themselves + * are validated (which is quite complex, especially for indirect opcodes). + */ + +#define DUK__ASSERT_LEFT(n) do { \ + DUK_ASSERT((duk_size_t) (p_end - p) >= (duk_size_t) (n)); \ + } while (0) + +static duk_uint8_t *duk__load_func(duk_context *ctx, duk_uint8_t *p, duk_uint8_t *p_end) { + duk_hthread *thr; + duk_hcompiledfunction *h_fun; + duk_hbuffer *h_data; + duk_size_t data_size; + duk_uint32_t count_instr, count_const, count_funcs; + duk_uint32_t n; + duk_uint32_t tmp32; + duk_small_uint_t const_type; + duk_uint8_t *fun_data; + duk_uint8_t *q; + duk_idx_t idx_base; + duk_tval *tv1; + duk_uarridx_t arr_idx; + + /* XXX: There's some overlap with duk_js_closure() here, but + * seems difficult to share code. Ensure that the final function + * looks the same as created by duk_js_closure(). + */ + + DUK_ASSERT(ctx != NULL); + thr = (duk_hthread *) ctx; + + DUK_DD(DUK_DDPRINT("loading function, p=%p, p_end=%p", (void *) p, (void *) p_end)); + + DUK__ASSERT_LEFT(3 * 4); + count_instr = DUK_RAW_READ_U32_BE(p); + count_const = DUK_RAW_READ_U32_BE(p); + count_funcs = DUK_RAW_READ_U32_BE(p); + + data_size = sizeof(duk_tval) * count_const + + sizeof(duk_hobject *) * count_funcs + + sizeof(duk_instr_t) * count_instr; + + DUK_DD(DUK_DDPRINT("instr=%ld, const=%ld, funcs=%ld, data_size=%ld", + (long) count_instr, (long) count_const, + (long) count_const, (long) data_size)); + + /* Value stack is used to ensure reachability of constants and + * inner functions being loaded. Require enough space to handle + * large functions correctly. + */ + duk_require_stack(ctx, 2 + count_const + count_funcs); + idx_base = duk_get_top(ctx); + + /* Push function object, init flags etc. This must match + * duk_js_push_closure() quite carefully. + */ + duk_push_compiledfunction(ctx); + h_fun = duk_get_hcompiledfunction(ctx, -1); + DUK_ASSERT(h_fun != NULL); + DUK_ASSERT(DUK_HOBJECT_IS_COMPILEDFUNCTION((duk_hobject *) h_fun)); + DUK_ASSERT(DUK_HCOMPILEDFUNCTION_GET_DATA(thr->heap, h_fun) == NULL); + DUK_ASSERT(DUK_HCOMPILEDFUNCTION_GET_FUNCS(thr->heap, h_fun) == NULL); + DUK_ASSERT(DUK_HCOMPILEDFUNCTION_GET_BYTECODE(thr->heap, h_fun) == NULL); + + h_fun->nregs = DUK_RAW_READ_U16_BE(p); + h_fun->nargs = DUK_RAW_READ_U16_BE(p); +#if defined(DUK_USE_DEBUGGER_SUPPORT) + h_fun->start_line = DUK_RAW_READ_U32_BE(p); + h_fun->end_line = DUK_RAW_READ_U32_BE(p); +#else + p += 8; /* skip line info */ +#endif + + /* duk_hcompiledfunction flags; quite version specific */ + tmp32 = DUK_RAW_READ_U32_BE(p); + DUK_HEAPHDR_SET_FLAGS((duk_heaphdr *) h_fun, tmp32); + + /* standard prototype */ + DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, &h_fun->obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); + + /* assert just a few critical flags */ + DUK_ASSERT(DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) h_fun) == DUK_HTYPE_OBJECT); + DUK_ASSERT(!DUK_HOBJECT_HAS_BOUND(&h_fun->obj)); + DUK_ASSERT(DUK_HOBJECT_HAS_COMPILEDFUNCTION(&h_fun->obj)); + DUK_ASSERT(!DUK_HOBJECT_HAS_NATIVEFUNCTION(&h_fun->obj)); + DUK_ASSERT(!DUK_HOBJECT_HAS_THREAD(&h_fun->obj)); + DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARRAY(&h_fun->obj)); + DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_STRINGOBJ(&h_fun->obj)); + DUK_ASSERT(!DUK_HOBJECT_HAS_EXOTIC_ARGUMENTS(&h_fun->obj)); + + /* Create function 'data' buffer but don't attach it yet. */ + fun_data = (duk_uint8_t *) duk_push_fixed_buffer(ctx, data_size); + DUK_ASSERT(fun_data != NULL); + + /* Load bytecode instructions. */ + DUK_ASSERT(sizeof(duk_instr_t) == 4); + DUK__ASSERT_LEFT(count_instr * sizeof(duk_instr_t)); +#if defined(DUK_USE_INTEGER_BE) + q = fun_data + sizeof(duk_tval) * count_const + sizeof(duk_hobject *) * count_funcs; + DUK_MEMCPY((void *) q, + (const void *) p, + sizeof(duk_instr_t) * count_instr); + p += sizeof(duk_instr_t) * count_instr; +#else + q = fun_data + sizeof(duk_tval) * count_const + sizeof(duk_hobject *) * count_funcs; + for (n = count_instr; n > 0; n--) { + *((duk_instr_t *) (void *) q) = DUK_RAW_READ_U32_BE(p); + q += sizeof(duk_instr_t); + } +#endif + + /* Load constants onto value stack but don't yet copy to buffer. */ + for (n = count_const; n > 0; n--) { + DUK__ASSERT_LEFT(1); + const_type = DUK_RAW_READ_U8(p); + switch (const_type) { + case DUK__SER_STRING: { + p = duk__load_string_raw(ctx, p); + break; + } + case DUK__SER_NUMBER: { + /* Important to do a fastint check so that constants are + * properly read back as fastints. + */ + duk_tval tv_tmp; + duk_double_t val; + DUK__ASSERT_LEFT(8); + val = DUK_RAW_READ_DOUBLE_BE(p); + DUK_TVAL_SET_NUMBER_CHKFAST(&tv_tmp, val); + duk_push_tval(ctx, &tv_tmp); + break; + } + default: { + goto format_error; + } + } + } + + /* Load inner functions to value stack, but don't yet copy to buffer. */ + for (n = count_funcs; n > 0; n--) { + p = duk__load_func(ctx, p, p_end); + if (p == NULL) { + goto format_error; + } + } + + /* With constants and inner functions on value stack, we can now + * atomically finish the function 'data' buffer, bump refcounts, + * etc. + * + * Here we take advantage of the value stack being just a duk_tval + * array: we can just memcpy() the constants as long as we incref + * them afterwards. + */ + + h_data = (duk_hbuffer *) duk_get_hbuffer(ctx, idx_base + 1); + DUK_ASSERT(h_data != NULL); + DUK_ASSERT(!DUK_HBUFFER_HAS_DYNAMIC(h_data)); + DUK_HCOMPILEDFUNCTION_SET_DATA(thr->heap, h_fun, h_data); + DUK_HBUFFER_INCREF(thr, h_data); + + tv1 = duk_get_tval(ctx, idx_base + 2); /* may be NULL if no constants or inner funcs */ + DUK_ASSERT((count_const == 0 && count_funcs == 0) || tv1 != NULL); + + q = fun_data; + if (count_const > 0) { + /* Explicit zero size check to avoid NULL 'tv1'. */ + DUK_MEMCPY((void *) q, (const void *) tv1, sizeof(duk_tval) * count_const); + for (n = count_const; n > 0; n--) { + DUK_TVAL_INCREF_FAST(thr, (duk_tval *) (void *) q); /* no side effects */ + q += sizeof(duk_tval); + } + tv1 += count_const; + } + + DUK_HCOMPILEDFUNCTION_SET_FUNCS(thr->heap, h_fun, (duk_hobject **) (void *) q); + for (n = count_funcs; n > 0; n--) { + duk_hobject *h_obj; + + DUK_ASSERT(DUK_TVAL_IS_OBJECT(tv1)); + h_obj = DUK_TVAL_GET_OBJECT(tv1); + DUK_ASSERT(h_obj != NULL); + tv1++; + DUK_HOBJECT_INCREF(thr, h_obj); + + *((duk_hobject **) (void *) q) = h_obj; + q += sizeof(duk_hobject *); + } + + DUK_HCOMPILEDFUNCTION_SET_BYTECODE(thr->heap, h_fun, (duk_instr_t *) (void *) q); + + /* The function object is now reachable and refcounts are fine, + * so we can pop off all the temporaries. + */ + DUK_DDD(DUK_DDDPRINT("function is reachable, reset top; func: %!iT", duk_get_tval(ctx, idx_base))); + duk_set_top(ctx, idx_base + 1); + + /* Setup function properties. */ + tmp32 = DUK_RAW_READ_U32_BE(p); + duk_push_u32(ctx, tmp32); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_NONE); + + p = duk__load_string_raw(ctx, p); + if (DUK_HOBJECT_HAS_NAMEBINDING((duk_hobject *) h_fun)) { + /* Original function instance/template had NAMEBINDING. + * Must create a lexical environment on loading to allow + * recursive functions like 'function foo() { foo(); }'. + */ + duk_hobject *proto; + + proto = thr->builtins[DUK_BIDX_GLOBAL_ENV]; + (void) duk_push_object_helper_proto(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV), + proto); + duk_dup(ctx, -2); /* -> [ func funcname env funcname ] */ + duk_dup(ctx, idx_base); /* -> [ func funcname env funcname func ] */ + duk_xdef_prop(ctx, -3, DUK_PROPDESC_FLAGS_NONE); /* -> [ func funcname env ] */ + duk_xdef_prop_stridx(ctx, idx_base, DUK_STRIDX_INT_LEXENV, DUK_PROPDESC_FLAGS_WC); + /* since closure has NEWENV, never define DUK_STRIDX_INT_VARENV, as it + * will be ignored anyway + */ + } + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_NONE); + + p = duk__load_string_raw(ctx, p); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_WC); + + duk_push_object(ctx); + duk_dup(ctx, -2); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_CONSTRUCTOR, DUK_PROPDESC_FLAGS_WC); /* func.prototype.constructor = func */ + duk_compact(ctx, -1); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_PROTOTYPE, DUK_PROPDESC_FLAGS_W); + + p = duk__load_buffer_raw(ctx, p); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_INT_PC2LINE, DUK_PROPDESC_FLAGS_WC); + + duk_push_object(ctx); /* _Varmap */ + for (;;) { + /* XXX: awkward */ + p = duk__load_string_raw(ctx, p); + if (duk_get_length(ctx, -1) == 0) { + duk_pop(ctx); + break; + } + tmp32 = DUK_RAW_READ_U32_BE(p); + duk_push_u32(ctx, tmp32); + duk_put_prop(ctx, -3); + } + duk_compact(ctx, -1); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_INT_VARMAP, DUK_PROPDESC_FLAGS_NONE); + + duk_push_array(ctx); /* _Formals */ + for (arr_idx = 0; ; arr_idx++) { + /* XXX: awkward */ + p = duk__load_string_raw(ctx, p); + if (duk_get_length(ctx, -1) == 0) { + duk_pop(ctx); + break; + } + duk_put_prop_index(ctx, -2, arr_idx); + } + duk_compact(ctx, -1); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_INT_FORMALS, DUK_PROPDESC_FLAGS_NONE); + + /* Return with final function pushed on stack top. */ + DUK_DD(DUK_DDPRINT("final loaded function: %!iT", duk_get_tval(ctx, -1))); + DUK_ASSERT_TOP(ctx, idx_base + 1); + return p; + + format_error: + return NULL; +} + +DUK_EXTERNAL void duk_dump_function(duk_context *ctx) { + duk_hthread *thr; + duk_hcompiledfunction *func; + duk_bufwriter_ctx bw_ctx_alloc; + duk_bufwriter_ctx *bw_ctx = &bw_ctx_alloc; + duk_uint8_t *p; + + DUK_ASSERT(ctx != NULL); + thr = (duk_hthread *) ctx; + + /* Bound functions don't have all properties so we'd either need to + * lookup the non-bound target function or reject bound functions. + * For now, bound functions are rejected. + */ + func = duk_require_hcompiledfunction(ctx, -1); + DUK_ASSERT(func != NULL); + DUK_ASSERT(!DUK_HOBJECT_HAS_BOUND(&func->obj)); + + /* Estimating the result size beforehand would be costly, so + * start with a reasonable size and extend as needed. + */ + DUK_BW_INIT_PUSHBUF(thr, bw_ctx, DUK__BYTECODE_INITIAL_ALLOC); + p = DUK_BW_GET_PTR(thr, bw_ctx); + *p++ = DUK__SER_MARKER; + *p++ = DUK__SER_VERSION; + p = duk__dump_func(ctx, func, bw_ctx, p); + DUK_BW_SET_PTR(thr, bw_ctx, p); + DUK_BW_COMPACT(thr, bw_ctx); + + DUK_DD(DUK_DDPRINT("serialized result: %!T", duk_get_tval(ctx, -1))); + + duk_remove(ctx, -2); /* [ ... func buf ] -> [ ... buf ] */ +} + +DUK_EXTERNAL void duk_load_function(duk_context *ctx) { + duk_hthread *thr; + duk_uint8_t *p_buf, *p, *p_end; + duk_size_t sz; + + DUK_ASSERT(ctx != NULL); + thr = (duk_hthread *) ctx; + DUK_UNREF(ctx); + + p_buf = (duk_uint8_t *) duk_require_buffer(ctx, -1, &sz); + DUK_ASSERT(p_buf != NULL); + + /* The caller is responsible for being sure that bytecode being loaded + * is valid and trusted. Invalid bytecode can cause memory unsafe + * behavior directly during loading or later during bytecode execution + * (instruction validation would be quite complex to implement). + * + * This signature check is the only sanity check for detecting + * accidental invalid inputs. The initial 0xFF byte ensures no + * ordinary string will be accepted by accident. + */ + p = p_buf; + p_end = p_buf + sz; + if (sz < 2 || p[0] != DUK__SER_MARKER || p[1] != DUK__SER_VERSION) { + goto format_error; + } + p += 2; + + p = duk__load_func(ctx, p, p_end); + if (p == NULL) { + goto format_error; + } + + duk_remove(ctx, -2); /* [ ... buf func ] -> [ ... func ] */ + return; + + format_error: + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_DECODE_FAILED); +} + +#undef DUK__SER_MARKER +#undef DUK__SER_VERSION +#undef DUK__SER_STRING +#undef DUK__SER_NUMBER +#undef DUK__BYTECODE_INITIAL_ALLOC + +#else /* DUK_USE_BYTECODE_DUMP_SUPPORT */ + +DUK_EXTERNAL void duk_dump_function(duk_context *ctx) { + DUK_ERROR((duk_hthread *) ctx, DUK_ERR_ERROR, DUK_STR_UNSUPPORTED); +} + +DUK_EXTERNAL void duk_load_function(duk_context *ctx) { + DUK_ERROR((duk_hthread *) ctx, DUK_ERR_ERROR, DUK_STR_UNSUPPORTED); +} + +#endif /* DUK_USE_BYTECODE_DUMP_SUPPORT */ diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_call.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_call.c new file mode 100644 index 00000000..a33fd54b --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_call.c @@ -0,0 +1,542 @@ +/* + * Calls. + * + * Protected variants should avoid ever throwing an error. + */ + +#include "duk_internal.h" + +/* Prepare value stack for a method call through an object property. + * May currently throw an error e.g. when getting the property. + */ +DUK_LOCAL void duk__call_prop_prep_stack(duk_context *ctx, duk_idx_t normalized_obj_index, duk_idx_t nargs) { + DUK_ASSERT_CTX_VALID(ctx); + + DUK_DDD(DUK_DDDPRINT("duk__call_prop_prep_stack, normalized_obj_index=%ld, nargs=%ld, stacktop=%ld", + (long) normalized_obj_index, (long) nargs, (long) duk_get_top(ctx))); + + /* [... key arg1 ... argN] */ + + /* duplicate key */ + duk_dup(ctx, -nargs - 1); /* Note: -nargs alone would fail for nargs == 0, this is OK */ + duk_get_prop(ctx, normalized_obj_index); + + DUK_DDD(DUK_DDDPRINT("func: %!T", (duk_tval *) duk_get_tval(ctx, -1))); + + /* [... key arg1 ... argN func] */ + + duk_replace(ctx, -nargs - 2); + + /* [... func arg1 ... argN] */ + + duk_dup(ctx, normalized_obj_index); + duk_insert(ctx, -nargs - 1); + + /* [... func this arg1 ... argN] */ +} + +DUK_EXTERNAL void duk_call(duk_context *ctx, duk_idx_t nargs) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_small_uint_t call_flags; + duk_idx_t idx_func; + duk_int_t rc; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + + idx_func = duk_get_top(ctx) - nargs - 1; + if (idx_func < 0 || nargs < 0) { + /* note that we can't reliably pop anything here */ + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_CALL_ARGS); + } + + /* XXX: awkward; we assume there is space for this, overwrite + * directly instead? + */ + duk_push_undefined(ctx); + duk_insert(ctx, idx_func + 1); + + call_flags = 0; /* not protected, respect reclimit, not constructor */ + + rc = duk_handle_call(thr, /* thread */ + nargs, /* num_stack_args */ + call_flags); /* call_flags */ + DUK_UNREF(rc); +} + +DUK_EXTERNAL void duk_call_method(duk_context *ctx, duk_idx_t nargs) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_small_uint_t call_flags; + duk_idx_t idx_func; + duk_int_t rc; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + + idx_func = duk_get_top(ctx) - nargs - 2; /* must work for nargs <= 0 */ + if (idx_func < 0 || nargs < 0) { + /* note that we can't reliably pop anything here */ + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_CALL_ARGS); + } + + call_flags = 0; /* not protected, respect reclimit, not constructor */ + + rc = duk_handle_call(thr, /* thread */ + nargs, /* num_stack_args */ + call_flags); /* call_flags */ + DUK_UNREF(rc); +} + +DUK_EXTERNAL void duk_call_prop(duk_context *ctx, duk_idx_t obj_index, duk_idx_t nargs) { + /* + * XXX: if duk_handle_call() took values through indices, this could be + * made much more sensible. However, duk_handle_call() needs to fudge + * the 'this' and 'func' values to handle bound function chains, which + * is now done "in-place", so this is not a trivial change. + */ + + DUK_ASSERT_CTX_VALID(ctx); + + obj_index = duk_require_normalize_index(ctx, obj_index); /* make absolute */ + + duk__call_prop_prep_stack(ctx, obj_index, nargs); + + duk_call_method(ctx, nargs); +} + +DUK_EXTERNAL duk_int_t duk_pcall(duk_context *ctx, duk_idx_t nargs) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_small_uint_t call_flags; + duk_idx_t idx_func; + duk_int_t rc; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + + idx_func = duk_get_top(ctx) - nargs - 1; /* must work for nargs <= 0 */ + if (idx_func < 0 || nargs < 0) { + /* We can't reliably pop anything here because the stack input + * shape is incorrect. So we throw an error; if the caller has + * no catch point for this, a fatal error will occur. Another + * alternative would be to just return an error. But then the + * stack would be in an unknown state which might cause some + * very hard to diagnose problems later on. Also note that even + * if we did not throw an error here, the underlying call handler + * might STILL throw an out-of-memory error or some other internal + * fatal error. + */ + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_CALL_ARGS); + return DUK_EXEC_ERROR; /* unreachable */ + } + + /* awkward; we assume there is space for this */ + duk_push_undefined(ctx); + duk_insert(ctx, idx_func + 1); + + call_flags = DUK_CALL_FLAG_PROTECTED; /* protected, respect reclimit, not constructor */ + + rc = duk_handle_call(thr, /* thread */ + nargs, /* num_stack_args */ + call_flags); /* call_flags */ + + return rc; +} + +DUK_EXTERNAL duk_int_t duk_pcall_method(duk_context *ctx, duk_idx_t nargs) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_small_uint_t call_flags; + duk_idx_t idx_func; + duk_int_t rc; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + + idx_func = duk_get_top(ctx) - nargs - 2; /* must work for nargs <= 0 */ + if (idx_func < 0 || nargs < 0) { + /* See comments in duk_pcall(). */ + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_CALL_ARGS); + return DUK_EXEC_ERROR; /* unreachable */ + } + + call_flags = DUK_CALL_FLAG_PROTECTED; /* protected, respect reclimit, not constructor */ + + rc = duk_handle_call(thr, /* thread */ + nargs, /* num_stack_args */ + call_flags); /* call_flags */ + + return rc; +} + +DUK_LOCAL duk_ret_t duk__pcall_prop_raw(duk_context *ctx) { + duk_idx_t obj_index; + duk_idx_t nargs; + + /* Get the original arguments. Note that obj_index may be a relative + * index so the stack must have the same top when we use it. + */ + + DUK_ASSERT_CTX_VALID(ctx); + + obj_index = (duk_idx_t) duk_get_int(ctx, -2); + nargs = (duk_idx_t) duk_get_int(ctx, -1); + duk_pop_2(ctx); + + obj_index = duk_require_normalize_index(ctx, obj_index); /* make absolute */ + duk__call_prop_prep_stack(ctx, obj_index, nargs); + duk_call_method(ctx, nargs); + return 1; +} + +DUK_EXTERNAL duk_int_t duk_pcall_prop(duk_context *ctx, duk_idx_t obj_index, duk_idx_t nargs) { + /* + * Must be careful to catch errors related to value stack manipulation + * and property lookup, not just the call itself. + */ + + DUK_ASSERT_CTX_VALID(ctx); + + duk_push_idx(ctx, obj_index); + duk_push_idx(ctx, nargs); + + /* Inputs: explicit arguments (nargs), +1 for key, +2 for obj_index/nargs passing. + * If the value stack does not contain enough args, an error is thrown; this matches + * behavior of the other protected call API functions. + */ + return duk_safe_call(ctx, duk__pcall_prop_raw, nargs + 1 + 2 /*nargs*/, 1 /*nrets*/); +} + +DUK_EXTERNAL duk_int_t duk_safe_call(duk_context *ctx, duk_safe_call_function func, duk_idx_t nargs, duk_idx_t nrets) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_int_t rc; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + + if (duk_get_top(ctx) < nargs || nrets < 0) { + /* See comments in duk_pcall(). */ + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_CALL_ARGS); + return DUK_EXEC_ERROR; /* unreachable */ + } + + rc = duk_handle_safe_call(thr, /* thread */ + func, /* func */ + nargs, /* num_stack_args */ + nrets); /* num_stack_res */ + + return rc; +} + +DUK_EXTERNAL void duk_new(duk_context *ctx, duk_idx_t nargs) { + /* + * There are two [[Construct]] operations in the specification: + * + * - E5 Section 13.2.2: for Function objects + * - E5 Section 15.3.4.5.2: for "bound" Function objects + * + * The chain of bound functions is resolved in Section 15.3.4.5.2, + * with arguments "piling up" until the [[Construct]] internal + * method is called on the final, actual Function object. Note + * that the "prototype" property is looked up *only* from the + * final object, *before* calling the constructor. + * + * Currently we follow the bound function chain here to get the + * "prototype" property value from the final, non-bound function. + * However, we let duk_handle_call() handle the argument "piling" + * when the constructor is called. The bound function chain is + * thus now processed twice. + * + * When constructing new Array instances, an unnecessary object is + * created and discarded now: the standard [[Construct]] creates an + * object, and calls the Array constructor. The Array constructor + * returns an Array instance, which is used as the result value for + * the "new" operation; the object created before the Array constructor + * call is discarded. + * + * This would be easy to fix, e.g. by knowing that the Array constructor + * will always create a replacement object and skip creating the fallback + * object in that case. + * + * Note: functions called via "new" need to know they are called as a + * constructor. For instance, built-in constructors behave differently + * depending on how they are called. + */ + + /* XXX: merge this with duk_js_call.c, as this function implements + * core semantics (or perhaps merge the two files altogether). + */ + + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *proto; + duk_hobject *cons; + duk_hobject *fallback; + duk_idx_t idx_cons; + duk_small_uint_t call_flags; + duk_int_t rc; + + DUK_ASSERT_CTX_VALID(ctx); + + /* [... constructor arg1 ... argN] */ + + idx_cons = duk_require_normalize_index(ctx, -nargs - 1); + + DUK_DDD(DUK_DDDPRINT("top=%ld, nargs=%ld, idx_cons=%ld", + (long) duk_get_top(ctx), (long) nargs, (long) idx_cons)); + + /* XXX: code duplication */ + + /* + * Figure out the final, non-bound constructor, to get "prototype" + * property. + */ + + duk_dup(ctx, idx_cons); + for (;;) { + cons = duk_get_hobject(ctx, -1); + if (cons == NULL || !DUK_HOBJECT_HAS_CONSTRUCTABLE(cons)) { + /* Checking constructability from anything else than the + * initial constructor is not strictly necessary, but a + * nice sanity check. + */ + goto not_constructable; + } + if (!DUK_HOBJECT_HAS_BOUND(cons)) { + break; + } + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_INT_TARGET); /* -> [... cons target] */ + duk_remove(ctx, -2); /* -> [... target] */ + } + DUK_ASSERT(cons != NULL && !DUK_HOBJECT_HAS_BOUND(cons)); + + /* [... constructor arg1 ... argN final_cons] */ + + /* + * Create "fallback" object to be used as the object instance, + * unless the constructor returns a replacement value. + * Its internal prototype needs to be set based on "prototype" + * property of the constructor. + */ + + duk_push_object(ctx); /* class Object, extensible */ + + /* [... constructor arg1 ... argN final_cons fallback] */ + + duk_get_prop_stridx(ctx, -2, DUK_STRIDX_PROTOTYPE); + proto = duk_get_hobject(ctx, -1); + if (!proto) { + DUK_DDD(DUK_DDDPRINT("constructor has no 'prototype' property, or value not an object " + "-> leave standard Object prototype as fallback prototype")); + } else { + DUK_DDD(DUK_DDDPRINT("constructor has 'prototype' property with object value " + "-> set fallback prototype to that value: %!iO", (duk_heaphdr *) proto)); + fallback = duk_get_hobject(ctx, -2); + DUK_ASSERT(fallback != NULL); + DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, fallback, proto); + } + duk_pop(ctx); + + /* [... constructor arg1 ... argN final_cons fallback] */ + + /* + * Manipulate callstack for the call. + */ + + duk_dup_top(ctx); + duk_insert(ctx, idx_cons + 1); /* use fallback as 'this' value */ + duk_insert(ctx, idx_cons); /* also stash it before constructor, + * in case we need it (as the fallback value) + */ + duk_pop(ctx); /* pop final_cons */ + + + /* [... fallback constructor fallback(this) arg1 ... argN]; + * Note: idx_cons points to first 'fallback', not 'constructor'. + */ + + DUK_DDD(DUK_DDDPRINT("before call, idx_cons+1 (constructor) -> %!T, idx_cons+2 (fallback/this) -> %!T, " + "nargs=%ld, top=%ld", + (duk_tval *) duk_get_tval(ctx, idx_cons + 1), + (duk_tval *) duk_get_tval(ctx, idx_cons + 2), + (long) nargs, + (long) duk_get_top(ctx))); + + /* + * Call the constructor function (called in "constructor mode"). + */ + + call_flags = DUK_CALL_FLAG_CONSTRUCTOR_CALL; /* not protected, respect reclimit, is a constructor call */ + + rc = duk_handle_call(thr, /* thread */ + nargs, /* num_stack_args */ + call_flags); /* call_flags */ + DUK_UNREF(rc); + + /* [... fallback retval] */ + + DUK_DDD(DUK_DDDPRINT("constructor call finished, rc=%ld, fallback=%!iT, retval=%!iT", + (long) rc, + (duk_tval *) duk_get_tval(ctx, -2), + (duk_tval *) duk_get_tval(ctx, -1))); + + /* + * Determine whether to use the constructor return value as the created + * object instance or not. + */ + + if (duk_is_object(ctx, -1)) { + duk_remove(ctx, -2); + } else { + duk_pop(ctx); + } + + /* + * Augment created errors upon creation (not when they are thrown or + * rethrown). __FILE__ and __LINE__ are not desirable here; the call + * stack reflects the caller which is correct. + */ + +#ifdef DUK_USE_AUGMENT_ERROR_CREATE + duk_hthread_sync_currpc(thr); + duk_err_augment_error_create(thr, thr, NULL, 0, 1 /*noblame_fileline*/); +#endif + + /* [... retval] */ + + return; + + not_constructable: + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_CONSTRUCTABLE); +} + +DUK_LOCAL duk_ret_t duk__pnew_helper(duk_context *ctx) { + duk_uint_t nargs; + + nargs = duk_to_uint(ctx, -1); + duk_pop(ctx); + + duk_new(ctx, nargs); + return 1; +} + +DUK_EXTERNAL duk_int_t duk_pnew(duk_context *ctx, duk_idx_t nargs) { + duk_int_t rc; + + DUK_ASSERT_CTX_VALID(ctx); + + /* For now, just use duk_safe_call() to wrap duk_new(). We can't + * simply use a protected duk_handle_call() because there's post + * processing which might throw. It should be possible to ensure + * the post processing never throws (except in internal errors and + * out of memory etc which are always allowed) and then remove this + * wrapper. + */ + + duk_push_uint(ctx, nargs); + rc = duk_safe_call(ctx, duk__pnew_helper, nargs + 2 /*nargs*/, 1 /*nrets*/); + return rc; +} + +DUK_EXTERNAL duk_bool_t duk_is_constructor_call(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_activation *act; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + DUK_ASSERT_DISABLE(thr->callstack_top >= 0); + + act = duk_hthread_get_current_activation(thr); + DUK_ASSERT(act != NULL); /* because callstack_top > 0 */ + return ((act->flags & DUK_ACT_FLAG_CONSTRUCT) != 0 ? 1 : 0); +} + +DUK_EXTERNAL duk_bool_t duk_is_strict_call(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_activation *act; + + /* For user code this could just return 1 (strict) always + * because all Duktape/C functions are considered strict, + * and strict is also the default when nothing is running. + * However, Duktape may call this function internally when + * the current activation is an Ecmascript function, so + * this cannot be replaced by a 'return 1' without fixing + * the internal call sites. + */ + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + DUK_ASSERT_DISABLE(thr->callstack_top >= 0); + + act = duk_hthread_get_current_activation(thr); + if (act == NULL) { + /* Strict by default. */ + return 1; + } + return ((act->flags & DUK_ACT_FLAG_STRICT) != 0 ? 1 : 0); +} + +/* + * Duktape/C function magic + */ + +DUK_EXTERNAL duk_int_t duk_get_current_magic(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_activation *act; + duk_hobject *func; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + DUK_ASSERT_DISABLE(thr->callstack_top >= 0); + + act = duk_hthread_get_current_activation(thr); + if (act) { + func = DUK_ACT_GET_FUNC(act); + if (!func) { + duk_tval *tv = &act->tv_func; + duk_small_uint_t lf_flags; + lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv); + return (duk_int_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags); + } + DUK_ASSERT(func != NULL); + + if (DUK_HOBJECT_IS_NATIVEFUNCTION(func)) { + duk_hnativefunction *nf = (duk_hnativefunction *) func; + return (duk_int_t) nf->magic; + } + } + return 0; +} + +DUK_EXTERNAL duk_int_t duk_get_magic(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + duk_hobject *h; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_require_tval(ctx, index); + if (DUK_TVAL_IS_OBJECT(tv)) { + h = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h != NULL); + if (!DUK_HOBJECT_HAS_NATIVEFUNCTION(h)) { + goto type_error; + } + return (duk_int_t) ((duk_hnativefunction *) h)->magic; + } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) { + duk_small_uint_t lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv); + return (duk_int_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags); + } + + /* fall through */ + type_error: + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_UNEXPECTED_TYPE); + return 0; +} + +DUK_EXTERNAL void duk_set_magic(duk_context *ctx, duk_idx_t index, duk_int_t magic) { + duk_hnativefunction *nf; + + DUK_ASSERT_CTX_VALID(ctx); + + nf = duk_require_hnativefunction(ctx, index); + DUK_ASSERT(nf != NULL); + nf->magic = (duk_int16_t) magic; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_codec.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_codec.c new file mode 100644 index 00000000..ad5e00d0 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_codec.c @@ -0,0 +1,389 @@ +/* + * Encoding and decoding basic formats: hex, base64. + * + * These are in-place operations which may allow an optimized implementation. + */ + +#include "duk_internal.h" + +/* dst length must be exactly ceil(len/3)*4 */ +DUK_LOCAL void duk__base64_encode_helper(const duk_uint8_t *src, const duk_uint8_t *src_end, + duk_uint8_t *dst, duk_uint8_t *dst_end) { + duk_small_uint_t i, snip; + duk_uint_fast32_t t; + duk_uint_fast8_t x, y; + + DUK_UNREF(dst_end); + + while (src < src_end) { + /* read 3 bytes into 't', padded by zero */ + snip = 4; + t = 0; + for (i = 0; i < 3; i++) { + t = t << 8; + if (src >= src_end) { + snip--; + } else { + t += (duk_uint_fast32_t) (*src++); + } + } + + /* + * Missing bytes snip base64 example + * 0 4 XXXX + * 1 3 XXX= + * 2 2 XX== + */ + + DUK_ASSERT(snip >= 2 && snip <= 4); + + for (i = 0; i < 4; i++) { + x = (duk_uint_fast8_t) ((t >> 18) & 0x3f); + t = t << 6; + + /* A straightforward 64-byte lookup would be faster + * and cleaner, but this is shorter. + */ + if (i >= snip) { + y = '='; + } else if (x <= 25) { + y = x + 'A'; + } else if (x <= 51) { + y = x - 26 + 'a'; + } else if (x <= 61) { + y = x - 52 + '0'; + } else if (x == 62) { + y = '+'; + } else { + y = '/'; + } + + DUK_ASSERT(dst < dst_end); + *dst++ = (duk_uint8_t) y; + } + } +} + +DUK_LOCAL duk_bool_t duk__base64_decode_helper(const duk_uint8_t *src, const duk_uint8_t *src_end, + duk_uint8_t *dst, duk_uint8_t *dst_end, duk_uint8_t **out_dst_final) { + duk_uint_fast32_t t; + duk_uint_fast8_t x, y; + duk_small_uint_t group_idx; + + DUK_UNREF(dst_end); + + t = 0; + group_idx = 0; + + while (src < src_end) { + x = *src++; + + if (x >= 'A' && x <= 'Z') { + y = x - 'A' + 0; + } else if (x >= 'a' && x <= 'z') { + y = x - 'a' + 26; + } else if (x >= '0' && x <= '9') { + y = x - '0' + 52; + } else if (x == '+') { + y = 62; + } else if (x == '/') { + y = 63; + } else if (x == '=') { + /* We don't check the zero padding bytes here right now. + * This seems to be common behavior for base-64 decoders. + */ + + if (group_idx == 2) { + /* xx== -> 1 byte, t contains 12 bits, 4 on right are zero */ + t = t >> 4; + DUK_ASSERT(dst < dst_end); + *dst++ = (duk_uint8_t) t; + + if (src >= src_end) { + goto error; + } + x = *src++; + if (x != '=') { + goto error; + } + } else if (group_idx == 3) { + /* xxx= -> 2 bytes, t contains 18 bits, 2 on right are zero */ + t = t >> 2; + DUK_ASSERT(dst < dst_end); + *dst++ = (duk_uint8_t) ((t >> 8) & 0xff); + DUK_ASSERT(dst < dst_end); + *dst++ = (duk_uint8_t) (t & 0xff); + } else { + goto error; + } + + /* Here we can choose either to end parsing and ignore + * whatever follows, or to continue parsing in case + * multiple (possibly padded) base64 strings have been + * concatenated. Currently, keep on parsing. + */ + t = 0; + group_idx = 0; + continue; + } else if (x == 0x09 || x == 0x0a || x == 0x0d || x == 0x20) { + /* allow basic ASCII whitespace */ + continue; + } else { + goto error; + } + + t = (t << 6) + y; + + if (group_idx == 3) { + /* output 3 bytes from 't' */ + DUK_ASSERT(dst < dst_end); + *dst++ = (duk_uint8_t) ((t >> 16) & 0xff); + DUK_ASSERT(dst < dst_end); + *dst++ = (duk_uint8_t) ((t >> 8) & 0xff); + DUK_ASSERT(dst < dst_end); + *dst++ = (duk_uint8_t) (t & 0xff); + t = 0; + group_idx = 0; + } else { + group_idx++; + } + } + + if (group_idx != 0) { + /* Here we'd have the option of decoding unpadded base64 + * (e.g. "xxxxyy" instead of "xxxxyy==". Currently not + * accepted. + */ + goto error; + } + + *out_dst_final = dst; + return 1; + + error: + return 0; +} + +/* Shared handling for encode/decode argument. Fast path handling for + * buffer and string values because they're the most common. In particular, + * avoid creating a temporary string or buffer when possible. + */ +DUK_LOCAL const duk_uint8_t *duk__prep_codec_arg(duk_context *ctx, duk_idx_t index, duk_size_t *out_len) { + DUK_ASSERT(duk_is_valid_index(ctx, index)); /* checked by caller */ + if (duk_is_buffer(ctx, index)) { + return (const duk_uint8_t *) duk_get_buffer(ctx, index, out_len); + } else { + return (const duk_uint8_t *) duk_to_lstring(ctx, index, out_len); + } +} + +DUK_EXTERNAL const char *duk_base64_encode(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_uint8_t *src; + duk_size_t srclen; + duk_size_t dstlen; + duk_uint8_t *dst; + const char *ret; + + DUK_ASSERT_CTX_VALID(ctx); + + /* XXX: optimize for string inputs: no need to coerce to a buffer + * which makes a copy of the input. + */ + + index = duk_require_normalize_index(ctx, index); + src = (duk_uint8_t *) duk_to_buffer(ctx, index, &srclen); + /* Note: for srclen=0, src may be NULL */ + + /* Computation must not wrap; this limit works for 32-bit size_t: + * >>> srclen = 3221225469 + * >>> '%x' % ((srclen + 2) / 3 * 4) + * 'fffffffc' + */ + if (srclen > 3221225469UL) { + goto type_error; + } + dstlen = (srclen + 2) / 3 * 4; + dst = (duk_uint8_t *) duk_push_fixed_buffer(ctx, dstlen); + + duk__base64_encode_helper((const duk_uint8_t *) src, (const duk_uint8_t *) (src + srclen), + dst, (dst + dstlen)); + + ret = duk_to_string(ctx, -1); + duk_replace(ctx, index); + return ret; + + type_error: + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_ENCODE_FAILED); + return NULL; /* never here */ +} + +DUK_EXTERNAL void duk_base64_decode(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + const duk_uint8_t *src; + duk_size_t srclen; + duk_size_t dstlen; + duk_uint8_t *dst; + duk_uint8_t *dst_final; + duk_bool_t retval; + + DUK_ASSERT_CTX_VALID(ctx); + + /* XXX: optimize for buffer inputs: no need to coerce to a string + * which causes an unnecessary interning. + */ + + index = duk_require_normalize_index(ctx, index); + src = (const duk_uint8_t *) duk_to_lstring(ctx, index, &srclen); + + /* Computation must not wrap, only srclen + 3 is at risk of + * wrapping because after that the number gets smaller. + * This limit works for 32-bit size_t: + * 0x100000000 - 3 - 1 = 4294967292 + */ + if (srclen > 4294967292UL) { + goto type_error; + } + dstlen = (srclen + 3) / 4 * 3; /* upper limit */ + dst = (duk_uint8_t *) duk_push_dynamic_buffer(ctx, dstlen); + /* Note: for dstlen=0, dst may be NULL */ + + retval = duk__base64_decode_helper((const duk_uint8_t *) src, (const duk_uint8_t *) (src + srclen), + dst, dst + dstlen, &dst_final); + if (!retval) { + goto type_error; + } + + /* XXX: convert to fixed buffer? */ + (void) duk_resize_buffer(ctx, -1, (duk_size_t) (dst_final - dst)); + duk_replace(ctx, index); + return; + + type_error: + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_DECODE_FAILED); +} + +DUK_EXTERNAL const char *duk_hex_encode(duk_context *ctx, duk_idx_t index) { + const duk_uint8_t *inp; + duk_size_t len; + duk_size_t i; + duk_small_uint_t t; + duk_uint8_t *buf; + const char *ret; + + DUK_ASSERT_CTX_VALID(ctx); + + index = duk_require_normalize_index(ctx, index); + inp = duk__prep_codec_arg(ctx, index, &len); + DUK_ASSERT(inp != NULL || len == 0); + + /* Fixed buffer, no zeroing because we'll fill all the data. */ + buf = (duk_uint8_t *) duk_push_buffer_raw(ctx, len * 2, DUK_BUF_FLAG_NOZERO /*flags*/); + DUK_ASSERT(buf != NULL); + + for (i = 0; i < len; i++) { + /* XXX: by using two 256-entry tables could avoid shifting and masking. */ + t = (duk_small_uint_t) inp[i]; + buf[i*2 + 0] = duk_lc_digits[t >> 4]; + buf[i*2 + 1] = duk_lc_digits[t & 0x0f]; + } + + /* XXX: Using a string return value forces a string intern which is + * not always necessary. As a rough performance measure, hex encode + * time for tests/perf/test-hex-encode.js dropped from ~35s to ~15s + * without string coercion. Change to returning a buffer and let the + * caller coerce to string if necessary? + */ + + ret = duk_to_string(ctx, -1); + duk_replace(ctx, index); + return ret; +} + +DUK_EXTERNAL void duk_hex_decode(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + const duk_uint8_t *inp; + duk_size_t len; + duk_size_t i; + duk_small_int_t t; + duk_uint8_t *buf; + + DUK_ASSERT_CTX_VALID(ctx); + + index = duk_require_normalize_index(ctx, index); + inp = duk__prep_codec_arg(ctx, index, &len); + DUK_ASSERT(inp != NULL || len == 0); + + if (len & 0x01) { + goto type_error; + } + + /* Fixed buffer, no zeroing because we'll fill all the data. */ + buf = (duk_uint8_t *) duk_push_buffer_raw(ctx, len / 2, DUK_BUF_FLAG_NOZERO /*flags*/); + DUK_ASSERT(buf != NULL); + + for (i = 0; i < len; i += 2) { + /* For invalid characters the value -1 gets extended to + * at least 16 bits. If either nybble is invalid, the + * resulting 't' will be < 0. + */ + t = (((duk_small_int_t) duk_hex_dectab[inp[i]]) << 4) | + ((duk_small_int_t) duk_hex_dectab[inp[i + 1]]); + if (DUK_UNLIKELY(t < 0)) { + goto type_error; + } + buf[i >> 1] = (duk_uint8_t) t; + } + + duk_replace(ctx, index); + return; + + type_error: + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_DECODE_FAILED); +} + +DUK_EXTERNAL const char *duk_json_encode(duk_context *ctx, duk_idx_t index) { +#ifdef DUK_USE_ASSERTIONS + duk_idx_t top_at_entry; +#endif + const char *ret; + + DUK_ASSERT_CTX_VALID(ctx); +#ifdef DUK_USE_ASSERTIONS + top_at_entry = duk_get_top(ctx); +#endif + + index = duk_require_normalize_index(ctx, index); + duk_bi_json_stringify_helper(ctx, + index /*idx_value*/, + DUK_INVALID_INDEX /*idx_replacer*/, + DUK_INVALID_INDEX /*idx_space*/, + 0 /*flags*/); + DUK_ASSERT(duk_is_string(ctx, -1)); + duk_replace(ctx, index); + ret = duk_get_string(ctx, index); + + DUK_ASSERT(duk_get_top(ctx) == top_at_entry); + + return ret; +} + +DUK_EXTERNAL void duk_json_decode(duk_context *ctx, duk_idx_t index) { +#ifdef DUK_USE_ASSERTIONS + duk_idx_t top_at_entry; +#endif + + DUK_ASSERT_CTX_VALID(ctx); +#ifdef DUK_USE_ASSERTIONS + top_at_entry = duk_get_top(ctx); +#endif + + index = duk_require_normalize_index(ctx, index); + duk_bi_json_parse_helper(ctx, + index /*idx_value*/, + DUK_INVALID_INDEX /*idx_reviver*/, + 0 /*flags*/); + duk_replace(ctx, index); + + DUK_ASSERT(duk_get_top(ctx) == top_at_entry); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_compile.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_compile.c new file mode 100644 index 00000000..60967e1b --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_compile.c @@ -0,0 +1,180 @@ +/* + * Compilation and evaluation + */ + +#include "duk_internal.h" + +typedef struct duk__compile_raw_args duk__compile_raw_args; +struct duk__compile_raw_args { + duk_size_t src_length; /* should be first on 64-bit platforms */ + const duk_uint8_t *src_buffer; + duk_uint_t flags; +}; + +/* Eval is just a wrapper now. */ +DUK_EXTERNAL duk_int_t duk_eval_raw(duk_context *ctx, const char *src_buffer, duk_size_t src_length, duk_uint_t flags) { + duk_uint_t comp_flags; + duk_int_t rc; + + DUK_ASSERT_CTX_VALID(ctx); + + /* Note: strictness is *not* inherited from the current Duktape/C. + * This would be confusing because the current strictness state + * depends on whether we're running inside a Duktape/C activation + * (= strict mode) or outside of any activation (= non-strict mode). + * See tests/api/test-eval-strictness.c for more discussion. + */ + + /* [ ... source? filename ] (depends on flags) */ + + comp_flags = flags; + comp_flags |= DUK_COMPILE_EVAL; + rc = duk_compile_raw(ctx, src_buffer, src_length, comp_flags); /* may be safe, or non-safe depending on flags */ + + /* [ ... closure/error ] */ + + if (rc != DUK_EXEC_SUCCESS) { + rc = DUK_EXEC_ERROR; + goto got_rc; + } + + duk_push_global_object(ctx); /* explicit 'this' binding, see GH-164 */ + + if (flags & DUK_COMPILE_SAFE) { + rc = duk_pcall_method(ctx, 0); + } else { + duk_call_method(ctx, 0); + rc = DUK_EXEC_SUCCESS; + } + + /* [ ... result/error ] */ + + got_rc: + if (flags & DUK_COMPILE_NORESULT) { + duk_pop(ctx); + } + + return rc; +} + +/* Helper which can be called both directly and with duk_safe_call(). */ +DUK_LOCAL duk_ret_t duk__do_compile(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk__compile_raw_args *comp_args; + duk_uint_t flags; + duk_small_uint_t comp_flags; + duk_hcompiledfunction *h_templ; + + DUK_ASSERT_CTX_VALID(ctx); + + /* Note: strictness is not inherited from the current Duktape/C + * context. Otherwise it would not be possible to compile + * non-strict code inside a Duktape/C activation (which is + * always strict now). See tests/api/test-eval-strictness.c + * for discussion. + */ + + /* [ ... source? filename &comp_args ] (depends on flags) */ + + comp_args = (duk__compile_raw_args *) duk_require_pointer(ctx, -1); + flags = comp_args->flags; + duk_pop(ctx); + + /* [ ... source? filename ] */ + + if (!comp_args->src_buffer) { + duk_hstring *h_sourcecode; + + h_sourcecode = duk_get_hstring(ctx, -2); + if ((flags & DUK_COMPILE_NOSOURCE) || /* args incorrect */ + (h_sourcecode == NULL)) { /* e.g. duk_push_string_file_raw() pushed undefined */ + /* XXX: when this error is caused by a nonexistent + * file given to duk_peval_file() or similar, the + * error message is not the best possible. + */ + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_NO_SOURCECODE); + } + DUK_ASSERT(h_sourcecode != NULL); + comp_args->src_buffer = (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_sourcecode); + comp_args->src_length = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_sourcecode); + } + DUK_ASSERT(comp_args->src_buffer != NULL); + + /* XXX: unnecessary translation of flags */ + comp_flags = 0; + if (flags & DUK_COMPILE_EVAL) { + comp_flags |= DUK_JS_COMPILE_FLAG_EVAL; + } + if (flags & DUK_COMPILE_FUNCTION) { + comp_flags |= DUK_JS_COMPILE_FLAG_EVAL | + DUK_JS_COMPILE_FLAG_FUNCEXPR; + } + if (flags & DUK_COMPILE_STRICT) { + comp_flags |= DUK_JS_COMPILE_FLAG_STRICT; + } + + /* [ ... source? filename ] */ + + duk_js_compile(thr, comp_args->src_buffer, comp_args->src_length, comp_flags); + + /* [ ... source? func_template ] */ + + if (flags & DUK_COMPILE_NOSOURCE) { + ; + } else { + duk_remove(ctx, -2); + } + + /* [ ... func_template ] */ + + h_templ = (duk_hcompiledfunction *) duk_get_hobject(ctx, -1); + DUK_ASSERT(h_templ != NULL); + duk_js_push_closure(thr, + h_templ, + thr->builtins[DUK_BIDX_GLOBAL_ENV], + thr->builtins[DUK_BIDX_GLOBAL_ENV]); + duk_remove(ctx, -2); /* -> [ ... closure ] */ + + /* [ ... closure ] */ + + return 1; +} + +DUK_EXTERNAL duk_int_t duk_compile_raw(duk_context *ctx, const char *src_buffer, duk_size_t src_length, duk_uint_t flags) { + duk__compile_raw_args comp_args_alloc; + duk__compile_raw_args *comp_args = &comp_args_alloc; + + DUK_ASSERT_CTX_VALID(ctx); + + if ((flags & DUK_COMPILE_STRLEN) && (src_buffer != NULL)) { + /* String length is computed here to avoid multiple evaluation + * of a macro argument in the calling side. + */ + src_length = DUK_STRLEN(src_buffer); + } + + comp_args->src_buffer = (const duk_uint8_t *) src_buffer; + comp_args->src_length = src_length; + comp_args->flags = flags; + duk_push_pointer(ctx, (void *) comp_args); + + /* [ ... source? filename &comp_args ] (depends on flags) */ + + if (flags & DUK_COMPILE_SAFE) { + duk_int_t rc; + duk_int_t nargs; + duk_int_t nrets = 1; + + /* Arguments are either: [ filename &comp_args ] or [ source filename &comp_args ] */ + nargs = (flags & DUK_COMPILE_NOSOURCE) ? 2 : 3; + rc = duk_safe_call(ctx, duk__do_compile, nargs, nrets); + + /* [ ... closure ] */ + return rc; + } + + (void) duk__do_compile(ctx); + + /* [ ... closure ] */ + return DUK_EXEC_SUCCESS; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_debug.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_debug.c new file mode 100644 index 00000000..0765a66b --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_debug.c @@ -0,0 +1,168 @@ +/* + * Debugging related API calls + */ + +#include "duk_internal.h" + +DUK_EXTERNAL void duk_push_context_dump(duk_context *ctx) { + duk_idx_t idx; + duk_idx_t top; + + DUK_ASSERT_CTX_VALID(ctx); + + /* We don't duk_require_stack() here now, but rely on the caller having + * enough space. + */ + + top = duk_get_top(ctx); + duk_push_array(ctx); + for (idx = 0; idx < top; idx++) { + duk_dup(ctx, idx); + duk_put_prop_index(ctx, -2, idx); + } + + /* XXX: conversion errors should not propagate outwards. + * Perhaps values need to be coerced individually? + */ + duk_bi_json_stringify_helper(ctx, + duk_get_top_index(ctx), /*idx_value*/ + DUK_INVALID_INDEX, /*idx_replacer*/ + DUK_INVALID_INDEX, /*idx_space*/ + DUK_JSON_FLAG_EXT_CUSTOM | + DUK_JSON_FLAG_ASCII_ONLY | + DUK_JSON_FLAG_AVOID_KEY_QUOTES /*flags*/); + + duk_push_sprintf(ctx, "ctx: top=%ld, stack=%s", (long) top, (const char *) duk_safe_to_string(ctx, -1)); + duk_replace(ctx, -3); /* [ ... arr jsonx(arr) res ] -> [ ... res jsonx(arr) ] */ + duk_pop(ctx); + DUK_ASSERT(duk_is_string(ctx, -1)); +} + +#if defined(DUK_USE_DEBUGGER_SUPPORT) + +DUK_EXTERNAL void duk_debugger_attach(duk_context *ctx, + duk_debug_read_function read_cb, + duk_debug_write_function write_cb, + duk_debug_peek_function peek_cb, + duk_debug_read_flush_function read_flush_cb, + duk_debug_write_flush_function write_flush_cb, + duk_debug_detached_function detached_cb, + void *udata) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_heap *heap; + const char *str; + duk_size_t len; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(read_cb != NULL); + DUK_ASSERT(write_cb != NULL); + /* Other callbacks are optional. */ + + heap = thr->heap; + heap->dbg_read_cb = read_cb; + heap->dbg_write_cb = write_cb; + heap->dbg_peek_cb = peek_cb; + heap->dbg_read_flush_cb = read_flush_cb; + heap->dbg_write_flush_cb = write_flush_cb; + heap->dbg_detached_cb = detached_cb; + heap->dbg_udata = udata; + + /* Start in paused state. */ + heap->dbg_processing = 0; + heap->dbg_paused = 1; + heap->dbg_state_dirty = 1; + heap->dbg_force_restart = 0; + heap->dbg_step_type = 0; + heap->dbg_step_thread = NULL; + heap->dbg_step_csindex = 0; + heap->dbg_step_startline = 0; + heap->dbg_exec_counter = 0; + heap->dbg_last_counter = 0; + heap->dbg_last_time = 0.0; + + /* Send version identification and flush right afterwards. Note that + * we must write raw, unframed bytes here. + */ + duk_push_sprintf(ctx, "%ld %ld %s %s\n", + (long) DUK_DEBUG_PROTOCOL_VERSION, + (long) DUK_VERSION, + (const char *) DUK_GIT_DESCRIBE, + (const char *) DUK_USE_TARGET_INFO); + str = duk_get_lstring(ctx, -1, &len); + DUK_ASSERT(str != NULL); + duk_debug_write_bytes(thr, (const duk_uint8_t *) str, len); + duk_debug_write_flush(thr); + duk_pop(ctx); +} + +DUK_EXTERNAL void duk_debugger_detach(duk_context *ctx) { + duk_hthread *thr; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK_ASSERT(thr != NULL); + DUK_ASSERT(thr->heap != NULL); + + /* Can be called muliple times with no harm. */ + duk_debug_do_detach(thr->heap); +} + +DUK_EXTERNAL void duk_debugger_cooperate(duk_context *ctx) { + duk_hthread *thr; + duk_bool_t processed_messages; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK_ASSERT(thr != NULL); + DUK_ASSERT(thr->heap != NULL); + + if (!DUK_HEAP_IS_DEBUGGER_ATTACHED(thr->heap)) { + return; + } + if (thr->callstack_top > 0 || thr->heap->dbg_processing) { + /* Calling duk_debugger_cooperate() while Duktape is being + * called into is not supported. This is not a 100% check + * but prevents any damage in most cases. + */ + return; + } + + thr->heap->dbg_processing = 1; + processed_messages = duk_debug_process_messages(thr, 1 /*no_block*/); + thr->heap->dbg_processing = 0; + DUK_UNREF(processed_messages); +} + +#else /* DUK_USE_DEBUGGER_SUPPORT */ + +DUK_EXTERNAL void duk_debugger_attach(duk_context *ctx, + duk_debug_read_function read_cb, + duk_debug_write_function write_cb, + duk_debug_peek_function peek_cb, + duk_debug_read_flush_function read_flush_cb, + duk_debug_write_flush_function write_flush_cb, + duk_debug_detached_function detached_cb, + void *udata) { + DUK_ASSERT_CTX_VALID(ctx); + DUK_UNREF(read_cb); + DUK_UNREF(write_cb); + DUK_UNREF(peek_cb); + DUK_UNREF(read_flush_cb); + DUK_UNREF(write_flush_cb); + DUK_UNREF(detached_cb); + DUK_UNREF(udata); + duk_error(ctx, DUK_ERR_API_ERROR, "no debugger support"); +} + +DUK_EXTERNAL void duk_debugger_detach(duk_context *ctx) { + DUK_ASSERT_CTX_VALID(ctx); + duk_error(ctx, DUK_ERR_API_ERROR, "no debugger support"); +} + +DUK_EXTERNAL void duk_debugger_cooperate(duk_context *ctx) { + /* nop */ + DUK_ASSERT_CTX_VALID(ctx); + DUK_UNREF(ctx); +} + +#endif /* DUK_USE_DEBUGGER_SUPPORT */ diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_heap.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_heap.c new file mode 100644 index 00000000..8e5936a6 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_heap.c @@ -0,0 +1,128 @@ +/* + * Heap creation and destruction + */ + +#include "duk_internal.h" + +DUK_EXTERNAL +duk_context *duk_create_heap(duk_alloc_function alloc_func, + duk_realloc_function realloc_func, + duk_free_function free_func, + void *heap_udata, + duk_fatal_function fatal_handler) { + duk_heap *heap = NULL; + duk_context *ctx; + + /* Assume that either all memory funcs are NULL or non-NULL, mixed + * cases will now be unsafe. + */ + + /* XXX: just assert non-NULL values here and make caller arguments + * do the defaulting to the default implementations (smaller code)? + */ + + if (!alloc_func) { + DUK_ASSERT(realloc_func == NULL); + DUK_ASSERT(free_func == NULL); + alloc_func = duk_default_alloc_function; + realloc_func = duk_default_realloc_function; + free_func = duk_default_free_function; + } else { + DUK_ASSERT(realloc_func != NULL); + DUK_ASSERT(free_func != NULL); + } + + if (!fatal_handler) { + fatal_handler = duk_default_fatal_handler; + } + + DUK_ASSERT(alloc_func != NULL); + DUK_ASSERT(realloc_func != NULL); + DUK_ASSERT(free_func != NULL); + DUK_ASSERT(fatal_handler != NULL); + + heap = duk_heap_alloc(alloc_func, realloc_func, free_func, heap_udata, fatal_handler); + if (!heap) { + return NULL; + } + ctx = (duk_context *) heap->heap_thread; + DUK_ASSERT(ctx != NULL); + DUK_ASSERT(((duk_hthread *) ctx)->heap != NULL); + return ctx; +} + +DUK_EXTERNAL void duk_destroy_heap(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_heap *heap; + + if (!ctx) { + return; + } + heap = thr->heap; + DUK_ASSERT(heap != NULL); + + duk_heap_free(heap); +} + +/* XXX: better place for this */ +DUK_EXTERNAL void duk_set_global_object(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *h_glob; + duk_hobject *h_prev_glob; + duk_hobject *h_env; + duk_hobject *h_prev_env; + + DUK_D(DUK_DPRINT("replace global object with: %!T", duk_get_tval(ctx, -1))); + + h_glob = duk_require_hobject(ctx, -1); + DUK_ASSERT(h_glob != NULL); + + /* + * Replace global object. + */ + + h_prev_glob = thr->builtins[DUK_BIDX_GLOBAL]; + thr->builtins[DUK_BIDX_GLOBAL] = h_glob; + DUK_HOBJECT_INCREF(thr, h_glob); + DUK_HOBJECT_DECREF_ALLOWNULL(thr, h_prev_glob); /* side effects, in theory (referenced by global env) */ + + /* + * Replace lexical environment for global scope + * + * Create a new object environment for the global lexical scope. + * We can't just reset the _Target property of the current one, + * because the lexical scope is shared by other threads with the + * same (initial) built-ins. + */ + + (void) duk_push_object_helper(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJENV), + -1); /* no prototype, updated below */ + + duk_dup(ctx, -2); + duk_dup(ctx, -3); + + /* [ ... new_glob new_env new_glob new_glob ] */ + + duk_xdef_prop_stridx(thr, -3, DUK_STRIDX_INT_TARGET, DUK_PROPDESC_FLAGS_NONE); + duk_xdef_prop_stridx(thr, -2, DUK_STRIDX_INT_THIS, DUK_PROPDESC_FLAGS_NONE); + + /* [ ... new_glob new_env ] */ + + h_env = duk_get_hobject(ctx, -1); + DUK_ASSERT(h_env != NULL); + + h_prev_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; + thr->builtins[DUK_BIDX_GLOBAL_ENV] = h_env; + DUK_HOBJECT_INCREF(thr, h_env); + DUK_HOBJECT_DECREF_ALLOWNULL(thr, h_prev_env); /* side effects */ + DUK_UNREF(h_env); /* without refcounts */ + DUK_UNREF(h_prev_env); + + /* [ ... new_glob new_env ] */ + + duk_pop_2(ctx); + + /* [ ... ] */ +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_internal.h b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_internal.h new file mode 100644 index 00000000..57e60228 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_internal.h @@ -0,0 +1,175 @@ +/* + * Internal API calls which have (stack and other) semantics similar + * to the public API. + */ + +#ifndef DUK_API_INTERNAL_H_INCLUDED +#define DUK_API_INTERNAL_H_INCLUDED + +/* duk_push_sprintf constants */ +#define DUK_PUSH_SPRINTF_INITIAL_SIZE 256L +#define DUK_PUSH_SPRINTF_SANITY_LIMIT (1L * 1024L * 1024L * 1024L) + +/* Flag ORed to err_code to indicate __FILE__ / __LINE__ is not + * blamed as source of error for error fileName / lineNumber. + */ +#define DUK_ERRCODE_FLAG_NOBLAME_FILELINE (1L << 24) + +/* Valstack resize flags */ +#define DUK_VSRESIZE_FLAG_SHRINK (1 << 0) +#define DUK_VSRESIZE_FLAG_COMPACT (1 << 1) +#define DUK_VSRESIZE_FLAG_THROW (1 << 2) + +/* Current convention is to use duk_size_t for value stack sizes and global indices, + * and duk_idx_t for local frame indices. + */ +DUK_INTERNAL_DECL +duk_bool_t duk_valstack_resize_raw(duk_context *ctx, + duk_size_t min_new_size, + duk_small_uint_t flags); + +DUK_INTERNAL_DECL duk_tval *duk_get_tval(duk_context *ctx, duk_idx_t index); +DUK_INTERNAL_DECL duk_tval *duk_require_tval(duk_context *ctx, duk_idx_t index); +DUK_INTERNAL_DECL void duk_push_tval(duk_context *ctx, duk_tval *tv); + +/* Push the current 'this' binding; throw TypeError if binding is not object + * coercible (CheckObjectCoercible). + */ +DUK_INTERNAL_DECL void duk_push_this_check_object_coercible(duk_context *ctx); + +/* duk_push_this() + CheckObjectCoercible() + duk_to_object() */ +DUK_INTERNAL_DECL duk_hobject *duk_push_this_coercible_to_object(duk_context *ctx); + +/* duk_push_this() + CheckObjectCoercible() + duk_to_string() */ +DUK_INTERNAL_DECL duk_hstring *duk_push_this_coercible_to_string(duk_context *ctx); + +/* Get a borrowed duk_tval pointer to the current 'this' binding. Caller must + * make sure there's an active callstack entry. Note that the returned pointer + * is unstable with regards to side effects. + */ +DUK_INTERNAL_DECL duk_tval *duk_get_borrowed_this_tval(duk_context *ctx); + +/* XXX: add fastint support? */ +#define duk_push_u64(ctx,val) \ + duk_push_number((ctx), (duk_double_t) (val)) +#define duk_push_i64(ctx,val) \ + duk_push_number((ctx), (duk_double_t) (val)) + +/* duk_push_(u)int() is guaranteed to support at least (un)signed 32-bit range */ +#define duk_push_u32(ctx,val) \ + duk_push_uint((ctx), (duk_uint_t) (val)) +#define duk_push_i32(ctx,val) \ + duk_push_int((ctx), (duk_int_t) (val)) + +/* sometimes stack and array indices need to go on the stack */ +#define duk_push_idx(ctx,val) \ + duk_push_int((ctx), (duk_int_t) (val)) +#define duk_push_uarridx(ctx,val) \ + duk_push_uint((ctx), (duk_uint_t) (val)) +#define duk_push_size_t(ctx,val) \ + duk_push_uint((ctx), (duk_uint_t) (val)) /* XXX: assumed to fit for now */ + +/* internal helper for looking up a tagged type */ +#define DUK_GETTAGGED_FLAG_ALLOW_NULL (1L << 24) +#define DUK_GETTAGGED_FLAG_CHECK_CLASS (1L << 25) +#define DUK_GETTAGGED_CLASS_SHIFT 16 + +DUK_INTERNAL_DECL duk_heaphdr *duk_get_tagged_heaphdr_raw(duk_context *ctx, duk_idx_t index, duk_uint_t flags_and_tag); + +DUK_INTERNAL_DECL duk_hstring *duk_get_hstring(duk_context *ctx, duk_idx_t index); +DUK_INTERNAL_DECL duk_hobject *duk_get_hobject(duk_context *ctx, duk_idx_t index); +DUK_INTERNAL_DECL duk_hbuffer *duk_get_hbuffer(duk_context *ctx, duk_idx_t index); +DUK_INTERNAL_DECL duk_hthread *duk_get_hthread(duk_context *ctx, duk_idx_t index); +DUK_INTERNAL_DECL duk_hcompiledfunction *duk_get_hcompiledfunction(duk_context *ctx, duk_idx_t index); +DUK_INTERNAL_DECL duk_hnativefunction *duk_get_hnativefunction(duk_context *ctx, duk_idx_t index); + +#define duk_get_hobject_with_class(ctx,index,classnum) \ + ((duk_hobject *) duk_get_tagged_heaphdr_raw((ctx), (index), \ + DUK_TAG_OBJECT | DUK_GETTAGGED_FLAG_ALLOW_NULL | \ + DUK_GETTAGGED_FLAG_CHECK_CLASS | ((classnum) << DUK_GETTAGGED_CLASS_SHIFT))) + +#if 0 /* This would be pointless: unexpected type and lightfunc would both return NULL */ +DUK_INTERNAL_DECL duk_hobject *duk_get_hobject_or_lfunc(duk_context *ctx, duk_idx_t index); +#endif +DUK_INTERNAL_DECL duk_hobject *duk_get_hobject_or_lfunc_coerce(duk_context *ctx, duk_idx_t index); + +#if 0 /*unused*/ +DUK_INTERNAL_DECL void *duk_get_voidptr(duk_context *ctx, duk_idx_t index); +#endif + +DUK_INTERNAL_DECL duk_hstring *duk_to_hstring(duk_context *ctx, duk_idx_t index); +DUK_INTERNAL_DECL duk_int_t duk_to_int_clamped_raw(duk_context *ctx, duk_idx_t index, duk_int_t minval, duk_int_t maxval, duk_bool_t *out_clamped); /* out_clamped=NULL, RangeError if outside range */ +DUK_INTERNAL_DECL duk_int_t duk_to_int_clamped(duk_context *ctx, duk_idx_t index, duk_int_t minval, duk_int_t maxval); +DUK_INTERNAL_DECL duk_int_t duk_to_int_check_range(duk_context *ctx, duk_idx_t index, duk_int_t minval, duk_int_t maxval); +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL_DECL duk_uint8_t duk_to_uint8clamped(duk_context *ctx, duk_idx_t index); +#endif + +DUK_INTERNAL_DECL duk_hstring *duk_require_hstring(duk_context *ctx, duk_idx_t index); +DUK_INTERNAL_DECL duk_hobject *duk_require_hobject(duk_context *ctx, duk_idx_t index); +DUK_INTERNAL_DECL duk_hbuffer *duk_require_hbuffer(duk_context *ctx, duk_idx_t index); +DUK_INTERNAL_DECL duk_hthread *duk_require_hthread(duk_context *ctx, duk_idx_t index); +DUK_INTERNAL_DECL duk_hcompiledfunction *duk_require_hcompiledfunction(duk_context *ctx, duk_idx_t index); +DUK_INTERNAL_DECL duk_hnativefunction *duk_require_hnativefunction(duk_context *ctx, duk_idx_t index); + +#define duk_require_hobject_with_class(ctx,index,classnum) \ + ((duk_hobject *) duk_get_tagged_heaphdr_raw((ctx), (index), \ + DUK_TAG_OBJECT | \ + DUK_GETTAGGED_FLAG_CHECK_CLASS | ((classnum) << DUK_GETTAGGED_CLASS_SHIFT))) + +DUK_INTERNAL_DECL duk_hobject *duk_require_hobject_or_lfunc(duk_context *ctx, duk_idx_t index); +DUK_INTERNAL_DECL duk_hobject *duk_require_hobject_or_lfunc_coerce(duk_context *ctx, duk_idx_t index); + +#if defined(DUK_USE_DEBUGGER_SUPPORT) +DUK_INTERNAL_DECL void duk_push_unused(duk_context *ctx); +#endif +DUK_INTERNAL_DECL void duk_push_hstring(duk_context *ctx, duk_hstring *h); +DUK_INTERNAL_DECL void duk_push_hstring_stridx(duk_context *ctx, duk_small_int_t stridx); +DUK_INTERNAL_DECL void duk_push_hobject(duk_context *ctx, duk_hobject *h); +DUK_INTERNAL_DECL void duk_push_hbuffer(duk_context *ctx, duk_hbuffer *h); +#define duk_push_hthread(ctx,h) \ + duk_push_hobject((ctx), (duk_hobject *) (h)) +#define duk_push_hcompiledfunction(ctx,h) \ + duk_push_hobject((ctx), (duk_hobject *) (h)) +#define duk_push_hnativefunction(ctx,h) \ + duk_push_hobject((ctx), (duk_hobject *) (h)) +DUK_INTERNAL_DECL void duk_push_hobject_bidx(duk_context *ctx, duk_small_int_t builtin_idx); +DUK_INTERNAL_DECL duk_idx_t duk_push_object_helper(duk_context *ctx, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx); +DUK_INTERNAL_DECL duk_idx_t duk_push_object_helper_proto(duk_context *ctx, duk_uint_t hobject_flags_and_class, duk_hobject *proto); +DUK_INTERNAL_DECL duk_idx_t duk_push_object_internal(duk_context *ctx); +DUK_INTERNAL_DECL duk_idx_t duk_push_compiledfunction(duk_context *ctx); +DUK_INTERNAL_DECL void duk_push_c_function_noexotic(duk_context *ctx, duk_c_function func, duk_int_t nargs); +DUK_INTERNAL_DECL void duk_push_c_function_noconstruct_noexotic(duk_context *ctx, duk_c_function func, duk_int_t nargs); + +DUK_INTERNAL_DECL void duk_push_string_funcptr(duk_context *ctx, duk_uint8_t *ptr, duk_size_t sz); +DUK_INTERNAL_DECL void duk_push_lightfunc_name(duk_context *ctx, duk_tval *tv); +DUK_INTERNAL_DECL void duk_push_lightfunc_tostring(duk_context *ctx, duk_tval *tv); +DUK_INTERNAL_DECL duk_hbufferobject *duk_push_bufferobject_raw(duk_context *ctx, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx); + +DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx); /* [] -> [val] */ +DUK_INTERNAL_DECL duk_bool_t duk_put_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx); /* [val] -> [] */ +DUK_INTERNAL_DECL duk_bool_t duk_del_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx); /* [] -> [] */ +DUK_INTERNAL_DECL duk_bool_t duk_has_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx); /* [] -> [] */ + +DUK_INTERNAL_DECL duk_bool_t duk_get_prop_stridx_boolean(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx, duk_bool_t *out_has_prop); /* [] -> [] */ + +DUK_INTERNAL_DECL void duk_xdef_prop(duk_context *ctx, duk_idx_t obj_index, duk_small_uint_t desc_flags); /* [key val] -> [] */ +DUK_INTERNAL_DECL void duk_xdef_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index, duk_small_uint_t desc_flags); /* [val] -> [] */ +DUK_INTERNAL_DECL void duk_xdef_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx, duk_small_uint_t desc_flags); /* [val] -> [] */ +DUK_INTERNAL_DECL void duk_xdef_prop_stridx_builtin(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx, duk_small_int_t builtin_idx, duk_small_uint_t desc_flags); /* [] -> [] */ +DUK_INTERNAL_DECL void duk_xdef_prop_stridx_thrower(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx, duk_small_uint_t desc_flags); /* [] -> [] */ + +/* These are macros for now, but could be separate functions to reduce code + * footprint (check call site count before refactoring). + */ +#define duk_xdef_prop_wec(ctx,obj_index) \ + duk_xdef_prop((ctx), (obj_index), DUK_PROPDESC_FLAGS_WEC) +#define duk_xdef_prop_index_wec(ctx,obj_index,arr_index) \ + duk_xdef_prop_index((ctx), (obj_index), (arr_index), DUK_PROPDESC_FLAGS_WEC) +#define duk_xdef_prop_stridx_wec(ctx,obj_index,stridx) \ + duk_xdef_prop_stridx((ctx), (obj_index), (stridx), DUK_PROPDESC_FLAGS_WEC) + +/* Set object 'length'. */ +DUK_INTERNAL_DECL void duk_set_length(duk_context *ctx, duk_idx_t index, duk_size_t length); + +#endif /* DUK_API_INTERNAL_H_INCLUDED */ diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_logging.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_logging.c new file mode 100644 index 00000000..aa9784f3 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_logging.c @@ -0,0 +1,52 @@ +/* + * Logging + * + * Current logging primitive is a sprintf-style log which is convenient + * for most C code. Another useful primitive would be to log N arguments + * from value stack (like the Ecmascript binding does). + */ + +#include "duk_internal.h" + +DUK_EXTERNAL void duk_log_va(duk_context *ctx, duk_int_t level, const char *fmt, va_list ap) { + /* stridx_logfunc[] must be static to allow initializer with old compilers like BCC */ + static const duk_uint16_t stridx_logfunc[6] = { + DUK_STRIDX_LC_TRACE, DUK_STRIDX_LC_DEBUG, DUK_STRIDX_LC_INFO, + DUK_STRIDX_LC_WARN, DUK_STRIDX_LC_ERROR, DUK_STRIDX_LC_FATAL + }; + + DUK_ASSERT_CTX_VALID(ctx); + + if (level < 0) { + level = 0; + } else if (level > (int) (sizeof(stridx_logfunc) / sizeof(duk_uint16_t)) - 1) { + level = (int) (sizeof(stridx_logfunc) / sizeof(duk_uint16_t)) - 1; + } + + duk_push_hobject_bidx(ctx, DUK_BIDX_LOGGER_CONSTRUCTOR); + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_CLOG); + duk_get_prop_stridx(ctx, -1, stridx_logfunc[level]); + duk_dup(ctx, -2); + + /* [ ... Logger clog logfunc clog ] */ + + duk_push_vsprintf(ctx, fmt, ap); + + /* [ ... Logger clog logfunc clog(=this) msg ] */ + + duk_call_method(ctx, 1 /*nargs*/); + + /* [ ... Logger clog res ] */ + + duk_pop_3(ctx); +} + +DUK_EXTERNAL void duk_log(duk_context *ctx, duk_int_t level, const char *fmt, ...) { + va_list ap; + + DUK_ASSERT_CTX_VALID(ctx); + + va_start(ap, fmt); + duk_log_va(ctx, level, fmt, ap); + va_end(ap); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_memory.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_memory.c new file mode 100644 index 00000000..f3e5b8eb --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_memory.c @@ -0,0 +1,103 @@ +/* + * Memory calls. + */ + +#include "duk_internal.h" + +DUK_EXTERNAL void *duk_alloc_raw(duk_context *ctx, duk_size_t size) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + + return DUK_ALLOC_RAW(thr->heap, size); +} + +DUK_EXTERNAL void duk_free_raw(duk_context *ctx, void *ptr) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + + DUK_FREE_RAW(thr->heap, ptr); +} + +DUK_EXTERNAL void *duk_realloc_raw(duk_context *ctx, void *ptr, duk_size_t size) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + + return DUK_REALLOC_RAW(thr->heap, ptr, size); +} + +DUK_EXTERNAL void *duk_alloc(duk_context *ctx, duk_size_t size) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + + return DUK_ALLOC(thr->heap, size); +} + +DUK_EXTERNAL void duk_free(duk_context *ctx, void *ptr) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + + DUK_FREE(thr->heap, ptr); +} + +DUK_EXTERNAL void *duk_realloc(duk_context *ctx, void *ptr, duk_size_t size) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + + /* + * Note: since this is an exposed API call, there should be + * no way a mark-and-sweep could have a side effect on the + * memory allocation behind 'ptr'; the pointer should never + * be something that Duktape wants to change. + * + * Thus, no need to use DUK_REALLOC_INDIRECT (and we don't + * have the storage location here anyway). + */ + + return DUK_REALLOC(thr->heap, ptr, size); +} + +DUK_EXTERNAL void duk_get_memory_functions(duk_context *ctx, duk_memory_functions *out_funcs) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_heap *heap; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(out_funcs != NULL); + DUK_ASSERT(thr != NULL); + DUK_ASSERT(thr->heap != NULL); + + heap = thr->heap; + out_funcs->alloc_func = heap->alloc_func; + out_funcs->realloc_func = heap->realloc_func; + out_funcs->free_func = heap->free_func; + out_funcs->udata = heap->heap_udata; +} + +DUK_EXTERNAL void duk_gc(duk_context *ctx, duk_uint_t flags) { +#ifdef DUK_USE_MARK_AND_SWEEP + duk_hthread *thr = (duk_hthread *) ctx; + duk_heap *heap; + + DUK_UNREF(flags); + + /* NULL accepted */ + if (!ctx) { + return; + } + DUK_ASSERT_CTX_VALID(ctx); + heap = thr->heap; + DUK_ASSERT(heap != NULL); + + DUK_D(DUK_DPRINT("mark-and-sweep requested by application")); + duk_heap_mark_and_sweep(heap, 0); +#else + DUK_D(DUK_DPRINT("mark-and-sweep requested by application but mark-and-sweep not enabled, ignoring")); + DUK_UNREF(ctx); + DUK_UNREF(flags); +#endif +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_object.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_object.c new file mode 100644 index 00000000..e482eb6c --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_object.c @@ -0,0 +1,590 @@ +/* + * Object handling: property access and other support functions. + */ + +#include "duk_internal.h" + +/* + * Property handling + * + * The API exposes only the most common property handling functions. + * The caller can invoke Ecmascript built-ins for full control (e.g. + * defineProperty, getOwnPropertyDescriptor). + */ + +DUK_EXTERNAL duk_bool_t duk_get_prop(duk_context *ctx, duk_idx_t obj_index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv_obj; + duk_tval *tv_key; + duk_bool_t rc; + + DUK_ASSERT_CTX_VALID(ctx); + + /* Note: copying tv_obj and tv_key to locals to shield against a valstack + * resize is not necessary for a property get right now. + */ + + tv_obj = duk_require_tval(ctx, obj_index); + tv_key = duk_require_tval(ctx, -1); + + rc = duk_hobject_getprop(thr, tv_obj, tv_key); + DUK_ASSERT(rc == 0 || rc == 1); + /* a value is left on stack regardless of rc */ + + duk_remove(ctx, -2); /* remove key */ + return rc; /* 1 if property found, 0 otherwise */ +} + +DUK_EXTERNAL duk_bool_t duk_get_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key) { + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(key != NULL); + + obj_index = duk_require_normalize_index(ctx, obj_index); + duk_push_string(ctx, key); + return duk_get_prop(ctx, obj_index); +} + +DUK_EXTERNAL duk_bool_t duk_get_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index) { + DUK_ASSERT_CTX_VALID(ctx); + + obj_index = duk_require_normalize_index(ctx, obj_index); + duk_push_uarridx(ctx, arr_index); + return duk_get_prop(ctx, obj_index); +} + +DUK_INTERNAL duk_bool_t duk_get_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT_DISABLE(stridx >= 0); + DUK_ASSERT(stridx < DUK_HEAP_NUM_STRINGS); + + obj_index = duk_require_normalize_index(ctx, obj_index); + duk_push_hstring(ctx, DUK_HTHREAD_GET_STRING(thr, stridx)); + return duk_get_prop(ctx, obj_index); +} + +DUK_INTERNAL duk_bool_t duk_get_prop_stridx_boolean(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx, duk_bool_t *out_has_prop) { + duk_bool_t rc; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT_DISABLE(stridx >= 0); + DUK_ASSERT(stridx < DUK_HEAP_NUM_STRINGS); + + rc = duk_get_prop_stridx(ctx, obj_index, stridx); + if (out_has_prop) { + *out_has_prop = rc; + } + rc = duk_to_boolean(ctx, -1); + DUK_ASSERT(rc == 0 || rc == 1); + duk_pop(ctx); + return rc; +} + +DUK_EXTERNAL duk_bool_t duk_put_prop(duk_context *ctx, duk_idx_t obj_index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv_obj; + duk_tval *tv_key; + duk_tval *tv_val; + duk_small_int_t throw_flag; + duk_bool_t rc; + + DUK_ASSERT_CTX_VALID(ctx); + + /* Note: copying tv_obj and tv_key to locals to shield against a valstack + * resize is not necessary for a property put right now (putprop protects + * against it internally). + */ + + tv_obj = duk_require_tval(ctx, obj_index); + tv_key = duk_require_tval(ctx, -2); + tv_val = duk_require_tval(ctx, -1); + throw_flag = duk_is_strict_call(ctx); + + rc = duk_hobject_putprop(thr, tv_obj, tv_key, tv_val, throw_flag); + DUK_ASSERT(rc == 0 || rc == 1); + + duk_pop_2(ctx); /* remove key and value */ + return rc; /* 1 if property found, 0 otherwise */ +} + +DUK_EXTERNAL duk_bool_t duk_put_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key) { + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(key != NULL); + + obj_index = duk_require_normalize_index(ctx, obj_index); + duk_push_string(ctx, key); + duk_swap_top(ctx, -2); /* [val key] -> [key val] */ + return duk_put_prop(ctx, obj_index); +} + +DUK_EXTERNAL duk_bool_t duk_put_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index) { + DUK_ASSERT_CTX_VALID(ctx); + + obj_index = duk_require_normalize_index(ctx, obj_index); + duk_push_uarridx(ctx, arr_index); + duk_swap_top(ctx, -2); /* [val key] -> [key val] */ + return duk_put_prop(ctx, obj_index); +} + +DUK_INTERNAL duk_bool_t duk_put_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT_DISABLE(stridx >= 0); + DUK_ASSERT(stridx < DUK_HEAP_NUM_STRINGS); + + obj_index = duk_require_normalize_index(ctx, obj_index); + duk_push_hstring(ctx, DUK_HTHREAD_GET_STRING(thr, stridx)); + duk_swap_top(ctx, -2); /* [val key] -> [key val] */ + return duk_put_prop(ctx, obj_index); +} + +DUK_EXTERNAL duk_bool_t duk_del_prop(duk_context *ctx, duk_idx_t obj_index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv_obj; + duk_tval *tv_key; + duk_small_int_t throw_flag; + duk_bool_t rc; + + DUK_ASSERT_CTX_VALID(ctx); + + /* Note: copying tv_obj and tv_key to locals to shield against a valstack + * resize is not necessary for a property delete right now. + */ + + tv_obj = duk_require_tval(ctx, obj_index); + tv_key = duk_require_tval(ctx, -1); + throw_flag = duk_is_strict_call(ctx); + + rc = duk_hobject_delprop(thr, tv_obj, tv_key, throw_flag); + DUK_ASSERT(rc == 0 || rc == 1); + + duk_pop(ctx); /* remove key */ + return rc; +} + +DUK_EXTERNAL duk_bool_t duk_del_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key) { + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(key != NULL); + + obj_index = duk_require_normalize_index(ctx, obj_index); + duk_push_string(ctx, key); + return duk_del_prop(ctx, obj_index); +} + +DUK_EXTERNAL duk_bool_t duk_del_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index) { + DUK_ASSERT_CTX_VALID(ctx); + + obj_index = duk_require_normalize_index(ctx, obj_index); + duk_push_uarridx(ctx, arr_index); + return duk_del_prop(ctx, obj_index); +} + +DUK_INTERNAL duk_bool_t duk_del_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT_DISABLE(stridx >= 0); + DUK_ASSERT(stridx < DUK_HEAP_NUM_STRINGS); + + obj_index = duk_require_normalize_index(ctx, obj_index); + duk_push_hstring(ctx, DUK_HTHREAD_GET_STRING(thr, stridx)); + return duk_del_prop(ctx, obj_index); +} + +DUK_EXTERNAL duk_bool_t duk_has_prop(duk_context *ctx, duk_idx_t obj_index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv_obj; + duk_tval *tv_key; + duk_bool_t rc; + + DUK_ASSERT_CTX_VALID(ctx); + + /* Note: copying tv_obj and tv_key to locals to shield against a valstack + * resize is not necessary for a property existence check right now. + */ + + tv_obj = duk_require_tval(ctx, obj_index); + tv_key = duk_require_tval(ctx, -1); + + rc = duk_hobject_hasprop(thr, tv_obj, tv_key); + DUK_ASSERT(rc == 0 || rc == 1); + + duk_pop(ctx); /* remove key */ + return rc; /* 1 if property found, 0 otherwise */ +} + +DUK_EXTERNAL duk_bool_t duk_has_prop_string(duk_context *ctx, duk_idx_t obj_index, const char *key) { + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(key != NULL); + + obj_index = duk_require_normalize_index(ctx, obj_index); + duk_push_string(ctx, key); + return duk_has_prop(ctx, obj_index); +} + +DUK_EXTERNAL duk_bool_t duk_has_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index) { + DUK_ASSERT_CTX_VALID(ctx); + + obj_index = duk_require_normalize_index(ctx, obj_index); + duk_push_uarridx(ctx, arr_index); + return duk_has_prop(ctx, obj_index); +} + +DUK_INTERNAL duk_bool_t duk_has_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT_DISABLE(stridx >= 0); + DUK_ASSERT(stridx < DUK_HEAP_NUM_STRINGS); + + obj_index = duk_require_normalize_index(ctx, obj_index); + duk_push_hstring(ctx, DUK_HTHREAD_GET_STRING(thr, stridx)); + return duk_has_prop(ctx, obj_index); +} + +/* Define own property without inheritance looks and such. This differs from + * [[DefineOwnProperty]] because special behaviors (like Array 'length') are + * not invoked by this method. The caller must be careful to invoke any such + * behaviors if necessary. + */ +DUK_INTERNAL void duk_xdef_prop(duk_context *ctx, duk_idx_t obj_index, duk_small_uint_t desc_flags) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *obj; + duk_hstring *key; + + DUK_ASSERT_CTX_VALID(ctx); + + obj = duk_require_hobject(ctx, obj_index); + DUK_ASSERT(obj != NULL); + key = duk_to_hstring(ctx, -2); + DUK_ASSERT(key != NULL); + DUK_ASSERT(duk_require_tval(ctx, -1) != NULL); + + duk_hobject_define_property_internal(thr, obj, key, desc_flags); + + duk_pop(ctx); /* pop key */ +} + +DUK_INTERNAL void duk_xdef_prop_index(duk_context *ctx, duk_idx_t obj_index, duk_uarridx_t arr_index, duk_small_uint_t desc_flags) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *obj; + + DUK_ASSERT_CTX_VALID(ctx); + + obj = duk_require_hobject(ctx, obj_index); + DUK_ASSERT(obj != NULL); + + duk_hobject_define_property_internal_arridx(thr, obj, arr_index, desc_flags); + /* value popped by call */ +} + +DUK_INTERNAL void duk_xdef_prop_stridx(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx, duk_small_uint_t desc_flags) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *obj; + duk_hstring *key; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT_DISABLE(stridx >= 0); + DUK_ASSERT(stridx < DUK_HEAP_NUM_STRINGS); + + obj = duk_require_hobject(ctx, obj_index); + DUK_ASSERT(obj != NULL); + key = DUK_HTHREAD_GET_STRING(thr, stridx); + DUK_ASSERT(key != NULL); + DUK_ASSERT(duk_require_tval(ctx, -1) != NULL); + + duk_hobject_define_property_internal(thr, obj, key, desc_flags); + /* value popped by call */ +} + +DUK_INTERNAL void duk_xdef_prop_stridx_builtin(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx, duk_small_int_t builtin_idx, duk_small_uint_t desc_flags) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *obj; + duk_hstring *key; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT_DISABLE(stridx >= 0); + DUK_ASSERT(stridx < DUK_HEAP_NUM_STRINGS); + DUK_ASSERT_DISABLE(builtin_idx >= 0); + DUK_ASSERT(builtin_idx < DUK_NUM_BUILTINS); + + obj = duk_require_hobject(ctx, obj_index); + DUK_ASSERT(obj != NULL); + key = DUK_HTHREAD_GET_STRING(thr, stridx); + DUK_ASSERT(key != NULL); + + duk_push_hobject(ctx, thr->builtins[builtin_idx]); + duk_hobject_define_property_internal(thr, obj, key, desc_flags); + /* value popped by call */ +} + +/* This is a rare property helper; it sets the global thrower (E5 Section 13.2.3) + * setter/getter into an object property. This is needed by the 'arguments' + * object creation code, function instance creation code, and Function.prototype.bind(). + */ + +DUK_INTERNAL void duk_xdef_prop_stridx_thrower(duk_context *ctx, duk_idx_t obj_index, duk_small_int_t stridx, duk_small_uint_t desc_flags) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *obj = duk_require_hobject(ctx, obj_index); + duk_hobject *thrower = thr->builtins[DUK_BIDX_TYPE_ERROR_THROWER]; + duk_hobject_define_accessor_internal(thr, obj, DUK_HTHREAD_GET_STRING(thr, stridx), thrower, thrower, desc_flags); +} + +/* Object.defineProperty() equivalent C binding. */ +DUK_EXTERNAL void duk_def_prop(duk_context *ctx, duk_idx_t obj_index, duk_uint_t flags) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_idx_t idx_base; + duk_hobject *obj; + duk_hstring *key; + duk_idx_t idx_value; + duk_hobject *get; + duk_hobject *set; + duk_uint_t is_data_desc; + duk_uint_t is_acc_desc; + + DUK_ASSERT_CTX_VALID(ctx); + + obj = duk_require_hobject(ctx, obj_index); + + is_data_desc = flags & (DUK_DEFPROP_HAVE_VALUE | DUK_DEFPROP_HAVE_WRITABLE); + is_acc_desc = flags & (DUK_DEFPROP_HAVE_GETTER | DUK_DEFPROP_HAVE_SETTER); + if (is_data_desc && is_acc_desc) { + /* "Have" flags must not be conflicting so that they would + * apply to both a plain property and an accessor at the same + * time. + */ + goto fail_invalid_desc; + } + + idx_base = duk_get_top_index(ctx); + if (flags & DUK_DEFPROP_HAVE_SETTER) { + duk_require_type_mask(ctx, idx_base, DUK_TYPE_MASK_UNDEFINED | + DUK_TYPE_MASK_OBJECT | + DUK_TYPE_MASK_LIGHTFUNC); + set = duk_get_hobject_or_lfunc_coerce(ctx, idx_base); + if (set != NULL && !DUK_HOBJECT_IS_CALLABLE(set)) { + goto fail_not_callable; + } + idx_base--; + } else { + set = NULL; + } + if (flags & DUK_DEFPROP_HAVE_GETTER) { + duk_require_type_mask(ctx, idx_base, DUK_TYPE_MASK_UNDEFINED | + DUK_TYPE_MASK_OBJECT | + DUK_TYPE_MASK_LIGHTFUNC); + get = duk_get_hobject_or_lfunc_coerce(ctx, idx_base); + if (get != NULL && !DUK_HOBJECT_IS_CALLABLE(get)) { + goto fail_not_callable; + } + idx_base--; + } else { + get = NULL; + } + if (flags & DUK_DEFPROP_HAVE_VALUE) { + idx_value = idx_base; + idx_base--; + } else { + idx_value = (duk_idx_t) -1; + } + key = duk_require_hstring(ctx, idx_base); + + duk_require_valid_index(ctx, idx_base); + + duk_hobject_define_property_helper(ctx, + flags /*defprop_flags*/, + obj, + key, + idx_value, + get, + set); + + /* Clean up stack */ + + duk_set_top(ctx, idx_base); + + /* [ ... obj ... ] */ + + return; + + fail_invalid_desc: + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_INVALID_DESCRIPTOR); + return; + + fail_not_callable: + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_CALLABLE); + return; +} + +/* + * Object related + * + * Note: seal() and freeze() are accessible through Ecmascript bindings, + * and are not exposed through the API. + */ + +DUK_EXTERNAL void duk_compact(duk_context *ctx, duk_idx_t obj_index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *obj; + + DUK_ASSERT_CTX_VALID(ctx); + + obj = duk_get_hobject(ctx, obj_index); + if (obj) { + /* Note: this may fail, caller should protect the call if necessary */ + duk_hobject_compact_props(thr, obj); + } +} + +/* XXX: the duk_hobject_enum.c stack APIs should be reworked */ + +DUK_EXTERNAL void duk_enum(duk_context *ctx, duk_idx_t obj_index, duk_uint_t enum_flags) { + DUK_ASSERT_CTX_VALID(ctx); + + duk_dup(ctx, obj_index); + duk_require_hobject_or_lfunc_coerce(ctx, -1); + duk_hobject_enumerator_create(ctx, enum_flags); /* [target] -> [enum] */ +} + +DUK_EXTERNAL duk_bool_t duk_next(duk_context *ctx, duk_idx_t enum_index, duk_bool_t get_value) { + DUK_ASSERT_CTX_VALID(ctx); + + duk_require_hobject(ctx, enum_index); + duk_dup(ctx, enum_index); + return duk_hobject_enumerator_next(ctx, get_value); +} + +/* + * Helpers for writing multiple properties + */ + +DUK_EXTERNAL void duk_put_function_list(duk_context *ctx, duk_idx_t obj_index, const duk_function_list_entry *funcs) { + const duk_function_list_entry *ent = funcs; + + DUK_ASSERT_CTX_VALID(ctx); + + obj_index = duk_require_normalize_index(ctx, obj_index); + if (ent != NULL) { + while (ent->key != NULL) { + duk_push_c_function(ctx, ent->value, ent->nargs); + duk_put_prop_string(ctx, obj_index, ent->key); + ent++; + } + } +} + +DUK_EXTERNAL void duk_put_number_list(duk_context *ctx, duk_idx_t obj_index, const duk_number_list_entry *numbers) { + const duk_number_list_entry *ent = numbers; + + DUK_ASSERT_CTX_VALID(ctx); + + obj_index = duk_require_normalize_index(ctx, obj_index); + if (ent != NULL) { + while (ent->key != NULL) { + duk_push_number(ctx, ent->value); + duk_put_prop_string(ctx, obj_index, ent->key); + ent++; + } + } +} + +/* + * Shortcut for accessing global object properties + */ + +DUK_EXTERNAL duk_bool_t duk_get_global_string(duk_context *ctx, const char *key) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_bool_t ret; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); + + /* XXX: direct implementation */ + + duk_push_hobject(ctx, thr->builtins[DUK_BIDX_GLOBAL]); + ret = duk_get_prop_string(ctx, -1, key); + duk_remove(ctx, -2); + return ret; +} + +DUK_EXTERNAL duk_bool_t duk_put_global_string(duk_context *ctx, const char *key) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_bool_t ret; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); + + /* XXX: direct implementation */ + + duk_push_hobject(ctx, thr->builtins[DUK_BIDX_GLOBAL]); + duk_insert(ctx, -2); + ret = duk_put_prop_string(ctx, -2, key); /* [ ... global val ] -> [ ... global ] */ + duk_pop(ctx); + return ret; +} + +/* + * Object prototype + */ + +DUK_EXTERNAL void duk_get_prototype(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *obj; + duk_hobject *proto; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_UNREF(thr); + + obj = duk_require_hobject(ctx, index); + DUK_ASSERT(obj != NULL); + + /* XXX: shared helper for duk_push_hobject_or_undefined()? */ + proto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, obj); + if (proto) { + duk_push_hobject(ctx, proto); + } else { + duk_push_undefined(ctx); + } +} + +DUK_EXTERNAL void duk_set_prototype(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *obj; + duk_hobject *proto; + + DUK_ASSERT_CTX_VALID(ctx); + + obj = duk_require_hobject(ctx, index); + DUK_ASSERT(obj != NULL); + duk_require_type_mask(ctx, -1, DUK_TYPE_MASK_UNDEFINED | + DUK_TYPE_MASK_OBJECT); + proto = duk_get_hobject(ctx, -1); + /* proto can also be NULL here (allowed explicitly) */ + + DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, obj, proto); + + duk_pop(ctx); +} + +/* + * Object finalizer + */ + +/* XXX: these could be implemented as macros calling an internal function + * directly. + * XXX: same issue as with Duktape.fin: there's no way to delete the property + * now (just set it to undefined). + */ +DUK_EXTERNAL void duk_get_finalizer(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + + duk_get_prop_stridx(ctx, index, DUK_STRIDX_INT_FINALIZER); +} + +DUK_EXTERNAL void duk_set_finalizer(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + + duk_put_prop_stridx(ctx, index, DUK_STRIDX_INT_FINALIZER); +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_stack.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_stack.c new file mode 100644 index 00000000..671d2b51 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_stack.c @@ -0,0 +1,4459 @@ +/* + * API calls related to general value stack manipulation: resizing the value + * stack, pushing and popping values, type checking and reading values, + * coercing values, etc. + * + * Also contains internal functions (such as duk_get_tval()), defined + * in duk_api_internal.h, with semantics similar to the public API. + */ + +/* XXX: repetition of stack pre-checks -> helper or macro or inline */ +/* XXX: shared api error strings, and perhaps even throw code for rare cases? */ + +#include "duk_internal.h" + +/* + * Forward declarations + */ + +DUK_LOCAL_DECL duk_idx_t duk__push_c_function_raw(duk_context *ctx, duk_c_function func, duk_idx_t nargs, duk_uint_t flags); + +/* + * Global state for working around missing variadic macros + */ + +#ifndef DUK_USE_VARIADIC_MACROS +DUK_EXTERNAL const char *duk_api_global_filename = NULL; +DUK_EXTERNAL duk_int_t duk_api_global_line = 0; +#endif + +/* + * Helpers + */ + +#if defined(DUK_USE_VALSTACK_UNSAFE) +/* Faster but value stack overruns are memory unsafe. */ +#define DUK__CHECK_SPACE() do { \ + DUK_ASSERT(!(thr->valstack_top >= thr->valstack_end)); \ + } while (0) +#else +#define DUK__CHECK_SPACE() do { \ + if (thr->valstack_top >= thr->valstack_end) { \ + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_PUSH_BEYOND_ALLOC_STACK); \ + } \ + } while (0) +#endif + +DUK_LOCAL duk_int_t duk__api_coerce_d2i(duk_context *ctx, duk_idx_t index, duk_bool_t require) { + duk_hthread *thr; + duk_tval *tv; + duk_small_int_t c; + duk_double_t d; + + thr = (duk_hthread *) ctx; + + tv = duk_get_tval(ctx, index); + if (tv == NULL) { + goto error_notnumber; + } + + /* + * Special cases like NaN and +/- Infinity are handled explicitly + * because a plain C coercion from double to int handles these cases + * in undesirable ways. For instance, NaN may coerce to INT_MIN + * (not zero), and INT_MAX + 1 may coerce to INT_MIN (not INT_MAX). + * + * This double-to-int coercion differs from ToInteger() because it + * has a finite range (ToInteger() allows e.g. +/- Infinity). It + * also differs from ToInt32() because the INT_MIN/INT_MAX clamping + * depends on the size of the int type on the platform. In particular, + * on platforms with a 64-bit int type, the full range is allowed. + */ + +#if defined(DUK_USE_FASTINT) + if (DUK_TVAL_IS_FASTINT(tv)) { + duk_int64_t t = DUK_TVAL_GET_FASTINT(tv); +#if (DUK_INT_MAX <= 0x7fffffffL) + /* Clamping only necessary for 32-bit ints. */ + if (t < DUK_INT_MIN) { + t = DUK_INT_MIN; + } else if (t > DUK_INT_MAX) { + t = DUK_INT_MAX; + } +#endif + return (duk_int_t) t; + } +#endif + + if (DUK_TVAL_IS_NUMBER(tv)) { + d = DUK_TVAL_GET_NUMBER(tv); + c = (duk_small_int_t) DUK_FPCLASSIFY(d); + if (c == DUK_FP_NAN) { + return 0; + } else if (d < (duk_double_t) DUK_INT_MIN) { + /* covers -Infinity */ + return DUK_INT_MIN; + } else if (d > (duk_double_t) DUK_INT_MAX) { + /* covers +Infinity */ + return DUK_INT_MAX; + } else { + /* coerce towards zero */ + return (duk_int_t) d; + } + } + + error_notnumber: + + if (require) { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_NUMBER); + /* not reachable */ + } + return 0; +} + +DUK_LOCAL duk_uint_t duk__api_coerce_d2ui(duk_context *ctx, duk_idx_t index, duk_bool_t require) { + duk_hthread *thr; + duk_tval *tv; + duk_small_int_t c; + duk_double_t d; + + /* Same as above but for unsigned int range. */ + + thr = (duk_hthread *) ctx; + + tv = duk_get_tval(ctx, index); + if (tv == NULL) { + goto error_notnumber; + } + +#if defined(DUK_USE_FASTINT) + if (DUK_TVAL_IS_FASTINT(tv)) { + duk_int64_t t = DUK_TVAL_GET_FASTINT(tv); + if (t < 0) { + t = 0; + } +#if (DUK_UINT_MAX <= 0xffffffffUL) + /* Clamping only necessary for 32-bit ints. */ + else if (t > DUK_UINT_MAX) { + t = DUK_UINT_MAX; + } +#endif + return (duk_uint_t) t; + } +#endif + + if (DUK_TVAL_IS_NUMBER(tv)) { + d = DUK_TVAL_GET_NUMBER(tv); + c = (duk_small_int_t) DUK_FPCLASSIFY(d); + if (c == DUK_FP_NAN) { + return 0; + } else if (d < 0.0) { + /* covers -Infinity */ + return (duk_uint_t) 0; + } else if (d > (duk_double_t) DUK_UINT_MAX) { + /* covers +Infinity */ + return (duk_uint_t) DUK_UINT_MAX; + } else { + /* coerce towards zero */ + return (duk_uint_t) d; + } + } + + error_notnumber: + + if (require) { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_NUMBER); + /* not reachable */ + } + return 0; +} + +/* + * Stack index validation/normalization and getting a stack duk_tval ptr. + * + * These are called by many API entrypoints so the implementations must be + * fast and "inlined". + * + * There's some repetition because of this; keep the functions in sync. + */ + +DUK_EXTERNAL duk_idx_t duk_normalize_index(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_idx_t vs_size; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(DUK_INVALID_INDEX < 0); + + /* Care must be taken to avoid pointer wrapping in the index + * validation. For instance, on a 32-bit platform with 8-byte + * duk_tval the index 0x20000000UL would wrap the memory space + * once. + */ + + /* Assume value stack sizes (in elements) fits into duk_idx_t. */ + vs_size = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); + DUK_ASSERT(vs_size >= 0); + + if (index < 0) { + index = vs_size + index; + if (DUK_UNLIKELY(index < 0)) { + /* Also catches index == DUK_INVALID_INDEX: vs_size >= 0 + * so that vs_size + DUK_INVALID_INDEX cannot underflow + * and will always be negative. + */ + return DUK_INVALID_INDEX; + } + } else { + /* since index non-negative */ + DUK_ASSERT(index != DUK_INVALID_INDEX); + + if (DUK_UNLIKELY(index >= vs_size)) { + return DUK_INVALID_INDEX; + } + } + + DUK_ASSERT(index >= 0); + DUK_ASSERT(index < vs_size); + return index; +} + +DUK_EXTERNAL duk_idx_t duk_require_normalize_index(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_idx_t vs_size; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(DUK_INVALID_INDEX < 0); + + vs_size = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); + DUK_ASSERT(vs_size >= 0); + + if (index < 0) { + index = vs_size + index; + if (DUK_UNLIKELY(index < 0)) { + goto invalid_index; + } + } else { + DUK_ASSERT(index != DUK_INVALID_INDEX); + if (DUK_UNLIKELY(index >= vs_size)) { + goto invalid_index; + } + } + + DUK_ASSERT(index >= 0); + DUK_ASSERT(index < vs_size); + return index; + + invalid_index: + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_INDEX); + return 0; /* unreachable */ +} + +DUK_INTERNAL duk_tval *duk_get_tval(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_idx_t vs_size; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(DUK_INVALID_INDEX < 0); + + vs_size = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); + DUK_ASSERT(vs_size >= 0); + + if (index < 0) { + index = vs_size + index; + if (DUK_UNLIKELY(index < 0)) { + return NULL; + } + } else { + DUK_ASSERT(index != DUK_INVALID_INDEX); + if (DUK_UNLIKELY(index >= vs_size)) { + return NULL; + } + } + + DUK_ASSERT(index >= 0); + DUK_ASSERT(index < vs_size); + return thr->valstack_bottom + index; +} + +DUK_INTERNAL duk_tval *duk_require_tval(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_idx_t vs_size; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(DUK_INVALID_INDEX < 0); + + vs_size = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); + DUK_ASSERT(vs_size >= 0); + + if (index < 0) { + index = vs_size + index; + if (DUK_UNLIKELY(index < 0)) { + goto invalid_index; + } + } else { + DUK_ASSERT(index != DUK_INVALID_INDEX); + if (DUK_UNLIKELY(index >= vs_size)) { + goto invalid_index; + } + } + + DUK_ASSERT(index >= 0); + DUK_ASSERT(index < vs_size); + return thr->valstack_bottom + index; + + invalid_index: + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_INDEX); + return NULL; +} + +/* Non-critical. */ +DUK_EXTERNAL duk_bool_t duk_is_valid_index(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(DUK_INVALID_INDEX < 0); + + return (duk_normalize_index(ctx, index) >= 0); +} + +/* Non-critical. */ +DUK_EXTERNAL void duk_require_valid_index(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(DUK_INVALID_INDEX < 0); + + if (duk_normalize_index(ctx, index) < 0) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_INDEX); + } +} + +/* + * Value stack top handling + */ + +DUK_EXTERNAL duk_idx_t duk_get_top(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + + return (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); +} + +/* set stack top within currently allocated range, but don't reallocate */ +DUK_EXTERNAL void duk_set_top(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_idx_t vs_size; + duk_idx_t vs_limit; + duk_idx_t count; + duk_tval tv_tmp; + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(DUK_INVALID_INDEX < 0); + + vs_size = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); + vs_limit = (duk_idx_t) (thr->valstack_end - thr->valstack_bottom); + + if (index < 0) { + /* Negative indices are always within allocated stack but + * must not go below zero index. + */ + index = vs_size + index; + if (index < 0) { + /* Also catches index == DUK_INVALID_INDEX. */ + goto invalid_index; + } + } else { + /* Positive index can be higher than valstack top but must + * not go above allocated stack (equality is OK). + */ + if (index > vs_limit) { + goto invalid_index; + } + } + DUK_ASSERT(index >= 0); + DUK_ASSERT(index <= vs_limit); + + if (index >= vs_size) { + /* Stack size increases or stays the same. Fill the new + * entries (if any) with undefined. No pointer stability + * issues here so we can use a running pointer. + */ + + tv = thr->valstack_top; + count = index - vs_size; + DUK_ASSERT(count >= 0); + while (count > 0) { + /* no need to decref previous or new value */ + count--; + DUK_ASSERT(DUK_TVAL_IS_UNDEFINED_UNUSED(tv)); + DUK_TVAL_SET_UNDEFINED_ACTUAL(tv); + tv++; + } + thr->valstack_top = tv; + } else { + /* Stack size decreases, DECREF entries which are above the + * new top. Each DECREF potentially invalidates valstack + * pointers, so don't hold on to pointers. The valstack top + * must also be updated on every loop in case a GC is triggered. + */ + + /* XXX: Here it would be useful to have a DECREF macro which + * doesn't need a NULL check, and does refzero queueing without + * running the refzero algorithm. There would be no pointer + * instability in this case, and code could be inlined. After + * the loop, one call to refzero would be needed. + */ + + count = vs_size - index; + DUK_ASSERT(count > 0); + + while (count > 0) { + count--; + tv = --thr->valstack_top; /* tv -> value just before prev top value */ + DUK_ASSERT(tv >= thr->valstack_bottom); + DUK_TVAL_SET_TVAL(&tv_tmp, tv); + DUK_TVAL_SET_UNDEFINED_UNUSED(tv); + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ + + /* XXX: fast primitive to set a bunch of values to UNDEFINED_UNUSED */ + + } + } + return; + + invalid_index: + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_INDEX); +} + +DUK_EXTERNAL duk_idx_t duk_get_top_index(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_idx_t ret; + + DUK_ASSERT_CTX_VALID(ctx); + + ret = ((duk_idx_t) (thr->valstack_top - thr->valstack_bottom)) - 1; + if (DUK_UNLIKELY(ret < 0)) { + /* Return invalid index; if caller uses this without checking + * in another API call, the index won't map to a valid stack + * entry. + */ + return DUK_INVALID_INDEX; + } + return ret; +} + +DUK_EXTERNAL duk_idx_t duk_require_top_index(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_idx_t ret; + + DUK_ASSERT_CTX_VALID(ctx); + + ret = ((duk_idx_t) (thr->valstack_top - thr->valstack_bottom)) - 1; + if (DUK_UNLIKELY(ret < 0)) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_INDEX); + } + return ret; +} + +/* + * Value stack resizing. + * + * This resizing happens above the current "top": the value stack can be + * grown or shrunk, but the "top" is not affected. The value stack cannot + * be resized to a size below the current "top". + * + * The low level reallocation primitive must carefully recompute all value + * stack pointers, and must also work if ALL pointers are NULL. The resize + * is quite tricky because the valstack realloc may cause a mark-and-sweep, + * which may run finalizers. Running finalizers may resize the valstack + * recursively (the same value stack we're working on). So, after realloc + * returns, we know that the valstack "top" should still be the same (there + * should not be live values above the "top"), but its underlying size and + * pointer may have changed. + */ + +/* XXX: perhaps refactor this to allow caller to specify some parameters, or + * at least a 'compact' flag which skips any spare or round-up .. useful for + * emergency gc. + */ + +DUK_LOCAL duk_bool_t duk__resize_valstack(duk_context *ctx, duk_size_t new_size) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_ptrdiff_t old_bottom_offset; + duk_ptrdiff_t old_top_offset; + duk_ptrdiff_t old_end_offset_post; +#ifdef DUK_USE_DEBUG + duk_ptrdiff_t old_end_offset_pre; + duk_tval *old_valstack_pre; + duk_tval *old_valstack_post; +#endif + duk_tval *new_valstack; + duk_tval *p; + duk_size_t new_alloc_size; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + DUK_ASSERT(thr->valstack_bottom >= thr->valstack); + DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); + DUK_ASSERT(thr->valstack_end >= thr->valstack_top); + DUK_ASSERT((duk_size_t) (thr->valstack_top - thr->valstack) <= new_size); /* can't resize below 'top' */ + DUK_ASSERT(new_size <= thr->valstack_max); /* valstack limit caller has check, prevents wrapping */ + DUK_ASSERT(new_size <= DUK_SIZE_MAX / sizeof(duk_tval)); /* specific assert for wrapping */ + + /* get pointer offsets for tweaking below */ + old_bottom_offset = (((duk_uint8_t *) thr->valstack_bottom) - ((duk_uint8_t *) thr->valstack)); + old_top_offset = (((duk_uint8_t *) thr->valstack_top) - ((duk_uint8_t *) thr->valstack)); +#ifdef DUK_USE_DEBUG + old_end_offset_pre = (((duk_uint8_t *) thr->valstack_end) - ((duk_uint8_t *) thr->valstack)); /* not very useful, used for debugging */ + old_valstack_pre = thr->valstack; +#endif + + /* Allocate a new valstack. + * + * Note: cannot use a plain DUK_REALLOC() because a mark-and-sweep may + * invalidate the original thr->valstack base pointer inside the realloc + * process. See doc/memory-management.rst. + */ + + new_alloc_size = sizeof(duk_tval) * new_size; + new_valstack = (duk_tval *) DUK_REALLOC_INDIRECT(thr->heap, duk_hthread_get_valstack_ptr, (void *) thr, new_alloc_size); + if (!new_valstack) { + /* Because new_size != 0, if condition doesn't need to be + * (new_valstack != NULL || new_size == 0). + */ + DUK_ASSERT(new_size != 0); + DUK_D(DUK_DPRINT("failed to resize valstack to %lu entries (%lu bytes)", + (unsigned long) new_size, (unsigned long) new_alloc_size)); + return 0; + } + + /* Note: the realloc may have triggered a mark-and-sweep which may + * have resized our valstack internally. However, the mark-and-sweep + * MUST NOT leave the stack bottom/top in a different state. Particular + * assumptions and facts: + * + * - The thr->valstack pointer may be different after realloc, + * and the offset between thr->valstack_end <-> thr->valstack + * may have changed. + * - The offset between thr->valstack_bottom <-> thr->valstack + * and thr->valstack_top <-> thr->valstack MUST NOT have changed, + * because mark-and-sweep must adhere to a strict stack policy. + * In other words, logical bottom and top MUST NOT have changed. + * - All values above the top are unreachable but are initialized + * to UNDEFINED_UNUSED, up to the post-realloc valstack_end. + * - 'old_end_offset' must be computed after realloc to be correct. + */ + + DUK_ASSERT((((duk_uint8_t *) thr->valstack_bottom) - ((duk_uint8_t *) thr->valstack)) == old_bottom_offset); + DUK_ASSERT((((duk_uint8_t *) thr->valstack_top) - ((duk_uint8_t *) thr->valstack)) == old_top_offset); + + /* success, fixup pointers */ + old_end_offset_post = (((duk_uint8_t *) thr->valstack_end) - ((duk_uint8_t *) thr->valstack)); /* must be computed after realloc */ +#ifdef DUK_USE_DEBUG + old_valstack_post = thr->valstack; +#endif + thr->valstack = new_valstack; + thr->valstack_end = new_valstack + new_size; + thr->valstack_bottom = (duk_tval *) (void *) ((duk_uint8_t *) new_valstack + old_bottom_offset); + thr->valstack_top = (duk_tval *) (void *) ((duk_uint8_t *) new_valstack + old_top_offset); + + DUK_ASSERT(thr->valstack_bottom >= thr->valstack); + DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); + DUK_ASSERT(thr->valstack_end >= thr->valstack_top); + + /* useful for debugging */ +#ifdef DUK_USE_DEBUG + if (old_end_offset_pre != old_end_offset_post) { + DUK_D(DUK_DPRINT("valstack was resized during valstack_resize(), probably by mark-and-sweep; " + "end offset changed: %lu -> %lu", + (unsigned long) old_end_offset_pre, + (unsigned long) old_end_offset_post)); + } + if (old_valstack_pre != old_valstack_post) { + DUK_D(DUK_DPRINT("valstack pointer changed during valstack_resize(), probably by mark-and-sweep: %p -> %p", + (void *) old_valstack_pre, + (void *) old_valstack_post)); + } +#endif + + DUK_DD(DUK_DDPRINT("resized valstack to %lu elements (%lu bytes), bottom=%ld, top=%ld, " + "new pointers: start=%p end=%p bottom=%p top=%p", + (unsigned long) new_size, (unsigned long) new_alloc_size, + (long) (thr->valstack_bottom - thr->valstack), + (long) (thr->valstack_top - thr->valstack), + (void *) thr->valstack, (void *) thr->valstack_end, + (void *) thr->valstack_bottom, (void *) thr->valstack_top)); + + /* init newly allocated slots (only) */ + p = (duk_tval *) (void *) ((duk_uint8_t *) thr->valstack + old_end_offset_post); + while (p < thr->valstack_end) { + /* never executed if new size is smaller */ + DUK_TVAL_SET_UNDEFINED_UNUSED(p); + p++; + } + + /* assertion check: we maintain elements above top in known state */ +#ifdef DUK_USE_ASSERTIONS + p = thr->valstack_top; + while (p < thr->valstack_end) { + /* everything above old valstack top should be preinitialized now */ + DUK_ASSERT(DUK_TVAL_IS_UNDEFINED_UNUSED(p)); + p++; + } +#endif + return 1; +} + +DUK_INTERNAL +duk_bool_t duk_valstack_resize_raw(duk_context *ctx, + duk_size_t min_new_size, + duk_small_uint_t flags) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_size_t old_size; + duk_size_t new_size; + duk_bool_t is_shrink = 0; + duk_small_uint_t shrink_flag = (flags & DUK_VSRESIZE_FLAG_SHRINK); + duk_small_uint_t compact_flag = (flags & DUK_VSRESIZE_FLAG_COMPACT); + duk_small_uint_t throw_flag = (flags & DUK_VSRESIZE_FLAG_THROW); + + DUK_DDD(DUK_DDDPRINT("check valstack resize: min_new_size=%lu, curr_size=%ld, curr_top=%ld, " + "curr_bottom=%ld, shrink=%d, compact=%d, throw=%d", + (unsigned long) min_new_size, + (long) (thr->valstack_end - thr->valstack), + (long) (thr->valstack_top - thr->valstack), + (long) (thr->valstack_bottom - thr->valstack), + (int) shrink_flag, (int) compact_flag, (int) throw_flag)); + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + DUK_ASSERT(thr->valstack_bottom >= thr->valstack); + DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); + DUK_ASSERT(thr->valstack_end >= thr->valstack_top); + + old_size = (duk_size_t) (thr->valstack_end - thr->valstack); + + if (min_new_size <= old_size) { + is_shrink = 1; + if (!shrink_flag || + old_size - min_new_size < DUK_VALSTACK_SHRINK_THRESHOLD) { + DUK_DDD(DUK_DDDPRINT("no need to grow or shrink valstack")); + return 1; + } + } + + new_size = min_new_size; + if (!compact_flag) { + if (is_shrink) { + /* shrink case; leave some spare */ + new_size += DUK_VALSTACK_SHRINK_SPARE; + } + + /* round up roughly to next 'grow step' */ + new_size = (new_size / DUK_VALSTACK_GROW_STEP + 1) * DUK_VALSTACK_GROW_STEP; + } + + DUK_DD(DUK_DDPRINT("want to %s valstack: %lu -> %lu elements (min_new_size %lu)", + (const char *) (new_size > old_size ? "grow" : "shrink"), + (unsigned long) old_size, (unsigned long) new_size, + (unsigned long) min_new_size)); + + if (new_size > thr->valstack_max) { + /* Note: may be triggered even if minimal new_size would not reach the limit, + * plan limit accordingly (taking DUK_VALSTACK_GROW_STEP into account). + */ + if (throw_flag) { + DUK_ERROR(thr, DUK_ERR_RANGE_ERROR, DUK_STR_VALSTACK_LIMIT); + } else { + return 0; + } + } + + /* + * When resizing the valstack, a mark-and-sweep may be triggered for + * the allocation of the new valstack. If the mark-and-sweep needs + * to use our thread for something, it may cause *the same valstack* + * to be resized recursively. This happens e.g. when mark-and-sweep + * finalizers are called. This is taken into account carefully in + * duk__resize_valstack(). + * + * 'new_size' is known to be <= valstack_max, which ensures that + * size_t and pointer arithmetic won't wrap in duk__resize_valstack(). + */ + + if (!duk__resize_valstack(ctx, new_size)) { + if (is_shrink) { + DUK_DD(DUK_DDPRINT("valstack resize failed, but is a shrink, ignore")); + return 1; + } + + DUK_DD(DUK_DDPRINT("valstack resize failed")); + + if (throw_flag) { + DUK_ERROR(thr, DUK_ERR_ALLOC_ERROR, DUK_STR_FAILED_TO_EXTEND_VALSTACK); + } else { + return 0; + } + } + + DUK_DDD(DUK_DDDPRINT("valstack resize successful")); + return 1; +} + +DUK_EXTERNAL duk_bool_t duk_check_stack(duk_context *ctx, duk_idx_t extra) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_size_t min_new_size; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + + if (DUK_UNLIKELY(extra < 0)) { + /* Clamping to zero makes the API more robust to calling code + * calculation errors. + */ + extra = 0; + } + + min_new_size = (thr->valstack_top - thr->valstack) + extra + DUK_VALSTACK_INTERNAL_EXTRA; + return duk_valstack_resize_raw(ctx, + min_new_size, /* min_new_size */ + 0 /* no shrink */ | /* flags */ + 0 /* no compact */ | + 0 /* no throw */); +} + +DUK_EXTERNAL void duk_require_stack(duk_context *ctx, duk_idx_t extra) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_size_t min_new_size; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + + if (DUK_UNLIKELY(extra < 0)) { + /* Clamping to zero makes the API more robust to calling code + * calculation errors. + */ + extra = 0; + } + + min_new_size = (thr->valstack_top - thr->valstack) + extra + DUK_VALSTACK_INTERNAL_EXTRA; + (void) duk_valstack_resize_raw(ctx, + min_new_size, /* min_new_size */ + 0 /* no shrink */ | /* flags */ + 0 /* no compact */ | + DUK_VSRESIZE_FLAG_THROW); +} + +DUK_EXTERNAL duk_bool_t duk_check_stack_top(duk_context *ctx, duk_idx_t top) { + duk_size_t min_new_size; + + DUK_ASSERT_CTX_VALID(ctx); + + if (DUK_UNLIKELY(top < 0)) { + /* Clamping to zero makes the API more robust to calling code + * calculation errors. + */ + top = 0; + } + + min_new_size = top + DUK_VALSTACK_INTERNAL_EXTRA; + return duk_valstack_resize_raw(ctx, + min_new_size, /* min_new_size */ + 0 /* no shrink */ | /* flags */ + 0 /* no compact */ | + 0 /* no throw */); +} + +DUK_EXTERNAL void duk_require_stack_top(duk_context *ctx, duk_idx_t top) { + duk_size_t min_new_size; + + DUK_ASSERT_CTX_VALID(ctx); + + if (DUK_UNLIKELY(top < 0)) { + /* Clamping to zero makes the API more robust to calling code + * calculation errors. + */ + top = 0; + } + + min_new_size = top + DUK_VALSTACK_INTERNAL_EXTRA; + (void) duk_valstack_resize_raw(ctx, + min_new_size, /* min_new_size */ + 0 /* no shrink */ | /* flags */ + 0 /* no compact */ | + DUK_VSRESIZE_FLAG_THROW); +} + +/* + * Basic stack manipulation: swap, dup, insert, replace, etc + */ + +DUK_EXTERNAL void duk_swap(duk_context *ctx, duk_idx_t index1, duk_idx_t index2) { + duk_tval *tv1; + duk_tval *tv2; + duk_tval tv_tmp; + + DUK_ASSERT_CTX_VALID(ctx); + + tv1 = duk_require_tval(ctx, index1); + DUK_ASSERT(tv1 != NULL); + tv2 = duk_require_tval(ctx, index2); + DUK_ASSERT(tv2 != NULL); + + /* If tv1==tv2 this is a NOP, no check is needed */ + DUK_TVAL_SET_TVAL(&tv_tmp, tv1); + DUK_TVAL_SET_TVAL(tv1, tv2); + DUK_TVAL_SET_TVAL(tv2, &tv_tmp); +} + +DUK_EXTERNAL void duk_swap_top(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + + duk_swap(ctx, index, -1); +} + +DUK_EXTERNAL void duk_dup(duk_context *ctx, duk_idx_t from_index) { + duk_hthread *thr; + duk_tval *tv_from; + duk_tval *tv_to; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + + tv_from = duk_require_tval(ctx, from_index); + tv_to = thr->valstack_top++; + DUK_ASSERT(tv_from != NULL); + DUK_ASSERT(tv_to != NULL); + DUK_TVAL_SET_TVAL(tv_to, tv_from); + DUK_TVAL_INCREF(thr, tv_to); /* no side effects */ +} + +DUK_EXTERNAL void duk_dup_top(duk_context *ctx) { + duk_hthread *thr; + duk_tval *tv_from; + duk_tval *tv_to; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + + if (thr->valstack_top - thr->valstack_bottom <= 0) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_INDEX); + } + tv_from = thr->valstack_top - 1; + tv_to = thr->valstack_top++; + DUK_ASSERT(tv_from != NULL); + DUK_ASSERT(tv_to != NULL); + DUK_TVAL_SET_TVAL(tv_to, tv_from); + DUK_TVAL_INCREF(thr, tv_to); /* no side effects */ +} + +DUK_EXTERNAL void duk_insert(duk_context *ctx, duk_idx_t to_index) { + duk_tval *p; + duk_tval *q; + duk_tval tv_tmp; + duk_size_t nbytes; + + DUK_ASSERT_CTX_VALID(ctx); + + p = duk_require_tval(ctx, to_index); + DUK_ASSERT(p != NULL); + q = duk_require_tval(ctx, -1); + DUK_ASSERT(q != NULL); + + DUK_ASSERT(q >= p); + + /* nbytes + * <---------> + * [ ... | p | x | x | q ] + * => [ ... | q | p | x | x ] + */ + + nbytes = (duk_size_t) (((duk_uint8_t *) q) - ((duk_uint8_t *) p)); /* Note: 'q' is top-1 */ + + DUK_DDD(DUK_DDDPRINT("duk_insert: to_index=%ld, p=%p, q=%p, nbytes=%lu", + (long) to_index, (void *) p, (void *) q, (unsigned long) nbytes)); + + /* No net refcount changes. */ + + if (nbytes > 0) { + DUK_TVAL_SET_TVAL(&tv_tmp, q); + DUK_ASSERT(nbytes > 0); + DUK_MEMMOVE((void *) (p + 1), (void *) p, nbytes); + DUK_TVAL_SET_TVAL(p, &tv_tmp); + } else { + /* nop: insert top to top */ + DUK_ASSERT(nbytes == 0); + DUK_ASSERT(p == q); + } +} + +DUK_EXTERNAL void duk_replace(duk_context *ctx, duk_idx_t to_index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv1; + duk_tval *tv2; + duk_tval tv_tmp; + + DUK_ASSERT_CTX_VALID(ctx); + + tv1 = duk_require_tval(ctx, -1); + DUK_ASSERT(tv1 != NULL); + tv2 = duk_require_tval(ctx, to_index); + DUK_ASSERT(tv2 != NULL); + + /* For tv1 == tv2, both pointing to stack top, the end result + * is same as duk_pop(ctx). + */ + + DUK_TVAL_SET_TVAL(&tv_tmp, tv2); + DUK_TVAL_SET_TVAL(tv2, tv1); + DUK_TVAL_SET_UNDEFINED_UNUSED(tv1); + thr->valstack_top--; + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ +} + +DUK_EXTERNAL void duk_copy(duk_context *ctx, duk_idx_t from_index, duk_idx_t to_index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv1; + duk_tval *tv2; + duk_tval tv_tmp; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_UNREF(thr); /* w/o refcounting */ + + tv1 = duk_require_tval(ctx, from_index); + DUK_ASSERT(tv1 != NULL); + tv2 = duk_require_tval(ctx, to_index); + DUK_ASSERT(tv2 != NULL); + + /* For tv1 == tv2, this is a no-op (no explicit check needed). */ + + DUK_TVAL_SET_TVAL(&tv_tmp, tv2); + DUK_TVAL_SET_TVAL(tv2, tv1); + DUK_TVAL_INCREF(thr, tv2); /* no side effects */ + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ +} + +DUK_EXTERNAL void duk_remove(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *p; + duk_tval *q; +#ifdef DUK_USE_REFERENCE_COUNTING + duk_tval tv_tmp; +#endif + duk_size_t nbytes; + + DUK_ASSERT_CTX_VALID(ctx); + + p = duk_require_tval(ctx, index); + DUK_ASSERT(p != NULL); + q = duk_require_tval(ctx, -1); + DUK_ASSERT(q != NULL); + + DUK_ASSERT(q >= p); + + /* nbytes zero size case + * <---------> + * [ ... | p | x | x | q ] [ ... | p==q ] + * => [ ... | x | x | q ] [ ... ] + */ + +#ifdef DUK_USE_REFERENCE_COUNTING + /* use a temp: decref only when valstack reachable values are correct */ + DUK_TVAL_SET_TVAL(&tv_tmp, p); +#endif + + nbytes = (duk_size_t) (((duk_uint8_t *) q) - ((duk_uint8_t *) p)); /* Note: 'q' is top-1 */ + DUK_MEMMOVE(p, p + 1, nbytes); /* zero size not an issue: pointers are valid */ + + DUK_TVAL_SET_UNDEFINED_UNUSED(q); + thr->valstack_top--; + +#ifdef DUK_USE_REFERENCE_COUNTING + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ +#endif +} + +/* + * Stack slice primitives + */ + +DUK_EXTERNAL void duk_xcopymove_raw(duk_context *to_ctx, duk_context *from_ctx, duk_idx_t count, duk_bool_t is_copy) { + duk_hthread *to_thr = (duk_hthread *) to_ctx; + duk_hthread *from_thr = (duk_hthread *) from_ctx; + void *src; + duk_size_t nbytes; + duk_tval *p; + duk_tval *q; + + /* XXX: several pointer comparison issues here */ + + DUK_ASSERT_CTX_VALID(to_ctx); + DUK_ASSERT_CTX_VALID(from_ctx); + DUK_ASSERT(to_ctx != NULL); + DUK_ASSERT(from_ctx != NULL); + + if (to_ctx == from_ctx) { + DUK_ERROR(to_thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_CONTEXT); + return; + } + if ((count < 0) || + (count > (duk_idx_t) to_thr->valstack_max)) { + /* Maximum value check ensures 'nbytes' won't wrap below. */ + DUK_ERROR(to_thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_COUNT); + return; + } + + nbytes = sizeof(duk_tval) * count; + if (nbytes == 0) { + return; + } + DUK_ASSERT(to_thr->valstack_top <= to_thr->valstack_end); + if ((duk_size_t) ((duk_uint8_t *) to_thr->valstack_end - (duk_uint8_t *) to_thr->valstack_top) < nbytes) { + DUK_ERROR(to_thr, DUK_ERR_API_ERROR, DUK_STR_PUSH_BEYOND_ALLOC_STACK); + } + src = (void *) ((duk_uint8_t *) from_thr->valstack_top - nbytes); + if (src < (void *) from_thr->valstack_bottom) { + DUK_ERROR(to_thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_COUNT); + } + + /* copy values (no overlap even if to_ctx == from_ctx; that's not + * allowed now anyway) + */ + DUK_ASSERT(nbytes > 0); + DUK_MEMCPY((void *) to_thr->valstack_top, src, nbytes); + + p = to_thr->valstack_top; + to_thr->valstack_top = (duk_tval *) (void *) (((duk_uint8_t *) p) + nbytes); + + if (is_copy) { + /* incref copies, keep originals */ + q = to_thr->valstack_top; + while (p < q) { + DUK_TVAL_INCREF(to_thr, p); /* no side effects */ + p++; + } + } else { + /* no net refcount change */ + p = from_thr->valstack_top; + q = (duk_tval *) (void *) (((duk_uint8_t *) p) - nbytes); + from_thr->valstack_top = q; + + /* elements above stack top are kept UNUSED */ + while (p > q) { + p--; + DUK_TVAL_SET_UNDEFINED_UNUSED(p); + + /* XXX: fast primitive to set a bunch of values to UNDEFINED_UNUSED */ + } + } +} + +/* + * Get/require + */ + +DUK_EXTERNAL void duk_require_undefined(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_UNDEFINED(tv)) { + /* Note: accept both 'actual' and 'unused' undefined */ + return; + } + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_UNDEFINED); +} + +DUK_EXTERNAL void duk_require_null(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_NULL(tv)) { + return; + } + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_NULL); + return; /* not reachable */ +} + +DUK_EXTERNAL duk_bool_t duk_get_boolean(duk_context *ctx, duk_idx_t index) { + duk_bool_t ret = 0; /* default: false */ + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_BOOLEAN(tv)) { + ret = DUK_TVAL_GET_BOOLEAN(tv); + } + + DUK_ASSERT(ret == 0 || ret == 1); + return ret; +} + +DUK_EXTERNAL duk_bool_t duk_require_boolean(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_BOOLEAN(tv)) { + duk_bool_t ret = DUK_TVAL_GET_BOOLEAN(tv); + DUK_ASSERT(ret == 0 || ret == 1); + return ret; + } + + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_BOOLEAN); + return 0; /* not reachable */ +} + +DUK_EXTERNAL duk_double_t duk_get_number(duk_context *ctx, duk_idx_t index) { + duk_double_union ret; + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + ret.d = DUK_DOUBLE_NAN; /* default: NaN */ + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_NUMBER(tv)) { + ret.d = DUK_TVAL_GET_NUMBER(tv); + } + + /* + * Number should already be in NaN-normalized form, but let's + * normalize anyway. + */ + + DUK_DBLUNION_NORMALIZE_NAN_CHECK(&ret); + return ret.d; +} + +DUK_EXTERNAL duk_double_t duk_require_number(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_NUMBER(tv)) { + duk_double_union ret; + ret.d = DUK_TVAL_GET_NUMBER(tv); + + /* + * Number should already be in NaN-normalized form, + * but let's normalize anyway. + */ + + DUK_DBLUNION_NORMALIZE_NAN_CHECK(&ret); + return ret.d; + } + + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_NUMBER); + return DUK_DOUBLE_NAN; /* not reachable */ +} + +DUK_EXTERNAL duk_int_t duk_get_int(duk_context *ctx, duk_idx_t index) { + /* Custom coercion for API */ + DUK_ASSERT_CTX_VALID(ctx); + return (duk_int_t) duk__api_coerce_d2i(ctx, index, 0 /*require*/); +} + +DUK_EXTERNAL duk_uint_t duk_get_uint(duk_context *ctx, duk_idx_t index) { + /* Custom coercion for API */ + DUK_ASSERT_CTX_VALID(ctx); + return (duk_uint_t) duk__api_coerce_d2ui(ctx, index, 0 /*require*/); +} + +DUK_EXTERNAL duk_int_t duk_require_int(duk_context *ctx, duk_idx_t index) { + /* Custom coercion for API */ + DUK_ASSERT_CTX_VALID(ctx); + return (duk_int_t) duk__api_coerce_d2i(ctx, index, 1 /*require*/); +} + +DUK_EXTERNAL duk_uint_t duk_require_uint(duk_context *ctx, duk_idx_t index) { + /* Custom coercion for API */ + DUK_ASSERT_CTX_VALID(ctx); + return (duk_uint_t) duk__api_coerce_d2ui(ctx, index, 1 /*require*/); +} + +DUK_EXTERNAL const char *duk_get_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len) { + const char *ret; + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + /* default: NULL, length 0 */ + ret = NULL; + if (out_len) { + *out_len = 0; + } + + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_STRING(tv)) { + /* Here we rely on duk_hstring instances always being zero + * terminated even if the actual string is not. + */ + duk_hstring *h = DUK_TVAL_GET_STRING(tv); + DUK_ASSERT(h != NULL); + ret = (const char *) DUK_HSTRING_GET_DATA(h); + if (out_len) { + *out_len = DUK_HSTRING_GET_BYTELEN(h); + } + } + + return ret; +} + +DUK_EXTERNAL const char *duk_require_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len) { + duk_hthread *thr = (duk_hthread *) ctx; + const char *ret; + + DUK_ASSERT_CTX_VALID(ctx); + + /* Note: this check relies on the fact that even a zero-size string + * has a non-NULL pointer. + */ + ret = duk_get_lstring(ctx, index, out_len); + if (ret) { + return ret; + } + + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_STRING); + return NULL; /* not reachable */ +} + +DUK_EXTERNAL const char *duk_get_string(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + + return duk_get_lstring(ctx, index, NULL); +} + +DUK_EXTERNAL const char *duk_require_string(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + + return duk_require_lstring(ctx, index, NULL); +} + +DUK_EXTERNAL void *duk_get_pointer(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_POINTER(tv)) { + void *p = DUK_TVAL_GET_POINTER(tv); /* may be NULL */ + return (void *) p; + } + + return NULL; +} + +DUK_EXTERNAL void *duk_require_pointer(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + /* Note: here we must be wary of the fact that a pointer may be + * valid and be a NULL. + */ + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_POINTER(tv)) { + void *p = DUK_TVAL_GET_POINTER(tv); /* may be NULL */ + return (void *) p; + } + + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_POINTER); + return NULL; /* not reachable */ +} + +#if 0 /*unused*/ +DUK_INTERNAL void *duk_get_voidptr(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_HEAP_ALLOCATED(tv)) { + duk_heaphdr *h = DUK_TVAL_GET_HEAPHDR(tv); + DUK_ASSERT(h != NULL); + return (void *) h; + } + + return NULL; +} +#endif + +DUK_LOCAL void *duk__get_buffer_helper(duk_context *ctx, duk_idx_t index, duk_size_t *out_size, duk_bool_t throw_flag) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_UNREF(thr); + + if (out_size != NULL) { + *out_size = 0; + } + + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_BUFFER(tv)) { + duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); + DUK_ASSERT(h != NULL); + if (out_size) { + *out_size = DUK_HBUFFER_GET_SIZE(h); + } + return (void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h); /* may be NULL (but only if size is 0) */ + } + + if (throw_flag) { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_BUFFER); + } + return NULL; +} + +DUK_EXTERNAL void *duk_get_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size) { + return duk__get_buffer_helper(ctx, index, out_size, 0 /*throw_flag*/); +} + +DUK_EXTERNAL void *duk_require_buffer(duk_context *ctx, duk_idx_t index, duk_size_t *out_size) { + return duk__get_buffer_helper(ctx, index, out_size, 1 /*throw_flag*/); +} + +DUK_LOCAL void *duk__get_buffer_data_helper(duk_context *ctx, duk_idx_t index, duk_size_t *out_size, duk_bool_t throw_flag) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_UNREF(thr); + + if (out_size != NULL) { + *out_size = 0; + } + + tv = duk_get_tval(ctx, index); + if (tv == NULL) { + goto fail; + } + + if (DUK_TVAL_IS_BUFFER(tv)) { + duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); + DUK_ASSERT(h != NULL); + if (out_size) { + *out_size = DUK_HBUFFER_GET_SIZE(h); + } + return (void *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h); /* may be NULL (but only if size is 0) */ + } else if (DUK_TVAL_IS_OBJECT(tv)) { + duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h != NULL); + if (DUK_HOBJECT_IS_BUFFEROBJECT(h)) { + /* XXX: this is probably a useful shared helper: for a + * duk_hbufferobject, get a validated buffer pointer/length. + */ + duk_hbufferobject *h_bufobj = (duk_hbufferobject *) h; + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + + if (h_bufobj->buf != NULL && + DUK_HBUFFEROBJECT_VALID_SLICE(h_bufobj)) { + duk_uint8_t *p; + + p = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufobj->buf); + if (out_size != NULL) { + *out_size = (duk_size_t) h_bufobj->length; + } + return (void *) (p + h_bufobj->offset); + } + /* if slice not fully valid, treat as error */ + } + } + + fail: + if (throw_flag) { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_BUFFER); + } + return NULL; +} + +DUK_EXTERNAL void *duk_get_buffer_data(duk_context *ctx, duk_idx_t index, duk_size_t *out_size) { + return duk__get_buffer_data_helper(ctx, index, out_size, 0 /*throw_flag*/); +} + +DUK_EXTERNAL void *duk_require_buffer_data(duk_context *ctx, duk_idx_t index, duk_size_t *out_size) { + return duk__get_buffer_data_helper(ctx, index, out_size, 1 /*throw_flag*/); +} + +/* Raw helper for getting a value from the stack, checking its tag, and possible its object class. + * The tag cannot be a number because numbers don't have an internal tag in the packed representation. + */ +DUK_INTERNAL duk_heaphdr *duk_get_tagged_heaphdr_raw(duk_context *ctx, duk_idx_t index, duk_uint_t flags_and_tag) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + duk_small_uint_t tag = flags_and_tag & 0xffffU; /* tags can be up to 16 bits */ + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (tv && (DUK_TVAL_GET_TAG(tv) == tag)) { + duk_heaphdr *ret; + + /* Note: tag comparison in general doesn't work for numbers, + * but it does work for everything else (heap objects here). + */ + ret = DUK_TVAL_GET_HEAPHDR(tv); + DUK_ASSERT(ret != NULL); /* tagged null pointers should never occur */ + + /* If class check has been requested, tag must also be DUK_TAG_OBJECT. + * This allows us to just check the class check flag without checking + * the tag also. + */ + DUK_ASSERT((flags_and_tag & DUK_GETTAGGED_FLAG_CHECK_CLASS) == 0 || + tag == DUK_TAG_OBJECT); + + if ((flags_and_tag & DUK_GETTAGGED_FLAG_CHECK_CLASS) == 0 || /* no class check */ + (duk_int_t) DUK_HOBJECT_GET_CLASS_NUMBER((duk_hobject *) ret) == /* or class check matches */ + (duk_int_t) ((flags_and_tag >> DUK_GETTAGGED_CLASS_SHIFT) & 0xff)) { + return ret; + } + } + + if (flags_and_tag & DUK_GETTAGGED_FLAG_ALLOW_NULL) { + return (duk_heaphdr *) NULL; + } + + /* Formatting the tag number here is not very useful: the tag value + * is Duktape internal (not the same as DUK_TYPE_xxx) and even depends + * on the duk_tval layout. If anything, add a human readable type here. + */ + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_UNEXPECTED_TYPE); + return NULL; /* not reachable */ +} + +DUK_INTERNAL duk_hstring *duk_get_hstring(duk_context *ctx, duk_idx_t index) { + return (duk_hstring *) duk_get_tagged_heaphdr_raw(ctx, index, DUK_TAG_STRING | DUK_GETTAGGED_FLAG_ALLOW_NULL); +} + +DUK_INTERNAL duk_hstring *duk_require_hstring(duk_context *ctx, duk_idx_t index) { + return (duk_hstring *) duk_get_tagged_heaphdr_raw(ctx, index, DUK_TAG_STRING); +} + +DUK_INTERNAL duk_hobject *duk_get_hobject(duk_context *ctx, duk_idx_t index) { + return (duk_hobject *) duk_get_tagged_heaphdr_raw(ctx, index, DUK_TAG_OBJECT | DUK_GETTAGGED_FLAG_ALLOW_NULL); +} + +DUK_INTERNAL duk_hobject *duk_require_hobject(duk_context *ctx, duk_idx_t index) { + return (duk_hobject *) duk_get_tagged_heaphdr_raw(ctx, index, DUK_TAG_OBJECT); +} + +DUK_INTERNAL duk_hbuffer *duk_get_hbuffer(duk_context *ctx, duk_idx_t index) { + return (duk_hbuffer *) duk_get_tagged_heaphdr_raw(ctx, index, DUK_TAG_BUFFER | DUK_GETTAGGED_FLAG_ALLOW_NULL); +} + +DUK_INTERNAL duk_hbuffer *duk_require_hbuffer(duk_context *ctx, duk_idx_t index) { + return (duk_hbuffer *) duk_get_tagged_heaphdr_raw(ctx, index, DUK_TAG_BUFFER); +} + +DUK_INTERNAL duk_hthread *duk_get_hthread(duk_context *ctx, duk_idx_t index) { + duk_hobject *h = (duk_hobject *) duk_get_tagged_heaphdr_raw(ctx, index, DUK_TAG_OBJECT | DUK_GETTAGGED_FLAG_ALLOW_NULL); + if (h != NULL && !DUK_HOBJECT_IS_THREAD(h)) { + h = NULL; + } + return (duk_hthread *) h; +} + +DUK_INTERNAL duk_hthread *duk_require_hthread(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *h = (duk_hobject *) duk_get_tagged_heaphdr_raw(ctx, index, DUK_TAG_OBJECT); + DUK_ASSERT(h != NULL); + if (!DUK_HOBJECT_IS_THREAD(h)) { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_THREAD); + } + return (duk_hthread *) h; +} + +DUK_INTERNAL duk_hcompiledfunction *duk_get_hcompiledfunction(duk_context *ctx, duk_idx_t index) { + duk_hobject *h = (duk_hobject *) duk_get_tagged_heaphdr_raw(ctx, index, DUK_TAG_OBJECT | DUK_GETTAGGED_FLAG_ALLOW_NULL); + if (h != NULL && !DUK_HOBJECT_IS_COMPILEDFUNCTION(h)) { + h = NULL; + } + return (duk_hcompiledfunction *) h; +} + +DUK_INTERNAL duk_hcompiledfunction *duk_require_hcompiledfunction(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *h = (duk_hobject *) duk_get_tagged_heaphdr_raw(ctx, index, DUK_TAG_OBJECT); + DUK_ASSERT(h != NULL); + if (!DUK_HOBJECT_IS_COMPILEDFUNCTION(h)) { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_COMPILEDFUNCTION); + } + return (duk_hcompiledfunction *) h; +} + +DUK_INTERNAL duk_hnativefunction *duk_get_hnativefunction(duk_context *ctx, duk_idx_t index) { + duk_hobject *h = (duk_hobject *) duk_get_tagged_heaphdr_raw(ctx, index, DUK_TAG_OBJECT | DUK_GETTAGGED_FLAG_ALLOW_NULL); + if (h != NULL && !DUK_HOBJECT_IS_NATIVEFUNCTION(h)) { + h = NULL; + } + return (duk_hnativefunction *) h; +} + +DUK_INTERNAL duk_hnativefunction *duk_require_hnativefunction(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *h = (duk_hobject *) duk_get_tagged_heaphdr_raw(ctx, index, DUK_TAG_OBJECT); + DUK_ASSERT(h != NULL); + if (!DUK_HOBJECT_IS_NATIVEFUNCTION(h)) { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_NATIVEFUNCTION); + } + return (duk_hnativefunction *) h; +} + +DUK_EXTERNAL duk_c_function duk_get_c_function(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + duk_hobject *h; + duk_hnativefunction *f; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (!tv) { + return NULL; + } + if (!DUK_TVAL_IS_OBJECT(tv)) { + return NULL; + } + h = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h != NULL); + + if (!DUK_HOBJECT_IS_NATIVEFUNCTION(h)) { + return NULL; + } + DUK_ASSERT(DUK_HOBJECT_HAS_NATIVEFUNCTION(h)); + f = (duk_hnativefunction *) h; + + return f->func; +} + +DUK_EXTERNAL duk_c_function duk_require_c_function(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_c_function ret; + + DUK_ASSERT_CTX_VALID(ctx); + + ret = duk_get_c_function(ctx, index); + if (!ret) { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_C_FUNCTION); + } + return ret; +} + +DUK_EXTERNAL duk_context *duk_get_context(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + + return (duk_context *) duk_get_hthread(ctx, index); +} + +DUK_EXTERNAL duk_context *duk_require_context(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + + return (duk_context *) duk_require_hthread(ctx, index); +} + +DUK_EXTERNAL void *duk_get_heapptr(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + void *ret; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_HEAP_ALLOCATED(tv)) { + ret = (void *) DUK_TVAL_GET_HEAPHDR(tv); + DUK_ASSERT(ret != NULL); + return ret; + } + + return (void *) NULL; +} + +DUK_EXTERNAL void *duk_require_heapptr(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + void *ret; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + if (DUK_TVAL_IS_HEAP_ALLOCATED(tv)) { + ret = (void *) DUK_TVAL_GET_HEAPHDR(tv); + DUK_ASSERT(ret != NULL); + return ret; + } + + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_UNEXPECTED_TYPE); + return (void *) NULL; /* not reachable */ +} + +#if 0 +/* This would be pointless: we'd return NULL for both lightfuncs and + * unexpected types. + */ +duk_hobject *duk_get_hobject_or_lfunc(duk_context *ctx, duk_idx_t index) { +} +#endif + +/* Useful for internal call sites where we either expect an object (function) + * or a lightfunc. Accepts an object (returned as is) or a lightfunc (coerced + * to an object). Return value is NULL if value is neither an object nor a + * lightfunc. + */ +duk_hobject *duk_get_hobject_or_lfunc_coerce(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + if (DUK_TVAL_IS_OBJECT(tv)) { + return DUK_TVAL_GET_OBJECT(tv); + } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) { + duk_to_object(ctx, index); + return duk_require_hobject(ctx, index); + } + + return NULL; +} + +/* Useful for internal call sites where we either expect an object (function) + * or a lightfunc. Returns NULL for a lightfunc. + */ +DUK_INTERNAL duk_hobject *duk_require_hobject_or_lfunc(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + if (DUK_TVAL_IS_OBJECT(tv)) { + return DUK_TVAL_GET_OBJECT(tv); + } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) { + return NULL; + } + + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_UNEXPECTED_TYPE); + return NULL; /* not reachable */ +} + +/* Useful for internal call sites where we either expect an object (function) + * or a lightfunc. Accepts an object (returned as is) or a lightfunc (coerced + * to an object). Return value is never NULL. + */ +DUK_INTERNAL duk_hobject *duk_require_hobject_or_lfunc_coerce(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_require_tval(ctx, index); + if (DUK_TVAL_IS_OBJECT(tv)) { + return DUK_TVAL_GET_OBJECT(tv); + } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) { + duk_to_object(ctx, index); + return duk_require_hobject(ctx, index); + } + + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_UNEXPECTED_TYPE); + return NULL; /* not reachable */ +} + +DUK_EXTERNAL duk_size_t duk_get_length(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (!tv) { + return 0; + } + + switch (DUK_TVAL_GET_TAG(tv)) { + case DUK_TAG_UNDEFINED: + case DUK_TAG_NULL: + case DUK_TAG_BOOLEAN: + case DUK_TAG_POINTER: + return 0; + case DUK_TAG_STRING: { + duk_hstring *h = DUK_TVAL_GET_STRING(tv); + DUK_ASSERT(h != NULL); + return (duk_size_t) DUK_HSTRING_GET_CHARLEN(h); + } + case DUK_TAG_OBJECT: { + duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h != NULL); + return (duk_size_t) duk_hobject_get_length((duk_hthread *) ctx, h); + } + case DUK_TAG_BUFFER: { + duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); + DUK_ASSERT(h != NULL); + return (duk_size_t) DUK_HBUFFER_GET_SIZE(h); + } + case DUK_TAG_LIGHTFUNC: { + duk_small_uint_t lf_flags; + lf_flags = DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv); + return (duk_size_t) DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags); + } +#if defined(DUK_USE_FASTINT) + case DUK_TAG_FASTINT: +#endif + default: + /* number */ + DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); + return 0; + } + + DUK_UNREACHABLE(); +} + +DUK_INTERNAL void duk_set_length(duk_context *ctx, duk_idx_t index, duk_size_t length) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *h; + + DUK_ASSERT_CTX_VALID(ctx); + + h = duk_get_hobject(ctx, index); + if (!h) { + return; + } + + duk_hobject_set_length(thr, h, (duk_uint32_t) length); /* XXX: typing */ +} + +/* + * Conversions and coercions + * + * The conversion/coercions are in-place operations on the value stack. + * Some operations are implemented here directly, while others call a + * helper in duk_js_ops.c after validating arguments. + */ + +/* E5 Section 8.12.8 */ + +DUK_LOCAL duk_bool_t duk__defaultvalue_coerce_attempt(duk_context *ctx, duk_idx_t index, duk_small_int_t func_stridx) { + if (duk_get_prop_stridx(ctx, index, func_stridx)) { + /* [ ... func ] */ + if (duk_is_callable(ctx, -1)) { + duk_dup(ctx, index); /* -> [ ... func this ] */ + duk_call_method(ctx, 0); /* -> [ ... retval ] */ + if (duk_is_primitive(ctx, -1)) { + duk_replace(ctx, index); + return 1; + } + /* [ ... retval ]; popped below */ + } + } + duk_pop(ctx); /* [ ... func/retval ] -> [ ... ] */ + return 0; +} + +DUK_EXTERNAL void duk_to_defaultvalue(duk_context *ctx, duk_idx_t index, duk_int_t hint) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *obj; + /* inline initializer for coercers[] is not allowed by old compilers like BCC */ + duk_small_int_t coercers[2]; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + + coercers[0] = DUK_STRIDX_VALUE_OF; + coercers[1] = DUK_STRIDX_TO_STRING; + + index = duk_require_normalize_index(ctx, index); + obj = duk_require_hobject_or_lfunc(ctx, index); + + if (hint == DUK_HINT_NONE) { + if (obj != NULL && DUK_HOBJECT_GET_CLASS_NUMBER(obj) == DUK_HOBJECT_CLASS_DATE) { + hint = DUK_HINT_STRING; + } else { + hint = DUK_HINT_NUMBER; + } + } + + if (hint == DUK_HINT_STRING) { + coercers[0] = DUK_STRIDX_TO_STRING; + coercers[1] = DUK_STRIDX_VALUE_OF; + } + + if (duk__defaultvalue_coerce_attempt(ctx, index, coercers[0])) { + return; + } + + if (duk__defaultvalue_coerce_attempt(ctx, index, coercers[1])) { + return; + } + + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_DEFAULTVALUE_COERCE_FAILED); +} + +DUK_EXTERNAL void duk_to_undefined(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + duk_tval tv_tmp; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_UNREF(thr); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + DUK_TVAL_SET_TVAL(&tv_tmp, tv); + DUK_TVAL_SET_UNDEFINED_ACTUAL(tv); /* no need to incref */ + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ +} + +DUK_EXTERNAL void duk_to_null(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + duk_tval tv_tmp; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_UNREF(thr); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + DUK_TVAL_SET_TVAL(&tv_tmp, tv); + DUK_TVAL_SET_NULL(tv); /* no need to incref */ + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ +} + +/* E5 Section 9.1 */ +DUK_EXTERNAL void duk_to_primitive(duk_context *ctx, duk_idx_t index, duk_int_t hint) { + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(hint == DUK_HINT_NONE || hint == DUK_HINT_NUMBER || hint == DUK_HINT_STRING); + + index = duk_require_normalize_index(ctx, index); + + if (!duk_check_type_mask(ctx, index, DUK_TYPE_MASK_OBJECT | + DUK_TYPE_MASK_LIGHTFUNC)) { + /* everything except object stay as is */ + return; + } + duk_to_defaultvalue(ctx, index, hint); +} + +/* E5 Section 9.2 */ +DUK_EXTERNAL duk_bool_t duk_to_boolean(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + duk_tval tv_tmp; + duk_bool_t val; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_UNREF(thr); + + index = duk_require_normalize_index(ctx, index); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + + val = duk_js_toboolean(tv); + DUK_ASSERT(val == 0 || val == 1); + + /* Note: no need to re-lookup tv, conversion is side effect free */ + DUK_ASSERT(tv != NULL); + DUK_TVAL_SET_TVAL(&tv_tmp, tv); + DUK_TVAL_SET_BOOLEAN(tv, val); /* no need to incref */ + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ + return val; +} + +DUK_EXTERNAL duk_double_t duk_to_number(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + duk_tval tv_tmp; + duk_double_t d; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + /* XXX: fastint? */ + d = duk_js_tonumber(thr, tv); + + /* Note: need to re-lookup because ToNumber() may have side effects */ + tv = duk_require_tval(ctx, index); + DUK_TVAL_SET_TVAL(&tv_tmp, tv); + DUK_TVAL_SET_NUMBER(tv, d); /* no need to incref */ + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ + return d; +} + +/* XXX: combine all the integer conversions: they share everything + * but the helper function for coercion. + */ + +typedef duk_double_t (*duk__toint_coercer)(duk_hthread *thr, duk_tval *tv); + +DUK_LOCAL duk_double_t duk__to_int_uint_helper(duk_context *ctx, duk_idx_t index, duk__toint_coercer coerce_func) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + duk_tval tv_tmp; + duk_double_t d; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + d = coerce_func(thr, tv); + + /* XXX: fastint? */ + + /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */ + tv = duk_require_tval(ctx, index); + DUK_TVAL_SET_TVAL(&tv_tmp, tv); + DUK_TVAL_SET_NUMBER(tv, d); /* no need to incref */ + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ + return d; +} + +DUK_EXTERNAL duk_int_t duk_to_int(duk_context *ctx, duk_idx_t index) { + /* Value coercion (in stack): ToInteger(), E5 Section 9.4 + * API return value coercion: custom + */ + DUK_ASSERT_CTX_VALID(ctx); + (void) duk__to_int_uint_helper(ctx, index, duk_js_tointeger); + return (duk_int_t) duk__api_coerce_d2i(ctx, index, 0 /*require*/); +} + +DUK_EXTERNAL duk_uint_t duk_to_uint(duk_context *ctx, duk_idx_t index) { + /* Value coercion (in stack): ToInteger(), E5 Section 9.4 + * API return value coercion: custom + */ + DUK_ASSERT_CTX_VALID(ctx); + (void) duk__to_int_uint_helper(ctx, index, duk_js_tointeger); + return (duk_uint_t) duk__api_coerce_d2ui(ctx, index, 0 /*require*/); +} + +DUK_EXTERNAL duk_int32_t duk_to_int32(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + duk_tval tv_tmp; + duk_int32_t ret; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + ret = duk_js_toint32(thr, tv); + + /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */ + tv = duk_require_tval(ctx, index); +#if defined(DUK_USE_FASTINT) + DUK_TVAL_SET_TVAL(&tv_tmp, tv); + DUK_TVAL_SET_FASTINT_I32(tv, ret); /* no need to incref */ + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ + return ret; +#else + DUK_TVAL_SET_TVAL(&tv_tmp, tv); + DUK_TVAL_SET_NUMBER(tv, (duk_double_t) ret); /* no need to incref */ + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ + return ret; +#endif +} + +DUK_EXTERNAL duk_uint32_t duk_to_uint32(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + duk_tval tv_tmp; + duk_uint32_t ret; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + ret = duk_js_touint32(thr, tv); + + /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */ + tv = duk_require_tval(ctx, index); +#if defined(DUK_USE_FASTINT) + DUK_TVAL_SET_TVAL(&tv_tmp, tv); + DUK_TVAL_SET_FASTINT_U32(tv, ret); /* no need to incref */ + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ + return ret; +#else + DUK_TVAL_SET_TVAL(&tv_tmp, tv); + DUK_TVAL_SET_NUMBER(tv, (duk_double_t) ret); /* no need to incref */ + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ +#endif + return ret; +} + +DUK_EXTERNAL duk_uint16_t duk_to_uint16(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + duk_tval tv_tmp; + duk_uint16_t ret; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + ret = duk_js_touint16(thr, tv); + + /* Relookup in case coerce_func() has side effects, e.g. ends up coercing an object */ + tv = duk_require_tval(ctx, index); +#if defined(DUK_USE_FASTINT) + DUK_TVAL_SET_TVAL(&tv_tmp, tv); + DUK_TVAL_SET_FASTINT_U32(tv, ret); /* no need to incref */ + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ + return ret; +#else + DUK_TVAL_SET_TVAL(&tv_tmp, tv); + DUK_TVAL_SET_NUMBER(tv, (duk_double_t) ret); /* no need to incref */ + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ +#endif + return ret; +} + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +/* Special coercion for Uint8ClampedArray. */ +DUK_INTERNAL duk_uint8_t duk_to_uint8clamped(duk_context *ctx, duk_idx_t index) { + duk_double_t d; + duk_double_t t; + duk_uint8_t ret; + + /* XXX: Simplify this algorithm, should be possible to come up with + * a shorter and faster algorithm by inspecting IEEE representation + * directly. + */ + + d = duk_to_number(ctx, index); + if (d <= 0.0) { + return 0; + } else if (d >= 255) { + return 255; + } else if (DUK_ISNAN(d)) { + /* Avoid NaN-to-integer coercion as it is compiler specific. */ + return 0; + } + + t = d - DUK_FLOOR(d); + if (t == 0.5) { + /* Exact halfway, round to even. */ + ret = (duk_uint8_t) d; + ret = (ret + 1) & 0xfe; /* Example: d=3.5, t=0.5 -> ret = (3 + 1) & 0xfe = 4 & 0xfe = 4 + * Example: d=4.5, t=0.5 -> ret = (4 + 1) & 0xfe = 5 & 0xfe = 4 + */ + } else { + /* Not halfway, round to nearest. */ + ret = (duk_uint8_t) (d + 0.5); + } + return ret; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +DUK_EXTERNAL const char *duk_to_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len) { + DUK_ASSERT_CTX_VALID(ctx); + + (void) duk_to_string(ctx, index); + return duk_require_lstring(ctx, index, out_len); +} + +DUK_LOCAL duk_ret_t duk__safe_to_string_raw(duk_context *ctx) { + DUK_ASSERT_CTX_VALID(ctx); + + duk_to_string(ctx, -1); + return 1; +} + +DUK_EXTERNAL const char *duk_safe_to_lstring(duk_context *ctx, duk_idx_t index, duk_size_t *out_len) { + DUK_ASSERT_CTX_VALID(ctx); + + index = duk_require_normalize_index(ctx, index); + + /* We intentionally ignore the duk_safe_call() return value and only + * check the output type. This way we don't also need to check that + * the returned value is indeed a string in the success case. + */ + + duk_dup(ctx, index); + (void) duk_safe_call(ctx, duk__safe_to_string_raw, 1 /*nargs*/, 1 /*nrets*/); + if (!duk_is_string(ctx, -1)) { + /* Error: try coercing error to string once. */ + (void) duk_safe_call(ctx, duk__safe_to_string_raw, 1 /*nargs*/, 1 /*nrets*/); + if (!duk_is_string(ctx, -1)) { + /* Double error */ + duk_pop(ctx); + duk_push_hstring_stridx(ctx, DUK_STRIDX_UC_ERROR); + } else { + ; + } + } else { + ; + } + DUK_ASSERT(duk_is_string(ctx, -1)); + + duk_replace(ctx, index); + return duk_require_lstring(ctx, index, out_len); +} + +/* XXX: other variants like uint, u32 etc */ +DUK_INTERNAL duk_int_t duk_to_int_clamped_raw(duk_context *ctx, duk_idx_t index, duk_int_t minval, duk_int_t maxval, duk_bool_t *out_clamped) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + duk_tval tv_tmp; + duk_double_t d, dmin, dmax; + duk_int_t res; + duk_bool_t clamped = 0; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + d = duk_js_tointeger(thr, tv); /* E5 Section 9.4, ToInteger() */ + + dmin = (duk_double_t) minval; + dmax = (duk_double_t) maxval; + + if (d < dmin) { + clamped = 1; + res = minval; + d = dmin; + } else if (d > dmax) { + clamped = 1; + res = maxval; + d = dmax; + } else { + res = (duk_int_t) d; + } + /* 'd' and 'res' agree here */ + + /* Relookup in case duk_js_tointeger() ends up e.g. coercing an object. */ + tv = duk_require_tval(ctx, index); + DUK_TVAL_SET_TVAL(&tv_tmp, tv); +#if defined(DUK_USE_FASTINT) +#if (DUK_INT_MAX <= 0x7fffffffL) + DUK_TVAL_SET_FASTINT_I32(tv, res); +#else + /* Clamping needed if duk_int_t is 64 bits. */ + if (res >= DUK_FASTINT_MIN && res <= DUK_FASTINT_MAX) { + DUK_TVAL_SET_FASTINT(tv, res); + } else { + DUK_TVAL_SET_NUMBER(tv, d); + } +#endif +#else + DUK_TVAL_SET_NUMBER(tv, d); /* no need to incref */ +#endif + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ + + if (out_clamped) { + *out_clamped = clamped; + } else { + /* coerced value is updated to value stack even when RangeError thrown */ + if (clamped) { + DUK_ERROR(thr, DUK_ERR_RANGE_ERROR, DUK_STR_NUMBER_OUTSIDE_RANGE); + } + } + + return res; +} + +DUK_INTERNAL duk_int_t duk_to_int_clamped(duk_context *ctx, duk_idx_t index, duk_idx_t minval, duk_idx_t maxval) { + duk_bool_t dummy; + return duk_to_int_clamped_raw(ctx, index, minval, maxval, &dummy); +} + +DUK_INTERNAL duk_int_t duk_to_int_check_range(duk_context *ctx, duk_idx_t index, duk_int_t minval, duk_int_t maxval) { + return duk_to_int_clamped_raw(ctx, index, minval, maxval, NULL); /* out_clamped==NULL -> RangeError if outside range */ +} + +DUK_EXTERNAL const char *duk_to_string(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_UNREF(thr); + + index = duk_require_normalize_index(ctx, index); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + + switch (DUK_TVAL_GET_TAG(tv)) { + case DUK_TAG_UNDEFINED: { + duk_push_hstring_stridx(ctx, DUK_STRIDX_LC_UNDEFINED); + break; + } + case DUK_TAG_NULL: { + duk_push_hstring_stridx(ctx, DUK_STRIDX_LC_NULL); + break; + } + case DUK_TAG_BOOLEAN: { + if (DUK_TVAL_GET_BOOLEAN(tv)) { + duk_push_hstring_stridx(ctx, DUK_STRIDX_TRUE); + } else { + duk_push_hstring_stridx(ctx, DUK_STRIDX_FALSE); + } + break; + } + case DUK_TAG_STRING: { + /* nop */ + goto skip_replace; + } + case DUK_TAG_OBJECT: { + duk_to_primitive(ctx, index, DUK_HINT_STRING); + return duk_to_string(ctx, index); /* Note: recursive call */ + } + case DUK_TAG_BUFFER: { + duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); + + /* Note: this allows creation of internal strings. */ + + DUK_ASSERT(h != NULL); + duk_push_lstring(ctx, + (const char *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h), + (duk_size_t) DUK_HBUFFER_GET_SIZE(h)); + break; + } + case DUK_TAG_POINTER: { + void *ptr = DUK_TVAL_GET_POINTER(tv); + if (ptr != NULL) { + duk_push_sprintf(ctx, DUK_STR_FMT_PTR, (void *) ptr); + } else { + /* Represent a null pointer as 'null' to be consistent with + * the JX format variant. Native '%p' format for a NULL + * pointer may be e.g. '(nil)'. + */ + duk_push_hstring_stridx(ctx, DUK_STRIDX_LC_NULL); + } + break; + } + case DUK_TAG_LIGHTFUNC: { + /* Should match Function.prototype.toString() */ + duk_push_lightfunc_tostring(ctx, tv); + break; + } +#if defined(DUK_USE_FASTINT) + case DUK_TAG_FASTINT: +#endif + default: { + /* number */ + DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); + duk_push_tval(ctx, tv); + duk_numconv_stringify(ctx, + 10 /*radix*/, + 0 /*precision:shortest*/, + 0 /*force_exponential*/); + break; + } + } + + duk_replace(ctx, index); + + skip_replace: + return duk_require_string(ctx, index); +} + +DUK_INTERNAL duk_hstring *duk_to_hstring(duk_context *ctx, duk_idx_t index) { + duk_hstring *ret; + DUK_ASSERT_CTX_VALID(ctx); + duk_to_string(ctx, index); + ret = duk_get_hstring(ctx, index); + DUK_ASSERT(ret != NULL); + return ret; +} + +DUK_EXTERNAL void *duk_to_buffer_raw(duk_context *ctx, duk_idx_t index, duk_size_t *out_size, duk_uint_t mode) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hbuffer *h_buf; + const duk_uint8_t *src_data; + duk_size_t src_size; + duk_uint8_t *dst_data; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_UNREF(thr); + + index = duk_require_normalize_index(ctx, index); + + h_buf = duk_get_hbuffer(ctx, index); + if (h_buf != NULL) { + /* Buffer is kept as is, with the fixed/dynamic nature of the + * buffer only changed if requested. An external buffer + * is converted into a non-external dynamic buffer in a + * duk_to_dynamic_buffer() call. + */ + duk_uint_t tmp; + + src_data = (const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_buf); + src_size = DUK_HBUFFER_GET_SIZE(h_buf); + + tmp = (DUK_HBUFFER_HAS_DYNAMIC(h_buf) ? DUK_BUF_MODE_DYNAMIC : DUK_BUF_MODE_FIXED); + if ((tmp == mode && !DUK_HBUFFER_HAS_EXTERNAL(h_buf)) || + mode == DUK_BUF_MODE_DONTCARE) { + /* Note: src_data may be NULL if input is a zero-size + * dynamic buffer. + */ + dst_data = (duk_uint8_t *) src_data; + goto skip_copy; + } + } else { + /* Non-buffer value is first ToString() coerced, then converted + * to a buffer (fixed buffer is used unless a dynamic buffer is + * explicitly requested). + */ + + src_data = (const duk_uint8_t *) duk_to_lstring(ctx, index, &src_size); + } + + dst_data = (duk_uint8_t *) duk_push_buffer(ctx, src_size, (mode == DUK_BUF_MODE_DYNAMIC) /*dynamic*/); + if (DUK_LIKELY(src_size > 0)) { + /* When src_size == 0, src_data may be NULL (if source + * buffer is dynamic), and dst_data may be NULL (if + * target buffer is dynamic). Avoid zero-size memcpy() + * with an invalid pointer. + */ + DUK_MEMCPY(dst_data, src_data, src_size); + } + duk_replace(ctx, index); + skip_copy: + + if (out_size) { + *out_size = src_size; + } + return dst_data; +} + +DUK_EXTERNAL void *duk_to_pointer(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + void *res; + + DUK_ASSERT_CTX_VALID(ctx); + + index = duk_require_normalize_index(ctx, index); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + + switch (DUK_TVAL_GET_TAG(tv)) { + case DUK_TAG_UNDEFINED: + case DUK_TAG_NULL: + case DUK_TAG_BOOLEAN: + res = NULL; + break; + case DUK_TAG_POINTER: + res = DUK_TVAL_GET_POINTER(tv); + break; + case DUK_TAG_STRING: + case DUK_TAG_OBJECT: + case DUK_TAG_BUFFER: + /* Heap allocated: return heap pointer which is NOT useful + * for the caller, except for debugging. + */ + res = (void *) DUK_TVAL_GET_HEAPHDR(tv); + break; + case DUK_TAG_LIGHTFUNC: + /* Function pointers do not always cast correctly to void * + * (depends on memory and segmentation model for instance), + * so they coerce to NULL. + */ + res = NULL; + break; +#if defined(DUK_USE_FASTINT) + case DUK_TAG_FASTINT: +#endif + default: + /* number */ + res = NULL; + break; + } + + duk_push_pointer(ctx, res); + duk_replace(ctx, index); + return res; +} + +DUK_EXTERNAL void duk_to_object(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + duk_uint_t flags = 0; /* shared flags for a subset of types */ + duk_small_int_t proto = 0; + + DUK_ASSERT_CTX_VALID(ctx); + + index = duk_require_normalize_index(ctx, index); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + + switch (DUK_TVAL_GET_TAG(tv)) { + case DUK_TAG_UNDEFINED: + case DUK_TAG_NULL: { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_OBJECT_COERCIBLE); + break; + } + case DUK_TAG_BOOLEAN: { + flags = DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_BOOLEAN); + proto = DUK_BIDX_BOOLEAN_PROTOTYPE; + goto create_object; + } + case DUK_TAG_STRING: { + flags = DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_EXOTIC_STRINGOBJ | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_STRING); + proto = DUK_BIDX_STRING_PROTOTYPE; + goto create_object; + } + case DUK_TAG_OBJECT: { + /* nop */ + break; + } + case DUK_TAG_BUFFER: { + /* A plain buffer coerces to a Duktape.Buffer because it's the + * object counterpart of the plain buffer value. But it might + * still make more sense to produce an ArrayBuffer here? + */ + + duk_hbufferobject *h_bufobj; + duk_hbuffer *h_val; + + h_val = DUK_TVAL_GET_BUFFER(tv); + DUK_ASSERT(h_val != NULL); + + h_bufobj = duk_push_bufferobject_raw(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_BUFFEROBJECT | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_BUFFER), + DUK_BIDX_BUFFER_PROTOTYPE); + DUK_ASSERT(h_bufobj != NULL); + DUK_ASSERT(DUK_HOBJECT_HAS_EXTENSIBLE((duk_hobject *) h_bufobj)); + DUK_ASSERT(DUK_HOBJECT_IS_BUFFEROBJECT((duk_hobject *) h_bufobj)); + + h_bufobj->buf = h_val; + DUK_HBUFFER_INCREF(thr, h_val); + DUK_ASSERT(h_bufobj->offset == 0); + h_bufobj->length = (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_val); + DUK_ASSERT(h_bufobj->shift == 0); + DUK_ASSERT(h_bufobj->elem_type == DUK_HBUFFEROBJECT_ELEM_UINT8); + + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + goto replace_value; + } + case DUK_TAG_POINTER: { + flags = DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_POINTER); + proto = DUK_BIDX_POINTER_PROTOTYPE; + goto create_object; + } + case DUK_TAG_LIGHTFUNC: { + /* Lightfunc coerces to a Function instance with concrete + * properties. Since 'length' is virtual for Duktape/C + * functions, don't need to define that. + * + * The result is made extensible to mimic what happens to + * strings: + * > Object.isExtensible(Object('foo')) + * true + */ + duk_small_uint_t lf_flags; + duk_small_uint_t nargs; + duk_small_uint_t lf_len; + duk_c_function func; + duk_hnativefunction *nf; + + DUK_TVAL_GET_LIGHTFUNC(tv, func, lf_flags); + + nargs = DUK_LFUNC_FLAGS_GET_NARGS(lf_flags); + if (nargs == DUK_LFUNC_NARGS_VARARGS) { + nargs = DUK_VARARGS; + } + flags = DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_CONSTRUCTABLE | + DUK_HOBJECT_FLAG_NATIVEFUNCTION | + DUK_HOBJECT_FLAG_NEWENV | + DUK_HOBJECT_FLAG_STRICT | + DUK_HOBJECT_FLAG_NOTAIL | + /* DUK_HOBJECT_FLAG_EXOTIC_DUKFUNC: omitted here intentionally */ + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION); + (void) duk__push_c_function_raw(ctx, func, (duk_idx_t) nargs, flags); + + lf_len = DUK_LFUNC_FLAGS_GET_LENGTH(lf_flags); + if (lf_len != nargs) { + /* Explicit length is only needed if it differs from 'nargs'. */ + duk_push_int(ctx, (duk_int_t) lf_len); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_NONE); + } + duk_push_lightfunc_name(ctx, tv); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_NONE); + + nf = duk_get_hnativefunction(ctx, -1); + DUK_ASSERT(nf != NULL); + nf->magic = (duk_int16_t) DUK_LFUNC_FLAGS_GET_MAGIC(lf_flags); + + /* Enable DUKFUNC exotic behavior once properties are set up. */ + DUK_HOBJECT_SET_EXOTIC_DUKFUNC((duk_hobject *) nf); + goto replace_value; + } +#if defined(DUK_USE_FASTINT) + case DUK_TAG_FASTINT: +#endif + default: { + flags = DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_NUMBER); + proto = DUK_BIDX_NUMBER_PROTOTYPE; + goto create_object; + } + } + return; + + create_object: + (void) duk_push_object_helper(ctx, flags, proto); + + /* Note: Boolean prototype's internal value property is not writable, + * but duk_xdef_prop_stridx() disregards the write protection. Boolean + * instances are immutable. + * + * String and buffer special behaviors are already enabled which is not + * ideal, but a write to the internal value is not affected by them. + */ + duk_dup(ctx, index); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE); + + replace_value: + duk_replace(ctx, index); +} + +/* + * Type checking + */ + +DUK_LOCAL duk_bool_t duk__tag_check(duk_context *ctx, duk_idx_t index, duk_small_uint_t tag) { + duk_tval *tv; + + tv = duk_get_tval(ctx, index); + if (!tv) { + return 0; + } + return (DUK_TVAL_GET_TAG(tv) == tag); +} + +DUK_LOCAL duk_bool_t duk__obj_flag_any_default_false(duk_context *ctx, duk_idx_t index, duk_uint_t flag_mask) { + duk_hobject *obj; + + DUK_ASSERT_CTX_VALID(ctx); + + obj = duk_get_hobject(ctx, index); + if (obj) { + return (DUK_HEAPHDR_CHECK_FLAG_BITS((duk_heaphdr *) obj, flag_mask) ? 1 : 0); + } + return 0; +} + +DUK_EXTERNAL duk_int_t duk_get_type(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (!tv) { + return DUK_TYPE_NONE; + } + switch (DUK_TVAL_GET_TAG(tv)) { + case DUK_TAG_UNDEFINED: + return DUK_TYPE_UNDEFINED; + case DUK_TAG_NULL: + return DUK_TYPE_NULL; + case DUK_TAG_BOOLEAN: + return DUK_TYPE_BOOLEAN; + case DUK_TAG_STRING: + return DUK_TYPE_STRING; + case DUK_TAG_OBJECT: + return DUK_TYPE_OBJECT; + case DUK_TAG_BUFFER: + return DUK_TYPE_BUFFER; + case DUK_TAG_POINTER: + return DUK_TYPE_POINTER; + case DUK_TAG_LIGHTFUNC: + return DUK_TYPE_LIGHTFUNC; +#if defined(DUK_USE_FASTINT) + case DUK_TAG_FASTINT: +#endif + default: + /* Note: number has no explicit tag (in 8-byte representation) */ + DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); + return DUK_TYPE_NUMBER; + } + DUK_UNREACHABLE(); +} + +DUK_EXTERNAL duk_bool_t duk_check_type(duk_context *ctx, duk_idx_t index, duk_int_t type) { + DUK_ASSERT_CTX_VALID(ctx); + + return (duk_get_type(ctx, index) == type) ? 1 : 0; +} + +DUK_EXTERNAL duk_uint_t duk_get_type_mask(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (!tv) { + return DUK_TYPE_MASK_NONE; + } + switch (DUK_TVAL_GET_TAG(tv)) { + case DUK_TAG_UNDEFINED: + return DUK_TYPE_MASK_UNDEFINED; + case DUK_TAG_NULL: + return DUK_TYPE_MASK_NULL; + case DUK_TAG_BOOLEAN: + return DUK_TYPE_MASK_BOOLEAN; + case DUK_TAG_STRING: + return DUK_TYPE_MASK_STRING; + case DUK_TAG_OBJECT: + return DUK_TYPE_MASK_OBJECT; + case DUK_TAG_BUFFER: + return DUK_TYPE_MASK_BUFFER; + case DUK_TAG_POINTER: + return DUK_TYPE_MASK_POINTER; + case DUK_TAG_LIGHTFUNC: + return DUK_TYPE_MASK_LIGHTFUNC; +#if defined(DUK_USE_FASTINT) + case DUK_TAG_FASTINT: +#endif + default: + /* Note: number has no explicit tag (in 8-byte representation) */ + DUK_ASSERT(DUK_TVAL_IS_NUMBER(tv)); + return DUK_TYPE_MASK_NUMBER; + } + DUK_UNREACHABLE(); +} + +DUK_EXTERNAL duk_bool_t duk_check_type_mask(duk_context *ctx, duk_idx_t index, duk_uint_t mask) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + + if (duk_get_type_mask(ctx, index) & mask) { + return 1; + } + if (mask & DUK_TYPE_MASK_THROW) { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_UNEXPECTED_TYPE); + DUK_UNREACHABLE(); + } + return 0; +} + +DUK_EXTERNAL duk_bool_t duk_is_undefined(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + return duk__tag_check(ctx, index, DUK_TAG_UNDEFINED); +} + +DUK_EXTERNAL duk_bool_t duk_is_null(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + return duk__tag_check(ctx, index, DUK_TAG_NULL); +} + +DUK_EXTERNAL duk_bool_t duk_is_null_or_undefined(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + duk_small_uint_t tag; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (!tv) { + return 0; + } + tag = DUK_TVAL_GET_TAG(tv); + return (tag == DUK_TAG_UNDEFINED) || (tag == DUK_TAG_NULL); +} + +DUK_EXTERNAL duk_bool_t duk_is_boolean(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + return duk__tag_check(ctx, index, DUK_TAG_BOOLEAN); +} + +DUK_EXTERNAL duk_bool_t duk_is_number(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + /* + * Number is special because it doesn't have a specific + * tag in the 8-byte representation. + */ + + /* XXX: shorter version for 12-byte representation? */ + + tv = duk_get_tval(ctx, index); + if (!tv) { + return 0; + } + return DUK_TVAL_IS_NUMBER(tv); +} + +DUK_EXTERNAL duk_bool_t duk_is_nan(duk_context *ctx, duk_idx_t index) { + /* XXX: This will now return false for non-numbers, even though they would + * coerce to NaN (as a general rule). In particular, duk_get_number() + * returns a NaN for non-numbers, so should this function also return + * true for non-numbers? + */ + + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (!tv || !DUK_TVAL_IS_NUMBER(tv)) { + return 0; + } + return DUK_ISNAN(DUK_TVAL_GET_NUMBER(tv)); +} + +DUK_EXTERNAL duk_bool_t duk_is_string(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + return duk__tag_check(ctx, index, DUK_TAG_STRING); +} + +DUK_EXTERNAL duk_bool_t duk_is_object(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + return duk__tag_check(ctx, index, DUK_TAG_OBJECT); +} + +DUK_EXTERNAL duk_bool_t duk_is_buffer(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + return duk__tag_check(ctx, index, DUK_TAG_BUFFER); +} + +DUK_EXTERNAL duk_bool_t duk_is_pointer(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + return duk__tag_check(ctx, index, DUK_TAG_POINTER); +} + +DUK_EXTERNAL duk_bool_t duk_is_lightfunc(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + return duk__tag_check(ctx, index, DUK_TAG_LIGHTFUNC); +} + +DUK_EXTERNAL duk_bool_t duk_is_array(duk_context *ctx, duk_idx_t index) { + duk_hobject *obj; + + DUK_ASSERT_CTX_VALID(ctx); + + obj = duk_get_hobject(ctx, index); + if (obj) { + return (DUK_HOBJECT_GET_CLASS_NUMBER(obj) == DUK_HOBJECT_CLASS_ARRAY ? 1 : 0); + } + return 0; +} + +DUK_EXTERNAL duk_bool_t duk_is_function(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_LIGHTFUNC(tv)) { + return 1; + } + return duk__obj_flag_any_default_false(ctx, + index, + DUK_HOBJECT_FLAG_COMPILEDFUNCTION | + DUK_HOBJECT_FLAG_NATIVEFUNCTION | + DUK_HOBJECT_FLAG_BOUND); +} + +DUK_EXTERNAL duk_bool_t duk_is_c_function(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + return duk__obj_flag_any_default_false(ctx, + index, + DUK_HOBJECT_FLAG_NATIVEFUNCTION); +} + +DUK_EXTERNAL duk_bool_t duk_is_ecmascript_function(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + return duk__obj_flag_any_default_false(ctx, + index, + DUK_HOBJECT_FLAG_COMPILEDFUNCTION); +} + +DUK_EXTERNAL duk_bool_t duk_is_bound_function(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + return duk__obj_flag_any_default_false(ctx, + index, + DUK_HOBJECT_FLAG_BOUND); +} + +DUK_EXTERNAL duk_bool_t duk_is_thread(duk_context *ctx, duk_idx_t index) { + DUK_ASSERT_CTX_VALID(ctx); + return duk__obj_flag_any_default_false(ctx, + index, + DUK_HOBJECT_FLAG_THREAD); +} + +DUK_EXTERNAL duk_bool_t duk_is_callable(duk_context *ctx, duk_idx_t index) { + /* XXX: currently same as duk_is_function() */ + DUK_ASSERT_CTX_VALID(ctx); + return duk_is_function(ctx, index); +} + +DUK_EXTERNAL duk_bool_t duk_is_fixed_buffer(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_BUFFER(tv)) { + duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); + DUK_ASSERT(h != NULL); + return (DUK_HBUFFER_HAS_DYNAMIC(h) ? 0 : 1); + } + return 0; +} + +DUK_EXTERNAL duk_bool_t duk_is_dynamic_buffer(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_BUFFER(tv)) { + duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); + DUK_ASSERT(h != NULL); + return (DUK_HBUFFER_HAS_DYNAMIC(h) && !DUK_HBUFFER_HAS_EXTERNAL(h) ? 1 : 0); + } + return 0; +} + +DUK_EXTERNAL duk_bool_t duk_is_external_buffer(duk_context *ctx, duk_idx_t index) { + duk_tval *tv; + + DUK_ASSERT_CTX_VALID(ctx); + + tv = duk_get_tval(ctx, index); + if (tv && DUK_TVAL_IS_BUFFER(tv)) { + duk_hbuffer *h = DUK_TVAL_GET_BUFFER(tv); + DUK_ASSERT(h != NULL); + return (DUK_HBUFFER_HAS_DYNAMIC(h) && DUK_HBUFFER_HAS_EXTERNAL(h) ? 1 : 0); + } + return 0; +} + +DUK_EXTERNAL duk_errcode_t duk_get_error_code(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *h; + duk_uint_t sanity; + + DUK_ASSERT_CTX_VALID(ctx); + + h = duk_get_hobject(ctx, index); + + sanity = DUK_HOBJECT_PROTOTYPE_CHAIN_SANITY; + do { + if (!h) { + return DUK_ERR_NONE; + } + if (h == thr->builtins[DUK_BIDX_EVAL_ERROR_PROTOTYPE]) { + return DUK_ERR_EVAL_ERROR; + } + if (h == thr->builtins[DUK_BIDX_RANGE_ERROR_PROTOTYPE]) { + return DUK_ERR_RANGE_ERROR; + } + if (h == thr->builtins[DUK_BIDX_REFERENCE_ERROR_PROTOTYPE]) { + return DUK_ERR_REFERENCE_ERROR; + } + if (h == thr->builtins[DUK_BIDX_SYNTAX_ERROR_PROTOTYPE]) { + return DUK_ERR_SYNTAX_ERROR; + } + if (h == thr->builtins[DUK_BIDX_TYPE_ERROR_PROTOTYPE]) { + return DUK_ERR_TYPE_ERROR; + } + if (h == thr->builtins[DUK_BIDX_URI_ERROR_PROTOTYPE]) { + return DUK_ERR_URI_ERROR; + } + if (h == thr->builtins[DUK_BIDX_ERROR_PROTOTYPE]) { + return DUK_ERR_ERROR; + } + + h = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h); + } while (--sanity > 0); + + return DUK_ERR_NONE; +} + +/* + * Pushers + */ + +DUK_INTERNAL void duk_push_tval(duk_context *ctx, duk_tval *tv) { + duk_hthread *thr; + duk_tval *tv_slot; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(tv != NULL); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + tv_slot = thr->valstack_top++; + DUK_TVAL_SET_TVAL(tv_slot, tv); + DUK_TVAL_INCREF(thr, tv); /* no side effects */ +} + +#if defined(DUK_USE_DEBUGGER_SUPPORT) +/* Right now only needed by the debugger. */ +DUK_INTERNAL void duk_push_unused(duk_context *ctx) { + duk_hthread *thr; + duk_tval *tv_slot; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + tv_slot = thr->valstack_top++; + DUK_TVAL_SET_UNDEFINED_UNUSED(tv_slot); +} +#endif + +DUK_EXTERNAL void duk_push_undefined(duk_context *ctx) { + duk_hthread *thr; + duk_tval *tv_slot; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + tv_slot = thr->valstack_top++; + DUK_TVAL_SET_UNDEFINED_ACTUAL(tv_slot); +} + +DUK_EXTERNAL void duk_push_null(duk_context *ctx) { + duk_hthread *thr; + duk_tval *tv_slot; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + tv_slot = thr->valstack_top++; + DUK_TVAL_SET_NULL(tv_slot); +} + +DUK_EXTERNAL void duk_push_boolean(duk_context *ctx, duk_bool_t val) { + duk_hthread *thr; + duk_tval *tv_slot; + duk_small_int_t b; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + b = (val ? 1 : 0); /* ensure value is 1 or 0 (not other non-zero) */ + tv_slot = thr->valstack_top++; + DUK_TVAL_SET_BOOLEAN(tv_slot, b); +} + +DUK_EXTERNAL void duk_push_true(duk_context *ctx) { + duk_hthread *thr; + duk_tval *tv_slot; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + tv_slot = thr->valstack_top++; + DUK_TVAL_SET_BOOLEAN_TRUE(tv_slot); +} + +DUK_EXTERNAL void duk_push_false(duk_context *ctx) { + duk_hthread *thr; + duk_tval *tv_slot; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + tv_slot = thr->valstack_top++; + DUK_TVAL_SET_BOOLEAN_FALSE(tv_slot); +} + +/* normalize NaN which may not match our canonical internal NaN */ +DUK_EXTERNAL void duk_push_number(duk_context *ctx, duk_double_t val) { + duk_hthread *thr; + duk_tval *tv_slot; + duk_double_union du; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + du.d = val; + DUK_DBLUNION_NORMALIZE_NAN_CHECK(&du); + tv_slot = thr->valstack_top++; + DUK_TVAL_SET_NUMBER(tv_slot, du.d); +} + +DUK_EXTERNAL void duk_push_int(duk_context *ctx, duk_int_t val) { +#if defined(DUK_USE_FASTINT) + duk_hthread *thr; + duk_tval *tv_slot; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + tv_slot = thr->valstack_top++; +#if DUK_INT_MAX <= 0x7fffffffL + DUK_TVAL_SET_FASTINT_I32(tv_slot, (duk_int32_t) val); +#else + if (val >= DUK_FASTINT_MIN && val <= DUK_FASTINT_MAX) { + DUK_TVAL_SET_FASTINT(tv_slot, (duk_int64_t) val); + } else { + duk_double_t = (duk_double_t) val; + DUK_TVAL_SET_NUMBER(tv_slot, d); + } +#endif +#else /* DUK_USE_FASTINT */ + duk_hthread *thr; + duk_tval *tv_slot; + duk_double_t d; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + d = (duk_double_t) val; + tv_slot = thr->valstack_top++; + DUK_TVAL_SET_NUMBER(tv_slot, d); +#endif /* DUK_USE_FASTINT */ +} + +DUK_EXTERNAL void duk_push_uint(duk_context *ctx, duk_uint_t val) { +#if defined(DUK_USE_FASTINT) + duk_hthread *thr; + duk_tval *tv_slot; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + tv_slot = thr->valstack_top++; +#if DUK_UINT_MAX <= 0xffffffffUL + DUK_TVAL_SET_FASTINT_U32(tv_slot, (duk_uint32_t) val); +#else + if (val <= DUK_FASTINT_MAX) { /* val is unsigned so >= 0 */ + /* XXX: take advantage of val being unsigned, no need to mask */ + DUK_TVAL_SET_FASTINT(tv_slot, (duk_int64_t) val); + } else { + duk_double_t = (duk_double_t) val; + DUK_TVAL_SET_NUMBER(tv_slot, d); + } +#endif +#else /* DUK_USE_FASTINT */ + duk_hthread *thr; + duk_tval *tv_slot; + duk_double_t d; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + d = (duk_double_t) val; + tv_slot = thr->valstack_top++; + DUK_TVAL_SET_NUMBER(tv_slot, d); +#endif /* DUK_USE_FASTINT */ +} + +DUK_EXTERNAL void duk_push_nan(duk_context *ctx) { + duk_hthread *thr; + duk_tval *tv_slot; + duk_double_union du; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + DUK_DBLUNION_SET_NAN(&du); + DUK_ASSERT(DUK_DBLUNION_IS_NORMALIZED(&du)); + tv_slot = thr->valstack_top++; + DUK_TVAL_SET_NUMBER(tv_slot, du.d); +} + +DUK_EXTERNAL const char *duk_push_lstring(duk_context *ctx, const char *str, duk_size_t len) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hstring *h; + duk_tval *tv_slot; + + DUK_ASSERT_CTX_VALID(ctx); + + /* check stack before interning (avoid hanging temp) */ + if (thr->valstack_top >= thr->valstack_end) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_PUSH_BEYOND_ALLOC_STACK); + } + + /* NULL with zero length represents an empty string; NULL with higher + * length is also now trated like an empty string although it is + * a bit dubious. This is unlike duk_push_string() which pushes a + * 'null' if the input string is a NULL. + */ + if (!str) { + len = 0; + } + + /* Check for maximum string length */ + if (len > DUK_HSTRING_MAX_BYTELEN) { + DUK_ERROR(thr, DUK_ERR_RANGE_ERROR, DUK_STR_STRING_TOO_LONG); + } + + h = duk_heap_string_intern_checked(thr, (duk_uint8_t *) str, (duk_uint32_t) len); + DUK_ASSERT(h != NULL); + + tv_slot = thr->valstack_top++; + DUK_TVAL_SET_STRING(tv_slot, h); + DUK_HSTRING_INCREF(thr, h); /* no side effects */ + + return (const char *) DUK_HSTRING_GET_DATA(h); +} + +DUK_EXTERNAL const char *duk_push_string(duk_context *ctx, const char *str) { + DUK_ASSERT_CTX_VALID(ctx); + + if (str) { + return duk_push_lstring(ctx, str, DUK_STRLEN(str)); + } else { + duk_push_null(ctx); + return NULL; + } +} + +#ifdef DUK_USE_FILE_IO +/* This is a bit clunky because it is ANSI C portable. Should perhaps + * relocate to another file because this is potentially platform + * dependent. + */ +DUK_EXTERNAL const char *duk_push_string_file_raw(duk_context *ctx, const char *path, duk_uint_t flags) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_file *f = NULL; + char *buf; + long sz; /* ANSI C typing */ + + DUK_ASSERT_CTX_VALID(ctx); + + if (!path) { + goto fail; + } + f = DUK_FOPEN(path, "rb"); + if (!f) { + goto fail; + } + if (DUK_FSEEK(f, 0, SEEK_END) < 0) { + goto fail; + } + sz = DUK_FTELL(f); + if (sz < 0) { + goto fail; + } + if (DUK_FSEEK(f, 0, SEEK_SET) < 0) { + goto fail; + } + buf = (char *) duk_push_fixed_buffer(ctx, (duk_size_t) sz); + DUK_ASSERT(buf != NULL); + if ((duk_size_t) DUK_FREAD(buf, 1, (size_t) sz, f) != (duk_size_t) sz) { + goto fail; + } + (void) DUK_FCLOSE(f); /* ignore fclose() error */ + f = NULL; + return duk_to_string(ctx, -1); + + fail: + if (f) { + DUK_FCLOSE(f); + } + + if (flags != 0) { + DUK_ASSERT(flags == DUK_STRING_PUSH_SAFE); /* only flag now */ + duk_push_undefined(ctx); + } else { + /* XXX: string not shared because it is conditional */ + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, "read file error"); + } + return NULL; +} +#else +DUK_EXTERNAL const char *duk_push_string_file_raw(duk_context *ctx, const char *path, duk_uint_t flags) { + duk_hthread *thr = (duk_hthread *) ctx; + DUK_ASSERT_CTX_VALID(ctx); + DUK_UNREF(path); + + if (flags != 0) { + DUK_ASSERT(flags == DUK_STRING_PUSH_SAFE); /* only flag now */ + duk_push_undefined(ctx); + } else { + /* XXX: string not shared because it is conditional */ + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, "file I/O disabled"); + } + return NULL; +} +#endif /* DUK_USE_FILE_IO */ + +DUK_EXTERNAL void duk_push_pointer(duk_context *ctx, void *val) { + duk_hthread *thr; + duk_tval *tv_slot; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK__CHECK_SPACE(); + tv_slot = thr->valstack_top++; + DUK_TVAL_SET_POINTER(tv_slot, val); +} + +#define DUK__PUSH_THIS_FLAG_CHECK_COERC (1 << 0) +#define DUK__PUSH_THIS_FLAG_TO_OBJECT (1 << 1) +#define DUK__PUSH_THIS_FLAG_TO_STRING (1 << 2) + +DUK_LOCAL void duk__push_this_helper(duk_context *ctx, duk_small_uint_t flags) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT(thr != NULL); + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT_DISABLE(thr->callstack_top >= 0); /* avoid warning (unsigned) */ + DUK_ASSERT(thr->callstack_top <= thr->callstack_size); + + if (thr->callstack_top == 0) { + if (flags & DUK__PUSH_THIS_FLAG_CHECK_COERC) { + goto type_error; + } + duk_push_undefined(ctx); + } else { + duk_tval tv_tmp; + duk_tval *tv; + + /* 'this' binding is just before current activation's bottom */ + DUK_ASSERT(thr->valstack_bottom > thr->valstack); + tv = thr->valstack_bottom - 1; + if (flags & DUK__PUSH_THIS_FLAG_CHECK_COERC) { + if (DUK_TVAL_IS_UNDEFINED(tv) || DUK_TVAL_IS_NULL(tv)) { + goto type_error; + } + } + + DUK_TVAL_SET_TVAL(&tv_tmp, tv); + duk_push_tval(ctx, &tv_tmp); + } + + if (flags & DUK__PUSH_THIS_FLAG_TO_OBJECT) { + duk_to_object(ctx, -1); + } else if (flags & DUK__PUSH_THIS_FLAG_TO_STRING) { + duk_to_string(ctx, -1); + } + + return; + + type_error: + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_OBJECT_COERCIBLE); +} + +DUK_EXTERNAL void duk_push_this(duk_context *ctx) { + DUK_ASSERT_CTX_VALID(ctx); + + duk__push_this_helper(ctx, 0 /*flags*/); +} + +DUK_INTERNAL void duk_push_this_check_object_coercible(duk_context *ctx) { + DUK_ASSERT_CTX_VALID(ctx); + + duk__push_this_helper(ctx, DUK__PUSH_THIS_FLAG_CHECK_COERC /*flags*/); +} + +DUK_INTERNAL duk_hobject *duk_push_this_coercible_to_object(duk_context *ctx) { + duk_hobject *h; + + DUK_ASSERT_CTX_VALID(ctx); + + duk__push_this_helper(ctx, DUK__PUSH_THIS_FLAG_CHECK_COERC | + DUK__PUSH_THIS_FLAG_TO_OBJECT /*flags*/); + h = duk_get_hobject(ctx, -1); + DUK_ASSERT(h != NULL); + return h; +} + +DUK_INTERNAL duk_hstring *duk_push_this_coercible_to_string(duk_context *ctx) { + duk_hstring *h; + + DUK_ASSERT_CTX_VALID(ctx); + + duk__push_this_helper(ctx, DUK__PUSH_THIS_FLAG_CHECK_COERC | + DUK__PUSH_THIS_FLAG_TO_STRING /*flags*/); + h = duk_get_hstring(ctx, -1); + DUK_ASSERT(h != NULL); + return h; +} + +DUK_INTERNAL duk_tval *duk_get_borrowed_this_tval(duk_context *ctx) { + duk_hthread *thr; + + DUK_ASSERT(ctx != NULL); + thr = (duk_hthread *) ctx; + + DUK_ASSERT(thr->callstack_top > 0); /* caller required to know */ + DUK_ASSERT(thr->valstack_bottom > thr->valstack); /* consequence of above */ + DUK_ASSERT(thr->valstack_bottom - 1 >= thr->valstack); /* 'this' binding exists */ + + return thr->valstack_bottom - 1; +} + +DUK_EXTERNAL void duk_push_current_function(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_activation *act; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + DUK_ASSERT_DISABLE(thr->callstack_top >= 0); + DUK_ASSERT(thr->callstack_top <= thr->callstack_size); + + act = duk_hthread_get_current_activation(thr); + if (act) { + duk_push_tval(ctx, &act->tv_func); + } else { + duk_push_undefined(ctx); + } +} + +DUK_EXTERNAL void duk_push_current_thread(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + + if (thr->heap->curr_thread) { + duk_push_hobject(ctx, (duk_hobject *) thr->heap->curr_thread); + } else { + duk_push_undefined(ctx); + } +} + +DUK_EXTERNAL void duk_push_global_object(duk_context *ctx) { + DUK_ASSERT_CTX_VALID(ctx); + + duk_push_hobject_bidx(ctx, DUK_BIDX_GLOBAL); +} + +/* XXX: size optimize */ +DUK_LOCAL void duk__push_stash(duk_context *ctx) { + DUK_ASSERT_CTX_VALID(ctx); + if (!duk_get_prop_stridx(ctx, -1, DUK_STRIDX_INT_VALUE)) { + DUK_DDD(DUK_DDDPRINT("creating heap/global/thread stash on first use")); + duk_pop(ctx); + duk_push_object_internal(ctx); + duk_dup_top(ctx); + duk_xdef_prop_stridx(ctx, -3, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_C); /* [ ... parent stash stash ] -> [ ... parent stash ] */ + } + duk_remove(ctx, -2); +} + +DUK_EXTERNAL void duk_push_heap_stash(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_heap *heap; + DUK_ASSERT_CTX_VALID(ctx); + heap = thr->heap; + DUK_ASSERT(heap->heap_object != NULL); + duk_push_hobject(ctx, heap->heap_object); + duk__push_stash(ctx); +} + +DUK_EXTERNAL void duk_push_global_stash(duk_context *ctx) { + DUK_ASSERT_CTX_VALID(ctx); + duk_push_global_object(ctx); + duk__push_stash(ctx); +} + +DUK_EXTERNAL void duk_push_thread_stash(duk_context *ctx, duk_context *target_ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + DUK_ASSERT_CTX_VALID(ctx); + if (!target_ctx) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_CALL_ARGS); + return; /* not reached */ + } + duk_push_hobject(ctx, (duk_hobject *) target_ctx); + duk__push_stash(ctx); +} + +/* XXX: duk_ssize_t would be useful here */ +DUK_LOCAL duk_int_t duk__try_push_vsprintf(duk_context *ctx, void *buf, duk_size_t sz, const char *fmt, va_list ap) { + duk_int_t len; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_UNREF(ctx); + + /* NUL terminator handling doesn't matter here */ + len = DUK_VSNPRINTF((char *) buf, sz, fmt, ap); + if (len < (duk_int_t) sz) { + /* Return value of 'sz' or more indicates output was (potentially) + * truncated. + */ + return (duk_int_t) len; + } + return -1; +} + +DUK_EXTERNAL const char *duk_push_vsprintf(duk_context *ctx, const char *fmt, va_list ap) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_uint8_t stack_buf[DUK_PUSH_SPRINTF_INITIAL_SIZE]; + duk_size_t sz = DUK_PUSH_SPRINTF_INITIAL_SIZE; + duk_bool_t pushed_buf = 0; + void *buf; + duk_int_t len; /* XXX: duk_ssize_t */ + const char *res; + + DUK_ASSERT_CTX_VALID(ctx); + + /* special handling of fmt==NULL */ + if (!fmt) { + duk_hstring *h_str; + duk_push_hstring_stridx(ctx, DUK_STRIDX_EMPTY_STRING); + h_str = DUK_HTHREAD_STRING_EMPTY_STRING(thr); /* rely on interning, must be this string */ + return (const char *) DUK_HSTRING_GET_DATA(h_str); + } + + /* initial estimate based on format string */ + sz = DUK_STRLEN(fmt) + 16; /* format plus something to avoid just missing */ + if (sz < DUK_PUSH_SPRINTF_INITIAL_SIZE) { + sz = DUK_PUSH_SPRINTF_INITIAL_SIZE; + } + DUK_ASSERT(sz > 0); + + /* Try to make do with a stack buffer to avoid allocating a temporary buffer. + * This works 99% of the time which is quite nice. + */ + for (;;) { + va_list ap_copy; /* copied so that 'ap' can be reused */ + + if (sz <= sizeof(stack_buf)) { + buf = stack_buf; + } else if (!pushed_buf) { + pushed_buf = 1; + buf = duk_push_dynamic_buffer(ctx, sz); + } else { + buf = duk_resize_buffer(ctx, -1, sz); + } + DUK_ASSERT(buf != NULL); + + DUK_VA_COPY(ap_copy, ap); + len = duk__try_push_vsprintf(ctx, buf, sz, fmt, ap_copy); + va_end(ap_copy); + if (len >= 0) { + break; + } + + /* failed, resize and try again */ + sz = sz * 2; + if (sz >= DUK_PUSH_SPRINTF_SANITY_LIMIT) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_SPRINTF_TOO_LONG); + } + } + + /* Cannot use duk_to_string() on the buffer because it is usually + * larger than 'len'. Also, 'buf' is usually a stack buffer. + */ + res = duk_push_lstring(ctx, (const char *) buf, (duk_size_t) len); /* [ buf? res ] */ + if (pushed_buf) { + duk_remove(ctx, -2); + } + return res; +} + +DUK_EXTERNAL const char *duk_push_sprintf(duk_context *ctx, const char *fmt, ...) { + va_list ap; + const char *ret; + + DUK_ASSERT_CTX_VALID(ctx); + + /* allow fmt==NULL */ + va_start(ap, fmt); + ret = duk_push_vsprintf(ctx, fmt, ap); + va_end(ap); + + return ret; +} + +DUK_INTERNAL duk_idx_t duk_push_object_helper(duk_context *ctx, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv_slot; + duk_hobject *h; + duk_idx_t ret; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(prototype_bidx == -1 || + (prototype_bidx >= 0 && prototype_bidx < DUK_NUM_BUILTINS)); + + /* check stack first */ + if (thr->valstack_top >= thr->valstack_end) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_PUSH_BEYOND_ALLOC_STACK); + } + + h = duk_hobject_alloc(thr->heap, hobject_flags_and_class); + if (!h) { + DUK_ERROR(thr, DUK_ERR_ALLOC_ERROR, DUK_STR_ALLOC_FAILED); + } + + DUK_DDD(DUK_DDDPRINT("created object with flags: 0x%08lx", (unsigned long) h->hdr.h_flags)); + + tv_slot = thr->valstack_top; + DUK_TVAL_SET_OBJECT(tv_slot, h); + DUK_HOBJECT_INCREF(thr, h); /* no side effects */ + ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); + thr->valstack_top++; + + /* object is now reachable */ + + if (prototype_bidx >= 0) { + DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, thr->builtins[prototype_bidx]); + } else { + DUK_ASSERT(prototype_bidx == -1); + DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h) == NULL); + } + + return ret; +} + +DUK_INTERNAL duk_idx_t duk_push_object_helper_proto(duk_context *ctx, duk_uint_t hobject_flags_and_class, duk_hobject *proto) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_idx_t ret; + duk_hobject *h; + + DUK_ASSERT_CTX_VALID(ctx); + + ret = duk_push_object_helper(ctx, hobject_flags_and_class, -1); + h = duk_get_hobject(ctx, -1); + DUK_ASSERT(h != NULL); + DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h) == NULL); + DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, h, proto); + return ret; +} + +DUK_EXTERNAL duk_idx_t duk_push_object(duk_context *ctx) { + DUK_ASSERT_CTX_VALID(ctx); + + return duk_push_object_helper(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT), + DUK_BIDX_OBJECT_PROTOTYPE); +} + +DUK_EXTERNAL duk_idx_t duk_push_array(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *obj; + duk_idx_t ret; + + DUK_ASSERT_CTX_VALID(ctx); + + ret = duk_push_object_helper(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_ARRAY_PART | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAY), + DUK_BIDX_ARRAY_PROTOTYPE); + + obj = duk_require_hobject(ctx, ret); + + /* + * An array must have a 'length' property (E5 Section 15.4.5.2). + * The special array behavior flag must only be enabled once the + * length property has been added. + * + * The internal property must be a number (and preferably a + * fastint if fastint support is enabled). + */ + + duk_push_int(ctx, 0); +#if defined(DUK_USE_FASTINT) + DUK_ASSERT(DUK_TVAL_IS_FASTINT(duk_require_tval(ctx, -1))); +#endif + + duk_hobject_define_property_internal(thr, + obj, + DUK_HTHREAD_STRING_LENGTH(thr), + DUK_PROPDESC_FLAGS_W); + DUK_HOBJECT_SET_EXOTIC_ARRAY(obj); + + return ret; +} + +DUK_EXTERNAL duk_idx_t duk_push_thread_raw(duk_context *ctx, duk_uint_t flags) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hthread *obj; + duk_idx_t ret; + duk_tval *tv_slot; + + DUK_ASSERT_CTX_VALID(ctx); + + /* check stack first */ + if (thr->valstack_top >= thr->valstack_end) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_PUSH_BEYOND_ALLOC_STACK); + } + + obj = duk_hthread_alloc(thr->heap, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_THREAD | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_THREAD)); + if (!obj) { + DUK_ERROR(thr, DUK_ERR_ALLOC_ERROR, DUK_STR_ALLOC_FAILED); + } + obj->state = DUK_HTHREAD_STATE_INACTIVE; +#if defined(DUK_USE_HEAPPTR16) + obj->strs16 = thr->strs16; +#else + obj->strs = thr->strs; +#endif + DUK_DDD(DUK_DDDPRINT("created thread object with flags: 0x%08lx", (unsigned long) obj->obj.hdr.h_flags)); + + /* make the new thread reachable */ + tv_slot = thr->valstack_top; + DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); + DUK_HTHREAD_INCREF(thr, obj); + ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); + thr->valstack_top++; + + /* important to do this *after* pushing, to make the thread reachable for gc */ + if (!duk_hthread_init_stacks(thr->heap, obj)) { + DUK_ERROR(thr, DUK_ERR_ALLOC_ERROR, DUK_STR_ALLOC_FAILED); + } + + /* initialize built-ins - either by copying or creating new ones */ + if (flags & DUK_THREAD_NEW_GLOBAL_ENV) { + duk_hthread_create_builtin_objects(obj); + } else { + duk_hthread_copy_builtin_objects(thr, obj); + } + + /* default prototype (Note: 'obj' must be reachable) */ + DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, (duk_hobject *) obj, obj->builtins[DUK_BIDX_THREAD_PROTOTYPE]); + + /* Initial stack size satisfies the stack spare constraints so there + * is no need to require stack here. + */ + DUK_ASSERT(DUK_VALSTACK_INITIAL_SIZE >= + DUK_VALSTACK_API_ENTRY_MINIMUM + DUK_VALSTACK_INTERNAL_EXTRA); + + return ret; +} + +DUK_INTERNAL duk_idx_t duk_push_compiledfunction(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hcompiledfunction *obj; + duk_idx_t ret; + duk_tval *tv_slot; + + DUK_ASSERT_CTX_VALID(ctx); + + /* check stack first */ + if (thr->valstack_top >= thr->valstack_end) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_PUSH_BEYOND_ALLOC_STACK); + } + + /* Template functions are not strictly constructable (they don't + * have a "prototype" property for instance), so leave the + * DUK_HOBJECT_FLAG_CONSRUCTABLE flag cleared here. + */ + + obj = duk_hcompiledfunction_alloc(thr->heap, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_COMPILEDFUNCTION | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION)); + if (!obj) { + DUK_ERROR(thr, DUK_ERR_ALLOC_ERROR, DUK_STR_ALLOC_FAILED); + } + + DUK_DDD(DUK_DDDPRINT("created compiled function object with flags: 0x%08lx", (unsigned long) obj->obj.hdr.h_flags)); + + tv_slot = thr->valstack_top; + DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); + DUK_HOBJECT_INCREF(thr, obj); + ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); + thr->valstack_top++; + + /* default prototype (Note: 'obj' must be reachable) */ + DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, (duk_hobject *) obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); + + return ret; +} + +DUK_LOCAL duk_idx_t duk__push_c_function_raw(duk_context *ctx, duk_c_function func, duk_idx_t nargs, duk_uint_t flags) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hnativefunction *obj; + duk_idx_t ret; + duk_tval *tv_slot; + duk_uint16_t func_nargs; + + DUK_ASSERT_CTX_VALID(ctx); + + /* check stack first */ + if (thr->valstack_top >= thr->valstack_end) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_PUSH_BEYOND_ALLOC_STACK); + } + if (func == NULL) { + goto api_error; + } + if (nargs >= 0 && nargs < DUK_HNATIVEFUNCTION_NARGS_MAX) { + func_nargs = (duk_uint16_t) nargs; + } else if (nargs == DUK_VARARGS) { + func_nargs = DUK_HNATIVEFUNCTION_NARGS_VARARGS; + } else { + goto api_error; + } + + obj = duk_hnativefunction_alloc(thr->heap, flags); + if (!obj) { + DUK_ERROR(thr, DUK_ERR_ALLOC_ERROR, DUK_STR_ALLOC_FAILED); + } + + obj->func = func; + obj->nargs = func_nargs; + + DUK_DDD(DUK_DDDPRINT("created native function object with flags: 0x%08lx, nargs=%ld", + (unsigned long) obj->obj.hdr.h_flags, (long) obj->nargs)); + + tv_slot = thr->valstack_top; + DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); + DUK_HOBJECT_INCREF(thr, obj); + ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); + thr->valstack_top++; + + /* default prototype (Note: 'obj' must be reachable) */ + DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, (duk_hobject *) obj, thr->builtins[DUK_BIDX_FUNCTION_PROTOTYPE]); + + return ret; + + api_error: + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_CALL_ARGS); + return 0; /* not reached */ +} + +DUK_EXTERNAL duk_idx_t duk_push_c_function(duk_context *ctx, duk_c_function func, duk_int_t nargs) { + duk_uint_t flags; + + DUK_ASSERT_CTX_VALID(ctx); + + flags = DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_CONSTRUCTABLE | + DUK_HOBJECT_FLAG_NATIVEFUNCTION | + DUK_HOBJECT_FLAG_NEWENV | + DUK_HOBJECT_FLAG_STRICT | + DUK_HOBJECT_FLAG_NOTAIL | + DUK_HOBJECT_FLAG_EXOTIC_DUKFUNC | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION); + + return duk__push_c_function_raw(ctx, func, nargs, flags); +} + +DUK_INTERNAL void duk_push_c_function_noexotic(duk_context *ctx, duk_c_function func, duk_int_t nargs) { + duk_uint_t flags; + + DUK_ASSERT_CTX_VALID(ctx); + + flags = DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_CONSTRUCTABLE | + DUK_HOBJECT_FLAG_NATIVEFUNCTION | + DUK_HOBJECT_FLAG_NEWENV | + DUK_HOBJECT_FLAG_STRICT | + DUK_HOBJECT_FLAG_NOTAIL | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION); + + (void) duk__push_c_function_raw(ctx, func, nargs, flags); +} + +DUK_INTERNAL void duk_push_c_function_noconstruct_noexotic(duk_context *ctx, duk_c_function func, duk_int_t nargs) { + duk_uint_t flags; + + DUK_ASSERT_CTX_VALID(ctx); + + flags = DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_NATIVEFUNCTION | + DUK_HOBJECT_FLAG_NEWENV | + DUK_HOBJECT_FLAG_STRICT | + DUK_HOBJECT_FLAG_NOTAIL | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION); + + (void) duk__push_c_function_raw(ctx, func, nargs, flags); +} + +DUK_EXTERNAL duk_idx_t duk_push_c_lightfunc(duk_context *ctx, duk_c_function func, duk_idx_t nargs, duk_idx_t length, duk_int_t magic) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval tv_tmp; + duk_small_uint_t lf_flags; + + DUK_ASSERT_CTX_VALID(ctx); + + /* check stack first */ + if (thr->valstack_top >= thr->valstack_end) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_PUSH_BEYOND_ALLOC_STACK); + } + + if (nargs >= DUK_LFUNC_NARGS_MIN && nargs <= DUK_LFUNC_NARGS_MAX) { + /* as is */ + } else if (nargs == DUK_VARARGS) { + nargs = DUK_LFUNC_NARGS_VARARGS; + } else { + goto api_error; + } + if (!(length >= DUK_LFUNC_LENGTH_MIN && length <= DUK_LFUNC_LENGTH_MAX)) { + goto api_error; + } + if (!(magic >= DUK_LFUNC_MAGIC_MIN && magic <= DUK_LFUNC_MAGIC_MAX)) { + goto api_error; + } + + lf_flags = DUK_LFUNC_FLAGS_PACK(magic, length, nargs); + DUK_TVAL_SET_LIGHTFUNC(&tv_tmp, func, lf_flags); + duk_push_tval(ctx, &tv_tmp); /* XXX: direct valstack write */ + DUK_ASSERT(thr->valstack_top != thr->valstack_bottom); + return ((duk_idx_t) (thr->valstack_top - thr->valstack_bottom)) - 1; + + api_error: + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_CALL_ARGS); + return 0; /* not reached */ +} + +DUK_INTERNAL duk_hbufferobject *duk_push_bufferobject_raw(duk_context *ctx, duk_uint_t hobject_flags_and_class, duk_small_int_t prototype_bidx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hbufferobject *obj; + duk_tval *tv_slot; + + DUK_ASSERT(ctx != NULL); + DUK_ASSERT(prototype_bidx >= 0); + + /* check stack first */ + if (thr->valstack_top >= thr->valstack_end) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_PUSH_BEYOND_ALLOC_STACK); + } + + obj = duk_hbufferobject_alloc(thr->heap, hobject_flags_and_class); + if (!obj) { + DUK_ERROR(thr, DUK_ERR_ALLOC_ERROR, DUK_STR_ALLOC_FAILED); + } + + DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, (duk_hobject *) obj, thr->builtins[prototype_bidx]); + DUK_ASSERT_HBUFFEROBJECT_VALID(obj); + + tv_slot = thr->valstack_top; + DUK_TVAL_SET_OBJECT(tv_slot, (duk_hobject *) obj); + DUK_HOBJECT_INCREF(thr, obj); + thr->valstack_top++; + + return obj; +} + +/* XXX: There's quite a bit of overlap with buffer creation handling in + * duk_bi_buffer.c. Look for overlap and refactor. + */ +#define DUK__PACK_ARGS(classnum,protobidx,elemtype,elemshift,isview) \ + (((classnum) << 24) | ((protobidx) << 16) | ((elemtype) << 8) | ((elemshift) << 4) | (isview)) + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +static const duk_uint32_t duk__bufobj_flags_lookup[] = { + DUK__PACK_ARGS(DUK_HOBJECT_CLASS_BUFFER, DUK_BIDX_BUFFER_PROTOTYPE, DUK_HBUFFEROBJECT_ELEM_UINT8, 0, 0), /* DUK_BUFOBJ_DUKTAPE_BUFFER */ + DUK__PACK_ARGS(DUK_HOBJECT_CLASS_BUFFER, DUK_BIDX_NODEJS_BUFFER_PROTOTYPE, DUK_HBUFFEROBJECT_ELEM_UINT8, 0, 0), /* DUK_BUFOBJ_NODEJS_BUFFER */ + DUK__PACK_ARGS(DUK_HOBJECT_CLASS_ARRAYBUFFER, DUK_BIDX_ARRAYBUFFER_PROTOTYPE, DUK_HBUFFEROBJECT_ELEM_UINT8, 0, 0), /* DUK_BUFOBJ_ARRAYBUFFER */ + DUK__PACK_ARGS(DUK_HOBJECT_CLASS_DATAVIEW, DUK_BIDX_DATAVIEW_PROTOTYPE, DUK_HBUFFEROBJECT_ELEM_UINT8, 0, 1), /* DUK_BUFOBJ_DATAVIEW */ + DUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT8ARRAY, DUK_BIDX_INT8ARRAY_PROTOTYPE, DUK_HBUFFEROBJECT_ELEM_INT8, 0, 1), /* DUK_BUFOBJ_INT8ARRAY */ + DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT8ARRAY, DUK_BIDX_UINT8ARRAY_PROTOTYPE, DUK_HBUFFEROBJECT_ELEM_UINT8, 0, 1), /* DUK_BUFOBJ_UINT8ARRAY */ + DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY, DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE, DUK_HBUFFEROBJECT_ELEM_UINT8CLAMPED, 0, 1), /* DUK_BUFOBJ_UINT8CLAMPEDARRAY */ + DUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT16ARRAY, DUK_BIDX_INT16ARRAY_PROTOTYPE, DUK_HBUFFEROBJECT_ELEM_INT16, 1, 1), /* DUK_BUFOBJ_INT16ARRAY */ + DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT16ARRAY, DUK_BIDX_UINT16ARRAY_PROTOTYPE, DUK_HBUFFEROBJECT_ELEM_UINT16, 1, 1), /* DUK_BUFOBJ_UINT16ARRAY */ + DUK__PACK_ARGS(DUK_HOBJECT_CLASS_INT32ARRAY, DUK_BIDX_INT32ARRAY_PROTOTYPE, DUK_HBUFFEROBJECT_ELEM_INT32, 2, 1), /* DUK_BUFOBJ_INT32ARRAY */ + DUK__PACK_ARGS(DUK_HOBJECT_CLASS_UINT32ARRAY, DUK_BIDX_UINT32ARRAY_PROTOTYPE, DUK_HBUFFEROBJECT_ELEM_UINT32, 2, 1), /* DUK_BUFOBJ_UINT32ARRAY */ + DUK__PACK_ARGS(DUK_HOBJECT_CLASS_FLOAT32ARRAY, DUK_BIDX_FLOAT32ARRAY_PROTOTYPE, DUK_HBUFFEROBJECT_ELEM_FLOAT32, 2, 1), /* DUK_BUFOBJ_FLOAT32ARRAY */ + DUK__PACK_ARGS(DUK_HOBJECT_CLASS_FLOAT64ARRAY, DUK_BIDX_FLOAT64ARRAY_PROTOTYPE, DUK_HBUFFEROBJECT_ELEM_FLOAT64, 3, 1) /* DUK_BUFOBJ_FLOAT64ARRAY */ +}; +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +/* Only allow Duktape.Buffer when support disabled. */ +static const duk_uint32_t duk__bufobj_flags_lookup[] = { + DUK__PACK_ARGS(DUK_HOBJECT_CLASS_BUFFER, DUK_BIDX_BUFFER_PROTOTYPE, DUK_HBUFFEROBJECT_ELEM_UINT8, 0, 0) /* DUK_BUFOBJ_DUKTAPE_BUFFER */ +}; +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ +#undef DUK__PACK_ARGS + +DUK_EXTERNAL void duk_push_buffer_object(duk_context *ctx, duk_idx_t idx_buffer, duk_size_t byte_offset, duk_size_t byte_length, duk_uint_t flags) { + duk_hthread *thr; + duk_hbufferobject *h_bufobj; + duk_hbuffer *h_val; + duk_uint32_t tmp; + duk_uint_t classnum; + duk_uint_t protobidx; + duk_uint_t lookupidx; + duk_uint_t uint_offset, uint_length, uint_added; + + DUK_ASSERT_CTX_VALID(ctx); + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + /* The underlying types for offset/length in duk_hbufferobject is + * duk_uint_t; make sure argument values fit and that offset + length + * does not wrap. + */ + uint_offset = (duk_uint_t) byte_offset; + uint_length = (duk_uint_t) byte_length; + if (sizeof(duk_size_t) != sizeof(duk_uint_t)) { + if ((duk_size_t) uint_offset != byte_offset || (duk_size_t) uint_length != byte_length) { + goto range_error; + } + } + uint_added = uint_offset + uint_length; + if (uint_added < uint_offset) { + goto range_error; + } + DUK_ASSERT(uint_added >= uint_offset && uint_added >= uint_length); + + DUK_ASSERT_DISABLE(flags >= 0); /* flags is unsigned */ + lookupidx = flags & 0x0f; /* 4 low bits */ + if (lookupidx >= sizeof(duk__bufobj_flags_lookup) / sizeof(duk_uint32_t)) { + goto arg_error; + } + tmp = duk__bufobj_flags_lookup[lookupidx]; + classnum = tmp >> 24; + protobidx = (tmp >> 16) & 0xff; + + h_val = duk_require_hbuffer(ctx, idx_buffer); + DUK_ASSERT(h_val != NULL); + + h_bufobj = duk_push_bufferobject_raw(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_BUFFEROBJECT | + DUK_HOBJECT_CLASS_AS_FLAGS(classnum), + protobidx); + DUK_ASSERT(h_bufobj != NULL); + + h_bufobj->buf = h_val; + DUK_HBUFFER_INCREF(thr, h_val); + h_bufobj->offset = uint_offset; + h_bufobj->length = uint_length; + h_bufobj->shift = (tmp >> 4) & 0x0f; + h_bufobj->elem_type = (tmp >> 8) & 0xff; + h_bufobj->is_view = tmp & 0x0f; + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) + /* TypedArray views need an automatic ArrayBuffer which must be + * provided as .buffer property of the view. Just create a new + * ArrayBuffer sharing the same underlying buffer. + */ + if (flags & DUK_BUFOBJ_CREATE_ARRBUF) { + h_bufobj = duk_push_bufferobject_raw(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_BUFFEROBJECT | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER), + DUK_BIDX_ARRAYBUFFER_PROTOTYPE); + + DUK_ASSERT(h_bufobj != NULL); + + h_bufobj->buf = h_val; + DUK_HBUFFER_INCREF(thr, h_val); + h_bufobj->offset = uint_offset; + h_bufobj->length = uint_length; + DUK_ASSERT(h_bufobj->shift == 0); + h_bufobj->elem_type = DUK_HBUFFEROBJECT_ELEM_UINT8; + DUK_ASSERT(h_bufobj->is_view == 0); + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_LC_BUFFER, DUK_PROPDESC_FLAGS_NONE); + duk_compact(ctx, -1); + } +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + + return; + + range_error: + DUK_ERROR(thr, DUK_ERR_RANGE_ERROR, DUK_STR_INVALID_CALL_ARGS); + return; /* not reached */ + + arg_error: + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_INVALID_CALL_ARGS); + return; /* not reached */ +} + +DUK_EXTERNAL duk_idx_t duk_push_error_object_va_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_idx_t ret; + duk_hobject *proto; +#ifdef DUK_USE_AUGMENT_ERROR_CREATE + duk_bool_t noblame_fileline; +#endif + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + DUK_UNREF(filename); + DUK_UNREF(line); + + /* Error code also packs a tracedata related flag. */ +#ifdef DUK_USE_AUGMENT_ERROR_CREATE + noblame_fileline = err_code & DUK_ERRCODE_FLAG_NOBLAME_FILELINE; +#endif + err_code = err_code & (~DUK_ERRCODE_FLAG_NOBLAME_FILELINE); + + /* error gets its 'name' from the prototype */ + proto = duk_error_prototype_from_code(thr, err_code); + ret = duk_push_object_helper_proto(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ERROR), + proto); + + /* ... and its 'message' from an instance property */ + if (fmt) { + duk_push_vsprintf(ctx, fmt, ap); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC); + } else { + /* If no explicit message given, put error code into message field + * (as a number). This is not fully in keeping with the Ecmascript + * error model because messages are supposed to be strings (Error + * constructors use ToString() on their argument). However, it's + * probably more useful than having a separate 'code' property. + */ + duk_push_int(ctx, err_code); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC); + } + +#if 0 + /* Disabled for now, not sure this is a useful property */ + duk_push_int(ctx, err_code); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_CODE, DUK_PROPDESC_FLAGS_WC); +#endif + + /* Creation time error augmentation */ +#ifdef DUK_USE_AUGMENT_ERROR_CREATE + /* filename may be NULL in which case file/line is not recorded */ + duk_err_augment_error_create(thr, thr, filename, line, noblame_fileline); /* may throw an error */ +#endif + + return ret; +} + +DUK_EXTERNAL duk_idx_t duk_push_error_object_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...) { + va_list ap; + duk_idx_t ret; + + DUK_ASSERT_CTX_VALID(ctx); + + va_start(ap, fmt); + ret = duk_push_error_object_va_raw(ctx, err_code, filename, line, fmt, ap); + va_end(ap); + return ret; +} + +#if !defined(DUK_USE_VARIADIC_MACROS) +DUK_EXTERNAL duk_idx_t duk_push_error_object_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...) { + const char *filename = duk_api_global_filename; + duk_int_t line = duk_api_global_line; + va_list ap; + duk_idx_t ret; + + DUK_ASSERT_CTX_VALID(ctx); + + duk_api_global_filename = NULL; + duk_api_global_line = 0; + va_start(ap, fmt); + ret = duk_push_error_object_va_raw(ctx, err_code, filename, line, fmt, ap); + va_end(ap); + return ret; +} +#endif /* DUK_USE_VARIADIC_MACROS */ + +DUK_EXTERNAL void *duk_push_buffer_raw(duk_context *ctx, duk_size_t size, duk_small_uint_t flags) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv_slot; + duk_hbuffer *h; + void *buf_data; + + DUK_ASSERT_CTX_VALID(ctx); + + /* check stack first */ + if (thr->valstack_top >= thr->valstack_end) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_PUSH_BEYOND_ALLOC_STACK); + } + + /* Check for maximum buffer length. */ + if (size > DUK_HBUFFER_MAX_BYTELEN) { + DUK_ERROR(thr, DUK_ERR_RANGE_ERROR, DUK_STR_BUFFER_TOO_LONG); + } + + h = duk_hbuffer_alloc(thr->heap, size, flags, &buf_data); + if (!h) { + DUK_ERROR(thr, DUK_ERR_ALLOC_ERROR, DUK_STR_ALLOC_FAILED); + } + + tv_slot = thr->valstack_top; + DUK_TVAL_SET_BUFFER(tv_slot, h); + DUK_HBUFFER_INCREF(thr, h); + thr->valstack_top++; + + return (void *) buf_data; +} + +DUK_EXTERNAL duk_idx_t duk_push_heapptr(duk_context *ctx, void *ptr) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_idx_t ret; + + DUK_ASSERT_CTX_VALID(ctx); + + ret = (duk_idx_t) (thr->valstack_top - thr->valstack_bottom); + + if (ptr == NULL) { + goto push_undefined; + } + + switch (DUK_HEAPHDR_GET_TYPE((duk_heaphdr *) ptr)) { + case DUK_HTYPE_STRING: + duk_push_hstring(ctx, (duk_hstring *) ptr); + break; + case DUK_HTYPE_OBJECT: + duk_push_hobject(ctx, (duk_hobject *) ptr); + break; + case DUK_HTYPE_BUFFER: + duk_push_hbuffer(ctx, (duk_hbuffer *) ptr); + break; + default: + goto push_undefined; + } + return ret; + + push_undefined: + duk_push_undefined(ctx); + return ret; +} + +DUK_INTERNAL duk_idx_t duk_push_object_internal(duk_context *ctx) { + return duk_push_object_helper(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_OBJECT), + -1); /* no prototype */ +} + +DUK_INTERNAL void duk_push_hstring(duk_context *ctx, duk_hstring *h) { + duk_tval tv; + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(h != NULL); + DUK_TVAL_SET_STRING(&tv, h); + duk_push_tval(ctx, &tv); +} + +DUK_INTERNAL void duk_push_hstring_stridx(duk_context *ctx, duk_small_int_t stridx) { + duk_hthread *thr = (duk_hthread *) ctx; + DUK_ASSERT(stridx >= 0 && stridx < DUK_HEAP_NUM_STRINGS); + duk_push_hstring(ctx, DUK_HTHREAD_GET_STRING(thr, stridx)); +} + +DUK_INTERNAL void duk_push_hobject(duk_context *ctx, duk_hobject *h) { + duk_tval tv; + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(h != NULL); + DUK_TVAL_SET_OBJECT(&tv, h); + duk_push_tval(ctx, &tv); +} + +DUK_INTERNAL void duk_push_hbuffer(duk_context *ctx, duk_hbuffer *h) { + duk_tval tv; + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(h != NULL); + DUK_TVAL_SET_BUFFER(&tv, h); + duk_push_tval(ctx, &tv); +} + +DUK_INTERNAL void duk_push_hobject_bidx(duk_context *ctx, duk_small_int_t builtin_idx) { + duk_hthread *thr = (duk_hthread *) ctx; + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + DUK_ASSERT(builtin_idx >= 0 && builtin_idx < DUK_NUM_BUILTINS); + DUK_ASSERT(thr->builtins[builtin_idx] != NULL); + duk_push_hobject(ctx, thr->builtins[builtin_idx]); +} + +/* + * Poppers + */ + +DUK_EXTERNAL void duk_pop_n(duk_context *ctx, duk_idx_t count) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + + if (count < 0) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_COUNT); + return; + } + + DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); + if ((duk_size_t) (thr->valstack_top - thr->valstack_bottom) < (duk_size_t) count) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_POP_TOO_MANY); + } + + /* + * Must be very careful here, every DECREF may cause reallocation + * of our valstack. + */ + + /* XXX: inlined DECREF macro would be nice here: no NULL check, + * refzero queueing but no refzero algorithm run (= no pointer + * instability), inline code. + */ + +#ifdef DUK_USE_REFERENCE_COUNTING + while (count > 0) { + duk_tval tv_tmp; + duk_tval *tv; + + tv = --thr->valstack_top; /* tv points to element just below prev top */ + DUK_ASSERT(tv >= thr->valstack_bottom); + DUK_TVAL_SET_TVAL(&tv_tmp, tv); + DUK_TVAL_SET_UNDEFINED_UNUSED(tv); + DUK_TVAL_DECREF(thr, &tv_tmp); /* side effects */ + count--; + } +#else + while (count > 0) { + duk_tval *tv; + + tv = --thr->valstack_top; + DUK_ASSERT(tv >= thr->valstack_bottom); + DUK_TVAL_SET_UNDEFINED_UNUSED(tv); + count--; + } +#endif + + DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); +} + +DUK_EXTERNAL void duk_pop(duk_context *ctx) { + DUK_ASSERT_CTX_VALID(ctx); + duk_pop_n(ctx, 1); +} + +DUK_EXTERNAL void duk_pop_2(duk_context *ctx) { + DUK_ASSERT_CTX_VALID(ctx); + duk_pop_n(ctx, 2); +} + +DUK_EXTERNAL void duk_pop_3(duk_context *ctx) { + DUK_ASSERT_CTX_VALID(ctx); + duk_pop_n(ctx, 3); +} + +/* + * Error throwing + */ + +DUK_EXTERNAL void duk_throw(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT(thr->valstack_bottom >= thr->valstack); + DUK_ASSERT(thr->valstack_top >= thr->valstack_bottom); + DUK_ASSERT(thr->valstack_end >= thr->valstack_top); + + if (thr->valstack_top == thr->valstack_bottom) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_CALL_ARGS); + } + + /* Errors are augmented when they are created, not when they are + * thrown or re-thrown. The current error handler, however, runs + * just before an error is thrown. + */ + + /* Sync so that augmentation sees up-to-date activations, NULL + * thr->ptr_curr_pc so that it's not used if side effects occur + * in augmentation or longjmp handling. + */ + duk_hthread_sync_and_null_currpc(thr); + +#if defined(DUK_USE_AUGMENT_ERROR_THROW) + DUK_DDD(DUK_DDDPRINT("THROW ERROR (API): %!dT (before throw augment)", (duk_tval *) duk_get_tval(ctx, -1))); + duk_err_augment_error_throw(thr); +#endif + DUK_DDD(DUK_DDDPRINT("THROW ERROR (API): %!dT (after throw augment)", (duk_tval *) duk_get_tval(ctx, -1))); + + duk_err_setup_heap_ljstate(thr, DUK_LJ_TYPE_THROW); + + /* thr->heap->lj.jmpbuf_ptr is checked by duk_err_longjmp() so we don't + * need to check that here. If the value is NULL, a panic occurs because + * we can't return. + */ + + duk_err_longjmp(thr); + DUK_UNREACHABLE(); +} + +DUK_EXTERNAL void duk_fatal(duk_context *ctx, duk_errcode_t err_code, const char *err_msg) { + duk_hthread *thr = (duk_hthread *) ctx; + + DUK_ASSERT_CTX_VALID(ctx); + DUK_ASSERT(thr != NULL); + DUK_ASSERT(thr->heap != NULL); + DUK_ASSERT(thr->heap->fatal_func != NULL); + + DUK_D(DUK_DPRINT("fatal error occurred, code %ld, message %s", + (long) err_code, (const char *) err_msg)); + + /* fatal_func should be noreturn, but noreturn declarations on function + * pointers has a very spotty support apparently so it's not currently + * done. + */ + thr->heap->fatal_func(ctx, err_code, err_msg); + + DUK_PANIC(DUK_ERR_API_ERROR, "fatal handler returned"); +} + +DUK_EXTERNAL void duk_error_va_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, va_list ap) { + DUK_ASSERT_CTX_VALID(ctx); + + duk_push_error_object_va_raw(ctx, err_code, filename, line, fmt, ap); + duk_throw(ctx); +} + +DUK_EXTERNAL void duk_error_raw(duk_context *ctx, duk_errcode_t err_code, const char *filename, duk_int_t line, const char *fmt, ...) { + va_list ap; + + DUK_ASSERT_CTX_VALID(ctx); + + va_start(ap, fmt); + duk_push_error_object_va_raw(ctx, err_code, filename, line, fmt, ap); + va_end(ap); + duk_throw(ctx); +} + +#if !defined(DUK_USE_VARIADIC_MACROS) +DUK_EXTERNAL void duk_error_stash(duk_context *ctx, duk_errcode_t err_code, const char *fmt, ...) { + const char *filename; + duk_int_t line; + va_list ap; + + DUK_ASSERT_CTX_VALID(ctx); + + filename = duk_api_global_filename; + line = duk_api_global_line; + duk_api_global_filename = NULL; + duk_api_global_line = 0; + + va_start(ap, fmt); + duk_push_error_object_va_raw(ctx, err_code, filename, line, fmt, ap); + va_end(ap); + duk_throw(ctx); +} +#endif /* DUK_USE_VARIADIC_MACROS */ + +/* + * Comparison + */ + +DUK_EXTERNAL duk_bool_t duk_equals(duk_context *ctx, duk_idx_t index1, duk_idx_t index2) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv1, *tv2; + + DUK_ASSERT_CTX_VALID(ctx); + + tv1 = duk_get_tval(ctx, index1); + tv2 = duk_get_tval(ctx, index2); + if ((tv1 == NULL) || (tv2 == NULL)) { + return 0; + } + + /* Coercion may be needed, the helper handles that by pushing the + * tagged values to the stack. + */ + return duk_js_equals(thr, tv1, tv2); +} + +DUK_EXTERNAL duk_bool_t duk_strict_equals(duk_context *ctx, duk_idx_t index1, duk_idx_t index2) { + duk_tval *tv1, *tv2; + + DUK_ASSERT_CTX_VALID(ctx); + + tv1 = duk_get_tval(ctx, index1); + tv2 = duk_get_tval(ctx, index2); + if ((tv1 == NULL) || (tv2 == NULL)) { + return 0; + } + + /* No coercions or other side effects, so safe */ + return duk_js_strict_equals(tv1, tv2); +} + +/* + * instanceof + */ + +DUK_EXTERNAL duk_bool_t duk_instanceof(duk_context *ctx, duk_idx_t index1, duk_idx_t index2) { + duk_tval *tv1, *tv2; + + DUK_ASSERT_CTX_VALID(ctx); + + /* Index validation is strict, which differs from duk_equals(). + * The strict behavior mimics how instanceof itself works, e.g. + * it is a TypeError if rval is not a -callable- object. It would + * be somewhat inconsistent if rval would be allowed to be + * non-existent without a TypeError. + */ + tv1 = duk_require_tval(ctx, index1); + DUK_ASSERT(tv1 != NULL); + tv2 = duk_require_tval(ctx, index2); + DUK_ASSERT(tv2 != NULL); + + return duk_js_instanceof((duk_hthread *) ctx, tv1, tv2); +} + +/* + * Lightfunc + */ + +DUK_INTERNAL void duk_push_lightfunc_name(duk_context *ctx, duk_tval *tv) { + duk_c_function func; + + DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv)); + + /* Lightfunc name, includes Duktape/C native function pointer, which + * can often be used to locate the function from a symbol table. + * The name also includes the 16-bit duk_tval flags field because it + * includes the magic value. Because a single native function often + * provides different functionality depending on the magic value, it + * seems reasonably to include it in the name. + * + * On the other hand, a complicated name increases string table + * pressure in low memory environments (but only when function name + * is accessed). + */ + + func = DUK_TVAL_GET_LIGHTFUNC_FUNCPTR(tv); + duk_push_sprintf(ctx, "light_"); + duk_push_string_funcptr(ctx, (duk_uint8_t *) &func, sizeof(func)); + duk_push_sprintf(ctx, "_%04x", (unsigned int) DUK_TVAL_GET_LIGHTFUNC_FLAGS(tv)); + duk_concat(ctx, 3); +} + +DUK_INTERNAL void duk_push_lightfunc_tostring(duk_context *ctx, duk_tval *tv) { + DUK_ASSERT(DUK_TVAL_IS_LIGHTFUNC(tv)); + + duk_push_string(ctx, "function "); + duk_push_lightfunc_name(ctx, tv); + duk_push_string(ctx, "() {/* light */}"); + duk_concat(ctx, 3); +} + +/* + * Function pointers + * + * Printing function pointers is non-portable, so we do that by hex printing + * bytes from memory. + */ + +DUK_INTERNAL void duk_push_string_funcptr(duk_context *ctx, duk_uint8_t *ptr, duk_size_t sz) { + duk_uint8_t buf[32 * 2]; + duk_uint8_t *p, *q; + duk_small_uint_t i; + duk_small_uint_t t; + + DUK_ASSERT(sz <= 32); /* sanity limit for function pointer size */ + + p = buf; +#if defined(DUK_USE_INTEGER_LE) + q = ptr + sz; +#else + q = ptr; +#endif + for (i = 0; i < sz; i++) { +#if defined(DUK_USE_INTEGER_LE) + t = *(--q); +#else + t = *(q++); +#endif + *p++ = duk_lc_digits[t >> 4]; + *p++ = duk_lc_digits[t & 0x0f]; + } + + duk_push_lstring(ctx, (const char *) buf, sz * 2); +} + +#undef DUK__CHECK_SPACE diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_string.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_string.c new file mode 100644 index 00000000..4d23c932 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_string.c @@ -0,0 +1,330 @@ +/* + * String manipulation + */ + +#include "duk_internal.h" + +DUK_LOCAL void duk__concat_and_join_helper(duk_context *ctx, duk_idx_t count_in, duk_bool_t is_join) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_uint_t count; + duk_uint_t i; + duk_size_t idx; + duk_size_t len; + duk_hstring *h; + duk_uint8_t *buf; + + DUK_ASSERT_CTX_VALID(ctx); + + if (DUK_UNLIKELY(count_in <= 0)) { + if (count_in < 0) { + DUK_ERROR(thr, DUK_ERR_API_ERROR, DUK_STR_INVALID_COUNT); + return; + } + DUK_ASSERT(count_in == 0); + duk_push_hstring_stridx(ctx, DUK_STRIDX_EMPTY_STRING); + return; + } + count = (duk_uint_t) count_in; + + if (is_join) { + duk_size_t t1, t2, limit; + h = duk_to_hstring(ctx, -((duk_idx_t) count) - 1); + DUK_ASSERT(h != NULL); + + /* A bit tricky overflow test, see doc/code-issues.rst. */ + t1 = (duk_size_t) DUK_HSTRING_GET_BYTELEN(h); + t2 = (duk_size_t) (count - 1); + limit = (duk_size_t) DUK_HSTRING_MAX_BYTELEN; + if (DUK_UNLIKELY(t2 != 0 && t1 > limit / t2)) { + /* Combined size of separators already overflows */ + goto error_overflow; + } + len = (duk_size_t) (t1 * t2); + } else { + len = (duk_size_t) 0; + } + + for (i = count; i >= 1; i--) { + duk_size_t new_len; + duk_to_string(ctx, -((duk_idx_t) i)); + h = duk_require_hstring(ctx, -((duk_idx_t) i)); + new_len = len + (duk_size_t) DUK_HSTRING_GET_BYTELEN(h); + + /* Impose a string maximum length, need to handle overflow + * correctly. + */ + if (new_len < len || /* wrapped */ + new_len > (duk_size_t) DUK_HSTRING_MAX_BYTELEN) { + goto error_overflow; + } + len = new_len; + } + + DUK_DDD(DUK_DDDPRINT("join/concat %lu strings, total length %lu bytes", + (unsigned long) count, (unsigned long) len)); + + /* use stack allocated buffer to ensure reachability in errors (e.g. intern error) */ + buf = (duk_uint8_t *) duk_push_fixed_buffer(ctx, len); + DUK_ASSERT(buf != NULL); + + /* [... (sep) str1 str2 ... strN buf] */ + + idx = 0; + for (i = count; i >= 1; i--) { + if (is_join && i != count) { + h = duk_require_hstring(ctx, -((duk_idx_t) count) - 2); /* extra -1 for buffer */ + DUK_MEMCPY(buf + idx, DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); + idx += DUK_HSTRING_GET_BYTELEN(h); + } + h = duk_require_hstring(ctx, -((duk_idx_t) i) - 1); /* extra -1 for buffer */ + DUK_MEMCPY(buf + idx, DUK_HSTRING_GET_DATA(h), DUK_HSTRING_GET_BYTELEN(h)); + idx += DUK_HSTRING_GET_BYTELEN(h); + } + + DUK_ASSERT(idx == len); + + /* [... (sep) str1 str2 ... strN buf] */ + + /* get rid of the strings early to minimize memory use before intern */ + + if (is_join) { + duk_replace(ctx, -((duk_idx_t) count) - 2); /* overwrite sep */ + duk_pop_n(ctx, count); + } else { + duk_replace(ctx, -((duk_idx_t) count) - 1); /* overwrite str1 */ + duk_pop_n(ctx, count-1); + } + + /* [... buf] */ + + (void) duk_to_string(ctx, -1); + + /* [... res] */ + return; + + error_overflow: + DUK_ERROR(thr, DUK_ERR_RANGE_ERROR, DUK_STR_CONCAT_RESULT_TOO_LONG); +} + +DUK_EXTERNAL void duk_concat(duk_context *ctx, duk_idx_t count) { + DUK_ASSERT_CTX_VALID(ctx); + + duk__concat_and_join_helper(ctx, count, 0 /*is_join*/); +} + +DUK_EXTERNAL void duk_join(duk_context *ctx, duk_idx_t count) { + DUK_ASSERT_CTX_VALID(ctx); + + duk__concat_and_join_helper(ctx, count, 1 /*is_join*/); +} + +/* XXX: could map/decode be unified with duk_unicode_support.c code? + * Case conversion needs also the character surroundings though. + */ + +DUK_EXTERNAL void duk_decode_string(duk_context *ctx, duk_idx_t index, duk_decode_char_function callback, void *udata) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hstring *h_input; + const duk_uint8_t *p, *p_start, *p_end; + duk_codepoint_t cp; + + DUK_ASSERT_CTX_VALID(ctx); + + h_input = duk_require_hstring(ctx, index); + DUK_ASSERT(h_input != NULL); + + p_start = (duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input); + p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input); + p = p_start; + + for (;;) { + if (p >= p_end) { + break; + } + cp = (int) duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end); + callback(udata, cp); + } +} + +DUK_EXTERNAL void duk_map_string(duk_context *ctx, duk_idx_t index, duk_map_char_function callback, void *udata) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hstring *h_input; + duk_bufwriter_ctx bw_alloc; + duk_bufwriter_ctx *bw; + const duk_uint8_t *p, *p_start, *p_end; + duk_codepoint_t cp; + + DUK_ASSERT_CTX_VALID(ctx); + + index = duk_normalize_index(ctx, index); + + h_input = duk_require_hstring(ctx, index); + DUK_ASSERT(h_input != NULL); + + bw = &bw_alloc; + DUK_BW_INIT_PUSHBUF(thr, bw, DUK_HSTRING_GET_BYTELEN(h_input)); /* reasonable output estimate */ + + p_start = (duk_uint8_t *) DUK_HSTRING_GET_DATA(h_input); + p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_input); + p = p_start; + + for (;;) { + /* XXX: could write output in chunks with fewer ensure calls, + * but relative benefit would be small here. + */ + + if (p >= p_end) { + break; + } + cp = (int) duk_unicode_decode_xutf8_checked(thr, &p, p_start, p_end); + cp = callback(udata, cp); + + DUK_BW_WRITE_ENSURE_XUTF8(thr, bw, cp); + } + + DUK_BW_COMPACT(thr, bw); + duk_to_string(ctx, -1); + duk_replace(ctx, index); +} + +DUK_EXTERNAL void duk_substring(duk_context *ctx, duk_idx_t index, duk_size_t start_offset, duk_size_t end_offset) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hstring *h; + duk_hstring *res; + duk_size_t start_byte_offset; + duk_size_t end_byte_offset; + + DUK_ASSERT_CTX_VALID(ctx); + + index = duk_require_normalize_index(ctx, index); + h = duk_require_hstring(ctx, index); + DUK_ASSERT(h != NULL); + + if (end_offset >= DUK_HSTRING_GET_CHARLEN(h)) { + end_offset = DUK_HSTRING_GET_CHARLEN(h); + } + if (start_offset > end_offset) { + start_offset = end_offset; + } + + DUK_ASSERT_DISABLE(start_offset >= 0); + DUK_ASSERT(start_offset <= end_offset && start_offset <= DUK_HSTRING_GET_CHARLEN(h)); + DUK_ASSERT_DISABLE(end_offset >= 0); + DUK_ASSERT(end_offset >= start_offset && end_offset <= DUK_HSTRING_GET_CHARLEN(h)); + + /* guaranteed by string limits */ + DUK_ASSERT(start_offset <= DUK_UINT32_MAX); + DUK_ASSERT(end_offset <= DUK_UINT32_MAX); + + start_byte_offset = (duk_size_t) duk_heap_strcache_offset_char2byte(thr, h, (duk_uint_fast32_t) start_offset); + end_byte_offset = (duk_size_t) duk_heap_strcache_offset_char2byte(thr, h, (duk_uint_fast32_t) end_offset); + + DUK_ASSERT(end_byte_offset >= start_byte_offset); + DUK_ASSERT(end_byte_offset - start_byte_offset <= DUK_UINT32_MAX); /* guaranteed by string limits */ + + /* no size check is necessary */ + res = duk_heap_string_intern_checked(thr, + DUK_HSTRING_GET_DATA(h) + start_byte_offset, + (duk_uint32_t) (end_byte_offset - start_byte_offset)); + + duk_push_hstring(ctx, res); + duk_replace(ctx, index); +} + +/* XXX: this is quite clunky. Add Unicode helpers to scan backwards and + * forwards with a callback to process codepoints? + */ +DUK_EXTERNAL void duk_trim(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hstring *h; + const duk_uint8_t *p, *p_start, *p_end, *p_tmp1, *p_tmp2; /* pointers for scanning */ + const duk_uint8_t *q_start, *q_end; /* start (incl) and end (excl) of trimmed part */ + duk_codepoint_t cp; + + DUK_ASSERT_CTX_VALID(ctx); + + index = duk_require_normalize_index(ctx, index); + h = duk_require_hstring(ctx, index); + DUK_ASSERT(h != NULL); + + p_start = DUK_HSTRING_GET_DATA(h); + p_end = p_start + DUK_HSTRING_GET_BYTELEN(h); + + p = p_start; + while (p < p_end) { + p_tmp1 = p; + cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p_tmp1, p_start, p_end); + if (!(duk_unicode_is_whitespace(cp) || duk_unicode_is_line_terminator(cp))) { + break; + } + p = p_tmp1; + } + q_start = p; + if (p == p_end) { + /* entire string is whitespace */ + q_end = p; + goto scan_done; + } + + p = p_end; + while (p > p_start) { + p_tmp1 = p; + while (p > p_start) { + p--; + if (((*p) & 0xc0) != 0x80) { + break; + } + } + p_tmp2 = p; + + cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &p_tmp2, p_start, p_end); + if (!(duk_unicode_is_whitespace(cp) || duk_unicode_is_line_terminator(cp))) { + p = p_tmp1; + break; + } + } + q_end = p; + + scan_done: + /* This may happen when forward and backward scanning disagree + * (possible for non-extended-UTF-8 strings). + */ + if (q_end < q_start) { + q_end = q_start; + } + + DUK_ASSERT(q_start >= p_start && q_start <= p_end); + DUK_ASSERT(q_end >= p_start && q_end <= p_end); + DUK_ASSERT(q_end >= q_start); + + DUK_DDD(DUK_DDDPRINT("trim: p_start=%p, p_end=%p, q_start=%p, q_end=%p", + (void *) p_start, (void *) p_end, (void *) q_start, (void *) q_end)); + + if (q_start == p_start && q_end == p_end) { + DUK_DDD(DUK_DDDPRINT("nothing was trimmed: avoid interning (hashing etc)")); + return; + } + + duk_push_lstring(ctx, (const char *) q_start, (duk_size_t) (q_end - q_start)); + duk_replace(ctx, index); +} + +DUK_EXTERNAL duk_codepoint_t duk_char_code_at(duk_context *ctx, duk_idx_t index, duk_size_t char_offset) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hstring *h; + duk_ucodepoint_t cp; + + DUK_ASSERT_CTX_VALID(ctx); + + h = duk_require_hstring(ctx, index); + DUK_ASSERT(h != NULL); + + DUK_ASSERT_DISABLE(char_offset >= 0); /* always true, arg is unsigned */ + if (char_offset >= DUK_HSTRING_GET_CHARLEN(h)) { + return 0; + } + + DUK_ASSERT(char_offset <= DUK_UINT_MAX); /* guaranteed by string limits */ + cp = duk_hstring_char_code_at_raw(thr, h, (duk_uint_t) char_offset); + return (duk_codepoint_t) cp; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_var.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_var.c new file mode 100644 index 00000000..23629d84 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_api_var.c @@ -0,0 +1,86 @@ +/* + * Variable access + */ + +#include "duk_internal.h" + +DUK_EXTERNAL void duk_get_var(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_activation *act; + duk_hstring *h_varname; + duk_small_int_t throw_flag = 1; /* always throw ReferenceError for unresolvable */ + + DUK_ASSERT_CTX_VALID(ctx); + + h_varname = duk_require_hstring(ctx, -1); /* XXX: tostring? */ + DUK_ASSERT(h_varname != NULL); + + act = duk_hthread_get_current_activation(thr); + if (act) { + (void) duk_js_getvar_activation(thr, act, h_varname, throw_flag); /* -> [ ... varname val this ] */ + } else { + /* Outside any activation -> look up from global. */ + DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL_ENV] != NULL); + (void) duk_js_getvar_envrec(thr, thr->builtins[DUK_BIDX_GLOBAL_ENV], h_varname, throw_flag); + } + + /* [ ... varname val this ] (because throw_flag == 1, always resolved) */ + + duk_pop(ctx); + duk_remove(ctx, -2); + + /* [ ... val ] */ + + /* Return value would be pointless: because throw_flag==1, we always + * throw if the identifier doesn't resolve. + */ + return; +} + +DUK_EXTERNAL void duk_put_var(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_activation *act; + duk_hstring *h_varname; + duk_tval *tv_val; + duk_small_int_t throw_flag; + + DUK_ASSERT_CTX_VALID(ctx); + + h_varname = duk_require_hstring(ctx, -2); /* XXX: tostring? */ + DUK_ASSERT(h_varname != NULL); + + tv_val = duk_require_tval(ctx, -1); + + throw_flag = duk_is_strict_call(ctx); + + act = duk_hthread_get_current_activation(thr); + if (act) { + duk_js_putvar_activation(thr, act, h_varname, tv_val, throw_flag); /* -> [ ... varname val this ] */ + } else { + /* Outside any activation -> put to global. */ + DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL_ENV] != NULL); + duk_js_putvar_envrec(thr, thr->builtins[DUK_BIDX_GLOBAL_ENV], h_varname, tv_val, throw_flag); + } + + /* [ ... varname val ] */ + + duk_pop_2(ctx); + + /* [ ... ] */ + + return; +} + +DUK_EXTERNAL duk_bool_t duk_del_var(duk_context *ctx) { + DUK_ASSERT_CTX_VALID(ctx); + + DUK_ERROR((duk_hthread *) ctx, DUK_ERR_UNIMPLEMENTED_ERROR, DUK_STR_UNIMPLEMENTED); + return 0; +} + +DUK_EXTERNAL duk_bool_t duk_has_var(duk_context *ctx) { + DUK_ASSERT_CTX_VALID(ctx); + + DUK_ERROR((duk_hthread *) ctx, DUK_ERR_UNIMPLEMENTED_ERROR, DUK_STR_UNIMPLEMENTED); + return 0; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_array.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_array.c new file mode 100644 index 00000000..10c201dd --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_array.c @@ -0,0 +1,1450 @@ +/* + * Array built-ins + * + * Note that most Array built-ins are intentionally generic and work even + * when the 'this' binding is not an Array instance. To ensure this, + * Array algorithms do not assume "magical" Array behavior for the "length" + * property, for instance. + * + * XXX: the "Throw" flag should be set for (almost?) all [[Put]] and + * [[Delete]] operations, but it's currently false throughout. Go through + * all put/delete cases and check throw flag use. Need a new API primitive + * which allows throws flag to be specified. + * + * XXX: array lengths above 2G won't work reliably. There are many places + * where one needs a full signed 32-bit range ([-0xffffffff, 0xffffffff], + * i.e. -33- bits). Although array 'length' cannot be written to be outside + * the unsigned 32-bit range (E5.1 Section 15.4.5.1 throws a RangeError if so) + * some intermediate values may be above 0xffffffff and this may not be always + * correctly handled now (duk_uint32_t is not enough for all algorithms). + * + * For instance, push() can legitimately write entries beyond length 0xffffffff + * and cause a RangeError only at the end. To do this properly, the current + * push() implementation tracks the array index using a 'double' instead of a + * duk_uint32_t (which is somewhat awkward). See test-bi-array-push-maxlen.js. + * + * On using "put" vs. "def" prop + * ============================= + * + * Code below must be careful to use the appropriate primitive as it matters + * for compliance. When using "put" there may be inherited properties in + * Array.prototype which cause side effects when values are written. When + * using "define" there are no such side effects, and many test262 test cases + * check for this (for real world code, such side effects are very rare). + * Both "put" and "define" are used in the E5.1 specification; as a rule, + * "put" is used when modifying an existing array (or a non-array 'this' + * binding) and "define" for setting values into a fresh result array. + * + * Also note that Array instance 'length' should be writable, but not + * enumerable and definitely not configurable: even Duktape code internally + * assumes that an Array instance will always have a 'length' property. + * Preventing deletion of the property is critical. + */ + +#include "duk_internal.h" + +/* Perform an intermediate join when this many elements have been pushed + * on the value stack. + */ +#define DUK__ARRAY_MID_JOIN_LIMIT 4096 + +/* Shared entry code for many Array built-ins. Note that length is left + * on stack (it could be popped, but that's not necessary). + */ +DUK_LOCAL duk_uint32_t duk__push_this_obj_len_u32(duk_context *ctx) { + duk_uint32_t len; + + (void) duk_push_this_coercible_to_object(ctx); + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_LENGTH); + len = duk_to_uint32(ctx, -1); + + /* -> [ ... ToObject(this) ToUint32(length) ] */ + return len; +} + +DUK_LOCAL duk_uint32_t duk__push_this_obj_len_u32_limited(duk_context *ctx) { + /* Range limited to [0, 0x7fffffff] range, i.e. range that can be + * represented with duk_int32_t. Use this when the method doesn't + * handle the full 32-bit unsigned range correctly. + */ + duk_uint32_t ret = duk__push_this_obj_len_u32(ctx); + if (DUK_UNLIKELY(ret >= 0x80000000UL)) { + DUK_ERROR((duk_hthread *) ctx, DUK_ERR_INTERNAL_ERROR, DUK_STR_ARRAY_LENGTH_OVER_2G); + } + return ret; +} + +/* + * Constructor + */ + +DUK_INTERNAL duk_ret_t duk_bi_array_constructor(duk_context *ctx) { + duk_idx_t nargs; + duk_double_t d; + duk_uint32_t len; + duk_idx_t i; + + nargs = duk_get_top(ctx); + duk_push_array(ctx); + + if (nargs == 1 && duk_is_number(ctx, 0)) { + /* XXX: expensive check (also shared elsewhere - so add a shared internal API call?) */ + d = duk_get_number(ctx, 0); + len = duk_to_uint32(ctx, 0); + if (((duk_double_t) len) != d) { + return DUK_RET_RANGE_ERROR; + } + + /* XXX: if 'len' is low, may want to ensure array part is kept: + * the caller is likely to want a dense array. + */ + duk_push_u32(ctx, len); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W); /* [ ToUint32(len) array ToUint32(len) ] -> [ ToUint32(len) array ] */ + return 1; + } + + /* XXX: optimize by creating array into correct size directly, and + * operating on the array part directly; values can be memcpy()'d from + * value stack directly as long as refcounts are increased. + */ + for (i = 0; i < nargs; i++) { + duk_dup(ctx, i); + duk_xdef_prop_index_wec(ctx, -2, (duk_uarridx_t) i); + } + + duk_push_u32(ctx, (duk_uint32_t) nargs); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W); + return 1; +} + +/* + * isArray() + */ + +DUK_INTERNAL duk_ret_t duk_bi_array_constructor_is_array(duk_context *ctx) { + duk_hobject *h; + + h = duk_get_hobject_with_class(ctx, 0, DUK_HOBJECT_CLASS_ARRAY); + duk_push_boolean(ctx, (h != NULL)); + return 1; +} + +/* + * toString() + */ + +DUK_INTERNAL duk_ret_t duk_bi_array_prototype_to_string(duk_context *ctx) { + (void) duk_push_this_coercible_to_object(ctx); + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_JOIN); + + /* [ ... this func ] */ + if (!duk_is_callable(ctx, -1)) { + /* Fall back to the initial (original) Object.toString(). We don't + * currently have pointers to the built-in functions, only the top + * level global objects (like "Array") so this is now done in a bit + * of a hacky manner. It would be cleaner to push the (original) + * function and use duk_call_method(). + */ + + /* XXX: 'this' will be ToObject() coerced twice, which is incorrect + * but should have no visible side effects. + */ + DUK_DDD(DUK_DDDPRINT("this.join is not callable, fall back to (original) Object.toString")); + duk_set_top(ctx, 0); + return duk_bi_object_prototype_to_string(ctx); /* has access to 'this' binding */ + } + + /* [ ... this func ] */ + + duk_insert(ctx, -2); + + /* [ ... func this ] */ + + DUK_DDD(DUK_DDDPRINT("calling: func=%!iT, this=%!iT", + (duk_tval *) duk_get_tval(ctx, -2), + (duk_tval *) duk_get_tval(ctx, -1))); + duk_call_method(ctx, 0); + + return 1; +} + +/* + * concat() + */ + +DUK_INTERNAL duk_ret_t duk_bi_array_prototype_concat(duk_context *ctx) { + duk_idx_t i, n; + duk_uarridx_t idx, idx_last; + duk_uarridx_t j, len; + duk_hobject *h; + + /* XXX: the insert here is a bit expensive if there are a lot of items. + * It could also be special cased in the outermost for loop quite easily + * (as the element is dup()'d anyway). + */ + + (void) duk_push_this_coercible_to_object(ctx); + duk_insert(ctx, 0); + n = duk_get_top(ctx); + duk_push_array(ctx); /* -> [ ToObject(this) item1 ... itemN arr ] */ + + /* NOTE: The Array special behaviors are NOT invoked by duk_xdef_prop_index() + * (which differs from the official algorithm). If no error is thrown, this + * doesn't matter as the length is updated at the end. However, if an error + * is thrown, the length will be unset. That shouldn't matter because the + * caller won't get a reference to the intermediate value. + */ + + idx = 0; + idx_last = 0; + for (i = 0; i < n; i++) { + DUK_ASSERT_TOP(ctx, n + 1); + + /* [ ToObject(this) item1 ... itemN arr ] */ + + duk_dup(ctx, i); + h = duk_get_hobject_with_class(ctx, -1, DUK_HOBJECT_CLASS_ARRAY); + if (!h) { + duk_xdef_prop_index_wec(ctx, -2, idx++); + idx_last = idx; + continue; + } + + /* [ ToObject(this) item1 ... itemN arr item(i) ] */ + + /* XXX: an array can have length higher than 32 bits; this is not handled + * correctly now. + */ + len = (duk_uarridx_t) duk_get_length(ctx, -1); + for (j = 0; j < len; j++) { + if (duk_get_prop_index(ctx, -1, j)) { + /* [ ToObject(this) item1 ... itemN arr item(i) item(i)[j] ] */ + duk_xdef_prop_index_wec(ctx, -3, idx++); + idx_last = idx; + } else { + idx++; + duk_pop(ctx); +#if defined(DUK_USE_NONSTD_ARRAY_CONCAT_TRAILER) + /* According to E5.1 Section 15.4.4.4 nonexistent trailing + * elements do not affect 'length' of the result. Test262 + * and other engines disagree, so update idx_last here too. + */ + idx_last = idx; +#else + /* Strict standard behavior, ignore trailing elements for + * result 'length'. + */ +#endif + } + } + duk_pop(ctx); + } + + /* The E5.1 Section 15.4.4.4 algorithm doesn't set the length explicitly + * in the end, but because we're operating with an internal value which + * is known to be an array, this should be equivalent. + */ + duk_push_uarridx(ctx, idx_last); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W); + + DUK_ASSERT_TOP(ctx, n + 1); + return 1; +} + +/* + * join(), toLocaleString() + * + * Note: checking valstack is necessary, but only in the per-element loop. + * + * Note: the trivial approach of pushing all the elements on the value stack + * and then calling duk_join() fails when the array contains a large number + * of elements. This problem can't be offloaded to duk_join() because the + * elements to join must be handled here and have special handling. Current + * approach is to do intermediate joins with very large number of elements. + * There is no fancy handling; the prefix gets re-joined multiple times. + */ + +DUK_INTERNAL duk_ret_t duk_bi_array_prototype_join_shared(duk_context *ctx) { + duk_uint32_t len, count; + duk_uint32_t idx; + duk_small_int_t to_locale_string = duk_get_current_magic(ctx); + duk_idx_t valstack_required; + + /* For join(), nargs is 1. For toLocaleString(), nargs is 0 and + * setting the top essentially pushes an undefined to the stack, + * thus defaulting to a comma separator. + */ + duk_set_top(ctx, 1); + if (duk_is_undefined(ctx, 0)) { + duk_pop(ctx); + duk_push_hstring_stridx(ctx, DUK_STRIDX_COMMA); + } else { + duk_to_string(ctx, 0); + } + + len = duk__push_this_obj_len_u32(ctx); + + /* [ sep ToObject(this) len ] */ + + DUK_DDD(DUK_DDDPRINT("sep=%!T, this=%!T, len=%lu", + (duk_tval *) duk_get_tval(ctx, 0), + (duk_tval *) duk_get_tval(ctx, 1), + (unsigned long) len)); + + /* The extra (+4) is tight. */ + valstack_required = (len >= DUK__ARRAY_MID_JOIN_LIMIT ? + DUK__ARRAY_MID_JOIN_LIMIT : len) + 4; + duk_require_stack(ctx, valstack_required); + + duk_dup(ctx, 0); + + /* [ sep ToObject(this) len sep ] */ + + count = 0; + idx = 0; + for (;;) { + if (count >= DUK__ARRAY_MID_JOIN_LIMIT || /* intermediate join to avoid valstack overflow */ + idx >= len) { /* end of loop (careful with len==0) */ + /* [ sep ToObject(this) len sep str0 ... str(count-1) ] */ + DUK_DDD(DUK_DDDPRINT("mid/final join, count=%ld, idx=%ld, len=%ld", + (long) count, (long) idx, (long) len)); + duk_join(ctx, (duk_idx_t) count); /* -> [ sep ToObject(this) len str ] */ + duk_dup(ctx, 0); /* -> [ sep ToObject(this) len str sep ] */ + duk_insert(ctx, -2); /* -> [ sep ToObject(this) len sep str ] */ + count = 1; + } + if (idx >= len) { + /* if true, the stack already contains the final result */ + break; + } + + duk_get_prop_index(ctx, 1, (duk_uarridx_t) idx); + if (duk_is_null_or_undefined(ctx, -1)) { + duk_pop(ctx); + duk_push_hstring_stridx(ctx, DUK_STRIDX_EMPTY_STRING); + } else { + if (to_locale_string) { + duk_to_object(ctx, -1); + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_TO_LOCALE_STRING); + duk_insert(ctx, -2); /* -> [ ... toLocaleString ToObject(val) ] */ + duk_call_method(ctx, 0); + duk_to_string(ctx, -1); + } else { + duk_to_string(ctx, -1); + } + } + + count++; + idx++; + } + + /* [ sep ToObject(this) len sep result ] */ + + return 1; +} + +/* + * pop(), push() + */ + +DUK_INTERNAL duk_ret_t duk_bi_array_prototype_pop(duk_context *ctx) { + duk_uint32_t len; + duk_uint32_t idx; + + DUK_ASSERT_TOP(ctx, 0); + len = duk__push_this_obj_len_u32(ctx); + if (len == 0) { + duk_push_int(ctx, 0); + duk_put_prop_stridx(ctx, 0, DUK_STRIDX_LENGTH); + return 0; + } + idx = len - 1; + + duk_get_prop_index(ctx, 0, (duk_uarridx_t) idx); + duk_del_prop_index(ctx, 0, (duk_uarridx_t) idx); + duk_push_u32(ctx, idx); + duk_put_prop_stridx(ctx, 0, DUK_STRIDX_LENGTH); + return 1; +} + +DUK_INTERNAL duk_ret_t duk_bi_array_prototype_push(duk_context *ctx) { + /* Note: 'this' is not necessarily an Array object. The push() + * algorithm is supposed to work for other kinds of objects too, + * so the algorithm has e.g. an explicit update for the 'length' + * property which is normally "magical" in arrays. + */ + + duk_uint32_t len; + duk_idx_t i, n; + + n = duk_get_top(ctx); + len = duk__push_this_obj_len_u32(ctx); + + /* [ arg1 ... argN obj length ] */ + + /* Technically Array.prototype.push() can create an Array with length + * longer than 2^32-1, i.e. outside the 32-bit range. The final length + * is *not* wrapped to 32 bits in the specification. + * + * This implementation tracks length with a uint32 because it's much + * more practical. + * + * See: test-bi-array-push-maxlen.js. + */ + + if (len + (duk_uint32_t) n < len) { + DUK_D(DUK_DPRINT("Array.prototype.push() would go beyond 32-bit length, throw")); + return DUK_RET_RANGE_ERROR; + } + + for (i = 0; i < n; i++) { + duk_dup(ctx, i); + duk_put_prop_index(ctx, -3, len + i); + } + len += n; + + duk_push_u32(ctx, len); + duk_dup_top(ctx); + duk_put_prop_stridx(ctx, -4, DUK_STRIDX_LENGTH); + + /* [ arg1 ... argN obj length new_length ] */ + return 1; +} + +/* + * sort() + * + * Currently qsort with random pivot. This is now really, really slow, + * because there is no fast path for array parts. + * + * Signed indices are used because qsort() leaves and degenerate cases + * may use a negative offset. + */ + +DUK_LOCAL duk_small_int_t duk__array_sort_compare(duk_context *ctx, duk_int_t idx1, duk_int_t idx2) { + duk_bool_t have1, have2; + duk_bool_t undef1, undef2; + duk_small_int_t ret; + duk_idx_t idx_obj = 1; /* fixed offsets in valstack */ + duk_idx_t idx_fn = 0; + duk_hstring *h1, *h2; + + /* Fast exit if indices are identical. This is valid for a non-existent property, + * for an undefined value, and almost always for ToString() coerced comparison of + * arbitrary values (corner cases where this is not the case include e.g. a an + * object with varying ToString() coercion). + * + * The specification does not prohibit "caching" of values read from the array, so + * assuming equality for comparing an index with itself falls into the category of + * "caching". + * + * Also, compareFn may be inconsistent, so skipping a call to compareFn here may + * have an effect on the final result. The specification does not require any + * specific behavior for inconsistent compare functions, so again, this fast path + * is OK. + */ + + if (idx1 == idx2) { + DUK_DDD(DUK_DDDPRINT("duk__array_sort_compare: idx1=%ld, idx2=%ld -> indices identical, quick exit", + (long) idx1, (long) idx2)); + return 0; + } + + have1 = duk_get_prop_index(ctx, idx_obj, (duk_uarridx_t) idx1); + have2 = duk_get_prop_index(ctx, idx_obj, (duk_uarridx_t) idx2); + + DUK_DDD(DUK_DDDPRINT("duk__array_sort_compare: idx1=%ld, idx2=%ld, have1=%ld, have2=%ld, val1=%!T, val2=%!T", + (long) idx1, (long) idx2, (long) have1, (long) have2, + (duk_tval *) duk_get_tval(ctx, -2), (duk_tval *) duk_get_tval(ctx, -1))); + + if (have1) { + if (have2) { + ; + } else { + ret = -1; + goto pop_ret; + } + } else { + if (have2) { + ret = 1; + goto pop_ret; + } else { + ret = 0; + goto pop_ret; + } + } + + undef1 = duk_is_undefined(ctx, -2); + undef2 = duk_is_undefined(ctx, -1); + if (undef1) { + if (undef2) { + ret = 0; + goto pop_ret; + } else { + ret = 1; + goto pop_ret; + } + } else { + if (undef2) { + ret = -1; + goto pop_ret; + } else { + ; + } + } + + if (!duk_is_undefined(ctx, idx_fn)) { + duk_double_t d; + + /* no need to check callable; duk_call() will do that */ + duk_dup(ctx, idx_fn); /* -> [ ... x y fn ] */ + duk_insert(ctx, -3); /* -> [ ... fn x y ] */ + duk_call(ctx, 2); /* -> [ ... res ] */ + + /* The specification is a bit vague what to do if the return + * value is not a number. Other implementations seem to + * tolerate non-numbers but e.g. V8 won't apparently do a + * ToNumber(). + */ + + /* XXX: best behavior for real world compatibility? */ + + d = duk_to_number(ctx, -1); + if (d < 0.0) { + ret = -1; + } else if (d > 0.0) { + ret = 1; + } else { + ret = 0; + } + + duk_pop(ctx); + DUK_DDD(DUK_DDDPRINT("-> result %ld (from comparefn, after coercion)", (long) ret)); + return ret; + } + + /* string compare is the default (a bit oddly) */ + + h1 = duk_to_hstring(ctx, -2); + h2 = duk_to_hstring(ctx, -1); + DUK_ASSERT(h1 != NULL); + DUK_ASSERT(h2 != NULL); + + ret = duk_js_string_compare(h1, h2); /* retval is directly usable */ + goto pop_ret; + + pop_ret: + duk_pop_2(ctx); + DUK_DDD(DUK_DDDPRINT("-> result %ld", (long) ret)); + return ret; +} + +DUK_LOCAL void duk__array_sort_swap(duk_context *ctx, duk_int_t l, duk_int_t r) { + duk_bool_t have_l, have_r; + duk_idx_t idx_obj = 1; /* fixed offset in valstack */ + + if (l == r) { + return; + } + + /* swap elements; deal with non-existent elements correctly */ + have_l = duk_get_prop_index(ctx, idx_obj, (duk_uarridx_t) l); + have_r = duk_get_prop_index(ctx, idx_obj, (duk_uarridx_t) r); + + if (have_r) { + /* right exists, [[Put]] regardless whether or not left exists */ + duk_put_prop_index(ctx, idx_obj, (duk_uarridx_t) l); + } else { + duk_del_prop_index(ctx, idx_obj, (duk_uarridx_t) l); + duk_pop(ctx); + } + + if (have_l) { + duk_put_prop_index(ctx, idx_obj, (duk_uarridx_t) r); + } else { + duk_del_prop_index(ctx, idx_obj, (duk_uarridx_t) r); + duk_pop(ctx); + } +} + +#if defined(DUK_USE_DDDPRINT) +/* Debug print which visualizes the qsort partitioning process. */ +DUK_LOCAL void duk__debuglog_qsort_state(duk_context *ctx, duk_int_t lo, duk_int_t hi, duk_int_t pivot) { + char buf[4096]; + char *ptr = buf; + duk_int_t i, n; + n = (duk_int_t) duk_get_length(ctx, 1); + if (n > 4000) { + n = 4000; + } + *ptr++ = '['; + for (i = 0; i < n; i++) { + if (i == pivot) { + *ptr++ = '|'; + } else if (i == lo) { + *ptr++ = '<'; + } else if (i == hi) { + *ptr++ = '>'; + } else if (i >= lo && i <= hi) { + *ptr++ = '-'; + } else { + *ptr++ = ' '; + } + } + *ptr++ = ']'; + *ptr++ = '\0'; + + DUK_DDD(DUK_DDDPRINT("%s (lo=%ld, hi=%ld, pivot=%ld)", + (const char *) buf, (long) lo, (long) hi, (long) pivot)); +} +#endif + +DUK_LOCAL void duk__array_qsort(duk_context *ctx, duk_int_t lo, duk_int_t hi) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_int_t p, l, r; + + /* The lo/hi indices may be crossed and hi < 0 is possible at entry. */ + + DUK_DDD(DUK_DDDPRINT("duk__array_qsort: lo=%ld, hi=%ld, obj=%!T", + (long) lo, (long) hi, (duk_tval *) duk_get_tval(ctx, 1))); + + DUK_ASSERT_TOP(ctx, 3); + + /* In some cases it may be that lo > hi, or hi < 0; these + * degenerate cases happen e.g. for empty arrays, and in + * recursion leaves. + */ + + /* trivial cases */ + if (hi - lo < 1) { + DUK_DDD(DUK_DDDPRINT("degenerate case, return immediately")); + return; + } + DUK_ASSERT(hi > lo); + DUK_ASSERT(hi - lo + 1 >= 2); + + /* randomized pivot selection */ + p = lo + (duk_util_tinyrandom_get_bits(thr, 30) % (hi - lo + 1)); /* rnd in [lo,hi] */ + DUK_ASSERT(p >= lo && p <= hi); + DUK_DDD(DUK_DDDPRINT("lo=%ld, hi=%ld, chose pivot p=%ld", + (long) lo, (long) hi, (long) p)); + + /* move pivot out of the way */ + duk__array_sort_swap(ctx, p, lo); + p = lo; + DUK_DDD(DUK_DDDPRINT("pivot moved out of the way: %!T", (duk_tval *) duk_get_tval(ctx, 1))); + + l = lo + 1; + r = hi; + for (;;) { + /* find elements to swap */ + for (;;) { + DUK_DDD(DUK_DDDPRINT("left scan: l=%ld, r=%ld, p=%ld", + (long) l, (long) r, (long) p)); + if (l >= hi) { + break; + } + if (duk__array_sort_compare(ctx, l, p) >= 0) { /* !(l < p) */ + break; + } + l++; + } + for (;;) { + DUK_DDD(DUK_DDDPRINT("right scan: l=%ld, r=%ld, p=%ld", + (long) l, (long) r, (long) p)); + if (r <= lo) { + break; + } + if (duk__array_sort_compare(ctx, p, r) >= 0) { /* !(p < r) */ + break; + } + r--; + } + if (l >= r) { + goto done; + } + DUK_ASSERT(l < r); + + DUK_DDD(DUK_DDDPRINT("swap %ld and %ld", (long) l, (long) r)); + + duk__array_sort_swap(ctx, l, r); + + DUK_DDD(DUK_DDDPRINT("after swap: %!T", (duk_tval *) duk_get_tval(ctx, 1))); + l++; + r--; + } + done: + /* Note that 'l' and 'r' may cross, i.e. r < l */ + DUK_ASSERT(l >= lo && l <= hi); + DUK_ASSERT(r >= lo && r <= hi); + + /* XXX: there's no explicit recursion bound here now. For the average + * qsort recursion depth O(log n) that's not really necessary: e.g. for + * 2**32 recursion depth would be about 32 which is OK. However, qsort + * worst case recursion depth is O(n) which may be a problem. + */ + + /* move pivot to its final place */ + DUK_DDD(DUK_DDDPRINT("before final pivot swap: %!T", (duk_tval *) duk_get_tval(ctx, 1))); + duk__array_sort_swap(ctx, lo, r); + +#if defined(DUK_USE_DDDPRINT) + duk__debuglog_qsort_state(ctx, lo, hi, r); +#endif + + DUK_DDD(DUK_DDDPRINT("recurse: pivot=%ld, obj=%!T", (long) r, (duk_tval *) duk_get_tval(ctx, 1))); + duk__array_qsort(ctx, lo, r - 1); + duk__array_qsort(ctx, r + 1, hi); +} + +DUK_INTERNAL duk_ret_t duk_bi_array_prototype_sort(duk_context *ctx) { + duk_uint32_t len; + + /* XXX: len >= 0x80000000 won't work below because a signed type + * is needed by qsort. + */ + len = duk__push_this_obj_len_u32_limited(ctx); + + /* stack[0] = compareFn + * stack[1] = ToObject(this) + * stack[2] = ToUint32(length) + */ + + if (len > 0) { + /* avoid degenerate cases, so that (len - 1) won't underflow */ + duk__array_qsort(ctx, (duk_int_t) 0, (duk_int_t) (len - 1)); + } + + DUK_ASSERT_TOP(ctx, 3); + duk_pop(ctx); + return 1; /* return ToObject(this) */ +} + +/* + * splice() + */ + +/* XXX: this compiles to over 500 bytes now, even without special handling + * for an array part. Uses signed ints so does not handle full array range correctly. + */ + +/* XXX: can shift() / unshift() use the same helper? + * shift() is (close to?) <--> splice(0, 1) + * unshift is (close to?) <--> splice(0, 0, [items])? + */ + +DUK_INTERNAL duk_ret_t duk_bi_array_prototype_splice(duk_context *ctx) { + duk_idx_t nargs; + duk_uint32_t len; + duk_bool_t have_delcount; + duk_int_t item_count; + duk_int_t act_start; + duk_int_t del_count; + duk_int_t i, n; + + DUK_UNREF(have_delcount); + + nargs = duk_get_top(ctx); + if (nargs < 2) { + duk_set_top(ctx, 2); + nargs = 2; + have_delcount = 0; + } else { + have_delcount = 1; + } + + /* XXX: len >= 0x80000000 won't work below because we need to be + * able to represent -len. + */ + len = duk__push_this_obj_len_u32_limited(ctx); + + act_start = duk_to_int_clamped(ctx, 0, -((duk_int_t) len), (duk_int_t) len); + if (act_start < 0) { + act_start = len + act_start; + } + DUK_ASSERT(act_start >= 0 && act_start <= (duk_int_t) len); + +#ifdef DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT + if (have_delcount) { +#endif + del_count = duk_to_int_clamped(ctx, 1, 0, len - act_start); +#ifdef DUK_USE_NONSTD_ARRAY_SPLICE_DELCOUNT + } else { + /* E5.1 standard behavior when deleteCount is not given would be + * to treat it just like if 'undefined' was given, which coerces + * ultimately to 0. Real world behavior is to splice to the end + * of array, see test-bi-array-proto-splice-no-delcount.js. + */ + del_count = len - act_start; + } +#endif + + DUK_ASSERT(nargs >= 2); + item_count = (duk_int_t) (nargs - 2); + + DUK_ASSERT(del_count >= 0 && del_count <= (duk_int_t) len - act_start); + DUK_ASSERT(del_count + act_start <= (duk_int_t) len); + + /* For now, restrict result array into 32-bit length range. */ + if (((duk_double_t) len) - ((duk_double_t) del_count) + ((duk_double_t) item_count) > (duk_double_t) DUK_UINT32_MAX) { + DUK_D(DUK_DPRINT("Array.prototype.splice() would go beyond 32-bit length, throw")); + return DUK_RET_RANGE_ERROR; + } + + duk_push_array(ctx); + + /* stack[0] = start + * stack[1] = deleteCount + * stack[2...nargs-1] = items + * stack[nargs] = ToObject(this) -3 + * stack[nargs+1] = ToUint32(length) -2 + * stack[nargs+2] = result array -1 + */ + + DUK_ASSERT_TOP(ctx, nargs + 3); + + /* Step 9: copy elements-to-be-deleted into the result array */ + + for (i = 0; i < del_count; i++) { + if (duk_get_prop_index(ctx, -3, (duk_uarridx_t) (act_start + i))) { + duk_xdef_prop_index_wec(ctx, -2, i); /* throw flag irrelevant (false in std alg) */ + } else { + duk_pop(ctx); + } + } + duk_push_u32(ctx, (duk_uint32_t) del_count); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W); + + /* Steps 12 and 13: reorganize elements to make room for itemCount elements */ + + if (item_count < del_count) { + /* [ A B C D E F G H ] rel_index = 2, del_count 3, item count 1 + * -> [ A B F G H ] (conceptual intermediate step) + * -> [ A B . F G H ] (placeholder marked) + * [ A B C F G H ] (actual result at this point, C will be replaced) + */ + + DUK_ASSERT_TOP(ctx, nargs + 3); + + n = len - del_count; + for (i = act_start; i < n; i++) { + if (duk_get_prop_index(ctx, -3, (duk_uarridx_t) (i + del_count))) { + duk_put_prop_index(ctx, -4, (duk_uarridx_t) (i + item_count)); + } else { + duk_pop(ctx); + duk_del_prop_index(ctx, -3, (duk_uarridx_t) (i + item_count)); + } + } + + DUK_ASSERT_TOP(ctx, nargs + 3); + + /* loop iterator init and limit changed from standard algorithm */ + n = len - del_count + item_count; + for (i = len - 1; i >= n; i--) { + duk_del_prop_index(ctx, -3, (duk_uarridx_t) i); + } + + DUK_ASSERT_TOP(ctx, nargs + 3); + } else if (item_count > del_count) { + /* [ A B C D E F G H ] rel_index = 2, del_count 3, item count 4 + * -> [ A B F G H ] (conceptual intermediate step) + * -> [ A B . . . . F G H ] (placeholder marked) + * [ A B C D E F F G H ] (actual result at this point) + */ + + DUK_ASSERT_TOP(ctx, nargs + 3); + + /* loop iterator init and limit changed from standard algorithm */ + for (i = len - del_count - 1; i >= act_start; i--) { + if (duk_get_prop_index(ctx, -3, (duk_uarridx_t) (i + del_count))) { + duk_put_prop_index(ctx, -4, (duk_uarridx_t) (i + item_count)); + } else { + duk_pop(ctx); + duk_del_prop_index(ctx, -3, (duk_uarridx_t) (i + item_count)); + } + } + + DUK_ASSERT_TOP(ctx, nargs + 3); + } else { + /* [ A B C D E F G H ] rel_index = 2, del_count 3, item count 3 + * -> [ A B F G H ] (conceptual intermediate step) + * -> [ A B . . . F G H ] (placeholder marked) + * [ A B C D E F G H ] (actual result at this point) + */ + } + DUK_ASSERT_TOP(ctx, nargs + 3); + + /* Step 15: insert itemCount elements into the hole made above */ + + for (i = 0; i < item_count; i++) { + duk_dup(ctx, i + 2); /* args start at index 2 */ + duk_put_prop_index(ctx, -4, (duk_uarridx_t) (act_start + i)); + } + + /* Step 16: update length; note that the final length may be above 32 bit range + * (but we checked above that this isn't the case here) + */ + + duk_push_u32(ctx, len - del_count + item_count); + duk_put_prop_stridx(ctx, -4, DUK_STRIDX_LENGTH); + + /* result array is already at the top of stack */ + DUK_ASSERT_TOP(ctx, nargs + 3); + return 1; +} + +/* + * reverse() + */ + +DUK_INTERNAL duk_ret_t duk_bi_array_prototype_reverse(duk_context *ctx) { + duk_uint32_t len; + duk_uint32_t middle; + duk_uint32_t lower, upper; + duk_bool_t have_lower, have_upper; + + len = duk__push_this_obj_len_u32(ctx); + middle = len / 2; + + /* If len <= 1, middle will be 0 and for-loop bails out + * immediately (0 < 0 -> false). + */ + + for (lower = 0; lower < middle; lower++) { + DUK_ASSERT(len >= 2); + DUK_ASSERT_TOP(ctx, 2); + + DUK_ASSERT(len >= lower + 1); + upper = len - lower - 1; + + have_lower = duk_get_prop_index(ctx, -2, (duk_uarridx_t) lower); + have_upper = duk_get_prop_index(ctx, -3, (duk_uarridx_t) upper); + + /* [ ToObject(this) ToUint32(length) lowerValue upperValue ] */ + + if (have_upper) { + duk_put_prop_index(ctx, -4, (duk_uarridx_t) lower); + } else { + duk_del_prop_index(ctx, -4, (duk_uarridx_t) lower); + duk_pop(ctx); + } + + if (have_lower) { + duk_put_prop_index(ctx, -3, (duk_uarridx_t) upper); + } else { + duk_del_prop_index(ctx, -3, (duk_uarridx_t) upper); + duk_pop(ctx); + } + + DUK_ASSERT_TOP(ctx, 2); + } + + DUK_ASSERT_TOP(ctx, 2); + duk_pop(ctx); /* -> [ ToObject(this) ] */ + return 1; +} + +/* + * slice() + */ + +DUK_INTERNAL duk_ret_t duk_bi_array_prototype_slice(duk_context *ctx) { + duk_uint32_t len; + duk_int_t start, end; + duk_int_t i; + duk_uarridx_t idx; + duk_uint32_t res_length = 0; + + /* XXX: len >= 0x80000000 won't work below because we need to be + * able to represent -len. + */ + len = duk__push_this_obj_len_u32_limited(ctx); + duk_push_array(ctx); + + /* stack[0] = start + * stack[1] = end + * stack[2] = ToObject(this) + * stack[3] = ToUint32(length) + * stack[4] = result array + */ + + start = duk_to_int_clamped(ctx, 0, -((duk_int_t) len), (duk_int_t) len); + if (start < 0) { + start = len + start; + } + /* XXX: could duk_is_undefined() provide defaulting undefined to 'len' + * (the upper limit)? + */ + if (duk_is_undefined(ctx, 1)) { + end = len; + } else { + end = duk_to_int_clamped(ctx, 1, -((duk_int_t) len), (duk_int_t) len); + if (end < 0) { + end = len + end; + } + } + DUK_ASSERT(start >= 0 && (duk_uint32_t) start <= len); + DUK_ASSERT(end >= 0 && (duk_uint32_t) end <= len); + + idx = 0; + for (i = start; i < end; i++) { + DUK_ASSERT_TOP(ctx, 5); + if (duk_get_prop_index(ctx, 2, (duk_uarridx_t) i)) { + duk_xdef_prop_index_wec(ctx, 4, idx); + res_length = idx + 1; + } else { + duk_pop(ctx); + } + idx++; + DUK_ASSERT_TOP(ctx, 5); + } + + duk_push_u32(ctx, res_length); + duk_xdef_prop_stridx(ctx, 4, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W); + + DUK_ASSERT_TOP(ctx, 5); + return 1; +} + +/* + * shift() + */ + +DUK_INTERNAL duk_ret_t duk_bi_array_prototype_shift(duk_context *ctx) { + duk_uint32_t len; + duk_uint32_t i; + + len = duk__push_this_obj_len_u32(ctx); + if (len == 0) { + duk_push_int(ctx, 0); + duk_put_prop_stridx(ctx, 0, DUK_STRIDX_LENGTH); + return 0; + } + + duk_get_prop_index(ctx, 0, 0); + + /* stack[0] = object (this) + * stack[1] = ToUint32(length) + * stack[2] = elem at index 0 (retval) + */ + + for (i = 1; i < len; i++) { + DUK_ASSERT_TOP(ctx, 3); + if (duk_get_prop_index(ctx, 0, (duk_uarridx_t) i)) { + /* fromPresent = true */ + duk_put_prop_index(ctx, 0, (duk_uarridx_t) (i - 1)); + } else { + /* fromPresent = false */ + duk_del_prop_index(ctx, 0, (duk_uarridx_t) (i - 1)); + duk_pop(ctx); + } + } + duk_del_prop_index(ctx, 0, (duk_uarridx_t) (len - 1)); + + duk_push_u32(ctx, (duk_uint32_t) (len - 1)); + duk_put_prop_stridx(ctx, 0, DUK_STRIDX_LENGTH); + + DUK_ASSERT_TOP(ctx, 3); + return 1; +} + +/* + * unshift() + */ + +DUK_INTERNAL duk_ret_t duk_bi_array_prototype_unshift(duk_context *ctx) { + duk_idx_t nargs; + duk_uint32_t len; + duk_uint32_t i; + + nargs = duk_get_top(ctx); + len = duk__push_this_obj_len_u32(ctx); + + /* stack[0...nargs-1] = unshift args (vararg) + * stack[nargs] = ToObject(this) + * stack[nargs+1] = ToUint32(length) + */ + + DUK_ASSERT_TOP(ctx, nargs + 2); + + /* Note: unshift() may operate on indices above unsigned 32-bit range + * and the final length may be >= 2**32. However, we restrict the + * final result to 32-bit range for practicality. + */ + + if (len + (duk_uint32_t) nargs < len) { + DUK_D(DUK_DPRINT("Array.prototype.unshift() would go beyond 32-bit length, throw")); + return DUK_RET_RANGE_ERROR; + } + + i = len; + while (i > 0) { + DUK_ASSERT_TOP(ctx, nargs + 2); + i--; + /* k+argCount-1; note that may be above 32-bit range */ + + if (duk_get_prop_index(ctx, -2, (duk_uarridx_t) i)) { + /* fromPresent = true */ + /* [ ... ToObject(this) ToUint32(length) val ] */ + duk_put_prop_index(ctx, -3, (duk_uarridx_t) (i + nargs)); /* -> [ ... ToObject(this) ToUint32(length) ] */ + } else { + /* fromPresent = false */ + /* [ ... ToObject(this) ToUint32(length) val ] */ + duk_pop(ctx); + duk_del_prop_index(ctx, -2, (duk_uarridx_t) (i + nargs)); /* -> [ ... ToObject(this) ToUint32(length) ] */ + } + DUK_ASSERT_TOP(ctx, nargs + 2); + } + + for (i = 0; i < (duk_uint32_t) nargs; i++) { + DUK_ASSERT_TOP(ctx, nargs + 2); + duk_dup(ctx, i); /* -> [ ... ToObject(this) ToUint32(length) arg[i] ] */ + duk_put_prop_index(ctx, -3, (duk_uarridx_t) i); + DUK_ASSERT_TOP(ctx, nargs + 2); + } + + DUK_ASSERT_TOP(ctx, nargs + 2); + duk_push_u32(ctx, len + nargs); + duk_dup_top(ctx); /* -> [ ... ToObject(this) ToUint32(length) final_len final_len ] */ + duk_put_prop_stridx(ctx, -4, DUK_STRIDX_LENGTH); + return 1; +} + +/* + * indexOf(), lastIndexOf() + */ + +DUK_INTERNAL duk_ret_t duk_bi_array_prototype_indexof_shared(duk_context *ctx) { + duk_idx_t nargs; + duk_int_t i, len; + duk_int_t from_index; + duk_small_int_t idx_step = duk_get_current_magic(ctx); /* idx_step is +1 for indexOf, -1 for lastIndexOf */ + + /* lastIndexOf() needs to be a vararg function because we must distinguish + * between an undefined fromIndex and a "not given" fromIndex; indexOf() is + * made vararg for symmetry although it doesn't strictly need to be. + */ + + nargs = duk_get_top(ctx); + duk_set_top(ctx, 2); + + /* XXX: must be able to represent -len */ + len = (duk_int_t) duk__push_this_obj_len_u32_limited(ctx); + if (len == 0) { + goto not_found; + } + + /* Index clamping is a bit tricky, we must ensure that we'll only iterate + * through elements that exist and that the specific requirements from E5.1 + * Sections 15.4.4.14 and 15.4.4.15 are fulfilled; especially: + * + * - indexOf: clamp to [-len,len], negative handling -> [0,len], + * if clamped result is len, for-loop bails out immediately + * + * - lastIndexOf: clamp to [-len-1, len-1], negative handling -> [-1, len-1], + * if clamped result is -1, for-loop bails out immediately + * + * If fromIndex is not given, ToInteger(undefined) = 0, which is correct + * for indexOf() but incorrect for lastIndexOf(). Hence special handling, + * and why lastIndexOf() needs to be a vararg function. + */ + + if (nargs >= 2) { + /* indexOf: clamp fromIndex to [-len, len] + * (if fromIndex == len, for-loop terminates directly) + * + * lastIndexOf: clamp fromIndex to [-len - 1, len - 1] + * (if clamped to -len-1 -> fromIndex becomes -1, terminates for-loop directly) + */ + from_index = duk_to_int_clamped(ctx, + 1, + (idx_step > 0 ? -len : -len - 1), + (idx_step > 0 ? len : len - 1)); + if (from_index < 0) { + /* for lastIndexOf, result may be -1 (mark immediate termination) */ + from_index = len + from_index; + } + } else { + /* for indexOf, ToInteger(undefined) would be 0, i.e. correct, but + * handle both indexOf and lastIndexOf specially here. + */ + if (idx_step > 0) { + from_index = 0; + } else { + from_index = len - 1; + } + } + + /* stack[0] = searchElement + * stack[1] = fromIndex + * stack[2] = object + * stack[3] = length (not needed, but not popped above) + */ + + for (i = from_index; i >= 0 && i < len; i += idx_step) { + DUK_ASSERT_TOP(ctx, 4); + + if (duk_get_prop_index(ctx, 2, (duk_uarridx_t) i)) { + DUK_ASSERT_TOP(ctx, 5); + if (duk_strict_equals(ctx, 0, 4)) { + duk_push_int(ctx, i); + return 1; + } + } + + duk_pop(ctx); + } + + not_found: + duk_push_int(ctx, -1); + return 1; +} + +/* + * every(), some(), forEach(), map(), filter() + */ + +#define DUK__ITER_EVERY 0 +#define DUK__ITER_SOME 1 +#define DUK__ITER_FOREACH 2 +#define DUK__ITER_MAP 3 +#define DUK__ITER_FILTER 4 + +/* XXX: This helper is a bit awkward because the handling for the different iteration + * callers is quite different. This now compiles to a bit less than 500 bytes, so with + * 5 callers the net result is about 100 bytes / caller. + */ + +DUK_INTERNAL duk_ret_t duk_bi_array_prototype_iter_shared(duk_context *ctx) { + duk_uint32_t len; + duk_uint32_t i; + duk_uarridx_t k; + duk_bool_t bval; + duk_small_int_t iter_type = duk_get_current_magic(ctx); + duk_uint32_t res_length = 0; + + /* each call this helper serves has nargs==2 */ + DUK_ASSERT_TOP(ctx, 2); + + len = duk__push_this_obj_len_u32(ctx); + if (!duk_is_callable(ctx, 0)) { + goto type_error; + } + /* if thisArg not supplied, behave as if undefined was supplied */ + + if (iter_type == DUK__ITER_MAP || iter_type == DUK__ITER_FILTER) { + duk_push_array(ctx); + } else { + duk_push_undefined(ctx); + } + + /* stack[0] = callback + * stack[1] = thisArg + * stack[2] = object + * stack[3] = ToUint32(length) (unused, but avoid unnecessary pop) + * stack[4] = result array (or undefined) + */ + + k = 0; /* result index for filter() */ + for (i = 0; i < len; i++) { + DUK_ASSERT_TOP(ctx, 5); + + if (!duk_get_prop_index(ctx, 2, (duk_uarridx_t) i)) { +#if defined(DUK_USE_NONSTD_ARRAY_MAP_TRAILER) + /* Real world behavior for map(): trailing non-existent + * elements don't invoke the user callback, but are still + * counted towards result 'length'. + */ + if (iter_type == DUK__ITER_MAP) { + res_length = i + 1; + } +#else + /* Standard behavior for map(): trailing non-existent + * elements don't invoke the user callback and are not + * counted towards result 'length'. + */ +#endif + duk_pop(ctx); + continue; + } + + /* The original value needs to be preserved for filter(), hence + * this funny order. We can't re-get the value because of side + * effects. + */ + + duk_dup(ctx, 0); + duk_dup(ctx, 1); + duk_dup(ctx, -3); + duk_push_u32(ctx, i); + duk_dup(ctx, 2); /* [ ... val callback thisArg val i obj ] */ + duk_call_method(ctx, 3); /* -> [ ... val retval ] */ + + switch (iter_type) { + case DUK__ITER_EVERY: + bval = duk_to_boolean(ctx, -1); + if (!bval) { + /* stack top contains 'false' */ + return 1; + } + break; + case DUK__ITER_SOME: + bval = duk_to_boolean(ctx, -1); + if (bval) { + /* stack top contains 'true' */ + return 1; + } + break; + case DUK__ITER_FOREACH: + /* nop */ + break; + case DUK__ITER_MAP: + duk_dup(ctx, -1); + duk_xdef_prop_index_wec(ctx, 4, (duk_uarridx_t) i); /* retval to result[i] */ + res_length = i + 1; + break; + case DUK__ITER_FILTER: + bval = duk_to_boolean(ctx, -1); + if (bval) { + duk_dup(ctx, -2); /* orig value */ + duk_xdef_prop_index_wec(ctx, 4, (duk_uarridx_t) k); + k++; + res_length = k; + } + break; + default: + DUK_UNREACHABLE(); + break; + } + duk_pop_2(ctx); + + DUK_ASSERT_TOP(ctx, 5); + } + + switch (iter_type) { + case DUK__ITER_EVERY: + duk_push_true(ctx); + break; + case DUK__ITER_SOME: + duk_push_false(ctx); + break; + case DUK__ITER_FOREACH: + duk_push_undefined(ctx); + break; + case DUK__ITER_MAP: + case DUK__ITER_FILTER: + DUK_ASSERT_TOP(ctx, 5); + DUK_ASSERT(duk_is_array(ctx, -1)); /* topmost element is the result array already */ + duk_push_u32(ctx, res_length); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_W); + break; + default: + DUK_UNREACHABLE(); + break; + } + + return 1; + + type_error: + return DUK_RET_TYPE_ERROR; +} + +/* + * reduce(), reduceRight() + */ + +DUK_INTERNAL duk_ret_t duk_bi_array_prototype_reduce_shared(duk_context *ctx) { + duk_idx_t nargs; + duk_bool_t have_acc; + duk_uint32_t i, len; + duk_small_int_t idx_step = duk_get_current_magic(ctx); /* idx_step is +1 for reduce, -1 for reduceRight */ + + /* We're a varargs function because we need to detect whether + * initialValue was given or not. + */ + nargs = duk_get_top(ctx); + DUK_DDD(DUK_DDDPRINT("nargs=%ld", (long) nargs)); + + duk_set_top(ctx, 2); + len = duk__push_this_obj_len_u32(ctx); + if (!duk_is_callable(ctx, 0)) { + goto type_error; + } + + /* stack[0] = callback fn + * stack[1] = initialValue + * stack[2] = object (coerced this) + * stack[3] = length (not needed, but not popped above) + * stack[4] = accumulator + */ + + have_acc = 0; + if (nargs >= 2) { + duk_dup(ctx, 1); + have_acc = 1; + } + DUK_DDD(DUK_DDDPRINT("have_acc=%ld, acc=%!T", + (long) have_acc, (duk_tval *) duk_get_tval(ctx, 3))); + + /* For len == 0, i is initialized to len - 1 which underflows. + * The condition (i < len) will then exit the for-loop on the + * first round which is correct. Similarly, loop termination + * happens by i underflowing. + */ + + for (i = (idx_step >= 0 ? 0 : len - 1); + i < len; /* i >= 0 would always be true */ + i += idx_step) { + DUK_DDD(DUK_DDDPRINT("i=%ld, len=%ld, have_acc=%ld, top=%ld, acc=%!T", + (long) i, (long) len, (long) have_acc, + (long) duk_get_top(ctx), + (duk_tval *) duk_get_tval(ctx, 4))); + + DUK_ASSERT((have_acc && duk_get_top(ctx) == 5) || + (!have_acc && duk_get_top(ctx) == 4)); + + if (!duk_has_prop_index(ctx, 2, (duk_uarridx_t) i)) { + continue; + } + + if (!have_acc) { + DUK_ASSERT_TOP(ctx, 4); + duk_get_prop_index(ctx, 2, (duk_uarridx_t) i); + have_acc = 1; + DUK_ASSERT_TOP(ctx, 5); + } else { + DUK_ASSERT_TOP(ctx, 5); + duk_dup(ctx, 0); + duk_dup(ctx, 4); + duk_get_prop_index(ctx, 2, (duk_uarridx_t) i); + duk_push_u32(ctx, i); + duk_dup(ctx, 2); + DUK_DDD(DUK_DDDPRINT("calling reduce function: func=%!T, prev=%!T, curr=%!T, idx=%!T, obj=%!T", + (duk_tval *) duk_get_tval(ctx, -5), (duk_tval *) duk_get_tval(ctx, -4), + (duk_tval *) duk_get_tval(ctx, -3), (duk_tval *) duk_get_tval(ctx, -2), + (duk_tval *) duk_get_tval(ctx, -1))); + duk_call(ctx, 4); + DUK_DDD(DUK_DDDPRINT("-> result: %!T", (duk_tval *) duk_get_tval(ctx, -1))); + duk_replace(ctx, 4); + DUK_ASSERT_TOP(ctx, 5); + } + } + + if (!have_acc) { + goto type_error; + } + + DUK_ASSERT_TOP(ctx, 5); + return 1; + + type_error: + return DUK_RET_TYPE_ERROR; +} + +#undef DUK__ARRAY_MID_JOIN_LIMIT + +#undef DUK__ITER_EVERY +#undef DUK__ITER_SOME +#undef DUK__ITER_FOREACH +#undef DUK__ITER_MAP +#undef DUK__ITER_FILTER diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_boolean.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_boolean.c new file mode 100644 index 00000000..5acea6d8 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_boolean.c @@ -0,0 +1,68 @@ +/* + * Boolean built-ins + */ + +#include "duk_internal.h" + +/* Shared helper to provide toString() and valueOf(). Checks 'this', gets + * the primitive value to stack top, and optionally coerces with ToString(). + */ +DUK_INTERNAL duk_ret_t duk_bi_boolean_prototype_tostring_shared(duk_context *ctx) { + duk_tval *tv; + duk_hobject *h; + duk_small_int_t coerce_tostring = duk_get_current_magic(ctx); + + /* XXX: there is room to use a shared helper here, many built-ins + * check the 'this' type, and if it's an object, check its class, + * then get its internal value, etc. + */ + + duk_push_this(ctx); + tv = duk_get_tval(ctx, -1); + DUK_ASSERT(tv != NULL); + + if (DUK_TVAL_IS_BOOLEAN(tv)) { + goto type_ok; + } else if (DUK_TVAL_IS_OBJECT(tv)) { + h = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h != NULL); + + if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_BOOLEAN) { + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_INT_VALUE); + DUK_ASSERT(duk_is_boolean(ctx, -1)); + goto type_ok; + } + } + + return DUK_RET_TYPE_ERROR; + + type_ok: + if (coerce_tostring) { + duk_to_string(ctx, -1); + } + return 1; +} + +DUK_INTERNAL duk_ret_t duk_bi_boolean_constructor(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *h_this; + + DUK_UNREF(thr); + + duk_to_boolean(ctx, 0); + + if (duk_is_constructor_call(ctx)) { + /* XXX: helper; rely on Boolean.prototype as being non-writable, non-configurable */ + duk_push_this(ctx); + h_this = duk_get_hobject(ctx, -1); + DUK_ASSERT(h_this != NULL); + DUK_ASSERT(DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h_this) == thr->builtins[DUK_BIDX_BOOLEAN_PROTOTYPE]); + + DUK_HOBJECT_SET_CLASS_NUMBER(h_this, DUK_HOBJECT_CLASS_BOOLEAN); + + duk_dup(ctx, 0); /* -> [ val obj val ] */ + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_NONE); /* XXX: proper flags? */ + } /* unbalanced stack */ + + return 1; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_buffer.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_buffer.c new file mode 100644 index 00000000..37e9680e --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_buffer.c @@ -0,0 +1,2842 @@ +/* + * Duktape.Buffer, Node.js Buffer, and Khronos/ES6 TypedArray built-ins + */ + +#include "duk_internal.h" + +/* + * Misc helpers + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +/* Map DUK_HBUFFEROBJECT_ELEM_xxx to duk_hobject class number. + * Sync with duk_hbufferobject.h and duk_hobject.h. + */ +static const duk_uint8_t duk__buffer_class_from_elemtype[9] = { + DUK_HOBJECT_CLASS_UINT8ARRAY, + DUK_HOBJECT_CLASS_UINT8CLAMPEDARRAY, + DUK_HOBJECT_CLASS_INT8ARRAY, + DUK_HOBJECT_CLASS_UINT16ARRAY, + DUK_HOBJECT_CLASS_INT16ARRAY, + DUK_HOBJECT_CLASS_UINT32ARRAY, + DUK_HOBJECT_CLASS_INT32ARRAY, + DUK_HOBJECT_CLASS_FLOAT32ARRAY, + DUK_HOBJECT_CLASS_FLOAT64ARRAY +}; +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +/* Map DUK_HBUFFEROBJECT_ELEM_xxx to prototype object built-in index. + * Sync with duk_hbufferobject.h. + */ +static const duk_uint8_t duk__buffer_proto_from_elemtype[9] = { + DUK_BIDX_UINT8ARRAY_PROTOTYPE, + DUK_BIDX_UINT8CLAMPEDARRAY_PROTOTYPE, + DUK_BIDX_INT8ARRAY_PROTOTYPE, + DUK_BIDX_UINT16ARRAY_PROTOTYPE, + DUK_BIDX_INT16ARRAY_PROTOTYPE, + DUK_BIDX_UINT32ARRAY_PROTOTYPE, + DUK_BIDX_INT32ARRAY_PROTOTYPE, + DUK_BIDX_FLOAT32ARRAY_PROTOTYPE, + DUK_BIDX_FLOAT64ARRAY_PROTOTYPE +}; +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +/* Map DUK__FLX_xxx to byte size. + */ +static const duk_uint8_t duk__buffer_nbytes_from_fldtype[6] = { + 1, /* DUK__FLD_8BIT */ + 2, /* DUK__FLD_16BIT */ + 4, /* DUK__FLD_32BIT */ + 4, /* DUK__FLD_FLOAT */ + 8, /* DUK__FLD_DOUBLE */ + 0 /* DUK__FLD_VARINT; not relevant here */ +}; +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +/* Bitfield for each DUK_HBUFFEROBJECT_ELEM_xxx indicating which element types + * are compatible with a blind byte copy for the TypedArray set() method (also + * used for TypedArray constructor). Array index is target buffer elem type, + * bitfield indicates compatible source types. The types must have same byte + * size and they must be coercion compatible. + */ +static duk_uint16_t duk__buffer_elemtype_copy_compatible[9] = { + /* xxx -> DUK_HBUFFEROBJECT_ELEM_UINT8 */ + (1U << DUK_HBUFFEROBJECT_ELEM_UINT8) | + (1U << DUK_HBUFFEROBJECT_ELEM_UINT8CLAMPED) | + (1U << DUK_HBUFFEROBJECT_ELEM_INT8), + + /* xxx -> DUK_HBUFFEROBJECT_ELEM_UINT8CLAMPED + * Note: INT8 is -not- copy compatible, e.g. -1 would coerce to 0x00. + */ + (1U << DUK_HBUFFEROBJECT_ELEM_UINT8) | + (1U << DUK_HBUFFEROBJECT_ELEM_UINT8CLAMPED), + + /* xxx -> DUK_HBUFFEROBJECT_ELEM_INT8 */ + (1U << DUK_HBUFFEROBJECT_ELEM_UINT8) | + (1U << DUK_HBUFFEROBJECT_ELEM_UINT8CLAMPED) | + (1U << DUK_HBUFFEROBJECT_ELEM_INT8), + + /* xxx -> DUK_HBUFFEROBJECT_ELEM_UINT16 */ + (1U << DUK_HBUFFEROBJECT_ELEM_UINT16) | + (1U << DUK_HBUFFEROBJECT_ELEM_INT16), + + /* xxx -> DUK_HBUFFEROBJECT_ELEM_INT16 */ + (1U << DUK_HBUFFEROBJECT_ELEM_UINT16) | + (1U << DUK_HBUFFEROBJECT_ELEM_INT16), + + /* xxx -> DUK_HBUFFEROBJECT_ELEM_UINT32 */ + (1U << DUK_HBUFFEROBJECT_ELEM_UINT32) | + (1U << DUK_HBUFFEROBJECT_ELEM_INT32), + + /* xxx -> DUK_HBUFFEROBJECT_ELEM_INT32 */ + (1U << DUK_HBUFFEROBJECT_ELEM_UINT32) | + (1U << DUK_HBUFFEROBJECT_ELEM_INT32), + + /* xxx -> DUK_HBUFFEROBJECT_ELEM_FLOAT32 */ + (1U << DUK_HBUFFEROBJECT_ELEM_FLOAT32), + + /* xxx -> DUK_HBUFFEROBJECT_ELEM_FLOAT64 */ + (1U << DUK_HBUFFEROBJECT_ELEM_FLOAT64) +}; +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +/* Shared helper. */ +DUK_LOCAL duk_hbufferobject *duk__getrequire_bufobj_this(duk_context *ctx, duk_bool_t throw_flag) { + duk_hthread *thr; + duk_tval *tv; + duk_hbufferobject *h_this; + + DUK_ASSERT(ctx != NULL); + thr = (duk_hthread *) ctx; + + tv = duk_get_borrowed_this_tval(ctx); + DUK_ASSERT(tv != NULL); + if (DUK_TVAL_IS_OBJECT(tv)) { + h_this = (duk_hbufferobject *) DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h_this != NULL); + if (DUK_HOBJECT_IS_BUFFEROBJECT((duk_hobject *) h_this)) { + DUK_ASSERT_HBUFFEROBJECT_VALID(h_this); + return h_this; + } + } + + if (throw_flag) { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_BUFFER); + } + return NULL; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +/* Check that 'this' is a duk_hbufferobject and return a pointer to it. */ +DUK_LOCAL duk_hbufferobject *duk__get_bufobj_this(duk_context *ctx) { + return duk__getrequire_bufobj_this(ctx, 0); +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +/* Check that 'this' is a duk_hbufferobject and return a pointer to it + * (NULL if not). + */ +DUK_LOCAL duk_hbufferobject *duk__require_bufobj_this(duk_context *ctx) { + return duk__getrequire_bufobj_this(ctx, 1); +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +/* Check that value is a duk_hbufferobject and return a pointer to it. */ +DUK_LOCAL duk_hbufferobject *duk__require_bufobj_value(duk_context *ctx, duk_idx_t index) { + duk_hthread *thr; + duk_tval *tv; + duk_hbufferobject *h_obj; + + thr = (duk_hthread *) ctx; + + /* Don't accept relative indices now. */ + DUK_ASSERT(index >= 0); + + tv = duk_require_tval(ctx, index); + DUK_ASSERT(tv != NULL); + if (DUK_TVAL_IS_OBJECT(tv)) { + h_obj = (duk_hbufferobject *) DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h_obj != NULL); + if (DUK_HOBJECT_IS_BUFFEROBJECT((duk_hobject *) h_obj)) { + DUK_ASSERT_HBUFFEROBJECT_VALID(h_obj); + return h_obj; + } + } + + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, DUK_STR_NOT_BUFFER); + return NULL; /* not reachable */ +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +DUK_LOCAL void duk__set_bufobj_buffer(duk_context *ctx, duk_hbufferobject *h_bufobj, duk_hbuffer *h_val) { + duk_hthread *thr; + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + DUK_ASSERT(ctx != NULL); + DUK_ASSERT(h_bufobj != NULL); + DUK_ASSERT(h_bufobj->buf == NULL); /* no need to decref */ + DUK_ASSERT(h_val != NULL); + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + + h_bufobj->buf = h_val; + DUK_HBUFFER_INCREF(thr, h_val); + h_bufobj->length = (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_val); + DUK_ASSERT(h_bufobj->shift == 0); + DUK_ASSERT(h_bufobj->elem_type == DUK_HBUFFEROBJECT_ELEM_UINT8); + + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); +} + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_LOCAL duk_hbufferobject *duk__push_arraybuffer_with_length(duk_context *ctx, duk_uint_t len) { + duk_hbuffer *h_val; + duk_hbufferobject *h_bufobj; + + (void) duk_push_fixed_buffer(ctx, (duk_size_t) len); + h_val = (duk_hbuffer *) duk_get_hbuffer(ctx, -1); + DUK_ASSERT(h_val != NULL); + + h_bufobj = duk_push_bufferobject_raw(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_BUFFEROBJECT | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER), + DUK_BIDX_ARRAYBUFFER_PROTOTYPE); + DUK_ASSERT(h_bufobj != NULL); + + duk__set_bufobj_buffer(ctx, h_bufobj, h_val); + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + + return h_bufobj; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +/* Shared offset/length coercion helper. */ +DUK_LOCAL void duk__resolve_offset_opt_length(duk_context *ctx, + duk_hbufferobject *h_bufarg, + duk_idx_t idx_offset, + duk_idx_t idx_length, + duk_uint_t *out_offset, + duk_uint_t *out_length, + duk_bool_t throw_flag) { + duk_hthread *thr; + duk_int_t offset_signed; + duk_int_t length_signed; + duk_uint_t offset; + duk_uint_t length; + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + offset_signed = duk_to_int(ctx, idx_offset); + if (offset_signed < 0) { + goto fail_range; + } + offset = (duk_uint_t) offset_signed; + if (offset > h_bufarg->length) { + goto fail_range; + } + DUK_ASSERT_DISABLE(offset >= 0); /* unsigned */ + DUK_ASSERT(offset <= h_bufarg->length); + + if (duk_is_undefined(ctx, idx_length)) { + DUK_ASSERT(h_bufarg->length >= offset); + length = h_bufarg->length - offset; /* >= 0 */ + } else { + length_signed = duk_to_int(ctx, idx_length); + if (length_signed < 0) { + goto fail_range; + } + length = (duk_uint_t) length_signed; + DUK_ASSERT(h_bufarg->length >= offset); + if (length > h_bufarg->length - offset) { + /* Unlike for negative arguments, some call sites + * want length to be clamped if it's positive. + */ + if (throw_flag) { + goto fail_range; + } else { + length = h_bufarg->length - offset; + } + } + } + DUK_ASSERT_DISABLE(length >= 0); /* unsigned */ + DUK_ASSERT(offset + length <= h_bufarg->length); + + *out_offset = offset; + *out_length = length; + return; + + fail_range: + duk_error(thr, DUK_ERR_RANGE_ERROR, DUK_STR_INVALID_CALL_ARGS); +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +/* Shared lenient buffer length clamping helper. No negative indices, no + * element/byte shifting. + */ +DUK_LOCAL void duk__clamp_startend_nonegidx_noshift(duk_context *ctx, + duk_hbufferobject *h_bufobj, + duk_idx_t idx_start, + duk_idx_t idx_end, + duk_int_t *out_start_offset, + duk_int_t *out_end_offset) { + duk_int_t buffer_length; + duk_int_t start_offset; + duk_int_t end_offset; + + DUK_ASSERT(out_start_offset != NULL); + DUK_ASSERT(out_end_offset != NULL); + + buffer_length = (duk_int_t) h_bufobj->length; + + /* undefined coerces to zero which is correct */ + start_offset = duk_to_int_clamped(ctx, idx_start, 0, buffer_length); + if (duk_is_undefined(ctx, idx_end)) { + end_offset = buffer_length; + } else { + end_offset = duk_to_int_clamped(ctx, idx_end, start_offset, buffer_length); + } + + DUK_ASSERT(start_offset >= 0); + DUK_ASSERT(start_offset <= buffer_length); + DUK_ASSERT(end_offset >= 0); + DUK_ASSERT(end_offset <= buffer_length); + DUK_ASSERT(start_offset <= end_offset); + + *out_start_offset = start_offset; + *out_end_offset = end_offset; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +/* Shared lenient buffer length clamping helper. Indices are treated as + * element indices (though output values are byte offsets) which only + * really matters for TypedArray views as other buffer object have a zero + * shift. Negative indices are counted from end of input slice; crossed + * indices are clamped to zero length; and final indices are clamped + * against input slice. Used for e.g. ArrayBuffer slice(). + */ +DUK_LOCAL void duk__clamp_startend_negidx_shifted(duk_context *ctx, + duk_hbufferobject *h_bufobj, + duk_idx_t idx_start, + duk_idx_t idx_end, + duk_int_t *out_start_offset, + duk_int_t *out_end_offset) { + duk_int_t buffer_length; + duk_int_t start_offset; + duk_int_t end_offset; + + DUK_ASSERT(out_start_offset != NULL); + DUK_ASSERT(out_end_offset != NULL); + + buffer_length = (duk_int_t) h_bufobj->length; + buffer_length >>= h_bufobj->shift; /* as elements */ + + /* Resolve start/end offset as element indices first; arguments + * at idx_start/idx_end are element offsets. Working with element + * indices first also avoids potential for wrapping. + */ + + start_offset = duk_to_int(ctx, idx_start); + if (start_offset < 0) { + start_offset = buffer_length + start_offset; + } + if (duk_is_undefined(ctx, idx_end)) { + end_offset = buffer_length; + } else { + end_offset = duk_to_int(ctx, idx_end); + if (end_offset < 0) { + end_offset = buffer_length + end_offset; + } + } + /* Note: start_offset/end_offset can still be < 0 here. */ + + if (start_offset < 0) { + start_offset = 0; + } else if (start_offset > buffer_length) { + start_offset = buffer_length; + } + if (end_offset < start_offset) { + end_offset = start_offset; + } else if (end_offset > buffer_length) { + end_offset = buffer_length; + } + DUK_ASSERT(start_offset >= 0); + DUK_ASSERT(start_offset <= buffer_length); + DUK_ASSERT(end_offset >= 0); + DUK_ASSERT(end_offset <= buffer_length); + DUK_ASSERT(start_offset <= end_offset); + + /* Convert indices to byte offsets. */ + start_offset <<= h_bufobj->shift; + end_offset <<= h_bufobj->shift; + + *out_start_offset = start_offset; + *out_end_offset = end_offset; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * Indexed read/write helpers (also used from outside this file) + */ + +DUK_INTERNAL void duk_hbufferobject_push_validated_read(duk_context *ctx, duk_hbufferobject *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size) { + duk_double_union du; + + DUK_MEMCPY((void *) du.uc, (const void *) p, elem_size); + + switch (h_bufobj->elem_type) { + case DUK_HBUFFEROBJECT_ELEM_UINT8: +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) + case DUK_HBUFFEROBJECT_ELEM_UINT8CLAMPED: +#endif + duk_push_uint(ctx, (duk_uint_t) du.uc[0]); + break; +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) + /* These are not needed when only Duktape.Buffer is supported. */ + case DUK_HBUFFEROBJECT_ELEM_INT8: + duk_push_int(ctx, (duk_int_t) (duk_int8_t) du.uc[0]); + break; + case DUK_HBUFFEROBJECT_ELEM_UINT16: + duk_push_uint(ctx, (duk_uint_t) du.us[0]); + break; + case DUK_HBUFFEROBJECT_ELEM_INT16: + duk_push_int(ctx, (duk_int_t) (duk_int16_t) du.us[0]); + break; + case DUK_HBUFFEROBJECT_ELEM_UINT32: + duk_push_uint(ctx, (duk_uint_t) du.ui[0]); + break; + case DUK_HBUFFEROBJECT_ELEM_INT32: + duk_push_int(ctx, (duk_int_t) (duk_int32_t) du.ui[0]); + break; + case DUK_HBUFFEROBJECT_ELEM_FLOAT32: + duk_push_number(ctx, (duk_double_t) du.f[0]); + break; + case DUK_HBUFFEROBJECT_ELEM_FLOAT64: + duk_push_number(ctx, (duk_double_t) du.d); + break; +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + default: + DUK_UNREACHABLE(); + } +} + +DUK_INTERNAL void duk_hbufferobject_validated_write(duk_context *ctx, duk_hbufferobject *h_bufobj, duk_uint8_t *p, duk_small_uint_t elem_size) { + duk_double_union du; + + /* NOTE! Caller must ensure that any side effects from the + * coercions below are safe. If that cannot be guaranteed + * (which is normally the case), caller must coerce the + * argument using duk_to_number() before any pointer + * validations; the result of duk_to_number() always coerces + * without side effects here. + */ + + switch (h_bufobj->elem_type) { + case DUK_HBUFFEROBJECT_ELEM_UINT8: + du.uc[0] = (duk_uint8_t) duk_to_uint32(ctx, -1); + break; +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) + /* These are not needed when only Duktape.Buffer is supported. */ + case DUK_HBUFFEROBJECT_ELEM_UINT8CLAMPED: + du.uc[0] = (duk_uint8_t) duk_to_uint8clamped(ctx, -1); + break; + case DUK_HBUFFEROBJECT_ELEM_INT8: + du.uc[0] = (duk_uint8_t) duk_to_int32(ctx, -1); + break; + case DUK_HBUFFEROBJECT_ELEM_UINT16: + du.us[0] = (duk_uint16_t) duk_to_uint32(ctx, -1); + break; + case DUK_HBUFFEROBJECT_ELEM_INT16: + du.us[0] = (duk_uint16_t) duk_to_int32(ctx, -1); + break; + case DUK_HBUFFEROBJECT_ELEM_UINT32: + du.ui[0] = (duk_uint32_t) duk_to_uint32(ctx, -1); + break; + case DUK_HBUFFEROBJECT_ELEM_INT32: + du.ui[0] = (duk_uint32_t) duk_to_int32(ctx, -1); + break; + case DUK_HBUFFEROBJECT_ELEM_FLOAT32: + du.f[0] = (duk_float_t) duk_to_number(ctx, -1); + break; + case DUK_HBUFFEROBJECT_ELEM_FLOAT64: + du.d = (duk_double_t) duk_to_number(ctx, -1); + break; +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + default: + DUK_UNREACHABLE(); + } + + DUK_MEMCPY((void *) p, (const void *) du.uc, elem_size); +} + +/* + * Duktape.Buffer: constructor + */ + +DUK_INTERNAL duk_ret_t duk_bi_buffer_constructor(duk_context *ctx) { + duk_hthread *thr; + duk_size_t buf_size; + duk_small_int_t buf_dynamic; + duk_uint8_t *buf_data; + const duk_uint8_t *src_data; + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + /* + * Constructor arguments are currently somewhat compatible with + * (keep it that way if possible): + * + * http://nodejs.org/api/buffer.html + * + * Note that the ToBuffer() coercion (duk_to_buffer()) does NOT match + * the constructor behavior. + */ + + buf_dynamic = duk_get_boolean(ctx, 1); /* default to false */ + + switch (duk_get_type(ctx, 0)) { + case DUK_TYPE_NUMBER: { + /* new buffer of specified size */ + buf_size = (duk_size_t) duk_to_int(ctx, 0); + (void) duk_push_buffer(ctx, buf_size, buf_dynamic); + break; + } + case DUK_TYPE_BUFFER: { + /* return input buffer, converted to a Duktape.Buffer object + * if called as a constructor (no change if called as a + * function). + */ + duk_set_top(ctx, 1); + break; + } + case DUK_TYPE_STRING: { + /* new buffer with string contents */ + src_data = (const duk_uint8_t *) duk_get_lstring(ctx, 0, &buf_size); + DUK_ASSERT(src_data != NULL); /* even for zero-length string */ + buf_data = (duk_uint8_t *) duk_push_buffer(ctx, buf_size, buf_dynamic); + DUK_MEMCPY((void *) buf_data, (const void *) src_data, (size_t) buf_size); + break; + } + case DUK_TYPE_OBJECT: { + /* For all duk_hbufferobjects, get the plain buffer inside + * without making a copy. This is compatible with Duktape 1.2 + * but means that a slice/view information is ignored and the + * full underlying buffer is returned. + * + * If called as a constructor, a new Duktape.Buffer object + * pointing to the same plain buffer is created below. + */ + duk_hbufferobject *h_bufobj; + h_bufobj = (duk_hbufferobject *) duk_get_hobject(ctx, 0); + DUK_ASSERT(h_bufobj != NULL); + if (!DUK_HOBJECT_IS_BUFFEROBJECT((duk_hobject *) h_bufobj)) { + return DUK_RET_TYPE_ERROR; + } + if (h_bufobj->buf == NULL) { + return DUK_RET_TYPE_ERROR; + } + duk_push_hbuffer(ctx, h_bufobj->buf); + break; + } + case DUK_TYPE_NONE: + default: { + return DUK_RET_TYPE_ERROR; + } + } + DUK_ASSERT(duk_is_buffer(ctx, -1)); + + /* stack is unbalanced, but: [ buf ] */ + + if (duk_is_constructor_call(ctx)) { + duk_hbufferobject *h_bufobj; + duk_hbuffer *h_val; + + h_val = duk_get_hbuffer(ctx, -1); + DUK_ASSERT(h_val != NULL); + + h_bufobj = duk_push_bufferobject_raw(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_BUFFEROBJECT | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_BUFFER), + DUK_BIDX_BUFFER_PROTOTYPE); + DUK_ASSERT(h_bufobj != NULL); + + duk__set_bufobj_buffer(ctx, h_bufobj, h_val); + + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + } + /* Note: unbalanced stack on purpose */ + + return 1; +} + +/* + * Node.js Buffer: constructor + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_constructor(duk_context *ctx) { + /* Internal class is Object: Object.prototype.toString.call(new Buffer(0)) + * prints "[object Object]". + */ + duk_int_t len; + duk_int_t i; + duk_uint8_t *buf; + duk_hbuffer *h_buf; + duk_hbufferobject *h_bufobj; + duk_size_t buf_size; + + switch (duk_get_type(ctx, 0)) { + case DUK_TYPE_BUFFER: { + /* Custom behavior: plain buffer is used as internal buffer + * without making a copy (matches Duktape.Buffer). + */ + duk_set_top(ctx, 1); /* -> [ buffer ] */ + break; + } + case DUK_TYPE_NUMBER: { + len = duk_to_int_clamped(ctx, 0, 0, DUK_INT_MAX); + buf = (duk_uint8_t *) duk_push_fixed_buffer(ctx, (duk_size_t) len); + break; + } + case DUK_TYPE_OBJECT: { + (void) duk_get_prop_string(ctx, 0, "length"); + len = duk_to_int_clamped(ctx, -1, 0, DUK_INT_MAX); + duk_pop(ctx); + buf = (duk_uint8_t *) duk_push_fixed_buffer(ctx, (duk_size_t) len); + for (i = 0; i < len; i++) { + /* XXX: fast path for array arguments? */ + duk_get_prop_index(ctx, 0, (duk_uarridx_t) i); + buf[i] = (duk_uint8_t) (duk_to_uint32(ctx, -1) & 0xffU); + duk_pop(ctx); + } + break; + } + case DUK_TYPE_STRING: { + /* ignore encoding for now */ + duk_dup(ctx, 0); + buf = (duk_uint8_t *) duk_to_buffer(ctx, -1, &buf_size); + break; + } + default: + return DUK_RET_TYPE_ERROR; + } + + DUK_ASSERT(duk_is_buffer(ctx, -1)); + h_buf = duk_get_hbuffer(ctx, -1); + DUK_ASSERT(h_buf != NULL); + + h_bufobj = duk_push_bufferobject_raw(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_BUFFEROBJECT | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_BUFFER), + DUK_BIDX_NODEJS_BUFFER_PROTOTYPE); + DUK_ASSERT(h_bufobj != NULL); + + h_bufobj->buf = h_buf; + DUK_HBUFFER_INCREF(thr, h_buf); + DUK_ASSERT(h_bufobj->offset == 0); + h_bufobj->length = (duk_int_t) DUK_HBUFFER_GET_SIZE(h_buf); + DUK_ASSERT(h_bufobj->elem_type == DUK_HBUFFEROBJECT_ELEM_UINT8); + + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + + return 1; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_constructor(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * ArrayBuffer, DataView, and TypedArray constructors + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_arraybuffer_constructor(duk_context *ctx) { + duk_hbufferobject *h_bufobj; + duk_hbuffer *h_val; + + /* XXX: function flag to make this automatic? */ + if (!duk_is_constructor_call(ctx)) { + return DUK_RET_TYPE_ERROR; + } + + if (duk_is_buffer(ctx, 0)) { + /* Custom behavior: plain buffer is used as internal buffer + * without making a copy (matches Duktape.Buffer). + */ + + h_val = duk_get_hbuffer(ctx, 0); + DUK_ASSERT(h_val != NULL); + + /* XXX: accept any duk_hbufferobject type as an input also? */ + } else { + duk_int_t len; + len = duk_to_int(ctx, 0); + if (len < 0) { + goto fail_length; + } + (void) duk_push_fixed_buffer(ctx, (duk_size_t) len); + h_val = (duk_hbuffer *) duk_get_hbuffer(ctx, -1); + DUK_ASSERT(h_val != NULL); + } + + h_bufobj = duk_push_bufferobject_raw(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_BUFFEROBJECT | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ARRAYBUFFER), + DUK_BIDX_ARRAYBUFFER_PROTOTYPE); + DUK_ASSERT(h_bufobj != NULL); + + duk__set_bufobj_buffer(ctx, h_bufobj, h_val); + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + + return 1; + + fail_length: + return DUK_RET_RANGE_ERROR; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_arraybuffer_constructor(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + + +/* Format of magic, bits: + * 0...1: elem size shift (0-3) + * 2...5: elem type (DUK_HBUFFEROBJECT_ELEM_xxx) + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_typedarray_constructor(duk_context *ctx) { + duk_hthread *thr; + duk_tval *tv; + duk_hobject *h_obj; + duk_hbufferobject *h_bufobj = NULL; + duk_hbufferobject *h_bufarr = NULL; + duk_hbufferobject *h_bufarg = NULL; + duk_hbuffer *h_val; + duk_small_uint_t magic; + duk_small_uint_t shift; + duk_small_uint_t elem_type; + duk_small_uint_t elem_size; + duk_small_uint_t class_num; + duk_small_uint_t proto_bidx; + duk_uint_t align_mask; + duk_uint_t elem_length; + duk_int_t elem_length_signed; + duk_uint_t byte_length; + duk_small_uint_t copy_mode; + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + /* XXX: function flag to make this automatic? */ + if (!duk_is_constructor_call(ctx)) { + return DUK_RET_TYPE_ERROR; + } + + /* We could fit built-in index into magic but that'd make the magic + * number dependent on built-in numbering (genbuiltins.py doesn't + * handle that yet). So map both class and prototype from the + * element type. + */ + magic = duk_get_current_magic(ctx); + shift = magic & 0x03; /* bits 0...1: shift */ + elem_type = (magic >> 2) & 0x0f; /* bits 2...5: type */ + elem_size = 1 << shift; + align_mask = elem_size - 1; + DUK_ASSERT(elem_type < sizeof(duk__buffer_proto_from_elemtype) / sizeof(duk_uint8_t)); + proto_bidx = duk__buffer_proto_from_elemtype[elem_type]; + DUK_ASSERT(proto_bidx < DUK_NUM_BUILTINS); + DUK_ASSERT(elem_type < sizeof(duk__buffer_class_from_elemtype) / sizeof(duk_uint8_t)); + class_num = duk__buffer_class_from_elemtype[elem_type]; + + DUK_DD(DUK_DDPRINT("typedarray constructor, magic=%d, shift=%d, elem_type=%d, " + "elem_size=%d, proto_bidx=%d, class_num=%d", + (int) magic, (int) shift, (int) elem_type, (int) elem_size, + (int) proto_bidx, (int) class_num)); + + /* Argument variants. When the argument is an ArrayBuffer a view to + * the same buffer is created; otherwise a new ArrayBuffer is always + * created. + */ + + tv = duk_get_tval(ctx, 0); + DUK_ASSERT(tv != NULL); /* arg count */ + if (DUK_TVAL_IS_OBJECT(tv)) { + h_obj = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h_obj != NULL); + + if (DUK_HOBJECT_GET_CLASS_NUMBER(h_obj) == DUK_HOBJECT_CLASS_ARRAYBUFFER) { + /* ArrayBuffer: unlike any other argument variant, create + * a view into the existing buffer. + */ + + duk_int_t byte_offset_signed; + duk_uint_t byte_offset; + + h_bufarg = (duk_hbufferobject *) h_obj; + + byte_offset_signed = duk_to_int(ctx, 1); + if (byte_offset_signed < 0) { + goto fail_arguments; + } + byte_offset = (duk_uint_t) byte_offset_signed; + if (byte_offset > h_bufarg->length || + (byte_offset & align_mask) != 0) { + /* Must be >= 0 and multiple of element size. */ + goto fail_arguments; + } + if (duk_is_undefined(ctx, 2)) { + DUK_ASSERT(h_bufarg->length >= byte_offset); + byte_length = h_bufarg->length - byte_offset; + if ((byte_length & align_mask) != 0) { + /* Must be element size multiple from + * start offset to end of buffer. + */ + goto fail_arguments; + } + elem_length = (byte_length >> shift); + } else { + elem_length_signed = duk_to_int(ctx, 2); + if (elem_length_signed < 0) { + goto fail_arguments; + } + elem_length = (duk_uint_t) elem_length_signed; + byte_length = elem_length << shift; + if ((byte_length >> shift) != elem_length) { + /* Byte length would overflow. */ + /* XXX: easier check with less code? */ + goto fail_arguments; + } + DUK_ASSERT(h_bufarg->length >= byte_offset); + if (byte_length > h_bufarg->length - byte_offset) { + /* Not enough data. */ + goto fail_arguments; + } + } + DUK_ASSERT_DISABLE(byte_offset >= 0); + DUK_ASSERT(byte_offset <= h_bufarg->length); + DUK_ASSERT_DISABLE(byte_length >= 0); + DUK_ASSERT(byte_offset + byte_length <= h_bufarg->length); + DUK_ASSERT((elem_length << shift) == byte_length); + + h_bufobj = duk_push_bufferobject_raw(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_BUFFEROBJECT | + DUK_HOBJECT_CLASS_AS_FLAGS(class_num), + proto_bidx); + h_val = h_bufarg->buf; + if (h_val == NULL) { + return DUK_RET_TYPE_ERROR; + } + h_bufobj->buf = h_val; + DUK_HBUFFER_INCREF(thr, h_val); + h_bufobj->offset = h_bufarg->offset + byte_offset; + h_bufobj->length = byte_length; + h_bufobj->shift = shift; + h_bufobj->elem_type = elem_type; + h_bufobj->is_view = 1; + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + + /* Set .buffer to the argument ArrayBuffer. */ + duk_dup(ctx, 0); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_LC_BUFFER, DUK_PROPDESC_FLAGS_NONE); + duk_compact(ctx, -1); + return 1; + } else if (DUK_HOBJECT_IS_BUFFEROBJECT(h_obj)) { + /* TypedArray (or other non-ArrayBuffer duk_hbufferobject). + * Conceptually same behavior as for an Array-like argument, + * with a few fast paths. + */ + + h_bufarg = (duk_hbufferobject *) h_obj; + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufarg); + elem_length_signed = (duk_int_t) (h_bufarg->length >> h_bufarg->shift); + if (h_bufarg->buf == NULL) { + return DUK_RET_TYPE_ERROR; + } + + /* Select copy mode. Must take into account element + * compatibility and validity of the underlying source + * buffer. + */ + + DUK_DDD(DUK_DDDPRINT("selecting copy mode for bufobj arg, " + "src byte_length=%ld, src shift=%d, " + "src/dst elem_length=%ld; " + "dst shift=%d -> dst byte_length=%ld", + (long) h_bufarg->length, (int) h_bufarg->shift, + (long) elem_length_signed, (int) shift, + (long) (elem_length_signed << shift))); + + copy_mode = 2; /* default is explicit index read/write copy */ + DUK_ASSERT(elem_type < sizeof(duk__buffer_elemtype_copy_compatible) / sizeof(duk_uint16_t)); + if (DUK_HBUFFEROBJECT_VALID_SLICE(h_bufarg)) { + if ((duk__buffer_elemtype_copy_compatible[elem_type] & (1 << h_bufarg->elem_type)) != 0) { + DUK_DDD(DUK_DDDPRINT("source/target are copy compatible, memcpy")); + DUK_ASSERT(shift == h_bufarg->shift); /* byte sizes will match */ + copy_mode = 0; + } else { + DUK_DDD(DUK_DDDPRINT("source/target not copy compatible but valid, fast copy")); + copy_mode = 1; + } + } + } else { + /* Array or Array-like */ + elem_length_signed = (duk_int_t) duk_get_length(ctx, 0); + copy_mode = 2; + } + } else { + /* Non-object argument is simply int coerced, matches + * V8 behavior (except for "null", which we coerce to + * 0 but V8 TypeErrors). + */ + elem_length_signed = duk_to_int(ctx, 0); + copy_mode = 3; + } + if (elem_length_signed < 0) { + goto fail_arguments; + } + elem_length = (duk_uint_t) elem_length_signed; + byte_length = (duk_uint_t) (elem_length << shift); + if ((byte_length >> shift) != elem_length) { + /* Byte length would overflow. */ + /* XXX: easier check with less code? */ + goto fail_arguments; + } + + DUK_DDD(DUK_DDDPRINT("elem_length=%ld, byte_length=%ld", + (long) elem_length, (long) byte_length)); + + /* ArrayBuffer argument is handled specially above; the rest of the + * argument variants are handled by shared code below. + */ + + /* Push a new ArrayBuffer (becomes view .buffer) */ + h_bufarr = duk__push_arraybuffer_with_length(ctx, byte_length); + DUK_ASSERT(h_bufarr != NULL); + h_val = h_bufarr->buf; + DUK_ASSERT(h_val != NULL); + + /* Push the resulting view object and attach the ArrayBuffer. */ + h_bufobj = duk_push_bufferobject_raw(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_BUFFEROBJECT | + DUK_HOBJECT_CLASS_AS_FLAGS(class_num), + proto_bidx); + + h_bufobj->buf = h_val; + DUK_HBUFFER_INCREF(thr, h_val); + DUK_ASSERT(h_bufobj->offset == 0); + h_bufobj->length = byte_length; + h_bufobj->shift = shift; + h_bufobj->elem_type = elem_type; + h_bufobj->is_view = 1; + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + + /* Set .buffer */ + duk_dup(ctx, -2); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_LC_BUFFER, DUK_PROPDESC_FLAGS_NONE); + duk_compact(ctx, -1); + + /* Copy values, the copy method depends on the arguments. + * + * Copy mode decision may depend on the validity of the underlying + * buffer of the source argument; there must be no harmful side effects + * from there to here for copy_mode to still be valid. + */ + DUK_DDD(DUK_DDDPRINT("copy mode: %d", (int) copy_mode)); + switch (copy_mode) { + case 0: { + /* Use byte copy. */ + + duk_uint8_t *p_src; + duk_uint8_t *p_dst; + + DUK_ASSERT(h_bufobj != NULL); + DUK_ASSERT(h_bufobj->buf != NULL); + DUK_ASSERT(DUK_HBUFFEROBJECT_VALID_SLICE(h_bufobj)); + DUK_ASSERT(h_bufarg != NULL); + DUK_ASSERT(h_bufarg->buf != NULL); + DUK_ASSERT(DUK_HBUFFEROBJECT_VALID_SLICE(h_bufarg)); + + p_dst = DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_bufobj); + p_src = DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_bufarg); + + DUK_DDD(DUK_DDDPRINT("using memcpy: p_src=%p, p_dst=%p, byte_length=%ld", + (void *) p_src, (void *) p_dst, (long) byte_length)); + + DUK_MEMCPY((void *) p_dst, (const void *) p_src, (size_t) byte_length); + break; + } + case 1: { + /* Copy values through direct validated reads and writes. */ + + duk_small_uint_t src_elem_size; + duk_small_uint_t dst_elem_size; + duk_uint8_t *p_src; + duk_uint8_t *p_src_end; + duk_uint8_t *p_dst; + + DUK_ASSERT(h_bufobj != NULL); + DUK_ASSERT(h_bufobj->buf != NULL); + DUK_ASSERT(DUK_HBUFFEROBJECT_VALID_SLICE(h_bufobj)); + DUK_ASSERT(h_bufarg != NULL); + DUK_ASSERT(h_bufarg->buf != NULL); + DUK_ASSERT(DUK_HBUFFEROBJECT_VALID_SLICE(h_bufarg)); + + src_elem_size = 1 << h_bufarg->shift; + dst_elem_size = elem_size; + + p_src = DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_bufarg); + p_dst = DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_bufobj); + p_src_end = p_src + h_bufarg->length; + + DUK_DDD(DUK_DDDPRINT("using fast copy: p_src=%p, p_src_end=%p, p_dst=%p, " + "src_elem_size=%d, dst_elem_size=%d", + (void *) p_src, (void *) p_src_end, (void *) p_dst, + (int) src_elem_size, (int) dst_elem_size)); + + while (p_src != p_src_end) { + DUK_DDD(DUK_DDDPRINT("fast path per element copy loop: " + "p_src=%p, p_src_end=%p, p_dst=%p", + (void *) p_src, (void *) p_src_end, (void *) p_dst)); + /* A validated read() is always a number, so it's write coercion + * is always side effect free an won't invalidate pointers etc. + */ + duk_hbufferobject_push_validated_read(ctx, h_bufarg, p_src, src_elem_size); + duk_hbufferobject_validated_write(ctx, h_bufobj, p_dst, dst_elem_size); + duk_pop(ctx); + p_src += src_elem_size; + p_dst += dst_elem_size; + } + break; + } + case 2: { + /* Copy values by index reads and writes. Let virtual + * property handling take care of coercion. + */ + duk_uint_t i; + + DUK_DDD(DUK_DDDPRINT("using slow copy")); + + for (i = 0; i < elem_length; i++) { + duk_get_prop_index(ctx, 0, (duk_uarridx_t) i); + duk_put_prop_index(ctx, -2, (duk_uarridx_t) i); + } + break; + } + default: + case 3: { + /* No copy, leave zero bytes in the buffer. There's no + * ambiguity with Float32/Float64 because zero bytes also + * represent 0.0. + */ + + DUK_DDD(DUK_DDDPRINT("using no copy")); + break; + } + } + + return 1; + + fail_arguments: + return DUK_RET_RANGE_ERROR; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_typedarray_constructor(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_dataview_constructor(duk_context *ctx) { + duk_hbufferobject *h_bufarg; + duk_hbufferobject *h_bufobj; + duk_hbuffer *h_val; + duk_uint_t offset; + duk_uint_t length; + + /* XXX: function flag to make this automatic? */ + if (!duk_is_constructor_call(ctx)) { + return DUK_RET_TYPE_ERROR; + } + + h_bufarg = duk__require_bufobj_value(ctx, 0); + DUK_ASSERT(h_bufarg != NULL); + + duk__resolve_offset_opt_length(ctx, h_bufarg, 1, 2, &offset, &length, 1 /*throw_flag*/); + DUK_ASSERT(offset <= h_bufarg->length); + DUK_ASSERT(offset + length <= h_bufarg->length); + + h_bufobj = duk_push_bufferobject_raw(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_BUFFEROBJECT | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DATAVIEW), + DUK_BIDX_DATAVIEW_PROTOTYPE); + + h_val = h_bufarg->buf; + if (h_val == NULL) { + return DUK_RET_TYPE_ERROR; + } + h_bufobj->buf = h_val; + DUK_HBUFFER_INCREF(thr, h_val); + h_bufobj->offset = h_bufarg->offset + offset; + h_bufobj->length = length; + DUK_ASSERT(h_bufobj->shift == 0); + DUK_ASSERT(h_bufobj->elem_type == DUK_HBUFFEROBJECT_ELEM_UINT8); + h_bufobj->is_view = 1; + + /* The DataView .buffer property is ordinarily set to the argument + * which is an ArrayBuffer. We accept any duk_hbufferobject as + * an argument and .buffer will be set to the argument regardless + * of what it is. This may be a bit confusing if the argument + * is e.g. a DataView or another TypedArray view. + * + * XXX: Copy .buffer property from a DataView/TypedArray argument? + * Create a fresh ArrayBuffer for Duktape.Buffer and Node.js Buffer + * arguments? See: test-bug-dataview-buffer-prop.js. + */ + + duk_dup(ctx, 0); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_LC_BUFFER, DUK_PROPDESC_FLAGS_NONE); + duk_compact(ctx, -1); + + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + return 1; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_dataview_constructor(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * ArrayBuffer.isView() + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_arraybuffer_isview(duk_context *ctx) { + duk_hobject *h_obj; + duk_bool_t ret = 0; + + h_obj = duk_get_hobject(ctx, 0); + if (h_obj != NULL && DUK_HOBJECT_IS_BUFFEROBJECT(h_obj)) { + ret = ((duk_hbufferobject *) h_obj)->is_view; + } + duk_push_boolean(ctx, ret); + return 1; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_arraybuffer_isview(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * Node.js Buffer: toString([encoding], [start], [end]) + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_tostring(duk_context *ctx) { + duk_hthread *thr; + duk_hbufferobject *h_this; + duk_int_t start_offset, end_offset; + duk_uint8_t *buf_slice; + duk_size_t slice_length; + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + h_this = duk__get_bufobj_this(ctx); + if (h_this == NULL) { + /* XXX: happens e.g. when evaluating: String(Buffer.prototype). */ + duk_push_string(ctx, "[object Object]"); + return 1; + } + DUK_ASSERT_HBUFFEROBJECT_VALID(h_this); + + /* ignore encoding for now */ + + duk__clamp_startend_nonegidx_noshift(ctx, h_this, 1 /*idx_start*/, 2 /*idx_end*/, &start_offset, &end_offset); + + slice_length = (duk_size_t) (end_offset - start_offset); + buf_slice = (duk_uint8_t *) duk_push_fixed_buffer(ctx, slice_length); + DUK_ASSERT(buf_slice != NULL); + + if (h_this->buf == NULL) { + goto type_error; + } + + if (DUK_HBUFFEROBJECT_VALID_BYTEOFFSET_EXCL(h_this, start_offset + slice_length)) { + DUK_MEMCPY((void *) buf_slice, + (const void *) (DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_this) + start_offset), + slice_length); + } else { + /* not covered, return all zeroes */ + ; + } + + duk_to_string(ctx, -1); + return 1; + + type_error: + return DUK_RET_TYPE_ERROR; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_tostring(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * Duktape.Buffer: toString(), valueOf() + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_buffer_prototype_tostring_shared(duk_context *ctx) { + duk_hthread *thr; + duk_tval *tv; + duk_small_int_t to_string = duk_get_current_magic(ctx); + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + tv = duk_get_borrowed_this_tval(ctx); + DUK_ASSERT(tv != NULL); + + if (DUK_TVAL_IS_BUFFER(tv)) { + duk_hbuffer *h_buf; + h_buf = DUK_TVAL_GET_BUFFER(tv); + DUK_ASSERT(h_buf != NULL); + duk_push_hbuffer(ctx, h_buf); + } else if (DUK_TVAL_IS_OBJECT(tv)) { + duk_hobject *h; + duk_hbufferobject *h_bufobj; + + /* Accept any duk_hbufferobject, though we're only normally + * called for Duktape.Buffer values. + */ + h = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h != NULL); + if (!DUK_HOBJECT_IS_BUFFEROBJECT(h)) { + DUK_DD(DUK_DDPRINT("toString/valueOf() called for a non-bufferobject object")); + goto type_error; + } + h_bufobj = (duk_hbufferobject *) h; + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + + if (h_bufobj->buf == NULL) { + DUK_DD(DUK_DDPRINT("toString/valueOf() called for a bufferobject with NULL buf")); + goto type_error; + } + duk_push_hbuffer(ctx, h_bufobj->buf); + } else { + goto type_error; + } + + if (to_string) { + duk_to_string(ctx, -1); + } + return 1; + + type_error: + return DUK_RET_TYPE_ERROR; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_buffer_prototype_tostring_shared(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * Node.js Buffer.prototype: toJSON() + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_tojson(duk_context *ctx) { + duk_hthread *thr; + duk_hbufferobject *h_this; + duk_uint8_t *buf; + duk_uint_t i; + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + h_this = duk__require_bufobj_this(ctx); + DUK_ASSERT(h_this != NULL); + + if (h_this->buf == NULL || !DUK_HBUFFEROBJECT_VALID_SLICE(h_this)) { + /* Serialize uncovered backing buffer as a null; doesn't + * really matter as long we're memory safe. + */ + duk_push_null(ctx); + return 1; + } + + duk_push_object(ctx); + duk_push_hstring_stridx(ctx, DUK_STRIDX_UC_BUFFER); + duk_put_prop_stridx(ctx, -2, DUK_STRIDX_TYPE); + + duk_push_array(ctx); + for (i = 0; i < h_this->length; i++) { + /* XXX: regetting the pointer may be overkill - we're writing + * to a side-effect free array here. + */ + DUK_ASSERT(h_this->buf != NULL); + buf = DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_this); + duk_push_uint(ctx, (duk_uint_t) buf[i]); + duk_put_prop_index(ctx, -2, (duk_idx_t) i); + } + duk_put_prop_stridx(ctx, -2, DUK_STRIDX_DATA); + + return 1; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_tojson(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * Node.js Buffer.prototype.equals() + * Node.js Buffer.prototype.compare() + * Node.js Buffer.compare() + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_buffer_compare_shared(duk_context *ctx) { + duk_hthread *thr; + duk_small_uint_t magic; + duk_hbufferobject *h_bufarg1; + duk_hbufferobject *h_bufarg2; + duk_small_int_t comp_res; + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + magic = duk_get_current_magic(ctx); + if (magic & 0x02) { + /* Static call style. */ + h_bufarg1 = duk__require_bufobj_value(ctx, 0); + h_bufarg2 = duk__require_bufobj_value(ctx, 1); + } else { + h_bufarg1 = duk__require_bufobj_this(ctx); + h_bufarg2 = duk__require_bufobj_value(ctx, 0); + } + DUK_ASSERT(h_bufarg1 != NULL); + DUK_ASSERT(h_bufarg2 != NULL); + + /* We want to compare the slice/view areas of the arguments. + * If either slice/view is invalid (underlying buffer is shorter) + * ensure equals() is false, but otherwise the only thing that + * matters is to be memory safe. + */ + + if (DUK_HBUFFEROBJECT_VALID_SLICE(h_bufarg1) && + DUK_HBUFFEROBJECT_VALID_SLICE(h_bufarg2)) { + comp_res = duk_js_data_compare((const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufarg1->buf) + h_bufarg1->offset, + (const duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h_bufarg2->buf) + h_bufarg2->offset, + (duk_size_t) h_bufarg1->length, + (duk_size_t) h_bufarg2->length); + } else { + comp_res = -1; /* either nonzero value is ok */ + } + + if (magic & 0x01) { + /* compare: similar to string comparison but for buffer data. */ + duk_push_int(ctx, comp_res); + } else { + /* equals */ + duk_push_boolean(ctx, (comp_res == 0)); + } + + return 1; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_buffer_compare_shared(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * Node.js Buffer.prototype.fill() + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_fill(duk_context *ctx) { + duk_hthread *thr; + duk_hbufferobject *h_this; + const duk_uint8_t *fill_str_ptr; + duk_size_t fill_str_len; + duk_uint8_t fill_value; + duk_int_t fill_offset; + duk_int_t fill_end; + duk_size_t fill_length; + duk_uint8_t *p; + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + h_this = duk__require_bufobj_this(ctx); + DUK_ASSERT(h_this != NULL); + if (h_this->buf == NULL) { + return DUK_RET_TYPE_ERROR; + } + + /* [ value offset end ] */ + + if (duk_is_string(ctx, 0)) { + fill_str_ptr = (const duk_uint8_t *) duk_get_lstring(ctx, 0, &fill_str_len); + DUK_ASSERT(fill_str_ptr != NULL); + } else { + fill_value = (duk_uint8_t) duk_to_uint32(ctx, 0); + fill_str_ptr = (const duk_uint8_t *) &fill_value; + fill_str_len = 1; + } + + /* Fill offset handling is more lenient than in Node.js. */ + + duk__clamp_startend_nonegidx_noshift(ctx, h_this, 1 /*idx_start*/, 2 /*idx_end*/, &fill_offset, &fill_end); + + DUK_DDD(DUK_DDDPRINT("fill: fill_value=%02x, fill_offset=%ld, fill_end=%ld, view length=%ld", + (unsigned int) fill_value, (long) fill_offset, (long) fill_end, (long) h_this->length)); + + DUK_ASSERT(fill_end - fill_offset >= 0); + DUK_ASSERT(h_this->buf != NULL); + + p = (DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_this) + fill_offset); + fill_length = (duk_size_t) (fill_end - fill_offset); + if (fill_str_len == 1) { + /* Handle single character fills as memset() even when + * the fill data comes from a one-char argument. + */ + DUK_MEMSET((void *) p, (int) fill_str_ptr[0], (size_t) fill_length); + } else if (fill_str_len > 1) { + duk_size_t i, n, t; + + for (i = 0, n = (fill_end - fill_offset), t = 0; i < n; i++) { + p[i] = fill_str_ptr[t++]; + if (t >= fill_str_len) { + t = 0; + } + } + } else { + DUK_DDD(DUK_DDDPRINT("zero size fill pattern, ignore silently")); + } + + /* Return the Buffer to allow chaining: b.fill(0x11).fill(0x22, 3, 5).toString() */ + duk_push_this(ctx); + return 1; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_fill(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * Node.js Buffer.prototype.write(string, [offset], [length], [encoding]) + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_write(duk_context *ctx) { + duk_hthread *thr; + duk_hbufferobject *h_this; + duk_uint_t offset; + duk_uint_t length; + const duk_uint8_t *str_data; + duk_size_t str_len; + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + h_this = duk__require_bufobj_this(ctx); + DUK_ASSERT(h_this != NULL); + + /* Argument must be a string, e.g. a buffer is not allowed. */ + str_data = (const duk_uint8_t *) duk_require_lstring(ctx, 0, &str_len); + + duk__resolve_offset_opt_length(ctx, h_this, 1, 2, &offset, &length, 0 /*throw_flag*/); + DUK_ASSERT(offset <= h_this->length); + DUK_ASSERT(offset + length <= h_this->length); + + /* XXX: encoding is ignored now. */ + + if (length > str_len) { + length = (duk_uint_t) str_len; + } + + if (DUK_HBUFFEROBJECT_VALID_SLICE(h_this)) { + /* Cannot overlap. */ + DUK_MEMCPY((void *) (DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_this) + offset), + (const void *) str_data, + (size_t) length); + } else { + DUK_DDD(DUK_DDDPRINT("write() target buffer is not covered, silent ignore")); + } + + duk_push_uint(ctx, length); + return 1; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_write(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * Node.js Buffer.prototype.copy() + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_copy(duk_context *ctx) { + duk_hthread *thr; + duk_hbufferobject *h_this; + duk_hbufferobject *h_bufarg; + duk_int_t source_length; + duk_int_t target_length; + duk_int_t target_start, source_start, source_end; + duk_uint_t target_ustart, source_ustart, source_uend; + duk_uint_t copy_size = 0; + + /* [ targetBuffer targetStart sourceStart sourceEnd ] */ + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + h_this = duk__require_bufobj_this(ctx); + h_bufarg = duk__require_bufobj_value(ctx, 0); + DUK_ASSERT(h_this != NULL); + DUK_ASSERT(h_bufarg != NULL); + source_length = (duk_int_t) h_this->length; + target_length = (duk_int_t) h_bufarg->length; + + target_start = duk_to_int(ctx, 1); + source_start = duk_to_int(ctx, 2); + if (duk_is_undefined(ctx, 3)) { + source_end = source_length; + } else { + source_end = duk_to_int(ctx, 3); + } + + DUK_DDD(DUK_DDDPRINT("checking copy args: target_start=%ld, target_length=%ld, " + "source_start=%ld, source_end=%ld, source_length=%ld", + (long) target_start, (long) h_bufarg->length, + (long) source_start, (long) source_end, (long) source_length)); + + /* This behavior mostly mimics Node.js now. */ + + if (source_start < 0 || source_end < 0 || target_start < 0) { + /* Negative offsets cause a RangeError. */ + goto fail_bounds; + } + source_ustart = (duk_uint_t) source_start; + source_uend = (duk_uint_t) source_end; + target_ustart = (duk_uint_t) target_start; + if (source_ustart >= source_uend || /* crossed offsets or zero size */ + source_ustart >= (duk_uint_t) source_length || /* source out-of-bounds (but positive) */ + target_ustart >= (duk_uint_t) target_length) { /* target out-of-bounds (but positive) */ + goto silent_ignore; + } + if (source_uend >= (duk_uint_t) source_length) { + /* Source end clamped silently to available length. */ + source_uend = source_length; + } + copy_size = source_uend - source_ustart; + if (target_ustart + copy_size > (duk_uint_t) target_length) { + /* Clamp to target's end if too long. + * + * NOTE: there's no overflow possibility in the comparison; + * both target_ustart and copy_size are >= 0 and based on + * values in duk_int_t range. Adding them as duk_uint_t + * values is then guaranteed not to overflow. + */ + DUK_ASSERT(target_ustart + copy_size >= target_ustart); /* no overflow */ + DUK_ASSERT(target_ustart + copy_size >= copy_size); /* no overflow */ + copy_size = (duk_uint_t) target_length - target_ustart; + } + + DUK_DDD(DUK_DDDPRINT("making copy: target_ustart=%lu source_ustart=%lu copy_size=%lu", + (unsigned long) target_ustart, (unsigned long) source_ustart, + (unsigned long) copy_size)); + + DUK_ASSERT(copy_size >= 1); + DUK_ASSERT(source_ustart <= (duk_uint_t) source_length); + DUK_ASSERT(source_ustart + copy_size <= (duk_uint_t) source_length); + DUK_ASSERT(target_ustart <= (duk_uint_t) target_length); + DUK_ASSERT(target_ustart + copy_size <= (duk_uint_t) target_length); + + /* Ensure copy is covered by underlying buffers. */ + DUK_ASSERT(h_bufarg->buf != NULL); /* length check */ + DUK_ASSERT(h_this->buf != NULL); /* length check */ + if (DUK_HBUFFEROBJECT_VALID_BYTEOFFSET_EXCL(h_bufarg, target_ustart + copy_size) && + DUK_HBUFFEROBJECT_VALID_BYTEOFFSET_EXCL(h_this, source_ustart + copy_size)) { + /* Must use memmove() because copy area may overlap (source and target + * buffer may be the same, or from different slices. + */ + DUK_MEMMOVE((void *) (DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_bufarg) + target_ustart), + (const void *) (DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_this) + source_ustart), + (size_t) copy_size); + } else { + DUK_DDD(DUK_DDDPRINT("buffer copy not covered by underlying buffer(s), ignoring")); + } + + silent_ignore: + /* Return value is like write(), number of bytes written. + * The return value matters because of code like: + * "off += buf.copy(...)". + */ + duk_push_uint(ctx, copy_size); + return 1; + + fail_bounds: + return DUK_RET_RANGE_ERROR; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_copy(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * TypedArray.prototype.set() + * + * TypedArray set() is pretty interesting to implement because: + * + * - The source argument may be a plain array or a typedarray. If the + * source is a TypedArray, values are decoded and re-encoded into the + * target (not as a plain byte copy). This may happen even when the + * element byte size is the same, e.g. integer values may be re-encoded + * into floats. + * + * - Source and target may refer to the same underlying buffer, so that + * the set() operation may overlap. The specification requires that this + * must work as if a copy was made before the operation. Note that this + * is NOT a simple memmove() situation because the source and target + * byte sizes may be different -- e.g. a 4-byte source (Int8Array) may + * expand to a 16-byte target (Uint32Array) so that the target overlaps + * the source both from beginning and the end (unlike in typical memmove). + * + * - Even if 'buf' pointers of the source and target differ, there's no + * guarantee that their memory areas don't overlap. This may be the + * case with external buffers. + * + * Even so, it is nice to optimize for the common case: + * + * - Source and target separate buffers or non-overlapping. + * + * - Source and target have a compatible type so that a plain byte copy + * is possible. Note that while e.g. uint8 and int8 are compatible + * (coercion one way or another doesn't change the byte representation), + * e.g. int8 and uint8clamped are NOT compatible when writing int8 + * values into uint8clamped typedarray (-1 would clamp to 0 for instance). + * + * See test-bi-typedarray-proto-set.js. + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_typedarray_set(duk_context *ctx) { + duk_hthread *thr; + duk_hbufferobject *h_this; + duk_hobject *h_obj; + duk_uarridx_t i, n; + duk_int_t offset_signed; + duk_uint_t offset_elems; + duk_uint_t offset_bytes; + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + h_this = duk__require_bufobj_this(ctx); + DUK_ASSERT(h_this != NULL); + DUK_ASSERT_HBUFFEROBJECT_VALID(h_this); + + if (h_this->buf == NULL) { + DUK_DDD(DUK_DDDPRINT("source neutered, skip copy")); + return 0; + } + + h_obj = duk_require_hobject(ctx, 0); + DUK_ASSERT(h_obj != NULL); + + /* XXX: V8 throws a TypeError for negative values. Would it + * be more useful to interpret negative offsets here from the + * end of the buffer too? + */ + offset_signed = duk_to_int(ctx, 1); + if (offset_signed < 0) { + return DUK_RET_TYPE_ERROR; + } + offset_elems = (duk_uint_t) offset_signed; + offset_bytes = offset_elems << h_this->shift; + if ((offset_bytes >> h_this->shift) != offset_elems) { + /* Byte length would overflow. */ + /* XXX: easier check with less code? */ + return DUK_RET_RANGE_ERROR; + } + if (offset_bytes > h_this->length) { + /* Equality may be OK but >length not. Checking + * this explicitly avoids some overflow cases + * below. + */ + return DUK_RET_RANGE_ERROR; + } + DUK_ASSERT(offset_bytes <= h_this->length); + + /* Fast path: source is a TypedArray (or any bufferobject). */ + + if (DUK_HOBJECT_IS_BUFFEROBJECT(h_obj)) { + duk_hbufferobject *h_bufarg; + duk_uint16_t comp_mask; + duk_small_int_t no_overlap = 0; + duk_uint_t src_length; + duk_uint_t dst_length; + duk_uint_t dst_length_elems; + duk_uint8_t *p_src_base; + duk_uint8_t *p_src_end; + duk_uint8_t *p_src; + duk_uint8_t *p_dst_base; + duk_uint8_t *p_dst; + duk_small_uint_t src_elem_size; + duk_small_uint_t dst_elem_size; + + h_bufarg = (duk_hbufferobject *) h_obj; + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufarg); + + if (h_bufarg->buf == NULL) { + DUK_DDD(DUK_DDDPRINT("target neutered, skip copy")); + return 0; + } + + /* Nominal size check. */ + src_length = h_bufarg->length; /* bytes in source */ + dst_length_elems = (src_length >> h_bufarg->shift); /* elems in source and dest */ + dst_length = dst_length_elems << h_this->shift; /* bytes in dest */ + if ((dst_length >> h_this->shift) != dst_length_elems) { + /* Byte length would overflow. */ + /* XXX: easier check with less code? */ + return DUK_RET_RANGE_ERROR; + } + DUK_DDD(DUK_DDDPRINT("nominal size check: src_length=%ld, dst_length=%ld", + (long) src_length, (long) dst_length)); + DUK_ASSERT(offset_bytes <= h_this->length); + if (dst_length > h_this->length - offset_bytes) { + /* Overflow not an issue because subtraction is used on the right + * side and guaranteed to be >= 0. + */ + DUK_DDD(DUK_DDDPRINT("copy exceeds target buffer nominal length")); + return DUK_RET_RANGE_ERROR; + } + if (!DUK_HBUFFEROBJECT_VALID_BYTEOFFSET_EXCL(h_this, offset_bytes + dst_length)) { + DUK_DDD(DUK_DDDPRINT("copy not covered by underlying target buffer, ignore")); + return 0; + } + + p_src_base = DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_bufarg); + p_dst_base = DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_this) + offset_bytes; + + /* Check actual underlying buffers for validity and that they + * cover the copy. No side effects are allowed after the check + * so that the validity status doesn't change. + */ + if (!DUK_HBUFFEROBJECT_VALID_SLICE(h_this) || + !DUK_HBUFFEROBJECT_VALID_SLICE(h_bufarg)) { + /* The condition could be more narrow and check for the + * copy area only, but there's no need for fine grained + * behavior when the underlying buffer is misconfigured. + */ + DUK_DDD(DUK_DDDPRINT("source and/or target not covered by underlying buffer, skip copy")); + return 0; + } + + /* We want to do a straight memory copy if possible: this is + * an important operation because .set() is the TypedArray + * way to copy chunks of memory. However, because set() + * conceptually works in terms of elements, not all views are + * compatible with direct byte copying. + * + * If we do manage a direct copy, the "overlap issue" handled + * below can just be solved using memmove() because the source + * and destination element sizes are necessarily equal. + */ + + DUK_ASSERT(h_this->elem_type < sizeof(duk__buffer_elemtype_copy_compatible) / sizeof(duk_uint16_t)); + comp_mask = duk__buffer_elemtype_copy_compatible[h_this->elem_type]; + if (comp_mask & (1 << h_bufarg->elem_type)) { + DUK_ASSERT(src_length == dst_length); + + DUK_DDD(DUK_DDDPRINT("fast path: able to use memmove() because views are compatible")); + DUK_MEMMOVE((void *) p_dst_base, (const void *) p_src_base, (size_t) dst_length); + return 0; + } + DUK_DDD(DUK_DDDPRINT("fast path: views are not compatible with a byte copy, copy by item")); + + /* We want to avoid making a copy to process set() but that's + * not always possible: the source and the target may overlap + * and because element sizes are different, the overlap cannot + * always be handled with a memmove() or choosing the copy + * direction in a certain way. For example, if source type is + * uint8 and target type is uint32, the target area may exceed + * the source area from both ends! + * + * Note that because external buffers may point to the same + * memory areas, we must ultimately make this check using + * pointers. + * + * NOTE: careful with side effects: any side effect may cause + * a buffer resize (or external buffer pointer/length update)! + */ + + DUK_DDD(DUK_DDDPRINT("overlap check: p_src_base=%p, src_length=%ld, " + "p_dst_base=%p, dst_length=%ld", + (void *) p_src_base, (long) src_length, + (void *) p_dst_base, (long) dst_length)); + + if (p_src_base >= p_dst_base + dst_length || /* source starts after dest ends */ + p_src_base + src_length <= p_dst_base) { /* source ends before dest starts */ + no_overlap = 1; + } + + if (!no_overlap) { + /* There's overlap: the desired end result is that + * conceptually a copy is made to avoid "trampling" + * of source data by destination writes. We make + * an actual temporary copy to handle this case. + */ + duk_uint8_t *p_src_copy; + + DUK_DDD(DUK_DDDPRINT("there is overlap, make a copy of the source")); + p_src_copy = (duk_uint8_t *) duk_push_fixed_buffer(ctx, src_length); + DUK_ASSERT(p_src_copy != NULL); + DUK_MEMCPY((void *) p_src_copy, (const void *) p_src_base, (size_t) src_length); + + p_src_base = p_src_copy; /* use p_src_base from now on */ + } + /* Value stack intentionally mixed size here. */ + + DUK_DDD(DUK_DDDPRINT("after overlap check: p_src_base=%p, src_length=%ld, " + "p_dst_base=%p, dst_length=%ld, valstack top=%ld", + (void *) p_src_base, (long) src_length, + (void *) p_dst_base, (long) dst_length, + (long) duk_get_top(ctx))); + + /* Ready to make the copy. We must proceed element by element + * and must avoid any side effects that might cause the buffer + * validity check above to become invalid. + * + * Although we work through the value stack here, only plain + * numbers are handled which should be side effect safe. + */ + + src_elem_size = 1 << h_bufarg->shift; + dst_elem_size = 1 << h_this->shift; + p_src = p_src_base; + p_dst = p_dst_base; + p_src_end = p_src_base + src_length; + + while (p_src != p_src_end) { + DUK_DDD(DUK_DDDPRINT("fast path per element copy loop: " + "p_src=%p, p_src_end=%p, p_dst=%p", + (void *) p_src, (void *) p_src_end, (void *) p_dst)); + /* A validated read() is always a number, so it's write coercion + * is always side effect free an won't invalidate pointers etc. + */ + duk_hbufferobject_push_validated_read(ctx, h_bufarg, p_src, src_elem_size); + duk_hbufferobject_validated_write(ctx, h_this, p_dst, dst_elem_size); + duk_pop(ctx); + p_src += src_elem_size; + p_dst += dst_elem_size; + } + + return 0; + } else { + /* Slow path: quite slow, but we save space by using the property code + * to write coerce target values. We don't need to worry about overlap + * here because the source is not a TypedArray. + * + * We could use the bufferobject write coercion helper but since the + * property read may have arbitrary side effects, full validity checks + * would be needed for every element anyway. + */ + + n = (duk_uarridx_t) duk_get_length(ctx, 0); + DUK_ASSERT(offset_bytes <= h_this->length); + if ((n << h_this->shift) > h_this->length - offset_bytes) { + /* Overflow not an issue because subtraction is used on the right + * side and guaranteed to be >= 0. + */ + DUK_DDD(DUK_DDDPRINT("copy exceeds target buffer nominal length")); + return DUK_RET_RANGE_ERROR; + } + + /* There's no need to check for buffer validity status for the + * target here: the property access code will do that for each + * element. Moreover, if we did check the validity here, side + * effects from reading the source argument might invalidate + * the results anyway. + */ + + DUK_ASSERT_TOP(ctx, 2); + duk_push_this(ctx); + + for (i = 0; i < n; i++) { + duk_get_prop_index(ctx, 0, i); + duk_put_prop_index(ctx, 2, offset_elems + i); + } + } + + return 0; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_typedarray_set(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * Node.js Buffer.prototype.slice([start], [end]) + * ArrayBuffer.prototype.slice(begin, [end]) + * TypedArray.prototype.slice(begin, [end]) + * + * The API calls are almost identical; negative indices are counted from end + * of buffer, and final indices are clamped (allowing crossed indices). Main + * differences: + * + * - Copy/view behavior; Node.js .slice() and TypedArray .subarray() create + * views, ArrayBuffer .slice() creates a copy + * + * - Resulting object has a different class and prototype depending on the + * call (or 'this' argument) + * + * - TypedArray .subarray() arguments are element indices, not byte offsets + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_buffer_slice_shared(duk_context *ctx) { + duk_hthread *thr; + duk_small_int_t magic; + duk_small_uint_t res_class_num; + duk_hobject *res_proto; + duk_hbufferobject *h_this; + duk_hbufferobject *h_bufobj; + duk_hbuffer *h_val; + duk_int_t start_offset, end_offset; + duk_uint_t slice_length; + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + /* [ start end ] */ + + magic = duk_get_current_magic(ctx); + h_this = duk__require_bufobj_this(ctx); + + /* Slice offsets are element (not byte) offsets, which only matters + * for TypedArray views, Node.js Buffer and ArrayBuffer have shift + * zero so byte and element offsets are the same. Negative indices + * are counted from end of slice, crossed indices are allowed (and + * result in zero length result), and final values are clamped + * against the current slice. There's intentionally no check + * against the underlying buffer here. + */ + + duk__clamp_startend_negidx_shifted(ctx, h_this, 0 /*idx_start*/, 1 /*idx_end*/, &start_offset, &end_offset); + DUK_ASSERT(end_offset >= start_offset); + slice_length = (duk_uint_t) (end_offset - start_offset); + + /* The resulting buffer object gets the same class and prototype as + * the buffer in 'this', e.g. if the input is a Node.js Buffer the + * result is a Node.js Buffer; if the input is a Float32Array, the + * result is a Float32Array. + * + * For the class number this seems correct. The internal prototype + * is not so clear: if 'this' is a bufferobject with a non-standard + * prototype object, that value gets copied over into the result + * (instead of using the standard prototype for that object type). + */ + + res_class_num = DUK_HOBJECT_GET_CLASS_NUMBER((duk_hobject *) h_this); + h_bufobj = duk_push_bufferobject_raw(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_BUFFEROBJECT | + DUK_HOBJECT_CLASS_AS_FLAGS(res_class_num), + DUK_BIDX_OBJECT_PROTOTYPE); /* replaced */ + DUK_ASSERT(h_bufobj != NULL); + res_proto = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, (duk_hobject *) h_this); /* may be NULL */ + DUK_HOBJECT_SET_PROTOTYPE_UPDREF(thr, (duk_hobject *) h_bufobj, res_proto); + + h_bufobj->length = slice_length; + h_bufobj->shift = h_this->shift; /* inherit */ + h_bufobj->elem_type = h_this->elem_type; /* inherit */ + h_bufobj->is_view = magic & 0x01; + DUK_ASSERT(h_bufobj->is_view == 0 || h_bufobj->is_view == 1); + + h_val = h_this->buf; + if (h_val == NULL) { + return DUK_RET_TYPE_ERROR; + } + + if (magic & 0x02) { + /* non-zero: make copy */ + duk_uint8_t *p_copy; + duk_size_t copy_length; + + p_copy = (duk_uint8_t *) duk_push_fixed_buffer(ctx, (duk_size_t) slice_length); + DUK_ASSERT(p_copy != NULL); + + /* Copy slice, respecting underlying buffer limits; remainder + * is left as zero. + */ + copy_length = DUK_HBUFFEROBJECT_CLAMP_BYTELENGTH(h_this, slice_length); + DUK_MEMCPY((void *) p_copy, + (const void *) (DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_this) + start_offset), + copy_length); + + h_val = duk_get_hbuffer(ctx, -1); + DUK_ASSERT(h_val != NULL); + + h_bufobj->buf = h_val; + DUK_HBUFFER_INCREF(thr, h_val); + DUK_ASSERT(h_bufobj->offset == 0); + + duk_pop(ctx); /* reachable so pop OK */ + } else { + h_bufobj->buf = h_val; + DUK_HBUFFER_INCREF(thr, h_val); + h_bufobj->offset = (duk_uint_t) (h_this->offset + start_offset); + + /* Copy the .buffer property, needed for TypedArray.prototype.subarray(). + * + * XXX: limit copy only for TypedArray classes specifically? + */ + + duk_push_this(ctx); + if (duk_get_prop_stridx(ctx, -1, DUK_STRIDX_LC_BUFFER)) { + duk_xdef_prop_stridx(ctx, -3, DUK_STRIDX_LC_BUFFER, DUK_PROPDESC_FLAGS_NONE); + duk_pop(ctx); + } else { + duk_pop_2(ctx); + } + } + /* unbalanced stack on purpose */ + + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + return 1; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_buffer_slice_shared(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * Node.js Buffer.isEncoding() + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_is_encoding(duk_context *ctx) { + const char *encoding; + + /* only accept lowercase 'utf8' now. */ + + encoding = duk_to_string(ctx, 0); + DUK_ASSERT(duk_is_string(ctx, 0)); /* guaranteed by duk_to_string() */ + duk_push_boolean(ctx, DUK_STRCMP(encoding, "utf8") == 0); + return 1; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_is_encoding(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * Node.js Buffer.isBuffer() + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_is_buffer(duk_context *ctx) { + duk_hthread *thr; + duk_tval *tv; + duk_hobject *h; + duk_hobject *h_proto; + duk_bool_t ret = 0; + + thr = (duk_hthread *) ctx; + + DUK_ASSERT(duk_get_top(ctx) >= 1); /* nargs */ + tv = duk_get_tval(ctx, 0); + DUK_ASSERT(tv != NULL); + + if (DUK_TVAL_IS_OBJECT(tv)) { + h = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h != NULL); + + h_proto = thr->builtins[DUK_BIDX_NODEJS_BUFFER_PROTOTYPE]; + DUK_ASSERT(h_proto != NULL); + + h = DUK_HOBJECT_GET_PROTOTYPE(thr->heap, h); + if (h) { + ret = duk_hobject_prototype_chain_contains(thr, h, h_proto, 0 /*ignore_loop*/); + } + } + + duk_push_boolean(ctx, ret); + return 1; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_is_buffer(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * Node.js Buffer.byteLength() + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_byte_length(duk_context *ctx) { + const char *str; + duk_size_t len; + + /* At the moment Buffer() will just use the string bytes as + * is (ignoring encoding), so we return the string length here + * unconditionally. + */ + + str = duk_to_lstring(ctx, 0, &len); + DUK_UNREF(str); + duk_push_size_t(ctx, len); + return 1; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_byte_length(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * Node.js Buffer.concat() + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_concat(duk_context *ctx) { + duk_hthread *thr; + duk_hobject *h_arg; + duk_int_t total_length = 0; + duk_hbufferobject *h_bufobj; + duk_hbufferobject *h_bufres; + duk_hbuffer *h_val; + duk_uint_t i, n; + duk_uint8_t *p; + duk_size_t space_left; + duk_size_t copy_size; + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + /* Node.js accepts only actual Arrays. */ + h_arg = duk_require_hobject(ctx, 0); + if (DUK_HOBJECT_GET_CLASS_NUMBER(h_arg) != DUK_HOBJECT_CLASS_ARRAY) { + return DUK_RET_TYPE_ERROR; + } + + /* Compute result length and validate argument buffers. */ + n = (duk_uint_t) duk_get_length(ctx, 0); + for (i = 0; i < n; i++) { + /* Neutered checks not necessary here: neutered buffers have + * zero 'length' so we'll effectively skip them. + */ + DUK_ASSERT_TOP(ctx, 2); /* [ array totalLength ] */ + duk_get_prop_index(ctx, 0, (duk_uarridx_t) i); /* -> [ array totalLength buf ] */ + h_bufobj = duk__require_bufobj_value(ctx, 2); + DUK_ASSERT(h_bufobj != NULL); + total_length += h_bufobj->length; + duk_pop(ctx); + } + if (n == 1) { + /* For the case n==1 Node.js doesn't seem to type check + * the sole member but we do it before returning it. + * For this case only the original buffer object is + * returned (not a copy). + */ + duk_get_prop_index(ctx, 0, 0); + return 1; + } + + /* User totalLength overrides a computed length, but we'll check + * every copy in the copy loop. Note that duk_to_uint() can + * technically have arbitrary side effects so we need to recheck + * the buffers in the copy loop. + */ + if (!duk_is_undefined(ctx, 1) && n > 0) { + /* For n == 0, Node.js ignores totalLength argument and + * returns a zero length buffer. + */ + total_length = duk_to_int(ctx, 1); + } + if (total_length < 0) { + return DUK_RET_RANGE_ERROR; + } + + h_bufres = duk_push_bufferobject_raw(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_BUFFEROBJECT | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_BUFFER), + DUK_BIDX_NODEJS_BUFFER_PROTOTYPE); + DUK_ASSERT(h_bufres != NULL); + + p = (duk_uint8_t *) duk_push_fixed_buffer(ctx, total_length); + DUK_ASSERT(p != NULL); + space_left = total_length; + + for (i = 0; i < n; i++) { + DUK_ASSERT_TOP(ctx, 4); /* [ array totalLength bufres buf ] */ + + duk_get_prop_index(ctx, 0, (duk_uarridx_t) i); + h_bufobj = duk__require_bufobj_value(ctx, 4); + DUK_ASSERT(h_bufobj != NULL); + + copy_size = h_bufobj->length; + if (copy_size > space_left) { + copy_size = space_left; + } + + if (h_bufobj->buf != NULL && + DUK_HBUFFEROBJECT_VALID_SLICE(h_bufobj)) { + DUK_MEMCPY((void *) p, + (const void *) DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_bufobj), + copy_size); + } else { + /* Just skip, leaving zeroes in the result. */ + ; + } + p += copy_size; + space_left -= copy_size; + + duk_pop(ctx); + } + + h_val = duk_get_hbuffer(ctx, -1); + DUK_ASSERT(h_val != NULL); + + duk__set_bufobj_buffer(ctx, h_bufres, h_val); + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufres); + + duk_pop(ctx); /* pop plain buffer, now reachable through h_bufres */ + + return 1; /* return h_bufres */ +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_nodejs_buffer_concat(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +/* + * Shared readfield and writefield methods + * + * The readfield/writefield methods need support for endianness and field + * types. All offsets are byte based so no offset shifting is needed. + */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +/* Format of magic, bits: + * 0...1: field type; 0=uint8, 1=uint16, 2=uint32, 3=float, 4=double, 5=unused, 6=unused, 7=unused + * 3: endianness: 0=little, 1=big + * 4: signed: 1=yes, 0=no + * 5: typedarray: 1=yes, 0=no + */ +#define DUK__FLD_8BIT 0 +#define DUK__FLD_16BIT 1 +#define DUK__FLD_32BIT 2 +#define DUK__FLD_FLOAT 3 +#define DUK__FLD_DOUBLE 4 +#define DUK__FLD_VARINT 5 +#define DUK__FLD_BIGENDIAN (1 << 3) +#define DUK__FLD_SIGNED (1 << 4) +#define DUK__FLD_TYPEDARRAY (1 << 5) + +/* XXX: split into separate functions for each field type? */ +DUK_INTERNAL duk_ret_t duk_bi_buffer_readfield(duk_context *ctx) { + duk_hthread *thr; + duk_small_int_t magic = (duk_small_int_t) duk_get_current_magic(ctx); + duk_small_int_t magic_ftype; + duk_small_int_t magic_bigendian; + duk_small_int_t magic_signed; + duk_small_int_t magic_typedarray; + duk_small_int_t endswap; + duk_hbufferobject *h_this; + duk_bool_t no_assert; + duk_int_t offset_signed; + duk_uint_t offset; + duk_uint_t buffer_length; + duk_uint_t check_length; + duk_uint8_t *buf; + duk_double_union du; + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + magic_ftype = magic & 0x0007; + magic_bigendian = magic & 0x0008; + magic_signed = magic & 0x0010; + magic_typedarray = magic & 0x0020; + + h_this = duk__require_bufobj_this(ctx); + DUK_ASSERT(h_this != NULL); + buffer_length = h_this->length; + + /* [ offset noAssert ], when ftype != DUK__FLD_VARINT */ + /* [ offset fieldByteLength noAssert ], when ftype == DUK__FLD_VARINT */ + /* [ offset littleEndian ], when DUK__FLD_TYPEDARRAY (regardless of ftype) */ + + /* Handle TypedArray vs. Node.js Buffer arg differences */ + if (magic_typedarray) { + no_assert = 0; +#if defined(DUK_USE_INTEGER_LE) + endswap = !duk_to_boolean(ctx, 1); /* 1=little endian */ +#else + endswap = duk_to_boolean(ctx, 1); /* 1=little endian */ +#endif + } else { + no_assert = duk_to_boolean(ctx, (magic_ftype == DUK__FLD_VARINT) ? 2 : 1); +#if defined(DUK_USE_INTEGER_LE) + endswap = magic_bigendian; +#else + endswap = !magic_bigendian; +#endif + } + + /* Offset is coerced first to signed integer range and then to unsigned. + * This ensures we can add a small byte length (1-8) to the offset in + * bound checks and not wrap. + */ + offset_signed = duk_to_int(ctx, 0); + offset = (duk_uint_t) offset_signed; + if (offset_signed < 0) { + goto fail_bounds; + } + + DUK_DDD(DUK_DDDPRINT("readfield, buffer_length=%ld, offset=%ld, no_assert=%d, " + "magic=%04x, magic_fieldtype=%d, magic_bigendian=%d, magic_signed=%d, " + "endswap=%d", + (long) buffer_length, (long) offset, (int) no_assert, + (unsigned int) magic, (int) magic_ftype, (int) (magic_bigendian >> 3), + (int) (magic_signed >> 4), (int) endswap)); + + /* Update 'buffer_length' to be the effective, safe limit which + * takes into account the underlying buffer. This value will be + * potentially invalidated by any side effect. + */ + check_length = DUK_HBUFFEROBJECT_CLAMP_BYTELENGTH(h_this, buffer_length); + DUK_DDD(DUK_DDDPRINT("buffer_length=%ld, check_length=%ld", + (long) buffer_length, (long) check_length)); + + if (h_this->buf) { + buf = DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_this); + } else { + /* neutered, value doesn't matter because check_length is 0. */ + DUK_ASSERT(check_length == 0); + buf = NULL; + } + + switch (magic_ftype) { + case DUK__FLD_8BIT: { + duk_uint8_t tmp; + if (offset + 1U > check_length) { + goto fail_bounds; + } + tmp = buf[offset]; + if (magic_signed) { + duk_push_int(ctx, (duk_int_t) ((duk_int8_t) tmp)); + } else { + duk_push_uint(ctx, (duk_uint_t) tmp); + } + break; + } + case DUK__FLD_16BIT: { + duk_uint16_t tmp; + if (offset + 2U > check_length) { + goto fail_bounds; + } + DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 2); + tmp = du.us[0]; + if (endswap) { + tmp = DUK_BSWAP16(tmp); + } + if (magic_signed) { + duk_push_int(ctx, (duk_int_t) ((duk_int16_t) tmp)); + } else { + duk_push_uint(ctx, (duk_uint_t) tmp); + } + break; + } + case DUK__FLD_32BIT: { + duk_uint32_t tmp; + if (offset + 4U > check_length) { + goto fail_bounds; + } + DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 4); + tmp = du.ui[0]; + if (endswap) { + tmp = DUK_BSWAP32(tmp); + } + if (magic_signed) { + duk_push_int(ctx, (duk_int_t) ((duk_int32_t) tmp)); + } else { + duk_push_uint(ctx, (duk_uint_t) tmp); + } + break; + } + case DUK__FLD_FLOAT: { + duk_uint32_t tmp; + if (offset + 4U > check_length) { + goto fail_bounds; + } + DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 4); + if (endswap) { + tmp = du.ui[0]; + tmp = DUK_BSWAP32(tmp); + du.ui[0] = tmp; + } + duk_push_number(ctx, (duk_double_t) du.f[0]); + break; + } + case DUK__FLD_DOUBLE: { + if (offset + 8U > check_length) { + goto fail_bounds; + } + DUK_MEMCPY((void *) du.uc, (const void *) (buf + offset), 8); + if (endswap) { + DUK_DBLUNION_BSWAP64(&du); + } + duk_push_number(ctx, (duk_double_t) du.d); + break; + } + case DUK__FLD_VARINT: { + /* Node.js Buffer variable width integer field. We don't really + * care about speed here, so aim for shortest algorithm. + */ + duk_int_t field_bytelen; + duk_int_t i, i_step, i_end; +#if defined(DUK_USE_64BIT_OPS) + duk_int64_t tmp; + duk_small_uint_t shift_tmp; +#else + duk_double_t tmp; + duk_small_int_t highbyte; +#endif + const duk_uint8_t *p; + + field_bytelen = duk_get_int(ctx, 1); /* avoid side effects! */ + if (field_bytelen < 1 || field_bytelen > 6) { + goto fail_field_length; + } + if (offset + (duk_uint_t) field_bytelen > check_length) { + goto fail_bounds; + } + p = (const duk_uint8_t *) (buf + offset); + + /* Slow gathering of value using either 64-bit arithmetic + * or IEEE doubles if 64-bit types not available. Handling + * of negative numbers is a bit non-obvious in both cases. + */ + + if (magic_bigendian) { + /* Gather in big endian */ + i = 0; + i_step = 1; + i_end = field_bytelen; /* one i_step over */ + } else { + /* Gather in little endian */ + i = field_bytelen - 1; + i_step = -1; + i_end = -1; /* one i_step over */ + } + +#if defined(DUK_USE_64BIT_OPS) + tmp = 0; + do { + DUK_ASSERT(i >= 0 && i < field_bytelen); + tmp = (tmp << 8) + (duk_int64_t) p[i]; + i += i_step; + } while (i != i_end); + + if (magic_signed) { + /* Shift to sign extend. */ + shift_tmp = 64 - (field_bytelen * 8); + tmp = (tmp << shift_tmp) >> shift_tmp; + } + + duk_push_i64(ctx, tmp); +#else + highbyte = p[i]; + if (magic_signed && (highbyte & 0x80) != 0) { + /* 0xff => 255 - 256 = -1; 0x80 => 128 - 256 = -128 */ + tmp = (duk_double_t) (highbyte - 256); + } else { + tmp = (duk_double_t) highbyte; + } + for (;;) { + i += i_step; + if (i == i_end) { + break; + } + DUK_ASSERT(i >= 0 && i < field_bytelen); + tmp = (tmp * 256.0) + (duk_double_t) p[i]; + } + + duk_push_number(ctx, tmp); +#endif + break; + } + default: { /* should never happen but default here */ + goto fail_bounds; + } + } + + return 1; + + fail_field_length: + fail_bounds: + if (no_assert) { + /* Node.js return value for noAssert out-of-bounds reads is + * usually (but not always) NaN. Return NaN consistently. + */ + duk_push_nan(ctx); + return 1; + } + + return DUK_RET_RANGE_ERROR; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_buffer_readfield(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +#if defined(DUK_USE_BUFFEROBJECT_SUPPORT) +/* XXX: split into separate functions for each field type? */ +DUK_INTERNAL duk_ret_t duk_bi_buffer_writefield(duk_context *ctx) { + duk_hthread *thr; + duk_small_int_t magic = (duk_small_int_t) duk_get_current_magic(ctx); + duk_small_int_t magic_ftype; + duk_small_int_t magic_bigendian; + duk_small_int_t magic_signed; + duk_small_int_t magic_typedarray; + duk_small_int_t endswap; + duk_hbufferobject *h_this; + duk_bool_t no_assert; + duk_int_t offset_signed; + duk_uint_t offset; + duk_uint_t buffer_length; + duk_uint_t check_length; + duk_uint8_t *buf; + duk_double_union du; + duk_int_t nbytes = 0; + + thr = (duk_hthread *) ctx; + DUK_UNREF(thr); + + magic_ftype = magic & 0x0007; + magic_bigendian = magic & 0x0008; + magic_signed = magic & 0x0010; + magic_typedarray = magic & 0x0020; + DUK_UNREF(magic_signed); + + h_this = duk__require_bufobj_this(ctx); + DUK_ASSERT(h_this != NULL); + buffer_length = h_this->length; + + /* [ value offset noAssert ], when ftype != DUK__FLD_VARINT */ + /* [ value offset fieldByteLength noAssert ], when ftype == DUK__FLD_VARINT */ + /* [ offset value littleEndian ], when DUK__FLD_TYPEDARRAY (regardless of ftype) */ + + /* Handle TypedArray vs. Node.js Buffer arg differences */ + if (magic_typedarray) { + no_assert = 0; +#if defined(DUK_USE_INTEGER_LE) + endswap = !duk_to_boolean(ctx, 2); /* 1=little endian */ +#else + endswap = duk_to_boolean(ctx, 2); /* 1=little endian */ +#endif + duk_swap(ctx, 0, 1); /* offset/value order different from Node.js */ + } else { + no_assert = duk_to_boolean(ctx, (magic_ftype == DUK__FLD_VARINT) ? 3 : 2); +#if defined(DUK_USE_INTEGER_LE) + endswap = magic_bigendian; +#else + endswap = !magic_bigendian; +#endif + } + + /* Offset is coerced first to signed integer range and then to unsigned. + * This ensures we can add a small byte length (1-8) to the offset in + * bound checks and not wrap. + */ + offset_signed = duk_to_int(ctx, 1); + offset = (duk_uint_t) offset_signed; + + /* We need 'nbytes' even for a failed offset; return value must be + * (offset + nbytes) even when write fails due to invalid offset. + */ + if (magic_ftype != DUK__FLD_VARINT) { + DUK_ASSERT(magic_ftype >= 0 && magic_ftype < (duk_small_int_t) (sizeof(duk__buffer_nbytes_from_fldtype) / sizeof(duk_uint8_t))); + nbytes = duk__buffer_nbytes_from_fldtype[magic_ftype]; + } else { + nbytes = duk_get_int(ctx, 2); + if (nbytes < 1 || nbytes > 6) { + goto fail_field_length; + } + } + DUK_ASSERT(nbytes >= 1 && nbytes <= 8); + + /* Now we can check offset validity. */ + if (offset_signed < 0) { + goto fail_bounds; + } + + DUK_DDD(DUK_DDDPRINT("writefield, value=%!T, buffer_length=%ld, offset=%ld, no_assert=%d, " + "magic=%04x, magic_fieldtype=%d, magic_bigendian=%d, magic_signed=%d, " + "endswap=%d", + duk_get_tval(ctx, 0), (long) buffer_length, (long) offset, (int) no_assert, + (unsigned int) magic, (int) magic_ftype, (int) (magic_bigendian >> 3), + (int) (magic_signed >> 4), (int) endswap)); + + /* Coerce value to a number before computing check_length, so that + * the field type specific coercion below can't have side effects + * that would invalidate check_length. + */ + duk_to_number(ctx, 0); + + /* Update 'buffer_length' to be the effective, safe limit which + * takes into account the underlying buffer. This value will be + * potentially invalidated by any side effect. + */ + check_length = DUK_HBUFFEROBJECT_CLAMP_BYTELENGTH(h_this, buffer_length); + DUK_DDD(DUK_DDDPRINT("buffer_length=%ld, check_length=%ld", + (long) buffer_length, (long) check_length)); + + if (h_this->buf) { + buf = DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_this); + } else { + /* neutered, value doesn't matter because check_length is 0. */ + DUK_ASSERT(check_length == 0); + buf = NULL; + } + + switch (magic_ftype) { + case DUK__FLD_8BIT: { + if (offset + 1U > check_length) { + goto fail_bounds; + } + /* sign doesn't matter when writing */ + buf[offset] = (duk_uint8_t) duk_to_uint32(ctx, 0); + break; + } + case DUK__FLD_16BIT: { + duk_uint16_t tmp; + if (offset + 2U > check_length) { + goto fail_bounds; + } + tmp = (duk_uint16_t) duk_to_uint32(ctx, 0); + if (endswap) { + tmp = DUK_BSWAP16(tmp); + } + du.us[0] = tmp; + /* sign doesn't matter when writing */ + DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 2); + break; + } + case DUK__FLD_32BIT: { + duk_uint32_t tmp; + if (offset + 4U > check_length) { + goto fail_bounds; + } + tmp = (duk_uint32_t) duk_to_uint32(ctx, 0); + if (endswap) { + tmp = DUK_BSWAP32(tmp); + } + du.ui[0] = tmp; + /* sign doesn't matter when writing */ + DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 4); + break; + } + case DUK__FLD_FLOAT: { + duk_uint32_t tmp; + if (offset + 4U > check_length) { + goto fail_bounds; + } + du.f[0] = (duk_float_t) duk_to_number(ctx, 0); + if (endswap) { + tmp = du.ui[0]; + tmp = DUK_BSWAP32(tmp); + du.ui[0] = tmp; + } + /* sign doesn't matter when writing */ + DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 4); + break; + } + case DUK__FLD_DOUBLE: { + if (offset + 8U > check_length) { + goto fail_bounds; + } + du.d = (duk_double_t) duk_to_number(ctx, 0); + if (endswap) { + DUK_DBLUNION_BSWAP64(&du); + } + /* sign doesn't matter when writing */ + DUK_MEMCPY((void *) (buf + offset), (const void *) du.uc, 8); + break; + } + case DUK__FLD_VARINT: { + /* Node.js Buffer variable width integer field. We don't really + * care about speed here, so aim for shortest algorithm. + */ + duk_int_t field_bytelen; + duk_int_t i, i_step, i_end; +#if defined(DUK_USE_64BIT_OPS) + duk_int64_t tmp; +#else + duk_double_t tmp; +#endif + duk_uint8_t *p; + + field_bytelen = (duk_int_t) nbytes; + if (offset + (duk_uint_t) field_bytelen > check_length) { + goto fail_bounds; + } + + /* Slow writing of value using either 64-bit arithmetic + * or IEEE doubles if 64-bit types not available. There's + * no special sign handling when writing varints. + */ + + if (magic_bigendian) { + /* Write in big endian */ + i = field_bytelen; /* one i_step added at top of loop */ + i_step = -1; + i_end = 0; + } else { + /* Write in little endian */ + i = -1; /* one i_step added at top of loop */ + i_step = 1; + i_end = field_bytelen - 1; + } + + /* XXX: The duk_to_number() cast followed by integer coercion + * is platform specific so NaN, +/- Infinity, and out-of-bounds + * values result in platform specific output now. + * See: test-bi-nodejs-buffer-proto-varint-special.js + */ + +#if defined(DUK_USE_64BIT_OPS) + tmp = (duk_int64_t) duk_to_number(ctx, 0); + p = (duk_uint8_t *) (buf + offset); + do { + i += i_step; + DUK_ASSERT(i >= 0 && i < field_bytelen); + p[i] = (duk_uint8_t) (tmp & 0xff); + tmp = tmp >> 8; /* unnecessary shift for last byte */ + } while (i != i_end); +#else + tmp = duk_to_number(ctx, 0); + p = (duk_uint8_t *) (buf + offset); + do { + i += i_step; + tmp = DUK_FLOOR(tmp); + DUK_ASSERT(i >= 0 && i < field_bytelen); + p[i] = (duk_uint8_t) (DUK_FMOD(tmp, 256.0)); + tmp = tmp / 256.0; /* unnecessary div for last byte */ + } while (i != i_end); +#endif + break; + } + default: { /* should never happen but default here */ + goto fail_bounds; + } + } + + /* Node.js Buffer: return offset + #bytes written (i.e. next + * write offset). + */ + if (magic_typedarray) { + /* For TypedArrays 'undefined' return value is specified + * by ES6 (matches V8). + */ + return 0; + } + duk_push_uint(ctx, offset + nbytes); + return 1; + + fail_field_length: + fail_bounds: + if (no_assert) { + /* Node.js return value for failed writes is offset + #bytes + * that would have been written. + */ + /* XXX: for negative input offsets, 'offset' will be a large + * positive value so the result here is confusing. + */ + if (magic_typedarray) { + return 0; + } + duk_push_uint(ctx, offset + nbytes); + return 1; + } + return DUK_RET_RANGE_ERROR; +} +#else /* DUK_USE_BUFFEROBJECT_SUPPORT */ +DUK_INTERNAL duk_ret_t duk_bi_buffer_writefield(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_BUFFEROBJECT_SUPPORT */ + +#undef DUK__FLD_8BIT +#undef DUK__FLD_16BIT +#undef DUK__FLD_32BIT +#undef DUK__FLD_FLOAT +#undef DUK__FLD_DOUBLE +#undef DUK__FLD_VARINT +#undef DUK__FLD_BIGENDIAN +#undef DUK__FLD_SIGNED +#undef DUK__FLD_TYPEDARRAY diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_date.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_date.c new file mode 100644 index 00000000..d2928476 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_date.c @@ -0,0 +1,1730 @@ +/* + * Date built-ins + * + * Unlike most built-ins, Date has some platform dependencies for getting + * UTC time, converting between UTC and local time, and parsing and + * formatting time values. These are all abstracted behind DUK_USE_xxx + * config options. There are built-in platform specific providers for + * POSIX and Windows, but external providers can also be used. + * + * See doc/datetime.rst. + * + */ + +#include "duk_internal.h" + +/* + * Forward declarations + */ + +DUK_LOCAL_DECL duk_double_t duk__push_this_get_timeval_tzoffset(duk_context *ctx, duk_small_uint_t flags, duk_int_t *out_tzoffset); +DUK_LOCAL_DECL duk_double_t duk__push_this_get_timeval(duk_context *ctx, duk_small_uint_t flags); +DUK_LOCAL_DECL void duk__twodigit_year_fixup(duk_context *ctx, duk_idx_t idx_val); +DUK_LOCAL_DECL duk_ret_t duk__set_this_timeval_from_dparts(duk_context *ctx, duk_double_t *dparts, duk_small_uint_t flags); + +/* + * Other file level defines + */ + +/* Debug macro to print all parts and dparts (used manually because of debug level). */ +#define DUK__DPRINT_PARTS_AND_DPARTS(parts,dparts) do { \ + DUK_D(DUK_DPRINT("parts: %ld %ld %ld %ld %ld %ld %ld %ld, dparts: %lf %lf %lf %lf %lf %lf %lf %lf", \ + (long) (parts)[0], (long) (parts)[1], \ + (long) (parts)[2], (long) (parts)[3], \ + (long) (parts)[4], (long) (parts)[5], \ + (long) (parts)[6], (long) (parts)[7], \ + (double) (dparts)[0], (double) (dparts)[1], \ + (double) (dparts)[2], (double) (dparts)[3], \ + (double) (dparts)[4], (double) (dparts)[5], \ + (double) (dparts)[6], (double) (dparts)[7])); \ + } while (0) +#define DUK__DPRINT_PARTS(parts) do { \ + DUK_D(DUK_DPRINT("parts: %ld %ld %ld %ld %ld %ld %ld %ld", \ + (long) (parts)[0], (long) (parts)[1], \ + (long) (parts)[2], (long) (parts)[3], \ + (long) (parts)[4], (long) (parts)[5], \ + (long) (parts)[6], (long) (parts)[7])); \ + } while (0) +#define DUK__DPRINT_DPARTS(dparts) do { \ + DUK_D(DUK_DPRINT("dparts: %lf %lf %lf %lf %lf %lf %lf %lf", \ + (double) (dparts)[0], (double) (dparts)[1], \ + (double) (dparts)[2], (double) (dparts)[3], \ + (double) (dparts)[4], (double) (dparts)[5], \ + (double) (dparts)[6], (double) (dparts)[7])); \ + } while (0) + +/* Equivalent year for DST calculations outside [1970,2038[ range, see + * E5 Section 15.9.1.8. Equivalent year has the same leap-year-ness and + * starts with the same weekday on Jan 1. + * https://bugzilla.mozilla.org/show_bug.cgi?id=351066 + */ +#define DUK__YEAR(x) ((duk_uint8_t) ((x) - 1970)) +DUK_LOCAL duk_uint8_t duk__date_equivyear[14] = { +#if 1 + /* This is based on V8 EquivalentYear() algorithm (see src/genequivyear.py): + * http://code.google.com/p/v8/source/browse/trunk/src/date.h#146 + */ + + /* non-leap year: sunday, monday, ... */ + DUK__YEAR(2023), DUK__YEAR(2035), DUK__YEAR(2019), DUK__YEAR(2031), + DUK__YEAR(2015), DUK__YEAR(2027), DUK__YEAR(2011), + + /* leap year: sunday, monday, ... */ + DUK__YEAR(2012), DUK__YEAR(2024), DUK__YEAR(2008), DUK__YEAR(2020), + DUK__YEAR(2032), DUK__YEAR(2016), DUK__YEAR(2028) +#endif + +#if 0 + /* This is based on Rhino EquivalentYear() algorithm: + * https://github.com/mozilla/rhino/blob/f99cc11d616f0cdda2c42bde72b3484df6182947/src/org/mozilla/javascript/NativeDate.java + */ + + /* non-leap year: sunday, monday, ... */ + DUK__YEAR(1978), DUK__YEAR(1973), DUK__YEAR(1985), DUK__YEAR(1986), + DUK__YEAR(1981), DUK__YEAR(1971), DUK__YEAR(1977), + + /* leap year: sunday, monday, ... */ + DUK__YEAR(1984), DUK__YEAR(1996), DUK__YEAR(1980), DUK__YEAR(1992), + DUK__YEAR(1976), DUK__YEAR(1988), DUK__YEAR(1972) +#endif +}; +#undef DUK__YEAR + +/* + * ISO 8601 subset parser. + */ + +/* Parser part count. */ +#define DUK__NUM_ISO8601_PARSER_PARTS 9 + +/* Parser part indices. */ +#define DUK__PI_YEAR 0 +#define DUK__PI_MONTH 1 +#define DUK__PI_DAY 2 +#define DUK__PI_HOUR 3 +#define DUK__PI_MINUTE 4 +#define DUK__PI_SECOND 5 +#define DUK__PI_MILLISECOND 6 +#define DUK__PI_TZHOUR 7 +#define DUK__PI_TZMINUTE 8 + +/* Parser part masks. */ +#define DUK__PM_YEAR (1 << DUK__PI_YEAR) +#define DUK__PM_MONTH (1 << DUK__PI_MONTH) +#define DUK__PM_DAY (1 << DUK__PI_DAY) +#define DUK__PM_HOUR (1 << DUK__PI_HOUR) +#define DUK__PM_MINUTE (1 << DUK__PI_MINUTE) +#define DUK__PM_SECOND (1 << DUK__PI_SECOND) +#define DUK__PM_MILLISECOND (1 << DUK__PI_MILLISECOND) +#define DUK__PM_TZHOUR (1 << DUK__PI_TZHOUR) +#define DUK__PM_TZMINUTE (1 << DUK__PI_TZMINUTE) + +/* Parser separator indices. */ +#define DUK__SI_PLUS 0 +#define DUK__SI_MINUS 1 +#define DUK__SI_T 2 +#define DUK__SI_SPACE 3 +#define DUK__SI_COLON 4 +#define DUK__SI_PERIOD 5 +#define DUK__SI_Z 6 +#define DUK__SI_NUL 7 + +/* Parser separator masks. */ +#define DUK__SM_PLUS (1 << DUK__SI_PLUS) +#define DUK__SM_MINUS (1 << DUK__SI_MINUS) +#define DUK__SM_T (1 << DUK__SI_T) +#define DUK__SM_SPACE (1 << DUK__SI_SPACE) +#define DUK__SM_COLON (1 << DUK__SI_COLON) +#define DUK__SM_PERIOD (1 << DUK__SI_PERIOD) +#define DUK__SM_Z (1 << DUK__SI_Z) +#define DUK__SM_NUL (1 << DUK__SI_NUL) + +/* Rule control flags. */ +#define DUK__CF_NEG (1 << 0) /* continue matching, set neg_tzoffset flag */ +#define DUK__CF_ACCEPT (1 << 1) /* accept string */ +#define DUK__CF_ACCEPT_NUL (1 << 2) /* accept string if next char is NUL (otherwise reject) */ + +#define DUK__PACK_RULE(partmask,sepmask,nextpart,flags) \ + ((duk_uint32_t) (partmask) + \ + (((duk_uint32_t) (sepmask)) << 9) + \ + (((duk_uint32_t) (nextpart)) << 17) + \ + (((duk_uint32_t) (flags)) << 21)) + +#define DUK__UNPACK_RULE(rule,var_nextidx,var_flags) do { \ + (var_nextidx) = (duk_small_uint_t) (((rule) >> 17) & 0x0f); \ + (var_flags) = (duk_small_uint_t) ((rule) >> 21); \ + } while (0) + +#define DUK__RULE_MASK_PART_SEP 0x1ffffUL + +/* Matching separator index is used in the control table */ +DUK_LOCAL const duk_uint8_t duk__parse_iso8601_seps[] = { + DUK_ASC_PLUS /*0*/, DUK_ASC_MINUS /*1*/, DUK_ASC_UC_T /*2*/, DUK_ASC_SPACE /*3*/, + DUK_ASC_COLON /*4*/, DUK_ASC_PERIOD /*5*/, DUK_ASC_UC_Z /*6*/, DUK_ASC_NUL /*7*/ +}; + +/* Rule table: first matching rule is used to determine what to do next. */ +DUK_LOCAL const duk_uint32_t duk__parse_iso8601_control[] = { + DUK__PACK_RULE(DUK__PM_YEAR, DUK__SM_MINUS, DUK__PI_MONTH, 0), + DUK__PACK_RULE(DUK__PM_MONTH, DUK__SM_MINUS, DUK__PI_DAY, 0), + DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY, DUK__SM_T | DUK__SM_SPACE, DUK__PI_HOUR, 0), + DUK__PACK_RULE(DUK__PM_HOUR, DUK__SM_COLON, DUK__PI_MINUTE, 0), + DUK__PACK_RULE(DUK__PM_MINUTE, DUK__SM_COLON, DUK__PI_SECOND, 0), + DUK__PACK_RULE(DUK__PM_SECOND, DUK__SM_PERIOD, DUK__PI_MILLISECOND, 0), + DUK__PACK_RULE(DUK__PM_TZHOUR, DUK__SM_COLON, DUK__PI_TZMINUTE, 0), + DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_PLUS, DUK__PI_TZHOUR, 0), + DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_MINUS, DUK__PI_TZHOUR, DUK__CF_NEG), + DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND, DUK__SM_Z, 0, DUK__CF_ACCEPT_NUL), + DUK__PACK_RULE(DUK__PM_YEAR | DUK__PM_MONTH | DUK__PM_DAY | DUK__PM_HOUR /*Note1*/ | DUK__PM_MINUTE | DUK__PM_SECOND | DUK__PM_MILLISECOND | DUK__PM_TZHOUR /*Note2*/ | DUK__PM_TZMINUTE, DUK__SM_NUL, 0, DUK__CF_ACCEPT) + + /* Note1: the specification doesn't require matching a time form with + * just hours ("HH"), but we accept it here, e.g. "2012-01-02T12Z". + * + * Note2: the specification doesn't require matching a timezone offset + * with just hours ("HH"), but accept it here, e.g. "2012-01-02T03:04:05+02" + */ +}; + +DUK_LOCAL duk_bool_t duk__parse_string_iso8601_subset(duk_context *ctx, const char *str) { + duk_int_t parts[DUK__NUM_ISO8601_PARSER_PARTS]; + duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; + duk_double_t d; + const duk_uint8_t *p; + duk_small_uint_t part_idx = 0; + duk_int_t accum = 0; + duk_small_uint_t ndigits = 0; + duk_bool_t neg_year = 0; + duk_bool_t neg_tzoffset = 0; + duk_uint_fast8_t ch; + duk_small_uint_t i; + + /* During parsing, month and day are one-based; set defaults here. */ + DUK_MEMZERO(parts, sizeof(parts)); + DUK_ASSERT(parts[DUK_DATE_IDX_YEAR] == 0); /* don't care value, year is mandatory */ + parts[DUK_DATE_IDX_MONTH] = 1; + parts[DUK_DATE_IDX_DAY] = 1; + + /* Special handling for year sign. */ + p = (const duk_uint8_t *) str; + ch = p[0]; + if (ch == DUK_ASC_PLUS) { + p++; + } else if (ch == DUK_ASC_MINUS) { + neg_year = 1; + p++; + } + + for (;;) { + ch = *p++; + DUK_DDD(DUK_DDDPRINT("parsing, part_idx=%ld, char=%ld ('%c')", + (long) part_idx, (long) ch, + (int) ((ch >= 0x20 && ch <= 0x7e) ? ch : DUK_ASC_QUESTION))); + + if (ch >= DUK_ASC_0 && ch <= DUK_ASC_9) { + if (ndigits >= 9) { + DUK_DDD(DUK_DDDPRINT("too many digits -> reject")); + goto reject; + } + if (part_idx == DUK__PI_MILLISECOND /*msec*/ && ndigits >= 3) { + /* ignore millisecond fractions after 3 */ + } else { + accum = accum * 10 + ((duk_int_t) ch) - ((duk_int_t) DUK_ASC_0) + 0x00; + ndigits++; + } + } else { + duk_uint_fast32_t match_val; + duk_small_int_t sep_idx; + + if (ndigits <= 0) { + goto reject; + } + if (part_idx == DUK__PI_MILLISECOND) { + /* complete the millisecond field */ + while (ndigits < 3) { + accum *= 10; + ndigits++; + } + } + parts[part_idx] = accum; + DUK_DDD(DUK_DDDPRINT("wrote part %ld -> value %ld", (long) part_idx, (long) accum)); + + accum = 0; + ndigits = 0; + + for (i = 0; i < (duk_small_uint_t) (sizeof(duk__parse_iso8601_seps) / sizeof(duk_uint8_t)); i++) { + if (duk__parse_iso8601_seps[i] == ch) { + break; + } + } + if (i == (duk_small_uint_t) (sizeof(duk__parse_iso8601_seps) / sizeof(duk_uint8_t))) { + DUK_DDD(DUK_DDDPRINT("separator character doesn't match -> reject")); + goto reject; + } + + sep_idx = i; + match_val = (1UL << part_idx) + (1UL << (sep_idx + 9)); /* match against rule part/sep bits */ + + for (i = 0; i < (duk_small_uint_t) (sizeof(duk__parse_iso8601_control) / sizeof(duk_uint32_t)); i++) { + duk_uint_fast32_t rule = duk__parse_iso8601_control[i]; + duk_small_uint_t nextpart; + duk_small_uint_t cflags; + + DUK_DDD(DUK_DDDPRINT("part_idx=%ld, sep_idx=%ld, match_val=0x%08lx, considering rule=0x%08lx", + (long) part_idx, (long) sep_idx, + (unsigned long) match_val, (unsigned long) rule)); + + if ((rule & match_val) != match_val) { + continue; + } + + DUK__UNPACK_RULE(rule, nextpart, cflags); + + DUK_DDD(DUK_DDDPRINT("rule match -> part_idx=%ld, sep_idx=%ld, match_val=0x%08lx, " + "rule=0x%08lx -> nextpart=%ld, cflags=0x%02lx", + (long) part_idx, (long) sep_idx, + (unsigned long) match_val, (unsigned long) rule, + (long) nextpart, (unsigned long) cflags)); + + if (cflags & DUK__CF_NEG) { + neg_tzoffset = 1; + } + + if (cflags & DUK__CF_ACCEPT) { + goto accept; + } + + if (cflags & DUK__CF_ACCEPT_NUL) { + DUK_ASSERT(*(p - 1) != (char) 0); + if (*p == DUK_ASC_NUL) { + goto accept; + } + goto reject; + } + + part_idx = nextpart; + break; + } /* rule match */ + + if (i == (duk_small_uint_t) (sizeof(duk__parse_iso8601_control) / sizeof(duk_uint32_t))) { + DUK_DDD(DUK_DDDPRINT("no rule matches -> reject")); + goto reject; + } + + if (ch == 0) { + /* This shouldn't be necessary, but check just in case + * to avoid any chance of overruns. + */ + DUK_DDD(DUK_DDDPRINT("NUL after rule matching (should not happen) -> reject")); + goto reject; + } + } /* if-digit-else-ctrl */ + } /* char loop */ + + /* We should never exit the loop above, but if we do, reject + * by falling through. + */ + DUK_DDD(DUK_DDDPRINT("fell out of char loop without explicit accept/reject -> reject")); + + reject: + DUK_DDD(DUK_DDDPRINT("reject")); + return 0; + + accept: + DUK_DDD(DUK_DDDPRINT("accept")); + + /* Apply timezone offset to get the main parts in UTC */ + if (neg_year) { + parts[DUK__PI_YEAR] = -parts[DUK__PI_YEAR]; + } + if (neg_tzoffset) { + parts[DUK__PI_HOUR] += parts[DUK__PI_TZHOUR]; + parts[DUK__PI_MINUTE] += parts[DUK__PI_TZMINUTE]; + } else { + parts[DUK__PI_HOUR] -= parts[DUK__PI_TZHOUR]; + parts[DUK__PI_MINUTE] -= parts[DUK__PI_TZMINUTE]; + } + parts[DUK__PI_MONTH] -= 1; /* zero-based month */ + parts[DUK__PI_DAY] -= 1; /* zero-based day */ + + /* Use double parts, they tolerate unnormalized time. + * + * Note: DUK_DATE_IDX_WEEKDAY is initialized with a bogus value (DUK__PI_TZHOUR) + * on purpose. It won't be actually used by duk_bi_date_get_timeval_from_dparts(), + * but will make the value initialized just in case, and avoid any + * potential for Valgrind issues. + */ + for (i = 0; i < DUK_DATE_IDX_NUM_PARTS; i++) { + DUK_DDD(DUK_DDDPRINT("part[%ld] = %ld", (long) i, (long) parts[i])); + dparts[i] = parts[i]; + } + + d = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/); + duk_push_number(ctx, d); + return 1; +} + +/* + * Date/time parsing helper. + * + * Parse a datetime string into a time value. We must first try to parse + * the input according to the standard format in E5.1 Section 15.9.1.15. + * If that fails, we can try to parse using custom parsing, which can + * either be platform neutral (custom code) or platform specific (using + * existing platform API calls). + * + * Note in particular that we must parse whatever toString(), toUTCString(), + * and toISOString() can produce; see E5.1 Section 15.9.4.2. + * + * Returns 1 to allow tail calling. + * + * There is much room for improvement here with respect to supporting + * alternative datetime formats. For instance, V8 parses '2012-01-01' as + * UTC and '2012/01/01' as local time. + */ + +DUK_LOCAL duk_ret_t duk__parse_string(duk_context *ctx, const char *str) { + /* XXX: there is a small risk here: because the ISO 8601 parser is + * very loose, it may end up parsing some datetime values which + * would be better parsed with a platform specific parser. + */ + + DUK_ASSERT(str != NULL); + DUK_DDD(DUK_DDDPRINT("parse datetime from string '%s'", (const char *) str)); + + if (duk__parse_string_iso8601_subset(ctx, str) != 0) { + return 1; + } + +#if defined(DUK_USE_DATE_PARSE_STRING) + /* Contract, either: + * - Push value on stack and return 1 + * - Don't push anything on stack and return 0 + */ + + if (DUK_USE_DATE_PARSE_STRING(ctx, str) != 0) { + return 1; + } +#else + /* No platform-specific parsing, this is not an error. */ +#endif + + duk_push_nan(ctx); + return 1; +} + +/* + * Calendar helpers + * + * Some helpers are used for getters and can operate on normalized values + * which can be represented with 32-bit signed integers. Other helpers are + * needed by setters and operate on un-normalized double values, must watch + * out for non-finite numbers etc. + */ + +DUK_LOCAL duk_uint8_t duk__days_in_month[12] = { + (duk_uint8_t) 31, (duk_uint8_t) 28, (duk_uint8_t) 31, (duk_uint8_t) 30, + (duk_uint8_t) 31, (duk_uint8_t) 30, (duk_uint8_t) 31, (duk_uint8_t) 31, + (duk_uint8_t) 30, (duk_uint8_t) 31, (duk_uint8_t) 30, (duk_uint8_t) 31 +}; + +/* Maximum iteration count for computing UTC-to-local time offset when + * creating an Ecmascript time value from local parts. + */ +#define DUK__LOCAL_TZOFFSET_MAXITER 4 + +/* Because 'day since epoch' can be negative and is used to compute weekday + * using a modulo operation, add this multiple of 7 to avoid negative values + * when year is below 1970 epoch. Ecmascript time values are restricted to + * +/- 100 million days from epoch, so this adder fits nicely into 32 bits. + * Round to a multiple of 7 (= floor(100000000 / 7) * 7) and add margin. + */ +#define DUK__WEEKDAY_MOD_ADDER (20000000 * 7) /* 0x08583b00 */ + +DUK_INTERNAL duk_bool_t duk_bi_date_is_leap_year(duk_int_t year) { + if ((year % 4) != 0) { + return 0; + } + if ((year % 100) != 0) { + return 1; + } + if ((year % 400) != 0) { + return 0; + } + return 1; +} + +DUK_INTERNAL duk_bool_t duk_bi_date_timeval_in_valid_range(duk_double_t x) { + return (x >= -DUK_DATE_MSEC_100M_DAYS && x <= DUK_DATE_MSEC_100M_DAYS); +} + +DUK_INTERNAL duk_bool_t duk_bi_date_timeval_in_leeway_range(duk_double_t x) { + return (x >= -DUK_DATE_MSEC_100M_DAYS_LEEWAY && x <= DUK_DATE_MSEC_100M_DAYS_LEEWAY); +} + +DUK_INTERNAL duk_bool_t duk_bi_date_year_in_valid_range(duk_double_t x) { + return (x >= DUK_DATE_MIN_ECMA_YEAR && x <= DUK_DATE_MAX_ECMA_YEAR); +} + +DUK_LOCAL duk_double_t duk__timeclip(duk_double_t x) { + if (!DUK_ISFINITE(x)) { + return DUK_DOUBLE_NAN; + } + + if (!duk_bi_date_timeval_in_valid_range(x)) { + return DUK_DOUBLE_NAN; + } + + x = duk_js_tointeger_number(x); + + /* Here we'd have the option to normalize -0 to +0. */ + return x; +} + +/* Integer division which floors also negative values correctly. */ +DUK_LOCAL duk_int_t duk__div_floor(duk_int_t a, duk_int_t b) { + DUK_ASSERT(b > 0); + if (a >= 0) { + return a / b; + } else { + /* e.g. a = -4, b = 5 --> -4 - 5 + 1 / 5 --> -8 / 5 --> -1 + * a = -5, b = 5 --> -5 - 5 + 1 / 5 --> -9 / 5 --> -1 + * a = -6, b = 5 --> -6 - 5 + 1 / 5 --> -10 / 5 --> -2 + */ + return (a - b + 1) / b; + } +} + +/* Compute day number of the first day of a given year. */ +DUK_LOCAL duk_int_t duk__day_from_year(duk_int_t year) { + /* Note: in integer arithmetic, (x / 4) is same as floor(x / 4) for non-negative + * values, but is incorrect for negative ones. + */ + return 365 * (year - 1970) + + duk__div_floor(year - 1969, 4) + - duk__div_floor(year - 1901, 100) + + duk__div_floor(year - 1601, 400); +} + +/* Given a day number, determine year and day-within-year. */ +DUK_LOCAL duk_int_t duk__year_from_day(duk_int_t day, duk_small_int_t *out_day_within_year) { + duk_int_t year; + duk_int_t diff_days; + + /* estimate year upwards (towards positive infinity), then back down; + * two iterations should be enough + */ + + if (day >= 0) { + year = 1970 + day / 365; + } else { + year = 1970 + day / 366; + } + + for (;;) { + diff_days = duk__day_from_year(year) - day; + DUK_DDD(DUK_DDDPRINT("year=%ld day=%ld, diff_days=%ld", (long) year, (long) day, (long) diff_days)); + if (diff_days <= 0) { + DUK_ASSERT(-diff_days < 366); /* fits into duk_small_int_t */ + *out_day_within_year = -diff_days; + DUK_DDD(DUK_DDDPRINT("--> year=%ld, day-within-year=%ld", + (long) year, (long) *out_day_within_year)); + DUK_ASSERT(*out_day_within_year >= 0); + DUK_ASSERT(*out_day_within_year < (duk_bi_date_is_leap_year(year) ? 366 : 365)); + return year; + } + + /* Note: this is very tricky; we must never 'overshoot' the + * correction downwards. + */ + year -= 1 + (diff_days - 1) / 366; /* conservative */ + } +} + +/* Given a (year, month, day-within-month) triple, compute day number. + * The input triple is un-normalized and may contain non-finite values. + */ +DUK_LOCAL duk_double_t duk__make_day(duk_double_t year, duk_double_t month, duk_double_t day) { + duk_int_t day_num; + duk_bool_t is_leap; + duk_small_int_t i, n; + + /* Assume that year, month, day are all coerced to whole numbers. + * They may also be NaN or infinity, in which case this function + * must return NaN or infinity to ensure time value becomes NaN. + * If 'day' is NaN, the final return will end up returning a NaN, + * so it doesn't need to be checked here. + */ + + if (!DUK_ISFINITE(year) || !DUK_ISFINITE(month)) { + return DUK_DOUBLE_NAN; + } + + year += DUK_FLOOR(month / 12.0); + + month = DUK_FMOD(month, 12.0); + if (month < 0.0) { + /* handle negative values */ + month += 12.0; + } + + /* The algorithm in E5.1 Section 15.9.1.12 normalizes month, but + * does not normalize the day-of-month (nor check whether or not + * it is finite) because it's not necessary for finding the day + * number which matches the (year,month) pair. + * + * We assume that duk__day_from_year() is exact here. + * + * Without an explicit infinity / NaN check in the beginning, + * day_num would be a bogus integer here. + * + * It's possible for 'year' to be out of integer range here. + * If so, we need to return NaN without integer overflow. + * This fixes test-bug-setyear-overflow.js. + */ + + if (!duk_bi_date_year_in_valid_range(year)) { + DUK_DD(DUK_DDPRINT("year not in ecmascript valid range, avoid integer overflow: %lf", (double) year)); + return DUK_DOUBLE_NAN; + } + day_num = duk__day_from_year((duk_int_t) year); + is_leap = duk_bi_date_is_leap_year((duk_int_t) year); + + n = (duk_small_int_t) month; + for (i = 0; i < n; i++) { + day_num += duk__days_in_month[i]; + if (i == 1 && is_leap) { + day_num++; + } + } + + /* If 'day' is NaN, returns NaN. */ + return (duk_double_t) day_num + day; +} + +/* Split time value into parts. The time value is assumed to be an internal + * one, i.e. finite, no fractions. Possible local time adjustment has already + * been applied when reading the time value. + */ +DUK_INTERNAL void duk_bi_date_timeval_to_parts(duk_double_t d, duk_int_t *parts, duk_double_t *dparts, duk_small_uint_t flags) { + duk_double_t d1, d2; + duk_int_t t1, t2; + duk_int_t day_since_epoch; + duk_int_t year; /* does not fit into 16 bits */ + duk_small_int_t day_in_year; + duk_small_int_t month; + duk_small_int_t day; + duk_small_int_t dim; + duk_int_t jan1_since_epoch; + duk_small_int_t jan1_weekday; + duk_int_t equiv_year; + duk_small_uint_t i; + duk_bool_t is_leap; + duk_small_int_t arridx; + + DUK_ASSERT(DUK_ISFINITE(d)); /* caller checks */ + DUK_ASSERT(DUK_FLOOR(d) == d); /* no fractions in internal time */ + + /* The timevalue must be in valid Ecmascript range, but since a local + * time offset can be applied, we need to allow a +/- 24h leeway to + * the value. In other words, although the UTC time is within the + * Ecmascript range, the local part values can be just outside of it. + */ + DUK_UNREF(duk_bi_date_timeval_in_leeway_range); + DUK_ASSERT(duk_bi_date_timeval_in_leeway_range(d)); + + /* these computations are guaranteed to be exact for the valid + * E5 time value range, assuming milliseconds without fractions. + */ + d1 = (duk_double_t) DUK_FMOD(d, (double) DUK_DATE_MSEC_DAY); + if (d1 < 0.0) { + /* deal with negative values */ + d1 += (duk_double_t) DUK_DATE_MSEC_DAY; + } + d2 = DUK_FLOOR((double) (d / (duk_double_t) DUK_DATE_MSEC_DAY)); + DUK_ASSERT(d2 * ((duk_double_t) DUK_DATE_MSEC_DAY) + d1 == d); + /* now expected to fit into a 32-bit integer */ + t1 = (duk_int_t) d1; + t2 = (duk_int_t) d2; + day_since_epoch = t2; + DUK_ASSERT((duk_double_t) t1 == d1); + DUK_ASSERT((duk_double_t) t2 == d2); + + /* t1 = milliseconds within day (fits 32 bit) + * t2 = day number from epoch (fits 32 bit, may be negative) + */ + + parts[DUK_DATE_IDX_MILLISECOND] = t1 % 1000; t1 /= 1000; + parts[DUK_DATE_IDX_SECOND] = t1 % 60; t1 /= 60; + parts[DUK_DATE_IDX_MINUTE] = t1 % 60; t1 /= 60; + parts[DUK_DATE_IDX_HOUR] = t1; + DUK_ASSERT(parts[DUK_DATE_IDX_MILLISECOND] >= 0 && parts[DUK_DATE_IDX_MILLISECOND] <= 999); + DUK_ASSERT(parts[DUK_DATE_IDX_SECOND] >= 0 && parts[DUK_DATE_IDX_SECOND] <= 59); + DUK_ASSERT(parts[DUK_DATE_IDX_MINUTE] >= 0 && parts[DUK_DATE_IDX_MINUTE] <= 59); + DUK_ASSERT(parts[DUK_DATE_IDX_HOUR] >= 0 && parts[DUK_DATE_IDX_HOUR] <= 23); + + DUK_DDD(DUK_DDDPRINT("d=%lf, d1=%lf, d2=%lf, t1=%ld, t2=%ld, parts: hour=%ld min=%ld sec=%ld msec=%ld", + (double) d, (double) d1, (double) d2, (long) t1, (long) t2, + (long) parts[DUK_DATE_IDX_HOUR], + (long) parts[DUK_DATE_IDX_MINUTE], + (long) parts[DUK_DATE_IDX_SECOND], + (long) parts[DUK_DATE_IDX_MILLISECOND])); + + /* This assert depends on the input parts representing time inside + * the Ecmascript range. + */ + DUK_ASSERT(t2 + DUK__WEEKDAY_MOD_ADDER >= 0); + parts[DUK_DATE_IDX_WEEKDAY] = (t2 + 4 + DUK__WEEKDAY_MOD_ADDER) % 7; /* E5.1 Section 15.9.1.6 */ + DUK_ASSERT(parts[DUK_DATE_IDX_WEEKDAY] >= 0 && parts[DUK_DATE_IDX_WEEKDAY] <= 6); + + year = duk__year_from_day(t2, &day_in_year); + day = day_in_year; + is_leap = duk_bi_date_is_leap_year(year); + for (month = 0; month < 12; month++) { + dim = duk__days_in_month[month]; + if (month == 1 && is_leap) { + dim++; + } + DUK_DDD(DUK_DDDPRINT("month=%ld, dim=%ld, day=%ld", + (long) month, (long) dim, (long) day)); + if (day < dim) { + break; + } + day -= dim; + } + DUK_DDD(DUK_DDDPRINT("final month=%ld", (long) month)); + DUK_ASSERT(month >= 0 && month <= 11); + DUK_ASSERT(day >= 0 && day <= 31); + + /* Equivalent year mapping, used to avoid DST trouble when platform + * may fail to provide reasonable DST answers for dates outside the + * ordinary range (e.g. 1970-2038). An equivalent year has the same + * leap-year-ness as the original year and begins on the same weekday + * (Jan 1). + * + * The year 2038 is avoided because there seem to be problems with it + * on some platforms. The year 1970 is also avoided as there were + * practical problems with it; an equivalent year is used for it too, + * which breaks some DST computations for 1970 right now, see e.g. + * test-bi-date-tzoffset-brute-fi.js. + */ + if ((flags & DUK_DATE_FLAG_EQUIVYEAR) && (year < 1971 || year > 2037)) { + DUK_ASSERT(is_leap == 0 || is_leap == 1); + + jan1_since_epoch = day_since_epoch - day_in_year; /* day number for Jan 1 since epoch */ + DUK_ASSERT(jan1_since_epoch + DUK__WEEKDAY_MOD_ADDER >= 0); + jan1_weekday = (jan1_since_epoch + 4 + DUK__WEEKDAY_MOD_ADDER) % 7; /* E5.1 Section 15.9.1.6 */ + DUK_ASSERT(jan1_weekday >= 0 && jan1_weekday <= 6); + arridx = jan1_weekday; + if (is_leap) { + arridx += 7; + } + DUK_ASSERT(arridx >= 0 && arridx < (duk_small_int_t) (sizeof(duk__date_equivyear) / sizeof(duk_uint8_t))); + + equiv_year = (duk_int_t) duk__date_equivyear[arridx] + 1970; + year = equiv_year; + DUK_DDD(DUK_DDDPRINT("equiv year mapping, year=%ld, day_in_year=%ld, day_since_epoch=%ld, " + "jan1_since_epoch=%ld, jan1_weekday=%ld -> equiv year %ld", + (long) year, (long) day_in_year, (long) day_since_epoch, + (long) jan1_since_epoch, (long) jan1_weekday, (long) equiv_year)); + } + + parts[DUK_DATE_IDX_YEAR] = year; + parts[DUK_DATE_IDX_MONTH] = month; + parts[DUK_DATE_IDX_DAY] = day; + + if (flags & DUK_DATE_FLAG_ONEBASED) { + parts[DUK_DATE_IDX_MONTH]++; /* zero-based -> one-based */ + parts[DUK_DATE_IDX_DAY]++; /* -""- */ + } + + if (dparts != NULL) { + for (i = 0; i < DUK_DATE_IDX_NUM_PARTS; i++) { + dparts[i] = (duk_double_t) parts[i]; + } + } +} + +/* Compute time value from (double) parts. The parts can be either UTC + * or local time; if local, they need to be (conceptually) converted into + * UTC time. The parts may represent valid or invalid time, and may be + * wildly out of range (but may cancel each other and still come out in + * the valid Date range). + */ +DUK_INTERNAL duk_double_t duk_bi_date_get_timeval_from_dparts(duk_double_t *dparts, duk_small_uint_t flags) { +#if defined(DUK_USE_PARANOID_DATE_COMPUTATION) + /* See comments below on MakeTime why these are volatile. */ + volatile duk_double_t tmp_time; + volatile duk_double_t tmp_day; + volatile duk_double_t d; +#else + duk_double_t tmp_time; + duk_double_t tmp_day; + duk_double_t d; +#endif + duk_small_uint_t i; + duk_int_t tzoff, tzoffprev1, tzoffprev2; + + /* Expects 'this' at top of stack on entry. */ + + /* Coerce all finite parts with ToInteger(). ToInteger() must not + * be called for NaN/Infinity because it will convert e.g. NaN to + * zero. If ToInteger() has already been called, this has no side + * effects and is idempotent. + * + * Don't read dparts[DUK_DATE_IDX_WEEKDAY]; it will cause Valgrind + * issues if the value is uninitialized. + */ + for (i = 0; i <= DUK_DATE_IDX_MILLISECOND; i++) { + /* SCANBUILD: scan-build complains here about assigned value + * being garbage or undefined. This is correct but operating + * on undefined values has no ill effect and is ignored by the + * caller in the case where this happens. + */ + d = dparts[i]; + if (DUK_ISFINITE(d)) { + dparts[i] = duk_js_tointeger_number(d); + } + } + + /* Use explicit steps in computation to try to ensure that + * computation happens with intermediate results coerced to + * double values (instead of using something more accurate). + * E.g. E5.1 Section 15.9.1.11 requires use of IEEE 754 + * rules (= Ecmascript '+' and '*' operators). + * + * Without 'volatile' even this approach fails on some platform + * and compiler combinations. For instance, gcc 4.8.1 on Ubuntu + * 64-bit, with -m32 and without -std=c99, test-bi-date-canceling.js + * would fail because of some optimizations when computing tmp_time + * (MakeTime below). Adding 'volatile' to tmp_time solved this + * particular problem (annoyingly, also adding debug prints or + * running the executable under valgrind hides it). + */ + + /* MakeTime */ + tmp_time = 0.0; + tmp_time += dparts[DUK_DATE_IDX_HOUR] * ((duk_double_t) DUK_DATE_MSEC_HOUR); + tmp_time += dparts[DUK_DATE_IDX_MINUTE] * ((duk_double_t) DUK_DATE_MSEC_MINUTE); + tmp_time += dparts[DUK_DATE_IDX_SECOND] * ((duk_double_t) DUK_DATE_MSEC_SECOND); + tmp_time += dparts[DUK_DATE_IDX_MILLISECOND]; + + /* MakeDay */ + tmp_day = duk__make_day(dparts[DUK_DATE_IDX_YEAR], dparts[DUK_DATE_IDX_MONTH], dparts[DUK_DATE_IDX_DAY]); + + /* MakeDate */ + d = tmp_day * ((duk_double_t) DUK_DATE_MSEC_DAY) + tmp_time; + + DUK_DDD(DUK_DDDPRINT("time=%lf day=%lf --> timeval=%lf", + (double) tmp_time, (double) tmp_day, (double) d)); + + /* Optional UTC conversion. */ + if (flags & DUK_DATE_FLAG_LOCALTIME) { + /* DUK_USE_DATE_GET_LOCAL_TZOFFSET() needs to be called with a + * time value computed from UTC parts. At this point we only + * have 'd' which is a time value computed from local parts, so + * it is off by the UTC-to-local time offset which we don't know + * yet. The current solution for computing the UTC-to-local + * time offset is to iterate a few times and detect a fixed + * point or a two-cycle loop (or a sanity iteration limit), + * see test-bi-date-local-parts.js and test-bi-date-tzoffset-basic-fi.js. + * + * E5.1 Section 15.9.1.9: + * UTC(t) = t - LocalTZA - DaylightSavingTA(t - LocalTZA) + * + * For NaN/inf, DUK_USE_DATE_GET_LOCAL_TZOFFSET() returns 0. + */ + +#if 0 + /* Old solution: don't iterate, incorrect */ + tzoff = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d); + DUK_DDD(DUK_DDDPRINT("tzoffset w/o iteration, tzoff=%ld", (long) tzoff)); + d -= tzoff * 1000L; + DUK_UNREF(tzoffprev1); + DUK_UNREF(tzoffprev2); +#endif + + /* Iteration solution */ + tzoff = 0; + tzoffprev1 = 999999999L; /* invalid value which never matches */ + for (i = 0; i < DUK__LOCAL_TZOFFSET_MAXITER; i++) { + tzoffprev2 = tzoffprev1; + tzoffprev1 = tzoff; + tzoff = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d - tzoff * 1000L); + DUK_DDD(DUK_DDDPRINT("tzoffset iteration, i=%d, tzoff=%ld, tzoffprev1=%ld tzoffprev2=%ld", + (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2)); + if (tzoff == tzoffprev1) { + DUK_DDD(DUK_DDDPRINT("tzoffset iteration finished, i=%d, tzoff=%ld, tzoffprev1=%ld, tzoffprev2=%ld", + (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2)); + break; + } else if (tzoff == tzoffprev2) { + /* Two value cycle, see e.g. test-bi-date-tzoffset-basic-fi.js. + * In these cases, favor a higher tzoffset to get a consistent + * result which is independent of iteration count. Not sure if + * this is a generically correct solution. + */ + DUK_DDD(DUK_DDDPRINT("tzoffset iteration two-value cycle, i=%d, tzoff=%ld, tzoffprev1=%ld, tzoffprev2=%ld", + (int) i, (long) tzoff, (long) tzoffprev1, (long) tzoffprev2)); + if (tzoffprev1 > tzoff) { + tzoff = tzoffprev1; + } + break; + } + } + DUK_DDD(DUK_DDDPRINT("tzoffset iteration, tzoff=%ld", (long) tzoff)); + d -= tzoff * 1000L; + } + + /* TimeClip(), which also handles Infinity -> NaN conversion */ + d = duk__timeclip(d); + + return d; +} + +/* + * API oriented helpers + */ + +/* Push 'this' binding, check that it is a Date object; then push the + * internal time value. At the end, stack is: [ ... this timeval ]. + * Returns the time value. Local time adjustment is done if requested. + */ +DUK_LOCAL duk_double_t duk__push_this_get_timeval_tzoffset(duk_context *ctx, duk_small_uint_t flags, duk_int_t *out_tzoffset) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *h; + duk_double_t d; + duk_int_t tzoffset = 0; + + duk_push_this(ctx); + h = duk_get_hobject(ctx, -1); /* XXX: getter with class check, useful in built-ins */ + if (h == NULL || DUK_HOBJECT_GET_CLASS_NUMBER(h) != DUK_HOBJECT_CLASS_DATE) { + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, "expected Date"); + } + + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_INT_VALUE); + d = duk_to_number(ctx, -1); + duk_pop(ctx); + + if (DUK_ISNAN(d)) { + if (flags & DUK_DATE_FLAG_NAN_TO_ZERO) { + d = 0.0; + } + if (flags & DUK_DATE_FLAG_NAN_TO_RANGE_ERROR) { + DUK_ERROR(thr, DUK_ERR_RANGE_ERROR, "Invalid Date"); + } + } + /* if no NaN handling flag, may still be NaN here, but not Inf */ + DUK_ASSERT(!DUK_ISINF(d)); + + if (flags & DUK_DATE_FLAG_LOCALTIME) { + /* Note: DST adjustment is determined using UTC time. + * If 'd' is NaN, tzoffset will be 0. + */ + tzoffset = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d); /* seconds */ + d += tzoffset * 1000L; + } + if (out_tzoffset) { + *out_tzoffset = tzoffset; + } + + /* [ ... this ] */ + return d; +} + +DUK_LOCAL duk_double_t duk__push_this_get_timeval(duk_context *ctx, duk_small_uint_t flags) { + return duk__push_this_get_timeval_tzoffset(ctx, flags, NULL); +} + +/* Set timeval to 'this' from dparts, push the new time value onto the + * value stack and return 1 (caller can then tail call us). Expects + * the value stack to contain 'this' on the stack top. + */ +DUK_LOCAL duk_ret_t duk__set_this_timeval_from_dparts(duk_context *ctx, duk_double_t *dparts, duk_small_uint_t flags) { + duk_double_t d; + + /* [ ... this ] */ + + d = duk_bi_date_get_timeval_from_dparts(dparts, flags); + duk_push_number(ctx, d); /* -> [ ... this timeval_new ] */ + duk_dup_top(ctx); /* -> [ ... this timeval_new timeval_new ] */ + duk_put_prop_stridx(ctx, -3, DUK_STRIDX_INT_VALUE); + + /* stack top: new time value, return 1 to allow tail calls */ + return 1; +} + +/* 'out_buf' must be at least DUK_BI_DATE_ISO8601_BUFSIZE long. */ +DUK_LOCAL void duk__format_parts_iso8601(duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags, duk_uint8_t *out_buf) { + char yearstr[8]; /* "-123456\0" */ + char tzstr[8]; /* "+11:22\0" */ + char sep = (flags & DUK_DATE_FLAG_SEP_T) ? DUK_ASC_UC_T : DUK_ASC_SPACE; + + DUK_ASSERT(parts[DUK_DATE_IDX_MONTH] >= 1 && parts[DUK_DATE_IDX_MONTH] <= 12); + DUK_ASSERT(parts[DUK_DATE_IDX_DAY] >= 1 && parts[DUK_DATE_IDX_DAY] <= 31); + DUK_ASSERT(parts[DUK_DATE_IDX_YEAR] >= -999999 && parts[DUK_DATE_IDX_YEAR] <= 999999); + + /* Note: %06d for positive value, %07d for negative value to include + * sign and 6 digits. + */ + DUK_SNPRINTF(yearstr, + sizeof(yearstr), + (parts[DUK_DATE_IDX_YEAR] >= 0 && parts[DUK_DATE_IDX_YEAR] <= 9999) ? "%04ld" : + ((parts[DUK_DATE_IDX_YEAR] >= 0) ? "+%06ld" : "%07ld"), + (long) parts[DUK_DATE_IDX_YEAR]); + yearstr[sizeof(yearstr) - 1] = (char) 0; + + if (flags & DUK_DATE_FLAG_LOCALTIME) { + /* tzoffset seconds are dropped; 16 bits suffice for + * time offset in minutes + */ + if (tzoffset >= 0) { + duk_small_int_t tmp = tzoffset / 60; + DUK_SNPRINTF(tzstr, sizeof(tzstr), "+%02d:%02d", (int) (tmp / 60), (int) (tmp % 60)); + } else { + duk_small_int_t tmp = -tzoffset / 60; + DUK_SNPRINTF(tzstr, sizeof(tzstr), "-%02d:%02d", (int) (tmp / 60), (int) (tmp % 60)); + } + tzstr[sizeof(tzstr) - 1] = (char) 0; + } else { + tzstr[0] = DUK_ASC_UC_Z; + tzstr[1] = (char) 0; + } + + /* Unlike year, the other parts fit into 16 bits so %d format + * is portable. + */ + if ((flags & DUK_DATE_FLAG_TOSTRING_DATE) && (flags & DUK_DATE_FLAG_TOSTRING_TIME)) { + DUK_SPRINTF((char *) out_buf, "%s-%02d-%02d%c%02d:%02d:%02d.%03d%s", + (const char *) yearstr, (int) parts[DUK_DATE_IDX_MONTH], (int) parts[DUK_DATE_IDX_DAY], (int) sep, + (int) parts[DUK_DATE_IDX_HOUR], (int) parts[DUK_DATE_IDX_MINUTE], + (int) parts[DUK_DATE_IDX_SECOND], (int) parts[DUK_DATE_IDX_MILLISECOND], (const char *) tzstr); + } else if (flags & DUK_DATE_FLAG_TOSTRING_DATE) { + DUK_SPRINTF((char *) out_buf, "%s-%02d-%02d", + (const char *) yearstr, (int) parts[DUK_DATE_IDX_MONTH], (int) parts[DUK_DATE_IDX_DAY]); + } else { + DUK_ASSERT(flags & DUK_DATE_FLAG_TOSTRING_TIME); + DUK_SPRINTF((char *) out_buf, "%02d:%02d:%02d.%03d%s", + (int) parts[DUK_DATE_IDX_HOUR], (int) parts[DUK_DATE_IDX_MINUTE], + (int) parts[DUK_DATE_IDX_SECOND], (int) parts[DUK_DATE_IDX_MILLISECOND], + (const char *) tzstr); + } +} + +/* Helper for string conversion calls: check 'this' binding, get the + * internal time value, and format date and/or time in a few formats. + * Return value allows tail calls. + */ +DUK_LOCAL duk_ret_t duk__to_string_helper(duk_context *ctx, duk_small_uint_t flags) { + duk_double_t d; + duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; + duk_int_t tzoffset; /* seconds, doesn't fit into 16 bits */ + duk_bool_t rc; + duk_uint8_t buf[DUK_BI_DATE_ISO8601_BUFSIZE]; + + DUK_UNREF(rc); /* unreferenced with some options */ + + d = duk__push_this_get_timeval_tzoffset(ctx, flags, &tzoffset); + if (DUK_ISNAN(d)) { + duk_push_hstring_stridx(ctx, DUK_STRIDX_INVALID_DATE); + return 1; + } + DUK_ASSERT(DUK_ISFINITE(d)); + + /* formatters always get one-based month/day-of-month */ + duk_bi_date_timeval_to_parts(d, parts, NULL, DUK_DATE_FLAG_ONEBASED); + DUK_ASSERT(parts[DUK_DATE_IDX_MONTH] >= 1 && parts[DUK_DATE_IDX_MONTH] <= 12); + DUK_ASSERT(parts[DUK_DATE_IDX_DAY] >= 1 && parts[DUK_DATE_IDX_DAY] <= 31); + + if (flags & DUK_DATE_FLAG_TOSTRING_LOCALE) { + /* try locale specific formatter; if it refuses to format the + * string, fall back to an ISO 8601 formatted value in local + * time. + */ +#if defined(DUK_USE_DATE_FORMAT_STRING) + /* Contract, either: + * - Push string to value stack and return 1 + * - Don't push anything and return 0 + */ + + rc = DUK_USE_DATE_FORMAT_STRING(ctx, parts, tzoffset, flags); + if (rc != 0) { + return 1; + } +#else + /* No locale specific formatter; this is OK, we fall back + * to ISO 8601. + */ +#endif + } + + /* Different calling convention than above used because the helper + * is shared. + */ + duk__format_parts_iso8601(parts, tzoffset, flags, buf); + duk_push_string(ctx, (const char *) buf); + return 1; +} + +/* Helper for component getter calls: check 'this' binding, get the + * internal time value, split it into parts (either as UTC time or + * local time), push a specified component as a return value to the + * value stack and return 1 (caller can then tail call us). + */ +DUK_LOCAL duk_ret_t duk__get_part_helper(duk_context *ctx, duk_small_uint_t flags_and_idx) { + duk_double_t d; + duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; + duk_small_uint_t idx_part = (duk_small_uint_t) (flags_and_idx >> DUK_DATE_FLAG_VALUE_SHIFT); /* unpack args */ + + DUK_ASSERT_DISABLE(idx_part >= 0); /* unsigned */ + DUK_ASSERT(idx_part < DUK_DATE_IDX_NUM_PARTS); + + d = duk__push_this_get_timeval(ctx, flags_and_idx); + if (DUK_ISNAN(d)) { + duk_push_nan(ctx); + return 1; + } + DUK_ASSERT(DUK_ISFINITE(d)); + + duk_bi_date_timeval_to_parts(d, parts, NULL, flags_and_idx); /* no need to mask idx portion */ + + /* Setter APIs detect special year numbers (0...99) and apply a +1900 + * only in certain cases. The legacy getYear() getter applies -1900 + * unconditionally. + */ + duk_push_int(ctx, (flags_and_idx & DUK_DATE_FLAG_SUB1900) ? parts[idx_part] - 1900 : parts[idx_part]); + return 1; +} + +/* Helper for component setter calls: check 'this' binding, get the + * internal time value, split it into parts (either as UTC time or + * local time), modify one or more components as specified, recompute + * the time value, set it as the internal value. Finally, push the + * new time value as a return value to the value stack and return 1 + * (caller can then tail call us). + */ +DUK_LOCAL duk_ret_t duk__set_part_helper(duk_context *ctx, duk_small_uint_t flags_and_maxnargs) { + duk_double_t d; + duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; + duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; + duk_idx_t nargs; + duk_small_uint_t maxnargs = (duk_small_uint_t) (flags_and_maxnargs >> DUK_DATE_FLAG_VALUE_SHIFT); /* unpack args */ + duk_small_uint_t idx_first, idx; + duk_small_uint_t i; + + nargs = duk_get_top(ctx); + d = duk__push_this_get_timeval(ctx, flags_and_maxnargs); + DUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d)); + + if (DUK_ISFINITE(d)) { + duk_bi_date_timeval_to_parts(d, parts, dparts, flags_and_maxnargs); + } else { + /* NaN timevalue: we need to coerce the arguments, but + * the resulting internal timestamp needs to remain NaN. + * This works but is not pretty: parts and dparts will + * be partially uninitialized, but we only write to them. + */ + } + + /* + * Determining which datetime components to overwrite based on + * stack arguments is a bit complicated, but important to factor + * out from setters themselves for compactness. + * + * If DUK_DATE_FLAG_TIMESETTER, maxnargs indicates setter type: + * + * 1 -> millisecond + * 2 -> second, [millisecond] + * 3 -> minute, [second], [millisecond] + * 4 -> hour, [minute], [second], [millisecond] + * + * Else: + * + * 1 -> date + * 2 -> month, [date] + * 3 -> year, [month], [date] + * + * By comparing nargs and maxnargs (and flags) we know which + * components to override. We rely on part index ordering. + */ + + if (flags_and_maxnargs & DUK_DATE_FLAG_TIMESETTER) { + DUK_ASSERT(maxnargs >= 1 && maxnargs <= 4); + idx_first = DUK_DATE_IDX_MILLISECOND - (maxnargs - 1); + } else { + DUK_ASSERT(maxnargs >= 1 && maxnargs <= 3); + idx_first = DUK_DATE_IDX_DAY - (maxnargs - 1); + } + DUK_ASSERT_DISABLE(idx_first >= 0); /* unsigned */ + DUK_ASSERT(idx_first < DUK_DATE_IDX_NUM_PARTS); + + for (i = 0; i < maxnargs; i++) { + if ((duk_idx_t) i >= nargs) { + /* no argument given -> leave components untouched */ + break; + } + idx = idx_first + i; + DUK_ASSERT_DISABLE(idx >= 0); /* unsigned */ + DUK_ASSERT(idx < DUK_DATE_IDX_NUM_PARTS); + + if (idx == DUK_DATE_IDX_YEAR && (flags_and_maxnargs & DUK_DATE_FLAG_YEAR_FIXUP)) { + duk__twodigit_year_fixup(ctx, (duk_idx_t) i); + } + + dparts[idx] = duk_to_number(ctx, i); + + if (idx == DUK_DATE_IDX_DAY) { + /* Day-of-month is one-based in the API, but zero-based + * internally, so fix here. Note that month is zero-based + * both in the API and internally. + */ + /* SCANBUILD: complains about use of uninitialized values. + * The complaint is correct, but operating in undefined + * values here is intentional in some cases and the caller + * ignores the results. + */ + dparts[idx] -= 1.0; + } + } + + /* Leaves new timevalue on stack top and returns 1, which is correct + * for part setters. + */ + if (DUK_ISFINITE(d)) { + return duk__set_this_timeval_from_dparts(ctx, dparts, flags_and_maxnargs); + } else { + /* Internal timevalue is already NaN, so don't touch it. */ + duk_push_nan(ctx); + return 1; + } +} + +/* Apply ToNumber() to specified index; if ToInteger(val) in [0,99], add + * 1900 and replace value at idx_val. + */ +DUK_LOCAL void duk__twodigit_year_fixup(duk_context *ctx, duk_idx_t idx_val) { + duk_double_t d; + + /* XXX: idx_val would fit into 16 bits, but using duk_small_uint_t + * might not generate better code due to casting. + */ + + /* E5 Sections 15.9.3.1, B.2.4, B.2.5 */ + duk_to_number(ctx, idx_val); + if (duk_is_nan(ctx, idx_val)) { + return; + } + duk_dup(ctx, idx_val); + duk_to_int(ctx, -1); + d = duk_get_number(ctx, -1); /* get as double to handle huge numbers correctly */ + if (d >= 0.0 && d <= 99.0) { + d += 1900.0; + duk_push_number(ctx, d); + duk_replace(ctx, idx_val); + } + duk_pop(ctx); +} + +/* Set datetime parts from stack arguments, defaulting any missing values. + * Day-of-week is not set; it is not required when setting the time value. + */ +DUK_LOCAL void duk__set_parts_from_args(duk_context *ctx, duk_double_t *dparts, duk_idx_t nargs) { + duk_double_t d; + duk_small_uint_t i; + duk_small_uint_t idx; + + /* Causes a ToNumber() coercion, but doesn't break coercion order since + * year is coerced first anyway. + */ + duk__twodigit_year_fixup(ctx, 0); + + /* There are at most 7 args, but we use 8 here so that also + * DUK_DATE_IDX_WEEKDAY gets initialized (to zero) to avoid the potential + * for any Valgrind gripes later. + */ + for (i = 0; i < 8; i++) { + /* Note: rely on index ordering */ + idx = DUK_DATE_IDX_YEAR + i; + if ((duk_idx_t) i < nargs) { + d = duk_to_number(ctx, (duk_idx_t) i); + if (idx == DUK_DATE_IDX_DAY) { + /* Convert day from one-based to zero-based (internal). This may + * cause the day part to be negative, which is OK. + */ + d -= 1.0; + } + } else { + /* All components default to 0 except day-of-month which defaults + * to 1. However, because our internal day-of-month is zero-based, + * it also defaults to zero here. + */ + d = 0.0; + } + dparts[idx] = d; + } + + DUK_DDD(DUK_DDDPRINT("parts from args -> %lf %lf %lf %lf %lf %lf %lf %lf", + (double) dparts[0], (double) dparts[1], + (double) dparts[2], (double) dparts[3], + (double) dparts[4], (double) dparts[5], + (double) dparts[6], (double) dparts[7])); +} + +/* + * Helper to format a time value into caller buffer, used by logging. + * 'out_buf' must be at least DUK_BI_DATE_ISO8601_BUFSIZE long. + */ + +DUK_INTERNAL void duk_bi_date_format_timeval(duk_double_t timeval, duk_uint8_t *out_buf) { + duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; + + duk_bi_date_timeval_to_parts(timeval, + parts, + NULL, + DUK_DATE_FLAG_ONEBASED); + + duk__format_parts_iso8601(parts, + 0 /*tzoffset*/, + DUK_DATE_FLAG_TOSTRING_DATE | + DUK_DATE_FLAG_TOSTRING_TIME | + DUK_DATE_FLAG_SEP_T /*flags*/, + out_buf); +} + +/* + * Indirect magic value lookup for Date methods. + * + * Date methods don't put their control flags into the function magic value + * because they wouldn't fit into a LIGHTFUNC's magic field. Instead, the + * magic value is set to an index pointing to the array of control flags + * below. + * + * This must be kept in strict sync with genbuiltins.py! + */ + +static duk_uint16_t duk__date_magics[] = { + /* 0: toString */ + DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_LOCALTIME, + + /* 1: toDateString */ + DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_LOCALTIME, + + /* 2: toTimeString */ + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_LOCALTIME, + + /* 3: toLocaleString */ + DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME, + + /* 4: toLocaleDateString */ + DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME, + + /* 5: toLocaleTimeString */ + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_TOSTRING_LOCALE + DUK_DATE_FLAG_LOCALTIME, + + /* 6: toUTCString */ + DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME, + + /* 7: toISOString */ + DUK_DATE_FLAG_TOSTRING_DATE + DUK_DATE_FLAG_TOSTRING_TIME + DUK_DATE_FLAG_NAN_TO_RANGE_ERROR + DUK_DATE_FLAG_SEP_T, + + /* 8: getFullYear */ + DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 9: getUTCFullYear */ + 0 + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 10: getMonth */ + DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MONTH << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 11: getUTCMonth */ + 0 + (DUK_DATE_IDX_MONTH << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 12: getDate */ + DUK_DATE_FLAG_ONEBASED + DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_DAY << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 13: getUTCDate */ + DUK_DATE_FLAG_ONEBASED + (DUK_DATE_IDX_DAY << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 14: getDay */ + DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_WEEKDAY << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 15: getUTCDay */ + 0 + (DUK_DATE_IDX_WEEKDAY << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 16: getHours */ + DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_HOUR << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 17: getUTCHours */ + 0 + (DUK_DATE_IDX_HOUR << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 18: getMinutes */ + DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MINUTE << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 19: getUTCMinutes */ + 0 + (DUK_DATE_IDX_MINUTE << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 20: getSeconds */ + DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_SECOND << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 21: getUTCSeconds */ + 0 + (DUK_DATE_IDX_SECOND << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 22: getMilliseconds */ + DUK_DATE_FLAG_LOCALTIME + (DUK_DATE_IDX_MILLISECOND << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 23: getUTCMilliseconds */ + 0 + (DUK_DATE_IDX_MILLISECOND << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 24: setMilliseconds */ + DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (1 << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 25: setUTCMilliseconds */ + DUK_DATE_FLAG_TIMESETTER + (1 << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 26: setSeconds */ + DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (2 << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 27: setUTCSeconds */ + DUK_DATE_FLAG_TIMESETTER + (2 << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 28: setMinutes */ + DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (3 << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 29: setUTCMinutes */ + DUK_DATE_FLAG_TIMESETTER + (3 << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 30: setHours */ + DUK_DATE_FLAG_TIMESETTER + DUK_DATE_FLAG_LOCALTIME + (4 << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 31: setUTCHours */ + DUK_DATE_FLAG_TIMESETTER + (4 << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 32: setDate */ + DUK_DATE_FLAG_LOCALTIME + (1 << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 33: setUTCDate */ + 0 + (1 << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 34: setMonth */ + DUK_DATE_FLAG_LOCALTIME + (2 << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 35: setUTCMonth */ + 0 + (2 << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 36: setFullYear */ + DUK_DATE_FLAG_NAN_TO_ZERO + DUK_DATE_FLAG_LOCALTIME + (3 << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 37: setUTCFullYear */ + DUK_DATE_FLAG_NAN_TO_ZERO + (3 << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 38: getYear */ + DUK_DATE_FLAG_LOCALTIME + DUK_DATE_FLAG_SUB1900 + (DUK_DATE_IDX_YEAR << DUK_DATE_FLAG_VALUE_SHIFT), + + /* 39: setYear */ + DUK_DATE_FLAG_NAN_TO_ZERO + DUK_DATE_FLAG_YEAR_FIXUP + (3 << DUK_DATE_FLAG_VALUE_SHIFT), +}; + +DUK_LOCAL duk_small_uint_t duk__date_get_indirect_magic(duk_context *ctx) { + duk_small_int_t magicidx = (duk_small_uint_t) duk_get_current_magic(ctx); + DUK_ASSERT(magicidx >= 0 && magicidx < (duk_small_int_t) (sizeof(duk__date_magics) / sizeof(duk_uint16_t))); + return (duk_small_uint_t) duk__date_magics[magicidx]; +} + +/* + * Constructor calls + */ + +DUK_INTERNAL duk_ret_t duk_bi_date_constructor(duk_context *ctx) { + duk_idx_t nargs = duk_get_top(ctx); + duk_bool_t is_cons = duk_is_constructor_call(ctx); + duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; + duk_double_t d; + + DUK_DDD(DUK_DDDPRINT("Date constructor, nargs=%ld, is_cons=%ld", (long) nargs, (long) is_cons)); + + duk_push_object_helper(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DATE), + DUK_BIDX_DATE_PROTOTYPE); + + /* Unlike most built-ins, the internal [[PrimitiveValue]] of a Date + * is mutable. + */ + + if (nargs == 0 || !is_cons) { + d = duk__timeclip(DUK_USE_DATE_GET_NOW(ctx)); + duk_push_number(ctx, d); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_W); + if (!is_cons) { + /* called as a normal function: return new Date().toString() */ + duk_to_string(ctx, -1); + } + return 1; + } else if (nargs == 1) { + duk_to_primitive(ctx, 0, DUK_HINT_NONE); + if (duk_is_string(ctx, 0)) { + duk__parse_string(ctx, duk_to_string(ctx, 0)); + duk_replace(ctx, 0); /* may be NaN */ + } + d = duk__timeclip(duk_to_number(ctx, 0)); + duk_push_number(ctx, d); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_INT_VALUE, DUK_PROPDESC_FLAGS_W); + return 1; + } + + duk__set_parts_from_args(ctx, dparts, nargs); + + /* Parts are in local time, convert when setting. */ + + (void) duk__set_this_timeval_from_dparts(ctx, dparts, DUK_DATE_FLAG_LOCALTIME /*flags*/); /* -> [ ... this timeval ] */ + duk_pop(ctx); /* -> [ ... this ] */ + return 1; +} + +DUK_INTERNAL duk_ret_t duk_bi_date_constructor_parse(duk_context *ctx) { + return duk__parse_string(ctx, duk_to_string(ctx, 0)); +} + +DUK_INTERNAL duk_ret_t duk_bi_date_constructor_utc(duk_context *ctx) { + duk_idx_t nargs = duk_get_top(ctx); + duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; + duk_double_t d; + + /* Behavior for nargs < 2 is implementation dependent: currently we'll + * set a NaN time value (matching V8 behavior) in this case. + */ + + if (nargs < 2) { + duk_push_nan(ctx); + } else { + duk__set_parts_from_args(ctx, dparts, nargs); + d = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/); + duk_push_number(ctx, d); + } + return 1; +} + +DUK_INTERNAL duk_ret_t duk_bi_date_constructor_now(duk_context *ctx) { + duk_double_t d; + + d = DUK_USE_DATE_GET_NOW(ctx); + DUK_ASSERT(duk__timeclip(d) == d); /* TimeClip() should never be necessary */ + duk_push_number(ctx, d); + return 1; +} + +/* + * String/JSON conversions + * + * Human readable conversions are now basically ISO 8601 with a space + * (instead of 'T') as the date/time separator. This is a good baseline + * and is platform independent. + * + * A shared native helper to provide many conversions. Magic value contains + * a set of flags. The helper provides: + * + * toString() + * toDateString() + * toTimeString() + * toLocaleString() + * toLocaleDateString() + * toLocaleTimeString() + * toUTCString() + * toISOString() + * + * Notes: + * + * - Date.prototype.toGMTString() and Date.prototype.toUTCString() are + * required to be the same Ecmascript function object (!), so it is + * omitted from here. + * + * - Date.prototype.toUTCString(): E5.1 specification does not require a + * specific format, but result should be human readable. The + * specification suggests using ISO 8601 format with a space (instead + * of 'T') separator if a more human readable format is not available. + * + * - Date.prototype.toISOString(): unlike other conversion functions, + * toISOString() requires a RangeError for invalid date values. + */ + +DUK_INTERNAL duk_ret_t duk_bi_date_prototype_tostring_shared(duk_context *ctx) { + duk_small_uint_t flags = duk__date_get_indirect_magic(ctx); + return duk__to_string_helper(ctx, flags); +} + +DUK_INTERNAL duk_ret_t duk_bi_date_prototype_value_of(duk_context *ctx) { + /* This native function is also used for Date.prototype.getTime() + * as their behavior is identical. + */ + + duk_double_t d = duk__push_this_get_timeval(ctx, 0 /*flags*/); /* -> [ this ] */ + DUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d)); + duk_push_number(ctx, d); + return 1; +} + +DUK_INTERNAL duk_ret_t duk_bi_date_prototype_to_json(duk_context *ctx) { + /* Note: toJSON() is a generic function which works even if 'this' + * is not a Date. The sole argument is ignored. + */ + + duk_push_this(ctx); + duk_to_object(ctx, -1); + + duk_dup_top(ctx); + duk_to_primitive(ctx, -1, DUK_HINT_NUMBER); + if (duk_is_number(ctx, -1)) { + duk_double_t d = duk_get_number(ctx, -1); + if (!DUK_ISFINITE(d)) { + duk_push_null(ctx); + return 1; + } + } + duk_pop(ctx); + + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_TO_ISO_STRING); + duk_dup(ctx, -2); /* -> [ O toIsoString O ] */ + duk_call_method(ctx, 0); + return 1; +} + +/* + * Getters. + * + * Implementing getters is quite easy. The internal time value is either + * NaN, or represents milliseconds (without fractions) from Jan 1, 1970. + * The internal time value can be converted to integer parts, and each + * part will be normalized and will fit into a 32-bit signed integer. + * + * A shared native helper to provide all getters. Magic value contains + * a set of flags and also packs the date component index argument. The + * helper provides: + * + * getFullYear() + * getUTCFullYear() + * getMonth() + * getUTCMonth() + * getDate() + * getUTCDate() + * getDay() + * getUTCDay() + * getHours() + * getUTCHours() + * getMinutes() + * getUTCMinutes() + * getSeconds() + * getUTCSeconds() + * getMilliseconds() + * getUTCMilliseconds() + * getYear() + * + * Notes: + * + * - Date.prototype.getDate(): 'date' means day-of-month, and is + * zero-based in internal calculations but public API expects it to + * be one-based. + * + * - Date.prototype.getTime() and Date.prototype.valueOf() have identical + * behavior. They have separate function objects, but share the same C + * function (duk_bi_date_prototype_value_of). + */ + +DUK_INTERNAL duk_ret_t duk_bi_date_prototype_get_shared(duk_context *ctx) { + duk_small_uint_t flags_and_idx = duk__date_get_indirect_magic(ctx); + return duk__get_part_helper(ctx, flags_and_idx); +} + +DUK_INTERNAL duk_ret_t duk_bi_date_prototype_get_timezone_offset(duk_context *ctx) { + /* + * Return (t - LocalTime(t)) in minutes: + * + * t - LocalTime(t) = t - (t + LocalTZA + DaylightSavingTA(t)) + * = -(LocalTZA + DaylightSavingTA(t)) + * + * where DaylightSavingTA() is checked for time 't'. + * + * Note that the sign of the result is opposite to common usage, + * e.g. for EE(S)T which normally is +2h or +3h from UTC, this + * function returns -120 or -180. + * + */ + + duk_double_t d; + duk_int_t tzoffset; + + /* Note: DST adjustment is determined using UTC time. */ + d = duk__push_this_get_timeval(ctx, 0 /*flags*/); + DUK_ASSERT(DUK_ISFINITE(d) || DUK_ISNAN(d)); + if (DUK_ISNAN(d)) { + duk_push_nan(ctx); + } else { + DUK_ASSERT(DUK_ISFINITE(d)); + tzoffset = DUK_USE_DATE_GET_LOCAL_TZOFFSET(d); + duk_push_int(ctx, -tzoffset / 60); + } + return 1; +} + +/* + * Setters. + * + * Setters are a bit more complicated than getters. Component setters + * break down the current time value into its (normalized) component + * parts, replace one or more components with -unnormalized- new values, + * and the components are then converted back into a time value. As an + * example of using unnormalized values: + * + * var d = new Date(1234567890); + * + * is equivalent to: + * + * var d = new Date(0); + * d.setUTCMilliseconds(1234567890); + * + * A shared native helper to provide almost all setters. Magic value + * contains a set of flags and also packs the "maxnargs" argument. The + * helper provides: + * + * setMilliseconds() + * setUTCMilliseconds() + * setSeconds() + * setUTCSeconds() + * setMinutes() + * setUTCMinutes() + * setHours() + * setUTCHours() + * setDate() + * setUTCDate() + * setMonth() + * setUTCMonth() + * setFullYear() + * setUTCFullYear() + * setYear() + * + * Notes: + * + * - Date.prototype.setYear() (Section B addition): special year check + * is omitted. NaN / Infinity will just flow through and ultimately + * result in a NaN internal time value. + * + * - Date.prototype.setYear() does not have optional arguments for + * setting month and day-in-month (like setFullYear()), but we indicate + * 'maxnargs' to be 3 to get the year written to the correct component + * index in duk__set_part_helper(). The function has nargs == 1, so only + * the year will be set regardless of actual argument count. + */ + +DUK_INTERNAL duk_ret_t duk_bi_date_prototype_set_shared(duk_context *ctx) { + duk_small_uint_t flags_and_maxnargs = duk__date_get_indirect_magic(ctx); + return duk__set_part_helper(ctx, flags_and_maxnargs); +} + +DUK_INTERNAL duk_ret_t duk_bi_date_prototype_set_time(duk_context *ctx) { + duk_double_t d; + + (void) duk__push_this_get_timeval(ctx, 0 /*flags*/); /* -> [ timeval this ] */ + d = duk__timeclip(duk_to_number(ctx, 0)); + duk_push_number(ctx, d); + duk_dup_top(ctx); + duk_put_prop_stridx(ctx, -3, DUK_STRIDX_INT_VALUE); /* -> [ timeval this timeval ] */ + + return 1; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_date_unix.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_date_unix.c new file mode 100644 index 00000000..2b9690eb --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_date_unix.c @@ -0,0 +1,306 @@ +/* + * Unix-like Date providers + * + * Generally useful Unix / POSIX / ANSI Date providers. + */ + +#include "duk_internal.h" + +/* The necessary #includes are in place in duk_config.h. */ + +/* Buffer sizes for some UNIX calls. Larger than strictly necessary + * to avoid Valgrind errors. + */ +#define DUK__STRPTIME_BUF_SIZE 64 +#define DUK__STRFTIME_BUF_SIZE 64 + +#if defined(DUK_USE_DATE_NOW_GETTIMEOFDAY) +/* Get current Ecmascript time (= UNIX/Posix time, but in milliseconds). */ +DUK_INTERNAL duk_double_t duk_bi_date_get_now_gettimeofday(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + struct timeval tv; + duk_double_t d; + + if (gettimeofday(&tv, NULL) != 0) { + DUK_ERROR(thr, DUK_ERR_INTERNAL_ERROR, "gettimeofday failed"); + } + + d = ((duk_double_t) tv.tv_sec) * 1000.0 + + ((duk_double_t) (tv.tv_usec / 1000)); + DUK_ASSERT(DUK_FLOOR(d) == d); /* no fractions */ + + return d; +} +#endif /* DUK_USE_DATE_NOW_GETTIMEOFDAY */ + +#if defined(DUK_USE_DATE_NOW_TIME) +/* Not a very good provider: only full seconds are available. */ +DUK_INTERNAL duk_double_t duk_bi_date_get_now_time(duk_context *ctx) { + time_t t = time(NULL); + return ((duk_double_t) t) * 1000.0; +} +#endif /* DUK_USE_DATE_NOW_TIME */ + +#if defined(DUK_USE_DATE_TZO_GMTIME) || defined(DUK_USE_DATE_TZO_GMTIME_R) +/* Get local time offset (in seconds) for a certain (UTC) instant 'd'. */ +DUK_INTERNAL duk_int_t duk_bi_date_get_local_tzoffset_gmtime(duk_double_t d) { + time_t t, t1, t2; + duk_int_t parts[DUK_DATE_IDX_NUM_PARTS]; + duk_double_t dparts[DUK_DATE_IDX_NUM_PARTS]; + struct tm tms[2]; +#ifdef DUK_USE_DATE_TZO_GMTIME + struct tm *tm_ptr; +#endif + + /* For NaN/inf, the return value doesn't matter. */ + if (!DUK_ISFINITE(d)) { + return 0; + } + + /* If not within Ecmascript range, some integer time calculations + * won't work correctly (and some asserts will fail), so bail out + * if so. This fixes test-bug-date-insane-setyear.js. There is + * a +/- 24h leeway in this range check to avoid a test262 corner + * case documented in test-bug-date-timeval-edges.js. + */ + if (!duk_bi_date_timeval_in_leeway_range(d)) { + DUK_DD(DUK_DDPRINT("timeval not within valid range, skip tzoffset computation to avoid integer overflows")); + return 0; + } + + /* + * This is a bit tricky to implement portably. The result depends + * on the timestamp (specifically, DST depends on the timestamp). + * If e.g. UNIX APIs are used, they'll have portability issues with + * very small and very large years. + * + * Current approach: + * + * - Stay within portable UNIX limits by using equivalent year mapping. + * Avoid year 1970 and 2038 as some conversions start to fail, at + * least on some platforms. Avoiding 1970 means that there are + * currently DST discrepancies for 1970. + * + * - Create a UTC and local time breakdowns from 't'. Then create + * a time_t using gmtime() and localtime() and compute the time + * difference between the two. + * + * Equivalent year mapping (E5 Section 15.9.1.8): + * + * If the host environment provides functionality for determining + * daylight saving time, the implementation of ECMAScript is free + * to map the year in question to an equivalent year (same + * leap-year-ness and same starting week day for the year) for which + * the host environment provides daylight saving time information. + * The only restriction is that all equivalent years should produce + * the same result. + * + * This approach is quite reasonable but not entirely correct, e.g. + * the specification also states (E5 Section 15.9.1.8): + * + * The implementation of ECMAScript should not try to determine + * whether the exact time was subject to daylight saving time, but + * just whether daylight saving time would have been in effect if + * the _current daylight saving time algorithm_ had been used at the + * time. This avoids complications such as taking into account the + * years that the locale observed daylight saving time year round. + * + * Since we rely on the platform APIs for conversions between local + * time and UTC, we can't guarantee the above. Rather, if the platform + * has historical DST rules they will be applied. This seems to be the + * general preferred direction in Ecmascript standardization (or at least + * implementations) anyway, and even the equivalent year mapping should + * be disabled if the platform is known to handle DST properly for the + * full Ecmascript range. + * + * The following has useful discussion and links: + * + * https://bugzilla.mozilla.org/show_bug.cgi?id=351066 + */ + + duk_bi_date_timeval_to_parts(d, parts, dparts, DUK_DATE_FLAG_EQUIVYEAR /*flags*/); + DUK_ASSERT(parts[DUK_DATE_IDX_YEAR] >= 1970 && parts[DUK_DATE_IDX_YEAR] <= 2038); + + d = duk_bi_date_get_timeval_from_dparts(dparts, 0 /*flags*/); + DUK_ASSERT(d >= 0 && d < 2147483648.0 * 1000.0); /* unsigned 31-bit range */ + t = (time_t) (d / 1000.0); + DUK_DDD(DUK_DDDPRINT("timeval: %lf -> time_t %ld", (double) d, (long) t)); + + t1 = t; + + DUK_MEMZERO((void *) tms, sizeof(struct tm) * 2); + +#if defined(DUK_USE_DATE_TZO_GMTIME_R) + (void) gmtime_r(&t, &tms[0]); + (void) localtime_r(&t, &tms[1]); +#elif defined(DUK_USE_DATE_TZO_GMTIME) + tm_ptr = gmtime(&t); + DUK_MEMCPY((void *) &tms[0], tm_ptr, sizeof(struct tm)); + tm_ptr = localtime(&t); + DUK_MEMCPY((void *) &tms[1], tm_ptr, sizeof(struct tm)); +#else +#error internal error +#endif + DUK_DDD(DUK_DDDPRINT("gmtime result: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld," + "wday:%ld,yday:%ld,isdst:%ld}", + (long) tms[0].tm_sec, (long) tms[0].tm_min, (long) tms[0].tm_hour, + (long) tms[0].tm_mday, (long) tms[0].tm_mon, (long) tms[0].tm_year, + (long) tms[0].tm_wday, (long) tms[0].tm_yday, (long) tms[0].tm_isdst)); + DUK_DDD(DUK_DDDPRINT("localtime result: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld," + "wday:%ld,yday:%ld,isdst:%ld}", + (long) tms[1].tm_sec, (long) tms[1].tm_min, (long) tms[1].tm_hour, + (long) tms[1].tm_mday, (long) tms[1].tm_mon, (long) tms[1].tm_year, + (long) tms[1].tm_wday, (long) tms[1].tm_yday, (long) tms[1].tm_isdst)); + + t1 = mktime(&tms[0]); /* UTC */ + t2 = mktime(&tms[1]); /* local */ + if (t1 == (time_t) -1 || t2 == (time_t) -1) { + /* This check used to be for (t < 0) but on some platforms + * time_t is unsigned and apparently the proper way to detect + * an mktime() error return is the cast above. See e.g.: + * http://pubs.opengroup.org/onlinepubs/009695299/functions/mktime.html + */ + goto error; + } + if (tms[1].tm_isdst > 0) { + t2 += 3600; + } else if (tms[1].tm_isdst < 0) { + DUK_D(DUK_DPRINT("tm_isdst is negative: %d", (int) tms[1].tm_isdst)); + } + DUK_DDD(DUK_DDDPRINT("t1=%ld (utc), t2=%ld (local)", (long) t1, (long) t2)); + + /* Compute final offset in seconds, positive if local time ahead of + * UTC (returned value is UTC-to-local offset). + * + * difftime() returns a double, so coercion to int generates quite + * a lot of code. Direct subtraction is not portable, however. + * XXX: allow direct subtraction on known platforms. + */ +#if 0 + return (duk_int_t) (t2 - t1); +#endif + return (duk_int_t) difftime(t2, t1); + + error: + /* XXX: return something more useful, so that caller can throw? */ + DUK_D(DUK_DPRINT("mktime() failed, d=%lf", (double) d)); + return 0; +} +#endif /* DUK_USE_DATE_TZO_GMTIME */ + +#if defined(DUK_USE_DATE_PRS_STRPTIME) +DUK_INTERNAL duk_bool_t duk_bi_date_parse_string_strptime(duk_context *ctx, const char *str) { + struct tm tm; + time_t t; + char buf[DUK__STRPTIME_BUF_SIZE]; + + /* copy to buffer with spare to avoid Valgrind gripes from strptime */ + DUK_ASSERT(str != NULL); + DUK_MEMZERO(buf, sizeof(buf)); /* valgrind whine without this */ + DUK_SNPRINTF(buf, sizeof(buf), "%s", (const char *) str); + buf[sizeof(buf) - 1] = (char) 0; + + DUK_DDD(DUK_DDDPRINT("parsing: '%s'", (const char *) buf)); + + DUK_MEMZERO(&tm, sizeof(tm)); + if (strptime((const char *) buf, "%c", &tm) != NULL) { + DUK_DDD(DUK_DDDPRINT("before mktime: tm={sec:%ld,min:%ld,hour:%ld,mday:%ld,mon:%ld,year:%ld," + "wday:%ld,yday:%ld,isdst:%ld}", + (long) tm.tm_sec, (long) tm.tm_min, (long) tm.tm_hour, + (long) tm.tm_mday, (long) tm.tm_mon, (long) tm.tm_year, + (long) tm.tm_wday, (long) tm.tm_yday, (long) tm.tm_isdst)); + tm.tm_isdst = -1; /* negative: dst info not available */ + + t = mktime(&tm); + DUK_DDD(DUK_DDDPRINT("mktime() -> %ld", (long) t)); + if (t >= 0) { + duk_push_number(ctx, ((duk_double_t) t) * 1000.0); + return 1; + } + } + + return 0; +} +#endif /* DUK_USE_DATE_PRS_STRPTIME */ + +#if defined(DUK_USE_DATE_PRS_GETDATE) +DUK_INTERNAL duk_bool_t duk_bi_date_parse_string_getdate(duk_context *ctx, const char *str) { + struct tm tm; + duk_small_int_t rc; + time_t t; + + /* For this to work, DATEMSK must be set, so this is not very + * convenient for an embeddable interpreter. + */ + + DUK_MEMZERO(&tm, sizeof(struct tm)); + rc = (duk_small_int_t) getdate_r(str, &tm); + DUK_DDD(DUK_DDDPRINT("getdate_r() -> %ld", (long) rc)); + + if (rc == 0) { + t = mktime(&tm); + DUK_DDD(DUK_DDDPRINT("mktime() -> %ld", (long) t)); + if (t >= 0) { + duk_push_number(ctx, (duk_double_t) t); + return 1; + } + } + + return 0; +} +#endif /* DUK_USE_DATE_PRS_GETDATE */ + +#if defined(DUK_USE_DATE_FMT_STRFTIME) +DUK_INTERNAL duk_bool_t duk_bi_date_format_parts_strftime(duk_context *ctx, duk_int_t *parts, duk_int_t tzoffset, duk_small_uint_t flags) { + char buf[DUK__STRFTIME_BUF_SIZE]; + struct tm tm; + const char *fmt; + + DUK_UNREF(tzoffset); + + /* If the platform doesn't support the entire Ecmascript range, we need + * to return 0 so that the caller can fall back to the default formatter. + * + * For now, assume that if time_t is 8 bytes or more, the whole Ecmascript + * range is supported. For smaller time_t values (4 bytes in practice), + * assumes that the signed 32-bit range is supported. + * + * XXX: detect this more correctly per platform. The size of time_t is + * probably not an accurate guarantee of strftime() supporting or not + * supporting a large time range (the full Ecmascript range). + */ + if (sizeof(time_t) < 8 && + (parts[DUK_DATE_IDX_YEAR] < 1970 || parts[DUK_DATE_IDX_YEAR] > 2037)) { + /* be paranoid for 32-bit time values (even avoiding negative ones) */ + return 0; + } + + DUK_MEMZERO(&tm, sizeof(tm)); + tm.tm_sec = parts[DUK_DATE_IDX_SECOND]; + tm.tm_min = parts[DUK_DATE_IDX_MINUTE]; + tm.tm_hour = parts[DUK_DATE_IDX_HOUR]; + tm.tm_mday = parts[DUK_DATE_IDX_DAY]; /* already one-based */ + tm.tm_mon = parts[DUK_DATE_IDX_MONTH] - 1; /* one-based -> zero-based */ + tm.tm_year = parts[DUK_DATE_IDX_YEAR] - 1900; + tm.tm_wday = parts[DUK_DATE_IDX_WEEKDAY]; + tm.tm_isdst = 0; + + DUK_MEMZERO(buf, sizeof(buf)); + if ((flags & DUK_DATE_FLAG_TOSTRING_DATE) && (flags & DUK_DATE_FLAG_TOSTRING_TIME)) { + fmt = "%c"; + } else if (flags & DUK_DATE_FLAG_TOSTRING_DATE) { + fmt = "%x"; + } else { + DUK_ASSERT(flags & DUK_DATE_FLAG_TOSTRING_TIME); + fmt = "%X"; + } + (void) strftime(buf, sizeof(buf) - 1, fmt, &tm); + DUK_ASSERT(buf[sizeof(buf) - 1] == 0); + + duk_push_string(ctx, buf); + return 1; +} +#endif /* DUK_USE_DATE_FMT_STRFTIME */ + +#undef DUK__STRPTIME_BUF_SIZE +#undef DUK__STRFTIME_BUF_SIZE diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_date_windows.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_date_windows.c new file mode 100644 index 00000000..c131d227 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_date_windows.c @@ -0,0 +1,98 @@ +/* + * Windows Date providers + * + * Platform specific links: + * + * - http://msdn.microsoft.com/en-us/library/windows/desktop/ms725473(v=vs.85).aspx + */ + +#include "duk_internal.h" + +/* The necessary #includes are in place in duk_config.h. */ + +#if defined(DUK_USE_DATE_NOW_WINDOWS) || defined(DUK_USE_DATE_TZO_WINDOWS) +/* Shared Windows helpers. */ +DUK_LOCAL void duk__convert_systime_to_ularge(const SYSTEMTIME *st, ULARGE_INTEGER *res) { + FILETIME ft; + if (SystemTimeToFileTime(st, &ft) == 0) { + DUK_D(DUK_DPRINT("SystemTimeToFileTime() failed, returning 0")); + res->QuadPart = 0; + } else { + res->LowPart = ft.dwLowDateTime; + res->HighPart = ft.dwHighDateTime; + } +} +DUK_LOCAL void duk__set_systime_jan1970(SYSTEMTIME *st) { + DUK_MEMZERO((void *) st, sizeof(*st)); + st->wYear = 1970; + st->wMonth = 1; + st->wDayOfWeek = 4; /* not sure whether or not needed; Thursday */ + st->wDay = 1; + DUK_ASSERT(st->wHour == 0); + DUK_ASSERT(st->wMinute == 0); + DUK_ASSERT(st->wSecond == 0); + DUK_ASSERT(st->wMilliseconds == 0); +} +#endif /* defined(DUK_USE_DATE_NOW_WINDOWS) || defined(DUK_USE_DATE_TZO_WINDOWS) */ + +#ifdef DUK_USE_DATE_NOW_WINDOWS +DUK_INTERNAL duk_double_t duk_bi_date_get_now_windows(duk_context *ctx) { + /* Suggested step-by-step method from documentation of RtlTimeToSecondsSince1970: + * http://msdn.microsoft.com/en-us/library/windows/desktop/ms724928(v=vs.85).aspx + */ + SYSTEMTIME st1, st2; + ULARGE_INTEGER tmp1, tmp2; + + DUK_UNREF(ctx); + + GetSystemTime(&st1); + duk__convert_systime_to_ularge((const SYSTEMTIME *) &st1, &tmp1); + + duk__set_systime_jan1970(&st2); + duk__convert_systime_to_ularge((const SYSTEMTIME *) &st2, &tmp2); + + /* Difference is in 100ns units, convert to milliseconds w/o fractions */ + return (duk_double_t) ((tmp1.QuadPart - tmp2.QuadPart) / 10000LL); +} +#endif /* DUK_USE_DATE_NOW_WINDOWS */ + + +#if defined(DUK_USE_DATE_TZO_WINDOWS) +DUK_INTERNAL_DECL duk_int_t duk_bi_date_get_local_tzoffset_windows(duk_double_t d) { + SYSTEMTIME st1; + SYSTEMTIME st2; + SYSTEMTIME st3; + ULARGE_INTEGER tmp1; + ULARGE_INTEGER tmp2; + ULARGE_INTEGER tmp3; + FILETIME ft1; + + /* XXX: handling of timestamps outside Windows supported range. + * How does Windows deal with dates before 1600? Does windows + * support all Ecmascript years (like -200000 and +200000)? + * Should equivalent year mapping be used here too? If so, use + * a shared helper (currently integrated into timeval-to-parts). + */ + + /* Use the approach described in "Remarks" of FileTimeToLocalFileTime: + * http://msdn.microsoft.com/en-us/library/windows/desktop/ms724277(v=vs.85).aspx + */ + + duk__set_systime_jan1970(&st1); + duk__convert_systime_to_ularge((const SYSTEMTIME *) &st1, &tmp1); + tmp2.QuadPart = (ULONGLONG) (d * 10000.0); /* millisec -> 100ns units since jan 1, 1970 */ + tmp2.QuadPart += tmp1.QuadPart; /* input 'd' in Windows UTC, 100ns units */ + + ft1.dwLowDateTime = tmp2.LowPart; + ft1.dwHighDateTime = tmp2.HighPart; + FileTimeToSystemTime((const FILETIME *) &ft1, &st2); + if (SystemTimeToTzSpecificLocalTime((LPTIME_ZONE_INFORMATION) NULL, &st2, &st3) == 0) { + DUK_D(DUK_DPRINT("SystemTimeToTzSpecificLocalTime() failed, return tzoffset 0")); + return 0; + } + duk__convert_systime_to_ularge((const SYSTEMTIME *) &st3, &tmp3); + + /* Positive if local time ahead of UTC. */ + return (duk_int_t) (((LONGLONG) tmp3.QuadPart - (LONGLONG) tmp2.QuadPart) / 10000000LL); /* seconds */ +} +#endif /* DUK_USE_DATE_TZO_WINDOWS */ diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_duktape.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_duktape.c new file mode 100644 index 00000000..44b47a2d --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_duktape.c @@ -0,0 +1,313 @@ +/* + * Duktape built-ins + * + * Size optimization note: it might seem that vararg multipurpose functions + * like fin(), enc(), and dec() are not very size optimal, but using a single + * user-visible Ecmascript function saves a lot of run-time footprint; each + * Function instance takes >100 bytes. Using a shared native helper and a + * 'magic' value won't save much if there are multiple Function instances + * anyway. + */ + +#include "duk_internal.h" + +/* Raw helper to extract internal information / statistics about a value. + * The return values are version specific and must not expose anything + * that would lead to security issues (e.g. exposing compiled function + * 'data' buffer might be an issue). Currently only counts and sizes and + * such are given so there should not be a security impact. + */ +DUK_INTERNAL duk_ret_t duk_bi_duktape_object_info(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + duk_heaphdr *h; + duk_int_t i, n; + + DUK_UNREF(thr); + + /* result array */ + duk_push_array(ctx); /* -> [ val arr ] */ + + /* type tag (public) */ + duk_push_int(ctx, duk_get_type(ctx, 0)); + + /* address */ + tv = duk_get_tval(ctx, 0); + DUK_ASSERT(tv != NULL); /* because arg count is 1 */ + if (DUK_TVAL_IS_HEAP_ALLOCATED(tv)) { + h = DUK_TVAL_GET_HEAPHDR(tv); + duk_push_pointer(ctx, (void *) h); + } else { + /* internal type tag */ + duk_push_int(ctx, (duk_int_t) DUK_TVAL_GET_TAG(tv)); + goto done; + } + DUK_ASSERT(h != NULL); + + /* refcount */ +#ifdef DUK_USE_REFERENCE_COUNTING + duk_push_size_t(ctx, DUK_HEAPHDR_GET_REFCOUNT(h)); +#else + duk_push_undefined(ctx); +#endif + + /* heaphdr size and additional allocation size, followed by + * type specific stuff (with varying value count) + */ + switch ((duk_small_int_t) DUK_HEAPHDR_GET_TYPE(h)) { + case DUK_HTYPE_STRING: { + duk_hstring *h_str = (duk_hstring *) h; + duk_push_uint(ctx, (duk_uint_t) (sizeof(duk_hstring) + DUK_HSTRING_GET_BYTELEN(h_str) + 1)); + break; + } + case DUK_HTYPE_OBJECT: { + duk_hobject *h_obj = (duk_hobject *) h; + duk_small_uint_t hdr_size; + if (DUK_HOBJECT_IS_COMPILEDFUNCTION(h_obj)) { + hdr_size = (duk_small_uint_t) sizeof(duk_hcompiledfunction); + } else if (DUK_HOBJECT_IS_NATIVEFUNCTION(h_obj)) { + hdr_size = (duk_small_uint_t) sizeof(duk_hnativefunction); + } else if (DUK_HOBJECT_IS_THREAD(h_obj)) { + hdr_size = (duk_small_uint_t) sizeof(duk_hthread); + } else { + hdr_size = (duk_small_uint_t) sizeof(duk_hobject); + } + duk_push_uint(ctx, (duk_uint_t) hdr_size); + duk_push_uint(ctx, (duk_uint_t) DUK_HOBJECT_E_ALLOC_SIZE(h_obj)); + duk_push_uint(ctx, (duk_uint_t) DUK_HOBJECT_GET_ESIZE(h_obj)); + /* Note: e_next indicates the number of gc-reachable entries + * in the entry part, and also indicates the index where the + * next new property would be inserted. It does *not* indicate + * the number of non-NULL keys present in the object. That + * value could be counted separately but requires a pass through + * the key list. + */ + duk_push_uint(ctx, (duk_uint_t) DUK_HOBJECT_GET_ENEXT(h_obj)); + duk_push_uint(ctx, (duk_uint_t) DUK_HOBJECT_GET_ASIZE(h_obj)); + duk_push_uint(ctx, (duk_uint_t) DUK_HOBJECT_GET_HSIZE(h_obj)); + if (DUK_HOBJECT_IS_COMPILEDFUNCTION(h_obj)) { + duk_hbuffer *h_data = (duk_hbuffer *) DUK_HCOMPILEDFUNCTION_GET_DATA(thr->heap, (duk_hcompiledfunction *) h_obj); + if (h_data) { + duk_push_uint(ctx, (duk_uint_t) DUK_HBUFFER_GET_SIZE(h_data)); + } else { + duk_push_uint(ctx, 0); + } + } + break; + } + case DUK_HTYPE_BUFFER: { + duk_hbuffer *h_buf = (duk_hbuffer *) h; + if (DUK_HBUFFER_HAS_DYNAMIC(h_buf)) { + if (DUK_HBUFFER_HAS_EXTERNAL(h_buf)) { + duk_push_uint(ctx, (duk_uint_t) (sizeof(duk_hbuffer_external))); + } else { + /* When alloc_size == 0 the second allocation may not + * actually exist. + */ + duk_push_uint(ctx, (duk_uint_t) (sizeof(duk_hbuffer_dynamic))); + } + duk_push_uint(ctx, (duk_uint_t) (DUK_HBUFFER_GET_SIZE(h_buf))); + } else { + duk_push_uint(ctx, (duk_uint_t) (sizeof(duk_hbuffer_fixed) + DUK_HBUFFER_GET_SIZE(h_buf) + 1)); + } + break; + + } + } + + done: + /* set values into ret array */ + /* XXX: primitive to make array from valstack slice */ + n = duk_get_top(ctx); + for (i = 2; i < n; i++) { + duk_dup(ctx, i); + duk_put_prop_index(ctx, 1, i - 2); + } + duk_dup(ctx, 1); + return 1; +} + +DUK_INTERNAL duk_ret_t duk_bi_duktape_object_act(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_activation *act; + duk_uint_fast32_t pc; + duk_uint_fast32_t line; + duk_int_t level; + + /* -1 = top callstack entry, callstack[callstack_top - 1] + * -callstack_top = bottom callstack entry, callstack[0] + */ + level = duk_to_int(ctx, 0); + if (level >= 0 || -level > (duk_int_t) thr->callstack_top) { + return 0; + } + DUK_ASSERT(level >= -((duk_int_t) thr->callstack_top) && level <= -1); + act = thr->callstack + thr->callstack_top + level; + + duk_push_object(ctx); + + duk_push_tval(ctx, &act->tv_func); + + /* Relevant PC is just before current one because PC is + * post-incremented. This should match what error augment + * code does. + */ + pc = duk_hthread_get_act_prev_pc(thr, act); + duk_push_uint(ctx, (duk_uint_t) pc); + +#if defined(DUK_USE_PC2LINE) + line = duk_hobject_pc2line_query(ctx, -2, pc); +#else + line = 0; +#endif + duk_push_uint(ctx, (duk_uint_t) line); + + /* Providing access to e.g. act->lex_env would be dangerous: these + * internal structures must never be accessible to the application. + * Duktape relies on them having consistent data, and this consistency + * is only asserted for, not checked for. + */ + + /* [ level obj func pc line ] */ + + /* XXX: version specific array format instead? */ + duk_xdef_prop_stridx_wec(ctx, -4, DUK_STRIDX_LINE_NUMBER); + duk_xdef_prop_stridx_wec(ctx, -3, DUK_STRIDX_PC); + duk_xdef_prop_stridx_wec(ctx, -2, DUK_STRIDX_LC_FUNCTION); + return 1; +} + +DUK_INTERNAL duk_ret_t duk_bi_duktape_object_gc(duk_context *ctx) { +#ifdef DUK_USE_MARK_AND_SWEEP + duk_hthread *thr = (duk_hthread *) ctx; + duk_small_uint_t flags; + duk_bool_t rc; + + flags = (duk_small_uint_t) duk_get_uint(ctx, 0); + rc = duk_heap_mark_and_sweep(thr->heap, flags); + + /* XXX: Not sure what the best return value would be in the API. + * Return a boolean for now. Note that rc == 0 is success (true). + */ + duk_push_boolean(ctx, !rc); + return 1; +#else + DUK_UNREF(ctx); + return 0; +#endif +} + +DUK_INTERNAL duk_ret_t duk_bi_duktape_object_fin(duk_context *ctx) { + (void) duk_require_hobject(ctx, 0); + if (duk_get_top(ctx) >= 2) { + /* Set: currently a finalizer is disabled by setting it to + * undefined; this does not remove the property at the moment. + * The value could be type checked to be either a function + * or something else; if something else, the property could + * be deleted. + */ + duk_set_top(ctx, 2); + (void) duk_put_prop_stridx(ctx, 0, DUK_STRIDX_INT_FINALIZER); + return 0; + } else { + /* Get. */ + DUK_ASSERT(duk_get_top(ctx) == 1); + duk_get_prop_stridx(ctx, 0, DUK_STRIDX_INT_FINALIZER); + return 1; + } +} + +DUK_INTERNAL duk_ret_t duk_bi_duktape_object_enc(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hstring *h_str; + + /* Vararg function: must be careful to check/require arguments. + * The JSON helpers accept invalid indices and treat them like + * non-existent optional parameters. + */ + + h_str = duk_require_hstring(ctx, 0); + duk_require_valid_index(ctx, 1); + + if (h_str == DUK_HTHREAD_STRING_HEX(thr)) { + duk_set_top(ctx, 2); + duk_hex_encode(ctx, 1); + DUK_ASSERT_TOP(ctx, 2); + } else if (h_str == DUK_HTHREAD_STRING_BASE64(thr)) { + duk_set_top(ctx, 2); + duk_base64_encode(ctx, 1); + DUK_ASSERT_TOP(ctx, 2); +#ifdef DUK_USE_JX + } else if (h_str == DUK_HTHREAD_STRING_JX(thr)) { + duk_bi_json_stringify_helper(ctx, + 1 /*idx_value*/, + 2 /*idx_replacer*/, + 3 /*idx_space*/, + DUK_JSON_FLAG_EXT_CUSTOM | + DUK_JSON_FLAG_ASCII_ONLY | + DUK_JSON_FLAG_AVOID_KEY_QUOTES /*flags*/); +#endif +#ifdef DUK_USE_JC + } else if (h_str == DUK_HTHREAD_STRING_JC(thr)) { + duk_bi_json_stringify_helper(ctx, + 1 /*idx_value*/, + 2 /*idx_replacer*/, + 3 /*idx_space*/, + DUK_JSON_FLAG_EXT_COMPATIBLE | + DUK_JSON_FLAG_ASCII_ONLY /*flags*/); +#endif + } else { + return DUK_RET_TYPE_ERROR; + } + return 1; +} + +DUK_INTERNAL duk_ret_t duk_bi_duktape_object_dec(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hstring *h_str; + + /* Vararg function: must be careful to check/require arguments. + * The JSON helpers accept invalid indices and treat them like + * non-existent optional parameters. + */ + + h_str = duk_require_hstring(ctx, 0); + duk_require_valid_index(ctx, 1); + + if (h_str == DUK_HTHREAD_STRING_HEX(thr)) { + duk_set_top(ctx, 2); + duk_hex_decode(ctx, 1); + DUK_ASSERT_TOP(ctx, 2); + } else if (h_str == DUK_HTHREAD_STRING_BASE64(thr)) { + duk_set_top(ctx, 2); + duk_base64_decode(ctx, 1); + DUK_ASSERT_TOP(ctx, 2); +#ifdef DUK_USE_JX + } else if (h_str == DUK_HTHREAD_STRING_JX(thr)) { + duk_bi_json_parse_helper(ctx, + 1 /*idx_value*/, + 2 /*idx_replacer*/, + DUK_JSON_FLAG_EXT_CUSTOM /*flags*/); +#endif +#ifdef DUK_USE_JC + } else if (h_str == DUK_HTHREAD_STRING_JC(thr)) { + duk_bi_json_parse_helper(ctx, + 1 /*idx_value*/, + 2 /*idx_replacer*/, + DUK_JSON_FLAG_EXT_COMPATIBLE /*flags*/); +#endif + } else { + return DUK_RET_TYPE_ERROR; + } + return 1; +} + +/* + * Compact an object + */ + +DUK_INTERNAL duk_ret_t duk_bi_duktape_object_compact(duk_context *ctx) { + DUK_ASSERT_TOP(ctx, 1); + duk_compact(ctx, 0); + return 1; /* return the argument object */ +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_error.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_error.c new file mode 100644 index 00000000..fadc26ab --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_error.c @@ -0,0 +1,340 @@ +/* + * Error built-ins + */ + +#include "duk_internal.h" + +DUK_INTERNAL duk_ret_t duk_bi_error_constructor_shared(duk_context *ctx) { + /* Behavior for constructor and non-constructor call is + * the same except for augmenting the created error. When + * called as a constructor, the caller (duk_new()) will handle + * augmentation; when called as normal function, we need to do + * it here. + */ + + duk_hthread *thr = (duk_hthread *) ctx; + duk_small_int_t bidx_prototype = duk_get_current_magic(ctx); + + /* same for both error and each subclass like TypeError */ + duk_uint_t flags_and_class = DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_ERROR); + + DUK_UNREF(thr); + + duk_push_object_helper(ctx, flags_and_class, bidx_prototype); + + /* If message is undefined, the own property 'message' is not set at + * all to save property space. An empty message is inherited anyway. + */ + if (!duk_is_undefined(ctx, 0)) { + duk_to_string(ctx, 0); + duk_dup(ctx, 0); /* [ message error message ] */ + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_MESSAGE, DUK_PROPDESC_FLAGS_WC); + } + + /* Augment the error if called as a normal function. __FILE__ and __LINE__ + * are not desirable in this case. + */ + +#ifdef DUK_USE_AUGMENT_ERROR_CREATE + if (!duk_is_constructor_call(ctx)) { + duk_err_augment_error_create(thr, thr, NULL, 0, 1 /*noblame_fileline*/); + } +#endif + + return 1; +} + +DUK_INTERNAL duk_ret_t duk_bi_error_prototype_to_string(duk_context *ctx) { + /* XXX: optimize with more direct internal access */ + + duk_push_this(ctx); + (void) duk_require_hobject_or_lfunc_coerce(ctx, -1); + + /* [ ... this ] */ + + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_NAME); + if (duk_is_undefined(ctx, -1)) { + duk_pop(ctx); + duk_push_string(ctx, "Error"); + } else { + duk_to_string(ctx, -1); + } + + /* [ ... this name ] */ + + /* XXX: Are steps 6 and 7 in E5 Section 15.11.4.4 duplicated by + * accident or are they actually needed? The first ToString() + * could conceivably return 'undefined'. + */ + duk_get_prop_stridx(ctx, -2, DUK_STRIDX_MESSAGE); + if (duk_is_undefined(ctx, -1)) { + duk_pop(ctx); + duk_push_string(ctx, ""); + } else { + duk_to_string(ctx, -1); + } + + /* [ ... this name message ] */ + + if (duk_get_length(ctx, -2) == 0) { + /* name is empty -> return message */ + return 1; + } + if (duk_get_length(ctx, -1) == 0) { + /* message is empty -> return name */ + duk_pop(ctx); + return 1; + } + duk_push_string(ctx, ": "); + duk_insert(ctx, -2); /* ... name ': ' message */ + duk_concat(ctx, 3); + + return 1; +} + +#ifdef DUK_USE_TRACEBACKS + +/* + * Traceback handling + * + * The unified helper decodes the traceback and produces various requested + * outputs. It should be optimized for size, and may leave garbage on stack, + * only the topmost return value matters. For instance, traceback separator + * and decoded strings are pushed even when looking for filename only. + * + * NOTE: although _Tracedata is an internal property, user code can currently + * write to the array (or replace it with something other than an array). + * The code below must tolerate arbitrary _Tracedata. It can throw errors + * etc, but cannot cause a segfault or memory unsafe behavior. + */ + +/* constants arbitrary, chosen for small loads */ +#define DUK__OUTPUT_TYPE_TRACEBACK (-1) +#define DUK__OUTPUT_TYPE_FILENAME 0 +#define DUK__OUTPUT_TYPE_LINENUMBER 1 + +DUK_LOCAL duk_ret_t duk__traceback_getter_helper(duk_context *ctx, duk_small_int_t output_type) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_idx_t idx_td; + duk_small_int_t i; /* traceback depth fits into 16 bits */ + duk_small_int_t t; /* stack type fits into 16 bits */ + const char *str_tailcalled = " tailcalled"; + const char *str_strict = " strict"; + const char *str_construct = " construct"; + const char *str_prevyield = " preventsyield"; + const char *str_directeval = " directeval"; + const char *str_empty = ""; + + DUK_ASSERT_TOP(ctx, 0); /* fixed arg count */ + + duk_push_this(ctx); + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_INT_TRACEDATA); + idx_td = duk_get_top_index(ctx); + + duk_push_hstring_stridx(ctx, DUK_STRIDX_NEWLINE_TAB); + duk_push_this(ctx); + + /* [ ... this tracedata sep this ] */ + + /* XXX: skip null filename? */ + + if (duk_check_type(ctx, idx_td, DUK_TYPE_OBJECT)) { + /* Current tracedata contains 2 entries per callstack entry. */ + for (i = 0; ; i += 2) { + duk_int_t pc; + duk_int_t line; + duk_int_t flags; + duk_double_t d; + const char *funcname; + const char *filename; + duk_hobject *h_func; + duk_hstring *h_name; + + duk_require_stack(ctx, 5); + duk_get_prop_index(ctx, idx_td, i); + duk_get_prop_index(ctx, idx_td, i + 1); + d = duk_to_number(ctx, -1); + pc = (duk_int_t) DUK_FMOD(d, DUK_DOUBLE_2TO32); + flags = (duk_int_t) DUK_FLOOR(d / DUK_DOUBLE_2TO32); + t = (duk_small_int_t) duk_get_type(ctx, -2); + + if (t == DUK_TYPE_OBJECT || t == DUK_TYPE_LIGHTFUNC) { + /* + * Ecmascript/native function call or lightfunc call + */ + + /* [ ... v1(func) v2(pc+flags) ] */ + + h_func = duk_get_hobject(ctx, -2); /* NULL for lightfunc */ + + duk_get_prop_stridx(ctx, -2, DUK_STRIDX_NAME); + duk_get_prop_stridx(ctx, -3, DUK_STRIDX_FILE_NAME); + +#if defined(DUK_USE_PC2LINE) + line = duk_hobject_pc2line_query(ctx, -4, (duk_uint_fast32_t) pc); +#else + line = 0; +#endif + + /* [ ... v1 v2 name filename ] */ + + if (output_type == DUK__OUTPUT_TYPE_FILENAME) { + return 1; + } else if (output_type == DUK__OUTPUT_TYPE_LINENUMBER) { + duk_push_int(ctx, line); + return 1; + } + + h_name = duk_get_hstring(ctx, -2); /* may be NULL */ + funcname = (h_name == NULL || h_name == DUK_HTHREAD_STRING_EMPTY_STRING(thr)) ? + "anon" : (const char *) DUK_HSTRING_GET_DATA(h_name); + filename = duk_get_string(ctx, -1); + filename = filename ? filename : ""; + DUK_ASSERT(funcname != NULL); + DUK_ASSERT(filename != NULL); + + if (h_func == NULL) { + duk_push_sprintf(ctx, "%s light%s%s%s%s%s", + (const char *) funcname, + (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty), + (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcalled : str_empty), + (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty), + (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty), + (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty)); + } else if (DUK_HOBJECT_HAS_NATIVEFUNCTION(h_func)) { + duk_push_sprintf(ctx, "%s %s native%s%s%s%s%s", + (const char *) funcname, + (const char *) filename, + (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty), + (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcalled : str_empty), + (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty), + (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty), + (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty)); + } else { + duk_push_sprintf(ctx, "%s %s:%ld%s%s%s%s%s", + (const char *) funcname, + (const char *) filename, + (long) line, + (const char *) ((flags & DUK_ACT_FLAG_STRICT) ? str_strict : str_empty), + (const char *) ((flags & DUK_ACT_FLAG_TAILCALLED) ? str_tailcalled : str_empty), + (const char *) ((flags & DUK_ACT_FLAG_CONSTRUCT) ? str_construct : str_empty), + (const char *) ((flags & DUK_ACT_FLAG_DIRECT_EVAL) ? str_directeval : str_empty), + (const char *) ((flags & DUK_ACT_FLAG_PREVENT_YIELD) ? str_prevyield : str_empty)); + } + duk_replace(ctx, -5); /* [ ... v1 v2 name filename str ] -> [ ... str v2 name filename ] */ + duk_pop_n(ctx, 3); /* -> [ ... str ] */ + } else if (t == DUK_TYPE_STRING) { + /* + * __FILE__ / __LINE__ entry, here 'pc' is line number directly. + * Sometimes __FILE__ / __LINE__ is reported as the source for + * the error (fileName, lineNumber), sometimes not. + */ + + /* [ ... v1(filename) v2(line+flags) ] */ + + if (!(flags & DUK_TB_FLAG_NOBLAME_FILELINE)) { + if (output_type == DUK__OUTPUT_TYPE_FILENAME) { + duk_pop(ctx); + return 1; + } else if (output_type == DUK__OUTPUT_TYPE_LINENUMBER) { + duk_push_int(ctx, pc); + return 1; + } + } + + duk_push_sprintf(ctx, "%s:%ld", + (const char *) duk_get_string(ctx, -2), (long) pc); + duk_replace(ctx, -3); /* [ ... v1 v2 str ] -> [ ... str v2 ] */ + duk_pop(ctx); /* -> [ ... str ] */ + } else { + /* unknown, ignore */ + duk_pop_2(ctx); + break; + } + } + + if (i >= DUK_USE_TRACEBACK_DEPTH * 2) { + /* Possibly truncated; there is no explicit truncation + * marker so this is the best we can do. + */ + + duk_push_hstring_stridx(ctx, DUK_STRIDX_BRACKETED_ELLIPSIS); + } + } + + /* [ ... this tracedata sep this str1 ... strN ] */ + + if (output_type != DUK__OUTPUT_TYPE_TRACEBACK) { + return 0; + } else { + /* The 'this' after 'sep' will get ToString() coerced by + * duk_join() automatically. We don't want to do that + * coercion when providing .fileName or .lineNumber (GH-254). + */ + duk_join(ctx, duk_get_top(ctx) - (idx_td + 2) /*count, not including sep*/); + return 1; + } +} + +/* XXX: output type could be encoded into native function 'magic' value to + * save space. + */ + +DUK_INTERNAL duk_ret_t duk_bi_error_prototype_stack_getter(duk_context *ctx) { + return duk__traceback_getter_helper(ctx, DUK__OUTPUT_TYPE_TRACEBACK); +} + +DUK_INTERNAL duk_ret_t duk_bi_error_prototype_filename_getter(duk_context *ctx) { + return duk__traceback_getter_helper(ctx, DUK__OUTPUT_TYPE_FILENAME); +} + +DUK_INTERNAL duk_ret_t duk_bi_error_prototype_linenumber_getter(duk_context *ctx) { + return duk__traceback_getter_helper(ctx, DUK__OUTPUT_TYPE_LINENUMBER); +} + +#undef DUK__OUTPUT_TYPE_TRACEBACK +#undef DUK__OUTPUT_TYPE_FILENAME +#undef DUK__OUTPUT_TYPE_LINENUMBER + +#else /* DUK_USE_TRACEBACKS */ + +/* + * Traceback handling when tracebacks disabled. + * + * The fileName / lineNumber stubs are now necessary because built-in + * data will include the accessor properties in Error.prototype. If those + * are removed for builds without tracebacks, these can also be removed. + * 'stack' should still be present and produce a ToString() equivalent: + * this is useful for user code which prints a stacktrace and expects to + * see something useful. A normal stacktrace also begins with a ToString() + * of the error so this makes sense. + */ + +DUK_INTERNAL duk_ret_t duk_bi_error_prototype_stack_getter(duk_context *ctx) { + /* XXX: remove this native function and map 'stack' accessor + * to the toString() implementation directly. + */ + return duk_bi_error_prototype_to_string(ctx); +} + +DUK_INTERNAL duk_ret_t duk_bi_error_prototype_filename_getter(duk_context *ctx) { + DUK_UNREF(ctx); + return 0; +} + +DUK_INTERNAL duk_ret_t duk_bi_error_prototype_linenumber_getter(duk_context *ctx) { + DUK_UNREF(ctx); + return 0; +} + +#endif /* DUK_USE_TRACEBACKS */ + +DUK_INTERNAL duk_ret_t duk_bi_error_prototype_nop_setter(duk_context *ctx) { + /* Attempt to write 'stack', 'fileName', 'lineNumber' is a silent no-op. + * User can use Object.defineProperty() to override this behavior. + */ + DUK_ASSERT_TOP(ctx, 1); /* fixed arg count */ + DUK_UNREF(ctx); + return 0; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_function.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_function.c new file mode 100644 index 00000000..e91d129c --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_function.c @@ -0,0 +1,344 @@ +/* + * Function built-ins + */ + +#include "duk_internal.h" + +DUK_INTERNAL duk_ret_t duk_bi_function_constructor(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hstring *h_sourcecode; + duk_idx_t nargs; + duk_idx_t i; + duk_small_uint_t comp_flags; + duk_hcompiledfunction *func; + duk_hobject *outer_lex_env; + duk_hobject *outer_var_env; + + /* normal and constructor calls have identical semantics */ + + nargs = duk_get_top(ctx); + for (i = 0; i < nargs; i++) { + duk_to_string(ctx, i); + } + + if (nargs == 0) { + duk_push_string(ctx, ""); + duk_push_string(ctx, ""); + } else if (nargs == 1) { + /* XXX: cover this with the generic >1 case? */ + duk_push_string(ctx, ""); + } else { + duk_insert(ctx, 0); /* [ arg1 ... argN-1 body] -> [body arg1 ... argN-1] */ + duk_push_string(ctx, ","); + duk_insert(ctx, 1); + duk_join(ctx, nargs - 1); + } + + /* [ body formals ], formals is comma separated list that needs to be parsed */ + + DUK_ASSERT_TOP(ctx, 2); + + /* XXX: this placeholder is not always correct, but use for now. + * It will fail in corner cases; see test-dev-func-cons-args.js. + */ + duk_push_string(ctx, "function("); + duk_dup(ctx, 1); + duk_push_string(ctx, "){"); + duk_dup(ctx, 0); + duk_push_string(ctx, "}"); + duk_concat(ctx, 5); + + /* [ body formals source ] */ + + DUK_ASSERT_TOP(ctx, 3); + + /* strictness is not inherited, intentional */ + comp_flags = DUK_JS_COMPILE_FLAG_FUNCEXPR; + + duk_push_hstring_stridx(ctx, DUK_STRIDX_COMPILE); /* XXX: copy from caller? */ /* XXX: ignored now */ + h_sourcecode = duk_require_hstring(ctx, -2); + duk_js_compile(thr, + (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h_sourcecode), + (duk_size_t) DUK_HSTRING_GET_BYTELEN(h_sourcecode), + comp_flags); + func = (duk_hcompiledfunction *) duk_get_hobject(ctx, -1); + DUK_ASSERT(func != NULL); + DUK_ASSERT(DUK_HOBJECT_IS_COMPILEDFUNCTION((duk_hobject *) func)); + + /* [ body formals source template ] */ + + /* only outer_lex_env matters, as functions always get a new + * variable declaration environment. + */ + + outer_lex_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; + outer_var_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; + + duk_js_push_closure(thr, func, outer_var_env, outer_lex_env); + + /* [ body formals source template closure ] */ + + return 1; +} + +DUK_INTERNAL duk_ret_t duk_bi_function_prototype(duk_context *ctx) { + /* ignore arguments, return undefined (E5 Section 15.3.4) */ + DUK_UNREF(ctx); + return 0; +} + +DUK_INTERNAL duk_ret_t duk_bi_function_prototype_to_string(duk_context *ctx) { + duk_tval *tv; + + /* + * E5 Section 15.3.4.2 places few requirements on the output of + * this function: + * + * - The result is an implementation dependent representation + * of the function; in particular + * + * - The result must follow the syntax of a FunctionDeclaration. + * In particular, the function must have a name (even in the + * case of an anonymous function or a function with an empty + * name). + * + * - Note in particular that the output does NOT need to compile + * into anything useful. + */ + + + /* XXX: faster internal way to get this */ + duk_push_this(ctx); + tv = duk_get_tval(ctx, -1); + DUK_ASSERT(tv != NULL); + + if (DUK_TVAL_IS_OBJECT(tv)) { + duk_hobject *obj = DUK_TVAL_GET_OBJECT(tv); + const char *func_name = DUK_STR_ANON; + + /* XXX: rework, it would be nice to avoid C formatting functions to + * ensure there are no Unicode issues. + */ + + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_NAME); + if (!duk_is_undefined(ctx, -1)) { + func_name = duk_to_string(ctx, -1); + DUK_ASSERT(func_name != NULL); + + if (func_name[0] == (char) 0) { + func_name = DUK_STR_ANON; + } + } + + if (DUK_HOBJECT_HAS_COMPILEDFUNCTION(obj)) { + /* XXX: actual source, if available */ + duk_push_sprintf(ctx, "function %s() {/* ecmascript */}", (const char *) func_name); + } else if (DUK_HOBJECT_HAS_NATIVEFUNCTION(obj)) { + duk_push_sprintf(ctx, "function %s() {/* native */}", (const char *) func_name); + } else if (DUK_HOBJECT_HAS_BOUND(obj)) { + duk_push_sprintf(ctx, "function %s() {/* bound */}", (const char *) func_name); + } else { + goto type_error; + } + } else if (DUK_TVAL_IS_LIGHTFUNC(tv)) { + duk_push_lightfunc_tostring(ctx, tv); + } else { + goto type_error; + } + + return 1; + + type_error: + return DUK_RET_TYPE_ERROR; +} + +DUK_INTERNAL duk_ret_t duk_bi_function_prototype_apply(duk_context *ctx) { + duk_idx_t len; + duk_idx_t i; + + DUK_ASSERT_TOP(ctx, 2); /* not a vararg function */ + + duk_push_this(ctx); + if (!duk_is_callable(ctx, -1)) { + DUK_DDD(DUK_DDDPRINT("func is not callable")); + goto type_error; + } + duk_insert(ctx, 0); + DUK_ASSERT_TOP(ctx, 3); + + DUK_DDD(DUK_DDDPRINT("func=%!iT, thisArg=%!iT, argArray=%!iT", + (duk_tval *) duk_get_tval(ctx, 0), + (duk_tval *) duk_get_tval(ctx, 1), + (duk_tval *) duk_get_tval(ctx, 2))); + + /* [ func thisArg argArray ] */ + + if (duk_is_null_or_undefined(ctx, 2)) { + DUK_DDD(DUK_DDDPRINT("argArray is null/undefined, no args")); + len = 0; + } else if (!duk_is_object(ctx, 2)) { + goto type_error; + } else { + DUK_DDD(DUK_DDDPRINT("argArray is an object")); + + /* XXX: make this an internal helper */ + duk_get_prop_stridx(ctx, 2, DUK_STRIDX_LENGTH); + len = (duk_idx_t) duk_to_uint32(ctx, -1); /* ToUint32() coercion required */ + duk_pop(ctx); + + duk_require_stack(ctx, len); + + DUK_DDD(DUK_DDDPRINT("argArray length is %ld", (long) len)); + for (i = 0; i < len; i++) { + duk_get_prop_index(ctx, 2, i); + } + } + duk_remove(ctx, 2); + DUK_ASSERT_TOP(ctx, 2 + len); + + /* [ func thisArg arg1 ... argN ] */ + + DUK_DDD(DUK_DDDPRINT("apply, func=%!iT, thisArg=%!iT, len=%ld", + (duk_tval *) duk_get_tval(ctx, 0), + (duk_tval *) duk_get_tval(ctx, 1), + (long) len)); + duk_call_method(ctx, len); + return 1; + + type_error: + return DUK_RET_TYPE_ERROR; +} + +DUK_INTERNAL duk_ret_t duk_bi_function_prototype_call(duk_context *ctx) { + duk_idx_t nargs; + + /* Step 1 is not necessary because duk_call_method() will take + * care of it. + */ + + /* vararg function, thisArg needs special handling */ + nargs = duk_get_top(ctx); /* = 1 + arg count */ + if (nargs == 0) { + duk_push_undefined(ctx); + nargs++; + } + DUK_ASSERT(nargs >= 1); + + /* [ thisArg arg1 ... argN ] */ + + duk_push_this(ctx); /* 'func' in the algorithm */ + duk_insert(ctx, 0); + + /* [ func thisArg arg1 ... argN ] */ + + DUK_DDD(DUK_DDDPRINT("func=%!iT, thisArg=%!iT, argcount=%ld, top=%ld", + (duk_tval *) duk_get_tval(ctx, 0), + (duk_tval *) duk_get_tval(ctx, 1), + (long) (nargs - 1), + (long) duk_get_top(ctx))); + duk_call_method(ctx, nargs - 1); + return 1; +} + +/* XXX: the implementation now assumes "chained" bound functions, + * whereas "collapsed" bound functions (where there is ever only + * one bound function which directly points to a non-bound, final + * function) would require a "collapsing" implementation which + * merges argument lists etc here. + */ +DUK_INTERNAL duk_ret_t duk_bi_function_prototype_bind(duk_context *ctx) { + duk_hobject *h_bound; + duk_hobject *h_target; + duk_idx_t nargs; + duk_idx_t i; + + /* vararg function, careful arg handling (e.g. thisArg may not be present) */ + nargs = duk_get_top(ctx); /* = 1 + arg count */ + if (nargs == 0) { + duk_push_undefined(ctx); + nargs++; + } + DUK_ASSERT(nargs >= 1); + + duk_push_this(ctx); + if (!duk_is_callable(ctx, -1)) { + DUK_DDD(DUK_DDDPRINT("func is not callable")); + goto type_error; + } + + /* [ thisArg arg1 ... argN func ] (thisArg+args == nargs total) */ + DUK_ASSERT_TOP(ctx, nargs + 1); + + /* create bound function object */ + duk_push_object_helper(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_FLAG_BOUND | + DUK_HOBJECT_FLAG_CONSTRUCTABLE | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_FUNCTION), + DUK_BIDX_FUNCTION_PROTOTYPE); + h_bound = duk_get_hobject(ctx, -1); + DUK_ASSERT(h_bound != NULL); + + /* [ thisArg arg1 ... argN func boundFunc ] */ + duk_dup(ctx, -2); /* func */ + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_INT_TARGET, DUK_PROPDESC_FLAGS_NONE); + + duk_dup(ctx, 0); /* thisArg */ + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_INT_THIS, DUK_PROPDESC_FLAGS_NONE); + + duk_push_array(ctx); + + /* [ thisArg arg1 ... argN func boundFunc argArray ] */ + + for (i = 0; i < nargs - 1; i++) { + duk_dup(ctx, 1 + i); + duk_put_prop_index(ctx, -2, i); + } + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_INT_ARGS, DUK_PROPDESC_FLAGS_NONE); + + /* [ thisArg arg1 ... argN func boundFunc ] */ + + /* bound function 'length' property is interesting */ + h_target = duk_get_hobject(ctx, -2); + if (h_target == NULL || /* lightfunc */ + DUK_HOBJECT_GET_CLASS_NUMBER(h_target) == DUK_HOBJECT_CLASS_FUNCTION) { + /* For lightfuncs, simply read the virtual property. */ + duk_int_t tmp; + duk_get_prop_stridx(ctx, -2, DUK_STRIDX_LENGTH); + tmp = duk_to_int(ctx, -1) - (nargs - 1); /* step 15.a */ + duk_pop(ctx); + duk_push_int(ctx, (tmp < 0 ? 0 : tmp)); + } else { + duk_push_int(ctx, 0); + } + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_LENGTH, DUK_PROPDESC_FLAGS_NONE); /* attrs in E5 Section 15.3.5.1 */ + + /* caller and arguments must use the same thrower, [[ThrowTypeError]] */ + duk_xdef_prop_stridx_thrower(ctx, -1, DUK_STRIDX_CALLER, DUK_PROPDESC_FLAGS_NONE); + duk_xdef_prop_stridx_thrower(ctx, -1, DUK_STRIDX_LC_ARGUMENTS, DUK_PROPDESC_FLAGS_NONE); + + /* these non-standard properties are copied for convenience */ + /* XXX: 'copy properties' API call? */ + duk_get_prop_stridx(ctx, -2, DUK_STRIDX_NAME); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_NAME, DUK_PROPDESC_FLAGS_WC); + duk_get_prop_stridx(ctx, -2, DUK_STRIDX_FILE_NAME); + duk_xdef_prop_stridx(ctx, -2, DUK_STRIDX_FILE_NAME, DUK_PROPDESC_FLAGS_WC); + + /* The 'strict' flag is copied to get the special [[Get]] of E5.1 + * Section 15.3.5.4 to apply when a 'caller' value is a strict bound + * function. Not sure if this is correct, because the specification + * is a bit ambiguous on this point but it would make sense. + */ + if (h_target == NULL) { + /* Lightfuncs are always strict. */ + DUK_HOBJECT_SET_STRICT(h_bound); + } else if (DUK_HOBJECT_HAS_STRICT(h_target)) { + DUK_HOBJECT_SET_STRICT(h_bound); + } + DUK_DDD(DUK_DDDPRINT("created bound function: %!iT", (duk_tval *) duk_get_tval(ctx, -1))); + + return 1; + + type_error: + return DUK_RET_TYPE_ERROR; +} diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_global.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_global.c new file mode 100644 index 00000000..bec82f88 --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_global.c @@ -0,0 +1,1207 @@ +/* + * Global object built-ins + */ + +#include "duk_internal.h" + +/* + * Encoding/decoding helpers + */ + +/* XXX: Could add fast path (for each transform callback) with direct byte + * lookups (no shifting) and no explicit check for x < 0x80 before table + * lookup. + */ + +/* Macros for creating and checking bitmasks for character encoding. + * Bit number is a bit counterintuitive, but minimizes code size. + */ +#define DUK__MKBITS(a,b,c,d,e,f,g,h) ((duk_uint8_t) ( \ + ((a) << 0) | ((b) << 1) | ((c) << 2) | ((d) << 3) | \ + ((e) << 4) | ((f) << 5) | ((g) << 6) | ((h) << 7) \ + )) +#define DUK__CHECK_BITMASK(table,cp) ((table)[(cp) >> 3] & (1 << ((cp) & 0x07))) + +/* E5.1 Section 15.1.3.3: uriReserved + uriUnescaped + '#' */ +DUK_LOCAL const duk_uint8_t duk__encode_uriunescaped_table[16] = { + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ + DUK__MKBITS(0, 1, 0, 1, 1, 0, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x20-0x2f */ + DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 0, 1, 0, 1), /* 0x30-0x3f */ + DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x40-0x4f */ + DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1), /* 0x50-0x5f */ + DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x60-0x6f */ + DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 1, 0), /* 0x70-0x7f */ +}; + +/* E5.1 Section 15.1.3.4: uriUnescaped */ +DUK_LOCAL const duk_uint8_t duk__encode_uricomponent_unescaped_table[16] = { + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ + DUK__MKBITS(0, 1, 0, 0, 0, 0, 0, 1), DUK__MKBITS(1, 1, 1, 0, 0, 1, 1, 0), /* 0x20-0x2f */ + DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 0, 0, 0, 0, 0, 0), /* 0x30-0x3f */ + DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x40-0x4f */ + DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1), /* 0x50-0x5f */ + DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x60-0x6f */ + DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 1, 0), /* 0x70-0x7f */ +}; + +/* E5.1 Section 15.1.3.1: uriReserved + '#' */ +DUK_LOCAL const duk_uint8_t duk__decode_uri_reserved_table[16] = { + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ + DUK__MKBITS(0, 0, 0, 1, 1, 0, 1, 0), DUK__MKBITS(0, 0, 0, 1, 1, 0, 0, 1), /* 0x20-0x2f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 1, 1, 0, 1, 0, 1), /* 0x30-0x3f */ + DUK__MKBITS(1, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x40-0x4f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x50-0x5f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x60-0x6f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x70-0x7f */ +}; + +/* E5.1 Section 15.1.3.2: empty */ +DUK_LOCAL const duk_uint8_t duk__decode_uri_component_reserved_table[16] = { + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x20-0x2f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x30-0x3f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x40-0x4f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x50-0x5f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x60-0x6f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x70-0x7f */ +}; + +#ifdef DUK_USE_SECTION_B +/* E5.1 Section B.2.2, step 7. */ +DUK_LOCAL const duk_uint8_t duk__escape_unescaped_table[16] = { + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x00-0x0f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), /* 0x10-0x1f */ + DUK__MKBITS(0, 0, 0, 0, 0, 0, 0, 0), DUK__MKBITS(0, 0, 1, 1, 0, 1, 1, 1), /* 0x20-0x2f */ + DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 0, 0, 0, 0, 0, 0), /* 0x30-0x3f */ + DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x40-0x4f */ + DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 1), /* 0x50-0x5f */ + DUK__MKBITS(0, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), /* 0x60-0x6f */ + DUK__MKBITS(1, 1, 1, 1, 1, 1, 1, 1), DUK__MKBITS(1, 1, 1, 0, 0, 0, 0, 0) /* 0x70-0x7f */ +}; +#endif /* DUK_USE_SECTION_B */ + +#undef DUK__MKBITS + +typedef struct { + duk_hthread *thr; + duk_hstring *h_str; + duk_bufwriter_ctx bw; + const duk_uint8_t *p; + const duk_uint8_t *p_start; + const duk_uint8_t *p_end; +} duk__transform_context; + +typedef void (*duk__transform_callback)(duk__transform_context *tfm_ctx, void *udata, duk_codepoint_t cp); + +/* XXX: refactor and share with other code */ +DUK_LOCAL duk_small_int_t duk__decode_hex_escape(const duk_uint8_t *p, duk_small_int_t n) { + duk_small_int_t ch; + duk_small_int_t t = 0; + + while (n > 0) { + t = t * 16; + ch = (duk_small_int_t) duk_hex_dectab[*p++]; + if (DUK_LIKELY(ch >= 0)) { + t += ch; + } else { + return -1; + } + n--; + } + return t; +} + +DUK_LOCAL int duk__transform_helper(duk_context *ctx, duk__transform_callback callback, void *udata) { + duk_hthread *thr = (duk_hthread *) ctx; + duk__transform_context tfm_ctx_alloc; + duk__transform_context *tfm_ctx = &tfm_ctx_alloc; + duk_codepoint_t cp; + + tfm_ctx->thr = thr; + + tfm_ctx->h_str = duk_to_hstring(ctx, 0); + DUK_ASSERT(tfm_ctx->h_str != NULL); + + DUK_BW_INIT_PUSHBUF(thr, &tfm_ctx->bw, DUK_HSTRING_GET_BYTELEN(tfm_ctx->h_str)); /* initial size guess */ + + tfm_ctx->p_start = DUK_HSTRING_GET_DATA(tfm_ctx->h_str); + tfm_ctx->p_end = tfm_ctx->p_start + DUK_HSTRING_GET_BYTELEN(tfm_ctx->h_str); + tfm_ctx->p = tfm_ctx->p_start; + + while (tfm_ctx->p < tfm_ctx->p_end) { + cp = (duk_codepoint_t) duk_unicode_decode_xutf8_checked(thr, &tfm_ctx->p, tfm_ctx->p_start, tfm_ctx->p_end); + callback(tfm_ctx, udata, cp); + } + + DUK_BW_COMPACT(thr, &tfm_ctx->bw); + + duk_to_string(ctx, -1); + return 1; +} + +DUK_LOCAL void duk__transform_callback_encode_uri(duk__transform_context *tfm_ctx, void *udata, duk_codepoint_t cp) { + duk_uint8_t xutf8_buf[DUK_UNICODE_MAX_XUTF8_LENGTH]; + duk_small_int_t len; + duk_codepoint_t cp1, cp2; + duk_small_int_t i, t; + const duk_uint8_t *unescaped_table = (duk_uint8_t *) udata; + + /* UTF-8 encoded bytes escaped as %xx%xx%xx... -> 3 * nbytes. + * Codepoint range is restricted so this is a slightly too large + * but doesn't matter. + */ + DUK_BW_ENSURE(tfm_ctx->thr, &tfm_ctx->bw, 3 * DUK_UNICODE_MAX_XUTF8_LENGTH); + + if (cp < 0) { + goto uri_error; + } else if ((cp < 0x80L) && DUK__CHECK_BITMASK(unescaped_table, cp)) { + DUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) cp); + return; + } else if (cp >= 0xdc00L && cp <= 0xdfffL) { + goto uri_error; + } else if (cp >= 0xd800L && cp <= 0xdbffL) { + /* Needs lookahead */ + if (duk_unicode_decode_xutf8(tfm_ctx->thr, &tfm_ctx->p, tfm_ctx->p_start, tfm_ctx->p_end, (duk_ucodepoint_t *) &cp2) == 0) { + goto uri_error; + } + if (!(cp2 >= 0xdc00L && cp2 <= 0xdfffL)) { + goto uri_error; + } + cp1 = cp; + cp = ((cp1 - 0xd800L) << 10) + (cp2 - 0xdc00L) + 0x10000L; + } else if (cp > 0x10ffffL) { + /* Although we can allow non-BMP characters (they'll decode + * back into surrogate pairs), we don't allow extended UTF-8 + * characters; they would encode to URIs which won't decode + * back because of strict UTF-8 checks in URI decoding. + * (However, we could just as well allow them here.) + */ + goto uri_error; + } else { + /* Non-BMP characters within valid UTF-8 range: encode as is. + * They'll decode back into surrogate pairs if the escaped + * output is decoded. + */ + ; + } + + len = duk_unicode_encode_xutf8((duk_ucodepoint_t) cp, xutf8_buf); + for (i = 0; i < len; i++) { + t = (int) xutf8_buf[i]; + DUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr, + &tfm_ctx->bw, + DUK_ASC_PERCENT, + (duk_uint8_t) duk_uc_nybbles[t >> 4], + (duk_uint8_t) duk_uc_nybbles[t & 0x0f]); + } + + return; + + uri_error: + DUK_ERROR(tfm_ctx->thr, DUK_ERR_URI_ERROR, "invalid input"); +} + +DUK_LOCAL void duk__transform_callback_decode_uri(duk__transform_context *tfm_ctx, void *udata, duk_codepoint_t cp) { + const duk_uint8_t *reserved_table = (duk_uint8_t *) udata; + duk_small_uint_t utf8_blen; + duk_codepoint_t min_cp; + duk_small_int_t t; /* must be signed */ + duk_small_uint_t i; + + /* Maximum write size: XUTF8 path writes max DUK_UNICODE_MAX_XUTF8_LENGTH, + * percent escape path writes max two times CESU-8 encoded BMP length. + */ + DUK_BW_ENSURE(tfm_ctx->thr, + &tfm_ctx->bw, + (DUK_UNICODE_MAX_XUTF8_LENGTH >= 2 * DUK_UNICODE_MAX_CESU8_BMP_LENGTH ? + DUK_UNICODE_MAX_XUTF8_LENGTH : DUK_UNICODE_MAX_CESU8_BMP_LENGTH)); + + if (cp == (duk_codepoint_t) '%') { + const duk_uint8_t *p = tfm_ctx->p; + duk_size_t left = (duk_size_t) (tfm_ctx->p_end - p); /* bytes left */ + + DUK_DDD(DUK_DDDPRINT("percent encoding, left=%ld", (long) left)); + + if (left < 2) { + goto uri_error; + } + + t = duk__decode_hex_escape(p, 2); + DUK_DDD(DUK_DDDPRINT("first byte: %ld", (long) t)); + if (t < 0) { + goto uri_error; + } + + if (t < 0x80) { + if (DUK__CHECK_BITMASK(reserved_table, t)) { + /* decode '%xx' to '%xx' if decoded char in reserved set */ + DUK_ASSERT(tfm_ctx->p - 1 >= tfm_ctx->p_start); + DUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr, + &tfm_ctx->bw, + DUK_ASC_PERCENT, + p[0], + p[1]); + } else { + DUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) t); + } + tfm_ctx->p += 2; + return; + } + + /* Decode UTF-8 codepoint from a sequence of hex escapes. The + * first byte of the sequence has been decoded to 't'. + * + * Note that UTF-8 validation must be strict according to the + * specification: E5.1 Section 15.1.3, decode algorithm step + * 4.d.vii.8. URIError from non-shortest encodings is also + * specifically noted in the spec. + */ + + DUK_ASSERT(t >= 0x80); + if (t < 0xc0) { + /* continuation byte */ + goto uri_error; + } else if (t < 0xe0) { + /* 110x xxxx; 2 bytes */ + utf8_blen = 2; + min_cp = 0x80L; + cp = t & 0x1f; + } else if (t < 0xf0) { + /* 1110 xxxx; 3 bytes */ + utf8_blen = 3; + min_cp = 0x800L; + cp = t & 0x0f; + } else if (t < 0xf8) { + /* 1111 0xxx; 4 bytes */ + utf8_blen = 4; + min_cp = 0x10000L; + cp = t & 0x07; + } else { + /* extended utf-8 not allowed for URIs */ + goto uri_error; + } + + if (left < utf8_blen * 3 - 1) { + /* '%xx%xx...%xx', p points to char after first '%' */ + goto uri_error; + } + + p += 3; + for (i = 1; i < utf8_blen; i++) { + /* p points to digit part ('%xy', p points to 'x') */ + t = duk__decode_hex_escape(p, 2); + DUK_DDD(DUK_DDDPRINT("i=%ld utf8_blen=%ld cp=%ld t=0x%02lx", + (long) i, (long) utf8_blen, (long) cp, (unsigned long) t)); + if (t < 0) { + goto uri_error; + } + if ((t & 0xc0) != 0x80) { + goto uri_error; + } + cp = (cp << 6) + (t & 0x3f); + p += 3; + } + p--; /* p overshoots */ + tfm_ctx->p = p; + + DUK_DDD(DUK_DDDPRINT("final cp=%ld, min_cp=%ld", (long) cp, (long) min_cp)); + + if (cp < min_cp || cp > 0x10ffffL || (cp >= 0xd800L && cp <= 0xdfffL)) { + goto uri_error; + } + + /* The E5.1 algorithm checks whether or not a decoded codepoint + * is below 0x80 and perhaps may be in the "reserved" set. + * This seems pointless because the single byte UTF-8 case is + * handled separately, and non-shortest encodings are rejected. + * So, 'cp' cannot be below 0x80 here, and thus cannot be in + * the reserved set. + */ + + /* utf-8 validation ensures these */ + DUK_ASSERT(cp >= 0x80L && cp <= 0x10ffffL); + + if (cp >= 0x10000L) { + cp -= 0x10000L; + DUK_ASSERT(cp < 0x100000L); + + DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, ((cp >> 10) + 0xd800L)); + DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, ((cp & 0x03ffUL) + 0xdc00L)); + } else { + DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp); + } + } else { + DUK_BW_WRITE_RAW_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp); + } + return; + + uri_error: + DUK_ERROR(tfm_ctx->thr, DUK_ERR_URI_ERROR, "invalid input"); +} + +#ifdef DUK_USE_SECTION_B +DUK_LOCAL void duk__transform_callback_escape(duk__transform_context *tfm_ctx, void *udata, duk_codepoint_t cp) { + DUK_UNREF(udata); + + DUK_BW_ENSURE(tfm_ctx->thr, &tfm_ctx->bw, 6); + + if (cp < 0) { + goto esc_error; + } else if ((cp < 0x80L) && DUK__CHECK_BITMASK(duk__escape_unescaped_table, cp)) { + DUK_BW_WRITE_RAW_U8(tfm_ctx->thr, &tfm_ctx->bw, (duk_uint8_t) cp); + } else if (cp < 0x100L) { + DUK_BW_WRITE_RAW_U8_3(tfm_ctx->thr, + &tfm_ctx->bw, + (duk_uint8_t) DUK_ASC_PERCENT, + (duk_uint8_t) duk_uc_nybbles[cp >> 4], + (duk_uint8_t) duk_uc_nybbles[cp & 0x0f]); + } else if (cp < 0x10000L) { + DUK_BW_WRITE_RAW_U8_6(tfm_ctx->thr, + &tfm_ctx->bw, + (duk_uint8_t) DUK_ASC_PERCENT, + (duk_uint8_t) DUK_ASC_LC_U, + (duk_uint8_t) duk_uc_nybbles[cp >> 12], + (duk_uint8_t) duk_uc_nybbles[(cp >> 8) & 0x0f], + (duk_uint8_t) duk_uc_nybbles[(cp >> 4) & 0x0f], + (duk_uint8_t) duk_uc_nybbles[cp & 0x0f]); + } else { + /* Characters outside BMP cannot be escape()'d. We could + * encode them as surrogate pairs (for codepoints inside + * valid UTF-8 range, but not extended UTF-8). Because + * escape() and unescape() are legacy functions, we don't. + */ + goto esc_error; + } + + return; + + esc_error: + DUK_ERROR(tfm_ctx->thr, DUK_ERR_TYPE_ERROR, "invalid input"); +} + +DUK_LOCAL void duk__transform_callback_unescape(duk__transform_context *tfm_ctx, void *udata, duk_codepoint_t cp) { + duk_small_int_t t; + + DUK_UNREF(udata); + + if (cp == (duk_codepoint_t) '%') { + const duk_uint8_t *p = tfm_ctx->p; + duk_size_t left = (duk_size_t) (tfm_ctx->p_end - p); /* bytes left */ + + if (left >= 5 && p[0] == 'u' && + ((t = duk__decode_hex_escape(p + 1, 4)) >= 0)) { + cp = (duk_codepoint_t) t; + tfm_ctx->p += 5; + } else if (left >= 2 && + ((t = duk__decode_hex_escape(p, 2)) >= 0)) { + cp = (duk_codepoint_t) t; + tfm_ctx->p += 2; + } + } + + DUK_BW_WRITE_ENSURE_XUTF8(tfm_ctx->thr, &tfm_ctx->bw, cp); +} +#endif /* DUK_USE_SECTION_B */ + +/* + * Eval + * + * Eval needs to handle both a "direct eval" and an "indirect eval". + * Direct eval handling needs access to the caller's activation so that its + * lexical environment can be accessed. A direct eval is only possible from + * Ecmascript code; an indirect eval call is possible also from C code. + * When an indirect eval call is made from C code, there may not be a + * calling activation at all which needs careful handling. + */ + +DUK_INTERNAL duk_ret_t duk_bi_global_object_eval(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_hstring *h; + duk_activation *act_caller; + duk_activation *act_eval; + duk_activation *act; + duk_hcompiledfunction *func; + duk_hobject *outer_lex_env; + duk_hobject *outer_var_env; + duk_bool_t this_to_global = 1; + duk_small_uint_t comp_flags; + + DUK_ASSERT_TOP(ctx, 1); + DUK_ASSERT(thr->callstack_top >= 1); /* at least this function exists */ + DUK_ASSERT(((thr->callstack + thr->callstack_top - 1)->flags & DUK_ACT_FLAG_DIRECT_EVAL) == 0 || /* indirect eval */ + (thr->callstack_top >= 2)); /* if direct eval, calling activation must exist */ + + /* + * callstack_top - 1 --> this function + * callstack_top - 2 --> caller (may not exist) + * + * If called directly from C, callstack_top might be 1. If calling + * activation doesn't exist, call must be indirect. + */ + + h = duk_get_hstring(ctx, 0); + if (!h) { + return 1; /* return arg as-is */ + } + + /* [ source ] */ + + comp_flags = DUK_JS_COMPILE_FLAG_EVAL; + act_eval = thr->callstack + thr->callstack_top - 1; /* this function */ + if (thr->callstack_top >= 2) { + /* Have a calling activation, check for direct eval (otherwise + * assume indirect eval. + */ + act_caller = thr->callstack + thr->callstack_top - 2; /* caller */ + if ((act_caller->flags & DUK_ACT_FLAG_STRICT) && + (act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL)) { + /* Only direct eval inherits strictness from calling code + * (E5.1 Section 10.1.1). + */ + comp_flags |= DUK_JS_COMPILE_FLAG_STRICT; + } + } else { + DUK_ASSERT((act_eval->flags & DUK_ACT_FLAG_DIRECT_EVAL) == 0); + } + act_caller = NULL; /* avoid dereference after potential callstack realloc */ + act_eval = NULL; + + duk_push_hstring_stridx(ctx, DUK_STRIDX_INPUT); /* XXX: copy from caller? */ + duk_js_compile(thr, + (const duk_uint8_t *) DUK_HSTRING_GET_DATA(h), + (duk_size_t) DUK_HSTRING_GET_BYTELEN(h), + comp_flags); + func = (duk_hcompiledfunction *) duk_get_hobject(ctx, -1); + DUK_ASSERT(func != NULL); + DUK_ASSERT(DUK_HOBJECT_IS_COMPILEDFUNCTION((duk_hobject *) func)); + + /* [ source template ] */ + + /* E5 Section 10.4.2 */ + DUK_ASSERT(thr->callstack_top >= 1); + act = thr->callstack + thr->callstack_top - 1; /* this function */ + if (act->flags & DUK_ACT_FLAG_DIRECT_EVAL) { + DUK_ASSERT(thr->callstack_top >= 2); + act = thr->callstack + thr->callstack_top - 2; /* caller */ + if (act->lex_env == NULL) { + DUK_ASSERT(act->var_env == NULL); + DUK_DDD(DUK_DDDPRINT("delayed environment initialization")); + + /* this may have side effects, so re-lookup act */ + duk_js_init_activation_environment_records_delayed(thr, act); + act = thr->callstack + thr->callstack_top - 2; + } + DUK_ASSERT(act->lex_env != NULL); + DUK_ASSERT(act->var_env != NULL); + + this_to_global = 0; + + if (DUK_HOBJECT_HAS_STRICT((duk_hobject *) func)) { + duk_hobject *new_env; + duk_hobject *act_lex_env; + + DUK_DDD(DUK_DDDPRINT("direct eval call to a strict function -> " + "var_env and lex_env to a fresh env, " + "this_binding to caller's this_binding")); + + act = thr->callstack + thr->callstack_top - 2; /* caller */ + act_lex_env = act->lex_env; + act = NULL; /* invalidated */ + + (void) duk_push_object_helper_proto(ctx, + DUK_HOBJECT_FLAG_EXTENSIBLE | + DUK_HOBJECT_CLASS_AS_FLAGS(DUK_HOBJECT_CLASS_DECENV), + act_lex_env); + new_env = duk_require_hobject(ctx, -1); + DUK_ASSERT(new_env != NULL); + DUK_DDD(DUK_DDDPRINT("new_env allocated: %!iO", + (duk_heaphdr *) new_env)); + + outer_lex_env = new_env; + outer_var_env = new_env; + + duk_insert(ctx, 0); /* stash to bottom of value stack to keep new_env reachable */ + + /* compiler's responsibility */ + DUK_ASSERT(DUK_HOBJECT_HAS_NEWENV((duk_hobject *) func)); + } else { + DUK_DDD(DUK_DDDPRINT("direct eval call to a non-strict function -> " + "var_env and lex_env to caller's envs, " + "this_binding to caller's this_binding")); + + outer_lex_env = act->lex_env; + outer_var_env = act->var_env; + + /* compiler's responsibility */ + DUK_ASSERT(!DUK_HOBJECT_HAS_NEWENV((duk_hobject *) func)); + } + } else { + DUK_DDD(DUK_DDDPRINT("indirect eval call -> var_env and lex_env to " + "global object, this_binding to global object")); + + this_to_global = 1; + outer_lex_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; + outer_var_env = thr->builtins[DUK_BIDX_GLOBAL_ENV]; + } + act = NULL; + + duk_js_push_closure(thr, func, outer_var_env, outer_lex_env); + + /* [ source template closure ] */ + + if (this_to_global) { + DUK_ASSERT(thr->builtins[DUK_BIDX_GLOBAL] != NULL); + duk_push_hobject_bidx(ctx, DUK_BIDX_GLOBAL); + } else { + duk_tval *tv; + DUK_ASSERT(thr->callstack_top >= 2); + act = thr->callstack + thr->callstack_top - 2; /* caller */ + tv = thr->valstack + act->idx_bottom - 1; /* this is just beneath bottom */ + DUK_ASSERT(tv >= thr->valstack); + duk_push_tval(ctx, tv); + } + + DUK_DDD(DUK_DDDPRINT("eval -> lex_env=%!iO, var_env=%!iO, this_binding=%!T", + (duk_heaphdr *) outer_lex_env, + (duk_heaphdr *) outer_var_env, + (duk_tval *) duk_get_tval(ctx, -1))); + + /* [ source template closure this ] */ + + duk_call_method(ctx, 0); + + /* [ source template result ] */ + + return 1; +} + +/* + * Parsing of ints and floats + */ + +DUK_INTERNAL duk_ret_t duk_bi_global_object_parse_int(duk_context *ctx) { + duk_bool_t strip_prefix; + duk_int32_t radix; + duk_small_uint_t s2n_flags; + + DUK_ASSERT_TOP(ctx, 2); + duk_to_string(ctx, 0); + + strip_prefix = 1; + radix = duk_to_int32(ctx, 1); + if (radix != 0) { + if (radix < 2 || radix > 36) { + goto ret_nan; + } + /* For octal, setting strip_prefix=0 is not necessary, as zero + * is tolerated anyway: + * + * parseInt('123', 8) === parseInt('0123', 8) with or without strip_prefix + * parseInt('123', 16) === parseInt('0x123', 16) requires strip_prefix = 1 + */ + if (radix != 16) { + strip_prefix = 0; + } + } else { + radix = 10; + } + + s2n_flags = DUK_S2N_FLAG_TRIM_WHITE | + DUK_S2N_FLAG_ALLOW_GARBAGE | + DUK_S2N_FLAG_ALLOW_PLUS | + DUK_S2N_FLAG_ALLOW_MINUS | + DUK_S2N_FLAG_ALLOW_LEADING_ZERO | +#ifdef DUK_USE_OCTAL_SUPPORT + (strip_prefix ? (DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT | DUK_S2N_FLAG_ALLOW_AUTO_OCT_INT) : 0) +#else + (strip_prefix ? DUK_S2N_FLAG_ALLOW_AUTO_HEX_INT : 0) +#endif + ; + + duk_dup(ctx, 0); + duk_numconv_parse(ctx, radix, s2n_flags); + return 1; + + ret_nan: + duk_push_nan(ctx); + return 1; +} + +DUK_INTERNAL duk_ret_t duk_bi_global_object_parse_float(duk_context *ctx) { + duk_small_uint_t s2n_flags; + duk_int32_t radix; + + DUK_ASSERT_TOP(ctx, 1); + duk_to_string(ctx, 0); + + radix = 10; + + /* XXX: check flags */ + s2n_flags = DUK_S2N_FLAG_TRIM_WHITE | + DUK_S2N_FLAG_ALLOW_EXP | + DUK_S2N_FLAG_ALLOW_GARBAGE | + DUK_S2N_FLAG_ALLOW_PLUS | + DUK_S2N_FLAG_ALLOW_MINUS | + DUK_S2N_FLAG_ALLOW_INF | + DUK_S2N_FLAG_ALLOW_FRAC | + DUK_S2N_FLAG_ALLOW_NAKED_FRAC | + DUK_S2N_FLAG_ALLOW_EMPTY_FRAC | + DUK_S2N_FLAG_ALLOW_LEADING_ZERO; + + duk_numconv_parse(ctx, radix, s2n_flags); + return 1; +} + +/* + * Number checkers + */ + +DUK_INTERNAL duk_ret_t duk_bi_global_object_is_nan(duk_context *ctx) { + duk_double_t d = duk_to_number(ctx, 0); + duk_push_boolean(ctx, DUK_ISNAN(d)); + return 1; +} + +DUK_INTERNAL duk_ret_t duk_bi_global_object_is_finite(duk_context *ctx) { + duk_double_t d = duk_to_number(ctx, 0); + duk_push_boolean(ctx, DUK_ISFINITE(d)); + return 1; +} + +/* + * URI handling + */ + +DUK_INTERNAL duk_ret_t duk_bi_global_object_decode_uri(duk_context *ctx) { + return duk__transform_helper(ctx, duk__transform_callback_decode_uri, (void *) duk__decode_uri_reserved_table); +} + +DUK_INTERNAL duk_ret_t duk_bi_global_object_decode_uri_component(duk_context *ctx) { + return duk__transform_helper(ctx, duk__transform_callback_decode_uri, (void *) duk__decode_uri_component_reserved_table); +} + +DUK_INTERNAL duk_ret_t duk_bi_global_object_encode_uri(duk_context *ctx) { + return duk__transform_helper(ctx, duk__transform_callback_encode_uri, (void *) duk__encode_uriunescaped_table); +} + +DUK_INTERNAL duk_ret_t duk_bi_global_object_encode_uri_component(duk_context *ctx) { + return duk__transform_helper(ctx, duk__transform_callback_encode_uri, (void *) duk__encode_uricomponent_unescaped_table); +} + +#ifdef DUK_USE_SECTION_B +DUK_INTERNAL duk_ret_t duk_bi_global_object_escape(duk_context *ctx) { + return duk__transform_helper(ctx, duk__transform_callback_escape, (void *) NULL); +} + +DUK_INTERNAL duk_ret_t duk_bi_global_object_unescape(duk_context *ctx) { + return duk__transform_helper(ctx, duk__transform_callback_unescape, (void *) NULL); +} +#else /* DUK_USE_SECTION_B */ +DUK_INTERNAL duk_ret_t duk_bi_global_object_escape(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} + +DUK_INTERNAL duk_ret_t duk_bi_global_object_unescape(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_SECTION_B */ + +#if defined(DUK_USE_BROWSER_LIKE) && (defined(DUK_USE_FILE_IO) || defined(DUK_USE_DEBUGGER_SUPPORT)) +DUK_INTERNAL duk_ret_t duk_bi_global_object_print_helper(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_int_t magic; + duk_idx_t nargs; + const duk_uint8_t *buf; + duk_size_t sz_buf; + const char nl = (const char) DUK_ASC_LF; +#ifndef DUK_USE_PREFER_SIZE + duk_uint8_t buf_stack[256]; +#endif +#ifdef DUK_USE_FILE_IO + duk_file *f_out; +#endif + + magic = duk_get_current_magic(ctx); + DUK_UNREF(magic); + + nargs = duk_get_top(ctx); + + /* If argument count is 1 and first argument is a buffer, write the buffer + * as raw data into the file without a newline; this allows exact control + * over stdout/stderr without an additional entrypoint (useful for now). + * + * Otherwise current print/alert semantics are to ToString() coerce + * arguments, join them with a single space, and append a newline. + */ + + if (nargs == 1 && duk_is_buffer(ctx, 0)) { + buf = (const duk_uint8_t *) duk_get_buffer(ctx, 0, &sz_buf); + DUK_ASSERT(buf != NULL); + } else if (nargs > 0) { +#ifdef DUK_USE_PREFER_SIZE + /* Compact but lots of churn. */ + duk_push_hstring_stridx(thr, DUK_STRIDX_SPACE); + duk_insert(ctx, 0); + duk_join(ctx, nargs); + duk_push_string(thr, "\n"); + duk_concat(ctx, 2); + buf = (const duk_uint8_t *) duk_get_lstring(ctx, -1, &sz_buf); + DUK_ASSERT(buf != NULL); +#else /* DUK_USE_PREFER_SIZE */ + /* Higher footprint, less churn. */ + duk_idx_t i; + duk_size_t sz_str; + const duk_uint8_t *p_str; + duk_uint8_t *p; + + sz_buf = (duk_size_t) nargs; /* spaces (nargs - 1) + newline */ + for (i = 0; i < nargs; i++) { + (void) duk_to_lstring(ctx, i, &sz_str); + sz_buf += sz_str; + } + + if (sz_buf <= sizeof(buf_stack)) { + buf = (const duk_uint8_t *) buf_stack; + } else { + buf = (const duk_uint8_t *) duk_push_fixed_buffer(ctx, sz_buf); + DUK_ASSERT(buf != NULL); + } + + p = (duk_uint8_t *) buf; + for (i = 0; i < nargs; i++) { + p_str = (const duk_uint8_t *) duk_get_lstring(ctx, i, &sz_str); + DUK_ASSERT(p_str != NULL); + DUK_MEMCPY((void *) p, (const void *) p_str, sz_str); + p += sz_str; + *p++ = (duk_uint8_t) (i == nargs - 1 ? DUK_ASC_LF : DUK_ASC_SPACE); + } + DUK_ASSERT((const duk_uint8_t *) p == buf + sz_total); +#endif /* DUK_USE_PREFER_SIZE */ + } else { + buf = (const duk_uint8_t *) &nl; + sz_buf = 1; + } + + /* 'buf' contains the string to write, 'sz_buf' contains the length + * (which may be zero). + */ + DUK_ASSERT(buf != NULL); + + if (sz_buf == 0) { + return 0; + } + +#ifdef DUK_USE_FILE_IO + f_out = (magic ? DUK_STDERR : DUK_STDOUT); + DUK_FWRITE((const void *) buf, 1, (size_t) sz_buf, f_out); + DUK_FFLUSH(f_out); +#endif + +#if defined(DUK_USE_DEBUGGER_SUPPORT) && defined(DUK_USE_DEBUGGER_FWD_PRINTALERT) + if (DUK_HEAP_IS_DEBUGGER_ATTACHED(thr->heap)) { + duk_debug_write_notify(thr, magic ? DUK_DBG_CMD_ALERT : DUK_DBG_CMD_PRINT); + duk_debug_write_string(thr, (const char *) buf, sz_buf); + duk_debug_write_eom(thr); + } +#endif + return 0; +} +#elif defined(DUK_USE_BROWSER_LIKE) /* print provider */ +DUK_INTERNAL duk_ret_t duk_bi_global_object_print_helper(duk_context *ctx) { + DUK_UNREF(ctx); + return 0; +} +#else /* print provider */ +DUK_INTERNAL duk_ret_t duk_bi_global_object_print_helper(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* print provider */ + +/* + * CommonJS require() and modules support + */ + +#if defined(DUK_USE_COMMONJS_MODULES) +DUK_LOCAL void duk__bi_global_resolve_module_id(duk_context *ctx, const char *req_id, const char *mod_id) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_size_t mod_id_len; + duk_size_t req_id_len; + duk_uint8_t buf_in[DUK_BI_COMMONJS_MODULE_ID_LIMIT]; + duk_uint8_t buf_out[DUK_BI_COMMONJS_MODULE_ID_LIMIT]; + duk_uint8_t *p; + duk_uint8_t *q; + + DUK_ASSERT(req_id != NULL); + /* mod_id may be NULL */ + DUK_ASSERT(sizeof(buf_out) >= sizeof(buf_in)); /* bound checking requires this */ + + /* + * A few notes on the algorithm: + * + * - Terms are not allowed to begin with a period unless the term + * is either '.' or '..'. This simplifies implementation (and + * is within CommonJS modules specification). + * + * - There are few output bound checks here. This is on purpose: + * we check the input length and rely on the output never being + * longer than the input, so we cannot run out of output space. + * + * - Non-ASCII characters are processed as individual bytes and + * need no special treatment. However, U+0000 terminates the + * algorithm; this is not an issue because U+0000 is not a + * desirable term character anyway. + */ + + /* + * Set up the resolution input which is the requested ID directly + * (if absolute or no current module path) or with current module + * ID prepended (if relative and current module path exists). + * + * Suppose current module is 'foo/bar' and relative path is './quux'. + * The 'bar' component must be replaced so the initial input here is + * 'foo/bar/.././quux'. + */ + + req_id_len = DUK_STRLEN(req_id); + if (mod_id != NULL && req_id[0] == '.') { + mod_id_len = DUK_STRLEN(mod_id); + if (mod_id_len + 4 + req_id_len + 1 >= sizeof(buf_in)) { + DUK_DD(DUK_DDPRINT("resolve error: current and requested module ID don't fit into resolve input buffer")); + goto resolve_error; + } + (void) DUK_SNPRINTF((char *) buf_in, sizeof(buf_in), "%s/../%s", (const char *) mod_id, (const char *) req_id); + } else { + if (req_id_len + 1 >= sizeof(buf_in)) { + DUK_DD(DUK_DDPRINT("resolve error: requested module ID doesn't fit into resolve input buffer")); + goto resolve_error; + } + (void) DUK_SNPRINTF((char *) buf_in, sizeof(buf_in), "%s", (const char *) req_id); + } + buf_in[sizeof(buf_in) - 1] = (duk_uint8_t) 0; + + DUK_DDD(DUK_DDDPRINT("input module id: '%s'", (const char *) buf_in)); + + /* + * Resolution loop. At the top of the loop we're expecting a valid + * term: '.', '..', or a non-empty identifier not starting with a period. + */ + + p = buf_in; + q = buf_out; + for (;;) { + duk_uint_fast8_t c; + + /* Here 'p' always points to the start of a term. */ + DUK_DDD(DUK_DDDPRINT("resolve loop top: p -> '%s', q=%p, buf_out=%p", + (const char *) p, (void *) q, (void *) buf_out)); + + c = *p++; + if (DUK_UNLIKELY(c == 0)) { + DUK_DD(DUK_DDPRINT("resolve error: requested ID must end with a non-empty term")); + goto resolve_error; + } else if (DUK_UNLIKELY(c == '.')) { + c = *p++; + if (c == '/') { + /* Term was '.' and is eaten entirely (including dup slashes). */ + goto eat_dup_slashes; + } + if (c == '.' && *p == '/') { + /* Term was '..', backtrack resolved name by one component. + * q[-1] = previous slash (or beyond start of buffer) + * q[-2] = last char of previous component (or beyond start of buffer) + */ + p++; /* eat (first) input slash */ + DUK_ASSERT(q >= buf_out); + if (q == buf_out) { + DUK_DD(DUK_DDPRINT("resolve error: term was '..' but nothing to backtrack")); + goto resolve_error; + } + DUK_ASSERT(*(q - 1) == '/'); + q--; /* backtrack to last output slash */ + for (;;) { + /* Backtrack to previous slash or start of buffer. */ + DUK_ASSERT(q >= buf_out); + if (q == buf_out) { + break; + } + if (*(q - 1) == '/') { + break; + } + q--; + } + goto eat_dup_slashes; + } + DUK_DD(DUK_DDPRINT("resolve error: term begins with '.' but is not '.' or '..' (not allowed now)")); + goto resolve_error; + } else if (DUK_UNLIKELY(c == '/')) { + /* e.g. require('/foo'), empty terms not allowed */ + DUK_DD(DUK_DDPRINT("resolve error: empty term (not allowed now)")); + goto resolve_error; + } else { + for (;;) { + /* Copy term name until end or '/'. */ + *q++ = c; + c = *p++; + if (DUK_UNLIKELY(c == 0)) { + goto loop_done; + } else if (DUK_UNLIKELY(c == '/')) { + *q++ = '/'; + break; + } else { + /* write on next loop */ + } + } + } + + eat_dup_slashes: + for (;;) { + /* eat dup slashes */ + c = *p; + if (DUK_LIKELY(c != '/')) { + break; + } + p++; + } + } + loop_done: + + duk_push_lstring(ctx, (const char *) buf_out, (size_t) (q - buf_out)); + return; + + resolve_error: + DUK_ERROR(thr, DUK_ERR_TYPE_ERROR, "cannot resolve module id: %s", (const char *) req_id); +} +#endif /* DUK_USE_COMMONJS_MODULES */ + +#if defined(DUK_USE_COMMONJS_MODULES) +DUK_INTERNAL duk_ret_t duk_bi_global_object_require(duk_context *ctx) { + const char *str_req_id; /* requested identifier */ + const char *str_mod_id; /* require.id of current module */ + duk_int_t pcall_rc; + + /* NOTE: we try to minimize code size by avoiding unnecessary pops, + * so the stack looks a bit cluttered in this function. DUK_ASSERT_TOP() + * assertions are used to ensure stack configuration is correct at each + * step. + */ + + /* + * Resolve module identifier into canonical absolute form. + */ + + str_req_id = duk_require_string(ctx, 0); + duk_push_current_function(ctx); + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_ID); + str_mod_id = duk_get_string(ctx, 2); /* ignore non-strings */ + DUK_DDD(DUK_DDDPRINT("resolve module id: requested=%!T, currentmodule=%!T", + (duk_tval *) duk_get_tval(ctx, 0), + (duk_tval *) duk_get_tval(ctx, 2))); + duk__bi_global_resolve_module_id(ctx, str_req_id, str_mod_id); + str_req_id = NULL; + str_mod_id = NULL; + DUK_DDD(DUK_DDDPRINT("resolved module id: requested=%!T, currentmodule=%!T, result=%!T", + (duk_tval *) duk_get_tval(ctx, 0), + (duk_tval *) duk_get_tval(ctx, 2), + (duk_tval *) duk_get_tval(ctx, 3))); + + /* [ requested_id require require.id resolved_id ] */ + DUK_ASSERT_TOP(ctx, 4); + + /* + * Cached module check. + * + * If module has been loaded or its loading has already begun without + * finishing, return the same cached value ('exports'). The value is + * registered when module load starts so that circular references can + * be supported to some extent. + */ + + /* [ requested_id require require.id resolved_id ] */ + DUK_ASSERT_TOP(ctx, 4); + + duk_push_hobject_bidx(ctx, DUK_BIDX_DUKTAPE); + duk_get_prop_stridx(ctx, 4, DUK_STRIDX_MOD_LOADED); /* Duktape.modLoaded */ + (void) duk_require_hobject(ctx, 5); + + /* [ requested_id require require.id resolved_id Duktape Duktape.modLoaded ] */ + DUK_ASSERT_TOP(ctx, 6); + + duk_dup(ctx, 3); + if (duk_get_prop(ctx, 5)) { + /* [ requested_id require require.id resolved_id Duktape Duktape.modLoaded Duktape.modLoaded[id] ] */ + DUK_DD(DUK_DDPRINT("module already loaded: %!T", + (duk_tval *) duk_get_tval(ctx, 3))); + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_EXPORTS); /* return module.exports */ + return 1; + } + + /* [ requested_id require require.id resolved_id Duktape Duktape.modLoaded undefined ] */ + DUK_ASSERT_TOP(ctx, 7); + + /* + * Module not loaded (and loading not started previously). + * + * Create a new require() function with 'id' set to resolved ID + * of module being loaded. Also create 'exports' and 'module' + * tables but don't register exports to the loaded table yet. + * We don't want to do that unless the user module search callbacks + * succeeds in finding the module. + */ + + DUK_DD(DUK_DDPRINT("module not yet loaded: %!T", + (duk_tval *) duk_get_tval(ctx, 3))); + + /* Fresh require: require.id is left configurable (but not writable) + * so that is not easy to accidentally tweak it, but it can still be + * done with Object.defineProperty(). + * + * XXX: require.id could also be just made non-configurable, as there + * is no practical reason to touch it. + */ + duk_push_c_function(ctx, duk_bi_global_object_require, 1 /*nargs*/); + duk_dup(ctx, 3); + duk_xdef_prop_stridx(ctx, 7, DUK_STRIDX_ID, DUK_PROPDESC_FLAGS_C); /* a fresh require() with require.id = resolved target module id */ + + /* Module table: + * - module.exports: initial exports table (may be replaced by user) + * - module.id is non-writable and non-configurable, as the CommonJS + * spec suggests this if possible. + */ + duk_push_object(ctx); /* exports */ + duk_push_object(ctx); /* module */ + duk_dup(ctx, -2); + duk_xdef_prop_stridx(ctx, 9, DUK_STRIDX_EXPORTS, DUK_PROPDESC_FLAGS_WC); /* module.exports = exports */ + duk_dup(ctx, 3); /* resolved id: require(id) must return this same module */ + duk_xdef_prop_stridx(ctx, 9, DUK_STRIDX_ID, DUK_PROPDESC_FLAGS_NONE); /* module.id = resolved_id */ + duk_compact(ctx, 9); /* module table remains registered to modLoaded, minimize its size */ + + /* [ requested_id require require.id resolved_id Duktape Duktape.modLoaded undefined fresh_require exports module ] */ + DUK_ASSERT_TOP(ctx, 10); + + /* Register the module table early to modLoaded[] so that we can + * support circular references even in modSearch(). If an error + * is thrown, we'll delete the reference. + */ + duk_dup(ctx, 3); + duk_dup(ctx, 9); + duk_put_prop(ctx, 5); /* Duktape.modLoaded[resolved_id] = module */ + + /* + * Call user provided module search function and build the wrapped + * module source code (if necessary). The module search function + * can be used to implement pure Ecmacsript, pure C, and mixed + * Ecmascript/C modules. + * + * The module search function can operate on the exports table directly + * (e.g. DLL code can register values to it). It can also return a + * string which is interpreted as module source code (if a non-string + * is returned the module is assumed to be a pure C one). If a module + * cannot be found, an error must be thrown by the user callback. + * + * Because Duktape.modLoaded[] already contains the module being + * loaded, circular references for C modules should also work + * (although expected to be quite rare). + */ + + duk_push_string(ctx, "(function(require,exports,module){"); + + /* Duktape.modSearch(resolved_id, fresh_require, exports, module). */ + duk_get_prop_stridx(ctx, 4, DUK_STRIDX_MOD_SEARCH); /* Duktape.modSearch */ + duk_dup(ctx, 3); + duk_dup(ctx, 7); + duk_dup(ctx, 8); + duk_dup(ctx, 9); /* [ ... Duktape.modSearch resolved_id fresh_require exports module ] */ + pcall_rc = duk_pcall(ctx, 4 /*nargs*/); /* -> [ ... source ] */ + DUK_ASSERT_TOP(ctx, 12); + + if (pcall_rc != DUK_EXEC_SUCCESS) { + /* Delete entry in Duktape.modLoaded[] and rethrow. */ + goto delete_rethrow; + } + + /* If user callback did not return source code, module loading + * is finished (user callback initialized exports table directly). + */ + if (!duk_is_string(ctx, 11)) { + /* User callback did not return source code, so module loading + * is finished: just update modLoaded with final module.exports + * and we're done. + */ + goto return_exports; + } + + /* Finish the wrapped module source. Force resolved module ID as the + * fileName so it gets set for functions defined within a module. This + * also ensures loggers created within the module get the module ID as + * their default logger name. + */ + duk_push_string(ctx, "})"); + duk_concat(ctx, 3); + duk_dup(ctx, 3); /* resolved module ID for fileName */ + duk_eval_raw(ctx, NULL, 0, DUK_COMPILE_EVAL); + + /* XXX: The module wrapper function is currently anonymous and is shown + * in stack traces. It would be nice to force it to match the module + * name (perhaps just the cleaned up last term). At the moment 'name' + * is write protected so we can't change it directly. Note that we must + * not introduce an actual name binding into the function scope (which + * is usually the case with a named function) because it would affect + * the scope seen by the module and shadow accesses to globals of the + * same name. + */ + + /* + * Call the wrapped module function. + * + * Use a protected call so that we can update Duktape.modLoaded[resolved_id] + * even if the module throws an error. + */ + + /* [ requested_id require require.id resolved_id Duktape Duktape.modLoaded undefined fresh_require exports module mod_func ] */ + DUK_ASSERT_TOP(ctx, 11); + + duk_dup(ctx, 8); /* exports (this binding) */ + duk_dup(ctx, 7); /* fresh require (argument) */ + duk_get_prop_stridx(ctx, 9, DUK_STRIDX_EXPORTS); /* relookup exports from module.exports in case it was changed by modSearch */ + duk_dup(ctx, 9); /* module (argument) */ + + /* [ requested_id require require.id resolved_id Duktape Duktape.modLoaded undefined fresh_require exports module mod_func exports fresh_require exports module ] */ + DUK_ASSERT_TOP(ctx, 15); + + pcall_rc = duk_pcall_method(ctx, 3 /*nargs*/); + if (pcall_rc != DUK_EXEC_SUCCESS) { + /* Module loading failed. Node.js will forget the module + * registration so that another require() will try to load + * the module again. Mimic that behavior. + */ + goto delete_rethrow; + } + + /* [ requested_id require require.id resolved_id Duktape Duktape.modLoaded undefined fresh_require exports module result(ignored) ] */ + DUK_ASSERT_TOP(ctx, 11); + + /* fall through */ + + return_exports: + duk_get_prop_stridx(ctx, 9, DUK_STRIDX_EXPORTS); + return 1; /* return module.exports */ + + delete_rethrow: + duk_dup(ctx, 3); + duk_del_prop(ctx, 5); /* delete Duktape.modLoaded[resolved_id] */ + duk_throw(ctx); /* rethrow original error */ + return 0; /* not reachable */ +} +#else +DUK_INTERNAL duk_ret_t duk_bi_global_object_require(duk_context *ctx) { + DUK_UNREF(ctx); + return DUK_RET_UNSUPPORTED_ERROR; +} +#endif /* DUK_USE_COMMONJS_MODULES */ diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_json.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_json.c new file mode 100644 index 00000000..f93e457b --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_json.c @@ -0,0 +1,2896 @@ +/* + * JSON built-ins. + * + * See doc/json.rst. + * + * Codepoints are handled as duk_uint_fast32_t to ensure that the full + * unsigned 32-bit range is supported. This matters to e.g. JX. + * + * Input parsing doesn't do an explicit end-of-input check at all. This is + * safe: input string data is always NUL-terminated (0x00) and valid JSON + * inputs never contain plain NUL characters, so that as long as syntax checks + * are correct, we'll never read past the NUL. This approach reduces code size + * and improves parsing performance, but it's critical that syntax checks are + * indeed correct! + */ + +#include "duk_internal.h" + +/* + * Local defines and forward declarations. + */ + +#define DUK__JSON_DECSTR_BUFSIZE 128 +#define DUK__JSON_DECSTR_CHUNKSIZE 64 +#define DUK__JSON_ENCSTR_CHUNKSIZE 64 +#define DUK__JSON_STRINGIFY_BUFSIZE 128 +#define DUK__JSON_MAX_ESC_LEN 10 /* '\Udeadbeef' */ + +DUK_LOCAL_DECL void duk__dec_syntax_error(duk_json_dec_ctx *js_ctx); +DUK_LOCAL_DECL void duk__dec_eat_white(duk_json_dec_ctx *js_ctx); +DUK_LOCAL_DECL duk_uint8_t duk__dec_peek(duk_json_dec_ctx *js_ctx); +DUK_LOCAL_DECL duk_uint8_t duk__dec_get(duk_json_dec_ctx *js_ctx); +DUK_LOCAL_DECL duk_uint8_t duk__dec_get_nonwhite(duk_json_dec_ctx *js_ctx); +DUK_LOCAL_DECL duk_uint_fast32_t duk__dec_decode_hex_escape(duk_json_dec_ctx *js_ctx, duk_small_uint_t n); +DUK_LOCAL_DECL void duk__dec_req_stridx(duk_json_dec_ctx *js_ctx, duk_small_uint_t stridx); +DUK_LOCAL_DECL void duk__dec_string(duk_json_dec_ctx *js_ctx); +#ifdef DUK_USE_JX +DUK_LOCAL_DECL void duk__dec_plain_string(duk_json_dec_ctx *js_ctx); +DUK_LOCAL_DECL void duk__dec_pointer(duk_json_dec_ctx *js_ctx); +DUK_LOCAL_DECL void duk__dec_buffer(duk_json_dec_ctx *js_ctx); +#endif +DUK_LOCAL_DECL void duk__dec_number(duk_json_dec_ctx *js_ctx); +DUK_LOCAL_DECL void duk__dec_objarr_entry(duk_json_dec_ctx *js_ctx); +DUK_LOCAL_DECL void duk__dec_objarr_exit(duk_json_dec_ctx *js_ctx); +DUK_LOCAL_DECL void duk__dec_object(duk_json_dec_ctx *js_ctx); +DUK_LOCAL_DECL void duk__dec_array(duk_json_dec_ctx *js_ctx); +DUK_LOCAL_DECL void duk__dec_value(duk_json_dec_ctx *js_ctx); +DUK_LOCAL_DECL void duk__dec_reviver_walk(duk_json_dec_ctx *js_ctx); + +DUK_LOCAL_DECL void duk__emit_1(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch); +DUK_LOCAL_DECL void duk__emit_2(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch1, duk_uint_fast8_t ch2); +#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) +DUK_LOCAL_DECL void duk__unemit_1(duk_json_enc_ctx *js_ctx); +#endif +DUK_LOCAL_DECL void duk__emit_hstring(duk_json_enc_ctx *js_ctx, duk_hstring *h); +#if defined(DUK_USE_FASTINT) +DUK_LOCAL_DECL void duk__emit_cstring(duk_json_enc_ctx *js_ctx, const char *p); +#endif +DUK_LOCAL_DECL void duk__emit_stridx(duk_json_enc_ctx *js_ctx, duk_small_uint_t stridx); +DUK_LOCAL_DECL duk_uint8_t *duk__emit_esc_auto_fast(duk_json_enc_ctx *js_ctx, duk_uint_fast32_t cp, duk_uint8_t *q); +DUK_LOCAL_DECL duk_bool_t duk__enc_key_quotes_needed(duk_hstring *h_key); +DUK_LOCAL_DECL void duk__enc_quote_string(duk_json_enc_ctx *js_ctx, duk_hstring *h_str); +DUK_LOCAL_DECL void duk__enc_objarr_entry(duk_json_enc_ctx *js_ctx, duk_hstring **h_stepback, duk_hstring **h_indent, duk_idx_t *entry_top); +DUK_LOCAL_DECL void duk__enc_objarr_exit(duk_json_enc_ctx *js_ctx, duk_hstring **h_stepback, duk_hstring **h_indent, duk_idx_t *entry_top); +DUK_LOCAL_DECL void duk__enc_object(duk_json_enc_ctx *js_ctx); +DUK_LOCAL_DECL void duk__enc_array(duk_json_enc_ctx *js_ctx); +DUK_LOCAL_DECL duk_bool_t duk__enc_value1(duk_json_enc_ctx *js_ctx, duk_idx_t idx_holder); +DUK_LOCAL_DECL void duk__enc_value2(duk_json_enc_ctx *js_ctx); +DUK_LOCAL_DECL duk_bool_t duk__enc_allow_into_proplist(duk_tval *tv); +DUK_LOCAL_DECL void duk__enc_double(duk_json_enc_ctx *js_ctx); +#if defined(DUK_USE_FASTINT) +DUK_LOCAL_DECL void duk__enc_fastint_tval(duk_json_enc_ctx *js_ctx, duk_tval *tv); +#endif + +/* + * Helper tables + */ + +#if defined(DUK_USE_JSON_QUOTESTRING_FASTPATH) +DUK_LOCAL const duk_uint8_t duk__json_quotestr_lookup[256] = { + /* 0x00 ... 0x7f: as is + * 0x80: escape generically + * 0x81: slow path + * 0xa0 ... 0xff: backslash + one char + */ + + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xe2, 0xf4, 0xee, 0x80, 0xe6, 0xf2, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x20, 0x21, 0xa2, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0xdc, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81 +}; +#else /* DUK_USE_JSON_QUOTESTRING_FASTPATH */ +DUK_LOCAL const duk_uint8_t duk__json_quotestr_esc[14] = { + DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, + DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, DUK_ASC_NUL, + DUK_ASC_LC_B, DUK_ASC_LC_T, DUK_ASC_LC_N, DUK_ASC_NUL, + DUK_ASC_LC_F, DUK_ASC_LC_R +}; +#endif /* DUK_USE_JSON_QUOTESTRING_FASTPATH */ + +#if defined(DUK_USE_JSON_DECSTRING_FASTPATH) +DUK_LOCAL const duk_uint8_t duk__json_decstr_lookup[256] = { + /* 0x00: slow path + * other: as is + */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x21, 0x00, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x00, 0x5d, 0x5e, 0x5f, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, + 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, + 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, + 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, + 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, + 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff +}; +#endif /* DUK_USE_JSON_DECSTRING_FASTPATH */ + +#if defined(DUK_USE_JSON_EATWHITE_FASTPATH) +DUK_LOCAL const duk_uint8_t duk__json_eatwhite_lookup[256] = { + /* 0x00: finish (non-white) + * 0x01: continue + */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#endif /* DUK_USE_JSON_EATWHITE_FASTPATH */ + +#if defined(DUK_USE_JSON_DECNUMBER_FASTPATH) +DUK_LOCAL const duk_uint8_t duk__json_decnumber_lookup[256] = { + /* 0x00: finish (not part of number) + * 0x01: continue + */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#endif /* DUK_USE_JSON_DECNUMBER_FASTPATH */ + +/* + * Parsing implementation. + * + * JSON lexer is now separate from duk_lexer.c because there are numerous + * small differences making it difficult to share the lexer. + * + * The parser here works with raw bytes directly; this works because all + * JSON delimiters are ASCII characters. Invalid xUTF-8 encoded values + * inside strings will be passed on without normalization; this is not a + * compliance concern because compliant inputs will always be valid + * CESU-8 encodings. + */ + +DUK_LOCAL void duk__dec_syntax_error(duk_json_dec_ctx *js_ctx) { + /* Shared handler to minimize parser size. Cause will be + * hidden, unfortunately, but we'll have an offset which + * is often quite enough. + */ + DUK_ERROR(js_ctx->thr, DUK_ERR_SYNTAX_ERROR, DUK_STR_FMT_INVALID_JSON, + (long) (js_ctx->p - js_ctx->p_start)); +} + +DUK_LOCAL void duk__dec_eat_white(duk_json_dec_ctx *js_ctx) { + const duk_uint8_t *p; + duk_uint8_t t; + + p = js_ctx->p; + for (;;) { + DUK_ASSERT(p <= js_ctx->p_end); + t = *p; + +#if defined(DUK_USE_JSON_EATWHITE_FASTPATH) + /* This fast path is pretty marginal in practice. + * XXX: candidate for removal. + */ + DUK_ASSERT(duk__json_eatwhite_lookup[0x00] == 0x00); /* end-of-input breaks */ + if (duk__json_eatwhite_lookup[t] == 0) { + break; + } +#else /* DUK_USE_JSON_EATWHITE_FASTPATH */ + if (!(t == 0x20 || t == 0x0a || t == 0x0d || t == 0x09)) { + /* NUL also comes here. Comparison order matters, 0x20 + * is most common whitespace. + */ + break; + } +#endif /* DUK_USE_JSON_EATWHITE_FASTPATH */ + p++; + } + js_ctx->p = p; +} + +DUK_LOCAL duk_uint8_t duk__dec_peek(duk_json_dec_ctx *js_ctx) { + DUK_ASSERT(js_ctx->p <= js_ctx->p_end); + return *js_ctx->p; +} + +DUK_LOCAL duk_uint8_t duk__dec_get(duk_json_dec_ctx *js_ctx) { + DUK_ASSERT(js_ctx->p <= js_ctx->p_end); + return *js_ctx->p++; +} + +DUK_LOCAL duk_uint8_t duk__dec_get_nonwhite(duk_json_dec_ctx *js_ctx) { + duk__dec_eat_white(js_ctx); + return duk__dec_get(js_ctx); +} + +/* For JX, expressing the whole unsigned 32-bit range matters. */ +DUK_LOCAL duk_uint_fast32_t duk__dec_decode_hex_escape(duk_json_dec_ctx *js_ctx, duk_small_uint_t n) { + duk_small_uint_t i; + duk_uint_fast32_t res = 0; + duk_uint8_t x; + duk_small_int_t t; + + for (i = 0; i < n; i++) { + /* XXX: share helper from lexer; duk_lexer.c / hexval(). */ + + x = duk__dec_get(js_ctx); + DUK_DDD(DUK_DDDPRINT("decode_hex_escape: i=%ld, n=%ld, res=%ld, x=%ld", + (long) i, (long) n, (long) res, (long) x)); + + /* x == 0x00 (EOF) causes syntax_error */ + DUK_ASSERT(duk_hex_dectab[0] == -1); + t = duk_hex_dectab[x & 0xff]; + if (DUK_LIKELY(t >= 0)) { + res = (res * 16) + t; + } else { + /* catches EOF and invalid digits */ + goto syntax_error; + } + } + + DUK_DDD(DUK_DDDPRINT("final hex decoded value: %ld", (long) res)); + return res; + + syntax_error: + duk__dec_syntax_error(js_ctx); + DUK_UNREACHABLE(); + return 0; +} + +DUK_LOCAL void duk__dec_req_stridx(duk_json_dec_ctx *js_ctx, duk_small_uint_t stridx) { + duk_hstring *h; + duk_uint8_t *p; + duk_uint8_t x, y; + + /* First character has already been eaten and checked by the caller. + * We can scan until a NUL in stridx string because no built-in strings + * have internal NULs. + */ + + DUK_ASSERT_DISABLE(stridx >= 0); /* unsigned */ + DUK_ASSERT(stridx < DUK_HEAP_NUM_STRINGS); + h = DUK_HTHREAD_GET_STRING(js_ctx->thr, stridx); + DUK_ASSERT(h != NULL); + + p = (duk_uint8_t *) DUK_HSTRING_GET_DATA(h) + 1; + DUK_ASSERT(*(js_ctx->p - 1) == *(p - 1)); /* first character has been matched */ + + for (;;) { + x = *p; + if (x == 0) { + break; + } + y = duk__dec_get(js_ctx); + if (x != y) { + /* Catches EOF of JSON input. */ + goto syntax_error; + } + p++; + } + + return; + + syntax_error: + duk__dec_syntax_error(js_ctx); + DUK_UNREACHABLE(); +} + +DUK_LOCAL duk_small_int_t duk__dec_string_escape(duk_json_dec_ctx *js_ctx, duk_uint8_t **ext_p) { + duk_uint_fast32_t cp; + + /* EOF (-1) will be cast to an unsigned value first + * and then re-cast for the switch. In any case, it + * will match the default case (syntax error). + */ + cp = (duk_uint_fast32_t) duk__dec_get(js_ctx); + switch ((int) cp) { + case DUK_ASC_BACKSLASH: break; + case DUK_ASC_DOUBLEQUOTE: break; + case DUK_ASC_SLASH: break; + case DUK_ASC_LC_T: cp = 0x09; break; + case DUK_ASC_LC_N: cp = 0x0a; break; + case DUK_ASC_LC_R: cp = 0x0d; break; + case DUK_ASC_LC_F: cp = 0x0c; break; + case DUK_ASC_LC_B: cp = 0x08; break; + case DUK_ASC_LC_U: { + cp = duk__dec_decode_hex_escape(js_ctx, 4); + break; + } +#ifdef DUK_USE_JX + case DUK_ASC_UC_U: { + if (js_ctx->flag_ext_custom) { + cp = duk__dec_decode_hex_escape(js_ctx, 8); + } else { + return 1; /* syntax error */ + } + break; + } + case DUK_ASC_LC_X: { + if (js_ctx->flag_ext_custom) { + cp = duk__dec_decode_hex_escape(js_ctx, 2); + } else { + return 1; /* syntax error */ + } + break; + } +#endif /* DUK_USE_JX */ + default: + /* catches EOF (0x00) */ + return 1; /* syntax error */ + } + + DUK_RAW_WRITE_XUTF8(*ext_p, cp); + + return 0; +} + +DUK_LOCAL void duk__dec_string(duk_json_dec_ctx *js_ctx) { + duk_hthread *thr = js_ctx->thr; + duk_context *ctx = (duk_context *) thr; + duk_bufwriter_ctx bw_alloc; + duk_bufwriter_ctx *bw; + duk_uint8_t *q; + + /* '"' was eaten by caller */ + + /* Note that we currently parse -bytes-, not codepoints. + * All non-ASCII extended UTF-8 will encode to bytes >= 0x80, + * so they'll simply pass through (valid UTF-8 or not). + */ + + bw = &bw_alloc; + DUK_BW_INIT_PUSHBUF(js_ctx->thr, bw, DUK__JSON_DECSTR_BUFSIZE); + q = DUK_BW_GET_PTR(js_ctx->thr, bw); + +#if defined(DUK_USE_JSON_DECSTRING_FASTPATH) + for (;;) { + duk_small_uint_t safe; + duk_uint8_t b, x; + const duk_uint8_t *p; + + /* Select a safe loop count where no output checks are + * needed assuming we won't encounter escapes. Input + * bound checks are not necessary as a NUL (guaranteed) + * will cause a SyntaxError before we read out of bounds. + */ + + safe = DUK__JSON_DECSTR_CHUNKSIZE; + + /* Ensure space for 1:1 output plus one escape. */ + q = DUK_BW_ENSURE_RAW(js_ctx->thr, bw, safe + DUK_UNICODE_MAX_XUTF8_LENGTH, q); + + p = js_ctx->p; /* temp copy, write back for next loop */ + for (;;) { + if (safe == 0) { + js_ctx->p = p; + break; + } + safe--; + + /* End of input (NUL) goes through slow path and causes SyntaxError. */ + DUK_ASSERT(duk__json_decstr_lookup[0] == 0x00); + + b = *p++; + x = (duk_small_int_t) duk__json_decstr_lookup[b]; + if (DUK_LIKELY(x != 0)) { + /* Fast path, decode as is. */ + *q++ = b; + } else if (b == DUK_ASC_DOUBLEQUOTE) { + js_ctx->p = p; + goto found_quote; + } else if (b == DUK_ASC_BACKSLASH) { + /* We've ensured space for one escaped input; then + * bail out and recheck (this makes escape handling + * quite slow but it's uncommon). + */ + js_ctx->p = p; + if (duk__dec_string_escape(js_ctx, &q) != 0) { + goto syntax_error; + } + break; + } else { + js_ctx->p = p; + goto syntax_error; + } + } + } + found_quote: +#else /* DUK_USE_JSON_DECSTRING_FASTPATH */ + for (;;) { + duk_uint8_t x; + + q = DUK_BW_ENSURE_RAW(js_ctx->thr, bw, DUK_UNICODE_MAX_XUTF8_LENGTH, q); + + x = duk__dec_get(js_ctx); + + if (x == DUK_ASC_DOUBLEQUOTE) { + break; + } else if (x == DUK_ASC_BACKSLASH) { + if (duk__dec_string_escape(js_ctx, &q) != 0) { + goto syntax_error; + } + } else if (x < 0x20) { + /* catches EOF (NUL) */ + goto syntax_error; + } else { + *q++ = (duk_uint8_t) x; + } + } +#endif /* DUK_USE_JSON_DECSTRING_FASTPATH */ + + DUK_BW_SETPTR_AND_COMPACT(js_ctx->thr, bw, q); + duk_to_string(ctx, -1); + + /* [ ... str ] */ + + return; + + syntax_error: + duk__dec_syntax_error(js_ctx); + DUK_UNREACHABLE(); +} + +#ifdef DUK_USE_JX +/* Decode a plain string consisting entirely of identifier characters. + * Used to parse plain keys (e.g. "foo: 123"). + */ +DUK_LOCAL void duk__dec_plain_string(duk_json_dec_ctx *js_ctx) { + duk_hthread *thr = js_ctx->thr; + duk_context *ctx = (duk_context *) thr; + const duk_uint8_t *p; + duk_small_int_t x; + + /* Caller has already eaten the first char so backtrack one byte. */ + + js_ctx->p--; /* safe */ + p = js_ctx->p; + + /* Here again we parse bytes, and non-ASCII UTF-8 will cause end of + * parsing (which is correct except if there are non-shortest encodings). + * There is also no need to check explicitly for end of input buffer as + * the input is NUL padded and NUL will exit the parsing loop. + * + * Because no unescaping takes place, we can just scan to the end of the + * plain string and intern from the input buffer. + */ + + for (;;) { + x = *p; + + /* There is no need to check the first character specially here + * (i.e. reject digits): the caller only accepts valid initial + * characters and won't call us if the first character is a digit. + * This also ensures that the plain string won't be empty. + */ + + if (!duk_unicode_is_identifier_part((duk_codepoint_t) x)) { + break; + } + p++; + } + + duk_push_lstring(ctx, (const char *) js_ctx->p, (duk_size_t) (p - js_ctx->p)); + js_ctx->p = p; + + /* [ ... str ] */ +} +#endif /* DUK_USE_JX */ + +#ifdef DUK_USE_JX +DUK_LOCAL void duk__dec_pointer(duk_json_dec_ctx *js_ctx) { + duk_hthread *thr = js_ctx->thr; + duk_context *ctx = (duk_context *) thr; + const duk_uint8_t *p; + duk_small_int_t x; + void *voidptr; + + /* Caller has already eaten the first character ('(') which we don't need. */ + + p = js_ctx->p; + + for (;;) { + x = *p; + + /* Assume that the native representation never contains a closing + * parenthesis. + */ + + if (x == DUK_ASC_RPAREN) { + break; + } else if (x <= 0) { + /* NUL term or -1 (EOF), NUL check would suffice */ + goto syntax_error; + } + p++; + } + + /* There is no need to NUL delimit the sscanf() call: trailing garbage is + * ignored and there is always a NUL terminator which will force an error + * if no error is encountered before it. It's possible that the scan + * would scan further than between [js_ctx->p,p[ though and we'd advance + * by less than the scanned value. + * + * Because pointers are platform specific, a failure to scan a pointer + * results in a null pointer which is a better placeholder than a missing + * value or an error. + */ + + voidptr = NULL; + (void) DUK_SSCANF((const char *) js_ctx->p, DUK_STR_FMT_PTR, &voidptr); + duk_push_pointer(ctx, voidptr); + js_ctx->p = p + 1; /* skip ')' */ + + /* [ ... ptr ] */ + + return; + + syntax_error: + duk__dec_syntax_error(js_ctx); + DUK_UNREACHABLE(); +} +#endif /* DUK_USE_JX */ + +#ifdef DUK_USE_JX +DUK_LOCAL void duk__dec_buffer(duk_json_dec_ctx *js_ctx) { + duk_hthread *thr = js_ctx->thr; + duk_context *ctx = (duk_context *) thr; + const duk_uint8_t *p; + duk_small_int_t x; + + /* Caller has already eaten the first character ('|') which we don't need. */ + + p = js_ctx->p; + + for (;;) { + x = *p; + + /* This loop intentionally does not ensure characters are valid + * ([0-9a-fA-F]) because the hex decode call below will do that. + */ + if (x == DUK_ASC_PIPE) { + break; + } else if (x <= 0) { + /* NUL term or -1 (EOF), NUL check would suffice */ + goto syntax_error; + } + p++; + } + + duk_push_lstring(ctx, (const char *) js_ctx->p, (duk_size_t) (p - js_ctx->p)); + duk_hex_decode(ctx, -1); + js_ctx->p = p + 1; /* skip '|' */ + + /* [ ... buf ] */ + + return; + + syntax_error: + duk__dec_syntax_error(js_ctx); + DUK_UNREACHABLE(); +} +#endif /* DUK_USE_JX */ + +/* Parse a number, other than NaN or +/- Infinity */ +DUK_LOCAL void duk__dec_number(duk_json_dec_ctx *js_ctx) { + duk_context *ctx = (duk_context *) js_ctx->thr; + const duk_uint8_t *p_start; + const duk_uint8_t *p; + duk_uint8_t x; + duk_small_uint_t s2n_flags; + + DUK_DDD(DUK_DDDPRINT("parse_number")); + + p_start = js_ctx->p; + + /* First pass parse is very lenient (e.g. allows '1.2.3') and extracts a + * string for strict number parsing. + */ + + p = js_ctx->p; + for (;;) { + x = *p; + + DUK_DDD(DUK_DDDPRINT("parse_number: p_start=%p, p=%p, p_end=%p, x=%ld", + (void *) p_start, (void *) p, + (void *) js_ctx->p_end, (long) x)); + +#if defined(DUK_USE_JSON_DECNUMBER_FASTPATH) + /* This fast path is pretty marginal in practice. + * XXX: candidate for removal. + */ + DUK_ASSERT(duk__json_decnumber_lookup[0x00] == 0x00); /* end-of-input breaks */ + if (duk__json_decnumber_lookup[x] == 0) { + break; + } +#else /* DUK_USE_JSON_DECNUMBER_FASTPATH */ + if (!((x >= DUK_ASC_0 && x <= DUK_ASC_9) || + (x == DUK_ASC_PERIOD || x == DUK_ASC_LC_E || + x == DUK_ASC_UC_E || x == DUK_ASC_MINUS || x == DUK_ASC_PLUS))) { + /* Plus sign must be accepted for positive exponents + * (e.g. '1.5e+2'). This clause catches NULs. + */ + break; + } +#endif /* DUK_USE_JSON_DECNUMBER_FASTPATH */ + p++; /* safe, because matched (NUL causes a break) */ + } + js_ctx->p = p; + + DUK_ASSERT(js_ctx->p > p_start); + duk_push_lstring(ctx, (const char *) p_start, (duk_size_t) (p - p_start)); + + s2n_flags = DUK_S2N_FLAG_ALLOW_EXP | + DUK_S2N_FLAG_ALLOW_MINUS | /* but don't allow leading plus */ + DUK_S2N_FLAG_ALLOW_FRAC; + + DUK_DDD(DUK_DDDPRINT("parse_number: string before parsing: %!T", + (duk_tval *) duk_get_tval(ctx, -1))); + duk_numconv_parse(ctx, 10 /*radix*/, s2n_flags); + if (duk_is_nan(ctx, -1)) { + duk__dec_syntax_error(js_ctx); + } + DUK_ASSERT(duk_is_number(ctx, -1)); + DUK_DDD(DUK_DDDPRINT("parse_number: final number: %!T", + (duk_tval *) duk_get_tval(ctx, -1))); + + /* [ ... num ] */ +} + +DUK_LOCAL void duk__dec_objarr_entry(duk_json_dec_ctx *js_ctx) { + duk_context *ctx = (duk_context *) js_ctx->thr; + duk_require_stack(ctx, DUK_JSON_DEC_REQSTACK); + + /* c recursion check */ + + DUK_ASSERT(js_ctx->recursion_depth >= 0); + DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); + if (js_ctx->recursion_depth >= js_ctx->recursion_limit) { + DUK_ERROR((duk_hthread *) ctx, DUK_ERR_RANGE_ERROR, DUK_STR_JSONDEC_RECLIMIT); + } + js_ctx->recursion_depth++; +} + +DUK_LOCAL void duk__dec_objarr_exit(duk_json_dec_ctx *js_ctx) { + /* c recursion check */ + + DUK_ASSERT(js_ctx->recursion_depth > 0); + DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); + js_ctx->recursion_depth--; +} + +DUK_LOCAL void duk__dec_object(duk_json_dec_ctx *js_ctx) { + duk_context *ctx = (duk_context *) js_ctx->thr; + duk_int_t key_count; /* XXX: a "first" flag would suffice */ + duk_uint8_t x; + + DUK_DDD(DUK_DDDPRINT("parse_object")); + + duk__dec_objarr_entry(js_ctx); + + duk_push_object(ctx); + + /* Initial '{' has been checked and eaten by caller. */ + + key_count = 0; + for (;;) { + x = duk__dec_get_nonwhite(js_ctx); + + DUK_DDD(DUK_DDDPRINT("parse_object: obj=%!T, x=%ld, key_count=%ld", + (duk_tval *) duk_get_tval(ctx, -1), + (long) x, (long) key_count)); + + /* handle comma and closing brace */ + + if (x == DUK_ASC_COMMA && key_count > 0) { + /* accept comma, expect new value */ + x = duk__dec_get_nonwhite(js_ctx); + } else if (x == DUK_ASC_RCURLY) { + /* eat closing brace */ + break; + } else if (key_count == 0) { + /* accept anything, expect first value (EOF will be + * caught by key parsing below. + */ + ; + } else { + /* catches EOF (NUL) and initial comma */ + goto syntax_error; + } + + /* parse key and value */ + + if (x == DUK_ASC_DOUBLEQUOTE) { + duk__dec_string(js_ctx); +#ifdef DUK_USE_JX + } else if (js_ctx->flag_ext_custom && + duk_unicode_is_identifier_start((duk_codepoint_t) x)) { + duk__dec_plain_string(js_ctx); +#endif + } else { + goto syntax_error; + } + + /* [ ... obj key ] */ + + x = duk__dec_get_nonwhite(js_ctx); + if (x != DUK_ASC_COLON) { + goto syntax_error; + } + + duk__dec_value(js_ctx); + + /* [ ... obj key val ] */ + + duk_xdef_prop_wec(ctx, -3); + + /* [ ... obj ] */ + + key_count++; + } + + /* [ ... obj ] */ + + DUK_DDD(DUK_DDDPRINT("parse_object: final object is %!T", + (duk_tval *) duk_get_tval(ctx, -1))); + + duk__dec_objarr_exit(js_ctx); + return; + + syntax_error: + duk__dec_syntax_error(js_ctx); + DUK_UNREACHABLE(); +} + +DUK_LOCAL void duk__dec_array(duk_json_dec_ctx *js_ctx) { + duk_context *ctx = (duk_context *) js_ctx->thr; + duk_uarridx_t arr_idx; + duk_uint8_t x; + + DUK_DDD(DUK_DDDPRINT("parse_array")); + + duk__dec_objarr_entry(js_ctx); + + duk_push_array(ctx); + + /* Initial '[' has been checked and eaten by caller. */ + + arr_idx = 0; + for (;;) { + x = duk__dec_get_nonwhite(js_ctx); + + DUK_DDD(DUK_DDDPRINT("parse_array: arr=%!T, x=%ld, arr_idx=%ld", + (duk_tval *) duk_get_tval(ctx, -1), + (long) x, (long) arr_idx)); + + /* handle comma and closing bracket */ + + if ((x == DUK_ASC_COMMA) && (arr_idx != 0)) { + /* accept comma, expect new value */ + ; + } else if (x == DUK_ASC_RBRACKET) { + /* eat closing bracket */ + break; + } else if (arr_idx == 0) { + /* accept anything, expect first value (EOF will be + * caught by duk__dec_value() below. + */ + js_ctx->p--; /* backtrack (safe) */ + } else { + /* catches EOF (NUL) and initial comma */ + goto syntax_error; + } + + /* parse value */ + + duk__dec_value(js_ctx); + + /* [ ... arr val ] */ + + duk_xdef_prop_index_wec(ctx, -2, arr_idx); + arr_idx++; + } + + /* Must set 'length' explicitly when using duk_xdef_prop_xxx() to + * set the values. + */ + + duk_set_length(ctx, -1, arr_idx); + + /* [ ... arr ] */ + + DUK_DDD(DUK_DDDPRINT("parse_array: final array is %!T", + (duk_tval *) duk_get_tval(ctx, -1))); + + duk__dec_objarr_exit(js_ctx); + return; + + syntax_error: + duk__dec_syntax_error(js_ctx); + DUK_UNREACHABLE(); +} + +DUK_LOCAL void duk__dec_value(duk_json_dec_ctx *js_ctx) { + duk_context *ctx = (duk_context *) js_ctx->thr; + duk_uint8_t x; + + x = duk__dec_get_nonwhite(js_ctx); + + DUK_DDD(DUK_DDDPRINT("parse_value: initial x=%ld", (long) x)); + + /* Note: duk__dec_req_stridx() backtracks one char */ + + if (x == DUK_ASC_DOUBLEQUOTE) { + duk__dec_string(js_ctx); + } else if ((x >= DUK_ASC_0 && x <= DUK_ASC_9) || (x == DUK_ASC_MINUS)) { +#ifdef DUK_USE_JX + if (js_ctx->flag_ext_custom && x == DUK_ASC_MINUS && duk__dec_peek(js_ctx) == DUK_ASC_UC_I) { + duk__dec_req_stridx(js_ctx, DUK_STRIDX_MINUS_INFINITY); /* "-Infinity", '-' has been eaten */ + duk_push_number(ctx, -DUK_DOUBLE_INFINITY); + } else { +#else + { /* unconditional block */ +#endif + /* We already ate 'x', so backup one byte. */ + js_ctx->p--; /* safe */ + duk__dec_number(js_ctx); + } + } else if (x == DUK_ASC_LC_T) { + duk__dec_req_stridx(js_ctx, DUK_STRIDX_TRUE); + duk_push_true(ctx); + } else if (x == DUK_ASC_LC_F) { + duk__dec_req_stridx(js_ctx, DUK_STRIDX_FALSE); + duk_push_false(ctx); + } else if (x == DUK_ASC_LC_N) { + duk__dec_req_stridx(js_ctx, DUK_STRIDX_LC_NULL); + duk_push_null(ctx); +#ifdef DUK_USE_JX + } else if (js_ctx->flag_ext_custom && x == DUK_ASC_LC_U) { + duk__dec_req_stridx(js_ctx, DUK_STRIDX_LC_UNDEFINED); + duk_push_undefined(ctx); + } else if (js_ctx->flag_ext_custom && x == DUK_ASC_UC_N) { + duk__dec_req_stridx(js_ctx, DUK_STRIDX_NAN); + duk_push_nan(ctx); + } else if (js_ctx->flag_ext_custom && x == DUK_ASC_UC_I) { + duk__dec_req_stridx(js_ctx, DUK_STRIDX_INFINITY); + duk_push_number(ctx, DUK_DOUBLE_INFINITY); + } else if (js_ctx->flag_ext_custom && x == DUK_ASC_LPAREN) { + duk__dec_pointer(js_ctx); + } else if (js_ctx->flag_ext_custom && x == DUK_ASC_PIPE) { + duk__dec_buffer(js_ctx); +#endif + } else if (x == DUK_ASC_LCURLY) { + duk__dec_object(js_ctx); + } else if (x == DUK_ASC_LBRACKET) { + duk__dec_array(js_ctx); + } else { + /* catches EOF (NUL) */ + goto syntax_error; + } + + duk__dec_eat_white(js_ctx); + + /* [ ... val ] */ + return; + + syntax_error: + duk__dec_syntax_error(js_ctx); + DUK_UNREACHABLE(); +} + +/* Recursive value reviver, implements the Walk() algorithm. No C recursion + * check is done here because the initial parsing step will already ensure + * there is a reasonable limit on C recursion depth and hence object depth. + */ +DUK_LOCAL void duk__dec_reviver_walk(duk_json_dec_ctx *js_ctx) { + duk_context *ctx = (duk_context *) js_ctx->thr; + duk_hobject *h; + duk_uarridx_t i, arr_len; + + DUK_DDD(DUK_DDDPRINT("walk: top=%ld, holder=%!T, name=%!T", + (long) duk_get_top(ctx), + (duk_tval *) duk_get_tval(ctx, -2), + (duk_tval *) duk_get_tval(ctx, -1))); + + duk_dup_top(ctx); + duk_get_prop(ctx, -3); /* -> [ ... holder name val ] */ + + h = duk_get_hobject(ctx, -1); + if (h != NULL) { + if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) { + arr_len = (duk_uarridx_t) duk_get_length(ctx, -1); + for (i = 0; i < arr_len; i++) { + /* [ ... holder name val ] */ + + DUK_DDD(DUK_DDDPRINT("walk: array, top=%ld, i=%ld, arr_len=%ld, holder=%!T, name=%!T, val=%!T", + (long) duk_get_top(ctx), (long) i, (long) arr_len, + (duk_tval *) duk_get_tval(ctx, -3), (duk_tval *) duk_get_tval(ctx, -2), + (duk_tval *) duk_get_tval(ctx, -1))); + + /* XXX: push_uint_string / push_u32_string */ + duk_dup_top(ctx); + duk_push_uint(ctx, (duk_uint_t) i); + duk_to_string(ctx, -1); /* -> [ ... holder name val val ToString(i) ] */ + duk__dec_reviver_walk(js_ctx); /* -> [ ... holder name val new_elem ] */ + + if (duk_is_undefined(ctx, -1)) { + duk_pop(ctx); + duk_del_prop_index(ctx, -1, i); + } else { + /* XXX: duk_xdef_prop_index_wec() would be more appropriate + * here but it currently makes some assumptions that might + * not hold (e.g. that previous property is not an accessor). + */ + duk_put_prop_index(ctx, -2, i); + } + } + } else { + /* [ ... holder name val ] */ + duk_enum(ctx, -1, DUK_ENUM_OWN_PROPERTIES_ONLY /*flags*/); + while (duk_next(ctx, -1 /*enum_index*/, 0 /*get_value*/)) { + DUK_DDD(DUK_DDDPRINT("walk: object, top=%ld, holder=%!T, name=%!T, val=%!T, enum=%!iT, obj_key=%!T", + (long) duk_get_top(ctx), (duk_tval *) duk_get_tval(ctx, -5), + (duk_tval *) duk_get_tval(ctx, -4), (duk_tval *) duk_get_tval(ctx, -3), + (duk_tval *) duk_get_tval(ctx, -2), (duk_tval *) duk_get_tval(ctx, -1))); + + /* [ ... holder name val enum obj_key ] */ + duk_dup(ctx, -3); + duk_dup(ctx, -2); + + /* [ ... holder name val enum obj_key val obj_key ] */ + duk__dec_reviver_walk(js_ctx); + + /* [ ... holder name val enum obj_key new_elem ] */ + if (duk_is_undefined(ctx, -1)) { + duk_pop(ctx); + duk_del_prop(ctx, -3); + } else { + /* XXX: duk_xdef_prop_index_wec() would be more appropriate + * here but it currently makes some assumptions that might + * not hold (e.g. that previous property is not an accessor). + * + * Using duk_put_prop() works incorrectly with '__proto__' + * if the own property with that name has been deleted. This + * does not happen normally, but a clever reviver can trigger + * that, see complex reviver case in: test-bug-json-parse-__proto__.js. + */ + duk_put_prop(ctx, -4); + } + } + duk_pop(ctx); /* pop enum */ + } + } + + /* [ ... holder name val ] */ + + duk_dup(ctx, js_ctx->idx_reviver); + duk_insert(ctx, -4); /* -> [ ... reviver holder name val ] */ + duk_call_method(ctx, 2); /* -> [ ... res ] */ + + DUK_DDD(DUK_DDDPRINT("walk: top=%ld, result=%!T", + (long) duk_get_top(ctx), (duk_tval *) duk_get_tval(ctx, -1))); +} + +/* + * Stringify implementation. + */ + +#define DUK__EMIT_1(js_ctx,ch) duk__emit_1((js_ctx), (duk_uint_fast8_t) (ch)) +#define DUK__EMIT_2(js_ctx,ch1,ch2) duk__emit_2((js_ctx), (duk_uint_fast8_t) (ch1), (duk_uint_fast8_t) (ch2)) +#define DUK__EMIT_HSTR(js_ctx,h) duk__emit_hstring((js_ctx), (h)) +#if defined(DUK_USE_FASTINT) || defined(DUK_USE_JX) || defined(DUK_USE_JC) +#define DUK__EMIT_CSTR(js_ctx,p) duk__emit_cstring((js_ctx), (p)) +#endif +#define DUK__EMIT_STRIDX(js_ctx,i) duk__emit_stridx((js_ctx), (i)) +#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) +#define DUK__UNEMIT_1(js_ctx) duk__unemit_1((js_ctx)) +#endif + +DUK_LOCAL void duk__emit_1(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch) { + DUK_BW_WRITE_ENSURE_U8(js_ctx->thr, &js_ctx->bw, ch); +} + +DUK_LOCAL void duk__emit_2(duk_json_enc_ctx *js_ctx, duk_uint_fast8_t ch1, duk_uint_fast8_t ch2) { + DUK_BW_WRITE_ENSURE_U8_2(js_ctx->thr, &js_ctx->bw, ch1, ch2); +} + +DUK_LOCAL void duk__emit_hstring(duk_json_enc_ctx *js_ctx, duk_hstring *h) { + DUK_BW_WRITE_ENSURE_HSTRING(js_ctx->thr, &js_ctx->bw, h); +} + +#if defined(DUK_USE_FASTINT) || defined(DUK_USE_JX) || defined(DUK_USE_JC) +DUK_LOCAL void duk__emit_cstring(duk_json_enc_ctx *js_ctx, const char *str) { + DUK_BW_WRITE_ENSURE_CSTRING(js_ctx->thr, &js_ctx->bw, str); +} +#endif + +DUK_LOCAL void duk__emit_stridx(duk_json_enc_ctx *js_ctx, duk_small_uint_t stridx) { + duk_hstring *h; + + DUK_ASSERT_DISABLE(stridx >= 0); /* unsigned */ + DUK_ASSERT(stridx < DUK_HEAP_NUM_STRINGS); + h = DUK_HTHREAD_GET_STRING(js_ctx->thr, stridx); + DUK_ASSERT(h != NULL); + + DUK_BW_WRITE_ENSURE_HSTRING(js_ctx->thr, &js_ctx->bw, h); +} + +#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) +DUK_LOCAL void duk__unemit_1(duk_json_enc_ctx *js_ctx) { + DUK_ASSERT(DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw) >= 1); + DUK_BW_ADD_PTR(js_ctx->thr, &js_ctx->bw, -1); +} +#endif /* DUK_USE_JSON_STRINGIFY_FASTPATH */ + +#define DUK__MKESC(nybbles,esc1,esc2) \ + (((duk_uint_fast32_t) (nybbles)) << 16) | \ + (((duk_uint_fast32_t) (esc1)) << 8) | \ + ((duk_uint_fast32_t) (esc2)) + +DUK_LOCAL duk_uint8_t *duk__emit_esc_auto_fast(duk_json_enc_ctx *js_ctx, duk_uint_fast32_t cp, duk_uint8_t *q) { + duk_uint_fast32_t tmp; + duk_small_uint_t dig; + + DUK_UNREF(js_ctx); + + /* Caller ensures space for at least DUK__JSON_MAX_ESC_LEN. */ + + /* Select appropriate escape format automatically, and set 'tmp' to a + * value encoding both the escape format character and the nybble count: + * + * (nybble_count << 16) | (escape_char1) | (escape_char2) + */ + +#ifdef DUK_USE_JX + if (DUK_LIKELY(cp < 0x100UL)) { + if (DUK_UNLIKELY(js_ctx->flag_ext_custom)) { + tmp = DUK__MKESC(2, DUK_ASC_BACKSLASH, DUK_ASC_LC_X); + } else { + tmp = DUK__MKESC(4, DUK_ASC_BACKSLASH, DUK_ASC_LC_U); + } + } else +#endif + if (DUK_LIKELY(cp < 0x10000UL)) { + tmp = DUK__MKESC(4, DUK_ASC_BACKSLASH, DUK_ASC_LC_U); + } else { +#ifdef DUK_USE_JX + if (DUK_LIKELY(js_ctx->flag_ext_custom)) { + tmp = DUK__MKESC(8, DUK_ASC_BACKSLASH, DUK_ASC_UC_U); + } else +#endif + { + /* In compatible mode and standard JSON mode, output + * something useful for non-BMP characters. This won't + * roundtrip but will still be more or less readable and + * more useful than an error. + */ + tmp = DUK__MKESC(8, DUK_ASC_UC_U, DUK_ASC_PLUS); + } + } + + *q++ = (duk_uint8_t) ((tmp >> 8) & 0xff); + *q++ = (duk_uint8_t) (tmp & 0xff); + + tmp = tmp >> 16; + while (tmp > 0) { + tmp--; + dig = (duk_small_uint_t) ((cp >> (4 * tmp)) & 0x0f); + *q++ = duk_lc_digits[dig]; + } + + return q; +} + +/* Check whether key quotes would be needed (custom encoding). */ +DUK_LOCAL duk_bool_t duk__enc_key_quotes_needed(duk_hstring *h_key) { + const duk_uint8_t *p, *p_start, *p_end; + duk_small_uint_t ch; + + DUK_ASSERT(h_key != NULL); + p_start = DUK_HSTRING_GET_DATA(h_key); + p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_key); + p = p_start; + + DUK_DDD(DUK_DDDPRINT("duk__enc_key_quotes_needed: h_key=%!O, p_start=%p, p_end=%p, p=%p", + (duk_heaphdr *) h_key, (void *) p_start, (void *) p_end, (void *) p)); + + /* Since we only accept ASCII characters, there is no need for + * actual decoding. A non-ASCII character will be >= 0x80 which + * causes a false return value immediately. + */ + + if (p == p_end) { + /* Zero length string is not accepted without quotes */ + return 1; + } + + while (p < p_end) { + ch = (duk_small_uint_t) (*p); + + /* Accept ASCII IdentifierStart and IdentifierPart if not first char. + * Function selection is a bit uncommon. + */ + if ((p > p_start ? duk_unicode_is_identifier_part : + duk_unicode_is_identifier_start) ((duk_codepoint_t) ch)) { + p++; + continue; + } + + /* all non-ASCII characters also come here (first byte >= 0x80) */ + return 1; + } + + return 0; +} + +/* The Quote(value) operation: quote a string. + * + * Stack policy: [ ] -> [ ]. + */ + +DUK_LOCAL void duk__enc_quote_string(duk_json_enc_ctx *js_ctx, duk_hstring *h_str) { + duk_hthread *thr = js_ctx->thr; + const duk_uint8_t *p, *p_start, *p_end, *p_now, *p_tmp; + duk_uint8_t *q; + duk_ucodepoint_t cp; /* typed for duk_unicode_decode_xutf8() */ + + DUK_DDD(DUK_DDDPRINT("duk__enc_quote_string: h_str=%!O", (duk_heaphdr *) h_str)); + + DUK_ASSERT(h_str != NULL); + p_start = DUK_HSTRING_GET_DATA(h_str); + p_end = p_start + DUK_HSTRING_GET_BYTELEN(h_str); + p = p_start; + + DUK__EMIT_1(js_ctx, DUK_ASC_DOUBLEQUOTE); + + /* Encode string in small chunks, estimating the maximum expansion so that + * there's no need to ensure space while processing the chunk. + */ + + while (p < p_end) { + duk_size_t left, now, space; + + left = (duk_size_t) (p_end - p); + now = (left > DUK__JSON_ENCSTR_CHUNKSIZE ? + DUK__JSON_ENCSTR_CHUNKSIZE : left); + + /* Maximum expansion per input byte is 6: + * - invalid UTF-8 byte causes "\uXXXX" to be emitted (6/1 = 6). + * - 2-byte UTF-8 encodes as "\uXXXX" (6/2 = 3). + * - 4-byte UTF-8 encodes as "\Uxxxxxxxx" (10/4 = 2.5). + */ + space = now * 6; + q = DUK_BW_ENSURE_GETPTR(thr, &js_ctx->bw, space); + + p_now = p + now; + + while (p < p_now) { +#if defined(DUK_USE_JSON_QUOTESTRING_FASTPATH) + duk_uint8_t b; + + b = duk__json_quotestr_lookup[*p++]; + if (DUK_LIKELY(b < 0x80)) { + /* Most input bytes go through here. */ + *q++ = b; + } else if (b >= 0xa0) { + *q++ = DUK_ASC_BACKSLASH; + *q++ = (duk_uint8_t) (b - 0x80); + } else if (b == 0x80) { + cp = (duk_ucodepoint_t) (*(p - 1)); + q = duk__emit_esc_auto_fast(js_ctx, cp, q); + } else if (b == 0x7f && js_ctx->flag_ascii_only) { + /* 0x7F is special */ + DUK_ASSERT(b == 0x81); + cp = (duk_ucodepoint_t) 0x7f; + q = duk__emit_esc_auto_fast(js_ctx, cp, q); + } else { + DUK_ASSERT(b == 0x81); + p--; + + /* slow path is shared */ +#else /* DUK_USE_JSON_QUOTESTRING_FASTPATH */ + cp = *p; + + if (DUK_LIKELY(cp <= 0x7f)) { + /* ascii fast path: avoid decoding utf-8 */ + p++; + if (cp == 0x22 || cp == 0x5c) { + /* double quote or backslash */ + *q++ = DUK_ASC_BACKSLASH; + *q++ = (duk_uint8_t) cp; + } else if (cp < 0x20) { + duk_uint_fast8_t esc_char; + + /* This approach is a bit shorter than a straight + * if-else-ladder and also a bit faster. + */ + if (cp < (sizeof(duk__json_quotestr_esc) / sizeof(duk_uint8_t)) && + (esc_char = duk__json_quotestr_esc[cp]) != 0) { + *q++ = DUK_ASC_BACKSLASH; + *q++ = (duk_uint8_t) esc_char; + } else { + q = duk__emit_esc_auto_fast(js_ctx, cp, q); + } + } else if (cp == 0x7f && js_ctx->flag_ascii_only) { + q = duk__emit_esc_auto_fast(js_ctx, cp, q); + } else { + /* any other printable -> as is */ + *q++ = (duk_uint8_t) cp; + } + } else { + /* slow path is shared */ +#endif /* DUK_USE_JSON_QUOTESTRING_FASTPATH */ + + /* slow path decode */ + + /* If XUTF-8 decoding fails, treat the offending byte as a codepoint directly + * and go forward one byte. This is of course very lossy, but allows some kind + * of output to be produced even for internal strings which don't conform to + * XUTF-8. All standard Ecmascript strings are always CESU-8, so this behavior + * does not violate the Ecmascript specification. The behavior is applied to + * all modes, including Ecmascript standard JSON. Because the current XUTF-8 + * decoding is not very strict, this behavior only really affects initial bytes + * and truncated codepoints. + * + * Another alternative would be to scan forwards to start of next codepoint + * (or end of input) and emit just one replacement codepoint. + */ + + p_tmp = p; + if (!duk_unicode_decode_xutf8(thr, &p, p_start, p_end, &cp)) { + /* Decode failed. */ + cp = *p_tmp; + p = p_tmp + 1; + } + +#ifdef DUK_USE_NONSTD_JSON_ESC_U2028_U2029 + if (js_ctx->flag_ascii_only || cp == 0x2028 || cp == 0x2029) { +#else + if (js_ctx->flag_ascii_only) { +#endif + q = duk__emit_esc_auto_fast(js_ctx, cp, q); + } else { + /* as is */ + DUK_RAW_WRITE_XUTF8(q, cp); + } + } + } + + DUK_BW_SET_PTR(thr, &js_ctx->bw, q); + } + + DUK__EMIT_1(js_ctx, DUK_ASC_DOUBLEQUOTE); +} + +/* Encode a double (checked by caller) from stack top. Stack top may be + * replaced by serialized string but is not popped (caller does that). + */ +DUK_LOCAL void duk__enc_double(duk_json_enc_ctx *js_ctx) { + duk_context *ctx; + duk_tval *tv; + duk_double_t d; + duk_small_int_t c; + duk_small_int_t s; + duk_small_uint_t stridx; + duk_small_uint_t n2s_flags; + duk_hstring *h_str; + + DUK_ASSERT(js_ctx != NULL); + ctx = (duk_context *) js_ctx->thr; + DUK_ASSERT(ctx != NULL); + + /* Caller must ensure 'tv' is indeed a double and not a fastint! */ + tv = duk_get_tval(ctx, -1); + DUK_ASSERT(tv != NULL); + DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv)); + d = DUK_TVAL_GET_DOUBLE(tv); + + c = (duk_small_int_t) DUK_FPCLASSIFY(d); + s = (duk_small_int_t) DUK_SIGNBIT(d); + DUK_UNREF(s); + + if (DUK_LIKELY(!(c == DUK_FP_INFINITE || c == DUK_FP_NAN))) { + DUK_ASSERT(DUK_ISFINITE(d)); + +#if defined(DUK_USE_JX) || defined(DUK_USE_JC) + /* Negative zero needs special handling in JX/JC because + * it would otherwise serialize to '0', not '-0'. + */ + if (DUK_UNLIKELY(c == DUK_FP_ZERO && s != 0 && + (js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible))) { + duk_push_hstring_stridx(ctx, DUK_STRIDX_MINUS_ZERO); /* '-0' */ + } else +#endif /* DUK_USE_JX || DUK_USE_JC */ + { + n2s_flags = 0; + /* [ ... number ] -> [ ... string ] */ + duk_numconv_stringify(ctx, 10 /*radix*/, 0 /*digits*/, n2s_flags); + } + h_str = duk_to_hstring(ctx, -1); + DUK_ASSERT(h_str != NULL); + DUK__EMIT_HSTR(js_ctx, h_str); + return; + } + +#if defined(DUK_USE_JX) || defined(DUK_USE_JC) + if (!(js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM | + DUK_JSON_FLAG_EXT_COMPATIBLE))) { + stridx = DUK_STRIDX_LC_NULL; + } else if (c == DUK_FP_NAN) { + stridx = js_ctx->stridx_custom_nan; + } else if (s == 0) { + stridx = js_ctx->stridx_custom_posinf; + } else { + stridx = js_ctx->stridx_custom_neginf; + } +#else + stridx = DUK_STRIDX_LC_NULL; +#endif + DUK__EMIT_STRIDX(js_ctx, stridx); +} + +#if defined(DUK_USE_FASTINT) +/* Encode a fastint from duk_tval ptr, no value stack effects. */ +DUK_LOCAL void duk__enc_fastint_tval(duk_json_enc_ctx *js_ctx, duk_tval *tv) { + duk_int64_t v; + + /* Fastint range is signed 48-bit so longest value is -2^47 = -140737488355328 + * (16 chars long), longest signed 64-bit value is -2^63 = -9223372036854775808 + * (20 chars long). Alloc space for 64-bit range to be safe. + */ + duk_uint8_t buf[20 + 1]; + + /* Caller must ensure 'tv' is indeed a fastint! */ + DUK_ASSERT(DUK_TVAL_IS_FASTINT(tv)); + v = DUK_TVAL_GET_FASTINT(tv); + + /* XXX: There are no format strings in duk_config.h yet, could add + * one for formatting duk_int64_t. For now, assumes "%lld" and that + * "long long" type exists. Could also rely on C99 directly but that + * won't work for older MSVC. + */ + DUK_SPRINTF((char *) buf, "%lld", (long long) v); + DUK__EMIT_CSTR(js_ctx, (const char *) buf); +} +#endif + +/* Shared entry handling for object/array serialization: indent/stepback, + * loop detection. + */ +DUK_LOCAL void duk__enc_objarr_entry(duk_json_enc_ctx *js_ctx, duk_hstring **h_stepback, duk_hstring **h_indent, duk_idx_t *entry_top) { + duk_context *ctx = (duk_context *) js_ctx->thr; + duk_hobject *h_target; + + *entry_top = duk_get_top(ctx); + + duk_require_stack(ctx, DUK_JSON_ENC_REQSTACK); + + /* loop check */ + + h_target = duk_get_hobject(ctx, -1); /* object or array */ + DUK_ASSERT(h_target != NULL); + + /* XXX: this check is very expensive, perhaps use a small + * array to make it faster for at least reasonably shallow + * objects? + */ + duk_push_sprintf(ctx, DUK_STR_FMT_PTR, (void *) h_target); + duk_dup_top(ctx); /* -> [ ... voidp voidp ] */ + if (duk_has_prop(ctx, js_ctx->idx_loop)) { + DUK_ERROR((duk_hthread *) ctx, DUK_ERR_TYPE_ERROR, DUK_STR_CYCLIC_INPUT); + } + duk_push_true(ctx); /* -> [ ... voidp true ] */ + duk_put_prop(ctx, js_ctx->idx_loop); /* -> [ ... ] */ + + /* c recursion check */ + + DUK_ASSERT(js_ctx->recursion_depth >= 0); + DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); + if (js_ctx->recursion_depth >= js_ctx->recursion_limit) { + DUK_ERROR((duk_hthread *) ctx, DUK_ERR_RANGE_ERROR, DUK_STR_JSONENC_RECLIMIT); + } + js_ctx->recursion_depth++; + + /* figure out indent and stepback */ + + *h_indent = NULL; + *h_stepback = NULL; + if (js_ctx->h_gap != NULL) { + DUK_ASSERT(js_ctx->h_indent != NULL); + + *h_stepback = js_ctx->h_indent; + duk_push_hstring(ctx, js_ctx->h_indent); + duk_push_hstring(ctx, js_ctx->h_gap); + duk_concat(ctx, 2); + js_ctx->h_indent = duk_get_hstring(ctx, -1); + *h_indent = js_ctx->h_indent; + DUK_ASSERT(js_ctx->h_indent != NULL); + + /* The new indent string is left at value stack top, and will + * be popped by the shared exit handler. + */ + } else { + DUK_ASSERT(js_ctx->h_indent == NULL); + } + + DUK_DDD(DUK_DDDPRINT("shared entry finished: top=%ld, loop=%!T", + (long) duk_get_top(ctx), (duk_tval *) duk_get_tval(ctx, js_ctx->idx_loop))); +} + +/* Shared exit handling for object/array serialization. */ +DUK_LOCAL void duk__enc_objarr_exit(duk_json_enc_ctx *js_ctx, duk_hstring **h_stepback, duk_hstring **h_indent, duk_idx_t *entry_top) { + duk_context *ctx = (duk_context *) js_ctx->thr; + duk_hobject *h_target; + + DUK_UNREF(h_indent); + + if (js_ctx->h_gap != NULL) { + DUK_ASSERT(js_ctx->h_indent != NULL); + DUK_ASSERT(*h_stepback != NULL); + DUK_ASSERT(*h_indent != NULL); + + js_ctx->h_indent = *h_stepback; /* previous js_ctx->h_indent */ + + /* Note: we don't need to pop anything because the duk_set_top() + * at the end will take care of it. + */ + } else { + DUK_ASSERT(js_ctx->h_indent == NULL); + DUK_ASSERT(*h_stepback == NULL); + DUK_ASSERT(*h_indent == NULL); + } + + /* c recursion check */ + + DUK_ASSERT(js_ctx->recursion_depth > 0); + DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); + js_ctx->recursion_depth--; + + /* loop check */ + + h_target = duk_get_hobject(ctx, *entry_top - 1); /* original target at entry_top - 1 */ + DUK_ASSERT(h_target != NULL); + + /* XXX: this check is very expensive */ + duk_push_sprintf(ctx, DUK_STR_FMT_PTR, (void *) h_target); + duk_del_prop(ctx, js_ctx->idx_loop); /* -> [ ... ] */ + + /* restore stack top after unbalanced code paths */ + duk_set_top(ctx, *entry_top); + + DUK_DDD(DUK_DDDPRINT("shared entry finished: top=%ld, loop=%!T", + (long) duk_get_top(ctx), (duk_tval *) duk_get_tval(ctx, js_ctx->idx_loop))); +} + +/* The JO(value) operation: encode object. + * + * Stack policy: [ object ] -> [ object ]. + */ +DUK_LOCAL void duk__enc_object(duk_json_enc_ctx *js_ctx) { + duk_context *ctx = (duk_context *) js_ctx->thr; + duk_hstring *h_stepback; + duk_hstring *h_indent; + duk_hstring *h_key; + duk_idx_t entry_top; + duk_idx_t idx_obj; + duk_idx_t idx_keys; + duk_bool_t first; + duk_bool_t undef; + duk_uarridx_t arr_len, i; + + DUK_DDD(DUK_DDDPRINT("duk__enc_object: obj=%!T", (duk_tval *) duk_get_tval(ctx, -1))); + + duk__enc_objarr_entry(js_ctx, &h_stepback, &h_indent, &entry_top); + + idx_obj = entry_top - 1; + + if (js_ctx->idx_proplist >= 0) { + idx_keys = js_ctx->idx_proplist; + } else { + /* XXX: would be nice to enumerate an object at specified index */ + duk_dup(ctx, idx_obj); + (void) duk_hobject_get_enumerated_keys(ctx, DUK_ENUM_OWN_PROPERTIES_ONLY /*flags*/); /* [ ... target ] -> [ ... target keys ] */ + idx_keys = duk_require_normalize_index(ctx, -1); + /* leave stack unbalanced on purpose */ + } + + DUK_DDD(DUK_DDDPRINT("idx_keys=%ld, h_keys=%!T", + (long) idx_keys, (duk_tval *) duk_get_tval(ctx, idx_keys))); + + /* Steps 8-10 have been merged to avoid a "partial" variable. */ + + DUK__EMIT_1(js_ctx, DUK_ASC_LCURLY); + + /* XXX: keys is an internal object with all keys to be processed + * in its (gapless) array part. Because nobody can touch the keys + * object, we could iterate its array part directly (keeping in mind + * that it can be reallocated). + */ + + arr_len = (duk_uarridx_t) duk_get_length(ctx, idx_keys); + first = 1; + for (i = 0; i < arr_len; i++) { + duk_get_prop_index(ctx, idx_keys, i); /* -> [ ... key ] */ + + DUK_DDD(DUK_DDDPRINT("object property loop: holder=%!T, key=%!T", + (duk_tval *) duk_get_tval(ctx, idx_obj), + (duk_tval *) duk_get_tval(ctx, -1))); + + undef = duk__enc_value1(js_ctx, idx_obj); + if (undef) { + /* Value would yield 'undefined', so skip key altogether. + * Side effects have already happened. + */ + continue; + } + + /* [ ... key val ] */ + + if (first) { + first = 0; + } else { + DUK__EMIT_1(js_ctx, DUK_ASC_COMMA); + } + if (h_indent != NULL) { + DUK__EMIT_1(js_ctx, 0x0a); + DUK__EMIT_HSTR(js_ctx, h_indent); + } + + h_key = duk_get_hstring(ctx, -2); + DUK_ASSERT(h_key != NULL); + if (js_ctx->flag_avoid_key_quotes && !duk__enc_key_quotes_needed(h_key)) { + /* emit key as is */ + DUK__EMIT_HSTR(js_ctx, h_key); + } else { + duk__enc_quote_string(js_ctx, h_key); + } + + if (h_indent != NULL) { + DUK__EMIT_2(js_ctx, DUK_ASC_COLON, DUK_ASC_SPACE); + } else { + DUK__EMIT_1(js_ctx, DUK_ASC_COLON); + } + + /* [ ... key val ] */ + + duk__enc_value2(js_ctx); /* -> [ ... ] */ + } + + if (!first) { + if (h_stepback != NULL) { + DUK_ASSERT(h_indent != NULL); + DUK__EMIT_1(js_ctx, 0x0a); + DUK__EMIT_HSTR(js_ctx, h_stepback); + } + } + DUK__EMIT_1(js_ctx, DUK_ASC_RCURLY); + + duk__enc_objarr_exit(js_ctx, &h_stepback, &h_indent, &entry_top); + + DUK_ASSERT_TOP(ctx, entry_top); +} + +/* The JA(value) operation: encode array. + * + * Stack policy: [ array ] -> [ array ]. + */ +DUK_LOCAL void duk__enc_array(duk_json_enc_ctx *js_ctx) { + duk_context *ctx = (duk_context *) js_ctx->thr; + duk_hstring *h_stepback; + duk_hstring *h_indent; + duk_idx_t entry_top; + duk_idx_t idx_arr; + duk_bool_t undef; + duk_uarridx_t i, arr_len; + + DUK_DDD(DUK_DDDPRINT("duk__enc_array: array=%!T", + (duk_tval *) duk_get_tval(ctx, -1))); + + duk__enc_objarr_entry(js_ctx, &h_stepback, &h_indent, &entry_top); + + idx_arr = entry_top - 1; + + /* Steps 8-10 have been merged to avoid a "partial" variable. */ + + DUK__EMIT_1(js_ctx, DUK_ASC_LBRACKET); + + arr_len = (duk_uarridx_t) duk_get_length(ctx, idx_arr); + for (i = 0; i < arr_len; i++) { + DUK_DDD(DUK_DDDPRINT("array entry loop: array=%!T, h_indent=%!O, h_stepback=%!O, index=%ld, arr_len=%ld", + (duk_tval *) duk_get_tval(ctx, idx_arr), (duk_heaphdr *) h_indent, + (duk_heaphdr *) h_stepback, (long) i, (long) arr_len)); + + if (i > 0) { + DUK__EMIT_1(js_ctx, DUK_ASC_COMMA); + } + if (h_indent != NULL) { + DUK__EMIT_1(js_ctx, 0x0a); + DUK__EMIT_HSTR(js_ctx, h_indent); + } + + /* XXX: duk_push_uint_string() */ + duk_push_uint(ctx, (duk_uint_t) i); + duk_to_string(ctx, -1); /* -> [ ... key ] */ + undef = duk__enc_value1(js_ctx, idx_arr); + + if (undef) { + DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); + } else { + /* [ ... key val ] */ + duk__enc_value2(js_ctx); + } + } + + if (arr_len > 0) { + if (h_stepback != NULL) { + DUK_ASSERT(h_indent != NULL); + DUK__EMIT_1(js_ctx, 0x0a); + DUK__EMIT_HSTR(js_ctx, h_stepback); + } + } + DUK__EMIT_1(js_ctx, DUK_ASC_RBRACKET); + + duk__enc_objarr_exit(js_ctx, &h_stepback, &h_indent, &entry_top); + + DUK_ASSERT_TOP(ctx, entry_top); +} + +/* The Str(key, holder) operation: encode value, steps 1-4. + * + * Returns non-zero if the value between steps 4 and 5 would yield an + * 'undefined' final result. This is useful in JO() because we need to + * get the side effects out, but need to know whether or not a key will + * be omitted from the serialization. + * + * Stack policy: [ ... key ] -> [ ... key val ] if retval == 0. + * -> [ ... ] if retval != 0. + */ +DUK_LOCAL duk_bool_t duk__enc_value1(duk_json_enc_ctx *js_ctx, duk_idx_t idx_holder) { + duk_context *ctx = (duk_context *) js_ctx->thr; + duk_hthread *thr = (duk_hthread *) ctx; + duk_hobject *h; + duk_tval *tv; + duk_small_int_t c; + + DUK_DDD(DUK_DDDPRINT("duk__enc_value1: idx_holder=%ld, holder=%!T, key=%!T", + (long) idx_holder, (duk_tval *) duk_get_tval(ctx, idx_holder), + (duk_tval *) duk_get_tval(ctx, -1))); + + DUK_UNREF(thr); + + duk_dup_top(ctx); /* -> [ ... key key ] */ + duk_get_prop(ctx, idx_holder); /* -> [ ... key val ] */ + + DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(ctx, -1))); + + h = duk_get_hobject_or_lfunc_coerce(ctx, -1); + if (h != NULL) { + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_TO_JSON); + h = duk_get_hobject_or_lfunc_coerce(ctx, -1); /* toJSON() can also be a lightfunc */ + + if (h != NULL && DUK_HOBJECT_IS_CALLABLE(h)) { + DUK_DDD(DUK_DDDPRINT("value is object, has callable toJSON() -> call it")); + duk_dup(ctx, -2); /* -> [ ... key val toJSON val ] */ + duk_dup(ctx, -4); /* -> [ ... key val toJSON val key ] */ + duk_call_method(ctx, 1); /* -> [ ... key val val' ] */ + duk_remove(ctx, -2); /* -> [ ... key val' ] */ + } else { + duk_pop(ctx); + } + } + + /* [ ... key val ] */ + + DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(ctx, -1))); + + if (js_ctx->h_replacer) { + /* XXX: here a "slice copy" would be useful */ + DUK_DDD(DUK_DDDPRINT("replacer is set, call replacer")); + duk_push_hobject(ctx, js_ctx->h_replacer); /* -> [ ... key val replacer ] */ + duk_dup(ctx, idx_holder); /* -> [ ... key val replacer holder ] */ + duk_dup(ctx, -4); /* -> [ ... key val replacer holder key ] */ + duk_dup(ctx, -4); /* -> [ ... key val replacer holder key val ] */ + duk_call_method(ctx, 2); /* -> [ ... key val val' ] */ + duk_remove(ctx, -2); /* -> [ ... key val' ] */ + } + + /* [ ... key val ] */ + + DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(ctx, -1))); + + tv = duk_get_tval(ctx, -1); + DUK_ASSERT(tv != NULL); + if (DUK_TVAL_IS_OBJECT(tv)) { + h = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h != NULL); + + if (DUK_HOBJECT_IS_BUFFEROBJECT(h)) { + duk_hbufferobject *h_bufobj; + h_bufobj = (duk_hbufferobject *) h; + DUK_ASSERT_HBUFFEROBJECT_VALID(h_bufobj); + if (h_bufobj->buf == NULL || !DUK_HBUFFEROBJECT_VALID_SLICE(h_bufobj)) { + duk_push_null(ctx); + } else if (DUK_HBUFFEROBJECT_FULL_SLICE(h_bufobj)) { + duk_push_hbuffer(ctx, h_bufobj->buf); + } else { + /* This is not very good because we're making a copy + * for serialization, but only for proper views. + * Better support would be to serialize slices + * directly but since we only push a raw buffer + * here we can't convey the slice offset/length. + */ + duk_uint8_t *p_buf; + + p_buf = (duk_uint8_t *) duk_push_fixed_buffer(ctx, h_bufobj->length); + DUK_MEMCPY((void *) p_buf, + (const void *) (DUK_HBUFFEROBJECT_GET_SLICE_BASE(thr->heap, h_bufobj)), + h_bufobj->length); + } + duk_remove(ctx, -2); + } else { + c = (duk_small_int_t) DUK_HOBJECT_GET_CLASS_NUMBER(h); + switch ((int) c) { + case DUK_HOBJECT_CLASS_NUMBER: { + DUK_DDD(DUK_DDDPRINT("value is a Number object -> coerce with ToNumber()")); + duk_to_number(ctx, -1); + break; + } + case DUK_HOBJECT_CLASS_STRING: { + DUK_DDD(DUK_DDDPRINT("value is a String object -> coerce with ToString()")); + duk_to_string(ctx, -1); + break; + } +#if defined(DUK_USE_JX) || defined(DUK_USE_JC) + case DUK_HOBJECT_CLASS_POINTER: +#endif + case DUK_HOBJECT_CLASS_BOOLEAN: { + DUK_DDD(DUK_DDDPRINT("value is a Boolean/Buffer/Pointer object -> get internal value")); + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_INT_VALUE); + duk_remove(ctx, -2); + break; + } + } /* end switch */ + } + } + + /* [ ... key val ] */ + + DUK_DDD(DUK_DDDPRINT("value=%!T", (duk_tval *) duk_get_tval(ctx, -1))); + + if (duk_check_type_mask(ctx, -1, js_ctx->mask_for_undefined)) { + /* will result in undefined */ + DUK_DDD(DUK_DDDPRINT("-> will result in undefined (type mask check)")); + goto undef; + } + + /* functions are detected specially */ + h = duk_get_hobject(ctx, -1); + if (h != NULL && DUK_HOBJECT_IS_CALLABLE(h)) { + if (js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM | + DUK_JSON_FLAG_EXT_COMPATIBLE)) { + /* function will be serialized to custom format */ + } else { + /* functions are not serialized, results in undefined */ + DUK_DDD(DUK_DDDPRINT("-> will result in undefined (function)")); + goto undef; + } + } + + DUK_DDD(DUK_DDDPRINT("-> will not result in undefined")); + return 0; + + undef: + duk_pop_2(ctx); + return 1; +} + +/* The Str(key, holder) operation: encode value, steps 5-10. + * + * This must not be called unless duk__enc_value1() returns non-zero. + * If so, this is guaranteed to produce a non-undefined result. + * Non-standard encodings (e.g. for undefined) are only used if + * duk__enc_value1() indicates they are accepted; they're not + * checked or asserted here again. + * + * Stack policy: [ ... key val ] -> [ ... ]. + */ +DUK_LOCAL void duk__enc_value2(duk_json_enc_ctx *js_ctx) { + duk_context *ctx = (duk_context *) js_ctx->thr; + duk_hthread *thr = (duk_hthread *) ctx; + duk_tval *tv; + + DUK_UNREF(thr); + + DUK_DDD(DUK_DDDPRINT("duk__enc_value2: key=%!T, val=%!T", + (duk_tval *) duk_get_tval(ctx, -2), + (duk_tval *) duk_get_tval(ctx, -1))); + + /* [ ... key val ] */ + + tv = duk_get_tval(ctx, -1); + DUK_ASSERT(tv != NULL); + + switch (DUK_TVAL_GET_TAG(tv)) { +#if defined(DUK_USE_JX) || defined(DUK_USE_JC) + /* When JX/JC not in use, duk__enc_value1 will block undefined values. */ + case DUK_TAG_UNDEFINED: { + DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_undefined); + break; + } +#endif + case DUK_TAG_NULL: { + DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); + break; + } + case DUK_TAG_BOOLEAN: { + DUK__EMIT_STRIDX(js_ctx, DUK_TVAL_GET_BOOLEAN(tv) ? + DUK_STRIDX_TRUE : DUK_STRIDX_FALSE); + break; + } +#if defined(DUK_USE_JX) || defined(DUK_USE_JC) + /* When JX/JC not in use, duk__enc_value1 will block pointer values. */ + case DUK_TAG_POINTER: { + char buf[64]; /* XXX: how to figure correct size? */ + const char *fmt; + void *ptr = DUK_TVAL_GET_POINTER(tv); + + DUK_MEMZERO(buf, sizeof(buf)); + + /* The #ifdef clutter here needs to handle the three cases: + * (1) JX+JC, (2) JX only, (3) JC only. + */ +#if defined(DUK_USE_JX) && defined(DUK_USE_JC) + if (js_ctx->flag_ext_custom) +#endif +#if defined(DUK_USE_JX) + { + fmt = ptr ? "(%p)" : "(null)"; + } +#endif +#if defined(DUK_USE_JX) && defined(DUK_USE_JC) + else +#endif +#if defined(DUK_USE_JC) + { + fmt = ptr ? "{\"_ptr\":\"%p\"}" : "{\"_ptr\":\"null\"}"; + } +#endif + + /* When ptr == NULL, the format argument is unused. */ + DUK_SNPRINTF(buf, sizeof(buf) - 1, fmt, ptr); /* must not truncate */ + DUK__EMIT_CSTR(js_ctx, buf); + break; + } +#endif /* DUK_USE_JX || DUK_USE_JC */ + case DUK_TAG_STRING: { + duk_hstring *h = DUK_TVAL_GET_STRING(tv); + DUK_ASSERT(h != NULL); + + duk__enc_quote_string(js_ctx, h); + break; + } + case DUK_TAG_OBJECT: { + duk_hobject *h = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h != NULL); + +#if defined(DUK_USE_JX) || defined(DUK_USE_JC) + if (DUK_HOBJECT_IS_CALLABLE(h)) { + /* We only get here when doing non-standard JSON encoding */ + DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible); + DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function); + } else /* continues below */ +#endif + if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) { + duk__enc_array(js_ctx); + } else { + duk__enc_object(js_ctx); + } + break; + } +#if defined(DUK_USE_JX) || defined(DUK_USE_JC) + /* When JX/JC not in use, duk__enc_value1 will block buffer values. */ + case DUK_TAG_BUFFER: { + /* Buffer values are encoded in (lowercase) hex to make the + * binary data readable. Base64 or similar would be more + * compact but less readable, and the point of JX/JC + * variants is to be as useful to a programmer as possible. + */ + + /* The #ifdef clutter here needs to handle the three cases: + * (1) JX+JC, (2) JX only, (3) JC only. + */ +#if defined(DUK_USE_JX) && defined(DUK_USE_JC) + if (js_ctx->flag_ext_custom) +#endif +#if defined(DUK_USE_JX) + { + duk_uint8_t *p, *p_end; + duk_small_uint_t x; + duk_hbuffer *h; + duk_uint8_t *q; + duk_size_t space; + + h = DUK_TVAL_GET_BUFFER(tv); + DUK_ASSERT(h != NULL); + p = (duk_uint8_t *) DUK_HBUFFER_GET_DATA_PTR(thr->heap, h); + p_end = p + DUK_HBUFFER_GET_SIZE(h); + + space = 1 + DUK_HBUFFER_GET_SIZE(h) * 2 + 1; + DUK_ASSERT(DUK_HBUFFER_MAX_BYTELEN <= 0x7ffffffeUL); + DUK_ASSERT((space - 2) / 2 == DUK_HBUFFER_GET_SIZE(h)); /* overflow not possible, buffer limits */ + q = DUK_BW_ENSURE_GETPTR(thr, &js_ctx->bw, space); + + *q++ = DUK_ASC_PIPE; + while (p < p_end) { + x = *p++; + *q++ = duk_lc_digits[(x >> 4) & 0x0f]; + *q++ = duk_lc_digits[x & 0x0f]; + } + *q++ = DUK_ASC_PIPE; + + DUK_BW_SET_PTR(thr, &js_ctx->bw, q); + } +#endif +#if defined(DUK_USE_JX) && defined(DUK_USE_JC) + else +#endif +#if defined(DUK_USE_JC) + { + DUK_ASSERT(js_ctx->flag_ext_compatible); + duk_hex_encode(ctx, -1); + DUK__EMIT_CSTR(js_ctx, "{\"_buf\":"); + duk__enc_quote_string(js_ctx, duk_require_hstring(ctx, -1)); + DUK__EMIT_1(js_ctx, DUK_ASC_RCURLY); + } +#endif + break; + } +#endif /* DUK_USE_JX || DUK_USE_JC */ + case DUK_TAG_LIGHTFUNC: { +#if defined(DUK_USE_JX) || defined(DUK_USE_JC) + /* We only get here when doing non-standard JSON encoding */ + DUK_ASSERT(js_ctx->flag_ext_custom || js_ctx->flag_ext_compatible); + DUK__EMIT_STRIDX(js_ctx, js_ctx->stridx_custom_function); +#else + /* Standard JSON omits functions */ + DUK_UNREACHABLE(); +#endif + break; + } +#if defined(DUK_USE_FASTINT) + case DUK_TAG_FASTINT: + /* Number serialization has a significant impact relative to + * other fast path code, so careful fast path for fastints. + */ + duk__enc_fastint_tval(js_ctx, tv); + break; +#endif + default: { + /* number */ + /* XXX: A fast path for usual integers would be useful when + * fastint support is not enabled. + */ + duk__enc_double(js_ctx); + break; + } + } + + /* [ ... key val ] -> [ ... ] */ + + duk_pop_2(ctx); +} + +/* E5 Section 15.12.3, main algorithm, step 4.b.ii steps 1-4. */ +DUK_LOCAL duk_bool_t duk__enc_allow_into_proplist(duk_tval *tv) { + duk_hobject *h; + duk_small_int_t c; + + DUK_ASSERT(tv != NULL); + if (DUK_TVAL_IS_STRING(tv) || DUK_TVAL_IS_NUMBER(tv)) { + return 1; + } else if (DUK_TVAL_IS_OBJECT(tv)) { + h = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(h != NULL); + c = (duk_small_int_t) DUK_HOBJECT_GET_CLASS_NUMBER(h); + if (c == DUK_HOBJECT_CLASS_STRING || c == DUK_HOBJECT_CLASS_NUMBER) { + return 1; + } + } + + return 0; +} + +/* + * JSON.stringify() fast path + */ + +#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) +DUK_LOCAL duk_bool_t duk__json_stringify_fast_value(duk_json_enc_ctx *js_ctx, duk_tval *tv) { + duk_uint_fast32_t i, n; + + DUK_DDD(DUK_DDDPRINT("stringify fast: %!T", tv)); + + DUK_ASSERT(js_ctx != NULL); + DUK_ASSERT(js_ctx->thr != NULL); +#if defined(DUK_USE_JX) + DUK_ASSERT(js_ctx->flag_ext_custom == 0); +#endif +#if defined(DUK_USE_JC) + DUK_ASSERT(js_ctx->flag_ext_compatible == 0); +#endif + + restart_match: + DUK_ASSERT(tv != NULL); + + switch (DUK_TVAL_GET_TAG(tv)) { + case DUK_TAG_UNDEFINED: { + goto emit_undefined; + } + case DUK_TAG_NULL: { + DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); + break; + } + case DUK_TAG_BOOLEAN: { + DUK__EMIT_STRIDX(js_ctx, DUK_TVAL_GET_BOOLEAN(tv) ? + DUK_STRIDX_TRUE : DUK_STRIDX_FALSE); + break; + } + case DUK_TAG_STRING: { + duk_hstring *h; + + h = DUK_TVAL_GET_STRING(tv); + DUK_ASSERT(h != NULL); + duk__enc_quote_string(js_ctx, h); + break; + } + case DUK_TAG_OBJECT: { + duk_hobject *obj; + duk_tval *tv_val; + duk_bool_t emitted = 0; + duk_uint32_t c_bit, c_all, c_array, c_unbox, c_undef, c_object; + + /* For objects JSON.stringify() only looks for own, enumerable + * properties which is nice for the fast path here. + * + * For arrays JSON.stringify() uses [[Get]] so it will actually + * inherit properties during serialization! This fast path + * supports gappy arrays as long as there's no actual inherited + * property (which might be a getter etc). + * + * Since recursion only happens for objects, we can have both + * recursion and loop checks here. We use a simple, depth-limited + * loop check in the fast path because the object-based tracking + * is very slow (when tested, it accounted for 50% of fast path + * execution time for input data with a lot of small objects!). + */ + + obj = DUK_TVAL_GET_OBJECT(tv); + DUK_ASSERT(obj != NULL); + + /* We rely on a few object flag / class number relationships here, + * assert for them. + */ + DUK_ASSERT_HOBJECT_VALID(obj); + + /* Once recursion depth is increased, exit path must decrease + * it (though it's OK to abort the fast path). + */ + + DUK_ASSERT(js_ctx->recursion_depth >= 0); + DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); + if (js_ctx->recursion_depth >= js_ctx->recursion_limit) { + DUK_DD(DUK_DDPRINT("fast path recursion limit")); + DUK_ERROR(js_ctx->thr, DUK_ERR_RANGE_ERROR, DUK_STR_JSONDEC_RECLIMIT); + } + + for (i = 0, n = (duk_uint_fast32_t) js_ctx->recursion_depth; i < n; i++) { + if (js_ctx->visiting[i] == obj) { + DUK_DD(DUK_DDPRINT("fast path loop detect")); + DUK_ERROR(js_ctx->thr, DUK_ERR_TYPE_ERROR, DUK_STR_CYCLIC_INPUT); + } + } + + /* Guaranteed by recursion_limit setup so we don't have to + * check twice. + */ + DUK_ASSERT(js_ctx->recursion_depth < DUK_JSON_ENC_LOOPARRAY); + js_ctx->visiting[js_ctx->recursion_depth] = obj; + js_ctx->recursion_depth++; + + /* If object has a .toJSON() property, we can't be certain + * that it wouldn't mutate any value arbitrarily, so bail + * out of the fast path. + * + * If an object is a Proxy we also can't avoid side effects + * so abandon. + */ + if (duk_hobject_hasprop_raw(js_ctx->thr, obj, DUK_HTHREAD_STRING_TO_JSON(js_ctx->thr)) || + DUK_HOBJECT_HAS_EXOTIC_PROXYOBJ(obj)) { + DUK_DD(DUK_DDPRINT("object has a .toJSON property or object is a Proxy, abort fast path")); + goto abort_fastpath; + } + + /* We could use a switch-case for the class number but it turns out + * a small if-else ladder on class masks is better. The if-ladder + * should be in order of relevancy. + */ + + DUK_ASSERT(DUK_HOBJECT_CLASS_MAX <= 31); + c_all = DUK_HOBJECT_CMASK_ALL; + c_array = DUK_HOBJECT_CMASK_ARRAY; + c_unbox = DUK_HOBJECT_CMASK_NUMBER | + DUK_HOBJECT_CMASK_STRING | + DUK_HOBJECT_CMASK_BOOLEAN; + c_undef = DUK_HOBJECT_CMASK_FUNCTION | + DUK_HOBJECT_CMASK_ALL_BUFFEROBJECTS; + c_object = c_all & ~(c_array | c_unbox | c_undef); + + c_bit = DUK_HOBJECT_GET_CLASS_MASK(obj); + if (c_bit & c_object) { + /* All other object types. */ + DUK__EMIT_1(js_ctx, DUK_ASC_LCURLY); + + /* A non-Array object should not have an array part in practice. + * But since it is supported internally (and perhaps used at some + * point), check and abandon if that's the case. + */ + if (DUK_HOBJECT_HAS_ARRAY_PART(obj)) { + DUK_DD(DUK_DDPRINT("non-Array object has array part, abort fast path")); + goto abort_fastpath; + } + + for (i = 0; i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ENEXT(obj); i++) { + duk_hstring *k; + duk_size_t prev_size; + + k = DUK_HOBJECT_E_GET_KEY(js_ctx->thr->heap, obj, i); + if (!k) { + continue; + } + if (!DUK_HOBJECT_E_SLOT_IS_ENUMERABLE(js_ctx->thr->heap, obj, i)) { + continue; + } + if (DUK_HOBJECT_E_SLOT_IS_ACCESSOR(js_ctx->thr->heap, obj, i)) { + /* Getter might have arbitrary side effects, + * so bail out. + */ + DUK_DD(DUK_DDPRINT("property is an accessor, abort fast path")); + goto abort_fastpath; + } + if (DUK_HSTRING_HAS_INTERNAL(k)) { + continue; + } + + tv_val = DUK_HOBJECT_E_GET_VALUE_TVAL_PTR(js_ctx->thr->heap, obj, i); + + prev_size = DUK_BW_GET_SIZE(js_ctx->thr, &js_ctx->bw); + duk__enc_quote_string(js_ctx, k); + DUK__EMIT_1(js_ctx, DUK_ASC_COLON); + if (duk__json_stringify_fast_value(js_ctx, tv_val) == 0) { + DUK_DD(DUK_DDPRINT("prop value not supported, rewind key and colon")); + DUK_BW_SET_SIZE(js_ctx->thr, &js_ctx->bw, prev_size); + } else { + DUK__EMIT_1(js_ctx, DUK_ASC_COMMA); + emitted = 1; + } + } + + /* If any non-Array value had enumerable virtual own + * properties, they should be serialized here. Standard + * types don't. + */ + + if (emitted) { + DUK__UNEMIT_1(js_ctx); /* eat trailing comma */ + } + DUK__EMIT_1(js_ctx, DUK_ASC_RCURLY); + } else if (c_bit & c_array) { + duk_uint_fast32_t arr_len; + duk_uint_fast32_t asize; + + DUK__EMIT_1(js_ctx, DUK_ASC_LBRACKET); + + /* Assume arrays are dense in the fast path. */ + if (!DUK_HOBJECT_HAS_ARRAY_PART(obj)) { + DUK_DD(DUK_DDPRINT("Array object is sparse, abort fast path")); + goto abort_fastpath; + } + + arr_len = (duk_uint_fast32_t) duk_hobject_get_length(js_ctx->thr, obj); + asize = (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(obj); + if (arr_len > asize) { + /* Array length is larger than 'asize'. This shouldn't + * happen in practice. Bail out just in case. + */ + DUK_DD(DUK_DDPRINT("arr_len > asize, abort fast path")); + goto abort_fastpath; + } + /* Array part may be larger than 'length'; if so, iterate + * only up to array 'length'. + */ + for (i = 0; i < arr_len; i++) { + DUK_ASSERT(i < (duk_uint_fast32_t) DUK_HOBJECT_GET_ASIZE(obj)); + + tv_val = DUK_HOBJECT_A_GET_VALUE_PTR(js_ctx->thr->heap, obj, i); + + if (DUK_UNLIKELY(DUK_TVAL_IS_UNDEFINED_UNUSED(tv_val))) { + /* Gap in array; check for inherited property, + * bail out if one exists. This should be enough + * to support gappy arrays for all practical code. + */ + duk_hstring *h_tmp; + duk_bool_t has_inherited; + + /* XXX: refactor into an internal helper, pretty awkward */ + duk_push_uint((duk_context *) js_ctx->thr, (duk_uint_t) i); + h_tmp = duk_to_hstring((duk_context *) js_ctx->thr, -1); + DUK_ASSERT(h_tmp != NULL); + has_inherited = duk_hobject_hasprop_raw(js_ctx->thr, obj, h_tmp); + duk_pop((duk_context *) js_ctx->thr); + + if (has_inherited) { + DUK_D(DUK_DPRINT("gap in array, conflicting inherited property, abort fast path")); + goto abort_fastpath; + } + + /* Ordinary gap, undefined encodes to 'null' in + * standard JSON (and no JX/JC support here now). + */ + DUK_D(DUK_DPRINT("gap in array, no conflicting inherited property, remain on fast path")); + DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); + } else { + if (duk__json_stringify_fast_value(js_ctx, tv_val) == 0) { + DUK__EMIT_STRIDX(js_ctx, DUK_STRIDX_LC_NULL); + } + } + DUK__EMIT_1(js_ctx, DUK_ASC_COMMA); + emitted = 1; + } + + if (emitted) { + DUK__UNEMIT_1(js_ctx); /* eat trailing comma */ + } + DUK__EMIT_1(js_ctx, DUK_ASC_RBRACKET); + } else if (c_bit & c_unbox) { + /* These three boxed types are required to go through + * automatic unboxing. Rely on internal value being + * sane (to avoid infinite recursion). + */ + duk_tval *tv_internal; + + DUK_DD(DUK_DDPRINT("auto unboxing in fast path")); + + tv_internal = duk_hobject_get_internal_value_tval_ptr(js_ctx->thr->heap, obj); + DUK_ASSERT(tv_internal != NULL); + DUK_ASSERT(DUK_TVAL_IS_STRING(tv_internal) || + DUK_TVAL_IS_NUMBER(tv_internal) || + DUK_TVAL_IS_BOOLEAN(tv_internal)); + + /* XXX: for JX/JC, special handling for Pointer, and Buffer? */ + tv = tv_internal; + goto restart_match; + } else { + DUK_ASSERT((c_bit & c_undef) != 0); + + /* Function objects are treated as "undefined" by JSON. + * + * The slow path replaces a buffer object automatically with + * the binary data which then gets treated like "undefined". + * Since we don't support buffers here now, treat as "undefined". + */ + + /* Must decrease recursion depth before returning. */ + DUK_ASSERT(js_ctx->recursion_depth > 0); + DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); + js_ctx->recursion_depth--; + goto emit_undefined; + } + + DUK_ASSERT(js_ctx->recursion_depth > 0); + DUK_ASSERT(js_ctx->recursion_depth <= js_ctx->recursion_limit); + js_ctx->recursion_depth--; + break; + } + case DUK_TAG_BUFFER: { + goto emit_undefined; + } + case DUK_TAG_POINTER: { + goto emit_undefined; + } + case DUK_TAG_LIGHTFUNC: { + /* A lightfunc might also inherit a .toJSON() so just bail out. */ + DUK_DD(DUK_DDPRINT("value is a lightfunc, abort fast path")); + goto abort_fastpath; + } +#if defined(DUK_USE_FASTINT) + case DUK_TAG_FASTINT: { + /* Number serialization has a significant impact relative to + * other fast path code, so careful fast path for fastints. + */ + duk__enc_fastint_tval(js_ctx, tv); + break; + } +#endif + default: { + /* XXX: A fast path for usual integers would be useful when + * fastint support is not enabled. + */ + /* XXX: Stack discipline is annoying, could be changed in numconv. */ + duk_push_tval((duk_context *) js_ctx->thr, tv); + duk__enc_double(js_ctx); + duk_pop((duk_context *) js_ctx->thr); + +#if 0 + /* Could also rely on native sprintf(), but it will handle + * values like NaN, Infinity, -0, exponent notation etc in + * a JSON-incompatible way. + */ + duk_double_t d; + char buf[64]; + + DUK_ASSERT(DUK_TVAL_IS_DOUBLE(tv)); + d = DUK_TVAL_GET_DOUBLE(tv); + DUK_SPRINTF(buf, "%lg", d); + DUK__EMIT_CSTR(js_ctx, buf); +#endif + } + } + return 1; /* not undefined */ + + emit_undefined: + return 0; /* value was undefined/unsupported */ + + abort_fastpath: + /* Error message doesn't matter: the error is ignored anyway. */ + DUK_DD(DUK_DDPRINT("aborting fast path")); + DUK_ERROR(js_ctx->thr, DUK_ERR_ERROR, DUK_STR_INTERNAL_ERROR); + return 0; /* unreachable */ +} + +DUK_LOCAL duk_ret_t duk__json_stringify_fast(duk_context *ctx) { + duk_json_enc_ctx *js_ctx; + + DUK_ASSERT(ctx != NULL); + js_ctx = (duk_json_enc_ctx *) duk_get_pointer(ctx, -2); + DUK_ASSERT(js_ctx != NULL); + + if (duk__json_stringify_fast_value(js_ctx, duk_get_tval((duk_context *) (js_ctx->thr), -1)) == 0) { + DUK_DD(DUK_DDPRINT("top level value not supported, fail fast path")); + return DUK_RET_ERROR; /* error message doesn't matter, ignored anyway */ + } + + return 0; +} +#endif /* DUK_USE_JSON_STRINGIFY_FASTPATH */ + +/* + * Top level wrappers + */ + +DUK_INTERNAL +void duk_bi_json_parse_helper(duk_context *ctx, + duk_idx_t idx_value, + duk_idx_t idx_reviver, + duk_small_uint_t flags) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_json_dec_ctx js_ctx_alloc; + duk_json_dec_ctx *js_ctx = &js_ctx_alloc; + duk_hstring *h_text; +#ifdef DUK_USE_ASSERTIONS + duk_idx_t entry_top = duk_get_top(ctx); +#endif + + /* negative top-relative indices not allowed now */ + DUK_ASSERT(idx_value == DUK_INVALID_INDEX || idx_value >= 0); + DUK_ASSERT(idx_reviver == DUK_INVALID_INDEX || idx_reviver >= 0); + + DUK_DDD(DUK_DDDPRINT("JSON parse start: text=%!T, reviver=%!T, flags=0x%08lx, stack_top=%ld", + (duk_tval *) duk_get_tval(ctx, idx_value), + (duk_tval *) duk_get_tval(ctx, idx_reviver), + (unsigned long) flags, + (long) duk_get_top(ctx))); + + DUK_MEMZERO(&js_ctx_alloc, sizeof(js_ctx_alloc)); + js_ctx->thr = thr; +#ifdef DUK_USE_EXPLICIT_NULL_INIT + /* nothing now */ +#endif + js_ctx->recursion_limit = DUK_USE_JSON_DEC_RECLIMIT; + DUK_ASSERT(js_ctx->recursion_depth == 0); + + /* Flag handling currently assumes that flags are consistent. This is OK + * because the call sites are now strictly controlled. + */ + + js_ctx->flags = flags; +#ifdef DUK_USE_JX + js_ctx->flag_ext_custom = flags & DUK_JSON_FLAG_EXT_CUSTOM; +#endif +#ifdef DUK_USE_JC + js_ctx->flag_ext_compatible = flags & DUK_JSON_FLAG_EXT_COMPATIBLE; +#endif + + h_text = duk_to_hstring(ctx, idx_value); /* coerce in-place */ + DUK_ASSERT(h_text != NULL); + + /* JSON parsing code is allowed to read [p_start,p_end]: p_end is + * valid and points to the string NUL terminator (which is always + * guaranteed for duk_hstrings. + */ + js_ctx->p_start = (duk_uint8_t *) DUK_HSTRING_GET_DATA(h_text); + js_ctx->p = js_ctx->p_start; + js_ctx->p_end = ((duk_uint8_t *) DUK_HSTRING_GET_DATA(h_text)) + + DUK_HSTRING_GET_BYTELEN(h_text); + DUK_ASSERT(*(js_ctx->p_end) == 0x00); + + duk__dec_value(js_ctx); /* -> [ ... value ] */ + + /* Trailing whitespace has been eaten by duk__dec_value(), so if + * we're not at end of input here, it's a SyntaxError. + */ + + if (js_ctx->p != js_ctx->p_end) { + duk__dec_syntax_error(js_ctx); + } + + if (duk_is_callable(ctx, idx_reviver)) { + DUK_DDD(DUK_DDDPRINT("applying reviver: %!T", + (duk_tval *) duk_get_tval(ctx, idx_reviver))); + + js_ctx->idx_reviver = idx_reviver; + + duk_push_object(ctx); + duk_dup(ctx, -2); /* -> [ ... val root val ] */ + duk_put_prop_stridx(ctx, -2, DUK_STRIDX_EMPTY_STRING); /* default attrs ok */ + duk_push_hstring_stridx(ctx, DUK_STRIDX_EMPTY_STRING); /* -> [ ... val root "" ] */ + + DUK_DDD(DUK_DDDPRINT("start reviver walk, root=%!T, name=%!T", + (duk_tval *) duk_get_tval(ctx, -2), + (duk_tval *) duk_get_tval(ctx, -1))); + + duk__dec_reviver_walk(js_ctx); /* [ ... val root "" ] -> [ ... val val' ] */ + duk_remove(ctx, -2); /* -> [ ... val' ] */ + } else { + DUK_DDD(DUK_DDDPRINT("reviver does not exist or is not callable: %!T", + (duk_tval *) duk_get_tval(ctx, idx_reviver))); + } + + /* Final result is at stack top. */ + + DUK_DDD(DUK_DDDPRINT("JSON parse end: text=%!T, reviver=%!T, flags=0x%08lx, result=%!T, stack_top=%ld", + (duk_tval *) duk_get_tval(ctx, idx_value), + (duk_tval *) duk_get_tval(ctx, idx_reviver), + (unsigned long) flags, + (duk_tval *) duk_get_tval(ctx, -1), + (long) duk_get_top(ctx))); + + DUK_ASSERT(duk_get_top(ctx) == entry_top + 1); +} + +DUK_INTERNAL +void duk_bi_json_stringify_helper(duk_context *ctx, + duk_idx_t idx_value, + duk_idx_t idx_replacer, + duk_idx_t idx_space, + duk_small_uint_t flags) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_json_enc_ctx js_ctx_alloc; + duk_json_enc_ctx *js_ctx = &js_ctx_alloc; + duk_hobject *h; + duk_bool_t undef; + duk_idx_t idx_holder; + duk_idx_t entry_top; + + /* negative top-relative indices not allowed now */ + DUK_ASSERT(idx_value == DUK_INVALID_INDEX || idx_value >= 0); + DUK_ASSERT(idx_replacer == DUK_INVALID_INDEX || idx_replacer >= 0); + DUK_ASSERT(idx_space == DUK_INVALID_INDEX || idx_space >= 0); + + DUK_DDD(DUK_DDDPRINT("JSON stringify start: value=%!T, replacer=%!T, space=%!T, flags=0x%08lx, stack_top=%ld", + (duk_tval *) duk_get_tval(ctx, idx_value), + (duk_tval *) duk_get_tval(ctx, idx_replacer), + (duk_tval *) duk_get_tval(ctx, idx_space), + (unsigned long) flags, + (long) duk_get_top(ctx))); + + entry_top = duk_get_top(ctx); + + /* + * Context init + */ + + DUK_MEMZERO(&js_ctx_alloc, sizeof(js_ctx_alloc)); + js_ctx->thr = thr; +#ifdef DUK_USE_EXPLICIT_NULL_INIT + js_ctx->h_replacer = NULL; + js_ctx->h_gap = NULL; + js_ctx->h_indent = NULL; +#endif + js_ctx->idx_proplist = -1; + + /* Flag handling currently assumes that flags are consistent. This is OK + * because the call sites are now strictly controlled. + */ + + js_ctx->flags = flags; + js_ctx->flag_ascii_only = flags & DUK_JSON_FLAG_ASCII_ONLY; + js_ctx->flag_avoid_key_quotes = flags & DUK_JSON_FLAG_AVOID_KEY_QUOTES; +#ifdef DUK_USE_JX + js_ctx->flag_ext_custom = flags & DUK_JSON_FLAG_EXT_CUSTOM; +#endif +#ifdef DUK_USE_JC + js_ctx->flag_ext_compatible = flags & DUK_JSON_FLAG_EXT_COMPATIBLE; +#endif + + /* The #ifdef clutter here handles the JX/JC enable/disable + * combinations properly. + */ +#if defined(DUK_USE_JX) || defined(DUK_USE_JC) +#if defined(DUK_USE_JX) + if (flags & DUK_JSON_FLAG_EXT_CUSTOM) { + js_ctx->stridx_custom_undefined = DUK_STRIDX_LC_UNDEFINED; + js_ctx->stridx_custom_nan = DUK_STRIDX_NAN; + js_ctx->stridx_custom_neginf = DUK_STRIDX_MINUS_INFINITY; + js_ctx->stridx_custom_posinf = DUK_STRIDX_INFINITY; + js_ctx->stridx_custom_function = + (flags & DUK_JSON_FLAG_AVOID_KEY_QUOTES) ? + DUK_STRIDX_JSON_EXT_FUNCTION2 : + DUK_STRIDX_JSON_EXT_FUNCTION1; + } +#endif /* DUK_USE_JX */ +#if defined(DUK_USE_JX) && defined(DUK_USE_JC) + else +#endif /* DUK_USE_JX && DUK_USE_JC */ +#if defined(DUK_USE_JC) + if (js_ctx->flags & DUK_JSON_FLAG_EXT_COMPATIBLE) { + js_ctx->stridx_custom_undefined = DUK_STRIDX_JSON_EXT_UNDEFINED; + js_ctx->stridx_custom_nan = DUK_STRIDX_JSON_EXT_NAN; + js_ctx->stridx_custom_neginf = DUK_STRIDX_JSON_EXT_NEGINF; + js_ctx->stridx_custom_posinf = DUK_STRIDX_JSON_EXT_POSINF; + js_ctx->stridx_custom_function = DUK_STRIDX_JSON_EXT_FUNCTION1; + } +#endif /* DUK_USE_JC */ +#endif /* DUK_USE_JX || DUK_USE_JC */ + +#if defined(DUK_USE_JX) || defined(DUK_USE_JC) + if (js_ctx->flags & (DUK_JSON_FLAG_EXT_CUSTOM | + DUK_JSON_FLAG_EXT_COMPATIBLE)) { + DUK_ASSERT(js_ctx->mask_for_undefined == 0); /* already zero */ + } + else +#endif /* DUK_USE_JX || DUK_USE_JC */ + { + js_ctx->mask_for_undefined = DUK_TYPE_MASK_UNDEFINED | + DUK_TYPE_MASK_POINTER | + DUK_TYPE_MASK_BUFFER | + DUK_TYPE_MASK_LIGHTFUNC; + } + + DUK_BW_INIT_PUSHBUF(thr, &js_ctx->bw, DUK__JSON_STRINGIFY_BUFSIZE); + + js_ctx->idx_loop = duk_push_object_internal(ctx); + DUK_ASSERT(js_ctx->idx_loop >= 0); + + /* [ ... buf loop ] */ + + /* + * Process replacer/proplist (2nd argument to JSON.stringify) + */ + + h = duk_get_hobject(ctx, idx_replacer); + if (h != NULL) { + if (DUK_HOBJECT_IS_CALLABLE(h)) { + js_ctx->h_replacer = h; + } else if (DUK_HOBJECT_GET_CLASS_NUMBER(h) == DUK_HOBJECT_CLASS_ARRAY) { + /* Here the specification requires correct array index enumeration + * which is a bit tricky for sparse arrays (it is handled by the + * enum setup code). We now enumerate ancestors too, although the + * specification is not very clear on whether that is required. + */ + + duk_uarridx_t plist_idx = 0; + duk_small_uint_t enum_flags; + + js_ctx->idx_proplist = duk_push_array(ctx); /* XXX: array internal? */ + + enum_flags = DUK_ENUM_ARRAY_INDICES_ONLY | + DUK_ENUM_SORT_ARRAY_INDICES; /* expensive flag */ + duk_enum(ctx, idx_replacer, enum_flags); + while (duk_next(ctx, -1 /*enum_index*/, 1 /*get_value*/)) { + /* [ ... proplist enum_obj key val ] */ + if (duk__enc_allow_into_proplist(duk_get_tval(ctx, -1))) { + /* XXX: duplicates should be eliminated here */ + DUK_DDD(DUK_DDDPRINT("proplist enum: key=%!T, val=%!T --> accept", + (duk_tval *) duk_get_tval(ctx, -2), + (duk_tval *) duk_get_tval(ctx, -1))); + duk_to_string(ctx, -1); /* extra coercion of strings is OK */ + duk_put_prop_index(ctx, -4, plist_idx); /* -> [ ... proplist enum_obj key ] */ + plist_idx++; + duk_pop(ctx); + } else { + DUK_DDD(DUK_DDDPRINT("proplist enum: key=%!T, val=%!T --> reject", + (duk_tval *) duk_get_tval(ctx, -2), + (duk_tval *) duk_get_tval(ctx, -1))); + duk_pop_2(ctx); + } + } + duk_pop(ctx); /* pop enum */ + + /* [ ... proplist ] */ + } + } + + /* [ ... buf loop (proplist) ] */ + + /* + * Process space (3rd argument to JSON.stringify) + */ + + h = duk_get_hobject(ctx, idx_space); + if (h != NULL) { + int c = DUK_HOBJECT_GET_CLASS_NUMBER(h); + if (c == DUK_HOBJECT_CLASS_NUMBER) { + duk_to_number(ctx, idx_space); + } else if (c == DUK_HOBJECT_CLASS_STRING) { + duk_to_string(ctx, idx_space); + } + } + + if (duk_is_number(ctx, idx_space)) { + duk_small_int_t nspace; + /* spaces[] must be static to allow initializer with old compilers like BCC */ + static const char spaces[10] = { + DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, + DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, DUK_ASC_SPACE, + DUK_ASC_SPACE, DUK_ASC_SPACE + }; /* XXX: helper */ + + /* ToInteger() coercion; NaN -> 0, infinities are clamped to 0 and 10 */ + nspace = (duk_small_int_t) duk_to_int_clamped(ctx, idx_space, 0 /*minval*/, 10 /*maxval*/); + DUK_ASSERT(nspace >= 0 && nspace <= 10); + + duk_push_lstring(ctx, spaces, (duk_size_t) nspace); + js_ctx->h_gap = duk_get_hstring(ctx, -1); + DUK_ASSERT(js_ctx->h_gap != NULL); + } else if (duk_is_string(ctx, idx_space)) { + /* XXX: substring in-place at idx_place? */ + duk_dup(ctx, idx_space); + duk_substring(ctx, -1, 0, 10); /* clamp to 10 chars */ + js_ctx->h_gap = duk_get_hstring(ctx, -1); + DUK_ASSERT(js_ctx->h_gap != NULL); + } else { + /* nop */ + } + + if (js_ctx->h_gap != NULL) { + /* if gap is empty, behave as if not given at all */ + if (DUK_HSTRING_GET_CHARLEN(js_ctx->h_gap) == 0) { + js_ctx->h_gap = NULL; + } else { + /* set 'indent' only if it will actually increase */ + js_ctx->h_indent = DUK_HTHREAD_STRING_EMPTY_STRING(thr); + } + } + + DUK_ASSERT((js_ctx->h_gap == NULL && js_ctx->h_indent == NULL) || + (js_ctx->h_gap != NULL && js_ctx->h_indent != NULL)); + + /* [ ... buf loop (proplist) (gap) ] */ + + /* + * Fast path: assume no mutation, iterate object property tables + * directly; bail out if that assumption doesn't hold. + */ + +#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) + /* For now fast path is limited to plain JSON (no JX/JC). This would + * be easy to fix but must go through value type handling in the fast + * path. + */ + if (flags == 0 && + js_ctx->h_replacer == NULL && + js_ctx->idx_proplist == -1 && + js_ctx->h_gap == NULL && + js_ctx->h_indent == NULL) { + duk_int_t pcall_rc; +#ifdef DUK_USE_MARK_AND_SWEEP + duk_small_uint_t prev_mark_and_sweep_base_flags; +#endif + + DUK_DD(DUK_DDPRINT("try JSON.stringify() fast path")); + + /* Use recursion_limit to ensure we don't overwrite js_ctx->visiting[] + * array so we don't need two counter checks in the fast path. The + * slow path has a much larger recursion limit which we'll use if + * necessary. + */ + DUK_ASSERT(DUK_USE_JSON_ENC_RECLIMIT >= DUK_JSON_ENC_LOOPARRAY); + js_ctx->recursion_limit = DUK_JSON_ENC_LOOPARRAY; + DUK_ASSERT(js_ctx->recursion_depth == 0); + + /* Execute the fast path in a protected call. If any error is thrown, + * fall back to the slow path. This includes e.g. recursion limit + * because the fast path has a smaller recursion limit (and simpler, + * limited loop detection). + */ + + duk_push_pointer(ctx, (void *) js_ctx); + duk_dup(ctx, idx_value); + +#if defined(DUK_USE_MARK_AND_SWEEP) + /* Must prevent finalizers which may have arbitrary side effects. */ + prev_mark_and_sweep_base_flags = thr->heap->mark_and_sweep_base_flags; + thr->heap->mark_and_sweep_base_flags |= + DUK_MS_FLAG_NO_FINALIZERS | /* avoid attempts to add/remove object keys */ + DUK_MS_FLAG_NO_OBJECT_COMPACTION; /* avoid attempt to compact any objects */ +#endif + + pcall_rc = duk_safe_call(ctx, duk__json_stringify_fast, 2 /*nargs*/, 0 /*nret*/); + +#if defined(DUK_USE_MARK_AND_SWEEP) + thr->heap->mark_and_sweep_base_flags = prev_mark_and_sweep_base_flags; +#endif + if (pcall_rc == DUK_EXEC_SUCCESS) { + DUK_DD(DUK_DDPRINT("fast path successful")); + DUK_BW_PUSH_AS_STRING(thr, &js_ctx->bw); + goto replace_finished; + } + + /* We come here for actual aborts (like encountering .toJSON()) + * but also for recursion/loop errors. Bufwriter size can be + * kept because we'll probably need at least as much as we've + * allocated so far. + */ + DUK_DD(DUK_DDPRINT("fast path failed, serialize using slow path instead")); + DUK_BW_RESET_SIZE(thr, &js_ctx->bw); + js_ctx->recursion_depth = 0; + } +#endif + + /* + * Create wrapper object and serialize + */ + + idx_holder = duk_push_object(ctx); + duk_dup(ctx, idx_value); + duk_put_prop_stridx(ctx, -2, DUK_STRIDX_EMPTY_STRING); + + DUK_DDD(DUK_DDDPRINT("before: flags=0x%08lx, loop=%!T, replacer=%!O, " + "proplist=%!T, gap=%!O, indent=%!O, holder=%!T", + (unsigned long) js_ctx->flags, + (duk_tval *) duk_get_tval(ctx, js_ctx->idx_loop), + (duk_heaphdr *) js_ctx->h_replacer, + (duk_tval *) (js_ctx->idx_proplist >= 0 ? duk_get_tval(ctx, js_ctx->idx_proplist) : NULL), + (duk_heaphdr *) js_ctx->h_gap, + (duk_heaphdr *) js_ctx->h_indent, + (duk_tval *) duk_get_tval(ctx, -1))); + + /* serialize the wrapper with empty string key */ + + duk_push_hstring_stridx(ctx, DUK_STRIDX_EMPTY_STRING); + + /* [ ... buf loop (proplist) (gap) holder "" ] */ + + js_ctx->recursion_limit = DUK_USE_JSON_ENC_RECLIMIT; + DUK_ASSERT(js_ctx->recursion_depth == 0); + undef = duk__enc_value1(js_ctx, idx_holder); /* [ ... holder key ] -> [ ... holder key val ] */ + + DUK_DDD(DUK_DDDPRINT("after: flags=0x%08lx, loop=%!T, replacer=%!O, " + "proplist=%!T, gap=%!O, indent=%!O, holder=%!T", + (unsigned long) js_ctx->flags, + (duk_tval *) duk_get_tval(ctx, js_ctx->idx_loop), + (duk_heaphdr *) js_ctx->h_replacer, + (duk_tval *) (js_ctx->idx_proplist >= 0 ? duk_get_tval(ctx, js_ctx->idx_proplist) : NULL), + (duk_heaphdr *) js_ctx->h_gap, + (duk_heaphdr *) js_ctx->h_indent, + (duk_tval *) duk_get_tval(ctx, -3))); + + if (undef) { + /* + * Result is undefined + */ + + duk_push_undefined(ctx); + } else { + /* + * Finish and convert buffer to result string + */ + + duk__enc_value2(js_ctx); /* [ ... key val ] -> [ ... ] */ + + DUK_BW_PUSH_AS_STRING(thr, &js_ctx->bw); + } + + /* The stack has a variable shape here, so force it to the + * desired one explicitly. + */ + +#if defined(DUK_USE_JSON_STRINGIFY_FASTPATH) + replace_finished: +#endif + duk_replace(ctx, entry_top); + duk_set_top(ctx, entry_top + 1); + + DUK_DDD(DUK_DDDPRINT("JSON stringify end: value=%!T, replacer=%!T, space=%!T, " + "flags=0x%08lx, result=%!T, stack_top=%ld", + (duk_tval *) duk_get_tval(ctx, idx_value), + (duk_tval *) duk_get_tval(ctx, idx_replacer), + (duk_tval *) duk_get_tval(ctx, idx_space), + (unsigned long) flags, + (duk_tval *) duk_get_tval(ctx, -1), + (long) duk_get_top(ctx))); + + DUK_ASSERT(duk_get_top(ctx) == entry_top + 1); +} + +/* + * Entry points + */ + +DUK_INTERNAL duk_ret_t duk_bi_json_object_parse(duk_context *ctx) { + duk_bi_json_parse_helper(ctx, + 0 /*idx_value*/, + 1 /*idx_replacer*/, + 0 /*flags*/); + return 1; +} + +DUK_INTERNAL duk_ret_t duk_bi_json_object_stringify(duk_context *ctx) { + duk_bi_json_stringify_helper(ctx, + 0 /*idx_value*/, + 1 /*idx_replacer*/, + 2 /*idx_space*/, + 0 /*flags*/); + return 1; +} + +#undef DUK__JSON_DECSTR_BUFSIZE +#undef DUK__JSON_DECSTR_CHUNKSIZE +#undef DUK__JSON_ENCSTR_CHUNKSIZE +#undef DUK__JSON_STRINGIFY_BUFSIZE +#undef DUK__JSON_MAX_ESC_LEN diff --git a/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_logger.c b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_logger.c new file mode 100644 index 00000000..8be5feac --- /dev/null +++ b/3P/civetweb/src/third_party/duktape-1.3.0/src-separate/duk_bi_logger.c @@ -0,0 +1,300 @@ +/* + * Logging support + */ + +#include "duk_internal.h" + +/* 3-letter log level strings */ +DUK_LOCAL const duk_uint8_t duk__log_level_strings[] = { + (duk_uint8_t) DUK_ASC_UC_T, (duk_uint8_t) DUK_ASC_UC_R, (duk_uint8_t) DUK_ASC_UC_C, + (duk_uint8_t) DUK_ASC_UC_D, (duk_uint8_t) DUK_ASC_UC_B, (duk_uint8_t) DUK_ASC_UC_G, + (duk_uint8_t) DUK_ASC_UC_I, (duk_uint8_t) DUK_ASC_UC_N, (duk_uint8_t) DUK_ASC_UC_F, + (duk_uint8_t) DUK_ASC_UC_W, (duk_uint8_t) DUK_ASC_UC_R, (duk_uint8_t) DUK_ASC_UC_N, + (duk_uint8_t) DUK_ASC_UC_E, (duk_uint8_t) DUK_ASC_UC_R, (duk_uint8_t) DUK_ASC_UC_R, + (duk_uint8_t) DUK_ASC_UC_F, (duk_uint8_t) DUK_ASC_UC_T, (duk_uint8_t) DUK_ASC_UC_L +}; + +/* Constructor */ +DUK_INTERNAL duk_ret_t duk_bi_logger_constructor(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_idx_t nargs; + + /* Calling as a non-constructor is not meaningful. */ + if (!duk_is_constructor_call(ctx)) { + return DUK_RET_TYPE_ERROR; + } + + nargs = duk_get_top(ctx); + duk_set_top(ctx, 1); + + duk_push_this(ctx); + + /* [ name this ] */ + + if (nargs == 0) { + /* Automatic defaulting of logger name from caller. This would + * work poorly with tail calls, but constructor calls are currently + * never tail calls, so tail calls are not an issue now. + */ + + if (thr->callstack_top >= 2) { + duk_activation *act_caller = thr->callstack + thr->callstack_top - 2; + duk_hobject *func_caller; + + func_caller = DUK_ACT_GET_FUNC(act_caller); + if (func_caller) { + /* Stripping the filename might be a good idea + * ("/foo/bar/quux.js" -> logger name "quux"), + * but now used verbatim. + */ + duk_push_hobject(ctx, func_caller); + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_FILE_NAME); + duk_replace(ctx, 0); + } + } + } + /* the stack is unbalanced here on purpose; we only rely on the + * initial two values: [ name this ]. + */ + + if (duk_is_string(ctx, 0)) { + duk_dup(ctx, 0); + duk_put_prop_stridx(ctx, 1, DUK_STRIDX_LC_N); + } else { + /* don't set 'n' at all, inherited value is used as name */ + } + + duk_compact(ctx, 1); + + return 0; /* keep default instance */ +} + +/* Default function to format objects. Tries to use toLogString() but falls + * back to toString(). Any errors are propagated out without catching. + */ +DUK_INTERNAL duk_ret_t duk_bi_logger_prototype_fmt(duk_context *ctx) { + if (duk_get_prop_stridx(ctx, 0, DUK_STRIDX_TO_LOG_STRING)) { + /* [ arg toLogString ] */ + + duk_dup(ctx, 0); + duk_call_method(ctx, 0); + + /* [ arg result ] */ + return 1; + } + + /* [ arg undefined ] */ + duk_pop(ctx); + duk_to_string(ctx, 0); + return 1; +} + +/* Default function to write a formatted log line. Writes to stderr, + * appending a newline to the log line. + * + * The argument is a buffer whose visible size contains the log message. + * This function should avoid coercing the buffer to a string to avoid + * string table traffic. + */ +DUK_INTERNAL duk_ret_t duk_bi_logger_prototype_raw(duk_context *ctx) { + const char *data; + duk_size_t data_len; + + DUK_UNREF(ctx); + DUK_UNREF(data); + DUK_UNREF(data_len); + +#ifdef DUK_USE_FILE_IO + data = (const char *) duk_require_buffer(ctx, 0, &data_len); + DUK_FWRITE((const void *) data, 1, data_len, DUK_STDERR); + DUK_FPUTC((int) '\n', DUK_STDERR); + DUK_FFLUSH(DUK_STDERR); +#else + /* nop */ +#endif + return 0; +} + +/* Log frontend shared helper, magic value indicates log level. Provides + * frontend functions: trace(), debug(), info(), warn(), error(), fatal(). + * This needs to have small footprint, reasonable performance, minimal + * memory churn, etc. + */ +DUK_INTERNAL duk_ret_t duk_bi_logger_prototype_log_shared(duk_context *ctx) { + duk_hthread *thr = (duk_hthread *) ctx; + duk_double_t now; + duk_small_int_t entry_lev = duk_get_current_magic(ctx); + duk_small_int_t logger_lev; + duk_int_t nargs; + duk_int_t i; + duk_size_t tot_len; + const duk_uint8_t *arg_str; + duk_size_t arg_len; + duk_uint8_t *buf, *p; + const duk_uint8_t *q; + duk_uint8_t date_buf[DUK_BI_DATE_ISO8601_BUFSIZE]; + duk_size_t date_len; + duk_small_int_t rc; + + DUK_ASSERT(entry_lev >= 0 && entry_lev <= 5); + DUK_UNREF(thr); + + /* XXX: sanitize to printable (and maybe ASCII) */ + /* XXX: better multiline */ + + /* + * Logger arguments are: + * + * magic: log level (0-5) + * this: logger + * stack: plain log args + * + * We want to minimize memory churn so a two-pass approach + * is used: first pass formats arguments and computes final + * string length, second pass copies strings either into a + * pre-allocated and reused buffer (short messages) or into a + * newly allocated fixed buffer. If the backend function plays + * nice, it won't coerce the buffer to a string (and thus + * intern it). + */ + + nargs = duk_get_top(ctx); + + /* [ arg1 ... argN this ] */ + + /* + * Log level check + */ + + duk_push_this(ctx); + + duk_get_prop_stridx(ctx, -1, DUK_STRIDX_LC_L); + logger_lev = (duk_small_int_t) duk_get_int(ctx, -1); + if (entry_lev < logger_lev) { + return 0; + } + /* log level could be popped but that's not necessary */ + + now = DUK_USE_DATE_GET_NOW(ctx); + duk_bi_date_format_timeval(now, date_buf); + date_len = DUK_STRLEN((const char *) date_buf); + + duk_get_prop_stridx(ctx, -2, DUK_STRIDX_LC_N); + duk_to_string(ctx, -1); + DUK_ASSERT(duk_is_string(ctx, -1)); + + /* [ arg1 ... argN this loggerLevel loggerName ] */ + + /* + * Pass 1 + */ + + /* Line format:

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%0A`*tC3;opWHGAF>Z_X57}g`mC$;j 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滃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