<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title>Des Holmes Technical Leadership, SaaS, DevOps and Azure</title>
    <link>https://dholmes.co.uk/</link>
    <description>Des Holmes provides Technical Leadership and Product Development to grow Startups, SaaS, DevOps and Azure Public Cloud</description>
    <generator>Hugo</generator>
    <language>en-gb</language>
    <atom:link href="https://dholmes.co.uk/index.xml" rel="self" type="application/rss+xml"/>
    <xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><item>
      <title>Frontend Development Code Quality - What's Good Enough?</title>
      <link>https://dholmes.co.uk/blog/frontend-development-code-quality/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/frontend-development-code-quality/</guid>
      <description>&lt;h2 id="whats-good-enough-for-code-quality"&gt;What&amp;rsquo;s good enough for code quality?&lt;/h2&gt;
&lt;p&gt;Starting any new project is always difficult; whether it&amp;rsquo;s a small side project or the next &lt;code&gt;ba-zillon&lt;/code&gt; dollar startup. Here&amp;rsquo;s my thoughts on which code quality checks should make it into your next Frontend project.&lt;/p&gt;
&lt;h3 id="tldr"&gt;TL;DR&lt;/h3&gt;
&lt;p&gt;The following are &lt;strong&gt;guaranteed&lt;/strong&gt; to add value and save pain in the longrun:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="#eslint"&gt;Checking for lint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#prettier"&gt;Formatting code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#npm-audit"&gt;Checking your dependencies for vulnerabilities&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="#jest"&gt;Writing unit tests&lt;/a&gt; is a good investment, &lt;em&gt;if&lt;/em&gt; the circumstances and codebase are right.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Skills &amp; Knowledge</title>
      <link>https://dholmes.co.uk/skills/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/skills/</guid>
      <description>&lt;h3 id="programming-amp-databases"&gt;Programming &amp;amp; Databases&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt; &lt;a href="https://en.wikipedia.org/wiki/Object-oriented_programming"&gt;OOP (Object-Oriented Programming)&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Functional_programming"&gt;Functional&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.djangoproject.com/"&gt;Django&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flask.palletsprojects.com/"&gt;Flask&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://databricks.com/"&gt;Databricks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://reactjs.org/"&gt;React&lt;/a&gt; (&lt;a href="https://www.typescriptlang.org/"&gt;TypeScript&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/HTML"&gt;HTML (HyperText Markup Language&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Cascading_Style_Sheets"&gt;CSS (Cascading Style Sheets&lt;/a&gt;)
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sass-lang.com/"&gt;SaSS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mysql.com/"&gt;MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/home"&gt;MongoDB&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="hosting-provisioning-and-infrastructure"&gt;Hosting, provisioning, and infrastructure&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.docker.com"&gt;Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-us/"&gt;Microsoft Azure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Linux flavours:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://alpinelinux.org/"&gt;Alpine Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.centos.org/"&gt;CentOS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://httpd.apache.org/"&gt;Apache web server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nginx.com/"&gt;Nginx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="delivery-tools"&gt;Delivery tools&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Development,_testing,_acceptance_and_production"&gt;DTAP&lt;/a&gt; workflow definition&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-us/services/devops/"&gt;Azure DevOps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Continuous_integration"&gt;CI (Continuous Integration)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bitbucket.org/product/features/pipelines"&gt;Bitbucket Pipelines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://travis-ci.org/"&gt;Travis CI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://circleci.com/"&gt;CircleCI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/software/jira"&gt;JIRA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.atlassian.com/software/confluence"&gt;Confluence&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="scm-source-control-managementhttpsenwikipediaorgwikisource_control_management"&gt;&lt;a href="https://en.wikipedia.org/wiki/Source_Control_Management"&gt;SCM (Source Control Management)&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/"&gt;git&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nvie/gitflow"&gt;git Flow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bitbucket.org/"&gt;Bitbucket&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="testing-methodologies-and-tools"&gt;Testing methodologies and tools&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD (Test-Driven Development)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Behavior-driven_development"&gt;BDD (Behaviour-Driven Development)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.pytest.org/en/latest/"&gt;Pytest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webdriver.io/"&gt;WebdriverIO&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cypress.io/"&gt;Cypress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jestjs.io/"&gt;Jest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jasmine.github.io/"&gt;Jasmine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="core-technical-activities"&gt;Core technical activities&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Requirements_analysis"&gt;Requirements gathering and analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Functional_specification"&gt;Functional specification&lt;/a&gt; &amp;amp; &lt;a href="https://en.wikipedia.org/wiki/Software_architecture"&gt;Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Software_testing"&gt;Testing&lt;/a&gt; &amp;amp; &lt;a href="https://en.wikipedia.org/wiki/Debugging"&gt;Debugging&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Software_deployment"&gt;Deployment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="development-methodologies-sdlchttpsenwikipediaorgwikisystems_development_life-cycle"&gt;Development methodologies (&lt;a href="https://en.wikipedia.org/wiki/Systems_development_life-cycle"&gt;SDLC&lt;/a&gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Agile_software_development"&gt;Agile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Software_prototyping"&gt;Prototyping&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Iterative_and_incremental_development"&gt;Iterative and Incremental development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Rapid_application_development"&gt;RAD (Rapid application development)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Work History</title>
      <link>https://dholmes.co.uk/work-history/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/work-history/</guid>
      <description>&lt;h2 id="waltz-january-2026---nowhttpswwwwaltzteam"&gt;&lt;a href="https://www.waltz.team"&gt;Waltz, January 2026 - Now&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Technical Consultant: DevOps, Product Development &amp;amp; Azure&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Key Technologies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI, &lt;a href="https://azure.microsoft.com/en-us/"&gt;Azure&lt;/a&gt;, &lt;a href="https://azure.microsoft.com/en-us/services/devops/"&gt;Azure DevOps&lt;/a&gt;, &lt;a href="https://www.docker.com"&gt;Docker&lt;/a&gt;, &lt;a href="https://nestjs.com/"&gt;NestJS&lt;/a&gt;, &lt;a href="https://nextjs.org/"&gt;Next.js&lt;/a&gt;, &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="notable-june-2023---december-2025"&gt;Notable, June 2023 - December 2025&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Technical Consultant: DevOps, Product Development &amp;amp; Azure&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Key Technologies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nestjs.com/"&gt;NestJS&lt;/a&gt;, &lt;a href="https://nextjs.org/"&gt;Next.js&lt;/a&gt;, &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt;, &lt;a href="https://www.docker.com"&gt;Docker&lt;/a&gt;, &lt;a href="https://azure.microsoft.com/en-us/"&gt;Azure&lt;/a&gt;, &lt;a href="https://azure.microsoft.com/en-us/services/devops/"&gt;Azure DevOps&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="propertyloop-february-2021---april-2023"&gt;PropertyLoop, February 2021 - April 2023&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;VP Engineering: DevOps, Product Development &amp;amp; Azure&lt;/strong&gt;. Scaling up the MVP platform.&lt;/p&gt;
&lt;p&gt;Key Activities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Introduction of &lt;a href="https://dholmes.co.uk/tags/code-quality/"&gt;development standards&lt;/a&gt; &amp;amp; DevOps methodologies&lt;/li&gt;
&lt;li&gt;Consolidation of Azure infrastructure&lt;/li&gt;
&lt;li&gt;Revision of platform architecture&lt;/li&gt;
&lt;li&gt;Management of offshore Engineering teams&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Key Technologies:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Working with Des Holmes: Testimonials</title>
      <link>https://dholmes.co.uk/testimonials/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/testimonials/</guid>
      <description>&lt;h2 id="shailash-sanghrajkahttpswwwlinkedincominshailashsanghrajka-hentsū---2020"&gt;&lt;a href="https://www.linkedin.com/in/shailashsanghrajka/"&gt;Shailash Sanghrajka&lt;/a&gt; (Hentsū - 2020)&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;“&lt;a href="https://dholmes.co.uk/"&gt;Des&lt;/a&gt; was a colleague for 3 years whom I thoroughly enjoyed working with. He is an &lt;a href="https://dholmes.co.uk/tags/technical-leadership/"&gt;accomplished technologist&lt;/a&gt; exhibiting a deep knowledge of Data, &lt;a href="https://dholmes.co.uk/tags/sdlc/"&gt;SDLC&lt;/a&gt; and &lt;a href="https://dholmes.co.uk/tags/devops"&gt;DevOps&lt;/a&gt; methodology where he was always hands on and “in the detail” of projects. He showed a great a great manner when working with &lt;a href="https://dholmes.co.uk/tags/technical-partnerships/"&gt;clients&lt;/a&gt; on their &lt;a href="https://dholmes.co.uk/tags/product-development/"&gt;project implementation&lt;/a&gt; as well as commercial awareness when engaging in pre-sales activity.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dholmes.co.uk/"&gt;Des&lt;/a&gt; was a &lt;a href="https://dholmes.co.uk/tags/technical-leadership/"&gt;solid leader&lt;/a&gt; building and mentoring a development team that executed and delivered both internal and &lt;a href="https://dholmes.co.uk/tags/technical-partnerships/"&gt;client projects&lt;/a&gt;. One of Des’s key strengths is his ability to remain calm, balanced and assured when faced with pressurised moments thus finding the best solutions for all parties involved.“&lt;/p&gt;</description>
    </item>
    <item>
      <title>Azure DevOps Pipelines: Frontend Code Quality Checks</title>
      <link>https://dholmes.co.uk/blog/ado-pipelines-frontend-code-quality/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/ado-pipelines-frontend-code-quality/</guid>
      <description>&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Check out the &lt;a href="https://dev.azure.com/codecupltd/DesHolmes/_git/dholmes.co.uk-blog-frontend-code-quality-example"&gt;example repo&lt;/a&gt; to see the &lt;a href="https://dev.azure.com/codecupltd/DesHolmes/_git/dholmes.co.uk-blog-frontend-code-quality-example?path=/azure-pipelines.yml"&gt;Azure Pipeline file&lt;/a&gt;, and all the &lt;a href="https://dev.azure.com/codecupltd/DesHolmes/_git/dholmes.co.uk-blog-frontend-code-quality-example?path=/package.json"&gt;associated NPM scripts&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="azure-dev-what"&gt;Azure Dev-What?&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s get this out of the way. Yes, It&amp;rsquo;s been said before:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;But, Azure DevOps isn&amp;rsquo;t as good as JIRA&amp;hellip;&amp;rdquo;&lt;/strong&gt; &lt;em&gt;by Every Product Owner, Project Manager &amp;amp; Developer ever&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;hellip;and I agree. I do &lt;strong&gt;love&lt;/strong&gt; &lt;a href="https://www.atlassian.com/software/jira"&gt;JIRA&lt;/a&gt;, I&amp;rsquo;ve spent as much time as the PMs learning JQL and squeezing every bit of automation and reporting out of the &lt;a href="https://www.atlassian.com"&gt;Atlassian suite&lt;/a&gt; to please &lt;em&gt;EVERYONE&lt;/em&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GitHub Actions: Frontend Code Quality Checks</title>
      <link>https://dholmes.co.uk/blog/github-actions-frontend-code-quality/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/github-actions-frontend-code-quality/</guid>
      <description>&lt;h2 id="octocat-goodies"&gt;Octocat-goodies&lt;/h2&gt;
