 My name is Ben Allman. I work at Boku with Adam and Richard and a whole bunch of other guys who happen to be here also making cool internet things. Lately I've been working on this server side command line internet thing called grunt because I was getting really sick of writing really long jake files and make files and experimenting with all of these things that I felt should kind of be trivial and a thousand lines is a lot of code to share across well let's see github slash cowboy if the internet works this is really awesome but something like 50, 70 different projects I know I'm kind of the exception with the amount of projects that I have as you can see there. But yeah I've got a 978 repos yeah so it's kind of getting unmanageable and I decided to build a tool to help me do the things that I did all the time you've I'm sure heard about it every time I turn around someone is saying grunt this or grunt that people are actually using it it's in beta right now but we're actually taking community contributions and suggestions things like that and making it better. So like fair warning right 0.3.11 is something I just pushed today to help with the demo based on some tweaks we made to the upcoming jQuery plugin site specification I'm going to actually show you how that works 0.4 is on the horizon I've actually been doing a lot of work with a few other people on it and some things are going to break I apologize for that but they are actually almost entirely based on community suggestions so that's a good thing if you have suggestions we've got a website it's called github go to the issues for grunt see what's going on there there's lots of docs etc so anyways grunt is this tool that you run in the command line it does a bunch of stuff it will lint your files it will test your files okay who here lints their javascript okay it's more than zero so that's good how about tests their javascript whoa okay nice yeah no no how about actually test your javascript instead of just doing that to make me feel better okay so the idea about one of the things I really want to do with grunt is make it easier for you to write unit tests like you're writing it I use the jQuery plugin as the example because I write have written so many of them but you're writing look at jQuery plugin you're doing a project and you want to get up and running and get some tests going and you're like oh I have to install what to do my test how do we even do that start googling it it's getting frustrating then you're like okay what's the directory structure like what's everything like what like all of this stuff it adds up to be quite complicated so in addition to doing all these tasks like concatting and minning minifying and linting doing all these things to your javascript I actually built in some basic scaffolding templates with the init task which is extensible and again this is really early on so we're working out ways to make it more awesome in the future again you guys have suggestions let's hear them but right now there's some built-in init task so let me just go into a sub directory here hopefully you guys can see my console let's see make a directory called awesome plug-in I'll go into awesome plug-in I'll type G sorry not I'll type grunt init oops that's init you can actually see it's gonna list like a handful of tasks that are available there's one for like common JS one for actually just creating a grunt file one for creating a custom grunt plug-in etc the one I'm gonna run is j query right here so grunt init colon j query I'm actually gonna zoom this in slightly so you can see a little bit better and what it's gonna do is it's gonna give me a little bit of a warning heads up hey I'm new to this there are actually rules that you need to kind of follow to make your jQuery plug-in but it's gonna start asking you questions it's gonna figure out the default values for these questions based on your environment like the name of the folder you're in if it's already a git repo that you've get in it and added a remote to it's going to use that origin remote as the what's gonna pre-populate the the question where it says what's the repository URL if not it's gonna try to guess it based on like the current directory name your username any things you've stored in your git config etc so I could override these but I'll just leave it as the default awesome plug-in project title it's gonna guess it because the jQuery plugins repository will actually allow you to display the product project title description I'm gonna actually change this to the super best jQuery plug-in ever with some a little emphasis version guessing the github repo repository the home page the issues track are all based on your environment you can pick some licenses what are the ones that are built in I've actually just got gpl and MIT built in but you could add your own author name now that's gonna be cowboy Ben Alman I'll set none for my email and benalman.com you can actually store there was the values for these things an adjacent file that I've got somewhere in the doc so you don't have to fill them in every time manually required jQuery version do you need to make any changes no enter okay so it's just actually scaffolded out all of those files for me you can see that it's a written a grunt file as the first thing it's built out in the libs folder jQuery jas a jQuery loader thing that I've just added today some q-unit stuff for unit testing a read me with some basic stuff already put in and it's actually created the source files based on the name of the plug-in and unit testing files couple license files if I do a tree you can kind of see the directory structure right there but right now I could just literally run grunt and it will there's a warning right now you'll see this path existing it's because node 0.8 came out like two days ago and they they deprecated something so that'll be fixed really soon but it wasn't fixed this morning I ain't quite up the time it's just a warning anyways but you can see that it's gonna link your files hey let free you didn't have any problems all the assertions that I had in the built-in sample unit tests work perfectly fine because you know I want you to feel good when you install it when you actually start writing your own unit test you'll you can feel bad then it'll concat the files adding like a banner to the head like a comment kind of thing based on some cool stuff I'm gonna show you and it's gonna minify you can see like the uncompressed size the compressed size G zipped and then just minifieds if you really care about those values honestly I don't really care about the jQuery guys they use grunt and they really really care so they have green and red and all kinds of different colors to help them feel good or bad about what they've done so let's see if I were to open this right now just open the folder that I'm in take a look at the grunt file so file you guys read that yeah you can read that okay so the this is basically it's a instead of making your grunt file the configuration for this thing be a jason file like your package jason I made it be JavaScript it kind of feels like jason because you got objects with properties and stuff like that but it is JavaScript so if I wanted to build properties dynamically in a for loop based on files that exist in my source directory I could just use grunt dot file dot expand files source that slash star dot j s and I would have a list of all the files in there and I could dynamically add things I mean it's just JavaScript you're a node you have a lot of things available in a pretty complete API for getting around the file system with what what's built in a grunt here I'm just using some standard stuff I'm not doing any crazy hackery by default when you need a jQuery plugin you're gonna get you know like a sample banner see how it's using these underscore templates built in see how it's using pkg so package that title package that name that actually refers to this package jason colon awesome plug-in dot jQuery dot json now this is one of the details we were hammering out last night about the jQuery plugin site which actually feels really really solid right now when you create a jQuery plugin to be uploaded in the jQuery plugin site which is right around the corner I am hoping you you just you the instead of using a package json file for your plugin you'd actually use like foo dot jQuery dot json in the root of your repo for if your plugins name was foo so for example my plugin if I look at awesome dash plug-in dot jQuery dot json awesome dash plug-in is the name the title is awesome plug-in the description all these things you can recognize they're what I entered in when it asked the questions up front grumble generate this file for you automatically now right now I've only got this much for like basic node or common js things or jQuery plugins it's really basic right now but I'm going to be working on more in it templates and if you guys you can make your own that kind of thing backbone boilerplate for example is something that Tim Brannian has worked on that has a whole bunch of custom tasks and init stuff so you could init a whole project oh what's the thing yeoman that was just announced that Google I oh actually uses grunt under the hood Paul Irish was like yes I'm working on this little project that uses grunt and I'm like oh yeah that's that's cool do you need any help it's like no I'm good and then like two days ago I'm like yeoman and I look at it and I play the video and I'm like oh my god that's grunt so it's just he's kind of created a wrapper around grunt where he has a whole bunch of custom tasks and we're actually working together once he gets back from his super extended vacation to make it even better there he's got a lot of great ideas about those init templates and stuff so I'll generate this package Jason sorry the jQuery plugin Jason file for you automatically you've got the version you've got all this stuff and once you commit this and like push it to GitHub you could basically just tell the jQuery plugins site to look at that repo and it will just use it at that point I mean it's the process is going to be very simple if you weren't using grunt you could just write this by hand it's fine but grunt will kind of facilitate that for you so what's cool about this Jason file is you store all of your project metadata in this Jason file and instead of duplicating that project data in your grunt file to like generate your banner you just import it here that's just going to import the thing is raw Jason like as a now it's a jQuery object in your config and you can access it in your templates by just saying whatever property it was in pkg okay pkg.title or name that's kind of saying like oh if I didn't have a title defined it would just default back to the name the version because title is optional right today so it's going to format the current date using like ISO standard it's going to add all this stuff and I'm using underscore template so you can kind of underscore is built in you can go to town with it so that's a banner that will be used when I concat files it's going to take that banner it's going to concat it to my source file that has its banner stripped from it now this is just the way I did this but this is really flexible you could totally write all of your own stuff if you didn't and if you will we'll take a look at the jQuery and the jQuery UI built in grunt files they're they're like hundreds of lines on they've gone crazy um so when I run grunt it's going to take this it's going to see look at package name it's going to look for that named file in the source directory and it's going to build that same named file into the distribution directory so I can see the source file is this I have gotten the habit of putting comments with licenses at the top of all of my source code files period but when I actually distribute the file I'll strip those comments and put a much more compact kind of distribution comment with a date and a version number on it I don't want that really in my source this is just something I've developed because I write a lot of code that I share so here's a sample plugin this is just the default stock plugin we've got like a jQuery object method awesome it'll set the html to awesome on all the elements we've got a static method that just returns awesome a custom selector don't use custom selectors they're slow but hey if you want to write one there's one um so this is the cool thing right uh I can um I'll just run grunt watch and that'll actually kind of watch first changes in the file system and I'll go into my uh what that is uh let's look at the grunt file again we'll see that the grunt watch file is going to look at whatever I'd set up for lint and when any of them changes it's going to run the lint task and the q unit test task so let's poke around let's see what I've got for lint it looks at the grunt file changed anything in the source directory or any of its subdirectories and the test directory so if any of those change it's going to rerun the lint and q unit test so let me go to my test and say okay awesome plugin test.js I've got a little sample because you know not everyone has all this memorized okay so uh is awesome it should actually let's say should be very thoroughly awesome give it some more exclamation points and I'll save it and we'll see that my code actually breaks now it's running in the background it's just waiting for me to save files and change the actual is awesome it's expecting that so let's fix that I've updated my tests because that's the way things should behave now it's actually update my code and I don't know if you guys have ever done this but it's called like test driven development and it's really not that hard if you have a system set up to automatically run your unit tests when you change things so awesome let's um for now let's say I forget a semicolon right I save it oh it actually tells me that missing semicolon it shows exactly where it's missing the what line of what file so I'll go in and fix that save it now it actually passed the lint but it ran q unit okay they all passed all the assertions passed so like you can get into a development process like this where you you know you would blow away all my little boilerplate here and add your own stuff but you can see how it works it's and and these are jQuery plugins so they're using the DOM it's running jQuery and q unit under the hood but those require DOM they require the window to document all that kind of stuff um and because node doesn't have a document or a window because it's not a browser you can't run your DOM stuff in node so what I've actually done is a made a dependency on this really awesome tool called phantom js it also runs on the server um you would just install it there's like some downloads I've got links in my faqs on the in the documentation and it just runs standalone you can give a javascript files people use it for scraping websites but the whole idea is it's actually got a headless q unit browser running and what I do is actually develop the mechanism for communicating between uh between grunt in node and phantom which is a totally separate process and q unit to run your tests and have them report to grunt and like log errors or uh give the appropriate exit code so you can actually use it for like continuous integration kind of things like we're talking headless like browser webkit testing so that's what's actually running under the hood here q unit files is actually running uh the the unit tests in q unit in phantom js in webkit um so if I if I look at the folder structure again and I'll just open uh test slash awesome plugin dot html we'll see it's just the q unit it's just the the page like you'd expect and if I break my unit tests here by not returning the correct number of exclamation points you'll see that that fails just the same as grunt will fail on the exact same thing so when I fix this you'll see that passes and grunt passes so it's really they're really doing the same thing now running it in the command line is no substitute for running it in all the browsers you need to support right but like it's a good first step it helps you get to the point where you're like okay everything works I'm happy now let's start testing in the browser you take this thing you open it in a lot of other browsers um do your testing so one thing I just added yesterday uh no this morning I was sitting with Scott Gonzalez it's you know it's all blurry did a training before the conference I've been working on this I've been I don't know just blazing about and uh so it's uh it's you know I've had a few ideas over the last few days so they Scott was doing this in uh in something in jQuery and it was something I actually fooled around with a while back but then forgot about if you uh right now this will use the jQuery that's built in into the jQuery sub directory which is I've got 172 in there right now but if you were to do like question mark version equals latest it's actually going to load the version um oh sorry jQuery equalizes thanks Scott okay let's take a look um let's make sure I'm using the right not that works jQuery oh that is the latest okay okay let me do a non-latest 1.4.0 that is absolutely not the latest oh you know what and it's 1.4 not 1.4.0 pet peeve of mine okay there it is um it's version 1.4 you might be asking why did underscore uh dollar sign to access jQuery um what we were just having a conversation about this this morning uh when you're testing your plugin you shouldn't be using a dollar sign you should be using jQuery what if the user's in a no conflict environment and dollar sign is mootools or prototypes so you shouldn't be using dollar sign in your jQuery plugin you actually after the plugin is loaded you shouldn't be even accessing jQuery again you should be using an iffy where you're passing jQuery in so that you've kind of like locked into the version so if someone does no conflict afterwards and removes both jQuery and dollar sign it should still work so what I've added into all of the files that are generated by this init template is this window dot underscore dollar sign equals jQuery no conflict true because you're really testing your plugin and this is how you should be testing it because I said so um so you don't have to take my word for it okay but I've made a few jQuery plugins so what I did is actually store the reference to that in under window dot underscore dollar sign so if you have to hack around with jQuery you still have access to it but you can really test your plugin so uh we just added that uh this morning so here it's again qunit uh headless in the browser whatever you have a lot of flexibility uh by default it's going to use the built-in jQuery but if you want to link to the latest if it's a new one you don't have to update your repo anymore just update your link to have question mark jQuery equals latest and it'll pull it off of uh the jQuery cdn so that's all built in there transparently I've commented everything so that's like that's pretty basic I mean I could go in and hack the hell out of the uh the the the grunt file to show you how I would like you know I could store things in variables I can test different things there are a lot of examples for that so I mean I'm halfway through my talk so I want to show you some other stuff that's kind of cool but this I wanted to give you an idea of like hey if you're creating a jQuery plugin I'm really digging this workflow it's making my life a lot easier um so maybe it will also make your life easier also if you have any suggestions or additions or anything that you want to contribute file an issue talk to me find me afterwards we're actually going to have a little grunt hack session uh in the breakout room I think at four o'clock I signed up for it so if you if you want to talk more about grunt then by all means um so that is like a sample jQuery plugin grunt init colon jQuery um we're at zero three dot eleven now zero four is going to have a bunch of stuff rewritten the grunt file is actually going to change from grunt js to grunt file dot js because some people on windows have to type grunt dot cmd instead of grunt well this will fix that problem etc there's a few things but for the 0.5 release I really want to rewrite the init task to make scaffolding way more powerful and and flexible so that's a big thing that I have to do you know I used to be this guy who wrote jQuery plugins now and this guy who maintains grunt I I really haven't got to use it in any of my plugins yet just a few little sample ones uh maybe someday um so what I wanted to show you guys is um how uh just a little snippet of how jQuery uses grunt uh if you and I cloned this ahead of time because like it sat on like it I had to control c and restart cloning it like five times jQuery and jQuery UI because the the network or something but I've got it I've cloned it get status there's nothing to commit so it's completely clean so if I uh the first thing you do is run npm install and that would actually look at the package json file that is in there that's one thing I didn't mention uh when you create a plugin with uh when you create a plugin with the the grunt init now not only do you get that jQuery specific json file with all the metadata you also get a package json file that just has enough information for you to say npm install and it will download the latest version of grunt and you can put like if you have other grunt plugins that you use you can put them in there that way anyone contributing just goes into the root of your project types npm install and then they can just start running grunt so that's that's the idea there um and I I actually modified the read me mark down if I pull it up in browser well it's a little big but the whole idea is I've added a whole section on installing grunt and installing phantom js so if you make a jQuery plugin this documentation comes for free in your plugin uh among other things like not only is it prefilled with your title and description and it points to like you know your distribution files and stuff like that so you don't have to like do all that manually I mean yes you have to write your documentation yes you have to link to your examples and have a release history um but I I put in default information for those for your license for contributions to help you out to get to make it easier for people to contribute because you uh that people always asking questions about how do I get started it's kind of a pain so um that's that's just all in there um so uh okay back to jQuery if I already did an npm install because it would probably hang and uh it wouldn't be able to finish the talk um and I say talk loosely because I'm just freeform doing whatever so I'll run grunt here and you'll see it actually goes through a whole bunch of stuff it's gonna lint a whole bunch of different files it's gonna minify you'll see the minified it actually runs a compare size and uh they've got a setup where they uh they they you see what master is and then uh you you run it on any branch and you can actually see the delta between what master was and what your branch is so so that rick wilder and can sit there and be like I totally saved three bytes high fives and you guys laugh that's like literally all day long every day at boku literally okay almost every day and it's awesome it's great but like he's like green yes I save bytes it's yeah um so uh you know jQuery likes to not be any bigger than it has to be right so um so there's some basic stuff in here and uh one thing I wanted to do is jQuery actually has all of these unit tests uh and the unit tests uh they all run in q and it normally in the browser um so what I'm gonna do here is I'm gonna edit uh the index dot html file and the grunt file okay so index dot html the first thing I'm going to do is remove the ajax tests because those require a very specially setup server that's php and all this stuff and I'm not doing that for this example so goodbye ajax tests um and then I'm in the grunt file I'm gonna look oh look I wrote that cool um let's see I'm gonna go down to where they've set up the q unit tests and I'm actually gonna tell that to run from local host local host coin eight thousand I'll spell it right maybe um and then I'm gonna set up a custom task that's effectively an alias task so grunt dot register task test I'm gonna what test is gonna do is it's going to run that server task which is gonna start a static server on port eight thousand in the root of the repo and then it's gonna run q unit so that the q unit files can actually run from local host instead of from the file system because there are certain requirements that jQuery has um and uh actually what that's gonna do is the server task will only run as long as q is running once once q unit stops and grunts done the server will stop for what I want to do I'm actually just gonna make a custom little weight task um you can create alias tasks where you say test will run all of those tasks you give them options you can see that they've actually got a few over here by default grunt will do a whole lot of stuff um but I'm gonna say like grunt dot register task I'm gonna call this weight uh and that's just gonna be a function that when it executes is going to call a method that's built in that just tells it to wait and when if you'd say ver done equals this dot async and when your task was actually done asynchronously you'd invoke done and it would continue on it's just a pattern I developed here oh I do need a comma thank you I mean when I linted it you know it would tell me that probably but um okay so what this is gonna do is it's gonna run uh the static server it's gonna run q unit and then it's just gonna wait and the reason I'm doing this is because while I'm running uh the tests in the command line I'm going to also run them in the browser side by side because it amuses me to do so grunt test I'm gonna say uh verbose and I'm gonna force it so if there are errors which there will be because I know there will be uh because phantom js is not perfect it's just pretty awesome um okay so that should run run the test here and here simultaneously and uh you'll see them running in grunt on the left you'll see them running in my version of chrome on the right uh there there will be errors here there the reason though there'll be an error on the right hand side is because uh I'm not running in incognito mode some of my extensions are conflicting with it which will break jQuery unit tests and the reason things fell on the left is because I think uh phantom js has a problem with uh parse xml it's uh they're racing right now you can see them race so grunt running unit tests and q unit through phantom js 1.6 on the left and q unit running in chrome version 9000 or whatever it is on the right uh I don't I don't even keep track anymore so actually they're they're both really neck and neck at this point the left hand side grunt is actually slightly maybe slightly fast but I did get a slight head start so it's really really equal okay so the left is done and the right is just about to be done so you can see on the left hand side one of 6361 jQuery assertions failed that means 6360 assertions actually passed running uh headless in phantom js on jQuery so that's pretty awesome um I'm not I'm not looking for applause I'm just that made me feel really good I was like oh sweet this is actually like legitimate and on the right hand side one of them passed and that's again be uh one of them failed passed they all passed except for one simply because uh I'm not I'm not running with no extensions I wasn't running an incognito um so I had to remove Ajax to make this work because Ajax requires a php server that's configured in a very specific way but uh down the road they've actually been talking about just writing all the server stuff in nodes so you don't even need php it's just all straightforward that's down the road if they do it um but the whole idea here is I'm running I'm actually like lending all of jQuery's uh unit testing qnet which it just makes me it feels like it's okay this is a legitimate way to run your unit tests this will work in most scenarios interestingly enough if I was to run all these unit tests without Ajax uh from like a file colon slash slash URL which is what it does by default uh it doesn't work with offsets for some reason so uh there's a little bit of documentation about running your stuff from a local host server in the q unit and server tasks in the documentation but you might run into weird issues if you're running from file colon slash slash URLs instead of local host or something and your local host doesn't have to be like something that you started with grunt your local host could be a web server that you're running in any other that you could be running a php server you could be running uh like a ruby server or whatever you just tell grunt what to do and you you figure out those little details so that was jQuery um jQuery UI I've got it running around here somewhere let's see yeah built in a grunt it's just a connect server it's a static server super basic you could write your own I mean you just saw me do register task wait that just did something I mean you do register tasks and just write whatever the hell you want in that function um there's a lot of grunt methods that are documented go to town do file manipulation do I don't know start servers communicate with other things I'm just to give you an idea like uh I've only got it at a fiddle right now we're working on the grunt website uh there are let's see I'm doing a jason search through a proxy here 44 grunt plugins currently in npm uh and they do all kinds of different things this list is available in one of my issues as a little side note that says hey when the website is done let's add this um so it's not really published anywhere yet but it will be coming soon we're actually working on the website uh let's see that was let me go into jQuery UI because I thought this was actually really cool uh now I could run grunt right here but it's actually or I did an npm install but it actually gave me an error because uh in their package jason file scott take note uh in your package jason file you actually put a hard dependency on version 0.3.9 by putting a tilde here that says version 0.3.9 uh to any version up to 0.4.0 and I've released 0.311 so I kind of needed to do that um but if I were to run grunt at this point uh it's going to lint a whole bunch of things uh it's probably going to build build a whole it's running unit tests in cunit on like all of the jQuery UI stuff which is pretty neat um I mean again this it takes a little while to run these tests yes I mean because they're doing like event interaction all this crazy stuff or whatever but like you know you can you can do it um it's as you saw it's the same amount of time it's going to take to run those tests in the browser it's just you know less uh command tabbing and clicking for you um let's see give this a sec so this runs through all the tests done without errors great yay jQuery UI um if I were to run grunt build I think it is this actually goes through a whole bunch of stuff that they set up to like create like a lot of files you can really hack around custom there's a lot of command line options um grunt dash dash help will give you a lot of look at they've got a lot of custom tasks with no names but that's okay because they document them hopefully uh so there's a lot of like alias this release cdn will release themes copy to cdn minified internationalized internationalized minified images themes like it generates md5 checksums like it they've actually got it doing a lot and if we were to take a quick peek at the uh the grunt file we're gonna see like lines 200 300 but you know what it's just javascript and the one thing that was really cool is that um they told me and I believe them that they were using ant before and for them this is way faster than ant which is pretty awesome I'm not saying grunt is faster than ant in general I'm saying for them they say it was way faster than ant and and they enjoyed writing it instead of parsing xml files they're writing javascript so um and who knows they could also parse xml files using javascript if they wanted to I don't know um so that's jQuery UI using it I actually use the we use it in our trainings now to start web servers like local servers and to lint files so like when we've got people working on examples hey every time you edit your examples see the thing pass or fail and you can like get used to that workflow etc um and uh let's see what else do I have going on here we've got grunt on uh on twitter gruntjs websites in progress gruntjs.com with an actual brand that g is not the official logo that was just something I did really quickly to not have the default avatar there um let's see grunt I use grunt for making jQuery plugins common js modules node modules like I like make little utilities I don't build a lot of websites these days I mean I do I keep up like I work with stuff I make some web app stuff like that but that's not really what I'm doing most of the time so as a result I don't have any built in tasks in grunt that say minify cs css uh concat see it well you could concat anything with the concat task but I don't do like less processing um the thing is like again if you go to that jQuery uh the grunt plugins list uh there are like less and jasmine and jade and hamel and uh mocha and all these different things built by other people there's a grunt contrib plugin that's uh actually being maintained by uh chris talking to an entire Tyler kellen and they're actually doing a lot of work to like add a whole bunch of functionality into a single plugin that you can add um we're looking to like make useful plugins for the stuff that I don't do personally but a lot of people want to do because we don't want you to have to rewrite like every single task every time every different person we don't want a million different tasks for the same thing over and over again so we're trying to curate some uh if you want to participate in that find me in the grunt channel uh pound grunt on irc dot free on free node dot net and let's talk about it if you have any ideas um but the idea here is that if you do css stuff just install the plugin you do an npm install grunt css you'd add it in your package jason file and then in your grunt file just like they're doing in uh in jQuery UI or jQuery or whatever you would just say grunt dot load npm tasks grunt dash css and that would load grunt dash css as a local npm module that's all you have to do and then all your user or all whoever's dealing with your project or your site or whatever has to do is just do an npm install and then grunt it just it just does all that stuff for you so um that's pretty much what I've got uh there's there's a few resources if you have any questions find me like anytime on twitter i'm cowboy i work at boku on github i'm cowboy and i'm just around and so feel free to talk to me if you have more questions or specific things about grunt that you want answered uh meet me at at the breakout i think it's four o'clock uh is this afternoon so uh thank you very much i i hope it was helpful