Deploy failed  - Failing build

9:55:03 AM: Build ready to start
9:55:07 AM: build-image version: 0e2f4c52031ab562db66aec633308326e3b108d0 (focal)
9:55:07 AM: build-image tag: focal
9:55:07 AM: buildbot version: 584b2b7b74f1e479e0403f1e60769a2080b692a6
9:55:07 AM: Fetching cached dependencies
9:55:07 AM: Failed to fetch cache, continuing with build
9:55:07 AM: Starting to prepare the repo for build
9:55:07 AM: No cached dependencies found. Cloning fresh repo
9:55:07 AM: git clone https://github.com/RyanFitzgerald/devblog
9:55:08 AM: Preparing Git Reference refs/heads/master
9:55:08 AM: Parsing package.json dependencies
9:55:09 AM: Starting build script
9:55:09 AM: Installing dependencies
9:55:09 AM: Python version set to 2.7
9:55:10 AM: Downloading and installing node v16.16.0...
9:55:10 AM: Downloading https://nodejs.org/dist/v16.16.0/node-v16.16.0-linux-x64.tar.xz...
9:55:11 AM: Computing checksum with sha256sum
9:55:11 AM: Checksums matched!
9:55:13 AM: Now using node v16.16.0 (npm v8.11.0)
9:55:13 AM: Started restoring cached build plugins
9:55:13 AM: Finished restoring cached build plugins
9:55:13 AM: Attempting ruby version 2.7.2, read from environment
9:55:15 AM: Using ruby version 2.7.2
9:55:15 AM: Using PHP version 8.0
9:55:15 AM: No npm workspaces detected
9:55:15 AM: Started restoring cached node modules
9:55:15 AM: Finished restoring cached node modules
9:55:16 AM: Installing NPM modules using NPM version 8.11.0
9:55:16 AM: npm WARN config tmp This setting is no longer used.  npm stores temporary files in a special
9:55:16 AM: npm WARN config location in the cache, and they are managed by
9:55:16 AM: npm WARN config     [`cacache`](http://npm.im/cacache).
9:55:17 AM: npm WARN config tmp This setting is no longer used.  npm stores temporary files in a special
9:55:17 AM: npm WARN config location in the cache, and they are managed by
9:55:17 AM: npm WARN config     [`cacache`](http://npm.im/cacache).
9:55:18 AM: npm WARN old lockfile
9:55:18 AM: npm WARN old lockfile The package-lock.json file was created with an old version of npm,
9:55:18 AM: npm WARN old lockfile so supplemental metadata must be fetched from the registry.
9:55:18 AM: npm WARN old lockfile
9:55:18 AM: npm WARN old lockfile This is a one-time fix-up, please be patient...
9:55:18 AM: npm WARN old lockfile
9:55:34 AM: npm WARN ERESOLVE overriding peer dependency
9:55:34 AM: npm WARN While resolving<EMAIL_ADDRESS>9:55:34 AM: npm WARN Found<EMAIL_ADDRESS>9:55:34 AM: npm WARN node_modules/styled-components
9:55:34 AM: npm WARN<EMAIL_ADDRESS>from the root project
9:55:34 AM: npm WARN   1 more (styled-normalize)
9:55:34 AM: npm WARN
9:55:34 AM: npm WARN Could not resolve dependency:
9:55:34 AM: npm WARN peer<EMAIL_ADDRESS>|| ^3.3.3" from<EMAIL_ADDRESS>9:55:34 AM: npm WARN node_modules/styled-normalize
9:55:34 AM: npm WARN<EMAIL_ADDRESS>from the root project
9:55:35 AM: npm WARN EBADENGINE Unsupported engine {
9:55:35 AM: npm WARN EBADENGINE   package<EMAIL_ADDRESS>9:55:35 AM: npm WARN EBADENGINE   required: { node: '>=0.10.0 <7' },
9:55:35 AM: npm WARN EBADENGINE   current: { node: 'v16.16.0', npm: '8.11.0' }
9:55:35 AM: npm WARN EBADENGINE }
9:55:52 AM: npm WARN deprecated<EMAIL_ADDRESS>This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
9:55:53 AM: npm WARN deprecated<EMAIL_ADDRESS>Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
9:55:53 AM: npm WARN deprecated<EMAIL_ADDRESS>Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility
9:55:53 AM: npm WARN deprecated<EMAIL_ADDRESS>See https://github.com/lydell/source-map-url#deprecated
9:55:53 AM: npm WARN deprecated<EMAIL_ADDRESS>Critical bug fixed in v3.0.1, please upgrade to the latest version.
9:55:54 AM: npm WARN deprecated<EMAIL_ADDRESS>See https://github.com/lydell/source-map-resolve#deprecated
9:55:55 AM: npm WARN deprecated<EMAIL_ADDRESS>The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
9:55:55 AM: npm WARN deprecated<EMAIL_ADDRESS>request has been deprecated, see https://github.com/request/request/issues/3142
9:55:57 AM: npm WARN deprecated<EMAIL_ADDRESS>Critical bug fixed in v2.0.1, please upgrade to the latest version.
9:55:58 AM: npm WARN deprecated<EMAIL_ADDRESS>Please use the native JSON object instead of JSON 3
9:55:58 AM: npm WARN deprecated<EMAIL_ADDRESS>Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)
9:55:59 AM: npm WARN deprecated<EMAIL_ADDRESS>Please update to ini >=1.3.6 to avoid a prototype pollution issue
9:55:59 AM: npm WARN deprecated<EMAIL_ADDRESS>This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
9:55:59 AM: npm WARN deprecated<EMAIL_ADDRESS>support for ECMAScript is superseded by `uglify-js` as of v3.13.0
9:56:00 AM: npm WARN deprecated<EMAIL_ADDRESS>this library is no longer supported
9:56:00 AM: npm WARN deprecated<EMAIL_ADDRESS>gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5
9:56:00 AM: npm WARN deprecated<EMAIL_ADDRESS>gatsby-image is now gatsby-plugin-image: https://npm.im/gatsby-plugin-image. This package will no longer receive updates.
9:56:00 AM: npm WARN deprecated<EMAIL_ADDRESS>GraphQL Import has been deprecated and merged into GraphQL Tools, so it will no longer get updates. Use GraphQL Tools instead to stay up-to-date! Check out https://www.graphql-tools.com/docs/migration-from-import for migration and https://the-guild.dev/blog/graphql-tools-v6 for new changes.
9:56:01 AM: npm WARN deprecated<EMAIL_ADDRESS>Fixed a prototype pollution security issue in 4.1.0, please upgrade to ^4.1.1 or ^5.0.1.
9:56:01 AM: npm WARN deprecated<EMAIL_ADDRESS>This SVGO version is no longer supported. Upgrade to v2.x.x.
9:56:02 AM: npm WARN deprecated<EMAIL_ADDRESS>This loader has been deprecated. Please use eslint-webpack-plugin
9:56:03 AM: npm WARN deprecated<EMAIL_ADDRESS>Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)
9:56:04 AM: npm WARN deprecated<EMAIL_ADDRESS>Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies
9:56:04 AM: npm WARN deprecated<EMAIL_ADDRESS>CircularJSON is in maintenance only, flatted is its successor.
9:56:04 AM: npm WARN deprecated<EMAIL_ADDRESS>This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
9:56:06 AM: npm WARN deprecated<EMAIL_ADDRESS>babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.
9:56:08 AM: npm WARN deprecated<EMAIL_ADDRESS>Critical bug fixed in v3.0.1, please upgrade to the latest version.
9:56:09 AM: npm WARN deprecated<EMAIL_ADDRESS>update to<EMAIL_ADDRESS>9:56:09 AM: npm WARN deprecated<EMAIL_ADDRESS>This version of 'buffer' is out-of-date. You must update to v4.9.2 or newer
9:56:09 AM: npm WARN deprecated<EMAIL_ADDRESS>🚨 This package has been deprecated in favor of separate inclusion of a polyfill and regenerator-runtime (when needed). See the @babel/polyfill docs (https://babeljs.io/docs/en/babel-polyfill) for more information.
9:56:09 AM: npm WARN deprecated<EMAIL_ADDRESS>Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
9:56:11 AM: npm WARN deprecated<EMAIL_ADDRESS>Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
9:56:12 AM: npm WARN deprecated<EMAIL_ADDRESS>Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
9:56:12 AM: npm WARN deprecated<EMAIL_ADDRESS>This version of 'buffer' is out-of-date. You must update to v3.6.2 or newer
9:56:12 AM: npm WARN deprecated<EMAIL_ADDRESS>update to<EMAIL_ADDRESS>9:56:13 AM: npm WARN deprecated<EMAIL_ADDRESS>https://github.com/lydell/resolve-url#deprecated
9:56:13 AM: npm WARN deprecated<EMAIL_ADDRESS>Please see https://github.com/lydell/urix#deprecated
9:56:13 AM: npm WARN deprecated<EMAIL_ADDRESS>This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
9:56:14 AM: npm WARN deprecated<EMAIL_ADDRESS>Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
9:56:16 AM: npm WARN deprecated<EMAIL_ADDRESS>This SVGO version is no longer supported. Upgrade to v2.x.x.
9:56:16 AM: npm WARN deprecated<EMAIL_ADDRESS>This package has been deprecated and now it only exports makeExecutableSchema.\nAnd it will no longer receive updates.\nWe recommend you to migrate to scoped packages such as @graphql-tools/schema, @graphql-tools/utils and etc.\nCheck out https://www.graphql-tools.com/ to learn what package you should use instead
9:56:19 AM: npm WARN deprecated<EMAIL_ADDRESS><EMAIL_ADDRESS>is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.
9:56:20 AM: npm WARN deprecated<EMAIL_ADDRESS><EMAIL_ADDRESS>is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.
9:56:33 AM: npm ERR! code 1
9:56:33 AM: npm ERR! path /opt/build/repo/node_modules/sharp
9:56:33 AM: npm ERR! command failed
9:56:33 AM: npm ERR! command sh -c (node install/libvips && node install/dll-copy && prebuild-install) || (node-gyp rebuild && node install/dll-copy)
9:56:33 AM: npm ERR! make: Entering directory '/opt/build/repo/node_modules/sharp/build'
9:56:33 AM: npm ERR!   TOUCH Release/obj.target/libvips-cpp.stamp
9:56:33 AM: npm ERR!    In file included from /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:30,
9:56:33 AM: npm ERR!                  from /opt/buildhome/.cache/node-gyp/16.16.0/include/node/node.h:63,
9:56:33 AM: npm ERR!                  from ../src/common.cc:22:
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8-internal.h: In function ‘void v8::internal::PerformCastCheck(T*)’:
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8-internal.h:492:38: error: ‘remove_cv_t’ is not a member of ‘std’; did you mean ‘remove_cv’?
9:56:33 AM: npm ERR!   492 |             !std::is_same<Data, std::remove_cv_t<T>>::value>::Perform(data);
9:56:33 AM: npm ERR!       |                                      ^~~~~~~~~~~
9:56:33 AM: npm ERR!       |                                      remove_cv
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8-internal.h:492:38: error: ‘remove_cv_t’ is not a member of ‘std’; did you mean ‘remove_cv’?
9:56:33 AM: npm ERR!   492 |             !std::is_same<Data, std::remove_cv_t<T>>::value>::Perform(data);
9:56:33 AM: npm ERR!       |                                      ^~~~~~~~~~~
9:56:33 AM: npm ERR!       |                                      remove_cv
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8-internal.h:492:50: error: template argument 2 is invalid
9:56:33 AM: npm ERR!   492 |             !std::is_same<Data, std::remove_cv_t<T>>::value>::Perform(data);
9:56:33 AM: npm ERR!       |                                                  ^
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8-internal.h:492:63: error: ‘::Perform’ has not been declared
9:56:33 AM: npm ERR!   492 |             !std::is_same<Data, std::remove_cv_t<T>>::value>::Perform(data);
9:56:33 AM: npm ERR!       |                                                               ^~~~~~~
9:56:33 AM: npm ERR! In file included from ../../nan/nan_converters.h:67,
9:56:33 AM: npm ERR!                  from ../../nan/nan.h:221,
9:56:33 AM: npm ERR!                  from ../src/common.cc:24:
9:56:33 AM: npm ERR! ../../nan/nan_converters_43_inl.h: In static member function ‘static Nan::imp::ToFactoryBase<v8::Boolean>::return_t Nan::imp::ToFactory<v8::Boolean>::convert(v8::Local<v8::Value>)’:
9:56:33 AM: npm ERR! ../../nan/nan_converters_43_inl.h:18:49: error: cannot convert ‘v8::Local<v8::Context>’ to ‘v8::Isolate*’
9:56:33 AM: npm ERR!    18 |       val->To ## TYPE(isolate->GetCurrentContext())                            \
9:56:33 AM: npm ERR!       |                       ~~~~~~~~~~~~~~~~~~~~~~~~~~^~
9:56:33 AM: npm ERR!       |                                                 |
9:56:33 AM: npm ERR!       |                                                 v8::Local<v8::Context>
9:56:33 AM: npm ERR! ../../nan/nan_converters_43_inl.h:22:1: note: in expansion of macro ‘X’
9:56:33 AM: npm ERR!    22 | X(Boolean)
9:56:33 AM: npm ERR!       | ^
9:56:33 AM: npm ERR! In file included from /opt/buildhome/.cache/node-gyp/16.16.0/include/node/node.h:63,
9:56:33 AM: npm ERR!                  from ../src/common.cc:22:
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3086:37: note:   initializing argument 1 of ‘v8::Local<v8::Boolean> v8::Value::ToBoolean(v8::Isolate*) const’
9:56:33 AM: npm ERR!  3086 |   Local<Boolean> ToBoolean(Isolate* isolate) const;
9:56:33 AM: npm ERR!       |                            ~~~~~~~~~^~~~~~~
9:56:33 AM: npm ERR! In file included from ../../nan/nan_converters.h:67,
9:56:33 AM: npm ERR!                  from ../../nan/nan.h:221,
9:56:33 AM: npm ERR!                  from ../src/common.cc:24:
9:56:33 AM: npm ERR! ../../nan/nan_converters_43_inl.h: In static member function ‘static Nan::imp::ValueFactoryBase<bool>::return_t Nan::imp::ToFactory<bool>::convert(v8::Local<v8::Value>)’:
9:56:33 AM: npm ERR! ../../nan/nan_converters_43_inl.h:37:55: error: cannot convert ‘v8::Local<v8::Context>’ to ‘v8::Isolate*’
9:56:33 AM: npm ERR!    37 |   return val->NAME ## Value(isolate->GetCurrentContext());                     \
9:56:33 AM: npm ERR!       |                             ~~~~~~~~~~~~~~~~~~~~~~~~~~^~
9:56:33 AM: npm ERR!       |                                                       |
9:56:33 AM: npm ERR!       |                                                       v8::Local<v8::Context>
9:56:33 AM: npm ERR! ../../nan/nan_converters_43_inl.h:40:1: note: in expansion of macro ‘X’
9:56:33 AM: npm ERR!    40 | X(bool, Boolean)
9:56:33 AM: npm ERR!       | ^
9:56:33 AM: npm ERR! In file included from /opt/buildhome/.cache/node-gyp/16.16.0/include/node/node.h:63,
9:56:33 AM: npm ERR!                  from ../src/common.cc:22:
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3096:30: note:   initializing argument 1 of ‘bool v8::Value::BooleanValue(v8::Isolate*) const’
9:56:33 AM: npm ERR!  3096 |   bool BooleanValue(Isolate* isolate) const;
9:56:33 AM: npm ERR!       |                     ~~~~~~~~~^~~~~~~
9:56:33 AM: npm ERR! In file included from ../../nan/nan_new.h:189,
9:56:33 AM: npm ERR!                  from ../../nan/nan.h:222,
9:56:33 AM: npm ERR!                  from ../src/common.cc:24:
9:56:33 AM: npm ERR! ../../nan/nan_implementation_12_inl.h: In static member function ‘static Nan::imp::FactoryBase<v8::Function>::return_t Nan::imp::Factory<v8::Function>::New(Nan::FunctionCallback, v8::Local<v8::Value>)’:
9:56:33 AM: npm ERR! ../../nan/nan_implementation_12_inl.h:103:42: error: cannot convert ‘v8::Isolate*’ to ‘v8::Local<v8::Context>’
9:56:33 AM: npm ERR!   103 |   return scope.Escape(v8::Function::New( isolate
9:56:33 AM: npm ERR!       |                                          ^~~~~~~
9:56:33 AM: npm ERR!       |                                          |
9:56:33 AM: npm ERR!       |                                          v8::Isolate*
9:56:33 AM: npm ERR! In file included from /opt/buildhome/.cache/node-gyp/16.16.0/include/node/node.h:63,
9:56:33 AM: npm ERR!                  from ../src/common.cc:22:
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:4754:22: note:   initializing argument 1 of ‘static v8::MaybeLocal<v8::Function> v8::Function::New(v8::Local<v8::Context>, v8::FunctionCallback, v8::Local<v8::Value>, int, v8::ConstructorBehavior, v8::SideEffectType)’
9:56:33 AM: npm ERR!  4754 |       Local<Context> context, FunctionCallback callback,
9:56:33 AM: npm ERR!       |       ~~~~~~~~~~~~~~~^~~~~~~
9:56:33 AM: npm ERR! In file included from ../src/common.cc:24:
9:56:33 AM: npm ERR! ../../nan/nan.h: In constructor ‘Nan::Utf8String::Utf8String(v8::Local<v8::Value>)’:
9:56:33 AM: npm ERR! ../../nan/nan.h:1064:76: error: cannot convert ‘v8::Isolate*’ to ‘v8::Local<v8::Context>’
9:56:33 AM: npm ERR!  1064 |       v8::Local<v8::String> string = from->ToString(v8::Isolate::GetCurrent());
9:56:33 AM: npm ERR!       |                                                     ~~~~~~~~~~~~~~~~~~~~~~~^~
9:56:33 AM: npm ERR!       |                                                                            |
9:56:33 AM: npm ERR!       |                                                                            v8::Isolate*
9:56:33 AM: npm ERR! In file included from /opt/buildhome/.cache/node-gyp/16.16.0/include/node/node.h:63,
9:56:33 AM: npm ERR!                  from ../src/common.cc:22:
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3049:22: note:   initializing argument 1 of ‘v8::MaybeLocal<v8::String> v8::Value::ToString(v8::Local<v8::Context>) const’
9:56:33 AM: npm ERR!  3049 |       Local<Context> context) const;
9:56:33 AM: npm ERR!       |       ~~~~~~~~~~~~~~~^~~~~~~
9:56:33 AM: npm ERR! In file included from ../src/common.cc:24:
9:56:33 AM: npm ERR! ../../nan/nan.h: In member function ‘void Nan::AsyncWorker::SaveToPersistent(const char*, const v8::Local<v8::Value>&)’:
9:56:33 AM: npm ERR! ../../nan/nan.h:1855:64: error: no matching function for call to ‘v8::Object::Set(v8::Local<v8::String>, const v8::Local<v8::Value>&)’
9:56:33 AM: npm ERR!  1855 |     New(persistentHandle)->Set(New(key).ToLocalChecked(), value);
9:56:33 AM: npm ERR!       |                                                                ^
9:56:33 AM: npm ERR! In file included from /opt/buildhome/.cache/node-gyp/16.16.0/include/node/node.h:63,
9:56:33 AM: npm ERR!                  from ../src/common.cc:22:
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3961:37: note: candidate: ‘v8::Maybe<bool> v8::Object::Set(v8::Local<v8::Context>, v8::Local<v8::Value>, v8::Local<v8::Value>)’
9:56:33 AM: npm ERR!  3961 |   V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context,
9:56:33 AM: npm ERR!       |                                     ^~~
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3961:37: note:   candidate expects 3 arguments, 2 provided
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3964:37: note: candidate: ‘v8::Maybe<bool> v8::Object::Set(v8::Local<v8::Context>, uint32_t, v8::Local<v8::Value>)’
9:56:33 AM: npm ERR!  3964 |   V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context, uint32_t index,
9:56:33 AM: npm ERR!       |                                     ^~~
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3964:37: note:   candidate expects 3 arguments, 2 provided
9:56:33 AM: npm ERR! In file included from ../src/common.cc:24:
9:56:33 AM: npm ERR! ../../nan/nan.h: In member function ‘void Nan::AsyncWorker::SaveToPersistent(const v8::Local<v8::String>&, const v8::Local<v8::Value>&)’:
9:56:33 AM: npm ERR! ../../nan/nan.h:1861:42: error: no matching function for call to ‘v8::Object::Set(const v8::Local<v8::String>&, const v8::Local<v8::Value>&)’
9:56:33 AM: npm ERR!  1861 |     New(persistentHandle)->Set(key, value);
9:56:33 AM: npm ERR!       |                                          ^
9:56:33 AM: npm ERR! In file included from /opt/buildhome/.cache/node-gyp/16.16.0/include/node/node.h:63,
9:56:33 AM: npm ERR!                  from ../src/common.cc:22:
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3961:37: note: candidate: ‘v8::Maybe<bool> v8::Object::Set(v8::Local<v8::Context>, v8::Local<v8::Value>, v8::Local<v8::Value>)’
9:56:33 AM: npm ERR!  3961 |   V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context,
9:56:33 AM: npm ERR!       |                                     ^~~
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3961:37: note:   candidate expects 3 arguments, 2 provided
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3964:37: note: candidate: ‘v8::Maybe<bool> v8::Object::Set(v8::Local<v8::Context>, uint32_t, v8::Local<v8::Value>)’
9:56:33 AM: npm ERR!  3964 |   V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context, uint32_t index,
9:56:33 AM: npm ERR!       |                                     ^~~
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3964:37: note:   candidate expects 3 arguments, 2 provided
9:56:33 AM: npm ERR! In file included from ../src/common.cc:24:
9:56:33 AM: npm ERR! ../../nan/nan.h: In member function ‘void Nan::AsyncWorker::SaveToPersistent(uint32_t, const v8::Local<v8::Value>&)’:
9:56:33 AM: npm ERR! ../../nan/nan.h:1867:44: error: no matching function for call to ‘v8::Object::Set(uint32_t&, const v8::Local<v8::Value>&)’
9:56:33 AM: npm ERR!  1867 |     New(persistentHandle)->Set(index, value);
9:56:33 AM: npm ERR!       |                                            ^
9:56:33 AM: npm ERR! In file included from /opt/buildhome/.cache/node-gyp/16.16.0/include/node/node.h:63,
9:56:33 AM: npm ERR!                  from ../src/common.cc:22:
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3961:37: note: candidate: ‘v8::Maybe<bool> v8::Object::Set(v8::Local<v8::Context>, v8::Local<v8::Value>, v8::Local<v8::Value>)’
9:56:33 AM: npm ERR!  3961 |   V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context,
9:56:33 AM: npm ERR!       |                                     ^~~
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3961:37: note:   candidate expects 3 arguments, 2 provided
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3964:37: note: candidate: ‘v8::Maybe<bool> v8::Object::Set(v8::Local<v8::Context>, uint32_t, v8::Local<v8::Value>)’
9:56:33 AM: npm ERR!  3964 |   V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context, uint32_t index,
9:56:33 AM: npm ERR!       |                                     ^~~
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:3964:37: note:   candidate expects 3 arguments, 2 provided
9:56:33 AM: npm ERR! In file included from ../src/common.cc:24:
9:56:33 AM: npm ERR! ../../nan/nan.h: In member function ‘v8::Local<v8::Value> Nan::AsyncWorker::GetFromPersistent(const char*) const’:
9:56:33 AM: npm ERR! ../../nan/nan.h:1873:61: error: no matching function for call to ‘v8::Object::Get(v8::Local<v8::String>)’
9:56:33 AM: npm ERR!  1873 |         New(persistentHandle)->Get(New(key).ToLocalChecked()));
9:56:33 AM: npm ERR!       |                                                             ^
9:56:33 AM: npm ERR! In file included from /opt/buildhome/.cache/node-gyp/16.16.0/include/node/node.h:63,
9:56:33 AM: npm ERR!                  from ../src/common.cc:22:
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:4007:43: note: candidate: ‘v8::MaybeLocal<v8::Value> v8::Object::Get(v8::Local<v8::Context>, v8::Local<v8::Value>)’
9:56:33 AM: npm ERR!  4007 |   V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
9:56:33 AM: npm ERR!       |                                           ^~~
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:4007:43: note:   candidate expects 2 arguments, 1 provided
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:4010:43: note: candidate: ‘v8::MaybeLocal<v8::Value> v8::Object::Get(v8::Local<v8::Context>, uint32_t)’
9:56:33 AM: npm ERR!  4010 |   V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
9:56:33 AM: npm ERR!       |                                           ^~~
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:4010:43: note:   candidate expects 2 arguments, 1 provided
9:56:33 AM: npm ERR! In file included from ../src/common.cc:24:
9:56:33 AM: npm ERR! ../../nan/nan.h: In member function ‘v8::Local<v8::Value> Nan::AsyncWorker::GetFromPersistent(const v8::Local<v8::String>&) const’:
9:56:33 AM: npm ERR! ../../nan/nan.h:1879:55: error: no matching function for call to ‘v8::Object::Get(const v8::Local<v8::String>&)’
9:56:33 AM: npm ERR!  1879 |     return scope.Escape(New(persistentHandle)->Get(key));
9:56:33 AM: npm ERR!       |                                                       ^
9:56:33 AM: npm ERR! In file included from /opt/buildhome/.cache/node-gyp/16.16.0/include/node/node.h:63,
9:56:33 AM: npm ERR!                  from ../src/common.cc:22:
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:4007:43: note: candidate: ‘v8::MaybeLocal<v8::Value> v8::Object::Get(v8::Local<v8::Context>, v8::Local<v8::Value>)’
9:56:33 AM: npm ERR!  4007 |   V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
9:56:33 AM: npm ERR!       |                                           ^~~
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:4007:43: note:   candidate expects 2 arguments, 1 provided
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:4010:43: note: candidate: ‘v8::MaybeLocal<v8::Value> v8::Object::Get(v8::Local<v8::Context>, uint32_t)’
9:56:33 AM: npm ERR!  4010 |   V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
9:56:33 AM: npm ERR!       |                                           ^~~
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:4010:43: note:   candidate expects 2 arguments, 1 provided
9:56:33 AM: npm ERR! In file included from ../src/common.cc:24:
9:56:33 AM: npm ERR! ../../nan/nan.h: In member function ‘v8::Local<v8::Value> Nan::AsyncWorker::GetFromPersistent(uint32_t) const’:
9:56:33 AM: npm ERR! ../../nan/nan.h:1884:57: error: no matching function for call to ‘v8::Object::Get(uint32_t&)’
9:56:33 AM: npm ERR!  1884 |     return scope.Escape(New(persistentHandle)->Get(index));
9:56:33 AM: npm ERR!       |                                                         ^
9:56:33 AM: npm ERR! In file included from /opt/buildhome/.cache/node-gyp/16.16.0/include/node/node.h:63,
9:56:33 AM: npm ERR!                  from ../src/common.cc:22:
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:4007:43: note: candidate: ‘v8::MaybeLocal<v8::Value> v8::Object::Get(v8::Local<v8::Context>, v8::Local<v8::Value>)’
9:56:33 AM: npm ERR!  4007 |   V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
9:56:33 AM: npm ERR!       |                                           ^~~
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:4007:43: note:   candidate expects 2 arguments, 1 provided
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:4010:43: note: candidate: ‘v8::MaybeLocal<v8::Value> v8::Object::Get(v8::Local<v8::Context>, uint32_t)’
9:56:33 AM: npm ERR!  4010 |   V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
9:56:33 AM: npm ERR!       |                                           ^~~
9:56:33 AM: npm ERR! /opt/buildhome/.cache/node-gyp/16.16.0/include/node/v8.h:4010:43: note:   candidate expects 2 arguments, 1 provided
9:56:33 AM: npm ERR! In file included from ../src/common.cc:24:
9:56:33 AM: npm ERR! ../../nan/nan.h: In function ‘void Nan::AsyncQueueWorker(Nan::AsyncWorker*)’:
9:56:33 AM: npm ERR! ../../nan/nan.h:2208:62: warning: cast between incompatible function types from ‘void (*)(uv_work_t*)’ {aka ‘void (*)(uv_work_s*)’} to ‘uv_after_work_cb’ {aka ‘void (*)(uv_work_s*, int)’} [-Wcast-function-type]
9:56:33 AM: npm ERR!  2208 |     , reinterpret_cast<uv_after_work_cb>(AsyncExecuteComplete)
9:56:33 AM: npm ERR!       |                                                              ^
9:56:33 AM: npm ERR! In file included from /usr/include/c++/9/cassert:44,
9:56:33 AM: npm ERR!                  from /opt/buildhome/.cache/node-gyp/16.16.0/include/node/node_object_wrap.h:26,
9:56:33 AM: npm ERR!                  from ../../nan/nan.h:54,
9:56:33 AM: npm ERR!                  from ../src/common.cc:24:
9:56:33 AM: npm ERR! ../../nan/nan_object_wrap.h: In destructor ‘virtual Nan::ObjectWrap::~ObjectWrap()’:
9:56:33 AM: npm ERR! ../../nan/nan_object_wrap.h:24:25: error: ‘class Nan::Persistent<v8::Object>’ has no member named ‘IsNearDeath’
9:56:33 AM: npm ERR!    24 |     assert(persistent().IsNearDeath());
9:56:33 AM: npm ERR!       |                         ^~~~~~~~~~~
9:56:33 AM: npm ERR! In file included from ../../nan/nan.h:2698,
9:56:33 AM: npm ERR!                  from ../src/common.cc:24:
9:56:33 AM: npm ERR! ../../nan/nan_object_wrap.h: In member function ‘void Nan::ObjectWrap::MakeWeak()’:
9:56:33 AM: npm ERR! ../../nan/nan_object_wrap.h:67:18: error: ‘class Nan::Persistent<v8::Object>’ has no member named ‘MarkIndependent’
9:56:33 AM: npm ERR!    67 |     persistent().MarkIndependent();
9:56:33 AM: npm ERR!       |                  ^~~~~~~~~~~~~~~
9:56:33 AM: npm ERR! In file included from /usr/include/c++/9/cassert:44,
9:56:33 AM: npm ERR!                  from /opt/buildhome/.cache/node-gyp/16.16.0/include/node/node_object_wrap.h:26,
9:56:33 AM: npm ERR!                  from ../../nan/nan.h:54,
9:56:33 AM: npm ERR!                  from ../src/common.cc:24:
9:56:33 AM: npm ERR! ../../nan/nan_object_wrap.h: In static member function ‘static void Nan::ObjectWrap::WeakCallback(const v8::WeakCallbackInfo<Nan::ObjectWrap>&)’:
9:56:33 AM: npm ERR! ../../nan/nan_object_wrap.h:124:26: error: ‘class Nan::Persistent<v8::Object>’ has no member named ‘IsNearDeath’
9:56:33 AM: npm ERR!   124 |     assert(wrap->handle_.IsNearDeath());
9:56:33 AM: npm ERR!       |                          ^~~~~~~~~~~
9:56:33 AM: npm ERR! In file included from ../src/common.cc:27:
9:56:33 AM: npm ERR! ../src/common.h: At global scope:
9:56:33 AM: npm ERR! ../src/common.h:78:20: error: ‘Handle’ is not a member of ‘v8’; did you mean ‘JobHandle’?
9:56:33 AM: npm ERR!    78 |   bool HasAttr(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |                    ^~~~~~
9:56:33 AM: npm ERR!       |                    JobHandle
9:56:33 AM: npm ERR! ../src/common.h:78:37: error: expected primary-expression before ‘>’ token
9:56:33 AM: npm ERR!    78 |   bool HasAttr(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |                                     ^
9:56:33 AM: npm ERR! ../src/common.h:78:39: error: ‘obj’ was not declared in this scope
9:56:33 AM: npm ERR!    78 |   bool HasAttr(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |                                       ^~~
9:56:33 AM: npm ERR! ../src/common.h:78:56: error: expected primary-expression before ‘attr’
9:56:33 AM: npm ERR!    78 |   bool HasAttr(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |                                                        ^~~~
9:56:33 AM: npm ERR! ../src/common.h:78:60: error: expression list treated as compound expression in initializer [-fpermissive]
9:56:33 AM: npm ERR!    78 |   bool HasAttr(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |                                                            ^
9:56:33 AM: npm ERR! ../src/common.h:79:29: error: ‘Handle’ is not a member of ‘v8’; did you mean ‘JobHandle’?
9:56:33 AM: npm ERR!    79 |   std::string AttrAsStr(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |                             ^~~~~~
9:56:33 AM: npm ERR!       |                             JobHandle
9:56:33 AM: npm ERR! ../src/common.h:79:46: error: expected primary-expression before ‘>’ token
9:56:33 AM: npm ERR!    79 |   std::string AttrAsStr(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |                                              ^
9:56:33 AM: npm ERR! ../src/common.h:79:48: error: ‘obj’ was not declared in this scope
9:56:33 AM: npm ERR!    79 |   std::string AttrAsStr(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |                                                ^~~
9:56:33 AM: npm ERR! ../src/common.h:79:65: error: expected primary-expression before ‘attr’
9:56:33 AM: npm ERR!    79 |   std::string AttrAsStr(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |                                                                 ^~~~
9:56:33 AM: npm ERR! ../src/common.h:80:38: error: ‘Handle’ is not a member of ‘v8’; did you mean ‘JobHandle’?
9:56:33 AM: npm ERR!    80 |   std::vector<double> AttrAsRgba(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |                                      ^~~~~~
9:56:33 AM: npm ERR!       |                                      JobHandle
9:56:33 AM: npm ERR! ../src/common.h:80:55: error: expected primary-expression before ‘>’ token
9:56:33 AM: npm ERR!    80 |   std::vector<double> AttrAsRgba(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |                                                       ^
9:56:33 AM: npm ERR! ../src/common.h:80:57: error: ‘obj’ was not declared in this scope
9:56:33 AM: npm ERR!    80 |   std::vector<double> AttrAsRgba(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |                                                         ^~~
9:56:33 AM: npm ERR! ../src/common.h:80:74: error: expected primary-expression before ‘attr’
9:56:33 AM: npm ERR!    80 |   std::vector<double> AttrAsRgba(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |                                                                          ^~~~
9:56:33 AM: npm ERR! ../src/common.h:81:48: error: ‘Handle’ is not a member of ‘v8’; did you mean ‘JobHandle’?
9:56:33 AM: npm ERR!    81 |   template<typename T> v8::Local<T> AttrAs(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                ^~~~~~
9:56:33 AM: npm ERR!       |                                                JobHandle
9:56:33 AM: npm ERR! ../src/common.h:81:65: error: expected primary-expression before ‘>’ token
9:56:33 AM: npm ERR!    81 |   template<typename T> v8::Local<T> AttrAs(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                                 ^
9:56:33 AM: npm ERR! ../src/common.h:81:67: error: ‘obj’ was not declared in this scope
9:56:33 AM: npm ERR!    81 |   template<typename T> v8::Local<T> AttrAs(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                                   ^~~
9:56:33 AM: npm ERR! ../src/common.h:81:84: error: expected primary-expression before ‘attr’
9:56:33 AM: npm ERR!    81 |   template<typename T> v8::Local<T> AttrAs(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                                                ^~~~
9:56:33 AM: npm ERR! ../src/common.h:81:37: warning: variable templates only available with ‘-std=c++14’ or ‘-std=gnu++14’
9:56:33 AM: npm ERR!    81 |   template<typename T> v8::Local<T> AttrAs(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                     ^~~~~~
9:56:33 AM: npm ERR! ../src/common.h:81:89: error: expected ‘;’ before ‘{’ token
9:56:33 AM: npm ERR!    81 |   template<typename T> v8::Local<T> AttrAs(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                                                ^~
9:56:33 AM: npm ERR!       |                                                                                ;
9:56:33 AM: npm ERR! ../src/common.h:84:37: error: ‘Handle’ is not a member of ‘v8’; did you mean ‘JobHandle’?
9:56:33 AM: npm ERR!    84 |   template<typename T> T AttrTo(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                     ^~~~~~
9:56:33 AM: npm ERR!       |                                     JobHandle
9:56:33 AM: npm ERR! ../src/common.h:84:54: error: expected primary-expression before ‘>’ token
9:56:33 AM: npm ERR!    84 |   template<typename T> T AttrTo(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                      ^
9:56:33 AM: npm ERR! ../src/common.h:84:56: error: ‘obj’ was not declared in this scope
9:56:33 AM: npm ERR!    84 |   template<typename T> T AttrTo(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                        ^~~
9:56:33 AM: npm ERR! ../src/common.h:84:73: error: expected primary-expression before ‘attr’
9:56:33 AM: npm ERR!    84 |   template<typename T> T AttrTo(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                                         ^~~~
9:56:33 AM: npm ERR! ../src/common.h:84:26: warning: variable templates only available with ‘-std=c++14’ or ‘-std=gnu++14’
9:56:33 AM: npm ERR!    84 |   template<typename T> T AttrTo(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                          ^~~~~~
9:56:33 AM: npm ERR! ../src/common.h:84:78: error: expected ‘;’ before ‘{’ token
9:56:33 AM: npm ERR!    84 |   template<typename T> T AttrTo(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                                              ^~
9:56:33 AM: npm ERR!       |                                                                              ;
9:56:33 AM: npm ERR! ../src/common.h:87:37: error: ‘Handle’ is not a member of ‘v8’; did you mean ‘JobHandle’?
9:56:33 AM: npm ERR!    87 |   template<typename T> T AttrTo(v8::Handle<v8::Object> obj, int attr) {
9:56:33 AM: npm ERR!       |                                     ^~~~~~
9:56:33 AM: npm ERR!       |                                     JobHandle
9:56:33 AM: npm ERR! ../src/common.h:87:54: error: expected primary-expression before ‘>’ token
9:56:33 AM: npm ERR!    87 |   template<typename T> T AttrTo(v8::Handle<v8::Object> obj, int attr) {
9:56:33 AM: npm ERR!       |                                                      ^
9:56:33 AM: npm ERR! ../src/common.h:87:56: error: ‘obj’ was not declared in this scope
9:56:33 AM: npm ERR!    87 |   template<typename T> T AttrTo(v8::Handle<v8::Object> obj, int attr) {
9:56:33 AM: npm ERR!       |                                                        ^~~
9:56:33 AM: npm ERR! ../src/common.h:87:61: error: expected primary-expression before ‘int’
9:56:33 AM: npm ERR!    87 |   template<typename T> T AttrTo(v8::Handle<v8::Object> obj, int attr) {
9:56:33 AM: npm ERR!       |                                                             ^~~
9:56:33 AM: npm ERR! ../src/common.h:84:26: warning: variable templates only available with ‘-std=c++14’ or ‘-std=gnu++14’
9:56:33 AM: npm ERR!    84 |   template<typename T> T AttrTo(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                          ^~~~~~
9:56:33 AM: npm ERR! ../src/common.h:87:70: error: expected ‘;’ before ‘{’ token
9:56:33 AM: npm ERR!    87 |   template<typename T> T AttrTo(v8::Handle<v8::Object> obj, int attr) {
9:56:33 AM: npm ERR!       |                                                                      ^~
9:56:33 AM: npm ERR!       |                                                                      ;
9:56:33 AM: npm ERR! ../src/common.h:93:9: error: ‘Handle’ is not a member of ‘v8’; did you mean ‘JobHandle’?
9:56:33 AM: npm ERR!    93 |     v8::Handle<v8::Object> input, std::vector<v8::Local<v8::Object>> &buffersToPersist);
9:56:33 AM: npm ERR!       |         ^~~~~~
9:56:33 AM: npm ERR!       |         JobHandle
9:56:33 AM: npm ERR! ../src/common.h:93:26: error: expected primary-expression before ‘>’ token
9:56:33 AM: npm ERR!    93 |     v8::Handle<v8::Object> input, std::vector<v8::Local<v8::Object>> &buffersToPersist);
9:56:33 AM: npm ERR!       |                          ^
9:56:33 AM: npm ERR! ../src/common.h:93:28: error: ‘input’ was not declared in this scope
9:56:33 AM: npm ERR!    93 |     v8::Handle<v8::Object> input, std::vector<v8::Local<v8::Object>> &buffersToPersist);
9:56:33 AM: npm ERR!       |                            ^~~~~
9:56:33 AM: npm ERR! ../src/common.h:93:70: error: expected primary-expression before ‘&’ token
9:56:33 AM: npm ERR!    93 |     v8::Handle<v8::Object> input, std::vector<v8::Local<v8::Object>> &buffersToPersist);
9:56:33 AM: npm ERR!       |                                                                      ^
9:56:33 AM: npm ERR! ../src/common.h:93:71: error: ‘buffersToPersist’ was not declared in this scope
9:56:33 AM: npm ERR!    93 |     v8::Handle<v8::Object> input, std::vector<v8::Local<v8::Object>> &buffersToPersist);
9:56:33 AM: npm ERR!       |                                                                       ^~~~~~~~~~~~~~~~
9:56:33 AM: npm ERR! ../src/common.h:93:87: error: expression list treated as compound expression in initializer [-fpermissive]
9:56:33 AM: npm ERR!    93 |     v8::Handle<v8::Object> input, std::vector<v8::Local<v8::Object>> &buffersToPersist);
9:56:33 AM: npm ERR!       |                                                                                ^
9:56:33 AM: npm ERR! ../src/common.cc:34:8: error: redefinition of ‘bool sharp::HasAttr’
9:56:33 AM: npm ERR!    34 |   bool HasAttr(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |        ^~~~~~~
9:56:33 AM: npm ERR! In file included from ../src/common.cc:27:
9:56:33 AM: npm ERR! ../src/common.h:78:8: note: ‘bool sharp::HasAttr’ previously defined here
9:56:33 AM: npm ERR!    78 |   bool HasAttr(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |        ^~~~~~~
9:56:33 AM: npm ERR! ../src/common.cc:34:20: error: ‘Handle’ is not a member of ‘v8’; did you mean ‘JobHandle’?
9:56:33 AM: npm ERR!    34 |   bool HasAttr(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                    ^~~~~~
9:56:33 AM: npm ERR!       |                    JobHandle
9:56:33 AM: npm ERR! ../src/common.cc:34:37: error: expected primary-expression before ‘>’ token
9:56:33 AM: npm ERR!    34 |   bool HasAttr(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                     ^
9:56:33 AM: npm ERR! ../src/common.cc:34:39: error: ‘obj’ was not declared in this scope
9:56:33 AM: npm ERR!    34 |   bool HasAttr(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                       ^~~
9:56:33 AM: npm ERR! ../src/common.cc:34:56: error: expected primary-expression before ‘attr’
9:56:33 AM: npm ERR!    34 |   bool HasAttr(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                        ^~~~
9:56:33 AM: npm ERR! ../src/common.cc:37:15: error: redefinition of ‘std::string sharp::AttrAsStr’
9:56:33 AM: npm ERR!    37 |   std::string AttrAsStr(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |               ^~~~~~~~~
9:56:33 AM: npm ERR! In file included from ../src/common.cc:27:
9:56:33 AM: npm ERR! ../src/common.h:79:15: note: ‘std::string sharp::AttrAsStr’ previously declared here
9:56:33 AM: npm ERR!    79 |   std::string AttrAsStr(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |               ^~~~~~~~~
9:56:33 AM: npm ERR! ../src/common.cc:37:29: error: ‘Handle’ is not a member of ‘v8’; did you mean ‘JobHandle’?
9:56:33 AM: npm ERR!    37 |   std::string AttrAsStr(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                             ^~~~~~
9:56:33 AM: npm ERR!       |                             JobHandle
9:56:33 AM: npm ERR! ../src/common.cc:37:46: error: expected primary-expression before ‘>’ token
9:56:33 AM: npm ERR!    37 |   std::string AttrAsStr(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                              ^
9:56:33 AM: npm ERR! ../src/common.cc:37:48: error: ‘obj’ was not declared in this scope
9:56:33 AM: npm ERR!    37 |   std::string AttrAsStr(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                ^~~
9:56:33 AM: npm ERR! ../src/common.cc:37:65: error: expected primary-expression before ‘attr’
9:56:33 AM: npm ERR!    37 |   std::string AttrAsStr(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                                 ^~~~
9:56:33 AM: npm ERR! ../src/common.cc:40:23: error: redefinition of ‘std::vector<double> sharp::AttrAsRgba’
9:56:33 AM: npm ERR!    40 |   std::vector<double> AttrAsRgba(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                       ^~~~~~~~~~
9:56:33 AM: npm ERR! In file included from ../src/common.cc:27:
9:56:33 AM: npm ERR! ../src/common.h:80:23: note: ‘std::vector<double> sharp::AttrAsRgba’ previously declared here
9:56:33 AM: npm ERR!    80 |   std::vector<double> AttrAsRgba(v8::Handle<v8::Object> obj, std::string attr);
9:56:33 AM: npm ERR!       |                       ^~~~~~~~~~
9:56:33 AM: npm ERR! ../src/common.cc:40:38: error: ‘Handle’ is not a member of ‘v8’; did you mean ‘JobHandle’?
9:56:33 AM: npm ERR!    40 |   std::vector<double> AttrAsRgba(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                      ^~~~~~
9:56:33 AM: npm ERR!       |                                      JobHandle
9:56:33 AM: npm ERR! ../src/common.cc:40:55: error: expected primary-expression before ‘>’ token
9:56:33 AM: npm ERR!    40 |   std::vector<double> AttrAsRgba(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                       ^
9:56:33 AM: npm ERR! ../src/common.cc:40:57: error: ‘obj’ was not declared in this scope
9:56:33 AM: npm ERR!    40 |   std::vector<double> AttrAsRgba(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                         ^~~
9:56:33 AM: npm ERR! ../src/common.cc:40:74: error: expected primary-expression before ‘attr’
9:56:33 AM: npm ERR!    40 |   std::vector<double> AttrAsRgba(v8::Handle<v8::Object> obj, std::string attr) {
9:56:33 AM: npm ERR!       |                                                                          ^~~~
9:56:33 AM: npm ERR! ../src/common.cc:50:20: error: redefinition of ‘sharp::InputDescriptor* sharp::CreateInputDescriptor’
9:56:33 AM: npm ERR!    50 |   InputDescriptor* CreateInputDescriptor(
9:56:33 AM: npm ERR!       |                    ^~~~~~~~~~~~~~~~~~~~~
9:56:33 AM: npm ERR! In file included from ../src/common.cc:27:
9:56:33 AM: npm ERR! ../src/common.h:92:20: note: ‘sharp::InputDescriptor* sharp::CreateInputDescriptor’ previously defined here
9:56:33 AM: npm ERR!    92 |   InputDescriptor* CreateInputDescriptor(
9:56:33 AM: npm ERR!       |                    ^~~~~~~~~~~~~~~~~~~~~
9:56:33 AM: npm ERR! ../src/common.cc:51:9: error: ‘Handle’ is not a member of ‘v8’; did you mean ‘JobHandle’?
9:56:33 AM: npm ERR!    51 |     v8::Handle<v8::Object> input, std::vector<v8::Local<v8::Object>> &buffersToPersist
9:56:33 AM: npm ERR!       |         ^~~~~~
9:56:33 AM: npm ERR!       |         JobHandle
9:56:33 AM: npm ERR! ../src/common.cc:51:26: error: expected primary-expression before ‘>’ token
9:56:33 AM: npm ERR!    51 |     v8::Handle<v8::Object> input, std::vector<v8::Local<v8::Object>> &buffersToPersist
9:56:33 AM: npm ERR!       |                          ^
9:56:33 AM: npm ERR! ../src/common.cc:51:28: error: ‘input’ was not declared in this scope
9:56:33 AM: npm ERR!    51 |     v8::Handle<v8::Object> input, std::vector<v8::Local<v8::Object>> &buffersToPersist
9:56:33 AM: npm ERR!       |                            ^~~~~
9:56:33 AM: npm ERR! ../src/common.cc:51:70: error: expected primary-expression before ‘&’ token
9:56:33 AM: npm ERR!    51 |     v8::Handle<v8::Object> input, std::vector<v8::Local<v8::Object>> &buffersToPersist
9:56:33 AM: npm ERR!       |                                                                      ^
9:56:33 AM: npm ERR! ../src/common.cc:51:71: error: ‘buffersToPersist’ was not declared in this scope
9:56:33 AM: npm ERR!    51 |     v8::Handle<v8::Object> input, std::vector<v8::Local<v8::Object>> &buffersToPersist
9:56:33 AM: npm ERR!       |                                                                       ^~~~~~~~~~~~~~~~
9:56:33 AM: npm ERR! make: *** [sharp.target.mk:182: Release/obj.target/sharp/src/common.o] Error 1
9:56:33 AM: npm ERR! gyp ERR! build error
9:56:33 AM: npm ERR! gyp ERR! stack Error: `make` failed with exit code: 2
9:56:33 AM: npm ERR! gyp ERR! stack     at ChildProcess.onExit (/opt/buildhome/.nvm/versions/node/v16.16.0/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:194:23)
9:56:33 AM: npm ERR! gyp ERR! stack     at ChildProcess.emit (node:events:527:28)
9:56:33 AM: npm ERR! gyp ERR! stack     at Process.ChildProcess._handle.onexit (node:internal/child_process:291:12)
9:56:33 AM: npm ERR! gyp ERR! System Linux 5.4.181-99.354.amzn2.x86_64
9:56:33 AM: npm ERR! gyp ERR! command "/opt/buildhome/.nvm/versions/node/v16.16.0/bin/node" "/opt/buildhome/.nvm/versions/node/v16.16.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
9:56:33 AM: npm ERR! gyp ERR! cwd /opt/build/repo/node_modules/sharp
9:56:33 AM: npm ERR! gyp ERR! node -v v16.16.0
9:56:33 AM: npm ERR! gyp ERR! node-gyp -v v9.0.0
9:56:33 AM: npm ERR! gyp ERR! not ok
9:56:33 AM: npm ERR! A complete log of this run can be found in:
9:56:33 AM: npm ERR!     /opt/buildhome/.npm/_logs/2022-07-26T03_55_17_124Z-debug-0.log
9:56:33 AM: Error during NPM install
9:56:33 AM: Build was terminated: Build script returned non-zero exit code: 1
9:56:33 AM: Creating deploy upload records
9:56:33 AM: Failing build: Failed to build site
9:56:33 AM: Failed during stage 'building site': Build script returned non-zero exit code: 1 (https://ntl.fyi/exit-code-1)
9:56:34 AM: Finished processing build request in 1m26.599113088s

ok finally deployed
i had to remove the package lock file


navOptions from NiaAppState has been removed regarding   #997

The issue was a navigation issue which restricted to navigate to any screen if opened through search screen in the app and this is I believe is due to navOptions that we have passed to each and every navigation functions that we are calling in NiaAppState : navigateToTopLevelDestination as there are some functions which are causing some bug in seachflow , here is the navOption part:->
val topLevelNavOptions = navOptions {

             popUpTo(navController.graph.findStartDestination().id) {
                 saveState = true
             }

             launchSingleTop = true

             restoreState = true
         }

I removed these topLevelNavOptions when calling navigation function for each screen
Old navigateToTopLevelDestination method in NiaAppState class:->
fun navigateToTopLevelDestination(topLevelDestination: TopLevelDestination) {
        trace("Navigation: ${topLevelDestination.name}") {
            val topLevelNavOptions = navOptions {
                // Pop up to the start destination of the graph to
                // avoid building up a large stack of destinations
                // on the back stack as users select items
                popUpTo(navController.graph.findStartDestination().id) {
                    saveState = true
                }
                // Avoid multiple copies of the same destination when
                // reselecting the same item
                launchSingleTop = true
                // Restore state when reselecting a previously selected item
                restoreState = true
            }

            when (topLevelDestination) {
                FOR_YOU -> navController.navigateToForYou(topLevelDestination)
                BOOKMARKS -> navController.navigateToBookmarks(topLevelDestination)
                INTERESTS -> navController.navigateToInterestsGraph(topLevelDestination)
            }
        }
    }

New method :->
fun navigateToTopLevelDestination(topLevelDestination: TopLevelDestination) {
        trace("Navigation: ${topLevelDestination.name}") {
            val topLevelNavOptions = navOptions {
                // Pop up to the start destination of the graph to
                // avoid building up a large stack of destinations
                // on the back stack as users select items
                popUpTo(navController.graph.findStartDestination().id) {
                    saveState = true
                }
                // Avoid multiple copies of the same destination when
                // reselecting the same item
                launchSingleTop = true
                // Restore state when reselecting a previously selected item
                restoreState = true
            }

            when (topLevelDestination) {
                FOR_YOU -> navController.navigateToForYou()
                BOOKMARKS -> navController.navigateToBookmarks()
                INTERESTS -> navController.navigateToInterestsGraph()
            }
        }
    }

Fixes #997
Do tests pass?
-> I tried running the app on a mobile device and it is working fine
-> But I didn't run any test as I don't know how to work with tests as I am currently learning about tests in android

But I didn't run any test as I don't know how to work with tests as I am currently learning about tests in android

You can run ./gradlew testDemoDebug :lint:test to run unit tests and run ./gradlew packageDemoDebug packageDemoDebugAndroidTest connectedDemoDebugAndroidTest --daemon to run androidTests on your machine.

I think this  will execute tests against all build variants
So I just run NavigationUiTest and NavigationTest to make sure everything is working fine in navigation part regarding the #997 issue and these tests passed successfully. btw thanks for pointing it out.

@lihenggui am I in the right direction?

@mlykotom @lihenggui @tunjid @SimonMarquis please look at these changes which might fix #997

Removing the top level nav options would cause another bug. Switching between each tab should pop the nav controller and save the state of each tab to be restored when returning to it.

"Hi, I've also been following this issue with interest. In doing so, I came across the following question:
By handling it like this, the issue seems to go away.
     popUpTo(navController.graph.findStartDestination().id) {
                    saveState = true
                }

Can you tell me what the role of saveState is?
Even with saveState commented out, it seems like the previous state of the screen is maintained through theme changes and screen rotations.
Could you possibly tell me under what conditions saveState can be tested?"

"Hi, I've also been following this issue with interest. In doing so, I came across the following question: By handling it like this, the issue seems to go away.
     popUpTo(navController.graph.findStartDestination().id) {
                    saveState = true
                }

Can you tell me what the role of saveState is? Even with saveState commented out, it seems like the previous state of the screen is maintained through theme changes and screen rotations. Could you possibly tell me under what conditions saveState can be tested?"

I think the saveState =true indicates that the state of the popped destinations should be saved. This is useful to maintain the state when navigating back.
not using this may lead  to a situation where, when navigating back to a destination, it might be in a default or uninitialized state rather than in the exact state it was when it was last visited.

"Hi, I've also been following this issue with interest. In doing so, I came across the following question: By handling it like this, the issue seems to go away.
     popUpTo(navController.graph.findStartDestination().id) {
                    saveState = true
                }

Can you tell me what the role of saveState is? Even with saveState commented out, it seems like the previous state of the screen is maintained through theme changes and screen rotations. Could you possibly tell me under what conditions saveState can be tested?"

May be the scroll position of previous screen might not be saved if saveState=false


optionally close orphaned NDArrays using Java garbage collection

Description
This PR is a solution suggestion to https://github.com/deepjavalibrary/djl/issues/2210.
A striking example of the impact shows the following figure (to reproduce see https://github.com/deepjavalibrary/djl/issues/2210):

Design considerations: DJLDiscussionInputVersion4.pdf
Opt-in:  SwitchGarbageCollection.on();
The implementation here is done for PyTorch, but the solution approach is general.

Codecov Report
Base: 72.08% // Head: 71.33% // Decreases project coverage by -0.75% :warning:

Coverage data is based on head (7062e5c) compared to base (bb5073f).
Patch coverage: 71.83% of modified lines in pull request are covered.

Additional details and impacted files
@@             Coverage Diff              @@
##             master    #2273      +/-   ##
============================================
- Coverage     72.08%   71.33%   -0.76%
- Complexity     5126     6381    +1255
============================================
  Files           473      636     +163
  Lines         21970    28302    +6332
  Branches       2351     3009     +658
============================================
+ Hits          15838    20188    +4350
- Misses         4925     6646    +1721
- Partials       1207     1468     +261

Impacted Files
Coverage Δ

api/src/main/java/ai/djl/modality/cv/Image.java
69.23% <ø> (-4.11%)
:arrow_down:

...rc/main/java/ai/djl/modality/cv/MultiBoxPrior.java
76.00% <ø> (ø)

...rc/main/java/ai/djl/modality/cv/output/Joints.java
71.42% <ø> (ø)

.../main/java/ai/djl/modality/cv/output/Landmark.java
100.00% <ø> (ø)

...main/java/ai/djl/modality/cv/output/Rectangle.java
72.41% <0.00%> (ø)

...i/djl/modality/cv/translator/BigGANTranslator.java
21.42% <0.00%> (-5.24%)
:arrow_down:

.../modality/cv/translator/ImageFeatureExtractor.java
0.00% <0.00%> (ø)

.../ai/djl/modality/cv/translator/YoloTranslator.java
27.77% <0.00%> (+18.95%)
:arrow_up:

...ain/java/ai/djl/modality/cv/util/NDImageUtils.java
59.21% <0.00%> (ø)

api/src/main/java/ai/djl/modality/nlp/Decoder.java
63.63% <ø> (ø)

... and 570 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

:umbrella: View full report at Codecov.
:loudspeaker: Do you have feedback about the report comment? Let us know in this issue.

This approach is very similar to reference counting, which is used widely in C++. Here I just leave a reference implementation: https://github.com/almson/almson-refcount will take a look after holiday.
Thanks for your contribution! A great mile to explore something alternative. But I would try to benchmark in concurrent mode, to see what happened in parallel block

Another concern is the implementation on the reference queue: seemed all operation is involved with a synchronous checkQueue operation, what is the impact if we frequently adding/removing resources? How much chances we will be blocked by that

In the proxyMaker implementation you used a UUID random generation (synchronize call) and not picking up the uid. UID is also unique across the resources

Another concern is the implementation on the reference queue: seemed all operation is involved with a synchronous checkQueue operation, what is the impact if we frequently adding/removing resources? How much chances we will be blocked by that

On the ReferenceQueue there are two fast methods enqueue and poll called once per reference. I wouldn't expect notable blocking from there.

In the proxyMaker implementation you used a UUID random generation (synchronize call) and not picking up the uid. UID is also unique across the resources

I'm not sure if I got your concern right. It is not necessary to use an UUID here - an Integer used right - would also do. This key just needs to be an object that is unique within the PtNDArrayProxyMaker. It gets garbage collected together with the proxy when the user has no more references to the proxy while there still is a reference from the NDManager to the corresponding value of type NDArray. If your concern is about the particular UID implementation I could replace it with an Integer counter.

I looked a bit more in this solution, I think this doesn't really work in multi-threading case.
You are using a global queue to store WeakReference, and trying close the NDArray on any NDArray operations.
Consider there are two threads, NDArray 'x' is created in thread 1, and immediately get GCed.
Thread 2 calling a NDArray operation, and picked up 'x' from the queue and trying to delete 'x', this may lead to crash.
PyTorch internally using reference count, and delete NDArray is not thread-safe. If both thread reduced the count and see it become 0, both thread will try to free the memory and causing segfault. A Tensor in PyTorch maybe sliced internally and java only holding one of its handle. The NDArray must be deleted in the same thread that PyTorch internal Tensor is holding.

@frankfliu Thx a lot for looking into the suggested solution. I will try my best to solve the issues you mentioned tomorrow.
One comment on the threading issue: If I understand you right it is necessary to have the closing of an NDArray done by the same thread as the creation. If so I would replace the global Queue by a ThreadLocal Queue.
One more point for now: I must confess that in the heat of the moment during the last merges with the master branch I didn't pay attention to my memory leak test ... I'll try to fix that tomorrow as well.

ThreadLocal has its own issue. It's hard to clean up ThreadLocal memory. We do see some customer create and distroy thread a lot.

ThreadLocal has its own issue. It's hard to clean up ThreadLocal memory. We do see some customer create and distroy thread a lot.

What would you suggest?

One more point for now: I must confess that in the heat of the moment during the last merges with the master branch I didn't pay attention to my memory leak test ... I'll try to fix that tomorrow as well.

I repaired the merge (everythink merged but "A temporary solution to issue 2210 (#2304)"). Memory leak test works now. I will now try to solve the issues mentioned in the comments.

ThreadLocal has its own issue. It's hard to clean up ThreadLocal memory. We do see some customer create and distroy thread a lot.

What would you suggest? Give it a try? ... I'll give it a try and keep your comment in mind.

I changed the code to use threadLocal queues.
In PtNDArrayProxyMaker a ThreadLocal holds the WeakHashMapWrappers for all the threads.
A smoketest with 1000 threads does not reveal any problems.

I looked a bit more into this PR, I don't think this solution can fly:

clean up NDArray relies on calling other NDArray's methods. If the code only create NDArray but not calling any operators, the NDArray won't be closed
The test code actually doesn't really work:

mapSize() doesn't work as expected, when GC happened, the size won't be updated
checkQueue() is not actually called, it triggered because the code manually invoked mapSize(), this won't happen in real world.

One workaround could be adding a NDManager.gc() function and let user manually call it when needed, it scans the current threads orphan NDArrays and close them. But I personally doesn't like NDManager.gc() solution. A better alternative would be implement NDScope class:
try (NDScope scope = new NDScope()) {
     // Create NDArrays
} // NDArrays created in this scope will be closed automatically

The test code actually doesn't really work:
1. mapSize() doesn't work as expected, when GC happened, the size won't be updated
2. checkQueue() is not actually called, it triggered because the code manually invoked mapSize(), this won't happen in real world.

Looks like you looked at ai.djl.pytorch.integration.gc.Main. This Class was actually just a very basic smoke test for me when setting up the solution initially. I would rather delete it from this PR and set up a test suite https://github.com/deepjavalibrary/djl/issues/2290  following the tests in https://github.com/deepjavalibrary/djl/issues/2210.
However, the ai.djl.pytorch.integration.gc.Main still works as expected for me:
When I run it I see
> Task :engines:pytorch:pytorch-engine:Main.main()
[main] INFO ai.djl.pytorch.engine.PtEngine - Number of inter-op threads is 8
[main] INFO ai.djl.pytorch.engine.PtEngine - Number of intra-op threads is 8
[main] INFO ai.djl.pytorch.integration.gc.Main - number of NDArrays in NDManager hierarchy 3
[main] INFO ai.djl.pytorch.integration.gc.Main - number of NDArrays in map used of gc triggered NDArray closing 3
[main] INFO ai.djl.pytorch.integration.gc.Main - reference exists ...
[main] INFO ai.djl.pytorch.integration.gc.Main - weakHashMap size: 3
[main] INFO ai.djl.pytorch.integration.gc.Main - no reference exists, but likely not yet garbage collected ...
[main] INFO ai.djl.pytorch.integration.gc.Main - weakHashMap size: 3
\--- NDManager(e8ac5d45a276, gpu(0)) resource count: 1
    \--- NDManager(e847df9e9799, gpu(0)) resource count: 1
        \--- NDManager(db5ef3d00e38, gpu(0)) resource count: 3
            \--- NDArray(2057224517712, Shape(1))
            \--- NDArray(2057224517184, Shape(1))
            \--- NDArray(2057224517632, Shape(1))
[main] INFO ai.djl.pytorch.integration.gc.Main - no reference exists, and likely garbage collected ...
[main] INFO ai.djl.pytorch.integration.gc.Main - weakHashMap size: 0
\--- NDManager(e8ac5d45a276, gpu(0)) resource count: 1
    \--- NDManager(e847df9e9799, gpu(0)) resource count: 1
        \--- NDManager(db5ef3d00e38, gpu(0)) resource count: 0
\--- NDManager(e8ac5d45a276, gpu(0)) resource count: 1
    \--- NDManager(e847df9e9799, gpu(0)) resource count: 0
\--- NDManager(e8ac5d45a276, gpu(0)) resource count: 0

This test starts creating three NDArrays a,b,c. Because SwitchGarbageCollection.on(); the PtNDArrayImpl are wrapped with a dynamic proxy. The user references are actually to the dynamic proxy but the NDManager holds the  PtNDArrayImpl. -> weakHashMap size: 3
When a,b,c are no longer referenced the dynamic proxies and the uid key are ready to be garbage collected. However, we need to wait for the next minor GC. Therefore still -> weakHashMap size: 3
To see a GC we do something we would not do in an application, we encourage GC and wait for 1 s.  And in this case checkQueue got three messages from GC and closes the corresponding NDArrays.  -> weakHashMap size: 0
I completely agree that calling checkQueue from size() in this example is something that would not happen in real life.
If I find time today I will set up an example for the testsuite.
For me, SwitchGarbageCollection.on(); makes a huge, positive difference in the application I run.

...
1. clean up NDArray relies on calling other NDArray's methods. If the code only create NDArray but not calling any operators, the NDArray won't be closed

One workaround could be adding a NDManager.gc() function and let user manually call it when needed, it scans the current thread's orphan NDArrays and close them. But I personally don't like NDManager.gc() solution. A better alternative would be implement NDScope class:
try (NDScope scope = new NDScope()) {
     // Create NDArrays
} // NDArrays created in this scope will be closed automatically

If SwitchGarbageCollection.on(); is not called there could be NDArrays that are not closed: a leak. If you suffer from such a situation SwitchGarbageCollection.on(); could help by getting rid of the leaked NDArrays. I agree that the suggested solution relys on a method call to an NDArray on the same thread to do any cleanup. As you suggested one could complement this 'automatic process' with a manual trigger that the user may call in case the 'automatic trigger' does not apply. I could add a suggestion for your NDManager.gc().
Do you think that the NDScope approach works together with the GC?

I added a method gc() to NDManager that explicitly calls checkQueue on WeakHashMapWrapper. Just to show this function, I added a small Main2 corresponding to Main. Both classes should be deleted. A test suite https://github.com/deepjavalibrary/djl/issues/2290 should provide realistic test cases.

As a starting point for a test suite https://github.com/deepjavalibrary/djl/issues/2290  I pasted some examples from the DJL Docs into
git clone https://github.com/enpasos/djlperformancetesting.git

and tested for duration and memory:

I thought about your

A better alternative would be implement NDScope class:
try (NDScope scope = new NDScope()) {
     // Create NDArrays
} // NDArrays created in this scope will be closed automatically

I think you could have this approach in principle without GC and without NDManager hierarchy.
You could add a mechanism to move an object from one NDScope to another enclosing or nested NDScope.
You could have full control over the lifecycle of the NDArray's part that lives on the devices.
One price you pay for this would be the clinch with the variable scope in Java. Suppose you have a long-lived variable and in an NDScope you create a new NDArray that is automatically attached to the variable while you are doing a calculation where you think of the value of the variable rather than the object. When you exit the NDScope, this new NDArray is closed, the Java object NDArray still exists, and the variable points to it. The next time you use the variable, where you want to work with the value, you get the equivalent to a NullPointerException. The compiler would not help you to find such errors. Maybe it is still better than getting memory leaks in running applications.

@enpasos

I don't like indeterministic behavior, it gives developer false impression that it works like GC
NDManager.gc() only looks better to me, but it also a bit misleading, it only works for current thread, need document the behavior
NDScope can have nested NDScope, the behavior has been implemented in Javacpp's PointerScope and it works pretty nice
NDScope can be combined with NDManager hierarchy
However NDScope is kind of redundant with NDManager.gc() solution, they can co-exist, but will cause confusion.

@frankfliu Thx a lot for looking into this option. I totally agree that deterministic behavior is very desirable.

I am closing this PR in favour of the deterministic solution #2321.


Use GitHub-flavored Markdown as the output from Pandoc

Per Pandoc's docs^1

Pandoc’s parsers can exhibit pathological performance on some corner
cases. It is wise to put any pandoc operations under a timeout, to avoid
DOS attacks that exploit these issues. If you are using the pandoc
executable, you can add the command line options +RTS -M512M -RTS (for
example) to limit the heap size to 512MB. Note that the commonmark
parser (including commonmark_x and gfm) is much less vulnerable to
pathological performance than the markdown parser, so it is a better
choice when processing untrusted input.

Closing this as we're going to move away from relying on PandocRuby (#4427)


Allow waiting for requests to finish before shutting down

Is your feature request related to a problem? Please describe.
I'm experimenting with running static-web-server on Kubernetes. The issue I'm having is, whenever I deploy a new version of the container running static-web-server, some of the HTTP requests made during the deployment are failing. Peeking through the code, it seems that the server doesn't wait for existing requests to complete when it receives the termination signal. I suspect that this is what's causing the issue.
Describe the solution you'd like
I'd be nice if the server waited for the existing requests to finish before shutting down. If this behavior is not desirable as default, it could be toggled with some configuration option (e.g. SERVER_GRACEFUL_SHUTDOWN, or maybe SERVER_SHUTDOWN_TIMEOUT).
Describe alternatives you've considered
I was able to workaround the issue by adding a 5 seconds delay before the TERM signal is actually sent to the server. It seems to work, but feels hackish.

Released on v2.2.0


first changes to histogram

add functions to the histogram

Hi @YuvalPyramid, I'm your friendly neighborhood Microsoft Pull Request Bot (You can call me MSBOT). Thanks for your contribution!

In order for us to evaluate and accept your PR, we ask that you sign a contribution license agreement. It's all electronic and will take just minutes. I promise there's no faxing. https://cla.microsoft.com.

TTYL, MSBOT;

@YuvalPyramid, Thanks for signing the contribution license agreement so quickly! Actual humans will now validate the agreement and then evaluate the PR.
Thanks, MSBOT;


get_flights doesn't retrieve data

Describe the bug
When I use get_flights method doesn't retry any flight that it does before
To Reproduce
flights = fr_api.get_flights()
Expected behavior
A list of flight
Screenshots

System (please complete the following information):

OS: windows 10
Python Version 3.9 64bit

Did you set any bounds or any config for the fr_api object? I ran tests again and it's working.

Yes, i use bounds and without bounds for testing datas:

fr_api = FlightRadar24API()

The URL the package uses to get flights is https://data-cloud.flightradar24.com/zones/fcgi/feed.js. Maybe you are using a old version of the FlightRadarAPI?

you was right, i updated few days ago but for some reason it dowsn't i uninstalled and installed and now it works. THanks so much and sorry for the non-issue


Default worker.childopts in topology settings should be -Xmx 1024mb _JAAS_PLACEHOLDER

@harshach
Could we just change worker.childopts to topology.worker.childopts? Do we have use case for overriding cluster configuration?
Otherwise we can even get the value of worker.childopts from Storm cluster configuration when opening topology config like component bundle hint.
@shahsank3t
Is it possible to get hints for topology configuration for UI perspective?

In addition, hard-coding _JAAS_PLACEHOLDER would not work with non-Ambari Storm cluster.

@HeartSaVioR agree on changing worker.childopts to topology.worker.childopts

@harshach what hints are we talking about?

@harshach
OK. Maybe need to check topology.worker.childopts overrides -Xmx setting. Will check and comment.
@shahsank3t
We have config field worker.childopts for topology config, and we can get default value from Storm cluster configuration. Hence would like to see possibility of applying component bundle hint for topology config.

@HeartSaVioR @harshach
Yes, the backend can pass the data inside "api/v1/catalog/clusters/:clusterId/services/storm/topologies" into hints:{} block and I'll make the relevant changes on the UI to read and set them.

@HeartSaVioR  Just make sure you pass the exact fieldName into hints as mentioned into storm-topology-component.json.
Like: https://github.com/hortonworks/streamline/blob/master/bootstrap/components/topology/storm-topology-component.json?short_path=329ca57#L36

@harshach
Putting -Xmx2g in topology.worker.childopts takes precedence over -Xmx768m in worker.childopts since it's placed later. The order of priority is in fact not guaranteed for all of JVMs, but seems like recent JVMs follow this approach.
I'll just create a patch around changing worker.childopts to topology.worker.childopts but I'm also open to make change with keep it as worker.childopts and provide hint value.
@shahsank3t
Let's wait for decision before working on this. Btw, providing principal to topology config is already done in secured cluster hence we already provide hint for topology config, right?

#656 for changing worker.childopts option to topology.worker.childopts

@HeartSaVioR whichever is easier and faster. I am ok with both.

@harshach OK then let's apply #656 for now.

@harshach
Since #656 is merged, let's close this.


Weather Underground no longer provides API keys

To improve our services and enhance our relationship with our users, we will no longer provide free weather API keys as part of our program. If you have been directed to download our Weather Underground free API key by a third party provider, please contact your vendor for resolution.

Source :  https://www.wunderground.com/weather/api/

Removed all instances of wunderground and cut it from the options menu.


[bug]: SDXL Lightning model installs as VAE

Is there an existing issue for this problem?

[X] I have searched the existing issues

Operating system
Windows
GPU vendor
Nvidia (CUDA)
GPU model
RTX 3090
GPU VRAM
24gb
Version number
4.2.4
Browser
Firefox 127
Python dependencies
No response
What happened
Invoke installs this model as a VAE instead of an sdxl lightning checkpoint.
What you expected to happen
Expected to install as any other sdxl checkpoint
How to reproduce the problem
Install the model
Additional context
This was reproduced by another member in the discord and so far has only seemed to be an issue with this particular model.
Discord username
No response

I'll get to this in another couple of days -- have other issues to deal with first!

Same also happens with this.
In 4.0.4 it was even worse because somehow it was identified as a sd-1 vae


Eliminate lazy_static

Just a little cleanup.

const Mutex::new requires Rust 1.63

Thanks for the PR!
I like this change, but I don't think it's worth bumping the MSRV so aggressively. 1.65 was released on Nov. 3, so a little over a month ago. Just doesn't have a formal MSRV policy, but I think I'd like to support at least the last couple of Rust releases.

It could be 1.63.

I'm rethinking this. I've tried to be conservative with my MSRV policy, but I don't have a super clear memory for why. I think I want to revisit the reasons for that conservatism, come up with a concrete policy (e.g. support last two Rust releases) and then we can figure out hat new policy allows merging this. Hang tight!

I would think MSRV doesn't matter much since this isn't a library?

Just is packaged for a number of distros, and if their version of rust lags behind Just's MSRV, they won't be able to package it, and users won't be able to build it from source. I'm not sure if this is a problem in practice though.


Swapping between different "noises" plays a bit of previous sound before starting

New sound doesn't play immediately as if the buffer hasn't been cleared ;)

This should be fixed in https://github.com/ryanbaer/silencio/commit/071562adb960588a7cf05b471235f74945a38eba


fix: improve schedule lock entry cc query to prevent spam

Fixes: #3077

Pull Request Test Coverage Report for Build<PHONE_NUMBER>

0 of 55 (0.0%)  changed or added relevant lines in 1 file are covered.
No unchanged relevant lines lost coverage.
Overall coverage decreased (-0.03%) to 23.047%

Changes Missing Coverage
Covered Lines
Changed/Added Lines
%

lib/ZwaveClient.ts
0
55
0.0%

Totals

Change from base Build<PHONE_NUMBER>:
-0.03%

Covered Lines:
3819

Relevant Lines:
17511

💛  - Coveralls

TODOs:

[ ] Filter years from now
[ ] Fix typo in duration
[ ] Allow to cancel query
[ ] Lock get schedule call
[ ] Only refresh a single mode
[ ] Do not show not supported modes
[ ] Use v-timepicker for duration
[ ] cc @AlCalzone

I also added methods to get slots from cache


Technical/Refactor Server, test helpers

[x] Updated Server methods comments
[x] Updated createNotEmptyMessage() helper function

Codecov Report

Merging #130 (bed7a55) into develop (2b0dfc1) will not change coverage.
The diff coverage is n/a.

@@            Coverage Diff            @@
##           develop      #130   +/-   ##
=========================================
  Coverage   100.00%   100.00%
=========================================
  Files           16        16
  Lines          790       790
=========================================
  Hits           790       790

Impacted Files
Coverage Δ

server.go
100.00% <ø> (ø)

:mega: We’re building smart automated test selection to slash your CI/CD build times. Learn more


SEP debug ignoring source set breakpoints

Type: Bug
SEP debug ignoring source set activated breakpoints and not allowing to set new breakpoints in the "Listing" tab. Either this is a bug or I'm missing some setting to get SEP debug to stop at activated defined breakpoints and/or not allowing new breakpoints in the "Listing" tab when running a program with a SEP defined .
 If you are talking about the issue that we cannot set line breakpoints in a *LIST source, then this issue is not SEP specific. It also applies to batch debug. The real cause for the problem is that the LISTING editor does not support source breakpoint by default. Please check the following setting to allow source breakpoint in LISTING editor:
Allow setting breakpoints in any file under Debug > Allow Breakpoints Everywhere

We can set source breakpoints in LISTING source after checking the above setting:


Segmentation fault copy image into the tensor

Hello,
i am getting an error when i want to build the project in the qt creator (cmake).

Hi, Could you kindly check your model input and Input data?

I downloaded another model and it worked. Apparently my model is faulty. Thanks


Update formatting after dartfmt change

Feel free to squash/merge and delete the branch if you're happy


[FLINK-4148]  incorrect calculation minDist distance in QuadTree

Thanks for contributing to Apache Flink. Before you open your pull request, please take the following check list into consideration.
If your changes take all of the items into account, feel free to open your pull request. For more information and/or questions please refer to the How To Contribute guide.
In addition to going through the list, please provide a meaningful description of your changes.

[x] General

The pull request references the related JIRA issue ("[FLINK-XXX] Jira title text")
The pull request addresses only one issue
Each commit in the PR has a meaningful commit message (including the JIRA id)

[x] Documentation

Documentation has been added for new functionality
Old documentation affected by the pull request has been updated
JavaDoc for public methods has been added

[x] Tests & Build

Functionality added by the pull request is covered by tests
mvn clean verify has been executed successfully locally or a Travis build has passed

Hi @xhumanoid , thanks for the PR. Could you please check the Failure messages and fix the build? Can help review once the PR is cleanly mergable.

slave was killed without any notifications:
ERROR: Maven JVM terminated unexpectedly with exit code 137
Putting comment on the pull request
Finished: FAILURE

Seems good to me. @zentol do you have time to add some extra review on this?

I'm sorry, I completely forgot about this one. I will merge it with the next batch.

Looks good, please merge. Should have been fixed long ago :-)


createInvite recycling links instead of creating new ones

Please describe the problem you are having in as much detail as possible:
I wanted to have my bot create single-use invite links to my server to a specific channel.
If I go to Server Settings -> Invites, and there are no valid invite links for this channel, the bot does what it's supposed to and creates an invite link for the channel, specified with an options object. However, if I tell the bot to create another invite link, while the first one is still valid/active, it will not create a new invite link and it will just recycle and send the existing one instead.
I'm not quite sure whether this is intentional or not. While this behavior might be desirable in some situations, it certainly isn't in this one. I need the bot to create unique single-use codes every time the corresponding command is called and then send them to whichever server member that's requesting an invite for their friend.
Include a reproducible code sample here, if possible:
var options = {
  maxAge: 3600,
  maxUses: 1
};
if (user != undefined)
  var invite = rulesChannel.createInvite(options).then(function(newInvite){
    user.send("https://discord.gg/" + newInvite.code)
    });

Further details:

discord.js version: 11.1.0
node.js version: 6.11.2
Operating system: Win10 x64
Priority this issue should have – please be realistic and elaborate if possible:
Medium, I would say. I can't really use the createInvite method if it cannot reliably create unique invite codes every time I need one.

You can pass a third option called unique and set the boolean to true to not recycle links.

Oh, this is actually only partially true. We didn't backport that feature to 11.1-dev yet.
Currently its only possible to do that in master, which is probably not desirable for you to switch to.
I'll get this on the backport list.

Fixed in 1fe201ae


[docs]: fix article "Run a Pipeline"

Description
Article Run a Pipeline needs to be updated, more details @ #855
Issue List

[ ] Guide the user to click Resource Name

Steps below needs to be fixed accordingly

1. Click DETAILS on the network rule you want to run a pipeline

[ ] Guide the user to use Tabs

Steps below needs to be fixed accordingly

1. On the upper-right corner of the network rule details view, click SETTINGS
1. Use the drop-down menu to choose PIPELINES, to see a list of existing Pipelines

[ ] Update action code to lowercase

❌ Wait for the action Network-rule:Deploy to be completed
✅ Wait for the action network-rule:deploy to be completed

@thlmenezes can you assign this to me?


update packages

:white_check_mark: Build TheIdServer 2.3.1-fix-dependencies1-0037 completed (commit https://github.com/Aguafrommars/TheIdServer/commit/2fa09f2d47 by @)


Shady adds a ton of comments to head

Using many components in an app adds a lot of needless comments to the <head>.

Do we need to add these? Would be cool to remove as a nice microperf opt and DOM cleanup.

These appear to be a placeholder so any CSS can be appended to the DOM in the correct order (always after its associated comment).
Maybe we could instead keep ordering state in memory rather than DOM.


Update documentation

Update the README to reflect recent changes to the preference names as well as reference the JSON configuration file instead of launch agent.

Thanks!


feat: Add persistent SQLite database

I've used sqlx purely as we are familiar with it already. Otherwise, it's a bit of a pain
to use an async database here - a sync one would be much easier (due to frb
async boilerplate and runtime cost).
Database is managed for the lifetime of the app by the ten_ten_one library,
after being initialised with db::init_db() call.
Database in empty for now, but initialising and acquiring a connection works for
both maker and taker.
Note: There's no need to manually close connections to the DB, because we are
only storing a ConnectionPool, and the connections are closed with RAII when
they get out scope.

bors r+


docs: update ci with storybook axe testing

Addition of @storybook/addon-a11y on Storybook UI.

Merged with playwright.
https://github.com/ogcio/ogcio-ds/pull/222


git editor breakage

either make vim work (which is the default editor)

or

figure out how to set atom as the default editor and make it work.

vim seems to work in the latest version


[Sample] Support WebNN and Polyfill switch in one page

@fujunwei, @BruceDai, PTAL, thanks!

LGTM, thanks.

Merge it.


PR buttons are the wrong color

I need more time to decide whether I like them or not, but the solution will probably be making the grey a shade of the really dark blue I am using for the foregrounds


failed propType:invalid props.style key tintColor supplied to Text

I use the react-native-tab-navigator, like this:
let home = 'home';
let home_renderIcon = (<Icon name="home" size={20} color='#666' />);
let home_renderSelectIcon = (<Icon name="home" size={20} color="#EB5424" />);

      <TabNavigator.Item
        selected={this.state.selectedTab === selectedTab}
        title={title}
        renderIcon={() => home_renderIcon}
        renderSelectIcon={() => home_renderSelectIcon}
        renderBadge={() => this._renderBadge(badgeCount)}
        onPress={() => this.setState({selectedTab: selectedTab})}
      >
        {childView}
      </TabNavigator.Item>

then i got the warning:
Warning: Failed propType:Invalid prps.style key `tintColor` supplied to `Text`.

how can I solve it?

That's a bug in the react-native-tab-navigator module. Related issue: https://github.com/exponentjs/react-native-tab-navigator/issues/68

thank you! 😃

Hi @oblador , I have this issue, and I would like to solve this problem but when I'm searching, I found your comments and closed issues. I have some questions about this issue.
First of all, why you closed this issue before solved?
Second questions is that it's not related with react-native-tab-navigation because I tried with react-native elements and I didn't face this issue. I think its mean that it's not related with react-navigation but there is a strange things like react-native-elements documentary says that "The icon sets in React Native Elements are made possible through react-native-vector-icons.". What is the problem? I will share with you a screen how can i solve this with react-native elements.


Paint.net Fail

Bug Report
Package Name: Paint.Net
Current Behaviour
Install Fails
Expected Behaviour
Install Paint.net
Additional context/output
Installing 'paint.net' (4.3.4) [64bit]
The remote server returned an error: (404) Not Found.
URL https://github.com/paintdotnet/release/releases/download/v4.3.4/paint.net.4.3.4.portable.x64.zip is not valid
Possible Solution

I think it just needs to be updated to the 4.3.7
System details
Windows version: 10
OS architecture: 64bit
PowerShell version:
Major  Minor  Build  Revision

5      1      19041  1320
Additional software: [(optional) e.g. ConEmu, Git]
Scoop Configuration

//# Your configuration here

Please make a PR for the update

No I think is due to a failing update on my system


Adapt functional tests to the recent CDN changes

TODO:

[x] Streamline the headers we check
[x] Enable compression tests

@jimaek it seems that the CDN tests are very slow after the CDN change. Not sure if it's related to the compression or not hitting the CDN cache? Previously they only took something like 30-35s when we hit the cache.

It's possible they didn't hit the cache for some older versions as we only started serving traffic a few days ago. Did a re-run help? I think they should hit a warm cache after the first test. If not do you have any kind of details like URLs and HTTP headers?

So, apart from the speed, it seems some headers are not present either like x-content-type-options and some others differ.
Please check the run and let me know if I should adapt the tests: https://github.com/MaxCDN/bootstrapcdn/pull/1675/checks?check_run_id=2050460079
Now it'd be a good change to streamline the tests.

Yeah some headers were removed. As for content we use content-type: application/javascript; charset=utf-8
If its different somewhere then its an older version that needs purging from the CDN

You can see the runner's IP in the CI run. Not sure what else we could do to debug this. With SP, it was super fast even if there was no cache hit (but we were missing compression on the first 1-3 requests).

For example the current CI run as we speak is at 5 minutes and only ~half of the tests are run.

I'm also getting font/x-woff for the ATH POP.

I'm also getting font/x-woff for the ATH POP.

Should be fixed now.

You can see the runner's IP in the CI run. Not sure what else we could do to debug this. With SP, it was super fast even if there was no cache hit (but we were missing compression on the first 1-3 requests).
For example the current CI run as we speak is at 5 minutes and only ~half of the tests are run.

Lets move this to a separate issue. Because as part of fixing the tests I had to purge our cache a few times which makes it even harder to debug this issue

I'm still not sure about Accept-Ranges which is present for me, and connection keep-alive which seems to be missing from the origin, otherwise Cloudflare should pass it along.

How about keep-alive? This could theoretically affect performance for http/1.1.
Anyway, I'll wait for this to pass and merge it tomorrow along with your other PR.
The slowness should definitely be investigated because it's a  pretty huge one. Uncached it looks like at least 800% slower. And even cached aprox 200% slower.

How about keep-alive? This could theoretically affect performance for http/1.1. I have no idea what request (which is used for the tests) is using.

Looks like we only have <9% of traffic over HTTP1.1. I dont think its a problem

Anyway, I'll wait for this to pass and merge it tomorrow along with your other PR.
The slowness should definitely be investigated because it's a pretty huge one. Uncached it looks like at least 800% slower. And even cached aprox 200% slower.

I agree, I will look into it

I'm still getting a few local failures (ATH POP)

C:\Users\xmr\Desktop\bootstrapcdn>npm run mocha:only-functional

><EMAIL_ADDRESS>mocha:only-functional C:\Users\xmr\Desktop\bootstrapcdn
> npm run mocha -- --reporter progress ./test/functional_test.js

><EMAIL_ADDRESS>mocha C:\Users\xmr\Desktop\bootstrapcdn
> cross-env NODE_ENV=test ENABLE_CRAWLING=true mocha "--reporter" "progress" "./test/functional_test.js"

  [▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬]

  19631 passing (1m)
  4 failing

  1) functional
       cdn/**/*.*
         https://stackpath.bootstrapcdn.com/font-awesome/4.3.0/fonts/fontawesome-webfont.woff2
           does NOT have content-encoding set:
     AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected

+ 'gzip'
- undefined
      at Context.<anonymous> (test\functional_test.js:114:20)
      at processImmediate (internal/timers.js:461:21)

  2) functional
       cdn/**/*.*
         https://stackpath.bootstrapcdn.com/font-awesome/4.3.0/fonts/fontawesome-webfont.woff2
           has content-type:

      AssertionError [ERR_ASSERTION]: Invalid "content-type" for "woff2", expects "font/woff2" but got "font/x-woff"
      + expected - actual

      -font/x-woff
      +font/woff2

      at assertContentType (test\functional_test.js:124:12)
      at Context.<anonymous> (test\functional_test.js:290:21)
      at processImmediate (internal/timers.js:461:21)

  3) functional
       cdn/**/*.*
         https://stackpath.bootstrapcdn.com/font-awesome/4.5.0/fonts/fontawesome-webfont.woff2
           does NOT have content-encoding set:
     AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected

+ 'gzip'
- undefined
      at Context.<anonymous> (test\functional_test.js:114:20)
      at processImmediate (internal/timers.js:461:21)

  4) functional
       cdn/**/*.*
         https://stackpath.bootstrapcdn.com/font-awesome/4.5.0/fonts/fontawesome-webfont.woff2
           has content-type:

      AssertionError [ERR_ASSERTION]: Invalid "content-type" for "woff2", expects "font/woff2" but got "font/x-woff"
      + expected - actual

      -font/x-woff
      +font/woff2

      at assertContentType (test\functional_test.js:124:12)
      at Context.<anonymous> (test\functional_test.js:290:21)
      at processImmediate (internal/timers.js:461:21)

I guess the purge didnt propagate yet. I removed the changes. I think it should be safe to merge

@jimaek I'm still getting the above 4 test failures here on ATH POP.

Those URLs works fine for me but I purged them again

Still the same... Maybe contact Coudflare? I'm hitting the ATH POP. For example:
C:\Users\XhmikosR\Desktop>curl -ILl https://stackpath.bootstrapcdn.com/font-awesome/4.5.0/fonts/fontawesome-webfont.woff2
HTTP/2 200
date: Thu, 11 Mar 2021 10:54:35 GMT
content-type: font/x-woff
content-length: 66624
set-cookie: __cfduid=dfb93c0eb0e4bbc594e538138fb6a45ac1615460075; expires=Sat, 10-Apr-21 10:54:35 GMT; path=/; domain=.bootstrapcdn.com; HttpOnly; SameSite=Lax
cdn-pullzone: 252412
cdn-uid: b1941f61-b576-4f40-80de-5677acb38f74
cdn-requestcountrycode: IT
cdn-edgestorageid: 722
cdn-edgestorageid: 617
cdn-edgestorageid: 617
cdn-edgestorageid: 617
cdn-edgestorageid: 617
last-modified: Mon, 25 Jan 2021 22:04:54 GMT
cdn-cachedat: 2021-03-10 20:26:22
cdn-requestpullsuccess: True
cdn-requestpullcode: 200
cache-control: public, max-age=31919000
timing-allow-origin: *
cross-origin-resource-policy: cross-origin
access-control-allow-origin: *
x-content-type-options: nosniff
cdn-requestid: 4e132af6f1b1447346ca070d01016c80
cdn-cache: HIT
cf-cache-status: HIT
age: 74
accept-ranges: bytes
cf-request-id: 08c285a1810000fd6a41a88000000001
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security: max-age=31536000; includeSubDomains; preload
server: cloudflare
cf-ray: 62e43ee26ac3fd6a-ATH
alt-svc: h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400

Plus the above 3 files