&lt;p&gt;All developers &lt;strong&gt;LOVE&lt;/strong&gt; GitHub, and the introduction of GitHub Actions was just what the community was begging for.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve already written about code quality in: &lt;a href="https://dholmes.co.uk/blog/frontend-development-code-quality/"&gt;Frontend Development Code Quality - What&amp;rsquo;s good enough?&lt;/a&gt; In this blog post I&amp;rsquo;ll be showing how to &lt;em&gt;&amp;ldquo;Automate the boring stuff&amp;rdquo;&lt;/em&gt; and cover those checks.&lt;/p&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Check out the &lt;a href="https://github.com/desholmes/dholmes.co.uk-blog-frontend-code-quality-example"&gt;example repo&lt;/a&gt; to see the &lt;a href="https://github.com/desholmes/dholmes.co.uk-blog-frontend-code-quality-example/blob/main/.github/workflows/github-actions.yml"&gt;GitHub Actions file&lt;/a&gt;, and all the &lt;a href="https://github.com/desholmes/dholmes.co.uk-blog-frontend-code-quality-example/blob/main/package.json"&gt;associated NPM scripts&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;To get up and running follow the &lt;a href="https://docs.github.com/en/actions/quickstart"&gt;GitHub Actions Quick start guide&lt;/a&gt;. If you&amp;rsquo;ve used other CI/CD tools, and defined your build pipelines using YAML, there&amp;rsquo;s nothing scary here.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GitLab CI/CD: Frontend Code Quality Checks</title>
      <link>https://dholmes.co.uk/blog/gitlab-actions-frontend-code-quality/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/gitlab-actions-frontend-code-quality/</guid>
      <description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;GitLab is another populate tool for developers.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve already written about code quality in: &lt;a href="https://dholmes.co.uk/blog/frontend-development-code-quality/"&gt;Frontend Development Code Quality - What&amp;rsquo;s good enough?&lt;/a&gt; In this blog post I&amp;rsquo;ll be showing how to &lt;em&gt;&amp;ldquo;Automate the boring stuff&amp;rdquo;&lt;/em&gt; and cover those checks.&lt;/p&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Check out the &lt;a href="https://gitlab.com/codecupltd/dholmes.co.uk-blog-frontend-code-quality-example"&gt;example repo&lt;/a&gt; to see the &lt;a href="https://gitlab.com/codecupltd/dholmes.co.uk-blog-frontend-code-quality-example/-/blob/main/.gitlab-ci.yml"&gt;GitLab CI file&lt;/a&gt;, and all the &lt;a href="https://gitlab.com/codecupltd/dholmes.co.uk-blog-frontend-code-quality-example/-/blob/main/package.json#L6"&gt;associated NPM scripts&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;To get up and running follow the &lt;a href="https://docs.gitlab.com/ee/ci/quick_start/"&gt;Get started with GitLab CI/CD guide&lt;/a&gt;. If you&amp;rsquo;ve used other CI/CD tools, and defined your build pipelines using YAML, there&amp;rsquo;s nothing scary here.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Text Terminal: The NPM Package that Started Text Quest</title>
      <link>https://dholmes.co.uk/blog/text-terminal/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/text-terminal/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/text-terminal-cover.png" alt="The npm package that started text quest"&gt;&lt;/p&gt;
&lt;p&gt;Image credit: ©&lt;em&gt;&lt;a href="https://christopherdavidryan.com/prints/escapism-print"&gt;Christopher David Ryan&lt;/a&gt; &amp;ldquo;Escapism&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.npmjs.com/package/text-terminal"&gt;text-terminal&lt;/a&gt; and &lt;a href="https://textquest.io"&gt;test quest&lt;/a&gt; were born in October 2020. The family had outgrown the &lt;a href="https://www.kickstarter.com/projects/alexklein/kano-a-computer-anyone-can-make"&gt;kano&lt;/a&gt;, and the world was in the clutches of the COVID-19 pandemic. A few text-based games had sparked some excitement in the kids, including: &lt;a href="https://github.com/doublespeakgames/adarkroom"&gt;A Dark Room&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/KanoComputing/terminal-quest"&gt;Kano&amp;rsquo;s Terminal Quest&lt;/a&gt;. So, rather than playing I suggested we have a go at making our own :nerd:.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Case Study: Serverless Research Platform in Azure</title>
      <link>https://dholmes.co.uk/blog/case-study-serverless-research-platform-in-azure/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/case-study-serverless-research-platform-in-azure/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/case-study-serverless-research-platform-in-azure.png" alt="Serverless Research Platform in Azure"&gt;&lt;/p&gt;
&lt;h2 id="the-challenge"&gt;The Challenge&lt;/h2&gt;
&lt;p&gt;An established asset manager approached me with a research platform challenge. Their application brought together market data with their own research and opinions into one view to create and evaluate their strategies.&lt;/p&gt;
&lt;p&gt;Their legacy implementation ran on several servers as a monolithic application, with a hand managed and complex infrastructure. The overall performance was poor, which is unacceptable in a trading research environment where timeliness, speed and accuracy are paramount. In addition, the ongoing cost of this setup was hard to justify.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cloud Adoption Decision-Making: Rehost, Refactor or Rebuild?</title>
      <link>https://dholmes.co.uk/blog/cloud-adoption-decision-making-rehost-refactor-or-rebuild/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/cloud-adoption-decision-making-rehost-refactor-or-rebuild/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/case-study-serverless-research-platform-in-azure.png" alt="Cloud Adoption Decision-Making: Rehost, Refactor or Rebuild?"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Are you a cloud candidate?&lt;/strong&gt; This is a question that should be answered with care. Many businesses are striving to modernize applications or assets by migrating to the cloud. There are three key ways to handle your cloud adoption strategy or cloud migration: rehosting, refactoring or rebuilding (rearchitecting). To steer you in the right direction, let&amp;rsquo;s examine the advantages, with a following word of caution for each process.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Text Quest: A Low/No Code Approach to Game Design</title>
      <link>https://dholmes.co.uk/blog/text-quest-javascript-game-engine/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/text-quest-javascript-game-engine/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/text-quest-logo.png" alt="The open source, JavaScript game engine for running text-based adventure games"&gt;&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/desholmes/text-quest"&gt;text quest&lt;/a&gt; is an open source game engine for running text-based adventure games; using a low/no code approach to game design.&lt;/p&gt;
&lt;p&gt;A list of available games can be found on the &lt;a href="https://textquest.io/"&gt;text quest home page&lt;/a&gt;. You can also read more about the games in detail in the &lt;a href="https://textquest.io/games"&gt;games&lt;/a&gt; section (be careful - spoilers alert!).&lt;/p&gt;
&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/desholmes/text-quest"&gt;Text quest&lt;/a&gt; was create to:&lt;/p&gt;</description>
    </item>
    <item>
      <title>TffT! A Simple Countdown Clock</title>
      <link>https://dholmes.co.uk/blog/tfft-simple-countdown-clock/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/tfft-simple-countdown-clock/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/tfft-simple-countdown.png" alt="TffT. A simple countdown clock"&gt;&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;Everyone looks forward to something; birthdays, weddings, births, holidays, launching a new project.&lt;/p&gt;
&lt;p&gt;TffT! is an simple countdown clock written in JavaScript to countdown those seconds to that special event. Tick&amp;hellip; Tock&amp;hellip;&lt;/p&gt;
&lt;p&gt;Hosted at: &lt;a href="https://tfft.dholmes.co.uk/"&gt;tfft.dholmes.co.uk&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The project repo (&lt;a href="https://github.com/desholmes/tfft-countdown"&gt;desholmes/tfft-countdown&lt;/a&gt;) uses:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/"&gt;Node v16.14.2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sass-lang.com/"&gt;SaSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://parceljs.org/"&gt;Parcel Bundler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://eslint.org/"&gt;ESLint&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prettier.io/"&gt;Prettier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pages.github.com/"&gt;GitHub Pages&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="related-posts"&gt;Related Posts&lt;/h2&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dholmes.co.uk/blog/text-quest-javascript-game-engine/"&gt;Text Quest: A Low/No Code Approach to Game Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dholmes.co.uk/blog/text-terminal/"&gt;Text Terminal: The NPM Package that Started Text Quest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dholmes.co.uk/blog/frontend-development-code-quality/"&gt;Frontend Development Code Quality - What’s Good Enough?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dholmes.co.uk/blog/tfft-simple-countdown-clock/"&gt;TffT! A simple countdown clock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>BrowserFocus: Convert Google Analytics Data into a Browser Support Matrix</title>
      <link>https://dholmes.co.uk/blog/browserfocus-intro/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/browserfocus-intro/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/browserfocus.png" alt="Convert Google Analytics into a browser support matrix; tailored to your users"&gt;&lt;/p&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Web development is a &lt;strong&gt;complex&lt;/strong&gt; and &lt;strong&gt;expensive&lt;/strong&gt; process. Use &lt;a href="https://browserfocus.io/"&gt;BrowserFocus&lt;/a&gt; to convert your Google Analytics data into a browser support matrix based on the browsers and devices your users are &lt;em&gt;actually&lt;/em&gt; using.&lt;/p&gt;
