From dfc710184045207da0bc82c6e6563116ab4c280c Mon Sep 17 00:00:00 2001 From: Ben Dichter Date: Sat, 13 Dec 2025 18:26:02 -0500 Subject: [PATCH 01/39] Add how to cite tab --- web/package-lock.json | 18 - web/src/components/DLP/HowToCiteTab.vue | 313 ++++++++++++++++++ .../DandisetLandingView/DandisetActions.vue | 6 - .../DandisetLandingView/DandisetMain.vue | 69 ++-- 4 files changed, 336 insertions(+), 70 deletions(-) create mode 100644 web/src/components/DLP/HowToCiteTab.vue diff --git a/web/package-lock.json b/web/package-lock.json index 6ee446c50..61297104f 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -804,7 +804,6 @@ "resolved": "https://registry.npmjs.org/@json-layout/vocabulary/-/vocabulary-2.1.0.tgz", "integrity": "sha512-5B6jMvxGU9+jONoY7tDVfWuPT9vjyPwz4YHWCtysNwDKaWHnMCv/1JdHH1EcyQXMh4BlXGsSLKmOKo9OtG+Uew==", "license": "MIT", - "peer": true, "dependencies": { "ajv": "^8.17.1", "ajv-errors": "^3.0.0", @@ -1639,7 +1638,6 @@ "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.20.0" } @@ -1699,7 +1697,6 @@ "integrity": "sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.24.0", "@typescript-eslint/types": "8.24.0", @@ -2262,7 +2259,6 @@ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2285,7 +2281,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -3363,7 +3358,6 @@ "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -3424,7 +3418,6 @@ "integrity": "sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "globals": "^13.24.0", @@ -5111,7 +5104,6 @@ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -5124,7 +5116,6 @@ "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.1.tgz", "integrity": "sha512-WXglsDzztOTH6IfcJ99ltYZin2mY8XZCXujkYWVIJlBjqsP6ST7zw+Aarh63E1cDVYeyUcPCxPHzJpEOmzB6Wg==", "license": "MIT", - "peer": true, "dependencies": { "@vue/devtools-api": "^7.7.2" }, @@ -5510,7 +5501,6 @@ "integrity": "sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.6" }, @@ -5623,7 +5613,6 @@ "integrity": "sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -5645,7 +5634,6 @@ "integrity": "sha512-0i+3h2Df/c71afluxC1SXqyyMmJlnKWfu9ZGdzwuKRM1OftEa2XM2myt5tR36CF3PanYrMjFKtRIj8PfSf838w==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "@bufbuild/protobuf": "^2.0.0", "buffer-builder": "^0.2.0", @@ -6861,7 +6849,6 @@ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7170,7 +7157,6 @@ "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", @@ -7260,7 +7246,6 @@ "integrity": "sha512-4wEAQtZaigPpwbFcZbrKpYwutOsWwWdeXn22B9XHzDPQNxVsKT+K9lKcXZnI5JESO1Iaql48S9rOk8RZZEt+Mw==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "@vuetify/loader-shared": "^2.1.0", "debug": "^4.3.3", @@ -7294,7 +7279,6 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.13", "@vue/compiler-sfc": "3.5.13", @@ -7377,7 +7361,6 @@ "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vue/devtools-api": "^6.6.4" }, @@ -7434,7 +7417,6 @@ "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.7.15.tgz", "integrity": "sha512-kBZzwXI5EcAMiW5TRMgK1reXQd0K/PpUt+ekX4Alvm7n09uzJ1my1TLNbX1sQ8/0KYgoxOf17C8qOJzBGkT+PA==", "license": "MIT", - "peer": true, "engines": { "node": "^12.20 || >=14.13" }, diff --git a/web/src/components/DLP/HowToCiteTab.vue b/web/src/components/DLP/HowToCiteTab.vue new file mode 100644 index 000000000..5ce625b9f --- /dev/null +++ b/web/src/components/DLP/HowToCiteTab.vue @@ -0,0 +1,313 @@ + + + + + diff --git a/web/src/views/DandisetLandingView/DandisetActions.vue b/web/src/views/DandisetLandingView/DandisetActions.vue index 2eec4e3f8..ecfeebd2d 100644 --- a/web/src/views/DandisetLandingView/DandisetActions.vue +++ b/web/src/views/DandisetLandingView/DandisetActions.vue @@ -15,11 +15,6 @@ - -
- -
- @@ -115,7 +110,6 @@ import { useDandisetStore } from '@/stores/dandiset'; import { open as openMeditor } from '@/components/Meditor/state'; import DownloadDialog from './DownloadDialog.vue'; -import CiteAsDialog from './CiteAsDialog.vue'; import ShareDialog from './ShareDialog.vue'; import ContactDialog from './ContactDialog.vue'; import ExternalDandisetServicesDialog from './ExternalDandisetServicesDialog.vue'; diff --git a/web/src/views/DandisetLandingView/DandisetMain.vue b/web/src/views/DandisetLandingView/DandisetMain.vue index e946897ab..3b619bb5b 100644 --- a/web/src/views/DandisetLandingView/DandisetMain.vue +++ b/web/src/views/DandisetLandingView/DandisetMain.vue @@ -228,26 +228,26 @@ - + - + + - - - - {{ tab.icon }} - {{ tab.name }} - - --> - + + {{ tab.icon }} + + {{ tab.name }} + + @@ -281,12 +281,8 @@ import { useDandisetStore } from '@/stores/dandiset'; import { getDoiMetadata } from '@/utils/doi'; import type { AccessInformation, DandisetStats, SubjectMatterOfTheDataset } from '@/types'; -import AccessInformationTab from '@/components/DLP/AccessInformationTab.vue'; -import AssetSummaryTab from '@/components/DLP/AssetSummaryTab.vue'; -import ContributorsTab from '@/components/DLP/ContributorsTab.vue'; +import HowToCiteTab from '@/components/DLP/HowToCiteTab.vue'; import OverviewTab from '@/components/DLP/OverviewTab.vue'; -import RelatedResourcesTab from '@/components/DLP/RelatedResourcesTab.vue'; -import SubjectMatterTab from '@/components/DLP/SubjectMatterTab.vue'; import ShareDialog from './ShareDialog.vue'; import StarButton from '@/components/StarButton.vue'; @@ -297,31 +293,12 @@ const tabs = [ { name: 'Overview', component: OverviewTab, + icon: 'mdi-information-outline', }, { - name: 'Contributors', - component: ContributorsTab, - icon: 'mdi-account', - }, - { - name: 'Subject Matter', - component: SubjectMatterTab, - icon: 'mdi-notebook-outline', - }, - { - name: 'Access Information', - component: AccessInformationTab, - icon: 'mdi-account-question', - }, - { - name: 'Asset Summary', - component: AssetSummaryTab, - icon: 'mdi-clipboard-list', - }, - { - name: 'Related Resources', - component: RelatedResourcesTab, - icon: 'mdi-book', + name: 'How to Cite', + component: HowToCiteTab, + icon: 'mdi-format-quote-close', }, ]; From 83b748ed0652054c0f9fac49ecab2887cf8e0701 Mon Sep 17 00:00:00 2001 From: Ben Dichter Date: Sun, 14 Dec 2025 09:23:57 -0500 Subject: [PATCH 02/39] Add warning for citing draft dandisets and remove CiteAsDialog component --- web/src/components/DLP/HowToCiteTab.vue | 11 +++++ .../DandisetLandingView/CiteAsDialog.vue | 46 ------------------- 2 files changed, 11 insertions(+), 46 deletions(-) delete mode 100644 web/src/views/DandisetLandingView/CiteAsDialog.vue diff --git a/web/src/components/DLP/HowToCiteTab.vue b/web/src/components/DLP/HowToCiteTab.vue index 5ce625b9f..29e99158e 100644 --- a/web/src/components/DLP/HowToCiteTab.vue +++ b/web/src/components/DLP/HowToCiteTab.vue @@ -15,6 +15,16 @@ + + Citing draft dandisets is not recommended as the content may change. + Please contact the authors to request publication of this dandiset. + +

