1<!DOCTYPE html> 2<html lang="en" class="no-js"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <link rel="profile" href="https://gmpg.org/xfn/11"> 7 <link rel="pingback" href="https://hillel.dev/xmlrpc.php"> 8
8<script>(function(html){html.className = html.className.replace(/\bno-js\b/,'js')})(document.documentElement);</script>
8 9<title>JavaScript – Hillel Coren</title> 10<meta name='robots' content='max-image-preview:large' /> 11 12<!-- Async WordPress.com Remote Login -->
13<script id="wpcom_remote_login_js"> 14var wpcom_remote_login_extra_auth = ''; 15function wpcom_remote_login_remove_dom_node_id( element_id ) { 16 var dom_node = document.getElementById( element_id ); 17 if ( dom_node ) { dom_node.parentNode.removeChild( dom_node ); } 18} 19function wpcom_remote_login_remove_dom_node_classes( class_name ) { 20 var dom_nodes = document.querySelectorAll( '.' + class_name ); 21 for ( var i = 0; i < dom_nodes.length; i++ ) { 22 dom_nodes[ i ].parentNode.removeChild( dom_nodes[ i ] ); 23 } 24} 25function wpcom_remote_login_final_cleanup() { 26 wpcom_remote_login_remove_dom_node_classes( "wpcom_remote_login_msg" ); 27 wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" ); 28 wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_validate" ); 29 wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_js" ); 30 wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_iframe" ); 31 wpcom_remote_login_remove_dom_node_id( "wpcom_request_access_styles" ); 32} 33 34// Watch for messages back from the remote login 35window.addEventListener( "message", function( e ) { 36 if ( e.origin === "https://r-login.wordpress.com" ) { 37 var data = {}; 38 try { 39 data = JSON.parse( e.data ); 40 } catch( e ) { 41 wpcom_remote_login_final_cleanup(); 42 return; 43 } 44 45 if ( data.msg === 'LOGIN' ) { 46 // Clean up the login check iframe 47 wpcom_remote_login_remove_dom_node_id( "wpcom_remote_login_key" ); 48 49 var id_regex = new RegExp( /^[0-9]+$/ ); 50 var token_regex = new RegExp( /^.*|.*|.*$/ ); 51 if ( 52 token_regex.test( data.token ) 53 && id_regex.test( data.wpcomid ) 54 ) { 55 // We have everything we need to ask for a login 56 var script = document.createElement( "script" ); 57 script.setAttribute( "id", "wpcom_remote_login_validate" ); 58 script.src = '/remote-login.php?wpcom_remote_login=validate' 59 + '&wpcomid=' + data.wpcomid 60 + '&token=' + encodeURIComponent( data.token ) 61 + '&host=' + window.location.protocol 62 + '//' + window.location.hostname 63 + '&postid=2274' 64 + '&is_singular='; 65 document.body.appendChild( script ); 66 } 67 68 return; 69 } 70 71 // Safari ITP, not logged in, so redirect 72 if ( data.msg === 'LOGIN-REDIRECT' ) { 73 window.location = 'https://wordpress.com/log-in?redirect_to=' + window.location.href; 74 return; 75 } 76 77 // Safari ITP, storage access failed, remove the request 78 if ( data.msg === 'LOGIN-REMOVE' ) { 79 var css_zap = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } @media screen and ( max-width: 782px ) { html { margin-top: 0 !important; } * html body { margin-top: 0 !important; } }'; 80 var style_zap = document.createElement( 'style' ); 81 style_zap.type = 'text/css'; 82 style_zap.appendChild( document.createTextNode( css_zap ) ); 83 document.body.appendChild( style_zap ); 84 85 var e = document.getElementById( 'wpcom_request_access_iframe' ); 86 e.parentNode.removeChild( e ); 87 88 document.cookie = 'wordpress_com_login_access=denied; path=/; max-age=31536000'; 89 90 return; 91 } 92 93 // Safari ITP 94 if ( data.msg === 'REQUEST_ACCESS' ) { 95 console.log( 'request access: safari' ); 96 97 // Check ITP iframe enable/disable knob 98 if ( wpcom_remote_login_extra_auth !== 'safari_itp_iframe' ) { 99 return; 100 } 101 102 // If we are in a "private window" there is no ITP. 103 var private_window = false; 104 try { 105 var opendb = window.openDatabase( null, null, null, null ); 106 } catch( e ) { 107 private_window = true; 108 } 109 110 if ( private_window ) { 111 console.log( 'private window' ); 112 return; 113 } 114 115 var iframe = document.createElement( 'iframe' ); 116 iframe.id = 'wpcom_request_access_iframe'; 117 iframe.setAttribute( 'scrolling', 'no' ); 118 iframe.setAttribute( 'sandbox', 'allow-storage-access-by-user-activation allow-scripts allow-same-origin allow-top-navigation-by-user-activation' ); 119 iframe.src = 'https://r-login.wordpress.com/remote-login.php?wpcom_remote_login=request_access&origin=' + encodeURIComponent( data.origin ) + '&wpcomid=' + encodeURIComponent( data.wpcomid ); 120 121 var css = 'html { -webkit-transition: margin-top 1s; transition: margin-top 1s; } /* 9001 */ html { margin-top: 46px !important; } * html body { margin-top: 46px !important; } @media screen and ( max-width: 660px ) { html { margin-top: 71px !important; } * html body { margin-top: 71px !important; } #wpcom_request_access_iframe { display: block; height: 71px !important; } } #wpcom_request_access_iframe { border: 0px; height: 46px; position: fixed; top: 0; left: 0; width: 100%; min-width: 100%; z-index: 99999; background: #23282d; } '; 122 123 var style = document.createElement( 'style' ); 124 style.type = 'text/css'; 125 style.id = 'wpcom_request_access_styles'; 126 style.appendChild( document.createTextNode( css ) ); 127 document.body.appendChild( style ); 128 129 document.body.appendChild( iframe ); 130 } 131 132 if ( data.msg === 'DONE' ) { 133 wpcom_remote_login_final_cleanup(); 134 } 135 } 136}, false ); 137 138// Inject the remote login iframe after the page has had a chance to load 139// more critical resources 140window.addEventListener( "DOMContentLoaded", function( e ) { 141 var iframe = document.createElement( "iframe" );
142 iframe.style.display = "none"; 143 iframe.setAttribute( "scrolling", "no" ); 144 iframe.setAttribute( "id", "wpcom_remote_login_key" ); 145 iframe.src = "https://r-login.wordpress.com/remote-login.php" 146 + "?wpcom_remote_login=key" 147 + "&origin=aHR0cHM6Ly9oaWxsZWwuZGV2" 148 + "&wpcomid=4721641" 149 + "&time=" + Math.floor( Date.now() / 1000 ); 150 document.body.appendChild( iframe ); 151}, false ); 152</script>
152 153<link rel='dns-prefetch' href='//s1.wp.com' /> 154<link rel='dns-prefetch' href='//s2.wp.com' /> 155<link rel='dns-prefetch' href='//s0.wp.com' /> 156<link rel='dns-prefetch' href='//af.pubmine.com' /> 157<link rel="alternate" type="application/rss+xml" title="Hillel Coren » Feed" href="https://hillel.dev/feed/" /> 158<link rel="alternate" type="application/rss+xml" title="Hillel Coren » Comments Feed" href="https://hillel.dev/comments/feed/" /> 159<link rel="alternate" type="application/rss+xml" title="Hillel Coren » JavaScript Category Feed" href="https://hillel.dev/category/javascript/feed/" /> 160
160<script type="text/javascript"> 161 /* <![CDATA[ */ 162 function addLoadEvent(func) { 163 var oldonload = window.onload; 164 if (typeof window.onload != 'function') { 165 window.onload = func; 166 } else { 167 window.onload = function () { 168 oldonload(); 169 func(); 170 } 171 } 172 } 173 /* ]]> */ 174 </script>
174 175 <style id="wp-img-auto-sizes-contain-inline-css"> 176img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} 177/*# sourceURL=wp-img-auto-sizes-contain-inline-css */ 178</style> 179<link crossorigin='anonymous' rel='stylesheet' id='all-css-2-1' href='/_static/??-eJx9jtsKwjAQRH/IuHipxQfxW0I6rWk2F9gNoX9vFMEX8fEwM4ehVozLSZGUYjWF6+KT0Aot1oUPk9REMU+VIaQPRBjNmYVcjsUqaevzbfazAmnvRHb0W9v8tECFUHuag4dh20gRC1vtbtGN8U/APuD77k2v+j3eDuNwOo7Xy3lYn9xFT2Y=&cssminify=yes' type='text/css' media='all' /> 180<style id="wp-emoji-styles-inline-css"> 181 182 img.wp-smiley, img.emoji { 183 display: inline !important; 184 border: none !important; 185 box-shadow: none !important; 186 height: 1em !important; 187 width: 1em !important; 188 margin: 0 0.07em !important; 189 vertical-align: -0.1em !important; 190 background: none !important; 191 padding: 0 !important; 192 } 193/*# sourceURL=wp-emoji-styles-inline-css */ 194</style> 195<style id="wp-block-library-inline-css"> 196: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;
196--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}} 197 198/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/common.min.css */ 199</style> 200<style id="wp-block-embed-inline-css"> 201.wp-block-embed.alignleft,.wp-block-embed.alignright,.wp-block[data-align=left]>[data-type="core/embed"],.wp-block[data-align=right]>[data-type="core/embed"]{max-width:360px;width:100%}.wp-block-embed.alignleft .wp-block-embed__wrapper,.wp-block-embed.alignright .wp-block-embed__wrapper,.wp-block[data-align=left]>[data-type="core/embed"] .wp-block-embed__wrapper,.wp-block[data-align=right]>[data-type="core/embed"] .wp-block-embed__wrapper{min-width:280px}.wp-block-cover .wp-block-embed{min-height:240px;min-width:320px}.wp-block-group.is-layout-flex .wp-block-embed{flex:1 1 0%;min-width:0}.wp-block-embed{overflow-wrap:break-word}.wp-block-embed :where(figcaption){margin-bottom:1em;margin-top:.5em}.wp-block-embed iframe{max-width:100%}.wp-block-embed__wrapper{position:relative}.wp-embed-responsive .wp-has-aspect-ratio .wp-block-embed__wrapper:before{content:"";display:block;padding-top:50%}.wp-embed-responsive .wp-has-aspect-ratio iframe{bottom:0;height:100%;left:0;position:absolute;right:0;top:0;width:100%}.wp-embed-responsive .wp-embed-aspect-21-9 .wp-block-embed__wrapper:before{padding-top:42.85%}.wp-embed-responsive .wp-embed-aspect-18-9 .wp-block-embed__wrapper:before{padding-top:50%}.wp-embed-responsive .wp-embed-aspect-16-9 .wp-block-embed__wrapper:before{padding-top:56.25%}.wp-embed-responsive .wp-embed-aspect-4-3 .wp-block-embed__wrapper:before{padding-top:75%}.wp-embed-responsive .wp-embed-aspect-1-1 .wp-block-embed__wrapper:before{padding-top:100%}.wp-embed-responsive .wp-embed-aspect-9-16 .wp-block-embed__wrapper:before{padding-top:177.77%}.wp-embed-responsive .wp-embed-aspect-1-2 .wp-block-embed__wrapper:before{padding-top:200%} 202/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/embed/style.min.css */ 203</style> 204<style id="wp-block-embed-theme-inline-css"> 205.wp-block-embed :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed :where(figcaption){color:hsla(0,0%,100%,.65)}.wp-block-embed{margin:0 0 1em} 206/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/embed/theme.min.css */ 207</style> 208<style id="wp-block-quote-inline-css"> 209.wp-block-quote{box-sizing:border-box;overflow-wrap:break-word}
209.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} 210/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/quote/style.min.css */ 211</style> 212<style id="wp-block-quote-theme-inline-css"> 213.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote:where(.has-text-align-right){border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote:where(.has-text-align-center){border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote:where(.is-style-plain){border:none} 214/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/quote/theme.min.css */ 215</style> 216<style id="wp-block-heading-inline-css"> 217h1: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:var(--wp--style--block-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} 218/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/heading/style.min.css */ 219</style> 220<style id="wp-block-image-inline-css"> 221.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;
221cursor: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}}
221@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}} 222/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/image/style.min.css */ 223</style> 224<style id="wp-block-image-theme-inline-css"> 225:root :where(.wp-block-image figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme :root :where(.wp-block-image figcaption){color:hsla(0,0%,100%,.65)}.wp-block-image{margin:0 0 1em} 226/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/image/theme.min.css */ 227</style> 228<style id="wp-block-list-inline-css"> 229ol,ul{box-sizing:border-box}:root :where(.wp-block-list.has-background){padding:var(--wp--style--block-background-padding,1.25em 2.375em)} 230/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/list/style.min.css */ 231</style> 232<style id="wp-block-paragraph-inline-css"> 233.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:var(--wp--style--block-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} 234/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/paragraph/style.min.css */ 235</style> 236<style id="wp-block-library-inline-css-extra"> 237.has-text-align-justify { 238 text-align:justify; 239} 240.has-text-align-justify{text-align:justify;} 241/*# sourceURL=wp-block-library-inline-css */ 242</style> 243 244<style id="classic-theme-styles-inline-css"> 245.wp-block-button__link{background-color:#32373c;border-radius:9999px;box-shadow:none;color:#fff;font-size:1.125em;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-file__button{background:#32373c;color:#fff}.wp-block-accordion-heading{margin:0}.wp-block-accordion-heading__toggle{background-color:inherit!important;color:inherit!important}.wp-block-accordion-heading__toggle:not(:focus-visible){outline:none}.wp-block-accordion-heading__toggle:focus,.wp-block-accordion-heading__toggle:hover{background-color:inherit!important;border:none;box-shadow:none;color:inherit;padding:var(--wp--preset--spacing--20,1em) 0;text-decoration:none}.wp-block-accordion-heading__toggle:focus-visible{outline:auto;outline-offset:0}.wp-block-tab:not(.has-text-color){color:inherit!important}.wp-block-tab:not(.has-background){background-color:inherit!important}.wp-block-tab:focus,.wp-block-tab:hover{text-decoration:none}.wp-block-tab:focus-visible{outline:auto;outline-offset:0} 246/*# sourceURL=/wp-content/plugins/gutenberg-core/v24.0.0/build/styles/block-library/classic.min.css */ 247</style> 248 249<style id="coblocks-inline-format-inline-css"> 250.uppercase{text-transform:uppercase} 251/*# sourceURL=coblocks-inline-format-inline-css */ 252</style> 253<link crossorigin='anonymous' rel='stylesheet' id='all-css-12-1' href='/_static/??-eJx9jEEOAiEQBD/kQECjeDC+ZWEnijIwYWA3/l72op689KFTVXplCCU3zE1z6reYRYfiUwlP0VYZpwxIJE4IFRd10HOU9iFA2iuhCiI7/ROiDt9WxfETT20jCOc4YUIa2D9t5eGA91xRBMZS7ATtPkTZvCtdzNEZt7f2fHq8Afl7R7w=&cssminify=yes' type='text/css' media='all' /> 254<style id="global-styles-inline-css"> 255: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: #fff;--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--dark-gray: #111;--wp--preset--color--light-gray: #f1f1f1;--wp--preset--color--yellow: #f4ca16;--wp--preset--color--dark-brown: #352712;--wp--preset--color--medium-pink: #e53b51;--wp--preset--color--light-pink: #ffe5d1;--wp--preset--color--dark-purple: #2e2256;--wp--preset--color--purple: #674970;--wp--preset--color--blue-gray: #22313f;--wp--preset--color--bright-blue: #55c3dc;--wp--preset--color--light-blue: #e9f2f9;--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,
2550) 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--gradient--dark-gray-gradient-gradient: linear-gradient(90deg, rgba(17,17,17,1) 0%, rgba(42,42,42,1) 100%);--wp--preset--gradient--light-gray-gradient: linear-gradient(90deg, rgba(241,241,241,1) 0%, rgba(215,215,215,1) 100%);--wp--preset--gradient--white-gradient: linear-gradient(90deg, rgba(255,255,255,1) 0%, rgba(230,230,230,1) 100%);--wp--preset--gradient--yellow-gradient: linear-gradient(90deg, rgba(244,202,22,1) 0%, rgba(205,168,10,1) 100%);--wp--preset--gradient--dark-brown-gradient: linear-gradient(90deg, rgba(53,39,18,1) 0%, rgba(91,67,31,1) 100%);--wp--preset--gradient--medium-pink-gradient: linear-gradient(90deg, rgba(229,59,81,1) 0%, rgba(209,28,51,1) 100%);--wp--preset--gradient--light-pink-gradient: linear-gradient(90deg, rgba(255,229,209,1) 0%, rgba(255,200,158,1) 100%);--wp--preset--gradient--dark-purple-gradient: linear-gradient(90deg, rgba(46,34,86,1) 0%, rgba(66,48,123,1) 100%);--wp--preset--gradient--purple-gradient: linear-gradient(90deg, rgba(103,73,112,1) 0%, rgba(131,93,143,1) 100%);--wp--preset--gradient--blue-gray-gradient: linear-gradient(90deg, rgba(34,49,63,1) 0%, rgba(52,75,96,1) 100%);--wp--preset--gradient--bright-blue-gradient: linear-gradient(90deg, rgba(85,195,220,1) 0%, rgba(43,180,211,1) 100%);--wp--preset--gradient--light-blue-gradient: linear-gradient(90deg, rgba(233,242,249,1) 0%, rgba(193,218,238,1) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--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--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%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}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{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;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;}.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-dark-gray-color{color: var(--wp--preset--color--dark-gray) !important;}.has-light-gray-color{color: var(--wp--preset--color--light-gray) !important;}.has-yellow-color{color: var(--wp--preset--color--yellow) !important;}.has-dark-brown-color{color: var(--wp--preset--color--dark-brown) !important;}.has-medium-pink-color{color: var(--wp--preset--color--medium-pink) !important;}.has-light-pink-color{color: var(--wp--preset--color--light-pink) !important;}.has-dark-purple-color{color: var(--wp--preset--color--dark-purple) !important;}.has-purple-color{color: var(--wp--preset--color--purple) !important;}.has-blue-gray-color{color: var(--wp--preset--color--blue-gray) !important;}.has-bright-blue-color{color: var(--wp--preset--color--bright-blue) !important;}.has-light-blue-color{color: var(--wp--preset--color--light-blue) !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-dark-gray-background-color{background-color: var(--wp--preset--color--dark-gray) !important;}.has-light-gray-background-color{background-color: var(--wp--preset--color--light-gray) !important;}.has-yellow-background-color{background-color: var(--wp--preset--color--yellow) !important;}.has-dark-brown-background-color{background-color: var(--wp--preset--color--dark-brown) !important;}.has-medium-pink-background-color{background-color: var(--wp--preset--color--medium-pink) !important;}.has-light-pink-background-color{background-color: var(--wp--preset--color--light-pink) !important;}.has-dark-purple-background-color{background-color: var(--wp--preset--color--dark-purple) !important;}.has-purple-background-color{background-color: var(--wp--preset--color--purple) !important;}.has-blue-gray-background-color{background-color: var(--wp--preset--color--blue-gray) !important;}.has-bright-blue-background-color{background-color: var(--wp--preset--color--bright-blue) !important;}.has-light-blue-background-color{background-color: var(--wp--preset--color--light-blue) !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-dark-gray-border-color{border-color: var(--wp--preset--color--dark-gray) !important;}.has-light-gray-border-color{border-color: var(--wp--preset--color--light-gray) !important;}.has-yellow-border-color{border-color: var(--wp--preset--color--yellow) !important;}.has-dark-brown-border-color{border-color: var(--wp--preset--color--dark-brown) !important;}.has-medium-pink-border-color{border-color: var(--wp--preset--color--medium-pink) !important;}.has-light-pink-border-color{border-color: var(--wp--preset--color--light-pink) !important;}.has-dark-purple-border-color{border-color: var(--wp--preset--color--dark-purple) !important;}.has-purple-border-color{border-color: var(--wp--preset--color--purple) !important;}.has-blue-gray-border-color{border-color: var(--wp--preset--color--blue-gray) !important;}.has-bright-blue-border-color{border-color: var(--wp--preset--color--bright-blue) !important;}.has-light-blue-border-color{border-color: var(--wp--preset--color--light-blue) !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;}
255.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-dark-gray-gradient-gradient-gradient-background{background: var(--wp--preset--gradient--dark-gray-gradient-gradient) !important;}.has-light-gray-gradient-gradient-background{background: var(--wp--preset--gradient--light-gray-gradient) !important;}.has-white-gradient-gradient-background{background: var(--wp--preset--gradient--white-gradient) !important;}.has-yellow-gradient-gradient-background{background: var(--wp--preset--gradient--yellow-gradient) !important;}.has-dark-brown-gradient-gradient-background{background: var(--wp--preset--gradient--dark-brown-gradient) !important;}.has-medium-pink-gradient-gradient-background{background: var(--wp--preset--gradient--medium-pink-gradient) !important;}.has-light-pink-gradient-gradient-background{background: var(--wp--preset--gradient--light-pink-gradient) !important;}.has-dark-purple-gradient-gradient-background{background: var(--wp--preset--gradient--dark-purple-gradient) !important;}.has-purple-gradient-gradient-background{background: var(--wp--preset--gradient--purple-gradient) !important;}.has-blue-gray-gradient-gradient-background{background: var(--wp--preset--gradient--blue-gray-gradient) !important;}.has-bright-blue-gradient-gradient-background{background: var(--wp--preset--gradient--bright-blue-gradient) !important;}.has-light-blue-gradient-gradient-background{background: var(--wp--preset--gradient--light-blue-gradient) !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;} 256/*# sourceURL=global-styles-inline-css */ 257</style> 258 259<link crossorigin='anonymous' rel='stylesheet' id='all-css-14-1' href='/_static/??-eJyVj9sOgjAMhl/IWblQroyPYsbSzenoFlpCeHsLmKjxEL3r1/yHFoZiXCZBEpATtshQ+gZk0MXooxdEAsuMwuBVx0BZsmFLbErq2SyIXfQLR9I4zsmKXTvmFTwUtP2kCZEYzijFusuNgXuCo1ohIGnWFPF+fMn8eDTLmPB3uQqhSdld/qiYPHONGYrL7bd/O9TwoGOYXXf8ZgqYjZ5kJWZ6AuOTjd1kPbT7qq6r3abebrbnK/3Rr4Y=&cssminify=yes' type='text/css' media='all' /> 260<style id="jetpack-global-styles-frontend-style-inline-css"> 261: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;} 262/*# sourceURL=jetpack-global-styles-frontend-style-inline-css */ 263</style> 264<link crossorigin='anonymous' rel='stylesheet' id='all-css-16-1' href='/_static/??-eJyNjcsKAjEMRX/ImhmUURfip0inLW3GNCmmQfx7H7gRN+7ugcs5cGsuCPfEHaq5RpaRFZbUmw+XD4MaQ5VolBS0+GuKPsb7eyLndVBdwd+iM3KA2ZAiqAT05Eiy6Bf8KHtJ9RkvW8gks6fX4VSP426/mQ7TMA7LA38FSqA=&cssminify=yes' type='text/css' media='all' />
265<script id="wpcom-actionbar-placeholder-js-extra"> 266var actionbardata = {"siteID":"4721641","postID":"0","siteURL":"https://hillel.dev","xhrURL":"https://hillel.dev/wp-admin/admin-ajax.php","nonce":"ba836f7ed5","isLoggedIn":"","statusMessage":"","subsEmailDefault":"instantly","proxyScriptUrl":"https://s0.wp.com/wp-content/js/wpcom-proxy-request.js?m=1513050504i&ver=20211021","i18n":{"followedText":"New posts from this site will now appear in your \u003Ca href=\"https://wordpress.com/reader\"\u003EReader\u003C/a\u003E","foldBar":"Collapse this bar","unfoldBar":"Expand this bar","shortLinkCopied":"Copied to clipboard."}}; 267//# sourceURL=wpcom-actionbar-placeholder-js-extra 268</script>
vendor: 1 bytes, line 268
268
269<script id="jetpack-mu-wpcom-settings-js-before"> 270var JETPACK_MU_WPCOM_SETTINGS = {"assetsUrl":"https://s1.wp.com/wp-content/mu-plugins/jetpack-mu-wpcom-plugin/sun/jetpack_vendor/automattic/jetpack-mu-wpcom/src/build/"}; 271//# sourceURL=jetpack-mu-wpcom-settings-js-before 272</script>
vendor: 1 bytes, line 272
272
273<script crossorigin='anonymous' type='text/javascript' src='/_static/??-eJyFjUEOwiAQRS/kdFSidWM8CwIhEBhwBlp7e9uoiTtXb/Ff3se5ginUHDWMgpwaVC7PZYiyw3ULZFK3TrYxPrrj5YMhB/orQQ6edXO/8vftnoqHmroPJDgXttoKmKRF3iGTK07HDUCFwNvKa+KWr4fxsj+dR6VUfAGZHkVc'></script>
vendor: 1 bytes, line 273
273
274<script id="rlt-proxy-js-after"> 275 rltInitialize( {"token":null,"iframeOrigins":["https:\/\/widgets.wp.com"]} ); 276//# sourceURL=rlt-proxy-js-after 277</script>
277 278<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://hillelcoren.wordpress.com/xmlrpc.php?rsd" /> 279<meta name="generator" content="WordPress.com" /> 280 281<!-- Jetpack Open Graph Tags --> 282<meta property="og:type" content="website" /> 283<meta property="og:title" content="JavaScript – Hillel Coren" /> 284<meta property="og:url" content="https://hillel.dev/category/javascript/" /> 285<meta property="og:site_name" content="Hillel Coren" /> 286<meta property="og:image" content="https://s0.wp.com/i/blank.jpg?m=1383295312i" /> 287<meta property="og:image:width" content="200" /> 288<meta property="og:image:height" content="200" /> 289<meta property="og:image:alt" content="" /> 290<meta property="og:locale" content="en_US" /> 291 292<!-- End Jetpack Open Graph Tags --> 293<link rel="shortcut icon" type="image/x-icon" href="https://s1.wp.com/i/favicon.ico?m=1713425267i" sizes="16x16 24x24 32x32 48x48" /> 294<link rel="icon" type="image/x-icon" href="https://s1.wp.com/i/favicon.ico?m=1713425267i" sizes="16x16 24x24 32x32 48x48" /> 295<link rel="apple-touch-icon" href="https://s2.wp.com/i/webclip.png?m=1713868326i" /> 296<link rel='openid.server' href='https://hillel.dev/?openidserver=1' /> 297<link rel='openid.delegate' href='https://hillel.dev/' /> 298<link rel="search" type="application/opensearchdescription+xml" href="https://hillel.dev/osd.xml" title="Hillel Coren" /> 299<link rel="search" type="application/opensearchdescription+xml" href="https://s1.wp.com/opensearch.xml" title="WordPress.com" /> 300<meta name="description" content="Posts about JavaScript written by Hillel" />
301<script> 302var wa_client = {}; wa_client.cmd = []; wa_client.config = { 'blog_id': 4721641, 'blog_language': 'en', 'is_wordads': false, 'hosting_type': 0, 'afp_account_id': null, 'afp_host_id': 5038568878849053, 'theme': 'pub/twentyfifteen', '_': { 'title': 'Advertisement', 'privacy_settings': 'Privacy Settings' }, 'formats': [ 'belowpost', 'bottom_sticky', 'sidebar_sticky_right', 'sidebar', 'gutenberg_rectangle', 'gutenberg_leaderboard', 'gutenberg_mobile_leaderboard', 'gutenberg_skyscraper' ] }; 303</script>
303 304
304<script type="text/javascript"> 305 306 window.doNotSellCallback = function() { 307 308 var linkElements = [ 309 'a[href="https://wordpress.com/?ref=footer_blog"]', 310 'a[href="https://wordpress.com/?ref=footer_website"]', 311 'a[href="https://wordpress.com/?ref=vertical_footer"]', 312 'a[href^="https://wordpress.com/?ref=footer_segment_"]', 313 ].join(','); 314 315 var dnsLink = document.createElement( 'a' ); 316 dnsLink.href = 'https://wordpress.com/advertising-program-optout/'; 317 dnsLink.classList.add( 'do-not-sell-link' ); 318 dnsLink.rel = 'nofollow'; 319 dnsLink.style.marginLeft = '0.5em'; 320 dnsLink.textContent = 'Do Not Sell or Share My Personal Information'; 321 322 var creditLinks = document.querySelectorAll( linkElements ); 323 324 if ( 0 === creditLinks.length ) { 325 return false; 326 } 327 328 Array.prototype.forEach.call( creditLinks, function( el ) { 329 el.insertAdjacentElement( 'afterend', dnsLink ); 330 }); 331 332 return true; 333 }; 334 335 </script>
335 336
336<script type="text/javascript"> 337 window.google_analytics_uacct = "UA-52447-2"; 338</script>
338 339
340<script type="text/javascript"> 341 var _gaq = _gaq || []; 342 _gaq.push(['_setAccount', 'UA-52447-2']); 343 _gaq.push(['_gat._anonymizeIp']); 344 _gaq.push(['_setDomainName', 'none']); 345 _gaq.push(['_setAllowLinker', true]); 346 _gaq.push(['_initData']); 347 _gaq.push(['_trackPageview']); 348 349 (function() { 350 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; 351 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 352 (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); 353 })(); 354</script>
354 355<link crossorigin='anonymous' rel='stylesheet' id='all-css-0-5' href='/_static/??-eJyVj9kKwjAQRX/IOFZc+iJ+isTJYKdNMiGTtL9vhbqAIPh6LneDKRmUWCgWCNUkX28cFXoqyeJgZjQllLAIoDU+tctI0UkGW4sEWwrjy4XeqjKa0lEg05FPlMGxFsikSaLySGZkR6LfZI2qK/g962PNhSPC1QsOCjrx3PRnQBBXPSmgzVKV/PvFAh5553Bqju1+2+w27aG/Ay24dTw=&cssminify=yes' type='text/css' media='all' /> 356 357</head> 358 359<body class="archive category category-javascript category-457 wp-embed-responsive wp-theme-pubtwentyfifteen customizer-styles-applied jetpack-reblog-enabled"> 360<div id="page" class="hfeed site"> 361 <a class="skip-link screen-reader-text" href="#content"> 362 Skip to content </a> 363 364 <div id="sidebar" class="sidebar"> 365 <header id="masthead" class="site-header" role="banner"> 366 <div class="site-branding"> 367 <a href="https://hillel.dev/" class="site-logo-link" rel="home" itemprop="url"></a> 368 <p class="site-title"><a href="https://hillel.dev/" rel="home">Hillel Coren</a></p> 369 <p class="site-description">Just another coding weblog</p> 370 <button class="secondary-toggle">Menu and widgets</button> 371 </div><!-- .site-branding --> 372 </header><!-- .site-header --> 373 374 <div id="secondary" class="secondary"> 375 376 377 378 <div id="widget-area" class="widget-area" role="complementary"> 379 <aside id="linkcat-86506315" class="widget widget_links"><h2 class="widget-title">Projects</h2> 380 <ul class='xoxo blogroll'> 381<li><a href="https://www.eventschedule.com" rel="noopener" title="Event Schedule" target="_blank">Event Schedule</a></li> 382<li><a href="https://www.invoiceninja.com" rel="noopener" title="Invoice Ninja" target="_blank">Invoice Ninja</a></li> 383<li><a href="https://itsallwidgets.com" rel="noopener" title="An open list of apps built with Google Flutter" target="_blank">It's All Widgets!</a></li> 384 385 </ul> 386</aside> 387<aside id="twitter-2" class="widget widget_twitter"><h2 class="widget-title"><a href='http://twitter.com/hillelcoren'> Tweets</a></h2><a class="twitter-timeline" data-height="600" data-dnt="true" href="https://twitter.com/hillelcoren">
387Tweets by hillelcoren</a></aside><aside id="archives-2" class="widget widget_archive"><h2 class="widget-title">Archives</h2><nav aria-label="Archives"> 388 <ul> 389 <li><a href='https://hillel.dev/2026/01/'>January 2026</a></li> 390 <li><a href='https://hillel.dev/2023/07/'>July 2023</a></li> 391 <li><a href='https://hillel.dev/2021/03/'>March 2021</a></li> 392 <li><a href='https://hillel.dev/2020/02/'>February 2020</a></li> 393 <li><a href='https://hillel.dev/2019/12/'>December 2019</a></li> 394 <li><a href='https://hillel.dev/2019/01/'>January 2019</a></li> 395 <li><a href='https://hillel.dev/2018/08/'>August 2018</a></li> 396 <li><a href='https://hillel.dev/2018/07/'>July 2018</a></li> 397 <li><a href='https://hillel.dev/2018/06/'>June 2018</a></li> 398 <li><a href='https://hillel.dev/2018/05/'>May 2018</a></li> 399 <li><a href='https://hillel.dev/2017/05/'>May 2017</a></li> 400 <li><a href='https://hillel.dev/2016/08/'>August 2016</a></li> 401 <li><a href='https://hillel.dev/2016/03/'>March 2016</a></li> 402 <li><a href='https://hillel.dev/2015/11/'>November 2015</a></li> 403 <li><a href='https://hillel.dev/2015/09/'>September 2015</a></li> 404 <li><a href='https://hillel.dev/2015/01/'>January 2015</a></li> 405 <li><a href='https://hillel.dev/2014/08/'>August 2014</a></li> 406 <li><a href='https://hillel.dev/2014/06/'>June 2014</a></li> 407 <li><a href='https://hillel.dev/2014/02/'>February 2014</a></li> 408 <li><a href='https://hillel.dev/2013/11/'>November 2013</a></li> 409 <li><a href='https://hillel.dev/2013/10/'>October 2013</a></li> 410 <li><a href='https://hillel.dev/2013/09/'>September 2013</a></li> 411 <li><a href='https://hillel.dev/2013/08/'>August 2013</a></li> 412 <li><a href='https://hillel.dev/2013/07/'>July 2013</a></li> 413 <li><a href='https://hillel.dev/2013/01/'>January 2013</a></li> 414 <li><a href='https://hillel.dev/2012/12/'>December 2012</a></li> 415 <li><a href='https://hillel.dev/2012/06/'>June 2012</a></li> 416 <li><a href='https://hillel.dev/2012/05/'>May 2012</a></li> 417 <li><a href='https://hillel.dev/2012/03/'>March 2012</a></li> 418 <li><a href='https://hillel.dev/2011/08/'>August 2011</a></li> 419 <li><a href='https://hillel.dev/2011/07/'>July 2011</a></li> 420 <li><a href='https://hillel.dev/2011/03/'>March 2011</a></li> 421 <li><a href='https://hillel.dev/2010/12/'>December 2010</a></li> 422 <li><a href='https://hillel.dev/2010/10/'>October 2010</a></li> 423 <li><a href='https://hillel.dev/2010/09/'>September 2010</a></li> 424 <li><a href='https://hillel.dev/2010/04/'>April 2010</a></li> 425 <li><a href='https://hillel.dev/2010/03/'>March 2010</a></li> 426 <li><a href='https://hillel.dev/2009/12/'>December 2009</a></li> 427 <li><a href='https://hillel.dev/2009/09/'>September 2009</a></li> 428 <li><a href='https://hillel.dev/2009/07/'>July 2009</a></li> 429 <li><a href='https://hillel.dev/2009/06/'>June 2009</a></li> 430 <li><a href='https://hillel.dev/2009/05/'>May 2009</a></li> 431 <li><a href='https://hillel.dev/2009/04/'>April 2009</a></li> 432 <li><a href='https://hillel.dev/2009/03/'>March 2009</a></li> 433 <li><a href='https://hillel.dev/2009/02/'>February 2009</a></li> 434 <li><a href='https://hillel.dev/2009/01/'>January 2009</a></li> 435 <li><a href='https://hillel.dev/2008/11/'>November 2008</a></li> 436 <li><a href='https://hillel.dev/2008/10/'>October 2008</a></li> 437 <li><a href='https://hillel.dev/2008/09/'>September 2008</a></li> 438 </ul> 439 440 </nav></aside> </div><!-- .widget-area --> 441 442 </div><!-- .secondary --> 443 444 </div><!-- .sidebar --> 445 446 <div id="content" class="site-content"> 447 448 <section id="primary" class="content-area"> 449 <main id="main" class="site-main" role="main"> 450 451 452 <header class="page-header"> 453 <h1 class="page-title">Category: <span>JavaScript</span></h1> </header><!-- .page-header --> 454 455 456<article id="post-2274" class="post-2274 post type-post status-publish format-standard hentry category-html5 category-javascript category-laravel tag-ai tag-business tag-laravel tag-marketing tag-opensource tag-productivity tag-saas tag-technology"> 457 458 <header class="entry-header"> 459 <h2 class="entry-title"><a href="https://hillel.dev/2026/01/02/why-event-schedule/" rel="bookmark">Why Event Schedule?</a></h2> </header><!-- .entry-header --> 460 461 <div class="entry-content"> 462 463<p class="wp-block-paragraph">After working on <a href="https://invoiceninja.com" target="_blank" rel="noreferrer noopener">Invoice Ninja</a> with my amazing partners Shalom and David for <a href="https://github.com/invoiceninja/invoiceninja/commit/fd521114e8b1bbb16738355086db335ef7cb94e2" target="_blank" rel="noreferrer noopener">over a decade</a>, I started thinking about what comes next. As developers often do, I ended up working on software to try to
463solve some of my own problems.</p> 464 465 466 467<figure class="wp-block-embed aligncenter is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper"> 468<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">Technology doesn’t always make sense.<br>We tried to build something that does.<br><br>Event Schedule: An open-source platform to share events, sell tickets and bring communities together.<a href="https://twitter.com/marclou?ref_src=twsrc%5Etfw">@marclou</a> <a href="https://twitter.com/taylorotwell?ref_src=twsrc%5Etfw">@taylorotwell</a><br><br>Full story 👇 <a href="https://t.co/LSjNxOSRAW">pic.twitter.com/LSjNxOSRAW</a></p>— Hillel Coren (@hillelcoren) <a href="https://twitter.com/hillelcoren/status/2006974387862516137?ref_src=twsrc%5Etfw">January 2, 2026</a></blockquote>
468<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
468</div> 469</div></figure> 470 471 472 473<h2 class="wp-block-heading">Problems</h2> 474 475 476 477<ol class="wp-block-list"> 478<li>I play bass in a Grateful Dead/70’s cover band. Sharing our schedule was harder than it should have been.</li> 479 480 481 482<li>Local shows were scattered across WhatsApp groups instead of a single, public calendar.</li> 483 484 485 486<li>The local farmers’ market is full of great vendors, but I’m too shy to ask about their products.</li> 487</ol> 488 489 490 491<p class="wp-block-paragraph">I wasn’t sure if I wanted to start yet another side project, but a strange thing happened when searching for a domain: one of my first .com choices was shockingly available. Clearly this was a sign.</p> 492 493 494 495<p class="wp-block-paragraph">We started working on Invoice Ninja because we saw the rise of the freelancer economy. With AI likely replacing jobs, people will start looking for new ways to make money. One option will be charging for local and online events. We can also leverage the many <a href="https://invoiceninja.com/payments/" target="_blank" rel="noreferrer noopener">payment gateways</a> supported by Invoice Ninja using a direct integration with the app. </p> 496 497 498<div class="wp-block-image"> 499<figure class="aligncenter size-large"><a href="https://www.eventschedule.com/" target="_blank" rel=" noreferrer noopener"><img data-attachment-id="2320" data-permalink="https://hillel.dev/2026/01/02/why-event-schedule/image-7/" data-orig-file="https://hillel.dev/wp-content/uploads/2025/12/image-5.png" data-orig-size="193,193" data-comments-opened="1" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://hillel.dev/wp-content/uploads/2025/12/image-5.png?w=193" width="193" height="193" src="https://hillel.dev/wp-content/uploads/2025/12/image-5.png?w=193" alt="" class="wp-image-2320" srcset="https://hillel.dev/wp-content/uploads/2025/12/image-5.png 193w, https://hillel.dev/wp-content/uploads/2025/12/image-5.png?w=150 150w" sizes="(max-width: 193px) 100vw, 193px" /></a></figure> 500</div> 501 502 503<blockquote class="wp-block-quote is-style-plain is-layout-flow wp-block-quote-is-layout-flow"> 504<p class="wp-block-paragraph">Event Schedule is an open-source platform to share events, sell tickets and bring communities together.</p> 505 506 507 508<ul class="wp-block-list"> 509<li>Hosted: <a href="https://www.eventschedule.com/" target="_blank" rel="noreferrer noopener">eventschedule.com</a></li> 510</ul> 511 512 513 514<ul class="wp-block-list"> 515<li>Selfhosted: <a href="https://github.com/eventschedule/eventschedule/" target="_blank" rel="noreferrer noopener">github.com/eventschedule</a></li> 516</ul> 517</blockquote> 518 519 520 521<h2 class="wp-block-heading">Development Process</h2> 522 523 524 525<p class="wp-block-paragraph">We’ve followed the same process we used for Invoice Ninja. Over the past year, we’ve slowly added users while developing the <a href="https://github.com/eventschedule/eventschedule/?tab=readme-ov-file#features" target="_blank" rel="noreferrer noopener">features they’ve requested</a>. I’ve loved seeing the various schedules getting created. One of the highest traffic events was the <a href="https://cyborx-festival.eventschedule.com/cyborx-kunstausstellung-cyborx-exhibit?date=2025-08-01" target="_blank" rel="noreferrer noopener">Cyborx Festival</a> in Germany. Another fascinating schedule is <a href="https://reinstate.eventschedule.com/?year=2025&month=12&embed=0" target="_blank" rel="noreferrer noopener">REinsTate – The Tate Institute</a>, a Victorian community hub currently being restored in London. </p> 526 527 528 529<p class="wp-block-paragraph">A major milestone was our first organic testimonial. </p> 530 531 532 533<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"> 534<p class="wp-block-paragraph">As a seasoned business owner, and starting a Sound Healing venture that I require a booking calendar to be part of, Event Schedule has been great. </p> 535 536 537 538<p class="wp-block-paragraph">The ease of set up, attractive format, and most important – the support has been fast and effective – very important to any business owner. </p> 539 540 541 542<p class="wp-block-paragraph">I would HIGHLY RECOMMEND Event Schedule to others and look forward to seeing this app and company grow.</p> 543 544 545 546<p class="wp-block-paragraph">Kim Zacaruk, owner, <a href="https://soulzen.ca/" target="_blank" rel="noreferrer noopener">Soul Zen Sound Baths</a></p> 547</blockquote> 548 549 550 551<p class="wp-block-paragraph"></p> 552 553 554 555<p class="wp-block-paragraph">SEO is an ongoing challenge. Compared to Invoice Ninja, there’s a major advantage: the events are public. One area we’ve experimented with is an <a href="https://blog.eventschedule.com/" target="_blank" rel="noreferrer noopener">AI-generated blog</a>. Over the past year, we’ve managed to start to gain some traction, but we still have a ways to go. </p> 556 557 558 559<figure class="wp-block-image size-large"><a href="https://hillel.dev/wp-content/uploads/2025/12/image-2.png"><img data-attachment-id="2284" data-permalink="https://hillel.dev/2026/01/02/why-event-schedule/image-4/" data-orig-file="https://hillel.dev/wp-content/uploads/2025/12/image-2.png" data-orig-size="1503,475" data-comments-opened="1" data-image-title="image" data-image-description="" data-image-caption="" data-large-file="https://hillel.dev/wp-content/uploads/2025/12/image-2.png?w=660" width="1024" height="323" src="https://hillel.dev/wp-content/uploads/2025/12/image-2.png?w=1024" alt="" class="wp-image-2284" srcset="https://hillel.dev/wp-content/uploads/2025/12/image-2.png?w=1024 1024
559w, https://hillel.dev/wp-content/uploads/2025/12/image-2.png?w=150 150w, https://hillel.dev/wp-content/uploads/2025/12/image-2.png?w=300 300w, https://hillel.dev/wp-content/uploads/2025/12/image-2.png?w=768 768w, https://hillel.dev/wp-content/uploads/2025/12/image-2.png?w=1440 1440w, https://hillel.dev/wp-content/uploads/2025/12/image-2.png 1503w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure> 560 561 562 563<p class="wp-block-paragraph">That said we’re playing the long game. We’re running our hosted platform on <a href="https://www.digitalocean.com/products/app-platform" target="_blank" rel="noreferrer noopener">Digital Ocean’s App Platform</a>, our total monthly running cost is currently $32, Digital Ocean charges $5 for the app and $15 for the database, while Gmail provides us two email addresses, each for $6. Using Gmail to send our emails limits us to 100 per day. Once traffic picks up, we’ll need to add $20 a month to support email, bringing the total running cost to $52. Not bad, if you ask me.</p> 564 565 566 567<p class="wp-block-paragraph">Although vibe coding is crazy fun, I’d hate to ship an app to production without knowing how to code. It seems like trying to drive a car while holding tennis rackets; you don’t have the control you need. At the same time, it makes a lot of sense for people with less coding experience to take a pre-existing <a href="https://github.com/eventschedule/eventschedule/" target="_blank" rel="noreferrer noopener">open-source app</a> and use AI to implement the specific changes they need.</p> 568 569 570<div class="wp-block-image"> 571<figure class="aligncenter size-large"><a href="https://hillel.dev/wp-content/uploads/2025/12/demo.gif"><img data-attachment-id="2364" data-permalink="https://hillel.dev/2026/01/02/why-event-schedule/demo/" data-orig-file="https://hillel.dev/wp-content/uploads/2025/12/demo.gif" data-orig-size="800,457" data-comments-opened="1" data-image-title="demo" data-image-description="" data-image-caption="" data-large-file="https://hillel.dev/wp-content/uploads/2025/12/demo.gif?w=660" width="800" height="457" src="https://hillel.dev/wp-content/uploads/2025/12/demo.gif?w=800" alt="" class="wp-image-2364" srcset="https://hillel.dev/wp-content/uploads/2025/12/demo.gif 800w, https://hillel.dev/wp-content/uploads/2025/12/demo.gif?w=150 150w, https://hillel.dev/wp-content/uploads/2025/12/demo.gif?w=300 300w, https://hillel.dev/wp-content/uploads/2025/12/demo.gif?w=768 768w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption class="wp-element-caption">Google Calendar Sync</figcaption></figure> 572</div> 573 574 575<p class="wp-block-paragraph">The app is built with <a href="https://laravel.com/" target="_blank" rel="noreferrer noopener">Laravel</a>, a framework that has been quite literally life-changing. It’s enabled me to support my wife and five children while being a work-from-home dad. I can’t thank <a href="https://x.com/taylorotwell" target="_blank" rel="noreferrer noopener">Taylor Otwell</a> enough for his work on it. For now we’re using a responsive web app to support mobile, but hope to build a dedicated <a href="https://flutter.dev/" target="_blank" rel="noreferrer noopener">Flutter</a> mobile app in the future. </p> 576 577 578 579<p class="wp-block-paragraph">The platform supports both in-person as well as online events. With global events, it’s hard to have enough coverage to make in-person events useful, but we plan to provide a public listing of online events, enabling hosts to reach even larger audiences. </p> 580 581 582 583<h2 class="wp-block-heading">Marketing Strategy</h2> 584 585 586 587<p class="wp-block-paragraph">Starting a new year, I’ve decided to take off my developer hat and switch to marketing mode (hence the video and blog post). I’ve been <a href="https://www.reddit.com/r/laravel/comments/1itszkd/just_wanted_to_share_my_new_opensource_laravel_app/" target="_blank" rel="noreferrer noopener">posting to Reddit</a> from early on but my general plan moving forward was formulated after watching this great video from <a href="https://x.com/marclou" target="_blank" rel="noreferrer noopener">Marc Lou</a>. There are three basic steps:</p> 588 589 590 591<ul class="wp-block-list"> 592<li>Short video leading to this post</li> 593 594 595 596<li>Short video to announce Product Hunt launch and Q&A</li> 597 598 599 600<li>Long video to showcase the product</li> 601</ul> 602 603 604 605<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper"> 606<span class="embed-youtube" style="text-align:center; display: block;"><iframe loading="lazy" class="youtube-player" width="660" height="372" src="https://www.youtube.com/embed/40zozi-rGQM?version=3&rel=1&showsearch=0&showinfo=1&iv_load_policy=1&fs=1&hl=en&autohide=2&wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe></span> 607</div></figure> 608 609 610 611<h2 class="wp-block-heading">Wrapping Up</h2> 612 613 614 615<p class="wp-block-paragraph">Working in tech for 25 years, I’ve had the chance to experience many different developer roles, from working in a small startup to a large public company. I’m confident that developing a second bootstrapped SaaS is the best possible position to have. The income from the first SaaS pays the rent, enabling you to devote significant time to a second project. </p> 616 617 618 619<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper"> 620<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">Switching from backend to frontend development has a very strong 'warrior in a garden' feel to it. My day-to-day activities have changed from fending off spammers and hackers to deciding which shade of blue looks nicer.</p>— Hillel Coren (@hillelcoren) <a href="https://twitter.com/hillelcoren/status/1490594616193601537?ref_src=twsrc%5Etfw">February 7, 2022</a></blockquote>
620<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
620</div> 621</div></figure> 622 623 624 625<p class="wp-block-paragraph">I mention this because I believe developer satisfaction directly leads to developer success; a happy developer is a productive developer. Event Schedule isn’t about growth hacks or blitzscaling. It’s about building something useful and open, the same way we did with Invoice Ninja.</p> 626 627 628 629<p class="wp-block-paragraph">If you’re curious to follow along, I’d love for you to join us. Follow <a href="https://x.com/ScheduleEvent" target="_blank" rel="noreferrer noopener">@ScheduleEvent</a> and <a href="https://x.com/hillelcoren" target="_blank" rel="noreferrer noopener">@HillelCoren</a> for updates, and check out my personal schedule at <a href="https://hillel.eventschedule.com/" target="_blank" rel="noreferrer noopener">hillel.eventschedule.com</a> to see the upcoming Product Hunt launch and Q&A when it’s added. </p> 630 631 632 633<p class="wp-block-paragraph"></p> 634<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><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-facebook"><a rel="nofollow noopener noreferrer" 635 data-shared="sharing-facebook-2274" 636 class="share-facebook sd-button share-icon" 637 href="https://hillel.dev/2026/01/02/why-event-schedule/?share=facebook" 638 target="_blank" 639 aria-labelledby="sharing-facebook-2274" 640 > 641 <span id="sharing-facebook-2274" hidden>Share on Facebook (Opens in new window)</span> 642 <span>Facebook</span> 643 </a></li><li class="share-twitter"><a rel="nofollow noopener noreferrer" 644 data-shared="sharing-twitter-2274" 645 class="share-twitter sd-button share-icon" 646 href="https://hillel.dev/2026/01/02/why-event-schedule/?share=twitter" 647 target="_blank" 648 aria-labelledby="sharing-twitter-2274" 649 > 650 <span id="sharing-twitter-2274" hidden>Share on X (Opens in new window)</span> 651 <span>X</span> 652 </a></li><li><a href="#" class="sharing-anchor sd-button share-more"><span>More</span></a></li><li class="share-end"></li></ul><div class="sharing-hidden"><div class="inner" style="display: none;"><ul><li class="share-linkedin"><a rel="nofollow noopener noreferrer" 653 data-shared="sharing-linkedin-2274" 654 class="share-linkedin sd-button share-icon" 655 href="https://hillel.dev/2026/01/02/why-event-schedule/?share=linkedin" 656 target="_blank" 657 aria-labelledby="sharing-linkedin-2274" 658 > 659 <span id="sharing-linkedin-2274" hidden>Share on LinkedIn (Opens in new window)</span> 660 <span>LinkedIn</span> 661 </a></li><li class="share-reddit"><a rel="nofollow noopener noreferrer" 662 data-shared="sharing-reddit-2274" 663 class="share-reddit sd-button share-icon" 664 href="https://hillel.dev/2026/01/02/why-event-schedule/?share=reddit" 665 target="_blank" 666 aria-labelledby="sharing-reddit-2274" 667 > 668 <span id="sharing-reddit-2274" hidden>Share on Reddit (Opens in new window)</span> 669 <span>Reddit</span> 670 </a></li><li class="share-email"><a rel="nofollow noopener noreferrer" 671 data-shared="sharing-email-2274" 672 class="share-email sd-button share-icon" 673 href="mailto:?subject=%5BShared%20Post%5D%20Why%20Event%20Schedule%3F&body=https%3A%2F%2Fhillel.dev%2F2026%2F01%2F02%2Fwhy-event-schedule%2F&share=email" 674 target="_blank" 675 aria-labelledby="sharing-email-2274" 676 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="6f0f05cc75" data-email-share-track-url="https://hillel.dev/2026/01/02/why-event-schedule/?share=email"> 677 <span id="sharing-email-2274" hidden>Email a link to a friend (Opens in new window)</span> 678 <span>Email</span> 679 </a></li><li class="share-end"></li></ul></div></div></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-4721641-2274-6ab5
6797639cdf36' data-src='//widgets.wp.com/likes/index.html?ver=20260924#blog_id=4721641&post_id=2274&origin=hillelcoren.wordpress.com&obj_id=4721641-2274-6ab57639cdf36&domain=hillel.dev' data-name='like-post-frame-4721641-2274-6ab57639cdf36' data-title='Like or Reblog'><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height: 55px;'><span class='button'><span>Like</span></span> <span class='loading'>Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div><!-- .entry-content --> 680 681 682 <footer class="entry-footer"> 683 <span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://hillel.dev/2026/01/02/why-event-schedule/" rel="bookmark"><time class="entry-date published" datetime="2026-01-02T01:39:50+02:00">January 2, 2026</time><time class="updated" datetime="2026-01-15T12:25:29+02:00">January 15, 2026</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://hillel.dev/category/html5/" rel="category tag">HTML5</a>, <a href="https://hillel.dev/category/javascript/" rel="category tag">JavaScript</a>, <a href="https://hillel.dev/category/laravel/" rel="category tag">Laravel</a></span><span class="tags-links"><span class="screen-reader-text">Tags </span><a href="https://hillel.dev/tag/ai/" rel="tag">ai</a>, <a href="https://hillel.dev/tag/business/" rel="tag">business</a>, <a href="https://hillel.dev/tag/laravel/" rel="tag">Laravel</a>, <a href="https://hillel.dev/tag/marketing/" rel="tag">marketing</a>, <a href="https://hillel.dev/tag/opensource/" rel="tag">opensource</a>, <a href="https://hillel.dev/tag/productivity/" rel="tag">productivity</a>, <a href="https://hillel.dev/tag/saas/" rel="tag">saas</a>, <a href="https://hillel.dev/tag/technology/" rel="tag">technology</a></span><span class="comments-link"><a href="https://hillel.dev/2026/01/02/why-event-schedule/#comments">1 Comment<span class="screen-reader-text"> on Why Event Schedule?</span></a></span> </footer><!-- .entry-footer --> 684 685</article><!-- #post-2274 --> 686 687<article id="post-1751" class="post-1751 post type-post status-publish format-standard hentry category-html5 category-javascript"> 688 689 <header class="entry-header"> 690 <h2 class="entry-title"><a href="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/" rel="bookmark">Create object in JavaScript using named parameters</a></h2> </header><!-- .entry-header --> 691 692 <div class="entry-content"> 693 <p>The following code should look familiar, we’re creating an object and assigning a property. </p> 694<pre class="brush: jscript; title: ; notranslate" title=""> 695function Person(id) { 696 var self = this; 697 self.id = id; 698} 699 700var instance = new Person(1); 701</pre> 702<p>One challenge with this approach is that as you add properties remembering their order can become a mental task.</p> 703<pre class="brush: jscript; title: ; notranslate" title=""> 704function Person(id, firstName, lastName, phoneNumber) { 705 var self = this; 706 self.id = id; 707 self.firstName = firstName; 708 self.lastName = lastName; 709 self.phoneNumber = phoneNumber; 710} 711 712var instance = new Person(1, 'Bill', 'Gates', '212-555-1234'); 713</pre> 714<p>An alternate approach to consider is to use <a href="http://api.jquery.com/jquery.extend/" target="_blank">jQuery’s extend</a> function (or <a href="http://underscorejs.org/#extend" target="_blank">Underscore</a>, <a href="https://docs.angularjs.org/api/ng/function/angular.extend" target="_blank">AngularJS</a>, etc) which enables passing named parameters.</p> 715<pre class="brush: jscript; title: ; notranslate" title=""> 716function Person(data) { 717 var self = this; 718 $.extend(self, data); 719} 720 721var instance = new Person({ 722 id: 1, 723 firstName: 'Bill', 724 lastName: 'Gates', 725 phoneNumber: '212-555-1234' 726}); 727</pre> 728<p>A nice by-product of this approach is that it makes it simple to serialize/de-serialize the object, for example to store it to Local Storage.</p> 729<pre class="brush: jscript; title: ; notranslate" title=""> 730var jsonString = JSON.stringify(instance); 731// write to storage 732// ...
733// read from storage 734var instance = new Person(JSON.parse(jsonString)); 735</pre> 736<div id="atatags-370373-6ab57639cf03f"> 737
737<script type="text/javascript"> 738 __ATA = window.__ATA || {}; 739 __ATA.cmd = window.__ATA.cmd || []; 740 __ATA.cmd.push(function() { 741 __ATA.initVideoSlot('atatags-370373-6ab57639cf03f', { 742 sectionId: '370373', 743 format: 'inread' 744 }); 745 }); 746 </script>
746 747 </div> 748<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><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-facebook"><a rel="nofollow noopener noreferrer" 749 data-shared="sharing-facebook-1751" 750 class="share-facebook sd-button share-icon" 751 href="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/?share=facebook" 752 target="_blank" 753 aria-labelledby="sharing-facebook-1751" 754 > 755 <span id="sharing-facebook-1751" hidden>Share on Facebook (Opens in new window)</span> 756 <span>Facebook</span> 757 </a></li><li class="share-twitter"><a rel="nofollow noopener noreferrer" 758 data-shared="sharing-twitter-1751" 759 class="share-twitter sd-button share-icon" 760 href="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/?share=twitter" 761 target="_blank" 762 aria-labelledby="sharing-twitter-1751" 763 > 764 <span id="sharing-twitter-1751" hidden>Share on X (Opens in new window)</span> 765 <span>X</span> 766 </a></li><li><a href="#" class="sharing-anchor sd-button share-more"><span>More</span></a></li><li class="share-end"></li></ul><div class="sharing-hidden"><div class="inner" style="display: none;"><ul><li class="share-linkedin"><a rel="nofollow noopener noreferrer" 767 data-shared="sharing-linkedin-1751" 768 class="share-linkedin sd-button share-icon" 769 href="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/?share=linkedin" 770 target="_blank" 771 aria-labelledby="sharing-linkedin-1751" 772 > 773 <span id="sharing-linkedin-1751" hidden>Share on LinkedIn (Opens in new window)</span> 774 <span>LinkedIn</span> 775 </a></li><li class="share-reddit"><a rel="nofollow noopener noreferrer" 776 data-shared="sharing-reddit-1751" 777 class="share-reddit sd-button share-icon" 778 href="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/?share=reddit" 779 target="_blank" 780 aria-labelledby="sharing-reddit-1751" 781 > 782 <span id="sharing-reddit-1751" hidden>Share on Reddit (Opens in new window)</span> 783 <span>Reddit</span> 784 </a></li><li class="share-email"><a rel="nofollow noopener noreferrer" 785 data-shared="sharing-email-1751" 786 class="share-email sd-button share-icon" 787 href="mailto:?subject=%5BShared%20Post%5D%20Create%20object%20in%20JavaScript%20using%20named%20parameters&body=https%3A%2F%2Fhillel.dev%2F2014%2F06%2F24%2Fcreate-object-in-javascript-using-named-parameters%2F&share=email" 788 target="_blank" 789 aria-labelledby="sharing-email-1751" 790 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="c0f2bfaaa2" data-email-share-track-url="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/?share=email"> 791 <span id="sharing-email-1751" hidden>Email a link to a friend (Opens in new window)</span> 792 <span>Email</span> 793 </a></li><li class="share-end"></li></ul></div></div></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-4721641-1751-6ab57639cf83f' data-src='//widgets.wp.com/likes/index.html?ver=20260924#blog_id=4721641&post_id=1751&origin=hillelcoren.wordpress.com&obj_id=4721641-1751-6ab57639cf83f&domain=hillel.dev' data-name='like-post-frame-4721641-1751-6ab57639cf83f' data-title='Like or Reblog'><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height: 55px;'><span class='button'><span>Like</span></span> <span class='loading'>Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div><!-- .entry-content --> 794 795 796 <footer class="entry-footer"> 797 <span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/" rel="bookmark"><time class="entry-date published" datetime="2014-06-24T21:42:03+02:00">June 24, 2014</time><time class="updated" datetime="2014-06-24T21:59:34+02:00">June 24, 2014</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://hillel.dev/category/html5/" rel="category tag">HTML5</a>, <a href="https://hillel.dev/category/javascript/" rel="category tag">JavaScript</a></span><span class="comments-link"><a href="https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/#respond">Leave a comment<span class="screen-reader-text"> on Create object in JavaScript using named parameters</span></a></span> </footer><!-- .entry-footer --> 798 799</article><!-- #post-1751 --> 800 801<article id="post-1635" class="post-1635 post type-post status-publish format-standard hentry category-javascript category-laravel"> 802 803 <header class="entry-header"> 804 <h2 class="entry-title"><a href="https://hillel.dev/2014/02/11/logging-errors-in-laravel/" rel="bookmark">Logging errors in Laravel</a></h2> </header><!-- .entry-header --> 805 806 <div class="entry-content"> 807 <p>Laravel comes with a really helpful <code><a href="http://laravel.com/docs/errors#logging" target="_blank">Log::error()</a></code> function to write messages to the log file. Here’
807s how you can use it to track PHP and JavaScript errors along with useful contextual information to help troubleshoot problems.</p> 808<p>The <code>Log::error()</code> function accepts a second optional parameter allowing you to specify additional info. To make setting this easier create a <code>logError()</code> function in a <code>Utils</code> class.</p> 809<pre class="brush: php; title: ; notranslate" title=""> 810public static function logError($error, $code = '', $context = 'PHP') 811{ 812 $count = Session::get('error_count', 0); 813 Session::put('error_count', ++$count); 814 815 $data = [ 816 'context' => $context, 817 'user_id' => Auth::check() ? Auth::user()->id : 0, 818 'user_name' => Auth::check() ? Auth::user()->getDisplayName() : '', 819 'url' => Request::url(), 820 'user_agent' => isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '', 821 'ip' => Request::getClientIp(), 822 'count' => $count, 823 'code' => $code 824 ]; 825 826 Log::error($error, $data); 827} 828</pre> 829<p>Most of the code should be self explanatory. <code>getDisplayName()</code> is a function I add to the User class (as well as other classes) where there is logic involved in determining the name. In this case it may be the user’s full name or email address.</p> 830<p>To configure Laravel to use this function by default change the <code>App::error()</code> function in <code>app/start/global.php</code> to the following.</p> 831<pre class="brush: php; title: ; notranslate" title=""> 832App::error(function(Exception $exception, $code) 833{ 834 Utils::logError($exception, $code); 835}); 836</pre> 837<p>To catch all JavaScript errors enable accessing the Utils::logError() function by adding this to your <code>routes.php</code> file.</p> 838<pre class="brush: php; title: ; notranslate" title=""> 839Route::get('/log_error', function() 840{ 841 return Utils::logError(Input::get('error'), '', 'JavaScript'); 842}); 843</pre> 844<p>And finally, add the following to function to your master template file.</p> 845<pre class="brush: jscript; title: ; notranslate" title=""> 846window.onerror = function(e) { 847 try { 848 $.ajax({ 849 type: 'GET', 850 url: '{{ URL::to('log_error') }}', 851 data: 'error='+e 852 }); 853 } catch(err) {} 854 return false; 855} 856 857</pre> 858<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><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-facebook"><a rel="nofollow noopener noreferrer" 859 data-shared="sharing-facebook-1635" 860 class="share-facebook sd-button share-icon" 861 href="https://hillel.dev/2014/02/11/logging-errors-in-laravel/?share=facebook" 862 target="_blank" 863 aria-labelledby="sharing-facebook-1635" 864 > 865 <span id="sharing-facebook-1635" hidden>Share on Facebook (Opens in new window)</span> 866 <span>Facebook</span> 867 </a></li><li class="share-twitter"><a rel="nofollow noopener noreferrer" 868 data-shared="sharing-twitter-1635" 869 class="share-twitter sd-button share-icon" 870 href="https://hillel.dev/2014/02/11/logging-errors-in-laravel/?share=twitter" 871 target="_blank" 872 aria-labelledby="sharing-twitter-1635" 873 > 874 <span id="sharing-twitter-1635" hidden>Share on X (Opens in new window)</span> 875 <span>X</span> 876 </a></li><li><a href="#" class="sharing-anchor sd-button share-more"><span>More</span></a></li><li class="share-end"></li></ul><div class="sharing-hidden"><div class="inner" style="display: none;"><ul><li class="share-linkedin"><a rel="nofollow noopener noreferrer" 877 data-shared="sharing-linkedin-1635" 878 class="share-linkedin sd-button share-icon" 879 href="https://hillel.dev/2014/02/11/logging-errors-in-laravel/?share=linkedin" 880 target="_blank" 881 aria-labelledby="sharing-linkedin-1635" 882 > 883 <span id="sharing-linkedin-1635" hidden>Share on LinkedIn (Opens in new window)</span> 884 <span>LinkedIn</span> 885 </a></li><li class="share-reddit"><a rel="nofollow noopener noreferrer" 886 data-shared="sharing-reddit-1635" 887 class="share-reddit sd-button share-icon" 888 href="https://hillel.dev/2014/02/11/logging-errors-in-laravel/?share=reddit" 889 target="_blank" 890 aria-labelledby="sharing-reddit-1635" 891 > 892 <span id="sharing-reddit-1635" hidden>Share on Reddit (Opens in new window)</span> 893 <span>Reddit</span> 894 </a></li><li class="share-email"><a rel="nofollow noopener noreferrer" 895 data-shared="sharing-email-1635" 896 class="share-email sd-button share-icon" 897 href="mailto:?subject=%5BShared%20Post%5D%20Logging%20errors%20in%20Laravel&body=https%3A%2F%2Fhillel.dev%2F2014%2F02%2F11%2Flogging-errors-in-laravel%2F&share=email" 898 target="_blank" 899 aria-labelledby="sharing-email-1635"
900 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="97960a57f1" data-email-share-track-url="https://hillel.dev/2014/02/11/logging-errors-in-laravel/?share=email"> 901 <span id="sharing-email-1635" hidden>Email a link to a friend (Opens in new window)</span> 902 <span>Email</span> 903 </a></li><li class="share-end"></li></ul></div></div></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-4721641-1635-6ab57639d0a33' data-src='//widgets.wp.com/likes/index.html?ver=20260924#blog_id=4721641&post_id=1635&origin=hillelcoren.wordpress.com&obj_id=4721641-1635-6ab57639d0a33&domain=hillel.dev' data-name='like-post-frame-4721641-1635-6ab57639d0a33' data-title='Like or Reblog'><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height: 55px;'><span class='button'><span>Like</span></span> <span class='loading'>Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div><!-- .entry-content --> 904 905 906 <footer class="entry-footer"> 907 <span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://hillel.dev/2014/02/11/logging-errors-in-laravel/" rel="bookmark"><time class="entry-date published updated" datetime="2014-02-11T14:32:18+02:00">February 11, 2014</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://hillel.dev/category/javascript/" rel="category tag">JavaScript</a>, <a href="https://hillel.dev/category/laravel/" rel="category tag">Laravel</a></span><span class="comments-link"><a href="https://hillel.dev/2014/02/11/logging-errors-in-laravel/#comments">1 Comment<span class="screen-reader-text"> on Logging errors in Laravel</span></a></span> </footer><!-- .entry-footer --> 908 909</article><!-- #post-1635 --> 910 911<article id="post-1379" class="post-1379 post type-post status-publish format-standard hentry category-javascript"> 912 913 <header class="entry-header"> 914 <h2 class="entry-title"><a href="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/" rel="bookmark">Wrapper for JavaScript console.log</a></h2> </header><!-- .entry-header --> 915 916 <div class="entry-content"> 917 <p>One of the best ways to debug web applications is to use the console.log() function. The catch is while it works in Chrome as well as Firefox (with the Firebug plugin) it causes errors in IE.</p> 918<p>Here’s my version of a very simple wrapper function which:<br /> 919– Prevents errors in IE<br /> 920– Supports the console functions I regularly use (log, info, warn and error)<br /> 921– Allows using %s to substitute parameters. ie, log(“length is %s”, foo.length)</p> 922<pre class="brush: jscript; title: ; notranslate" title=""> 923window.M5 = window.M5 || {}; 924 925$.each(["log","info","warn","error"], function() { 926 var name = this; 927 M5[name] = function () { 928 if(!window.console) return; // prevents errors on IE 929 console[name].apply(console, arguments); 930 }; 931}); 932 933// sample usage 934M5.log("My test log message"); 935</pre> 936<p>Note: this requires jQuery and uses the M5 namespace (which you may wish to change for your own application).</p> 937<div id="jp-post-flair" class="sharedaddy sd-like-enabled sd-sharing-enabled"><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-facebook"><a rel="nofollow noopener noreferrer" 938 data-shared="sharing-facebook-1379" 939 class="share-facebook sd-button share-icon" 940 href="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/?share=facebook" 941 target="_blank" 942 aria-labelledby="sharing-facebook-1379" 943 > 944 <span id="sharing-facebook-1379" hidden>Share on Facebook (Opens in new window)</span> 945 <span>Facebook</span> 946 </a></li><li class="share-twitter"><a rel="nofollow noopener noreferrer" 947 data-shared="sharing-twitter-1379" 948 class="share-twitter sd-button share-icon" 949 href="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/?share=twitter" 950 target="_blank" 951 aria-labelledby="sharing-twitter-1379" 952 > 953 <span id="sharing-twitter-1379" hidden>Share on X (Opens in new window)</span> 954 <span>X</span> 955 </a></li><li><a href="#" class="sharing-anchor sd-button share-more"><span>More</span></a></li><li class="share-end"></li></ul><div class="sharing-hidden"><div class="inner" style="display: none;"><ul><li class="share-linkedin"><a rel="nofollow noopener noreferrer" 956 data-shared="sharing-linkedin-1379" 957 class="share-linkedin sd-button share-icon" 958 href="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/?share=linkedin" 959 target="_blank" 960 aria-labelledby="sharing-linkedin-1379" 961 > 962 <span id="sharing-linkedin-1379" hidden>Share on LinkedIn (Opens in new window)</span> 963 <span>LinkedIn</span> 964 </a></li><li class="share-reddit"><a rel="nofollow noopener noreferrer" 965 data-shared="sharing-reddit-1379" 966 class="share-reddit sd-button share-icon" 967 href="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/?share=reddit" 968 target="_blank" 969 aria-labelledby="sharing-reddit-1379" 970 > 971 <span id="sharing-reddit-1379" hidden>Share on Reddit (Opens in new window)</span> 972 <span>Reddit</span> 973 </a></li><li class="share-email"><a rel="nofollow noopener noreferrer" 974 data-shared="sharing-email-1379" 975 class="share-email sd-button share-icon" 976 href="mailto:?subject=%5BShared%20Post%5D%20Wrapper%20for%20JavaScript%20console.log&body=https%3A%2F%2Fhillel.dev%2F2013%2F01%2F03%2Fwrapper-for-javascript-console-log%2F&share=email" 977 target="_blank" 978 aria-labelledby="sharing-email-1379"
979 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="90a373590e" data-email-share-track-url="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/?share=email"> 980 <span id="sharing-email-1379" hidden>Email a link to a friend (Opens in new window)</span> 981 <span>Email</span> 982 </a></li><li class="share-end"></li></ul></div></div></div></div></div><div class='sharedaddy sd-block sd-like jetpack-likes-widget-wrapper jetpack-likes-widget-unloaded' id='like-post-wrapper-4721641-1379-6ab57639d1af5' data-src='//widgets.wp.com/likes/index.html?ver=20260924#blog_id=4721641&post_id=1379&origin=hillelcoren.wordpress.com&obj_id=4721641-1379-6ab57639d1af5&domain=hillel.dev' data-name='like-post-frame-4721641-1379-6ab57639d1af5' data-title='Like or Reblog'><div class='likes-widget-placeholder post-likes-widget-placeholder' style='height: 55px;'><span class='button'><span>Like</span></span> <span class='loading'>Loading...</span></div><span class='sd-text-color'></span><a class='sd-link-color'></a></div></div> </div><!-- .entry-content --> 983 984 985 <footer class="entry-footer"> 986 <span class="posted-on"><span class="screen-reader-text">Posted on </span><a href="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/" rel="bookmark"><time class="entry-date published updated" datetime="2013-01-03T11:48:46+02:00">January 3, 2013</time></a></span><span class="cat-links"><span class="screen-reader-text">Categories </span><a href="https://hillel.dev/category/javascript/" rel="category tag">JavaScript</a></span><span class="comments-link"><a href="https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/#respond">Leave a comment<span class="screen-reader-text"> on Wrapper for JavaScript console.log</span></a></span> </footer><!-- .entry-footer --> 987 988</article><!-- #post-1379 --> 989 990 </main><!-- .site-main --> 991 </section><!-- .content-area --> 992 993 994 </div><!-- .site-content --> 995 996 <footer id="colophon" class="site-footer" role="contentinfo"> 997 <div class="site-info"> 998 <a href="https://wordpress.com/?ref=footer_blog" rel="nofollow">Blog at WordPress.com.</a> 999 </div><!-- .site-info --> 1000 </footer><!-- .site-footer --> 1001 1002</div><!-- .site --> 1003 1004<!-- -->
1005<script type="speculationrules"> 1006{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/files/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/pub/twentyfifteen/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} 1007</script>
vendor: 1 bytes, line 1007
1007
1008<script id="grofiles-cards-js" src="//0.gravatar.com/js/hovercards/hovercards.min.js?ver=202639d1133547e8a1f2801609f51cef12522abe7f6647d869e9fbc974fe356a37e613"></script>
vendor: 1 bytes, line 1008
1008
1009<script id="wpgroho-js-extra"> 1010var WPGroHo = {"my_hash":""}; 1011//# sourceURL=wpgroho-js-extra 1012</script>
vendor: 1 bytes, line 1012
1012
1013<script crossorigin='anonymous' type='text/javascript' src='/wp-content/mu-plugins/gravatar-hovercards/wpgroho.js?m=1610363240i'></script>
1013 1014 1015
1015<script> 1016 // Initialize and attach hovercards to all gravatars 1017 ( function() { 1018 function init() { 1019 if ( typeof Gravatar === 'undefined' ) { 1020 return; 1021 } 1022 1023 if ( typeof Gravatar.init !== 'function' ) { 1024 return; 1025 } 1026 1027 Gravatar.profile_cb = function ( hash, id ) { 1028 WPGroHo.syncProfileData( hash, id ); 1029 }; 1030 1031 Gravatar.my_hash = WPGroHo.my_hash; 1032 Gravatar.init( 1033 'body', 1034 '#wp-admin-bar-my-account', 1035 { 1036 i18n: { 1037 'Edit your profile →': 'Edit your profile →', 1038 'View profile →': 'View profile →', 1039 'Contact': 'Contact', 1040 'Send money': 'Send money', 1041 'Sorry, we are unable to load this Gravatar profile.': 'Sorry, we are unable to load this Gravatar profile.', 1042 'Gravatar not found.': 'Gravatar not found.', 1043 'Too Many Requests.': 'Too Many Requests.', 1044 'Internal Server Error.': 'Internal Server Error.', 1045 'Is this you?': 'Is this you?', 1046 'Claim your free profile.': 'Claim your free profile.', 1047 'Email': 'Email', 1048 'Home Phone': 'Home Phone', 1049 'Work Phone': 'Work Phone', 1050 'Cell Phone': 'Cell Phone', 1051 'Contact Form': 'Contact Form', 1052 'Calendar': 'Calendar', 1053 }, 1054 } 1055 ); 1056 } 1057 1058 if ( document.readyState !== 'loading' ) { 1059 init(); 1060 } else { 1061 document.addEventListener( 'DOMContentLoaded', init ); 1062 } 1063 } )(); 1064 </script>
1064 1065 1066 <div style="display:none"> 1067 </div> 1068 <!-- CCPA [start] --> 1069
1069<script type="text/javascript"> 1070 ( function () { 1071 1072 var setupPrivacy = function() { 1073 1074 // Minimal Mozilla Cookie library 1075 // https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie/Simple_document.cookie_framework 1076 var cookieLib = window.cookieLib = {getItem:function(e){return e&&decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*"+encodeURIComponent(e).replace(/[\-\.\+\*]/g,"\\$&")+"\\s*\\=\\s*([^;]*).*$)|^.*$"),"$1"))||null},setItem:function(e,o,n,t,r,i){if(!e||/^(?:expires|max\-age|path|domain|secure)$/i.test(e))return!1;var c="";if(n)switch(n.constructor){case Number:c=n===1/0?"; expires=Fri, 31 Dec 9999 23:59:59 GMT":"; max-age="+n;break;case String:c="; expires="+n;break;case Date:c="; expires="+n.toUTCString()}return"rootDomain"!==r&&".rootDomain"!==r||(r=(".rootDomain"===r?".":"")+document.location.hostname.split(".").slice(-2).join(".")),document.cookie=encodeURIComponent(e)+"="+encodeURIComponent(o)+c+(r?"; domain="+r:"")+(t?"; path="+t:"")+(i?"; secure":""),!0}}; 1077 1078 // Implement IAB USP API. 1079 window.__uspapi = function( command, version, callback ) { 1080 1081 // Validate callback. 1082 if ( typeof callback !== 'function' ) { 1083 return; 1084 } 1085 1086 // Validate the given command. 1087 if ( command !== 'getUSPData' || version !== 1 ) { 1088 callback( null, false ); 1089 return; 1090 } 1091 1092 // Check for GPC. If set, override any stored cookie. 1093 if ( navigator.globalPrivacyControl ) { 1094 callback( { version: 1, uspString: '1YYN' }, true ); 1095 return; 1096 } 1097
1098 // Check for cookie. 1099 var consent = cookieLib.getItem( 'usprivacy' ); 1100 1101 // Invalid cookie. 1102 if ( null === consent ) { 1103 callback( null, false ); 1104 return; 1105 } 1106 1107 // Everything checks out. Fire the provided callback with the consent data. 1108 callback( { version: 1, uspString: consent }, true ); 1109 }; 1110 1111 // Initialization. 1112 document.addEventListener( 'DOMContentLoaded', function() { 1113 1114 // Internal functions. 1115 var setDefaultOptInCookie = function() { 1116 var value = '1YNN'; 1117 var domain = '.wordpress.com' === location.hostname.slice( -14 ) ? '.rootDomain' : location.hostname; 1118 cookieLib.setItem( 'usprivacy', value, 365 * 24 * 60 * 60, '/', domain ); 1119 }; 1120 1121 var setDefaultOptOutCookie = function() { 1122 var value = '1YYN'; 1123 var domain = '.wordpress.com' === location.hostname.slice( -14 ) ? '.rootDomain' : location.hostname; 1124 cookieLib.setItem( 'usprivacy', value, 24 * 60 * 60, '/', domain ); 1125 }; 1126 1127 var setDefaultNotApplicableCookie = function() { 1128 var value = '1---'; 1129 var domain = '.wordpress.com' === location.hostname.slice( -14 ) ? '.rootDomain' : location.hostname; 1130 cookieLib.setItem( 'usprivacy', value, 24 * 60 * 60, '/', domain ); 1131 }; 1132 1133 var setCcpaAppliesCookie = function( applies ) { 1134 var domain = '.wordpress.com' === location.hostname.slice( -14 ) ? '.rootDomain' : location.hostname; 1135 cookieLib.setItem( 'ccpa_applies', applies, 24 * 60 * 60, '/', domain ); 1136 } 1137 1138 var maybeCallDoNotSellCallback = function() { 1139 if ( 'function' === typeof window.doNotSellCallback ) { 1140 return window.doNotSellCallback(); 1141 } 1142 1143 return false; 1144 } 1145 1146 // Look for usprivacy cookie first. 1147 var usprivacyCookie = cookieLib.getItem( 'usprivacy' ); 1148 1149 // Found a usprivacy cookie. 1150 if ( null !== usprivacyCookie ) { 1151 1152 // If the cookie indicates that CCPA does not apply, then bail. 1153 if ( '1---' === usprivacyCookie ) { 1154 return; 1155 } 1156 1157 // CCPA applies, so call our callback to add Do Not Sell link to the page. 1158 maybeCallDoNotSellCallback(); 1159 1160 // We're all done, no more processing needed. 1161 return; 1162 } 1163 1164 // We don't have a usprivacy cookie, so check to see if we have a CCPA applies cookie. 1165 var ccpaCookie = cookieLib.getItem( 'ccpa_applies' ); 1166 1167 // No CCPA applies cookie found, so we'll need to geolocate if this visitor is from California. 1168 // This needs to happen client side because we do not have region geo data in our $SERVER headers, 1169 // only country data -- therefore we can't vary cache on the region. 1170 if ( null === ccpaCookie ) { 1171 1172 var request = new XMLHttpRequest(); 1173 request.open( 'GET', 'https://public-api.wordpress.com/geo/', true ); 1174 1175 request.onreadystatechange = function () { 1176 if ( 4 === this.readyState ) { 1177 if ( 200 === this.status ) { 1178 1179 // Got a geo response. Parse out the region data. 1180 var data = JSON.parse( this.response ); 1181 var region = data.region ? data.region.toLowerCase() : ''; 1182 var ccpa_applies = ['california', 'colorado', 'connecticut', 'delaware', 'indiana', 'iowa', 'montana', 'new jersey', 'oregon', 'tennessee', 'texas', 'utah', 'virginia'].indexOf( region ) > -1; 1183 // Set CCPA applies cookie. This keeps us from having to make a geo request too frequently. 1184 setCcpaAppliesCookie( ccpa_applies ); 1185 1186 // Check if CCPA applies to set the proper usprivacy cookie. 1187 if ( ccpa_applies ) { 1188 if ( maybeCallDoNotSellCallback() ) { 1189 // Do Not Sell link added, so set default opt-in. 1190 setDefaultOptInCookie(); 1191 } else { 1192 // Failed showing Do Not Sell link as required, so default to opt-OUT just to be safe. 1193 setDefaultOptOutCookie(); 1194 } 1195 } else { 1196 // CCPA does not apply. 1197 setDefaultNotApplicableCookie(); 1198 } 1199 } else { 1200 // Could not geo, so let's assume for now that CCPA applies to be safe. 1201 setCcpaAppliesCookie( true ); 1202 if ( maybeCallDoNotSellCallback() ) { 1203 // Do Not Sell link added, so set default opt-in. 1204 setDefaultOptInCookie(); 1205 } else { 1206 // Failed showing Do Not Sell link as required, so default to opt-OUT just to be safe. 1207 setDefaultOptOutCookie(); 1208 } 1209 } 1210 } 1211 }; 1212 1213 // Send the geo request. 1214 request.send(); 1215 } else { 1216 // We found a CCPA applies cookie. 1217 if ( ccpaCookie === 'true' ) { 1218 if ( maybeCallDoNotSellCallback() ) { 1219 // Do Not Sell link added, so set default opt-in. 1220 setDefaultOptInCookie(); 1221 } else { 1222 // Failed showing Do Not Sell link as required, so default to opt-OUT just to be safe. 1223 setDefaultOptOutCookie(); 1224 } 1225 } else { 1226 // CCPA does not apply. 1227 setDefaultNotApplicableCookie(); 1228 } 1229 } 1230 } ); 1231 }; 1232 1233 // Kickoff initialization. 1234 if ( window.defQueue && defQueue.isLOHP && defQueue.isLOHP === 2020 ) { 1235 defQueue.items.push( setupPrivacy ); 1236 } else { 1237 setupPrivacy(); 1238 } 1239 1240 } )(); 1241 </script>
1241 1242 1243 <!-- CCPA [end] --> 1244 <div class="widget widget_eu_cookie_law_widget"> 1245<div 1246 class="hide-on-button ads-active" 1247 data-hide-timeout="30" 1248 data-consent-expiration="180" 1249 id="eu-cookie-law" 1250 style="display: none" 1251> 1252 <form method="post"> 1253 <input type="submit" value="Close and accept" class="accept" /> 1254 1255 Privacy & Cookies: This site uses cookies. By continuing to use this website, you agree to their use. <br /> 1256To find out more, including how to control cookies, see here: 1257 <a href="https://automattic.com/cookies/" rel="nofollow"> 1258 Cookie Policy </a> 1259 </form> 1260</div> 1261</div> <div id="actionbar" dir="ltr" style="display: none;" 1262 class="actnbr-pub-twentyfifteen" role="region" aria-label="Site actions"> 1263 <span class="actnbr-live" aria-live="polite"></span> 1264 <ul> 1265 <li class="actnbr-btn actnbr-hidden"> 1266 <a class="actnbr-action actnbr-actn-follow " href="" role="button" aria-haspopup="dialog" aria-expanded="false"> 1267 <svg class="actnbr-icon actnbr-icon-bell" width="20" height="20" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M17 11.5c0 1.353.17 2.368.976 3 .266.209.602.376 1.024.5v1H5v-1c.422-.124.757-.291 1.024-.5.806-.632.976-1.647.976-3V9c0-2.8 2.2-5 5-5s5 2.2 5 5v2.5ZM15.5 9v2.5c0 .93.066 1.98.515 2.897l.053.103H7.932a4.018 4.018 0 0 0 .053-.103c.449-.917.515-1.967.515-2.897V9c0-1.972 1.528-3.5 3.5-3.5s3.5 1.528 3.5 3.5Zm-5.492 9.008c0-.176.023-.346.065-.508h3.854A1.996 1.996 0 0 1 12 20c-1.1 0-1.992-.892-1.992-1.992Z"/></svg> <span>Subscribe</span> 1268 </a> 1269 <a class="actnbr-action actnbr-actn-following no-display" href="" role="button"> 1270 <svg class="actnbr-icon actnbr-icon-check" width="20" height="20" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" style="fill: none" stroke="currentColor" stroke-width="1.5"><path d="M7 12L10 15L17 8" vector-effect="non-scaling-stroke"/></svg> <span>Subscribed</span> 1271 </a> 1272 <div class="actnbr-popover actnbr-panel actnbr-notice" id="follow-bubble" role="dialog" aria-label="Subscribe to Hillel Coren"> 1273 <div class="actnbr-follow-bubble"> 1274 <div class="actnbr-panel__group"><a class="actnbr-menu__item actnbr-sitename" href="https://hillel.dev"><img loading='lazy' alt='' src='https://s-ssl.wordpress.com/i/logo/wpcom-gray-white.png?m=1479929237i' srcset='https://s-ssl.wordpress.com/i/logo/wpcom-gray-white.png 1x' class='avatar avatar-50' height='50' width='50' /><span class="actnbr-menu__label">Hillel Coren</span></a></div> <div class="actnbr-panel__group"> 1275 <div class="actnbr-message no-display" aria-live="polite"></div> 1276 <form method="post" action="https://subscribe.wordpress.com" accept-charset="utf-8" class="no-display"> 1277 <div class="actnbr-follow-count">Join 113 other subscribers</div> 1278 <input type="email" name="email" placeholder="Want updates? Enter your email" class="actnbr-email-field" aria-label="Email address" /> 1279 <input type="hidden" name="action" value="subscribe" /> 1280 <input type="hidden" name="blog_id" value="4721641" /> 1281 <input type="hidden" name="source" value="https://hillel.dev/category/javascript/" /> 1282 <input type="hidden" name="sub-type" value="actionbar-follow" /> 1283 <input type="hidden" id="_wpnonce" name="_wpnonce" value="86646c087f" /> <button type="submit" class="actnbr-button">Sign me up</button> 1284 </form> 1285 <p class="actnbr-login-nudge"> 1286 Have a WordPress.com account? <a href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fhillel.dev%252F2026%252F01%252F02%252Fwhy-event-schedule%252F">Log in now.</a> </p> 1287 </div> 1288 </div> 1289 </div> 1290 </li> 1291 <li class="actnbr-ellipsis actnbr-hidden"> 1292 <button type="button" class="actnbr-more-toggle" aria-haspopup="true" aria-expanded="false" aria-label="More options"> 1293 <svg class="actnbr-icon actnbr-icon-more-horizontal" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" fill="currentColor"><path d="M11 13h2v-2h-2v2zm-6 0h2v-2H5v2zm12-2v2h2v-2h-2z"/></svg> </button> 1294 <div class="actnbr-popover actnbr-menu" role="menu" aria-label="Site options"> 1295 <div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item actnbr-sitename" href="https://hillel.dev"><img loading='lazy' alt='' src='https://s-ssl.wordpress.com/i/logo/wpcom-gray-white.png?m=1479929237i' srcset='https://s-ssl.wordpress.com/i/logo/wpcom-gray-white.png 1x' class='avatar avatar-50' height='50' width='50' /><span class="actnbr-menu__label">Hillel Coren</span></a></div><div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item actnbr-reader" href="https://wordpress.com/reader/feeds/94246706"><span class="actnbr-menu__label">View site in Reader</span></a></div><div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item actnbr-subs" href="https://subscribe.wordpress.com/"><span class="actnbr-menu__label">Manage subscriptions</span></a><a role="menuitem" class="actnbr-menu__item actnbr-signup" href="https://wordpress.com/start/"><span class="actnbr-menu__label">Sign up</span></a><a role="menuitem" class="actnbr-menu__item actnbr-login" href="https://wordpress.com/log-in?redirect_to=https%3A%2F%2Fr-login.wordpress.com%2Fremote-login.php%3Faction%3Dlink%26back%3Dhttps%253A%252F%252Fhillel.dev%252F2026%252F01%252F02%252Fwhy-event-schedule%252F"><span class="actnbr-menu__label">Log in</span></a></div><div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item flb-report" href="https://wordpress.com/abuse/?report_url=https://hillel.dev" target="_blank" rel="noopener noreferrer"><span class="actnbr-menu__label">Report this content</span><span class="actnbr-menu__icon"><svg class="actnbr-icon actnbr-icon-external" width="18" height="18" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" fill="currentColor"><path d="M19.5 4.5h-7V6h4.44l-5.97 5.97 1.06 1.06L18 7.06v4.44h1.5v-7Zm-13 1a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-3H17v3a.5.5 0 0 1-.5.5h-10a.5.5 0 0 1-.5-.5v-10a.5.5 0 0 1 .5-.5h3V5.5h-3Z"/></svg></span></a></div><div class="actnbr-menu__group" role="group"><a role="menuitem" class="actnbr-menu__item actnbr-fold" href=""><span class="actnbr-menu__label">Collapse this bar</span></a></div> </div> 1296 </li> 1297 </ul> 1298 </div> 1299
1299<script> 1300window.addEventListener( "DOMContentLoaded", function () { 1301 var link = document.createElement( "link" ); 1302 link.href = "\/wp-content\/mu-plugins\/jetpack-plugin\/sun\/jetpack_vendor\/automattic\/jetpack-newsletter\/src\/..\/build\/action-bar.css?ver=9e2715140ce0af99d983"; 1303 link.rel = "stylesheet"; 1304 document.head.appendChild( link ); 1305 1306 var script = document.createElement( "script" ); 1307 script.src = "\/wp-content\/mu-plugins\/jetpack-plugin\/sun\/jetpack_vendor\/automattic\/jetpack-newsletter\/src\/..\/build\/action-bar.js?ver=9e2715140ce0af99d983"; 1308 document.body.appendChild( script ); 1309 } ); 1310</script>
1310 1311<link rel="prefetch" href="/wp-content/mu-plugins/jetpack-plugin/sun/_inc/blocks/swiper.js" as="script" /> 1312 <div id="jp-carousel-loading-overlay" style="display: none;"> 1313 <div id="jp-carousel-loading-wrapper"> 1314 <span id="jp-carousel-library-loading"><svg class="jetpack-spinner" width="40" height="40" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><circle cx="50" cy="50" r="46" fill="none" stroke="#ddd" stroke-width="8"/><path d="M 50 4 A 46 46 0 0 1 96 50" fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round"><animateTransform attributeName="transform" type="rotate" dur="1.4s" from="0 50 50" to="360 50 50" repeatCount="indefinite"/></path></svg></span> 1315 </div> 1316 </div> 1317 <div class="jp-carousel-overlay" style="display: none;"> 1318 1319 <div class="jp-carousel-container"> 1320 <!-- The Carousel Swiper --> 1321 <div 1322 class="jp-carousel-wrap swiper jp-carousel-swiper-container jp-carousel-transitions" 1323 itemscope 1324 itemtype="https://schema.org/ImageGallery"> 1325 <div class="jp-carousel swiper-wrapper"></div> 1326 <div class="jp-swiper-button-prev swiper-button-prev"> 1327 <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1328 <mask id="maskPrev" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="9" height="12"> 1329 <path d="M16.2072 16.59L11.6496 12L16.2072 7.41L14.8041 6L8.8335 12L14.8041 18L16.2072 16.59Z" fill="white"/> 1330 </mask> 1331 <g mask="url(#maskPrev)"> 1332 <rect x="0.579102" width="23.8823" height="24" fill="#FFFFFF"/> 1333 </g> 1334 </svg> 1335 </div> 1336 <div class="jp-swiper-button-next swiper-button-next"> 1337 <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1338 <mask id="maskNext" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="8" height="12"> 1339 <path d="M8.59814 16.59L13.1557 12L8.59814 7.41L10.0012 6L15.9718 12L10.0012 18L8.59814 16.59Z" fill="white"/> 1340 </mask> 1341 <g mask="url(#maskNext)"> 1342 <rect x="0.34375" width="23.8822" height="24" fill="#FFFFFF"/> 1343 </g> 1344 </svg> 1345 </div> 1346 </div> 1347 <!-- The main close buton --> 1348 <div class="jp-carousel-close-hint"> 1349 <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1350 <mask id="maskClose" mask-type="alpha" maskUnits="userSpaceOnUse" x="5" y="5" width="15" height="14"> 1351 <path d="M19.3166 6.41L17.9135 5L12.3509 10.59L6.78834 5L5.38525 6.41L10.9478 12L5.38525 17.59L6.78834 19L12.3509 13.41L17.9135 19L19.3166 17.59L13.754 12L19.3166 6.41Z" fill="white"/> 1352 </mask> 1353 <g mask="url(#maskClose)"> 1354 <rect x="0.409668" width="23.8823" height="24" fill="#FFFFFF"/> 1355 </g> 1356 </svg> 1357 </div> 1358 <!-- Image info, comments and meta --> 1359 <div class="jp-carousel-info"> 1360 <div class="jp-carousel-info-footer"> 1361 <div class="jp-carousel-pagination-container"> 1362 <div class="jp-swiper-pagination swiper-pagination"></div> 1363 <div class="jp-carousel-pagination"></div> 1364 </div> 1365 <div class="jp-carousel-photo-title-container"> 1366 <div class="jp-carousel-photo-caption"></div> 1367 </div> 1368 <div class="jp-carousel-photo-icons-container"> 1369 <a href="#" class="jp-carousel-icon-btn jp-carousel-icon-info" aria-label="Toggle photo metadata visibility"> 1370 <span class="jp-carousel-icon"> 1371 <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1372 <mask id="maskInfo" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20"> 1373 <path fill-rule="evenodd" clip-rule="evenodd" d="M12.7537 2C7.26076 2 2.80273 6.48 2.80273 12C2.80273 17.52 7.26076 22 12.7537 22C18.2466 22 22.7046 17.52 22.7046 12C22.7046 6.48 18.2466 2 12.7537 2ZM11.7586 7V9H13.7488V7H11.7586ZM11.7586 11V17H13.7488V11H11.7586ZM4.79292 12C4.79292 16.41 8.36531 20 12.7537 20C17.142 20 20.7144 16.41 20.7144 12C20.7144 7.59 17.142 4 12.7537 4C8.36531 4 4.79292 7.59 4.79292 12Z" fill="white"/> 1374 </mask> 1375 <g mask="url(#maskInfo)"> 1376 <rect x="0.8125" width="23.8823" height="24" fill="#FFFFFF"/> 1377 </g> 1378 </svg> 1379 </span> 1380 </a> 1381 <a href="#" class="jp-carousel-icon-btn jp-carousel-icon-comments" aria-label="Toggle photo comments visibility"> 1382 <span class="jp-carousel-icon"> 1383 <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1384 <mask id="maskComments" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20"> 1385 <path fill-rule="evenodd" clip-rule="evenodd" d="M4.3271 2H20.2486C21.3432 2 22.2388 2.9 22.2388 4V16C22.2388 17.1 21.3432 18 20.2486 18H6.31729L2.33691 22V4C2.33691 2.9 3.2325 2 4.3271 2ZM6.31729 16H20.2486V4H4.3271V18L6.31729 16Z" fill="white"/> 1386 </mask> 1387 <g mask="url(#maskComments)"> 1388 <rect x="0.34668" width="23.8823" height="24" fill="#FFFFFF"/> 1389 </g> 1390 </svg> 1391 1392 <span class="jp-carousel-has-comments-indicator" aria-label="This image has comments."></span> 1393 </span> 1394 </a> 1395 </div>
1396 </div> 1397 <div class="jp-carousel-info-extra"> 1398 <div class="jp-carousel-info-content-wrapper"> 1399 <div class="jp-carousel-photo-title-container"> 1400 <div class="jp-carousel-photo-title"></div> 1401 </div> 1402 <div class="jp-carousel-comments-wrapper"> 1403 <div id="jp-carousel-comments-loading"> 1404 <span>Loading Comments...</span> 1405 </div> 1406 <div class="jp-carousel-comments"></div> 1407 <div id="jp-carousel-comment-form-container"> 1408 <span id="jp-carousel-comment-form-spinner"><svg class="jetpack-spinner" width="20" height="20" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><circle cx="50" cy="50" r="46" fill="none" stroke="#ddd" stroke-width="8"/><path d="M 50 4 A 46 46 0 0 1 96 50" fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round"><animateTransform attributeName="transform" type="rotate" dur="1.4s" from="0 50 50" to="360 50 50" repeatCount="indefinite"/></path></svg></span> 1409 <div id="jp-carousel-comment-post-results"></div> 1410 <form id="jp-carousel-comment-form"> 1411 <label for="jp-carousel-comment-form-comment-field" class="screen-reader-text">Write a Comment...</label> 1412 <textarea 1413 name="comment" 1414 class="jp-carousel-comment-form-field jp-carousel-comment-form-textarea" 1415 id="jp-carousel-comment-form-comment-field" 1416 placeholder="Write a Comment..." 1417 ></textarea> 1418 <div id="jp-carousel-comment-form-submit-and-info-wrapper"> 1419 <div id="jp-carousel-comment-form-commenting-as"> 1420 <fieldset> 1421 <label for="jp-carousel-comment-form-email-field">Email (Required)</label> 1422 <input type="text" name="email" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-email-field" /> 1423 </fieldset> 1424 <fieldset> 1425 <label for="jp-carousel-comment-form-author-field">Name (Required)</label> 1426 <input type="text" name="author" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-author-field" /> 1427 </fieldset> 1428 <fieldset> 1429 <label for="jp-carousel-comment-form-url-field">Website</label> 1430 <input type="text" name="url" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-url-field" /> 1431 </fieldset> 1432 </div> 1433 <input 1434 type="submit" 1435 name="submit" 1436 class="jp-carousel-comment-form-button" 1437 id="jp-carousel-comment-form-button-submit" 1438 value="Post Comment" /> 1439 </div> 1440 </form> 1441 </div> 1442 </div> 1443 <div class="jp-carousel-image-meta"> 1444 <div class="jp-carousel-title-and-caption"> 1445 <div class="jp-carousel-photo-info"> 1446 <div class="jp-carousel-caption" itemprop="caption description"></div> 1447 </div> 1448 1449 <div class="jp-carousel-photo-description"></div> 1450 </div> 1451 <a class="jp-carousel-image-download" href="#" aria-label="Download image" target="_blank" style="display: none;"> 1452 <svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg"> 1453 <mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="3" y="3" width="19" height="18"> 1454 <path fill-rule="evenodd" clip-rule="evenodd" d="M5.84615 5V19H19.7775V12H21.7677V19C21.7677 20.1 20.8721 21 19.7775 21H5.84615C4.74159 21 3.85596 20.1 3.85596 19V5C3.85596 3.9 4.74159 3 5.84615 3H12.8118V5H5.84615ZM14.802 5V3H21.7677V10H19.7775V6.41L9.99569 16.24L8.59261 14.83L18.3744 5H14.802Z" fill="white"/> 1455 </mask> 1456 <g mask="url(#mask0)"> 1457 <rect x="0.870605" width="23.8823" height="24" fill="#FFFFFF"/> 1458 </g> 1459 </svg> 1460 <span class="jp-carousel-download-text"></span> 1461 </a> 1462 <div class="jp-carousel-image-map" style="display: none;"></div> 1463 </div> 1464 </div>
1465 </div> 1466 </div> 1467 </div> 1468 1469 </div> 1470 1471
1471<script type="text/javascript"> 1472 window.WPCOM_sharing_counts = {"https://hillel.dev/2026/01/02/why-event-schedule/":2274,"https://hillel.dev/2014/06/24/create-object-in-javascript-using-named-parameters/":1751,"https://hillel.dev/2014/02/11/logging-errors-in-laravel/":1635,"https://hillel.dev/2013/01/03/wrapper-for-javascript-console-log/":1379}; 1473 </script>
1473 1474
1474<script crossorigin='anonymous' type='text/javascript' src='/_static/??-eJzTLy/QTc7PK0nNK9EvyClNz8wr1i+uzCtJrMjITM/IAeKS1CJMEWP94uSizIISoOIM5/yiVL2sYh19yo1yKiotzvAKBvOpaWRARgHQOPtcW0NTcwMjAxNLC9MsAD6AYFU='></script>
vendor: 1 bytes, line 1474
1474
1475<script type='text/javascript'> 1476 (function(){ 1477 var corecss = document.createElement('link'); 1478 var themecss = document.createElement('link'); 1479 var corecssurl = "/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shCore.css?ver=3.0.9b"; 1480 if ( corecss.setAttribute ) { 1481 corecss.setAttribute( "rel", "stylesheet" ); 1482 corecss.setAttribute( "type", "text/css" ); 1483 corecss.setAttribute( "href", corecssurl ); 1484 } else { 1485 corecss.rel = "stylesheet"; 1486 corecss.href = corecssurl; 1487 } 1488 document.head.appendChild( corecss ); 1489 var themecssurl = "/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shThemeDefault.css?m=1363304414i&ver=3.0.9b"; 1490 if ( themecss.setAttribute ) { 1491 themecss.setAttribute( "rel", "stylesheet" ); 1492 themecss.setAttribute( "type", "text/css" ); 1493 themecss.setAttribute( "href", themecssurl ); 1494 } else { 1495 themecss.rel = "stylesheet"; 1496 themecss.href = themecssurl; 1497 } 1498 document.head.appendChild( themecss ); 1499 })(); 1500 SyntaxHighlighter.config.strings.expandSource = '+ expand source'; 1501 SyntaxHighlighter.config.strings.help = '?'; 1502 SyntaxHighlighter.config.strings.alert = 'SyntaxHighlighter\n\n'; 1503 SyntaxHighlighter.config.strings.noBrush = 'Can\'t find brush for: '; 1504 SyntaxHighlighter.config.strings.brushNotHtmlScript = 'Brush wasn\'t configured for html-script option: '; 1505 SyntaxHighlighter.defaults['pad-line-numbers'] = false; 1506 SyntaxHighlighter.defaults['toolbar'] = false; 1507 SyntaxHighlighter.all(); 1508 1509 // Infinite scroll support 1510 document.addEventListener( 'is.post-load', function () { 1511 SyntaxHighlighter.highlight(); 1512 } ); 1513</script>
1513 1514 1515
1515<script type="text/javascript"> 1516 (function () { 1517 var wpcom_reblog = { 1518 source: 'toolbar', 1519 1520 toggle_reblog_box_flair: function (obj_id, post_id) { 1521 1522 // Go to site selector. This will redirect to their blog if they only have one. 1523 const postEndpoint = `https://wordpress.com/post`; 1524 1525 // Ideally we would use the permalink here, but fortunately this will be replaced with the 1526 // post permalink in the editor. 1527 const originalURL = `${ document.location.href }?page_id=${ post_id }`; 1528 1529 const url = 1530 postEndpoint + 1531 '?url=' + 1532 encodeURIComponent( originalURL ) + 1533 '&is_post_share=true' + 1534 '&v=5'; 1535 1536 const redirect = function () { 1537 if ( 1538 ! window.open( url, '_blank' ) 1539 ) { 1540 location.href = url; 1541 } 1542 }; 1543 1544 if ( /Firefox/.test( navigator.userAgent ) ) { 1545 setTimeout( redirect, 0 ); 1546 } else { 1547 redirect(); 1548 } 1549 }, 1550 }; 1551 1552 window.wpcom_reblog = wpcom_reblog; 1553 })(); 1554 </script>
vendor: 1 bytes, line 1554
1554
1555<script id="coblocks-loader-js-extra"> 1556var wpcom_coblocks_js = {"coblocks_masonry_js":"https://s2.wp.com/wp-content/plugins/coblocks/2.18.1-simple-rev.4/dist/js/coblocks-masonry.min.js?m=1681832297i","coblocks_lightbox_js":"https://s2.wp.com/wp-content/plugins/coblocks/2.18.1-simple-rev.4/dist/js/coblocks-lightbox.min.js?m=1681832297i","jquery_core_js":"/wp-includes/js/jquery/jquery.min.js","jquery_migrate_js":"/wp-includes/js/jquery/jquery-migrate.min.js","masonry_js":"/wp-includes/js/masonry.min.js","imagesloaded_js":"/wp-includes/js/imagesloaded.min.js"}; 1557var coblocksLigthboxData = {"closeLabel":"Close Gallery","leftLabel":"Previous","rightLabel":"Next"}; 1558//# sourceURL=coblocks-loader-js-extra 1559</script>
vendor: 1 bytes, line 1559
1559
1560<script id="twentyfifteen-script-js-extra"> 1561var screenReaderText = {"expand":"\u003Cspan class=\"screen-reader-text\"\u003Eexpand child menu\u003C/span\u003E","collapse":"\u003Cspan class=\"screen-reader-text\"\u003Ecollapse child menu\u003C/span\u003E"}; 1562//# sourceURL=twentyfifteen-script-js-extra 1563</script>
vendor: 1 bytes, line 1563
1563
1564<script crossorigin='anonymous' type='text/javascript' src='/_static/??-eJyVjsuOwjAMRX+I1BRVMBvEt4TELW6dB7VDxN9PWKBBXSDN9vqcew01G5eiYlS4cppM5jJRFKhp9daLcWxFUGBukVU2j0M3yw4+tFD+JPITqgCWdk0LoWFbQTFktoqb/EsP09Loe8GCNxs947qF36RL7Wu3CBy6/qfrjVDbQrPioxvAk+jr8TdkOFnfugLFbZ/eMLTJXK6gtQXPkUZFjC99LNEppSj/kWp2KTThEs796bgfhuO+P82/lNqHsA=='></script>
vendor: 1 bytes, line 1564
1564
1565<script id="twitter-widgets-js" src="https://platform.twitter.com/widgets.js?ver=20111117"></script>
vendor: 1 bytes, line 1565
1565
1566<script crossorigin='anonymous' type='text/javascript' src='/wp-includes/js/dist/vendor/wp-polyfill.min.js?m=1786440387i'></script>
vendor: 1 bytes, line 1566
1566
1567<script id="wp-hooks-js" src="/wp-content/plugins/gutenberg-core/v24.0.0/build/scripts/hooks/index.min.js?m=1789650619i&ver=f0f188028580e8dc1255"></script>
vendor: 1 bytes, line 1567
1567
1568<script id="wp-i18n-js" src="/wp-content/plugins/gutenberg-core/v24.0.0/build/scripts/i18n/index.min.js?m=1789650619i&ver=1dfe7db3940c23ea9216"></script>
vendor: 1 bytes, line 1568
1568
1569<script id="wp-i18n-js-after"> 1570wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); 1571//# sourceURL=wp-i18n-js-after 1572</script>
vendor: 1 bytes, line 1572
1572
1573<script id="jetpack-carousel-js-extra"> 1574var jetpackSwiperLibraryPath = {"url":"/wp-content/mu-plugins/jetpack-plugin/sun/_inc/blocks/swiper.js"}; 1575var jetpackCarouselStrings = {"widths":[370,700,1000,1200,1400,2000],"is_logged_in":"","lang":"en","ajaxurl":"https://hillel.dev/wp-admin/admin-ajax.php","nonce":"0ce444d1dd","display_exif":"1","display_comments":"1","single_image_gallery":"1","single_image_gallery_media_file":"","background_color":"black","comment":"Comment","post_comment":"Post Comment","write_comment":"Write a Comment...","loading_comments":"Loading Comments...","image_label":"Open image in full-screen.","download_original":"View full size \u003Cspan class=\"photo-size\"\u003E{0}\u003Cspan class=\"photo-size-times\"\u003E\u00d7\u003C/span\u003E{1}\u003C/span\u003E","no_comment_text":"Please be sure to submit some text with your comment.","no_comment_email":"Please provide an email address to comment.","no_comment_author":"Please provide your name to comment.","comment_post_error":"Sorry, but there was an error posting your comment. Please try again later.","comment_approved":"Your comment was approved.","comment_unapproved":"Your comment is in moderation.","camera":"Camera","aperture":"Aperture","shutter_speed":"Shutter Speed","focal_length":"Focal Length","copyright":"Copyright","comment_registration":"0","require_name_email":"1","login_url":"https://hillelcoren.wordpress.com/wp-login.php?redirect_to=https%3A%2F%2Fhillel.dev%2F2026%2F01%2F02%2Fwhy-event-schedule%2F","blog_id":"4721641","meta_data":["camera","aperture","shutter_speed","focal_length","copyright"],"stats_query_args":"blog=4721641&v=wpcom&tz=2&user_id=0&arch_cat=javascript&arch_results=4&subd=hillelcoren","is_public":"1"}; 1576//# sourceURL=jetpack-carousel-js-extra 1577</script>
vendor: 1 bytes, line 1577
1577
1578<script id="sharing-js-js-extra"> 1579var sharing_js_options = {"lang":"en","counts":"1","is_stats_active":"1"}; 1580//# sourceURL=sharing-js-js-extra 1581</script>
vendor: 1 bytes, line 1581
1581
1582<script crossorigin='anonymous' type='text/javascript' src='/_static/??-eJydj9EKwjAMRX/ImomD4YP4KaO2Ycts09K0G/69opuKwh58S85NwglMUZnAGTmDLyq60hELDJijNhd1R1M0wc8BSOEla0dkGxLokoPXOZN5bRmnRcio3KNH1aOLmMCSZEgoMbDQiGoki0F+yXaQDaxbfci0xAbOhZwFo1Mogu6tMYOtJ165uow9P/1q/7aRXie02trroyTuZo2TP+6aQ1U11b6uhxsmfZFV'></script>
vendor: 1 bytes, line 1582
1582
1583<script id="sharing-js-js-after"> 1584window.WPCOM_sharing_popups = window.WPCOM_sharing_popups || {}; 1585window.WPCOM_sharing_popups[ "facebook" ] = "menubar=1,resizable=1,width=600,height=400"; 1586window.WPCOM_sharing_popups = window.WPCOM_sharing_popups || {}; 1587window.WPCOM_sharing_popups[ "twitter" ] = "menubar=1,resizable=1,width=600,height=350"; 1588window.WPCOM_sharing_popups = window.WPCOM_sharing_popups || {}; 1589window.WPCOM_sharing_popups[ "linkedin" ] = "menubar=1,resizable=1,width=580,height=450"; 1590//# sourceURL=sharing-js-js-after 1591</script>
vendor: 1 bytes, line 1591
1591
1592<script id="wp-emoji-settings" type="application/json"> 1593{"baseUrl":"https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/","ext":".png","svgUrl":"https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/svg/","svgExt":".svg","source":{"concatemoji":"/wp-includes/js/wp-emoji-release.min.js?m=1783090810i&ver=7.1.1-alpha-63587"}} 1594</script>
vendor: 1 bytes, line 1594
1594
1595<script type="module"> 1596/*! This file is auto-generated */ 1597var 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)))}); 1598//# sourceURL=/wp-includes/js/wp-emoji-loader.min.js 1599</script>
1599 1600 <iframe src='https://widgets.wp.com/likes/master.html?ver=20260924#ver=20260924' scrolling='no' id='likes-master' name='likes-master' style='display:none;'></iframe> 1601 <div id='likes-other-gravatars' role="dialog" aria-hidden="true" tabindex="-1"><div class="likes-text"><span>%d</span></div><ul class="wpl-avatars sd-like-gravatars"></ul></div> 1602
1602<script src="//stats.wp.com/w.js?69" defer></script>
1602
1602<script type="text/javascript"> 1603_tkq = window._tkq || []; 1604_stq = window._stq || []; 1605_tkq.push(['storeContext', {'blog_id':'4721641','blog_tz':'2','user_lang':'en','blog_lang':'en','user_id':'0'}]); 1606 // Prevent sending pageview tracking from WP-Admin pages. 1607 _stq.push(['view', {'blog':'4721641','v':'wpcom','tz':'2','user_id':'0','arch_cat':'javascript','arch_results':'4','subd':'hillelcoren'}]); 1608 _stq.push(['extra', {'crypt':'UE5XaGUuOTlwaD85flAmcm1mcmZsaDhkV11YdWtpP0NsWnVkPS9sL0ViLndld3BuVT01Uj14Ti1yYTBnX3xuYUQ3Qz1oblZbVHV3MTZ6aj0wcy01aFV6Y1RhRDhuPzkwMncsNm1ad0EldTZtNXh1JSxyYW44MzAxMFBndmg2Wy16eVsyMS1CX1JPYl9SVWNkciYwLUNkU3VqUzVZVmJNKzRGRE9meGR6X0I4fEVBNUdKND1EOEhQXU9SWUMtRmd2RG5jSl9lNWovTn4ya1EyUkdhP1NkZ2VXYjUzN1tsMD1bPWhZTD1IJjUzWFkuTUhaP0cvTVkubURnWT1oalE/em40N3cwYmwwTjdrVSU/LldOMUNIc1V8W0hndG9xUVZhQzNfM29SPVV4VEV2fjJxTnphW2QsNC9NMzkrflJJcDdhbF8rTWRaPXFRJW4xOWxiY2Q0PSVrN1UzZjFpPW5T'}]); 1609_stq.push([ 'clickTrackerInit', '4721641', '0' ]); 1610</script>
1610 1611<noscript><img src="https://pixel.wp.com/b.gif?v=noscript" style="height:1px;width:1px;overflow:hidden;position:absolute;bottom:1px;" alt="" /></noscript> 1612<meta id="bilmur" property="bilmur:data" content="" data-provider="wordpress.com" data-service="simple" data-site-tz="Etc/GMT-2" data-custom-props="{"enq_jquery":"1","enq_wp-polyfill":"1","logged_in":"0","wptheme":"pub\/twentyfifteen","wptheme_is_block":"0"}" > 1613
1613<script defer src="/wp-content/js/bilmur.min.js?i=19&m=202639"></script>
1613 1614</body> 1615</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.