Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[js/web] optimize module export and deployment #20165

Merged
merged 46 commits into from
May 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
ddde964
w
fs-eire Mar 26, 2024
972a25b
w2
fs-eire Mar 27, 2024
add9d91
w3
fs-eire Mar 27, 2024
551a52e
w4
fs-eire Mar 29, 2024
dcb33da
w5
fs-eire Mar 30, 2024
40dc969
w6
fs-eire Mar 30, 2024
2a554a1
w7
fs-eire Mar 30, 2024
1fba1db
w8
fs-eire Mar 30, 2024
e510b79
w9
fs-eire Apr 1, 2024
7ab14ad
fix http-server not close
fs-eire Apr 1, 2024
3b74efb
resolve one comment
fs-eire Apr 1, 2024
6fe7416
fix e2e test
fs-eire Apr 2, 2024
ecb18da
Merge remote-tracking branch 'origin/main' into fs-eire/wasm-es6
fs-eire Apr 2, 2024
061c237
parcel
fs-eire Apr 2, 2024
3c00c63
fix source url
fs-eire Apr 3, 2024
20c54f8
use post-process script
fs-eire Apr 3, 2024
42a6674
Merge remote-tracking branch 'origin/main' into fs-eire/wasm-es6
fs-eire Apr 8, 2024
283f5fe
fix bundle test
fs-eire Apr 8, 2024
51ff5a9
Merge remote-tracking branch 'origin/main' into fs-eire/wasm-es6
fs-eire Apr 10, 2024
c32f7d0
Merge remote-tracking branch 'origin/main' into fs-eire/wasm-es6
fs-eire Apr 23, 2024
fe780db
fix script
fs-eire Apr 23, 2024
e1bf18c
Merge remote-tracking branch 'origin/main' into fs-eire/wasm-es6
fs-eire Apr 23, 2024
21585da
Merge remote-tracking branch 'origin/main' into fs-eire/wasm-es6
fs-eire Apr 26, 2024
3e94451
update wasm build table
fs-eire Apr 26, 2024
8a606cc
shared-array-buffer workaround
fs-eire Apr 27, 2024
dc8009c
fix closure compiler
fs-eire Apr 27, 2024
dd01db0
fix memory creation
fs-eire Apr 27, 2024
1651265
Merge remote-tracking branch 'origin/main' into fs-eire/wasm-es6
fs-eire Apr 27, 2024
36c69b2
consume only threaded wasm
fs-eire Apr 27, 2024
9fab029
fix e2e
fs-eire Apr 27, 2024
624c681
format code
fs-eire Apr 28, 2024
6de229c
upgrade emsdk to 3.1.58
fs-eire Apr 29, 2024
5e4ce2d
Make sure E2E tests working
fs-eire Apr 30, 2024
48b570b
Merge remote-tracking branch 'origin/main' into fs-eire/wasm-es6-test
fs-eire Apr 30, 2024
c7edbcc
a few build script update
fs-eire Apr 30, 2024
1644c06
upgrade emsdk to 3.1.59
fs-eire Apr 30, 2024
7fb3c59
allow to bundle modules in ESM outputs
fs-eire May 3, 2024
b1b36e1
Merge remote-tracking branch 'origin/main' into fs-eire/wasm-es6
fs-eire May 4, 2024
e953b65
Merge remote-tracking branch 'origin/main' into fs-eire/wasm-es6
fs-eire May 6, 2024
9531fe8
use original artifact
fs-eire May 12, 2024
35b277c
Merge remote-tracking branch 'origin/main' into fs-eire/wasm-es6
fs-eire May 12, 2024
611ca34
always bundle proxy and never bundle emscripten glue
fs-eire May 14, 2024
4c60105
Merge remote-tracking branch 'origin/main' into fs-eire/wasm-es6
fs-eire May 14, 2024
a16cd2b
small optimizations
fs-eire May 14, 2024
d1ea5e0
remove unused comments
fs-eire May 16, 2024
00b2833
Merge remote-tracking branch 'origin/main' into fs-eire/wasm-es6
fs-eire May 16, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@
[submodule "cmake/external/emsdk"]
path = cmake/external/emsdk
url = https://github.com/emscripten-core/emsdk.git
branch = 3.1.57
branch = 3.1.59
2 changes: 1 addition & 1 deletion cgmanifests/generated/cgmanifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"component": {
"type": "git",
"git": {
"commitHash": "229d83fc706e10a39d4948a804cbbf17225cdda0",
"commitHash": "d52c46520124845b1e0e0525f2759299d840143f",
"repositoryUrl": "https://github.com/emscripten-core/emsdk.git"
},
"comments": "git submodule at cmake/external/emsdk"
Expand Down
2 changes: 1 addition & 1 deletion cmake/external/emsdk
Submodule emsdk updated 52 files
+6 −35 .circleci/config.yml
+10 −0 bazel/emscripten_toolchain/toolchain.bzl
+14 −0 bazel/revisions.bzl
+61 −0 bazel/test_external/long_command_line/BUILD.bazel
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file01.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file02.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file03.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file04.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file05.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file06.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file07.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file08.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file09.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file10.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file11.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file12.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file13.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file14.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file15.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file16.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file17.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file18.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file19.hh
+3 −0 bazel/test_external/long_command_line/include/long_command_line_file20.hh
+43 −0 bazel/test_external/long_command_line/long_command_line.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file01.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file02.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file03.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file04.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file05.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file06.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file07.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file08.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file09.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file10.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file11.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file12.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file13.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file14.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file15.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file16.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file17.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file18.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file19.cc
+5 −0 bazel/test_external/long_command_line/long_command_line_file20.cc
+2 −2 docker/README.md
+6 −2 emscripten-releases-tags.json
+0 −3 emsdk.py
+0 −23 scripts/update_linux_arm64.sh
+3 −0 test/test_bazel.ps1
+2 −1 test/test_bazel.sh
+1 −0 test/test_bazel_mac.sh
6 changes: 4 additions & 2 deletions cmake/onnxruntime_unittests.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -930,12 +930,14 @@ if (onnxruntime_ENABLE_TRAINING_TORCH_INTEROP)
endif()
if (CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
set_target_properties(onnxruntime_test_all PROPERTIES LINK_DEPENDS ${TEST_SRC_DIR}/wasm/onnxruntime_test_all_adapter.js)
set_target_properties(onnxruntime_test_all PROPERTIES LINK_FLAGS "-s STACK_SIZE=5242880 -s INITIAL_MEMORY=536870912 -s ALLOW_MEMORY_GROWTH=1 -s MAXIMUM_MEMORY=4294967296 -s INCOMING_MODULE_JS_API=[preRun,locateFile,arguments,onExit,wasmMemory,buffer,instantiateWasm] --pre-js \"${TEST_SRC_DIR}/wasm/onnxruntime_test_all_adapter.js\" -s \"EXPORTED_RUNTIME_METHODS=['FS']\" --preload-file ${CMAKE_CURRENT_BINARY_DIR}/testdata@/testdata -s EXIT_RUNTIME=1")
set_target_properties(onnxruntime_test_all PROPERTIES LINK_DEPENDS ${ONNXRUNTIME_ROOT}/wasm/pre.js)
set_target_properties(onnxruntime_test_all PROPERTIES LINK_FLAGS "-s STACK_SIZE=5242880 -s INITIAL_MEMORY=536870912 -s ALLOW_MEMORY_GROWTH=1 -s MAXIMUM_MEMORY=4294967296 -s INCOMING_MODULE_JS_API=[preRun,locateFile,arguments,onExit,wasmMemory,buffer,instantiateWasm] --pre-js \"${TEST_SRC_DIR}/wasm/onnxruntime_test_all_adapter.js\" --pre-js \"${ONNXRUNTIME_ROOT}/wasm/pre.js\" -s \"EXPORTED_RUNTIME_METHODS=['FS']\" --preload-file ${CMAKE_CURRENT_BINARY_DIR}/testdata@/testdata -s EXIT_RUNTIME=1")
if (onnxruntime_ENABLE_WEBASSEMBLY_THREADS)
set_property(TARGET onnxruntime_test_all APPEND_STRING PROPERTY LINK_FLAGS " -s DEFAULT_PTHREAD_STACK_SIZE=131072 -s PROXY_TO_PTHREAD=1")
endif()
if (onnxruntime_USE_JSEP)
set_property(TARGET onnxruntime_test_all APPEND_STRING PROPERTY LINK_FLAGS " --pre-js \"${ONNXRUNTIME_ROOT}/wasm/js_internal_api.js\"")
set_target_properties(onnxruntime_test_all PROPERTIES LINK_DEPENDS ${ONNXRUNTIME_ROOT}/wasm/pre-jsep.js)
set_property(TARGET onnxruntime_test_all APPEND_STRING PROPERTY LINK_FLAGS " --pre-js \"${ONNXRUNTIME_ROOT}/wasm/pre-jsep.js\"")
endif()

###
Expand Down
22 changes: 16 additions & 6 deletions cmake/onnxruntime_webassembly.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -226,9 +226,12 @@ else()
"SHELL:-s VERBOSE=0"
"SHELL:-s FILESYSTEM=0"
"SHELL:-s INCOMING_MODULE_JS_API=[preRun,locateFile,arguments,onExit,wasmMemory,buffer,instantiateWasm,mainScriptUrlOrBlob]"
"SHELL:-s WASM_BIGINT=1"
${WASM_API_EXCEPTION_CATCHING}
--no-entry
"SHELL:--pre-js \"${ONNXRUNTIME_ROOT}/wasm/pre.js\""
)
set_target_properties(onnxruntime_webassembly PROPERTIES LINK_DEPENDS ${ONNXRUNTIME_ROOT}/wasm/pre.js)

if (onnxruntime_USE_JSEP)
# NOTE: "-s ASYNCIFY=1" is required for JSEP to work with WebGPU
Expand All @@ -237,11 +240,11 @@ else()

target_compile_definitions(onnxruntime_webassembly PRIVATE USE_JSEP=1)
target_link_options(onnxruntime_webassembly PRIVATE
--pre-js "${ONNXRUNTIME_ROOT}/wasm/js_internal_api.js"
"SHELL:--pre-js \"${ONNXRUNTIME_ROOT}/wasm/pre-jsep.js\""
"SHELL:-s ASYNCIFY=1"
"SHELL:-s ASYNCIFY_STACK_SIZE=65536"
)
set_target_properties(onnxruntime_webassembly PROPERTIES LINK_DEPENDS ${ONNXRUNTIME_ROOT}/wasm/js_internal_api.js)
set_target_properties(onnxruntime_webassembly PROPERTIES LINK_DEPENDS ${ONNXRUNTIME_ROOT}/wasm/pre-jsep.js)
endif()

if (onnxruntime_EMSCRIPTEN_SETTINGS)
Expand All @@ -252,7 +255,10 @@ else()

if (CMAKE_BUILD_TYPE STREQUAL "Debug")
target_link_options(onnxruntime_webassembly PRIVATE
"SHELL:-s ASSERTIONS=2"
# NOTE: use "SHELL:-s ASSERTIONS=2" to enable more strict assertions, which may help debugging segfaults.
# However, it may be very slow.
# "SHELL:-s ASSERTIONS=2"
"SHELL:-s ASSERTIONS=1"
"SHELL:-s SAFE_HEAP=1"
"SHELL:-s STACK_OVERFLOW_CHECK=2"
)
Expand All @@ -266,7 +272,7 @@ else()
endif()

if (onnxruntime_USE_WEBNN)
set_property(TARGET onnxruntime_webassembly APPEND_STRING PROPERTY LINK_FLAGS " --bind -sWASM_BIGINT")
set_property(TARGET onnxruntime_webassembly APPEND_STRING PROPERTY LINK_FLAGS " --bind")
if (onnxruntime_DISABLE_RTTI)
set_property(TARGET onnxruntime_webassembly APPEND_STRING PROPERTY LINK_FLAGS " -fno-rtti -DEMSCRIPTEN_HAS_UNBOUND_TYPE_NAMES=0")
endif()
Expand All @@ -283,7 +289,7 @@ else()
target_link_options(onnxruntime_webassembly PRIVATE
"SHELL:-s EXPORT_NAME=ortWasmThreaded"
"SHELL:-s DEFAULT_PTHREAD_STACK_SIZE=131072"
"SHELL:-s PTHREAD_POOL_SIZE=Module[\\\"numThreads\\\"]"
"SHELL:-s PTHREAD_POOL_SIZE=Module[\\\"numThreads\\\"]-1"
)
else()
target_link_options(onnxruntime_webassembly PRIVATE
Expand All @@ -309,5 +315,9 @@ else()

list(JOIN target_name_list "-" target_name)

set_target_properties(onnxruntime_webassembly PROPERTIES OUTPUT_NAME ${target_name})
if (onnxruntime_USE_JSEP)
string(APPEND target_name ".jsep")
endif()

set_target_properties(onnxruntime_webassembly PROPERTIES OUTPUT_NAME ${target_name} SUFFIX ".mjs")
endif()
7 changes: 2 additions & 5 deletions js/.eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,8 @@ module.exports = {
'@typescript-eslint/no-misused-new': 'error',
'@typescript-eslint/no-namespace': ['error', { 'allowDeclarations': true }],
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-require-imports': 'error',
'@typescript-eslint/no-require-imports': ['error', { 'allow': ['^node:']}],
'@typescript-eslint/no-var-requires': ['error', { 'allow': ['^node:']}],
'@typescript-eslint/no-unnecessary-type-assertion': 'error',
'@typescript-eslint/no-unused-vars': ['error', { 'argsIgnorePattern': '^_' }],
'@typescript-eslint/promise-function-async': 'error',
Expand Down Expand Up @@ -216,10 +217,6 @@ module.exports = {
'no-underscore-dangle': 'off',
'guard-for-in': 'off'
}
}, {
files: ['web/lib/wasm/binding/**/*.ts'], rules: {
'@typescript-eslint/naming-convention': 'off'
}
}, {
files: ['react_native/e2e/src/**/*.ts', 'react_native/e2e/src/**/*.tsx'], rules: {
'@typescript-eslint/no-non-null-assertion': 'off',
Expand Down
9 changes: 9 additions & 0 deletions js/.vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,15 @@
"sourceMaps": true,
"preLaunchTask": "tsc: build - common/test/tsconfig.json"
},
{
"name": "[web] Launch Build script in Node.js",
"program": "${workspaceFolder}/web/script/build.js",
"request": "launch",
"skipFiles": ["<node_internals>/**"],
"type": "node",
"cwd": "${workspaceFolder}/web",
"preLaunchTask": "tsc: build - web/script/tsconfig.json"
},
{
"name": "[web] Launch Test Runner CLI in Node.js",
"program": "${workspaceFolder}/web/script/test-runner-cli.js",
Expand Down
34 changes: 9 additions & 25 deletions js/build_jsep.bat
Original file line number Diff line number Diff line change
Expand Up @@ -3,49 +3,33 @@
rem build_jsep.bat --- build onnxruntime-web with JSEP
rem
rem Usage:
rem build_jsep.bat config threaded [clean]
rem build_jsep.bat config [clean]
rem
rem Options:
rem config Build configuration, "d" or "r"
rem threaded Build with threading support, "st" or "mt"
rem clean Perform a clean build, "clean" or empty

setlocal enabledelayedexpansion

set ROOT=%~dp0..\
set BUILD_DIR=%ROOT%build_jsep

:arg1
if ["%~1"]==["d"] (
set CONFIG=Debug
set CONFIG_EXTRA_FLAG=--enable_wasm_debug_info
set CONFIG_EXTRA_FLAG=--enable_wasm_debug_info --enable_wasm_profiling
goto :arg2
)
if ["%~1"]==["r"] (
set CONFIG=Release
set CONFIG_EXTRA_FLAG=--enable_wasm_api_exception_catching --disable_rtti
set CONFIG_EXTRA_FLAG=--enable_wasm_api_exception_catching --disable_rtti --enable_wasm_profiling
goto :arg2
)
echo Invalid configuration "%~1", must be "d"(Debug) or "r"(Release)
exit /b 1

:arg2
if ["%~2"]==["st"] (
set BUILD_DIR=%ROOT%build_jsep_st
set THREADED_EXTRA_FLAG=
set TARGET_FILE_PREFIX=ort-wasm-simd
goto :arg3
)
if ["%~2"]==["mt"] (
set BUILD_DIR=%ROOT%build_jsep_mt
set THREADED_EXTRA_FLAG=--enable_wasm_threads
set TARGET_FILE_PREFIX=ort-wasm-simd-threaded
goto :arg3
)
echo Invalid threading option "%~2", must be "st" or "mt"
exit /b 1

:arg3
if ["%~3"]==["clean"] (
if ["%~2"]==["clean"] (
goto :clean
)
if not exist "%ROOT%js\web\dist" (
Expand Down Expand Up @@ -80,12 +64,12 @@ popd

set PATH=C:\Program Files\Git\usr\bin;%PATH%

call %ROOT%build.bat --config %CONFIG% %CONFIG_EXTRA_FLAG% %THREADED_EXTRA_FLAG%^
--skip_submodule_sync --build_wasm --skip_tests --enable_wasm_simd --use_jsep --target onnxruntime_webassembly --build_dir %BUILD_DIR%
call %ROOT%build.bat --config %CONFIG% %CONFIG_EXTRA_FLAG% --skip_submodule_sync --build_wasm --skip_tests^
--enable_wasm_simd --enable_wasm_threads --use_jsep --use_webnn --target onnxruntime_webassembly --build_dir %BUILD_DIR%

IF NOT "%ERRORLEVEL%" == "0" (
exit /b %ERRORLEVEL%
)

copy /Y %BUILD_DIR%\%CONFIG%\%TARGET_FILE_PREFIX%.js %ROOT%js\web\lib\wasm\binding\%TARGET_FILE_PREFIX%.jsep.js
copy /Y %BUILD_DIR%\%CONFIG%\%TARGET_FILE_PREFIX%.wasm %ROOT%js\web\dist\%TARGET_FILE_PREFIX%.jsep.wasm
copy /Y %BUILD_DIR%\%CONFIG%\ort-wasm-simd-threaded.jsep.wasm %ROOT%js\web\dist\
copy /Y %BUILD_DIR%\%CONFIG%\ort-wasm-simd-threaded.jsep.mjs %ROOT%js\web\dist\
4 changes: 0 additions & 4 deletions js/build_web.bat

This file was deleted.

22 changes: 0 additions & 22 deletions js/build_web.sh

This file was deleted.

41 changes: 30 additions & 11 deletions js/common/lib/env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,32 @@
import {env as envImpl} from './env-impl.js';

export declare namespace Env {
export type WasmPrefixOrFilePaths = string|{
/* eslint-disable @typescript-eslint/naming-convention */
'ort-wasm.wasm'?: string;
'ort-wasm-threaded.wasm'?: string;
'ort-wasm-simd.wasm'?: string;
'ort-training-wasm-simd.wasm'?: string;
'ort-wasm-simd-threaded.wasm'?: string;
/* eslint-enable @typescript-eslint/naming-convention */
};
export type WasmPathPrefix = string;
export interface WasmFilePaths {
/**
* Specify the override path for the main .wasm file.
*
* This path should be an absolute path.
*
* If not modified, the filename of the .wasm file is:
* - `ort-wasm-simd-threaded.wasm` for default build
* - `ort-wasm-simd-threaded.jsep.wasm` for JSEP build (with WebGPU and WebNN)
* - `ort-training-wasm-simd-threaded.wasm` for training build
*/
wasm?: URL|string;
/**
* Specify the override path for the main .mjs file.
*
* This path should be an absolute path.
*
* If not modified, the filename of the .mjs file is:
* - `ort-wasm-simd-threaded.mjs` for default build
* - `ort-wasm-simd-threaded.jsep.mjs` for JSEP build (with WebGPU and WebNN)
* - `ort-training-wasm-simd-threaded.mjs` for training build
*/
mjs?: URL|string;
}
export type WasmPrefixOrFilePaths = WasmPathPrefix|WasmFilePaths;
export interface WebAssemblyFlags {
/**
* set or get number of thread(s). If omitted or set to 0, number of thread(s) will be determined by system. If set
Expand All @@ -29,6 +46,8 @@ export declare namespace Env {
*
* This setting is available only when WebAssembly SIMD feature is available in current context.
*
* @deprecated This property is deprecated. Since SIMD is supported by all major JavaScript engines, non-SIMD
* build is no longer provided. This property will be removed in future release.
* @defaultValue `true`
*/
simd?: boolean;
Expand All @@ -50,8 +69,8 @@ export declare namespace Env {
initTimeout?: number;

/**
* Set a custom URL prefix to the .wasm files or a set of overrides for each .wasm file. The override path should be
* an absolute path.
* Set a custom URL prefix to the .wasm/.mjs files, or an object of overrides for both .wasm/.mjs file. The override
* path should be an absolute path.
*/
wasmPaths?: WasmPrefixOrFilePaths;

Expand Down
Loading
Loading