&lt;h2 id="why-browserfocus"&gt;Why BrowserFocus?&lt;/h2&gt;
&lt;p&gt;Whether you&amp;rsquo;re building web applications for yourself or clients the question of browser support always comes up.&lt;/p&gt;
&lt;p&gt;The Financial Directors wife might want the website to work on her 3 year old &amp;ldquo;phablet&amp;rdquo; - but what percentage of your users use the same device to access your site? If it&amp;rsquo;s no one - &lt;strong&gt;ditch the support for that device&lt;/strong&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>5 Steps to Reduce Your React App CI/CD Build Minutes</title>
      <link>https://dholmes.co.uk/blog/5-steps-to-reduce-react-cicd-build-minutes/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/5-steps-to-reduce-react-cicd-build-minutes/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/reduce-cost.jpg" alt="Here are 5 steps to reduce your build minutes"&gt;&lt;/p&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://dholmes.co.uk/tags/devops/"&gt;CI/CD pipelines&lt;/a&gt; are great for automation and are an essential part of any software delivery process. This post covers React, but the principles can be applied to any application stack.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Problem&lt;/strong&gt;: As your application grows in size your build minutes will also start to balloon. As well as the raw cost of build minutes (eg: &lt;a href="https://about.gitlab.com/pricing/"&gt;GitLab&lt;/a&gt;, &lt;a href="https://azure.microsoft.com/en-us/pricing/details/devops/azure-devops-services/"&gt;Azure DevOps&lt;/a&gt;, &lt;a href="https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions"&gt;GitHub&lt;/a&gt;) build times can also affect productivity, validation cycles, and ultimately speed to market.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Turn Gloomy January into Genuary with Generative Art</title>
      <link>https://dholmes.co.uk/blog/genuary-p5js-boilerplate/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/genuary-p5js-boilerplate/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/p5js-circles.png" alt="Get into some creative coding in January with my p5.js boilerplate"&gt;&lt;/p&gt;
&lt;h2 id="gen-u-what"&gt;Gen-u-what?&lt;/h2&gt;
&lt;p&gt;Genuary is a perfect excuse to get into some &lt;a href="https://dholmes.co.uk/p5js-circles/dist/"&gt;creative coding&lt;/a&gt; during the dark and cold month of January.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://genuary.art/prompts"&gt;genuary.art/prompts&lt;/a&gt; provides a list of daily prompts to theme your generative art for that day&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;hellip;you don’t have to follow the prompt exactly, but you should try &amp;#x1f60a;&lt;/p&gt;
&lt;p&gt;Over the 744 hours of January you&amp;rsquo;ll have the perfect excuse to geek out and get creative. You can use any language, framework or medium.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Get a Perfect Google Lighthouse Score</title>
      <link>https://dholmes.co.uk/blog/getting-a-perfect-google-lighthouse-score/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/getting-a-perfect-google-lighthouse-score/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/100-lighthouse.png" alt="Get a perfect Google Lighthouse"&gt;&lt;/p&gt;
&lt;h2 id="how-to-get-a-perfect-google-lighthouse-score"&gt;How to get a perfect Google Lighthouse score&lt;/h2&gt;
&lt;h3 id="tldr"&gt;TLDR;&lt;/h3&gt;
&lt;p&gt;Google Lighthouse provides a useful set of guidelines and insights to improve your website, it&amp;rsquo;s accessibility and experience. It&amp;rsquo;s not always possible to get a perfect score. But, generally speaking if your scores are green - you&amp;rsquo;re on the right path.&lt;/p&gt;
&lt;h2 id="how-i-got-a-perfect-google-lighthouse-score"&gt;How I got a perfect Google Lighthouse score&lt;/h2&gt;
&lt;p&gt;For &lt;a href="https://dholmes.co.uk"&gt;dholmes.co.uk&lt;/a&gt; I had to address the following:&lt;/p&gt;</description>
    </item>
    <item>
      <title>What Are Diagram Scripting Languages?</title>
      <link>https://dholmes.co.uk/blog/what-are-diagram-scripting-languages/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/what-are-diagram-scripting-languages/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/diagram-scripting-language.png" alt="What Are Diagram Scripting Languages"&gt;&lt;/p&gt;
&lt;h2 id="tldr"&gt;TLDR;&lt;/h2&gt;
&lt;p&gt;Diagram scripting languages are specialised programming languages used to create diagrams and charts. They generally have a simple syntax, and offer a wide range of features for customising the appearance of your diagrams.&lt;/p&gt;
&lt;p&gt;Diagram scripting languages offer the following benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Version control&lt;/strong&gt;: Diagram scripting languages can be easily versioned using &lt;a href="https://dholmes.co.uk/tags/web-development"&gt;git&lt;/a&gt;, and used with &lt;a href="https://dholmes.co.uk/tags/automation"&gt;automation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Speed&lt;/strong&gt;: Generally it will be quicker to generate diagrams using diagram scripting languages, rather than manually drawing them via a GUI tool&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Diversity&lt;/strong&gt;: Diagram scripting languages offer a wide variety of different diagrams and charts&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Popular Diagram Scripting Languages include:&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Benefits of Using a Feature-Based Branching Strategy</title>
      <link>https://dholmes.co.uk/blog/feature-based-branching-strategy/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/feature-based-branching-strategy/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/git-branching-hell.png" alt="Avoid git branching hell"&gt;&lt;/p&gt;
&lt;h2 id="tldr"&gt;TLDR;&lt;/h2&gt;
&lt;p&gt;Using feature-based branching strategy will help you avoid git hell, and has the following benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Easier collaboration&lt;/strong&gt;: Each feature has its own dedicated branch, allowing multiple team members to work independently on different features at the same time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fewer merge conflicts&lt;/strong&gt;: Short-lived feature branches contain code for a specific feature, reducing the chance of merge conflicts when merging into the main codebase.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faster deployments&lt;/strong&gt;: Features can be deployed as they are completed, since each feature is developed and tested in its own dedicated branch before being merged into the main codebase.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better visibility&lt;/strong&gt;: Allows team members to easily see which features are being developed and the progress of each feature, improving project planning and resource allocation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-is-a-git-branching-strategy"&gt;What is a Git Branching Strategy?&lt;/h2&gt;
&lt;p&gt;A git branching strategy is a set of guidelines and practices to follow when working with branches in a git repository. Git branches are used to separate different streams of development within a codebase, allowing team members to work on new features or bug fixes without disrupting the main codebase.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using The BlurHash Algorithm With A TypeScript Azure Function</title>
      <link>https://dholmes.co.uk/blog/open-source-azure-function-typescript-blurhash/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/open-source-azure-function-typescript-blurhash/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/blur-hash.jpeg" alt="blur hash"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;^ That&amp;rsquo;s a BlurHash&amp;rsquo;d image, not a UFO &amp;#x1f604;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="tldr"&gt;TLDR;&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/desholmes/blurhash.dholmes.co.uk"&gt;Here&amp;rsquo;s an Open Source repo&lt;/a&gt; containing an Azure Function written in TypeScript to encode and decode images using the BlurHash algorithm. See &lt;a href="./#usage"&gt;usage docs below&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="background"&gt;Background&lt;/h2&gt;
&lt;p&gt;The demand for high-quality images has never been greater. However, with higher quality comes larger file sizes, which can make loading times slow and frustrating for users. This is where the &lt;a href="https://github.com/woltapp/blurhash"&gt;BlurHash algorithm&lt;/a&gt; comes in.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Simple Docker Tagging Strategy</title>
      <link>https://dholmes.co.uk/blog/simple-docker-tagging-strategy/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/simple-docker-tagging-strategy/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/docker-tagging.png" alt="docker"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;^ Thanks &lt;a href="https://labs.openai.com/"&gt;DALL·E&lt;/a&gt; for the &amp;ldquo;knitted docker whale&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="tldr"&gt;TLDR;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Avoid using the &lt;code&gt;latest&lt;/code&gt; tag for your Docker images: This will lead to compatibility issues; always version pin using &lt;a href="https://semver.org/"&gt;Semantic Versioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;RC&lt;/code&gt; Docker tags for branches which aren&amp;rsquo;t &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Use a task in your pipeline to check if the target Docker tag already exists in your Docker Container Registry&lt;/li&gt;
&lt;li&gt;Use a &lt;a href="https://hub.docker.com/r/desholmes/acr-rc-deleter"&gt;clean up task&lt;/a&gt; (repo: &lt;a href="https://github.com/desholmes/acr-tag-deleter"&gt;desholmes/acr-tag-deleter&lt;/a&gt;) in your &lt;a href="https://dholmes.co.uk/tags/ci-cd/"&gt;CI/CD&lt;/a&gt; pipeline, or Docker Registry policies to keep your Docker Registry tidy&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Clone the Open Source &lt;a href="https://github.com/desholmes/dholmes.co.uk-blog-frontend-code-quality-example"&gt;desholmes/dholmes.co.uk-blog-frontend-code-quality-example&lt;/a&gt; repo and follow the post below&amp;hellip;&lt;/p&gt;</description>
    </item>
    <item>
      <title>ImageFly: On-The-Fly Image Transformations</title>
      <link>https://dholmes.co.uk/blog/imagefly-on-the-fly-image-transformations/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/imagefly-on-the-fly-image-transformations/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/imagefly.png" alt="ImageFly: On-The-Fly Image Transformations"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;^ Thanks &lt;a href="https://labs.openai.com/"&gt;DALL·E&lt;/a&gt; for the &amp;ldquo;High quality photo of a fly riding a space rocket&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Page optimisation and page speed are becoming increasingly important for websites and web applications. One of the biggest contributors to page load times is the size of the images being served (also mentioned in &lt;a href="https://dholmes.co.uk/blog/open-source-azure-function-typescript-blurhash/"&gt;Using The BlurHash Algorithm With A TypeScript Azure Function&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;You might have legacy systems that contain older generation image types. Introducing large changes to support modern an image format like &lt;a href="https://developers.google.com/speed/webp"&gt;WebP&lt;/a&gt; can be time consuming and expensive.&lt;/p&gt;</description>
    </item>
    <item>
      <title>5 Approaches To Solve LLM Token Limits</title>
      <link>https://dholmes.co.uk/blog/5-approaches-to-solve-llm-token-limits/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/5-approaches-to-solve-llm-token-limits/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/llm-token-limits.webp" alt="Solving LLM Token Limits"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;^ Thanks &lt;a href="https://labs.openai.com/"&gt;DALL·E&lt;/a&gt; for: &lt;em&gt;&amp;ldquo;An artistic interpretation of an AI LLM&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;The &lt;a href="#approaches-for-solving-token-limits"&gt;following approaches&lt;/a&gt; can be used to work around token limits in large language models (&lt;a href="https://dholmes.co.uk/tags/llm/"&gt;LLMs&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#tldr"&gt;TL;DR&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#introduction"&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#approaches-for-solving-token-limits"&gt;Approaches for Solving Token Limits&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#1-truncation"&gt;1. Truncation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-sampling"&gt;2. Sampling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-chunking"&gt;3. Chunking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-encoding-and-decoding"&gt;4. Encoding and Decoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#5-fine-tuning"&gt;5 Fine-tuning&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Language models have revolutionized natural language processing (&lt;a href="https://dholmes.co.uk/tags/nlp/"&gt;NLP&lt;/a&gt;) tasks, such as text generation, summarisation, and translation. However, one of the challenges in working with language models is the limitation imposed by the maximum number of tokens they can handle.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hack your career with these 6 mental models and ChatGPT</title>
      <link>https://dholmes.co.uk/blog/6-career-hacks-using-chatgpt/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/6-career-hacks-using-chatgpt/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/6-mental-models-chatgpt.png" alt="Solving LLM Token Limits"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;^ Thanks &lt;a href="https://huggingface.co/spaces/darkstorm2150/Stable-Diffusion-Protogen-x3.4-webui"&gt;Stable-Diffusion-Protogen-x3.4-webui&lt;/a&gt; for: &lt;em&gt;&amp;ldquo;An abstract oil painting of a mental model&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;The following mental models can be used to solve problems and expand the way you think using &lt;a href="https://dholmes.co.uk/tags/ai"&gt;ChatGPT&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="#1-occams-razor"&gt;Occam’s Razor&lt;/a&gt;: Simplest explanation is preferable to one of more complex. Simple theories are easier to verify and easier to execute&lt;/li&gt;
