diff --git a/website/app.vue b/website/app.vue index 99893e0..26623e5 100644 --- a/website/app.vue +++ b/website/app.vue @@ -1,5 +1,33 @@ + + diff --git a/website/components/Content.vue b/website/components/Content.vue new file mode 100644 index 0000000..22c3bdc --- /dev/null +++ b/website/components/Content.vue @@ -0,0 +1,7 @@ + diff --git a/website/components/Sidebar.vue b/website/components/Sidebar.vue new file mode 100644 index 0000000..ea5fa2f --- /dev/null +++ b/website/components/Sidebar.vue @@ -0,0 +1,15 @@ + diff --git a/website/components/sections/Heading.vue b/website/components/sections/Heading.vue new file mode 100644 index 0000000..a75cb0f --- /dev/null +++ b/website/components/sections/Heading.vue @@ -0,0 +1,10 @@ + diff --git a/website/components/sections/Projects.vue b/website/components/sections/Projects.vue new file mode 100644 index 0000000..7654d97 --- /dev/null +++ b/website/components/sections/Projects.vue @@ -0,0 +1,15 @@ + diff --git a/website/components/sections/Skills.vue b/website/components/sections/Skills.vue new file mode 100644 index 0000000..c53c870 --- /dev/null +++ b/website/components/sections/Skills.vue @@ -0,0 +1,12 @@ + diff --git a/website/nuxt.config.ts b/website/nuxt.config.ts index e0354df..ba97230 100644 --- a/website/nuxt.config.ts +++ b/website/nuxt.config.ts @@ -3,6 +3,10 @@ export default defineNuxtConfig({ devtools: { enabled: true }, modules: [ '@nuxtjs/tailwindcss', - '@nuxtjs/i18n', ], + router: { + options: { + scrollBehaviorType: 'smooth', + }, + }, }) diff --git a/website/package.json b/website/package.json index cfc0c8f..cfd2c53 100644 --- a/website/package.json +++ b/website/package.json @@ -11,7 +11,6 @@ }, "devDependencies": { "@nuxt/devtools": "latest", - "@nuxtjs/i18n": "^7.3.1", "@nuxtjs/tailwindcss": "^6.9.5", "nuxt": "^3.8.1", "vue": "^3.3.8", diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml index 99748fb..56bc898 100644 --- a/website/pnpm-lock.yaml +++ b/website/pnpm-lock.yaml @@ -3,10 +3,7 @@ lockfileVersion: '6.0' devDependencies: '@nuxt/devtools': specifier: latest - version: 1.0.2(nuxt@3.8.1)(vite@4.5.0) - '@nuxtjs/i18n': - specifier: ^7.3.1 - version: 7.3.1(vue@3.3.8) + version: 1.0.3(nuxt@3.8.1)(vite@4.5.0) '@nuxtjs/tailwindcss': specifier: ^6.9.5 version: 6.9.5(webpack@5.89.0) @@ -815,27 +812,6 @@ packages: engines: {node: '>=14'} dev: true - /@intlify/shared@9.7.0: - resolution: {integrity: sha512-PUkEuk//YKu4CHS5ah3mNa3XL/+TZj6rAY/6yYN+GCNFd2u+uWUkeuwE4Q6t8dydRWlErOePHHS0KyNoof/oBw==} - engines: {node: '>= 16'} - dev: true - - /@intlify/vue-i18n-extensions@1.0.2: - resolution: {integrity: sha512-rnfA0ScyBXyp9xsSD4EAMGeOh1yv/AE7fhqdAdSOr5X8N39azz257umfRtzNT9sHXAKSSzpCVhIbMAkp5c/gjQ==} - engines: {node: '>= 10.0'} - dependencies: - '@babel/parser': 7.23.3 - dev: true - - /@intlify/vue-i18n-loader@1.1.0: - resolution: {integrity: sha512-9LXiztMtYKTE8t/hRwwGUp+ofrwU0sxLQLzFEOZ38zvn0DonUIQmZUj1cfz5p1Lu8BllxKbCrn6HnsRJ+LYA6g==} - engines: {node: '>= 10'} - dependencies: - '@intlify/shared': 9.7.0 - js-yaml: 3.14.1 - json5: 2.2.3 - dev: true - /@ioredis/commands@1.2.0: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} dev: true @@ -1048,8 +1024,8 @@ packages: resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} dev: true - /@nuxt/devtools-kit@1.0.2(nuxt@3.8.1)(vite@4.5.0): - resolution: {integrity: sha512-iFi54NNCcPsF/jW14HbRlq3aOClOWdfiein0CvKoQ5shobHgn1s3xULh8o9QPKI2oTarcuJL+EFIK43CwfoXyw==} + /@nuxt/devtools-kit@1.0.3(nuxt@3.8.1)(vite@4.5.0): + resolution: {integrity: sha512-a/ZAVmrD5yOfUYhRVfC9afMkczzL8J8zdf0h6QHbTd33rJW/jmjwTn++RTdnbSD2gg2fSBRi/h8y17RmqIdb9g==} peerDependencies: nuxt: ^3.8.1 vite: '*' @@ -1064,8 +1040,8 @@ packages: - supports-color dev: true - /@nuxt/devtools-wizard@1.0.2: - resolution: {integrity: sha512-fY9Y0eCJG7eSuUgnjImWVfLZPZymoHxjrVsdhfKs3yRJvB2siaabluxvdy2OTYc+WpIxuey0hjqpv+dVtnYw1A==} + /@nuxt/devtools-wizard@1.0.3: + resolution: {integrity: sha512-iningPOhBVMYov+7hDX5yr1tAVVA6AmJ7EgRkNfmHqPX2rerhD4eIN7Ao4KwkjGmQJ7qdM7k8w+NiL8OQOpdFQ==} hasBin: true dependencies: consola: 3.2.3 @@ -1080,16 +1056,16 @@ packages: semver: 7.5.4 dev: true - /@nuxt/devtools@1.0.2(nuxt@3.8.1)(vite@4.5.0): - resolution: {integrity: sha512-nfqvRc36Sh20gDVs3pViHvcyyz3NmaNqgJnWUXgfjSCsT7G/p2wHsoNUXYYTF7kpk3kbNusftaWrIzAiTiXC9A==} + /@nuxt/devtools@1.0.3(nuxt@3.8.1)(vite@4.5.0): + resolution: {integrity: sha512-2mXvQiS3KTMF0fO80Y9WLx95yubRoIp2wSCarmhhqInPe8/0K9VZ4TUiTGF20ti45h0ky3OAxiVSmLfViwDWjg==} hasBin: true peerDependencies: nuxt: ^3.8.1 vite: '*' dependencies: '@antfu/utils': 0.7.6 - '@nuxt/devtools-kit': 1.0.2(nuxt@3.8.1)(vite@4.5.0) - '@nuxt/devtools-wizard': 1.0.2 + '@nuxt/devtools-kit': 1.0.3(nuxt@3.8.1)(vite@4.5.0) + '@nuxt/devtools-wizard': 1.0.3 '@nuxt/kit': 3.8.1 birpc: 0.2.14 consola: 3.2.3 @@ -1099,7 +1075,7 @@ packages: fast-glob: 3.3.2 flatted: 3.2.9 get-port-please: 3.1.1 - h3: 1.8.2 + h3: 1.9.0 hookable: 5.5.3 image-meta: 0.2.0 is-installed-globally: 1.0.0 @@ -1118,7 +1094,7 @@ packages: rc9: 2.1.1 scule: 1.1.0 semver: 7.5.4 - simple-git: 3.20.0 + simple-git: 3.21.0 sirv: 2.0.3 unimport: 3.5.0(rollup@3.29.4) vite: 4.5.0 @@ -1239,24 +1215,6 @@ packages: resolution: {integrity: sha512-5gc02Pu1HycOVUWJ8aYsWeeXcSTPe8iX8+KIrhyEtEoOSkY0eMBuo0ssljB8wALuEmepv31DlYe5gpiRwkjESA==} dev: true - /@nuxt/utils@2.17.2: - resolution: {integrity: sha512-vb0U/+I5omMQK6Nb3QlWYeStRhWeGJeR3tEGxc+OZw41T1OgqfRlg32tNBkMDqlNpSRjTKyWjIYGHBoNNrB2SA==} - engines: {node: ^14.18.0 || >=16.10.0} - dependencies: - consola: 3.2.3 - create-require: 1.1.1 - fs-extra: 10.1.0 - hash-sum: 2.0.0 - jiti: 1.21.0 - lodash: 4.17.21 - proper-lockfile: 4.1.2 - semver: 7.5.4 - serialize-javascript: 6.0.1 - signal-exit: 4.1.0 - ua-parser-js: 1.0.37 - ufo: 1.3.2 - dev: true - /@nuxt/vite-builder@3.8.1(vue@3.3.8): resolution: {integrity: sha512-Ot/twGONxj22T9U4bxp771ibKVFlZxIiYDHY/e6mZsE4Blc0efKo6MzPPPo0W4/tXQbtKKEq41uINN3dMI3mag==} engines: {node: ^14.18.0 || >=16.10.0} @@ -1317,28 +1275,6 @@ packages: - vue-tsc dev: true - /@nuxtjs/i18n@7.3.1(vue@3.3.8): - resolution: {integrity: sha512-DZP6xR8zZA1ApcNjLnukH3BhMRCfi3r236epuXVuPWWOObPf5vkp+VamewnPiSU+zs0Age+PbaaIUryFv/6pDA==} - engines: {node: '>=14.16'} - dependencies: - '@babel/parser': 7.23.3 - '@babel/traverse': 7.23.3 - '@intlify/vue-i18n-extensions': 1.0.2 - '@intlify/vue-i18n-loader': 1.1.0 - '@nuxt/utils': 2.17.2 - cookie: 0.5.0 - devalue: 2.0.1 - is-https: 4.0.0 - js-cookie: 3.0.5 - klona: 2.0.6 - lodash.merge: 4.6.2 - ufo: 0.8.6 - vue-i18n: 8.28.2(vue@3.3.8) - transitivePeerDependencies: - - supports-color - - vue - dev: true - /@nuxtjs/tailwindcss@6.9.5(webpack@5.89.0): resolution: {integrity: sha512-Q1jMY06KdK7f6IAL25HFWK0ZhTNaxyl/J0fhX3k0kjKojeflU6AbJTTKeVn9Dhqqt71y1thZqemuZNeJha+RBA==} dependencies: @@ -2261,12 +2197,6 @@ packages: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} dev: true - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true @@ -2723,11 +2653,6 @@ packages: resolution: {integrity: sha512-mWYvfOLrfEc996hlKcdABeIiPHUPC6DM2QYZdGGOvhOTbA3tjm2eBwqlJpoFdjC89NI4Qt6h0Pu06Mp+1Pj5OQ==} dev: true - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: true - /cookies@0.8.0: resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} engines: {node: '>= 0.8'} @@ -3034,10 +2959,6 @@ packages: engines: {node: '>=8'} dev: true - /devalue@2.0.1: - resolution: {integrity: sha512-I2TiqT5iWBEyB8GRfTDP0hiLZ0YeDJZ+upDxjBfOC2lebO5LezQMv7QvIUTzdb64jQyAKLf1AHADtGN+jw6v8Q==} - dev: true - /devalue@4.3.2: resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} dev: true @@ -3266,12 +3187,6 @@ packages: estraverse: 4.3.0 dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -3433,15 +3348,6 @@ packages: engines: {node: '>= 0.6'} dev: true - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true - /fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} @@ -3673,6 +3579,19 @@ packages: unenv: 1.7.4 dev: true + /h3@1.9.0: + resolution: {integrity: sha512-+F3ZqrNV/CFXXfZ2lXBINHi+rM4Xw3CDC5z2CDK3NMPocjonKipGLLDSkrqY9DOrioZNPTIdDMWfQKm//3X2DA==} + dependencies: + cookie-es: 1.0.0 + defu: 6.1.3 + destr: 2.0.2 + iron-webcrypto: 1.0.0 + radix3: 1.1.0 + ufo: 1.3.2 + uncrypto: 0.1.3 + unenv: 1.7.4 + dev: true + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -3989,10 +3908,6 @@ packages: is-extglob: 2.1.1 dev: true - /is-https@4.0.0: - resolution: {integrity: sha512-FeMLiqf8E5g6SdiVJsPcNZX8k4h2fBs1wp5Bb6uaNxn58ufK1axBqQZdmAQsqh0t9BuwFObybrdVJh6MKyPlyg==} - dev: true - /is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -4101,23 +4016,10 @@ packages: hasBin: true dev: true - /js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} - dev: true - /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -4345,10 +4247,6 @@ packages: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - /lodash.pick@4.4.0: resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==} dev: true @@ -4973,7 +4871,7 @@ packages: optional: true dependencies: '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 1.0.2(nuxt@3.8.1)(vite@4.5.0) + '@nuxt/devtools': 1.0.3(nuxt@3.8.1)(vite@4.5.0) '@nuxt/kit': 3.8.1 '@nuxt/schema': 3.8.1 '@nuxt/telemetry': 2.5.2 @@ -5830,14 +5728,6 @@ packages: sisteransi: 1.0.5 dev: true - /proper-lockfile@4.1.2: - resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - dependencies: - graceful-fs: 4.2.11 - retry: 0.12.0 - signal-exit: 3.0.7 - dev: true - /protocols@2.0.1: resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} dev: true @@ -6179,8 +6069,8 @@ packages: - supports-color dev: true - /simple-git@3.20.0: - resolution: {integrity: sha512-ozK8tl2hvLts8ijTs18iFruE+RoqmC/mqZhjs/+V7gS5W68JpJ3+FCTmLVqmR59MaUQ52MfGQuWsIqfsTbbJ0Q==} + /simple-git@3.21.0: + resolution: {integrity: sha512-oTzw9248AF5bDTMk9MrxsRzEzivMlY+DWH0yWS4VYpMhNLhDWnN06pCtaUyPnqv/FpsdeNmRqmZugMABHRPdDA==} dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 @@ -6279,10 +6169,6 @@ packages: resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - /ssri@10.0.5: resolution: {integrity: sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -6645,14 +6531,6 @@ packages: mime-types: 2.1.35 dev: true - /ua-parser-js@1.0.37: - resolution: {integrity: sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==} - dev: true - - /ufo@0.8.6: - resolution: {integrity: sha512-fk6CmUgwKCfX79EzcDQQpSCMxrHstvbLswFChHS0Vump+kFkw7nJBfTZoC1j0bOGoY9I7R3n2DGek5ajbcYnOw==} - dev: true - /ufo@1.3.2: resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} dev: true @@ -7112,14 +6990,6 @@ packages: resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} dev: true - /vue-i18n@8.28.2(vue@3.3.8): - resolution: {integrity: sha512-C5GZjs1tYlAqjwymaaCPDjCyGo10ajUphiwA922jKt9n7KPpqR7oM1PCwYzhB/E7+nT3wfdG3oRre5raIT1rKA==} - peerDependencies: - vue: ^2 - dependencies: - vue: 3.3.8 - dev: true - /vue-router@4.2.5(vue@3.3.8): resolution: {integrity: sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==} peerDependencies: diff --git a/website/public/logo.svg b/website/public/logo.svg new file mode 100644 index 0000000..493b571 --- /dev/null +++ b/website/public/logo.svg @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/website/shell.nix b/website/shell.nix new file mode 100644 index 0000000..d195def --- /dev/null +++ b/website/shell.nix @@ -0,0 +1,10 @@ +let + pkgs = import { }; +in +pkgs.mkShell { + buildInputs = with pkgs; [ + nodejs_18 + nodePackages.pnpm + nodePackages.typescript-language-server + ]; +} diff --git a/website/tailwind.config.js b/website/tailwind.config.js new file mode 100644 index 0000000..82e2e10 --- /dev/null +++ b/website/tailwind.config.js @@ -0,0 +1,35 @@ +export default { + theme: { + extend: { + colors: { + bright: '#f6fbfe', + dark: { + 50: '#19688f', + 100: '#175e82', + 200: '#155575', + 300: '#124b68', + 400: '#10425b', + 500: '#0e394e', + 600: '#0b2f41', + 700: '#092634', + 800: '#071c27', + 900: '#05131a', + 950: '#02090d', + }, + primary: { + 50: '#4dc3ff', + 100: '#3dbeff', + 200: '#2eb9ff', + 300: '#1fb4ff', + 400: '#0fafff', + 500: '#0af', + 600: '#00a0f0', + 700: '#0096e0', + 800: '#008bd1', + 900: '#0081c2', + 950: '#0077b3', + }, + }, + } + } +}