769 lines
114 KiB
HTML
769 lines
114 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-GB">
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
<meta name='robots' content='max-image-preview:large' />
|
||
<title>Graceful Shutdown – Srinivas Devaki</title>
|
||
<link rel='dns-prefetch' href='//secure.gravatar.com' />
|
||
<link rel='dns-prefetch' href='//widgets.wp.com' />
|
||
<link rel='dns-prefetch' href='//jetpack.wordpress.com' />
|
||
<link rel='dns-prefetch' href='//s0.wp.com' />
|
||
<link rel='dns-prefetch' href='//public-api.wordpress.com' />
|
||
<link rel='dns-prefetch' href='//0.gravatar.com' />
|
||
<link rel='dns-prefetch' href='//1.gravatar.com' />
|
||
<link rel='dns-prefetch' href='//2.gravatar.com' />
|
||
<link rel='preconnect' href='//i0.wp.com' />
|
||
<link rel='preconnect' href='//c0.wp.com' />
|
||
<link rel="alternate" type="application/rss+xml" title="Srinivas Devaki » Feed" href="https://blog.eightnoteight.dev/feed/" />
|
||
<link rel="alternate" type="application/rss+xml" title="Srinivas Devaki » Comments Feed" href="https://blog.eightnoteight.dev/comments/feed/" />
|
||
<link rel="alternate" type="application/rss+xml" title="Srinivas Devaki » Graceful Shutdown Comments Feed" href="https://blog.eightnoteight.dev/2023/02/18/graceful-shutdown/feed/" />
|
||
<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://blog.eightnoteight.dev/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fblog.eightnoteight.dev%2F2023%2F02%2F18%2Fgraceful-shutdown%2F" />
|
||
<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://blog.eightnoteight.dev/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fblog.eightnoteight.dev%2F2023%2F02%2F18%2Fgraceful-shutdown%2F&format=xml" />
|
||
<style id="wp-img-auto-sizes-contain-inline-css">
|
||
img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px}
|
||
/*# sourceURL=wp-img-auto-sizes-contain-inline-css */
|
||
</style>
|
||
<link rel='stylesheet' id='all-css-ed1343d3d3a7f0c35236a7e63b3bcaf5' href='https://blog.eightnoteight.dev/wp-content/plugins/jetpack/modules/related-posts/related-posts.css?m=1771329624' type='text/css' media='all' />
|
||
<style id="wp-block-heading-inline-css">
|
||
h1:where(.wp-block-heading).has-background,h2:where(.wp-block-heading).has-background,h3:where(.wp-block-heading).has-background,h4:where(.wp-block-heading).has-background,h5:where(.wp-block-heading).has-background,h6:where(.wp-block-heading).has-background{padding:1.25em 2.375em}h1.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h1.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h2.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h2.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h3.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h3.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h4.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h4.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h5.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h5.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]),h6.has-text-align-left[style*=writing-mode]:where([style*=vertical-lr]),h6.has-text-align-right[style*=writing-mode]:where([style*=vertical-rl]){rotate:180deg}
|
||
/*# sourceURL=https://blog.eightnoteight.dev/wp-content/plugins/gutenberg/build/styles/block-library/heading/style.min.css */
|
||
</style>
|
||
<style id="wp-block-spacer-inline-css">
|
||
.wp-block-spacer{clear:both}
|
||
/*# sourceURL=https://blog.eightnoteight.dev/wp-content/plugins/gutenberg/build/styles/block-library/spacer/style.min.css */
|
||
</style>
|
||
<style id="wp-block-group-inline-css">
|
||
.wp-block-group{box-sizing:border-box}:where(.wp-block-group.wp-block-group-is-layout-constrained){position:relative}
|
||
/*# sourceURL=https://blog.eightnoteight.dev/wp-content/plugins/gutenberg/build/styles/block-library/group/style.min.css */
|
||
</style>
|
||
<style id="wp-block-post-featured-image-inline-css">
|
||
.wp-block-post-featured-image{margin-left:0;margin-right:0}.wp-block-post-featured-image a{display:block;height:100%}.wp-block-post-featured-image :where(img){box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom;width:100%}.wp-block-post-featured-image.alignfull img,.wp-block-post-featured-image.alignwide img{width:100%}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim{background-color:#000;inset:0;position:absolute}.wp-block-post-featured-image{position:relative}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-gradient{background-color:transparent}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-0{opacity:0}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-10{opacity:.1}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-20{opacity:.2}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-30{opacity:.3}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-40{opacity:.4}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-50{opacity:.5}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-60{opacity:.6}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-70{opacity:.7}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-80{opacity:.8}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-90{opacity:.9}.wp-block-post-featured-image .wp-block-post-featured-image__overlay.has-background-dim-100{opacity:1}.wp-block-post-featured-image:where(.alignleft,.alignright){width:100%}
|
||
/*# sourceURL=https://blog.eightnoteight.dev/wp-content/plugins/gutenberg/build/styles/block-library/post-featured-image/style.min.css */
|
||
</style>
|
||
<style id="wp-block-post-title-inline-css">
|
||
.wp-block-post-title{box-sizing:border-box;word-break:break-word}.wp-block-post-title :where(a){display:inline-block;font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;text-decoration:inherit}
|
||
/*# sourceURL=https://blog.eightnoteight.dev/wp-content/plugins/gutenberg/build/styles/block-library/post-title/style.min.css */
|
||
</style>
|
||
<style id="wp-block-post-date-inline-css">
|
||
.wp-block-post-date{box-sizing:border-box}
|
||
/*# sourceURL=https://blog.eightnoteight.dev/wp-content/plugins/gutenberg/build/styles/block-library/post-date/style.min.css */
|
||
</style>
|
||
<style id="wp-block-paragraph-inline-css">
|
||
.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}
|
||
/*# sourceURL=https://blog.eightnoteight.dev/wp-content/plugins/gutenberg/build/styles/block-library/paragraph/style.min.css */
|
||
</style>
|
||
<link rel='stylesheet' id='all-css-786756694573fa94a70629ce7648eeaa' href='https://blog.eightnoteight.dev/wp-content/plugins/code-block-pro/build/style-index.css?m=1776010469' type='text/css' media='all' />
|
||
<style id="wp-block-quote-inline-css">
|
||
.wp-block-quote{box-sizing:border-box;overflow-wrap:break-word}.wp-block-quote.is-large:where(:not(.is-style-plain)),.wp-block-quote.is-style-large:where(:not(.is-style-plain)){margin-bottom:1em;padding:0 1em}.wp-block-quote.is-large:where(:not(.is-style-plain)) p,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) p{font-size:1.5em;font-style:italic;line-height:1.6}.wp-block-quote.is-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-large:where(:not(.is-style-plain)) footer,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) cite,.wp-block-quote.is-style-large:where(:not(.is-style-plain)) footer{font-size:1.125em;text-align:right}.wp-block-quote>cite{display:block}
|
||
/*# sourceURL=https://blog.eightnoteight.dev/wp-content/plugins/gutenberg/build/styles/block-library/quote/style.min.css */
|
||
</style>
|
||
<style id="wp-block-image-inline-css">
|
||
.wp-block-image>a,.wp-block-image>figure>a{display:inline-block}.wp-block-image img{box-sizing:border-box;height:auto;max-width:100%;vertical-align:bottom}@media not (prefers-reduced-motion){.wp-block-image img.hide{visibility:hidden}.wp-block-image img.show{animation:show-content-image .4s}}.wp-block-image[style*=border-radius] img,.wp-block-image[style*=border-radius]>a{border-radius:inherit}.wp-block-image.has-custom-border img{box-sizing:border-box}.wp-block-image.aligncenter{text-align:center}.wp-block-image.alignfull>a,.wp-block-image.alignwide>a{width:100%}.wp-block-image.alignfull img,.wp-block-image.alignwide img{height:auto;width:100%}.wp-block-image .aligncenter,.wp-block-image .alignleft,.wp-block-image .alignright,.wp-block-image.aligncenter,.wp-block-image.alignleft,.wp-block-image.alignright{display:table}.wp-block-image .aligncenter>figcaption,.wp-block-image .alignleft>figcaption,.wp-block-image .alignright>figcaption,.wp-block-image.aligncenter>figcaption,.wp-block-image.alignleft>figcaption,.wp-block-image.alignright>figcaption{caption-side:bottom;display:table-caption}.wp-block-image .alignleft{float:left;margin:.5em 1em .5em 0}.wp-block-image .alignright{float:right;margin:.5em 0 .5em 1em}.wp-block-image .aligncenter{margin-left:auto;margin-right:auto}.wp-block-image :where(figcaption){margin-bottom:1em;margin-top:.5em}.wp-block-image.is-style-circle-mask img{border-radius:9999px}@supports ((-webkit-mask-image:none) or (mask-image:none)) or (-webkit-mask-image:none){.wp-block-image.is-style-circle-mask img{border-radius:0;-webkit-mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-image:url('data:image/svg+xml;utf8,<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="50"/></svg>');mask-mode:alpha;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain}}:root :where(.wp-block-image.is-style-rounded img,.wp-block-image .is-style-rounded img){border-radius:9999px}.wp-block-image figure{margin:0}.wp-lightbox-container{display:flex;flex-direction:column;position:relative}.wp-lightbox-container img{cursor:zoom-in}.wp-lightbox-container img:hover+button{opacity:1}.wp-lightbox-container button{align-items:center;backdrop-filter:blur(16px) saturate(180%);background-color:rgba(90,90,90,.25);border:none;border-radius:4px;cursor:zoom-in;display:flex;height:20px;justify-content:center;opacity:0;padding:0;position:absolute;right:16px;text-align:center;top:16px;width:20px;z-index:100}@media not (prefers-reduced-motion){.wp-lightbox-container button{transition:opacity .2s ease}}.wp-lightbox-container button:focus-visible{outline:3px auto rgba(90,90,90,.25);outline:3px auto -webkit-focus-ring-color;outline-offset:3px}.wp-lightbox-container button:hover{cursor:pointer;opacity:1}.wp-lightbox-container button:focus{opacity:1}.wp-lightbox-container button:focus,.wp-lightbox-container button:hover,.wp-lightbox-container button:not(:hover):not(:active):not(.has-background){background-color:rgba(90,90,90,.25);border:none}.wp-lightbox-overlay{box-sizing:border-box;cursor:zoom-out;height:100vh;left:0;overflow:hidden;position:fixed;top:0;visibility:hidden;width:100%;z-index:100000}.wp-lightbox-overlay .wp-lightbox-close-button{align-items:center;cursor:pointer;display:flex;font-family:inherit;gap:8px;justify-content:center;line-height:1;min-height:40px;min-width:40px;padding:0 4px;position:absolute;right:calc(env(safe-area-inset-right) + 16px);top:calc(env(safe-area-inset-top) + 16px);z-index:5000000}.wp-lightbox-overlay .wp-lightbox-close-button:focus,.wp-lightbox-overlay .wp-lightbox-close-button:hover,.wp-lightbox-overlay .wp-lightbox-close-button:not(:hover):not(:active):not(.has-background){background:none;border:none}.wp-lightbox-overlay .wp-lightbox-close-button:has(.wp-lightbox-close-text:not([hidden])) .wp-lightbox-close-icon svg{height:1em;width:1em}.wp-lightbox-overlay .wp-lightbox-close-icon svg{display:block}.wp-lightbox-overlay .wp-lightbox-navigation-button-next,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{align-items:center;bottom:16px;cursor:pointer;display:flex;font-family:inherit;gap:4px;justify-content:center;line-height:1;min-height:40px;min-width:40px;padding:0 8px;position:absolute;z-index:2000002}.wp-lightbox-overlay .wp-lightbox-navigation-button-next[hidden],.wp-lightbox-overlay .wp-lightbox-navigation-button-prev[hidden]{display:none}@media (min-width:960px){.wp-lightbox-overlay .wp-lightbox-navigation-button-next,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{bottom:50%;transform:translateY(-50%)}}.wp-lightbox-overlay .wp-lightbox-navigation-button-next:focus,.wp-lightbox-overlay .wp-lightbox-navigation-button-next:hover,.wp-lightbox-overlay .wp-lightbox-navigation-button-next:not(:hover):not(:active):not(.has-background),.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:focus,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:hover,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:not(:hover):not(:active):not(.has-background){background:none;border:none;padding:0 8px}.wp-lightbox-overlay .wp-lightbox-navigation-button-next:has(.wp-lightbox-navigation-text:not([hidden])) .wp-lightbox-navigation-icon svg,.wp-lightbox-overlay .wp-lightbox-navigation-button-prev:has(.wp-lightbox-navigation-text:not([hidden])) .wp-lightbox-navigation-icon svg{display:block;height:1.5em;width:1.5em}.wp-lightbox-overlay .wp-lightbox-navigation-button-prev{left:calc(env(safe-area-inset-left) + 16px)}.wp-lightbox-overlay .wp-lightbox-navigation-button-next{right:calc(env(safe-area-inset-right) + 16px)}.wp-lightbox-overlay .wp-lightbox-navigation-icon svg{vertical-align:middle}.wp-lightbox-overlay .lightbox-image-container{height:var(--wp--lightbox-container-height);left:50%;overflow:hidden;position:absolute;top:50%;transform:translate(-50%,-50%);transform-origin:top left;width:var(--wp--lightbox-container-width);z-index:2000001}.wp-lightbox-overlay .wp-block-image{align-items:center;box-sizing:border-box;display:flex;height:100%;justify-content:center;margin:0;position:relative;transform-origin:0 0;width:100%;z-index:3000000}.wp-lightbox-overlay .wp-block-image img{height:var(--wp--lightbox-image-height);min-height:var(--wp--lightbox-image-height);min-width:var(--wp--lightbox-image-width);width:var(--wp--lightbox-image-width)}.wp-lightbox-overlay .wp-block-image figcaption{display:none}.wp-lightbox-overlay button{background:none;border:none}.wp-lightbox-overlay .scrim{background-color:#fff;height:100%;opacity:.9;position:absolute;width:100%;z-index:2000000}.wp-lightbox-overlay.active{visibility:visible}@media not (prefers-reduced-motion){.wp-lightbox-overlay.active{animation:turn-on-visibility .25s both}.wp-lightbox-overlay.active img{animation:turn-on-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active){animation:turn-off-visibility .35s both}.wp-lightbox-overlay.show-closing-animation:not(.active) img{animation:turn-off-visibility .25s both}.wp-lightbox-overlay.zoom.active{animation:none;opacity:1;visibility:visible}.wp-lightbox-overlay.zoom.active .lightbox-image-container{animation:lightbox-zoom-in .4s}.wp-lightbox-overlay.zoom.active .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.active .scrim{animation:turn-on-visibility .4s forwards}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active){animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container{animation:lightbox-zoom-out .4s}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .lightbox-image-container img{animation:none}.wp-lightbox-overlay.zoom.show-closing-animation:not(.active) .scrim{animation:turn-off-visibility .4s forwards}}@keyframes show-content-image{0%{visibility:hidden}99%{visibility:hidden}to{visibility:visible}}@keyframes turn-on-visibility{0%{opacity:0}to{opacity:1}}@keyframes turn-off-visibility{0%{opacity:1;visibility:visible}99%{opacity:0;visibility:visible}to{opacity:0;visibility:hidden}}@keyframes lightbox-zoom-in{0%{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale))}to{transform:translate(-50%,-50%) scale(1)}}@keyframes lightbox-zoom-out{0%{transform:translate(-50%,-50%) scale(1);visibility:visible}99%{visibility:visible}to{transform:translate(calc((-100vw + var(--wp--lightbox-scrollbar-width))/2 + var(--wp--lightbox-initial-left-position)),calc(-50vh + var(--wp--lightbox-initial-top-position))) scale(var(--wp--lightbox-scale));visibility:hidden}}
|
||
/*# sourceURL=https://blog.eightnoteight.dev/wp-content/plugins/gutenberg/build/styles/block-library/image/style.min.css */
|
||
</style>
|
||
<style id="wp-block-post-content-inline-css">
|
||
.wp-block-post-content{display:flow-root}
|
||
/*# sourceURL=https://blog.eightnoteight.dev/wp-content/plugins/gutenberg/build/styles/block-library/post-content/style.min.css */
|
||
</style>
|
||
<style id="wp-block-post-navigation-link-inline-css">
|
||
.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous{display:inline-block;margin-right:1ch}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-previous:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next{display:inline-block;margin-left:1ch}.wp-block-post-navigation-link .wp-block-post-navigation-link__arrow-next:not(.is-arrow-chevron){transform:scaleX(1)}.wp-block-post-navigation-link.has-text-align-left[style*="writing-mode: vertical-lr"],.wp-block-post-navigation-link.has-text-align-right[style*="writing-mode: vertical-rl"]{rotate:180deg}
|
||
/*# sourceURL=https://blog.eightnoteight.dev/wp-content/plugins/gutenberg/build/styles/block-library/post-navigation-link/style.min.css */
|
||
</style>
|
||
<style id="jetpack-block-subscriptions-inline-css">
|
||
.is-style-compact .is-not-subscriber :is(.wp-block-button__link,.wp-block-jetpack-subscriptions__button){border-end-start-radius:0!important;border-start-start-radius:0!important;margin-inline-start:0!important}.is-style-compact .is-not-subscriber .components-text-control__input,.is-style-compact .is-not-subscriber p#subscribe-email input[type=email]{border-end-end-radius:0!important;border-start-end-radius:0!important}.is-style-compact:not(.wp-block-jetpack-subscriptions__use-newline) .components-text-control__input{border-inline-end-width:0!important}.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form-container{display:flex;flex-direction:column}.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline:not(.wp-block-jetpack-subscriptions__use-newline) .is-not-subscriber .wp-block-jetpack-subscriptions__form-elements{align-items:flex-start;display:flex}.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline:not(.wp-block-jetpack-subscriptions__use-newline) p#subscribe-submit{display:flex;justify-content:center}.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form .wp-block-jetpack-subscriptions__button,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form .wp-block-jetpack-subscriptions__textfield .components-text-control__input,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form button,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form input[type=email],.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form .wp-block-jetpack-subscriptions__button,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form .wp-block-jetpack-subscriptions__textfield .components-text-control__input,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form button,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form input[type=email]{box-sizing:border-box;cursor:pointer;line-height:1.3;min-width:auto!important;white-space:nowrap!important}.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form input[type=email]::placeholder,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form input[type=email]:disabled,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form input[type=email]::placeholder,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form input[type=email]:disabled{color:currentColor;opacity:.5}.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form .wp-block-jetpack-subscriptions__button,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form button,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form .wp-block-jetpack-subscriptions__button,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form button{border-color:#0000;border-style:solid}.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form .wp-block-jetpack-subscriptions__textfield,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form p#subscribe-email,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form .wp-block-jetpack-subscriptions__textfield,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form p#subscribe-email{background:#0000;flex-grow:1}.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form .wp-block-jetpack-subscriptions__textfield .components-base-control__field,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form .wp-block-jetpack-subscriptions__textfield .components-text-control__input,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form .wp-block-jetpack-subscriptions__textfield input[type=email],.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form p#subscribe-email .components-base-control__field,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form p#subscribe-email .components-text-control__input,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form p#subscribe-email input[type=email],.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form .wp-block-jetpack-subscriptions__textfield .components-base-control__field,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form .wp-block-jetpack-subscriptions__textfield .components-text-control__input,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form .wp-block-jetpack-subscriptions__textfield input[type=email],.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form p#subscribe-email .components-base-control__field,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form p#subscribe-email .components-text-control__input,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form p#subscribe-email input[type=email]{height:auto;margin:0;width:100%}.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form p#subscribe-email,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline .wp-block-jetpack-subscriptions__form p#subscribe-submit,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form p#subscribe-email,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline form p#subscribe-submit{line-height:0;margin:0;padding:0}.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline.wp-block-jetpack-subscriptions__show-subs .wp-block-jetpack-subscriptions__subscount{font-size:16px;margin:8px 0;text-align:end}.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline.wp-block-jetpack-subscriptions__use-newline .wp-block-jetpack-subscriptions__form-elements{display:block}.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline.wp-block-jetpack-subscriptions__use-newline .wp-block-jetpack-subscriptions__button,.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline.wp-block-jetpack-subscriptions__use-newline button{display:inline-block;max-width:100%}.wp-block-jetpack-subscriptions.wp-block-jetpack-subscriptions__supports-newline.wp-block-jetpack-subscriptions__use-newline .wp-block-jetpack-subscriptions__subscount{text-align:start}#subscribe-submit.is-link{text-align:center;width:auto!important}#subscribe-submit.is-link a{margin-left:0!important;margin-top:0!important;width:auto!important}@keyframes jetpack-memberships_button__spinner-animation{to{transform:rotate(1turn)}}.jetpack-memberships-spinner{display:none;height:1em;margin:0 0 0 5px;width:1em}.jetpack-memberships-spinner svg{height:100%;margin-bottom:-2px;width:100%}.jetpack-memberships-spinner-rotating{animation:jetpack-memberships_button__spinner-animation .75s linear infinite;transform-origin:center}.is-loading .jetpack-memberships-spinner{display:inline-block}body.jetpack-memberships-modal-open{overflow:hidden}dialog.jetpack-memberships-modal{opacity:1}dialog.jetpack-memberships-modal,dialog.jetpack-memberships-modal iframe{background:#0000;border:0;bottom:0;box-shadow:none;height:100%;left:0;margin:0;padding:0;position:fixed;right:0;top:0;width:100%}dialog.jetpack-memberships-modal::backdrop{background-color:#000;opacity:.7;transition:opacity .2s ease-out}dialog.jetpack-memberships-modal.is-loading,dialog.jetpack-memberships-modal.is-loading::backdrop{opacity:0}
|
||
/*# sourceURL=https://blog.eightnoteight.dev/wp-content/plugins/jetpack/_inc/blocks/subscriptions/view.css?minify=false */
|
||
</style>
|
||
<style id="wp-block-columns-inline-css">
|
||
.wp-block-columns{box-sizing:border-box;display:flex;flex-wrap:wrap!important}@media (min-width:782px){.wp-block-columns{flex-wrap:nowrap!important}}.wp-block-columns{align-items:normal!important}.wp-block-columns.are-vertically-aligned-top{align-items:flex-start}.wp-block-columns.are-vertically-aligned-center{align-items:center}.wp-block-columns.are-vertically-aligned-bottom{align-items:flex-end}@media (max-width:781px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:100%!important}}@media (min-width:782px){.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns:not(.is-not-stacked-on-mobile)>.wp-block-column[style*=flex-basis]{flex-grow:0}}.wp-block-columns.is-not-stacked-on-mobile{flex-wrap:nowrap!important}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column{flex-basis:0;flex-grow:1}.wp-block-columns.is-not-stacked-on-mobile>.wp-block-column[style*=flex-basis]{flex-grow:0}:where(.wp-block-columns){margin-bottom:1.75em}:where(.wp-block-columns.has-background){padding:1.25em 2.375em}.wp-block-column{flex-grow:1;min-width:0;overflow-wrap:break-word;word-break:break-word}.wp-block-column.is-vertically-aligned-top{align-self:flex-start}.wp-block-column.is-vertically-aligned-center{align-self:center}.wp-block-column.is-vertically-aligned-bottom{align-self:flex-end}.wp-block-column.is-vertically-aligned-stretch{align-self:stretch}.wp-block-column.is-vertically-aligned-bottom,.wp-block-column.is-vertically-aligned-center,.wp-block-column.is-vertically-aligned-top{width:100%}
|
||
/*# sourceURL=https://blog.eightnoteight.dev/wp-content/plugins/gutenberg/build/styles/block-library/columns/style.min.css */
|
||
</style>
|
||
<style id="wp-emoji-styles-inline-css">
|
||
|
||
img.wp-smiley, img.emoji {
|
||
display: inline !important;
|
||
border: none !important;
|
||
box-shadow: none !important;
|
||
height: 1em !important;
|
||
width: 1em !important;
|
||
margin: 0 0.07em !important;
|
||
vertical-align: -0.1em !important;
|
||
background: none !important;
|
||
padding: 0 !important;
|
||
}
|
||
/*# sourceURL=wp-emoji-styles-inline-css */
|
||
</style>
|
||
<style id="wp-block-library-inline-css">
|
||
:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}}
|
||
.has-text-align-justify{text-align:justify;}
|
||
/*# sourceURL=wp-block-library-inline-css */
|
||
</style>
|
||
<style id="wp-block-template-skip-link-inline-css">
|
||
/*! This file is auto-generated */
|
||
.skip-link.screen-reader-text{border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;width:1px;word-wrap:normal!important;word-break:normal!important}.skip-link.screen-reader-text:focus{background-color:#eee;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}
|
||
/*# sourceURL=/wp-includes/css/wp-block-template-skip-link.min.css */
|
||
</style>
|
||
<style id="global-styles-inline-css">
|
||
:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--primary: #000000;--wp--preset--color--secondary: #6d6466;--wp--preset--color--foreground: #000000;--wp--preset--color--background: #f5f3f1;--wp--preset--color--tertiary: #edebe9;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: clamp(0.825rem, 0.825rem + ((1vw - 0.2rem) * 0.488), 1.0625rem);--wp--preset--font-size--medium: clamp(1rem, 1rem + ((1vw - 0.2rem) * 0.513), 1.25rem);--wp--preset--font-size--large: clamp(1.75rem, 1.75rem + ((1vw - 0.2rem) * 0.513), 2rem);--wp--preset--font-size--x-large: clamp(2.5rem, 2.5rem + ((1vw - 0.2rem) * 1.026), 3rem);--wp--preset--font-family--albert-sans: 'Albert Sans', sans-serif;--wp--preset--font-family--alegreya: Alegreya, serif;--wp--preset--font-family--arvo: Arvo, serif;--wp--preset--font-family--bodoni-moda: 'Bodoni Moda', serif;--wp--preset--font-family--bricolage-grotesque: 'Bricolage Grotesque', sans-serif;--wp--preset--font-family--cabin: Cabin, sans-serif;--wp--preset--font-family--chivo: Chivo, sans-serif;--wp--preset--font-family--commissioner: Commissioner, sans-serif;--wp--preset--font-family--cormorant: Cormorant, serif;--wp--preset--font-family--courier-prime: 'Courier Prime', monospace;--wp--preset--font-family--crimson-pro: 'Crimson Pro', serif;--wp--preset--font-family--dm-mono: 'DM Mono', monospace;--wp--preset--font-family--dm-sans: 'DM Sans', sans-serif;--wp--preset--font-family--dm-serif-display: 'DM Serif Display', serif;--wp--preset--font-family--domine: Domine, serif;--wp--preset--font-family--eb-garamond: 'EB Garamond', serif;--wp--preset--font-family--epilogue: Epilogue, sans-serif;--wp--preset--font-family--fahkwang: Fahkwang, sans-serif;--wp--preset--font-family--figtree: Figtree, sans-serif;--wp--preset--font-family--fira-sans: 'Fira Sans', sans-serif;--wp--preset--font-family--fjalla-one: 'Fjalla One', sans-serif;--wp--preset--font-family--fraunces: Fraunces, serif;--wp--preset--font-family--gabarito: Gabarito, system-ui;--wp--preset--font-family--ibm-plex-mono: 'IBM Plex Mono', monospace;--wp--preset--font-family--ibm-plex-sans: 'IBM Plex Sans', sans-serif;--wp--preset--font-family--ibarra-real-nova: 'Ibarra Real Nova', serif;--wp--preset--font-family--instrument-serif: 'Instrument Serif', serif;--wp--preset--font-family--inter: Inter, sans-serif;--wp--preset--font-family--josefin-sans: 'Josefin Sans', sans-serif;--wp--preset--font-family--jost: Jost, sans-serif;--wp--preset--font-family--libre-baskerville: 'Libre Baskerville', serif;--wp--preset--font-family--libre-franklin: 'Libre Franklin', sans-serif;--wp--preset--font-family--literata: Literata, serif;--wp--preset--font-family--lora: Lora, serif;--wp--preset--font-family--merriweather: Merriweather, serif;--wp--preset--font-family--montserrat: Montserrat, sans-serif;--wp--preset--font-family--newsreader: Newsreader, serif;--wp--preset--font-family--noto-sans-mono: 'Noto Sans Mono', sans-serif;--wp--preset--font-family--nunito: Nunito, sans-serif;--wp--preset--font-family--open-sans: 'Open Sans', sans-serif;--wp--preset--font-family--overpass: Overpass, sans-serif;--wp--preset--font-family--pt-serif: 'PT Serif', serif;--wp--preset--font-family--petrona: Petrona, serif;--wp--preset--font-family--piazzolla: Piazzolla, serif;--wp--preset--font-family--playfair-display: 'Playfair Display', serif;--wp--preset--font-family--plus-jakarta-sans: 'Plus Jakarta Sans', sans-serif;--wp--preset--font-family--poppins: Poppins, sans-serif;--wp--preset--font-family--raleway: Raleway, sans-serif;--wp--preset--font-family--roboto: Roboto, sans-serif;--wp--preset--font-family--roboto-slab: 'Roboto Slab', serif;--wp--preset--font-family--rubik: Rubik, sans-serif;--wp--preset--font-family--rufina: Rufina, serif;--wp--preset--font-family--sora: Sora, sans-serif;--wp--preset--font-family--source-sans-3: 'Source Sans 3', sans-serif;--wp--preset--font-family--source-serif-4: 'Source Serif 4', serif;--wp--preset--font-family--space-mono: 'Space Mono', monospace;--wp--preset--font-family--syne: Syne, sans-serif;--wp--preset--font-family--texturina: Texturina, serif;--wp--preset--font-family--urbanist: Urbanist, sans-serif;--wp--preset--font-family--work-sans: 'Work Sans', sans-serif;--wp--preset--font-family--system-font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;--wp--preset--font-family--albura: Albura;--wp--preset--font-family--albura-light: Albura Light;--wp--preset--font-family--albura-semibold: Albura SemiBold;--wp--preset--font-family--baloo-2: "Baloo 2", system-ui;--wp--preset--font-family--recursive: Recursive, sans-serif;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:root { --wp--style--global--content-size: 620px;--wp--style--global--wide-size: 1100px; }:where(body) { margin: 0; }.wp-site-blocks { padding-top: var(--wp--style--root--padding-top); padding-bottom: var(--wp--style--root--padding-bottom); }.has-global-padding { padding-right: var(--wp--style--root--padding-right); padding-left: var(--wp--style--root--padding-left); }.has-global-padding > .alignfull { margin-right: calc(var(--wp--style--root--padding-right) * -1); margin-left: calc(var(--wp--style--root--padding-left) * -1); }.has-global-padding :where(:not(.alignfull.is-layout-flow) > .has-global-padding:not(.wp-block-block, .alignfull)) { padding-right: 0; padding-left: 0; }.has-global-padding :where(:not(.alignfull.is-layout-flow) > .has-global-padding:not(.wp-block-block, .alignfull)) > .alignfull { margin-left: 0; margin-right: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }:where(.wp-site-blocks) > * { margin-block-start: 1.5rem; margin-block-end: 0; }:where(.wp-site-blocks) > :first-child { margin-block-start: 0; }:where(.wp-site-blocks) > :last-child { margin-block-end: 0; }:root { --wp--style--block-gap: 1.5rem; }:root :where(.is-layout-flow) > :first-child{margin-block-start: 0;}:root :where(.is-layout-flow) > :last-child{margin-block-end: 0;}:root :where(.is-layout-flow) > *{margin-block-start: 1.5rem;margin-block-end: 0;}:root :where(.is-layout-constrained) > :first-child{margin-block-start: 0;}:root :where(.is-layout-constrained) > :last-child{margin-block-end: 0;}:root :where(.is-layout-constrained) > *{margin-block-start: 1.5rem;margin-block-end: 0;}:root :where(.is-layout-flex){gap: 1.5rem;}:root :where(.is-layout-grid){gap: 1.5rem;}.is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{background-color: var(--wp--preset--color--background);color: var(--wp--preset--color--foreground);font-family: var(--wp--preset--font-family--baloo-2);font-size: var(--wp--preset--font-size--medium);line-height: 1.6;--wp--style--root--padding-top: 7rem;--wp--style--root--padding-right: var(--wp--preset--spacing--50);--wp--style--root--padding-bottom: 7rem;--wp--style--root--padding-left: var(--wp--preset--spacing--50);}a:where(:not(.wp-element-button)){color: var(--wp--preset--color--primary);font-family: var(--wp--preset--font-family--baloo-2);font-size: var(--wp--preset--font-size--medium);}:root :where(a:where(:not(.wp-element-button)):hover){text-decoration: none;}h1, h2, h3, h4, h5, h6{font-family: var(--wp--preset--font-family--baloo-2);font-style: normal;font-weight: 400;line-height: 1.125;}h1{font-family: var(--wp--preset--font-family--baloo-2);font-size: var(--wp--preset--font-size--x-large);}h2{font-family: var(--wp--preset--font-family--baloo-2);font-size: var(--wp--preset--font-size--large);}h3{font-family: var(--wp--preset--font-family--baloo-2);font-size: clamp(1.5rem, calc(1.5rem + ((1vw - 0.48rem) * 0.4808)), 1.75rem);}h4{font-family: var(--wp--preset--font-family--baloo-2);font-size: clamp(1.25rem, calc(1.25rem + ((1vw - 0.48rem) * 0.4808)), 1.5rem);}h5{font-family: var(--wp--preset--font-family--baloo-2);font-size: var(--wp--preset--font-size--medium);}h6{font-family: var(--wp--preset--font-family--baloo-2);font-size: var(--wp--preset--font-size--small);}:root :where(.wp-element-button, .wp-block-button__link){background-color: var(--wp--preset--color--primary);border-radius: 0.25rem;border-width: 0;color: var(--wp--preset--color--background);font-family: var(--wp--preset--font-family--baloo-2);font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}:root :where(.wp-element-button:hover, .wp-block-button__link:hover){background-color: var(--wp--preset--color--secondary);color: var(--wp--preset--color--background);}:root :where(.wp-element-button:focus, .wp-block-button__link:focus){background-color: var(--wp--preset--color--primary);color: var(--wp--preset--color--background);outline-color: var(--wp--preset--color--primary);outline-offset: 2px;outline-style: dotted;outline-width: 1px;}:root :where(.wp-element-button:active, .wp-block-button__link:active){background-color: var(--wp--preset--color--primary);color: var(--wp--preset--color--background);}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-primary-color{color: var(--wp--preset--color--primary) !important;}.has-secondary-color{color: var(--wp--preset--color--secondary) !important;}.has-foreground-color{color: var(--wp--preset--color--foreground) !important;}.has-background-color{color: var(--wp--preset--color--background) !important;}.has-tertiary-color{color: var(--wp--preset--color--tertiary) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-primary-background-color{background-color: var(--wp--preset--color--primary) !important;}.has-secondary-background-color{background-color: var(--wp--preset--color--secondary) !important;}.has-foreground-background-color{background-color: var(--wp--preset--color--foreground) !important;}.has-background-background-color{background-color: var(--wp--preset--color--background) !important;}.has-tertiary-background-color{background-color: var(--wp--preset--color--tertiary) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-primary-border-color{border-color: var(--wp--preset--color--primary) !important;}.has-secondary-border-color{border-color: var(--wp--preset--color--secondary) !important;}.has-foreground-border-color{border-color: var(--wp--preset--color--foreground) !important;}.has-background-border-color{border-color: var(--wp--preset--color--background) !important;}.has-tertiary-border-color{border-color: var(--wp--preset--color--tertiary) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}.has-albert-sans-font-family{font-family: var(--wp--preset--font-family--albert-sans) !important;}.has-alegreya-font-family{font-family: var(--wp--preset--font-family--alegreya) !important;}.has-arvo-font-family{font-family: var(--wp--preset--font-family--arvo) !important;}.has-bodoni-moda-font-family{font-family: var(--wp--preset--font-family--bodoni-moda) !important;}.has-bricolage-grotesque-font-family{font-family: var(--wp--preset--font-family--bricolage-grotesque) !important;}.has-cabin-font-family{font-family: var(--wp--preset--font-family--cabin) !important;}.has-chivo-font-family{font-family: var(--wp--preset--font-family--chivo) !important;}.has-commissioner-font-family{font-family: var(--wp--preset--font-family--commissioner) !important;}.has-cormorant-font-family{font-family: var(--wp--preset--font-family--cormorant) !important;}.has-courier-prime-font-family{font-family: var(--wp--preset--font-family--courier-prime) !important;}.has-crimson-pro-font-family{font-family: var(--wp--preset--font-family--crimson-pro) !important;}.has-dm-mono-font-family{font-family: var(--wp--preset--font-family--dm-mono) !important;}.has-dm-sans-font-family{font-family: var(--wp--preset--font-family--dm-sans) !important;}.has-dm-serif-display-font-family{font-family: var(--wp--preset--font-family--dm-serif-display) !important;}.has-domine-font-family{font-family: var(--wp--preset--font-family--domine) !important;}.has-eb-garamond-font-family{font-family: var(--wp--preset--font-family--eb-garamond) !important;}.has-epilogue-font-family{font-family: var(--wp--preset--font-family--epilogue) !important;}.has-fahkwang-font-family{font-family: var(--wp--preset--font-family--fahkwang) !important;}.has-figtree-font-family{font-family: var(--wp--preset--font-family--figtree) !important;}.has-fira-sans-font-family{font-family: var(--wp--preset--font-family--fira-sans) !important;}.has-fjalla-one-font-family{font-family: var(--wp--preset--font-family--fjalla-one) !important;}.has-fraunces-font-family{font-family: var(--wp--preset--font-family--fraunces) !important;}.has-gabarito-font-family{font-family: var(--wp--preset--font-family--gabarito) !important;}.has-ibm-plex-mono-font-family{font-family: var(--wp--preset--font-family--ibm-plex-mono) !important;}.has-ibm-plex-sans-font-family{font-family: var(--wp--preset--font-family--ibm-plex-sans) !important;}.has-ibarra-real-nova-font-family{font-family: var(--wp--preset--font-family--ibarra-real-nova) !important;}.has-instrument-serif-font-family{font-family: var(--wp--preset--font-family--instrument-serif) !important;}.has-inter-font-family{font-family: var(--wp--preset--font-family--inter) !important;}.has-josefin-sans-font-family{font-family: var(--wp--preset--font-family--josefin-sans) !important;}.has-jost-font-family{font-family: var(--wp--preset--font-family--jost) !important;}.has-libre-baskerville-font-family{font-family: var(--wp--preset--font-family--libre-baskerville) !important;}.has-libre-franklin-font-family{font-family: var(--wp--preset--font-family--libre-franklin) !important;}.has-literata-font-family{font-family: var(--wp--preset--font-family--literata) !important;}.has-lora-font-family{font-family: var(--wp--preset--font-family--lora) !important;}.has-merriweather-font-family{font-family: var(--wp--preset--font-family--merriweather) !important;}.has-montserrat-font-family{font-family: var(--wp--preset--font-family--montserrat) !important;}.has-newsreader-font-family{font-family: var(--wp--preset--font-family--newsreader) !important;}.has-noto-sans-mono-font-family{font-family: var(--wp--preset--font-family--noto-sans-mono) !important;}.has-nunito-font-family{font-family: var(--wp--preset--font-family--nunito) !important;}.has-open-sans-font-family{font-family: var(--wp--preset--font-family--open-sans) !important;}.has-overpass-font-family{font-family: var(--wp--preset--font-family--overpass) !important;}.has-pt-serif-font-family{font-family: var(--wp--preset--font-family--pt-serif) !important;}.has-petrona-font-family{font-family: var(--wp--preset--font-family--petrona) !important;}.has-piazzolla-font-family{font-family: var(--wp--preset--font-family--piazzolla) !important;}.has-playfair-display-font-family{font-family: var(--wp--preset--font-family--playfair-display) !important;}.has-plus-jakarta-sans-font-family{font-family: var(--wp--preset--font-family--plus-jakarta-sans) !important;}.has-poppins-font-family{font-family: var(--wp--preset--font-family--poppins) !important;}.has-raleway-font-family{font-family: var(--wp--preset--font-family--raleway) !important;}.has-roboto-font-family{font-family: var(--wp--preset--font-family--roboto) !important;}.has-roboto-slab-font-family{font-family: var(--wp--preset--font-family--roboto-slab) !important;}.has-rubik-font-family{font-family: var(--wp--preset--font-family--rubik) !important;}.has-rufina-font-family{font-family: var(--wp--preset--font-family--rufina) !important;}.has-sora-font-family{font-family: var(--wp--preset--font-family--sora) !important;}.has-source-sans-3-font-family{font-family: var(--wp--preset--font-family--source-sans-3) !important;}.has-source-serif-4-font-family{font-family: var(--wp--preset--font-family--source-serif-4) !important;}.has-space-mono-font-family{font-family: var(--wp--preset--font-family--space-mono) !important;}.has-syne-font-family{font-family: var(--wp--preset--font-family--syne) !important;}.has-texturina-font-family{font-family: var(--wp--preset--font-family--texturina) !important;}.has-urbanist-font-family{font-family: var(--wp--preset--font-family--urbanist) !important;}.has-work-sans-font-family{font-family: var(--wp--preset--font-family--work-sans) !important;}.has-system-font-font-family{font-family: var(--wp--preset--font-family--system-font) !important;}.has-albura-font-family{font-family: var(--wp--preset--font-family--albura) !important;}.has-albura-light-font-family{font-family: var(--wp--preset--font-family--albura-light) !important;}.has-albura-semibold-font-family{font-family: var(--wp--preset--font-family--albura-semibold) !important;}.has-baloo-2-font-family{font-family: var(--wp--preset--font-family--baloo-2) !important;}.has-recursive-font-family{font-family: var(--wp--preset--font-family--recursive) !important;}/* IgnoreThemeCustomCSS */
|
||
|
||
input {
|
||
font-family: "Baloo 2"
|
||
}
|
||
|
||
.enlighter-default {
|
||
font-family: "Recursive", "Source Code Pro", "Liberation Mono", "Courier New", Courier, monospace;
|
||
/* set variation axis values */
|
||
--mono: "MONO" 1;
|
||
|
||
/* Monospace: Sans (natural-width) or Mono (fixed-width) */
|
||
--casl: "CASL" 1;
|
||
|
||
/* Casual: Linear to Casual */
|
||
--wght: "wght" 650;
|
||
|
||
/* Weight: Light to ExtraBlack; usually set with `font-weight` */
|
||
--slnt: "slnt" -15;
|
||
|
||
/* Slant: 0 to -15 degrees, auto cursive at -14 */
|
||
--CRSV: "CRSV" 1;
|
||
/* Cursive: always roman, auto substitution, or always cursive */
|
||
|
||
/* apply axis values with CSS custom properties */
|
||
font-variation-settings: var(--mono), var(--casl), var(--wght), var(--slnt), var(--CRSV);
|
||
}
|
||
|
||
|
||
.my-underline-only-on-hover-a-tag {
|
||
text-decoration: none;
|
||
}
|
||
|
||
.my-underline-only-on-hover-a-tag:hover {
|
||
text-decoration: underline;
|
||
}
|
||
:root :where(p){font-size: clamp(0.957rem, 0.957rem + ((1vw - 0.2rem) * 1.011), 1.45rem);letter-spacing: 0em;line-height: 1.4;text-transform: none;}
|
||
:root :where(.wp-block-post-content){text-transform: none;}
|
||
:root :where(.wp-block-post-date){color: var(--wp--preset--color--foreground);font-size: var(--wp--preset--font-size--small);}
|
||
:root :where(.wp-block-post-date a:where(:not(.wp-element-button))){text-decoration: none;}
|
||
:root :where(.wp-block-post-date a:where(:not(.wp-element-button)):hover){text-decoration: underline;}
|
||
:root :where(.wp-block-post-navigation-link){font-size: clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.051), 0.9rem);letter-spacing: 0.04em;text-transform: uppercase;}
|
||
:root :where(.wp-block-post-title){font-family: var(--wp--preset--font-family--albura-semibold);margin-bottom: 0;}
|
||
:root :where(.wp-block-post-title a:where(:not(.wp-element-button))){text-decoration: none;}
|
||
:root :where(.wp-block-post-title a:where(:not(.wp-element-button)):hover){text-decoration: underline;}
|
||
:root :where(.wp-block-quote){border-color: var(--wp--preset--color--primary);border-width: 0 0 0 1px;border-style: solid;font-style: normal;padding-left: var(--wp--preset--spacing--50);}
|
||
/*# sourceURL=global-styles-inline-css */
|
||
</style>
|
||
<style id="core-block-supports-inline-css">
|
||
.wp-container-core-group-is-layout-4656884f > *{margin-block-start:0;margin-block-end:0;}.wp-container-core-group-is-layout-4656884f > * + *{margin-block-start:2px;margin-block-end:0;}.wp-container-core-group-is-layout-1ccc30ea{gap:20px;flex-direction:column;align-items:flex-start;}.wp-container-core-group-is-layout-08aa00d2{flex-wrap:nowrap;gap:10px;}.wp-container-core-columns-is-layout-a8dc44b9{flex-wrap:nowrap;gap:40px 40px;}.wp-container-core-group-is-layout-f56f613f{flex-wrap:nowrap;}
|
||
/*# sourceURL=core-block-supports-inline-css */
|
||
</style>
|
||
<style id="jetpack-stats-inline-css">
|
||
img#wpstats{display:none}
|
||
/*# sourceURL=jetpack-stats-inline-css */
|
||
</style>
|
||
<link rel='stylesheet' id='all-css-e19d3dcbb8c750460ec275119c30cf9f' href='https://blog.eightnoteight.dev/_static/??wp-content/themes/bibliophile/style.css,wp-content/plugins/jetpack/modules/comments/subscription-modal-on-comment/subscription-modal.css?m=1764003632' type='text/css' media='all' />
|
||
<style id="jetpack_likes-inline-css">
|
||
#jp-post-flair{padding-top:.5em}#content div.sharedaddy,#main div.sharedaddy,div.sharedaddy{clear:both}div.sharedaddy h3.sd-title{display:inline-block;font-size:9pt;font-weight:700;line-height:1.2;margin:0 0 1em}div.sharedaddy h3.sd-title:before{border-top:1px solid #dcdcde;content:"";display:block;margin-bottom:1em;min-width:30px;width:100%}div.jetpack-likes-widget-wrapper{min-height:50px;position:relative;width:100%}div.jetpack-likes-widget-wrapper .sd-link-color{font-size:12px}div.jetpack-comment-likes-widget-wrapper{min-height:31px;position:relative;width:100%}div.jetpack-comment-likes-widget-wrapper iframe{margin-bottom:0}#likes-other-gravatars{background-color:#fff;border:1px solid #dcdcde;border-radius:4px;box-shadow:none;display:none;height:auto;max-height:240px;min-width:220px;overflow:auto;padding:9px 12px 10px;position:absolute;z-index:1000}#likes-other-gravatars *{line-height:normal}#likes-other-gravatars .likes-text{color:#101517;font-size:12px;font-weight:500;padding-bottom:8px}#likes-other-gravatars :is(li,ul){list-style-type:none;margin:0;padding:0;text-indent:0}#likes-other-gravatars li:before{content:""}#likes-other-gravatars ul.wpl-avatars{display:block;max-height:190px;overflow:auto}#likes-other-gravatars ul.wpl-avatars li{float:none;height:28px;margin:0 0 4px;width:196px}#likes-other-gravatars ul.wpl-avatars li a{align-items:center;border-bottom:none!important;display:flex;gap:8px;margin:0 2px 0 0;text-decoration:none}#likes-other-gravatars ul.wpl-avatars li a span{color:#2c3338;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#likes-other-gravatars ul.wpl-avatars li a img{background:none;border:none;border-radius:50%;box-sizing:border-box;margin:0!important;padding:1px!important;position:static}div.sd-box{border-top:1px solid #00000021}.jetpack-likes-widget-loaded iframe,.jetpack-likes-widget-loading .likes-widget-placeholder,.jetpack-likes-widget-unloaded .likes-widget-placeholder{display:block}.jetpack-likes-widget-loaded .likes-widget-placeholder,.jetpack-likes-widget-loading iframe,.jetpack-likes-widget-unloaded iframe{display:none}.comment-likes-widget,.entry-content .post-likes-widget,.post-likes-widget{border-width:0;margin:0}.comment-likes-widget-placeholder,.post-likes-widget-placeholder{border-width:0;margin:0;position:relative}.comment-likes-widget-placeholder{display:flex;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;height:18px;position:absolute}.comment-likes-widget-placeholder:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' d='M0 0h24v24H0z'/%3E%3Cpath fill='%232ea2cc' d='m12 2 2.582 6.953L22 9.257l-5.822 4.602L18.18 21 12 16.89 5.82 21l2.002-7.14L2 9.256l7.418-.304'/%3E%3C/svg%3E");background-repeat:no-repeat;background-size:16px 16px;color:#2ea2cc;content:"";display:inline-block;height:16px;padding-right:5px;position:relative;top:3px;width:16px}.post-likes-widget-placeholder .button{display:none}:is(.comment-likes-widget-placeholder,.post-likes-widget-placeholder) .loading{color:#999;font-size:12px}.comment-likes-widget-placeholder .loading{align-self:center;color:#4e4e4e;margin-top:4px;padding-left:5px}div.sharedaddy.sd-like-enabled .sd-like h3{display:none}div.sharedaddy.sd-like-enabled .sd-like .post-likes-widget{float:none;position:absolute;top:0;width:100%}.comment-likes-widget{width:100%}.cs-rating,.pd-rating{display:block!important}.sd-gplus .sd-title{display:none}@media print{.jetpack-likes-widget-wrapper{display:none}}
|
||
/*# sourceURL=https://blog.eightnoteight.dev/wp-content/plugins/jetpack/_inc/build/likes/style.min.css */
|
||
</style>
|
||
<link rel='stylesheet' id='all-css-5c27252e430688ea3c76383c86d2fdaf' href='https://blog.eightnoteight.dev/wp-content/plugins/enlighter/cache/enlighterjs.min.css?m=1776096969' type='text/css' media='all' />
|
||
<style id="jetpack-global-styles-frontend-style-inline-css">
|
||
:root { --font-headings: unset; --font-base: unset; --font-headings-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif; --font-base-default: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;}
|
||
/*# sourceURL=jetpack-global-styles-frontend-style-inline-css */
|
||
</style>
|
||
<link rel='stylesheet' id='all-css-f621c6a5733952fccb808cbb52a9d217' href='https://blog.eightnoteight.dev/_static/??wp-content/plugins/jetpack/modules/sharedaddy/sharing.css,wp-content/plugins/jetpack/_inc/build/social-logos/social-logos.css?m=1784576016' type='text/css' media='all' />
|
||
<script id="jetpack-blocks-assets-base-url-js-before">
|
||
var Jetpack_Block_Assets_Base_Url="https://blog.eightnoteight.dev/wp-content/plugins/jetpack/_inc/blocks/";
|
||
//# sourceURL=jetpack-blocks-assets-base-url-js-before
|
||
</script>
|
||
<script id="jetpack-mu-wpcom-settings-js-before">
|
||
var JETPACK_MU_WPCOM_SETTINGS = {"assetsUrl":"https://blog.eightnoteight.dev/wp-content/mu-plugins/wpcomsh/jetpack_vendor/automattic/jetpack-mu-wpcom/src/build/"};
|
||
//# sourceURL=jetpack-mu-wpcom-settings-js-before
|
||
</script>
|
||
<link rel="https://api.w.org/" href="https://blog.eightnoteight.dev/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://blog.eightnoteight.dev/wp-json/wp/v2/posts/103709805" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://blog.eightnoteight.dev/xmlrpc.php?rsd" />
|
||
|
||
<link rel="canonical" href="https://blog.eightnoteight.dev/2023/02/18/graceful-shutdown/" />
|
||
<link rel='shortlink' href='https://wp.me/pg8Llz-719EN' />
|
||
<meta name="description" content="If you are working on a go service, it’s essential to properly shut down without causing errors to clients and not losing any information while shutting down. Without a proper graceful shutdown, the clients would get errors whenever a container is shutting down on the server side. In the worst case, it could lead to…" />
|
||
|
||
<!-- Jetpack Open Graph Tags -->
|
||
<meta property="og:type" content="article" />
|
||
<meta property="og:title" content="Graceful Shutdown" />
|
||
<meta property="og:url" content="https://blog.eightnoteight.dev/2023/02/18/graceful-shutdown/" />
|
||
<meta property="og:description" content="If you are working on a go service, it’s essential to properly shut down without causing errors to clients and not losing any information while shutting down. Without a proper graceful shutdown, th…" />
|
||
<meta property="article:published_time" content="2023-02-18T17:05:13+00:00" />
|
||
<meta property="article:modified_time" content="2024-11-03T09:55:40+00:00" />
|
||
<meta property="og:site_name" content="Srinivas Devaki" />
|
||
<meta property="og:image" content="https://i0.wp.com/blog.eightnoteight.dev/wp-content/uploads/2024/10/c5417-c87b5adf-a1da-46f4-8c0e-e6b2fc8ab737_1145x654.png?fit=1145%2C654&ssl=1" />
|
||
<meta property="og:image:width" content="1145" />
|
||
<meta property="og:image:height" content="654" />
|
||
<meta property="og:image:alt" content="" />
|
||
<meta property="og:locale" content="en_GB" />
|
||
<meta name="twitter:site" content="@eightnoteight" />
|
||
<meta name="twitter:text:title" content="Graceful Shutdown" />
|
||
<meta name="twitter:image" content="https://i0.wp.com/blog.eightnoteight.dev/wp-content/uploads/2024/10/c5417-c87b5adf-a1da-46f4-8c0e-e6b2fc8ab737_1145x654.png?fit=1145%2C654&ssl=1&w=640" />
|
||
<meta name="twitter:card" content="summary_large_image" />
|
||
|
||
<!-- End Jetpack Open Graph Tags -->
|
||
<style class="wp-fonts-local">
|
||
@font-face{font-family:"Albura SemiBold";font-style:normal;font-weight:545;font-display:fallback;src:url('https://blog.eightnoteight.dev/wp-content/themes/bibliophile/assets/fonts/albura-semibold_normal_545.otf') format('opentype');}
|
||
@font-face{font-family:"Albura SemiBold";font-style:italic;font-weight:541;font-display:fallback;src:url('https://blog.eightnoteight.dev/wp-content/themes/bibliophile/assets/fonts/albura-semibold_italic_541.otf') format('opentype');}
|
||
@font-face{font-family:"Baloo 2";font-style:normal;font-weight:400;font-display:fallback;src:url('https://blog.eightnoteight.dev/wp-content/uploads/fonts/wXK0E3kTposypRydzVT08TS3JnAmtdgazapq9Fat7WcN.woff2') format('woff2');}
|
||
@font-face{font-family:"Baloo 2";font-style:normal;font-weight:500;font-display:fallback;src:url('https://blog.eightnoteight.dev/wp-content/uploads/fonts/wXK0E3kTposypRydzVT08TS3JnAmtdgozapq9Fat7WcN.woff2') format('woff2');}
|
||
@font-face{font-family:"Baloo 2";font-style:normal;font-weight:600;font-display:fallback;src:url('https://blog.eightnoteight.dev/wp-content/uploads/fonts/wXK0E3kTposypRydzVT08TS3JnAmtdjEyqpq9Fat7WcN.woff2') format('woff2');}
|
||
@font-face{font-family:"Baloo 2";font-style:normal;font-weight:700;font-display:fallback;src:url('https://blog.eightnoteight.dev/wp-content/uploads/fonts/wXK0E3kTposypRydzVT08TS3JnAmtdj9yqpq9Fat7WcN.woff2') format('woff2');}
|
||
@font-face{font-family:"Baloo 2";font-style:normal;font-weight:800;font-display:fallback;src:url('https://blog.eightnoteight.dev/wp-content/uploads/fonts/wXK0E3kTposypRydzVT08TS3JnAmtdiayqpq9Fat7WcN.woff2') format('woff2');}
|
||
</style>
|
||
<link rel="icon" href="https://i0.wp.com/blog.eightnoteight.dev/wp-content/uploads/2024/10/1725873733250.jpeg?fit=32%2C32&ssl=1" sizes="32x32" />
|
||
<link rel="icon" href="https://i0.wp.com/blog.eightnoteight.dev/wp-content/uploads/2024/10/1725873733250.jpeg?fit=192%2C192&ssl=1" sizes="192x192" />
|
||
<link rel="apple-touch-icon" href="https://i0.wp.com/blog.eightnoteight.dev/wp-content/uploads/2024/10/1725873733250.jpeg?fit=180%2C180&ssl=1" />
|
||
<meta name="msapplication-TileImage" content="https://i0.wp.com/blog.eightnoteight.dev/wp-content/uploads/2024/10/1725873733250.jpeg?fit=270%2C270&ssl=1" />
|
||
</head>
|
||
|
||
<body class="wp-singular post-template-default single single-post postid-103709805 single-format-standard wp-custom-logo wp-embed-responsive wp-theme-bibliophile is-block-theme">
|
||
<script id='jetpack-search-theme-token-sampler'>(function(){try{var c=getComputedStyle(document.body),r=document.documentElement,ink=c.color,bg=c.backgroundColor;if(ink){r.style.setProperty('--jp-search-page-ink',ink);}if(bg&&bg!==ink&&bg!=='rgba(0, 0, 0, 0)'&&bg!=='transparent'){r.style.setProperty('--jp-search-page-surface',bg);}}catch(e){}})();</script>
|
||
<div class="wp-site-blocks">
|
||
<div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained">
|
||
<div class="wp-block-columns alignwide is-layout-flex wp-container-core-columns-is-layout-a8dc44b9 wp-block-columns-is-layout-flex">
|
||
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:20%">
|
||
<div class="wp-block-group has-global-padding is-layout-constrained wp-container-core-group-is-layout-4656884f wp-block-group-is-layout-constrained">
|
||
<h3 class="wp-block-heading">Links:</h3>
|
||
|
||
|
||
|
||
<div style="height:12px" aria-hidden="true" class="wp-block-spacer"></div>
|
||
|
||
|
||
|
||
<h5 class="wp-block-heading"><a href="/">Home</a></h5>
|
||
|
||
|
||
|
||
<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>
|
||
|
||
|
||
|
||
<h5 class="wp-block-heading"><a href="https://blog.eightnoteight.dev/talks/" data-type="page" data-id="137000660">Talks</a></h5>
|
||
|
||
|
||
|
||
<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>
|
||
|
||
|
||
|
||
<h5 class="wp-block-heading"><a href="https://blog.eightnoteight.dev/pithy-quotes/" data-type="page" data-id="137000806">Pithy Quotes</a></h5>
|
||
|
||
|
||
|
||
<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>
|
||
|
||
|
||
|
||
<h5 class="wp-block-heading"><a href="https://blog.eightnoteight.dev/feed/" data-type="link" data-id="https://blog.eightnoteight.dev/feed/">RSS </a><a href="https://blog.eightnoteight.dev/feed/" data-type="link" data-id="https://blog.eightnoteight.dev/feed/" target="_blank" rel="noreferrer noopener">Feed</a></h5>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
|
||
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
|
||
<div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained">
|
||
<div class="wp-block-group is-vertical is-layout-flex wp-container-core-group-is-layout-1ccc30ea wp-block-group-is-layout-flex"><figure class="wp-block-post-featured-image"><img width="1145" height="654" src="https://blog.eightnoteight.dev/wp-content/uploads/2024/10/c5417-c87b5adf-a1da-46f4-8c0e-e6b2fc8ab737_1145x654.png" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" decoding="async" fetchpriority="high" data-attachment-id="137000457" data-permalink="https://blog.eightnoteight.dev/c87b5adf-a1da-46f4-8c0e-e6b2fc8ab737_1145x654-png/" data-orig-file="https://i0.wp.com/blog.eightnoteight.dev/wp-content/uploads/2024/10/c5417-c87b5adf-a1da-46f4-8c0e-e6b2fc8ab737_1145x654.png?fit=1145%2C654&ssl=1" data-orig-size="1145,654" data-comments-opened="1" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="c87b5adf-a1da-46f4-8c0e-e6b2fc8ab737_1145x654.png" data-image-description="" data-image-caption="" data-large-file="https://i0.wp.com/blog.eightnoteight.dev/wp-content/uploads/2024/10/c5417-c87b5adf-a1da-46f4-8c0e-e6b2fc8ab737_1145x654.png?fit=1024%2C585&ssl=1" /></figure>
|
||
|
||
<h2 style="font-style:normal;font-weight:400;text-transform:none" class="wp-block-post-title has-baloo-2-font-family">Graceful Shutdown</h2>
|
||
|
||
<div class="wp-block-template-part"><div class="wp-block-post-date"><time datetime="2023-02-18T17:05:13+05:30">18th February 2023</time></div></div></div>
|
||
|
||
|
||
|
||
<div style="height:5px" aria-hidden="true" class="wp-block-spacer"></div>
|
||
|
||
|
||
<div class="entry-content wp-block-post-content is-layout-flow wp-block-post-content-is-layout-flow">
|
||
<p class="has-medium-font-size wp-block-paragraph"></p>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph">If you are working on a go service, it’s essential to properly shut down without causing errors to clients and not losing any information while shutting down. Without a proper graceful shutdown, the clients would get errors whenever a container is shutting down on the server side. In the worst case, it could lead to data loss as well. Let’s better understand the below example.</p>
|
||
|
||
|
||
|
||
<h3 class="wp-block-heading">Simple HTTP Server</h3>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph">For example, imagine “a simple http service that logs some payloads in kafka and some are saved in mysql”. This http service running as a container in prod is essentially a system with input as incoming requests and output as the response for the incoming requests, producing messages to kafka topic, inserting into mysql using a mysql connection.</p>
|
||
|
||
|
||
|
||
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#657B83;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#fbeecb;color:#708891">Go</span><span role="button" tabindex="0" data-code="// pseudo code
|
||
func (svc Service) HandleRequest(ctx context.Context, request http.Request) (*http.Response, error) {
|
||
err := svc.mysqlClient.Query(
|
||
"INSERT INTO request_audit_log(request_payload, received_timestamp) "
|
||
+"VALUES (?, ?)",
|
||
request.Payload,
|
||
time.Now(),
|
||
)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
err := svc.kafkaClient.Produce(encode(Message{
|
||
Payload: request.Payload,
|
||
ReceivedTimestamp: time.Now(),
|
||
}))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
return &http.Response{
|
||
Payload: "success",
|
||
}, nil
|
||
}" style="color:#657B83;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki solarized-light" style="background-color: #FDF6E3" tabindex="0"><code><span class="line"><span style="color: #93A1A1; font-style: italic">// pseudo code</span></span>
|
||
<span class="line"><span style="color: #859900">func</span><span style="color: #657B83"> (svc Service) </span><span style="color: #268BD2">HandleRequest</span><span style="color: #657B83">(ctx context.Context, request http.Request) (</span><span style="color: #859900">*</span><span style="color: #657B83">http.Response, </span><span style="color: #586E75; font-weight: bold">error</span><span style="color: #657B83">) {</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #268BD2">err</span><span style="color: #657B83"> </span><span style="color: #859900">:=</span><span style="color: #657B83"> svc.mysqlClient.</span><span style="color: #268BD2">Query</span><span style="color: #657B83">(</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #2AA198">"INSERT INTO request_audit_log(request_payload, received_timestamp) "</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #859900">+</span><span style="color: #2AA198">"VALUES (?, ?)"</span><span style="color: #657B83">,</span></span>
|
||
<span class="line"><span style="color: #657B83"> request.Payload,</span></span>
|
||
<span class="line"><span style="color: #657B83"> time.</span><span style="color: #268BD2">Now</span><span style="color: #657B83">(),</span></span>
|
||
<span class="line"><span style="color: #657B83"> )</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #859900">if</span><span style="color: #657B83"> err </span><span style="color: #859900">!=</span><span style="color: #657B83"> </span><span style="color: #B58900">nil</span><span style="color: #657B83"> {</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #859900">return</span><span style="color: #657B83"> </span><span style="color: #B58900">nil</span><span style="color: #657B83">, err</span></span>
|
||
<span class="line"><span style="color: #657B83"> }</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #268BD2">err</span><span style="color: #657B83"> </span><span style="color: #859900">:=</span><span style="color: #657B83"> svc.kafkaClient.</span><span style="color: #268BD2">Produce</span><span style="color: #657B83">(</span><span style="color: #268BD2">encode</span><span style="color: #657B83">(Message{</span></span>
|
||
<span class="line"><span style="color: #657B83"> Payload: request.Payload,</span></span>
|
||
<span class="line"><span style="color: #657B83"> ReceivedTimestamp: time.</span><span style="color: #268BD2">Now</span><span style="color: #657B83">(),</span></span>
|
||
<span class="line"><span style="color: #657B83"> }))</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #859900">if</span><span style="color: #657B83"> err </span><span style="color: #859900">!=</span><span style="color: #657B83"> </span><span style="color: #B58900">nil</span><span style="color: #657B83"> {</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #859900">return</span><span style="color: #657B83"> </span><span style="color: #B58900">nil</span><span style="color: #657B83">, err</span></span>
|
||
<span class="line"><span style="color: #657B83"> }</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #859900">return</span><span style="color: #657B83"> </span><span style="color: #859900">&</span><span style="color: #657B83">http.Response{</span></span>
|
||
<span class="line"><span style="color: #657B83"> Payload: </span><span style="color: #2AA198">"success"</span><span style="color: #657B83">,</span></span>
|
||
<span class="line"><span style="color: #657B83"> }, </span><span style="color: #B58900">nil</span></span>
|
||
<span class="line"><span style="color: #657B83">}</span></span></code></pre></div>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph">As soon as this system receives a request, it can’t instantly produce all the outputs. So there is a delay between receiving the incoming request and generating all the necessary outputs. From the above request, we could infer the order of outputs, i.e. the first output is MySQL, and then kafka and finally, response.</p>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph">So to gracefully shut down the application, we could just stop the incoming requests from the system and then just wait for the response output for all the corresponding incoming requests. and this is exactly what <code>http.Server</code> does when you trigger <code>srv.Shutdown(ctx)</code></p>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph"><a href="https://pkg.go.dev/net/http#Server.Shutdown">https://pkg.go.dev/net/http#Server.Shutdown</a></p>
|
||
|
||
|
||
|
||
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
|
||
<p class="has-medium-font-size wp-block-paragraph"><code>func (srv *Server) Shutdown(ctx context.Context) error</code></p>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph">Shutdown gracefully shuts down the server without interrupting any active connections. Shutdown works by first closing all open listeners, then closing all idle connections, and then waiting indefinitely for connections to return to idle and then shut down. If the provided context expires before the shutdown is complete, Shutdown returns the context’s error, otherwise it returns any error returned from closing the Server’s underlying Listener(s).</p>
|
||
</blockquote>
|
||
|
||
|
||
|
||
<h3 class="wp-block-heading">Outputs of the System outside the Request/Response Lifecycle</h3>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph">So it is simple, we need to hook up the <code>Shutdown</code> function with <code>SIGTERM</code>, <code>SIGINT</code> signals and we are set, right? Well, no. Let’s tweak the above HTTP server a little bit by changing the kafka producer from <strong>sync</strong> to <strong>async</strong> producer, here the async producer will buffer the produced records in memory and flush out to kafka at regular intervals, so the kafka output of the system could come after the response output of the system. the same principle applies to other kinds of in-memory buffers, worker pools, stray go-routines, MySQL connections, redis connections etc.</p>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph">In this case, you would start noticing drops in messages during deploys, container rotation, and normal scale-down.</p>
|
||
|
||
|
||
|
||
<figure class="wp-block-image size-large"><img data-recalc-dims="1" decoding="async" src="https://i0.wp.com/blog.eightnoteight.dev/wp-content/uploads/2024/10/6f228-23435c35-f9d5-41f9-a4a7-22a60091161f_4111x2370.png?ssl=1" alt=""/></figure>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph">So now, the graceful shutdown needs to be applied to the kafka producer as well, and every other component that maintains buffers or any other resources(connections, goroutines etc.) with it even after the lifecycle of the request/response.</p>
|
||
|
||
|
||
|
||
<h3 class="wp-block-heading">Order of Packages Graceful Shutdown</h3>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph">from the above example, if we gracefully stop the kafka producer first, then until the HTTP server is stopped, requests that write any data to kafka will get errors. And the same would happen if parallelly try to gracefully stop the async kafka producer and HTTP server. so the order of shutting down individual packages of the system is essential.</p>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph">Here the order comes from the fact that the kafka producer needs to be passed to the HTTP server handler, so until the server is shut down, it is not safe to close the kafka producer as the handler could use the kafka producer object anytime.</p>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph">For more complex systems, there could be multiple levels of buffers and ongoing operations like the above HTTP server example. So we must strictly follow a proper order when shutting down the packages.</p>
|
||
|
||
|
||
|
||
<h3 class="wp-block-heading">Dependency Injection FTW</h3>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph">After some thinking, it is straightforward to reason that we need to gracefully shut down all the dependers of a package before shutting down the package itself. We already know the dependers during the program’s startup as we would have manually wired them together using dependency injection. The shutdown order needs to replicate the startup dependency injection in reverse; this way, whenever we are trying to gracefully shut down a component, we can be relieved that no one else is in possession of that component object and still using it.</p>
|
||
|
||
|
||
|
||
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#657B83;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#fbeecb;color:#708891">Go</span><span role="button" tabindex="0" data-code="// pseudo code
|
||
func main() {
|
||
mysqlClient := NewMySQLClient()
|
||
kafkaProducerClient := NewKafkaProducerClient()
|
||
svc := NewService(
|
||
mysqlClient,
|
||
kafkaProducerClient
|
||
)
|
||
httpServer := http.NewServer()
|
||
httpServer.Register("/", svc.HandleRequest)
|
||
httpServer.ListenAndServeNonBlocking()
|
||
|
||
// unblock once there is a graceful shutdown signal
|
||
<- signal.Notify(signal.SIGINT, signal.SIGTERM)
|
||
|
||
// creation order is
|
||
// 1. mysql client
|
||
// 2. kafka producer client
|
||
// 3. http request handler service
|
||
// 4. http server
|
||
|
||
// so now the shutdown order needs to be exactly reverse
|
||
// 1. http server
|
||
// 2. http request handler service
|
||
// 3. kafka producer client
|
||
// 4. mysql client
|
||
|
||
// http.Server will make sure to stop accepting new requests
|
||
httpServer.Close()
|
||
// in case the request handler maintains any buffers or state, this will trigger the necessary cleanup
|
||
svc.Close()
|
||
// kafka producer client will flush all the data it buffered to the kafka and close connections
|
||
kafkaProducerClient.Close()
|
||
// mysql client will gracefully close all the connections and makes sure that
|
||
mysqlClient.Close()
|
||
}" style="color:#657B83;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki solarized-light" style="background-color: #FDF6E3" tabindex="0"><code><span class="line"><span style="color: #93A1A1; font-style: italic">// pseudo code</span></span>
|
||
<span class="line"><span style="color: #859900">func</span><span style="color: #657B83"> </span><span style="color: #268BD2">main</span><span style="color: #657B83">() {</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #268BD2">mysqlClient</span><span style="color: #657B83"> </span><span style="color: #859900">:=</span><span style="color: #657B83"> </span><span style="color: #268BD2">NewMySQLClient</span><span style="color: #657B83">()</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #268BD2">kafkaProducerClient</span><span style="color: #657B83"> </span><span style="color: #859900">:=</span><span style="color: #657B83"> </span><span style="color: #268BD2">NewKafkaProducerClient</span><span style="color: #657B83">()</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #268BD2">svc</span><span style="color: #657B83"> </span><span style="color: #859900">:=</span><span style="color: #657B83"> </span><span style="color: #268BD2">NewService</span><span style="color: #657B83">(</span></span>
|
||
<span class="line"><span style="color: #657B83"> mysqlClient,</span></span>
|
||
<span class="line"><span style="color: #657B83"> kafkaProducerClient</span></span>
|
||
<span class="line"><span style="color: #657B83"> )</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #268BD2">httpServer</span><span style="color: #657B83"> </span><span style="color: #859900">:=</span><span style="color: #657B83"> http.</span><span style="color: #268BD2">NewServer</span><span style="color: #657B83">()</span></span>
|
||
<span class="line"><span style="color: #657B83"> httpServer.</span><span style="color: #268BD2">Register</span><span style="color: #657B83">(</span><span style="color: #2AA198">"/"</span><span style="color: #657B83">, svc.HandleRequest)</span></span>
|
||
<span class="line"><span style="color: #657B83"> httpServer.</span><span style="color: #268BD2">ListenAndServeNonBlocking</span><span style="color: #657B83">()</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// unblock once there is a graceful shutdown signal</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #859900"><-</span><span style="color: #657B83"> signal.</span><span style="color: #268BD2">Notify</span><span style="color: #657B83">(signal.SIGINT, signal.SIGTERM)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// creation order is</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// 1. mysql client</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// 2. kafka producer client</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// 3. http request handler service</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// 4. http server</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// so now the shutdown order needs to be exactly reverse</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// 1. http server</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// 2. http request handler service</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// 3. kafka producer client</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// 4. mysql client</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// http.Server will make sure to stop accepting new requests</span></span>
|
||
<span class="line"><span style="color: #657B83"> httpServer.</span><span style="color: #268BD2">Close</span><span style="color: #657B83">() </span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// in case the request handler maintains any buffers or state, this will trigger the necessary cleanup</span></span>
|
||
<span class="line"><span style="color: #657B83"> svc.</span><span style="color: #268BD2">Close</span><span style="color: #657B83">()</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// kafka producer client will flush all the data it buffered to the kafka and close connections</span></span>
|
||
<span class="line"><span style="color: #657B83"> kafkaProducerClient.</span><span style="color: #268BD2">Close</span><span style="color: #657B83">()</span></span>
|
||
<span class="line"><span style="color: #657B83"> </span><span style="color: #93A1A1; font-style: italic">// mysql client will gracefully close all the connections and makes sure that </span></span>
|
||
<span class="line"><span style="color: #657B83"> mysqlClient.</span><span style="color: #268BD2">Close</span><span style="color: #657B83">()</span></span>
|
||
<span class="line"><span style="color: #657B83">}</span></span></code></pre></div>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph">Not following dependency injection or using global packages, or using cyclic dependencies in the code significantly complicates the graceful shutdown logic and makes it harder to gracefully shutdown in all scenarios.</p>
|
||
|
||
|
||
|
||
<h3 class="wp-block-heading">Conclusion</h3>
|
||
|
||
|
||
|
||
<p class="has-medium-font-size wp-block-paragraph">While the graceful shutdown is widely documented, it is also very important to note about the <strong>component’s shutdown order</strong>. Following Dependency Injection will indirectly provide a way to figure out what is the right order of component’s shutdown.</p>
|
||
<div class="sharedaddy sd-sharing-enabled"><div class="robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing"><h3 class="sd-title">Share this:</h3><div class="sd-content"><ul><li class="share-x"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-x-103709805"
|
||
class="share-x sd-button share-icon"
|
||
href="https://blog.eightnoteight.dev/2023/02/18/graceful-shutdown/?share=x"
|
||
target="_blank"
|
||
aria-labelledby="sharing-x-103709805"
|
||
>
|
||
<span id="sharing-x-103709805" hidden>Share on X (Opens in new window)</span>
|
||
<span>X</span>
|
||
</a></li><li class="share-linkedin"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-linkedin-103709805"
|
||
class="share-linkedin sd-button share-icon"
|
||
href="https://blog.eightnoteight.dev/2023/02/18/graceful-shutdown/?share=linkedin"
|
||
target="_blank"
|
||
aria-labelledby="sharing-linkedin-103709805"
|
||
>
|
||
<span id="sharing-linkedin-103709805" hidden>Share on LinkedIn (Opens in new window)</span>
|
||
<span>LinkedIn</span>
|
||
</a></li><li class="share-threads"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-threads-103709805"
|
||
class="share-threads sd-button share-icon"
|
||
href="https://blog.eightnoteight.dev/2023/02/18/graceful-shutdown/?share=threads"
|
||
target="_blank"
|
||
aria-labelledby="sharing-threads-103709805"
|
||
>
|
||
<span id="sharing-threads-103709805" hidden>Share on Threads (Opens in new window)</span>
|
||
<span>Threads</span>
|
||
</a></li><li class="share-reddit"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-reddit-103709805"
|
||
class="share-reddit sd-button share-icon"
|
||
href="https://blog.eightnoteight.dev/2023/02/18/graceful-shutdown/?share=reddit"
|
||
target="_blank"
|
||
aria-labelledby="sharing-reddit-103709805"
|
||
>
|
||
<span id="sharing-reddit-103709805" hidden>Share on Reddit (Opens in new window)</span>
|
||
<span>Reddit</span>
|
||
</a></li><li class="share-facebook"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-facebook-103709805"
|
||
class="share-facebook sd-button share-icon"
|
||
href="https://blog.eightnoteight.dev/2023/02/18/graceful-shutdown/?share=facebook"
|
||
target="_blank"
|
||
aria-labelledby="sharing-facebook-103709805"
|
||
>
|
||
<span id="sharing-facebook-103709805" hidden>Share on Facebook (Opens in new window)</span>
|
||
<span>Facebook</span>
|
||
</a></li><li class="share-email"><a rel="nofollow noopener noreferrer"
|
||
data-shared="sharing-email-103709805"
|
||
class="share-email sd-button share-icon"
|
||
href="mailto:?subject=%5BShared%20Post%5D%20Graceful%20Shutdown&body=https%3A%2F%2Fblog.eightnoteight.dev%2F2023%2F02%2F18%2Fgraceful-shutdown%2F&share=email"
|
||
target="_blank"
|
||
aria-labelledby="sharing-email-103709805"
|
||
data-email-share-error-title="Do you have email set up?" data-email-share-error-text="If you're having problems sharing via email, you might not have email set up for your browser. You may need to create a new email yourself." data-email-share-nonce="9e75e0d01b" data-email-share-track-url="https://blog.eightnoteight.dev/2023/02/18/graceful-shutdown/?share=email">
|
||
<span id="sharing-email-103709805" hidden>Email a link to a friend (Opens in new window)</span>
|
||
<span>Email</span>
|
||
</a></li><li class="share-end"></li></ul></div></div></div></div>
|
||
|
||
|
||
<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>
|
||
|
||
|
||
|
||
<div class="wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-08aa00d2 wp-block-group-is-layout-flex"><div class="post-navigation-link-next wp-block-post-navigation-link"><a href="https://blog.eightnoteight.dev/2023/02/26/health-checking/" rel="next">Health Checking</a><span class="wp-block-post-navigation-link__arrow-next is-arrow-chevron" aria-hidden="true">»</span></div></div>
|
||
|
||
|
||
|
||
<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>
|
||
|
||
|
||
<div class="wp-block-jetpack-subscriptions__supports-newline wp-block-jetpack-subscriptions">
|
||
<div class="wp-block-jetpack-subscriptions__container is-not-subscriber">
|
||
<form
|
||
action="https://wordpress.com/email-subscriptions"
|
||
method="post"
|
||
accept-charset="utf-8"
|
||
data-blog="238510005"
|
||
data-post_access_level="everybody"
|
||
data-subscriber_email=""
|
||
id="subscribe-blog"
|
||
>
|
||
<div class="wp-block-jetpack-subscriptions__form-elements">
|
||
<p id="subscribe-email">
|
||
<label
|
||
id="subscribe-field-label"
|
||
for="subscribe-field"
|
||
class="screen-reader-text"
|
||
>
|
||
Type your email… </label>
|
||
<input
|
||
required="required"
|
||
type="email"
|
||
name="email"
|
||
autocomplete="email"
|
||
class="no-border-radius "
|
||
style="font-size: 16px;padding: 15px 23px 15px 23px;border-radius: 0px;border-width: 1px;"
|
||
placeholder="Type your email…"
|
||
value=""
|
||
id="subscribe-field"
|
||
title="Please fill in this field."
|
||
/> </p>
|
||
<p id="subscribe-submit"
|
||
>
|
||
<input type="hidden" name="action" value="subscribe"/>
|
||
<input type="hidden" name="blog_id" value="238510005"/>
|
||
<input type="hidden" name="source" value="https://blog.eightnoteight.dev/2023/02/18/graceful-shutdown/"/>
|
||
<input type="hidden" name="sub-type" value="subscribe-block"/>
|
||
<input type="hidden" name="app_source" value=""/>
|
||
<input type="hidden" name="redirect_fragment" value="subscribe-blog"/>
|
||
<input type="hidden" name="lang" value="en_GB"/>
|
||
<input type="hidden" id="_wpnonce" name="_wpnonce" value="9a1bc89944" /><input type="hidden" name="_wp_http_referer" value="/2023/02/18/graceful-shutdown/" /><input type="hidden" name="post_id" value="103709805"/> <button type="submit"
|
||
class="wp-block-button__link no-border-radius"
|
||
style="font-size: 16px;padding: 15px 23px 15px 23px;margin: 0; margin-left: 10px;border-radius: 0px;border-width: 1px;"
|
||
name="jetpack_subscriptions_widget"
|
||
>
|
||
Subscribe </button>
|
||
</p>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
<footer class="alignwide wp-block-template-part">
|
||
<div style="height:var(--wp--preset--spacing--80)" aria-hidden="true" class="wp-block-spacer"></div>
|
||
|
||
|
||
|
||
<div class="wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained">
|
||
<div class="wp-block-group alignwide is-nowrap is-layout-flex wp-container-core-group-is-layout-f56f613f wp-block-group-is-layout-flex"></div>
|
||
</div>
|
||
|
||
|
||
|
||
<div style="height:var(--wp--preset--spacing--80)" aria-hidden="true" class="wp-block-spacer"></div>
|
||
</footer></div>
|
||
</div>
|
||
<!-- wpcom_wp_footer -->
|
||
<script type="speculationrules">
|
||
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/bibliophile/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
|
||
</script>
|
||
<meta id="bilmur" property="bilmur:data" content="" data-customproperties="{"woo_active":"0","logged_in":"0","wptheme":"bibliophile","wptheme_is_block":"1"}" data-provider="wordpress.com" data-service="atomic" data-site-tz="Asia/Kolkata" >
|
||
<script defer src="https://s0.wp.com/wp-content/js/bilmur.min.js?m=202637"></script>
|
||
<div class="jetpack-subscription-modal">
|
||
<div class="jetpack-subscription-modal__modal-content">
|
||
|
||
<div class="wp-block-group has-border-color jetpack-subscription-modal__modal-content-form is-layout-flow wp-block-group-is-layout-flow" style="border-color:#dddddd;border-width:1px;margin-top:0;margin-bottom:0;padding:32px">
|
||
|
||
|
||
<h2 class="wp-block-heading has-text-align-center" style="margin-top:4px;margin-bottom:10px;font-size:clamp(16.834px, 1.052rem + ((1vw - 3.2px) * 1.175), 26px);font-style:normal;font-weight:600">Discover more from Srinivas Devaki</h2>
|
||
|
||
|
||
|
||
<p class="has-text-align-center wp-block-paragraph" style='margin-top:4px;margin-bottom:0px;font-size:clamp(14px, 0.875rem + ((1vw - 3.2px) * 0.128), 15px);'>Subscribe now to keep reading and get access to the full archive.</p>
|
||
|
||
|
||
<div class="wp-block-jetpack-subscriptions__supports-newline is-style-compact wp-block-jetpack-subscriptions">
|
||
<div class="wp-block-jetpack-subscriptions__container is-not-subscriber">
|
||
<form
|
||
action="https://wordpress.com/email-subscriptions"
|
||
method="post"
|
||
accept-charset="utf-8"
|
||
data-blog="238510005"
|
||
data-post_access_level="everybody"
|
||
data-subscriber_email=""
|
||
id="subscribe-blog-2"
|
||
>
|
||
<div class="wp-block-jetpack-subscriptions__form-elements">
|
||
<p id="subscribe-email">
|
||
<label
|
||
id="subscribe-field-2-label"
|
||
for="subscribe-field-2"
|
||
class="screen-reader-text"
|
||
>
|
||
Type your email… </label>
|
||
<input
|
||
required="required"
|
||
type="email"
|
||
name="email"
|
||
autocomplete="email"
|
||
|
||
style="font-size: 16px;padding: 15px 23px 15px 23px;border-radius: 50px;border-width: 1px;"
|
||
placeholder="Type your email…"
|
||
value=""
|
||
id="subscribe-field-2"
|
||
title="Please fill in this field."
|
||
/> </p>
|
||
<p id="subscribe-submit"
|
||
>
|
||
<input type="hidden" name="action" value="subscribe"/>
|
||
<input type="hidden" name="blog_id" value="238510005"/>
|
||
<input type="hidden" name="source" value="https://blog.eightnoteight.dev/2023/02/18/graceful-shutdown/"/>
|
||
<input type="hidden" name="sub-type" value="subscribe-block"/>
|
||
<input type="hidden" name="app_source" value="atomic-subscription-modal-lo"/>
|
||
<input type="hidden" name="redirect_fragment" value="subscribe-blog-2"/>
|
||
<input type="hidden" name="lang" value="en_GB"/>
|
||
<input type="hidden" id="_wpnonce" name="_wpnonce" value="9a1bc89944" /><input type="hidden" name="_wp_http_referer" value="/2023/02/18/graceful-shutdown/" /><input type="hidden" name="post_id" value="103709805"/> <button type="submit"
|
||
class="wp-block-button__link"
|
||
style="font-size: 16px;padding: 15px 23px 15px 23px;margin: 0; margin-left: 10px;border-radius: 50px;border-width: 1px;"
|
||
name="jetpack_subscriptions_widget"
|
||
>
|
||
Subscribe </button>
|
||
</p>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
|
||
<p class="has-text-align-center jetpack-subscription-modal__close wp-block-paragraph" style="margin-top:20px;font-size:14px"><a href="#">Continue reading</a></p>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<script type="text/javascript">
|
||
window.WPCOM_sharing_counts = {"https://blog.eightnoteight.dev/2023/02/18/graceful-shutdown/":103709805};
|
||
</script>
|
||
<script data-wp-strategy="defer" id="kevinbatdorf-code-block-pro-view-script-js" src="https://blog.eightnoteight.dev/wp-content/plugins/code-block-pro/build/front/front.js?ver=897e78bb623a899126f1"></script>
|
||
<script id="kevinbatdorf-code-block-pro-view-script-js-after">
|
||
window.codeBlockPro = {"pluginUrl":"https:\/\/blog.eightnoteight.dev\/wp-content\/plugins\/code-block-pro\/"};
|
||
//# sourceURL=kevinbatdorf-code-block-pro-view-script-js-after
|
||
</script>
|
||
<script id="wp-dom-ready-js" src="https://blog.eightnoteight.dev/wp-content/plugins/gutenberg/build/scripts/dom-ready/index.min.js?ver=3fe927cab37bf38d6a23"></script>
|
||
<script type='text/javascript' src='https://blog.eightnoteight.dev/wp-includes/js/dist/vendor/wp-polyfill.min.js?m=1784059681'></script>
|
||
<script data-wp-strategy="defer" defer id="jetpack-block-subscriptions-js" src="https://blog.eightnoteight.dev/wp-content/plugins/jetpack/_inc/blocks/subscriptions/view.js?minify=false&ver=16.2"></script>
|
||
<script id="subscription-modal-js-js-extra">
|
||
var subscriptionData = {"homeUrl":"blog.eightnoteight.dev"};
|
||
//# sourceURL=subscription-modal-js-js-extra
|
||
</script>
|
||
<script type='text/javascript' src='https://blog.eightnoteight.dev/wp-content/plugins/jetpack/modules/comments/subscription-modal-on-comment/subscription-modal.js?m=1764003632'></script>
|
||
<script id="enlighterjs-js" src="https://blog.eightnoteight.dev/wp-content/plugins/enlighter/cache/enlighterjs.min.js?ver=YJTnwXKT5qtyq%2Bn"></script>
|
||
<script id="enlighterjs-js-after">
|
||
!function(e,n){if("undefined"!=typeof EnlighterJS){var o={"selectors":{"block":"pre.EnlighterJSRAW","inline":"code.EnlighterJSRAW"},"options":{"indent":4,"ampersandCleanup":true,"linehover":true,"rawcodeDbclick":false,"textOverflow":"break","linenumbers":true,"theme":"enlighter","language":"generic","retainCssClasses":false,"collapse":false,"toolbarOuter":"","toolbarTop":"{BTN_RAW}{BTN_COPY}{BTN_WINDOW}{BTN_WEBSITE}","toolbarBottom":""}};(e.EnlighterJSINIT=function(){EnlighterJS.init(o.selectors.block,o.selectors.inline,o.options)})()}else{(n&&(n.error||n.log)||function(){})("Error: EnlighterJS resources not loaded yet!")}}(window,console);
|
||
//# sourceURL=enlighterjs-js-after
|
||
</script>
|
||
<script id="jetpack-stats-js-before">
|
||
_stq = window._stq || [];
|
||
_stq.push([ "view", {"v":"ext","blog":"238510005","post":"103709805","tz":"5.5","srv":"blog.eightnoteight.dev","hp":"atomic","ac":"2","amp":"0","j":"1:16.2"} ]);
|
||
_stq.push([ "clickTrackerInit", "238510005", "103709805" ]);
|
||
//# sourceURL=jetpack-stats-js-before
|
||
</script>
|
||
<script data-wp-strategy="defer" defer fetchpriority="low" id="jetpack-stats-js" src="https://stats.wp.com/e-202637.js"></script>
|
||
<script id="sharing-js-js-extra">
|
||
var sharing_js_options = {"lang":"en","counts":"1","is_stats_active":"1"};
|
||
//# sourceURL=sharing-js-js-extra
|
||
</script>
|
||
<script id="sharing-js-js" src="https://blog.eightnoteight.dev/wp-content/plugins/jetpack/_inc/build/sharedaddy/sharing.min.js?ver=16.2"></script>
|
||
<script id="sharing-js-js-after">
|
||
window.WPCOM_sharing_popups = window.WPCOM_sharing_popups || {};
|
||
window.WPCOM_sharing_popups[ "x" ] = "menubar=1,resizable=1,width=600,height=350";
|
||
window.WPCOM_sharing_popups = window.WPCOM_sharing_popups || {};
|
||
window.WPCOM_sharing_popups[ "linkedin" ] = "menubar=1,resizable=1,width=580,height=450";
|
||
window.WPCOM_sharing_popups = window.WPCOM_sharing_popups || {};
|
||
window.WPCOM_sharing_popups[ "threads" ] = "menubar=1,resizable=1,width=600,height=400";
|
||
window.WPCOM_sharing_popups = window.WPCOM_sharing_popups || {};
|
||
window.WPCOM_sharing_popups[ "facebook" ] = "menubar=1,resizable=1,width=600,height=400";
|
||
//# sourceURL=sharing-js-js-after
|
||
</script>
|
||
<script id="wp-emoji-settings" type="application/json">
|
||
{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://blog.eightnoteight.dev/wp-includes/js/wp-emoji-release.min.js?ver=7.1"}}
|
||
</script>
|
||
<script type="module">
|
||
/*! This file is auto-generated */
|
||
var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))});
|
||
//# sourceURL=https://blog.eightnoteight.dev/wp-includes/js/wp-emoji-loader.min.js
|
||
</script>
|
||
</body>
|
||
</html>
|
||
<!--
|
||
generated in 0.313 seconds
|
||
117542 bytes batcached for 300 seconds
|
||
-->
|