&lt;li&gt;&lt;a href="#2-cost-benefit-analysis"&gt;Cost-Benefit Analysis&lt;/a&gt;: A process to determine the economic benefit of a decision and whether it&amp;rsquo;s worth pursuing&lt;/li&gt;
&lt;li&gt;&lt;a href="#3-the-eisenhower-matrix"&gt;The Eisenhower Matrix&lt;/a&gt;: A method that utilises the principles of importance and urgency to organize priorities and workload&lt;/li&gt;
&lt;li&gt;&lt;a href="#4-social-proof"&gt;Social Proof&lt;/a&gt;: A psychological phenomenon where people assume the actions of others in an attempt to reflect correct behavior for a given situation&lt;/li&gt;
&lt;li&gt;&lt;a href="#5-network-effects"&gt;Network Effects&lt;/a&gt;: A phenomenon whereby increased numbers of people or participants improve the value of a good or service&lt;/li&gt;
&lt;li&gt;&lt;a href="#6-risk-reward-analysis"&gt;Risk-Reward Analysis&lt;/a&gt;: A practice of arriving at an optimal statistical design based on the trade-offs involved between risks and rewards&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="1-occams-razor"&gt;1. Occam’s Razor&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Occam's_razor"&gt;Occam’s Razor&lt;/a&gt; is a scientific and philosophical rule that entities should not be multiplied unnecessarily which is interpreted as requiring that the simplest of competing theories be preferred to the more complex or that explanations of unknown phenomena be sought first in terms of known quantities.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Effectiveness of Flash Cards for Exam Revision</title>
      <link>https://dholmes.co.uk/blog/the-effectiveness-of-flash-cards-for-exam-revision/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/the-effectiveness-of-flash-cards-for-exam-revision/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/study23-screenshot.png" alt="Study23 GCSE Flash Cards"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GCSE Maths formulae flash cards from &lt;a href="https://www.study23.io/products/gcse-maths-formula-flash-cards/"&gt;Study23 GCSE Maths Formulae Flash Cards&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Finding effective study tools is crucial for success. One such tool that has stood the test of time is the humble flash card. Whether you&amp;rsquo;re a student preparing for exams or someone looking to enhance your learning, flash cards can be a game-changer. In this blog post, we&amp;rsquo;ll delve into the key facts and benefits of using flash cards for revision, exploring why they are a powerhouse in the realm of effective studying.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making Your Deployments Boring: What's Good Enough?</title>
      <link>https://dholmes.co.uk/blog/making-your-deployments-boring-whats-good-enough/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/making-your-deployments-boring-whats-good-enough/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/disaster-girl.png" alt="It worked in dev, it&amp;rsquo;s an ops problem now"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Releasing updates should be the most boring part of the product release cycle (&lt;em&gt;yes, you read that correctly&lt;/em&gt; - &lt;strong&gt;boring!&lt;/strong&gt;).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;The more mature your product and the larger your team, the more boring your deployments should be:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Always work on the most important thing&lt;/li&gt;
&lt;li&gt;Add automation when it makes sense&lt;/li&gt;
&lt;li&gt;Define a &amp;ldquo;what&amp;rsquo;s good enough?&amp;rdquo; checklist for your product releases&lt;/li&gt;
&lt;li&gt;Only pay for school once&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="do-you-dread-deployments"&gt;Do you Dread Deployments?&lt;/h2&gt;
&lt;p&gt;If your deployments induce a sense of dread, the chances are you&amp;rsquo;re doing something wrong. Successful deployments shouldn&amp;rsquo;t be about creating big bang spectacles or pushing things to the limit. They’re about small, carefully considered, predictable pushes. How boring your releases are is directly related to the question &lt;strong&gt;&amp;ldquo;What&amp;rsquo;s good enough?&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Studio23 Games: Launching a Game Development Studio</title>
      <link>https://dholmes.co.uk/blog/studio23-games/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/studio23-games/</guid>
      <description>&lt;p&gt;&lt;img src="https://games.studio23.london/img/studio23-games-social-cover.jpg" alt="Studio23 Games"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Good things come to those who &lt;del&gt;wait&lt;/del&gt; &lt;strong&gt;work for it&lt;/strong&gt;!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="what-is-studio23-games"&gt;What is Studio23 Games?&lt;/h2&gt;
&lt;p&gt;I recently had the pleasure of helping launching a new startup: &lt;a href="https://games.studio23.london/"&gt;Studio23 Games&lt;/a&gt;, a small game development studio based in London.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve collaborated previously on &lt;a href="https://games.studio23.london/blog/text-quest/"&gt;Text Quest&lt;/a&gt;, an open-source text-based adventure game. Initially, releasing &lt;a href="https://games.studio23.london/games/sleepy-traveller/"&gt;Text Quest: The Sleepy Traveller (v1.2)&lt;/a&gt; with the follow up &lt;a href="https://games.studio23.london/games/halloween/"&gt;Text Quest: Halloween (v1.0)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://games.studio23.london/"&gt;Studio23 Games&lt;/a&gt; are sharing their journey and experiences in game development through their &lt;a href="https://games.studio23.london/blog/"&gt;blog&lt;/a&gt; as well as their other releases: &lt;a href="https://games.studio23.london/games/roblox-easy-obby-alpha/"&gt;Roblox: Easy Rainbow Obby!&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Managing Technical Debt: A Startup Founder's Guide</title>
      <link>https://dholmes.co.uk/blog/managing-technical-debt-a-startup-founders-guide/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/managing-technical-debt-a-startup-founders-guide/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/tech-debt-rocket.png" alt="Tech debt rocket"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Image by &lt;a href="https://pixabay.com/users/andsproject-26081561/"&gt;ANDRI TEGAR MAHARDIKA&lt;/a&gt; from &lt;a href="https://pixabay.com/"&gt;Pixabay&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Surviving in the startup world means being skillful and fast. A startup innovates, iterates, and pivots at a rapid speed that larger corporate companies can only dream of. Part of the race includes getting version 1 of your product or service to market as quickly as possible.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;During the initial development phase, accruing &amp;lsquo;&lt;strong&gt;technical debt&lt;/strong&gt;&amp;rsquo; - &lt;em&gt;shortcuts the job quicker today, but will need fixing in the future&lt;/em&gt; – is almost inevitable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Developing Emails Doesn't Have to Be Hell</title>
      <link>https://dholmes.co.uk/blog/developing-emails-doesnt-have-to-be-hell/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/developing-emails-doesnt-have-to-be-hell/</guid>
      <description>&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/email-heart.jpeg" alt="Love developing emails"&gt;&lt;/p&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Using &lt;strong&gt;React Email&lt;/strong&gt; and &lt;strong&gt;Azure Functions&lt;/strong&gt; can simplify email templating, improve reusability, and provide a maintainable and scalable solution for managing and sending emails in your application.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a sample repo to get started: &lt;a href="https://github.com/desholmes/react-emails-azure-functions"&gt;github.com/desholmes/react-emails-azure-functions&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="strike-fear-into-the-heart-of-any-developer"&gt;Strike fear into the heart of any developer&amp;hellip;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;We need to develop some emails for our application &amp;#x1f636;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nooooo! &amp;#x1f922;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ask any developer and they will tell you developing emails is like being transported back in time to the dark ages of web development. It&amp;rsquo;s a world where tables reign supreme, inline styles are the norm, and compatibility issues are rife (IE5 anyone?).&lt;/p&gt;</description>
    </item>
    <item>
      <title>New Release: Submit - Love Solving Clues</title>
      <link>https://dholmes.co.uk/blog/submit-love-solving-clues/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/submit-love-solving-clues/</guid>
      <description>&lt;h2 id="what-is-submit"&gt;What is Submit?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://app.submit.rocks"&gt;Submit&lt;/a&gt;&lt;/strong&gt; is a fun clue-solving game that will challenge your brain and keep you entertained every day! &amp;#x1f9e0;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://www.submit.rocks/img/submit-screen.gif" alt="Love developing emails"&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s completely free to play, and there are &lt;strong&gt;no ads&lt;/strong&gt;!&lt;/p&gt;
