diff --git a/.github/.keepalive b/.github/.keepalive
index 4da375a..587cd45 100644
--- a/.github/.keepalive
+++ b/.github/.keepalive
@@ -1 +1 @@
-2023-12-01T03:31:03.946Z
+2024-01-01T03:02:42.305Z
diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml
index ab56cca..30656c4 100644
--- a/.github/workflows/benchmark.yml
+++ b/.github/workflows/benchmark.yml
@@ -41,15 +41,15 @@ jobs:
 
       # Checkout the repository:
       - name: 'Checkout repository'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
 
       # Install Node.js:
       - name: 'Install Node.js'
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 16
+          node-version: 20
         timeout-minutes: 5
 
       # Install dependencies:
diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index c1c45e7..c92f5c4 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -41,15 +41,15 @@ jobs:
 
       # Checkout repository:
       - name: 'Checkout repository'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
 
       # Install Node.js:
       - name: 'Install Node.js'
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 16
+          node-version: 20
         timeout-minutes: 5
 
       # Install dependencies:
diff --git a/.github/workflows/npm_downloads.yml b/.github/workflows/npm_downloads.yml
index ee8119a..3902505 100644
--- a/.github/workflows/npm_downloads.yml
+++ b/.github/workflows/npm_downloads.yml
@@ -45,8 +45,8 @@ jobs:
     steps:
       # Checkout the repository:
       - name: 'Checkout repository'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
         timeout-minutes: 10
 
       # Install Node.js:
@@ -54,7 +54,7 @@ jobs:
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 16
+          node-version: 20
         timeout-minutes: 5
 
       # Resolve package name:
@@ -102,8 +102,8 @@ jobs:
 
       # Send data to events server:
       - name: 'Post data'
-        # Pin action to full length commit SHA corresponding to v3.0.3:
-        uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629
+        # Pin action to full length commit SHA
+        uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 # v3.0.3
         env:
           webhook_url: ${{ secrets.STDLIB_NPM_DOWNLOADS_URL }}
           webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }}
diff --git a/.github/workflows/productionize.yml b/.github/workflows/productionize.yml
index 6957ebf..96d504a 100644
--- a/.github/workflows/productionize.yml
+++ b/.github/workflows/productionize.yml
@@ -60,8 +60,8 @@ jobs:
     steps:
       # Checkout main branch of repository:
       - name: 'Checkout main branch'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
         with:
           ref: main
 
@@ -70,7 +70,7 @@ jobs:
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 16
+          node-version: 20
         timeout-minutes: 5
 
       # Create production branch:
@@ -133,8 +133,8 @@ jobs:
       # Checkout the repository:
       - name: 'Checkout repository'
         if: ${{ github.event.inputs.require-passing-tests == 'true' }}
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
         with:
           # Use the `production` branch:
           ref: production
@@ -145,7 +145,7 @@ jobs:
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 16
+          node-version: 20
         timeout-minutes: 5
 
       # Install dependencies:
@@ -187,8 +187,8 @@ jobs:
     steps:
       # Checkout the repository:
       - name: 'Checkout repository'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
 
       # Configure git:
       - name: 'Configure git'
@@ -258,7 +258,7 @@ jobs:
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 16
+          node-version: 20
         timeout-minutes: 5
 
       # Install dependencies:
@@ -363,8 +363,8 @@ jobs:
     steps:
       # Checkout the repository:
       - name: 'Checkout repository'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
 
       # Configure git:
       - name: 'Configure git'
@@ -426,7 +426,7 @@ jobs:
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 16
+          node-version: 20
         timeout-minutes: 5
 
       # Install dependencies:
@@ -536,8 +536,8 @@ jobs:
     steps:
       # Checkout the repository:
       - name: 'Checkout repository'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
 
       # Configure git:
       - name: 'Configure git'
@@ -607,7 +607,7 @@ jobs:
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 16
+          node-version: 20
         timeout-minutes: 5
 
       # Install dependencies:
@@ -715,8 +715,8 @@ jobs:
     steps:
       # Checkout the repository:
       - name: 'Checkout repository'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
 
       # Configure git:
       - name: 'Configure git'
