(510,281,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"My Web Wish List\",\"slug\":\"my-web-wish-list\",\"postDate\":1180320273,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>My birthday is coming up on Thursday, so I thought I would make up a list of 5 things I wish to happen with the web in the next year. I know that most of these will not happen in that time frame, but I can at least wish right?<\\/p>\\n<!--more-->\\n<h2>The List<\\/h2>\\n\\n<p>In no particular order, this is what I want:<\\/p>\\n\\n<ol>\\n <li>For everyone running IE6 to be upgraded by automatic updates<\\/li>\\n<li>For the term &ldquo;Web 2.0&rdquo; to never be heard again<\\/li>\\n<li>For all standards compliant browsers to support attaching multiple background images using CSS<\\/li>\\n<li>For the ability to render <strong>all<\\/strong> fonts on the web<\\/li>\\n<li>For all standards compliant browsers to support the nth-child selector<\\/li>\\n<\\/ol>\\n\\n<h3>For everyone running IE6 to be upgraded by automatic updates<\\/h3>\\n\\n<p>As all web developers have experienced, <strong>IE6 sucks<\\/strong>. But there is good news; IE7 is a huge step forward. Sure it still has some of the same problems that IE6 had, but it is basically on par with other standards compliant browsers.<\\/p>\\n\\n<p>Thankfully, Microsoft is pushing out IE7 in their automatic updates, and the number of people upgrading is rising quickly. Before we know it, IE6 will no longer be the most popular browser any more.<\\/p>\\n\\n<h3> For the term &ldquo;Web 2.0&rdquo; to never be heard again<\\/h3>\\n\\n<p>I&rsquo;m sick of it. The term is used everywhere, even job descriptions. There was a good article on Fadtastic, <a href=\\\"http:\\/\\/fadtastic.net\\/2007\\/05\\/17\\/weekly-thought-why-good-designers-should-stop-saying-web-20\\/\\\"> Weekly Thought: Why Good Designers Should Stop Saying &ldquo;Web 2.0&rdquo;<\\/a>.<\\/p>\\n\\n<p>&ldquo;Web 2.0&rdquo; is meaningless, and it needs to be vanished from everyone&rsquo;s vocabulary.<\\/p>\\n\\n<h3>For all standards compliant browsers to support attaching multiple background images using CSS<\\/h3>\\n\\n<p>Safari already does, why don&rsquo;t other standards compliant browsers? Just take a moment and think about how wonderfully simple the markup would be for rounded corners. Ahh maybe some day.<\\/p>\\n\\n<h3> For the ability to render all fonts on the web<\\/h3>\\n\\n<p>Why can&rsquo;t we upload fonts to our servers and have the browsers download them when needed? It can&rsquo;t be the technology. It seems like a simple task. Can you image the possibilities if designers were not restricted to web-safe fonts? While, <a href=\\\"http:\\/\\/www.mikeindustries.com\\/sifr\\/\\\">sIFR<\\/a> is awesome, there are so many limits to it. This needs to happen, <strong>now<\\/strong>.<\\/p>\\n\\n<h3>For all standards compliant browsers to support the nth-child selector<\\/h3>\\n\\n<p>No more JavaScript striping. No more using odd and even classes.<\\/p>\\n\\n<p>When browsers support <a href=\\\"http:\\/\\/www.w3.org\\/TR\\/css3-selectors\\/#structural-pseudos\\\">Structural Pseudo-Classes<\\/a>, or more specifically, the n-th child selector, it&rsquo;s going to be great. We can handle all of the alternating styles that we want using only CSS.<\\/p>\\n\\n<h4>What else?<\\/h4>\\n\\n<p>So what are you getting me? What else would you ask for?<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:41','2014-08-08 19:32:33','8f5603a3-470f-489c-9259-010b79ef342b',1),(511,282,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"Sure, Let\\u2019s Destroy Accessibility\",\"slug\":\"sure-lets-destroy-accessibility\",\"postDate\":1179235974,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>So, while I was doing my normal reading of RSS feeds, when I saw a link to <a href=\\\"http:\\/\\/www.solidstategroup.com\\/page\\/1592\\\" rel=\\\"nofollow\\\">white paper from Solid State Group<\\/a>. The person who linked to it, said how great number 4 is.<\\/p>\\n\\n<p>Are we not going to think about accessibility anymore? What about people who cannot use their mouse to point and click? They use the keyboard. Meaning that they TAB between the links to figure out what they want to use. By Firefox adding that outline, it helps to show which link they are currently focused on.<\\/p>\\n<!--more-->\\n<p>Sure, I think there are some instances where it&rsquo;s OK to remove the outline, but not for EVERY link.<\\/p>\\n\\n<p>This white paper really did not show much, and in my opinion I have already discussed much better methods for Transparent PNG&rsquo;s in IE6 and Min-width using <a href=\\\"http:\\/\\/trevordavis.net\\/blog\\/tutorial\\/using-dean-edwards-ie7-script.php\\\">Dean Edwards&rsquo; IE7 Script<\\/a> and a more accessible <a href=\\\"http:\\/\\/trevordavis.net\\/blog\\/tutorial\\/improved-navigation-image-replacement.php\\\">Image replacement technique<\\/a>.<\\/p>\\n\\n<p>I love all these tutorials on the web, but we need to warn people about the risks when doing such things.<\\/p>\\n\\n<p>&lt;\\/rant&gt;<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:41','2014-08-08 19:32:33','666ac874-8a29-4293-bb62-978bda35669d',1),(512,283,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"How Do You Start Web Development?\",\"slug\":\"how-do-you-start-web-development\",\"postDate\":1179185768,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>While reading forums, blogs, and other web development related resources, I keep coming across people asking how to get started in CSS. They may have be table-converts or they may be new to the field, but the question keeps coming up.<\\/p>\\n\\n<p>In my opinion, a lot of people are going about it the wrong way. Sure they may be able to get a nice design that works across browsers and platforms and their code may validate. But look under the hood of a lot of those sites. The code can sometimes be just as bad as using a table.<\\/p>\\n<!--more-->\\n<h2>Where to Start<\\/h2>\\n\\n<p>I think that the key to succeeding in the field, is to begin by learning semantic HTML. Sure, you may have been using HTML for years while doing table layouts, but you are also the same people who were using nested blockquotes to increase your margins.<\\/p>\\n\\n<h3>What is Semantic HTML?<\\/h3>\\n\\n<p>Well let&rsquo;s first define semantics:<\\/p>\\n\\n<blockquote><p>Of or relating to meaning, especially meaning in language.<\\/p><\\/blockquote>\\n\\n<p>Now if we apply that to HTML, it is the idea that every element has a meaning. Yes, there is a reason that when you want emphasize something you wrap it in an em tag. Instead of simply choosing elements because of how they are styled, you should be choosing elements because of their meaning.<\\/p>\\n\\n<p>Once you have the semantics down, then you get to use CSS to hook into all those wonderfully semantic elements that you have used.<\\/p>\\n\\n<h3>Just My Thoughts<\\/h3>\\n\\n<p>That is not necessarily how I learned, but I think that will be the most beneficial way to learn in the long run.<\\/p>\\n\\n<h4>Some Resources<\\/h4>\\n<p>These are some sites that I read regularly, mainly focusing on the basic stuff.<\\/p>\\n\\n<ul>\\n <li><a href=\\\"http:\\/\\/456bereastreet.com\\/\\\">456 Berea Street<\\/a><\\/li>\\n <li><a href=\\\"http:\\/\\/alistapart.com\\/\\\">A List Apart<\\/a><\\/li>\\n <li><a href=\\\"http:\\/\\/cssbeauty.com\\/\\\">CSS Beauty<\\/a><\\/li>\\n <li><a href=\\\"http:\\/\\/cssglobe.com\\/\\\">CSS Globe<\\/a><\\/li>\\n <li><a href=\\\"http:\\/\\/digital-web.com\\/\\\">Digital Web Magazine<\\/a><\\/li>\\n <li><a href=\\\"http:\\/\\/fadtastic.net\\/\\\">Fadtastic<\\/a><\\/li>\\n <li><a href=\\\"http:\\/\\/thinkvitamin.com\\/\\\">Vitamin<\\/a><\\/li>\\n<\\/ul>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:41','2014-08-08 19:32:33','cfc09ac3-c6a1-4521-b85d-29fb11c7df2c',1),(513,284,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"Using Dean Edwards\\u2019 IE7 Script\",\"slug\":\"using-dean-edwards-ie7-script\",\"postDate\":1178582164,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<div class=\\\"update\\\">\\n<h2 class=\\\"replaceHeadline\\\">Update<\\/h2>\\n<p>Dean Edwards has updated his scripts. I have written a <a href=\\\"http:\\/\\/trevordavis.net\\/blog\\/tutorial\\/updated-dean-edwards-ie7-scripts\\/\\\">new entry describing the updated IE7 scripts<\\/a>.<\\/p>\\n<\\/div>\\n\\n<p>At An Event Apart Boston, <a href=\\\"http:\\/\\/meyerweb.com\\\">Eric Meyer<\\/a> discussed how IE7 is quickly being adopted. Since this is the case, we can treat IE6 as more of a secondary browser now.<\\/p>\\n\\n<p>We should all start to use the <a href=\\\"http:\\/\\/dean.edwards.name\\/ie7\\/\\\">Dean Edwards IE7 script<\\/a> to bring IE6 up to par with standards compliant browsers.<\\/p>\\n<!--more-->\\n<p>The history behind the Dean Edwards script is that he wrote it when Microsoft had said that they were not going to produce any more versions of Internet Explorer. He wanted to provide a JavaScript solution to add more compliance to the browser.<\\/p>\\n\\n<h2 class=\\\"replaceHeadline\\\">Using the Script<\\/h2>\\n\\n<p>First, <a href=\\\"http:\\/\\/dean.edwards.name\\/download\\/\\\">download the Dean Edwards script<\\/a>. Next, extract the files to the root of your webserver in a folder called <strong>ie7<\\/strong>. It needs to be in this folder, because some of the scripts have a dependency on the folder.<\\/p>\\n\\n<p>Finally, just include the script in the head of your document using conditional comments:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\n&lt;!--&#91;if&nbsp;lt&nbsp;IE&nbsp;7&#93;&gt;<br \\/>&lt;script&nbsp;src=\\\"\\/ie7\\/ie7-standard-p.js\\\"&nbsp;type=\\\"text\\/javascript\\\"&gt;&lt;\\/script&gt;<br \\/>&lt;!&#91;endif&#93;--&gt;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>On <a href=\\\"http:\\/\\/dean.edwards.name\\/IE7\\/usage\\/configure.html\\\">the configuration page<\\/a>, Dean shows you which scripts do what. By including the <code>ie7-standard-p.js<\\/code>, you get the support of the following scripts:<\\/p>\\n\\n<ul>\\n <li>ie7-core.js<\\/li>\\n <li>ie7-html4.js<\\/li>\\n <li>ie7-layout.js<\\/li>\\n <li>ie7-css2-selectors.js<\\/li>\\n <li>ie7-graphics.js<\\/li>\\n <li>ie7-fixed.js<\\/li>\\n<\\/ul>\\n\\n<p>The only other script that I have included as well is the <code>ie7-css3-selectors.js<\\/code> to include support for CSS3 selectors. Think of all those wonderful <a href=\\\"http:\\/\\/trevordavis.net\\/blog\\/tutorial\\/css-attribute-selectors-explained.php\\\">attribute selectors<\\/a> you can start to use in your project. It makes me all warm and tingly inside to think about where CSS can go when the browsers are up to the task.<\\/p>\\n\\n<h3 class=\\\"replaceHeadline\\\">Enjoy!<\\/h3>\\n\\n<p>This really should be one of the first steps you take in a project. By doing this simple task, you will save yourself from a lot of IE6 headaches.<\\/p>\\n\\n<p>Sure, this only works for IE6 users who have JavaScript enabled. But honestly, is there anyone who is using IE6 who actually turns off JavaScript? If they do turn off JavaScript, it may just break some presentation layer things, but the site should still be perfectly usable.<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:41','2014-08-08 19:32:33','7a7cca29-c9fe-4af2-9615-f7cc5a10b074',1),(514,285,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"Spider-Man 3\",\"slug\":\"spider-man-3\",\"postDate\":1178332439,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>I was ordered by my fellow &ldquo;Front-End Developer&rdquo;, <a href=\\\"http:\\/\\/monadology.net\\\">Nate<\\/a>, to write up a little blurb about what I thought about Spider-Man 3.<\\/p>\\n\\n<p>So I caught the 10:45 showing, and the theater was packed. I am going to go ahead and predict that it is going to break the record for weekend gross.<\\/p>\\n<!--more-->\\n<p>But yeah about the movie, I would definitely say I enjoyed it.<\\/p>\\n\\n<p>While it is no movie that is going to win any award, it is the typical Spider-Man movie filled with action, love, and gratuitous humor.<\\/p>\\n\\n<p>I will say that were was about a 15 minute span where it almost feels like you are watching another movie. It was just a bizarre sequence of events for the movie, and I think they could have accomplished it in a different way.<\\/p>\\n\\n<p>If you liked the first 2, you will like this one. This movie is a roller coaster of emotions for Spiderman, and it was well worth the price of admission.<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:41','2014-08-08 19:32:33','aa8da0da-f325-42a5-9d51-2fe9fb31b250',1),(515,286,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"Improved Navigation Image Replacement\",\"slug\":\"improved-navigation-image-replacement\",\"postDate\":1177720362,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>So my co-worker at work today was slicing a design, and the designer said that the navigation had to be images. Being the good little accessibility people that we were, we were trying to figure out a way to use images, but have text also show up when images are disabled.<\\/p>\\n\\n<p>So my co-worker went with the quick fix (for now), a JavaScript onmouseover solution, and I told him that it was lame. I told him there had to be a way to use CSS to do it. I didn\'t have time to do it at work, so I played with it, and I have found a solution.<\\/p>\\n<!--more-->\\n<h2 class=\\\"replaceHeadline\\\">The Markup<\\/h2>\\n\\n<p>Ok, so everyone knows to mark-up navigation in an unordered list:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\n&lt;ul&nbsp;id=\\\"nav\\\"&gt;<br \\/>&nbsp;&lt;li&gt;&lt;a&nbsp;href=\\\"#\\\"&gt;Text&nbsp;to&nbsp;Cover&nbsp;Here&lt;\\/a&gt;&lt;\\/li&gt;<br \\/>&nbsp;&lt;li&gt;&lt;a&nbsp;href=\\\"#\\\"&gt;Text&nbsp;to&nbsp;Cover&nbsp;Here&lt;\\/a&gt;&lt;\\/li&gt;<br \\/>&nbsp;&lt;li&gt;&lt;a&nbsp;href=\\\"#\\\"&gt;Text&nbsp;to&nbsp;Cover&nbsp;Here&lt;\\/a&gt;&lt;\\/li&gt;<br \\/>&nbsp;&lt;li&gt;&lt;a&nbsp;href=\\\"#\\\"&gt;Text&nbsp;to&nbsp;Cover&nbsp;Here&lt;\\/a&gt;&lt;\\/li&gt;<br \\/>&lt;\\/ul&gt;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>Now, instead of placing an image in the anchor tag and then using JavaScript to change the hover state, I thought, why not just add an extra <code>span<\\/code> at the end of the anchor tag. I chose the end, but it also works with it at the beginning. I think it makes more sense to have it at the end though, so that the text within the anchor tag is read first by screen readers and bots. So this is what our markup looks like now:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\n&lt;ul&nbsp;id=\\\"nav\\\"&gt;<br \\/>&nbsp;&lt;li&gt;&lt;a&nbsp;href=\\\"#\\\"&gt;Text&nbsp;to&nbsp;Cover&nbsp;Here&lt;span&gt;&lt;\\/span&gt;&lt;\\/a&gt;&lt;\\/li&gt;<br \\/>&nbsp;&lt;li&gt;&lt;a&nbsp;href=\\\"#\\\"&gt;Text&nbsp;to&nbsp;Cover&nbsp;Here&lt;span&gt;&lt;\\/span&gt;&lt;\\/a&gt;&lt;\\/li&gt;<br \\/>&nbsp;&lt;li&gt;&lt;a&nbsp;href=\\\"#\\\"&gt;Text&nbsp;to&nbsp;Cover&nbsp;Here&lt;span&gt;&lt;\\/span&gt;&lt;\\/a&gt;&lt;\\/li&gt;<br \\/>&nbsp;&lt;li&gt;&lt;a&nbsp;href=\\\"#\\\"&gt;Text&nbsp;to&nbsp;Cover&nbsp;Here&lt;span&gt;&lt;\\/span&gt;&lt;\\/a&gt;&lt;\\/li&gt;<br \\/>&lt;\\/ul&gt;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<h2 class=\\\"replaceHeadline\\\">Let&rsquo;s Style It<\\/h2>\\n\\n<p>So I started off with just some normal styles that you would apply to a navigation: zeroing out margins and paddings, floating it, removing the list-styling, and giving it a width.<\\/p>\\n\\n<p>Next, I floated the list items so that they would be in a line horizontally. This is where it finally gets interesting, I promise. I styled the anchor tag like so:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\nul#nav&nbsp;li&nbsp;a&nbsp;&#123;<br \\/>&nbsp;background:&nbsp;#FFFF99;<br \\/>&nbsp;display:&nbsp;block;<br \\/>&nbsp;height:&nbsp;30px;<br \\/>&nbsp;padding:&nbsp;0&nbsp;5px;<br \\/>&nbsp;width:&nbsp;115px;<br \\/>&#125;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>Since this is just an example, I put a random background color on (to make sure it didn&rsquo;t show through in the final example), and I gave them all the same width. Not a likely situation, but I didn&rsquo;t feel like giving each list item an id. That should be self explanatory enough.<\\/p>\\n\\n<p>Now, when I think back to the talk that <a href=\\\"http:\\/\\/meyerweb.com\\\">Eric Meyer<\\/a> at <a href=\\\"http:\\/\\/aneventapart.com\\/events\\/boston07\\/\\\">An Event Apart Boston<\\/a>, he kept stressing that to a browser, an element is just an element, and you can do anything to it. So, my plan was to just set the anchor tag to be relatively positioned so that it would contain the <code>span<\\/code>.<\\/p>\\n\\n<p>The next step is to add the background image to the <code>span<\\/code>. Now one thing that needs to be realized is that you cannot use a transparent image. But I don&rsquo;t think that really causes much of a problem in most cases.<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\nul#nav&nbsp;li&nbsp;a&nbsp;span&nbsp;&#123;<br \\/>&nbsp;background:&nbsp;url(\\/images\\/content\\/2008\\/01\\/nav.gif)&nbsp;no-repeat&nbsp;0&nbsp;-30px;<br \\/>&nbsp;cursor:&nbsp;pointer;<br \\/>&nbsp;display:&nbsp;block;<br \\/>&nbsp;height:&nbsp;30px;<br \\/>&nbsp;left:&nbsp;0;<br \\/>&nbsp;position:&nbsp;absolute;<br \\/>&nbsp;top:&nbsp;0;<br \\/>&nbsp;width:&nbsp;125px;<br \\/>&#125;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>The only things to note from that is that I combined the normal and hover states into one awesome image (I wasn&rsquo;t worried about how pretty it looked). I also had to add the cursor property for our best friend, IE6.<\\/p>\\n\\n<p>Ok, cool. We are on our way. Now we just need to shift the background image on the hover state:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\nul#nav&nbsp;li&nbsp;a:hover&nbsp;span&nbsp;&#123;&nbsp;background:&nbsp;url(\\/images\\/content\\/2008\\/01\\/nav.gif)&nbsp;no-repeat&nbsp;0&nbsp;0;&nbsp;&#125;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p><strong>Voil&agrave;!<\\/strong> It works like a charm. <a href=\\\"http:\\/\\/trevordavis.net\\/play\\/imagereplacement\\/\\\">Check out the example<\\/a>.<\\/p>\\n\\n<h3 class=\\\"replaceHeadline\\\">But&hellip;<\\/h3>\\n\\n<p>Did you check it in IE6? When I checked it in Firefox and IE7, everything worked beautifully. You can turn off the images and you get the text underneath.<\\/p>\\n\\n<p>When you do check it in IE6, you will notice that the hover states stay on. It&rsquo;s very odd.<\\/p>\\n\\n<p>After a lot of tinkering, I finally found something that worked. If you add the following to the anchor when it is in its hovered state, it for some reason fixes it:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\nul#nav&nbsp;li&nbsp;a:hover&nbsp;&#123;&nbsp;background:&nbsp;0&nbsp;0;&nbsp;&#125;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>I have no explanation, but it does not seem to have any adverse affects on other browsers.<\\/p>\\n\\n<h3 class=\\\"replaceHeadline\\\">Let&rsquo;s Bulletproof It<\\/h3>\\n<p>We can add a simple property to the anchor tag so that when someone resizes their text, it does not poke out from under the image:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\nul#nav&nbsp;li&nbsp;a&nbsp;&#123;<br \\/>&nbsp;background:&nbsp;#FFFF99;<br \\/>&nbsp;display:&nbsp;block;<br \\/>&nbsp;height:&nbsp;30px;<br \\/>&nbsp;overflow:&nbsp;hidden;&nbsp;\\/*Added&nbsp;for&nbsp;bulletproofing*\\/<br \\/>&nbsp;padding:&nbsp;0&nbsp;5px;<br \\/>&nbsp;position:&nbsp;relative;<br \\/>&nbsp;width:&nbsp;115px;<br \\/>&#125;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p><a href=\\\"http:\\/\\/trevordavis.net\\/play\\/imagereplacement\\/final\\/\\\">Check out the final example.<\\/a><\\/p>\\n\\n<h3 class=\\\"replaceHeadline\\\">More Bulletproofing<\\/h3>\\n\\n<p>If you wanted the text to resize gracefully when images are disabled, I suppose you could set your height in ems. Then you would just need to build some extra blank space into your image, so that it would work when images are enabled.<\\/p>\\n\\n<p>So hopefully that helps out my co-worker. I think it potentially solves a pretty big problem with CSS image navigation with images disabled.<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:41','2014-08-08 19:32:33','2ca35407-5f4a-46b2-871e-bab0088ca877',1),(516,287,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"Improved JavaScript Striping\",\"slug\":\"improved-javascript-striping\",\"postDate\":1177456442,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>I am sure everyone has seen the <a href=\\\"http:\\/\\/24ways.org\\/2005\\/splintered-striper\\\">JavaScript Splintered Striper<\\/a>, which was shown during the 2005 <a href=\\\"http:\\/\\/24ways.org\\\">24 Ways to Impress Your Friends<\\/a>, or at least some variation of it. A <a href=\\\"http:\\/\\/www.google.com\\/search?source=ig&amp;hl=en&amp;q=javascript+%2B+striper&amp;btnG=Google+Search\\\">quick Google for javascript striper<\\/a> came up with a ton of results.<\\/p>\\n\\n<p>Well, I ran into a little problem with the splintered striper, and I have a solution to the problem.<\\/p>\\n<!--more-->\\n<p>The problem occurred if you had multiple class names on the element you are trying to stripe. That may not make much sense, so I guess an example will suffice.<\\/p>\\n\\n<h2>Striping Example with Problem<\\/h2>\\n\\n<p>Say we start with the following markup:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\n&lt;ul&nbsp;class=\\\"stripe&nbsp;something\\\"&gt;<br \\/>&nbsp;&lt;li&gt;This&nbsp;is&nbsp;an&nbsp;odd&nbsp;row.&lt;\\/li&gt;<br \\/>&nbsp;&lt;li&gt;This&nbsp;is&nbsp;an&nbsp;even&nbsp;row.&lt;\\/li&gt;<br \\/>&nbsp;&lt;li&gt;This&nbsp;is&nbsp;an&nbsp;odd&nbsp;row.&lt;\\/li&gt;<br \\/>&nbsp;&lt;li&gt;This&nbsp;is&nbsp;an&nbsp;even&nbsp;row.&lt;\\/li&gt;<br \\/>&nbsp;&lt;li&gt;This&nbsp;is&nbsp;an&nbsp;odd&nbsp;row.&lt;\\/li&gt;<br \\/>&nbsp;&lt;li&gt;This&nbsp;is&nbsp;an&nbsp;even&nbsp;row.&lt;\\/li&gt;<br \\/>&lt;\\/ul&gt;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>We are going to pretend that the class name <code>something<\\/code> actually does something useful. Then using a JavaScript <a href=\\\"http:\\/\\/simonwillison.net\\/2004\\/May\\/26\\/addLoadEvent\\/\\\">addLoadEvent function<\\/a>, we will add the striping event to run on page load:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\naddLoadEvent(function()&nbsp;&#123;<br \\/>&nbsp;&nbsp;striper(\'ul\',\'stripe\',\'li\',\'odd,even\');<br \\/>&#125;);&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>Essentially, we have told the striper function to stripe all list elements (<code>li<\\/code>s) that are descendants of unordered lists (<code>ul<\\/code>s) with the class name of stripe. Then we want to apply the classes odd and even to the alternating list items.<\\/p>\\n\\n<p>Here is where the problem lies. Since there are two classes on the unordered list, the striper function does not recognize that it has a class name of stripe. Here is the problem in the code:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\nif&nbsp;((parentElementClass&nbsp;==&nbsp;null)||(currentParent.className&nbsp;==&nbsp;parentElementClass))&nbsp;&#123;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>Since we are just seeing if the class name of the current element is equal to the class name of stripe, this is not true.<\\/p>\\n\\n<p>I have created a <a href=\\\"http:\\/\\/trevordavis.net\\/play\\/striper\\/indexBad.html\\\">simple demo page<\\/a> with an unordered list, table, and paragraphs that are supposed to be striped.<\\/p>\\n\\n<h2>Fixing the Striper<\\/h2>\\n\\n<p>Really all you have to do to the JavaScript is to remove the line from above and replace with the lines below:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\nvar&nbsp;pattern&nbsp;=&nbsp;new&nbsp;RegExp(\\\"(^|&nbsp;)\\\"&nbsp;+&nbsp;parentElementClass&nbsp;+&nbsp;\\\"(&nbsp;|$)\\\");<br \\/>if&nbsp;((parentElementClass&nbsp;==&nbsp;null)||(currentParent.className.match(pattern)))&nbsp;&#123;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>That takes the class name and splits is with a regular expression. So now you could have fifty class names on the element, and it will still work<\\/p>\\n\\n<p>Here is a <a href=\\\"http:\\/\\/trevordavis.net\\/play\\/striper\\/\\\">little demo of the improved splintered striper<\\/a>.<\\/p>\\n\\n<p>I&rsquo;m sure there is another way to do that easier, so feel free to let me know if there is.<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:41','2014-08-08 19:32:33','129384a5-07ed-443c-a269-75c9ed23ce3c',1),(517,288,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"I Took The Web Design Survey, 2007\",\"slug\":\"i-took-the-web-design-survey-2007\",\"postDate\":1177450771,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>I hope all you web people took the <a href=\\\"http:\\/\\/alistapart.com\\/articles\\/webdesignsurvey\\\">A List Apart 2007 Web Design Survey<\\/a>. All it can do is get some wonderful statistics for us web nerds. Plus, you get this sweet button.<\\/p>\\n\\n<p><a href=\\\"http:\\/\\/alistapart.com\\/articles\\/webdesignsurvey\\\"><img src=\\\"&lt;?php bloginfo(\'template_directory\'); ?&gt;\\/images\\/blog\\/i-took-the-2007-survey.gif\\\" alt=\\\"I Took The 2007 Survey\\\" \\/><\\/a><\\/p>\\n\\n<p>So I urge everyone who has anything to do with the web to fill out the <a href=\\\"http:\\/\\/alistapart.com\\/articles\\/webdesignsurvey\\\">survey<\\/a>.<\\/p>\\n<!--more-->\\n<p>I did struggled with one question about what my specific job title is, because there has been some recent debate about what exactly it is.<\\/p>\\n\\n<p>At my job, my position is called webmaster. Recently, we posted a new job, <a href=\\\"http:\\/\\/matrixgroup.net\\/careers\\/index.cfm?fa=show_job&id=53\\\">CSS Jedi \\/ Front-End Developer<\\/a>. This is my job title basically. I helped to write the description for this job, and this is what we decided that the actual job entails.<\\/p>\\n\\n<p>When we thought about webmaster, we thought about a single person who is in charge of making minute updates to a single website. But this is really not what I do. Sure, I make small updates to my team\'s client sites, but I also slice new designs as well. I am also prototyping stuff all the time and do implementations.<\\/p>\\n\\n<p>So, front-end developer is suitable for me.<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:41','2014-08-08 19:32:33','db669cfe-bab0-468a-ae78-4209d1fe4c79',1),(518,289,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"CSS Attribute Selectors Explained\",\"slug\":\"css-attribute-selectors-explained\",\"postDate\":1176592085,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>So, I had played around with CSS attribute selectors a little bit before I went to <a href=\\\"http:\\/\\/aneventapart.com\\/events\\/boston07\\/\\\">An Event Apart Boston<\\/a>, but I have a much better grasp of them now. I gave a brief overview in my <a href=\\\"http:\\/\\/trevordavis.net\\/blog\\/web\\/an-event-apart-boston-summary.php\\\">An Event Apart Boston Summary<\\/a>.<\\/p>\\n\\n<p>Currently, you really have to do some digging to figure out exactly how to use them, but I hope this article explains them all better.<\\/p>\\n<!--more-->\\n<h2 class=\\\"replaceHeadline\\\">General Information<\\/h2>\\n\\n<p>Basically, attribute selectors allow you to target elements based on their attributes (i.e. alt, href, title, etc.). In the table below, you can see all the different options for attribute selectors.<\\/p>\\n\\n<dl>\\n <dt>[attr]<\\/dt>\\n <dd>Whenever the attribute is set. Ex: input[type]<\\/dd>\\n\\n <dt>[attr=\\\"val\\\"]<\\/dt>\\n <dd>Whenever the attribute equals the specific value. Ex: input[type=\\\"radio\\\"]<\\/dd>\\n\\n <dt>[attr~=\\\"val\\\"]<\\/dt>\\n <dd>Whenever the attribute equals one of the space separated list of values. Ex: input[type~=\\\"radio checkbox\\\"]<\\/dd>\\n\\n <dt>[attr|=\\\"val\\\"]<\\/dt>\\n <dd>Whenever the attribute equals a hyphen-separated list of words, beginning with the value. (This one is supposed to be unreliable, and I am a little confused by the specifications, so I am not really sure of how to explain an example.)<\\/dd>\\n\\n <dt>[attr*=\\\"val\\\"]<\\/dt>\\n <dd>Whenever the attribute contains the value. Ex: a[href*=\\\".com\\\"]<\\/dd>\\n\\n <dt>[attr^=\\\"val\\\"]<\\/dt>\\n <dd>Whenever the attribute starts with the value. Ex: a[href^=\\\"http\\\"]<\\/dd>\\n\\n <dt>[attr$=\\\"val\\\"]<\\/dt>\\n <dd>Whenever the attribute ends with the value. Ex: a[href$=\\\".pdf\\\"]<\\/dd>\\n<\\/dl>\\n\\n<p>Ok, so hopefully the general information makes them a little clearer, and I hope the following examples make them very easy to use.<\\/p>\\n\\n\\n<h2 class=\\\"replaceHeadline\\\">Examples<\\/h2>\\n<p>Below, I will give an example of each attribute selector and how it can be used.<\\/p>\\n\\n<h3 class=\\\"replaceHeadline\\\">[attr]<\\/h3>\\n\\n<p>Ok, so say maybe you want to style anchors that have the href attribute set to something. This may help differentiate JavaScript anchors.<\\/p>\\n\\n<p>The CSS you want to add is like so:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\na&nbsp;&#123;&nbsp;text-decoration:&nbsp;underline;&nbsp;&#125;<br \\/><br \\/>a&#91;href&#93;&nbsp;&#123;<br \\/>&nbsp;border-bottom:&nbsp;1px&nbsp;dotted&nbsp;#999;<br \\/>&nbsp;text-decoration:&nbsp;none;<br \\/>&#125;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>That will remove the underline, and add a grey bottom border to anything that has the href attribute set.<\\/p>\\n\\n<h3 class=\\\"replaceHeadline\\\">[attr=\\\"val\\\"]<\\/h3>\\n\\n<p>Ok, so maybe you have added a green border to all input elements, but then you don&rsquo;t want them on radio buttons. So you add the following CSS:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\ninput&nbsp;&#123;&nbsp;border:&nbsp;1px&nbsp;solid&nbsp;green;&nbsp;&#125;<br \\/><br \\/>input&#91;type=\\\"radio\\\"&#93;&nbsp;&#123;&nbsp;border:&nbsp;none;&nbsp;&#125;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>That will add a green border to all input elements except for radio buttons.<\\/p>\\n\\n<h3 class=\\\"replaceHeadline\\\">[attr~=\\\"val\\\"]<\\/h3>\\n\\n<p>Use the same example that you want to add a green border to all input elements except for radio buttons, checkboxes, and submit buttons. The CSS you need is:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\ninput&nbsp;&#123;&nbsp;border:&nbsp;1px&nbsp;solid&nbsp;green;&nbsp;&#125;<br \\/><br \\/>input&#91;type~=\\\"radio&nbsp;checkbox&nbsp;submit\\\"&#93;&nbsp;&#123;&nbsp;border:&nbsp;none;&nbsp;&#125;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>So you get a green border on all input elements except radio buttons, checkboxes, and submit buttons.<\\/p>\\n\\n<h3 class=\\\"replaceHeadline\\\">[attr*=\\\"val\\\"]<\\/h3>\\n\\n<p>Ok, so maybe you want to add a <a href=\\\"http:\\/\\/google.com\\\">Google<\\/a> favicon to every link to Google. Add the following (pretending you have a Google favicon):<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\na&#91;href*=\\\"google\\\"&#93;&nbsp;&#123;<br \\/>&nbsp;background:&nbsp;url(\\/images\\/googleIcon.gif)&nbsp;no-repeat&nbsp;100%&nbsp;50%;<br \\/>&nbsp;padding-right:&nbsp;25px;<br \\/>&#125;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>So now any link to Google, http:\\/\\/google.com\\/analytics, http:\\/\\/google.com\\/sitemaps, etc. will have the Google favicon.<\\/p>\\n\\n<h3 class=\\\"replaceHeadline\\\">[attr^=\\\"val\\\"]<\\/h3>\\n\\n<p>Let&rsquo;s add an external link to all links that start with http<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\na&#91;href^=\\\"http\\\"&#93;&nbsp;&#123;<br \\/>&nbsp;background:&nbsp;url(\\/images\\/external.gif)&nbsp;no-repeat&nbsp;100%&nbsp;50%;<br \\/>&nbsp;padding-right:&nbsp;25px;<br \\/>&#125;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>Now every link that starts with http will have an external link icon.<\\/p>\\n\\n<h3 class=\\\"replaceHeadline\\\">[attr$=\\\"val\\\"]<\\/h3>\\n<p>Ok, now we should display an icon for any file types that we are linking to: pdf, doc, xls.<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\na&#91;href$=\\\".pdf\\\"&#93;,&nbsp;a&#91;href$=\\\".doc\\\"&#93;,&nbsp;a&#91;href$=\\\".xls\\\"&#93;&nbsp;&#123;<br \\/>&nbsp;background-position:&nbsp;100%&nbsp;50%;<br \\/>&nbsp;background-repeat:&nbsp;no-repeat;<br \\/>&nbsp;padding-right:&nbsp;19px;<br \\/>&#125;<br \\/><br \\/>a&#91;href$=\\\".pdf\\\"&#93;&nbsp;&#123;&nbsp;background-image:&nbsp;url(\\/images\\/pdf.gif);&nbsp;&#125;<br \\/>a&#91;href$=\\\".doc\\\"&#93;&nbsp;&#123;&nbsp;background-image:&nbsp;url(\\/images\\/doc.gif);&nbsp;&#125;<br \\/>a&#91;href$=\\\".xls\\\"&#93;&nbsp;&#123;&nbsp;background-image:&nbsp;url(\\/images\\/xls.gif);&nbsp;&#125;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>This is one of the coolest things for me. No more adding extraneous markup in order to add an icon that shows the file type when linking to a file.<\\/p>\\n\\n<h3 class=\\\"replaceHeadline\\\">That&rsquo;s it!<\\/h3>\\n\\n<p>I must say, that this works in all browsers, except IE 6 of course. But if you use the <a href=\\\"http:\\/\\/dean.edwards.name\\/ie7\\/\\\">Dean Edwards IE7 Script<\\/a> and include the CSS 3 selectors, it will work. I will eventually give a rundown of how to use that script, because I find the documentation a little hard to read. So I hope everyone enjoys attribute selectors as much as I do.<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:41','2014-08-08 19:32:33','fd010b4c-a668-4379-8951-522bf0075cc1',1),(519,290,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"An Event Apart Boston Summary\",\"slug\":\"an-event-apart-boston-summary\",\"postDate\":1175391535,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>So I am finally getting around to writing up a summary of my time at <a href=\\\"http:\\/\\/aneventapart.com\\/events\\/boston07\\/\\\">An Event Apart Boston<\\/a>. I can&rsquo;t even express how much that I learned. It was amazing to see so many respectable names in the web design\\/development community all speak. Thank god for my company, <a href=\\\"http:\\/\\/matrixgroup.net\\\">Matrix Group International<\\/a> for paying for myself and two co-workers to go to the event. So I thought I would give a quick run-down of all of the events.<\\/p>\\n<!--more-->\\n<h2>Eric Meyer &mdash; Secrets of a CSS Jedi<\\/h2>\\n\\n<p><a href=\\\"http:\\/\\/meyerweb.com\\\">Eric Meyer<\\/a> started off the event with an wonderful talk showing the amazing things that are possible with CSS. The first thing that he mentioned was that in order to get consistency between browser, you should zero out the margins and paddings for every element (except form elements). People have been doing this by using the universal selector (*), but by removing the margins and padddings for every element, you can sometimes get weird results with form elements. I mean conceptually, what should happen when you add more padding to a radio button? Should the space between the circle and outline increase? The other thing is that the universal selector takes more time to process than just having a large group selector.<\\/p>\\n\\n<p>His next point was that we need to realize that CSS doesn&rsquo;t care what element is doing what, an element is an element. Which is when he turned a regular HTML table into a bar graph, both vertical and horizontal. Basically, he had a few classes, and he was positioning the cells absolutely. I am still not sure if it would have worked in <abbr title=\\\"Internet Explorer\\\">IE<\\/abbr> 6, since it is so fussy at times. He said he would post his HTML files at some point, so I would be interested in testing in IE 6. It was just awesome to see the power of CSS, and what we have to look forward to in the future as browsers get more and more powerful.<\\/p>\\n\\n<h2>Jeffrey Zeldman &mdash; Writing the User Interface<\\/h2>\\n\\n<p><a href=\\\"http:\\/\\/zeldman.com\\/\\\">Jeffrey Zeldman<\\/a> next spoke about writing content for the web. When we look at the highest traffic sites on Alexa, it is not a coincidence that content heavy sites are at the top. Content is what drives traffic. Fresh copy is what counts more than looks. People do not bookmark pages because of the images that are on it (except for photographic sites); they are bookmarking because of the content.<\\/p>\\n\\n<p>Every instance of copy on a site is a brand opportunity, and copy is often the easiest and cheapest part of a site to fix. Guide copy should be clear, brief, audience appropriate, and brand appropriate. Web users are most often in find mode, and they scan. While monitors get better and better, reading on the screen is much more fatiguing than reading print.<\\/p>\\n\\n<p>The keys to writing for the web is:<\\/p>\\n<ul>\\n <li>Use frequent subheads.<\\/li>\\n <li>Chunk text.<\\/li>\\n <li>Use 8th grade vocabulary, short declarative sentences<\\/li>\\n<\\/ul>\\n\\n<p>I tell you, Zeldman really speaks well. When he speaks, you just get enthralled in what he is saying. That is why I think working with him would be awesome. It is too bad that the <a href=\\\"http:\\/\\/zeldman.com\\/2007\\/03\\/22\\/happy-cog-philadelphia-is-hiring\\/\\\">Happy Cog Front End Developer<\\/a> position requires you to be in Philly. I can&rsquo;t even imagine working with all of those awesome people at <a href=\\\"http:\\/\\/happycog.com\\/\\\">Happy Cog<\\/a>.<\\/p>\\n\\n<h2>Jason Santa Maria &mdash; How to Redesign Your Way Out of a Paper Bag<\\/h2>\\n\\n<p>Since I am not always the most creative person, I was really interested in hearing this speech. The first thing <a href=\\\"http:\\/\\/jasonsantamaria.com\\/\\\">Jason Santa Maria<\\/a> talked about was looking around you for inspiration.<\\/p>\\n\\n<ul>\\n <li>Keep a sketchbook.<\\/li>\\n <li>Keep morgue files (whenever you see something in print that is cool, put it into a file folder).<\\/li>\\n <li>Surround yourself in a creative environment.<\\/li>\\n<\\/ul>\\n\\n<p>But the best solution for seeking inspiration is to do research. When Happy Cog was redesigning the <a href=\\\"http:\\/\\/comhaltas.ie\\/\\\">Comhaltas<\\/a> website, they went and heard these people play the music, and they hung out with them. This gave them some insight into the music and gave them inspiration to create the design.<\\/p>\\n\\n<p>We also need to remember that design is iterative. First, you start with grey box comps, which is where you focus on the idea and not minute details. Once satisfied with those, you get into the specifics of each element. When designing, you need to consider things that will not look dated in a year.<\\/p>\\n\\n<p>Another topic that I have recently read about in <a href=\\\"http:\\/\\/transcendingcss.com\\\">Transcending CSS<\\/a> is about grid design. This is not a new technique; it is just something that people do not know how to do. But basically by setting up a grid and designing by it, you keep things in line and can create really clean and nicely defined lines. This way you can plan for the placement of things, even if you aren&rsquo;t the one updating it. Jason said to embrace the whitespace, which I think is something that is definitely being done in this whole &ldquo;Web 2.0&rdquo; thing.<\\/p>\\n\\n<p>The way to design is left to right, top to bottom, big to small; just like how we read. Make sure there is enough contrast on elements, and things do not have to be over-styled.<\\/p>\\n\\n<p>On a side note, Jason had a little rant about how \\\" is not the same thing as &ldquo; (<code>&amp;ldquo;<\\/code>) and \' is not the same thing as &rsquo; (<code>&amp;rsquo;<\\/code>). \\\" and \' are used for feet and inches, while &ldquo; and &lsquo; are used for quotation marks and apostrophes.<\\/p>\\n\\n<p>Jason&rsquo;s speech really inspired me, and I have since given up on my sister, who was going to design my site for me. I am just going to go for it.<\\/p>\\n\\n<h2>Steve Krug &mdash; The Web Usability Diet<\\/h2>\\n\\n<p>I had heard <a href=\\\"http:\\/\\/sensible.com\\/\\\">Steve Krug<\\/a> give a similar speech at another conference, but his points are still so valid. He first begin by pointing out that even the best thought out products have usability flaws. You can put it all the research and time creating the product, but without testing it, it can easily fail.<\\/p>\\n\\n<p>Web user testing is easy to do:<\\/p>\\n\\n<ol>\\n <li>Round up a few volunteers.<\\/li>\\n <li>Have them follow a script where they will be asked to complete some tasks.<\\/li>\\n <li>Record it using software like <a href=\\\"http:\\/\\/www.techsmith.com\\/camtasia.asp\\\">Camtasia<\\/a>.<\\/li>\\n <li>Then review with your team and see how much you screwed up.<\\/li>\\n <li>Oh yeah, and pay your volunteers.<\\/li>\\n<\\/ol>\\n\\n<p>He made the point that you need to focus on the most serious ones, until they are right. It really does not take too much time and effort to realize that you have the problems; the harder part is fixing them all. The example that he used was to order a subscription of The New Yorker magazine on <a href=\\\"http:\\/\\/www.magazines.com\\/\\\">Magazines.com<\\/a> without using the search function. We found that it was not very easy. Time yourself. Only a handful of people did it in the alloted amount of time (approximately 3 minutes). He has used this example time and time again, and Magazines.com still has not corrected the problem.<\\/p>\\n\\n<p>While usability testing is relatively easy, sometimes it is hard to convince your clients of the value of it. But honestly, if money is involved, there needs to be testing.<\\/p>\\n\\n<h2>Andrew Kirkpatrick - Beyon Basic Access<\\/h2>\\n\\n<p>I must say, <a href=\\\"http:\\/\\/blogs.adobe.com\\/accessibility\\/\\\">Andrew Kirkpatrick<\\/a> did not have the most enthralling speech, but it was an extremely hard topic to make interesting. He spoke about how accessibility is more than just alt attributes, <code>&lt;label><\\/code>s, <code>&lt;th><\\/code>s, or retaining information when JavaScript is disabled. There are many different kinds of disabilities that users of the web have, and we need to embrace all of them, not just a few.<\\/p>\\n\\n<p>The whole gist of his speech was that we need to provide the name, role, and state of objects that users are interacting with. For instance, if you have a set of tabs, these need to be named so that they make sense. Their role needs to be defined, i.e. Tabs, and the current state of each tab needs to be readily accessible. Providing keyboard access to arrow over between tabs is a huge step forward. <a href=\\\"http:\\/\\/yahoo.com\\\">Yahoo!<\\/a> and <a href=\\\"http:\\/\\/dojotoolkit.org\\/\\\">Dojo<\\/a> are making great strides in this domain, and their scripts are readily available.<\\/p>\\n\\n<h2>Dan Cederholm &mdash; Interface Design Juggling<\\/h2>\\n\\n<p><a href=\\\"http:\\/\\/simplebits.com\\\">Dan Cederholm<\\/a> may have given the best talk of the entire two days. He was witty, and his insight was great. Not to mention he is currently one of my favorite designers.<\\/p>\\n\\n<p>He first spoke about choosing color. By starting with a small color palette and reusing variations of that set throughout the design, you get a much more cohesive design. A few ways to choose these palettes are:<\\/p>\\n\\n<ul>\\n <li>Grab a nature photo you like, and use the color picker.<\\/li>\\n <li>Apply the Mosaic filter in photoshop to any image, and see the color combinations that are possible.<\\/li>\\n<\\/ul>\\n\\n<p>Even such a simple thing as link color can carry great weight, since links are the most important item of the web, choosing a color that will stand out is important.<\\/p>\\n\\n<p>In Dan&rsquo;s definition, great typography is invisible. Since there are not many universal fonts, we just need to learn how to work with what we got. One thing that Dan does beautifully on his <a href=\\\"http:\\/\\/simplebits.com\\\">site<\\/a>, is by styling his &amp;&rsquo;s beautifully. It is such a small thing, but just by adding one class, it really adds that extra beauty to the page.<\\/p>\\n\\n<p>Another interesting point that Dan brought up was the importance of Favicons. These can be used when people link to your site, they are used for bookmarks, and we are seeing them more and more on mobile devices. So essentially it is the first brand opportunity for your site.<\\/p>\\n\\n<p>Dan also talked about adding small simple details without adding complexity. By adding a simple 3px drop shadow on the bottom of a box, it adds a lot of detail to the box without any extra markup.<\\/p>\\n\\n<p>Finally, Dan talked about <a href=\\\"http:\\/\\/microformats.org\\\">Microformats<\\/a>. I must say I was a little unclear about the benefits at first, but after hearing his speech, I totally understand them. I thought it was all very confusing, but essentially all that you are doing is adding a few universally accepted classes to elements. As Dan said, we are really desiging for the future. Allowing people to do all sort of cool things with these universal classes.<\\/p>\\n\\n<p>Oh, and of course Dan talked about being bulletproof:<\\/p>\\n\\n<ul>\\n <li>Check out what your site looks like with images disabled.<\\/li>\\n <li>Check it out with CSS disabled.<\\/li>\\n <li>Finally, bump up the text two sizes.<\\/li>\\n<\\/ul>\\n\\n<h2>Opening Night Party &mdash; Restaurant 33<\\/h2>\\n\\n<p>Definitely the coolest bar I have ever been to. <a href=\\\"http:\\/\\/33restaurant.com\\/\\\">Restaurant 33<\\/a> had these cool lighting effects all over the place, and it was really entrancing. Not to mention the free food, free drinks, and people were cool too.<\\/p>\\n\\n<h2>Cameron Moll &mdash; Good vs. Great Design<\\/h2>\\n\\n<p><a href=\\\"http:\\/\\/cameronmoll.com\\/\\\">Cameron Moll<\\/a> is another wonderful designer, and his talk seemed more conceptual than technical, but it was still very interesting. He first started taking about how there are some things that are just mapped naturally and that can help up determine how something works. Design is essentially communication, but great design yields meaningful communication. Sure there may be some really creative people out there, but if they don&rsquo;t know how to design for specific audiences, then there talent is wasted. Cameron talked about how seeing things in greyscale can help to see the importance of specific elements in design.<\\/p>\\n\\n<p>He then went on to talk about how influence is almost cheap, it can be found anywhere and copied anywhere. While it can also be found anywhere, inspiration is a much deeper thing.<\\/p>\\n\\n<p>Finally, Cameron discussed the difference between redesigning (just updating the look of the site) and realigning (adapting to your users&rsquo; changed needs). He finished with the concept of fixing vs. preventing. By putting in more time up front to prevent things, you will be saving time in the long run from fixing.<\\/p>\\n\\n<h2>Ethan Marcotte &mdash; Web Standards Stole My Truck<\\/h2>\\n\\n<p><a href=\\\"http:\\/\\/sidesh0w.com\\/\\\">Ethn Marcotte&rsquo;s<\\/a> talk was a little boring to me, because he didn&rsquo;t really discuss many new things to me. He did make a few interesting points though.<\\/p>\\n\\n<ul>\\n <li>While embracing standards may seen hard (to non-standardistas), the benefits are huge\\n  <ul>\\n   <li>Lighter page weight<\\/li>\\n   <li>Better accessibility<\\/li>\\n   <li>Better <abbr title=\\\"Search Engine Optimization\\\">SEO<\\/abbr><\\/li>\\n   <li>One single document that can control the style of an entire site<\\/li>\\n  <\\/ul>\\n <\\/li>\\n <li>You can use the developer tools (like <a href=\\\"http:\\/\\/getfirebug.com\\\">Firebug<\\/a>, <a href=\\\"https:\\/\\/addons.mozilla.org\\/en-US\\/firefox\\/addon\\/60\\\">Web Developer Toolbar<\\/a>) out there, you can decrease debugging time.<\\/li>\\n <li>Use borders and backgrounds to debug layout problems.<\\/li>\\n <li>Validate your code.<\\/li>\\n <li>When all else fails, just delete properties and start from scratch.<\\/li>\\n<\\/ul>\\n\\n<p>The most profound statement he made was that building a site with standards is easy, but keeping it standards compliant is hard.<\\/p>\\n\\n<h2>Molly Holzschlag &mdash; Building Better Browsers<\\/h2>\\n\\n<p>As many people heard, <a href=\\\"http:\\/\\/molly.com\\/\\\">Molly Holzschlag<\\/a> is going to do some work for Microsoft to whip their browser into shape. While at first I did not think Molly&rsquo;s speech was going to be very interesting, it turned out to be pretty good.<\\/p>\\n\\n<p>She first pointed out that browsers are software too, they ALL have bugs. Also, the browser history is not that long, they are relatively young in software age. Since there are so many different interpretations to things, it is easy to have many different approaches to implementation. Don&rsquo;t worry, I still hate IE. But after hearing her talk, and thinking back to my programming days in college, I have more respect for IE.<\\/p>\\n\\n<p>Molly&rsquo;s browser pathways to success were:<\\/p>\\n\\n<ol>\\n <li>Create common baselines.<\\/li>\\n <li>Clarify ambiguous specifications.<\\/li>\\n <li>Use transparent development cycles.<\\/li>\\n <li>Keep an open dialog with the community.<\\/li>\\n <li>Foster events and networking (Microsoft was a sponsor of An Event Apart).<\\/li>\\n <li>Compete of <abbr title=\\\"User Experience\\\">UE<\\/abbr> and features.<\\/li>\\n<\\/ol>\\n\\n<h2>Eric Meyer &mdash; State of CSS in IE 7 World<\\/h2>\\n\\n<p>Ok everyone, let&rsquo;s admit it. IE 7 is a huge step forward. It can basically be considered on the same standards-compliant level as Firefox, Safari, and Opera. The browser advanced so much in a standards sense. I am not going to bore you with all of the things that are now possible in IE 7 that weren&rsquo;t in IE 6, but I will point out one cool thing.<\\/p>\\n\\n<h3>Attribute Selectors<\\/h3>\\n\\n<p><a href=\\\"http:\\/\\/trevordavis.net\\/blog\\/tutorial\\/css-attribute-selectors-explained.php\\\">Attribute selectors<\\/a> are awesome. That&rsquo;s it. Maybe one of the coolest things in CSS. By adding something like <code>a[href$=\\\".pdf\\\"]<\\/code> to your CSS file, you can add a pdf icon to all links to pdfs. By adding something like <code>a[href^=\\\"http:\\/\\/]<\\/code>, you can target all external links an add an icon for that. That&rsquo;s the long and short of it. It&rsquo;s awesome.<\\/p>\\n\\n<p>Eric also encouraged everyone to make IE 6 more like IE 7 with <a href=\\\"http:\\/\\/trevordavis.net\\/blog\\/tutorial\\/using-dean-edwards-ie7-script.php\\\">Dean Edwards&rsquo; IE7 scripts<\\/a>. Via JavaScript, you can make IE 6 act must like IE 7. I have played around with it a little, and it is really cool. Use it. Spread the word.<\\/p>\\n\\n<h2>Jeffrey Zeldman &mdash; Selling Design<\\/h2>\\n\\n<p>Jeffrey wrapped it up with an interesting discussion on choosing clients. I have read a few articles recently about choosing clients, and this just reinforced the point. You do not need great clients; you need great relationships. You still need to choose your clients carefully and make sure not to choose indecisive clients, or the work will never get done successfully. The way to a good relationship is to involve the decision makers who are high up in the organization. This makes them feel special. Everyone wants and needs to feel special sometimes.<\\/p>\\n\\n<p>Our job is to sell ideas, not pixels. Solve a problem with your design. Don&rsquo;t just create a design. When responding to criticism, figure out what they mean by it. Why don&rsquo;t they like that color? They also need to realize that the site is not about the stakeholders; it is about the users.<\\/p>\\n\\n<p>When all else fails:<\\/p>\\n\\n<ol>\\n <li>Push back.<\\/li>\\n <li>Look into it.<\\/li>\\n <li>Agree with them. Surprise!<\\/li>\\n<\\/ol>\\n\\n<h2>That&rsquo;s It!<\\/h2>\\n<p>I must say; it was awesome. I can&rsquo;t wait to find some time to actually do my site design. If ever you have the change, go to An Event Apart event. Everything was very well organized, and I learned a lot. Thanks to everyone at An Event Apart, Happy Cog, and the speakers.<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:42','2014-08-08 19:32:33','c8ba7cc9-f023-4528-9ac8-3fd89d7c7347',1),(520,291,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"An Event Apart Boston\",\"slug\":\"an-event-apart-boston\",\"postDate\":1174430913,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>So my company is paying for two other webmasters and myself to go to <a href=\\\"http:\\/\\/www.aneventapart.com\\/events\\/boston07\\/\\\">An Event Apart Boston<\\/a>. It is not too often that you can get this many amazing names in the field of web development together in one place.<\\/p>\\n<!--more-->\\n<p>I think I am really looking forward to the more design-centered events like:<\\/p>\\n\\n<ul>\\n<li>Redesigning Your Way Out of a Paper Bag by Jason Santa Maria<\\/li>\\n<li>Good vs. Great Design by Cameron Moll<\\/li>\\n<li>Selling Design by Jeffrey Zeldman<\\/li>\\n<\\/ul>\\n\\n<p>While I can\'t wait to go to all of the events, these are the ones I really can\'t wait to go to. I feel like I have a amazing grasp of the technical side of web development (i.e. CSS, XTHML, etc), but I wish I could become better at the design side. That is what I hope to get better at in the next few months.<\\/p>\\n\\n<p>I will post an update after the show and give a rundown of the speakers.<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:42','2014-08-08 19:32:33','4c355994-b948-4283-a27c-08c6827bb2f6',1),(521,292,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"Problems with Commenting\",\"slug\":\"problems-with-commenting\",\"postDate\":1173125370,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>So in the quest to abolish the www from my URL, I seemed to have broken Movable Type comments.<\\/p>\\n\\n<p>I added the following to my .htaccess file:<\\/p>\\n<!--more-->\\n<div class=\\\"codeblock\\\"><code>\\nRewriteEngine&nbsp;on<br \\/>RewriteCond&nbsp;%&#123;HTTP_HOST&#125;&nbsp;^www.trevordavis.net$&nbsp;&#91;NC&#93;<br \\/>RewriteRule&nbsp;^(.*)$&nbsp;http:\\/\\/trevordavis.net\\/$1&nbsp;&#91;R=301,L&#93;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>That means whenever anyone tried to go to <a href=\\\"\\/\\\">www.trevordavis.net<\\/a>, they were redirected to <a href=\\\"\\/\\\">trevordavis.net<\\/a>.<\\/p>\\n\\n<p>My co-worker, Adrian, told me today that when he was trying to add a comment to one of my entries, he got an error that said \\\"No entry_id\\\". After much googling, I finally determined it was because of the URL rewriting. I could not really find a solution, but I finally went into the mt-config.cgi file and found out that when I had setup the site, I set it up with <a href=\\\"\\/\\\">www.trevordavis.net<\\/a>. For some reason, this broke the comments. I changed it to <a href=\\\"\\/\\\">trevordavis.net<\\/a>, and my quest to abolish the www continues.<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:42','2014-08-08 19:32:33','2ec282d6-6755-4c14-8cd2-59baafa62037',1),(522,293,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"The Rise of Flash Again\",\"slug\":\"the-rise-of-flash-again\",\"postDate\":1173046364,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>This week, there was an A List Apart article called <a href=\\\"http:\\/\\/alistapart.com\\/articles\\/semanticflash\\\">Semantic Flash: Slippery When Wet<\\/a>. When I first started learning about Web Standards, I hated flash. I thought that it was really all just bells and whistles and nothing useful. As time has passed, I have realized that there are some situations where flash can be useful.<\\/p>\\n<!--more-->\\n<p>First, there was the <a href=\\\"http:\\/\\/www.mikeindustries.com\\/sifr\\/\\\">sIFR: Scalable Inman Flash Replacement<\\/a>. Earlier this week, there was the introduction of <a href=\\\"http:\\/\\/www.swfir.com\\/\\\">swfir: swf Image Replacement<\\/a>. I think this technique seems really cool, and there are definitely situations where I would be interested in using it. Just adding a simple drop shadow and rotating the image a few degrees really add a nice effect to the image.<\\/p>\\n\\n<p>My only problem is that I think it may be overused. I hope that people don\'t get so flash-happy that they use it for all images on their site. The same goes for the sIFR technique. I hope that people only utilize these techniques in moderation, and we don\'t see it all over the place. I have a feeling that we are going to start seeing more and more flash out there, and I really hope that we don\'t see it used the way it used to be. I still cannot understand how a person can build an all flash site and feel good about themselves. Does it make them happy that people with screen readers would have problems using their site? I guess it must make someone happy, since people are still doing it.<\\/p>\\n\\n<p>As a side note, I have played around with the swfir script, and it was very very easy to implement.<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:42','2014-08-08 19:32:33','baf45663-f23a-42a9-8050-1352a15d2e0f',1),(523,294,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"Learning from Mistakes\",\"slug\":\"learning-from-mistakes\",\"postDate\":1172010577,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>You really do get better through experience. The best experience is learning from your mistakes. I learned a great deal from one experience in particular.<\\/p>\\n<!--more-->\\n<p>About 2 months ago, I did some work for the a pretty high profile client. Their regular webmaster was going to be out of town during the busiest time of the year for them, and I had agreed to help them update the site for the next 2 weeks. Over the phone, I had been in contact with a representative, and we had agreed on a set price for the 2 weeks. We had guesstimated that I would do approximately 2 hours of work a night.<\\/p>\\n\\n<p>That was mistake number 1.<\\/p>\\n\\n<p>I should have gotten something in writing. At least an email to confirm how much we had agreed on would have worked. <a href=\\\"http:\\/\\/www.digital-web.com\\/about\\/staff\\/nick_gould\\/\\\"> Nick Gould<\\/a> wrote an excellent article entitled <a href=\\\"http:\\/\\/www.digital-web.com\\/articles\\/web_design_contracts\\/\\\">Web Design Contracts: Why Bother<\\/a>. Nick says:<\\/p>\\n\\n<blockquote>\\nA written contract won\'t always avoid this outcome &mdash; I\'ve had clients tell me with a straight face that they didn\'t realize we were billing for each hour of work despite a clear statement in our contract to that effect. But in that case, I could at least point back to the contract language (humbly, mumbling apologies as I did so) as evidence of his misunderstanding.\\n<\\/blockquote>\\n\\n<p>This is exactly what I would have been able to do if I had what we had agreed on in writing.<\\/p>\\n\\n<p>For the future, I plan on doing the following before starting any work:<\\/p>\\n\\n<ol>\\n <li>Write detailed contracts that clearly explain the pricing, the deliverables, the process, and the payment.<\\/li>\\n <li>Discuss any questions about the contract with the client.<\\/li>\\n <li>Wait for an initial payment from the client.<\\/li>\\n<\\/ol>\\n\\n<p>I would recommend that anyone doing freelance work do the same. Take some time to review Nick\'s article, and take the time to write these contracts. In the end, it is only going to help you.<\\/p>\\n\\n<p>To top it all off, the guy offered me some gear to make up for the money that he refused to pay me. No thanks, a t-shirt does not make up for the fact that you cheated me.<\\/p>\\n\\n<p>On a side note, the site was a disaster to work on. It was poorly organized, still used tables for layout, and did not use includes effectively. It is so sad to see a site that has such high visibility be so poor. Apparently, they just launched a redesign, and guess what? It still uses tables for layout! Hopefully, they will at least utilize stylesheets and includes.<\\/p>\\n\\n<p>Just for fun, if you don\'t have it already, download the <a href=\\\"https:\\/\\/addons.mozilla.org\\/firefox\\/60\\/\\\">Web Developer Toolbar<\\/a>. Go to some big name sites and go to Outline &raquo; Table Cells. See how many big organizations are still so far behind in their adherence to web standards. When are these companies going to realize that the web is such a valuable tool for their marketing campaign? I guess that is a topic for another conversation.<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:42','2014-08-08 19:32:33','7334ca9f-8cda-4358-b9ce-ef8a25d3a3c2',1),(524,295,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"Web Design \\/ Development Process\",\"slug\":\"web-design-development-process\",\"postDate\":1171403010,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>What are the steps that you go through when making a web site?<\\/p>\\n\\n<p>Are you adding a lot of extra <code>&lt;div><\\/code> and <code>&lt;span><\\/code> tags? Do you have way too many classes?<\\/p>\\n\\n<p>Maybe you should reconsider your process.<\\/p>\\n<!--more-->\\n<p>The process that I have found effective, is exactly what I am doing with this site:<\\/p>\\n\\n<ol>\\n<li>Create the markup for everything.<\\/li>\\n<li>Add divs that make sense, i.e. header, content, footer.<\\/li>\\n<li>Go in and implement the design adding the necessary divs and classes.<\\/li>\\n<\\/ol>\\n\\n<p>Your markup will become much less bloated, and you will have less non-semantic elements. Sure you may have to add a couple of extra <code>&lt;div><\\/code> tags to add those rounded corners, but its better to add those after you have the structure in place.<\\/p>\\n\\n<p>While I could easily come up with a design for this site, I really am not as creative as my sister is. That is why I have tasked her with coming up with a logo and a design for my site. Then when it is time for her to build her online portfolio, I will help her to implement the site.<\\/p>\\n\\n<p>How can you improve your design \\/ development process? Can you improve mine?<\\/p>\\n\\n<p>Share your methods.<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:42','2014-08-08 19:32:33','beb8d96d-fd5e-44ae-bbc0-5c62d391b812',1),(525,296,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"Web Standards. What don\\u2019t they get?\",\"slug\":\"web-standards.-what-dont-they-get\",\"postDate\":1171230075,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>I still don\'t understand why people refuse to embrace web standards.<\\/p>\\n\\n<p>Is there an advantage to using tables for layout? Yeah that bloated code and horribly inaccessible code sure sounds great to me too.<\\/p>\\n\\n<p>You know what sounds better to me? Some nice lean code with a stylesheet to control the style on the site.<\\/p>\\n<!--more-->\\n<p>There are two sites that I know of that have paid a lot of money to have their sites redesigned:<\\/p>\\n\\n<ol>\\n<li>My high school, <a href=\\\"http:\\/\\/www.gprep.org\\/\\\">Georgetown Prep<\\/a><\\/li>\\n<li>A site that I provided maintenance for a few weeks, <a href=\\\"http:\\/\\/orangebowl.org\\/\\\">The Orange Bowl<\\/a><\\/li>\\n<\\/ol>\\n\\n<p>Try viewing the source of those sites. <\\/p>\\n\\n<p>Yuck.<\\/p>\\n\\n<p>It hurts me to look at that. They paid good money for that? How can we educate the companies who built these sites to actually embrace web standards?<\\/p>\\n\\n<p><a href=\\\"http:\\/\\/webstandards.org\\/\\\">The Web Standards Project<\\/a> is a great start. Hopefully they can help to educate others. But they can\'t do it alone. All web developers who embrace standards need to educate when they have the opportunity. We also need to help fight against Microsoft and their terrible product: Internet Explorer. Sure IE 7 is a huge improvement, but it still stinks. Or how about the fact that Outlook 2007\'s HTML rendering engine will use Words engine instead of IE\'s. That sets HTML emails back a good ten years or so.<\\/p>\\n\\n<p>Embrace web standards!<\\/p>\\n\\n<p>Keep on fighting the good fight.<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:42','2014-08-08 19:32:33','d26f5c3d-e425-4609-9c0d-d9af870a440f',1),(526,297,4,1,2,NULL,'{\"authorId\":\"1\",\"title\":\"CSS Forms\",\"slug\":\"css-forms\",\"postDate\":1169772041,\"expiryDate\":null,\"enabled\":\"1\",\"fields\":{\"2\":\"<p>Everyone hates forms.<\\/p>\\n\\n<p>They are hard to style so that they work with your site design. They are hard to make them accessible. Yeah, yeah we have heard it all. But in reality, they are not that hard to do.<\\/p>\\n\\n<p>Since every other web developer\\/designer has their own method, I thought I would share my two cents.<\\/p>\\n<!--more-->\\n<p>When thinking through all of the HTML elements to find something that makes sense for forms, there are many options.<\\/p>\\n\\n<ul>\\n<li>Unordered List<\\/li>\\n<li>Ordered List<\\/li>\\n<li>DIVs<\\/li>\\n<li>Paragraphs<\\/li>\\n<li>Tables (Yes some people still use tables for forms)<\\/li>\\n<\\/ul>\\n\\n<p>There are probably others. But I like to use a more uncommon element: a Definition List. It is perfect for the job. You have got the definition term, which is essentially like the label. Then you have got the definition description, which is basically the actual form element.<\\/p>\\n\\n<p>Let\'s start with some un-styled markup:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\n&lt;form&nbsp;action=\\\"#\\\"&nbsp;method=\\\"post\\\"&nbsp;name=\\\"sendToFriendForm\\\"&nbsp;id=\\\"sendToFriendForm\\\"&gt;<br \\/>&nbsp;&lt;dl&nbsp;class=\\\"forms\\\"&gt;<br \\/>&nbsp;&nbsp;&lt;dt&gt;&lt;label&nbsp;for=\\\"name\\\"&gt;Your&nbsp;Name:&lt;\\/label&gt;&lt;\\/dt&gt;<br \\/>&nbsp;&nbsp;&lt;dd&gt;&lt;input&nbsp;name=\\\"name\\\"&nbsp;id=\\\"name\\\"&nbsp;type=\\\"text\\\"&nbsp;\\/&gt;&lt;\\/dd&gt;<br \\/><br \\/>&nbsp;&nbsp;&lt;dt&gt;&lt;label&nbsp;for=\\\"senderEmail\\\"&gt;Your&nbsp;Email&nbsp;Address:&nbsp;&lt;span&nbsp;class=\\\"required\\\"&gt;*&lt;\\/span&gt;&lt;\\/label&gt;&lt;\\/dt&gt;<br \\/>&nbsp;&nbsp;&lt;dd&gt;&lt;input&nbsp;name=\\\"senderEmail\\\"&nbsp;id=\\\"senderEmail\\\"&nbsp;type=\\\"text\\\"&nbsp;\\/&gt;&lt;\\/dd&gt;<br \\/><br \\/>&nbsp;&nbsp;&lt;dt&gt;&lt;label&nbsp;for=\\\"recipientEmail\\\"&gt;Friend\'s&nbsp;Email&nbsp;Address:&nbsp;&lt;span&nbsp;class=\\\"required\\\"&gt;*&lt;\\/span&gt;&lt;\\/label&gt;&lt;\\/dt&gt;<br \\/>&nbsp;&nbsp;&lt;dd&gt;&lt;input&nbsp;name=\\\"recipientEmail\\\"&nbsp;id=\\\"recipientEmail\\\"&nbsp;type=\\\"text\\\"&nbsp;\\/&gt;&lt;\\/dd&gt;<br \\/>&nbsp;&nbsp;&lt;dd&nbsp;class=\\\"help\\\"&gt;Use&nbsp;commas&nbsp;to&nbsp;separate&nbsp;multiple&nbsp;email&nbsp;addresses.&lt;\\/dd&gt;<br \\/><br \\/>&nbsp;&nbsp;&lt;dt&gt;&lt;label&nbsp;for=\\\"sex\\\"&gt;Sex&lt;\\/label&gt;&lt;\\/dt&gt;<br \\/>&nbsp;&nbsp;&lt;dd&nbsp;class=\\\"radio\\\"&gt;&lt;input&nbsp;name=\\\"sex\\\"&nbsp;id=\\\"male\\\"&nbsp;type=\\\"radio\\\"&nbsp;\\/&gt;&nbsp;&lt;label&nbsp;for=\\\"male\\\"&gt;Male&lt;\\/label&gt;&nbsp;&lt;input&nbsp;name=\\\"sex\\\"&nbsp;id=\\\"female\\\"&nbsp;type=\\\"radio\\\"&nbsp;\\/&gt;&nbsp;&lt;label&nbsp;for=\\\"female\\\"&gt;Female&lt;\\/label&gt;&lt;\\/dd&gt;<br \\/>&nbsp;&nbsp;&lt;dt&gt;&lt;label&nbsp;for=\\\"message\\\"&gt;Message:&lt;\\/label&gt;&lt;\\/dt&gt;<br \\/>&nbsp;&nbsp;&lt;dd&gt;&lt;textarea&nbsp;name=\\\"message\\\"&nbsp;id=\\\"message\\\"&gt;&lt;\\/textarea&gt;&lt;\\/dd&gt;<br \\/>&nbsp;&lt;\\/dl&gt;<br \\/>&nbsp;&lt;button&nbsp;type=\\\"submit\\\"&gt;Submit&nbsp;&amp;raquo;&lt;\\/button&gt;<br \\/>&lt;\\/form&gt;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>I have created the page so you can see <a href=\\\"http:\\/\\/trevordavis.net\\/play\\/cssForms\\/\\\">the output<\\/a>. Even un-styled, this form doesn\'t even look bad. But lets add some style:<\\/p>\\n\\n<div class=\\\"codeblock\\\"><code>\\nform&nbsp;&#123;<br \\/>&nbsp;&nbsp;margin:&nbsp;0;<br \\/>&nbsp;&nbsp;padding:&nbsp;0;<br \\/>&nbsp;&#125;<br \\/><br \\/>&nbsp;dl.forms&nbsp;&#123;<br \\/>&nbsp;&nbsp;float:&nbsp;left;<br \\/>&nbsp;&nbsp;width:&nbsp;100%;<br \\/>&nbsp;&#125;<br \\/><br \\/>&nbsp;dl.forms&nbsp;dt&nbsp;&#123;<br \\/>&nbsp;&nbsp;margin:&nbsp;0;<br \\/>&nbsp;&nbsp;padding:&nbsp;10px&nbsp;0&nbsp;0&nbsp;0;<br \\/>&nbsp;&nbsp;clear:&nbsp;left;<br \\/>&nbsp;&nbsp;float:&nbsp;left;<br \\/>&nbsp;&nbsp;width:&nbsp;175px;<br \\/>&nbsp;&#125;<br \\/><br \\/>&nbsp;dl.forms&nbsp;label&nbsp;&#123;&nbsp;font-weight:&nbsp;bold;&nbsp;&#125;<br \\/><br \\/>&nbsp;dl.forms&nbsp;dd&nbsp;&#123;<br \\/>&nbsp;&nbsp;margin:&nbsp;0;<br \\/>&nbsp;&nbsp;padding:&nbsp;10px&nbsp;0&nbsp;0&nbsp;0;<br \\/>&nbsp;&#125;<br \\/><br \\/>&nbsp;dl.forms&nbsp;dd.help&nbsp;&#123;<br \\/>&nbsp;&nbsp;clear:&nbsp;left;<br \\/>&nbsp;&nbsp;padding-top:&nbsp;2px;<br \\/>&nbsp;&nbsp;font-size:&nbsp;90%;<br \\/>&nbsp;&nbsp;color:&nbsp;#999;<br \\/>&nbsp;&#125;<br \\/><br \\/>&nbsp;dl.forms&nbsp;input,&nbsp;dl.forms&nbsp;textarea&nbsp;&#123;&nbsp;width:&nbsp;300px;&nbsp;&#125;<br \\/><br \\/>&nbsp;dl.forms&nbsp;dd.radio&nbsp;input&nbsp;&#123;&nbsp;width:&nbsp;auto;&nbsp;&#125;<br \\/><br \\/>&nbsp;dl.forms&nbsp;textarea&nbsp;&#123;&nbsp;height:&nbsp;150px;&nbsp;&#125;<br \\/><br \\/>&nbsp;.required&nbsp;&#123;<br \\/>&nbsp;&nbsp;color:&nbsp;#FF0000;<br \\/>&nbsp;&nbsp;font-weight:&nbsp;bold;<br \\/>&nbsp;&#125;&nbsp;\\n\\n<\\/code><\\/div>\\n\\n<p>I don\'t think I need to go step by step through that because it is pretty simple styling. I have <a href=\\\"http:\\/\\/trevordavis.net\\/play\\/cssforms\\/final\\/\\\">created the styled page<\\/a> for you to see.<\\/p>\\n\\n<p>I personally like forms that have the label and the input element on the same line, but that\'s just me. It is pretty flexible, try resizing the font two times. Still very readable. You could easily do the widths in ems or percentages; I just chose to use pixels since I don\'t have any parent element containing it.<\\/p>\\n\\n<p>Should be pretty good in all browsers, especially since we didn\'t do any crazy CSS. I know it looks good in FF, IE6 and IE7. I believe it works fine in Safari and Opera.<\\/p>\\n\\n<p>Obviously this isn\'t the be all and end all to styling forms with CSS. But it is something to start with. So, go out and make it better. But be sure to share what you have created.<\\/p>\",\"14\":{\"old_id\":{}}}}','2014-01-19 21:53:42','2014-08-08 19:32:33','2e546118-bb3a-4415-9c41-2efa0791ca2d',1),(527,298,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"orbcomm\",\"postDate\":1386705420,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>Building this site gave me the opportunity to build a site with <a href=\\\"http:\\/\\/buildwithcraft.com\\/\\\">Craft<\\/a>; something I had been itching to use on a project for some time. My role in the project was to build the front-end of the site, configure Craft, and then integrate the two. In building this site, I also created three Craft plugins: <a href=\\\"https:\\/\\/github.com\\/davist11\\/craft-bust\\\">Bust<\\/a>, <a href=\\\"https:\\/\\/github.com\\/davist11\\/craft-listing-section\\\">Listing Section<\\/a>, and <a href=\\\"https:\\/\\/github.com\\/davist11\\/craft-reroute\\\">Reroute<\\/a>.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:13','2014-08-08 19:32:33','195e4b4f-f523-43b3-a127-a36ede5686cd',1),(528,303,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"lansinoh\",\"postDate\":1381953660,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>I sure didn\\u2019t know it before I started the project, but Lansinoh is one of the leaders in the breastfeeding industry. Since mobile accounted for 47% of visits, building a site to adapt to any device was a must. My role in the project was to build the front-end of the site and integrate with ExpressionEngine, which included ecommerce, user submission forms, and a store finder. This was probably the most complex ExpressionEngine site that I have built to date.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:13','2014-08-08 19:32:33','29fc829d-fc4a-4ac4-a5f0-2c2b17c875a7',1),(529,305,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"nea\",\"postDate\":1381786560,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>NEA is a leading a leading global venture capital firm who came to Viget to redesign their website. We rebuilt the site to adapt to whatever size screen it is being viewed on, and my role was to build the front-end of the site and integrate into ExpressionEngine.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:13','2014-08-08 19:32:33','b3f480dd-9d32-414d-a137-a82dc69a34e2',1),(530,306,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"wwf\",\"postDate\":1355946341,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>I had been itching to finally utilize responsive design on a client project, and the World Wildlife Fund presented that opportunity. The site is built on Ruby on Rails, and my role was to build the site with HTML, CSS, JavaScript, and Ruby on Rails views.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:13','2014-08-08 19:32:33','c8e07348-2bf8-4798-9ad8-9726b3a4ffd4',1),(531,307,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"aiga-continuum-fund\",\"postDate\":1339860129,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>The AIGA Design Continuum Fund is a yearly scholarship awarded to a local design student. We took on this project as pro-bono to support the local design community, and my role was to build the front-end of the site and to integrate into ExpressionEngine.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:13','2014-08-08 19:32:33','2aa55838-e5b1-4fdf-85dd-acc5caa5bed4',1),(532,308,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"carr-workplaces\",\"postDate\":1339860075,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>We (Viget) had originally built Carr&rsquo;s site many years ago. We had the opportunity to redesign it and implement a new CMS. My role in the project was to help a little with building some pieces of the front-end, but my main role was to implement the site in ExpressionEngine, which included custom add-on development.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:13','2014-08-08 19:32:33','f6b233a3-b66f-459a-8e69-65c210883689',1),(533,309,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"viget\",\"postDate\":1339860055,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>After four years and a few failed attempts, we finally made it a point to redo the <strong>Viget<\\/strong> website. Our old design served us well, but it was time to step it up to the next level. I was able to step in and implement the ExpressionEngine piece of the site, which included creating custom add-ons as well.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:13','2014-08-08 19:32:33','eaa244c6-723f-4722-adf0-e6f92cc7bebe',1),(534,310,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"nms\",\"postDate\":1339859979,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>New Media Strategies partnered with us (Viget) to recreate their web presence. They were looking for something new and different. My role on the project was to build the front-end, which included some light canvas work, and to implement the site into ExpressionEngine, which included custom add-on development.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:14','2014-08-08 19:32:34','30edded8-eefe-4268-ac90-899a8cbd3dcd',1),(535,311,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"ultimat-vodka\",\"postDate\":1339859931,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>Ultimat Vodka wanted a different type of experience for their site, so I utilized AJAX to give the site a more streamlined experience. I also had to create an age blocker so that only people 18 years and older were allowed to access the site. My role in the project was to build the front-end and to complete the ExpressionEngine integration.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:14','2014-08-08 19:32:34','913ad05e-ebbd-40d6-b209-f188fa03c9aa',1),(536,312,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"rumble-games\",\"postDate\":1339859918,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>Rumble is an online gaming company that needed some help from us to build their marketing site. My role was to build the front-end with HTML, CSS, &amp; JS, and then pass the build-out onto another Front-End Developer to finish the ExpressionEngine integration.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:14','2014-08-08 19:32:34','8d99160f-91c3-47f9-8bfe-0f3f872306fa',1),(537,313,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"team-viget\",\"postDate\":1313254069,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>Our <a href=\\\"http:\\/\\/v1.teamviget.com\\/\\\">existing Team Viget site<\\/a> was out of date and was mainly focused on bringing new designers to Viget, and we decided that it was time to make it reflect <em>all<\\/em> of Viget. My role in the project was to build it with HTML & CSS, and to code the JavaScript interactions. Then, I implemented into ExpressionEngine so others could easily add stories. This site works best in Webkit browsers because we were able to take advantage of a lot of experimental properties.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:14','2014-08-08 19:32:34','1c2ded92-794b-43ea-bbd5-2e073e013fe1',1),(538,314,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"puma\",\"postDate\":1312413047,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>After building many smaller sub-sites, we (Viget) were finally able to tackle puma.com itself. This required uniting many of those sub-sites we had already build into new standardized templates that would be uniquely &ldquo;skinned&rdquo; for each &ldquo;category&rdquo; site. My role included collaborating very closely with UX &amp; Design, HTML, CSS, and JavaScript.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:14','2014-08-08 19:32:34','4cb9ba46-0273-45c2-887d-19fae62bc1c2',1),(539,315,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"puma-golf\",\"postDate\":1299620983,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>To continue our work with PUMA, I built the Golf site. This was similar to some of the other PUMA sites that I have built, except for a few new pieces here and there. My role in this project was to build-out the many pages and to implement the JavaScript interactions throughout the site. I also worked with our developers to integrate with our custom Ruby on Rails code.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:14','2014-08-08 19:32:34','d742dc37-9fd0-46fe-bfa8-40f78d3a7133',1),(540,316,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"puma-clever-little-bag\",\"postDate\":1291153710,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>PUMA spent a lot of time and money developing a new shoebox that would reduce its environmental impact. The result was a cool concept of a Clever Little Bag. We built a special page to help introduce the bag to the world. My role in this project was to build-out the site and add in the JavaScript functionality.<\\/p>\\n<p>The one really fun feature was the slide deck of the &ldquo;big plans&rdquo; that can be seen all the way at the end of the page. I also built a cross browser <a href=\\\"http:\\/\\/www.viget.com\\/inspire\\/custom-file-inputs-with-a-bit-of-jquery\\/\\\">custom file input<\\/a> for users to upload their photos.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:14','2014-08-08 19:32:34','cd70a692-5923-4f00-952e-968c1643480a',1),(541,317,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"puma-time\",\"postDate\":1287850610,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>To continue in our engagement with PUMA, we redesigned and relaunched the PUMA time website. I didn&rsquo;t even know that PUMA sold watches until we started this site! My role in this project was to build-out the many pages and to implement the JavaScript interactions throughout the site. I also worked with our developers to integrate with our custom Ruby on Rails code.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:14','2014-08-08 19:32:34','77a62d64-f3c5-4855-beeb-ea8a47ef8aa5',1),(542,318,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"bolt-collection\",\"postDate\":1278708308,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>To announce the launch of Bolt&rsquo;s new clothing line, we launched a one-page site that tracks Bolt&rsquo;s progress in races throughout the summer. My role in this project was to build-out the site with HTML &amp; CSS and add in a lot of the JavaScript functionality. I also worked with our developers to integrate with out custom Ruby on Rails system.<\\/p>\\n\\n<p>Building this site really made me want to buy some of the gear because it looks awesome.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:14','2014-08-08 19:32:34','3ca2284e-66ef-47a3-8d16-58e2f60613dd',1),(543,319,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"puma-city\",\"postDate\":1276121750,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>In honor of the 2010 World Cup, we built a special one-page site for the PUMA City store in New York. The PUMA City store is a temporary store that is setup with shipping containers. My role in this project was to build-out the site and add in a lot of JavaScript functionality. I also had to work with my developers to integrate with the Ruby on Rails code.<\\/p>\\n\\n<p>This was the longest page I have ever built!<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:14','2014-08-08 19:32:34','3ff845bc-1dea-4305-864f-c33cfae85719',1),(544,320,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"easter-seals-nc\",\"postDate\":1275743255,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>For my first project while working for Viget Labs, I built the Easter Seals UCP North Carolina website. My role in the project was to build-out the design and implement the site using ExpressionEngine. I also added in some JavaScript functionality on the homepage and on the individual service pages.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:14','2014-08-08 19:32:34','086d6539-1bde-4e33-9701-01168e13c522',1),(545,321,3,1,1,NULL,'{\"authorId\":1,\"title\":{\"title\":{}},\"slug\":\"puma-running\",\"postDate\":1273617993,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>The PUMA Running site was the first in a long engagement with PUMA. My role in this project was to build-out the many pages and to implement a lot of JavaScript interaction throughout the site. I also worked with our developers to integrate with our custom Ruby on Rails code.<\\/p>\",\"14\":0,\"6\":[],\"4\":{\"website\":{}}}}','2014-01-22 04:03:14','2014-08-08 19:32:34','66d6382f-c3aa-4407-975b-2b811aa3001b',1),(570,4,5,1,7,NULL,'{\"authorId\":null,\"title\":\"About Me\",\"slug\":\"about\",\"postDate\":1390017311,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>\\r\\n\\tDesign and back-end development are essential for the web, but the exciting area where they meet is front-end development. As a front-end developer, I get to take a design \\u2013 something that\\u2019s beautiful but static \\u2013 and turn it into an interface, where its components become tools for unique experiences on the web.<\\/p><p>\\r\\n\\tSo much is at stake in this stage! The best design can be mangled in the hands of someone uninterested or unwilling to juggle the complexities of cross-browser differences. The best deployment can cause problems down the road if someone didn\\u2019t build it to be reusable and adaptable. But a great front-end developer brings designs to the fullness of their intention and sets up a webpage to be flexible and successful years into the future.<\\/p><p>\\r\\n\\tI use many tools to make websites, but these are my favorites:<\\/p><ul>\\r\\n\\t<li><strong>HTML<\\/strong> &mdash; Semantic markup FTW!<\\/li>\\t<li><strong>CSS<\\/strong> &mdash; Presentation Layer Perfection<\\/li>\\t<li><strong>JavaScript<\\/strong> &mdash; The little scripting language that could<\\/li>\\t<li><strong>Craft<\\/strong> &mdash; The fresh, new take on content management<\\/li>\\t<li><strong>ExpressionEngine<\\/strong> &mdash; The explosively powerful CMS<\\/li><\\/ul><p>\\r\\n\\tI work at <a href=\\\"http:\\/\\/viget.com\\/\\\">Viget<\\/a> in Falls Church, VA and also do <a href=\\\"\\/work\\/\\\">freelance projects<\\/a>. I\\u2019m a demon at basketball, I love movies, and I hope I may be so bold as to claim to be a pretty spectacular cook. I enjoy spending my free time with my adorable puppy.<\\/p>\",\"11\":{\"13\":{\"type\":\"fact\",\"enabled\":\"1\",\"fields\":{\"fact\":\"My Mario Kart character of choice is King Boo riding the Shooting Star.\",\"image\":[\"10\"]}},\"14\":{\"type\":\"fact\",\"enabled\":\"1\",\"fields\":{\"fact\":\"I have dunked a basketball in a pick-up game before.\",\"image\":[\"6\"]}},\"15\":{\"type\":\"fact\",\"enabled\":\"1\",\"fields\":{\"fact\":\"If I weren\\u2019t a front-end developer, I\\u2019d secretly want to be a chef.\",\"image\":[\"7\"]}},\"16\":{\"type\":\"fact\",\"enabled\":\"1\",\"fields\":{\"fact\":\"I haven\\u2019t had soda since 8th grade.\",\"image\":[\"12\"]}},\"17\":{\"type\":\"fact\",\"enabled\":\"1\",\"fields\":{\"fact\":\"Unlike everyone else in the web world, I don\\u2019t drink coffee.\",\"image\":[\"9\"]}}},\"1\":\"So you want to find out more about me?\"}}','2014-05-27 15:55:57','2014-08-08 19:32:34','855cc061-97a9-4d47-a1ae-d3298c6307f1',1),(571,754,3,1,1,NULL,'{\"typeId\":null,\"authorId\":\"1\",\"title\":\"GoPole\",\"slug\":\"gopole\",\"postDate\":1410550860,\"expiryDate\":null,\"enabled\":0,\"fields\":[]}','2014-09-12 19:41:24','2014-09-12 19:41:24','7cffa954-ffcc-478f-bd52-9bf0d61e0c0e',1),(572,754,3,1,2,'Published draft “Draft 1”.','{\"typeId\":null,\"authorId\":\"1\",\"title\":\"GoPole\",\"slug\":\"gopole\",\"postDate\":1410550860,\"expiryDate\":null,\"enabled\":0,\"fields\":{\"2\":\"<p>We migrated the old GoPole site off of ExpressionEngine and into a Craft and Shopify combo. My role was to configure and integrate Craft and to integrate with Shopify as well. I built a&nbsp;<a href=\\\"https:\\/\\/github.com\\/davist11\\/craft-shopify\\\">Craft plugin that integrates with Shopify<\\/a> as well as some custom development work to integrate the forms with Zendesk.<\\/p>\",\"5\":[\"755\"],\"6\":{\"new1\":{\"type\":\"bigScreenshot\",\"enabled\":\"1\",\"fields\":{\"image\":[\"750\"],\"caption\":\"Homepage\"}},\"new2\":{\"type\":\"bigScreenshot\",\"enabled\":\"1\",\"fields\":{\"image\":[\"751\"],\"caption\":\"Retailer Locator\"}},\"new3\":{\"type\":\"bigScreenshot\",\"enabled\":\"1\",\"fields\":{\"image\":[\"752\"],\"caption\":\"Products\"}},\"new4\":{\"type\":\"bigScreenshot\",\"enabled\":\"1\",\"fields\":{\"image\":[\"753\"],\"caption\":\"Returns form\"}}},\"15\":[\"299\",\"749\"],\"16\":\"\",\"4\":\"https:\\/\\/www.gopole.com\\/\"}}','2014-09-12 19:44:48','2014-09-12 19:44:48','e7c00799-1e26-437a-8cf7-f4930c21eeaa',1),(575,760,3,1,1,NULL,'{\"typeId\":null,\"authorId\":\"1\",\"title\":\"Pointless Corp\",\"slug\":\"pointless-corp\",\"postDate\":null,\"expiryDate\":null,\"enabled\":0,\"fields\":[]}','2014-09-12 19:55:20','2014-09-12 19:55:20','6831f248-b626-4b5b-b95e-5a6520eec79f',1),(576,760,3,1,2,'Published draft “Draft 1”.','{\"typeId\":null,\"authorId\":\"1\",\"title\":\"Pointless Corp\",\"slug\":\"pointless-corp\",\"postDate\":1410553125,\"expiryDate\":null,\"enabled\":1,\"fields\":{\"2\":\"<p>We relaunched the Pointless Corp website, which is the innovation lab at Viget. The site is now a place for us to showcase side projects and experiments. My role was the build the site and implement with Craft.<\\/p>\",\"5\":[\"767\"],\"6\":{\"new1\":{\"type\":\"bigScreenshot\",\"enabled\":\"1\",\"fields\":{\"image\":[\"764\"],\"caption\":\"Homepage\"}},\"new2\":{\"type\":\"bigScreenshot\",\"enabled\":\"1\",\"fields\":{\"image\":[\"766\"],\"caption\":\"PowWow Project Page\"}},\"new3\":{\"type\":\"smallScreenshot\",\"enabled\":\"1\",\"fields\":{\"image\":[\"763\"],\"caption\":\"Small Screen Homepage\"}},\"new4\":{\"type\":\"smallScreenshot\",\"enabled\":\"1\",\"fields\":{\"image\":[\"765\"],\"caption\":\"Small Screen PowWow Project Page\"}},\"new5\":{\"type\":\"smallScreenshot\",\"enabled\":\"1\",\"fields\":{\"image\":[\"761\"],\"caption\":\"Small Screen Baby Bookie Project Page\"}},\"new6\":{\"type\":\"bigScreenshot\",\"enabled\":\"1\",\"fields\":{\"image\":[\"762\"],\"caption\":\"Baby Bookie Project Page\"}}},\"15\":[\"301\",\"300\",\"302\",\"299\"],\"16\":\"\",\"4\":\"http:\\/\\/pointlesscorp.com\\/\"}}','2014-09-12 20:18:46','2014-09-12 20:18:46','5e37e9ad-05d4-463a-af41-f1242c1775ec',1),(577,774,3,1,1,NULL,'{\"typeId\":null,\"authorId\":\"1\",\"title\":\"VOA\",\"slug\":\"voa\",\"postDate\":null,\"expiryDate\":null,\"enabled\":0,\"fields\":[]}','2016-01-22 03:04:33','2016-01-22 03:04:33','2e20648a-6d8c-4455-8acd-04ebea57ade5',1),(578,775,3,1,1,NULL,'{\"typeId\":null,\"authorId\":\"1\",\"title\":\"American Farmland Trust\",\"slug\":\"american-farmland-trust\",\"postDate\":null,\"expiryDate\":null,\"enabled\":0,\"fields\":[]}','2016-01-22 03:05:04','2016-01-22 03:05:04','f0372566-2eba-4a6f-84f7-47f2634f326c',1),(579,776,3,1,1,NULL,'{\"typeId\":null,\"authorId\":\"1\",\"title\":\"PPS Plus\",\"slug\":\"pps-plus\",\"postDate\":null,\"expiryDate\":null,\"enabled\":0,\"fields\":[]}','2016-01-22 03:05:25','2016-01-22 03:05:25','c6ddd2ee-cd24-4567-b9ff-21ed4ccbc286',1),(601,777,3,1,1,'','{\"typeId\":null,\"authorId\":\"1\",\"title\":\"Open Space Institute\",\"slug\":\"open-space-institute\",\"postDate\":1503535020,\"expiryDate\":null,\"enabled\":0,\"newParentId\":null,\"fields\":{\"2\":\"\",\"5\":\"\",\"6\":\"\",\"15\":[\"299\",\"301\",\"300\",\"302\"],\"16\":\"\",\"4\":\"https:\\/\\/www.openspaceinstitute.org\\/\"}}','2017-08-24 00:37:05','2017-08-24 00:37:05','4a5e6b7e-a58a-4847-9444-376f7c7c254d',1),(602,778,3,1,1,'','{\"typeId\":null,\"authorId\":\"1\",\"title\":\"Lully sleep\",\"slug\":\"lully-sleep\",\"postDate\":null,\"expiryDate\":null,\"enabled\":0,\"newParentId\":null,\"fields\":{\"2\":\"\",\"5\":\"\",\"6\":\"\",\"15\":[\"749\",\"301\",\"300\",\"302\"],\"16\":\"\",\"4\":\"https:\\/\\/www.lullysleep.com\\/\"}}','2017-08-24 00:40:51','2017-08-24 00:40:51','0b07132a-b5fc-40b8-aef4-5090ea48ce10',1),(604,779,3,1,1,'','{\"typeId\":null,\"authorId\":\"1\",\"title\":\"Lupus Resource Center\",\"slug\":\"lupus-resource-center\",\"postDate\":null,\"expiryDate\":null,\"enabled\":0,\"newParentId\":null,\"fields\":{\"2\":\"\",\"5\":\"\",\"6\":\"\",\"15\":[\"299\",\"301\",\"300\",\"302\"],\"16\":\"\",\"4\":\"http:\\/\\/resources.lupus.org\\/\"}}','2017-08-24 00:42:11','2017-08-24 00:42:11','3534883b-b742-41f8-82c9-230021f23902',1),(605,780,3,1,1,'','{\"typeId\":null,\"authorId\":\"1\",\"title\":\"PBS Kids Development Tracker\",\"slug\":\"pbs-kids-development-tracker\",\"postDate\":null,\"expiryDate\":null,\"enabled\":0,\"newParentId\":null,\"fields\":{\"2\":\"\",\"5\":\"\",\"6\":\"\",\"15\":[\"299\",\"301\",\"300\",\"302\"],\"16\":\"\",\"4\":\"http:\\/\\/www.pbs.org\\/parents\\/child-development\"}}','2017-08-24 00:43:50','2017-08-24 00:43:50','09127045-a5e4-4f00-8d3a-f659240faca4',1),(606,781,3,1,1,'','{\"typeId\":null,\"authorId\":\"1\",\"title\":\"BDI\",\"slug\":\"bdi\",\"postDate\":null,\"expiryDate\":null,\"enabled\":0,\"newParentId\":null,\"fields\":{\"2\":\"\",\"5\":\"\",\"6\":\"\",\"15\":[\"299\",\"301\",\"300\",\"302\"],\"16\":\"\",\"4\":\"https:\\/\\/www.bdiusa.com\\/\"}}','2017-08-24 00:49:28','2017-08-24 00:49:28','066c7d10-f502-49d7-bb47-ff6fe5d0a147',1),(607,782,3,1,1,'','{\"typeId\":null,\"authorId\":\"1\",\"title\":\"NMCRS\",\"slug\":\"nmcrs\",\"postDate\":null,\"expiryDate\":null,\"enabled\":0,\"newParentId\":null,\"fields\":{\"2\":\"\",\"5\":\"\",\"6\":\"\",\"15\":[\"299\",\"301\",\"300\",\"302\"],\"16\":\"\",\"4\":\"\"}}','2017-08-24 00:50:44','2017-08-24 00:50:44','b1fbd82e-071d-4f5e-93f3-8790df679eb9',1),(608,783,3,1,1,'','{\"typeId\":null,\"authorId\":\"1\",\"title\":\"Idea\",\"slug\":\"idea\",\"postDate\":null,\"expiryDate\":null,\"enabled\":0,\"newParentId\":null,\"fields\":{\"2\":\"\",\"5\":\"\",\"6\":\"\",\"15\":[\"299\",\"301\",\"300\",\"302\"],\"16\":\"\",\"4\":\"\"}}','2017-08-24 00:51:04','2017-08-24 00:51:04','15750487-cbbd-4c7d-b592-6992179823a3',1),(609,784,3,1,1,'','{\"typeId\":null,\"authorId\":\"1\",\"title\":\"Bethesda Creation Club\",\"slug\":\"bethesda-creation-club\",\"postDate\":null,\"expiryDate\":null,\"enabled\":0,\"newParentId\":null,\"fields\":{\"2\":\"\",\"5\":\"\",\"6\":\"\",\"15\":[\"299\",\"301\",\"300\",\"302\"],\"16\":\"\",\"4\":\"https:\\/\\/creationclub.bethesda.net\\/en\"}}','2017-08-24 01:01:24','2017-08-24 01:01:24','d92f5ccd-e69d-40c6-9d43-bf9d9eee1825',1),(610,785,3,1,1,'','{\"typeId\":null,\"authorId\":\"1\",\"title\":\"Lenovo Blogs\",\"slug\":\"lenovo-blogs\",\"postDate\":null,\"expiryDate\":null,\"enabled\":0,\"newParentId\":null,\"fields\":{\"2\":\"\",\"5\":\"\",\"6\":\"\",\"15\":[\"304\",\"301\",\"300\",\"302\"],\"16\":\"\",\"4\":\"http:\\/\\/blog.lenovo.com\\/\"}}','2017-08-24 01:04:52','2017-08-24 01:04:52','f36c878c-3ae0-4463-a2b1-bcf8e733a27a',1),(701,853,7,1,4,'','{\"typeId\":\"10\",\"authorId\":null,\"title\":\"Homepage\",\"slug\":\"homepage\",\"postDate\":1507133386,\"expiryDate\":null,\"enabled\":true,\"newParentId\":null,\"fields\":{\"18\":\"<p>To be more specific: I’m a senior front-end developer working at <a href=\\\"https://www.viget.com\\\">Viget</a>, and I do freelance work on the side. <a href=\\\"%7B%7B%20url(\'contact\')%20%7D%7D\\\"></a><a href=\\\"{entry:5:url}\\\">Get in touch</a> if you have a project that you think I can help with.</p>\\n<p>Below are four websites that I have built, but you can also <a href=\\\"/portfolio\\\">see all of the projects</a> I’ve worked on.</p>\",\"17\":\"I’m Trevor Davis;<br>\\r\\nI Build Things on the Internet\"}}','2018-02-24 02:47:32','2018-02-24 02:47:32','09e21b93-434a-4072-bc1d-04132d0c2b75',1);
commit;

--
-- Dumping data for table `craft_fieldgroups`
--

set autocommit=0;
INSERT INTO `craft_fieldgroups` VALUES (1,'Default','2014-01-18 03:44:25','2014-01-18 03:44:25',NULL,'189496fc-de12-436c-8ea6-c574d0205f95'),(2,'Work','2014-01-18 04:08:03','2014-01-18 04:08:08',NULL,'ab3481e2-2388-412a-af25-823f9b58a9df'),(3,'About','2014-01-18 21:32:18','2014-01-18 21:32:18',NULL,'ca826883-1c82-4ed3-bdd5-2460071b92bf'),(4,'Blog','2014-01-19 21:28:35','2014-01-19 21:28:35',NULL,'302e0a0c-a5f4-46e5-9930-3eafc6b95aa8'),(5,'Homepage','2017-10-04 16:06:05','2017-10-04 16:06:05',NULL,'35471743-3b5f-42b7-8680-62b2d9a6e46e');
commit;

--
-- Dumping data for table `craft_fieldlayoutfields`
--

set autocommit=0;
INSERT INTO `craft_fieldlayoutfields` VALUES (89,19,32,7,1,1,'2017-09-07 21:53:27','2017-09-07 21:53:27','d3746468-43ce-4059-89e6-4a44dae95506'),(90,19,32,8,1,2,'2017-09-07 21:53:27','2017-09-07 21:53:27','8ea9740e-f537-4a61-a3fa-0b2b9809cfff'),(91,20,33,9,1,1,'2017-09-07 21:53:27','2017-09-07 21:53:27','0df19113-718d-4884-ae66-03a6a81b60cb'),(92,20,33,10,1,2,'2017-09-07 21:53:27','2017-09-07 21:53:27','c1df6c38-c0d7-4d10-bed1-f53a26060002'),(100,22,38,13,1,2,'2019-10-09 15:56:06','2019-10-09 15:56:06','b48df6cd-522c-40a4-8b8d-3076621755ea'),(101,22,38,12,1,1,'2019-10-09 15:56:06','2019-10-09 15:56:06','a5af3c67-5852-46d5-b49e-46f790cb0c3a'),(118,35,46,2,0,1,'2020-08-10 21:12:19','2020-08-10 21:12:19','4d9c044a-133f-4f68-b708-405c3066fc2f'),(119,35,46,4,0,2,'2020-08-10 21:12:19','2020-08-10 21:12:19','f37c358a-94af-4271-8b51-fa2a01dc90d1'),(120,35,46,5,1,3,'2020-08-10 21:12:19','2020-08-10 21:12:19','e7dea39e-43d7-458f-bf54-2cfbba229f95'),(121,35,46,6,0,4,'2020-08-10 21:12:19','2020-08-10 21:12:19','bb5e10b3-217c-4097-9a83-14e98b6d7a41'),(122,35,46,16,0,5,'2020-08-10 21:12:19','2020-08-10 21:12:19','8b3b7044-75e2-4daf-bd8f-0458ac6d44b2'),(123,35,46,15,1,6,'2020-08-10 21:12:19','2020-08-10 21:12:19','a2e1ef85-42a4-4ff0-89bd-c0ac71b6c918'),(124,38,47,17,1,1,'2020-08-10 21:12:19','2020-08-10 21:12:19','a0c1dc3c-7c1f-4275-979e-6b2e323d2583'),(125,38,47,18,1,2,'2020-08-10 21:12:19','2020-08-10 21:12:19','b6feee1f-b3ab-450e-a143-f89b1d7126fa'),(126,23,48,11,1,1,'2020-08-10 21:12:19','2020-08-10 21:12:19','77cd0dc0-770f-4087-a8b3-04604da6d7d6'),(127,11,49,1,1,1,'2020-08-10 21:12:19','2020-08-10 21:12:19','25e79876-851d-4e8a-8f84-e71052820af3'),(131,36,52,2,1,1,'2020-08-10 21:12:19','2020-08-10 21:12:19','07e10c48-1a31-4cc7-9298-57c5b074f903'),(132,36,52,3,0,2,'2020-08-10 21:12:19','2020-08-10 21:12:19','7d4852c2-6f50-4f8e-8260-a4280b793e57'),(133,36,52,4,1,3,'2020-08-10 21:12:19','2020-08-10 21:12:19','bb915d84-863d-42dd-940c-9cc12ae291a4'),(146,28,59,2,0,1,'2023-01-26 15:20:29','2023-01-26 15:20:29','f0eee112-e071-40b6-acaf-c9519a61f303'),(147,28,59,20,0,2,'2023-01-26 15:20:29','2023-01-26 15:20:29','f1c321ab-3ace-4e59-80c5-6d689a1618d6'),(148,28,60,19,0,0,'2023-01-26 15:20:29','2023-01-26 15:20:29','70d49045-c55f-4d4c-b6e4-1c1f96ef83fd'),(149,28,60,3,0,1,'2023-01-26 15:20:29','2023-01-26 15:20:29','d29af1b2-e985-4ad5-b350-c5f4b4bc1b4f'),(150,28,61,14,0,0,'2023-01-26 15:20:29','2023-01-26 15:20:29','06ebd87b-71c8-46bd-a1e3-152a16740b4c'),(154,40,64,23,1,0,'2023-01-26 15:20:29','2023-01-26 15:20:29','469db780-265f-407a-948a-d5dbe21e51c0'),(155,39,65,21,1,0,'2023-01-26 15:20:30','2023-01-26 15:20:30','cffdb3f1-b0b7-45fe-8543-7d2dee704fa4'),(156,39,65,22,1,1,'2023-01-26 15:20:30','2023-01-26 15:20:30','195da343-b2a9-4293-a4a5-297202bb20a3');
commit;

--
-- Dumping data for table `craft_fieldlayouts`
--

set autocommit=0;
INSERT INTO `craft_fieldlayouts` VALUES (11,'craft\\elements\\Entry','2014-01-18 04:01:14','2014-01-18 04:01:14',NULL,'436df67f-0935-4908-90d5-2d569ad273d6'),(19,'craft\\elements\\MatrixBlock','2014-01-18 04:24:22','2017-09-07 21:53:27',NULL,'c63f2cf0-7ba7-43e6-9fd1-9281cfd131d0'),(20,'craft\\elements\\MatrixBlock','2014-01-18 04:24:22','2017-09-07 21:53:27',NULL,'2f9a99da-4faa-427c-a188-e1ff5b103c7e'),(22,'craft\\elements\\MatrixBlock','2014-01-18 21:39:51','2017-09-29 20:43:21',NULL,'db7c0b4d-ef92-4c13-aaef-5ef534843bfe'),(23,'craft\\elements\\Entry','2014-01-18 21:40:45','2017-09-12 15:58:43',NULL,'99059539-4f95-4dea-930e-5c2b7dead6c2'),(26,'craft\\elements\\Tag','2014-01-19 12:50:50','2014-01-19 12:50:50',NULL,'53189d80-16a7-4b32-8b54-1b946051f3f7'),(28,'craft\\elements\\Entry','2014-01-19 21:29:35','2017-09-06 21:32:10',NULL,'f94818d8-1a24-4067-8f6b-f797c4d7d51c'),(30,'craft\\elements\\Tag','2014-01-22 03:49:18','2014-01-22 03:49:18',NULL,'9e28e4a3-dd7b-400a-8bd9-4e2791832640'),(35,'craft\\elements\\Entry','2014-01-22 04:08:35','2017-09-07 21:50:54',NULL,'c3587aec-a295-4fa8-8047-b04cecaf2ee3'),(36,'craft\\elements\\Entry','2017-09-06 20:03:41','2017-09-06 20:03:57',NULL,'28ec4028-bc9f-45ca-81e7-c209d4fea073'),(37,'craft\\elements\\Asset','2017-09-07 21:22:53','2017-09-07 21:22:53',NULL,'ce5e3e15-6cff-4a57-a11e-c892bae10833'),(38,'craft\\elements\\Entry','2017-10-04 16:05:46','2017-10-04 16:07:36',NULL,'b04fd10c-9eac-477d-a9f1-84dd9ceaa180'),(39,'craft\\elements\\MatrixBlock','2023-01-26 15:20:29','2023-01-26 15:20:29',NULL,'b327cfd5-b2e9-4811-8008-024a5babcedb'),(40,'craft\\elements\\MatrixBlock','2023-01-26 15:20:29','2023-01-26 15:20:29',NULL,'9b92c3d2-36af-4c5a-b509-d5041d63b668'),(41,'craft\\elements\\Asset','2024-02-09 15:44:27','2024-02-09 15:44:27',NULL,'44aa0105-2f52-4206-a03f-4530107f0b40'),(42,'craft\\elements\\Asset','2024-02-09 15:44:27','2024-02-09 15:44:27',NULL,'17e1ad8d-df37-40bd-bbac-c6d4bd840552'),(43,'craft\\elements\\Asset','2024-02-09 15:44:27','2024-02-09 15:44:27',NULL,'4197aee2-23b0-4c3c-9852-32aa23438ae3');
commit;

--
-- Dumping data for table `craft_fieldlayouttabs`
--

set autocommit=0;
INSERT INTO `craft_fieldlayouttabs` VALUES (23,26,'Content',NULL,1,'2016-03-10 21:28:08','2016-03-10 21:28:08','607f51f2-bd6a-4cb4-a24b-e1a4624440cc'),(24,30,'Content',NULL,1,'2016-03-10 21:28:08','2016-03-10 21:28:08','27ccec1b-bbc5-444e-9411-4927ab2c4df9'),(32,19,'Content',NULL,1,'2017-09-07 21:53:27','2017-09-07 21:53:27','40b18add-52d2-41c4-a3ff-c8407eeb5dbb'),(33,20,'Content',NULL,1,'2017-09-07 21:53:27','2017-09-07 21:53:27','3bb757a2-42d4-40c6-b238-1bced3738e4b'),(38,22,'Content',NULL,1,'2019-10-09 15:56:06','2019-10-09 15:56:06','b660d460-d382-4ac8-817e-297629dbb77d'),(46,35,'Content','[{\"type\":\"craft\\\\fieldlayoutelements\\\\EntryTitleField\",\"autocomplete\":false,\"class\":null,\"size\":null,\"name\":null,\"autofocus\":false,\"autocorrect\":true,\"autocapitalize\":true,\"disabled\":false,\"readonly\":false,\"title\":null,\"placeholder\":null,\"step\":null,\"min\":null,\"max\":null,\"requirable\":false,\"id\":null,\"containerAttributes\":[],\"inputContainerAttributes\":[],\"labelAttributes\":[],\"orientation\":null,\"label\":\"Title\",\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":false,\"width\":100},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":false,\"width\":100,\"fieldUid\":\"c9565faa-419b-43e5-ab0f-c9a02beda481\"},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":false,\"width\":100,\"fieldUid\":\"8ae4cb51-d238-4568-ad2b-47852b236a00\"},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":true,\"width\":100,\"fieldUid\":\"469b6f23-8053-4a7c-8b0e-366f16e9b5fe\"},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":false,\"width\":100,\"fieldUid\":\"a4dd4a24-4acd-406d-90a1-3e7da6d69f98\"},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":false,\"width\":100,\"fieldUid\":\"21cf9390-aef2-4398-bd49-327d4e28969b\"},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":true,\"width\":100,\"fieldUid\":\"dc5aa5eb-7632-41e6-892b-31ef3e39f2ac\"}]',1,'2020-08-10 21:12:19','2020-08-10 21:12:19','4c335651-7529-4f08-8743-7305c03309bd'),(47,38,'Content','[{\"type\":\"craft\\\\fieldlayoutelements\\\\EntryTitleField\",\"autocomplete\":false,\"class\":null,\"size\":null,\"name\":null,\"autofocus\":false,\"autocorrect\":true,\"autocapitalize\":true,\"disabled\":false,\"readonly\":false,\"title\":null,\"placeholder\":null,\"step\":null,\"min\":null,\"max\":null,\"requirable\":false,\"id\":null,\"containerAttributes\":[],\"inputContainerAttributes\":[],\"labelAttributes\":[],\"orientation\":null,\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":false,\"width\":100},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":true,\"width\":100,\"fieldUid\":\"1f34cfc8-2625-42e7-be74-20caf0022f56\"},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":true,\"width\":100,\"fieldUid\":\"b1ca51a7-b7ef-4093-b88f-3c7606da7479\"}]',1,'2020-08-10 21:12:19','2020-08-10 21:12:19','52e51bea-bba6-4f1f-ad38-f2011f942739'),(48,23,'Content','[{\"type\":\"craft\\\\fieldlayoutelements\\\\EntryTitleField\",\"autocomplete\":false,\"class\":null,\"size\":null,\"name\":null,\"autofocus\":false,\"autocorrect\":true,\"autocapitalize\":true,\"disabled\":false,\"readonly\":false,\"title\":null,\"placeholder\":null,\"step\":null,\"min\":null,\"max\":null,\"requirable\":false,\"id\":null,\"containerAttributes\":[],\"inputContainerAttributes\":[],\"labelAttributes\":[],\"orientation\":null,\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":false,\"width\":100},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":true,\"width\":100,\"fieldUid\":\"0dc728e1-acf3-4466-bef6-5c3ea1b83eba\"}]',1,'2020-08-10 21:12:19','2020-08-10 21:12:19','a419516f-273f-42af-a978-5f09c9fdc3ec'),(49,11,'Content','[{\"type\":\"craft\\\\fieldlayoutelements\\\\EntryTitleField\",\"autocomplete\":false,\"class\":null,\"size\":null,\"name\":null,\"autofocus\":false,\"autocorrect\":true,\"autocapitalize\":true,\"disabled\":false,\"readonly\":false,\"title\":null,\"placeholder\":null,\"step\":null,\"min\":null,\"max\":null,\"requirable\":false,\"id\":null,\"containerAttributes\":[],\"inputContainerAttributes\":[],\"labelAttributes\":[],\"orientation\":null,\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":false,\"width\":100},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":true,\"width\":100,\"fieldUid\":\"4d3091ca-1425-4d3b-b19c-40db36c52f9f\"}]',1,'2020-08-10 21:12:19','2020-08-10 21:12:19','3d6fe5c9-7d49-4f92-9f70-0bea3727452d'),(52,36,'Content','[{\"type\":\"craft\\\\fieldlayoutelements\\\\EntryTitleField\",\"autocomplete\":false,\"class\":null,\"size\":null,\"name\":null,\"autofocus\":false,\"autocorrect\":true,\"autocapitalize\":true,\"disabled\":false,\"readonly\":false,\"title\":null,\"placeholder\":null,\"step\":null,\"min\":null,\"max\":null,\"requirable\":false,\"id\":null,\"containerAttributes\":[],\"inputContainerAttributes\":[],\"labelAttributes\":[],\"orientation\":null,\"label\":\"Title\",\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":false,\"width\":100},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":true,\"width\":100,\"fieldUid\":\"c9565faa-419b-43e5-ab0f-c9a02beda481\"},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":false,\"width\":100,\"fieldUid\":\"80edebac-113b-4d64-8aed-9288eda686a2\"},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":true,\"width\":100,\"fieldUid\":\"8ae4cb51-d238-4568-ad2b-47852b236a00\"}]',1,'2020-08-10 21:12:19','2020-08-10 21:12:19','ec9bcedb-e151-44d5-962c-4bc54ee8e754'),(59,28,'Content','[{\"type\":\"craft\\\\fieldlayoutelements\\\\EntryTitleField\",\"autocomplete\":false,\"class\":null,\"size\":null,\"name\":null,\"autocorrect\":true,\"autocapitalize\":true,\"disabled\":false,\"readonly\":false,\"title\":null,\"placeholder\":null,\"step\":null,\"min\":null,\"max\":null,\"requirable\":false,\"id\":null,\"containerAttributes\":[],\"inputContainerAttributes\":[],\"labelAttributes\":[],\"orientation\":null,\"label\":\"Title\",\"instructions\":null,\"tip\":null,\"warning\":null,\"width\":100},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":\"\",\"instructions\":\"\",\"tip\":null,\"warning\":null,\"required\":\"\",\"width\":100,\"fieldUid\":\"c9565faa-419b-43e5-ab0f-c9a02beda481\"},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":false,\"width\":100,\"fieldUid\":\"ecdfc639-cca4-41ac-8e03-5d6fbc25eeae\"}]',1,'2023-01-26 15:20:29','2023-01-26 15:20:29','987bae7f-cc4d-4d8c-ad8f-51f071bec1a1'),(60,28,'Settings','[{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":false,\"width\":100,\"fieldUid\":\"aa34b459-8563-4dd9-906f-ef23f39617cb\"},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":false,\"width\":100,\"fieldUid\":\"80edebac-113b-4d64-8aed-9288eda686a2\"}]',2,'2023-01-26 15:20:29','2023-01-26 15:20:29','71eaeb47-bd53-459f-adab-ae4aebd3393a'),(61,28,'Import','[{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":false,\"width\":100,\"fieldUid\":\"730ce647-6175-4483-94f0-bdceb48b2b5a\"}]',3,'2023-01-26 15:20:29','2023-01-26 15:20:29','b19497ac-3317-46aa-8091-c4ac91c096a0'),(64,40,'Content','[{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":true,\"width\":100,\"fieldUid\":\"7b9beed5-2970-4e8d-bbea-f8b99985ca8c\"}]',1,'2023-01-26 15:20:29','2023-01-26 15:20:29','7341b83e-869d-45b7-b03a-80644d3dd91c'),(65,39,'Content','[{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":true,\"width\":100,\"fieldUid\":\"bb415b06-180b-4bb1-9642-6f363fb2fdf0\"},{\"type\":\"craft\\\\fieldlayoutelements\\\\CustomField\",\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"required\":true,\"width\":100,\"fieldUid\":\"ca9ec65f-75c7-4315-9cd4-b7fcbf69bde0\"}]',1,'2023-01-26 15:20:30','2023-01-26 15:20:30','3e36ab79-b6ed-4df8-86cc-2d48fef142bd'),(72,43,'Content','[{\"type\":\"craft\\\\fieldlayoutelements\\\\AssetTitleField\",\"autocomplete\":false,\"class\":null,\"size\":null,\"name\":null,\"autocorrect\":true,\"autocapitalize\":true,\"disabled\":false,\"readonly\":false,\"title\":null,\"placeholder\":null,\"step\":null,\"min\":null,\"max\":null,\"requirable\":false,\"id\":null,\"containerAttributes\":[],\"inputContainerAttributes\":[],\"labelAttributes\":[],\"orientation\":null,\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"width\":100}]',1,'2024-02-09 15:44:27','2024-02-09 15:44:27','e02a9465-2087-4425-9db3-c3b78d30f763'),(73,42,'Content','[{\"type\":\"craft\\\\fieldlayoutelements\\\\AssetTitleField\",\"autocomplete\":false,\"class\":null,\"size\":null,\"name\":null,\"autocorrect\":true,\"autocapitalize\":true,\"disabled\":false,\"readonly\":false,\"title\":null,\"placeholder\":null,\"step\":null,\"min\":null,\"max\":null,\"requirable\":false,\"id\":null,\"containerAttributes\":[],\"inputContainerAttributes\":[],\"labelAttributes\":[],\"orientation\":null,\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"width\":100}]',1,'2024-02-09 15:44:27','2024-02-09 15:44:27','3cf58d05-3886-449b-a3c9-52f0549a2362'),(74,41,'Content','[{\"type\":\"craft\\\\fieldlayoutelements\\\\AssetTitleField\",\"autocomplete\":false,\"class\":null,\"size\":null,\"name\":null,\"autocorrect\":true,\"autocapitalize\":true,\"disabled\":false,\"readonly\":false,\"title\":null,\"placeholder\":null,\"step\":null,\"min\":null,\"max\":null,\"requirable\":false,\"id\":null,\"containerAttributes\":[],\"inputContainerAttributes\":[],\"labelAttributes\":[],\"orientation\":null,\"label\":null,\"instructions\":null,\"tip\":null,\"warning\":null,\"width\":100}]',1,'2024-02-09 15:44:27','2024-02-09 15:44:27','57a79241-a613-4afe-a0ff-42c4179bc9e1');
commit;

--
-- Dumping data for table `craft_fields`
--

set autocommit=0;
INSERT INTO `craft_fields` VALUES (1,1,'Heading','heading','global',NULL,NULL,1,'craft\\fields\\PlainText','[]','2014-01-18 03:44:25','2014-01-18 03:44:25','4d3091ca-1425-4d3b-b19c-40db36c52f9f','site',NULL),(2,1,'Body','body','global',NULL,'',1,'craft\\redactor\\Field','{\"availableTransforms\":\"*\",\"availableVolumes\":\"*\",\"cleanupHtml\":true,\"columnType\":\"text\",\"configSelectionMode\":\"choose\",\"defaultTransform\":\"\",\"manualConfig\":\"\",\"purifierConfig\":\"\",\"purifyHtml\":\"\",\"redactorConfig\":\"Standard.json\",\"removeEmptyTags\":\"\",\"removeInlineStyles\":\"\",\"removeNbsp\":\"\",\"showHtmlButtonForNonAdmins\":\"1\",\"showUnpermittedFiles\":false,\"showUnpermittedVolumes\":true,\"uiMode\":\"enlarged\"}','2014-01-18 03:44:25','2022-01-16 14:06:29','c9565faa-419b-43e5-ab0f-c9a02beda481','none',NULL),(3,1,'Tags','tags','global',NULL,NULL,1,'craft\\fields\\Tags','{\"source\":\"taggroup:21795d32-fa8d-4880-af8a-d9a3b7cf06be\",\"localizeRelations\":false}','2014-01-18 03:44:25','2014-04-02 00:42:47','80edebac-113b-4d64-8aed-9288eda686a2','none',NULL),(4,2,'Website','website','global',NULL,'',1,'craft\\fields\\PlainText','{\"placeholder\":\"\",\"multiline\":\"\",\"initialRows\":\"4\",\"charLimit\":\"\",\"columnType\":\"text\"}','2014-01-18 04:09:33','2017-09-06 16:09:50','8ae4cb51-d238-4568-ad2b-47852b236a00','none',NULL),(5,2,'Listing Image','listingImage','global',NULL,'',1,'craft\\fields\\Assets','{\"useSingleFolder\":\"\",\"defaultUploadLocationSource\":\"volume:7870c09f-c290-41f0-a732-261bbf4425d5\",\"defaultUploadLocationSubpath\":\"\",\"singleUploadLocationSource\":\"volume:7870c09f-c290-41f0-a732-261bbf4425d5\",\"singleUploadLocationSubpath\":\"\",\"restrictFiles\":\"1\",\"allowedKinds\":[\"image\"],\"sources\":[\"volume:7870c09f-c290-41f0-a732-261bbf4425d5\"],\"source\":null,\"targetSiteId\":null,\"viewMode\":\"large\",\"limit\":\"1\",\"selectionLabel\":\"\",\"localizeRelations\":false}','2014-01-18 04:17:01','2019-01-23 23:57:17','469b6f23-8053-4a7c-8b0e-366f16e9b5fe','site',NULL),(6,2,'Portfolio','portfolio','global',NULL,'',1,'craft\\fields\\Matrix','{\"maxBlocks\":\"\",\"localizeBlocks\":false,\"contentTable\":\"{{%matrixcontent_portfolio}}\"}','2014-01-18 04:22:41','2017-09-07 21:53:27','a4dd4a24-4acd-406d-90a1-3e7da6d69f98','site',NULL),(7,NULL,'Big Image','image','matrixBlockType:5f36ea81-76de-484e-bc2f-2b7fbcdfd4ba',NULL,'',1,'craft\\fields\\Assets','{\"useSingleFolder\":\"\",\"defaultUploadLocationSource\":\"folder:bf0fcefb-b9d7-4917-9bf4-b8a40f831d55\",\"defaultUploadLocationSubpath\":\"\",\"singleUploadLocationSource\":\"folder:bf0fcefb-b9d7-4917-9bf4-b8a40f831d55\",\"singleUploadLocationSubpath\":\"\",\"restrictFiles\":\"\",\"allowedKinds\":null,\"sources\":[\"folder:bf0fcefb-b9d7-4917-9bf4-b8a40f831d55\"],\"source\":null,\"targetSiteId\":null,\"viewMode\":\"list\",\"limit\":\"1\",\"selectionLabel\":\"\",\"localizeRelations\":false}','2014-01-18 04:22:41','2017-09-07 21:53:27','6d8b58d2-c9f6-4616-8b9d-6c2c113edb64','site',NULL),(8,NULL,'Caption','caption','matrixBlockType:5f36ea81-76de-484e-bc2f-2b7fbcdfd4ba',NULL,'',1,'craft\\fields\\PlainText','{\"placeholder\":\"\",\"multiline\":\"\",\"initialRows\":\"4\",\"charLimit\":\"\",\"columnType\":\"text\"}','2014-01-18 04:22:42','2019-01-23 23:57:17','64126b1b-609e-4b8e-8cfb-0dc504a7cb75','none',NULL),(9,NULL,'Small Image','image','matrixBlockType:8dbf5901-f68e-4d1d-a7e0-3d3564633caf',NULL,'',1,'craft\\fields\\Assets','{\"useSingleFolder\":\"\",\"defaultUploadLocationSource\":\"folder:bf0fcefb-b9d7-4917-9bf4-b8a40f831d55\",\"defaultUploadLocationSubpath\":\"\",\"singleUploadLocationSource\":\"folder:bf0fcefb-b9d7-4917-9bf4-b8a40f831d55\",\"singleUploadLocationSubpath\":\"\",\"restrictFiles\":\"\",\"allowedKinds\":null,\"sources\":[\"folder:bf0fcefb-b9d7-4917-9bf4-b8a40f831d55\"],\"source\":null,\"targetSiteId\":null,\"viewMode\":\"list\",\"limit\":\"1\",\"selectionLabel\":\"\",\"localizeRelations\":false}','2014-01-18 04:22:42','2017-09-07 21:53:27','9383707e-403b-4fe1-984a-e622727a8afc','site',NULL),(10,NULL,'Caption','caption','matrixBlockType:8dbf5901-f68e-4d1d-a7e0-3d3564633caf',NULL,'',1,'craft\\fields\\PlainText','{\"placeholder\":\"\",\"multiline\":\"\",\"initialRows\":\"4\",\"charLimit\":\"\",\"columnType\":\"text\"}','2014-01-18 04:22:42','2019-01-23 23:57:17','ce9dffcf-0f0e-43c3-914b-6d3c4b11dd64','none',NULL),(11,3,'Facts','facts','global',NULL,'',1,'craft\\fields\\Matrix','{\"maxBlocks\":\"\",\"localizeBlocks\":false,\"contentTable\":\"{{%matrixcontent_facts}}\"}','2014-01-18 21:33:17','2017-09-29 20:43:20','0dc728e1-acf3-4466-bef6-5c3ea1b83eba','site',NULL),(12,NULL,'Fact','fact','matrixBlockType:9841c1ec-e327-414e-8606-0629dfa49f62',NULL,'',1,'craft\\redactor\\Field','{\"availableTransforms\":\"*\",\"availableVolumes\":\"\",\"columnType\":\"text\",\"purifierConfig\":\"\",\"purifyHtml\":\"\",\"redactorConfig\":\"Simple.json\",\"removeInlineStyles\":\"1\",\"removeEmptyTags\":\"1\",\"removeNbsp\":\"1\"}','2014-01-18 21:33:17','2019-10-09 15:56:06','4b0b212b-27d3-42e4-95ca-33378f2e091a','none',NULL),(13,NULL,'Image','image','matrixBlockType:9841c1ec-e327-414e-8606-0629dfa49f62',NULL,'',1,'craft\\fields\\Assets','{\"allowedKinds\":[\"image\"],\"defaultUploadLocationSource\":\"volume:7870c09f-c290-41f0-a732-261bbf4425d5\",\"defaultUploadLocationSubpath\":\"\",\"limit\":\"\",\"localizeRelations\":false,\"restrictFiles\":\"1\",\"selectionLabel\":\"\",\"singleUploadLocationSource\":\"volume:7870c09f-c290-41f0-a732-261bbf4425d5\",\"singleUploadLocationSubpath\":\"\",\"source\":null,\"sources\":[\"volume:23666417-116d-4909-a37d-65e03b61d2fb\"],\"targetSiteId\":null,\"useSingleFolder\":\"\",\"viewMode\":\"large\"}','2014-01-18 21:39:51','2019-10-09 15:56:06','3839f7fa-8a8f-454b-9ecb-57347dcc8a69','site',NULL),(14,4,'Old ID','oldId','global',NULL,'Used for imported blog posts',1,'craft\\fields\\Number','{\"min\":\"0\",\"max\":\"\",\"decimals\":\"0\"}','2014-01-19 21:28:53','2014-01-19 21:28:53','730ce647-6175-4483-94f0-bdceb48b2b5a','none',NULL),(15,2,'Role','role','global',NULL,'',1,'craft\\fields\\Tags','{\"source\":\"taggroup:1550d569-055d-4a0f-a868-6278ec0c5c11\",\"localizeRelations\":false}','2014-01-22 03:49:51','2014-04-02 00:42:47','dc5aa5eb-7632-41e6-892b-31ef3e39f2ac','none',NULL),(16,2,'Video','video','global',NULL,'',1,'craft\\fields\\PlainText','{\"placeholder\":\"\",\"multiline\":\"\",\"initialRows\":\"4\",\"charLimit\":\"\",\"columnType\":\"text\"}','2014-01-22 04:08:19','2017-09-06 16:09:50','21cf9390-aef2-4398-bd49-327d4e28969b','none',NULL),(17,5,'Headline','headline','global',NULL,'',1,'craft\\fields\\PlainText','{\"placeholder\":\"\",\"multiline\":\"1\",\"initialRows\":\"2\",\"charLimit\":\"\",\"columnType\":\"text\"}','2017-10-04 16:06:36','2017-10-04 16:06:36','1f34cfc8-2625-42e7-be74-20caf0022f56','none',NULL),(18,5,'Description','description','global',NULL,'',1,'craft\\redactor\\Field','{\"availableTransforms\":\"*\",\"availableVolumes\":\"\",\"columnType\":\"text\",\"purifierConfig\":\"\",\"purifyHtml\":\"1\",\"redactorConfig\":\"Simple.json\",\"removeInlineStyles\":\"1\",\"removeEmptyTags\":\"1\",\"removeNbsp\":\"1\"}','2017-10-04 16:07:01','2019-10-09 15:56:06','b1ca51a7-b7ef-4093-b88f-3c7606da7479','none',NULL),(19,4,'Number of Likes','numberOfLikes','global','cjxlnzlz','',0,'craft\\fields\\Number','{\"decimals\":0,\"defaultValue\":\"0\",\"max\":null,\"min\":\"0\",\"prefix\":null,\"previewCurrency\":\"\",\"previewFormat\":\"none\",\"size\":null,\"suffix\":null}','2022-04-14 14:29:57','2022-04-14 14:29:57','aa34b459-8563-4dd9-906f-ef23f39617cb','none',NULL),(20,1,'Body Blocks','bodyBlocks','global',NULL,'',0,'craft\\fields\\Matrix','{\"contentTable\":\"{{%matrixcontent_bodyblocks}}\",\"maxBlocks\":\"\",\"minBlocks\":\"\",\"propagationKeyFormat\":null,\"propagationMethod\":\"all\"}','2023-01-26 15:20:28','2023-01-26 15:20:28','ecdfc639-cca4-41ac-8e03-5d6fbc25eeae','site',NULL),(21,NULL,'Code','code','matrixBlockType:306075d5-6875-4386-87f7-5458431def30','oszacnkq','',0,'craft\\fields\\PlainText','{\"byteLimit\":null,\"charLimit\":null,\"code\":\"1\",\"columnType\":null,\"initialRows\":\"6\",\"multiline\":\"1\",\"placeholder\":null,\"uiMode\":\"normal\"}','2023-01-26 15:20:29','2023-01-26 15:20:29','bb415b06-180b-4bb1-9642-6f363fb2fdf0','none',NULL),(22,NULL,'Language','lang','matrixBlockType:306075d5-6875-4386-87f7-5458431def30','aeswcasj','',0,'craft\\fields\\PlainText','{\"byteLimit\":null,\"charLimit\":null,\"code\":\"1\",\"columnType\":null,\"initialRows\":\"4\",\"multiline\":\"\",\"placeholder\":null,\"uiMode\":\"normal\"}','2023-01-26 15:20:29','2023-01-26 15:20:29','ca9ec65f-75c7-4315-9cd4-b7fcbf69bde0','none',NULL),(23,NULL,'Text','text','matrixBlockType:4dab73a6-3747-4e23-95b2-5b094733276c','trbwrqml','',0,'craft\\redactor\\Field','{\"availableTransforms\":\"*\",\"availableVolumes\":\"*\",\"cleanupHtml\":true,\"columnType\":\"text\",\"configSelectionMode\":\"choose\",\"defaultTransform\":\"\",\"manualConfig\":\"\",\"purifierConfig\":\"\",\"purifyHtml\":\"\",\"redactorConfig\":\"Standard.json\",\"removeEmptyTags\":\"\",\"removeInlineStyles\":\"\",\"removeNbsp\":\"\",\"showHtmlButtonForNonAdmins\":\"1\",\"showUnpermittedFiles\":false,\"showUnpermittedVolumes\":true,\"uiMode\":\"enlarged\"}','2023-01-26 15:20:29','2023-01-26 15:20:29','7b9beed5-2970-4e8d-bbea-f8b99985ca8c','none',NULL);
commit;

--
-- Dumping data for table `craft_globalsets`
--

set autocommit=0;
commit;

--
-- Dumping data for table `craft_gqlschemas`
--

set autocommit=0;
INSERT INTO `craft_gqlschemas` VALUES (1,'Remix','[\"sections.5f4d5d1d-f61d-440d-bf99-45b55232c923:read\",\"entrytypes.9c1b1e72-ccf7-44b0-b492-efbdf1ae10d8:read\",\"sections.6c9ac135-0190-41c6-9b5d-a636316eb58d:read\",\"entrytypes.1072b6c6-03a8-42ea-b22e-eddee9eef02a:read\",\"entrytypes.62be586c-775f-41e1-9df2-5cf581f61731:read\",\"sections.7e0dba83-d462-4af7-aa79-1da09ee3c2a4:read\",\"entrytypes.8a4d97ba-f743-4c16-8ce0-3d26feedbabf:read\",\"sections.5865feb4-46d8-4867-aad3-6b6a0d39934f:read\",\"entrytypes.9b5253fd-80e0-4356-9d8f-5ddd121a197b:read\",\"sections.7c008288-e9c7-4c96-8ad6-9938934d6c20:read\",\"entrytypes.ba1111ac-f53b-4ee4-b845-23c2a2a9bfc2:read\",\"volumes.7870c09f-c290-41f0-a732-261bbf4425d5:read\",\"volumes.23666417-116d-4909-a37d-65e03b61d2fb:read\",\"volumes.e0e0288f-1aca-4ffb-8da8-445801d85a28:read\",\"volumes.246261c7-f2c1-45ac-8bfd-8f291f4333e3:read\",\"sections.6c9ac135-0190-41c6-9b5d-a636316eb58d:edit\",\"entrytypes.1072b6c6-03a8-42ea-b22e-eddee9eef02a:edit\",\"entrytypes.1072b6c6-03a8-42ea-b22e-eddee9eef02a:save\"]','2022-01-05 15:28:51','2022-04-14 19:08:54','b6f9e56f-37a1-445a-a773-0042160025f3',0),(2,'Public Schema','[]','2022-01-05 15:28:51','2022-01-05 15:28:51','27fa80af-eb05-474d-9017-cf997f9694cb',1);
commit;

--
-- Dumping data for table `craft_gqltokens`
--

set autocommit=0;
INSERT INTO `craft_gqltokens` VALUES (1,'Public Token','__PUBLIC__',0,NULL,NULL,2,'2020-08-10 21:12:19','2022-01-05 15:32:10','e92ebb44-8ab3-415c-8df2-151dba1fa3c9'),(2,'Production Remix','W2tlQoASuYQqS6vyf6pDS5bUfOw5PHPN',1,NULL,'2024-02-09 20:32:41',1,'2022-01-05 15:32:32','2024-02-09 20:32:41','28d511ac-e79e-4d3d-ba4d-4ca1b60be592');
commit;

--
-- Dumping data for table `craft_info`
--

set autocommit=0;
INSERT INTO `craft_info` VALUES (1,'3.7.27.2','3.7.8',1,'jspoafxqrssw','2014-01-18 03:44:24','2024-02-09 20:35:17','d340d58a-42f7-43de-b5bf-1cba8c793a05','2@xmbbdzrcuz');
commit;

--
-- Dumping data for table `craft_matrixblocks`
--

set autocommit=0;
INSERT INTO `craft_matrixblocks` VALUES (13,4,11,3,1,NULL,'2014-01-18 21:42:11','2017-10-02 18:57:25','2cd3b35f-c1b9-4d3a-828a-fcbbecd7f940'),(14,4,11,3,2,NULL,'2014-01-18 21:42:11','2017-10-02 18:57:25','b763b6e4-8515-4934-b26b-100e192b2971'),(15,4,11,3,3,NULL,'2014-01-18 21:42:11','2017-10-02 18:57:25','6f8ef9b5-36fc-46de-9b1c-b819ae43047b'),(16,4,11,3,4,NULL,'2014-01-18 21:42:11','2017-10-02 18:57:25','399a57b5-37ed-455f-8324-f3dfdf2f108e'),(488,298,6,1,1,NULL,'2014-01-22 04:25:47','2017-09-21 19:11:32','999a6e8a-e188-49e5-b3f0-5fce4c2ea100'),(489,298,6,1,2,NULL,'2014-01-22 04:25:47','2017-09-21 19:11:32','3ff9adf3-32a4-4afb-82de-44cd9d470158'),(490,298,6,1,3,NULL,'2014-01-22 04:25:47','2017-09-21 19:11:32','fcd15744-45fa-4a06-abb0-2ced3e5dfe4f'),(491,298,6,1,4,NULL,'2014-01-22 04:25:47','2017-09-21 19:11:32','f83c0005-213c-4e3e-87d3-c448ea1b27af'),(492,298,6,1,5,NULL,'2014-01-22 04:25:47','2017-09-21 19:11:32','e619d0e8-8e17-4f15-8064-ad90a8588102'),(493,303,6,1,1,NULL,'2014-01-23 01:22:51','2017-09-21 19:11:18','e773363e-8ab6-449e-a93b-db5ef31b20f9'),(494,303,6,1,2,NULL,'2014-01-23 01:22:51','2017-09-21 19:11:18','d8167005-26ca-4be5-af66-6e1ad5a521ac'),(495,303,6,1,3,NULL,'2014-01-23 01:22:51','2017-09-21 19:11:18','34ef0302-44ab-47cf-ace9-14e6bbffd63b'),(496,303,6,1,4,NULL,'2014-01-23 01:22:51','2017-09-21 19:11:18','bd006bd8-15d8-4f38-bf17-d56679606a95'),(497,303,6,1,5,NULL,'2014-01-23 01:22:51','2017-09-21 19:11:18','2c55a8a1-c4d2-457e-ac25-2df58367b292'),(498,303,6,1,6,NULL,'2014-01-23 01:22:51','2017-09-21 19:11:18','36667211-422f-4155-94dd-1c82187cc060'),(499,303,6,1,7,NULL,'2014-01-23 01:22:51','2017-09-21 19:11:18','0a2c6903-a6f8-4313-b5c8-bd96b9f67af3'),(500,303,6,2,8,NULL,'2014-01-23 01:22:51','2017-09-21 19:11:18','9b8a010a-a546-40d5-992f-398275e8ea59'),(501,303,6,2,9,NULL,'2014-01-23 01:22:51','2017-09-21 19:11:18','96dfa509-e889-4321-918a-2c427219795f'),(502,303,6,2,10,NULL,'2014-01-23 01:22:51','2017-09-21 19:11:18','8e13b5c5-2216-4730-84b4-2f99164ffe62'),(503,305,6,1,1,NULL,'2014-01-23 01:31:54','2017-09-07 21:53:45','ca9e1cd5-d1cd-4cbc-aff6-bd35eab98163'),(504,305,6,1,2,NULL,'2014-01-23 01:31:54','2017-09-07 21:53:45','87d13cc3-2634-469a-8b43-beaa3492d497'),(505,305,6,1,3,NULL,'2014-01-23 01:31:54','2017-09-07 21:53:45','74bd2ff9-cdf7-48c2-99c8-616da2ae542a'),(506,305,6,2,4,NULL,'2014-01-23 01:31:54','2017-09-07 21:53:45','f647f987-d566-4104-ad83-33ffa2e180da'),(507,305,6,2,5,NULL,'2014-01-23 01:31:54','2017-09-07 21:53:45','4a438c73-aa8a-4a07-8340-adfc93aa7c2c'),(508,305,6,2,6,NULL,'2014-01-23 01:31:54','2017-09-07 21:53:45','19aa0312-3079-412a-8483-ff794a38822d'),(509,306,6,1,1,NULL,'2014-01-23 01:35:59','2017-09-07 21:53:44','f0edb063-3632-4989-b5fb-ca4ab8bf2c49'),(510,306,6,1,2,NULL,'2014-01-23 01:35:59','2017-09-07 21:53:44','25f814f5-39a2-4ffb-a1a2-b295d554a928'),(511,306,6,1,3,NULL,'2014-01-23 01:35:59','2017-09-07 21:53:44','b3d02a22-b129-4e9b-87a5-c93f470ccba8'),(512,306,6,1,4,NULL,'2014-01-23 01:35:59','2017-09-07 21:53:44','e6273c3a-53fe-4eaf-8dac-fd28934735bf'),(513,306,6,1,5,NULL,'2014-01-23 01:35:59','2017-09-07 21:53:44','e286be67-ffe0-487b-9b43-93ba2036d431'),(514,306,6,1,6,NULL,'2014-01-23 01:35:59','2017-09-07 21:53:45','18d29362-e91f-4c40-b07c-9d4058195c8a'),(515,306,6,1,7,NULL,'2014-01-23 01:35:59','2017-09-07 21:53:45','b0e2c742-d03d-41a5-af10-06007c7cdcce'),(516,307,6,1,1,NULL,'2014-01-23 01:37:49','2018-03-12 16:25:32','36dc795c-83e8-48c2-ae11-c071e049c652'),(517,307,6,1,2,NULL,'2014-01-23 01:37:49','2018-03-12 16:25:32','8ea13944-2a2a-40b2-a6b2-f30708029860'),(518,307,6,1,3,NULL,'2014-01-23 01:37:49','2018-03-12 16:25:32','e1c83ae0-ded5-4118-8f5a-591a1baa1da0'),(519,307,6,1,4,NULL,'2014-01-23 01:37:49','2018-03-12 16:25:32','e42c171d-4a9a-4c27-8b64-de785965d811'),(520,308,6,1,1,NULL,'2014-01-23 01:43:44','2017-09-21 19:10:55','23b420b4-108b-41d5-98e7-b7d80ce7f028'),(521,308,6,1,2,NULL,'2014-01-23 01:43:44','2017-09-21 19:10:55','356e7f8c-74f4-4eaa-81ff-a166d73402a6'),(522,308,6,1,3,NULL,'2014-01-23 01:43:44','2017-09-21 19:10:55','92f45b98-4954-4306-8129-74b28acfe180'),(523,308,6,1,4,NULL,'2014-01-23 01:43:44','2017-09-21 19:10:55','2dfddaf8-2784-4346-a26f-97d0d53ac92e'),(524,308,6,1,5,NULL,'2014-01-23 01:43:44','2017-09-21 19:10:55','9865e8a3-6162-4762-a149-3b513025ec08'),(525,308,6,1,6,NULL,'2014-01-23 01:43:44','2017-09-21 19:10:55','d818ae7e-ac5b-465d-8442-42db8e3e99a3'),(526,309,6,1,1,NULL,'2014-01-23 01:46:13','2017-09-21 19:01:42','b1e60437-90f6-4faa-8ff4-aa2b2b16adae'),(527,309,6,1,2,NULL,'2014-01-23 01:46:13','2017-09-21 19:01:42','aa9e450b-0e6f-44ec-8a27-52f604b99750'),(528,309,6,1,3,NULL,'2014-01-23 01:46:13','2017-09-21 19:01:42','36e4b2a9-dd68-47dd-98c5-a5f864dc4bb6'),(529,309,6,1,4,NULL,'2014-01-23 01:46:13','2017-09-21 19:01:42','66940afc-db9a-44d9-8705-cc83d3abfdd5'),(530,310,6,1,1,NULL,'2014-01-23 01:48:48','2017-09-21 19:10:24','1c4c51a4-328a-4725-a8d7-e8f78bea855c'),(531,310,6,1,2,NULL,'2014-01-23 01:48:48','2017-09-21 19:10:24','cefa1598-8096-4fd8-a107-74e517fe5166'),(532,310,6,1,3,NULL,'2014-01-23 01:48:48','2017-09-21 19:10:24','17b160ee-d2d3-427e-ada0-a1634c7a5e6b'),(533,310,6,1,4,NULL,'2014-01-23 01:48:48','2017-09-21 19:10:24','9e36d056-1ce1-4782-b7c7-83dce2c1ddf9'),(534,310,6,1,5,NULL,'2014-01-23 01:48:48','2017-09-21 19:10:24','2f530b20-ab76-40b7-80a5-5c323f189706'),(535,310,6,1,6,NULL,'2014-01-23 01:48:48','2017-09-21 19:10:24','4389cd97-6009-4d0c-a6e0-f13b1c7806b7'),(536,310,6,1,7,NULL,'2014-01-23 01:48:48','2017-09-21 19:10:24','6ef53922-7234-497a-b36b-6564e5d01fde'),(537,310,6,1,8,NULL,'2014-01-23 01:48:48','2017-09-21 19:10:24','e92b2aea-d9f5-43fa-bec2-ee1f76d05475'),(538,311,6,1,1,NULL,'2014-01-23 01:51:04','2017-09-21 19:10:35','ef75f609-1e22-4701-a79d-59bab20d2f61'),(539,311,6,1,2,NULL,'2014-01-23 01:51:04','2017-09-21 19:10:35','1aaa77b3-75c4-4451-befb-4d59c7b85aae'),(540,311,6,1,3,NULL,'2014-01-23 01:51:04','2017-09-21 19:10:35','c2a83b45-7e5e-4db2-a353-a15bea976647'),(541,311,6,1,4,NULL,'2014-01-23 01:51:04','2017-09-21 19:10:35','6f6f4a82-398a-42f6-b996-41cb8b36ee88'),(542,311,6,1,5,NULL,'2014-01-23 01:51:04','2017-09-21 19:10:35','125c4a97-bb72-42cd-b87a-af7168fe7bc5'),(543,312,6,1,1,NULL,'2014-01-23 01:53:02','2017-09-07 21:53:44','556e454f-4102-4704-acca-78fa0b4d88ce'),(544,312,6,1,2,NULL,'2014-01-23 01:53:02','2017-09-07 21:53:44','c48457e6-8096-43b7-9563-c0cad7c86d37'),(545,312,6,1,3,NULL,'2014-01-23 01:53:02','2017-09-07 21:53:44','8d6db1e1-0b47-4b0e-aa07-cd2935ec3904'),(546,312,6,1,4,NULL,'2014-01-23 01:53:02','2017-09-07 21:53:44','4cf9ef41-7861-4787-96af-24955e653e45'),(547,312,6,1,5,NULL,'2014-01-23 01:53:03','2017-09-07 21:53:44','85ce8d84-402c-4399-b9e3-08e0aa971cc6'),(548,313,6,1,1,NULL,'2014-01-23 15:10:29','2017-09-21 19:09:55','922a16ba-7c19-4236-b2d9-607f41c7954b'),(549,313,6,1,2,NULL,'2014-01-23 15:10:29','2017-09-21 19:09:55','1944dd72-3334-4410-9a4a-24ef4a9a5d05'),(550,313,6,1,3,NULL,'2014-01-23 15:10:29','2017-09-21 19:09:55','1e2deaef-d1e7-46ce-82b6-13236bc0b078'),(551,313,6,1,4,NULL,'2014-01-23 15:10:29','2017-09-21 19:09:55','128c086a-ec40-4139-bb2e-102a5154d06f'),(552,314,6,1,1,NULL,'2014-01-23 15:13:07','2017-09-21 19:09:08','d6c0de76-8450-4f74-9545-68939b7f46dd'),(553,314,6,1,2,NULL,'2014-01-23 15:13:07','2017-09-21 19:09:08','ab646e9a-bb54-4d3c-b54e-2161f7229aa2'),(554,314,6,1,3,NULL,'2014-01-23 15:13:07','2017-09-21 19:09:08','e3153364-9d44-4c7e-8eca-3fa9bdad0e1e'),(555,314,6,1,4,NULL,'2014-01-23 15:13:07','2017-09-21 19:09:09','c24b4629-dc32-4ec1-b092-5be8b2faecb9'),(556,314,6,1,5,NULL,'2014-01-23 15:13:07','2017-09-21 19:09:09','41ca984c-86df-45ef-bafb-ddd44508e0e0'),(557,314,6,1,6,NULL,'2014-01-23 15:13:07','2017-09-21 19:09:09','042ff9fc-0749-48fc-b5b6-121d7f9c9633'),(558,315,6,1,1,NULL,'2014-01-23 15:15:15','2017-09-21 19:08:54','0e9c86c3-852a-4fba-b85a-c467a09b3b7e'),(559,315,6,1,2,NULL,'2014-01-23 15:15:15','2017-09-21 19:08:54','8f51f0c8-08d9-4d83-9253-61ff65fc7052'),(560,315,6,1,3,NULL,'2014-01-23 15:15:15','2017-09-21 19:08:54','c1cda15c-0691-4e0f-90f2-583493412506'),(561,315,6,1,4,NULL,'2014-01-23 15:15:15','2017-09-21 19:08:54','53d920fa-39ef-4311-93cb-62a4d5fb3388'),(562,316,6,1,1,NULL,'2014-01-23 15:16:10','2017-09-21 19:08:33','43ac2455-98d4-4959-ad3d-7e36425f81e4'),(563,317,6,1,1,NULL,'2014-01-23 15:18:03','2017-09-21 19:08:24','297340d4-85e6-4f91-bcb1-bb08a3b280e5'),(564,317,6,1,2,NULL,'2014-01-23 15:18:03','2017-09-21 19:08:24','90d8e8d5-7be5-4839-b541-e7f2c914ab73'),(565,317,6,1,3,NULL,'2014-01-23 15:18:03','2017-09-21 19:08:24','e967c89c-ad42-4320-bc3c-b9b62de8ff55'),(566,317,6,1,4,NULL,'2014-01-23 15:18:03','2017-09-21 19:08:24','63b3cb41-6c03-4265-b6fa-95bb008fba40'),(567,317,6,1,5,NULL,'2014-01-23 15:18:03','2017-09-21 19:08:24','7b566dc1-14f3-4595-80e6-095729d16082'),(568,318,6,1,1,NULL,'2014-01-23 15:18:53','2017-09-07 21:53:42','7ab39543-9504-4b60-8153-850907bc8ab1'),(569,319,6,1,1,NULL,'2014-01-23 15:19:47','2017-09-07 21:53:42','851fc78a-1457-43fa-a338-786a49fbbfc2'),(570,320,6,1,1,NULL,'2014-01-23 15:21:43','2017-09-21 19:08:08','af381a89-2c1f-49aa-87d5-b00ed7b457cc'),(571,320,6,1,2,NULL,'2014-01-23 15:21:43','2017-09-21 19:08:08','d0b09f44-72f0-41c4-8083-c69b06edf4f6'),(572,320,6,1,3,NULL,'2014-01-23 15:21:43','2017-09-21 19:08:08','e6e60657-6726-43dd-ba79-725150916a1e'),(573,320,6,1,4,NULL,'2014-01-23 15:21:43','2017-09-21 19:08:08','f0d65ed6-ea51-4700-9c75-8c5ecfdc9718'),(574,321,6,1,1,NULL,'2014-01-23 15:23:03','2017-09-21 19:07:50','e4ecf3bf-f3f9-4acf-9346-9070faba1528'),(575,321,6,1,2,NULL,'2014-01-23 15:23:03','2017-09-21 19:07:50','7556cd98-c1bd-4784-adbe-0c6074e50255'),(576,321,6,1,3,NULL,'2014-01-23 15:23:03','2017-09-21 19:07:50','cf2db136-d5c8-485d-ac89-e4d182244b4a'),(577,321,6,1,4,NULL,'2014-01-23 15:23:03','2017-09-21 19:07:50','13f9a469-6be5-48be-85ee-0a5a6b7c7978'),(578,321,6,1,5,NULL,'2014-01-23 15:23:03','2017-09-21 19:07:50','f6964e32-5710-474b-911a-4d7b2db30992'),(756,754,6,1,1,NULL,'2014-09-12 19:44:48','2017-09-07 21:53:45','9e898c64-838a-4394-bcb6-750bc74f5bb2'),(757,754,6,1,2,NULL,'2014-09-12 19:44:48','2017-09-07 21:53:45','e30b418f-af77-499a-b7bf-f284f77948e5'),(758,754,6,1,3,NULL,'2014-09-12 19:44:48','2017-09-07 21:53:46','411fd397-06fd-4ecd-ade4-bf7db7dea369'),(759,754,6,1,4,NULL,'2014-09-12 19:44:48','2017-09-07 21:53:46','dbec9452-f027-4a14-bcf5-b3ebe2efb1c3'),(768,760,6,1,1,NULL,'2014-09-12 20:18:46','2017-09-07 21:53:46','688035c3-e633-4375-b083-95b5e04092bb'),(769,760,6,1,2,NULL,'2014-09-12 20:18:46','2017-09-07 21:53:46','e6556285-b875-4b0f-91f5-b57ec15ced95'),(770,760,6,2,3,NULL,'2014-09-12 20:18:46','2017-09-07 21:53:46','5435e3b9-3393-4eba-90a0-f9aa58a91cb4'),(771,760,6,2,4,NULL,'2014-09-12 20:18:46','2017-09-07 21:53:46','b8574558-d7e5-4c72-87b7-0a1f113c31b2'),(772,760,6,2,5,NULL,'2014-09-12 20:18:46','2017-09-07 21:53:46','5d216c11-fae3-45dc-9f26-54bb7aa86756'),(773,760,6,1,6,NULL,'2014-09-12 20:18:46','2017-09-07 21:53:46','616c834b-84af-4e5c-9447-3ead668608ca'),(852,4,11,3,5,NULL,'2017-10-02 18:57:25','2017-10-02 18:57:25','d8d0167b-4277-4f05-bf89-af0f1bfc98c7'),(862,861,11,3,1,NULL,'2019-10-09 15:56:07','2019-10-09 15:56:07','061778ae-bdc4-4aae-a780-e6d1794f686b'),(863,861,11,3,2,NULL,'2019-10-09 15:56:07','2019-10-09 15:56:07','77803c9c-d274-400d-a6a9-818de79ea7d0'),(864,861,11,3,3,NULL,'2019-10-09 15:56:07','2019-10-09 15:56:07','bfb77207-a6de-4dbe-9927-39d99fc9cdad'),(865,861,11,3,4,NULL,'2019-10-09 15:56:07','2019-10-09 15:56:07','f14721c2-5651-4380-978c-82556e1756c4'),(866,861,11,3,5,NULL,'2019-10-09 15:56:07','2019-10-09 15:56:07','dca894e3-d610-47b2-bf63-919e9fa54d10'),(868,867,11,3,1,NULL,'2019-10-09 15:56:08','2019-10-09 15:56:08','83e42816-ce70-4ace-86b6-0f6ab22a7a8f'),(869,867,11,3,2,NULL,'2019-10-09 15:56:08','2019-10-09 15:56:08','66bc5d45-8447-4849-b3a5-8f981514f1ec'),(870,867,11,3,3,NULL,'2019-10-09 15:56:08','2019-10-09 15:56:08','7411aec2-e6c8-4471-8f25-989c758af7a6'),(871,867,11,3,4,NULL,'2019-10-09 15:56:08','2019-10-09 15:56:08','68a85b06-169f-44f8-bc68-8d15a17539fd'),(872,867,11,3,5,NULL,'2019-10-09 15:56:08','2019-10-09 15:56:08','45f70d9d-1ad1-4d7d-a9b9-7f57ddee04ac'),(886,885,6,1,1,NULL,'2019-10-09 16:40:22','2019-10-09 16:40:22','11714e21-f9a9-4959-958b-157a49785a6b'),(887,885,6,1,2,NULL,'2019-10-09 16:40:22','2019-10-09 16:40:22','cfc17e82-8c99-4cb0-abaf-3d0d97620b02'),(888,885,6,1,3,NULL,'2019-10-09 16:40:22','2019-10-09 16:40:22','5c936d5f-c39c-4be8-bcca-716dd87e0300'),(889,885,6,1,4,NULL,'2019-10-09 16:40:22','2019-10-09 16:40:22','69700b36-35e1-48ae-9589-8507dff7db5b'),(894,893,11,3,1,NULL,'2019-10-09 16:40:22','2019-10-09 16:40:22','a701d864-54dd-4b47-880b-b4e33cf52243'),(895,893,11,3,2,NULL,'2019-10-09 16:40:22','2019-10-09 16:40:22','f957e1a3-b631-4f68-9c6c-444d836edb2a'),(896,893,11,3,3,NULL,'2019-10-09 16:40:22','2019-10-09 16:40:22','f84f621c-2a9f-4968-ad3c-ade96e223d59'),(897,893,11,3,4,NULL,'2019-10-09 16:40:22','2019-10-09 16:40:22','26a7f096-aeab-4f45-980c-7e8699dcd113'),(898,893,11,3,5,NULL,'2019-10-09 16:40:22','2019-10-09 16:40:22','c9727ebc-b387-424b-bc4a-008736e34a68'),(900,899,11,3,1,NULL,'2019-10-09 16:40:23','2019-10-09 16:40:23','ea2e5d1e-0043-41f8-994c-edcb60d68c17'),(901,899,11,3,2,NULL,'2019-10-09 16:40:23','2019-10-09 16:40:23','cb8e400c-cac9-4c7d-8de9-937172611239'),(902,899,11,3,3,NULL,'2019-10-09 16:40:23','2019-10-09 16:40:23','2547a926-abf7-4286-9895-a00ec6976655'),(903,899,11,3,4,NULL,'2019-10-09 16:40:23','2019-10-09 16:40:23','0513b28f-82f1-489b-998b-98ab3d42ce52'),(904,899,11,3,5,NULL,'2019-10-09 16:40:23','2019-10-09 16:40:23','91b7de29-69f1-463c-b11c-a81053ac255a'),(906,905,11,3,1,NULL,'2019-10-09 16:40:23','2019-10-09 16:40:23','6ea1becc-7494-4f13-8d35-803cdf21d769'),(907,905,11,3,2,NULL,'2019-10-09 16:40:23','2019-10-09 16:40:23','380fcc3a-268a-4a75-8543-35dfb65a9e49'),(908,905,11,3,3,NULL,'2019-10-09 16:40:23','2019-10-09 16:40:23','26eabd9b-001c-4425-a09e-3cbc92a634e4'),(909,905,11,3,4,NULL,'2019-10-09 16:40:23','2019-10-09 16:40:23','aff80c44-e428-4fc5-a8a8-951f4c279ab4'),(910,905,11,3,5,NULL,'2019-10-09 16:40:23','2019-10-09 16:40:23','21bb2fc5-2115-453a-8598-293bb86fe4ef'),(912,911,11,3,1,NULL,'2019-10-09 16:40:23','2019-10-09 16:40:23','4f57b23e-9c6c-4906-9c27-4c99e1e41910'),(913,911,11,3,2,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','63139799-ccd8-446e-8317-899dc8cbd3ab'),(914,911,11,3,3,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','027c05f3-e9c5-4624-a21a-b5e4bdccc84f'),(915,911,11,3,4,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','52a42d9d-ed7c-4172-9358-b68334b4442e'),(916,911,11,3,5,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','8080d4d0-0f72-4e79-86c4-ae88ae14ee9c'),(918,917,11,3,1,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','3779fe63-6958-435a-b63c-59be29e1eb81'),(919,917,11,3,2,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','1f5ac374-05f5-45e3-b3fd-defb570dcc87'),(920,917,11,3,3,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','5ea92358-e1a4-4170-bd1e-bc0e1e936db6'),(921,917,11,3,4,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','143a150a-d565-4772-8934-d0de72f0349f'),(922,917,11,3,5,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','0f3c7d1a-4499-4a50-814e-63eb0208c49e'),(924,923,11,3,1,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','9e001dc7-12ae-4a2d-a647-38eb1bf62edd'),(925,923,11,3,2,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','abb4f0f2-28b2-4e19-a2b9-629484713d43'),(926,923,11,3,3,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','f523ff47-f974-4bc4-b4f7-14ccd0c522c9'),(927,923,11,3,4,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','abdeafba-d067-4627-8825-2cbd685ce636'),(928,923,11,3,5,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','9aa1ca6e-f955-4308-9591-4b85d3fdd692'),(930,929,11,3,1,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','186bdbbc-dcb8-495f-b9f2-65e548358614'),(931,929,11,3,2,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','b36ca8e5-31bb-4a35-89b2-7947716effb5'),(932,929,11,3,3,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','0f2fda59-351c-4e43-a30b-d92e8a06c504'),(933,929,11,3,4,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','d51bc6cd-ae9b-43ab-b664-3655400b8eef'),(934,929,11,3,5,NULL,'2019-10-09 16:40:24','2019-10-09 16:40:24','b09958d2-b4e6-4bd3-bde3-176ffdbb75b8'),(936,935,11,3,1,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','284d0672-70b9-4601-b0e9-c02e649cb5d7'),(937,935,11,3,2,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','3b2f2937-b2c3-4cfc-b063-3aa3bae76703'),(938,935,11,3,3,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','b98360df-08b2-46eb-be56-b17f929c69fe'),(939,935,11,3,4,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','d01a65af-3fc5-4c0c-b06d-c8a77b329b6f'),(940,935,11,3,5,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','52b8f41b-560f-4e2e-a0ab-24a54a718f71'),(942,941,11,3,1,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','70b91c5c-2ced-4467-8052-8ebfae9d2022'),(943,941,11,3,2,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','126dd791-2032-4cc5-bab4-8d0afd576679'),(944,941,11,3,3,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','0be7617f-76ea-4cbd-88f5-7a455a6ef375'),(945,941,11,3,4,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','dc4d438f-f920-4813-88b9-9c2d08525332'),(946,941,11,3,5,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','bd47d9f9-4aa1-43f7-bf71-f346e80075cc'),(948,947,11,3,1,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','95a96946-e038-41a3-a46c-cbf5e0db9843'),(949,947,11,3,2,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','4ef7bd35-02a9-4719-b5fe-82d5373e4c1b'),(950,947,11,3,3,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','173ca160-d595-4531-8edb-05804c76bd3f'),(951,947,11,3,4,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','89d8ab36-d491-4dcd-b40b-4afa9d24af4c'),(952,947,11,3,5,NULL,'2019-10-09 16:40:25','2019-10-09 16:40:25','44c79be9-14e8-47ef-906d-08fb55bb106f'),(954,953,11,3,1,NULL,'2019-10-09 16:40:26','2019-10-09 16:40:26','4f85ca14-2dce-440f-815b-d523554c19e9'),(955,953,11,3,2,NULL,'2019-10-09 16:40:26','2019-10-09 16:40:26','9c24a187-2b5a-44b2-9872-586382a1acb2'),(956,953,11,3,3,NULL,'2019-10-09 16:40:26','2019-10-09 16:40:26','e2e1f7f4-5286-44a8-bbde-1a28dbaaab8f'),(957,953,11,3,4,NULL,'2019-10-09 16:40:26','2019-10-09 16:40:26','97061466-f05b-43b5-875a-5f60b8c8ac7d'),(958,953,11,3,5,NULL,'2019-10-09 16:40:26','2019-10-09 16:40:26','3d375623-b37a-4665-8dc8-d906215db1ea'),(960,959,11,3,1,NULL,'2019-10-09 16:40:26','2019-10-09 16:40:26','30570041-e869-4315-b561-f8eff083667b'),(961,959,11,3,2,NULL,'2019-10-09 16:40:26','2019-10-09 16:40:26','231616f0-1ed4-4560-8bbf-3572eedf3836'),(962,959,11,3,3,NULL,'2019-10-09 16:40:26','2019-10-09 16:40:26','075fa5b4-2d24-4a91-9111-bfbb63d64851'),(963,959,11,3,4,NULL,'2019-10-09 16:40:26','2019-10-09 16:40:26','b29af6d3-a077-4aab-b3d4-7817f10e21e5'),(964,959,11,3,5,NULL,'2019-10-09 16:40:26','2019-10-09 16:40:26','aa712dcc-37b9-41cd-8cc2-2b310c452068'),(969,968,6,1,1,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','731ce855-d591-443c-9fd8-67498eed32da'),(970,968,6,1,2,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','46a83a9f-f530-411e-9c79-407ba88bcdd1'),(971,968,6,1,3,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','28d025a7-fe74-404d-80ea-95bf3bbd1a0f'),(972,968,6,1,4,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','ced08223-fa7a-426b-a42b-703bd1021726'),(973,968,6,1,5,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','f2fb2708-a9ce-4e96-b8d5-b8102d702c3a'),(975,974,6,1,1,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','6e78febf-694d-4f3d-b05c-129cdaeaf8d5'),(976,974,6,1,2,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','e09a981f-58b2-4f7e-a3a1-6abc720c79dc'),(977,974,6,1,3,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','6a877a1b-d946-4ac3-972a-01479c3937fe'),(978,974,6,1,4,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','aa49982d-9f86-4d5b-b750-894107068182'),(979,974,6,1,5,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','9387a3a0-cc56-42cb-9e18-f9e324caa873'),(980,974,6,1,6,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','43b1d514-11e7-4627-bc1d-0729ef3ead2a'),(981,974,6,1,7,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','856b21ab-dbeb-43dc-af70-b315ed41210c'),(982,974,6,2,8,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','9632a348-200d-4931-bc82-acc73f1d8abc'),(983,974,6,2,9,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','e661f422-763e-4f8c-a3f3-869ac03a411c'),(984,974,6,2,10,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','947ec4e3-d23e-49e8-b2c2-91faeb4171e2'),(986,985,6,1,1,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','942917f8-7d89-49d3-b0c8-492cd3aa76c5'),(987,985,6,1,2,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','7818d700-ecf1-424b-90e2-cd6088e4afaa'),(988,985,6,1,3,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','c0f44080-66a7-4723-b39d-a728836f4221'),(989,985,6,1,4,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','cbbd6dc4-bda8-4108-8ebd-7495ead08bb1'),(990,985,6,1,5,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','56a75d68-6744-40f1-8452-15865abce31e'),(991,985,6,1,6,NULL,'2019-10-09 16:40:27','2019-10-09 16:40:27','dc58349a-6212-4521-ab76-ed2283a6ad7b'),(993,992,6,1,1,NULL,'2019-10-09 16:40:28','2019-10-09 16:40:28','99755134-6eb0-4338-8a15-55a65e8b6184'),(994,992,6,1,2,NULL,'2019-10-09 16:40:28','2019-10-09 16:40:28','58791223-835f-44ac-b180-ac5d0b32e493'),(995,992,6,1,3,NULL,'2019-10-09 16:40:28','2019-10-09 16:40:28','3dc7792f-5d22-4122-899e-df00a36428f0'),(996,992,6,1,4,NULL,'2019-10-09 16:40:28','2019-10-09 16:40:28','7106dd85-90d8-459a-bea5-9db341899b30'),(997,992,6,1,5,NULL,'2019-10-09 16:40:28','2019-10-09 16:40:28','38a30268-1c4e-4981-9d21-6ee4231fe65e'),(999,998,6,1,1,NULL,'2019-10-09 16:40:28','2019-10-09 16:40:28','943ba444-95b8-4cc7-8b74-b6323be3934c'),(1000,998,6,1,2,NULL,'2019-10-09 16:40:28','2019-10-09 16:40:28','01195bfc-295a-45e1-8df0-77a34c6f21f7'),(1001,998,6,1,3,NULL,'2019-10-09 16:40:28','2019-10-09 16:40:28','85da9434-9dd6-49b6-a906-e3672bbf6d78'),(1002,998,6,1,4,NULL,'2019-10-09 16:40:28','2019-10-09 16:40:28','6e358b1a-cdd1-426e-9fef-2e8cc1f169eb'),(1003,998,6,1,5,NULL,'2019-10-09 16:40:28','2019-10-09 16:40:28','9a861cf6-83f8-44c0-af76-22164cc3d119'),(1004,998,6,1,6,NULL,'2019-10-09 16:40:28','2019-10-09 16:40:28','d0d65377-f340-40a0-a2e2-85e7dc207189'),(1005,998,6,1,7,NULL,'2019-10-09 16:40:28','2019-10-09 16:40:28','2ec1a8ac-1577-4844-99c9-91c714ce3e67'),(1006,998,6,1,8,NULL,'2019-10-09 16:40:28','2019-10-09 16:40:28','c8b2f54f-045f-47b8-9b4a-4625e58bd607'),(1008,1007,6,1,1,NULL,'2019-10-09 16:40:28','2019-10-09 16:40:28','ecc57e5c-078f-4342-86bc-30c4bf7bdab6'),(1009,1007,6,1,2,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','178c57ac-bcea-4025-8148-69d260fe3d84'),(1010,1007,6,1,3,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','497566aa-8526-4175-ae00-11fc1cd97d39'),(1011,1007,6,1,4,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','5e281022-20c5-4466-9b48-d446eded25a8'),(1012,1007,6,1,5,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','bb9a31ff-9a6d-45e7-b897-d25ecfc269e7'),(1013,1007,6,1,6,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','b642880d-9b84-46c2-840f-b3f0e2825647'),(1014,1007,6,1,7,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','c293b0cc-f285-4acd-a265-5367e9026d36'),(1015,1007,6,1,8,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','ef001be8-e538-4937-927e-5f7251e4dee3'),(1017,1016,6,1,1,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','10867011-731d-4112-ba8c-9e3a35009a28'),(1018,1016,6,1,2,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','02e03e65-81ec-46dd-b5e9-1bb8ae02b28b'),(1019,1016,6,1,3,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','592baf0b-fe83-4778-96ce-1da308a6ee58'),(1020,1016,6,1,4,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','d083367d-1ea5-440b-a863-48851059ccb2'),(1022,1021,6,1,1,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','e2ecf95b-034a-4fbd-b5a9-5c583ad7eb01'),(1023,1021,6,1,2,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','3e0dfe6d-24f9-4525-af75-0b8409521566'),(1024,1021,6,1,3,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','89565442-ef63-45a8-80db-a9c1b20a8697'),(1025,1021,6,1,4,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','3744410e-14fa-4c61-8d0d-07b7e3a75ffa'),(1026,1021,6,1,5,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','5dc04646-aea2-43ee-acc6-ec561cbffbe4'),(1027,1021,6,1,6,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','850b5e50-0ffc-4c6c-86d9-48dcbd924566'),(1029,1028,6,1,1,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','2e212464-1755-4bb3-9352-59b9c917fdeb'),(1030,1028,6,1,2,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','13e89241-df3e-4c6e-b2bd-9b33b8d041ae'),(1031,1028,6,1,3,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','a474549e-7873-48bc-818b-b3fd6ef0efe9'),(1032,1028,6,1,4,NULL,'2019-10-09 16:40:29','2019-10-09 16:40:29','f0d38f7a-3f09-45a1-b254-b63501b93012'),(1034,1033,6,1,1,NULL,'2019-10-09 16:40:30','2019-10-09 16:40:30','3abbc157-2977-4d91-a7d5-6c58e2b1ac87'),(1035,1033,6,1,2,NULL,'2019-10-09 16:40:30','2019-10-09 16:40:30','30d58df9-f673-42c3-b834-95f328b2d938'),(1036,1033,6,1,3,NULL,'2019-10-09 16:40:30','2019-10-09 16:40:30','a973f776-f0f0-4837-9685-47375a399f99'),(1037,1033,6,1,4,NULL,'2019-10-09 16:40:30','2019-10-09 16:40:30','49eef995-516b-4ade-8cc0-b223a7eb72ed'),(1039,1038,6,1,1,NULL,'2019-10-09 16:40:30','2019-10-09 16:40:30','3b810021-65dd-400c-a2b1-d38eaf4af24c'),(1041,1040,6,1,1,NULL,'2019-10-09 16:40:30','2019-10-09 16:40:30','51186723-4324-4f49-9386-af2ee509e9a4'),(1042,1040,6,1,2,NULL,'2019-10-09 16:40:30','2019-10-09 16:40:30','2a44773f-a87a-4452-8d89-0f0dd0a0c7ce'),(1043,1040,6,1,3,NULL,'2019-10-09 16:40:30','2019-10-09 16:40:30','320c71d8-6d1f-4a57-8dca-2462a97431e2'),(1044,1040,6,1,4,NULL,'2019-10-09 16:40:30','2019-10-09 16:40:30','17e357c8-56b9-4f44-8541-71c196a8235a'),(1045,1040,6,1,5,NULL,'2019-10-09 16:40:30','2019-10-09 16:40:30','109730b5-3460-44c6-aff3-cacde2ed6681'),(1047,1046,6,1,1,NULL,'2019-10-09 16:40:30','2019-10-09 16:40:30','1d056f34-4615-4e61-a3fa-14ee221c204a'),(1048,1046,6,1,2,NULL,'2019-10-09 16:40:30','2019-10-09 16:40:30','062df990-c879-49cb-88cc-3e54a5c3477f'),(1049,1046,6,1,3,NULL,'2019-10-09 16:40:30','2019-10-09 16:40:30','f37f326d-1b26-49e5-957a-89dbc2ea9201'),(1050,1046,6,1,4,NULL,'2019-10-09 16:40:30','2019-10-09 16:40:30','47f5879c-c398-49c6-87b1-70873e2385e7'),(1052,1051,6,1,1,NULL,'2019-10-09 16:40:31','2019-10-09 16:40:31','5c051212-7315-477b-a6b2-84c758a3cc72'),(1053,1051,6,1,2,NULL,'2019-10-09 16:40:31','2019-10-09 16:40:31','ee8562a7-c2b0-484a-91fa-85dae0b75a7a'),(1054,1051,6,1,3,NULL,'2019-10-09 16:40:31','2019-10-09 16:40:31','c5dfeb6b-0f36-4ada-93e6-634174787550'),(1055,1051,6,1,4,NULL,'2019-10-09 16:40:31','2019-10-09 16:40:31','8658ac7a-67be-404e-82f2-a4fe36e4b34a'),(1056,1051,6,1,5,NULL,'2019-10-09 16:40:31','2019-10-09 16:40:31','57dbd448-8426-47ec-b875-abc1e0c8b6a4'),(1058,1057,6,1,1,NULL,'2019-10-09 16:40:31','2019-10-09 16:40:31','0f8331d6-e0c5-4da6-89db-c1c840b93877'),(1059,1057,6,1,2,NULL,'2019-10-09 16:40:31','2019-10-09 16:40:31','12cd6e04-0e63-482d-a8e3-06dc12d000a9'),(1060,1057,6,1,3,NULL,'2019-10-09 16:40:31','2019-10-09 16:40:31','3426f2c7-d627-43fc-8795-726a26c6b3e1'),(1061,1057,6,1,4,NULL,'2019-10-09 16:40:31','2019-10-09 16:40:31','1d24a66c-d99f-4d08-b113-fb454ac791ec'),(1132,1131,6,1,1,NULL,'2019-10-09 16:40:37','2019-10-09 16:40:37','23ff14b0-855c-4102-8a7b-449ee12e9575'),(1133,1131,6,1,2,NULL,'2019-10-09 16:40:37','2019-10-09 16:40:37','421866c6-7740-4d34-baab-c4a022cc85c6'),(1134,1131,6,1,3,NULL,'2019-10-09 16:40:37','2019-10-09 16:40:37','6a463ead-b0c5-4899-9ad3-5da095329170'),(1135,1131,6,1,4,NULL,'2019-10-09 16:40:37','2019-10-09 16:40:37','6a64987a-7642-447b-9e75-d7281a0132ab'),(1136,1131,6,1,5,NULL,'2019-10-09 16:40:37','2019-10-09 16:40:37','2c20c045-8908-4be0-8195-7d63fabd2aa9'),(1138,1137,6,1,1,NULL,'2019-10-09 16:40:37','2019-10-09 16:40:37','7f2d70ab-2d69-4ea6-a6b8-55993a9ca068'),(1139,1137,6,1,2,NULL,'2019-10-09 16:40:37','2019-10-09 16:40:37','cef5a5d1-133a-446f-ae07-56cb0fa47751'),(1140,1137,6,1,3,NULL,'2019-10-09 16:40:37','2019-10-09 16:40:37','86c5d653-d408-4362-ab82-687e846d4109'),(1141,1137,6,1,4,NULL,'2019-10-09 16:40:37','2019-10-09 16:40:37','ac762b91-6ead-4f68-a964-f88d29eae7f8'),(1143,1142,6,1,1,NULL,'2019-10-09 16:40:38','2019-10-09 16:40:38','d9741c53-2205-4584-81b8-18e65448b360'),(1145,1144,6,1,1,NULL,'2019-10-09 16:40:38','2019-10-09 16:40:38','4a8c7d58-2670-44b2-9576-337b119ce321'),(1147,1146,6,1,1,NULL,'2019-10-09 16:40:38','2019-10-09 16:40:38','e1a116c5-fd35-4058-93ec-bbf50dcda223'),(1148,1146,6,1,2,NULL,'2019-10-09 16:40:38','2019-10-09 16:40:38','7cebb498-be53-44e1-994a-7550b7280e5f'),(1149,1146,6,1,3,NULL,'2019-10-09 16:40:38','2019-10-09 16:40:38','e382fd37-d480-41c0-ba49-ca5b5fc4ff60'),(1150,1146,6,1,4,NULL,'2019-10-09 16:40:38','2019-10-09 16:40:38','30108320-8dde-4c18-a7aa-f793388f9af7'),(1151,1146,6,1,5,NULL,'2019-10-09 16:40:38','2019-10-09 16:40:38','5d7206d0-8606-4e74-a57c-2f93cfd76def'),(1153,1152,6,1,1,NULL,'2019-10-09 16:40:38','2019-10-09 16:40:38','f0f25d74-bc25-44bc-b455-9029c40c4a5e'),(1155,1154,6,1,1,NULL,'2019-10-09 16:40:38','2019-10-09 16:40:38','deb7ef59-b704-4e19-ac8b-e007ed817e97'),(1156,1154,6,1,2,NULL,'2019-10-09 16:40:38','2019-10-09 16:40:38','cc068668-f00b-4bbd-8b4d-eabeccfd5c01'),(1157,1154,6,1,3,NULL,'2019-10-09 16:40:38','2019-10-09 16:40:38','b76d5d89-b960-4928-93ae-80b6bd6bb68e'),(1158,1154,6,1,4,NULL,'2019-10-09 16:40:38','2019-10-09 16:40:38','4b8ad74a-e1de-42bd-b853-5727876cccb8'),(1160,1159,6,1,1,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','f8ea6ff9-645d-4450-a5dc-d9eb3737cebb'),(1161,1159,6,1,2,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','f0b20394-9ccc-4aba-ac9f-b3c88544a0b7'),(1162,1159,6,1,3,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','3192ec0c-8dcd-444d-be8b-996cb352b572'),(1163,1159,6,1,4,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','b97fc692-c649-4a17-a5c8-9729813ef7db'),(1164,1159,6,1,5,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','01d65999-6070-4325-9acc-64c345a87843'),(1165,1159,6,1,6,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','3bf82c29-5d77-48a7-946f-e6bdacad4757'),(1167,1166,6,1,1,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','f407ab79-c3a0-41f6-928a-31047e20d1da'),(1168,1166,6,1,2,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','8e35771d-7557-4415-91db-4b93380c51fe'),(1169,1166,6,1,3,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','8da73c3d-2324-4eee-9122-d6d7cc0e199a'),(1170,1166,6,1,4,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','dce1fdf3-de5f-4442-9d12-1868094a0eb1'),(1172,1171,6,1,1,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','1a258c84-4c85-424f-89e5-cb4d3e11892d'),(1173,1171,6,1,2,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','bc02ad91-6e88-42ab-97f3-49f8b4c2a3f4'),(1174,1171,6,1,3,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','e644b4fe-3555-4b7c-8780-b945310f0164'),(1175,1171,6,1,4,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','db080d77-f1ac-45bf-884f-0dd30f68f179'),(1176,1171,6,1,5,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','16c267fa-2a82-4055-84d7-42ef0eac54bf'),(1178,1177,6,1,1,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','480ec565-3794-425a-85f1-2783d8c8633e'),(1179,1177,6,1,2,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','7b17aaac-9793-4e1d-aa6f-a8005e45ffa5'),(1180,1177,6,1,3,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','b7cba3bd-0e50-48e2-adaf-44b5a2285c1e'),(1181,1177,6,1,4,NULL,'2019-10-09 16:40:39','2019-10-09 16:40:39','443b4486-aa9a-4c5b-8b25-25a4868a14cd'),(1182,1177,6,1,5,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','626df737-5290-4140-9ed9-5bdabb41c3ee'),(1184,1183,6,1,1,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','cd2edbb7-082d-47b7-a539-7c571ab649ce'),(1185,1183,6,1,2,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','81dd6f5e-35d7-4728-a51f-0dbddccb19a4'),(1186,1183,6,1,3,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','5ffb0fda-cd6c-4de5-88c5-0f1b94a9e3fc'),(1187,1183,6,1,4,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','76b4791c-afb8-4fd7-99c2-01dcaeba7409'),(1188,1183,6,1,5,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','86ef35c2-4c28-4499-ab02-32b7b0a1c832'),(1189,1183,6,1,6,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','9ca835d9-c99c-4fba-ad92-ce01159ab661'),(1190,1183,6,1,7,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','00293866-222f-4ad6-babe-6d79024b8a1a'),(1191,1183,6,1,8,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','7bd6aa05-ab30-4e47-bdf4-d92ddead359f'),(1193,1192,6,1,1,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','7cceff55-cb2f-4715-a258-f964ce89b32f'),(1194,1192,6,1,2,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','2ec648f2-d17b-4a9e-8cc2-d16d5b3dacc7'),(1195,1192,6,1,3,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','18ae225d-8221-4f05-aa87-5864064451a0'),(1196,1192,6,1,4,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','662e3843-d402-47ca-a6e6-fd74006ef403'),(1198,1197,6,1,1,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','73afa9e6-e369-4a91-a006-67dda77fe2b1'),(1199,1197,6,1,2,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','122a4250-2cfb-4229-8be0-b4763741416d'),(1200,1197,6,1,3,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','4fc0e5d5-5bd7-4ee9-8426-8116bca7bd2f'),(1201,1197,6,1,4,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','b8e25dc6-e32e-4f96-bc93-f5082d53c3cb'),(1202,1197,6,1,5,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','127d176a-5df6-4583-b0c7-f2bc921045c6'),(1203,1197,6,1,6,NULL,'2019-10-09 16:40:40','2019-10-09 16:40:40','73b67648-2e47-46d1-8cca-a42c240adfdb'),(1205,1204,6,1,1,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','0fb93fa0-eadc-4295-aba0-280b1e6773e8'),(1206,1204,6,1,2,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','7759d319-b72e-40a3-af05-547fae56677f'),(1207,1204,6,1,3,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','92d53a75-31fd-4695-ab5a-2a584d2fedff'),(1208,1204,6,1,4,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','59e38ec6-79ae-41f8-8633-60ed4376516b'),(1210,1209,6,1,1,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','d50d72b0-25c4-489e-9c64-25237f99e10b'),(1211,1209,6,1,2,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','431bdebb-8dc5-4972-a5ae-2f153a03f02e'),(1212,1209,6,1,3,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','fb347cba-8745-4213-beb4-fe03768b250b'),(1213,1209,6,1,4,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','8ce38312-9087-4f4d-af5f-da7ffc8e2982'),(1214,1209,6,1,5,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','a9cc7bca-528d-4d6c-9112-ab5b1adbd96e'),(1215,1209,6,1,6,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','421bd59c-67e9-4b5a-8970-05f97e35e208'),(1216,1209,6,1,7,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','1e1276dd-c372-4852-9631-27caf87cc1c3'),(1218,1217,6,1,1,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','4a1f61cd-fd22-44cc-a945-9f8964e4035d'),(1219,1217,6,1,2,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','991fe7dc-345d-4d9c-b5a7-7b0320a8dd06'),(1220,1217,6,1,3,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','d49c8083-adf4-4987-b9db-21ae4c4f19c1'),(1221,1217,6,2,4,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','26bd5b26-1472-4ae1-badb-39eb98e23f9f'),(1222,1217,6,2,5,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','2b690aaf-6200-472e-8b5f-5bb19f1710f1'),(1223,1217,6,2,6,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','9bdc9a0f-6eec-4dc7-99c8-e0757464c75f'),(1225,1224,6,1,1,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','f8742c2f-ecc1-48c1-a54d-a41577f94c16'),(1226,1224,6,1,2,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','a3c4488c-af4c-4ad4-9f44-02d6796c59bf'),(1227,1224,6,1,3,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','31656819-9fd5-4b60-9eb6-0e0a67ee14c7'),(1228,1224,6,1,4,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','1772b785-8144-49a0-bc80-a0c8dac153ab'),(1229,1224,6,1,5,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','a0b1ef9c-f8e8-42d7-bbf7-60d7676b3109'),(1230,1224,6,1,6,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','580bc5cb-5c0a-4846-9ce0-c88f97bbac47'),(1231,1224,6,1,7,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','65fc66be-9d53-4c6e-a5ae-4573c9bd23f2'),(1232,1224,6,2,8,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','76689f8a-8913-4831-96eb-b806de7d4604'),(1233,1224,6,2,9,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','ab711b24-49a8-4b41-baca-4d0a3476d3e9'),(1234,1224,6,2,10,NULL,'2019-10-09 16:40:41','2019-10-09 16:40:41','31079953-56c8-4dbe-b40a-a91ec75779c9'),(1236,1235,6,1,1,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','adbfdb5c-8cd5-4628-95ca-141265c132f1'),(1237,1235,6,1,2,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','7eb6819e-8082-4613-8038-cb45b11071de'),(1238,1235,6,1,3,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','a408454b-36c1-4933-90a4-0f4fe4d3a003'),(1239,1235,6,1,4,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','84f8163b-e106-4c0d-b6b0-f339a3c083f4'),(1240,1235,6,1,5,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','d33f42dc-53db-407d-8f4a-b874f1febfa7'),(1245,1244,6,1,1,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','eef13543-6ef1-4e9b-baaf-763c028a3f82'),(1246,1244,6,1,2,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','9a2af24f-36a6-456b-8523-6a4e2b72c57e'),(1247,1244,6,2,3,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','3605de66-88cb-4cd9-bae8-58dfcb5782df'),(1248,1244,6,2,4,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','650111cf-08b5-4bdf-8329-f8e066c27c6d'),(1249,1244,6,2,5,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','ec1547c9-7470-4901-bac4-f07d593f0a35'),(1250,1244,6,1,6,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','bd9ee7b1-9b20-4a81-8d1c-7ec0545a3520'),(1252,1251,6,1,1,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','4442ed01-2d05-4ba9-9dda-3cd0348c7c41'),(1253,1251,6,1,2,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','221d7592-e52e-4d2c-bdff-035f1b03df56'),(1254,1251,6,2,3,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','3c7b066e-72fa-417d-9c47-676dc787b9dd'),(1255,1251,6,2,4,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','b7844070-9f72-41f6-8ddb-bda048ecb4d3'),(1256,1251,6,2,5,NULL,'2019-10-09 16:40:42','2019-10-09 16:40:42','5e285fcf-7cfd-4254-a366-a4532a79aeaa'),(1257,1251,6,1,6,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','e68b9833-af05-4e03-9cab-a66ea522eb15'),(1259,1258,6,1,1,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','ac73ec1a-a54d-4fbc-8e18-2e9fda429d15'),(1260,1258,6,1,2,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','c4ffb12d-4862-4d86-a8ea-b5700dd03cab'),(1261,1258,6,1,3,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','99584fce-c6d3-4409-b7b1-8f5f67e0809c'),(1262,1258,6,1,4,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','dbac1752-c5d7-4e52-b74d-4de7f80602c6'),(1264,1263,6,1,1,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','15ac6571-274d-41ec-89ce-844679f19097'),(1265,1263,6,1,2,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','53bc48dc-a8f3-4258-bf72-ce5d1af714ca'),(1266,1263,6,1,3,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','dce13bf0-1604-4a3a-aa18-b05594afcfff'),(1267,1263,6,1,4,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','b6569d4e-653a-4619-a895-cfa7c4349112'),(1269,1268,6,1,1,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','1e5c0705-8e9b-4ce2-9834-7d09c311c5b1'),(1270,1268,6,1,2,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','35808c65-f29a-4bb6-b7af-7f3842bf17e4'),(1271,1268,6,1,3,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','038076aa-c38c-4371-bca9-39380c58b99a'),(1272,1268,6,1,4,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','c21b1895-e719-41c5-a609-b07c6b6257b4'),(1274,1273,6,1,1,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','b1459ac2-0743-42e9-bade-15666e677038'),(1275,1273,6,1,2,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','8cb73744-5df0-4eee-9f59-4e0f2222e318'),(1276,1273,6,1,3,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','125dfd54-c5ff-493c-9190-0ce8d05e3394'),(1277,1273,6,1,4,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','15fd44e3-7ba9-4bfa-ac93-dfefaecf5f8c'),(1279,1278,11,3,1,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','9641d5b9-ad83-47c9-a88f-e8c8bd860089'),(1280,1278,11,3,2,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','f1c6f360-7f91-401c-95fe-17b9f4a65375'),(1281,1278,11,3,3,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','0eaaf0d4-c2b3-4d42-a62b-45ce7adb9df7'),(1282,1278,11,3,4,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','f60445e9-6f19-4515-90de-e7d8695ead56'),(1283,1278,11,3,5,NULL,'2019-10-09 16:40:43','2019-10-09 16:40:43','e46048d9-0f9d-4ea7-9a9e-8cadf5109911'),(1414,1413,6,1,1,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','2ba24ef3-24c7-486a-98eb-9820be68a64b'),(1415,1413,6,1,2,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','6bbbee94-578e-4211-8791-8f494c4c22da'),(1416,1413,6,1,3,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','0c50b5a9-4659-4e02-a2b3-1f21dd5ea234'),(1417,1413,6,1,4,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','149319a2-f495-46bd-894f-3da7bcef7f76'),(1418,1413,6,1,5,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','44f01af9-3d5f-435e-bf85-52e4514460ea'),(1420,1419,6,1,1,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','789a3fa1-60c2-4bd7-a2ed-149e429477bf'),(1421,1419,6,1,2,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','6b60f65b-4eee-499a-8be4-87eeb10c3d94'),(1422,1419,6,1,3,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','cf22549e-1aa9-46cb-a43a-e77521ae4e7d'),(1423,1419,6,1,4,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','a3a9bdaf-3b56-4687-80cb-9ba651f65753'),(1425,1424,6,1,1,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','7559ba53-9b69-40d0-8cd7-c1c77d2f2983'),(1427,1426,6,1,1,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','4bff6c92-d415-4b29-a2d3-65c19276d4f6'),(1429,1428,6,1,1,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','91cdaa14-1020-44b6-b6ea-8ddab86610e2'),(1430,1428,6,1,2,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','e7d42d37-156d-4aaa-8fc6-c9489cf53ec8'),(1431,1428,6,1,3,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','11a87244-e031-4c97-86c8-d8c183aac1a5'),(1432,1428,6,1,4,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','edfcf4f4-bfe6-43fc-9450-8f07112590a3'),(1433,1428,6,1,5,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','1921dede-aeca-4d6d-84ed-d62f6231f0f9'),(1435,1434,6,1,1,NULL,'2019-10-09 16:40:49','2019-10-09 16:40:49','85c8dbd9-f608-46ce-98c6-ca1b1802d19c'),(1437,1436,6,1,1,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','74149d7e-f5ac-4bfc-ba53-3b7fea2a784c'),(1438,1436,6,1,2,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','479f4c6f-0828-4a28-8292-cf2ad7875789'),(1439,1436,6,1,3,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','fc676ca6-a21d-40ea-b0aa-5e1085dae53f'),(1440,1436,6,1,4,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','bb5ac65e-5f3a-4d5c-b741-5c5d718e0c11'),(1442,1441,6,1,1,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','882a5f3d-e155-4795-bfcd-902ab6741cd7'),(1443,1441,6,1,2,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','73b0288b-fa88-449b-8b59-646475be3831'),(1444,1441,6,1,3,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','da8c52f5-adfa-43c4-b6e0-b9d0e4c9d630'),(1445,1441,6,1,4,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','f2a4a02f-45a2-4c13-948d-1ea7d8f8d6fa'),(1446,1441,6,1,5,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','77917aa5-dbe6-4367-9d06-0d3852a36e81'),(1447,1441,6,1,6,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','5efb58e1-2557-4350-833e-482654e47fb1'),(1449,1448,6,1,1,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','5a861a79-e7c4-4bdb-8d83-39d7421441fc'),(1450,1448,6,1,2,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','58cdd45d-7321-40d1-bdb6-dd4d94206c2f'),(1451,1448,6,1,3,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','e76171c1-657c-476d-b929-61a30525ad66'),(1452,1448,6,1,4,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','e47f8042-a595-47e3-bb29-37f365c7ec9c'),(1454,1453,6,1,1,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','f5b655e1-360c-40af-9e53-e5de20f9183e'),(1455,1453,6,1,2,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','5b27071c-9537-4f9b-a792-401ea3f65a0f'),(1456,1453,6,1,3,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','72f06497-63d8-4de5-b424-df1cd029f219'),(1457,1453,6,1,4,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','a77480ee-bb1f-4676-8e9a-1e916ebcf2d9'),(1458,1453,6,1,5,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','87125147-1e3e-4f59-94d0-ffe3d11ae5fe'),(1460,1459,6,1,1,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','c6f0417d-2b73-408c-82ed-3010937de583'),(1461,1459,6,1,2,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','c6bd5105-eac6-4b30-aae2-b6c441b8ba07'),(1462,1459,6,1,3,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','7beb06d5-a04e-406b-996f-e0a3f33276ec'),(1463,1459,6,1,4,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','4fef4821-14cb-4572-81de-77b76016e2cf'),(1464,1459,6,1,5,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','f1635d2c-34d0-4dfa-be91-37696739b7ef'),(1466,1465,6,1,1,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','140ab793-fbab-46c2-bfc1-e2cd7b0a10d6'),(1467,1465,6,1,2,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','4908c359-47e4-470e-8549-0ec8fa42b530'),(1468,1465,6,1,3,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','525f0fae-8efb-44d4-9251-75e2049e9d24'),(1469,1465,6,1,4,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','5277aac3-a651-45e3-b628-072648c371ab'),(1470,1465,6,1,5,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','980f072c-2fce-4746-8019-559bd1ac291d'),(1471,1465,6,1,6,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','200491af-d431-4cd5-96c9-fe9492bf4943'),(1472,1465,6,1,7,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','6680839a-d591-4c45-8644-1b8e4323a0cd'),(1473,1465,6,1,8,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','535d22ae-e24c-402c-97eb-ff2e2145562c'),(1475,1474,6,1,1,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','7bc385e6-5a9d-4435-9b31-cfd16ead1488'),(1476,1474,6,1,2,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','ab158bf0-6845-4370-a342-622b201eb7a9'),(1477,1474,6,1,3,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','e510ffd0-2a7d-4974-975d-38f4d39cc33c'),(1478,1474,6,1,4,NULL,'2019-10-09 16:40:50','2019-10-09 16:40:50','f4ad1b03-cafc-4309-8aa7-7d67c712817a'),(1480,1479,6,1,1,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','e17098a0-d720-441d-b691-c4c950438f94'),(1481,1479,6,1,2,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','aa1ec642-efc5-4049-8f6e-c0b88cf6f208'),(1482,1479,6,1,3,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','91751d56-d551-40d5-a4cb-905698ee9ef3'),(1483,1479,6,1,4,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','0c737d96-c233-4fb5-8a6e-48bf56d406f4'),(1484,1479,6,1,5,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','0ed836ec-6bcc-4a96-b50d-637a04641fc0'),(1485,1479,6,1,6,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','2a11525f-152a-496b-b81e-c81667c769a5'),(1487,1486,6,1,1,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','b516ccf2-e735-40b4-bb09-720aca1c23b9'),(1488,1486,6,1,2,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','86ed3336-3394-4162-9625-1399d02b2e2b'),(1489,1486,6,1,3,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','3ac27a15-7cb6-40d7-b482-ec487bbcd8dc'),(1490,1486,6,1,4,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','9eb02f4b-aa60-4b82-a2b1-8d482652f6f8'),(1492,1491,6,1,1,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','f132b9c5-0877-4afc-8938-a840f3157359'),(1493,1491,6,1,2,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','c0f0a1f4-5ce0-4003-a765-6e3a4c2a7732'),(1494,1491,6,1,3,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','afb77589-5d4c-4341-9799-65522d8d862d'),(1495,1491,6,1,4,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','5d521c2a-4315-44e0-a209-4f84a61e5e17'),(1496,1491,6,1,5,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','623d3a3b-56d9-44cb-8a59-4935d4137b6d'),(1497,1491,6,1,6,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','26279dfc-14c0-4b3e-b369-199551c0042a'),(1498,1491,6,1,7,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','4e969728-545d-423a-bace-16f9a30f7db7'),(1500,1499,6,1,1,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','378b23b8-e07f-4e19-92c3-5dfe2ef33b65'),(1501,1499,6,1,2,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','3a8e717a-00d7-404a-91cb-af7df950bb70'),(1502,1499,6,1,3,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','b5281d67-34d5-473d-be74-dbe66dc3c1f6'),(1503,1499,6,2,4,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','e0f1e966-94ae-43f1-a195-09677272b772'),(1504,1499,6,2,5,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','2ec21735-f3f5-4975-8001-970cd7bc1d81'),(1505,1499,6,2,6,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','32be554f-5ce8-43e4-905f-6a7e7b8e2584'),(1507,1506,6,1,1,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','c9b03c3a-8828-42a2-bb71-ba91e3176c59'),(1508,1506,6,1,2,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','86bc9293-6a2b-4ede-88e3-44313d606926'),(1509,1506,6,1,3,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','dd2fc51a-3755-4e1e-8213-28f4582cc628'),(1510,1506,6,1,4,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','d095d64d-f606-4133-a2b9-d0a940975fb9'),(1511,1506,6,1,5,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','36228ca8-36ae-4be4-b207-32754b9ac459'),(1512,1506,6,1,6,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','365940c2-bb65-4298-a0d9-68896acabbf9'),(1513,1506,6,1,7,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','d3cb570a-a78a-4ba2-af5b-d08c30a842b3'),(1514,1506,6,2,8,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','d3055897-88ce-40f5-938d-733472b33ebf'),(1515,1506,6,2,9,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','a76b5f55-c683-49a5-adcc-45c00e7e2cf7'),(1516,1506,6,2,10,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','cdb88bc9-d0ad-485a-ab46-839d40d793c8'),(1518,1517,6,1,1,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','6bc043e9-3721-4ba3-98cc-f86da587958e'),(1519,1517,6,1,2,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','c992dede-cab8-4a85-bcbe-a0faf906bf3a'),(1520,1517,6,1,3,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','25eea939-2f89-4d76-91b8-c6e5fa12f5f5'),(1521,1517,6,1,4,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','a8ebb1b6-fd5c-4c10-84b2-ef28a1c9c7da'),(1522,1517,6,1,5,NULL,'2019-10-09 16:40:51','2019-10-09 16:40:51','7bb58aa4-4f35-4695-bd64-9dcd6b3c1382'),(2024,2023,11,3,1,NULL,'2019-10-09 16:41:23','2019-10-09 16:41:23','0b059e86-d92f-4a9a-825e-31a72d82725c'),(2025,2023,11,3,2,NULL,'2019-10-09 16:41:23','2019-10-09 16:41:23','751a4126-b8a8-419b-a673-7d11b30ce415'),(2026,2023,11,3,3,NULL,'2019-10-09 16:41:23','2019-10-09 16:41:23','d4b20322-f43e-452c-bc4f-36b44d2c1b4f'),(2027,2023,11,3,4,NULL,'2019-10-09 16:41:23','2019-10-09 16:41:23','05b06499-3a6b-445b-bb42-a1445a47033d'),(2028,2023,11,3,5,NULL,'2019-10-09 16:41:23','2019-10-09 16:41:23','15f84f3c-4f98-4492-a63b-047194238e16'),(2031,2030,11,3,1,NULL,'2019-10-09 16:41:24','2019-10-09 16:41:24','3d333cf8-3a25-4165-865e-17400a329e24'),(2032,2030,11,3,2,NULL,'2019-10-09 16:41:24','2019-10-09 16:41:24','d484d5d6-bfd7-42b1-9b82-b238483a825c'),(2033,2030,11,3,3,NULL,'2019-10-09 16:41:24','2019-10-09 16:41:24','a9c83c63-e1a1-4903-b6a2-b5827d58f26b'),(2034,2030,11,3,4,NULL,'2019-10-09 16:41:24','2019-10-09 16:41:24','55d8e6da-b033-443f-9dc1-9c17691da85a'),(2035,2030,11,3,5,NULL,'2019-10-09 16:41:24','2019-10-09 16:41:24','3e5a824c-8d01-41ab-8976-03b24de9a224'),(2037,2036,11,3,1,NULL,'2019-10-09 16:41:24','2019-10-09 16:41:24','8498f67d-ef14-46e4-b4b2-55e9525b2674'),(2038,2036,11,3,2,NULL,'2019-10-09 16:41:24','2019-10-09 16:41:24','eccca98c-a641-4939-b78c-9a48a2b03797'),(2039,2036,11,3,3,NULL,'2019-10-09 16:41:24','2019-10-09 16:41:24','ed12a611-99ff-48bb-90e2-1bb43cc92bf5'),(2040,2036,11,3,4,NULL,'2019-10-09 16:41:24','2019-10-09 16:41:24','6ab2913f-3e55-4f61-960c-03231913f9ba'),(2041,2036,11,3,5,NULL,'2019-10-09 16:41:24','2019-10-09 16:41:24','648c9b79-71fb-4c0d-9d7c-cd22959e1b14'),(2048,2047,11,3,1,NULL,'2020-03-18 20:02:26','2020-03-18 20:02:26','e1ffb955-a813-4c69-992d-2a635feb7d3d'),(2049,2047,11,3,2,NULL,'2020-03-18 20:02:26','2020-03-18 20:02:26','470f351a-bc06-4822-b2e0-31c6bed0d609'),(2050,2047,11,3,3,NULL,'2020-03-18 20:02:27','2020-03-18 20:02:27','2d54e36a-ecf0-422d-bef9-e0d70eea03f8'),(2051,2047,11,3,4,NULL,'2020-03-18 20:02:27','2020-03-18 20:02:27','53fb9090-5af0-45e4-a7bb-bfe4906006d4'),(2052,2047,11,3,5,NULL,'2020-03-18 20:02:27','2020-03-18 20:02:27','943ab32c-a55f-45f6-abcf-71aa1c00aec1'),(2063,2062,11,3,1,NULL,'2020-08-10 21:12:18','2020-08-10 21:12:18','4bff5447-0c9c-48de-a8cf-d63aeeeab4a1'),(2064,2062,11,3,2,NULL,'2020-08-10 21:12:18','2020-08-10 21:12:18','a7c566bf-30ee-4637-b0ad-3ec6b7d51963'),(2065,2062,11,3,3,NULL,'2020-08-10 21:12:18','2020-08-10 21:12:18','5c417413-6eda-49c9-a9ea-356903fa219e'),(2066,2062,11,3,4,NULL,'2020-08-10 21:12:18','2020-08-10 21:12:18','0d53419c-69b4-4195-b6bd-150ed26cc4a9'),(2067,2062,11,3,5,NULL,'2020-08-10 21:12:18','2020-08-10 21:12:18','2cc02e93-e59f-45ce-8a30-60f244fd74c8'),(2071,2070,11,3,1,NULL,'2020-08-10 21:12:19','2020-08-10 21:12:19','a6bacc57-4c05-4c24-af76-d35b04c723a0'),(2072,2070,11,3,2,NULL,'2020-08-10 21:12:19','2020-08-10 21:12:19','31076d54-9ad1-4ee5-9df1-b71656d41f02'),(2073,2070,11,3,3,NULL,'2020-08-10 21:12:19','2020-08-10 21:12:19','7a39fe20-2911-4527-8694-2f2254576ed2'),(2074,2070,11,3,4,NULL,'2020-08-10 21:12:19','2020-08-10 21:12:19','cf6d0087-cbfe-4cbe-9f8a-6e9189be02a1'),(2075,2070,11,3,5,NULL,'2020-08-10 21:12:19','2020-08-10 21:12:19','2e10b92c-b9af-4be8-b429-b092325337c6'),(2080,2079,11,3,1,NULL,'2021-02-19 17:56:59','2021-02-19 17:56:59','f03d608a-98d9-44d8-b5f7-7c01b152f3f0'),(2081,2079,11,3,2,NULL,'2021-02-19 17:56:59','2021-02-19 17:56:59','eef6d615-9bd3-4502-880d-aa10244f57a9'),(2082,2079,11,3,3,NULL,'2021-02-19 17:56:59','2021-02-19 17:56:59','e4fc3a96-bfe7-4630-8714-07e518849b5c'),(2083,2079,11,3,4,NULL,'2021-02-19 17:56:59','2021-02-19 17:56:59','4e317177-54c6-4a03-b3d5-1988ae12e7f1'),(2084,2079,11,3,5,NULL,'2021-02-19 17:56:59','2021-02-19 17:56:59','9c31f0e5-d416-4a3e-ac7f-e531569a8cf8'),(2109,2108,11,3,1,NULL,'2022-01-15 13:49:05','2022-01-15 13:49:05','fa9bce39-f10c-4290-b205-6c5fd31f352c'),(2110,2108,11,3,2,NULL,'2022-01-15 13:49:05','2022-01-15 13:49:05','8fc08975-14e3-4e12-b46e-4e0990408a2e'),(2111,2108,11,3,3,NULL,'2022-01-15 13:49:05','2022-01-15 13:49:05','b4daf103-cfa5-4b62-91b3-c11b4dc943a9'),(2112,2108,11,3,4,NULL,'2022-01-15 13:49:05','2022-01-15 13:49:05','eae686d8-a100-4aa5-a710-582a01113e3e'),(2113,2108,11,3,5,NULL,'2022-01-15 13:49:05','2022-01-15 13:49:05','7920f7de-712c-4429-8fcb-bee028954727'),(2122,2121,11,3,1,NULL,'2022-01-15 13:52:53','2022-01-15 13:52:53','999715df-2a3f-4414-96de-b4467913c9c2'),(2123,2121,11,3,2,NULL,'2022-01-15 13:52:53','2022-01-15 13:52:53','3679fe1d-54d4-4b0f-966d-b03f32c10e58'),(2124,2121,11,3,3,NULL,'2022-01-15 13:52:53','2022-01-15 13:52:53','2df9bbb7-422d-4036-9481-ddcf7c80bb6f'),(2125,2121,11,3,4,NULL,'2022-01-15 13:52:53','2022-01-15 13:52:53','5562742a-f1b1-49ed-8918-73a031d7b542'),(2126,2121,11,3,5,NULL,'2022-01-15 13:52:53','2022-01-15 13:52:53','78b6ea70-a962-4395-bb53-4da54e00393d'),(2135,2134,11,3,1,NULL,'2022-01-15 13:54:37','2022-01-15 13:54:37','13e85e99-c803-40f3-86bb-9e88e4c21916'),(2136,2134,11,3,2,NULL,'2022-01-15 13:54:37','2022-01-15 13:54:37','5adcaab1-65cb-445d-8ba7-4fb1a0d9cf19'),(2137,2134,11,3,3,NULL,'2022-01-15 13:54:37','2022-01-15 13:54:37','f495ae16-dd38-40ae-b8fd-d24806834acd'),(2138,2134,11,3,4,NULL,'2022-01-15 13:54:37','2022-01-15 13:54:37','b070ffbc-f8a1-4b73-94a2-413dbc4497b0'),(2139,2134,11,3,5,NULL,'2022-01-15 13:54:37','2022-01-15 13:54:37','11dfe357-9c5c-4a66-88c0-7fe1bedeb67b'),(2190,2189,6,1,1,NULL,'2022-01-18 03:21:07','2022-01-18 03:21:07','a34df2fd-e2ae-4700-9cef-a996925f7d20'),(2191,2189,6,1,2,NULL,'2022-01-18 03:21:07','2022-01-18 03:21:07','fbe51d83-7842-4ffa-b09d-504a61e67442'),(2192,2189,6,1,3,NULL,'2022-01-18 03:21:07','2022-01-18 03:21:07','916db93c-4986-4375-b977-6545c0aaeed9'),(2193,2189,6,1,4,NULL,'2022-01-18 03:21:07','2022-01-18 03:21:07','74403669-2744-4188-92e1-976bea7e37ab'),(2200,2199,6,1,1,NULL,'2022-01-18 03:21:21','2022-01-18 03:21:21','fbb78884-4ea5-4575-956b-92eb63d30be9'),(2201,2199,6,1,2,NULL,'2022-01-18 03:21:21','2022-01-18 03:21:21','1ee9454e-2623-489c-b8da-664da8e3ff90'),(2202,2199,6,1,3,NULL,'2022-01-18 03:21:21','2022-01-18 03:21:21','aa92237b-8602-458a-944d-39d44e0d058e'),(2203,2199,6,1,4,NULL,'2022-01-18 03:21:21','2022-01-18 03:21:21','7202a7f4-cd93-4186-b3e7-180f1a3b38ac'),(2214,2213,6,1,1,NULL,'2022-01-18 03:21:32','2022-01-18 03:21:32','fa179a64-a578-4c40-8099-b61c39fcf84a'),(2215,2213,6,1,2,NULL,'2022-01-18 03:21:32','2022-01-18 03:21:32','a9c05dc5-532e-46eb-9943-a10c78e75f94'),(2216,2213,6,1,3,NULL,'2022-01-18 03:21:32','2022-01-18 03:21:32','bb75a927-46d8-47af-935b-3a37e6cecf89'),(2217,2213,6,1,4,NULL,'2022-01-18 03:21:32','2022-01-18 03:21:32','0fe2aa6f-a06e-4581-bf5b-8e7d1bc1971a'),(2218,2213,6,1,5,NULL,'2022-01-18 03:21:32','2022-01-18 03:21:32','983489f9-e817-491b-a385-60db271154c7'),(2219,2213,6,1,6,NULL,'2022-01-18 03:21:32','2022-01-18 03:21:32','27acb239-b9fc-4cfa-a6d1-737a07d288c2'),(2220,2213,6,1,7,NULL,'2022-01-18 03:21:32','2022-01-18 03:21:32','159c01f2-0da6-45c7-8f18-b35d54f91d44'),(2221,2213,6,1,8,NULL,'2022-01-18 03:21:32','2022-01-18 03:21:32','b12b3ebe-2c18-4e15-bbf8-818f909cb21a'),(2230,2229,6,1,1,NULL,'2022-01-18 03:21:46','2022-01-18 03:21:46','938099b9-24fb-4c50-adc4-ed1404b206ac'),(2231,2229,6,1,2,NULL,'2022-01-18 03:21:46','2022-01-18 03:21:46','1cabcd3c-ed54-4d10-9b1f-678445881c87'),(2232,2229,6,1,3,NULL,'2022-01-18 03:21:46','2022-01-18 03:21:46','5e2dfaf5-22fb-49c4-ba00-1a6e3ddf6829'),(2233,2229,6,1,4,NULL,'2022-01-18 03:21:46','2022-01-18 03:21:46','e77c5d7d-6394-47f5-9d92-c9ab4a80155f'),(2234,2229,6,1,5,NULL,'2022-01-18 03:21:46','2022-01-18 03:21:46','3b941c1d-d1b2-4104-a01f-b7ddbefb8ebe'),(2235,2229,6,1,6,NULL,'2022-01-18 03:21:46','2022-01-18 03:21:46','6c79998a-e480-4410-95ba-ad64142b7991'),(2243,2242,6,1,1,NULL,'2022-01-18 03:22:01','2022-01-18 03:22:01','3c135c14-a54a-4fda-8cc4-d11d307cb21a'),(2244,2242,6,1,2,NULL,'2022-01-18 03:22:01','2022-01-18 03:22:01','ee4a2ca0-c7a5-4777-9486-1f1db20bae93'),(2245,2242,6,1,3,NULL,'2022-01-18 03:22:01','2022-01-18 03:22:01','47d3ce0f-9d7b-4bfb-8cfd-c186718ae693'),(2246,2242,6,1,4,NULL,'2022-01-18 03:22:01','2022-01-18 03:22:01','05d1ed55-497e-437d-9036-9a9e89dad59f'),(2247,2242,6,1,5,NULL,'2022-01-18 03:22:01','2022-01-18 03:22:01','5dbfe362-22f4-4278-bc01-ea4a783ba626'),(2260,2259,6,1,1,NULL,'2022-01-18 03:23:33','2022-01-18 03:23:33','e91a0b50-ddc9-40e5-8675-bc80ba0a4f28'),(2261,2259,6,1,2,NULL,'2022-01-18 03:23:33','2022-01-18 03:23:33','613ee8f6-7873-470c-85cf-b4ff4cae655b'),(2262,2259,6,1,3,NULL,'2022-01-18 03:23:33','2022-01-18 03:23:33','dca3851e-c4e9-4ce1-97b6-59de710ba02b'),(2263,2259,6,1,4,NULL,'2022-01-18 03:23:33','2022-01-18 03:23:33','d025ccd4-d9e2-4756-9ae6-4eeb1ebb3310'),(2271,2270,6,1,1,NULL,'2022-01-18 18:17:34','2022-01-18 18:17:34','2a06f297-8cf3-49dc-a4f0-2dbe84b2b29f'),(2272,2270,6,1,2,NULL,'2022-01-18 18:17:34','2022-01-18 18:17:34','5b3e4bfa-c933-4d76-abd9-5153bb673dd3'),(2273,2270,6,1,3,NULL,'2022-01-18 18:17:34','2022-01-18 18:17:34','22665336-9322-458c-b516-701d23909066'),(2274,2270,6,1,4,NULL,'2022-01-18 18:17:34','2022-01-18 18:17:34','6dafeabe-03f2-4d1f-ac8c-22df179c4c82'),(2275,2270,6,1,5,NULL,'2022-01-18 18:17:34','2022-01-18 18:17:34','9e7f5acf-82b3-4f48-9e2d-c6ddda7a7e39'),(2276,2270,6,1,6,NULL,'2022-01-18 18:17:34','2022-01-18 18:17:34','1588c7fb-f5ee-4f4e-9733-98a048715a2c'),(2277,2270,6,1,7,NULL,'2022-01-18 18:17:34','2022-01-18 18:17:34','30fddc6a-698b-480c-a5c0-9e43e8ea0cbd'),(2278,2270,6,2,8,NULL,'2022-01-18 18:17:34','2022-01-18 18:17:34','0b809277-8bd7-4c5c-9b9f-b8eb47d6d72d'),(2279,2270,6,2,9,NULL,'2022-01-18 18:17:34','2022-01-18 18:17:34','0e4d6197-95de-4310-b0a5-3726d5436f58'),(2280,2270,6,2,10,NULL,'2022-01-18 18:17:34','2022-01-18 18:17:34','f89c154e-ff95-4a17-b883-ef8123014803'),(2451,2450,11,3,1,NULL,'2022-11-16 21:26:00','2022-11-16 21:26:00','8793f7fc-1718-4dd6-af80-cca65b16a9f0'),(2452,2450,11,3,2,NULL,'2022-11-16 21:26:00','2022-11-16 21:26:00','14e1696a-e313-4a96-a881-89093cb4886e'),(2453,2450,11,3,3,NULL,'2022-11-16 21:26:00','2022-11-16 21:26:00','2a52457e-be6c-4893-82b3-2747d6a514c0'),(2454,2450,11,3,4,NULL,'2022-11-16 21:26:00','2022-11-16 21:26:00','42dc3c44-30cb-4186-b193-f8e46954351a'),(2455,2450,11,3,5,NULL,'2022-11-16 21:26:00','2022-11-16 21:26:00','520b7623-f18b-440e-b7e4-7e71af802362'),(2464,2463,11,3,1,NULL,'2022-11-16 21:27:31','2022-11-16 21:27:31','99077c01-d10f-4786-9a99-bbb78ef1c214'),(2465,2463,11,3,2,NULL,'2022-11-16 21:27:31','2022-11-16 21:27:31','a286601b-e698-4067-bd48-4d0bb70c5bd7'),(2466,2463,11,3,3,NULL,'2022-11-16 21:27:31','2022-11-16 21:27:31','3ba1b75b-bf5d-426d-bfee-d5e0e73d02c3'),(2467,2463,11,3,4,NULL,'2022-11-16 21:27:31','2022-11-16 21:27:31','509fe102-1e6a-4d49-b179-4db19f1a190f'),(2468,2463,11,3,5,NULL,'2022-11-16 21:27:31','2022-11-16 21:27:31','5562d19f-9c30-4fe4-a541-96b30cc70161'),(2640,2477,20,5,1,NULL,'2023-01-26 15:55:05','2023-01-26 15:55:05','881d4094-fb6f-4271-97de-a8ec5f62347f'),(2641,2477,20,4,2,NULL,'2023-01-26 15:55:05','2023-01-26 15:55:05','c8a5bb98-f194-4fda-a9b7-0748b610a93e'),(2642,2477,20,5,3,NULL,'2023-01-26 15:55:05','2023-01-26 15:55:05','33901240-5d69-432b-8319-21613f0b14cd'),(2643,2477,20,4,4,NULL,'2023-01-26 15:55:05','2023-01-26 15:55:05','95fecfa9-6c36-4506-afec-19e9ed15447e'),(2644,2477,20,5,5,NULL,'2023-01-26 15:55:05','2023-01-26 15:55:05','0c5ac72d-a8b9-4fb6-a58c-360da642dd0e'),(2645,2477,20,4,6,NULL,'2023-01-26 15:55:05','2023-01-26 15:55:05','10a52f92-e517-4dad-933d-6839c9fe48bb'),(2646,2477,20,5,7,NULL,'2023-01-26 15:55:05','2023-01-26 15:55:05','27288897-a310-4044-88eb-e74d189160b5'),(2772,2266,20,5,1,NULL,'2023-01-26 22:35:53','2023-01-26 22:35:53','9ec19913-49f6-49fe-b794-bd1e9fecbd61'),(2773,2266,20,4,2,NULL,'2023-01-26 22:35:53','2023-01-26 22:35:53','0272c218-3e4d-4049-af0a-0d3cceac60ac'),(2774,2266,20,5,3,NULL,'2023-01-26 22:35:53','2023-01-26 22:35:53','1712040f-f8e1-45f1-aec5-ca2aa04fc3d5'),(2775,2266,20,4,4,NULL,'2023-01-26 22:35:53','2023-01-26 22:35:53','8fe20b33-db4e-45c4-9c5d-5bc759aa8658'),(2776,2266,20,5,5,NULL,'2023-01-26 22:35:53','2023-01-26 22:35:53','dc0af82b-3396-43e1-9e64-b4417f9c99df'),(2777,2266,20,4,6,NULL,'2023-01-26 22:35:53','2023-01-26 22:35:53','d3cb40de-c2cb-4aca-b88b-8782dc0ceec0'),(2778,2266,20,5,7,NULL,'2023-01-26 22:35:53','2023-01-26 22:35:53','da22eea0-e122-470b-8bf0-9465a20fb971'),(2780,2779,20,5,1,NULL,'2023-01-26 22:35:53','2023-01-26 22:35:53','0affe1e6-448a-4e94-8ccc-8d67f7d765ce'),(2781,2779,20,4,2,NULL,'2023-01-26 22:35:53','2023-01-26 22:35:53','6b267df5-0208-4678-b5e8-74f453106d48'),(2782,2779,20,5,3,NULL,'2023-01-26 22:35:53','2023-01-26 22:35:53','91852ca9-1250-4956-9662-23d540ce6894'),(2783,2779,20,4,4,NULL,'2023-01-26 22:35:53','2023-01-26 22:35:53','419d21c1-3495-4d0f-9fad-91d06500bb04'),(2784,2779,20,5,5,NULL,'2023-01-26 22:35:53','2023-01-26 22:35:53','172ff7be-df6e-4e80-8f40-a634a3eac5f6'),(2785,2779,20,4,6,NULL,'2023-01-26 22:35:53','2023-01-26 22:35:53','3599f70b-61df-4f2a-9182-ce56cc58e229'),(2786,2779,20,5,7,NULL,'2023-01-26 22:35:53','2023-01-26 22:35:53','37f151ff-9018-4fee-a267-3d370f719693'),(2796,2795,20,5,1,NULL,'2023-01-26 22:36:56','2023-01-26 22:36:56','2a3ed3fa-8023-497b-98a5-68bb906ee80f'),(2797,2795,20,4,2,NULL,'2023-01-26 22:36:56','2023-01-26 22:36:56','44f9c794-031e-482e-bee1-10a316115407'),(2798,2795,20,5,3,NULL,'2023-01-26 22:36:56','2023-01-26 22:36:56','75da9e08-6995-4b34-ba90-51057c42e380'),(2799,2795,20,4,4,NULL,'2023-01-26 22:36:56','2023-01-26 22:36:56','03bf559d-20e3-4e5d-98bd-0de56ae7a497'),(2800,2795,20,5,5,NULL,'2023-01-26 22:36:56','2023-01-26 22:36:56','7b78574b-6724-49d4-90e9-0500c49de921'),(2801,2795,20,4,6,NULL,'2023-01-26 22:36:57','2023-01-26 22:36:57','509edd6c-3f7d-41e5-bb2a-a038f634bc01'),(2802,2795,20,5,7,NULL,'2023-01-26 22:36:57','2023-01-26 22:36:57','0fc5b4ea-a5b6-4103-9323-b90b4bbcedde'),(2812,2811,20,5,1,NULL,'2023-01-26 22:37:15','2023-01-26 22:37:15','5f0d1161-a633-4644-a290-0a2b6675f7b5'),(2813,2811,20,4,2,NULL,'2023-01-26 22:37:15','2023-01-26 22:37:15','ca5d74f0-2a67-4288-801e-f7db6c7f46a6'),(2814,2811,20,5,3,NULL,'2023-01-26 22:37:15','2023-01-26 22:37:15','d07c3a44-970f-4eb1-af3f-02550f2fb2a2'),(2815,2811,20,4,4,NULL,'2023-01-26 22:37:15','2023-01-26 22:37:15','ee94728f-437b-4126-b438-c2f9f1f7f270'),(2816,2811,20,5,5,NULL,'2023-01-26 22:37:15','2023-01-26 22:37:15','c28b6458-b3ab-42c1-af0f-9504bd397658'),(2817,2811,20,4,6,NULL,'2023-01-26 22:37:15','2023-01-26 22:37:15','43ede36a-f4f5-4914-a722-940adf2c0779'),(2818,2811,20,5,7,NULL,'2023-01-26 22:37:15','2023-01-26 22:37:15','053adb94-fb59-420a-9398-58c0079efc87'),(2828,2827,20,5,1,NULL,'2023-01-26 22:38:04','2023-01-26 22:38:04','72751748-2afd-456c-ba02-98e7f3edd811'),(2829,2827,20,4,2,NULL,'2023-01-26 22:38:04','2023-01-26 22:38:04','5a735665-1982-4194-b627-23061501bdae'),(2830,2827,20,5,3,NULL,'2023-01-26 22:38:04','2023-01-26 22:38:04','a45ea226-6d29-45bf-8f7c-72f4f7841ee7'),(2831,2827,20,4,4,NULL,'2023-01-26 22:38:04','2023-01-26 22:38:04','874a828f-9ed4-4436-b6a1-b65f08427089'),(2832,2827,20,5,5,NULL,'2023-01-26 22:38:04','2023-01-26 22:38:04','d2819fbf-45be-4d07-b95d-f010ef195a06'),(2833,2827,20,4,6,NULL,'2023-01-26 22:38:04','2023-01-26 22:38:04','4ebb58e2-58f3-4b5a-b215-188f97ccf68b'),(2834,2827,20,5,7,NULL,'2023-01-26 22:38:04','2023-01-26 22:38:04','227335bb-1882-4bf1-b55d-254953a9a947'),(2844,2843,20,5,1,NULL,'2023-01-26 22:40:54','2023-01-26 22:40:54','38d6e619-8b75-4e57-a063-6cd8132509bd'),(2845,2843,20,4,2,NULL,'2023-01-26 22:40:54','2023-01-26 22:40:54','6a95b488-84cc-4291-92ac-d4c6471f82a2'),(2846,2843,20,5,3,NULL,'2023-01-26 22:40:54','2023-01-26 22:40:54','bfd1d98e-14aa-461c-a9e2-be3639e3859f'),(2847,2843,20,4,4,NULL,'2023-01-26 22:40:54','2023-01-26 22:40:54','a26b0fee-0d0d-4175-a69a-fba07e256787'),(2848,2843,20,5,5,NULL,'2023-01-26 22:40:54','2023-01-26 22:40:54','444aab39-1ec7-453b-b198-2ff08d5621c0'),(2849,2843,20,4,6,NULL,'2023-01-26 22:40:54','2023-01-26 22:40:54','7087398a-6cbc-4ed9-a27c-4e1a85c40770'),(2850,2843,20,5,7,NULL,'2023-01-26 22:40:54','2023-01-26 22:40:54','9af7dff1-e069-4858-a968-4e4326710733'),(2860,2859,20,5,1,NULL,'2023-01-26 22:41:11','2023-01-26 22:41:11','53b6e984-3994-4440-8f77-6fd6a22f23a4'),(2861,2859,20,4,2,NULL,'2023-01-26 22:41:12','2023-01-26 22:41:12','234365f2-f565-494f-bde8-de4eaf41dda0'),(2862,2859,20,5,3,NULL,'2023-01-26 22:41:12','2023-01-26 22:41:12','89f3693b-123a-4fb9-a246-c400f00a82c5'),(2863,2859,20,4,4,NULL,'2023-01-26 22:41:12','2023-01-26 22:41:12','88be946a-3f7e-455a-8a13-5f93e354353c'),(2864,2859,20,5,5,NULL,'2023-01-26 22:41:12','2023-01-26 22:41:12','b51dc72d-bc31-4390-95ea-6f6d3eb3357f'),(2865,2859,20,4,6,NULL,'2023-01-26 22:41:12','2023-01-26 22:41:12','81dbe6db-9ccb-4c63-b927-fe03af9d271e'),(2866,2859,20,5,7,NULL,'2023-01-26 22:41:12','2023-01-26 22:41:12','bc404903-04df-4d64-8d09-3031978182e4'),(2868,2867,20,5,1,NULL,'2023-01-26 22:41:23','2023-01-26 22:41:23','3933c394-53d0-44ac-954b-d2d7f563c39e'),(2869,2867,20,4,2,NULL,'2023-01-26 22:41:23','2023-01-26 22:41:23','62e69757-b98a-4905-a623-0afcefdf8ae5'),(2870,2867,20,5,3,NULL,'2023-01-26 22:41:23','2023-01-26 22:41:23','72a8f815-80f4-49da-a302-4a1e2b0337db'),(2871,2867,20,4,4,NULL,'2023-01-26 22:41:23','2023-01-26 22:41:23','7223be02-03a8-4f9e-b97f-70e3b7039de4'),(2872,2867,20,5,5,NULL,'2023-01-26 22:41:23','2023-01-26 22:41:23','8ed85d26-950c-45d8-80be-9a23c8b0ea3b'),(2873,2867,20,4,6,NULL,'2023-01-26 22:41:23','2023-01-26 22:41:23','2a45f8b9-5400-4922-9259-b8974ee6b086'),(2874,2867,20,5,7,NULL,'2023-01-26 22:41:23','2023-01-26 22:41:23','b333ef5d-dd27-4096-83ca-4ceefa5f8e9c'),(2884,2883,20,5,1,NULL,'2023-01-26 22:41:42','2023-01-26 22:41:42','3682dd6d-bad1-4524-b979-fffb92979bb6'),(2885,2883,20,4,2,NULL,'2023-01-26 22:41:42','2023-01-26 22:41:42','c632f022-b97d-478d-bdeb-d97da712e48b'),(2886,2883,20,5,3,NULL,'2023-01-26 22:41:42','2023-01-26 22:41:42','e15d0eab-8b3e-44a7-a513-abec992f830a'),(2887,2883,20,4,4,NULL,'2023-01-26 22:41:42','2023-01-26 22:41:42','48d6cf22-a121-4d0c-bb3d-fe2686bd6474'),(2888,2883,20,5,5,NULL,'2023-01-26 22:41:42','2023-01-26 22:41:42','7bba1002-a189-4335-be8a-b7e327d3049a'),(2889,2883,20,4,6,NULL,'2023-01-26 22:41:42','2023-01-26 22:41:42','1f829d8e-75d6-4515-8002-1897eb23117e'),(2890,2883,20,5,7,NULL,'2023-01-26 22:41:42','2023-01-26 22:41:42','906147c7-1c8b-499d-a27e-8d25b20cb25b'),(2942,2140,20,5,1,NULL,'2023-01-27 14:50:36','2023-01-27 14:50:36','5ca9629a-0a79-4d05-b604-732c5e03663e'),(2943,2140,20,4,2,NULL,'2023-01-27 14:50:36','2023-01-27 14:50:36','7af23d2e-79b4-4eaf-801c-ada56eecea57'),(2944,2140,20,5,3,NULL,'2023-01-27 14:50:36','2023-01-27 14:50:36','5947564a-7619-41b8-b242-b016e6b27a7b'),(2945,2140,20,4,4,NULL,'2023-01-27 14:50:36','2023-01-27 14:50:36','d3ab654c-2081-4a4f-95bb-f746f210deed'),(2946,2140,20,5,5,NULL,'2023-01-27 14:50:36','2023-01-27 14:50:36','1999bf40-7639-4067-bf41-ba73a4d2c827'),(2948,2947,20,5,1,NULL,'2023-01-27 14:50:36','2023-01-27 14:50:36','015551d3-a6e7-42d8-b82e-e1d14cfa6acc'),(2949,2947,20,4,2,NULL,'2023-01-27 14:50:36','2023-01-27 14:50:36','e2a33fec-234f-4bba-8bd0-641500502b57'),(2950,2947,20,5,3,NULL,'2023-01-27 14:50:36','2023-01-27 14:50:36','4d20f5d9-c4a5-4e15-b3a6-e9ee5934fdfd'),(2951,2947,20,4,4,NULL,'2023-01-27 14:50:36','2023-01-27 14:50:36','dd176d74-d6ce-4f0e-809c-59180804b10a'),(2952,2947,20,5,5,NULL,'2023-01-27 14:50:36','2023-01-27 14:50:36','8daf6143-61e9-4aed-8a62-0185898cdc41'),(2954,2953,20,5,1,NULL,'2023-02-15 21:55:51','2023-02-15 21:55:51','3ce790d1-1135-4be4-a93e-6113f9f033fa'),(2955,2953,20,4,2,NULL,'2023-02-15 21:55:51','2023-02-15 21:55:51','004cd1e1-a5cc-492a-89b9-859ea334f4c6'),(2956,2953,20,5,3,NULL,'2023-02-15 21:55:51','2023-02-15 21:55:51','7437430f-bcba-41f3-acd5-6dbc45684578'),(2957,2953,20,4,4,NULL,'2023-02-15 21:55:51','2023-02-15 21:55:51','03adc3a7-487b-4d15-8796-5f76d9c81726'),(2958,2953,20,5,5,NULL,'2023-02-15 21:55:51','2023-02-15 21:55:51','4fa3bb0c-d23a-423d-beec-0966064f4a73'),(3018,3017,20,5,1,NULL,'2023-04-17 10:55:58','2023-04-17 10:55:58','e276a3f7-8357-419a-827c-fd4f62049b63'),(3019,3017,20,4,2,NULL,'2023-04-17 10:55:58','2023-04-17 10:55:58','d1be3634-030a-421d-ab8a-ed2465b357b9'),(3020,3017,20,5,3,NULL,'2023-04-17 10:55:58','2023-04-17 10:55:58','6d8c25b1-c650-495d-8ece-c5ef2bd7be53'),(3021,3017,20,4,4,NULL,'2023-04-17 10:55:58','2023-04-17 10:55:58','b8752db9-24f6-44fd-a216-4e9c8c069f47'),(3022,3017,20,5,5,NULL,'2023-04-17 10:55:58','2023-04-17 10:55:58','4ec44701-f926-4eaa-a838-409b52c6e9a6'),(3023,3017,20,4,6,NULL,'2023-04-17 10:55:58','2023-04-17 10:55:58','13b2a529-5b5f-4419-99ad-ffe10122b7bc'),(3024,3017,20,5,7,NULL,'2023-04-17 10:55:58','2023-04-17 10:55:58','ac008d4a-9444-484e-b82d-1986a81d3cb6'),(3026,3025,20,5,1,NULL,'2023-05-25 11:58:00','2023-05-25 11:58:00','f8be5d59-1ebf-43e9-901b-61c2978bfeaa'),(3027,3025,20,4,2,NULL,'2023-05-25 11:58:00','2023-05-25 11:58:00','ae8fabd0-5d13-4d15-b31c-5eefd5f94383'),(3028,3025,20,5,3,NULL,'2023-05-25 11:58:00','2023-05-25 11:58:00','ee71271a-afbe-4a73-801b-bdd9cb1a0680'),(3029,3025,20,4,4,NULL,'2023-05-25 11:58:00','2023-05-25 11:58:00','458ba852-a3df-4ad8-bdda-bf3d2a9039ee'),(3030,3025,20,5,5,NULL,'2023-05-25 11:58:00','2023-05-25 11:58:00','c91c4dd3-b4b6-4fa3-93fb-0d002e7750ae'),(3031,3025,20,4,6,NULL,'2023-05-25 11:58:00','2023-05-25 11:58:00','fc1d35be-41ce-423b-ad7c-87f2b05c6980'),(3032,3025,20,5,7,NULL,'2023-05-25 11:58:00','2023-05-25 11:58:00','7c6b3858-d65d-4191-9707-001b8a293010'),(3034,3033,20,5,1,NULL,'2023-05-25 11:58:02','2023-05-25 11:58:02','a2a73f28-091b-4925-868a-08d90c1deef1'),(3035,3033,20,4,2,NULL,'2023-05-25 11:58:02','2023-05-25 11:58:02','843440c0-d7ab-486f-a99e-870e6b824cde'),(3036,3033,20,5,3,NULL,'2023-05-25 11:58:02','2023-05-25 11:58:02','a549e898-b9de-4eb7-9d37-88eb2532bfaf'),(3037,3033,20,4,4,NULL,'2023-05-25 11:58:02','2023-05-25 11:58:02','98644314-89ef-4188-8b85-228431bef905'),(3038,3033,20,5,5,NULL,'2023-05-25 11:58:02','2023-05-25 11:58:02','beedd8e9-ecdf-4416-a1f1-c6d7cfff4f26'),(3039,3033,20,4,6,NULL,'2023-05-25 11:58:03','2023-05-25 11:58:03','74d23a30-a1ff-48c4-9889-c49d9303c179'),(3040,3033,20,5,7,NULL,'2023-05-25 11:58:03','2023-05-25 11:58:03','7f572400-131c-4aba-974d-64241218fd7a'),(3042,3041,20,5,1,NULL,'2023-05-25 11:58:03','2023-05-25 11:58:03','49f90a56-ab4b-4499-9305-da3fd699b0e3'),(3043,3041,20,4,2,NULL,'2023-05-25 11:58:03','2023-05-25 11:58:03','b94f5de4-04f9-47a3-a65d-5cc5a9ca7aa9'),(3044,3041,20,5,3,NULL,'2023-05-25 11:58:03','2023-05-25 11:58:03','83b75fc8-fe32-4b4d-92bb-5bf5204eb7b1'),(3045,3041,20,4,4,NULL,'2023-05-25 11:58:03','2023-05-25 11:58:03','195e3c09-cadf-4c94-bd65-a6f0d65cbf7c'),(3046,3041,20,5,5,NULL,'2023-05-25 11:58:03','2023-05-25 11:58:03','71006eba-1978-4bd7-8b15-6ba8bb517373'),(3047,3041,20,4,6,NULL,'2023-05-25 11:58:03','2023-05-25 11:58:03','2addf3e8-0dd4-4fdd-83c1-2fc0d3b08284'),(3048,3041,20,5,7,NULL,'2023-05-25 11:58:03','2023-05-25 11:58:03','88ea0c46-90f2-4935-88ba-5ef59c17465a'),(3050,3049,20,5,1,NULL,'2023-05-25 11:58:08','2023-05-25 11:58:08','6bbc2f25-78a6-4b66-b0e4-aa4f4ef7fbbc'),(3051,3049,20,4,2,NULL,'2023-05-25 11:58:08','2023-05-25 11:58:08','f0b99df1-8b7b-4d7b-8c42-c548e74680da'),(3052,3049,20,5,3,NULL,'2023-05-25 11:58:08','2023-05-25 11:58:08','ed570079-b0b5-4022-abc4-42626c816a15'),(3053,3049,20,4,4,NULL,'2023-05-25 11:58:08','2023-05-25 11:58:08','0398f191-23cd-4781-9def-ca9155d02192'),(3054,3049,20,5,5,NULL,'2023-05-25 11:58:08','2023-05-25 11:58:08','3791c454-325e-425d-a62f-e0b6e6071d0b'),(3055,3049,20,4,6,NULL,'2023-05-25 11:58:08','2023-05-25 11:58:08','11a6472d-7784-4f92-944f-688878288644'),(3056,3049,20,5,7,NULL,'2023-05-25 11:58:08','2023-05-25 11:58:08','a662e3be-b052-481d-bf1a-ab2b253a4cca'),(3058,3057,20,5,1,NULL,'2023-05-25 11:58:10','2023-05-25 11:58:10','ee973a79-562b-4430-afe1-02f367f8d9b5'),(3059,3057,20,4,2,NULL,'2023-05-25 11:58:10','2023-05-25 11:58:10','2f32e4fb-8332-4e26-9723-0b4c9bf1227a'),(3060,3057,20,5,3,NULL,'2023-05-25 11:58:10','2023-05-25 11:58:10','26c3ea70-4970-403f-8728-b830db68f6ea'),(3061,3057,20,4,4,NULL,'2023-05-25 11:58:10','2023-05-25 11:58:10','69fc337c-6056-4bb8-aa26-172f2c5aaa3b'),(3062,3057,20,5,5,NULL,'2023-05-25 11:58:10','2023-05-25 11:58:10','78d9e659-caa4-4205-9115-964d51cb87af'),(3063,3057,20,4,6,NULL,'2023-05-25 11:58:10','2023-05-25 11:58:10','6d565945-78c7-4e67-acfd-a3d10434cea3'),(3064,3057,20,5,7,NULL,'2023-05-25 11:58:10','2023-05-25 11:58:10','6cbc58a6-a237-49e0-9e7f-1f8dc6afea61'),(3066,3065,20,5,1,NULL,'2023-06-13 22:14:53','2023-06-13 22:14:53','0f785a3b-6c9d-4fab-b81f-29b9265021fc'),(3067,3065,20,4,2,NULL,'2023-06-13 22:14:53','2023-06-13 22:14:53','bbc0bfd8-a02c-4bb8-b2bd-9a092d09ac4a'),(3068,3065,20,5,3,NULL,'2023-06-13 22:14:53','2023-06-13 22:14:53','72932bd0-314d-4fac-af05-9128fca1b71f'),(3069,3065,20,4,4,NULL,'2023-06-13 22:14:53','2023-06-13 22:14:53','629888da-1a42-4210-8353-e4bf31507273'),(3070,3065,20,5,5,NULL,'2023-06-13 22:14:53','2023-06-13 22:14:53','c3e14c3e-8cb0-4bcb-a1e5-efb77e1bc55e'),(3071,3065,20,4,6,NULL,'2023-06-13 22:14:53','2023-06-13 22:14:53','a9f71ec4-7a0f-4171-9633-69d0e23e23b9'),(3072,3065,20,5,7,NULL,'2023-06-13 22:14:53','2023-06-13 22:14:53','3312dad3-9ee0-48ef-abff-86bda0dba39e'),(3074,3073,20,5,1,NULL,'2023-06-13 22:15:01','2023-06-13 22:15:01','33424794-b7f2-4eb9-9b1b-69923effd85d'),(3075,3073,20,4,2,NULL,'2023-06-13 22:15:01','2023-06-13 22:15:01','27698db8-6a50-4f80-b00f-bb5a38137ead'),(3076,3073,20,5,3,NULL,'2023-06-13 22:15:01','2023-06-13 22:15:01','089f2d55-e0b9-45b6-add2-be5bc3cc3921'),(3077,3073,20,4,4,NULL,'2023-06-13 22:15:01','2023-06-13 22:15:01','146828bd-e00a-4bb4-b464-cecd3f00dcfb'),(3078,3073,20,5,5,NULL,'2023-06-13 22:15:01','2023-06-13 22:15:01','20bb6225-8f32-463f-81a3-16144ad133e1'),(3079,3073,20,4,6,NULL,'2023-06-13 22:15:01','2023-06-13 22:15:01','32b828a1-cbc6-40ba-ab6c-e0edd0bc2fe8'),(3080,3073,20,5,7,NULL,'2023-06-13 22:15:01','2023-06-13 22:15:01','c5868c0b-6d30-4020-aa4f-5676aae022e4'),(3082,3081,20,5,1,NULL,'2023-06-13 22:15:03','2023-06-13 22:15:03','0c16de70-c332-4ff5-be66-0d1d46bcb9b0'),(3083,3081,20,4,2,NULL,'2023-06-13 22:15:03','2023-06-13 22:15:03','9b3e3ffd-7aff-4796-8510-110e45826e7f'),(3084,3081,20,5,3,NULL,'2023-06-13 22:15:03','2023-06-13 22:15:03','ed1fc30d-9650-4409-a484-26a1f2c608b3'),(3085,3081,20,4,4,NULL,'2023-06-13 22:15:03','2023-06-13 22:15:03','810a58e3-27c5-4098-92ab-d45fe691207d'),(3086,3081,20,5,5,NULL,'2023-06-13 22:15:03','2023-06-13 22:15:03','da4abd14-cddb-43a3-a566-2d15bf8e7d49'),(3087,3081,20,4,6,NULL,'2023-06-13 22:15:03','2023-06-13 22:15:03','89a41431-378d-4cfc-a0ed-4dd7c0e83173'),(3088,3081,20,5,7,NULL,'2023-06-13 22:15:03','2023-06-13 22:15:03','cc468e5f-2d44-4981-9389-77dfc134788c'),(3090,3089,20,5,1,NULL,'2023-07-05 01:57:06','2023-07-05 01:57:06','a77c338a-63c9-4639-aa06-43c449d247f1'),(3091,3089,20,4,2,NULL,'2023-07-05 01:57:06','2023-07-05 01:57:06','4723d4dd-ea2b-421b-baf3-f32d13db925a'),(3092,3089,20,5,3,NULL,'2023-07-05 01:57:06','2023-07-05 01:57:06','2613aad9-5401-4e57-bc48-1b123ef488cb'),(3093,3089,20,4,4,NULL,'2023-07-05 01:57:06','2023-07-05 01:57:06','54d0cca4-4190-4ae2-becc-7b8d63598392'),(3094,3089,20,5,5,NULL,'2023-07-05 01:57:06','2023-07-05 01:57:06','13c6c39c-4689-4b71-a376-ef1284221d86'),(3095,3089,20,4,6,NULL,'2023-07-05 01:57:06','2023-07-05 01:57:06','e2999e0b-102f-4700-b80c-0a0ba21b1820'),(3096,3089,20,5,7,NULL,'2023-07-05 01:57:06','2023-07-05 01:57:06','532ed21d-c282-40de-a377-0546a91e52cb'),(3098,3097,20,5,1,NULL,'2023-07-08 19:39:01','2023-07-08 19:39:01','db6dca09-0973-4dcf-af7f-250ef34b75ed'),(3099,3097,20,4,2,NULL,'2023-07-08 19:39:01','2023-07-08 19:39:01','b83b579b-a94a-4645-82c2-a200c3c9e57e'),(3100,3097,20,5,3,NULL,'2023-07-08 19:39:01','2023-07-08 19:39:01','e98639a2-c297-428c-abfc-8841514454a5'),(3101,3097,20,4,4,NULL,'2023-07-08 19:39:01','2023-07-08 19:39:01','e92c228f-1622-4950-80a9-70a6cb748e20'),(3102,3097,20,5,5,NULL,'2023-07-08 19:39:01','2023-07-08 19:39:01','a3511a1e-20b2-490f-bfcb-b09bf77839d0'),(3103,3097,20,4,6,NULL,'2023-07-08 19:39:01','2023-07-08 19:39:01','08045450-e475-4434-b301-a4a0a6d45dc5'),(3104,3097,20,5,7,NULL,'2023-07-08 19:39:01','2023-07-08 19:39:01','7b368c3a-7c10-411a-ab53-47462b7b8744'),(3108,3107,20,5,1,NULL,'2023-08-05 15:20:24','2023-08-05 15:20:24','bda7e99d-e3df-4fd3-bca2-ce8c6a3ae9c3'),(3109,3107,20,4,2,NULL,'2023-08-05 15:20:24','2023-08-05 15:20:24','31e798c0-f49e-42d5-a4ca-2d1f0ae7bfc8'),(3110,3107,20,5,3,NULL,'2023-08-05 15:20:24','2023-08-05 15:20:24','92f0a99c-90e8-42cd-9ed0-4a1eccc930ba'),(3111,3107,20,4,4,NULL,'2023-08-05 15:20:24','2023-08-05 15:20:24','053beec4-bdc0-4829-a772-3ec2b588f4ec'),(3112,3107,20,5,5,NULL,'2023-08-05 15:20:24','2023-08-05 15:20:24','3c46dc92-ec6a-4490-a9cc-e65ec4e297c4'),(3113,3107,20,4,6,NULL,'2023-08-05 15:20:24','2023-08-05 15:20:24','06cc7904-db71-451c-a114-1f2a6245ae1a'),(3114,3107,20,5,7,NULL,'2023-08-05 15:20:24','2023-08-05 15:20:24','46efa294-1f4c-411a-9723-4db509cfa3a9'),(3116,3115,20,5,1,NULL,'2023-08-05 15:20:25','2023-08-05 15:20:25','cbd930d9-c5f2-424d-a1f3-7265490c3194'),(3117,3115,20,4,2,NULL,'2023-08-05 15:20:25','2023-08-05 15:20:25','da0212e4-3ef3-41f3-b81c-cd6b4396b01f'),(3118,3115,20,5,3,NULL,'2023-08-05 15:20:25','2023-08-05 15:20:25','6e872abf-cf4c-4b2a-9c7d-4e6a55b7c5db'),(3119,3115,20,4,4,NULL,'2023-08-05 15:20:25','2023-08-05 15:20:25','1b87c909-af28-42a0-bdd6-a7ad2a188d8c'),(3120,3115,20,5,5,NULL,'2023-08-05 15:20:25','2023-08-05 15:20:25','06045014-070d-485a-b941-c1c364cca464'),(3121,3115,20,4,6,NULL,'2023-08-05 15:20:25','2023-08-05 15:20:25','3fa770be-1b0a-4373-8aa2-62e9fd0aad63'),(3122,3115,20,5,7,NULL,'2023-08-05 15:20:25','2023-08-05 15:20:25','54b0988f-d3f8-4aae-b01f-efcce358d851'),(3124,3123,20,5,1,NULL,'2023-08-05 15:20:26','2023-08-05 15:20:26','bf317ea7-01df-49d5-bed5-b0b8b4cfbf3d'),(3125,3123,20,4,2,NULL,'2023-08-05 15:20:26','2023-08-05 15:20:26','09418825-2e74-4ae8-ae98-8b71568a6058'),(3126,3123,20,5,3,NULL,'2023-08-05 15:20:26','2023-08-05 15:20:26','46beb12b-0d19-41b4-8728-1e9d931b7060'),(3127,3123,20,4,4,NULL,'2023-08-05 15:20:26','2023-08-05 15:20:26','45326a54-db53-49c4-bbac-6a4c74a5fd81'),(3128,3123,20,5,5,NULL,'2023-08-05 15:20:26','2023-08-05 15:20:26','2c8a35ac-bc02-4ef3-8346-17ba2d6553ce'),(3129,3123,20,4,6,NULL,'2023-08-05 15:20:26','2023-08-05 15:20:26','1bd9dbe8-3a1b-42da-a38a-1952fa95b33b'),(3130,3123,20,5,7,NULL,'2023-08-05 15:20:26','2023-08-05 15:20:26','7857a038-e349-4ea7-bdd6-f4429b2ef319'),(3132,3131,20,5,1,NULL,'2023-08-05 15:20:27','2023-08-05 15:20:27','98d36279-f0a6-4731-b792-17874207c14b'),(3133,3131,20,4,2,NULL,'2023-08-05 15:20:27','2023-08-05 15:20:27','9059a766-abc2-469a-a5e7-ff826124b069'),(3134,3131,20,5,3,NULL,'2023-08-05 15:20:27','2023-08-05 15:20:27','8eae8574-fc3e-44fc-b818-dd90526aca59'),(3135,3131,20,4,4,NULL,'2023-08-05 15:20:27','2023-08-05 15:20:27','2a0c4bf8-021a-4c9e-8e00-3723ff0ce8a2'),(3136,3131,20,5,5,NULL,'2023-08-05 15:20:27','2023-08-05 15:20:27','1de63cb8-d48c-4b6e-8328-682a6ab1b280'),(3137,3131,20,4,6,NULL,'2023-08-05 15:20:27','2023-08-05 15:20:27','9a781a00-a70f-47b3-b51b-05cf7ae420b8'),(3138,3131,20,5,7,NULL,'2023-08-05 15:20:27','2023-08-05 15:20:27','889b7638-596c-4c5f-9922-71225bf55d7e'),(3140,3139,20,5,1,NULL,'2023-08-05 15:20:29','2023-08-05 15:20:29','db8e149a-0e32-4c78-9444-6d5a3d07739a'),(3141,3139,20,4,2,NULL,'2023-08-05 15:20:29','2023-08-05 15:20:29','549ca5f2-2452-46df-adc4-b9b7b5ffa728'),(3142,3139,20,5,3,NULL,'2023-08-05 15:20:29','2023-08-05 15:20:29','d5a21cd4-79c4-44bc-92f2-48135f5df089'),(3143,3139,20,4,4,NULL,'2023-08-05 15:20:29','2023-08-05 15:20:29','bdddbac5-06ee-4067-a492-b25c0718d550'),(3144,3139,20,5,5,NULL,'2023-08-05 15:20:29','2023-08-05 15:20:29','d4ac1bfe-09e9-44e6-8939-68929d72fb6c'),(3145,3139,20,4,6,NULL,'2023-08-05 15:20:29','2023-08-05 15:20:29','013452f5-66c1-4396-9aa4-aa61c1cdea10'),(3146,3139,20,5,7,NULL,'2023-08-05 15:20:29','2023-08-05 15:20:29','b7052e5f-82ae-4528-abdc-4363f32b6d62'),(3148,3147,20,5,1,NULL,'2023-09-06 15:59:53','2023-09-06 15:59:53','e81d5aa7-7831-48fb-a523-33307ac937f0'),(3149,3147,20,4,2,NULL,'2023-09-06 15:59:53','2023-09-06 15:59:53','c5f60d63-635b-433c-98dd-07460bccdb4c'),(3150,3147,20,5,3,NULL,'2023-09-06 15:59:53','2023-09-06 15:59:53','b60ea12f-fcfb-4025-9704-1dec1efc8f52'),(3151,3147,20,4,4,NULL,'2023-09-06 15:59:53','2023-09-06 15:59:53','2053dc05-0255-4bed-bcad-74c22f68de9f'),(3152,3147,20,5,5,NULL,'2023-09-06 15:59:53','2023-09-06 15:59:53','2153d758-2dcb-404e-8955-7f3abd336b57'),(3153,3147,20,4,6,NULL,'2023-09-06 15:59:53','2023-09-06 15:59:53','6f6327de-0575-4f94-aeab-52087c4e9e85'),(3154,3147,20,5,7,NULL,'2023-09-06 15:59:53','2023-09-06 15:59:53','24e246a9-64cb-4878-9f9f-34b332597811'),(3156,3155,20,5,1,NULL,'2023-09-06 15:59:54','2023-09-06 15:59:54','66bcdbf3-6adf-4dcd-9a47-7c37fe7024bb'),(3157,3155,20,4,2,NULL,'2023-09-06 15:59:54','2023-09-06 15:59:54','87a7518a-bd3b-4113-abf8-0bfd3358321a'),(3158,3155,20,5,3,NULL,'2023-09-06 15:59:54','2023-09-06 15:59:54','032656a8-2f74-464b-9d52-747c710f559e'),(3159,3155,20,4,4,NULL,'2023-09-06 15:59:54','2023-09-06 15:59:54','a4c09301-328e-4687-9755-3bfca689e63a'),(3160,3155,20,5,5,NULL,'2023-09-06 15:59:54','2023-09-06 15:59:54','9f42ffc1-0a69-4c2a-9638-711cf3566cfd'),(3161,3155,20,4,6,NULL,'2023-09-06 15:59:54','2023-09-06 15:59:54','438db74a-c36f-499b-8e7a-2786289aaeea'),(3162,3155,20,5,7,NULL,'2023-09-06 15:59:54','2023-09-06 15:59:54','731383fd-6cfd-43db-ba5a-7fc6bd09fdb0'),(3164,3163,20,5,1,NULL,'2023-09-06 15:59:55','2023-09-06 15:59:55','490477f5-eef8-4d17-96d1-7a481b1e68ba'),(3165,3163,20,4,2,NULL,'2023-09-06 15:59:55','2023-09-06 15:59:55','01b4205d-7e22-494a-88fa-6c64c1550d65'),(3166,3163,20,5,3,NULL,'2023-09-06 15:59:55','2023-09-06 15:59:55','68266856-5cf8-4df3-b4a9-f43d9fc7f6d2'),(3167,3163,20,4,4,NULL,'2023-09-06 15:59:55','2023-09-06 15:59:55','c67be48d-3c44-4917-8821-1e7f932eb6b7'),(3168,3163,20,5,5,NULL,'2023-09-06 15:59:55','2023-09-06 15:59:55','26762742-ecc9-4ed1-aef1-ae77014a354f'),(3169,3163,20,4,6,NULL,'2023-09-06 15:59:55','2023-09-06 15:59:55','bc16a11f-7028-4c29-a322-8ec698d3762f'),(3170,3163,20,5,7,NULL,'2023-09-06 15:59:55','2023-09-06 15:59:55','7493feb0-a5cf-4088-ba18-f6812300a8c9'),(3172,3171,20,5,1,NULL,'2023-09-06 15:59:56','2023-09-06 15:59:56','ce36cf88-efa4-4e6f-b1ae-c3f331df545c'),(3173,3171,20,4,2,NULL,'2023-09-06 15:59:56','2023-09-06 15:59:56','7a9520d8-7d2d-4ae5-a436-e6e313e9a9d4'),(3174,3171,20,5,3,NULL,'2023-09-06 15:59:56','2023-09-06 15:59:56','b4fdde7e-5f18-48db-813e-ea6e2d9c0fc7'),(3175,3171,20,4,4,NULL,'2023-09-06 15:59:56','2023-09-06 15:59:56','d9bba0fd-ddd6-491e-82c6-201fd4b6ff46'),(3176,3171,20,5,5,NULL,'2023-09-06 15:59:56','2023-09-06 15:59:56','28b19679-f020-4c39-8d80-ade11ee421c6'),(3177,3171,20,4,6,NULL,'2023-09-06 15:59:56','2023-09-06 15:59:56','15725f64-1bbf-455c-ac5f-866927ac4554'),(3178,3171,20,5,7,NULL,'2023-09-06 15:59:57','2023-09-06 15:59:57','ef47b966-5186-4e2f-a8ac-0277c58df4dd'),(3180,3179,20,5,1,NULL,'2023-09-06 16:00:04','2023-09-06 16:00:04','2a875921-b600-48fc-b9fb-7b7cd3e7d68a'),(3181,3179,20,4,2,NULL,'2023-09-06 16:00:04','2023-09-06 16:00:04','6207d0a2-a633-4a8d-881f-9a89ce6cc23e'),(3182,3179,20,5,3,NULL,'2023-09-06 16:00:04','2023-09-06 16:00:04','444476c6-bd07-46e8-969f-1917fe4a532c'),(3183,3179,20,4,4,NULL,'2023-09-06 16:00:04','2023-09-06 16:00:04','a40d937a-e4af-4139-b9b2-5f95b3c6a188'),(3184,3179,20,5,5,NULL,'2023-09-06 16:00:04','2023-09-06 16:00:04','522180eb-7480-45f8-867b-5b4f00da9f8b'),(3185,3179,20,4,6,NULL,'2023-09-06 16:00:04','2023-09-06 16:00:04','e8bf20f5-3d22-4a08-8271-1b6a7c21001a'),(3186,3179,20,5,7,NULL,'2023-09-06 16:00:04','2023-09-06 16:00:04','fe4889e9-c469-49d0-b5ab-920f2f431e6b'),(3188,3187,20,5,1,NULL,'2023-09-06 16:00:10','2023-09-06 16:00:10','1bb378c6-2496-4128-8e1d-a9261e7d161b'),(3189,3187,20,4,2,NULL,'2023-09-06 16:00:10','2023-09-06 16:00:10','0c5c51bb-1d09-47c2-a494-48b84ce6958c'),(3190,3187,20,5,3,NULL,'2023-09-06 16:00:10','2023-09-06 16:00:10','8296d77b-64dc-484f-9df3-be173755ca65'),(3191,3187,20,4,4,NULL,'2023-09-06 16:00:10','2023-09-06 16:00:10','0e4c31d8-0a51-43cb-9d05-d8dc5b157d89'),(3192,3187,20,5,5,NULL,'2023-09-06 16:00:10','2023-09-06 16:00:10','fa0d1e31-e158-4b84-bb29-bcf868ffe9aa'),(3193,3187,20,4,6,NULL,'2023-09-06 16:00:10','2023-09-06 16:00:10','0dbc5098-5e72-4ca5-b442-e83284d11e8a'),(3194,3187,20,5,7,NULL,'2023-09-06 16:00:10','2023-09-06 16:00:10','f63b1663-b4cb-4907-820a-7b35b8df89b3'),(3196,3195,20,5,1,NULL,'2023-09-07 08:00:36','2023-09-07 08:00:36','fadaa1c4-c240-485d-a29b-1b4c2233b1cf'),(3197,3195,20,4,2,NULL,'2023-09-07 08:00:36','2023-09-07 08:00:36','d46f4bbd-db22-4078-aaca-dd4445fdcda7'),(3198,3195,20,5,3,NULL,'2023-09-07 08:00:36','2023-09-07 08:00:36','77dcd970-2fed-463e-a822-fbcb24a92a61'),(3199,3195,20,4,4,NULL,'2023-09-07 08:00:36','2023-09-07 08:00:36','69a001ff-00d9-48f3-bd0f-b42a88431fca'),(3200,3195,20,5,5,NULL,'2023-09-07 08:00:36','2023-09-07 08:00:36','74c2bc8d-2c4c-4df9-a64b-efba0b661db0'),(3201,3195,20,4,6,NULL,'2023-09-07 08:00:36','2023-09-07 08:00:36','901e2b40-f849-4daf-83bd-5f362950dbfe'),(3202,3195,20,5,7,NULL,'2023-09-07 08:00:36','2023-09-07 08:00:36','cff78f0b-58a4-4a65-bd18-37fbe86b6961'),(3204,3203,20,5,1,NULL,'2023-09-07 08:00:40','2023-09-07 08:00:40','aa72e886-7964-4f83-93bb-122f3d8601c1'),(3205,3203,20,4,2,NULL,'2023-09-07 08:00:40','2023-09-07 08:00:40','6b1d31d6-4a68-475c-9019-54662ee3f0aa'),(3206,3203,20,5,3,NULL,'2023-09-07 08:00:40','2023-09-07 08:00:40','5b5b5708-0e52-4b1f-ab3f-525e7536eded'),(3207,3203,20,4,4,NULL,'2023-09-07 08:00:40','2023-09-07 08:00:40','17f3d83c-d382-421c-b64f-bf63d2c6b396'),(3208,3203,20,5,5,NULL,'2023-09-07 08:00:40','2023-09-07 08:00:40','990dfe2b-b0b1-4b02-a1ee-ecab621ca582'),(3209,3203,20,4,6,NULL,'2023-09-07 08:00:40','2023-09-07 08:00:40','76887790-2853-4f93-8aaf-1446eb67985a'),(3210,3203,20,5,7,NULL,'2023-09-07 08:00:40','2023-09-07 08:00:40','b00e12a4-9875-411e-bed3-5a039c68da5c'),(3212,3211,20,5,1,NULL,'2023-09-21 18:20:05','2023-09-21 18:20:05','7ee716eb-f63f-4f11-85db-06b59b376747'),(3213,3211,20,4,2,NULL,'2023-09-21 18:20:05','2023-09-21 18:20:05','510e7996-b905-4300-9554-993eebb4d61f'),(3214,3211,20,5,3,NULL,'2023-09-21 18:20:05','2023-09-21 18:20:05','ababf9fe-43a3-49da-a5f6-1d4c2ba85d77'),(3215,3211,20,4,4,NULL,'2023-09-21 18:20:05','2023-09-21 18:20:05','8e2270b5-7799-4011-8996-0180f129ca47'),(3216,3211,20,5,5,NULL,'2023-09-21 18:20:05','2023-09-21 18:20:05','3a3a973a-419c-4981-9727-4d85d2e08dce'),(3217,3211,20,4,6,NULL,'2023-09-21 18:20:05','2023-09-21 18:20:05','1296d9fd-fc4d-4d27-b493-2774c40f665a'),(3218,3211,20,5,7,NULL,'2023-09-21 18:20:05','2023-09-21 18:20:05','75ebbea4-c3ab-42fe-917f-9dbaa73b7b3b'),(3220,3219,20,5,1,NULL,'2023-09-30 18:34:21','2023-09-30 18:34:21','8759f179-d540-4179-bf1d-251dbaa77252'),(3221,3219,20,4,2,NULL,'2023-09-30 18:34:21','2023-09-30 18:34:21','4e6ebe74-49e4-4d2b-9f64-af530bb1e81e'),(3222,3219,20,5,3,NULL,'2023-09-30 18:34:21','2023-09-30 18:34:21','f89d29a4-3175-4c43-aa6f-773e2b94610c'),(3223,3219,20,4,4,NULL,'2023-09-30 18:34:21','2023-09-30 18:34:21','6532cd95-1efb-442f-9721-0eacad1443b3'),(3224,3219,20,5,5,NULL,'2023-09-30 18:34:21','2023-09-30 18:34:21','48dc733b-48ab-4ad3-8358-844d95d1a668'),(3225,3219,20,4,6,NULL,'2023-09-30 18:34:21','2023-09-30 18:34:21','ec9a3597-0728-4224-8ec0-a85273f77219'),(3226,3219,20,5,7,NULL,'2023-09-30 18:34:21','2023-09-30 18:34:21','5a7166ea-0d93-48b3-8834-932de6b4f32d'),(3228,3227,20,5,1,NULL,'2023-09-30 18:34:24','2023-09-30 18:34:24','68c4ede5-5634-451e-a1bb-27fea0734517'),(3229,3227,20,4,2,NULL,'2023-09-30 18:34:24','2023-09-30 18:34:24','466673c5-b90c-4e25-80f8-e0a14a793745'),(3230,3227,20,5,3,NULL,'2023-09-30 18:34:24','2023-09-30 18:34:24','c5be5389-7c37-4c10-ac6e-eaa4d40e0ef5'),(3231,3227,20,4,4,NULL,'2023-09-30 18:34:24','2023-09-30 18:34:24','165e82c5-24f1-40bc-a87a-8f84e46d6815'),(3232,3227,20,5,5,NULL,'2023-09-30 18:34:24','2023-09-30 18:34:24','a73b126f-8737-489b-b13c-5f3515a9f56a'),(3233,3227,20,4,6,NULL,'2023-09-30 18:34:24','2023-09-30 18:34:24','b95d6971-0c41-47e3-a249-fe1b599df7d4'),(3234,3227,20,5,7,NULL,'2023-09-30 18:34:24','2023-09-30 18:34:24','8ee839ea-c4c1-4fac-b30c-df328805b7f4'),(3236,3235,20,5,1,NULL,'2023-10-04 13:14:31','2023-10-04 13:14:31','e5aad165-e1ca-4a87-938a-491eb072b5f1'),(3237,3235,20,4,2,NULL,'2023-10-04 13:14:31','2023-10-04 13:14:31','10846e44-3c80-4eee-ab0d-b99a2880c9ed'),(3238,3235,20,5,3,NULL,'2023-10-04 13:14:31','2023-10-04 13:14:31','983f2184-396a-43d9-be17-21d02c9da16b'),(3239,3235,20,4,4,NULL,'2023-10-04 13:14:31','2023-10-04 13:14:31','9bf085d9-1834-45f4-8ced-6df8bc3b6975'),(3240,3235,20,5,5,NULL,'2023-10-04 13:14:31','2023-10-04 13:14:31','9744a7de-3437-492b-ac0d-34febeb6f9d3'),(3241,3235,20,4,6,NULL,'2023-10-04 13:14:31','2023-10-04 13:14:31','6a81bc92-5b4b-4107-85f7-e23378caa0e0'),(3242,3235,20,5,7,NULL,'2023-10-04 13:14:31','2023-10-04 13:14:31','b3fd0cf3-6307-4f8f-97ed-3671255b175c'),(3244,3243,20,5,1,NULL,'2023-10-12 06:15:19','2023-10-12 06:15:19','9a8dffa9-b332-48c5-84df-a543e4c21938'),(3245,3243,20,4,2,NULL,'2023-10-12 06:15:19','2023-10-12 06:15:19','4f4f3a40-cdcc-4030-8bd6-412540f45a50'),(3246,3243,20,5,3,NULL,'2023-10-12 06:15:19','2023-10-12 06:15:19','ef304442-e0bd-47f8-bca9-51b0f4528cb1'),(3247,3243,20,4,4,NULL,'2023-10-12 06:15:19','2023-10-12 06:15:19','ed1e76a0-ad40-4caa-88d8-e52e5290edb8'),(3248,3243,20,5,5,NULL,'2023-10-12 06:15:19','2023-10-12 06:15:19','191ca2e6-41df-405d-a863-474dc06b4f65'),(3249,3243,20,4,6,NULL,'2023-10-12 06:15:19','2023-10-12 06:15:19','db8ff04f-3aea-46ba-9657-3f51b7b752ac'),(3250,3243,20,5,7,NULL,'2023-10-12 06:15:19','2023-10-12 06:15:19','a972022d-f277-41d2-b953-ca5da87699bc'),(3252,3251,20,5,1,NULL,'2023-10-12 06:15:21','2023-10-12 06:15:21','83216fbe-1b20-47e3-8d0e-17e0af319d97'),(3253,3251,20,4,2,NULL,'2023-10-12 06:15:21','2023-10-12 06:15:21','426a6050-cc2c-456b-8b2e-a30ce61dde4a'),(3254,3251,20,5,3,NULL,'2023-10-12 06:15:21','2023-10-12 06:15:21','77b6d784-eee5-49b8-8d0d-7bc32025d203'),(3255,3251,20,4,4,NULL,'2023-10-12 06:15:21','2023-10-12 06:15:21','9aca5930-269a-4f35-8065-b3f18a02afd5'),(3256,3251,20,5,5,NULL,'2023-10-12 06:15:21','2023-10-12 06:15:21','406b72bc-7e00-46fa-8a59-f76e3ecea390'),(3257,3251,20,4,6,NULL,'2023-10-12 06:15:22','2023-10-12 06:15:22','7a46e9a3-428f-4d87-bc4b-9c18d8125002'),(3258,3251,20,5,7,NULL,'2023-10-12 06:15:22','2023-10-12 06:15:22','02caa723-6e52-4fee-a79c-90cfcc91dc54'),(3260,3259,20,5,1,NULL,'2023-10-17 14:16:28','2023-10-17 14:16:28','5e5beb62-0244-4cdb-8987-294f0933d4a4'),(3261,3259,20,4,2,NULL,'2023-10-17 14:16:28','2023-10-17 14:16:28','dca5e551-0a07-4f87-b164-3847e2d20a12'),(3262,3259,20,5,3,NULL,'2023-10-17 14:16:28','2023-10-17 14:16:28','05250ba0-3709-493c-8f47-7a9ca07a025f'),(3263,3259,20,4,4,NULL,'2023-10-17 14:16:28','2023-10-17 14:16:28','69e90f75-654a-4e2b-92a6-c76009048334'),(3264,3259,20,5,5,NULL,'2023-10-17 14:16:28','2023-10-17 14:16:28','d8400ce1-35be-463b-a853-57f9d9a8d679'),(3265,3259,20,4,6,NULL,'2023-10-17 14:16:28','2023-10-17 14:16:28','5dc8156c-479c-4c1d-a42b-490e46d743cd'),(3266,3259,20,5,7,NULL,'2023-10-17 14:16:28','2023-10-17 14:16:28','51e9da69-c406-4d92-ad12-d09113ea4f65'),(3268,3267,20,5,1,NULL,'2023-10-17 14:16:30','2023-10-17 14:16:30','5b995a3d-9d28-49c4-95fd-0f5623e2ddc8'),(3269,3267,20,4,2,NULL,'2023-10-17 14:16:30','2023-10-17 14:16:30','fd836e48-28e5-417c-97a3-7cf9f29469c3'),(3270,3267,20,5,3,NULL,'2023-10-17 14:16:30','2023-10-17 14:16:30','f6ba3dfa-032f-4dae-aa01-89b36714d59a'),(3271,3267,20,4,4,NULL,'2023-10-17 14:16:30','2023-10-17 14:16:30','df4155f1-944a-4fcc-9e36-175b18f1d239'),(3272,3267,20,5,5,NULL,'2023-10-17 14:16:30','2023-10-17 14:16:30','4d9cf9e1-16d7-4798-9d40-7f3e1f5a585c'),(3273,3267,20,4,6,NULL,'2023-10-17 14:16:30','2023-10-17 14:16:30','16873f29-f3b4-4642-9065-958afc4f9fc8'),(3274,3267,20,5,7,NULL,'2023-10-17 14:16:30','2023-10-17 14:16:30','f38dbeb3-79a1-4550-b86a-3d510a1ae229'),(3276,3275,20,5,1,NULL,'2023-10-18 17:19:55','2023-10-18 17:19:55','29ddaf80-76fe-448a-bd6d-ab667eb9e893'),(3277,3275,20,4,2,NULL,'2023-10-18 17:19:55','2023-10-18 17:19:55','fdbd6b77-2e1e-4a3b-9281-7a49d0434f59'),(3278,3275,20,5,3,NULL,'2023-10-18 17:19:55','2023-10-18 17:19:55','de6293db-a988-4698-ad3d-4c5a3735b2e0'),(3279,3275,20,4,4,NULL,'2023-10-18 17:19:55','2023-10-18 17:19:55','f3dd6cb7-df9d-4eec-a7b6-600c71e4e301'),(3280,3275,20,5,5,NULL,'2023-10-18 17:19:55','2023-10-18 17:19:55','1062c32a-3f10-4fec-8c2f-c0d2c4775f89'),(3281,3275,20,4,6,NULL,'2023-10-18 17:19:55','2023-10-18 17:19:55','575aba23-e185-4c49-897e-021ee45123ad'),(3282,3275,20,5,7,NULL,'2023-10-18 17:19:55','2023-10-18 17:19:55','291612dd-948a-44ea-b5e3-09c453c7dbe7'),(3284,3283,20,5,1,NULL,'2023-10-18 17:20:18','2023-10-18 17:20:18','d6c8e8d5-f278-4544-aea8-b26115452960'),(3285,3283,20,4,2,NULL,'2023-10-18 17:20:18','2023-10-18 17:20:18','53c78a32-1b7a-4e49-8bd7-e13f0686caff'),(3286,3283,20,5,3,NULL,'2023-10-18 17:20:18','2023-10-18 17:20:18','d75df8f9-9fa7-46cf-859f-d55c572155b8'),(3287,3283,20,4,4,NULL,'2023-10-18 17:20:18','2023-10-18 17:20:18','78d6dc83-cb56-4098-885c-fb12e103b935'),(3288,3283,20,5,5,NULL,'2023-10-18 17:20:18','2023-10-18 17:20:18','4f6e97c8-5d76-4eda-968d-9fdd7489bc48'),(3289,3283,20,4,6,NULL,'2023-10-18 17:20:18','2023-10-18 17:20:18','a09b3972-35d1-4451-98c4-acced7b33883'),(3290,3283,20,5,7,NULL,'2023-10-18 17:20:18','2023-10-18 17:20:18','1208db1d-59fd-4cfc-a86c-b88f0717cee2'),(3292,3291,20,5,1,NULL,'2023-10-19 15:57:45','2023-10-19 15:57:45','ceea4de2-5bac-4fdb-bcec-7c6e13ec505a'),(3293,3291,20,4,2,NULL,'2023-10-19 15:57:45','2023-10-19 15:57:45','07fdb5dd-41cf-4ad0-b204-40525b6843fe'),(3294,3291,20,5,3,NULL,'2023-10-19 15:57:45','2023-10-19 15:57:45','65bf8ea5-9fef-4d3f-85f4-1bc08c71c885'),(3295,3291,20,4,4,NULL,'2023-10-19 15:57:45','2023-10-19 15:57:45','18547135-5ef3-40cc-8419-e89f5f02a8ce'),(3296,3291,20,5,5,NULL,'2023-10-19 15:57:45','2023-10-19 15:57:45','5349ace8-4e54-40b9-a9c5-01c61b849391'),(3297,3291,20,4,6,NULL,'2023-10-19 15:57:45','2023-10-19 15:57:45','d5488449-555c-405d-bcc3-6bbabc7c702b'),(3298,3291,20,5,7,NULL,'2023-10-19 15:57:45','2023-10-19 15:57:45','b6380535-7b1a-4e48-a84e-a4f29a3bc96f'),(3300,3299,20,5,1,NULL,'2023-10-19 15:57:46','2023-10-19 15:57:46','bb6353e7-743b-49bd-8eac-b96940a6cd44'),(3301,3299,20,4,2,NULL,'2023-10-19 15:57:46','2023-10-19 15:57:46','b6ba90b6-b231-4371-b6ff-b1d883f8c04d'),(3302,3299,20,5,3,NULL,'2023-10-19 15:57:46','2023-10-19 15:57:46','7adae8f7-f4ab-41a3-a9eb-a32534ac1912'),(3303,3299,20,4,4,NULL,'2023-10-19 15:57:46','2023-10-19 15:57:46','26605ec8-28ea-454f-870d-4dd0556148b1'),(3304,3299,20,5,5,NULL,'2023-10-19 15:57:46','2023-10-19 15:57:46','1f771dd1-e637-45d9-ad7f-f78ac7f97d1a'),(3305,3299,20,4,6,NULL,'2023-10-19 15:57:46','2023-10-19 15:57:46','3944e2fe-c0d3-41e3-8c04-d971d747aacc'),(3306,3299,20,5,7,NULL,'2023-10-19 15:57:46','2023-10-19 15:57:46','d8e40c78-4773-4bf4-9c5b-13c66c3149d0'),(3308,3307,20,5,1,NULL,'2023-10-19 15:57:48','2023-10-19 15:57:48','3b50a518-7b0a-4a5f-aeb5-0c92085a6b9b'),(3309,3307,20,4,2,NULL,'2023-10-19 15:57:48','2023-10-19 15:57:48','d0a91dea-ecb0-4963-b4f7-f0253b091c21'),(3310,3307,20,5,3,NULL,'2023-10-19 15:57:48','2023-10-19 15:57:48','25c85f59-b7eb-4d31-ab3f-c182d330443b'),(3311,3307,20,4,4,NULL,'2023-10-19 15:57:48','2023-10-19 15:57:48','266d065d-5912-41f0-a378-72dfef67e091'),(3312,3307,20,5,5,NULL,'2023-10-19 15:57:48','2023-10-19 15:57:48','cd1bc733-23af-4aa1-8cca-b265db8d5ac3'),(3313,3307,20,4,6,NULL,'2023-10-19 15:57:48','2023-10-19 15:57:48','5f0a20f1-76ff-4497-9ac6-6ff717e22e00'),(3314,3307,20,5,7,NULL,'2023-10-19 15:57:48','2023-10-19 15:57:48','7c5fee2a-03b4-409f-893a-4c4a3b833ea6'),(3316,3315,20,5,1,NULL,'2023-10-19 15:57:50','2023-10-19 15:57:50','a21be41b-1738-40fd-b2fd-f0f04f070448'),(3317,3315,20,4,2,NULL,'2023-10-19 15:57:50','2023-10-19 15:57:50','a13dd826-138f-4eb4-8183-76343619c499'),(3318,3315,20,5,3,NULL,'2023-10-19 15:57:50','2023-10-19 15:57:50','68e4b1e8-cb14-4db7-a335-065b6a55e041'),(3319,3315,20,4,4,NULL,'2023-10-19 15:57:50','2023-10-19 15:57:50','3194c323-e33d-4a38-8ee0-b63b7a453169'),(3320,3315,20,5,5,NULL,'2023-10-19 15:57:50','2023-10-19 15:57:50','88e40e67-d35f-44f6-ab05-e63a9f8af897'),(3321,3315,20,4,6,NULL,'2023-10-19 15:57:50','2023-10-19 15:57:50','d44fbb6a-85ec-4ada-a10c-92f1b4af700c'),(3322,3315,20,5,7,NULL,'2023-10-19 15:57:50','2023-10-19 15:57:50','e90de9c4-ef6f-4c9b-b8c8-f48dd0a46db3'),(3324,3323,20,5,1,NULL,'2023-11-02 00:14:51','2023-11-02 00:14:51','10f60152-8834-4c05-9ad2-e22a04bcf039'),(3325,3323,20,4,2,NULL,'2023-11-02 00:14:51','2023-11-02 00:14:51','5034eef5-2038-4be1-8422-47903e6dad95'),(3326,3323,20,5,3,NULL,'2023-11-02 00:14:51','2023-11-02 00:14:51','cea30d0c-f84b-47c3-a4e3-9da6a4276aef'),(3327,3323,20,4,4,NULL,'2023-11-02 00:14:51','2023-11-02 00:14:51','ac2be461-9ed5-4be0-84a4-325056436d9d'),(3328,3323,20,5,5,NULL,'2023-11-02 00:14:51','2023-11-02 00:14:51','ad4c1bbc-9398-4597-af8f-6cb5070f577f'),(3329,3323,20,4,6,NULL,'2023-11-02 00:14:51','2023-11-02 00:14:51','f5558f51-d524-46e9-90ad-b8daef19af27'),(3330,3323,20,5,7,NULL,'2023-11-02 00:14:51','2023-11-02 00:14:51','8b5ccff5-ab45-4a78-9317-a7c8e383dcc6'),(3332,3331,20,5,1,NULL,'2023-12-13 19:52:13','2023-12-13 19:52:13','a70bb5cf-94f3-4e41-ae58-1cd3e32853b9'),(3333,3331,20,4,2,NULL,'2023-12-13 19:52:13','2023-12-13 19:52:13','6f7132df-57d7-40a4-a366-20d41f5eb874'),(3334,3331,20,5,3,NULL,'2023-12-13 19:52:13','2023-12-13 19:52:13','cc6d58c1-31e0-4fa9-91ea-aa149eb30f7b'),(3335,3331,20,4,4,NULL,'2023-12-13 19:52:13','2023-12-13 19:52:13','d5835ba1-af21-4954-b849-ebe97874489a'),(3336,3331,20,5,5,NULL,'2023-12-13 19:52:13','2023-12-13 19:52:13','964b6f7c-ac1e-419e-a726-2075ad48e47f'),(3337,3331,20,4,6,NULL,'2023-12-13 19:52:13','2023-12-13 19:52:13','7216a207-73c6-4f40-a6be-4a90a11ad131'),(3338,3331,20,5,7,NULL,'2023-12-13 19:52:13','2023-12-13 19:52:13','cf7b31d8-2a54-4270-909d-dac2b8e6dc30'),(3340,3339,20,5,1,NULL,'2023-12-13 19:52:15','2023-12-13 19:52:15','61407332-9ea0-4191-9ef0-476fdf9be465'),(3341,3339,20,4,2,NULL,'2023-12-13 19:52:16','2023-12-13 19:52:16','ef89d25b-e9e8-4a8b-85e5-01d19b956b80'),(3342,3339,20,5,3,NULL,'2023-12-13 19:52:16','2023-12-13 19:52:16','d8881947-245e-4b74-b40e-39203d5d5da7'),(3343,3339,20,4,4,NULL,'2023-12-13 19:52:16','2023-12-13 19:52:16','33106c8f-58e7-4da3-83f5-2644bbd3478d'),(3344,3339,20,5,5,NULL,'2023-12-13 19:52:16','2023-12-13 19:52:16','cb49c53a-dc02-4b79-901a-2b11cad26325'),(3345,3339,20,4,6,NULL,'2023-12-13 19:52:16','2023-12-13 19:52:16','af61182b-37c8-4c05-87d8-94a31e3da83a'),(3346,3339,20,5,7,NULL,'2023-12-13 19:52:16','2023-12-13 19:52:16','7bba70e3-c505-42ce-9b2e-633c42671ff9'),(3348,3347,20,5,1,NULL,'2024-01-15 18:13:00','2024-01-15 18:13:00','cf698d76-0937-4f92-a278-c365317e2fbe'),(3349,3347,20,4,2,NULL,'2024-01-15 18:13:00','2024-01-15 18:13:00','4d0fa984-0493-43f2-945b-20fadab296e0'),(3350,3347,20,5,3,NULL,'2024-01-15 18:13:00','2024-01-15 18:13:00','7602e149-a3ad-4f01-ab33-6ab496c9f433'),(3351,3347,20,4,4,NULL,'2024-01-15 18:13:00','2024-01-15 18:13:00','7b32a863-258c-4d86-97a2-b3f61421b855'),(3352,3347,20,5,5,NULL,'2024-01-15 18:13:00','2024-01-15 18:13:00','b4a38967-3d89-4f9f-8c0f-8f7357c9ba73'),(3353,3347,20,4,6,NULL,'2024-01-15 18:13:00','2024-01-15 18:13:00','8104aa4b-46cb-44a8-afa5-ed4598229dca'),(3354,3347,20,5,7,NULL,'2024-01-15 18:13:00','2024-01-15 18:13:00','6cbbd960-5301-4c18-a88a-f84bd112aff7'),(3356,3355,20,5,1,NULL,'2024-01-15 18:13:01','2024-01-15 18:13:01','0294b45d-2844-4e13-9d36-2cb715592493'),(3357,3355,20,4,2,NULL,'2024-01-15 18:13:01','2024-01-15 18:13:01','f072714c-cbd4-4cd8-aeb6-7e24bcad5c91'),(3358,3355,20,5,3,NULL,'2024-01-15 18:13:01','2024-01-15 18:13:01','ad048523-18ac-4413-b570-4f93e7d9f851'),(3359,3355,20,4,4,NULL,'2024-01-15 18:13:01','2024-01-15 18:13:01','76d823c4-d334-4f7c-a338-0bdaf87c6aba'),(3360,3355,20,5,5,NULL,'2024-01-15 18:13:01','2024-01-15 18:13:01','572ab76d-ded6-4f94-84ff-68e086fe3d8a'),(3361,3355,20,4,6,NULL,'2024-01-15 18:13:01','2024-01-15 18:13:01','b6e349ce-8108-4744-9962-ac17a5765df9'),(3362,3355,20,5,7,NULL,'2024-01-15 18:13:01','2024-01-15 18:13:01','240e037c-c9eb-4cd9-ad87-d98f1b349f88'),(3364,3363,20,5,1,NULL,'2024-01-15 18:13:02','2024-01-15 18:13:02','860a79ba-a70e-4c48-a705-cb4ccc987eac'),(3365,3363,20,4,2,NULL,'2024-01-15 18:13:02','2024-01-15 18:13:02','c0bcec5f-dea1-4699-9ccd-47041856023f'),(3366,3363,20,5,3,NULL,'2024-01-15 18:13:02','2024-01-15 18:13:02','ade29579-e918-4a27-8aea-fc42871fce38'),(3367,3363,20,4,4,NULL,'2024-01-15 18:13:02','2024-01-15 18:13:02','b942f144-3b86-4662-9350-0326d84b1cda'),(3368,3363,20,5,5,NULL,'2024-01-15 18:13:02','2024-01-15 18:13:02','e7ebace2-c9f5-44f5-9d03-987ea5687aaf'),(3369,3363,20,4,6,NULL,'2024-01-15 18:13:02','2024-01-15 18:13:02','27cb6d52-652e-4721-9c4b-3c635c69b11a'),(3370,3363,20,5,7,NULL,'2024-01-15 18:13:02','2024-01-15 18:13:02','9a135ba4-2194-4e7e-8ad7-cf8ada273a90'),(3372,3371,20,5,1,NULL,'2024-01-15 18:13:05','2024-01-15 18:13:05','e08ce453-bddf-467a-b1c1-15a7f2558f6d'),(3373,3371,20,4,2,NULL,'2024-01-15 18:13:05','2024-01-15 18:13:05','03f684a4-505d-4278-adc5-b72945b35ba2'),(3374,3371,20,5,3,NULL,'2024-01-15 18:13:05','2024-01-15 18:13:05','2fae5e54-2a12-4fb4-85f5-6609ef6f46e9'),(3375,3371,20,4,4,NULL,'2024-01-15 18:13:05','2024-01-15 18:13:05','32f63076-44bf-4b6a-b1fe-2c96e5b888fc'),(3376,3371,20,5,5,NULL,'2024-01-15 18:13:05','2024-01-15 18:13:05','9b931923-ca71-4bd4-bc1f-7481854eae6d'),(3377,3371,20,4,6,NULL,'2024-01-15 18:13:05','2024-01-15 18:13:05','a9ea3b68-8ea3-47b7-bbe1-11bb71df807b'),(3378,3371,20,5,7,NULL,'2024-01-15 18:13:05','2024-01-15 18:13:05','6604f728-b664-4da9-9174-2c25503c64c5'),(3380,3379,20,5,1,NULL,'2024-01-15 18:13:13','2024-01-15 18:13:13','8f91af7c-ad2c-4980-b191-26d3f2ad7b7f'),(3381,3379,20,4,2,NULL,'2024-01-15 18:13:13','2024-01-15 18:13:13','b808e951-6af1-450e-97b6-6a52535b2dd5'),(3382,3379,20,5,3,NULL,'2024-01-15 18:13:13','2024-01-15 18:13:13','11ea3d7f-0587-4149-8d62-bca802a31873'),(3383,3379,20,4,4,NULL,'2024-01-15 18:13:13','2024-01-15 18:13:13','bc1f4b16-3afe-49ae-9146-406c3186717e'),(3384,3379,20,5,5,NULL,'2024-01-15 18:13:13','2024-01-15 18:13:13','751e7060-5672-4aca-979d-e0c8123240a4'),(3385,3379,20,4,6,NULL,'2024-01-15 18:13:13','2024-01-15 18:13:13','0e8cfb39-0f09-4836-a407-afe774273135'),(3386,3379,20,5,7,NULL,'2024-01-15 18:13:13','2024-01-15 18:13:13','83b9172d-8443-4e26-9f53-4db7320c4241'),(3388,3387,20,5,1,NULL,'2024-01-19 15:14:11','2024-01-19 15:14:11','f094ed21-858b-4ea2-b364-733376091206'),(3389,3387,20,4,2,NULL,'2024-01-19 15:14:11','2024-01-19 15:14:11','2aec61dc-5e9f-491b-aabd-920b6ccb8eff'),(3390,3387,20,5,3,NULL,'2024-01-19 15:14:11','2024-01-19 15:14:11','e9faa207-0f7e-4239-83f4-1720b91d7232'),(3391,3387,20,4,4,NULL,'2024-01-19 15:14:11','2024-01-19 15:14:11','3bac47fc-64c3-4209-bef4-1efa39943815'),(3392,3387,20,5,5,NULL,'2024-01-19 15:14:11','2024-01-19 15:14:11','c740a5fb-157b-4f5a-99c0-dcefbac7e0bd'),(3393,3387,20,4,6,NULL,'2024-01-19 15:14:11','2024-01-19 15:14:11','95d0c5a8-543b-418f-a5fc-8e32818b9f94'),(3394,3387,20,5,7,NULL,'2024-01-19 15:14:11','2024-01-19 15:14:11','8c4c377d-c928-4e4a-b017-ab54c0e4e2e0'),(3396,3395,20,5,1,NULL,'2024-01-19 15:14:15','2024-01-19 15:14:15','5ab7daa0-dbf8-4439-abc9-198edc5cbf2c'),(3397,3395,20,4,2,NULL,'2024-01-19 15:14:15','2024-01-19 15:14:15','c2de85c4-68a0-48cc-bf30-1034ece19a74'),(3398,3395,20,5,3,NULL,'2024-01-19 15:14:15','2024-01-19 15:14:15','725bd2c5-0fbf-4a72-bd1d-c43419e392d9'),(3399,3395,20,4,4,NULL,'2024-01-19 15:14:15','2024-01-19 15:14:15','b24c103e-f73d-42eb-a690-1b4c977913d4'),(3400,3395,20,5,5,NULL,'2024-01-19 15:14:15','2024-01-19 15:14:15','e3c46985-ca46-4ca1-aae9-adc0171bae7d'),(3401,3395,20,4,6,NULL,'2024-01-19 15:14:15','2024-01-19 15:14:15','40b3a78b-011f-4b62-9cef-d2a36f26f618'),(3402,3395,20,5,7,NULL,'2024-01-19 15:14:15','2024-01-19 15:14:15','ad78ee99-361d-4850-b237-d04bf115149b'),(3404,3403,20,5,1,NULL,'2024-01-19 15:14:19','2024-01-19 15:14:19','fe840079-aa5f-4257-ae1b-783dacec683e'),(3405,3403,20,4,2,NULL,'2024-01-19 15:14:19','2024-01-19 15:14:19','1ccb1fd9-39f2-4603-8061-90a635691551'),(3406,3403,20,5,3,NULL,'2024-01-19 15:14:19','2024-01-19 15:14:19','174ccd79-c315-465b-92d2-7c81fc82389f'),(3407,3403,20,4,4,NULL,'2024-01-19 15:14:19','2024-01-19 15:14:19','59ab87cb-a0cc-4a95-a600-7936be77d8f8'),(3408,3403,20,5,5,NULL,'2024-01-19 15:14:19','2024-01-19 15:14:19','678a9a51-b806-4c84-a28f-e6377cec3534'),(3409,3403,20,4,6,NULL,'2024-01-19 15:14:19','2024-01-19 15:14:19','11c9ef88-9771-408b-8ffe-c413f1bf07dc'),(3410,3403,20,5,7,NULL,'2024-01-19 15:14:19','2024-01-19 15:14:19','549eb425-0b10-4eb7-beb5-84c1b0b529c4'),(3412,3411,20,5,1,NULL,'2024-01-19 15:14:21','2024-01-19 15:14:21','9e102585-8cd3-4890-b787-63d114d251a6'),(3413,3411,20,4,2,NULL,'2024-01-19 15:14:21','2024-01-19 15:14:21','936edead-8493-413f-9819-81593dd9e26c'),(3414,3411,20,5,3,NULL,'2024-01-19 15:14:21','2024-01-19 15:14:21','d1230e93-f432-424e-9e11-2d00b1f3ae83'),(3415,3411,20,4,4,NULL,'2024-01-19 15:14:21','2024-01-19 15:14:21','d84d60c1-3593-472a-9efe-673fb9b33431'),(3416,3411,20,5,5,NULL,'2024-01-19 15:14:21','2024-01-19 15:14:21','d5506451-6cd7-43b9-b302-e70039984cf1'),(3417,3411,20,4,6,NULL,'2024-01-19 15:14:21','2024-01-19 15:14:21','aae8d568-1931-4c9e-928c-899ed2652989'),(3418,3411,20,5,7,NULL,'2024-01-19 15:14:21','2024-01-19 15:14:21','7f47e05e-6b79-48f6-95ff-3ea2a4e354e9');
commit;

--
-- Dumping data for table `craft_matrixblocktypes`
--

set autocommit=0;
INSERT INTO `craft_matrixblocktypes` VALUES (1,6,19,'Big Screenshot','bigScreenshot',1,'2014-01-18 04:22:41','2017-09-07 21:53:27','5f36ea81-76de-484e-bc2f-2b7fbcdfd4ba'),(2,6,20,'Small Screenshot','smallScreenshot',2,'2014-01-18 04:22:42','2017-09-07 21:53:27','8dbf5901-f68e-4d1d-a7e0-3d3564633caf'),(3,11,22,'Fact','fact',1,'2014-01-18 21:33:17','2019-10-09 15:56:06','9841c1ec-e327-414e-8606-0629dfa49f62'),(4,20,39,'Code','code',2,'2023-01-26 15:20:29','2023-01-26 15:20:29','306075d5-6875-4386-87f7-5458431def30'),(5,20,40,'Text','text',1,'2023-01-26 15:20:29','2023-01-26 15:20:29','4dab73a6-3747-4e23-95b2-5b094733276c');
commit;

--
-- Dumping data for table `craft_matrixcontent_bodyblocks`
--

set autocommit=0;
INSERT INTO `craft_matrixcontent_bodyblocks` VALUES (110,2640,1,'2023-01-26 15:55:05','2023-01-26 22:17:44','d4741d57-a18f-4ece-b11f-31c3458e089e',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(111,2641,1,'2023-01-26 15:55:05','2023-01-26 22:17:44','b73cb947-5d3a-4f4a-98d9-32242d47ccc0','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(112,2642,1,'2023-01-26 15:55:05','2023-01-26 22:17:44','236c02ca-1872-483c-b22c-f36243d52b40',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(113,2643,1,'2023-01-26 15:55:05','2023-01-26 22:17:44','856e31a7-c4f3-49c4-8815-69c122f3dd0a','ReferenceError: window is not defined','text',NULL),(114,2644,1,'2023-01-26 15:55:05','2023-01-26 22:17:44','39431e25-dd21-41f6-9e6f-3722d1ff9171',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(115,2645,1,'2023-01-26 15:55:05','2023-01-26 22:17:44','60ebe326-224e-4ae3-920a-f8f86bcc4642','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(116,2646,1,'2023-01-26 15:55:05','2023-01-26 22:17:44','6e7aeead-b920-4f3a-95f9-37efd5560c7f',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(234,2772,1,'2023-01-26 22:35:53','2023-01-26 22:41:42','4bab497b-0135-4a06-963f-eb6a3b7336c2',NULL,NULL,'<p>In my <a href=\"https://www.trevor-davis.com/blog/why-im-so-excited-about-remix\">previous post</a>, I talked about transitioning my site from being powered by <a href=\"https://craftcms.com/\">Craft</a> to being powered by <a href=\"https://remix.run/\">Remix</a> and a GraphQL endpoint coming from Craft. One of the best features of Craft is <a href=\"https://craftcms.com/features/all#live-preview\">Live Preview</a>, and it took a little configuration to get this working on my new Remix powered site.</p>\r\n<h2>Remix Configuration</h2>\r\n<p>These were specific changes that I needed to make on the Remix side, but really it would be the same for any GraphQL request. As Andrew Welch breaks down in <a href=\"https://nystudio107.com/blog/headless-preview-in-craft-cms\">his article</a>, the key is passing the token parameter back that Craft included in the URL.</p>\r\n<p>In the loader function of my blog post route, I call a helper function to setup the GraphQL client, and I pass the request to it:</p>'),(235,2773,1,'2023-01-26 22:35:53','2023-01-26 22:41:42','ea876e85-fa08-40a3-a0b6-0b461456a49b','import { json } from \'remix\'\nimport { gql } from \'graphql-request\'\nimport { gqlClient } from \'graphql.server\'\n\nexport const loader = async ({ request }) => {\n    const { entries } = await gqlClient(request).request(gql`\n        {\n            YOUR GRAPHQL QUERY HERE\n        }\n    `)\n\n    return json({ entries })\n}','jsx',NULL),(236,2774,1,'2023-01-26 22:35:53','2023-01-26 22:41:42','0018cbea-c2ec-46a6-adf9-41be937cfc0b',NULL,NULL,'<p>And then in my helper function, I take that request, grab the URL params that I want to include, and add those to my GraphQL request endpoint URL:</p>'),(237,2775,1,'2023-01-26 22:35:53','2023-01-26 22:41:42','cc4c6a77-9a36-4fb0-92fc-7ed39595145b','import { GraphQLClient } from \'graphql-request\'\n\n// Extract allowed query params and construct query string\nconst getQueryParams = (request) => {\n    const url = new URL(request.url)\n    const allowedKeys = [\'x-craft-preview\', \'x-craft-live-preview\', \'token\']\n    const filteredParams = Object.entries(\n        Object.fromEntries(url.searchParams)\n    ).filter(([key]) => allowedKeys.includes(key))\n\n    if (!filteredParams.length) {\n        return \'\'\n    }\n\n    const queryString = filteredParams.map((val) => val.join(\'=\')).join(\'&\')\n\n    return `?${queryString}`\n}\n\nexport const gqlClient = (request = null) => {\n    const queryString = request ? getQueryParams(request) : \'\'\n\n    return new GraphQLClient(`https://your-endpoint-here/${queryString}`, {\n        headers: {\n            authorization: `Bearer YOUR_AUTH_TOKEN_HERE`,\n        },\n    })\n}','jsx',NULL),(238,2776,1,'2023-01-26 22:35:53','2023-01-26 22:41:42','1c02fac1-925b-40ff-8831-3396f447c3e3',NULL,NULL,'<p>It wasn’t totally necessary to include the <code>x-craft-preview</code> and <code>x-craft-live-preview</code> parameters, but I figured it couldn’t hurt.</p>\r\n<h2>Craft Configuration</h2>\r\n<p>Now with the Remix configuration in place, I just needed to make two small changes to Craft to get it working correctly. First, I had to update the preview target for my Blog section to point to my Remix site:</p>\r\n<figure><img src=\"{asset:2283:url||//assets.trevor-davis.com/uploads/images/content/blog-section-preview-target.png}\" data-image=\"2283\" alt=\"Setting the preview target in my Blog Section\"></figure>\r\n<p>Then, I had to update the <code>config/general.php</code> to allow iframe requests from my Remix domain:</p>'),(239,2777,1,'2023-01-26 22:35:53','2023-01-26 22:41:42','eb2b3109-102b-4d82-802a-9d6b0e4dd7cd','<?php\n\nreturn [\n    \'*\' => [\n        \'headlessMode\' => true,\n        \'previewIframeResizerOptions\' => [\n            \'checkOrigin\' => [\n                \'https://www.trevor-davis.com\',\n            ],\n        ],\n    ],\n];','php',NULL),(240,2778,1,'2023-01-26 22:35:53','2023-01-26 22:41:42','f013d8ce-0c0d-4142-a8cb-2b4d34ae7e37',NULL,NULL,'<h2>Voilà, Live Preview</h2>\r\n<p>And just like that, I had live preview working.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/live-preview.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\" width=\"100%\"></video></p>'),(241,2780,1,'2023-01-26 22:35:53','2023-01-26 22:35:53','c2434d0c-3224-482c-90d0-eb6df6c21158',NULL,NULL,'<p>In my <a href=\"https://www.trevor-davis.com/blog/why-im-so-excited-about-remix\">previous post</a>, I talked about transitioning my site from being powered by <a href=\"https://craftcms.com/\">Craft</a> to being powered by <a href=\"https://remix.run/\">Remix</a> and a GraphQL endpoint coming from Craft. One of the best features of Craft is <a href=\"https://craftcms.com/features/all#live-preview\">Live Preview</a>, and it took a little configuration to get this working on my new Remix powered site.</p>\r\n<h2>Remix Configuration</h2>\r\n<p>These were specific changes that I needed to make on the Remix side, but really it would be the same for any GraphQL request. As Andrew Welch breaks down in <a href=\"https://nystudio107.com/blog/headless-preview-in-craft-cms\">his article</a>, the key is passing the token parameter back that Craft included in the URL.</p>\r\n<p>In the loader function of my blog post route, I call a helper function to setup the GraphQL client, and I pass the request to it:</p>'),(242,2781,1,'2023-01-26 22:35:53','2023-01-26 22:35:53','eea35156-8a54-4f75-ba78-16c041187cad','import { json } from \'remix\'\nimport { gql } from \'graphql-request\'\nimport { gqlClient } from \'graphql.server\'\n\nexport const loader = async ({ request }) => {\n    const { entries } = await gqlClient(request).request(gql`\n        {\n            YOUR GRAPHQL QUERY HERE\n        }\n    `)\n\n    return json({ entries })\n}','jsx',NULL),(243,2782,1,'2023-01-26 22:35:53','2023-01-26 22:35:53','bd655dfe-66cb-44e5-9340-749a6e9a2330',NULL,NULL,'<p>And then in my helper function, I take that request, grab the URL params that I want to include, and add those to my GraphQL request endpoint URL:</p>'),(244,2783,1,'2023-01-26 22:35:53','2023-01-26 22:35:53','ab900cb5-5aff-4757-9bc7-ea3986289af8','import { GraphQLClient } from \'graphql-request\'\n\n// Pass through allowed query params to the requst\nconst getQueryParams = (request) => {\n    const url = new URL(request.url)\n    const allowedKeys = [\'x-craft-preview\', \'x-craft-live-preview\', \'token\']\n    const filteredParams = Object.entries(\n        Object.fromEntries(url.searchParams)\n    ).filter(([key]) => allowedKeys.includes(key))\n\n    if (!filteredParams.length) {\n        return \'\'\n    }\n\n    const queryString = filteredParams.map((val) => val.join(\'=\')).join(\'&\')\n\n    return `?${queryString}`\n}\n\nexport const gqlClient = (request = null) => {\n    const queryString = request ? getQueryParams(request) : \'\'\n\n    return new GraphQLClient(`https://your-endpoint-here/${queryString}`, {\n        headers: {\n            authorization: `Bearer YOUR_AUTH_TOKEN_HERE`,\n        },\n    })\n}','jsx',NULL),(245,2784,1,'2023-01-26 22:35:53','2023-01-26 22:35:53','fa40dc1b-f7e9-48fc-b2c7-c2a049995c85',NULL,NULL,'<p>It wasn’t totally necessary to include the <code>x-craft-preview</code> and <code>x-craft-live-preview</code> parameters, but I figured it couldn’t hurt.</p>\r\n<h2>Craft Configuration</h2>\r\n<p>Now with the Remix configuration in place, I just needed to make two small changes to Craft to get it working correctly. First, I had to update the preview target for my Blog section to point to my Remix site:</p>\r\n<figure><img src=\"{asset:2283:url||//assets.trevor-davis.com/uploads/images/content/blog-section-preview-target.png}\" data-image=\"2283\" alt=\"Setting the preview target in my Blog Section\"></figure>\r\n<p>Then, I had to update the <code>config/general.php</code> to allow iframe requests from my Remix domain:</p>'),(246,2785,1,'2023-01-26 22:35:53','2023-01-26 22:35:53','c616a82c-9f11-4f07-8485-77f426aad923','<?php\n\nreturn [\n    \'*\' => [\n        \'headlessMode\' => true,\n        \'previewIframeResizerOptions\' => [\n            \'checkOrigin\' => [\n                \'https://www.trevor-davis.com\',\n            ],\n        ],\n    ],\n];','php',NULL),(247,2786,1,'2023-01-26 22:35:53','2023-01-26 22:35:53','27f0ae65-5dd9-4883-994b-1704c1876c0a',NULL,NULL,'<h2>Voilà, Live Preview</h2>\r\n<p>And just like that, I had live preview working.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/live-preview.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\" width=\"100%\"></video></p>'),(255,2796,1,'2023-01-26 22:36:56','2023-01-26 22:36:56','726bcc64-b759-4d07-b774-24395cc44fe2',NULL,NULL,'<p>In my <a href=\"https://www.trevor-davis.com/blog/why-im-so-excited-about-remix\">previous post</a>, I talked about transitioning my site from being powered by <a href=\"https://craftcms.com/\">Craft</a> to being powered by <a href=\"https://remix.run/\">Remix</a> and a GraphQL endpoint coming from Craft. One of the best features of Craft is <a href=\"https://craftcms.com/features/all#live-preview\">Live Preview</a>, and it took a little configuration to get this working on my new Remix powered site.</p>\r\n<h2>Remix Configuration</h2>\r\n<p>These were specific changes that I needed to make on the Remix side, but really it would be the same for any GraphQL request. As Andrew Welch breaks down in <a href=\"https://nystudio107.com/blog/headless-preview-in-craft-cms\">his article</a>, the key is passing the token parameter back that Craft included in the URL.</p>\r\n<p>In the loader function of my blog post route, I call a helper function to setup the GraphQL client, and I pass the request to it:</p>'),(256,2797,1,'2023-01-26 22:36:56','2023-01-26 22:36:56','e66ac0d7-4b06-4cdc-a054-7d659362c7b8','import { json } from \'remix\'\nimport { gql } from \'graphql-request\'\nimport { gqlClient } from \'graphql.server\'\n\nexport const loader = async ({ request }) => {\n    const { entries } = await gqlClient(request).request(gql`\n        {\n            YOUR GRAPHQL QUERY HERE\n        }\n    `)\n\n    return json({ entries })\n}','jsx',NULL),(257,2798,1,'2023-01-26 22:36:56','2023-01-26 22:36:56','c0958a82-02ba-479f-a40a-0455b2e9e4f1',NULL,NULL,'<p>And then in my helper function, I take that request, grab the URL params that I want to include, and add those to my GraphQL request endpoint URL:</p>'),(258,2799,1,'2023-01-26 22:36:56','2023-01-26 22:36:56','b6b437c7-e782-4925-b8b9-966c4d91e8ce','import { GraphQLClient } from \'graphql-request\'\n\n/* Pass through allowed query params to the request */\nconst getQueryParams = (request) => {\n    const url = new URL(request.url)\n    const allowedKeys = [\'x-craft-preview\', \'x-craft-live-preview\', \'token\']\n    const filteredParams = Object.entries(\n        Object.fromEntries(url.searchParams)\n    ).filter(([key]) => allowedKeys.includes(key))\n\n    if (!filteredParams.length) {\n        return \'\'\n    }\n\n    const queryString = filteredParams.map((val) => val.join(\'=\')).join(\'&\')\n\n    return `?${queryString}`\n}\n\nexport const gqlClient = (request = null) => {\n    const queryString = request ? getQueryParams(request) : \'\'\n\n    return new GraphQLClient(`https://your-endpoint-here/${queryString}`, {\n        headers: {\n            authorization: `Bearer YOUR_AUTH_TOKEN_HERE`,\n        },\n    })\n}','jsx',NULL),(259,2800,1,'2023-01-26 22:36:56','2023-01-26 22:36:56','d6f2bd1a-09b2-4de7-abd7-23d443c70305',NULL,NULL,'<p>It wasn’t totally necessary to include the <code>x-craft-preview</code> and <code>x-craft-live-preview</code> parameters, but I figured it couldn’t hurt.</p>\r\n<h2>Craft Configuration</h2>\r\n<p>Now with the Remix configuration in place, I just needed to make two small changes to Craft to get it working correctly. First, I had to update the preview target for my Blog section to point to my Remix site:</p>\r\n<figure><img src=\"{asset:2283:url||//assets.trevor-davis.com/uploads/images/content/blog-section-preview-target.png}\" data-image=\"2283\" alt=\"Setting the preview target in my Blog Section\"></figure>\r\n<p>Then, I had to update the <code>config/general.php</code> to allow iframe requests from my Remix domain:</p>'),(260,2801,1,'2023-01-26 22:36:57','2023-01-26 22:36:57','4721f389-e03d-47ef-b56a-44c1812fa751','<?php\n\nreturn [\n    \'*\' => [\n        \'headlessMode\' => true,\n        \'previewIframeResizerOptions\' => [\n            \'checkOrigin\' => [\n                \'https://www.trevor-davis.com\',\n            ],\n        ],\n    ],\n];','php',NULL),(261,2802,1,'2023-01-26 22:36:57','2023-01-26 22:36:57','ecf4a3c4-5df0-4084-915a-1281c383f363',NULL,NULL,'<h2>Voilà, Live Preview</h2>\r\n<p>And just like that, I had live preview working.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/live-preview.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\" width=\"100%\"></video></p>'),(269,2812,1,'2023-01-26 22:37:15','2023-01-26 22:37:15','c3e6ea50-33a5-4695-bf25-690ae278ea56',NULL,NULL,'<p>In my <a href=\"https://www.trevor-davis.com/blog/why-im-so-excited-about-remix\">previous post</a>, I talked about transitioning my site from being powered by <a href=\"https://craftcms.com/\">Craft</a> to being powered by <a href=\"https://remix.run/\">Remix</a> and a GraphQL endpoint coming from Craft. One of the best features of Craft is <a href=\"https://craftcms.com/features/all#live-preview\">Live Preview</a>, and it took a little configuration to get this working on my new Remix powered site.</p>\r\n<h2>Remix Configuration</h2>\r\n<p>These were specific changes that I needed to make on the Remix side, but really it would be the same for any GraphQL request. As Andrew Welch breaks down in <a href=\"https://nystudio107.com/blog/headless-preview-in-craft-cms\">his article</a>, the key is passing the token parameter back that Craft included in the URL.</p>\r\n<p>In the loader function of my blog post route, I call a helper function to setup the GraphQL client, and I pass the request to it:</p>'),(270,2813,1,'2023-01-26 22:37:15','2023-01-26 22:37:15','21bf019c-b40a-479d-a0d5-608b6426a5ae','import { json } from \'remix\'\nimport { gql } from \'graphql-request\'\nimport { gqlClient } from \'graphql.server\'\n\nexport const loader = async ({ request }) => {\n    const { entries } = await gqlClient(request).request(gql`\n        {\n            YOUR GRAPHQL QUERY HERE\n        }\n    `)\n\n    return json({ entries })\n}','jsx',NULL),(271,2814,1,'2023-01-26 22:37:15','2023-01-26 22:37:15','4b6b1816-999d-4c4a-8a1b-c93b82d28825',NULL,NULL,'<p>And then in my helper function, I take that request, grab the URL params that I want to include, and add those to my GraphQL request endpoint URL:</p>'),(272,2815,1,'2023-01-26 22:37:15','2023-01-26 22:37:15','b293d837-93a3-43de-8558-d617c002bf48','import { GraphQLClient } from \'graphql-request\'\n\n// Pass through allowed query params to the request\n\nconst getQueryParams = (request) => {\n    const url = new URL(request.url)\n    const allowedKeys = [\'x-craft-preview\', \'x-craft-live-preview\', \'token\']\n    const filteredParams = Object.entries(\n        Object.fromEntries(url.searchParams)\n    ).filter(([key]) => allowedKeys.includes(key))\n\n    if (!filteredParams.length) {\n        return \'\'\n    }\n\n    const queryString = filteredParams.map((val) => val.join(\'=\')).join(\'&\')\n\n    return `?${queryString}`\n}\n\nexport const gqlClient = (request = null) => {\n    const queryString = request ? getQueryParams(request) : \'\'\n\n    return new GraphQLClient(`https://your-endpoint-here/${queryString}`, {\n        headers: {\n            authorization: `Bearer YOUR_AUTH_TOKEN_HERE`,\n        },\n    })\n}','jsx',NULL),(273,2816,1,'2023-01-26 22:37:15','2023-01-26 22:37:15','4cd8d8c2-8e61-42cd-b05f-ee0815379aa5',NULL,NULL,'<p>It wasn’t totally necessary to include the <code>x-craft-preview</code> and <code>x-craft-live-preview</code> parameters, but I figured it couldn’t hurt.</p>\r\n<h2>Craft Configuration</h2>\r\n<p>Now with the Remix configuration in place, I just needed to make two small changes to Craft to get it working correctly. First, I had to update the preview target for my Blog section to point to my Remix site:</p>\r\n<figure><img src=\"{asset:2283:url||//assets.trevor-davis.com/uploads/images/content/blog-section-preview-target.png}\" data-image=\"2283\" alt=\"Setting the preview target in my Blog Section\"></figure>\r\n<p>Then, I had to update the <code>config/general.php</code> to allow iframe requests from my Remix domain:</p>'),(274,2817,1,'2023-01-26 22:37:15','2023-01-26 22:37:15','b2eec4cc-70ba-40cd-8847-52c5eec88e0a','<?php\n\nreturn [\n    \'*\' => [\n        \'headlessMode\' => true,\n        \'previewIframeResizerOptions\' => [\n            \'checkOrigin\' => [\n                \'https://www.trevor-davis.com\',\n            ],\n        ],\n    ],\n];','php',NULL),(275,2818,1,'2023-01-26 22:37:15','2023-01-26 22:37:15','1c325d20-a098-46cb-80c3-1c1bca4782af',NULL,NULL,'<h2>Voilà, Live Preview</h2>\r\n<p>And just like that, I had live preview working.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/live-preview.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\" width=\"100%\"></video></p>'),(283,2828,1,'2023-01-26 22:38:04','2023-01-26 22:38:04','74eae194-7790-4442-af3d-2eb8e70ebedd',NULL,NULL,'<p>In my <a href=\"https://www.trevor-davis.com/blog/why-im-so-excited-about-remix\">previous post</a>, I talked about transitioning my site from being powered by <a href=\"https://craftcms.com/\">Craft</a> to being powered by <a href=\"https://remix.run/\">Remix</a> and a GraphQL endpoint coming from Craft. One of the best features of Craft is <a href=\"https://craftcms.com/features/all#live-preview\">Live Preview</a>, and it took a little configuration to get this working on my new Remix powered site.</p>\r\n<h2>Remix Configuration</h2>\r\n<p>These were specific changes that I needed to make on the Remix side, but really it would be the same for any GraphQL request. As Andrew Welch breaks down in <a href=\"https://nystudio107.com/blog/headless-preview-in-craft-cms\">his article</a>, the key is passing the token parameter back that Craft included in the URL.</p>\r\n<p>In the loader function of my blog post route, I call a helper function to setup the GraphQL client, and I pass the request to it:</p>'),(284,2829,1,'2023-01-26 22:38:04','2023-01-26 22:38:04','d9665592-6ba4-4d1a-8b2c-8a17e0016cb5','import { json } from \'remix\'\nimport { gql } from \'graphql-request\'\nimport { gqlClient } from \'graphql.server\'\n\nexport const loader = async ({ request }) => {\n    const { entries } = await gqlClient(request).request(gql`\n        {\n            YOUR GRAPHQL QUERY HERE\n        }\n    `)\n\n    return json({ entries })\n}','jsx',NULL),(285,2830,1,'2023-01-26 22:38:04','2023-01-26 22:38:04','b3523f94-d2b3-442c-9ecf-b6decb2e264d',NULL,NULL,'<p>And then in my helper function, I take that request, grab the URL params that I want to include, and add those to my GraphQL request endpoint URL:</p>'),(286,2831,1,'2023-01-26 22:38:04','2023-01-26 22:38:04','928be380-fdf4-4acb-a13f-2b942fbad101','import { GraphQLClient } from \'graphql-request\'\n\n// Pass through allowed query params to the request\nconst getQueryParams = (request) => {\n    const url = new URL(request.url)\n    const allowedKeys = [\'x-craft-preview\', \'x-craft-live-preview\', \'token\']\n    const filteredParams = Object.entries(\n        Object.fromEntries(url.searchParams)\n    ).filter(([key]) => allowedKeys.includes(key))\n\n    if (!filteredParams.length) {\n        return \'\'\n    }\n\n    const queryString = filteredParams.map((val) => val.join(\'=\')).join(\'&\')\n\n    return `?${queryString}`\n}\n\nexport const gqlClient = (request = null) => {\n    const queryString = request ? getQueryParams(request) : \'\'\n\n    return new GraphQLClient(`https://your-endpoint-here/${queryString}`, {\n        headers: {\n            authorization: `Bearer YOUR_AUTH_TOKEN_HERE`,\n        },\n    })\n}','jsx',NULL),(287,2832,1,'2023-01-26 22:38:04','2023-01-26 22:38:04','3aff7423-f396-4a22-a3b8-fb4e38a26990',NULL,NULL,'<p>It wasn’t totally necessary to include the <code>x-craft-preview</code> and <code>x-craft-live-preview</code> parameters, but I figured it couldn’t hurt.</p>\r\n<h2>Craft Configuration</h2>\r\n<p>Now with the Remix configuration in place, I just needed to make two small changes to Craft to get it working correctly. First, I had to update the preview target for my Blog section to point to my Remix site:</p>\r\n<figure><img src=\"{asset:2283:url||//assets.trevor-davis.com/uploads/images/content/blog-section-preview-target.png}\" data-image=\"2283\" alt=\"Setting the preview target in my Blog Section\"></figure>\r\n<p>Then, I had to update the <code>config/general.php</code> to allow iframe requests from my Remix domain:</p>'),(288,2833,1,'2023-01-26 22:38:04','2023-01-26 22:38:04','e3dda9f4-030d-4ca3-b189-ab20b532ba07','<?php\n\nreturn [\n    \'*\' => [\n        \'headlessMode\' => true,\n        \'previewIframeResizerOptions\' => [\n            \'checkOrigin\' => [\n                \'https://www.trevor-davis.com\',\n            ],\n        ],\n    ],\n];','php',NULL),(289,2834,1,'2023-01-26 22:38:04','2023-01-26 22:38:04','1181e00b-3aa1-45c7-a6c7-2b9b19805ee3',NULL,NULL,'<h2>Voilà, Live Preview</h2>\r\n<p>And just like that, I had live preview working.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/live-preview.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\" width=\"100%\"></video></p>'),(297,2844,1,'2023-01-26 22:40:54','2023-01-26 22:40:54','043f1387-5b16-469d-868d-828713eacf44',NULL,NULL,'<p>In my <a href=\"https://www.trevor-davis.com/blog/why-im-so-excited-about-remix\">previous post</a>, I talked about transitioning my site from being powered by <a href=\"https://craftcms.com/\">Craft</a> to being powered by <a href=\"https://remix.run/\">Remix</a> and a GraphQL endpoint coming from Craft. One of the best features of Craft is <a href=\"https://craftcms.com/features/all#live-preview\">Live Preview</a>, and it took a little configuration to get this working on my new Remix powered site.</p>\r\n<h2>Remix Configuration</h2>\r\n<p>These were specific changes that I needed to make on the Remix side, but really it would be the same for any GraphQL request. As Andrew Welch breaks down in <a href=\"https://nystudio107.com/blog/headless-preview-in-craft-cms\">his article</a>, the key is passing the token parameter back that Craft included in the URL.</p>\r\n<p>In the loader function of my blog post route, I call a helper function to setup the GraphQL client, and I pass the request to it:</p>'),(298,2845,1,'2023-01-26 22:40:54','2023-01-26 22:40:54','b2b704e6-f101-4272-8e0c-7b98b44e0cdf','import { json } from \'remix\'\nimport { gql } from \'graphql-request\'\nimport { gqlClient } from \'graphql.server\'\n\nexport const loader = async ({ request }) => {\n    const { entries } = await gqlClient(request).request(gql`\n        {\n            YOUR GRAPHQL QUERY HERE\n        }\n    `)\n\n    return json({ entries })\n}','jsx',NULL),(299,2846,1,'2023-01-26 22:40:54','2023-01-26 22:40:54','c29a030f-b3f2-4818-8ee3-d3bea1ce347a',NULL,NULL,'<p>And then in my helper function, I take that request, grab the URL params that I want to include, and add those to my GraphQL request endpoint URL:</p>'),(300,2847,1,'2023-01-26 22:40:54','2023-01-26 22:40:54','393edf3d-209e-4931-aaa9-7123a7d9847a','import { GraphQLClient } from \'graphql-request\'\n\n{/* Extract allowed query params and construct query string */}\nconst getQueryParams = (request) => {\n    const url = new URL(request.url)\n    const allowedKeys = [\'x-craft-preview\', \'x-craft-live-preview\', \'token\']\n    const filteredParams = Object.entries(\n        Object.fromEntries(url.searchParams)\n    ).filter(([key]) => allowedKeys.includes(key))\n\n    if (!filteredParams.length) {\n        return \'\'\n    }\n\n    const queryString = filteredParams.map((val) => val.join(\'=\')).join(\'&\')\n\n    return `?${queryString}`\n}\n\nexport const gqlClient = (request = null) => {\n    const queryString = request ? getQueryParams(request) : \'\'\n\n    return new GraphQLClient(`https://your-endpoint-here/${queryString}`, {\n        headers: {\n            authorization: `Bearer YOUR_AUTH_TOKEN_HERE`,\n        },\n    })\n}','jsx',NULL),(301,2848,1,'2023-01-26 22:40:54','2023-01-26 22:40:54','69c74d27-e4aa-44bd-9514-db63c22c624b',NULL,NULL,'<p>It wasn’t totally necessary to include the <code>x-craft-preview</code> and <code>x-craft-live-preview</code> parameters, but I figured it couldn’t hurt.</p>\r\n<h2>Craft Configuration</h2>\r\n<p>Now with the Remix configuration in place, I just needed to make two small changes to Craft to get it working correctly. First, I had to update the preview target for my Blog section to point to my Remix site:</p>\r\n<figure><img src=\"{asset:2283:url||//assets.trevor-davis.com/uploads/images/content/blog-section-preview-target.png}\" data-image=\"2283\" alt=\"Setting the preview target in my Blog Section\"></figure>\r\n<p>Then, I had to update the <code>config/general.php</code> to allow iframe requests from my Remix domain:</p>'),(302,2849,1,'2023-01-26 22:40:54','2023-01-26 22:40:54','92ece704-59ea-4723-b8b5-4b2426252b91','<?php\n\nreturn [\n    \'*\' => [\n        \'headlessMode\' => true,\n        \'previewIframeResizerOptions\' => [\n            \'checkOrigin\' => [\n                \'https://www.trevor-davis.com\',\n            ],\n        ],\n    ],\n];','php',NULL),(303,2850,1,'2023-01-26 22:40:54','2023-01-26 22:40:54','bdec5bd3-9c6c-4de8-b2e6-812bc7c2277e',NULL,NULL,'<h2>Voilà, Live Preview</h2>\r\n<p>And just like that, I had live preview working.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/live-preview.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\" width=\"100%\"></video></p>'),(311,2860,1,'2023-01-26 22:41:11','2023-01-26 22:41:11','60925ca2-68a1-47ab-aae4-7d7dbb9e6009',NULL,NULL,'<p>In my <a href=\"https://www.trevor-davis.com/blog/why-im-so-excited-about-remix\">previous post</a>, I talked about transitioning my site from being powered by <a href=\"https://craftcms.com/\">Craft</a> to being powered by <a href=\"https://remix.run/\">Remix</a> and a GraphQL endpoint coming from Craft. One of the best features of Craft is <a href=\"https://craftcms.com/features/all#live-preview\">Live Preview</a>, and it took a little configuration to get this working on my new Remix powered site.</p>\r\n<h2>Remix Configuration</h2>\r\n<p>These were specific changes that I needed to make on the Remix side, but really it would be the same for any GraphQL request. As Andrew Welch breaks down in <a href=\"https://nystudio107.com/blog/headless-preview-in-craft-cms\">his article</a>, the key is passing the token parameter back that Craft included in the URL.</p>\r\n<p>In the loader function of my blog post route, I call a helper function to setup the GraphQL client, and I pass the request to it:</p>'),(312,2861,1,'2023-01-26 22:41:12','2023-01-26 22:41:12','3f8f07f8-ce0a-4f61-8257-a1fd91c606c4','import { json } from \'remix\'\nimport { gql } from \'graphql-request\'\nimport { gqlClient } from \'graphql.server\'\n\nexport const loader = async ({ request }) => {\n    const { entries } = await gqlClient(request).request(gql`\n        {\n            YOUR GRAPHQL QUERY HERE\n        }\n    `)\n\n    return json({ entries })\n}','jsx',NULL),(313,2862,1,'2023-01-26 22:41:12','2023-01-26 22:41:12','c93933b9-9434-4f49-8445-e195f7d17c20',NULL,NULL,'<p>And then in my helper function, I take that request, grab the URL params that I want to include, and add those to my GraphQL request endpoint URL:</p>'),(314,2863,1,'2023-01-26 22:41:12','2023-01-26 22:41:12','31512ea7-0ba6-4b19-8849-ac4aa3b39a60','import { GraphQLClient } from \'graphql-request\'\n\n{\n    /* Extract allowed query params and construct query string */\n}\n\nconst getQueryParams = (request) => {\n    const url = new URL(request.url)\n    const allowedKeys = [\'x-craft-preview\', \'x-craft-live-preview\', \'token\']\n    const filteredParams = Object.entries(\n        Object.fromEntries(url.searchParams)\n    ).filter(([key]) => allowedKeys.includes(key))\n\n    if (!filteredParams.length) {\n        return \'\'\n    }\n\n    const queryString = filteredParams.map((val) => val.join(\'=\')).join(\'&\')\n\n    return `?${queryString}`\n}\n\nexport const gqlClient = (request = null) => {\n    const queryString = request ? getQueryParams(request) : \'\'\n\n    return new GraphQLClient(`https://your-endpoint-here/${queryString}`, {\n        headers: {\n            authorization: `Bearer YOUR_AUTH_TOKEN_HERE`,\n        },\n    })\n}','jsx',NULL),(315,2864,1,'2023-01-26 22:41:12','2023-01-26 22:41:12','c2f87ca8-45bc-4052-91e4-6b5ec4b32687',NULL,NULL,'<p>It wasn’t totally necessary to include the <code>x-craft-preview</code> and <code>x-craft-live-preview</code> parameters, but I figured it couldn’t hurt.</p>\r\n<h2>Craft Configuration</h2>\r\n<p>Now with the Remix configuration in place, I just needed to make two small changes to Craft to get it working correctly. First, I had to update the preview target for my Blog section to point to my Remix site:</p>\r\n<figure><img src=\"{asset:2283:url||//assets.trevor-davis.com/uploads/images/content/blog-section-preview-target.png}\" data-image=\"2283\" alt=\"Setting the preview target in my Blog Section\"></figure>\r\n<p>Then, I had to update the <code>config/general.php</code> to allow iframe requests from my Remix domain:</p>'),(316,2865,1,'2023-01-26 22:41:12','2023-01-26 22:41:12','da7d6216-ca69-4c81-bc99-ca676b9d8f7c','<?php\n\nreturn [\n    \'*\' => [\n        \'headlessMode\' => true,\n        \'previewIframeResizerOptions\' => [\n            \'checkOrigin\' => [\n                \'https://www.trevor-davis.com\',\n            ],\n        ],\n    ],\n];','php',NULL),(317,2866,1,'2023-01-26 22:41:12','2023-01-26 22:41:12','545f285f-05e2-4cc1-889e-f7b1bece9e04',NULL,NULL,'<h2>Voilà, Live Preview</h2>\r\n<p>And just like that, I had live preview working.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/live-preview.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\" width=\"100%\"></video></p>'),(318,2868,1,'2023-01-26 22:41:23','2023-01-26 22:41:23','74f9b356-e249-4a07-a8f6-0b28afb91675',NULL,NULL,'<p>In my <a href=\"https://www.trevor-davis.com/blog/why-im-so-excited-about-remix\">previous post</a>, I talked about transitioning my site from being powered by <a href=\"https://craftcms.com/\">Craft</a> to being powered by <a href=\"https://remix.run/\">Remix</a> and a GraphQL endpoint coming from Craft. One of the best features of Craft is <a href=\"https://craftcms.com/features/all#live-preview\">Live Preview</a>, and it took a little configuration to get this working on my new Remix powered site.</p>\r\n<h2>Remix Configuration</h2>\r\n<p>These were specific changes that I needed to make on the Remix side, but really it would be the same for any GraphQL request. As Andrew Welch breaks down in <a href=\"https://nystudio107.com/blog/headless-preview-in-craft-cms\">his article</a>, the key is passing the token parameter back that Craft included in the URL.</p>\r\n<p>In the loader function of my blog post route, I call a helper function to setup the GraphQL client, and I pass the request to it:</p>'),(319,2869,1,'2023-01-26 22:41:23','2023-01-26 22:41:23','e78bdf87-5949-4a7f-9cb2-ea513c3f582d','import { json } from \'remix\'\nimport { gql } from \'graphql-request\'\nimport { gqlClient } from \'graphql.server\'\n\nexport const loader = async ({ request }) => {\n    const { entries } = await gqlClient(request).request(gql`\n        {\n            YOUR GRAPHQL QUERY HERE\n        }\n    `)\n\n    return json({ entries })\n}','jsx',NULL),(320,2870,1,'2023-01-26 22:41:23','2023-01-26 22:41:23','e16c7730-7017-4ef9-b521-1965876d3b6d',NULL,NULL,'<p>And then in my helper function, I take that request, grab the URL params that I want to include, and add those to my GraphQL request endpoint URL:</p>'),(321,2871,1,'2023-01-26 22:41:23','2023-01-26 22:41:23','22e4d14a-3cc8-4efe-beb7-b99cbd83fb43','import { GraphQLClient } from \'graphql-request\'\n\nconst getQueryParams = (request) => {\n    const url = new URL(request.url)\n    const allowedKeys = [\'x-craft-preview\', \'x-craft-live-preview\', \'token\']\n    const filteredParams = Object.entries(\n        Object.fromEntries(url.searchParams)\n    ).filter(([key]) => allowedKeys.includes(key))\n\n    if (!filteredParams.length) {\n        return \'\'\n    }\n\n    const queryString = filteredParams.map((val) => val.join(\'=\')).join(\'&\')\n\n    return `?${queryString}`\n}\n\nexport const gqlClient = (request = null) => {\n    const queryString = request ? getQueryParams(request) : \'\'\n\n    return new GraphQLClient(`https://your-endpoint-here/${queryString}`, {\n        headers: {\n            authorization: `Bearer YOUR_AUTH_TOKEN_HERE`,\n        },\n    })\n}','jsx',NULL),(322,2872,1,'2023-01-26 22:41:23','2023-01-26 22:41:23','e26a0a17-75d7-4c7d-b1ea-d0b722ef3c77',NULL,NULL,'<p>It wasn’t totally necessary to include the <code>x-craft-preview</code> and <code>x-craft-live-preview</code> parameters, but I figured it couldn’t hurt.</p>\r\n<h2>Craft Configuration</h2>\r\n<p>Now with the Remix configuration in place, I just needed to make two small changes to Craft to get it working correctly. First, I had to update the preview target for my Blog section to point to my Remix site:</p>\r\n<figure><img src=\"{asset:2283:url||//assets.trevor-davis.com/uploads/images/content/blog-section-preview-target.png}\" data-image=\"2283\" alt=\"Setting the preview target in my Blog Section\"></figure>\r\n<p>Then, I had to update the <code>config/general.php</code> to allow iframe requests from my Remix domain:</p>'),(323,2873,1,'2023-01-26 22:41:23','2023-01-26 22:41:23','dcd3964f-4541-4e8d-876a-a37bc361d431','<?php\n\nreturn [\n    \'*\' => [\n        \'headlessMode\' => true,\n        \'previewIframeResizerOptions\' => [\n            \'checkOrigin\' => [\n                \'https://www.trevor-davis.com\',\n            ],\n        ],\n    ],\n];','php',NULL),(324,2874,1,'2023-01-26 22:41:23','2023-01-26 22:41:23','3a4bed41-dd15-4e5b-b57a-2fe3edd9093d',NULL,NULL,'<h2>Voilà, Live Preview</h2>\r\n<p>And just like that, I had live preview working.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/live-preview.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\" width=\"100%\"></video></p>'),(332,2884,1,'2023-01-26 22:41:42','2023-01-26 22:41:42','f94ec615-d228-4526-b550-fe9bc3741adf',NULL,NULL,'<p>In my <a href=\"https://www.trevor-davis.com/blog/why-im-so-excited-about-remix\">previous post</a>, I talked about transitioning my site from being powered by <a href=\"https://craftcms.com/\">Craft</a> to being powered by <a href=\"https://remix.run/\">Remix</a> and a GraphQL endpoint coming from Craft. One of the best features of Craft is <a href=\"https://craftcms.com/features/all#live-preview\">Live Preview</a>, and it took a little configuration to get this working on my new Remix powered site.</p>\r\n<h2>Remix Configuration</h2>\r\n<p>These were specific changes that I needed to make on the Remix side, but really it would be the same for any GraphQL request. As Andrew Welch breaks down in <a href=\"https://nystudio107.com/blog/headless-preview-in-craft-cms\">his article</a>, the key is passing the token parameter back that Craft included in the URL.</p>\r\n<p>In the loader function of my blog post route, I call a helper function to setup the GraphQL client, and I pass the request to it:</p>'),(333,2885,1,'2023-01-26 22:41:42','2023-01-26 22:41:42','154ef73f-c635-4655-bdc2-7ba7e99f7dfc','import { json } from \'remix\'\nimport { gql } from \'graphql-request\'\nimport { gqlClient } from \'graphql.server\'\n\nexport const loader = async ({ request }) => {\n    const { entries } = await gqlClient(request).request(gql`\n        {\n            YOUR GRAPHQL QUERY HERE\n        }\n    `)\n\n    return json({ entries })\n}','jsx',NULL),(334,2886,1,'2023-01-26 22:41:42','2023-01-26 22:41:42','dda82868-a360-4242-8803-89dca6fe1cff',NULL,NULL,'<p>And then in my helper function, I take that request, grab the URL params that I want to include, and add those to my GraphQL request endpoint URL:</p>'),(335,2887,1,'2023-01-26 22:41:42','2023-01-26 22:41:42','2aedb5a2-8816-429c-a2f7-a4af0354ff9c','import { GraphQLClient } from \'graphql-request\'\n\n// Extract allowed query params and construct query string\nconst getQueryParams = (request) => {\n    const url = new URL(request.url)\n    const allowedKeys = [\'x-craft-preview\', \'x-craft-live-preview\', \'token\']\n    const filteredParams = Object.entries(\n        Object.fromEntries(url.searchParams)\n    ).filter(([key]) => allowedKeys.includes(key))\n\n    if (!filteredParams.length) {\n        return \'\'\n    }\n\n    const queryString = filteredParams.map((val) => val.join(\'=\')).join(\'&\')\n\n    return `?${queryString}`\n}\n\nexport const gqlClient = (request = null) => {\n    const queryString = request ? getQueryParams(request) : \'\'\n\n    return new GraphQLClient(`https://your-endpoint-here/${queryString}`, {\n        headers: {\n            authorization: `Bearer YOUR_AUTH_TOKEN_HERE`,\n        },\n    })\n}','jsx',NULL),(336,2888,1,'2023-01-26 22:41:42','2023-01-26 22:41:42','1836b308-b32c-467b-8f52-04082c316432',NULL,NULL,'<p>It wasn’t totally necessary to include the <code>x-craft-preview</code> and <code>x-craft-live-preview</code> parameters, but I figured it couldn’t hurt.</p>\r\n<h2>Craft Configuration</h2>\r\n<p>Now with the Remix configuration in place, I just needed to make two small changes to Craft to get it working correctly. First, I had to update the preview target for my Blog section to point to my Remix site:</p>\r\n<figure><img src=\"{asset:2283:url||//assets.trevor-davis.com/uploads/images/content/blog-section-preview-target.png}\" data-image=\"2283\" alt=\"Setting the preview target in my Blog Section\"></figure>\r\n<p>Then, I had to update the <code>config/general.php</code> to allow iframe requests from my Remix domain:</p>'),(337,2889,1,'2023-01-26 22:41:42','2023-01-26 22:41:42','d5936f29-6778-4742-97fe-59ca47352fd4','<?php\n\nreturn [\n    \'*\' => [\n        \'headlessMode\' => true,\n        \'previewIframeResizerOptions\' => [\n            \'checkOrigin\' => [\n                \'https://www.trevor-davis.com\',\n            ],\n        ],\n    ],\n];','php',NULL),(338,2890,1,'2023-01-26 22:41:42','2023-01-26 22:41:42','775c298c-3e29-43d6-8e84-3004e4268484',NULL,NULL,'<h2>Voilà, Live Preview</h2>\r\n<p>And just like that, I had live preview working.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/live-preview.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\" width=\"100%\"></video></p>'),(389,2942,1,'2023-01-27 14:50:36','2023-01-27 14:50:36','f61aa654-f503-4543-bf97-20e4766919f7',NULL,NULL,'<p>I’ve been building on the web for a long time. There’s a part of me that still has a bit of an old school mentality, and it’s hard for me to get really excited about new technology. Sure React was cool when it came out for its state management, but I didn’t see it as the be-all and end-all for building on the web. I really like <a href=\"https://craftcms.com/\">Craft CMS</a> for building CMS powered sites since I have full control over the HTML being sent to the browser, and it’s really easy to extend for complex functionality, but it can be a bit complex to setup for beginners and with additional complexity can come performance issues.&nbsp;So it’s been a while since I’ve seen something to be <em>really</em> excited about.</p>\r\n<p>Enter <a href=\"https://remix.run/\">Remix</a>.</p>\r\n<p>Remix is an interesting mix of old school techniques along with modern technology. Ryan Florence actually sums it up perfectly as to where Remix fits in.</p>\r\n<blockquote class=\"twitter-tweet\" data-dnt=\"true\" data-theme=\"dark\"><p lang=\"en\" dir=\"ltr\">Forget “full stack”. Remix is center stack.<br><br>It’s an HTTP tunnel between interactivity and business logic. It’s the part of the stack that no tool before it has solved, not completely.<br><br>I think I finally know how to talk about Remix.</p>— Ryan Florence (@ryanflorence) <a href=\"https://twitter.com/ryanflorence/status/1482233495195770883?ref_src=twsrc%5Etfw\">January 15, 2022</a></blockquote>\r\n<script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\r\n<p>I was able to easily switch my site that was fully powered by Craft to utilize Craft only as a GraphQL endpoint and Remix powering the rest. The two big things I needed to figure out were: how to get data from the GraphQL endpoint, and then how to process input from a user (for my contact form). I would definitely recommend reading through the Remix docs and the two tutorials, but if you can understand these two big pictures things, you’ll have enough to get started with Remix and go deeper once you get into it.</p>\r\n<h2>Getting GraphQL Data (aka Loaders)</h2>\r\n<p>Remix provides a <a href=\"https://remix.run/docs/en/v1/api/conventions#loader\">loader hook</a> that runs on the server to hydrate your component. In this simple example, I run a GraphQL request and return JSON with the results of that request in the loader function.</p>'),(390,2943,1,'2023-01-27 14:50:36','2023-01-27 14:50:36','801a99f1-71f1-4355-90ac-5ff07f90911e','import { GraphQLClient } from \'graphql-request\'\nimport { gql } from \'graphql-request\'\nimport { useLoaderData, json } from \'remix\'\n\nconst endpoint = \'https://your-endpoint-here/\'\nconst options = {\n    headers: {\n        authorization: \'Bearer YOUR_AUTH_TOKEN_HERE\',\n    }\n}\n\nconst EntriesQuery = gql`\n    {\n        YOUR GRAPHQL QUERY HERE\n    }\n`\n\nexport const loader = async () => {\n    const { entries } = new GraphQLClient(endpoint, options).request(EntriesQuery)\n\n    return json({\n        entries\n    })\n}\n\nexport default function Index() {\n    const data = useLoaderData()\n\n    return (\n        <>\n            {data.entries.map((entry) => (\n                <div key={entry.id}>\n                    {entry.title}\n                </div>\n            ))}\n        </>\n    )\n}','jsx',NULL),(391,2944,1,'2023-01-27 14:50:36','2023-01-27 14:50:36','84e83b36-ecfa-47de-8ef3-c1c9fe64a2c2',NULL,NULL,'<p>Then in my <code>Index</code> component, I access the data from the loader hook with <a href=\"https://remix.run/docs/en/v1/api/remix#useloaderdata\">useLoaderData()</a>, and my component is now hydrated with that data. In MVC style of thinking, think of the loader hook as the controller processing the page load request, populating with data from the model, and then passing to the view.</p>\r\n<p>The great part about Remix is that this doesn’t have to be specifically a GraphQL request. This data can come from anywhere. The <a href=\"https://remix.run/docs/en/v1/tutorials/jokes\">Jokes tutorial</a> in the Remix docs even thoroughly walks through how you can manage all this data in <a href=\"https://www.prisma.io/\">Prisma</a>.</p>\r\n<h2>Processing User Input (aka Actions)</h2>\r\n<p>Ok great, so we’ve got data onto the page, but now we need to be able to handle user input. Remix also provides an <a href=\"https://remix.run/docs/en/v1/api/conventions#action\">action hook</a> to process an action request (ex: a form submission). In my case, I have a contact form that sends me an email via SendGrid after submission.</p>'),(392,2945,1,'2023-01-27 14:50:36','2023-01-27 14:50:36','4982c5ca-15b6-4412-845f-dcaabfacc125','import {\n    useActionData,\n    Form,\n    redirect,\n    json\n} from \'remix\'\n\nexport async function action({ request }) {\n    const formData = await request.formData()\n    const errors = {}\n    \n    // Do data validation and add to the errors object if there are any errors\n    \n    if (Object.keys(errors).length) {\n        return json(errors, { status: 422 })\n    }\n    \n    // No errors: send email, store in DB, do whatever you need to do with the form data\n    \n    return redirect(\'/contact/thanks\')\n}\n\nexport default function ContactIndex() {\n    const errors = useActionData()\n    \n    return (\n        <Form method=\"post\">\n        </Form>\n    )\n}','jsx',NULL),(393,2946,1,'2023-01-27 14:50:36','2023-01-27 14:50:36','b1025e8e-2539-429e-a561-46a8c21a34fe',NULL,NULL,'<p>If you don’t include an <code>action</code> attribute on your form, it will automatically submit to the same page. Again, in MVC thinking, the action would again be equivalent to the controller taking the request input and processing it. But honestly, this takes me back 15 years when form actions would point directly to PHP files.</p>\r\n<h2>Bonus: Progressive Enhancement</h2>\r\n<p>Since Remix is running on the server, you can turn off JavaScript and everything still works great. Data still loads, form actions still process; it’s beautiful. This is not running loaders and actions on the client side; it’s running them on the server. This isn’t an accident, the Remix team is carefully considering the UX.</p>\r\n<blockquote class=\"twitter-tweet\" data-dnt=\"true\" data-theme=\"dark\"><p lang=\"en\" dir=\"ltr\">User experience (UX) and developer experience (DX) are both important. UX is more important than DX.<a href=\"https://twitter.com/remix_run?ref_src=twsrc%5Etfw\">@remix_run</a> has taught me: It\'s easier to start with a great UX and work toward a good DX than it is to start with a great DX and work toward a good UX.</p>— Kent C. Dodds &#x1f4bf; (@kentcdodds) <a href=\"https://twitter.com/kentcdodds/status/1482390454389805058?ref_src=twsrc%5Etfw\">January 15, 2022</a></blockquote>\r\n<script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\r\n<h2>Bonus: So Speedy</h2>\r\n<p>Did I mention how fast everything renders? I don’t tend to put too much stock into Lighthouse scores since they seem so random, but Remix crushes Lighthouse without me having to invest any additional effort into improving performance.</p>\r\n<h2>Give it a Shot</h2>\r\n<p>Remix is built on the <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\">native Fetch API</a>, so it can run anywhere. While Remix is relatively new, it’s certainly production ready, and there is a dedicated team behind it. If you aren’t ready to dive into Remix yet, at least keep your eye on it because this is a game changer.</p>'),(394,2948,1,'2023-01-27 14:50:36','2023-01-27 14:50:36','abd2ee45-86b2-4bf3-98cf-dddaeb4d170e',NULL,NULL,'<p>I’ve been building on the web for a long time. There’s a part of me that still has a bit of an old school mentality, and it’s hard for me to get really excited about new technology. Sure React was cool when it came out for its state management, but I didn’t see it as the be-all and end-all for building on the web. I really like <a href=\"https://craftcms.com/\">Craft CMS</a> for building CMS powered sites since I have full control over the HTML being sent to the browser, and it’s really easy to extend for complex functionality, but it can be a bit complex to setup for beginners and with additional complexity can come performance issues.&nbsp;So it’s been a while since I’ve seen something to be <em>really</em> excited about.</p>\r\n<p>Enter <a href=\"https://remix.run/\">Remix</a>.</p>\r\n<p>Remix is an interesting mix of old school techniques along with modern technology. Ryan Florence actually sums it up perfectly as to where Remix fits in.</p>\r\n<blockquote class=\"twitter-tweet\" data-dnt=\"true\" data-theme=\"dark\"><p lang=\"en\" dir=\"ltr\">Forget “full stack”. Remix is center stack.<br><br>It’s an HTTP tunnel between interactivity and business logic. It’s the part of the stack that no tool before it has solved, not completely.<br><br>I think I finally know how to talk about Remix.</p>— Ryan Florence (@ryanflorence) <a href=\"https://twitter.com/ryanflorence/status/1482233495195770883?ref_src=twsrc%5Etfw\">January 15, 2022</a></blockquote>\r\n<script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\r\n<p>I was able to easily switch my site that was fully powered by Craft to utilize Craft only as a GraphQL endpoint and Remix powering the rest. The two big things I needed to figure out were: how to get data from the GraphQL endpoint, and then how to process input from a user (for my contact form). I would definitely recommend reading through the Remix docs and the two tutorials, but if you can understand these two big pictures things, you’ll have enough to get started with Remix and go deeper once you get into it.</p>\r\n<h2>Getting GraphQL Data (aka Loaders)</h2>\r\n<p>Remix provides a <a href=\"https://remix.run/docs/en/v1/api/conventions#loader\">loader hook</a> that runs on the server to hydrate your component. In this simple example, I run a GraphQL request and return JSON with the results of that request in the loader function.</p>'),(395,2949,1,'2023-01-27 14:50:36','2023-01-27 14:50:36','4fc78301-513f-40b8-b25a-17c2da7d8e47','import { GraphQLClient } from \'graphql-request\'\nimport { gql } from \'graphql-request\'\nimport { useLoaderData, json } from \'remix\'\n\nconst endpoint = \'https://your-endpoint-here/\'\nconst options = {\n    headers: {\n        authorization: \'Bearer YOUR_AUTH_TOKEN_HERE\',\n    }\n}\n\nconst EntriesQuery = gql`\n    {\n        YOUR GRAPHQL QUERY HERE\n    }\n`\n\nexport const loader = async () => {\n    const { entries } = new GraphQLClient(endpoint, options).request(EntriesQuery)\n\n    return json({\n        entries\n    })\n}\n\nexport default function Index() {\n    const data = useLoaderData()\n\n    return (\n        <>\n            {data.entries.map((entry) => (\n                <div key={entry.id}>\n                    {entry.title}\n                </div>\n            ))}\n        </>\n    )\n}','jsx',NULL),(396,2950,1,'2023-01-27 14:50:36','2023-01-27 14:50:36','2b5090f0-b1c2-430c-bdeb-7f5b4d2e1530',NULL,NULL,'<p>Then in my <code>Index</code> component, I access the data from the loader hook with <a href=\"https://remix.run/docs/en/v1/api/remix#useloaderdata\">useLoaderData()</a>, and my component is now hydrated with that data. In MVC style of thinking, think of the loader hook as the controller processing the page load request, populating with data from the model, and then passing to the view.</p>\r\n<p>The great part about Remix is that this doesn’t have to be specifically a GraphQL request. This data can come from anywhere. The <a href=\"https://remix.run/docs/en/v1/tutorials/jokes\">Jokes tutorial</a> in the Remix docs even thoroughly walks through how you can manage all this data in <a href=\"https://www.prisma.io/\">Prisma</a>.</p>\r\n<h2>Processing User Input (aka Actions)</h2>\r\n<p>Ok great, so we’ve got data onto the page, but now we need to be able to handle user input. Remix also provides an <a href=\"https://remix.run/docs/en/v1/api/conventions#action\">action hook</a> to process an action request (ex: a form submission). In my case, I have a contact form that sends me an email via SendGrid after submission.</p>'),(397,2951,1,'2023-01-27 14:50:36','2023-01-27 14:50:36','83b8798c-bfec-4533-ad37-ec29161e0d70','import {\n    useActionData,\n    Form,\n    redirect,\n    json\n} from \'remix\'\n\nexport async function action({ request }) {\n    const formData = await request.formData()\n    const errors = {}\n    \n    // Do data validation and add to the errors object if there are any errors\n    \n    if (Object.keys(errors).length) {\n        return json(errors, { status: 422 })\n    }\n    \n    // No errors: send email, store in DB, do whatever you need to do with the form data\n    \n    return redirect(\'/contact/thanks\')\n}\n\nexport default function ContactIndex() {\n    const errors = useActionData()\n    \n    return (\n        <Form method=\"post\">\n        </Form>\n    )\n}','jsx',NULL),(398,2952,1,'2023-01-27 14:50:36','2023-01-27 14:50:36','a90a62d5-bfdf-441b-a824-b4d7ac1eb482',NULL,NULL,'<p>If you don’t include an <code>action</code> attribute on your form, it will automatically submit to the same page. Again, in MVC thinking, the action would again be equivalent to the controller taking the request input and processing it. But honestly, this takes me back 15 years when form actions would point directly to PHP files.</p>\r\n<h2>Bonus: Progressive Enhancement</h2>\r\n<p>Since Remix is running on the server, you can turn off JavaScript and everything still works great. Data still loads, form actions still process; it’s beautiful. This is not running loaders and actions on the client side; it’s running them on the server. This isn’t an accident, the Remix team is carefully considering the UX.</p>\r\n<blockquote class=\"twitter-tweet\" data-dnt=\"true\" data-theme=\"dark\"><p lang=\"en\" dir=\"ltr\">User experience (UX) and developer experience (DX) are both important. UX is more important than DX.<a href=\"https://twitter.com/remix_run?ref_src=twsrc%5Etfw\">@remix_run</a> has taught me: It\'s easier to start with a great UX and work toward a good DX than it is to start with a great DX and work toward a good UX.</p>— Kent C. Dodds &#x1f4bf; (@kentcdodds) <a href=\"https://twitter.com/kentcdodds/status/1482390454389805058?ref_src=twsrc%5Etfw\">January 15, 2022</a></blockquote>\r\n<script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\r\n<h2>Bonus: So Speedy</h2>\r\n<p>Did I mention how fast everything renders? I don’t tend to put too much stock into Lighthouse scores since they seem so random, but Remix crushes Lighthouse without me having to invest any additional effort into improving performance.</p>\r\n<h2>Give it a Shot</h2>\r\n<p>Remix is built on the <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\">native Fetch API</a>, so it can run anywhere. While Remix is relatively new, it’s certainly production ready, and there is a dedicated team behind it. If you aren’t ready to dive into Remix yet, at least keep your eye on it because this is a game changer.</p>'),(399,2954,1,'2023-02-15 21:55:51','2023-02-15 21:55:51','57577da1-0b58-4dec-b193-733e169937d2',NULL,NULL,'<p>I’ve been building on the web for a long time. There’s a part of me that still has a bit of an old school mentality, and it’s hard for me to get really excited about new technology. Sure React was cool when it came out for its state management, but I didn’t see it as the be-all and end-all for building on the web. I really like <a href=\"https://craftcms.com/\">Craft CMS</a> for building CMS powered sites since I have full control over the HTML being sent to the browser, and it’s really easy to extend for complex functionality, but it can be a bit complex to setup for beginners and with additional complexity can come performance issues.&nbsp;So it’s been a while since I’ve seen something to be <em>really</em> excited about.</p>\r\n<p>Enter <a href=\"https://remix.run/\">Remix</a>.</p>\r\n<p>Remix is an interesting mix of old school techniques along with modern technology. Ryan Florence actually sums it up perfectly as to where Remix fits in.</p>\r\n<blockquote class=\"twitter-tweet\" data-dnt=\"true\" data-theme=\"dark\"><p lang=\"en\" dir=\"ltr\">Forget “full stack”. Remix is center stack.<br><br>It’s an HTTP tunnel between interactivity and business logic. It’s the part of the stack that no tool before it has solved, not completely.<br><br>I think I finally know how to talk about Remix.</p>— Ryan Florence (@ryanflorence) <a href=\"https://twitter.com/ryanflorence/status/1482233495195770883?ref_src=twsrc%5Etfw\">January 15, 2022</a></blockquote>\r\n<script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\r\n<p>I was able to easily switch my site that was fully powered by Craft to utilize Craft only as a GraphQL endpoint and Remix powering the rest. The two big things I needed to figure out were: how to get data from the GraphQL endpoint, and then how to process input from a user (for my contact form). I would definitely recommend reading through the Remix docs and the two tutorials, but if you can understand these two big pictures things, you’ll have enough to get started with Remix and go deeper once you get into it.</p>\r\n<h2>Getting GraphQL Data (aka Loaders)</h2>\r\n<p>Remix provides a <a href=\"https://remix.run/docs/en/v1/api/conventions#loader\">loader hook</a> that runs on the server to hydrate your component. In this simple example, I run a GraphQL request and return JSON with the results of that request in the loader function.</p>'),(400,2955,1,'2023-02-15 21:55:51','2023-02-15 21:55:51','6b7e33d1-420f-413c-a223-80ab05b73cff','import { GraphQLClient } from \'graphql-request\'\nimport { gql } from \'graphql-request\'\nimport { useLoaderData, json } from \'remix\'\n\nconst endpoint = \'https://your-endpoint-here/\'\nconst options = {\n    headers: {\n        authorization: \'Bearer YOUR_AUTH_TOKEN_HERE\',\n    }\n}\n\nconst EntriesQuery = gql`\n    {\n        YOUR GRAPHQL QUERY HERE\n    }\n`\n\nexport const loader = async () => {\n    const { entries } = new GraphQLClient(endpoint, options).request(EntriesQuery)\n\n    return json({\n        entries\n    })\n}\n\nexport default function Index() {\n    const data = useLoaderData()\n\n    return (\n        <>\n            {data.entries.map((entry) => (\n                <div key={entry.id}>\n                    {entry.title}\n                </div>\n            ))}\n        </>\n    )\n}','jsx',NULL),(401,2956,1,'2023-02-15 21:55:51','2023-02-15 21:55:51','c206e43b-5a51-4ab3-b244-6235480754ca',NULL,NULL,'<p>Then in my <code>Index</code> component, I access the data from the loader hook with <a href=\"https://remix.run/docs/en/v1/api/remix#useloaderdata\">useLoaderData()</a>, and my component is now hydrated with that data. In MVC style of thinking, think of the loader hook as the controller processing the page load request, populating with data from the model, and then passing to the view.</p>\r\n<p>The great part about Remix is that this doesn’t have to be specifically a GraphQL request. This data can come from anywhere. The <a href=\"https://remix.run/docs/en/v1/tutorials/jokes\">Jokes tutorial</a> in the Remix docs even thoroughly walks through how you can manage all this data in <a href=\"https://www.prisma.io/\">Prisma</a>.</p>\r\n<h2>Processing User Input (aka Actions)</h2>\r\n<p>Ok great, so we’ve got data onto the page, but now we need to be able to handle user input. Remix also provides an <a href=\"https://remix.run/docs/en/v1/api/conventions#action\">action hook</a> to process an action request (ex: a form submission). In my case, I have a contact form that sends me an email via SendGrid after submission.</p>'),(402,2957,1,'2023-02-15 21:55:51','2023-02-15 21:55:51','e46d52fc-f6c0-452a-938c-071484b35ea0','import {\n    useActionData,\n    Form,\n    redirect,\n    json\n} from \'remix\'\n\nexport async function action({ request }) {\n    const formData = await request.formData()\n    const errors = {}\n    \n    // Do data validation and add to the errors object if there are any errors\n    \n    if (Object.keys(errors).length) {\n        return json(errors, { status: 422 })\n    }\n    \n    // No errors: send email, store in DB, do whatever you need to do with the form data\n    \n    return redirect(\'/contact/thanks\')\n}\n\nexport default function ContactIndex() {\n    const errors = useActionData()\n    \n    return (\n        <Form method=\"post\">\n        </Form>\n    )\n}','jsx',NULL),(403,2958,1,'2023-02-15 21:55:51','2023-02-15 21:55:51','ce741c80-4fd1-461d-83f6-a8f06858bfec',NULL,NULL,'<p>If you don’t include an <code>action</code> attribute on your form, it will automatically submit to the same page. Again, in MVC thinking, the action would again be equivalent to the controller taking the request input and processing it. But honestly, this takes me back 15 years when form actions would point directly to PHP files.</p>\r\n<h2>Bonus: Progressive Enhancement</h2>\r\n<p>Since Remix is running on the server, you can turn off JavaScript and everything still works great. Data still loads, form actions still process; it’s beautiful. This is not running loaders and actions on the client side; it’s running them on the server. This isn’t an accident, the Remix team is carefully considering the UX.</p>\r\n<blockquote class=\"twitter-tweet\" data-dnt=\"true\" data-theme=\"dark\"><p lang=\"en\" dir=\"ltr\">User experience (UX) and developer experience (DX) are both important. UX is more important than DX.<a href=\"https://twitter.com/remix_run?ref_src=twsrc%5Etfw\">@remix_run</a> has taught me: It\'s easier to start with a great UX and work toward a good DX than it is to start with a great DX and work toward a good UX.</p>— Kent C. Dodds &#x1f4bf; (@kentcdodds) <a href=\"https://twitter.com/kentcdodds/status/1482390454389805058?ref_src=twsrc%5Etfw\">January 15, 2022</a></blockquote>\r\n<script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\r\n<h2>Bonus: So Speedy</h2>\r\n<p>Did I mention how fast everything renders? I don’t tend to put too much stock into Lighthouse scores since they seem so random, but Remix crushes Lighthouse without me having to invest any additional effort into improving performance.</p>\r\n<h2>Give it a Shot</h2>\r\n<p>Remix is built on the <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\">native Fetch API</a>, so it can run anywhere. While Remix is relatively new, it’s certainly production ready, and there is a dedicated team behind it. If you aren’t ready to dive into Remix yet, at least keep your eye on it because this is a game changer.</p>'),(453,3018,1,'2023-04-17 10:55:58','2023-04-17 10:55:58','e970d359-0c86-413a-a530-0f9c32edd794',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(454,3019,1,'2023-04-17 10:55:58','2023-04-17 10:55:58','2852afd0-f66a-48fa-af2e-b6ff911c12cc','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(455,3020,1,'2023-04-17 10:55:58','2023-04-17 10:55:58','70abf418-4bf0-46e4-bc9c-21d7602e3fb0',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(456,3021,1,'2023-04-17 10:55:58','2023-04-17 10:55:58','14ae0dfd-23dc-4c11-9522-acf57a7bb46c','ReferenceError: window is not defined','text',NULL),(457,3022,1,'2023-04-17 10:55:58','2023-04-17 10:55:58','99e73f0e-c079-463f-9877-10e36396ff83',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(458,3023,1,'2023-04-17 10:55:58','2023-04-17 10:55:58','df25b270-b32b-4744-9bfe-b4bf739365a7','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(459,3024,1,'2023-04-17 10:55:58','2023-04-17 10:55:58','9c07844b-97d7-4919-b106-54d4cb84a195',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(460,3026,1,'2023-05-25 11:58:00','2023-05-25 11:58:00','37f74d45-4bb1-4e3a-8693-3a49b071e31b',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(461,3027,1,'2023-05-25 11:58:00','2023-05-25 11:58:00','c75eb63e-799c-4579-9f82-4e61ba7b1f32','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(462,3028,1,'2023-05-25 11:58:00','2023-05-25 11:58:00','4d487d2b-aef3-4de8-af9c-62aacf5cffc3',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(463,3029,1,'2023-05-25 11:58:00','2023-05-25 11:58:00','44f3435c-dafe-4492-a775-3d339dfbff34','ReferenceError: window is not defined','text',NULL),(464,3030,1,'2023-05-25 11:58:00','2023-05-25 11:58:00','95f9aead-2675-4ac0-8dbb-6ac28f5ed99b',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(465,3031,1,'2023-05-25 11:58:00','2023-05-25 11:58:00','6de87de4-19c1-43b6-95b2-b3a735a63e3c','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(466,3032,1,'2023-05-25 11:58:00','2023-05-25 11:58:00','7cd0325f-b5e2-4587-a031-4feea30dfb9e',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(467,3034,1,'2023-05-25 11:58:02','2023-05-25 11:58:02','de198390-5240-40a9-be40-5baf14339232',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(468,3035,1,'2023-05-25 11:58:02','2023-05-25 11:58:02','e880fc1f-9046-4d82-b341-d75ec6b9a104','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(469,3036,1,'2023-05-25 11:58:02','2023-05-25 11:58:02','d7621e15-d6c6-4a4e-ac9b-8b41691f25b9',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(470,3037,1,'2023-05-25 11:58:02','2023-05-25 11:58:02','828860f1-8b2f-4683-8b19-e1c3429aec79','ReferenceError: window is not defined','text',NULL),(471,3038,1,'2023-05-25 11:58:02','2023-05-25 11:58:02','41de9ba3-4fa4-495b-84ac-5ff5553ca5e4',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(472,3039,1,'2023-05-25 11:58:03','2023-05-25 11:58:03','4f8bb08b-dbe8-445c-a47e-23a8747d6d78','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(473,3040,1,'2023-05-25 11:58:03','2023-05-25 11:58:03','2d57b4ad-d290-4e40-8fb3-2c01f4e3ee14',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(474,3042,1,'2023-05-25 11:58:03','2023-05-25 11:58:03','a6fc05c4-8c96-46ae-87d4-24b34b01496e',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(475,3043,1,'2023-05-25 11:58:03','2023-05-25 11:58:03','27c25210-cab2-41c7-9380-8ac5cde7da14','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(476,3044,1,'2023-05-25 11:58:03','2023-05-25 11:58:03','551623a0-05f0-4eb7-a5dc-17402f1d84c8',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(477,3045,1,'2023-05-25 11:58:03','2023-05-25 11:58:03','37078589-45ba-46a1-bf17-90014d45e62e','ReferenceError: window is not defined','text',NULL),(478,3046,1,'2023-05-25 11:58:03','2023-05-25 11:58:03','0126af81-9742-4a16-b70d-26057f74ff7f',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(479,3047,1,'2023-05-25 11:58:03','2023-05-25 11:58:03','cee09384-863c-4bd5-8619-06d810e08913','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(480,3048,1,'2023-05-25 11:58:03','2023-05-25 11:58:03','a08fff7a-d09f-40dd-83b3-5823bab84d74',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(481,3050,1,'2023-05-25 11:58:08','2023-05-25 11:58:08','0ae1e624-9032-41e0-829f-35a6d0900424',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(482,3051,1,'2023-05-25 11:58:08','2023-05-25 11:58:08','94b2eb16-2011-461a-8494-28187eedaf47','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(483,3052,1,'2023-05-25 11:58:08','2023-05-25 11:58:08','9e204a15-04ab-436b-b2f0-9ee787021d32',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(484,3053,1,'2023-05-25 11:58:08','2023-05-25 11:58:08','f2e7d8af-9557-4378-b79b-481cf9fb6f1b','ReferenceError: window is not defined','text',NULL),(485,3054,1,'2023-05-25 11:58:08','2023-05-25 11:58:08','b63d86d1-3bf1-4d3c-a85e-de853c2e5fa0',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(486,3055,1,'2023-05-25 11:58:08','2023-05-25 11:58:08','d766b3b8-fd51-4d66-860b-a39386c09ea2','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(487,3056,1,'2023-05-25 11:58:08','2023-05-25 11:58:08','762db941-4433-4328-ac3a-b975c4992bc5',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(488,3058,1,'2023-05-25 11:58:10','2023-05-25 11:58:10','e346e411-f0b7-4b6d-85f1-54d7a69323e3',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(489,3059,1,'2023-05-25 11:58:10','2023-05-25 11:58:10','ebb564b3-4385-48d8-b7c3-b37f12a98e35','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(490,3060,1,'2023-05-25 11:58:10','2023-05-25 11:58:10','4dd9c4b3-2691-4110-8688-6083e9e3e10a',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(491,3061,1,'2023-05-25 11:58:10','2023-05-25 11:58:10','8e42f0ce-431c-45c4-92c9-0e7dc6c93404','ReferenceError: window is not defined','text',NULL),(492,3062,1,'2023-05-25 11:58:10','2023-05-25 11:58:10','6060f180-e1c2-411b-8cad-f39c550f1ada',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(493,3063,1,'2023-05-25 11:58:10','2023-05-25 11:58:10','5aa2a8f1-2069-4ef1-a276-193cfe7ac0b4','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(494,3064,1,'2023-05-25 11:58:10','2023-05-25 11:58:10','3efbba9b-bfe0-4522-ae51-648cfcb2e496',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(495,3066,1,'2023-06-13 22:14:53','2023-06-13 22:14:53','18c83747-0e5d-47a5-be42-9b0fa92bfeea',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(496,3067,1,'2023-06-13 22:14:53','2023-06-13 22:14:53','7c5bf722-f6f2-48d6-8fb1-b7160e690259','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(497,3068,1,'2023-06-13 22:14:53','2023-06-13 22:14:53','0e48c917-0cf8-4e5c-9ac1-c108046b284f',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(498,3069,1,'2023-06-13 22:14:53','2023-06-13 22:14:53','013fc2fa-e495-4ea7-8d7a-93284ac8b90b','ReferenceError: window is not defined','text',NULL),(499,3070,1,'2023-06-13 22:14:53','2023-06-13 22:14:53','6c8f61fc-cd3b-43af-98ff-25bb5b96416e',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(500,3071,1,'2023-06-13 22:14:53','2023-06-13 22:14:53','a0b66bd3-2408-4312-a5ff-9cb39f3854a6','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(501,3072,1,'2023-06-13 22:14:53','2023-06-13 22:14:53','35248af6-a508-4a2c-be0e-2ecfcba516af',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(502,3074,1,'2023-06-13 22:15:01','2023-06-13 22:15:01','b6b9766c-7e80-47d0-bb96-dfc6fb8c7f32',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(503,3075,1,'2023-06-13 22:15:01','2023-06-13 22:15:01','e082787f-3334-457c-88af-8e0ae2596b5f','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(504,3076,1,'2023-06-13 22:15:01','2023-06-13 22:15:01','c444820b-427c-4bc4-9087-675d06f2d70f',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(505,3077,1,'2023-06-13 22:15:01','2023-06-13 22:15:01','37a9c5c5-1ee9-4eea-b9f1-9d4816aaf7e5','ReferenceError: window is not defined','text',NULL),(506,3078,1,'2023-06-13 22:15:01','2023-06-13 22:15:01','55fdd4ae-9d3c-45c6-bb4d-60cc188d6cf4',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(507,3079,1,'2023-06-13 22:15:01','2023-06-13 22:15:01','d0914036-f450-4b4f-a2cc-44d663ef7696','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(508,3080,1,'2023-06-13 22:15:01','2023-06-13 22:15:01','39f834de-8008-4008-912a-e335cfe7e772',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(509,3082,1,'2023-06-13 22:15:03','2023-06-13 22:15:03','2abfba7d-2c47-4b3d-b691-1c719c923844',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(510,3083,1,'2023-06-13 22:15:03','2023-06-13 22:15:03','e4a7e20c-460d-40d6-afb1-b60facf861c7','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(511,3084,1,'2023-06-13 22:15:03','2023-06-13 22:15:03','d7939e3b-65da-425d-824f-95e24c1773e9',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(512,3085,1,'2023-06-13 22:15:03','2023-06-13 22:15:03','f6a4f511-4c8d-4b14-acc9-49c4fb568080','ReferenceError: window is not defined','text',NULL),(513,3086,1,'2023-06-13 22:15:03','2023-06-13 22:15:03','908c8ca8-92d4-4262-bd62-33d5fe5c6126',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(514,3087,1,'2023-06-13 22:15:03','2023-06-13 22:15:03','54761df7-6c95-44ec-ae19-ac7330d20d8e','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(515,3088,1,'2023-06-13 22:15:03','2023-06-13 22:15:03','fbcb118f-620f-4a1f-b24c-75d8a11f2896',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(516,3090,1,'2023-07-05 01:57:06','2023-07-05 01:57:06','4e6bb9ca-68cd-4293-b665-d2f0d6c60274',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(517,3091,1,'2023-07-05 01:57:06','2023-07-05 01:57:06','e9e65d2c-4b00-48c7-85f3-74da801c01dc','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(518,3092,1,'2023-07-05 01:57:06','2023-07-05 01:57:06','cb9c1b74-5329-495f-ad78-dc98277c5ae5',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(519,3093,1,'2023-07-05 01:57:06','2023-07-05 01:57:06','bad85596-6eed-4f76-9f18-90b146a98d41','ReferenceError: window is not defined','text',NULL),(520,3094,1,'2023-07-05 01:57:06','2023-07-05 01:57:06','a845ddfc-9147-40e1-bc55-9b000adc377c',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(521,3095,1,'2023-07-05 01:57:06','2023-07-05 01:57:06','37d899b2-dad3-414c-ae56-533b83a4474d','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(522,3096,1,'2023-07-05 01:57:06','2023-07-05 01:57:06','ef2296e2-b66e-4b75-962b-4cbe567ed614',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(523,3098,1,'2023-07-08 19:39:01','2023-07-08 19:39:01','6361cd1f-141e-4767-8af0-d2018420021e',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(524,3099,1,'2023-07-08 19:39:01','2023-07-08 19:39:01','4c9a1c25-12be-4e49-a57c-303d0afab490','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(525,3100,1,'2023-07-08 19:39:01','2023-07-08 19:39:01','190a6685-ec9a-4b8b-b53d-ea2849c497a6',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(526,3101,1,'2023-07-08 19:39:01','2023-07-08 19:39:01','fec89169-db59-465f-a761-f10440e49522','ReferenceError: window is not defined','text',NULL),(527,3102,1,'2023-07-08 19:39:01','2023-07-08 19:39:01','a937d3dc-5c67-41c5-829b-69ac14bac697',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(528,3103,1,'2023-07-08 19:39:01','2023-07-08 19:39:01','7b2dead2-1f69-4927-a372-9125f7e806f6','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(529,3104,1,'2023-07-08 19:39:01','2023-07-08 19:39:01','4ade541e-550d-4313-86ed-49a1895dedc2',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(530,3108,1,'2023-08-05 15:20:24','2023-08-05 15:20:24','f2183b5f-ef5b-4ae4-ac55-b10c8bc769c3',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(531,3109,1,'2023-08-05 15:20:24','2023-08-05 15:20:24','0c05edae-6660-4fc5-823e-7abdc7861875','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(532,3110,1,'2023-08-05 15:20:24','2023-08-05 15:20:24','4757a6c6-7aff-47ae-ba37-f8c8dd85968c',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(533,3111,1,'2023-08-05 15:20:24','2023-08-05 15:20:24','c8c7ca42-6545-47c9-910c-bc0496d45aba','ReferenceError: window is not defined','text',NULL),(534,3112,1,'2023-08-05 15:20:24','2023-08-05 15:20:24','6560957d-2815-4d2a-bb7a-8e63a55d87f2',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(535,3113,1,'2023-08-05 15:20:24','2023-08-05 15:20:24','0a0495e9-f22a-49ae-8c20-feb6726d112e','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(536,3114,1,'2023-08-05 15:20:24','2023-08-05 15:20:24','6167aa94-48ba-435d-9766-8853b4cf09ea',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(537,3116,1,'2023-08-05 15:20:25','2023-08-05 15:20:25','0e6ab1a9-7f49-4093-a8c9-421958be9e8f',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(538,3117,1,'2023-08-05 15:20:25','2023-08-05 15:20:25','86079418-3712-4ce0-9ca9-1bd8dbee9310','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(539,3118,1,'2023-08-05 15:20:25','2023-08-05 15:20:25','43763ac6-4795-40c0-8501-35f2a28315e5',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(540,3119,1,'2023-08-05 15:20:25','2023-08-05 15:20:25','e012f5b8-e29e-49b8-8155-6b183adfaee0','ReferenceError: window is not defined','text',NULL),(541,3120,1,'2023-08-05 15:20:25','2023-08-05 15:20:25','918f005d-9f92-4650-beee-86216202286e',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(542,3121,1,'2023-08-05 15:20:25','2023-08-05 15:20:25','81debfc1-c73c-4b47-b7b9-b8c80aa0b738','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(543,3122,1,'2023-08-05 15:20:25','2023-08-05 15:20:25','b5cdb6a0-3123-493f-b57c-83b375eb5566',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(544,3124,1,'2023-08-05 15:20:26','2023-08-05 15:20:26','0a4d53ce-d7b9-4cef-85db-b1c23c557871',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(545,3125,1,'2023-08-05 15:20:26','2023-08-05 15:20:26','32ec3a79-7c0c-4ad0-8fea-1389eddc1fda','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(546,3126,1,'2023-08-05 15:20:26','2023-08-05 15:20:26','480e3f5b-d130-4a92-a049-53fe3e021043',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(547,3127,1,'2023-08-05 15:20:26','2023-08-05 15:20:26','d1a49551-b35d-4a6d-bf63-c63c6f1a523b','ReferenceError: window is not defined','text',NULL),(548,3128,1,'2023-08-05 15:20:26','2023-08-05 15:20:26','364eaedc-8a3e-4cd7-b412-db90540970f9',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(549,3129,1,'2023-08-05 15:20:26','2023-08-05 15:20:26','0e46df20-555e-40f1-afd5-ff47184adc3e','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(550,3130,1,'2023-08-05 15:20:26','2023-08-05 15:20:26','5d907c00-5ca0-4736-9f26-3aa445cf10b0',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(551,3132,1,'2023-08-05 15:20:27','2023-08-05 15:20:27','8f49748c-2267-4fb1-8b6f-e9c921c6c083',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(552,3133,1,'2023-08-05 15:20:27','2023-08-05 15:20:27','25026feb-bd68-45e1-b78a-917b28276581','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(553,3134,1,'2023-08-05 15:20:27','2023-08-05 15:20:27','e05ef2a2-a45d-4741-aeb2-1bc8de554902',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(554,3135,1,'2023-08-05 15:20:27','2023-08-05 15:20:27','54d4fd14-1338-472a-977d-e8c892d34a2e','ReferenceError: window is not defined','text',NULL),(555,3136,1,'2023-08-05 15:20:27','2023-08-05 15:20:27','41d2f048-f12c-47dd-9ec1-4ae19775b75a',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(556,3137,1,'2023-08-05 15:20:27','2023-08-05 15:20:27','dcf01747-2934-44ea-9ff9-2834ba8389fb','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(557,3138,1,'2023-08-05 15:20:27','2023-08-05 15:20:27','bca73aed-4e80-462d-975e-f35fb125e480',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(558,3140,1,'2023-08-05 15:20:29','2023-08-05 15:20:29','866aa0ad-ecac-4164-a834-02c6363770e5',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(559,3141,1,'2023-08-05 15:20:29','2023-08-05 15:20:29','0df47942-a2ed-4602-a12e-26cce9c7fb7e','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(560,3142,1,'2023-08-05 15:20:29','2023-08-05 15:20:29','88ba1713-bba5-44ed-afc9-79ba803cd55a',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(561,3143,1,'2023-08-05 15:20:29','2023-08-05 15:20:29','c26a1f82-be3b-4e0a-ad8f-3045b117fc41','ReferenceError: window is not defined','text',NULL),(562,3144,1,'2023-08-05 15:20:29','2023-08-05 15:20:29','d108c13c-0405-4c00-ae7c-3b4e2d5652f6',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(563,3145,1,'2023-08-05 15:20:29','2023-08-05 15:20:29','a73006a4-c125-46e8-ba76-aab341c45bf6','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(564,3146,1,'2023-08-05 15:20:29','2023-08-05 15:20:29','3efcbd02-80f4-4c1f-8b11-40be801ec46f',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(565,3148,1,'2023-09-06 15:59:53','2023-09-06 15:59:53','843d9d65-045e-4595-a57c-d0bcc9a9591c',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(566,3149,1,'2023-09-06 15:59:53','2023-09-06 15:59:53','02ab21d9-3a00-4b57-a50a-db5b2baae1b8','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(567,3150,1,'2023-09-06 15:59:53','2023-09-06 15:59:53','ee6982e8-defd-4136-a158-4c852dd4ffab',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(568,3151,1,'2023-09-06 15:59:53','2023-09-06 15:59:53','628adb89-7794-4844-ad41-4c772c74d387','ReferenceError: window is not defined','text',NULL),(569,3152,1,'2023-09-06 15:59:53','2023-09-06 15:59:53','0b26c67a-8962-4478-a877-16157e17399b',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(570,3153,1,'2023-09-06 15:59:53','2023-09-06 15:59:53','235881f9-7b12-4c32-8b06-49301ae1db64','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(571,3154,1,'2023-09-06 15:59:53','2023-09-06 15:59:53','53381b23-249f-4ccc-b44e-80384bc301da',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(572,3156,1,'2023-09-06 15:59:54','2023-09-06 15:59:54','d0a83dfb-ce99-44c6-bc40-b3c00a2c1cfe',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(573,3157,1,'2023-09-06 15:59:54','2023-09-06 15:59:54','a63ca131-273a-415c-b188-1db6470a59ef','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(574,3158,1,'2023-09-06 15:59:54','2023-09-06 15:59:54','9a1e3870-03ba-4b34-9f53-59801a4a8cc8',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(575,3159,1,'2023-09-06 15:59:54','2023-09-06 15:59:54','2c566a1c-0810-4e52-ab81-92704fc7962e','ReferenceError: window is not defined','text',NULL),(576,3160,1,'2023-09-06 15:59:54','2023-09-06 15:59:54','4d365429-6769-4b73-bff6-9057828f7386',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(577,3161,1,'2023-09-06 15:59:54','2023-09-06 15:59:54','3ea52c8a-10cd-40d9-a837-f7fb3cd4018e','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(578,3162,1,'2023-09-06 15:59:54','2023-09-06 15:59:54','49706802-067e-4a82-89df-5e2df33df579',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(579,3164,1,'2023-09-06 15:59:55','2023-09-06 15:59:55','aab3d65b-8dfe-4873-bbd8-21005e18deb1',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(580,3165,1,'2023-09-06 15:59:55','2023-09-06 15:59:55','0810960b-152e-417c-9244-eb39f6978dfe','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(581,3166,1,'2023-09-06 15:59:55','2023-09-06 15:59:55','ea49d0e8-cb92-443b-810b-25ff15867ada',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(582,3167,1,'2023-09-06 15:59:55','2023-09-06 15:59:55','86b35609-e863-4378-b773-2bc17162cd58','ReferenceError: window is not defined','text',NULL),(583,3168,1,'2023-09-06 15:59:55','2023-09-06 15:59:55','cedc86ae-0aea-4d06-b23e-c0500404bace',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(584,3169,1,'2023-09-06 15:59:55','2023-09-06 15:59:55','ed2504c9-ab4d-4e35-bed6-4daec03e50f8','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(585,3170,1,'2023-09-06 15:59:55','2023-09-06 15:59:55','0e8b7ed8-3924-4fd6-bea2-25d2a3610300',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(586,3172,1,'2023-09-06 15:59:56','2023-09-06 15:59:56','37047de3-a42e-42e0-8607-3a08c2479ffe',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(587,3173,1,'2023-09-06 15:59:56','2023-09-06 15:59:56','ce4931d7-b6f1-46b1-9d71-6b0f8dc56348','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(588,3174,1,'2023-09-06 15:59:56','2023-09-06 15:59:56','4162cc15-9307-4d17-a428-c2ef4c249419',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(589,3175,1,'2023-09-06 15:59:56','2023-09-06 15:59:56','43bf9da1-07bf-4743-8ac0-e82a95a2dec8','ReferenceError: window is not defined','text',NULL),(590,3176,1,'2023-09-06 15:59:56','2023-09-06 15:59:56','64602aa7-53f6-4da3-89dc-648eb1db6f2c',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(591,3177,1,'2023-09-06 15:59:56','2023-09-06 15:59:56','cabe192d-4ba6-4171-8954-a7de4c6a2728','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(592,3178,1,'2023-09-06 15:59:56','2023-09-06 15:59:56','fbecae79-48c0-46a4-8fe5-fabe02b976e3',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(593,3180,1,'2023-09-06 16:00:04','2023-09-06 16:00:04','f07adc1e-38d8-48cf-868a-eb5d5d4ae18f',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(594,3181,1,'2023-09-06 16:00:04','2023-09-06 16:00:04','349aca0a-b4f5-4c3e-b455-b268fb893d6d','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(595,3182,1,'2023-09-06 16:00:04','2023-09-06 16:00:04','49c36424-0c84-4c7c-9d2b-1f72ee9b5dde',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(596,3183,1,'2023-09-06 16:00:04','2023-09-06 16:00:04','d2c82f72-2f2a-47a3-b5b8-c9483edf47d6','ReferenceError: window is not defined','text',NULL),(597,3184,1,'2023-09-06 16:00:04','2023-09-06 16:00:04','e8fca94b-10d6-4884-9822-5da4c5a8b93e',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(598,3185,1,'2023-09-06 16:00:04','2023-09-06 16:00:04','bf7e63fc-b8e6-4f96-8488-294c7e252de1','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(599,3186,1,'2023-09-06 16:00:04','2023-09-06 16:00:04','ae59be42-ba94-4d37-94ef-201bab32457f',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(600,3188,1,'2023-09-06 16:00:10','2023-09-06 16:00:10','eea7c552-82a8-47e8-a18b-86933a046478',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(601,3189,1,'2023-09-06 16:00:10','2023-09-06 16:00:10','5869214c-cb18-4e2a-9f06-4273972d1146','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(602,3190,1,'2023-09-06 16:00:10','2023-09-06 16:00:10','bbe439c1-6744-46d7-903a-6c148c2cee3c',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(603,3191,1,'2023-09-06 16:00:10','2023-09-06 16:00:10','e9f961e5-1e21-4257-940b-6a677481082b','ReferenceError: window is not defined','text',NULL),(604,3192,1,'2023-09-06 16:00:10','2023-09-06 16:00:10','1227495d-0382-44b0-837e-9133ba44aa3e',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(605,3193,1,'2023-09-06 16:00:10','2023-09-06 16:00:10','8f7488a9-2626-4f9c-82b8-890486cbfd64','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(606,3194,1,'2023-09-06 16:00:10','2023-09-06 16:00:10','29696757-77c7-46cb-892f-557ee6741e14',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(607,3196,1,'2023-09-07 08:00:36','2023-09-07 08:00:36','cc586313-a61d-42a7-bc4f-c777cca27cdb',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(608,3197,1,'2023-09-07 08:00:36','2023-09-07 08:00:36','3d56e70d-eefe-4593-a472-d38023a49c4d','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(609,3198,1,'2023-09-07 08:00:36','2023-09-07 08:00:36','113be111-748c-461e-8aad-c3e3198967f6',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(610,3199,1,'2023-09-07 08:00:36','2023-09-07 08:00:36','f6cc5869-e8db-4f89-814e-21a256f8389a','ReferenceError: window is not defined','text',NULL),(611,3200,1,'2023-09-07 08:00:36','2023-09-07 08:00:36','383eb7bb-f220-4743-b027-c6bf299365e7',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(612,3201,1,'2023-09-07 08:00:36','2023-09-07 08:00:36','4262a2d6-d4d4-4196-a801-31e19ea88ebc','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(613,3202,1,'2023-09-07 08:00:36','2023-09-07 08:00:36','f134d6d1-ff1c-4152-9f83-c609fe1f0a65',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(614,3204,1,'2023-09-07 08:00:40','2023-09-07 08:00:40','c1e1aed2-4fe7-4bca-a13d-3cb29f6f7695',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(615,3205,1,'2023-09-07 08:00:40','2023-09-07 08:00:40','1f27b8dc-7a89-4c13-bd29-7828b9e14952','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(616,3206,1,'2023-09-07 08:00:40','2023-09-07 08:00:40','39be881f-2f79-42bd-823d-95401103d56d',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(617,3207,1,'2023-09-07 08:00:40','2023-09-07 08:00:40','d001a4c2-945a-4c01-95b1-c45fa56894ef','ReferenceError: window is not defined','text',NULL),(618,3208,1,'2023-09-07 08:00:40','2023-09-07 08:00:40','4e8b4aaf-fa3d-42ba-94e6-edfbf67fb43c',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(619,3209,1,'2023-09-07 08:00:40','2023-09-07 08:00:40','ba2a3790-f5c6-4073-b712-3a1ff946a74b','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(620,3210,1,'2023-09-07 08:00:40','2023-09-07 08:00:40','7947fb81-1f74-4d99-9cb0-6fc64d7ea7e4',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(621,3212,1,'2023-09-21 18:20:05','2023-09-21 18:20:05','8d1e9e33-28ae-4056-9c2b-047a63b53399',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(622,3213,1,'2023-09-21 18:20:05','2023-09-21 18:20:05','1abcf6fc-e565-4c40-b4cd-2062b9ace80c','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(623,3214,1,'2023-09-21 18:20:05','2023-09-21 18:20:05','b7746144-a0e4-4806-bd6e-ed93d246a84b',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(624,3215,1,'2023-09-21 18:20:05','2023-09-21 18:20:05','06c1801e-1bd1-48b8-9147-97fad5dadf47','ReferenceError: window is not defined','text',NULL),(625,3216,1,'2023-09-21 18:20:05','2023-09-21 18:20:05','11578433-72bb-474f-8f46-0956960e21ed',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(626,3217,1,'2023-09-21 18:20:05','2023-09-21 18:20:05','f4456b28-2a94-4593-9de8-dbb0c35c7338','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(627,3218,1,'2023-09-21 18:20:05','2023-09-21 18:20:05','5486d44c-ee46-41af-90a6-dce197245346',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(628,3220,1,'2023-09-30 18:34:21','2023-09-30 18:34:21','0de7cd13-3152-4189-9d5c-be48af9ee92d',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(629,3221,1,'2023-09-30 18:34:21','2023-09-30 18:34:21','00a4ff7d-1c27-4833-8320-a608cdcf8a97','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(630,3222,1,'2023-09-30 18:34:21','2023-09-30 18:34:21','e1e76b9c-6c32-462c-bfa8-d98b43682e34',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(631,3223,1,'2023-09-30 18:34:21','2023-09-30 18:34:21','add140be-1a52-439f-831d-7c2e70ab6bb2','ReferenceError: window is not defined','text',NULL),(632,3224,1,'2023-09-30 18:34:21','2023-09-30 18:34:21','4a261053-7535-498e-acff-734698dfe26d',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(633,3225,1,'2023-09-30 18:34:21','2023-09-30 18:34:21','862c9337-7421-4fe6-9cda-100478ec04bc','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(634,3226,1,'2023-09-30 18:34:21','2023-09-30 18:34:21','f579b24d-fe50-4331-ab3b-ed9b55bbd967',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(635,3228,1,'2023-09-30 18:34:24','2023-09-30 18:34:24','9c8d6ae6-fad1-4e30-9426-ab9e477da947',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(636,3229,1,'2023-09-30 18:34:24','2023-09-30 18:34:24','17b60d81-e931-427f-bcff-2531259902ec','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(637,3230,1,'2023-09-30 18:34:24','2023-09-30 18:34:24','ad7711f5-229e-4b1a-b16e-79637bd4cdc7',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(638,3231,1,'2023-09-30 18:34:24','2023-09-30 18:34:24','569385a1-0c33-444a-a9d1-358302292695','ReferenceError: window is not defined','text',NULL),(639,3232,1,'2023-09-30 18:34:24','2023-09-30 18:34:24','b9f3bd0d-b7af-49e8-92cb-add7602a38bf',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(640,3233,1,'2023-09-30 18:34:24','2023-09-30 18:34:24','3898f9ca-3639-4392-9baf-c0ba2d1bef91','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(641,3234,1,'2023-09-30 18:34:24','2023-09-30 18:34:24','76098f3f-c539-4c6f-a6f1-5165a453ab2b',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(642,3236,1,'2023-10-04 13:14:31','2023-10-04 13:14:31','fb445bdc-f0b6-42fb-9f83-ca110cade6ef',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(643,3237,1,'2023-10-04 13:14:31','2023-10-04 13:14:31','0fa41e20-fc76-4fe2-9604-7aceee7edc11','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(644,3238,1,'2023-10-04 13:14:31','2023-10-04 13:14:31','9dd0b4c4-8c58-4376-88f6-e783d9ae9a3e',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(645,3239,1,'2023-10-04 13:14:31','2023-10-04 13:14:31','16468551-e2cf-455d-9c54-52be8a6a4fd5','ReferenceError: window is not defined','text',NULL),(646,3240,1,'2023-10-04 13:14:31','2023-10-04 13:14:31','8d373376-9f44-4eae-bd68-d50f9af7b49e',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(647,3241,1,'2023-10-04 13:14:31','2023-10-04 13:14:31','14dfb879-8539-46b5-9759-a8ff1ca020cb','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(648,3242,1,'2023-10-04 13:14:31','2023-10-04 13:14:31','d5c0efe0-4ad9-47bf-b3c3-ae277762b39c',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(649,3244,1,'2023-10-12 06:15:19','2023-10-12 06:15:19','f8786ff2-f092-42e8-a2b2-4c271786eced',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(650,3245,1,'2023-10-12 06:15:19','2023-10-12 06:15:19','d3846647-281b-400d-af4c-9c2c48f7caec','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(651,3246,1,'2023-10-12 06:15:19','2023-10-12 06:15:19','204b0315-2018-4797-80ae-d4c99c7cc642',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(652,3247,1,'2023-10-12 06:15:19','2023-10-12 06:15:19','ff1b12d4-8117-4cf1-9505-ffb2c08deefc','ReferenceError: window is not defined','text',NULL),(653,3248,1,'2023-10-12 06:15:19','2023-10-12 06:15:19','51e476f2-3dfb-4e95-ae6a-76245689dfad',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(654,3249,1,'2023-10-12 06:15:19','2023-10-12 06:15:19','4954e588-5369-422a-9a38-627e4b7c9eee','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(655,3250,1,'2023-10-12 06:15:19','2023-10-12 06:15:19','3e38ad41-0a2b-4ac8-90f2-0ece22c93b2b',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(656,3252,1,'2023-10-12 06:15:21','2023-10-12 06:15:21','a7247fc2-8f2d-4931-925e-918166f1d5eb',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(657,3253,1,'2023-10-12 06:15:21','2023-10-12 06:15:21','f64056ef-cc85-491f-b715-c78bfe12b2e4','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(658,3254,1,'2023-10-12 06:15:21','2023-10-12 06:15:21','7f9f1392-d9c2-4992-9173-8601ac2a8caf',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(659,3255,1,'2023-10-12 06:15:21','2023-10-12 06:15:21','51ab647a-6eea-47a0-b7ac-c3ef4dd97524','ReferenceError: window is not defined','text',NULL),(660,3256,1,'2023-10-12 06:15:21','2023-10-12 06:15:21','3952ee78-0f28-4460-9d27-bb201d42be26',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(661,3257,1,'2023-10-12 06:15:22','2023-10-12 06:15:22','2c285387-a97a-46b4-80f3-fcf60d93bc1f','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(662,3258,1,'2023-10-12 06:15:22','2023-10-12 06:15:22','937b3290-28f0-463b-8288-463e851f4ca7',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(663,3260,1,'2023-10-17 14:16:28','2023-10-17 14:16:28','8928b7c2-989c-4414-be48-937b36a3572a',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(664,3261,1,'2023-10-17 14:16:28','2023-10-17 14:16:28','da83c759-734f-473e-9996-980ce3ea18ee','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(665,3262,1,'2023-10-17 14:16:28','2023-10-17 14:16:28','b70c983c-9b1a-470f-88cf-4e5fd07166c2',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(666,3263,1,'2023-10-17 14:16:28','2023-10-17 14:16:28','97124240-62fa-459d-9628-91a353a3e2ca','ReferenceError: window is not defined','text',NULL),(667,3264,1,'2023-10-17 14:16:28','2023-10-17 14:16:28','f130cd90-8718-474e-a313-f8be7ee4ae54',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(668,3265,1,'2023-10-17 14:16:28','2023-10-17 14:16:28','659213c1-615c-445e-a3c4-c70a9a667f5e','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(669,3266,1,'2023-10-17 14:16:28','2023-10-17 14:16:28','e033d77d-386d-4a7e-b76c-6a0180d2a0a9',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(670,3268,1,'2023-10-17 14:16:30','2023-10-17 14:16:30','e635f2b9-1cbe-4fa6-b65c-45b1b654ad66',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(671,3269,1,'2023-10-17 14:16:30','2023-10-17 14:16:30','0709d47b-e3a3-4d3d-a61c-9948952e9b2e','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(672,3270,1,'2023-10-17 14:16:30','2023-10-17 14:16:30','a30f244e-9de6-47ad-a52a-0a99976a2807',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(673,3271,1,'2023-10-17 14:16:30','2023-10-17 14:16:30','77a8435a-6c50-4bd5-8da0-84c4ea46baf7','ReferenceError: window is not defined','text',NULL),(674,3272,1,'2023-10-17 14:16:30','2023-10-17 14:16:30','342a67e2-179d-4330-af11-07f09cb48a8e',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(675,3273,1,'2023-10-17 14:16:30','2023-10-17 14:16:30','ca07cdcc-41d2-4f23-b676-24ea5e30959e','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(676,3274,1,'2023-10-17 14:16:30','2023-10-17 14:16:30','6d06f093-ef98-4604-8c9f-b1edc96d66d2',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(677,3276,1,'2023-10-18 17:19:55','2023-10-18 17:19:55','053c2035-e285-4d0d-9bca-0a5b739379d0',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(678,3277,1,'2023-10-18 17:19:55','2023-10-18 17:19:55','9c11322d-2903-4769-9b30-015a911505fb','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(679,3278,1,'2023-10-18 17:19:55','2023-10-18 17:19:55','02d2e457-571e-4e75-bf70-e59afbe170e8',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(680,3279,1,'2023-10-18 17:19:55','2023-10-18 17:19:55','2bd2185d-d48a-4813-9889-386d58fe301d','ReferenceError: window is not defined','text',NULL),(681,3280,1,'2023-10-18 17:19:55','2023-10-18 17:19:55','398c8be0-8068-49b0-abd8-a243ce09b9e3',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(682,3281,1,'2023-10-18 17:19:55','2023-10-18 17:19:55','4f01cf02-febe-46ea-b80f-664c8d52ebac','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(683,3282,1,'2023-10-18 17:19:55','2023-10-18 17:19:55','f388479c-b6a2-466f-b38b-dacd135753b9',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(684,3284,1,'2023-10-18 17:20:18','2023-10-18 17:20:18','7c3097d4-fbcb-41c5-8fdd-5ec2fbb8d49d',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(685,3285,1,'2023-10-18 17:20:18','2023-10-18 17:20:18','5687ff1f-5aa8-4e3e-838c-9947548544fc','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(686,3286,1,'2023-10-18 17:20:18','2023-10-18 17:20:18','54ac4ed9-c2e6-4722-abcc-91f820f39b0c',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(687,3287,1,'2023-10-18 17:20:18','2023-10-18 17:20:18','f63c78d4-1c7b-40d0-907a-d45344347df8','ReferenceError: window is not defined','text',NULL),(688,3288,1,'2023-10-18 17:20:18','2023-10-18 17:20:18','5a9763cb-29a3-4c85-b01e-cf46bfd9785f',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(689,3289,1,'2023-10-18 17:20:18','2023-10-18 17:20:18','f118fac7-4316-4b75-9cc3-a5043c872420','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(690,3290,1,'2023-10-18 17:20:18','2023-10-18 17:20:18','cd864e33-8f5c-43d3-8c99-bf4fe649cc98',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(691,3292,1,'2023-10-19 15:57:45','2023-10-19 15:57:45','27810d5c-1c77-42b9-86d1-b52730884e3c',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(692,3293,1,'2023-10-19 15:57:45','2023-10-19 15:57:45','18e4c5f8-aa3e-4a72-8c1f-236563967320','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(693,3294,1,'2023-10-19 15:57:45','2023-10-19 15:57:45','ce010f31-15b2-4ba7-92a3-469714da81e3',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(694,3295,1,'2023-10-19 15:57:45','2023-10-19 15:57:45','23b93bd7-1c61-44c4-8b36-0db96ed0d23a','ReferenceError: window is not defined','text',NULL),(695,3296,1,'2023-10-19 15:57:45','2023-10-19 15:57:45','edfbbf69-fe17-422e-a8c9-f1c3e08578a3',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(696,3297,1,'2023-10-19 15:57:45','2023-10-19 15:57:45','e49cba11-7f82-4b4c-9af3-7ecdb1ee27f2','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(697,3298,1,'2023-10-19 15:57:45','2023-10-19 15:57:45','1df1834e-9666-4621-a534-1ecc34563dcd',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(698,3300,1,'2023-10-19 15:57:46','2023-10-19 15:57:46','a2594bb4-1cf4-4093-ac4c-0222c882ad72',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(699,3301,1,'2023-10-19 15:57:46','2023-10-19 15:57:46','88aae130-9cac-42df-85af-9b74f0734a64','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(700,3302,1,'2023-10-19 15:57:46','2023-10-19 15:57:46','58cd721b-d60c-495c-99c8-b42d816c7254',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(701,3303,1,'2023-10-19 15:57:46','2023-10-19 15:57:46','8d679b23-2365-4e1a-a148-786df4b7d9f3','ReferenceError: window is not defined','text',NULL),(702,3304,1,'2023-10-19 15:57:46','2023-10-19 15:57:46','34c08b7d-3b26-4937-8cc9-9d8ab446f7a0',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(703,3305,1,'2023-10-19 15:57:46','2023-10-19 15:57:46','b61bf6a6-86f1-4616-aea3-48bc7b0975f7','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(704,3306,1,'2023-10-19 15:57:46','2023-10-19 15:57:46','31aed574-4771-4a92-b2af-c97713c6b3fa',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(705,3308,1,'2023-10-19 15:57:48','2023-10-19 15:57:48','0ea8075f-9cd1-4a7a-84f9-10443826e174',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(706,3309,1,'2023-10-19 15:57:48','2023-10-19 15:57:48','3d00bdb2-a573-457d-8534-261fc84bd0af','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(707,3310,1,'2023-10-19 15:57:48','2023-10-19 15:57:48','1cf72b0d-9233-474c-943f-bcfe6dc39c73',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(708,3311,1,'2023-10-19 15:57:48','2023-10-19 15:57:48','2782961c-0cc0-4b8a-9acd-bb9e69e81e44','ReferenceError: window is not defined','text',NULL),(709,3312,1,'2023-10-19 15:57:48','2023-10-19 15:57:48','edf3996f-35d9-47b1-a513-a3f943ee0325',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(710,3313,1,'2023-10-19 15:57:48','2023-10-19 15:57:48','31acb35d-2a57-4b04-9acd-3b548f44822d','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(711,3314,1,'2023-10-19 15:57:48','2023-10-19 15:57:48','9c329e1d-9238-4f5b-9b85-e9e7d0cd27e8',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(712,3316,1,'2023-10-19 15:57:50','2023-10-19 15:57:50','4ea488d8-18c1-4c14-ae52-1376fe86b1b0',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(713,3317,1,'2023-10-19 15:57:50','2023-10-19 15:57:50','5135b732-1d69-4eaa-816d-6b1e13e36040','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(714,3318,1,'2023-10-19 15:57:50','2023-10-19 15:57:50','1a464ba6-edbf-462e-b363-05772d1b5c7f',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(715,3319,1,'2023-10-19 15:57:50','2023-10-19 15:57:50','4a6b0ddb-0dc3-40c7-8a22-73ba34f8f8a6','ReferenceError: window is not defined','text',NULL),(716,3320,1,'2023-10-19 15:57:50','2023-10-19 15:57:50','8129b2bb-5191-4a79-9cf7-c23784fccf76',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(717,3321,1,'2023-10-19 15:57:50','2023-10-19 15:57:50','970127e7-e127-491c-9ef9-40e6eec9b834','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(718,3322,1,'2023-10-19 15:57:50','2023-10-19 15:57:50','52a2df49-6bd4-430a-a463-643e4ca02df8',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(719,3324,1,'2023-11-02 00:14:51','2023-11-02 00:14:51','e026c65a-ddfe-4544-896b-63004eceecad',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(720,3325,1,'2023-11-02 00:14:51','2023-11-02 00:14:51','92edcc54-57d3-4900-965f-7d65555d8813','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(721,3326,1,'2023-11-02 00:14:51','2023-11-02 00:14:51','ed689dbe-0c31-49a5-a067-5f18e2f2cd05',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(722,3327,1,'2023-11-02 00:14:51','2023-11-02 00:14:51','88d461ec-3c7f-4e06-949e-cd7c8c9d0131','ReferenceError: window is not defined','text',NULL),(723,3328,1,'2023-11-02 00:14:51','2023-11-02 00:14:51','0a110b12-50b8-41bc-aa6e-ea5f2bd754b4',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(724,3329,1,'2023-11-02 00:14:51','2023-11-02 00:14:51','96f0bd8b-b76d-4e26-8f1b-7f4cd0c11c47','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(725,3330,1,'2023-11-02 00:14:51','2023-11-02 00:14:51','ca6ef663-8657-44c7-b539-f0a6c4b6bbd9',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(726,3332,1,'2023-12-13 19:52:13','2023-12-13 19:52:13','98d95dc2-1c94-4912-b2fc-fc1773e9758b',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(727,3333,1,'2023-12-13 19:52:13','2023-12-13 19:52:13','2dc9d6a8-bdee-4a4f-8751-3c99fe60d772','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(728,3334,1,'2023-12-13 19:52:13','2023-12-13 19:52:13','f23d4049-e084-4b82-b86e-ff3bf2f22b43',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(729,3335,1,'2023-12-13 19:52:13','2023-12-13 19:52:13','e9ae46c5-36d8-4836-9ef2-e41954859ba9','ReferenceError: window is not defined','text',NULL),(730,3336,1,'2023-12-13 19:52:13','2023-12-13 19:52:13','b2043296-e431-49bf-adb5-d604e1e85838',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(731,3337,1,'2023-12-13 19:52:13','2023-12-13 19:52:13','17dcc65e-16d4-4109-8bb1-3cded5946f2b','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(732,3338,1,'2023-12-13 19:52:13','2023-12-13 19:52:13','6f3094fd-30fc-4fed-9709-c8fce7d8cbe4',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(733,3340,1,'2023-12-13 19:52:15','2023-12-13 19:52:15','555d11b5-ef19-4f97-bacb-3efd4a33e571',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(734,3341,1,'2023-12-13 19:52:16','2023-12-13 19:52:16','d9b6e088-8fa9-49a5-a942-e44e16f3be7d','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(735,3342,1,'2023-12-13 19:52:16','2023-12-13 19:52:16','7d6d78b2-58a5-43e2-9dd0-bd76df6ca208',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(736,3343,1,'2023-12-13 19:52:16','2023-12-13 19:52:16','9f047c37-9dba-4a35-a6d2-ee57d897427f','ReferenceError: window is not defined','text',NULL),(737,3344,1,'2023-12-13 19:52:16','2023-12-13 19:52:16','2ee1a5d2-d863-4f69-bc50-22f523b754db',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(738,3345,1,'2023-12-13 19:52:16','2023-12-13 19:52:16','b84ff1fe-6cb7-449b-a876-6fef887e6df4','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(739,3346,1,'2023-12-13 19:52:16','2023-12-13 19:52:16','659ce83d-1315-480e-943f-ecdc0fb94581',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(740,3348,1,'2024-01-15 18:13:00','2024-01-15 18:13:00','d7441391-8abb-482e-a1b8-4dce8e029134',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(741,3349,1,'2024-01-15 18:13:00','2024-01-15 18:13:00','2f96e47c-a917-4ac7-9255-5db48304e2fd','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(742,3350,1,'2024-01-15 18:13:00','2024-01-15 18:13:00','fd57f829-699a-4350-9cbc-9ae461b81d2b',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(743,3351,1,'2024-01-15 18:13:00','2024-01-15 18:13:00','63cde8fa-fdc4-452e-a9ee-c3ba7c8a2c21','ReferenceError: window is not defined','text',NULL),(744,3352,1,'2024-01-15 18:13:00','2024-01-15 18:13:00','4855059c-9f9a-4eb9-8d5d-6bcd5dd873b9',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(745,3353,1,'2024-01-15 18:13:00','2024-01-15 18:13:00','5c00fede-5758-42c3-8f6e-8f8df329bba6','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(746,3354,1,'2024-01-15 18:13:00','2024-01-15 18:13:00','082a67da-4274-4a07-b82b-eacdce032b67',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(747,3356,1,'2024-01-15 18:13:01','2024-01-15 18:13:01','3dc78728-6469-4f14-8264-db76498af6dc',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(748,3357,1,'2024-01-15 18:13:01','2024-01-15 18:13:01','2399f839-5792-4d3e-9364-2122745ac917','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(749,3358,1,'2024-01-15 18:13:01','2024-01-15 18:13:01','5eef6712-47d7-49e5-8385-6ad85d929821',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(750,3359,1,'2024-01-15 18:13:01','2024-01-15 18:13:01','13642262-95dd-4446-aa55-a4cc65a0a13b','ReferenceError: window is not defined','text',NULL),(751,3360,1,'2024-01-15 18:13:01','2024-01-15 18:13:01','6e9ccbf2-4f36-4209-ac07-9496a35e047b',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(752,3361,1,'2024-01-15 18:13:01','2024-01-15 18:13:01','554fe5b8-8d90-4951-b664-31039e4de19b','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(753,3362,1,'2024-01-15 18:13:01','2024-01-15 18:13:01','157137a5-ec2b-4024-9984-3a2cd668ace0',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(754,3364,1,'2024-01-15 18:13:02','2024-01-15 18:13:02','88e58f10-6503-4aaa-bf23-b2272ef8ca14',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(755,3365,1,'2024-01-15 18:13:02','2024-01-15 18:13:02','fe2f5eb4-0f6d-4bad-a90c-2f51d0142ecb','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(756,3366,1,'2024-01-15 18:13:02','2024-01-15 18:13:02','8de8d278-8c9c-41c8-9bb7-63e5b43d3044',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(757,3367,1,'2024-01-15 18:13:02','2024-01-15 18:13:02','7c010a0b-2a9e-4be7-ad0a-5c23f9471f81','ReferenceError: window is not defined','text',NULL),(758,3368,1,'2024-01-15 18:13:02','2024-01-15 18:13:02','333156d1-cd02-4d84-8e75-7ee925210359',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(759,3369,1,'2024-01-15 18:13:02','2024-01-15 18:13:02','1b987cf1-bd8d-4677-b290-ce9b54ef7251','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(760,3370,1,'2024-01-15 18:13:02','2024-01-15 18:13:02','03988331-4fae-4973-926b-5a97b8c0e5f4',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(761,3372,1,'2024-01-15 18:13:05','2024-01-15 18:13:05','fb7bd9b4-7e98-4ac3-a691-b56494d35983',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(762,3373,1,'2024-01-15 18:13:05','2024-01-15 18:13:05','668b97ff-c5fd-4a01-bcb0-52803d4ca338','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(763,3374,1,'2024-01-15 18:13:05','2024-01-15 18:13:05','a4b24f6f-b9ce-4127-b5cc-580adbd37f18',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(764,3375,1,'2024-01-15 18:13:05','2024-01-15 18:13:05','fc6d3503-c54a-4488-b8cd-9c304a69d7ad','ReferenceError: window is not defined','text',NULL),(765,3376,1,'2024-01-15 18:13:05','2024-01-15 18:13:05','63b80028-4909-4bdf-bd9f-53dea3bf1647',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(766,3377,1,'2024-01-15 18:13:05','2024-01-15 18:13:05','f1c8376b-0c74-4d83-8b2d-39a9ccf5f1ce','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(767,3378,1,'2024-01-15 18:13:05','2024-01-15 18:13:05','0b04149b-fe81-42dc-9b89-f636cff45e4e',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(768,3380,1,'2024-01-15 18:13:13','2024-01-15 18:13:13','376340fd-91fb-48f2-a59e-c821af239dcd',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(769,3381,1,'2024-01-15 18:13:13','2024-01-15 18:13:13','915bad87-65c8-4dd8-9a10-140c7cdcdfa4','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(770,3382,1,'2024-01-15 18:13:13','2024-01-15 18:13:13','3fd3f4d5-a313-4151-85ae-fa54d1892d37',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(771,3383,1,'2024-01-15 18:13:13','2024-01-15 18:13:13','ede08510-602b-4e69-8fb1-70430609eca6','ReferenceError: window is not defined','text',NULL),(772,3384,1,'2024-01-15 18:13:13','2024-01-15 18:13:13','6a509531-db74-4c6c-96b0-baae5fe5db06',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(773,3385,1,'2024-01-15 18:13:13','2024-01-15 18:13:13','5f611a8b-42dc-4cd7-8331-aa3ab2602367','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(774,3386,1,'2024-01-15 18:13:13','2024-01-15 18:13:13','f3d1c0f8-f1a3-467e-b69f-b698f6a50d37',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(775,3388,1,'2024-01-19 15:14:11','2024-01-19 15:14:11','846ccbb8-9048-45f5-a604-c1a2d481aa95',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(776,3389,1,'2024-01-19 15:14:11','2024-01-19 15:14:11','1018b8fb-1811-4b85-9258-6d973b6d2e9f','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(777,3390,1,'2024-01-19 15:14:11','2024-01-19 15:14:11','43ecaeb5-5c14-42c8-94e8-9085bea5e26b',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(778,3391,1,'2024-01-19 15:14:11','2024-01-19 15:14:11','381e677b-f4c0-440c-963f-6d0d1977f04f','ReferenceError: window is not defined','text',NULL),(779,3392,1,'2024-01-19 15:14:11','2024-01-19 15:14:11','40a965cf-2fdf-450e-9cc4-ca181ae4547d',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(780,3393,1,'2024-01-19 15:14:11','2024-01-19 15:14:11','b737a6e9-18e7-42cf-805d-1feac75c8db7','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(781,3394,1,'2024-01-19 15:14:11','2024-01-19 15:14:11','15a4f4e2-cb1d-4f3e-b8af-7a86691c48ff',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(782,3396,1,'2024-01-19 15:14:15','2024-01-19 15:14:15','e9b5ff4d-84df-4026-b381-3d926684cc32',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(783,3397,1,'2024-01-19 15:14:15','2024-01-19 15:14:15','b4626c55-b666-4524-bfe8-21ea737c8e27','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(784,3398,1,'2024-01-19 15:14:15','2024-01-19 15:14:15','8625d936-8bba-4736-9fdd-161b55380c98',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(785,3399,1,'2024-01-19 15:14:15','2024-01-19 15:14:15','e1575f33-8923-47df-a7ca-87cebd8b9ea1','ReferenceError: window is not defined','text',NULL),(786,3400,1,'2024-01-19 15:14:15','2024-01-19 15:14:15','861a1b30-9df7-4eeb-ab77-acc56883b659',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(787,3401,1,'2024-01-19 15:14:15','2024-01-19 15:14:15','d383e7a6-4d7f-431e-9f8e-ffb1f12b6425','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(788,3402,1,'2024-01-19 15:14:15','2024-01-19 15:14:15','8ceeecac-76f5-49a5-ae24-f90ee6ca9b49',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(789,3404,1,'2024-01-19 15:14:19','2024-01-19 15:14:19','1821abf1-efc9-4b47-99b0-bf8efb99e57b',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(790,3405,1,'2024-01-19 15:14:19','2024-01-19 15:14:19','8a9090a3-d885-464e-9941-a996db09d371','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(791,3406,1,'2024-01-19 15:14:19','2024-01-19 15:14:19','34daf065-a25b-44c6-9618-2e32ea4156b6',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(792,3407,1,'2024-01-19 15:14:19','2024-01-19 15:14:19','2c31bf58-3b92-4c48-ae9c-0fb5750301db','ReferenceError: window is not defined','text',NULL),(793,3408,1,'2024-01-19 15:14:19','2024-01-19 15:14:19','50e2cb91-afa7-4c2f-a58b-112706c81c2a',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(794,3409,1,'2024-01-19 15:14:19','2024-01-19 15:14:19','9545a6fa-d204-4160-868a-91666c5ce641','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(795,3410,1,'2024-01-19 15:14:19','2024-01-19 15:14:19','a748fcdf-cf23-4777-a5f1-7a4c44448501',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>'),(796,3412,1,'2024-01-19 15:14:21','2024-01-19 15:14:21','a3aa5f85-72b3-48ad-a1dd-a62acfe4c5d7',NULL,NULL,'<p>I wanted to get some more experience working with GraphQL mutations, so I worked on a new feature for my site that enabled a user to “like” a blog article. I ran into a little gotcha that is kind of obvious now that I know the solution but wasn’t obvious at the time.</p>\r\n<p><video src=\"//assets.trevor-davis.com/uploads/images/content/like-component.mp4\" autoplay=\"\" loop=\"\" muted=\"\" controls=\"\"></video></p>\r\n<p>I didn’t think I needed to be fancy and store the “like” in the database and associate with the user, so I decided that tracking whether the user had liked the article in <code>localStorage</code> was enough and then keep track of the total article like count in the database. Seems easy enough right?</p>\r\n<h2>The Problem</h2>\r\n<p>This was my first approach in retrieving whether or not the user had liked the article from <code>localStorage</code>:</p>'),(797,3413,1,'2024-01-19 15:14:21','2024-01-19 15:14:21','d5c65a7e-a147-4fc9-8ba8-88245cfe8352','import { useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n})','jsx',NULL),(798,3414,1,'2024-01-19 15:14:21','2024-01-19 15:14:21','c7eedc00-8b96-4c99-b301-56bc795ef6ce',NULL,NULL,'<p>And this is the error that I was getting:</p>'),(799,3415,1,'2024-01-19 15:14:21','2024-01-19 15:14:21','5aeae642-5bb3-4908-858a-af4c032fae97','ReferenceError: window is not defined','text',NULL),(800,3416,1,'2024-01-19 15:14:21','2024-01-19 15:14:21','260ad357-5c28-49fd-be48-4c52cc2c4cc2',NULL,NULL,'<h2>The Fix</h2>\r\n<p>At first I was &#x1f914;, but the fix is super simple and totally makes sense. Remix renders on the server, but I wanted to run this in the browser, so I simply needed to wrap it in a <code>useEffect</code>:</p>'),(801,3417,1,'2024-01-19 15:14:21','2024-01-19 15:14:21','02b2c2f5-cfd4-459d-b097-823164d93a00','import { useEffect, useState } from \'react\'\n\nconst Like = ({ storageKey, likes }) => {\n    const [hasLiked, setHasLiked] = useState(false)\n\n    useEffect(() => {\n        setHasLiked(window.localStorage.getItem(storageKey) === \'true\')\n    }, [storageKey])\n})','jsx',NULL),(802,3418,1,'2024-01-19 15:14:21','2024-01-19 15:14:21','c350d565-f72a-4faf-bf63-e7a670fac573',NULL,NULL,'<p>This is actually captured in the <a href=\"https://remix.run/docs/en/v1/guides/constraints#rendering-with-browser-only-apis\">Remix docs</a>, but it was kind of buried.</p>');
