])))+)?\\s*\\/?>/,\n greedy: !0,\n inside: {\n tag: {\n pattern: /^<\\/?[^\\s>\\/]+/,\n inside: {\n punctuation: /^<\\/?/,\n namespace: /^[^\\s>\\/:]+:/\n }\n },\n "special-attr": [],\n "attr-value": {\n pattern: /=\\s*(?:"[^"]*"|\'[^\']*\'|[^\\s\'">=]+)/,\n inside: {\n punctuation: [{\n pattern: /^=/,\n alias: "attr-equals"\n }, /"|\'/]\n }\n },\n punctuation: /\\/?>/,\n "attr-name": {\n pattern: /[^\\s>\\/]+/,\n inside: {\n namespace: /^[^\\s>\\/:]+:/\n }\n }\n }\n },\n entity: [{\n pattern: /&[\\da-z]{1,8};/i,\n alias: "named-entity"\n }, /?[\\da-f]{1,8};/i]\n }, Prism.languages.markup.tag.inside["attr-value"].inside.entity = Prism.languages.markup.entity, Prism.languages.markup.doctype.inside["internal-subset"].inside = Prism.languages.markup, Prism.hooks.add("wrap", function(a) {\n "entity" === a.type && (a.attributes.title = a.content.replace(/&/, "&"))\n }), Object.defineProperty(Prism.languages.markup.tag, "addInlined", {\n value: function(a, e) {\n var s = {};\n s["language-" + e] = {\n pattern: /(^$)/i,\n lookbehind: !0,\n inside: Prism.languages[e]\n }, s.cdata = /^$/i;\n var t = {\n "included-cdata": {\n pattern: //i,\n inside: s\n }\n };\n t["language-" + e] = {\n pattern: /[\\s\\S]+/,\n inside: Prism.languages[e]\n };\n var n = {};\n n[a] = {\n pattern: RegExp("(<__[^>]*>)(?:))*\\\\]\\\\]>|(?!)".replace(/__/g, function() {\n return a\n }), "i"),\n lookbehind: !0,\n greedy: !0,\n inside: t\n }, Prism.languages.insertBefore("markup", "cdata", n)\n }\n }), Object.defineProperty(Prism.languages.markup.tag, "addAttribute", {\n value: function(a, e) {\n Prism.languages.markup.tag.inside["special-attr"].push({\n pattern: RegExp("(^|[\\"\'\\\\s])(?:" + a + ")\\\\s*=\\\\s*(?:\\"[^\\"]*\\"|\'[^\']*\'|[^\\\\s\'\\">=]+(?=[\\\\s>]))", "i"),\n lookbehind: !0,\n inside: {\n "attr-name": /^[^\\s=]+/,\n "attr-value": {\n pattern: /=[\\s\\S]+/,\n inside: {\n value: {\n pattern: /(^=\\s*(["\']|(?!["\'])))\\S[\\s\\S]*(?=\\2$)/,\n lookbehind: !0,\n alias: [e, "language-" + e],\n inside: Prism.languages[e]\n },\n punctuation: [{\n pattern: /^=/,\n alias: "attr-equals"\n }, /"|\'/]\n }\n }\n }\n })\n }\n }), Prism.languages.html = Prism.languages.markup, Prism.languages.mathml = Prism.languages.markup, Prism.languages.svg = Prism.languages.markup, Prism.languages.xml = Prism.languages.extend("markup", {}), Prism.languages.ssml = Prism.languages.xml, Prism.languages.atom = Prism.languages.xml, Prism.languages.rss = Prism.languages.xml;\n ! function(s) {\n var e = /(?:"(?:\\\\(?:\\r\\n|[\\s\\S])|[^"\\\\\\r\\n])*"|\'(?:\\\\(?:\\r\\n|[\\s\\S])|[^\'\\\\\\r\\n])*\')/;\n s.languages.css = {\n comment: /\\/\\*[\\s\\S]*?\\*\\//,\n atrule: {\n pattern: /@[\\w-](?:[^;{\\s]|\\s+(?![\\s{]))*(?:;|(?=\\s*\\{))/,\n inside: {\n rule: /^@[\\w-]+/,\n "selector-function-argument": {\n pattern: /(\\bselector\\s*\\(\\s*(?![\\s)]))(?:[^()\\s]|\\s+(?![\\s)])|\\((?:[^()]|\\([^()]*\\))*\\))+(?=\\s*\\))/,\n lookbehind: !0,\n alias: "selector"\n },\n keyword: {\n pattern: /(^|[^\\w-])(?:and|not|only|or)(?![\\w-])/,\n lookbehind: !0\n }\n }\n },\n url: {\n pattern: RegExp("\\\\burl\\\\((?:" + e.source + "|(?:[^\\\\\\\\\\r\\n()\\"\']|\\\\\\\\[^])*)\\\\)", "i"),\n greedy: !0,\n inside: {\n function: /^url/i,\n punctuation: /^\\(|\\)$/,\n string: {\n pattern: RegExp("^" + e.source + "$"),\n alias: "url"\n }\n }\n },\n selector: {\n pattern: RegExp("(^|[{}\\\\s])[^{}\\\\s](?:[^{};\\"\'\\\\s]|\\\\s+(?![\\\\s{])|" + e.source + ")*(?=\\\\s*\\\\{)"),\n lookbehind: !0\n },\n string: {\n pattern: e,\n greedy: !0\n },\n property: {\n pattern: /(^|[^-\\w\\xA0-\\uFFFF])(?!\\s)[-_a-z\\xA0-\\uFFFF](?:(?!\\s)[-\\w\\xA0-\\uFFFF])*(?=\\s*:)/i,\n lookbehind: !0\n },\n important: /!important\\b/i,\n function: {\n pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\\()/i,\n lookbehind: !0\n },\n punctuation: /[(){};:,]/\n }, s.languages.css.atrule.inside.rest = s.languages.css;\n var t = s.languages.markup;\n t && (t.tag.addInlined("style", "css"), t.tag.addAttribute("style", "css"))\n }(Prism);\n Prism.languages.clike = {\n comment: [{\n pattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n lookbehind: !0,\n greedy: !0\n }, {\n pattern: /(^|[^\\\\:])\\/\\/.*/,\n lookbehind: !0,\n greedy: !0\n }],\n string: {\n pattern: /(["\'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n greedy: !0\n },\n "class-name": {\n pattern: /(\\b(?:class|extends|implements|instanceof|interface|new|trait)\\s+|\\bcatch\\s+\\()[\\w.\\\\]+/i,\n lookbehind: !0,\n inside: {\n punctuation: /[.\\\\]/\n }\n },\n keyword: /\\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\\b/,\n boolean: /\\b(?:false|true)\\b/,\n function: /\\b\\w+(?=\\()/,\n number: /\\b0x[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,\n operator: /[<>]=?|[!=]=?=?|--?|\\+\\+?|&&?|\\|\\|?|[?*/~^%]/,\n punctuation: /[{}[\\];(),.:]/\n };\n Prism.languages.javascript = Prism.languages.extend("clike", {\n "class-name": [Prism.languages.clike["class-name"], {\n pattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$A-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\.(?:constructor|prototype))/,\n lookbehind: !0\n }],\n keyword: [{\n pattern: /((?:^|\\})\\s*)catch\\b/,\n lookbehind: !0\n }, {\n pattern: /(^|[^.]|\\.\\.\\.\\s*)\\b(?:as|assert(?=\\s*\\{)|async(?=\\s*(?:function\\b|\\(|[$\\w\\xA0-\\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\\s*(?:\\{|$))|for|from(?=\\s*(?:[\'"]|$))|function|(?:get|set)(?=\\s*(?:[#\\[$\\w\\xA0-\\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\\b/,\n lookbehind: !0\n }],\n function: /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,\n number: {\n pattern: RegExp("(^|[^\\\\w$])(?:NaN|Infinity|0[bB][01]+(?:_[01]+)*n?|0[oO][0-7]+(?:_[0-7]+)*n?|0[xX][\\\\dA-Fa-f]+(?:_[\\\\dA-Fa-f]+)*n?|\\\\d+(?:_\\\\d+)*n|(?:\\\\d+(?:_\\\\d+)*(?:\\\\.(?:\\\\d+(?:_\\\\d+)*)?)?|\\\\.\\\\d+(?:_\\\\d+)*)(?:[Ee][+-]?\\\\d+(?:_\\\\d+)*)?)(?![\\\\w$])"),\n lookbehind: !0\n },\n operator: /--|\\+\\+|\\*\\*=?|=>|&&=?|\\|\\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/\n }), Prism.languages.javascript["class-name"][0].pattern = /(\\b(?:class|extends|implements|instanceof|interface|new)\\s+)[\\w.\\\\]+/, Prism.languages.insertBefore("javascript", "keyword", {\n regex: {\n pattern: /((?:^|[^$\\w\\xA0-\\uFFFF."\'\\])\\s]|\\b(?:return|yield))\\s*)\\/(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}(?=(?:\\s|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*(?:$|[\\r\\n,.;:})\\]]|\\/\\/))/,\n lookbehind: !0,\n greedy: !0,\n inside: {\n "regex-source": {\n pattern: /^(\\/)[\\s\\S]+(?=\\/[a-z]*$)/,\n lookbehind: !0,\n alias: "language-regex",\n inside: Prism.languages.regex\n },\n "regex-delimiter": /^\\/|\\/$/,\n "regex-flags": /^[a-z]+$/\n }\n },\n "function-variable": {\n pattern: /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*[=:]\\s*(?:async\\s*)?(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)\\s*=>))/,\n alias: "function"\n },\n parameter: [{\n pattern: /(function(?:\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)?\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\))/,\n lookbehind: !0,\n inside: Prism.languages.javascript\n }, {\n pattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$a-z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*=>)/i,\n lookbehind: !0,\n inside: Prism.languages.javascript\n }, {\n pattern: /(\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*=>)/,\n lookbehind: !0,\n inside: Prism.languages.javascript\n }, {\n pattern: /((?:\\b|\\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\\w\\xA0-\\uFFFF]))(?:(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*)\\(\\s*|\\]\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*\\{)/,\n lookbehind: !0,\n inside: Prism.languages.javascript\n }],\n constant: /\\b[A-Z](?:[A-Z_]|\\dx?)*\\b/\n }), Prism.languages.insertBefore("javascript", "string", {\n hashbang: {\n pattern: /^#!.*/,\n greedy: !0,\n alias: "comment"\n },\n "template-string": {\n pattern: /`(?:\\\\[\\s\\S]|\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}|(?!\\$\\{)[^\\\\`])*`/,\n greedy: !0,\n inside: {\n "template-punctuation": {\n pattern: /^`|`$/,\n alias: "string"\n },\n interpolation: {\n pattern: /((?:^|[^\\\\])(?:\\\\{2})*)\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}/,\n lookbehind: !0,\n inside: {\n "interpolation-punctuation": {\n pattern: /^\\$\\{|\\}$/,\n alias: "punctuation"\n },\n rest: Prism.languages.javascript\n }\n },\n string: /[\\s\\S]+/\n }\n },\n "string-property": {\n pattern: /((?:^|[,{])[ \\t]*)(["\'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\2)[^\\\\\\r\\n])*\\2(?=\\s*:)/m,\n lookbehind: !0,\n greedy: !0,\n alias: "property"\n }\n }), Prism.languages.insertBefore("javascript", "operator", {\n "literal-property": {\n pattern: /((?:^|[,{])[ \\t]*)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*:)/m,\n lookbehind: !0,\n alias: "property"\n }\n }), Prism.languages.markup && (Prism.languages.markup.tag.addInlined("script", "javascript"), Prism.languages.markup.tag.addAttribute("on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)", "javascript")), Prism.languages.js = Prism.languages.javascript;\n ! function(o) {\n var t = o.util.clone(o.languages.javascript),\n e = "(?:\\\\{*\\\\.{3}(?:[^{}]|)*\\\\})";\n\n function n(t, n) {\n return t = t.replace(//g, function() {\n return "(?:\\\\s|//.*(?!.)|/\\\\*(?:[^*]|\\\\*(?!/))\\\\*/)"\n }).replace(//g, function() {\n return "(?:\\\\{(?:\\\\{(?:\\\\{[^{}]*\\\\}|[^{}])*\\\\}|[^{}])*\\\\})"\n }).replace(//g, function() {\n return e\n }), RegExp(t, n)\n }\n e = n(e).source, o.languages.jsx = o.languages.extend("markup", t), o.languages.jsx.tag.pattern = n("?(?:[\\\\w.:-]+(?:+(?:[\\\\w.:$-]+(?:=(?:\\"(?:\\\\\\\\[^]|[^\\\\\\\\\\"])*\\"|\'(?:\\\\\\\\[^]|[^\\\\\\\\\'])*\'|[^\\\\s{\'\\"/>=]+|))?|))**/?)?>"), o.languages.jsx.tag.inside.tag.pattern = /^<\\/?[^\\s>\\/]*/, o.languages.jsx.tag.inside["attr-value"].pattern = /=(?!\\{)(?:"(?:\\\\[\\s\\S]|[^\\\\"])*"|\'(?:\\\\[\\s\\S]|[^\\\\\'])*\'|[^\\s\'">]+)/, o.languages.jsx.tag.inside.tag.inside["class-name"] = /^[A-Z]\\w*(?:\\.[A-Z]\\w*)*$/, o.languages.jsx.tag.inside.comment = t.comment, o.languages.insertBefore("inside", "attr-name", {\n spread: {\n pattern: n(""),\n inside: o.languages.jsx\n }\n }, o.languages.jsx.tag), o.languages.insertBefore("inside", "special-attr", {\n script: {\n pattern: n("="),\n alias: "language-javascript",\n inside: {\n "script-punctuation": {\n pattern: /^=(?=\\{)/,\n alias: "punctuation"\n },\n rest: o.languages.jsx\n }\n }\n }, o.languages.jsx.tag);\n var i = function(t) {\n return t ? "string" == typeof t ? t : "string" == typeof t.content ? t.content : t.content.map(i).join("") : ""\n },\n r = function(t) {\n for (var n = [], e = 0; e < t.length; e++) {\n var a = t[e],\n s = !1;\n if ("string" != typeof a && ("tag" === a.type && a.content[0] && "tag" === a.content[0].type ? "" === a.content[0].content[0].content ? 0 < n.length && n[n.length - 1].tagName === i(a.content[0].content[1]) && n.pop() : "/>" === a.content[a.content.length - 1].content || n.push({\n tagName: i(a.content[0].content[1]),\n openedBraces: 0\n }) : 0 < n.length && "punctuation" === a.type && "{" === a.content ? n[n.length - 1].openedBraces++ : 0 < n.length && 0 < n[n.length - 1].openedBraces && "punctuation" === a.type && "}" === a.content ? n[n.length - 1].openedBraces-- : s = !0), (s || "string" == typeof a) && 0 < n.length && 0 === n[n.length - 1].openedBraces) {\n var g = i(a);\n e < t.length - 1 && ("string" == typeof t[e + 1] || "plain-text" === t[e + 1].type) && (g += i(t[e + 1]), t.splice(e + 1, 1)), 0 < e && ("string" == typeof t[e - 1] || "plain-text" === t[e - 1].type) && (g = i(t[e - 1]) + g, t.splice(e - 1, 1), e--), t[e] = new o.Token("plain-text", g, null, g)\n }\n a.content && "string" != typeof a.content && r(a.content)\n }\n };\n o.hooks.add("after-tokenize", function(t) {\n "jsx" !== t.language && "tsx" !== t.language || r(t.tokens)\n })\n }(Prism);\n ! function(e) {\n e.languages.typescript = e.languages.extend("javascript", {\n "class-name": {\n pattern: /(\\b(?:class|extends|implements|instanceof|interface|new|type)\\s+)(?!keyof\\b)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?:\\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,\n lookbehind: !0,\n greedy: !0,\n inside: null\n },\n builtin: /\\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\\b/\n }), e.languages.typescript.keyword.push(/\\b(?:abstract|declare|is|keyof|readonly|require)\\b/, /\\b(?:asserts|infer|interface|module|namespace|type)\\b(?=\\s*(?:[{_$a-zA-Z\\xA0-\\uFFFF]|$))/, /\\btype\\b(?=\\s*(?:[\\{*]|$))/), delete e.languages.typescript.parameter, delete e.languages.typescript["literal-property"];\n var s = e.languages.extend("typescript", {});\n delete s["class-name"], e.languages.typescript["class-name"].inside = s, e.languages.insertBefore("typescript", "function", {\n decorator: {\n pattern: /@[$\\w\\xA0-\\uFFFF]+/,\n inside: {\n at: {\n pattern: /^@/,\n alias: "operator"\n },\n function: /^[\\s\\S]+/\n }\n },\n "generic-function": {\n pattern: /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\\s*\\()/,\n greedy: !0,\n inside: {\n function: /^#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*/,\n generic: {\n pattern: /<[\\s\\S]+/,\n alias: "class-name",\n inside: s\n }\n }\n }\n }), e.languages.ts = e.languages.typescript\n }(Prism);\n ! function(e) {\n var a = e.util.clone(e.languages.typescript);\n e.languages.tsx = e.languages.extend("jsx", a), delete e.languages.tsx.parameter, delete e.languages.tsx["literal-property"];\n var t = e.languages.tsx.tag;\n t.pattern = RegExp("(^|[^\\\\w$]|(?=))(?:" + t.pattern.source + ")", t.pattern.flags), t.lookbehind = !0\n }(Prism);\n "undefined" != typeof Prism && "undefined" != typeof document && (Element.prototype.matches || (Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector), Prism.plugins.UnescapedMarkup = !0, Prism.hooks.add("before-highlightall", function(e) {\n e.selector += \', [class*="lang-"] script[type="text/plain"], [class*="language-"] script[type="text/plain"], script[type="text/plain"][class*="lang-"], script[type="text/plain"][class*="language-"]\'\n }), Prism.hooks.add("before-sanity-check", function(e) {\n var t = e.element;\n if (t.matches(\'script[type="text/plain"]\')) {\n var a = document.createElement("code"),\n c = document.createElement("pre");\n c.className = a.className = t.className;\n var n = t.dataset;\n return Object.keys(n || {}).forEach(function(e) {\n Object.prototype.hasOwnProperty.call(n, e) && (c.dataset[e] = n[e])\n }), a.textContent = e.code = e.code.replace(/<\\/script(?:>|>)/gi, "<\\/script>"), c.appendChild(a), t.parentNode.replaceChild(c, t), void(e.element = a)\n }\n if (!e.code) {\n var o = t.childNodes;\n 1 === o.length && "#comment" == o[0].nodeName && (t.textContent = e.code = o[0].textContent)\n }\n }));\n<\/script>',sidebarHtml:"",vars:{asideHtml:"",logoImageUrl:"https://hodgef.com/assets/images/blog2.png",heroImageUrl:"https://hodgef.com/assets/images/DrsCc1H.jpeg",links:'[ {"icon":"fa-github","text":"GitHub","url":"https://github.com/hodgef"}, { "icon":"fa-linkedin", "text":"LinkedIn", "url":"https://www.linkedin.com/in/franciscohodge/" } ]',metaImage:"https://i.imgur.com/fUMnNch.png",footerLeft:'\x3c!----\x3ePrivacy PolicyTerms of Use',footerRight:'',coverPlacementHtml:'