@@ -787,7 +787,7 @@ jobs:
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 16
+          node-version: 20
         timeout-minutes: 5
 
       # Install dependencies:
@@ -913,8 +913,8 @@ jobs:
 
       # Checkout the repository:
       - name: 'Checkout repository'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
         with:
           fetch-depth: 2
 
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 8b8977f..1345024 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -61,15 +61,15 @@ jobs:
 
       # Checkout the repository:
       - name: 'Checkout repository'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
 
       # Install Node.js:
       - name: 'Install Node.js'
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 16
+          node-version: 20
         timeout-minutes: 5
 
       # Configure git:
diff --git a/.github/workflows/publish_cli.yml b/.github/workflows/publish_cli.yml
index 8468969..e22245d 100644
--- a/.github/workflows/publish_cli.yml
+++ b/.github/workflows/publish_cli.yml
@@ -61,8 +61,8 @@ jobs:
 
       # Checkout cli branch:
       - name: 'Checkout cli branch'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
         with:
           ref: cli
 
@@ -71,7 +71,7 @@ jobs:
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 16
+          node-version: 20
         timeout-minutes: 5
 
       # Configure git:
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index d1018f5..082b4fd 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -58,15 +58,15 @@ jobs:
 
       # Checkout the repository:
       - name: 'Checkout repository'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
 
       # Install Node.js:
       - name: 'Install Node.js'
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 16
+          node-version: 20
         timeout-minutes: 5
 
       # Install dependencies:
diff --git a/.github/workflows/test_bundles.yml b/.github/workflows/test_bundles.yml
index 0d26143..4c30492 100644
--- a/.github/workflows/test_bundles.yml
+++ b/.github/workflows/test_bundles.yml
@@ -49,8 +49,8 @@ jobs:
     steps:
       # Checkout UMD branch of the repository:
       - name: 'Checkout branch with UMD build'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
         with:
           ref: umd
 
@@ -59,7 +59,7 @@ jobs:
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 17
+          node-version: 20
 
       # Try loading the UMD bundle:
       - name: 'Try loading UMD bundle'
@@ -116,8 +116,8 @@ jobs:
 
       # Checkout ES modules branch of the repository:
       - name: 'Checkout branch with ESM build'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
         with:
           ref: esm
 
@@ -126,7 +126,7 @@ jobs:
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 17
+          node-version: 20
 
       # Try loading the ES module bundle:
       - name: 'Try loading ESM'
@@ -161,8 +161,8 @@ jobs:
 
       # Checkout Deno branch of the repository:
       - name: 'Checkout branch with Deno build'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
         with:
           ref: deno
 
diff --git a/.github/workflows/test_coverage.yml b/.github/workflows/test_coverage.yml
index 5b2b1ea..1b9adfa 100644
--- a/.github/workflows/test_coverage.yml
+++ b/.github/workflows/test_coverage.yml
@@ -46,15 +46,15 @@ jobs:
 
       # Checkout the repository:
       - name: 'Checkout repository'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
 
       # Install Node.js:
       - name: 'Install Node.js'
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 16
+          node-version: 20
         timeout-minutes: 5
 
       # Install dependencies:
@@ -119,8 +119,8 @@ jobs:
 
       # Send data to events server:
       - name: 'Post data'
-        # Pin action to full length commit SHA corresponding to v3.0.3:
-        uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629
+        # Pin action to full length commit SHA
+        uses: distributhor/workflow-webhook@48a40b380ce4593b6a6676528cd005986ae56629 # v3.0.3
         env:
           webhook_url: ${{ secrets.STDLIB_COVERAGE_URL }}
           webhook_secret: ${{ secrets.STDLIB_WEBHOOK_SECRET }}
diff --git a/.github/workflows/test_install.yml b/.github/workflows/test_install.yml
index 0f25ef0..fc3ce47 100644
--- a/.github/workflows/test_install.yml
+++ b/.github/workflows/test_install.yml
@@ -58,15 +58,15 @@ jobs:
 
       # Checkout the repository:
       - name: 'Checkout repository'