To promote reproducibility and give credit to researchers who share their data, please acknowledge the contributors and cite this dataset in your publications. @@ -235,6 +245,7 @@ const props = defineProps({ const store = useDandisetStore(); const currentDandiset = computed(() => store.dandiset); +const isDraft = computed(() => store.version === 'draft'); const citation = computed(() => props.meta?.citation); const doi = computed(() => props.meta?.doi); diff --git a/web/src/views/DandisetLandingView/CiteAsDialog.vue b/web/src/views/DandisetLandingView/CiteAsDialog.vue deleted file mode 100644 index c3f145923..000000000 --- a/web/src/views/DandisetLandingView/CiteAsDialog.vue +++ /dev/null @@ -1,46 +0,0 @@ - - From c0f7c755cd052f08b36d25dbefc360aac4d5e1fd Mon Sep 17 00:00:00 2001 From: Ben Dichter Date: Sun, 14 Dec 2025 09:30:42 -0500 Subject: [PATCH 03/39] Enhance draft citation warnings to include links to the latest published version --- web/src/components/DLP/HowToCiteTab.vue | 30 +++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/web/src/components/DLP/HowToCiteTab.vue b/web/src/components/DLP/HowToCiteTab.vue index 29e99158e..c392e3e02 100644 --- a/web/src/components/DLP/HowToCiteTab.vue +++ b/web/src/components/DLP/HowToCiteTab.vue @@ -16,13 +16,27 @@ Citing draft dandisets is not recommended as the content may change. - Please contact the authors to request publication of this dandiset. + Please cite the + + latest published version ({{ latestPublishedVersion }}) + + instead. + + + + Citing draft dandisets is not recommended as the content may change. + Please contact the authors to request publication of this dandiset before citing.

@@ -246,6 +260,18 @@ const props = defineProps({ const store = useDandisetStore(); const currentDandiset = computed(() => store.dandiset); const isDraft = computed(() => store.version === 'draft'); +const publishedVersions = computed(() => store.publishedVersions); +const hasPublishedVersions = computed(() => publishedVersions.value && publishedVersions.value.length > 0); +const latestPublishedVersion = computed(() => { + if (!publishedVersions.value || publishedVersions.value.length === 0) return null; + // Versions are sorted, so the first one is the latest + return publishedVersions.value[0].version; +}); +const latestPublishedVersionLink = computed(() => { + if (!currentDandiset.value || !latestPublishedVersion.value) return ''; + const { identifier } = currentDandiset.value.dandiset; + return `/dandiset/${identifier}/${latestPublishedVersion.value}`; +}); const citation = computed(() => props.meta?.citation); const doi = computed(() => props.meta?.doi); From 50ba3b056ef520e8b01a7ef07b4c9273bac1676c Mon Sep 17 00:00:00 2001 From: Ben Dichter Date: Mon, 15 Dec 2025 19:48:00 -0500 Subject: [PATCH 04/39] Revert accidental web/package-lock.json changes --- web/package-lock.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/web/package-lock.json b/web/package-lock.json index 61297104f..6ee446c50 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -804,6 +804,7 @@ "resolved": "https://registry.npmjs.org/@json-layout/vocabulary/-/vocabulary-2.1.0.tgz", "integrity": "sha512-5B6jMvxGU9+jONoY7tDVfWuPT9vjyPwz4YHWCtysNwDKaWHnMCv/1JdHH1EcyQXMh4BlXGsSLKmOKo9OtG+Uew==", "license": "MIT", + "peer": true, "dependencies": { "ajv": "^8.17.1", "ajv-errors": "^3.0.0", @@ -1638,6 +1639,7 @@ "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.20.0" } @@ -1697,6 +1699,7 @@ "integrity": "sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.24.0", "@typescript-eslint/types": "8.24.0", @@ -2259,6 +2262,7 @@ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2281,6 +2285,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -3358,6 +3363,7 @@ "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -3418,6 +3424,7 @@ "integrity": "sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "globals": "^13.24.0", @@ -5104,6 +5111,7 @@ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -5116,6 +5124,7 @@ "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.1.tgz", "integrity": "sha512-WXglsDzztOTH6IfcJ99ltYZin2mY8XZCXujkYWVIJlBjqsP6ST7zw+Aarh63E1cDVYeyUcPCxPHzJpEOmzB6Wg==", "license": "MIT", + "peer": true, "dependencies": { "@vue/devtools-api": "^7.7.2" }, @@ -5501,6 +5510,7 @@ "integrity": "sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.6" }, @@ -5613,6 +5623,7 @@ "integrity": "sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -5634,6 +5645,7 @@ "integrity": "sha512-0i+3h2Df/c71afluxC1SXqyyMmJlnKWfu9ZGdzwuKRM1OftEa2XM2myt5tR36CF3PanYrMjFKtRIj8PfSf838w==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@bufbuild/protobuf": "^2.0.0", "buffer-builder": "^0.2.0", @@ -6849,6 +6861,7 @@ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -7157,6 +7170,7 @@ "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "postcss": "^8.5.3", @@ -7246,6 +7260,7 @@ "integrity": "sha512-4wEAQtZaigPpwbFcZbrKpYwutOsWwWdeXn22B9XHzDPQNxVsKT+K9lKcXZnI5JESO1Iaql48S9rOk8RZZEt+Mw==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@vuetify/loader-shared": "^2.1.0", "debug": "^4.3.3", @@ -7279,6 +7294,7 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.13", "@vue/compiler-sfc": "3.5.13", @@ -7361,6 +7377,7 @@ "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vue/devtools-api": "^6.6.4" }, @@ -7417,6 +7434,7 @@ "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.7.15.tgz", "integrity": "sha512-kBZzwXI5EcAMiW5TRMgK1reXQd0K/PpUt+ekX4Alvm7n09uzJ1my1TLNbX1sQ8/0KYgoxOf17C8qOJzBGkT+PA==", "license": "MIT", + "peer": true, "engines": { "node": "^12.20 || >=14.13" }, From 9d7d72b8a813630627dbe29791e4d664851e73bb Mon Sep 17 00:00:00 2001 From: Ben Dichter Date: Tue, 16 Dec 2025 13:43:13 -0500 Subject: [PATCH 05/39] Implement citation format selection and add CFF utility functions for citation generation --- web/src/components/DLP/HowToCiteTab.vue | 157 ++++++- web/src/utils/cff.ts | 579 ++++++++++++++++++++++++ 2 files changed, 715 insertions(+), 21 deletions(-) create mode 100644 web/src/utils/cff.ts diff --git a/web/src/components/DLP/HowToCiteTab.vue b/web/src/components/DLP/HowToCiteTab.vue index c392e3e02..a644c8b13 100644 --- a/web/src/components/DLP/HowToCiteTab.vue +++ b/web/src/components/DLP/HowToCiteTab.vue @@ -51,21 +51,34 @@

-

- Full Citation -

+
+

+ Full Citation +

+ +
- {{ citation }} +
{{ currentCitation }}
+ {{ currentCitation }} mdi-content-copy @@ -221,30 +234,17 @@

- - - -

- More citations available at: - - DOI Citation Formatter - mdi-open-in-new - -