{"id":7526,"date":"2021-10-27T15:02:43","date_gmt":"2021-10-27T15:02:43","guid":{"rendered":"https:\/\/max-drake.cc\/?p=7526"},"modified":"2021-10-30T10:48:41","modified_gmt":"2021-10-30T10:48:41","slug":"install-program-files-run-for-set-duration-in-ahk","status":"publish","type":"post","link":"https:\/\/max-drake.cc\/?p=7526","title":{"rendered":"Install program &#038; run for Trial Period for Try before you buy with  AHK"},"content":{"rendered":"\n<p>Previous articles have discussed counter uses for a program and a license check to run. I&#8217;m interested in duration, as in, the software will run for 30 days then stop. So how to do? <\/p>\n\n\n\n<p>On installing a program it has to go and get today&#8217;s date and secrete that somewhere. Then each subsequent time the program is run it needs to get the date NOW() and compare it with the start date, if its within bounds then it will allow program to run, if not, it won&#8217;t run the program. <\/p>\n\n\n\n<p>So its really calculating basic subtraction but with dates. <\/p>\n\n\n\n<p>Jack Dunnings forum post <a href=\"https:\/\/www.autohotkey.com\/boards\/viewtopic.php?f=6&amp;t=54796&amp;sid=88d702a8342eb50ea1fd3426703ba042\"><strong>Function Calculating Timespan in Years, Months, and Days<\/strong><\/a> talks about some of the issues. <\/p>\n\n\n\n<p>In AHK docs there are a couple of topics about time, and comparing time  and there is an <strong>EnvAdd<\/strong> function that can add\/subract time from date-time. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" width=\"303\" height=\"375\" data-src=\"https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_00_47-AutoHotkey-Help.jpg\" alt=\"\" class=\"wp-image-7527 lazyload\" data-srcset=\"https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_00_47-AutoHotkey-Help.jpg 303w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_00_47-AutoHotkey-Help-242x300.jpg 242w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_00_47-AutoHotkey-Help-50x62.jpg 50w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_00_47-AutoHotkey-Help-40x50.jpg 40w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_00_47-AutoHotkey-Help-100x124.jpg 100w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_00_47-AutoHotkey-Help-81x100.jpg 81w\" data-sizes=\"(max-width: 303px) 100vw, 303px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 303px; --smush-placeholder-aspect-ratio: 303\/375;\" \/><\/figure><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"842\" height=\"543\" data-src=\"https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_03_42-AutoHotkey-Help.jpg\" alt=\"\" class=\"wp-image-7528 lazyload\" data-srcset=\"https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_03_42-AutoHotkey-Help.jpg 842w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_03_42-AutoHotkey-Help-300x193.jpg 300w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_03_42-AutoHotkey-Help-768x495.jpg 768w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_03_42-AutoHotkey-Help-50x32.jpg 50w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_03_42-AutoHotkey-Help-78x50.jpg 78w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_03_42-AutoHotkey-Help-100x64.jpg 100w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_03_42-AutoHotkey-Help-155x100.jpg 155w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_03_42-AutoHotkey-Help-640x413.jpg 640w\" data-sizes=\"(max-width: 842px) 100vw, 842px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 842px; --smush-placeholder-aspect-ratio: 842\/543;\" \/><\/figure>\n\n\n\n<p> <\/p>\n\n\n\n<p>Jack also has this article <strong><a rel=\"noreferrer noopener\" href=\"https:\/\/jacks-autohotkey-blog.com\/2021\/04\/01\/calculating-dates-in-autohotkey-by-adding-years-months-and-or-days\/\" target=\"_blank\">The HowLongYearsMonthsDays.ahk Script Calculates Time Spans\u2014This New DateCalc() Function Yields New Dates Based on Adding or Subtracting Years, Months, or Days<\/a><\/strong>  which raises important issues about year and month variances, but if the program runs for 31 days or 29 its not a massive issue. So there is no need for a high degree of accuracy. If the <strong>EnvAdd<\/strong> function is the inbuilt AUTOHOTKEY function then I should give that a crack first. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Process<\/h3>\n\n\n\n<p><strong>Get start date<\/strong><\/p>\n\n\n\n<p>So we need to first grab the time at install, put this somewhere in a readable file (.ini files key\/value pairs are handy for this) and then do something to stop that file being overwritten. <\/p>\n\n\n\n<p>A couple of things come to mind. 1\/ Rename the file after putting date in it on first run of program, so 2nd time it runs, it looks for the original file and if not there then it does nothing, or 2\/ have a counter in the .ini file set initially at 0, so first time it runs, it checks number, if &lt;1 then write date, otherwise do nothing. <\/p>\n\n\n\n<p><strong>Calculate time period End date<\/strong><\/p>\n\n\n\n<p>So we now have original date, we now need to calculate an end date, be it 1, 5, 10, 30 days in the future. <\/p>\n\n\n\n<p>This can be calculated and sent to the .ini file at the same time as start date is done, we only need to do it once inside the if &lt;1 check above. <\/p>\n\n\n\n<p><strong>Get current Date\/Time &amp; compare with End date<\/strong><\/p>\n\n\n\n<p>So after that we just need to get current date and time and put it in a variable and compare that with the End date that we pull from the ini file. <\/p>\n\n\n\n<p>If End Date &#8211; Current Date = ?    Positive &#8211; run program, negative &#8211; trial time ended and you can choose to stop using program or purchase a License. <\/p>\n\n\n\n<p><strong>License install\/request email. <\/strong><\/p>\n\n\n\n<p>This process is the same as per this article <a href=\"https:\/\/max-drake.cc\/?p=7487\"><strong>How to protect final program when distributing? License keys?<\/strong><\/a> where code is available. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"671\" height=\"1024\" data-src=\"https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_29_15-Bubbl.us-Cultivation-\u2014-Mozilla-Firefox-671x1024.jpg\" alt=\"\" class=\"wp-image-7530 lazyload\" data-srcset=\"https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_29_15-Bubbl.us-Cultivation-\u2014-Mozilla-Firefox-671x1024.jpg 671w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_29_15-Bubbl.us-Cultivation-\u2014-Mozilla-Firefox-197x300.jpg 197w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_29_15-Bubbl.us-Cultivation-\u2014-Mozilla-Firefox-50x76.jpg 50w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_29_15-Bubbl.us-Cultivation-\u2014-Mozilla-Firefox-33x50.jpg 33w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_29_15-Bubbl.us-Cultivation-\u2014-Mozilla-Firefox-100x153.jpg 100w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_29_15-Bubbl.us-Cultivation-\u2014-Mozilla-Firefox-66x100.jpg 66w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_29_15-Bubbl.us-Cultivation-\u2014-Mozilla-Firefox-419x640.jpg 419w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_29_15-Bubbl.us-Cultivation-\u2014-Mozilla-Firefox-640x977.jpg 640w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_29_15-Bubbl.us-Cultivation-\u2014-Mozilla-Firefox-503x768.jpg 503w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_29_15-Bubbl.us-Cultivation-\u2014-Mozilla-Firefox-708x1080.jpg 708w, https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_29_15-Bubbl.us-Cultivation-\u2014-Mozilla-Firefox.jpg 734w\" data-sizes=\"(max-width: 671px) 100vw, 671px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 671px; --smush-placeholder-aspect-ratio: 671\/1024;\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Unix Epoch time <\/h3>\n\n\n\n<p><strong><a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/Unix_time\" target=\"_blank\">Unix time<\/a><\/strong> (UT) is just a single number, so you could calculate a date-time in the future and then set that number and keep on gathering current date time and converting it into Unix time and seeing if its less than the specified final number. <\/p>\n\n\n\n<p>An interesting event happening in 2038 with 32 bit computers where the Binary date resets, read <a href=\"https:\/\/max-drake.cc\/?p=6513\"><strong>Y2k38 Epochalypse<\/strong><\/a> and video :<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Y2K38 or Year 2038 problem with Unix time\" width=\"678\" height=\"381\" data-src=\"https:\/\/www.youtube.com\/embed\/pnhwVc3g4Ik?list=PLefQD9ccYWsj-ndj82eBXVVcbTu2Osw0r\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" class=\"lazyload\" data-load-mode=\"1\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>This may involve getting a UT function to convert date time into the correct format to do this. <\/p>\n\n\n\n<p>I would like to use the lightest way possible as I want to minimise the code overhead on the program as it will be run every time the program is run. <\/p>\n\n\n\n<p>A-NowUTC is also available in AutoHotKeys so that may be a better approach. You just have to find the number for your Duration &#8211; 1, 5, 10, 30 days etc &amp; add it to  A-NowUTC (Start) and then easily compare  A-NowUTC(current) with A_NowUTC(Start)+Duration. <\/p>\n\n\n\n<p>30 day duration is 60s x 60 min x 24 hrs x 30 days = 2592000 seconds<\/p>\n\n\n\n<p>So 30 day license =  A_NowUTC(Start)+  2592000  <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Files<\/h2>\n\n\n\n<p>TimeTrial.ahk<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\nTimeTrial.ahk\nThis is a setup test for sharing files with others that will run for a specific TIME period then stop\n\nThe setup is planned to allow others to test the compiled code for X number of DAYS then it stops working\n\nmax@pir2.tk\n*\/\n;-----------------------Setup -----------------------------\n#NoEnv\n#SingleInstance, Force\nSetWorkingDir %A_ScriptDir%\n;-----------------------Include libraries -----------------------------\n#Include %A_ScriptDir%\\Notify.ahk\n#Include %A_ScriptDir%\\E13.ahk\n\n;------------------Package ID ----------------------\nPackageId = TimeTrial_v0.1_20211028\nNgSplit=xNvRy\n;-----------------------Files &amp; Locations -----------------------------\n; Trig = %A_AppData%\\MSys\\trigger.ini \nTrig = trigger.ini \n\n;------------------Prog ----------------------\n\n;------------------Check # times program has run ----------------------\nIniRead, run, %Trig%, Count, run\n; if less than 1 then get start date and end trial time \nif (run&lt;1) ; this only runs once at the first run, its skipped all other times\n{\n    \n    EndTime = %A_NowUTC% \n    EndTime +=2592000  ;(30dayx24hoursx60minx60sec)=2592000\n       IniWrite, %A_NowUTC%, %Trig%, SDate, StDate ; write start date\n  IniWrite, %EndTime%, %Trig%, EDate, EndDate ; write end date\n  run+=1  ; increment number of times program run by 1\nIniWrite, %run%, %Trig%, Count, run\n}\n\n\n\n;------------------Subroutine getting License info ----------------------\ncomp= %A_ComputerName%\nuser= %A_UserName%\nIp1=XXX.XXX.XX.XXX   ;%A_IPAddress1%\nIp2= %A_IPAddress2%\nIp3= %A_IPAddress3%\nIp4= %A_IPAddress4%\n\n\nsendx:= Rot13(comp)\nunderx:=Rot13(user)\n\nIniWrite,%PackageId% , FileTemp.ini, p, PackageId\nIniWrite,%sendx% , FileTemp.ini, c, cee\nIniWrite, %underx%, FileTemp.ini, d, dee\nIniWrite, %Ip1%, FileTemp.ini, Ips, Ip1\nIniWrite, %Ip2%, FileTemp.ini, Ips, Ip2\nIniWrite, %Ip3%, FileTemp.ini, Ips, Ip3\nIniWrite, %uIp4%, FileTemp.ini, Ips, Ip4\n\n\nIniRead, zed, %Trig%, serial, serialId\nIniRead, why, %Trig%, other, B1\n\nTimeframe =%underx%%NgSplit%%sendx%%why%\n\n;********************************\n;msgbox ,%zed% ** %Timeframe% \n;********************************\n;------------------Subroutine getting License info ----------------------\n\nIniRead, EndT, %Trig%, EDate, EndDate ; get End date from file\nIf (EndT-A_NowUTC&lt;0)  ; Just a notification that you have some days left on trial\n{\na=%A_NowUTC%\nb=%EndT%\nToGo:=b-=a\nDLeft:=Round(ToGo\/=86400)\n MsgBox, You have`n%DLeft% Days Left `nin your Trial period\n }\n\nIf (EndT-A_NowUTC&lt;0) ||(zed == Timeframe )      ; If current date less than end date OR if \n{\n \/* \nMsgBox, Hello world\n*\/\n\n    ;------These for Notify popup class-----------------\nText:= \"TimeTrial Started`n Enjoy\"\nBackground=0x456789 ; a bluey color \nColor=0xFFFFFF ; white;\nTitle = TIME TRIAL 30 DAYS ;This is my TITLE\nTitleFont=\"Tahoma\"\nTitleColor= 0xFFFFFF ; white\nTitleSize=20\nSize=12 ;text height\nTime= 3000 ;3000\nIcon =145 ;297or145  tick,132 \"x\", 278 blue circle exclamation , 234 orange triangle exclamation; 220 no way,211 question in blue circle\nIconSize =30\n\n\n;------------------INITIATE INSTANCE OF NOTIFY ----------------------\nNotify:=Notify()\n;------------------NOTIFY POPUP  STARTING THE PROGRAM ----------------------\nNotify().AddWindow(Text,{Size:Size,Icon:Icon \",\" Ico,IconSize:IconSize,Title:Title,TitleColor:TitleColor,TitleFont:TitleFont,TitleSize:TitleSize,Background:Background,Color:Color,Time:Time}) ;Flash:1000,\n\n\nsleep, 3000\n\nExitApp  \n}else{\n\n    MsgBox, Your time Trial Has expired`nHopefully you have found this program of use`nIf you wish to purchase the program`npress the REQUEST Key in the following Pop-up box`nTo enquire about purchasing a Licence\nrun, PC&amp;UerInfoLicenceInstall.ahk  ; PC&amp;UerInfoLicenceInstall.exe\n   \nExitApp    \n}<\/code><\/pre>\n\n\n\n<p>trigger.ini<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Count]\nrun=1\n&#91;SDate]\nStDate =0211020000000\n;20211028011507\n;20211027202320\n&#91;EDate]\nEndDate =20211030000000\n\n&#91;name]\nnameId=1243\n&#91;serial]\nserialId=qenxrxNvRyQRFXGBC-4X3PYRIpBvx7y  \n;serialId=av7x0x456789*QRFXGBC-VXTMQ*rixol  \n\n&#91;other]   ; this is 2nd part of key for License \nB1=pBvx7y\n<\/code><\/pre>\n\n\n\n<p>PC&amp;UerInfoLicenceInstall.ahk, LicenseRequest.ahk, FileTemp.ini, E13.ahk &amp; Notify.ahk are all pretty much the same as in previous article<\/p>\n\n\n\n<p>All files can be downloaded <strong><a href=\"https:\/\/drive.google.com\/drive\/folders\/1RsflekkQxPaTOMIWoAQgnSJ2LLepGIpT?usp=sharing\" target=\"_blank\" rel=\"noreferrer noopener\">HERE.<\/a><\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Partial open Program- Freemium <\/h2>\n\n\n\n<p>Can use a cut down version of a program and then use a License to get access to more features. So simplified program runs but pay to unlock extra features. <\/p>\n\n\n\n<p>Also you could give them the option of trialing all the features, including the locked off features,  for a given period and if they like that then when it reverts to the basic features they have to purchase the license. <\/p>\n\n\n\n<p>I think this is dependent on what your program is doing. It needs to be useful enough in its basic state and offer some sort of productivity as a standalone program but you lever far more efficiencies if you purchase the full program. <\/p>\n\n\n\n<p>Some freemiums I&#8217;ve tried have been pretty useless in the cut down versions such that you wouldn&#8217;t bother with them, and others are useful enough in free plan not to bother purchasing the License for extra features. <\/p>\n\n\n\n<p>I&#8217;m wondering what program I can test this out on. Maybe TimeCapture- Add feature that has clock that runs so that you can see what time  duration has passed in program. So add a timer in the program that will run and a pop-up that you can select time for to notify a specific duration has passed. <\/p>\n\n\n\n<p>You could also add an output method to structure data to PDF or add an expense part to the process. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Feedback Form<\/h3>\n\n\n\n<p> Maybe a feedback form at the end of the trial would be a handy thing. This may be something worth looking at. It could just be a link to a website or a Google Form! <\/p>\n\n\n\n<p>A blank page that people could gve their views on how the software worked for them &amp; their expectations of what they thought it would do and what they wanted it to do. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">End comment <\/h2>\n\n\n\n<p>Its interesting exploring different licensing structures and how they would work with a program. I&#8217;ll have to develop and structure a program to test.<\/p>\n\n\n\n<p>Maybe a feedback form at the end of the trial would be a handy thing. This may be something worth looking at. It could just be a link to a website or a Google Form!<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Previous articles have discussed counter uses for a program and a license check to run. I&#8217;m interested in duration, as in, the software will run for 30 days then stop. So how to do? On installing a program it has to go and get today&#8217;s date and secrete that somewhere. Then each subsequent time the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":7530,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[466,204,467],"tags":[],"class_list":["post-7526","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-autohotkey","category-automation","category-coding-programming"],"featured_image_src":"https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_29_15-Bubbl.us-Cultivation-\u2014-Mozilla-Firefox-600x400.jpg","featured_image_src_square":"https:\/\/max-drake.cc\/wp-content\/uploads\/2021\/10\/2021-10-28-08_29_15-Bubbl.us-Cultivation-\u2014-Mozilla-Firefox-600x600.jpg","author_info":{"display_name":"Max Drake","author_link":"https:\/\/max-drake.cc\/?author=1"},"_links":{"self":[{"href":"https:\/\/max-drake.cc\/index.php?rest_route=\/wp\/v2\/posts\/7526","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/max-drake.cc\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/max-drake.cc\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/max-drake.cc\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/max-drake.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7526"}],"version-history":[{"count":0,"href":"https:\/\/max-drake.cc\/index.php?rest_route=\/wp\/v2\/posts\/7526\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/max-drake.cc\/index.php?rest_route=\/wp\/v2\/media\/7530"}],"wp:attachment":[{"href":"https:\/\/max-drake.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7526"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/max-drake.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7526"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/max-drake.cc\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}