-        # Pin action to full length commit SHA corresponding to v4.1.0
-        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
+        # Pin action to full length commit SHA
+        uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
 
       # Install Node.js:
       - name: 'Install Node.js'
         # Pin action to full length commit SHA corresponding to v3.8.1
         uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d
         with:
-          node-version: 16
+          node-version: 20
         timeout-minutes: 5
 
       # Install dependencies:
diff --git a/.npmignore b/.npmignore
index d369eec..5c7f09d 100644
--- a/.npmignore
+++ b/.npmignore
@@ -18,6 +18,7 @@
 
 # Files #
 #########
+CITATION.cff
 CHANGELOG.md
 CODE_OF_CONDUCT.md
 CONTRIBUTING.md
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 188cda8..726c1ec 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -15,6 +15,7 @@ Dorrin Sotoudeh <dorrinsotoudeh123@gmail.com>
 Frank Kovacs <fran70kk@gmail.com>
 Harshita Kalani <harshitakalani02@gmail.com>
 James Gelok <jdgelok@gmail.com>
+Jaysukh Makvana <jaysukhmakvana2004@gmail.com>
 Jithin KS <jithinks112@gmail.com>
 Joey Reed <joeyrreed@gmail.com>
 Jordan Gallivan <115050475+Jordan-Gallivan@users.noreply.github.com>
diff --git a/README.md b/README.md
index 8753531..fd54665 100644
--- a/README.md
+++ b/README.md
@@ -769,7 +769,7 @@ For more information on the project, filing bug reports and feature requests, an
 
 ## Copyright
 
-Copyright &copy; 2016-2023. The Stdlib [Authors][stdlib-authors].
+Copyright &copy; 2016-2024. The Stdlib [Authors][stdlib-authors].
 
 </section>
 
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..9702d4c
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,5 @@
+# Security
+
+> Policy for reporting security vulnerabilities.
+
+See the security policy [in the main project repository](https://github.com/stdlib-js/stdlib/security).
diff --git a/benchmark/benchmark.browser.js b/benchmark/benchmark.browser.js
index 7ca5e2e..9068298 100644
--- a/benchmark/benchmark.browser.js
+++ b/benchmark/benchmark.browser.js
@@ -20,7 +20,7 @@
 
 // MODULES //
 
-var bench = require( '@stdlib/bench' );
+var bench = require( '@stdlib/bench-harness' );
 var isObjectArray = require( '@stdlib/assert-is-plain-object-array' );
 var isObject = require( '@stdlib/assert-is-plain-object' );
 var pkg = require( './../package.json' ).name;
diff --git a/benchmark/benchmark.js b/benchmark/benchmark.js
index adc25af..e797a29 100644
--- a/benchmark/benchmark.js
+++ b/benchmark/benchmark.js
@@ -20,7 +20,7 @@
 
 // MODULES //
 
-var bench = require( '@stdlib/bench' );
+var bench = require( '@stdlib/bench-harness' );
 var IS_BROWSER = require( '@stdlib/assert-is-browser' );
 var isObjectArray = require( '@stdlib/assert-is-plain-object-array' );
 var isObject = require( '@stdlib/assert-is-plain-object' );
diff --git a/package.json b/package.json
index 8f549cc..eb48792 100644
--- a/package.json
+++ b/package.json
@@ -58,13 +58,13 @@
     "@stdlib/assert-is-browser": "^0.1.1",
     "@stdlib/assert-is-plain-object-array": "^0.1.0",
     "@stdlib/assert-is-windows": "^0.1.1",
-    "@stdlib/bench": "^0.2.1",
     "@stdlib/process-exec-path": "^0.1.1",
     "@stdlib/regexp-eol": "^0.1.1",
     "proxyquire": "^2.0.0",
     "tape": "git+https://github.com/kgryte/tape.git#fix/globby",
     "istanbul": "^0.4.1",
-    "tap-min": "git+https://github.com/Planeshifter/tap-min.git"
+    "tap-min": "git+https://github.com/Planeshifter/tap-min.git",
+    "@stdlib/bench-harness": "^0.1.2"
   },
   "engines": {
     "node": ">=0.10.0",