&lt;h2 id="how-to-play"&gt;How to Play?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Visit Daily&lt;/strong&gt;: A new clue is posted every day&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Submit - Your Answer&lt;/strong&gt;: You can have as many attempts as you want&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Submit - Get Help&lt;/strong&gt;: If you&amp;rsquo;re stuck, you can reveal as many letters you need&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="why-is-it-called-submit"&gt;Why is it called &lt;strong&gt;Submit&lt;/strong&gt;?&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;re happy with the name &lt;strong&gt;Submit&lt;/strong&gt; - because of it&amp;rsquo;s double meaning &amp;#x1f913; You need to either keep guessing, or give up.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Solved: Site configuration property (Site.SiteConfig.LinuxFxVersion) for Flex Consumption sites is invalid</title>
      <link>https://dholmes.co.uk/blog/azure-function-app-flex-error/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/blog/azure-function-app-flex-error/</guid>
      <description>&lt;h2 id="error"&gt;Error&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ve encountered the error below when trying to upgrade the version of Node.js for your Linux Flex Consumption Function App (via Azure az CLI &amp;amp; Azure portal)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;The following site configuration property (Site.SiteConfig.LinuxFxVersion) for Flex Consumption sites is invalid. Please remove or rename it before retrying.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Screenshot from the Azure portal after trying to update the stack settings:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://dholmes.co.uk/img/azure-function-flex-error-ap-screenshot.png" alt=""&gt;&lt;/p&gt;
&lt;h2 id="solution-use-the-az-cli"&gt;Solution: Use the az cli&lt;/h2&gt;
&lt;p&gt;Run the following command from the terminal replacing &lt;code&gt;[RESOURCE NAME]&lt;/code&gt; with the name of your Function App and &lt;code&gt;[RESOURCE GROUP]&lt;/code&gt; with the name of the Resource Group:&lt;/p&gt;</description>
    </item>
    <item>
      <title/>
      <link>https://dholmes.co.uk/reading-list/bookmarklets/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://dholmes.co.uk/reading-list/bookmarklets/</guid>
      <description>&lt;p&gt;Drag the links onto your browser toolbar to use.&lt;/p&gt;

