diff --git a/docs/docs/adrs/adr-004-denom-dos-fixes b/docs/docs/adrs/adr-004-denom-dos-fixes.md similarity index 100% rename from docs/docs/adrs/adr-004-denom-dos-fixes rename to docs/docs/adrs/adr-004-denom-dos-fixes.md diff --git a/docs/docs/adrs/adr-template.md b/docs/docs/adrs/adr-template.md index b9e3af1678..6bb23001e6 100644 --- a/docs/docs/adrs/adr-template.md +++ b/docs/docs/adrs/adr-template.md @@ -2,16 +2,16 @@ sidebar_position: 2 title: ADR Template --- -# ADR {ADR-NUMBER}: {TITLE} +# ADR [ADR-NUMBER]: [TITLE] ## Changelog -* {date}: {changelog} +* [date]: [changelog] ## Status > A decision may be "proposed" if it hasn't been agreed upon yet, or "accepted" once it is agreed upon. If a later ADR changes or reverses a decision, it may be marked as "deprecated" or "superseded" with a reference to its replacement. -{Deprecated|Proposed|Accepted} +[Deprecated|Proposed|Accepted] ## Context @@ -38,4 +38,4 @@ If the proposed change will be large, please also indicate a way to do the chang > Are there any relevant PR comments, issues that led up to this, or articles referenced for why we made the given design choice? If so link them here! -* {reference link} +* [references] diff --git a/docs/docs/adrs/intro.md b/docs/docs/adrs/intro.md index 38021f1619..497115e563 100644 --- a/docs/docs/adrs/intro.md +++ b/docs/docs/adrs/intro.md @@ -34,7 +34,7 @@ To suggest an ADR, please make use of the [ADR template](./adr-template.md) prov - [ADR 001: Key Assignment](./adr-001-key-assignment.md) - [ADR 002: Jail Throttling](./adr-002-throttle.md) -- [ADR 004: Denom DOS fixes](./adr-004-denom-dos-fixes) +- [ADR 004: Denom DOS fixes](./adr-004-denom-dos-fixes.md) - [ADR 005: Cryptographic verification of equivocation evidence](./adr-005-cryptographic-equivocation-verification.md) - [ADR 008: Throttle with retries](./adr-008-throttle-retries.md) - [ADR 009: Soft Opt-Out](./adr-009-soft-opt-out.md) diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index c94afa04dc..e9c2b1e75c 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -1,8 +1,10 @@ // @ts-check // Note: type annotations allow type checking and IDEs autocompletion +import remarkMath from "remark-math"; +import rehypeKatex from "rehype-katex"; -const lightCodeTheme = require('prism-react-renderer').themes.github; -const darkCodeTheme = require('prism-react-renderer').themes.dracula; +const lightCodeTheme = require("prism-react-renderer").themes.github; +const darkCodeTheme = require("prism-react-renderer").themes.dracula; /** @type {import('@docusaurus/types').Config} */ const config = { @@ -35,7 +37,7 @@ const config = { /** @type {import('@docusaurus/preset-classic').Options} */ ({ docs: { - sidebarPath: require.resolve('./sidebars.js'), + sidebarPath: require.resolve("./sidebars.js"), routeBasePath: "/", versions: { current: { @@ -43,6 +45,8 @@ const config = { // banner: "current", }, }, + remarkPlugins: [remarkMath], + rehypePlugins: [rehypeKatex], }, theme: { @@ -62,19 +66,19 @@ const config = { }, }, colorMode: { - defaultMode: 'dark', - disableSwitch: true, + defaultMode: "dark", + disableSwitch: false, respectPrefersColorScheme: false, }, navbar: { title: "Interchain Security", hideOnScroll: false, - // logo: { - // alt: "Interchain Security Logo", - // src: "img/logo-sdk.svg", - // href: "/", - // target: "_self", - // }, + logo: { + alt: "Interchain Security Logo", + src: "/img/hub.svg", + href: "/", + target: "_self", + }, items: [ { href: "https://github.com/cosmos/interchain-security", @@ -96,7 +100,7 @@ const config = { { items: [ { - html: `Cosmos Logo`, + html: `Interchain Security Logo`, }, ], }, @@ -164,7 +168,8 @@ const config = { ], }, ], - copyright: "Informal Systems", + copyright: + "The development of Interchain Security is primarily led by Informal Systems. Funding for this development comes primarily from the Interchain Foundation, a Swiss non-profit.", }, prism: { theme: lightCodeTheme, @@ -206,7 +211,7 @@ const config = { toExtensions: ["html"], redirects: [ { - from: ["/", "/main", "/master"], + from: ["/main", "/master"], to: "/", }, ], diff --git a/docs/package-lock.json b/docs/package-lock.json index c2c2bb49aa..baf20cd715 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -21,6 +21,8 @@ "prism-react-renderer": "^2.3.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "rehype-katex": "^7.0.0", + "remark-math": "^6.0.0", "tailwindcss": "^3.3.5" }, "devDependencies": { @@ -3499,6 +3501,11 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, + "node_modules/@types/katex": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==" + }, "node_modules/@types/mdast": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", @@ -6954,6 +6961,52 @@ "node": ">= 0.4" } }, + "node_modules/hast-util-from-dom": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-5.0.0.tgz", + "integrity": "sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==", + "dependencies": { + "@types/hast": "^3.0.0", + "hastscript": "^8.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.1.tgz", + "integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html-isomorphic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-2.0.0.tgz", + "integrity": "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-dom": "^5.0.0", + "hast-util-from-html": "^2.0.0", + "unist-util-remove-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-from-parse5": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", @@ -6973,6 +7026,18 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-parse-selector": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", @@ -7093,6 +7158,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-text": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.0.tgz", + "integrity": "sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-whitespace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", @@ -7983,6 +8063,29 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/katex": { + "version": "0.16.9", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.9.tgz", + "integrity": "sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8413,6 +8516,24 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-math": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-3.0.0.tgz", + "integrity": "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "longest-streak": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.1.0", + "unist-util-remove-position": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-mdx": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", @@ -9162,6 +9283,77 @@ } ] }, + "node_modules/micromark-extension-math": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.0.0.tgz", + "integrity": "sha512-iJ2Q28vBoEovLN5o3GO12CpqorQRYDPT+p4zW50tGwTfJB+iv/VnB6Ini+gqa24K97DwptMBBIvVX6Bjk49oyQ==", + "dependencies": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-math/node_modules/micromark-util-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", + "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-math/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/micromark-extension-mdx-expression": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", @@ -12343,6 +12535,24 @@ "jsesc": "bin/jsesc" } }, + "node_modules/rehype-katex": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-7.0.0.tgz", + "integrity": "sha512-h8FPkGE00r2XKU+/acgqwWUlyzve1IiOKwsEkg4pDL3k48PiE0Pt+/uLtVHDVkN1yA4iurZN6UES8ivHVEQV6Q==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/katex": "^0.16.0", + "hast-util-from-html-isomorphic": "^2.0.0", + "hast-util-to-text": "^4.0.0", + "katex": "^0.16.0", + "unist-util-visit-parents": "^6.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/rehype-raw": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", @@ -12427,6 +12637,21 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-math": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-6.0.0.tgz", + "integrity": "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-math": "^3.0.0", + "micromark-extension-math": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-mdx": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.0.tgz", @@ -14026,6 +14251,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", diff --git a/docs/package.json b/docs/package.json index e3d9566387..45f5ce2823 100644 --- a/docs/package.json +++ b/docs/package.json @@ -27,6 +27,8 @@ "prism-react-renderer": "^2.3.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "rehype-katex": "^7.0.0", + "remark-math": "^6.0.0", "tailwindcss": "^3.3.5" }, "devDependencies": { diff --git a/docs/src/css/base.css b/docs/src/css/base.css index bdc9f13c4a..ee662e6335 100644 --- a/docs/src/css/base.css +++ b/docs/src/css/base.css @@ -9,6 +9,7 @@ -webkit-font-feature-settings: 'kern', 'liga', 'calt', 'zero' 0; text-size-adjust: 100%; -moz-osx-font-smoothing: grayscale; + font-smoothing: antialiased; font-variant-ligatures: contextual common-ligatures; font-kerning: normal; text-rendering: optimizeLegibility; @@ -17,8 +18,8 @@ @apply font-intervar } } - - *, + + *, *::before, *::after { box-sizing: border-box; @@ -26,6 +27,13 @@ } svg { display: inline; } - - ::selection{} -} \ No newline at end of file + + ::selection{ + background-color: var(--ifm-color-primary); + color: white; + } + + &[data-theme="dark"] ::selection{ + color: black; + } +} diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index 3b4f4baea4..1ae22d5ec1 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -38,7 +38,7 @@ --aa-primary-color-rgb: 0, 0, 0; @media screen and (prefers-reduced-motion) { - transition: ; + transition: none; } --ifm-menu-color-background-active: none; --ifm-menu-color-background-hover: none; @@ -79,10 +79,9 @@ html { @apply no-underline w-full text-2; } } - /* MAINNAV */ .navbar { - @apply py-5 h-auto border-b border-b-docusaurusColorBorder shadow-none bg-docusaurusBgColor; + @apply pb-2 pt-5 h-auto border-b border-b-docusaurusColorBorder shadow-none bg-docusaurusBgColor; &__toggle { @apply bg-card rounded-s h-8 w-8 flex justify-center items-center; @media (min-width: 997px) { @@ -244,7 +243,7 @@ html { @apply m-0; } } - + &[data-theme="dark"] .theme-doc-sidebar-menu .menu__list::before { @apply bg-inactiveLight; } @@ -340,6 +339,10 @@ html { .menu__list-item--collapsed .menu__caret:before { transform: rotateZ(0); } + .menu__caret, + li li .menu__link--sublist-caret::after { + @apply hidden; + } /* TOC */ .table-of-contents__link:hover, @@ -360,7 +363,8 @@ html { .pagination-nav { @apply pb-7 mt-9; & > a { - @apply border-stone-200 hover:border-stone-300 hover:shadow-md rounded-sm p-6 col-span-2; + box-shadow: 0px 0px 80px rgba(0, 0, 0, 0.07); + @apply border-transparent rounded pb-8.5 col-span-2 pt-6 px-6 hover:shadow-none; @media (min-width: 997px) { @apply col-span-1; @@ -375,7 +379,7 @@ html { } } &__sublabel { - @apply mb-3.5 text-slate-500 dark:text-docusaurusColorBase text-3; + @apply mb-3.5 text-gray-1000 dark:text-docusaurusColorBase text-3; } &__label { @apply text-4 font-semibold; @@ -384,9 +388,30 @@ html { } /* FOOTER */ + + &[data-theme="light"] { + .footer__title, .footer__link-item, .footer__copyright { + @apply text-white; + } + + .pagination-nav__sublabel { + @apply text-black; + } + } + + &[data-theme="dark"] { + .footer__title, .footer__link-item, .footer__copyright { + @apply text-black; + } + + .pagination-nav__sublabel { + @apply text-white; + } + } + .footer { - background-color: var(--ifm-background-color); - @apply border-t border-t-docusaurusColorBorder pt-10 mb-10; + background-color: var(--ifm-font-color-base); + @apply border-t border-t-docusaurusColorBorder pt-10; &__link-item { @apply hover:underline; } @@ -424,8 +449,6 @@ html { @apply font-jetbrain mt-3; } - - .markdown { --ifm-heading-vertical-rhythm-bottom: 1; --ifm-h1-vertical-rhythm-bottom: 1; @@ -434,10 +457,10 @@ html { @apply mt-7 pb-8 border-b border-b-border; h1 { - @apply text-7 font-bold leading-10 tracking-tight pt-5; + @apply text-7 font-bold leading-10 tracking-tight; } h2 { - @apply text-5 font-bold leading-9 tracking-tight; + @apply text-6 font-bold leading-9 tracking-tight; } h3 { @apply text-4 font-semibold leading-8 tracking-tight; @@ -455,10 +478,10 @@ html { ul, ol, blockquote { - @apply text-[1.2rem]; + @apply text-[1rem]; } code { - @apply border-0 px-3; + @apply border-0 px-3 align-baseline; } blockquote { @apply my-7; @@ -466,6 +489,7 @@ html { a { @apply underline; /* color: var(--ifm-color-primary ); */ + color: var(--ifm-color-primary); } ol, ul { @@ -484,7 +508,7 @@ html { list-style-type: none; counter-reset: item; & > li { - @apply relative pl-8 mb-4; + @apply relative pl-8 mb-5.5; &::before { counter-increment: item; content: counters(item, ".", decimal-leading-zero) "."; @@ -507,11 +531,14 @@ html { @apply my-5; } } + .card-section { + a { + @apply no-underline; + } + } } - .card-section { - a { - @apply no-underline; - } + .main-wrapper { + @apply min-h-screen; } } diff --git a/docs/static/img/hub.svg b/docs/static/img/hub.svg new file mode 100644 index 0000000000..46ace9e4ab --- /dev/null +++ b/docs/static/img/hub.svg @@ -0,0 +1 @@ + \ No newline at end of file