-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
1 lines (1 loc) · 197 KB
/
app.js
File metadata and controls
1 lines (1 loc) · 197 KB
1
!function(e){function t(t){for(var n,s,a=t[0],l=t[1],c=t[2],p=0,d=[];p<a.length;p++)s=a[p],Object.prototype.hasOwnProperty.call(o,s)&&o[s]&&d.push(o[s][0]),o[s]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&&(e[n]=l[n]);for(u&&u(t);d.length;)d.shift()();return i.push.apply(i,c||[]),r()}function r(){for(var e,t=0;t<i.length;t++){for(var r=i[t],n=!0,a=1;a<r.length;a++){var l=r[a];0!==o[l]&&(n=!1)}n&&(i.splice(t--,1),e=s(s.s=r[0]))}return e}var n={},o={0:0},i=[];function s(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,s),r.l=!0,r.exports}s.m=e,s.c=n,s.d=function(e,t,r){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(s.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)s.d(r,n,function(t){return e[t]}.bind(null,n));return r},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="";var a=window.webpackJsonp=window.webpackJsonp||[],l=a.push.bind(a);a.push=t,a=a.slice();for(var c=0;c<a.length;c++)t(a[c]);var u=l;i.push([108,2]),r()}([,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(68);t.Template=n.Template,t.Plural=n.Plural,t.$T={common:{appTitle:"Logo playground",save:"Save",cancel:"Cancel",delete:"Delete",continue:"Continue",areYouSure:"Are you sure?",copied:"Copied",copyToClipboard:"Copy to clipboard",signIn:"Sign in",signInWithGoogle:"Sign in with Google",signOut:"Sign out",error:"Sorry, error has occured"},program:{codePanelTitle:"Program box",outputPanelTitle:"Drawing box",program:"Program",programName:"Program name",publicUrl:"Public url",revertChanges:"Revert changes",run:"Run",runDescription:"Execute the program",stop:"Stop",stopDescription:"Stop execution of the program",save:"Save",saveAs:"Save as...",saveToLibraryModalTitle:"Save to personal library",takeScreenshot:"Take screenshot",screenshotModalTitle:"Screenshot",share:"Share",shareYourProgramModalTitle:"Share your program",playgroundTitle:"Playground",programHasChanges:"This program has changes",youAreGoingToDeleteProgram:"You are going to delete this program.",imagePreview:"Image preview",imageUrl:"Image url",pleaseEnterNameForYourProgram:"Please enter the name for your program",formatDocument:"Format code",programSavedToLibrarySuccess:"Your program was saved to personal library successfully"},gallery:{galleryTitle:"Gallery",galleryImage:"Gallery image",personalLibrary:"Personal",samplesGallery:"Gallery",samplesElements:"Elements",emptyLibrary:"You do not have any programs stored in your personal library yet.",import:"Import",export:"Export",importCompletedTitle:"Import completed",addedProgramsMessage:new n.Plural("Added one program","Added %d programs"),wrongFileFormatForImport:"Looks like import file is corrupted or this format is not supported.",importModalTitle:"Import programs to library",chooseAFile:"Choose a file…",notLoggedInGalleryMessage:"As you are not signed in, your personal library is stored in your browser's local storage. Please sign in if you want to synchronize your library."},tutorial:{tutorialsTitle:"Tutorials",tutorialPanelTitle:"Tutorial",chooseTutorial:"Choose a tutorial",chooseAnotherTutorial:"Choose another tutorial",stepIndicator:new n.Template("Step %1$s of %2$s",2),start:"Start",back:"Back",helpItsNotworking:"Help – it's not working!",fixTheCodeMessage:"If your code isn't working as the tutorial describes, you can replace it with a working version.",fixTheCodeWarning:"This will overwrite your code entirely.",fixTheCodeTitle:"Fix the code?",yesFixMyCode:"Yes, fix my code",noLeaveItAsIs:"No, leave it as is",tutorialsLevel0:"Beginner",tutorialsLevel1:"Advanced"},about:{aboutTitle:"About"},settings:{settingsTitle:"Settings",language:"Language",uiTheme:"User interface theme",turtleSkin:"Turtle outfit",turtleSkins:{bob:"Chilly Bob",summer:"Summer",bright_runner:"Bright Runner",diver:"Deep Diver",chameleon:"Chameleon",princess:"Princess"},turtleSize:"Turtle size",turtleSizes:{extraSmall:"Extra small",small:"Small",medium:"Medium",large:"Large",huge:"Huge"}},cheatSheet:{cheatSheetTitle:"Cheat sheet"},login:{title:"Sign in",notLoggedInSignInMessage:"Signing in allows to save your program library to your account. So you can synchronize your library across multiple devices and access your data from everywhere."},welcome:{title:"Welcome",galleryLinkHeader:"Explore the gallery",galleryLinkDescription:"The gallery provides lots of examples of different levels of complexity. Gain inspiration and unleash power of your creativity.",tutorialsLinkHeader:"Learn the basics with tutorials",tutorialsLinkDescription:"Tutorials are the best way to learn fast and have fun. If you are new to LOGO programming this section is for you.",playgroundLinkHeader:"Playground for coding",playgroundLinkDescription:"This is a coding area where you can write and run your LOGO programs interactively."}}},,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});let n=[];function o(e,t){const r=n.findIndex(t=>t.key===e);r>=0?n[r].value=t:n.push({key:e,value:t})}t.resetBindings=function(){n=[]},t.register=o,t.registerMockService=function(e,t){o(e,t)},t.resolve=function(e){const t=n.find(t=>t.key===e);if(!t)throw new Error("Missed registration for service: "+e.name);return t.value}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.userLogin="actions.login",e.userLogout="actions.logout",e.tutorialsNavigation="actions.tutorialsNavigation",e.tutorialsFixTheCode="actions.tutorialsFixTheCode",e.shareScreenshot="actions.shareScreenshot",e.shareProgram="actions.shareProgram",e.saveProgramToPersonalLibrary="actions.saveProgram",e.revertProgramChanges="actions.revertProgram",e.openPlayground="navigation.openPlayground",e.openProgramFromLibrary="navigation.openProgramFromLibrary",e.openProgramFromSample="navigation.openProgramFromSample",e.openProgramFromShare="navigation.openProgramFromShare",e.openGallery="navigation.openGallery",e.openSettings="navigation.openSettings",e.openAbout="navigation.openAbout",e.openCheatsheet="navigation.openCheatsheet",e.openTutorials="navigation.openTutorials"}(t.EventAction||(t.EventAction={}));t.EventsTrackingService=class{constructor(){this.trackers=[]}sendEvent(e,t){const[r,n]=e.split(".");if(!r||!n)throw new Error("Event action ID is not valid - should be in 'CATEGORY.ACTION' format");for(const e of this.trackers)e({category:r,action:n,data:t})}addTracker(e){this.trackers.push(e)}}},,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.samples="samples",e.gallery="gallery",e.shared="shared",e.playground="playground"}(t.ProgramStorageType||(t.ProgramStorageType={})),t.createNewProgram=function(e){return{id:"",storageType:e.storageType,name:e.name||"",code:e.code||"",screenshot:e.screenshot||"",dateCreated:new Date,dateLastEdited:new Date}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.localStoragePrefix="logo-playground-v1.0:",t.DEFAULT_LOCALE_ID="en"},,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(10),i=r(14),s=r(13);r(215);class a extends n.Component{constructor(e){super(e),this.isComponentMounted=!1,this.executeAction=async()=>{if(!this.props.onConfirm)return;this.setState({isActionInProgress:!0}),await s.callActionSafe(e=>{this.setState({isActionInProgress:!1,errorMessage:e.message})},async()=>(await this.props.onConfirm(),!0))&&this.isComponentMounted&&this.setState({isActionInProgress:!1,errorMessage:""})},this.state={errorMessage:"",isActionInProgress:!1}}componentDidMount(){this.isComponentMounted=!0}componentWillUnmount(){this.isComponentMounted=!1}render(){const e=this.props.title||"Are you sure?",t=this.props.actionButtonText||"Delete",r=this.props.cancelButtonText||"Cancel";return n.createElement("div",{className:o("modal modal-component",{" is-active":this.props.show})},n.createElement("div",{className:"modal-background",onClick:this.props.onCancel}),n.createElement("div",{className:o("modal-card",{"is-medium":"medium"===this.props.width,"is-wide":"wide"===this.props.width})},n.createElement("header",{className:"modal-card-head"},n.createElement("p",{className:"modal-card-title"},e),n.createElement("button",{className:"delete","aria-label":"close",onClick:this.props.onCancel})),n.createElement("section",{className:o("modal-card-body")},this.props.children,this.state.errorMessage&&n.createElement(i.AlertMessage,{message:this.state.errorMessage,type:"danger"})),!this.props.withoutFooter&&n.createElement("footer",{className:"modal-card-foot"},this.props.onConfirm&&n.createElement("button",{className:o("button is-primary",{"is-loading":this.state.isActionInProgress}),onClick:this.executeAction},t),n.createElement("button",{className:"button",onClick:()=>{this.state.isActionInProgress||this.props.onCancel()}},r))))}}t.Modal=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});function n(e,t,r){const n=new Error(r);return n.isResponse=!0,n.name=e,n.httpStatusCode=t,n}async function o(e){if(!e)return new Error;if(e instanceof Error)return e.message&&e.message.indexOf("Failed to fetch")>=0?new Error("Unable to connect to server. Please contact your administrator."):e;if(e instanceof Response){let t,r="";try{r=await e.text()}catch(t){return n("Server error",e.status,"Error details are not available")}if(!r)return n("Server error",e.status,"Error details are not available");try{t=JSON.parse(r)}catch(t){return n("Server error",e.status,"Error details: "+r)}return n("Server error",e.status,t.error||t.message||t.errorMessage||"Error details are not available")}return new Error("Error: "+JSON.stringify(e,void 0,4))}t.normalizeError=o,t.callActionSafe=async function(e,t){try{return await t()}catch(t){return console.error(t),void e(await o(t))}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0);r(118),t.AlertMessage=function(e){const t=e.type||"danger";let r=e.message||"",o=e.title;if(!r&&!o)return n.createElement(n.Fragment,null);const i="string"==typeof r&&!e.doNotDetectPreformatted&&(r.includes("<")||r.includes("{")||r.includes("["));return"danger"===t&&!o&&r&&r.toString().startsWith("Error: ")&&(o="Error",r=r.toString().substr(7)),n.createElement("div",{className:"alert-message-component"},n.createElement("article",{className:"message is-"+t},n.createElement("div",{className:"message-body"},o&&n.createElement("p",{className:"subtitle"},o),r&&(i?n.createElement("pre",null,r):n.createElement("p",null,r)))))}},,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0);r(157),t.Loading=function(e){if(!e.isLoading)return n.createElement(n.Fragment,null);const t=()=>n.createElement("div",{className:"ex-loading-indicator"},n.createElement("logo-animation"));return e.fullPage?n.createElement("div",{className:"ex-loading-indicator-fullpage"},t()):t()}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(40);var o;!function(e){e.INIT_ENV_STARTED="INIT_ENV_STARTED",e.SIGN_IN_COMPLETED="SIGN_IN_COMPLETED",e.SIGN_OUT_COMPLETED="SIGN_OUT_COMPLETED",e.APPLY_USER_SETTINGS_COMPLETED="APPLY_USER_SETTINGS_COMPLETED",e.ERROR="ERROR",e.SHOW_NOTIFICATION="SHOW_NOTIFICATION",e.CLOSE_NOTIFICATION="CLOSE_NOTIFICATION"}(o=t.EnvActionType||(t.EnvActionType={})),t.envActionCreator={initEnvStarted:()=>n.action(o.INIT_ENV_STARTED),signInCompleted:e=>n.action(o.SIGN_IN_COMPLETED,e),applyUserSettingsCompleted:e=>n.action(o.APPLY_USER_SETTINGS_COMPLETED,e),handleError:e=>n.action(o.ERROR,{errDef:e}),showNotification:(e,t,r)=>n.action(o.SHOW_NOTIFICATION,{type:e,title:t,message:r}),closeNotification:e=>n.action(o.CLOSE_NOTIFICATION,{id:e})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(123);class o{}t.Routes=o,o.loginPage=new n.RouteInfo("/login"),o.infoPage=new n.RouteInfo("/info"),o.settings=new n.RouteInfo("/settings"),o.gallery=new n.RouteInfo("/gallery"),o.playgroundDefault=new n.RouteInfo("/code"),o.playground=new n.RouteInfo("/code/:storageType/:id"),o.tutorials=new n.RouteInfo("/tutorials")},,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(11),o=r(158),i=r(18),s=r(22);t.MainMenuContainer=n.connect(e=>({isLoggedIn:e.env.user.isLoggedIn,userImageUrl:e.env.user.imageUrl}),{onLogout:s.envThunks.signOut,onError:i.envActionCreator.handleError})(o.MainMenu)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(18),o=r(217),i=r(218),s=r(5),a=r(31),l=r(86),c=r(6);t.envThunks={initEnv:function(){return async(e,t)=>{e(n.envActionCreator.initEnvStarted());const r=o.getConfig(),s=await i.DISetup.setup({appConfig:r});e(n.envActionCreator.applyUserSettingsCompleted(s.userSettings)),e(n.envActionCreator.signInCompleted(s.user))}},signIn:function(e){return async(r,n)=>{const o=s.resolve(a.AuthService);await o.signIn(e),r(t.envThunks.initEnv()),s.resolve(c.EventsTrackingService).sendEvent(c.EventAction.userLogin)}},signOut:function(){return async(e,r)=>{const n=s.resolve(a.AuthService);await n.signOut(),e(t.envThunks.initEnv()),s.resolve(c.EventsTrackingService).sendEvent(c.EventAction.userLogout)}},applyUserSettings:function(e,r){return async(o,i)=>{const a=s.resolve(l.UserSettingsService);if(await a.update(e),r&&r.rebindServices)o(t.envThunks.initEnv());else{const e=await a.get();o(n.envActionCreator.applyUserSettingsCompleted(e))}}},showNotificationAutoClose:function(e,t,r){return async(o,i)=>{o(n.envActionCreator.showNotification(e,t,r));const s=i().env.notifications[0].id;setTimeout(()=>{o(n.envActionCreator.closeNotification(s))},3e3)}}}},,,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.debounce=function(e,t=50,r={isImmediate:!1}){let n;return function(...o){const i=this,s=r.isImmediate&&void 0===n;void 0!==n&&clearTimeout(n),n=setTimeout((function(){n=void 0,r.isImmediate||e.apply(i,o)}),t),s&&e.apply(i,o)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.LocalStorage=class{constructor(e,t){this.storageKey=e,this.defaultValue=t}getValue(){if("undefined"==typeof window)return this.defaultValue;const e=window.localStorage.getItem(this.storageKey);return e&&""!=e?JSON.parse(e):this.defaultValue}setValue(e){"undefined"!=typeof window&&(void 0===e?window.localStorage.removeItem(this.storageKey):window.localStorage.setItem(this.storageKey,JSON.stringify(e)))}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});class n{static getRandomInt(e,t){return Math.round(Math.random()*(t-e)+e)}static getRandomObjectId(e=10){let t="";for(let r=0;r<e;++r)t+="0123456789abcdef"[n.getRandomInt(0,"0123456789abcdef".length-1)];return t}static getRandomWord(e=6,t){t=t||e;const r="qrtpsdfghklzxcvbnm",o=n.getRandomInt(e,t);let i="";const s=n.getRandomInt(0,1);for(let e=0;e<o;++e)i+=e%2==s?"awoeuyijo"[n.getRandomInt(0,"awoeuyijo".length-1)]:r[n.getRandomInt(0,r.length-1)];return i}static getRandomPhrase(e=3,t){t=t||e;const r=[],o=n.getRandomInt(e,t);for(let e=0;e<o;++e)r.push(n.getRandomWord(4,7));return r.join(" ")}}t.RandomHelper=n},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(29),o=r(229),i=r(9);var s;!function(e){e.google="google",e.none="none"}(s=t.AuthProvider||(t.AuthProvider={}));const a={isLoggedIn:!1,authProvider:s.none};t.anonymousUser={isLoggedIn:!1,authProvider:s.none,id:"",name:"",email:"",imageUrl:""};t.AuthService=class{constructor(e){this.config=e,this.localStorage=new n.LocalStorage(i.localStoragePrefix+"login-status",a)}async init(){const e=this.localStorage.getValue();if(e.isLoggedIn)switch(e.authProvider){case s.google:const e=new o.GoogleAuthService(this.config.services.googleClientId),t=await e.init();if(t)return this.getUserData(t)}return t.anonymousUser}async signIn(e){if(e===s.google){const e=new o.GoogleAuthService(this.config.services.googleClientId),t=await e.signIn();if(t)return this.localStorage.setValue({isLoggedIn:!0,authProvider:s.google}),this.getUserData(t)}return this.localStorage.setValue({isLoggedIn:!1,authProvider:s.none}),t.anonymousUser}async signOut(){const e=this.localStorage.getValue();if(e.isLoggedIn)switch(e.authProvider){case s.google:const e=new o.GoogleAuthService(this.config.services.googleClientId);await e.signOut()}this.localStorage.setValue({isLoggedIn:!1,authProvider:s.none})}getUserData(e){return{isLoggedIn:!0,id:e.id,name:e.name,email:e.email,imageUrl:e.imageUrl,authProvider:s.google}}}},,,,,,function(e,t,r){"use strict";var n;Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.PersonalLibrary="library",e.ExamplesAdvanced="examples",e.ExamplesBasic="shapes"}(n=t.GallerySection||(t.GallerySection={})),t.defaultGalleryState={activeSection:n.ExamplesAdvanced,isLoading:!0,programs:[],showImportModal:!1,isImportInProgress:!1}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8),o=r(48),i=r(3),s={};t.ProgramsHtmlSerializer=class{constructor(e){this.window=e}parse(e){const t=[],r=e.indexOf("<body"),o=e.indexOf("</html>");if(r<0||o<0)throw new Error(i.$T.gallery.wrongFileFormatForImport);const s=e.substring(r,o),a=(new this.window.DOMParser).parseFromString(s,"application/xml").querySelectorAll(".logo-program");for(let e=0;e<a.length;++e){const r=a.item(e),o=r.querySelector("img"),i=o&&o.getAttribute("src")||"",s=r.querySelector("pre"),l=s&&s.textContent||"",c={id:r.getAttribute("data-program-id")||"",name:r.getAttribute("data-program-name")||"",dateCreated:new Date(r.getAttribute("data-program-date-created")||""),dateLastEdited:new Date(r.getAttribute("data-program-date-edited")||""),code:l,screenshot:i,storageType:n.ProgramStorageType.gallery};t.push(c)}return t}async serialize(e,t,r){const n=o.createCompareFunction([{sortBy:e=>e.dateLastEdited,direction:"desc"},{sortBy:e=>e.name}]),i=[...e].sort(n),a=s[r]||(s[r]=await this.getImageBase64ByUrl(r)),l=this.window.document.createElement("body"),c=this.window.document.createElement("header");l.appendChild(c);const u=this.window.document.createElement("h1");u.innerText="Logo personal library",c.appendChild(u);const p=this.window.document.createElement("h3");if(p.innerText=t,c.appendChild(p),a){const e=this.window.document.createElement("img");e.setAttribute("src",a),c.appendChild(e)}const d=this.window.document.createElement("table");l.appendChild(d);const h=this.window.document.createElement("tbody");d.appendChild(h);const m=i.map(e=>this.serializeProgramToHtmlNode(e));for(const e of m)h.appendChild(e);return'<!DOCTYPE html><html><head>\n <title>Logo personal library</title>\n <meta charset="UTF-8">\n <meta name="viewport" content="width=device-width, initial-scale=1">\n <meta http-equiv="X-UA-Compatible" content="IE=edge">\n <style> \n body {\n margin: 20px 100px;\n font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;\n font-weight: 300;\n }\n\n header {\n padding: 10px;\n border-bottom: 1px solid gray;\n }\n\n td {\n vertical-align: top;\n padding: 10px;\n }\n\n pre {\n background-color: #eee;\n padding: 20px;\n }\n </style>\n</head>\n'+(new this.window.XMLSerializer).serializeToString(l)+"</html>"}serializeProgramToHtmlNode(e){const t=this.window.document.createElement("tr");t.className="logo-program",t.setAttribute("data-program-id",e.id),t.setAttribute("data-program-name",e.name),t.setAttribute("data-program-date-created",e.dateCreated.toUTCString()),t.setAttribute("data-program-date-edited",e.dateLastEdited.toUTCString());const r=this.window.document.createElement("td");t.appendChild(r);const n=this.window.document.createElement("strong");n.innerText=e.name,r.appendChild(n),r.appendChild(this.window.document.createElement("br"));const o=this.window.document.createElement("small");if(o.innerText=e.dateLastEdited.toLocaleDateString(),r.appendChild(o),r.appendChild(this.window.document.createElement("br")),r.appendChild(this.window.document.createElement("br")),e.screenshot){const t=this.window.document.createElement("img");t.setAttribute("src",e.screenshot),r.appendChild(t)}const i=this.window.document.createElement("td");t.appendChild(i);const s=this.window.document.createElement("pre");return s.appendChild(this.window.document.createTextNode(e.code)),i.appendChild(s),t.appendChild(i),t}async getImageBase64ByUrl(e){return e?new Promise((t,r)=>{const n=this.window.document.createElement("img");n.addEventListener("load",()=>{try{const e=this.window.document.createElement("canvas");e.width=64,e.height=64;const r=e.getContext("2d");if(!r)return void t("");r.drawImage(n,0,0,64,64);const o=e.toDataURL("image/jpeg",.75);t(o)}catch(e){t("")}}),n.addEventListener("error",()=>{t("")}),n.setAttribute("crossOrigin","Anonymous"),n.setAttribute("src",e)}):""}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.checkIsMobileDevice=function(){return!(!window.matchMedia||!window.matchMedia("only screen and (max-width: 760px)").matches)}},,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(40);var o;!function(e){e.LOAD_SECTION_STARTED="LOAD_SECTION_STARTED",e.LOAD_SECTION_COMPLETED="LOAD_SECTION_COMPLETED",e.TOGGLE_IMPORT_MODAL="TOGGLE_IMPORT_MODAL",e.IMPORT_STARTED="IMPORT_STARTED",e.IMPORT_COMPLETED="IMPORT_COMPLETED"}(o=t.GalleryActionType||(t.GalleryActionType={})),t.galleryActionCreator={loadSectionStarted:e=>n.action(o.LOAD_SECTION_STARTED,{section:e}),loadSectionCompleted:(e,t)=>n.action(o.LOAD_SECTION_COMPLETED,{section:e,programs:t}),toggleImportModal:e=>n.action(o.TOGGLE_IMPORT_MODAL,{show:e}),importStarted:()=>n.action(o.IMPORT_STARTED),importCompleted:(e,t)=>n.action(o.IMPORT_COMPLETED,{success:e,errorMessage:t})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(57),o=r(31);!function(e){e.danger="danger",e.info="info",e.success="success",e.warning="warning",e.primary="primary"}(t.NotificationType||(t.NotificationType={})),t.defaultEnvState={isLoading:!0,user:o.anonymousUser,userSettings:n.defaultUserSettings,appTheme:{},notifications:[]}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0);r(238);const o=r(239),i=r(240),s=r(243),a=r(39),l=r(14),c=r(244);r(245);let u=0;class p extends n.Component{constructor(e){super(e),this.id=u++,this.createScreenshotBase64=e=>{if(this.graphics){return this.graphics.createScreenshot(e)}return""},this.execute=async()=>{this.isRunning=!0,this.setState({errorMessage:""});const e="cs cleartext "+(a.checkIsMobileDevice()?"setscrunch 0.7 0.7 ":" ")+(this.props.isDarkTheme?"setbg 0 setpencolor 7 ":"setbg 7 setpencolor 0 ");this.resizeCanvas();const t=window.LogoInterpreter;this.logo=new t(this.graphics.init(this.props.turtleSize),new s.LogoOutputConsole("#console-output"+this.id));let r=this.props.code.replace(/\u00A0/g," ");this.props.importsResolver&&(r=await c.processImports(r,async e=>this.props.importsResolver?this.props.importsResolver.resolve(e):""));try{await this.logo.run(o.default+"\r\n"+e+"\r\n"+r)}catch(e){console.error("error",e),this.setState({errorMessage:e.message||e.toString()})}this.props.onFinish(),this.isRunning=!1},this.abort=()=>{this.logo&&this.isRunning&&this.logo.bye(),this.isRunning=!1},this.state={errorMessage:""}}async componentDidMount(){this.graphics=new i.LogoOutputGraphics("#sandbox"+this.id,"#turtle"+this.id),this.props.isRunning&&await this.execute()}componentWillUnmount(){this.abort()}async componentDidUpdate(){this.isRunning!=this.props.isRunning&&(this.props.isRunning?await this.execute():this.abort())}render(){return n.createElement("div",{id:`logo-executor-container${this.id}`,className:"logo-executor-container"},n.createElement("canvas",{id:`sandbox${this.id}`,className:"sandbox",height:"100"}),n.createElement("img",{id:`turtle${this.id}`,className:"turtle-img",src:this.props.turtleImageSrc}),n.createElement("div",{id:`console-output${this.id}`,className:"console-output"}),n.createElement("div",{id:`error-messages-container${this.id}`,className:"error-messages-container"},this.state.errorMessage&&n.createElement(l.AlertMessage,{message:this.state.errorMessage})))}resizeCanvas(){if(!this.graphics)return;const e=document.getElementById("logo-executor-container"+this.id);if(!e)return;const t=e.clientWidth,r=e.clientHeight;if(t>0&&r>0)this.graphics.resizeCanvas(t,r);else{let t=e;for(;t&&!(t.clientWidth>0&&t.clientHeight>0);)t=t.parentElement;t&&this.graphics.resizeCanvas(t.clientWidth||400,t.clientHeight||300)}}}t.LogoExecutor=p},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(3);function o(){return[{id:"bright_runner",name:n.$T.settings.turtleSkins.bright_runner,imageSrc:"./content/images/turtles/bright_runner.svg"},{id:"chameleon",name:n.$T.settings.turtleSkins.chameleon,imageSrc:"./content/images/turtles/chameleon.svg"},{id:"princess",name:n.$T.settings.turtleSkins.princess,imageSrc:"./content/images/turtles/princess.svg"},{id:"bob",name:n.$T.settings.turtleSkins.bob,imageSrc:"./content/images/turtles/bob.svg"},{id:"summer",name:n.$T.settings.turtleSkins.summer,imageSrc:"./content/images/turtles/summer.svg"},{id:"diver",name:n.$T.settings.turtleSkins.diver,imageSrc:"./content/images/turtles/diver.svg"},{id:"navigator-aqua",name:"Navigator Aqua",imageSrc:"./content/images/turtles/navigator-aqua.svg"},{id:"navigator-stealth",name:"Navigator Stealth",imageSrc:"./content/images/turtles/navigator-stealth.svg"}]}t.getTurtles=o,t.getTurtleSizes=function(){return[{size:20,description:n.$T.settings.turtleSizes.extraSmall},{size:32,description:n.$T.settings.turtleSizes.small},{size:40,description:n.$T.settings.turtleSizes.medium},{size:52,description:n.$T.settings.turtleSizes.large},{size:72,description:n.$T.settings.turtleSizes.huge}]},t.getTurtleById=function(e){const t=o();let r=t.find(t=>t.id===e);return r||(r=t[0]),r}},,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ensure=function(e){if(null!=e)return e;try{throw new Error("Validation failed: value must not be null")}catch(e){throw console.error(e),e}},t.NULL=null,t.createCompareFunction=function(e){return function(t,r){for(const n of e){let e=n.sortBy(t);e=null==e?"":e,e="string"==typeof e?e.toLowerCase():e,"object"==typeof e&&"function"==typeof e.getTime&&(e=e.getTime());let o=n.sortBy(r);if(o=null==o?"":o,o="string"==typeof o?o.toLowerCase():o,"object"==typeof o&&"function"==typeof o.getTime&&(o=o.getTime()),e!=o)return"desc"==n.direction?o<e?-1:1:o<e?1:-1}return 0}}},,,,,,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(9);t.defaultUserSettings={turtleId:"",turtleSize:40,themeName:"",localeId:n.DEFAULT_LOCALE_ID},t.locales=[{name:"English",id:n.DEFAULT_LOCALE_ID},{name:"Русский",id:"ru"}]},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.GalleryService=class{constructor(e,t){this.localProgramsRepository=e,this.remoteProgramsRepository=t}async getAll(){if(this.remoteProgramsRepository){const e=await this.remoteProgramsRepository.getAll();return this.localProgramsRepository.overwrite(e),e}return this.localProgramsRepository.getAll()}getAllLocal(){return this.localProgramsRepository.getAll()}async get(e){return this.remoteProgramsRepository?this.remoteProgramsRepository.get(e):this.localProgramsRepository.get(e)}async add(e){this.localProgramsRepository.add(e),this.remoteProgramsRepository&&await this.remoteProgramsRepository.add(e)}async save(e){this.localProgramsRepository.save(e),this.remoteProgramsRepository&&await this.remoteProgramsRepository.save(e)}async remove(e){this.localProgramsRepository.remove(e),this.remoteProgramsRepository&&await this.remoteProgramsRepository.remove(e)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8);t.ProgramService=class{constructor(e,t,r,o){this.examplesRepository=e,this.personalGalleryService=t,this.localTempStorage=r,this.sharedProgramsRepository=o,this.loadProgram=async(e,t)=>{if(t&&e!=n.ProgramStorageType.playground)return this.loadProgramFromStorage(e,t);return n.createNewProgram({storageType:n.ProgramStorageType.playground,code:this.localTempStorage.getCode()})},this.saveProgramToLibrary=async e=>{if(!e.newProgramName||!e.newProgramName.trim())throw new Error("Program name is required.");const t=await this.personalGalleryService.getAll()||[];if(e.id){const r=t.find(t=>t.id===e.id);if(!r)throw new Error("Program with id is not found: "+e.id);return r.screenshot=e.newScreenshot,r.code=e.newCode,r.name=e.newProgramName,await this.personalGalleryService.save(r),r}{if(t.find(t=>t.name.trim().toLowerCase()===e.newProgramName.trim().toLowerCase()))throw new Error("Program with this name is already stored in library. Please enter different name.");const r=n.createNewProgram({storageType:n.ProgramStorageType.gallery,name:e.newProgramName,code:e.newCode,screenshot:e.newScreenshot});return await this.personalGalleryService.add([r]),r}}}async loadProgramFromStorage(e,t){let r;switch(e){case n.ProgramStorageType.samples:r=await this.examplesRepository.get(t),r.storageType=n.ProgramStorageType.samples;break;case n.ProgramStorageType.gallery:r=await this.personalGalleryService.get(t),r.storageType=n.ProgramStorageType.gallery;break;case n.ProgramStorageType.shared:r=await this.sharedProgramsRepository.get(t),r.storageType=n.ProgramStorageType.shared}if(!r)throw new Error("Could not load the program");return r}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.themesManager=themesManagerGlobalInstance},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(40);var o;!function(e){e.LOAD_PROGRAM_STARTED="LOAD_PROGRAM_STARTED",e.LOAD_PROGRAM_COMPLETED="LOAD_PROGRAM_COMPLETED",e.CODE_CHANGED="CODE_CHANGED",e.RUN_PROGRAM="RUN_PROGRAM",e.STOP_PROGRAM="STOP_PROGRAM",e.SYNC_PROGRAM_STARTED="SYNC_PROGRAM_STARTED",e.SYNC_PROGRAM_COMPLETED="SYNC_PROGRAM_COMPLETED",e.SYNC_PROGRAM_FAILED="SYNC_PROGRAM_FAILED",e.RESET_STATE="CLEAR_PROGRAM",e.REVERT_CHANGES="REVERT_CHANGES"}(o=t.PlaygroundActionType||(t.PlaygroundActionType={})),t.playgroundActionCreator={loadProgramStarted:(e,t)=>n.action(o.LOAD_PROGRAM_STARTED,{storageType:e,programId:t}),loadProgramCompleted:(e,t,r)=>n.action(o.LOAD_PROGRAM_COMPLETED,{programModel:e,storageType:t,programId:r}),codeChangedAction:e=>n.action(o.CODE_CHANGED,{code:e}),runProgram:()=>n.action(o.RUN_PROGRAM),stopProgram:()=>n.action(o.STOP_PROGRAM),syncProgramStarted:()=>n.action(o.SYNC_PROGRAM_STARTED),syncProgramCompleted:e=>n.action(o.SYNC_PROGRAM_COMPLETED,e),syncProgramFailed:()=>n.action(o.SYNC_PROGRAM_FAILED),clearProgram:()=>n.action(o.RESET_STATE)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(97);class i extends n.Component{componentDidUpdate(e){this.props.title!=e.title&&this.layoutHelper&&this.layoutHelper.setPanelTitle(this.props.id,this.props.title)}render(){return n.createElement(o.ReactGoldenLayoutHelperContext.Consumer,null,e=>(this.layoutHelper=e,this.props.children))}}t.ReactGoldenLayoutPanel=i},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(40);var o;!function(e){e.LOAD_TUTORIALS_STARTED="LOAD_TUTORIALS_STARTED",e.LOAD_TUTORIALS_COMPLETED="LOAD_TUTORIALS_COMPLETED",e.LOAD_STEP_STARTED="LOAD_STEP_STARTED",e.LOAD_STEP_COMPLETED="LOAD_STEP_COMPLETED",e.CODE_CHANGED="TUTORIALS_CODE_CHANGED",e.RUN_PROGRAM="TUTORIALS_RUN_PROGRAM",e.STOP_PROGRAM="TUTORIALS_STOP_PROGRAM",e.FIX_THE_CODE="FIX_THE_CODE"}(o=t.TutorialsActionType||(t.TutorialsActionType={})),t.tutorialsActionCreator={loadTutorialsStarted:()=>n.action(o.LOAD_TUTORIALS_STARTED),loadTutorialsCompleted:e=>n.action(o.LOAD_TUTORIALS_COMPLETED,{tutorials:e}),loadStepStarted:(e,t)=>n.action(o.LOAD_STEP_STARTED,{tutorialId:e,stepId:t}),loadStepCompleted:(e,t,r,i,s)=>n.action(o.LOAD_STEP_COMPLETED,{tutorialId:e,stepId:t,tutorialInfo:r,stepInfo:i,content:s}),codeChanged:e=>n.action(o.CODE_CHANGED,{code:e}),runProgram:()=>n.action(o.RUN_PROGRAM),stopProgram:()=>n.action(o.STOP_PROGRAM),fixTheCode:()=>n.action(o.FIX_THE_CODE)}},,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(127),o=r(128);let i;class s{constructor(e,t){this._forms=[e,t]}val(e){if(i)return i.translate(this._messageKey).ifPlural(e,"").fetch(e);throw new Error("Locale data is not initialized yet")}}t.Plural=s;class a{constructor(e,t){this.numberOfParameters=t,this._template=e}val(...e){if(e.length!=this.numberOfParameters)throw new Error("Number of parameters to template string is wrong!");if(i)return i.translate(this._messageKey).fetch(...e);throw new Error("Locale data is not initialized yet")}}t.Template=a,t.updateStringsObject=function(e,t){const r=o(t,{format:"jed1.x"});i=new n(r),function e(t,r){for(const[n,o]of Object.entries(t)){const l=r?r+"."+n:n;if("string"==typeof o){const e=i.translate(l).fetch();e!==l&&(t[n]=e)}else o instanceof s||o instanceof a?o._messageKey=l:"object"==typeof o&&e(o,l)}}(e,"")}},,,,,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0);t.InfoBox=function(e){return n.createElement("div",{className:"box",style:{maxWidth:500}},n.createElement("div",{className:"media"},n.createElement("div",{className:"media-left"},n.createElement("span",{className:"icon is-large"},n.createElement("i",{className:"fa-3x "+(e.iconClass||"fas fa-info")}))),n.createElement("div",{className:"media-content"},n.createElement("div",{className:"content"},"string"==typeof e.content?n.createElement("p",null,e.content):n.createElement(n.Fragment,null,e.content)))))}},,,,,,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(9);t.LocalizedContentLoader=class{constructor(e){this.localeId=e,this.cache={}}async loadFile(e,t){try{return await this.loadContentByLocale(e,t.useLocale?this.localeId:n.DEFAULT_LOCALE_ID)}catch(t){return console.log("Failed to load localized version, falling back to English"),this.loadContentByLocale(e,n.DEFAULT_LOCALE_ID)}}getCurrentLocaleId(){return this.localeId}async loadContentByLocale(e,t){if(t&&t!==n.DEFAULT_LOCALE_ID){const r=e.split(".");r.splice(r.length-1,0,t),e=r.join(".")}const r=this.cache[e];if(r)return r;const o=await fetch(e,{method:"get",credentials:"same-origin"});if(!o.ok)throw o;const i=await o.text();return this.cache[e]=i,i}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(29),o=r(57),i=r(9);t.UserSettingsService=class{constructor(e){const t=i.localStoragePrefix+`settings:${e||"guest"}`;this.localStorage=new n.LocalStorage(t,o.defaultUserSettings);const r=this.localStorage.getValue();this.currentData=r}async get(){return this.currentData}async update(e){return this.currentData={...this.currentData,...e},this.localStorage.setValue(this.currentData)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(28),o=r(9),i=r(29);t.LocalPlaygroundCodeStorage=class{constructor(e){this.writeToStorage=n.debounce(e=>{this.localStorage.setValue(e||"")},500);const t=o.localStoragePrefix+"playground-code:"+(e||"guest");this.localStorage=new i.LocalStorage(t,"")}getCode(){return this.localStorage.getValue()||""}setCode(e){this.writeToStorage(e)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(53),o=r(9),i=r(29),s=r(220);t.TutorialsService=class{constructor(e){this.contentLoader=e,this.tutorialInfos=[],this.defaultStep={tutorialId:"01-basics",stepId:"01-welcome"},this.lastStepLocalStorage=new i.LocalStorage(o.localStoragePrefix+"tutorials.step",this.defaultStep)}async getTutorialsList(){if(0==this.tutorialInfos.length){const e=await this.contentLoader.loadFile("content/tutorials/index.json",{useLocale:!1}),t=JSON.parse(e);this.tutorialInfos=t.tutorials;const r=this.contentLoader.getCurrentLocaleId();for(const e of this.tutorialInfos){e.description=s.setLocalizedString(e.description,r),e.label=s.setLocalizedString(e.label,r);for(const t of e.steps)t.name=s.setLocalizedString(t.name,r)}}return this.tutorialInfos}async getStep(e,t){let r=await this.contentLoader.loadFile(`content/tutorials/${e}/${t}.md`,{useLocale:!0}),o="";r=this.findAndReplaceCodeChunks(r,"solution",e=>(o=e,""));const i={};let s=1;r=this.findAndReplaceCodeChunks(r,"logo",(e,t)=>{if(!t.width)throw new Error("width is required parameter to logo inline block");if(!t.height)throw new Error("height is required parameter to logo inline block");const r="logo"+s++;i[r]={code:e?e.trim():"",params:t};let n=`<div id="${r}" class="logo-inline-container" style="width:${t.width};height:${t.height}"></div>`;return t.code&&(n="\n```"+e+"```\n"+n),t.solution&&(o=e),n});let a=new n({html:!0}).render(r).trim();a=a.replace(/src="[\s\S]*?"/g,t=>{let r=t.substr(5);return r=r.substr(0,r.length-1),r.startsWith(".")&&(r=r.substring(1),r="content/tutorials/"+e+r),'src="'+r+'"'});const l={content:a,solutionCode:o.trim(),inlinedCode:i};return this.setLastStep({tutorialId:e,stepId:t}),l}getLastStep(){return this.lastStepLocalStorage.getValue()}setLastStep(e){this.lastStepLocalStorage.setValue(e)}findAndReplaceCodeChunks(e,t,r){const n=new RegExp("\x3c!--"+t+"([\\s\\S]*?)--\x3e[\\s\\S]*?```([\\s\\S]*?)```","g");return e.replace(n,(e,t,n)=>{const o=t?JSON.parse(t):{};return r(n,o)})}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(221);t.ImageUploadService=class{};t.ImageUploadImgurService=class{constructor(e,t){this.clientId=e,this.serviceUrl=t}async doUpload(e){const t=e.substr("data:image/png;base64,".length),r=`Client-ID ${this.clientId}`,o=this.serviceUrl||"https://api.imgur.com/3/image",i=new URLSearchParams;i.append("image",t),i.append("type","base64");const s=await n(o,{method:"post",headers:new Headers({Authorization:r,Accept:"application/json","Content-Type":"application/x-www-form-urlencoded; charset=utf-8"}),body:i});if(s.ok){return(await s.json()).data.link}throw s}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(226),o=r(8),i=r(38);t.GallerySamplesRepository=class{constructor(){this.cached_programs={}}async getAll(e){if(this.cached_programs[e])return this.cached_programs[e];const t=await fetch(`content/${e}.html`,{method:"get",credentials:"same-origin"});if(!t.ok)throw t;const r=await t.text(),s=new i.ProgramsHtmlSerializer(window).parse(r);for(const t of s)t.id=e+"-"+n.formatId(t.name,e=>!!s.find(t=>t.id===e)),t.storageType=o.ProgramStorageType.samples;return s.sort((e,t)=>e.dateLastEdited>t.dateLastEdited?-1:1),this.cached_programs[e]=s,s}async get(e){const t=e.indexOf("-");if(t<=0)throw new Error("Wrong id for sample");const r=e.substr(0,t),n=(await this.getAll(r)).find(t=>t.id===e);if(!n)throw new Error(`Program with id ${e} is not found`);return n}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8),o=r(227);t.SharedProgramsRepository=class{constructor(){this.repo=new o.SharedProgramsUrlEncoder}async get(e){const t=await this.repo.get(e);return{id:e,code:t.text,dateCreated:new Date,dateLastEdited:new Date,name:t.name,screenshot:"",storageType:n.ProgramStorageType.shared}}async post(e,t){return this.repo.post(e,t)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(30),o=["\nrepeat 14 [\n fd repcount * 8 \n rt 90\n]\n","\nrepeat 10 [\n repeat 8 [\n fd 20 \n rt 360 / 8\n ] \n rt 360 / 10\n]\n","\npenup \nsetxy -40 -20 \npendown \nrepeat 8 [\n fd 40 \n rt 360 / 8\n]\n","\nrepeat 10 [\n fd 5 * repcount \n repeat 3 [\n fd 18 \n rt 360 /3 \n ] \n rt 360 / 10\n]\n","\nrepeat 10 [\n fd 10\n rt 90\n fd 10\n lt 90\n]\n","\npenup\nsetxy -80 0\nrepeat 10 [\n arc 360 20\n fd 40\n rt 36\n]\n","\nrt 18\nrepeat 5 [\n fd 100\n rt 144\n]","\nforward 50\nright 90\nforward 100\narc 360 50\n","\n setpensize 3\n repeat 100 [\n setcolor (modulo repcount 5) + 1\n fd repcount * 1.5 \n rt 360/5\n ]\n"];t.LogoCodeSamplesService=class{constructor(){this.lastIndex=-1}getRandomSample(){let e=this.lastIndex;for(;e===this.lastIndex;)e=n.RandomHelper.getRandomInt(0,o.length-1);return this.lastIndex=e,o[e]}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(38);function o(e,t){let r=1,n="";do{n=r>1?`${e} (${r})`:e,r++}while(t(n));return n}t.GalleryImportService=class{constructor(e){this.galleryService=e}async import(e){const t=new n.ProgramsHtmlSerializer(window).parse(e);return this.importAll(t)}async importAll(e){const t=await this.galleryService.getAll()||[],r=[];let n=0;for(const i of e){const e=t.find(e=>e.id===i.id);e?e.code===i.code||(i.id="",i.name=o(i.name,e=>t.some(t=>t.name===e)),r.push(i),n++):(i.name=o(i.name,e=>t.some(t=>t.name===e)),r.push(i),n++)}return await this.galleryService.add(r),n}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.LogoImportsResolverService=class{constructor(e,t){this.localProgramsRepository=e,this.examplesRepository=t,this.programs=[]}async reset(){this.programs=[]}async resolve(e){0===this.programs.length&&await this.loadPrograms();const t=this.programs.find(t=>t.name.toLowerCase().trim()===e);return t?t.code:""}async loadPrograms(){this.programs.push(...this.localProgramsRepository.getAll()),this.programs.push(...await this.examplesRepository.getAll("elements")),this.programs.push(...await this.examplesRepository.getAll("gallery"))}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(3),o=r(48),i=r(13),s=r(5),a=r(37),l=r(18),c=r(42),u=r(90),p=r(58),d=r(93),h=r(22),m=r(41);t.galleryThunks={loadSection:function(e,t){return async(r,n)=>{const c=n().gallery;if(c.activeSection===e&&c.programs.length>0&&(!t||!t.forceLoad))return;r(m.galleryActionCreator.loadSectionStarted(e));const d=o.createCompareFunction([{sortBy:e=>e.dateLastEdited,direction:"desc"},{sortBy:e=>e.name}]);try{switch(e){case a.GallerySection.ExamplesAdvanced:{const t=s.resolve(u.GallerySamplesRepository),n=await t.getAll("gallery");n.sort(d),r(m.galleryActionCreator.loadSectionCompleted(e,n))}break;case a.GallerySection.ExamplesBasic:{const t=s.resolve(u.GallerySamplesRepository),n=await t.getAll("elements");n.sort(d),r(m.galleryActionCreator.loadSectionCompleted(e,n))}break;case a.GallerySection.PersonalLibrary:{const t=s.resolve(p.GalleryService),n=t.getAllLocal();n.length>0&&(n.sort(d),r(m.galleryActionCreator.loadSectionCompleted(e,n)));const o=await t.getAll();o.sort(d),r(m.galleryActionCreator.loadSectionCompleted(e,o))}}}catch(t){const n=await i.normalizeError(t);r(l.envActionCreator.handleError(n)),r(m.galleryActionCreator.loadSectionCompleted(e,[]))}}},import:function(e){return async(r,o)=>{r(m.galleryActionCreator.importStarted());try{const o=s.resolve(d.GalleryImportService),i=await o.import(e);r(m.galleryActionCreator.importCompleted(!0)),r(h.envThunks.showNotificationAutoClose(c.NotificationType.info,n.$T.gallery.importCompletedTitle,n.$T.gallery.addedProgramsMessage.val(i))),r(t.galleryThunks.loadSection(a.GallerySection.PersonalLibrary,{forceLoad:!0}))}catch(e){const t=await i.normalizeError(e);r(m.galleryActionCreator.importCompleted(!1,t.message))}}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(25),i=r(235),s=r(28),a=r(62),l=r(237),c=r(97);class u extends n.Component{constructor(e){super(e),this.layoutHelper=new l.GoldenLayoutHelper,this.panelDomContainersByIds={},this.oldWindowDimensions={width:window.innerWidth,height:window.innerHeight},this.isComponentMounted=!1,this.onWindowResize=()=>{this.oldWindowDimensions.width===window.innerWidth&&this.oldWindowDimensions.height>window.innerHeight+100||(this.oldWindowDimensions={width:window.innerWidth,height:window.innerHeight},this.layoutHelper.updateSize())},this.handleLayoutStateChanged=s.debounce(()=>{if(!this.isComponentMounted||!this.layoutHelper.layout)return;const e=this.layoutHelper.layout.toConfig(),t=JSON.stringify(e);this.props.layoutLocalStorageKey&&window.localStorage.setItem(this.props.layoutLocalStorageKey,t),this.props.onLayoutChange&&this.props.onLayoutChange(t)},500)}componentDidMount(){const e=this.props.layoutLocalStorageKey&&window.localStorage.getItem(this.props.layoutLocalStorageKey);e&&this.initLayoutWithConfig(e)||this.initLayoutWithConfig(this.props.defaultLayoutConfigJSON),window.addEventListener("resize",this.onWindowResize),this.isComponentMounted=!0}componentWillUnmount(){this.isComponentMounted=!1,this.layoutHelper.destroy(),window.removeEventListener("resize",this.onWindowResize)}initLayoutWithConfig(e){try{const t=JSON.parse(e);this.props.configLayoutOverride&&(t.settings={...t.settings||{},...this.props.configLayoutOverride.settings},t.dimensions={...t.dimensions||{},...this.props.configLayoutOverride.dimensions});const r=new i(t,this.goldenLayoutContainerRef);this.layoutHelper.setGoldenLayout(r),this.panelDomContainersByIds={};const o=this,s=function(e,t){o.panelDomContainersByIds[t.componentName]=e.getElement().get(0)},l=[];n.Children.map(this.props.children,e=>{if(e.type!=a.ReactGoldenLayoutPanel)throw console.error("Wrong child:",e),new Error("Invalid child, only ReactGoldenLayoutPanel are allowed as children, sorry");l.push(e.props.id),r.registerComponent(e.props.id,s)}),r.init();for(const e of l){if(!this.layoutHelper.findGoldenLayoutContentItem(r.root,e))return console.error("Oops, missing panel in config: "+e),!1}r.on("stateChanged",this.handleLayoutStateChanged)}catch(e){return console.error(e),!1}return this.forceUpdate(),!0}render(){return n.createElement("div",{className:this.props.className,ref:e=>this.goldenLayoutContainerRef=e||void 0},this.layoutHelper.layout&&n.createElement(c.ReactGoldenLayoutHelperContext.Provider,{value:this.layoutHelper},n.Children.map(this.props.children,e=>{const t=this.panelDomContainersByIds[e.props.id];if(this.layoutHelper.setPanelTitle(e.props.id,e.props.title),t)return o.createPortal(e,t)})))}}t.ReactGoldenLayout=u},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0);t.ReactGoldenLayoutHelperContext=n.createContext(void 0)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(10),i=r(23),s=r(246),a=r(28);r(247),r(248),r(249),r(250),r(251),r(252);class l extends n.Component{constructor(e){super(e),this.handleHotkey=e=>{this.props.onHotkey&&this.props.onHotkey(e)},this.handleWindowResize=a.debounce(()=>{this.cm&&this.cm.refresh()},300),this.state={}}componentDidUpdate(e){this.cm&&(this.currentCode!=this.props.code&&(this.currentCode=this.props.code,this.cm.setValue(this.currentCode)),e.resizeIncrement!=this.props.resizeIncrement&&this.cm.refresh())}componentDidMount(){const e=this.refs["text-area"];if(this.cm=i.fromTextArea(e,{mode:"logo",autoCloseBrackets:{pairs:"()[]{}",explode:"()[]{}"},matchBrackets:!0,lineComment:";",lineNumbers:!0,lineWrapping:!0,theme:this.props.editorTheme}),this.cm.setSize("100%","100%"),this.currentCode=this.props.code,this.cm.setValue(this.currentCode),this.cm.on("change",()=>{const e=this.cm.getValue();this.currentCode!=e&&(this.currentCode=e,this.props.onChanged(e))}),this.props.hotKeys){const e={};for(const t of this.props.hotKeys)e[t.toUpperCase()]=()=>{this.handleHotkey(t)},s(t,()=>(this.handleHotkey(t),!1));this.cm.addKeyMap(e)}window.addEventListener("resize",this.handleWindowResize)}componentWillUnmount(){if(this.props.hotKeys)for(const e of this.props.hotKeys)s.unbind(e);window.removeEventListener("resize",this.handleWindowResize)}render(){return n.createElement("div",{className:o("code-input-component",this.props.className)},n.createElement("textarea",{ref:"text-area"}))}}t.CodeInput=l},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(10),i=r(3),s=r(253),a=r(255),l=r(256),c=r(257);r(258);class u extends n.Component{constructor(e){super(e),this.programMenuClicked=()=>{this.setState({menuIsActive:!this.state.menuIsActive})},this.handleSaveAs=async e=>{this.props.onSaveAs&&this.props.onSaveAs(e)},this.handleDelete=async()=>{this.props.onDeleteProgram&&this.props.onDeleteProgram()},this.state={}}render(){return n.createElement("div",{className:"code-menu-component"},!this.props.isRunning&&n.createElement("button",{type:"button",className:"button is-success is-borderless",onClick:this.props.onRunProgram,title:i.$T.program.runDescription+" (F9)"},i.$T.program.run)," ",this.props.isRunning&&n.createElement("button",{type:"button",className:"button is-warning is-borderless",onClick:this.props.onStopProgram,title:i.$T.program.stopDescription},i.$T.program.stop)," ",n.createElement("div",{className:o("dropdown is-right is-borderless",{"is-active":this.state.menuIsActive})},n.createElement("div",{className:"dropdown-trigger"},n.createElement("button",{className:"button is-light","aria-haspopup":"true","aria-controls":"dropdown-menu6",onClick:this.programMenuClicked},n.createElement("i",{className:"fa fa-ellipsis-h","aria-hidden":"true"}))),n.createElement("div",{className:"dropdown-menu",id:"dropdown-menu6",role:"menu"},n.createElement("div",{className:"dropdown-content"},n.createElement("a",{className:"dropdown-item",onClick:()=>{this.setState({menuIsActive:!1}),this.props.onFormatDocument()}},n.createElement("i",{className:"fas fa-align-left icon-fixed-width","aria-hidden":"true"}),i.$T.program.formatDocument),this.props.isSaveEnabled&&n.createElement("a",{className:"dropdown-item",onClick:()=>{this.setState({menuIsActive:!1}),this.props.onSave&&this.props.onSave()}},n.createElement("i",{className:"far fa-check-square icon-fixed-width","aria-hidden":"true"}),i.$T.program.save),n.createElement("a",{className:"dropdown-item",onClick:()=>{this.setState({menuIsActive:!1,isSaveAsModalActive:!0,screenshotImageBase64:this.props.createSmallScreenShotImageBase64()})}},n.createElement("i",{className:"fa fa-clone icon-fixed-width","aria-hidden":"true"}),i.$T.program.saveAs),this.props.isRevertEnabled&&n.createElement("a",{className:"dropdown-item",onClick:()=>{this.setState({menuIsActive:!1}),this.props.onRevertChanges&&this.props.onRevertChanges()}},n.createElement("i",{className:"fa fa-undo icon-fixed-width","aria-hidden":"true"}),i.$T.program.revertChanges),this.props.isDeleteEnabled&&n.createElement("a",{className:"dropdown-item",onClick:()=>{this.setState({menuIsActive:!1,isDeleteModalActive:!0})}},n.createElement("i",{className:"fa fa-trash icon-fixed-width","aria-hidden":"true"}),i.$T.common.delete),n.createElement("hr",{className:"dropdown-divider"}),n.createElement("a",{className:"dropdown-item",onClick:()=>{this.setState({menuIsActive:!1,isShareModalActive:!0,screenshotImageBase64:this.props.createSmallScreenShotImageBase64()})}},n.createElement("i",{className:"fa fa-share-alt icon-fixed-width","aria-hidden":"true"}),i.$T.program.share),n.createElement("a",{className:"dropdown-item",onClick:()=>{this.setState({menuIsActive:!1,isTakeScreenshotModalActive:!0,screenshotImageBase64:this.props.createScreenShotImageBase64()})}},n.createElement("i",{className:"fa fa-camera icon-fixed-width","aria-hidden":"true"}),i.$T.program.takeScreenshot)))),this.state.isTakeScreenshotModalActive&&n.createElement(s.ScreenshotModal,{imageBase64:this.state.screenshotImageBase64||"",onClose:()=>this.setState({isTakeScreenshotModalActive:!1})}),this.state.isShareModalActive&&n.createElement(a.ShareProgramModal,{programName:this.props.programName,programCode:this.props.code,imageBase64:this.state.screenshotImageBase64||"",onClose:()=>this.setState({isShareModalActive:!1})}),this.state.isSaveAsModalActive&&n.createElement(l.SaveProgramModal,{programName:this.props.programName,screenshot:this.state.screenshotImageBase64||"",onClose:()=>{this.setState({isSaveAsModalActive:!1})},onSave:this.handleSaveAs,allowRename:!0}),this.state.isDeleteModalActive&&n.createElement(c.DeleteProgramModal,{programName:this.props.programName,onClose:()=>{this.setState({isDeleteModalActive:!1})},onDelete:this.handleDelete}))}}t.CodeMenu=u},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(10),i=r(254),s=r(3);let a=0;class l extends n.Component{constructor(e){super(e),this.componentId="input-copy-to-clipboard-"+ ++a,this.state={isCopied:!1}}async componentDidMount(){this.clipboardInstance=new i("#"+this.componentId+"-btn"),this.clipboardInstance.on("success",()=>{this.setState({isCopied:!0}),this.props.onCopied&&this.props.onCopied()})}componentWillUnmount(){this.clipboardInstance&&this.clipboardInstance.destroy()}render(){return n.createElement(n.Fragment,null,n.createElement("div",{className:"field"},n.createElement("div",{className:"control has-icons-right"},n.createElement("input",{id:this.componentId+"-url",className:"input",type:"text",value:this.props.text,readOnly:!0}),this.state.isCopied&&n.createElement("span",{className:"icon is-small is-right"},n.createElement("i",{className:"fa fa-check"})))),n.createElement("div",{className:"field"},n.createElement("button",{id:this.componentId+"-btn",type:"button",className:o("button",{"is-info":!this.state.isCopied}),"data-clipboard-target":"#"+this.componentId+"-url"},n.createElement("i",{className:"fa fa-clipboard","aria-hidden":"true"})," ",n.createElement("span",null,this.state.isCopied?s.$T.common.copied:s.$T.common.copyToClipboard))))}}t.InputCopyToClipboard=l},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.NavigationService=class{static setNavigationHandler(e){this.navHandler=e}static navigate(e){this.navHandler&&this.navHandler(e)}}},function(e,t,r){"use strict";function n(e){return e.replace(/\s+/g," ").trim()}Object.defineProperty(t,"__esModule",{value:!0}),t.formatLogoProgram=function(e){const t=(function(e){const t=new RegExp(["[","]","*","/"].map(e=>"("+e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")+")").join("|"),"g");return e.replace(t,e=>` ${e} `)}(e).match(/[^\r\n]+/g)||[]).map(e=>e.trim()).filter(e=>Boolean(e));let r=0;const o=[];for(let e=0;e<t.length;++e){const i=n(t[e]),s=e<t.length-1?t[e+1]:"",a=i.toLowerCase();(a.startsWith("end")||i.startsWith("]"))&&r--,r>0?o.push(" ".repeat(r)+i):o.push(i);const l="]"===a||"end"===a,c=s.toLowerCase(),u="]"===c||"end"===c;l&&!u&&o.push(""),(a.startsWith("to")||i.endsWith("["))&&r++}return o.join("\n")}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0);class o extends n.Component{render(){return n.createElement("h1",{className:"title"},this.props.title)}}t.PageHeader=o},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(8);t.defaultPlaygroundState={isLoading:!0,storageType:n.ProgramStorageType.samples,programId:"",code:"",programName:"",hasModifications:!1,isRunning:!1}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.defaultTutorialsState={isLoading:!0,isStepLoading:!0,code:"",isRunning:!1,tutorialId:"",stepId:""}},,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),r(109);const n=r(0),o=r(25),i=r(11),s=r(13),a=r(14),l=r(119),c=r(283),u=r(22);Object.assign(window,{app:{run:async function(){const e=document.getElementById("app-container")||document.body,t=c.createInitialStore();t.dispatch(u.envThunks.initEnv());try{o.render(n.createElement(i.Provider,{store:t},n.createElement(l.MainContainer,null)),e)}catch(t){const r=await s.normalizeError(t);throw o.render(n.createElement("div",{className:"ex-page-container"},n.createElement("div",{className:"ex-page-content"},n.createElement("div",{className:"container"},n.createElement("br",null),n.createElement("br",null),n.createElement("br",null),n.createElement("h1",{className:"title"},"Application failed"),n.createElement(a.AlertMessage,{title:r.name,message:r.message})))),e),t}}}})},function(e,t,r){},,,,,,,,,function(e,t,r){},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(11),o=r(120),i=r(18);t.MainContainer=n.connect(e=>({isLoading:e.env.isLoading,tosterMessages:e.env.notifications}),{onTosterMessageClose:i.envActionCreator.closeNotification})(o.Main)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(32),i=r(122),s=r(101),a=r(281),l=r(17);class c extends n.Component{render(){return n.createElement(n.Fragment,null,n.createElement(a.MessageToster,{messages:this.props.tosterMessages,onClose:this.props.onTosterMessageClose}),n.createElement(l.Loading,{isLoading:this.props.isLoading,fullPage:!0}),n.createElement(o.HashRouter,{ref:e=>{s.NavigationService.setNavigationHandler(t=>{e&&e.history.push(t)})}},!this.props.isLoading&&n.createElement(i.RoutesComponent,null)))}}t.Main=c},,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(32),i=r(19),s=r(124),a=r(233),l=r(262),c=r(272),u=r(275),p=r(278);t.RoutesComponent=()=>n.createElement(o.Switch,null,n.createElement(o.Route,{path:i.Routes.loginPage.path,component:c.LoginPageContainer}),n.createElement(o.Route,{path:i.Routes.gallery.path,component:s.GalleryContainer}),n.createElement(o.Route,{path:i.Routes.settings.path,component:p.SettingsPageContainer}),n.createElement(o.Route,{path:i.Routes.infoPage.path,component:u.InfoPage}),n.createElement(o.Route,{path:i.Routes.tutorials.path,component:l.TutorialsContainer}),n.createElement(o.Route,{exact:!0,path:i.Routes.playgroundDefault.path,component:a.PlaygroundContainer}),n.createElement(o.Route,{exact:!0,path:i.Routes.playground.path,render:e=>n.createElement(a.PlaygroundContainer,{storageType:e.match.params.storageType,programId:e.match.params.id})}),n.createElement(o.Redirect,{from:"/",to:i.Routes.gallery.path}),n.createElement(o.Route,{component:s.GalleryContainer}))},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.RouteInfo=class{constructor(e){this._path=e}get path(){return this._path}build(e){let t=this._path;for(const r in e)e.hasOwnProperty(r)&&(t=t.replace(":"+r,encodeURIComponent(e[r])));return t}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(11),o=r(125),i=r(41),s=r(95);t.GalleryContainer=n.connect(e=>({activeSection:e.gallery.activeSection,programs:e.gallery.programs,isLoading:e.gallery.isLoading,user:e.env.user}),{selectSection:s.galleryThunks.loadSection,showImportModal:()=>i.galleryActionCreator.toggleImportModal(!0)})(o.Gallery)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(10),i=r(32),s=r(126),a=r(48),l=r(5),c=r(3),u=r(19),p=r(37),d=r(6),h=r(38),m=r(153),f=r(155),g=r(17),y=r(76),v=r(21),E=r(230);r(232);class S extends n.Component{constructor(e){super(e),this.eventsTracker=l.resolve(d.EventsTrackingService),this.handleExportClick=async()=>{const e=await new h.ProgramsHtmlSerializer(window).serialize(this.props.programs,this.props.user.name,this.props.user.imageUrl),t=new Blob([e],{type:"text/plain;charset=utf-8"});s.saveAs(t,"my-logo-programs.html")},this.state={}}async componentDidMount(){this.eventsTracker.sendEvent(d.EventAction.openGallery),this.props.selectSection(this.props.activeSection,{forceLoad:!0})}render(){return n.createElement("div",{className:"ex-page-container gallery-component"},n.createElement(v.MainMenuContainer,null),n.createElement("div",{className:"ex-page-content is-fullscreen"},n.createElement("div",{className:"container"},n.createElement("br",null),this.renderTabs(),this.props.isLoading?n.createElement(g.Loading,{fullPage:!0,isLoading:!0}):n.createElement(n.Fragment,null,this.props.activeSection===p.GallerySection.PersonalLibrary&&!this.props.user.isLoggedIn&&n.createElement("div",{className:"gallery-message-box"},n.createElement(y.InfoBox,{content:n.createElement("article",null,n.createElement("p",null,c.$T.gallery.notLoggedInGalleryMessage),n.createElement(i.Link,{to:u.Routes.loginPage.build({})},c.$T.login.title))})),this.props.programs.length>0?n.createElement(n.Fragment,null,n.createElement(f.TileGrid,{tileWidth:250,tileWidthMobile:170,tiles:this.props.programs.map(e=>this.renderProgramCard(e))})):this.props.activeSection===p.GallerySection.PersonalLibrary&&n.createElement(m.NoData,{title:"",description:c.$T.gallery.emptyLibrary}),this.props.activeSection===p.GallerySection.PersonalLibrary&&n.createElement("div",{className:"import-export-buttons"},n.createElement("div",{className:"field is-grouped export-import-buttons-group"},n.createElement("p",{className:"control"},n.createElement("button",{type:"button",className:"button",onClick:this.props.showImportModal},c.$T.gallery.import)),this.props.programs.length>0&&n.createElement("p",{className:"control"},n.createElement("button",{type:"button",className:"button",onClick:this.handleExportClick},c.$T.gallery.export)),n.createElement(E.ImportProgramsModalContainer,null)))))))}renderTabs(){return n.createElement("div",{className:"tabs is-centered is-boxed"},n.createElement("ul",null,n.createElement("li",{className:o({"is-active":this.props.activeSection===p.GallerySection.ExamplesAdvanced})},n.createElement("a",{onClick:()=>this.props.selectSection(p.GallerySection.ExamplesAdvanced)},n.createElement("i",{className:"fas fa-images"})," ",n.createElement("span",null,c.$T.gallery.samplesGallery))),n.createElement("li",{className:o({"is-active":this.props.activeSection===p.GallerySection.ExamplesBasic})},n.createElement("a",{onClick:()=>this.props.selectSection(p.GallerySection.ExamplesBasic)},n.createElement("i",{className:"fa fa-puzzle-piece"})," ",n.createElement("span",null,c.$T.gallery.samplesElements))),n.createElement("li",{className:o({"is-active":this.props.activeSection===p.GallerySection.PersonalLibrary})},n.createElement("a",{onClick:()=>this.props.selectSection(p.GallerySection.PersonalLibrary)},n.createElement("i",{className:"fas fa-flask"})," ",n.createElement("span",null,c.$T.gallery.personalLibrary)))))}renderProgramCard(e){const t=u.Routes.playground.build({storageType:a.ensure(e.storageType),id:e.id});return n.createElement("div",{className:"card program-card"},n.createElement("div",{className:"card-image"},n.createElement("figure",{className:"image is-4by3 gallery-img-container"},n.createElement(i.Link,{to:t},e.screenshot&&n.createElement("img",{src:e.screenshot}),n.createElement("div",{className:"gallery-img-title"},e.name)))))}}t.Gallery=S},,,,,,,,,function(e,t){e.exports=void 0},,,function(e,t){},,function(e,t){},,,,,,,,,,,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0);r(154);class o extends n.Component{render(){const e=this.props.iconClass||"fa-picture-o";return n.createElement("div",{className:"no-data-component has-text-centered"},n.createElement("span",{className:"icon is-large"},n.createElement("i",{className:"fa "+e,"aria-hidden":"true"})),this.props.title&&n.createElement("h2",{className:"subtitle"},this.props.title),this.props.description&&n.createElement("p",null,this.props.description))}}t.NoData=o},function(e,t,r){},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(28),i=r(39);r(156);class s extends n.Component{constructor(e){super(e),this.onWindowResize=o.debounce(()=>{this.calculateColNumber()},100),this.state={tileWidth:0,gridWidth:0}}componentDidMount(){this.calculateColNumber(),window.addEventListener("resize",this.onWindowResize)}componentWillUnmount(){window.removeEventListener("resize",this.onWindowResize)}calculateColNumber(){if(this.containerRef){const e=i.checkIsMobileDevice(),t=this.containerRef.offsetWidth-1,r=t/Math.max(1,Math.round(t/(e?this.props.tileWidthMobile:this.props.tileWidth)));this.setState({tileWidth:r,gridWidth:t})}}render(){return n.createElement("div",{className:"tile-grid-component",ref:e=>this.containerRef=e||void 0},n.createElement("div",{className:"tile-grid",style:{width:this.state.gridWidth}},this.state.tileWidth>0&&this.props.tiles.map((e,t)=>n.createElement("div",{key:t,style:{width:this.state.tileWidth},className:"tile-grid-cell"},e))))}}t.TileGrid=s},function(e,t,r){},function(e,t,r){},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(32),i=r(10),s=r(19),a=r(3),l=r(159);class c extends n.Component{constructor(e){super(e),this.state={}}render(){return n.createElement(n.Fragment,null,n.createElement("nav",{className:"navbar navbar-mobile-fix",role:"navigation","aria-label":"main navigation"},n.createElement("div",{className:"navbar-brand"},n.createElement(o.Link,{className:"navbar-item",to:s.Routes.gallery.build({})},n.createElement("span",{className:"ex-app-logo"})),n.createElement("div",{className:i("navbar-burger burger",{"is-active":this.state.isMenuToggled}),onClick:()=>{this.setState({isMenuToggled:!this.state.isMenuToggled})}},n.createElement("span",null),n.createElement("span",null),n.createElement("span",null))),n.createElement("div",{className:i("navbar-menu",{"is-active":this.state.isMenuToggled}),onClick:()=>this.setState({isMenuToggled:!1})},n.createElement("div",{className:"navbar-start"},n.createElement(o.NavLink,{className:"navbar-item",activeClassName:"is-active",to:s.Routes.gallery.build({})},a.$T.gallery.galleryTitle),n.createElement(o.NavLink,{className:"navbar-item",activeClassName:"is-active",to:s.Routes.tutorials.build({})},a.$T.tutorial.tutorialsTitle),n.createElement("a",{href:"#",className:"navbar-item",onClick:e=>{e.preventDefault(),this.setState({isCheatSheetOpen:!0})}},a.$T.cheatSheet.cheatSheetTitle),n.createElement(o.NavLink,{className:"navbar-item",activeClassName:"is-active",to:s.Routes.playgroundDefault.build({})},a.$T.program.playgroundTitle)),n.createElement("div",{className:"navbar-end"},n.createElement("div",{className:"navbar-item has-dropdown is-hoverable"},n.createElement("span",{className:"navbar-link"},this.props.userImageUrl?n.createElement("img",{src:this.props.userImageUrl}):n.createElement("span",null,n.createElement("i",{className:"far fa-user","aria-hidden":"true"}))),n.createElement("div",{className:"navbar-dropdown is-right"},n.createElement(o.NavLink,{className:"navbar-item",activeClassName:"is-active",to:s.Routes.settings.build({})},n.createElement("i",{className:"fa fa-wrench icon-fixed-width","aria-hidden":"true"}),a.$T.settings.settingsTitle),n.createElement(o.NavLink,{className:"navbar-item",activeClassName:"is-active",to:s.Routes.infoPage.build({})},n.createElement("i",{className:"fa fa-info icon-fixed-width","aria-hidden":"true"}),a.$T.about.aboutTitle),n.createElement("hr",{className:"navbar-divider"}),!this.props.isLoggedIn&&n.createElement(o.NavLink,{className:"navbar-item",activeClassName:"is-active",to:s.Routes.loginPage.build({})},n.createElement("i",{className:"fas fa-sign-in-alt icon-fixed-width","aria-hidden":"true"}),a.$T.common.signIn),this.props.isLoggedIn&&n.createElement("a",{href:"#",className:"navbar-item",onClick:e=>{e.preventDefault(),this.props.onLogout()}},n.createElement("i",{className:"fas fa-sign-out-alt icon-fixed-width","aria-hidden":"true"}),a.$T.common.signOut)))))),this.state.isCheatSheetOpen&&n.createElement(l.CheatSheetModal,{onClose:()=>this.setState({isCheatSheetOpen:!1}),onError:this.props.onError}))}}t.MainMenu=c},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(53),i=r(5),s=r(13),a=r(3),l=r(85),c=r(6),u=r(17),p=r(12);r(216);class d extends n.Component{constructor(e){super(e),this.contentLoader=i.resolve(l.LocalizedContentLoader),this.eventsTracking=i.resolve(c.EventsTrackingService),this.state={isLoading:!0,content:[]}}async componentDidMount(){this.eventsTracking.sendEvent(c.EventAction.openCheatsheet),await this.loadData()}async loadData(){const e=await s.callActionSafe(this.props.onError,async()=>this.contentLoader.loadFile("content/cheat-sheet.md",{useLocale:!0}));if(e){const t=new o({html:!0}),r=e.split(/\n#\s/g).map(e=>e.trim()).filter(e=>!!e).map(e=>t.render(e));this.setState({content:r})}this.setState({isLoading:!1})}render(){return n.createElement(p.Modal,{show:!0,title:a.$T.cheatSheet.cheatSheetTitle,onCancel:this.props.onClose,withoutFooter:!0,width:"wide"},n.createElement(u.Loading,{isLoading:this.state.isLoading}),n.createElement("br",null),n.createElement("div",{className:"columns is-desktop"},this.state.content.map((e,t)=>n.createElement("div",{className:"column is-one-third-desktop",key:t},n.createElement("div",{className:"doc-section content",dangerouslySetInnerHTML:{__html:e}})))),n.createElement("br",null))}}t.CheatSheetModal=d},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,r){},function(e,t,r){},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.AppConfig=class{},t.getConfig=function(){return{services:{appApiUrl:"",imgurServiceUrl:"https://api.imgur.com/3/image",imgurServiceClientID:"50870757d3c7777",googleClientId:"1051176242385-uqf0d6t558d8b01km8e3e0k6kksqui6a.apps.googleusercontent.com",googleAnalyticsTrackingId:"UA-110096379-1",googleDriveGalleryFilename:"my-logo-library.html"}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(5),o=r(68),i=r(3),s=r(6),a=r(219),l=r(86),c=r(87),u=r(85),p=r(88),d=r(89),h=r(223),m=r(225),f=r(58),g=r(90),y=r(59),v=r(91),E=r(92),S=r(31),w=r(93),T=r(94),x=r(60);t.DISetup=class{static async setup(e){n.resetBindings();const{appConfig:t}=e,r=new S.AuthService(t);n.register(S.AuthService,r);const _=await r.init(),b=new s.EventsTrackingService,C=new a.GoogleAnalyticsTracker;b.addTracker(C.trackEvent),n.register(s.EventsTrackingService,b);const P=new l.UserSettingsService(_.email);n.register(l.UserSettingsService,P);const R=await P.get();x.themesManager.setTheme(x.themesManager.getThemeByName(R.themeName));const I=new u.LocalizedContentLoader(R.localeId);n.register(u.LocalizedContentLoader,I);const A=await I.loadFile("content/strings.po",{useLocale:!0});o.updateStringsObject(i.$T,A),n.register(p.TutorialsService,new p.TutorialsService(I));const O=new d.ImageUploadImgurService(t.services.imgurServiceClientID,t.services.imgurServiceUrl);n.register(d.ImageUploadService,O);const N=new g.GallerySamplesRepository;n.register(g.GallerySamplesRepository,N);const L=new m.GalleryLocalRepository(_.email);let M;switch(_.authProvider){case S.AuthProvider.google:M=new h.GalleryGoogleDriveRepository(_.name,_.imageUrl,t)}const D=new f.GalleryService(L,M);n.register(f.GalleryService,D);const k=new v.SharedProgramsRepository;n.register(v.SharedProgramsRepository,k);const U=new c.LocalPlaygroundCodeStorage(_.email);return n.register(c.LocalPlaygroundCodeStorage,U),n.register(y.ProgramService,new y.ProgramService(N,D,U,k)),n.register(E.LogoCodeSamplesService,new E.LogoCodeSamplesService),n.register(w.GalleryImportService,new w.GalleryImportService(D)),n.register(T.LogoImportsResolverService,new T.LogoImportsResolverService(L,N)),{user:_,userSettings:R}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.GoogleAnalyticsTracker=class{constructor(){this.trackEvent=e=>{setTimeout(()=>{const t=window.ga;if(t){t.getAll()[0].send("event",{eventCategory:e.category,eventAction:e.action,eventLabel:e.data})}},0)}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(9);function o(e){return new Error("Error with parsing localized string: "+JSON.stringify(e))}t.setLocalizedString=function(e,t){if("string"==typeof e)return e;if("object"==typeof e){const r=e[t]||e[n.DEFAULT_LOCALE_ID];if(!r)throw o(e);return r}throw o(e)}},,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(30),o=r(8),i=r(224),s=r(38);t.GalleryGoogleDriveRepository=class{constructor(e,t,r){this.userName=e,this.userImage=t,this.appConfig=r,this.serializationService=new s.ProgramsHtmlSerializer(window),this.googleDriveClient=new i.GoogleDriveClient}async getAll(){const e=await this.getStoredData();return e?e.programs:[]}async get(e){const t=(await this.getAll()).find(t=>t.id===e);if(!t)throw new Error("Program is not found");return t}async add(e){const t=await this.getStoredData(),r=t?[...t.programs]:[];for(const t of e)t.id||(t.id=n.RandomHelper.getRandomObjectId(32)),t.dateCreated=new Date,t.dateLastEdited=new Date,r.push(t);await this.storeData(r,t?t.fileId:void 0)}async save(e){const t=await this.getStoredData();if(!t)throw new Error("Google storage is empty");const r=t.programs.find(t=>t.id===e.id);if(!r)throw new Error("Program is not found in google storage");r.dateLastEdited=new Date,r.code=e.code,r.screenshot=e.screenshot,await this.storeData(t.programs,t.fileId)}async remove(e){const t=await this.getStoredData();if(!t)throw new Error("Google storage is empty");const r=t.programs.filter(t=>t.id!==e);await this.storeData(r,t.fileId)}async storeData(e,t){const r=await this.serializationService.serialize(e,this.userName,this.userImage);t?await this.googleDriveClient.updateFile(t,this.appConfig.services.googleDriveGalleryFilename,r,"text/html; charset=UTF-8"):await this.googleDriveClient.uploadNewFile(this.appConfig.services.googleDriveGalleryFilename,r,"text/html; charset=UTF-8")}async getStoredData(){const e=await this.getStorageFileInfo();if(!e)return;if(this.cachedData&&this.cachedData.fileHash===e.md5Checksum)return this.cachedData;const t=await this.googleDriveClient.downloadFileContent(e.id),r=this.serializationService.parse(t),n={fileId:e.id,fileHash:e.md5Checksum,programs:r};for(const e of r)e.storageType=o.ProgramStorageType.gallery;return this.cachedData=n,n}async getStorageFileInfo(){const e=this.appConfig.services.googleDriveGalleryFilename,t=(await this.googleDriveClient.listFiles("name = '"+e+"' and trashed = false")).files.find(t=>t.name===e&&!!t.md5Checksum&&!t.trashed);if(t)return t;console.log("storage file is not found")}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(30);t.GoogleDriveClient=class{get gapi(){const e=window.gapi;if(!e)throw new Error("Google api is not detected");return e}async listFiles(e){return(await this.gapi.client.drive.files.list({fields:"nextPageToken, files(id, name, md5Checksum, trashed)",pageSize:100,q:e})).result}async downloadFileContent(e){const t=this.gapi.client.getToken(),r=`https://www.googleapis.com/drive/v3/files/${e}?alt=media`,n=await fetch(r,{method:"GET",headers:new Headers({Authorization:t.token_type+" "+t.access_token})});if(n.ok)return n.text();throw new Error("Google drive read error")}async uploadNewFile(e,t,r){const o=this.gapi.client.getToken(),i="__"+n.RandomHelper.getRandomObjectId(32)+"__",s=this.createFileUploadBody(i,e,t,r);await fetch("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart",{method:"POST",headers:new Headers({Authorization:o.token_type+" "+o.access_token,Accept:"application/json","Content-Type":"multipart/related; boundary="+i,"Content-Length":s.length}),body:s})}async updateFile(e,t,r,o){const i=this.gapi.client.getToken(),s="__"+n.RandomHelper.getRandomObjectId(32)+"__",a=this.createFileUploadBody(s,t,r,o),l=`https://www.googleapis.com/upload/drive/v3/files/${e}?uploadType=multipart`;await fetch(l,{method:"PATCH",headers:new Headers({Authorization:i.token_type+" "+i.access_token,Accept:"application/json","Content-Type":"multipart/related; boundary="+s,"Content-Length":a.length}),body:a})}createFileUploadBody(e,t,r,n){let o="";return o+="--"+e+"\n",o+="Content-Type: application/json; charset=UTF-8\n\n",o+=JSON.stringify({name:t}),o+="\n--"+e+"\n",o+="Content-Type: "+n+"\n\n",o+=r,o+="\n\n--"+e+"--\n",o}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(30),o=r(8),i=r(9),s=r(29);t.GalleryLocalRepository=class{constructor(e){const t=i.localStoragePrefix+"gallery:"+(e||"guest");this.localStorage=new s.LocalStorage(t,[])}getAll(){const e=this.localStorage.getValue();for(const t of e)t.dateCreated=new Date(t.dateCreated),t.dateLastEdited=new Date(t.dateLastEdited);return e}get(e){const t=this.getAll().find(t=>t.id===e);if(!t)throw new Error(`Program with id ${e} is not found`);return t}add(e){const t=this.getAll();this.addAndSave(t,e,!0)}save(e){const t=this.getAll(),r=t.find(t=>t.id===e.id);if(!r)throw new Error(`Program with id ${e.id} is not found`);r.code=e.code,r.screenshot=e.screenshot,r.dateLastEdited=new Date,this.localStorage.setValue(t)}remove(e){const t=this.getAll().filter(t=>t.id!==e);this.localStorage.setValue(t)}overwrite(e){this.addAndSave([],e,!1)}addAndSave(e,t,r){const i=[...e];for(const e of t)e.id||(e.id=n.RandomHelper.getRandomObjectId(32)),r&&(e.dateCreated=new Date,e.dateLastEdited=new Date),e.storageType=o.ProgramStorageType.gallery,i.push(e);this.localStorage.setValue(i)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(30),o=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$/;t.defaultDate=new Date(0),t.formatFileSize=function(e){if(0==e)return"Empty file";const t=Math.floor(Math.log(e)/Math.log(1024));return(e/Math.pow(1024,t)).toFixed(2)+" "+["B","kB","MB","GB","TB"][t]},t.formatId=function(e,t){let r=e.toLowerCase().replace(/\W/g,"-");""==r&&(r=n.RandomHelper.getRandomObjectId(4));let o=r,i=1;for(;t(o);)i++,o=r+"-"+i;return o},t.getFileExtension=function(e){if(!e)return"";const t=e.lastIndexOf(".");return t<0?"":e.substr(t+1).toLowerCase()},t.stringifyDateAsJson=function(e){return JSON.parse(JSON.stringify({d:e})).d},t.jsonDateReviver=function(e,t){if("string"==typeof t){if(o.exec(t))return new Date(t)}return t},t.parseDateFromJson=function(e,t){if(e&&o.exec(e))return new Date(e);if(t)return t;throw new Error("Cannot parse a date from "+e)},t.strToBase16=function(e){const t=[];for(let r=0;r<e.length;++r){let n=e.charCodeAt(r).toString(16);1===n.length&&(n="0"+n),t[t.length]=n}return t.join("")}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(228);t.SharedProgramsUrlEncoder=class{constructor(){}async get(e){try{const t=n.decompressFromEncodedURIComponent(decodeURIComponent(e)),{name:r,text:o}=JSON.parse(t);if(!r||!o)throw new Error("Error during decoding of shared program");return{name:r,text:o}}catch(e){throw console.error(e),new Error("Error during decoding of shared program")}}async post(e,t){const r=JSON.stringify({name:e,text:t});return n.compressToEncodedURIComponent(r)}}},,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.GoogleAuthService=class{constructor(e){this.googleClientId=e,this.getLoginInfo=e=>{const t=e&&e.isSignedIn(),r=e&&e.getBasicProfile();if(t&&r){return{email:r.getEmail(),imageUrl:r.getImageUrl(),name:r.getName(),id:r.getId()}}}}async init(){try{const e=window.gapi;if(!e)throw new Error("Google API is not loaded");e.auth2||(await this.loadGApiAuth(),await e.client.init({clientId:this.googleClientId,scope:"profile email https://www.googleapis.com/auth/drive.appdata https://www.googleapis.com/auth/drive.file",discoveryDocs:["https://www.googleapis.com/discovery/v1/apis/drive/v3/rest"],prompt:"select_account"}));const t=e.auth2.getAuthInstance().currentUser.get();return this.getLoginInfo(t)}catch(e){return}}async loadGApiAuth(){const e=window.gapi;return new Promise((t,r)=>{e.load("client:auth2",{callback:()=>{t()},onerror:()=>{r()},timeout:5e3,ontimeout:()=>{r()}})})}async signOut(){const e=window.gapi.auth2.getAuthInstance();await e.signOut()}async signIn(){const e=window.gapi;await this.init();const t=e.auth2.getAuthInstance();await t.signIn();const r=t.currentUser.get();return this.getLoginInfo(r)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(11),o=r(231),i=r(41),s=r(95);t.ImportProgramsModalContainer=n.connect(e=>({showImportModal:e.gallery.showImportModal,importErrorMessage:e.gallery.importErrorMessage,isImportInProgress:e.gallery.isImportInProgress}),{onImport:s.galleryThunks.import,onClose:()=>i.galleryActionCreator.toggleImportModal(!1)})(o.ImportProgramsModal)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(10),i=r(3),s=r(12),a=r(17),l=r(14);class c extends n.Component{constructor(e){super(e),this.handleFileInputChange=e=>{if(e.preventDefault(),e.target){const t=e.target;if(t&&t.files){const e=t.files.item(0);if(e){const t=new FileReader;t.onload=async t=>{const r=t.target.result;r&&this.setState({fileName:e.name,fileContent:r})},t.readAsText(e,"UTF-8")}}}},this.handleImportClick=async()=>{this.state.fileContent&&this.props.onImport(this.state.fileContent)},this.handleCancel=()=>{this.setState({fileName:""}),this.props.onClose()},this.state={}}render(){return n.createElement(s.Modal,{show:this.props.showImportModal,title:i.$T.gallery.importModalTitle,cancelButtonText:i.$T.common.cancel,onCancel:this.handleCancel,actionButtonText:i.$T.gallery.import,onConfirm:this.state.fileName&&!this.props.isImportInProgress?this.handleImportClick:void 0},this.props.isImportInProgress?n.createElement(a.Loading,{isLoading:!0}):n.createElement(n.Fragment,null,n.createElement("div",{className:o("file is-boxed",{"has-name":!!this.state.fileName})},n.createElement("label",{className:"file-label"},n.createElement("input",{className:"file-input",type:"file",name:"resume",onChange:this.handleFileInputChange}),n.createElement("span",{className:"file-cta"},n.createElement("span",{className:"file-icon"},n.createElement("i",{className:"fas fa-upload"})),n.createElement("span",{className:"file-label"},i.$T.gallery.chooseAFile)),this.state.fileName&&n.createElement("span",{className:"file-name"},this.state.fileName))),this.props.importErrorMessage&&n.createElement(n.Fragment,null,n.createElement("br",null),n.createElement(l.AlertMessage,{type:"danger",message:this.props.importErrorMessage}))))}}t.ImportProgramsModal=c},function(e,t,r){},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(11),o=r(61),i=r(234),s=r(261);t.PlaygroundContainer=n.connect((e,t)=>({isLoading:e.playground.isLoading,storageType:t.storageType,programId:t.programId,code:e.playground.code,programName:e.playground.programName,hasModifications:e.playground.hasModifications,isRunning:e.playground.isRunning,userSettings:e.env.userSettings,appTheme:e.env.appTheme}),{loadProgram:s.playgroundThunks.loadProgram,codeChanged:s.playgroundThunks.codeChanged,runProgram:o.playgroundActionCreator.runProgram,stopProgram:o.playgroundActionCreator.stopProgram,saveAsProgram:s.playgroundThunks.saveAsProgram,saveProgram:s.playgroundThunks.saveProgram,deleteProgram:s.playgroundThunks.deleteProgram,clearProgram:o.playgroundActionCreator.clearProgram,revertChanges:s.playgroundThunks.revertChanges,formatCode:s.playgroundThunks.formatCode})(i.Playground)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(3),i=r(5),s=r(39),a=r(9),l=r(8),c=r(94),u=r(96),p=r(62),d=r(43),h=r(17),m=r(98),f=r(99),g=r(21),y=r(44),v=r(259);r(260);class E extends n.Component{constructor(e){super(e),this.isMobileDevice=s.checkIsMobileDevice(),this.defaultLayoutConfigJSON=JSON.stringify(this.isMobileDevice?v.playgroundDefaultMobileLayout:v.playgroundDefaultLayout),this.layoutLocalStorageKey=a.localStoragePrefix+"playground-layout"+(this.isMobileDevice?"-mobile":"-desktop"),this.importsResolver=i.resolve(c.LogoImportsResolverService),this.handleCodeChanged=e=>{this.props.codeChanged(e)},this.handleRunProgram=()=>{this.props.runProgram()},this.handleStopProgram=()=>{this.props.stopProgram()},this.getProgramImage=()=>this.logoExecutorRef?this.logoExecutorRef.createScreenshotBase64(!1):"",this.getSmallProgramImage=()=>this.logoExecutorRef?this.logoExecutorRef.createScreenshotBase64(!0):"",this.handleDeleteProgram=()=>{this.props.deleteProgram()},this.handleRevertChanges=()=>{this.props.revertChanges()},this.handleSave=()=>{this.props.saveProgram(this.getSmallProgramImage())},this.handleSaveAs=e=>{this.props.saveAsProgram(e,this.getSmallProgramImage())},this.handleFormatDocument=()=>{this.props.formatCode()},this.state={resizeIncrement:1}}async componentDidMount(){this.importsResolver.reset(),this.props.loadProgram(this.props.storageType,this.props.programId)}async componentDidUpdate(e){e.storageType==this.props.storageType&&e.programId==this.props.programId||(this.importsResolver.reset(),this.props.loadProgram(this.props.storageType,this.props.programId))}componentWillUnmount(){this.props.clearProgram()}render(){return n.createElement("div",{className:"ex-page-container"},n.createElement(g.MainMenuContainer,null),n.createElement("div",{className:"ex-page-content is-fullscreen playground-page-component"},n.createElement(h.Loading,{isLoading:this.props.isLoading,fullPage:!0}),n.createElement(u.ReactGoldenLayout,{className:"golden-layout-container",configLayoutOverride:{settings:{showMaximiseIcon:!1,showPopoutIcon:!1,showCloseIcon:!1},dimensions:{headerHeight:32}},layoutLocalStorageKey:this.layoutLocalStorageKey,defaultLayoutConfigJSON:this.defaultLayoutConfigJSON,onLayoutChange:()=>this.setState({resizeIncrement:this.state.resizeIncrement+1})},n.createElement(p.ReactGoldenLayoutPanel,{id:"code-panel",title:this.buildCodePanelTitle()},n.createElement(f.CodeMenu,{isRunning:this.props.isRunning,code:this.props.code,programName:this.props.programName,onRunProgram:this.handleRunProgram,onStopProgram:this.handleStopProgram,createScreenShotImageBase64:this.getProgramImage,createSmallScreenShotImageBase64:this.getSmallProgramImage,isDeleteEnabled:this.props.storageType===l.ProgramStorageType.gallery,onDeleteProgram:this.handleDeleteProgram,isRevertEnabled:this.props.hasModifications&&void 0!==this.props.storageType,onRevertChanges:this.handleRevertChanges,isSaveEnabled:this.props.storageType===l.ProgramStorageType.gallery,onSave:this.handleSave,onSaveAs:this.handleSaveAs,onFormatDocument:this.handleFormatDocument}),n.createElement(m.CodeInput,{className:"code-input-container",editorTheme:this.props.appTheme.codeEditorThemeName,code:this.props.code,onChanged:this.handleCodeChanged,hotKeys:["f9"],onHotkey:this.handleRunProgram,resizeIncrement:this.state.resizeIncrement})),n.createElement(p.ReactGoldenLayoutPanel,{id:"output-panel",title:this.buildOutputPanelTitle()},n.createElement(d.LogoExecutor,{ref:e=>this.logoExecutorRef=e||void 0,isRunning:this.props.isRunning,onFinish:this.handleStopProgram,code:this.props.code,isDarkTheme:this.props.appTheme.isDark,turtleImageSrc:y.getTurtleById(this.props.userSettings.turtleId).imageSrc,turtleSize:this.props.userSettings.turtleSize,importsResolver:this.importsResolver})))))}buildCodePanelTitle(){let e='<i class="fa fa-code" aria-hidden="true"></i> ';return this.props.programId?(e+=`${o.$T.program.program}: <strong>${this.props.programName}</strong>`,this.props.hasModifications&&(e+=` <i class="fa fa-asterisk icon-sm" aria-hidden="true" title="${o.$T.program.programHasChanges}"></i>`)):e+=o.$T.program.codePanelTitle,e}buildOutputPanelTitle(){return'<i class="fas fa-desktop" aria-hidden="true"></i> '+o.$T.program.outputPanelTitle}}t.Playground=E},,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.GoldenLayoutHelper=class{setGoldenLayout(e){this.layout=e}destroy(){this.layout&&(this.layout.destroy(),this.layout=void 0)}updateSize(){this.layout&&this.layout.updateSize()}setPanelTitle(e,t){if(!this.layout)return;const r=this.findGoldenLayoutContentItem(this.layout.root,e);r?r.setTitle(t):console.error("Error: cannot find panel in layout: "+e)}findGoldenLayoutContentItem(e,t){if(e){if(e.config.componentName===t)return e;for(const r of e.contentItems){const e=this.findGoldenLayoutContentItem(r,t);if(e)return e}}}}},function(module,exports){function LogoInterpreter(turtle,stream,savehook){"use strict";var self=this,UNARY_MINUS="<UNARYMINUS>",ERRORS={BAD_INPUT:4,NO_OUTPUT:5,NOT_ENOUGH_INPUTS:6,TOO_MANY_INPUTS:8,BAD_OUTPUT:9,MISSING_PAREN:10,BAD_VAR:11,BAD_PAREN:12,ALREADY_DEFINED:15,THROW_ERROR:21,IS_PRIMITIVE:22,BAD_PROC:24,NO_TEST:25,BAD_BRACKET:26,BAD_BRACE:27,USER_GENERATED:35,MISSING_SPACE:39};function format(e,t){return e.replace(/{(\w+)(:[UL])?}/g,(function(e,r,n){var o="_PROC_"===r?self.stack[self.stack.length-1]:String(t[r]);switch(n){case":U":return o.toUpperCase();case":L":return o.toLowerCase();default:return o}}))}function __(e){return self.localize&&self.localize(e)||e}function err(e,t,r){"number"==typeof t&&(r=t,t=void 0);var n=new LogoError("ERROR",void 0,format(__(e),t));return void 0!==r&&(n.code=r),n}function LogoError(e,t,r){this.name="LogoError",this.message=r||format(__("No CATCH for tag {tag}"),{tag:e}),this.tag=e,this.value=t,this.proc=self.stack[self.stack.length-1],this.code=-1,this.line=-1}function isKeyword(e,t){return"word"===Type(e)&&(e=String(e).toUpperCase(),self.keywordAlias&&(e=self.keywordAlias(e)||e),e===t)}function promiseLoop(e){return new Promise((function(t,r){!function n(){try{e(n,t,r)}catch(e){r(e)}}()}))}function serialExecute(e){var t=[];return promiseLoop((function(r,n,o){e.length?Promise.resolve(e.shift()()).then((function(e){t.push(e),r()}),o):n(t)}))}function promiseFinally(e,t){return e.then((function(e){return Promise.resolve(t()).then((function(){return e}))}),(function(e){return Promise.resolve(t()).then((function(){throw e}))}))}this.localize=null,this.keywordAlias=null;var lastTimeYielded=Date.now();function promiseYield(){var e=Date.now();return e-lastTimeYielded>20?(lastTimeYielded=e,new Promise((function(e){setTimeout(e,0)}))):Promise.resolve()}function promiseYieldTime(e){return lastTimeYielded=Date.now()+2*e,new Promise((function(t){setTimeout(t,e)}))}function to_arity($$func$$,arity){var parms=[];if($$func$$.length===arity)return $$func$$;for(var i=0;i<arity;++i)parms.push("a"+i);var f=eval("(function "+$$func$$.name+"("+parms.join(",")+"){ return $$func$$.apply(this, arguments); })");return f}function PRNG(e){var t=2147483647&e,r=48271,n=2147483647,o=n/r;this.next=function(){var e=r*(t%o)-3399*(t/o);return t=e>0?e:e+n,this.last=t/n,this.last},this.seed=function(e){t=2147483647&e},this.next()}function StringMap(e){this._map=new Map,this._case_fold=e}function LogoArray(e,t){this._array=[],this._array.length=e;for(var r=0;r<this._array.length;++r)this._array[r]=[];this._origin=t}function Stream(e){this._string=e,this._index=0,this._skip()}function Output(e){this.output=e}function Bye(){}function Type(e){if(void 0===e)throw err("No output from procedure",ERRORS.NO_OUTPUT);if("string"==typeof e||"number"==typeof e)return"word";if(Array.isArray(e))return"list";if(e instanceof LogoArray)return"array";throw"then"in Object(e)?new Error("Internal error: Unexpected value: a promise"):e?new Error("Internal error: Unexpected value: unknown type"):new Error("Internal error: Unexpected value: null")}function parse(e){if(void 0!==e){for(var t,r=[],n=new Stream(e);n.peek();){for(var o,i=isWS(n.peek());isWS(n.peek());)n.get();if(!n.peek())break;if("["===n.peek())n.get(),o=parseList(n);else{if("]"===n.peek())throw err("Unexpected ']'",ERRORS.BAD_BRACKET);if("{"===n.peek())n.get(),o=parseArray(n);else{if("}"===n.peek())throw err("Unexpected '}'",ERRORS.BAD_BRACE);if('"'===n.peek())o=parseQuoted(n);else if(isOwnWord(n.peek()))o=n.get();else if(inRange(n.peek(),"0","9"))o=parseNumber(n);else if(inChars(n.peek(),OPERATOR_CHARS)){if("-"===(o=parseOperator(n))){var s=isWS(n.peek());(void 0===t||"word"===Type(t)&&isInfix(t)||"word"===Type(t)&&"("===t||i&&!s)&&(o=UNARY_MINUS)}}else{if(inChars(n.peek(),WORD_DELIMITER))throw err("Couldn't parse: '{string}'",{string:n.rest});o=parseWord(n)}}}r.push(o),t=o}return r}}function inRange(e,t,r){return t<=e&&e<=r}function inChars(e,t){return e&&-1!==t.indexOf(e)}Object.defineProperties(StringMap.prototype,{get:{value:function(e){return e=this._case_fold?String(e).toLowerCase():String(e),this._map.get(e)}},set:{value:function(e,t){e=this._case_fold?String(e).toLowerCase():String(e),this._map.set(e,t)}},has:{value:function(e){return e=this._case_fold?String(e).toLowerCase():String(e),this._map.has(e)}},delete:{value:function(e){return e=this._case_fold?String(e).toLowerCase():String(e),this._map.delete(e)}},keys:{value:function(){var e=[];return this._map.forEach((function(t,r){e.push(r)})),e}},empty:{value:function(){return 0===this._map.size}},forEach:{value:function(e){return this._map.forEach((function(t,r){e(r,t)}))}}}),LogoArray.from=function(e,t){var r=new LogoArray(0,t);return r._array=Array.from(e),r},Object.defineProperties(LogoArray.prototype,{item:{value:function(e){if(e=0|Number(e),(e-=this._origin)<0||e>=this._array.length)throw err("{_PROC_}: Index out of bounds",ERRORS.BAD_INPUT);return this._array[e]}},setItem:{value:function(e,t){if(e=0|Number(e),(e-=this._origin)<0||e>=this._array.length)throw err("{_PROC_}: Index out of bounds",ERRORS.BAD_INPUT);this._array[e]=t}},list:{get:function(){return this._array}},origin:{get:function(){return this._origin}},length:{get:function(){return this._array.length}}}),Object.defineProperties(Stream.prototype,{eof:{get:function(){return this._index>=this._string.length}},peek:{value:function(){var e=this._string.charAt(this._index);return"\\"===e&&(e+=this._string.charAt(this._index+1)),e}},get:{value:function(){var e=this._next();return this._skip(),e}},_next:{value:function(){var e=this._string.charAt(this._index++);return"\\"===e&&(e+=this._string.charAt(this._index++)),e}},_skip:{value:function(){for(;!this.eof;){var e=this.peek();if("~"===e&&"\n"===this._string.charAt(this._index+1))this._index+=2;else{if(";"!==e)return;do{e=this._next()}while(!this.eof&&"\n"!==this.peek());"~"===e&&this._next()}}}},rest:{get:function(){return this._string.substring(this._index)}}}),self.turtle=turtle,self.stream=stream,self.routines=new StringMap(!0),self.scopes=[new StringMap(!0)],self.plists=new StringMap(!0),self.prng=new PRNG(2147483647*Math.random()),self.forceBye=!1,Output.prototype.toString=function(){return this.output},Output.prototype.valueOf=function(){return this.output};var WS_CHARS=" \f\n\r\t\v";function isWS(e){return inChars(e,WS_CHARS)}var QUOTED_DELIMITER=WS_CHARS+"[](){}";function parseQuoted(e){for(var t="";!e.eof&&-1===QUOTED_DELIMITER.indexOf(e.peek());){var r=e.get();t+="\\"===r.charAt(0)?r.charAt(1):r.charAt(0)}return t}var OWNWORD_CHARS="←↑→↓";function isOwnWord(e){return inChars(e,OWNWORD_CHARS)}var WORD_DELIMITER=WS_CHARS+"[](){}+-*/%^=<>";function parseWord(e){for(var t="";!e.eof&&-1===WORD_DELIMITER.indexOf(e.peek());){var r=e.get();t+="\\"===r.charAt(0)?r.charAt(1):r.charAt(0)}return t}var OPERATOR_CHARS="+-*/%^=<>[]{}()";function parseOperator(e){var t="";return inChars(e.peek(),OPERATOR_CHARS)&&(t+=e.get()),("<"===t&&"="===e.peek()||">"===t&&"="===e.peek()||"<"===t&&">"===e.peek())&&(t+=e.get()),t}function isInfix(e){return["+","-","*","/","%","^","=","<",">","<=",">=","<>"].includes(e)}function isOperator(e){return isInfix(e)||["[","]","{","}","(",")"].includes(e)}function parseNumber(e){for(var t="";inRange(e.peek(),"0","9");)t+=e.get();if("."===e.peek()&&(t+=e.get()),inRange(e.peek(),"0","9"))for(;inRange(e.peek(),"0","9");)t+=e.get();if("E"===e.peek()||"e"===e.peek())for(t+=e.get(),"-"!==e.peek()&&"+"!==e.peek()||(t+=e.get());inRange(e.peek(),"0","9");)t+=e.get();return t}function isNumber(e){return String(e).match(/^-?([0-9]*\.?[0-9]+(?:[eE][\-+]?[0-9]+)?)$/)}function parseInteger(e){var t="";for("-"===e.peek()&&(t+=e.get());inRange(e.peek(),"0","9");)t+=e.get();return t}function parseList(e){for(var t,r=[],n="";;){do{t=e.get()}while(isWS(t));for(;t&&!isWS(t)&&-1==="[]{}".indexOf(t);)n+=t,t=e.get();if(n.length&&(r.push(n),n=""),!t)throw err("Expected ']'",ERRORS.BAD_BRACKET);if(!isWS(t)){if("]"===t)return r;if("["!==t){if("{"!==t){if("}"===t)throw err("Unexpected '}'",ERRORS.BAD_BRACE);throw err("Unexpected '{c}'",{c:t})}r.push(parseArray(e))}else r.push(parseList(e))}}}function parseArray(e){for(var t,r=[],n=1,o="";;){do{t=e.get()}while(isWS(t));for(;t&&!isWS(t)&&-1==="[]{}".indexOf(t);)o+=t,t=e.get();if(o.length&&(r.push(o),o=""),!t)throw err("Expected '}'",ERRORS.BAD_BRACE);if(!isWS(t)){if("}"===t){for(;isWS(e.peek());)e.get();if("@"===e.peek()){for(e.get();isWS(e.peek());)e.get();n=Number(parseInteger(e)||0)}return LogoArray.from(r,n)}if("["!==t){if("]"===t)throw err("Unexpected ']'",ERRORS.BAD_BRACKET);if("{"!==t)throw err("Unexpected '{c}'",{c:t});r.push(parseArray(e))}else r.push(parseList(e))}}}function reparse(e){return parse(stringify_nodecorate(e).replace(/([\\;])/g,"\\$1"))}function maybegetvar(e){var t=lvalue(e);return t?t.value:void 0}function getvar(e){var t=maybegetvar(e);if(void 0!==t)return t;throw err("Don't know about variable {name:U}",{name:e},ERRORS.BAD_VAR)}function lvalue(e){for(var t=self.scopes.length-1;t>=0;--t)if(self.scopes[t].has(e))return self.scopes[t].get(e)}function setvar(e,t){t=copy(t);var r=lvalue(e);r?r.value=t:(r={value:t},self.scopes[0].set(e,r))}function local(e){self.scopes[self.scopes.length-1].set(sexpr(e),{value:void 0})}function setlocal(e,t){t=copy(t),self.scopes[self.scopes.length-1].set(sexpr(e),{value:t})}function peek(e,t){if(e.length<1)return!1;var r=e[0];return t.some((function(e){return r===e}))}function evaluateExpression(e){return expression(e)()}function expression(e){return relationalExpression(e)}function relationalExpression(e){for(var t,r=additiveExpression(e);peek(e,["=","<",">","<=",">=","<>"]);)t=e.shift(),r=function(r){var n=additiveExpression(e);switch(t){case"<":return defer((function(e,t){return aexpr(e)<aexpr(t)?1:0}),r,n);case">":return defer((function(e,t){return aexpr(e)>aexpr(t)?1:0}),r,n);case"=":return defer((function(e,t){return equal(e,t)?1:0}),r,n);case"<=":return defer((function(e,t){return aexpr(e)<=aexpr(t)?1:0}),r,n);case">=":return defer((function(e,t){return aexpr(e)>=aexpr(t)?1:0}),r,n);case"<>":return defer((function(e,t){return equal(e,t)?0:1}),r,n);default:throw new Error("Internal error in expression parser")}}(r);return r}function defer(e){var t=[].slice.call(arguments,1);return function(){return serialExecute(t.slice()).then((function(t){return e.apply(null,t)}))}}function additiveExpression(e){for(var t,r=multiplicativeExpression(e);peek(e,["+","-"]);)t=e.shift(),r=function(r){var n=multiplicativeExpression(e);switch(t){case"+":return defer((function(e,t){return aexpr(e)+aexpr(t)}),r,n);case"-":return defer((function(e,t){return aexpr(e)-aexpr(t)}),r,n);default:throw new Error("Internal error in expression parser")}}(r);return r}function multiplicativeExpression(e){for(var t,r=powerExpression(e);peek(e,["*","/","%"]);)t=e.shift(),r=function(r){var n=powerExpression(e);switch(t){case"*":return defer((function(e,t){return aexpr(e)*aexpr(t)}),r,n);case"/":return defer((function(e,t){var r=aexpr(e),n=aexpr(t);if(0===n)throw err("Division by zero",ERRORS.BAD_INPUT);return r/n}),r,n);case"%":return defer((function(e,t){var r=aexpr(e),n=aexpr(t);if(0===n)throw err("Division by zero",ERRORS.BAD_INPUT);return r%n}),r,n);default:throw new Error("Internal error in expression parser")}}(r);return r}function powerExpression(e){for(var t=unaryExpression(e);peek(e,["^"]);)e.shift(),t=function(t){return defer((function(e,t){return Math.pow(aexpr(e),aexpr(t))}),t,unaryExpression(e))}(t);return t}function unaryExpression(e){return peek(e,[UNARY_MINUS])?(e.shift(),defer((function(e){return-aexpr(e)}),unaryExpression(e))):finalExpression(e)}function finalExpression(e){if(!e.length)throw err("Unexpected end of instructions",ERRORS.MISSING_PAREN);var t,r,n,o=e.shift();switch(Type(o)){case"array":case"list":return function(){return o};case"word":if(isNumber(o))return o=parseFloat(o),function(){return o};if('"'===(o=String(o)).charAt(0)||"'"===o.charAt(0))return r=o.substring(1),function(){return r};if(":"===o.charAt(0))return n=o.substring(1),function(){return getvar(n)};if("("===o){if(e.length&&"word"===Type(e[0])&&self.routines.has(String(e[0]))&&!(e.length>1&&"word"===Type(e[1])&&isInfix(String(e[1]))))return o=e.shift(),self.dispatch(o,e,!1);if(t=expression(e),!e.length)throw err("Expected ')'",ERRORS.MISSING_PAREN);if(!peek(e,[")"]))throw err("Expected ')', saw {word}",{word:e.shift()},ERRORS.MISSING_PAREN);return e.shift(),t}if(")"===o)throw err("Unexpected ')'",ERRORS.BAD_PAREN);return self.dispatch(o,e,!0);default:throw new Error("Internal error in expression parser")}}function aexpr(e){if(void 0===e)throw err("Expected number",ERRORS.BAD_INPUT);switch(Type(e)){case"word":if(isNumber(e))return parseFloat(e)}throw err("Expected number",ERRORS.BAD_INPUT)}function sexpr(e){if(void 0===e)throw err("Expected string",ERRORS.BAD_INPUT);if(e===UNARY_MINUS)return"-";if("word"===Type(e))return String(e);throw new err("Expected string",ERRORS.BAD_INPUT)}function lexpr(e){if(void 0===e)throw err("{_PROC_}: Expected list",ERRORS.BAD_INPUT);switch(Type(e)){case"word":return Array.from(String(e));case"list":return copy(e)}throw err("{_PROC_}: Expected list",ERRORS.BAD_INPUT)}function sifw(e,t){return"word"===Type(e)?t.join(""):t}function copy(e){switch(Type(e)){case"list":return e.map(copy);default:return e}}function equal(e,t){if(Type(e)!==Type(t))return!1;switch(Type(e)){case"word":return"number"==typeof e||"number"==typeof t?Number(e)===Number(t):String(e)===String(t);case"list":if(e.length!==t.length)return!1;for(var r=0;r<e.length;++r)if(!equal(e[r],t[r]))return!1;return!0;case"array":return e===t}}self.stack=[],self.dispatch=function(e,t,r){e=e.toUpperCase();var n=self.routines.get(e);if(!n){var o;if((o=/^(\w+?)(\d+)$/.exec(e))&&self.routines.get(o[1]))throw err("Need a space between {name:U} and {value}",{name:o[1],value:o[2]},ERRORS.MISSING_SPACE);throw err("Don't know how to {name:U}",{name:e},ERRORS.BAD_PROC)}if(n.special){self.stack.push(e);try{return n.call(self,t),function(){}}finally{self.stack.pop()}}var i=[];if(r)for(var s=0;s<n.default;++s)i.push(expression(t));else{for(;t.length&&!peek(t,[")"]);)i.push(expression(t));if(t.shift(),i.length<n.minimum)throw err("Not enough inputs for {name:U}",{name:e},ERRORS.NOT_ENOUGH_INPUTS);if(-1!==n.maximum&&i.length>n.maximum)throw err("Too many inputs for {name:U}",{name:e},ERRORS.TOO_MANY_INPUTS)}return n.noeval?function(){return self.stack.push(e),promiseFinally(n.apply(self,i),(function(){self.stack.pop()}))}:function(){return self.stack.push(e),promiseFinally(serialExecute(i.slice()).then((function(e){return n.apply(self,e)})),(function(){self.stack.pop()}))}},self.execute=function(e,t){var r;return t=Object(t),e=e.slice(),promiseLoop((function(n,o,i){if(self.forceBye)return self.forceBye=!1,void i(new Bye);e.length?Promise.resolve(evaluateExpression(e)).then((function(e){void 0===e||t.returnResult?(r=e,n()):i(err("Don't know what to do with {result}",{result:e},ERRORS.BAD_OUTPUT))}),i):o(r)}))},self.bye=function(){self.forceBye=!0};var lastRun=Promise.resolve();function stringify(e){switch(Type(e)){case"list":return"["+e.map(stringify).join(" ")+"]";case"array":return"{"+e.list.map(stringify).join(" ")+"}"+(1===e.origin?"":"@"+e.origin);default:return sexpr(e)}}function stringify_nodecorate(e){switch(Type(e)){case"list":return e.map(stringify).join(" ");case"array":return e.list.map(stringify).join(" ");default:return sexpr(e)}}function def(e,t,r){t.minimum=t.default=t.maximum=t.length,r&&Object.keys(r).forEach((function(e){t[e]=r[e]})),t.primitive=!0,Array.isArray(e)?e.forEach((function(e){self.routines.set(e,t)})):self.routines.set(e,t)}function defineProc(e,t,r,n,o,i){if(self.routines.has(e)&&self.routines.get(e).primitive)throw err("{_PROC_}: Can't redefine primitive {name:U}",{name:e},ERRORS.IS_PRIMITIVE);if(void 0!==o&&(o<t.length||!n&&o>t.length+r.length))throw err("{_PROC_}: Bad default number of inputs for {name:U}",{name:e},ERRORS.BAD_INPUT);var s=void 0===o?t.length:o,a=to_arity((function(){var e=new StringMap(!0);self.scopes.push(e);for(var o,s=0;s<t.length&&s<arguments.length;++s)e.set(t[s],{value:arguments[s]});for(;s<t.length+r.length&&s<arguments.length;++s)o=r[s-t.length],e.set(o[0],{value:arguments[s]});for(;s<t.length+r.length;++s)o=r[s-t.length],e.set(o[0],{value:evaluateExpression(reparse(o[1]))});return n&&e.set(n,{value:[].slice.call(arguments,s)}),promiseFinally(self.execute(i).then(promiseYield,(function(e){if(e instanceof Output)return e.output;throw e})),(function(){self.scopes.pop()}))}),s);self.routines.set(e,a),a.inputs=t,a.optional_inputs=r,a.rest=n,a.def=o,a.block=i,a.minimum=t.length,a.default=s,a.maximum=n?-1:t.length+r.length,savehook&&savehook(e,self.definition(e,a))}function item(e,t){switch(Type(t)){case"list":if(e<1||e>t.length)throw err("{_PROC_}: Index out of bounds",ERRORS.BAD_INPUT);return t[e-1];case"array":return t.item(e);default:if(t=sexpr(t),e<1||e>t.length)throw err("{_PROC_}: Index out of bounds",ERRORS.BAD_INPUT);return t.charAt(e-1)}}function contains(e,t){if(e===t)return!0;switch(Type(e)){case"list":return e.some((function(e){return contains(e,t)}));case"array":return e.list.some((function(e){return contains(e,t)}));default:return!1}}function deg2rad(e){return e/180*Math.PI}function rad2deg(e){return 180*e/Math.PI}function truncate(e){return parseInt(e,10)}function booleanReduce(e,t,r){return promiseLoop((function(n,o,i){e.length?Promise.resolve(e.shift()()).then((function(e){t(e)?(r=e,n()):o(e)})):o(r)}))}self.queueTask=function(e){var t=lastRun.then((function(){return Promise.resolve(e())}));return lastRun=t.catch((function(){})),t},self.run=function(e,t){return t=Object(t),self.queueTask((function(){var r=parse(e);return self.execute(r,t).catch((function(e){if(!(e instanceof Bye))throw e}))}))},self.definition=function(e,t){function r(e){switch(Type(e)){case"word":return String(e);case"list":return"[ "+e.map(r).join(" ")+" ]";case"array":return"{ "+e.list.map(r).join(" ")+" }"+(1===e.origin?"":"@"+e.origin);default:throw new Error("Internal error: unknown type")}}var n="to "+e;return n+=t.inputs.map((function(e){return" :"+e})).join(""),n+=t.optional_inputs.map((function(e){return" [:"+e[0]+" "+e[1].map(r).join(" ")+"]"})).join(""),t.rest&&(n+=" [:"+t.rest+"]"),void 0!==t.def&&(n+=" "+t.def),n+="\n",n+=" "+t.block.map(r).join(" ").replace(new RegExp(UNARY_MINUS+" ","g"),"-"),n+="\nend"},self.procdefs=function(){var e=[];return self.routines.forEach((function(t,r){r.primitive||e.push(self.definition(t,r))})),e.join("\n\n")},self.copydef=function(e,t){self.routines.set(e,self.routines.get(t))},def("to",(function(e){var t=sexpr(e.shift());if(isNumber(t)||isOperator(t))throw err("TO: Expected identifier",ERRORS.BAD_INPUT);for(var r=[],n=[],o=void 0,i=void 0,s=[],a=0,l=!1;e.length;){var c=e.shift();if(isKeyword(c,"END")){l=!0;break}if(0===a){if("word"===Type(c)&&":"===String(c).charAt(0)){r.push(c.substring(1));continue}a=1}if(1===a){if("list"===Type(c)&&c.length>1&&":"===String(c[0]).charAt(0)){n.push([c.shift().substring(1),c]);continue}a=2}2!==a||(a=3,"list"!==Type(c)||1!==c.length||":"!==String(c[0]).charAt(0))?3===a&&(a=4,"word"===Type(c)&&isNumber(c))?i=parseFloat(c):s.push(c):o=c[0].substring(1)}if(!l)throw err("TO: Expected END",ERRORS.BAD_INPUT);defineProc(t,r,n,o,i,s)}),{special:!0}),def("def",(function(e){var t=sexpr(e),r=this.routines.get(t);if(!r)throw err("{_PROC_}: Don't know how to {name:U}",{name:t},ERRORS.BAD_PROC);if(!r.inputs)throw err("{_PROC_}: Can't show definition of primitive {name:U}",{name:t},ERRORS.IS_PRIMITIVE);return this.definition(t,r)})),def("word",(function(e,t){return arguments.length?Array.from(arguments).map(sexpr).reduce((function(e,t){return e+t})):""}),{minimum:0,maximum:-1}),def("list",(function(e,t){return Array.from(arguments).map((function(e){return e}))}),{minimum:0,maximum:-1}),def(["sentence","se"],(function(e,t){for(var r=[],n=0;n<arguments.length;++n){var o=arguments[n];"list"===Type(o)?(o=lexpr(o),r=r.concat(o)):r.push(o)}return r}),{minimum:0,maximum:-1}),def("fput",(function(e,t){var r=lexpr(t);return r.unshift(e),sifw(t,r)})),def("lput",(function(e,t){var r=lexpr(t);return r.push(e),sifw(t,r)})),def("array",(function(e){if((e=aexpr(e))<1)throw err("{_PROC_}: Array size must be positive integer",ERRORS.BAD_INPUT);var t=arguments.length<2?1:aexpr(arguments[1]);return new LogoArray(e,t)}),{maximum:2}),def("mdarray",(function(e){if((e=lexpr(e).map(aexpr).map((function(e){return 0|e}))).some((function(e){return e<1})))throw err("{_PROC_}: Array size must be positive integer",ERRORS.BAD_INPUT);var t=arguments.length<2?1:aexpr(arguments[1]);function r(n){var o=e[n],i=new LogoArray(o,t);if(n+1<e.length)for(var s=0;s<o;++s)i.setItem(s+t,r(n+1));return i}return r(0)}),{maximum:2}),def("listtoarray",(function(e){e=lexpr(e);var t=1;return arguments.length>1&&(t=aexpr(arguments[1])),LogoArray.from(e,t)}),{maximum:2}),def("arraytolist",(function(e){if("array"!==Type(e))throw err("{_PROC_}: Expected array",ERRORS.BAD_INPUT);return e.list.slice()})),def("combine",(function(e,t){return"list"!==Type(t)?this.routines.get("word")(e,t):this.routines.get("fput")(e,t)})),def("reverse",(function(e){var t=arguments.length>1?arguments[1]:"list"===Type(e)?[]:"";return sifw(t,lexpr(e).reverse().concat(lexpr(t)))}),{maximum:2}),this.gensym_index=0,def("gensym",(function(){return++this.gensym_index,"G"+this.gensym_index})),def("first",(function(e){return lexpr(e)[0]})),def("firsts",(function(e){return lexpr(e).map((function(e){return e[0]}))})),def("last",(function(e){return(e=lexpr(e))[e.length-1]})),def(["butfirst","bf"],(function(e){return sifw(e,lexpr(e).slice(1))})),def(["butfirsts","bfs"],(function(e){return lexpr(e).map((function(e){return sifw(e,lexpr(e).slice(1))}))})),def(["butlast","bl"],(function(e){return"word"===Type(e)?String(e).slice(0,-1):lexpr(e).slice(0,-1)})),def("item",(function(e,t){return item(e=0|aexpr(e),t)})),def("mditem",(function(e,t){for(e=lexpr(e).map(aexpr).map((function(e){return 0|e}));e.length;)t=item(e.shift(),t);return t})),def("pick",(function(e){return(e=lexpr(e))[Math.floor(this.prng.next()*e.length)]})),def("remove",(function(e,t){return sifw(t,lexpr(t).filter((function(t){return!equal(t,e)})))})),def("remdup",(function(e){var t=new Set;return sifw(e,lexpr(e).filter((function(e){return!t.has(e)&&(t.add(e),!0)})))})),def("split",(function(e,t){lexpr(t);return lexpr(t).reduce((function(t,r){return equal(r,e)?t.push([]):t[t.length-1].push(r),t}),[[]]).filter((function(e){return e.length>0})).map((function(e){return sifw(t,e)}))})),def("quoted",(function(e){return"word"===Type(e)?'"'+e:e})),def("setitem",(function(e,t,r){if(e=aexpr(e),"array"!==Type(t))throw err("{_PROC_}: Expected array",ERRORS.BAD_INPUT);if(contains(r,t))throw err("{_PROC_}: Can't create circular array",ERRORS.BAD_INPUT);t.setItem(e,r)})),def("mdsetitem",(function(e,t,r){if(e=lexpr(e).map(aexpr).map((function(e){return 0|e})),"array"!==Type(t))throw err("{_PROC_}: Expected array",ERRORS.BAD_INPUT);if(contains(r,t))throw err("{_PROC_}: Can't create circular array",ERRORS.BAD_INPUT);for(;e.length>1;)if("array"!==Type(t=item(e.shift(),t)))throw err("{_PROC_}: Expected array",ERRORS.BAD_INPUT);t.setItem(e.shift(),r)})),def(".setfirst",(function(e,t){if("list"!==Type(e))throw err("{_PROC_}: Expected list",ERRORS.BAD_INPUT);e[0]=t})),def(".setbf",(function(e,t){if("list"!==Type(e))throw err("{_PROC_}: Expected non-empty list",ERRORS.BAD_INPUT);if(e.length<1)throw err("{_PROC_}: Expected non-empty list",ERRORS.BAD_INPUT);t=lexpr(t),e.length=1,e.push.apply(e,t)})),def(".setitem",(function(e,t,r){if(e=aexpr(e),"array"!==Type(t))throw err("{_PROC_}: Expected array",ERRORS.BAD_INPUT);t.setItem(e,r)})),def("push",(function(e,t){var r=getvar(e),n=lexpr(r);n.unshift(t),setvar(e,sifw(r,n))})),def("pop",(function(e){var t=getvar(e),r=lexpr(t),n=r.shift();return setvar(e,sifw(t,r)),n})),def("queue",(function(e,t){var r=getvar(e),n=lexpr(r);n.push(t),setvar(e,sifw(r,n))})),def("dequeue",(function(e){var t=getvar(e),r=lexpr(t),n=r.pop();return setvar(e,sifw(t,r)),n})),def(["wordp","word?"],(function(e){return"word"===Type(e)?1:0})),def(["listp","list?"],(function(e){return"list"===Type(e)?1:0})),def(["arrayp","array?"],(function(e){return"array"===Type(e)?1:0})),def(["numberp","number?"],(function(e){return"word"===Type(e)&&isNumber(e)?1:0})),def(["numberwang"],(function(e){return this.prng.next()<.5?1:0})),def(["equalp","equal?"],(function(e,t){return equal(e,t)?1:0})),def(["notequalp","notequal?"],(function(e,t){return equal(e,t)?0:1})),def(["emptyp","empty?"],(function(e){switch(Type(e)){case"word":return 0===String(e).length?1:0;case"list":return 0===e.length?1:0;default:return 0}})),def(["beforep","before?"],(function(e,t){return sexpr(e)<sexpr(t)?1:0})),def(".eq",(function(e,t){return e===t&&e&&"object"==typeof e})),def(["memberp","member?"],(function(e,t){return lexpr(t).some((function(t){return equal(t,e)}))?1:0})),def(["substringp","substring?"],(function(e,t){return-1!==sexpr(t).indexOf(sexpr(e))?1:0})),def("count",(function(e){return"array"===Type(e)?e.length:lexpr(e).length})),def("ascii",(function(e){return sexpr(e).charCodeAt(0)})),def("char",(function(e){return String.fromCharCode(aexpr(e))})),def("member",(function(e,t){var r=lexpr(t),n=r.findIndex((function(t){return equal(t,e)}));return sifw(t,r=-1===n?[]:r.slice(n))})),def("lowercase",(function(e){return sexpr(e).toLowerCase()})),def("uppercase",(function(e){return sexpr(e).toUpperCase()})),def("standout",(function(e){return sexpr(e).split("").map((function(e){var t=e.charCodeAt(0);if("A"<=e&&e<="Z")t=t-65+119808;else if("a"<=e&&e<="z")t=t-97+119834;else{if(!("0"<=e&&e<="9"))return e;t=t-48+120782}var r=55296+(t-65536>>10),n=56320+(t-65536&1023);return String.fromCharCode(r,n)})).join("")})),def("parse",(function(e){return parse("["+sexpr(e)+"]")[0]})),def("runparse",(function(e){return parse(sexpr(e))})),def(["print","pr"],(function(e){var t=Array.from(arguments).map(stringify_nodecorate).join(" ");this.stream.write(t,"\n")}),{minimum:0,maximum:-1}),def("type",(function(e){var t=Array.from(arguments).map(stringify_nodecorate).join("");this.stream.write(t)}),{minimum:0,maximum:-1}),def("show",(function(e){var t=Array.from(arguments).map(stringify).join(" ");this.stream.write(t,"\n")}),{minimum:0,maximum:-1}),def("readlist",(function(){return(arguments.length>0?stream.read(stringify_nodecorate(arguments[0])):stream.read()).then((function(e){return parse("["+e+"]")[0]}))}),{maximum:1}),def("readword",(function(){return arguments.length>0?stream.read(stringify_nodecorate(arguments[0])):stream.read()}),{maximum:1}),def(["cleartext","ct"],(function(){this.stream.clear()})),def("settextcolor",(function(e){this.stream.color=parseColor(e)})),def("textcolor",(function(){return this.stream.color})),def("increasefont",(function(){this.stream.textsize=Math.round(1.25*this.stream.textsize)})),def("decreasefont",(function(){this.stream.textsize=Math.round(this.stream.textsize/1.25)})),def("settextsize",(function(e){this.stream.textsize=aexpr(e)})),def("textsize",(function(){return this.stream.textsize})),def("setfont",(function(e){this.stream.font=sexpr(e)})),def("font",(function(){return this.stream.font})),def("sum",(function(e,t){return Array.from(arguments).map(aexpr).reduce((function(e,t){return e+t}),0)}),{minimum:0,maximum:-1}),def("difference",(function(e,t){return aexpr(e)-aexpr(t)})),def("minus",(function(e){return-aexpr(e)})),def("product",(function(e,t){return Array.from(arguments).map(aexpr).reduce((function(e,t){return e*t}),1)}),{minimum:0,maximum:-1}),def("quotient",(function(e,t){return void 0!==t?aexpr(e)/aexpr(t):1/aexpr(e)}),{minimum:1}),def("remainder",(function(e,t){return aexpr(e)%aexpr(t)})),def("modulo",(function(e,t){return e=aexpr(e),t=aexpr(t),Math.abs(e%t)*(t<0?-1:1)})),def("power",(function(e,t){return Math.pow(aexpr(e),aexpr(t))})),def("sqrt",(function(e){return Math.sqrt(aexpr(e))})),def("exp",(function(e){return Math.exp(aexpr(e))})),def("log10",(function(e){return Math.log(aexpr(e))/Math.LN10})),def("ln",(function(e){return Math.log(aexpr(e))})),def("arctan",(function(e){if(arguments.length>1){var t=aexpr(arguments[0]),r=aexpr(arguments[1]);return rad2deg(Math.atan2(r,t))}return rad2deg(Math.atan(aexpr(e)))}),{maximum:2}),def("sin",(function(e){return Math.sin(deg2rad(aexpr(e)))})),def("cos",(function(e){return Math.cos(deg2rad(aexpr(e)))})),def("tan",(function(e){return Math.tan(deg2rad(aexpr(e)))})),def("radarctan",(function(e){if(arguments.length>1){var t=aexpr(arguments[0]),r=aexpr(arguments[1]);return Math.atan2(r,t)}return Math.atan(aexpr(e))}),{maximum:2}),def("radsin",(function(e){return Math.sin(aexpr(e))})),def("radcos",(function(e){return Math.cos(aexpr(e))})),def("radtan",(function(e){return Math.tan(aexpr(e))})),def("abs",(function(e){return Math.abs(aexpr(e))})),def("int",(function(e){return truncate(aexpr(e))})),def("round",(function(e){return Math.round(aexpr(e))})),def("iseq",(function(e,t){for(var r=(e=truncate(aexpr(e)))<(t=truncate(aexpr(t)))?1:-1,n=[],o=e;r>0?o<=t:o>=t;o+=r)n.push(o);return n})),def("rseq",(function(e,t,r){e=aexpr(e);for(var n=((t=aexpr(t))-e)/((r=truncate(aexpr(r)))-1),o=[],i=e;n>0?i<=t:i>=t;i+=n)o.push(i);return o})),def(["greaterp","greater?"],(function(e,t){return aexpr(e)>aexpr(t)?1:0})),def(["greaterequalp","greaterequal?"],(function(e,t){return aexpr(e)>=aexpr(t)?1:0})),def(["lessp","less?"],(function(e,t){return aexpr(e)<aexpr(t)?1:0})),def(["lessequalp","lessequal?"],(function(e,t){return aexpr(e)<=aexpr(t)?1:0})),def("random",(function(e){if(arguments.length<2)return e=aexpr(e),Math.floor(this.prng.next()*e);var t=aexpr(arguments[0]),r=aexpr(arguments[1]);return Math.floor(this.prng.next()*(r-t+1))+t}),{maximum:2}),def("rerandom",(function(){var e=arguments.length>0?aexpr(arguments[0]):2345678901;return this.prng.seed(e)}),{maximum:1}),def("form",(function(e,t,r){e=aexpr(e),t=aexpr(t),r=aexpr(r);var n=e.toFixed(r);return n.length<t&&(n=Array(1+t-n.length).join(" ")+n),n})),def("bitand",(function(e,t){return Array.from(arguments).map(aexpr).reduce((function(e,t){return e&t}),-1)}),{minimum:0,maximum:-1}),def("bitor",(function(e,t){return Array.from(arguments).map(aexpr).reduce((function(e,t){return e|t}),0)}),{minimum:0,maximum:-1}),def("bitxor",(function(e,t){return Array.from(arguments).map(aexpr).reduce((function(e,t){return e^t}),0)}),{minimum:0,maximum:-1}),def("bitnot",(function(e){return~aexpr(e)})),def("ashift",(function(e,t){return e=truncate(aexpr(e)),(t=truncate(aexpr(t)))>=0?e<<t:e>>-t})),def("lshift",(function(e,t){return e=truncate(aexpr(e)),(t=truncate(aexpr(t)))>=0?e<<t:e>>>-t})),def("true",(function(){return 1})),def("false",(function(){return 0})),def("and",(function(e,t){var r=Array.from(arguments);return booleanReduce(r,(function(e){return e}),1)}),{noeval:!0,minimum:0,maximum:-1}),def("or",(function(e,t){var r=Array.from(arguments);return booleanReduce(r,(function(e){return!e}),0)}),{noeval:!0,minimum:0,maximum:-1}),def("xor",(function(e,t){return Array.from(arguments).map(aexpr).reduce((function(e,t){return Boolean(e)!==Boolean(t)}),0)?1:0}),{minimum:0,maximum:-1}),def("not",(function(e){return aexpr(e)?0:1})),def(["forward","fd"],(function(e){return turtle.move(aexpr(e))})),def(["back","bk"],(function(e){return turtle.move(-aexpr(e))})),def(["left","lt"],(function(e){return turtle.turn(-aexpr(e))})),def(["right","rt"],(function(e){return turtle.turn(aexpr(e))})),def(["←"],(function(){return turtle.turn(-15)})),def(["→"],(function(){return turtle.turn(15)})),def(["↑"],(function(){return turtle.move(10)})),def(["↓"],(function(){return turtle.move(-10)})),def("setpos",(function(e){if(2!==(e=lexpr(e)).length)throw err("{_PROC_}: Expected list of length 2",ERRORS.BAD_INPUT);turtle.position=[aexpr(e[0]),aexpr(e[1])]})),def("setxy",(function(e,t){turtle.position=[aexpr(e),aexpr(t)]})),def("setx",(function(e){turtle.position=[aexpr(e),void 0]})),def("sety",(function(e){turtle.position=[void 0,aexpr(e)]})),def(["setheading","seth"],(function(e){turtle.heading=aexpr(e)})),def("home",(function(){return turtle.home()})),def("arc",(function(e,t){return turtle.arc(aexpr(e),aexpr(t))})),def("pos",(function(){return turtle.position})),def("xcor",(function(){return turtle.position[0]})),def("ycor",(function(){return turtle.position[1]})),def("heading",(function(){return turtle.heading})),def("towards",(function(e){if(2!==(e=lexpr(e)).length)throw err("{_PROC_}: Expected list of length 2",ERRORS.BAD_INPUT);return turtle.towards(aexpr(e[0]),aexpr(e[1]))})),def("scrunch",(function(){return turtle.scrunch})),def(["showturtle","st"],(function(){turtle.visible=!0})),def(["hideturtle","ht"],(function(){turtle.visible=!1})),def("clean",(function(){turtle.clear()})),def(["clearscreen","cs"],(function(){turtle.clearscreen()})),def("wrap",(function(){turtle.turtlemode="wrap"})),def("window",(function(){turtle.turtlemode="window"})),def("fence",(function(){turtle.turtlemode="fence"})),def("fill",(function(){turtle.fill()})),def("filled",(function(e,t){return e=sexpr(parseColor(e)),t=reparse(lexpr(t)),turtle.beginpath(),promiseFinally(this.execute(t),(function(){turtle.fillpath(e)}))})),def("label",(function(e){var t=Array.from(arguments).map(stringify_nodecorate).join(" ");return turtle.drawtext(t)}),{maximum:-1}),def("setlabelheight",(function(e){turtle.fontsize=aexpr(e)})),def("setlabelfont",(function(e){turtle.fontname=sexpr(e)})),def("setscrunch",(function(e,t){if(e=aexpr(e),t=aexpr(t),!isFinite(e)||0===e||!isFinite(t)||0===t)throw err("{_PROC_}: Expected non-zero values",ERRORS.BAD_INPUT);turtle.scrunch=[e,t]})),def(["shownp","shown?"],(function(){return turtle.visible?1:0})),def("turtlemode",(function(){return turtle.turtlemode.toUpperCase()})),def("labelsize",(function(){return[turtle.fontsize,turtle.fontsize]})),def("labelfont",(function(){return turtle.fontname})),def(["pendown","pd"],(function(){turtle.pendown=!0})),def(["penup","pu"],(function(){turtle.pendown=!1})),def(["penpaint","ppt"],(function(){turtle.penmode="paint"})),def(["penerase","pe"],(function(){turtle.penmode="erase"})),def(["penreverse","px"],(function(){turtle.penmode="reverse"})),this.colorAlias=null;var PALETTE={0:"black",1:"blue",2:"lime",3:"cyan",4:"red",5:"magenta",6:"yellow",7:"white",8:"brown",9:"tan",10:"green",11:"aquamarine",12:"salmon",13:"purple",14:"orange",15:"gray"};function parseColor(e){function t(e){return e=Math.min(99,Math.max(0,Math.floor(e))),Math.floor(255*e/99)}if("list"===Type(e)){var r=t(aexpr(e[0])),n=t(aexpr(e[1])),o=t(aexpr(e[2]));return"#"+((r<16?"0":"")+r.toString(16))+((n<16?"0":"")+n.toString(16))+((o<16?"0":"")+o.toString(16))}return e=sexpr(e),PALETTE.hasOwnProperty(e)?PALETTE[e]:self.colorAlias&&self.colorAlias(e)||e}function checkevalblock(e){if("list"===Type(e=e()))return e;throw err("{_PROC_}: Expected block",ERRORS.BAD_INPUT)}def(["setpencolor","setpc","setcolor"],(function(e){turtle.color=parseColor(e)})),def("setpalette",(function(e,t){if((e=aexpr(e))<8)throw err("{_PROC_}: Expected number greater than 8",ERRORS.BAD_INPUT);PALETTE[e]=parseColor(t)})),def(["setpensize","setwidth","setpw"],(function(e){"list"===Type(e)?turtle.penwidth=aexpr(e[0]):turtle.penwidth=aexpr(e)})),def(["setbackground","setbg","setscreencolor","setsc"],(function(e){turtle.bgcolor=parseColor(e)})),def(["pendownp","pendown?"],(function(){return turtle.pendown?1:0})),def("penmode",(function(){return turtle.penmode.toUpperCase()})),def(["pencolor","pc"],(function(){return turtle.color})),def("palette",(function(e){return PALETTE[aexpr(e)]})),def("pensize",(function(){return[turtle.penwidth,turtle.penwidth]})),def(["background","bg","getscreencolor","getsc"],(function(){return turtle.bgcolor})),def("mousepos",(function(){return turtle.mousepos})),def("clickpos",(function(){return turtle.clickpos})),def(["buttonp","button?"],(function(){return turtle.button>0?1:0})),def("button",(function(){return turtle.button})),def("define",(function(e,t){if(e=sexpr(e),2!=(t=lexpr(t)).length)throw err("{_PROC_}: Expected list of length 2",ERRORS.BAD_INPUT);for(var r=[],n=[],o=void 0,i=void 0,s=reparse(lexpr(t[1])),a=lexpr(t[0]),l=0;a.length;){var c=a.shift();if(0===l){if("word"===Type(c)){r.push(c);continue}l=1}if(1===l){if("list"===Type(c)&&c.length>1&&"word"===Type(c[0])){n.push([c.shift(),c]);continue}l=2}if(2!==l||(l=3,"list"!==Type(c)||1!==c.length||"word"!==Type(c[0]))){if(3!==l||(l=4,"word"!==Type(c)||!isNumber(c)))throw err("{_PROC_}: Unexpected inputs",ERRORS.BAD_INPUT);i=parseFloat(c)}else o=c[0]}defineProc(e,r,n,o,i,s)})),def("text",(function(e){var t=this.routines.get(sexpr(e));if(!t)throw err("{_PROC_}: Don't know how to {name:U}",{name:e},ERRORS.BAD_PROC);if(!t.inputs)throw err("{_PROC_}: Can't show definition of primitive {name:U}",{name:e},ERRORS.IS_PRIMITIVE);var r=t.inputs.concat(t.optional_inputs);return t.rest&&r.push([t.rest]),void 0!==t.def&&r.push(t.def),[r,t.block]})),def("copydef",(function(e,t){if(e=sexpr(e),t=sexpr(t),!this.routines.has(t))throw err("{_PROC_}: Don't know how to {name:U}",{name:t},ERRORS.BAD_PROC);if(this.routines.has(e)){if(this.routines.get(e).special)throw err("{_PROC_}: Can't overwrite special {name:U}",{name:e},ERRORS.BAD_INPUT);if(this.routines.get(e).primitive&&!maybegetvar("redefp"))throw err("{_PROC_}: Can't overwrite primitives unless REDEFP is TRUE",ERRORS.BAD_INPUT)}this.routines.set(e,this.routines.get(t))})),def("make",(function(e,t){setvar(sexpr(e),t)})),def("name",(function(e,t){setvar(sexpr(t),e)})),def("local",(function(e){Array.from(arguments).forEach((function(e){local(sexpr(e))}))}),{maximum:-1}),def("localmake",(function(e,t){setlocal(sexpr(e),t)})),def("thing",(function(e){return getvar(sexpr(e))})),def("global",(function(e){var t=this.scopes[0];Array.from(arguments).forEach((function(e){t.set(sexpr(e),{value:void 0})}))}),{maximum:-1}),def("pprop",(function(e,t,r){e=sexpr(e),t=sexpr(t);var n=this.plists.get(e);n||(n=new StringMap(!0),this.plists.set(e,n)),n.set(t,r)})),def("gprop",(function(e,t){e=sexpr(e),t=sexpr(t);var r=this.plists.get(e);return r&&r.has(t)?r.get(t):[]})),def("remprop",(function(e,t){e=sexpr(e),t=sexpr(t);var r=this.plists.get(e);r&&(r.delete(t),r.empty()&&this.plists.delete(e))})),def("plist",(function(e){e=sexpr(e);var t=this.plists.get(e);if(!t)return[];var r=[];return t.forEach((function(e,t){r.push(e),r.push(copy(t))})),r})),def(["procedurep","procedure?"],(function(e){return e=sexpr(e),this.routines.has(e)?1:0})),def(["primitivep","primitive?"],(function(e){return e=sexpr(e),this.routines.has(e)&&this.routines.get(e).primitive?1:0})),def(["definedp","defined?"],(function(e){return e=sexpr(e),this.routines.has(e)&&!this.routines.get(e).primitive?1:0})),def(["namep","name?"],(function(e){try{return void 0!==getvar(sexpr(e))?1:0}catch(e){return 0}})),def(["plistp","plist?"],(function(e){return e=sexpr(e),this.plists.has(e)?1:0})),def("contents",(function(){return[this.routines.keys().filter(function(e){return!this.routines.get(e).primitive&&!this.routines.get(e).buried}.bind(this)),this.scopes.reduce((function(e,t){return e.concat(t.keys().filter((function(e){return!t.get(e).buried})))}),[]),this.plists.keys().filter(function(e){return!this.plists.get(e).buried}.bind(this))]})),def("buried",(function(){return[this.routines.keys().filter(function(e){return!this.routines.get(e).primitive&&this.routines.get(e).buried}.bind(this)),this.scopes.reduce((function(e,t){return e.concat(t.keys().filter((function(e){return t.get(e).buried})))}),[]),this.plists.keys().filter(function(e){return this.plists.get(e).buried}.bind(this))]})),def("traced",(function(){return[this.routines.keys().filter(function(e){return!this.routines.get(e).primitive&&this.routines.get(e).traced}.bind(this)),this.scopes.reduce((function(e,t){return e.concat(t.keys().filter((function(e){return t.get(e).traced})))}),[]),this.plists.keys().filter(function(e){return this.plists.get(e).traced}.bind(this))]})),def(["stepped"],(function(){return[this.routines.keys().filter(function(e){return!this.routines.get(e).primitive&&this.routines.get(e).stepped}.bind(this)),this.scopes.reduce((function(e,t){return e.concat(t.keys().filter((function(e){return t.get(e).stepped})))}),[]),this.plists.keys().filter(function(e){return this.plists.get(e).stepped}.bind(this))]})),def("procedures",(function(){return this.routines.keys().filter(function(e){return!this.routines.get(e).primitive&&!this.routines.get(e).buried}.bind(this))})),def("primitives",(function(){return this.routines.keys().filter(function(e){return this.routines.get(e).primitive&!this.routines.get(e).buried}.bind(this))})),def("globals",(function(){var e=this.scopes[0];return e.keys().filter((function(t){return!e.get(t).buried}))})),def("names",(function(){return[[],this.scopes.reduce((function(e,t){return e.concat(t.keys().filter((function(e){return!t.get(e).buried})))}),[])]})),def("plists",(function(){return[[],[],this.plists.keys().filter(function(e){return!this.plists.get(e).buried}.bind(this))]})),def("namelist",(function(e){return[[],e="list"===Type(e)?lexpr(e):[sexpr(e)]]})),def("pllist",(function(e){return[[],[],e="list"===Type(e)?lexpr(e):[sexpr(e)]]})),def("arity",(function(e){e=sexpr(e);var t=this.routines.get(e);if(!t)throw err("{_PROC_}: Don't know how to {name:U}",{name:e},ERRORS.BAD_PROC);return t.special?[-1,-1,-1]:[t.minimum,t.default,t.maximum]})),def("erase",(function(e){(e=lexpr(e)).length&&lexpr(e.shift()).forEach(function(e){if(e=sexpr(e),this.routines.has(e)){if(this.routines.get(e).special)throw err("Can't {_PROC_} special {name:U}",{name:e},ERRORS.BAD_INPUT);if(this.routines.get(e).primitive&&!maybegetvar("redefp"))throw err("Can't {_PROC_} primitives unless REDEFP is TRUE",ERRORS.BAD_INPUT);this.routines.delete(e),savehook&&savehook(e)}}.bind(this));if(e.length){var t=lexpr(e.shift());this.scopes.forEach((function(e){t.forEach((function(t){t=sexpr(t),e.delete(t)}))}))}e.length&&lexpr(e.shift()).forEach(function(e){e=sexpr(e),this.plists.delete(e)}.bind(this))})),def("erall",(function(){this.routines.keys().filter(function(e){return!this.routines.get(e).primitive&&!this.routines.get(e).buried}.bind(this)).forEach(function(e){this.routines.delete(e),savehook&&savehook(e)}.bind(this)),this.scopes.forEach((function(e){e.keys().filter((function(t){return!e.get(t).buried})).forEach((function(t){e.delete(t)}))})),this.plists.keys().filter(function(e){return!this.plists.get(e).buried}.bind(this)).forEach(function(e){this.plists.delete(e)}.bind(this))})),def("erps",(function(){this.routines.keys().filter(function(e){return!this.routines.get(e).primitive&&!this.routines.get(e).buried}.bind(this)).forEach(function(e){this.routines.delete(e),savehook&&savehook(e)}.bind(this))})),def("erns",(function(){this.scopes.forEach((function(e){e.keys().filter((function(t){return!e.get(t).buried})).forEach((function(t){e.delete(t)}))}))})),def("erpls",(function(){this.plists.keys().filter(function(e){return!this.plists.get(e).buried}.bind(this)).forEach(function(e){this.plists.delete(e)}.bind(this))})),def("ern",(function(e){var t;t="list"===Type(e)?lexpr(e):[sexpr(e)],this.scopes.forEach((function(e){t.forEach((function(t){t=sexpr(t),e.delete(t)}))}))})),def("erpl",(function(e){("list"===Type(e)?lexpr(e):[sexpr(e)]).forEach(function(e){e=sexpr(e),this.plists.delete(e)}.bind(this))})),def("bury",(function(e){(e=lexpr(e)).length&&lexpr(e.shift()).forEach(function(e){e=sexpr(e),this.routines.has(e)&&(this.routines.get(e).buried=!0)}.bind(this));if(e.length){var t=lexpr(e.shift());this.scopes.forEach((function(e){t.forEach((function(t){t=sexpr(t),e.has(t)&&(e.get(t).buried=!0)}))}))}e.length&&lexpr(e.shift()).forEach(function(e){e=sexpr(e),this.plists.has(e)&&(this.plists.get(e).buried=!0)}.bind(this))})),def("buryall",(function(){this.routines.forEach((function(e,t){t.buried=!0})),this.scopes.forEach((function(e){e.forEach((function(e,t){t.buried=!0}))})),this.plists.forEach((function(e,t){t.buried=!0}))})),def("buryname",(function(e){var t=this.routines.get("bury"),r=this.routines.get("namelist");return t.call(this,r.call(this,e))})),def("unbury",(function(e){(e=lexpr(e)).length&&lexpr(e.shift()).forEach(function(e){e=sexpr(e),this.routines.has(e)&&(this.routines.get(e).buried=!1)}.bind(this));if(e.length){var t=lexpr(e.shift());this.scopes.forEach((function(e){t.forEach((function(t){t=sexpr(t),e.has(t)&&(e.get(t).buried=!1)}))}))}e.length&&lexpr(e.shift()).forEach(function(e){e=sexpr(e),this.plists.has(e)&&(this.plists.get(e).buried=!1)}.bind(this))})),def("unburyall",(function(){this.routines.forEach((function(e,t){t.buried=!1})),this.scopes.forEach((function(e){e.forEach((function(e,t){t.buried=!1}))})),this.plists.forEach((function(e,t){t.buried=!1}))})),def("unburyname",(function(e){var t=this.routines.get("unbury"),r=this.routines.get("namelist");return t.call(this,r.call(this,e))})),def(["buriedp","buried?"],(function(e){var t;if((e=lexpr(e)).length){var r=lexpr(e.shift());if(r.length)return t=sexpr(r[0]),this.routines.has(t)&&this.routines.get(t).buried?1:0}if(e.length){var n=lexpr(e.shift());if(n.length)return t=sexpr(n[0]),this.scopes[0].has(t)&&this.scopes[0].get(t).buried?1:0}if(e.length){var o=lexpr(e.shift());if(o.length)return t=sexpr(o[0]),this.plists.has(t)&&this.plists.get(t).buried?1:0}return 0})),def("run",(function(e){return e=reparse(lexpr(e)),this.execute(e,{returnResult:!0})})),def("runresult",(function(e){return e=reparse(lexpr(e)),this.execute(e,{returnResult:!0}).then((function(e){return void 0!==e?[e]:[]}))})),def("repeat",(function(e,t){e=aexpr(e),t=reparse(lexpr(t));var r=this.repcount,n=1;return promiseFinally(promiseLoop(function(r,o,i){n>e?o():(this.repcount=n++,this.execute(t).then(promiseYield).then(r,i))}.bind(this)),function(){this.repcount=r}.bind(this))})),def("forever",(function(e){e=reparse(lexpr(e));var t=this.repcount,r=1;return promiseFinally(promiseLoop(function(t,n,o){this.repcount=r++,this.execute(e).then(promiseYield).then(t,o)}.bind(this)),function(){this.repcount=t}.bind(this))})),def(["repcount","#"],(function(){return this.repcount})),def("if",(function(e,t){"list"===Type(e)&&(e=evaluateExpression(reparse(e)));var r=arguments[2];return Promise.resolve(e).then(function(e){return e=aexpr(e),t=reparse(lexpr(t)),r?(r=reparse(lexpr(r)),this.execute(e?t:r,{returnResult:!0})):e?this.execute(t,{returnResult:!0}):void 0}.bind(this))}),{maximum:3}),def("ifelse",(function(e,t,r){return"list"===Type(e)&&(e=evaluateExpression(reparse(e))),Promise.resolve(e).then(function(e){return e=aexpr(e),t=reparse(lexpr(t)),r=reparse(lexpr(r)),this.execute(e?t:r,{returnResult:!0})}.bind(this))})),def("test",(function(e){return"list"===Type(e)&&(e=evaluateExpression(reparse(e))),Promise.resolve(e).then(function(e){e=aexpr(e),this.scopes[this.scopes.length-1]._test=e}.bind(this))})),def(["iftrue","ift"],(function(e){e=reparse(lexpr(e));var t=this.scopes[this.scopes.length-1]._test;if(void 0===t)throw err("{_PROC_}: Called without TEST",ERRORS.NO_TEST);return t?this.execute(e,{returnResult:!0}):void 0})),def(["iffalse","iff"],(function(e){e=reparse(lexpr(e));var t=this.scopes[this.scopes.length-1]._test;if(void 0===t)throw err("{_PROC_}: Called without TEST",ERRORS.NO_TEST);return t?void 0:this.execute(e,{returnResult:!0})})),def("stop",(function(){throw new Output})),def(["output","op"],(function(e){throw new Output(e)})),this.last_error=void 0,def("catch",(function(e,t){return e=sexpr(e).toUpperCase(),t=reparse(lexpr(t)),this.execute(t,{returnResult:!0}).catch(function(t){if(!(t instanceof LogoError)||t.tag!==e)throw t;return this.last_error=t,t.value}.bind(this))}),{maximum:2}),def("throw",(function(e){e=sexpr(e).toUpperCase();var t=arguments[1],r=new LogoError(e,t);throw r.code=arguments.length>1?ERRORS.USER_GENERATED:ERRORS.THROW_ERROR,r}),{maximum:2}),def("error",(function(){if(!this.last_error)return[];var e=[this.last_error.code,this.last_error.message,this.last_error.proc,this.last_error.line];return this.last_error=void 0,e})),def("wait",(function(e){return promiseYieldTime(aexpr(e)/60*1e3)})),def("bye",(function(){throw new Bye})),def(".maybeoutput",(function(e){throw new Output(e)})),def("ignore",(function(e){})),def("`",(function(e){e=lexpr(e);var t=[];return promiseLoop(function(r,n,o){if(e.length){var i,s=e.shift();","===s&&e.length?("word"===Type(s=e.shift())&&(s=[s]),i=reparse(s),this.execute(i,{returnResult:!0}).then((function(e){t.push(e),r()})).catch(o)):",@"===s&&e.length?("word"===Type(s=e.shift())&&(s=[s]),i=reparse(s),this.execute(i,{returnResult:!0}).then((function(e){t=t.concat(e),r()})).catch(o)):"word"===Type(s)&&/^",/.test(s)?(i=reparse(s.substring(2)),this.execute(i,{returnResult:!0}).then((function(e){t.push('"'+("list"===Type(e)?e[0]:e)),r()})).catch(o)):"word"===Type(s)&&/^:,/.test(s)?(i=reparse(s.substring(2)),this.execute(i,{returnResult:!0}).then((function(e){t.push(":"+("list"===Type(e)?e[0]:e)),r()})).catch(o)):(t.push(s),r())}else n(t)}.bind(this))})),def("for",(function(e,t){function r(e){return e<0?-1:e>0?1:0}e=reparse(lexpr(e)),t=reparse(lexpr(t));var n,o,i,s,a=sexpr(e.shift());return Promise.resolve(evaluateExpression(e)).then((function(t){return s=n=aexpr(t),evaluateExpression(e)})).then((function(t){return o=aexpr(t),e.length?evaluateExpression(e):o<n?-1:1})).then((function(e){i=aexpr(e)})).then(function(){return promiseLoop(function(e,n,l){r(s-o)!==r(i)?(setlocal(a,s),this.execute(t).then((function(){s+=i})).then(promiseYield).then(e,l)):n()}.bind(this))}.bind(this))})),def("dotimes",(function(e,t){e=reparse(lexpr(e)),t=reparse(lexpr(t));var r,n=sexpr(e.shift()),o=1;return Promise.resolve(evaluateExpression(e)).then((function(e){r=aexpr(e)})).then(function(){return promiseLoop(function(e,i,s){o>r?i():(setlocal(n,o),this.execute(t).then((function(){++o})).then(promiseYield).then(e,s))}.bind(this))}.bind(this))})),def("do.while",(function(e,t){return e=checkevalblock(e),promiseLoop(function(r,n,o){this.execute(e).then(t).then((function(e){return"list"===Type(e)&&(e=evaluateExpression(reparse(e))),e})).then((function(e){e?promiseYield().then(r):n()}),o)}.bind(this))}),{noeval:!0}),def("while",(function(e,t){return t=checkevalblock(t),promiseLoop(function(r,n,o){Promise.resolve(e()).then((function(e){return"list"===Type(e)&&(e=evaluateExpression(reparse(e))),e})).then(function(e){e?this.execute(t).then(promiseYield).then(r):n()}.bind(this),o)}.bind(this))}),{noeval:!0}),def("do.until",(function(e,t){return e=checkevalblock(e),promiseLoop(function(r,n,o){this.execute(e).then(t).then((function(e){return"list"===Type(e)&&(e=evaluateExpression(reparse(e))),e})).then((function(e){e?n():promiseYield().then(r)}),o)}.bind(this))}),{noeval:!0}),def("until",(function(e,t){return t=checkevalblock(t),promiseLoop(function(r,n,o){Promise.resolve(e()).then((function(e){return"list"===Type(e)&&(e=evaluateExpression(reparse(e))),e})).then(function(e){e?n():this.execute(t).then(promiseYield).then(r)}.bind(this),o)}.bind(this))}),{noeval:!0}),def("case",(function(e,t){t=lexpr(t);for(var r=0;r<t.length;++r){var n=lexpr(t[r]),o=n.shift();if(isKeyword(o,"ELSE"))return evaluateExpression(n);if(lexpr(o).some((function(t){return equal(t,e)})))return evaluateExpression(n)}})),def("cond",(function(e){return e=lexpr(e),promiseLoop((function(t,r,n){if(e.length){var o=lexpr(e.shift()),i=o.shift();isKeyword(i,"ELSE")?r(evaluateExpression(o)):evaluateExpression(reparse(lexpr(i))).then((function(e){e?r(evaluateExpression(o)):t()}),n)}else r()}))})),def("apply",(function(e,t){e=sexpr(e);var r=this.routines.get(e);if(!r)throw err("{_PROC_}: Don't know how to {name:U}",{name:e},ERRORS.BAD_PROC);if(r.special||r.noeval)throw err("Can't apply {_PROC_} to special {name:U}",{name:e},ERRORS.BAD_INPUT);return r.apply(this,lexpr(t))})),def("invoke",(function(e,t){e=sexpr(e);var r=this.routines.get(e);if(!r)throw err("{_PROC_}: Don't know how to {name:U}",{name:e},ERRORS.BAD_PROC);if(r.special||r.noeval)throw err("Can't apply {_PROC_} to special {name:U}",{name:e},ERRORS.BAD_INPUT);for(var n=[],o=1;o<arguments.length;++o)n.push(arguments[o]);return r.apply(this,n)}),{minimum:1,maximum:-1}),def("foreach",(function(e,t){e=sexpr(e);var r=this.routines.get(e);if(!r)throw err("{_PROC_}: Don't know how to {name:U}",{name:e},ERRORS.BAD_PROC);if(r.special||r.noeval)throw err("Can't apply {_PROC_} to special {name:U}",{name:e},ERRORS.BAD_INPUT);return t=lexpr(t),promiseLoop((function(e,n,o){t.length?Promise.resolve(r(t.shift())).then(e,o):n()}))})),def("map",(function(e,t){e=sexpr(e);var r=this.routines.get(e);if(!r)throw err("{_PROC_}: Don't know how to {name:U}",{name:e},ERRORS.BAD_PROC);if(r.special||r.noeval)throw err("Can't apply {_PROC_} to special {name:U}",{name:e},ERRORS.BAD_INPUT);var n=[].slice.call(arguments,1).map(lexpr);if(!n.length)throw err("{_PROC_}: Expected list",ERRORS.BAD_INPUT);var o=[];return promiseLoop(function(e,t,i){if(n[0].length){var s=n.map((function(e){if(!e.length)throw err("{_PROC_}: Expected lists of equal length",ERRORS.BAD_INPUT);return e.shift()}));Promise.resolve(r.apply(this,s)).then((function(e){o.push(e)})).then(e,i)}else t(o)}.bind(this))}),{maximum:-1}),def("filter",(function(e,t){e=sexpr(e);var r=this.routines.get(e);if(!r)throw err("{_PROC_}: Don't know how to {name:U}",{name:e},ERRORS.BAD_PROC);if(r.special||r.noeval)throw err("Can't apply {_PROC_} to special {name:U}",{name:e},ERRORS.BAD_INPUT);t=lexpr(t);var n=[];return promiseLoop((function(e,o,i){if(t.length){var s=t.shift();Promise.resolve(r(s)).then((function(e){e&&n.push(s)})).then(e,i)}else o(n)}))})),def("find",(function(e,t){e=sexpr(e);var r=this.routines.get(e);if(!r)throw err("{_PROC_}: Don't know how to {name:U}",{name:e},ERRORS.BAD_PROC);if(r.special||r.noeval)throw err("Can't apply {_PROC_} to special {name:U}",{name:e},ERRORS.BAD_INPUT);return t=lexpr(t),promiseLoop((function(e,n,o){if(t.length){var i=t.shift();Promise.resolve(r(i)).then((function(t){t?n(i):e()}),o)}else n([])}))})),def("reduce",(function(e,t){e=sexpr(e),t=lexpr(t);var r=void 0!==arguments[2]?arguments[2]:t.shift(),n=this.routines.get(e);if(!n)throw err("{_PROC_}: Don't know how to {name:U}",{name:e},ERRORS.BAD_PROC);if(n.special||n.noeval)throw err("Can't apply {_PROC_} to special {name:U}",{name:e},ERRORS.BAD_INPUT);return promiseLoop(function(e,o,i){t.length?Promise.resolve(n.call(this,r,t.shift())).then((function(e){r=e})).then(e,i):o(r)}.bind(this))}),{maximum:3}),def("crossmap",(function(e,t){e=sexpr(e);var r=this.routines.get(e);if(!r)throw err("{_PROC_}: Don't know how to {name:U}",{name:e},ERRORS.BAD_PROC);if(r.special||r.noeval)throw err("Can't apply {_PROC_} to special {name:U}",{name:e},ERRORS.BAD_INPUT);var n=[].slice.call(arguments,1).map(lexpr);if(!n.length)throw err("{_PROC_}: Expected list",ERRORS.BAD_INPUT);1===n.length&&(n=n[0].map(lexpr));var o=n.map((function(){return 0})),i=!1,s=[];return promiseLoop(function(e,t,a){if(i)t(s);else{var l=o.map((function(e,t){return n[t][e]})),c=o.length-1;for(++o[c];o[c]===n[c].length;){if(0===c){i=!0;break}o[c]=0,c--,++o[c]}Promise.resolve(r.apply(this,l)).then((function(e){s.push(e)})).then(e,a)}}.bind(this))}),{maximum:-1}),def(".promise",(function(e){return Promise.resolve(e)}))}window.LogoInterpreter=LogoInterpreter},function(e,t,r){"use strict";r.r(t),t.default='to ellipse :w :h\n localmake "initxcor xcor\n localmake "initycor ycor\n localmake "initangle 0\n localmake "x_pos (:initxcor + ((sin :initangle) * :w/2))\n localmake "y_pos (:initycor + ((cos :initangle) * :h/2))\n repeat 36[\n penup\n setxy :x_pos :y_pos\n pendown\n localmake "angle (:initangle + (repcount*10))\n localmake "x_pos (:initxcor +((sin :angle) * :w/2))\n localmake "y_pos (:initycor +((cos :angle) * :h/2))\n setxy :x_pos :y_pos\n ]\n penup\n setxy :initxcor :initycor\n pendown\nend\n'},function(e,t,r){"use strict";function n(e){return document.querySelector(e)}Object.defineProperty(t,"__esModule",{value:!0}),r(241),r(242);t.LogoOutputGraphics=class{constructor(e,t){this.sandBoxSelector=e,this.turtleSelector=t}init(e){const t=window.CanvasTurtle,r=n(this.sandBoxSelector),o=r.getContext("2d"),i=n(this.turtleSelector);return this.width=r.width,this.height=r.height,this.turtle=new t(o,this.width,this.height,void 0,{turtleElement:i,turtleSize:e}),this.turtle}resizeCanvas(e,t){if(!t||!e)return;if(e=Math.trunc(e),(t=Math.trunc(t))===this.height&&e===this.width)return;this.width=e,this.height=t;const r=n(this.sandBoxSelector);r.width=e,r.height=t}createScreenshot(e){const t=n(this.sandBoxSelector);return t?e?this.prepareThumbnail(t):t.toDataURL("image/jpeg",1):""}prepareThumbnail(e){const t=200,r=150;let n=Math.min(400,e.width),o=3*n/4;o>e.height&&(o=e.height,n=4*o/3);const i={x:(e.width-n)/2,y:(e.height-o)/2},s=document.createElement("canvas"),a=s.getContext("2d");return a?(s.width=t,s.height=r,a.drawImage(e,i.x,i.y,n,o,0,0,t,r),s.toDataURL("image/jpeg",1)):""}}},function(e,t){CanvasRenderingContext2D.prototype.floodFill=function(e,t){var r=this,n=r.canvas,o=n.width,i=n.height,s=[0,-1,1,0],a=[-1,0,0,1];function l(e,t){var n=r.getImageData(e,t,o,i).data;return n[3]<<24|n[0]<<16|n[1]<<8|n[2]}var c=l(e|=0,t|=0);r.fillRect(e,t,1,1);var u=l(e,t);if(c!==u){var p=c>>24&255,d=c>>16&255,h=c>>8&255,m=255&c,f=u>>24&255,g=u>>16&255,y=u>>8&255,v=255&u,E=r.getImageData(0,0,o,i),S=E.data,w=[];for(w.push(e),w.push(t);w.length>0;)for(var T=w.pop(),x=w.pop(),_=0;_<4;_++){var b=x+s[_],C=T+a[_];if(!(b<0||C<0||b>=o||C>=i)){var P=4*(C*o+b);S[P+0]==d&&S[P+1]==h&&S[P+2]==m&&S[P+3]==p&&(S[P++]=g,S[P++]=y,S[P++]=v,S[P]=f,w.push(b),w.push(C))}}r.putImageData(E,0,0)}}},function(e,t){!function(e){"use strict";function t(e){return e/180*Math.PI}function r(e){return 180*e/Math.PI}function n(e,t){return e=Number(e),t=String(t).toLowerCase(),-1===["serif","sans-serif","cursive","fantasy","monospace"].indexOf(t)&&(t=JSON.stringify(t)),String(e)+"px "+t}function o(e,t){var r=e%t;return r<0?r+t:r}function i(e,t,r,n,o){e.fillText=e.fillText||function(e,t,r){},this.canvas_ctx=e,this.turtle_element=o.turtleElement,this.turtle_size=o.turtleSize,this.width=Number(t),this.height=Number(r),this.x=this.py=0,this.y=this.py=0,this.r=Math.PI/2,this.sx=this.sy=1,this.color="#000000",this.bgcolor="#ffffff",this.penwidth=1,this.penmode="paint",this.fontsize=14,this.fontname="sans-serif",this.turtlemode="wrap",this.visible=!0,this.pendown=!0,this.was_oob=!1,this.filling=0,this._clickx=this._clicky=0,this._mousex=this._mousey=0,this._buttons=0,this._init(),this._tick(),n&&(n.addEventListener("mousemove",function(e){var t=n.getBoundingClientRect();this._mousemove(e.clientX-t.left,e.clientY-t.top,e.buttons)}.bind(this)),n.addEventListener("mousedown",function(e){var t=n.getBoundingClientRect();this._mouseclick(e.clientX-t.left,e.clientY-t.top,e.buttons)}.bind(this)))}Object.defineProperties(i.prototype,{_init:{value:function(){this.color=this.color,this.fontname=this.fontname,this.fontsize=this.fontsize,this.penmode=this.penmode,this.penwidth=this.penwidth,this.canvas_ctx.lineCap="round",this.canvas_ctx.setTransform(this.sx,0,0,-this.sy,this.width/2,this.height/2)}},_tick:{value:function(){requestAnimationFrame(this._tick.bind(this));var e=JSON.stringify([this.x,this.y,this.r,this.visible,this.sx,this.sy,this.width,this.height]);e!==this._last_state&&(this._last_state=e,this.visible?(this.turtle_element.style.display="block",this.turtle_element.style.left=this.width/2+this.x*this.sx-this.turtle_size/2+"px",this.turtle_element.style.top=this.height/2-this.y*this.sy-this.turtle_size/2+"px",this.turtle_element.style.width=this.turtle_size+"px",this.turtle_element.style.height=this.turtle_size+"px",this.turtle_element.style.transform=`rotate(${1.5708-this.r}rad)`):this.turtle_element.style.display="none")}},_moveto:{value:function(e,t,r){var n,i,s,a,l,c,u,p=function(e,t,r,n){this.filling?(this.canvas_ctx.lineTo(e,t),this.canvas_ctx.lineTo(r,n)):this.pendown&&(this.canvas_ctx.beginPath(),this.canvas_ctx.moveTo(e,t),this.canvas_ctx.lineTo(r,n),this.canvas_ctx.stroke())}.bind(this),d=this.width/this.sx,h=this.height/this.sy,m=-d/2,f=d/2,g=-h/2,y=h/2;if(r&&"wrap"===this.turtlemode){var v=e<m||e>=f||t<g||t>=y,E=e,S=t;if(this.was_oob){var w=o(e+d/2,d)-(e+d/2),T=o(t+h/2,h)-(t+h/2);e+=w,t+=T,this.x=this.px+w,this.y=this.py+T}this.was_oob=v,this.px=E,this.py=S}else this.was_oob=!1;for(;;)switch(this.turtlemode){case"window":return p(this.x,this.y,e,t),this.x=this.px=e,void(this.y=this.py=t);default:case"wrap":case"fence":if(l=1,c=1,e<m?l=(this.x-m)/(this.x-e):e>f&&(l=(this.x-f)/(this.x-e)),t<g?c=(this.y-g)/(this.y-t):t>y&&(c=(this.y-y)/(this.y-t)),!isFinite(l)||!isFinite(c))throw console.log("x",e,"left",m,"right",f),console.log("y",t,"bottom",g,"top",y),console.log("fx",l,"fy",c),new Error("Wrapping error: non-finite fraction");if(n=e,i=t,s=e,a=t,l<1&&l<=c?(n=(u=e<m)?m:f,e+=u?d:-d,s=u?f:m,a=i=this.y-l*(this.y-t)):c<1&&c<=l&&(i=(u=t<g)?g:y,t+=u?h:-h,s=n=this.x-c*(this.x-e),a=u?y:g),p(this.x,this.y,n,i),"fence"===this.turtlemode)return this.x=this.px=n,void(this.y=this.py=i);if(this.x=s,this.y=a,l>=1&&c>=1)return}}},_mousemove:{value:function(e,t,r){this._mousex=(e-this.width/2)/this.sx,this._mousey=(t-this.height/2)/-this.sy,this._buttons=r}},_mouseclick:{value:function(e,t,r){this._clickx=(e-this.width/2)/this.sx,this._clicky=(t-this.height/2)/-this.sy,this._buttons=r}},resize:{value:function(e,t){this.width=e,this.height=t,this._init()}},move:{value:function(e){var t,r,n,o,i;(n=Math.abs(e)<.001)&&(o=this.x,i=this.y,e=.001);function s(e){var t=Math.pow(10,10);return Math.round(e*t)/t}t=s(this.x+e*Math.cos(this.r)),r=s(this.y+e*Math.sin(this.r)),this._moveto(t,r),n&&(this.x=this.px=o,this.y=this.px=i)}},turn:{value:function(e){this.r-=t(e)}},towards:{value:function(e,t){return e=e,t=t,90-r(Math.atan2(t-this.y,e-this.x))}},clearscreen:{value:function(){this.home(),this.clear()}},clear:{value:function(){this.canvas_ctx.save();try{this.canvas_ctx.setTransform(1,0,0,1,0,0),this.canvas_ctx.clearRect(0,0,this.width,this.height),this.canvas_ctx.fillStyle=this.bgcolor,this.canvas_ctx.fillRect(0,0,this.width,this.height)}finally{this.canvas_ctx.restore()}}},home:{value:function(){this._moveto(0,0),this.r=t(90)}},drawtext:{value:function(e){this.canvas_ctx.save(),this.canvas_ctx.translate(this.x,this.y),this.canvas_ctx.scale(1,-1),this.canvas_ctx.rotate(-this.r),this.canvas_ctx.fillText(e,0,0),this.canvas_ctx.restore()}},beginpath:{value:function(){0===this.filling&&(this.saved_turtlemode=this.turtlemode,this.turtlemode="window",++this.filling,this.canvas_ctx.beginPath())}},fillpath:{value:function(e){--this.filling,0===this.filling&&(this.canvas_ctx.closePath(),this.canvas_ctx.fillStyle=e,this.canvas_ctx.fill(),this.canvas_ctx.fillStyle=this.color,this.pendown&&this.canvas_ctx.stroke(),this.turtlemode=this.saved_turtlemode)}},fill:{value:function(){this.canvas_ctx.save(),this.canvas_ctx.setTransform(1,0,0,1,0,0),this.canvas_ctx.floodFill(this.x*this.sx+this.width/2,-this.y*this.sy+this.height/2),this.canvas_ctx.restore()}},arc:{value:function(e,r){"wrap"==this.turtlemode?[this.x,this.x+this.width/this.sx,this.x-this.width/this.sx].forEach(function(n){[this.y,this.y+this.height/this.sy,this.y-this.height/this.sy].forEach(function(o){this.filling||this.canvas_ctx.beginPath(),this.canvas_ctx.arc(n,o,r,this.r,this.r-t(e),e>0),this.filling||this.canvas_ctx.stroke()}.bind(this))}.bind(this)):(this.filling||this.canvas_ctx.beginPath(),this.canvas_ctx.arc(this.x,this.y,r,this.r,this.r-t(e),e>0),this.filling||this.canvas_ctx.stroke())}},getstate:{value:function(){return{isturtlestate:!0,color:this.color,bgcolor:this.bgcolor,position:this.position,heading:this.heading,penmode:this.penmode,turtlemode:this.turtlemode,width:this.width,fontsize:this.fontsize,fontname:this.fontname,visible:this.visible,pendown:this.pendown,scrunch:this.scrunch}}},setstate:{value:function(e){if(!e||!e.isturtlestate)throw new Error("Tried to restore a state that is not a turtle state");this.turtlemode=e.turtlemode,this.color=e.color,this.bgcolor=e.bgcolor,this.penwidth=e.penwidth,this.fontsize=e.fontsize,this.fontname=e.fontname,this.position=e.position,this.heading=e.heading,this.penmode=e.penmode,this.scrunch=e.scrunch,this.visible=e.visible,this.pendown=e.pendown}},pendown:{set:function(e){this._down=e},get:function(){return this._down}},penmode:{get:function(){return this._penmode},set:function(e){this._penmode=e,this.canvas_ctx.globalCompositeOperation="erase"===this.penmode?"destination-out":"reverse"===this.penmode?"difference":"source-over",this.canvas_ctx.strokeStyle=this.canvas_ctx.fillStyle="paint"===e?this.color:"#ffffff"}},turtlemode:{set:function(e){this._turtlemode=e},get:function(){return this._turtlemode}},color:{get:function(){return this._color},set:function(e){this._color=e,this.canvas_ctx.strokeStyle=this._color,this.canvas_ctx.fillStyle=this._color}},bgcolor:{get:function(){return this._bgcolor},set:function(e){this._bgcolor=e,this.clear()}},penwidth:{set:function(e){this._penwidth=e,this.canvas_ctx.lineWidth=this._penwidth},get:function(){return this._penwidth}},fontsize:{set:function(e){this._fontsize=e,this.canvas_ctx.font=n(this.fontsize,this.fontname)},get:function(){return this._fontsize}},fontname:{set:function(e){this._fontname=e,this.canvas_ctx.font=n(this.fontsize,this.fontname)},get:function(){return this._fontname}},position:{set:function(e){var t=e[0],r=e[1];t=void 0===t?this.x:t,r=void 0===r?this.y:r,this._moveto(t,r,!0)},get:function(){return[this.x,this.y]}},heading:{get:function(){return 90-r(this.r)},set:function(e){this.r=t(90-e)}},visible:{set:function(e){this._visible=e},get:function(){return this._visible}},scrunch:{set:function(e){var t=e[0],r=e[1];this.x=this.px=this.x/t*this.sx,this.y=this.py=this.y/r*this.sy,this.sx=t,this.sy=r,this.canvas_ctx.setTransform(this.sx,0,0,-this.sy,this.width/2,this.height/2)},get:function(){return[this.sx,this.sy]}},mousepos:{get:function(){return[this._mousex,this._mousey]}},clickpos:{get:function(){return[this._clickx,this._clicky]}},button:{get:function(){return this._buttons}}}),e.CanvasTurtle=i}(self)},function(e,t,r){"use strict";function n(e){return document.querySelector(e)}Object.defineProperty(t,"__esModule",{value:!0});t.LogoOutputConsole=class{constructor(e){this.overlaySelector=e}read(e){return window.prompt(e||"")}write(...e){const t=n(this.overlaySelector);for(const r of e)t.innerHTML+=r;t.scrollTop=t.scrollHeight}clear(){n(this.overlaySelector).innerHTML=""}readback(){return n(this.overlaySelector).innerHTML}get textsize(){return parseFloat(n(this.overlaySelector).style.fontSize.replace("px",""))}set textsize(e){n(this.overlaySelector).style.fontSize=Math.max(e,1)+"px"}get font(){return n(this.overlaySelector).style.fontFamily}set font(e){-1===["serif","sans-serif","cursive","fantasy","monospace"].indexOf(e)&&(e=JSON.stringify(e)),n(this.overlaySelector).style.fontFamily=e}get color(){return n(this.overlaySelector).style.color}set color(e){n(this.overlaySelector).style.color=e}}},function(e,t,r){"use strict";function n(e){const t=[];let r=!1;for(const n of e){const e=n.trim().toLowerCase();e.startsWith("to ")&&(r=!0),r&&t.push(n),e.endsWith("end")&&(r=!1)}return t}Object.defineProperty(t,"__esModule",{value:!0}),t.processImports=async function(e,t){return(await async function e(t,r,o){const i=t.match(/[^\r\n]+/g)||[],s=[];for(const t of i){const i=t.trimLeft().toLowerCase();if(i.startsWith('import "')){const t=i.substr(8),a=await r(t);if(a){let t=await e(a,r,!1);o&&(t=n(t)),s.push(...t)}}else s.push(t)}return s}(e,t,!0)).join("\n")}},function(e,t,r){},,,,,,function(e,t,r){var n=r(23);void 0!==n&&(n.defineMode("logo",(function(e,t){var r=/^(["'](?:[^ \f\n\r\t\v[\](){}\\]|\\[^])*)/,n=/^([\u2190-\u2193])/,o=/^([0-9]*\.?[0-9]+(?:[eE]\s*[\-+]?\s*[0-9]+)?)/,i=/^(:(:?[\u2190-\u2193]|[^ \f\n\r\t\v[\](){}+\-*/%^=<>]+))/,s=/^([\u2190-\u2193]|[^ \f\n\r\t\v[\](){}+\-*/%^=<>]+)/,a=/^(>=|<=|<>|[+\-*/%^=<>[\]{}()])/;return{electricChars:"[]dD",startState:function(){return{state:"normal",indent:0}},indent:function(e,t){var r=e.indent;switch(/^\]/.test(t)&&--r,e.state){case"defn-name":return 2*(r+1);case"defn-vars":case"defn-body":return/^END\b/i.test(t)?2*r:2*(r+1);default:return 2*r}},token:function(e,t){if(e.eatSpace())return null;if(e.match(/^;.*/,!0))return"comment";if("normal"===t.state){if(e.match(/^TO\b/i,!0))return t.state="defn-name","keyword";if(e.match(/^END\b/i,!0))return"error"}if("defn-name"===t.state)return e.match(s,!0)?(t.state="defn-vars","def"):(e.next(),t.state="normal","error");if("defn-vars"===t.state){if(e.match(i,!0))return"def";t.state="defn-body"}if("defn-body"===t.state&&e.match(/^END\b/i,!0))return t.state="normal","keyword";if("normal"===t.state||"defn-body"===t.state)return e.match(o,!0)?"number":e.match(r,!0)?"string":e.match(/^\[/,!0)?(++t.indent,"bracket"):e.match(/^\]/,!0)?(t.indent>0&&--t.indent,"bracket"):e.match(a,!0)?"operator":e.match(i,!0)?"variable":e.match(/^(TRUE|FALSE|ELSE|REPEAT|IF|IFELSE|FOREVER)\b/i,!0)?"keyword":e.match(n,!0)||e.match(s,!0)?"variable-2":(e.next(),"error");throw"WTF?"}}})),n.defineMIME("text/x-logo","logo"))},function(e,t,r){},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(3),i=r(5),s=r(89),a=r(6),l=r(14),c=r(17),u=r(12),p=r(100);class d extends n.Component{constructor(e){super(e),this.imageUploadService=i.resolve(s.ImageUploadService),this.eventsTracking=i.resolve(a.EventsTrackingService),this.state={errorMessage:"",isSavingInProgress:!0}}async componentDidMount(){try{const e=await this.imageUploadService.doUpload(this.props.imageBase64);this.eventsTracking.sendEvent(a.EventAction.shareScreenshot),this.setState({isSavingInProgress:!1,imgUrl:e})}catch(e){this.setState({isSavingInProgress:!1,errorMessage:o.$T.common.error})}}render(){return n.createElement(u.Modal,{show:!0,withoutFooter:!0,title:o.$T.program.screenshotModalTitle,onCancel:this.props.onClose,cancelButtonText:o.$T.common.cancel},n.createElement(c.Loading,{isLoading:this.state.isSavingInProgress}),this.state.errorMessage&&n.createElement(l.AlertMessage,{message:this.state.errorMessage,type:"danger"}),this.state.imgUrl&&n.createElement("div",{className:"share-screenshot-modal-component"},n.createElement("label",{className:"label"},o.$T.program.imagePreview),n.createElement("div",{className:"has-text-centered"},n.createElement("div",{className:"box is-inline-block"},n.createElement("img",{className:"screenshot-img",src:this.state.imgUrl,style:{maxHeight:400}}))),n.createElement("br",null),n.createElement("label",{className:"label"},o.$T.program.imageUrl),n.createElement(p.InputCopyToClipboard,{text:this.state.imgUrl})))}}t.ScreenshotModal=d},,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(3),i=r(5),s=r(13),a=r(91),l=r(6),c=r(8),u=r(19),p=r(14),d=r(12),h=r(100);class m extends n.Component{constructor(e){super(e),this.sharedProgramsRepo=i.resolve(a.SharedProgramsRepository),this.eventsTracking=i.resolve(l.EventsTrackingService),this.errorHandler=e=>{this.setState({errorMessage:e.message})},this.shareProgramAction=async()=>{this.setState({isSavingInProgress:!0,errorMessage:""});const e=await s.callActionSafe(this.errorHandler,async()=>this.sharedProgramsRepo.post(this.state.programName,this.props.programCode));if(this.setState({isSavingInProgress:!1}),e){const t=window.location.toString(),r=t.substr(0,t.indexOf("#")+1)+u.Routes.playground.build({storageType:c.ProgramStorageType.shared,id:e});this.eventsTracking.sendEvent(l.EventAction.shareProgram),this.setState({publishedUrl:r})}},this.state={errorMessage:"",programName:this.props.programName,isSavingInProgress:!1,publishedUrl:""}}render(){return n.createElement(d.Modal,{show:!0,title:o.$T.program.shareYourProgramModalTitle,onConfirm:this.state.publishedUrl?void 0:this.shareProgramAction,onCancel:this.props.onClose,withoutFooter:!!this.state.publishedUrl,actionButtonText:o.$T.common.continue,cancelButtonText:o.$T.common.cancel},this.state.errorMessage&&n.createElement("div",null,n.createElement(p.AlertMessage,{message:this.state.errorMessage}),n.createElement("br",null)),n.createElement("div",{className:"field"},n.createElement("label",{className:"label"},o.$T.program.programName),n.createElement("div",{className:"control"},n.createElement("input",{readOnly:!!this.state.publishedUrl,type:"text",className:"input",id:"program-name-in-share-dialog",placeholder:o.$T.program.pleaseEnterNameForYourProgram,autoFocus:!0,value:this.state.programName,onChange:e=>{this.setState({programName:e.target.value})}}))),n.createElement("br",null),this.state.publishedUrl&&n.createElement("div",null,n.createElement("label",{className:"label"},o.$T.program.publicUrl),n.createElement(h.InputCopyToClipboard,{text:this.state.publishedUrl})))}}t.ShareProgramModal=m},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(3),i=r(12);class s extends n.Component{constructor(e){super(e),this.saveProgramAction=async()=>{this.props.onSave(this.state.programName),this.props.onClose()},this.state={programName:this.props.programName}}render(){return n.createElement(i.Modal,{show:!0,title:o.$T.program.saveToLibraryModalTitle,onConfirm:this.saveProgramAction,onCancel:this.props.onClose,actionButtonText:o.$T.common.save,cancelButtonText:o.$T.common.cancel},n.createElement("div",{className:"field"},n.createElement("label",{className:"label"},o.$T.program.programName),n.createElement("div",{className:"control"},n.createElement("input",{type:"text",readOnly:!this.props.allowRename,disabled:!this.props.allowRename,className:"input",id:"program-name-in-save-dialog",placeholder:o.$T.program.pleaseEnterNameForYourProgram,autoFocus:!0,value:this.state.programName,onChange:e=>{this.props.allowRename&&this.setState({programName:e.target.value})},onKeyDown:async e=>{13==e.which&&(e.preventDefault(),await this.saveProgramAction())}}))),n.createElement("div",{className:"field"},n.createElement("label",{className:"label"},o.$T.gallery.galleryImage),n.createElement("div",{className:"has-text-centered"},n.createElement("div",{className:"box is-inline-block"},n.createElement("figure",{className:"has-text-centered"},n.createElement("img",{src:this.props.screenshot}))))))}}t.SaveProgramModal=s},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(3),i=r(12),s=r(14);class a extends n.Component{constructor(e){super(e),this.handleConfirm=async()=>{this.props.onDelete(),this.props.onClose()},this.state={errorMessage:"",isDeleteInProgress:!1}}render(){return n.createElement(i.Modal,{show:!0,onConfirm:this.handleConfirm,actionButtonText:o.$T.common.delete,cancelButtonText:o.$T.common.cancel,title:o.$T.common.areYouSure,onCancel:this.props.onClose},n.createElement(s.AlertMessage,{title:o.$T.program.youAreGoingToDeleteProgram,type:"warning"}),n.createElement("br",null),n.createElement("div",{className:"field"},n.createElement("label",{className:"label"},o.$T.program.programName),n.createElement("div",{className:"control"},n.createElement("input",{type:"text",readOnly:!0,className:"input",id:"program-name-in-delete-dialog",value:this.props.programName}))))}}t.DeleteProgramModal=a},function(e,t,r){},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.playgroundDefaultLayout={content:[{type:"row",content:[{isClosable:!1,title:"",type:"component",componentName:"output-panel",width:60},{isClosable:!1,title:"",type:"component",componentName:"code-panel",width:40}]}]},t.playgroundDefaultMobileLayout={settings:{reorderEnabled:!1},content:[{type:"column",content:[{isClosable:!1,title:"",type:"component",componentName:"code-panel",height:45},{isClosable:!1,title:"",type:"component",componentName:"output-panel",height:55}]}]}},function(e,t,r){},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(5),o=r(13),i=r(19),s=r(18),a=r(8),l=r(59),c=r(58),u=r(101),p=r(87),d=r(61),h=r(6),m=r(102);t.playgroundThunks={loadProgram:function(e,t){return async(r,c)=>{const p=c().playground;if(p.storageType===e&&p.programId===t)return;const m=n.resolve(h.EventsTrackingService);switch(e){case a.ProgramStorageType.playground:m.sendEvent(h.EventAction.openPlayground);break;case a.ProgramStorageType.gallery:m.sendEvent(h.EventAction.openProgramFromLibrary);break;case a.ProgramStorageType.samples:m.sendEvent(h.EventAction.openProgramFromSample);break;case a.ProgramStorageType.shared:m.sendEvent(h.EventAction.openProgramFromShare)}r(d.playgroundActionCreator.loadProgramStarted(e,t));try{const o=n.resolve(l.ProgramService),i=await o.loadProgram(e,t);r(d.playgroundActionCreator.loadProgramCompleted(i,e,t))}catch(e){const t=await o.normalizeError(e);r(s.envActionCreator.handleError(t)),u.NavigationService.navigate(i.Routes.gallery.build({}))}}},codeChanged:function(e){return async(t,r)=>{t(d.playgroundActionCreator.codeChangedAction(e)),n.resolve(p.LocalPlaygroundCodeStorage).setCode(e)}},saveProgram:function(e){return async(t,r)=>{t(d.playgroundActionCreator.syncProgramStarted()),n.resolve(h.EventsTrackingService).sendEvent(h.EventAction.saveProgramToPersonalLibrary);const i=r().playground;try{const r=n.resolve(l.ProgramService);await r.saveProgramToLibrary({id:i.programId,newProgramName:i.programName,newScreenshot:e,newCode:i.code}),t(d.playgroundActionCreator.syncProgramCompleted({}))}catch(e){const r=await o.normalizeError(e);t(s.envActionCreator.handleError(r)),t(d.playgroundActionCreator.syncProgramFailed())}}},saveAsProgram:function(e,t){return async(r,a)=>{r(d.playgroundActionCreator.syncProgramStarted()),n.resolve(h.EventsTrackingService).sendEvent(h.EventAction.saveProgramToPersonalLibrary);try{const o=a().playground,s=n.resolve(l.ProgramService),c=await s.saveProgramToLibrary({newProgramName:e,newScreenshot:t,newCode:o.code});r(d.playgroundActionCreator.syncProgramCompleted({newId:c.id,newName:e,newStorageType:c.storageType})),u.NavigationService.navigate(i.Routes.playground.build({storageType:c.storageType,id:c.id}))}catch(e){const t=await o.normalizeError(e);r(s.envActionCreator.handleError(t)),r(d.playgroundActionCreator.syncProgramFailed())}}},deleteProgram:function(){return async(e,t)=>{const r=t().playground;if(r.programId)try{e(d.playgroundActionCreator.syncProgramStarted());const t=n.resolve(c.GalleryService);await t.remove(r.programId),u.NavigationService.navigate(i.Routes.gallery.build({}))}catch(t){const r=await o.normalizeError(t);e(s.envActionCreator.handleError(r)),e(d.playgroundActionCreator.syncProgramFailed())}}},revertChanges:function(){return async(e,t)=>{const r=t().playground,{storageType:i,programId:a}=r;e(d.playgroundActionCreator.syncProgramStarted()),n.resolve(h.EventsTrackingService).sendEvent(h.EventAction.revertProgramChanges);try{const t=n.resolve(l.ProgramService),r=await t.loadProgram(i,a);e(d.playgroundActionCreator.loadProgramCompleted(r,i,a))}catch(t){const r=await o.normalizeError(t);e(s.envActionCreator.handleError(r)),e(d.playgroundActionCreator.syncProgramFailed())}}},formatCode:function(){return async(e,r)=>{const n=r().playground.code,o=m.formatLogoProgram(n);e(t.playgroundThunks.codeChanged(o))}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(11),o=r(263),i=r(63),s=r(271);t.TutorialsContainer=n.connect(e=>({tutorialId:e.tutorials.tutorialId,stepId:e.tutorials.stepId,isLoading:e.tutorials.isLoading,code:e.tutorials.code,isRunning:e.tutorials.isRunning,isStepLoading:e.tutorials.isStepLoading,tutorials:e.tutorials.tutorials,currentTutorialInfo:e.tutorials.currentTutorialInfo,currentStepInfo:e.tutorials.currentStepInfo,currentStepContent:e.tutorials.currentStepContent,userSettings:e.env.userSettings,appTheme:e.env.appTheme}),{loadStep:s.tutorialsThunks.loadStep,codeChanged:i.tutorialsActionCreator.codeChanged,runProgram:i.tutorialsActionCreator.runProgram,stopProgram:i.tutorialsActionCreator.stopProgram,fixTheCode:i.tutorialsActionCreator.fixTheCode,formatCode:s.tutorialsThunks.formatCode,saveAsProgram:s.tutorialsThunks.saveAsProgram})(o.TutorialsPage)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(5),i=r(3),s=r(39),a=r(6),l=r(9),c=r(264),u=r(17),p=r(96),d=r(62),h=r(265),m=r(99),f=r(98),g=r(43),y=r(21),v=r(44);r(270);class E extends n.Component{constructor(e){super(e),this.eventsTracking=o.resolve(a.EventsTrackingService),this.isMobileDevice=s.checkIsMobileDevice(),this.defaultLayoutConfigJSON=JSON.stringify(this.isMobileDevice?c.tutorialsDefaultMobileLayout:c.tutorialsDefaultLayout),this.layoutLocalStorageKey=l.localStoragePrefix+"tutorials-layout"+(this.isMobileDevice?"-mobile":"-desktop"),this.handleCodeChanged=e=>{this.props.codeChanged(e)},this.handleRunProgram=()=>{this.props.runProgram()},this.handleStopProgram=()=>{this.props.stopProgram()},this.getProgramImage=()=>this.logoExecutorRef?this.logoExecutorRef.createScreenshotBase64(!1):"",this.getSmallProgramImage=()=>this.logoExecutorRef?this.logoExecutorRef.createScreenshotBase64(!0):"",this.handleFixTheCode=()=>{this.eventsTracking.sendEvent(a.EventAction.tutorialsFixTheCode),this.props.fixTheCode()},this.handleNavigationRequest=(e,t)=>{this.eventsTracking.sendEvent(a.EventAction.tutorialsNavigation),this.props.loadStep(e,t)},this.handleFormatDocument=()=>{this.props.formatCode()},this.handleSaveAs=e=>{this.props.saveAsProgram(e,this.getSmallProgramImage())},this.state={resizeIncrement:1}}async componentDidMount(){this.eventsTracking.sendEvent(a.EventAction.openTutorials),this.props.loadStep(this.props.tutorialId,this.props.stepId)}render(){return n.createElement("div",{className:"ex-page-container"},n.createElement(y.MainMenuContainer,null),n.createElement("div",{className:"ex-page-content is-fullscreen tutorials-page-component"},n.createElement(u.Loading,{isLoading:this.props.isLoading,fullPage:!0}),n.createElement(p.ReactGoldenLayout,{className:"golden-layout-container",configLayoutOverride:{settings:{showMaximiseIcon:!1,showPopoutIcon:!1,showCloseIcon:!1},dimensions:{headerHeight:32}},layoutLocalStorageKey:this.layoutLocalStorageKey,defaultLayoutConfigJSON:this.defaultLayoutConfigJSON,onLayoutChange:()=>this.setState({resizeIncrement:this.state.resizeIncrement+1})},n.createElement(d.ReactGoldenLayoutPanel,{id:"code-panel",title:`<i class="fa fa-code" aria-hidden="true"></i> ${i.$T.program.codePanelTitle}`},n.createElement(m.CodeMenu,{isRunning:this.props.isRunning,code:this.props.code,programName:"Tutorial",onRunProgram:this.handleRunProgram,onStopProgram:this.handleStopProgram,createScreenShotImageBase64:this.getProgramImage,createSmallScreenShotImageBase64:this.getSmallProgramImage,onFormatDocument:this.handleFormatDocument,onSaveAs:this.handleSaveAs}),n.createElement(f.CodeInput,{className:"code-input-container",editorTheme:this.props.appTheme.codeEditorThemeName,code:this.props.code,onChanged:this.handleCodeChanged,hotKeys:["f9"],onHotkey:this.handleRunProgram,resizeIncrement:this.state.resizeIncrement})),n.createElement(d.ReactGoldenLayoutPanel,{id:"output-panel",title:`<i class="fas fa-desktop" aria-hidden="true"></i> ${i.$T.program.outputPanelTitle}`},n.createElement(g.LogoExecutor,{ref:e=>this.logoExecutorRef=e||void 0,isRunning:this.props.isRunning,onFinish:this.handleStopProgram,code:this.props.code,isDarkTheme:this.props.appTheme.isDark,turtleImageSrc:v.getTurtleById(this.props.userSettings.turtleId).imageSrc,turtleSize:this.props.userSettings.turtleSize})),n.createElement(d.ReactGoldenLayoutPanel,{id:"tutorial-panel",title:`<i class="fa fa-graduation-cap" aria-hidden="true"></i> ${i.$T.tutorial.tutorialPanelTitle}`},n.createElement(u.Loading,{isLoading:this.props.isStepLoading&&!this.props.isLoading}),!this.props.isStepLoading&&this.props.tutorials&&this.props.currentTutorialInfo&&this.props.currentStepInfo&&this.props.currentStepContent&&n.createElement(h.TutorialView,{tutorials:this.props.tutorials,currentTutorialInfo:this.props.currentTutorialInfo,currentStepInfo:this.props.currentStepInfo,currentStepContent:this.props.currentStepContent,onNavigationRequest:this.handleNavigationRequest,onFixTheCode:this.handleFixTheCode,appTheme:this.props.appTheme,userSettings:this.props.userSettings})))))}}t.TutorialsPage=E},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.tutorialsDefaultLayout={content:[{type:"row",content:[{isClosable:!1,title:"",type:"component",componentName:"tutorial-panel",width:40},{type:"column",width:60,content:[{isClosable:!1,title:"",type:"component",componentName:"output-panel",height:60},{isClosable:!1,title:"",type:"component",componentName:"code-panel",height:40}]}]}]},t.tutorialsDefaultMobileLayout={settings:{reorderEnabled:!1},content:[{type:"column",content:[{type:"stack",width:100,height:55,activeItemIndex:0,content:[{isClosable:!1,title:"",type:"component",componentName:"tutorial-panel"},{isClosable:!1,title:"",type:"component",componentName:"code-panel"}]},{type:"stack",height:45,activeItemIndex:0,content:[{isClosable:!1,title:"",type:"component",componentName:"output-panel"}]}]}]}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(25),i=r(3),s=r(44),a=r(266),l=r(12),c=r(43);r(269);class u extends n.Component{constructor(e){super(e),this.navigateToNextStep=e=>async()=>{const t=this.props.currentTutorialInfo.steps.findIndex(e=>e.id===this.props.currentStepInfo.id)+e,r=this.props.currentTutorialInfo.steps[t].id;this.props.onNavigationRequest(this.props.currentTutorialInfo.id,r)},this.state={showSelectionTutorials:!1,showFixTheCode:!1,inlinedLogoComponents:[]}}componentDidMount(){const e=[];for(const[t,r]of Object.entries(this.props.currentStepContent.inlinedCode)){const i=document.getElementById(t);if(i){i.setAttribute("data-code",r.code);const t=n.createElement(c.LogoExecutor,{isRunning:!0,code:r.code,onFinish:()=>{},isDarkTheme:this.props.appTheme.isDark,turtleImageSrc:s.getTurtleById(this.props.userSettings.turtleId).imageSrc,turtleSize:this.props.userSettings.turtleSize}),a=o.createPortal(t,i);e.push(a)}}e.length>0&&this.setState({inlinedLogoComponents:e})}render(){const e=this.props.currentTutorialInfo.steps.findIndex(e=>e.id===this.props.currentStepInfo.id),t=e>=this.props.currentTutorialInfo.steps.length-1,r=e<=0;return n.createElement("div",{className:"tutorial-view-panel"},n.createElement("div",{className:"tutorial-content"},this.renderFixTheCodeModal(),this.renderSelectTutorialModal(),n.createElement("div",{className:"tutorial-header"},n.createElement("span",{className:"subtitle is-3 is-marginless"},this.props.currentStepInfo.name),n.createElement("button",{className:"button is-info",onClick:()=>{this.setState({showSelectionTutorials:!0})}},n.createElement("span",null,this.props.currentTutorialInfo.label),n.createElement("span",{className:"icon is-small"},n.createElement("i",{className:"fa fa-angle-down","aria-hidden":"true"})))),n.createElement("p",{className:"help"},i.$T.tutorial.stepIndicator.val((e+1).toString(),this.props.currentTutorialInfo.steps.length.toString())),n.createElement("br",null),n.createElement("div",{className:"content",dangerouslySetInnerHTML:{__html:this.props.currentStepContent.content}}),this.state.inlinedLogoComponents,n.createElement("br",null),n.createElement("br",null),n.createElement("div",{className:"tutorials-bottom-nav-buttons-container"},!r&&n.createElement("button",{type:"button",className:"button",onClick:this.navigateToNextStep(-1)},n.createElement("span",{className:"icon"},n.createElement("i",{className:"fa fa-arrow-left","aria-hidden":"true"})),n.createElement("span",null,i.$T.tutorial.back)),this.props.currentStepContent.solutionCode&&n.createElement("button",{type:"button",className:"button is-warning",onClick:()=>{this.setState({showFixTheCode:!0})}},n.createElement("span",{className:"icon"},n.createElement("i",{className:"fa fa-question","aria-hidden":"true"})),n.createElement("span",null,i.$T.tutorial.helpItsNotworking)),!t&&n.createElement("button",{type:"button",className:"button is-primary",onClick:this.navigateToNextStep(1)},n.createElement("span",{className:"icon"},n.createElement("i",{className:"fa fa-arrow-right","aria-hidden":"true"})),n.createElement("span",null,i.$T.common.continue)),t&&n.createElement("button",{type:"button",className:"button is-primary",onClick:()=>{this.setState({showSelectionTutorials:!0})}},n.createElement("span",{className:"icon"},n.createElement("i",{className:"fa fa-arrow-right","aria-hidden":"true"})),n.createElement("span",null,i.$T.tutorial.chooseAnotherTutorial))),n.createElement("div",null)))}renderSelectTutorialModal(){if(this.state.showSelectionTutorials)return n.createElement(a.TutorialSelectModal,{tutorials:this.props.tutorials,currentTutorialId:this.props.currentTutorialInfo.id,currentStepId:this.props.currentStepInfo.id,onCancel:()=>{this.setState({showSelectionTutorials:!1})},onSelect:async e=>{this.setState({showSelectionTutorials:!1}),this.props.onNavigationRequest(e.id,e.steps[0].id)}})}renderFixTheCodeModal(){if(this.state.showFixTheCode)return n.createElement(l.Modal,{show:!0,title:i.$T.tutorial.fixTheCodeTitle,actionButtonText:i.$T.tutorial.yesFixMyCode,cancelButtonText:i.$T.tutorial.noLeaveItAsIs,onConfirm:async()=>{this.setState({showFixTheCode:!1}),this.props.onFixTheCode()},onCancel:()=>{this.setState({showFixTheCode:!1})}},n.createElement("p",null,i.$T.tutorial.fixTheCodeMessage,n.createElement("span",null," "),n.createElement("strong",null,i.$T.tutorial.fixTheCodeWarning)))}}t.TutorialView=u},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(10),i=r(3),s=r(12),a=r(267);r(268);class l extends n.Component{constructor(e){super(e),this.onSelect=e=>{this.setState({currentSelectedTutorial:e})};const t=this.props.tutorials.find(e=>e.id===this.props.currentTutorialId);if(!t)throw new Error("Tutorial is not found "+this.props.currentTutorialId);this.state={currentSelectedTutorial:t}}start(){this.state.currentSelectedTutorial.id===this.props.currentTutorialId?this.props.onCancel():this.props.onSelect(this.state.currentSelectedTutorial)}render(){const e={};for(const t of this.props.tutorials){const r=t.level.toString();e[r]=[...e[r]||[],t]}return n.createElement(s.Modal,{show:!0,width:"default",title:i.$T.tutorial.chooseTutorial,onCancel:this.props.onCancel,cancelButtonText:i.$T.common.cancel,actionButtonText:this.state.currentSelectedTutorial.id===this.props.currentTutorialId?i.$T.common.continue:i.$T.tutorial.start,onConfirm:async()=>{this.start()}},n.createElement("div",{className:"tutorial-select-modal-component tutorial-pick-menu-container"},n.createElement("aside",{className:"menu"},Object.entries(e).map(([e,t])=>this.renderTutorialsGroup(e,t)))))}getGroupName(e){switch(e){case"0":return i.$T.tutorial.tutorialsLevel0;case"1":return i.$T.tutorial.tutorialsLevel1}return"UNKNOWN LEVEL"}renderTutorialsGroup(e,t){const r=this.state.currentSelectedTutorial,i=this.getGroupName(e);return n.createElement(n.Fragment,{key:i},n.createElement("p",{className:"menu-label"},i),n.createElement("ul",{className:"menu-list"},t.map((e,t)=>n.createElement(n.Fragment,{key:t},n.createElement("li",null,n.createElement("a",{className:o("tutorial-link",{"is-active":e.id===r.id}),onClick:()=>this.onSelect(e)},n.createElement("i",{className:"fa fa-arrow-circle-right","aria-hidden":"true"})," ",r.id===e.id?n.createElement("strong",null,e.label):n.createElement("span",null,e.label)),n.createElement(a.CollapsiblePanel,{className:"tutorial-description-container",isCollapsed:r.id!==e.id},n.createElement("p",{className:"tutorial-description"},e.description),n.createElement("ul",null,n.createElement("li",null,n.createElement("ol",null,e.steps.slice(0,e.steps.length-1).map(e=>n.createElement("li",{key:e.id},e.id===this.props.currentStepId&&r.id===this.props.currentTutorialId?n.createElement("strong",null,e.name):n.createElement("span",null,e.name)))))),n.createElement("br",null)))))))}}t.TutorialSelectModal=l},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(10),o=r(0),i=r(28);class s extends o.Component{constructor(e){super(e),this.animationDuration=300,this.onWindowResize=i.debounce(()=>{this.handleResize()},500),this.handleResize=()=>{const e=this.refs.panelBodyInner,t=this.props.isCollapsed?"0px":e.scrollHeight+"px";this.state.panelHeight!=t&&this.setState({panelHeight:t})},this.state={panelHeight:this.props.isCollapsed?"0px":"auto"}}componentDidMount(){window.addEventListener("resize",this.onWindowResize)}componentWillUnmount(){window.removeEventListener("resize",this.onWindowResize)}componentDidUpdate(e){if(this.props.isCollapsed&&!e.isCollapsed){const e=this.refs.panelBodyOuter;e.style.height=e.scrollHeight+"px"}this.handleResize(),setTimeout(this.handleResize,this.animationDuration)}render(){return o.createElement("div",{className:n("collapsible-panel-component",this.props.className),ref:"panelBodyOuter",style:{height:this.state.panelHeight,transition:"height "+this.animationDuration/1e3+"s",overflow:"hidden"}},o.createElement("div",{className:"collapsible-panel-inner",ref:"panelBodyInner"},this.props.children))}}t.CollapsiblePanel=s},function(e,t,r){},function(e,t,r){},function(e,t,r){},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(3),o=r(5),i=r(13),s=r(18),a=r(88),l=r(63),c=r(102),u=r(59),p=r(42),d=r(22),h=r(6);t.tutorialsThunks={loadStep:function(e,t){return async(r,n)=>{const c=o.resolve(a.TutorialsService);let u=n().tutorials.tutorials;if(!u){r(l.tutorialsActionCreator.loadTutorialsStarted());try{u=await c.getTutorialsList(),r(l.tutorialsActionCreator.loadTutorialsCompleted(u))}catch(e){const t=await i.normalizeError(e);throw r(s.envActionCreator.handleError(t)),new Error("Fail to load tutorials")}}if(!e||!t){const r=c.getLastStep();e=r.tutorialId,t=r.stepId}r(l.tutorialsActionCreator.loadStepStarted(e,t));try{const n=u.find(t=>t.id===e),o=n&&n.steps.find(e=>e.id===t);if(!n||!o)throw c.setLastStep(c.defaultStep),new Error("Tutorial is not found, please refresh the page to load the default one.");const i=await c.getStep(e,t);r(l.tutorialsActionCreator.loadStepCompleted(e,t,n,o,i))}catch(e){const t=await i.normalizeError(e);r(s.envActionCreator.handleError(t))}}},formatCode:function(){return async(e,t)=>{const r=t().tutorials.code,n=c.formatLogoProgram(r);e(l.tutorialsActionCreator.codeChanged(n))}},saveAsProgram:function(e,t){return async(r,a)=>{o.resolve(h.EventsTrackingService).sendEvent(h.EventAction.saveProgramToPersonalLibrary);try{const i=a().tutorials,s=o.resolve(u.ProgramService);await s.saveProgramToLibrary({newProgramName:e,newScreenshot:t,newCode:i.code}),r(d.envThunks.showNotificationAutoClose(p.NotificationType.info,n.$T.common.appTitle,n.$T.program.programSavedToLibrarySuccess))}catch(e){const t=await i.normalizeError(e);r(s.envActionCreator.handleError(t))}}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(11),o=r(22),i=r(273);t.LoginPageContainer=n.connect(e=>({user:e.env.user}),{onSignIn:o.envThunks.signIn})(i.LoginPage)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(32),i=r(31),s=r(3),a=r(19),l=r(103),c=r(76),u=r(274),p=r(21);class d extends n.Component{constructor(e){super(e),this.handleOnSignInClick=()=>{this.props.onSignIn(i.AuthProvider.google)},this.state={}}renderAuthProviderInfo(e){switch(e){case i.AuthProvider.google:return n.createElement("span",{className:"icon"},n.createElement(u.SvgBtnGoogle,null));case i.AuthProvider.none:return n.createElement(n.Fragment,null);default:throw new Error("Auth provider is not known")}}render(){return n.createElement("div",{className:"ex-page-container"},n.createElement(p.MainMenuContainer,null),n.createElement("div",{className:"ex-page-content"},n.createElement("div",{className:"container"},n.createElement("br",null),n.createElement("div",{className:"columns"},n.createElement("div",{className:"column is-2-tablet is-3-desktop is-4-widescreen"}),n.createElement("div",{className:"column"},!this.props.user.isLoggedIn&&this.renderLoginForm(),this.props.user.isLoggedIn&&this.renderWelcomeForm()),n.createElement("div",{className:"column is-2-tablet is-3-desktop is-4-widescreen"})))))}renderLoginForm(){return n.createElement(n.Fragment,null,n.createElement(l.PageHeader,{title:s.$T.login.title}),n.createElement("br",null),n.createElement(c.InfoBox,{content:s.$T.login.notLoggedInSignInMessage}),n.createElement("br",null),n.createElement("div",{key:"login-elem-google"},n.createElement("button",{type:"button",className:"button",style:{width:"100%"},onClick:this.handleOnSignInClick}," ",n.createElement("span",{className:"icon"},n.createElement(u.SvgBtnGoogle,null))," ",n.createElement("span",null,s.$T.common.signInWithGoogle)," ")))}renderWelcomeForm(){return n.createElement(n.Fragment,null,n.createElement(l.PageHeader,{title:s.$T.welcome.title}),n.createElement("br",null),n.createElement("div",{className:"media"},this.props.user.imageUrl&&n.createElement("div",{className:"media-left"},n.createElement("figure",{className:"image is-48x48"},n.createElement("img",{src:this.props.user.imageUrl,alt:"User image"}))),n.createElement("div",{className:"media-content"},n.createElement("p",{className:"title is-5 is-marginless"},this.props.user.name),n.createElement("p",null,this.props.user.email),n.createElement("p",null,this.renderAuthProviderInfo(this.props.user.authProvider)))),n.createElement("br",null),n.createElement(o.Link,{to:a.Routes.gallery.build({})},n.createElement(c.InfoBox,{iconClass:"far fa-images",content:n.createElement(n.Fragment,null,n.createElement("h2",null,s.$T.welcome.galleryLinkHeader),n.createElement("p",null,s.$T.welcome.galleryLinkDescription))})),n.createElement("br",null),n.createElement(o.Link,{to:a.Routes.tutorials.build({})},n.createElement(c.InfoBox,{iconClass:"fas fa-graduation-cap",content:n.createElement(n.Fragment,null,n.createElement("h2",null,s.$T.welcome.tutorialsLinkHeader),n.createElement("p",null,s.$T.welcome.tutorialsLinkDescription))})),n.createElement("br",null),n.createElement(o.Link,{to:a.Routes.playgroundDefault.build({})},n.createElement(c.InfoBox,{iconClass:"fas fa-code",content:n.createElement(n.Fragment,null,n.createElement("h2",null,s.$T.welcome.playgroundLinkHeader),n.createElement("p",null,s.$T.welcome.playgroundLinkDescription))})),n.createElement("br",null))}}t.LoginPage=d},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0);t.SvgBtnGoogle=function(){return n.createElement("svg",{width:"18",height:"18",xmlns:"http://www.w3.org/2000/svg"},n.createElement("g",{fill:"none",fillRule:"evenodd"},n.createElement("path",{d:"M17.6 9.2l-.1-1.8H9v3.4h4.8C13.6 12 13 13 12 13.6v2.2h3a8.8 8.8 0 0 0 2.6-6.6z",fill:"#4285F4"}),n.createElement("path",{d:"M9 18c2.4 0 4.5-.8 6-2.2l-3-2.2a5.4 5.4 0 0 1-8-2.9H1V13a9 9 0 0 0 8 5z",fill:"#34A853"}),n.createElement("path",{d:"M4 10.7a5.4 5.4 0 0 1 0-3.4V5H1a9 9 0 0 0 0 8l3-2.3z",fill:"#FBBC05"}),n.createElement("path",{d:"M9 3.6c1.3 0 2.5.4 3.4 1.3L15 2.3A9 9 0 0 0 1 5l3 2.4a5.4 5.4 0 0 1 5-3.7z",fill:"#EA4335"}),n.createElement("path",{d:"M0 0h18v18H0z"})))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(53),i=r(5),s=r(276),a=r(6),l=r(21),c=r(277);class u extends n.Component{constructor(e){super(e),this.eventsTracking=i.resolve(a.EventsTrackingService),this.state={},this.eventsTracking.sendEvent(a.EventAction.openAbout);const t=new o({html:!0});this.thirdPartyCreditsHTML=t.render(c.default)}render(){return n.createElement("div",{className:"ex-page-container"},n.createElement(l.MainMenuContainer,null),n.createElement("div",{className:"ex-page-content"},n.createElement("div",{className:"container"},n.createElement("br",null),n.createElement("h1",{className:"title"},"Logo playground"),n.createElement("br",null),n.createElement("h2",{className:"subtitle"},s.APP_INFO.description),n.createElement("br",null),n.createElement("div",{className:"card"},n.createElement("div",{className:"card-content"},n.createElement("h2",{className:"subtitle"},"Source code"),n.createElement("p",null,"Project is hosted on"," ",n.createElement("a",{href:"https://github.com/logolang/logo-playground"},n.createElement("i",{className:"fab fa-github","aria-hidden":"true"})," Github")),n.createElement("p",null,"Deployed on ",n.createElement("strong",null,s.APP_INFO.builtOn)),n.createElement("p",null,"Code version ",n.createElement("strong",null,s.APP_INFO.gitVersion)))),n.createElement("div",{className:"card"},n.createElement("div",{className:"card-content"},n.createElement("h2",{className:"subtitle"},"Third-party assets"),n.createElement("div",{className:"content"},n.createElement("div",{dangerouslySetInnerHTML:{__html:this.thirdPartyCreditsHTML}})))),n.createElement("br",null))))}}t.InfoPage=u},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.APP_INFO={gitVersion:"9939483",name:"logo-playground",description:"Online environment for Logo programming language",version:"1.0.0",builtOn:"4/3/2020 8:45:45 AM"}},function(e,t,r){"use strict";r.r(t),t.default="Javascript libraries:\n\n- Logo interpreter [jslogo](https://github.com/inexorabletash/jslogo)\n- Code editor [codemirror](https://github.com/codemirror/CodeMirror)\n- Markdown rendering library [markdown-it](https://github.com/markdown-it/markdown-it)\n- Panels with drag and drop support [golden-layout](https://github.com/deepstreamIO/golden-layout)\n- I18n library [jed](https://github.com/messageformat/Jed)\n- Rendering library [react](https://github.com/facebook/react)\n- [Redux](https://redux.js.org/) is a predictable state container for JavaScript apps.\n\nStyles:\n\n- Base CSS framework from [bulma.io](https://bulma.io)\n- Themes for bulma from [bulmaswatch](https://jenil.github.io/bulmaswatch/)\n\nGraphics:\n\n- Favicon from [favicon.cc](http://www.favicon.cc/?action=icon&file_id=520733) by [Kristy](http://www.favicon.cc/?action=icon_list&user_id=158085)\n- Icon from [thenounproject.com](https://thenounproject.com/term/turtle/119022/) by [IsabelFoo](http://www.isabelfoo.com/)\n- Icons made by [Freepik](https://www.freepik.com/) from [www.flaticon.com](https://www.flaticon.com/) is licensed by [CC 3.0 BY](http://creativecommons.org/licenses/by/3.0/)\n- Website icons from [fontawesome.io](http://fontawesome.io/icons/)\n"},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(11),o=r(279),i=r(22);t.SettingsPageContainer=n.connect(e=>({user:e.env.user,userSettings:e.env.userSettings,appTheme:e.env.appTheme}),{applyUserSettings:i.envThunks.applyUserSettings})(o.SettingsPage)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0),o=r(5),i=r(3),s=r(44),a=r(60),l=r(6),c=r(280),u=r(103),p=r(43),d=r(92),h=r(21),m=r(57);class f extends c.SimpleSelect{}class g extends c.SimpleSelect{}class y extends c.SimpleSelect{}class v extends c.SimpleSelect{}class E extends n.Component{constructor(e){super(e),this.eventsTracking=o.resolve(l.EventsTrackingService),this.demoSamplesService=o.resolve(d.LogoCodeSamplesService),this.state={code:this.demoSamplesService.getRandomSample()}}async componentDidMount(){this.eventsTracking.sendEvent(l.EventAction.openSettings)}async componentDidUpdate(e){e.userSettings!==this.props.userSettings&&(this.logoExecutor&&this.logoExecutor.abort(),this.setState({code:"setpensize 1.5\n"+this.demoSamplesService.getRandomSample()}))}render(){return n.createElement("div",{className:"ex-page-container"},n.createElement(h.MainMenuContainer,null),n.createElement("div",{className:"ex-page-content"},n.createElement("div",{className:"container"},n.createElement("br",null),n.createElement(u.PageHeader,{title:i.$T.settings.settingsTitle}),n.createElement("br",null),n.createElement("div",{className:"field"},n.createElement("label",{className:"label",htmlFor:"language-selector"},i.$T.settings.language),n.createElement("div",{className:"control"},n.createElement("div",{className:"select"},n.createElement(f,{items:m.locales,selectedItem:m.locales.find(e=>e.id===this.props.userSettings.localeId),getItemIdentifier:e=>e.id,renderItem:e=>e.name,id:"language-selector",selectionChanged:async e=>{e&&this.props.applyUserSettings({localeId:e.id},{rebindServices:!0})}})))),n.createElement("br",null),n.createElement("div",{className:"columns"},n.createElement("div",{className:"column"},n.createElement("label",{className:"label",htmlFor:"theme-selector"},i.$T.settings.uiTheme),n.createElement("div",{className:"field"},n.createElement("div",{className:"control is-expanded"},n.createElement("div",{className:"select is-fullwidth"},n.createElement(g,{items:a.themesManager.themes,selectedItem:this.props.appTheme,getItemIdentifier:e=>e.name,renderItem:e=>`${e.name} - ${e.description}`,id:"theme-selector",selectionChanged:async e=>{e&&(this.props.applyUserSettings({themeName:e.name}),a.themesManager.setTheme(e))}})))),n.createElement("br",null),n.createElement("label",{className:"label",htmlFor:"turtle-skin-selector"},i.$T.settings.turtleSkin),n.createElement("div",{className:"field"},n.createElement("div",{className:"control"},n.createElement("div",{className:"select"},n.createElement(y,{id:"turtle-skin-selector",items:s.getTurtles(),selectedItem:s.getTurtles().find(e=>e.id===this.props.userSettings.turtleId),getItemIdentifier:e=>e.id,renderItem:e=>e.name,selectionChanged:async e=>{e&&this.props.applyUserSettings({turtleId:e.id})}})))),n.createElement("br",null),n.createElement("label",{className:"label",htmlFor:"turtle-size-selector"},i.$T.settings.turtleSize),n.createElement("div",{className:"field"},n.createElement("div",{className:"control"},n.createElement("div",{className:"select"},n.createElement(v,{id:"turtle-size-selector",items:s.getTurtleSizes(),selectedItem:s.getTurtleSizes().find(e=>e.size===this.props.userSettings.turtleSize),getItemIdentifier:e=>e.size.toString(),renderItem:e=>e.description,selectionChanged:async e=>{e&&this.props.applyUserSettings({turtleSize:e.size})}}))))),n.createElement("div",{className:"column"},n.createElement("div",{className:"card",style:{height:300}},n.createElement(p.LogoExecutor,{ref:e=>this.logoExecutor=e||void 0,isRunning:!0,code:this.state.code,onFinish:()=>{},isDarkTheme:this.props.appTheme.isDark,turtleImageSrc:s.getTurtleById(this.props.userSettings.turtleId).imageSrc,turtleSize:this.props.userSettings.turtleSize})))),n.createElement("br",null))))}}t.SettingsPage=E},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0);class o extends n.Component{constructor(e){super(e),this.onSelect=e=>{const t=e.currentTarget.value,r=this.props.items.find(e=>t===this.props.getItemIdentifier(e));void 0!==r?this.props.selectionChanged(r):this.props.selectionChanged(void 0)}}renderOptionItem(e){return n.createElement("option",{key:this.props.getItemIdentifier(e),value:this.props.getItemIdentifier(e)},this.props.renderItem(e))}render(){const e=this.props.selectedItem?this.props.getItemIdentifier(this.props.selectedItem):"";return n.createElement("select",{disabled:this.props.readOnly,className:this.props.className,id:this.props.id,value:e,onChange:this.props.readOnly?void 0:this.onSelect},this.props.allowNotSelected&&n.createElement("option",{value:""},"··· Not Selected ···"),this.props.items.map(e=>this.renderOptionItem(e)))}}t.SimpleSelect=o},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(0);r(282);class o extends n.Component{constructor(e){super(e),this.handleAlertDismiss=e=>{this.props.onClose(e.id)},this.state={}}render(){return n.createElement("div",{className:"message-toster"},this.props.messages.map(e=>n.createElement("div",{key:e.id},n.createElement("article",{className:"message is-"+e.type},n.createElement("div",{className:"message-header"},n.createElement("p",null,e.title),n.createElement("button",{className:"delete","aria-label":"delete",onClick:()=>this.handleAlertDismiss(e)})),n.createElement("div",{className:"message-body"},n.createElement("p",null,e.message))))))}}t.MessageToster=o},function(e,t,r){},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(46),o=r(284),i=r(285),s=r(37),a=r(286),l=r(104),c=r(287),u=r(105),p=r(288),d=r(42),h=r(289);t.createInitialStore=function(){return n.createStore(n.combineReducers({gallery:a.default,playground:c.default,tutorials:p.default,env:h.default}),{},o.composeWithDevTools(n.applyMiddleware(i.default)))},t.getDefaultState=function(){return{gallery:s.defaultGalleryState,playground:l.defaultPlaygroundState,tutorials:u.defaultTutorialsState,env:d.defaultEnvState}}},,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(37),o=r(41);t.default=function(e,t){if(!e||!t)return n.defaultGalleryState;switch(t.type){case o.GalleryActionType.LOAD_SECTION_STARTED:return{...e,isLoading:!0,activeSection:t.payload.section};case o.GalleryActionType.LOAD_SECTION_COMPLETED:return t.payload.section===e.activeSection?{...e,isLoading:!1,programs:t.payload.programs}:e;case o.GalleryActionType.TOGGLE_IMPORT_MODAL:return{...e,showImportModal:t.payload.show};case o.GalleryActionType.IMPORT_STARTED:return{...e,importErrorMessage:"",isImportInProgress:!0};case o.GalleryActionType.IMPORT_COMPLETED:return{...e,showImportModal:!t.payload.success,importErrorMessage:t.payload.errorMessage,isImportInProgress:!1};default:return e}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(104),o=r(61);t.default=function(e,t){if(!e||!t)return n.defaultPlaygroundState;switch(t.type){case o.PlaygroundActionType.LOAD_PROGRAM_STARTED:return{...e,isLoading:!0,storageType:t.payload.storageType,programId:t.payload.programId,programName:"Loading...",isRunning:!1};case o.PlaygroundActionType.LOAD_PROGRAM_COMPLETED:return t.payload.storageType===e.storageType&&t.payload.programId===e.programId?{...e,isLoading:!1,programName:t.payload.programModel.name,code:t.payload.programModel.code,isRunning:!0,hasModifications:!1}:e;case o.PlaygroundActionType.CODE_CHANGED:return{...e,code:t.payload.code,hasModifications:!0};case o.PlaygroundActionType.RUN_PROGRAM:return{...e,isRunning:!0};case o.PlaygroundActionType.STOP_PROGRAM:return{...e,isRunning:!1};case o.PlaygroundActionType.SYNC_PROGRAM_STARTED:return{...e,isLoading:!0};case o.PlaygroundActionType.SYNC_PROGRAM_COMPLETED:{const r={...e,isLoading:!1,hasModifications:!1};return t.payload.newId&&(r.programId=t.payload.newId),t.payload.newStorageType&&(r.storageType=t.payload.newStorageType),t.payload.newName&&(r.programName=t.payload.newName),r}case o.PlaygroundActionType.SYNC_PROGRAM_FAILED:return{...e,isLoading:!1};case o.PlaygroundActionType.RESET_STATE:return{...n.defaultPlaygroundState};default:return e}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(105),o=r(63);t.default=function(e,t){if(!e||!t)return n.defaultTutorialsState;switch(t.type){case o.TutorialsActionType.LOAD_TUTORIALS_STARTED:return{...e,isLoading:!0};case o.TutorialsActionType.LOAD_TUTORIALS_COMPLETED:return{...e,isLoading:!1,tutorials:t.payload.tutorials};case o.TutorialsActionType.LOAD_STEP_STARTED:{const r=t.payload.tutorialId!==e.tutorialId?"":e.code;return{...e,isStepLoading:!0,tutorialId:t.payload.tutorialId,stepId:t.payload.stepId,code:r}}case o.TutorialsActionType.LOAD_STEP_COMPLETED:return{...e,isStepLoading:!1,currentTutorialInfo:t.payload.tutorialInfo,currentStepInfo:t.payload.stepInfo,currentStepContent:t.payload.content,isRunning:!0};case o.TutorialsActionType.CODE_CHANGED:return{...e,code:t.payload.code};case o.TutorialsActionType.RUN_PROGRAM:return{...e,isRunning:!0};case o.TutorialsActionType.STOP_PROGRAM:return{...e,isRunning:!1};case o.TutorialsActionType.FIX_THE_CODE:return e.currentStepContent?{...e,code:e.currentStepContent.solutionCode,isRunning:!0}:e;default:return e}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const n=r(42),o=r(18),i=r(31),s=r(3),a=r(60);let l=0;t.default=function(e,t){if(!e||!t)return n.defaultEnvState;switch(t.type){case o.EnvActionType.INIT_ENV_STARTED:return{...e,isLoading:!0,user:i.anonymousUser};case o.EnvActionType.SIGN_IN_COMPLETED:return{...e,isLoading:!1,user:t.payload};case o.EnvActionType.APPLY_USER_SETTINGS_COMPLETED:const r=a.themesManager.getThemeByName(t.payload.themeName);return{...e,userSettings:{...e.userSettings,...t.payload},appTheme:{...r}};case o.EnvActionType.ERROR:return{...e,notifications:[...e.notifications,{id:(++l).toString(),type:n.NotificationType.danger,title:s.$T.common.error,message:t.payload.errDef.message}]};case o.EnvActionType.SHOW_NOTIFICATION:return{...e,notifications:[{id:(++l).toString(),type:t.payload.type,title:t.payload.title,message:t.payload.message},...e.notifications]};case o.EnvActionType.CLOSE_NOTIFICATION:return{...e,notifications:e.notifications.filter(e=>e.id!==t.payload.id)};default:return e}}}]);