&lt;a
  class="btn-secondary"
  href="javascript:(function%20()%20{%0A%20%20'use%20strict';%0A%0A%20%20function%20_regeneratorRuntime()%20{%0A%20%20%20%20_regeneratorRuntime%20=%20function%20()%20{%0A%20%20%20%20%20%20return%20e;%0A%20%20%20%20};%0A%20%20%20%20var%20t,%0A%20%20%20%20%20%20e%20=%20{},%0A%20%20%20%20%20%20r%20=%20Object.prototype,%0A%20%20%20%20%20%20n%20=%20r.hasOwnProperty,%0A%20%20%20%20%20%20o%20=%20Object.defineProperty%20||%20function%20(t,%20e,%20r)%20{%0A%20%20%20%20%20%20%20%20t[e]%20=%20r.value;%0A%20%20%20%20%20%20},%0A%20%20%20%20%20%20i%20=%20%22function%22%20==%20typeof%20Symbol%20%3F%20Symbol%20:%20{},%0A%20%20%20%20%20%20a%20=%20i.iterator%20||%20%22%40%40iterator%22,%0A%20%20%20%20%20%20c%20=%20i.asyncIterator%20||%20%22%40%40asyncIterator%22,%0A%20%20%20%20%20%20u%20=%20i.toStringTag%20||%20%22%40%40toStringTag%22;%0A%20%20%20%20function%20define(t,%20e,%20r)%20{%0A%20%20%20%20%20%20return%20Object.defineProperty(t,%20e,%20{%0A%20%20%20%20%20%20%20%20value:%20r,%0A%20%20%20%20%20%20%20%20enumerable:%20!0,%0A%20%20%20%20%20%20%20%20configurable:%20!0,%0A%20%20%20%20%20%20%20%20writable:%20!0%0A%20%20%20%20%20%20}),%20t[e];%0A%20%20%20%20}%0A%20%20%20%20try%20{%0A%20%20%20%20%20%20define({},%20%22%22);%0A%20%20%20%20}%20catch%20(t)%20{%0A%20%20%20%20%20%20define%20=%20function%20(t,%20e,%20r)%20{%0A%20%20%20%20%20%20%20%20return%20t[e]%20=%20r;%0A%20%20%20%20%20%20};%0A%20%20%20%20}%0A%20%20%20%20function%20wrap(t,%20e,%20r,%20n)%20{%0A%20%20%20%20%20%20var%20i%20=%20e%20%26%26%20e.prototype%20instanceof%20Generator%20%3F%20e%20:%20Generator,%0A%20%20%20%20%20%20%20%20a%20=%20Object.create(i.prototype),%0A%20%20%20%20%20%20%20%20c%20=%20new%20Context(n%20||%20[]);%0A%20%20%20%20%20%20return%20o(a,%20%22_invoke%22,%20{%0A%20%20%20%20%20%20%20%20value:%20makeInvokeMethod(t,%20r,%20c)%0A%20%20%20%20%20%20}),%20a;%0A%20%20%20%20}%0A%20%20%20%20function%20tryCatch(t,%20e,%20r)%20{%0A%20%20%20%20%20%20try%20{%0A%20%20%20%20%20%20%20%20return%20{%0A%20%20%20%20%20%20%20%20%20%20type:%20%22normal%22,%0A%20%20%20%20%20%20%20%20%20%20arg:%20t.call(e,%20r)%0A%20%20%20%20%20%20%20%20};%0A%20%20%20%20%20%20}%20catch%20(t)%20{%0A%20%20%20%20%20%20%20%20return%20{%0A%20%20%20%20%20%20%20%20%20%20type:%20%22throw%22,%0A%20%20%20%20%20%20%20%20%20%20arg:%20t%0A%20%20%20%20%20%20%20%20};%0A%20%20%20%20%20%20}%0A%20%20%20%20}%0A%20%20%20%20e.wrap%20=%20wrap;%0A%20%20%20%20var%20h%20=%20%22suspendedStart%22,%0A%20%20%20%20%20%20l%20=%20%22suspendedYield%22,%0A%20%20%20%20%20%20f%20=%20%22executing%22,%0A%20%20%20%20%20%20s%20=%20%22completed%22,%0A%20%20%20%20%20%20y%20=%20{};%0A%20%20%20%20function%20Generator()%20{}%0A%20%20%20%20function%20GeneratorFunction()%20{}%0A%20%20%20%20function%20GeneratorFunctionPrototype()%20{}%0A%20%20%20%20var%20p%20=%20{};%0A%20%20%20%20define(p,%20a,%20function%20()%20{%0A%20%20%20%20%20%20return%20this;%0A%20%20%20%20});%0A%20%20%20%20var%20d%20=%20Object.getPrototypeOf,%0A%20%20%20%20%20%20v%20=%20d%20%26%26%20d(d(values([])));%0A%20%20%20%20v%20%26%26%20v%20!==%20r%20%26%26%20n.call(v,%20a)%20%26%26%20(p%20=%20v);%0A%20%20%20%20var%20g%20=%20GeneratorFunctionPrototype.prototype%20=%20Generator.prototype%20=%20Object.create(p);%0A%20%20%20%20function%20defineIteratorMethods(t)%20{%0A%20%20%20%20%20%20[%22next%22,%20%22throw%22,%20%22return%22].forEach(function%20(e)%20{%0A%20%20%20%20%20%20%20%20define(t,%20e,%20function%20(t)%20{%0A%20%20%20%20%20%20%20%20%20%20return%20this._invoke(e,%20t);%0A%20%20%20%20%20%20%20%20});%0A%20%20%20%20%20%20});%0A%20%20%20%20}%0A%20%20%20%20function%20AsyncIterator(t,%20e)%20{%0A%20%20%20%20%20%20function%20invoke(r,%20o,%20i,%20a)%20{%0A%20%20%20%20%20%20%20%20var%20c%20=%20tryCatch(t[r],%20t,%20o);%0A%20%20%20%20%20%20%20%20if%20(%22throw%22%20!==%20c.type)%20{%0A%20%20%20%20%20%20%20%20%20%20var%20u%20=%20c.arg,%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20=%20u.value;%0A%20%20%20%20%20%20%20%20%20%20return%20h%20%26%26%20%22object%22%20==%20typeof%20h%20%26%26%20n.call(h,%20%22__await%22)%20%3F%20e.resolve(h.__await).then(function%20(t)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20invoke(%22next%22,%20t,%20i,%20a);%0A%20%20%20%20%20%20%20%20%20%20},%20function%20(t)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20invoke(%22throw%22,%20t,%20i,%20a);%0A%20%20%20%20%20%20%20%20%20%20})%20:%20e.resolve(h).then(function%20(t)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20u.value%20=%20t,%20i(u);%0A%20%20%20%20%20%20%20%20%20%20},%20function%20(t)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20invoke(%22throw%22,%20t,%20i,%20a);%0A%20%20%20%20%20%20%20%20%20%20});%0A%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20a(c.arg);%0A%20%20%20%20%20%20}%0A%20%20%20%20%20%20var%20r;%0A%20%20%20%20%20%20o(this,%20%22_invoke%22,%20{%0A%20%20%20%20%20%20%20%20value:%20function%20(t,%20n)%20{%0A%20%20%20%20%20%20%20%20%20%20function%20callInvokeWithMethodAndArg()%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20new%20e(function%20(e,%20r)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20invoke(t,%20n,%20e,%20r);%0A%20%20%20%20%20%20%20%20%20%20%20%20});%0A%20%20%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20%20%20return%20r%20=%20r%20%3F%20r.then(callInvokeWithMethodAndArg,%20callInvokeWithMethodAndArg)%20:%20callInvokeWithMethodAndArg();%0A%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20});%0A%20%20%20%20}%0A%20%20%20%20function%20makeInvokeMethod(e,%20r,%20n)%20{%0A%20%20%20%20%20%20var%20o%20=%20h;%0A%20%20%20%20%20%20return%20function%20(i,%20a)%20{%0A%20%20%20%20%20%20%20%20if%20(o%20===%20f)%20throw%20Error(%22Generator%20is%20already%20running%22);%0A%20%20%20%20%20%20%20%20if%20(o%20===%20s)%20{%0A%20%20%20%20%20%20%20%20%20%20if%20(%22throw%22%20===%20i)%20throw%20a;%0A%20%20%20%20%20%20%20%20%20%20return%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20value:%20t,%0A%20%20%20%20%20%20%20%20%20%20%20%20done:%20!0%0A%20%20%20%20%20%20%20%20%20%20};%0A%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20for%20(n.method%20=%20i,%20n.arg%20=%20a;;)%20{%0A%20%20%20%20%20%20%20%20%20%20var%20c%20=%20n.delegate;%0A%20%20%20%20%20%20%20%20%20%20if%20(c)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20u%20=%20maybeInvokeDelegate(c,%20n);%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(u)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(u%20===%20y)%20continue;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20u;%0A%20%20%20%20%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20%20%20if%20(%22next%22%20===%20n.method)%20n.sent%20=%20n._sent%20=%20n.arg;else%20if%20(%22throw%22%20===%20n.method)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(o%20===%20h)%20throw%20o%20=%20s,%20n.arg;%0A%20%20%20%20%20%20%20%20%20%20%20%20n.dispatchException(n.arg);%0A%20%20%20%20%20%20%20%20%20%20}%20else%20%22return%22%20===%20n.method%20%26%26%20n.abrupt(%22return%22,%20n.arg);%0A%20%20%20%20%20%20%20%20%20%20o%20=%20f;%0A%20%20%20%20%20%20%20%20%20%20var%20p%20=%20tryCatch(e,%20r,%20n);%0A%20%20%20%20%20%20%20%20%20%20if%20(%22normal%22%20===%20p.type)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(o%20=%20n.done%20%3F%20s%20:%20l,%20p.arg%20===%20y)%20continue;%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20value:%20p.arg,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20done:%20n.done%0A%20%20%20%20%20%20%20%20%20%20%20%20};%0A%20%20%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20%20%20%22throw%22%20===%20p.type%20%26%26%20(o%20=%20s,%20n.method%20=%20%22throw%22,%20n.arg%20=%20p.arg);%0A%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20};%0A%20%20%20%20}%0A%20%20%20%20function%20maybeInvokeDelegate(e,%20r)%20{%0A%20%20%20%20%20%20var%20n%20=%20r.method,%0A%20%20%20%20%20%20%20%20o%20=%20e.iterator[n];%0A%20%20%20%20%20%20if%20(o%20===%20t)%20return%20r.delegate%20=%20null,%20%22throw%22%20===%20n%20%26%26%20e.iterator.return%20%26%26%20(r.method%20=%20%22return%22,%20r.arg%20=%20t,%20maybeInvokeDelegate(e,%20r),%20%22throw%22%20===%20r.method)%20||%20%22return%22%20!==%20n%20%26%26%20(r.method%20=%20%22throw%22,%20r.arg%20=%20new%20TypeError(%22The%20iterator%20does%20not%20provide%20a%20'%22%20+%20n%20+%20%22'%20method%22)),%20y;%0A%20%20%20%20%20%20var%20i%20=%20tryCatch(o,%20e.iterator,%20r.arg);%0A%20%20%20%20%20%20if%20(%22throw%22%20===%20i.type)%20return%20r.method%20=%20%22throw%22,%20r.arg%20=%20i.arg,%20r.delegate%20=%20null,%20y;%0A%20%20%20%20%20%20var%20a%20=%20i.arg;%0A%20%20%20%20%20%20return%20a%20%3F%20a.done%20%3F%20(r[e.resultName]%20=%20a.value,%20r.next%20=%20e.nextLoc,%20%22return%22%20!==%20r.method%20%26%26%20(r.method%20=%20%22next%22,%20r.arg%20=%20t),%20r.delegate%20=%20null,%20y)%20:%20a%20:%20(r.method%20=%20%22throw%22,%20r.arg%20=%20new%20TypeError(%22iterator%20result%20is%20not%20an%20object%22),%20r.delegate%20=%20null,%20y);%0A%20%20%20%20}%0A%20%20%20%20function%20pushTryEntry(t)%20{%0A%20%20%20%20%20%20var%20e%20=%20{%0A%20%20%20%20%20%20%20%20tryLoc:%20t[0]%0A%20%20%20%20%20%20};%0A%20%20%20%20%20%201%20in%20t%20%26%26%20(e.catchLoc%20=%20t[1]),%202%20in%20t%20%26%26%20(e.finallyLoc%20=%20t[2],%20e.afterLoc%20=%20t[3]),%20this.tryEntries.push(e);%0A%20%20%20%20}%0A%20%20%20%20function%20resetTryEntry(t)%20{%0A%20%20%20%20%20%20var%20e%20=%20t.completion%20||%20{};%0A%20%20%20%20%20%20e.type%20=%20%22normal%22,%20delete%20e.arg,%20t.completion%20=%20e;%0A%20%20%20%20}%0A%20%20%20%20function%20Context(t)%20{%0A%20%20%20%20%20%20this.tryEntries%20=%20[{%0A%20%20%20%20%20%20%20%20tryLoc:%20%22root%22%0A%20%20%20%20%20%20}],%20t.forEach(pushTryEntry,%20this),%20this.reset(!0);%0A%20%20%20%20}%0A%20%20%20%20function%20values(e)%20{%0A%20%20%20%20%20%20if%20(e%20||%20%22%22%20===%20e)%20{%0A%20%20%20%20%20%20%20%20var%20r%20=%20e[a];%0A%20%20%20%20%20%20%20%20if%20(r)%20return%20r.call(e);%0A%20%20%20%20%20%20%20%20if%20(%22function%22%20==%20typeof%20e.next)%20return%20e;%0A%20%20%20%20%20%20%20%20if%20(!isNaN(e.length))%20{%0A%20%20%20%20%20%20%20%20%20%20var%20o%20=%20-1,%0A%20%20%20%20%20%20%20%20%20%20%20%20i%20=%20function%20next()%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(;%20++o%20%3C%20e.length;)%20if%20(n.call(e,%20o))%20return%20next.value%20=%20e[o],%20next.done%20=%20!1,%20next;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20next.value%20=%20t,%20next.done%20=%20!0,%20next;%0A%20%20%20%20%20%20%20%20%20%20%20%20};%0A%20%20%20%20%20%20%20%20%20%20return%20i.next%20=%20i;%0A%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20}%0A%20%20%20%20%20%20throw%20new%20TypeError(typeof%20e%20+%20%22%20is%20not%20iterable%22);%0A%20%20%20%20}%0A%20%20%20%20return%20GeneratorFunction.prototype%20=%20GeneratorFunctionPrototype,%20o(g,%20%22constructor%22,%20{%0A%20%20%20%20%20%20value:%20GeneratorFunctionPrototype,%0A%20%20%20%20%20%20configurable:%20!0%0A%20%20%20%20}),%20o(GeneratorFunctionPrototype,%20%22constructor%22,%20{%0A%20%20%20%20%20%20value:%20GeneratorFunction,%0A%20%20%20%20%20%20configurable:%20!0%0A%20%20%20%20}),%20GeneratorFunction.displayName%20=%20define(GeneratorFunctionPrototype,%20u,%20%22GeneratorFunction%22),%20e.isGeneratorFunction%20=%20function%20(t)%20{%0A%20%20%20%20%20%20var%20e%20=%20%22function%22%20==%20typeof%20t%20%26%26%20t.constructor;%0A%20%20%20%20%20%20return%20!!e%20%26%26%20(e%20===%20GeneratorFunction%20||%20%22GeneratorFunction%22%20===%20(e.displayName%20||%20e.name));%0A%20%20%20%20},%20e.mark%20=%20function%20(t)%20{%0A%20%20%20%20%20%20return%20Object.setPrototypeOf%20%3F%20Object.setPrototypeOf(t,%20GeneratorFunctionPrototype)%20:%20(t.__proto__%20=%20GeneratorFunctionPrototype,%20define(t,%20u,%20%22GeneratorFunction%22)),%20t.prototype%20=%20Object.create(g),%20t;%0A%20%20%20%20},%20e.awrap%20=%20function%20(t)%20{%0A%20%20%20%20%20%20return%20{%0A%20%20%20%20%20%20%20%20__await:%20t%0A%20%20%20%20%20%20};%0A%20%20%20%20},%20defineIteratorMethods(AsyncIterator.prototype),%20define(AsyncIterator.prototype,%20c,%20function%20()%20{%0A%20%20%20%20%20%20return%20this;%0A%20%20%20%20}),%20e.AsyncIterator%20=%20AsyncIterator,%20e.async%20=%20function%20(t,%20r,%20n,%20o,%20i)%20{%0A%20%20%20%20%20%20void%200%20===%20i%20%26%26%20(i%20=%20Promise);%0A%20%20%20%20%20%20var%20a%20=%20new%20AsyncIterator(wrap(t,%20r,%20n,%20o),%20i);%0A%20%20%20%20%20%20return%20e.isGeneratorFunction(r)%20%3F%20a%20:%20a.next().then(function%20(t)%20{%0A%20%20%20%20%20%20%20%20return%20t.done%20%3F%20t.value%20:%20a.next();%0A%20%20%20%20%20%20});%0A%20%20%20%20},%20defineIteratorMethods(g),%20define(g,%20u,%20%22Generator%22),%20define(g,%20a,%20function%20()%20{%0A%20%20%20%20%20%20return%20this;%0A%20%20%20%20}),%20define(g,%20%22toString%22,%20function%20()%20{%0A%20%20%20%20%20%20return%20%22[object%20Generator]%22;%0A%20%20%20%20}),%20e.keys%20=%20function%20(t)%20{%0A%20%20%20%20%20%20var%20e%20=%20Object(t),%0A%20%20%20%20%20%20%20%20r%20=%20[];%0A%20%20%20%20%20%20for%20(var%20n%20in%20e)%20r.push(n);%0A%20%20%20%20%20%20return%20r.reverse(),%20function%20next()%20{%0A%20%20%20%20%20%20%20%20for%20(;%20r.length;)%20{%0A%20%20%20%20%20%20%20%20%20%20var%20t%20=%20r.pop();%0A%20%20%20%20%20%20%20%20%20%20if%20(t%20in%20e)%20return%20next.value%20=%20t,%20next.done%20=%20!1,%20next;%0A%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20return%20next.done%20=%20!0,%20next;%0A%20%20%20%20%20%20};%0A%20%20%20%20},%20e.values%20=%20values,%20Context.prototype%20=%20{%0A%20%20%20%20%20%20constructor:%20Context,%0A%20%20%20%20%20%20reset:%20function%20(e)%20{%0A%20%20%20%20%20%20%20%20if%20(this.prev%20=%200,%20this.next%20=%200,%20this.sent%20=%20this._sent%20=%20t,%20this.done%20=%20!1,%20this.delegate%20=%20null,%20this.method%20=%20%22next%22,%20this.arg%20=%20t,%20this.tryEntries.forEach(resetTryEntry),%20!e)%20for%20(var%20r%20in%20this)%20%22t%22%20===%20r.charAt(0)%20%26%26%20n.call(this,%20r)%20%26%26%20!isNaN(+r.slice(1))%20%26%26%20(this[r]%20=%20t);%0A%20%20%20%20%20%20},%0A%20%20%20%20%20%20stop:%20function%20()%20{%0A%20%20%20%20%20%20%20%20this.done%20=%20!0;%0A%20%20%20%20%20%20%20%20var%20t%20=%20this.tryEntries[0].completion;%0A%20%20%20%20%20%20%20%20if%20(%22throw%22%20===%20t.type)%20throw%20t.arg;%0A%20%20%20%20%20%20%20%20return%20this.rval;%0A%20%20%20%20%20%20},%0A%20%20%20%20%20%20dispatchException:%20function%20(e)%20{%0A%20%20%20%20%20%20%20%20if%20(this.done)%20throw%20e;%0A%20%20%20%20%20%20%20%20var%20r%20=%20this;%0A%20%20%20%20%20%20%20%20function%20handle(n,%20o)%20{%0A%20%20%20%20%20%20%20%20%20%20return%20a.type%20=%20%22throw%22,%20a.arg%20=%20e,%20r.next%20=%20n,%20o%20%26%26%20(r.method%20=%20%22next%22,%20r.arg%20=%20t),%20!!o;%0A%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20for%20(var%20o%20=%20this.tryEntries.length%20-%201;%20o%20%3E=%200;%20--o)%20{%0A%20%20%20%20%20%20%20%20%20%20var%20i%20=%20this.tryEntries[o],%0A%20%20%20%20%20%20%20%20%20%20%20%20a%20=%20i.completion;%0A%20%20%20%20%20%20%20%20%20%20if%20(%22root%22%20===%20i.tryLoc)%20return%20handle(%22end%22);%0A%20%20%20%20%20%20%20%20%20%20if%20(i.tryLoc%20%3C=%20this.prev)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20c%20=%20n.call(i,%20%22catchLoc%22),%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20u%20=%20n.call(i,%20%22finallyLoc%22);%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(c%20%26%26%20u)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.prev%20%3C%20i.catchLoc)%20return%20handle(i.catchLoc,%20!0);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.prev%20%3C%20i.finallyLoc)%20return%20handle(i.finallyLoc);%0A%20%20%20%20%20%20%20%20%20%20%20%20}%20else%20if%20(c)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.prev%20%3C%20i.catchLoc)%20return%20handle(i.catchLoc,%20!0);%0A%20%20%20%20%20%20%20%20%20%20%20%20}%20else%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!u)%20throw%20Error(%22try%20statement%20without%20catch%20or%20finally%22);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.prev%20%3C%20i.finallyLoc)%20return%20handle(i.finallyLoc);%0A%20%20%20%20%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20},%0A%20%20%20%20%20%20abrupt:%20function%20(t,%20e)%20{%0A%20%20%20%20%20%20%20%20for%20(var%20r%20=%20this.tryEntries.length%20-%201;%20r%20%3E=%200;%20--r)%20{%0A%20%20%20%20%20%20%20%20%20%20var%20o%20=%20this.tryEntries[r];%0A%20%20%20%20%20%20%20%20%20%20if%20(o.tryLoc%20%3C=%20this.prev%20%26%26%20n.call(o,%20%22finallyLoc%22)%20%26%26%20this.prev%20%3C%20o.finallyLoc)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20i%20=%20o;%0A%20%20%20%20%20%20%20%20%20%20%20%20break;%0A%20%20%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20i%20%26%26%20(%22break%22%20===%20t%20||%20%22continue%22%20===%20t)%20%26%26%20i.tryLoc%20%3C=%20e%20%26%26%20e%20%3C=%20i.finallyLoc%20%26%26%20(i%20=%20null);%0A%20%20%20%20%20%20%20%20var%20a%20=%20i%20%3F%20i.completion%20:%20{};%0A%20%20%20%20%20%20%20%20return%20a.type%20=%20t,%20a.arg%20=%20e,%20i%20%3F%20(this.method%20=%20%22next%22,%20this.next%20=%20i.finallyLoc,%20y)%20:%20this.complete(a);%0A%20%20%20%20%20%20},%0A%20%20%20%20%20%20complete:%20function%20(t,%20e)%20{%0A%20%20%20%20%20%20%20%20if%20(%22throw%22%20===%20t.type)%20throw%20t.arg;%0A%20%20%20%20%20%20%20%20return%20%22break%22%20===%20t.type%20||%20%22continue%22%20===%20t.type%20%3F%20this.next%20=%20t.arg%20:%20%22return%22%20===%20t.type%20%3F%20(this.rval%20=%20this.arg%20=%20t.arg,%20this.method%20=%20%22return%22,%20this.next%20=%20%22end%22)%20:%20%22normal%22%20===%20t.type%20%26%26%20e%20%26%26%20(this.next%20=%20e),%20y;%0A%20%20%20%20%20%20},%0A%20%20%20%20%20%20finish:%20function%20(t)%20{%0A%20%20%20%20%20%20%20%20for%20(var%20e%20=%20this.tryEntries.length%20-%201;%20e%20%3E=%200;%20--e)%20{%0A%20%20%20%20%20%20%20%20%20%20var%20r%20=%20this.tryEntries[e];%0A%20%20%20%20%20%20%20%20%20%20if%20(r.finallyLoc%20===%20t)%20return%20this.complete(r.completion,%20r.afterLoc),%20resetTryEntry(r),%20y;%0A%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20},%0A%20%20%20%20%20%20catch:%20function%20(t)%20{%0A%20%20%20%20%20%20%20%20for%20(var%20e%20=%20this.tryEntries.length%20-%201;%20e%20%3E=%200;%20--e)%20{%0A%20%20%20%20%20%20%20%20%20%20var%20r%20=%20this.tryEntries[e];%0A%20%20%20%20%20%20%20%20%20%20if%20(r.tryLoc%20===%20t)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20n%20=%20r.completion;%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(%22throw%22%20===%20n.type)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20o%20=%20n.arg;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20resetTryEntry(r);%0A%20%20%20%20%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20o;%0A%20%20%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20throw%20Error(%22illegal%20catch%20attempt%22);%0A%20%20%20%20%20%20},%0A%20%20%20%20%20%20delegateYield:%20function%20(e,%20r,%20n)%20{%0A%20%20%20%20%20%20%20%20return%20this.delegate%20=%20{%0A%20%20%20%20%20%20%20%20%20%20iterator:%20values(e),%0A%20%20%20%20%20%20%20%20%20%20resultName:%20r,%0A%20%20%20%20%20%20%20%20%20%20nextLoc:%20n%0A%20%20%20%20%20%20%20%20},%20%22next%22%20===%20this.method%20%26%26%20(this.arg%20=%20t),%20y;%0A%20%20%20%20%20%20}%0A%20%20%20%20},%20e;%0A%20%20}%0A%20%20function%20asyncGeneratorStep(gen,%20resolve,%20reject,%20_next,%20_throw,%20key,%20arg)%20{%0A%20%20%20%20try%20{%0A%20%20%20%20%20%20var%20info%20=%20gen[key](arg);%0A%20%20%20%20%20%20var%20value%20=%20info.value;%0A%20%20%20%20}%20catch%20(error)%20{%0A%20%20%20%20%20%20reject(error);%0A%20%20%20%20%20%20return;%0A%20%20%20%20}%0A%20%20%20%20if%20(info.done)%20{%0A%20%20%20%20%20%20resolve(value);%0A%20%20%20%20}%20else%20{%0A%20%20%20%20%20%20Promise.resolve(value).then(_next,%20_throw);%0A%20%20%20%20}%0A%20%20}%0A%20%20function%20_asyncToGenerator(fn)%20{%0A%20%20%20%20return%20function%20()%20{%0A%20%20%20%20%20%20var%20self%20=%20this,%0A%20%20%20%20%20%20%20%20args%20=%20arguments;%0A%20%20%20%20%20%20return%20new%20Promise(function%20(resolve,%20reject)%20{%0A%20%20%20%20%20%20%20%20var%20gen%20=%20fn.apply(self,%20args);%0A%20%20%20%20%20%20%20%20function%20_next(value)%20{%0A%20%20%20%20%20%20%20%20%20%20asyncGeneratorStep(gen,%20resolve,%20reject,%20_next,%20_throw,%20%22next%22,%20value);%0A%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20function%20_throw(err)%20{%0A%20%20%20%20%20%20%20%20%20%20asyncGeneratorStep(gen,%20resolve,%20reject,%20_next,%20_throw,%20%22throw%22,%20err);%0A%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20_next(undefined);%0A%20%20%20%20%20%20});%0A%20%20%20%20};%0A%20%20}%0A%20%20function%20_unsupportedIterableToArray(o,%20minLen)%20{%0A%20%20%20%20if%20(!o)%20return;%0A%20%20%20%20if%20(typeof%20o%20===%20%22string%22)%20return%20_arrayLikeToArray(o,%20minLen);%0A%20%20%20%20var%20n%20=%20Object.prototype.toString.call(o).slice(8,%20-1);%0A%20%20%20%20if%20(n%20===%20%22Object%22%20%26%26%20o.constructor)%20n%20=%20o.constructor.name;%0A%20%20%20%20if%20(n%20===%20%22Map%22%20||%20n%20===%20%22Set%22)%20return%20Array.from(o);%0A%20%20%20%20if%20(n%20===%20%22Arguments%22%20||%20/^(%3F:Ui|I)nt(%3F:8|16|32)(%3F:Clamped)%3FArray$/.test(n))%20return%20_arrayLikeToArray(o,%20minLen);%0A%20%20}%0A%20%20function%20_arrayLikeToArray(arr,%20len)%20{%0A%20%20%20%20if%20(len%20==%20null%20||%20len%20%3E%20arr.length)%20len%20=%20arr.length;%0A%20%20%20%20for%20(var%20i%20=%200,%20arr2%20=%20new%20Array(len);%20i%20%3C%20len;%20i++)%20arr2[i]%20=%20arr[i];%0A%20%20%20%20return%20arr2;%0A%20%20}%0A%20%20function%20_createForOfIteratorHelper(o,%20allowArrayLike)%20{%0A%20%20%20%20var%20it%20=%20typeof%20Symbol%20!==%20%22undefined%22%20%26%26%20o[Symbol.iterator]%20||%20o[%22%40%40iterator%22];%0A%20%20%20%20if%20(!it)%20{%0A%20%20%20%20%20%20if%20(Array.isArray(o)%20||%20(it%20=%20_unsupportedIterableToArray(o))%20||%20allowArrayLike%20%26%26%20o%20%26%26%20typeof%20o.length%20===%20%22number%22)%20{%0A%20%20%20%20%20%20%20%20if%20(it)%20o%20=%20it;%0A%20%20%20%20%20%20%20%20var%20i%20=%200;%0A%20%20%20%20%20%20%20%20var%20F%20=%20function%20()%20{};%0A%20%20%20%20%20%20%20%20return%20{%0A%20%20%20%20%20%20%20%20%20%20s:%20F,%0A%20%20%20%20%20%20%20%20%20%20n:%20function%20()%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(i%20%3E=%20o.length)%20return%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20done:%20true%0A%20%20%20%20%20%20%20%20%20%20%20%20};%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20done:%20false,%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20value:%20o[i++]%0A%20%20%20%20%20%20%20%20%20%20%20%20};%0A%20%20%20%20%20%20%20%20%20%20},%0A%20%20%20%20%20%20%20%20%20%20e:%20function%20(e)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20throw%20e;%0A%20%20%20%20%20%20%20%20%20%20},%0A%20%20%20%20%20%20%20%20%20%20f:%20F%0A%20%20%20%20%20%20%20%20};%0A%20%20%20%20%20%20}%0A%20%20%20%20%20%20throw%20new%20TypeError(%22Invalid%20attempt%20to%20iterate%20non-iterable%20instance.\nIn%20order%20to%20be%20iterable,%20non-array%20objects%20must%20have%20a%20[Symbol.iterator]()%20method.%22);%0A%20%20%20%20}%0A%20%20%20%20var%20normalCompletion%20=%20true,%0A%20%20%20%20%20%20didErr%20=%20false,%0A%20%20%20%20%20%20err;%0A%20%20%20%20return%20{%0A%20%20%20%20%20%20s:%20function%20()%20{%0A%20%20%20%20%20%20%20%20it%20=%20it.call(o);%0A%20%20%20%20%20%20},%0A%20%20%20%20%20%20n:%20function%20()%20{%0A%20%20%20%20%20%20%20%20var%20step%20=%20it.next();%0A%20%20%20%20%20%20%20%20normalCompletion%20=%20step.done;%0A%20%20%20%20%20%20%20%20return%20step;%0A%20%20%20%20%20%20},%0A%20%20%20%20%20%20e:%20function%20(e)%20{%0A%20%20%20%20%20%20%20%20didErr%20=%20true;%0A%20%20%20%20%20%20%20%20err%20=%20e;%0A%20%20%20%20%20%20},%0A%20%20%20%20%20%20f:%20function%20()%20{%0A%20%20%20%20%20%20%20%20try%20{%0A%20%20%20%20%20%20%20%20%20%20if%20(!normalCompletion%20%26%26%20it.return%20!=%20null)%20it.return();%0A%20%20%20%20%20%20%20%20}%20finally%20{%0A%20%20%20%20%20%20%20%20%20%20if%20(didErr)%20throw%20err;%0A%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20}%0A%20%20%20%20};%0A%20%20}%0A%0A%20%20if%20(window.location.host%20!==%20%22chill.institute%22)%20{%0A%20%20%20%20alert(%22Visit%20https://chill.institute/%20to%20use%20this%20bookmarklet%22);%0A%20%20}%20else%20{%0A%20%20%20%20var%20fetchWithDelay%20=%20/*%23__PURE__*/function%20()%20{%0A%20%20%20%20%20%20var%20_ref%20=%20_asyncToGenerator(%20/*%23__PURE__*/_regeneratorRuntime().mark(function%20_callee(h5)%20{%0A%20%20%20%20%20%20%20%20var%20title,%20url,%20response,%20imgTag,%20json;%0A%20%20%20%20%20%20%20%20return%20_regeneratorRuntime().wrap(function%20_callee$(_context)%20{%0A%20%20%20%20%20%20%20%20%20%20while%20(1)%20switch%20(_context.prev%20=%20_context.next)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20case%200:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20title%20=%20encodeURIComponent(%22%22.concat(h5.textContent));%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20url%20=%20%22https://bbfcapi.fustra.uk/%3Ftitle=%22.concat(title);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context.prev%20=%202;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context.next%20=%205;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20fetch(url);%0A%20%20%20%20%20%20%20%20%20%20%20%20case%205:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20response%20=%20_context.sent;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20imgTag%20=%20%22%22;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!response.ok)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context.next%20=%2012;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context.next%20=%2010;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20response.json();%0A%20%20%20%20%20%20%20%20%20%20%20%20case%2010:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20json%20=%20_context.sent;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20imgTag%20=%20%22%3Cimg%20src=\%22%22.concat(svgUrls[%22cert-%22.concat(json.ageRating)],%20%22\%22%20style=\%22width:%2025px;%20height:%2025px;display:%20inline;margin-left:%205px\%22%20/%3E%22);%0A%20%20%20%20%20%20%20%20%20%20%20%20case%2012:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20h5.innerHTML%20=%20%22%22.concat(h5.textContent,%20%22%20%3Ca%20href=\%22https://www.bbfc.co.uk/search%3Fq=%22).concat(title,%20%22\%22%20style=\%22text-decoration:%20underline;\%22%20target=\%22_blank\%22%3E%22).concat(!response.ok%20%3F%20%22(search%20cert)%22%20:%20imgTag,%20%22%3C/a%3E%22);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context.next%20=%2018;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20break;%0A%20%20%20%20%20%20%20%20%20%20%20%20case%2015:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context.prev%20=%2015;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context.t0%20=%20_context[%22catch%22](2);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20console.error(_context.t0);%0A%20%20%20%20%20%20%20%20%20%20%20%20case%2018:%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20%22end%22:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20_context.stop();%0A%20%20%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20},%20_callee,%20null,%20[[2,%2015]]);%0A%20%20%20%20%20%20}));%0A%20%20%20%20%20%20return%20function%20fetchWithDelay(_x)%20{%0A%20%20%20%20%20%20%20%20return%20_ref.apply(this,%20arguments);%0A%20%20%20%20%20%20};%0A%20%20%20%20}();%0A%20%20%20%20var%20fetchWithInterval%20=%20/*%23__PURE__*/function%20()%20{%0A%20%20%20%20%20%20var%20_ref2%20=%20_asyncToGenerator(%20/*%23__PURE__*/_regeneratorRuntime().mark(function%20_callee2(h5s,%20interval)%20{%0A%20%20%20%20%20%20%20%20var%20_iterator,%20_step,%20h5;%0A%20%20%20%20%20%20%20%20return%20_regeneratorRuntime().wrap(function%20_callee2$(_context2)%20{%0A%20%20%20%20%20%20%20%20%20%20while%20(1)%20switch%20(_context2.prev%20=%20_context2.next)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20case%200:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_iterator%20=%20_createForOfIteratorHelper(h5s);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context2.prev%20=%201;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_iterator.s();%0A%20%20%20%20%20%20%20%20%20%20%20%20case%203:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20((_step%20=%20_iterator.n()).done)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context2.next%20=%2011;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20h5%20=%20_step.value;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context2.next%20=%207;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20fetchWithDelay(h5);%0A%20%20%20%20%20%20%20%20%20%20%20%20case%207:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context2.next%20=%209;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20new%20Promise(function%20(resolve)%20{%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20setTimeout(resolve,%20interval);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20});%0A%20%20%20%20%20%20%20%20%20%20%20%20case%209:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context2.next%20=%203;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20break;%0A%20%20%20%20%20%20%20%20%20%20%20%20case%2011:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context2.next%20=%2016;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20break;%0A%20%20%20%20%20%20%20%20%20%20%20%20case%2013:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context2.prev%20=%2013;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context2.t0%20=%20_context2[%22catch%22](1);%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_iterator.e(_context2.t0);%0A%20%20%20%20%20%20%20%20%20%20%20%20case%2016:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_context2.prev%20=%2016;%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20_iterator.f();%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20_context2.finish(16);%0A%20%20%20%20%20%20%20%20%20%20%20%20case%2019:%0A%20%20%20%20%20%20%20%20%20%20%20%20case%20%22end%22:%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20_context2.stop();%0A%20%20%20%20%20%20%20%20%20%20}%0A%20%20%20%20%20%20%20%20},%20_callee2,%20null,%20[[1,%2013,%2016,%2019]]);%0A%20%20%20%20%20%20}));%0A%20%20%20%20%20%20return%20function%20fetchWithInterval(_x2,%20_x3)%20{%0A%20%20%20%20%20%20%20%20return%20_ref2.apply(this,%20arguments);%0A%20%20%20%20%20%20};%0A%20%20%20%20}();%0A%20%20%20%20var%20svgUrls%20=%20{%0A%20%20%20%20%20%20%22cert-U%22:%20%22https://upload.wikimedia.org/wikipedia/commons/b/b3/BBFC_U_2019.svg%22,%0A%20%20%20%20%20%20%22cert-PG%22:%20%22https://upload.wikimedia.org/wikipedia/commons/1/14/BBFC_PG_2019.svg%22,%0A%20%20%20%20%20%20%22cert-12%22:%20%22https://upload.wikimedia.org/wikipedia/commons/4/45/BBFC_12_2019.svg%22,%0A%20%20%20%20%20%20%22cert-12A%22:%20%22https://upload.wikimedia.org/wikipedia/commons/f/fc/BBFC_12A_2019.svg%22,%0A%20%20%20%20%20%20%22cert-15%22:%20%22https://upload.wikimedia.org/wikipedia/commons/b/b5/BBFC_15_2019.svg%22,%0A%20%20%20%20%20%20%22cert-18%22:%20%22https://upload.wikimedia.org/wikipedia/commons/4/43/BBFC_18_2019.svg%22%0A%20%20%20%20};%0A%20%20%20%20var%20h5s%20=%20document.querySelectorAll(%22h5%22);%0A%20%20%20%20var%20interval%20=%201000;%20//%201%20second%0A%20%20%20%20fetchWithInterval(h5s,%20interval);%0A%20%20}%0A%0A}());%0A"
  &gt;Add Chill Certs&lt;/a
&gt;

&lt;hr /&gt;</description>
    </item>
  </channel>
</rss>