Created
March 30, 2026 08:48
-
-
Save unnitallman/473f6a85e155f5348b41f11fd71681ed to your computer and use it in GitHub Desktop.
NeetoDeploy Rate Limiting Architecture Diagrams
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="0.7.1" preserveAspectRatio="xMinYMin meet" viewBox="0 0 4417 895"><svg class="d2-2448175750 d2-svg" width="4417" height="895" viewBox="-41 -201 4417 895"><rect x="-41.000000" y="-201.000000" width="4417.000000" height="895.000000" rx="0.000000" fill="#1E1E2E" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[ | |
| .d2-2448175750 .text { | |
| font-family: "d2-2448175750-font-regular"; | |
| } | |
| @font-face { | |
| font-family: d2-2448175750-font-regular; | |
| src: url("data:application/font-woff;base64,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"); | |
| } | |
| @font-face { | |
| font-family: d2-2448175750-font-semibold; | |
| src: url("data:application/font-woff;base64,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"); | |
| } | |
| .d2-2448175750 .text-bold { | |
| font-family: "d2-2448175750-font-bold"; | |
| } | |
| @font-face { | |
| font-family: d2-2448175750-font-bold; | |
| src: url("data:application/font-woff;base64,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"); | |
| } | |
| .d2-2448175750 .text-italic { | |
| font-family: "d2-2448175750-font-italic"; | |
| } | |
| @font-face { | |
| font-family: d2-2448175750-font-italic; | |
| src: url("data:application/font-woff;base64,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"); | |
| } | |
| .d2-2448175750 .text-mono { | |
| font-family: "d2-2448175750-font-mono"; | |
| } | |
| @font-face { | |
| font-family: d2-2448175750-font-mono; | |
| src: url("data:application/font-woff;base64,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"); | |
| }]]></style><style type="text/css"><![CDATA[.shape { | |
| shape-rendering: geometricPrecision; | |
| stroke-linejoin: round; | |
| } | |
| .connection { | |
| stroke-linecap: round; | |
| stroke-linejoin: round; | |
| } | |
| .blend { | |
| mix-blend-mode: multiply; | |
| opacity: 0.5; | |
| } | |
| .d2-2448175750 .fill-N1{fill:#CDD6F4;} | |
| .d2-2448175750 .fill-N2{fill:#BAC2DE;} | |
| .d2-2448175750 .fill-N3{fill:#A6ADC8;} | |
| .d2-2448175750 .fill-N4{fill:#585B70;} | |
| .d2-2448175750 .fill-N5{fill:#45475A;} | |
| .d2-2448175750 .fill-N6{fill:#313244;} | |
| .d2-2448175750 .fill-N7{fill:#1E1E2E;} | |
| .d2-2448175750 .fill-B1{fill:#CBA6f7;} | |
| .d2-2448175750 .fill-B2{fill:#CBA6f7;} | |
| .d2-2448175750 .fill-B3{fill:#6C7086;} | |
| .d2-2448175750 .fill-B4{fill:#585B70;} | |
| .d2-2448175750 .fill-B5{fill:#45475A;} | |
| .d2-2448175750 .fill-B6{fill:#313244;} | |
| .d2-2448175750 .fill-AA2{fill:#f38BA8;} | |
| .d2-2448175750 .fill-AA4{fill:#45475A;} | |
| .d2-2448175750 .fill-AA5{fill:#313244;} | |
| .d2-2448175750 .fill-AB4{fill:#45475A;} | |
| .d2-2448175750 .fill-AB5{fill:#313244;} | |
| .d2-2448175750 .stroke-N1{stroke:#CDD6F4;} | |
| .d2-2448175750 .stroke-N2{stroke:#BAC2DE;} | |
| .d2-2448175750 .stroke-N3{stroke:#A6ADC8;} | |
| .d2-2448175750 .stroke-N4{stroke:#585B70;} | |
| .d2-2448175750 .stroke-N5{stroke:#45475A;} | |
| .d2-2448175750 .stroke-N6{stroke:#313244;} | |
| .d2-2448175750 .stroke-N7{stroke:#1E1E2E;} | |
| .d2-2448175750 .stroke-B1{stroke:#CBA6f7;} | |
| .d2-2448175750 .stroke-B2{stroke:#CBA6f7;} | |
| .d2-2448175750 .stroke-B3{stroke:#6C7086;} | |
| .d2-2448175750 .stroke-B4{stroke:#585B70;} | |
| .d2-2448175750 .stroke-B5{stroke:#45475A;} | |
| .d2-2448175750 .stroke-B6{stroke:#313244;} | |
| .d2-2448175750 .stroke-AA2{stroke:#f38BA8;} | |
| .d2-2448175750 .stroke-AA4{stroke:#45475A;} | |
| .d2-2448175750 .stroke-AA5{stroke:#313244;} | |
| .d2-2448175750 .stroke-AB4{stroke:#45475A;} | |
| .d2-2448175750 .stroke-AB5{stroke:#313244;} | |
| .d2-2448175750 .background-color-N1{background-color:#CDD6F4;} | |
| .d2-2448175750 .background-color-N2{background-color:#BAC2DE;} | |
| .d2-2448175750 .background-color-N3{background-color:#A6ADC8;} | |
| .d2-2448175750 .background-color-N4{background-color:#585B70;} | |
| .d2-2448175750 .background-color-N5{background-color:#45475A;} | |
| .d2-2448175750 .background-color-N6{background-color:#313244;} | |
| .d2-2448175750 .background-color-N7{background-color:#1E1E2E;} | |
| .d2-2448175750 .background-color-B1{background-color:#CBA6f7;} | |
| .d2-2448175750 .background-color-B2{background-color:#CBA6f7;} | |
| .d2-2448175750 .background-color-B3{background-color:#6C7086;} | |
| .d2-2448175750 .background-color-B4{background-color:#585B70;} | |
| .d2-2448175750 .background-color-B5{background-color:#45475A;} | |
| .d2-2448175750 .background-color-B6{background-color:#313244;} | |
| .d2-2448175750 .background-color-AA2{background-color:#f38BA8;} | |
| .d2-2448175750 .background-color-AA4{background-color:#45475A;} | |
| .d2-2448175750 .background-color-AA5{background-color:#313244;} | |
| .d2-2448175750 .background-color-AB4{background-color:#45475A;} | |
| .d2-2448175750 .background-color-AB5{background-color:#313244;} | |
| .d2-2448175750 .color-N1{color:#CDD6F4;} | |
| .d2-2448175750 .color-N2{color:#BAC2DE;} | |
| .d2-2448175750 .color-N3{color:#A6ADC8;} | |
| .d2-2448175750 .color-N4{color:#585B70;} | |
| .d2-2448175750 .color-N5{color:#45475A;} | |
| .d2-2448175750 .color-N6{color:#313244;} | |
| .d2-2448175750 .color-N7{color:#1E1E2E;} | |
| .d2-2448175750 .color-B1{color:#CBA6f7;} | |
| .d2-2448175750 .color-B2{color:#CBA6f7;} | |
| .d2-2448175750 .color-B3{color:#6C7086;} | |
| .d2-2448175750 .color-B4{color:#585B70;} | |
| .d2-2448175750 .color-B5{color:#45475A;} | |
| .d2-2448175750 .color-B6{color:#313244;} | |
| .d2-2448175750 .color-AA2{color:#f38BA8;} | |
| .d2-2448175750 .color-AA4{color:#45475A;} | |
| .d2-2448175750 .color-AA5{color:#313244;} | |
| .d2-2448175750 .color-AB4{color:#45475A;} | |
| .d2-2448175750 .color-AB5{color:#313244;}.appendix text.text{fill:#CDD6F4}.md{--color-fg-default:#CDD6F4;--color-fg-muted:#BAC2DE;--color-fg-subtle:#A6ADC8;--color-canvas-default:#1E1E2E;--color-canvas-subtle:#313244;--color-border-default:#CBA6f7;--color-border-muted:#CBA6f7;--color-neutral-muted:#313244;--color-accent-fg:#CBA6f7;--color-accent-emphasis:#CBA6f7;--color-attention-subtle:#BAC2DE;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-normal-d2-2448175750);mix-blend-mode:color-burn}.sketch-overlay-B2{fill:url(#streaks-normal-d2-2448175750);mix-blend-mode:color-burn}.sketch-overlay-B3{fill:url(#streaks-dark-d2-2448175750);mix-blend-mode:overlay}.sketch-overlay-B4{fill:url(#streaks-dark-d2-2448175750);mix-blend-mode:overlay}.sketch-overlay-B5{fill:url(#streaks-darker-d2-2448175750);mix-blend-mode:lighten}.sketch-overlay-B6{fill:url(#streaks-darker-d2-2448175750);mix-blend-mode:lighten}.sketch-overlay-AA2{fill:url(#streaks-normal-d2-2448175750);mix-blend-mode:color-burn}.sketch-overlay-AA4{fill:url(#streaks-darker-d2-2448175750);mix-blend-mode:lighten}.sketch-overlay-AA5{fill:url(#streaks-darker-d2-2448175750);mix-blend-mode:lighten}.sketch-overlay-AB4{fill:url(#streaks-darker-d2-2448175750);mix-blend-mode:lighten}.sketch-overlay-AB5{fill:url(#streaks-darker-d2-2448175750);mix-blend-mode:lighten}.sketch-overlay-N1{fill:url(#streaks-normal-d2-2448175750);mix-blend-mode:color-burn}.sketch-overlay-N2{fill:url(#streaks-normal-d2-2448175750);mix-blend-mode:color-burn}.sketch-overlay-N3{fill:url(#streaks-normal-d2-2448175750);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-dark-d2-2448175750);mix-blend-mode:overlay}.sketch-overlay-N5{fill:url(#streaks-darker-d2-2448175750);mix-blend-mode:lighten}.sketch-overlay-N6{fill:url(#streaks-darker-d2-2448175750);mix-blend-mode:lighten}.sketch-overlay-N7{fill:url(#streaks-darker-d2-2448175750);mix-blend-mode:lighten}.light-code{display: none}.dark-code{display: block}]]></style><style type="text/css">.d2-2448175750 .md em, | |
| .d2-2448175750 .md dfn { | |
| font-family: "d2-2448175750-font-italic"; | |
| } | |
| .d2-2448175750 .md b, | |
| .d2-2448175750 .md strong { | |
| font-family: "d2-2448175750-font-bold"; | |
| } | |
| .d2-2448175750 .md code, | |
| .d2-2448175750 .md kbd, | |
| .d2-2448175750 .md pre, | |
| .d2-2448175750 .md samp { | |
| font-family: "d2-2448175750-font-mono"; | |
| font-size: 1em; | |
| } | |
| .d2-2448175750 .md { | |
| tab-size: 4; | |
| } | |
| /* variables are provided in d2renderers/d2svg/d2svg.go */ | |
| .d2-2448175750 .md { | |
| -ms-text-size-adjust: 100%; | |
| -webkit-text-size-adjust: 100%; | |
| margin: 0; | |
| background-color: transparent; /* we don't want to define the background color */ | |
| font-family: "d2-2448175750-font-regular"; | |
| font-size: 16px; | |
| line-height: 1.5; | |
| word-wrap: break-word; | |
| } | |
| .d2-2448175750 .md details, | |
| .d2-2448175750 .md figcaption, | |
| .d2-2448175750 .md figure { | |
| display: block; | |
| } | |
| .d2-2448175750 .md summary { | |
| display: list-item; | |
| } | |
| .d2-2448175750 .md [hidden] { | |
| display: none !important; | |
| } | |
| .d2-2448175750 .md a { | |
| background-color: transparent; | |
| color: var(--color-accent-fg); | |
| text-decoration: none; | |
| } | |
| .d2-2448175750 .md a:active, | |
| .d2-2448175750 .md a:hover { | |
| outline-width: 0; | |
| } | |
| .d2-2448175750 .md abbr[title] { | |
| border-bottom: none; | |
| text-decoration: underline dotted; | |
| } | |
| .d2-2448175750 .md dfn { | |
| font-style: italic; | |
| } | |
| .d2-2448175750 .md h1 { | |
| margin: 0.67em 0; | |
| padding-bottom: 0.3em; | |
| font-size: 2em; | |
| border-bottom: 1px solid var(--color-border-muted); | |
| } | |
| .d2-2448175750 .md mark { | |
| background-color: var(--color-attention-subtle); | |
| color: var(--color-text-primary); | |
| } | |
| .d2-2448175750 .md small { | |
| font-size: 90%; | |
| } | |
| .d2-2448175750 .md sub, | |
| .d2-2448175750 .md sup { | |
| font-size: 75%; | |
| line-height: 0; | |
| position: relative; | |
| vertical-align: baseline; | |
| } | |
| .d2-2448175750 .md sub { | |
| bottom: -0.25em; | |
| } | |
| .d2-2448175750 .md sup { | |
| top: -0.5em; | |
| } | |
| .d2-2448175750 .md img { | |
| border-style: none; | |
| max-width: 100%; | |
| box-sizing: content-box; | |
| background-color: var(--color-canvas-default); | |
| } | |
| .d2-2448175750 .md figure { | |
| margin: 1em 40px; | |
| } | |
| .d2-2448175750 .md hr { | |
| box-sizing: content-box; | |
| overflow: hidden; | |
| background: transparent; | |
| border-bottom: 1px solid var(--color-border-muted); | |
| height: 0.25em; | |
| padding: 0; | |
| margin: 24px 0; | |
| background-color: var(--color-border-default); | |
| border: 0; | |
| } | |
| .d2-2448175750 .md input { | |
| font: inherit; | |
| margin: 0; | |
| overflow: visible; | |
| font-family: inherit; | |
| font-size: inherit; | |
| line-height: inherit; | |
| } | |
| .d2-2448175750 .md [type="button"], | |
| .d2-2448175750 .md [type="reset"], | |
| .d2-2448175750 .md [type="submit"] { | |
| -webkit-appearance: button; | |
| } | |
| .d2-2448175750 .md [type="button"]::-moz-focus-inner, | |
| .d2-2448175750 .md [type="reset"]::-moz-focus-inner, | |
| .d2-2448175750 .md [type="submit"]::-moz-focus-inner { | |
| border-style: none; | |
| padding: 0; | |
| } | |
| .d2-2448175750 .md [type="button"]:-moz-focusring, | |
| .d2-2448175750 .md [type="reset"]:-moz-focusring, | |
| .d2-2448175750 .md [type="submit"]:-moz-focusring { | |
| outline: 1px dotted ButtonText; | |
| } | |
| .d2-2448175750 .md [type="checkbox"], | |
| .d2-2448175750 .md [type="radio"] { | |
| box-sizing: border-box; | |
| padding: 0; | |
| } | |
| .d2-2448175750 .md [type="number"]::-webkit-inner-spin-button, | |
| .d2-2448175750 .md [type="number"]::-webkit-outer-spin-button { | |
| height: auto; | |
| } | |
| .d2-2448175750 .md [type="search"] { | |
| -webkit-appearance: textfield; | |
| outline-offset: -2px; | |
| } | |
| .d2-2448175750 .md [type="search"]::-webkit-search-cancel-button, | |
| .d2-2448175750 .md [type="search"]::-webkit-search-decoration { | |
| -webkit-appearance: none; | |
| } | |
| .d2-2448175750 .md ::-webkit-input-placeholder { | |
| color: inherit; | |
| opacity: 0.54; | |
| } | |
| .d2-2448175750 .md ::-webkit-file-upload-button { | |
| -webkit-appearance: button; | |
| font: inherit; | |
| } | |
| .d2-2448175750 .md a:hover { | |
| text-decoration: underline; | |
| } | |
| .d2-2448175750 .md hr::before { | |
| display: table; | |
| content: ""; | |
| } | |
| .d2-2448175750 .md hr::after { | |
| display: table; | |
| clear: both; | |
| content: ""; | |
| } | |
| .d2-2448175750 .md table { | |
| border-spacing: 0; | |
| border-collapse: collapse; | |
| display: block; | |
| width: max-content; | |
| max-width: 100%; | |
| overflow: auto; | |
| } | |
| .d2-2448175750 .md td, | |
| .d2-2448175750 .md th { | |
| padding: 0; | |
| } | |
| .d2-2448175750 .md details summary { | |
| cursor: pointer; | |
| } | |
| .d2-2448175750 .md details:not([open]) > *:not(summary) { | |
| display: none !important; | |
| } | |
| .d2-2448175750 .md kbd { | |
| display: inline-block; | |
| padding: 3px 5px; | |
| color: var(--color-fg-default); | |
| vertical-align: middle; | |
| background-color: var(--color-canvas-subtle); | |
| border: solid 1px var(--color-neutral-muted); | |
| border-bottom-color: var(--color-neutral-muted); | |
| border-radius: 6px; | |
| box-shadow: inset 0 -1px 0 var(--color-neutral-muted); | |
| } | |
| .d2-2448175750 .md h1, | |
| .d2-2448175750 .md h2, | |
| .d2-2448175750 .md h3, | |
| .d2-2448175750 .md h4, | |
| .d2-2448175750 .md h5, | |
| .d2-2448175750 .md h6 { | |
| margin-top: 24px; | |
| margin-bottom: 16px; | |
| font-weight: 400; | |
| line-height: 1.25; | |
| font-family: "d2-2448175750-font-semibold"; | |
| } | |
| .d2-2448175750 .md h2 { | |
| padding-bottom: 0.3em; | |
| font-size: 1.5em; | |
| border-bottom: 1px solid var(--color-border-muted); | |
| } | |
| .d2-2448175750 .md h3 { | |
| font-size: 1.25em; | |
| } | |
| .d2-2448175750 .md h4 { | |
| font-size: 1em; | |
| } | |
| .d2-2448175750 .md h5 { | |
| font-size: 0.875em; | |
| } | |
| .d2-2448175750 .md h6 { | |
| font-size: 0.85em; | |
| color: var(--color-fg-muted); | |
| } | |
| .d2-2448175750 .md p { | |
| margin-top: 0; | |
| margin-bottom: 10px; | |
| } | |
| .d2-2448175750 .md blockquote { | |
| margin: 0; | |
| padding: 0 1em; | |
| color: var(--color-fg-muted); | |
| border-left: 0.25em solid var(--color-border-default); | |
| } | |
| .d2-2448175750 .md ul, | |
| .d2-2448175750 .md ol { | |
| margin-top: 0; | |
| margin-bottom: 0; | |
| padding-left: 2em; | |
| } | |
| .d2-2448175750 .md ol ol, | |
| .d2-2448175750 .md ul ol { | |
| list-style-type: lower-roman; | |
| } | |
| .d2-2448175750 .md ul ul ol, | |
| .d2-2448175750 .md ul ol ol, | |
| .d2-2448175750 .md ol ul ol, | |
| .d2-2448175750 .md ol ol ol { | |
| list-style-type: lower-alpha; | |
| } | |
| .d2-2448175750 .md dd { | |
| margin-left: 0; | |
| } | |
| .d2-2448175750 .md pre { | |
| margin-top: 0; | |
| margin-bottom: 0; | |
| word-wrap: normal; | |
| } | |
| .d2-2448175750 .md ::placeholder { | |
| color: var(--color-fg-subtle); | |
| opacity: 1; | |
| } | |
| .d2-2448175750 .md input::-webkit-outer-spin-button, | |
| .d2-2448175750 .md input::-webkit-inner-spin-button { | |
| margin: 0; | |
| -webkit-appearance: none; | |
| appearance: none; | |
| } | |
| .d2-2448175750 .md::before { | |
| display: table; | |
| content: ""; | |
| } | |
| .d2-2448175750 .md::after { | |
| display: table; | |
| clear: both; | |
| content: ""; | |
| } | |
| .d2-2448175750 .md > *:first-child { | |
| margin-top: 0 !important; | |
| } | |
| .d2-2448175750 .md > *:last-child { | |
| margin-bottom: 0 !important; | |
| } | |
| .d2-2448175750 .md a:not([href]) { | |
| color: inherit; | |
| text-decoration: none; | |
| } | |
| .d2-2448175750 .md .absent { | |
| color: var(--color-danger-fg); | |
| } | |
| .d2-2448175750 .md .anchor { | |
| float: left; | |
| padding-right: 4px; | |
| margin-left: -20px; | |
| line-height: 1; | |
| } | |
| .d2-2448175750 .md .anchor:focus { | |
| outline: none; | |
| } | |
| .d2-2448175750 .md p, | |
| .d2-2448175750 .md blockquote, | |
| .d2-2448175750 .md ul, | |
| .d2-2448175750 .md ol, | |
| .d2-2448175750 .md dl, | |
| .d2-2448175750 .md table, | |
| .d2-2448175750 .md pre, | |
| .d2-2448175750 .md details { | |
| margin-top: 0; | |
| margin-bottom: 16px; | |
| } | |
| .d2-2448175750 .md blockquote > :first-child { | |
| margin-top: 0; | |
| } | |
| .d2-2448175750 .md blockquote > :last-child { | |
| margin-bottom: 0; | |
| } | |
| .d2-2448175750 .md sup > a::before { | |
| content: "["; | |
| } | |
| .d2-2448175750 .md sup > a::after { | |
| content: "]"; | |
| } | |
| .d2-2448175750 .md h1:hover .anchor, | |
| .d2-2448175750 .md h2:hover .anchor, | |
| .d2-2448175750 .md h3:hover .anchor, | |
| .d2-2448175750 .md h4:hover .anchor, | |
| .d2-2448175750 .md h5:hover .anchor, | |
| .d2-2448175750 .md h6:hover .anchor { | |
| text-decoration: none; | |
| } | |
| .d2-2448175750 .md h1 tt, | |
| .d2-2448175750 .md h1 code, | |
| .d2-2448175750 .md h2 tt, | |
| .d2-2448175750 .md h2 code, | |
| .d2-2448175750 .md h3 tt, | |
| .d2-2448175750 .md h3 code, | |
| .d2-2448175750 .md h4 tt, | |
| .d2-2448175750 .md h4 code, | |
| .d2-2448175750 .md h5 tt, | |
| .d2-2448175750 .md h5 code, | |
| .d2-2448175750 .md h6 tt, | |
| .d2-2448175750 .md h6 code { | |
| padding: 0 0.2em; | |
| font-size: inherit; | |
| } | |
| .d2-2448175750 .md ul.no-list, | |
| .d2-2448175750 .md ol.no-list { | |
| padding: 0; | |
| list-style-type: none; | |
| } | |
| .d2-2448175750 .md ol[type="1"] { | |
| list-style-type: decimal; | |
| } | |
| .d2-2448175750 .md ol[type="a"] { | |
| list-style-type: lower-alpha; | |
| } | |
| .d2-2448175750 .md ol[type="i"] { | |
| list-style-type: lower-roman; | |
| } | |
| .d2-2448175750 .md div > ol:not([type]) { | |
| list-style-type: decimal; | |
| } | |
| .d2-2448175750 .md ul ul, | |
| .d2-2448175750 .md ul ol, | |
| .d2-2448175750 .md ol ol, | |
| .d2-2448175750 .md ol ul { | |
| margin-top: 0; | |
| margin-bottom: 0; | |
| } | |
| .d2-2448175750 .md li > p { | |
| margin-top: 16px; | |
| } | |
| .d2-2448175750 .md li + li { | |
| margin-top: 0.25em; | |
| } | |
| .d2-2448175750 .md dl { | |
| padding: 0; | |
| } | |
| .d2-2448175750 .md dl dt { | |
| padding: 0; | |
| margin-top: 16px; | |
| font-size: 1em; | |
| font-style: italic; | |
| font-family: "d2-2448175750-font-semibold"; | |
| } | |
| .d2-2448175750 .md dl dd { | |
| padding: 0 16px; | |
| margin-bottom: 16px; | |
| } | |
| .d2-2448175750 .md table th { | |
| font-family: "d2-2448175750-font-semibold"; | |
| } | |
| .d2-2448175750 .md table th, | |
| .d2-2448175750 .md table td { | |
| padding: 6px 13px; | |
| border: 1px solid var(--color-border-default); | |
| } | |
| .d2-2448175750 .md table tr { | |
| background-color: var(--color-canvas-default); | |
| border-top: 1px solid var(--color-border-muted); | |
| } | |
| .d2-2448175750 .md table tr:nth-child(2n) { | |
| background-color: var(--color-canvas-subtle); | |
| } | |
| .d2-2448175750 .md table img { | |
| background-color: transparent; | |
| } | |
| .d2-2448175750 .md img[align="right"] { | |
| padding-left: 20px; | |
| } | |
| .d2-2448175750 .md img[align="left"] { | |
| padding-right: 20px; | |
| } | |
| .d2-2448175750 .md span.frame { | |
| display: block; | |
| overflow: hidden; | |
| } | |
| .d2-2448175750 .md span.frame > span { | |
| display: block; | |
| float: left; | |
| width: auto; | |
| padding: 7px; | |
| margin: 13px 0 0; | |
| overflow: hidden; | |
| border: 1px solid var(--color-border-default); | |
| } | |
| .d2-2448175750 .md span.frame span img { | |
| display: block; | |
| float: left; | |
| } | |
| .d2-2448175750 .md span.frame span span { | |
| display: block; | |
| padding: 5px 0 0; | |
| clear: both; | |
| color: var(--color-fg-default); | |
| } | |
| .d2-2448175750 .md span.align-center { | |
| display: block; | |
| overflow: hidden; | |
| clear: both; | |
| } | |
| .d2-2448175750 .md span.align-center > span { | |
| display: block; | |
| margin: 13px auto 0; | |
| overflow: hidden; | |
| text-align: center; | |
| } | |
| .d2-2448175750 .md span.align-center span img { | |
| margin: 0 auto; | |
| text-align: center; | |
| } | |
| .d2-2448175750 .md span.align-right { | |
| display: block; | |
| overflow: hidden; | |
| clear: both; | |
| } | |
| .d2-2448175750 .md span.align-right > span { | |
| display: block; | |
| margin: 13px 0 0; | |
| overflow: hidden; | |
| text-align: right; | |
| } | |
| .d2-2448175750 .md span.align-right span img { | |
| margin: 0; | |
| text-align: right; | |
| } | |
| .d2-2448175750 .md span.float-left { | |
| display: block; | |
| float: left; | |
| margin-right: 13px; | |
| overflow: hidden; | |
| } | |
| .d2-2448175750 .md span.float-left span { | |
| margin: 13px 0 0; | |
| } | |
| .d2-2448175750 .md span.float-right { | |
| display: block; | |
| float: right; | |
| margin-left: 13px; | |
| overflow: hidden; | |
| } | |
| .d2-2448175750 .md span.float-right > span { | |
| display: block; | |
| margin: 13px auto 0; | |
| overflow: hidden; | |
| text-align: right; | |
| } | |
| .d2-2448175750 .md code, | |
| .d2-2448175750 .md tt { | |
| padding: 0.2em 0.4em; | |
| margin: 0; | |
| font-size: 85%; | |
| background-color: var(--color-neutral-muted); | |
| border-radius: 6px; | |
| } | |
| .d2-2448175750 .md code br, | |
| .d2-2448175750 .md tt br { | |
| display: none; | |
| } | |
| .d2-2448175750 .md del code { | |
| text-decoration: inherit; | |
| } | |
| .d2-2448175750 .md pre code { | |
| font-size: 100%; | |
| } | |
| .d2-2448175750 .md pre > code { | |
| padding: 0; | |
| margin: 0; | |
| word-break: normal; | |
| white-space: pre; | |
| background: transparent; | |
| border: 0; | |
| } | |
| .d2-2448175750 .md .highlight { | |
| margin-bottom: 16px; | |
| } | |
| .d2-2448175750 .md .highlight pre { | |
| margin-bottom: 0; | |
| word-break: normal; | |
| } | |
| .d2-2448175750 .md .highlight pre, | |
| .d2-2448175750 .md pre { | |
| padding: 16px; | |
| overflow: auto; | |
| font-size: 85%; | |
| line-height: 1.45; | |
| background-color: var(--color-canvas-subtle); | |
| border-radius: 6px; | |
| } | |
| .d2-2448175750 .md pre code, | |
| .d2-2448175750 .md pre tt { | |
| display: inline; | |
| max-width: auto; | |
| padding: 0; | |
| margin: 0; | |
| overflow: visible; | |
| line-height: inherit; | |
| word-wrap: normal; | |
| background-color: transparent; | |
| border: 0; | |
| } | |
| .d2-2448175750 .md .csv-data td, | |
| .d2-2448175750 .md .csv-data th { | |
| padding: 5px; | |
| overflow: hidden; | |
| font-size: 12px; | |
| line-height: 1; | |
| text-align: left; | |
| white-space: nowrap; | |
| } | |
| .d2-2448175750 .md .csv-data .blob-num { | |
| padding: 10px 8px 9px; | |
| text-align: right; | |
| background: var(--color-canvas-default); | |
| border: 0; | |
| } | |
| .d2-2448175750 .md .csv-data tr { | |
| border-top: 0; | |
| } | |
| .d2-2448175750 .md .csv-data th { | |
| font-family: "d2-2448175750-font-semibold"; | |
| background: var(--color-canvas-subtle); | |
| border-top: 0; | |
| } | |
| .d2-2448175750 .md .footnotes { | |
| font-size: 12px; | |
| color: var(--color-fg-muted); | |
| border-top: 1px solid var(--color-border-default); | |
| } | |
| .d2-2448175750 .md .footnotes ol { | |
| padding-left: 16px; | |
| } | |
| .d2-2448175750 .md .footnotes li { | |
| position: relative; | |
| } | |
| .d2-2448175750 .md .footnotes li:target::before { | |
| position: absolute; | |
| top: -8px; | |
| right: -8px; | |
| bottom: -8px; | |
| left: -24px; | |
| pointer-events: none; | |
| content: ""; | |
| border: 2px solid var(--color-accent-emphasis); | |
| border-radius: 6px; | |
| } | |
| .d2-2448175750 .md .footnotes li:target { | |
| color: var(--color-fg-default); | |
| } | |
| .d2-2448175750 .md .task-list-item { | |
| list-style-type: none; | |
| } | |
| .d2-2448175750 .md .task-list-item label { | |
| font-weight: 400; | |
| } | |
| .d2-2448175750 .md .task-list-item.enabled label { | |
| cursor: pointer; | |
| } | |
| .d2-2448175750 .md .task-list-item + .task-list-item { | |
| margin-top: 3px; | |
| } | |
| .d2-2448175750 .md .task-list-item .handle { | |
| display: none; | |
| } | |
| .d2-2448175750 .md .task-list-item-checkbox { | |
| margin: 0 0.2em 0.25em -1.6em; | |
| vertical-align: middle; | |
| } | |
| .d2-2448175750 .md .contains-task-list:dir(rtl) .task-list-item-checkbox { | |
| margin: 0 -1.6em 0.25em 0.2em; | |
| } | |
| </style><g class="dGl0bGU="><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="1775.000000" y="-160.000000" width="784" height="119"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1" style="font-size:22px"><h1>Current vs Required: Rate Limiting Layers</h1> | |
| <p>Gap analysis for per-customer API protection</p> | |
| </div></foreignObject></g></g><g class="Y3VycmVudA=="><g class="shape" ><rect x="0.000000" y="20.000000" width="1982.000000" height="633.000000" rx="10.000000" stroke="#2E7D32" fill="#E8F5E9" style="stroke-width:2;" /></g><text x="991.000000" y="7.000000" fill="#CDD6F4" class="text fill-N1" style="text-anchor:middle;font-size:28px">CURRENT STATE</text></g><g class="cmVxdWlyZWQ="><g class="shape" ><rect x="2012.000000" y="28.000000" width="2323.000000" height="625.000000" rx="10.000000" stroke="#1565C0" fill="#E3F2FD" style="stroke-width:2;" /></g><text x="3173.500000" y="15.000000" fill="#CDD6F4" class="text fill-N1" style="text-anchor:middle;font-size:28px">REQUIRED STATE</text></g><g class="Y3VycmVudC5sYXllcjE="><g class="shape" ><rect x="30.000000" y="543.000000" width="1148.000000" height="80.000000" rx="8.000000" stroke="#2E7D32" fill="#C8E6C9" style="stroke-width:2;" /></g><text x="604.000000" y="531.000000" fill="#CDD6F4" class="text fill-N1" style="text-anchor:middle;font-size:24px">Layer 1: Traefik Edge (EXISTS)</text></g><g class="Y3VycmVudC5jdXN0b21lcl9h"><g class="shape" ><path d="M 682 132 H 584 V 131 C 584 117 595 104 612 98 C 602 93 597 85 597 77 C 597 62 613 50 633 50 C 653 50 669 62 669 77 C 669 86 664 94 654 99 C 671 105 682 118 682 132 V 133 H 682 Z" stroke="#CBA6f7" fill="#BBDEFB" class=" stroke-B1" style="stroke-width:2;" /></g><text x="633.000000" y="153.000000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="633.000000" dy="0.000000">Customer A</tspan><tspan x="633.000000" dy="18.500000">(API key)</tspan></text></g><g class="Y3VycmVudC5jdXN0b21lcl9i"><g class="shape" ><path d="M 1385 132 H 1287 V 131 C 1287 117 1298 104 1315 98 C 1305 93 1300 85 1300 77 C 1300 62 1316 50 1336 50 C 1356 50 1372 62 1372 77 C 1372 86 1367 94 1357 99 C 1374 105 1385 118 1385 132 V 133 H 1385 Z" stroke="#CBA6f7" fill="#BBDEFB" class=" stroke-B1" style="stroke-width:2;" /></g><text x="1336.000000" y="153.000000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="1336.000000" dy="0.000000">Customer B</tspan><tspan x="1336.000000" dy="18.500000">(API key)</tspan></text></g><g class="Y3VycmVudC5iYWRfYWN0b3I="><g class="shape" ><path d="M 1740 132 H 1656 V 131 C 1656 117 1665 104 1680 98 C 1672 93 1667 85 1667 77 C 1667 62 1681 50 1698 50 C 1715 50 1729 62 1729 77 C 1729 86 1724 94 1716 99 C 1731 105 1740 118 1740 132 V 133 H 1740 Z" stroke="#CBA6f7" fill="#FFCDD2" class=" stroke-B1" style="stroke-width:2;" /></g><text x="1698.000000" y="153.000000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="1698.000000" dy="0.000000">Bad Actor</tspan><tspan x="1698.000000" dy="18.500000">(API key)</tspan></text></g><g class="Y3VycmVudC5zaGFyZWRfYnVja2V0"><g class="shape" ><path d="M 1336 377 C 1335 377 1334 377 1333 377 L 1172 316 C 1170 315 1170 314 1172 314 L 1333 253 C 1335 252 1337 252 1339 253 L 1500 313 C 1502 314 1502 315 1500 315 L 1339 377 C 1338 377 1337 377 1336 377 Z" stroke="#F57F17" fill="#FFF9C4" style="stroke-width:2;" /></g><text x="1336.000000" y="312.500000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px"><tspan x="1336.000000" dy="0.000000">Shared Token Bucket</tspan><tspan x="1336.000000" dy="18.500000">(5 req/s)</tspan></text></g><g class="Y3VycmVudC5hcHA="><g class="shape" ><path d="M 1282 548 L 1228 582 L 1282 617 L 1389 617 L 1443 582 L 1389 548 Z" stroke="#CBA6f7" fill="#C8E6C9" class=" stroke-B1" style="stroke-width:2;" /></g><text x="1335.500000" y="588.000000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">App (all tenants)</text></g><g class="Y3VycmVudC5wcm9ibGVt"><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="1503.000000" y="573.000000" width="449" height="20"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1" style="font-size:13px;background-color:#FFCDD2"><p>❌ <strong>Problem:</strong> Bad actor exhausts the | |
| shared bucket, blocking legitimate customers</p> | |
| </div></foreignObject></g></g><g class="cmVxdWlyZWQubGF5ZXIx"><g class="shape" ><rect x="2042.000000" y="543.000000" width="546.000000" height="80.000000" rx="8.000000" stroke="#1565C0" fill="#BBDEFB" style="stroke-width:2;" /></g><text x="2315.000000" y="531.000000" fill="#CDD6F4" class="text fill-N1" style="text-anchor:middle;font-size:24px">Layer 1: Traefik Edge (ENABLE)</text></g><g class="cmVxdWlyZWQubGF5ZXIy"><g class="shape" ><rect x="3535.000000" y="543.000000" width="770.000000" height="80.000000" rx="8.000000" stroke="#1565C0" fill="#90CAF9" style="stroke-width:2;" /></g><text x="3920.000000" y="531.000000" fill="#CDD6F4" class="text fill-N1" style="text-anchor:middle;font-size:24px">Layer 2: Rails App (BUILD)</text></g><g class="cmVxdWlyZWQuY3VzdG9tZXJfYTI="><g class="shape" ><path d="M 2667 124 H 2569 V 123 C 2569 112 2580 102 2597 97 C 2587 93 2582 86 2582 79 C 2582 68 2598 58 2618 58 C 2638 58 2654 68 2654 79 C 2654 86 2649 92 2639 96 C 2656 101 2667 111 2667 122 V 123 H 2667 Z" stroke="#CBA6f7" fill="#BBDEFB" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2618.000000" y="145.000000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Customer A</text></g><g class="cmVxdWlyZWQuY3VzdG9tZXJfYjI="><g class="shape" ><path d="M 2851 124 H 2753 V 123 C 2753 112 2764 102 2781 97 C 2771 93 2766 86 2766 79 C 2766 68 2782 58 2802 58 C 2822 58 2838 68 2838 79 C 2838 86 2833 92 2823 96 C 2840 101 2851 111 2851 122 V 123 H 2851 Z" stroke="#CBA6f7" fill="#BBDEFB" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2802.000000" y="145.000000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Customer B</text></g><g class="cmVxdWlyZWQuYmFkX2FjdG9yMg=="><g class="shape" ><path d="M 3285 124 H 3201 V 123 C 3201 112 3210 102 3225 97 C 3217 93 3212 86 3212 79 C 3212 68 3226 58 3243 58 C 3260 58 3274 68 3274 79 C 3274 86 3269 92 3261 96 C 3276 101 3285 111 3285 122 V 123 H 3285 Z" stroke="#CBA6f7" fill="#FFCDD2" class=" stroke-B1" style="stroke-width:2;" /></g><text x="3243.000000" y="145.000000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Bad Actor</text></g><g class="cmVxdWlyZWQuYnVja2V0X2E="><g class="shape" ><path d="M 2618 368 C 2618 368 2617 368 2617 368 L 2556 316 C 2555 315 2555 315 2556 314 L 2617 262 C 2618 261 2619 261 2619 262 L 2679 314 C 2680 315 2680 315 2679 316 L 2619 368 C 2619 368 2618 368 2618 368 Z" stroke="#CBA6f7" fill="#C8E6C9" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2618.000000" y="313.000000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:12px"><tspan x="2618.000000" dy="0.000000">Bucket A</tspan><tspan x="2618.000000" dy="14.000000">300/min</tspan></text></g><g class="cmVxdWlyZWQuYnVja2V0X2I="><g class="shape" ><path d="M 2802 368 C 2802 368 2801 368 2801 368 L 2740 316 C 2739 315 2739 315 2740 314 L 2801 262 C 2802 261 2803 261 2803 262 L 2863 314 C 2864 315 2864 315 2863 316 L 2803 368 C 2803 368 2802 368 2802 368 Z" stroke="#CBA6f7" fill="#C8E6C9" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2802.000000" y="313.000000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:12px"><tspan x="2802.000000" dy="0.000000">Bucket B</tspan><tspan x="2802.000000" dy="14.000000">300/min</tspan></text></g><g class="cmVxdWlyZWQuYnVja2V0X2JhZA=="><g class="shape" ><path d="M 3243 368 C 3243 368 3242 368 3242 368 L 3181 316 C 3180 315 3180 315 3181 314 L 3242 262 C 3243 261 3244 261 3244 262 L 3304 314 C 3305 315 3305 315 3304 316 L 3244 368 C 3244 368 3243 368 3243 368 Z" stroke="#CBA6f7" fill="#FFCDD2" class=" stroke-B1" style="stroke-width:2;" /></g><text x="3243.000000" y="313.000000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:12px"><tspan x="3243.000000" dy="0.000000">Bucket C</tspan><tspan x="3243.000000" dy="14.000000">300/min</tspan></text></g><g class="cmVxdWlyZWQuYXBwMg=="><g class="shape" ><path d="M 2720 548 L 2644 582 L 2720 617 L 2871 617 L 2947 582 L 2871 548 Z" stroke="#CBA6f7" fill="#C8E6C9" class=" stroke-B1" style="stroke-width:2;" /></g><text x="2795.500000" y="588.000000" fill="#CDD6F4" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">App (isolated per tenant)</text></g><g class="cmVxdWlyZWQuc29sdXRpb24="><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="3007.000000" y="573.000000" width="478" height="20"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1" style="font-size:13px;background-color:#C8E6C9"><p>✅ <strong>Solution:</strong> Each customer has their own | |
| bucket — bad actor only throttles themselves</p> | |
| </div></foreignObject></g></g><g class="Y3VycmVudC5sYXllcjEuZGVzYw=="><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="60.000000" y="573.000000" width="1088" height="20"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1" style="font-size:13px"><p><strong>Scope:</strong> Per-app (all traffic) | |
| <strong>Algorithm:</strong> Token bucket (average/burst) | |
| <strong>Granularity:</strong> All customers share one bucket | |
| <strong>Status:</strong> ⚠️ Available but <strong>disabled by default</strong> | |
| <strong>Config:</strong> <code>average=5 req/s, burst=10</code></p> | |
| </div></foreignObject></g></g><g class="cmVxdWlyZWQubGF5ZXIxLmRlc2M="><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="2072.000000" y="573.000000" width="486" height="20"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1" style="font-size:13px"><p><strong>Global safety net</strong> | |
| Cap total traffic at e.g. 1000 req/s | |
| Prevents total infrastructure overload</p> | |
| </div></foreignObject></g></g><g class="cmVxdWlyZWQubGF5ZXIyLmRlc2M="><g class="shape" ></g><g><foreignObject requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" x="3565.000000" y="573.000000" width="710" height="20"><div xmlns="http://www.w3.org/1999/xhtml" class="md color-N1" style="font-size:13px"><p><strong>Per-customer throttling</strong> | |
| Rails 8 <code>rate_limit</code> in API controllers | |
| Keyed by API key or organization ID | |
| e.g. 300 req/min per customer</p> | |
| </div></foreignObject></g></g><g class="Y3VycmVudC4oY3VzdG9tZXJfYSAtJmd0OyBzaGFyZWRfYnVja2V0KVswXQ=="><marker id="mk-d2-2448175750-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#CBA6f7" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 633.250000 175.500000 C 633.250000 188.699997 751.000000 213.000000 1218.059276 294.313929" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2448175750-3488378134)" mask="url(#d2-2448175750)" /></g><g class="Y3VycmVudC4oY3VzdG9tZXJfYiAtJmd0OyBzaGFyZWRfYnVja2V0KVswXQ=="><path d="M 1335.500000 175.500000 C 1335.500000 188.699997 1335.599976 204.399994 1335.966386 248.000141" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2448175750-3488378134)" mask="url(#d2-2448175750)" /></g><g class="Y3VycmVudC4oYmFkX2FjdG9yIC0mZ3Q7IHNoYXJlZF9idWNrZXQpWzBd"><marker id="mk-d2-2448175750-1557190539" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#C62828" class="connection" stroke-width="2" /> </marker><path d="M 1698.250000 175.500000 C 1698.250000 188.699997 1643.800049 211.000000 1429.787367 283.713200" stroke="#C62828" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-d2-2448175750-1557190539)" mask="url(#d2-2448175750)" /><text x="1569.500000" y="242.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">floods</text></g><g class="Y3VycmVudC4oc2hhcmVkX2J1Y2tldCAtJmd0OyBhcHApWzBd"><path d="M 1335.983471 378.999932 C 1335.599976 425.399994 1335.400024 508.000000 1335.040000 544.000200" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2448175750-3488378134)" mask="url(#d2-2448175750)" /></g><g class="cmVxdWlyZWQuKGN1c3RvbWVyX2EyIC0mZ3Q7IGJ1Y2tldF9hKVswXQ=="><path d="M 2618.000000 151.500000 C 2618.000000 183.899994 2618.000000 206.199997 2618.000000 257.000000" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2448175750-3488378134)" mask="url(#d2-2448175750)" /></g><g class="cmVxdWlyZWQuKGN1c3RvbWVyX2IyIC0mZ3Q7IGJ1Y2tldF9iKVswXQ=="><path d="M 2802.000000 151.500000 C 2802.000000 183.899994 2802.000000 206.199997 2802.000000 257.000000" stroke="#CBA6f7" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2448175750-3488378134)" mask="url(#d2-2448175750)" /></g><g class="cmVxdWlyZWQuKGJhZF9hY3RvcjIgLSZndDsgYnVja2V0X2JhZClbMF0="><path d="M 3242.500000 151.500000 C 3242.500000 183.899994 3242.600098 206.399994 3242.971231 258.000103" stroke="#C62828" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-d2-2448175750-1557190539)" mask="url(#d2-2448175750)" /><text x="3242.500000" y="211.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">floods</text></g><g class="cmVxdWlyZWQuKGJ1Y2tldF9hIC0mZ3Q7IGFwcDIpWzBd"><marker id="mk-d2-2448175750-487057793" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#2E7D32" class="connection" stroke-width="2" /> </marker><path d="M 2618.000000 370.000000 C 2618.000000 423.600006 2639.000000 508.000000 2719.388558 546.280266" stroke="#2E7D32" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-d2-2448175750-487057793)" mask="url(#d2-2448175750)" /><text x="2633.000000" y="489.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">✓</text></g><g class="cmVxdWlyZWQuKGJ1Y2tldF9iIC0mZ3Q7IGFwcDIpWzBd"><path d="M 2802.000000 370.000000 C 2802.000000 423.600006 2801.199951 508.000000 2798.318976 544.012738" stroke="#2E7D32" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-d2-2448175750-487057793)" mask="url(#d2-2448175750)" /><text x="2802.000000" y="464.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">✓</text></g><g class="cmVxdWlyZWQuKGJ1Y2tldF9iYWQgLSZndDsgYXBwMilbMF0="><marker id="mk-d2-2448175750-4139627944" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#FF6F00" class="connection" stroke-width="2" /> </marker><path d="M 3242.985615 369.999948 C 3242.600098 423.600006 3174.600098 510.799988 2906.930766 561.259001" stroke="#FF6F00" fill="none" class="connection" style="stroke-width:2;" marker-end="url(#mk-d2-2448175750-4139627944)" mask="url(#d2-2448175750)" /><text x="3120.000000" y="527.000000" fill="#BAC2DE" class="text-italic fill-N2" style="text-anchor:middle;font-size:16px">✓ (throttled)</text></g><mask id="d2-2448175750" maskUnits="userSpaceOnUse" x="-41" y="-201" width="4417" height="895"> | |
| <rect x="-41" y="-201" width="4417" height="895" fill="white"></rect> | |
| <rect x="1547.000000" y="226.000000" width="45" height="21" fill="black"></rect> | |
| <rect x="3220.000000" y="195.000000" width="45" height="21" fill="black"></rect> | |
| <rect x="2626.000000" y="473.000000" width="14" height="21" fill="black"></rect> | |
| <rect x="2795.000000" y="448.000000" width="14" height="21" fill="black"></rect> | |
| <rect x="3078.000000" y="511.000000" width="84" height="21" fill="black"></rect> | |
| </mask></svg></svg> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment